From a65f86a7130fd608c4ea5f9df1f41030d3fdee4f Mon Sep 17 00:00:00 2001 From: jzlv Date: Fri, 18 Nov 2022 16:06:20 +0800 Subject: [PATCH] [feat] add tensorflowlite component and demo --- components/CMakeLists.txt | 2 + components/TensorFlowLite/.gitignore | 5 + components/TensorFlowLite/CMakeLists.txt | 25 + components/TensorFlowLite/LICENSE | 202 + components/TensorFlowLite/README.md | 75 + .../tensorflow/lite/c/builtin_op_data.h | 504 + .../tensorflow/lite/c/c_api_types.h | 105 + .../TensorFlowLite/tensorflow/lite/c/common.c | 274 + .../TensorFlowLite/tensorflow/lite/c/common.h | 952 + .../lite/core/api/error_reporter.cc | 40 + .../tensorflow/lite/core/api/error_reporter.h | 60 + .../lite/core/api/flatbuffer_conversions.cc | 2278 ++ .../lite/core/api/flatbuffer_conversions.h | 360 + .../tensorflow/lite/core/api/op_resolver.cc | 70 + .../tensorflow/lite/core/api/op_resolver.h | 82 + .../tensorflow/lite/core/api/tensor_utils.cc | 51 + .../tensorflow/lite/core/api/tensor_utils.h | 27 + .../lite/experimental/microfrontend/README.md | 6 + .../experimental/microfrontend/lib/README.md | 65 + .../experimental/microfrontend/lib/bits.h | 115 + .../experimental/microfrontend/lib/fft.cc | 56 + .../lite/experimental/microfrontend/lib/fft.h | 50 + .../experimental/microfrontend/lib/fft_io.c | 35 + .../experimental/microfrontend/lib/fft_io.h | 34 + .../microfrontend/lib/fft_test.cc | 55 + .../microfrontend/lib/fft_util.cc | 74 + .../experimental/microfrontend/lib/fft_util.h | 34 + .../microfrontend/lib/filterbank.c | 140 + .../microfrontend/lib/filterbank.h | 63 + .../microfrontend/lib/filterbank_io.c | 70 + .../microfrontend/lib/filterbank_io.h | 35 + .../microfrontend/lib/filterbank_test.cc | 229 + .../microfrontend/lib/filterbank_util.c | 226 + .../microfrontend/lib/filterbank_util.h | 50 + .../experimental/microfrontend/lib/frontend.c | 74 + .../experimental/microfrontend/lib/frontend.h | 64 + .../microfrontend/lib/frontend_io.c | 70 + .../microfrontend/lib/frontend_io.h | 31 + .../microfrontend/lib/frontend_main.c | 72 + .../lib/frontend_memmap_generator.c | 49 + .../microfrontend/lib/frontend_memmap_main.c | 61 + .../microfrontend/lib/frontend_test.cc | 136 + .../microfrontend/lib/frontend_util.c | 88 + .../microfrontend/lib/frontend_util.h | 52 + .../experimental/microfrontend/lib/log_lut.c | 30 + .../experimental/microfrontend/lib/log_lut.h | 40 + .../microfrontend/lib/log_scale.c | 86 + .../microfrontend/lib/log_scale.h | 39 + .../microfrontend/lib/log_scale_io.c | 22 + .../microfrontend/lib/log_scale_io.h | 33 + .../microfrontend/lib/log_scale_test.cc | 65 + .../microfrontend/lib/log_scale_util.c | 29 + .../microfrontend/lib/log_scale_util.h | 45 + .../microfrontend/lib/noise_reduction.c | 53 + .../microfrontend/lib/noise_reduction.h | 46 + .../microfrontend/lib/noise_reduction_io.c | 36 + .../microfrontend/lib/noise_reduction_io.h | 36 + .../microfrontend/lib/noise_reduction_test.cc | 84 + .../microfrontend/lib/noise_reduction_util.c | 48 + .../microfrontend/lib/noise_reduction_util.h | 50 + .../microfrontend/lib/pcan_gain_control.c | 59 + .../microfrontend/lib/pcan_gain_control.h | 47 + .../lib/pcan_gain_control_test.cc | 67 + .../lib/pcan_gain_control_util.c | 96 + .../lib/pcan_gain_control_util.h | 57 + .../experimental/microfrontend/lib/window.c | 72 + .../experimental/microfrontend/lib/window.h | 49 + .../microfrontend/lib/window_io.c | 45 + .../microfrontend/lib/window_io.h | 34 + .../microfrontend/lib/window_test.cc | 187 + .../microfrontend/lib/window_util.c | 76 + .../microfrontend/lib/window_util.h | 45 + .../tensorflow/lite/kernels/internal/common.h | 1080 + .../lite/kernels/internal/compatibility.h | 112 + .../lite/kernels/internal/cppmath.h | 41 + .../tensorflow/lite/kernels/internal/max.h | 36 + .../tensorflow/lite/kernels/internal/min.h | 36 + .../kernels/internal/optimized/neon_check.h | 20 + .../lite/kernels/internal/portable_tensor.h | 143 + .../kernels/internal/quantization_util.cc | 409 + .../lite/kernels/internal/quantization_util.h | 290 + .../lite/kernels/internal/reference/add.h | 406 + .../lite/kernels/internal/reference/add_n.h | 87 + .../kernels/internal/reference/arg_min_max.h | 89 + .../kernels/internal/reference/batch_matmul.h | 281 + .../internal/reference/batch_to_space_nd.h | 102 + .../internal/reference/binary_function.h | 80 + .../lite/kernels/internal/reference/ceil.h | 36 + .../kernels/internal/reference/comparisons.h | 297 + .../internal/reference/concatenation.h | 140 + .../lite/kernels/internal/reference/conv.h | 265 + .../lite/kernels/internal/reference/cumsum.h | 176 + .../internal/reference/depth_to_space.h | 79 + .../internal/reference/depthwiseconv_float.h | 100 + .../internal/reference/depthwiseconv_uint8.h | 301 + .../kernels/internal/reference/dequantize.h | 78 + .../lite/kernels/internal/reference/elu.h | 36 + .../lite/kernels/internal/reference/exp.h | 38 + .../lite/kernels/internal/reference/fill.h | 38 + .../lite/kernels/internal/reference/floor.h | 38 + .../kernels/internal/reference/floor_div.h | 35 + .../kernels/internal/reference/floor_mod.h | 42 + .../internal/reference/fully_connected.h | 323 + .../kernels/internal/reference/hard_swish.h | 169 + .../internal/reference/integer_ops/add.h | 150 + .../internal/reference/integer_ops/conv.h | 222 + .../reference/integer_ops/depthwise_conv.h | 292 + .../reference/integer_ops/fully_connected.h | 109 + .../reference/integer_ops/l2normalization.h | 65 + .../internal/reference/integer_ops/logistic.h | 119 + .../internal/reference/integer_ops/mean.h | 76 + .../internal/reference/integer_ops/mul.h | 134 + .../internal/reference/integer_ops/pooling.h | 259 + .../internal/reference/integer_ops/tanh.h | 115 + .../reference/integer_ops/transpose_conv.h | 222 + .../internal/reference/l2normalization.h | 90 + .../kernels/internal/reference/leaky_relu.h | 70 + .../kernels/internal/reference/log_softmax.h | 259 + .../kernels/internal/reference/logistic.h | 135 + .../internal/reference/maximum_minimum.h | 64 + .../lite/kernels/internal/reference/mul.h | 169 + .../lite/kernels/internal/reference/neg.h | 36 + .../lite/kernels/internal/reference/pad.h | 176 + .../lite/kernels/internal/reference/pooling.h | 301 + .../lite/kernels/internal/reference/prelu.h | 109 + .../reference/process_broadcast_shapes.h | 137 + .../kernels/internal/reference/quantize.h | 54 + .../lite/kernels/internal/reference/reduce.h | 420 + .../kernels/internal/reference/requantize.h | 68 + .../internal/reference/resize_bilinear.h | 231 + .../reference/resize_nearest_neighbor.h | 97 + .../lite/kernels/internal/reference/round.h | 51 + .../lite/kernels/internal/reference/softmax.h | 235 + .../internal/reference/space_to_batch_nd.h | 110 + .../internal/reference/space_to_depth.h | 78 + .../internal/reference/strided_slice.h | 122 + .../lite/kernels/internal/reference/sub.h | 572 + .../lite/kernels/internal/reference/tanh.h | 132 + .../kernels/internal/reference/transpose.h | 109 + .../internal/reference/transpose_conv.h | 217 + .../kernels/internal/strided_slice_logic.h | 218 + .../lite/kernels/internal/tensor_ctypes.h | 48 + .../kernels/internal/tensor_utils_common.h | 472 + .../tensorflow/lite/kernels/internal/types.h | 1303 + .../tensorflow/lite/kernels/kernel_util.cc | 576 + .../tensorflow/lite/kernels/kernel_util.h | 315 + .../tensorflow/lite/kernels/op_macros.h | 86 + .../tensorflow/lite/kernels/padding.h | 120 + .../tensorflow/lite/micro/CONTRIBUTING.md | 378 + .../tensorflow/lite/micro/README.md | 76 + .../tensorflow/lite/micro/all_ops_resolver.cc | 100 + .../tensorflow/lite/micro/all_ops_resolver.h | 37 + .../lite/micro/benchmarks/README.md | 98 + .../micro/benchmarks/keyword_benchmark.cc | 111 + .../keyword_scrambled_model_data.cc | 2904 ++ .../benchmarks/keyword_scrambled_model_data.h | 22 + .../lite/micro/benchmarks/micro_benchmark.h | 90 + .../benchmarks/person_detection_benchmark.cc | 122 + .../tensorflow/lite/micro/compatibility.h | 34 + .../tensorflow/lite/micro/debug_log.cc | 51 + .../tensorflow/lite/micro/debug_log.h | 31 + .../lite/micro/examples/hello_world/README.md | 596 + .../micro/examples/hello_world/constants.cc | 19 + .../micro/examples/hello_world/constants.h | 32 + .../hello_world/create_sine_model.ipynb | 1 + .../hello_world/hello_world_binary_test.sh | 33 + .../examples/hello_world/hello_world_test.cc | 132 + .../images/animation_on_STM32F746.gif | Bin 0 -> 299034 bytes .../images/animation_on_arduino_mkrzero.gif | Bin 0 -> 541423 bytes .../images/animation_on_sparkfun_edge.gif | Bin 0 -> 639801 bytes .../hello_world/images/model_architecture.png | Bin 0 -> 91424 bytes .../lite/micro/examples/hello_world/main.cc | 28 + .../examples/hello_world/main_functions.cc | 124 + .../examples/hello_world/main_functions.h | 37 + .../lite/micro/examples/hello_world/model.cc | 238 + .../lite/micro/examples/hello_world/model.h | 31 + .../examples/hello_world/output_handler.cc | 25 + .../examples/hello_world/output_handler.h | 26 + .../hello_world/output_handler_test.cc | 32 + .../micro/examples/magic_wand/Makefile.inc | 84 + .../lite/micro/examples/magic_wand/README.md | 493 + .../magic_wand/accelerometer_handler.cc | 42 + .../magic_wand/accelerometer_handler.h | 29 + .../magic_wand/accelerometer_handler_test.cc | 49 + .../micro/examples/magic_wand/constants.h | 38 + .../examples/magic_wand/gesture_predictor.cc | 73 + .../examples/magic_wand/gesture_predictor.h | 21 + .../magic_wand/gesture_predictor_test.cc | 69 + .../magic_wand/magic_wand_model_data.cc | 1660 ++ .../magic_wand/magic_wand_model_data.h | 27 + .../examples/magic_wand/magic_wand_test.cc | 150 + .../lite/micro/examples/magic_wand/main.cc | 28 + .../examples/magic_wand/main_functions.cc | 125 + .../examples/magic_wand/main_functions.h | 37 + .../examples/magic_wand/output_handler.cc | 39 + .../examples/magic_wand/output_handler.h | 24 + .../magic_wand/output_handler_test.cc | 31 + .../magic_wand/ring_micro_features_data.cc | 406 + .../magic_wand/ring_micro_features_data.h | 23 + .../magic_wand/slope_micro_features_data.cc | 406 + .../magic_wand/slope_micro_features_data.h | 23 + .../micro/examples/magic_wand/train/README.md | 191 + .../magic_wand/train/data_augmentation.py | 74 + .../train/data_augmentation_test.py | 58 + .../examples/magic_wand/train/data_load.py | 106 + .../magic_wand/train/data_load_test.py | 95 + .../examples/magic_wand/train/data_prepare.py | 164 + .../magic_wand/train/data_prepare_test.py | 75 + .../examples/magic_wand/train/data_split.py | 90 + .../magic_wand/train/data_split_person.py | 75 + .../train/data_split_person_test.py | 54 + .../magic_wand/train/data_split_test.py | 77 + .../magic_wand/train/netmodels/CNN/weights.h5 | Bin 0 -> 40512 bytes .../magic_wand/train/requirements.txt | 2 + .../micro/examples/magic_wand/train/train.py | 203 + .../train/train_magic_wand_model.ipynb | 238 + .../examples/magic_wand/train/train_test.py | 78 + .../micro/examples/micro_speech/.gitignore | 1 + .../micro/examples/micro_speech/Makefile.inc | 286 + .../micro/examples/micro_speech/README.md | 802 + .../examples/micro_speech/audio_provider.cc | 41 + .../examples/micro_speech/audio_provider.h | 46 + .../micro_speech/audio_provider_mock.cc | 57 + .../micro_speech/audio_provider_mock_test.cc | 77 + .../micro_speech/audio_provider_test.cc | 71 + .../micro_speech/command_responder.cc | 29 + .../examples/micro_speech/command_responder.h | 32 + .../micro_speech/command_responder_test.cc | 32 + .../examples/micro_speech/feature_provider.cc | 124 + .../examples/micro_speech/feature_provider.h | 52 + .../feature_provider_mock_test.cc | 66 + .../micro_speech/feature_provider_test.cc | 40 + .../images/animation_on_arduino.gif | Bin 0 -> 1947798 bytes .../images/model_architecture.png | Bin 0 -> 68413 bytes .../lite/micro/examples/micro_speech/main.cc | 28 + .../examples/micro_speech/main_functions.cc | 179 + .../examples/micro_speech/main_functions.h | 37 + .../micro_features_generator.cc | 119 + .../micro_features/micro_features_generator.h | 32 + .../micro_features_generator_test.cc | 176 + .../micro_features/micro_model_settings.cc | 23 + .../micro_features/micro_model_settings.h | 43 + .../micro_speech/micro_features/model.cc | 1597 ++ .../micro_speech/micro_features/model.h | 27 + .../micro_features/no_feature_data_slice.cc | 61 + .../micro_features/no_feature_data_slice.h | 29 + .../micro_features/no_micro_features_data.cc | 1984 ++ .../micro_features/no_micro_features_data.h | 23 + .../micro_features/static_alloc.h | 33 + .../micro_features/yes_feature_data_slice.cc | 61 + .../micro_features/yes_feature_data_slice.h | 29 + .../micro_features/yes_micro_features_data.cc | 1984 ++ .../micro_features/yes_micro_features_data.h | 23 + .../micro_speech_binary_mock_test.sh | 33 + .../micro_speech/micro_speech_test.cc | 149 + .../micro_speech/no_1000ms_sample_data.cc | 16022 +++++++++++ .../micro_speech/no_1000ms_sample_data.h | 29 + .../micro_speech/no_30ms_sample_data.cc | 502 + .../micro_speech/no_30ms_sample_data.h | 32 + .../micro_speech/recognize_commands.cc | 144 + .../micro_speech/recognize_commands.h | 179 + .../micro_speech/recognize_commands_test.cc | 220 + .../fixed_point/simple_features_generator.cc | 221 + .../micro_speech/simple_features/model.cc | 1675 ++ .../micro_speech/simple_features/model.h | 27 + .../simple_features/no_power_spectrum_data.cc | 64 + .../simple_features/no_power_spectrum_data.h | 29 + .../no_simple_features_data.cc | 2141 ++ .../simple_features/no_simple_features_data.h | 23 + .../simple_features_generator.cc | 153 + .../simple_features_generator.h | 31 + .../simple_features_generator_test.cc | 65 + .../simple_features/simple_model_settings.cc | 23 + .../simple_features/simple_model_settings.h | 43 + .../yes_power_spectrum_data.cc | 64 + .../simple_features/yes_power_spectrum_data.h | 29 + .../yes_simple_features_data.cc | 2141 ++ .../yes_simple_features_data.h | 23 + .../examples/micro_speech/train/README.md | 207 + .../train/train_micro_speech_model.ipynb | 599 + .../micro_speech/train_speech_model.ipynb | 1 + .../micro_speech/yes_1000ms_sample_data.cc | 16022 +++++++++++ .../micro_speech/yes_1000ms_sample_data.h | 29 + .../micro_speech/yes_30ms_sample_data.cc | 502 + .../micro_speech/yes_30ms_sample_data.h | 32 + .../micro/examples/network_tester/README.md | 64 + .../network_tester/expected_output_data.h | 48 + .../examples/network_tester/input_data.h | 109 + .../examples/network_tester/network_model.h | 167 + .../network_tester/network_tester_test.cc | 155 + .../micro/examples/person_detection/README.md | 646 + .../person_detection/detection_responder.cc | 26 + .../person_detection/detection_responder.h | 34 + .../detection_responder_test.cc | 33 + .../person_detection/image_provider.cc | 27 + .../person_detection/image_provider.h | 39 + .../person_detection/image_provider_test.cc | 44 + .../micro/examples/person_detection/main.cc | 28 + .../person_detection/main_functions.cc | 121 + .../person_detection/main_functions.h | 37 + .../person_detection/model_settings.cc | 21 + .../person_detection/model_settings.h | 35 + .../person_detection/no_person_image_data.h | 30 + .../person_detect_model_data.h | 27 + .../person_detection_binary_test.sh | 33 + .../person_detection/person_detection_test.cc | 135 + .../person_detection/person_image_data.h | 30 + .../person_detection/training_a_model.md | 455 + .../person_detection/utils/raw_to_bitmap.py | 200 + .../utils/raw_to_bitmap_test.py | 120 + .../tensorflow/lite/micro/kernels/README.md | 5 + .../lite/micro/kernels/activation_utils.h | 57 + .../lite/micro/kernels/activations.cc | 298 + .../lite/micro/kernels/activations_test.cc | 407 + .../tensorflow/lite/micro/kernels/add.cc | 247 + .../tensorflow/lite/micro/kernels/add_n.cc | 222 + .../lite/micro/kernels/add_n_test.cc | 175 + .../tensorflow/lite/micro/kernels/add_test.cc | 378 + .../lite/micro/kernels/arg_min_max.cc | 139 + .../lite/micro/kernels/arg_min_max_test.cc | 276 + .../lite/micro/kernels/batch_to_space_nd.cc | 114 + .../micro/kernels/batch_to_space_nd_test.cc | 160 + .../tensorflow/lite/micro/kernels/cast.cc | 101 + .../lite/micro/kernels/cast_test.cc | 121 + .../tensorflow/lite/micro/kernels/ceil.cc | 79 + .../lite/micro/kernels/ceil_test.cc | 94 + .../lite/micro/kernels/circular_buffer.cc | 198 + ...cular_buffer_flexbuffers_generated_data.cc | 44 + ...rcular_buffer_flexbuffers_generated_data.h | 22 + .../micro/kernels/circular_buffer_test.cc | 250 + .../lite/micro/kernels/comparisons.cc | 706 + .../lite/micro/kernels/comparisons_test.cc | 1172 + .../lite/micro/kernels/concatenation.cc | 290 + .../lite/micro/kernels/concatenation_test.cc | 266 + .../tensorflow/lite/micro/kernels/conv.cc | 124 + .../tensorflow/lite/micro/kernels/conv.h | 92 + .../lite/micro/kernels/conv_common.cc | 185 + .../lite/micro/kernels/conv_test.cc | 820 + .../tensorflow/lite/micro/kernels/conv_test.h | 102 + .../lite/micro/kernels/conv_test_common.cc | 234 + .../tensorflow/lite/micro/kernels/cumsum.cc | 178 + .../lite/micro/kernels/cumsum_test.cc | 366 + .../lite/micro/kernels/depth_to_space.cc | 147 + .../lite/micro/kernels/depth_to_space_test.cc | 321 + .../lite/micro/kernels/depthwise_conv.cc | 106 + .../lite/micro/kernels/depthwise_conv.h | 53 + .../micro/kernels/depthwise_conv_common.cc | 190 + .../lite/micro/kernels/depthwise_conv_test.cc | 1004 + .../lite/micro/kernels/dequantize.cc | 143 + .../lite/micro/kernels/dequantize_test.cc | 148 + .../micro/kernels/detection_postprocess.cc | 835 + ..._postprocess_flexbuffers_generated_data.cc | 510 + ...n_postprocess_flexbuffers_generated_data.h | 25 + .../kernels/detection_postprocess_test.cc | 472 + .../lite/micro/kernels/elementwise.cc | 236 + .../lite/micro/kernels/elementwise_test.cc | 202 + .../tensorflow/lite/micro/kernels/elu.cc | 159 + .../tensorflow/lite/micro/kernels/elu_test.cc | 174 + .../tensorflow/lite/micro/kernels/ethosu.cc | 33 + .../tensorflow/lite/micro/kernels/ethosu.h | 27 + .../tensorflow/lite/micro/kernels/exp.cc | 81 + .../tensorflow/lite/micro/kernels/exp_test.cc | 79 + .../lite/micro/kernels/expand_dims.cc | 158 + .../lite/micro/kernels/expand_dims_test.cc | 183 + .../tensorflow/lite/micro/kernels/fill.cc | 137 + .../lite/micro/kernels/fill_test.cc | 133 + .../tensorflow/lite/micro/kernels/floor.cc | 59 + .../lite/micro/kernels/floor_div.cc | 136 + .../lite/micro/kernels/floor_div_test.cc | 113 + .../lite/micro/kernels/floor_mod.cc | 134 + .../lite/micro/kernels/floor_mod_test.cc | 113 + .../lite/micro/kernels/floor_test.cc | 85 + .../lite/micro/kernels/fully_connected.cc | 138 + .../lite/micro/kernels/fully_connected.h | 91 + .../micro/kernels/fully_connected_common.cc | 86 + .../micro/kernels/fully_connected_test.cc | 541 + .../tensorflow/lite/micro/kernels/gather.cc | 226 + .../lite/micro/kernels/gather_nd.cc | 206 + .../lite/micro/kernels/gather_nd_test.cc | 316 + .../lite/micro/kernels/gather_test.cc | 486 + .../lite/micro/kernels/hard_swish.cc | 146 + .../lite/micro/kernels/hard_swish_test.cc | 353 + .../tensorflow/lite/micro/kernels/if.cc | 170 + .../tensorflow/lite/micro/kernels/if_test.cc | 168 + .../lite/micro/kernels/kernel_runner.cc | 186 + .../lite/micro/kernels/kernel_runner.h | 94 + .../lite/micro/kernels/kernel_util.cc | 108 + .../lite/micro/kernels/kernel_util.h | 106 + .../lite/micro/kernels/l2_pool_2d.cc | 150 + .../lite/micro/kernels/l2_pool_2d_test.cc | 231 + .../tensorflow/lite/micro/kernels/l2norm.cc | 163 + .../lite/micro/kernels/l2norm_test.cc | 254 + .../lite/micro/kernels/leaky_relu.cc | 163 + .../lite/micro/kernels/leaky_relu_test.cc | 250 + .../lite/micro/kernels/log_softmax.cc | 154 + .../lite/micro/kernels/log_softmax_test.cc | 270 + .../tensorflow/lite/micro/kernels/logical.cc | 116 + .../lite/micro/kernels/logical_test.cc | 121 + .../tensorflow/lite/micro/kernels/logistic.cc | 155 + .../lite/micro/kernels/logistic_test.cc | 193 + .../lite/micro/kernels/maximum_minimum.cc | 155 + .../micro/kernels/maximum_minimum_test.cc | 232 + .../tensorflow/lite/micro/kernels/micro_ops.h | 121 + .../lite/micro/kernels/micro_utils.h | 41 + .../tensorflow/lite/micro/kernels/mul.cc | 221 + .../tensorflow/lite/micro/kernels/mul_test.cc | 212 + .../tensorflow/lite/micro/kernels/neg.cc | 68 + .../tensorflow/lite/micro/kernels/neg_test.cc | 87 + .../tensorflow/lite/micro/kernels/pack.cc | 131 + .../lite/micro/kernels/pack_test.cc | 287 + .../tensorflow/lite/micro/kernels/pad.cc | 253 + .../tensorflow/lite/micro/kernels/pad_test.cc | 437 + .../tensorflow/lite/micro/kernels/pooling.cc | 117 + .../tensorflow/lite/micro/kernels/pooling.h | 70 + .../lite/micro/kernels/pooling_common.cc | 169 + .../lite/micro/kernels/pooling_test.cc | 526 + .../tensorflow/lite/micro/kernels/prelu.cc | 175 + .../lite/micro/kernels/prelu_test.cc | 200 + .../micro/kernels/quantization_util_test.cc | 479 + .../tensorflow/lite/micro/kernels/quantize.cc | 49 + .../tensorflow/lite/micro/kernels/quantize.h | 36 + .../lite/micro/kernels/quantize_common.cc | 173 + .../lite/micro/kernels/quantize_test.cc | 307 + .../tensorflow/lite/micro/kernels/reduce.cc | 351 + .../lite/micro/kernels/reduce_test.cc | 644 + .../tensorflow/lite/micro/kernels/reshape.cc | 122 + .../lite/micro/kernels/reshape_test.cc | 388 + .../lite/micro/kernels/resize_bilinear.cc | 119 + .../micro/kernels/resize_bilinear_test.cc | 344 + .../micro/kernels/resize_nearest_neighbor.cc | 124 + .../kernels/resize_nearest_neighbor_test.cc | 374 + .../tensorflow/lite/micro/kernels/round.cc | 79 + .../lite/micro/kernels/round_test.cc | 83 + .../tensorflow/lite/micro/kernels/shape.cc | 77 + .../lite/micro/kernels/shape_test.cc | 146 + .../tensorflow/lite/micro/kernels/softmax.cc | 99 + .../tensorflow/lite/micro/kernels/softmax.h | 45 + .../lite/micro/kernels/softmax_common.cc | 143 + .../lite/micro/kernels/softmax_test.cc | 509 + .../lite/micro/kernels/space_to_batch_nd.cc | 125 + .../micro/kernels/space_to_batch_nd_test.cc | 160 + .../lite/micro/kernels/space_to_depth.cc | 131 + .../lite/micro/kernels/space_to_depth_test.cc | 192 + .../tensorflow/lite/micro/kernels/split.cc | 140 + .../lite/micro/kernels/split_test.cc | 475 + .../tensorflow/lite/micro/kernels/split_v.cc | 140 + .../lite/micro/kernels/split_v_test.cc | 478 + .../tensorflow/lite/micro/kernels/squeeze.cc | 115 + .../lite/micro/kernels/squeeze_test.cc | 131 + .../lite/micro/kernels/strided_slice.cc | 206 + .../lite/micro/kernels/strided_slice_test.cc | 1144 + .../tensorflow/lite/micro/kernels/sub.cc | 299 + .../tensorflow/lite/micro/kernels/sub_test.cc | 620 + .../tensorflow/lite/micro/kernels/svdf.cc | 98 + .../tensorflow/lite/micro/kernels/svdf.h | 70 + .../lite/micro/kernels/svdf_common.cc | 473 + .../lite/micro/kernels/svdf_test.cc | 989 + .../tensorflow/lite/micro/kernels/tanh.cc | 163 + .../lite/micro/kernels/tanh_test.cc | 230 + .../lite/micro/kernels/transpose.cc | 116 + .../lite/micro/kernels/transpose_conv.cc | 300 + .../lite/micro/kernels/transpose_conv_test.cc | 386 + .../lite/micro/kernels/transpose_test.cc | 650 + .../tensorflow/lite/micro/kernels/unpack.cc | 125 + .../lite/micro/kernels/unpack_test.cc | 384 + .../lite/micro/kernels/zeros_like.cc | 93 + .../lite/micro/kernels/zeros_like_test.cc | 106 + .../lite/micro/memory_arena_threshold_test.cc | 255 + .../tensorflow/lite/micro/memory_helpers.cc | 174 + .../tensorflow/lite/micro/memory_helpers.h | 58 + .../lite/micro/memory_helpers_test.cc | 240 + .../memory_planner/greedy_memory_planner.cc | 462 + .../memory_planner/greedy_memory_planner.h | 163 + .../greedy_memory_planner_test.cc | 283 + .../memory_planner/linear_memory_planner.cc | 66 + .../memory_planner/linear_memory_planner.h | 49 + .../linear_memory_planner_test.cc | 127 + .../micro/memory_planner/memory_planner.h | 74 + .../tensorflow/lite/micro/micro_allocator.cc | 1115 + .../tensorflow/lite/micro/micro_allocator.h | 288 + .../lite/micro/micro_allocator_test.cc | 933 + .../lite/micro/micro_error_reporter.cc | 72 + .../lite/micro/micro_error_reporter.h | 50 + .../lite/micro/micro_error_reporter_test.cc | 29 + .../tensorflow/lite/micro/micro_graph.cc | 264 + .../tensorflow/lite/micro/micro_graph.h | 102 + .../lite/micro/micro_interpreter.cc | 390 + .../tensorflow/lite/micro/micro_interpreter.h | 205 + .../lite/micro/micro_interpreter_test.cc | 499 + .../lite/micro/micro_mutable_op_resolver.h | 691 + .../micro/micro_mutable_op_resolver_test.cc | 148 + .../tensorflow/lite/micro/micro_op_resolver.h | 76 + .../tensorflow/lite/micro/micro_profiler.cc | 62 + .../tensorflow/lite/micro/micro_profiler.h | 124 + .../tensorflow/lite/micro/micro_string.cc | 330 + .../tensorflow/lite/micro/micro_string.h | 33 + .../lite/micro/micro_string_test.cc | 176 + .../tensorflow/lite/micro/micro_time.cc | 71 + .../tensorflow/lite/micro/micro_time.h | 36 + .../tensorflow/lite/micro/micro_time_test.cc | 49 + .../tensorflow/lite/micro/micro_utils.cc | 82 + .../tensorflow/lite/micro/micro_utils.h | 143 + .../tensorflow/lite/micro/micro_utils_test.cc | 127 + .../tensorflow/lite/micro/mock_micro_graph.cc | 82 + .../tensorflow/lite/micro/mock_micro_graph.h | 69 + .../micro/models/person_detect_model_data.cc | 4 + .../micro/models/person_detect_model_data.h | 2 + .../models/vww2_50_50_INT8_model_data.cc | 4 + .../micro/models/vww2_50_50_INT8_model_data.h | 2 + .../lite/micro/recording_micro_allocator.cc | 249 + .../lite/micro/recording_micro_allocator.h | 121 + .../micro/recording_micro_allocator_test.cc | 302 + .../lite/micro/recording_micro_interpreter.h | 70 + .../recording_simple_memory_allocator.cc | 94 + .../micro/recording_simple_memory_allocator.h | 63 + .../recording_simple_memory_allocator_test.cc | 144 + .../lite/micro/simple_memory_allocator.cc | 176 + .../lite/micro/simple_memory_allocator.h | 111 + .../micro/simple_memory_allocator_test.cc | 285 + .../tensorflow/lite/micro/system_setup.cc | 27 + .../tensorflow/lite/micro/system_setup.h | 26 + .../tensorflow/lite/micro/test_helpers.cc | 1394 + .../tensorflow/lite/micro/test_helpers.h | 266 + .../micro/testing/generate_test_models.py | 80 + .../lite/micro/testing/micro_test.h | 241 + .../lite/micro/testing/robot.resource.txt | 26 + .../lite/micro/testing/test_conv_model.cc | 1800 ++ .../lite/micro/testing/test_conv_model.h | 23 + .../lite/micro/testing/util_test.cc | 30 + .../lite/micro/testing_helpers_test.cc | 109 + .../lite/portable_type_to_tflitetype.h | 76 + .../tensorflow/lite/schema/schema_generated.h | 21963 ++++++++++++++++ .../tensorflow/lite/schema/schema_utils.cc | 64 + .../tensorflow/lite/schema/schema_utils.h | 32 + .../flatbuffers/include/flatbuffers/base.h | 427 + .../include/flatbuffers/code_generators.h | 255 + .../include/flatbuffers/flatbuffers.h | 3388 +++ .../flatbuffers/include/flatbuffers/flatc.h | 104 + .../include/flatbuffers/flexbuffers.h | 2133 ++ .../flatbuffers/include/flatbuffers/grpc.h | 390 + .../flatbuffers/include/flatbuffers/hash.h | 141 + .../flatbuffers/include/flatbuffers/idl.h | 1241 + .../include/flatbuffers/minireflect.h | 547 + .../include/flatbuffers/pch/flatc_pch.h | 39 + .../flatbuffers/include/flatbuffers/pch/pch.h | 38 + .../include/flatbuffers/reflection.h | 559 + .../flatbuffers/reflection_generated.h | 1399 + .../include/flatbuffers/registry.h | 141 + .../include/flatbuffers/stl_emulation.h | 449 + .../flatbuffers/include/flatbuffers/util.h | 782 + .../gemmlowp/fixedpoint/fixedpoint.h | 983 + .../gemmlowp/fixedpoint/fixedpoint_neon.h | 387 + .../gemmlowp/internal/detect_platform.h | 166 + .../third_party/hexagon/LICENSE | 231 + .../third_party/hexagon/fully_connected.cc | 318 + ...hexagon_tflm_translation_fully_connected.h | 78 + .../hexagon/hexagon_tflm_translation_svdf.h | 80 + .../third_party/hexagon/svdf.cc | 610 + .../third_party/kissfft/_kiss_fft_guts.h | 175 + .../third_party/kissfft/kiss_fft.c | 438 + .../third_party/kissfft/kiss_fft.h | 129 + .../third_party/kissfft/tools/kiss_fftr.c | 159 + .../third_party/kissfft/tools/kiss_fftr.h | 43 + .../ruy/ruy/profiler/instrumentation.h | 230 + examples/tensorflowlite/sinx/CMakeLists.txt | 11 + examples/tensorflowlite/sinx/Makefile | 13 + examples/tensorflowlite/sinx/constants.cc | 20 + examples/tensorflowlite/sinx/constants.h | 33 + examples/tensorflowlite/sinx/main.c | 32 + .../tensorflowlite/sinx/main_functions.cc | 126 + examples/tensorflowlite/sinx/main_functions.h | 38 + examples/tensorflowlite/sinx/model.cc | 238 + examples/tensorflowlite/sinx/model.h | 32 + .../tensorflowlite/sinx/output_handler.cc | 25 + examples/tensorflowlite/sinx/output_handler.h | 27 + examples/tensorflowlite/sinx/proj.conf | 3 + 576 files changed, 175425 insertions(+) create mode 100644 components/TensorFlowLite/.gitignore create mode 100644 components/TensorFlowLite/CMakeLists.txt create mode 100644 components/TensorFlowLite/LICENSE create mode 100644 components/TensorFlowLite/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/c/builtin_op_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/c/c_api_types.h create mode 100644 components/TensorFlowLite/tensorflow/lite/c/common.c create mode 100644 components/TensorFlowLite/tensorflow/lite/c/common.h create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.h create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.h create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.h create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/bits.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_main.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_generator.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_main.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.h create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.c create mode 100644 components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/common.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/compatibility.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/cppmath.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/max.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/min.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/optimized/neon_check.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/portable_tensor.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add_n.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/arg_min_max.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_matmul.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_to_space_nd.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/binary_function.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/ceil.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/comparisons.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/concatenation.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/cumsum.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depth_to_space.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/dequantize.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/elu.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/exp.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fill.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_div.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_mod.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fully_connected.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/hard_swish.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/add.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mean.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/transpose_conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/l2normalization.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/leaky_relu.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/log_softmax.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/logistic.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/maximum_minimum.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/mul.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/neg.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pad.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pooling.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/prelu.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/quantize.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/reduce.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/requantize.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_bilinear.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/round.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/softmax.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_batch_nd.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_depth.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/strided_slice.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/sub.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/tanh.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose_conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/strided_slice_logic.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_ctypes.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_utils_common.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/internal/types.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/op_macros.h create mode 100644 components/TensorFlowLite/tensorflow/lite/kernels/padding.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/CONTRIBUTING.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/benchmarks/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_benchmark.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/benchmarks/micro_benchmark.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/benchmarks/person_detection_benchmark.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/compatibility.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/debug_log.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/debug_log.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/create_sine_model.ipynb create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_binary_test.sh create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_STM32F746.gif create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_arduino_mkrzero.gif create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_sparkfun_edge.gif create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/model_architecture.png create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/Makefile.inc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/constants.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/netmodels/CNN/weights.h5 create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/requirements.txt create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/train.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/train_magic_wand_model.ipynb create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/train_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/.gitignore create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/Makefile.inc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_mock_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/images/animation_on_arduino.gif create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/images/model_architecture.png create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/static_alloc.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_binary_mock_test.sh create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/fixed_point/simple_features_generator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/train_micro_speech_model.ipynb create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train_speech_model.ipynb create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/expected_output_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/input_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_model.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_tester_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/no_person_image_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_binary_test.sh create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_image_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/training_a_model.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap_test.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/README.md create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/activation_utils.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/activations.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/activations_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/add.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/add_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/cast.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/cast_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/elu.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/elu_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/exp.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/exp_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/fill.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/fill_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/floor.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/gather.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/if.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/if_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/logical.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/logical_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_ops.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_utils.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/mul.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/mul_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/neg.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/neg_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pack.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pack_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pad.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pad_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/quantization_util_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/round.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/round_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/shape.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/shape_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/split.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/split_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/sub.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/sub_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_common.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_arena_threshold_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_helpers_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/memory_planner/memory_planner.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_allocator_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_graph.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_graph.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_op_resolver.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_string.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_string.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_string_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_time.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_time.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_time_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_utils.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_utils.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/micro_utils_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_micro_interpreter.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/system_setup.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/system_setup.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/test_helpers.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/test_helpers.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing/generate_test_models.py create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing/micro_test.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing/robot.resource.txt create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.h create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing/util_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/micro/testing_helpers_test.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/portable_type_to_tflitetype.h create mode 100644 components/TensorFlowLite/tensorflow/lite/schema/schema_generated.h create mode 100644 components/TensorFlowLite/tensorflow/lite/schema/schema_utils.cc create mode 100644 components/TensorFlowLite/tensorflow/lite/schema/schema_utils.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/base.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/code_generators.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatbuffers.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatc.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flexbuffers.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/grpc.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/hash.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/idl.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/minireflect.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/flatc_pch.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/pch.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection_generated.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/registry.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/stl_emulation.h create mode 100644 components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/util.h create mode 100644 components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint.h create mode 100644 components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint_neon.h create mode 100644 components/TensorFlowLite/third_party/gemmlowp/internal/detect_platform.h create mode 100644 components/TensorFlowLite/third_party/hexagon/LICENSE create mode 100644 components/TensorFlowLite/third_party/hexagon/fully_connected.cc create mode 100644 components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_fully_connected.h create mode 100644 components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_svdf.h create mode 100644 components/TensorFlowLite/third_party/hexagon/svdf.cc create mode 100644 components/TensorFlowLite/third_party/kissfft/_kiss_fft_guts.h create mode 100644 components/TensorFlowLite/third_party/kissfft/kiss_fft.c create mode 100644 components/TensorFlowLite/third_party/kissfft/kiss_fft.h create mode 100644 components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.c create mode 100644 components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.h create mode 100644 components/TensorFlowLite/third_party/ruy/ruy/profiler/instrumentation.h create mode 100644 examples/tensorflowlite/sinx/CMakeLists.txt create mode 100644 examples/tensorflowlite/sinx/Makefile create mode 100644 examples/tensorflowlite/sinx/constants.cc create mode 100644 examples/tensorflowlite/sinx/constants.h create mode 100644 examples/tensorflowlite/sinx/main.c create mode 100644 examples/tensorflowlite/sinx/main_functions.cc create mode 100644 examples/tensorflowlite/sinx/main_functions.h create mode 100644 examples/tensorflowlite/sinx/model.cc create mode 100644 examples/tensorflowlite/sinx/model.h create mode 100644 examples/tensorflowlite/sinx/output_handler.cc create mode 100644 examples/tensorflowlite/sinx/output_handler.h create mode 100644 examples/tensorflowlite/sinx/proj.conf diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt index cac6444e..7eb40ec7 100644 --- a/components/CMakeLists.txt +++ b/components/CMakeLists.txt @@ -8,3 +8,5 @@ sdk_add_subdirectory_ifdef(CONFIG_LVGL lvgl) sdk_add_subdirectory_ifdef(CONFIG_LWIP lwip) sdk_add_subdirectory_ifdef(CONFIG_BLE ble) sdk_add_subdirectory_ifdef(CONFIG_XZ xz) +sdk_add_subdirectory_ifdef(CONFIG_TINYMAIX TinyMaix) +sdk_add_subdirectory_ifdef(CONFIG_TENSORFLOWLITE TensorFlowLite) diff --git a/components/TensorFlowLite/.gitignore b/components/TensorFlowLite/.gitignore new file mode 100644 index 00000000..c4531785 --- /dev/null +++ b/components/TensorFlowLite/.gitignore @@ -0,0 +1,5 @@ +/bazel-* +*.swp +.vscode/ +*audio_frontend* +*google* diff --git a/components/TensorFlowLite/CMakeLists.txt b/components/TensorFlowLite/CMakeLists.txt new file mode 100644 index 00000000..aef22e95 --- /dev/null +++ b/components/TensorFlowLite/CMakeLists.txt @@ -0,0 +1,25 @@ +sdk_generate_library() + +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/c sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/core/api sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/kernels sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/kernels/internal sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/micro sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/micro/kernels sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/micro/memory_planner sources) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/lite/schema sources) + +sdk_library_add_sources(${sources}) +sdk_add_include_directories(third_party/flatbuffers/include) +sdk_add_include_directories(third_party/gemmlowp) +sdk_add_include_directories(third_party/ruy) +sdk_add_include_directories(.) + +sdk_add_compile_definitions( +-DTF_LITE_USE_GLOBAL_CMATH_FUNCTIONS +-DTF_LITE_USE_GLOBAL_MIN +-DTF_LITE_USE_GLOBAL_MAX +-DTF_LITE_STATIC_MEMORY +) + +sdk_add_compile_options($<$:-fno-threadsafe-statics>) diff --git a/components/TensorFlowLite/LICENSE b/components/TensorFlowLite/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/components/TensorFlowLite/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/components/TensorFlowLite/README.md b/components/TensorFlowLite/README.md new file mode 100644 index 00000000..b0d84b35 --- /dev/null +++ b/components/TensorFlowLite/README.md @@ -0,0 +1,75 @@ + + * [TensorFlow Lite for Microcontrollers](#tensorflow-lite-for-microcontrollers) + * [Build Status](#build-status) + * [Official Builds](#official-builds) + * [Community Supported Builds](#community-supported-builds) + * [Contributing](#contributing) + * [Getting Help](#getting-help) + * [Additional Documentation](#additional-documentation) + * [RFCs](#rfcs) + + + + + +# TensorFlow Lite for Microcontrollers + +TensorFlow Lite for Microcontrollers is a port of TensorFlow Lite designed to +run machine learning models on DSPs, microcontrollers and other devices with +limited memory. + +Additional Links: + * [Tensorflow github repository](https://github.com/tensorflow/tensorflow/) + * [TFLM at tensorflow.org](https://www.tensorflow.org/lite/microcontrollers) + +# Build Status + + * [GitHub Status](https://www.githubstatus.com/) + +## Official Builds + +Build Type | Status | +----------- | --------------| +CI (Linux) | [![CI](https://github.com/tensorflow/tflite-micro/actions/workflows/ci.yml/badge.svg?event=schedule)](https://github.com/tensorflow/tflite-micro/actions/workflows/ci.yml?query=event%3Aschedule) | +Code Sync | [![Sync from Upstream TF](https://github.com/tensorflow/tflite-micro/actions/workflows/sync.yml/badge.svg)](https://github.com/tensorflow/tflite-micro/actions/workflows/sync.yml) | + +## Community Supported Builds +Build Type | Status | +----------- | --------------| +Arduino | [![Arduino](https://github.com/tensorflow/tflite-micro/actions/workflows/arduino.yml/badge.svg)](https://github.com/tensorflow/tflite-micro/actions/workflows/arduino.yml) [![Antmicro](https://github.com/antmicro/tensorflow-arduino-examples/actions/workflows/test_examples.yml/badge.svg)](https://github.com/antmicro/tensorflow-arduino-examples/actions/workflows/test_examples.yml) | +Cortex-M | [![Cortex-M](https://github.com/tensorflow/tflite-micro/actions/workflows/cortex_m.yml/badge.svg)](https://github.com/tensorflow/tflite-micro/actions/workflows/cortex_m.yml) | +Sparkfun Edge | [![Sparkfun Edge](https://github.com/tensorflow/tflite-micro/actions/workflows/sparkfun_edge.yml/badge.svg)](https://github.com/tensorflow/tflite-micro/actions/workflows/sparkfun_edge.yml) | +Xtensa | [![Xtensa](https://github.com/tensorflow/tflite-micro/actions/workflows/xtensa.yml/badge.svg?event=schedule)](https://github.com/tensorflow/tflite-micro/actions/workflows/xtensa.yml?query=event%3Aschedule) [![Xtensa](https://raw.githubusercontent.com/advaitjain/tflite-micro/local-continuous-builds/tensorflow/lite/micro/docs/local_continuous_builds/xtensa-build-status.svg)](https://github.com/advaitjain/tflite-micro/tree/local-continuous-builds/tensorflow/lite/micro/docs/local_continuous_builds/xtensa.md#summary) | + + +# Contributing +See our [contribution documentation](CONTRIBUTING.md). + +# Getting Help + +A [Github issue](https://github.com/tensorflow/tflite-micro/issues/new/choose) +should be the primary method of getting in touch with the TensorFlow Lite Micro +(TFLM) team. + +The following resources may also be useful: + +1. SIG Micro [email group](https://groups.google.com/a/tensorflow.org/g/micro) + and + [monthly meetings](http://doc/1YHq9rmhrOUdcZnrEnVCWvd87s2wQbq4z17HbeRl-DBc). + +1. SIG Micro [gitter chat room](https://gitter.im/tensorflow/sig-micro). + +# Additional Documentation + + * [Continuous Integration](docs/continuous_integration.md) + * [Benchmarks](tensorflow/lite/micro/benchmarks/README.md) + * [Profiling](tensorflow/lite/micro/docs/profiling.md) + * [Memory Management](tensorflow/lite/micro/docs/memory_management.md) + * [Optimized Kernel Implementations](tensorflow/lite/micro/docs/optimized_kernel_implementations.md) + * [New Platform Support](tensorflow/lite/micro/docs/new_platform_support.md) + * [Software Emulation with Renode](tensorflow/lite/micro/docs/renode.md) + +# RFCs + +1. [Pre-allocated tensors](tensorflow/lite/micro/docs/rfc/001_preallocated_tensors.md) +1. [TensorFlow Lite for Microcontrollers Port of 16x8 Quantized Operators](tensorflow/lite/micro/docs/rfc/002_16x8_quantization_port.md) diff --git a/components/TensorFlowLite/tensorflow/lite/c/builtin_op_data.h b/components/TensorFlowLite/tensorflow/lite/c/builtin_op_data.h new file mode 100644 index 00000000..c76644f6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/c/builtin_op_data.h @@ -0,0 +1,504 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_C_BUILTIN_OP_DATA_H_ +#define TENSORFLOW_LITE_C_BUILTIN_OP_DATA_H_ + +#include + +#include "tensorflow/lite/c/common.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// TfLiteReshapeParams can't have dynamic data so we fix the maximum possible +// number of dimensions. +#define TFLITE_RESHAPE_PARAMS_MAX_DIMENSION_COUNT 8 + +// TODO(aselle): Consider using "if this then that" for testing. + +// Useful placeholder to put in otherwise empty structs to avoid size warnings. +typedef struct { + char dummy; +} EmptyStructPlaceholder; + +// IMPORTANT: All new members of structs must be added at the end to ensure +// backwards compatibility. + +// Possible padding types (for convolutions) +typedef enum { + kTfLitePaddingUnknown = 0, + kTfLitePaddingSame, + kTfLitePaddingValid, +} TfLitePadding; + +typedef enum { + kTfLiteMirrorPaddingUnknown = 0, + kTfLiteMirrorPaddingReflect, + kTfLiteMirrorPaddingSymmetric, +} TfLiteMirrorPaddingMode; + +// TODO(b/130259536): We should move this out of builtin_op_data. +typedef struct { + int width; + int height; + int width_offset; + int height_offset; +} TfLitePaddingValues; + +typedef struct { + TfLiteMirrorPaddingMode mode; +} TfLiteMirrorPaddingParams; + +// Possible fused activation functions. +typedef enum { + kTfLiteActNone = 0, + kTfLiteActRelu, + kTfLiteActReluN1To1, // min(max(-1, x), 1) + kTfLiteActRelu6, // min(max(0, x), 6) + kTfLiteActTanh, + kTfLiteActSignBit, + kTfLiteActSigmoid, +} TfLiteFusedActivation; + +typedef struct { + // Parameters for CONV_2D version 1. + TfLitePadding padding; + int stride_width; + int stride_height; + TfLiteFusedActivation activation; + + // Parameters for CONV_2D version 2. + // Note: Version 2 supports dilation values not equal to 1. + int dilation_width_factor; + int dilation_height_factor; +} TfLiteConvParams; + +typedef struct { + TfLitePadding padding; + int stride_width; + int stride_height; + int stride_depth; + int dilation_width_factor; + int dilation_height_factor; + int dilation_depth_factor; + TfLiteFusedActivation activation; +} TfLiteConv3DParams; + +typedef TfLiteConv3DParams TfLiteConv3DTransposeParams; + +typedef struct { + TfLitePadding padding; + int stride_width; + int stride_height; + int filter_width; + int filter_height; + TfLiteFusedActivation activation; + struct { + TfLitePaddingValues padding; + } computed; +} TfLitePoolParams; + +typedef struct { + // Parameters for DepthwiseConv version 1 or above. + TfLitePadding padding; + int stride_width; + int stride_height; + // `depth_multiplier` is redundant. It's used by CPU kernels in + // TensorFlow 2.0 or below, but ignored in versions above. + // + // The information can be deduced from the shape of input and the shape of + // weights. Since the TFLiteConverter toolchain doesn't support partially + // specified shapes, relying on `depth_multiplier` stops us from supporting + // graphs with dynamic shape tensors. + // + // Note: Some of the delegates (e.g. NNAPI, GPU) are still relying on this + // field. + int depth_multiplier; + TfLiteFusedActivation activation; + // Parameters for DepthwiseConv version 2 or above. + int dilation_width_factor; + int dilation_height_factor; +} TfLiteDepthwiseConvParams; + +typedef struct { + int rank; + TfLiteFusedActivation activation; + + // Parameter for SVDF version 4. + bool asymmetric_quantize_inputs; +} TfLiteSVDFParams; + +typedef struct { + TfLiteFusedActivation activation; + + // Parameter for RNN version 3. + bool asymmetric_quantize_inputs; +} TfLiteRNNParams; + +typedef struct { + bool time_major; + TfLiteFusedActivation activation; + + // Parameter for Sequence RNN version 3. + bool asymmetric_quantize_inputs; +} TfLiteSequenceRNNParams; + +typedef struct { + bool time_major; + TfLiteFusedActivation activation; + bool merge_outputs; + + // Parameter for Bidirectional RNN verison 3. + bool asymmetric_quantize_inputs; +} TfLiteBidirectionalSequenceRNNParams; + +typedef enum { + kTfLiteFullyConnectedWeightsFormatDefault = 0, + kTfLiteFullyConnectedWeightsFormatShuffled4x16Int8 = 1, +} TfLiteFullyConnectedWeightsFormat; + +typedef struct { + // Parameters for FullyConnected version 1 or above. + TfLiteFusedActivation activation; + + // Parameters for FullyConnected version 2 or above. + TfLiteFullyConnectedWeightsFormat weights_format; + + // Parameters for FullyConnected version 5 or above. + // If set to true, then the number of dimensions in the input and the output + // tensors are the same. Furthermore, all but the last dimension of the input + // and output shapes will be equal. + bool keep_num_dims; + + // Parameters for FullyConnected version 7 or above. + // If set to true and the weights are quantized, then non constant inputs + // are quantized at evaluation time with asymmetric quantization. + bool asymmetric_quantize_inputs; +} TfLiteFullyConnectedParams; + +typedef enum { + kTfLiteLshProjectionUnknown = 0, + kTfLiteLshProjectionSparse = 1, + kTfLiteLshProjectionDense = 2, +} TfLiteLSHProjectionType; + +typedef struct { + TfLiteLSHProjectionType type; +} TfLiteLSHProjectionParams; + +typedef struct { + float beta; +} TfLiteSoftmaxParams; + +typedef struct { + int axis; + TfLiteFusedActivation activation; +} TfLiteConcatenationParams; + +typedef struct { + TfLiteFusedActivation activation; + // Parameter added for the version 4. + bool pot_scale_int16; +} TfLiteAddParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLiteSpaceToBatchNDParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLiteBatchToSpaceNDParams; + +typedef struct { + bool adj_x; + bool adj_y; + // Parameters for BatchMatMul version 4 or above. + // If set to true and the weights are quantized, then non constant inputs + // are quantized at evaluation time with asymmetric quantization. + bool asymmetric_quantize_inputs; +} TfLiteBatchMatMulParams; + +typedef struct { + TfLiteFusedActivation activation; +} TfLiteMulParams; + +typedef struct { + TfLiteFusedActivation activation; + // Parameter added for the version 5. + bool pot_scale_int16; +} TfLiteSubParams; + +typedef struct { + TfLiteFusedActivation activation; +} TfLiteDivParams; + +typedef struct { + TfLiteFusedActivation activation; +} TfLiteL2NormParams; + +typedef struct { + int radius; + float bias; + float alpha; + float beta; +} TfLiteLocalResponseNormParams; + +typedef enum { + kTfLiteLSTMFullKernel = 0, + kTfLiteLSTMBasicKernel +} TfLiteLSTMKernelType; + +typedef struct { + // Parameters for LSTM version 1. + TfLiteFusedActivation activation; + float cell_clip; + float proj_clip; + + // Parameters for LSTM version 2. + // kTfLiteLSTMBasicKernel is only supported in version 2 or above. + TfLiteLSTMKernelType kernel_type; + + // Parameters for LSTM version 4. + bool asymmetric_quantize_inputs; +} TfLiteLSTMParams; + +typedef struct { + // Parameters needed for the underlying LSTM. + TfLiteFusedActivation activation; + float cell_clip; + float proj_clip; + + // If set to true then the first dimension is time, otherwise batch. + bool time_major; + + // Parameter for unidirectional sequence RNN version 3. + bool asymmetric_quantize_inputs; +} TfLiteUnidirectionalSequenceLSTMParams; + +typedef struct { + // Parameters supported by version 1: + // Parameters inherited for the LSTM kernel. + TfLiteFusedActivation activation; + float cell_clip; + float proj_clip; + + // If true, store the outputs of both directions in the first output. + bool merge_outputs; + + // Parameters supported by version 2: + // If set to true then the first dimension is time, otherwise batch. + bool time_major; + + // Parameters supported by version 4: + // If set to true, then hybrid ops use asymmetric quantization for inputs. + bool asymmetric_quantize_inputs; +} TfLiteBidirectionalSequenceLSTMParams; + +typedef struct { + bool align_corners; + // half_pixel_centers assumes pixels are of half the actual dimensions, and + // yields more accurate resizes. Corresponds to the same argument for the + // original TensorFlow op in TF2.0. + bool half_pixel_centers; +} TfLiteResizeBilinearParams; + +typedef struct { + bool align_corners; + bool half_pixel_centers; +} TfLiteResizeNearestNeighborParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLitePadParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLitePadV2Params; + +typedef struct { + // These fields are only used in old models for backward compatibility. + // In the current implementation, we use the 2nd input of the op as the shape, + // and these fields are unused. + int shape[TFLITE_RESHAPE_PARAMS_MAX_DIMENSION_COUNT]; + int num_dimensions; +} TfLiteReshapeParams; + +typedef struct { + int ngram_size; + int max_skip_size; + bool include_all_ngrams; +} TfLiteSkipGramParams; + +typedef struct { + int block_size; +} TfLiteSpaceToDepthParams; + +typedef struct { + int block_size; +} TfLiteDepthToSpaceParams; + +typedef struct { + TfLiteType in_data_type; + TfLiteType out_data_type; +} TfLiteCastParams; + +typedef enum { + kTfLiteCombinerTypeSum = 0, + kTfLiteCombinerTypeMean = 1, + kTfLiteCombinerTypeSqrtn = 2, +} TfLiteCombinerType; + +typedef struct { + TfLiteCombinerType combiner; +} TfLiteEmbeddingLookupSparseParams; + +typedef struct { + int axis; + int batch_dims; +} TfLiteGatherParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLiteTransposeParams; + +typedef struct { + bool keep_dims; +} TfLiteReducerParams; + +typedef struct { + int num_splits; +} TfLiteSplitParams; + +typedef struct { + int num_splits; +} TfLiteSplitVParams; + +typedef struct { + // TODO(ahentz): We can't have dynamic data in this struct, at least not yet. + // For now we will fix the maximum possible number of dimensions. + int squeeze_dims[8]; + int num_squeeze_dims; +} TfLiteSqueezeParams; + +typedef struct { + int begin_mask; + int end_mask; + int ellipsis_mask; + int new_axis_mask; + int shrink_axis_mask; +} TfLiteStridedSliceParams; + +typedef struct { + TfLiteType output_type; +} TfLiteArgMaxParams; + +typedef struct { + TfLiteType output_type; +} TfLiteArgMinParams; + +typedef struct { + TfLitePadding padding; + int stride_width; + int stride_height; +} TfLiteTransposeConvParams; + +typedef struct { + bool validate_indices; +} TfLiteSparseToDenseParams; + +typedef struct { + TfLiteType out_type; +} TfLiteShapeParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLiteRankParams; + +typedef struct { + // Parameters supported by version 1: + float min; + float max; + int num_bits; + + // Parameters supported by version 2: + bool narrow_range; +} TfLiteFakeQuantParams; + +typedef struct { + int values_count; + int axis; +} TfLitePackParams; + +typedef struct { + int axis; +} TfLiteOneHotParams; + +typedef struct { + int num; + int axis; +} TfLiteUnpackParams; + +typedef struct { + float alpha; +} TfLiteLeakyReluParams; + +typedef struct { + TfLiteType index_out_type; +} TfLiteUniqueParams; + +typedef struct { + int seq_dim; + int batch_dim; +} TfLiteReverseSequenceParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLiteMatrixDiagParams; + +typedef struct { + EmptyStructPlaceholder placeholder; +} TfLiteMatrixSetDiagParams; + +typedef struct { + int then_subgraph_index; + int else_subgraph_index; +} TfLiteIfParams; + +typedef struct { + int cond_subgraph_index; + int body_subgraph_index; +} TfLiteWhileParams; + +typedef struct { + bool exclusive; + bool reverse; +} TfLiteCumsumParams; + +typedef struct { + int init_subgraph_index; +} TfLiteCallOnceParams; + +typedef struct { + int table_id; + TfLiteType key_dtype; + TfLiteType value_dtype; +} TfLiteHashtableParams; + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // TENSORFLOW_LITE_C_BUILTIN_OP_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/c/c_api_types.h b/components/TensorFlowLite/tensorflow/lite/c/c_api_types.h new file mode 100644 index 00000000..a8921177 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/c/c_api_types.h @@ -0,0 +1,105 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This file declares types used by the pure C inference API defined in c_api.h, +// some of which are also used in the C++ and C kernel and interpreter APIs. + +#ifndef TENSORFLOW_LITE_C_C_API_TYPES_H_ +#define TENSORFLOW_LITE_C_C_API_TYPES_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Define TFL_CAPI_EXPORT macro to export a function properly with a shared +// library. +#ifdef SWIG +#define TFL_CAPI_EXPORT +#elif defined(TFL_STATIC_LIBRARY_BUILD) +#define TFL_CAPI_EXPORT +#else // not definded TFL_STATIC_LIBRARY_BUILD +#if defined(_WIN32) +#ifdef TFL_COMPILE_LIBRARY +#define TFL_CAPI_EXPORT __declspec(dllexport) +#else +#define TFL_CAPI_EXPORT __declspec(dllimport) +#endif // TFL_COMPILE_LIBRARY +#else +#define TFL_CAPI_EXPORT __attribute__((visibility("default"))) +#endif // _WIN32 +#endif // SWIG + +typedef enum TfLiteStatus { + kTfLiteOk = 0, + + // Generally referring to an error in the runtime (i.e. interpreter) + kTfLiteError = 1, + + // Generally referring to an error from a TfLiteDelegate itself. + kTfLiteDelegateError = 2, + + // Generally referring to an error in applying a delegate due to + // incompatibility between runtime and delegate, e.g., this error is returned + // when trying to apply a TfLite delegate onto a model graph that's already + // immutable. + kTfLiteApplicationError = 3, + + // Generally referring to serialized delegate data not being found. + // See tflite::delegates::Serialization. + kTfLiteDelegateDataNotFound = 4, + + // Generally referring to data-writing issues in delegate serialization. + // See tflite::delegates::Serialization. + kTfLiteDelegateDataWriteError = 5, +} TfLiteStatus; + +// Types supported by tensor +typedef enum { + kTfLiteNoType = 0, + kTfLiteFloat32 = 1, + kTfLiteInt32 = 2, + kTfLiteUInt8 = 3, + kTfLiteInt64 = 4, + kTfLiteString = 5, + kTfLiteBool = 6, + kTfLiteInt16 = 7, + kTfLiteComplex64 = 8, + kTfLiteInt8 = 9, + kTfLiteFloat16 = 10, + kTfLiteFloat64 = 11, + kTfLiteComplex128 = 12, + kTfLiteUInt64 = 13, + kTfLiteResource = 14, + kTfLiteVariant = 15, + kTfLiteUInt32 = 16, +} TfLiteType; + +// Legacy. Will be deprecated in favor of TfLiteAffineQuantization. +// If per-layer quantization is specified this field will still be populated in +// addition to TfLiteAffineQuantization. +// Parameters for asymmetric quantization. Quantized values can be converted +// back to float using: +// real_value = scale * (quantized_value - zero_point) +typedef struct TfLiteQuantizationParams { + float scale; + int32_t zero_point; +} TfLiteQuantizationParams; + +#ifdef __cplusplus +} // extern C +#endif +#endif // TENSORFLOW_LITE_C_C_API_TYPES_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/c/common.c b/components/TensorFlowLite/tensorflow/lite/c/common.c new file mode 100644 index 00000000..811c0a23 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/c/common.c @@ -0,0 +1,274 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/c/c_api_types.h" + +#ifndef TF_LITE_STATIC_MEMORY +#include +#include +#endif // TF_LITE_STATIC_MEMORY + +int TfLiteIntArrayGetSizeInBytes(int size) +{ + static TfLiteIntArray dummy; + return sizeof(dummy) + sizeof(dummy.data[0]) * size; +} + +int TfLiteIntArrayEqual(const TfLiteIntArray *a, const TfLiteIntArray *b) +{ + if (a == b) + return 1; + if (a == NULL || b == NULL) + return 0; + return TfLiteIntArrayEqualsArray(a, b->size, b->data); +} + +int TfLiteIntArrayEqualsArray(const TfLiteIntArray *a, int b_size, + const int b_data[]) +{ + if (a == NULL) + return (b_size == 0); + if (a->size != b_size) + return 0; + int i = 0; + for (; i < a->size; i++) + if (a->data[i] != b_data[i]) + return 0; + return 1; +} + +#ifndef TF_LITE_STATIC_MEMORY + +TfLiteIntArray *TfLiteIntArrayCreate(int size) +{ + int alloc_size = TfLiteIntArrayGetSizeInBytes(size); + if (alloc_size <= 0) + return NULL; + TfLiteIntArray *ret = (TfLiteIntArray *)malloc(alloc_size); + if (!ret) + return ret; + ret->size = size; + return ret; +} + +TfLiteIntArray *TfLiteIntArrayCopy(const TfLiteIntArray *src) +{ + if (!src) + return NULL; + TfLiteIntArray *ret = TfLiteIntArrayCreate(src->size); + if (ret) { + memcpy(ret->data, src->data, src->size * sizeof(int)); + } + return ret; +} + +void TfLiteIntArrayFree(TfLiteIntArray *a) +{ + free(a); +} + +#endif // TF_LITE_STATIC_MEMORY + +int TfLiteFloatArrayGetSizeInBytes(int size) +{ + static TfLiteFloatArray dummy; + return sizeof(dummy) + sizeof(dummy.data[0]) * size; +} + +#ifndef TF_LITE_STATIC_MEMORY + +TfLiteFloatArray *TfLiteFloatArrayCreate(int size) +{ + TfLiteFloatArray *ret = + (TfLiteFloatArray *)malloc(TfLiteFloatArrayGetSizeInBytes(size)); + ret->size = size; + return ret; +} + +void TfLiteFloatArrayFree(TfLiteFloatArray *a) +{ + free(a); +} + +void TfLiteTensorDataFree(TfLiteTensor *t) +{ + if (t->allocation_type == kTfLiteDynamic || + t->allocation_type == kTfLitePersistentRo) { + free(t->data.raw); + } + t->data.raw = NULL; +} + +void TfLiteQuantizationFree(TfLiteQuantization *quantization) +{ + if (quantization->type == kTfLiteAffineQuantization) { + TfLiteAffineQuantization *q_params = + (TfLiteAffineQuantization *)(quantization->params); + if (q_params->scale) { + TfLiteFloatArrayFree(q_params->scale); + q_params->scale = NULL; + } + if (q_params->zero_point) { + TfLiteIntArrayFree(q_params->zero_point); + q_params->zero_point = NULL; + } + free(q_params); + } + quantization->params = NULL; + quantization->type = kTfLiteNoQuantization; +} + +void TfLiteSparsityFree(TfLiteSparsity *sparsity) +{ + if (sparsity == NULL) { + return; + } + + if (sparsity->traversal_order) { + TfLiteIntArrayFree(sparsity->traversal_order); + sparsity->traversal_order = NULL; + } + + if (sparsity->block_map) { + TfLiteIntArrayFree(sparsity->block_map); + sparsity->block_map = NULL; + } + + if (sparsity->dim_metadata) { + int i = 0; + for (; i < sparsity->dim_metadata_size; i++) { + TfLiteDimensionMetadata metadata = sparsity->dim_metadata[i]; + if (metadata.format == kTfLiteDimSparseCSR) { + TfLiteIntArrayFree(metadata.array_segments); + metadata.array_segments = NULL; + TfLiteIntArrayFree(metadata.array_indices); + metadata.array_indices = NULL; + } + } + free(sparsity->dim_metadata); + sparsity->dim_metadata = NULL; + } + + free(sparsity); +} + +void TfLiteTensorFree(TfLiteTensor *t) +{ + TfLiteTensorDataFree(t); + if (t->dims) + TfLiteIntArrayFree(t->dims); + t->dims = NULL; + + if (t->dims_signature) { + TfLiteIntArrayFree((TfLiteIntArray *)t->dims_signature); + } + t->dims_signature = NULL; + + TfLiteQuantizationFree(&t->quantization); + TfLiteSparsityFree(t->sparsity); + t->sparsity = NULL; +} + +void TfLiteTensorReset(TfLiteType type, const char *name, TfLiteIntArray *dims, + TfLiteQuantizationParams quantization, char *buffer, + size_t size, TfLiteAllocationType allocation_type, + const void *allocation, bool is_variable, + TfLiteTensor *tensor) +{ + TfLiteTensorFree(tensor); + tensor->type = type; + tensor->name = name; + tensor->dims = dims; + tensor->params = quantization; + tensor->data.raw = buffer; + tensor->bytes = size; + tensor->allocation_type = allocation_type; + tensor->allocation = allocation; + tensor->is_variable = is_variable; + + tensor->quantization.type = kTfLiteNoQuantization; + tensor->quantization.params = NULL; +} + +void TfLiteTensorRealloc(size_t num_bytes, TfLiteTensor *tensor) +{ + if (tensor->allocation_type != kTfLiteDynamic && + tensor->allocation_type != kTfLitePersistentRo) { + return; + } + // TODO(b/145340303): Tensor data should be aligned. + if (!tensor->data.raw) { + tensor->data.raw = (char *)malloc(num_bytes); + } else if (num_bytes > tensor->bytes) { + tensor->data.raw = (char *)realloc(tensor->data.raw, num_bytes); + } + tensor->bytes = num_bytes; +} +#endif // TF_LITE_STATIC_MEMORY + +const char *TfLiteTypeGetName(TfLiteType type) +{ + switch (type) { + case kTfLiteNoType: + return "NOTYPE"; + case kTfLiteFloat32: + return "FLOAT32"; + case kTfLiteInt16: + return "INT16"; + case kTfLiteInt32: + return "INT32"; + case kTfLiteUInt32: + return "UINT32"; + case kTfLiteUInt8: + return "UINT8"; + case kTfLiteInt8: + return "INT8"; + case kTfLiteInt64: + return "INT64"; + case kTfLiteUInt64: + return "UINT64"; + case kTfLiteBool: + return "BOOL"; + case kTfLiteComplex64: + return "COMPLEX64"; + case kTfLiteComplex128: + return "COMPLEX128"; + case kTfLiteString: + return "STRING"; + case kTfLiteFloat16: + return "FLOAT16"; + case kTfLiteFloat64: + return "FLOAT64"; + case kTfLiteResource: + return "RESOURCE"; + case kTfLiteVariant: + return "VARIANT"; + } + return "Unknown type"; +} + +TfLiteDelegate TfLiteDelegateCreate(void) +{ + TfLiteDelegate d = { + .data_ = NULL, + .Prepare = NULL, + .CopyFromBufferHandle = NULL, + .CopyToBufferHandle = NULL, + .FreeBufferHandle = NULL, + .flags = kTfLiteDelegateFlagsNone, + }; + return d; +} diff --git a/components/TensorFlowLite/tensorflow/lite/c/common.h b/components/TensorFlowLite/tensorflow/lite/c/common.h new file mode 100644 index 00000000..51b9bbfa --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/c/common.h @@ -0,0 +1,952 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This file defines common C types and APIs for implementing operations, +// delegates and other constructs in TensorFlow Lite. The actual operations and +// delegates can be defined using C++, but the interface between the interpreter +// and the operations are C. +// +// Summary of abstractions +// TF_LITE_ENSURE - Self-sufficient error checking +// TfLiteStatus - Status reporting +// TfLiteIntArray - stores tensor shapes (dims), +// TfLiteContext - allows an op to access the tensors +// TfLiteTensor - tensor (a multidimensional array) +// TfLiteNode - a single node or operation +// TfLiteRegistration - the implementation of a conceptual operation. +// TfLiteDelegate - allows delegation of nodes to alternative backends. +// +// Some abstractions in this file are created and managed by Interpreter. +// +// NOTE: The order of values in these structs are "semi-ABI stable". New values +// should be added only to the end of structs and never reordered. + +#ifndef TENSORFLOW_LITE_C_COMMON_H_ +#define TENSORFLOW_LITE_C_COMMON_H_ + +#include +#include +#include + +#include "tensorflow/lite/c/c_api_types.h" // IWYU pragma: export + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// The list of external context types known to TF Lite. This list exists solely +// to avoid conflicts and to ensure ops can share the external contexts they +// need. Access to the external contexts is controlled by one of the +// corresponding support files. +typedef enum TfLiteExternalContextType { + kTfLiteEigenContext = 0, // include eigen_support.h to use. + kTfLiteGemmLowpContext = 1, // include gemm_support.h to use. + kTfLiteEdgeTpuContext = 2, // Placeholder for Edge TPU support. + kTfLiteCpuBackendContext = 3, // include cpu_backend_context.h to use. + kTfLiteMaxExternalContexts = 4 +} TfLiteExternalContextType; + +// Forward declare so dependent structs and methods can reference these types +// prior to the struct definitions. +struct TfLiteContext; +struct TfLiteDelegate; +struct TfLiteRegistration; + +// An external context is a collection of information unrelated to the TF Lite +// framework, but useful to a subset of the ops. TF Lite knows very little +// about the actual contexts, but it keeps a list of them, and is able to +// refresh them if configurations like the number of recommended threads +// change. +typedef struct TfLiteExternalContext { + TfLiteExternalContextType type; + TfLiteStatus (*Refresh)(struct TfLiteContext *context); +} TfLiteExternalContext; + +#define kTfLiteOptionalTensor (-1) + +// Fixed size list of integers. Used for dimensions and inputs/outputs tensor +// indices +typedef struct TfLiteIntArray { + int size; +// gcc 6.1+ have a bug where flexible members aren't properly handled +// https://github.com/google/re2/commit/b94b7cd42e9f02673cd748c1ac1d16db4052514c +#if (!defined(__clang__) && defined(__GNUC__) && __GNUC__ == 6 && \ + __GNUC_MINOR__ >= 1) || \ + defined(HEXAGON) || \ + (defined(__clang__) && __clang_major__ == 7 && __clang_minor__ == 1) + int data[0]; +#else + int data[]; +#endif +} TfLiteIntArray; + +// Given the size (number of elements) in a TfLiteIntArray, calculate its size +// in bytes. +int TfLiteIntArrayGetSizeInBytes(int size); + +#ifndef TF_LITE_STATIC_MEMORY +// Create a array of a given `size` (uninitialized entries). +// This returns a pointer, that you must free using TfLiteIntArrayFree(). +TfLiteIntArray *TfLiteIntArrayCreate(int size); +#endif + +// Check if two intarrays are equal. Returns 1 if they are equal, 0 otherwise. +int TfLiteIntArrayEqual(const TfLiteIntArray *a, const TfLiteIntArray *b); + +// Check if an intarray equals an array. Returns 1 if equals, 0 otherwise. +int TfLiteIntArrayEqualsArray(const TfLiteIntArray *a, int b_size, + const int b_data[]); + +#ifndef TF_LITE_STATIC_MEMORY +// Create a copy of an array passed as `src`. +// You are expected to free memory with TfLiteIntArrayFree +TfLiteIntArray *TfLiteIntArrayCopy(const TfLiteIntArray *src); + +// Free memory of array `a`. +void TfLiteIntArrayFree(TfLiteIntArray *a); +#endif // TF_LITE_STATIC_MEMORY + +// Fixed size list of floats. Used for per-channel quantization. +typedef struct TfLiteFloatArray { + int size; +// gcc 6.1+ have a bug where flexible members aren't properly handled +// https://github.com/google/re2/commit/b94b7cd42e9f02673cd748c1ac1d16db4052514c +// This also applies to the toolchain used for Qualcomm Hexagon DSPs. +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ == 6 && \ + __GNUC_MINOR__ >= 1 + float data[0]; +#else + float data[]; +#endif +} TfLiteFloatArray; + +// Given the size (number of elements) in a TfLiteFloatArray, calculate its size +// in bytes. +int TfLiteFloatArrayGetSizeInBytes(int size); + +#ifndef TF_LITE_STATIC_MEMORY +// Create a array of a given `size` (uninitialized entries). +// This returns a pointer, that you must free using TfLiteFloatArrayFree(). +TfLiteFloatArray *TfLiteFloatArrayCreate(int size); + +// Free memory of array `a`. +void TfLiteFloatArrayFree(TfLiteFloatArray *a); +#endif // TF_LITE_STATIC_MEMORY + +// Since we must not depend on any libraries, define a minimal subset of +// error macros while avoiding names that have pre-conceived meanings like +// assert and check. + +// Try to make all reporting calls through TF_LITE_KERNEL_LOG rather than +// calling the context->ReportError function directly, so that message strings +// can be stripped out if the binary size needs to be severely optimized. +#ifndef TF_LITE_STRIP_ERROR_STRINGS +#define TF_LITE_KERNEL_LOG(context, ...) \ + do { \ + (context)->ReportError((context), __VA_ARGS__); \ + } while (false) + +#define TF_LITE_MAYBE_KERNEL_LOG(context, ...) \ + do { \ + if ((context) != nullptr) { \ + (context)->ReportError((context), __VA_ARGS__); \ + } \ + } while (false) +#else // TF_LITE_STRIP_ERROR_STRINGS +#define TF_LITE_KERNEL_LOG(context, ...) +#define TF_LITE_MAYBE_KERNEL_LOG(context, ...) +#endif // TF_LITE_STRIP_ERROR_STRINGS + +// Check whether value is true, and if not return kTfLiteError from +// the current function (and report the error string msg). +#define TF_LITE_ENSURE_MSG(context, value, msg) \ + do { \ + if (!(value)) { \ + TF_LITE_KERNEL_LOG((context), __FILE__ " " msg); \ + return kTfLiteError; \ + } \ + } while (0) + +// Check whether the value `a` is true, and if not return kTfLiteError from +// the current function, while also reporting the location of the error. +#define TF_LITE_ENSURE(context, a) \ + do { \ + if (!(a)) { \ + TF_LITE_KERNEL_LOG((context), "%s:%d %s was not true.", __FILE__, \ + __LINE__, #a); \ + return kTfLiteError; \ + } \ + } while (0) + +#define TF_LITE_ENSURE_STATUS(a) \ + do { \ + const TfLiteStatus s = (a); \ + if (s != kTfLiteOk) { \ + return s; \ + } \ + } while (0) + +// Check whether the value `a == b` is true, and if not return kTfLiteError from +// the current function, while also reporting the location of the error. +// `a` and `b` may be evaluated more than once, so no side effects or +// extremely expensive computations should be done. +// NOTE: Use TF_LITE_ENSURE_TYPES_EQ if comparing TfLiteTypes. +#define TF_LITE_ENSURE_EQ(context, a, b) \ + do { \ + if ((a) != (b)) { \ + TF_LITE_KERNEL_LOG((context), "%s:%d %s != %s (%d != %d)", __FILE__, \ + __LINE__, #a, #b, (a), (b)); \ + return kTfLiteError; \ + } \ + } while (0) + +#define TF_LITE_ENSURE_TYPES_EQ(context, a, b) \ + do { \ + if ((a) != (b)) { \ + TF_LITE_KERNEL_LOG((context), "%s:%d %s != %s (%s != %s)", __FILE__, \ + __LINE__, #a, #b, TfLiteTypeGetName(a), \ + TfLiteTypeGetName(b)); \ + return kTfLiteError; \ + } \ + } while (0) + +#define TF_LITE_ENSURE_NEAR(context, a, b, epsilon) \ + do { \ + auto delta = ((a) > (b)) ? ((a) - (b)) : ((b) - (a)); \ + if (delta > epsilon) { \ + TF_LITE_KERNEL_LOG((context), "%s:%d %s not near %s (%f != %f)", \ + __FILE__, __LINE__, #a, #b, static_cast(a), \ + static_cast(b)); \ + return kTfLiteError; \ + } \ + } while (0) + +#define TF_LITE_ENSURE_OK(context, status) \ + do { \ + const TfLiteStatus s = (status); \ + if ((s) != kTfLiteOk) { \ + return s; \ + } \ + } while (0) + +// Single-precision complex data type compatible with the C99 definition. +typedef struct TfLiteComplex64 { + float re, im; // real and imaginary parts, respectively. +} TfLiteComplex64; + +// Double-precision complex data type compatible with the C99 definition. +typedef struct TfLiteComplex128 { + double re, im; // real and imaginary parts, respectively. +} TfLiteComplex128; + +// Half precision data type compatible with the C99 definition. +typedef struct TfLiteFloat16 { + uint16_t data; +} TfLiteFloat16; + +// Return the name of a given type, for error reporting purposes. +const char *TfLiteTypeGetName(TfLiteType type); + +// SupportedQuantizationTypes. +typedef enum TfLiteQuantizationType { + // No quantization. + kTfLiteNoQuantization = 0, + // Affine quantization (with support for per-channel quantization). + // Corresponds to TfLiteAffineQuantization. + kTfLiteAffineQuantization = 1, +} TfLiteQuantizationType; + +// Structure specifying the quantization used by the tensor, if-any. +typedef struct TfLiteQuantization { + // The type of quantization held by params. + TfLiteQuantizationType type; + // Holds an optional reference to a quantization param structure. The actual + // type depends on the value of the `type` field (see the comment there for + // the values and corresponding types). + void *params; +} TfLiteQuantization; + +// Parameters for asymmetric quantization across a dimension (i.e per output +// channel quantization). +// quantized_dimension specifies which dimension the scales and zero_points +// correspond to. +// For a particular value in quantized_dimension, quantized values can be +// converted back to float using: +// real_value = scale * (quantized_value - zero_point) +typedef struct TfLiteAffineQuantization { + TfLiteFloatArray *scale; + TfLiteIntArray *zero_point; + int32_t quantized_dimension; +} TfLiteAffineQuantization; + +/* A union of pointers that points to memory for a given tensor. */ +typedef union TfLitePtrUnion { + /* Do not access these members directly, if possible, use + * GetTensorData(tensor) instead, otherwise only access .data, as other + * members are deprecated. */ + int32_t *i32; + uint32_t *u32; + int64_t *i64; + uint64_t *u64; + float *f; + TfLiteFloat16 *f16; + double *f64; + char *raw; + const char *raw_const; + uint8_t *uint8; + bool *b; + int16_t *i16; + TfLiteComplex64 *c64; + TfLiteComplex128 *c128; + int8_t *int8; + /* Only use this member. */ + void *data; +} TfLitePtrUnion; + +// Memory allocation strategies. +// * kTfLiteMmapRo: Read-only memory-mapped data, or data externally allocated. +// * kTfLiteArenaRw: Arena allocated with no guarantees about persistence, +// and available during eval. +// * kTfLiteArenaRwPersistent: Arena allocated but persistent across eval, and +// only available during eval. +// * kTfLiteDynamic: Allocated during eval, or for string tensors. +// * kTfLitePersistentRo: Allocated and populated during prepare. This is +// useful for tensors that can be computed during prepare and treated +// as constant inputs for downstream ops (also in prepare). +// * kTfLiteCustom: Custom memory allocation provided by the user. See +// TfLiteCustomAllocation below. +typedef enum TfLiteAllocationType { + kTfLiteMemNone = 0, + kTfLiteMmapRo, + kTfLiteArenaRw, + kTfLiteArenaRwPersistent, + kTfLiteDynamic, + kTfLitePersistentRo, + kTfLiteCustom, +} TfLiteAllocationType; + +// The delegates should use zero or positive integers to represent handles. +// -1 is reserved from unallocated status. +typedef int TfLiteBufferHandle; +enum { + kTfLiteNullBufferHandle = -1, +}; + +// Storage format of each dimension in a sparse tensor. +typedef enum TfLiteDimensionType { + kTfLiteDimDense = 0, + kTfLiteDimSparseCSR, +} TfLiteDimensionType; + +// Metadata to encode each dimension in a sparse tensor. +typedef struct TfLiteDimensionMetadata { + TfLiteDimensionType format; + int dense_size; + TfLiteIntArray *array_segments; + TfLiteIntArray *array_indices; +} TfLiteDimensionMetadata; + +// Parameters used to encode a sparse tensor. For detailed explanation of each +// field please refer to lite/schema/schema.fbs. +typedef struct TfLiteSparsity { + TfLiteIntArray *traversal_order; + TfLiteIntArray *block_map; + TfLiteDimensionMetadata *dim_metadata; + int dim_metadata_size; +} TfLiteSparsity; + +// Defines a custom memory allocation not owned by the runtime. +// `data` should be aligned to kDefaultTensorAlignment defined in +// lite/util.h. (Currently 64 bytes) +// NOTE: See Interpreter.SetCustomAllocationForTensor for details on usage. +typedef struct TfLiteCustomAllocation { + void *data; + size_t bytes; +} TfLiteCustomAllocation; + +// The flags used in `Interpreter::SetCustomAllocationForTensor`. +// Note that this is a bitmask, so the values should be 1, 2, 4, 8, ...etc. +typedef enum TfLiteCustomAllocationFlags { + kTfLiteCustomAllocationFlagsNone = 0, + // Skips checking whether allocation.data points to an aligned buffer as + // expected by the TFLite runtime. + // NOTE: Setting this flag can cause crashes when calling Invoke(). + // Use with caution. + kTfLiteCustomAllocationFlagsSkipAlignCheck = 1, +} TfLiteCustomAllocationFlags; + +// A tensor in the interpreter system which is a wrapper around a buffer of +// data including a dimensionality (or NULL if not currently defined). +#ifndef TF_LITE_STATIC_MEMORY +typedef struct TfLiteTensor { + // The data type specification for data stored in `data`. This affects + // what member of `data` union should be used. + TfLiteType type; + // A union of data pointers. The appropriate type should be used for a typed + // tensor based on `type`. + TfLitePtrUnion data; + // A pointer to a structure representing the dimensionality interpretation + // that the buffer should have. NOTE: the product of elements of `dims` + // and the element datatype size should be equal to `bytes` below. + TfLiteIntArray *dims; + // Quantization information. + TfLiteQuantizationParams params; + // How memory is mapped + // kTfLiteMmapRo: Memory mapped read only. + // i.e. weights + // kTfLiteArenaRw: Arena allocated read write memory + // (i.e. temporaries, outputs). + TfLiteAllocationType allocation_type; + // The number of bytes required to store the data of this Tensor. I.e. + // (bytes of each element) * dims[0] * ... * dims[n-1]. For example, if + // type is kTfLiteFloat32 and dims = {3, 2} then + // bytes = sizeof(float) * 3 * 2 = 4 * 3 * 2 = 24. + size_t bytes; + + // An opaque pointer to a tflite::MMapAllocation + const void *allocation; + + // Null-terminated name of this tensor. + const char *name; + + // The delegate which knows how to handle `buffer_handle`. + // WARNING: This is an experimental interface that is subject to change. + struct TfLiteDelegate *delegate; + + // An integer buffer handle that can be handled by `delegate`. + // The value is valid only when delegate is not null. + // WARNING: This is an experimental interface that is subject to change. + TfLiteBufferHandle buffer_handle; + + // If the delegate uses its own buffer (e.g. GPU memory), the delegate is + // responsible to set data_is_stale to true. + // `delegate->CopyFromBufferHandle` can be called to copy the data from + // delegate buffer. + // WARNING: This is an // experimental interface that is subject to change. + bool data_is_stale; + + // True if the tensor is a variable. + bool is_variable; + + // Quantization information. Replaces params field above. + TfLiteQuantization quantization; + + // Parameters used to encode a sparse tensor. + // This is optional. The field is NULL if a tensor is dense. + // WARNING: This is an experimental interface that is subject to change. + TfLiteSparsity *sparsity; + + // Optional. Encodes shapes with unknown dimensions with -1. This field is + // only populated when unknown dimensions exist in a read-write tensor (i.e. + // an input or output tensor). (e.g. `dims` contains [1, 1, 1, 3] and + // `dims_signature` contains [1, -1, -1, 3]). + const TfLiteIntArray *dims_signature; +} TfLiteTensor; + +// A structure representing an instance of a node. +// This structure only exhibits the inputs, outputs, user defined data and some +// node properties (like statefulness), not other features like the type. +typedef struct TfLiteNode { + // Inputs to this node expressed as indices into the simulator's tensors. + TfLiteIntArray *inputs; + + // Outputs to this node expressed as indices into the simulator's tensors. + TfLiteIntArray *outputs; + + // intermediate tensors to this node expressed as indices into the simulator's + // tensors. + TfLiteIntArray *intermediates; + + // Temporary tensors uses during the computations. This usually contains no + // tensors, but ops are allowed to change that if they need scratch space of + // any sort. + TfLiteIntArray *temporaries; + + // Opaque data provided by the node implementer through `Registration.init`. + void *user_data; + + // Opaque data provided to the node if the node is a builtin. This is usually + // a structure defined in builtin_op_data.h + void *builtin_data; + + // Custom initial data. This is the opaque data provided in the flatbuffer. + // WARNING: This is an experimental interface that is subject to change. + const void *custom_initial_data; + int custom_initial_data_size; + + // The pointer to the delegate. This is non-null only when the node is + // created by calling `interpreter.ModifyGraphWithDelegate`. + // WARNING: This is an experimental interface that is subject to change. + struct TfLiteDelegate *delegate; + + // Whether this op might have side effect (e.g. stateful op). + bool might_have_side_effect; +} TfLiteNode; +#else // defined(TF_LITE_STATIC_MEMORY)? +// NOTE: This flag is opt-in only at compile time. +// +// Specific reduced TfLiteTensor struct for TF Micro runtime. This struct +// contains only the minimum fields required to initialize and prepare a micro +// inference graph. The fields in this struct have been ordered from +// largest-to-smallest for optimal struct sizeof. +// +// This struct does not use: +// - allocation +// - buffer_handle +// - data_is_stale +// - delegate +// - dims_signature +// - name +// - sparsity +typedef struct TfLiteTensor { + // TODO(b/155784997): Consider consolidating these quantization fields: + // Quantization information. Replaces params field above. + TfLiteQuantization quantization; + + // Quantization information. + TfLiteQuantizationParams params; + + // A union of data pointers. The appropriate type should be used for a typed + // tensor based on `type`. + TfLitePtrUnion data; + + // A pointer to a structure representing the dimensionality interpretation + // that the buffer should have. NOTE: the product of elements of `dims` + // and the element datatype size should be equal to `bytes` below. + TfLiteIntArray *dims; + + // The number of bytes required to store the data of this Tensor. I.e. + // (bytes of each element) * dims[0] * ... * dims[n-1]. For example, if + // type is kTfLiteFloat32 and dims = {3, 2} then + // bytes = sizeof(float) * 3 * 2 = 4 * 3 * 2 = 24. + size_t bytes; + + // The data type specification for data stored in `data`. This affects + // what member of `data` union should be used. + TfLiteType type; + + // How memory is mapped + // kTfLiteMmapRo: Memory mapped read only. + // i.e. weights + // kTfLiteArenaRw: Arena allocated read write memory + // (i.e. temporaries, outputs). + TfLiteAllocationType allocation_type; + + // True if the tensor is a variable. + bool is_variable; +} TfLiteTensor; + +// Specific reduced TfLiteNode struct for TF Micro runtime. This struct contains +// only the minimum fields required to represent a node. +// +// This struct does not use: +// - delegate +// - intermediates +// - temporaries +typedef struct TfLiteNode { + // Inputs to this node expressed as indices into the simulator's tensors. + TfLiteIntArray *inputs; + + // Outputs to this node expressed as indices into the simulator's tensors. + TfLiteIntArray *outputs; + + // Opaque data provided by the node implementer through `Registration.init`. + void *user_data; + + // Opaque data provided to the node if the node is a builtin. This is usually + // a structure defined in builtin_op_data.h + void *builtin_data; + + // Custom initial data. This is the opaque data provided in the flatbuffer. + // WARNING: This is an experimental interface that is subject to change. + const void *custom_initial_data; + int custom_initial_data_size; +} TfLiteNode; +#endif // TF_LITE_STATIC_MEMORY + +// Light-weight tensor struct for TF Micro runtime. Provides the minimal amount +// of information required for a kernel to run during TfLiteRegistration::Eval. +// TODO(b/160955687): Move this field into TF_LITE_STATIC_MEMORY when TFLM +// builds with this flag by default internally. +typedef struct TfLiteEvalTensor { + // A union of data pointers. The appropriate type should be used for a typed + // tensor based on `type`. + TfLitePtrUnion data; + + // A pointer to a structure representing the dimensionality interpretation + // that the buffer should have. + TfLiteIntArray *dims; + + // The data type specification for data stored in `data`. This affects + // what member of `data` union should be used. + TfLiteType type; +} TfLiteEvalTensor; + +#ifndef TF_LITE_STATIC_MEMORY +// Free data memory of tensor `t`. +void TfLiteTensorDataFree(TfLiteTensor *t); + +// Free quantization data. +void TfLiteQuantizationFree(TfLiteQuantization *quantization); + +// Free sparsity parameters. +void TfLiteSparsityFree(TfLiteSparsity *sparsity); + +// Free memory of tensor `t`. +void TfLiteTensorFree(TfLiteTensor *t); + +// Set all of a tensor's fields (and free any previously allocated data). +void TfLiteTensorReset(TfLiteType type, const char *name, TfLiteIntArray *dims, + TfLiteQuantizationParams quantization, char *buffer, + size_t size, TfLiteAllocationType allocation_type, + const void *allocation, bool is_variable, + TfLiteTensor *tensor); + +// Resize the allocated data of a (dynamic) tensor. Tensors with allocation +// types other than kTfLiteDynamic will be ignored. +void TfLiteTensorRealloc(size_t num_bytes, TfLiteTensor *tensor); +#endif // TF_LITE_STATIC_MEMORY + +// WARNING: This is an experimental interface that is subject to change. +// +// Currently, TfLiteDelegateParams has to be allocated in a way that it's +// trivially destructable. It will be stored as `builtin_data` field in +// `TfLiteNode` of the delegate node. +// +// See also the `CreateDelegateParams` function in `interpreter.cc` details. +typedef struct TfLiteDelegateParams { + struct TfLiteDelegate *delegate; + TfLiteIntArray *nodes_to_replace; + TfLiteIntArray *input_tensors; + TfLiteIntArray *output_tensors; +} TfLiteDelegateParams; + +typedef struct TfLiteContext { + // Number of tensors in the context. + size_t tensors_size; + + // The execution plan contains a list of the node indices in execution + // order. execution_plan->size is the current number of nodes. And, + // execution_plan->data[0] is the first node that needs to be run. + // TfLiteDelegates can traverse the current execution plan by iterating + // through each member of this array and using GetNodeAndRegistration() to + // access details about a node. i.e. + // + // TfLiteIntArray* execution_plan; + // TF_LITE_ENSURE_STATUS(context->GetExecutionPlan(context, &execution_plan)); + // for (int exec_index = 0; exec_index < execution_plan->size; exec_index++) { + // int node_index = execution_plan->data[exec_index]; + // TfLiteNode* node; + // TfLiteRegistration* reg; + // context->GetNodeAndRegistration(context, node_index, &node, ®); + // } + // Note: the memory pointed by '`*execution_plan` is OWNED by TfLite runtime. + // Future calls to GetExecutionPlan invalidates earlier outputs. The following + // code snippet shows the issue of such an invocation pattern. After calling + // CheckNode, subsequent access to `plan_1st` is undefined. + // + // void CheckNode(const TfLiteNode* node) { + // ... + // TfLiteIntArray* plan_2nd; + // TF_LITE_ENSURE_STATUS(context->GetExecutionPlan(context, &plan_2nd)); + // ... + // } + // + // TfLiteIntArray* plan_1st; + // TF_LITE_ENSURE_STATUS(context->GetExecutionPlan(context, &plan_1st)); + // for (int exec_index = 0; exec_index < plan_1st->size; exec_index++) { + // int node_index = plan_1st->data[exec_index]; + // TfLiteNode* node; + // TfLiteRegistration* reg; + // context->GetNodeAndRegistration(context, node_index, &node, ®); + // CheckNode(node); + // } + // + // WARNING: This is an experimental interface that is subject to change. + TfLiteStatus (*GetExecutionPlan)(struct TfLiteContext *context, + TfLiteIntArray **execution_plan); + + // An array of tensors in the interpreter context (of length `tensors_size`) + TfLiteTensor *tensors; + + // opaque full context ptr (an opaque c++ data structure) + void *impl_; + + // Request memory pointer be resized. Updates dimensions on the tensor. + // NOTE: ResizeTensor takes ownership of newSize. + TfLiteStatus (*ResizeTensor)(struct TfLiteContext *, TfLiteTensor *tensor, + TfLiteIntArray *new_size); + // Request that an error be reported with format string msg. + void (*ReportError)(struct TfLiteContext *, const char *msg, ...); + + // Add `tensors_to_add` tensors, preserving pre-existing Tensor entries. If + // non-null, the value pointed to by `first_new_tensor_index` will be set to + // the index of the first new tensor. + TfLiteStatus (*AddTensors)(struct TfLiteContext *, int tensors_to_add, + int *first_new_tensor_index); + + // Get a Tensor node by node_index. + // WARNING: This is an experimental interface that is subject to change. + TfLiteStatus (*GetNodeAndRegistration)( + struct TfLiteContext *, int node_index, TfLiteNode **node, + struct TfLiteRegistration **registration); + + // Replace ops with one or more stub delegate operations. This function + // does not take ownership of `nodes_to_replace`. + TfLiteStatus (*ReplaceNodeSubsetsWithDelegateKernels)( + struct TfLiteContext *, struct TfLiteRegistration registration, + const TfLiteIntArray *nodes_to_replace, struct TfLiteDelegate *delegate); + + // Number of threads that are recommended to subsystems like gemmlowp and + // eigen. + int recommended_num_threads; + + // Access external contexts by type. + // WARNING: This is an experimental interface that is subject to change. + TfLiteExternalContext *(*GetExternalContext)(struct TfLiteContext *, + TfLiteExternalContextType); + // Set the value of a external context. Does not take ownership of the + // pointer. + // WARNING: This is an experimental interface that is subject to change. + void (*SetExternalContext)(struct TfLiteContext *, TfLiteExternalContextType, + TfLiteExternalContext *); + + // Flag for allowing float16 precision for FP32 calculation. + // default: false. + // WARNING: This is an experimental API and subject to change. + bool allow_fp32_relax_to_fp16; + + // Pointer to the op-level profiler, if set; nullptr otherwise. + void *profiler; + + // Allocate persistent buffer which has the same life time as the interpreter. + // Returns nullptr on failure. + // The memory is allocated from heap for TFL, and from tail in TFLM. + // This method is only available in Init or Prepare stage. + // WARNING: This is an experimental interface that is subject to change. + void *(*AllocatePersistentBuffer)(struct TfLiteContext *ctx, size_t bytes); + + // Allocate a buffer which will be deallocated right after invoke phase. + // The memory is allocated from heap in TFL, and from volatile arena in TFLM. + // This method is only available in invoke stage. + // NOTE: If possible use RequestScratchBufferInArena method to avoid memory + // allocation during inference time. + // WARNING: This is an experimental interface that is subject to change. + TfLiteStatus (*AllocateBufferForEval)(struct TfLiteContext *ctx, size_t bytes, + void **ptr); + + // Request a scratch buffer in the arena through static memory planning. + // This method is only available in Prepare stage and the buffer is allocated + // by the interpreter between Prepare and Eval stage. In Eval stage, + // GetScratchBuffer API can be used to fetch the address. + // WARNING: This is an experimental interface that is subject to change. + TfLiteStatus (*RequestScratchBufferInArena)(struct TfLiteContext *ctx, + size_t bytes, int *buffer_idx); + + // Get the scratch buffer pointer. + // This method is only available in Eval stage. + // WARNING: This is an experimental interface that is subject to change. + void *(*GetScratchBuffer)(struct TfLiteContext *ctx, int buffer_idx); + + // Resize the memory pointer of the `tensor`. This method behaves the same as + // `ResizeTensor`, except that it makes a copy of the shape array internally + // so the shape array could be deallocated right afterwards. + // WARNING: This is an experimental interface that is subject to change. + TfLiteStatus (*ResizeTensorExplicit)(struct TfLiteContext *ctx, + TfLiteTensor *tensor, int dims, + const int *shape); + + // This method provides a preview of post-delegation partitioning. Each + // TfLiteDelegateParams in the referenced array corresponds to one instance of + // the delegate kernel. + // Example usage: + // + // TfLiteIntArray* nodes_to_replace = ...; + // TfLiteDelegateParams* params_array; + // int num_partitions = 0; + // TF_LITE_ENSURE_STATUS(context->PreviewDelegatePartitioning( + // context, delegate, nodes_to_replace, ¶ms_array, &num_partitions)); + // for (int idx = 0; idx < num_partitions; idx++) { + // const auto& partition_params = params_array[idx]; + // ... + // } + // + // NOTE: The context owns the memory referenced by partition_params_array. It + // will be cleared with another call to PreviewDelegateParitioning, or after + // TfLiteDelegateParams::Prepare returns. + // + // WARNING: This is an experimental interface that is subject to change. + TfLiteStatus (*PreviewDelegatePartitioning)( + struct TfLiteContext *context, const TfLiteIntArray *nodes_to_replace, + TfLiteDelegateParams **partition_params_array, int *num_partitions); + + // Returns a TfLiteTensor struct for a given index. + // WARNING: This is an experimental interface that is subject to change. + // WARNING: This method may not be available on all platforms. + TfLiteTensor *(*GetTensor)(const struct TfLiteContext *context, + int tensor_idx); + + // Returns a TfLiteEvalTensor struct for a given index. + // WARNING: This is an experimental interface that is subject to change. + // WARNING: This method may not be available on all platforms. + TfLiteEvalTensor *(*GetEvalTensor)(const struct TfLiteContext *context, + int tensor_idx); +} TfLiteContext; + +typedef struct TfLiteRegistration { + // Initializes the op from serialized data. + // If a built-in op: + // `buffer` is the op's params data (TfLiteLSTMParams*). + // `length` is zero. + // If custom op: + // `buffer` is the op's `custom_options`. + // `length` is the size of the buffer. + // + // Returns a type-punned (i.e. void*) opaque data (e.g. a primitive pointer + // or an instance of a struct). + // + // The returned pointer will be stored with the node in the `user_data` field, + // accessible within prepare and invoke functions below. + // NOTE: if the data is already in the desired format, simply implement this + // function to return `nullptr` and implement the free function to be a no-op. + void *(*init)(TfLiteContext *context, const char *buffer, size_t length); + + // The pointer `buffer` is the data previously returned by an init invocation. + void (*free)(TfLiteContext *context, void *buffer); + + // prepare is called when the inputs this node depends on have been resized. + // context->ResizeTensor() can be called to request output tensors to be + // resized. + // + // Returns kTfLiteOk on success. + TfLiteStatus (*prepare)(TfLiteContext *context, TfLiteNode *node); + + // Execute the node (should read node->inputs and output to node->outputs). + // Returns kTfLiteOk on success. + TfLiteStatus (*invoke)(TfLiteContext *context, TfLiteNode *node); + + // profiling_string is called during summarization of profiling information + // in order to group executions together. Providing a value here will cause a + // given op to appear multiple times is the profiling report. This is + // particularly useful for custom ops that can perform significantly + // different calculations depending on their `user-data`. + const char *(*profiling_string)(const TfLiteContext *context, + const TfLiteNode *node); + + // Builtin codes. If this kernel refers to a builtin this is the code + // of the builtin. This is so we can do marshaling to other frameworks like + // NN API. + // Note: It is the responsibility of the registration binder to set this + // properly. + int32_t builtin_code; + + // Custom op name. If the op is a builtin, this will be null. + // Note: It is the responsibility of the registration binder to set this + // properly. + // WARNING: This is an experimental interface that is subject to change. + const char *custom_name; + + // The version of the op. + // Note: It is the responsibility of the registration binder to set this + // properly. + int version; +} TfLiteRegistration; + +// The flags used in `TfLiteDelegate`. Note that this is a bitmask, so the +// values should be 1, 2, 4, 8, ...etc. +typedef enum TfLiteDelegateFlags { + kTfLiteDelegateFlagsNone = 0, + // The flag is set if the delegate can handle dynamic sized tensors. + // For example, the output shape of a `Resize` op with non-constant shape + // can only be inferred when the op is invoked. + // In this case, the Delegate is responsible for calling + // `SetTensorToDynamic` to mark the tensor as a dynamic tensor, and calling + // `ResizeTensor` when invoking the op. + // + // If the delegate isn't capable to handle dynamic tensors, this flag need + // to be set to false. + kTfLiteDelegateFlagsAllowDynamicTensors = 1, + + // This flag can be used by delegates (that allow dynamic tensors) to ensure + // applicable tensor shapes are automatically propagated in the case of tensor + // resizing. + // This means that non-dynamic (allocation_type != kTfLiteDynamic) I/O tensors + // of a delegate kernel will have correct shapes before its Prepare() method + // is called. The runtime leverages TFLite builtin ops in the original + // execution plan to propagate shapes. + // + // A few points to note: + // 1. This requires kTfLiteDelegateFlagsAllowDynamicTensors. If that flag is + // false, this one is redundant since the delegate kernels are re-initialized + // every time tensors are resized. + // 2. Enabling this flag adds some overhead to AllocateTensors(), since extra + // work is required to prepare the original execution plan. + // 3. This flag requires that the original execution plan only have ops with + // valid registrations (and not 'dummy' custom ops like with Flex). + // WARNING: This feature is experimental and subject to change. + kTfLiteDelegateFlagsRequirePropagatedShapes = 2 +} TfLiteDelegateFlags; + +// WARNING: This is an experimental interface that is subject to change. +typedef struct TfLiteDelegate { + // Data that delegate needs to identify itself. This data is owned by the + // delegate. The delegate is owned in the user code, so the delegate is + // responsible for doing this when it is destroyed. + void *data_; + + // Invoked by ModifyGraphWithDelegate. This prepare is called, giving the + // delegate a view of the current graph through TfLiteContext*. It typically + // will look at the nodes and call ReplaceNodeSubsetsWithDelegateKernels() + // to ask the TensorFlow lite runtime to create macro-nodes to represent + // delegated subgraphs of the original graph. + TfLiteStatus (*Prepare)(TfLiteContext *context, + struct TfLiteDelegate *delegate); + + // Copy the data from delegate buffer handle into raw memory of the given + // 'tensor'. Note that the delegate is allowed to allocate the raw bytes as + // long as it follows the rules for kTfLiteDynamic tensors, in which case this + // cannot be null. + TfLiteStatus (*CopyFromBufferHandle)(TfLiteContext *context, + struct TfLiteDelegate *delegate, + TfLiteBufferHandle buffer_handle, + TfLiteTensor *tensor); + + // Copy the data from raw memory of the given 'tensor' to delegate buffer + // handle. This can be null if the delegate doesn't use its own buffer. + TfLiteStatus (*CopyToBufferHandle)(TfLiteContext *context, + struct TfLiteDelegate *delegate, + TfLiteBufferHandle buffer_handle, + TfLiteTensor *tensor); + + // Free the Delegate Buffer Handle. Note: This only frees the handle, but + // this doesn't release the underlying resource (e.g. textures). The + // resources are either owned by application layer or the delegate. + // This can be null if the delegate doesn't use its own buffer. + void (*FreeBufferHandle)(TfLiteContext *context, + struct TfLiteDelegate *delegate, + TfLiteBufferHandle *handle); + + // Bitmask flags. See the comments in `TfLiteDelegateFlags`. + int64_t flags; +} TfLiteDelegate; + +// Build a 'null' delegate, with all the fields properly set to their default +// values. +TfLiteDelegate TfLiteDelegateCreate(void); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus +#endif // TENSORFLOW_LITE_C_COMMON_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.cc b/components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.cc new file mode 100644 index 00000000..f290d891 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.cc @@ -0,0 +1,40 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/core/api/error_reporter.h" +#include + +namespace tflite { + +int ErrorReporter::Report(const char *format, ...) +{ + va_list args; + va_start(args, format); + int code = Report(format, args); + va_end(args); + return code; +} + +// TODO(aselle): Make the name of ReportError on context the same, so +// we can use the ensure functions w/o a context and w/ a reporter. +int ErrorReporter::ReportError(void *, const char *format, ...) +{ + va_list args; + va_start(args, format); + int code = Report(format, args); + va_end(args); + return code; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.h b/components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.h new file mode 100644 index 00000000..c5371e55 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/error_reporter.h @@ -0,0 +1,60 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_CORE_API_ERROR_REPORTER_H_ +#define TENSORFLOW_LITE_CORE_API_ERROR_REPORTER_H_ + +#include + +namespace tflite { +/// A functor that reports error to supporting system. Invoked similar to +/// printf. +/// +/// Usage: +/// ErrorReporter foo; +/// foo.Report("test %d", 5); +/// or +/// va_list args; +/// foo.Report("test %d", args); // where args is va_list +/// +/// Subclass ErrorReporter to provide another reporting destination. +/// For example, if you have a GUI program, you might redirect to a buffer +/// that drives a GUI error log box. +class ErrorReporter { +public: + virtual ~ErrorReporter() + { + } + virtual int Report(const char *format, va_list args) = 0; + int Report(const char *format, ...); + int ReportError(void *, const char *format, ...); +}; + +} // namespace tflite + +// You should not make bare calls to the error reporter, instead use the +// TF_LITE_REPORT_ERROR macro, since this allows message strings to be +// stripped when the binary size has to be optimized. If you are looking to +// reduce binary size, define TF_LITE_STRIP_ERROR_STRINGS when compiling and +// every call will be stubbed out, taking no memory. +#ifndef TF_LITE_STRIP_ERROR_STRINGS +#define TF_LITE_REPORT_ERROR(reporter, ...) \ + do { \ + static_cast(reporter)->Report(__VA_ARGS__); \ + } while (false) +#else // TF_LITE_STRIP_ERROR_STRINGS +#define TF_LITE_REPORT_ERROR(reporter, ...) +#endif // TF_LITE_STRIP_ERROR_STRINGS + +#endif // TENSORFLOW_LITE_CORE_API_ERROR_REPORTER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.cc b/components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.cc new file mode 100644 index 00000000..e8511162 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.cc @@ -0,0 +1,2278 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" + +#include +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { + +namespace { + +// Utility class for safely allocating POD data. This is useful for avoiding +// leaks in cases where op params are allocated but fail to propagate to the +// parsed op data (e.g., when model parameters are invalid). +class SafeBuiltinDataAllocator { +public: + class BuiltinDataDeleter { + public: + explicit BuiltinDataDeleter(BuiltinDataAllocator *allocator) + : allocator_(allocator) + { + } + + void operator()(void *data) + { + allocator_->Deallocate(data); + } + + private: + BuiltinDataAllocator *allocator_; + }; + + template + using BuiltinDataPtr = std::unique_ptr; + + explicit SafeBuiltinDataAllocator(BuiltinDataAllocator *allocator) + : allocator_(allocator) + { + } + + template + BuiltinDataPtr Allocate() + { + return BuiltinDataPtr(allocator_->AllocatePOD(), + BuiltinDataDeleter(allocator_)); + } + +private: + BuiltinDataAllocator *allocator_; +}; + +// All the Parse functions take some pointers as params and this function has +// the common DCHECKs to catch if any of those are nullptr. +void CheckParsePointerParams(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + TFLITE_DCHECK(op != nullptr); + TFLITE_DCHECK(error_reporter != nullptr); + TFLITE_DCHECK(allocator != nullptr); + TFLITE_DCHECK(builtin_data != nullptr); +} + +// Copies the contents from the flatbuffer int vector `flatbuffer` into the +// int array `buffer`. `flat_vector` and `buffer` represent the same +// configuration operation for a given operation. +TfLiteStatus FlatBufferIntVectorToArray( + int max_size_of_buffer, const flatbuffers::Vector *flat_vector, + int *buffer, ErrorReporter *error_reporter, const char *op_name) +{ + if (!flat_vector) { + TF_LITE_REPORT_ERROR(error_reporter, + "Input array not provided for operation '%s'.\n", + op_name); + return kTfLiteError; + } else { + size_t num_dimensions = flat_vector->size(); + if (num_dimensions > max_size_of_buffer / sizeof(int)) { + TF_LITE_REPORT_ERROR( + error_reporter, + "Found too many dimensions in the input array of operation '%s'.\n", + op_name); + return kTfLiteError; + } else { + for (size_t i = 0; i < num_dimensions; ++i) { + buffer[i] = flat_vector->Get(i); + } + } + } + return kTfLiteOk; +} + +// Converts the flatbuffer activation to what is used at runtime. +TfLiteFusedActivation ConvertActivation(ActivationFunctionType activation) +{ + switch (activation) { + case ActivationFunctionType_NONE: + return kTfLiteActNone; + case ActivationFunctionType_RELU: + return kTfLiteActRelu; + case ActivationFunctionType_RELU_N1_TO_1: + return kTfLiteActReluN1To1; + case ActivationFunctionType_RELU6: + return kTfLiteActRelu6; + case ActivationFunctionType_TANH: + return kTfLiteActTanh; + case ActivationFunctionType_SIGN_BIT: + return kTfLiteActSignBit; + } + return kTfLiteActNone; +} + +// Converts the flatbuffer padding enum to what is used at runtime. +TfLitePadding ConvertPadding(Padding padding) +{ + switch (padding) { + case Padding_SAME: + return kTfLitePaddingSame; + case Padding_VALID: + return kTfLitePaddingValid; + } + return kTfLitePaddingUnknown; +} + +#ifndef TF_LITE_STATIC_MEMORY +TfLiteStatus ParseOpDataTfLite(const Operator *op, BuiltinOperator op_type, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + auto parseLSHProjectionType = [](LSHProjectionType type) { + switch (type) { + case LSHProjectionType_SPARSE: + return kTfLiteLshProjectionSparse; + case LSHProjectionType_DENSE: + return kTfLiteLshProjectionDense; + default: + return kTfLiteLshProjectionUnknown; + } + }; + auto parseCombinerType = [](CombinerType type) { + switch (type) { + case CombinerType_MEAN: + return kTfLiteCombinerTypeMean; + case CombinerType_SQRTN: + return kTfLiteCombinerTypeSqrtn; + case CombinerType_SUM: + default: + return kTfLiteCombinerTypeSum; + } + }; + + SafeBuiltinDataAllocator safe_allocator(allocator); + *builtin_data = nullptr; + switch (op_type) { + case BuiltinOperator_ABS: { + return ParseAbs(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_ADD: { + return ParseAdd(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_ADD_N: { + return ParseAddN(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_ARG_MAX: { + return ParseArgMax(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_ARG_MIN: { + return ParseArgMin(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_AVERAGE_POOL_2D: { + return ParsePool(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_BATCH_MATMUL: { + return ParseBatchMatMul(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_BATCH_TO_SPACE_ND: { + return ParseBatchToSpaceNd(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_CEIL: { + return ParseCeil(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_CONCATENATION: { + return ParseConcatenation(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_CONV_2D: { + return ParseConv2D(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_CUMSUM: { + return ParseCumsum(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_DEPTH_TO_SPACE: { + return ParseDepthToSpace(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_DEPTHWISE_CONV_2D: { + return ParseDepthwiseConv2D(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_DEQUANTIZE: { + return ParseDequantize(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_DIV: { + return ParseDiv(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_ELU: { + return ParseElu(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_EXP: { + return ParseExp(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_EXPAND_DIMS: { + return ParseExpandDims(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_FILL: { + return ParseFill(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_FLOOR: { + return ParseFloor(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_FLOOR_DIV: { + return ParseFloorDiv(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_FLOOR_MOD: { + return ParseFloorMod(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_FULLY_CONNECTED: { + return ParseFullyConnected(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_GATHER_ND: { + return ParseGatherNd(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_GREATER: { + return ParseGreater(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_GREATER_EQUAL: { + return ParseGreaterEqual(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_HARD_SWISH: { + return ParseHardSwish(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_L2_NORMALIZATION: { + return ParseL2Normalization(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_L2_POOL_2D: { + return ParsePool(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LEAKY_RELU: { + return ParseLeakyRelu(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LESS: { + return ParseLess(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LESS_EQUAL: { + return ParseLessEqual(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LOG: { + return ParseLog(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LOGICAL_AND: { + return ParseLogicalAnd(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LOGICAL_NOT: { + return ParseLogicalNot(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LOGICAL_OR: { + return ParseLogicalOr(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LOGISTIC: { + return ParseLogistic(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_LOG_SOFTMAX: { + return ParseLogSoftmax(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_MAXIMUM: { + return ParseMaximum(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_MAX_POOL_2D: { + return ParsePool(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_MEAN: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_MINIMUM: { + return ParseMinimum(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_MUL: { + return ParseMul(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_NEG: { + return ParseNeg(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_NOT_EQUAL: { + return ParseNotEqual(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_PACK: { + return ParsePack(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_PAD: { + return ParsePad(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_PADV2: { + return ParsePadV2(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_POW: { + return ParsePow(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_PRELU: { + return ParsePrelu(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_QUANTIZE: { + return ParseQuantize(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_REDUCE_ANY: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_REDUCE_ALL: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_REDUCE_MAX: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_REDUCE_MIN: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_REDUCE_PROD: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_RELU: { + return ParseRelu(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_RELU6: { + return ParseRelu6(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_RESHAPE: { + return ParseReshape(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_RESIZE_BILINEAR: { + return ParseResizeBilinear(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_RESIZE_NEAREST_NEIGHBOR: { + return ParseResizeNearestNeighbor(op, error_reporter, allocator, + builtin_data); + } + + case BuiltinOperator_ROUND: { + return ParseRound(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_RSQRT: { + return ParseRsqrt(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SHAPE: { + return ParseShape(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SIN: { + return ParseSin(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SOFTMAX: { + return ParseSoftmax(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SPACE_TO_BATCH_ND: { + return ParseSpaceToBatchNd(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SPACE_TO_DEPTH: { + return ParseSpaceToDepth(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SPLIT: { + return ParseSplit(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SPLIT_V: { + return ParseSplitV(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SQRT: { + return ParseSqrt(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SQUARE: { + return ParseSquare(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SQUEEZE: { + return ParseSqueeze(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_STRIDED_SLICE: { + return ParseStridedSlice(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SUB: { + return ParseSub(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SUM: { + return ParseReducer(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_SVDF: { + return ParseSvdf(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_TANH: { + return ParseTanh(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_TRANSPOSE_CONV: { + return ParseTransposeConv(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_UNPACK: { + return ParseUnpack(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_ZEROS_LIKE: { + return ParseZerosLike(op, error_reporter, allocator, builtin_data); + } + + case BuiltinOperator_CAST: { + return ParseCast(op, error_reporter, allocator, builtin_data); + } + case BuiltinOperator_LSH_PROJECTION: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *lshParams = + op->builtin_options_as_LSHProjectionOptions()) { + params->type = parseLSHProjectionType(lshParams->type()); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *sequence_rnn_params = + op->builtin_options_as_SequenceRNNOptions()) { + params->activation = + ConvertActivation(sequence_rnn_params->fused_activation_function()); + params->time_major = sequence_rnn_params->time_major(); + params->asymmetric_quantize_inputs = + sequence_rnn_params->asymmetric_quantize_inputs(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN: { + auto params = + safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *bidi_sequence_rnn_params = + op->builtin_options_as_BidirectionalSequenceRNNOptions()) { + params->activation = ConvertActivation( + bidi_sequence_rnn_params->fused_activation_function()); + params->time_major = bidi_sequence_rnn_params->time_major(); + params->merge_outputs = bidi_sequence_rnn_params->merge_outputs(); + params->asymmetric_quantize_inputs = + bidi_sequence_rnn_params->asymmetric_quantize_inputs(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_RNN: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *rnn_params = op->builtin_options_as_RNNOptions()) { + params->activation = + ConvertActivation(rnn_params->fused_activation_function()); + params->asymmetric_quantize_inputs = + rnn_params->asymmetric_quantize_inputs(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_EMBEDDING_LOOKUP_SPARSE: { + auto params = + safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *embedding_params = + op->builtin_options_as_EmbeddingLookupSparseOptions()) { + params->combiner = parseCombinerType(embedding_params->combiner()); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + + case BuiltinOperator_HASHTABLE_LOOKUP: + // no-op. + return kTfLiteOk; + + case BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *schema_params = + op->builtin_options_as_LocalResponseNormalizationOptions()) { + params->radius = schema_params->radius(); + params->bias = schema_params->bias(); + params->alpha = schema_params->alpha(); + params->beta = schema_params->beta(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_LSTM: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *lstm_params = op->builtin_options_as_LSTMOptions()) { + params->activation = + ConvertActivation(lstm_params->fused_activation_function()); + params->cell_clip = lstm_params->cell_clip(); + params->proj_clip = lstm_params->proj_clip(); + switch (lstm_params->kernel_type()) { + case LSTMKernelType_FULL: + params->kernel_type = kTfLiteLSTMFullKernel; + break; + case LSTMKernelType_BASIC: + params->kernel_type = kTfLiteLSTMBasicKernel; + break; + default: + TF_LITE_REPORT_ERROR(error_reporter, + "Unhandled LSTM kernel type: %d", + lstm_params->kernel_type()); + return kTfLiteError; + } + params->asymmetric_quantize_inputs = + lstm_params->asymmetric_quantize_inputs(); + } else { + TF_LITE_REPORT_ERROR(error_reporter, + "No valid LSTM builtin options exist"); + return kTfLiteError; + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM: { + auto params = + safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *seq_lstm_params = + op->builtin_options_as_UnidirectionalSequenceLSTMOptions()) { + params->activation = + ConvertActivation(seq_lstm_params->fused_activation_function()); + params->cell_clip = seq_lstm_params->cell_clip(); + params->proj_clip = seq_lstm_params->proj_clip(); + params->time_major = seq_lstm_params->time_major(); + params->asymmetric_quantize_inputs = + seq_lstm_params->asymmetric_quantize_inputs(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM: { + auto params = + safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *bidi_lstm_params = + op->builtin_options_as_BidirectionalSequenceLSTMOptions()) { + params->activation = + ConvertActivation(bidi_lstm_params->fused_activation_function()); + params->cell_clip = bidi_lstm_params->cell_clip(); + params->proj_clip = bidi_lstm_params->proj_clip(); + params->merge_outputs = bidi_lstm_params->merge_outputs(); + params->time_major = bidi_lstm_params->time_major(); + params->asymmetric_quantize_inputs = + bidi_lstm_params->asymmetric_quantize_inputs(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_SKIP_GRAM: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *skip_gram_params = + op->builtin_options_as_SkipGramOptions()) { + params->ngram_size = skip_gram_params->ngram_size(); + params->max_skip_size = skip_gram_params->max_skip_size(); + params->include_all_ngrams = skip_gram_params->include_all_ngrams(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + + case BuiltinOperator_GATHER: { + return ParseGather(op, error_reporter, allocator, builtin_data); + } + case BuiltinOperator_SPARSE_TO_DENSE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *sparse_to_dense_params = + op->builtin_options_as_SparseToDenseOptions()) { + params->validate_indices = sparse_to_dense_params->validate_indices(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_DELEGATE: { + TF_LITE_REPORT_ERROR(error_reporter, + "DELEGATE op shouldn't exist in model."); + return kTfLiteError; + } + case BuiltinOperator_FAKE_QUANT: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *schema_params = + op->builtin_options_as_FakeQuantOptions()) { + params->min = schema_params->min(); + params->max = schema_params->max(); + params->num_bits = schema_params->num_bits(); + params->narrow_range = schema_params->narrow_range(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_ONE_HOT: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *schema_params = op->builtin_options_as_OneHotOptions()) { + params->axis = schema_params->axis(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_MIRROR_PAD: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + const auto *mirror_pad_params = op->builtin_options_as_MirrorPadOptions(); + if (mirror_pad_params != nullptr) { + params->mode = + mirror_pad_params->mode() == tflite::MirrorPadMode_REFLECT ? TfLiteMirrorPaddingMode::kTfLiteMirrorPaddingReflect : TfLiteMirrorPaddingMode::kTfLiteMirrorPaddingSymmetric; + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_UNIQUE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + const auto *unique_params = op->builtin_options_as_UniqueOptions(); + if (unique_params != nullptr) { + params->index_out_type = + unique_params->idx_out_type() == tflite::TensorType_INT64 ? TfLiteType::kTfLiteInt64 : TfLiteType::kTfLiteInt32; + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_REVERSE_SEQUENCE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *reverse_seq_params = + op->builtin_options_as_ReverseSequenceOptions()) { + params->seq_dim = reverse_seq_params->seq_dim(); + params->batch_dim = reverse_seq_params->batch_dim(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_IF: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *if_params = op->builtin_options_as_IfOptions()) { + params->then_subgraph_index = if_params->then_subgraph_index(); + params->else_subgraph_index = if_params->else_subgraph_index(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_WHILE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *while_params = op->builtin_options_as_WhileOptions()) { + params->cond_subgraph_index = while_params->cond_subgraph_index(); + params->body_subgraph_index = while_params->body_subgraph_index(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_CALL_ONCE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *call_once_params = + op->builtin_options_as_CallOnceOptions()) { + params->init_subgraph_index = call_once_params->init_subgraph_index(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_CONV_3D: + case BuiltinOperator_CONV_3D_TRANSPOSE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *conv3d_params = op->builtin_options_as_Conv3DOptions()) { + params->padding = ConvertPadding(conv3d_params->padding()); + params->activation = + ConvertActivation(conv3d_params->fused_activation_function()); + params->stride_depth = conv3d_params->stride_d(); + params->stride_height = conv3d_params->stride_h(); + params->stride_width = conv3d_params->stride_w(); + params->dilation_depth_factor = conv3d_params->dilation_d_factor(); + params->dilation_height_factor = conv3d_params->dilation_h_factor(); + params->dilation_width_factor = conv3d_params->dilation_w_factor(); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + case BuiltinOperator_HASHTABLE: { + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *hashtable_params = + op->builtin_options_as_HashtableOptions()) { + params->table_id = hashtable_params->table_id(); + TF_LITE_ENSURE_STATUS(ConvertTensorType( + hashtable_params->key_dtype(), ¶ms->key_dtype, error_reporter)); + TF_LITE_ENSURE_STATUS(ConvertTensorType(hashtable_params->value_dtype(), + ¶ms->value_dtype, + error_reporter)); + } + *builtin_data = params.release(); + return kTfLiteOk; + } + // Below are the ops with no builtin_data structure. + // TODO(aselle): Implement call in BuiltinOptions, but nullptrs are + // ok for now, since there is no call implementation either. + case BuiltinOperator_CALL: + case BuiltinOperator_CONCAT_EMBEDDINGS: + case BuiltinOperator_COS: + case BuiltinOperator_CUSTOM: + case BuiltinOperator_EMBEDDING_LOOKUP: + case BuiltinOperator_EQUAL: + case BuiltinOperator_MATRIX_DIAG: + case BuiltinOperator_MATRIX_SET_DIAG: + case BuiltinOperator_RELU_N1_TO_1: + case BuiltinOperator_SELECT: + case BuiltinOperator_SELECT_V2: + case BuiltinOperator_SLICE: + case BuiltinOperator_TILE: + case BuiltinOperator_TOPK_V2: + case BuiltinOperator_TRANSPOSE: + case BuiltinOperator_RANGE: + case BuiltinOperator_SQUARED_DIFFERENCE: + case BuiltinOperator_REVERSE_V2: + case BuiltinOperator_WHERE: + case BuiltinOperator_RANK: + case BuiltinOperator_NON_MAX_SUPPRESSION_V4: + case BuiltinOperator_NON_MAX_SUPPRESSION_V5: + case BuiltinOperator_SCATTER_ND: + case BuiltinOperator_DENSIFY: + case BuiltinOperator_SEGMENT_SUM: + case BuiltinOperator_BROADCAST_TO: + case BuiltinOperator_RFFT2D: + case BuiltinOperator_IMAG: + case BuiltinOperator_REAL: + case BuiltinOperator_COMPLEX_ABS: + case BuiltinOperator_HASHTABLE_FIND: + case BuiltinOperator_HASHTABLE_IMPORT: + case BuiltinOperator_HASHTABLE_SIZE: + return kTfLiteOk; + case BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES: + return kTfLiteError; + } + return kTfLiteError; +} // NOLINT[readability/fn_size] +#endif // !defined(TF_LITE_STATIC_MEMORY) +} // namespace + +TfLiteStatus ConvertTensorType(TensorType tensor_type, TfLiteType *type, + ErrorReporter *error_reporter) +{ + switch (tensor_type) { + case TensorType_FLOAT16: + *type = kTfLiteFloat16; + return kTfLiteOk; + case TensorType_FLOAT32: + *type = kTfLiteFloat32; + return kTfLiteOk; + case TensorType_FLOAT64: + *type = kTfLiteFloat64; + return kTfLiteOk; + case TensorType_INT16: + *type = kTfLiteInt16; + return kTfLiteOk; + case TensorType_INT32: + *type = kTfLiteInt32; + return kTfLiteOk; + case TensorType_UINT32: + *type = kTfLiteUInt32; + return kTfLiteOk; + case TensorType_UINT8: + *type = kTfLiteUInt8; + return kTfLiteOk; + case TensorType_INT8: + *type = kTfLiteInt8; + return kTfLiteOk; + case TensorType_INT64: + *type = kTfLiteInt64; + return kTfLiteOk; + case TensorType_UINT64: + *type = kTfLiteUInt64; + return kTfLiteOk; + case TensorType_STRING: + *type = kTfLiteString; + return kTfLiteOk; + case TensorType_BOOL: + *type = kTfLiteBool; + return kTfLiteOk; + case TensorType_COMPLEX64: + *type = kTfLiteComplex64; + return kTfLiteOk; + case TensorType_COMPLEX128: + *type = kTfLiteComplex128; + return kTfLiteOk; + case TensorType_RESOURCE: + *type = kTfLiteResource; + return kTfLiteOk; + case TensorType_VARIANT: + *type = kTfLiteVariant; + return kTfLiteOk; + default: + *type = kTfLiteNoType; + TF_LITE_REPORT_ERROR(error_reporter, + "Unsupported data type %d in tensor\n", tensor_type); + return kTfLiteError; + } +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseAbs(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseAdd(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const AddOptions *schema_params = op->builtin_options_as_AddOptions(); + + if (schema_params != nullptr) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + params->pot_scale_int16 = schema_params->pot_scale_int16(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseAddN(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseArgMax(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ArgMaxOptions *schema_params = op->builtin_options_as_ArgMaxOptions(); + + if (schema_params != nullptr) { + TF_LITE_ENSURE_STATUS(ConvertTensorType( + schema_params->output_type(), ¶ms->output_type, error_reporter)); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseArgMin(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ArgMinOptions *schema_params = op->builtin_options_as_ArgMinOptions(); + + if (schema_params != nullptr) { + TF_LITE_ENSURE_STATUS(ConvertTensorType( + schema_params->output_type(), ¶ms->output_type, error_reporter)); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseBatchMatMul(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *bmm_params = op->builtin_options_as_BatchMatMulOptions()) { + params->adj_x = bmm_params->adj_x(); + params->adj_y = bmm_params->adj_y(); + params->asymmetric_quantize_inputs = + bmm_params->asymmetric_quantize_inputs(); + } + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseBatchToSpaceNd(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseCast(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *schema_params = op->builtin_options_as_CastOptions()) { + TF_LITE_ENSURE_STATUS(ConvertTensorType( + schema_params->in_data_type(), ¶ms->in_data_type, error_reporter)); + TF_LITE_ENSURE_STATUS(ConvertTensorType(schema_params->out_data_type(), + ¶ms->out_data_type, + error_reporter)); + } + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseCeil(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseConcatenation(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ConcatenationOptions *schema_params = + op->builtin_options_as_ConcatenationOptions(); + + if (schema_params != nullptr) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + params->axis = schema_params->axis(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseConv2D(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const Conv2DOptions *schema_params = op->builtin_options_as_Conv2DOptions(); + + if (schema_params != nullptr) { + params->padding = ConvertPadding(schema_params->padding()); + params->stride_width = schema_params->stride_w(); + params->stride_height = schema_params->stride_h(); + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + + params->dilation_width_factor = schema_params->dilation_w_factor(); + params->dilation_height_factor = schema_params->dilation_h_factor(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseCumsum(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *cumsum_params = op->builtin_options_as_CumsumOptions()) { + params->exclusive = cumsum_params->exclusive(); + params->reverse = cumsum_params->reverse(); + } + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseCos(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseDepthToSpace(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const auto *schema_params = op->builtin_options_as_DepthToSpaceOptions(); + if (schema_params != nullptr) { + params->block_size = schema_params->block_size(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseDepthwiseConv2D(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const DepthwiseConv2DOptions *schema_params = + op->builtin_options_as_DepthwiseConv2DOptions(); + + if (schema_params != nullptr) { + params->padding = ConvertPadding(schema_params->padding()); + params->stride_width = schema_params->stride_w(); + params->stride_height = schema_params->stride_h(); + params->depth_multiplier = schema_params->depth_multiplier(); + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + + params->dilation_width_factor = schema_params->dilation_w_factor(); + params->dilation_height_factor = schema_params->dilation_h_factor(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseDequantize(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseDiv(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *schema_params = op->builtin_options_as_DivOptions()) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + } + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseElu(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseEqual(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseExp(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseExpandDims(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseFill(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseFloor(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseFloorDiv(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseFloorMod(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseFullyConnected(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const FullyConnectedOptions *schema_params = + op->builtin_options_as_FullyConnectedOptions(); + + if (schema_params != nullptr) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + params->keep_num_dims = schema_params->keep_num_dims(); + params->asymmetric_quantize_inputs = + schema_params->asymmetric_quantize_inputs(); + + switch (schema_params->weights_format()) { + case FullyConnectedOptionsWeightsFormat_DEFAULT: + params->weights_format = kTfLiteFullyConnectedWeightsFormatDefault; + break; + case FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8: + params->weights_format = + kTfLiteFullyConnectedWeightsFormatShuffled4x16Int8; + break; + default: + TF_LITE_REPORT_ERROR(error_reporter, + "Unhandled fully-connected weights format."); + return kTfLiteError; + } + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseGather(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + params->axis = 0; + params->batch_dims = 0; + if (const auto *gather_params = op->builtin_options_as_GatherOptions()) { + params->axis = gather_params->axis(); + params->batch_dims = gather_params->batch_dims(); + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseGatherNd(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseGreater(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseGreaterEqual(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseHardSwish(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseIf(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const IfOptions *schema_params = op->builtin_options_as_IfOptions(); + + if (schema_params != nullptr) { + params->then_subgraph_index = schema_params->then_subgraph_index(); + params->else_subgraph_index = schema_params->else_subgraph_index(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseL2Normalization(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const L2NormOptions *schema_params = op->builtin_options_as_L2NormOptions(); + + if (schema_params != nullptr) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseLeakyRelu(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + auto params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + if (const auto *leaky_relu_params = + op->builtin_options_as_LeakyReluOptions()) { + params->alpha = leaky_relu_params->alpha(); + } + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLess(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLessEqual(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLog(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLogicalAnd(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLogicalNot(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLogicalOr(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLogistic(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseLogSoftmax(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseMaximum(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseMinimum(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseMul(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const MulOptions *schema_params = op->builtin_options_as_MulOptions(); + + if (schema_params != nullptr) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseNeg(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseNotEqual(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParsePack(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const PackOptions *schema_params = op->builtin_options_as_PackOptions(); + + if (schema_params != nullptr) { + params->values_count = schema_params->values_count(); + params->axis = schema_params->axis(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParsePad(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParsePadV2(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParsePool(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const Pool2DOptions *schema_params = op->builtin_options_as_Pool2DOptions(); + + if (schema_params != nullptr) { + params->padding = ConvertPadding(schema_params->padding()); + params->stride_width = schema_params->stride_w(); + params->stride_height = schema_params->stride_h(); + params->filter_width = schema_params->filter_width(); + params->filter_height = schema_params->filter_height(); + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParsePow(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParsePrelu(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseQuantize(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseReducer(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ReducerOptions *schema_params = op->builtin_options_as_ReducerOptions(); + + if (schema_params != nullptr) { + params->keep_dims = schema_params->keep_dims(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseRelu(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseRelu6(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseReshape(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ReshapeOptions *schema_params = op->builtin_options_as_ReshapeOptions(); + + if (schema_params != nullptr) { + const flatbuffers::Vector *new_shape = schema_params->new_shape(); + if (new_shape != nullptr) { + TF_LITE_ENSURE_STATUS( + FlatBufferIntVectorToArray(sizeof(params->shape), new_shape, + params->shape, error_reporter, "reshape")); + params->num_dimensions = new_shape->size(); + } else { + // TODO(b/157480169) TODO(b/147203660): We should either return + // kTfLiteError or fill in some reasonable defaults in the params struct. + // We are not doing so until we better undertand the ramifications of + // changing the legacy behavior. + } + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseResizeBilinear(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ResizeBilinearOptions *schema_params = + op->builtin_options_as_ResizeBilinearOptions(); + + if (schema_params != nullptr) { + params->align_corners = schema_params->align_corners(); + params->half_pixel_centers = schema_params->half_pixel_centers(); + } else { + params->align_corners = false; + params->half_pixel_centers = false; + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseResizeNearestNeighbor(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ResizeNearestNeighborOptions *schema_params = + op->builtin_options_as_ResizeNearestNeighborOptions(); + + if (schema_params != nullptr) { + params->align_corners = schema_params->align_corners(); + params->half_pixel_centers = schema_params->half_pixel_centers(); + } else { + params->align_corners = false; + params->half_pixel_centers = false; + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseRound(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseRsqrt(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseShape(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const ShapeOptions *schema_params = op->builtin_options_as_ShapeOptions(); + + if (schema_params != nullptr) { + TF_LITE_ENSURE_STATUS(ConvertTensorType(schema_params->out_type(), + ¶ms->out_type, error_reporter)); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseSin(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseSoftmax(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const SoftmaxOptions *schema_params = op->builtin_options_as_SoftmaxOptions(); + + if (schema_params != nullptr) { + params->beta = schema_params->beta(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseSpaceToBatchNd(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseSpaceToDepth(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const auto *schema_params = op->builtin_options_as_SpaceToDepthOptions(); + if (schema_params != nullptr) { + params->block_size = schema_params->block_size(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseSplit(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const SplitOptions *schema_params = op->builtin_options_as_SplitOptions(); + + if (schema_params != nullptr) { + params->num_splits = schema_params->num_splits(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseSplitV(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + SafeBuiltinDataAllocator safe_allocator(allocator); + + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const SplitVOptions *schema_params = op->builtin_options_as_SplitVOptions(); + + if (schema_params != nullptr) { + params->num_splits = schema_params->num_splits(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseSqueeze(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + SafeBuiltinDataAllocator safe_allocator(allocator); + + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const SqueezeOptions *schema_params = op->builtin_options_as_SqueezeOptions(); + + if (schema_params != nullptr) { + const auto *squeeze_dims = schema_params->squeeze_dims(); + if (squeeze_dims != nullptr) { + TF_LITE_ENSURE_STATUS(FlatBufferIntVectorToArray( + sizeof(params->squeeze_dims), squeeze_dims, params->squeeze_dims, + error_reporter, "squeeze")); + params->num_squeeze_dims = squeeze_dims->size(); + } else { + params->num_squeeze_dims = 0; + } + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseSqrt(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseSquare(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseStridedSlice(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const StridedSliceOptions *schema_params = + op->builtin_options_as_StridedSliceOptions(); + + if (schema_params != nullptr) { + params->begin_mask = schema_params->begin_mask(); + params->end_mask = schema_params->end_mask(); + params->ellipsis_mask = schema_params->ellipsis_mask(); + params->new_axis_mask = schema_params->new_axis_mask(); + params->shrink_axis_mask = schema_params->shrink_axis_mask(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseSub(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const SubOptions *schema_params = op->builtin_options_as_SubOptions(); + + if (schema_params != nullptr) { + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + params->pot_scale_int16 = schema_params->pot_scale_int16(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseSvdf(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const SVDFOptions *schema_params = op->builtin_options_as_SVDFOptions(); + if (schema_params != nullptr) { + params->rank = schema_params->rank(); + params->activation = + ConvertActivation(schema_params->fused_activation_function()); + params->asymmetric_quantize_inputs = + schema_params->asymmetric_quantize_inputs(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseTanh(const Operator *, ErrorReporter *, BuiltinDataAllocator *, + void **) +{ + return kTfLiteOk; +} +// +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseTranspose(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseTransposeConv(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + const TransposeConvOptions *transpose_conv_params = + op->builtin_options_as_TransposeConvOptions(); + if (transpose_conv_params != nullptr) { + params->padding = ConvertPadding(transpose_conv_params->padding()); + params->stride_width = transpose_conv_params->stride_w(); + params->stride_height = transpose_conv_params->stride_h(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + *builtin_data = params.release(); + return kTfLiteOk; +} + +TfLiteStatus ParseUnpack(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ + CheckParsePointerParams(op, error_reporter, allocator, builtin_data); + + SafeBuiltinDataAllocator safe_allocator(allocator); + std::unique_ptr + params = safe_allocator.Allocate(); + TF_LITE_ENSURE(error_reporter, params != nullptr); + + const UnpackOptions *schema_params = op->builtin_options_as_UnpackOptions(); + + if (schema_params != nullptr) { + params->num = schema_params->num(); + params->axis = schema_params->axis(); + } else { + // TODO(b/157480169): We should either return kTfLiteError or fill in some + // reasonable defaults in the params struct. We are not doing so until we + // better undertand the ramifications of changing the legacy behavior. + } + + *builtin_data = params.release(); + return kTfLiteOk; +} + +// We have this parse function instead of directly returning kTfLiteOk from the +// switch-case in ParseOpData because this function is used as part of the +// selective registration for the OpResolver implementation in micro. +TfLiteStatus ParseZerosLike(const Operator *, ErrorReporter *, + BuiltinDataAllocator *, void **) +{ + return kTfLiteOk; +} + +TfLiteStatus ParseOpData(const Operator *op, BuiltinOperator op_type, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data) +{ +// TODO(b/145762662): It would be preferable to have the build graph for TF Lite +// Micro not have the ParseOpData function at all. This would require splitting +// the current file into two separate files, one of which defines the +// ParseOpData function and the other that defines the operator specific parse +// functions (e.g. ParseAdd). +// +// Such a split was attempted but was not worth the effort at the time because +// of the following reasons: +// * We could either duplicate the functions and the SafeBuiltinDataAllocator +// class in the anonymous namespace of this file, or attempt to make a common +// library with these helper functions and class. +// * Making a common library with a separate build target was not feasible as +// it introduced circular dependencies due to the ErrorReporter and a common +// .cc and .h within the same api build target the also cause circular +// dependencies due to the BuiltinDataAllocator class. +// * If all the builtin operators were to have their own parse functions, or we +// were ok with some amount of code duplication, then this split of the .cc +// files would be a lot more feasible. +#ifdef TF_LITE_STATIC_MEMORY + TF_LITE_REPORT_ERROR( + error_reporter, + "ParseOpData is unsupported on TfLiteMicro, please use the operator " + "specific parse functions (e.g. ParseAdd etc.).\n"); + return kTfLiteError; +#else + return ParseOpDataTfLite(op, op_type, error_reporter, allocator, + builtin_data); +#endif +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.h b/components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.h new file mode 100644 index 00000000..8136080d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/flatbuffer_conversions.h @@ -0,0 +1,360 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_CORE_API_FLATBUFFER_CONVERSIONS_H_ +#define TENSORFLOW_LITE_CORE_API_FLATBUFFER_CONVERSIONS_H_ + +// These functions transform codes and data structures that are defined in the +// flatbuffer serialization format into in-memory values that are used by the +// runtime API and interpreter. + +#include +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +// Interface class for builtin data allocations. +class BuiltinDataAllocator { +public: + virtual void *Allocate(size_t size, size_t alignment_hint) = 0; + virtual void Deallocate(void *data) = 0; + + // Allocate a structure, but make sure it is a POD structure that doesn't + // require constructors to run. The reason we do this, is that Interpreter's C + // extension part will take ownership so destructors will not be run during + // deallocation. + template + T *AllocatePOD() + { + // TODO(b/154346074): Change this to is_trivially_destructible when all + // platform targets support that properly. + static_assert(std::is_pod::value, "Builtin data structure must be POD."); + void *allocated_memory = this->Allocate(sizeof(T), alignof(T)); + return new (allocated_memory) T(); + } + + virtual ~BuiltinDataAllocator() + { + } +}; + +// Parse the appropriate data out of the op. +// +// This handles builtin data explicitly as there are flatbuffer schemas. +// If it returns kTfLiteOk, it passes the data out with `builtin_data`. The +// calling function has to pass in an allocator object, and this allocator +// will be called to reserve space for the output data. If the calling +// function's allocator reserves memory on the heap, then it's the calling +// function's responsibility to free it. +// If it returns kTfLiteError, `builtin_data` will be `nullptr`. +TfLiteStatus ParseOpData(const Operator *op, BuiltinOperator op_type, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +// Converts the tensor data type used in the flat buffer to the representation +// used by the runtime. +TfLiteStatus ConvertTensorType(TensorType tensor_type, TfLiteType *type, + ErrorReporter *error_reporter); + +TfLiteStatus ParseAbs(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseAdd(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseAddN(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseArgMax(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseArgMin(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseBatchMatMul(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseBatchToSpaceNd(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseCeil(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseCast(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseConcatenation(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseConv2D(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseCos(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseCumsum(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseDepthToSpace(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseDepthwiseConv2D(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseDequantize(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseDiv(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseElu(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseEqual(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseExp(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseExpandDims(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseFill(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseFloor(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseFloorDiv(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseFloorMod(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseFullyConnected(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseGather(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseGatherNd(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseGreater(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseGreaterEqual(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseHardSwish(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseIf(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseL2Normalization(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLeakyRelu(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLess(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseLessEqual(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLog(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseLogicalAnd(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLogicalNot(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLogicalOr(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLogistic(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseLogSoftmax(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseMaximum(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseMinimum(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseMul(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseNeg(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseNotEqual(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParsePack(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParsePad(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParsePadV2(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParsePool(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParsePow(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParsePrelu(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseQuantize(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseReducer(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseRelu(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseRelu6(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseReshape(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseResizeBilinear(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseResizeNearestNeighbor(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseRound(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseRsqrt(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseShape(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSin(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSoftmax(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSpaceToBatchNd(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseSpaceToDepth(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseSplit(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSplitV(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSqueeze(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSqrt(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSquare(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseStridedSlice(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseSub(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseSvdf(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseTanh(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseTranspose(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseTransposeConv(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +TfLiteStatus ParseUnpack(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, void **builtin_data); + +TfLiteStatus ParseZerosLike(const Operator *op, ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_CORE_API_FLATBUFFER_CONVERSIONS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.cc b/components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.cc new file mode 100644 index 00000000..363848bd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.cc @@ -0,0 +1,70 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/core/api/op_resolver.h" + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/schema/schema_utils.h" + +namespace tflite { + +TfLiteStatus GetRegistrationFromOpCode( + const OperatorCode *opcode, const OpResolver &op_resolver, + ErrorReporter *error_reporter, const TfLiteRegistration **registration) +{ + TfLiteStatus status = kTfLiteOk; + *registration = nullptr; + auto builtin_code = GetBuiltinCode(opcode); + int version = opcode->version(); + + if (builtin_code > BuiltinOperator_MAX || + builtin_code < BuiltinOperator_MIN) { + TF_LITE_REPORT_ERROR( + error_reporter, + "Op builtin_code out of range: %d. Are you using old TFLite binary " + "with newer model?", + builtin_code); + status = kTfLiteError; + } else if (builtin_code != BuiltinOperator_CUSTOM) { + *registration = op_resolver.FindOp(builtin_code, version); + if (*registration == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter, + "Didn't find op for builtin opcode '%s' version '%d'. " + "An older version of this builtin might be supported. " + "Are you using an old TFLite binary with a newer model?\n", + EnumNameBuiltinOperator(builtin_code), version); + status = kTfLiteError; + } + } else if (!opcode->custom_code()) { + TF_LITE_REPORT_ERROR( + error_reporter, + "Operator with CUSTOM builtin_code has no custom_code.\n"); + status = kTfLiteError; + } else { + const char *name = opcode->custom_code()->c_str(); + *registration = op_resolver.FindOp(name, version); + if (*registration == nullptr) { + // Do not report error for unresolved custom op, we do the final check + // while preparing ops. + status = kTfLiteError; + } + } + return status; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.h b/components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.h new file mode 100644 index 00000000..85cfdccb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/op_resolver.h @@ -0,0 +1,82 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_CORE_API_OP_RESOLVER_H_ +#define TENSORFLOW_LITE_CORE_API_OP_RESOLVER_H_ + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +/// Abstract interface that returns TfLiteRegistrations given op codes or custom +/// op names. This is the mechanism that ops being referenced in the flatbuffer +/// model are mapped to executable function pointers (TfLiteRegistrations). +class OpResolver { +public: + /// Finds the op registration for a builtin operator by enum code. + virtual const TfLiteRegistration *FindOp(tflite::BuiltinOperator op, + int version) const = 0; + /// Finds the op registration of a custom operator by op name. + virtual const TfLiteRegistration *FindOp(const char *op, + int version) const = 0; + + // Returns optional delegates for resolving and handling ops in the flatbuffer + // model. This may be used in addition to the standard TfLiteRegistration + // lookup for graph resolution. + using TfLiteDelegatePtrVector = + std::vector >; + virtual TfLiteDelegatePtrVector GetDelegates(int num_threads) const + { + return TfLiteDelegatePtrVector(); + } + + virtual ~OpResolver() + { + } + +private: + /// Returns true if this OpResolver may contain any "user defined" ops. + /// By "user defined" ops, we mean any op definitions other than those + /// contained in tflite::ops::builtin::BuiltinOpResolver. + /// + /// If this method returns true, it doesn't necessarily mean that the + /// OpResolver contains a user-defined op, just that the absence of + /// user-defined ops can't be guaranteed. + /// + /// Note that "user-defined" ops are not the same as "custom" ops; + /// BuiltinOpResolver may support certain "custom" ops, in addition to + /// "builtin" ops, and may not support all of the "builtin" op enum values. + virtual bool MayContainUserDefinedOps() const + { + return true; + } + + friend class OpResolverInternal; +}; + +// Handles the logic for converting between an OperatorCode structure extracted +// from a flatbuffer and information about a registered operator +// implementation. +TfLiteStatus GetRegistrationFromOpCode(const OperatorCode *opcode, + const OpResolver &op_resolver, + ErrorReporter *error_reporter, + const TfLiteRegistration **registration); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_CORE_API_OP_RESOLVER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.cc b/components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.cc new file mode 100644 index 00000000..30259ba4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.cc @@ -0,0 +1,51 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/core/api/tensor_utils.h" + +#include + +#include "tensorflow/lite/c/common.h" + +namespace tflite { + +TfLiteStatus ResetVariableTensor(TfLiteTensor *tensor) +{ + if (!tensor->is_variable) { + return kTfLiteOk; + } + // TODO(b/115961645): Implement - If a variable tensor has a buffer, reset it + // to the value of the buffer. + int value = 0; + if (tensor->type == kTfLiteInt8) { + value = tensor->params.zero_point; + } + // TODO(b/139446230): Provide a platform header to better handle these + // specific scenarios. +#if __ANDROID__ || defined(__x86_64__) || defined(__i386__) || \ + defined(__i386) || defined(__x86__) || defined(__X86__) || \ + defined(_X86_) || defined(_M_IX86) || defined(_M_X64) + memset(tensor->data.raw, value, tensor->bytes); +#else + char *raw_ptr = tensor->data.raw; + for (size_t i = 0; i < tensor->bytes; ++i) { + *raw_ptr = value; + raw_ptr++; + } +#endif + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.h b/components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.h new file mode 100644 index 00000000..a57acce2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/core/api/tensor_utils.h @@ -0,0 +1,27 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_CORE_API_TENSOR_UTILS_H_ +#define TENSORFLOW_LITE_CORE_API_TENSOR_UTILS_H_ + +#include "tensorflow/lite/c/common.h" + +namespace tflite { +// Resets a variable tensor to the default value. +TfLiteStatus ResetVariableTensor(TfLiteTensor *tensor); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_CORE_API_TENSOR_UTILS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/README.md b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/README.md new file mode 100644 index 00000000..1362ddb2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/README.md @@ -0,0 +1,6 @@ +This directory contains the subset of functionality that is needed to run the +micro_speech example with TFLM. + +The source of truth for the experimental microfrontend in TfLite is at: +https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/experimental/microfrontend + diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/README.md b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/README.md new file mode 100644 index 00000000..ba5e82c4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/README.md @@ -0,0 +1,65 @@ +# Audio "frontend" library for feature generation + +A feature generation library (also called frontend) that receives raw audio +input, and produces filter banks (a vector of values). + +The raw audio input is expected to be 16-bit PCM features, with a configurable +sample rate. More specifically the audio signal goes through a pre-emphasis +filter (optionally); then gets sliced into (potentially overlapping) frames and +a window function is applied to each frame; afterwards, we do a Fourier +transform on each frame (or more specifically a Short-Time Fourier Transform) +and calculate the power spectrum; and subsequently compute the filter banks. + +By default the library is configured with a set of defaults to perform the +different processing tasks. This takes place with the frontend_util.c function: + +```c++ +void FrontendFillConfigWithDefaults(struct FrontendConfig* config) +``` + +A single invocation looks like: + +```c++ +struct FrontendConfig frontend_config; +FrontendFillConfigWithDefaults(&frontend_config); +int sample_rate = 16000; +FrontendPopulateState(&frontend_config, &frontend_state, sample_rate); +int16_t* audio_data = ; // PCM audio samples at 16KHz. +size_t audio_size = ; // Number of audio samples. +size_t num_samples_read; // How many samples were processed. +struct FrontendOutput output = + FrontendProcessSamples( + &frontend_state, audio_data, audio_size, &num_samples_read); +for (i = 0; i < output.size; ++i) { + printf("%d ", output.values[i]); // Print the feature vector. +} +``` + +Something to note in the above example is that the frontend consumes as many +samples needed from the audio data to produce a single feature vector (according +to the frontend configuration). If not enough samples were available to generate +a feature vector, the returned size will be 0 and the values pointer will be +`NULL`. + +An example of how to use the frontend is provided in frontend_main.cc and its +binary frontend_main. This example, expects a path to a file containing `int16` +PCM features at a sample rate of 16KHz, and upon execution will printing out +the coefficients according to the frontend default configuration. + +## Extra features +Extra features of this frontend library include a noise reduction module, as +well as a gain control module. + +**Noise cancellation**. Removes stationary noise from each channel of the signal +using a low pass filter. + +**Gain control**. A novel automatic gain control based dynamic compression to +replace the widely used static (such as log or root) compression. Disabled +by default. + +## Memory map +The binary frontend_memmap_main shows a sample usage of how to avoid all the +initialization code in your application, by first running +"frontend_generate_memmap" to create a header/source file that uses a baked in +frontend state. This command could be automated as part of your build process, +or you can just use the output directly. diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/bits.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/bits.h new file mode 100644 index 00000000..2b74286c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/bits.h @@ -0,0 +1,115 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_BITS_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_BITS_H_ + +#ifdef __cplusplus +#include + +extern "C" { +#endif + +static inline int CountLeadingZeros32Slow(uint64_t n) +{ + int zeroes = 28; + if (n >> 16) + zeroes -= 16, n >>= 16; + if (n >> 8) + zeroes -= 8, n >>= 8; + if (n >> 4) + zeroes -= 4, n >>= 4; + return "\4\3\2\2\1\1\1\1\0\0\0\0\0\0\0"[n] + zeroes; +} + +static inline int CountLeadingZeros32(uint32_t n) +{ +#if defined(_MSC_VER) + unsigned long result = 0; // NOLINT(runtime/int) + if (_BitScanReverse(&result, n)) { + return 31 - result; + } + return 32; +#elif defined(__GNUC__) + + // Handle 0 as a special case because __builtin_clz(0) is undefined. + if (n == 0) { + return 32; + } + return __builtin_clz(n); +#else + return CountLeadingZeros32Slow(n); +#endif +} + +static inline int MostSignificantBit32(uint32_t n) +{ + return 32 - CountLeadingZeros32(n); +} + +static inline int CountLeadingZeros64Slow(uint64_t n) +{ + int zeroes = 60; + if (n >> 32) + zeroes -= 32, n >>= 32; + if (n >> 16) + zeroes -= 16, n >>= 16; + if (n >> 8) + zeroes -= 8, n >>= 8; + if (n >> 4) + zeroes -= 4, n >>= 4; + return "\4\3\2\2\1\1\1\1\0\0\0\0\0\0\0"[n] + zeroes; +} + +static inline int CountLeadingZeros64(uint64_t n) +{ +#if defined(_MSC_VER) && defined(_M_X64) + // MSVC does not have __builtin_clzll. Use _BitScanReverse64. + unsigned long result = 0; // NOLINT(runtime/int) + if (_BitScanReverse64(&result, n)) { + return 63 - result; + } + return 64; +#elif defined(_MSC_VER) + // MSVC does not have __builtin_clzll. Compose two calls to _BitScanReverse + unsigned long result = 0; // NOLINT(runtime/int) + if ((n >> 32) && _BitScanReverse(&result, n >> 32)) { + return 31 - result; + } + if (_BitScanReverse(&result, n)) { + return 63 - result; + } + return 64; +#elif defined(__GNUC__) + + // Handle 0 as a special case because __builtin_clzll(0) is undefined. + if (n == 0) { + return 64; + } + return __builtin_clzll(n); +#else + return CountLeadingZeros64Slow(n); +#endif +} + +static inline int MostSignificantBit64(uint64_t n) +{ + return 64 - CountLeadingZeros64(n); +} + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_BITS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.cc new file mode 100644 index 00000000..4312abff --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.cc @@ -0,0 +1,56 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/fft.h" + +#include + +#define FIXED_POINT 16 +#include "kiss_fft.h" +#include "tools/kiss_fftr.h" + +void FftCompute(struct FftState *state, const int16_t *input, + int input_scale_shift) +{ + const size_t input_size = state->input_size; + const size_t fft_size = state->fft_size; + + int16_t *fft_input = state->input; + // First, scale the input by the given shift. + size_t i; + for (i = 0; i < input_size; ++i) { + fft_input[i] = static_cast(static_cast(input[i]) + << input_scale_shift); + } + // Zero out whatever else remains in the top part of the input. + for (; i < fft_size; ++i) { + fft_input[i] = 0; + } + + // Apply the FFT. + kiss_fftr(reinterpret_cast(state->scratch), + state->input, + reinterpret_cast(state->output)); +} + +void FftInit(struct FftState *state) +{ + // All the initialization is done in FftPopulateState() +} + +void FftReset(struct FftState *state) +{ + memset(state->input, 0, state->fft_size * sizeof(*state->input)); + memset(state->output, 0, (state->fft_size / 2 + 1) * sizeof(*state->output)); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.h new file mode 100644 index 00000000..2197eb60 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft.h @@ -0,0 +1,50 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct complex_int16_t { + int16_t real; + int16_t imag; +}; + +struct FftState { + int16_t *input; + struct complex_int16_t *output; + size_t fft_size; + size_t input_size; + void *scratch; + size_t scratch_size; +}; + +void FftCompute(struct FftState *state, const int16_t *input, + int input_scale_shift); + +void FftInit(struct FftState *state); + +void FftReset(struct FftState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.c new file mode 100644 index 00000000..1f9a6945 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.c @@ -0,0 +1,35 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/fft_io.h" + +void FftWriteMemmapPreamble(FILE *fp, const struct FftState *state) +{ + fprintf(fp, "static int16_t fft_input[%zu];\n", state->fft_size); + fprintf(fp, "static struct complex_int16_t fft_output[%zu];\n", + state->fft_size / 2 + 1); + fprintf(fp, "static char fft_scratch[%zu];\n", state->scratch_size); + fprintf(fp, "\n"); +} + +void FftWriteMemmap(FILE *fp, const struct FftState *state, + const char *variable) +{ + fprintf(fp, "%s->input = fft_input;\n", variable); + fprintf(fp, "%s->output = fft_output;\n", variable); + fprintf(fp, "%s->fft_size = %zu;\n", variable, state->fft_size); + fprintf(fp, "%s->input_size = %zu;\n", variable, state->input_size); + fprintf(fp, "%s->scratch = fft_scratch;\n", variable); + fprintf(fp, "%s->scratch_size = %zu;\n", variable, state->scratch_size); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.h new file mode 100644 index 00000000..4bdd9372 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_io.h @@ -0,0 +1,34 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_IO_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_IO_H_ + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/fft.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void FftWriteMemmapPreamble(FILE *fp, const struct FftState *state); +void FftWriteMemmap(FILE *fp, const struct FftState *state, + const char *variable); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_IO_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_test.cc new file mode 100644 index 00000000..ee16ad98 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_test.cc @@ -0,0 +1,55 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/fft.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/fft_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int16_t kFakeWindow[] = { + 0, 1151, 0, -5944, 0, 13311, 0, -21448, 0, 28327, 0, -32256, 0, 32255, + 0, -28328, 0, 21447, 0, -13312, 0, 5943, 0, -1152, 0 +}; +const int kScaleShift = 0; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FftTest_CheckOutputValues) +{ + struct FftState state; + TF_LITE_MICRO_EXPECT( + FftPopulateState(&state, sizeof(kFakeWindow) / sizeof(kFakeWindow[0]))); + + FftInit(&state); + FftCompute(&state, kFakeWindow, kScaleShift); + + const struct complex_int16_t expected[] = { + { 0, 0 }, { -10, 9 }, { -20, 0 }, { -9, -10 }, { 0, 25 }, { -119, 119 }, { -887, 0 }, { 3000, 3000 }, { 0, -6401 }, { -3000, 3000 }, { 886, 0 }, { 118, 119 }, { 0, 25 }, { 9, -10 }, { 19, 0 }, { 9, 9 }, { 0, 0 } + }; + TF_LITE_MICRO_EXPECT_EQ(state.fft_size / 2 + 1, + sizeof(expected) / sizeof(expected[0])); + unsigned int i; + for (i = 0; i <= state.fft_size / 2; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.output[i].real, expected[i].real); + TF_LITE_MICRO_EXPECT_EQ(state.output[i].imag, expected[i].imag); + } + + FftFreeStateContents(&state); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.cc new file mode 100644 index 00000000..73beb812 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.cc @@ -0,0 +1,74 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/fft_util.h" + +#include + +#define FIXED_POINT 16 +#include "kiss_fft.h" +#include "tools/kiss_fftr.h" + +int FftPopulateState(struct FftState *state, size_t input_size) +{ + state->input_size = input_size; + state->fft_size = 1; + while (state->fft_size < state->input_size) { + state->fft_size <<= 1; + } + + state->input = reinterpret_cast( + malloc(state->fft_size * sizeof(*state->input))); + if (state->input == nullptr) { + fprintf(stderr, "Failed to alloc fft input buffer\n"); + return 0; + } + + state->output = reinterpret_cast( + malloc((state->fft_size / 2 + 1) * sizeof(*state->output) * 2)); + if (state->output == nullptr) { + fprintf(stderr, "Failed to alloc fft output buffer\n"); + return 0; + } + + // Ask kissfft how much memory it wants. + size_t scratch_size = 0; + kiss_fftr_cfg kfft_cfg = kiss_fftr_alloc( + state->fft_size, 0, nullptr, &scratch_size); + if (kfft_cfg != nullptr) { + fprintf(stderr, "Kiss memory sizing failed.\n"); + return 0; + } + state->scratch = malloc(scratch_size); + if (state->scratch == nullptr) { + fprintf(stderr, "Failed to alloc fft scratch buffer\n"); + return 0; + } + state->scratch_size = scratch_size; + // Let kissfft configure the scratch space we just allocated + kfft_cfg = kiss_fftr_alloc(state->fft_size, 0, + state->scratch, &scratch_size); + if (kfft_cfg != state->scratch) { + fprintf(stderr, "Kiss memory preallocation strategy failed.\n"); + return 0; + } + return 1; +} + +void FftFreeStateContents(struct FftState *state) +{ + free(state->input); + free(state->output); + free(state->scratch); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.h new file mode 100644 index 00000000..8552abaa --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/fft_util.h @@ -0,0 +1,34 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_UTIL_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/fft.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Prepares and FFT for the given input size. +int FftPopulateState(struct FftState *state, size_t input_size); + +// Frees any allocated buffers. +void FftFreeStateContents(struct FftState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FFT_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.c new file mode 100644 index 00000000..88c94822 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.c @@ -0,0 +1,140 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank.h" + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/bits.h" + +void FilterbankConvertFftComplexToEnergy(struct FilterbankState *state, + struct complex_int16_t *fft_output, + int32_t *energy) +{ + const int end_index = state->end_index; + int i; + energy += state->start_index; + fft_output += state->start_index; + for (i = state->start_index; i < end_index; ++i) { + const int32_t real = fft_output->real; + const int32_t imag = fft_output->imag; + fft_output++; + const uint32_t mag_squared = (real * real) + (imag * imag); + *energy++ = mag_squared; + } +} + +void FilterbankAccumulateChannels(struct FilterbankState *state, + const int32_t *energy) +{ + uint64_t *work = state->work; + uint64_t weight_accumulator = 0; + uint64_t unweight_accumulator = 0; + + const int16_t *channel_frequency_starts = state->channel_frequency_starts; + const int16_t *channel_weight_starts = state->channel_weight_starts; + const int16_t *channel_widths = state->channel_widths; + + int num_channels_plus_1 = state->num_channels + 1; + int i; + for (i = 0; i < num_channels_plus_1; ++i) { + const int32_t *magnitudes = energy + *channel_frequency_starts++; + const int16_t *weights = state->weights + *channel_weight_starts; + const int16_t *unweights = state->unweights + *channel_weight_starts++; + const int width = *channel_widths++; + int j; + for (j = 0; j < width; ++j) { + weight_accumulator += *weights++ * ((uint64_t)*magnitudes); + unweight_accumulator += *unweights++ * ((uint64_t)*magnitudes); + ++magnitudes; + } + *work++ = weight_accumulator; + weight_accumulator = unweight_accumulator; + unweight_accumulator = 0; + } +} + +static uint16_t Sqrt32(uint32_t num) +{ + if (num == 0) { + return 0; + } + uint32_t res = 0; + int max_bit_number = 32 - MostSignificantBit32(num); + max_bit_number |= 1; + uint32_t bit = 1U << (31 - max_bit_number); + int iterations = (31 - max_bit_number) / 2 + 1; + while (iterations--) { + if (num >= res + bit) { + num -= res + bit; + res = (res >> 1U) + bit; + } else { + res >>= 1U; + } + bit >>= 2U; + } + // Do rounding - if we have the bits. + if (num > res && res != 0xFFFF) { + ++res; + } + return res; +} + +static uint32_t Sqrt64(uint64_t num) +{ + // Take a shortcut and just use 32 bit operations if the upper word is all + // clear. This will cause a slight off by one issue for numbers close to 2^32, + // but it probably isn't going to matter (and gives us a big performance win). + if ((num >> 32) == 0) { + return Sqrt32((uint32_t)num); + } + uint64_t res = 0; + int max_bit_number = 64 - MostSignificantBit64(num); + max_bit_number |= 1; + uint64_t bit = 1ULL << (63 - max_bit_number); + int iterations = (63 - max_bit_number) / 2 + 1; + while (iterations--) { + if (num >= res + bit) { + num -= res + bit; + res = (res >> 1U) + bit; + } else { + res >>= 1U; + } + bit >>= 2U; + } + // Do rounding - if we have the bits. + if (num > res && res != 0xFFFFFFFFLL) { + ++res; + } + return res; +} + +uint32_t *FilterbankSqrt(struct FilterbankState *state, int scale_down_shift) +{ + const int num_channels = state->num_channels; + const uint64_t *work = state->work + 1; + // Reuse the work buffer since we're fine clobbering it at this point to hold + // the output. + uint32_t *output = (uint32_t *)state->work; + int i; + for (i = 0; i < num_channels; ++i) { + *output++ = Sqrt64(*work++) >> scale_down_shift; + } + return (uint32_t *)state->work; +} + +void FilterbankReset(struct FilterbankState *state) +{ + memset(state->work, 0, (state->num_channels + 1) * sizeof(*state->work)); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.h new file mode 100644 index 00000000..07200295 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank.h @@ -0,0 +1,63 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_H_ + +#include +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/fft.h" + +#define kFilterbankBits 12 + +#ifdef __cplusplus +extern "C" { +#endif + +struct FilterbankState { + int num_channels; + int start_index; + int end_index; + int16_t *channel_frequency_starts; + int16_t *channel_weight_starts; + int16_t *channel_widths; + int16_t *weights; + int16_t *unweights; + uint64_t *work; +}; + +// Converts the relevant complex values of an FFT output into energy (the +// square magnitude). +void FilterbankConvertFftComplexToEnergy(struct FilterbankState *state, + struct complex_int16_t *fft_output, + int32_t *energy); + +// Computes the mel-scale filterbank on the given energy array. Output is cached +// internally - to fetch it, you need to call FilterbankSqrt. +void FilterbankAccumulateChannels(struct FilterbankState *state, + const int32_t *energy); + +// Applies an integer square root to the 64 bit intermediate values of the +// filterbank, and returns a pointer to them. Memory will be invalidated the +// next time FilterbankAccumulateChannels is called. +uint32_t *FilterbankSqrt(struct FilterbankState *state, int scale_down_shift); + +void FilterbankReset(struct FilterbankState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.c new file mode 100644 index 00000000..4ee60fe1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.c @@ -0,0 +1,70 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank_io.h" + +static void PrintArray(FILE *fp, const char *name, const int16_t *values, + size_t size) +{ + fprintf(fp, "static int16_t filterbank_%s[] = {", name); + int i; + for (i = 0; i < size; ++i) { + fprintf(fp, "%d", values[i]); + if (i < size - 1) { + fprintf(fp, ", "); + } + } + fprintf(fp, "};\n"); +} + +void FilterbankWriteMemmapPreamble(FILE *fp, + const struct FilterbankState *state) +{ + const int num_channels_plus_1 = state->num_channels + 1; + + PrintArray(fp, "channel_frequency_starts", state->channel_frequency_starts, + num_channels_plus_1); + PrintArray(fp, "channel_weight_starts", state->channel_weight_starts, + num_channels_plus_1); + PrintArray(fp, "channel_widths", state->channel_widths, num_channels_plus_1); + int num_weights = 0; + int i; + for (i = 0; i < num_channels_plus_1; ++i) { + num_weights += state->channel_widths[i]; + } + PrintArray(fp, "weights", state->weights, num_weights); + PrintArray(fp, "unweights", state->unweights, num_weights); + + fprintf(fp, "static uint64_t filterbank_work[%d];\n", num_channels_plus_1); + fprintf(fp, "\n"); +} + +void FilterbankWriteMemmap(FILE *fp, const struct FilterbankState *state, + const char *variable) +{ + fprintf(fp, "%s->num_channels = %d;\n", variable, state->num_channels); + fprintf(fp, "%s->start_index = %d;\n", variable, state->start_index); + fprintf(fp, "%s->end_index = %d;\n", variable, state->end_index); + + fprintf( + fp, + "%s->channel_frequency_starts = filterbank_channel_frequency_starts;\n", + variable); + fprintf(fp, "%s->channel_weight_starts = filterbank_channel_weight_starts;\n", + variable); + fprintf(fp, "%s->channel_widths = filterbank_channel_widths;\n", variable); + fprintf(fp, "%s->weights = filterbank_weights;\n", variable); + fprintf(fp, "%s->unweights = filterbank_unweights;\n", variable); + fprintf(fp, "%s->work = filterbank_work;\n", variable); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.h new file mode 100644 index 00000000..239c20be --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_io.h @@ -0,0 +1,35 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_IO_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_IO_H_ + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void FilterbankWriteMemmapPreamble(FILE *fp, + const struct FilterbankState *state); +void FilterbankWriteMemmap(FILE *fp, const struct FilterbankState *state, + const char *variable); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_IO_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_test.cc new file mode 100644 index 00000000..82e6bb88 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_test.cc @@ -0,0 +1,229 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank.h" + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int kSampleRate = 1000; +const int kSpectrumSize = 17; +const int kStartIndex = 1; +const int kEndIndex = 15; +const int32_t kEnergy[] = { -1, 181, 400, 181, 625, 28322, + 786769, 18000000, 40972801, 18000000, 784996, 28085, + 625, 181, 361, -1, -1 }; +const uint64_t kWork[] = { 1835887, 61162970173, 258694800000 }; +const int kScaleShift = 0; + +// Test filterbank generation using scaled-down defaults. +class FilterbankTestConfig { +public: + FilterbankTestConfig() + { + config_.num_channels = 2; + config_.lower_band_limit = 8.0; + config_.upper_band_limit = 450.0; + } + + struct FilterbankConfig config_; +}; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FilterbankTest_CheckStartIndex) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + TF_LITE_MICRO_EXPECT_EQ(state.start_index, kStartIndex); + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckEndIndex) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + TF_LITE_MICRO_EXPECT_EQ(state.end_index, kEndIndex); + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckChannelFrequencyStarts) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + const int16_t expected[] = { 0, 4, 8 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels + 1, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i <= state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.channel_frequency_starts[i], expected[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckChannelWeightStarts) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + const int16_t expected[] = { 0, 8, 16 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels + 1, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i <= state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.channel_weight_starts[i], expected[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckChannelWidths) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + const int16_t expected[] = { 8, 8, 8 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels + 1, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i <= state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.channel_widths[i], expected[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckWeights) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + const int16_t expected[] = { 0, 3277, 2217, 1200, 222, 0, 0, 0, + 0, 3376, 2468, 1591, 744, 0, 0, 0, + 0, 4020, 3226, 2456, 1708, 983, 277, 0 }; + TF_LITE_MICRO_EXPECT_EQ(state.channel_weight_starts[state.num_channels] + + state.channel_widths[state.num_channels], + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < sizeof(expected) / sizeof(expected[0]); ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.weights[i], expected[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckUnweights) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + const int16_t expected[] = { 0, 819, 1879, 2896, 3874, 0, 0, 0, + 0, 720, 1628, 2505, 3352, 0, 0, 0, + 0, 76, 870, 1640, 2388, 3113, 3819, 0 }; + TF_LITE_MICRO_EXPECT_EQ(state.channel_weight_starts[state.num_channels] + + state.channel_widths[state.num_channels], + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < sizeof(expected) / sizeof(expected[0]); ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.unweights[i], expected[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckConvertFftComplexToEnergy) +{ + struct FilterbankState state; + state.start_index = kStartIndex; + state.end_index = kEndIndex; + + struct complex_int16_t fake_fft[] = { + { 0, 0 }, { -10, 9 }, { -20, 0 }, { -9, -10 }, { 0, 25 }, { -119, 119 }, { -887, 0 }, { 3000, 3000 }, { 0, -6401 }, { -3000, 3000 }, { 886, 0 }, { 118, 119 }, { 0, 25 }, { 9, -10 }, { 19, 0 }, { 9, 9 }, { 0, 0 } + }; + int32_t *energy = reinterpret_cast(fake_fft); + FilterbankConvertFftComplexToEnergy(&state, fake_fft, energy); + + int i; + for (i = state.start_index; i < state.end_index; ++i) { + TF_LITE_MICRO_EXPECT_EQ(energy[i], kEnergy[i]); + } +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckAccumulateChannels) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + + FilterbankAccumulateChannels(&state, kEnergy); + + TF_LITE_MICRO_EXPECT_EQ(state.num_channels + 1, + sizeof(kWork) / sizeof(kWork[0])); + int i; + for (i = 0; i <= state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.work[i], kWork[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FilterbankTest_CheckSqrt) +{ + FilterbankTestConfig config; + struct FilterbankState state; + TF_LITE_MICRO_EXPECT(FilterbankPopulateState(&config.config_, &state, + kSampleRate, kSpectrumSize)); + std::memcpy(state.work, kWork, sizeof(kWork)); + + uint32_t *scaled_filterbank = FilterbankSqrt(&state, kScaleShift); + + const uint32_t expected[] = { 247311, 508620 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(scaled_filterbank[i], expected[i]); + } + + FilterbankFreeStateContents(&state); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.c new file mode 100644 index 00000000..4afa4d33 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.c @@ -0,0 +1,226 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h" + +#include +#include +#include + +#define kFilterbankIndexAlignment 4 +#define kFilterbankChannelBlockSize 4 + +void FilterbankFillConfigWithDefaults(struct FilterbankConfig *config) +{ + config->num_channels = 32; + config->lower_band_limit = 125.0f; + config->upper_band_limit = 7500.0f; + config->output_scale_shift = 7; +} + +static float FreqToMel(float freq) +{ + return 1127.0 * log1p(freq / 700.0); +} + +static void CalculateCenterFrequencies(const int num_channels, + const float lower_frequency_limit, + const float upper_frequency_limit, + float *center_frequencies) +{ + assert(lower_frequency_limit >= 0.0f); + assert(upper_frequency_limit > lower_frequency_limit); + + const float mel_low = FreqToMel(lower_frequency_limit); + const float mel_hi = FreqToMel(upper_frequency_limit); + const float mel_span = mel_hi - mel_low; + const float mel_spacing = mel_span / ((float)num_channels); + int i; + for (i = 0; i < num_channels; ++i) { + center_frequencies[i] = mel_low + (mel_spacing * (i + 1)); + } +} + +static void QuantizeFilterbankWeights(const float float_weight, int16_t *weight, + int16_t *unweight) +{ + *weight = floor(float_weight * (1 << kFilterbankBits) + 0.5); + *unweight = floor((1.0 - float_weight) * (1 << kFilterbankBits) + 0.5); +} + +int FilterbankPopulateState(const struct FilterbankConfig *config, + struct FilterbankState *state, int sample_rate, + int spectrum_size) +{ + state->num_channels = config->num_channels; + const int num_channels_plus_1 = config->num_channels + 1; + + // How should we align things to index counts given the byte alignment? + const int index_alignment = + (kFilterbankIndexAlignment < sizeof(int16_t) ? 1 : kFilterbankIndexAlignment / sizeof(int16_t)); + + state->channel_frequency_starts = + malloc(num_channels_plus_1 * sizeof(*state->channel_frequency_starts)); + state->channel_weight_starts = + malloc(num_channels_plus_1 * sizeof(*state->channel_weight_starts)); + state->channel_widths = + malloc(num_channels_plus_1 * sizeof(*state->channel_widths)); + state->work = malloc(num_channels_plus_1 * sizeof(*state->work)); + + float *center_mel_freqs = + malloc(num_channels_plus_1 * sizeof(*center_mel_freqs)); + int16_t *actual_channel_starts = + malloc(num_channels_plus_1 * sizeof(*actual_channel_starts)); + int16_t *actual_channel_widths = + malloc(num_channels_plus_1 * sizeof(*actual_channel_widths)); + + if (state->channel_frequency_starts == NULL || + state->channel_weight_starts == NULL || state->channel_widths == NULL || + center_mel_freqs == NULL || actual_channel_starts == NULL || + actual_channel_widths == NULL) { + free(center_mel_freqs); + free(actual_channel_starts); + free(actual_channel_widths); + fprintf(stderr, "Failed to allocate channel buffers\n"); + return 0; + } + + CalculateCenterFrequencies(num_channels_plus_1, config->lower_band_limit, + config->upper_band_limit, center_mel_freqs); + + // Always exclude DC. + const float hz_per_sbin = 0.5 * sample_rate / ((float)spectrum_size - 1); + state->start_index = 1.5 + config->lower_band_limit / hz_per_sbin; + state->end_index = 0; // Initialized to zero here, but actually set below. + + // For each channel, we need to figure out what frequencies belong to it, and + // how much padding we need to add so that we can efficiently multiply the + // weights and unweights for accumulation. To simplify the multiplication + // logic, all channels will have some multiplication to do (even if there are + // no frequencies that accumulate to that channel) - they will be directed to + // a set of zero weights. + int chan_freq_index_start = state->start_index; + int weight_index_start = 0; + int needs_zeros = 0; + + int chan; + for (chan = 0; chan < num_channels_plus_1; ++chan) { + // Keep jumping frequencies until we overshoot the bound on this channel. + int freq_index = chan_freq_index_start; + while (FreqToMel((freq_index)*hz_per_sbin) <= center_mel_freqs[chan]) { + ++freq_index; + } + + const int width = freq_index - chan_freq_index_start; + actual_channel_starts[chan] = chan_freq_index_start; + actual_channel_widths[chan] = width; + + if (width == 0) { + // This channel doesn't actually get anything from the frequencies, it's + // always zero. We need then to insert some 'zero' weights into the + // output, and just redirect this channel to do a single multiplication at + // this point. For simplicity, the zeros are placed at the beginning of + // the weights arrays, so we have to go and update all the other + // weight_starts to reflect this shift (but only once). + state->channel_frequency_starts[chan] = 0; + state->channel_weight_starts[chan] = 0; + state->channel_widths[chan] = kFilterbankChannelBlockSize; + if (!needs_zeros) { + needs_zeros = 1; + int j; + for (j = 0; j < chan; ++j) { + state->channel_weight_starts[j] += kFilterbankChannelBlockSize; + } + weight_index_start += kFilterbankChannelBlockSize; + } + } else { + // How far back do we need to go to ensure that we have the proper + // alignment? + const int aligned_start = + (chan_freq_index_start / index_alignment) * index_alignment; + const int aligned_width = (chan_freq_index_start - aligned_start + width); + const int padded_width = + (((aligned_width - 1) / kFilterbankChannelBlockSize) + 1) * + kFilterbankChannelBlockSize; + + state->channel_frequency_starts[chan] = aligned_start; + state->channel_weight_starts[chan] = weight_index_start; + state->channel_widths[chan] = padded_width; + weight_index_start += padded_width; + } + chan_freq_index_start = freq_index; + } + + // Allocate the two arrays to store the weights - weight_index_start contains + // the index of what would be the next set of weights that we would need to + // add, so that's how many weights we need to allocate. + state->weights = calloc(weight_index_start, sizeof(*state->weights)); + state->unweights = calloc(weight_index_start, sizeof(*state->unweights)); + + // If the alloc failed, we also need to nuke the arrays. + if (state->weights == NULL || state->unweights == NULL) { + free(center_mel_freqs); + free(actual_channel_starts); + free(actual_channel_widths); + fprintf(stderr, "Failed to allocate weights or unweights\n"); + return 0; + } + + // Next pass, compute all the weights. Since everything has been memset to + // zero, we only need to fill in the weights that correspond to some frequency + // for a channel. + const float mel_low = FreqToMel(config->lower_band_limit); + for (chan = 0; chan < num_channels_plus_1; ++chan) { + int frequency = actual_channel_starts[chan]; + const int num_frequencies = actual_channel_widths[chan]; + const int frequency_offset = + frequency - state->channel_frequency_starts[chan]; + const int weight_start = state->channel_weight_starts[chan]; + const float denom_val = (chan == 0) ? mel_low : center_mel_freqs[chan - 1]; + + int j; + for (j = 0; j < num_frequencies; ++j, ++frequency) { + const float weight = + (center_mel_freqs[chan] - FreqToMel(frequency * hz_per_sbin)) / + (center_mel_freqs[chan] - denom_val); + + // Make the float into an integer for the weights (and unweights). + const int weight_index = weight_start + frequency_offset + j; + QuantizeFilterbankWeights(weight, state->weights + weight_index, + state->unweights + weight_index); + } + if (frequency > state->end_index) { + state->end_index = frequency; + } + } + + free(center_mel_freqs); + free(actual_channel_starts); + free(actual_channel_widths); + if (state->end_index >= spectrum_size) { + fprintf(stderr, "Filterbank end_index is above spectrum size.\n"); + return 0; + } + return 1; +} + +void FilterbankFreeStateContents(struct FilterbankState *state) +{ + free(state->channel_frequency_starts); + free(state->channel_weight_starts); + free(state->channel_widths); + free(state->weights); + free(state->unweights); + free(state->work); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h new file mode 100644 index 00000000..cfc5ca98 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h @@ -0,0 +1,50 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_UTIL_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct FilterbankConfig { + // number of frequency channel buckets for filterbank + int num_channels; + // maximum frequency to include + float upper_band_limit; + // minimum frequency to include + float lower_band_limit; + // unused + int output_scale_shift; +}; + +// Fills the frontendConfig with "sane" defaults. +void FilterbankFillConfigWithDefaults(struct FilterbankConfig *config); + +// Allocates any buffers. +int FilterbankPopulateState(const struct FilterbankConfig *config, + struct FilterbankState *state, int sample_rate, + int spectrum_size); + +// Frees any allocated buffers. +void FilterbankFreeStateContents(struct FilterbankState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FILTERBANK_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.c new file mode 100644 index 00000000..32ede40c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.c @@ -0,0 +1,74 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/bits.h" + +struct FrontendOutput FrontendProcessSamples(struct FrontendState *state, + const int16_t *samples, + size_t num_samples, + size_t *num_samples_read) +{ + struct FrontendOutput output; + output.values = NULL; + output.size = 0; + + // Try to apply the window - if it fails, return and wait for more data. + if (!WindowProcessSamples(&state->window, samples, num_samples, + num_samples_read)) { + return output; + } + + // Apply the FFT to the window's output (and scale it so that the fixed point + // FFT can have as much resolution as possible). + int input_shift = + 15 - MostSignificantBit32(state->window.max_abs_output_value); + FftCompute(&state->fft, state->window.output, input_shift); + + // We can re-ruse the fft's output buffer to hold the energy. + int32_t *energy = (int32_t *)state->fft.output; + + FilterbankConvertFftComplexToEnergy(&state->filterbank, state->fft.output, + energy); + + FilterbankAccumulateChannels(&state->filterbank, energy); + uint32_t *scaled_filterbank = FilterbankSqrt(&state->filterbank, input_shift); + + // Apply noise reduction. + NoiseReductionApply(&state->noise_reduction, scaled_filterbank); + + if (state->pcan_gain_control.enable_pcan) { + PcanGainControlApply(&state->pcan_gain_control, scaled_filterbank); + } + + // Apply the log and scale. + int correction_bits = + MostSignificantBit32(state->fft.fft_size) - 1 - (kFilterbankBits / 2); + uint16_t *logged_filterbank = + LogScaleApply(&state->log_scale, scaled_filterbank, + state->filterbank.num_channels, correction_bits); + + output.size = state->filterbank.num_channels; + output.values = logged_filterbank; + return output; +} + +void FrontendReset(struct FrontendState *state) +{ + WindowReset(&state->window); + FftReset(&state->fft); + FilterbankReset(&state->filterbank); + NoiseReductionReset(&state->noise_reduction); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.h new file mode 100644 index 00000000..e1e4ca35 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend.h @@ -0,0 +1,64 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_H_ + +#include +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/fft.h" +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank.h" +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale.h" +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h" +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h" +#include "tensorflow/lite/experimental/microfrontend/lib/window.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct FrontendState { + struct WindowState window; + struct FftState fft; + struct FilterbankState filterbank; + struct NoiseReductionState noise_reduction; + struct PcanGainControlState pcan_gain_control; + struct LogScaleState log_scale; +}; + +struct FrontendOutput { + const uint16_t *values; + size_t size; +}; + +// Main entry point to processing frontend samples. Updates num_samples_read to +// contain the number of samples that have been consumed from the input array. +// Returns a struct containing the generated output. If not enough samples were +// added to generate a feature vector, the returned size will be 0 and the +// values pointer will be NULL. Note that the output pointer will be invalidated +// as soon as FrontendProcessSamples is called again, so copy the contents +// elsewhere if you need to use them later. +struct FrontendOutput FrontendProcessSamples(struct FrontendState *state, + const int16_t *samples, + size_t num_samples, + size_t *num_samples_read); + +void FrontendReset(struct FrontendState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.c new file mode 100644 index 00000000..da8cc0b5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.c @@ -0,0 +1,70 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_io.h" + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/fft_io.h" +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank_io.h" +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale_io.h" +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.h" +#include "tensorflow/lite/experimental/microfrontend/lib/window_io.h" + +int WriteFrontendStateMemmap(const char *header, const char *source, + const struct FrontendState *state) +{ + // Write a header that just has our init function. + FILE *fp = fopen(header, "w"); + if (!fp) { + fprintf(stderr, "Failed to open header '%s' for write\n", header); + return 0; + } + fprintf(fp, "#ifndef FRONTEND_STATE_MEMMAP_H_\n"); + fprintf(fp, "#define FRONTEND_STATE_MEMMAP_H_\n"); + fprintf(fp, "\n"); + fprintf(fp, "#include \"frontend.h\"\n"); + fprintf(fp, "\n"); + fprintf(fp, "struct FrontendState* GetFrontendStateMemmap();\n"); + fprintf(fp, "\n"); + fprintf(fp, "#endif // FRONTEND_STATE_MEMMAP_H_\n"); + fclose(fp); + + // Write out the source file that actually has everything in it. + fp = fopen(source, "w"); + if (!fp) { + fprintf(stderr, "Failed to open source '%s' for write\n", source); + return 0; + } + fprintf(fp, "#include \"%s\"\n", header); + fprintf(fp, "\n"); + WindowWriteMemmapPreamble(fp, &state->window); + FftWriteMemmapPreamble(fp, &state->fft); + FilterbankWriteMemmapPreamble(fp, &state->filterbank); + NoiseReductionWriteMemmapPreamble(fp, &state->noise_reduction); + fprintf(fp, "static struct FrontendState state;\n"); + fprintf(fp, "struct FrontendState* GetFrontendStateMemmap() {\n"); + WindowWriteMemmap(fp, &state->window, " (&state.window)"); + FftWriteMemmap(fp, &state->fft, " (&state.fft)"); + FilterbankWriteMemmap(fp, &state->filterbank, " (&state.filterbank)"); + NoiseReductionWriteMemmap(fp, &state->noise_reduction, + " (&state.noise_reduction)"); + LogScaleWriteMemmap(fp, &state->log_scale, " (&state.log_scale)"); + fprintf(fp, " FftInit(&state.fft);\n"); + fprintf(fp, " FrontendReset(&state);\n"); + fprintf(fp, " return &state;\n"); + fprintf(fp, "}\n"); + fclose(fp); + return 1; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.h new file mode 100644 index 00000000..b21b1df0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_io.h @@ -0,0 +1,31 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_IO_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_IO_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int WriteFrontendStateMemmap(const char *header, const char *source, + const struct FrontendState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_IO_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_main.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_main.c new file mode 100644 index 00000000..2371fd34 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_main.c @@ -0,0 +1,72 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_util.h" + +int main(int argc, char **argv) +{ + struct FrontendConfig frontend_config; + FrontendFillConfigWithDefaults(&frontend_config); + + char *filename = argv[1]; + int sample_rate = 16000; + + struct FrontendState frontend_state; + if (!FrontendPopulateState(&frontend_config, &frontend_state, sample_rate)) { + fprintf(stderr, "Failed to populate frontend state\n"); + FrontendFreeStateContents(&frontend_state); + return 1; + } + + FILE *fp = fopen(filename, "r"); + if (fp == NULL) { + fprintf(stderr, "Failed to open %s for read\n", filename); + return 1; + } + fseek(fp, 0L, SEEK_END); + size_t audio_file_size = ftell(fp) / sizeof(int16_t); + fseek(fp, 0L, SEEK_SET); + int16_t *audio_data = malloc(audio_file_size * sizeof(int16_t)); + int16_t *original_audio_data = audio_data; + if (audio_file_size != + fread(audio_data, sizeof(int16_t), audio_file_size, fp)) { + fprintf(stderr, "Failed to read in all audio data\n"); + fclose(fp); + return 1; + } + + while (audio_file_size > 0) { + size_t num_samples_read; + struct FrontendOutput output = FrontendProcessSamples( + &frontend_state, audio_data, audio_file_size, &num_samples_read); + audio_data += num_samples_read; + audio_file_size -= num_samples_read; + + if (output.values != NULL) { + int i; + for (i = 0; i < output.size; ++i) { + printf("%d ", output.values[i]); + } + printf("\n"); + } + } + + FrontendFreeStateContents(&frontend_state); + free(original_audio_data); + fclose(fp); + return 0; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_generator.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_generator.c new file mode 100644 index 00000000..4dc83ed1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_generator.c @@ -0,0 +1,49 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_util.h" +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_io.h" + +int main(int argc, char **argv) +{ + if (argc != 3) { + fprintf(stderr, + "%s requires exactly two parameters - the names of the header and " + "source files to save\n", + argv[0]); + return 1; + } + struct FrontendConfig frontend_config; + FrontendFillConfigWithDefaults(&frontend_config); + + int sample_rate = 16000; + struct FrontendState frontend_state; + if (!FrontendPopulateState(&frontend_config, &frontend_state, sample_rate)) { + fprintf(stderr, "Failed to populate frontend state\n"); + FrontendFreeStateContents(&frontend_state); + return 1; + } + + if (!WriteFrontendStateMemmap(argv[1], argv[2], &frontend_state)) { + fprintf(stderr, "Failed to write memmap\n"); + FrontendFreeStateContents(&frontend_state); + return 1; + } + + FrontendFreeStateContents(&frontend_state); + return 0; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_main.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_main.c new file mode 100644 index 00000000..9c21f466 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_memmap_main.c @@ -0,0 +1,61 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "memmap.h" +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" + +int main(int argc, char **argv) +{ + struct FrontendState *frontend_state = GetFrontendStateMemmap(); + + char *filename = argv[1]; + FILE *fp = fopen(filename, "r"); + if (fp == NULL) { + fprintf(stderr, "Failed to open %s for read\n", filename); + return 1; + } + fseek(fp, 0L, SEEK_END); + size_t audio_file_size = ftell(fp) / sizeof(int16_t); + fseek(fp, 0L, SEEK_SET); + int16_t *audio_data = malloc(audio_file_size * sizeof(int16_t)); + int16_t *original_audio_data = audio_data; + if (audio_file_size != + fread(audio_data, sizeof(int16_t), audio_file_size, fp)) { + fprintf(stderr, "Failed to read in all audio data\n"); + fclose(fp); + return 1; + } + + while (audio_file_size > 0) { + size_t num_samples_read; + struct FrontendOutput output = FrontendProcessSamples( + frontend_state, audio_data, audio_file_size, &num_samples_read); + audio_data += num_samples_read; + audio_file_size -= num_samples_read; + + if (output.values != NULL) { + int i; + for (i = 0; i < output.size; ++i) { + printf("%d ", output.values[i]); + } + printf("\n"); + } + } + + free(original_audio_data); + fclose(fp); + return 0; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_test.cc new file mode 100644 index 00000000..258ad3d5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_test.cc @@ -0,0 +1,136 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int kSampleRate = 1000; +const int kWindowSamples = 25; +const int kStepSamples = 10; +const int16_t kFakeAudioData[] = { + 0, 32767, 0, -32768, 0, 32767, 0, -32768, 0, 32767, 0, -32768, + 0, 32767, 0, -32768, 0, 32767, 0, -32768, 0, 32767, 0, -32768, + 0, 32767, 0, -32768, 0, 32767, 0, -32768, 0, 32767, 0, -32768 +}; + +// Test end-to-end frontend behaviors. +class FrontendTestConfig { +public: + FrontendTestConfig() + { + config_.window.size_ms = 25; + config_.window.step_size_ms = 10; + config_.noise_reduction.smoothing_bits = 10; + config_.filterbank.num_channels = 2; + config_.filterbank.lower_band_limit = 8.0; + config_.filterbank.upper_band_limit = 450.0; + config_.noise_reduction.smoothing_bits = 10; + config_.noise_reduction.even_smoothing = 0.025; + config_.noise_reduction.odd_smoothing = 0.06; + config_.noise_reduction.min_signal_remaining = 0.05; + config_.pcan_gain_control.enable_pcan = true; + config_.pcan_gain_control.strength = 0.95; + config_.pcan_gain_control.offset = 80.0; + config_.pcan_gain_control.gain_bits = 21; + config_.log_scale.enable_log = true; + config_.log_scale.scale_shift = 6; + } + + struct FrontendConfig config_; +}; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FrontendTest_CheckOutputValues) +{ + FrontendTestConfig config; + struct FrontendState state; + TF_LITE_MICRO_EXPECT( + FrontendPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + struct FrontendOutput output = FrontendProcessSamples( + &state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), &num_samples_read); + + const uint16_t expected[] = { 479, 425 }; + TF_LITE_MICRO_EXPECT_EQ(output.size, sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < output.size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(output.values[i], expected[i]); + } + + FrontendFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FrontendTest_CheckConsecutiveWindow) +{ + FrontendTestConfig config; + struct FrontendState state; + TF_LITE_MICRO_EXPECT( + FrontendPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + FrontendProcessSamples(&state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), + &num_samples_read); + struct FrontendOutput output = FrontendProcessSamples( + &state, kFakeAudioData + kWindowSamples, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - kWindowSamples, + &num_samples_read); + + const int16_t expected[] = { 436, 378 }; + TF_LITE_MICRO_EXPECT_EQ(output.size, sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < output.size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(output.values[i], expected[i]); + } + + FrontendFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(FrontendTest_CheckNotEnoughSamples) +{ + FrontendTestConfig config; + struct FrontendState state; + TF_LITE_MICRO_EXPECT( + FrontendPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + FrontendProcessSamples(&state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), + &num_samples_read); + FrontendProcessSamples( + &state, kFakeAudioData + kWindowSamples, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - kWindowSamples, + &num_samples_read); + struct FrontendOutput output = FrontendProcessSamples( + &state, kFakeAudioData + kWindowSamples + kStepSamples, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - kWindowSamples - + kStepSamples, + &num_samples_read); + + TF_LITE_MICRO_EXPECT_EQ(output.size, 0); + TF_LITE_MICRO_EXPECT(output.values == nullptr); + + FrontendFreeStateContents(&state); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.c new file mode 100644 index 00000000..7bdd7731 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.c @@ -0,0 +1,88 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_util.h" + +#include +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/bits.h" + +void FrontendFillConfigWithDefaults(struct FrontendConfig *config) +{ + WindowFillConfigWithDefaults(&config->window); + FilterbankFillConfigWithDefaults(&config->filterbank); + NoiseReductionFillConfigWithDefaults(&config->noise_reduction); + PcanGainControlFillConfigWithDefaults(&config->pcan_gain_control); + LogScaleFillConfigWithDefaults(&config->log_scale); +} + +int FrontendPopulateState(const struct FrontendConfig *config, + struct FrontendState *state, int sample_rate) +{ + memset(state, 0, sizeof(*state)); + + if (!WindowPopulateState(&config->window, &state->window, sample_rate)) { + fprintf(stderr, "Failed to populate window state\n"); + return 0; + } + + if (!FftPopulateState(&state->fft, state->window.size)) { + fprintf(stderr, "Failed to populate fft state\n"); + return 0; + } + FftInit(&state->fft); + + if (!FilterbankPopulateState(&config->filterbank, &state->filterbank, + sample_rate, state->fft.fft_size / 2 + 1)) { + fprintf(stderr, "Failed to populate filterbank state\n"); + return 0; + } + + if (!NoiseReductionPopulateState(&config->noise_reduction, + &state->noise_reduction, + state->filterbank.num_channels)) { + fprintf(stderr, "Failed to populate noise reduction state\n"); + return 0; + } + + int input_correction_bits = + MostSignificantBit32(state->fft.fft_size) - 1 - (kFilterbankBits / 2); + if (!PcanGainControlPopulateState( + &config->pcan_gain_control, &state->pcan_gain_control, + state->noise_reduction.estimate, state->filterbank.num_channels, + state->noise_reduction.smoothing_bits, input_correction_bits)) { + fprintf(stderr, "Failed to populate pcan gain control state\n"); + return 0; + } + + if (!LogScalePopulateState(&config->log_scale, &state->log_scale)) { + fprintf(stderr, "Failed to populate log scale state\n"); + return 0; + } + + FrontendReset(state); + + // All good, return a true value. + return 1; +} + +void FrontendFreeStateContents(struct FrontendState *state) +{ + WindowFreeStateContents(&state->window); + FftFreeStateContents(&state->fft); + FilterbankFreeStateContents(&state->filterbank); + NoiseReductionFreeStateContents(&state->noise_reduction); + PcanGainControlFreeStateContents(&state->pcan_gain_control); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.h new file mode 100644 index 00000000..6cfc1d33 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/frontend_util.h @@ -0,0 +1,52 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_UTIL_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/fft_util.h" +#include "tensorflow/lite/experimental/microfrontend/lib/filterbank_util.h" +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h" +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h" +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h" +#include "tensorflow/lite/experimental/microfrontend/lib/window_util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct FrontendConfig { + struct WindowConfig window; + struct FilterbankConfig filterbank; + struct NoiseReductionConfig noise_reduction; + struct PcanGainControlConfig pcan_gain_control; + struct LogScaleConfig log_scale; +}; + +// Fills the frontendConfig with "sane" defaults. +void FrontendFillConfigWithDefaults(struct FrontendConfig *config); + +// Allocates any buffers. +int FrontendPopulateState(const struct FrontendConfig *config, + struct FrontendState *state, int sample_rate); + +// Frees any allocated buffers. +void FrontendFreeStateContents(struct FrontendState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_FRONTEND_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.c new file mode 100644 index 00000000..e8d6ceda --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.c @@ -0,0 +1,30 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/log_lut.h" +const uint16_t kLogLut[] +#ifndef _MSC_VER + __attribute__((aligned(4))) +#endif // _MSV_VER + = { 0, 224, 442, 654, 861, 1063, 1259, 1450, 1636, 1817, 1992, 2163, + 2329, 2490, 2646, 2797, 2944, 3087, 3224, 3358, 3487, 3611, 3732, 3848, + 3960, 4068, 4172, 4272, 4368, 4460, 4549, 4633, 4714, 4791, 4864, 4934, + 5001, 5063, 5123, 5178, 5231, 5280, 5326, 5368, 5408, 5444, 5477, 5507, + 5533, 5557, 5578, 5595, 5610, 5622, 5631, 5637, 5640, 5641, 5638, 5633, + 5626, 5615, 5602, 5586, 5568, 5547, 5524, 5498, 5470, 5439, 5406, 5370, + 5332, 5291, 5249, 5203, 5156, 5106, 5054, 5000, 4944, 4885, 4825, 4762, + 4697, 4630, 4561, 4490, 4416, 4341, 4264, 4184, 4103, 4020, 3935, 3848, + 3759, 3668, 3575, 3481, 3384, 3286, 3186, 3084, 2981, 2875, 2768, 2659, + 2549, 2437, 2323, 2207, 2090, 1971, 1851, 1729, 1605, 1480, 1353, 1224, + 1094, 963, 830, 695, 559, 421, 282, 142, 0, 0 }; diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.h new file mode 100644 index 00000000..6fd04f1c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_lut.h @@ -0,0 +1,40 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_LUT_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_LUT_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Number of segments in the log lookup table. The table will be kLogSegments+1 +// in length (with some padding). +#define kLogSegments 128 +#define kLogSegmentsLog2 7 + +// Scale used by lookup table. +#define kLogScale 65536 +#define kLogScaleLog2 16 +#define kLogCoeff 45426 + +extern const uint16_t kLogLut[]; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_LUT_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.c new file mode 100644 index 00000000..0cf70dd3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.c @@ -0,0 +1,86 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/bits.h" +#include "tensorflow/lite/experimental/microfrontend/lib/log_lut.h" + +#define kuint16max 0x0000FFFF + +// The following functions implement integer logarithms of various sizes. The +// approximation is calculated according to method described in +// www.inti.gob.ar/electronicaeinformatica/instrumentacion/utic/ +// publicaciones/SPL2007/Log10-spl07.pdf +// It first calculates log2 of the input and then converts it to natural +// logarithm. + +static uint32_t Log2FractionPart(const uint32_t x, const uint32_t log2x) +{ + // Part 1 + int32_t frac = x - (1LL << log2x); + if (log2x < kLogScaleLog2) { + frac <<= kLogScaleLog2 - log2x; + } else { + frac >>= log2x - kLogScaleLog2; + } + // Part 2 + const uint32_t base_seg = frac >> (kLogScaleLog2 - kLogSegmentsLog2); + const uint32_t seg_unit = + (((uint32_t)1) << kLogScaleLog2) >> kLogSegmentsLog2; + + const int32_t c0 = kLogLut[base_seg]; + const int32_t c1 = kLogLut[base_seg + 1]; + const int32_t seg_base = seg_unit * base_seg; + const int32_t rel_pos = ((c1 - c0) * (frac - seg_base)) >> kLogScaleLog2; + return frac + c0 + rel_pos; +} + +static uint32_t Log(const uint32_t x, const uint32_t scale_shift) +{ + const uint32_t integer = MostSignificantBit32(x) - 1; + const uint32_t fraction = Log2FractionPart(x, integer); + const uint32_t log2 = (integer << kLogScaleLog2) + fraction; + const uint32_t round = kLogScale / 2; + const uint32_t loge = (((uint64_t)kLogCoeff) * log2 + round) >> kLogScaleLog2; + // Finally scale to our output scale + const uint32_t loge_scaled = ((loge << scale_shift) + round) >> kLogScaleLog2; + return loge_scaled; +} + +uint16_t *LogScaleApply(struct LogScaleState *state, uint32_t *signal, + int signal_size, int correction_bits) +{ + const int scale_shift = state->scale_shift; + uint16_t *output = (uint16_t *)signal; + uint16_t *ret = output; + int i; + for (i = 0; i < signal_size; ++i) { + uint32_t value = *signal++; + if (state->enable_log) { + if (correction_bits < 0) { + value >>= -correction_bits; + } else { + value <<= correction_bits; + } + if (value > 1) { + value = Log(value, scale_shift); + } else { + value = 0; + } + } + *output++ = (value < kuint16max) ? value : kuint16max; + } + return ret; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.h new file mode 100644 index 00000000..26630be8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale.h @@ -0,0 +1,39 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct LogScaleState { + int enable_log; + int scale_shift; +}; + +// Applies a fixed point logarithm to the signal and converts it to 16 bit. Note +// that the signal array will be modified. +uint16_t *LogScaleApply(struct LogScaleState *state, uint32_t *signal, + int signal_size, int correction_bits); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.c new file mode 100644 index 00000000..7968d45f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.c @@ -0,0 +1,22 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale_io.h" + +void LogScaleWriteMemmap(FILE *fp, const struct LogScaleState *state, + const char *variable) +{ + fprintf(fp, "%s->enable_log = %d;\n", variable, state->enable_log); + fprintf(fp, "%s->scale_shift = %d;\n", variable, state->scale_shift); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.h new file mode 100644 index 00000000..de6d5830 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_io.h @@ -0,0 +1,33 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_IO_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_IO_H_ + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void LogScaleWriteMemmap(FILE *fp, const struct LogScaleState *state, + const char *variable); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_IO_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_test.cc new file mode 100644 index 00000000..71f1a20c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_test.cc @@ -0,0 +1,65 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int kScaleShift = 6; +const int kCorrectionBits = -1; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(LogScaleTest_CheckOutputValues) +{ + struct LogScaleState state; + state.enable_log = true; + state.scale_shift = kScaleShift; + + uint32_t fake_signal[] = { 3578, 1533 }; + uint16_t *output = LogScaleApply(&state, fake_signal, + sizeof(fake_signal) / sizeof(fake_signal[0]), + kCorrectionBits); + + const uint16_t expected[] = { 479, 425 }; + int i; + for (i = 0; i < sizeof(expected) / sizeof(expected[0]); ++i) { + TF_LITE_MICRO_EXPECT_EQ(output[i], expected[i]); + } +} + +TF_LITE_MICRO_TEST(LogScaleTest_CheckOutputValuesNoLog) +{ + struct LogScaleState state; + state.enable_log = false; + state.scale_shift = kScaleShift; + + uint32_t fake_signal[] = { 85964, 45998 }; + uint16_t *output = LogScaleApply(&state, fake_signal, + sizeof(fake_signal) / sizeof(fake_signal[0]), + kCorrectionBits); + + const uint16_t expected[] = { 65535, 45998 }; + int i; + for (i = 0; i < sizeof(expected) / sizeof(expected[0]); ++i) { + TF_LITE_MICRO_EXPECT_EQ(output[i], expected[i]); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.c new file mode 100644 index 00000000..42ff89c8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.c @@ -0,0 +1,29 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h" + +void LogScaleFillConfigWithDefaults(struct LogScaleConfig *config) +{ + config->enable_log = 1; + config->scale_shift = 6; +} + +int LogScalePopulateState(const struct LogScaleConfig *config, + struct LogScaleState *state) +{ + state->enable_log = config->enable_log; + state->scale_shift = config->scale_shift; + return 1; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h new file mode 100644 index 00000000..3decebbb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/log_scale_util.h @@ -0,0 +1,45 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_UTIL_H_ + +#include +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/log_scale.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct LogScaleConfig { + // set to false (0) to disable this module + int enable_log; + // scale results by 2^(scale_shift) + int scale_shift; +}; + +// Populates the LogScaleConfig with "sane" default values. +void LogScaleFillConfigWithDefaults(struct LogScaleConfig *config); + +// Allocates any buffers. +int LogScalePopulateState(const struct LogScaleConfig *config, + struct LogScaleState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_LOG_SCALE_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.c new file mode 100644 index 00000000..bcb02e16 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.c @@ -0,0 +1,53 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h" + +#include + +void NoiseReductionApply(struct NoiseReductionState *state, uint32_t *signal) +{ + int i; + for (i = 0; i < state->num_channels; ++i) { + const uint32_t smoothing = + ((i & 1) == 0) ? state->even_smoothing : state->odd_smoothing; + const uint32_t one_minus_smoothing = (1 << kNoiseReductionBits) - smoothing; + + // Update the estimate of the noise. + const uint32_t signal_scaled_up = signal[i] << state->smoothing_bits; + uint32_t estimate = + (((uint64_t)signal_scaled_up * smoothing) + + ((uint64_t)state->estimate[i] * one_minus_smoothing)) >> + kNoiseReductionBits; + state->estimate[i] = estimate; + + // Make sure that we can't get a negative value for the signal - estimate. + if (estimate > signal_scaled_up) { + estimate = signal_scaled_up; + } + + const uint32_t floor = + ((uint64_t)signal[i] * state->min_signal_remaining) >> + kNoiseReductionBits; + const uint32_t subtracted = + (signal_scaled_up - estimate) >> state->smoothing_bits; + const uint32_t output = subtracted > floor ? subtracted : floor; + signal[i] = output; + } +} + +void NoiseReductionReset(struct NoiseReductionState *state) +{ + memset(state->estimate, 0, sizeof(*state->estimate) * state->num_channels); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h new file mode 100644 index 00000000..462e7edb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h @@ -0,0 +1,46 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_H_ + +#define kNoiseReductionBits 14 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct NoiseReductionState { + int smoothing_bits; + uint16_t even_smoothing; + uint16_t odd_smoothing; + uint16_t min_signal_remaining; + int num_channels; + uint32_t *estimate; +}; + +// Removes stationary noise from each channel of the signal using a low pass +// filter. +void NoiseReductionApply(struct NoiseReductionState *state, uint32_t *signal); + +void NoiseReductionReset(struct NoiseReductionState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.c new file mode 100644 index 00000000..f963767e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.c @@ -0,0 +1,36 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.h" + +void NoiseReductionWriteMemmapPreamble( + FILE *fp, const struct NoiseReductionState *state) +{ + fprintf(fp, "static uint32_t noise_reduction_estimate[%zu];\n", + state->num_channels); + fprintf(fp, "\n"); +} + +void NoiseReductionWriteMemmap(FILE *fp, + const struct NoiseReductionState *state, + const char *variable) +{ + fprintf(fp, "%s->even_smoothing = %d;\n", variable, state->even_smoothing); + fprintf(fp, "%s->odd_smoothing = %d;\n", variable, state->odd_smoothing); + fprintf(fp, "%s->min_signal_remaining = %d;\n", variable, + state->min_signal_remaining); + fprintf(fp, "%s->num_channels = %d;\n", variable, state->num_channels); + + fprintf(fp, "%s->estimate = noise_reduction_estimate;\n", variable); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.h new file mode 100644 index 00000000..1a065a90 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_io.h @@ -0,0 +1,36 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_IO_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_IO_H_ + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void NoiseReductionWriteMemmapPreamble(FILE *fp, + const struct NoiseReductionState *state); +void NoiseReductionWriteMemmap(FILE *fp, + const struct NoiseReductionState *state, + const char *variable); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_IO_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_test.cc new file mode 100644 index 00000000..2840b091 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_test.cc @@ -0,0 +1,84 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int kNumChannels = 2; + +// Test noise reduction using default config values. +class NoiseReductionTestConfig { +public: + NoiseReductionTestConfig() + { + config_.smoothing_bits = 10; + config_.even_smoothing = 0.025; + config_.odd_smoothing = 0.06; + config_.min_signal_remaining = 0.05; + } + + struct NoiseReductionConfig config_; +}; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(NoiseReductionTest_TestNoiseReductionEstimate) +{ + NoiseReductionTestConfig config; + struct NoiseReductionState state; + TF_LITE_MICRO_EXPECT( + NoiseReductionPopulateState(&config.config_, &state, kNumChannels)); + + uint32_t signal[] = { 247311, 508620 }; + NoiseReductionApply(&state, signal); + + const uint32_t expected[] = { 6321887, 31248341 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.estimate[i], expected[i]); + } + + NoiseReductionFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(NoiseReductionTest_TestNoiseReduction) +{ + NoiseReductionTestConfig config; + struct NoiseReductionState state; + TF_LITE_MICRO_EXPECT( + NoiseReductionPopulateState(&config.config_, &state, kNumChannels)); + + uint32_t signal[] = { 247311, 508620 }; + NoiseReductionApply(&state, signal); + + const uint32_t expected[] = { 241137, 478104 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(signal[i], expected[i]); + } + + NoiseReductionFreeStateContents(&state); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.c new file mode 100644 index 00000000..d79c7856 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.c @@ -0,0 +1,48 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h" + +#include + +void NoiseReductionFillConfigWithDefaults(struct NoiseReductionConfig *config) +{ + config->smoothing_bits = 10; + config->even_smoothing = 0.025; + config->odd_smoothing = 0.06; + config->min_signal_remaining = 0.05; +} + +int NoiseReductionPopulateState(const struct NoiseReductionConfig *config, + struct NoiseReductionState *state, + int num_channels) +{ + state->smoothing_bits = config->smoothing_bits; + state->odd_smoothing = config->odd_smoothing * (1 << kNoiseReductionBits); + state->even_smoothing = config->even_smoothing * (1 << kNoiseReductionBits); + state->min_signal_remaining = + config->min_signal_remaining * (1 << kNoiseReductionBits); + state->num_channels = num_channels; + state->estimate = calloc(state->num_channels, sizeof(*state->estimate)); + if (state->estimate == NULL) { + fprintf(stderr, "Failed to alloc estimate buffer\n"); + return 0; + } + return 1; +} + +void NoiseReductionFreeStateContents(struct NoiseReductionState *state) +{ + free(state->estimate); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h new file mode 100644 index 00000000..f2e89944 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/noise_reduction_util.h @@ -0,0 +1,50 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_UTIL_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/noise_reduction.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct NoiseReductionConfig { + // scale the signal up by 2^(smoothing_bits) before reduction + int smoothing_bits; + // smoothing coefficient for even-numbered channels + float even_smoothing; + // smoothing coefficient for odd-numbered channels + float odd_smoothing; + // fraction of signal to preserve (1.0 disables this module) + float min_signal_remaining; +}; + +// Populates the NoiseReductionConfig with "sane" default values. +void NoiseReductionFillConfigWithDefaults(struct NoiseReductionConfig *config); + +// Allocates any buffers. +int NoiseReductionPopulateState(const struct NoiseReductionConfig *config, + struct NoiseReductionState *state, + int num_channels); + +// Frees any allocated buffers. +void NoiseReductionFreeStateContents(struct NoiseReductionState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_NOISE_REDUCTION_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.c new file mode 100644 index 00000000..7c92fd31 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.c @@ -0,0 +1,59 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/bits.h" + +int16_t WideDynamicFunction(const uint32_t x, const int16_t *lut) +{ + if (x <= 2) { + return lut[x]; + } + + const int16_t interval = MostSignificantBit32(x); + lut += 4 * interval - 6; + + const int16_t frac = + ((interval < 11) ? (x << (11 - interval)) : (x >> (interval - 11))) & + 0x3FF; + + int32_t result = ((int32_t)lut[2] * frac) >> 5; + result += (int32_t)((uint32_t)lut[1] << 5); + result *= frac; + result = (result + (1 << 14)) >> 15; + result += lut[0]; + return (int16_t)result; +} + +uint32_t PcanShrink(const uint32_t x) +{ + if (x < (2 << kPcanSnrBits)) { + return (x * x) >> (2 + 2 * kPcanSnrBits - kPcanOutputBits); + } else { + return (x >> (kPcanSnrBits - kPcanOutputBits)) - (1 << kPcanOutputBits); + } +} + +void PcanGainControlApply(struct PcanGainControlState *state, + uint32_t *signal) +{ + int i; + for (i = 0; i < state->num_channels; ++i) { + const uint32_t gain = + WideDynamicFunction(state->noise_estimate[i], state->gain_lut); + const uint32_t snr = ((uint64_t)signal[i] * gain) >> state->snr_shift; + signal[i] = PcanShrink(snr); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h new file mode 100644 index 00000000..47b61d91 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h @@ -0,0 +1,47 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_PCAN_GAIN_CONTROL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_PCAN_GAIN_CONTROL_H_ + +#include +#include + +#define kPcanSnrBits 12 +#define kPcanOutputBits 6 + +#ifdef __cplusplus +extern "C" { +#endif + +// Details at https://research.google/pubs/pub45911.pdf +struct PcanGainControlState { + int enable_pcan; + uint32_t *noise_estimate; + int num_channels; + int16_t *gain_lut; + int32_t snr_shift; +}; + +int16_t WideDynamicFunction(const uint32_t x, const int16_t *lut); + +uint32_t PcanShrink(const uint32_t x); + +void PcanGainControlApply(struct PcanGainControlState *state, uint32_t *signal); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_PCAN_GAIN_CONTROL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_test.cc new file mode 100644 index 00000000..05a8dd40 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_test.cc @@ -0,0 +1,67 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int kNumChannels = 2; +const int kSmoothingBits = 10; +const int kCorrectionBits = -1; + +// Test pcan auto gain control using default config values. +class PcanGainControlTestConfig { +public: + PcanGainControlTestConfig() + { + config_.enable_pcan = 1; + config_.strength = 0.95; + config_.offset = 80.0; + config_.gain_bits = 21; + } + + struct PcanGainControlConfig config_; +}; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(PcanGainControlTest_TestPcanGainControl) +{ + uint32_t estimate[] = { 6321887, 31248341 }; + PcanGainControlTestConfig config; + struct PcanGainControlState state; + TF_LITE_MICRO_EXPECT(PcanGainControlPopulateState( + &config.config_, &state, estimate, kNumChannels, kSmoothingBits, + kCorrectionBits)); + + uint32_t signal[] = { 241137, 478104 }; + PcanGainControlApply(&state, signal); + + const uint32_t expected[] = { 3578, 1533 }; + TF_LITE_MICRO_EXPECT_EQ(state.num_channels, + sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.num_channels; ++i) { + TF_LITE_MICRO_EXPECT_EQ(signal[i], expected[i]); + } + + PcanGainControlFreeStateContents(&state); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.c new file mode 100644 index 00000000..1d9d0957 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.c @@ -0,0 +1,96 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h" + +#include +#include + +#define kint16max 0x00007FFF + +void PcanGainControlFillConfigWithDefaults( + struct PcanGainControlConfig *config) +{ + config->enable_pcan = 0; + config->strength = 0.95; + config->offset = 80.0; + config->gain_bits = 21; +} + +int16_t PcanGainLookupFunction(const struct PcanGainControlConfig *config, + int32_t input_bits, uint32_t x) +{ + const float x_as_float = ((float)x) / ((uint32_t)1 << input_bits); + const float gain_as_float = + ((uint32_t)1 << config->gain_bits) * + powf(x_as_float + config->offset, -config->strength); + + if (gain_as_float > kint16max) { + return kint16max; + } + return (int16_t)(gain_as_float + 0.5f); +} + +int PcanGainControlPopulateState(const struct PcanGainControlConfig *config, + struct PcanGainControlState *state, + uint32_t *noise_estimate, + const int num_channels, + const uint16_t smoothing_bits, + const int32_t input_correction_bits) +{ + state->enable_pcan = config->enable_pcan; + if (!state->enable_pcan) { + return 1; + } + state->noise_estimate = noise_estimate; + state->num_channels = num_channels; + state->gain_lut = malloc(kWideDynamicFunctionLUTSize * sizeof(int16_t)); + if (state->gain_lut == NULL) { + fprintf(stderr, "Failed to allocate gain LUT\n"); + return 0; + } + state->snr_shift = config->gain_bits - input_correction_bits - kPcanSnrBits; + + const int32_t input_bits = smoothing_bits - input_correction_bits; + state->gain_lut[0] = PcanGainLookupFunction(config, input_bits, 0); + state->gain_lut[1] = PcanGainLookupFunction(config, input_bits, 1); + state->gain_lut -= 6; + int interval; + for (interval = 2; interval <= kWideDynamicFunctionBits; ++interval) { + const uint32_t x0 = (uint32_t)1 << (interval - 1); + const uint32_t x1 = x0 + (x0 >> 1); + const uint32_t x2 = + (interval == kWideDynamicFunctionBits) ? x0 + (x0 - 1) : 2 * x0; + + const int16_t y0 = PcanGainLookupFunction(config, input_bits, x0); + const int16_t y1 = PcanGainLookupFunction(config, input_bits, x1); + const int16_t y2 = PcanGainLookupFunction(config, input_bits, x2); + + const int32_t diff1 = (int32_t)y1 - y0; + const int32_t diff2 = (int32_t)y2 - y0; + const int32_t a1 = 4 * diff1 - diff2; + const int32_t a2 = diff2 - a1; + + state->gain_lut[4 * interval] = y0; + state->gain_lut[4 * interval + 1] = (int16_t)a1; + state->gain_lut[4 * interval + 2] = (int16_t)a2; + } + state->gain_lut += 6; + return 1; +} + +void PcanGainControlFreeStateContents(struct PcanGainControlState *state) +{ + free(state->gain_lut); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h new file mode 100644 index 00000000..364f232e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control_util.h @@ -0,0 +1,57 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_PCAN_GAIN_CONTROL_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_PCAN_GAIN_CONTROL_UTIL_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/pcan_gain_control.h" + +#define kWideDynamicFunctionBits 32 +#define kWideDynamicFunctionLUTSize (4 * kWideDynamicFunctionBits - 3) + +#ifdef __cplusplus +extern "C" { +#endif + +struct PcanGainControlConfig { + // set to false (0) to disable this module + int enable_pcan; + // gain normalization exponent (0.0 disables, 1.0 full strength) + float strength; + // positive value added in the normalization denominator + float offset; + // number of fractional bits in the gain + int gain_bits; +}; + +void PcanGainControlFillConfigWithDefaults( + struct PcanGainControlConfig *config); + +int16_t PcanGainLookupFunction(const struct PcanGainControlConfig *config, + int32_t input_bits, uint32_t x); + +int PcanGainControlPopulateState(const struct PcanGainControlConfig *config, + struct PcanGainControlState *state, + uint32_t *noise_estimate, + const int num_channels, + const uint16_t smoothing_bits, + const int32_t input_correction_bits); + +void PcanGainControlFreeStateContents(struct PcanGainControlState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_PCAN_GAIN_CONTROL_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.c new file mode 100644 index 00000000..ec3a7526 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.c @@ -0,0 +1,72 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/window.h" + +#include + +int WindowProcessSamples(struct WindowState *state, const int16_t *samples, + size_t num_samples, size_t *num_samples_read) +{ + const int size = state->size; + + // Copy samples from the samples buffer over to our local input. + size_t max_samples_to_copy = state->size - state->input_used; + if (max_samples_to_copy > num_samples) { + max_samples_to_copy = num_samples; + } + memcpy(state->input + state->input_used, samples, + max_samples_to_copy * sizeof(*samples)); + *num_samples_read = max_samples_to_copy; + state->input_used += max_samples_to_copy; + + if (state->input_used < state->size) { + // We don't have enough samples to compute a window. + return 0; + } + + // Apply the window to the input. + const int16_t *coefficients = state->coefficients; + const int16_t *input = state->input; + int16_t *output = state->output; + int i; + int16_t max_abs_output_value = 0; + for (i = 0; i < size; ++i) { + int16_t new_value = + (((int32_t)*input++) * *coefficients++) >> kFrontendWindowBits; + *output++ = new_value; + if (new_value < 0) { + new_value = -new_value; + } + if (new_value > max_abs_output_value) { + max_abs_output_value = new_value; + } + } + // Shuffle the input down by the step size, and update how much we have used. + memmove(state->input, state->input + state->step, + sizeof(*state->input) * (state->size - state->step)); + state->input_used -= state->step; + state->max_abs_output_value = max_abs_output_value; + + // Indicate that the output buffer is valid for the next stage. + return 1; +} + +void WindowReset(struct WindowState *state) +{ + memset(state->input, 0, state->size * sizeof(*state->input)); + memset(state->output, 0, state->size * sizeof(*state->output)); + state->input_used = 0; + state->max_abs_output_value = 0; +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.h new file mode 100644 index 00000000..5f6d1bae --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window.h @@ -0,0 +1,49 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_H_ + +#include +#include + +#define kFrontendWindowBits 12 + +#ifdef __cplusplus +extern "C" { +#endif + +struct WindowState { + size_t size; + int16_t *coefficients; + size_t step; + + int16_t *input; + size_t input_used; + int16_t *output; + int16_t max_abs_output_value; +}; + +// Applies a window to the samples coming in, stepping forward at the given +// rate. +int WindowProcessSamples(struct WindowState *state, const int16_t *samples, + size_t num_samples, size_t *num_samples_read); + +void WindowReset(struct WindowState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.c new file mode 100644 index 00000000..e9a51b08 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.c @@ -0,0 +1,45 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/window_io.h" + +void WindowWriteMemmapPreamble(FILE *fp, const struct WindowState *state) +{ + fprintf(fp, "static int16_t window_coefficients[] = {\n"); + int i; + for (i = 0; i < state->size; ++i) { + fprintf(fp, "%d", state->coefficients[i]); + if (i < state->size - 1) { + fprintf(fp, ", "); + } + } + fprintf(fp, "};\n"); + fprintf(fp, "static int16_t window_input[%zu];\n", state->size); + fprintf(fp, "static int16_t window_output[%zu];\n", state->size); + fprintf(fp, "\n"); +} + +void WindowWriteMemmap(FILE *fp, const struct WindowState *state, + const char *variable) +{ + fprintf(fp, "%s->size = %zu;\n", variable, state->size); + fprintf(fp, "%s->coefficients = window_coefficients;\n", variable); + fprintf(fp, "%s->step = %zu;\n", variable, state->step); + + fprintf(fp, "%s->input = window_input;\n", variable); + fprintf(fp, "%s->input_used = %zu;\n", variable, state->input_used); + fprintf(fp, "%s->output = window_output;\n", variable); + fprintf(fp, "%s->max_abs_output_value = %d;\n", variable, + state->max_abs_output_value); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.h new file mode 100644 index 00000000..d8c44731 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_io.h @@ -0,0 +1,34 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_IO_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_IO_H_ + +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/window.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void WindowWriteMemmapPreamble(FILE *fp, const struct WindowState *state); +void WindowWriteMemmap(FILE *fp, const struct WindowState *state, + const char *variable); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_IO_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_test.cc b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_test.cc new file mode 100644 index 00000000..166fd21b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_test.cc @@ -0,0 +1,187 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/window.h" + +#include "tensorflow/lite/experimental/microfrontend/lib/window_util.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +const int kSampleRate = 1000; +const int kWindowSamples = 25; +const int kStepSamples = 10; +const int16_t kFakeAudioData[] = { + 0, 32767, 0, -32768, 0, 32767, 0, -32768, 0, 32767, 0, -32768, + 0, 32767, 0, -32768, 0, 32767, 0, -32768, 0, 32767, 0, -32768, + 0, 32767, 0, -32768, 0, 32767, 0, -32768, 0, 32767, 0, -32768 +}; + +// Test window function behaviors using default config values. +class WindowTestConfig { +public: + WindowTestConfig() + { + config_.size_ms = 25; + config_.step_size_ms = 10; + } + + struct WindowConfig config_; +}; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(WindowState_CheckCoefficients) +{ + WindowTestConfig config; + struct WindowState state; + TF_LITE_MICRO_EXPECT( + WindowPopulateState(&config.config_, &state, kSampleRate)); + + const int16_t expected[] = { 16, 144, 391, 743, 1176, 1664, 2177, + 2681, 3145, 3541, 3843, 4032, 4096, 4032, + 3843, 3541, 3145, 2681, 2177, 1664, 1176, + 743, 391, 144, 16 }; + TF_LITE_MICRO_EXPECT_EQ(state.size, sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.coefficients[i], expected[i]); + } + + WindowFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(WindowState_CheckResidualInput) +{ + WindowTestConfig config; + struct WindowState state; + TF_LITE_MICRO_EXPECT( + WindowPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), &num_samples_read)); + + int i; + for (i = kStepSamples; i < kWindowSamples; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.input[i - kStepSamples], kFakeAudioData[i]); + } + + WindowFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(WindowState_CheckOutputValues) +{ + WindowTestConfig config; + struct WindowState state; + TF_LITE_MICRO_EXPECT( + WindowPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), &num_samples_read)); + + const int16_t expected[] = { + 0, 1151, 0, -5944, 0, 13311, 0, -21448, 0, 28327, 0, -32256, 0, 32255, + 0, -28328, 0, 21447, 0, -13312, 0, 5943, 0, -1152, 0 + }; + TF_LITE_MICRO_EXPECT_EQ(state.size, sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.output[i], expected[i]); + } + + WindowFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(WindowState_CheckMaxAbsValue) +{ + WindowTestConfig config; + struct WindowState state; + TF_LITE_MICRO_EXPECT( + WindowPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), &num_samples_read)); + + TF_LITE_MICRO_EXPECT_EQ(state.max_abs_output_value, 32256); + + WindowFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(WindowState_CheckConsecutiveWindow) +{ + WindowTestConfig config; + struct WindowState state; + TF_LITE_MICRO_EXPECT( + WindowPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), &num_samples_read)); + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData + kWindowSamples, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - kWindowSamples, + &num_samples_read)); + + const int16_t expected[] = { + 0, -1152, 0, 5943, 0, -13312, 0, 21447, 0, -28328, 0, 32255, 0, -32256, + 0, 28327, 0, -21448, 0, 13311, 0, -5944, 0, 1151, 0 + }; + TF_LITE_MICRO_EXPECT_EQ(state.size, sizeof(expected) / sizeof(expected[0])); + int i; + for (i = 0; i < state.size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(state.output[i], expected[i]); + } + + WindowFreeStateContents(&state); +} + +TF_LITE_MICRO_TEST(WindowState_CheckNotEnoughSamples) +{ + WindowTestConfig config; + struct WindowState state; + TF_LITE_MICRO_EXPECT( + WindowPopulateState(&config.config_, &state, kSampleRate)); + size_t num_samples_read; + + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]), &num_samples_read)); + TF_LITE_MICRO_EXPECT(WindowProcessSamples( + &state, kFakeAudioData + kWindowSamples, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - kWindowSamples, + &num_samples_read)); + TF_LITE_MICRO_EXPECT_EQ( + false, WindowProcessSamples( + &state, kFakeAudioData + kWindowSamples + kStepSamples, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - + kWindowSamples - kStepSamples, + &num_samples_read)); + + TF_LITE_MICRO_EXPECT_EQ( + state.input_used, + sizeof(kFakeAudioData) / sizeof(kFakeAudioData[0]) - 2 * kStepSamples); + + WindowFreeStateContents(&state); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.c b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.c new file mode 100644 index 00000000..2195c0d4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.c @@ -0,0 +1,76 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/experimental/microfrontend/lib/window_util.h" + +#include +#include +#include +#include + +// Some platforms don't have M_PI +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +void WindowFillConfigWithDefaults(struct WindowConfig *config) +{ + config->size_ms = 25; + config->step_size_ms = 10; +} + +int WindowPopulateState(const struct WindowConfig *config, + struct WindowState *state, int sample_rate) +{ + state->size = config->size_ms * sample_rate / 1000; + state->step = config->step_size_ms * sample_rate / 1000; + + state->coefficients = malloc(state->size * sizeof(*state->coefficients)); + if (state->coefficients == NULL) { + fprintf(stderr, "Failed to allocate window coefficients\n"); + return 0; + } + + // Populate the window values. + const float arg = M_PI * 2.0 / ((float)state->size); + int i; + for (i = 0; i < state->size; ++i) { + float float_value = 0.5 - (0.5 * cos(arg * (i + 0.5))); + // Scale it to fixed point and round it. + state->coefficients[i] = + floor(float_value * (1 << kFrontendWindowBits) + 0.5); + } + + state->input_used = 0; + state->input = malloc(state->size * sizeof(*state->input)); + if (state->input == NULL) { + fprintf(stderr, "Failed to allocate window input\n"); + return 0; + } + + state->output = malloc(state->size * sizeof(*state->output)); + if (state->output == NULL) { + fprintf(stderr, "Failed to allocate window output\n"); + return 0; + } + + return 1; +} + +void WindowFreeStateContents(struct WindowState *state) +{ + free(state->coefficients); + free(state->input); + free(state->output); +} diff --git a/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.h b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.h new file mode 100644 index 00000000..2517e378 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/experimental/microfrontend/lib/window_util.h @@ -0,0 +1,45 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_UTIL_H_ +#define TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_UTIL_H_ + +#include "tensorflow/lite/experimental/microfrontend/lib/window.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct WindowConfig { + // length of window frame in milliseconds + size_t size_ms; + // length of step for next frame in milliseconds + size_t step_size_ms; +}; + +// Populates the WindowConfig with "sane" default values. +void WindowFillConfigWithDefaults(struct WindowConfig *config); + +// Allocates any buffers. +int WindowPopulateState(const struct WindowConfig *config, + struct WindowState *state, int sample_rate); + +// Frees any allocated buffers. +void WindowFreeStateContents(struct WindowState *state); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // TENSORFLOW_LITE_EXPERIMENTAL_MICROFRONTEND_LIB_WINDOW_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/common.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/common.h new file mode 100644 index 00000000..f1d0a0d0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/common.h @@ -0,0 +1,1080 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_COMMON_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_COMMON_H_ + +#ifndef ALLOW_SLOW_GENERIC_DEPTHWISECONV_FALLBACK +#ifdef GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK +#define ALLOW_SLOW_GENERIC_DEPTHWISECONV_FALLBACK +#endif +#endif + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/optimized/neon_check.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +constexpr int kReverseShift = -1; + +inline void GetActivationMinMax(FusedActivationFunctionType ac, + float *output_activation_min, + float *output_activation_max) +{ + switch (ac) { + case FusedActivationFunctionType::kNone: + *output_activation_min = std::numeric_limits::lowest(); + *output_activation_max = std::numeric_limits::max(); + break; + case FusedActivationFunctionType::kRelu: + *output_activation_min = 0.f; + *output_activation_max = std::numeric_limits::max(); + break; + case FusedActivationFunctionType::kRelu1: + *output_activation_min = -1.f; + *output_activation_max = 1.f; + break; + case FusedActivationFunctionType::kRelu6: + *output_activation_min = 0.f; + *output_activation_max = 6.f; + break; + } +} + +template +inline T ActivationFunctionWithMinMax(T x, T output_activation_min, + T output_activation_max) +{ + using std::max; + using std::min; + return min(max(x, output_activation_min), output_activation_max); +} + +// Legacy function, left for compatibility only. +template +float ActivationFunction(float x) +{ + float output_activation_min, output_activation_max; + GetActivationMinMax(Ac, &output_activation_min, &output_activation_max); + return ActivationFunctionWithMinMax(x, output_activation_min, + output_activation_max); +} + +inline void BiasAndClamp(float clamp_min, float clamp_max, int bias_size, + const float *bias_data, int array_size, + float *array_data) +{ + // Note: see b/132215220: in May 2019 we thought it would be OK to replace + // this with the Eigen one-liner: + // return (array.colwise() + bias).cwiseMin(clamp_max).cwiseMin(clamp_max). + // This turned out to severely regress performance: +4ms (i.e. 8%) on + // MobileNet v2 / 1.0 / 224. So we keep custom NEON code for now. + TFLITE_DCHECK_EQ((array_size % bias_size), 0); +#ifdef USE_NEON + float *array_ptr = array_data; + float *array_end_ptr = array_ptr + array_size; + const auto clamp_min_vec = vdupq_n_f32(clamp_min); + const auto clamp_max_vec = vdupq_n_f32(clamp_max); + for (; array_ptr != array_end_ptr; array_ptr += bias_size) { + int i = 0; + for (; i <= bias_size - 16; i += 16) { + auto b0 = vld1q_f32(bias_data + i); + auto b1 = vld1q_f32(bias_data + i + 4); + auto b2 = vld1q_f32(bias_data + i + 8); + auto b3 = vld1q_f32(bias_data + i + 12); + auto a0 = vld1q_f32(array_ptr + i); + auto a1 = vld1q_f32(array_ptr + i + 4); + auto a2 = vld1q_f32(array_ptr + i + 8); + auto a3 = vld1q_f32(array_ptr + i + 12); + auto x0 = vaddq_f32(a0, b0); + auto x1 = vaddq_f32(a1, b1); + auto x2 = vaddq_f32(a2, b2); + auto x3 = vaddq_f32(a3, b3); + x0 = vmaxq_f32(clamp_min_vec, x0); + x1 = vmaxq_f32(clamp_min_vec, x1); + x2 = vmaxq_f32(clamp_min_vec, x2); + x3 = vmaxq_f32(clamp_min_vec, x3); + x0 = vminq_f32(clamp_max_vec, x0); + x1 = vminq_f32(clamp_max_vec, x1); + x2 = vminq_f32(clamp_max_vec, x2); + x3 = vminq_f32(clamp_max_vec, x3); + vst1q_f32(array_ptr + i, x0); + vst1q_f32(array_ptr + i + 4, x1); + vst1q_f32(array_ptr + i + 8, x2); + vst1q_f32(array_ptr + i + 12, x3); + } + for (; i <= bias_size - 4; i += 4) { + auto b = vld1q_f32(bias_data + i); + auto a = vld1q_f32(array_ptr + i); + auto x = vaddq_f32(a, b); + x = vmaxq_f32(clamp_min_vec, x); + x = vminq_f32(clamp_max_vec, x); + vst1q_f32(array_ptr + i, x); + } + for (; i < bias_size; i++) { + array_ptr[i] = ActivationFunctionWithMinMax(array_ptr[i] + bias_data[i], + clamp_min, clamp_max); + } + } +#else // not NEON + for (int array_offset = 0; array_offset < array_size; + array_offset += bias_size) { + for (int i = 0; i < bias_size; i++) { + array_data[array_offset + i] = ActivationFunctionWithMinMax( + array_data[array_offset + i] + bias_data[i], clamp_min, clamp_max); + } + } +#endif +} + +inline int32_t MultiplyByQuantizedMultiplierSmallerThanOneExp( + int32_t x, int32_t quantized_multiplier, int left_shift) +{ + using gemmlowp::RoundingDivideByPOT; + using gemmlowp::SaturatingRoundingDoublingHighMul; + return RoundingDivideByPOT( + SaturatingRoundingDoublingHighMul(x, quantized_multiplier), -left_shift); +} + +inline int32_t MultiplyByQuantizedMultiplierGreaterThanOne( + int32_t x, int32_t quantized_multiplier, int left_shift) +{ + using gemmlowp::SaturatingRoundingDoublingHighMul; + return SaturatingRoundingDoublingHighMul(x * (1 << left_shift), + quantized_multiplier); +} + +inline int32_t MultiplyByQuantizedMultiplier(int32_t x, + int32_t quantized_multiplier, + int shift) +{ + using gemmlowp::RoundingDivideByPOT; + using gemmlowp::SaturatingRoundingDoublingHighMul; + int left_shift = shift > 0 ? shift : 0; + int right_shift = shift > 0 ? 0 : -shift; + return RoundingDivideByPOT(SaturatingRoundingDoublingHighMul( + x * (1 << left_shift), quantized_multiplier), + right_shift); +} + +inline int32_t MultiplyByQuantizedMultiplier(int64_t x, + int32_t quantized_multiplier, + int shift) +{ + // Inputs: + // - quantized_multiplier has fixed point at bit 31 + // - shift is -31 to +7 (negative for right shift) + // + // Assumptions: The following input ranges are assumed + // - quantize_scale>=0 (the usual range is (1<<30) to (1>>31)-1) + // - scaling is chosen so final scaled result fits in int32_t + // - input x is in the range -(1<<47) <= x < (1<<47) + assert(quantized_multiplier >= 0); + assert(shift >= -31 && shift < 8); + assert(x >= -(static_cast(1) << 47) && + x < (static_cast(1) << 47)); + + int32_t reduced_multiplier = (quantized_multiplier < 0x7FFF0000) ? ((quantized_multiplier + (1 << 15)) >> 16) : 0x7FFF; + int total_shift = 15 - shift; + x = (x * (int64_t)reduced_multiplier) + ((int64_t)1 << (total_shift - 1)); + int32_t result = x >> total_shift; + return result; +} + +#ifdef USE_NEON +// Round uses ARM's rounding shift right. +inline int32x4x4_t MultiplyByQuantizedMultiplier4Rows( + int32x4x4_t input_val, int32_t quantized_multiplier, int shift) +{ + const int left_shift = std::max(shift, 0); + const int right_shift = std::min(shift, 0); + int32x4x4_t result; + + int32x4_t multiplier_dup = vdupq_n_s32(quantized_multiplier); + int32x4_t left_shift_dup = vdupq_n_s32(left_shift); + int32x4_t right_shift_dup = vdupq_n_s32(right_shift); + + result.val[0] = + vrshlq_s32(vqrdmulhq_s32(vshlq_s32(input_val.val[0], left_shift_dup), + multiplier_dup), + right_shift_dup); + + result.val[1] = + vrshlq_s32(vqrdmulhq_s32(vshlq_s32(input_val.val[1], left_shift_dup), + multiplier_dup), + right_shift_dup); + + result.val[2] = + vrshlq_s32(vqrdmulhq_s32(vshlq_s32(input_val.val[2], left_shift_dup), + multiplier_dup), + right_shift_dup); + + result.val[3] = + vrshlq_s32(vqrdmulhq_s32(vshlq_s32(input_val.val[3], left_shift_dup), + multiplier_dup), + right_shift_dup); + + return result; +} +#endif + +template +int CountLeadingZeros(T integer_input) +{ + static_assert(std::is_unsigned::value, + "Only unsigned integer types handled."); +#if defined(__GNUC__) + return integer_input ? __builtin_clz(integer_input) : std::numeric_limits::digits; +#else + if (integer_input == 0) { + return std::numeric_limits::digits; + } + + const T one_in_leading_positive = static_cast(1) + << (std::numeric_limits::digits - 1); + int leading_zeros = 0; + while (integer_input < one_in_leading_positive) { + integer_input <<= 1; + ++leading_zeros; + } + return leading_zeros; +#endif +} + +template +inline int CountLeadingSignBits(T integer_input) +{ + static_assert(std::is_signed::value, "Only signed integer types handled."); +#if defined(__GNUC__) && !defined(__clang__) + return integer_input ? __builtin_clrsb(integer_input) : std::numeric_limits::digits; +#else + using U = typename std::make_unsigned::type; + return integer_input >= 0 ? CountLeadingZeros(static_cast(integer_input)) - 1 : integer_input != std::numeric_limits::min() ? CountLeadingZeros(2 * static_cast(-integer_input) - 1) : + 0; +#endif +} + +// Use "count leading zeros" helper functions to do a fast Floor(log_2(x)). +template +inline Integer FloorLog2(Integer n) +{ + static_assert(std::is_integral::value, ""); + static_assert(std::is_signed::value, ""); + static_assert(sizeof(Integer) == 4 || sizeof(Integer) == 8, ""); + TFLITE_CHECK_GT(n, 0); + if (sizeof(Integer) == 4) { + return 30 - CountLeadingSignBits(n); + } else { + return 62 - CountLeadingSignBits(n); + } +} + +// generate INT16 LUT for function(), e.g., table exp(x) and 1/(1+x) used in +// softmax +// func - the function to build the LUT for (e.g exp(x)) +// min,max - table limits +// table - pointer to buffer +// num - number of elements in the LUT +inline void gen_lut(double (*func)(double), double min, double max, + int16_t *table, const int num) +{ + // size of table should equal to num + 1 + // last element only for slope calculation + double step = (max - min) / (num - 1); + double half_step = step / 2.0; + for (int i = 0; i < num - 1; i++) { + double sample_val = TfLiteRound(func(min + i * step) * 32768.0); + double midpoint_interp_val = + TfLiteRound((func(min + (i + 1) * step) * 32768.0 + + TfLiteRound(func(min + i * step) * 32768.0)) / + 2.0); + double midpoint_val = + TfLiteRound(func(min + i * step + half_step) * 32768.0); + double midpoint_err = midpoint_interp_val - midpoint_val; + double bias = TfLiteRound(midpoint_err / 2.0); + table[i] = std::min(std::max(sample_val - bias, -32768.0), + 32767.0); + } + table[num - 1] = std::min( + std::max(TfLiteRound(func(max) * 32768.0), -32768.0), 32767.0); +} + +// generate INT16 LUT for function(), e.g., table exp(x) and 1/(1+x) used in +// softmax +// func - the function to build the LUT for (e.g exp(x)) +// min,max - table limits +// table - pointer to buffer +// num - number of elements in the LUT +inline void gen_lut(float (*func)(float), float min, float max, int16_t *table, + const int num) +{ + // size of table should equal to num + 1 + // last element only for slope calculation + float step = (max - min) / (num - 1); + float half_step = step / 2.0f; + for (int i = 0; i < num - 1; i++) { + float sample_val = TfLiteRound(func(min + i * step) * 32768.0f); + float midpoint_interp_val = + TfLiteRound((func(min + (i + 1) * step) * 32768.0f + + TfLiteRound(func(min + i * step) * 32768.0f)) / + 2.0f); + float midpoint_val = + TfLiteRound(func(min + i * step + half_step) * 32768.0f); + float midpoint_err = midpoint_interp_val - midpoint_val; + float bias = TfLiteRound(midpoint_err / 2.0f); + table[i] = std::min(std::max(sample_val - bias, -32768.0f), + 32767.0f); + } + table[num - 1] = std::min( + std::max(TfLiteRound(func(max) * 32768.0f), -32768.0f), 32767.0f); +} + +// int16_t func table lookup, e.g., lookup exp() and 1/(1+x) used in softmax +inline int16_t generic_int16_table_lookup(int16_t value, const int16_t *lut) +{ + // 512 base value, lut[513] only for calculate slope + uint16_t index = static_cast(256 + (value >> 7)); + assert(index < 512 && "LUT index out of range."); + int16_t offset = value & 0x7f; + + // base and slope are Q0.15 + int16_t base = lut[index]; + int16_t slope = lut[index + 1] - lut[index]; + + // Q0.15 * Q0.7 = Q0.22 + // Round and convert from Q0.22 to Q0.15 + int32_t delta = (static_cast(slope) * offset + 64) >> 7; + + // Q0.15 + Q0.15 + return base + delta; +} + +// Table of sigmoid(i/24) at 0.16 format - 256 elements. + +// We use combined sigmoid and tanh look-up table, since +// tanh(x) = 2*sigmoid(2*x) -1. +// Both functions are symmetric, so the LUT table is only needed +// for the absolute value of the input. +static const uint16_t sigmoid_table_uint16[256] = { + 32768, 33451, 34133, 34813, 35493, 36169, 36843, 37513, 38180, 38841, 39498, + 40149, 40794, 41432, 42064, 42688, 43304, 43912, 44511, 45102, 45683, 46255, + 46817, 47369, 47911, 48443, 48964, 49475, 49975, 50464, 50942, 51409, 51865, + 52311, 52745, 53169, 53581, 53983, 54374, 54755, 55125, 55485, 55834, 56174, + 56503, 56823, 57133, 57433, 57724, 58007, 58280, 58544, 58800, 59048, 59288, + 59519, 59743, 59959, 60168, 60370, 60565, 60753, 60935, 61110, 61279, 61441, + 61599, 61750, 61896, 62036, 62172, 62302, 62428, 62549, 62666, 62778, 62886, + 62990, 63090, 63186, 63279, 63368, 63454, 63536, 63615, 63691, 63765, 63835, + 63903, 63968, 64030, 64090, 64148, 64204, 64257, 64308, 64357, 64405, 64450, + 64494, 64536, 64576, 64614, 64652, 64687, 64721, 64754, 64786, 64816, 64845, + 64873, 64900, 64926, 64950, 64974, 64997, 65019, 65039, 65060, 65079, 65097, + 65115, 65132, 65149, 65164, 65179, 65194, 65208, 65221, 65234, 65246, 65258, + 65269, 65280, 65291, 65301, 65310, 65319, 65328, 65337, 65345, 65352, 65360, + 65367, 65374, 65381, 65387, 65393, 65399, 65404, 65410, 65415, 65420, 65425, + 65429, 65433, 65438, 65442, 65445, 65449, 65453, 65456, 65459, 65462, 65465, + 65468, 65471, 65474, 65476, 65479, 65481, 65483, 65485, 65488, 65489, 65491, + 65493, 65495, 65497, 65498, 65500, 65501, 65503, 65504, 65505, 65507, 65508, + 65509, 65510, 65511, 65512, 65513, 65514, 65515, 65516, 65517, 65517, 65518, + 65519, 65520, 65520, 65521, 65522, 65522, 65523, 65523, 65524, 65524, 65525, + 65525, 65526, 65526, 65526, 65527, 65527, 65528, 65528, 65528, 65529, 65529, + 65529, 65529, 65530, 65530, 65530, 65530, 65531, 65531, 65531, 65531, 65531, + 65532, 65532, 65532, 65532, 65532, 65532, 65533, 65533, 65533, 65533, 65533, + 65533, 65533, 65533, 65534, 65534, 65534, 65534, 65534, 65534, 65534, 65534, + 65534, 65534, 65535 +}; + +// TODO(b/77858996): Add these to gemmlowp. +template +IntegerType SaturatingAddNonGemmlowp(IntegerType a, IntegerType b) +{ + static_assert(std::is_same::value, "unimplemented"); + return a; +} + +template <> +inline std::int32_t SaturatingAddNonGemmlowp(std::int32_t a, std::int32_t b) +{ + std::int64_t a64 = a; + std::int64_t b64 = b; + std::int64_t sum = a64 + b64; + return static_cast(std::min( + static_cast(std::numeric_limits::max()), + std::max( + static_cast(std::numeric_limits::min()), + sum))); +} + +template +gemmlowp::FixedPoint SaturatingAddNonGemmlowp( + gemmlowp::FixedPoint a, + gemmlowp::FixedPoint b) +{ + return gemmlowp::FixedPoint::FromRaw( + SaturatingAddNonGemmlowp(a.raw(), b.raw())); +} + +template +IntegerType SaturatingSub(IntegerType a, IntegerType b) +{ + static_assert(std::is_same::value, "unimplemented"); + return a; +} + +template <> +inline std::int16_t SaturatingSub(std::int16_t a, std::int16_t b) +{ + std::int32_t a32 = a; + std::int32_t b32 = b; + std::int32_t diff = a32 - b32; + return static_cast( + std::min(static_cast(32767), + std::max(static_cast(-32768), diff))); +} + +template <> +inline std::int32_t SaturatingSub(std::int32_t a, std::int32_t b) +{ + std::int64_t a64 = a; + std::int64_t b64 = b; + std::int64_t diff = a64 - b64; + return static_cast(std::min( + static_cast(std::numeric_limits::max()), + std::max( + static_cast(std::numeric_limits::min()), + diff))); +} + +template +gemmlowp::FixedPoint SaturatingSub( + gemmlowp::FixedPoint a, + gemmlowp::FixedPoint b) +{ + return gemmlowp::FixedPoint::FromRaw( + SaturatingSub(a.raw(), b.raw())); +} +// End section to be moved to gemmlowp. + +template +IntegerType SaturatingRoundingMultiplyByPOTParam(IntegerType x, int exponent) +{ + if (exponent == 0) { + return x; + } + using ScalarIntegerType = + typename gemmlowp::FixedPointRawTypeTraits::ScalarRawType; + const IntegerType min = + gemmlowp::Dup(std::numeric_limits::min()); + const IntegerType max = + gemmlowp::Dup(std::numeric_limits::max()); + const int ScalarIntegerTypeBits = 8 * sizeof(ScalarIntegerType); + + const std::int32_t threshold = + ((1 << (ScalarIntegerTypeBits - 1 - exponent)) - 1); + const IntegerType positive_mask = + gemmlowp::MaskIfGreaterThan(x, gemmlowp::Dup(threshold)); + const IntegerType negative_mask = + gemmlowp::MaskIfLessThan(x, gemmlowp::Dup(-threshold)); + + IntegerType result = gemmlowp::ShiftLeft(x, exponent); + result = gemmlowp::SelectUsingMask(positive_mask, max, result); + result = gemmlowp::SelectUsingMask(negative_mask, min, result); + return result; +} + +// If we want to leave IntegerBits fixed, then multiplication +// by a power of two has to be saturating/rounding, not exact anymore. +template +gemmlowp::FixedPoint +SaturatingRoundingMultiplyByPOTParam( + gemmlowp::FixedPoint a, int exponent) +{ + return gemmlowp::FixedPoint::FromRaw( + SaturatingRoundingMultiplyByPOTParam(a.raw(), exponent)); +} + +// Convert int32_t multiplier to int16_t with rounding. +inline void DownScaleInt32ToInt16Multiplier(int32_t multiplier_int32_t, + int16_t *multiplier_int16_t) +{ + TFLITE_DCHECK_GE(multiplier_int32_t, 0); + static constexpr int32_t kRoundingOffset = 1 << 15; + if (multiplier_int32_t >= + std::numeric_limits::max() - kRoundingOffset) { + *multiplier_int16_t = std::numeric_limits::max(); + return; + } + const int32_t result = (multiplier_int32_t + kRoundingOffset) >> 16; + TFLITE_DCHECK_LE(result << 16, multiplier_int32_t + kRoundingOffset); + TFLITE_DCHECK_GT(result << 16, multiplier_int32_t - kRoundingOffset); + *multiplier_int16_t = result; + TFLITE_DCHECK_EQ(*multiplier_int16_t, result); +} + +// Minimum output bits to accommodate log of maximum input range. It actually +// does not matter if one considers, say, [-64,64] or [-64,64). +// +// For example, run this through Octave: +// [0:127; ... +// ceil(log(abs( log(2.^(0:127))+1 ))/log(2)); ... +// ceil(log(abs( log(2.^(0:127))+1 ))/log(2))] +constexpr int min_log_x_output_bits(int input_bits) +{ + return input_bits > 90 ? 7 : input_bits > 44 ? 6 : + input_bits > 21 ? 5 : + input_bits > 10 ? 4 : + input_bits > 4 ? 3 : + input_bits > 1 ? 2 : + 1; +} + +// Although currently the name of this function says that it cannot handle +// values less than 1, in practice it can handle as low as 1/x_max, where +// x_max is the largest representable input. In other words, the output range +// is symmetric. +template +inline gemmlowp::FixedPoint +log_x_for_x_greater_than_or_equal_to_1_impl( + gemmlowp::FixedPoint input_val) +{ + // assert(__builtin_clz(0u) >= std::numeric_limits::digits - 1); + // assert(__builtin_clz(0u) <= std::numeric_limits::digits); + using FixedPoint0 = gemmlowp::FixedPoint; + // The reason for accumulating the result with an extra bit of headroom is + // that z_pow_2_adj * log_2 might be saturated, and adding num_scaled * + // recip_denom will otherwise introduce an error. + static constexpr int kAccumIntegerBits = OutputIntegerBits + 1; + using FixedPointAccum = gemmlowp::FixedPoint; + + const FixedPoint0 log_2 = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 1488522236, std::log(2.0)); + const FixedPoint0 sqrt_sqrt_half = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 1805811301, std::sqrt(std::sqrt(0.5))); + const FixedPoint0 sqrt_half = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 1518500250, std::sqrt(0.5)); + const FixedPoint0 one_quarter = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(FixedPoint0, 536870912, 1.0 / 4.0); + + const FixedPoint0 alpha_n = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 117049297, 11.0 / 240.0 * std::sqrt(std::sqrt(2.0))); + const FixedPoint0 alpha_d = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 127690142, 1.0 / 20.0 * std::sqrt(std::sqrt(2.0))); + const FixedPoint0 alpha_i = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 1057819769, + 2.0 / std::sqrt(std::sqrt(2.0)) - std::sqrt(std::sqrt(2.0))); + const FixedPoint0 alpha_f = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( + FixedPoint0, 638450708, 1.0 / 4.0 * std::sqrt(std::sqrt(2.0))); + + const FixedPointAccum shifted_quarter = + gemmlowp::Rescale(one_quarter); + + // Reinterpret the input value as Q0.31, because we will figure out the + // required shift "ourselves" instead of using, say, Rescale. + FixedPoint0 z_a = FixedPoint0::FromRaw(input_val.raw()); + // z_a_pow_2 = input_integer_bits - z_a_headroom; + int z_a_headroom_plus_1 = CountLeadingZeros(static_cast(z_a.raw())); + FixedPoint0 r_a_tmp = + SaturatingRoundingMultiplyByPOTParam(z_a, (z_a_headroom_plus_1 - 1)); + const int32_t r_a_raw = + SaturatingRoundingMultiplyByPOTParam((r_a_tmp * sqrt_half).raw(), 1); + // z_pow_2_adj = max(z_pow_2_a - 0.75, z_pow_2_b - 0.25); + // z_pow_2_adj = max(InputIntegerBits - z_a_headroom_plus_1 + 0.25, + // InputIntegerBits - z_b_headroom - 0.25); + const FixedPointAccum z_a_pow_2_adj = SaturatingAddNonGemmlowp( + FixedPointAccum::FromRaw(SaturatingRoundingMultiplyByPOTParam( + static_cast(InputIntegerBits - z_a_headroom_plus_1), + 31 - kAccumIntegerBits)), + shifted_quarter); + + // z_b is treated like z_a, but premultiplying by sqrt(0.5). + FixedPoint0 z_b = z_a * sqrt_half; + int z_b_headroom = CountLeadingZeros(static_cast(z_b.raw())) - 1; + const int32_t r_b_raw = + SaturatingRoundingMultiplyByPOTParam(z_a.raw(), z_b_headroom); + const FixedPointAccum z_b_pow_2_adj = SaturatingSub( + FixedPointAccum::FromRaw(SaturatingRoundingMultiplyByPOTParam( + static_cast(InputIntegerBits - z_b_headroom), + 31 - kAccumIntegerBits)), + shifted_quarter); + + const FixedPoint0 r = FixedPoint0::FromRaw(std::min(r_a_raw, r_b_raw)); + const FixedPointAccum z_pow_2_adj = FixedPointAccum::FromRaw( + std::max(z_a_pow_2_adj.raw(), z_b_pow_2_adj.raw())); + + const FixedPoint0 p = gemmlowp::RoundingHalfSum(r, sqrt_sqrt_half); + FixedPoint0 q = r - sqrt_sqrt_half; + q = q + q; + + const FixedPoint0 common_sq = q * q; + const FixedPoint0 num = q * r + q * common_sq * alpha_n; + const FixedPoint0 denom_minus_one_0 = + p * (alpha_i + q + alpha_d * common_sq) + alpha_f * q; + const FixedPoint0 recip_denom = + one_over_one_plus_x_for_x_in_0_1(denom_minus_one_0); + + const FixedPointAccum num_scaled = gemmlowp::Rescale(num); + return gemmlowp::Rescale(z_pow_2_adj * log_2 + + num_scaled * recip_denom); +} + +template +inline gemmlowp::FixedPoint +log_x_for_x_greater_than_or_equal_to_1( + gemmlowp::FixedPoint input_val) +{ + static_assert( + OutputIntegerBits >= min_log_x_output_bits(InputIntegerBits), + "Output integer bits must be sufficient to accommodate logs of inputs."); + return log_x_for_x_greater_than_or_equal_to_1_impl( + input_val); +} + +inline int32_t GetReciprocal(int32_t x, int x_integer_digits, + int *num_bits_over_unit) +{ + int headroom_plus_one = CountLeadingZeros(static_cast(x)); + // This is the number of bits to the left of the binary point above 1.0. + // Consider x=1.25. In that case shifted_scale=0.8 and + // no later adjustment will be needed. + *num_bits_over_unit = x_integer_digits - headroom_plus_one; + const int32_t shifted_sum_minus_one = + static_cast((static_cast(x) << headroom_plus_one) - + (static_cast(1) << 31)); + + gemmlowp::FixedPoint shifted_scale = + gemmlowp::one_over_one_plus_x_for_x_in_0_1( + gemmlowp::FixedPoint::FromRaw(shifted_sum_minus_one)); + return shifted_scale.raw(); +} + +inline void GetInvSqrtQuantizedMultiplierExp(int32_t input, int reverse_shift, + int32_t *output_inv_sqrt, + int *output_shift) +{ + TFLITE_DCHECK_GE(input, 0); + if (input <= 1) { + // Handle the input value 1 separately to avoid overflow in that case + // in the general computation below (b/143972021). Also handle 0 as if it + // were a 1. 0 is an invalid input here (divide by zero) and 1 is a valid + // but rare/unrealistic input value. We can expect both to occur in some + // incompletely trained models, but probably not in fully trained models. + *output_inv_sqrt = std::numeric_limits::max(); + *output_shift = 0; + return; + } + TFLITE_DCHECK_GT(input, 1); + *output_shift = 11; + while (input >= (1 << 29)) { + input /= 4; + ++*output_shift; + } + const unsigned max_left_shift_bits = + CountLeadingZeros(static_cast(input)) - 1; + const unsigned max_left_shift_bit_pairs = max_left_shift_bits / 2; + const unsigned left_shift_bit_pairs = max_left_shift_bit_pairs - 1; + *output_shift -= left_shift_bit_pairs; + input <<= 2 * left_shift_bit_pairs; + TFLITE_DCHECK_GE(input, (1 << 27)); + TFLITE_DCHECK_LT(input, (1 << 29)); + using gemmlowp::FixedPoint; + using gemmlowp::Rescale; + using gemmlowp::SaturatingRoundingMultiplyByPOT; + // Using 3 integer bits gives us enough room for the internal arithmetic in + // this Newton-Raphson iteration. + using F3 = FixedPoint; + using F0 = FixedPoint; + const F3 fixedpoint_input = F3::FromRaw(input >> 1); + const F3 fixedpoint_half_input = + SaturatingRoundingMultiplyByPOT<-1>(fixedpoint_input); + const F3 fixedpoint_half_three = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F3, (1 << 28) + (1 << 27), 1.5); + // Newton-Raphson iteration + // Naive unoptimized starting guess: x = 1 + F3 x = F3::One(); + // Naive unoptimized number of iterations: 5 + for (int i = 0; i < 5; i++) { + const F3 x3 = Rescale<3>(x * x * x); + x = Rescale<3>(fixedpoint_half_three * x - fixedpoint_half_input * x3); + } + const F0 fixedpoint_half_sqrt_2 = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F0, 1518500250, std::sqrt(2.) / 2.); + x = x * fixedpoint_half_sqrt_2; + *output_inv_sqrt = x.raw(); + if (*output_shift < 0) { + *output_inv_sqrt <<= -*output_shift; + *output_shift = 0; + } + // Convert right shift (right is positive) to left shift. + *output_shift *= reverse_shift; +} + +// DO NOT USE THIS STRUCT FOR NEW FUNCTIONALITY BEYOND IMPLEMENTING +// BROADCASTING. +// +// NdArrayDesc describes the shape and memory layout of an N-dimensional +// rectangular array of numbers. +// +// NdArrayDesc is basically identical to Dims defined in types.h. +// However, as Dims is to be deprecated, this class exists as an adaptor +// to enable simple unoptimized implementations of element-wise broadcasting +// operations. +template +struct NdArrayDesc { + // The "extent" of each dimension. Indices along dimension d must be in the + // half-open interval [0, extents[d]). + int extents[N]; + + // The number of *elements* (not bytes) between consecutive indices of each + // dimension. + int strides[N]; +}; + +// DO NOT USE THIS FUNCTION FOR NEW FUNCTIONALITY BEYOND IMPLEMENTING +// BROADCASTING. +// +// Same as Offset(), except takes as NdArrayDesc instead of Dims. +inline int SubscriptToIndex(const NdArrayDesc<4> &desc, int i0, int i1, int i2, + int i3) +{ + TFLITE_DCHECK(i0 >= 0 && i0 < desc.extents[0]); + TFLITE_DCHECK(i1 >= 0 && i1 < desc.extents[1]); + TFLITE_DCHECK(i2 >= 0 && i2 < desc.extents[2]); + TFLITE_DCHECK(i3 >= 0 && i3 < desc.extents[3]); + return i0 * desc.strides[0] + i1 * desc.strides[1] + i2 * desc.strides[2] + + i3 * desc.strides[3]; +} + +inline int SubscriptToIndex(const NdArrayDesc<5> &desc, int indexes[5]) +{ + return indexes[0] * desc.strides[0] + indexes[1] * desc.strides[1] + + indexes[2] * desc.strides[2] + indexes[3] * desc.strides[3] + + indexes[4] * desc.strides[4]; +} + +inline int SubscriptToIndex(const NdArrayDesc<8> &desc, int indexes[8]) +{ + return indexes[0] * desc.strides[0] + indexes[1] * desc.strides[1] + + indexes[2] * desc.strides[2] + indexes[3] * desc.strides[3] + + indexes[4] * desc.strides[4] + indexes[5] * desc.strides[5] + + indexes[6] * desc.strides[6] + indexes[7] * desc.strides[7]; +} + +// Given the dimensions of the operands for an element-wise binary broadcast, +// adjusts them so that they can be directly iterated over with simple loops. +// Returns the adjusted dims as instances of NdArrayDesc in 'desc0_out' and +// 'desc1_out'. 'desc0_out' and 'desc1_out' cannot be nullptr. +// +// This function assumes that the two input shapes are compatible up to +// broadcasting and the shorter one has already been prepended with 1s to be the +// same length. E.g., if shape0 is (1, 16, 16, 64) and shape1 is (1, 64), +// shape1 must already have been prepended to be (1, 1, 1, 64). Recall that +// Dims refer to shapes in reverse order. In this case, input0_dims will be +// (64, 16, 16, 1) and input1_dims will be (64, 1, 1, 1). +// +// When two shapes are compatible up to broadcasting, for each dimension d, +// the input extents are either equal, or one of them is 1. +// +// This function performs the following for each dimension d: +// - If the extents are equal, then do nothing since the loop that walks over +// both of the input arrays is correct. +// - Otherwise, one (and only one) of the extents must be 1. Say extent0 is 1 +// and extent1 is e1. Then set extent0 to e1 and stride0 *to 0*. This allows +// array0 to be referenced *at any index* in dimension d and still access the +// same slice. +template +inline void NdArrayDescsForElementwiseBroadcast(const Dims &input0_dims, + const Dims &input1_dims, + NdArrayDesc *desc0_out, + NdArrayDesc *desc1_out) +{ + TFLITE_DCHECK(desc0_out != nullptr); + TFLITE_DCHECK(desc1_out != nullptr); + + // Copy dims to desc. + for (int i = 0; i < N; ++i) { + desc0_out->extents[i] = input0_dims.sizes[i]; + desc0_out->strides[i] = input0_dims.strides[i]; + desc1_out->extents[i] = input1_dims.sizes[i]; + desc1_out->strides[i] = input1_dims.strides[i]; + } + + // Walk over each dimension. If the extents are equal do nothing. + // Otherwise, set the desc with extent 1 to have extent equal to the other and + // stride 0. + for (int i = 0; i < N; ++i) { + const int extent0 = ArraySize(input0_dims, i); + const int extent1 = ArraySize(input1_dims, i); + if (extent0 != extent1) { + if (extent0 == 1) { + desc0_out->strides[i] = 0; + desc0_out->extents[i] = extent1; + } else { + TFLITE_DCHECK_EQ(extent1, 1); + desc1_out->strides[i] = 0; + desc1_out->extents[i] = extent0; + } + } + } +} + +// Copies dims to desc, calculating strides. +template +inline void CopyDimsToDesc(const RuntimeShape &input_shape, + NdArrayDesc *desc_out) +{ + int desc_stride = 1; + for (int i = N - 1; i >= 0; --i) { + desc_out->extents[i] = input_shape.Dims(i); + desc_out->strides[i] = desc_stride; + desc_stride *= input_shape.Dims(i); + } +} + +template +inline void NdArrayDescsForElementwiseBroadcast( + const RuntimeShape &input0_shape, const RuntimeShape &input1_shape, + NdArrayDesc *desc0_out, NdArrayDesc *desc1_out) +{ + TFLITE_DCHECK(desc0_out != nullptr); + TFLITE_DCHECK(desc1_out != nullptr); + + auto extended_input0_shape = RuntimeShape::ExtendedShape(N, input0_shape); + auto extended_input1_shape = RuntimeShape::ExtendedShape(N, input1_shape); + + // Copy dims to desc, calculating strides. + CopyDimsToDesc(extended_input0_shape, desc0_out); + CopyDimsToDesc(extended_input1_shape, desc1_out); + + // Walk over each dimension. If the extents are equal do nothing. + // Otherwise, set the desc with extent 1 to have extent equal to the other and + // stride 0. + for (int i = 0; i < N; ++i) { + const int extent0 = extended_input0_shape.Dims(i); + const int extent1 = extended_input1_shape.Dims(i); + if (extent0 != extent1) { + if (extent0 == 1) { + desc0_out->strides[i] = 0; + desc0_out->extents[i] = extent1; + } else { + TFLITE_DCHECK_EQ(extent1, 1); + desc1_out->strides[i] = 0; + desc1_out->extents[i] = extent0; + } + } + } +} + +template +inline void NdArrayDescsForElementwiseBroadcast( + const RuntimeShape &input0_shape, const RuntimeShape &input1_shape, + const RuntimeShape &input2_shape, NdArrayDesc *desc0_out, + NdArrayDesc *desc1_out, NdArrayDesc *desc2_out) +{ + TFLITE_DCHECK(desc0_out != nullptr); + TFLITE_DCHECK(desc1_out != nullptr); + TFLITE_DCHECK(desc2_out != nullptr); + + auto extended_input0_shape = RuntimeShape::ExtendedShape(N, input0_shape); + auto extended_input1_shape = RuntimeShape::ExtendedShape(N, input1_shape); + auto extended_input2_shape = RuntimeShape::ExtendedShape(N, input2_shape); + + // Copy dims to desc, calculating strides. + CopyDimsToDesc(extended_input0_shape, desc0_out); + CopyDimsToDesc(extended_input1_shape, desc1_out); + CopyDimsToDesc(extended_input2_shape, desc2_out); + + // Walk over each dimension. If the extents are equal do nothing. + // Otherwise, set the desc with extent 1 to have extent equal to the other and + // stride 0. + for (int i = 0; i < N; ++i) { + const int extent0 = extended_input0_shape.Dims(i); + const int extent1 = extended_input1_shape.Dims(i); + const int extent2 = extended_input2_shape.Dims(i); + + int extent = extent0; + if (extent1 != 1) + extent = extent1; + if (extent2 != 1) + extent = extent2; + + TFLITE_DCHECK(extent0 == 1 || extent0 == extent); + TFLITE_DCHECK(extent1 == 1 || extent1 == extent); + TFLITE_DCHECK(extent2 == 1 || extent2 == extent); + + if (!(extent0 == extent1 && extent1 == extent2)) { + if (extent0 == 1) { + desc0_out->strides[i] = 0; + desc0_out->extents[i] = extent; + } + if (extent1 == 1) { + desc1_out->strides[i] = 0; + desc1_out->extents[i] = extent; + } + if (extent2 == 1) { + desc2_out->strides[i] = 0; + desc2_out->extents[i] = extent; + } + } + } +} + +// Detailed implementation of NDOpsHelper, the indexes must be a zero array. +// This implementation is equivalent to N nested loops. Ex, if N=4, it can be +// re-writen as: +// for (int b = 0; b < output.extents[0]; ++b) { +// for (int y = 0; y < output.extents[1]; ++y) { +// for (int x = 0; x < output.extents[2]; ++x) { +// for (int c = 0; c < output.extents[3]; ++c) { +// calc({b,y,x,c}); +// } +// } +// } +// } +template +typename std::enable_if::type NDOpsHelperImpl( + const NdArrayDesc &output, const Calc &calc, int indexes[N]) +{ + for (indexes[DIM] = 0; indexes[DIM] < output.extents[DIM]; ++indexes[DIM]) { + NDOpsHelperImpl(output, calc, indexes); + } +} + +template +typename std::enable_if::type NDOpsHelperImpl( + const NdArrayDesc &output, const Calc &calc, int indexes[N]) +{ + for (indexes[DIM] = 0; indexes[DIM] < output.extents[DIM]; ++indexes[DIM]) { + calc(indexes); + } +} + +// Execute the calc function in the innermost iteration based on the shape of +// the output. The calc function should take a single argument of type int[N]. +template +inline void NDOpsHelper(const NdArrayDesc &output, const Calc &calc) +{ + int indexes[N] = { 0 }; + NDOpsHelperImpl(output, calc, indexes); +} +// Copied from gemmlowp::RoundDown when we dropped direct dependency on +// gemmlowp. +// +// Returns the runtime argument rounded down to the nearest multiple of +// the fixed Modulus. +template +Integer RoundDown(Integer i) +{ + return i - (i % Modulus); +} + +// Copied from gemmlowp::RoundUp when we dropped direct dependency on +// gemmlowp. +// +// Returns the runtime argument rounded up to the nearest multiple of +// the fixed Modulus. +template +Integer RoundUp(Integer i) +{ + return RoundDown(i + Modulus - 1); +} + +// Copied from gemmlowp::CeilQuotient when we dropped direct dependency on +// gemmlowp. +// +// Returns the quotient a / b rounded up ('ceil') to the nearest integer. +template +Integer CeilQuotient(Integer a, Integer b) +{ + return (a + b - 1) / b; +} + +// This function is a copy of gemmlowp::HowManyThreads, copied when we dropped +// the direct dependency of internal/optimized/ on gemmlowp. +// +// It computes a reasonable number of threads to use for a GEMM of shape +// (rows, cols, depth). +// +// TODO(b/131910176): get rid of this function by switching each call site +// to its own more sensible logic for its own workload. +template +inline int LegacyHowManyThreads(int max_num_threads, int rows, int cols, + int depth) +{ + // Early-exit in the default case where multi-threading is disabled. + if (max_num_threads == 1) { + return 1; + } + + // Ensure that each thread has KernelRows rows to process, if at all possible. + int thread_count = std::min(max_num_threads, rows / KernelRows); + + // Limit the number of threads according to the overall size of the problem. + if (thread_count > 1) { + // Empirically determined value. + static constexpr std::uint64_t min_cubic_size_per_thread = 64 * 1024; + + // We can only multiply two out of three sizes without risking overflow + const std::uint64_t cubic_size = + std::uint64_t(rows) * std::uint64_t(cols) * std::uint64_t(depth); + + thread_count = std::min( + thread_count, static_cast(cubic_size / min_cubic_size_per_thread)); + } + + if (thread_count < 1) { + thread_count = 1; + } + + assert(thread_count > 0 && thread_count <= max_num_threads); + return thread_count; +} + +template +void optimized_ops_preload_l1_stream(const T *ptr) +{ +#ifdef __GNUC__ + // builtin offered by GCC-compatible compilers including clang + __builtin_prefetch(ptr, /* 0 means read */ 0, /* 0 means no locality */ 0); +#else + (void)ptr; +#endif +} + +template +void optimized_ops_preload_l1_keep(const T *ptr) +{ +#ifdef __GNUC__ + // builtin offered by GCC-compatible compilers including clang + __builtin_prefetch(ptr, /* 0 means read */ 0, /* 3 means high locality */ 3); +#else + (void)ptr; +#endif +} + +template +void optimized_ops_prefetch_write_l1_keep(const T *ptr) +{ +#ifdef __GNUC__ + // builtin offered by GCC-compatible compilers including clang + __builtin_prefetch(ptr, /* 1 means write */ 1, /* 3 means high locality */ 3); +#else + (void)ptr; +#endif +} + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_COMMON_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/compatibility.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/compatibility.h new file mode 100644 index 00000000..e53eb2fa --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/compatibility.h @@ -0,0 +1,112 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_COMPATIBILITY_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_COMPATIBILITY_H_ + +#include + +#include "tensorflow/lite/kernels/op_macros.h" + +#ifndef TFLITE_DCHECK +#define TFLITE_DCHECK(condition) (condition) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +#ifndef TFLITE_DCHECK_EQ +#define TFLITE_DCHECK_EQ(x, y) ((x) == (y)) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +#ifndef TFLITE_DCHECK_NE +#define TFLITE_DCHECK_NE(x, y) ((x) != (y)) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +#ifndef TFLITE_DCHECK_GE +#define TFLITE_DCHECK_GE(x, y) ((x) >= (y)) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +#ifndef TFLITE_DCHECK_GT +#define TFLITE_DCHECK_GT(x, y) ((x) > (y)) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +#ifndef TFLITE_DCHECK_LE +#define TFLITE_DCHECK_LE(x, y) ((x) <= (y)) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +#ifndef TFLITE_DCHECK_LT +#define TFLITE_DCHECK_LT(x, y) ((x) < (y)) ? (void)0 : TFLITE_ASSERT_FALSE +#endif + +// TODO(ahentz): Clean up: We should stick to the DCHECK versions. +#ifndef TFLITE_CHECK +#define TFLITE_CHECK(condition) (condition) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TFLITE_CHECK_EQ +#define TFLITE_CHECK_EQ(x, y) ((x) == (y)) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TFLITE_CHECK_NE +#define TFLITE_CHECK_NE(x, y) ((x) != (y)) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TFLITE_CHECK_GE +#define TFLITE_CHECK_GE(x, y) ((x) >= (y)) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TFLITE_CHECK_GT +#define TFLITE_CHECK_GT(x, y) ((x) > (y)) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TFLITE_CHECK_LE +#define TFLITE_CHECK_LE(x, y) ((x) <= (y)) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TFLITE_CHECK_LT +#define TFLITE_CHECK_LT(x, y) ((x) < (y)) ? (void)0 : TFLITE_ABORT +#endif + +#ifndef TF_LITE_STATIC_MEMORY +// TODO(b/162019032): Consider removing these type-aliases. +using int8 = std::int8_t; +using uint8 = std::uint8_t; +using int16 = std::int16_t; +using uint16 = std::uint16_t; +using int32 = std::int32_t; +using uint32 = std::uint32_t; +#endif // !defined(TF_LITE_STATIC_MEMORY) + +// TFLITE_DEPRECATED() +// +// Duplicated from absl/base/macros.h to avoid pulling in that library. +// Marks a deprecated class, struct, enum, function, method and variable +// declarations. The macro argument is used as a custom diagnostic message (e.g. +// suggestion of a better alternative). +// +// Example: +// +// class TFLITE_DEPRECATED("Use Bar instead") Foo {...}; +// TFLITE_DEPRECATED("Use Baz instead") void Bar() {...} +// +// Every usage of a deprecated entity will trigger a warning when compiled with +// clang's `-Wdeprecated-declarations` option. This option is turned off by +// default, but the warnings will be reported by clang-tidy. +#if defined(__clang__) && __cplusplus >= 201103L +#define TFLITE_DEPRECATED(message) __attribute__((deprecated(message))) +#endif + +#ifndef TFLITE_DEPRECATED +#define TFLITE_DEPRECATED(message) +#endif + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_COMPATIBILITY_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/cppmath.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/cppmath.h new file mode 100644 index 00000000..bac4e9b3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/cppmath.h @@ -0,0 +1,41 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_CPPMATH_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_CPPMATH_H_ + +#include + +namespace tflite { +#if defined(TF_LITE_USE_GLOBAL_CMATH_FUNCTIONS) || \ + (defined(__ANDROID__) && !defined(__NDK_MAJOR__)) || defined(ARDUINO) || \ + defined(__ZEPHYR__) +#define TF_LITE_GLOBAL_STD_PREFIX +#else +#define TF_LITE_GLOBAL_STD_PREFIX std +#endif + +#define DECLARE_STD_GLOBAL_SWITCH1(tf_name, std_name) \ + template \ + inline T tf_name(const T x) \ + { \ + return TF_LITE_GLOBAL_STD_PREFIX::std_name(x); \ + } + +DECLARE_STD_GLOBAL_SWITCH1(TfLiteRound, round); +DECLARE_STD_GLOBAL_SWITCH1(TfLiteExpm1, expm1); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_CPPMATH_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/max.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/max.h new file mode 100644 index 00000000..6b57d56e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/max.h @@ -0,0 +1,36 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_MAX_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_MAX_H_ + +#include + +namespace tflite { +#if defined(TF_LITE_USE_GLOBAL_MAX) || defined(__ZEPHYR__) +inline float TfLiteMax(const float &x, const float &y) +{ + return std::max(x, y); +} +#else +template +inline T TfLiteMax(const T &x, const T &y) +{ + return std::fmax(x, y); +} +#endif + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_MAX_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/min.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/min.h new file mode 100644 index 00000000..563cc6d8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/min.h @@ -0,0 +1,36 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_MIN_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_MIN_H_ + +#include + +namespace tflite { +#if defined(TF_LITE_USE_GLOBAL_MIN) || defined(__ZEPHYR__) +inline float TfLiteMin(const float &x, const float &y) +{ + return std::min(x, y); +} +#else +template +inline T TfLiteMin(const T &x, const T &y) +{ + return std::fmin(x, y); +} +#endif + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_MIN_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/optimized/neon_check.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/optimized/neon_check.h new file mode 100644 index 00000000..e2b07228 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/optimized/neon_check.h @@ -0,0 +1,20 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_OPTIMIZED_NEON_CHECK_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_OPTIMIZED_NEON_CHECK_H_ + +// TFLM does not need to utilize any Neon optimizations. + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_OPTIMIZED_NEON_CHECK_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/portable_tensor.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/portable_tensor.h new file mode 100644 index 00000000..724ccad7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/portable_tensor.h @@ -0,0 +1,143 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_PORTABLE_TENSOR_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_PORTABLE_TENSOR_H_ + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +inline RuntimeShape GetTensorShape(std::vector data) +{ + return RuntimeShape(data.size(), data.data()); +} + +// A list of tensors in a format that can be used by kernels like split and +// concatenation. +template +class VectorOfTensors { +public: + // Build with the tensors in 'tensor_list'. + VectorOfTensors(const TfLiteContext &context, + const TfLiteIntArray &tensor_list) + { + int num_tensors = tensor_list.size; + + all_data_.reserve(num_tensors); + all_shape_.reserve(num_tensors); + all_shape_ptr_.reserve(num_tensors); + + for (int i = 0; i < num_tensors; ++i) { + TfLiteTensor *t = &context.tensors[tensor_list.data[i]]; + all_data_.push_back(GetTensorData(t)); + all_shape_.push_back(GetTensorShape(t)); + } + + // Taking the pointer from inside a std::vector is only OK if the vector is + // never modified, so we populate all_shape in the previous loop and then we + // are free to grab iterators here. + for (int i = 0; i < num_tensors; ++i) { + all_shape_ptr_.push_back(&all_shape_[i]); + } + } + // Return a pointer to the data pointers of all tensors in the list. For + // example: + // float* const* f = v.data(); + // f[0][1] is the second element of the first tensor. + T *const *data() const + { + return all_data_.data(); + } + + // Return a pointer the shape pointers of all tensors in the list. For + // example: + // const RuntimeShape* const* d = v.dims(); + // dims[1] are the dimensions of the second tensor in the list. + const RuntimeShape *const *shapes() const + { + return all_shape_ptr_.data(); + } + +private: + std::vector all_data_; + std::vector all_shape_; + std::vector all_shape_ptr_; +}; + +// A list of quantized tensors in a format that can be used by kernels like +// split and concatenation. +class VectorOfQuantizedTensors : public VectorOfTensors { +public: + // Build with the tensors in 'tensor_list'. + VectorOfQuantizedTensors(const TfLiteContext &context, + const TfLiteIntArray &tensor_list) + : VectorOfTensors(context, tensor_list) + { + for (int i = 0; i < tensor_list.size; ++i) { + TfLiteTensor *t = &context.tensors[tensor_list.data[i]]; + zero_point_.push_back(t->params.zero_point); + scale_.push_back(t->params.scale); + } + } + + const float *scale() const + { + return scale_.data(); + } + const int32_t *zero_point() const + { + return zero_point_.data(); + } + +private: + std::vector zero_point_; + std::vector scale_; +}; + +// Writes randomly accessed values from `input` sequentially into `output`. +template +class SequentialTensorWriter { +public: + SequentialTensorWriter(const TfLiteTensor *input, TfLiteTensor *output) + { + input_data_ = GetTensorData(input); + output_ptr_ = GetTensorData(output); + } + SequentialTensorWriter(const T *input_data, T *output_data) + : input_data_(input_data), output_ptr_(output_data) + { + } + + void Write(int position) + { + *output_ptr_++ = input_data_[position]; + } + void WriteN(int position, int len) + { + memcpy(output_ptr_, &input_data_[position], sizeof(T) * len); + output_ptr_ += len; + } + +private: + const T *input_data_; + T *output_ptr_; +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_PORTABLE_TENSOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.cc b/components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.cc new file mode 100644 index 00000000..5eb08ceb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.cc @@ -0,0 +1,409 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/quantization_util.h" + +#include +#include +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" + +namespace tflite { + +namespace { +// These constants are used to manipulate the binary representation of doubles. +// Double-precision binary64 floating point format is: +// Bit | 63 | 62-52 | 51-0 | +// | Sign | Exponent | Fraction | +// To avoid 64-bit integers as much as possible, I break this into high and +// low 32-bit chunks. High is: +// Bit | 31 | 30-20 | 19-0 | +// | Sign | Exponent | High Fraction | +// Low is: +// Bit | 31-0 | +// | Low Fraction | +// We then access the components through logical bit-wise operations to +// extract the parts needed, with the positions and masks derived from the +// layout shown above. +constexpr uint64_t kSignMask = 0x8000000000000000LL; +constexpr uint64_t kExponentMask = 0x7ff0000000000000LL; +constexpr int32_t kExponentShift = 52; +constexpr int32_t kExponentBias = 1023; +constexpr uint32_t kExponentIsBadNum = 0x7ff; +constexpr uint64_t kFractionMask = 0x000fffffffc00000LL; +constexpr uint32_t kFractionShift = 22; +constexpr uint32_t kFractionRoundingMask = 0x003fffff; +constexpr uint32_t kFractionRoundingThreshold = 0x00200000; +} // namespace + +void QuantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, + int *shift) +{ + if (double_multiplier == 0.) { + *quantized_multiplier = 0; + *shift = 0; + return; + } +#ifdef TFLITE_EMULATE_FLOAT + // If we're trying to avoid the use of floating-point instructions (for + // example on microcontrollers) then use an alternative implementation + // that only requires integer and bitwise operations. To enable this, you + // need to set the define during the build process for your platform. + int64_t q_fixed = IntegerFrExp(double_multiplier, shift); +#else // TFLITE_EMULATE_FLOAT + const double q = std::frexp(double_multiplier, shift); + auto q_fixed = static_cast(TfLiteRound(q * (1ll << 31))); +#endif // TFLITE_EMULATE_FLOAT + TFLITE_CHECK(q_fixed <= (1ll << 31)); + if (q_fixed == (1ll << 31)) { + q_fixed /= 2; + ++*shift; + } + TFLITE_CHECK_LE(q_fixed, std::numeric_limits::max()); + // A shift amount smaller than -31 would cause all bits to be shifted out + // and thus all results would be zero. We implement that instead with + // q_fixed==0, so as to avoid hitting issues with right-shift + // operations with shift amounts greater than 31. Note that this happens + // roughly when abs(double_multiplier) < 2^-31 and the present handling means + // that we're effectively flushing tiny double_multiplier's to zero. + // We could conceivably handle values in the range (roughly) [32, 63] + // as 'denormals' i.e. (shift==0, q_fixed < 2^30). In that point of view + // the present handling is just doing 'flush denormals to zero'. We could + // reconsider and actually generate nonzero denormals if a need arises. + if (*shift < -31) { + *shift = 0; + q_fixed = 0; + } + *quantized_multiplier = static_cast(q_fixed); +} + +void QuantizeMultiplierGreaterThanOne(double double_multiplier, + int32_t *quantized_multiplier, + int *left_shift) +{ + TFLITE_CHECK_GT(double_multiplier, 1.); + QuantizeMultiplier(double_multiplier, quantized_multiplier, left_shift); + TFLITE_CHECK_GE(*left_shift, 0); +} + +void QuantizeMultiplierSmallerThanOneExp(double double_multiplier, + int32_t *quantized_multiplier, + int *left_shift) +{ + TFLITE_CHECK_LT(double_multiplier, 1.); + TFLITE_CHECK_GT(double_multiplier, 0.); + int shift; + QuantizeMultiplier(double_multiplier, quantized_multiplier, &shift); + TFLITE_CHECK_LE(shift, 0); + *left_shift = shift; +} + +int64_t IntegerFrExp(double input, int *shift) +{ + // Make sure our assumptions about the double layout hold. + TFLITE_CHECK_EQ(8, sizeof(double)); + + // We want to access the bits of the input double value directly, which is + // tricky to do safely, so use a union to handle the casting. + union { + double double_value; + uint64_t double_as_uint; + } cast_union; + cast_union.double_value = input; + const uint64_t u = cast_union.double_as_uint; + + // If the bitfield is all zeros apart from the sign bit, this is a normalized + // zero value, so return standard values for this special case. + if ((u & ~kSignMask) == 0) { + *shift = 0; + return 0; + } + + // Deal with NaNs and Infs, which are always indicated with a fixed pattern in + // the exponent, and distinguished by whether the fractions are zero or + // non-zero. + const uint32_t exponent_part = ((u & kExponentMask) >> kExponentShift); + if (exponent_part == kExponentIsBadNum) { + *shift = std::numeric_limits::max(); + if (u & kFractionMask) { + // NaN, so just return zero (with the exponent set to INT_MAX). + return 0; + } else { + // Infinity, so return +/- INT_MAX. + if (u & kSignMask) { + return std::numeric_limits::min(); + } else { + return std::numeric_limits::max(); + } + } + } + + // The shift is fairly easy to extract from the high bits of the double value, + // just by masking it out and applying a bias. The std::frexp() implementation + // always returns values between 0.5 and 1.0 though, whereas the exponent + // assumes 1.0 to 2.0 is the standard range, so I add on one to match that + // interface. + *shift = (exponent_part - kExponentBias) + 1; + + // There's an implicit high bit in the double format definition, so make sure + // we include that at the top, and then reconstruct the rest of the fractional + // value from the remaining fragments. + int64_t fraction = 0x40000000 + ((u & kFractionMask) >> kFractionShift); + + // We're cutting off some bits at the bottom, so to exactly match the standard + // frexp implementation here we'll apply rounding by adding one to the least + // significant bit of the result if the discarded portion is over half of the + // maximum. + if ((u & kFractionRoundingMask) > kFractionRoundingThreshold) { + fraction += 1; + } + // Negate the fraction if the sign bit was set. + if (u & kSignMask) { + fraction *= -1; + } + + return fraction; +} + +double DoubleFromFractionAndShift(int64_t fraction, int shift) +{ + union { + double double_value; + uint64_t double_as_uint; + } result; + + // Detect NaNs and infinities. + if (shift == std::numeric_limits::max()) { + if (fraction == 0) { + return std::numeric_limits::quiet_NaN(); + } else if (fraction > 0) { + return std::numeric_limits::infinity(); + } else { + return -std::numeric_limits::infinity(); + } + } + + // Return a normalized zero for a zero fraction. + if (fraction == 0) { + result.double_as_uint = 0; + return result.double_value; + } + + bool is_negative = (fraction < 0); + int64_t encoded_fraction = is_negative ? -fraction : fraction; + int64_t encoded_shift = (shift - 1); + while (encoded_fraction < 0x40000000) { + encoded_fraction *= 2; + encoded_shift -= 1; + } + while (encoded_fraction > 0x80000000) { + encoded_fraction /= 2; + encoded_shift += 1; + } + encoded_fraction -= 0x40000000; + if (encoded_shift < -1022) { + encoded_shift = -1023; + } else if (encoded_shift > 1022) { + encoded_shift = 1023; + } + encoded_shift += kExponentBias; + uint64_t encoded_sign = is_negative ? kSignMask : 0; + result.double_as_uint = encoded_sign | (encoded_shift << kExponentShift) | + (encoded_fraction << kFractionShift); + return result.double_value; +} + +double IntegerDoubleMultiply(double a, double b) +{ + int a_shift; + const int64_t a_fraction = IntegerFrExp(a, &a_shift); + int b_shift; + const int64_t b_fraction = IntegerFrExp(b, &b_shift); + // Detect NaNs and infinities. + if (a_shift == std::numeric_limits::max() || + (b_shift == std::numeric_limits::max())) { + return std::numeric_limits::quiet_NaN(); + } + const int result_shift = a_shift + b_shift + 1; + const int64_t result_fraction = (a_fraction * b_fraction) >> 32; + return DoubleFromFractionAndShift(result_fraction, result_shift); +} + +int IntegerDoubleCompare(double a, double b) +{ + int a_shift; + const int64_t a_fraction = IntegerFrExp(a, &a_shift); + int b_shift; + const int64_t b_fraction = IntegerFrExp(b, &b_shift); + + // Detect NaNs and infinities. + if (a_shift == std::numeric_limits::max() || + (b_shift == std::numeric_limits::max())) { + return 1; + } + + if ((a_fraction == 0) && (b_fraction < 0)) { + return 1; + } else if ((a_fraction < 0) && (b_fraction == 0)) { + return -1; + } else if (a_shift < b_shift) { + return -1; + } else if (a_shift > b_shift) { + return 1; + } else if (a_fraction < b_fraction) { + return -1; + } else if (a_fraction > b_fraction) { + return 1; + } else { + return 0; + } +} + +void PreprocessSoftmaxScaling(double beta, double input_scale, + int input_integer_bits, + int32_t *quantized_multiplier, int *left_shift) +{ + // If the overall multiplier (input and beta) is large, then exp() of an + // input difference of 1 scaled by this will be large. In other words, we + // can cap the multiplier and know that, when it is used, the output will be + // (round to) zero wherever the input is not at the maximum value. + + // If the overall scale is less than one, and input_integer_bits=0, then the + // result is double equivalent of Q0.31 (actually with more precision). Thus + // this generates a Q(input_integer_bits).(31-input_integer_bits) + // representation. +#ifdef TFLITE_EMULATE_FLOAT + const double input_beta = IntegerDoubleMultiply(beta, input_scale); + int shift; + int64_t fraction = IntegerFrExp(input_beta, &shift); + shift += (31 - input_integer_bits); + double input_beta_real_multiplier = + DoubleFromFractionAndShift(fraction, shift); + if (IntegerDoubleCompare(input_beta_real_multiplier, (1ll << 31) - 1.0) > 0) { + input_beta_real_multiplier = (1ll << 31) - 1.0; + } +#else // TFLITE_EMULATE_FLOAT + const double input_beta_real_multiplier = std::min( + beta * input_scale * (1 << (31 - input_integer_bits)), (1ll << 31) - 1.0); +#endif // TFLITE_EMULATE_FLOAT + + QuantizeMultiplierGreaterThanOne(input_beta_real_multiplier, + quantized_multiplier, left_shift); +} + +void PreprocessLogSoftmaxScalingExp(double beta, double input_scale, + int input_integer_bits, + int32_t *quantized_multiplier, + int *left_shift, + int32_t *reverse_scaling_divisor, + int *reverse_scaling_left_shift) +{ + PreprocessSoftmaxScaling(beta, input_scale, input_integer_bits, + quantized_multiplier, left_shift); + + // Also calculate what amounts to the inverse scaling factor for the input. + const double real_reverse_scaling_divisor = + (1 << (31 - *left_shift)) / static_cast(*quantized_multiplier); + tflite::QuantizeMultiplierSmallerThanOneExp(real_reverse_scaling_divisor, + reverse_scaling_divisor, + reverse_scaling_left_shift); +} + +int CalculateInputRadius(int input_integer_bits, int input_left_shift, + int total_signed_bits) +{ +#ifdef TFLITE_EMULATE_FLOAT + int64_t result = (1 << input_integer_bits) - 1; + result <<= (total_signed_bits - input_integer_bits); + result >>= input_left_shift; + return result; +#else // TFLITE_EMULATE_FLOAT + const double max_input_rescaled = + 1.0 * ((1 << input_integer_bits) - 1) * + (1ll << (total_signed_bits - input_integer_bits)) / + (1ll << input_left_shift); + // Tighten bound using floor. Suppose that we could use the exact value. + // After scaling the difference, the result would be at the maximum. Thus we + // must ensure that our value has lower magnitude. + return static_cast(std::floor(max_input_rescaled)); +#endif // TFLITE_EMULATE_FLOAT +} + +void NudgeQuantizationRange(const float min, const float max, + const int quant_min, const int quant_max, + float *nudged_min, float *nudged_max, + float *nudged_scale) +{ + // This code originates from tensorflow/core/kernels/fake_quant_ops_functor.h. + const float quant_min_float = static_cast(quant_min); + const float quant_max_float = static_cast(quant_max); + *nudged_scale = (max - min) / (quant_max_float - quant_min_float); + const float zero_point_from_min = quant_min_float - min / *nudged_scale; + uint16_t nudged_zero_point; + if (zero_point_from_min < quant_min_float) { + nudged_zero_point = static_cast(quant_min); + } else if (zero_point_from_min > quant_max_float) { + nudged_zero_point = static_cast(quant_max); + } else { + nudged_zero_point = static_cast(TfLiteRound(zero_point_from_min)); + } + *nudged_min = (quant_min_float - nudged_zero_point) * (*nudged_scale); + *nudged_max = (quant_max_float - nudged_zero_point) * (*nudged_scale); +} + +void FakeQuantizeArray(const float nudged_scale, const float nudged_min, + const float nudged_max, const float *input_data, + float *output_data, const float size) +{ + // This code originates from tensorflow/core/kernels/fake_quant_ops_functor.h. + const float inv_nudged_scale = 1.0f / nudged_scale; + + for (int i = 0; i < size; i++) { + const float src_val = input_data[i]; + const float clamped = std::min(nudged_max, std::max(nudged_min, src_val)); + const float clamped_shifted = clamped - nudged_min; + const float dst_val = + TfLiteRound(clamped_shifted * inv_nudged_scale) * nudged_scale + + nudged_min; + output_data[i] = dst_val; + } +} + +bool CheckedLog2(const float x, int *log2_result) +{ + // Using TfLiteRound instead of std::round and std::log instead of + // std::log2 to work around these functions being missing in a toolchain + // used in some TensorFlow tests as of May 2018. + const float x_log2 = std::log(x) * (1.0f / std::log(2.0f)); + const float x_log2_rounded = TfLiteRound(x_log2); + const float x_log2_fracpart = x_log2 - x_log2_rounded; + + *log2_result = static_cast(x_log2_rounded); + return std::abs(x_log2_fracpart) < 1e-3f; +} + +void QuantizeMultiplierArray(const double *effective_scales, size_t size, + int32_t *effective_scale_significand, + int *effective_shift) +{ + for (size_t i = 0; i < size; ++i) { + QuantizeMultiplier(effective_scales[i], &effective_scale_significand[i], + &effective_shift[i]); + } +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.h new file mode 100644 index 00000000..27fc0e08 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/quantization_util.h @@ -0,0 +1,290 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_QUANTIZATION_UTIL_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_QUANTIZATION_UTIL_H_ + +#include +#include +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +// Given the min and max values of a float array, return +// reasonable quantization parameters to use for this array. +template +QuantizationParams ChooseQuantizationParams(double rmin, double rmax, + bool narrow_range) +{ + const T qmin = std::numeric_limits::min() + (narrow_range ? 1 : 0); + const T qmax = std::numeric_limits::max(); + const double qmin_double = qmin; + const double qmax_double = qmax; + // 0 should always be a representable value. Let's assume that the initial + // min,max range contains 0. + TFLITE_CHECK_LE(rmin, 0.); + TFLITE_CHECK_GE(rmax, 0.); + if (rmin == rmax) { + // Special case where the min,max range is a point. Should be {0}. + TFLITE_CHECK_EQ(rmin, 0.); + TFLITE_CHECK_EQ(rmax, 0.); + QuantizationParams quantization_params; + quantization_params.zero_point = 0; + quantization_params.scale = 0.; + return quantization_params; + } + + // General case. + // + // First determine the scale. + const double scale = (rmax - rmin) / (qmax_double - qmin_double); + + // Zero-point computation. + // First the initial floating-point computation. The zero-point can be + // determined from solving an affine equation for any known pair + // (real value, corresponding quantized value). + // We know two such pairs: (rmin, qmin) and (rmax, qmax). + // The arithmetic error on the zero point computed from either pair + // will be roughly machine_epsilon * (sum of absolute values of terms) + // so we want to use the variant that adds the smaller terms. + const double zero_point_from_min = qmin_double - rmin / scale; + const double zero_point_from_max = qmax_double - rmax / scale; + const double zero_point_from_min_error = + std::abs(qmin_double) + std::abs(rmin / scale); + const double zero_point_from_max_error = + std::abs(qmax_double) + std::abs(rmax / scale); + + const double zero_point_double = + zero_point_from_min_error < zero_point_from_max_error ? zero_point_from_min : zero_point_from_max; + + // Now we need to nudge the zero point to be an integer + // (our zero points are integer, and this is motivated by the requirement + // to be able to represent the real value "0" exactly as a quantized value, + // which is required in multiple places, for example in Im2col with SAME + // padding). + T nudged_zero_point = 0; + if (zero_point_double < qmin_double) { + nudged_zero_point = qmin; + } else if (zero_point_double > qmax_double) { + nudged_zero_point = qmax; + } else { + nudged_zero_point = static_cast(round(zero_point_double)); + } + // The zero point should always be in the range of quantized value, + // [qmin, qmax]. + TFLITE_CHECK_GE(nudged_zero_point, qmin); + TFLITE_CHECK_LE(nudged_zero_point, qmax); + + // Finally, store the result nudged quantization params. + QuantizationParams quantization_params; + quantization_params.zero_point = nudged_zero_point; + quantization_params.scale = scale; + return quantization_params; +} + +template +QuantizationParams ChooseQuantizationParams(double rmin, double rmax) +{ + return ChooseQuantizationParams(rmin, rmax, false); +} + +// Converts a floating-point number to an integer. For all inputs x where +// static_cast(x) is legal according to the C++ standard, the result +// is identical to that cast (i.e. the result is x with its fractional part +// truncated whenever that is representable as IntOut). +// +// static_cast would cause undefined behavior for the following cases, which +// have well-defined behavior for this function: +// +// 1. If x is NaN, the result is zero. +// +// 2. If the truncated form of x is above the representable range of IntOut, +// the result is std::numeric_limits::max(). +// +// 3. If the truncated form of x is below the representable range of IntOut, +// the result is std::numeric_limits::min(). +// +// Note that cases #2 and #3 cover infinities as well as finite numbers. +// +// The range of FloatIn must include the range of IntOut, otherwise +// the results are undefined. +// TODO(sfeuz): Replace by absl::SafeCast once available. +template +IntOut SafeCast(FloatIn x) +{ + static_assert(!std::numeric_limits::is_integer, + "FloatIn is integer"); + static_assert(std::numeric_limits::is_integer, + "IntOut is not integer"); + static_assert(std::numeric_limits::radix == 2, "IntOut is base 2"); + + // Special case NaN, for which the logic below doesn't work. + if (std::isnan(x)) { + return 0; + } + + // Negative values all clip to zero for unsigned results. + if (!std::numeric_limits::is_signed && x < 0) { + return 0; + } + + // Handle infinities. + if (std::isinf(x)) { + return x < 0 ? std::numeric_limits::min() : std::numeric_limits::max(); + } + + // Set exp such that x == f * 2^exp for some f with |f| in [0.5, 1.0), + // unless x is zero in which case exp == 0. Note that this implies that the + // magnitude of x is strictly less than 2^exp. + int exp = 0; + std::frexp(x, &exp); + + // Let N be the number of non-sign bits in the representation of IntOut. If + // the magnitude of x is strictly less than 2^N, the truncated version of x + // is representable as IntOut. The only representable integer for which this + // is not the case is kMin for signed types (i.e. -2^N), but that is covered + // by the fall-through below. + if (exp <= std::numeric_limits::digits) { + return x; + } + + // Handle numbers with magnitude >= 2^N. + return x < 0 ? std::numeric_limits::min() : std::numeric_limits::max(); +} + +// Decompose a double multiplier into a Q0.31 int32 representation of its +// significand, and shift representation of NEGATIVE its exponent --- +// this is intended as a RIGHT-shift. +// +// Restricted to the case where the multiplier < 1 (and non-negative). +void QuantizeMultiplierSmallerThanOneExp(double double_multiplier, + int32_t *quantized_multiplier, + int *left_shift); + +// Decompose a double multiplier into a Q0.31 int32 representation of its +// significand, and shift representation of its exponent. +// +// Restricted to the case where the multiplier > 1. +void QuantizeMultiplierGreaterThanOne(double double_multiplier, + int32_t *quantized_multiplier, + int *left_shift); + +// Decompose a double multiplier into a Q0.31 int32 representation of its +// significand, and shift representation of its exponent. +// +// Handles an arbitrary positive multiplier. The 'shift' output-value is +// basically the 'floating-point exponent' of the multiplier: +// Negative for a right-shift (when the multiplier is <1), positive for a +// left-shift (when the multiplier is >1) +void QuantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, + int *shift); + +// Splits a double input value into a returned fraction, and a shift value from +// the exponent, using only bitwise and integer operations to support +// microcontrollers and other environments without floating-point support. +// +// This is designed to be a replacement for how std::frexp() is used within the +// QuantizeMultiplier() function, and so has a different signature than the +// standard version, returning a 64-bit integer rather than a double. This +// result has a maximum value of 1<<31, with the fraction expressed as a +// proportion of that maximum. +// +// std::frexp() returns NaNs and infinities unmodified, but since we're +// returning integers that can't represent those values, instead we return +// a shift of std::numeric_limits::max() for all bad numbers, with an int64 +// result of 0 for NaNs, std:numeric_limits::max() for +INFINITY, and +// std::numeric_limits::min() for -INFINITY. Denormalized inputs will +// result in return values that end up truncating some bits at the end, +// reflecting the loss of precision inherent in denormalization. +int64_t IntegerFrExp(double input, int *shift); + +// Converts an integer fraction in the format produced by IntegerFrExp (where +// 0x40000000 is 1.0) and an exponent shift (between -1022 and +1022) into an +// IEEE binary64 double format result. The implementation uses only integer and +// bitwise operators, so no floating point hardware support or emulation is +// needed. This is here so quantized operations can run non-time-critical +// preparation calculations on microcontrollers and other platforms without +// float support. +double DoubleFromFractionAndShift(int64_t fraction, int shift); + +// Performs a multiplication of two numbers in double format, using only integer +// and bitwise instructions. This is aimed at supporting housekeeping functions +// for quantized operations on microcontrollers without floating-point hardware. +double IntegerDoubleMultiply(double a, double b); + +// Returns -1 if a is less than b, 0 if a and b are equal, and +1 if a is +// greater than b. It is implemented using only integer and logical instructions +// so that it can be easily run on microcontrollers for quantized operations. +int IntegerDoubleCompare(double a, double b); + +// This first creates a multiplier in a double equivalent of +// Q(input_integer_bits).(31-input_integer_bits) representation, with extra +// precision in the double's fractional bits. It then splits the result into +// significand and exponent. +void PreprocessSoftmaxScaling(double beta, double input_scale, + int input_integer_bits, + int32_t *quantized_multiplier, int *left_shift); +// Like PreprocessSoftmaxScaling, but inverse scaling factors also calculated. +void PreprocessLogSoftmaxScalingExp(double beta, double input_scale, + int input_integer_bits, + int32_t *quantized_multiplier, + int *left_shift, + int32_t *reverse_scaling_divisor, + int *reverse_scaling_left_shift); +// Calculate the largest input that will result in a within-bounds intermediate +// result within MultiplyByQuantizedMultiplierGreaterThanOne. In other words, +// it must not overflow before we reduce the value by multiplication by the +// input multiplier. The negative radius is used as the minimum difference in +// Softmax. +int CalculateInputRadius(int input_integer_bits, int input_left_shift, + int total_signed_bits = 31); + +// Nudges a min/max quantization range to ensure zero is zero. +// Gymnastics with nudged zero point is to ensure that real zero maps to +// an integer, which is required for e.g. zero-padding in convolutional layers. +// Outputs nudged_min, nudged_max, nudged_scale. +void NudgeQuantizationRange(const float min, const float max, + const int quant_min, const int quant_max, + float *nudged_min, float *nudged_max, + float *nudged_scale); + +// Fake quantizes (quantizes and dequantizes) input_data using the scale, +// nudged_min, and nudged_max from NudgeQuantizationRange. This matches the code +// in TensorFlow's FakeQuantizeWithMinMaxVarsFunctor. +void FakeQuantizeArray(const float nudged_scale, const float nudged_min, + const float nudged_max, const float *input_data, + float *output_data, const float size); + +// If x is approximately a power of two (with any positive or negative +// exponent), stores that exponent (i.e. log2(x)) in *log2_result, otherwise +// returns false. +bool CheckedLog2(const float x, int *log2_result); + +// Decomposes an array of double multipliers into a Q0.31 int32 representation +// of its significand, and shift representation of its exponent. +// +// Handles an arbitrary multiplier. The 'shift' output-value is +// basically the 'floating-point exponent' of the multiplier: +// Negative for a right-shift (when the multiplier is <1), positive for a +// left-shift (when the multiplier is >1) +void QuantizeMultiplierArray(const double *effective_scales, size_t size, + int32_t *effective_scale_significand, + int *effective_shift); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_QUANTIZATION_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add.h new file mode 100644 index 00000000..5adcfd1b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add.h @@ -0,0 +1,406 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_H_ + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_ops { +template +inline void Add(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const T *input1_data, + const RuntimeShape &input2_shape, const T *input2_data, + const RuntimeShape &output_shape, T *output_data) +{ + T activation_min, activation_max; + GetActivationParams(params, &activation_min, &activation_max); + + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = ActivationFunctionWithMinMax( + input1_data[i] + input2_data[i], activation_min, activation_max); + } +} + +// Element-wise add that can often be used for inner loop of broadcast add as +// well as the non-broadcast add. + +// This function is used for 8-bit as well as for 16-bit, but the accumulator +// is 32-bit for both cases. The overflow does not happen due to the +// choice of the shift (20 or 15, accordingly - see add.cc for more comments). +template +inline void AddElementwise(int size, const ArithmeticParams ¶ms, + const T *input1_data, const T *input2_data, + T *output_data) +{ + TFLITE_DCHECK_GT(params.input1_offset, -std::numeric_limits::max()); + TFLITE_DCHECK_GT(params.input2_offset, -std::numeric_limits::max()); + TFLITE_DCHECK_LT(params.input1_offset, std::numeric_limits::max()); + TFLITE_DCHECK_LT(params.input2_offset, std::numeric_limits::max()); + + for (int i = 0; i < size; ++i) { + const int32_t input1_val = params.input1_offset + input1_data[i]; + const int32_t input2_val = params.input2_offset + input2_data[i]; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sum = scaled_input1_val + scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sum, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[i] = static_cast(clamped_output); + } +} + +// Scalar-broadcast add that can be used for inner loop of more general +// broadcast add, so that, for example, scalar-broadcast with batch will still +// be fast. +inline void AddScalarBroadcast(int size, const ArithmeticParams ¶ms, + uint8_t input1_data, const uint8_t *input2_data, + uint8_t *output_data) +{ + TFLITE_DCHECK_GT(params.input1_offset, -256); + TFLITE_DCHECK_GT(params.input2_offset, -256); + TFLITE_DCHECK_LT(params.input1_offset, 256); + TFLITE_DCHECK_LT(params.input2_offset, 256); + + const int32_t input1_val = params.input1_offset + input1_data; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + for (int i = 0; i < size; ++i) { + const int32_t input2_val = params.input2_offset + input2_data[i]; + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sum = scaled_input1_val + scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sum, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[i] = static_cast(clamped_output); + } +} + +inline void Add(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const uint8_t *input1_data, + const RuntimeShape &input2_shape, const uint8_t *input2_data, + const RuntimeShape &output_shape, uint8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + TFLITE_DCHECK_GT(params.input1_offset, -256); + TFLITE_DCHECK_GT(params.input2_offset, -256); + TFLITE_DCHECK_LT(params.input1_offset, 256); + TFLITE_DCHECK_LT(params.input2_offset, 256); + AddElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +inline void AddGeneralParamScale(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int16_t *input1_data, + const RuntimeShape &input2_shape, + const int16_t *input2_data, + const RuntimeShape &output_shape, + int16_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + int max_value = std::numeric_limits::max(); + + TFLITE_DCHECK_GT(params.input1_offset, -max_value); + TFLITE_DCHECK_GT(params.input2_offset, -max_value); + TFLITE_DCHECK_LT(params.input1_offset, max_value); + TFLITE_DCHECK_LT(params.input2_offset, max_value); + AddElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +inline void Add(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const int16_t *input1_data, + const RuntimeShape &input2_shape, const int16_t *input2_data, + const RuntimeShape &output_shape, int16_t *output_data, + bool pot_scale = true) +{ + if (!pot_scale) { + AddGeneralParamScale(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data); + return; + } + + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + + const int input1_shift = params.input1_shift; + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + const int16_t output_activation_min = params.quantized_activation_min; + const int16_t output_activation_max = params.quantized_activation_max; + + TFLITE_DCHECK(input1_shift == 0 || params.input2_shift == 0); + TFLITE_DCHECK_LE(input1_shift, 0); + TFLITE_DCHECK_LE(params.input2_shift, 0); + const int16_t *not_shift_input = + input1_shift == 0 ? input1_data : input2_data; + const int16_t *shift_input = input1_shift == 0 ? input2_data : input1_data; + const int input_right_shift = + input1_shift == 0 ? -params.input2_shift : -input1_shift; + + for (int i = 0; i < flat_size; i++) { + // F0 uses 0 integer bits, range [-1, 1]. + using F0 = gemmlowp::FixedPoint; + + F0 input_ready_scaled = F0::FromRaw(not_shift_input[i]); + F0 scaled_input = F0::FromRaw( + gemmlowp::RoundingDivideByPOT(shift_input[i], input_right_shift)); + F0 result = gemmlowp::SaturatingAdd(scaled_input, input_ready_scaled); + const int16_t raw_output = result.raw(); + const int16_t clamped_output = std::min( + output_activation_max, std::max(output_activation_min, raw_output)); + output_data[i] = clamped_output; + } +} + +template +inline typename std::enable_if::value, void>::type +BroadcastAdd4DSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const T *input1_data, + const RuntimeShape &input2_shape, const T *input2_data, + const RuntimeShape &output_shape, T *output_data) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + + T activation_min, activation_max; + GetActivationParams(params, &activation_min, &activation_max); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + output_data[Offset(extended_output_shape, b, y, x, c)] = + ActivationFunctionWithMinMax( + input1_data[SubscriptToIndex(desc1, b, y, x, c)] + + input2_data[SubscriptToIndex(desc2, b, y, x, c)], + activation_min, activation_max); + } + } + } + } +} + +// This function is used for 8-bit as well as for 16-bit, but the accumulator +// is 32-bit for both cases. The overflow does not happen due to the +// choice of the shift (20 or 15, accordingly - see add.cc for more comments). +template +inline typename std::enable_if::value, void>::type +BroadcastAdd4DSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const T *input1_data, + const RuntimeShape &input2_shape, const T *input2_data, + const RuntimeShape &output_shape, T *output_data) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + const int32_t input1_val = + params.input1_offset + + input1_data[SubscriptToIndex(desc1, b, y, x, c)]; + const int32_t input2_val = + params.input2_offset + + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; + const int32_t shifted_input1_val = + input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = + input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, + params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, + params.input2_shift); + const int32_t raw_sum = scaled_input1_val + scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sum, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[Offset(extended_output_shape, b, y, x, c)] = + static_cast(clamped_output); + } + } + } + } +} + +inline void BroadcastAddFivefold(const ArithmeticParams &unswitched_params, + const RuntimeShape &unswitched_input1_shape, + const uint8_t *unswitched_input1_data, + const RuntimeShape &unswitched_input2_shape, + const uint8_t *unswitched_input2_data, + const RuntimeShape &output_shape, + uint8_t *output_data) +{ + ArithmeticParams switched_params = unswitched_params; + switched_params.input1_offset = unswitched_params.input2_offset; + switched_params.input1_multiplier = unswitched_params.input2_multiplier; + switched_params.input1_shift = unswitched_params.input2_shift; + switched_params.input2_offset = unswitched_params.input1_offset; + switched_params.input2_multiplier = unswitched_params.input1_multiplier; + switched_params.input2_shift = unswitched_params.input1_shift; + + const bool use_unswitched = + unswitched_params.broadcast_category == + tflite::BroadcastableOpCategory::kFirstInputBroadcastsFast; + + const ArithmeticParams ¶ms = + use_unswitched ? unswitched_params : switched_params; + const uint8_t *input1_data = + use_unswitched ? unswitched_input1_data : unswitched_input2_data; + const uint8_t *input2_data = + use_unswitched ? unswitched_input2_data : unswitched_input1_data; + + // Fivefold nested loops. The second input resets its position for each + // iteration of the second loop. The first input resets its position at the + // beginning of the fourth loop. The innermost loop is an elementwise add of + // sections of the arrays. + uint8_t *output_data_ptr = output_data; + const uint8_t *input1_data_ptr = input1_data; + const uint8_t *input2_data_reset = input2_data; + // In the fivefold pattern, y0, y2 and y4 are not broadcast, and so shared + // between input shapes. y3 for input 1 is always broadcast, and so the + // dimension there is 1, whereas optionally y1 might be broadcast for input 2. + // Put another way, + // input1.shape.FlatSize = y0 * y1 * y2 * y4, + // input2.shape.FlatSize = y0 * y2 * y3 * y4. + int y0 = params.broadcast_shape[0]; + int y1 = params.broadcast_shape[1]; + int y2 = params.broadcast_shape[2]; + int y3 = params.broadcast_shape[3]; + int y4 = params.broadcast_shape[4]; + if (y4 > 1) { + // General fivefold pattern, with y4 > 1 so there is a non-broadcast inner + // dimension. + for (int i0 = 0; i0 < y0; ++i0) { + const uint8_t *input2_data_ptr; + for (int i1 = 0; i1 < y1; ++i1) { + input2_data_ptr = input2_data_reset; + for (int i2 = 0; i2 < y2; ++i2) { + for (int i3 = 0; i3 < y3; ++i3) { + AddElementwise(y4, params, input1_data_ptr, input2_data_ptr, + output_data_ptr); + input2_data_ptr += y4; + output_data_ptr += y4; + } + // We have broadcast y4 of input1 data y3 times, and now move on. + input1_data_ptr += y4; + } + } + // We have broadcast y2*y3*y4 of input2 data y1 times, and now move on. + input2_data_reset = input2_data_ptr; + } + } else { + // Special case of y4 == 1, in which the innermost loop is a single element + // and can be combined with the next (y3) as an inner broadcast. + // + // Note that this handles the case of pure scalar broadcast when + // y0 == y1 == y2 == 1. With low overhead it handles cases such as scalar + // broadcast with batch (as y2 > 1). + // + // NOTE The process is the same as the above general case except simplified + // for y4 == 1 and the loop over y3 is contained within the + // AddScalarBroadcast function. + for (int i0 = 0; i0 < y0; ++i0) { + const uint8_t *input2_data_ptr; + for (int i1 = 0; i1 < y1; ++i1) { + input2_data_ptr = input2_data_reset; + for (int i2 = 0; i2 < y2; ++i2) { + AddScalarBroadcast(y3, params, *input1_data_ptr, input2_data_ptr, + output_data_ptr); + input2_data_ptr += y3; + output_data_ptr += y3; + input1_data_ptr += 1; + } + } + input2_data_reset = input2_data_ptr; + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add_n.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add_n.h new file mode 100644 index 00000000..881d784f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/add_n.h @@ -0,0 +1,87 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_N_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_N_H_ + +#include +#include + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_ops { +// T is expected to be either float or int. +template +inline void AddN(const RuntimeShape &input_shape, const size_t num_inputs, + const T *const *input_data, T *output_data) +{ + // All inputs and output should have the same shape, this is checked during + // Prepare stage. + const size_t size = input_shape.FlatSize(); + for (size_t i = 0; i < size; ++i) { + T x = 0; + for (size_t j = 0; j < num_inputs; ++j) { + x += input_data[j][i]; + } + output_data[i] = x; + } +} + +inline void AddN(const ArithmeticParams ¶ms, + const RuntimeShape &input_shape, const size_t num_inputs, + const int8_t *const *input_data, int8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + // Input offset is negative input zero point. Activation tensors are + // asymmetric quantized so they span the full int8 range. + // All inputs should have same zero-point and scale, this is checked during + // Prepare stage. + TFLITE_DCHECK_GE(-params.input1_offset, std::numeric_limits::min()); + TFLITE_DCHECK_LE(-params.input1_offset, std::numeric_limits::max()); + + // All inputs and output should have the same shape, this is checked during + // Prepare stage. + const size_t size = input_shape.FlatSize(); + for (size_t i = 0; i < size; ++i) { + // accumulate in scaled_x before clamping to avoid overflow + const int32_t x = params.input1_offset; // x = 0 + const int32_t shifted_x = x * (1 << params.left_shift); + int32_t scaled_x = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_x, params.input1_multiplier, params.input1_shift); + + for (size_t j = 0; j < num_inputs; ++j) { + const int32_t y = params.input1_offset + input_data[j][i]; + const int32_t shifted_y = y * (1 << params.left_shift); + int32_t scaled_y = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_y, params.input1_multiplier, params.input1_shift); + scaled_x += scaled_y; + } + + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + scaled_x, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[i] = static_cast(clamped_output); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_N_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/arg_min_max.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/arg_min_max.h new file mode 100644 index 00000000..070e719d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/arg_min_max.h @@ -0,0 +1,89 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ARG_MIN_MAX_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ARG_MIN_MAX_H_ + +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +std::function GetComparefunction(bool is_arg_max) +{ + if (is_arg_max) { + return std::greater(); + } else { + return std::less(); + } +} + +template +void ArgMinMax(const RuntimeShape &input1_shape, const T1 *input1_data, + const T3 *input2_data, const RuntimeShape &output_shape, + T2 *output_data, const Cmp &cmp) +{ + TFLITE_DCHECK_GT(input1_shape.DimensionsCount(), 0); + TFLITE_DCHECK_EQ(input1_shape.DimensionsCount() - 1, + output_shape.DimensionsCount()); + int axis = input2_data[0]; + if (axis < 0) { + axis += input1_shape.DimensionsCount(); + } + const int axis_size = input1_shape.Dims(axis); + + int outer_size = 1; + for (int i = 0; i < axis; ++i) { + TFLITE_DCHECK_EQ(input1_shape.Dims(i), output_shape.Dims(i)); + outer_size *= input1_shape.Dims(i); + } + + int inner_size = 1; + const int dims_count = input1_shape.DimensionsCount(); + for (int i = axis + 1; i < dims_count; ++i) { + TFLITE_DCHECK_EQ(input1_shape.Dims(i), output_shape.Dims(i - 1)); + inner_size *= input1_shape.Dims(i); + } + for (int outer = 0; outer < outer_size; ++outer) { + for (int inner = 0; inner < inner_size; ++inner) { + auto min_max_value = input1_data[outer * axis_size * inner_size + inner]; + T2 min_max_index = 0; + for (int i = 1; i < axis_size; ++i) { + const auto &curr_value = + input1_data[(outer * axis_size + i) * inner_size + inner]; + if (cmp(curr_value, min_max_value)) { + min_max_value = curr_value; + min_max_index = static_cast(i); + } + } + output_data[outer * inner_size + inner] = min_max_index; + } + } +} + +template +void ArgMinMax(const RuntimeShape &input1_shape, const T1 *input1_data, + const T3 *input2_data, const RuntimeShape &output_shape, + T2 *output_data, const bool is_arg_max) +{ + ArgMinMax(input1_shape, input1_data, input2_data, output_shape, output_data, + GetComparefunction(is_arg_max)); +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ARG_MIN_MAX_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_matmul.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_matmul.h new file mode 100644 index 00000000..1014c1db --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_matmul.h @@ -0,0 +1,281 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BATCH_MATMUL_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BATCH_MATMUL_H_ + +#include +#include + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/tensor_utils_common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +namespace batch_matmul { +// Determine which dimension is the broadcast dimension. +inline int broadcast_dim(int lhs_dim, int rhs_dim) +{ + if (lhs_dim == rhs_dim) + return lhs_dim; + if (lhs_dim == 1) + return rhs_dim; + TFLITE_DCHECK_EQ(rhs_dim, 1); + return lhs_dim; +} + +// Compute the "extent" for iterating on this dimension. +// If we are broadcasting, then don't advance (i.e return 0). +inline int extent(const RuntimeShape &shape, int x) +{ + if (shape.Dims(x) == 1) { + return 0; + } + int prod = 1; + for (int i = x + 1; i < shape.DimensionsCount(); ++i) { + prod *= shape.Dims(i); + } + return prod; +} + +} // namespace batch_matmul + +template +inline void BatchMatMul(const RuntimeShape &lhs_shape, const Ta *lhs_data, + const RuntimeShape &rhs_shape, const Tb *rhs_data, + const RuntimeShape &output_shape, Tout *output_data) +{ + const RuntimeShape extended_lhs_shape = + RuntimeShape::ExtendedShape(5, lhs_shape); + const RuntimeShape extended_rhs_shape = + RuntimeShape::ExtendedShape(5, rhs_shape); + + const int batch_dim0 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(0), extended_rhs_shape.Dims(0)); + const int batch_dim1 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(1), extended_rhs_shape.Dims(1)); + const int batch_dim2 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(2), extended_rhs_shape.Dims(2)); + + const int lhs_ext0 = batch_matmul::extent(extended_lhs_shape, 0); + const int lhs_ext1 = batch_matmul::extent(extended_lhs_shape, 1); + const int lhs_ext2 = batch_matmul::extent(extended_lhs_shape, 2); + const int rhs_ext0 = batch_matmul::extent(extended_rhs_shape, 0); + const int rhs_ext1 = batch_matmul::extent(extended_rhs_shape, 1); + const int rhs_ext2 = batch_matmul::extent(extended_rhs_shape, 2); + + // Set params for each matrix multiply. + const int lhs_rows = extended_lhs_shape.Dims(3); + const int rhs_cols = extended_rhs_shape.Dims(4); + const int accum_depth = extended_lhs_shape.Dims(4); + + for (int b0 = 0; b0 < batch_dim0; ++b0) { + const Ta *lhs_ptr0 = lhs_data + (b0 * lhs_ext0); + const Tb *rhs_ptr0 = rhs_data + (b0 * rhs_ext0); + for (int b1 = 0; b1 < batch_dim1; ++b1) { + const Ta *lhs_ptr1 = lhs_ptr0 + b1 * lhs_ext1; + const Tb *rhs_ptr1 = rhs_ptr0 + b1 * rhs_ext1; + for (int b2 = 0; b2 < batch_dim2; ++b2) { + const Ta *lhs_ptr2 = lhs_ptr1 + b2 * lhs_ext2; + const Tb *rhs_ptr2 = rhs_ptr1 + b2 * rhs_ext2; + Tout *out_ptr = output_data + ((b0 * batch_dim1 * batch_dim2) + + b1 * batch_dim2 + b2) * + lhs_rows * rhs_cols; + for (int j = 0; j < rhs_cols; ++j) { + for (int i = 0; i < lhs_rows; ++i) { + Tout total = 0; + for (int k = 0; k < accum_depth; ++k) { + total += static_cast(lhs_ptr2[accum_depth * i + k]) * + static_cast(rhs_ptr2[j * accum_depth + k]); + } + int idx = lhs_rows * j + i; + out_ptr[idx] = total; + } + } + } + } + } +} + +inline void BatchMatMul(const RuntimeShape &lhs_shape, const int8_t *lhs_data, + const RuntimeShape &rhs_shape, const int8_t *rhs_data, + const float *scaling_factors, + const int32_t *input_offset, int32_t *row_sums, + const RuntimeShape &output_shape, float *output_data, + bool *compute_row_sums) +{ + const RuntimeShape extended_lhs_shape = + RuntimeShape::ExtendedShape(5, lhs_shape); + const RuntimeShape extended_rhs_shape = + RuntimeShape::ExtendedShape(5, rhs_shape); + + const int batch_dim0 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(0), extended_rhs_shape.Dims(0)); + const int batch_dim1 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(1), extended_rhs_shape.Dims(1)); + const int batch_dim2 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(2), extended_rhs_shape.Dims(2)); + + const int lhs_ext0 = batch_matmul::extent(extended_lhs_shape, 0); + const int lhs_ext1 = batch_matmul::extent(extended_lhs_shape, 1); + const int lhs_ext2 = batch_matmul::extent(extended_lhs_shape, 2); + const int rhs_ext0 = batch_matmul::extent(extended_rhs_shape, 0); + const int rhs_ext1 = batch_matmul::extent(extended_rhs_shape, 1); + const int rhs_ext2 = batch_matmul::extent(extended_rhs_shape, 2); + + // Set params for each matrix multiply. + const int lhs_rows = extended_lhs_shape.Dims(3); + const int rhs_cols = extended_rhs_shape.Dims(4); + const int accum_depth = extended_lhs_shape.Dims(4); + + const int ioff_ext0 = rhs_ext0 == 0 ? 0 : rhs_cols; + const int ioff_ext1 = rhs_ext1 == 0 ? 0 : rhs_cols; + const int ioff_ext2 = rhs_ext2 == 0 ? 0 : rhs_cols; + const int woff_ext0 = lhs_ext0 == 0 ? 0 : lhs_rows; + const int woff_ext1 = lhs_ext1 == 0 ? 0 : lhs_rows; + const int woff_ext2 = lhs_ext2 == 0 ? 0 : lhs_rows; + + if (!compute_row_sums || *compute_row_sums) { + int num_weights_matrices = 1; + for (int i = 1; i < extended_lhs_shape.DimensionsCount() - 2; ++i) { + num_weights_matrices *= extended_lhs_shape.Dims(i); + } + tensor_utils::ReductionSumVector( + lhs_data, row_sums, num_weights_matrices * lhs_rows, accum_depth); + if (compute_row_sums) { + *compute_row_sums = false; + } + } + + for (int b0 = 0; b0 < batch_dim0; ++b0) { + const int8_t *lhs_ptr0 = lhs_data + (b0 * lhs_ext0); + const int8_t *rhs_ptr0 = rhs_data + (b0 * rhs_ext0); + const int32_t *ioff_ptr0 = input_offset + (b0 * ioff_ext0); + const float *scale_ptr0 = scaling_factors + (b0 * ioff_ext0); + const int32_t *woff_ptr0 = row_sums + (b0 * woff_ext0); + for (int b1 = 0; b1 < batch_dim1; ++b1) { + const int8_t *lhs_ptr1 = lhs_ptr0 + b1 * lhs_ext1; + const int8_t *rhs_ptr1 = rhs_ptr0 + b1 * rhs_ext1; + const int32_t *ioff_ptr1 = ioff_ptr0 + (b1 * ioff_ext1); + const float *scale_ptr1 = scale_ptr0 + (b1 * ioff_ext1); + const int32_t *woff_ptr1 = woff_ptr0 + (b1 * woff_ext1); + for (int b2 = 0; b2 < batch_dim2; ++b2) { + const int8_t *lhs_ptr2 = lhs_ptr1 + b2 * lhs_ext2; + const int8_t *rhs_ptr2 = rhs_ptr1 + b2 * rhs_ext2; + const int32_t *ioff_ptr2 = ioff_ptr1 + (b2 * ioff_ext2); + const float *scale_ptr2 = scale_ptr1 + (b2 * ioff_ext2); + const int32_t *woff_ptr2 = woff_ptr1 + (b2 * woff_ext2); + float *out_ptr = output_data + ((b0 * batch_dim1 * batch_dim2) + + b1 * batch_dim2 + b2) * + lhs_rows * rhs_cols; + for (int j = 0; j < rhs_cols; ++j) { + const float batch_scaling_factor = scale_ptr2[j]; + const float batch_offset = static_cast(ioff_ptr2[j]); + for (int i = 0; i < lhs_rows; ++i) { + int32_t total = 0; + for (int k = 0; k < accum_depth; ++k) { + total += + lhs_ptr2[accum_depth * i + k] * rhs_ptr2[j * accum_depth + k]; + } + int32_t row_sum = woff_ptr2[i]; + total -= row_sum * batch_offset; + int idx = lhs_rows * j + i; + out_ptr[idx] += batch_scaling_factor * total; + } + } + } + } + } +} + +template +inline void BatchMatMul(const FullyConnectedParams ¶ms, + const RuntimeShape &lhs_shape, const T *lhs_data, + const RuntimeShape &rhs_shape, const T *rhs_data, + const RuntimeShape &output_shape, T *output_data) +{ + const RuntimeShape extended_lhs_shape = + RuntimeShape::ExtendedShape(5, lhs_shape); + const RuntimeShape extended_rhs_shape = + RuntimeShape::ExtendedShape(5, rhs_shape); + + const int batch_dim0 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(0), extended_rhs_shape.Dims(0)); + const int batch_dim1 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(1), extended_rhs_shape.Dims(1)); + const int batch_dim2 = batch_matmul::broadcast_dim( + extended_lhs_shape.Dims(2), extended_rhs_shape.Dims(2)); + + const int lhs_ext0 = batch_matmul::extent(extended_lhs_shape, 0); + const int lhs_ext1 = batch_matmul::extent(extended_lhs_shape, 1); + const int lhs_ext2 = batch_matmul::extent(extended_lhs_shape, 2); + const int rhs_ext0 = batch_matmul::extent(extended_rhs_shape, 0); + const int rhs_ext1 = batch_matmul::extent(extended_rhs_shape, 1); + const int rhs_ext2 = batch_matmul::extent(extended_rhs_shape, 2); + + // Set params for each matrix multiply. + const int lhs_rows = extended_lhs_shape.Dims(3); + const int rhs_cols = extended_rhs_shape.Dims(4); + const int accum_depth = extended_lhs_shape.Dims(4); + + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + + for (int b0 = 0; b0 < batch_dim0; ++b0) { + const T *lhs_ptr0 = lhs_data + (b0 * lhs_ext0); + const T *rhs_ptr0 = rhs_data + (b0 * rhs_ext0); + for (int b1 = 0; b1 < batch_dim1; ++b1) { + const T *lhs_ptr1 = lhs_ptr0 + b1 * lhs_ext1; + const T *rhs_ptr1 = rhs_ptr0 + b1 * rhs_ext1; + for (int b2 = 0; b2 < batch_dim2; ++b2) { + const T *lhs_ptr2 = lhs_ptr1 + b2 * lhs_ext2; + const T *rhs_ptr2 = rhs_ptr1 + b2 * rhs_ext2; + T *out_ptr = output_data + + ((b0 * batch_dim1 * batch_dim2) + b1 * batch_dim2 + b2) * + lhs_rows * rhs_cols; + + for (int j = 0; j < rhs_cols; ++j) { + for (int i = 0; i < lhs_rows; ++i) { + AccumT total = 0; + for (int k = 0; k < accum_depth; ++k) { + AccumT lhs_val = lhs_ptr2[accum_depth * i + k]; + AccumT rhs_val = rhs_ptr2[accum_depth * j + k]; + total += (lhs_val + filter_offset) * (rhs_val + input_offset); + } + int32_t total_scaled = MultiplyByQuantizedMultiplier( + total, output_multiplier, output_shift); + total_scaled += output_offset; + total_scaled = std::max(total_scaled, output_activation_min); + total_scaled = std::min(total_scaled, output_activation_max); + const int idx = lhs_rows * j + i; + out_ptr[idx] = static_cast(total_scaled); + } + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BATCH_MATMUL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_to_space_nd.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_to_space_nd.h new file mode 100644 index 00000000..f3a14e8b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/batch_to_space_nd.h @@ -0,0 +1,102 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BATCH_TO_SPACE_ND_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BATCH_TO_SPACE_ND_H_ + +#include + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// TODO(b/135760455): Move this method anonymous namespace in a cc file. +inline RuntimeShape ExtendShapeBatchToSpace(const RuntimeShape &shape) +{ + if (shape.DimensionsCount() == 4) { + return shape; + } + RuntimeShape new_shape(4, 1); + new_shape.SetDim(0, shape.Dims(0)); + new_shape.SetDim(1, shape.Dims(1)); + new_shape.SetDim(3, shape.Dims(2)); + return new_shape; +} + +template +inline void BatchToSpaceND(const RuntimeShape &unextended_input1_shape, + const T *input1_data, + const RuntimeShape &unextended_input2_shape, + const int32_t *block_shape_data, + const RuntimeShape &unextended_input3_shape, + const int32_t *crops_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + ruy::profiler::ScopeLabel label("BatchToSpaceND"); + TFLITE_DCHECK_GE(unextended_input1_shape.DimensionsCount(), 3); + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(unextended_input1_shape.DimensionsCount(), + unextended_output_shape.DimensionsCount()); + + const RuntimeShape input1_shape = + ExtendShapeBatchToSpace(unextended_input1_shape); + const RuntimeShape output_shape = + ExtendShapeBatchToSpace(unextended_output_shape); + + const int output_width = output_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_batch_size = output_shape.Dims(0); + + const int depth = input1_shape.Dims(3); + const int input_width = input1_shape.Dims(2); + const int input_height = input1_shape.Dims(1); + const int input_batch_size = input1_shape.Dims(0); + + const int block_shape_height = block_shape_data[0]; + const int block_shape_width = + unextended_input1_shape.DimensionsCount() == 4 ? block_shape_data[1] : 1; + const int crops_top = crops_data[0]; + const int crops_left = + unextended_input1_shape.DimensionsCount() == 4 ? crops_data[2] : 0; + for (int in_batch = 0; in_batch < input_batch_size; ++in_batch) { + const int out_batch = in_batch % output_batch_size; + const int spatial_offset = in_batch / output_batch_size; + for (int in_h = 0; in_h < input_height; ++in_h) { + const int out_h = in_h * block_shape_height + + spatial_offset / block_shape_width - crops_top; + if (out_h < 0 || out_h >= output_height) { + continue; + } + for (int in_w = 0; in_w < input_width; ++in_w) { + const int out_w = in_w * block_shape_width + + spatial_offset % block_shape_width - crops_left; + + if (out_w < 0 || out_w >= output_width) { + continue; + } + T *out = output_data + Offset(output_shape, out_batch, out_h, out_w, 0); + const T *in = + input1_data + Offset(input1_shape, in_batch, in_h, in_w, 0); + memcpy(out, in, depth * sizeof(T)); + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BATCH_TO_SPACE_ND_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/binary_function.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/binary_function.h new file mode 100644 index 00000000..4141e59d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/binary_function.h @@ -0,0 +1,80 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BINARY_FUNCTION_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BINARY_FUNCTION_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// Also appears to duplicate MinimumMaximum. +// +// R: Result type. T1: Input 1 type. T2: Input 2 type. +template +inline void BroadcastBinaryFunction4DSlow( + const RuntimeShape &unextended_input1_shape, const T1 *input1_data, + const RuntimeShape &unextended_input2_shape, const T2 *input2_data, + const RuntimeShape &unextended_output_shape, R *output_data, + R (*func)(T1, T2)) +{ + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, + unextended_input2_shape, &desc1, &desc2); + + for (int b = 0; b < output_shape.Dims(0); ++b) { + for (int y = 0; y < output_shape.Dims(1); ++y) { + for (int x = 0; x < output_shape.Dims(2); ++x) { + for (int c = 0; c < output_shape.Dims(3); ++c) { + auto out_idx = Offset(output_shape, b, y, x, c); + auto in1_idx = SubscriptToIndex(desc1, b, y, x, c); + auto in2_idx = SubscriptToIndex(desc2, b, y, x, c); + auto in1_val = input1_data[in1_idx]; + auto in2_val = input2_data[in2_idx]; + output_data[out_idx] = func(in1_val, in2_val); + } + } + } + } +} + +// R: Result type. T1: Input 1 type. T2: Input 2 type. +template +inline void BinaryFunction(const RuntimeShape &input1_shape, + const T1 *input1_data, + const RuntimeShape &input2_shape, + const T2 *input2_data, + const RuntimeShape &output_shape, R *output_data, + R (*func)(T1, T2)) +{ + const int flat_size = + MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = func(input1_data[i], input2_data[i]); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BINARY_FUNCTION_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/ceil.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/ceil.h new file mode 100644 index 00000000..e4e55094 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/ceil.h @@ -0,0 +1,36 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CEIL_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CEIL_H_ + +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void Ceil(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; ++i) { + output_data[i] = std::ceil(input_data[i]); + } +} + +} // namespace reference_ops +} // namespace tflite +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CEIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/comparisons.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/comparisons.h new file mode 100644 index 00000000..5023b36c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/comparisons.h @@ -0,0 +1,297 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_COMPARISONS_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_COMPARISONS_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline bool EqualFn(T lhs, T rhs) +{ + return lhs == rhs; +} + +template +inline bool NotEqualFn(T lhs, T rhs) +{ + return lhs != rhs; +} + +template +inline bool GreaterFn(T lhs, T rhs) +{ + return lhs > rhs; +} +template +inline bool GreaterEqualFn(T lhs, T rhs) +{ + return lhs >= rhs; +} +template +inline bool LessFn(T lhs, T rhs) +{ + return lhs < rhs; +} +template +inline bool LessEqualFn(T lhs, T rhs) +{ + return lhs <= rhs; +} + +template +using ComparisonFn = bool (*)(T, T); + +template F> +inline void ComparisonImpl( + const ComparisonParams &op_params, const RuntimeShape &input1_shape, + const T *input1_data, const RuntimeShape &input2_shape, + const T *input2_data, const RuntimeShape &output_shape, bool *output_data) +{ + const int64_t flatsize = + MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (int64_t i = 0; i < flatsize; ++i) { + output_data[i] = F(input1_data[i], input2_data[i]); + } +} + +template F> +inline void Comparison(const ComparisonParams &op_params, + const RuntimeShape &input1_shape, + const float *input1_data, + const RuntimeShape &input2_shape, + const float *input2_data, + const RuntimeShape &output_shape, bool *output_data) +{ + ComparisonImpl(op_params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data); +} + +template F> +inline void ComparisonWithScaling( + const ComparisonParams &op_params, const RuntimeShape &input1_shape, + const T *input1_data, const RuntimeShape &input2_shape, + const T *input2_data, const RuntimeShape &output_shape, bool *output_data) +{ + int left_shift = op_params.left_shift; + int32_t input1_offset = op_params.input1_offset; + int32_t input1_multiplier = op_params.input1_multiplier; + int input1_shift = op_params.input1_shift; + int32_t input2_offset = op_params.input2_offset; + int32_t input2_multiplier = op_params.input2_multiplier; + int input2_shift = op_params.input2_shift; + + const int64_t flatsize = + MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (int64_t i = 0; i < flatsize; ++i) { + const int32_t input1_val = input1_offset + input1_data[i]; + const int32_t input2_val = input2_offset + input2_data[i]; + const int32_t shifted_input1_val = input1_val * (1 << left_shift); + const int32_t shifted_input2_val = input2_val * (1 << left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, input1_multiplier, input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, input2_multiplier, input2_shift); + output_data[i] = F(scaled_input1_val, scaled_input2_val); + } +} + +struct BroadcastComparison4DSlowCommon { + const RuntimeShape output_shape; + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; +}; + +inline BroadcastComparison4DSlowCommon BroadcastComparison4DSlowPreprocess( + const RuntimeShape &unextended_input1_shape, + const RuntimeShape &unextended_input2_shape, + const RuntimeShape &unextended_output_shape) +{ + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, + unextended_input2_shape, &desc1, &desc2); + return { RuntimeShape::ExtendedShape(4, unextended_output_shape), desc1, + desc2 }; +} + +template F> +inline void BroadcastComparison4DSlowImpl( + const ComparisonParams &op_params, + const RuntimeShape &unextended_input1_shape, const T *input1_data, + const RuntimeShape &unextended_input2_shape, const T *input2_data, + const RuntimeShape &unextended_output_shape, bool *output_data) +{ + const BroadcastComparison4DSlowCommon dims = + BroadcastComparison4DSlowPreprocess(unextended_input1_shape, + unextended_input2_shape, + unextended_output_shape); + + for (int b = 0; b < dims.output_shape.Dims(0); ++b) { + for (int y = 0; y < dims.output_shape.Dims(1); ++y) { + for (int x = 0; x < dims.output_shape.Dims(2); ++x) { + for (int c = 0; c < dims.output_shape.Dims(3); ++c) { + output_data[Offset(dims.output_shape, b, y, x, c)] = + F(input1_data[SubscriptToIndex(dims.desc1, b, y, x, c)], + input2_data[SubscriptToIndex(dims.desc2, b, y, x, c)]); + } + } + } + } +} + +template F> +inline void BroadcastComparison4DSlow(const ComparisonParams &op_params, + const RuntimeShape &input1_shape, + const float *input1_data, + const RuntimeShape &input2_shape, + const float *input2_data, + const RuntimeShape &output_shape, + bool *output_data) +{ + BroadcastComparison4DSlowImpl(op_params, input1_shape, input1_data, + input2_shape, input2_data, + output_shape, output_data); +} + +template F> +inline void BroadcastComparison4DSlowWithScaling( + const ComparisonParams &op_params, + const RuntimeShape &unextended_input1_shape, const T *input1_data, + const RuntimeShape &unextended_input2_shape, const T *input2_data, + const RuntimeShape &unextended_output_shape, bool *output_data) +{ + const BroadcastComparison4DSlowCommon dims = + BroadcastComparison4DSlowPreprocess(unextended_input1_shape, + unextended_input2_shape, + unextended_output_shape); + + int left_shift = op_params.left_shift; + int32_t input1_offset = op_params.input1_offset; + int32_t input1_multiplier = op_params.input1_multiplier; + int input1_shift = op_params.input1_shift; + int32_t input2_offset = op_params.input2_offset; + int32_t input2_multiplier = op_params.input2_multiplier; + int input2_shift = op_params.input2_shift; + + for (int b = 0; b < dims.output_shape.Dims(0); ++b) { + for (int y = 0; y < dims.output_shape.Dims(1); ++y) { + for (int x = 0; x < dims.output_shape.Dims(2); ++x) { + for (int c = 0; c < dims.output_shape.Dims(3); ++c) { + const int32_t input1_val = + input1_offset + + input1_data[SubscriptToIndex(dims.desc1, b, y, x, c)]; + const int32_t input2_val = + input2_offset + + input2_data[SubscriptToIndex(dims.desc2, b, y, x, c)]; + const int32_t shifted_input1_val = input1_val * (1 << left_shift); + const int32_t shifted_input2_val = input2_val * (1 << left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, input1_multiplier, input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, input2_multiplier, input2_shift); + output_data[Offset(dims.output_shape, b, y, x, c)] = + F(scaled_input1_val, scaled_input2_val); + } + } + } + } +} + +#define TFLITE_COMPARISON_OP(name) \ + inline void name(const ComparisonParams &op_params, \ + const RuntimeShape &input1_shape, const float *input1_data, \ + const RuntimeShape &input2_shape, const float *input2_data, \ + const RuntimeShape &output_shape, bool *output_data) \ + { \ + Comparison(op_params, input1_shape, input1_data, input2_shape, \ + input2_data, output_shape, output_data); \ + } \ + template \ + inline void name##NoScaling( \ + const ComparisonParams &op_params, const RuntimeShape &input1_shape, \ + const T *input1_data, const RuntimeShape &input2_shape, \ + const T *input2_data, const RuntimeShape &output_shape, \ + bool *output_data) \ + { \ + ComparisonImpl(op_params, input1_shape, input1_data, \ + input2_shape, input2_data, output_shape, \ + output_data); \ + } \ + template \ + inline void name##WithScaling( \ + const ComparisonParams &op_params, const RuntimeShape &input1_shape, \ + const T *input1_data, const RuntimeShape &input2_shape, \ + const T *input2_data, const RuntimeShape &output_shape, \ + bool *output_data) \ + { \ + ComparisonWithScaling(op_params, input1_shape, input1_data, \ + input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name##NoScaling( \ + const ComparisonParams &op_params, const RuntimeShape &input1_shape, \ + const T *input1_data, const RuntimeShape &input2_shape, \ + const T *input2_data, const RuntimeShape &output_shape, \ + bool *output_data) \ + { \ + BroadcastComparison4DSlowImpl( \ + op_params, input1_shape, input1_data, input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + inline void Broadcast4DSlow##name( \ + const ComparisonParams &op_params, const RuntimeShape &input1_shape, \ + const float *input1_data, const RuntimeShape &input2_shape, \ + const float *input2_data, const RuntimeShape &output_shape, \ + bool *output_data) \ + { \ + BroadcastComparison4DSlow(op_params, input1_shape, input1_data, \ + input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name##WithScaling( \ + const ComparisonParams &op_params, const RuntimeShape &input1_shape, \ + const T *input1_data, const RuntimeShape &input2_shape, \ + const T *input2_data, const RuntimeShape &output_shape, \ + bool *output_data) \ + { \ + BroadcastComparison4DSlowWithScaling( \ + op_params, input1_shape, input1_data, input2_shape, input2_data, \ + output_shape, output_data); \ + } +TFLITE_COMPARISON_OP(Equal); +TFLITE_COMPARISON_OP(NotEqual); +TFLITE_COMPARISON_OP(Greater); +TFLITE_COMPARISON_OP(GreaterEqual); +TFLITE_COMPARISON_OP(Less); +TFLITE_COMPARISON_OP(LessEqual); +#undef TFLITE_COMPARISON_OP + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_COMPARISONS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/concatenation.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/concatenation.h new file mode 100644 index 00000000..3b119137 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/concatenation.h @@ -0,0 +1,140 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONCATENATION_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONCATENATION_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void Concatenation(const ConcatenationParams ¶ms, + const RuntimeShape *const *input_shapes, + const Scalar *const *input_data, + const RuntimeShape &output_shape, + Scalar *output_data) +{ + int axis = params.axis; + int inputs_count = params.inputs_count; + const int concat_dimensions = output_shape.DimensionsCount(); + TFLITE_DCHECK_LT(axis, concat_dimensions); + + int64_t concat_size = 0; + for (int i = 0; i < inputs_count; i++) { + TFLITE_DCHECK_EQ(input_shapes[i]->DimensionsCount(), concat_dimensions); + for (int j = 0; j < concat_dimensions; j++) { + if (j != axis) { + MatchingDim(*input_shapes[i], j, output_shape, j); + } + } + concat_size += input_shapes[i]->Dims(axis); + } + TFLITE_DCHECK_EQ(concat_size, output_shape.Dims(axis)); + int64_t outer_size = 1; + for (int i = 0; i < axis; ++i) { + outer_size *= output_shape.Dims(i); + } + // For all input arrays, + // FlatSize() = outer_size * Dims(axis) * base_inner_size; + int64_t base_inner_size = 1; + for (int i = axis + 1; i < concat_dimensions; ++i) { + base_inner_size *= output_shape.Dims(i); + } + + Scalar *output_ptr = output_data; + for (int k = 0; k < outer_size; k++) { + for (int i = 0; i < inputs_count; ++i) { + const int copy_size = input_shapes[i]->Dims(axis) * base_inner_size; + const Scalar *input_ptr = input_data[i] + k * copy_size; + memcpy(output_ptr, input_ptr, copy_size * sizeof(Scalar)); + output_ptr += copy_size; + } + } +} + +// TODO(b/174275780): The quantized implementation of concatentation isn't fully +// quantized as it takes scale as a floating point value. This should be fixed +// when optimizng this routine further. +inline void ConcatenationWithScaling(const ConcatenationParams ¶ms, + const RuntimeShape *const *input_shapes, + const uint8_t *const *input_data, + const RuntimeShape &output_shape, + uint8_t *output_data) +{ + int axis = params.axis; + const int32_t *input_zeropoint = params.input_zeropoint; + const float *input_scale = params.input_scale; + int inputs_count = params.inputs_count; + const int32_t output_zeropoint = params.output_zeropoint; + const float output_scale = params.output_scale; + + const int concat_dimensions = output_shape.DimensionsCount(); + TFLITE_DCHECK_LT(axis, concat_dimensions); + + int64_t concat_size = 0; + for (int i = 0; i < inputs_count; i++) { + TFLITE_DCHECK_EQ(input_shapes[i]->DimensionsCount(), concat_dimensions); + for (int j = 0; j < concat_dimensions; j++) { + if (j != axis) { + MatchingDim(*input_shapes[i], j, output_shape, j); + } + } + concat_size += input_shapes[i]->Dims(axis); + } + TFLITE_DCHECK_EQ(concat_size, output_shape.Dims(axis)); + int64_t outer_size = 1; + for (int i = 0; i < axis; ++i) { + outer_size *= output_shape.Dims(i); + } + // For all input arrays, + // FlatSize() = outer_size * Dims(axis) * base_inner_size; + int64_t base_inner_size = 1; + for (int i = axis + 1; i < concat_dimensions; ++i) { + base_inner_size *= output_shape.Dims(i); + } + + const float inverse_output_scale = 1.f / output_scale; + uint8_t *output_ptr = output_data; + for (int k = 0; k < outer_size; k++) { + for (int i = 0; i < inputs_count; ++i) { + const int copy_size = input_shapes[i]->Dims(axis) * base_inner_size; + const uint8_t *input_ptr = input_data[i] + k * copy_size; + if (input_zeropoint[i] == output_zeropoint && + input_scale[i] == output_scale) { + memcpy(output_ptr, input_ptr, copy_size); + } else { + const float scale = input_scale[i] * inverse_output_scale; + const float bias = -input_zeropoint[i] * scale; + for (int j = 0; j < copy_size; ++j) { + const int32_t value = static_cast(tflite::TfLiteRound( + input_ptr[j] * scale + bias)) + + output_zeropoint; + output_ptr[j] = static_cast( + std::max(std::min(255, value), 0)); + } + } + output_ptr += copy_size; + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONCATENATION_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/conv.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/conv.h new file mode 100644 index 00000000..0fe12ccf --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/conv.h @@ -0,0 +1,265 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void Conv(const ConvParams ¶ms, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &filter_shape, + const float *filter_data, const RuntimeShape &bias_shape, + const float *bias_data, const RuntimeShape &output_shape, + float *output_data, const RuntimeShape &im2col_shape, + float *im2col_data) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + const int in_y_origin = (out_y * stride_height) - pad_height; + for (int out_x = 0; out_x < output_width; ++out_x) { + const int in_x_origin = (out_x * stride_width) - pad_width; + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + float total = 0.f; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + const int in_y = in_y_origin + dilation_height_factor * filter_y; + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + + if (!is_point_inside_image) { + continue; + } + + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + float input_value = input_data[Offset(input_shape, batch, in_y, + in_x, in_channel)]; + float filter_value = filter_data[Offset( + filter_shape, out_channel, filter_y, filter_x, in_channel)]; + total += (input_value * filter_value); + } + } + } + float bias_value = 0.0f; + if (bias_data) { + bias_value = bias_data[out_channel]; + } + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + ActivationFunctionWithMinMax(total + bias_value, + output_activation_min, + output_activation_max); + } + } + } + } +} + +inline void Conv(const ConvParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &filter_shape, + const uint8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + uint8_t *output_data, const RuntimeShape &im2col_shape, + uint8_t *im2col_data, void *cpu_backend_context) +{ + (void)cpu_backend_context; // only used in optimized code. + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + const int in_y_origin = (out_y * stride_height) - pad_height; + for (int out_x = 0; out_x < output_width; ++out_x) { + const int in_x_origin = (out_x * stride_width) - pad_width; + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + const int in_y = in_y_origin + dilation_height_factor * filter_y; + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + + if (!is_point_inside_image) { + continue; + } + + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + int32_t input_val = input_data[Offset(input_shape, batch, in_y, + in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, out_channel, filter_y, filter_x, in_channel)]; + acc += + (filter_val + filter_offset) * (input_val + input_offset); + } + } + } + if (bias_data) { + acc += bias_data[out_channel]; + } + acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, + output_shift); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + static_cast(acc); + } + } + } + } +} + +inline void HybridConvPerChannel( + const ConvParams ¶ms, float *scaling_factors_ptr, + const RuntimeShape &input_shape, const int8_t *input_data, + const RuntimeShape &filter_shape, const int8_t *filter_data, + const RuntimeShape &bias_shape, const float *bias_data, + const RuntimeShape &output_shape, float *output_data, + const RuntimeShape &im2col_shape, int8_t *im2col_data, + const float *per_channel_scale, int32_t *input_offset) +{ + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // If the location is outside the bounds of the input image, + // use zero as a default value. + if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height)) { + int32_t input_val = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + int32_t filter_val = + filter_data[Offset(filter_shape, out_channel, filter_y, + filter_x, in_channel)]; + acc += filter_val * (input_val - input_offset[batch]); + } + } + } + } + float acc_float = + acc * per_channel_scale[out_channel] * scaling_factors_ptr[batch]; + if (bias_data) { + acc_float += bias_data[out_channel]; + } + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + ActivationFunctionWithMinMax(acc_float, output_activation_min, + output_activation_max); + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/cumsum.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/cumsum.h new file mode 100644 index 00000000..4f29ce2c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/cumsum.h @@ -0,0 +1,176 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CUMSUM_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CUMSUM_H_ + +#include +#include +#include + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" + +namespace tflite { +namespace reference_ops { +template +inline void CumSum(const T *input_data, const RuntimeShape &shape, int32_t axis, + bool exclusive, bool reverse, T *output_data) +{ + const int32_t rank = shape.DimensionsCount(); + TFLITE_DCHECK_GE(rank, 1); + TFLITE_DCHECK_GE(axis, 0); + TFLITE_DCHECK_LT(axis, rank); + + size_t inner = 1; + size_t outer = 1; + size_t depth = 1; + for (int32_t i = 0; i < rank; i++) { + if (i < axis) + inner *= shape.Dims(i); + else if (i > axis) + outer *= shape.Dims(i); + else + depth = shape.Dims(i); + } + + for (size_t outer_index = 0; outer_index < outer; outer_index++) { + size_t outer_index_adj; + if (reverse) + outer_index_adj = (outer - 1) - outer_index; + else + outer_index_adj = outer_index; + for (size_t inner_index = 0; inner_index < inner; inner_index++) { + T accumulator = 0; + size_t inner_index_adj; + if (reverse) + inner_index_adj = (inner - 1) - inner_index; + else + inner_index_adj = inner_index; + for (size_t depth_index = 0; depth_index < depth; depth_index++) { + size_t depth_index_adj; + if (reverse) + depth_index_adj = (depth - 1) - depth_index; + else + depth_index_adj = depth_index; + + size_t index = outer_index_adj; + index += inner_index_adj * depth * outer; + index += depth_index_adj * outer; + + if (exclusive) { + output_data[index] = accumulator; + accumulator += input_data[index]; + } else { + accumulator += input_data[index]; + output_data[index] = accumulator; + } + } + } + } +} + +// +// Quantized INT8 CUMSUM +// +inline void CumSum(const ArithmeticParams ¶ms, const int8_t *input_data, + const RuntimeShape &shape, int32_t axis, bool exclusive, + bool reverse, int8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + // Input offset is negative input zero point. Activation tensors are + // asymmetric quantized so they span the full int8 range. + // All inputs should have same zero-point and scale, this is checked during + // Prepare stage. + TFLITE_DCHECK_GE(-params.input1_offset, std::numeric_limits::min()); + TFLITE_DCHECK_LE(-params.input1_offset, std::numeric_limits::max()); + + const int32_t rank = shape.DimensionsCount(); + TFLITE_DCHECK_GE(rank, 1); + TFLITE_DCHECK_GE(axis, 0); + TFLITE_DCHECK_LT(axis, rank); + + size_t inner = 1; + size_t outer = 1; + size_t depth = 1; + for (int32_t i = 0; i < rank; i++) { + if (i < axis) + inner *= shape.Dims(i); + else if (i > axis) + outer *= shape.Dims(i); + else + depth = shape.Dims(i); + } + + for (size_t outer_index = 0; outer_index < outer; outer_index++) { + size_t outer_index_adj; + if (reverse) + outer_index_adj = (outer - 1) - outer_index; + else + outer_index_adj = outer_index; + for (size_t inner_index = 0; inner_index < inner; inner_index++) { + int32_t accumulator = params.input1_offset; // accumulator = 0 + accumulator *= (1 << params.left_shift); + accumulator = MultiplyByQuantizedMultiplierSmallerThanOneExp( + accumulator, params.input1_multiplier, params.input1_shift); + + size_t inner_index_adj; + if (reverse) + inner_index_adj = (inner - 1) - inner_index; + else + inner_index_adj = inner_index; + + for (size_t depth_index = 0; depth_index < depth; depth_index++) { + size_t depth_index_adj; + if (reverse) + depth_index_adj = (depth - 1) - depth_index; + else + depth_index_adj = depth_index; + + size_t index = outer_index_adj; + index += inner_index_adj * depth * outer; + index += depth_index_adj * outer; + + const int32_t y = params.input1_offset + input_data[index]; + const int32_t shifted_y = y * (1 << params.left_shift); + const int32_t scaled_y = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_y, params.input1_multiplier, params.input1_shift); + + int32_t scaled_output; + if (exclusive) { + scaled_output = accumulator; + accumulator += scaled_y; + } else { + accumulator += scaled_y; + scaled_output = accumulator; + } + + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + scaled_output, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[index] = static_cast(clamped_output); + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CUMSUM_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depth_to_space.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depth_to_space.h new file mode 100644 index 00000000..00cca867 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depth_to_space.h @@ -0,0 +1,79 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTH_TO_SPACE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTH_TO_SPACE_H_ + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void DepthToSpace(const tflite::DepthToSpaceParams &op_params, + const RuntimeShape &unextended_input_shape, + const T *input_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + const int input_depth = input_shape.Dims(3); + const int input_width = input_shape.Dims(2); + const int input_height = input_shape.Dims(1); + const int input_batch = input_shape.Dims(0); + + const int output_depth = output_shape.Dims(3); + const int output_width = output_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_batch = output_shape.Dims(0); + + const int32_t block_size = op_params.block_size; + + TFLITE_DCHECK_EQ(input_width * block_size, output_width); + TFLITE_DCHECK_EQ(input_height * block_size, output_height); + TFLITE_DCHECK_EQ(input_depth, output_depth * block_size * block_size); + TFLITE_DCHECK_EQ(input_batch, output_batch); + + for (int out_b = 0; out_b < output_batch; ++out_b) { + for (int out_h = 0; out_h < output_height; ++out_h) { + for (int out_w = 0; out_w < output_width; ++out_w) { + for (int out_d = 0; out_d < output_depth; ++out_d) { + const int in_d = + out_d + ((out_h % block_size) * block_size + out_w % block_size) * + output_depth; + + const int in_w = out_w / block_size; + const int in_h = out_h / block_size; + const int in_b = out_b; + + const int input_index = Offset(input_shape, in_b, in_h, in_w, in_d); + const int output_index = + Offset(output_shape, out_b, out_h, out_w, out_d); + + output_data[output_index] = input_data[input_index]; + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTH_TO_SPACE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h new file mode 100644 index 00000000..0b6c08ff --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h @@ -0,0 +1,100 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_FLOAT_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_FLOAT_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void DepthwiseConv( + const DepthwiseParams ¶ms, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &filter_shape, + const float *filter_data, const RuntimeShape &bias_shape, + const float *bias_data, const RuntimeShape &output_shape, + float *output_data) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + + for (int b = 0; b < batches; ++b) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int ic = 0; ic < input_depth; ++ic) { + for (int m = 0; m < depth_multiplier; m++) { + const int oc = m + ic * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + float total = 0.f; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // If the location is outside the bounds of the input image, + // use zero as a default value. + if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height)) { + float input_value = + input_data[Offset(input_shape, b, in_y, in_x, ic)]; + float filter_value = filter_data[Offset( + filter_shape, 0, filter_y, filter_x, oc)]; + total += (input_value * filter_value); + } + } + } + float bias_value = 0.0f; + if (bias_data) { + bias_value = bias_data[oc]; + } + output_data[Offset(output_shape, b, out_y, out_x, oc)] = + ActivationFunctionWithMinMax(total + bias_value, + output_activation_min, + output_activation_max); + } + } + } + } + } +} + +} // end namespace reference_ops +} // end namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_FLOAT_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h new file mode 100644 index 00000000..7de2d377 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h @@ -0,0 +1,301 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_UINT8_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_UINT8_H_ + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +// Used in tests and template parameters to control which version of depthwise +// convolution is called. Primarily for reference code, and specializations +// forced in tests. +enum class DepthwiseConvImplementation { + // Run all tests against kUseStandardEntry even if also testing another + // kernel, since we need to be sure that the main DepthwiseConv() function in + // optimized_ops.h dispatches to a correctly-executing kernel. + kNone = 0, // The "default" option: use the normal + // DepthwiseConv kernel (entry) function. + kUseGenericKernel, // Forced use of generic kernel. + kUseNeon3x3, // 3x3 kernel that uses NEON when available. + kUseNeon3x3DotProduct, // 3x3 kernel that uses dot-product enabled NEON + // when available. + kUseCModel3x3DotProduct, // 3x3 kernel, reference C model that is intended + // to match overall design NEON code. + kUseUnwound3x3DotProduct, // 3x3 kernel, reference C model with unwound loops + // and some arrays. + kUseIntrinsics3x3DotProduct, // 3x3 kernel using NEON intrinsics. +}; + +// Category of depthwise convolution output rounding. +enum class DepthwiseConvOutputRounding { + kNone = 0, // Invalid: specific method must be specified. + kAwayFromZero, // Original method: exact halves rounded away from zero. + kUpward, // Halves towards +infinity: adds 0.5 before truncate. + // This is where a future kNearestEven would be placed. +}; + +// Category of depthwise convolution depth multiplication. +enum class DepthwiseConvDepthMultiplication { + kNoMultiplication = 0, // Depth multiplier = 1. + kUnitInputDepth, // Input depth = 1, output depth = depth multiplier. +}; + +namespace reference_ops { +namespace depthwise_conv { +template +inline int32_t DepthwiseConvRound(int32_t x, int32_t quantized_multiplier, + int shift) +{ + TFLITE_DCHECK_NE(output_rounding, DepthwiseConvOutputRounding::kNone); + return MultiplyByQuantizedMultiplier(x, quantized_multiplier, shift); +} + +template <> +inline int32_t DepthwiseConvRound( + int32_t x, int32_t quantized_multiplier, int shift) +{ + return MultiplyByQuantizedMultiplier(x, quantized_multiplier, shift); +} + +template <> +inline int32_t DepthwiseConvRound( + int32_t x, int32_t quantized_multiplier, int shift) +{ + using gemmlowp::SaturatingRoundingDoublingHighMul; + const int left_shift = shift > 0 ? shift : 0; + const int right_shift = shift > 0 ? 0 : -shift; + const int rounding_offset = right_shift > 0 ? 1 << (right_shift - 1) : 0; + return (SaturatingRoundingDoublingHighMul(x * (1 << left_shift), + quantized_multiplier) + + rounding_offset) >> + right_shift; +} + +template +struct DepthwiseConvBasicKernel { + static inline void Run( + const DepthwiseParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &filter_shape, + const uint8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + uint8_t *output_data) + { + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + + for (int b = 0; b < batches; ++b) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int ic = 0; ic < input_depth; ++ic) { + for (int m = 0; m < depth_multiplier; m++) { + const int oc = m + ic * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = + in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // If the location is outside the bounds of the input image, + // use zero as a default value. + if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height)) { + int32_t input_val = + input_data[Offset(input_shape, b, in_y, in_x, ic)]; + int32_t filter_val = filter_data[Offset( + filter_shape, 0, filter_y, filter_x, oc)]; + acc += (filter_val + filter_offset) * + (input_val + input_offset); + } + } + } + if (bias_data) { + acc += bias_data[oc]; + } + acc = DepthwiseConvRound(acc, output_multiplier, + output_shift); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[Offset(output_shape, b, out_y, out_x, oc)] = + static_cast(acc); + } + } + } + } + } + } + + // TODO(b/148596273): Reconcile reference versions, perhaps with common + // MultiplyByQuantizedMultiplier or DepthwiseConvRound function. + static inline void RunPerChannel( + const DepthwiseParams ¶ms, const RuntimeShape &input_shape, + const int8_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int8_t *output_data) + { + // Get parameters. + // TODO(b/141565753): Re-introduce ScopedProfilingLabel on Micro. + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const int32_t input_offset = params.input_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + const int32_t *output_multiplier = params.output_multiplier_per_channel; + const int32_t *output_shift = params.output_shift_per_channel; + + // Check dimensions of the tensors. + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + for (int m = 0; m < depth_multiplier; ++m) { + const int output_channel = m + in_channel * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = + in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + if (is_point_inside_image) { + int32_t input_val = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, 0, filter_y, filter_x, output_channel)]; + // Accumulate with 32 bits accumulator. + // In the nudging process during model quantization, we + // force real value of 0.0 be represented by a quantized + // value. This guarantees that the input_offset is a int8_t, + // even though it is represented using int32_t. int32_t += + // int8_t + // * (int8_t - int8_t) so the highest value we can get from + // each accumulation is [-127, 127] * ([-128, 127] - + // [-128, 127]), which is [-32512, 32512]. log2(32512) + // = 14.98, which means we can accumulate at least 2^16 + // multiplications without overflow. The accumulator is + // applied to a filter so the accumulation logic will hold + // as long as the filter size (filter_y * filter_x * + // in_channel) does not exceed 2^16, which is the case in + // all the models we have seen so far. + acc += filter_val * (input_val + input_offset); + } + } + } + if (bias_data) { + acc += bias_data[output_channel]; + } + acc = DepthwiseConvRound( + acc, output_multiplier[output_channel], + output_shift[output_channel]); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, + output_channel)] = static_cast(acc); + } + } + } + } + } + } +}; + +} // namespace depthwise_conv + +inline void DepthwiseConv( + const DepthwiseParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &filter_shape, + const uint8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + uint8_t *output_data) +{ + return depthwise_conv::DepthwiseConvBasicKernel< + DepthwiseConvOutputRounding::kAwayFromZero>::Run(params, input_shape, + input_data, filter_shape, + filter_data, bias_shape, + bias_data, output_shape, + output_data); +} + +} // namespace reference_ops +} // end namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_UINT8_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/dequantize.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/dequantize.h new file mode 100644 index 00000000..f09bb7c3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/dequantize.h @@ -0,0 +1,78 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ + +#include + +#include + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// Dequantizes into a float without rounding. +template +inline void Dequantize(const tflite::DequantizationParams &op_params, + const RuntimeShape &input_shape, + const InputT *input_data, + const RuntimeShape &output_shape, OutputT *output_data) +{ + int32_t zero_point = op_params.zero_point; + const double scale = op_params.scale; + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + const int32_t val = input_data[i]; + const OutputT result = static_cast(scale * (val - zero_point)); + output_data[i] = result; + } +} + +// Dequantizes per-channel quantized tensor to float. +template +inline void PerChannelDequantize( + const tflite::PerChannelDequantizationParams &op_params, + const RuntimeShape &input_shape, const T *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + // Ensure flat size is same. + MatchingFlatSize(input_shape, output_shape); + + const int32_t *zero_point = op_params.zero_point; + const float *scale = op_params.scale; + const int32_t quantized_dimension = op_params.quantized_dimension; + const int32_t num_dims = input_shape.DimensionsCount(); + const int32_t *dims_data = input_shape.DimsData(); + std::vector current_dim(num_dims, 0); + + do { + size_t offset = + ReducedOutputOffset(num_dims, reinterpret_cast(dims_data), + current_dim.data(), 0, nullptr); + const int channel = current_dim[quantized_dimension]; + const int32_t val = input_data[offset]; + const float result = + static_cast(scale[channel] * (val - zero_point[channel])); + output_data[offset] = result; + } while (NextIndex(num_dims, reinterpret_cast(dims_data), + current_dim.data())); +} + +} // namespace reference_ops + +} // namespace tflite +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/elu.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/elu.h new file mode 100644 index 00000000..839f5f4b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/elu.h @@ -0,0 +1,36 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ELU_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ELU_H_ + +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void Elu(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const float val = input_data[i]; + output_data[i] = val < 0.0f ? TfLiteExpm1(val) : val; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ELU_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/exp.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/exp.h new file mode 100644 index 00000000..401191ca --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/exp.h @@ -0,0 +1,38 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_EXP_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_EXP_H_ + +#include + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void Exp(const T *input_data, const size_t num_elements, + T *output_data) +{ + ruy::profiler::ScopeLabel label("Exp"); + for (size_t idx = 0; idx < num_elements; ++idx) { + output_data[idx] = std::exp(input_data[idx]); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_EXP_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fill.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fill.h new file mode 100644 index 00000000..13c5dc56 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fill.h @@ -0,0 +1,38 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FILL_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FILL_H_ + +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +void Fill(const RuntimeShape &value_shape, const T *value_data, + const RuntimeShape &output_shape, T *output_data) +{ + TFLITE_DCHECK_EQ(value_shape.DimensionsCount(), 0); + const int flat_size = output_shape.FlatSize(); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = *value_data; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FILL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor.h new file mode 100644 index 00000000..a2c1b96b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor.h @@ -0,0 +1,38 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_H_ + +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void Floor(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + int offset = i; + output_data[offset] = std::floor(input_data[offset]); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_div.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_div.h new file mode 100644 index 00000000..bfa18c3b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_div.h @@ -0,0 +1,35 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_DIV_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_DIV_H_ + +#include +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +T FloorDiv(T input1, T input2) +{ + return std::floor(std::divides()(static_cast(input1), + static_cast(input2))); +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_DIV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_mod.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_mod.h new file mode 100644 index 00000000..47c80829 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/floor_mod.h @@ -0,0 +1,42 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_MOD_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_MOD_H_ + +#include +#include + +namespace tflite { +namespace reference_ops { +template +T FloorMod(T input1, T input2) +{ + struct FloatMod { + float operator()(const float lhs, const float rhs) const + { + return std::fmod(lhs, rhs); + } + }; + using ModFunc = typename std::conditional::value, + std::modulus, FloatMod>::type; + ModFunc mod_func; + T trunc_mod = mod_func(input1, input2); + return (trunc_mod != 0) && ((input2 < 0) != (trunc_mod < 0)) ? (trunc_mod + input2) : trunc_mod; +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_MOD_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fully_connected.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fully_connected.h new file mode 100644 index 00000000..d9d7c722 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/fully_connected.h @@ -0,0 +1,323 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FULLY_CONNECTED_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FULLY_CONNECTED_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void FullyConnected( + const FullyConnectedParams ¶ms, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &weights_shape, + const float *weights_data, const RuntimeShape &bias_shape, + const float *bias_data, const RuntimeShape &output_shape, + float *output_data) +{ + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + // TODO(b/62193649): This really should be: + // const int batches = ArraySize(output_dims, 1); + // but the current --variable_batch hack consists in overwriting the 3rd + // dimension with the runtime batch size, as we don't keep track for each + // array of which dimension is the batch dimension in it. + const int output_dims_count = output_shape.DimensionsCount(); + const int weights_dims_count = weights_shape.DimensionsCount(); + const int batches = FlatSizeSkipDim(output_shape, output_dims_count - 1); + const int output_depth = MatchingDim(weights_shape, weights_dims_count - 2, + output_shape, output_dims_count - 1); + const int accum_depth = weights_shape.Dims(weights_dims_count - 1); + for (int b = 0; b < batches; ++b) { + for (int out_c = 0; out_c < output_depth; ++out_c) { + float total = 0.f; + for (int d = 0; d < accum_depth; ++d) { + total += input_data[b * accum_depth + d] * + weights_data[out_c * accum_depth + d]; + } + float bias_value = 0.0f; + if (bias_data) { + bias_value = bias_data[out_c]; + } + output_data[out_c + output_depth * b] = ActivationFunctionWithMinMax( + total + bias_value, output_activation_min, output_activation_max); + } + } +} + +inline void FullyConnected( + const FullyConnectedParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &filter_shape, + const uint8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + uint8_t *output_data) +{ + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_GE(filter_shape.DimensionsCount(), 2); + TFLITE_DCHECK_GE(output_shape.DimensionsCount(), 1); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + // TODO(b/62193649): This really should be: + // const int batches = ArraySize(output_dims, 1); + // but the current --variable_batch hack consists in overwriting the 3rd + // dimension with the runtime batch size, as we don't keep track for each + // array of which dimension is the batch dimension in it. + const int output_dim_count = output_shape.DimensionsCount(); + const int filter_dim_count = filter_shape.DimensionsCount(); + const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); + const int output_depth = MatchingDim(filter_shape, filter_dim_count - 2, + output_shape, output_dim_count - 1); + const int accum_depth = filter_shape.Dims(filter_dim_count - 1); + for (int b = 0; b < batches; ++b) { + for (int out_c = 0; out_c < output_depth; ++out_c) { + int32_t acc = 0; + for (int d = 0; d < accum_depth; ++d) { + int32_t input_val = input_data[b * accum_depth + d]; + int32_t filter_val = filter_data[out_c * accum_depth + d]; + acc += (filter_val + filter_offset) * (input_val + input_offset); + } + if (bias_data) { + acc += bias_data[out_c]; + } + acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[out_c + output_depth * b] = static_cast(acc); + } + } +} + +inline void FullyConnected( + const FullyConnectedParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &filter_shape, + const uint8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int16_t *output_data) +{ + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + TFLITE_DCHECK_EQ(output_offset, 0); + // TODO(b/62193649): This really should be: + // const int batches = ArraySize(output_dims, 1); + // but the current --variable_batch hack consists in overwriting the 3rd + // dimension with the runtime batch size, as we don't keep track for each + // array of which dimension is the batch dimension in it. + const int output_dim_count = output_shape.DimensionsCount(); + const int filter_dim_count = filter_shape.DimensionsCount(); + const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); + const int output_depth = MatchingDim(filter_shape, filter_dim_count - 2, + output_shape, output_dim_count - 1); + const int accum_depth = filter_shape.Dims(filter_dim_count - 1); + for (int b = 0; b < batches; ++b) { + for (int out_c = 0; out_c < output_depth; ++out_c) { + // Internal accumulation. + // Initialize accumulator with the bias-value. + int32_t accum = bias_data[out_c]; + // Accumulation loop. + for (int d = 0; d < accum_depth; ++d) { + int16_t input_val = input_data[b * accum_depth + d] + input_offset; + int16_t filter_val = + filter_data[out_c * accum_depth + d] + filter_offset; + accum += filter_val * input_val; + } + // Down-scale the final int32_t accumulator to the scale used by our + // (16-bit, typically 3 integer bits) fixed-point format. The quantized + // multiplier and shift here have been pre-computed offline + // (e.g. by toco). + accum = + MultiplyByQuantizedMultiplier(accum, output_multiplier, output_shift); + // Saturate, cast to int16_t, and store to output array. + accum = std::max(accum, output_activation_min - output_offset); + accum = std::min(accum, output_activation_max - output_offset); + accum += output_offset; + output_data[out_c + output_depth * b] = accum; + } + } +} + +inline void ShuffledFullyConnected( + const FullyConnectedParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &weights_shape, + const uint8_t *shuffled_weights_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int16_t *output_data, uint8_t *shuffled_input_workspace_data) +{ + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + + TFLITE_DCHECK_GE(input_shape.DimensionsCount(), 1); + TFLITE_DCHECK_GE(weights_shape.DimensionsCount(), 2); + TFLITE_DCHECK_GE(output_shape.DimensionsCount(), 1); + // TODO(b/62193649): This really should be: + // const int batches = ArraySize(output_dims, 1); + // but the current --variable_batch hack consists in overwriting the 3rd + // dimension with the runtime batch size, as we don't keep track for each + // array of which dimension is the batch dimension in it. + const int output_dim_count = output_shape.DimensionsCount(); + const int weights_dim_count = weights_shape.DimensionsCount(); + const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); + const int output_depth = MatchingDim(weights_shape, weights_dim_count - 2, + output_shape, output_dim_count - 1); + const int accum_depth = weights_shape.Dims(weights_dim_count - 1); + TFLITE_DCHECK((accum_depth % 16) == 0); + TFLITE_DCHECK((output_depth % 4) == 0); + + // Shuffling and xoring of input activations into the workspace buffer + uint8_t *shuffled_input_workspace_ptr = shuffled_input_workspace_data; + if (batches == 1) { + for (int i = 0; i < accum_depth; i++) { + shuffled_input_workspace_data[i] = input_data[i] ^ 0x80; + } + } else if (batches == 4) { + for (int c = 0; c < accum_depth; c += 16) { + for (int b = 0; b < 4; b++) { + const uint8_t *src_data_ptr = input_data + b * accum_depth + c; + for (int j = 0; j < 16; j++) { + uint8_t src_val = *src_data_ptr++; + // Flip the sign bit, so that the kernel will only need to + // reinterpret these uint8_t values as int8_t, getting for free the + // subtraction of the zero_point value 128. + uint8_t dst_val = src_val ^ 0x80; + *shuffled_input_workspace_ptr++ = dst_val; + } + } + } + } else { + TFLITE_DCHECK(false); + return; + } + + // Actual computation + if (batches == 1) { + int16_t *output_ptr = output_data; + // Shuffled weights have had their sign bit (0x80) pre-flipped (xor'd) + // so that just reinterpreting them as int8_t values is equivalent to + // subtracting 128 from them, thus implementing for free the subtraction of + // the zero_point value 128. + const int8_t *shuffled_weights_ptr = + reinterpret_cast(shuffled_weights_data); + // Likewise, we preshuffled and pre-xored the input data above. + const int8_t *shuffled_input_data = + reinterpret_cast(shuffled_input_workspace_data); + for (int c = 0; c < output_depth; c += 4) { + // Internal accumulation. + // Initialize accumulator with the bias-value. + int32_t accum[4] = { 0 }; + // Accumulation loop. + for (int d = 0; d < accum_depth; d += 16) { + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 16; j++) { + int8_t input_val = shuffled_input_data[d + j]; + int8_t weights_val = *shuffled_weights_ptr++; + accum[i] += weights_val * input_val; + } + } + } + for (int i = 0; i < 4; i++) { + // Add bias value + int32_t acc = accum[i] + bias_data[c + i]; + // Down-scale the final int32_t accumulator to the scale used by our + // (16-bit, typically 3 integer bits) fixed-point format. The quantized + // multiplier and shift here have been pre-computed offline + // (e.g. by toco). + acc = + MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); + // Saturate, cast to int16_t, and store to output array. + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_ptr[c + i] = acc; + } + } + } else if (batches == 4) { + int16_t *output_ptr = output_data; + // Shuffled weights have had their sign bit (0x80) pre-flipped (xor'd) + // so that just reinterpreting them as int8_t values is equivalent to + // subtracting 128 from them, thus implementing for free the subtraction of + // the zero_point value 128. + const int8_t *shuffled_weights_ptr = + reinterpret_cast(shuffled_weights_data); + // Likewise, we preshuffled and pre-xored the input data above. + const int8_t *shuffled_input_data = + reinterpret_cast(shuffled_input_workspace_data); + for (int c = 0; c < output_depth; c += 4) { + const int8_t *shuffled_input_ptr = shuffled_input_data; + // Accumulation loop. + // Internal accumulation. + // Initialize accumulator with the bias-value. + int32_t accum[4][4]; + for (int i = 0; i < 4; i++) { + for (int b = 0; b < 4; b++) { + accum[i][b] = 0; + } + } + for (int d = 0; d < accum_depth; d += 16) { + for (int i = 0; i < 4; i++) { + for (int b = 0; b < 4; b++) { + for (int j = 0; j < 16; j++) { + int8_t input_val = shuffled_input_ptr[16 * b + j]; + int8_t weights_val = shuffled_weights_ptr[16 * i + j]; + accum[i][b] += weights_val * input_val; + } + } + } + shuffled_input_ptr += 64; + shuffled_weights_ptr += 64; + } + for (int i = 0; i < 4; i++) { + for (int b = 0; b < 4; b++) { + // Add bias value + int32_t acc = accum[i][b] + bias_data[c + i]; + // Down-scale the final int32_t accumulator to the scale used by our + // (16-bit, typically 3 integer bits) fixed-point format. The + // quantized multiplier and shift here have been pre-computed offline + // (e.g. by toco). + acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, + output_shift); + // Saturate, cast to int16_t, and store to output array. + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_ptr[b * output_depth + c + i] = acc; + } + } + } + } else { + TFLITE_DCHECK(false); + return; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FULLY_CONNECTED_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/hard_swish.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/hard_swish.h new file mode 100644 index 00000000..faa7d01f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/hard_swish.h @@ -0,0 +1,169 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ACTIVATIONS_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ACTIVATIONS_H_ + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline int16_t SaturatingLeftShift(int16_t value, int amount) +{ + int32_t result = static_cast(value) * (1 << amount); + result = std::min(result, std::numeric_limits::max()); + result = std::max(result, std::numeric_limits::min()); + return result; +} + +// Similar to ARM instruction SQDMULH. +// Similar to gemmlowp::SaturatingRoundingDoublingHighMul except +// rounding to zero instead of to nearest (SQRDMULH). +inline std::int16_t SaturatingDoublingHighMul(std::int16_t a, std::int16_t b) +{ + bool overflow = a == b && a == std::numeric_limits::min(); + std::int32_t a_32(a); + std::int32_t b_32(b); + std::int32_t ab_32 = a_32 * b_32; + std::int16_t ab_x2_high16 = static_cast((ab_32) / (1 << 15)); + return overflow ? std::numeric_limits::max() : ab_x2_high16; +} + +template +inline void HardSwish(const RuntimeShape &input_shape, const T *input_data, + const RuntimeShape &output_shape, T *output_data) +{ + ruy::profiler::ScopeLabel label("ReferenceHardSwish/Float"); + auto matching_size = MatchingFlatSize(input_shape, output_shape); + const T *in_end = input_data + matching_size; + for (; input_data < in_end; input_data++, output_data++) { + const float in = *input_data; + *output_data = + in * std::min(static_cast(6), std::max(static_cast(0), in + 3)) / + 6; + } +} + +template +inline void HardSwish(const HardSwishParams ¶ms, + const RuntimeShape &input_shape, const T *input_data, + const RuntimeShape &output_shape, T *output_data) +{ + ruy::profiler::ScopeLabel label("ReferenceHardSwish/Quantized"); + + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + const int16_t input_value = input_data[i] - params.input_zero_point; + // Left-shift as much as we can without overflow/saturation to put + // significant bits in the high bits of our 16-bit fixedpoint values, so + // that fixed-point approximate computations below are as accurate as + // possible. + const int16_t input_value_on_hires_input_scale = input_value * (1 << 7); + // Compute the input value on essentially the output scale, just not + // right-shifted yet. This is the value that we'll use in the (x >= +3) + // case, and that in the general case we'll multiply against the "relu-ish" + // fixed-point multiplier in [0, 1]. + const int16_t input_value_on_preshift_output_scale = + gemmlowp::SaturatingRoundingDoublingHighMul( + input_value_on_hires_input_scale, + params.output_multiplier_fixedpoint_int16); + // Now compute the "relu-ish multiplier". In the (-3 <= x <= +3) case, that + // is just an affine rescaling of x from [-3, 3] to [0, 1]. In the general + // case, it is just that plus saturation at the boundaries of [-3, 3]. + // First, we rescale from [-3, 3] to [-1, 1], saturating. + // That is done by rescaling the input value with a fixed-point multiplier + // (reluish_multiplier_fixedpoint) and bit-shift such that we represent + // that input value on the scale where the real value 3.0f is represented + // by the quantized value 32768. (+32768 is actually not representable as + // int16_t, so this saturates at +32767, and that is seen empirically to be + // a negligible contribution to numerical error/bias). + // + // This code is careful to correctly implement any magnitude of multiplier, + // involving either a right shift or a left shift, with correct saturation + // behavior in the left-shift case. This forces this code to be more + // complicated, but is necessary for real applications: a partially + // trained quantized MobileNet v3-small model that motivated this code + // exhibits some large [min, max] range boundaries, of the order of + // magnitude of 10 or 100 depending on layers. + // + // The next few lines are basically just an ordinary + // MultiplyByQuantizedMultiplier, except that we are more careful here + // about the fine details of saturation when left-shifting, because here + // overflow in left-shift is a common case, not an anomaly as + // MultiplyByQuantizedMultiplier assumes. + int16_t reluish_value = input_value_on_hires_input_scale; + // Shift left, saturating, as much as we can while ensuring that this + // saturation will not contribute to the result. That is, left shift amount + // reduced by 1. + if (params.reluish_multiplier_exponent > 0) { + reluish_value = SaturatingLeftShift( + reluish_value, params.reluish_multiplier_exponent - 1); + } + // Apply the fixed-point multiplier, dividing the value by a divisor + // ranging in [1, 2]. + reluish_value = gemmlowp::SaturatingRoundingDoublingHighMul( + reluish_value, params.reluish_multiplier_fixedpoint_int16); + // Apply the last bit of left-shift. Thus, in the left-shifting case, if + // any saturation affects the result, it is happening here --- any + // saturation having occurred above is overwritten here, not affecting the + // result. + if (params.reluish_multiplier_exponent > 0) { + reluish_value = SaturatingLeftShift(reluish_value, 1); + } + // Shift right, in the right-shifting case. + if (params.reluish_multiplier_exponent < 0) { + reluish_value = gemmlowp::RoundingDivideByPOT( + reluish_value, -params.reluish_multiplier_exponent); + } + // At this point we have rescaled the value into a 16bit fixedpoint + // reluish_value in [-1, 1]. + // We now convert that to a 16bit fixedpoint value in [0, 1]. + reluish_value = (reluish_value + (1 << 15)) >> 1; + // Use of SaturatingDoublingHighMul here is important to cancel the biases + // from the above SaturatingRoundingDoublingHighMul. + // + // On a partially trained MobileNet-v3-small, + // + // | bias on | ImageNet + // | quantized | Top-1 + // Operation used here | values | accuracy (50k) + // --------------------------------------+------------+----------- + // SaturatingDoublingHighMul | -0.0024 | 58.920 + // SaturatingRoundingDoublingHighMul | -0.0067 | 58.064 + // + // In activations_test, this is covered by this testcase: + // QuantizedActivationsOpTest.HardSwishBias + // + const int16_t preshift_output_value = SaturatingDoublingHighMul( + reluish_value, input_value_on_preshift_output_scale); + // We were so far operating on the pre-shift output scale. Now we finally + // apply that output shift, arriving at the final output scale. + int16_t output_value = gemmlowp::RoundingDivideByPOT( + preshift_output_value, -params.output_multiplier_exponent); + output_value += params.output_zero_point; + output_value = + std::min(output_value, std::numeric_limits::max()); + output_value = + std::max(output_value, std::numeric_limits::min()); + output_data[i] = output_value; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/add.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/add.h new file mode 100644 index 00000000..6405ebc2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/add.h @@ -0,0 +1,150 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_ADD_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_ADD_H_ + +#include + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_integer_ops { +inline void CheckArithmeticParams(const ArithmeticParams ¶ms) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + // Input offset is negative input zero point. Activation tensors are + // asymmetric quantized so they span the full int8 range. + TFLITE_DCHECK_GE(-params.input1_offset, std::numeric_limits::min()); + TFLITE_DCHECK_GE(-params.input2_offset, std::numeric_limits::min()); + TFLITE_DCHECK_LE(-params.input1_offset, std::numeric_limits::max()); + TFLITE_DCHECK_LE(-params.input2_offset, std::numeric_limits::max()); +} + +inline void ElementWise( + int size, const ArithmeticParams ¶ms, const int8_t *input1_data, + const int8_t *input2_data, int8_t *output_data, + void (*check_arithmetic_params)(const ArithmeticParams &), + int8_t (*binary_func)(int8_t, int8_t, const ArithmeticParams &)) +{ + CheckArithmeticParams(params); + for (int i = 0; i < size; ++i) { + output_data[i] = binary_func(input1_data[i], input2_data[i], params); + } +} + +inline void BroadcastBinaryFunction4DSlow( + const ArithmeticParams ¶ms, const RuntimeShape &input1_shape, + const int8_t *input1_data, const RuntimeShape &input2_shape, + const int8_t *input2_data, const RuntimeShape &output_shape, + int8_t *output_data, + void (*check_arithmetic_params)(const ArithmeticParams &), + int8_t (*binary_func)(int8_t, int8_t, const ArithmeticParams &)) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + output_data[Offset(extended_output_shape, b, y, x, c)] = binary_func( + input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)], params); + } + } + } + } +} + +inline int8_t AddFunc(int8_t x, int8_t y, const ArithmeticParams ¶ms) +{ + const int32_t input1_val = params.input1_offset + x; + const int32_t input2_val = params.input2_offset + y; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sum = scaled_input1_val + scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sum, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + return static_cast(clamped_output); +} + +// Element-wise add that can often be used for inner loop of broadcast add as +// well as the non-broadcast add. +inline void AddElementwise(int size, const ArithmeticParams ¶ms, + const int8_t *input1_data, const int8_t *input2_data, + int8_t *output_data) +{ + ElementWise(size, params, input1_data, input2_data, output_data, + CheckArithmeticParams, AddFunc); +} + +inline void Add(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const int8_t *input1_data, + const RuntimeShape &input2_shape, const int8_t *input2_data, + const RuntimeShape &output_shape, int8_t *output_data) +{ + CheckArithmeticParams(params); + + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + AddElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +inline void BroadcastAdd4DSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int8_t *input1_data, + const RuntimeShape &input2_shape, + const int8_t *input2_data, + const RuntimeShape &output_shape, + int8_t *output_data) +{ + BroadcastBinaryFunction4DSlow(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data, + CheckArithmeticParams, AddFunc); +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_ADD_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h new file mode 100644 index 00000000..65fec608 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h @@ -0,0 +1,222 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_CONV_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_CONV_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +// Fixed-point per-channel-quantization convolution reference kernel. +inline void ConvPerChannel( + const ConvParams ¶ms, const int32_t *output_multiplier, + const int32_t *output_shift, const RuntimeShape &input_shape, + const int8_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int8_t *output_data) +{ + // Get parameters. + const int32_t input_offset = params.input_offset; // r = s(q - Z) + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int32_t output_offset = params.output_offset; + + // Set min and max value of the output. + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + + // Consistency check. + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + + // Check dimensions of the tensors. + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + const int in_y_origin = (out_y * stride_height) - pad_height; + for (int out_x = 0; out_x < output_width; ++out_x) { + const int in_x_origin = (out_x * stride_width) - pad_width; + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + const int in_y = in_y_origin + dilation_height_factor * filter_y; + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + + if (!is_point_inside_image) { + continue; + } + + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + int32_t input_val = input_data[Offset(input_shape, batch, in_y, + in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, out_channel, filter_y, filter_x, in_channel)]; + // Accumulate with 32 bits accumulator. + // In the nudging process during model quantization, we force + // real value of 0.0 be represented by a quantized value. This + // guarantees that the input_offset is a int8_t, even though + // it is represented using int32_t. int32_t += int8_t * + // (int8_t - int8_t) so the highest value we can get from each + // accumulation is [-127, 127] * ([-128, 127] - + // [-128, 127]), which is [-32512, 32512]. log2(32512) + // = 14.98, which means we can accumulate at least 2^16 + // multiplications without overflow. The accumulator is + // applied to a filter so the accumulation logic will hold as + // long as the filter size (filter_y * filter_x * in_channel) + // does not exceed 2^16, which is the case in all the models + // we have seen so far. + // TODO(b/174275578): Add a check to make sure the + // accumulator depth is smaller than 2^16. + acc += filter_val * (input_val + input_offset); + } + } + } + + if (bias_data) { + acc += bias_data[out_channel]; + } + acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier[out_channel], output_shift[out_channel]); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + static_cast(acc); + } + } + } + } +} + +// Fixed-point per-channel-quantization convolution reference kernel. +// 16-bit data and 8-bit filter +inline void ConvPerChannel( + const ConvParams ¶ms, const int32_t *output_multiplier, + const int32_t *output_shift, const RuntimeShape &input_shape, + const int16_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const std::int64_t *bias_data, const RuntimeShape &output_shape, + int16_t *output_data) +{ + // Get parameters. + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + + // Set min and max value of the output. + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + + // Consistency check. + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + + // Check dimensions of the tensors. + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + const int in_y_origin = (out_y * stride_height) - pad_height; + for (int out_x = 0; out_x < output_width; ++out_x) { + const int in_x_origin = (out_x * stride_width) - pad_width; + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + std::int64_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + const int in_y = in_y_origin + dilation_height_factor * filter_y; + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + + if (!is_point_inside_image) { + continue; + } + + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + int32_t input_val = input_data[Offset(input_shape, batch, in_y, + in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, out_channel, filter_y, filter_x, in_channel)]; + // Accumulate with 64 bits accumulator. + // int64_t += int8_t * int16_t so the highest value we can + // get from each accumulation is [-127, 127] * ([-32768, + // 32767] - + // [-32768, 32767]), which is [-8322945, 8322945]. + // log2(8322945) = 22.99. + acc += filter_val * input_val; + } + } + } + if (bias_data) { + acc += bias_data[out_channel]; + } + int32_t scaled_acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier[out_channel], output_shift[out_channel]); + scaled_acc = std::max(scaled_acc, output_activation_min); + scaled_acc = std::min(scaled_acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + static_cast(scaled_acc); + } + } + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h new file mode 100644 index 00000000..d9e7caca --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h @@ -0,0 +1,292 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_DEPTHWISE_CONV_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_DEPTHWISE_CONV_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +inline void DepthwiseConvPerChannel( + const DepthwiseParams ¶ms, const int32_t *output_multiplier, + const int32_t *output_shift, const RuntimeShape &input_shape, + const int8_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int8_t *output_data) +{ + // Get parameters. + // TODO(b/141565753): Re-introduce ScopedProfilingLabel on Micro. + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const int32_t input_offset = params.input_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + + // Check dimensions of the tensors. + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + for (int m = 0; m < depth_multiplier; ++m) { + const int output_channel = m + in_channel * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + if (is_point_inside_image) { + int32_t input_val = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, 0, filter_y, filter_x, output_channel)]; + // Accumulate with 32 bits accumulator. + // In the nudging process during model quantization, we force + // real value of 0.0 be represented by a quantized value. This + // guarantees that the input_offset is a int8_t, even though + // it is represented using int32_t. int32_t += int8_t * + // (int8_t - int8_t) so the highest value we can get from each + // accumulation is [-127, 127] * ([-128, 127] - + // [-128, 127]), which is [-32512, 32512]. log2(32512) + // = 14.98, which means we can accumulate at least 2^16 + // multiplications without overflow. The accumulator is + // applied to a filter so the accumulation logic will hold as + // long as the filter size (filter_y * filter_x * in_channel) + // does not exceed 2^16, which is the case in all the models + // we have seen so far. + // TODO(b/174275578): Add a check to make sure the + // accumulator depth is smaller than 2^16. + acc += filter_val * (input_val + input_offset); + } + } + } + if (bias_data) { + acc += bias_data[output_channel]; + } + acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier[output_channel], + output_shift[output_channel]); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, + output_channel)] = static_cast(acc); + } + } + } + } + } +} + +inline void DepthwiseConvPerChannel( + const DepthwiseParams ¶ms, const int32_t *output_multiplier, + const int32_t *output_shift, const RuntimeShape &input_shape, + const int16_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const std::int64_t *bias_data, const RuntimeShape &output_shape, + int16_t *output_data) +{ + // Get parameters. + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + + // Check dimensions of the tensors. + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + for (int m = 0; m < depth_multiplier; ++m) { + const int output_channel = m + in_channel * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + std::int64_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + if (is_point_inside_image) { + int32_t input_val = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, 0, filter_y, filter_x, output_channel)]; + // Accumulate with 64 bits accumulator. + // We assume maximum of 2^16 accumulations as with the 8-bit + // case so actually the value in the accumulator should not + // exceed 40 bits + acc += static_cast(filter_val) * + static_cast(input_val); + } + } + } + if (bias_data) { + acc += bias_data[output_channel]; + } + int32_t scaled_acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier[output_channel], + output_shift[output_channel]); + scaled_acc = std::max(scaled_acc, output_activation_min); + scaled_acc = std::min(scaled_acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, + output_channel)] = + static_cast(scaled_acc); + } + } + } + } + } +} + +inline void DepthwiseConvHybridPerChannel( + const DepthwiseParams ¶ms, float *scaling_factors_ptr, + const RuntimeShape &input_shape, const int8_t *input_data, + const RuntimeShape &filter_shape, const int8_t *filter_data, + const RuntimeShape &bias_shape, const float *bias_data, + const RuntimeShape &output_shape, float *output_data, + const float *per_channel_scale, int32_t *input_offset) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int dilation_width_factor = params.dilation_width_factor; + const int dilation_height_factor = params.dilation_height_factor; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + const int depth_multiplier = params.depth_multiplier; + const float output_activation_min = params.float_activation_min; + const float output_activation_max = params.float_activation_max; + // Check dimensions of the tensors. + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int input_depth = input_shape.Dims(3); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int bias_depth = bias_shape.FlatSize(); + TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); + TFLITE_DCHECK_EQ(bias_depth, output_depth); + + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + for (int m = 0; m < depth_multiplier; ++m) { + const int output_channel = m + in_channel * depth_multiplier; + const int in_x_origin = (out_x * stride_width) - pad_width; + const int in_y_origin = (out_y * stride_height) - pad_height; + int32_t acc = 0; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + const int in_x = in_x_origin + dilation_width_factor * filter_x; + const int in_y = + in_y_origin + dilation_height_factor * filter_y; + // Zero padding by omitting the areas outside the image. + const bool is_point_inside_image = + (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && + (in_y < input_height); + if (is_point_inside_image) { + int32_t input_val = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + int32_t filter_val = filter_data[Offset( + filter_shape, 0, filter_y, filter_x, output_channel)]; + acc += filter_val * (input_val - input_offset[batch]); + } + } + } + float acc_float = static_cast(acc); + acc_float *= + per_channel_scale[output_channel] * scaling_factors_ptr[batch]; + if (bias_data && output_channel < bias_depth) { + acc_float += bias_data[output_channel]; + } + output_data[Offset(output_shape, batch, out_y, out_x, + output_channel)] = + ActivationFunctionWithMinMax(acc_float, output_activation_min, + output_activation_max); + } + } + } + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_DEPTHWISE_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h new file mode 100644 index 00000000..4bae7de4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h @@ -0,0 +1,109 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_FULLY_CONNECTED_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_FULLY_CONNECTED_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +inline void FullyConnected( + const FullyConnectedParams ¶ms, const RuntimeShape &input_shape, + const int8_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int8_t *output_data) +{ + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_GE(filter_shape.DimensionsCount(), 2); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 2); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + const int filter_dim_count = filter_shape.DimensionsCount(); + const int batches = output_shape.Dims(0); + const int output_depth = output_shape.Dims(1); + TFLITE_DCHECK_LE(output_depth, filter_shape.Dims(filter_dim_count - 2)); + const int accum_depth = filter_shape.Dims(filter_dim_count - 1); + for (int b = 0; b < batches; ++b) { + for (int out_c = 0; out_c < output_depth; ++out_c) { + int32_t acc = 0; + for (int d = 0; d < accum_depth; ++d) { + int32_t input_val = input_data[b * accum_depth + d]; + int32_t filter_val = filter_data[out_c * accum_depth + d]; + acc += (filter_val + filter_offset) * (input_val + input_offset); + } + if (bias_data) { + acc += bias_data[out_c]; + } + acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[out_c + output_depth * b] = static_cast(acc); + } + } +} + +inline void FullyConnected( + const FullyConnectedParams ¶ms, const RuntimeShape &input_shape, + const int16_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const int64_t *bias_data, const RuntimeShape &output_shape, + int16_t *output_data) +{ + const int32_t filter_offset = params.weights_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_GE(filter_shape.DimensionsCount(), 2); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 2); + + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + const int filter_dim_count = filter_shape.DimensionsCount(); + const int batches = output_shape.Dims(0); + const int output_depth = output_shape.Dims(1); + TFLITE_DCHECK_LE(output_depth, filter_shape.Dims(filter_dim_count - 2)); + const int accum_depth = filter_shape.Dims(filter_dim_count - 1); + for (int b = 0; b < batches; ++b) { + for (int out_c = 0; out_c < output_depth; ++out_c) { + int64_t acc = 0; + for (int d = 0; d < accum_depth; ++d) { + int32_t input_val = input_data[b * accum_depth + d]; + int32_t filter_val = filter_data[out_c * accum_depth + d]; + acc += (filter_val + filter_offset) * input_val; + } + if (bias_data) { + acc += bias_data[out_c]; + } + int32_t acc_scaled = + MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); + acc_scaled = std::max(acc_scaled, output_activation_min); + acc_scaled = std::min(acc_scaled, output_activation_max); + output_data[out_c + output_depth * b] = static_cast(acc_scaled); + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_FULLY_CONNECTED_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h new file mode 100644 index 00000000..892e9fd3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h @@ -0,0 +1,65 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_L2NORMALIZATION_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_L2NORMALIZATION_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +inline void L2Normalization(int32_t input_zero_point, int32_t outer_size, + int32_t depth, const int8_t *input_data, + int8_t *output_data) +{ + static constexpr int8_t kMinInt8 = std::numeric_limits::min(); + static constexpr int8_t kMaxInt8 = std::numeric_limits::max(); + // The output scale must be in sync with Prepare(). + // Output is in 1/128 scale so the actual output range is nudged from [-1, 1] + // to [-1, 127/128]. + static constexpr int32_t kOutputScale = 7; + for (int outer_index = 0; outer_index < outer_size; ++outer_index) { + // int32_t = (int8_t - int8_t) ^ 2. + // ([-128, 127] - [-128, 127]) ^ 2 = [0, (2^8 - 1)^2] so the accumulator is + // safe from overflowing in at least 2^16 steps. + int32_t acc = 0; + for (int inner_index = 0; inner_index < depth; ++inner_index) { + int32_t input = + input_data[depth * outer_index + inner_index] - input_zero_point; + acc += input * input; + } + int32_t inv_l2norm_multiplier; + int inv_l2norm_shift; + GetInvSqrtQuantizedMultiplierExp(acc, kReverseShift, &inv_l2norm_multiplier, + &inv_l2norm_shift); + + for (int inner_index = 0; inner_index < depth; ++inner_index) { + int32_t input = + input_data[depth * outer_index + inner_index] - input_zero_point; + + // Rescale and downcast. Rescale is folded into the division. + int32_t output_in_q24 = MultiplyByQuantizedMultiplier( + input, inv_l2norm_multiplier, inv_l2norm_shift + kOutputScale); + output_in_q24 = + std::min(static_cast(kMaxInt8), + std::max(static_cast(kMinInt8), output_in_q24)); + output_data[depth * outer_index + inner_index] = + static_cast(output_in_q24); + } + } +} +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_L2NORMALIZATION_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h new file mode 100644 index 00000000..c19d6a4e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h @@ -0,0 +1,119 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_LOGISTIC_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_LOGISTIC_H_ + +#include +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +inline void Logistic(int32_t input_zero_point, int32_t input_range_radius, + int32_t input_multiplier, int32_t input_left_shift, + int32_t input_size, const int8_t *input_data, + int8_t *output_data) +{ + // Integer bits must be in sync with Prepare() function. + static constexpr int32_t kInputIntegerBits = 4; + static constexpr int32_t kOutputIntegerBits = 8; + static constexpr int8_t kMinInt8 = std::numeric_limits::min(); + static constexpr int8_t kMaxInt8 = std::numeric_limits::max(); + static constexpr int32_t kOutputZeroPoint = -128; + + for (int i = 0; i < input_size; ++i) { + const int32_t input = + static_cast(input_data[i]) - input_zero_point; + if (input <= -input_range_radius) { + output_data[i] = kMinInt8; + } else if (input >= input_range_radius) { + output_data[i] = kMaxInt8; + } else { + const int32_t input_in_q4 = MultiplyByQuantizedMultiplier( + input, input_multiplier, input_left_shift); + using FixedPoint4 = gemmlowp::FixedPoint; + const int32_t output_in_q0 = + gemmlowp::logistic(FixedPoint4::FromRaw(input_in_q4)).raw(); + + // Rescale and downcast. + using gemmlowp::RoundingDivideByPOT; + int32_t output_in_q23 = + RoundingDivideByPOT(output_in_q0, 31 - kOutputIntegerBits); + output_in_q23 = std::min(std::max(output_in_q23 + kOutputZeroPoint, + static_cast(kMinInt8)), + static_cast(kMaxInt8)); + output_data[i] = static_cast(output_in_q23); + } + } +} + +inline void Logistic(int32_t input_multiplier, int32_t input_left_shift, + int32_t input_size, const int16_t *ptr_input_data, + int16_t *ptr_output_data) +{ + // We use the LUT for sigmoid and take into account, that + // tanh(x) = 2*sigmoid(2*x) - 1 + + // We scale by 3/4 to expand range [-8,8]->[-10.7,10.7]. + // In case of general parameter scale, multiplier 3 is taken into account + // in TanhPrepare function and it is included in + // input_multiplier already. + + TFLITE_DCHECK_GE(input_left_shift, 0); + if (input_multiplier == 0) { // power of two case + input_multiplier = 3 << input_left_shift; + input_left_shift = 0; + } + + int32_t round = (input_left_shift > 0) ? 1 << (input_left_shift - 1) : 0; + + for (int i = 0; i < input_size; ++i, ptr_input_data++, ptr_output_data++) { + int32_t input_data = + ((*ptr_input_data) * input_multiplier + round) >> input_left_shift; + + // We do interpolation on unsigned values. + uint32_t abs_input_data = abs(input_data); + + // We divide by 2 power of 9, because + // we need to divide by 2 in power of 7 for + // the input conversion + 1/4 from the scale above. + + // Define uh as uint32_t type not to make this function overflow. + uint32_t uh = abs_input_data >> 9; + uint32_t result; + + if (uh >= 255) { + // Saturate to maximum. + result = 0x7FFF << 10; + } else { + uint32_t ua = sigmoid_table_uint16[uh]; + uint32_t ub = sigmoid_table_uint16[uh + 1]; + uint32_t ut = abs_input_data & 0x1ff; + // Interpolation is done using the fractional bit. + result = (ua << 9) + ut * (ub - ua); + } + + result = (input_data >= 0) ? (result + (1 << 9)) : ((1 << (16 + 9)) - result + (1 << 9) - 1); + + // Back to 16-bit. + result >>= 10; + + *ptr_output_data = result; + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_LOGISTIC_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mean.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mean.h new file mode 100644 index 00000000..0b22070a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mean.h @@ -0,0 +1,76 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MEAN_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MEAN_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +template +inline void Mean(const tflite::MeanParams &op_params, int32_t multiplier, + int32_t shift, const RuntimeShape &unextended_input_shape, + const integer_type *input_data, int32_t input_zero_point, + const RuntimeShape &unextended_output_shape, + integer_type *output_data, int32_t output_zero_point) +{ + // Current implementation only supports dimension equals 4 and simultaneous + // reduction over width and height. + TFLITE_CHECK_EQ(unextended_input_shape.DimensionsCount(), 4); + TFLITE_CHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + const int output_batch = output_shape.Dims(0); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int output_depth = output_shape.Dims(3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int num_elements_in_axis = input_width * input_height; + + TFLITE_CHECK_EQ(op_params.axis_count, 2); + TFLITE_CHECK((op_params.axis[0] == 1 && op_params.axis[1] == 2) || + (op_params.axis[0] == 2 && op_params.axis[1] == 1)); + TFLITE_CHECK_EQ(output_height, 1); + TFLITE_CHECK_EQ(output_width, 1); + + static constexpr int32_t kMinInt = std::numeric_limits::min(); + static constexpr int32_t kMaxInt = std::numeric_limits::max(); + + for (int out_b = 0; out_b < output_batch; ++out_b) { + for (int out_d = 0; out_d < output_depth; ++out_d) { + int32_t acc = 0; + for (int in_h = 0; in_h < input_height; ++in_h) { + for (int in_w = 0; in_w < input_width; ++in_w) { + acc += input_data[Offset(input_shape, out_b, in_h, in_w, out_d)] - + input_zero_point; + } + } + acc = MultiplyByQuantizedMultiplier(acc, multiplier, shift); + acc = acc > 0 ? (acc + num_elements_in_axis / 2) / num_elements_in_axis : (acc - num_elements_in_axis / 2) / num_elements_in_axis; + acc += output_zero_point; + acc = std::min(std::max(acc, kMinInt), kMaxInt); + output_data[Offset(output_shape, out_b, 0, 0, out_d)] = + static_cast(acc); + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MEAN_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h new file mode 100644 index 00000000..20120a77 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h @@ -0,0 +1,134 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MUL_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MUL_H_ + +#include "fixedpoint/fixedpoint.h" +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +template +inline void MulElementwise(int size, const ArithmeticParams ¶ms, + const T *input1_data, const T *input2_data, + T *output_data) +{ + for (int i = 0; i < size; ++i) { + const int32_t input1_val = params.input1_offset + input1_data[i]; + const int32_t input2_val = params.input2_offset + input2_data[i]; + const int32_t unclamped_result = + params.output_offset + + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, unclamped_result)); + output_data[i] = static_cast(clamped_output); + } +} + +template +inline void Mul(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const T *input1_data, + const RuntimeShape &input2_shape, const T *input2_data, + const RuntimeShape &output_shape, T *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + ruy::profiler::ScopeLabel label("Mul/8bit"); + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + MulElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +// Mul with 16 bit inputs and int8_t outputs. +inline void Mul(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const int16_t *input1_data, + const RuntimeShape &input2_shape, const int16_t *input2_data, + const RuntimeShape &output_shape, int8_t *output_data) +{ + ruy::profiler::ScopeLabel label("Mul/Int16Int8"); + int32_t output_offset = params.output_offset; + int32_t output_activation_min = params.quantized_activation_min; + int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + // F0 uses 0 integer bits, range [-1, 1]. + using F0 = gemmlowp::FixedPoint; + + F0 unclamped_result = + F0::FromRaw(input1_data[i]) * F0::FromRaw(input2_data[i]); + int16_t rescaled_result = + gemmlowp::RoundingDivideByPOT(unclamped_result.raw(), 8); + int16_t clamped_result = std::min( + output_activation_max - output_offset, rescaled_result); + clamped_result = std::max(output_activation_min - output_offset, + clamped_result); + output_data[i] = output_offset + clamped_result; + } +} + +template +inline void BroadcastMul4DSlow( + const ArithmeticParams ¶ms, const RuntimeShape &input1_shape, + const T *input1_data, const RuntimeShape &input2_shape, + const T *input2_data, const RuntimeShape &output_shape, T *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastMul4DSlow"); + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + // The input shapes are extended as part of NdArrayDesc initialization. + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + const int32_t input1_val = + params.input1_offset + + input1_data[SubscriptToIndex(desc1, b, y, x, c)]; + const int32_t input2_val = + params.input2_offset + + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; + const int32_t unclamped_result = + params.output_offset + + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); + const int32_t clamped_output = std::min( + params.quantized_activation_max, + std::max(params.quantized_activation_min, unclamped_result)); + output_data[Offset(extended_output_shape, b, y, x, c)] = + static_cast(clamped_output); + } + } + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MUL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h new file mode 100644 index 00000000..7f2180f0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h @@ -0,0 +1,259 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_POOLING_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_POOLING_H_ + +#include +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +inline void AveragePool(const PoolParams ¶ms, + const RuntimeShape &input_shape, + const int8_t *input_data, + const RuntimeShape &output_shape, int8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + int32_t acc = 0; + int filter_count = 0; + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + acc += + input_data[Offset(input_shape, batch, in_y, in_x, channel)]; + filter_count++; + } + } + // Round to the closest integer value. + acc = acc > 0 ? (acc + filter_count / 2) / filter_count : (acc - filter_count / 2) / filter_count; + acc = std::max(acc, params.quantized_activation_min); + acc = std::min(acc, params.quantized_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + static_cast(acc); + } + } + } + } +} + +inline void MaxPool(const PoolParams ¶ms, const RuntimeShape &input_shape, + const int8_t *input_data, const RuntimeShape &output_shape, + int8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + TFLITE_DCHECK_GE(params.quantized_activation_min, + std::numeric_limits::min()); + TFLITE_DCHECK_LE(params.quantized_activation_max, + std::numeric_limits::max()); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + int8_t max = std::numeric_limits::lowest(); + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + max = std::max( + max, + input_data[Offset(input_shape, batch, in_y, in_x, channel)]); + } + } + max = std::max(max, params.quantized_activation_min); + max = std::min(max, params.quantized_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + static_cast(max); + } + } + } + } +} + +inline void AveragePool(const PoolParams ¶ms, + const RuntimeShape &input_shape, + const int16_t *input_data, + const RuntimeShape &output_shape, + int16_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + int32_t acc = 0; + int filter_count = 0; + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + acc += + input_data[Offset(input_shape, batch, in_y, in_x, channel)]; + filter_count++; + } + } + // Round to the closest integer value. + acc = acc > 0 ? (acc + filter_count / 2) / filter_count : (acc - filter_count / 2) / filter_count; + acc = std::max(acc, params.quantized_activation_min); + acc = std::min(acc, params.quantized_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + static_cast(acc); + } + } + } + } +} + +inline void MaxPool(const PoolParams ¶ms, const RuntimeShape &input_shape, + const int16_t *input_data, const RuntimeShape &output_shape, + int16_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + TFLITE_DCHECK_GE(params.quantized_activation_min, + std::numeric_limits::min()); + TFLITE_DCHECK_LE(params.quantized_activation_max, + std::numeric_limits::max()); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + int16_t max = std::numeric_limits::lowest(); + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + max = std::max( + max, + input_data[Offset(input_shape, batch, in_y, in_x, channel)]); + } + } + max = std::max(max, params.quantized_activation_min); + max = std::min(max, params.quantized_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + static_cast(max); + } + } + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_POOLING_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h new file mode 100644 index 00000000..762c7f18 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h @@ -0,0 +1,115 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TANH_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TANH_H_ + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +inline void Tanh(int32_t input_zero_point, int32_t input_range_radius, + int32_t input_multiplier, int32_t input_shift, + const RuntimeShape &input_shape, const int8_t *input_data, + const RuntimeShape &output_shape, int8_t *output_data) +{ + // Integer bits must be in sync with Prepare() function. + static constexpr int32_t kInputIntegerBits = 4; + static constexpr int32_t kOutputScale = 7; + static constexpr int32_t kMinInt8 = std::numeric_limits::min(); + static constexpr int32_t kMaxInt8 = std::numeric_limits::max(); + using F4 = gemmlowp::FixedPoint; + + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; ++i) { + const int32_t input = + static_cast(input_data[i]) - input_zero_point; + if (input <= -input_range_radius) { + output_data[i] = kMinInt8; + } else if (input >= input_range_radius) { + output_data[i] = kMaxInt8; + } else { + const int32_t input_in_q4 = + MultiplyByQuantizedMultiplier(input, input_multiplier, input_shift); + const int32_t output_in_q0 = + gemmlowp::tanh(F4::FromRaw(input_in_q4)).raw(); + + // Rescale and downcast. + using gemmlowp::RoundingDivideByPOT; + int32_t output_in_q24 = + RoundingDivideByPOT(output_in_q0, 31 - kOutputScale); + output_in_q24 = std::min(std::max(output_in_q24, kMinInt8), kMaxInt8); + output_data[i] = static_cast(output_in_q24); + } + } +} + +inline void Tanh(int32_t input_multiplier, int32_t input_left_shift, + const RuntimeShape &input_shape, const int16_t *ptr_input_data, + const RuntimeShape &output_shape, int16_t *ptr_output_data) +{ + // We use the LUT for sigmoid and take into account, that + // tanh(x) = 2*sigmoid(2*x) - 1 + + // We scale by 3/4 to expand range [-8,8]->[-10.7,10.7]. + // In case of general parameter scale, multiplier 3 is taken into account + // in TanhPrepare function and it is included in + // input_multiplier already. + + if (input_multiplier == 0) { // power of two case + input_multiplier = 3 << input_left_shift; + input_left_shift = 0; + } + + int32_t round = (input_left_shift > 0) ? 1 << (input_left_shift - 1) : 0; + + int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; ++i, ptr_input_data++, ptr_output_data++) { + int32_t input_data = + ((*ptr_input_data) * input_multiplier + round) >> input_left_shift; + + uint32_t abs_input_data = abs(input_data); + uint32_t uh = abs_input_data >> 8; + int32_t result; + + if (uh >= 255) { + // Saturate to maximum. + result = 0xFFFF << 8; + } else { + uint32_t ua = sigmoid_table_uint16[uh]; + uint32_t ub = sigmoid_table_uint16[uh + 1]; + + uint8_t ut = abs_input_data & 0xFF; + + result = (ua << 8) + ut * (ub - ua); + } + + result = (input_data >= 0) ? (result - (1 << (14 + 9)) + (1 << (9 - 2))) : (-result + (1 << (14 + 9)) + (1 << (9 - 2)) - 1); + + // Convert back to 16-bit. + result >>= (9 - 1); + + *ptr_output_data = result; + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TANH_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/transpose_conv.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/transpose_conv.h new file mode 100644 index 00000000..d1bcb4a0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/integer_ops/transpose_conv.h @@ -0,0 +1,222 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TRANSPOSE_CONV_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TRANSPOSE_CONV_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_integer_ops { +// Fixed-point per-channel-quantization transpose convolution reference kernel. +inline void TransposeConv( + const ConvParams ¶ms, const int32_t *output_multiplier, + const int32_t *output_shift, const RuntimeShape &input_shape, + const int8_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + int8_t *output_data, const RuntimeShape &im2col_shape, int8_t *im2col_data, + int32_t *scratch_buffer) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int32_t input_offset = params.input_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_activation_min = std::numeric_limits::min(); + const int32_t output_activation_max = std::numeric_limits::max(); + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + + const int num_elements = output_shape.FlatSize(); + // We need to initialize scratch_buffer to all 0s, as we apply the same + // 'scatter' based trick as in float version. + memset(scratch_buffer, 0, num_elements * sizeof(int32_t)); + + // Loop through input elements one at a time. + for (int batch = 0; batch < batches; ++batch) { + for (int in_y = 0; in_y < input_height; ++in_y) { + for (int in_x = 0; in_x < input_width; ++in_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + // Loop through the output elements it will influence. + const int out_x_origin = (in_x * stride_width) - pad_width; + const int out_y_origin = (in_y * stride_height) - pad_height; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + for (int out_channel = 0; out_channel < output_depth; + ++out_channel) { + // Compute output element location. + const int out_x = out_x_origin + filter_x; + const int out_y = out_y_origin + filter_y; + // We cannot accumulate out of bounds. + if ((out_x >= 0) && (out_x < output_width) && (out_y >= 0) && + (out_y < output_height)) { + const int8_t input_value = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + const int8_t filter_value = + filter_data[Offset(filter_shape, out_channel, filter_y, + filter_x, in_channel)]; + scratch_buffer[Offset(output_shape, batch, out_y, out_x, + out_channel)] += + (input_value + input_offset) * filter_value; + } + } + } + } + } + } + } + } + + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + int32_t acc = scratch_buffer[Offset(output_shape, batch, out_y, out_x, + out_channel)]; + if (bias_data) { + acc += bias_data[out_channel]; + } + acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier[out_channel], output_shift[out_channel]); + acc += output_offset; + acc = std::max(acc, output_activation_min); + acc = std::min(acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + static_cast(acc); + } + } + } + } +} + +// int16_t input (zero_point=0), int8_t filter, int64 accumulator +inline void TransposeConv( + const ConvParams ¶ms, const int32_t *output_multiplier, + const int32_t *output_shift, const RuntimeShape &input_shape, + const int16_t *input_data, const RuntimeShape &filter_shape, + const int8_t *filter_data, const RuntimeShape &bias_shape, + const std::int64_t *bias_data, const RuntimeShape &output_shape, + int16_t *output_data, const RuntimeShape &im2col_shape, int8_t *im2col_data, + std::int64_t *scratch_buffer) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int32_t output_activation_min = std::numeric_limits::min(); + const int32_t output_activation_max = std::numeric_limits::max(); + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + + const int num_elements = output_shape.FlatSize(); + // We need to initialize scratch_buffer to all 0s, as we apply the same + // 'scatter' based trick as in float version. + memset(scratch_buffer, 0, num_elements * sizeof(std::int64_t)); + + // Loop through input elements one at a time. + for (int batch = 0; batch < batches; ++batch) { + for (int in_y = 0; in_y < input_height; ++in_y) { + for (int in_x = 0; in_x < input_width; ++in_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + // Loop through the output elements it will influence. + const int out_x_origin = (in_x * stride_width) - pad_width; + const int out_y_origin = (in_y * stride_height) - pad_height; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + for (int out_channel = 0; out_channel < output_depth; + ++out_channel) { + // Compute output element location. + const int out_x = out_x_origin + filter_x; + const int out_y = out_y_origin + filter_y; + // We cannot accumulate out of bounds. + if ((out_x >= 0) && (out_x < output_width) && (out_y >= 0) && + (out_y < output_height)) { + const int32_t input_value = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + const int32_t filter_value = + filter_data[Offset(filter_shape, out_channel, filter_y, + filter_x, in_channel)]; + scratch_buffer[Offset(output_shape, batch, out_y, out_x, + out_channel)] += + input_value * filter_value; + } + } + } + } + } + } + } + } + + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + std::int64_t acc = scratch_buffer[Offset(output_shape, batch, out_y, + out_x, out_channel)]; + if (bias_data) { + acc += bias_data[out_channel]; + } + int32_t scaled_acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier[out_channel], output_shift[out_channel]); + scaled_acc = std::max(scaled_acc, output_activation_min); + scaled_acc = std::min(scaled_acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + static_cast(scaled_acc); + } + } + } + } +} + +} // namespace reference_integer_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TRANSPOSE_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/l2normalization.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/l2normalization.h new file mode 100644 index 00000000..b6d6e354 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/l2normalization.h @@ -0,0 +1,90 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_L2NORMALIZATION_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_L2NORMALIZATION_H_ + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void L2Normalization(const tflite::L2NormalizationParams &op_params, + const RuntimeShape &input_shape, + const float *input_data, + const RuntimeShape &output_shape, + float *output_data, float epsilon = 1e-6) +{ + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + for (int i = 0; i < outer_size; ++i) { + float squared_l2_norm = 0; + for (int c = 0; c < depth; ++c) { + const float val = input_data[depth * i + c]; + squared_l2_norm += val * val; + } + float l2_norm = std::sqrt(squared_l2_norm); + l2_norm = std::max(l2_norm, epsilon); + for (int c = 0; c < depth; ++c) { + output_data[depth * i + c] = input_data[depth * i + c] / l2_norm; + } + } +} + +inline void L2Normalization(const tflite::L2NormalizationParams &op_params, + const RuntimeShape &input_shape, + const uint8_t *input_data, + const RuntimeShape &output_shape, + uint8_t *output_data) +{ + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int32_t input_zero_point = op_params.input_zero_point; + + for (int i = 0; i < outer_size; ++i) { + int32_t square_l2_norm = 0; + for (int c = 0; c < depth; c++) { + int32_t diff = input_data[depth * i + c] - input_zero_point; + square_l2_norm += diff * diff; + } + int32_t inv_l2norm_multiplier; + int inv_l2norm_shift; + GetInvSqrtQuantizedMultiplierExp(square_l2_norm, kReverseShift, + &inv_l2norm_multiplier, &inv_l2norm_shift); + for (int c = 0; c < depth; c++) { + int32_t diff = input_data[depth * i + c] - input_zero_point; + int32_t rescaled_diff = MultiplyByQuantizedMultiplierSmallerThanOneExp( + 128 * diff, inv_l2norm_multiplier, inv_l2norm_shift); + int32_t unclamped_output_val = 128 + rescaled_diff; + int32_t output_val = + std::min(static_cast(255), + std::max(static_cast(0), unclamped_output_val)); + output_data[depth * i + c] = static_cast(output_val); + } + } +} + +} // namespace reference_ops +} // namespace tflite +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_L2NORMALIZATION_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/leaky_relu.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/leaky_relu.h new file mode 100644 index 00000000..f20d5d89 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/leaky_relu.h @@ -0,0 +1,70 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LEAKY_RELU_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LEAKY_RELU_H_ + +#include +#include + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_ops { +inline void LeakyRelu(const tflite::LeakyReluParams ¶ms, + const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const float val = input_data[i]; + // Note that alpha might be > 1 or < 0, so we don't use std::max here. + output_data[i] = val > 0 ? val : val * params.alpha; + } +} + +template +inline void QuantizeLeakyRelu(const LeakyReluParams ¶ms, + const RuntimeShape &input_shape, + const T *input_data, + const RuntimeShape &output_shape, + T *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + static const int32_t quantized_min = std::numeric_limits::min(); + static const int32_t quantized_max = std::numeric_limits::max(); + for (int i = 0; i < flat_size; ++i) { + const int32_t input_value = input_data[i] - params.input_offset; + int32_t unclamped_output; + if (input_value >= 0) { + unclamped_output = params.output_offset + + MultiplyByQuantizedMultiplier( + input_value, params.output_multiplier_identity, + params.output_shift_identity); + } else { + unclamped_output = params.output_offset + + MultiplyByQuantizedMultiplier( + input_value, params.output_multiplier_alpha, + params.output_shift_alpha); + } + const T clamped_output = + std::min(quantized_max, std::max(quantized_min, unclamped_output)); + output_data[i] = static_cast(clamped_output); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LEAKY_RELU_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/log_softmax.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/log_softmax.h new file mode 100644 index 00000000..d64b6fe4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/log_softmax.h @@ -0,0 +1,259 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOG_SOFTMAX_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOG_SOFTMAX_H_ + +#include +#include +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_ops { +inline void LogSoftmax(const SoftmaxParams ¶ms, + const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + + for (int i = 0; i < outer_size; ++i) { + // Find max element value which we'll use to ensure numerical stability + // taking advantage of the following equality: + // log(exp(x[i])/sum(exp(x[i]))) == log(exp(x[i]+C)/sum(exp(x[i]+C))) + float max = std::numeric_limits::lowest(); + for (int c = 0; c < depth; ++c) { + max = std::max(max, input_data[i * depth + c]); + } + + // Compute sum. + float sum = 0.f; + for (int c = 0; c < depth; ++c) { + sum += std::exp(input_data[i * depth + c] - max); + } + + // Compute result. + const float log_sum = std::log(sum); + for (int c = 0; c < depth; ++c) { + output_data[i * depth + c] = input_data[i * depth + c] - max - log_sum; + } + } +} + +inline void LogSoftmax(const SoftmaxParams ¶ms, + const RuntimeShape &input_shape, + const uint8_t *input_data, + const RuntimeShape &output_shape, uint8_t *output_data) +{ + const int32_t input_multiplier = params.input_multiplier; + const int32_t input_left_shift = params.input_left_shift; + const int32_t reverse_scaling_divisor = params.reverse_scaling_divisor; + const int32_t reverse_scaling_right_shift = + params.reverse_scaling_right_shift; + const int diff_min = params.diff_min; + // The representation chosen for the input to the exp() function is Q5.26. + // We need to leave extra space since values that we skip might be as large + // as -32 before multiplying by input_beta_multiplier, and therefore as + // large as -16 afterwards. Note that exp(-8) is definitely not + // insignificant to accumulation, but exp(-16) definitely is. + static constexpr int kScaledDiffIntegerBits = 5; + static constexpr int kAccumulationIntegerBits = 12; + static constexpr int kOutputIntegerBits = 4; + using FixedPointScaledDiff = + gemmlowp::FixedPoint; + using FixedPointAccum = + gemmlowp::FixedPoint; + + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + + for (int i = 0; i < outer_size; ++i) { + uint8_t max_in_row = 0; + for (int c = 0; c < depth; ++c) { + max_in_row = std::max(max_in_row, input_data[i * depth + c]); + } + + FixedPointAccum sum_of_exps = FixedPointAccum::Zero(); + for (int c = 0; c < depth; ++c) { + int32_t input_diff = + static_cast(input_data[i * depth + c]) - max_in_row; + if (input_diff >= diff_min) { + const int32_t input_diff_rescaled = + MultiplyByQuantizedMultiplierGreaterThanOne( + input_diff, input_multiplier, input_left_shift); + const FixedPointScaledDiff scaled_diff_f8 = + FixedPointScaledDiff::FromRaw(input_diff_rescaled); + sum_of_exps = sum_of_exps + gemmlowp::Rescale( + exp_on_negative_values(scaled_diff_f8)); + } + } + + const int32_t fixed_log_sum_of_exps = + log_x_for_x_greater_than_or_equal_to_1( + sum_of_exps) + .raw(); + + // rescaled_diff_min is smallest representable in + // Q(kScaledDiffIntegerBits).(31-kScaledDiffIntegerBits) plus the + // log-sub-exps that will be subtracted in the loop. + // + // The thresholds diff_min, etc are negative. + const int rescaled_diff_min = + fixed_log_sum_of_exps + std::numeric_limits::lowest(); + const int adjusted_diff_min = + std::max(static_cast( + diff_min - 1), // Note use of > below instead of >= above. + MultiplyByQuantizedMultiplierSmallerThanOneExp( + rescaled_diff_min, reverse_scaling_divisor, + -reverse_scaling_right_shift)); + + for (int c = 0; c < depth; ++c) { + int32_t input_diff = + static_cast(input_data[i * depth + c]) - max_in_row; + if (input_diff > adjusted_diff_min) { + const int32_t input_diff_rescaled = + MultiplyByQuantizedMultiplierGreaterThanOne( + input_diff, input_multiplier, input_left_shift); + int32_t unsat_output = + gemmlowp::RoundingDivideByPOT( + (input_diff_rescaled - fixed_log_sum_of_exps), + 31 - kScaledDiffIntegerBits - kOutputIntegerBits) + + 255; + + output_data[i * depth + c] = static_cast( + std::max(std::min(unsat_output, static_cast(255)), + static_cast(0))); + } else { + // Set output to smallest value. + output_data[i * depth + c] = 0; + } + } + } +} + +template +inline void LogSoftmaxQuantized(const SoftmaxParams ¶ms, + const size_t outer_size, const size_t depth, + const RuntimeShape &input_shape, + const T *input_data, + const RuntimeShape &output_shape, + T *output_data) +{ + const int32_t input_multiplier = params.input_multiplier; + const int32_t input_left_shift = params.input_left_shift; + const int32_t reverse_scaling_divisor = params.reverse_scaling_divisor; + const int32_t reverse_scaling_right_shift = + params.reverse_scaling_right_shift; + const int diff_min = params.diff_min; + + static constexpr T kMinT8 = std::numeric_limits::min(); + static constexpr T kMaxT8 = std::numeric_limits::max(); + static constexpr int32_t kMinInt32 = std::numeric_limits::min(); + + // All IntegerBits must agree with Prepare function. + // Input is chosen as Q5.26 so exp(-1 * 2^5 * 2^-1) = exp(-16) is negligible. + static constexpr int kInputIntegerBits = 5; + static constexpr int kAccumulationIntegerBits = 12; + static constexpr int kOutputIntegerBits = 4; + using F5 = gemmlowp::FixedPoint; + using F12 = gemmlowp::FixedPoint; + + for (size_t outer_index = 0; outer_index < outer_size; ++outer_index) { + T max_in_row = kMinT8; + for (size_t inner_index = 0; inner_index < depth; ++inner_index) { + max_in_row = + std::max(max_in_row, input_data[outer_index * depth + inner_index]); + } + + // Accumulator "sum_of_exps_in_q12" is safe from overflowing in 2^12 steps. + F12 sum_of_exps_in_q12 = F12::FromRaw(0); + for (size_t inner_index = 0; inner_index < depth; ++inner_index) { + int32_t input_diff = + static_cast(input_data[outer_index * depth + inner_index]) - + max_in_row; + if (input_diff >= diff_min) { + const int32_t input_diff_in_q5 = MultiplyByQuantizedMultiplier( + input_diff, input_multiplier, input_left_shift); + sum_of_exps_in_q12 = + sum_of_exps_in_q12 + + gemmlowp::Rescale( + exp_on_negative_values(F5::FromRaw(input_diff_in_q5))); + } + } + + const int32_t log_sum_of_exps_in_q5 = + log_x_for_x_greater_than_or_equal_to_1( + sum_of_exps_in_q12) + .raw(); + + // Potentially reduced the valid range. shifted_log_sum_of_exps_in_q5 is + // smallest representable in Q5.26 plus the log_sum_of_exps. + const int32_t shifted_log_sum_of_exps_in_q5 = + log_sum_of_exps_in_q5 + kMinInt32; + const int32_t adjusted_diff_min = + std::max(static_cast(diff_min - 1), + MultiplyByQuantizedMultiplier(shifted_log_sum_of_exps_in_q5, + reverse_scaling_divisor, + -reverse_scaling_right_shift)); + + for (size_t inner_index = 0; inner_index < depth; ++inner_index) { + int32_t input_diff = + static_cast(input_data[outer_index * depth + inner_index]) - + max_in_row; + // Note use of > below instead of >= above. + if (input_diff > adjusted_diff_min) { + const int32_t input_diff_in_q5 = MultiplyByQuantizedMultiplier( + input_diff, input_multiplier, input_left_shift); + + // Rescale and downcast. + int32_t output_in_q27 = + gemmlowp::RoundingDivideByPOT( + (input_diff_in_q5 - log_sum_of_exps_in_q5), + 31 - kInputIntegerBits - kOutputIntegerBits) + + kMaxT8; + + output_in_q27 = + std::max(std::min(output_in_q27, static_cast(kMaxT8)), + static_cast(kMinT8)); + output_data[outer_index * depth + inner_index] = + static_cast(output_in_q27); + } else { + output_data[outer_index * depth + inner_index] = kMinT8; + } + } + } +} + +inline void LogSoftmax(const SoftmaxParams ¶ms, const size_t outer_size, + const size_t depth, const RuntimeShape &input_shape, + const int8_t *input_data, + const RuntimeShape &output_shape, int8_t *output_data) +{ + LogSoftmaxQuantized(params, outer_size, depth, input_shape, input_data, + output_shape, output_data); +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOG_SOFTMAX_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/logistic.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/logistic.h new file mode 100644 index 00000000..5300293a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/logistic.h @@ -0,0 +1,135 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOGISTIC_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOGISTIC_H_ + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/op_macros.h" + +namespace tflite { +namespace reference_ops { +inline void Logistic(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const float cutoff_upper = 16.619047164916992188f; + const float cutoff_lower = -9.f; + + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + // Rational for using approximation in reference kernel. + // 0. This approximation gives enough precision for float. + // 1. This works around an issue on an embedded chipset where exp() does not + // return correctly as expected - exp(x) should return inf when overflown + // not 1.701417 IEEE 754 defines representation for inf. + // 2. This will speed up calculation and is matching the behavior in the + // optimized kernels. (check the definition of scalar_logistic_op) + + for (int i = 0; i < flat_size; i++) { + float val = input_data[i]; + float result; + if (val > cutoff_upper) { + result = 1.0f; + } else if (val < cutoff_lower) { + result = std::exp(val); + } else { + result = 1.f / (1.f + std::exp(-val)); + } + output_data[i] = result; + } +} + +// Convenience version that allows, for example, generated-code calls to be +// uniform between data types. +inline void Logistic(const LogisticParams &, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &output_shape, + float *output_data) +{ + // Drop params: not needed. + Logistic(input_shape, input_data, output_shape, output_data); +} + +inline void Logistic(const LogisticParams ¶ms, + const RuntimeShape &input_shape, const int16_t *input_data, + const RuntimeShape &output_shape, int16_t *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + // F0 uses 0 integer bits, range [-1, 1]. + // This is the return type of math functions such as tanh, logistic, + // whose range is in [-1, 1]. + using F0 = gemmlowp::FixedPoint; + // F3 uses 3 integer bits, range [-8, 8], the input range expected here. + using F3 = gemmlowp::FixedPoint; + + const F3 input = F3::FromRaw(input_data[i]); + F0 output = gemmlowp::logistic(input); + output_data[i] = output.raw(); + } +} + +// Quantized int8_t logistic activation. Cheats by dequantizing and +// requantizing around the floating point logistic method. This implementation +// is slow on platforms without a floating point unit. + +// TODO(b/141211002): Delete this int8_t implementation once we can reuse the +// approach used in TFLite for int8_t Logistic. +inline void Logistic(const RuntimeShape &input_shape, const int8_t *input_data, + float input_scale, int input_zero_point, + const RuntimeShape &output_shape, int8_t *output_data, + float output_scale, int output_zero_point) +{ + const float cutoff_upper = 16.619047164916992188f; + const float cutoff_lower = -9.f; + + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + // Rational for using approximation in reference kernel. + // 0. This approximation gives enough precision for float. + // 1. This works around an issue on an embedded chipset where exp() does not + // return correctly as expected - exp(x) should return inf when overflown + // not 1.701417 IEEE 754 defines representation for inf. + // 2. This will speed up calculation and is matching the behavior in the + // optimized kernels. (check the definition of scalar_logistic_op) + + for (int i = 0; i < flat_size; i++) { + // Dequantize. + float val = + static_cast((input_data[i] - input_zero_point) * input_scale); + float result; + if (val > cutoff_upper) { + result = 1.0f; + } else if (val < cutoff_lower) { + result = std::exp(val); + } else { + result = 1.f / (1.f + std::exp(-val)); + } + // Requantize + int8_t output = + static_cast(result / output_scale + output_zero_point); + output_data[i] = output; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOGISTIC_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/maximum_minimum.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/maximum_minimum.h new file mode 100644 index 00000000..1f5872c9 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/maximum_minimum.h @@ -0,0 +1,64 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MAXIMUM_MINIMUM_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MAXIMUM_MINIMUM_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +void MaximumMinimumBroadcastSlow(const RuntimeShape &unextended_input1_shape, + const T *input1_data, + const RuntimeShape &unextended_input2_shape, + const T *input2_data, + const RuntimeShape &unextended_output_shape, + T *output_data, Op op) +{ + // Uses element-wise calculation if broadcast is not required. + if (unextended_input1_shape == unextended_input2_shape) { + const int flat_size = + MatchingElementsSize(unextended_input1_shape, unextended_input2_shape, + unextended_output_shape); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = op(input1_data[i], input2_data[i]); + } + } else { + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), N); + + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast( + unextended_input1_shape, unextended_input2_shape, &desc1, &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, unextended_output_shape), + &output_desc); + + auto maxmin_func = [&](int indexes[N]) { + output_data[SubscriptToIndex(output_desc, indexes)] = + op(input1_data[SubscriptToIndex(desc1, indexes)], + input2_data[SubscriptToIndex(desc2, indexes)]); + }; + NDOpsHelper(output_desc, maxmin_func); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MAXIMUM_MINIMUM_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/mul.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/mul.h new file mode 100644 index 00000000..9969bd0f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/mul.h @@ -0,0 +1,169 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MUL_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MUL_H_ + +#include "tensorflow/lite/kernels/internal/common.h" + +namespace tflite { +namespace reference_ops { +// Element-wise mul that can often be used for inner loop of broadcast Mul as +// well as the non-broadcast Mul. +inline void MulElementwise(int size, const ArithmeticParams ¶ms, + const uint8_t *input1_data, + const uint8_t *input2_data, uint8_t *output_data) +{ + for (int i = 0; i < size; ++i) { + const int32_t input1_val = params.input1_offset + input1_data[i]; + const int32_t input2_val = params.input2_offset + input2_data[i]; + const int32_t unclamped_result = + params.output_offset + + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, unclamped_result)); + output_data[i] = static_cast(clamped_output); + } +} + +template +inline void Mul(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const T *input1_data, + const RuntimeShape &input2_shape, const T *input2_data, + const RuntimeShape &output_shape, T *output_data) +{ + T output_activation_min; + T output_activation_max; + GetActivationParams(params, &output_activation_min, &output_activation_max); + + const int flat_size = + MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = ActivationFunctionWithMinMax( + input1_data[i] * input2_data[i], output_activation_min, + output_activation_max); + } +} + +inline void Mul(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const uint8_t *input1_data, + const RuntimeShape &input2_shape, const uint8_t *input2_data, + const RuntimeShape &output_shape, uint8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + const int flat_size = + MatchingFlatSize(input1_shape, input2_shape, output_shape); + + MulElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +inline void BroadcastMul4DSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const uint8_t *input1_data, + const RuntimeShape &input2_shape, + const uint8_t *input2_data, + const RuntimeShape &output_shape, + uint8_t *output_data) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + const int32_t input1_val = + params.input1_offset + + input1_data[SubscriptToIndex(desc1, b, y, x, c)]; + const int32_t input2_val = + params.input2_offset + + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; + const int32_t unclamped_result = + params.output_offset + + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); + const int32_t clamped_output = std::min( + params.quantized_activation_max, + std::max(params.quantized_activation_min, unclamped_result)); + output_data[Offset(extended_output_shape, b, y, x, c)] = + static_cast(clamped_output); + } + } + } + } +} + +template +void BroadcastMul4DSlow(const ArithmeticParams ¶ms, + const RuntimeShape &unextended_input1_shape, + const T *input1_data, + const RuntimeShape &unextended_input2_shape, + const T *input2_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + T output_activation_min; + T output_activation_max; + GetActivationParams(params, &output_activation_min, &output_activation_max); + + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, + unextended_input2_shape, &desc1, &desc2); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < output_shape.Dims(0); ++b) { + for (int y = 0; y < output_shape.Dims(1); ++y) { + for (int x = 0; x < output_shape.Dims(2); ++x) { + for (int c = 0; c < output_shape.Dims(3); ++c) { + output_data[Offset(output_shape, b, y, x, c)] = + ActivationFunctionWithMinMax( + input1_data[SubscriptToIndex(desc1, b, y, x, c)] * + input2_data[SubscriptToIndex(desc2, b, y, x, c)], + output_activation_min, output_activation_max); + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MUL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/neg.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/neg.h new file mode 100644 index 00000000..1f2014ed --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/neg.h @@ -0,0 +1,36 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_NEG_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_NEG_H_ + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void Negate(const RuntimeShape &input_shape, const T *input_data, + const RuntimeShape &output_shape, T *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; ++i) { + output_data[i] = -input_data[i]; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_NEG_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pad.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pad.h new file mode 100644 index 00000000..8af3b74b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pad.h @@ -0,0 +1,176 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PAD_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PAD_H_ + +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// TFLite Pad supports activation tensors with up to 5 dimensions. +constexpr int PadKernelMaxDimensionCount() +{ + return 5; +} + +// There are two versions of pad: Pad and PadV2. In PadV2 there is a second +// scalar input that provides the padding value. Therefore pad_value_ptr can be +// equivalent to a simple input1_data. For Pad, it should point to a zero +// value. +// +// Note that two typenames are required, so that T=P=int32_t is considered a +// specialization distinct from P=int32_t. +template +inline void PadImpl(const tflite::PadParams &op_params, + const RuntimeShape &input_shape, const T *input_data, + const P *pad_value_ptr, const RuntimeShape &output_shape, + T *output_data) +{ + const RuntimeShape ext_input_shape = + RuntimeShape::ExtendedShape(PadKernelMaxDimensionCount(), input_shape); + const RuntimeShape ext_output_shape = + RuntimeShape::ExtendedShape(PadKernelMaxDimensionCount(), output_shape); + TFLITE_DCHECK_LE(op_params.left_padding_count, PadKernelMaxDimensionCount()); + TFLITE_DCHECK_LE(op_params.right_padding_count, PadKernelMaxDimensionCount()); + + // Runtime calls are currently fixed at 5 dimensions. Copy inputs so we can + // pad them to 5 dims (yes, we are "padding the padding"). + int left_padding_copy[PadKernelMaxDimensionCount()]; + for (int i = 0; i < PadKernelMaxDimensionCount(); i++) { + left_padding_copy[i] = 0; + } + for (int i = 0; i < op_params.left_padding_count; ++i) { + left_padding_copy[i + PadKernelMaxDimensionCount() - + op_params.left_padding_count] = op_params.left_padding[i]; + } + int right_padding_copy[PadKernelMaxDimensionCount()]; + for (int i = 0; i < PadKernelMaxDimensionCount(); i++) { + right_padding_copy[i] = 0; + } + for (int i = 0; i < op_params.right_padding_count; ++i) { + right_padding_copy[i + PadKernelMaxDimensionCount() - + op_params.right_padding_count] = + op_params.right_padding[i]; + } + + const int output_batch = ext_output_shape.Dims(0); + const int output_plane = ext_output_shape.Dims(1); + const int output_height = ext_output_shape.Dims(2); + const int output_width = ext_output_shape.Dims(3); + const int output_depth = ext_output_shape.Dims(4); + + const int left_b_padding = left_padding_copy[0]; + const int left_p_padding = left_padding_copy[1]; + const int left_h_padding = left_padding_copy[2]; + const int left_w_padding = left_padding_copy[3]; + const int left_d_padding = left_padding_copy[4]; + + const int right_b_padding = right_padding_copy[0]; + const int right_p_padding = right_padding_copy[1]; + const int right_h_padding = right_padding_copy[2]; + const int right_w_padding = right_padding_copy[3]; + const int right_d_padding = right_padding_copy[4]; + + const T pad_value = *pad_value_ptr; + + const T *in_ptr = input_data; + T *out_ptr = output_data; + for (int out_b = 0; out_b < output_batch; ++out_b) { + for (int out_p = 0; out_p < output_plane; ++out_p) { + for (int out_h = 0; out_h < output_height; ++out_h) { + for (int out_w = 0; out_w < output_width; ++out_w) { + for (int out_d = 0; out_d < output_depth; ++out_d) { + if (out_b < left_b_padding || + out_b >= output_batch - right_b_padding || + out_p < left_p_padding || + out_p >= output_plane - right_p_padding || + out_h < left_h_padding || + out_h >= output_height - right_h_padding || + out_w < left_w_padding || + out_w >= output_width - right_w_padding || + out_d < left_d_padding || + out_d >= output_depth - right_d_padding) { + *out_ptr++ = pad_value; + } else { + *out_ptr++ = *in_ptr++; + } + } + } + } + } + } +} + +template +inline void Pad(const tflite::PadParams &op_params, + const RuntimeShape &input_shape, const T *input_data, + const P *pad_value_ptr, const RuntimeShape &output_shape, + T *output_data) +{ + PadImpl(op_params, input_shape, input_data, pad_value_ptr, output_shape, + output_data); +} + +// The second (pad-value) input can be int32_t when, say, the first is uint8_t. +template +inline void Pad(const tflite::PadParams &op_params, + const RuntimeShape &input_shape, const T *input_data, + const int32_t *pad_value_ptr, const RuntimeShape &output_shape, + T *output_data) +{ + const T converted_pad_value = static_cast(*pad_value_ptr); + PadImpl(op_params, input_shape, input_data, &converted_pad_value, + output_shape, output_data); +} + +// This version avoids conflicting template matching. +template <> +inline void Pad(const tflite::PadParams &op_params, + const RuntimeShape &input_shape, const int32_t *input_data, + const int32_t *pad_value_ptr, const RuntimeShape &output_shape, + int32_t *output_data) +{ + PadImpl(op_params, input_shape, input_data, pad_value_ptr, output_shape, + output_data); +} + +template +inline void PadImageStyle(const tflite::PadParams &op_params, + const RuntimeShape &input_shape, const T *input_data, + const P *pad_value_ptr, + const RuntimeShape &output_shape, T *output_data) +{ + Pad(op_params, input_shape, input_data, pad_value_ptr, output_shape, + output_data); +} + +template +inline void PadImageStyle(const tflite::PadParams &op_params, + const RuntimeShape &input_shape, + const float *input_data, const P *pad_value_ptr, + const RuntimeShape &output_shape, + float *output_data) +{ + Pad(op_params, input_shape, input_data, pad_value_ptr, output_shape, + output_data); +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PAD_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pooling.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pooling.h new file mode 100644 index 00000000..477c5098 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/pooling.h @@ -0,0 +1,301 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_POOLING_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_POOLING_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void AveragePool(const PoolParams ¶ms, + const RuntimeShape &input_shape, + const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + float total = 0.f; + float filter_count = 0; + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + total += + input_data[Offset(input_shape, batch, in_y, in_x, channel)]; + filter_count++; + } + } + const float average = total / filter_count; + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + ActivationFunctionWithMinMax(average, params.float_activation_min, + params.float_activation_max); + } + } + } + } +} + +inline void AveragePool(const PoolParams ¶ms, + const RuntimeShape &input_shape, + const uint8_t *input_data, + const RuntimeShape &output_shape, + uint8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + int32_t acc = 0; + int filter_count = 0; + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + acc += + input_data[Offset(input_shape, batch, in_y, in_x, channel)]; + filter_count++; + } + } + acc = (acc + filter_count / 2) / filter_count; + acc = std::max(acc, params.quantized_activation_min); + acc = std::min(acc, params.quantized_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + static_cast(acc); + } + } + } + } +} + +inline void L2Pool(const PoolParams ¶ms, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &output_shape, + float *output_data) +{ + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + float sum_squares = 0.f; + int filter_count = 0; + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + const float val = + input_data[Offset(input_shape, batch, in_y, in_x, channel)]; + sum_squares += val * val; + filter_count++; + } + } + const float l2pool_result = std::sqrt(sum_squares / filter_count); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + ActivationFunctionWithMinMax(l2pool_result, + params.float_activation_min, + params.float_activation_max); + } + } + } + } +} + +inline void MaxPool(const PoolParams ¶ms, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &output_shape, + float *output_data) +{ + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + float max = std::numeric_limits::lowest(); + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + max = std::max( + max, + input_data[Offset(input_shape, batch, in_y, in_x, channel)]); + } + } + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + ActivationFunctionWithMinMax(max, params.float_activation_min, + params.float_activation_max); + } + } + } + } +} + +inline void MaxPool(const PoolParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &output_shape, + uint8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + TFLITE_DCHECK_GE(params.quantized_activation_min, 0); + TFLITE_DCHECK_LE(params.quantized_activation_max, 255); + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int depth = MatchingDim(input_shape, 3, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int stride_height = params.stride_height; + const int stride_width = params.stride_width; + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int channel = 0; channel < depth; ++channel) { + const int in_x_origin = + (out_x * stride_width) - params.padding_values.width; + const int in_y_origin = + (out_y * stride_height) - params.padding_values.height; + // Compute the boundaries of the filter region clamped so as to + // ensure that the filter window fits in the input array. + const int filter_x_start = std::max(0, -in_x_origin); + const int filter_x_end = + std::min(params.filter_width, input_width - in_x_origin); + const int filter_y_start = std::max(0, -in_y_origin); + const int filter_y_end = + std::min(params.filter_height, input_height - in_y_origin); + uint8_t max = 0; + for (int filter_y = filter_y_start; filter_y < filter_y_end; + ++filter_y) { + for (int filter_x = filter_x_start; filter_x < filter_x_end; + ++filter_x) { + const int in_x = in_x_origin + filter_x; + const int in_y = in_y_origin + filter_y; + max = std::max( + max, + input_data[Offset(input_shape, batch, in_y, in_x, channel)]); + } + } + max = std::max(max, params.quantized_activation_min); + max = std::min(max, params.quantized_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, channel)] = + static_cast(max); + } + } + } + } +} +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_POOLING_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/prelu.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/prelu.h new file mode 100644 index 00000000..ca3d794e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/prelu.h @@ -0,0 +1,109 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PRELU_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PRELU_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// Broadcast prelu to output_shape for quantized uint8_t/int8_t data. +template +inline void BroadcastPrelu4DSlow( + const PreluParams ¶ms, const RuntimeShape &input_shape, + const T *input_data, const RuntimeShape &alpha_shape, const T *alpha_data, + const RuntimeShape &output_shape, T *output_data) +{ + TFLITE_DCHECK_LE(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(alpha_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(output_shape.DimensionsCount(), 4); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input_shape, alpha_shape, &desc1, &desc2); + + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + int output_index = Offset(extended_output_shape, b, y, x, c); + int input_index = SubscriptToIndex(desc1, b, y, x, c); + const int32_t input_value = + params.input_offset + input_data[input_index]; + int32_t output_value; + if (input_value >= 0) { + output_value = MultiplyByQuantizedMultiplier( + input_value, params.output_multiplier_1, params.output_shift_1); + } else { + auto alpha_index = SubscriptToIndex(desc2, b, y, x, c); + const int32_t alpha_value = + params.alpha_offset + alpha_data[alpha_index]; + + output_value = MultiplyByQuantizedMultiplier( + input_value * alpha_value, params.output_multiplier_2, + params.output_shift_2); + } + output_value += params.output_offset; + + const int32_t quantized_min = std::numeric_limits::min(); + const int32_t quantized_max = std::numeric_limits::max(); + const int32_t clamped_output = + std::min(quantized_max, std::max(quantized_min, output_value)); + output_data[output_index] = static_cast(clamped_output); + } + } + } + } +} + +template +inline void Prelu(const PreluParams ¶ms, const RuntimeShape &input_shape, + const T *input_data, const RuntimeShape &alpha_shape, + const T *alpha_data, const RuntimeShape &output_shape, + T *output_data) +{ + const int32_t quantized_min = std::numeric_limits::min(); + const int32_t quantized_max = std::numeric_limits::max(); + + const int flat_size = + MatchingElementsSize(input_shape, alpha_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const int32_t input_value = params.input_offset + input_data[i]; + int32_t output_value; + if (input_value >= 0) { + output_value = MultiplyByQuantizedMultiplier( + input_value, params.output_multiplier_1, params.output_shift_1); + } else { + const int32_t alpha_value = params.alpha_offset + alpha_data[i]; + + output_value = MultiplyByQuantizedMultiplier(input_value * alpha_value, + params.output_multiplier_2, + params.output_shift_2); + } + output_value += params.output_offset; + + const int32_t clamped_output = + std::min(quantized_max, std::max(quantized_min, output_value)); + output_data[i] = static_cast(clamped_output); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PRELU_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h new file mode 100644 index 00000000..d348273b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h @@ -0,0 +1,137 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PROCESS_BROADCAST_SHAPES_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PROCESS_BROADCAST_SHAPES_H_ + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// Consolidates dimensions in broadcast inputs, checks for five-fold pattern. +// +// For example, if sequence of dimensions of one input is +// ..., 1, 3, 1, 7, 9, 5,... and the other is ..., 2, 3, 1, 7, 1, 1, ... +// we can consolidate these as +// ..., 1, 3*7, 9*5, ... and 2, 3*7, 1. +// +// The category is updated in the less-frequent case of shapes that are +// not suited to a fivefold-loop broadcast. +// +// Falls back to generic pattern when it does not know how to process properly. +// +// Returns true iff there is some sort of broadcast, which includes five-fold +// patterns and falling back to generic broadcast. +inline bool ProcessBroadcastShapes(const RuntimeShape &shape0, + const RuntimeShape &shape1, + tflite::ArithmeticParams *params) +{ + const int dims_count = + std::max(shape0.DimensionsCount(), shape1.DimensionsCount()); + + params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; + RuntimeShape scalar_shape(dims_count, 1); + + auto extended_shape0 = RuntimeShape::ExtendedShape(dims_count, shape0); + auto extended_shape1 = RuntimeShape::ExtendedShape(dims_count, shape1); + + // Check for "exact" match, implicitly accepting any scalar shapes. + if (extended_shape0 == extended_shape1) { + params->broadcast_category = BroadcastableOpCategory::kNonBroadcast; + return false; + } + + for (int i = dims_count - 1; i >= 0; --i) { + if (extended_shape0.Dims(i) == extended_shape1.Dims(i)) { + continue; + } else if (extended_shape0.Dims(i) == 1) { + params->broadcast_category = + BroadcastableOpCategory::kFirstInputBroadcastsFast; + break; + } else if (extended_shape1.Dims(i) == 1) { + params->broadcast_category = + BroadcastableOpCategory::kSecondInputBroadcastsFast; + break; + } else { + // This case is erroneous: there is a dimension that does not match and + // is not a broadcast from one shape to the other. + params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; + return true; + } + } + + if (params->broadcast_category != + BroadcastableOpCategory::kFirstInputBroadcastsFast && + params->broadcast_category != + BroadcastableOpCategory::kSecondInputBroadcastsFast) { + // This is unreachable because at least one else clause in the above loop + // must be reached. + TFLITE_DCHECK(false); + params->broadcast_category = BroadcastableOpCategory::kNonBroadcast; + return false; + } + + // From this point it is assumed contractually that corresponding dimensions + // in shape0 and shape1 are either (a) equal or (b) one or other equals 1. + const bool swap_inputs = params->broadcast_category == + BroadcastableOpCategory::kSecondInputBroadcastsFast; + const RuntimeShape *shape_a = + swap_inputs ? &extended_shape1 : &extended_shape0; + const RuntimeShape *shape_b = + swap_inputs ? &extended_shape0 : &extended_shape1; + + int i = dims_count - 1; + params->broadcast_shape[0] = 1; + params->broadcast_shape[1] = 1; + params->broadcast_shape[2] = 1; + params->broadcast_shape[3] = 1; + params->broadcast_shape[4] = 1; + // y_0 is greedy: include dims if both or neither equal 1: in other words, + // test for equality rather than (shape_a->Dims(i) != 1). + while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) { + params->broadcast_shape[4] *= shape_b->Dims(i); + --i; + } + // Here either input_a or input_b has dim of 1 (if i >= 0). If it is input_b + // that has the unit dimension, the next two loops are not entered. + while (i >= 0 && shape_a->Dims(i) == 1) { + params->broadcast_shape[3] *= shape_b->Dims(i); + --i; + } + while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) { + params->broadcast_shape[2] *= shape_a->Dims(i); + --i; + } + // Here either input_a or input_b has dim of 1 (if i >= 0). + while (i >= 0 && shape_b->Dims(i) == 1) { + params->broadcast_shape[1] *= shape_a->Dims(i); + --i; + } + while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) { + params->broadcast_shape[0] *= shape_b->Dims(i); + --i; + } + + // Rarer case is when the broadcast dimensions cannot be handled by a fivefold + // loop. + if (i >= 0) { + params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; + } + return true; +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PROCESS_BROADCAST_SHAPES_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/quantize.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/quantize.h new file mode 100644 index 00000000..23e2aa31 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/quantize.h @@ -0,0 +1,54 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_QUANTIZE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_QUANTIZE_H_ + +#include +#include + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void AffineQuantize(const tflite::QuantizationParams &op_params, + const RuntimeShape &input_shape, + const InputT *input_data, + const RuntimeShape &output_shape, + OutputT *output_data) +{ + const int32_t zero_point = op_params.zero_point; + const double scale = op_params.scale; + const int flat_size = MatchingFlatSize(input_shape, output_shape); + static constexpr int32_t min_val = std::numeric_limits::min(); + static constexpr int32_t max_val = std::numeric_limits::max(); + + for (int i = 0; i < flat_size; i++) { + const InputT val = input_data[i]; + int32_t unclamped = + static_cast(TfLiteRound(val / static_cast(scale))) + + zero_point; + int32_t clamped = std::min(std::max(unclamped, min_val), max_val); + output_data[i] = clamped; + } +} + +} // namespace reference_ops + +} // namespace tflite +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_QUANTIZE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/reduce.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/reduce.h new file mode 100644 index 00000000..44bf50c3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/reduce.h @@ -0,0 +1,420 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REDUCE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REDUCE_H_ + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/max.h" +#include "tensorflow/lite/kernels/internal/min.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// A generic reduce method that can be used for reduce_sum, reduce_mean, etc. +// This method iterates through input data and reduce elements along the +// dimensions given in axis. +template +inline bool Reduce(const In *input_data, const int *input_dims, + const int *output_dims, const int input_num_dims, + const int output_num_dims, const int *axis, + const int num_axis, int *input_iter, + Out reducer(const Out current, const In in), + Out *output_data) +{ + // Reset input iterator. + for (int idx = 0; idx < input_num_dims; ++idx) { + input_iter[idx] = 0; + } + // Iterate through input_data. + do { + size_t input_offset = + ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); + size_t output_offset = ReducedOutputOffset(input_num_dims, input_dims, + input_iter, num_axis, axis); + output_data[output_offset] = + reducer(output_data[output_offset], input_data[input_offset]); + } while (NextIndex(input_num_dims, input_dims, input_iter)); + return true; +} + +// This method parses the input 'axis' to remove duplicates and handle negative +// values, and returns a valid 'out_axis' +inline bool ResolveAxis(const int num_dims, const int *axis, + const int64_t num_axis, int *out_axis, + int *out_num_axis) +{ + *out_num_axis = 0; // Just in case. + // Short-circuit axis resolution for scalars; the axis will go unused. + if (num_dims == 0) { + return true; + } + // o(n^2) is fine since out_num_axis should be really small, mostly <= 4 + for (int64_t idx = 0; idx < num_axis; ++idx) { + // Handle negative index. A positive index 'p_idx' can be represented as a + // negative index 'n_idx' as: n_idx = p_idx-num_dims + // eg: For num_dims=3, [0, 1, 2] is the same as [-3, -2, -1] */ + int current = axis[idx] < 0 ? (axis[idx] + num_dims) : axis[idx]; + TFLITE_DCHECK(current >= 0 && current < num_dims); + if (current < 0 || current >= num_dims) { + return false; + } + bool is_dup = false; + for (int j = 0; j < *out_num_axis; ++j) { + if (out_axis[j] == current) { + is_dup = true; + break; + } + } + if (!is_dup) { + out_axis[*out_num_axis] = current; + *out_num_axis += 1; + } + } + return true; +} + +// This method expects that output_data has been initialized. +template +inline bool ReduceSumImpl(const In *input_data, const int *input_dims, + const int *output_dims, const int input_num_dims, + const int output_num_dims, const int *axis, + const int num_axis, int *input_iter, + Out *output_data) +{ + auto reducer = [](const Out current, const In in) -> Out { + const Out actual_in = static_cast(in); + return current + actual_in; + }; + return Reduce(input_data, input_dims, output_dims, input_num_dims, + output_num_dims, axis, num_axis, input_iter, reducer, + output_data); +} + +template +inline bool InitTensorDataForReduce(const int *dims, const int num_dims, + const T init_value, T *data) +{ + size_t num_elements = 1; + for (int idx = 0; idx < num_dims; ++idx) { + size_t current = static_cast(dims[idx]); + // Overflow prevention. + if (num_elements > std::numeric_limits::max() / current) { + return false; + } + num_elements *= current; + } + for (size_t idx = 0; idx < num_elements; ++idx) { + data[idx] = init_value; + } + return true; +} + +// Computes the generic value (i.e., sum/max/min/prod) of elements across +// dimensions given in axis. It needs to pass in init_value and reducer. +template +inline bool ReduceGeneric(const T *input_data, const int *input_dims, + const int input_num_dims, T *output_data, + const int *output_dims, const int output_num_dims, + const int *axis, const int64_t num_axis_dimensions, + bool keep_dims, int *temp_index, int *resolved_axis, + T init_value, + T reducer(const T current, const T in)) +{ + // Return early when input shape has zero dim. + for (int i = 0; i < input_num_dims; ++i) { + if (input_dims[i] == 0) + return true; + } + + // Reset output data. + if (!InitTensorDataForReduce(output_dims, output_num_dims, init_value, + output_data)) { + return false; + } + + // Resolve axis. + int num_resolved_axis = 0; + if (!ResolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, + &num_resolved_axis)) { + return false; + } + + return Reduce(input_data, input_dims, output_dims, input_num_dims, + output_num_dims, resolved_axis, num_resolved_axis, + temp_index, reducer, output_data); +} + +// Computes the mean of elements across dimensions given in axis. +// It does so in two stages, first calculates the sum of elements along the axis +// then divides it by the number of element in axis. +template +inline bool Mean(const T *input_data, const int *input_dims, + const int input_num_dims, T *output_data, + const int *output_dims, const int output_num_dims, + const int *axis, const int num_axis_dimensions, bool keep_dims, + int *temp_index, int *resolved_axis, U *temp_sum) +{ + ruy::profiler::ScopeLabel label("Mean"); + // Reset output data. + size_t num_outputs = 1; + for (int idx = 0; idx < output_num_dims; ++idx) { + size_t current = static_cast(output_dims[idx]); + // Overflow prevention. + if (num_outputs > std::numeric_limits::max() / current) { + return false; + } + num_outputs *= current; + } + for (size_t idx = 0; idx < num_outputs; ++idx) { + output_data[idx] = T(); + temp_sum[idx] = U(); + } + + // Resolve axis. + int num_resolved_axis = 0; + if (!ResolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, + &num_resolved_axis)) { + return false; + } + + if (!ReduceSumImpl(input_data, input_dims, output_dims, input_num_dims, + output_num_dims, resolved_axis, num_resolved_axis, + temp_index, temp_sum)) { + return false; + } + + // Calculate mean by dividing output_data by num of aggregated element. + size_t num_elements_in_axis = 1; + for (int idx = 0; idx < num_resolved_axis; ++idx) { + size_t current = static_cast(input_dims[resolved_axis[idx]]); + // Overflow prevention. + if (current > (std::numeric_limits::max() / num_elements_in_axis)) { + return false; + } + num_elements_in_axis *= current; + } + + if (num_elements_in_axis > 0) { + for (size_t idx = 0; idx < num_outputs; ++idx) { + output_data[idx] = + static_cast(temp_sum[idx] / static_cast(num_elements_in_axis)); + } + } + return true; +} + +template +inline void Mean(const tflite::MeanParams &op_params, + const RuntimeShape &unextended_input_shape, + const T *input_data, + const RuntimeShape &unextended_output_shape, T *output_data) +{ + ruy::profiler::ScopeLabel label("Mean4D"); + + // Current implementation only supports dimension equals 4 and simultaneous + // reduction over width and height. + TFLITE_CHECK_EQ(unextended_input_shape.DimensionsCount(), 4); + TFLITE_CHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + const int output_batch = output_shape.Dims(0); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int output_depth = output_shape.Dims(3); + + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + + TFLITE_CHECK_EQ(op_params.axis_count, 2); + TFLITE_CHECK((op_params.axis[0] == 1 && op_params.axis[1] == 2) || + (op_params.axis[0] == 2 && op_params.axis[1] == 1)); + TFLITE_CHECK_EQ(output_height, 1); + TFLITE_CHECK_EQ(output_width, 1); + + for (int out_b = 0; out_b < output_batch; ++out_b) { + for (int out_d = 0; out_d < output_depth; ++out_d) { + float value = 0; + for (int in_h = 0; in_h < input_height; ++in_h) { + for (int in_w = 0; in_w < input_width; ++in_w) { + value += input_data[Offset(input_shape, out_b, in_h, in_w, out_d)]; + } + } + output_data[Offset(output_shape, out_b, 0, 0, out_d)] = + value / (input_width * input_height); + } + } +} + +inline void Mean(const tflite::MeanParams &op_params, + const RuntimeShape &unextended_input_shape, + const uint8_t *input_data, int32_t input_zero_point, + float input_scale, const RuntimeShape &unextended_output_shape, + uint8_t *output_data, int32_t output_zero_point, + float output_scale) +{ + ruy::profiler::ScopeLabel label("Mean4D/Uint8"); + + // Current implementation only supports dimension equals 4 and simultaneous + // reduction over width and height. + TFLITE_CHECK_EQ(unextended_input_shape.DimensionsCount(), 4); + TFLITE_CHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + const int output_batch = output_shape.Dims(0); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int output_depth = output_shape.Dims(3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const float num_elements_in_axis = input_width * input_height; + + TFLITE_CHECK_EQ(op_params.axis_count, 2); + TFLITE_CHECK((op_params.axis[0] == 1 && op_params.axis[1] == 2) || + (op_params.axis[0] == 2 && op_params.axis[1] == 1)); + TFLITE_CHECK_EQ(output_height, 1); + TFLITE_CHECK_EQ(output_width, 1); + + constexpr int32_t kMinValue = std::numeric_limits::min(); + constexpr int32_t kMaxValue = std::numeric_limits::max(); + + float temp = input_zero_point * input_scale / output_scale; + temp = temp > 0 ? temp + 0.5f : temp - 0.5f; + int32_t bias = output_zero_point - static_cast(temp); + double real_scale = + static_cast(input_scale / (num_elements_in_axis * output_scale)); + + int32_t multiplier; + int shift; + QuantizeMultiplier(real_scale, &multiplier, &shift); + for (int out_b = 0; out_b < output_batch; ++out_b) { + for (int out_d = 0; out_d < output_depth; ++out_d) { + int32_t acc = 0; + for (int in_h = 0; in_h < input_height; ++in_h) { + for (int in_w = 0; in_w < input_width; ++in_w) { + acc += input_data[Offset(input_shape, out_b, in_h, in_w, out_d)]; + } + } + acc = MultiplyByQuantizedMultiplier(acc, multiplier, shift); + acc += bias; + acc = std::min(std::max(acc, kMinValue), kMaxValue); + output_data[Offset(output_shape, out_b, 0, 0, out_d)] = + static_cast(acc); + } + } +} + +// Computes the mean of elements across dimensions given in axis. +// It does so in two stages, first calculates the sum of elements along the axis +// then divides it by the number of element in axis for quantized values. +template +inline bool QuantizedMeanOrSum(const T *input_data, int32_t input_zero_point, + float input_scale, const int *input_dims, + const int input_num_dims, T *output_data, + int32_t output_zero_point, float output_scale, + const int *output_dims, + const int output_num_dims, const int *axis, + const int num_axis_dimensions, bool keep_dims, + int *temp_index, int *resolved_axis, U *temp_sum, + bool compute_sum) +{ + const bool uint8_case = std::is_same::value; + const bool int16_case = std::is_same::value; + if (uint8_case) { + ruy::profiler::ScopeLabel label(compute_sum ? "Sum/Uint8" : "Mean/Uint8"); + } else if (int16_case) { + ruy::profiler::ScopeLabel label(compute_sum ? "Sum/Int16" : "Mean/Int16"); + } else { + ruy::profiler::ScopeLabel label(compute_sum ? "Sum/Int8" : "Mean/Int8"); + } + // Reset output data. + size_t num_outputs = 1; + for (int idx = 0; idx < output_num_dims; ++idx) { + size_t current = static_cast(output_dims[idx]); + // Overflow prevention. + if (num_outputs > std::numeric_limits::max() / current) { + return false; + } + num_outputs *= current; + } + for (size_t idx = 0; idx < num_outputs; ++idx) { + output_data[idx] = T(); + temp_sum[idx] = U(); + } + + // Resolve axis. + int num_resolved_axis = 0; + if (!ResolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, + &num_resolved_axis)) { + return false; + } + + if (!ReduceSumImpl(input_data, input_dims, output_dims, input_num_dims, + output_num_dims, resolved_axis, num_resolved_axis, + temp_index, temp_sum)) { + return false; + } + + // Calculate mean by dividing output_data by num of aggregated element. + size_t num_elements_in_axis = 1; + for (int idx = 0; idx < num_resolved_axis; ++idx) { + size_t current = static_cast(input_dims[resolved_axis[idx]]); + // Overflow prevention. + if (current > (std::numeric_limits::max() / num_elements_in_axis)) { + return false; + } + num_elements_in_axis *= current; + } + + if (num_elements_in_axis > 0) { + const float scale = input_scale / output_scale; + if (compute_sum) { + // TODO(b/116341117): Eliminate float and do this completely in 8bit. + const float bias = -input_zero_point * scale * num_elements_in_axis; + for (size_t idx = 0; idx < num_outputs; ++idx) { + const U value = + static_cast(TfLiteRound(temp_sum[idx] * scale + bias)) + + output_zero_point; + output_data[idx] = static_cast(value); + } + } else { + const float bias = -input_zero_point * scale; + for (size_t idx = 0; idx < num_outputs; ++idx) { + float float_mean = static_cast(temp_sum[idx]) / + static_cast(num_elements_in_axis); + float result = TfLiteMin( + TfLiteRound(float_mean * scale + bias) + output_zero_point, + static_cast(std::numeric_limits::max())); + result = TfLiteMax(result, + static_cast(std::numeric_limits::min())); + output_data[idx] = static_cast(result); + } + } + } + return true; +} + +} // namespace reference_ops + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REDUCE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/requantize.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/requantize.h new file mode 100644 index 00000000..b73477d4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/requantize.h @@ -0,0 +1,68 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REQUANTIZE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REQUANTIZE_H_ + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void Requantize(const input_type *input_data, int32_t size, + int32_t effective_scale_multiplier, + int32_t effective_scale_shift, int32_t input_zeropoint, + int32_t output_zeropoint, output_type *output_data) +{ + ruy::profiler::ScopeLabel label("Requantize"); + const bool same_scale = + (effective_scale_multiplier == 1 << 30 && effective_scale_shift == 1); + if (same_scale) { + const bool mixed_type_int8_uint8 = + std::is_same::value && + std::is_same::value; + const bool mixed_type_uint8_int8 = + std::is_same::value && + std::is_same::value; + const int32_t zero_point_diff = input_zeropoint - output_zeropoint; + // Fast path to do requantization for the case when just a shift of 128 is + // needed. + if ((mixed_type_int8_uint8 && zero_point_diff == -128) || + (mixed_type_uint8_int8 && zero_point_diff == 128)) { + for (int i = 0; i < size; ++i) { + output_data[i] = input_data[i] ^ 0x80; + } + return; + } + } + static constexpr int32_t kMinOutput = std::numeric_limits::min(); + static constexpr int32_t kMaxOutput = std::numeric_limits::max(); + for (int i = 0; i < size; ++i) { + const int32_t input = input_data[i] - input_zeropoint; + const int32_t output = + MultiplyByQuantizedMultiplier(input, effective_scale_multiplier, + effective_scale_shift) + + output_zeropoint; + const int32_t clamped_output = + std::max(std::min(output, kMaxOutput), kMinOutput); + output_data[i] = static_cast(clamped_output); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REQUANTIZE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_bilinear.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_bilinear.h new file mode 100644 index 00000000..6e24b38f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_bilinear.h @@ -0,0 +1,231 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_BILINEAR_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_BILINEAR_H_ + +#include +#include +#include +#include + +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void ComputeInterpolationValues(const float value, const float scale, + const bool half_pixel_centers, + int32_t input_size, float *scaled_value, + int32_t *lower_bound, + int32_t *upper_bound) +{ + if (half_pixel_centers) { + *scaled_value = (value + 0.5f) * scale - 0.5f; + } else { + *scaled_value = value * scale; + } + float scaled_value_floor = std::floor(*scaled_value); + *lower_bound = std::max(static_cast(scaled_value_floor), + static_cast(0)); + *upper_bound = + std::min(static_cast(std::ceil(*scaled_value)), input_size - 1); +} + +template +inline void ResizeBilinear(const tflite::ResizeBilinearParams &op_params, + const RuntimeShape &unextended_input_shape, + const T *input_data, + const RuntimeShape &unextended_output_size_shape, + const int32_t *output_size_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + // If half_pixel_centers is True, align_corners must be False. + TFLITE_DCHECK(!op_params.half_pixel_centers || !op_params.align_corners); + TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_size_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_size_shape = + RuntimeShape::ExtendedShape(4, unextended_output_size_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + int32_t batches = MatchingDim(input_shape, 0, output_shape, 0); + int32_t input_height = input_shape.Dims(1); + int32_t input_width = input_shape.Dims(2); + int32_t depth = MatchingDim(input_shape, 3, output_shape, 3); + + TFLITE_DCHECK_EQ(output_size_shape.Dims(0), 1); + TFLITE_DCHECK_EQ(output_size_shape.Dims(1), 1); + TFLITE_DCHECK_EQ(output_size_shape.Dims(2), 1); + TFLITE_DCHECK_EQ(output_size_shape.Dims(3), 2); + int32_t output_height = + output_size_data[Offset(output_size_shape, 0, 0, 0, 0)]; + int32_t output_width = + output_size_data[Offset(output_size_shape, 0, 0, 0, 1)]; + + float height_scale = static_cast(input_height) / output_height; + float width_scale = static_cast(input_width) / output_width; + if (op_params.align_corners && output_height > 1) { + height_scale = static_cast(input_height - 1) / (output_height - 1); + } + if (op_params.align_corners && output_width > 1) { + width_scale = static_cast(input_width - 1) / (output_width - 1); + } + const float rounding_offset = std::numeric_limits::is_integer ? .5f : .0f; + + for (int b = 0; b < batches; ++b) { + for (int y = 0; y < output_height; ++y) { + float input_y; + int32_t y0, y1; + ComputeInterpolationValues(y, height_scale, op_params.half_pixel_centers, + input_height, &input_y, &y0, &y1); + for (int x = 0; x < output_width; ++x) { + float input_x; + int32_t x0, x1; + ComputeInterpolationValues(x, width_scale, op_params.half_pixel_centers, + input_width, &input_x, &x0, &x1); + for (int c = 0; c < depth; ++c) { + T interpolation = + static_cast(input_data[Offset(input_shape, b, y0, x0, c)] * + (1 - (input_y - y0)) * (1 - (input_x - x0)) + + input_data[Offset(input_shape, b, y1, x0, c)] * + (input_y - y0) * (1 - (input_x - x0)) + + input_data[Offset(input_shape, b, y0, x1, c)] * + (1 - (input_y - y0)) * (input_x - x0) + + input_data[Offset(input_shape, b, y1, x1, c)] * + (input_y - y0) * (input_x - x0) + + rounding_offset); + output_data[Offset(output_shape, b, y, x, c)] = interpolation; + } + } + } + } +} + +inline void ComputeInterpolationValuesInteger( + const int32_t value, const int32_t scale_10, const bool half_pixel_centers, + int32_t input_size, int32_t *scaled_value, int32_t *lower_bound, + int32_t *upper_bound) +{ + if (half_pixel_centers) { + *scaled_value = value * scale_10 + scale_10 / 2 - (1 << 9); + } else { + *scaled_value = value * scale_10; + } + constexpr int32_t zero = 0; + *lower_bound = std::max(*scaled_value / (1 << 10), zero); + *upper_bound = + std::min((*scaled_value + (1 << 10) - 1) / (1 << 10), input_size - 1); +} + +// Same as above but doesn't use any floating-point for the resize +template +inline void ResizeBilinearInteger( + const tflite::ResizeBilinearParams &op_params, + const RuntimeShape &unextended_input_shape, const T *input_data, + const RuntimeShape &unextended_output_size_shape, + const int32_t *output_size_data, + const RuntimeShape &unextended_output_shape, T *output_data) +{ + // If half_pixel_centers is True, align_corners must be False. + TFLITE_DCHECK(!op_params.half_pixel_centers || !op_params.align_corners); + TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_size_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_size_shape = + RuntimeShape::ExtendedShape(4, unextended_output_size_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + const int32_t batches = MatchingDim(input_shape, 0, output_shape, 0); + const int32_t input_height = input_shape.Dims(1); + const int32_t input_width = input_shape.Dims(2); + const int32_t depth = MatchingDim(input_shape, 3, output_shape, 3); + + TFLITE_DCHECK_EQ(output_size_shape.Dims(0), 1); + TFLITE_DCHECK_EQ(output_size_shape.Dims(1), 1); + TFLITE_DCHECK_EQ(output_size_shape.Dims(2), 1); + TFLITE_DCHECK_EQ(output_size_shape.Dims(3), 2); + const int32_t output_height = + output_size_data[Offset(output_size_shape, 0, 0, 0, 0)]; + const int32_t output_width = + output_size_data[Offset(output_size_shape, 0, 0, 0, 1)]; + + int32_t height_scale_10 = + ((1 << 10) * input_height + output_height / 2) / output_height; + int32_t width_scale_10 = + ((1 << 10) * input_width + output_width / 2) / output_width; + if (op_params.align_corners && output_height > 1) { + height_scale_10 = + ((1 << 10) * (input_height - 1) + (output_height - 1) / 2) / + (output_height - 1); + } + if (op_params.align_corners && output_width > 1) { + width_scale_10 = ((1 << 10) * (input_width - 1) + (output_width - 1) / 2) / + (output_width - 1); + } + + for (int b = 0; b < batches; ++b) { + for (int y = 0; y < output_height; ++y) { + int32_t input_y, y0, y1; + ComputeInterpolationValuesInteger(y, height_scale_10, + op_params.half_pixel_centers, + input_height, &input_y, &y0, &y1); + for (int x = 0; x < output_width; ++x) { + int32_t input_x, x0, x1; + ComputeInterpolationValuesInteger(x, width_scale_10, + op_params.half_pixel_centers, + input_width, &input_x, &x0, &x1); + for (int c = 0; c < depth; ++c) { + const int64_t output_20_ll = + static_cast( + input_data[Offset(input_shape, b, y0, x0, c)]) * + ((1 << 10) - (input_y - (1 << 10) * y0)) * + ((1 << 10) - (input_x - (1 << 10) * x0)); + const int64_t output_20_lu = + static_cast( + input_data[Offset(input_shape, b, y1, x0, c)]) * + (input_y - (1 << 10) * y0) * + ((1 << 10) - (input_x - (1 << 10) * x0)); + const int64_t output_20_rl = + static_cast( + input_data[Offset(input_shape, b, y0, x1, c)]) * + ((1 << 10) - (input_y - (1 << 10) * y0)) * + (input_x - (1 << 10) * x0); + const int64_t output_20_ru = + static_cast( + input_data[Offset(input_shape, b, y1, x1, c)]) * + (input_y - (1 << 10) * y0) * (input_x - (1 << 10) * x0); + const int64_t output_20 = + output_20_ll + output_20_lu + output_20_rl + output_20_ru; + const int64_t round = (output_20 > 0) ? (1 << 19) : -(1 << 19); + const T interpolation = + static_cast((output_20 + round) / (1 << 20)); + output_data[Offset(output_shape, b, y, x, c)] = interpolation; + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_BILINEAR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h new file mode 100644 index 00000000..1c308a3e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h @@ -0,0 +1,97 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_NEAREST_NEIGHBOR_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_NEAREST_NEIGHBOR_H_ + +#include + +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline int32_t GetNearestNeighbor(const int input_value, + const int32_t input_size, + const int32_t output_size, + const bool align_corners, + const bool half_pixel_centers) +{ + const float scale = + (align_corners && output_size > 1) ? (input_size - 1) / static_cast(output_size - 1) : input_size / static_cast(output_size); + const float offset = half_pixel_centers ? 0.5f : 0.0f; + int32_t output_value = std::min( + align_corners ? static_cast(TfLiteRound((input_value + offset) * scale)) : static_cast(std::floor((input_value + offset) * scale)), + input_size - 1); + if (half_pixel_centers) { + output_value = std::max(static_cast(0), output_value); + } + return output_value; +} + +template +inline void ResizeNearestNeighbor( + const tflite::ResizeNearestNeighborParams &op_params, + const RuntimeShape &unextended_input_shape, const T *input_data, + const RuntimeShape &output_size_shape, const int32_t *output_size_data, + const RuntimeShape &unextended_output_shape, T *output_data) +{ + TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + int32_t batches = MatchingDim(input_shape, 0, output_shape, 0); + int32_t input_height = input_shape.Dims(1); + int32_t input_width = input_shape.Dims(2); + int32_t depth = MatchingDim(input_shape, 3, output_shape, 3); + + // The Tensorflow version of this op allows resize on the width and height + // axis only. + TFLITE_DCHECK_EQ(output_size_shape.FlatSize(), 2); + int32_t output_height = output_size_data[0]; + int32_t output_width = output_size_data[1]; + + const int col_offset = input_shape.Dims(3); + const int row_offset = input_shape.Dims(2) * col_offset; + const int batch_offset = input_shape.Dims(1) * row_offset; + + const T *input_ptr = input_data; + T *output_ptr = output_data; + for (int b = 0; b < batches; ++b) { + for (int y = 0; y < output_height; ++y) { + int32_t in_y = GetNearestNeighbor(y, input_height, output_height, + op_params.align_corners, + op_params.half_pixel_centers); + const T *y_input_ptr = input_ptr + in_y * row_offset; + for (int x = 0; x < output_width; ++x) { + int32_t in_x = GetNearestNeighbor(x, input_width, output_width, + op_params.align_corners, + op_params.half_pixel_centers); + const T *x_input_ptr = y_input_ptr + in_x * col_offset; + memcpy(output_ptr, x_input_ptr, depth * sizeof(T)); + output_ptr += depth; + } + } + input_ptr += batch_offset; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_NEAREST_NEIGHBOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/round.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/round.h new file mode 100644 index 00000000..70b8cdba --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/round.h @@ -0,0 +1,51 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ROUND_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ROUND_H_ + +#include + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline float RoundToNearest(float value) +{ + auto floor_val = std::floor(value); + auto diff = value - floor_val; + if ((diff < 0.5f) || + ((diff == 0.5f) && (static_cast(floor_val) % 2 == 0))) { + return floor_val; + } else { + return floor_val = floor_val + 1.0f; + } +} + +inline void Round(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + // Note that this implementation matches that of tensorFlow tf.round + // and corresponds to the bankers rounding method. + // cfenv (for fesetround) is not yet supported universally on Android, so + // using a work around. + output_data[i] = RoundToNearest(input_data[i]); + } +} + +} // namespace reference_ops +} // namespace tflite +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ROUND_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/softmax.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/softmax.h new file mode 100644 index 00000000..bab27b0d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/softmax.h @@ -0,0 +1,235 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SOFTMAX_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SOFTMAX_H_ + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/op_macros.h" + +namespace tflite { +namespace reference_ops { +inline void Softmax(const SoftmaxParams ¶ms, + const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + + for (int i = 0; i < outer_size; ++i) { + // Find max element value which we'll use to ensure numerical stability + // taking advantage of the following equality: + // exp(x[i])/sum(exp(x[i])) == exp(x[i]+C)/sum(exp(x[i]+C)) + float max = std::numeric_limits::lowest(); + for (int c = 0; c < depth; ++c) { + max = std::max(max, input_data[i * depth + c]); + } + + // Compute sum. + float sum = 0.f; + for (int c = 0; c < depth; ++c) { + const float exp_c = std::exp((input_data[i * depth + c] - max) * + static_cast(params.beta)); + output_data[i * depth + c] = exp_c; + sum += exp_c; + } + + // Compute result. + for (int c = 0; c < depth; ++c) { + output_data[i * depth + c] = output_data[i * depth + c] / sum; + } + } +} + +// Quantized softmax with int8_t/uint8_t input and int8_t/uint8_t/int16_t +// output. +template +inline void Softmax(const SoftmaxParams ¶ms, + const RuntimeShape &input_shape, const InputT *input_data, + const RuntimeShape &output_shape, OutputT *output_data) +{ + const int32_t input_beta_multiplier = params.input_multiplier; + const int32_t input_beta_left_shift = params.input_left_shift; + const int diff_min = params.diff_min; + // The representation chosen for the input to the exp() function is Q5.26. + // We need to leave extra space since values that we skip might be as large as + // -32 before multiplying by input_beta_multiplier, and therefore as large as + // -16 afterwards. Note that exp(-8) is definitely not insignificant to + // accumulation, but exp(-16) definitely is. + static const int kScaledDiffIntegerBits = 5; + static const int kAccumulationIntegerBits = 12; + using FixedPointScaledDiff = + gemmlowp::FixedPoint; + using FixedPointAccum = + gemmlowp::FixedPoint; + using FixedPoint0 = gemmlowp::FixedPoint; + + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + + for (int i = 0; i < outer_size; ++i) { + InputT max_in_row = std::numeric_limits::min(); + for (int c = 0; c < depth; ++c) { + max_in_row = std::max(max_in_row, input_data[i * depth + c]); + } + + FixedPointAccum sum_of_exps = FixedPointAccum::Zero(); + for (int c = 0; c < depth; ++c) { + int32_t input_diff = + static_cast(input_data[i * depth + c]) - max_in_row; + if (input_diff >= diff_min) { + const int32_t input_diff_rescaled = + MultiplyByQuantizedMultiplierGreaterThanOne( + input_diff, input_beta_multiplier, input_beta_left_shift); + const FixedPointScaledDiff scaled_diff_f8 = + FixedPointScaledDiff::FromRaw(input_diff_rescaled); + sum_of_exps = sum_of_exps + gemmlowp::Rescale( + exp_on_negative_values(scaled_diff_f8)); + } + } + + int num_bits_over_unit; + FixedPoint0 shifted_scale = FixedPoint0::FromRaw(GetReciprocal( + sum_of_exps.raw(), kAccumulationIntegerBits, &num_bits_over_unit)); + + for (int c = 0; c < depth; ++c) { + int32_t input_diff = + static_cast(input_data[i * depth + c]) - max_in_row; + if (input_diff >= diff_min) { + const int32_t input_diff_rescaled = + MultiplyByQuantizedMultiplierGreaterThanOne( + input_diff, input_beta_multiplier, input_beta_left_shift); + const FixedPointScaledDiff scaled_diff_f8 = + FixedPointScaledDiff::FromRaw(input_diff_rescaled); + + FixedPoint0 exp_in_0 = exp_on_negative_values(scaled_diff_f8); + int32_t unsat_output = gemmlowp::RoundingDivideByPOT( + (shifted_scale * exp_in_0).raw(), + num_bits_over_unit + 31 - (sizeof(OutputT) * 8)); + + const int32_t shifted_output = + unsat_output + + static_cast(std::numeric_limits::min()); + + output_data[i * depth + c] = static_cast(std::max( + std::min(shifted_output, + static_cast(std::numeric_limits::max())), + static_cast(std::numeric_limits::min()))); + } else { + output_data[i * depth + c] = std::numeric_limits::min(); + } + } + } +} + +// Computes exp(input - max_input) +inline int16_t SoftMaxCalculateExp(const SoftmaxParams ¶ms, + const int16_t *input_data, const int depth, + int16_t max_in_row, int i, int c) +{ + int32_t input_diff = input_data[i * depth + c] - max_in_row; + // scale the input_diff such that [-65535, 0] correspond to [-10.0, 0.0] + // exp lut generated with range [-10, 0], as exp(-10) is negligible. + int32_t scaled_diff = MultiplyByQuantizedMultiplier( + input_diff, params.input_multiplier, params.input_left_shift); + // recenter to [-32768, 32767] + int32_t sym_scaled_diff = scaled_diff + 32767; + int16_t sat_sym_scaled_diff = + std::min(std::max(sym_scaled_diff, static_cast(-32768)), + static_cast(32767)); + // apply the exp() LUT activation function + return generic_int16_table_lookup(sat_sym_scaled_diff, params.exp_lut); +} +// Quantized softmax with int16_t input and int16_t output. +inline void SoftmaxInt16(const SoftmaxParams ¶ms, + const RuntimeShape &input_shape, + const int16_t *input_data, + const RuntimeShape &output_shape, + int16_t *output_data) +{ + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + + for (int i = 0; i < outer_size; ++i) { + // Find the largest element + int16_t max_in_row = std::numeric_limits::min(); + for (int c = 0; c < depth; ++c) { + max_in_row = std::max(max_in_row, input_data[i * depth + c]); + } + + // This loops computes the exp values and their sum. We will need the exp + // values later on in the function so we cache them in the output_data + // buffer. This is an optimization done to avoid calculating the exp values + // twice making use of the output_data buffer as scratch memory. + int32_t sum_of_exps = 0; // Q16.15 fixed point format. + int16_t *exp_results_Q015 = output_data + i * depth; + for (int c = 0; c < depth; ++c) { + exp_results_Q015[c] = + SoftMaxCalculateExp(params, input_data, depth, max_in_row, i, c); + sum_of_exps += exp_results_Q015[c]; + } + + // Compute the reciprocal 1/sum_of_exps + uint8_t headroom_plus_one = + CountLeadingZeros(static_cast(sum_of_exps)); + int32_t shifted_sum = + ((static_cast(sum_of_exps) << (headroom_plus_one - 1)) + + (1 << 13)) >> + 14; + // since the LUT computes 1/(1 + x) we need to first compute x = (sum - 1). + // also, the LUT expects a symmetrical input, so we must also recenter x + // from [0, 65535] to [-32768, 32767]. + int32_t sym_shifted_sum = shifted_sum + (-((1 << 15) + (1 << 16))); + int16_t sat_sym_shifted_sum = static_cast( + std::min(std::max(sym_shifted_sum, static_cast(-32768)), + static_cast(32767))); + // apply 1/(1 + x) LUT activation function + int16_t reciprocal_scale_Q015 = generic_int16_table_lookup( + sat_sym_shifted_sum, params.one_over_one_plus_x_lut); + + // Rescale the exp_result with reciprocal + // range of output is [0, 32767] correspond to [0.0, 1.0] + for (int c = 0; c < depth; ++c) { + uint8_t right_shift = 31 - headroom_plus_one; + int64_t round = 1 << (right_shift - 1); + int32_t result = (static_cast(exp_results_Q015[c]) * + static_cast(reciprocal_scale_Q015) + + round) >> + right_shift; + output_data[i * depth + c] = static_cast( + std::min(std::max(result, static_cast(0)), + static_cast(32767))); + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SOFTMAX_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_batch_nd.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_batch_nd.h new file mode 100644 index 00000000..48b6b0cb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_batch_nd.h @@ -0,0 +1,110 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SPACE_TO_BATCH_ND_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SPACE_TO_BATCH_ND_H_ + +#include + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +// TODO(b/135760455): Move this method anonymous namespace in a cc file. +inline RuntimeShape ExtendShapeSpaceToBatch(const RuntimeShape &shape) +{ + if (shape.DimensionsCount() == 4) { + return shape; + } + RuntimeShape new_shape(4, 1); + new_shape.SetDim(0, shape.Dims(0)); + new_shape.SetDim(1, shape.Dims(1)); + new_shape.SetDim(3, shape.Dims(2)); + return new_shape; +} + +template +inline void SpaceToBatchND(const SpaceToBatchParams ¶ms, + const RuntimeShape &unextended_input1_shape, + const T *input1_data, + const RuntimeShape &unextended_input2_shape, + const int32_t *block_shape_data, + const RuntimeShape &unextended_input3_shape, + const int32_t *paddings_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + ruy::profiler::ScopeLabel label("SpaceToBatchND"); + TFLITE_DCHECK_GE(unextended_input1_shape.DimensionsCount(), 3); + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(unextended_input1_shape.DimensionsCount(), + unextended_output_shape.DimensionsCount()); + + // Extends the input/output shape from 3D to 4D if needed, NHC -> NH1C. + const RuntimeShape input1_shape = + ExtendShapeSpaceToBatch(unextended_input1_shape); + const RuntimeShape output_shape = + ExtendShapeSpaceToBatch(unextended_output_shape); + + const int depth = input1_shape.Dims(3); + const int input_width = input1_shape.Dims(2); + const int input_height = input1_shape.Dims(1); + const int input_batch_size = input1_shape.Dims(0); + + const int output_width = output_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_batch_size = output_shape.Dims(0); + + const int block_shape_height = block_shape_data[0]; + const int block_shape_width = + unextended_input1_shape.DimensionsCount() == 4 ? block_shape_data[1] : 1; + const int padding_top = paddings_data[0]; + const int padding_left = + unextended_input1_shape.DimensionsCount() == 4 ? paddings_data[2] : 0; + + // For uint8 quantized, the correct padding "zero value" is the output offset. + const int32_t pad_value = params.output_offset; + for (int out_b = 0; out_b < output_batch_size; ++out_b) { + int input_batch = out_b % input_batch_size; + int shift_w = (out_b / input_batch_size) % block_shape_width; + int shift_h = (out_b / input_batch_size) / block_shape_width; + for (int out_h = 0; out_h < output_height; ++out_h) { + for (int out_w = 0; out_w < output_width; ++out_w) { + T *out = output_data + Offset(output_shape, out_b, out_h, out_w, 0); + if (out_h * block_shape_height + shift_h < padding_top || + out_h * block_shape_height + shift_h >= + padding_top + input_height || + out_w * block_shape_width + shift_w < padding_left || + out_w * block_shape_width + shift_w >= padding_left + input_width) { + // This may not execute correctly when pad_value != 0 and T != uint8. + memset(out, pad_value, depth * sizeof(T)); + } else { + const T *in = + input1_data + + Offset(input1_shape, input_batch, + (out_h * block_shape_height + shift_h) - padding_top, + (out_w * block_shape_width + shift_w) - padding_left, 0); + memcpy(out, in, depth * sizeof(T)); + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SPACE_TO_BATCH_ND_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_depth.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_depth.h new file mode 100644 index 00000000..cb48f3c8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/space_to_depth.h @@ -0,0 +1,78 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SPACE_TO_DEPTH_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SPACE_TO_DEPTH_H_ + +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void SpaceToDepth(const tflite::SpaceToDepthParams &op_params, + const RuntimeShape &unextended_input_shape, + const T *input_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(4, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + const int input_depth = input_shape.Dims(3); + const int input_width = input_shape.Dims(2); + const int input_height = input_shape.Dims(1); + const int input_batch = input_shape.Dims(0); + + const int output_depth = output_shape.Dims(3); + const int output_width = output_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_batch = output_shape.Dims(0); + + const int32_t block_size = op_params.block_size; + + TFLITE_DCHECK_EQ(input_width, output_width * block_size); + TFLITE_DCHECK_EQ(input_height, output_height * block_size); + TFLITE_DCHECK_EQ(input_depth * block_size * block_size, output_depth); + TFLITE_DCHECK_EQ(input_batch, output_batch); + + for (int in_b = 0; in_b < input_batch; ++in_b) { + for (int in_h = 0; in_h < input_height; ++in_h) { + for (int in_w = 0; in_w < input_width; ++in_w) { + for (int in_d = 0; in_d < input_depth; ++in_d) { + const int out_d = + in_d + ((in_h % block_size) * block_size + in_w % block_size) * + input_depth; + const int out_w = in_w / block_size; + const int out_h = in_h / block_size; + const int out_b = in_b; + + const int input_index = Offset(input_shape, in_b, in_h, in_w, in_d); + const int output_index = + Offset(output_shape, out_b, out_h, out_w, out_d); + + output_data[output_index] = input_data[input_index]; + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SPACE_TO_DEPTH_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/strided_slice.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/strided_slice.h new file mode 100644 index 00000000..165fa2b7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/strided_slice.h @@ -0,0 +1,122 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_STRIDED_SLICE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_STRIDED_SLICE_H_ + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/portable_tensor.h" +#include "tensorflow/lite/kernels/internal/strided_slice_logic.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +inline void StridedSlice(const tflite::StridedSliceParams &op_params, + const RuntimeShape &unextended_input_shape, + const RuntimeShape &unextended_output_shape, + SequentialTensorWriter *writer) +{ + using strided_slice::LoopCondition; + using strided_slice::StartForAxis; + using strided_slice::StopForAxis; + + ruy::profiler::ScopeLabel label("StridedSlice"); + + // Note that the output_shape is not used herein. + tflite::StridedSliceParams params_copy = op_params; + + TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 5); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 5); + const RuntimeShape input_shape = + RuntimeShape::ExtendedShape(5, unextended_input_shape); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(5, unextended_output_shape); + + // Reverse and pad to 5 dimensions because that is what the runtime code + // requires (ie. all shapes must be 5D and are given backwards). + strided_slice::StridedSlicePadIndices(¶ms_copy, 5); + + const int start_0 = StartForAxis(params_copy, input_shape, 0); + const int stop_0 = StopForAxis(params_copy, input_shape, 0, start_0); + const int start_1 = StartForAxis(params_copy, input_shape, 1); + const int stop_1 = StopForAxis(params_copy, input_shape, 1, start_1); + const int start_2 = StartForAxis(params_copy, input_shape, 2); + const int stop_2 = StopForAxis(params_copy, input_shape, 2, start_2); + const int start_3 = StartForAxis(params_copy, input_shape, 3); + const int stop_3 = StopForAxis(params_copy, input_shape, 3, start_3); + const int start_4 = StartForAxis(params_copy, input_shape, 4); + const int stop_4 = StopForAxis(params_copy, input_shape, 4, start_4); + + for (int offset_0 = start_0 * input_shape.Dims(1), + end_0 = stop_0 * input_shape.Dims(1), + step_0 = params_copy.strides[0] * input_shape.Dims(1); + !LoopCondition(offset_0, end_0, params_copy.strides[0]); + offset_0 += step_0) { + for (int offset_1 = (offset_0 + start_1) * input_shape.Dims(2), + end_1 = (offset_0 + stop_1) * input_shape.Dims(2), + step_1 = params_copy.strides[1] * input_shape.Dims(2); + !LoopCondition(offset_1, end_1, params_copy.strides[1]); + offset_1 += step_1) { + for (int offset_2 = (offset_1 + start_2) * input_shape.Dims(3), + end_2 = (offset_1 + stop_2) * input_shape.Dims(3), + step_2 = params_copy.strides[2] * input_shape.Dims(3); + !LoopCondition(offset_2, end_2, params_copy.strides[2]); + offset_2 += step_2) { + for (int offset_3 = (offset_2 + start_3) * input_shape.Dims(4), + end_3 = (offset_2 + stop_3) * input_shape.Dims(4), + step_3 = params_copy.strides[3] * input_shape.Dims(4); + !LoopCondition(offset_3, end_3, params_copy.strides[3]); + offset_3 += step_3) { + for (int offset_4 = offset_3 + start_4, end_4 = offset_3 + stop_4; + !LoopCondition(offset_4, end_4, params_copy.strides[4]); + offset_4 += params_copy.strides[4]) { + writer->Write(offset_4); + } + } + } + } + } +} + +template +inline void StridedSlice(const tflite::StridedSliceParams &op_params, + const RuntimeShape &unextended_input_shape, + const T *input_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + SequentialTensorWriter writer(input_data, output_data); + StridedSlice(op_params, unextended_input_shape, unextended_output_shape, + &writer); +} + +template +inline void StridedSlice(const tflite::StridedSliceParams &op_params, + const RuntimeShape &unextended_input_shape, + const TfLiteTensor *input, + const RuntimeShape &unextended_output_shape, + TfLiteTensor *output) +{ + SequentialTensorWriter writer(input, output); + StridedSlice(op_params, unextended_input_shape, unextended_output_shape, + &writer); +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_STRIDED_SLICE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/sub.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/sub.h new file mode 100644 index 00000000..b8326416 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/sub.h @@ -0,0 +1,572 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SUB_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SUB_H_ + +#include + +#include +#include + +#include "ruy/profiler/instrumentation.h" // from @ruy +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void SubNonBroadcast(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const float *input1_data, + const RuntimeShape &input2_shape, + const float *input2_data, + const RuntimeShape &output_shape, + float *output_data) +{ + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = ActivationFunctionWithMinMax( + input1_data[i] - input2_data[i], params.float_activation_min, + params.float_activation_max); + } +} + +inline void SubNonBroadcast(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int32_t *input1_data, + const RuntimeShape &input2_shape, + const int32_t *input2_data, + const RuntimeShape &output_shape, + int32_t *output_data) +{ + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + output_data[i] = ActivationFunctionWithMinMax( + input1_data[i] - input2_data[i], params.quantized_activation_min, + params.quantized_activation_max); + } +} + +// TODO(b/151345304): We can implement BroadcastSub on buffers of arbitrary +// dimensionality if the runtime code does a single loop over one dimension +// that handles broadcasting as the base case. The code generator would then +// generate max(D1, D2) nested for loops. +template +inline void BroadcastSubSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const float *input1_data, + const RuntimeShape &input2_shape, + const float *input2_data, + const RuntimeShape &output_shape, + float *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSubSlow/float"); + TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + output_data[SubscriptToIndex(output_desc, indexes)] = + ActivationFunctionWithMinMax( + input1_data[SubscriptToIndex(desc1, indexes)] - + input2_data[SubscriptToIndex(desc2, indexes)], + params.float_activation_min, params.float_activation_max); + }; + NDOpsHelper(output_desc, sub_func); +} + +template +inline void BroadcastSubSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const uint8_t *input1_data, + const RuntimeShape &input2_shape, + const uint8_t *input2_data, + const RuntimeShape &output_shape, + uint8_t *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSubSlow/uint8_t"); + TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + const int32_t input1_val = + params.input1_offset + input1_data[SubscriptToIndex(desc1, indexes)]; + const int32_t input2_val = + params.input2_offset + input2_data[SubscriptToIndex(desc2, indexes)]; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sub = scaled_input1_val - scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sub, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[SubscriptToIndex(output_desc, indexes)] = + static_cast(clamped_output); + }; + NDOpsHelper(output_desc, sub_func); +} + +template +inline void BroadcastSubSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int32_t *input1_data, + const RuntimeShape &input2_shape, + const int32_t *input2_data, + const RuntimeShape &output_shape, + int32_t *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSubSlow/int32_t"); + TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + output_data[SubscriptToIndex(output_desc, indexes)] = + ActivationFunctionWithMinMax( + input1_data[SubscriptToIndex(desc1, indexes)] - + input2_data[SubscriptToIndex(desc2, indexes)], + params.quantized_activation_min, params.quantized_activation_max); + }; + NDOpsHelper(output_desc, sub_func); +} + +template +inline void BroadcastSubSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int8_t *input1_data, + const RuntimeShape &input2_shape, + const int8_t *input2_data, + const RuntimeShape &output_shape, + int8_t *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSubSlow/int8_t"); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + const int32_t input1_val = + params.input1_offset + input1_data[SubscriptToIndex(desc1, indexes)]; + const int32_t input2_val = + params.input2_offset + input2_data[SubscriptToIndex(desc2, indexes)]; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sub = scaled_input1_val - scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sub, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[SubscriptToIndex(output_desc, indexes)] = + static_cast(clamped_output); + }; + NDOpsHelper(output_desc, sub_func); +} + +template +void BroadcastSubSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int64_t *input1_data, + const RuntimeShape &input2_shape, + const int64_t *input2_data, + const RuntimeShape &output_shape, int64_t *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSubSlow/int64_t"); + TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + output_data[SubscriptToIndex(output_desc, indexes)] = + ActivationFunctionWithMinMax( + input1_data[SubscriptToIndex(desc1, indexes)] - + input2_data[SubscriptToIndex(desc2, indexes)], + params.int64_activation_min, params.int64_activation_max); + }; + NDOpsHelper(output_desc, sub_func); +} + +template +void BroadcastSubSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const T *input1_data, + const RuntimeShape &input2_shape, const T *input2_data, + const RuntimeShape &output_shape, T *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSubSlow/templated"); + TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); + TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + output_data[SubscriptToIndex(output_desc, indexes)] = + ActivationFunctionWithMinMax( + input1_data[SubscriptToIndex(desc1, indexes)] - + input2_data[SubscriptToIndex(desc2, indexes)], + params.quantized_activation_min, params.quantized_activation_max); + }; + NDOpsHelper(output_desc, sub_func); +} + +template +inline void BroadcastSub16POTSlow(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, + const int16_t *input1_data, + const RuntimeShape &input2_shape, + const int16_t *input2_data, + const RuntimeShape &output_shape, + int16_t *output_data) +{ + ruy::profiler::ScopeLabel label("BroadcastSub16POTSlow/int16_t"); + NdArrayDesc desc1; + NdArrayDesc desc2; + NdArrayDesc output_desc; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + auto sub_func = [&](int indexes[N]) { + const int32_t input1_val = input1_data[SubscriptToIndex(desc1, indexes)]; + const int32_t input2_val = input2_data[SubscriptToIndex(desc2, indexes)]; + const int32_t scaled_input1_val = + gemmlowp::RoundingDivideByPOT(input1_val, -params.input1_shift); + const int32_t scaled_input2_val = + gemmlowp::RoundingDivideByPOT(input2_val, -params.input2_shift); + const int32_t raw_output = scaled_input1_val - scaled_input2_val; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[SubscriptToIndex(output_desc, indexes)] = + static_cast(clamped_output); + }; + NDOpsHelper(output_desc, sub_func); +} + +// Element-wise Sub that can often be used for inner loop of broadcast sub as +// well as the non-broadcast sub. +inline void SubElementwise(int size, const ArithmeticParams ¶ms, + const uint8_t *input1_data, + const uint8_t *input2_data, uint8_t *output_data) +{ + TFLITE_DCHECK_GT(params.input1_offset, -256); + TFLITE_DCHECK_GT(params.input2_offset, -256); + TFLITE_DCHECK_LT(params.input1_offset, 256); + TFLITE_DCHECK_LT(params.input2_offset, 256); + + for (int i = 0; i < size; ++i) { + const int32_t input1_val = params.input1_offset + input1_data[i]; + const int32_t input2_val = params.input2_offset + input2_data[i]; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sub = scaled_input1_val - scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sub, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[i] = static_cast(clamped_output); + } +} + +// Element-wise add that can often be used for inner loop of broadcast add as +// well as the non-broadcast add. +inline void SubElementwise(int size, const ArithmeticParams ¶ms, + const int8_t *input1_data, const int8_t *input2_data, + int8_t *output_data) +{ + const int32_t int8_max_value = std::numeric_limits::max(); + TFLITE_DCHECK_GE(params.input1_offset, -1 * int8_max_value); + TFLITE_DCHECK_GE(params.input2_offset, -1 * int8_max_value); + TFLITE_DCHECK_LE(params.input1_offset, int8_max_value); + TFLITE_DCHECK_LE(params.input2_offset, int8_max_value); + + for (int i = 0; i < size; ++i) { + const int32_t input1_val = params.input1_offset + input1_data[i]; + const int32_t input2_val = params.input2_offset + input2_data[i]; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sub = scaled_input1_val - scaled_input2_val; + const int32_t raw_output = + MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sub, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = + std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + output_data[i] = static_cast(clamped_output); + } +} + +inline void Sub(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const uint8_t *input1_data, + const RuntimeShape &input2_shape, const uint8_t *input2_data, + const RuntimeShape &output_shape, uint8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + TFLITE_DCHECK_GT(params.input1_offset, -256); + TFLITE_DCHECK_GT(params.input2_offset, -256); + TFLITE_DCHECK_LT(params.input1_offset, 256); + TFLITE_DCHECK_LT(params.input2_offset, 256); + SubElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +inline void Sub(const ArithmeticParams ¶ms, + const RuntimeShape &input1_shape, const int8_t *input1_data, + const RuntimeShape &input2_shape, const int8_t *input2_data, + const RuntimeShape &output_shape, int8_t *output_data) +{ + TFLITE_DCHECK_LE(params.quantized_activation_min, + params.quantized_activation_max); + + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + + const int32_t int8_max_value = std::numeric_limits::max(); + TFLITE_DCHECK_GE(params.input1_offset, -1 * int8_max_value); + TFLITE_DCHECK_GE(params.input2_offset, -1 * int8_max_value); + TFLITE_DCHECK_LE(params.input1_offset, int8_max_value); + TFLITE_DCHECK_LE(params.input2_offset, int8_max_value); + SubElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +template +void Sub(const ArithmeticParams ¶ms, const RuntimeShape &input1_shape, + const T *input1_data, const RuntimeShape &input2_shape, + const T *input2_data, const RuntimeShape &output_shape, + T *output_data) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, + &desc2); + const RuntimeShape extended_output_shape = + RuntimeShape::ExtendedShape(4, output_shape); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) { + output_data[Offset(extended_output_shape, b, y, x, c)] = + input1_data[SubscriptToIndex(desc1, b, y, x, c)] - + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; + } + } + } + } +} + +inline void SetActivationMinMax(const ArithmeticParams ¶ms, + int32_t *activation_min, + int32_t *activation_max) +{ + *activation_min = params.quantized_activation_min; + *activation_max = params.quantized_activation_max; +} + +inline void SetActivationMinMax(const ArithmeticParams ¶ms, + float *activation_min, float *activation_max) +{ + *activation_min = params.float_activation_min; + *activation_max = params.float_activation_max; +} + +inline void SetActivationMinMax(const ArithmeticParams ¶ms, + int64_t *activation_min, + int64_t *activation_max) +{ + *activation_min = params.int64_activation_min; + *activation_max = params.int64_activation_max; +} + +template +inline void SubWithActivation( + const ArithmeticParams ¶ms, const RuntimeShape &input1_shape, + const T *input1_data, const RuntimeShape &input2_shape, + const T *input2_data, const RuntimeShape &output_shape, T *output_data) +{ + ruy::profiler::ScopeLabel label("SubWithActivation"); + const int flat_size = + MatchingElementsSize(input1_shape, input2_shape, output_shape); + T activation_min, activation_max; + SetActivationMinMax(params, &activation_min, &activation_max); + + for (int i = 0; i < flat_size; ++i) { + output_data[i] = ActivationFunctionWithMinMax( + input1_data[i] - input2_data[i], activation_min, activation_max); + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SUB_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/tanh.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/tanh.h new file mode 100644 index 00000000..bfdd9125 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/tanh.h @@ -0,0 +1,132 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TANH_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TANH_H_ + +#include + +#include "fixedpoint/fixedpoint.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/op_macros.h" + +namespace tflite { +namespace reference_ops { +inline void Tanh(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + float val = input_data[i]; + float result = std::tanh(val); + output_data[i] = result; + } +} + +// Convenience version that allows, for example, generated-code calls to be +// uniform between data types. +inline void Tanh(const TanhParams &, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &output_shape, + float *output_data) +{ + // Drop params: not needed. + Tanh(input_shape, input_data, output_shape, output_data); +} + +inline void Tanh(const TanhParams ¶ms, const RuntimeShape &input_shape, + const int16_t *input_data, const RuntimeShape &output_shape, + int16_t *output_data) +{ + const int input_left_shift = params.input_left_shift; + // Support for shifts is limited until we have a parameterized version of + // SaturatingRoundingMultiplyByPOT(). + TFLITE_DCHECK_GE(input_left_shift, 0); + TFLITE_DCHECK_LE(input_left_shift, 1); + + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + // F0 uses 0 integer bits, range [-1, 1]. + // This is the return type of math functions such as tanh, logistic, + // whose range is in [-1, 1]. + using F0 = gemmlowp::FixedPoint; + // F3 uses 3 integer bits, range [-8, 8], the input range expected here. + using F3 = gemmlowp::FixedPoint; + + if (input_left_shift == 0) { + for (int i = 0; i < flat_size; i++) { + F3 input = F3::FromRaw(input_data[i]); + F0 output = gemmlowp::tanh(input); + output_data[i] = output.raw(); + } + } else { + for (int i = 0; i < flat_size; i++) { + F3 input = F3::FromRaw( + gemmlowp::SaturatingRoundingMultiplyByPOT<1>(input_data[i])); + F0 output = gemmlowp::tanh(input); + output_data[i] = output.raw(); + } + } +} + +inline void Tanh(const TanhParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &output_shape, + uint8_t *output_data) +{ + const int32_t input_zero_point = params.input_zero_point; + const int32_t input_range_radius = params.input_range_radius; + const int32_t input_multiplier = params.input_multiplier; + const int input_left_shift = params.input_left_shift; + const int32_t output_zero_point = 128; + const int flat_size = MatchingFlatSize(input_shape, output_shape); + + for (int i = 0; i < flat_size; i++) { + const uint8_t input_val_u8 = input_data[i]; + const int32_t input_val_centered = + static_cast(input_val_u8) - input_zero_point; + uint8_t output_val; + if (input_val_centered <= -input_range_radius) { + output_val = 0; + } else if (input_val_centered >= input_range_radius) { + output_val = 255; + } else { + const int32_t input_val_rescaled = + MultiplyByQuantizedMultiplierGreaterThanOne( + input_val_centered, input_multiplier, input_left_shift); + using FixedPoint4 = gemmlowp::FixedPoint; + using FixedPoint0 = gemmlowp::FixedPoint; + const FixedPoint4 input_val_f4 = FixedPoint4::FromRaw(input_val_rescaled); + const FixedPoint0 output_val_f0 = gemmlowp::tanh(input_val_f4); + // Convert from Q0.31 to Q24.7. + using gemmlowp::RoundingDivideByPOT; + int32_t output_val_s32 = RoundingDivideByPOT(output_val_f0.raw(), 24); + output_val_s32 += output_zero_point; + if (output_val_s32 == 256) { + output_val_s32 = 255; + } + // Reinterpret as Q0.7, encoded in uint8_t. + TFLITE_DCHECK_GE(output_val_s32, 0); + TFLITE_DCHECK_LE(output_val_s32, 255); + output_val = static_cast(output_val_s32); + } + output_data[i] = output_val; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TANH_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose.h new file mode 100644 index 00000000..c04abf69 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose.h @@ -0,0 +1,109 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TRANSPOSE_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TRANSPOSE_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +template +void TransposeImpl(const TransposeParams ¶ms, + const RuntimeShape &unextended_input_shape, + const T *input_data, + const RuntimeShape &unextended_output_shape, + T *output_data) +{ + const int unextended_input_size = unextended_input_shape.DimensionsCount(); + const int unextended_output_size = unextended_output_shape.DimensionsCount(); + TFLITE_DCHECK_LE(unextended_input_size, N); + TFLITE_DCHECK_LE(unextended_output_size, N); + TFLITE_DCHECK_EQ(unextended_output_size, params.perm_count); + const int input_ext_size = N - unextended_input_size; + const int output_ext_size = N - unextended_output_size; + NdArrayDesc input_desc; + NdArrayDesc output_desc; + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, unextended_input_shape), + &input_desc); + CopyDimsToDesc(RuntimeShape::ExtendedShape(N, unextended_output_shape), + &output_desc); + + // The perm data is extended to match the output, each index incremented by + // the amount of front padding of the input shape. + int extended_perm[N]; + for (int i = 0; i < N; ++i) { + extended_perm[i] = i < output_ext_size ? i : params.perm[i - output_ext_size] + input_ext_size; + } + + // Permutes the input shape so we don't need to permute the indexes inside + // the loop. Check to make sure output_dims is matching input_dims. + NdArrayDesc perm_input_desc; + for (int k = 0; k < N; ++k) { + TFLITE_DCHECK_EQ(input_desc.extents[extended_perm[k]], + output_desc.extents[k]); + perm_input_desc.extents[k] = input_desc.extents[extended_perm[k]]; + perm_input_desc.strides[k] = input_desc.strides[extended_perm[k]]; + } + + // Naive transpose loop (iterate on output index and compute input index). + auto tranpose_func = [&](int indexes[N]) { + output_data[SubscriptToIndex(output_desc, indexes)] = + input_data[SubscriptToIndex(perm_input_desc, indexes)]; + }; + NDOpsHelper(output_desc, tranpose_func); +} + +template +void Transpose(const TransposeParams ¶ms, + const RuntimeShape &unextended_input_shape, const T *input_data, + const RuntimeShape &unextended_output_shape, T *output_data) +{ + // Transpose kernel only does rearranging values not numeric evaluations on + // each cell. It's safe to implement per size of scalar type and this trick + // keeps the total code size in a reasonable range. + switch (sizeof(T)) { + case 1: + TransposeImpl(params, unextended_input_shape, + reinterpret_cast(input_data), + unextended_output_shape, + reinterpret_cast(output_data)); + break; + case 2: + TransposeImpl(params, unextended_input_shape, + reinterpret_cast(input_data), + unextended_output_shape, + reinterpret_cast(output_data)); + break; + + case 4: + TransposeImpl(params, unextended_input_shape, + reinterpret_cast(input_data), + unextended_output_shape, + reinterpret_cast(output_data)); + break; + case 8: + TransposeImpl(params, unextended_input_shape, + reinterpret_cast(input_data), + unextended_output_shape, + reinterpret_cast(output_data)); + break; + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TRANSPOSE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose_conv.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose_conv.h new file mode 100644 index 00000000..76cac4cc --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/reference/transpose_conv.h @@ -0,0 +1,217 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TRANSPOSE_CONV_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TRANSPOSE_CONV_H_ + +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace reference_ops { +inline void TransposeConv( + const ConvParams ¶ms, const RuntimeShape &input_shape, + const float *input_data, const RuntimeShape &filter_shape, + const float *filter_data, const RuntimeShape &bias_shape, + const float *bias_data, const RuntimeShape &output_shape, + float *output_data, const RuntimeShape &im2col_shape, float *im2col_data) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + + // Although transpose convolution simplifies to convolution with transposed + // weights for strides of 1, non-unitary striding complicates matters. To + // keep this reference implementation as clear as possible, we use a + // "scatter" access pattern, where we loop through all the input elements, + // computing their influence on the output, rather than looping through the + // output elements in the typical "gather" access pattern of a conv. We + // therefore must initialize the output array to zero. + const int num_elements = output_shape.FlatSize(); + for (int i = 0; i < num_elements; i++) { + output_data[i] = 0.0f; + } + + // Loop through input elements one at a time. + for (int batch = 0; batch < batches; ++batch) { + for (int in_y = 0; in_y < input_height; ++in_y) { + for (int in_x = 0; in_x < input_width; ++in_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + // Loop through the output elements it will influence + const int out_x_origin = (in_x * stride_width) - pad_width; + const int out_y_origin = (in_y * stride_height) - pad_height; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + for (int out_channel = 0; out_channel < output_depth; + ++out_channel) { + // Compute output element location + const int out_x = out_x_origin + filter_x; + const int out_y = out_y_origin + filter_y; + // We cannot accumulate out of bounds + if ((out_x >= 0) && (out_x < output_width) && (out_y >= 0) && + (out_y < output_height)) { + float input_value = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + float filter_value = + filter_data[Offset(filter_shape, out_channel, filter_y, + filter_x, in_channel)]; + output_data[Offset(output_shape, batch, out_y, out_x, + out_channel)] += + input_value * filter_value; + } + } + } + } + } + } + } + } + if (bias_data) { + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + output_data[Offset(output_shape, batch, out_y, out_x, + out_channel)] += bias_data[out_channel]; + } + } + } + } + } +} + +inline void TransposeConv( + const ConvParams ¶ms, const RuntimeShape &input_shape, + const uint8_t *input_data, const RuntimeShape &filter_shape, + const uint8_t *filter_data, const RuntimeShape &bias_shape, + const int32_t *bias_data, const RuntimeShape &output_shape, + uint8_t *output_data, const RuntimeShape &im2col_shape, + uint8_t *im2col_data, int32_t *scratch_buffer) +{ + const int stride_width = params.stride_width; + const int stride_height = params.stride_height; + const int pad_width = params.padding_values.width; + const int pad_height = params.padding_values.height; + TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); + TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); + (void)im2col_data; // only used in optimized code. + (void)im2col_shape; // only used in optimized code. + + const int batches = MatchingDim(input_shape, 0, output_shape, 0); + const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); + const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); + const int input_height = input_shape.Dims(1); + const int input_width = input_shape.Dims(2); + const int filter_height = filter_shape.Dims(1); + const int filter_width = filter_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_width = output_shape.Dims(2); + const int32_t input_offset = params.input_offset; + const int32_t filter_offset = params.weights_offset; + const int32_t output_offset = params.output_offset; + const int32_t output_multiplier = params.output_multiplier; + const int output_shift = params.output_shift; + const int32_t output_activation_min = params.quantized_activation_min; + const int32_t output_activation_max = params.quantized_activation_max; + TFLITE_DCHECK_LE(output_activation_min, output_activation_max); + if (bias_data) { + TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); + } + + const int num_elements = output_shape.FlatSize(); + // We need to initialize scratch_buffer to all 0s, as we apply the same + // 'scatter' based trick as in float version. + memset(scratch_buffer, 0, num_elements * sizeof(int32_t)); + + // Loop through input elements one at a time. + for (int batch = 0; batch < batches; ++batch) { + for (int in_y = 0; in_y < input_height; ++in_y) { + for (int in_x = 0; in_x < input_width; ++in_x) { + for (int in_channel = 0; in_channel < input_depth; ++in_channel) { + // Loop through the output elements it will influence. + const int out_x_origin = (in_x * stride_width) - pad_width; + const int out_y_origin = (in_y * stride_height) - pad_height; + for (int filter_y = 0; filter_y < filter_height; ++filter_y) { + for (int filter_x = 0; filter_x < filter_width; ++filter_x) { + for (int out_channel = 0; out_channel < output_depth; + ++out_channel) { + // Compute output element location. + const int out_x = out_x_origin + filter_x; + const int out_y = out_y_origin + filter_y; + // We cannot accumulate out of bounds. + if ((out_x >= 0) && (out_x < output_width) && (out_y >= 0) && + (out_y < output_height)) { + uint8_t input_value = input_data[Offset( + input_shape, batch, in_y, in_x, in_channel)]; + uint8_t filter_value = + filter_data[Offset(filter_shape, out_channel, filter_y, + filter_x, in_channel)]; + scratch_buffer[Offset(output_shape, batch, out_y, out_x, + out_channel)] += + (input_value + input_offset) * + (filter_value + filter_offset); + } + } + } + } + } + } + } + } + for (int batch = 0; batch < batches; ++batch) { + for (int out_y = 0; out_y < output_height; ++out_y) { + for (int out_x = 0; out_x < output_width; ++out_x) { + for (int out_channel = 0; out_channel < output_depth; ++out_channel) { + int32_t acc = scratch_buffer[Offset(output_shape, batch, out_y, out_x, + out_channel)]; + if (bias_data) { + acc += bias_data[out_channel]; + } + int32_t scaled_acc = MultiplyByQuantizedMultiplier( + acc, output_multiplier, output_shift); + scaled_acc += output_offset; + scaled_acc = std::max(scaled_acc, output_activation_min); + scaled_acc = std::min(scaled_acc, output_activation_max); + output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = + static_cast(scaled_acc); + } + } + } + } +} + +} // namespace reference_ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TRANSPOSE_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/strided_slice_logic.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/strided_slice_logic.h new file mode 100644 index 00000000..c72bcdb3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/strided_slice_logic.h @@ -0,0 +1,218 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_STRIDED_SLICE_LOGIC_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_STRIDED_SLICE_LOGIC_H_ + +#include +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace strided_slice { +// Use until std::clamp() is available from C++17. +inline int Clamp(const int v, const int lo, const int hi) +{ + TFLITE_DCHECK(!(hi < lo)); + if (hi < v) + return hi; + if (v < lo) + return lo; + return v; +} + +inline void StridedSlicePadIndices(tflite::StridedSliceParams *p, + int dim_count) +{ + // Add indices and mask bits to fully include extra dimensions + TFLITE_CHECK_LE(dim_count, 5); + TFLITE_CHECK_GE(dim_count, p->start_indices_count); + TFLITE_CHECK_EQ(p->start_indices_count, p->stop_indices_count); + TFLITE_CHECK_EQ(p->stop_indices_count, p->strides_count); + + const int pad_count = dim_count - p->start_indices_count; + + // Pad indices at start, so move arrays by pad_count. + for (int i = p->start_indices_count - 1; i >= 0; --i) { + p->strides[i + pad_count] = p->strides[i]; + p->start_indices[i + pad_count] = p->start_indices[i]; + p->stop_indices[i + pad_count] = p->stop_indices[i]; + } + for (int i = 0; i < pad_count; ++i) { + p->start_indices[i] = 0; + p->stop_indices[i] = 1; + p->strides[i] = 1; + } + + // Pad masks with 0s or 1s as required. + p->shrink_axis_mask <<= pad_count; + p->ellipsis_mask <<= pad_count; + p->new_axis_mask <<= pad_count; + p->begin_mask <<= pad_count; + p->end_mask <<= pad_count; + p->begin_mask |= (1 << pad_count) - 1; + p->end_mask |= (1 << pad_count) - 1; + + p->start_indices_count = dim_count; + p->stop_indices_count = dim_count; + p->strides_count = dim_count; +} + +// Return the index for the first element along that axis. This index will be a +// positive integer between [0, axis_size] (or [-1, axis_size -1] if stride < 0) +// that can be used to index directly into the data. +inline int StartForAxis(const tflite::StridedSliceParams ¶ms, + const RuntimeShape &input_shape, int axis) +{ + const auto begin_mask = params.begin_mask; + const auto *start_indices = params.start_indices; + const auto *strides = params.strides; + const int axis_size = input_shape.Dims(axis); + if (axis_size == 0) { + return 0; + } + // Begin with the specified index. + int start = start_indices[axis]; + + // begin_mask override + if (begin_mask & 1 << axis) { + if (strides[axis] > 0) { + // Forward iteration - use the first element. These values will get + // clamped below (Note: We could have set them to 0 and axis_size-1, but + // use lowest() and max() to maintain symmetry with StopForAxis()) + start = std::numeric_limits::lowest(); + } else { + // Backward iteration - use the last element. + start = std::numeric_limits::max(); + } + } + + // Handle negative indices + if (start < 0) { + start += axis_size; + } + + // Clamping + if (strides[axis] > 0) { + // Forward iteration + start = Clamp(start, 0, axis_size); + } else { + // Backward iteration + start = Clamp(start, -1, axis_size - 1); + } + + return start; +} + +// Return the "real" index for the end of iteration along that axis. This is an +// "end" in the traditional C sense, in that it points to one past the last +// element. ie. So if you were iterating through all elements of a 1D array of +// size 4, this function would return 4 as the stop, because it is one past the +// "real" indices of 0, 1, 2 & 3. +inline int StopForAxis(const tflite::StridedSliceParams ¶ms, + const RuntimeShape &input_shape, int axis, + int start_for_axis) +{ + const auto end_mask = params.end_mask; + const auto shrink_axis_mask = params.shrink_axis_mask; + const auto *stop_indices = params.stop_indices; + const auto *strides = params.strides; + const int axis_size = input_shape.Dims(axis); + if (axis_size == 0) { + return 0; + } + + // Begin with the specified index + const bool shrink_axis = shrink_axis_mask & (1 << axis); + int stop = stop_indices[axis]; + + // When shrinking an axis, the end position does not matter (and can be + // incorrect when negative indexing is used, see Issue #19260). Always use + // start_for_axis + 1 to generate a length 1 slice, since start_for_axis has + // already been adjusted for negative indices. + if (shrink_axis) { + return start_for_axis + 1; + } + + // end_mask override + if (end_mask & (1 << axis)) { + if (strides[axis] > 0) { + // Forward iteration - use the last element. These values will get + // clamped below + stop = std::numeric_limits::max(); + } else { + // Backward iteration - use the first element. + stop = std::numeric_limits::lowest(); + } + } + + // Handle negative indices + if (stop < 0) { + stop += axis_size; + } + + // Clamping + // Because the end index points one past the last element, we need slightly + // different clamping ranges depending on the direction. + if (strides[axis] > 0) { + // Forward iteration + stop = Clamp(stop, 0, axis_size); + } else { + // Backward iteration + stop = Clamp(stop, -1, axis_size - 1); + } + + return stop; +} + +inline bool LoopCondition(int index, int stop, int stride) +{ + // True when we have reached the end of an axis and should loop. + return stride > 0 ? index >= stop : index <= stop; +} + +inline tflite::StridedSliceParams BuildStridedSliceParams( + int begin_mask, int end_mask, int shrink_axis_mask, + const std::vector &start_indices, const std::vector &stop_indices, + const std::vector &strides) +{ + tflite::StridedSliceParams op_params; + const int dims_count = start_indices.size(); + + op_params.start_indices_count = dims_count; + op_params.stop_indices_count = dims_count; + op_params.strides_count = dims_count; + for (int i = 0; i < dims_count; ++i) { + op_params.start_indices[i] = start_indices[i]; + op_params.stop_indices[i] = stop_indices[i]; + op_params.strides[i] = strides[i]; + } + + op_params.begin_mask = begin_mask; + op_params.ellipsis_mask = 0; + op_params.end_mask = end_mask; + op_params.new_axis_mask = 0; + op_params.shrink_axis_mask = shrink_axis_mask; + + return op_params; +} + +} // namespace strided_slice + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_STRIDED_SLICE_LOGIC_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_ctypes.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_ctypes.h new file mode 100644 index 00000000..97536730 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_ctypes.h @@ -0,0 +1,48 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_CTYPES_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_CTYPES_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +template +inline T *GetTensorData(TfLiteTensor *tensor) +{ + return tensor != nullptr ? reinterpret_cast(tensor->data.raw) : nullptr; +} + +template +inline const T *GetTensorData(const TfLiteTensor *tensor) +{ + return tensor != nullptr ? reinterpret_cast(tensor->data.raw) : nullptr; +} + +inline RuntimeShape GetTensorShape(const TfLiteTensor *tensor) +{ + if (tensor == nullptr) { + return RuntimeShape(); + } + + TfLiteIntArray *dims = tensor->dims; + const int dims_size = dims->size; + const int32_t *dims_data = reinterpret_cast(dims->data); + return RuntimeShape(dims_size, dims_data); +} + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_CTYPES_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_utils_common.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_utils_common.h new file mode 100644 index 00000000..e6fe0f4e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/tensor_utils_common.h @@ -0,0 +1,472 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_UTILS_COMMON_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_UTILS_COMMON_H_ + +#include +#include + +#if defined(_MSC_VER) +#define __restrict__ __restrict +#endif + +namespace tflite { +namespace tensor_utils { +// Checks if all entries of vector are zero for float. +bool IsZeroVector(const float *vector, int v_size); + +// Checks if all entries of vector are zero for int8. +bool IsZeroVector(const int8_t *vector, int v_size); + +// Quantizes a buffer of floating point values using a symmetric quantization +// (i.e. linear quantization without an offset) to 8-bit signed integers. +// It also outputs the range (min, max) of the floating point buffer, and the +// scaling factor used to quantize the values. +void SymmetricQuantizeFloats(const float *values, const int size, + int8_t *quantized_values, float *min_value, + float *max_value, float *scaling_factor); + +// Quantizes a buffer of floating point values using a symmetric quantization +// (i.e. linear quantization without an offset) to 8-bit signed integers. +// It uses the range (min, max) provided to the function to calculate the +// appropriate scaling factor to quantize the values. +void SymmetricQuantizeFloats(const float *values, const int size, + int8_t *quantized_values, float min_value, + float max_value, float *scaling_factor); + +void AsymmetricQuantizeFloats(const float *values, const int size, + int8_t *quantized_values, float *scaling_factor, + int32_t *offset); + +// Helper function to quantize floats. +// float_data_ptr input float vectors +// n_batch number of input vectors +// n_data size of a single input vector +// quantized_data_ptr (out) vector with quantized data +// scaling_factors (out) scaling factors (one per vector) +// zero_points (out) zero points (one per vector) +// do_asymmetric controls if the quantization should be asymmetric. +inline void BatchQuantizeFloats(const float *float_data_ptr, int n_batch, + int n_data, int8_t *quantized_data_ptr, + float *scaling_factors, int32_t *zero_points, + bool do_asymmetric) +{ + for (int b = 0; b < n_batch; ++b) { + const int offset = b * n_data; + if (do_asymmetric) { + tensor_utils::AsymmetricQuantizeFloats( + float_data_ptr + offset, n_data, quantized_data_ptr + offset, + &scaling_factors[b], &zero_points[b]); + } else { + float unused_min, unused_max; + tensor_utils::SymmetricQuantizeFloats( + float_data_ptr + offset, n_data, quantized_data_ptr + offset, + &unused_min, &unused_max, &scaling_factors[b]); + } + } +} + +// Multiplies a matrix by a "batched" vector (i.e. a matrix with a batch +// dimension composed by input vectors independent from each other). The result +// of the multiplication is accumulated to the passed result buffer. +// More specifically, for a matrix M of shape [n, i] and a batched-vector +// of shape [i, batch] it will first compute the product of shape [n, batch]. +// This product will be accumulated to the result buffer. +void MatrixBatchVectorMultiplyAccumulate(const float *matrix, int m_rows, + int m_cols, const float *vector, + int n_batch, float *result); + +// Same as the function above, but the matrix is a sparse tensor with block +// pattern 1x4. +// This function assumes that m_cols is a multiple of the block size (4 in this +// case) so that there's no incomplete block. +void SparseMatrixBatchVectorMultiplyAccumulate1x4( + const float *__restrict__ matrix, const int32_t *__restrict__ segments, + const int32_t *__restrict__ indices, int m_rows, int m_cols, + const float *__restrict__ vector, int n_batch, float *__restrict__ result); + +// Same as the function above, but the matrix is stored in block compressed +// sparse row format with block pattern 1x16 which consists of two arrays: +// 1. A matrix array stores non-zero blocks of the matrix in row major. +// 2. A ledger array stores nrows groups, one group per row. Each group starts +// with an integer representing the number of non-zero blocks for the +// corresponding row and follows with column indexes of the first element +// of each non-zero block. +// This function assumes that +// 1. m_cols is a multiple of 16 so that all blocks are full blocks. +// 2. m_cols < 254 * 16 so that block index can be represented by uint8. +void SparseMatrixBatchVectorMultiplyAccumulate( + const float *__restrict__ matrix, const uint8_t *__restrict__ ledger, + int m_rows, int m_cols, const float *__restrict__ vector, int n_batch, + float *__restrict__ result); + +// Same as the function above, but for values quantized using symmetric +// quantization (e.g. by calling SymmetricQuantizeFloats). +// The passed scaling factors is a buffer of the quantization scaling factors +// that will be used to dequentize the products into the final result buffer. +// These scaling factors are the multiplication of the matrix scaling factor +// by the vector's scaling factor, one per batch (i.e. this allows quantizing +// each batch in the batch-vector matrix independently). +void MatrixBatchVectorMultiplyAccumulate( + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, + const int8_t *__restrict__ vectors, + const float *__restrict__ scaling_factors, int n_batch, + float *__restrict__ result); + +// Same as the function above except that vector values +// are quantized with asymmetric quantization per-batch and the matrix +// is quantized per row. +void MatrixBatchVectorMultiplyAccumulate( + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, + const int8_t *__restrict__ vectors, + const float *__restrict__ scaling_factors, int n_batch, + float *__restrict__ result, const float *__restrict__ per_channel_scale, + const int32_t *__restrict__ input_offset); + +// Same as the function above, but the matrix is stored in block compressed +// sparse row format with block pattern 1x16 which consists of two arrays: +// 1. A matrix array stores non-zero blocks of the matrix in row major. +// 2. A ledger array stores nrows groups, one group per row. Each group starts +// with an integer representing the number of non-zero blocks for the +// corresponding row followed by column index of the first element of +// each non-zero block. +// This function assumes that +// 1. m_cols is a multiple of 16 so that all blocks are full blocks. +// 2. m_cols < 254 * 16 so that block index can be represented by uint8. +void SparseMatrixBatchVectorMultiplyAccumulate( + const int8_t *__restrict__ matrix, const uint8_t *__restrict__ ledger, + const int m_rows, const int m_cols, const int8_t *__restrict__ vectors, + const float *__restrict__ scaling_factors, int n_batch, + float *__restrict__ result); + +// Same as the above 8, 8, 8 integer matmul except for the presence of zero +// point and non-accumulative. +// TODO(b/148688698): remove this function by folding zero point calculation in +// prepare() function. +void MatrixBatchVectorMultiply(const int8_t *input, int32_t input_zeropoint, + const int8_t *input_to_gate_weights, + int32_t input_to_gate_effective_scale_a, + int32_t input_to_gate_effective_scale_b, + int32_t n_batch, int32_t n_input, int32_t n_cell, + int8_t *gate_output, int8_t gate_output_zp); + +// Same as above but has 16 bit and 8 bit input and 8 bit output. +// Used in projection when hidden is 16bit. +void MatrixBatchVectorMultiply(const int16_t *hidden, + const int8_t *hidden_to_output_weights, + int32_t proj_effective_scale_a, + int32_t proj_effective_scale_b, + const int32_t *gate_bias, int32_t n_batch, + int32_t n_hidden, int32_t n_output, + int32_t output_zp, int8_t *proj_output); + +// Multiplies a matrix with a scalar and reduce the result on each row to a +// scalar. +// Parameters: +// - matrix: matrix of size n_row * n_col +// - scalar: the scalar that is multiplied to each element in the matrix +// - n_row: the row count of the matrix +// - n_col: the column count of the matrix +// - output: the 32bit output +// Note: We do not need saturation because the int8 * int8 is safe from overflow +// in (2^31-1) / (2^14) = 131072, which is bigger than the n_row. Non-zero +// initial output value is not exceptionally large. +void MatrixScalarMultiplyAccumulate(const int8_t *matrix, int32_t scalar, + int32_t n_row, int32_t n_col, + int32_t *output); + +// Apply Layer Normalization (https://arxiv.org/abs/1607.06450) to a Quantized +// vector. +// Parameters: +// - input: batch vector of size n_batch * n_input; 16 bit. +// - layer_norm_weights: the quantized layer normalization weights. +// - bias: the bias for the layer normalization. +// - layer_norm_scale_a: multiplier for scale factor. +// - layer_norm_scale_b: shift for scale factor. +// - variance_limit: the guard to make sure the inverse does not overflow. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - output: the 16 bit output +void ApplyLayerNorm(const int16_t *input, const int16_t *layer_norm_weights, + const int32_t *bias, int32_t layer_norm_scale_a, + int32_t layer_norm_scale_b, int32_t variance_limit, + int n_batch, int n_input, int16_t *output); + +// Same as above but the internal calculation is done in float. +void ApplyLayerNormFloat(const int16_t *input, + const int16_t *layer_norm_weights, + int32_t layer_norm_scale_a, int32_t layer_norm_scale_b, + const int32_t *bias, int n_batch, int n_input, + int16_t *output); + +// Apply Sigmoid to a quantized vector. +// Parameters: +// - input: batch vector of size n_batch * n_input; 16 bit. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - output: the 16 bit output +// The input is in Q3.12 format and the output is in Q0.15 format. +void ApplySigmoid(const int16_t *input, int32_t n_batch, int32_t n_input, + int16_t *output); + +// Same as above but the internal calcualtion is float. +void ApplySigmoidFloat(const int16_t *input, int32_t n_batch, int32_t n_input, + int16_t *output); + +// Apply Tanh to a quantized vector. +// Parameters: +// - integer_bits: the integer bits of the input. +// Currently supports 0, 1, 2, 3, 4, 5, 6. +// - input: batch vector of size n_batch * n_input; 16 bit. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - output: the 16 bit output +// The input is in Qm.15-m format and the output is in Q0.15 format. +void ApplyTanh(int32_t integer_bits, const int16_t *input, int32_t n_batch, + int32_t n_input, int16_t *output); + +// Apply Tanh to a quantized vector. Tbe internal calculation is in float. +// - Input has 2^(integer_bits) as scale. +// - Output has Q0.15 as scale. +void ApplyTanhFloat(const int16_t *input, int32_t n_batch, int32_t n_input, + int32_t integer_bits, int16_t *output); + +// Element-wise multiplication of two quantized vectors. +// Parameters: +// - input_1: batch vector of size n_batch * n_input; 16 bit. +// - input_2: batch vector of size n_batch * n_input; 16 bit. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - shift: the shift needed to produce the output. +// - output: the 16 bit output of size n_batch * n_input. +// Output does not need to be initialized. +void CwiseMul(const int16_t *input_1, const int16_t *input_2, int n_batch, + int n_input, int shift, int16_t *output); + +// Element-wise multiplication of two quantized vectors. +// Parameters: +// - input_1: batch vector of size n_batch * n_input; 16 bit. +// - input_2: batch vector of size n_batch * n_input; 16 bit. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - shift: the shift needed to produce the output. +// - output: the 8 bit output of size n_batch * n_input. +// Output does not need to be initialized. +void CwiseMul(const int16_t *input_1, const int16_t *input_2, int n_batch, + int n_input, int shift, int8_t *output); + +// Element-wise multiplication of two quantized vectors with rescaling. +// Parameters: +// - input_1: batch vector of size n_batch * n_input; 16 bit. +// - input_2: batch vector of size n_batch * n_input; 16 bit. +// - multiplier: the multiplier part of scale. +// - shift: the shift part of scale. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - output: the 8 bit output of size n_batch * n_input. +// - output_zp: the zero point of output. +// Output does not need to be initialized. +// Multiplier ("m") and shift ("s") are connected to scale ("s") with s = m * +// 2^(s - 31). +void CwiseMul(const int16_t *input_1, const int16_t *input_2, + int32_t multiplier, int32_t shift, int32_t n_batch, + int32_t n_input, int32_t output_zp, int8_t *output); + +// Element-wise saturating addition of two quantized vectors without rescaling. +// Parameters: +// - input_1: batch vector of size n_batch * n_input; 16 bit. +// - input_2: batch vector of size n_batch * n_input; 16 bit. +// - n_batch: the number of batches. +// - n_input: the size for input and output. +// - output: the 8 bit output of size n_batch * n_input. +// Output does not need to be initialized. +void CwiseAdd(const int16_t *input_1, const int16_t *input_2, int n_batch, + int n_input, int16_t *output); + +// Element-wise in-place clipping of a vector. Overloaded for float, int16_t, +// int8_t. Parameters: +// - vector: vector of size v_size. +// - v_size: the size of the vector. +// - clipping_value: the value used for clipping. +void CwiseClipping(float *vector, const int v_size, const float clipping_value); +void CwiseClipping(int16_t *vector, const int v_size, + const int16_t clipping_value); +void CwiseClipping(int8_t *vector, const int v_size, + const int8_t clipping_value); + +// Cwise product of two vectors. +template +inline void VectorVectorCwiseProduct(const T *__restrict__ vector1, + const T *__restrict__ vector2, int v_size, + T *__restrict__ result) +{ + for (int v = 0; v < v_size; v++) { + *result++ = *vector1++ * *vector2++; + } +} + +// Cwise product and accumulate of two vectors. Since it's a MAC operation, the +// assumption here is that result array is initialized to valid values. +template +inline void VectorVectorCwiseProductAccumulate(const T *__restrict__ vector1, + const T *__restrict__ vector2, + int v_size, + T *__restrict__ result) +{ + for (int v = 0; v < v_size; v++) { + *result++ += *vector1++ * *vector2++; + } +} + +// Dot product of two vectors. +float VectorVectorDotProduct(const float *vector1, const float *vector2, + int v_size); + +// Dot product of two batch vectors of size n_batch * v_size: +// vector1 = [x_1_1, x_1_2, ..., x_1_vsize, +// x_2_1, x_2_2, ..., x_2_vsize, +// ... +// x_nbatch_1,..., x_nbatch_vsize] +// vector2 = [y_1_1, y_1_2, ..., y_1_vsize, +// y_2_1, y_2_2, ..., y_2_vsize, +// ... +// y_nbatch_1,..., y_nbatch_vsize] +// Then result will be a vector of n_batch size starting from 'result': +// [x_1_1 * y_1_1 + x_1_2 * y_1_2 + ... + x_1_vsize * y_1_vsize, +// x_2_1 * y_2_1 + x_2_2 * y_2_2 + ... + x_2_vsize * y_2_vsize, +// ... +// x_nbatch_1 * y_nbatch_1 + ... + x_nbatch_vsize * y_nbatch_vsize] +template +inline void BatchVectorBatchVectorDotProduct(const T *vector1, const T *vector2, + int v_size, int n_batch, + T *result) +{ + for (int b = 0; b < n_batch; b++) { + result[b] = VectorVectorDotProduct(vector1, vector2, v_size); + vector1 += v_size; + vector2 += v_size; + } +} + +// Same as above but input is 16bit and output is 32bit. +void BatchVectorBatchVectorDotProduct(const int16_t *vector1, + const int16_t *vector2, int v_size, + int n_batch, int32_t *result); + +// Cwise product of a vector and a batch-vector. +template +inline void VectorBatchVectorCwiseProduct(const T *vector, int v_size, + const T *batch_vector, int n_batch, + T *result) +{ + for (int b = 0; b < n_batch; b++) { + VectorVectorCwiseProduct(vector, batch_vector, v_size, result); + // Update the pointers. + result += v_size; + batch_vector += v_size; + } +} + +// Cwise product and accumulate of a vector and a batch-vector. Since it's a MAC +// operation, the assumption here is that result array is initialized to valid +// values. +template +inline void VectorBatchVectorCwiseProductAccumulate(const T *vector, int v_size, + const T *batch_vector, + int n_batch, T *result) +{ + for (int b = 0; b < n_batch; b++) { + VectorVectorCwiseProductAccumulate(vector, batch_vector, v_size, result); + // Update the pointers. + result += v_size; + batch_vector += v_size; + } +} + +// Same as above, but inputs are 16bit integer and output is 16bit integer. +void VectorBatchVectorCwiseProductAccumulate(const int16_t *vector, int v_size, + const int16_t *batch_vector, + int n_batch, int32_t multiplier, + int shift, int16_t *result); + +// Add another vector for each batch in the batch vector. +template +void VectorBatchVectorAdd(const T *vector, int v_size, int n_batch, + T *batch_vector) +{ + for (int b = 0; b < n_batch; b++) { + for (int i = 0; i < v_size; ++i) { + batch_vector[i] += vector[i]; + } + batch_vector += v_size; + } +} + +// Batch vector initialization with another vector. +template +void VectorBatchVectorAssign(const T *vector, int v_size, int n_batch, + T *batch_vector) +{ + for (int b = 0; b < n_batch; b++) { + std::copy_n(vector, v_size, batch_vector + b * v_size); + } +} + +// Compute "1.0f - elements of vector" (used in CIFG). +void Sub1Vector(const float *vector, int v_size, float *result); + +// Compute "1.0f - elements of vector" (used in CIFG) for int16 input. +// "vector" has range [0, 32767] because it is the output of sigmoid function. +void Sub1Vector(const int16_t *vector, int v_size, int16_t *result); + +// Multiply all elements of vector with a scalar. +void VectorScalarMultiply(const int8_t *vector, int v_size, float scale, + float *result); + +// Reduce-sum on a float input vector: +// input_vector: float pointer to input vector. +// output_vector: float pointer to vector. +// output_size: output vector size. +// reduction_size: number of consecutive elements from input vector which are +// added to get one element of output. +void ReductionSumVector(const float *input_vector, float *output_vector, + int output_size, int reduction_size); + +// Same as above but input/output is 32 bit integer. +void ReductionSumVector(const int32_t *input_vector, int32_t *output_vector, + int output_size, int reduction_size); + +// Same as above but input is 8 bit integer. +void ReductionSumVector(const int8_t *input_vector, int32_t *output_vector, + int output_size, int reduction_size); + +// Layer norm for each batch. +void MeanStddevNormalization(const float *__restrict__ input_vector, + float *__restrict__ output_vector, int v_size, + int n_batch); + +// Saturate Add with rescale on both inputs. +void TwoGateSaturatingAdd(const int8_t *input, int8_t input_zp, + const int8_t *recurrent, int8_t recurrent_zp, + int32_t input_effective_scale_a, + int32_t input_effective_scale_b, + int32_t recurrent_effective_scale_a, + int32_t recurrent_effective_scale_b, int32_t n_batch, + int32_t n_cell, int16_t *output); + +} // namespace tensor_utils +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_UTILS_COMMON_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/internal/types.h b/components/TensorFlowLite/tensorflow/lite/kernels/internal/types.h new file mode 100644 index 00000000..8dc26d8a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/internal/types.h @@ -0,0 +1,1303 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_TYPES_H_ +#define TENSORFLOW_LITE_KERNELS_INTERNAL_TYPES_H_ + +#include +#include +#include +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" + +namespace tflite { +enum class FusedActivationFunctionType : uint8_t { + kNone, + kRelu6, + kRelu1, + kRelu +}; +enum class PaddingType : uint8_t { kNone, + kSame, + kValid }; + +struct PaddingValues { + int16_t width; + int16_t height; + // offset is used for calculating "remaining" padding, for example, `width` + // is 1 and `width_offset` is 1, so padding_left is 1 while padding_right is + // 1 + 1 = 2. + int16_t width_offset; + // Same as width_offset except it's over the height dimension. + int16_t height_offset; +}; + +struct Padding3DValues { + int16_t width; + int16_t height; + int16_t depth; + // offset is used for calculating "remaining" padding, for example, `width` + // is 1 and `width_offset` is 1, so padding_left is 1 while padding_right is + // 1 + 1 = 2. + int16_t width_offset; + // Same as width_offset except it's over the height dimension. + int16_t height_offset; + // Same as width_offset except it's over the depth dimension. + int16_t depth_offset; +}; + +// This enumeration allows for non-default formats for the weights array +// of a fully-connected operator, allowing the use of special optimized +// runtime paths. +enum class FullyConnectedWeightsFormat : uint8_t { + // Default format (flat 2D layout, the inner contiguous dimension + // is input_depth, the outer non-contiguous dimension is output_depth) + kDefault, + // Summary: optimized layout for fast CPU runtime implementation, + // aimed specifically at ARM CPUs at the moment, and specialized for + // 8-bit quantized layers. + // + // The use case we're concerned with here is: 8-bit quantization, + // large weights matrix that doesn't fit in cache (e.g. 4096x2048 in + // a key application that drove this), very small batch size (e.g. 1 -- 4). + // + // Even with 8-bit quantization of weights, the performance of memory + // accesses to the weights can become the dominant issue when + // the batch size is small, so each weight value is used in only a few + // arithmetic ops, i.e. the fully-connected node has a low arithmetic + // intensity. The specific issues that arise are of three kinds: + // (1) One may, ideally, max out DRAM bandwidth, i.e. be truly memory + // bound. That's the "good" issue to run into. + // (2) One may run into sub-optimal pre-fetching: the data hasn't been + // prefetched into the cache by the time we need it. + // (3) One may run into cache aliasing: multiple values that are + // pre-fetched, alias each other in the L1 cache (which typically + // has only 4-way set associativity in ARM CPUs) and thus evict + // each other before we get to using them. + // + // The point of this shuffling is to avoid issues (2) and (3) so that + // we get as fast as possible given only the hard constraint (1). + // This is achieved by turning the difficulty into a solution: the + // difficulty, that each value loaded from memory is used only in + // one kernel iteration, making this operation memory-intensive, hints at + // the solution, of shuffling the weights so that they are stored in the + // exact order as the kernel needs to load them, so that the memory + // accesses made by the kernel are trivial. This solves (2) because the + // trivial memory access pattern allows the CPU's automatic prefetching + // to perform very well (no need even for preload instructions), and this + // solves (3) because the values being loaded concurrently are now + // contiguous in the address space, thus don't alias each other in the cache. + // + // On ARM, we typically want our kernel to process a 4x16 block of weights + // at a time, because: + // - 16 is the number of bytes in a NEON register. + // - 4 is how many rows we need to handle concurrently in the kernel in + // order to have sufficient mutual independence of instructions to + // maximize arithmetic throughput. + // + // Finally, the 'Int8' part in the name refers to the fact that this + // weights format has each weights value encoded as a signed int8_t value, + // even if the data type of the weights buffer is uint8_t. This is intended + // to save runtime kernels the effort to have to XOR the top bit of these + // bytes before using them in signed arithmetic, see this file for more + // explanations on the 'signed int8_t trick' in matrix multiplication kernels: + // + // tensorflow/lite/toco/graph_transformations/ensure_uint8_weights_safe_for_fast_int8_kernels.cc + // + kShuffled4x16Int8, +}; + +// Quantization parameters, determining the mapping of quantized values +// to real values (i.e. determining how quantized values are mathematically +// interpreted). +// +// The correspondence is as follows: +// +// real_value = scale * (quantized_value - zero_point); +// +// In other words, zero_point designates which quantized value corresponds to +// the real 0 value, and scale designates the difference between the real values +// corresponding to consecutive quantized values differing by 1. +struct QuantizationParams { + int32_t zero_point = 0; + double scale = 0.0; +}; + +inline bool operator==(const QuantizationParams &qp1, + const QuantizationParams &qp2) +{ + return qp1.zero_point == qp2.zero_point && qp1.scale == qp2.scale; +} + +template +struct Dims { + int sizes[N]; + int strides[N]; +}; + +class RuntimeShape { +public: + // Shapes with dimensions up to 5 are stored directly in the structure, while + // larger shapes are separately allocated. + static constexpr int kMaxSmallSize = 5; + + RuntimeShape &operator=(RuntimeShape const &) = delete; + + RuntimeShape() + : size_(0) + { + } + + explicit RuntimeShape(int dimensions_count) + : size_(dimensions_count) + { + if (dimensions_count > kMaxSmallSize) { +#ifdef TF_LITE_STATIC_MEMORY + TFLITE_CHECK(false && "No shape resizing supported on this platform"); +#else // TF_LITE_STATIC_MEMORY + dims_pointer_ = new int32_t[dimensions_count]; +#endif // TF_LITE_STATIC_MEMORY + } + } + + RuntimeShape(int shape_size, int32_t value) + : size_(0) + { + Resize(shape_size); + for (int i = 0; i < shape_size; ++i) { + SetDim(i, value); + } + } + + RuntimeShape(int dimensions_count, const int32_t *dims_data) + : size_(0) + { + ReplaceWith(dimensions_count, dims_data); + } + + RuntimeShape(const std::initializer_list init_list) + : size_(0) + { + BuildFrom(init_list); + } + + // Avoid using this constructor. We should be able to delete it when C++17 + // rolls out. + RuntimeShape(RuntimeShape const &other) + : size_(other.DimensionsCount()) + { + if (size_ > kMaxSmallSize) { +#ifdef TF_LITE_STATIC_MEMORY + TFLITE_CHECK(false && "No shape resizing supported on this platform"); +#else + dims_pointer_ = new int32_t[size_]; +#endif + } + std::memcpy(DimsData(), other.DimsData(), sizeof(int32_t) * size_); + } + + bool operator==(const RuntimeShape &comp) const + { + return this->size_ == comp.size_ && + std::memcmp(DimsData(), comp.DimsData(), size_ * sizeof(int32_t)) == + 0; + } + + ~RuntimeShape() + { + if (size_ > kMaxSmallSize) { +#ifdef TF_LITE_STATIC_MEMORY + TFLITE_CHECK(false && "No shape resizing supported on this platform"); +#else // TF_LITE_STATIC_MEMORY + delete[] dims_pointer_; +#endif // TF_LITE_STATIC_MEMORY + } + } + + inline int32_t DimensionsCount() const + { + return size_; + } + inline int32_t Dims(int i) const + { + TFLITE_DCHECK_GE(i, 0); + TFLITE_DCHECK_LT(i, size_); + return size_ > kMaxSmallSize ? dims_pointer_[i] : dims_[i]; + } + inline void SetDim(int i, int32_t val) + { + TFLITE_DCHECK_GE(i, 0); + TFLITE_DCHECK_LT(i, size_); + if (size_ > kMaxSmallSize) { + dims_pointer_[i] = val; + } else { + dims_[i] = val; + } + } + + inline int32_t *DimsData() + { + return size_ > kMaxSmallSize ? dims_pointer_ : dims_; + } + inline const int32_t *DimsData() const + { + return size_ > kMaxSmallSize ? dims_pointer_ : dims_; + } + // The caller must ensure that the shape is no bigger than 5-D. + inline const int32_t *DimsDataUpTo5D() const + { + return dims_; + } + + inline void Resize(int dimensions_count) + { + if (size_ > kMaxSmallSize) { +#ifdef TF_LITE_STATIC_MEMORY + TFLITE_CHECK(false && "No shape resizing supported on this platform"); +#else // TF_LITE_STATIC_MEMORY + delete[] dims_pointer_; +#endif // TF_LITE_STATIC_MEMORY + } + size_ = dimensions_count; + if (dimensions_count > kMaxSmallSize) { +#ifdef TF_LITE_STATIC_MEMORY + TFLITE_CHECK(false && "No shape resizing supported on this platform"); +#else // TF_LITE_STATIC_MEMORY + dims_pointer_ = new int32_t[dimensions_count]; +#endif // TF_LITE_STATIC_MEMORY + } + } + + inline void ReplaceWith(int dimensions_count, const int32_t *dims_data) + { + Resize(dimensions_count); + int32_t *dst_dims = DimsData(); + std::memcpy(dst_dims, dims_data, dimensions_count * sizeof(int32_t)); + } + + template + inline void BuildFrom(const T &src_iterable) + { + const int dimensions_count = + std::distance(src_iterable.begin(), src_iterable.end()); + Resize(dimensions_count); + int32_t *data = DimsData(); + for (auto it : src_iterable) { + *data = it; + ++data; + } + } + + // This will probably be factored out. Old code made substantial use of 4-D + // shapes, and so this function is used to extend smaller shapes. Note that + // (a) as Dims<4>-dependent code is eliminated, the reliance on this should be + // reduced, and (b) some kernels are stricly 4-D, but then the shapes of their + // inputs should already be 4-D, so this function should not be needed. + inline static RuntimeShape ExtendedShape(int new_shape_size, + const RuntimeShape &shape) + { + return RuntimeShape(new_shape_size, shape, 1); + } + + inline void BuildFrom(const std::initializer_list init_list) + { + BuildFrom >(init_list); + } + + // Returns the total count of elements, that is the size when flattened into a + // vector. + inline int FlatSize() const + { + int buffer_size = 1; + const int *dims_data = reinterpret_cast(DimsData()); + for (int i = 0; i < size_; i++) { + buffer_size *= dims_data[i]; + } + return buffer_size; + } + + bool operator!=(const RuntimeShape &comp) const + { + return !((*this) == comp); + } + +private: + // For use only by ExtendedShape(), written to guarantee (return-value) copy + // elision in C++17. + // This creates a shape padded to the desired size with the specified value. + RuntimeShape(int new_shape_size, const RuntimeShape &shape, int pad_value) + : size_(0) + { + // If the following check fails, it is likely because a 4D-only kernel is + // being used with an array of larger dimension count. + TFLITE_CHECK_GE(new_shape_size, shape.DimensionsCount()); + Resize(new_shape_size); + const int size_increase = new_shape_size - shape.DimensionsCount(); + for (int i = 0; i < size_increase; ++i) { + SetDim(i, pad_value); + } + std::memcpy(DimsData() + size_increase, shape.DimsData(), + sizeof(int32_t) * shape.DimensionsCount()); + } + + int32_t size_; + union { + int32_t dims_[kMaxSmallSize]; + int32_t *dims_pointer_; + }; +}; + +// Converts inference-style shape to legacy tflite::Dims<4>. +inline tflite::Dims<4> ToRuntimeDims(const tflite::RuntimeShape &array_shape) +{ + tflite::Dims<4> result; + const int dimensions_count = array_shape.DimensionsCount(); + TFLITE_CHECK_LE(dimensions_count, 4); + int cum_prod = 1; + for (int i = 0; i < 4; i++) { + const int new_dim = + (i < dimensions_count) ? array_shape.Dims(dimensions_count - 1 - i) : 1; + result.sizes[i] = new_dim; + result.strides[i] = cum_prod; + cum_prod *= new_dim; + } + return result; +} + +// TODO(b/80418076): Move to legacy ops file, update invocations. +inline RuntimeShape DimsToShape(const tflite::Dims<4> &dims) +{ + return RuntimeShape( + { dims.sizes[3], dims.sizes[2], dims.sizes[1], dims.sizes[0] }); +} + +// Gets next index to iterate through a multidimensional array. +inline bool NextIndex(const int num_dims, const int *dims, int *current) +{ + if (num_dims == 0) { + return false; + } + TFLITE_DCHECK(dims != nullptr); + TFLITE_DCHECK(current != nullptr); + int carry = 1; + for (int idx = num_dims - 1; idx >= 0; --idx) { + int current_val = current[idx] + carry; + TFLITE_DCHECK_GE(dims[idx], current_val); + if (dims[idx] == current_val) { + current[idx] = 0; + } else { + current[idx] = current_val; + carry = 0; + break; + } + } + return (carry == 0); +} + +// Gets offset of index if reducing on axis. When reducing, the flattened offset +// will not change, if the input index changes on the given axis. For example, +// if you have a 3D tensor and you are reducing to 2D by eliminating axis 0, +// then index (0, 1, 2) and index (1, 1, 2) will map to the same flattened +// offset. +// TODO(kanlig): uses Dims to represent dimensions. +inline size_t ReducedOutputOffset(const int num_dims, const int *dims, + const int *index, const int num_axis, + const int *axis) +{ + if (num_dims == 0) { + return 0; + } + TFLITE_DCHECK(dims != nullptr); + TFLITE_DCHECK(index != nullptr); + size_t offset = 0; + for (int idx = 0; idx < num_dims; ++idx) { + // if we need to skip this axis + bool is_axis = false; + if (axis != nullptr) { + for (int axis_idx = 0; axis_idx < num_axis; ++axis_idx) { + if (idx == axis[axis_idx]) { + is_axis = true; + break; + } + } + } + if (!is_axis) { + offset = offset * static_cast(dims[idx]) + + static_cast(index[idx]); + } + } + return offset; +} + +inline int Offset(const RuntimeShape &shape, int i0, int i1, int i2, int i3) +{ + TFLITE_DCHECK_EQ(shape.DimensionsCount(), 4); + const int *dims_data = reinterpret_cast(shape.DimsDataUpTo5D()); + TFLITE_DCHECK(i0 >= 0 && i0 < dims_data[0]); + TFLITE_DCHECK(i1 >= 0 && i1 < dims_data[1]); + TFLITE_DCHECK(i2 >= 0 && i2 < dims_data[2]); + TFLITE_DCHECK(i3 >= 0 && i3 < dims_data[3]); + return ((i0 * dims_data[1] + i1) * dims_data[2] + i2) * dims_data[3] + i3; +} + +inline int Offset(const RuntimeShape &shape, int i0, int i1, int i2, int i3, + int i4) +{ + TFLITE_DCHECK_EQ(shape.DimensionsCount(), 5); + const int *dims_data = reinterpret_cast(shape.DimsDataUpTo5D()); + TFLITE_DCHECK(i0 >= 0 && i0 < dims_data[0]); + TFLITE_DCHECK(i1 >= 0 && i1 < dims_data[1]); + TFLITE_DCHECK(i2 >= 0 && i2 < dims_data[2]); + TFLITE_DCHECK(i3 >= 0 && i3 < dims_data[3]); + TFLITE_DCHECK(i4 >= 0 && i4 < dims_data[4]); + return (((i0 * dims_data[1] + i1) * dims_data[2] + i2) * dims_data[3] + i3) * + dims_data[4] + + i4; +} + +inline int Offset(const Dims<4> &dims, int i0, int i1, int i2, int i3) +{ + TFLITE_DCHECK(i0 >= 0 && i0 < dims.sizes[0]); + TFLITE_DCHECK(i1 >= 0 && i1 < dims.sizes[1]); + TFLITE_DCHECK(i2 >= 0 && i2 < dims.sizes[2]); + TFLITE_DCHECK(i3 >= 0 && i3 < dims.sizes[3]); + return i0 * dims.strides[0] + i1 * dims.strides[1] + i2 * dims.strides[2] + + i3 * dims.strides[3]; +} + +inline int Offset(const Dims<4> &dims, int *index) +{ + return Offset(dims, index[0], index[1], index[2], index[3]); +} + +inline int Offset(const RuntimeShape &shape, int *index) +{ + return Offset(shape, index[0], index[1], index[2], index[3]); +} + +// Get array size, DCHECKing that the dim index is in range. +// +// Note that this will be phased out with Dims<4>, since RuntimeShape::Dims() +// already performs this check. +template +int ArraySize(const Dims &array, int index) +{ + TFLITE_DCHECK(index >= 0 && index < N); + return array.sizes[index]; +} + +// Get common array size, DCHECKing that they all agree. +template +int MatchingArraySize(const ArrayType1 &array1, int index1, + const ArrayType2 &array2, int index2) +{ + TFLITE_DCHECK_EQ(ArraySize(array1, index1), ArraySize(array2, index2)); + return ArraySize(array1, index1); +} + +template +int MatchingArraySize(const ArrayType1 &array1, int index1, + const ArrayType2 &array2, int index2, Args... args) +{ + TFLITE_DCHECK_EQ(ArraySize(array1, index1), ArraySize(array2, index2)); + return MatchingArraySize(array1, index1, args...); +} + +// Get common shape dim, DCHECKing that they all agree. +inline int MatchingDim(const RuntimeShape &shape1, int index1, + const RuntimeShape &shape2, int index2) +{ + TFLITE_DCHECK_EQ(shape1.Dims(index1), shape2.Dims(index2)); + return std::min(shape1.Dims(index1), shape2.Dims(index2)); +} + +template +int MatchingDim(const RuntimeShape &shape1, int index1, + const RuntimeShape &shape2, int index2, Args... args) +{ + TFLITE_DCHECK_EQ(shape1.Dims(index1), shape2.Dims(index2)); + return MatchingDim(shape1, index1, args...); +} + +// Will be phased out with Dims<4>, replaced by RuntimeShape::FlatSize(). +template +inline int FlatSize(const Dims &dims) +{ + int flat_size = 1; + for (int i = 0; i < N; ++i) { + flat_size *= dims.sizes[i]; + } + return flat_size; +} + +TFLITE_DEPRECATED("Prefer FlatSize.") +inline int RequiredBufferSizeForDims(const Dims<4> &dims) +{ + return FlatSize(dims); +} + +inline int MatchingElementsSize(const RuntimeShape &shape, + const RuntimeShape &check_shape_0) +{ + const int size_1 = shape.FlatSize(); + const int size_2 = check_shape_0.FlatSize(); + TFLITE_CHECK_EQ(size_1, size_2); + return size_1; +} + +inline int MatchingElementsSize(const RuntimeShape &shape, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1) +{ + const int size_1 = shape.FlatSize(); + const int size_2 = check_shape_0.FlatSize(); + const int size_3 = check_shape_1.FlatSize(); + TFLITE_CHECK_EQ(size_1, size_2); + TFLITE_CHECK_EQ(size_2, size_3); + return size_1; +} + +// Flat size calculation, checking that dimensions match with one or more other +// arrays. +inline int MatchingFlatSize(const RuntimeShape &shape, + const RuntimeShape &check_shape_0) +{ + TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + return shape.FlatSize(); +} + +inline int MatchingFlatSize(const RuntimeShape &shape, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1) +{ + TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + return MatchingFlatSize(shape, check_shape_1); +} + +inline int MatchingFlatSize(const RuntimeShape &shape, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1, + const RuntimeShape &check_shape_2) +{ + TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + return MatchingFlatSize(shape, check_shape_1, check_shape_2); +} + +inline int MatchingFlatSize(const RuntimeShape &shape, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1, + const RuntimeShape &check_shape_2, + const RuntimeShape &check_shape_3) +{ + TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + return MatchingFlatSize(shape, check_shape_1, check_shape_2, check_shape_3); +} + +// Flat size calculation, checking that dimensions match with one or more other +// arrays. +template +inline int MatchingFlatSize(const Dims &dims, const Dims &check_dims_0) +{ + for (int i = 0; i < N; ++i) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + return FlatSize(dims); +} + +template +inline int MatchingFlatSize(const Dims &dims, const Dims &check_dims_0, + const Dims &check_dims_1) +{ + for (int i = 0; i < N; ++i) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + return MatchingFlatSize(dims, check_dims_1); +} + +template +inline int MatchingFlatSize(const Dims &dims, const Dims &check_dims_0, + const Dims &check_dims_1, + const Dims &check_dims_2) +{ + for (int i = 0; i < N; ++i) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + return MatchingFlatSize(dims, check_dims_1, check_dims_2); +} + +template +inline int MatchingFlatSize(const Dims &dims, const Dims &check_dims_0, + const Dims &check_dims_1, + const Dims &check_dims_2, + const Dims &check_dims_3) +{ + for (int i = 0; i < N; ++i) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + return MatchingFlatSize(dims, check_dims_1, check_dims_2, check_dims_3); +} + +// Data is required to be contiguous, and so many operators can use either the +// full array flat size or the flat size with one dimension skipped (commonly +// the depth). +template +inline int FlatSizeSkipDim(const Dims &dims, int skip_dim) +{ + TFLITE_DCHECK(skip_dim >= 0 && skip_dim < N); + int flat_size = 1; + for (int i = 0; i < N; ++i) { + flat_size *= (i == skip_dim) ? 1 : dims.sizes[i]; + } + return flat_size; +} + +// A combination of MatchingFlatSize() and FlatSizeSkipDim(). +template +inline int MatchingFlatSizeSkipDim(const Dims &dims, int skip_dim, + const Dims &check_dims_0) +{ + for (int i = 0; i < N; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + } + return FlatSizeSkipDim(dims, skip_dim); +} + +template +inline int MatchingFlatSizeSkipDim(const Dims &dims, int skip_dim, + const Dims &check_dims_0, + const Dims &check_dims_1) +{ + for (int i = 0; i < N; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + } + return MatchingFlatSizeSkipDim(dims, skip_dim, check_dims_1); +} + +template +inline int MatchingFlatSizeSkipDim(const Dims &dims, int skip_dim, + const Dims &check_dims_0, + const Dims &check_dims_1, + const Dims &check_dims_2) +{ + for (int i = 0; i < N; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + } + return MatchingFlatSizeSkipDim(dims, skip_dim, check_dims_1, check_dims_2); +} + +template +inline int MatchingFlatSizeSkipDim(const Dims &dims, int skip_dim, + const Dims &check_dims_0, + const Dims &check_dims_1, + const Dims &check_dims_2, + const Dims &check_dims_3) +{ + for (int i = 0; i < N; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); + } + } + return MatchingFlatSizeSkipDim(dims, skip_dim, check_dims_1, check_dims_2, + check_dims_3); +} + +// Data is required to be contiguous, and so many operators can use either the +// full array flat size or the flat size with one dimension skipped (commonly +// the depth). +inline int FlatSizeSkipDim(const RuntimeShape &shape, int skip_dim) +{ + const int dims_count = shape.DimensionsCount(); + TFLITE_DCHECK(skip_dim >= 0 && skip_dim < dims_count); + const auto *dims_data = shape.DimsData(); + int flat_size = 1; + for (int i = 0; i < dims_count; ++i) { + flat_size *= (i == skip_dim) ? 1 : dims_data[i]; + } + return flat_size; +} + +// A combination of MatchingFlatSize() and FlatSizeSkipDim(). +inline int MatchingFlatSizeSkipDim(const RuntimeShape &shape, int skip_dim, + const RuntimeShape &check_shape_0) +{ + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + } + return FlatSizeSkipDim(shape, skip_dim); +} + +inline int MatchingFlatSizeSkipDim(const RuntimeShape &shape, int skip_dim, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1) +{ + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + } + return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1); +} + +inline int MatchingFlatSizeSkipDim(const RuntimeShape &shape, int skip_dim, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1, + const RuntimeShape &check_shape_2) +{ + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + } + return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1, check_shape_2); +} + +inline int MatchingFlatSizeSkipDim(const RuntimeShape &shape, int skip_dim, + const RuntimeShape &check_shape_0, + const RuntimeShape &check_shape_1, + const RuntimeShape &check_shape_2, + const RuntimeShape &check_shape_3) +{ + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) { + if (i != skip_dim) { + TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); + } + } + return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1, check_shape_2, + check_shape_3); +} + +template +bool IsPackedWithoutStrides(const Dims &dims) +{ + int expected_stride = 1; + for (int d = 0; d < N; d++) { + if (dims.strides[d] != expected_stride) + return false; + expected_stride *= dims.sizes[d]; + } + return true; +} + +template +void ComputeStrides(Dims *dims) +{ + dims->strides[0] = 1; + for (int d = 1; d < N; d++) { + dims->strides[d] = dims->strides[d - 1] * dims->sizes[d - 1]; + } +} + +enum class BroadcastableOpCategory : uint8_t { + kNone, + kNonBroadcast, // Matching input shapes. + kFirstInputBroadcastsFast, // Fivefold nested loops. + kSecondInputBroadcastsFast, // Fivefold nested loops. + kGenericBroadcast, // Fall-back. +}; + +struct MinMax { + float min; + float max; +}; +static_assert(sizeof(MinMax) == 8, ""); + +struct ActivationParams { + FusedActivationFunctionType activation_type; + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; +}; + +struct ReluParams : public ActivationParams { + int32_t input_offset; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; +}; + +// Styles of resizing op usages. For example, kImageStyle can be used with a Pad +// op for pattern-specific optimization. +enum class ResizingCategory : uint8_t { + kNone, + kImageStyle, // 4D, operating on inner dimensions, say {0, a, b, 0}. + kGenericResize, +}; + +// For Add, Sub, Mul ops. +struct ArithmeticParams { + // Shape dependent / common to data / op types. + BroadcastableOpCategory broadcast_category; + // uint8_t inference params. + int32_t input1_offset; + int32_t input2_offset; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; + // Add / Sub, not Mul, uint8_t inference params. + int left_shift; + int32_t input1_multiplier; + int input1_shift; + int32_t input2_multiplier; + int input2_shift; + + // TODO(b/158622529): Union the following activation params. + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params. + float float_activation_min; + float float_activation_max; + // int64_t activation params. + int64_t int64_activation_min; + int64_t int64_activation_max; + + // Processed output dimensions. + // Let input "a" be the one that broadcasts in the faster-changing dimension. + // Then, after coalescing, for shapes {a0, a1, a2, a3, a4} and + // {b0, b1, b2, b3, b4}, + // broadcast_shape[4] = b0 = a0. + // broadcast_shape[3] = b1; a1 = 1. + // broadcast_shape[2] = b2 = a2. + // broadcast_shape[1] = a3; b3 = 1. + // broadcast_shape[0] = b4 = a4. + int broadcast_shape[5]; +}; + +struct ConcatenationParams { + int8_t axis; + const int32_t *input_zeropoint; + const float *input_scale; + uint16_t inputs_count; + int32_t output_zeropoint; + float output_scale; +}; + +struct ComparisonParams { + // uint8_t inference params. + int left_shift; + int32_t input1_offset; + int32_t input1_multiplier; + int input1_shift; + int32_t input2_offset; + int32_t input2_multiplier; + int input2_shift; + // Shape dependent / common to inference types. + bool is_broadcast; +}; + +struct ConvParams { + PaddingType padding_type; + PaddingValues padding_values; + // TODO(starka): This was just "stride", so check that width+height is OK. + int16_t stride_width; + int16_t stride_height; + int16_t dilation_width_factor; + int16_t dilation_height_factor; + // uint8_t inference params. + // TODO(b/65838351): Use smaller types if appropriate. + int32_t input_offset; + int32_t weights_offset; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params. + float float_activation_min; + float float_activation_max; +}; + +struct Conv3DParams { + Padding3DValues padding_values; + int stride_width; + int stride_height; + int stride_depth; + int dilation_width; + int dilation_height; + int dilation_depth; + // float activation params. + float float_activation_min; + float float_activation_max; +}; + +typedef Conv3DParams Conv3DTransposeParams; + +struct DepthToSpaceParams { + int32_t block_size; +}; + +struct DepthwiseParams { + PaddingType padding_type; + PaddingValues padding_values; + int16_t stride_width; + int16_t stride_height; + int16_t dilation_width_factor; + int16_t dilation_height_factor; + int16_t depth_multiplier; + // uint8_t inference params. + // TODO(b/65838351): Use smaller types if appropriate. + int32_t input_offset; + int32_t weights_offset; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params. + float float_activation_min; + float float_activation_max; + const int32_t *output_multiplier_per_channel; + const int32_t *output_shift_per_channel; +}; + +struct DequantizationParams { + double scale; + int32_t zero_point; +}; + +struct PerChannelDequantizationParams { + const float *scale; + const int32_t *zero_point; + int32_t quantized_dimension; +}; + +struct FakeQuantParams { + MinMax minmax; + int32_t num_bits; +}; + +struct FullyConnectedParams { + // uint8_t inference params. + // TODO(b/65838351): Use smaller types if appropriate. + int32_t input_offset; + int32_t weights_offset; + int32_t output_offset; + int32_t output_multiplier; + int output_shift; + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params. + float float_activation_min; + float float_activation_max; + // Mark the operands as cacheable if they are unchanging, e.g. weights. + bool lhs_cacheable; + bool rhs_cacheable; + FullyConnectedWeightsFormat weights_format; +}; + +struct GatherParams { + int16_t axis; + int16_t batch_dims; +}; + +struct L2NormalizationParams { + // uint8_t inference params. + int32_t input_zero_point; +}; + +struct LocalResponseNormalizationParams { + int32_t range; + double bias; + double alpha; + double beta; +}; + +struct HardSwishParams { + // zero_point of the input activations. + int16_t input_zero_point; + // zero_point of the output activations. + int16_t output_zero_point; + // 16bit fixed-point component of the multiplier to apply to go from the + // "high-res input scale", which is the input scale multiplied by 2^7, to the + // "relu-ish scale", which 3.0/32768. + // See the implementation of HardSwishPrepare. + int16_t reluish_multiplier_fixedpoint_int16; + // exponent/bit-shift component of the aforementioned multiplier. + int reluish_multiplier_exponent; + // 16bit fixed-point component of the multiplier to apply to go from the + // "high-res input scale", which is the input scale multiplied by 2^7, to the + // output scale. + // See the implementation of HardSwishPrepare. + int16_t output_multiplier_fixedpoint_int16; + // exponent/bit-shift component of the aforementioned multiplier. + int output_multiplier_exponent; +}; + +struct LogisticParams { + // uint8_t inference params. + int32_t input_zero_point; + int32_t input_range_radius; + int32_t input_multiplier; + int input_left_shift; +}; + +struct LstmCellParams { + int32_t weights_zero_point; + int32_t accum_multiplier; + int accum_shift; + int state_integer_bits; +}; + +struct MeanParams { + int8_t axis_count; + int16_t axis[4]; +}; + +struct PackParams { + int8_t axis; + const int32_t *input_zeropoint; + const float *input_scale; + uint16_t inputs_count; + int32_t output_zeropoint; + float output_scale; +}; + +struct PadParams { + int8_t left_padding_count; + int32_t left_padding[5]; + int8_t right_padding_count; + int32_t right_padding[5]; + ResizingCategory resizing_category; +}; + +struct PreluParams { + int32_t input_offset; + int32_t alpha_offset; + int32_t output_offset; + int32_t output_multiplier_1; + int output_shift_1; + int32_t output_multiplier_2; + int output_shift_2; +}; + +struct PoolParams { + FusedActivationFunctionType activation; + PaddingType padding_type; + PaddingValues padding_values; + int stride_height; + int stride_width; + int filter_height; + int filter_width; + // uint8_t, etc, activation params. + int32_t quantized_activation_min; + int32_t quantized_activation_max; + // float activation params. + float float_activation_min; + float float_activation_max; +}; + +struct ReshapeParams { + int8_t shape_count; + int32_t shape[4]; +}; + +struct ResizeBilinearParams { + bool align_corners; + // half_pixel_centers assumes pixels are of half the actual dimensions, and + // yields more accurate resizes. Corresponds to the same argument for the + // original TensorFlow op in TF2.0. + bool half_pixel_centers; +}; + +struct ResizeNearestNeighborParams { + bool align_corners; + bool half_pixel_centers; +}; + +struct SliceParams { + int8_t begin_count; + int32_t begin[5]; + int8_t size_count; + int32_t size[5]; +}; + +struct SoftmaxParams { + // beta is not really used (not a Tensorflow parameter) and not implemented + // for LogSoftmax. + double beta; + // uint8_t inference params. Used even when beta defaults to 1.0. + int32_t input_multiplier; + int32_t input_left_shift; + // Reverse scaling is only used by LogSoftmax. + int32_t reverse_scaling_divisor; + int32_t reverse_scaling_right_shift; + int diff_min; + int32_t zero_point; + float scale; + float *table; + // int16 LUT for exp(x), where x uniform distributed between [-10.0 , 0.0] + int16_t *exp_lut; + // int16 LUT for 1 / (1 + x), where x uniform distributed between [0.0 , 1.0] + int16_t *one_over_one_plus_x_lut; + uint8_t *uint8_table1; + uint8_t *uint8_table2; +}; + +struct SpaceToBatchParams { + // "Zero" padding for uint8_t means padding with the output offset. + int32_t output_offset; +}; + +struct SpaceToDepthParams { + int32_t block_size; +}; + +struct SplitParams { + // Graphs that split into, say, 2000 nodes are encountered. The indices in + // OperatorEdges are of type uint16_t. + uint16_t num_split; + int16_t axis; +}; + +struct SqueezeParams { + int8_t squeeze_dims_count; + int32_t squeeze_dims[4]; +}; + +struct StridedSliceParams { + int8_t start_indices_count; + int32_t start_indices[5]; + int8_t stop_indices_count; + int32_t stop_indices[5]; + int8_t strides_count; + int32_t strides[5]; + + int16_t begin_mask; + int16_t ellipsis_mask; + int16_t end_mask; + int16_t new_axis_mask; + int16_t shrink_axis_mask; +}; + +struct TanhParams { + int32_t input_zero_point; + int32_t input_range_radius; + int32_t input_multiplier; + int input_left_shift; +}; + +struct TransposeParams { + int8_t perm_count; + int32_t perm[5]; +}; + +struct UnpackParams { + uint16_t num_split; + int16_t axis; +}; + +struct LeakyReluParams { + float alpha; + int32_t input_offset; + int32_t output_offset; + int32_t output_multiplier_alpha; + int32_t output_shift_alpha; + int32_t output_multiplier_identity; + int32_t output_shift_identity; +}; + +template +inline void SetActivationParams(float min, float max, P *params) +{ + params->float_activation_min = min; + params->float_activation_max = max; +} + +template +inline void SetActivationParams(int32_t min, int32_t max, P *params) +{ + params->quantized_activation_min = min; + params->quantized_activation_max = max; +} + +template +inline void SetActivationParams(int64_t min, int64_t max, P *params) +{ + params->int64_activation_min = min; + params->int64_activation_max = max; +} + +template +inline void GetActivationParams(const P ¶ms, int32_t *min, int32_t *max) +{ + *min = params.quantized_activation_min; + *max = params.quantized_activation_max; +} + +template +inline void GetActivationParams(const P ¶ms, float *min, float *max) +{ + *min = params.float_activation_min; + *max = params.float_activation_max; +} + +template +inline void GetActivationParams(const P ¶ms, int64_t *min, int64_t *max) +{ + *min = params.int64_activation_min; + *max = params.int64_activation_max; +} + +// Type trait to check of given type has size smaller than 4 bytes. +template +struct is_small_integer + : public std::integral_constant::value || + std::is_same::value || + std::is_same::value || + std::is_same::value> { +}; + +// Type trait to check of given type is int32 or int64. +template +struct is_int32_or_int64 + : public std::integral_constant::value || + std::is_same::value> { +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_TYPES_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.cc b/components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.cc new file mode 100644 index 00000000..24c5dd8e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.cc @@ -0,0 +1,576 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/kernel_util.h" + +#include +#include + +#include +#include +#include +#include +#ifndef TF_LITE_STATIC_MEMORY +#include +#endif // TF_LITE_STATIC_MEMORY + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" + +#if defined(__APPLE__) +#include "TargetConditionals.h" +#endif + +namespace tflite { + +namespace { + +// Assumes tensor_index is a valid index (in bounds) +inline TfLiteTensor *GetTensorAtIndex(const TfLiteContext *context, + int tensor_index) +{ + if (context->tensors != nullptr) { + return &context->tensors[tensor_index]; + } else { + return context->GetTensor(context, tensor_index); + } +} + +// Validate in a single place to reduce binary size +inline TfLiteStatus ValidateTensorIndexingSafe(const TfLiteContext *context, + int index, int max_size, + const int *tensor_indices, + int *tensor_index) +{ + if (index < 0 || index >= max_size) { + TF_LITE_KERNEL_LOG(const_cast(context), + "Invalid tensor index %d (not in [0, %d))\n", index, + max_size); + return kTfLiteError; + } + if (tensor_indices[index] == kTfLiteOptionalTensor) { + TF_LITE_KERNEL_LOG(const_cast(context), + "Tensor at index %d was optional but was expected\n", + index); + return kTfLiteError; + } + + *tensor_index = tensor_indices[index]; + return kTfLiteOk; +} + +// Same as above but returns -1 for invalid inputs instead of status + logging +// error. +inline int ValidateTensorIndexing(const TfLiteContext *context, int index, + int max_size, const int *tensor_indices) +{ + if (index >= 0 && index < max_size) { + const int tensor_index = tensor_indices[index]; + if (tensor_index != kTfLiteOptionalTensor) { + return tensor_index; + } + } + return -1; +} + +inline TfLiteTensor *GetMutableInput(const TfLiteContext *context, + const TfLiteNode *node, int index) +{ + const int tensor_index = ValidateTensorIndexing( + context, index, node->inputs->size, node->inputs->data); + if (tensor_index < 0) { + return nullptr; + } + return GetTensorAtIndex(context, tensor_index); +} + +inline TfLiteStatus GetMutableInputSafe(const TfLiteContext *context, + const TfLiteNode *node, int index, + const TfLiteTensor **tensor) +{ + int tensor_index; + TF_LITE_ENSURE_OK( + context, ValidateTensorIndexingSafe(context, index, node->inputs->size, + node->inputs->data, &tensor_index)); + *tensor = GetTensorAtIndex(context, tensor_index); + return kTfLiteOk; +} + +} // anonymous namespace. + +const TfLiteTensor *GetInput(const TfLiteContext *context, + const TfLiteNode *node, int index) +{ + return GetMutableInput(context, node, index); +} + +TfLiteStatus GetInputSafe(const TfLiteContext *context, const TfLiteNode *node, + int index, const TfLiteTensor **tensor) +{ + return GetMutableInputSafe(context, node, index, tensor); +} + +TfLiteTensor *GetVariableInput(TfLiteContext *context, const TfLiteNode *node, + int index) +{ + TfLiteTensor *tensor = GetMutableInput(context, node, index); + return tensor->is_variable ? tensor : nullptr; +} + +TfLiteTensor *GetOutput(TfLiteContext *context, const TfLiteNode *node, + int index) +{ + const int tensor_index = ValidateTensorIndexing( + context, index, node->outputs->size, node->outputs->data); + if (tensor_index < 0) { + return nullptr; + } + return GetTensorAtIndex(context, tensor_index); +} + +TfLiteStatus GetOutputSafe(const TfLiteContext *context, const TfLiteNode *node, + int index, TfLiteTensor **tensor) +{ + int tensor_index; + TF_LITE_ENSURE_OK( + context, ValidateTensorIndexingSafe(context, index, node->outputs->size, + node->outputs->data, &tensor_index)); + *tensor = GetTensorAtIndex(context, tensor_index); + return kTfLiteOk; +} + +const TfLiteTensor *GetOptionalInputTensor(const TfLiteContext *context, + const TfLiteNode *node, int index) +{ + return GetInput(context, node, index); +} + +#ifndef TF_LITE_STATIC_MEMORY +TfLiteTensor *GetTemporary(TfLiteContext *context, const TfLiteNode *node, + int index) +{ + const int tensor_index = ValidateTensorIndexing( + context, index, node->temporaries->size, node->temporaries->data); + if (tensor_index < 0) { + return nullptr; + } + return GetTensorAtIndex(context, tensor_index); +} + +TfLiteStatus GetTemporarySafe(const TfLiteContext *context, + const TfLiteNode *node, int index, + TfLiteTensor **tensor) +{ + int tensor_index; + TF_LITE_ENSURE_OK(context, ValidateTensorIndexingSafe( + context, index, node->temporaries->size, + node->temporaries->data, &tensor_index)); + *tensor = GetTensorAtIndex(context, tensor_index); + return kTfLiteOk; +} + +const TfLiteTensor *GetIntermediates(TfLiteContext *context, + const TfLiteNode *node, int index) +{ + const int tensor_index = ValidateTensorIndexing( + context, index, node->intermediates->size, node->intermediates->data); + if (tensor_index < 0) { + return nullptr; + } + return GetTensorAtIndex(context, tensor_index); +} + +TfLiteStatus GetIntermediatesSafe(const TfLiteContext *context, + const TfLiteNode *node, int index, + TfLiteTensor **tensor) +{ + int tensor_index; + TF_LITE_ENSURE_OK(context, ValidateTensorIndexingSafe( + context, index, node->intermediates->size, + node->intermediates->data, &tensor_index)); + *tensor = GetTensorAtIndex(context, tensor_index); + return kTfLiteOk; +} +#endif // TF_LITE_STATIC_MEMORY + +// Per-axis +TfLiteStatus PopulateConvolutionQuantizationParams( + TfLiteContext *context, const TfLiteTensor *input, + const TfLiteTensor *filter, const TfLiteTensor *bias, TfLiteTensor *output, + const TfLiteFusedActivation &activation, int32_t *multiplier, int *shift, + int32_t *output_activation_min, int32_t *output_activation_max, + int32_t *per_channel_multiplier, int32_t *per_channel_shift) +{ + const auto *affine_quantization = + reinterpret_cast(filter->quantization.params); + return PopulateConvolutionQuantizationParams( + context, input, filter, bias, output, activation, multiplier, shift, + output_activation_min, output_activation_max, per_channel_multiplier, + per_channel_shift, affine_quantization->scale->size); +} + +// Per-axis & per-tensor +TfLiteStatus PopulateConvolutionQuantizationParams( + TfLiteContext *context, const TfLiteTensor *input, + const TfLiteTensor *filter, const TfLiteTensor *bias, TfLiteTensor *output, + const TfLiteFusedActivation &activation, int32_t *multiplier, int *shift, + int32_t *output_activation_min, int32_t *output_activation_max, + int32_t *per_channel_multiplier, int32_t *per_channel_shift, + int num_channels) +{ + TF_LITE_ENSURE_EQ(context, input->quantization.type, + kTfLiteAffineQuantization); + TF_LITE_ENSURE_EQ(context, filter->quantization.type, + kTfLiteAffineQuantization); + // TODO(jianlijianli): Enable bias type check and bias scale == input scale + // * filter scale for each channel in affine quantization once bias + // quantization is properly populated. + // TF_LITE_ENSURE_EQ(context, bias->quantization.type, + // kTfLiteAffineQuantization); + + // Check data type. + const auto *affine_quantization = + reinterpret_cast(filter->quantization.params); + TF_LITE_ENSURE(context, affine_quantization); + TF_LITE_ENSURE(context, affine_quantization->scale); + const bool is_per_channel = affine_quantization->scale->size > 1; + if (is_per_channel) { + // Currently only Int8/Int16 is supported for per channel quantization. + TF_LITE_ENSURE(context, + input->type == kTfLiteInt8 || input->type == kTfLiteInt16); + TF_LITE_ENSURE_EQ(context, filter->type, kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, affine_quantization->scale->size, num_channels); + TF_LITE_ENSURE_EQ( + context, num_channels, + filter->dims->data[affine_quantization->quantized_dimension]); + } + + // Populate multiplier and shift using affine quantization. + const float input_scale = input->params.scale; + const float output_scale = output->params.scale; + const float *filter_scales = affine_quantization->scale->data; + for (int i = 0; i < num_channels; ++i) { + // If per-tensor quantization parameter is specified, broadcast it along the + // quantization dimension (channels_out). + const float scale = is_per_channel ? filter_scales[i] : filter_scales[0]; + const double filter_scale = static_cast(scale); + const double effective_output_scale = static_cast(input_scale) * + filter_scale / + static_cast(output_scale); + int32_t significand; + int channel_shift; + QuantizeMultiplier(effective_output_scale, &significand, &channel_shift); + per_channel_multiplier[i] = significand; + per_channel_shift[i] = channel_shift; + } + + // Populate scalar quantization parameters. + // This check on legacy quantization parameters is kept only for backward + // compatibility. + if (input->type == kTfLiteUInt8) { + // Check bias scale == input scale * filter scale. + double real_multiplier = 0.0; + TF_LITE_ENSURE_STATUS(GetQuantizedConvolutionMultipler( + context, input, filter, bias, output, &real_multiplier)); + int exponent; + + // Populate quantization parameters with multiplier and shift. + QuantizeMultiplier(real_multiplier, multiplier, &exponent); + *shift = -exponent; + } + if (input->type == kTfLiteInt8 || input->type == kTfLiteUInt8 || + input->type == kTfLiteInt16) { + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, activation, output, output_activation_min, + output_activation_max)); + } + return kTfLiteOk; +} + +TfLiteStatus GetQuantizedConvolutionMultipler(TfLiteContext *context, + const TfLiteTensor *input, + const TfLiteTensor *filter, + const TfLiteTensor *bias, + TfLiteTensor *output, + double *multiplier) +{ + const double input_product_scale = static_cast(input->params.scale) * + static_cast(filter->params.scale); + // The following conditions must be guaranteed by the training pipeline. + if (bias) { + const double bias_scale = static_cast(bias->params.scale); + // Here we're making sure the input_product_scale & bias_scale are about the + // same. Since we have: + // (output - output_zp) * output_scale = + // input_product_scale * input_product + bias * bias_scale ---- (0) + // + // (0) equals: + // (input_product + bias) * input_product_scale ----- (1) + // + + // bias * (bias_scale - input_product_scale) ------ (2) + // + // For the real kernel computation, we're doing (1), so we really need to + // make sure (2) has minimum impact on the output, so: + // bias * (bias_scale - input_product_scale) / output_scale should be + // a small number for an integer. + // Since normally bias should be within a small range. + // We should expect (bias_scale - input_product_scale) / output_scale to + // be a small number like 0.02. + const double scale_diff = std::abs(input_product_scale - bias_scale); + const double output_scale = static_cast(output->params.scale); + + TF_LITE_ENSURE(context, scale_diff / output_scale <= 0.02); + } + return GetQuantizedConvolutionMultipler(context, input, filter, output, + multiplier); +} + +TfLiteStatus GetQuantizedConvolutionMultipler(TfLiteContext *context, + const TfLiteTensor *input, + const TfLiteTensor *filter, + TfLiteTensor *output, + double *multiplier) +{ + const double input_product_scale = + static_cast(input->params.scale * filter->params.scale); + TF_LITE_ENSURE(context, input_product_scale >= 0); + *multiplier = input_product_scale / static_cast(output->params.scale); + + return kTfLiteOk; +} + +namespace { + +inline TfLiteStatus Quantize(TfLiteContext *context, float scale, + int32_t zero_point, float f, int32_t &q) +{ + const float tmp = TfLiteRound(f / scale); + const bool no_integer_overflow_from_quantization = + (tmp >= static_cast(std::numeric_limits::min()) && + tmp <= static_cast(std::numeric_limits::max())); + TF_LITE_ENSURE(context, no_integer_overflow_from_quantization); + q = zero_point + static_cast(tmp); + return kTfLiteOk; +} + +TfLiteStatus CalculateActivationRangeQuantizedImpl( + TfLiteContext *context, TfLiteFusedActivation activation, int32_t qmin, + int32_t qmax, TfLiteTensor *output, int32_t *act_min, int32_t *act_max) +{ + const auto scale = output->params.scale; + const auto zero_point = output->params.zero_point; + + int32_t tmp_q; + if (activation == kTfLiteActRelu) { + TF_LITE_ENSURE_OK(context, + Quantize(context, scale, zero_point, 0.0, tmp_q)); + *act_min = std::max(qmin, tmp_q); + *act_max = qmax; + } else if (activation == kTfLiteActRelu6) { + TF_LITE_ENSURE_OK(context, + Quantize(context, scale, zero_point, 0.0, tmp_q)); + *act_min = std::max(qmin, tmp_q); + TF_LITE_ENSURE_OK(context, + Quantize(context, scale, zero_point, 6.0, tmp_q)); + *act_max = std::min(qmax, tmp_q); + } else if (activation == kTfLiteActReluN1To1) { + TF_LITE_ENSURE_OK(context, + Quantize(context, scale, zero_point, -1.0, tmp_q)); + *act_min = std::max(qmin, tmp_q); + TF_LITE_ENSURE_OK(context, + Quantize(context, scale, zero_point, 1.0, tmp_q)); + *act_max = std::min(qmax, tmp_q); + } else { + *act_min = qmin; + *act_max = qmax; + } + return kTfLiteOk; +} +} // namespace + +TfLiteStatus CalculateActivationRangeQuantized(TfLiteContext *context, + TfLiteFusedActivation activation, + TfLiteTensor *output, + int32_t *act_min, + int32_t *act_max) +{ + int32_t qmin = 0; + int32_t qmax = 0; + if (output->type == kTfLiteUInt8) { + qmin = std::numeric_limits::min(); + qmax = std::numeric_limits::max(); + } else if (output->type == kTfLiteInt8) { + qmin = std::numeric_limits::min(); + qmax = std::numeric_limits::max(); + } else if (output->type == kTfLiteInt16) { + qmin = std::numeric_limits::min(); + qmax = std::numeric_limits::max(); + } else { + TF_LITE_ENSURE(context, false); + } + + return CalculateActivationRangeQuantizedImpl(context, activation, qmin, qmax, + output, act_min, act_max); +} + +bool HaveSameShapes(const TfLiteTensor *input1, const TfLiteTensor *input2) +{ + return TfLiteIntArrayEqual(input1->dims, input2->dims); +} + +#ifndef TF_LITE_STATIC_MEMORY + +// TODO(b/172067338): Having this function be part of TF_LITE_STATIC_MEMORY +// build results in a 6KB size increase, even though the function is unsused for +// that build. What appears to be happening is that while the linker drops the +// unsused function, the string library that gets pulled in is not dropped, +// resulting in the increased binary size. +std::string GetShapeDebugString(const TfLiteIntArray *shape) +{ + std::string str; + for (int d = 0; d < shape->size; ++d) { + if (str.empty()) + str = "[" + std::to_string(shape->data[d]); + else + str += ", " + std::to_string(shape->data[d]); + } + str += "]"; + return str; +} + +TfLiteStatus CalculateShapeForBroadcast(TfLiteContext *context, + const TfLiteTensor *input1, + const TfLiteTensor *input2, + TfLiteIntArray **output_shape) +{ + int dims1 = NumDimensions(input1); + int dims2 = NumDimensions(input2); + int out_dims = std::max(dims1, dims2); + if (NumElements(input1) == 0) { + *output_shape = TfLiteIntArrayCopy(input1->dims); + return kTfLiteOk; + } + std::unique_ptr shape( + TfLiteIntArrayCreate(out_dims), TfLiteIntArrayFree); + for (int i = 0; i < out_dims; ++i) { + int d1 = i >= dims1 ? 1 : SizeOfDimension(input1, dims1 - i - 1); + int d2 = i >= dims2 ? 1 : SizeOfDimension(input2, dims2 - i - 1); + if (!(d1 == d2 || d1 == 1 || d2 == 1)) { + context->ReportError(context, + "Given shapes, %s and %s, are not broadcastable.", + GetShapeDebugString(input1->dims).c_str(), + GetShapeDebugString(input2->dims).c_str()); + return kTfLiteError; + } + shape->data[out_dims - i - 1] = std::max(d1, d2); + } + *output_shape = shape.release(); + return kTfLiteOk; +} + +TfLiteStatus CalculateShapeForBroadcast(TfLiteContext *context, + const TfLiteTensor *input1, + const TfLiteTensor *input2, + const TfLiteTensor *input3, + TfLiteIntArray **output_shape) +{ + int dims1 = NumDimensions(input1); + int dims2 = NumDimensions(input2); + int dims3 = NumDimensions(input3); + int out_dims = std::max(std::max(dims1, dims2), dims3); + std::unique_ptr shape( + TfLiteIntArrayCreate(out_dims), TfLiteIntArrayFree); + for (int i = 0; i < out_dims; ++i) { + int d1 = i >= dims1 ? 1 : SizeOfDimension(input1, dims1 - i - 1); + int d2 = i >= dims2 ? 1 : SizeOfDimension(input2, dims2 - i - 1); + int d3 = i >= dims3 ? 1 : SizeOfDimension(input3, dims3 - i - 1); + int max_value = std::max(std::max(d1, d2), d3); + if (!(d1 == 1 || d1 == max_value) || !(d2 == 1 || d2 == max_value) || + !(d3 == 1 || d3 == max_value)) { + context->ReportError( + context, "Given shapes, %s, %s and %s, are not broadcastable.", + GetShapeDebugString(input1->dims).c_str(), + GetShapeDebugString(input2->dims).c_str(), + GetShapeDebugString(input3->dims).c_str()); + return kTfLiteError; + } + shape->data[out_dims - i - 1] = max_value; + } + *output_shape = shape.release(); + return kTfLiteOk; +} +#endif // TF_LITE_STATIC_MEMORY + +// Size of string is not constant, return 0 in such case. +int TfLiteTypeGetSize(TfLiteType type) +{ + switch (type) { + case kTfLiteUInt8: + TF_LITE_ASSERT_EQ(sizeof(uint8_t), 1); + return 1; + case kTfLiteInt8: + TF_LITE_ASSERT_EQ(sizeof(int8_t), 1); + return 1; + case kTfLiteBool: + return sizeof(bool); + case kTfLiteInt16: + TF_LITE_ASSERT_EQ(sizeof(int16_t), 2); + return 2; + case kTfLiteFloat16: + TF_LITE_ASSERT_EQ(sizeof(int16_t), 2); + return 2; + case kTfLiteFloat32: + TF_LITE_ASSERT_EQ(sizeof(float), 4); + return 4; + case kTfLiteInt32: + TF_LITE_ASSERT_EQ(sizeof(int32_t), 4); + return 4; + case kTfLiteUInt32: + TF_LITE_ASSERT_EQ(sizeof(uint32_t), 4); + return 4; + case kTfLiteInt64: + TF_LITE_ASSERT_EQ(sizeof(int64_t), 8); + return 8; + case kTfLiteUInt64: + TF_LITE_ASSERT_EQ(sizeof(uint64_t), 8); + return 8; + case kTfLiteFloat64: + TF_LITE_ASSERT_EQ(sizeof(double), 8); + return 8; + case kTfLiteComplex64: + TF_LITE_ASSERT_EQ(sizeof(std::complex), 8); + return 8; + case kTfLiteComplex128: + TF_LITE_ASSERT_EQ(sizeof(std::complex), 16); + return 16; + default: + return 0; + } +} + +bool IsMobilePlatform() +{ +#if defined(ANDROID) || defined(__ANDROID__) + return true; +#elif defined(__APPLE__) +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE + return true; +#endif +#endif + return false; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.h b/components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.h new file mode 100644 index 00000000..47c7e466 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/kernel_util.h @@ -0,0 +1,315 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_KERNEL_UTIL_H_ +#define TENSORFLOW_LITE_KERNELS_KERNEL_UTIL_H_ + +#include + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" + +namespace tflite { +// A fair number of functions in this header have historically been inline. +// It is ok to change functions to not be inline if the latency with +// benchmark_model for MobileNet + MobileBERT is unaffected. If such a change is +// made, move the newly non-inlined function declarations to the top of this +// header file. + +// Note: You must check if result is not null: +// +// TfLiteTensor* my_tensor = GetInput(context, node, kMyTensorIdx); +// TF_LITE_ENSURE(context, my_tensor != nullptr); +// +// This is because the index might point to the optional tensor constant +// (kTfLiteOptionalTensor) in which case there is no tensor to return. +const TfLiteTensor *GetInput(const TfLiteContext *context, + const TfLiteNode *node, int index); + +// Same as `GetInput` but returns boolean and uses output argument for tensor. +// +// TfLiteTensor* my_tensor; +// TF_LITE_ENSURE_OK(context, +// GetInputSafe(context, node, kMyTensorIdx, &my_tensor)); +// // can use my_tensor directly from here onwards, it is not nullptr +// +// Should be used in cases where the binary size is too large. +TfLiteStatus GetInputSafe(const TfLiteContext *context, const TfLiteNode *node, + int index, const TfLiteTensor **tensor); + +// Note: You must check if result is not null: +// +// TfLiteTensor* my_tensor = GetVariableInput(context, node, kMyTensorIdx); +// TF_LITE_ENSURE(context, my_tensor != nullptr); +// +// This is because the index might point to the optional tensor constant +// (kTfLiteOptionalTensor) in which case there is no tensor to return. +TfLiteTensor *GetVariableInput(TfLiteContext *context, const TfLiteNode *node, + int index); + +// Note: You must check if result is not null: +// +// TfLiteTensor* my_tensor = GetOutput(context, node, kMyTensorIdx); +// TF_LITE_ENSURE(context, my_tensor != nullptr); +// +// This is because the index might point to the optional tensor constant +// (kTfLiteOptionalTensor) in which case there is no tensor to return. +TfLiteTensor *GetOutput(TfLiteContext *context, const TfLiteNode *node, + int index); + +// Same as `GetOutput` but returns boolean and uses output argument for tensor. +// +// TfLiteTensor* my_tensor; +// TF_LITE_ENSURE_OK(context, +// GetOutputSafe(context, node, kMyTensorIdx, &my_tensor)); +// // can use my_tensor directly from here onwards, it is not nullptr +// +// Should be used in cases where the binary size is too large. +TfLiteStatus GetOutputSafe(const TfLiteContext *context, const TfLiteNode *node, + int index, TfLiteTensor **tensor); + +// Note: You must check if result is not null: +// +// TfLiteTensor* my_tensor = GetOptionalInputTensor(context, node, kIdx); +// TF_LITE_ENSURE(context, my_tensor != nullptr); +// +// This is because the index might point to the optional tensor constant +// (kTfLiteOptionalTensor) in which case there is no tensor to return. +// +// Deprecated. GetInput has the same functionality. +const TfLiteTensor *GetOptionalInputTensor(const TfLiteContext *context, + const TfLiteNode *node, int index); + +#ifndef TF_LITE_STATIC_MEMORY +// Note: You must check if result is not null: +// +// TfLiteTensor* my_tensor = GetTemporary(context, node, kMyTensorIdx); +// TF_LITE_ENSURE(context, my_tensor != nullptr); +// +// This is because the index might point to the optional tensor constant +// (kTfLiteOptionalTensor) in which case there is no tensor to return. +TfLiteTensor *GetTemporary(TfLiteContext *context, const TfLiteNode *node, + int index); + +// Same as `GetTemporary` but returns boolean and uses output argument for +// tensor. +// +// TfLiteTensor* my_tensor; +// TF_LITE_ENSURE_OK(context, +// GetTemporarySafe(context, node, kMyTensorIdx, +// &my_tensor)); +// // can use my_tensor directly from here onwards, it is not nullptr +// +// Should be used in cases where the binary size is too large. +TfLiteStatus GetTemporarySafe(const TfLiteContext *context, + const TfLiteNode *node, int index, + TfLiteTensor **tensor); + +// Note: You must check if result is not null: +// +// TfLiteTensor* my_tensor = GetIntermediates(context, node, kMyTensorIdx); +// TF_LITE_ENSURE(context, my_tensor != nullptr); +// +// This is because the index might point to the optional tensor constant +// (kTfLiteOptionalTensor) in which case there is no tensor to return. +const TfLiteTensor *GetIntermediates(TfLiteContext *context, + const TfLiteNode *node, int index); + +// Same as `GetIntermediates` but returns boolean and uses output argument for +// tensor. +// +// TfLiteTensor* my_tensor; +// TF_LITE_ENSURE_OK(context, +// GetIntermediatesSafe(context, node, kMyTensorIdx, +// &my_tensor)); +// // can use my_tensor directly from here onwards, it is not nullptr +// +// Should be used in cases where the binary size is too large. +TfLiteStatus GetIntermediatesSafe(const TfLiteContext *context, + const TfLiteNode *node, int index, + TfLiteTensor **tensor); +#endif // TF_LITE_STATIC_MEMORY + +inline int NumDimensions(const TfLiteTensor *t) +{ + return t->dims->size; +} +inline int SizeOfDimension(const TfLiteTensor *t, int dim) +{ + return t->dims->data[dim]; +} + +inline int NumInputs(const TfLiteNode *node) +{ + return node->inputs->size; +} +inline int NumOutputs(const TfLiteNode *node) +{ + return node->outputs->size; +} + +#ifndef TF_LITE_STATIC_MEMORY +inline int NumIntermediates(const TfLiteNode *node) +{ + return node->intermediates->size; +} +#endif // TF_LITE_STATIC_MEMORY + +inline int64_t NumElements(const TfLiteIntArray *dims) +{ + int64_t count = 1; + for (int i = 0; i < dims->size; ++i) { + count *= dims->data[i]; + } + return count; +} + +inline int64_t NumElements(const TfLiteTensor *t) +{ + return NumElements(t->dims); +} + +// Determines whether tensor is constant. +// TODO(b/138199592): Introduce new query which checks for constant OR +// persistent-read-only, which would be useful for most tensor kernels that +// are potentially dynamic based on the input tensor value availability at the +// time of prepare. +inline bool IsConstantTensor(const TfLiteTensor *tensor) +{ + return tensor->allocation_type == kTfLiteMmapRo; +} + +// Determines whether tensor is dynamic. Note that a tensor can be non-const and +// not dynamic. This function specifically checks for a dynamic tensor. +inline bool IsDynamicTensor(const TfLiteTensor *tensor) +{ + return tensor->allocation_type == kTfLiteDynamic; +} + +// Sets tensor to dynamic. +inline void SetTensorToDynamic(TfLiteTensor *tensor) +{ + if (tensor->allocation_type != kTfLiteDynamic) { + tensor->allocation_type = kTfLiteDynamic; + tensor->data.raw = nullptr; + } +} + +// Sets tensor to persistent and read-only. +inline void SetTensorToPersistentRo(TfLiteTensor *tensor) +{ + if (tensor->allocation_type != kTfLitePersistentRo) { + tensor->allocation_type = kTfLitePersistentRo; + tensor->data.raw = nullptr; + } +} + +// Determines whether it is a hybrid op - one that has float inputs and +// quantized weights. +inline bool IsHybridOp(const TfLiteTensor *input, const TfLiteTensor *weight) +{ + return ((weight->type == kTfLiteUInt8 || weight->type == kTfLiteInt8) && + input->type == kTfLiteFloat32); +} + +// Check dimensionality match and populate OpData for Conv and DepthwiseConv. +TfLiteStatus PopulateConvolutionQuantizationParams( + TfLiteContext *context, const TfLiteTensor *input, + const TfLiteTensor *filter, const TfLiteTensor *bias, TfLiteTensor *output, + const TfLiteFusedActivation &activation, int32_t *multiplier, int *shift, + int32_t *output_activation_min, int32_t *output_activation_max, + int32_t *per_channel_multiplier, int32_t *per_channel_shift); + +TfLiteStatus PopulateConvolutionQuantizationParams( + TfLiteContext *context, const TfLiteTensor *input, + const TfLiteTensor *filter, const TfLiteTensor *bias, TfLiteTensor *output, + const TfLiteFusedActivation &activation, int32_t *multiplier, int *shift, + int32_t *output_activation_min, int32_t *output_activation_max, + int32_t *per_channel_multiplier, int32_t *per_channel_shift, + int num_channels); + +// Calculates the multiplication factor for a quantized convolution (or +// quantized depthwise convolution) involving the given tensors. Returns an +// error if the scales of the tensors are not compatible. +TfLiteStatus GetQuantizedConvolutionMultipler(TfLiteContext *context, + const TfLiteTensor *input, + const TfLiteTensor *filter, + const TfLiteTensor *bias, + TfLiteTensor *output, + double *multiplier); + +TfLiteStatus GetQuantizedConvolutionMultipler(TfLiteContext *context, + const TfLiteTensor *input, + const TfLiteTensor *filter, + TfLiteTensor *output, + double *multiplier); + +// Calculates the useful quantized range of an activation layer given its +// activation tensor. +TfLiteStatus CalculateActivationRangeQuantized(TfLiteContext *context, + TfLiteFusedActivation activation, + TfLiteTensor *output, + int32_t *act_min, + int32_t *act_max); + +// Calculates the useful range of an activation layer given its activation +// tensor.a +template +void CalculateActivationRange(TfLiteFusedActivation activation, + T *activation_min, T *activation_max) +{ + if (activation == kTfLiteActRelu) { + *activation_min = 0; + *activation_max = std::numeric_limits::max(); + } else if (activation == kTfLiteActRelu6) { + *activation_min = 0; + *activation_max = 6; + } else if (activation == kTfLiteActReluN1To1) { + *activation_min = -1; + *activation_max = 1; + } else { + *activation_min = std::numeric_limits::lowest(); + *activation_max = std::numeric_limits::max(); + } +} + +// Return true if the given tensors have the same shape. +bool HaveSameShapes(const TfLiteTensor *input1, const TfLiteTensor *input2); + +// Calculates the output_shape that is necessary for element-wise operations +// with broadcasting involving the two input tensors. +TfLiteStatus CalculateShapeForBroadcast(TfLiteContext *context, + const TfLiteTensor *input1, + const TfLiteTensor *input2, + TfLiteIntArray **output_shape); + +// Calculates the output_shape that is necessary for element-wise operations +// with broadcasting involving the three input tensors. +TfLiteStatus CalculateShapeForBroadcast(TfLiteContext *context, + const TfLiteTensor *input1, + const TfLiteTensor *input2, + const TfLiteTensor *input3, + TfLiteIntArray **output_shape); + +// Return the size of given type in bytes. Return 0 in in case of string. +int TfLiteTypeGetSize(TfLiteType type); + +// Whether the current platform is mobile (Android or iOS). +bool IsMobilePlatform(); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_KERNEL_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/op_macros.h b/components/TensorFlowLite/tensorflow/lite/kernels/op_macros.h new file mode 100644 index 00000000..51ccd204 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/op_macros.h @@ -0,0 +1,86 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_OP_MACROS_H_ +#define TENSORFLOW_LITE_KERNELS_OP_MACROS_H_ + +// If we're on a platform without standard IO functions, fall back to a +// non-portable function. +#ifdef TF_LITE_MCU_DEBUG_LOG + +#include "tensorflow/lite/micro/debug_log.h" + +#define DEBUG_LOG(x) \ + do { \ + DebugLog(x); \ + } while (0) + +inline void InfiniteLoop() +{ + DEBUG_LOG("HALTED\n"); + while (1) { + } +} + +#define TFLITE_ABORT InfiniteLoop(); + +#else // TF_LITE_MCU_DEBUG_LOG + +#include +#include + +#define DEBUG_LOG(x) \ + do { \ + fprintf(stderr, "%s", (x)); \ + } while (0) + +// Report Error for unsupported type by op 'op_name' and returns kTfLiteError. +#define TF_LITE_UNSUPPORTED_TYPE(context, type, op_name) \ + do { \ + TF_LITE_KERNEL_LOG((context), "%s:%d Type %s is unsupported by op %s.", \ + __FILE__, __LINE__, TfLiteTypeGetName(type), \ + (op_name)); \ + return kTfLiteError; \ + } while (0) + +#define TFLITE_ABORT abort() + +#endif // TF_LITE_MCU_DEBUG_LOG + +#if defined(NDEBUG) || defined(ARDUINO) +#define TFLITE_ASSERT_FALSE (static_cast(0)) +#else +#define TFLITE_ASSERT_FALSE TFLITE_ABORT +#endif + +#define TF_LITE_FATAL(msg) \ + do { \ + DEBUG_LOG(msg); \ + DEBUG_LOG("\nFATAL\n"); \ + TFLITE_ABORT; \ + } while (0) + +#define TF_LITE_ASSERT(x) \ + do { \ + if (!(x)) \ + TF_LITE_FATAL(#x); \ + } while (0) + +#define TF_LITE_ASSERT_EQ(x, y) \ + do { \ + if ((x) != (y)) \ + TF_LITE_FATAL(#x " didn't equal " #y); \ + } while (0) + +#endif // TENSORFLOW_LITE_KERNELS_OP_MACROS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/kernels/padding.h b/components/TensorFlowLite/tensorflow/lite/kernels/padding.h new file mode 100644 index 00000000..6a956406 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/kernels/padding.h @@ -0,0 +1,120 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_KERNELS_PADDING_H_ +#define TENSORFLOW_LITE_KERNELS_PADDING_H_ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +inline int ComputePadding(int stride, int dilation_rate, int in_size, + int filter_size, int out_size) +{ + int effective_filter_size = (filter_size - 1) * dilation_rate + 1; + int padding = ((out_size - 1) * stride + effective_filter_size - in_size) / 2; + return padding > 0 ? padding : 0; +} + +// It's not guaranteed that padding is symmetric. It's important to keep +// offset for algorithms need all paddings. +inline int ComputePaddingWithOffset(int stride, int dilation_rate, int in_size, + int filter_size, int out_size, + int *offset) +{ + int effective_filter_size = (filter_size - 1) * dilation_rate + 1; + int total_padding = + ((out_size - 1) * stride + effective_filter_size - in_size); + total_padding = total_padding > 0 ? total_padding : 0; + *offset = total_padding % 2; + return total_padding / 2; +} + +// Matching GetWindowedOutputSize in TensorFlow. +inline int ComputeOutSize(TfLitePadding padding, int image_size, + int filter_size, int stride, int dilation_rate = 1) +{ + int effective_filter_size = (filter_size - 1) * dilation_rate + 1; + + // TODO(b/186448822): This uses 0 since the function has no other way to + // report error case + if (stride == 0) + return 0; + + switch (padding) { + case kTfLitePaddingSame: + return (image_size + stride - 1) / stride; + case kTfLitePaddingValid: + return (image_size + stride - effective_filter_size) / stride; + default: + return 0; + } +} + +inline TfLitePaddingValues ComputePaddingHeightWidth( + int stride_height, int stride_width, int dilation_rate_height, + int dilation_rate_width, int in_height, int in_width, int filter_height, + int filter_width, TfLitePadding padding, int *out_height, int *out_width) +{ + *out_width = ComputeOutSize(padding, in_width, filter_width, stride_width, + dilation_rate_width); + *out_height = ComputeOutSize(padding, in_height, filter_height, stride_height, + dilation_rate_height); + + TfLitePaddingValues padding_values; + int offset = 0; + padding_values.height = + ComputePaddingWithOffset(stride_height, dilation_rate_height, in_height, + filter_height, *out_height, &offset); + padding_values.height_offset = offset; + padding_values.width = + ComputePaddingWithOffset(stride_width, dilation_rate_width, in_width, + filter_width, *out_width, &offset); + padding_values.width_offset = offset; + return padding_values; +} + +inline Padding3DValues ComputePadding3DValues( + int stride_height, int stride_width, int stride_depth, + int dilation_rate_height, int dilation_rate_width, int dilation_rate_depth, + int in_height, int in_width, int in_depth, int filter_height, + int filter_width, int filter_depth, TfLitePadding padding, int *out_height, + int *out_width, int *out_depth) +{ + *out_width = ComputeOutSize(padding, in_width, filter_width, stride_width, + dilation_rate_width); + *out_height = ComputeOutSize(padding, in_height, filter_height, stride_height, + dilation_rate_height); + *out_depth = ComputeOutSize(padding, in_depth, filter_depth, stride_depth, + dilation_rate_depth); + + Padding3DValues padding_values; + int offset = 0; + padding_values.depth = + ComputePaddingWithOffset(stride_depth, dilation_rate_depth, in_depth, + filter_depth, *out_depth, &offset); + padding_values.depth_offset = offset; + padding_values.height = + ComputePaddingWithOffset(stride_height, dilation_rate_height, in_height, + filter_height, *out_height, &offset); + padding_values.height_offset = offset; + padding_values.width = + ComputePaddingWithOffset(stride_width, dilation_rate_width, in_width, + filter_width, *out_width, &offset); + padding_values.width_offset = offset; + return padding_values; +} +} // namespace tflite + +#endif // TENSORFLOW_LITE_KERNELS_PADDING_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/CONTRIBUTING.md b/components/TensorFlowLite/tensorflow/lite/micro/CONTRIBUTING.md new file mode 100644 index 00000000..1e4b85f6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/CONTRIBUTING.md @@ -0,0 +1,378 @@ + + + + + + * [Contributing Guidelines](#contributing-guidelines) + * [General Pull Request Guidelines](#general-pull-request-guidelines) + * [Guidelines for Specific Contribution Categories](#guidelines-for-specific-contribution-categories) + * [Bug Fixes](#bug-fixes) + * [Reference Kernel Implementations](#reference-kernel-implementations) + * [Optimized Kernel Implementations](#optimized-kernel-implementations) + * [New Target / Platform / IDE / Examples](#new-target--platform--ide--examples) + * [New Features](#new-features) + * [Development Workflow Notes](#development-workflow-notes) + * [Initial Setup](#initial-setup) + * [Before submitting your PR](#before-submitting-your-pr) + * [During the PR review](#during-the-pr-review) + * [Reviewer notes](#reviewer-notes) + * [Python notes](#python-notes) + * [Continuous Integration System](#continuous-integration-system) + + + + + +# Contributing Guidelines + +We look forward to your contributions to the TensorFlow Lite Micro codebase and +provide guidelines with the goal of enabling community contributions while still +maintaining code health, maintainability, and consistency in style. + +Please note that while these guidelines may seem onerous to some developers, +they are derived from Google's software engineering best practices. + +Before we describe project-specific guidelines, we recommend that external +contributors read these tips from the Google Testing Blog: + +* [Code Health: Providing Context with Commit Messages and Bug Reports](https://testing.googleblog.com/2017/09/code-health-providing-context-with.html) +* [Code Health: Understanding Code In Review](https://testing.googleblog.com/2018/05/code-health-understanding-code-in-review.html) +* [Code Health: Too Many Comments on Your Code Reviews?](https://testing.googleblog.com/2017/06/code-health-too-many-comments-on-your.html) +* [Code Health: To Comment or Not to Comment?](https://testing.googleblog.com/2017/07/code-health-to-comment-or-not-to-comment.html) + +We also recommend that contributors take a look at the +[Tensorflow Contributing Guidelines](https://github.com/tensorflow/tensorflow/blob/master/CONTRIBUTING.md). + +## General Pull Request Guidelines + +We strongly recommend that contributors: + +1. Initiate a conversation with the TFLM team via a + [TF Lite Micro Github issue](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md) + as early as possible. + + * This enables us to give guidance on how to proceed, prevent duplicated + effort and also point to alternatives as well as context if we are not + able to accept a particular contribution at a given time. + + * Ideally, you should make an issue ***before*** starting to work on a + pull request and provide context on both what you want to contribute and + why. + +1. Once step 1. is complete and it is determined that a PR from an external + contributor is the way to go, please follow these guidelines from + [Google's Engineering Practices documentation](https://google.github.io/eng-practices/): + + * [Send Small Pull Requests](https://google.github.io/eng-practices/review/developer/small-cls.html) + + * If a pull request is doing more than one thing, the reviewer will + request that it be broken up into two or more PRs. + + * [Write Good Pull Request Descriptions](https://google.github.io/eng-practices/review/developer/cl-descriptions.html) + + * We require that all PR descriptions link to the github issue created + in step 1. + + * While github offers flexibility in linking + [commits and issues](https://github.blog/2011-04-09-issues-2-0-the-next-generation/#commits-issues), + we require that the PR description have a separate line with either + `Fixes #nn` (if the PR fixes the issue) or `Issue #nn` if the PR + addresses some aspect of an issue without fixing it. + + * We will be adding internal checks that automate this requirement by + matching the PR description to the regexp: `(Fixes|Issue) #` + +1. Unit tests are critical to a healthy codebase. PRs without tests should be + the exception rather than the norm. And contributions to improve, simplify, + or make the unit tests more exhaustive are welcome! Please refer to + [this guideline](https://google.github.io/eng-practices/review/developer/small-cls.html#test_code) + on how test code and writing small PRs should be reconciled. + +## Guidelines for Specific Contribution Categories + +We provide some additional guidelines for different categories of contributions. + +### Bug Fixes + +Pull requests that fix bugs are always welcome and often uncontroversial, unless +there is a conflict between different requirements from the platform, or if +fixing a bug needs a bigger architectural change. + +1. Create a + [TF Lite Micro Github issue](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md) + to determine the scope of the bug fix. +1. Send a PR (if that is determined to be the best path forward). +1. Bugfix PRs should be accompanied by a test case that fails prior to the fix + and passes with the fix. This validates that the fix works as expected, and + helps prevent future regressions. + +### Reference Kernel Implementations + +Pull requests that port reference kernels from TF Lite Mobile to TF Lite Micro +are welcome once we have enough context from the contributor on why the +additional kernel is needed. + +1. Please create a + [TF Lite Micro Github issue](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md) + before starting on any such PRs with as much context as possible, such as: + + * What is the model architecture? + * What is the application that you are targetting? + * What embedded target(s) are you planning to run on? + * Motivate your use-case and the need for adding support for this + additional OP. + +1. In the interest of having + [small pull requests](https://google.github.io/eng-practices/review/developer/small-cls.html), + limit each pull request to porting a single kernel (and the corresponding + test). + +1. TODO(b/165627437): Create and link to a guide to porting reference ops. + +### Optimized Kernel Implementations + +In order to have the TFLM codebase be a central repository of optimized kernel +implementations, we would like to make some improvements to the current +infrastructure to enable adding and maintaining optimized kernel implementations +in a scalable way. + +Until that work is complete, we are requesting a ***pause*** on contributions that +add new optimized kernel implementations. We plan to make these improvements by +October 2020 and will provide additional guidelines at that time. + +* If you would like to have an exception to this pause, with the understanding + that your optimized kernels will break as we improve the underlying + framework, then please send an email to the [SIG Micro email + group](https://groups.google.com/a/tensorflow.org/g/micro) to figure out + a middle ground. + +* Every optimized kernel directory must have a README.md with the github IDs + of the maintainers and any other relevant documentation. PRs that add + maintainers to the existing optimized kernels are always welcome. + +### New Target / Platform / IDE / Examples + +As discussed in the +[SIG-micro Aug 12, 2020 meeting](http://doc/1YHq9rmhrOUdcZnrEnVCWvd87s2wQbq4z17HbeRl-DBc), +we are currently ***pausing*** accepting pull requests that add new targets, +platforms, IDE integration or examples while we revisit some of the +infrastructure to enable us to make this process easier and more scalable. + +In the meantime, snapshotting and/or forking the tensorflow repo could be a +viable way to prototype platform support. + +Having said that, we still invite +[TF Lite Micro Github issues](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md) +on this topic as we would like to enable such integration in the future. + +### New Features + +As discussed in the +[SIG-micro Aug 12, 2020 meeting](http://doc/1YHq9rmhrOUdcZnrEnVCWvd87s2wQbq4z17HbeRl-DBc), +we are currently ***pausing*** accepting pull requests that add new features while +we revisit some of the infrastructure to enable us to make this process easier +and more scalable. + +Having said that, we still invite feature requests via +[TF Lite Micro Github issues](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md) +to determine if the requested feature aligns with the TFLM roadmap. + +# Development Workflow Notes + +## Initial Setup + +Below are some tips that might be useful and improve the development experience. + +* Add the [Refined GitHub](https://github.com/sindresorhus/refined-github) + plugin to make the github experience even better. + +* Code search the [TfLite Micro codebase](https://sourcegraph.com/github.com/tensorflow/tensorflow@master/-/tree/tensorflow/lite/micro) + on Sourcegraph. And optionally install the [plugin that enables GitHub integration](https://docs.sourcegraph.com/integration/github#github-integration-with-sourcegraph). + +* Install [bazel](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/ci_build/install/install_bazel.sh) and [buildifier](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/ci_build/install/install_buildifier.sh). + +* Install the latest clang and clang-format. For example, + [here](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/ci_build/Dockerfile.micro) + is the what we do for the TFLM continuous integration Docker container. + +* Get a copy of [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint) + +* Add a git hook to check for code style etc. prior to creating a pull request: + ``` + cp tensorflow/lite/micro/tools/dev_setup/pre-push.tflm .git/hooks/pre-push + ``` + +## Before submitting your PR + +1. Run in-place clang-format on all the files that are modified in your git + tree with + + ``` + clang-format -i -style=google `git ls-files -m | grep "\.cc"` + clang-format -i -style=google `git ls-files -m | grep "\.h"` + ``` + +1. Make sure your code is lint-free. + + ``` + cpplint.py `git ls-files -m` + ``` + +1. Run all the tests for x86, and any other platform that you are modifying. + + ``` + tensorflow/lite/micro/tools/ci_build/test_x86.sh + ``` + + Please check the READMEs in the optimized kernel directories for specific + instructions. + +1. Sometimes, bugs are caught by the sanitizers that can go unnoticed + via the Makefile. To run a test with the different sanitizers, use the + following commands (replace `micro_interpreter_test` with the target that you + want to test: + + ``` + CC=clang bazel run --config=asan tensorflow/lite/micro:micro_interpreter_test + CC=clang bazel run --config=msan tensorflow/lite/micro:micro_interpreter_test + CC=clang bazel run --config=ubsan tensorflow/lite/micro:micro_interpreter_test + ``` + +## During the PR review + +1. Do not change the git version history. + + * Always merge upstream/master (***do not rebase***) and no force-pushes + please. + + * Having an extra merge commit it ok as the github review tool handles + that gracefully. + + Assuming that you forked tensorflow and added a remote called upstream with: + + `git remote add upstream https://github.com/tensorflow/tensorflow.git` + + Fetch the latest changes from upstream and merge into your local branch. + + ``` + git fetch upstream + git merge upstream/master + ``` + + In case of a merge conflict, resolve via: + + ``` + git mergetool + + # Use your favorite diff tools (e.g. meld) to resolve the conflicts. + + git add + + git commit + ``` + +1. If a force push seems to be the only path forward, please stop and let your + PR reviewer know ***before*** force pushing. We will attempt to do the merge + for you. This will also help us better understand in what conditions a + force-push may be unavoidable. + +## Reviewer notes + +* [GIthub CLI](https://cli.github.com) can be useful to quickly checkout a PR + to test locally. + + `gh pr checkout ` + +* Google engineers on the Tensorflow team will have the permissions to push + edits to most PRs. This can be useful to make some small fixes as a result + of errors due to internal checks that are not easily reproducible via + github. + + One example of this is + [this comment](https://github.com/tensorflow/tensorflow/pull/38634#issuecomment-683190474). + + And a sketch of the steps: + + ``` + git remote add git@github.com:/tensorflow.git + git fetch + + git checkout -b / + + # make changes and commit to local branch + + # push changes to remove branch + + git push + + # remove the temp remote to clean up your git environment. + + git remote rm + ``` + +## Python notes + +Most PRs for TensorFlow Lite Micro will be C++ only. Adding some notes on Python +that can be expanded and improved as necessary. + +* [TensorFlow guide](https://www.tensorflow.org/community/contribute/code_style#python_style) + for Python development + +* [yapf](https://github.com/google/yapf/) should be used for formatting. + + ``` + yapf log_parser.py -i --style='{based_on_style: pep8, indent_width: 2}' + ``` + +# Continuous Integration System + +* As a contributor, please make sure that the TfLite Micro build is green. + You can click on the details link to see what the errors are: + +[![TfLite Micro Build](docs/images/tflm_continuous_integration_1.png)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/tflite-micro.html) + +* Tests that are run as part of the CI are with the + [micro/tools/ci_build/test_all.sh](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/tools/ci_build/test_all.sh) + script when run with the `GITHUB_PRESUBMIT` command line parameter: + ``` + tensorflow/lite/micro/tools/ci_build/test_all.sh GITHUB_PRESUBMIT + ``` + +* If an error is not reproducible on your development machine, you can + recreate the docker container that is used on the CI servers. + + * First, create a build a TFLM docker image with: + ``` + tensorflow/tools/ci_build/ci_build.sh micro bash + ``` + The second parameter to the ci_build.sh script is not important. It can + be any command. + + * Next, mount the tensorflow repo on your machine to the docker container. + Please be careful (or make a separate clone of tensorflow) since any + changes docker container will also be reflected in the directory in the + host machine. + ``` + docker run -v `pwd`:/tensorflow -it tf_ci.micro bash + # cd tensorflow + ``` + + * If you would prefer to not mount your local folder on the docker image, + you can also simply download the branch: + ``` + docker run -it tf_ci.micro bash + # wget https://github.com//tensorflow/archive/.zip + # unzip .zip + # cd tensorflow- + ``` + + * Within the docker container, you can now run the TFLM test script, or + any other command that you would like to test. For example, the following + commands will run all of the TFLM checks: + ``` + # tensorflow/lite/micro/tools/ci_build/test_all.sh GITHUB_PRESUBMIT + ``` + diff --git a/components/TensorFlowLite/tensorflow/lite/micro/README.md b/components/TensorFlowLite/tensorflow/lite/micro/README.md new file mode 100644 index 00000000..0a8f7ce1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/README.md @@ -0,0 +1,76 @@ + + + + + + * [TensorFlow Lite for Microcontrollers](#tensorflow-lite-for-microcontrollers) + * [Continuous Build Status](#continuous-build-status) + * [Official Builds](#official-builds) + * [Community Supported Builds](#community-supported-builds) + * [Getting Help and Involved](#getting-help-and-involved) + * [Additional Documentation](#additional-documentation) + + + + + +# TensorFlow Lite for Microcontrollers + +TensorFlow Lite for Microcontrollers is a port of TensorFlow Lite designed to +run machine learning models on microcontrollers and other devices with only +kilobytes of memory. + +To learn how to use the framework, visit the developer documentation at +[tensorflow.org/lite/microcontrollers](https://www.tensorflow.org/lite/microcontrollers). + +# Continuous Build Status + +## Official Builds +Build Type | Status | Artifacts +---------- | ----------- | --------- +Linux | [![Status](https://storage.googleapis.com/tensorflow-kokoro-build-badges/tflite-micro.svg)](https://storage.googleapis.com/tensorflow-kokoro-build-badges/tflite-micro.html) | + +## Community Supported Builds +Build Type | Status | Artifacts +---------- | ----------- | --------- +Arduino | [![Status](https://github.com/antmicro/tensorflow-arduino-examples/actions/workflows/test_examples.yml/badge.svg)](https://github.com/antmicro/tensorflow-arduino-examples/actions/workflows/test_examples.yml) | +Xtensa | [![Status](https://github.com/advaitjain/tensorflow/blob/local-continuous-builds/tensorflow/lite/micro/docs/local_continuous_builds/xtensa-build-status.svg)](https://github.com/advaitjain/tensorflow/tree/local-continuous-builds/tensorflow/lite/micro/docs/local_continuous_builds/xtensa.md) | + + +# Getting Help and Involved + +A +[TF Lite Micro Github issue](https://github.com/tensorflow/tensorflow/issues/new?labels=comp%3Amicro&template=70-tflite-micro-issue.md) +should be the primary method of getting in touch with the TensorFlow Lite Micro +(TFLM) team. + +The following resources may also be useful: + +1. SIG Micro [email group](https://groups.google.com/a/tensorflow.org/g/micro) + and + [monthly meetings](http://doc/1YHq9rmhrOUdcZnrEnVCWvd87s2wQbq4z17HbeRl-DBc). + +1. SIG Micro [gitter chat room](https://gitter.im/tensorflow/sig-micro). + +If you are interested in contributing code to TensorFlow Lite for +Microcontrollers then please read our [contributions guide](CONTRIBUTING.md). + +# Additional Documentation + +For developers that are interested in more details of the internals of the +project, we have additional documentation in the [docs](docs/) folder. + +* [Benchmarks](benchmarks/README.md) +* [Profiling](docs/profiling.md) +* [Memory Management](docs/memory_management.md) +* [Optimized Kernel Implementations](docs/optimized_kernel_implementations.md) +* [New Platform Support](docs/new_platform_support.md) +* [Software Emulation with Renode](docs/renode.md) + +# RFCs + +1. [Pre-allocated tensors](docs/rfc/001_preallocated_tensors.md) +1. [TensorFlow Lite for Microcontrollers Port of 16x8 Quantized Operators](docs/rfc/002_16x8_quantization_port.md) diff --git a/components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.cc b/components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.cc new file mode 100644 index 00000000..df05fdf1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.cc @@ -0,0 +1,100 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/all_ops_resolver.h" + +#include "tensorflow/lite/micro/kernels/micro_ops.h" + +namespace tflite { + +AllOpsResolver::AllOpsResolver() +{ + // Please keep this list of Builtin Operators in alphabetical order. + AddAbs(); + AddAdd(); + AddAddN(); + AddArgMax(); + AddArgMin(); + AddAveragePool2D(); + AddBatchToSpaceNd(); + AddCeil(); + AddConcatenation(); + AddConv2D(); + AddCos(); + AddCumSum(); + AddDepthToSpace(); + AddDepthwiseConv2D(); + AddDequantize(); + AddDetectionPostprocess(); + AddElu(); + AddEqual(); + AddEthosU(); + AddFloor(); + AddFloorDiv(); + AddFloorMod(); + AddFullyConnected(); + AddGreater(); + AddGreaterEqual(); + AddHardSwish(); + AddL2Normalization(); + AddL2Pool2D(); + AddLeakyRelu(); + AddLess(); + AddLessEqual(); + AddLog(); + AddLogicalAnd(); + AddLogicalNot(); + AddLogicalOr(); + AddLogistic(); + AddMaxPool2D(); + AddMaximum(); + AddMean(); + AddMinimum(); + AddMul(); + AddNeg(); + AddNotEqual(); + AddPack(); + AddPad(); + AddPadV2(); + AddPrelu(); + AddQuantize(); + AddReduceMax(); + AddRelu(); + AddRelu6(); + AddReshape(); + AddResizeBilinear(); + AddResizeNearestNeighbor(); + AddRound(); + AddRsqrt(); + AddShape(); + AddSin(); + AddSoftmax(); + AddSpaceToBatchNd(); + AddSpaceToDepth(); + AddSplit(); + AddSplitV(); + AddSqrt(); + AddSquare(); + AddSqueeze(); + AddStridedSlice(); + AddSub(); + AddSvdf(); + AddTanh(); + AddTransposeConv(); + AddTranspose(); + AddUnpack(); +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.h b/components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.h new file mode 100644 index 00000000..f19a7fdf --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/all_ops_resolver.h @@ -0,0 +1,37 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_ALL_OPS_RESOLVER_H_ +#define TENSORFLOW_LITE_MICRO_ALL_OPS_RESOLVER_H_ + +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" + +namespace tflite { +// The magic number in the template parameter is the maximum number of ops that +// can be added to AllOpsResolver. It can be increased if needed. And most +// applications that care about the memory footprint will want to directly use +// MicroMutableOpResolver and have an application specific template parameter. +// The examples directory has sample code for this. +class AllOpsResolver : public MicroMutableOpResolver<128> { +public: + AllOpsResolver(); + +private: + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_ALL_OPS_RESOLVER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/README.md b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/README.md new file mode 100644 index 00000000..7ee59780 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/README.md @@ -0,0 +1,98 @@ +# TFLite for Microcontrollers Benchmarks + +These benchmarks are for measuring the performance of key models and workloads. +They are meant to be used as part of the model optimization process for a given +platform. + +## Table of contents + +- [Keyword Benchmark](#keyword-benchmark) +- [Person Detection Benchmark](#person-detection-benchmark) +- [Run on x86](#run-on-x86) +- [Run on Xtensa XPG Simulator](#run-on-xtensa-xpg-simulator) +- [Run on Sparkfun Edge](#run-on-sparkfun-edge) +- [Run on FVP based on Arm Corstone-300 software](#run-on-fvp-based-on-arm-corstone-300-software) + +## Keyword benchmark + +The keyword benchmark contains a model for keyword detection with scrambled +weights and biases. This model is meant to test performance on a platform only. +Since the weights are scrambled, the output is meaningless. In order to validate +the accuracy of optimized kernels, please run the kernel tests. + +## Person detection benchmark + +The keyword benchmark provides a way to evaluate the performance of the 250KB +visual wakewords model. + +## Run on x86 + +To run the keyword benchmark on x86, run + +``` +make -f tensorflow/lite/micro/tools/make/Makefile run_keyword_benchmark +``` + +To run the person detection benchmark on x86, run + +``` +make -f tensorflow/lite/micro/tools/make/Makefile run_person_detection_benchmark +``` + +## Run on Xtensa XPG Simulator + +To run the keyword benchmark on the Xtensa XPG simulator, you will need a valid +Xtensa toolchain and license. With these set up, run: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=xtensa OPTIMIZED_KERNEL_DIR=xtensa TARGET_ARCH= XTENSA_CORE= run_keyword_benchmark -j18 +``` + +## Run on Sparkfun Edge +The following instructions will help you build and deploy this benchmark on the +[SparkFun Edge development board](https://sparkfun.com/products/15170). + + +If you're new to using this board, we recommend walking through the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab to get an understanding of the workflow. + +Build binary using + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge person_detection_benchmark_bin +``` + +Refer to flashing instructions in the [Person Detection Example](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/person_detection/README.md#running-on-sparkfun-edge). + +## Run on FVP based on Arm Corstone-300 software + +For more info about the Corstone-300 software see: +[tensorflow/lite/micro/cortex_m_corstone_300/README.md](../cortex_m_corstone_300/README.md). + +Disclaimer: Executing the benchmark test on the Corstone-300 software will +provide a general metric of instructions executed. The estimates are not cycle +accurate, however it aligns to instruction per cycle, and is a consistent +environment. This means it can detect if code changes changed performance. + +The person detection benchmark can also run with Ethos-U enabled, as the +downloaded model will be optimized for Ethos-U. For more info see: +[tensorflow/lite/micro/kernels/ethos_u/README.md](../kernels/ethos_u/README.md). + +To run the keyword benchmark on FVP: + +``` +make -j -f tensorflow/lite/micro/tools/make/Makefile TARGET=cortex_m_corstone_300 TARGET_ARCH=cortex-m55 run_keyword_benchmark +``` + +To run the person detection benchmark on FVP: + +``` +make -j -f tensorflow/lite/micro/tools/make/Makefile TARGET=cortex_m_corstone_300 TARGET_ARCH=cortex-m55 run_person_detection_benchmark +``` + +To run the person detection benchmark on FVP with Ethos-U: + +``` +make -j -f tensorflow/lite/micro/tools/make/Makefile CO_PROCESSOR=ethos_u TARGET=cortex_m_corstone_300 TARGET_ARCH=cortex-m55 run_person_detection_benchmark +``` diff --git a/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_benchmark.cc b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_benchmark.cc new file mode 100644 index 00000000..1bde360c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_benchmark.cc @@ -0,0 +1,111 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h" +#include "tensorflow/lite/micro/benchmarks/micro_benchmark.h" +#include "tensorflow/lite/micro/kernels/fully_connected.h" +#include "tensorflow/lite/micro/kernels/softmax.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/micro/system_setup.h" + +/* + * Keyword Spotting Benchmark for performance optimizations. The model used in + * this benchmark only serves as a reference. The values assigned to the model + * weights and parameters are not representative of the original model. + */ + +namespace tflite { + +using KeywordBenchmarkRunner = MicroBenchmarkRunner; +using KeywordOpResolver = MicroMutableOpResolver<6>; + +#if defined(HEXAGON) +// TODO(b/174781826): reduce arena usage for optimized Hexagon kernels. +constexpr int kOptimizedKernelArenaIncrement = 21000; +#else +constexpr int kOptimizedKernelArenaIncrement = 0; +#endif + +// Create an area of memory to use for input, output, and intermediate arrays. +// Align arena to 16 bytes to avoid alignment warnings on certain platforms. +constexpr int kTensorArenaSize = 21 * 1024 + kOptimizedKernelArenaIncrement; +alignas(16) uint8_t tensor_arena[kTensorArenaSize]; + +uint8_t benchmark_runner_buffer[sizeof(KeywordBenchmarkRunner)]; +uint8_t op_resolver_buffer[sizeof(KeywordOpResolver)]; + +// Initialize benchmark runner instance explicitly to avoid global init order +// issues on Sparkfun. Use new since static variables within a method +// are automatically surrounded by locking, which breaks bluepill and stm32f4. +KeywordBenchmarkRunner *CreateBenchmarkRunner(MicroProfiler *profiler) +{ + // We allocate the KeywordOpResolver from a global buffer because the object's + // lifetime must exceed that of the KeywordBenchmarkRunner object. + KeywordOpResolver *op_resolver = new (op_resolver_buffer) KeywordOpResolver(); + op_resolver->AddFullyConnected(tflite::Register_FULLY_CONNECTED_INT8()); + op_resolver->AddQuantize(); + op_resolver->AddSoftmax(tflite::Register_SOFTMAX_INT8_INT16()); + op_resolver->AddSvdf(); + + return new (benchmark_runner_buffer) + KeywordBenchmarkRunner(g_keyword_scrambled_model_data, op_resolver, + tensor_arena, kTensorArenaSize, profiler); +} + +void KeywordRunNIerations(int iterations, const char *tag, + KeywordBenchmarkRunner &benchmark_runner, + MicroProfiler &profiler) +{ + int32_t ticks = 0; + for (int i = 0; i < iterations; ++i) { + benchmark_runner.SetRandomInput(i); + profiler.ClearEvents(); + benchmark_runner.RunSingleIteration(); + ticks += profiler.GetTotalTicks(); + } + MicroPrintf("%s took %d ticks (%d ms)", tag, ticks, TicksToMs(ticks)); +} + +} // namespace tflite + +int main(int argc, char **argv) +{ + tflite::InitializeTarget(); + tflite::MicroProfiler profiler; + + uint32_t event_handle = profiler.BeginEvent("InitializeKeywordRunner"); + tflite::KeywordBenchmarkRunner *benchmark_runner = + CreateBenchmarkRunner(&profiler); + profiler.EndEvent(event_handle); + profiler.Log(); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + tflite::KeywordRunNIerations(1, "KeywordRunNIerations(1)", *benchmark_runner, + profiler); + profiler.Log(); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + tflite::KeywordRunNIerations(10, "KeywordRunNIerations(10)", + *benchmark_runner, profiler); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + benchmark_runner->PrintAllocations(); +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.cc new file mode 100644 index 00000000..ff39ac22 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.cc @@ -0,0 +1,2904 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h" + +// Keep model aligned to 8 bytes to guarantee aligned 64-bit accesses. +alignas(8) const unsigned char g_keyword_scrambled_model_data[] = { + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xa8, 0x85, 0x00, 0x00, 0x5c, 0x6f, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x48, 0x6f, 0x00, 0x00, 0x2c, 0x57, 0x00, 0x00, + 0x18, 0x53, 0x00, 0x00, 0x04, 0x52, 0x00, 0x00, 0xf0, 0x4d, 0x00, 0x00, + 0x9c, 0x4d, 0x00, 0x00, 0x88, 0x49, 0x00, 0x00, 0x74, 0x45, 0x00, 0x00, + 0x60, 0x44, 0x00, 0x00, 0x4c, 0x40, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, + 0xe4, 0x3b, 0x00, 0x00, 0xd0, 0x37, 0x00, 0x00, 0xbc, 0x36, 0x00, 0x00, + 0xa8, 0x32, 0x00, 0x00, 0x54, 0x32, 0x00, 0x00, 0x40, 0x2e, 0x00, 0x00, + 0x2c, 0x2a, 0x00, 0x00, 0x18, 0x29, 0x00, 0x00, 0x04, 0x25, 0x00, 0x00, + 0xb0, 0x24, 0x00, 0x00, 0x9c, 0x22, 0x00, 0x00, 0x88, 0x1a, 0x00, 0x00, + 0xf4, 0x19, 0x00, 0x00, 0xe0, 0x15, 0x00, 0x00, 0xcc, 0x0d, 0x00, 0x00, + 0x38, 0x0d, 0x00, 0x00, 0x24, 0x09, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, + 0x7c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x8a, 0x90, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x34, 0xe1, 0x4f, 0xa1, 0x63, 0xa4, 0x62, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x90, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa3, 0xb2, 0x8f, 0xee, + 0x35, 0xe6, 0xf2, 0xcc, 0x68, 0xa0, 0x33, 0xc4, 0x7d, 0x4e, 0xbb, 0xa9, + 0x10, 0x32, 0x8e, 0x3d, 0x76, 0x14, 0x1c, 0x33, 0x0e, 0x77, 0xf7, 0xc8, + 0x7b, 0x45, 0xc7, 0xdb, 0xcf, 0x87, 0xc7, 0x70, 0xa9, 0x29, 0xfd, 0x70, + 0x32, 0x96, 0x35, 0x7d, 0xe9, 0xac, 0x6d, 0x9b, 0xfd, 0xe4, 0xbc, 0x4a, + 0x57, 0xcd, 0x43, 0xcc, 0x73, 0x72, 0xdf, 0x07, 0x68, 0xc5, 0x67, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0xfa, 0x90, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0xb0, 0xfb, 0x5f, 0xdf, 0x0e, 0xb9, 0xa2, 0xfd, + 0x66, 0x86, 0x13, 0x1b, 0x6d, 0x1d, 0x53, 0xdb, 0x83, 0xbf, 0x44, 0x29, + 0x3f, 0x93, 0xee, 0x42, 0x9a, 0xf4, 0x31, 0x6e, 0xc3, 0x15, 0x7e, 0x48, + 0x72, 0x50, 0xc3, 0x53, 0xef, 0x35, 0x1f, 0xc2, 0x29, 0x42, 0xb4, 0xd7, + 0x4b, 0xd7, 0x98, 0x60, 0xb9, 0x3e, 0xbb, 0x31, 0x35, 0xc3, 0xf6, 0x15, + 0x7a, 0x9a, 0x2c, 0xfd, 0xff, 0x04, 0xd9, 0x04, 0x57, 0x52, 0xae, 0x99, + 0xa3, 0x95, 0xae, 0x6a, 0x66, 0x52, 0x5f, 0x91, 0x17, 0x83, 0x0d, 0x27, + 0x16, 0x02, 0x06, 0x64, 0x80, 0x05, 0x99, 0x1c, 0x6c, 0xab, 0xb1, 0xa1, + 0x0e, 0x44, 0x1f, 0x63, 0xe9, 0xc1, 0xab, 0x8d, 0x08, 0x79, 0x56, 0xe0, + 0x90, 0xa5, 0xb8, 0x3b, 0xc4, 0x1e, 0xa5, 0x1f, 0x64, 0xe4, 0x0b, 0x72, + 0x62, 0x19, 0x5f, 0x66, 0xc0, 0x9b, 0x7b, 0xc4, 0xe5, 0x9f, 0x82, 0xa7, + 0x00, 0x00, 0x00, 0x00, 0x8a, 0x91, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x3e, 0x3d, 0xf4, 0x61, 0x45, 0x2a, 0x48, 0x53, + 0x1f, 0x22, 0x74, 0x65, 0xea, 0x5a, 0x00, 0x83, 0x68, 0xf9, 0xbb, 0xa3, + 0xc2, 0x1a, 0x8f, 0xe1, 0xfb, 0x76, 0x6a, 0xe9, 0x1a, 0x0e, 0x4d, 0x32, + 0xc6, 0xf3, 0x8d, 0x85, 0x54, 0xa1, 0xe9, 0xb8, 0x35, 0xee, 0xba, 0x53, + 0x40, 0xa2, 0xea, 0x7f, 0xc3, 0x99, 0x71, 0x17, 0xdd, 0xd5, 0xfe, 0xdf, + 0x5e, 0x15, 0xa0, 0x73, 0xf8, 0x78, 0x49, 0x73, 0xcc, 0xf0, 0x18, 0x12, + 0x06, 0x81, 0xd6, 0x19, 0x2c, 0xa8, 0xd7, 0x80, 0x19, 0x19, 0xbf, 0x1e, + 0x50, 0xb1, 0xfb, 0xb3, 0xa6, 0x56, 0x6f, 0x52, 0xa6, 0xc0, 0xdd, 0x3f, + 0xbb, 0x13, 0x6e, 0x04, 0xdf, 0x79, 0xca, 0x8b, 0xa5, 0x9c, 0xa1, 0x78, + 0x49, 0xca, 0xe5, 0x29, 0xbb, 0x29, 0x7c, 0x96, 0xc6, 0x29, 0x06, 0x99, + 0xec, 0x50, 0xd1, 0xe8, 0x9b, 0xb7, 0x53, 0xd2, 0x36, 0x89, 0xb1, 0x5c, + 0x38, 0xf4, 0x2f, 0xa1, 0xda, 0x6f, 0xd8, 0xd1, 0x62, 0xd2, 0xd4, 0x97, + 0xce, 0xf1, 0xbd, 0x73, 0x2d, 0x92, 0xdb, 0x62, 0x0c, 0xb0, 0x77, 0xed, + 0x32, 0x3a, 0xfc, 0x59, 0x94, 0xef, 0x2b, 0x48, 0x60, 0xb2, 0x82, 0xa2, + 0xb6, 0x51, 0xdb, 0x51, 0x47, 0x99, 0x4c, 0x50, 0x93, 0x53, 0x9d, 0xa9, + 0x3c, 0x94, 0x34, 0x9f, 0xa6, 0x3e, 0x4f, 0x87, 0xd4, 0xa0, 0x40, 0xeb, + 0x7b, 0xfa, 0x1b, 0x7d, 0x03, 0xa8, 0xf8, 0x8b, 0xa5, 0x32, 0x3a, 0xaf, + 0x7e, 0x6b, 0x25, 0x08, 0x97, 0x71, 0x8d, 0x0c, 0x30, 0xc9, 0xa7, 0x23, + 0xe3, 0x51, 0xb3, 0xf2, 0x86, 0xad, 0x12, 0xe2, 0x79, 0x94, 0x7f, 0xf3, + 0xf7, 0x88, 0x67, 0x3e, 0x8e, 0x8e, 0x04, 0x5e, 0x4f, 0x01, 0x6f, 0x1d, + 0x78, 0x42, 0x9e, 0x47, 0x81, 0xdf, 0x03, 0x39, 0x3d, 0x9b, 0xbd, 0xb6, + 0x06, 0x21, 0x82, 0xfe, 0xf2, 0x50, 0xe1, 0x14, 0xbc, 0xe3, 0x5e, 0xe1, + 0xbd, 0x8f, 0xfa, 0x35, 0x31, 0x4e, 0x66, 0xeb, 0x67, 0x49, 0x1c, 0x07, + 0x88, 0xb6, 0x22, 0x0c, 0xeb, 0xd9, 0x9f, 0x9b, 0x8b, 0xe0, 0x9c, 0x3c, + 0xf7, 0x91, 0xab, 0x98, 0x5b, 0x0e, 0x09, 0xdd, 0xe3, 0x0b, 0x14, 0x55, + 0xe9, 0xe4, 0x42, 0xd8, 0xce, 0xd7, 0xfd, 0x4c, 0x20, 0x9f, 0x44, 0x93, + 0xa6, 0x17, 0x8a, 0x68, 0x8f, 0xec, 0x62, 0xd1, 0x97, 0x9c, 0xcc, 0xc4, + 0xd9, 0x42, 0xda, 0xf1, 0x34, 0x04, 0xc6, 0xb6, 0x0f, 0xc7, 0xe6, 0x2d, + 0x26, 0x6e, 0x6f, 0x92, 0x7e, 0xd9, 0xd4, 0x40, 0xc6, 0x70, 0xfa, 0x12, + 0x2a, 0x1b, 0xbc, 0x50, 0xeb, 0x3b, 0x24, 0x96, 0x8d, 0x7c, 0xae, 0xbe, + 0xc3, 0x27, 0xce, 0x97, 0xcf, 0xcd, 0x10, 0x13, 0x01, 0xc6, 0x48, 0x6a, + 0x99, 0x38, 0x79, 0xb9, 0x1c, 0xc9, 0x09, 0xac, 0x96, 0x8c, 0xf7, 0x82, + 0x8f, 0xb8, 0x17, 0x94, 0x2c, 0x5f, 0x40, 0xcc, 0x80, 0xf4, 0x9f, 0xaa, + 0xcb, 0x83, 0x13, 0x7b, 0x3a, 0x78, 0x0a, 0x9f, 0x79, 0x9e, 0xfc, 0x0e, + 0x8f, 0x98, 0x60, 0x39, 0x86, 0x44, 0x8e, 0x4b, 0xc4, 0xad, 0xe6, 0x98, + 0x92, 0x08, 0x84, 0x48, 0x8f, 0x1d, 0x78, 0x10, 0x9e, 0xf7, 0xb8, 0x61, + 0x65, 0x46, 0xdb, 0x4a, 0xcf, 0xc5, 0x37, 0xe3, 0x77, 0x76, 0xcf, 0x0a, + 0x7e, 0x72, 0x3f, 0xe4, 0x51, 0x30, 0x28, 0x57, 0x13, 0xfd, 0xdb, 0x7e, + 0xd6, 0xa3, 0xdd, 0x64, 0xdd, 0x00, 0xd0, 0x7f, 0xbc, 0x48, 0x1d, 0xaf, + 0xde, 0x0e, 0x45, 0xc4, 0xc9, 0xfa, 0xf6, 0xb2, 0xb7, 0x9a, 0x42, 0x8b, + 0x18, 0x08, 0xed, 0xdb, 0xa9, 0xc3, 0x32, 0xf1, 0x9c, 0xcf, 0x16, 0x74, + 0x57, 0xce, 0xe9, 0x44, 0x21, 0xdb, 0x8a, 0x45, 0x89, 0x70, 0x41, 0x5c, + 0xbf, 0x10, 0xdf, 0x83, 0x4a, 0xe4, 0x4c, 0xd8, 0xc9, 0x2e, 0x5b, 0xa3, + 0x05, 0xed, 0x73, 0xb1, 0xb0, 0xb7, 0xc4, 0xd7, 0x0d, 0xea, 0xf6, 0xb4, + 0xc1, 0x5e, 0x12, 0x54, 0x30, 0x73, 0x5c, 0x93, 0xd9, 0xf7, 0xc9, 0x24, + 0x43, 0x8f, 0x4f, 0x8e, 0x94, 0x95, 0xb6, 0xfd, 0xa3, 0x14, 0x42, 0x50, + 0xb8, 0x66, 0xfb, 0xc4, 0xed, 0x72, 0xcf, 0x7b, 0xa9, 0x73, 0xeb, 0xc4, + 0x4a, 0x05, 0xea, 0xb4, 0x47, 0xca, 0x21, 0x56, 0x28, 0xa8, 0x87, 0xb8, + 0x87, 0x0b, 0xe3, 0x8d, 0xfd, 0x70, 0xf7, 0x33, 0x76, 0xf0, 0x3d, 0xa4, + 0x3b, 0x83, 0xab, 0x14, 0x01, 0xe1, 0xb0, 0xa9, 0x44, 0xe8, 0xd7, 0x50, + 0x26, 0x0b, 0xbb, 0x2d, 0x57, 0x39, 0x82, 0x7c, 0x71, 0xd8, 0x12, 0xaf, + 0xf3, 0x9f, 0x46, 0xbd, 0x62, 0xd6, 0x61, 0xf5, 0xb7, 0x04, 0x94, 0xbf, + 0x87, 0xea, 0xc4, 0xc4, 0x33, 0xcf, 0x36, 0x3b, 0x4f, 0xc7, 0x71, 0xf1, + 0x98, 0xe6, 0xb0, 0x96, 0x25, 0xd7, 0xac, 0x75, 0xfc, 0x92, 0xe0, 0x69, + 0x72, 0x37, 0x8d, 0x40, 0x31, 0xaa, 0x2c, 0x86, 0xfb, 0x95, 0x3f, 0x9c, + 0x23, 0xd4, 0x39, 0x99, 0xff, 0xea, 0x95, 0x79, 0xb9, 0x2e, 0xb0, 0x33, + 0xf1, 0xe8, 0xd0, 0x42, 0xb5, 0x70, 0x5c, 0xca, 0x69, 0x48, 0x28, 0x23, + 0x58, 0xb4, 0x07, 0xfc, 0x3e, 0x15, 0x29, 0x00, 0xa9, 0x22, 0x44, 0x70, + 0xd0, 0xc7, 0x01, 0x0d, 0x3e, 0xfc, 0x57, 0xb7, 0x54, 0x3a, 0xc3, 0x43, + 0xd6, 0x2f, 0x55, 0x09, 0x52, 0x4a, 0x6b, 0x8e, 0x4c, 0x82, 0xbb, 0x4e, + 0x3e, 0x38, 0xe1, 0x9e, 0x72, 0x83, 0xec, 0x40, 0xf5, 0xf7, 0x0e, 0x3c, + 0x24, 0xed, 0xda, 0xf2, 0x39, 0x6c, 0xad, 0xeb, 0xff, 0xfb, 0x4a, 0x38, + 0x50, 0x49, 0x28, 0x3d, 0x05, 0xb2, 0x98, 0x44, 0x2b, 0x61, 0xa2, 0x9b, + 0x3a, 0x3c, 0xad, 0xd9, 0x8c, 0xef, 0x3c, 0x72, 0x50, 0x74, 0x13, 0x80, + 0xc4, 0x7e, 0x6e, 0xf3, 0xc9, 0xdf, 0x63, 0xf6, 0x41, 0xb2, 0x08, 0x78, + 0x9b, 0x7c, 0xa9, 0x13, 0xd1, 0x21, 0xe7, 0x5e, 0x6a, 0x0d, 0x64, 0xf7, + 0x52, 0x75, 0xf2, 0x80, 0x69, 0xbe, 0x43, 0xf8, 0xd4, 0xad, 0x49, 0xfc, + 0x97, 0x76, 0x1c, 0xb6, 0x43, 0x9e, 0xcb, 0x45, 0x4d, 0x75, 0x07, 0xae, + 0xdb, 0xbf, 0xf5, 0x8a, 0xeb, 0xb9, 0x6b, 0x12, 0x06, 0xbf, 0x94, 0xad, + 0x77, 0x29, 0xb1, 0xae, 0x24, 0x9b, 0x4d, 0xdc, 0xe1, 0x5e, 0xd7, 0x57, + 0xec, 0xd1, 0xd8, 0xad, 0xf0, 0x06, 0x08, 0x43, 0x33, 0x99, 0xd2, 0x04, + 0xfc, 0xc8, 0xf6, 0x53, 0x3d, 0x73, 0xd4, 0x36, 0xd3, 0x8e, 0x4a, 0xcd, + 0xb1, 0xe9, 0xcb, 0x3a, 0x5f, 0x54, 0xbc, 0xde, 0x16, 0xa2, 0x85, 0xde, + 0x35, 0x27, 0x99, 0x32, 0x4f, 0xb9, 0x2c, 0x16, 0xa2, 0x6e, 0xae, 0x75, + 0x60, 0x77, 0xe9, 0x08, 0x0f, 0x08, 0xc4, 0xd0, 0x62, 0xc7, 0xd2, 0x1f, + 0x3b, 0x29, 0xdd, 0xb7, 0xea, 0xa3, 0x58, 0xaf, 0x4c, 0x05, 0xd2, 0x82, + 0x6a, 0xe0, 0xc4, 0xe9, 0x70, 0x7e, 0xf2, 0xca, 0x82, 0x6a, 0xae, 0xc1, + 0x9a, 0x42, 0x5d, 0x46, 0x4a, 0xb7, 0x8f, 0x4d, 0x33, 0xfe, 0x6f, 0x47, + 0xb5, 0x49, 0xb3, 0x89, 0x51, 0x31, 0x74, 0x68, 0x14, 0xda, 0x0a, 0x41, + 0x3d, 0x1f, 0x8e, 0x30, 0x8c, 0x77, 0xd1, 0xa9, 0x36, 0x41, 0x78, 0x34, + 0xb7, 0x7e, 0x4e, 0x7a, 0x77, 0x12, 0x43, 0x97, 0x43, 0xba, 0xd6, 0x28, + 0x14, 0x2a, 0x9f, 0x98, 0xb4, 0x39, 0x08, 0x5c, 0xb7, 0xb8, 0x03, 0x63, + 0x62, 0x68, 0xc6, 0x9a, 0x4d, 0xf5, 0xdc, 0x7c, 0x0f, 0x7e, 0x77, 0xdc, + 0x85, 0x53, 0x31, 0x8c, 0x53, 0x8b, 0x27, 0xc4, 0xb7, 0x3d, 0xd0, 0x94, + 0x9b, 0x7e, 0x59, 0x59, 0x03, 0x09, 0x8c, 0x30, 0x70, 0x7d, 0x9c, 0x73, + 0x89, 0x6c, 0x5f, 0xbf, 0xf9, 0xc7, 0x72, 0x76, 0x12, 0x98, 0xe3, 0xbe, + 0xc3, 0x67, 0xdf, 0xa1, 0x76, 0xa3, 0xec, 0x44, 0x30, 0x70, 0x2f, 0x6a, + 0x86, 0x28, 0xb9, 0x9d, 0x7f, 0x93, 0xf2, 0x4a, 0x34, 0x48, 0x1f, 0x2e, + 0x2e, 0x95, 0x88, 0xdb, 0x1f, 0x2c, 0x19, 0x46, 0x2e, 0x91, 0x5f, 0x81, + 0x0d, 0x08, 0x9d, 0x03, 0x0b, 0xaf, 0x59, 0x0a, 0x41, 0xad, 0x4d, 0x6c, + 0x09, 0x0e, 0x9f, 0xd1, 0xc4, 0xdb, 0xac, 0x59, 0x27, 0x04, 0x1c, 0x73, + 0xe9, 0xf3, 0xe8, 0x54, 0xd9, 0x11, 0x31, 0xb2, 0xed, 0x2d, 0x8c, 0xeb, + 0x99, 0x26, 0x48, 0x9e, 0xac, 0x88, 0x96, 0xcb, 0x19, 0x49, 0xfa, 0x4a, + 0x82, 0xd5, 0x5d, 0xb8, 0x0f, 0x22, 0x3f, 0xb6, 0x5c, 0x02, 0x2a, 0xb9, + 0xd9, 0xfe, 0x4d, 0x9d, 0xdb, 0x85, 0x90, 0x19, 0x7f, 0x1a, 0x44, 0xa3, + 0x74, 0x68, 0xbf, 0xa2, 0x3b, 0xb4, 0x3b, 0xeb, 0xab, 0x99, 0xc2, 0x46, + 0x50, 0x7e, 0xec, 0xa9, 0xb4, 0x86, 0xfa, 0x50, 0xcb, 0x71, 0x7e, 0x75, + 0xa5, 0xca, 0xa6, 0x2f, 0x40, 0x1d, 0xa1, 0x4a, 0x5c, 0x91, 0xd7, 0x2a, + 0xa6, 0x17, 0x11, 0x4d, 0x19, 0x2b, 0xb3, 0x0f, 0xf0, 0xb3, 0x06, 0x70, + 0x51, 0x5c, 0x52, 0x8c, 0xdf, 0xe3, 0x19, 0x92, 0x08, 0x40, 0xa2, 0xb4, + 0xc0, 0xf2, 0xe8, 0x44, 0xcc, 0x36, 0xaa, 0xf9, 0xf8, 0xfc, 0x2d, 0x83, + 0x79, 0xc6, 0x58, 0xc1, 0xdf, 0x32, 0xb7, 0xde, 0x0f, 0x3e, 0xc0, 0xa8, + 0x7e, 0xeb, 0xf2, 0x30, 0x16, 0xdf, 0x38, 0xcb, 0x69, 0xd9, 0x44, 0x0d, + 0x44, 0xf4, 0x45, 0x9c, 0x81, 0xc8, 0xe7, 0x06, 0xae, 0x95, 0xaf, 0xff, + 0x17, 0x3b, 0x1c, 0x3f, 0xda, 0xa5, 0xf8, 0xfd, 0x9c, 0xf1, 0x0a, 0xca, + 0xda, 0xc0, 0xfa, 0x02, 0xc4, 0xce, 0x78, 0xfb, 0x35, 0x8c, 0xfe, 0x55, + 0xad, 0x0d, 0x9b, 0xeb, 0x10, 0xf1, 0x7b, 0xb1, 0x09, 0xf8, 0xef, 0xfc, + 0xde, 0x7a, 0x69, 0x74, 0x76, 0xef, 0x91, 0x64, 0x33, 0xc4, 0x08, 0x15, + 0x73, 0x85, 0x56, 0xae, 0x9c, 0xf6, 0xdd, 0x55, 0x19, 0x96, 0xe6, 0x41, + 0x12, 0xc9, 0x87, 0x91, 0x9e, 0xc6, 0x18, 0xe8, 0xbf, 0xa0, 0x59, 0xfd, + 0x20, 0xab, 0xb5, 0xcf, 0x0f, 0x6e, 0x30, 0xd3, 0xc5, 0x70, 0xf2, 0x50, + 0xa4, 0x2a, 0xdf, 0xb0, 0x45, 0xfc, 0x82, 0x1a, 0x3b, 0xfe, 0x0c, 0xad, + 0x41, 0x95, 0xf1, 0xd6, 0x85, 0xa2, 0xc9, 0xff, 0xbe, 0x3a, 0x64, 0x70, + 0x43, 0xc0, 0xc5, 0xc8, 0x80, 0x11, 0x0d, 0x20, 0xcd, 0xf2, 0xa2, 0xbb, + 0x43, 0x68, 0x0e, 0xf4, 0x01, 0xb3, 0x73, 0x79, 0x9f, 0x68, 0x41, 0x63, + 0x3e, 0xda, 0xf9, 0xf4, 0x23, 0x57, 0x97, 0x84, 0x99, 0xe8, 0x5e, 0xdb, + 0xaa, 0x24, 0xab, 0x9c, 0x40, 0x83, 0xf9, 0x3f, 0x4f, 0x5a, 0x53, 0xa6, + 0xf1, 0xe8, 0x95, 0xcf, 0xcb, 0x50, 0x13, 0x51, 0xa7, 0x8c, 0x71, 0x1d, + 0xff, 0xcc, 0x66, 0xab, 0xff, 0xca, 0xc5, 0xc3, 0x73, 0x45, 0xb7, 0x21, + 0x1d, 0x65, 0x7a, 0xe5, 0x1f, 0x3f, 0x1a, 0x58, 0x23, 0x28, 0xc8, 0xf3, + 0xbf, 0x98, 0x25, 0xc0, 0x83, 0x68, 0xf0, 0x62, 0x63, 0x90, 0xcf, 0x1f, + 0x20, 0xb8, 0x04, 0x5c, 0xc4, 0x80, 0x5b, 0xf4, 0x6d, 0xdc, 0xe9, 0xac, + 0xd8, 0x13, 0x3b, 0x42, 0xf8, 0x4e, 0xa2, 0x1c, 0xce, 0x3f, 0x8d, 0x15, + 0xd3, 0x87, 0x1b, 0x44, 0x79, 0x52, 0x34, 0x4b, 0x63, 0x4d, 0xbf, 0x95, + 0xec, 0xae, 0xf9, 0xc6, 0x7b, 0x7b, 0x85, 0x8c, 0x4f, 0x20, 0x58, 0x9d, + 0x48, 0x03, 0x2f, 0x77, 0x2e, 0x8b, 0x6f, 0x66, 0x76, 0xb9, 0xb8, 0xb7, + 0x34, 0x5a, 0x63, 0x06, 0x85, 0x82, 0x5f, 0x23, 0x8f, 0x8d, 0x0c, 0x92, + 0x3b, 0xd2, 0x8a, 0x1b, 0x39, 0xee, 0x6a, 0xbc, 0xf6, 0x94, 0x2a, 0xc6, + 0x73, 0xa6, 0x99, 0x98, 0xdc, 0x96, 0xd7, 0xc1, 0xfe, 0x9b, 0xc8, 0xfb, + 0x86, 0x5a, 0xad, 0xce, 0xf8, 0xd5, 0x32, 0x62, 0x96, 0x63, 0xaf, 0x4c, + 0x4a, 0xae, 0xec, 0x26, 0x3d, 0x84, 0x69, 0x50, 0x5f, 0x37, 0x9b, 0x29, + 0xac, 0x15, 0x76, 0x3d, 0x33, 0x96, 0x06, 0xde, 0xc1, 0x6d, 0xa2, 0xc7, + 0xc3, 0x8a, 0x20, 0x2e, 0xf7, 0x08, 0x55, 0x83, 0x23, 0x9c, 0x23, 0x2d, + 0x3a, 0xa1, 0x32, 0xbc, 0x47, 0x48, 0xd5, 0x6a, 0x71, 0xb9, 0xcc, 0x2d, + 0x99, 0xa0, 0x37, 0x07, 0x46, 0x45, 0xbe, 0xf0, 0x27, 0x5a, 0x25, 0x72, + 0x58, 0x47, 0x6d, 0xbf, 0x23, 0xdc, 0x48, 0x44, 0x45, 0x95, 0xb1, 0x62, + 0xf1, 0x7e, 0x4c, 0x95, 0x1c, 0xb4, 0x17, 0x8b, 0x59, 0x2e, 0xf3, 0x4f, + 0x45, 0x3b, 0x5d, 0x67, 0x92, 0x52, 0xd8, 0xc1, 0x91, 0xfa, 0x53, 0xaa, + 0x87, 0xc0, 0xa7, 0xb0, 0x9f, 0x10, 0xe8, 0xac, 0x45, 0x52, 0xbb, 0x17, + 0xee, 0xf6, 0x18, 0xbe, 0x02, 0x70, 0xce, 0x79, 0x66, 0x72, 0xf9, 0xf6, + 0xca, 0x66, 0xff, 0xa4, 0x9a, 0xd9, 0xb7, 0x07, 0xa9, 0xc1, 0x23, 0x7e, + 0x7b, 0x9c, 0xe3, 0x02, 0x7a, 0xcc, 0xa3, 0x67, 0xb7, 0xb0, 0x37, 0xba, + 0xae, 0x12, 0xda, 0x48, 0x6e, 0x7f, 0xde, 0x5f, 0x75, 0x15, 0xca, 0xd2, + 0x46, 0xdd, 0xb0, 0x82, 0xbf, 0x6d, 0xe9, 0x51, 0x66, 0xa5, 0x9e, 0x0c, + 0xd5, 0x03, 0xbd, 0x97, 0x0e, 0x1b, 0x88, 0xf6, 0x61, 0x5a, 0x8b, 0xe0, + 0xdd, 0x3e, 0x59, 0x4c, 0x35, 0xfd, 0xb0, 0x3b, 0x79, 0x8c, 0x1c, 0x96, + 0x97, 0x35, 0x62, 0x36, 0x62, 0x4c, 0x4b, 0x46, 0xb1, 0x21, 0xf7, 0xf0, + 0x34, 0xdc, 0xd9, 0x9f, 0xf8, 0x53, 0x7d, 0xca, 0xbc, 0x4d, 0xaf, 0xf4, + 0xb7, 0x2f, 0xa7, 0x5d, 0x18, 0xf9, 0x3b, 0xa9, 0xb0, 0xbb, 0xdf, 0xfa, + 0x28, 0x2b, 0x58, 0xce, 0x46, 0x01, 0x3f, 0x76, 0xf2, 0x39, 0x45, 0x8b, + 0x3c, 0xda, 0x62, 0x2b, 0x6b, 0xe1, 0x5f, 0x14, 0xfc, 0x79, 0x17, 0x2d, + 0xe2, 0xe5, 0x8c, 0xc5, 0xde, 0x91, 0xfd, 0xf5, 0x6d, 0x9b, 0x6b, 0xbb, + 0xb0, 0x13, 0xae, 0xbe, 0x1e, 0xa8, 0x8f, 0x3c, 0xfd, 0x24, 0xbe, 0xb8, + 0x39, 0x80, 0x03, 0x06, 0x8b, 0xff, 0xca, 0x90, 0x88, 0x0f, 0x45, 0xc4, + 0xeb, 0x50, 0x52, 0xf5, 0x00, 0x8c, 0x16, 0x9d, 0x26, 0xaa, 0xec, 0xb1, + 0x44, 0xd6, 0xfe, 0x67, 0xa3, 0xc1, 0xec, 0x4a, 0x12, 0xa6, 0x7c, 0x7c, + 0xc3, 0x46, 0x1c, 0x64, 0x61, 0x67, 0xec, 0xce, 0x1e, 0xa2, 0xb4, 0xdd, + 0x6e, 0x7f, 0x02, 0x14, 0xf4, 0x1c, 0x17, 0xa7, 0x31, 0x9f, 0xc2, 0xc6, + 0xc0, 0x21, 0x41, 0x88, 0x61, 0xd8, 0xca, 0x06, 0xa5, 0xe4, 0xef, 0xa4, + 0xaa, 0x4d, 0xa3, 0xad, 0x5f, 0xd4, 0x0c, 0x6b, 0x14, 0x38, 0x2e, 0xe8, + 0x87, 0x5a, 0x68, 0x10, 0x51, 0xd8, 0xbb, 0xa6, 0xd9, 0xdc, 0xd3, 0x7f, + 0x1f, 0xea, 0xa8, 0xcc, 0x3f, 0x43, 0xa4, 0x04, 0x95, 0xb4, 0xde, 0x2f, + 0x07, 0x5d, 0x91, 0x1c, 0x8e, 0xc3, 0xbc, 0xaa, 0x46, 0x8a, 0xa8, 0x42, + 0xa7, 0x2c, 0x0f, 0x1f, 0xb3, 0xe2, 0x8a, 0x0b, 0xa0, 0x3f, 0xfb, 0x87, + 0x9e, 0x42, 0xa5, 0x60, 0xce, 0x5a, 0x54, 0x91, 0x26, 0x51, 0xea, 0x81, + 0x6f, 0xf1, 0x54, 0x93, 0xe7, 0xa0, 0xf8, 0x64, 0xab, 0x1d, 0x0d, 0x9d, + 0x64, 0x6a, 0xd5, 0x19, 0x03, 0xbb, 0x94, 0x7f, 0x0a, 0xb8, 0x6b, 0x87, + 0xc3, 0x1a, 0x38, 0xe5, 0xe8, 0xba, 0x13, 0x17, 0xeb, 0x13, 0xcc, 0xac, + 0xcb, 0x1f, 0x96, 0x4c, 0x3b, 0x18, 0xfb, 0xe8, 0x5c, 0x54, 0xce, 0x1a, + 0x91, 0x44, 0xf5, 0x49, 0x6c, 0x38, 0x2a, 0x92, 0x8a, 0x0d, 0x3d, 0x08, + 0xc2, 0x5f, 0x6c, 0xac, 0x48, 0xb3, 0xdc, 0x2e, 0xa6, 0x5a, 0xa8, 0xee, + 0x00, 0x00, 0x00, 0x00, 0x9a, 0x99, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x96, 0xc5, 0x3a, 0x4e, 0x42, 0x7d, 0x27, 0xce, + 0x44, 0x84, 0xf1, 0x67, 0x8c, 0xc5, 0xdd, 0x75, 0x3b, 0x8a, 0xed, 0x2e, + 0x29, 0x62, 0x7b, 0xb0, 0xe6, 0xa3, 0xb4, 0x61, 0x73, 0x10, 0xff, 0x0e, + 0x0c, 0x98, 0x74, 0xef, 0xbb, 0xc4, 0xca, 0x03, 0x88, 0xa4, 0x96, 0x61, + 0xef, 0x36, 0x6d, 0xa2, 0xb1, 0xc8, 0xf0, 0xac, 0xf1, 0xb2, 0x08, 0x56, + 0xc7, 0x99, 0xcf, 0xae, 0x0a, 0x37, 0x85, 0x60, 0x78, 0x2d, 0x14, 0xda, + 0xb1, 0xa7, 0x00, 0xb6, 0x00, 0x04, 0x76, 0x80, 0x0e, 0x9f, 0x2a, 0x30, + 0x8b, 0x85, 0xd9, 0xc1, 0xaf, 0xee, 0x27, 0x80, 0x20, 0xed, 0xef, 0x25, + 0x5c, 0x98, 0x6b, 0xcc, 0xf8, 0x72, 0xfb, 0x3f, 0x13, 0xe6, 0x9b, 0x47, + 0xee, 0xa1, 0x18, 0x55, 0xa0, 0x68, 0xbe, 0xd4, 0x21, 0x59, 0x72, 0xa8, + 0xa4, 0xd2, 0x33, 0x57, 0x50, 0xfc, 0x6b, 0xa8, 0x49, 0x1b, 0x74, 0xdb, + 0x5a, 0x16, 0xb8, 0x52, 0x0c, 0xda, 0xa0, 0xa3, 0xff, 0x33, 0x56, 0x82, + 0x0f, 0x0a, 0x90, 0x82, 0xee, 0xf1, 0x1b, 0xb3, 0x05, 0x44, 0x39, 0x01, + 0xf7, 0x1e, 0xff, 0xcb, 0xea, 0xd0, 0xb6, 0x20, 0xbc, 0x84, 0xb1, 0xf9, + 0xa2, 0xc1, 0x56, 0xe6, 0xfa, 0x47, 0xc9, 0xfd, 0x45, 0x77, 0x51, 0x8e, + 0x01, 0xe4, 0x17, 0x20, 0x6f, 0x99, 0xe3, 0x90, 0x2f, 0xcc, 0xaf, 0xd9, + 0x61, 0x32, 0x91, 0x62, 0x58, 0xf4, 0x98, 0xf5, 0xf4, 0xeb, 0x13, 0xeb, + 0xdc, 0x8a, 0xac, 0xb2, 0x9e, 0xcf, 0xe7, 0xa7, 0xd4, 0x97, 0x22, 0x12, + 0x08, 0x10, 0x6d, 0x40, 0xea, 0x26, 0xea, 0x42, 0x29, 0x6e, 0x75, 0x62, + 0x47, 0x08, 0x17, 0xa8, 0x69, 0x0f, 0xf7, 0x35, 0x59, 0x23, 0x86, 0x83, + 0xfd, 0xb5, 0x61, 0x98, 0x9c, 0x4d, 0x37, 0xda, 0x9f, 0xfc, 0xfb, 0x16, + 0xb7, 0x6c, 0x52, 0xee, 0xa8, 0x9c, 0x3e, 0x93, 0x43, 0xc5, 0x2b, 0xd4, + 0xd0, 0x9f, 0x69, 0x2c, 0xc9, 0x1f, 0x2e, 0xdf, 0x5b, 0xe6, 0xc6, 0x5f, + 0x71, 0xd1, 0xd7, 0xb2, 0x8f, 0x3a, 0xba, 0x60, 0x75, 0x3d, 0x34, 0x41, + 0x43, 0x9b, 0x13, 0xc0, 0x3b, 0x30, 0xc5, 0xe9, 0x84, 0x81, 0xde, 0x85, + 0x4e, 0x65, 0x7b, 0x21, 0x37, 0xb8, 0xef, 0x24, 0x19, 0xaa, 0x26, 0x0c, + 0x27, 0xa7, 0xd9, 0x29, 0x47, 0x1a, 0x15, 0x42, 0x1e, 0x30, 0x79, 0x79, + 0x96, 0x09, 0x62, 0x26, 0xad, 0x98, 0x8b, 0xcb, 0x3d, 0xeb, 0x66, 0x83, + 0x77, 0xd9, 0x79, 0x4d, 0x05, 0x81, 0x72, 0xe9, 0xe0, 0x6f, 0x13, 0x00, + 0x7e, 0xa3, 0x92, 0x82, 0x1c, 0x90, 0x83, 0x4b, 0x15, 0x97, 0x0f, 0x92, + 0xe2, 0xd3, 0x3d, 0xd7, 0x6c, 0xb9, 0x60, 0x9a, 0x23, 0x52, 0xbe, 0x59, + 0xc9, 0x36, 0x9e, 0xf7, 0x77, 0x09, 0x79, 0x01, 0xcc, 0xec, 0x17, 0xd1, + 0x74, 0xbc, 0x58, 0x65, 0x45, 0x3c, 0x86, 0xf1, 0xbc, 0xbd, 0x95, 0x54, + 0x46, 0x45, 0x7b, 0x4c, 0xa2, 0xea, 0x2a, 0x6e, 0xa8, 0xd1, 0x66, 0x03, + 0xb2, 0x6a, 0xe0, 0xd3, 0x07, 0x8d, 0xe0, 0x09, 0x81, 0x42, 0xe3, 0x97, + 0xc4, 0xe7, 0x37, 0xc5, 0x82, 0xcf, 0xb1, 0xec, 0xba, 0xbd, 0xf4, 0xb6, + 0x41, 0xb2, 0xb8, 0xa6, 0x3a, 0x85, 0x4b, 0x4f, 0x46, 0x48, 0xe9, 0x9b, + 0x72, 0xf5, 0xb0, 0x64, 0x66, 0x75, 0x42, 0xb4, 0x00, 0xbe, 0x11, 0x6d, + 0x86, 0x93, 0x07, 0x50, 0xa7, 0xef, 0x55, 0x42, 0xcf, 0xe8, 0x61, 0xd0, + 0x9b, 0x11, 0x84, 0x8c, 0x74, 0xe4, 0xb8, 0x3f, 0x48, 0xb3, 0x61, 0xe3, + 0xea, 0x66, 0x86, 0x94, 0x95, 0x12, 0x77, 0x26, 0x75, 0x30, 0xb5, 0xd3, + 0x7a, 0xad, 0x2d, 0x58, 0x46, 0x1b, 0x4b, 0xd9, 0x2d, 0x1e, 0x0b, 0xff, + 0xd7, 0x03, 0x56, 0x3b, 0xbd, 0x65, 0xb0, 0xf9, 0xfe, 0x43, 0x1c, 0x9c, + 0x18, 0x82, 0x78, 0x5e, 0x06, 0x02, 0x21, 0x70, 0xb2, 0x7f, 0xb5, 0x63, + 0x71, 0x85, 0x95, 0x79, 0xae, 0x1e, 0xc6, 0x62, 0x7a, 0x7c, 0x63, 0x46, + 0x70, 0x1c, 0x58, 0x72, 0x1d, 0xde, 0xca, 0xb4, 0xfc, 0xc8, 0x56, 0x38, + 0x32, 0xf4, 0x0b, 0x56, 0x87, 0x6b, 0x5b, 0x53, 0xd2, 0x2c, 0x35, 0xef, + 0x5b, 0x33, 0x59, 0x13, 0x76, 0x82, 0x30, 0x80, 0x23, 0x10, 0x07, 0x4c, + 0x3f, 0xac, 0x9c, 0x58, 0x2d, 0x04, 0xe6, 0x6a, 0xd3, 0x5c, 0xf9, 0xb6, + 0x59, 0x4e, 0x85, 0xfe, 0x01, 0x71, 0xf0, 0xf7, 0xf2, 0x1f, 0x46, 0xd5, + 0x20, 0x3c, 0x9b, 0xc2, 0x1e, 0x73, 0x1c, 0x56, 0x9c, 0x76, 0x8c, 0x12, + 0x95, 0x51, 0xd4, 0x6f, 0x5b, 0x3a, 0xa7, 0x5f, 0xa7, 0xe4, 0xfa, 0xb7, + 0x1a, 0xdd, 0xb6, 0x4c, 0x01, 0x02, 0xae, 0x9c, 0x02, 0x0d, 0x66, 0x2f, + 0x40, 0x87, 0xa1, 0xbc, 0xf3, 0xde, 0xf4, 0xdb, 0x65, 0xee, 0xcc, 0xca, + 0xe1, 0x7a, 0xa2, 0xf4, 0xf7, 0xf5, 0x7c, 0x2a, 0x3f, 0xa4, 0x67, 0xbb, + 0x07, 0x50, 0x7a, 0x29, 0x8a, 0xcf, 0x2c, 0x7a, 0x0e, 0x0d, 0xc7, 0x95, + 0x8b, 0xf4, 0xe2, 0x50, 0xe1, 0xc1, 0x40, 0x16, 0x99, 0x5c, 0x72, 0xe7, + 0xe4, 0x01, 0xeb, 0x29, 0x6a, 0x99, 0xf2, 0x67, 0x23, 0x46, 0x1f, 0xaa, + 0xea, 0xc1, 0x51, 0x30, 0xeb, 0x7d, 0x34, 0x52, 0x91, 0x37, 0x2d, 0xc6, + 0x5c, 0x3a, 0x7c, 0x54, 0xc0, 0x79, 0xdc, 0xf9, 0xbf, 0x08, 0x2a, 0xf6, + 0xe1, 0x1e, 0xee, 0xc6, 0xd2, 0xe9, 0x30, 0x27, 0x60, 0x0c, 0xa2, 0x63, + 0x16, 0x06, 0x3d, 0xe2, 0xf5, 0x6f, 0xea, 0xe4, 0x4d, 0x9f, 0x2d, 0x36, + 0x62, 0x95, 0x47, 0x5d, 0x00, 0x22, 0x9f, 0x0c, 0xbb, 0x71, 0xad, 0xea, + 0xe7, 0x62, 0x59, 0x21, 0xd1, 0xaf, 0x04, 0x5a, 0xfc, 0x1f, 0x28, 0x6b, + 0x6f, 0x71, 0xec, 0xd4, 0xbd, 0x9c, 0x88, 0xfb, 0x3f, 0x04, 0xea, 0xd6, + 0xb2, 0x24, 0xe5, 0x28, 0xfe, 0xc5, 0x3e, 0x15, 0x00, 0x8c, 0xa2, 0xdf, + 0x18, 0x3d, 0x10, 0x9a, 0xb1, 0xcd, 0x64, 0xda, 0x87, 0x41, 0xc8, 0xa1, + 0x1c, 0x97, 0xd5, 0x44, 0xd9, 0x51, 0xd2, 0x96, 0xed, 0xad, 0x28, 0x1f, + 0x03, 0x89, 0x21, 0xbd, 0x79, 0x91, 0x48, 0x9c, 0x8e, 0x17, 0xfd, 0x36, + 0x72, 0xf6, 0x69, 0x4f, 0x3f, 0x02, 0x57, 0xcc, 0x3f, 0x1c, 0x49, 0x82, + 0x00, 0x45, 0x9e, 0x29, 0x83, 0x14, 0x12, 0xbb, 0xd2, 0xd0, 0x1a, 0x66, + 0x0f, 0x57, 0x24, 0xd4, 0x9f, 0x46, 0x0c, 0xf4, 0xb8, 0x28, 0x85, 0x52, + 0xe2, 0xa1, 0xc2, 0x3a, 0x8c, 0x34, 0x4a, 0x81, 0xe3, 0xbc, 0xa2, 0x67, + 0x67, 0x12, 0x13, 0xc4, 0xe7, 0xd7, 0x2c, 0x4e, 0xa9, 0xf5, 0xed, 0x63, + 0xf2, 0x18, 0x9c, 0x0c, 0xe2, 0x4d, 0x25, 0x23, 0x30, 0x3e, 0x49, 0x29, + 0xa6, 0x37, 0xdf, 0xc2, 0xdc, 0xf6, 0x5e, 0xae, 0x45, 0xd7, 0x8d, 0x56, + 0xba, 0x29, 0x4f, 0xee, 0xc9, 0x26, 0xd7, 0xbf, 0x10, 0x4d, 0x0a, 0x3b, + 0x3d, 0x1f, 0xd5, 0x72, 0xe1, 0xe6, 0xf5, 0x23, 0x4a, 0x17, 0x2d, 0xe4, + 0x40, 0x55, 0x9b, 0x39, 0x66, 0x36, 0xe4, 0x6d, 0x6d, 0xb6, 0x8d, 0x2a, + 0x7e, 0x76, 0x73, 0xa5, 0x86, 0x20, 0x3d, 0x18, 0xa0, 0x6c, 0x35, 0x59, + 0xc8, 0x1c, 0xef, 0x0f, 0x36, 0x1d, 0x6f, 0xba, 0x89, 0xb9, 0x9e, 0x7a, + 0x58, 0x1d, 0x43, 0xad, 0x85, 0x8b, 0x6b, 0xcc, 0x25, 0xb8, 0xe4, 0xdd, + 0xa1, 0x35, 0xd9, 0xef, 0xc4, 0xb1, 0xf6, 0x99, 0x27, 0x17, 0xb7, 0xbe, + 0xd1, 0x4f, 0xa1, 0x81, 0x4e, 0xb6, 0x19, 0xcd, 0xa0, 0x92, 0xeb, 0x56, + 0x41, 0x4f, 0x37, 0xca, 0x3b, 0x43, 0x85, 0x86, 0xdf, 0x5d, 0x5a, 0x8c, + 0xd4, 0x5b, 0xc4, 0x28, 0xdb, 0x16, 0xea, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0x9d, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xea, 0x59, 0x40, 0xc4, 0x40, 0x8b, 0x6a, 0x8a, 0xb8, 0x7f, 0x1e, 0x0b, + 0xfe, 0xab, 0xa4, 0xac, 0x42, 0x91, 0xc5, 0xfa, 0x2c, 0x7e, 0xb4, 0xf9, + 0x5c, 0xd5, 0x4c, 0x6a, 0x74, 0x82, 0x90, 0x81, 0x96, 0xb0, 0xf4, 0xd4, + 0xba, 0xc9, 0xa3, 0x2e, 0x26, 0x0a, 0xc9, 0x55, 0x65, 0xac, 0xde, 0x83, + 0x37, 0xec, 0x0e, 0xf6, 0xdc, 0x8c, 0x34, 0xe6, 0x57, 0xde, 0x32, 0x0a, + 0x02, 0x62, 0x4f, 0x6a, 0x92, 0xa5, 0xb4, 0x40, 0xde, 0x57, 0xf4, 0xd1, + 0xa3, 0x1c, 0xd3, 0xf7, 0x4a, 0x15, 0xcc, 0x27, 0x26, 0x00, 0xba, 0xf3, + 0xfa, 0x4e, 0xc6, 0xe9, 0xc3, 0x05, 0x3d, 0x3a, 0x89, 0x96, 0x7d, 0x41, + 0xac, 0xca, 0x28, 0x7f, 0x69, 0x02, 0x40, 0x03, 0x93, 0x86, 0x85, 0x85, + 0x73, 0x00, 0x09, 0x5a, 0xcf, 0x5f, 0x1d, 0xaa, 0x46, 0x41, 0x9d, 0x08, + 0xbf, 0xea, 0x45, 0x9b, 0x93, 0xda, 0x9e, 0x81, 0x00, 0x00, 0x00, 0x00, + 0x3a, 0x9e, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x6a, 0x1f, 0x9b, 0x03, 0xdd, 0xe4, 0x16, 0x07, 0x7f, 0x5b, 0xb0, 0xee, + 0xac, 0x55, 0xc4, 0x50, 0xe6, 0x2b, 0x17, 0xed, 0x7f, 0x50, 0x4d, 0x71, + 0x73, 0xae, 0xe0, 0x4d, 0xce, 0x08, 0xd9, 0x8b, 0x83, 0x2c, 0x01, 0x48, + 0x02, 0xd3, 0xbb, 0xca, 0x86, 0xd7, 0xca, 0x5f, 0xc7, 0xce, 0x59, 0xdf, + 0xc1, 0xcc, 0xf7, 0x7b, 0x54, 0xf8, 0x0d, 0x4f, 0x81, 0x9e, 0x50, 0x6a, + 0x65, 0x66, 0x4a, 0xec, 0x7a, 0x1b, 0x92, 0xb2, 0x39, 0x8f, 0x5d, 0x41, + 0x33, 0xcf, 0xe6, 0x1b, 0x34, 0x5d, 0xe1, 0xf6, 0xef, 0xcb, 0xa0, 0x55, + 0x7e, 0x1f, 0x45, 0x38, 0xb9, 0x56, 0x15, 0x3b, 0x70, 0xab, 0xc8, 0x2f, + 0x1c, 0xb9, 0x7d, 0x37, 0xe1, 0xb4, 0x03, 0x44, 0x5a, 0xf6, 0x57, 0x97, + 0x03, 0x54, 0x4c, 0x22, 0x88, 0xc3, 0x82, 0xfd, 0x91, 0xc1, 0xf1, 0x63, + 0xb4, 0x50, 0x46, 0x11, 0x64, 0x07, 0xfd, 0x85, 0xe5, 0x78, 0x57, 0xdd, + 0x19, 0x2a, 0x6b, 0x64, 0x3e, 0xec, 0xb8, 0xf3, 0xb5, 0x95, 0x29, 0x72, + 0xf1, 0x9d, 0xdd, 0xb9, 0xad, 0xd0, 0x78, 0x26, 0x86, 0x10, 0x10, 0x19, + 0xe4, 0x79, 0xae, 0xdc, 0x56, 0xb7, 0x54, 0x4f, 0x94, 0xc6, 0x26, 0x9a, + 0x93, 0xa8, 0x2e, 0x1b, 0x1c, 0xda, 0x87, 0x3a, 0xa2, 0x44, 0xb9, 0x0b, + 0x0f, 0xab, 0x70, 0x3b, 0xb7, 0x6c, 0xbf, 0x58, 0x67, 0x32, 0x7d, 0xa3, + 0x2a, 0xcb, 0x4e, 0x02, 0x92, 0xa1, 0x26, 0x0e, 0x20, 0x5e, 0xb3, 0xec, + 0xc4, 0x04, 0x5b, 0x7f, 0xe5, 0xbd, 0x30, 0xeb, 0xc8, 0xdd, 0xf1, 0x72, + 0x5a, 0x7e, 0xcb, 0x93, 0x22, 0xa0, 0x01, 0x9f, 0xbb, 0x24, 0x9f, 0x50, + 0x01, 0x1f, 0x24, 0x02, 0x85, 0x6d, 0xe6, 0x4d, 0x55, 0xc4, 0x07, 0xe9, + 0x87, 0x38, 0xbf, 0x1a, 0x3b, 0x05, 0x82, 0xc4, 0x73, 0x4b, 0x87, 0x3c, + 0xb4, 0x0a, 0x48, 0x8c, 0x06, 0x67, 0xe7, 0xbf, 0xcc, 0xe7, 0xe5, 0xc3, + 0xb2, 0x81, 0x60, 0xe2, 0xd1, 0xb1, 0x8f, 0x98, 0xbd, 0x7d, 0xbd, 0x4e, + 0x9a, 0xca, 0xbe, 0xcb, 0x81, 0x47, 0x25, 0xaa, 0xfa, 0x91, 0xcf, 0x78, + 0xce, 0xcb, 0x1a, 0x11, 0x79, 0xcf, 0x97, 0xa3, 0x95, 0x95, 0x6f, 0xd7, + 0xae, 0x80, 0xc9, 0xd5, 0x95, 0xb7, 0xcf, 0xe2, 0x9d, 0x98, 0x65, 0x80, + 0xfd, 0x2e, 0xee, 0x46, 0x5e, 0x46, 0x8c, 0xde, 0x52, 0xb4, 0xdc, 0xce, + 0xa8, 0xab, 0x4e, 0x0c, 0x12, 0x9f, 0x89, 0x9c, 0x84, 0x80, 0xfe, 0x08, + 0x64, 0x12, 0x12, 0x95, 0x62, 0xea, 0x65, 0xcc, 0x34, 0x80, 0xcf, 0x92, + 0x5f, 0xc2, 0xae, 0x76, 0xe7, 0x2f, 0xbb, 0xa8, 0xdb, 0x6a, 0x66, 0x60, + 0xaf, 0x88, 0xba, 0x65, 0x32, 0xcf, 0xf7, 0x6e, 0xd8, 0xd0, 0x69, 0xb0, + 0x12, 0x23, 0xd6, 0xc2, 0x32, 0xe5, 0x8e, 0x51, 0xc5, 0x61, 0x28, 0x45, + 0xf7, 0xf9, 0xea, 0x73, 0xce, 0x04, 0x2d, 0x56, 0x43, 0x10, 0x8b, 0x4f, + 0x6b, 0xfa, 0x32, 0xa8, 0x92, 0x8f, 0xd9, 0xb4, 0xfd, 0xa4, 0x74, 0xa8, + 0xea, 0xca, 0xd3, 0x84, 0xbb, 0x5a, 0x34, 0x57, 0xf9, 0xda, 0x25, 0x40, + 0x1f, 0x5e, 0xc2, 0x66, 0x43, 0x05, 0xdd, 0x13, 0x88, 0x91, 0x60, 0xa1, + 0x75, 0xd3, 0xc4, 0x27, 0xff, 0xda, 0x24, 0x3d, 0xd9, 0xd7, 0x47, 0x46, + 0x30, 0xd0, 0x76, 0xc4, 0x9e, 0x97, 0xe3, 0x43, 0xd7, 0x45, 0xaf, 0x49, + 0x36, 0xf2, 0x18, 0xdd, 0x3f, 0x86, 0x9a, 0xec, 0x9a, 0x70, 0xeb, 0x5a, + 0xe2, 0xa0, 0x4b, 0x45, 0x21, 0xb3, 0x32, 0x3d, 0x0c, 0x8c, 0x03, 0x13, + 0xae, 0x46, 0xb5, 0x1a, 0x0a, 0x03, 0x36, 0xfe, 0xfe, 0xfa, 0xc9, 0x4d, + 0x46, 0xf8, 0xfe, 0x6f, 0x99, 0x8c, 0xe4, 0x77, 0x0c, 0x27, 0x59, 0xf7, + 0xc3, 0xfc, 0x32, 0xb3, 0xa5, 0xae, 0xdc, 0x49, 0xac, 0x31, 0x27, 0xa6, + 0x14, 0x92, 0xfb, 0xe3, 0x69, 0x35, 0x8d, 0xa0, 0x50, 0x55, 0x09, 0x90, + 0xdf, 0x67, 0x08, 0x4c, 0x0e, 0xaf, 0x71, 0xc2, 0xe8, 0xb8, 0xdc, 0x45, + 0xe3, 0x6d, 0x58, 0x3f, 0x19, 0x8d, 0xcd, 0xeb, 0xe3, 0x02, 0x49, 0xd8, + 0xc8, 0x8b, 0x29, 0xb3, 0xef, 0x2b, 0xf0, 0x39, 0x5c, 0x11, 0xaa, 0x52, + 0x44, 0x0d, 0x1a, 0x3a, 0x7a, 0x62, 0xda, 0x6d, 0xe3, 0xdd, 0x03, 0x30, + 0x6d, 0x3e, 0x18, 0x30, 0x1d, 0xc0, 0xd0, 0x05, 0x67, 0x98, 0xf5, 0x2a, + 0xc7, 0xa1, 0x58, 0xd7, 0xf8, 0x6f, 0x7d, 0x07, 0x59, 0x27, 0x95, 0xb9, + 0x8d, 0x4d, 0xd7, 0xc8, 0x5e, 0x8b, 0x89, 0x14, 0xb7, 0x1b, 0x35, 0xaa, + 0x72, 0x02, 0x39, 0x3c, 0x41, 0x7c, 0x91, 0x93, 0x81, 0xe1, 0xad, 0xbe, + 0x77, 0x28, 0x80, 0xa2, 0x9c, 0xa8, 0x00, 0x18, 0xa5, 0x70, 0xec, 0xec, + 0x96, 0x95, 0x37, 0xa3, 0xee, 0x15, 0xa0, 0x69, 0x0e, 0x05, 0xb5, 0xb4, + 0xb6, 0xa7, 0x8b, 0xb9, 0x41, 0x88, 0x4f, 0x56, 0x39, 0xa7, 0xbe, 0x24, + 0xce, 0x4c, 0xe0, 0x9c, 0x24, 0x5a, 0xa1, 0xab, 0xcd, 0x82, 0xf1, 0x16, + 0x3f, 0xc0, 0xaf, 0xe1, 0x42, 0xe0, 0x7d, 0x1b, 0xd9, 0x8f, 0xb8, 0x04, + 0xa1, 0x88, 0xd9, 0xc3, 0xaf, 0x4f, 0xda, 0xfd, 0x0b, 0x5c, 0xc3, 0x04, + 0xf3, 0xdb, 0xe6, 0x76, 0x6e, 0xe9, 0xdc, 0xea, 0x6f, 0xa2, 0xa5, 0x75, + 0x2c, 0xc7, 0x91, 0x7d, 0x4b, 0xd5, 0x68, 0x55, 0xbb, 0x2d, 0x14, 0xdb, + 0x06, 0x76, 0xf7, 0xcc, 0x0a, 0x88, 0x6c, 0x2b, 0xa1, 0x57, 0xd6, 0x15, + 0x9c, 0x46, 0xcf, 0x5b, 0x6f, 0x9e, 0x7e, 0xc5, 0x39, 0xda, 0x97, 0x26, + 0x5e, 0xf5, 0x25, 0x06, 0xed, 0x8e, 0x9b, 0x1d, 0x1b, 0x91, 0x07, 0x89, + 0x08, 0xce, 0xd7, 0x38, 0x43, 0x64, 0x8e, 0xf5, 0x3a, 0x52, 0x4a, 0xfb, + 0x3e, 0xff, 0x2c, 0xb3, 0x78, 0x40, 0xb5, 0xdd, 0xb2, 0x8a, 0xd3, 0x6a, + 0xc5, 0xb0, 0xa3, 0x4a, 0xb8, 0xe7, 0x27, 0xa0, 0x5a, 0x8f, 0x0f, 0xda, + 0x53, 0x49, 0xc9, 0x77, 0x2a, 0xef, 0x78, 0xc6, 0xec, 0xaf, 0x10, 0xe5, + 0x71, 0xc5, 0x7a, 0x85, 0xdf, 0xb2, 0x85, 0x02, 0xe3, 0x55, 0x7a, 0x91, + 0x3a, 0x68, 0xb2, 0x9d, 0x3d, 0xd9, 0x01, 0xc5, 0x5f, 0x3c, 0xa8, 0x1d, + 0x99, 0xc6, 0xe7, 0xad, 0x09, 0xd1, 0x39, 0x3a, 0x92, 0xc5, 0x77, 0x9c, + 0xdf, 0x99, 0x56, 0x9f, 0xfe, 0xf8, 0xfd, 0xc8, 0x4f, 0x19, 0xa3, 0xa0, + 0xdf, 0xff, 0x17, 0xac, 0xa9, 0x03, 0x32, 0x85, 0x4c, 0x29, 0xca, 0x89, + 0x58, 0xdc, 0x88, 0xdd, 0xeb, 0x79, 0x68, 0x5e, 0x0f, 0x37, 0x1a, 0xf7, + 0x05, 0xfd, 0x39, 0x91, 0x25, 0x61, 0xf3, 0x04, 0xda, 0x97, 0xfc, 0x7b, + 0xcc, 0x40, 0x63, 0xfd, 0x5b, 0x3b, 0x27, 0x8e, 0x92, 0x6d, 0x98, 0x0f, + 0xcc, 0x9c, 0x9b, 0xda, 0xb2, 0xc6, 0xca, 0x56, 0xff, 0x7e, 0xcc, 0xa2, + 0xc0, 0x45, 0x3e, 0xf6, 0xdf, 0xa7, 0xe8, 0x2a, 0xef, 0x0c, 0xde, 0xec, + 0xa4, 0x1d, 0x2c, 0x3e, 0x03, 0xfd, 0xa4, 0x44, 0x60, 0x4a, 0xf5, 0x83, + 0x8f, 0x09, 0x2d, 0xe8, 0xd5, 0x46, 0xf6, 0x1c, 0x2d, 0x39, 0x28, 0x0c, + 0xdf, 0xa1, 0x2b, 0x05, 0x6e, 0x3c, 0x36, 0xdd, 0x91, 0x81, 0x52, 0xf1, + 0x56, 0xdc, 0xbb, 0x79, 0x62, 0xd8, 0x2e, 0x27, 0x5d, 0x9f, 0x3c, 0xce, + 0x81, 0x5c, 0x70, 0xe5, 0x4d, 0x33, 0x06, 0xd5, 0x14, 0x04, 0xb7, 0xbc, + 0x7b, 0x7a, 0xb4, 0xf7, 0x4a, 0x48, 0x8f, 0x97, 0x85, 0x96, 0x69, 0xc9, + 0x40, 0x52, 0xb1, 0x1c, 0x28, 0x82, 0xb3, 0x63, 0xee, 0x94, 0x2f, 0xcb, + 0x40, 0xad, 0xd7, 0x78, 0xb1, 0xc4, 0x21, 0x05, 0x36, 0xd9, 0x46, 0xf0, + 0x83, 0xcd, 0xee, 0x52, 0x7a, 0xa6, 0xa4, 0x40, 0xb0, 0x2f, 0xf0, 0x1c, + 0xfa, 0x42, 0x98, 0x54, 0x5b, 0xfe, 0x5e, 0xd6, 0x84, 0x73, 0xca, 0x39, + 0xbe, 0x87, 0xf2, 0x92, 0xee, 0x3d, 0x21, 0xcc, 0x69, 0x81, 0xe5, 0xe8, + 0x8a, 0xc3, 0x23, 0x64, 0x98, 0xd5, 0x1d, 0xcd, 0x5c, 0x6c, 0x37, 0xc8, + 0x8b, 0x08, 0x22, 0x12, 0x9f, 0x85, 0xc9, 0xed, 0xb4, 0xa6, 0x07, 0xe1, + 0x62, 0x79, 0x35, 0x5d, 0x26, 0x11, 0x4a, 0x6b, 0x33, 0x37, 0x91, 0x78, + 0xe8, 0xe2, 0xba, 0x8b, 0x8a, 0xb7, 0xbb, 0x0f, 0xd2, 0xb3, 0xa2, 0x02, + 0x0c, 0x57, 0x35, 0x99, 0x88, 0x6b, 0x9b, 0x64, 0x79, 0x1f, 0x4a, 0x48, + 0xd4, 0x3b, 0x5c, 0xeb, 0xb4, 0x83, 0xc3, 0xad, 0x9c, 0x6a, 0xb0, 0xcf, + 0x7f, 0x70, 0xe8, 0x22, 0x46, 0x25, 0xfe, 0x7e, 0x02, 0x44, 0x83, 0x02, + 0xb3, 0x08, 0x2e, 0x34, 0x08, 0x4b, 0xff, 0xa2, 0xc1, 0x60, 0xbb, 0xd8, + 0x89, 0x16, 0xf8, 0xaa, 0xab, 0xea, 0xf7, 0xa0, 0x10, 0x9a, 0xc9, 0xe9, + 0xa4, 0x81, 0xa7, 0x87, 0x32, 0x5b, 0xc1, 0xd0, 0xd9, 0x70, 0x6f, 0xb6, + 0x7c, 0x65, 0xd5, 0x0e, 0x65, 0x93, 0xfe, 0x6d, 0x66, 0xaa, 0xab, 0xd0, + 0x03, 0x07, 0xf2, 0xbe, 0x39, 0xd6, 0xc8, 0xac, 0xf2, 0x06, 0x58, 0x58, + 0x46, 0xc0, 0x1a, 0xbd, 0xa4, 0x96, 0x38, 0x31, 0x32, 0x89, 0x04, 0xdf, + 0xcd, 0x3c, 0x2e, 0x98, 0xb8, 0x39, 0xba, 0xe2, 0xca, 0x6b, 0xd0, 0x53, + 0xce, 0x4a, 0xc8, 0x95, 0x81, 0x84, 0x17, 0xce, 0x7f, 0x1d, 0xc1, 0x5a, + 0xc4, 0xc2, 0x73, 0x30, 0x6d, 0x0b, 0x8c, 0xf8, 0x66, 0x38, 0x4e, 0xa3, + 0x14, 0x84, 0x15, 0x36, 0x9e, 0x0d, 0x56, 0x6b, 0xa6, 0x77, 0x65, 0xa4, + 0x2c, 0x77, 0x00, 0x8b, 0x43, 0x57, 0xc6, 0x25, 0xc5, 0xd0, 0x17, 0x79, + 0x6b, 0x5d, 0xbc, 0xcd, 0xc8, 0x25, 0x8f, 0x20, 0x09, 0xcc, 0xbd, 0x80, + 0x10, 0xdf, 0x35, 0xf6, 0x9c, 0x04, 0x80, 0x23, 0xdc, 0x97, 0xe0, 0xba, + 0x29, 0x48, 0x2e, 0x95, 0x0f, 0xb1, 0x9b, 0xc7, 0xe6, 0x0b, 0x89, 0x16, + 0xe2, 0x81, 0x3b, 0x32, 0x69, 0xc4, 0xde, 0xc6, 0x12, 0x09, 0x47, 0xff, + 0x50, 0xe4, 0x45, 0xb7, 0x35, 0xd2, 0x61, 0x9b, 0x52, 0x6e, 0xbe, 0xaf, + 0xd2, 0xeb, 0x0c, 0x50, 0xf1, 0x57, 0x9f, 0x59, 0xe1, 0xc1, 0x4f, 0x8c, + 0x79, 0x07, 0x05, 0xce, 0x8d, 0x64, 0xb2, 0xf0, 0xd3, 0x4f, 0xe1, 0x7b, + 0xfa, 0x30, 0x0a, 0xc2, 0x5d, 0x0c, 0x47, 0x6c, 0x17, 0x77, 0x1f, 0xe5, + 0xd8, 0x14, 0xfd, 0xc1, 0x01, 0x70, 0x51, 0x60, 0xb2, 0x20, 0xfd, 0x86, + 0xbc, 0x19, 0x5e, 0x01, 0xa6, 0x19, 0x3a, 0x21, 0xa5, 0x0a, 0x1c, 0xd9, + 0xa9, 0x78, 0xbb, 0xc9, 0x01, 0x65, 0xe4, 0xb3, 0x48, 0xb8, 0xe1, 0xe7, + 0xb5, 0xf4, 0x4e, 0xa9, 0xb6, 0xe2, 0x5b, 0xeb, 0xf5, 0x76, 0x06, 0x1a, + 0xd9, 0x08, 0x40, 0xff, 0x72, 0xb2, 0xe3, 0x01, 0x50, 0xb1, 0xad, 0xb3, + 0xa3, 0xf6, 0xef, 0x72, 0x05, 0x0c, 0xf4, 0xce, 0x24, 0x2c, 0x63, 0x89, + 0x63, 0x9e, 0x21, 0xb8, 0xb0, 0xbe, 0xc7, 0x45, 0xae, 0x47, 0x2b, 0x9e, + 0x61, 0x81, 0x4c, 0x76, 0x96, 0x7b, 0x18, 0x37, 0x74, 0xcb, 0x00, 0xef, + 0x38, 0x72, 0x24, 0x0a, 0x63, 0xc1, 0x64, 0xd6, 0x41, 0xc8, 0x6a, 0xf1, + 0xe7, 0x11, 0x20, 0x4b, 0xc2, 0x95, 0x70, 0xb8, 0xf8, 0x8f, 0xd9, 0xae, + 0x8c, 0x12, 0xd8, 0x6f, 0x63, 0x30, 0xca, 0x56, 0x46, 0x11, 0xda, 0x49, + 0x1f, 0x84, 0x3d, 0xae, 0xab, 0x78, 0x29, 0x02, 0x6c, 0x43, 0xa3, 0xef, + 0x9d, 0x97, 0x59, 0x15, 0x53, 0xcd, 0xc7, 0x47, 0x65, 0x30, 0xc7, 0xae, + 0x31, 0x4a, 0x41, 0xb4, 0x66, 0x9c, 0xbb, 0x51, 0x0b, 0xbd, 0xe2, 0x7d, + 0x41, 0x2c, 0xd0, 0x75, 0x57, 0x93, 0xce, 0x2e, 0xeb, 0x31, 0x7f, 0x56, + 0xb2, 0xa4, 0x2b, 0x9f, 0xcc, 0xef, 0x6f, 0xf0, 0x77, 0x19, 0xad, 0x4d, + 0x2e, 0x37, 0x00, 0x75, 0x53, 0xae, 0x22, 0x44, 0x69, 0x1c, 0x8a, 0x90, + 0xf2, 0xcd, 0x0f, 0x6b, 0x37, 0xdb, 0xfd, 0x71, 0x64, 0x80, 0xd8, 0x57, + 0x1b, 0x8f, 0xff, 0x14, 0xd4, 0x5f, 0xe1, 0xd1, 0x0f, 0x06, 0x13, 0x61, + 0x29, 0xa9, 0x80, 0x9d, 0xc7, 0x8a, 0xa0, 0xb5, 0xaa, 0xfc, 0xe0, 0xb4, + 0xb4, 0xf0, 0x31, 0xf0, 0xec, 0x78, 0x03, 0x28, 0xb9, 0xf7, 0xd9, 0xa7, + 0xc8, 0xad, 0x2e, 0x16, 0xb8, 0x18, 0x82, 0x43, 0x66, 0x8b, 0xae, 0xb2, + 0x45, 0x2b, 0x0c, 0x9d, 0x69, 0xbd, 0x1b, 0xc5, 0x20, 0xc6, 0x41, 0xe7, + 0x4f, 0x4b, 0x7b, 0x46, 0x3d, 0x7a, 0x6d, 0x9f, 0x13, 0x2e, 0x0f, 0xf3, + 0x85, 0x3e, 0x5b, 0x12, 0xe5, 0xbf, 0x1b, 0x20, 0xc3, 0x5f, 0x6b, 0xf7, + 0xf7, 0xa3, 0xd7, 0x33, 0xd2, 0xcb, 0x18, 0xa5, 0xa4, 0xa2, 0xd3, 0x59, + 0x91, 0x9a, 0x04, 0xfa, 0x9d, 0xa5, 0x55, 0xad, 0x09, 0x5a, 0x1e, 0x0b, + 0x10, 0xd0, 0x46, 0x18, 0xe4, 0x09, 0xe8, 0x1b, 0x44, 0xd3, 0x78, 0x45, + 0xc0, 0xdf, 0xa2, 0xef, 0xfc, 0x59, 0x8a, 0x1b, 0x22, 0x60, 0xc9, 0x58, + 0x7d, 0x65, 0x45, 0xa9, 0xac, 0xd5, 0xd4, 0xc4, 0x44, 0xd3, 0x08, 0x44, + 0x40, 0x4d, 0x3d, 0x7e, 0x39, 0x81, 0x72, 0x15, 0x49, 0xd7, 0x2c, 0xda, + 0x33, 0xaf, 0xc5, 0xb5, 0x8a, 0x3c, 0xbf, 0x81, 0x88, 0x4f, 0x12, 0xe4, + 0xe8, 0xe6, 0x00, 0xb6, 0xd9, 0xcd, 0xb2, 0x70, 0x08, 0x15, 0x72, 0xf6, + 0x46, 0xc7, 0x98, 0x7c, 0x1d, 0x54, 0xd0, 0x66, 0x2d, 0xa1, 0xd8, 0xda, + 0xb0, 0xe5, 0x9f, 0xa3, 0x2f, 0x2c, 0xfb, 0x34, 0xb3, 0x21, 0x8b, 0x61, + 0xf4, 0xce, 0x60, 0x2b, 0xb5, 0x5e, 0x3d, 0x14, 0x2c, 0xbe, 0x19, 0x9d, + 0x5f, 0x01, 0xe1, 0x21, 0x34, 0x11, 0x6b, 0x10, 0xd4, 0x17, 0x58, 0xb3, + 0x0a, 0x30, 0xe4, 0x17, 0x51, 0x0b, 0xf2, 0xbb, 0xa6, 0xb7, 0x00, 0xa2, + 0xe8, 0xa5, 0xa3, 0x41, 0x1d, 0x65, 0x2d, 0x26, 0x93, 0x26, 0x7d, 0xdc, + 0xad, 0x6f, 0x83, 0xeb, 0x66, 0x55, 0xde, 0x60, 0x21, 0x56, 0x19, 0x4f, + 0x9b, 0x7b, 0x26, 0x4a, 0x80, 0xf5, 0xab, 0x8b, 0xbf, 0xe4, 0xb1, 0xa1, + 0xd6, 0x33, 0x32, 0xbf, 0x86, 0x8c, 0x3c, 0xd0, 0x12, 0x03, 0xd4, 0xb9, + 0x23, 0x54, 0x1b, 0x94, 0x2f, 0xa5, 0x34, 0x4d, 0x59, 0x18, 0x33, 0x8e, + 0x8c, 0xf7, 0x1f, 0xc9, 0x6d, 0x75, 0xfb, 0x2a, 0x22, 0x6c, 0x64, 0xb7, + 0x79, 0xd8, 0x3b, 0xf6, 0x4e, 0x98, 0xd8, 0xa8, 0x2c, 0x06, 0xd1, 0x92, + 0x32, 0x44, 0xec, 0x38, 0x40, 0x3b, 0x53, 0x16, 0x40, 0x8f, 0x92, 0x72, + 0x87, 0xa8, 0xb8, 0xc0, 0x8f, 0x25, 0x4c, 0x4f, 0x24, 0xfc, 0x8d, 0xc6, + 0xa6, 0xeb, 0x2f, 0xdf, 0x2f, 0x0d, 0x2f, 0xd3, 0x6e, 0x70, 0x71, 0xfe, + 0xf0, 0x2e, 0xe9, 0x84, 0xd3, 0xc1, 0xd1, 0x70, 0x4b, 0x8f, 0x7b, 0x60, + 0xb0, 0xb7, 0xe3, 0x79, 0x52, 0x6a, 0x6b, 0x26, 0x03, 0x8f, 0x6a, 0x0f, + 0x8d, 0x85, 0xd7, 0x5f, 0xf7, 0x39, 0x31, 0x0e, 0x26, 0x73, 0x84, 0x3f, + 0x9b, 0x10, 0x6f, 0x29, 0x63, 0x14, 0x36, 0xa2, 0xec, 0x44, 0x7d, 0x84, + 0xc6, 0x4a, 0xec, 0xfe, 0xac, 0xcb, 0xe4, 0xfa, 0xf6, 0x68, 0x83, 0x68, + 0xe0, 0x8f, 0xd3, 0x8a, 0x60, 0x73, 0xf1, 0x5c, 0x71, 0x02, 0x0c, 0xa2, + 0x88, 0x2c, 0xa2, 0x35, 0x35, 0x5c, 0x3f, 0xb1, 0xbe, 0xb3, 0x6b, 0x5c, + 0xe1, 0x78, 0x75, 0x40, 0x20, 0x87, 0x67, 0xca, 0x07, 0x1c, 0x9c, 0x02, + 0xc7, 0xf2, 0x9d, 0x1c, 0xda, 0x1b, 0x86, 0x1b, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0xa6, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x93, 0xca, 0x30, 0xae, 0xea, 0x26, 0x6a, 0x1b, 0x15, 0x46, 0x0a, 0xe3, + 0x57, 0x23, 0x4c, 0x0c, 0x98, 0x8e, 0x3e, 0xbb, 0x43, 0x14, 0x73, 0xdf, + 0x17, 0x91, 0xe2, 0xee, 0x39, 0xf9, 0xc2, 0x2f, 0xdc, 0xad, 0x0e, 0x00, + 0xf5, 0xdd, 0xe3, 0x97, 0xba, 0x8c, 0xee, 0x53, 0xc4, 0x70, 0x37, 0x46, + 0xcf, 0x04, 0xc3, 0xc8, 0x56, 0x38, 0x2e, 0x39, 0x75, 0x32, 0x6d, 0x98, + 0xc4, 0x14, 0xae, 0xa4, 0x29, 0xa3, 0xc6, 0xb6, 0x66, 0x45, 0x48, 0xdf, + 0xc0, 0xa9, 0x4b, 0x4f, 0xef, 0xb9, 0xb4, 0x89, 0x0d, 0x64, 0x00, 0x5c, + 0xd1, 0xc8, 0x2b, 0xf7, 0xc5, 0x1a, 0x1b, 0x06, 0xb7, 0x49, 0xb1, 0xe3, + 0x4d, 0x87, 0xf9, 0x3f, 0xba, 0x39, 0xa3, 0x56, 0x7f, 0x43, 0xcc, 0x15, + 0x9c, 0x3d, 0xba, 0x71, 0x7b, 0xeb, 0x45, 0x0f, 0x15, 0x1b, 0x6c, 0x84, + 0x75, 0x6d, 0x43, 0x0b, 0x27, 0x12, 0x6b, 0xbc, 0x0a, 0x6d, 0xe4, 0xf6, + 0x4f, 0xc7, 0xbb, 0x9e, 0x91, 0xb5, 0x09, 0x5f, 0x79, 0x2a, 0xbf, 0xda, + 0x34, 0x91, 0x44, 0x47, 0x52, 0x64, 0x00, 0x89, 0x27, 0x17, 0x5c, 0xe9, + 0x90, 0x8b, 0xcb, 0xbe, 0x21, 0x47, 0x65, 0x1c, 0x54, 0x61, 0x48, 0x17, + 0x66, 0xb7, 0xa1, 0x60, 0x27, 0x31, 0x04, 0x42, 0x3b, 0x33, 0x3d, 0xda, + 0xf7, 0x61, 0x3d, 0x4b, 0x91, 0xa5, 0x74, 0x4b, 0xde, 0x16, 0xf2, 0x79, + 0x3e, 0xf7, 0x89, 0x87, 0xb3, 0xdd, 0xa2, 0x49, 0xd7, 0x54, 0x1b, 0x39, + 0xff, 0xb5, 0xec, 0x9d, 0x1d, 0x09, 0x7e, 0x5a, 0x3c, 0xd1, 0xdc, 0x0e, + 0x2a, 0x0e, 0x2c, 0x40, 0x4e, 0xa5, 0x8c, 0x9d, 0xc8, 0x9b, 0xa5, 0xb2, + 0x40, 0xa4, 0xaa, 0x3b, 0xac, 0x93, 0x19, 0xf7, 0xa1, 0x8b, 0xf8, 0x4a, + 0x40, 0x08, 0x5d, 0x1d, 0xb0, 0xae, 0x0f, 0x67, 0xa7, 0x21, 0xaf, 0xe3, + 0xb1, 0xfc, 0xff, 0xa0, 0x95, 0x66, 0x2b, 0xf7, 0x82, 0x2d, 0x8a, 0x26, + 0x0f, 0xc3, 0xed, 0x62, 0xb6, 0xcb, 0x4c, 0x86, 0xe9, 0x20, 0x78, 0x3f, + 0x08, 0x53, 0x8f, 0x41, 0xf1, 0xa1, 0x04, 0x77, 0xd9, 0xe6, 0xea, 0x26, + 0x6d, 0x33, 0x48, 0xb3, 0xbb, 0xed, 0xfc, 0xd7, 0xa3, 0x2b, 0xe2, 0x39, + 0xcf, 0x78, 0x4e, 0x11, 0x26, 0xad, 0x39, 0x83, 0x6e, 0x72, 0xbf, 0xc6, + 0x34, 0x23, 0x97, 0x5d, 0x7b, 0x64, 0x1e, 0x78, 0x00, 0x34, 0x92, 0x5d, + 0x3f, 0x23, 0x28, 0x60, 0x7f, 0x88, 0xf0, 0xca, 0x96, 0x4a, 0x15, 0xbf, + 0x8a, 0xb7, 0xd0, 0xd9, 0x99, 0x8b, 0xdb, 0x26, 0xdc, 0x7e, 0x8d, 0x35, + 0x53, 0x60, 0x07, 0x85, 0x80, 0xc4, 0x9c, 0x0d, 0x81, 0xe2, 0x93, 0x85, + 0x76, 0x2d, 0x85, 0x21, 0x6e, 0xda, 0x29, 0xe5, 0xb1, 0x08, 0x46, 0x09, + 0x1b, 0x8a, 0xd9, 0xd2, 0xd7, 0x16, 0x74, 0xee, 0x26, 0x3e, 0xc4, 0x8c, + 0x2e, 0x6b, 0x0c, 0xbc, 0x95, 0xea, 0x4a, 0xb2, 0xd6, 0x6f, 0x43, 0xd1, + 0x3a, 0x8f, 0xbd, 0x77, 0xb4, 0x67, 0x63, 0x6b, 0xd2, 0xe0, 0xf0, 0x81, + 0x74, 0xb7, 0xc5, 0x11, 0x60, 0x10, 0x6b, 0xc6, 0x0f, 0xfd, 0x84, 0x2e, + 0x5c, 0x8f, 0x3b, 0xf5, 0x68, 0xa7, 0x62, 0xc6, 0x4f, 0xa6, 0xee, 0x19, + 0x44, 0xea, 0xc0, 0xe4, 0x64, 0x12, 0x71, 0x2f, 0xfb, 0xa3, 0x4d, 0xb0, + 0x8e, 0x5e, 0xe1, 0x79, 0x65, 0xd4, 0xf3, 0xed, 0x73, 0x04, 0xf1, 0x6d, + 0xc6, 0x75, 0x54, 0x28, 0x13, 0xe2, 0xd6, 0xa1, 0x26, 0xf9, 0xa4, 0x29, + 0x20, 0x5b, 0xd0, 0x3c, 0x3d, 0xf3, 0x7a, 0x18, 0x9a, 0x3d, 0xec, 0x6a, + 0x4c, 0xfd, 0xa5, 0x00, 0xdf, 0xec, 0xfd, 0x64, 0x38, 0x66, 0xa7, 0xba, + 0x59, 0xb3, 0x9b, 0x9c, 0x44, 0xfb, 0x10, 0x08, 0xb8, 0x79, 0xea, 0x85, + 0xbf, 0xa4, 0x14, 0xce, 0xce, 0x85, 0x22, 0x3f, 0x16, 0x00, 0x1c, 0x57, + 0xc8, 0x5a, 0x1b, 0xf5, 0xff, 0xde, 0x7e, 0xa9, 0xcc, 0xf3, 0xb5, 0x1d, + 0x57, 0x06, 0xda, 0xbb, 0x6c, 0x0a, 0x1e, 0xd4, 0x09, 0x74, 0x84, 0x1d, + 0xfa, 0xdf, 0x33, 0x1e, 0xe2, 0x8f, 0x10, 0xf7, 0x73, 0xab, 0x71, 0xb8, + 0x64, 0xce, 0xc0, 0x49, 0xc0, 0x36, 0xd3, 0x39, 0x31, 0x4c, 0x12, 0x5b, + 0xf3, 0xf9, 0xb4, 0x2c, 0x88, 0xba, 0xd4, 0x1a, 0xbd, 0x0c, 0x99, 0xbd, + 0x0e, 0xad, 0x51, 0xe0, 0xca, 0xdb, 0x25, 0x66, 0x83, 0xe0, 0x55, 0x18, + 0xeb, 0xa6, 0x4e, 0x56, 0xcb, 0x2f, 0xa5, 0xf2, 0x42, 0x7a, 0xa1, 0x05, + 0xf0, 0x3a, 0x71, 0x5a, 0x78, 0x3a, 0x7a, 0x6d, 0x12, 0x9f, 0x43, 0xc5, + 0xcc, 0xb3, 0xfd, 0xf2, 0xbf, 0x05, 0x16, 0xef, 0x07, 0xf9, 0xde, 0x0d, + 0x51, 0xf0, 0x33, 0x86, 0x43, 0x57, 0x40, 0xbc, 0xa9, 0xbd, 0xa0, 0x23, + 0xff, 0xbb, 0xe6, 0x15, 0xa1, 0xeb, 0xe9, 0x78, 0x0d, 0x72, 0x76, 0xf2, + 0xb6, 0x6e, 0x46, 0xe2, 0x86, 0xab, 0x3c, 0x52, 0x2c, 0xc6, 0x77, 0xdd, + 0x57, 0xf7, 0x4d, 0x36, 0xbb, 0x41, 0x08, 0x21, 0xaa, 0xe6, 0x44, 0x50, + 0xed, 0xaf, 0x18, 0xb3, 0xdd, 0x6b, 0x57, 0x46, 0x9e, 0x44, 0x93, 0x20, + 0xe0, 0x62, 0x95, 0xcd, 0xcf, 0xe4, 0x96, 0x92, 0xc3, 0x0d, 0x16, 0xb2, + 0xc3, 0xf4, 0x0f, 0x3f, 0x87, 0x17, 0xb9, 0x7b, 0x60, 0x60, 0xfa, 0xfb, + 0x81, 0x5c, 0xb3, 0xb7, 0x89, 0x73, 0xf7, 0x35, 0xf7, 0x27, 0xf1, 0x0e, + 0xa4, 0xa1, 0xba, 0xea, 0x6a, 0xe3, 0x5c, 0x0f, 0xf7, 0x15, 0xbc, 0x28, + 0x57, 0x27, 0x8f, 0xd8, 0xca, 0x82, 0x19, 0xd0, 0xa3, 0x9d, 0xe5, 0xe0, + 0x44, 0xbf, 0x78, 0xa4, 0x09, 0x69, 0x27, 0xa0, 0x69, 0xb5, 0xd4, 0xbe, + 0x00, 0xe6, 0x03, 0x97, 0xbc, 0x8b, 0xfc, 0x25, 0x70, 0xb3, 0x49, 0x30, + 0xe3, 0x24, 0x19, 0x77, 0xb4, 0x93, 0x46, 0x03, 0xe6, 0x22, 0xaf, 0x76, + 0xd2, 0x90, 0x00, 0x05, 0x46, 0xb8, 0xa4, 0xf5, 0x4c, 0xaa, 0x04, 0x63, + 0xa0, 0x57, 0xe0, 0x20, 0x6e, 0x1a, 0xed, 0x21, 0x86, 0xd0, 0x38, 0x5b, + 0xe6, 0xa7, 0xb0, 0xe7, 0x75, 0xe3, 0x76, 0xb3, 0x15, 0x8b, 0xdc, 0x10, + 0x52, 0x15, 0x21, 0x7b, 0xd0, 0xc4, 0x75, 0x26, 0x1d, 0x6e, 0x0d, 0x4c, + 0x08, 0x5b, 0x95, 0x9a, 0xd0, 0xda, 0xbe, 0x23, 0x98, 0xde, 0x60, 0x2a, + 0xe9, 0xa4, 0x92, 0xf0, 0x92, 0x84, 0xdc, 0x86, 0x60, 0xf5, 0x23, 0x31, + 0xf5, 0xe9, 0xd6, 0x00, 0xc1, 0x78, 0xab, 0x05, 0x94, 0xd3, 0x47, 0x4d, + 0x32, 0x0f, 0x82, 0xa0, 0x99, 0x0b, 0xfe, 0x6b, 0x58, 0xf9, 0x24, 0xf6, + 0x17, 0xa0, 0x5f, 0x24, 0x6a, 0xc6, 0x01, 0xa8, 0xfa, 0xca, 0xdc, 0xb6, + 0x83, 0xcb, 0xd2, 0x3b, 0xb7, 0x0b, 0x04, 0x3e, 0x6a, 0xaf, 0x23, 0x17, + 0x3e, 0x14, 0xce, 0x52, 0x1c, 0xe3, 0x06, 0x66, 0x29, 0x17, 0x6f, 0x7e, + 0x66, 0x06, 0xa9, 0x68, 0x7f, 0xca, 0xad, 0xa8, 0xb7, 0x2d, 0xa4, 0x5d, + 0xa6, 0x16, 0xcd, 0xed, 0xee, 0x14, 0x96, 0xc8, 0x12, 0x69, 0x4e, 0x70, + 0x72, 0x2a, 0x75, 0x82, 0x08, 0x3f, 0x3e, 0x27, 0xa0, 0xea, 0x43, 0x84, + 0xa9, 0x9a, 0x91, 0x87, 0x4f, 0x20, 0x61, 0x55, 0x8d, 0x70, 0xad, 0x6c, + 0x59, 0x5d, 0x13, 0x80, 0xbb, 0x52, 0x55, 0x81, 0x8b, 0x59, 0x94, 0x0f, + 0xc2, 0x54, 0x79, 0x59, 0xe8, 0x9d, 0x58, 0xe5, 0x91, 0x10, 0xb3, 0xef, + 0x1c, 0xda, 0xaa, 0xdd, 0x91, 0x0b, 0xb0, 0x14, 0x3b, 0xad, 0x02, 0x98, + 0x40, 0x3c, 0x54, 0xc4, 0x23, 0xb9, 0x40, 0x54, 0x7e, 0x88, 0x10, 0x3e, + 0x24, 0xe5, 0xf6, 0xdf, 0x5c, 0x9e, 0x7a, 0x9f, 0xd0, 0xff, 0x5e, 0x9c, + 0xb6, 0x30, 0x17, 0x94, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xaa, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x96, 0xff, 0x2f, 0x01, + 0x60, 0x2c, 0x1b, 0xe3, 0xc6, 0xcb, 0xa4, 0x41, 0xa1, 0x44, 0x13, 0x14, + 0xe2, 0x44, 0x77, 0x1c, 0x96, 0xe8, 0xe6, 0x4f, 0x70, 0x99, 0x3a, 0xef, + 0xa1, 0x6f, 0x1f, 0x7f, 0xb9, 0xe9, 0x1e, 0x35, 0x37, 0x5b, 0x94, 0x90, + 0x78, 0xcc, 0x8d, 0xcd, 0x6c, 0x9f, 0xf6, 0x73, 0xed, 0x23, 0xa2, 0x28, + 0x64, 0x58, 0x50, 0x64, 0x05, 0xbc, 0xc9, 0x9b, 0x5a, 0xec, 0x3f, 0x2b, + 0x61, 0xcf, 0xa7, 0x35, 0x56, 0x8c, 0x77, 0x68, 0xd6, 0xcf, 0x9b, 0xc5, + 0x62, 0xee, 0x3a, 0xb2, 0xfe, 0x78, 0xba, 0x02, 0xe7, 0x26, 0x8a, 0x89, + 0x30, 0x19, 0xcc, 0xb0, 0x98, 0xbf, 0x30, 0x2c, 0xae, 0x13, 0x6c, 0x93, + 0x86, 0x19, 0x84, 0x13, 0x01, 0x2f, 0x39, 0x4e, 0x33, 0xd1, 0x15, 0x99, + 0xf7, 0x1e, 0xb8, 0x86, 0xdb, 0xb6, 0xf9, 0x56, 0x42, 0x0e, 0x4a, 0xb1, + 0x5e, 0xf0, 0x9a, 0x06, 0x00, 0x00, 0x00, 0x00, 0xea, 0xaa, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xcd, 0xde, 0xad, 0x40, + 0x34, 0xcd, 0x79, 0x0a, 0x29, 0x84, 0x05, 0x3f, 0xb5, 0xbe, 0x49, 0x84, + 0x43, 0xcc, 0xa6, 0xe3, 0xe9, 0xdc, 0x84, 0x14, 0xe7, 0xb3, 0x1b, 0x96, + 0xe8, 0xda, 0x35, 0x15, 0x38, 0xf5, 0xb3, 0xb5, 0x91, 0xc3, 0xc3, 0x94, + 0xc6, 0x79, 0xeb, 0xf5, 0x22, 0x78, 0xf0, 0x0b, 0xda, 0xb0, 0x91, 0xa7, + 0x43, 0x71, 0x8e, 0xa6, 0x52, 0x0f, 0x81, 0x06, 0xc8, 0xdf, 0xb5, 0x1f, + 0x92, 0xb0, 0xfe, 0x93, 0x38, 0x4c, 0xf4, 0x17, 0x66, 0x31, 0xea, 0x08, + 0x72, 0xb9, 0xaa, 0xfd, 0x40, 0x8d, 0xbf, 0x56, 0x19, 0xb1, 0xb5, 0x8e, + 0x4e, 0x4e, 0x73, 0x7f, 0x4b, 0x0c, 0x70, 0x94, 0x7c, 0x9f, 0xfc, 0x23, + 0x35, 0xba, 0xd2, 0x23, 0x88, 0x1d, 0x83, 0x28, 0x45, 0xd7, 0x1b, 0x63, + 0xfb, 0x36, 0x86, 0x06, 0xf3, 0x99, 0x81, 0x6e, 0xd7, 0xf1, 0xd4, 0x53, + 0x6d, 0x30, 0x3c, 0x8d, 0xac, 0xc6, 0x9a, 0xd5, 0xe8, 0x4f, 0x11, 0x58, + 0xba, 0xfd, 0x67, 0x06, 0xe7, 0x1a, 0xb4, 0xa1, 0x45, 0x13, 0xf2, 0x3b, + 0xdc, 0x71, 0xf0, 0xc6, 0x53, 0xfc, 0x8b, 0x2f, 0x14, 0xe4, 0xe0, 0xd6, + 0x8c, 0x96, 0x4c, 0x48, 0xc0, 0x30, 0x6e, 0x00, 0x0f, 0x42, 0xfe, 0xa7, + 0x9d, 0x0f, 0xf2, 0x52, 0x58, 0xf9, 0x35, 0x33, 0x99, 0xda, 0xd5, 0x9d, + 0x61, 0x26, 0x6b, 0x80, 0xff, 0x08, 0x51, 0x54, 0x26, 0xfa, 0x8d, 0xfc, + 0x67, 0x60, 0x93, 0x0e, 0xcd, 0x78, 0x41, 0x5a, 0x31, 0x47, 0x14, 0xb0, + 0x65, 0x89, 0x30, 0xcb, 0x0c, 0xc5, 0xa0, 0x37, 0xa8, 0xe0, 0xcf, 0x24, + 0xa4, 0x2f, 0xad, 0xa7, 0x9c, 0xa2, 0xe8, 0x81, 0x17, 0xbe, 0x2f, 0xd5, + 0xd1, 0xa8, 0xff, 0x9d, 0x5e, 0x7f, 0xd9, 0x6c, 0x56, 0xe6, 0xc4, 0x60, + 0x8d, 0xa5, 0x47, 0x5e, 0x43, 0x1e, 0x34, 0x23, 0xb3, 0x6a, 0xdf, 0x6c, + 0xf8, 0xd1, 0x85, 0x11, 0xaa, 0x74, 0x85, 0x71, 0x27, 0xc5, 0x80, 0x37, + 0x60, 0xb4, 0x2b, 0x53, 0x5a, 0xc4, 0x35, 0xd1, 0xe8, 0x4b, 0x01, 0x58, + 0x1f, 0xdb, 0x73, 0xf3, 0x2c, 0x8b, 0xbb, 0x17, 0x36, 0x76, 0x35, 0x6b, + 0xa0, 0x82, 0x47, 0xf5, 0x16, 0x21, 0x41, 0x43, 0xc9, 0x1f, 0x53, 0xf9, + 0xe9, 0x47, 0xf0, 0x9c, 0x6d, 0xe3, 0x23, 0x59, 0x74, 0xdc, 0x1a, 0x8f, + 0x4e, 0x6c, 0x71, 0x83, 0x7e, 0xd0, 0x2b, 0x50, 0x44, 0x86, 0x5f, 0xbf, + 0x60, 0x92, 0xeb, 0x9a, 0x9b, 0xa2, 0xc9, 0x2b, 0xa8, 0xc4, 0x77, 0x4e, + 0x3f, 0xf8, 0xa6, 0x39, 0x50, 0x5c, 0x7e, 0x2a, 0x70, 0xb0, 0x5d, 0x28, + 0xb2, 0x81, 0xa9, 0xaf, 0x16, 0x5e, 0x27, 0xeb, 0x03, 0x0e, 0x82, 0xad, + 0x28, 0x51, 0x16, 0xd1, 0xf4, 0x58, 0x75, 0x1a, 0xf9, 0x6a, 0xbf, 0x73, + 0xd7, 0x84, 0x07, 0x7f, 0x4c, 0x4e, 0x29, 0x02, 0x9b, 0x60, 0x81, 0x85, + 0xa9, 0xbf, 0xc7, 0xa0, 0x8f, 0x8a, 0xdc, 0xa4, 0xc5, 0x17, 0x51, 0x24, + 0x15, 0x28, 0x9e, 0x5e, 0x78, 0x84, 0x21, 0x02, 0xca, 0x26, 0x61, 0x4e, + 0x95, 0xa6, 0x8d, 0xa6, 0x98, 0x7d, 0x1f, 0x84, 0x19, 0x24, 0x8b, 0x31, + 0x76, 0x89, 0x2a, 0x5f, 0xa9, 0xfb, 0xaa, 0x8a, 0x8c, 0xce, 0xe4, 0x30, + 0xd6, 0xec, 0x5b, 0x39, 0xb7, 0x09, 0x80, 0x23, 0x4c, 0xe1, 0x6e, 0x8f, + 0x7c, 0x10, 0xe8, 0x8a, 0x60, 0x35, 0xd7, 0xa3, 0xe0, 0x5f, 0xcd, 0xfa, + 0x3d, 0x8f, 0xd8, 0x5d, 0xec, 0xc9, 0xc5, 0xa0, 0x73, 0x41, 0x89, 0xe5, + 0x39, 0xf2, 0x42, 0xff, 0x08, 0xa0, 0x12, 0xb7, 0x4a, 0x5e, 0x46, 0x06, + 0x31, 0xbd, 0x88, 0x5e, 0x9e, 0x05, 0x17, 0x51, 0xb3, 0xe7, 0x88, 0x10, + 0x19, 0x32, 0xff, 0x8a, 0x1e, 0xce, 0x66, 0xbc, 0x84, 0x1f, 0xed, 0x52, + 0x52, 0x77, 0xe1, 0x5e, 0xa6, 0x21, 0xe4, 0xad, 0x59, 0xca, 0xa3, 0x77, + 0xea, 0x66, 0x28, 0x15, 0x73, 0x3a, 0xfd, 0xe4, 0x75, 0x46, 0x99, 0x59, + 0x5c, 0x7a, 0x9b, 0x9d, 0x11, 0xb4, 0x76, 0x45, 0x06, 0x45, 0x41, 0x1e, + 0x94, 0xb7, 0xd9, 0xb8, 0xcb, 0xbf, 0x71, 0xec, 0xba, 0x9f, 0x4a, 0x1b, + 0xbc, 0xfd, 0x5c, 0x06, 0x64, 0xfd, 0x31, 0x52, 0xc0, 0xe4, 0xa7, 0x21, + 0x2f, 0x22, 0x92, 0xf0, 0x51, 0x33, 0x92, 0x1d, 0x40, 0x3c, 0x01, 0x81, + 0x3b, 0xa8, 0x2e, 0x4e, 0xb6, 0x60, 0xcd, 0xd4, 0x36, 0x3b, 0x2e, 0x1d, + 0x5e, 0x43, 0xd9, 0x94, 0xf1, 0x51, 0xd3, 0x59, 0x94, 0x6a, 0xd5, 0x5f, + 0x1f, 0xd3, 0xa6, 0x55, 0xda, 0x15, 0xf1, 0x3e, 0x2c, 0x60, 0xb8, 0xc3, + 0xda, 0x0e, 0x56, 0x53, 0xea, 0xcd, 0x39, 0x27, 0x94, 0x86, 0x94, 0xb2, + 0x5b, 0xd8, 0x9a, 0x12, 0x94, 0xb0, 0xb6, 0x77, 0x28, 0xba, 0xde, 0xb6, + 0x60, 0x4d, 0x2b, 0x6e, 0x3d, 0xf6, 0xf1, 0x48, 0xf7, 0x77, 0xa1, 0x49, + 0xe0, 0x9f, 0x1e, 0xc9, 0xe6, 0xcb, 0x95, 0x26, 0x61, 0x5a, 0xc9, 0xed, + 0x49, 0x40, 0x17, 0x57, 0x15, 0xfc, 0x3c, 0xb8, 0x28, 0x79, 0xb8, 0x42, + 0x2a, 0xf9, 0xd4, 0x19, 0xb9, 0x5f, 0x41, 0xc2, 0x25, 0xd7, 0x88, 0x34, + 0xb3, 0x25, 0x4e, 0xca, 0xff, 0x9e, 0x59, 0x9a, 0x33, 0xc8, 0x12, 0xf9, + 0xd5, 0x70, 0xc0, 0x8b, 0x43, 0x13, 0xc4, 0x8d, 0x45, 0x99, 0xaa, 0xd7, + 0xeb, 0xb1, 0xe9, 0xb7, 0x5b, 0xab, 0x48, 0xd1, 0x26, 0x60, 0x8c, 0x13, + 0x55, 0x8a, 0x41, 0xd3, 0x68, 0x58, 0xd4, 0xa6, 0x30, 0x6e, 0x88, 0x3e, + 0x81, 0x6e, 0x61, 0x06, 0x13, 0x66, 0xd5, 0x8e, 0x5d, 0x87, 0x4f, 0xd9, + 0xb1, 0x66, 0xb3, 0xc5, 0x88, 0xa9, 0xc0, 0x73, 0xcb, 0x7f, 0x42, 0xec, + 0x96, 0x64, 0xad, 0x72, 0x85, 0x72, 0xaf, 0xeb, 0xa9, 0xc4, 0x17, 0x86, + 0xab, 0xe7, 0x23, 0xd7, 0x96, 0xf7, 0xb2, 0xb3, 0x51, 0xe1, 0x9a, 0x3b, + 0x0e, 0xaf, 0x89, 0xca, 0x7b, 0xf1, 0x70, 0x7b, 0xc7, 0x82, 0xfc, 0xc7, + 0x6c, 0x37, 0xd9, 0x7b, 0x82, 0x0f, 0x94, 0xcf, 0xd1, 0xa9, 0x33, 0xc2, + 0xa4, 0xab, 0xed, 0xad, 0xee, 0x64, 0x5d, 0x04, 0xf2, 0xcb, 0x8e, 0x99, + 0x22, 0x33, 0x69, 0x85, 0x85, 0xb6, 0x1a, 0x9b, 0x09, 0x18, 0xbe, 0xcd, + 0x63, 0xf6, 0x5d, 0x52, 0xbc, 0x26, 0x99, 0x3e, 0x52, 0xe5, 0x0c, 0xc5, + 0xee, 0xdd, 0xbb, 0x07, 0xbc, 0x38, 0xc1, 0x67, 0x96, 0x8c, 0xe6, 0xe4, + 0x18, 0xfa, 0x07, 0x91, 0x48, 0xef, 0x9c, 0x70, 0x9d, 0x5b, 0x1c, 0x0e, + 0xd5, 0xd3, 0x59, 0xee, 0x44, 0x13, 0xf7, 0x00, 0xa6, 0x20, 0xad, 0x65, + 0x1d, 0xb7, 0x96, 0x2f, 0x79, 0x7b, 0x04, 0xa3, 0x10, 0x90, 0x29, 0x8c, + 0xa3, 0x2e, 0x14, 0x39, 0xd3, 0xe4, 0x6e, 0x46, 0xf7, 0x6e, 0x96, 0x68, + 0xd9, 0xef, 0x45, 0xf7, 0x3c, 0xcd, 0xc7, 0xca, 0x33, 0x64, 0x8e, 0x31, + 0x80, 0x48, 0x7b, 0x7c, 0x81, 0x9a, 0x48, 0xff, 0xd5, 0x0d, 0x74, 0xe7, + 0x77, 0x46, 0x61, 0x9b, 0xde, 0xed, 0x83, 0xe9, 0x4f, 0x92, 0xc1, 0x16, + 0xad, 0x44, 0x40, 0x23, 0xce, 0x04, 0x31, 0xbf, 0xcf, 0xe2, 0x5a, 0x68, + 0x5a, 0xf4, 0x0f, 0xe1, 0x87, 0x79, 0xb0, 0x32, 0x0b, 0x09, 0x6b, 0x72, + 0x2b, 0x16, 0x06, 0x67, 0x82, 0x0b, 0x92, 0x35, 0xdb, 0x4c, 0xe2, 0x4a, + 0x60, 0x99, 0xaf, 0x52, 0x10, 0x4b, 0xa5, 0xcf, 0xac, 0x66, 0x49, 0x56, + 0x04, 0xc0, 0xd6, 0x6f, 0x62, 0x53, 0x6f, 0xcb, 0x62, 0xe9, 0xa5, 0xca, + 0x18, 0x8e, 0x86, 0x3f, 0x36, 0xfd, 0xea, 0x55, 0x16, 0x6d, 0x6c, 0x6a, + 0x8f, 0xa7, 0x9c, 0x70, 0x15, 0xd7, 0xf4, 0x57, 0x68, 0x04, 0x84, 0x60, + 0x3b, 0xb0, 0x32, 0xc4, 0xea, 0x9d, 0x70, 0xb9, 0xa6, 0x34, 0xe5, 0xfa, + 0xa1, 0x24, 0x54, 0x7f, 0xef, 0xac, 0xb4, 0x5f, 0xa0, 0xc0, 0x40, 0x3f, + 0x73, 0xdf, 0x56, 0xa6, 0xd9, 0x17, 0xf4, 0xff, 0x50, 0xae, 0x21, 0x0d, + 0x5a, 0xe0, 0xb0, 0xf9, 0x5b, 0x7a, 0x61, 0x6e, 0xa6, 0x85, 0x85, 0xbf, + 0x19, 0x03, 0xe2, 0x74, 0x1f, 0x03, 0x70, 0x76, 0x3c, 0xed, 0x02, 0x7d, + 0xfa, 0xf9, 0x1e, 0x17, 0xdd, 0x42, 0x30, 0xf0, 0x32, 0x47, 0x46, 0xae, + 0xf5, 0x64, 0xe6, 0x5e, 0x2b, 0x40, 0x86, 0x97, 0xb1, 0x24, 0x52, 0x69, + 0x67, 0x79, 0x8e, 0x0d, 0xcc, 0x07, 0xcb, 0x72, 0x29, 0xe9, 0xba, 0x2d, + 0xf7, 0xcb, 0xe3, 0x86, 0x06, 0xaa, 0x6d, 0x79, 0xf8, 0xb6, 0x93, 0x0a, + 0x9c, 0x97, 0xef, 0x47, 0x37, 0x13, 0x2e, 0x6b, 0xfd, 0x59, 0x0c, 0xc9, + 0x5e, 0x5e, 0xcd, 0x71, 0x6f, 0x99, 0x0d, 0x88, 0x9d, 0xbb, 0x7c, 0x2b, + 0x22, 0xd5, 0xbe, 0xee, 0x26, 0x1c, 0xe1, 0xad, 0xc8, 0x4d, 0x5f, 0x6b, + 0xd1, 0xf4, 0x30, 0x4d, 0x46, 0x1d, 0x54, 0x11, 0x4b, 0xa0, 0x7f, 0x94, + 0x71, 0xc0, 0x44, 0x4a, 0x42, 0x11, 0xf5, 0x89, 0xec, 0xb5, 0x24, 0x45, + 0xf1, 0xf0, 0x30, 0x54, 0xf8, 0x62, 0xdb, 0x58, 0x3d, 0x7c, 0x2a, 0x82, + 0xe5, 0xbe, 0x13, 0xcf, 0xdc, 0x88, 0xfb, 0xd3, 0x1e, 0x4d, 0xa5, 0x3e, + 0xad, 0x95, 0xa2, 0xe6, 0x48, 0x73, 0xb2, 0xbe, 0x96, 0xef, 0x8e, 0x0b, + 0x28, 0xf9, 0xbe, 0x2a, 0xd6, 0x68, 0x9e, 0x9c, 0x7b, 0x5a, 0xaf, 0x20, + 0xf6, 0xa5, 0x3f, 0x99, 0x61, 0x57, 0xe8, 0x1c, 0xb2, 0xc3, 0xd0, 0x7f, + 0x2c, 0xb5, 0xe9, 0x66, 0x8e, 0x88, 0xec, 0x13, 0x51, 0xbc, 0x8e, 0xb6, + 0xe2, 0x91, 0xbf, 0x5e, 0x8c, 0x1c, 0xdd, 0x0e, 0x0a, 0x13, 0x06, 0xc6, + 0x62, 0x1c, 0x41, 0x8d, 0xa1, 0xc0, 0xf2, 0xfa, 0x76, 0x35, 0xaa, 0x77, + 0x06, 0x3f, 0x76, 0x50, 0xf6, 0x43, 0xf2, 0x25, 0x00, 0x79, 0xde, 0xca, + 0xa1, 0x06, 0x6f, 0xb4, 0x17, 0x4b, 0x99, 0x5a, 0x00, 0x32, 0xd6, 0xb0, + 0x1f, 0x80, 0x53, 0x16, 0xaa, 0x87, 0x72, 0xa2, 0x34, 0xaf, 0x90, 0x3d, + 0x60, 0xde, 0x0e, 0x6d, 0x83, 0xda, 0xb2, 0x11, 0x2f, 0x39, 0xdc, 0x1a, + 0xfe, 0x51, 0x74, 0x10, 0x3c, 0x41, 0xd5, 0x41, 0x65, 0x4a, 0xa0, 0x11, + 0xde, 0x95, 0x34, 0xef, 0xa0, 0xc9, 0xa8, 0xd3, 0xcb, 0xb9, 0x7d, 0x51, + 0x7d, 0xff, 0x26, 0x88, 0xd8, 0x29, 0x0e, 0xa0, 0xd4, 0xa7, 0x07, 0x33, + 0xe7, 0x7d, 0x59, 0x9f, 0x35, 0xc1, 0xb5, 0xf7, 0x78, 0x78, 0x84, 0xf0, + 0x20, 0x41, 0x3f, 0x02, 0x7d, 0x41, 0x90, 0x01, 0x8d, 0xa4, 0xd8, 0xd7, + 0xeb, 0x56, 0x7f, 0x38, 0xbc, 0x1e, 0x15, 0xdf, 0xfc, 0x34, 0xe7, 0x99, + 0xd4, 0x92, 0xd5, 0xf3, 0x9e, 0x16, 0x0b, 0x5c, 0xeb, 0xb6, 0x78, 0xac, + 0x84, 0x06, 0x8e, 0xfe, 0xd0, 0x7c, 0xce, 0x4a, 0x43, 0x49, 0x3b, 0xe1, + 0xab, 0x57, 0xc0, 0x12, 0xd6, 0x9d, 0xa4, 0xee, 0x91, 0x10, 0x81, 0xe2, + 0xfc, 0x02, 0x26, 0x7a, 0xca, 0x81, 0x5b, 0x2f, 0x34, 0x51, 0xdd, 0x25, + 0x4d, 0xc8, 0xf9, 0x3e, 0x59, 0x0f, 0x3d, 0x64, 0x51, 0xbf, 0x42, 0xc4, + 0x92, 0x9d, 0x8f, 0x39, 0x8a, 0x31, 0x09, 0x24, 0x19, 0x44, 0xc0, 0xf4, + 0xea, 0xca, 0x59, 0xcb, 0x86, 0x6c, 0x02, 0x7a, 0xe5, 0x30, 0x79, 0xe2, + 0x2c, 0x76, 0x08, 0x8f, 0x98, 0x0d, 0x4d, 0x12, 0xc3, 0x98, 0xb4, 0x24, + 0x04, 0x4f, 0x51, 0xec, 0x4e, 0xec, 0xbd, 0x8c, 0xc4, 0x79, 0x51, 0x7f, + 0xe1, 0xce, 0x76, 0x28, 0x0b, 0x7b, 0xc5, 0x3f, 0x5b, 0x48, 0x19, 0x76, + 0x68, 0x31, 0x8e, 0x28, 0xff, 0x18, 0x24, 0xe3, 0x91, 0xe7, 0x49, 0x0d, + 0x10, 0xbd, 0x00, 0xc6, 0x58, 0xfd, 0xb6, 0x88, 0x63, 0xbd, 0xb4, 0x4b, + 0xb8, 0xed, 0xdd, 0xb7, 0x53, 0xce, 0x89, 0xdb, 0x7f, 0xf4, 0xc3, 0x21, + 0x31, 0xad, 0x20, 0x78, 0x06, 0x71, 0xaf, 0xc0, 0xe3, 0xdc, 0xb8, 0xf4, + 0x80, 0xc8, 0x33, 0x1d, 0x8b, 0xff, 0x5a, 0x92, 0x68, 0x4d, 0xc1, 0x5b, + 0x58, 0x3e, 0xf6, 0x7f, 0xba, 0x42, 0xa5, 0x6d, 0xec, 0x03, 0x36, 0xc9, + 0x3f, 0x83, 0x1f, 0x0c, 0x33, 0x57, 0x6a, 0x43, 0x5f, 0x11, 0x72, 0x19, + 0x2c, 0xda, 0x71, 0x58, 0xf2, 0x50, 0x50, 0x06, 0x97, 0xd0, 0xdf, 0xd1, + 0x4f, 0x0b, 0x00, 0x1a, 0xea, 0x85, 0x3b, 0x37, 0x2f, 0xf0, 0x40, 0x52, + 0xd9, 0x2a, 0xe8, 0x54, 0xa5, 0xee, 0x0f, 0x49, 0x74, 0x39, 0x96, 0x5d, + 0x60, 0x8f, 0x14, 0x59, 0x86, 0x59, 0x86, 0xfb, 0x67, 0x71, 0x5c, 0x26, + 0x5f, 0xe9, 0xab, 0x32, 0x77, 0x83, 0xdf, 0x02, 0x19, 0x85, 0xae, 0x4d, + 0x7d, 0x9c, 0x8d, 0x4f, 0x61, 0x05, 0x3c, 0x0c, 0xc6, 0x74, 0x9e, 0x36, + 0x33, 0xb8, 0x14, 0x85, 0xab, 0xa2, 0x0b, 0x5d, 0x22, 0xf2, 0x50, 0x3e, + 0xa4, 0x88, 0xac, 0x67, 0xf9, 0x06, 0xe5, 0x30, 0x8e, 0xf9, 0x67, 0x34, + 0xd5, 0x94, 0x5b, 0x35, 0xb7, 0x3d, 0x39, 0x5f, 0x4e, 0xae, 0xfe, 0xf7, + 0x57, 0xd3, 0x95, 0x7b, 0x0a, 0xd9, 0x92, 0x4a, 0x66, 0x29, 0xa0, 0x18, + 0x35, 0x54, 0x14, 0x44, 0x79, 0x72, 0xc3, 0xbc, 0xa8, 0x1a, 0xd3, 0xa3, + 0xbe, 0x6f, 0x9e, 0xcc, 0x68, 0xb6, 0x5f, 0xd4, 0x42, 0xab, 0xe8, 0x09, + 0x60, 0x57, 0x2e, 0xb2, 0x9a, 0x5b, 0x62, 0x38, 0xfb, 0x0a, 0x35, 0x9c, + 0x4f, 0xf7, 0xe0, 0xd2, 0x06, 0x04, 0x1f, 0x79, 0x7f, 0xa7, 0x7b, 0xd3, + 0x63, 0xc9, 0xbd, 0x16, 0x58, 0x38, 0x7b, 0xaa, 0x08, 0xf3, 0x14, 0x6c, + 0x25, 0xf8, 0xa5, 0xe9, 0x4b, 0x45, 0x34, 0x89, 0x76, 0x74, 0xcb, 0x41, + 0x9c, 0x2a, 0xd9, 0xca, 0xb3, 0x12, 0x46, 0x6d, 0x85, 0x4d, 0x63, 0x2d, + 0x24, 0x1b, 0x19, 0x6b, 0x3f, 0x61, 0x6b, 0x4b, 0x15, 0x83, 0x2d, 0x8f, + 0x61, 0xab, 0xd1, 0x55, 0x93, 0x4e, 0x26, 0xd6, 0x7a, 0x0a, 0x8a, 0xff, + 0x58, 0x44, 0xf7, 0x39, 0x31, 0x1a, 0xab, 0xa6, 0x98, 0x31, 0x41, 0x03, + 0xb6, 0xc9, 0xf5, 0x50, 0xe3, 0x7b, 0xc0, 0x59, 0x74, 0x60, 0x91, 0xb4, + 0x79, 0x02, 0x25, 0xc1, 0xb5, 0xbd, 0xcb, 0x6e, 0x40, 0x61, 0xfe, 0x68, + 0x29, 0x83, 0x1b, 0xd2, 0x49, 0xe1, 0x31, 0xde, 0xdd, 0x53, 0xb0, 0xb8, + 0x96, 0xa2, 0xce, 0xea, 0x8b, 0x66, 0x2c, 0x5a, 0x80, 0x51, 0x0b, 0xc1, + 0x2d, 0x9a, 0xfa, 0x9d, 0xc6, 0xcc, 0x2b, 0xbb, 0xaa, 0xce, 0x98, 0xaa, + 0x26, 0x15, 0x8f, 0x4a, 0xe7, 0xdb, 0x17, 0x6c, 0xe5, 0x58, 0xc9, 0xae, + 0xe4, 0x9c, 0x1d, 0xab, 0x59, 0x84, 0x3e, 0x27, 0x76, 0x03, 0xe3, 0x82, + 0x64, 0x6f, 0x6e, 0x6f, 0x63, 0xd2, 0x12, 0x84, 0xe3, 0x9b, 0x9d, 0x7e, + 0x53, 0x1a, 0x54, 0x8d, 0xc1, 0xf0, 0x94, 0xae, 0xad, 0x8f, 0x6a, 0x12, + 0x4e, 0xa7, 0x30, 0xdb, 0x55, 0xbe, 0x09, 0xe2, 0x56, 0x08, 0xc4, 0x3a, + 0xb0, 0x55, 0xb0, 0x24, 0x96, 0xa6, 0x3e, 0x28, 0xd0, 0x35, 0xfb, 0x58, + 0x47, 0xba, 0x2d, 0x51, 0xbb, 0x72, 0x20, 0x59, 0xd2, 0xdd, 0x9c, 0xe2, + 0xb5, 0x31, 0x90, 0xac, 0x74, 0x5d, 0x9f, 0x3d, 0x8c, 0x1c, 0x96, 0xc0, + 0x60, 0x61, 0xa8, 0xbb, 0x3c, 0xb3, 0x6d, 0x6d, 0x92, 0x4a, 0xca, 0xbb, + 0x60, 0x5e, 0x82, 0x0d, 0x7f, 0xab, 0x4b, 0x36, 0x4c, 0x93, 0x0d, 0x88, + 0x71, 0xaf, 0xb6, 0x53, 0xb0, 0x38, 0xb4, 0x1c, 0xb4, 0x7b, 0xd4, 0x13, + 0x32, 0x6c, 0xe4, 0xee, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xb2, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x88, 0x83, 0x91, 0x4c, + 0x2e, 0x1e, 0xbe, 0xa4, 0xb5, 0x96, 0xff, 0x67, 0x50, 0xe9, 0x81, 0x0e, + 0x5d, 0x0e, 0xad, 0xc4, 0x1f, 0xeb, 0x98, 0x38, 0xcc, 0x54, 0x9d, 0x27, + 0xa6, 0xf1, 0x37, 0x23, 0xce, 0xb4, 0x5b, 0xff, 0x12, 0xb1, 0xb8, 0x35, + 0x5e, 0x03, 0x02, 0x04, 0xad, 0xa6, 0x6f, 0x43, 0xfc, 0xe4, 0xbe, 0x0c, + 0xe0, 0x93, 0xd5, 0xef, 0x09, 0xfa, 0x04, 0xe9, 0x5a, 0x22, 0xd4, 0x81, + 0xc1, 0x27, 0x4f, 0x5f, 0x6e, 0x83, 0x5a, 0x8a, 0x2d, 0xbb, 0x8f, 0xa4, + 0x91, 0xcc, 0x82, 0x37, 0x3b, 0x14, 0x98, 0x58, 0x86, 0x44, 0xb7, 0xa9, + 0x58, 0xf3, 0x3d, 0x49, 0x71, 0x7a, 0x37, 0xcd, 0xc5, 0xb9, 0xc9, 0x46, + 0xd5, 0xd4, 0x17, 0x60, 0x1a, 0xbf, 0x93, 0xa9, 0xe9, 0x08, 0x25, 0x40, + 0xd1, 0x65, 0xae, 0xdd, 0x85, 0xa6, 0xcc, 0x06, 0xca, 0x91, 0xe1, 0x63, + 0xf9, 0x6b, 0x15, 0xa8, 0x04, 0x61, 0xd2, 0xa6, 0x59, 0x21, 0x1a, 0x1c, + 0xc9, 0xa9, 0xa9, 0xc8, 0x54, 0x86, 0xac, 0xa5, 0xd6, 0x95, 0x39, 0x83, + 0x4b, 0x6b, 0x69, 0xa6, 0x94, 0xd8, 0xc0, 0xfb, 0x66, 0x0f, 0x3a, 0xbe, + 0xc7, 0xf3, 0xcc, 0xd5, 0xb7, 0x1b, 0x60, 0x02, 0x95, 0x45, 0x4a, 0x12, + 0xc9, 0xfe, 0x75, 0x7c, 0x1b, 0xb2, 0x86, 0x96, 0x28, 0x07, 0xa2, 0x18, + 0x7a, 0x6c, 0x90, 0x6f, 0x32, 0x0c, 0xc8, 0x34, 0xbc, 0x75, 0x4d, 0x96, + 0x03, 0xa6, 0x0f, 0x3d, 0x35, 0x1b, 0x64, 0x76, 0x95, 0x55, 0xff, 0x25, + 0xd4, 0x71, 0xcf, 0x8a, 0x73, 0x6d, 0x9b, 0x74, 0xfe, 0xff, 0x9e, 0x31, + 0x9e, 0x5e, 0x89, 0x5a, 0x1a, 0xeb, 0x8d, 0x06, 0x3b, 0xf2, 0xf6, 0x06, + 0x5d, 0xc3, 0xba, 0x04, 0xca, 0x0f, 0x07, 0x2c, 0xbd, 0x54, 0x52, 0xd9, + 0x1c, 0x2f, 0x0e, 0x13, 0x5e, 0x25, 0x13, 0xe5, 0xd7, 0x8e, 0x19, 0x42, + 0x1b, 0x52, 0x2e, 0xd2, 0x8f, 0xc5, 0x8e, 0x1c, 0x34, 0x2e, 0x4d, 0xd5, + 0x51, 0x7d, 0x91, 0x64, 0xbc, 0xb4, 0x0d, 0xc9, 0xe7, 0x1c, 0x6c, 0x47, + 0xe9, 0xbb, 0x67, 0x9a, 0x96, 0xde, 0xad, 0xff, 0xba, 0x35, 0x25, 0x6d, + 0x57, 0xa1, 0x93, 0xfe, 0xe2, 0x8d, 0x02, 0xeb, 0xf0, 0x2f, 0x54, 0xfd, + 0x46, 0xc0, 0x8f, 0xea, 0x32, 0x7b, 0x57, 0xda, 0xe0, 0x29, 0x1c, 0x19, + 0xba, 0xa4, 0xa6, 0x1c, 0x6e, 0xeb, 0x7a, 0xa8, 0x8a, 0xe1, 0xc6, 0x12, + 0xf5, 0xa3, 0x24, 0x1a, 0x96, 0xe1, 0x02, 0xc0, 0xf4, 0x7d, 0x14, 0x72, + 0xd6, 0x12, 0x8e, 0x6c, 0x8c, 0xd2, 0xfd, 0x88, 0x78, 0x48, 0xf3, 0x74, + 0x38, 0x86, 0x04, 0x68, 0x6d, 0x7c, 0xf4, 0x4c, 0x40, 0x17, 0xf6, 0x8f, + 0xb2, 0x6c, 0xd7, 0x66, 0x66, 0x3b, 0x38, 0xa1, 0xbb, 0x1e, 0xff, 0x72, + 0x1f, 0x64, 0x56, 0xc2, 0x53, 0x1c, 0x6f, 0x84, 0x2b, 0xbd, 0x23, 0xd9, + 0xb4, 0x6b, 0x87, 0x79, 0x99, 0xec, 0x81, 0x8d, 0x1a, 0x58, 0x00, 0xf0, + 0x2c, 0xc1, 0xc4, 0x57, 0x74, 0x0f, 0xce, 0x32, 0xe2, 0x5e, 0xae, 0x02, + 0x1c, 0xe8, 0x94, 0xc6, 0x44, 0xaa, 0x7b, 0x9a, 0x32, 0xb5, 0x33, 0xac, + 0xfc, 0x41, 0x65, 0xf2, 0xca, 0xcc, 0xc6, 0x74, 0x36, 0xb2, 0xc9, 0x0e, + 0x26, 0x73, 0xae, 0x68, 0x98, 0xa4, 0x36, 0xe8, 0x98, 0x39, 0xad, 0x05, + 0x3f, 0xca, 0x12, 0xcc, 0x86, 0xfd, 0xc6, 0x57, 0xf0, 0x02, 0x4e, 0x45, + 0xcb, 0x54, 0x34, 0xdd, 0x66, 0x26, 0xab, 0xda, 0x95, 0xa5, 0x85, 0xec, + 0x02, 0x03, 0xb6, 0x29, 0x30, 0x11, 0x40, 0x54, 0x9a, 0x6a, 0x87, 0x2e, + 0x97, 0xa1, 0x7e, 0xeb, 0x34, 0x39, 0x78, 0x3b, 0xbc, 0x5f, 0x8e, 0xc5, + 0x0e, 0x21, 0x29, 0x4b, 0xb7, 0x1b, 0xe7, 0x14, 0x08, 0x34, 0xb7, 0x9a, + 0x0a, 0xb2, 0x6c, 0x25, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xb5, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe2, 0x7d, 0x48, 0xdd, + 0x1a, 0xcb, 0xb6, 0x5c, 0x6f, 0xbe, 0x32, 0x9d, 0xd2, 0x2b, 0x9e, 0x10, + 0x65, 0xd7, 0x1e, 0xec, 0xc8, 0xb5, 0x10, 0x64, 0x8f, 0x5d, 0xef, 0xfe, + 0x9b, 0x6c, 0x9b, 0x02, 0x6a, 0x6d, 0xf7, 0x98, 0x7b, 0xf7, 0x17, 0xfd, + 0x49, 0x1b, 0x6a, 0xc5, 0x3c, 0xa0, 0xfc, 0xa8, 0x94, 0x95, 0xed, 0x48, + 0x81, 0x04, 0x53, 0x8c, 0xbe, 0xe4, 0x4e, 0xaf, 0xc1, 0x9d, 0xc3, 0xdf, + 0x00, 0x00, 0x00, 0x00, 0x5a, 0xb5, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xae, 0xb0, 0x67, 0x5b, 0x99, 0x26, 0x07, 0xfb, + 0x6c, 0x98, 0xfe, 0xbb, 0x35, 0xf1, 0x5b, 0x02, 0xc6, 0x03, 0xfc, 0x97, + 0x21, 0x16, 0x8d, 0x48, 0xd4, 0x4f, 0x03, 0xd9, 0x7c, 0x9f, 0xa6, 0x1e, + 0x6f, 0x5a, 0x58, 0x17, 0x6d, 0x26, 0xb4, 0xc5, 0x4c, 0xe5, 0x93, 0x0a, + 0x9c, 0xb2, 0x40, 0xbc, 0x60, 0xc7, 0x2b, 0xdb, 0x3b, 0xc0, 0x3c, 0x5c, + 0x44, 0x4b, 0xdd, 0x58, 0xbe, 0xdc, 0xc5, 0xb5, 0x6a, 0xf9, 0x5e, 0x73, + 0x07, 0x58, 0x8f, 0x45, 0x7b, 0xac, 0xba, 0x82, 0x96, 0x49, 0x4d, 0x22, + 0x70, 0x7a, 0x3d, 0x69, 0x26, 0x8b, 0x88, 0x13, 0xf1, 0x8d, 0xfc, 0xdf, + 0x73, 0xd5, 0x20, 0x3c, 0x52, 0x92, 0x16, 0xb1, 0x6e, 0xb7, 0x41, 0xbe, + 0x23, 0x9b, 0x51, 0xf7, 0xc9, 0x38, 0x8a, 0xc7, 0x6e, 0x68, 0x82, 0xd1, + 0x59, 0x50, 0x09, 0x4b, 0x44, 0x3b, 0x28, 0x06, 0x60, 0x75, 0x7a, 0xe5, + 0xa1, 0x36, 0xbb, 0x62, 0x44, 0xe3, 0xd0, 0x68, 0x14, 0xea, 0xad, 0xf9, + 0x18, 0xcc, 0xd5, 0x42, 0x5d, 0x18, 0x53, 0xe6, 0x4a, 0xfe, 0xde, 0x32, + 0xe1, 0xe7, 0xf8, 0x8c, 0x9d, 0x35, 0xf4, 0x4a, 0xcb, 0x23, 0x2f, 0x91, + 0xb5, 0xb0, 0xb2, 0x01, 0x5c, 0x22, 0x8c, 0x42, 0x42, 0xd5, 0xf0, 0x82, + 0x6f, 0x9f, 0x64, 0xe5, 0x99, 0x4d, 0x36, 0x0b, 0xfc, 0x78, 0x38, 0x30, + 0x47, 0x8f, 0x0b, 0x57, 0x86, 0x4f, 0x1b, 0xc9, 0x05, 0x0e, 0x08, 0xc4, + 0xf4, 0xab, 0x9e, 0x90, 0xb4, 0x4f, 0x36, 0x54, 0xe8, 0xa1, 0x3f, 0x90, + 0xd2, 0xf3, 0xb4, 0xb4, 0xdd, 0xf3, 0x43, 0x2f, 0xc4, 0x43, 0xbb, 0x99, + 0x8e, 0xb8, 0x61, 0x59, 0x5e, 0xfa, 0x1b, 0x3c, 0xc1, 0xeb, 0x9d, 0x35, + 0x62, 0x34, 0x82, 0x45, 0xef, 0x41, 0xe9, 0xfc, 0x35, 0xae, 0xb4, 0x0b, + 0xce, 0x52, 0x5b, 0x40, 0x7d, 0xdd, 0x86, 0x83, 0x52, 0x74, 0x77, 0x11, + 0xc2, 0x9b, 0x8c, 0xa3, 0x63, 0xc2, 0x2d, 0xdd, 0x8c, 0x76, 0x13, 0xc5, + 0xc0, 0xde, 0x3e, 0x6b, 0xe1, 0x0f, 0xeb, 0x0f, 0x0a, 0x25, 0x41, 0x2f, + 0x8b, 0x4a, 0x98, 0x30, 0xcb, 0x1a, 0x43, 0xa3, 0xc1, 0xcc, 0x44, 0x9a, + 0x6c, 0xdc, 0x92, 0x40, 0xc4, 0x7a, 0x1f, 0x8a, 0x6f, 0x74, 0xf3, 0xf5, + 0x52, 0x72, 0xf7, 0x81, 0x6e, 0x74, 0x75, 0xe6, 0xea, 0xd9, 0x57, 0x91, + 0xae, 0xf2, 0x3f, 0x35, 0x4b, 0x99, 0xd9, 0x3f, 0x85, 0xe0, 0x92, 0xaa, + 0x35, 0xac, 0x28, 0xbf, 0x43, 0xb8, 0xad, 0xc7, 0xc5, 0xf6, 0x15, 0x2f, + 0x7c, 0xfb, 0x34, 0x48, 0xf3, 0x04, 0x12, 0xf4, 0x2f, 0x92, 0x74, 0xc8, + 0xea, 0xbc, 0x24, 0x6e, 0x3b, 0x0e, 0x9e, 0xf0, 0xaf, 0x02, 0x97, 0x95, + 0xbc, 0x90, 0x7f, 0xc4, 0xf8, 0xe2, 0x04, 0x9a, 0x8f, 0xfc, 0xbc, 0x50, + 0xfe, 0xf7, 0x89, 0x17, 0x2c, 0xdb, 0xd6, 0x5e, 0xbf, 0xd9, 0x8e, 0x89, + 0x8b, 0x06, 0x1d, 0x0b, 0x81, 0x2a, 0x55, 0x5c, 0x5f, 0xb6, 0xa6, 0xa5, + 0xd2, 0xaa, 0x79, 0x9c, 0x39, 0x31, 0x76, 0x03, 0x98, 0x42, 0xd6, 0xb7, + 0x37, 0x1f, 0xc8, 0x51, 0x8a, 0x1c, 0x5d, 0xcd, 0x9c, 0x78, 0xa4, 0x22, + 0x6e, 0x12, 0x10, 0x0a, 0x33, 0xc9, 0xe0, 0xfe, 0xfc, 0xe8, 0x15, 0xe7, + 0xef, 0xd8, 0x6d, 0xc7, 0xc9, 0xc2, 0x8e, 0x18, 0x82, 0x2f, 0xa6, 0x09, + 0x8a, 0xdc, 0x41, 0x6b, 0x89, 0xea, 0xd9, 0xd6, 0x96, 0xfd, 0xba, 0x6e, + 0xae, 0x2d, 0x0c, 0xf9, 0x3c, 0x4c, 0x1a, 0xfa, 0x98, 0x83, 0x51, 0x45, + 0x9d, 0x1e, 0xa5, 0xc1, 0x81, 0x54, 0x37, 0x5d, 0x28, 0xca, 0xa6, 0xfe, + 0x48, 0xf4, 0x77, 0x17, 0x92, 0x1d, 0x0c, 0xb3, 0x39, 0x77, 0x22, 0xd9, + 0xc7, 0xc2, 0xaf, 0x70, 0x0a, 0xd3, 0xa6, 0x57, 0x69, 0xfb, 0xb9, 0xe0, + 0xc4, 0x73, 0x7a, 0x68, 0xee, 0x27, 0x6e, 0x3a, 0x6e, 0xae, 0x32, 0xf6, + 0x09, 0xb3, 0x0b, 0x40, 0x72, 0xc6, 0x26, 0x6e, 0xc5, 0x88, 0x6b, 0xce, + 0x99, 0x88, 0x60, 0x6f, 0x6e, 0xa9, 0xe6, 0xd7, 0x35, 0x5e, 0x3b, 0x36, + 0x0d, 0x14, 0xb8, 0x2f, 0xde, 0x67, 0xc8, 0x2e, 0x52, 0xc1, 0xf1, 0x58, + 0x87, 0x32, 0x2a, 0x52, 0x21, 0x27, 0x1e, 0x04, 0xed, 0xc4, 0x82, 0xd7, + 0xeb, 0x85, 0x12, 0x3e, 0xea, 0xd0, 0x07, 0xa0, 0x80, 0x48, 0xe9, 0xbd, + 0x9b, 0x3a, 0x8e, 0x8b, 0xa0, 0xfc, 0x07, 0xf0, 0x69, 0x4e, 0xc7, 0x1d, + 0xd9, 0x9a, 0x73, 0x18, 0x63, 0xb8, 0xe6, 0x4a, 0xa0, 0x81, 0xf0, 0xdb, + 0xb9, 0x88, 0xf4, 0x2b, 0x1f, 0x0d, 0xda, 0x31, 0xc0, 0xb0, 0x55, 0x79, + 0x56, 0x48, 0x22, 0xbb, 0x49, 0x7f, 0xb1, 0xf1, 0xf6, 0x6f, 0x42, 0xd3, + 0xba, 0x68, 0x3a, 0x8f, 0xe7, 0xac, 0x53, 0x30, 0x96, 0xec, 0x51, 0x7d, + 0xfc, 0xc0, 0x35, 0xe9, 0x59, 0xe7, 0x0e, 0xed, 0x29, 0x46, 0x50, 0x3c, + 0x4b, 0x36, 0xc6, 0x2a, 0xaa, 0x3b, 0xbe, 0xce, 0xd3, 0xda, 0x4d, 0x65, + 0xb0, 0xe8, 0x52, 0x68, 0xf0, 0x23, 0xde, 0x02, 0x77, 0xb3, 0xcc, 0xce, + 0x78, 0xdd, 0x8c, 0xf8, 0xbe, 0x5d, 0x0d, 0xa9, 0xb6, 0x96, 0x85, 0xbf, + 0x92, 0x2a, 0x6b, 0x1b, 0xe8, 0x76, 0x05, 0x13, 0x30, 0xd8, 0x3d, 0x80, + 0xaa, 0xa2, 0xa3, 0xbc, 0x07, 0xba, 0x9c, 0x75, 0x5b, 0x42, 0x03, 0xd8, + 0xde, 0x42, 0x44, 0xf7, 0x29, 0x43, 0x29, 0x0d, 0x48, 0x2b, 0x02, 0xd0, + 0xcc, 0xe9, 0x17, 0x47, 0x23, 0x73, 0x6d, 0xc5, 0x91, 0x6d, 0x4e, 0xc5, + 0xcf, 0xc3, 0x58, 0xaf, 0x6e, 0xa2, 0x9e, 0xe7, 0xe1, 0x88, 0xac, 0x62, + 0xff, 0xbc, 0x69, 0x57, 0xad, 0x0f, 0x08, 0xf8, 0x32, 0xfd, 0x79, 0xcb, + 0x30, 0xbc, 0xd2, 0xe5, 0x20, 0xd9, 0x0f, 0xd1, 0x33, 0xbf, 0xe4, 0x49, + 0x7a, 0x2b, 0x5c, 0xb3, 0x63, 0x13, 0x4d, 0xed, 0x17, 0xe7, 0x5b, 0xf4, + 0x36, 0x9d, 0x3c, 0x4e, 0x51, 0xb2, 0xf7, 0xf2, 0xcd, 0xfb, 0xec, 0x42, + 0x79, 0x46, 0xae, 0x18, 0x50, 0xdf, 0xbf, 0x5b, 0xb1, 0x9a, 0x49, 0x22, + 0xae, 0xe9, 0xf3, 0x86, 0x3f, 0xe0, 0xb4, 0xc6, 0x9c, 0x08, 0xd6, 0xd9, + 0xf4, 0x68, 0xbb, 0x33, 0x0e, 0x59, 0x3d, 0x76, 0xf0, 0xd7, 0x54, 0x04, + 0x19, 0x66, 0xee, 0x61, 0x11, 0x0d, 0x48, 0x10, 0x21, 0x16, 0x7c, 0xac, + 0x49, 0xab, 0xe0, 0x19, 0x85, 0x93, 0x48, 0x65, 0x7c, 0x5e, 0x6c, 0x1a, + 0xf5, 0xb0, 0xc6, 0x80, 0xa1, 0x2a, 0xd5, 0x71, 0x42, 0xec, 0x2f, 0x25, + 0xf7, 0xb8, 0x84, 0xcd, 0xf0, 0x5c, 0xcd, 0xee, 0x44, 0xcb, 0xeb, 0x74, + 0x96, 0x3c, 0xb0, 0x56, 0xcb, 0xaf, 0x7e, 0x9e, 0x4a, 0x12, 0x06, 0xae, + 0x57, 0x43, 0x2d, 0xb2, 0x11, 0x96, 0x05, 0xdb, 0xb3, 0x1a, 0x01, 0xa7, + 0x1d, 0x02, 0x81, 0x1c, 0x36, 0x41, 0x65, 0xf0, 0x67, 0xd6, 0xd0, 0x0f, + 0xec, 0x34, 0x7d, 0xd3, 0x89, 0xac, 0x60, 0x67, 0x95, 0x81, 0x84, 0xe7, + 0xbb, 0x9a, 0x59, 0x36, 0x3b, 0xde, 0xa4, 0x88, 0xda, 0xf2, 0xd2, 0xa2, + 0x0c, 0xba, 0xfb, 0x93, 0xbf, 0xc8, 0xad, 0xe8, 0x57, 0xa0, 0x2b, 0xbb, + 0x4e, 0xa9, 0x38, 0xe7, 0x86, 0x6b, 0x95, 0x34, 0x24, 0x96, 0xc0, 0x09, + 0xd9, 0xfd, 0x5f, 0x1c, 0x93, 0xd9, 0x72, 0xfa, 0xc4, 0x14, 0x72, 0x9c, + 0x19, 0x6f, 0xee, 0x12, 0x17, 0xee, 0x65, 0xb4, 0x8c, 0x83, 0x39, 0x3c, + 0x0f, 0xbf, 0x25, 0xcf, 0xee, 0x05, 0x8c, 0x6a, 0x56, 0x18, 0xf0, 0x20, + 0x72, 0xc1, 0xbf, 0xe4, 0xce, 0x37, 0xbf, 0x2b, 0xba, 0x70, 0x1e, 0xc2, + 0xc8, 0xcd, 0x58, 0xb9, 0x60, 0xc7, 0xfb, 0xd0, 0x00, 0x00, 0x00, 0x00, + 0x6a, 0xb9, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x7c, 0x63, 0x50, 0x90, 0xcb, 0x9c, 0xce, 0x59, 0xb1, 0x47, 0xb0, 0x49, + 0x9b, 0xfc, 0xfb, 0x3d, 0x3d, 0x62, 0xcf, 0x58, 0x4c, 0x2a, 0x79, 0xf0, + 0x72, 0x7f, 0x81, 0x41, 0xac, 0x82, 0x2d, 0xa9, 0xf0, 0x0e, 0x4d, 0xd2, + 0xe0, 0xbd, 0xca, 0x17, 0xb7, 0x59, 0x9f, 0xdb, 0xfe, 0x51, 0x90, 0x88, + 0xb9, 0xeb, 0x4e, 0xac, 0x80, 0x30, 0x64, 0xc4, 0x49, 0xd1, 0xb6, 0x65, + 0x67, 0xef, 0x9d, 0x5c, 0x04, 0xe0, 0x9d, 0xbe, 0x47, 0x75, 0x9b, 0x6e, + 0x30, 0x76, 0xad, 0x37, 0x9a, 0x56, 0xff, 0xcd, 0x40, 0x26, 0x3e, 0xe2, + 0x7d, 0x30, 0x55, 0x09, 0x92, 0x25, 0x36, 0x2f, 0xf8, 0x55, 0xb8, 0x9b, + 0x66, 0x49, 0x41, 0x9d, 0x78, 0x6d, 0x3f, 0x54, 0x41, 0x01, 0x93, 0x9c, + 0x5e, 0x0c, 0x4a, 0x38, 0x79, 0x76, 0xb4, 0x98, 0xae, 0xf9, 0x99, 0x21, + 0x05, 0x6a, 0xfb, 0xbc, 0x44, 0xf7, 0xdc, 0x85, 0x5e, 0x5f, 0x18, 0x49, + 0x22, 0x11, 0x6d, 0xa5, 0x9e, 0x6b, 0x59, 0x60, 0xf8, 0x73, 0x8b, 0xcb, + 0x38, 0xbb, 0xc9, 0xbf, 0x49, 0x0e, 0x57, 0x65, 0x48, 0x41, 0x41, 0xa2, + 0x40, 0x67, 0x91, 0x1d, 0x54, 0xac, 0xa7, 0xef, 0x16, 0x8b, 0xc7, 0xd1, + 0xe6, 0xdb, 0xc5, 0x9c, 0xd4, 0x04, 0x67, 0xd8, 0x75, 0x21, 0x2b, 0x1d, + 0x11, 0xc1, 0x79, 0x45, 0xb4, 0x91, 0x7a, 0x97, 0x00, 0xde, 0xc6, 0xc5, + 0x8a, 0xd1, 0xd7, 0xea, 0xc1, 0x22, 0xe1, 0x58, 0x61, 0xf2, 0x89, 0x3d, + 0xdb, 0x04, 0x3d, 0xe4, 0xe9, 0xe7, 0xbf, 0x4b, 0x99, 0x8a, 0xc6, 0xf2, + 0x09, 0xc4, 0xe2, 0x6d, 0x0b, 0xda, 0x13, 0xfb, 0xff, 0xbf, 0x0b, 0xfc, + 0x78, 0x33, 0xb8, 0x7b, 0x3e, 0xd8, 0xba, 0x27, 0xba, 0xae, 0xdf, 0xce, + 0xea, 0x80, 0x08, 0x38, 0xd8, 0x33, 0x00, 0xa9, 0xb6, 0x88, 0x48, 0xa9, + 0x3b, 0x54, 0xf0, 0x95, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xba, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xb1, 0xd7, 0x8d, 0x6c, + 0xb9, 0x96, 0xdc, 0x64, 0x9b, 0x0c, 0x74, 0x54, 0x59, 0x82, 0xf6, 0x6e, + 0x7c, 0x4e, 0x23, 0x83, 0x04, 0x2e, 0x49, 0xfb, 0x56, 0x4b, 0xcd, 0x0d, + 0x76, 0x29, 0xb1, 0xce, 0x40, 0xa3, 0xd0, 0x02, 0x16, 0x8e, 0x1c, 0x0a, + 0x00, 0x5b, 0x8c, 0x06, 0xf9, 0x07, 0x97, 0x12, 0x0c, 0x33, 0xd5, 0x48, + 0x6d, 0xae, 0x7d, 0x2c, 0x8f, 0x74, 0x32, 0x24, 0xcf, 0x91, 0xd7, 0xbe, + 0xb2, 0x05, 0xcf, 0x2f, 0x93, 0xd5, 0x43, 0x90, 0xce, 0x02, 0x97, 0xf8, + 0x51, 0xb3, 0xba, 0x56, 0x5d, 0x94, 0x41, 0xa4, 0x11, 0xf3, 0x21, 0xc0, + 0xcc, 0x28, 0xf8, 0x5a, 0x00, 0x0a, 0xd4, 0x53, 0xdd, 0xac, 0xfe, 0x25, + 0x03, 0xea, 0x2b, 0x6b, 0x9d, 0x7e, 0x1a, 0xe1, 0x5f, 0x5c, 0xa7, 0x47, + 0xa2, 0x72, 0x4f, 0x92, 0x60, 0x25, 0x7c, 0x1c, 0xa5, 0x34, 0xa6, 0x86, + 0x0e, 0xda, 0x8f, 0x3f, 0xec, 0xe2, 0xe4, 0xad, 0xa9, 0x41, 0xcc, 0x3d, + 0x94, 0x43, 0xfd, 0x28, 0xd8, 0xb0, 0x0f, 0x05, 0x9e, 0x2b, 0x27, 0x3f, + 0xe0, 0x84, 0xbc, 0x9e, 0x7a, 0xa5, 0x83, 0x3d, 0x3b, 0xac, 0x83, 0xd3, + 0x16, 0x92, 0x8c, 0xd2, 0x4a, 0x81, 0xdd, 0xba, 0x0a, 0xb7, 0xc5, 0x9f, + 0x83, 0x0f, 0x78, 0xb8, 0xab, 0x2d, 0xca, 0xf8, 0x6c, 0x06, 0xd7, 0x82, + 0xb8, 0x61, 0x7d, 0x2a, 0x31, 0x3a, 0x39, 0x97, 0x5f, 0xc7, 0x00, 0x6e, + 0x46, 0xf2, 0xc5, 0x12, 0x71, 0x55, 0x5b, 0x10, 0xaf, 0xbb, 0x07, 0x4c, + 0x2f, 0xa3, 0x51, 0x53, 0x22, 0x20, 0xab, 0xed, 0x02, 0x95, 0xc6, 0x5f, + 0xaa, 0xb8, 0xc0, 0xcb, 0xe5, 0xe0, 0x25, 0x97, 0xf7, 0xda, 0x1d, 0xd8, + 0x5a, 0xff, 0x76, 0x0c, 0x3e, 0x33, 0x1b, 0x7a, 0x15, 0xb8, 0x34, 0x75, + 0xcf, 0xe9, 0xf3, 0x53, 0x61, 0x03, 0x2d, 0x52, 0x29, 0x69, 0x3a, 0xc3, + 0xd9, 0x22, 0xc0, 0x2d, 0x80, 0xed, 0x66, 0xc4, 0xf4, 0x89, 0x60, 0x14, + 0xdb, 0xec, 0x7d, 0xcc, 0x99, 0x5c, 0x94, 0x27, 0xab, 0xed, 0xd2, 0x17, + 0xf4, 0x36, 0xfc, 0x7e, 0x99, 0x98, 0xb6, 0x86, 0xb6, 0x7c, 0x54, 0xd6, + 0xec, 0xb5, 0xad, 0x62, 0xcc, 0xb0, 0xf7, 0x8c, 0x52, 0x99, 0xf2, 0x44, + 0x27, 0x3a, 0xb0, 0xff, 0x8f, 0x09, 0xae, 0xe1, 0x61, 0xd8, 0x9f, 0xdd, + 0x2f, 0x6b, 0xea, 0xd0, 0x12, 0x70, 0x8c, 0x9d, 0x8f, 0x4c, 0x36, 0x98, + 0x1e, 0x2e, 0xb5, 0x50, 0x63, 0x33, 0x9c, 0x4b, 0xc3, 0xd4, 0xa0, 0xe6, + 0x96, 0x96, 0x75, 0xfd, 0x8a, 0xc4, 0x0c, 0xa7, 0xea, 0x9d, 0xf1, 0x23, + 0x9e, 0x38, 0xff, 0x1a, 0x67, 0x36, 0x5f, 0x5f, 0x17, 0x88, 0x1a, 0x43, + 0x25, 0xea, 0x76, 0xb5, 0xcd, 0xce, 0x43, 0xf8, 0x71, 0x2b, 0xdb, 0xf0, + 0xcd, 0x76, 0xbd, 0x94, 0x57, 0xdb, 0x77, 0xcd, 0xb2, 0x8f, 0xd1, 0xc0, + 0xeb, 0x00, 0x61, 0x7f, 0x66, 0xb0, 0x43, 0x6e, 0xe0, 0x9f, 0x11, 0x0e, + 0x65, 0xf7, 0x4e, 0x00, 0x74, 0xc3, 0xeb, 0xb1, 0xeb, 0x0c, 0x24, 0x5d, + 0x15, 0x56, 0x16, 0x47, 0x87, 0xcf, 0x34, 0xbe, 0x2a, 0xdd, 0x77, 0x55, + 0xa4, 0x09, 0x15, 0x79, 0x8c, 0xaa, 0xce, 0x32, 0x90, 0x9b, 0x16, 0x40, + 0x94, 0x7f, 0x19, 0x27, 0xbc, 0xbf, 0x45, 0x4b, 0xa5, 0xf0, 0xd0, 0x9e, + 0x5b, 0xb9, 0x46, 0x6e, 0x72, 0x8f, 0x49, 0x3b, 0x7a, 0xc1, 0x92, 0xb0, + 0xd5, 0x25, 0x1b, 0x0b, 0xf3, 0xd0, 0x8a, 0x47, 0x8b, 0xbe, 0xa4, 0xf9, + 0x6a, 0x09, 0x84, 0x9a, 0x5b, 0x5b, 0xea, 0xbb, 0x6f, 0xd8, 0xaf, 0xcd, + 0x67, 0x9b, 0x79, 0x7c, 0x8f, 0xcc, 0xd7, 0x5f, 0x3a, 0xc3, 0xd0, 0xb7, + 0xba, 0x28, 0x83, 0x81, 0x4a, 0x05, 0x51, 0xaf, 0xa0, 0x52, 0x34, 0xe3, + 0x4f, 0xec, 0x82, 0xdc, 0x97, 0xd8, 0x69, 0xb2, 0x0d, 0x68, 0x35, 0x87, + 0x58, 0xc0, 0xcf, 0x58, 0x0d, 0xf6, 0x6b, 0x6d, 0x2a, 0xc0, 0x72, 0xe4, + 0x90, 0x8c, 0x7b, 0x45, 0xba, 0xf1, 0x13, 0x6f, 0x8c, 0xd2, 0xdd, 0xc5, + 0x8e, 0xc8, 0xec, 0xf9, 0xfb, 0xde, 0xe5, 0xaa, 0xcb, 0xc0, 0xff, 0x77, + 0x2d, 0x99, 0xb1, 0x69, 0x7f, 0xe3, 0x38, 0x61, 0x35, 0xb6, 0x45, 0xdd, + 0x73, 0x45, 0x84, 0x89, 0x1b, 0x96, 0x7e, 0x6a, 0x1d, 0xd9, 0xe6, 0x76, + 0xa8, 0x16, 0x0f, 0x42, 0xc9, 0x41, 0xec, 0x5d, 0x25, 0x01, 0xb0, 0x45, + 0xa6, 0xaa, 0x69, 0x87, 0x11, 0xa1, 0xb8, 0x9e, 0x68, 0x48, 0x68, 0xe9, + 0xb5, 0xc2, 0xff, 0x83, 0x8f, 0x71, 0xb9, 0xd7, 0xbb, 0xae, 0x59, 0x8b, + 0x1b, 0x4c, 0x44, 0xd8, 0xe3, 0xce, 0xab, 0x88, 0xfb, 0x64, 0xd9, 0x61, + 0x5a, 0x7d, 0xce, 0x3a, 0x27, 0xb5, 0xa3, 0xfd, 0x5d, 0xa3, 0xb8, 0xa1, + 0x15, 0x63, 0x0b, 0x75, 0x39, 0xc3, 0xa4, 0xfb, 0x60, 0x53, 0xfd, 0x11, + 0x21, 0x35, 0x0f, 0x19, 0x28, 0x14, 0xcd, 0x8a, 0xcf, 0x33, 0xaa, 0x4f, + 0x6a, 0x1e, 0x56, 0x87, 0xd5, 0x6e, 0x43, 0x9b, 0xa3, 0x72, 0x95, 0x8c, + 0x34, 0xa2, 0xac, 0x11, 0x76, 0x95, 0xd7, 0xdd, 0xbf, 0x10, 0xf4, 0x0f, + 0x2a, 0x64, 0xd2, 0x4d, 0x7b, 0xc6, 0x9b, 0x7d, 0xf7, 0xa5, 0xb3, 0x84, + 0x9a, 0x9a, 0x5e, 0xcf, 0x7f, 0x95, 0x6d, 0x44, 0xd1, 0xb2, 0x19, 0xbb, + 0xed, 0x37, 0x42, 0x4b, 0x4b, 0x6d, 0xb7, 0x10, 0x02, 0x5f, 0x00, 0x1f, + 0x24, 0xce, 0xb2, 0x8b, 0x3e, 0x7d, 0xc6, 0x6e, 0x6c, 0x90, 0x75, 0xad, + 0x3f, 0x9d, 0x63, 0x04, 0x76, 0x20, 0x7a, 0x56, 0x48, 0xa1, 0x6a, 0x37, + 0x74, 0xd2, 0xb7, 0x4f, 0xa3, 0x64, 0x62, 0xaa, 0xce, 0x75, 0x8c, 0x15, + 0x75, 0x79, 0xa0, 0xbd, 0xdd, 0x01, 0x46, 0xca, 0xa0, 0x31, 0x1a, 0x16, + 0x1f, 0xef, 0x8b, 0xc6, 0x54, 0x57, 0xfa, 0x6e, 0x43, 0xdf, 0xb0, 0x99, + 0xed, 0xa4, 0xcb, 0xeb, 0x91, 0x35, 0x14, 0x0c, 0xa9, 0x1d, 0xb5, 0xa9, + 0x32, 0x99, 0xe3, 0x89, 0x74, 0xaa, 0xa4, 0x65, 0x1e, 0x82, 0x47, 0xfa, + 0x37, 0x23, 0xe5, 0x86, 0xb6, 0xc0, 0xb6, 0x89, 0x9a, 0xd9, 0xae, 0x29, + 0x39, 0x7b, 0x66, 0xc7, 0x5b, 0x02, 0x08, 0x86, 0xd4, 0xf0, 0x75, 0xc2, + 0x05, 0x86, 0xc3, 0x75, 0xd2, 0x2a, 0x1e, 0xec, 0x6e, 0x75, 0x29, 0x58, + 0x8c, 0x25, 0x3b, 0x95, 0x21, 0xde, 0x42, 0xd5, 0xb7, 0x15, 0x30, 0x09, + 0x49, 0x78, 0x55, 0xd5, 0xf2, 0x30, 0x80, 0x93, 0x8a, 0xce, 0x84, 0x27, + 0xdb, 0x4a, 0x09, 0x30, 0x0c, 0x7f, 0x4d, 0xd1, 0x0f, 0xda, 0x66, 0x58, + 0xe1, 0x01, 0xfd, 0x75, 0x83, 0xf5, 0x39, 0x2e, 0xe2, 0x6b, 0xde, 0xff, + 0x20, 0x8a, 0xf7, 0xcc, 0x81, 0x8e, 0x99, 0xb4, 0xeb, 0x76, 0x74, 0x38, + 0x2b, 0xe0, 0x6d, 0x61, 0x8f, 0x39, 0x59, 0x10, 0x7d, 0xb5, 0xd3, 0x14, + 0x96, 0x04, 0x1d, 0x22, 0x89, 0xef, 0x15, 0x7c, 0x28, 0x5a, 0xd6, 0x8d, + 0xf3, 0xb7, 0x6a, 0x9a, 0xce, 0x21, 0x77, 0xfd, 0x4f, 0x22, 0x26, 0x28, + 0xb8, 0xb5, 0xb3, 0x73, 0xfd, 0x2a, 0x7b, 0x42, 0x26, 0x77, 0x41, 0x93, + 0xed, 0xf9, 0x8f, 0xa9, 0x92, 0xd5, 0x9f, 0x2e, 0x60, 0xec, 0x60, 0x98, + 0xf1, 0xd5, 0x11, 0xe2, 0xe0, 0xd7, 0x45, 0xa7, 0xe4, 0xf2, 0x82, 0x61, + 0x2f, 0x41, 0x1b, 0xd9, 0x8e, 0x78, 0xd5, 0x6b, 0x68, 0x74, 0xf0, 0xc3, + 0x83, 0x01, 0x16, 0x60, 0x6e, 0x34, 0x88, 0x45, 0x8a, 0x86, 0x44, 0x5b, + 0xa5, 0xa8, 0x55, 0xbc, 0xfa, 0x8f, 0xbd, 0x93, 0x95, 0x3f, 0xab, 0x19, + 0x54, 0x8f, 0x06, 0x8e, 0xca, 0x0b, 0x4a, 0x18, 0x3f, 0x7a, 0x9c, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x8a, 0xbe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x81, 0x32, 0x41, 0x46, 0x59, 0x26, 0xf4, 0xef, + 0x93, 0x9f, 0x04, 0xc2, 0x67, 0x13, 0x32, 0x45, 0xc0, 0x79, 0x70, 0x27, + 0x21, 0x2b, 0xaf, 0x35, 0xf3, 0xc4, 0x88, 0x52, 0x28, 0xea, 0xca, 0x8a, + 0x08, 0x01, 0x6f, 0x61, 0xab, 0x10, 0xa3, 0xf0, 0x6b, 0x3b, 0x54, 0x64, + 0xf1, 0x63, 0x83, 0x38, 0x2b, 0x26, 0x18, 0x5a, 0x67, 0xc4, 0x67, 0x38, + 0x3f, 0x2c, 0x9a, 0xc9, 0x48, 0x33, 0x77, 0xb4, 0xb2, 0xc2, 0xc7, 0x08, + 0x21, 0x5e, 0xc4, 0x19, 0x59, 0xe1, 0xfa, 0x32, 0xa4, 0x4c, 0x3e, 0xba, + 0x65, 0x92, 0x98, 0x39, 0x71, 0x2f, 0x99, 0x08, 0xf8, 0xb3, 0x7a, 0x03, + 0x53, 0xd7, 0x68, 0xb2, 0x5e, 0xb0, 0xef, 0xe0, 0x1e, 0x7d, 0xb2, 0x23, + 0x5d, 0x2b, 0xd7, 0x09, 0xa6, 0x78, 0xa4, 0x7c, 0x08, 0xed, 0x8a, 0xf6, + 0x96, 0xa0, 0x10, 0x17, 0x62, 0x8b, 0x8a, 0xa0, 0xac, 0x22, 0x67, 0x02, + 0xa8, 0x66, 0x1a, 0xb5, 0x02, 0xde, 0xa5, 0xfa, 0x69, 0x29, 0x5f, 0x24, + 0x89, 0x46, 0x68, 0xd6, 0x51, 0x2a, 0xfe, 0x88, 0xf0, 0x40, 0xde, 0xd1, + 0x12, 0x2e, 0xed, 0x13, 0x7b, 0x49, 0xf6, 0xe1, 0x7a, 0xcf, 0x61, 0xcb, + 0x70, 0x9d, 0xaa, 0x51, 0x07, 0xc2, 0x54, 0x76, 0x89, 0x29, 0x94, 0x29, + 0x8b, 0x0e, 0xf5, 0xe8, 0x81, 0xc7, 0xdb, 0x59, 0x1e, 0x75, 0xda, 0x6a, + 0x94, 0x18, 0x16, 0xae, 0xbb, 0x43, 0x87, 0x56, 0x66, 0x8b, 0x84, 0xe9, + 0xa9, 0xd0, 0xd2, 0x8f, 0x5b, 0xbf, 0x1d, 0x24, 0x3a, 0xb7, 0x64, 0xff, + 0xe9, 0x22, 0x21, 0x65, 0xaf, 0x2b, 0x45, 0x8d, 0x28, 0xea, 0xbc, 0x07, + 0x10, 0x6e, 0xfb, 0x4d, 0x6f, 0x35, 0xe5, 0xeb, 0x5d, 0x29, 0x72, 0xe1, + 0x94, 0xad, 0xed, 0x25, 0xd7, 0x39, 0x63, 0x32, 0x37, 0x0b, 0xb2, 0xd7, + 0x54, 0x1f, 0xe4, 0x0d, 0xe7, 0xb3, 0xd1, 0xa6, 0x2a, 0xcf, 0x8e, 0x97, + 0xf1, 0xa8, 0xfc, 0xb1, 0x61, 0xdc, 0xb4, 0x8f, 0x29, 0xa2, 0x68, 0x4a, + 0xe6, 0x2f, 0x8a, 0x69, 0x2c, 0xa1, 0x1d, 0xe2, 0x9e, 0x65, 0x71, 0xb7, + 0x83, 0xef, 0x63, 0xf5, 0x36, 0xdc, 0xa0, 0x94, 0x5a, 0x45, 0x8a, 0x85, + 0x5e, 0x28, 0x86, 0x21, 0xd2, 0xbf, 0x7a, 0x2f, 0x76, 0x1c, 0x2a, 0x15, + 0xb2, 0xe8, 0xaf, 0x63, 0x37, 0xbe, 0xd8, 0x0a, 0xef, 0x54, 0xee, 0xe6, + 0xd9, 0xb3, 0xdb, 0x41, 0x55, 0xba, 0xd8, 0x14, 0x7c, 0x10, 0x61, 0x06, + 0x40, 0x45, 0x69, 0x37, 0x60, 0xf7, 0x6a, 0x7a, 0x23, 0x70, 0x30, 0x57, + 0x3e, 0xe5, 0x12, 0x24, 0xbc, 0x5e, 0x82, 0x89, 0xd8, 0x37, 0xc9, 0x33, + 0xb9, 0x38, 0xa5, 0xba, 0xed, 0xdd, 0x93, 0x58, 0x81, 0x15, 0xec, 0x15, + 0x70, 0x2f, 0x30, 0xfa, 0xaf, 0xf7, 0xf5, 0xcb, 0x41, 0x74, 0xea, 0xc0, + 0x91, 0xbe, 0x53, 0x4c, 0xc2, 0x74, 0x1b, 0x5b, 0x8c, 0x74, 0xd8, 0xc3, + 0x4a, 0x12, 0xaa, 0x57, 0xd6, 0x61, 0xb1, 0xb8, 0x81, 0x5d, 0x81, 0x37, + 0x1e, 0x5b, 0x3d, 0x5a, 0xbc, 0xa6, 0xb2, 0x27, 0xe3, 0x01, 0x4c, 0xf0, + 0xad, 0x7b, 0xdf, 0x50, 0xf9, 0xd7, 0xb7, 0xcc, 0xa8, 0x5c, 0x3d, 0x9a, + 0xb7, 0x60, 0x3e, 0x63, 0x3f, 0x6a, 0x08, 0x0b, 0x82, 0xdc, 0x3e, 0xfa, + 0x24, 0x33, 0xd3, 0x01, 0xbf, 0xef, 0xeb, 0x52, 0x3f, 0x91, 0x61, 0xda, + 0xe2, 0x26, 0x10, 0xdf, 0xe4, 0x9b, 0x77, 0x91, 0x22, 0xc5, 0x4e, 0x9c, + 0x0b, 0x32, 0xff, 0x27, 0x85, 0x85, 0x0c, 0x99, 0x50, 0x8f, 0xad, 0x5d, + 0x06, 0x18, 0x52, 0xb4, 0x64, 0x09, 0xc4, 0xa4, 0x84, 0xd4, 0x81, 0x07, + 0x0a, 0x97, 0x55, 0xf8, 0x96, 0x52, 0xb2, 0x9a, 0xf4, 0x06, 0x2c, 0x9a, + 0x3b, 0x8b, 0xaa, 0x67, 0x18, 0x3a, 0xee, 0xbc, 0xca, 0x8f, 0x46, 0xf6, + 0x4a, 0x33, 0x5b, 0x56, 0x09, 0xb2, 0x72, 0x87, 0xdb, 0xbb, 0x57, 0x67, + 0x53, 0x82, 0x77, 0x31, 0x66, 0xbb, 0xf1, 0x33, 0x6d, 0x55, 0x82, 0xaa, + 0x80, 0xd4, 0x4d, 0xb8, 0xab, 0xbd, 0x2a, 0xda, 0x10, 0x3a, 0xc8, 0xf0, + 0x14, 0x1e, 0xcb, 0x8e, 0x76, 0x6c, 0xc8, 0x74, 0x05, 0xb3, 0x51, 0xbd, + 0x63, 0x06, 0x69, 0x05, 0x2a, 0x21, 0xd6, 0x2f, 0xe4, 0x38, 0xae, 0xf8, + 0xd4, 0xe9, 0xa7, 0xe8, 0xc8, 0x5a, 0x65, 0x7d, 0x54, 0x34, 0x33, 0x0d, + 0xf6, 0x07, 0xd6, 0x8c, 0xe5, 0x72, 0x9b, 0xfb, 0x60, 0x49, 0xd2, 0xaf, + 0xb4, 0x17, 0xc4, 0x74, 0x8d, 0xe5, 0x54, 0xda, 0x96, 0x56, 0x7d, 0x97, + 0x62, 0xe8, 0xec, 0x0d, 0x2b, 0x02, 0x2e, 0x59, 0xf8, 0xa1, 0x06, 0x6a, + 0xb6, 0x3e, 0x15, 0xeb, 0x64, 0x1a, 0x48, 0x3d, 0x53, 0x2c, 0x42, 0x3b, + 0x97, 0xa1, 0x3f, 0x47, 0x8b, 0x74, 0x87, 0x8b, 0x96, 0x63, 0x08, 0x4c, + 0x99, 0x38, 0x5a, 0xb6, 0x93, 0xa8, 0xcc, 0xee, 0x62, 0x3a, 0x00, 0x6d, + 0x5c, 0xab, 0x77, 0x3c, 0x46, 0xae, 0x6e, 0xeb, 0xf1, 0xf9, 0x63, 0xf1, + 0xa2, 0x31, 0x21, 0x38, 0xc3, 0x4f, 0xe2, 0x3a, 0x33, 0x7f, 0xe7, 0xc6, + 0x69, 0xd5, 0x1c, 0x7e, 0x5b, 0x4f, 0xb1, 0x50, 0x3b, 0xbe, 0x31, 0xa7, + 0x42, 0xa3, 0x97, 0x7b, 0xe3, 0x90, 0xd0, 0x07, 0xfd, 0x05, 0xb9, 0xf2, + 0x47, 0xc4, 0xc8, 0xdd, 0x1c, 0x3c, 0xa4, 0x22, 0x96, 0x04, 0xca, 0x28, + 0x17, 0xcc, 0x5c, 0x49, 0x7e, 0xc6, 0x93, 0x98, 0xd3, 0x8b, 0xd2, 0xf6, + 0x4a, 0xb6, 0xbe, 0x8d, 0xa2, 0xdd, 0xb6, 0x7c, 0x66, 0x0c, 0x29, 0xcb, + 0x1d, 0x98, 0xf6, 0xe4, 0xe5, 0x30, 0x4c, 0x84, 0xbf, 0x6f, 0x71, 0x4e, + 0xc2, 0x12, 0x9f, 0x35, 0xd6, 0xf8, 0xc6, 0x30, 0xe9, 0x9e, 0x1a, 0x8a, + 0x2f, 0xd1, 0x96, 0xb3, 0x3c, 0x0f, 0xf5, 0x78, 0xa7, 0xe0, 0xbd, 0x4b, + 0xe0, 0xd8, 0x3d, 0x57, 0xa5, 0x44, 0xa0, 0xd9, 0x10, 0x79, 0xd2, 0x10, + 0x50, 0xc7, 0x77, 0x73, 0x09, 0xf8, 0xb4, 0xcf, 0x66, 0xe3, 0x0c, 0xfb, + 0x96, 0xf8, 0x52, 0xb3, 0x7e, 0x44, 0xf0, 0x03, 0x54, 0xd4, 0xa2, 0x57, + 0x38, 0x8a, 0x96, 0xfc, 0x7c, 0x4c, 0x9f, 0x3a, 0xf2, 0xa2, 0x48, 0xbb, + 0x3e, 0xd1, 0x11, 0x2c, 0xab, 0xdf, 0x53, 0x96, 0xac, 0x58, 0x33, 0xb9, + 0xdd, 0xd2, 0x4f, 0x8a, 0x0a, 0x89, 0x0e, 0xd3, 0x6f, 0x58, 0x8c, 0xa1, + 0x0a, 0x0b, 0xa7, 0xd7, 0x1f, 0x0a, 0x70, 0xe3, 0x43, 0x12, 0x56, 0xb8, + 0x6c, 0xf8, 0x75, 0x4e, 0x2b, 0xb0, 0x17, 0x29, 0xe4, 0x95, 0x85, 0xd8, + 0x85, 0x95, 0x63, 0x55, 0xa8, 0x82, 0xf0, 0xe7, 0x7d, 0xf3, 0xf1, 0x78, + 0x66, 0xd1, 0x92, 0x71, 0x99, 0xad, 0x30, 0x94, 0xe9, 0x54, 0x2c, 0xe1, + 0x57, 0xf3, 0x6a, 0xe6, 0x0c, 0x5e, 0xc7, 0x58, 0xba, 0xb7, 0x61, 0xd3, + 0x74, 0x72, 0x96, 0x06, 0x0b, 0x01, 0x3d, 0xc2, 0xa1, 0xb4, 0x38, 0x81, + 0x19, 0x44, 0xbc, 0x84, 0x52, 0x22, 0xc9, 0x67, 0x81, 0x99, 0xfb, 0x0a, + 0xc2, 0xff, 0x50, 0x67, 0xbe, 0x38, 0x5e, 0x13, 0x16, 0x60, 0x83, 0x35, + 0xb9, 0x2f, 0xa9, 0x55, 0xbb, 0x30, 0x6b, 0x19, 0xfc, 0x2a, 0x40, 0x24, + 0x74, 0x20, 0x57, 0x78, 0xb9, 0x55, 0xb7, 0x70, 0x86, 0x65, 0x43, 0x1c, + 0x76, 0x2e, 0x91, 0x83, 0x5e, 0x33, 0xc2, 0xd4, 0xcc, 0xb5, 0x1c, 0x45, + 0xaf, 0xa3, 0x87, 0x95, 0x9b, 0x77, 0x50, 0x44, 0x7e, 0xdd, 0xca, 0x3f, + 0x51, 0x21, 0xae, 0xf2, 0x15, 0xa9, 0x32, 0x94, 0xca, 0xde, 0x3b, 0x97, + 0x13, 0x6b, 0xff, 0xe0, 0x79, 0x39, 0x40, 0xf0, 0x66, 0x7d, 0x5e, 0xef, + 0xec, 0x0a, 0x35, 0xd2, 0x0d, 0x09, 0x19, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x9a, 0xc2, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xdc, 0x07, 0x2e, 0x46, 0xab, 0x4d, 0x6d, 0xf7, 0x24, 0xba, 0x02, 0xe3, + 0xc5, 0xe3, 0xed, 0x64, 0xc6, 0x77, 0x5a, 0x14, 0xae, 0x38, 0x52, 0x8c, + 0x16, 0x2c, 0x52, 0x0e, 0xf6, 0x65, 0x99, 0xcc, 0xf6, 0x9f, 0x77, 0xcc, + 0x2e, 0xaf, 0x14, 0xd1, 0xf0, 0x0f, 0xa7, 0x3e, 0x5b, 0x74, 0xff, 0xb9, + 0xd3, 0x30, 0x02, 0x5e, 0x52, 0xc8, 0x6f, 0x57, 0xef, 0x28, 0xf5, 0xfa, + 0x9e, 0x70, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xea, 0xc2, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xaa, 0x9f, 0x86, 0xb0, + 0x6d, 0xa1, 0x0c, 0xfa, 0xef, 0xb3, 0x6a, 0x50, 0xa6, 0xfe, 0xff, 0xa9, + 0x61, 0x0b, 0x18, 0x72, 0xee, 0xc6, 0xcd, 0x3a, 0x34, 0x5e, 0xa8, 0x81, + 0x31, 0x54, 0x25, 0x05, 0xc1, 0xd9, 0x66, 0x3d, 0x17, 0xbb, 0x03, 0x21, + 0x07, 0x69, 0x3a, 0x37, 0xe8, 0xd4, 0x6a, 0x68, 0xe1, 0xa3, 0x19, 0x5a, + 0x8d, 0x14, 0x11, 0x09, 0xef, 0xae, 0xfe, 0x94, 0x19, 0x8a, 0xe4, 0xb9, + 0x6e, 0xe8, 0xfa, 0x12, 0x2a, 0x5d, 0x00, 0x29, 0x27, 0x6d, 0x5a, 0xa5, + 0x09, 0x34, 0x79, 0x2b, 0xa8, 0xcc, 0x42, 0xb4, 0xde, 0xe0, 0x91, 0xb9, + 0x06, 0x0c, 0x11, 0x17, 0x25, 0x7a, 0x35, 0x57, 0x51, 0x40, 0xf3, 0xc7, + 0xc6, 0x4a, 0x69, 0x98, 0x2b, 0x2b, 0x3e, 0x5d, 0x32, 0xd8, 0x8f, 0xb0, + 0x1d, 0xee, 0x77, 0xe3, 0xaf, 0x4f, 0x71, 0x05, 0x04, 0xd2, 0xff, 0x51, + 0xed, 0xa4, 0x69, 0x50, 0x24, 0x2a, 0xe5, 0xaa, 0xbb, 0xc6, 0x7a, 0x7f, + 0xb2, 0xdf, 0x1d, 0xc2, 0x02, 0x2e, 0x52, 0xd1, 0xd9, 0x5b, 0xe7, 0x6c, + 0x50, 0x31, 0x4e, 0xdf, 0x8e, 0x3f, 0x37, 0xfc, 0xf5, 0x34, 0x0e, 0xdb, + 0x4c, 0x5d, 0x7d, 0xc8, 0xe4, 0x72, 0x40, 0xcb, 0x95, 0xa5, 0x41, 0xeb, + 0x78, 0x5f, 0x64, 0x20, 0x55, 0x19, 0xc7, 0xf9, 0x9c, 0x71, 0x40, 0x8f, + 0xcc, 0x2d, 0x86, 0xc0, 0xf4, 0x36, 0x2b, 0x0e, 0x28, 0xb4, 0xad, 0x1b, + 0xde, 0x60, 0x67, 0x03, 0x0f, 0x7c, 0x18, 0xd9, 0xc3, 0x73, 0x67, 0x0d, + 0x44, 0x3d, 0xbe, 0x7c, 0xcf, 0x96, 0x22, 0x0b, 0x0e, 0x3a, 0x0b, 0xcf, + 0x04, 0x95, 0x92, 0x7d, 0x4b, 0xa2, 0x6a, 0x0b, 0x47, 0x72, 0x73, 0xa8, + 0x9b, 0x96, 0x3d, 0xc6, 0x03, 0x34, 0xb1, 0x69, 0xc2, 0x50, 0x60, 0x89, + 0x8c, 0x55, 0x8f, 0x8e, 0x74, 0xa8, 0x9e, 0x25, 0xe4, 0x0e, 0x73, 0xef, + 0x4f, 0x51, 0xbe, 0xed, 0x5c, 0x14, 0xd3, 0xfa, 0x94, 0x58, 0x8d, 0x5c, + 0xa0, 0xb1, 0xfc, 0x37, 0x6e, 0x9c, 0x9e, 0x61, 0xe5, 0x12, 0x13, 0xb2, + 0x88, 0xc6, 0xcf, 0x60, 0x3f, 0x0d, 0x51, 0x33, 0x22, 0xfa, 0xfb, 0x2d, + 0x2b, 0x8d, 0x43, 0x9b, 0x3d, 0x1e, 0x88, 0x24, 0x50, 0x78, 0xf7, 0x7e, + 0x45, 0xb1, 0x0f, 0xa9, 0xe6, 0x77, 0xf8, 0x78, 0xff, 0x57, 0x6a, 0x05, + 0x06, 0x0c, 0x7e, 0x1e, 0x7f, 0xe9, 0x90, 0xe8, 0x61, 0x68, 0xbc, 0x9e, + 0xc4, 0xe5, 0x06, 0x04, 0x76, 0xcc, 0x01, 0x57, 0x1a, 0x55, 0x9e, 0x45, + 0x26, 0xd6, 0xd8, 0xc2, 0x50, 0x25, 0xfc, 0x72, 0x4e, 0x18, 0xbe, 0xf2, + 0x2f, 0xc0, 0x1b, 0xc8, 0x14, 0xeb, 0x24, 0xda, 0x15, 0x0a, 0x83, 0x38, + 0xc5, 0xdd, 0xc9, 0xd7, 0x12, 0x35, 0x55, 0xdf, 0x2c, 0x23, 0xea, 0x17, + 0xca, 0xbf, 0x18, 0xc9, 0x80, 0x63, 0x4b, 0x77, 0x8b, 0x17, 0x01, 0x05, + 0x1b, 0xa3, 0x0b, 0x0f, 0xdd, 0xc6, 0xe0, 0xdf, 0xc9, 0xa6, 0x8c, 0x50, + 0x95, 0x8d, 0x6c, 0x96, 0x67, 0xff, 0x88, 0x38, 0x3b, 0x76, 0x72, 0x11, + 0x35, 0xa0, 0x1c, 0xc8, 0x96, 0x9c, 0xe5, 0x90, 0x79, 0x0e, 0x62, 0x57, + 0x00, 0xd9, 0x57, 0xf8, 0xa4, 0xc2, 0xc2, 0x0a, 0x17, 0x8e, 0xd7, 0x03, + 0x6d, 0x4d, 0x14, 0xb6, 0x96, 0x8a, 0x76, 0x67, 0x58, 0xce, 0x9c, 0xb3, + 0x10, 0x49, 0x06, 0xeb, 0x56, 0x43, 0x40, 0xcb, 0xd4, 0xd7, 0x59, 0x42, + 0xa4, 0xd7, 0x21, 0x6a, 0x51, 0x3d, 0x1c, 0x54, 0xd7, 0xd6, 0xa2, 0xcf, + 0xf8, 0xf6, 0x72, 0x35, 0x04, 0xa6, 0xe3, 0x53, 0xca, 0xc5, 0x62, 0xee, + 0xa9, 0xc3, 0x6d, 0x1b, 0xc4, 0xc5, 0xd9, 0xa7, 0x37, 0xc2, 0x04, 0x01, + 0xc9, 0x4a, 0x2e, 0x26, 0xdd, 0x12, 0x6e, 0x41, 0x64, 0xb4, 0xe8, 0xe8, + 0xc7, 0xf8, 0xab, 0x8a, 0xab, 0x1d, 0x7f, 0x2d, 0x58, 0xc2, 0xc4, 0xf0, + 0x5d, 0x11, 0x35, 0x52, 0x88, 0xbc, 0x0f, 0x44, 0x6e, 0x91, 0x1e, 0x87, + 0xb4, 0xb1, 0x91, 0x52, 0x32, 0xe4, 0x38, 0x6d, 0x5e, 0x8d, 0x30, 0xf0, + 0xbc, 0xc3, 0x15, 0x80, 0x47, 0x36, 0x35, 0xb0, 0x93, 0xf3, 0xc4, 0x82, + 0xc7, 0x73, 0xc1, 0x67, 0x0c, 0x7a, 0x31, 0x36, 0xbc, 0x73, 0x67, 0x66, + 0xae, 0x48, 0x82, 0x27, 0x6e, 0x14, 0xd0, 0xd5, 0x12, 0x10, 0xce, 0x5e, + 0x37, 0xcd, 0x7e, 0xa5, 0xcb, 0xff, 0x91, 0xf0, 0x62, 0xdb, 0x95, 0x74, + 0x0c, 0x8c, 0x1e, 0x78, 0x11, 0x02, 0xb3, 0x02, 0x0b, 0x31, 0xe7, 0x4e, + 0x8b, 0x58, 0x6a, 0xde, 0x20, 0x93, 0x8b, 0x8e, 0x62, 0x03, 0x24, 0xc9, + 0xca, 0xf8, 0x44, 0x1d, 0x0c, 0x1b, 0xd8, 0x5d, 0xcc, 0xe2, 0x8e, 0x02, + 0xc6, 0x5c, 0x06, 0x45, 0xe6, 0x94, 0x8f, 0xa2, 0x3e, 0xf5, 0xe9, 0xf5, + 0x88, 0x87, 0xb2, 0x84, 0x1e, 0xb6, 0xb6, 0xfc, 0x9f, 0x8e, 0x79, 0xf5, + 0x4b, 0x24, 0x81, 0x3e, 0x5d, 0xf4, 0x10, 0x6e, 0xdd, 0x8c, 0x8c, 0xae, + 0xc6, 0x2c, 0x26, 0xb2, 0xfc, 0xf3, 0x99, 0xe8, 0x8c, 0x65, 0x5d, 0x6c, + 0xa8, 0x1d, 0x6f, 0x1e, 0x32, 0x0a, 0xee, 0x87, 0xf6, 0xe1, 0xdd, 0x5e, + 0x7f, 0x7a, 0x90, 0x8c, 0x3f, 0xe8, 0x47, 0x95, 0x9b, 0xc8, 0x2c, 0x49, + 0xc9, 0xe4, 0x2d, 0xea, 0x58, 0xfc, 0x29, 0x1a, 0xb7, 0xa1, 0xf9, 0xb8, + 0x84, 0x41, 0xa0, 0xf1, 0x77, 0x83, 0x56, 0x73, 0x86, 0xea, 0xf4, 0xf5, + 0x2a, 0xa6, 0x6b, 0x00, 0x64, 0x39, 0x08, 0x8f, 0xf0, 0x22, 0x1a, 0x4c, + 0xf2, 0x5a, 0xd0, 0xaa, 0x39, 0xae, 0x8a, 0xbc, 0x03, 0x99, 0xf7, 0xcc, + 0x80, 0xdf, 0x2b, 0x85, 0xbe, 0x1a, 0x97, 0x28, 0x63, 0x04, 0x72, 0x75, + 0x75, 0xb4, 0x9c, 0xd3, 0x17, 0xcc, 0x1e, 0xa1, 0xd2, 0x47, 0x18, 0x45, + 0xad, 0xb4, 0x0a, 0x32, 0x31, 0x36, 0x64, 0x48, 0x3f, 0x7b, 0x4b, 0xc0, + 0xd6, 0x78, 0x46, 0xaa, 0x90, 0x89, 0xf9, 0x36, 0x3d, 0xb4, 0xb3, 0x50, + 0x51, 0xd9, 0x55, 0x6f, 0xa9, 0xe7, 0x25, 0xaf, 0xa0, 0xca, 0x9d, 0x45, + 0x83, 0xc3, 0x0b, 0x2a, 0x0c, 0xf9, 0x3f, 0xe4, 0x08, 0xf4, 0xbd, 0x23, + 0x45, 0x85, 0xcf, 0x41, 0x93, 0xd3, 0x21, 0x5f, 0x53, 0xa2, 0x5b, 0xa9, + 0xf5, 0xe9, 0x8f, 0x2a, 0x2d, 0x53, 0x3c, 0x36, 0x17, 0xce, 0x37, 0x35, + 0x3e, 0x9e, 0x6b, 0xbc, 0xba, 0xaa, 0xa5, 0x61, 0x79, 0x98, 0x8e, 0xbd, + 0x19, 0xf4, 0x5f, 0xa9, 0xb8, 0x96, 0xa2, 0xce, 0x32, 0x00, 0xab, 0x51, + 0xcb, 0xfa, 0x30, 0x3a, 0x83, 0x92, 0x91, 0xad, 0x08, 0x61, 0x62, 0x51, + 0x7f, 0x19, 0xa9, 0x2a, 0x84, 0xf2, 0xab, 0x7e, 0x5e, 0xa7, 0x5a, 0x54, + 0x7f, 0x68, 0x2a, 0x7b, 0x4f, 0xde, 0x45, 0x1d, 0xef, 0x73, 0x5f, 0xc0, + 0x40, 0x6e, 0xec, 0x6c, 0xe9, 0xa5, 0x6b, 0x46, 0x54, 0x7c, 0x24, 0x8b, + 0xa4, 0xe5, 0xb4, 0x82, 0x31, 0x1f, 0x3e, 0x79, 0x2e, 0x21, 0x8c, 0xf1, + 0xbd, 0xad, 0x7c, 0x28, 0xcc, 0xbd, 0x58, 0x72, 0xe9, 0x6a, 0x04, 0x56, + 0x67, 0x0f, 0x62, 0x98, 0x5a, 0x97, 0x4b, 0xe2, 0x67, 0x70, 0xbb, 0x17, + 0xb1, 0x84, 0x5b, 0xd4, 0x6e, 0xab, 0x90, 0x29, 0x20, 0x93, 0x34, 0xa8, + 0x03, 0x0f, 0xed, 0x1a, 0xf0, 0x1b, 0x92, 0x87, 0x43, 0xa5, 0x6a, 0x1c, + 0xdc, 0xd7, 0x22, 0x68, 0x83, 0x98, 0x74, 0x2a, 0x4c, 0x51, 0xef, 0x71, + 0x19, 0xd5, 0x3d, 0x05, 0x19, 0x61, 0xb2, 0x52, 0xa8, 0x6e, 0xda, 0x72, + 0x51, 0x66, 0x9f, 0xf0, 0x12, 0xf6, 0x18, 0x60, 0xcc, 0xd7, 0x2f, 0x2e, + 0x83, 0x14, 0x09, 0xdb, 0x55, 0x1c, 0xf2, 0xaf, 0xfd, 0xa4, 0x40, 0xf1, + 0x00, 0x00, 0x00, 0x00, 0xfa, 0xc6, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x9c, 0x52, 0xff, 0x48, 0x06, 0x61, 0x76, 0x6d, + 0xd7, 0x44, 0xb1, 0x0c, 0x32, 0x62, 0x15, 0xa1, 0xc3, 0x97, 0x03, 0xdd, + 0xed, 0x20, 0x3c, 0x3a, 0x09, 0x16, 0xe5, 0x7d, 0x8c, 0xf9, 0x7b, 0x22, + 0x5e, 0x3a, 0xdd, 0xf0, 0xc6, 0xf0, 0x3a, 0xd4, 0x94, 0x85, 0x1c, 0x60, + 0x74, 0x91, 0xa3, 0xe2, 0x8a, 0xe5, 0x3e, 0xd4, 0x95, 0x28, 0x8b, 0x1a, + 0x7b, 0xbe, 0x07, 0xc0, 0xe3, 0x6b, 0xb9, 0x85, 0x82, 0x0b, 0x24, 0xba, + 0x1c, 0xfc, 0xc0, 0x0a, 0x21, 0x33, 0xad, 0x00, 0x19, 0xce, 0xb5, 0x8f, + 0x73, 0x05, 0xf1, 0xac, 0x03, 0xbe, 0x1f, 0x22, 0xd5, 0x32, 0x5e, 0x50, + 0xe3, 0xe0, 0x62, 0x26, 0xf4, 0xb0, 0x85, 0xd8, 0xf7, 0xa7, 0xf4, 0xa7, + 0xff, 0x10, 0xb8, 0xbc, 0xe0, 0x3e, 0x4d, 0xcb, 0x37, 0x74, 0xcc, 0x85, + 0xed, 0xa0, 0x34, 0x6c, 0xfa, 0x37, 0x84, 0x6a, 0x94, 0x55, 0x3b, 0x1e, + 0x14, 0xab, 0x26, 0x7b, 0x3e, 0xac, 0xc3, 0x79, 0xcd, 0x1b, 0x00, 0x02, + 0xb3, 0x01, 0xc3, 0x10, 0xdd, 0x56, 0x7d, 0x0e, 0x69, 0x39, 0x3c, 0x17, + 0xa3, 0xae, 0x9c, 0x2d, 0xc7, 0x5a, 0x0b, 0x7c, 0xd0, 0xac, 0xa1, 0x91, + 0x6a, 0x6d, 0xc0, 0x3f, 0x98, 0xf1, 0x21, 0xf5, 0xa5, 0x7c, 0xbc, 0x70, + 0x0d, 0x7b, 0x2f, 0x0d, 0x5a, 0xa5, 0x4a, 0x5a, 0xff, 0x51, 0xbf, 0x7f, + 0xb5, 0x4f, 0x2c, 0xba, 0xa9, 0x46, 0x81, 0x6b, 0xac, 0xc6, 0x62, 0x2d, + 0xd7, 0xb5, 0x04, 0x5f, 0xd4, 0x5f, 0x1f, 0x6b, 0x11, 0x7d, 0xe3, 0x58, + 0x1f, 0xb5, 0xbf, 0x16, 0x43, 0x88, 0x05, 0xf5, 0xa4, 0x7b, 0xb5, 0x0e, + 0xf4, 0x01, 0xb6, 0x90, 0x69, 0x52, 0x0a, 0x5e, 0x9b, 0x87, 0x51, 0x5e, + 0xd5, 0xed, 0x2c, 0xcc, 0x58, 0xad, 0xe6, 0x77, 0xa2, 0xc5, 0x7c, 0x1e, + 0xc5, 0x92, 0xbe, 0xed, 0x3a, 0x9a, 0x97, 0xed, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0xc8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x16, 0xe8, 0x24, 0xe3, 0x82, 0x36, 0x8e, 0x50, 0x45, 0xbe, 0xc6, 0x10, + 0x02, 0xb9, 0x6d, 0xf9, 0xed, 0x8f, 0x64, 0x35, 0x4d, 0x2c, 0x9f, 0x99, + 0xdc, 0xee, 0xfa, 0x63, 0x99, 0xc4, 0xb8, 0x3d, 0x77, 0xea, 0xda, 0xd5, + 0x95, 0x8b, 0x8e, 0x76, 0x02, 0x9c, 0x62, 0xa0, 0xad, 0xfe, 0x80, 0x61, + 0x72, 0x59, 0xd6, 0x9f, 0x16, 0x2e, 0x09, 0x71, 0xb8, 0xd7, 0x65, 0x25, + 0xc2, 0x5b, 0x40, 0x67, 0x8e, 0xd6, 0xf8, 0xdf, 0x67, 0x29, 0x19, 0xa2, + 0xa6, 0x07, 0xf3, 0xc8, 0x91, 0x7d, 0xf2, 0x50, 0x71, 0xba, 0x5c, 0x2d, + 0xa7, 0xae, 0xc4, 0xd5, 0xeb, 0xb9, 0x0d, 0x2d, 0x23, 0xe5, 0x8c, 0x65, + 0xf5, 0xf8, 0x97, 0x69, 0xde, 0x25, 0x6f, 0xea, 0x12, 0x72, 0x3e, 0xb9, + 0xa7, 0x8d, 0xcf, 0xa5, 0x66, 0xee, 0x4e, 0x2e, 0x66, 0x6b, 0xec, 0x77, + 0x7f, 0x53, 0xdc, 0x29, 0x73, 0x5e, 0xe9, 0x2f, 0x79, 0xac, 0x8d, 0x0f, + 0x44, 0x09, 0x5d, 0x25, 0x1d, 0x78, 0xb6, 0xe9, 0xd0, 0xfa, 0x8f, 0x5f, + 0x9c, 0xf0, 0xe0, 0xfc, 0x62, 0x9f, 0x52, 0x6b, 0x5b, 0x8e, 0x3f, 0xdf, + 0xb4, 0xf1, 0xdf, 0x35, 0xd0, 0x8f, 0x5a, 0xc9, 0x1f, 0x08, 0x86, 0xaa, + 0x5a, 0x9e, 0xe8, 0xb0, 0xaa, 0xd4, 0xcd, 0x2a, 0x5b, 0x4f, 0x7f, 0x39, + 0x9f, 0x7f, 0x21, 0xf2, 0xfd, 0x05, 0x96, 0x53, 0x09, 0xfd, 0x36, 0x4c, + 0xcd, 0x98, 0x74, 0xf5, 0xbd, 0xcd, 0x9e, 0x14, 0x15, 0x05, 0xb9, 0x3d, + 0x5f, 0x8a, 0x02, 0x86, 0x10, 0xd7, 0xd4, 0x01, 0x20, 0xd9, 0x8c, 0x65, + 0x7d, 0x9d, 0x39, 0x25, 0xbc, 0xce, 0x1a, 0xb1, 0x76, 0x92, 0xc3, 0x03, + 0xed, 0xa2, 0x41, 0x31, 0x0d, 0xc0, 0x40, 0x94, 0x01, 0xbc, 0x9b, 0xe9, + 0x5e, 0x3e, 0x8c, 0x49, 0xf6, 0x98, 0x0c, 0x39, 0x79, 0xdc, 0xd1, 0x1b, + 0xc5, 0xb2, 0x20, 0xb4, 0x6c, 0xb4, 0x4f, 0xce, 0xf4, 0x6c, 0x0b, 0xef, + 0x85, 0xf2, 0x7d, 0x9a, 0x90, 0x58, 0x1b, 0x51, 0x56, 0x52, 0xac, 0x75, + 0x9f, 0x17, 0xe6, 0x48, 0xaf, 0x18, 0x4c, 0xd8, 0x67, 0xe8, 0xd2, 0x61, + 0xbc, 0xa0, 0x95, 0xc9, 0x78, 0xd8, 0xa2, 0x1d, 0x47, 0x59, 0x30, 0xcf, + 0xf3, 0x79, 0x06, 0xd4, 0x25, 0xf8, 0x9c, 0x5c, 0x28, 0xee, 0xb0, 0xd2, + 0xb6, 0xaf, 0x34, 0x0e, 0xe5, 0xe4, 0x16, 0x2e, 0x05, 0x45, 0x23, 0xc1, + 0x88, 0x90, 0x4a, 0x8f, 0xff, 0xfb, 0xe2, 0xc0, 0xb7, 0xae, 0xb5, 0x50, + 0xc9, 0x26, 0xf0, 0xa2, 0xf5, 0x21, 0x23, 0x79, 0x23, 0xb6, 0x8f, 0x57, + 0x64, 0xd1, 0x27, 0xc2, 0x07, 0x63, 0xa6, 0x54, 0x1f, 0x2f, 0xca, 0x16, + 0xb8, 0x28, 0x51, 0x2a, 0x92, 0xe0, 0x06, 0x36, 0x55, 0x00, 0x6c, 0x99, + 0x31, 0xa7, 0x56, 0xb3, 0x7b, 0x15, 0xcd, 0xc1, 0x32, 0x3a, 0xc0, 0x37, + 0x1f, 0xea, 0x29, 0xb6, 0x75, 0xdf, 0x8a, 0x17, 0x09, 0x45, 0xc2, 0x6e, + 0xe2, 0x4c, 0xa5, 0x93, 0x9b, 0x17, 0x08, 0x27, 0x75, 0x33, 0xdb, 0x1f, + 0xab, 0x37, 0xad, 0x8e, 0xaa, 0xef, 0x0b, 0x82, 0xaa, 0xa7, 0xae, 0x2c, + 0x43, 0x4d, 0x8f, 0xa0, 0x43, 0xd7, 0xa1, 0x34, 0xeb, 0xc0, 0x4e, 0xbd, + 0x64, 0xfc, 0xc8, 0x6a, 0x56, 0xa8, 0xfc, 0x9e, 0x2d, 0x5f, 0x7a, 0xa3, + 0x72, 0x06, 0x79, 0x38, 0x33, 0x05, 0xa7, 0xf0, 0x09, 0x48, 0x55, 0xfe, + 0x3f, 0xab, 0x25, 0x8e, 0x76, 0x1d, 0x12, 0x5a, 0x20, 0x68, 0xfb, 0x51, + 0x51, 0x33, 0x40, 0x37, 0x0c, 0x90, 0x98, 0x6f, 0x66, 0x3f, 0x40, 0xa2, + 0x2e, 0x3c, 0xd1, 0x22, 0x51, 0x54, 0x25, 0x7e, 0x4c, 0x5d, 0x96, 0xb2, + 0x65, 0x0f, 0xa3, 0xdf, 0x8e, 0x97, 0xfe, 0xeb, 0xe7, 0xc6, 0x22, 0x2a, + 0x47, 0x3a, 0x78, 0x1b, 0x39, 0x2e, 0xd6, 0xbc, 0x35, 0xb4, 0xf4, 0xc3, + 0xf2, 0x6a, 0x12, 0xc9, 0xe7, 0x6c, 0x9a, 0xfc, 0xed, 0xbc, 0x11, 0xc7, + 0x71, 0x09, 0x8f, 0x56, 0xc1, 0xd8, 0xb6, 0x92, 0x35, 0x97, 0x8e, 0x71, + 0xd2, 0xbb, 0xb4, 0xed, 0xf0, 0x7e, 0xff, 0x58, 0xd9, 0x95, 0x26, 0xea, + 0xa9, 0x4d, 0x38, 0x8d, 0x4e, 0x8e, 0x53, 0xae, 0x7e, 0xe6, 0xe6, 0x82, + 0x35, 0x96, 0xab, 0x0f, 0x04, 0x0f, 0xf2, 0xac, 0x1b, 0xcd, 0x07, 0x17, + 0x1b, 0x25, 0x2f, 0x92, 0xaf, 0x19, 0xa2, 0x1b, 0xa0, 0x7a, 0xc7, 0x4f, + 0xb8, 0x1b, 0x89, 0x21, 0xb5, 0xe2, 0x24, 0xe9, 0x78, 0xae, 0x7d, 0xd7, + 0xcc, 0x8e, 0x3f, 0xa7, 0xe9, 0xbe, 0xe6, 0x79, 0x0f, 0xdf, 0x86, 0xe9, + 0xb9, 0xcd, 0x82, 0x7b, 0xf5, 0x04, 0x89, 0xa0, 0x73, 0x5d, 0xa2, 0x4e, + 0xd6, 0xa0, 0x60, 0x21, 0xe2, 0xfe, 0xd3, 0xf4, 0x19, 0x8b, 0x6a, 0x03, + 0x12, 0x9c, 0x51, 0x9a, 0x41, 0x4e, 0xf6, 0xb4, 0x6e, 0x0c, 0x43, 0xf5, + 0x00, 0x00, 0x78, 0x12, 0xdd, 0x21, 0xa8, 0xc7, 0x21, 0xa1, 0x4e, 0x44, + 0x10, 0xd0, 0xdb, 0x6f, 0x0b, 0x4c, 0xe7, 0x7a, 0x8c, 0x0c, 0xaa, 0xb6, + 0x9a, 0x7d, 0xa9, 0xff, 0x5a, 0x2e, 0x15, 0x9e, 0x6f, 0xea, 0xe1, 0x42, + 0x0c, 0x9c, 0x5a, 0x3b, 0xd5, 0xe6, 0xde, 0x23, 0x3f, 0x9c, 0x45, 0x20, + 0x67, 0x96, 0x50, 0x16, 0x80, 0x42, 0xe7, 0x67, 0x7d, 0x24, 0xdc, 0x00, + 0xaa, 0x01, 0x8a, 0xa3, 0x61, 0xfe, 0x9a, 0xce, 0xc1, 0xe5, 0x2e, 0x19, + 0x85, 0x04, 0xe6, 0x7b, 0xe8, 0x7a, 0xbc, 0x9d, 0xfe, 0x71, 0x29, 0x1d, + 0x17, 0xae, 0x6b, 0x1a, 0x64, 0xd7, 0xfe, 0x18, 0x29, 0x07, 0x9b, 0x49, + 0x43, 0xba, 0x29, 0x37, 0xa8, 0xb0, 0x26, 0x27, 0x6b, 0x7d, 0xde, 0x49, + 0x12, 0x90, 0x05, 0xe2, 0x2c, 0xd8, 0x08, 0xd0, 0x5d, 0x74, 0xa7, 0x15, + 0xbe, 0x34, 0x34, 0x6d, 0xad, 0xfb, 0xa8, 0x01, 0x4a, 0x6c, 0x98, 0xba, + 0x84, 0x38, 0xbd, 0x05, 0xe8, 0x87, 0x27, 0x91, 0x3f, 0xb8, 0xe9, 0x06, + 0x27, 0xda, 0x56, 0x07, 0xaa, 0xea, 0xf4, 0x80, 0x5c, 0x12, 0x44, 0xbe, + 0x23, 0xb3, 0x63, 0x9f, 0x5f, 0x37, 0xa7, 0x53, 0x4c, 0xfc, 0x4d, 0x87, + 0xeb, 0x91, 0xe8, 0xd7, 0x5a, 0xd6, 0xca, 0x67, 0x2d, 0x2f, 0x5a, 0x0e, + 0xc7, 0x82, 0x78, 0xa4, 0xf3, 0x56, 0x07, 0xa5, 0xab, 0x6d, 0x09, 0xd2, + 0x0d, 0x08, 0x6b, 0x6e, 0x1f, 0xc1, 0xf2, 0x91, 0x1a, 0x39, 0xfe, 0x14, + 0x56, 0x3f, 0xeb, 0x9f, 0x14, 0xc2, 0xb3, 0xb2, 0xc2, 0x8d, 0xc2, 0xee, + 0x7e, 0xf0, 0x7d, 0x92, 0xd2, 0xc3, 0x57, 0x3e, 0x2c, 0x07, 0x1b, 0x6a, + 0x9b, 0x3b, 0x79, 0x59, 0xc9, 0x22, 0x96, 0x6c, 0x3e, 0x37, 0xd3, 0x0e, + 0x5c, 0xf6, 0x8f, 0xa9, 0xaa, 0xc9, 0xa4, 0x4b, 0xaf, 0x5d, 0x1a, 0xb6, + 0xf3, 0x91, 0x32, 0x4f, 0xca, 0x72, 0xa0, 0x42, 0x01, 0x51, 0xaf, 0x19, + 0x89, 0xc4, 0xcc, 0x9b, 0xf3, 0x52, 0xe9, 0xa6, 0xf2, 0x71, 0x6f, 0x5a, + 0x38, 0x02, 0xb8, 0x75, 0x88, 0x5f, 0x8d, 0x12, 0xc5, 0x55, 0x4f, 0xd1, + 0xba, 0xf2, 0x24, 0xdc, 0x63, 0x5f, 0x93, 0xc7, 0xf3, 0xe7, 0x59, 0xac, + 0xc3, 0xed, 0xbc, 0x02, 0xe3, 0xad, 0xb2, 0x8e, 0x2c, 0x2d, 0x47, 0xb4, + 0x34, 0x8d, 0xae, 0x44, 0xc8, 0x5f, 0x14, 0xe8, 0x8e, 0x7b, 0xc3, 0x60, + 0x53, 0x9a, 0x51, 0xea, 0x7f, 0x2f, 0xb6, 0x62, 0x61, 0xf7, 0xc0, 0x18, + 0x0f, 0x20, 0x79, 0x13, 0x5c, 0xe8, 0xca, 0x04, 0x29, 0x5f, 0x70, 0x4d, + 0x88, 0xa2, 0x43, 0x20, 0x57, 0x33, 0x04, 0x74, 0x8e, 0x7c, 0x89, 0xd4, + 0x56, 0x8f, 0x93, 0x86, 0x81, 0x6c, 0x11, 0xfc, 0x32, 0x0e, 0xb0, 0x3e, + 0xe5, 0x13, 0xbf, 0x76, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xcc, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0e, 0xf8, 0x8f, 0xde, + 0xfd, 0xfd, 0xcf, 0xd1, 0x6f, 0x9f, 0xf2, 0xb6, 0xb6, 0x59, 0xb2, 0x73, + 0x1c, 0x3c, 0x0d, 0xb0, 0x4d, 0xb8, 0x96, 0xc6, 0xeb, 0xe5, 0xf8, 0x0d, + 0x3e, 0xd7, 0x0c, 0xbd, 0x9c, 0xaa, 0xd5, 0x1c, 0x19, 0x9a, 0x4c, 0x8e, + 0xfa, 0xac, 0x68, 0x74, 0x16, 0x06, 0xb5, 0x49, 0xe7, 0xd5, 0x6f, 0x4f, + 0xcc, 0xd9, 0x02, 0x74, 0xd6, 0x08, 0x73, 0x7c, 0xa9, 0xfa, 0x3e, 0x50, + 0x87, 0xf7, 0xfb, 0xa6, 0x94, 0xdc, 0xb1, 0x40, 0xec, 0xa7, 0xa9, 0x39, + 0xff, 0x40, 0x4a, 0x97, 0x9b, 0xcc, 0x57, 0x66, 0x68, 0xd6, 0xa8, 0x4d, + 0x13, 0x06, 0x0e, 0x03, 0xc4, 0xdf, 0x7a, 0xe4, 0x2f, 0x0e, 0xd7, 0x54, + 0xe0, 0xbd, 0x93, 0xeb, 0x82, 0xd8, 0x05, 0x2d, 0xa2, 0xf0, 0x4e, 0xd0, + 0xf9, 0x3e, 0x3e, 0x6b, 0x3d, 0x08, 0x39, 0x4e, 0x35, 0x13, 0x7b, 0x3b, + 0x39, 0x2c, 0x47, 0x2c, 0x61, 0x9f, 0xfd, 0x59, 0x88, 0x5f, 0x65, 0x08, + 0xa9, 0x66, 0xec, 0xb5, 0x21, 0xf3, 0xe9, 0xba, 0x11, 0x63, 0x24, 0x6c, + 0xf4, 0x50, 0x3a, 0xe5, 0x0c, 0x06, 0x39, 0x69, 0x2f, 0xca, 0x0f, 0x48, + 0xbe, 0x95, 0x7d, 0x13, 0x3d, 0xa5, 0x75, 0x69, 0x85, 0xc8, 0xb3, 0x72, + 0x72, 0x3c, 0x4f, 0x96, 0xe7, 0xb7, 0xbd, 0xe7, 0x76, 0xba, 0xac, 0xc0, + 0x07, 0x4d, 0xc1, 0xed, 0xb9, 0xf0, 0x91, 0x2e, 0x36, 0xb7, 0x5b, 0x1c, + 0xb7, 0xd6, 0xb3, 0x45, 0x7d, 0x0a, 0xf5, 0x43, 0xdd, 0x7a, 0x8b, 0x4e, + 0x18, 0xf2, 0xf3, 0x19, 0xcd, 0x4a, 0xda, 0x3c, 0x1b, 0x05, 0x27, 0x67, + 0x43, 0xa9, 0x8e, 0xe7, 0x4a, 0x95, 0xa9, 0xad, 0x6c, 0x8c, 0xb2, 0x2e, + 0x12, 0xcb, 0xf3, 0xeb, 0x65, 0x26, 0xf4, 0x3e, 0x86, 0xee, 0x7e, 0xd9, + 0xba, 0xce, 0x8d, 0x15, 0x3e, 0xa8, 0x40, 0x59, 0x1d, 0x27, 0x78, 0x75, + 0xf0, 0xf9, 0x33, 0xb5, 0x32, 0xa9, 0x66, 0xe6, 0x2e, 0x2e, 0x3d, 0xf5, + 0x4a, 0xf0, 0x97, 0x2d, 0xe7, 0x43, 0x85, 0x43, 0x61, 0x25, 0x15, 0x13, + 0x9e, 0x8e, 0xf6, 0x78, 0xe8, 0x67, 0xba, 0xc2, 0x6d, 0xda, 0x46, 0x25, + 0x76, 0xd9, 0x9b, 0x69, 0x95, 0x4b, 0x50, 0x8c, 0xb7, 0x36, 0x49, 0xbc, + 0xd7, 0x39, 0x69, 0xb9, 0xc1, 0x5f, 0x5f, 0xcc, 0x83, 0x4c, 0x16, 0xb8, + 0x0c, 0x85, 0xf1, 0xa4, 0x57, 0x6c, 0x22, 0x1f, 0x60, 0x0c, 0xff, 0xb6, + 0xc9, 0xf7, 0x21, 0x2d, 0x35, 0x78, 0x31, 0x79, 0xd0, 0x6d, 0x61, 0xec, + 0x61, 0x04, 0x75, 0x5c, 0x06, 0xc3, 0x53, 0x1b, 0xb5, 0xdc, 0x23, 0xb9, + 0xd9, 0x07, 0xd1, 0xd0, 0xb3, 0xa5, 0xab, 0xd9, 0xbe, 0xb7, 0xdc, 0xae, + 0x3f, 0x3e, 0xd7, 0x2a, 0x79, 0x3f, 0x9c, 0x27, 0x81, 0x8d, 0x61, 0xe8, + 0x46, 0x8f, 0x05, 0xf4, 0x9c, 0x30, 0x35, 0x9a, 0x2f, 0x62, 0x84, 0x7c, + 0xa5, 0x95, 0x68, 0x34, 0xe6, 0xf0, 0xb9, 0x42, 0xd4, 0x37, 0xc6, 0xd2, + 0x35, 0x1f, 0x7b, 0xe0, 0xa6, 0x92, 0xcf, 0xf7, 0x0f, 0x08, 0x10, 0x79, + 0xbd, 0xa8, 0x7c, 0x4e, 0xef, 0xf1, 0x01, 0x8d, 0x1b, 0x0c, 0x98, 0x46, + 0x28, 0xdc, 0xd5, 0xa8, 0xcf, 0x67, 0x7d, 0x87, 0x2a, 0x8f, 0xdd, 0x52, + 0x43, 0x5a, 0x55, 0x80, 0x88, 0xa6, 0xcd, 0x9c, 0x5d, 0x36, 0xae, 0xef, + 0x61, 0x43, 0xec, 0xf0, 0x7f, 0x92, 0x21, 0x1f, 0xa2, 0xa3, 0x76, 0x0e, + 0x5d, 0xf3, 0xa7, 0xe7, 0x7d, 0xb0, 0x2c, 0x94, 0x36, 0x95, 0x34, 0x4e, + 0x04, 0xfb, 0x51, 0xf9, 0xe6, 0x7e, 0x56, 0x7a, 0x59, 0xce, 0x0a, 0x45, + 0x7e, 0xeb, 0xc4, 0xbc, 0xfd, 0x20, 0xaa, 0x34, 0x6b, 0xee, 0x3b, 0x09, + 0xe8, 0x00, 0x4b, 0xfc, 0x68, 0x24, 0x43, 0xdb, 0x09, 0x58, 0xd0, 0xb6, + 0xbf, 0xaf, 0x1d, 0x7f, 0x8a, 0x4c, 0x9e, 0x51, 0x97, 0x97, 0xe1, 0x0c, + 0x0d, 0xaf, 0xd1, 0x1e, 0x62, 0xad, 0x70, 0xa5, 0x8a, 0x24, 0x2f, 0x4a, + 0xa6, 0x55, 0xb1, 0x44, 0x09, 0x88, 0xab, 0xa5, 0x45, 0x28, 0xa0, 0x34, + 0x9e, 0x14, 0x2c, 0xf9, 0x0f, 0xb8, 0x33, 0x8f, 0xcc, 0xba, 0x50, 0x34, + 0x4c, 0x96, 0x89, 0x09, 0xb9, 0xa8, 0xfb, 0xac, 0x59, 0x73, 0xea, 0x61, + 0xbc, 0x0d, 0x24, 0x3a, 0x20, 0xc2, 0x76, 0xfc, 0x2e, 0xce, 0xfb, 0x75, + 0x00, 0xca, 0x58, 0xbd, 0xab, 0x61, 0x9b, 0x13, 0x2b, 0xa3, 0xf6, 0x15, + 0x55, 0x83, 0x23, 0xc4, 0xf3, 0x4c, 0x89, 0xc5, 0x4a, 0x18, 0x5c, 0x8d, + 0x41, 0xcc, 0x06, 0x7b, 0xe3, 0x2a, 0x1f, 0x6a, 0x57, 0xbc, 0x54, 0x61, + 0x0c, 0xf2, 0xec, 0xbf, 0xb0, 0xf0, 0x21, 0xde, 0xfc, 0xe4, 0xef, 0xce, + 0x47, 0xc8, 0xdc, 0x11, 0xc7, 0x8a, 0x12, 0x97, 0x68, 0x1d, 0x9e, 0x9a, + 0xbf, 0xad, 0x62, 0x7e, 0x4b, 0x88, 0xd7, 0x20, 0x22, 0xce, 0x5e, 0xe3, + 0x87, 0x12, 0xa3, 0x05, 0xef, 0x1f, 0x05, 0xb1, 0xbd, 0x1b, 0x80, 0x43, + 0x84, 0x33, 0x8b, 0x87, 0xa5, 0xc2, 0xe1, 0x49, 0xa8, 0x75, 0x49, 0x9b, + 0x1b, 0x64, 0x8a, 0xd0, 0x86, 0x10, 0xa8, 0x72, 0xeb, 0x2e, 0xe7, 0x3f, + 0xaa, 0x6b, 0x4a, 0x22, 0xae, 0x17, 0x8f, 0x10, 0x22, 0x03, 0x66, 0x67, + 0x35, 0x40, 0x29, 0x1e, 0xf2, 0x05, 0x36, 0xd5, 0xed, 0xe2, 0x2a, 0xcc, + 0x77, 0xe2, 0x16, 0xef, 0xa7, 0x9b, 0xe1, 0x1b, 0xba, 0xf3, 0xf5, 0x74, + 0x6c, 0x2a, 0x98, 0x8a, 0x14, 0xaf, 0x2c, 0xab, 0xfb, 0x51, 0x53, 0x75, + 0x17, 0xcb, 0x5c, 0x86, 0xb5, 0x60, 0x70, 0x29, 0x65, 0x69, 0x49, 0x42, + 0x4f, 0x42, 0x6b, 0xc7, 0xdb, 0x98, 0x7d, 0x1e, 0xf8, 0x45, 0xb2, 0x33, + 0xd6, 0x34, 0x26, 0xa6, 0x7f, 0x76, 0x31, 0x13, 0x13, 0x9d, 0xd2, 0xb0, + 0x30, 0x0b, 0x0b, 0x3e, 0x1a, 0x84, 0xb0, 0xbd, 0x81, 0x34, 0x25, 0x73, + 0x99, 0x87, 0x1a, 0xc8, 0x44, 0x34, 0x9d, 0x1a, 0x3d, 0x76, 0x44, 0x1d, + 0xe2, 0x22, 0xad, 0x3d, 0xb2, 0xa3, 0x1c, 0xd5, 0x27, 0x8c, 0xc6, 0x84, + 0xdf, 0x33, 0xbe, 0xb2, 0xa7, 0xb9, 0xc5, 0x6e, 0x48, 0xdc, 0xe9, 0xf8, + 0xef, 0xfc, 0xaa, 0x1f, 0x5e, 0x41, 0x48, 0x1e, 0xe0, 0xb9, 0xd6, 0x6e, + 0x7a, 0x9c, 0xa3, 0x98, 0x4b, 0xfa, 0x90, 0xa4, 0x58, 0x33, 0x85, 0x3b, + 0x11, 0x44, 0x83, 0x4b, 0x1e, 0x0e, 0x5d, 0x11, 0x36, 0x15, 0xe1, 0xbf, + 0x15, 0x04, 0x8e, 0x88, 0xc6, 0x18, 0x53, 0xc3, 0x8d, 0x28, 0x86, 0x25, + 0xef, 0x55, 0x7b, 0xf6, 0x85, 0xf8, 0xed, 0x3b, 0xcf, 0x5d, 0xa6, 0xc7, + 0x66, 0xb7, 0xbe, 0x14, 0xf0, 0x62, 0x89, 0x1f, 0x32, 0x1e, 0x86, 0x2a, + 0x93, 0xd5, 0xca, 0x37, 0x03, 0x0b, 0xf8, 0x0f, 0xca, 0x50, 0x6c, 0x16, + 0x2b, 0xf0, 0x77, 0xca, 0xbb, 0x8e, 0x95, 0x11, 0xef, 0x5b, 0xbe, 0x2f, + 0x62, 0x50, 0xb8, 0x3d, 0xff, 0xfa, 0x30, 0x21, 0xb2, 0x86, 0x3f, 0x50, + 0x57, 0x98, 0x79, 0x15, 0xce, 0x3e, 0xbf, 0x49, 0x58, 0xb0, 0xb5, 0xd7, + 0xbe, 0x01, 0x55, 0xee, 0x60, 0x14, 0x9d, 0x5b, 0x57, 0x48, 0x05, 0x72, + 0x6a, 0x23, 0x29, 0xeb, 0xf3, 0x36, 0x2a, 0xc1, 0xda, 0x5e, 0x4a, 0x63, + 0xc4, 0x6b, 0x04, 0xe8, 0xe8, 0xc1, 0xb5, 0xc4, 0x2d, 0x60, 0x1f, 0xa0, + 0x2b, 0x33, 0xa5, 0xb7, 0x82, 0x59, 0x21, 0xba, 0x13, 0xda, 0x79, 0xda, + 0x5a, 0xb1, 0x82, 0x5b, 0x52, 0x7f, 0x0c, 0x70, 0x75, 0x65, 0xe0, 0x44, + 0xb3, 0xca, 0xd0, 0x09, 0x38, 0x24, 0x83, 0x8e, 0x0c, 0x4c, 0xef, 0x96, + 0xe4, 0x04, 0x30, 0x46, 0x23, 0x6a, 0x28, 0x13, 0x1d, 0x37, 0x14, 0x75, + 0x00, 0x00, 0x00, 0x00, 0x2a, 0xd0, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x21, 0xa2, 0xf0, 0x7d, 0x29, 0x8f, 0x62, 0x2e, + 0xf4, 0x0e, 0x14, 0x9b, 0x60, 0x38, 0xc0, 0x95, 0xfb, 0x3c, 0x90, 0x5a, + 0xa0, 0x1f, 0x30, 0x09, 0xfc, 0x6d, 0xa9, 0xd1, 0x7b, 0x0b, 0x7c, 0x78, + 0xf9, 0xf6, 0xa8, 0x5e, 0xa6, 0x7a, 0xf6, 0x1c, 0xab, 0x1b, 0x0e, 0xa9, + 0x08, 0xfd, 0xd9, 0x97, 0x08, 0x24, 0x2b, 0xda, 0x08, 0x8b, 0x0c, 0x07, + 0x70, 0x15, 0xa8, 0x0c, 0x86, 0xfc, 0xd1, 0x84, 0x00, 0x00, 0x00, 0x00, + 0x7a, 0xd0, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x35, 0x7a, 0xab, 0xaa, 0xbe, 0xd7, 0xad, 0x22, 0x99, 0x46, 0xbb, 0x78, + 0xfd, 0x47, 0x8f, 0x2a, 0x4a, 0xa6, 0x2f, 0x8d, 0x15, 0x07, 0xed, 0x26, + 0x1d, 0xb3, 0x12, 0xd3, 0x88, 0x0f, 0xf1, 0x75, 0x2a, 0x07, 0x62, 0xac, + 0xbf, 0x52, 0x4a, 0xc3, 0x12, 0xe5, 0x3c, 0xea, 0xa6, 0x1e, 0x57, 0x90, + 0x56, 0x60, 0x7d, 0xcf, 0x4b, 0x65, 0xaf, 0xee, 0x17, 0x56, 0xbe, 0xd2, + 0x38, 0x3f, 0xd6, 0xbc, 0xef, 0xa7, 0x32, 0xb7, 0x10, 0xe9, 0xbd, 0x97, + 0x45, 0x92, 0x3c, 0xd3, 0x35, 0x2e, 0x59, 0x37, 0x65, 0x5c, 0x7f, 0xd0, + 0x99, 0x9c, 0x01, 0xe9, 0x1f, 0x65, 0xe9, 0xec, 0x0f, 0x2d, 0x46, 0xbc, + 0xd4, 0x8f, 0x51, 0x1c, 0xa0, 0xa4, 0x9b, 0x4f, 0x95, 0x54, 0xb0, 0x50, + 0x74, 0xfa, 0x0f, 0xe6, 0x55, 0x81, 0xce, 0x0f, 0xd1, 0x25, 0x56, 0xc8, + 0x2f, 0x3a, 0x65, 0xd4, 0x86, 0x4a, 0x8e, 0xff, 0x5a, 0xcc, 0x67, 0x96, + 0xcc, 0x65, 0x0d, 0x20, 0xee, 0xba, 0x6b, 0xcb, 0xde, 0x10, 0x2f, 0xbf, + 0x67, 0x6d, 0xbe, 0xef, 0x72, 0xfc, 0x25, 0x62, 0xbf, 0xbb, 0xc5, 0xe0, + 0x7b, 0x4c, 0x32, 0xc5, 0xdb, 0x9f, 0xb5, 0xe2, 0x75, 0x8a, 0xba, 0xbb, + 0x69, 0x28, 0xb6, 0x41, 0x25, 0x83, 0x67, 0x35, 0x1b, 0xd7, 0xb3, 0xd7, + 0x58, 0x54, 0x8a, 0x0b, 0x7c, 0xf3, 0x05, 0xcf, 0x2c, 0x78, 0x70, 0xc6, + 0xed, 0x7e, 0x56, 0xb6, 0x4e, 0x48, 0xaa, 0x57, 0xc4, 0xb0, 0xb2, 0xa0, + 0xca, 0x50, 0xe1, 0xc7, 0x41, 0xea, 0xac, 0x5f, 0x18, 0x13, 0xe5, 0x85, + 0x78, 0x3f, 0x05, 0xf3, 0xfd, 0x74, 0x7a, 0x42, 0x61, 0x91, 0x19, 0xc6, + 0x19, 0xe9, 0xd2, 0x78, 0x2c, 0xb1, 0xa3, 0x7f, 0x62, 0xea, 0x2a, 0x35, + 0x1c, 0x55, 0xa3, 0xf7, 0xdc, 0xec, 0x48, 0x23, 0x99, 0x8d, 0xe1, 0x4d, + 0x45, 0xad, 0x92, 0xc6, 0xf4, 0xa2, 0xe5, 0xe6, 0x58, 0xe4, 0xd5, 0x37, + 0xd0, 0x47, 0x0b, 0x64, 0x68, 0x48, 0x7e, 0xeb, 0xbe, 0x5e, 0x74, 0xd1, + 0xc4, 0xa5, 0x60, 0xd0, 0x30, 0x62, 0xbc, 0x81, 0xc4, 0x01, 0x68, 0x18, + 0xf3, 0xac, 0x9d, 0xb1, 0x4d, 0xdd, 0x8b, 0xd2, 0x54, 0x5d, 0xd1, 0x1c, + 0xee, 0x75, 0x9e, 0x99, 0x42, 0x69, 0x38, 0xcc, 0x66, 0x24, 0xd9, 0x8f, + 0x70, 0x98, 0xc3, 0x5e, 0x08, 0xf0, 0xd8, 0x2d, 0xe6, 0x52, 0x48, 0xdf, + 0xd0, 0x03, 0x04, 0x92, 0xab, 0xa1, 0xa1, 0x2f, 0x7d, 0x84, 0xb2, 0x82, + 0x51, 0x56, 0x74, 0x4a, 0x94, 0xff, 0xd2, 0xe4, 0x4e, 0x1a, 0xbd, 0x18, + 0xab, 0x33, 0x68, 0x0e, 0x4f, 0x99, 0x1d, 0x7e, 0x02, 0x3f, 0x1f, 0x50, + 0x05, 0xf8, 0x59, 0x47, 0x97, 0x98, 0x60, 0xb1, 0x30, 0xb1, 0x14, 0xac, + 0x2c, 0x0a, 0xa8, 0x97, 0x83, 0xf5, 0x5a, 0x5c, 0x87, 0xe5, 0x36, 0x26, + 0xec, 0xb4, 0x94, 0x46, 0x9a, 0xad, 0x2b, 0x9a, 0xb7, 0xac, 0xc4, 0x1a, + 0x55, 0x53, 0xc0, 0x16, 0x91, 0x1c, 0xd6, 0xaa, 0x6b, 0xdd, 0x85, 0x6a, + 0x54, 0xec, 0x7c, 0xa1, 0xd5, 0x18, 0x00, 0x74, 0xd2, 0xf1, 0x7e, 0xad, + 0x7c, 0xa8, 0x85, 0x9b, 0xc0, 0x9f, 0x4f, 0x3b, 0xd9, 0x08, 0xc8, 0x9d, + 0x31, 0x22, 0x7a, 0x53, 0xa8, 0xbd, 0x00, 0xdf, 0xe8, 0x39, 0x52, 0xe9, + 0x14, 0x74, 0x7b, 0x53, 0xf9, 0xbd, 0x29, 0x8e, 0x5d, 0xf2, 0x35, 0x3b, + 0xe3, 0x48, 0xbf, 0xa0, 0xc4, 0x3d, 0x40, 0xb4, 0xf2, 0x7c, 0xd0, 0xe3, + 0x17, 0x11, 0x5b, 0xd6, 0x55, 0xd2, 0x54, 0xcf, 0x20, 0x8d, 0x74, 0x4a, + 0x6b, 0xe9, 0x5d, 0xfe, 0x72, 0x14, 0x6a, 0x11, 0x8b, 0x14, 0x19, 0xba, + 0x63, 0xe4, 0x6b, 0x39, 0xb4, 0x90, 0x67, 0x79, 0x56, 0x31, 0xd3, 0xb5, + 0xeb, 0x9e, 0x95, 0x4b, 0x1e, 0x04, 0x20, 0xd8, 0xbe, 0xe8, 0x1c, 0xd7, + 0x95, 0xcb, 0x57, 0x60, 0xe6, 0x11, 0x35, 0x42, 0x90, 0xfd, 0xb2, 0xe4, + 0x9b, 0x24, 0x70, 0xc0, 0xc3, 0xa9, 0x8a, 0xc9, 0x46, 0xd0, 0xea, 0xc9, + 0x93, 0x7d, 0x9f, 0x64, 0x12, 0x54, 0x09, 0xb7, 0xc2, 0x4d, 0x6e, 0xcc, + 0x60, 0x07, 0x36, 0x31, 0x64, 0x3d, 0x1e, 0xd3, 0x86, 0x47, 0x47, 0x42, + 0x76, 0xb6, 0xf0, 0xe5, 0xb4, 0xe7, 0xbe, 0x47, 0x91, 0x78, 0xbe, 0x06, + 0xf1, 0x6e, 0x58, 0xce, 0x32, 0x13, 0x26, 0x34, 0x92, 0xae, 0xb2, 0x29, + 0xd0, 0x30, 0x55, 0xfd, 0x89, 0x6a, 0xbf, 0x3e, 0xdf, 0x11, 0x39, 0xe4, + 0xfd, 0x56, 0xd7, 0x2f, 0x89, 0x96, 0x08, 0x54, 0xaa, 0xab, 0x8b, 0xfa, + 0x65, 0xe5, 0x64, 0xff, 0x24, 0x25, 0x8f, 0x7d, 0xf6, 0xb1, 0x7f, 0x2f, + 0xa6, 0xf6, 0x46, 0xab, 0x61, 0xfd, 0x47, 0xad, 0x6d, 0x38, 0x6d, 0xc1, + 0xe9, 0x4a, 0xf1, 0x85, 0x05, 0x0e, 0x69, 0x48, 0x7c, 0xa6, 0x76, 0x61, + 0xe3, 0x94, 0xf2, 0xd6, 0x7a, 0x9c, 0x79, 0xc0, 0x2a, 0x51, 0x23, 0xc6, + 0xaf, 0x29, 0x04, 0x0f, 0x47, 0xc2, 0x93, 0xd7, 0x64, 0xe5, 0x37, 0x2e, + 0x53, 0x3b, 0xb7, 0x7c, 0x9c, 0xb4, 0x63, 0x13, 0xc7, 0x56, 0x90, 0xe9, + 0x53, 0xd5, 0x86, 0x2b, 0x96, 0x41, 0x42, 0x56, 0xc5, 0x16, 0xd7, 0x9e, + 0x30, 0xce, 0xa1, 0x0d, 0x93, 0x5d, 0x11, 0x07, 0xb2, 0x95, 0xfd, 0xf6, + 0x0b, 0x28, 0x95, 0x1a, 0x8f, 0xfa, 0xe1, 0x57, 0x7e, 0x06, 0xff, 0x18, + 0xaf, 0xe3, 0x4f, 0x3c, 0x34, 0x5b, 0xd4, 0x46, 0x1a, 0xd1, 0xd1, 0x7e, + 0x55, 0xba, 0x5d, 0x2a, 0x1f, 0x42, 0x49, 0x95, 0x75, 0x5f, 0x80, 0x60, + 0x02, 0x01, 0xdb, 0x36, 0xad, 0x68, 0x69, 0x1e, 0x0b, 0x90, 0x3f, 0xa6, + 0xb6, 0x2f, 0x66, 0xa6, 0x7d, 0x81, 0x8c, 0xa0, 0xee, 0x05, 0x95, 0xbc, + 0xb3, 0x7c, 0x18, 0xd4, 0x1b, 0x40, 0x96, 0xf5, 0x05, 0x9d, 0x27, 0x3b, + 0x78, 0xfc, 0x19, 0x18, 0xc0, 0x61, 0xa0, 0xd6, 0xf9, 0xc0, 0x3f, 0xe5, + 0x48, 0x35, 0x0f, 0x8b, 0x0d, 0xfb, 0x31, 0xb7, 0x32, 0x40, 0x1d, 0x69, + 0x12, 0x5a, 0x23, 0xf0, 0xce, 0xe9, 0x5e, 0xa6, 0x68, 0x6b, 0xe1, 0xe2, + 0x68, 0x07, 0x02, 0x0d, 0x7a, 0xc2, 0x0a, 0x40, 0x10, 0x5e, 0x94, 0xba, + 0x77, 0x1d, 0xf7, 0xac, 0xec, 0x79, 0xa9, 0xa1, 0x8a, 0xb8, 0x49, 0x32, + 0x08, 0xe0, 0x18, 0xa8, 0x3d, 0x69, 0x41, 0x5d, 0x30, 0x3b, 0xb6, 0x91, + 0x46, 0x8d, 0x81, 0x10, 0xb0, 0xc2, 0xed, 0xa0, 0x4e, 0x59, 0x48, 0xd8, + 0x64, 0x7d, 0x2d, 0x46, 0xf2, 0x8a, 0x2e, 0x5d, 0x0c, 0x4d, 0x9f, 0xfe, + 0x7b, 0x5e, 0xbf, 0x1a, 0x78, 0xdf, 0xfc, 0x0f, 0x04, 0x37, 0x72, 0x1a, + 0x09, 0xb8, 0x6e, 0x1b, 0xf1, 0x18, 0x7d, 0x83, 0x44, 0xaa, 0x9b, 0x71, + 0xe1, 0x03, 0x04, 0x83, 0xe5, 0xaa, 0xc0, 0xd4, 0xa7, 0x80, 0x10, 0x35, + 0x09, 0xae, 0xf7, 0xe1, 0x5e, 0x7c, 0x31, 0x20, 0x43, 0x82, 0xda, 0x07, + 0x39, 0xfe, 0x8f, 0x9d, 0x70, 0x3c, 0x57, 0x43, 0x01, 0x51, 0x37, 0x2e, + 0x97, 0xef, 0xcf, 0x05, 0x44, 0x75, 0x69, 0xf7, 0xdb, 0xda, 0x80, 0x78, + 0x0c, 0xcc, 0xc1, 0x49, 0xac, 0x3b, 0x7e, 0x27, 0x6a, 0xbb, 0xdf, 0x45, + 0x5b, 0x3b, 0x29, 0xf6, 0x1b, 0xa9, 0x25, 0xf9, 0x2f, 0xcf, 0x37, 0x71, + 0x33, 0xb4, 0x90, 0xd7, 0x9b, 0x87, 0x41, 0x15, 0xd1, 0xa6, 0x39, 0xa7, + 0xa9, 0xcd, 0x66, 0x29, 0x59, 0xb4, 0x53, 0x12, 0xa1, 0x20, 0xd5, 0x04, + 0xca, 0x40, 0x31, 0xfa, 0x6f, 0xbb, 0x92, 0x04, 0xf3, 0xc2, 0x10, 0x0d, + 0xc1, 0x19, 0x78, 0x8c, 0x82, 0xed, 0x92, 0x3a, 0x6b, 0xd1, 0x3d, 0xe8, + 0xac, 0x55, 0xe4, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xd4, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xc2, 0x1d, 0x86, 0xe4, + 0xf6, 0xa1, 0xbe, 0xf5, 0xf3, 0x36, 0x9d, 0x32, 0x80, 0x17, 0x3b, 0x1f, + 0x18, 0x21, 0xed, 0xa7, 0xf5, 0xaf, 0xf1, 0x94, 0xe2, 0xa7, 0x08, 0xd5, + 0xca, 0x18, 0x45, 0xf5, 0x68, 0x94, 0x82, 0x61, 0xf7, 0xb7, 0xb2, 0xfa, + 0xd4, 0x5e, 0x32, 0xd0, 0xf0, 0x20, 0x66, 0x83, 0xd1, 0x6b, 0x3c, 0xdf, + 0x73, 0xeb, 0x73, 0x82, 0x09, 0x9b, 0xd0, 0xc5, 0xb0, 0x9f, 0x01, 0x77, + 0x85, 0xcc, 0x6e, 0x23, 0xb7, 0x00, 0x45, 0xe0, 0xa6, 0x01, 0x29, 0x1d, + 0x8b, 0xc4, 0xe0, 0xc2, 0xe0, 0x4f, 0x3b, 0x07, 0xd5, 0xac, 0x6b, 0x88, + 0xb8, 0xa4, 0xe2, 0x5c, 0x19, 0xe9, 0x98, 0x72, 0xa5, 0x6b, 0xf5, 0xa4, + 0xf7, 0x15, 0xaf, 0xfb, 0xb4, 0x80, 0x9a, 0xe3, 0xa5, 0x35, 0x2f, 0x45, + 0x81, 0xf1, 0x8b, 0x2d, 0x26, 0x5c, 0x65, 0xa9, 0x5b, 0x6e, 0x83, 0xc3, + 0x62, 0x2f, 0x84, 0xef, 0x11, 0xa5, 0x58, 0x48, 0xe9, 0x67, 0x7e, 0xd3, + 0x0b, 0x5d, 0x51, 0x80, 0x39, 0x08, 0x8e, 0xc1, 0x0d, 0x04, 0x11, 0x5f, + 0x72, 0x64, 0x1f, 0x83, 0xf8, 0xd3, 0x09, 0x38, 0xb6, 0x7f, 0x50, 0x78, + 0x27, 0x20, 0xe5, 0xbd, 0x16, 0xbf, 0x51, 0xd8, 0x4f, 0x67, 0x60, 0xf6, + 0x9e, 0xff, 0x08, 0xfe, 0xc6, 0x96, 0xd6, 0x64, 0x94, 0x28, 0xc6, 0x9a, + 0x09, 0x1a, 0x34, 0x08, 0x31, 0x4b, 0x0b, 0x97, 0x5a, 0x18, 0x72, 0x49, + 0xe9, 0x1d, 0xbb, 0x9c, 0xed, 0x7e, 0xb5, 0xc5, 0xa7, 0xf4, 0x25, 0x7a, + 0x26, 0xe9, 0x15, 0x61, 0x85, 0x32, 0xc9, 0xb3, 0xcf, 0x95, 0xbf, 0x35, + 0x10, 0x2d, 0x71, 0xfe, 0x03, 0xd6, 0x69, 0x75, 0x8d, 0xb7, 0x16, 0xa7, + 0x3d, 0x0e, 0xb7, 0x55, 0x6d, 0xa7, 0x9f, 0x10, 0x7e, 0x7e, 0xff, 0x39, + 0xee, 0x8e, 0xa7, 0x81, 0x7d, 0x11, 0xea, 0xa9, 0xd6, 0xed, 0x54, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x9a, 0xd5, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xf9, 0xde, 0x41, 0xe7, 0xa6, 0x88, 0x53, 0x76, + 0x5a, 0x26, 0xc3, 0x5c, 0xf2, 0x58, 0x68, 0x9c, 0xc7, 0x4e, 0x53, 0x18, + 0x53, 0x67, 0x39, 0x23, 0x96, 0xb0, 0xef, 0x58, 0x29, 0xe1, 0x68, 0xd8, + 0xce, 0xc0, 0x41, 0xc2, 0x35, 0x5f, 0x74, 0xfa, 0xdf, 0xc7, 0x0f, 0x80, + 0x50, 0xd1, 0xf6, 0x5a, 0x3a, 0x81, 0xe0, 0xd9, 0x9b, 0x47, 0x96, 0xcd, + 0xc5, 0x0f, 0x91, 0x12, 0x81, 0x77, 0x1e, 0xef, 0x2e, 0xba, 0x16, 0x51, + 0x70, 0x78, 0xdc, 0xa3, 0x84, 0x12, 0x7c, 0x9e, 0x21, 0x7d, 0xa3, 0x5f, + 0xce, 0xa1, 0x25, 0x84, 0x99, 0xa4, 0x2d, 0xa6, 0x0f, 0x95, 0xef, 0xef, + 0x31, 0xe6, 0xf2, 0x18, 0x08, 0x47, 0xd2, 0x5a, 0x39, 0x01, 0x7a, 0xca, + 0xd3, 0x03, 0xb1, 0xc2, 0x48, 0xf4, 0x1f, 0x6d, 0xc2, 0x8c, 0x5c, 0xda, + 0xf5, 0x10, 0xed, 0xfc, 0x2e, 0x0c, 0xb3, 0x52, 0xaa, 0xa9, 0xed, 0xbc, + 0x41, 0xcc, 0xd4, 0x4b, 0x1c, 0xd0, 0xa3, 0x1d, 0xf4, 0xe7, 0x48, 0x34, + 0x4e, 0xcf, 0x3b, 0xb3, 0x71, 0x06, 0xbe, 0x0c, 0x35, 0xbb, 0xb4, 0x17, + 0xd8, 0x8b, 0xba, 0xdd, 0x32, 0x30, 0x51, 0xb1, 0xb1, 0xd6, 0x3a, 0xdc, + 0x3b, 0x25, 0x9a, 0x57, 0xc7, 0x4d, 0xd3, 0x75, 0x93, 0x59, 0x3e, 0x9b, + 0x10, 0xcf, 0xdb, 0x38, 0x75, 0x51, 0xb2, 0x2a, 0x48, 0x78, 0xfc, 0xaa, + 0xe3, 0x91, 0xe7, 0x93, 0xe7, 0x0a, 0x07, 0x2c, 0xf8, 0x88, 0x93, 0xde, + 0x2f, 0xba, 0x7b, 0x72, 0xcd, 0x92, 0xdd, 0xb1, 0xac, 0x1e, 0xe4, 0xe3, + 0x5d, 0xa4, 0x7f, 0x86, 0xa7, 0xcb, 0xb5, 0x81, 0x86, 0xf1, 0xf5, 0xad, + 0xd6, 0x36, 0x08, 0x09, 0x9f, 0x75, 0x6f, 0x4a, 0x5b, 0x30, 0xf8, 0xaf, + 0xd2, 0xbc, 0xb5, 0xbe, 0xf2, 0xeb, 0x9b, 0xbc, 0x11, 0xd4, 0x0c, 0x14, + 0xa6, 0x6f, 0x43, 0xd3, 0xc9, 0x4e, 0xca, 0x9b, 0x4e, 0x46, 0x60, 0x4c, + 0x63, 0xcc, 0x07, 0x36, 0x8c, 0xf2, 0xd1, 0x93, 0x7a, 0x51, 0x49, 0x15, + 0xbf, 0xbf, 0x9e, 0x82, 0x21, 0x06, 0xa0, 0x39, 0x11, 0x1d, 0x6c, 0x41, + 0x72, 0xcd, 0x2a, 0x8a, 0x4a, 0xd0, 0x13, 0x6c, 0x56, 0xf4, 0x00, 0x48, + 0xaf, 0xab, 0xdf, 0xa9, 0xe9, 0xa6, 0xaa, 0x06, 0x61, 0x79, 0xc4, 0x57, + 0x42, 0xca, 0x12, 0x18, 0xcf, 0x81, 0xec, 0x79, 0x19, 0xd2, 0xd2, 0xe3, + 0x1d, 0xc6, 0x6c, 0xd0, 0xd6, 0x0a, 0xfb, 0x70, 0x42, 0x28, 0x25, 0x23, + 0xb6, 0x23, 0x15, 0x28, 0x5e, 0x9f, 0x49, 0xf2, 0x7b, 0x69, 0x74, 0xa5, + 0xb9, 0x26, 0x81, 0xfe, 0x39, 0x3e, 0x3f, 0xc8, 0x7e, 0x9e, 0x5e, 0x8e, + 0xf2, 0xdb, 0x6b, 0xfd, 0xe1, 0xc3, 0x01, 0x4a, 0xba, 0x8f, 0x33, 0x71, + 0x09, 0x80, 0x5d, 0x9c, 0x58, 0x64, 0xb7, 0x90, 0x13, 0x2a, 0xe9, 0x1d, + 0x07, 0x2c, 0x06, 0x70, 0x43, 0x0d, 0xb6, 0x57, 0x02, 0x3c, 0xbe, 0x3c, + 0x42, 0xab, 0x77, 0x15, 0x0e, 0x98, 0xfb, 0xf2, 0x1d, 0x14, 0xd9, 0xb8, + 0xd1, 0x59, 0x2a, 0x67, 0x6f, 0xfc, 0x59, 0x39, 0x33, 0xe0, 0x49, 0x0b, + 0x4e, 0x65, 0x81, 0x9f, 0x71, 0xf2, 0xa5, 0x90, 0x4f, 0x24, 0xc7, 0x05, + 0xfb, 0x77, 0x1e, 0x14, 0xca, 0x2f, 0xfc, 0xac, 0xec, 0xbf, 0xa2, 0x69, + 0x15, 0x0a, 0x6b, 0xa9, 0xa0, 0x74, 0xee, 0xad, 0xa9, 0x50, 0x4d, 0x4d, + 0xab, 0x6e, 0xc1, 0xb3, 0xda, 0xbb, 0xbd, 0xab, 0x00, 0x05, 0x14, 0xc1, + 0xc4, 0x53, 0x7b, 0x78, 0x97, 0x68, 0x3c, 0x05, 0xf2, 0xed, 0x87, 0xca, + 0x86, 0xd1, 0xdf, 0xda, 0xb3, 0x2f, 0x17, 0x87, 0x87, 0x2f, 0xd8, 0xe9, + 0xb2, 0x96, 0xdc, 0x7f, 0x22, 0xf1, 0x2a, 0x9f, 0xfe, 0x54, 0x55, 0xa1, + 0x96, 0xab, 0x9f, 0x61, 0x74, 0xcd, 0x4d, 0x77, 0x38, 0x02, 0x23, 0x29, + 0x28, 0x5b, 0xfc, 0x86, 0x17, 0x40, 0xd4, 0x42, 0x2a, 0x9b, 0x84, 0xf7, + 0x67, 0x2b, 0x3a, 0xc1, 0x31, 0x89, 0x4b, 0x67, 0xd1, 0x7d, 0x6b, 0x36, + 0xec, 0x69, 0x6b, 0x24, 0xca, 0xd6, 0x2d, 0xbb, 0x21, 0xc8, 0x0c, 0x53, + 0x41, 0x29, 0x0b, 0xc1, 0xfe, 0xd5, 0xa3, 0x4c, 0x66, 0x2f, 0xc7, 0xf1, + 0xa8, 0xc0, 0x3d, 0x9a, 0xb9, 0x09, 0x50, 0x3f, 0x09, 0x87, 0xa4, 0x3f, + 0x7a, 0x33, 0xef, 0xf0, 0xfb, 0x77, 0x02, 0x7d, 0x92, 0xaf, 0x73, 0xaa, + 0xcc, 0x3f, 0x66, 0x56, 0xd0, 0x21, 0xd1, 0xe8, 0x0e, 0x47, 0x03, 0x5e, + 0x3b, 0xe9, 0xa2, 0xe3, 0x83, 0x0b, 0x73, 0xd3, 0xaa, 0x94, 0x80, 0xef, + 0x7c, 0xdf, 0xde, 0x86, 0xc3, 0xa9, 0x62, 0x34, 0x76, 0xee, 0x4d, 0x15, + 0x73, 0x7b, 0xd7, 0x6d, 0xd4, 0x21, 0x05, 0xd4, 0xcf, 0xf3, 0x54, 0xdc, + 0x49, 0x5f, 0x5a, 0x2a, 0x37, 0x19, 0x89, 0x61, 0x1d, 0x95, 0x17, 0x8b, + 0x09, 0x95, 0x5d, 0x9f, 0xde, 0x86, 0x03, 0x93, 0x76, 0xec, 0x54, 0xec, + 0x13, 0xc3, 0xf9, 0x38, 0x8f, 0xa9, 0x11, 0xf0, 0x9a, 0x0e, 0x5e, 0x38, + 0x69, 0xeb, 0x62, 0x41, 0x9e, 0xd0, 0x1b, 0x59, 0x8c, 0xfd, 0x16, 0xfa, + 0xd8, 0x99, 0x0d, 0x83, 0x7e, 0xba, 0x5b, 0xc6, 0x59, 0xe1, 0xae, 0xba, + 0xb9, 0xb8, 0xba, 0xa5, 0x4d, 0x20, 0x00, 0xc9, 0x0c, 0xe1, 0x77, 0xdf, + 0xc4, 0x95, 0xca, 0x7c, 0xa5, 0xef, 0x0a, 0xed, 0x9b, 0x31, 0x06, 0xe1, + 0xc9, 0xa3, 0x88, 0x0a, 0xcc, 0x3d, 0xc8, 0xb6, 0x01, 0xe2, 0xa9, 0x29, + 0x03, 0x8a, 0x28, 0xf8, 0x0d, 0x70, 0x77, 0xb9, 0xe1, 0x1b, 0x06, 0x19, + 0x86, 0xc1, 0xd3, 0xcf, 0x6b, 0x9c, 0x09, 0x70, 0x50, 0xed, 0xb5, 0xf6, + 0x69, 0xcc, 0xac, 0x30, 0x6a, 0x1f, 0x1d, 0xe6, 0x75, 0x33, 0xab, 0x55, + 0x48, 0xfa, 0x81, 0xb8, 0x06, 0x3a, 0x78, 0xee, 0xde, 0xef, 0xe2, 0x17, + 0xc4, 0x3e, 0xe5, 0x22, 0xa7, 0xd1, 0x45, 0x5b, 0x57, 0xb0, 0xde, 0x69, + 0x30, 0xd1, 0x9a, 0xd7, 0x6b, 0x0e, 0x7a, 0x30, 0x0d, 0xb5, 0xec, 0x60, + 0xa7, 0x05, 0x87, 0x42, 0x4b, 0x92, 0x1f, 0x68, 0x8e, 0x1a, 0x90, 0x84, + 0x27, 0x2a, 0xc0, 0xd2, 0xff, 0xbc, 0x8e, 0x34, 0x53, 0x9d, 0x04, 0x50, + 0xcb, 0x79, 0xd9, 0x55, 0xd5, 0x4d, 0x3c, 0xe2, 0xb4, 0x9b, 0x57, 0x07, + 0x1f, 0xce, 0xd0, 0xa7, 0x84, 0xe1, 0xb7, 0x3a, 0xaf, 0xc5, 0x67, 0x64, + 0xbc, 0x02, 0xbe, 0xb0, 0x65, 0x7e, 0xb0, 0x4c, 0xc2, 0x2d, 0xcd, 0xf8, + 0x60, 0xcb, 0xfe, 0xd1, 0x8d, 0x14, 0x5a, 0xd3, 0x38, 0xd4, 0x71, 0x5a, + 0xca, 0xbb, 0xfe, 0x0e, 0x54, 0xf9, 0xb4, 0x25, 0xa5, 0x71, 0x13, 0x95, + 0x14, 0xdc, 0x86, 0xb8, 0x21, 0xa7, 0x2e, 0x13, 0xc6, 0x2f, 0xce, 0xe7, + 0x6c, 0xb8, 0x0d, 0xc9, 0xe4, 0xc4, 0x64, 0x12, 0x78, 0x1c, 0x95, 0x92, + 0xc2, 0xec, 0xaa, 0xd3, 0xc3, 0x3a, 0xd2, 0xe8, 0x95, 0xf0, 0x6b, 0x03, + 0x8c, 0xcf, 0x6b, 0xdb, 0x21, 0xa0, 0xcf, 0xf4, 0x05, 0xc8, 0xe7, 0x77, + 0x05, 0x55, 0x7b, 0x6b, 0xfa, 0x96, 0xf1, 0x7c, 0x30, 0x62, 0x75, 0xbe, + 0x6e, 0xea, 0xba, 0x9f, 0x40, 0x2e, 0x9a, 0x86, 0x93, 0xcc, 0x38, 0xf7, + 0xee, 0xd8, 0xbb, 0x24, 0xcd, 0x85, 0x3e, 0x85, 0x16, 0x8c, 0x33, 0x23, + 0x73, 0xe6, 0x43, 0xc4, 0x67, 0xbf, 0xef, 0x85, 0xb1, 0x44, 0xf9, 0x55, + 0x93, 0x4d, 0x0b, 0x8e, 0xc1, 0x42, 0x13, 0xc6, 0xc8, 0x09, 0x63, 0xab, + 0xb3, 0xc7, 0xc4, 0xa4, 0x8b, 0x72, 0xfb, 0xa5, 0x99, 0xa1, 0x5d, 0x07, + 0x02, 0x82, 0x56, 0x11, 0x3c, 0xc2, 0x5a, 0x55, 0xf9, 0x3a, 0x93, 0x61, + 0x89, 0x46, 0xb7, 0x6a, 0x42, 0x76, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x00, + 0xaa, 0xd9, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x32, 0xc1, 0x61, 0xaa, 0xdb, 0xe9, 0xae, 0x88, 0xcb, 0xf7, 0x28, 0xdd, + 0x82, 0x62, 0x61, 0x41, 0x4e, 0xbb, 0xf9, 0xb7, 0xe8, 0x81, 0x99, 0x18, + 0xe2, 0xa7, 0xb4, 0x7c, 0xb7, 0x08, 0x44, 0x6f, 0x24, 0xb3, 0xda, 0x57, + 0x62, 0x29, 0xc7, 0xa6, 0x84, 0xb1, 0x5d, 0xc5, 0x00, 0x4c, 0x30, 0x16, + 0xf0, 0x0a, 0x74, 0x73, 0xec, 0xaf, 0xb5, 0xde, 0xb0, 0xa7, 0x75, 0x22, + 0x8f, 0x9e, 0x43, 0x01, 0x68, 0xae, 0x91, 0xeb, 0x46, 0x52, 0x3f, 0x2c, + 0x4e, 0xc5, 0xd0, 0xc8, 0x15, 0xea, 0x99, 0xc2, 0x37, 0x5b, 0x68, 0xb5, + 0xce, 0x41, 0x92, 0xbf, 0xd6, 0xdb, 0x85, 0xad, 0x08, 0xd1, 0x11, 0x93, + 0xe8, 0xd4, 0x78, 0x43, 0x3b, 0x7d, 0xcb, 0x42, 0x84, 0xf3, 0x61, 0x88, + 0x9e, 0x6a, 0x73, 0xb9, 0x78, 0x17, 0x9a, 0x9f, 0xfb, 0x97, 0xcb, 0xd6, + 0xb5, 0x3f, 0x00, 0x41, 0xb0, 0x30, 0x2f, 0x6f, 0x89, 0xdd, 0xfa, 0x13, + 0xd1, 0x07, 0xbe, 0x2f, 0xea, 0x91, 0x62, 0xaa, 0xed, 0xcb, 0xfd, 0x07, + 0x82, 0xbb, 0x3f, 0xf4, 0xa6, 0x94, 0x66, 0x71, 0x20, 0x61, 0xac, 0x84, + 0x04, 0x70, 0xf2, 0xd3, 0xdf, 0xac, 0x44, 0xfd, 0x47, 0x26, 0x81, 0x64, + 0xb3, 0xa6, 0x90, 0x2b, 0xd2, 0x2c, 0xd0, 0x77, 0x81, 0x53, 0x45, 0x78, + 0x5f, 0x30, 0x77, 0x91, 0x83, 0x13, 0x33, 0xd1, 0x91, 0xa6, 0x35, 0x21, + 0xcb, 0x26, 0x54, 0x0a, 0xf7, 0x70, 0x5e, 0xdb, 0xd8, 0x92, 0xc7, 0xdf, + 0xf9, 0x2a, 0x46, 0x91, 0x22, 0x3b, 0xe6, 0xe1, 0x91, 0xeb, 0xa6, 0x78, + 0x81, 0x57, 0xf3, 0x04, 0xdf, 0x34, 0x55, 0x74, 0x0a, 0xfe, 0xf2, 0xbd, + 0xb3, 0xeb, 0xa3, 0x8e, 0x71, 0x15, 0xa9, 0x2f, 0x53, 0xe2, 0xa1, 0x45, + 0xdf, 0xe8, 0x29, 0x40, 0xf1, 0x4b, 0x23, 0xdb, 0x8e, 0xee, 0x19, 0xa8, + 0xd4, 0x15, 0x90, 0x8c, 0x04, 0x46, 0x81, 0x49, 0x92, 0xe5, 0xe1, 0xfe, + 0x99, 0x06, 0xfc, 0x3e, 0x43, 0x58, 0x3b, 0x19, 0x7f, 0xd2, 0x13, 0x65, + 0xc2, 0x64, 0x27, 0x6d, 0x93, 0x6a, 0xcf, 0x48, 0x2a, 0x3d, 0xdd, 0x79, + 0x9f, 0x05, 0x32, 0xeb, 0xfd, 0xb4, 0xd2, 0x1d, 0x16, 0x61, 0x3d, 0x17, + 0x4c, 0xb8, 0xad, 0x63, 0x0e, 0x6b, 0x8a, 0x4a, 0x34, 0x4c, 0xb5, 0x3c, + 0x0f, 0x05, 0x28, 0x8c, 0x8b, 0xdf, 0xf4, 0xa0, 0x49, 0xbf, 0x34, 0x6c, + 0x6a, 0x5f, 0x40, 0x95, 0x48, 0x4b, 0x93, 0x1e, 0x61, 0x6d, 0x58, 0xc3, + 0x86, 0x98, 0x70, 0x11, 0x4e, 0x44, 0x65, 0xc1, 0x0d, 0xea, 0x2f, 0xda, + 0x38, 0x16, 0xbd, 0xd4, 0x7b, 0x3e, 0x31, 0xee, 0x42, 0x4c, 0xdc, 0xe9, + 0x8b, 0x1f, 0xa9, 0xcf, 0xab, 0x60, 0xb5, 0xb1, 0xd2, 0xf2, 0x6a, 0xe9, + 0xbc, 0xcc, 0xcb, 0x60, 0x4a, 0xca, 0x70, 0x79, 0x64, 0x9d, 0x07, 0x1e, + 0xdb, 0xef, 0x34, 0xaf, 0x17, 0x93, 0x6b, 0x60, 0x73, 0x2d, 0x8c, 0x08, + 0x27, 0x1e, 0x46, 0x9f, 0xcb, 0x33, 0xdd, 0x76, 0xef, 0x17, 0x58, 0x9a, + 0x5f, 0x82, 0x78, 0x0f, 0xbf, 0xe7, 0x0f, 0x3a, 0x1e, 0xa8, 0x30, 0xbf, + 0xff, 0xc7, 0xc7, 0x82, 0x8b, 0xc3, 0x65, 0x04, 0xfd, 0x45, 0xc9, 0x88, + 0x99, 0x8e, 0x44, 0xc5, 0x23, 0x1e, 0xbf, 0xf1, 0x95, 0x70, 0x35, 0xe6, + 0x56, 0x4a, 0x53, 0xb2, 0xac, 0x0c, 0xfd, 0xf5, 0x61, 0x26, 0x5b, 0x70, + 0xd6, 0x4c, 0xfc, 0x0f, 0xcc, 0x53, 0x6e, 0x25, 0xca, 0x1d, 0x0c, 0x56, + 0xf7, 0x9c, 0x95, 0xf6, 0x3c, 0x08, 0x0c, 0x64, 0xb1, 0x1c, 0x5c, 0xe6, + 0x25, 0xa4, 0xa3, 0xb7, 0xaf, 0x8b, 0xbc, 0xe1, 0x68, 0xdf, 0x10, 0xab, + 0xbb, 0xd5, 0x30, 0x64, 0x42, 0xf6, 0xe6, 0x9a, 0xb5, 0x59, 0x12, 0x76, + 0x92, 0xac, 0x29, 0xe9, 0x45, 0xdb, 0x2e, 0x62, 0x22, 0x58, 0x24, 0x89, + 0xc8, 0x6a, 0x2a, 0xa7, 0x3f, 0x04, 0x53, 0x4e, 0x07, 0x41, 0x4e, 0x5f, + 0x95, 0x5f, 0x6e, 0x14, 0x5b, 0xa7, 0xa7, 0xd3, 0x5a, 0xa2, 0x95, 0x4a, + 0xc8, 0xe9, 0x3c, 0x5a, 0x84, 0x50, 0xbc, 0xe1, 0x9c, 0x7a, 0x16, 0xe5, + 0xc7, 0x04, 0x9d, 0x60, 0x2e, 0x7d, 0xb3, 0x77, 0x5d, 0x86, 0x2e, 0xac, + 0x57, 0x2a, 0x31, 0x26, 0x23, 0x6e, 0xcc, 0x7f, 0xb8, 0x36, 0x29, 0xa9, + 0xa8, 0xd9, 0xc6, 0x75, 0xee, 0x16, 0x23, 0x27, 0x0f, 0xe1, 0xb0, 0x3d, + 0x91, 0x3a, 0x26, 0x4a, 0x60, 0x72, 0x14, 0xf9, 0x3c, 0x66, 0x66, 0xe8, + 0x7d, 0x4a, 0x6f, 0x7e, 0x63, 0x58, 0x6a, 0x28, 0x78, 0x50, 0xef, 0x3b, + 0x9d, 0xeb, 0xb6, 0x4b, 0x5d, 0x55, 0x80, 0x84, 0x97, 0x9b, 0x74, 0x4b, + 0x5c, 0x09, 0x1d, 0xe7, 0x57, 0xfc, 0x40, 0x3f, 0xa9, 0xbd, 0xdf, 0x61, + 0x2a, 0x89, 0x62, 0x51, 0xfc, 0x24, 0xee, 0xee, 0x97, 0x10, 0xca, 0xb6, + 0x0e, 0x8e, 0x71, 0x67, 0x2a, 0x79, 0x4f, 0xc4, 0xe6, 0x3e, 0x27, 0xc2, + 0x9b, 0x85, 0xfd, 0xde, 0xfb, 0x58, 0x75, 0xf3, 0x1c, 0x31, 0xa2, 0x56, + 0x3e, 0xdc, 0x24, 0xf4, 0x4f, 0xcb, 0x5a, 0x1a, 0x77, 0x5c, 0x28, 0xd1, + 0x5a, 0x55, 0xa9, 0x8c, 0xb5, 0xdd, 0x77, 0x93, 0x58, 0xd8, 0x2f, 0x7d, + 0x5a, 0x67, 0xa1, 0x95, 0x0a, 0xd2, 0x6a, 0x93, 0xa6, 0xf0, 0x5f, 0x7f, + 0x0a, 0x29, 0xdb, 0x1d, 0x8c, 0xa7, 0x12, 0x0a, 0xf4, 0xc9, 0xcd, 0x70, + 0xd1, 0xbd, 0x48, 0xd4, 0x9a, 0xbb, 0xbb, 0x24, 0xbf, 0x52, 0x25, 0xb9, + 0x75, 0xc2, 0x17, 0x36, 0x6f, 0x4a, 0xc0, 0x53, 0x6d, 0x38, 0xfb, 0x7a, + 0x60, 0xc8, 0x5d, 0x03, 0xc1, 0x1c, 0x0c, 0x31, 0xf0, 0x59, 0xed, 0x0a, + 0x5f, 0x84, 0xf2, 0x89, 0x6c, 0xb4, 0xd5, 0x24, 0x2d, 0x2a, 0xda, 0xbe, + 0x74, 0x1d, 0x22, 0xe2, 0xc6, 0xf0, 0x9b, 0x98, 0x5a, 0x41, 0x11, 0x4c, + 0x51, 0x97, 0x16, 0xa7, 0xc9, 0xd8, 0x53, 0x12, 0x53, 0xdd, 0x22, 0xa9, + 0xf2, 0xae, 0x52, 0x49, 0x02, 0xf9, 0x5c, 0x78, 0x00, 0xa2, 0x64, 0xff, + 0x91, 0x62, 0x20, 0x6a, 0x87, 0x6a, 0x40, 0x01, 0x85, 0x30, 0xf5, 0xdd, + 0xa7, 0x64, 0x0a, 0x85, 0x8d, 0x37, 0x99, 0xcb, 0x03, 0xc8, 0x29, 0x56, + 0x7e, 0x75, 0x4f, 0xa1, 0xc3, 0x76, 0xce, 0xdb, 0xa3, 0xb4, 0x7e, 0x91, + 0x95, 0xbe, 0x53, 0x0e, 0x20, 0xc9, 0xe7, 0x71, 0x78, 0xad, 0x3d, 0x4c, + 0xbb, 0x59, 0xb9, 0x77, 0xcf, 0x7d, 0x7b, 0xff, 0x15, 0xdb, 0x1d, 0xae, + 0x1f, 0xbe, 0x33, 0x88, 0x01, 0x04, 0x95, 0xe5, 0xe9, 0x6a, 0x1c, 0xbf, + 0xc8, 0xc3, 0x33, 0x3b, 0xd8, 0x2f, 0x75, 0x4a, 0xc3, 0x6f, 0x09, 0x88, + 0x26, 0x46, 0x90, 0x89, 0x53, 0x12, 0x27, 0xc2, 0x7d, 0x23, 0x6b, 0xc4, + 0xe3, 0x0a, 0x0f, 0xc2, 0x86, 0x6d, 0x20, 0x35, 0x82, 0x33, 0xec, 0xdd, + 0xa7, 0x6a, 0xc3, 0xa8, 0x11, 0xdc, 0x02, 0xd9, 0x05, 0x1b, 0x04, 0x75, + 0x92, 0x6c, 0x08, 0x9e, 0x38, 0x72, 0xd9, 0x7d, 0x9b, 0xbc, 0xfd, 0xca, + 0xb8, 0x06, 0x0e, 0x24, 0x89, 0x90, 0xde, 0x52, 0xe4, 0xd1, 0xcc, 0x99, + 0x87, 0x0b, 0x87, 0xbb, 0x5c, 0xa9, 0xab, 0xec, 0xb5, 0xe4, 0xdd, 0x5d, + 0xfa, 0xb1, 0x97, 0x5f, 0x61, 0xf7, 0x58, 0xd6, 0x08, 0x02, 0xf2, 0x51, + 0x7c, 0x7a, 0xe6, 0xf1, 0xcb, 0x43, 0xd0, 0x21, 0x09, 0xb8, 0x82, 0xa9, + 0x52, 0xd9, 0xa8, 0x7f, 0x2b, 0xe1, 0x0f, 0x31, 0xbc, 0x16, 0xa2, 0xce, + 0x35, 0x55, 0x2e, 0xd6, 0xda, 0x38, 0xd9, 0xc2, 0x5e, 0xca, 0x27, 0xd9, + 0xa6, 0xd6, 0x4b, 0xa2, 0x73, 0xc4, 0xce, 0x66, 0x30, 0x60, 0xa2, 0x01, + 0xfa, 0xc1, 0xd6, 0xc8, 0x00, 0x00, 0x00, 0x00, 0xba, 0xdd, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, 0xe2, 0x62, 0x68, + 0xff, 0x60, 0x67, 0x64, 0x88, 0xdd, 0x81, 0x79, 0x82, 0xf5, 0x46, 0xf9, + 0x7e, 0x0e, 0xa9, 0x26, 0xf6, 0xcf, 0x5d, 0xef, 0x10, 0x11, 0xe1, 0x71, + 0x72, 0x77, 0xcf, 0x02, 0x7b, 0xf1, 0x6e, 0xc4, 0xb4, 0xfa, 0x2a, 0x12, + 0xfe, 0x7e, 0x3c, 0x66, 0xef, 0x41, 0x98, 0x3a, 0x1f, 0xa9, 0x14, 0x8f, + 0x46, 0x22, 0xa0, 0xc2, 0xee, 0x93, 0x25, 0x34, 0xf2, 0xb7, 0x6d, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0xde, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xd4, 0x17, 0x62, 0x25, 0xfd, 0x5b, 0x75, 0xeb, + 0xec, 0x06, 0xc9, 0x39, 0x86, 0x6d, 0xc5, 0x60, 0x2d, 0x33, 0x3d, 0xce, + 0x6a, 0x9f, 0x07, 0x3b, 0xb9, 0x70, 0x0f, 0xc7, 0x13, 0x46, 0x35, 0x46, + 0x26, 0xe4, 0xbc, 0x6e, 0x54, 0x89, 0x29, 0xd5, 0xa4, 0x94, 0xa0, 0x3a, + 0x7a, 0x61, 0xcf, 0xd1, 0x48, 0x27, 0x7a, 0x72, 0x95, 0xde, 0x93, 0xd1, + 0x19, 0x1f, 0xc9, 0xc8, 0x8f, 0x0d, 0xce, 0x34, 0x03, 0x39, 0x0a, 0x92, + 0x16, 0x09, 0xc4, 0x49, 0xf9, 0x30, 0x2e, 0x19, 0xd1, 0x69, 0x7e, 0x78, + 0x00, 0x25, 0x30, 0x6f, 0x6b, 0xe1, 0xbe, 0xad, 0xb2, 0x05, 0xde, 0xc7, + 0xc2, 0xf7, 0xd5, 0xa7, 0x4d, 0x03, 0x6f, 0x6b, 0xcd, 0xcb, 0x42, 0xfa, + 0x88, 0x16, 0xd5, 0xa6, 0x60, 0x08, 0xd4, 0xa5, 0x5b, 0x3b, 0x7b, 0xa2, + 0xca, 0xa3, 0xa2, 0x5d, 0x63, 0x7f, 0xc0, 0x37, 0xc5, 0x7e, 0x99, 0x04, + 0x5d, 0x9a, 0xb9, 0xa5, 0xac, 0xd1, 0xe2, 0x5d, 0xb2, 0x2b, 0x7e, 0xbb, + 0xb9, 0x66, 0x13, 0xa7, 0x30, 0xbf, 0x80, 0x0c, 0x2b, 0x8d, 0x45, 0xe1, + 0x8d, 0x96, 0x25, 0x27, 0x47, 0x3d, 0x21, 0x7d, 0x1c, 0x42, 0xac, 0x31, + 0x26, 0x47, 0x59, 0xb3, 0x44, 0x85, 0xf2, 0x8e, 0x7d, 0x01, 0x96, 0x6d, + 0xb2, 0x64, 0xc3, 0xfc, 0xa7, 0x82, 0x06, 0x4a, 0x87, 0x75, 0x9b, 0x99, + 0x47, 0x7e, 0xa6, 0x4d, 0x2c, 0x36, 0xff, 0xac, 0x2b, 0x77, 0x96, 0x52, + 0x14, 0x8d, 0x07, 0x0d, 0x28, 0x9d, 0x84, 0xa2, 0xda, 0xd6, 0x45, 0x3a, + 0xd4, 0xe6, 0xb7, 0x9a, 0xf3, 0x34, 0xe3, 0xda, 0x39, 0xdf, 0x35, 0x9c, + 0xe4, 0x87, 0x55, 0xc8, 0x43, 0xd0, 0x61, 0x46, 0x52, 0x2f, 0x75, 0x63, + 0xbb, 0x98, 0x97, 0xeb, 0xfb, 0x15, 0xaf, 0x8e, 0x96, 0xdc, 0xff, 0x0a, + 0x90, 0xda, 0x09, 0x63, 0x28, 0x7b, 0x92, 0x73, 0x0b, 0xd4, 0x2b, 0x72, + 0x2a, 0x86, 0x32, 0xc3, 0xc1, 0x3e, 0xe4, 0x2c, 0x07, 0x89, 0x53, 0xb7, + 0xfe, 0x78, 0x6c, 0x95, 0xb4, 0x62, 0x4d, 0x4b, 0xfe, 0x6c, 0xfc, 0x5e, + 0x4e, 0xa7, 0x8c, 0x07, 0x4f, 0x85, 0x27, 0xe0, 0x7b, 0xd9, 0x7a, 0xe5, + 0x1d, 0xbc, 0x36, 0xda, 0x8e, 0x21, 0xff, 0xb3, 0x60, 0x2c, 0x5e, 0x23, + 0x0f, 0xde, 0x3f, 0xae, 0xa5, 0x3a, 0x50, 0xa9, 0x99, 0x39, 0x45, 0xaf, + 0xd3, 0x5f, 0x4a, 0x15, 0xad, 0x9c, 0x66, 0x7f, 0x92, 0xe0, 0x02, 0x81, + 0x3e, 0x06, 0x6a, 0x5e, 0xd0, 0x0c, 0x42, 0xe7, 0xcf, 0xe2, 0xeb, 0xa3, + 0xe0, 0xf7, 0x2d, 0x8a, 0x21, 0xdb, 0x64, 0x28, 0x2a, 0xb3, 0x2b, 0xc4, + 0xc9, 0xd5, 0x60, 0xaf, 0xfc, 0x15, 0xa1, 0x44, 0x9c, 0x96, 0x04, 0x42, + 0x1c, 0x55, 0x8c, 0xa5, 0xce, 0x80, 0xce, 0x75, 0x64, 0xa9, 0xf6, 0xa5, + 0x5a, 0x0f, 0x8a, 0x4b, 0x8b, 0x72, 0xcf, 0x3e, 0xd7, 0xeb, 0xe1, 0xd0, + 0xd3, 0x2d, 0x04, 0x6c, 0x9e, 0x02, 0x75, 0x43, 0x5c, 0xc1, 0x57, 0x66, + 0xd9, 0x14, 0x5b, 0x08, 0x10, 0x44, 0x8d, 0x8e, 0x89, 0xd1, 0x65, 0x27, + 0x2a, 0x0b, 0x99, 0x6f, 0x09, 0xa6, 0x20, 0xa5, 0x75, 0x24, 0xe4, 0xf7, + 0xf5, 0xe0, 0xed, 0x79, 0x37, 0x18, 0x13, 0x1c, 0xd9, 0xd1, 0xf5, 0x69, + 0x0c, 0xa5, 0x02, 0xdf, 0x6a, 0xfd, 0x2e, 0x35, 0x8e, 0xd0, 0x41, 0x91, + 0x61, 0x0f, 0x5c, 0xdd, 0x70, 0xbf, 0x1c, 0x49, 0xcb, 0xe9, 0xc9, 0x33, + 0xc4, 0x99, 0x1e, 0x8b, 0x75, 0x48, 0xc2, 0x58, 0xa4, 0x70, 0x1f, 0xbb, + 0xcd, 0xd3, 0x0e, 0x79, 0x25, 0xbe, 0x53, 0xfa, 0x32, 0x32, 0xf6, 0xb9, + 0xf0, 0x0a, 0x52, 0x5b, 0xe0, 0x69, 0xff, 0x43, 0xda, 0x98, 0x1f, 0xee, + 0x54, 0x60, 0xf8, 0x24, 0x43, 0xc5, 0x37, 0x72, 0xd1, 0xfc, 0x99, 0x9a, + 0x3e, 0x24, 0xe0, 0xd9, 0xc2, 0x61, 0x47, 0xb3, 0x26, 0x09, 0x85, 0x74, + 0xa1, 0x2b, 0x4a, 0x70, 0xd0, 0x1b, 0x90, 0x03, 0x25, 0xd9, 0x22, 0xc2, + 0x16, 0x22, 0x3a, 0x62, 0x20, 0xd4, 0x13, 0xce, 0xa2, 0xc7, 0x02, 0xfb, + 0x9a, 0xbf, 0xf1, 0x1c, 0x80, 0x01, 0x97, 0x90, 0x7f, 0x5a, 0x98, 0x70, + 0x30, 0x61, 0x77, 0xe5, 0xd4, 0x3b, 0x03, 0x42, 0x57, 0x31, 0x5e, 0xc6, + 0x64, 0xe1, 0xf4, 0x64, 0x77, 0x21, 0x9b, 0x44, 0x1c, 0xd9, 0x8c, 0x95, + 0x8a, 0xf1, 0xcb, 0x82, 0xac, 0xc1, 0x26, 0x31, 0xf2, 0x22, 0x41, 0xab, + 0xbb, 0x23, 0xd3, 0x8d, 0xcc, 0x5c, 0x9d, 0x9b, 0x1d, 0x9c, 0x4d, 0xf3, + 0x62, 0xde, 0x15, 0x6a, 0x94, 0x8d, 0x24, 0xe7, 0x52, 0x8d, 0x2a, 0xa4, + 0x1d, 0x54, 0x5a, 0xda, 0xaf, 0xab, 0x05, 0x27, 0x4b, 0xbb, 0xb4, 0xda, + 0x0c, 0xb9, 0x20, 0xb3, 0xaf, 0x4a, 0xeb, 0x37, 0xe5, 0x43, 0xe4, 0xc1, + 0xf6, 0x9e, 0xf8, 0x6c, 0xd8, 0xa1, 0x0c, 0xf9, 0xd1, 0x4b, 0x96, 0xa0, + 0x6d, 0x38, 0x64, 0x41, 0xd3, 0x14, 0xfb, 0xad, 0x89, 0xa9, 0xf7, 0x36, + 0x01, 0x0f, 0xbe, 0x8e, 0xd7, 0x76, 0xc6, 0x70, 0x22, 0x32, 0x8b, 0x08, + 0xca, 0x95, 0xbf, 0xcf, 0x5e, 0xb8, 0xc0, 0x3f, 0xd9, 0xaa, 0x84, 0xab, + 0x30, 0x5b, 0xe3, 0x7a, 0x61, 0x32, 0xe5, 0x54, 0x01, 0x5e, 0xb6, 0x1c, + 0x9c, 0x78, 0x52, 0x2a, 0xa7, 0xf5, 0x29, 0xa6, 0x0f, 0x14, 0xa5, 0x3a, + 0x34, 0xd4, 0xf5, 0xc2, 0xb2, 0x8d, 0x12, 0x7b, 0x8a, 0x64, 0x00, 0xfd, + 0x02, 0x0e, 0x02, 0x26, 0x5a, 0xb9, 0xeb, 0xfd, 0x30, 0xce, 0x51, 0xec, + 0x5f, 0xbc, 0xee, 0x53, 0x21, 0xec, 0x0e, 0xee, 0xc4, 0x28, 0x1a, 0xec, + 0x2a, 0x39, 0x4e, 0xe1, 0x50, 0x11, 0x3f, 0x16, 0xdd, 0xbf, 0xaf, 0x3e, + 0xbe, 0xd4, 0xfe, 0x34, 0x1e, 0x62, 0x3f, 0x5a, 0xea, 0x05, 0xfc, 0xd5, + 0x45, 0x08, 0x47, 0xce, 0x38, 0x3f, 0x75, 0x7e, 0x0c, 0x3a, 0x2a, 0x14, + 0xa7, 0x61, 0xba, 0x3a, 0xa1, 0x41, 0xa2, 0x72, 0x19, 0xfa, 0x33, 0x43, + 0xa7, 0xf4, 0x4e, 0x5b, 0xf9, 0xb1, 0x45, 0x16, 0x57, 0x8e, 0xb1, 0xad, + 0x7d, 0x88, 0xd3, 0x93, 0xa2, 0x08, 0xf3, 0x96, 0x4d, 0x84, 0x63, 0x08, + 0xfa, 0x9d, 0xf3, 0x04, 0x33, 0xbd, 0x7e, 0x7a, 0xc7, 0x63, 0xc5, 0x31, + 0x5a, 0x82, 0x33, 0x90, 0x56, 0x44, 0xe9, 0xd3, 0xc4, 0xd4, 0x76, 0x29, + 0x2f, 0xdb, 0xa3, 0x9d, 0xff, 0xd4, 0xd2, 0xb1, 0xce, 0xf1, 0xcb, 0x7f, + 0x10, 0x3b, 0x90, 0xa4, 0x1b, 0xa0, 0x9b, 0xa7, 0xfa, 0x27, 0x40, 0x11, + 0x35, 0xc9, 0x7f, 0x01, 0x97, 0x76, 0x9f, 0x33, 0xc5, 0xd6, 0x8d, 0x20, + 0x07, 0x73, 0x93, 0x0b, 0x24, 0x88, 0x4e, 0x73, 0x68, 0x79, 0x92, 0x20, + 0x2a, 0x71, 0xed, 0x22, 0x0b, 0xfb, 0x42, 0xb5, 0xd9, 0xc3, 0xaa, 0xed, + 0x45, 0x03, 0x64, 0xde, 0x6f, 0x25, 0x8e, 0x3b, 0x9a, 0xef, 0xc5, 0x63, + 0xc2, 0x7f, 0x34, 0xd0, 0x1b, 0x20, 0xa3, 0xab, 0x9d, 0x54, 0x41, 0x0e, + 0x7b, 0x2e, 0x96, 0x12, 0x75, 0x58, 0xdf, 0xd5, 0xaa, 0x3c, 0xf2, 0x26, + 0xc1, 0xf1, 0x18, 0x37, 0x56, 0xf2, 0xd2, 0x86, 0x6f, 0xd4, 0x9f, 0x57, + 0x2b, 0x32, 0xe9, 0x08, 0x94, 0x53, 0x40, 0xc5, 0x4d, 0x77, 0x39, 0xc6, + 0x4c, 0x63, 0x53, 0xf9, 0xbf, 0x35, 0x08, 0xc5, 0x0d, 0xd0, 0x89, 0x82, + 0xa7, 0x2d, 0x6a, 0xb4, 0x22, 0xb1, 0x10, 0x7f, 0xcf, 0x2e, 0x21, 0x27, + 0x9c, 0x12, 0xc6, 0x0e, 0xca, 0xd2, 0x32, 0xb1, 0x6d, 0xfd, 0x59, 0x12, + 0x23, 0x60, 0x46, 0x89, 0xe0, 0x75, 0x5e, 0xc9, 0xf4, 0x3d, 0x8a, 0x89, + 0xd4, 0x23, 0xc2, 0xbe, 0x30, 0x32, 0x4a, 0x95, 0x00, 0x00, 0x00, 0x00, + 0x1a, 0xe2, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xa7, 0x0b, 0x48, 0xe2, 0xeb, 0xd7, 0x12, 0x42, 0x4c, 0x71, 0xfb, 0x25, + 0x17, 0x23, 0x0e, 0x01, 0xa6, 0x21, 0xb9, 0x17, 0x6e, 0xf0, 0x24, 0x66, + 0x9e, 0x9d, 0x0f, 0x71, 0xf8, 0x5b, 0x79, 0xb0, 0x1b, 0x1f, 0xe7, 0xa2, + 0xc0, 0x17, 0x16, 0x08, 0x5e, 0x24, 0x7b, 0xf9, 0x7a, 0x1e, 0x70, 0xe2, + 0x05, 0x40, 0x16, 0x56, 0xe7, 0x79, 0xf2, 0x30, 0xa3, 0xdc, 0xe3, 0x7a, + 0x7e, 0x22, 0x88, 0xc0, 0xf7, 0xc8, 0x5c, 0x93, 0x95, 0x86, 0x02, 0x6c, + 0x73, 0x76, 0xef, 0x03, 0x2d, 0xcb, 0xa5, 0x22, 0xfe, 0x05, 0xbb, 0xe6, + 0xfd, 0x19, 0x8c, 0x8b, 0x67, 0x58, 0x81, 0x81, 0x2d, 0x36, 0xd0, 0xc1, + 0x20, 0xb2, 0x87, 0x87, 0xdb, 0xe4, 0xe5, 0xd1, 0xd1, 0xd5, 0x81, 0x34, + 0x4c, 0xd6, 0x09, 0xa2, 0x5d, 0xcc, 0x99, 0x12, 0xa5, 0x06, 0x0f, 0x06, + 0x7e, 0xbb, 0x67, 0x26, 0x69, 0x15, 0x6e, 0x5f, 0xb1, 0x8e, 0xd6, 0x34, + 0xfc, 0x4d, 0xd9, 0x03, 0xb7, 0x5a, 0xf4, 0xaa, 0x03, 0x00, 0x88, 0x6b, + 0x5a, 0xc9, 0xf2, 0xfb, 0x67, 0x72, 0xbc, 0xf7, 0xb9, 0xdc, 0x97, 0xdf, + 0x80, 0x91, 0xfa, 0x30, 0x18, 0x02, 0x89, 0xc7, 0xc9, 0x62, 0x1d, 0xc0, + 0x0b, 0xa6, 0xfe, 0x7e, 0xb9, 0xa9, 0x1f, 0x11, 0x71, 0xe1, 0xd1, 0xfe, + 0x8d, 0x90, 0x2c, 0x09, 0x82, 0x2e, 0x36, 0x79, 0xa5, 0x75, 0x54, 0xfb, + 0xd3, 0x3c, 0xb4, 0x18, 0x2f, 0x4e, 0x3f, 0x37, 0xc4, 0xf8, 0xc5, 0x59, + 0xa3, 0xfd, 0x0c, 0x62, 0x9e, 0xa8, 0x7a, 0x56, 0xc5, 0x97, 0x89, 0x35, + 0xc7, 0xb0, 0x29, 0x87, 0xbf, 0x6a, 0xdc, 0xb1, 0x2f, 0x01, 0xf4, 0x0d, + 0x7c, 0x25, 0x95, 0x39, 0x81, 0xdd, 0x1a, 0x81, 0x36, 0xc0, 0x6b, 0xbf, + 0x6b, 0x4d, 0xea, 0x23, 0xc0, 0x3e, 0x5c, 0x39, 0xe5, 0x6b, 0x59, 0xa0, + 0x50, 0x02, 0x99, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xe3, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x17, 0x88, 0xf8, 0xda, + 0x3d, 0x57, 0x83, 0x63, 0x76, 0xa0, 0x5c, 0x13, 0x1a, 0x00, 0x64, 0x30, + 0x19, 0xfd, 0x2e, 0x9c, 0x64, 0xb6, 0xda, 0x51, 0x7b, 0x55, 0xe8, 0xc4, + 0x67, 0x1b, 0xda, 0xfc, 0x4c, 0xd0, 0x27, 0x58, 0x56, 0xa1, 0x52, 0xd2, + 0xb8, 0xd8, 0xd5, 0x94, 0x69, 0xcf, 0xd0, 0xd5, 0x72, 0xeb, 0x2b, 0x05, + 0xf3, 0x12, 0xa6, 0xac, 0xa6, 0xf7, 0x90, 0x24, 0x1f, 0x22, 0x97, 0x5e, + 0x8b, 0x7c, 0x2c, 0x30, 0x61, 0x11, 0x9b, 0xdf, 0x83, 0x2b, 0x10, 0x09, + 0x42, 0x77, 0x2b, 0xd9, 0x43, 0xb3, 0x27, 0x69, 0x75, 0xf2, 0x2e, 0x72, + 0xed, 0x50, 0xea, 0xbf, 0x7f, 0x47, 0x39, 0x9c, 0xf8, 0x1e, 0xce, 0x6f, + 0xdd, 0xe8, 0x40, 0xc5, 0x14, 0x01, 0x7e, 0xbb, 0x0f, 0x43, 0x2d, 0x36, + 0x70, 0x54, 0xc6, 0xbe, 0x69, 0x24, 0xd1, 0x65, 0x49, 0x77, 0xf0, 0xd2, + 0x99, 0xb4, 0x50, 0x8d, 0x98, 0xcb, 0xbf, 0x7a, 0x7c, 0x65, 0xd3, 0x46, + 0xcf, 0x90, 0x69, 0x56, 0x15, 0xa2, 0xae, 0x11, 0x94, 0x60, 0xf9, 0x45, + 0x17, 0x54, 0x6b, 0xbd, 0xeb, 0xd8, 0x74, 0x41, 0x5c, 0xf6, 0x49, 0x0a, + 0x14, 0xce, 0x43, 0x1f, 0x67, 0xc3, 0x6c, 0xf4, 0x01, 0xce, 0x3f, 0x85, + 0xed, 0x19, 0xa1, 0xf7, 0x1b, 0xf8, 0x46, 0x45, 0xb4, 0xe9, 0xa7, 0x1f, + 0x2a, 0x65, 0x00, 0x2a, 0xd3, 0x8b, 0x6a, 0x3b, 0xac, 0x78, 0xab, 0xf4, + 0xc8, 0x62, 0x76, 0xc8, 0x24, 0xf8, 0xf8, 0x08, 0xe0, 0x64, 0x00, 0x64, + 0x74, 0x9e, 0x55, 0x2e, 0xf8, 0xc9, 0xc8, 0x58, 0x0e, 0x1f, 0x27, 0x32, + 0xfd, 0x30, 0x24, 0x68, 0xc8, 0xa4, 0x8c, 0x1c, 0xf3, 0xa7, 0x32, 0xae, + 0x84, 0x0a, 0x8a, 0x1e, 0x11, 0xce, 0xb2, 0x02, 0xf1, 0xb3, 0x5f, 0x7d, + 0x5e, 0x54, 0x8c, 0xe0, 0xeb, 0x46, 0x6e, 0x8a, 0x5f, 0x3f, 0x71, 0x47, + 0x2a, 0x8a, 0xe6, 0xf0, 0xb0, 0x04, 0x49, 0x64, 0xb3, 0x7e, 0x16, 0x09, + 0x83, 0x5f, 0x12, 0xe0, 0x85, 0xb7, 0x36, 0xc0, 0x8a, 0xa5, 0xcd, 0xae, + 0xc0, 0xb4, 0xa2, 0x62, 0x9b, 0xfa, 0x64, 0x18, 0x16, 0x8e, 0xb6, 0x50, + 0xf2, 0x9b, 0xc4, 0x7d, 0x0c, 0x4c, 0x8b, 0x58, 0xcf, 0x9b, 0x87, 0x09, + 0xb1, 0x37, 0xbb, 0xaf, 0xa7, 0x72, 0x79, 0x81, 0x09, 0x55, 0xa1, 0x6a, + 0x87, 0xb0, 0x7d, 0xc8, 0xb0, 0xc1, 0xa4, 0xa9, 0xdf, 0xcf, 0x95, 0x77, + 0x36, 0x8e, 0x2b, 0xae, 0xeb, 0x4b, 0xf9, 0x2a, 0x83, 0x6c, 0x53, 0x3c, + 0x89, 0xa6, 0x08, 0xae, 0x00, 0x4e, 0xb8, 0xf6, 0x34, 0x7c, 0xc6, 0x76, + 0x87, 0x1a, 0x02, 0xb0, 0x89, 0xa3, 0x0f, 0x00, 0xc6, 0x7b, 0xeb, 0xf7, + 0x95, 0x40, 0xc5, 0x0d, 0x6f, 0x74, 0xd8, 0x21, 0x2f, 0x9f, 0x24, 0xac, + 0x43, 0xdb, 0x3a, 0x39, 0x6c, 0x34, 0x59, 0x62, 0x66, 0xbc, 0x28, 0x7f, + 0x8c, 0x64, 0x62, 0x8c, 0x28, 0x6c, 0xf5, 0x79, 0x24, 0xb1, 0x00, 0x9c, + 0x58, 0x6b, 0x09, 0xef, 0xb0, 0x73, 0xcd, 0x47, 0xbb, 0x52, 0xfd, 0x26, + 0x6a, 0xff, 0xb9, 0xf1, 0xd5, 0x82, 0x59, 0x01, 0xfa, 0x87, 0x14, 0x24, + 0x10, 0xb0, 0xf7, 0xdf, 0xf9, 0x3f, 0x67, 0x19, 0xbd, 0xc7, 0x85, 0xb0, + 0xad, 0x47, 0xa8, 0x4c, 0x3e, 0xb6, 0x2e, 0x8a, 0xb3, 0xcc, 0x35, 0xa0, + 0x48, 0xc7, 0x90, 0x81, 0xb7, 0x53, 0x1c, 0x38, 0x63, 0xf2, 0x2f, 0xa0, + 0x71, 0x82, 0xe2, 0x56, 0xdb, 0x68, 0xe8, 0x5f, 0xf8, 0x42, 0xf2, 0xf6, + 0xb8, 0x10, 0x6b, 0x54, 0x21, 0xa0, 0xc1, 0xfe, 0xcb, 0xce, 0x12, 0xa2, + 0x49, 0x51, 0x86, 0x53, 0x56, 0xec, 0x33, 0xb3, 0x72, 0xce, 0xa4, 0x46, + 0xe3, 0x37, 0xcb, 0xc0, 0x95, 0xaa, 0xe2, 0xa3, 0xc5, 0xe9, 0x36, 0x40, + 0xfe, 0xf7, 0xe2, 0x5a, 0x6d, 0x58, 0x39, 0xb2, 0x41, 0x5d, 0xe2, 0x71, + 0x72, 0xd0, 0xf0, 0x5c, 0x16, 0x88, 0x95, 0x30, 0x0a, 0xfb, 0x8d, 0xda, + 0x14, 0x80, 0xf4, 0x15, 0xf2, 0xf6, 0xac, 0xf3, 0xd8, 0x8d, 0x13, 0x24, + 0x2c, 0x74, 0x60, 0x6e, 0x8c, 0xa1, 0x59, 0xcf, 0x74, 0x7c, 0x2d, 0x0b, + 0xbb, 0x06, 0x5c, 0x9d, 0xcd, 0xf3, 0x1e, 0x4a, 0xba, 0x3f, 0x9c, 0x4a, + 0xc4, 0xd7, 0xf9, 0xf0, 0xa5, 0x56, 0x7f, 0xb0, 0xa2, 0x57, 0xd0, 0xc3, + 0xaa, 0xa7, 0xd0, 0x49, 0xe2, 0x28, 0x9b, 0xc4, 0x64, 0x0c, 0xe0, 0x71, + 0x9c, 0x05, 0x04, 0x95, 0x00, 0x1f, 0x7b, 0xa9, 0xb9, 0xb3, 0x2b, 0x8f, + 0x0b, 0x45, 0x1e, 0x23, 0xaa, 0x27, 0x89, 0x4a, 0xb0, 0x7d, 0x03, 0xdf, + 0xae, 0xdb, 0xcb, 0xc4, 0xec, 0x3b, 0x02, 0xe2, 0x85, 0x3a, 0xb7, 0x25, + 0xfb, 0xab, 0xca, 0xc1, 0x33, 0x00, 0x5b, 0xd2, 0xcf, 0xb0, 0x11, 0x1d, + 0x51, 0xb5, 0x5b, 0xea, 0x94, 0xf7, 0xa0, 0x98, 0x33, 0xba, 0x58, 0xfc, + 0x12, 0xea, 0xdd, 0x89, 0xbd, 0x63, 0x03, 0xbe, 0x7e, 0x3b, 0x69, 0xc4, + 0x9d, 0x57, 0x0f, 0xd6, 0xbe, 0xea, 0x5b, 0xd0, 0x97, 0x63, 0x89, 0xb0, + 0xa0, 0xc0, 0xd6, 0x39, 0xc1, 0x69, 0x12, 0x6a, 0xfb, 0xac, 0x74, 0x7f, + 0xfb, 0xf4, 0x7f, 0x38, 0x44, 0x4c, 0x8a, 0xa2, 0x41, 0x15, 0xc0, 0x54, + 0xc0, 0xed, 0x14, 0x83, 0xef, 0xbc, 0x9c, 0xc7, 0xdd, 0x21, 0xd6, 0xf0, + 0x9b, 0x7f, 0x09, 0xd5, 0x96, 0xe5, 0xf7, 0xc5, 0xa9, 0xb3, 0x41, 0xb0, + 0x9d, 0xeb, 0x49, 0x68, 0x9d, 0x2b, 0xea, 0x47, 0x80, 0x3b, 0x54, 0xb8, + 0xf4, 0x14, 0x5e, 0xd6, 0x66, 0x89, 0x04, 0xb3, 0x00, 0xa3, 0xa8, 0x32, + 0x62, 0x2e, 0xc3, 0x15, 0xc6, 0x93, 0x7d, 0x40, 0x32, 0xb1, 0x6b, 0x60, + 0xd3, 0x52, 0xdf, 0x09, 0x8c, 0x80, 0x2b, 0x01, 0xe7, 0x97, 0x8d, 0xbb, + 0x14, 0xd6, 0x10, 0x15, 0x64, 0x00, 0x4a, 0x2c, 0x67, 0xca, 0xd0, 0xa1, + 0x37, 0x33, 0x7b, 0xa1, 0x2a, 0x5b, 0x5b, 0x78, 0xf8, 0x2f, 0xdd, 0x76, + 0xab, 0x8a, 0xc3, 0xe3, 0x37, 0x00, 0xd1, 0x29, 0xb0, 0x96, 0x1d, 0x18, + 0xbe, 0x5d, 0x32, 0x7e, 0xb7, 0x11, 0xa9, 0x78, 0x72, 0xa2, 0x2d, 0x29, + 0x1c, 0x32, 0xa4, 0xff, 0xc7, 0xce, 0xfe, 0xaf, 0xb7, 0x17, 0x43, 0xe5, + 0x2f, 0xae, 0x45, 0xd3, 0xaf, 0x10, 0xe3, 0xd0, 0x58, 0xb6, 0xee, 0xee, + 0x7a, 0xb5, 0x06, 0x70, 0x26, 0x7e, 0x2d, 0x5b, 0xd5, 0xe1, 0x7b, 0x9a, + 0x37, 0x02, 0xfc, 0x1d, 0x08, 0x4f, 0x1a, 0xf5, 0x44, 0x63, 0xde, 0x4b, + 0x14, 0x68, 0x54, 0x0b, 0x6a, 0x22, 0x4e, 0x02, 0x65, 0xcd, 0xf4, 0x04, + 0xec, 0xcc, 0x8a, 0x0b, 0xe0, 0x59, 0xf8, 0x65, 0x25, 0x63, 0xed, 0x0f, + 0xa6, 0xc5, 0x3c, 0xcb, 0x5d, 0xc5, 0xd8, 0x9f, 0x5a, 0xd3, 0x88, 0x3d, + 0xd4, 0x2c, 0xb3, 0x04, 0xf6, 0x97, 0xc7, 0xe2, 0xfd, 0xb6, 0xf4, 0x7d, + 0x0d, 0xb9, 0x75, 0x7e, 0x9d, 0x81, 0xdc, 0xdf, 0x8e, 0x90, 0x40, 0x0c, + 0x7b, 0x45, 0xfe, 0x68, 0xfd, 0xff, 0x1c, 0xf1, 0x16, 0x09, 0x33, 0x74, + 0x27, 0x7b, 0x4d, 0xd9, 0x9b, 0x48, 0x6d, 0x84, 0xeb, 0x96, 0x8f, 0x4b, + 0x82, 0x73, 0xd5, 0x69, 0x7d, 0x14, 0x45, 0x8c, 0xb8, 0x71, 0x87, 0x70, + 0x09, 0x26, 0xfc, 0x89, 0x6f, 0x0f, 0xb6, 0xc1, 0xd6, 0xe1, 0xbf, 0xdb, + 0x85, 0x8f, 0x94, 0xad, 0x94, 0x01, 0x01, 0xbb, 0x3f, 0xc0, 0xb5, 0xff, + 0xf5, 0xbb, 0x4f, 0x50, 0x09, 0xca, 0x7d, 0x36, 0x47, 0x66, 0x9a, 0x8c, + 0xee, 0x84, 0x73, 0x9a, 0x1f, 0x49, 0x75, 0xb4, 0xab, 0x66, 0xf7, 0x3b, + 0xfe, 0x81, 0x67, 0xc9, 0xd1, 0x16, 0xde, 0x1f, 0xc2, 0x24, 0xed, 0x6a, + 0x00, 0x00, 0x00, 0x00, 0x3a, 0xe7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x00, 0xc5, 0xd7, 0x14, 0x84, 0xf8, 0xcf, 0x9b, 0xf4, + 0xb7, 0x6f, 0x47, 0x90, 0x47, 0x30, 0x80, 0x4b, 0x9e, 0x32, 0x25, 0xa9, + 0xf1, 0x33, 0xb5, 0xde, 0xa1, 0x68, 0xf4, 0xe2, 0x85, 0x1f, 0x07, 0x2f, + 0xcc, 0x00, 0xfc, 0xaa, 0x7c, 0xa6, 0x20, 0x61, 0x71, 0x7a, 0x48, 0xe5, + 0x2e, 0x29, 0xa3, 0xfa, 0x37, 0x9a, 0x95, 0x3f, 0xaa, 0x68, 0x93, 0xe3, + 0x2e, 0xc5, 0xa2, 0x7b, 0x94, 0x5e, 0x60, 0x5f, 0x10, 0x85, 0xf3, 0x23, + 0x2d, 0x42, 0x4c, 0x13, 0x29, 0xc8, 0x8d, 0x78, 0x6e, 0xd6, 0x8c, 0xe6, + 0xfc, 0xb6, 0x2a, 0xa6, 0x3b, 0xf9, 0xab, 0x61, 0x7c, 0x08, 0x8a, 0x3b, + 0x70, 0xbe, 0x57, 0xaa, 0xda, 0x1f, 0x33, 0x4a, 0x70, 0x17, 0x25, 0x0d, + 0x3f, 0x60, 0x3d, 0xc8, 0x2e, 0xbd, 0x3b, 0x12, 0x0b, 0x63, 0x5e, 0x3f, + 0xf5, 0x6b, 0x1f, 0x0b, 0xd9, 0x33, 0x85, 0x23, 0x71, 0x24, 0x9a, 0xb3, + 0xdf, 0x5c, 0x1f, 0xef, 0x14, 0x33, 0xc8, 0x66, 0x85, 0xb7, 0xf0, 0x56, + 0x68, 0x1d, 0x51, 0x52, 0xaf, 0x80, 0x3c, 0xe2, 0x59, 0x06, 0xf1, 0xd1, + 0x9f, 0xb6, 0xc6, 0x80, 0x4e, 0x06, 0xea, 0x28, 0xab, 0x17, 0x8f, 0x45, + 0x7a, 0xf6, 0xb4, 0x93, 0xb7, 0x43, 0x9e, 0xc6, 0xd4, 0x29, 0x00, 0x62, + 0xab, 0x51, 0x7a, 0x72, 0xe5, 0xc1, 0xd4, 0x10, 0xcd, 0xd6, 0x17, 0x54, + 0xe4, 0x20, 0x84, 0x50, 0xe4, 0xf9, 0x00, 0x13, 0xfd, 0xa6, 0x9f, 0xef, + 0x19, 0xd4, 0x60, 0x2a, 0x42, 0x07, 0xcd, 0xd5, 0xa1, 0x01, 0x6d, 0x07, + 0x01, 0x32, 0x61, 0x3c, 0x65, 0x9a, 0x8f, 0x5d, 0x33, 0xf3, 0xcb, 0x29, + 0x0b, 0x8c, 0xe7, 0x3b, 0x83, 0x44, 0xb1, 0x3a, 0x4f, 0x8e, 0x09, 0x15, + 0x14, 0x69, 0x84, 0xa1, 0xbb, 0x15, 0xfd, 0xea, 0xde, 0xbe, 0x5b, 0x6a, + 0xc0, 0x95, 0x04, 0x46, 0x4d, 0x8a, 0xaa, 0xac, 0xbc, 0x2f, 0xad, 0x12, + 0x15, 0x8a, 0x53, 0x4c, 0x94, 0xb8, 0xca, 0x42, 0x96, 0x3a, 0xf4, 0x7a, + 0x18, 0x9d, 0x5b, 0x24, 0x9a, 0xce, 0xa8, 0x99, 0xd4, 0x37, 0x32, 0xf6, + 0xf2, 0xac, 0xaf, 0x3f, 0xf5, 0x3b, 0xfe, 0xda, 0x13, 0x9a, 0xab, 0x4f, + 0x55, 0xc0, 0x2c, 0x21, 0x2b, 0x65, 0x71, 0x1f, 0xc5, 0x04, 0x32, 0xc9, + 0x94, 0xe5, 0xfa, 0x6f, 0xd8, 0x2a, 0xbc, 0x70, 0x85, 0x55, 0xdc, 0x62, + 0xb7, 0x3a, 0x20, 0x0e, 0xe7, 0x67, 0x3c, 0xfe, 0xcb, 0x83, 0x6a, 0x15, + 0x6e, 0x4a, 0x35, 0x65, 0xea, 0xc1, 0xb9, 0x4d, 0x35, 0xf9, 0x4b, 0xcf, + 0xd8, 0xfd, 0xa5, 0xff, 0xff, 0x67, 0x70, 0x04, 0xae, 0xa2, 0xa4, 0x12, + 0x4b, 0x83, 0x4f, 0xc2, 0x96, 0xf0, 0x21, 0x2b, 0x14, 0x21, 0x73, 0x42, + 0x14, 0x99, 0x07, 0xe5, 0xa9, 0x52, 0x4c, 0xeb, 0xbe, 0xc3, 0x11, 0x2e, + 0x27, 0xda, 0x69, 0x94, 0xd5, 0xf6, 0xc6, 0x77, 0x0a, 0x00, 0x5d, 0x9a, + 0x82, 0xaa, 0x21, 0xfc, 0x86, 0x9b, 0xd0, 0xc4, 0xc4, 0x1f, 0x53, 0x41, + 0x7a, 0x92, 0xab, 0x1c, 0x12, 0xf6, 0xd5, 0x48, 0xfb, 0x29, 0x4d, 0xb4, + 0xd2, 0x12, 0xee, 0xc5, 0xea, 0x18, 0x33, 0xf1, 0x4d, 0x0a, 0x10, 0x43, + 0xa5, 0x35, 0xb1, 0x63, 0xc4, 0xfb, 0x38, 0x1e, 0xef, 0xac, 0x3f, 0x97, + 0x41, 0xc6, 0x96, 0x3e, 0x60, 0x13, 0xc8, 0xe3, 0xbe, 0x61, 0xe9, 0xb6, + 0x26, 0x16, 0x14, 0xf8, 0x82, 0x0d, 0x6e, 0x75, 0x2f, 0xd7, 0x9c, 0x3a, + 0x4a, 0xda, 0xd8, 0x2b, 0x35, 0xd4, 0x20, 0x32, 0xd4, 0x4f, 0x0f, 0xe4, + 0xdc, 0xd5, 0x0f, 0xfe, 0xa6, 0x81, 0x28, 0xb4, 0x24, 0x3e, 0xb7, 0x0f, + 0xb0, 0xb2, 0x5b, 0x05, 0x76, 0xbb, 0x24, 0x49, 0x6a, 0x01, 0x68, 0x3f, + 0x03, 0x96, 0xbc, 0x0c, 0x77, 0x48, 0x5f, 0xe8, 0x39, 0xf4, 0xb0, 0x84, + 0x42, 0x0e, 0x6a, 0xb9, 0xab, 0xf2, 0x95, 0x97, 0xa7, 0x5e, 0x29, 0x34, + 0x9d, 0x50, 0xc0, 0x4b, 0x40, 0x72, 0xa1, 0x7c, 0x79, 0x5e, 0x95, 0xbe, + 0xd6, 0x17, 0x43, 0x0a, 0xc9, 0x27, 0x25, 0x43, 0xd7, 0x99, 0xd5, 0x48, + 0xd8, 0x98, 0xb5, 0x2b, 0x7f, 0xe3, 0xbd, 0x1d, 0xc0, 0xd1, 0x04, 0xd5, + 0xa4, 0xe1, 0x68, 0xbe, 0x96, 0xf1, 0x2e, 0x5e, 0x37, 0x8d, 0x39, 0x4e, + 0xe4, 0xcc, 0x5e, 0xd7, 0xdd, 0x59, 0x7e, 0xe8, 0xae, 0x48, 0xb5, 0xec, + 0x2c, 0xf7, 0x68, 0x96, 0x00, 0xe5, 0xec, 0x03, 0x6f, 0x98, 0x3a, 0x9a, + 0x4f, 0xd9, 0xf1, 0x2f, 0xfe, 0x76, 0xcf, 0x8f, 0x0b, 0x3d, 0x8a, 0x14, + 0x00, 0x83, 0xcb, 0xca, 0xe3, 0x34, 0x81, 0xb5, 0x91, 0x64, 0x2b, 0x12, + 0x24, 0x86, 0x9c, 0xae, 0x3c, 0x7f, 0x53, 0x22, 0xd4, 0x94, 0x90, 0x44, + 0x6b, 0x35, 0xd2, 0xce, 0x8e, 0x95, 0xe2, 0xbe, 0x46, 0x50, 0x3f, 0x3d, + 0xc3, 0xcd, 0xef, 0x47, 0x99, 0xb5, 0xf2, 0xd4, 0x6f, 0xf4, 0xfa, 0xa2, + 0xfc, 0x1e, 0xe3, 0x99, 0x49, 0xfd, 0x1a, 0x6e, 0x0d, 0xb5, 0xf1, 0xc8, + 0x05, 0x22, 0x29, 0xca, 0x03, 0xb8, 0x15, 0x3b, 0x01, 0x8a, 0x95, 0x74, + 0x48, 0x93, 0x61, 0x35, 0xde, 0xeb, 0xa9, 0xc4, 0x56, 0xa9, 0xd7, 0xde, + 0x4b, 0xe5, 0x4b, 0xa1, 0x42, 0x6a, 0x5f, 0xe3, 0xb2, 0xc7, 0xda, 0xfb, + 0xc7, 0x70, 0x64, 0xe0, 0x68, 0x19, 0xc6, 0x11, 0x77, 0x2b, 0x5f, 0xba, + 0x1d, 0x58, 0x77, 0x98, 0x2c, 0x91, 0xb4, 0xd2, 0xea, 0x1b, 0xdc, 0xe8, + 0xfa, 0x82, 0xf3, 0x6e, 0xac, 0x88, 0x15, 0x16, 0x1a, 0x53, 0xb3, 0x01, + 0x94, 0x03, 0x47, 0x20, 0xdb, 0x71, 0xcb, 0x71, 0xe8, 0x62, 0xad, 0x34, + 0x2b, 0xa3, 0xa5, 0xe9, 0xa6, 0x82, 0x0e, 0x16, 0x61, 0xbc, 0x29, 0x6b, + 0xb1, 0x60, 0x67, 0x80, 0x9a, 0x9f, 0xc4, 0x82, 0xf6, 0xb0, 0x7a, 0x16, + 0x9c, 0x25, 0x04, 0xeb, 0xfd, 0xe0, 0x18, 0xd3, 0xfc, 0xeb, 0xe1, 0x3c, + 0x2b, 0x29, 0x7b, 0x32, 0x4e, 0xd3, 0x6d, 0xe1, 0x27, 0xda, 0xc9, 0x14, + 0x5c, 0x7f, 0xfa, 0x70, 0x41, 0x8e, 0xb4, 0xa3, 0xde, 0x36, 0x92, 0x67, + 0x97, 0xe2, 0xec, 0x85, 0x8b, 0x76, 0x08, 0x3c, 0x32, 0x58, 0xd4, 0x7f, + 0x6f, 0x91, 0x03, 0xdb, 0x19, 0x3e, 0xc4, 0x8b, 0x3c, 0xb7, 0x75, 0x90, + 0x71, 0x7a, 0x21, 0x9d, 0xa7, 0x77, 0xbf, 0xf5, 0x92, 0x57, 0x46, 0x07, + 0xa7, 0xbb, 0x0c, 0x42, 0xca, 0x4f, 0x5a, 0x27, 0x45, 0x69, 0xfe, 0x6d, + 0x78, 0x43, 0x77, 0xc4, 0xb4, 0x43, 0xff, 0x37, 0x0d, 0xb7, 0xfa, 0xe9, + 0x9e, 0x06, 0x70, 0x53, 0xfd, 0xf6, 0xa0, 0x28, 0x84, 0x46, 0xcd, 0x61, + 0xa2, 0x95, 0xc4, 0x1e, 0x6a, 0x13, 0xa1, 0x7f, 0xaf, 0xe1, 0x73, 0x85, + 0xb0, 0x53, 0x9c, 0x08, 0xb6, 0x1d, 0x4d, 0xb4, 0x0b, 0xfb, 0x1f, 0x0c, + 0x7b, 0x17, 0x06, 0x73, 0xa7, 0x22, 0x1f, 0xb0, 0xd8, 0x45, 0x6e, 0xe5, + 0xde, 0x48, 0xb7, 0x9f, 0x5a, 0xa8, 0xd1, 0xc3, 0x04, 0xd1, 0x87, 0xec, + 0x15, 0x3e, 0xd1, 0xc7, 0x57, 0x01, 0x46, 0x4b, 0x28, 0xa8, 0x79, 0x5a, + 0x7e, 0x0b, 0x56, 0x56, 0x28, 0xda, 0x35, 0xea, 0x4c, 0x14, 0x81, 0xae, + 0xc0, 0x0d, 0x12, 0xfe, 0x2d, 0xb7, 0x95, 0x4d, 0xea, 0x78, 0xb6, 0x53, + 0xcf, 0xac, 0x8a, 0xfc, 0xc9, 0x07, 0x9f, 0x93, 0xf0, 0x11, 0x86, 0x13, + 0xe9, 0xca, 0x3d, 0xce, 0xb1, 0xfd, 0x1a, 0x0a, 0x8b, 0x11, 0x82, 0x94, + 0x6a, 0xae, 0xc5, 0x80, 0x6a, 0x3b, 0xa8, 0x7c, 0xb4, 0x53, 0x4e, 0xa9, + 0x04, 0x1a, 0x4f, 0xb0, 0xb9, 0x95, 0x96, 0xa5, 0xfd, 0xce, 0xdc, 0x57, + 0x00, 0x48, 0x16, 0xe2, 0x40, 0xae, 0x04, 0xf5, 0x83, 0x60, 0x23, 0xd9, + 0x8e, 0x59, 0x56, 0x20, 0x50, 0x38, 0xc4, 0xde, 0x88, 0x9f, 0x91, 0x06, + 0xdb, 0x8f, 0x84, 0xa2, 0xaf, 0x61, 0xdd, 0x48, 0x03, 0x4f, 0xc4, 0xb8, + 0xed, 0x12, 0xd2, 0x74, 0x08, 0xb9, 0x51, 0x63, 0xb5, 0xfe, 0x09, 0x7f, + 0x7b, 0x8c, 0x5e, 0xd7, 0x27, 0xe5, 0x79, 0xe6, 0x33, 0x60, 0x54, 0xe1, + 0x21, 0xda, 0xca, 0x8b, 0x81, 0xdf, 0xb6, 0xa7, 0x2e, 0x9d, 0x0f, 0xfc, + 0x05, 0x80, 0x67, 0xcb, 0xc5, 0xdf, 0xc7, 0x13, 0xee, 0xb5, 0x40, 0x8e, + 0xa7, 0x0c, 0xcb, 0xf2, 0x45, 0x15, 0x29, 0xb1, 0xb8, 0x02, 0x23, 0x61, + 0x38, 0xf1, 0x16, 0xa1, 0x0c, 0xa1, 0xc9, 0x40, 0x8c, 0xd0, 0x48, 0x4b, + 0xce, 0x9c, 0x1e, 0x53, 0x40, 0x44, 0xf6, 0x17, 0x16, 0xc6, 0x5c, 0xb0, + 0x2a, 0x29, 0x59, 0x87, 0x67, 0x85, 0xa7, 0x81, 0x84, 0xe9, 0x4f, 0xe5, + 0x4e, 0x13, 0x5a, 0x11, 0xa1, 0x24, 0x62, 0xe9, 0x7a, 0xea, 0x51, 0xaa, + 0x45, 0xf3, 0x1d, 0x2a, 0xaf, 0x01, 0x28, 0x35, 0xda, 0xb4, 0xe7, 0xab, + 0xc1, 0xb9, 0x3c, 0x45, 0xa2, 0x0b, 0x5d, 0x40, 0x09, 0xac, 0x62, 0x16, + 0xd3, 0x1f, 0x9f, 0xc7, 0x1a, 0x56, 0xb7, 0x27, 0xd1, 0x1b, 0xe1, 0xb5, + 0x82, 0x9e, 0xe8, 0xd3, 0x5c, 0x0f, 0xe8, 0x87, 0x61, 0xc6, 0x20, 0xb7, + 0x31, 0x3f, 0x0d, 0xb3, 0x0a, 0x5a, 0xce, 0x06, 0xa5, 0xe9, 0xfd, 0xf3, + 0x29, 0x1a, 0xcd, 0x86, 0x0e, 0x31, 0x29, 0xaa, 0xb7, 0x32, 0xf1, 0x10, + 0x4e, 0x92, 0x12, 0x00, 0xc0, 0xac, 0x50, 0x4b, 0x52, 0x59, 0x51, 0x7c, + 0xa8, 0x0c, 0xf7, 0xcb, 0x16, 0x73, 0x7b, 0x90, 0xa8, 0x57, 0x79, 0xb4, + 0x73, 0x53, 0xd7, 0xed, 0xba, 0x46, 0xc5, 0x06, 0x53, 0x02, 0xc7, 0x58, + 0x4c, 0x09, 0x0c, 0xa5, 0x01, 0x13, 0x18, 0x39, 0x4b, 0x4e, 0xc2, 0x0d, + 0xd6, 0xdf, 0xaa, 0x7e, 0x46, 0xba, 0x6e, 0xcc, 0x25, 0x42, 0xd0, 0xb3, + 0x31, 0xdc, 0xdf, 0x7d, 0xf1, 0xc3, 0x73, 0xca, 0x7a, 0xf6, 0xcb, 0x23, + 0x81, 0x8d, 0xbe, 0x0b, 0xf2, 0x79, 0x8d, 0x14, 0xa4, 0xc8, 0x36, 0x18, + 0x49, 0xc8, 0x0d, 0xd7, 0xc9, 0xdd, 0x35, 0xeb, 0xec, 0x52, 0x56, 0xae, + 0xf2, 0xd2, 0x51, 0x91, 0x39, 0xbc, 0xb0, 0x49, 0xb7, 0xf2, 0x1b, 0x64, + 0x83, 0x5a, 0xa6, 0x97, 0xc2, 0x15, 0x95, 0xdc, 0x11, 0xd2, 0x89, 0xc0, + 0x6a, 0xb1, 0x44, 0x43, 0x38, 0xb6, 0x54, 0x0f, 0xdc, 0xcb, 0xed, 0x26, + 0x27, 0xd9, 0x46, 0x56, 0x4e, 0x6a, 0x54, 0x74, 0x0f, 0x45, 0xfc, 0xb6, + 0x93, 0xab, 0x3c, 0xd1, 0x86, 0x51, 0xaf, 0xa9, 0x4a, 0xc0, 0x9c, 0x78, + 0xc1, 0xb1, 0xc7, 0xf1, 0x9c, 0xd1, 0xd0, 0x32, 0x4e, 0x4b, 0x02, 0x36, + 0x68, 0x38, 0x88, 0x56, 0xc0, 0x2b, 0x12, 0x05, 0x3b, 0xb9, 0xf6, 0xa2, + 0x37, 0xe7, 0xbc, 0x81, 0xf9, 0x75, 0x51, 0x27, 0x56, 0x0d, 0x55, 0xd1, + 0x6a, 0xe0, 0xcf, 0x87, 0x0a, 0x44, 0xc6, 0x57, 0xe1, 0x1b, 0xc0, 0x2c, + 0xcf, 0xab, 0x77, 0xe9, 0x14, 0xf5, 0x34, 0x89, 0xfb, 0xc9, 0xf2, 0x87, + 0x5c, 0x75, 0xba, 0x51, 0x9a, 0x49, 0xe9, 0x23, 0x23, 0xf4, 0xc9, 0xd1, + 0x2f, 0x87, 0xf6, 0x75, 0x38, 0x97, 0x48, 0xb8, 0x30, 0x46, 0x1d, 0x46, + 0x65, 0x03, 0x10, 0xcf, 0xfb, 0x36, 0xf2, 0xb1, 0xaf, 0x31, 0x02, 0x7b, + 0x74, 0xfe, 0x9f, 0x8c, 0x73, 0x04, 0xfd, 0xb5, 0xae, 0x2e, 0x27, 0x9c, + 0xd8, 0x73, 0xbc, 0xc3, 0x4a, 0x76, 0x93, 0x66, 0xf6, 0xb7, 0x90, 0xc4, + 0x42, 0x3d, 0xcd, 0xb5, 0xf1, 0x75, 0xbf, 0xb7, 0xdd, 0x8e, 0xb7, 0xcd, + 0x90, 0x35, 0xf5, 0x95, 0x3d, 0xe4, 0x4e, 0xb0, 0x7c, 0x5f, 0xad, 0xff, + 0x75, 0x38, 0xc4, 0xc7, 0xed, 0xec, 0x70, 0xcc, 0x9f, 0xf9, 0x77, 0xa1, + 0x00, 0x2f, 0xf1, 0xa2, 0xc9, 0x74, 0xdc, 0x18, 0x14, 0xd0, 0x2f, 0x86, + 0x66, 0xa7, 0x5b, 0x39, 0x5c, 0xba, 0x0e, 0x77, 0x16, 0x04, 0xc3, 0x02, + 0x42, 0x3b, 0x66, 0x29, 0xee, 0x65, 0x00, 0xd4, 0x22, 0x5a, 0x77, 0x74, + 0xd4, 0xc3, 0xf3, 0x00, 0xdf, 0x6b, 0xc3, 0x15, 0x89, 0x0e, 0xb1, 0xbc, + 0xac, 0xe8, 0x44, 0x2f, 0x80, 0x34, 0x34, 0x8b, 0x0c, 0x48, 0x45, 0xc2, + 0x6a, 0xa3, 0x67, 0xd7, 0x3d, 0x36, 0xf3, 0x3f, 0xe5, 0xf0, 0x5b, 0xe8, + 0xad, 0x41, 0xd5, 0x82, 0xc1, 0x28, 0xab, 0x77, 0xe8, 0x7f, 0xb3, 0xf6, + 0xd2, 0x0c, 0xe4, 0x03, 0xcf, 0xe4, 0x72, 0xdb, 0x7b, 0x81, 0xf4, 0xf3, + 0x48, 0x74, 0xe1, 0x91, 0xb8, 0xf8, 0x4c, 0x2c, 0x60, 0x99, 0x3e, 0x1e, + 0x4f, 0xaf, 0x12, 0xab, 0x52, 0xef, 0xc7, 0x60, 0xd2, 0xfe, 0x62, 0x55, + 0xc8, 0x18, 0xad, 0x60, 0xa7, 0x5d, 0xde, 0x4d, 0xfc, 0x6d, 0xe1, 0x10, + 0x7c, 0xf9, 0xa2, 0x64, 0x00, 0x16, 0x1f, 0x44, 0x7c, 0xe2, 0x72, 0x37, + 0xd9, 0x92, 0xad, 0xfc, 0x62, 0x53, 0xbe, 0xb6, 0xe0, 0xc8, 0xe0, 0xa2, + 0xef, 0x22, 0x4b, 0x70, 0x3a, 0x4f, 0xc9, 0xed, 0x6b, 0xbc, 0x17, 0x0a, + 0xcf, 0x6a, 0x2c, 0xd3, 0xd2, 0x6b, 0x02, 0x45, 0xfa, 0x9e, 0xc2, 0x21, + 0x28, 0xfc, 0x07, 0x68, 0xd6, 0xb8, 0x9f, 0x2a, 0x0b, 0x7a, 0x0e, 0xbc, + 0x4e, 0xee, 0x84, 0x38, 0xe4, 0x8e, 0x70, 0xc3, 0xc4, 0xad, 0x74, 0x87, + 0x2d, 0x16, 0x4f, 0xa1, 0xf8, 0x20, 0xf5, 0xde, 0xa3, 0xc5, 0x0c, 0x3b, + 0xde, 0x44, 0x48, 0x0f, 0x3c, 0xdc, 0x7e, 0x10, 0x8b, 0x87, 0xc4, 0x3b, + 0xb0, 0x95, 0xbf, 0x61, 0x1e, 0xad, 0x07, 0x52, 0xfd, 0x0b, 0x84, 0xa9, + 0x46, 0xb0, 0x32, 0xd5, 0x22, 0x80, 0x35, 0x26, 0x41, 0xf8, 0x11, 0x72, + 0xb1, 0x31, 0x6f, 0x5a, 0x75, 0xcc, 0x67, 0xe0, 0xb2, 0x50, 0x89, 0xb2, + 0x66, 0x6e, 0xee, 0xa0, 0x41, 0x8d, 0x00, 0x2a, 0xa7, 0x9d, 0xa5, 0x11, + 0x2b, 0x07, 0x95, 0x3a, 0x55, 0x8c, 0x67, 0xb1, 0xe5, 0x2d, 0xd4, 0xd1, + 0x3e, 0x29, 0xed, 0xa5, 0x59, 0x97, 0x7b, 0xdf, 0x92, 0x10, 0x0b, 0x04, + 0x89, 0x27, 0xa0, 0xa2, 0x93, 0x18, 0x7f, 0x47, 0x84, 0x1c, 0xc6, 0xd6, + 0x8f, 0x73, 0x81, 0xa0, 0xfa, 0xe5, 0x3e, 0xd8, 0xbf, 0x56, 0x1a, 0x76, + 0xf4, 0xc4, 0x0f, 0x7a, 0x29, 0x9d, 0x32, 0x5d, 0x41, 0xe0, 0x07, 0xb9, + 0xd3, 0x3f, 0x7e, 0xff, 0x90, 0x89, 0xce, 0xdc, 0xf1, 0x1d, 0x54, 0xb6, + 0x67, 0x7f, 0x4d, 0x71, 0x9a, 0x4a, 0x5f, 0x80, 0x0d, 0x5c, 0x77, 0xd5, + 0x50, 0x7c, 0x41, 0x56, 0x7e, 0x99, 0x0a, 0xeb, 0x66, 0x1f, 0xd2, 0x55, + 0xc3, 0xc6, 0x6c, 0xc5, 0xfc, 0x34, 0x40, 0x2c, 0x05, 0x29, 0x05, 0x7c, + 0xca, 0xe6, 0x8d, 0xd3, 0xb0, 0xca, 0x84, 0x27, 0x50, 0x7c, 0x6b, 0x17, + 0x1b, 0x22, 0xe4, 0x7f, 0xe6, 0x44, 0x94, 0x06, 0x4b, 0xb3, 0xb7, 0xbb, + 0x98, 0x81, 0x44, 0x0b, 0xf5, 0x66, 0xcb, 0xad, 0xf2, 0x9a, 0xe1, 0x47, + 0xf3, 0x97, 0xa9, 0xb2, 0xc2, 0xca, 0xcd, 0x98, 0x78, 0x60, 0xdc, 0x6e, + 0x87, 0x55, 0x47, 0xf3, 0xae, 0x84, 0xdd, 0x9a, 0xe9, 0x1a, 0x63, 0x83, + 0xea, 0x23, 0x09, 0x67, 0x34, 0x83, 0x00, 0x6e, 0x5e, 0x58, 0xb8, 0x89, + 0x04, 0x08, 0x0a, 0x55, 0x9e, 0x78, 0xc9, 0xff, 0xb9, 0xb5, 0x2c, 0xdd, + 0x3b, 0x0c, 0x58, 0x07, 0x8b, 0xb4, 0x6a, 0xc4, 0x64, 0xa3, 0x5e, 0x5b, + 0xfe, 0x4d, 0xd0, 0x74, 0x01, 0x1b, 0xdf, 0x10, 0x45, 0x2b, 0xd6, 0x9e, + 0xa9, 0x60, 0x1f, 0xad, 0x46, 0xa1, 0x8c, 0xf8, 0xf6, 0xa9, 0x8a, 0x27, + 0xea, 0x51, 0x37, 0x84, 0xcf, 0xe5, 0xd7, 0x51, 0xd6, 0x40, 0x39, 0x39, + 0x5f, 0xf6, 0x96, 0x33, 0xd9, 0x86, 0x8d, 0x38, 0xb6, 0x26, 0x04, 0x14, + 0x07, 0x46, 0x3e, 0xd0, 0xc5, 0xf6, 0x0d, 0xa0, 0x47, 0x2b, 0xc8, 0x73, + 0x18, 0x6b, 0xd3, 0x0e, 0x18, 0xcc, 0x43, 0x98, 0xd0, 0xcf, 0x1c, 0xe4, + 0x4a, 0x41, 0x6a, 0x56, 0x2d, 0xf0, 0x93, 0x89, 0x81, 0x6c, 0xce, 0x04, + 0x1a, 0x23, 0x05, 0x91, 0x4f, 0x48, 0x44, 0x3a, 0xaa, 0x03, 0xa5, 0x4a, + 0xa9, 0x20, 0x2c, 0xbe, 0x6a, 0x81, 0xe6, 0xa9, 0xf8, 0xf0, 0x2b, 0x29, + 0xa1, 0xe0, 0xc4, 0xce, 0xf5, 0xda, 0x25, 0x70, 0x49, 0xcc, 0xa0, 0x4b, + 0x24, 0x49, 0x4f, 0x11, 0xc4, 0x3b, 0x22, 0x89, 0x9a, 0xb4, 0xf4, 0xcd, + 0xa3, 0xee, 0xb0, 0x76, 0x13, 0xc4, 0xbb, 0xaf, 0x03, 0x7f, 0x27, 0xf3, + 0x38, 0xbc, 0xde, 0x7c, 0x0c, 0x39, 0x14, 0xb7, 0x14, 0xbb, 0x5c, 0xae, + 0x89, 0xf8, 0xf7, 0xd6, 0x00, 0x78, 0xf4, 0xb0, 0x52, 0x16, 0xf5, 0x54, + 0xc5, 0x93, 0xf7, 0x6d, 0x0d, 0xe8, 0x58, 0xe2, 0xa1, 0xa7, 0xdc, 0x49, + 0xdb, 0xc8, 0x79, 0xbc, 0xc3, 0x97, 0x7b, 0x6c, 0x82, 0x7b, 0xbe, 0xe9, + 0x79, 0xac, 0x4a, 0xa4, 0x7c, 0x49, 0x83, 0x58, 0x3a, 0xe4, 0xf5, 0x68, + 0x5c, 0xb7, 0x7f, 0x2d, 0xfe, 0x6b, 0x96, 0xc7, 0x8b, 0x67, 0xb5, 0xd0, + 0xa1, 0x0a, 0x16, 0x62, 0x64, 0x53, 0xea, 0x29, 0x80, 0x93, 0xf9, 0xd6, + 0xa0, 0xc5, 0x1b, 0x3a, 0x1e, 0xab, 0x51, 0x88, 0xe0, 0x9e, 0xd4, 0xf6, + 0xbf, 0x70, 0x2d, 0x29, 0x2e, 0x08, 0xa9, 0x31, 0x78, 0x0a, 0x15, 0x30, + 0x9f, 0x2e, 0xc8, 0x41, 0x65, 0x8e, 0x97, 0x51, 0x5e, 0x73, 0x46, 0x42, + 0x74, 0x84, 0xfd, 0x9b, 0x4a, 0x8a, 0x68, 0x28, 0x45, 0xd0, 0x5d, 0x65, + 0x08, 0xb3, 0xf5, 0x40, 0x8a, 0x29, 0x8e, 0x70, 0x02, 0x49, 0x6a, 0x01, + 0xd6, 0x41, 0x4a, 0xf8, 0x15, 0xa3, 0x70, 0x59, 0xe9, 0xa2, 0xe2, 0x76, + 0x8c, 0x60, 0x33, 0xb3, 0xfa, 0x8b, 0xb4, 0x90, 0x6f, 0x92, 0xc8, 0x21, + 0x59, 0xc0, 0x3a, 0x30, 0x46, 0xeb, 0x49, 0xd8, 0x85, 0x63, 0x5a, 0x23, + 0x87, 0xe1, 0xa7, 0xc0, 0x1a, 0xb0, 0xc7, 0xc4, 0x40, 0x4d, 0x11, 0x9c, + 0xe3, 0xd4, 0x6b, 0xef, 0x68, 0xc8, 0x2c, 0x31, 0xcd, 0x3e, 0xee, 0x55, + 0x10, 0x67, 0x77, 0x7b, 0x30, 0xc1, 0xd0, 0x23, 0x6c, 0x65, 0x6f, 0xfb, + 0x2e, 0x62, 0x33, 0x42, 0x63, 0xdc, 0xca, 0x86, 0xf1, 0x0e, 0xb3, 0xb0, + 0x69, 0x11, 0x65, 0xe1, 0x6e, 0x6c, 0x03, 0x49, 0x79, 0xe8, 0xf1, 0x2e, + 0x8d, 0x94, 0xc8, 0xa8, 0x98, 0x2d, 0x3f, 0xfe, 0xbd, 0x2d, 0x75, 0x45, + 0xd1, 0x7a, 0x09, 0xf8, 0x90, 0x49, 0xbd, 0x4a, 0x3b, 0xa4, 0xa3, 0x26, + 0xb8, 0x62, 0x66, 0x97, 0xd9, 0xc1, 0xca, 0x12, 0x49, 0xe1, 0x27, 0x93, + 0x4f, 0x60, 0xfa, 0xb3, 0x4f, 0x4c, 0xdb, 0x87, 0x6c, 0x3b, 0x50, 0x47, + 0xe2, 0xd8, 0x5b, 0x13, 0x99, 0xf0, 0x2b, 0xbb, 0x32, 0x33, 0xfd, 0x7d, + 0x15, 0x0f, 0x2c, 0xee, 0x85, 0x83, 0xc0, 0x53, 0x79, 0x3e, 0x51, 0xfe, + 0x7c, 0x06, 0x73, 0x49, 0x49, 0x4f, 0x5a, 0x22, 0x36, 0x8f, 0x30, 0x8a, + 0xef, 0x84, 0xd6, 0x15, 0x26, 0x48, 0xe7, 0x1e, 0xb1, 0xaa, 0x82, 0xd0, + 0xc7, 0x0b, 0x97, 0x7b, 0x6c, 0x2d, 0x49, 0x7e, 0x6d, 0xe7, 0xa3, 0x05, + 0x80, 0xd7, 0x42, 0xa9, 0xc6, 0x66, 0x98, 0x30, 0xe3, 0x8a, 0x79, 0x86, + 0x9c, 0x2b, 0xbc, 0x4a, 0xe6, 0x0d, 0xc5, 0xe5, 0x1a, 0x92, 0xd9, 0xef, + 0x63, 0x52, 0x03, 0x88, 0x36, 0xc5, 0x83, 0x65, 0xf8, 0xf1, 0x87, 0xce, + 0x43, 0xfe, 0x89, 0x58, 0x07, 0x6a, 0xad, 0x85, 0x37, 0x0f, 0xdf, 0x9e, + 0xa5, 0x62, 0xa9, 0xd2, 0x41, 0x3f, 0x7f, 0xb7, 0xf1, 0xe2, 0x58, 0xb5, + 0xda, 0xdf, 0xd1, 0xba, 0x36, 0x2c, 0xe7, 0x43, 0x31, 0x07, 0xc5, 0xf5, + 0x79, 0xc9, 0x31, 0xd7, 0x1d, 0x97, 0x57, 0x9a, 0x8e, 0x3f, 0xac, 0x00, + 0x49, 0x00, 0x2f, 0xad, 0xac, 0xe7, 0x65, 0x7c, 0xbf, 0xec, 0x85, 0x57, + 0xe6, 0xcc, 0x07, 0x34, 0x02, 0x36, 0xa8, 0x6a, 0x9f, 0x3a, 0x9a, 0x2f, + 0x34, 0x93, 0x1f, 0x7d, 0x38, 0x54, 0xe3, 0x54, 0x54, 0xee, 0x84, 0x55, + 0xe1, 0x0d, 0xc1, 0x08, 0x3e, 0x33, 0x9e, 0x2a, 0xc3, 0x6a, 0x83, 0xc4, + 0x75, 0xed, 0xbc, 0x5f, 0xd9, 0x04, 0xd7, 0x77, 0x91, 0xb1, 0xa0, 0xf2, + 0xef, 0x81, 0xb0, 0x8b, 0x53, 0x5f, 0x71, 0xec, 0xa5, 0x0b, 0xbe, 0xf2, + 0x92, 0x7e, 0x0a, 0x34, 0xeb, 0x5d, 0x65, 0xc7, 0xa9, 0x44, 0x10, 0xfb, + 0xd3, 0xef, 0xe1, 0xbc, 0x06, 0x65, 0x68, 0x22, 0xfb, 0x43, 0x2c, 0xcf, + 0x8e, 0x6a, 0x28, 0xdb, 0x0b, 0xf4, 0xaf, 0x01, 0x65, 0x97, 0xd6, 0xe5, + 0x91, 0x20, 0x13, 0x2c, 0xb1, 0xc2, 0xd3, 0xc3, 0x76, 0x90, 0xf8, 0xcd, + 0x00, 0xde, 0x93, 0xf8, 0x4e, 0xcc, 0xdc, 0xca, 0x9a, 0xf0, 0xbd, 0x9b, + 0xd6, 0x57, 0xb1, 0x13, 0xd9, 0xe0, 0xe1, 0x9e, 0x21, 0x74, 0xa9, 0x76, + 0xc0, 0x0c, 0xad, 0x4f, 0x5d, 0xfe, 0x23, 0x32, 0x5a, 0x10, 0x75, 0x5b, + 0x05, 0xdf, 0xdc, 0x5b, 0x94, 0xcb, 0xe1, 0x9f, 0x13, 0x51, 0xf5, 0x50, + 0x36, 0x3b, 0xf2, 0x90, 0x9c, 0x9a, 0xc8, 0x10, 0x88, 0xa9, 0xec, 0x22, + 0x1e, 0x96, 0x70, 0xe8, 0x9e, 0x69, 0xc1, 0x22, 0xd9, 0x14, 0x15, 0x2e, + 0xbc, 0x03, 0x96, 0x9e, 0x1d, 0x00, 0x10, 0x16, 0x4f, 0x56, 0xf0, 0x29, + 0x47, 0x0a, 0x45, 0x34, 0x27, 0x21, 0x3b, 0x67, 0x33, 0xf9, 0xdd, 0x29, + 0x3a, 0xf2, 0xe4, 0x56, 0x34, 0x46, 0xbe, 0xd8, 0x42, 0x29, 0x11, 0x7f, + 0x30, 0xc1, 0xbe, 0xa5, 0xc8, 0x9d, 0x7b, 0x2e, 0x4e, 0xcf, 0xba, 0x91, + 0xb4, 0xbf, 0x0a, 0x04, 0x00, 0x49, 0x83, 0x6b, 0x46, 0x5f, 0x3b, 0xfa, + 0xf7, 0x40, 0x8d, 0x85, 0x47, 0x14, 0x58, 0xb3, 0xa5, 0x66, 0x30, 0xfd, + 0x4a, 0x80, 0xa4, 0x61, 0x3b, 0x7c, 0xb4, 0xcc, 0x34, 0x8c, 0xc6, 0xb6, + 0x10, 0xa9, 0x76, 0xc9, 0x11, 0xd7, 0x8a, 0x51, 0x86, 0x17, 0x89, 0x28, + 0xab, 0xd5, 0x03, 0x88, 0x74, 0x5b, 0x81, 0xbd, 0x3a, 0x57, 0xfe, 0x66, + 0x25, 0xd0, 0x92, 0x15, 0x84, 0x02, 0x0f, 0x51, 0xa8, 0x58, 0xcf, 0x77, + 0x65, 0x10, 0x61, 0xe8, 0xe6, 0xab, 0xb1, 0xba, 0x3b, 0x08, 0xd6, 0xba, + 0x5f, 0xf5, 0x74, 0xc5, 0x07, 0x60, 0xfd, 0xd3, 0xc8, 0x52, 0x4e, 0xdb, + 0xc3, 0xe3, 0x6d, 0x81, 0x20, 0x51, 0x01, 0x9a, 0x5e, 0x32, 0x4e, 0x80, + 0x5a, 0xcb, 0x83, 0xd7, 0xa4, 0xd9, 0xfb, 0xed, 0x3d, 0x80, 0xa1, 0x83, + 0x81, 0x91, 0xc0, 0x0b, 0xff, 0x67, 0xd8, 0x8b, 0xd0, 0x12, 0x0b, 0xd4, + 0x2b, 0x8e, 0x0d, 0x0f, 0xfc, 0xc7, 0xb3, 0xf1, 0xe3, 0xf3, 0x5e, 0x0c, + 0xb6, 0x6b, 0x9d, 0xdc, 0x22, 0x70, 0x31, 0x54, 0xe8, 0x41, 0xfe, 0xa1, + 0xe1, 0x4f, 0xfa, 0x81, 0xfb, 0xae, 0x72, 0x16, 0xb8, 0x87, 0xc9, 0x31, + 0x9d, 0x42, 0x47, 0x4a, 0x20, 0xae, 0x63, 0x16, 0x0d, 0xfa, 0xf1, 0x27, + 0x19, 0x47, 0xee, 0x45, 0x84, 0x29, 0x9a, 0xb6, 0x42, 0xef, 0xbd, 0x15, + 0xa8, 0x34, 0x33, 0x38, 0x9c, 0x9d, 0xbb, 0x5c, 0x03, 0xf3, 0xcf, 0xcf, + 0x6d, 0x2e, 0xd5, 0x88, 0xf8, 0xdd, 0xfc, 0xc0, 0x4a, 0xdb, 0x69, 0xd9, + 0x62, 0x89, 0x24, 0x46, 0xee, 0xa4, 0xb9, 0x95, 0xe6, 0xaf, 0x7d, 0x53, + 0xec, 0x41, 0xae, 0x70, 0xfe, 0x4f, 0x31, 0xe3, 0xa2, 0x59, 0x2c, 0xa1, + 0x53, 0x8b, 0xb6, 0x3b, 0x39, 0xc1, 0xa4, 0xa7, 0x9e, 0xaa, 0x00, 0x60, + 0x9a, 0x5f, 0x56, 0x51, 0xf3, 0x7b, 0x28, 0x84, 0x36, 0x1a, 0xc1, 0x2d, + 0xc8, 0xed, 0xf8, 0x48, 0x48, 0x1d, 0x39, 0x4d, 0x3d, 0xce, 0x30, 0x90, + 0x29, 0x33, 0x6f, 0x9a, 0xce, 0x58, 0xe7, 0x88, 0xac, 0x59, 0xce, 0x85, + 0x5a, 0x52, 0x2b, 0x6c, 0xb7, 0xe9, 0x2e, 0xa9, 0xd9, 0x9a, 0xea, 0x1c, + 0x47, 0xb2, 0x59, 0xff, 0x73, 0x76, 0x21, 0x40, 0xe1, 0xde, 0x32, 0xb8, + 0x73, 0x3d, 0xa5, 0x44, 0x66, 0x79, 0xa1, 0xfe, 0xaf, 0xf6, 0x8a, 0x97, + 0x09, 0x5c, 0x8b, 0x64, 0x38, 0x9f, 0xe1, 0x59, 0x38, 0x18, 0xe9, 0xc0, + 0xd6, 0xa2, 0xac, 0x74, 0xa9, 0xfd, 0x4a, 0x0d, 0xf6, 0x47, 0x00, 0x2b, + 0x09, 0x46, 0x38, 0x1c, 0xa4, 0x9f, 0x63, 0x20, 0x18, 0x75, 0x5a, 0xb8, + 0xc4, 0xbc, 0xd6, 0x6b, 0xc8, 0x14, 0x72, 0x03, 0xe4, 0x05, 0xd4, 0x4e, + 0x66, 0x20, 0x42, 0xa2, 0x8f, 0x96, 0xe7, 0xaf, 0xd3, 0xfb, 0xa8, 0x88, + 0x9b, 0xe3, 0xaa, 0xcd, 0xab, 0xce, 0x8f, 0x07, 0x6d, 0xef, 0x98, 0xce, + 0xdb, 0x42, 0x5b, 0xf4, 0x61, 0x57, 0x62, 0x27, 0x8a, 0x53, 0x5e, 0xf8, + 0x3e, 0xf6, 0x7f, 0xde, 0x5e, 0x3b, 0x1b, 0x13, 0x2e, 0x30, 0x46, 0x4b, + 0x6b, 0xb7, 0xbb, 0x33, 0x31, 0xc0, 0xfa, 0x40, 0xab, 0x68, 0x72, 0xe3, + 0x92, 0x30, 0x47, 0xd6, 0x30, 0x60, 0x42, 0x5b, 0x88, 0x8d, 0xa6, 0x56, + 0xe4, 0xac, 0x33, 0x2e, 0xca, 0x05, 0x1f, 0x60, 0xaf, 0xde, 0x7f, 0xa9, + 0xda, 0x3f, 0xa8, 0x21, 0xf6, 0xfc, 0x98, 0x7d, 0xc4, 0x1e, 0xb0, 0xa9, + 0x56, 0x2d, 0x8d, 0xea, 0x03, 0x51, 0x48, 0xac, 0xe8, 0x22, 0xc7, 0x8b, + 0xef, 0x91, 0x0e, 0xcf, 0x0c, 0xe9, 0x38, 0x43, 0x99, 0xa8, 0x98, 0x4f, + 0xfa, 0xe3, 0x03, 0xa6, 0x4f, 0xd4, 0x0d, 0x98, 0x5b, 0x50, 0x28, 0xd7, + 0xe7, 0x46, 0xd7, 0xad, 0x43, 0xb8, 0x56, 0x2a, 0x2f, 0x7c, 0x39, 0x67, + 0xf4, 0x62, 0x0e, 0xc0, 0xa8, 0x87, 0xb5, 0x81, 0xe2, 0x13, 0x9f, 0xe4, + 0xdd, 0x72, 0xf2, 0x07, 0xca, 0xac, 0x6d, 0xb2, 0x96, 0x53, 0x5a, 0x8f, + 0x66, 0x3c, 0xb4, 0xc1, 0x4f, 0x9a, 0x82, 0x55, 0xcf, 0x0e, 0x27, 0x5f, + 0xc7, 0xd2, 0x28, 0x27, 0x7f, 0x22, 0x6e, 0xa5, 0xe7, 0x32, 0x56, 0x51, + 0x18, 0xe0, 0x85, 0x6d, 0x1f, 0xfc, 0x25, 0x08, 0x18, 0x60, 0x57, 0xfc, + 0x66, 0x94, 0x2c, 0x4c, 0xbe, 0x00, 0xab, 0x9e, 0x73, 0x9b, 0x06, 0xd3, + 0xb5, 0x24, 0xa8, 0x8f, 0xb1, 0x33, 0x99, 0x4c, 0xb4, 0x13, 0x07, 0xcd, + 0x04, 0xdd, 0x77, 0xdc, 0xee, 0x96, 0x02, 0x59, 0xe8, 0x22, 0x07, 0x16, + 0x2e, 0x41, 0xc9, 0xc4, 0x59, 0x70, 0x37, 0x0f, 0x14, 0xc9, 0xcf, 0x90, + 0x57, 0xc2, 0x0d, 0xa3, 0xd7, 0x66, 0xb6, 0x7d, 0x10, 0xd4, 0xfc, 0x18, + 0x66, 0xad, 0xea, 0x5e, 0x64, 0x6c, 0x12, 0x66, 0x3d, 0x96, 0xa5, 0xa8, + 0x9c, 0x49, 0x5c, 0xd4, 0x8d, 0x1c, 0xc3, 0x38, 0xfe, 0x53, 0xc2, 0x71, + 0xd1, 0xc6, 0x41, 0xe2, 0xb9, 0x17, 0x74, 0x6e, 0xcc, 0xf8, 0x72, 0x28, + 0x38, 0x4e, 0x54, 0x9b, 0x0e, 0xa3, 0x3a, 0x43, 0x5c, 0xd5, 0x83, 0x06, + 0xbb, 0x46, 0x16, 0x6e, 0xe3, 0x8a, 0xd5, 0x1e, 0x7f, 0x88, 0x62, 0xac, + 0x35, 0x89, 0xfb, 0xbe, 0x96, 0x1d, 0x87, 0x37, 0xb7, 0x91, 0x63, 0xae, + 0x77, 0x7b, 0x66, 0x60, 0xc1, 0x3e, 0x80, 0x56, 0xb1, 0xc8, 0x0d, 0x16, + 0xde, 0x38, 0x82, 0x66, 0x99, 0x2b, 0x35, 0xd8, 0xb4, 0x5b, 0x4b, 0x3e, + 0x93, 0x96, 0x59, 0xf8, 0x96, 0x7e, 0x7b, 0x27, 0xf4, 0x62, 0xb7, 0xda, + 0x89, 0xa7, 0x34, 0x47, 0xed, 0xb3, 0x42, 0x20, 0xeb, 0xcd, 0xf6, 0xa3, + 0x9f, 0xf7, 0x48, 0x91, 0x17, 0xd2, 0x21, 0xed, 0x5a, 0x22, 0x39, 0xc9, + 0x76, 0x95, 0x36, 0xd9, 0x97, 0x0f, 0x19, 0xce, 0xd3, 0xbc, 0x74, 0x7d, + 0x53, 0x37, 0x3b, 0x4a, 0x97, 0xb7, 0xf8, 0x7e, 0xdd, 0x4c, 0x5f, 0xae, + 0x5c, 0x0b, 0xab, 0x4c, 0x34, 0xa1, 0x7e, 0x34, 0x35, 0xf4, 0xfc, 0x92, + 0xab, 0x2e, 0x6a, 0x15, 0xce, 0x84, 0xae, 0x70, 0xae, 0x85, 0x21, 0xe6, + 0x41, 0x13, 0x31, 0xe0, 0x8f, 0xab, 0x82, 0xe3, 0x09, 0xaf, 0xa4, 0x7c, + 0xb4, 0xb9, 0xb7, 0xc0, 0x67, 0x08, 0xc9, 0x9d, 0xcd, 0x0b, 0x3c, 0xa0, + 0x0c, 0xde, 0x49, 0x2f, 0x40, 0x19, 0x95, 0x64, 0xb9, 0x7c, 0x2a, 0x72, + 0xdd, 0xa2, 0x92, 0x0a, 0x21, 0xeb, 0x8c, 0xc3, 0x6d, 0x52, 0xe7, 0x05, + 0x50, 0x01, 0x55, 0x19, 0x2f, 0xbd, 0x1b, 0x72, 0x73, 0xfe, 0x82, 0x9f, + 0xbf, 0xa0, 0xfe, 0x19, 0x7c, 0x42, 0x6d, 0x76, 0x32, 0x47, 0x36, 0x15, + 0x2e, 0xde, 0xe8, 0xe6, 0xca, 0x07, 0xa3, 0x6b, 0x40, 0x99, 0x96, 0xcd, + 0x19, 0xea, 0x7e, 0xc9, 0x87, 0x9d, 0x3d, 0xa0, 0x82, 0x88, 0xe7, 0xe4, + 0x34, 0x9f, 0xa5, 0x27, 0xdf, 0xae, 0x03, 0x37, 0xa8, 0x35, 0x64, 0x02, + 0x09, 0x09, 0x9e, 0xec, 0x38, 0x0a, 0xff, 0x79, 0x8c, 0x9a, 0x87, 0x66, + 0xcd, 0xe4, 0xf4, 0x9d, 0xa9, 0x07, 0x96, 0x36, 0xae, 0x2e, 0x4e, 0xc5, + 0xe9, 0x86, 0xb2, 0x8e, 0x71, 0x5d, 0xe8, 0xee, 0x84, 0xf3, 0x30, 0x2a, + 0x58, 0x1a, 0x80, 0xb8, 0xaa, 0xb8, 0x1d, 0xc4, 0xae, 0x59, 0x91, 0xf3, + 0x16, 0x9b, 0xa3, 0x8a, 0xa3, 0x26, 0xb2, 0x0a, 0xe5, 0x58, 0xb7, 0x96, + 0x87, 0xfb, 0x00, 0xe4, 0x50, 0x7c, 0xb1, 0x77, 0x3a, 0x18, 0xc2, 0xe3, + 0xc1, 0x12, 0xa6, 0x0d, 0x06, 0xeb, 0x80, 0x6c, 0x5a, 0xee, 0x34, 0xcc, + 0x1c, 0x87, 0x35, 0x46, 0x1d, 0x05, 0x83, 0xd8, 0x91, 0x22, 0xaa, 0xf6, + 0xad, 0x87, 0xab, 0x76, 0x18, 0x79, 0xe2, 0x09, 0xc3, 0xa3, 0x15, 0x67, + 0x3a, 0x7c, 0x0f, 0xa0, 0x4c, 0x7b, 0xfc, 0xfc, 0xdd, 0x5c, 0xe4, 0x86, + 0x58, 0x13, 0xb8, 0x97, 0xae, 0x8c, 0x75, 0xc8, 0x02, 0x1e, 0x33, 0x45, + 0xa9, 0x54, 0x09, 0x15, 0x53, 0x4f, 0x28, 0x47, 0x4d, 0x5f, 0xd0, 0xc7, + 0x09, 0xbd, 0x93, 0xb0, 0x08, 0x79, 0x05, 0xbc, 0xbc, 0xaf, 0x2c, 0xbd, + 0xbb, 0x21, 0xd1, 0x60, 0xb8, 0x81, 0x4c, 0x6c, 0x5e, 0x45, 0x39, 0xa3, + 0x31, 0x54, 0xb7, 0x82, 0xef, 0x86, 0xe4, 0x5e, 0xca, 0xd6, 0xb8, 0x31, + 0xa2, 0x4c, 0x84, 0x5b, 0xac, 0xe5, 0x29, 0xbf, 0xbf, 0x89, 0xb4, 0x4c, + 0xd3, 0x69, 0x66, 0x50, 0xeb, 0xda, 0x7d, 0x00, 0xbb, 0x45, 0x0f, 0xe1, + 0xd1, 0x30, 0x1a, 0xc6, 0x94, 0x66, 0xdc, 0x01, 0x75, 0xce, 0xf8, 0xfc, + 0xd9, 0xce, 0xcf, 0x1f, 0x9e, 0x5a, 0x55, 0xa4, 0x3e, 0xe6, 0x51, 0xc7, + 0x74, 0x40, 0x82, 0x09, 0xea, 0xa0, 0xf5, 0xb2, 0x70, 0x9f, 0x0e, 0xfb, + 0x46, 0x8a, 0x69, 0xbf, 0x07, 0x92, 0xdc, 0x74, 0x03, 0x70, 0xc6, 0x44, + 0x81, 0x66, 0x40, 0xc7, 0xf5, 0xb8, 0xf0, 0x45, 0x0f, 0xca, 0xd8, 0xb0, + 0x9e, 0x48, 0x94, 0xff, 0x85, 0xcb, 0x7b, 0xec, 0x67, 0x5d, 0xfe, 0xe9, + 0x13, 0xd1, 0x67, 0x95, 0xd9, 0x35, 0x9e, 0x8a, 0x53, 0x4d, 0x6b, 0x9d, + 0x42, 0x53, 0xb1, 0x6b, 0x51, 0x1e, 0x35, 0x40, 0x81, 0x92, 0x91, 0x5f, + 0x1f, 0x8e, 0xbe, 0x37, 0xd3, 0x85, 0xab, 0x85, 0x37, 0x1c, 0x0f, 0xae, + 0xd9, 0xf7, 0xa2, 0x75, 0x3d, 0xd9, 0xd7, 0x2a, 0x80, 0xb0, 0x4c, 0x14, + 0x04, 0x40, 0xc5, 0xba, 0x0e, 0xbe, 0xab, 0xcc, 0x38, 0x35, 0x62, 0x6c, + 0xa5, 0xce, 0x49, 0x15, 0x2a, 0x10, 0xb5, 0x6a, 0xd2, 0x3b, 0xd2, 0x6a, + 0xad, 0x2e, 0x34, 0x46, 0x8b, 0x78, 0x57, 0x6e, 0xc4, 0xde, 0x65, 0x68, + 0x05, 0x8f, 0xd6, 0x6e, 0x34, 0xb9, 0xaa, 0x80, 0x77, 0xff, 0x6c, 0x1a, + 0x37, 0x87, 0xdd, 0x33, 0x13, 0x33, 0xa7, 0xa9, 0x3a, 0x90, 0x32, 0x7b, + 0x9b, 0x21, 0x31, 0xc8, 0xf5, 0x4c, 0xa6, 0x73, 0x42, 0x79, 0x46, 0x14, + 0x1b, 0xef, 0xf4, 0x78, 0xd9, 0x7e, 0x6f, 0x31, 0xaa, 0x59, 0x97, 0x34, + 0xe5, 0xe6, 0x67, 0xf3, 0x86, 0xf5, 0x61, 0xe7, 0x51, 0x6d, 0xce, 0xb3, + 0xdc, 0x86, 0xc7, 0x55, 0x43, 0xfa, 0x38, 0x78, 0xb0, 0x8d, 0x03, 0x9c, + 0xe4, 0x6c, 0xca, 0x73, 0x94, 0xa1, 0x0c, 0xb8, 0x11, 0xda, 0x0c, 0x0b, + 0x18, 0x1b, 0xd0, 0x99, 0xe7, 0xa9, 0x0d, 0xc3, 0x36, 0xd7, 0x8c, 0x16, + 0xad, 0x16, 0x1f, 0xb2, 0x3c, 0x07, 0x32, 0x11, 0x6c, 0xd2, 0x8f, 0x33, + 0x37, 0x5c, 0x3e, 0x4f, 0x7a, 0x76, 0xf7, 0x85, 0xcc, 0x68, 0x1a, 0xf9, + 0x26, 0x74, 0x42, 0xc9, 0xea, 0x21, 0x7e, 0x74, 0x3c, 0x4f, 0xde, 0xfb, + 0xd7, 0x83, 0x62, 0x12, 0xc7, 0x4f, 0xfc, 0x47, 0x18, 0x9d, 0xc5, 0xf5, + 0xe9, 0xd7, 0xaa, 0x76, 0x20, 0x99, 0x79, 0xae, 0x9b, 0x7a, 0xde, 0x8b, + 0x95, 0xc2, 0xa5, 0xa3, 0x6a, 0x30, 0x9b, 0x99, 0x63, 0x34, 0x7c, 0xd1, + 0x53, 0xa1, 0x6c, 0xd6, 0xed, 0x7d, 0x8c, 0xba, 0xc8, 0x21, 0xf3, 0xe1, + 0x31, 0x55, 0x3d, 0x88, 0x87, 0x04, 0xc7, 0xc9, 0x65, 0x0c, 0x53, 0x1e, + 0xd4, 0xd9, 0xaa, 0xda, 0xc2, 0x14, 0x88, 0xf2, 0x07, 0x2c, 0x12, 0x4d, + 0x79, 0x54, 0xaa, 0xd9, 0x47, 0x95, 0xf9, 0x7e, 0x26, 0x89, 0x4b, 0x63, + 0x7e, 0x44, 0x06, 0x0e, 0xe2, 0x8d, 0x9a, 0x0a, 0xc3, 0xee, 0x55, 0x13, + 0x55, 0x04, 0xcc, 0xb5, 0x2e, 0xa0, 0x0d, 0xec, 0x76, 0x84, 0xc1, 0x1e, + 0xdd, 0xe6, 0xfa, 0x54, 0x6e, 0x38, 0x30, 0x6f, 0xcc, 0xa4, 0x8d, 0x76, + 0x1e, 0xa3, 0x8e, 0x2c, 0x5e, 0x37, 0xeb, 0x0b, 0xf4, 0xb5, 0x80, 0xde, + 0x58, 0x13, 0x5a, 0x52, 0xdc, 0x65, 0x99, 0x1a, 0x1b, 0x75, 0x0c, 0xbd, + 0x83, 0xe8, 0x90, 0x8e, 0xa9, 0xbf, 0x42, 0x22, 0xe1, 0x3a, 0x31, 0x4e, + 0x54, 0xad, 0xd4, 0x6f, 0x80, 0xb4, 0xb5, 0x82, 0x05, 0x20, 0xd7, 0x38, + 0xd7, 0xeb, 0x25, 0x33, 0xe9, 0x4b, 0xc3, 0x5e, 0xd1, 0x11, 0xb0, 0xd9, + 0x8e, 0x90, 0x48, 0x2a, 0xe3, 0xa0, 0x60, 0x16, 0x70, 0xe3, 0xd1, 0x45, + 0x11, 0x64, 0x91, 0x69, 0x87, 0x1c, 0xbb, 0x91, 0xc4, 0x43, 0x12, 0x62, + 0x99, 0x69, 0xe5, 0x96, 0x01, 0x15, 0xdb, 0xdf, 0x05, 0x55, 0x34, 0xbb, + 0xd6, 0x76, 0x89, 0xcd, 0xb5, 0x4f, 0x2e, 0xa7, 0x6e, 0x15, 0xc9, 0xc0, + 0x8e, 0xa8, 0x63, 0x79, 0x12, 0xfb, 0x7e, 0x69, 0x8f, 0x52, 0x5e, 0xe7, + 0x76, 0x16, 0x28, 0x76, 0xca, 0xcb, 0xd8, 0x0e, 0x4a, 0x93, 0x9d, 0x16, + 0x68, 0x98, 0xf8, 0xc3, 0x39, 0xb2, 0x2d, 0xea, 0xba, 0x72, 0x16, 0x33, + 0xb7, 0xec, 0x61, 0x9e, 0x94, 0x32, 0x01, 0x22, 0xde, 0x66, 0xfd, 0x68, + 0xfa, 0xcf, 0xf2, 0x52, 0x4f, 0x02, 0xe8, 0x25, 0xd3, 0xa3, 0x5b, 0x29, + 0xae, 0xe9, 0x62, 0xfa, 0xd6, 0x1a, 0x50, 0x80, 0x95, 0x96, 0xdf, 0x00, + 0xfc, 0x23, 0xf1, 0x95, 0xef, 0xbb, 0xf5, 0x23, 0x9d, 0x6b, 0xd6, 0xed, + 0xb4, 0xe2, 0x4a, 0xf6, 0xb8, 0x20, 0x83, 0x6b, 0x45, 0x92, 0x29, 0x5a, + 0x02, 0xe9, 0xf7, 0x8e, 0x5c, 0x02, 0xde, 0xb4, 0x9a, 0xdf, 0x18, 0x10, + 0x17, 0x7f, 0xd8, 0x2e, 0x17, 0xc0, 0xf0, 0x6b, 0x3b, 0x88, 0x09, 0x58, + 0xf2, 0x18, 0x22, 0x09, 0x80, 0x4a, 0xe0, 0x51, 0x6f, 0x7a, 0x70, 0x09, + 0x1f, 0xe5, 0xfa, 0xa9, 0x4d, 0x24, 0x1f, 0x18, 0x1c, 0x74, 0xcd, 0x87, + 0x04, 0xfd, 0x85, 0x33, 0x4c, 0x28, 0xbd, 0xa3, 0x66, 0x6c, 0x99, 0x7e, + 0x50, 0x5e, 0xb5, 0x22, 0x33, 0x92, 0xd4, 0xd8, 0x82, 0x4e, 0x38, 0xbe, + 0xcb, 0x3d, 0x5f, 0x19, 0xd1, 0x0f, 0x8b, 0xa1, 0x78, 0x08, 0x1c, 0x10, + 0x0b, 0x77, 0xa7, 0x39, 0x2e, 0x91, 0x83, 0xee, 0x1d, 0x36, 0xd8, 0x77, + 0x87, 0x8a, 0x38, 0x45, 0x3c, 0xbd, 0xb9, 0x88, 0xbb, 0x1b, 0x20, 0xd1, + 0x95, 0xb9, 0x8f, 0x03, 0x46, 0xfa, 0xab, 0x70, 0x68, 0x26, 0xd9, 0xb1, + 0x25, 0x52, 0x5a, 0x77, 0x2d, 0x92, 0xc2, 0x1d, 0xb6, 0x6e, 0xec, 0x67, + 0xef, 0x34, 0xe2, 0x64, 0xb3, 0xa0, 0xae, 0x0c, 0xd9, 0x36, 0xa1, 0xc7, + 0xd8, 0xbf, 0x7a, 0x43, 0xbf, 0xc0, 0xc6, 0x90, 0x60, 0x6a, 0x23, 0xc0, + 0x6a, 0x5d, 0x62, 0x18, 0xac, 0xc1, 0x20, 0x35, 0x17, 0xba, 0x4e, 0x54, + 0xb7, 0xec, 0xd4, 0xad, 0x99, 0x94, 0xa4, 0xda, 0x57, 0xe7, 0x46, 0xed, + 0x47, 0xd1, 0xb4, 0xa2, 0x3e, 0x0f, 0x4a, 0xb6, 0xa6, 0x68, 0x3e, 0x94, + 0xb9, 0x18, 0x30, 0xe0, 0x75, 0x08, 0xe8, 0xf3, 0x21, 0x79, 0x26, 0x68, + 0x6a, 0x65, 0xb6, 0xbe, 0x03, 0x98, 0x8f, 0x04, 0xad, 0x1e, 0xb0, 0x54, + 0xd2, 0x28, 0xdd, 0x4a, 0xe9, 0xf3, 0xa0, 0x06, 0xbf, 0x0b, 0x2a, 0xee, + 0xf8, 0x03, 0x7e, 0x1d, 0x37, 0xc1, 0x32, 0xd1, 0x41, 0xf4, 0x9b, 0xc5, + 0x02, 0x10, 0x6f, 0x55, 0x5a, 0xec, 0x5b, 0xe7, 0x61, 0x05, 0x17, 0xf0, + 0xf8, 0xc6, 0x89, 0xe8, 0xad, 0x32, 0x57, 0x14, 0xe5, 0xf8, 0xf5, 0x88, + 0xd9, 0x73, 0x17, 0x10, 0xa7, 0xc3, 0xf8, 0x78, 0x0b, 0x66, 0xab, 0x63, + 0x4f, 0x96, 0x5d, 0xdf, 0x36, 0x83, 0xc4, 0x6f, 0x20, 0xbd, 0xcb, 0x4c, + 0xd2, 0xfa, 0x35, 0x87, 0xd8, 0xb6, 0xbb, 0xcc, 0xb6, 0xd2, 0x85, 0x03, + 0x6a, 0xea, 0xbb, 0x6d, 0x2f, 0xa2, 0x06, 0xc0, 0xd6, 0x68, 0xd9, 0x7f, + 0xd6, 0xa2, 0x3b, 0x08, 0x6a, 0x98, 0x26, 0x6d, 0x9a, 0x2b, 0x68, 0x51, + 0x78, 0xde, 0xa6, 0x96, 0x50, 0x7b, 0xfc, 0x03, 0x43, 0xf8, 0x21, 0x01, + 0x9d, 0xe2, 0x89, 0x65, 0x47, 0xae, 0x9c, 0x45, 0x5e, 0xa5, 0xce, 0x97, + 0xb3, 0xe6, 0xf6, 0xd4, 0x5a, 0xe8, 0x6b, 0x87, 0xd6, 0xdf, 0xfb, 0x1f, + 0xaf, 0xfb, 0xaf, 0x19, 0xa5, 0xfd, 0xba, 0xe0, 0x22, 0x2f, 0x91, 0x97, + 0xdf, 0xae, 0xe9, 0x39, 0xb1, 0xe4, 0xd3, 0x10, 0xcb, 0xb3, 0x03, 0xb5, + 0x0b, 0xf0, 0xd9, 0x70, 0x1e, 0x9c, 0x63, 0x6f, 0x3a, 0xcf, 0x3c, 0x1b, + 0x86, 0xa3, 0xad, 0x1a, 0xe7, 0x4c, 0x09, 0xd0, 0x80, 0xf6, 0x8b, 0x72, + 0x96, 0x53, 0x7e, 0x66, 0xfb, 0x7c, 0x7c, 0x8a, 0xb0, 0x60, 0xa6, 0x4c, + 0x20, 0xc4, 0x63, 0x69, 0x6a, 0xc3, 0x53, 0xf8, 0x9a, 0x28, 0x30, 0x9d, + 0x6f, 0x0e, 0x1b, 0xb2, 0x2c, 0xe6, 0x94, 0x9f, 0xfc, 0xc0, 0x8d, 0x71, + 0xbe, 0x37, 0xa6, 0xc9, 0xbd, 0x3c, 0x4a, 0xf3, 0xc4, 0xb3, 0x88, 0x4c, + 0x45, 0x26, 0x4e, 0x2f, 0x83, 0x16, 0x70, 0xb6, 0xc7, 0xb2, 0x36, 0xf0, + 0x0c, 0x67, 0xd2, 0x0a, 0xd3, 0xd9, 0x7c, 0x35, 0x29, 0xac, 0xd4, 0x9c, + 0x6d, 0xfc, 0xec, 0x58, 0x92, 0xf0, 0xba, 0x32, 0x00, 0xae, 0xb1, 0xeb, + 0x4d, 0x8c, 0x1a, 0x20, 0xe7, 0x5c, 0xfc, 0x9a, 0x4d, 0x51, 0x24, 0x7b, + 0x52, 0xeb, 0x13, 0x3d, 0xb4, 0xab, 0xda, 0xb3, 0x74, 0x39, 0xd2, 0xf8, + 0x2d, 0xef, 0x9b, 0x0f, 0xae, 0xf5, 0x3c, 0x99, 0x34, 0xbe, 0x15, 0x5c, + 0x9f, 0x5d, 0xae, 0xf4, 0x72, 0xc2, 0xac, 0x06, 0xbe, 0xad, 0xe4, 0x68, + 0xea, 0xd5, 0xa1, 0xdc, 0xdb, 0xf4, 0x61, 0x51, 0xf5, 0x1a, 0x62, 0x15, + 0xfd, 0x00, 0x51, 0x35, 0x53, 0x6c, 0x39, 0x3e, 0xdb, 0x60, 0x0a, 0x52, + 0xc1, 0x52, 0x3c, 0xd7, 0xab, 0x73, 0xea, 0x1e, 0x38, 0x38, 0x65, 0x35, + 0x35, 0x2b, 0x28, 0x04, 0x5c, 0x82, 0xea, 0x4a, 0x9e, 0x96, 0x72, 0xa4, + 0x8e, 0x42, 0xfd, 0x55, 0xa8, 0x66, 0x7a, 0x40, 0xc9, 0xf2, 0xc2, 0x1e, + 0x5d, 0x09, 0x90, 0x32, 0x18, 0xdb, 0x11, 0x4c, 0x6c, 0x9c, 0x27, 0x62, + 0x0a, 0xe6, 0xc1, 0xdf, 0xf2, 0x6a, 0x8c, 0x26, 0xb4, 0xfb, 0xda, 0xa9, + 0x08, 0x10, 0x3a, 0xf0, 0xe1, 0x64, 0xe5, 0x03, 0x81, 0x7d, 0x15, 0x74, + 0xa1, 0x8d, 0x10, 0xc8, 0xbb, 0x6a, 0x7c, 0x60, 0xa1, 0x09, 0x35, 0x19, + 0x2d, 0x70, 0xb5, 0x36, 0xc8, 0x8b, 0x66, 0x5f, 0xe0, 0xe7, 0xea, 0x70, + 0x2f, 0x5d, 0x3f, 0xae, 0x5e, 0x25, 0x84, 0xdd, 0x9b, 0x69, 0x44, 0x37, + 0x7c, 0x6b, 0x9e, 0x81, 0x18, 0x36, 0x4b, 0xff, 0x86, 0x44, 0x2a, 0x39, + 0x66, 0x7f, 0x71, 0x43, 0xe7, 0x65, 0xfe, 0xfd, 0x34, 0xb9, 0xd9, 0x5a, + 0x00, 0xd1, 0x41, 0x43, 0xc7, 0xbc, 0x65, 0x68, 0xb7, 0x73, 0xff, 0x19, + 0xd3, 0xed, 0x15, 0xa4, 0x67, 0xa1, 0x53, 0x0e, 0xa6, 0xfb, 0x25, 0xce, + 0x9d, 0x5b, 0x73, 0x08, 0xf3, 0x3b, 0x69, 0xe4, 0x94, 0x9b, 0x94, 0x03, + 0xb3, 0x8a, 0x2e, 0x07, 0x0c, 0xef, 0x18, 0x4c, 0x2b, 0x1c, 0x83, 0x9f, + 0x25, 0x20, 0x29, 0x72, 0x11, 0xa0, 0xaa, 0xed, 0x0c, 0xf9, 0xce, 0x94, + 0x0d, 0x7a, 0xb6, 0xb3, 0xa4, 0x57, 0xd6, 0x61, 0xca, 0x1a, 0x0e, 0x89, + 0x6d, 0x99, 0x4d, 0x06, 0xcd, 0x83, 0x7e, 0x09, 0x14, 0x5b, 0xe7, 0x4c, + 0x72, 0xa8, 0x98, 0xc8, 0x27, 0xf3, 0x70, 0x89, 0x87, 0x11, 0xbb, 0x98, + 0x82, 0x77, 0x9d, 0xaa, 0x95, 0x8c, 0xc1, 0xf8, 0x39, 0x27, 0xd5, 0x64, + 0x59, 0x6a, 0x8c, 0xbe, 0xe2, 0xe1, 0xd1, 0x6b, 0xe3, 0xaf, 0x30, 0x6f, + 0xf4, 0x9e, 0x35, 0x0b, 0x10, 0x24, 0x77, 0xd8, 0xa4, 0x30, 0x2e, 0xf7, + 0x97, 0xfd, 0xef, 0x1e, 0x9e, 0xf2, 0xbd, 0xf2, 0x41, 0x73, 0x19, 0xe6, + 0x7b, 0x7f, 0x74, 0x11, 0x91, 0x38, 0xc5, 0xac, 0xd5, 0xb0, 0x48, 0xc4, + 0xe9, 0x41, 0xd4, 0x50, 0x76, 0x13, 0xbf, 0xec, 0xe8, 0x3a, 0xa8, 0x84, + 0x42, 0x98, 0x12, 0x64, 0x95, 0x85, 0x79, 0x29, 0xea, 0x3a, 0xf9, 0xa4, + 0x5c, 0x9c, 0x35, 0x01, 0x68, 0x71, 0xb9, 0x5b, 0xbe, 0xaa, 0x76, 0x9e, + 0x63, 0x1c, 0xc1, 0x83, 0x94, 0xc6, 0x89, 0x2b, 0x1d, 0x00, 0x43, 0x74, + 0x00, 0x41, 0x93, 0x58, 0x52, 0xf9, 0x13, 0xfe, 0x9f, 0x7a, 0xb7, 0x3d, + 0x6b, 0x70, 0x4e, 0x4f, 0x8f, 0xf4, 0x9c, 0xe4, 0x97, 0x62, 0xaf, 0x69, + 0x45, 0xec, 0xf4, 0x53, 0x71, 0xdc, 0xc7, 0x8d, 0x6f, 0xb2, 0x9d, 0xec, + 0x43, 0xdd, 0xc0, 0xe5, 0xd1, 0x6c, 0x1a, 0x82, 0x19, 0xf6, 0x18, 0xd3, + 0x59, 0x0e, 0x07, 0x81, 0x5a, 0x23, 0x10, 0x8b, 0xaa, 0x0b, 0x99, 0xc8, + 0x34, 0xc2, 0xd0, 0xa9, 0x69, 0x7f, 0x54, 0xe3, 0xc4, 0xa0, 0xe7, 0x4b, + 0x31, 0x90, 0xe7, 0x3b, 0x45, 0x9b, 0x7f, 0xae, 0xd2, 0xab, 0x22, 0xb9, + 0xfc, 0x07, 0x39, 0x4b, 0x45, 0x83, 0x8d, 0x41, 0x7a, 0x52, 0xb2, 0xae, + 0x71, 0x78, 0x17, 0x63, 0xfa, 0xbe, 0x59, 0xca, 0xf0, 0xfd, 0x68, 0xe5, + 0xc4, 0x9a, 0x74, 0x3d, 0xec, 0xd4, 0x8b, 0xa1, 0x2c, 0x31, 0x4d, 0x73, + 0xfd, 0x5c, 0x1e, 0xeb, 0x5f, 0xf6, 0x42, 0x0d, 0x79, 0x5f, 0x64, 0x10, + 0xae, 0xb2, 0xf6, 0x9e, 0xa8, 0xab, 0xa5, 0x2b, 0x9a, 0xcf, 0x25, 0xfa, + 0xa2, 0xb3, 0xdc, 0x30, 0x3d, 0x08, 0x4e, 0xbb, 0x7b, 0x0c, 0x28, 0x34, + 0x9d, 0xda, 0xc4, 0x94, 0xa4, 0xf4, 0x1e, 0x78, 0x8b, 0xa9, 0xd3, 0xa7, + 0x1c, 0x2a, 0x27, 0x14, 0xa0, 0x44, 0x1a, 0x9a, 0x87, 0x72, 0xa5, 0x6d, + 0x69, 0x46, 0xe5, 0xc1, 0x4f, 0x29, 0x87, 0xc0, 0xa7, 0xa8, 0x96, 0xde, + 0xa9, 0x63, 0x08, 0xd8, 0x4a, 0xa1, 0x25, 0x43, 0x76, 0x41, 0xf7, 0x9f, + 0x17, 0xe3, 0xe1, 0x4b, 0xc6, 0x2b, 0x79, 0xea, 0xd5, 0xa7, 0x72, 0x16, + 0x0a, 0x8c, 0xcd, 0x49, 0x70, 0x75, 0xd4, 0x59, 0x4a, 0x19, 0x7b, 0x31, + 0x02, 0x7a, 0x3a, 0x20, 0x15, 0x62, 0x7e, 0x4e, 0x6f, 0xac, 0xd0, 0xd1, + 0x29, 0xbd, 0x2d, 0xa1, 0xc6, 0x3e, 0xa6, 0x1a, 0x26, 0x18, 0x96, 0x98, + 0x12, 0x56, 0x37, 0xbf, 0xb4, 0x91, 0x57, 0xe8, 0xda, 0x61, 0x7c, 0x2f, + 0x3e, 0xd4, 0x51, 0xfe, 0xe8, 0x5b, 0x00, 0x30, 0x08, 0xf6, 0x4e, 0x69, + 0xa8, 0x1a, 0x2b, 0x82, 0x41, 0x85, 0xa9, 0xd9, 0x3c, 0xc8, 0x02, 0x91, + 0x99, 0xd4, 0xa2, 0xfd, 0x9d, 0x1b, 0x08, 0xfc, 0x41, 0x3e, 0x10, 0x6b, + 0x80, 0x74, 0x3d, 0x72, 0x61, 0x97, 0xdd, 0x96, 0xec, 0xf4, 0xd6, 0x6d, + 0x68, 0x02, 0x6e, 0xbb, 0x55, 0x9d, 0x6f, 0x11, 0xde, 0xd1, 0xad, 0x6d, + 0x42, 0x96, 0x2c, 0x42, 0x1e, 0xa9, 0x19, 0x42, 0x22, 0x38, 0x38, 0x18, + 0x3c, 0x4b, 0xc1, 0x9c, 0x0f, 0xe1, 0x34, 0x61, 0x06, 0x77, 0x54, 0x04, + 0xe0, 0x87, 0x94, 0x5c, 0xc9, 0xa1, 0x35, 0x55, 0x3d, 0x4a, 0xf2, 0x4f, + 0x05, 0x11, 0x98, 0x6f, 0x3c, 0x85, 0x84, 0xe6, 0xf8, 0x71, 0x8a, 0xdf, + 0xe9, 0x9a, 0xe3, 0x70, 0xd6, 0x36, 0xd6, 0xc8, 0x66, 0x3e, 0xba, 0x7c, + 0x0a, 0x23, 0x0a, 0xd0, 0xb6, 0x66, 0x68, 0xa8, 0xdf, 0x37, 0x17, 0xfb, + 0xdd, 0x9c, 0x8b, 0xc7, 0x8e, 0xc4, 0x4f, 0x40, 0x08, 0x23, 0x58, 0x15, + 0xa2, 0xba, 0xef, 0xdf, 0x67, 0xcd, 0x1f, 0xb6, 0xc4, 0xea, 0xce, 0x81, + 0x38, 0x58, 0x92, 0x57, 0xcf, 0x83, 0x47, 0x29, 0x9f, 0xde, 0x9b, 0xde, + 0x01, 0xfe, 0x68, 0x91, 0x67, 0x06, 0x9d, 0x31, 0xd0, 0xb9, 0xc3, 0xbb, + 0xc3, 0x6b, 0xa0, 0x04, 0x1e, 0x34, 0xd5, 0x38, 0xd4, 0xac, 0x70, 0xae, + 0xab, 0xb2, 0xbd, 0x4b, 0xa0, 0xad, 0x2b, 0x82, 0xaf, 0x8c, 0x90, 0x4d, + 0xd3, 0xca, 0x71, 0x35, 0x75, 0x89, 0xe5, 0x42, 0x91, 0x46, 0x8d, 0x18, + 0x04, 0x7a, 0xb9, 0xaa, 0x3b, 0xe7, 0x1e, 0x8c, 0x4e, 0xf9, 0x6e, 0x74, + 0xaa, 0x2e, 0x36, 0x86, 0xfb, 0xef, 0x9c, 0xd7, 0xba, 0x5e, 0x2e, 0x3c, + 0x40, 0xce, 0x8b, 0x2b, 0x94, 0x55, 0xf2, 0xd4, 0x7d, 0xbf, 0x8c, 0x8a, + 0xa8, 0x59, 0x84, 0x6f, 0x32, 0x95, 0xc5, 0xcc, 0xad, 0xee, 0x30, 0x23, + 0x7c, 0x54, 0xea, 0x60, 0xb8, 0x88, 0x12, 0x45, 0x03, 0xbc, 0xe3, 0x92, + 0x9f, 0xa8, 0x5b, 0x07, 0x97, 0x53, 0x0d, 0xe1, 0xe3, 0x3d, 0xdf, 0xf2, + 0x2a, 0x12, 0xee, 0xdf, 0x73, 0x8d, 0x41, 0xf4, 0xe4, 0x2c, 0xb4, 0xd4, + 0x9e, 0xfe, 0xf2, 0xe6, 0xa0, 0x9e, 0x2a, 0x3a, 0x36, 0x26, 0x7e, 0xd9, + 0xe1, 0x22, 0xee, 0x0b, 0x5b, 0x48, 0xd2, 0xa9, 0x55, 0xab, 0x50, 0x7c, + 0xf6, 0xc8, 0x56, 0x31, 0xbb, 0x51, 0xe9, 0x31, 0x4d, 0xaa, 0x13, 0x3a, + 0x99, 0x9f, 0x8c, 0x59, 0x6a, 0xc9, 0xf1, 0x0a, 0x89, 0xcc, 0x39, 0x98, + 0xbd, 0xc3, 0x93, 0x97, 0x28, 0xe5, 0x73, 0x94, 0xf2, 0x0a, 0x7a, 0x09, + 0x38, 0x0b, 0xab, 0xd8, 0x49, 0x98, 0x14, 0x34, 0x32, 0x9d, 0xef, 0x9d, + 0x47, 0xdb, 0x82, 0xb9, 0x84, 0xd6, 0xd7, 0x9f, 0xf7, 0xdf, 0x79, 0x5b, + 0xe8, 0x92, 0x44, 0x31, 0x5d, 0x42, 0x80, 0x90, 0x8d, 0x36, 0xa2, 0x39, + 0x02, 0x64, 0x21, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa4, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0xea, 0xff, 0xff, + 0xfc, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe4, 0x03, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xb8, 0x03, 0x00, 0x00, + 0x60, 0x03, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0xbc, 0x02, 0x00, 0x00, + 0x84, 0x02, 0x00, 0x00, 0x3c, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, + 0xbc, 0x01, 0x00, 0x00, 0x84, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, + 0xf4, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8e, 0xfc, 0xff, 0xff, + 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x0c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x96, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x08, + 0x0b, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x88, 0xfd, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x32, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0xca, 0xfd, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x06, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x78, 0xfd, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, + 0x2e, 0x00, 0x00, 0x00, 0x0e, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x06, + 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xbc, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x52, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, + 0x23, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x96, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x88, 0xfe, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, + 0xca, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x78, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0e, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, + 0x42, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xf0, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x86, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x78, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xba, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x68, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x18, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x28, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00, 0xdc, 0x11, 0x00, 0x00, 0x70, 0x11, 0x00, 0x00, + 0x04, 0x11, 0x00, 0x00, 0xa8, 0x10, 0x00, 0x00, 0x5c, 0x10, 0x00, 0x00, + 0xf4, 0x0f, 0x00, 0x00, 0x94, 0x0f, 0x00, 0x00, 0x50, 0x0f, 0x00, 0x00, + 0xf8, 0x0e, 0x00, 0x00, 0x98, 0x0e, 0x00, 0x00, 0x3c, 0x0e, 0x00, 0x00, + 0xe0, 0x0d, 0x00, 0x00, 0xa0, 0x0d, 0x00, 0x00, 0x44, 0x0d, 0x00, 0x00, + 0xe4, 0x0c, 0x00, 0x00, 0xa0, 0x0c, 0x00, 0x00, 0x48, 0x0c, 0x00, 0x00, + 0xe8, 0x0b, 0x00, 0x00, 0x8c, 0x0b, 0x00, 0x00, 0x30, 0x0b, 0x00, 0x00, + 0xf0, 0x0a, 0x00, 0x00, 0x94, 0x0a, 0x00, 0x00, 0x34, 0x0a, 0x00, 0x00, + 0xf0, 0x09, 0x00, 0x00, 0x98, 0x09, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, + 0xdc, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, + 0xe4, 0x07, 0x00, 0x00, 0x84, 0x07, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, + 0xe8, 0x06, 0x00, 0x00, 0x88, 0x06, 0x00, 0x00, 0x2c, 0x06, 0x00, 0x00, + 0xd0, 0x05, 0x00, 0x00, 0x90, 0x05, 0x00, 0x00, 0x34, 0x05, 0x00, 0x00, + 0xd4, 0x04, 0x00, 0x00, 0x78, 0x04, 0x00, 0x00, 0x1c, 0x04, 0x00, 0x00, + 0xdc, 0x03, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, + 0xc4, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x28, 0x02, 0x00, 0x00, + 0xcc, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0a, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6c, 0xf0, 0xff, 0xff, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4a, 0xef, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x07, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xac, 0xf0, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0xd7, 0x23, 0x3a, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x8a, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0x2c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xec, 0xf0, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x37, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xca, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xbc, 0xef, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9f, 0x48, 0x8f, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x2f, 0xd9, 0x0b, 0x41, 0x01, 0x00, 0x00, 0x00, + 0x7e, 0x99, 0x11, 0xc1, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x86, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x30, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x84, 0xf1, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x44, 0xab, 0x0b, 0x3a, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc6, 0xf0, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x54, 0xf0, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x20, 0xb6, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0xe3, 0xb3, 0x34, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0xe6, 0x5c, 0x12, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0xba, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xac, 0xf0, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x75, 0x52, 0xc4, 0x3d, 0x01, 0x00, 0x00, 0x00, 0x23, 0x8e, 0xc3, 0x41, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x84, 0xf2, 0xff, 0xff, + 0x00, 0x00, 0x07, 0x01, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x74, 0xf2, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xe4, 0xb1, 0x2c, 0x3a, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xb6, 0xf1, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x44, 0xf1, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xc5, 0xcf, 0xd7, 0x35, + 0x01, 0x00, 0x00, 0x00, 0x8c, 0xcd, 0x6b, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x14, 0xd8, 0xc4, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x0e, 0xf2, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0x44, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9c, 0xf1, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2f, 0xf5, 0x1f, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0x53, 0x17, 0x59, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x2f, 0xf5, 0x9f, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x66, 0xf2, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x48, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xf4, 0xf1, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xc7, 0xea, 0x1a, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0xf1, 0xb4, 0x99, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x93, 0x3e, 0x49, 0xbf, + 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x5a, 0xf2, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x4c, 0xf2, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9c, 0x67, 0x85, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x34, 0xe2, 0x84, 0x41, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x24, 0xf4, 0xff, 0xff, 0x00, 0x00, 0x07, 0x01, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0xf4, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0f, 0xa3, 0x06, 0x3a, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x56, 0xf3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xe4, 0xf2, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x31, 0x1b, 0xa1, 0x35, 0x01, 0x00, 0x00, 0x00, + 0x5c, 0xcf, 0x87, 0x3f, 0x01, 0x00, 0x00, 0x00, 0xa0, 0xa5, 0xe6, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xae, 0xf3, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x07, 0x44, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x3c, 0xf3, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x1a, 0x2a, 0x19, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0x62, 0xbf, 0x8c, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x2a, 0x99, 0xbf, + 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x06, 0xf4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0xf3, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xe9, 0x36, 0xdd, 0x3b, 0x01, 0x00, 0x00, 0x00, 0x7b, 0x7c, 0x5b, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x4f, 0x8e, 0x37, 0xbf, 0x02, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xfa, 0xf3, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xec, 0xf3, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x57, 0x66, 0xa3, 0x3d, 0x01, 0x00, 0x00, 0x00, + 0xf1, 0xc2, 0xa2, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xc4, 0xf5, 0xff, 0xff, 0x00, 0x00, 0x07, 0x01, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xb4, 0xf5, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x90, 0xd6, 0x03, 0x3a, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0xf6, 0xf4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, + 0x17, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x84, 0xf4, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x39, 0x9e, 0xa3, 0x35, 0x01, 0x00, 0x00, 0x00, 0xef, 0xc9, 0x24, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0xbf, 0xb3, 0x75, 0xbf, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x4e, 0xf5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, + 0x44, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xdc, 0xf4, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xd0, 0xda, 0x1e, 0x3b, 0x01, 0x00, 0x00, 0x00, 0xc5, 0x6e, 0x84, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0xd0, 0xda, 0x9e, 0xbf, 0x02, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xa6, 0xf5, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x34, 0xf5, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x8e, 0x0b, 0xa8, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0x5f, 0x8a, 0x23, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x77, 0xbb, 0x26, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x9a, 0xf5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x8c, 0xf5, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x98, 0x1d, 0x9d, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x9e, 0x3f, 0x1e, 0x41, 0x01, 0x00, 0x00, 0x00, + 0x56, 0xc1, 0x1a, 0xc1, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x56, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x30, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x54, 0xf7, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb6, 0xf7, 0x5d, 0x39, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x96, 0xf6, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x24, 0xf6, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa4, 0x34, 0xab, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0x12, 0xea, 0x23, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x3b, 0xde, 0x29, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x8a, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7c, 0xf6, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x9f, 0xf3, 0x25, 0x3d, 0x01, 0x00, 0x00, 0x00, 0xab, 0x4d, 0x25, 0x41, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x54, 0xf8, 0xff, 0xff, + 0x00, 0x00, 0x07, 0x01, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x44, 0xf8, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x8b, 0xd3, 0x0d, 0x3a, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x86, 0xf7, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x14, 0xf7, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb2, 0xe0, 0x57, 0x35, + 0x01, 0x00, 0x00, 0x00, 0x60, 0x08, 0x1d, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x97, 0x0f, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xde, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0x44, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6c, 0xf7, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0xd5, 0xc2, 0x3a, + 0x01, 0x00, 0x00, 0x00, 0x10, 0xd5, 0x42, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x1a, 0x4c, 0x1d, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x36, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x48, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xc4, 0xf7, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x8f, 0x84, 0xa2, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x34, 0x21, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x86, 0x3f, 0x21, 0xbf, + 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x2a, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x1c, 0xf8, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0xfd, 0x5a, 0x12, 0x3e, 0x01, 0x00, 0x00, 0x00, + 0x1d, 0xcf, 0x9f, 0x41, 0x01, 0x00, 0x00, 0x00, 0x28, 0xc2, 0x83, 0xc1, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xe6, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe4, 0xf9, 0xff, 0xff, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xbc, 0x09, 0xdf, 0x39, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x26, 0xf9, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x48, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xb4, 0xf8, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x58, 0x76, 0xb9, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0x6b, 0x03, 0x38, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x43, 0x4b, 0x2e, 0xbf, + 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x1a, 0xf9, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0xf9, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfd, 0xee, 0x99, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x55, 0x99, 0x41, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xe4, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x07, 0x01, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd4, 0xfa, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x26, 0xcb, 0xbb, 0x3a, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x16, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xa4, 0xf9, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x15, 0x16, 0x17, 0x36, 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x8a, 0x49, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x55, 0xb3, 0x10, 0xbf, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x6e, 0xfa, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x07, 0x44, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xfc, 0xf9, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xed, 0xf5, 0xcd, 0x3a, 0x01, 0x00, 0x00, 0x00, + 0xed, 0xf5, 0x4d, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x9c, 0x34, 0x35, 0xbf, + 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xc6, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x54, 0xfa, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x9d, 0xca, 0xd4, 0x3b, 0x01, 0x00, 0x00, 0x00, 0x7c, 0xc5, 0x40, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x21, 0x53, 0xbf, 0x02, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xba, 0xfa, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xac, 0xfa, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0xe2, 0x1f, 0x5d, 0x3e, 0x01, 0x00, 0x00, 0x00, 0x69, 0x49, 0xe9, 0x41, + 0x01, 0x00, 0x00, 0x00, 0x1c, 0x3c, 0xcf, 0xc1, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x76, 0xfb, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x30, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x74, 0xfc, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x66, 0xc3, 0x4d, 0x3a, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xb6, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x44, 0xfb, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xf8, 0xb6, 0xc3, 0x3b, 0x01, 0x00, 0x00, 0x00, 0x8a, 0x2f, 0x42, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x24, 0xbf, 0x02, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xaa, 0xfb, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x9c, 0xfb, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x67, 0x92, 0x06, 0x3e, 0x01, 0x00, 0x00, 0x00, + 0xd5, 0x0b, 0x06, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x74, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x07, 0x01, 0x28, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x64, 0xfd, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xb7, 0xbe, 0xf0, 0x3a, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0xa6, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xfc, 0xff, 0xff, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xa6, 0xe2, 0x52, 0x36, 0x01, 0x00, 0x00, 0x00, 0x88, 0xb8, 0x36, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x1c, 0x81, 0x32, 0xbf, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xfe, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, + 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x8c, 0xfc, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x8f, 0x3f, 0xe0, 0x3a, 0x01, 0x00, 0x00, 0x00, 0x8f, 0x3f, 0x60, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x26, 0x23, 0x52, 0xbf, 0x02, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x56, 0xfd, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xe4, 0xfc, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0xd7, 0xa9, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0xfc, 0x9a, 0x19, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x77, 0x83, 0x28, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x4a, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, 0xfd, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x37, 0x36, 0xde, 0x3e, + 0x01, 0x00, 0x00, 0x00, 0x69, 0xf1, 0x67, 0x42, 0x01, 0x00, 0x00, 0x00, + 0x99, 0xbe, 0x52, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x06, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x30, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0xff, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x91, 0x0c, 0xb9, 0x3a, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x46, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xd4, 0xfd, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd7, 0xdf, 0xc3, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0x17, 0x58, 0x42, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0xa3, 0x73, 0x33, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x3a, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2c, 0xfe, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x0e, 0xda, 0x71, 0x3e, + 0x01, 0x00, 0x00, 0x00, 0x34, 0xe8, 0x70, 0x42, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x01, 0x34, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x9a, 0x33, 0x8f, 0x3b, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x4e, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xdc, 0xfe, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa6, 0xd7, 0x87, 0x37, + 0x01, 0x00, 0x00, 0x00, 0x38, 0x61, 0xb3, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0xc7, 0x2b, 0x8c, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xa6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0x44, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0xff, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0xd8, 0x72, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0xbe, 0x99, 0xea, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x14, 0xd8, 0xf2, 0xbf, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x08, 0x00, + 0x07, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x9c, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xd4, 0x42, 0x16, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0x09, 0x1f, 0x90, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x4e, 0x16, 0x95, 0xbf, + 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x4c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x70, 0x84, 0x72, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0xec, 0x91, 0x71, 0x41, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, + 0x10, 0x01, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0xd4, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x5c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x72, 0x00, 0x00, 0x00, + 0x40, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x50, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x60, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0x70, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1b, + 0x03, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x90, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0xa0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, 0xb0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, + 0xd0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1b, + 0x03, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x03, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00 +}; + +const unsigned int g_keyword_scrambled_model_data_length = 34576; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h new file mode 100644 index 00000000..754f6b75 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h @@ -0,0 +1,22 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_BENCHMARKS_KEYWORD_SCRAMBLED_MODEL_DATA_H_ +#define TENSORFLOW_LITE_MICRO_BENCHMARKS_KEYWORD_SCRAMBLED_MODEL_DATA_H_ + +extern const unsigned char g_keyword_scrambled_model_data[]; +extern const unsigned int g_keyword_scrambled_model_data_length; + +#endif // TENSORFLOW_LITE_MICRO_BENCHMARKS_KEYWORD_SCRAMBLED_MODEL_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/micro_benchmark.h b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/micro_benchmark.h new file mode 100644 index 00000000..bbbee1d5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/micro_benchmark.h @@ -0,0 +1,90 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_BENCHMARKS_MICRO_BENCHMARK_H_ +#define TENSORFLOW_LITE_MICRO_BENCHMARKS_MICRO_BENCHMARK_H_ + +#include + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_op_resolver.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/micro/micro_time.h" +#include "tensorflow/lite/micro/recording_micro_interpreter.h" + +namespace tflite { +template +class MicroBenchmarkRunner { +public: + // The lifetimes of model, op_resolver, tensor_arena, profiler must exceed + // that of the created MicroBenchmarkRunner object. + MicroBenchmarkRunner(const uint8_t *model, + const tflite::MicroOpResolver *op_resolver, + uint8_t *tensor_arena, int tensor_arena_size, + MicroProfiler *profiler) + : interpreter_(GetModel(model), *op_resolver, tensor_arena, + tensor_arena_size, GetMicroErrorReporter(), profiler) + { + interpreter_.AllocateTensors(); + } + + void RunSingleIteration() + { + // Run the model on this input and make sure it succeeds. + TfLiteStatus invoke_status = interpreter_.Invoke(); + if (invoke_status == kTfLiteError) { + MicroPrintf("Invoke failed."); + } + } + + void SetRandomInput(const int random_seed) + { + // The pseudo-random number generator is initialized to a constant seed + std::srand(random_seed); + TfLiteTensor *input = interpreter_.input(0); + + // Pre-populate input tensor with random values. + int input_length = input->bytes / sizeof(inputT); + inputT *input_values = tflite::GetTensorData(input); + for (int i = 0; i < input_length; i++) { + // Pre-populate input tensor with a random value based on a constant seed. + input_values[i] = static_cast( + std::rand() % (std::numeric_limits::max() - + std::numeric_limits::min() + 1)); + } + } + + void SetInput(const inputT *custom_input) + { + TfLiteTensor *input = interpreter_.input(0); + inputT *input_buffer = tflite::GetTensorData(input); + int input_length = input->bytes / sizeof(inputT); + for (int i = 0; i < input_length; i++) { + input_buffer[i] = custom_input[i]; + } + } + + void PrintAllocations() const + { + interpreter_.GetMicroAllocator().PrintAllocations(); + } + +private: + tflite::RecordingMicroInterpreter interpreter_; +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_BENCHMARKS_MICRO_BENCHMARK_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/person_detection_benchmark.cc b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/person_detection_benchmark.cc new file mode 100644 index 00000000..e70e57bb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/benchmarks/person_detection_benchmark.cc @@ -0,0 +1,122 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/benchmarks/micro_benchmark.h" +#include "tensorflow/lite/micro/examples/person_detection/model_settings.h" +#include "tensorflow/lite/micro/examples/person_detection/no_person_image_data.h" +#include "tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h" +#include "tensorflow/lite/micro/examples/person_detection/person_image_data.h" +#include "tensorflow/lite/micro/kernels/conv.h" +#include "tensorflow/lite/micro/kernels/fully_connected.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +/* + * Person Detection benchmark. Evaluates runtime performance of the visual + * wakewords person detection model. This is the same model found in + * exmaples/person_detection. + */ + +namespace tflite { + +using PersonDetectionOpResolver = MicroMutableOpResolver<6>; +using PersonDetectionBenchmarkRunner = MicroBenchmarkRunner; + +// Create an area of memory to use for input, output, and intermediate arrays. +// Align arena to 16 bytes to avoid alignment warnings on certain platforms. +constexpr int kTensorArenaSize = 135 * 1024; +alignas(16) uint8_t tensor_arena[kTensorArenaSize]; + +uint8_t op_resolver_buffer[sizeof(PersonDetectionOpResolver)]; +uint8_t benchmark_runner_buffer[sizeof(PersonDetectionBenchmarkRunner)]; + +// Initialize benchmark runner instance explicitly to avoid global init order +// issues on Sparkfun. Use new since static variables within a method +// are automatically surrounded by locking, which breaks bluepill and stm32f4. +PersonDetectionBenchmarkRunner *CreateBenchmarkRunner(MicroProfiler *profiler) +{ + // We allocate PersonDetectionOpResolver from a global buffer + // because the object's lifetime must exceed that of the + // PersonDetectionBenchmarkRunner object. + PersonDetectionOpResolver *op_resolver = + new (op_resolver_buffer) PersonDetectionOpResolver(); + op_resolver->AddFullyConnected(tflite::Register_FULLY_CONNECTED_INT8()); + op_resolver->AddConv2D(tflite::Register_CONV_2D_INT8REF()); + op_resolver->AddDepthwiseConv2D(); + op_resolver->AddSoftmax(); + op_resolver->AddAveragePool2D(); + op_resolver->AddReshape(); + return new (benchmark_runner_buffer) + PersonDetectionBenchmarkRunner(g_person_detect_model_data, op_resolver, + tensor_arena, kTensorArenaSize, profiler); +} + +void PersonDetectionNIerations(const int8_t *input, int iterations, + const char *tag, + PersonDetectionBenchmarkRunner &benchmark_runner, + MicroProfiler &profiler) +{ + benchmark_runner.SetInput(input); + uint32_t ticks = 0; + for (int i = 0; i < iterations; ++i) { + profiler.ClearEvents(); + benchmark_runner.RunSingleIteration(); + ticks += profiler.GetTotalTicks(); + } + MicroPrintf("%s took %u ticks (%u ms)", tag, ticks, TicksToMs(ticks)); +} + +} // namespace tflite + +int main(int argc, char **argv) +{ + tflite::InitializeTarget(); + + tflite::MicroProfiler profiler; + + uint32_t event_handle = profiler.BeginEvent("InitializeBenchmarkRunner"); + tflite::PersonDetectionBenchmarkRunner *benchmark_runner = + CreateBenchmarkRunner(&profiler); + profiler.EndEvent(event_handle); + profiler.Log(); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + tflite::PersonDetectionNIerations( + reinterpret_cast(g_person_data), 1, + "WithPersonDataIterations(1)", *benchmark_runner, profiler); + profiler.Log(); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + tflite::PersonDetectionNIerations( + reinterpret_cast(g_no_person_data), 1, + "NoPersonDataIterations(1)", *benchmark_runner, profiler); + profiler.Log(); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + tflite::PersonDetectionNIerations( + reinterpret_cast(g_person_data), 10, + "WithPersonDataIterations(10)", *benchmark_runner, profiler); + MicroPrintf(""); // null MicroPrintf serves as a newline. + + tflite::PersonDetectionNIerations( + reinterpret_cast(g_no_person_data), 10, + "NoPersonDataIterations(10)", *benchmark_runner, profiler); + MicroPrintf(""); // null MicroPrintf serves as a newline. +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/compatibility.h b/components/TensorFlowLite/tensorflow/lite/micro/compatibility.h new file mode 100644 index 00000000..19191fdb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/compatibility.h @@ -0,0 +1,34 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_COMPATIBILITY_H_ +#define TENSORFLOW_LITE_MICRO_COMPATIBILITY_H_ + +// C++ will automatically create class-specific delete operators for virtual +// objects, which by default call the global delete function. For embedded +// applications we want to avoid this, and won't be calling new/delete on these +// objects, so we need to override the default implementation with one that does +// nothing to avoid linking in ::delete(). +// This macro needs to be included in all subclasses of a virtual base class in +// the private section. +#ifdef TF_LITE_STATIC_MEMORY +#define TF_LITE_REMOVE_VIRTUAL_DELETE \ + void operator delete(void *p) \ + { \ + } +#else +#define TF_LITE_REMOVE_VIRTUAL_DELETE +#endif + +#endif // TENSORFLOW_LITE_MICRO_COMPATIBILITY_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/debug_log.cc b/components/TensorFlowLite/tensorflow/lite/micro/debug_log.cc new file mode 100644 index 00000000..d9751cee --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/debug_log.cc @@ -0,0 +1,51 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Reference implementation of the DebugLog() function that's required for a +// platform to support the TensorFlow Lite for Microcontrollers library. This is +// the only function that's absolutely required to be available on a target +// device, since it's used for communicating test results back to the host so +// that we can verify the implementation is working correctly. +// It's designed to be as easy as possible to supply an implementation though. +// On platforms that have a POSIX stack or C library, it can be written as a +// single call to `fprintf(stderr, "%s", s)` to output a string to the error +// stream of the console, but if there's no OS or C library available, there's +// almost always an equivalent way to write out a string to some serial +// interface that can be used instead. For example on Arm M-series MCUs, calling +// the `bkpt #0xAB` assembler instruction will output the string in r1 to +// whatever debug serial connection is available. If you're running mbed, you +// can do the same by creating `Serial pc(USBTX, USBRX)` and then calling +// `pc.printf("%s", s)`. +// To add an equivalent function for your own platform, create your own +// implementation file, and place it in a subfolder with named after the OS +// you're targeting. For example, see the Cortex M bare metal version in +// tensorflow/lite/micro/bluepill/debug_log.cc or the mbed one on +// tensorflow/lite/micro/mbed/debug_log.cc. + +#include "tensorflow/lite/micro/debug_log.h" + +#ifndef TF_LITE_STRIP_ERROR_STRINGS +#include +#endif + +extern "C" void DebugLog(const char *s) +{ +#ifndef TF_LITE_STRIP_ERROR_STRINGS + // Reusing TF_LITE_STRIP_ERROR_STRINGS to disable DebugLog completely to get + // maximum reduction in binary size. This is because we have DebugLog calls + // via TF_LITE_CHECK that are not stubbed out by TF_LITE_REPORT_ERROR. + fprintf(stderr, "%s", s); +#endif +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/debug_log.h b/components/TensorFlowLite/tensorflow/lite/micro/debug_log.h new file mode 100644 index 00000000..6c3b5c89 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/debug_log.h @@ -0,0 +1,31 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_DEBUG_LOG_H_ +#define TENSORFLOW_LITE_MICRO_DEBUG_LOG_H_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// This function should be implemented by each target platform, and provide a +// way for strings to be output to some text stream. For more information, see +// tensorflow/lite/micro/debug_log.cc. +void DebugLog(const char *s); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // TENSORFLOW_LITE_MICRO_DEBUG_LOG_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/README.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/README.md new file mode 100644 index 00000000..e79a5d36 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/README.md @@ -0,0 +1,596 @@ + + +# Hello World Example + +This example is designed to demonstrate the absolute basics of using [TensorFlow +Lite for Microcontrollers](https://www.tensorflow.org/lite/microcontrollers). +It includes the full end-to-end workflow of training a model, converting it for +use with TensorFlow Lite for Microcontrollers for running inference on a +microcontroller. + +The model is trained to replicate a `sine` function and generates a pattern of +data to either blink LEDs or control an animation, depending on the capabilities +of the device. + +![Animation on STM32F746](images/animation_on_STM32F746.gif) + +## Table of contents + +- [Deploy to ARC EM SDP](#deploy-to-arc-em-sdp) +- [Deploy to Arduino](#deploy-to-arduino) +- [Deploy to ESP32](#deploy-to-esp32) +- [Deploy to Himax WE1 EVB](#deploy-to-himax-we1-evb) +- [Deploy to SparkFun Edge](#deploy-to-sparkfun-edge) +- [Deploy to STM32F746](#deploy-to-STM32F746) +- [Run the tests on a development machine](#run-the-tests-on-a-development-machine) +- [Train your own model](#train-your-own-model) + +## Deploy to ARC EM SDP + +The following instructions will help you to build and deploy this example to +[ARC EM SDP](https://www.synopsys.com/dw/ipdir.php?ds=arc-em-software-development-platform) +board. General information and instructions on using the board with TensorFlow +Lite Micro can be found in the common +[ARC targets description](/tensorflow/lite/micro/tools/make/targets/arc/README.md). + +### Initial Setup + +Follow the instructions on the +[ARC EM SDP Initial Setup](/tensorflow/lite/micro/tools/make/targets/arc/README.md#ARC-EM-Software-Development-Platform-ARC-EM-SDP) +to get and install all required tools for work with ARC EM SDP. + +### Generate Example Project + +The example project for ARC EM SDP platform can be generated with the following +command: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=arc_emsdp OPTIMIZED_KERNEL_DIR=arc_mli ARC_TAGS=no_arc_mli generate_hello_world_make_project +``` + +### Build and Run Example + +For more detailed information on building and running examples see the +appropriate sections of general descriptions of the +[ARC EM SDP usage with TFLM](/tensorflow/lite/micro/tools/make/targets/arc/README.md#ARC-EM-Software-Development-Platform-ARC-EM-SDP). +In the directory with generated project you can also find a +*README_ARC_EMSDP.md* file with instructions and options on building and +running. Here we only briefly mention main steps which are typically enough to +get it started. + +1. You need to + [connect the board](/tensorflow/lite/micro/tools/make/targets/arc/README.md#connect-the-board) + and open an serial connection. + +2. Go to the generated example project director + + ``` + cd tensorflow/lite/micro/tools/make/gen/arc_emsdp_arc/prj/hello_world/make + ``` + +3. Build the example using + + ``` + make app + ``` + +4. To generate artefacts for self-boot of example from the board use + + ``` + make flash + ``` + +5. To run application from the board using microSD card: + + * Copy the content of the created /bin folder into the root of microSD + card. Note that the card must be formatted as FAT32 with default cluster + size (but less than 32 Kbytes) + * Plug in the microSD card into the J11 connector. + * Push the RST button. If a red LED is lit beside RST button, push the CFG + button. + * Type or copy next commands one-by-another into serial terminal: `setenv + loadaddr 0x10800000 setenv bootfile app.elf setenv bootdelay 1 setenv + bootcmd fatload mmc 0 \$\{loadaddr\} \$\{bootfile\} \&\& bootelf + saveenv` + * Push the RST button. + +6. If you have the MetaWare Debugger installed in your environment: + + * To run application from the console using it type `make run`. + * To stop the execution type `Ctrl+C` in the console several times. + +In both cases (step 5 and 6) you will see the application output in the serial +terminal. + +## Deploy to Arduino + +The following instructions will help you build and deploy this sample +to [Arduino](https://www.arduino.cc/) devices. + +![Animation on Arduino MKRZERO](images/animation_on_arduino_mkrzero.gif) + +The sample has been tested with the following devices: + +- [Arduino Nano 33 BLE Sense](https://store.arduino.cc/usa/nano-33-ble-sense-with-headers) +- [Arduino MKRZERO](https://store.arduino.cc/usa/arduino-mkrzero) + +The sample will use PWM to fade an LED on and off according to the model's +output. In the code, the `LED_BUILTIN` constant is used to specify the board's +built-in LED as the one being controlled. However, on some boards, this built-in +LED is not attached to a pin with PWM capabilities. In this case, the LED will +blink instead of fading. + +### Install the Arduino_TensorFlowLite library + +This example application is included as part of the official TensorFlow Lite +Arduino library. To install it, open the Arduino library manager in +`Tools -> Manage Libraries...` and search for `Arduino_TensorFlowLite`. + +### Load and run the example + +Once the library has been added, go to `File -> Examples`. You should see an +example near the bottom of the list named `TensorFlowLite:hello_world`. Select +it and click `hello_world` to load the example. + +Use the Arduino IDE to build and upload the example. Once it is running, +you should see the built-in LED on your device flashing. + +The Arduino Desktop IDE includes a plotter that we can use to display the sine +wave graphically. To view it, go to `Tools -> Serial Plotter`. You will see one +datapoint being logged for each inference cycle, expressed as a number between 0 +and 255. + +## Deploy to ESP32 + +The following instructions will help you build and deploy this sample +to [ESP32](https://www.espressif.com/en/products/hardware/esp32/overview) +devices using the [ESP IDF](https://github.com/espressif/esp-idf). + +The sample has been tested on ESP-IDF version 4.0 with the following devices: +- [ESP32-DevKitC](http://esp-idf.readthedocs.io/en/latest/get-started/get-started-devkitc.html) +- [ESP-EYE](https://github.com/espressif/esp-who/blob/master/docs/en/get-started/ESP-EYE_Getting_Started_Guide.md) + +### Install the ESP IDF + +Follow the instructions of the +[ESP-IDF get started guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) +to setup the toolchain and the ESP-IDF itself. + +The next steps assume that the +[IDF environment variables are set](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#step-4-set-up-the-environment-variables) : + + * The `IDF_PATH` environment variable is set + * `idf.py` and Xtensa-esp32 tools (e.g. `xtensa-esp32-elf-gcc`) are in `$PATH` + +### Generate the examples +The example project can be generated with the following command: +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_hello_world_esp_project +``` + +### Building the example + +Go to the example project directory `cd +tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/hello_world/esp-idf` + +Then build with `idf.py` +``` +idf.py build +``` + +### Load and run the example + +To flash (replace `/dev/ttyUSB0` with the device serial port): +``` +idf.py --port /dev/ttyUSB0 flash +``` + +Monitor the serial output: +``` +idf.py --port /dev/ttyUSB0 monitor +``` + +Use `Ctrl+]` to exit. + +The previous two commands can be combined: +``` +idf.py --port /dev/ttyUSB0 flash monitor +``` + +## Deploy to Himax WE1 EVB + +The following instructions will help you build and deploy this example to +[HIMAX WE1 EVB](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_board_brief) +board. To understand more about using this board, please check +[HIMAX WE1 EVB user guide](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide). + +### Initial Setup + +To use the HIMAX WE1 EVB, please make sure following software are installed: + +#### MetaWare Development Toolkit + +See +[Install the Synopsys DesignWare ARC MetaWare Development Toolkit](/tensorflow/lite/micro/tools/make/targets/arc/README.md#install-the-synopsys-designware-arc-metaware-development-toolkit) +section for instructions on toolchain installation. + +#### Make Tool version + +A `'make'` tool is required for deploying Tensorflow Lite Micro applications on +HIMAX WE1 EVB, See +[Check make tool version](/tensorflow/lite/micro/tools/make/targets/arc/README.md#make-tool) +section for proper environment. + +#### Serial Terminal Emulation Application + +There are 2 main purposes for HIMAX WE1 EVB Debug UART port + +- print application output +- burn application to flash by using xmodem send application binary + +You can use any terminal emulation program (like [PuTTY](https://www.putty.org/) +or [minicom](https://linux.die.net/man/1/minicom)). + +### Generate Example Project + +The example project for HIMAX WE1 EVB platform can be generated with the +following command: + +Download related third party data + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=himax_we1_evb third_party_downloads +``` + +Generate hello world project + +``` +make -f tensorflow/lite/micro/tools/make/Makefile generate_hello_world_make_project TARGET=himax_we1_evb ARC_TAGS=no_arc_mli +``` + +### Build and Burn Example + +Following the Steps to run hello world example at HIMAX WE1 EVB platform. + +1. Go to the generated example project directory. + + ``` + cd tensorflow/lite/micro/tools/make/gen/himax_we1_evb_arc/prj/hello_world/make + ``` + +2. Build the example using + + ``` + make app + ``` + +3. After example build finish, copy ELF file and map file to image generate + tool directory. \ + image generate tool directory located at + `'tensorflow/lite/micro/tools/make/downloads/himax_we1_sdk/image_gen_linux_v3/'` + + ``` + cp hello_world.elf himax_we1_evb.map ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + +4. Go to flash image generate tool directory. + + ``` + cd ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + + make sure this tool directory is in $PATH. You can permanently set it to + PATH by + + ``` + export PATH=$PATH:$(pwd) + ``` + +5. run image generate tool, generate flash image file. + + * Before running image generate tool, by typing `sudo chmod +x image_gen` + and `sudo chmod +x sign_tool` to make sure it is executable. + + ``` + image_gen -e hello_world.elf -m himax_we1_evb.map -o out.img + ``` + +6. Download flash image file to HIMAX WE1 EVB by UART: + + * more detail about download image through UART can be found at + [HIMAX WE1 EVB update Flash image](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide#flash-image-update) + +After these steps, press reset button on the HIMAX WE1 EVB, you will see +application output in the serial terminal. + +## Deploy to SparkFun Edge + +The following instructions will help you build and deploy this sample on the +[SparkFun Edge development board](https://sparkfun.com/products/15170). + +![Animation on SparkFun Edge](images/animation_on_sparkfun_edge.gif) + +If you're new to using this board, we recommend walking through the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab to get an understanding of the workflow. + +### Compile the binary + +The following command will download the required dependencies and then compile a +binary for the SparkFun Edge: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge hello_world_bin +``` + +The binary will be created in the following location: + +``` +tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/hello_world.bin +``` + +### Sign the binary + +The binary must be signed with cryptographic keys to be deployed to the device. +We'll now run some commands that will sign our binary so it can be flashed to +the SparkFun Edge. The scripts we are using come from the Ambiq SDK, which is +downloaded when the `Makefile` is run. + +Enter the following command to set up some dummy cryptographic keys we can use +for development: + +``` +cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py \ +tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py +``` + +Next, run the following command to create a signed binary: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \ +--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/hello_world.bin \ +--load-address 0xC000 \ +--magic-num 0xCB \ +-o main_nonsecure_ota \ +--version 0x0 +``` + +This will create the file `main_nonsecure_ota.bin`. We'll now run another +command to create a final version of the file that can be used to flash our +device with the bootloader script we will use in the next step: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ +--load-address 0x20000 \ +--bin main_nonsecure_ota.bin \ +-i 6 \ +-o main_nonsecure_wire \ +--options 0x1 +``` + +You should now have a file called `main_nonsecure_wire.bin` in the directory +where you ran the commands. This is the file we'll be flashing to the device. + +### Flash the binary + +Next, attach the board to your computer via a USB-to-serial adapter. + +**Note:** If you're using the [SparkFun Serial Basic Breakout](https://www.sparkfun.com/products/15096), +you should [install the latest drivers](https://learn.sparkfun.com/tutorials/sparkfun-serial-basic-ch340c-hookup-guide#drivers-if-you-need-them) +before you continue. + +Once connected, assign the USB device name to an environment variable: + +``` +export DEVICENAME=put your device name here +``` + +Set another variable with the baud rate: + +``` +export BAUD_RATE=921600 +``` + +Now, hold the button marked `14` on the device. While still holding the button, +hit the button marked `RST`. Continue holding the button marked `14` while +running the following command: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py \ +-b ${BAUD_RATE} ${DEVICENAME} \ +-r 1 \ +-f main_nonsecure_wire.bin \ +-i 6 +``` + +You should see a long stream of output as the binary is flashed to the device. +Once you see the following lines, flashing is complete: + +``` +Sending Reset Command. +Done. +``` + +If you don't see these lines, flashing may have failed. Try running through the +steps in [Flash the binary](#flash-the-binary) again (you can skip over setting +the environment variables). If you continue to run into problems, follow the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab, which includes more comprehensive instructions for the flashing +process. + +The binary should now be deployed to the device. Hit the button marked `RST` to +reboot the board. You should see the device's four LEDs flashing in sequence. + +Debug information is logged by the board while the program is running. To view +it, establish a serial connection to the board using a baud rate of `115200`. +On OSX and Linux, the following command should work: + +``` +screen ${DEVICENAME} 115200 +``` + +You will see a lot of output flying past! To stop the scrolling, hit `Ctrl+A`, +immediately followed by `Esc`. You can then use the arrow keys to explore the +output, which will contain the results of running inference on various `x` +values: + +``` +x_value: 1.1843798*2^2, y_value: -1.9542645*2^-1 +``` + +To stop viewing the debug output with `screen`, hit `Ctrl+A`, immediately +followed by the `K` key, then hit the `Y` key. + + +## Deploy to STM32F746 + +The following instructions will help you build and deploy the sample to the +[STM32F7 discovery kit](https://os.mbed.com/platforms/ST-Discovery-F746NG/) +using [ARM Mbed](https://github.com/ARMmbed/mbed-cli). + +![Animation on STM32F746](images/animation_on_STM32F746.gif) + +Before we begin, you'll need the following: + +- STM32F7 discovery kit board +- Mini-USB cable +- ARM Mbed CLI ([installation instructions](https://os.mbed.com/docs/mbed-os/v6.9/quick-start/build-with-mbed-cli.html). Check it out for MacOS Catalina - [mbed-cli is broken on MacOS Catalina #930](https://github.com/ARMmbed/mbed-cli/issues/930#issuecomment-660550734)) +- Python 3 and pip3 + +Since Mbed requires a special folder structure for projects, we'll first run a +command to generate a subfolder containing the required source files in this +structure: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=disco_f746ng OPTIMIZED_KERNEL_DIR=cmsis_nn generate_hello_world_mbed_project +``` + +This will result in the creation of a new folder: + +``` +tensorflow/lite/micro/tools/make/gen/disco_f746ng_cortex-m4_default/prj/hello_world/mbed +``` + +This folder contains all of the example's dependencies structured in the correct +way for Mbed to be able to build it. + +Change into the directory and run the following commands. + +First, tell Mbed that the current directory is the root of an Mbed project: + +``` +mbed config root . +``` + +Next, tell Mbed to download the dependencies and prepare to build: + +``` +mbed deploy +``` + +Older versions of Mbed will build the project using C++98. However, TensorFlow Lite +requires C++11. If needed, run the following Python snippet to modify the Mbed +configuration files so that it uses C++11: + +``` +python -c 'import fileinput, glob; +for filename in glob.glob("mbed-os/tools/profiles/*.json"): + for line in fileinput.input(filename, inplace=True): + print(line.replace("\"-std=gnu++98\"","\"-std=c++11\", \"-fpermissive\""))' + +``` + +Note: Mbed has a dependency to an old version of arm_math.h and cmsis_gcc.h (adapted from the general [CMSIS-NN MBED example](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/kernels/cmsis_nn#example-2---mbed)). Therefore you need to copy the newer version as follows: +```bash +cp tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/\ +arm_math.h mbed-os/cmsis/TARGET_CORTEX_M/arm_math.h +cp tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/Core/Include/\ +cmsis_gcc.h mbed-os/cmsis/TARGET_CORTEX_M/cmsis_gcc.h +``` + +Finally, run the following command to compile: + +``` +mbed compile -m DISCO_F746NG -t GCC_ARM +``` + +This should result in a binary at the following path: + +``` +./BUILD/DISCO_F746NG/GCC_ARM/mbed.bin +``` + +To deploy, plug in your STM board and copy the file to it. On MacOS, you can do +this with the following command: + +``` +cp ./BUILD/DISCO_F746NG/GCC_ARM/mbed.bin /Volumes/DIS_F746NG/ +``` + +Copying the file will initiate the flashing process. Once this is complete, you +should see an animation on the device's screen. + + +``` +screen /dev/tty.usbmodem14403 9600 +``` + +In addition to this animation, debug information is logged by the board while +the program is running. To view it, establish a serial connection to the board +using a baud rate of `9600`. On OSX and Linux, the following command should +work, replacing `/dev/tty.devicename` with the name of your device as it appears +in `/dev`: + +``` +screen /dev/tty.devicename 9600 +``` + +You will see a lot of output flying past! To stop the scrolling, hit `Ctrl+A`, +immediately followed by `Esc`. You can then use the arrow keys to explore the +output, which will contain the results of running inference on various `x` +values: + +``` +x_value: 1.1843798*2^2, y_value: -1.9542645*2^-1 +``` + +To stop viewing the debug output with `screen`, hit `Ctrl+A`, immediately +followed by the `K` key, then hit the `Y` key. + +## Run the tests on a development machine + +To compile and test this example on a desktop Linux or macOS machine, first +clone the TensorFlow repository from GitHub to a convenient place: + +```bash +git clone --depth 1 https://github.com/tensorflow/tensorflow.git +``` + +Next, `cd` into the source directory from a terminal, and then run the following +command: + +```bash +make -f tensorflow/lite/micro/tools/make/Makefile test_hello_world_test +``` + +This will take a few minutes, and downloads frameworks the code uses. Once the +process has finished, you should see a series of files get compiled, followed by +some logging output from a test, which should conclude with +`~~~ALL TESTS PASSED~~~`. + +If you see this, it means that a small program has been built and run that loads +the trained TensorFlow model, runs some example inputs through it, and got the +expected outputs. + +To understand how TensorFlow Lite does this, you can look at the source in +[hello_world_test.cc](hello_world_test.cc). +It's a fairly small amount of code that creates an interpreter, gets a handle to +a model that's been compiled into the program, and then invokes the interpreter +with the model and sample inputs. + +## Train your own model + +So far you have used an existing trained model to run inference on +microcontrollers. If you wish to train your own model, follow the instructions +given in the [train/](train/) directory. + diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.cc new file mode 100644 index 00000000..3eccb724 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.cc @@ -0,0 +1,19 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/hello_world/constants.h" + +// This is a small number so that it's easy to read the logs +const int kInferencesPerCycle = 20; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.h new file mode 100644 index 00000000..11fc4fd4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/constants.h @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ + +// This constant represents the range of x values our model was trained on, +// which is from 0 to (2 * Pi). We approximate Pi to avoid requiring additional +// libraries. +const float kXrange = 2.f * 3.14159265359f; + +// This constant determines the number of inferences to perform across the range +// of x values defined above. Since each inference takes time, the higher this +// number, the more time it will take to run through the entire range. The value +// of this constant can be tuned so that one full cycle takes a desired amount +// of time. Since different devices take different amounts of time to perform +// inference, this value should be defined per-device. +extern const int kInferencesPerCycle; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/create_sine_model.ipynb b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/create_sine_model.ipynb new file mode 100644 index 00000000..b34c0bb3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/create_sine_model.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Redirect","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyO1u6oks1qPVEQNnHFD3Cyo"},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"86C-FMxpdZxv","colab_type":"text"},"source":["This Colab notebook has been moved to [https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/hello_world/train/train_hello_world_model.ipynb](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/hello_world/train/train_hello_world_model.ipynb)\n"]}]} \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_binary_test.sh b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_binary_test.sh new file mode 100644 index 00000000..fe7683e5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_binary_test.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Bash unit tests for the example binary. + +set -e + +OUTPUT_LOG_FILE=${TEST_TMPDIR}/output_log.txt + +# Needed for copybara compatibility. +SCRIPT_BASE_DIR=/org_"tensor"flow +${TEST_SRCDIR}${SCRIPT_BASE_DIR}/tensorflow/lite/micro/examples/hello_world/hello_world 2>&1 | head > ${OUTPUT_LOG_FILE} + +if ! grep -q 'x_value:.*y_value:' ${OUTPUT_LOG_FILE}; then + echo "ERROR: Expected logs not found in output '${OUTPUT_LOG_FILE}'" + exit 1 +fi + +echo +echo "SUCCESS: hello_world_binary_test PASSED" diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_test.cc new file mode 100644 index 00000000..45ddfadf --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/hello_world_test.cc @@ -0,0 +1,132 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/examples/hello_world/model.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/schema/schema_generated.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(LoadModelAndPerformInference) +{ + // Define the input and the expected output + float x = 0.0f; + float y_true = sin(x); + + // Set up logging + tflite::MicroErrorReporter micro_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + const tflite::Model *model = ::tflite::GetModel(g_model); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.\n", + model->version(), TFLITE_SCHEMA_VERSION); + } + + // This pulls in all the operation implementations we need + tflite::AllOpsResolver resolver; + + constexpr int kTensorArenaSize = 2000; + uint8_t tensor_arena[kTensorArenaSize]; + + // Build an interpreter to run the model with + tflite::MicroInterpreter interpreter(model, resolver, tensor_arena, + kTensorArenaSize, µ_error_reporter); + // Allocate memory from the tensor_arena for the model's tensors + TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk); + + // Obtain a pointer to the model's input tensor + TfLiteTensor *input = interpreter.input(0); + + // Make sure the input has the properties we expect + TF_LITE_MICRO_EXPECT_NE(nullptr, input); + // The property "dims" tells us the tensor's shape. It has one element for + // each dimension. Our input is a 2D tensor containing 1 element, so "dims" + // should have size 2. + TF_LITE_MICRO_EXPECT_EQ(2, input->dims->size); + // The value of each element gives the length of the corresponding tensor. + // We should expect two single element tensors (one is contained within the + // other). + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[1]); + // The input is an 8 bit integer value + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, input->type); + + // Get the input quantization parameters + float input_scale = input->params.scale; + int input_zero_point = input->params.zero_point; + + // Quantize the input from floating-point to integer + int8_t x_quantized = x / input_scale + input_zero_point; + // Place the quantized input in the model's input tensor + input->data.int8[0] = x_quantized; + + // Run the model and check that it succeeds + TfLiteStatus invoke_status = interpreter.Invoke(); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Obtain a pointer to the output tensor and make sure it has the + // properties we expect. It should be the same as the input tensor. + TfLiteTensor *output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, output->type); + + // Get the output quantization parameters + float output_scale = output->params.scale; + int output_zero_point = output->params.zero_point; + + // Obtain the quantized output from model's output tensor + int8_t y_pred_quantized = output->data.int8[0]; + // Dequantize the output from integer to floating-point + float y_pred = (y_pred_quantized - output_zero_point) * output_scale; + + // Check if the output is within a small range of the expected output + float epsilon = 0.05f; + TF_LITE_MICRO_EXPECT_NEAR(y_true, y_pred, epsilon); + + // Run inference on several more values and confirm the expected outputs + x = 1.f; + y_true = sin(x); + input->data.int8[0] = x / input_scale + input_zero_point; + interpreter.Invoke(); + y_pred = (output->data.int8[0] - output_zero_point) * output_scale; + TF_LITE_MICRO_EXPECT_NEAR(y_true, y_pred, epsilon); + + x = 3.f; + y_true = sin(x); + input->data.int8[0] = x / input_scale + input_zero_point; + interpreter.Invoke(); + y_pred = (output->data.int8[0] - output_zero_point) * output_scale; + TF_LITE_MICRO_EXPECT_NEAR(y_true, y_pred, epsilon); + + x = 5.f; + y_true = sin(x); + input->data.int8[0] = x / input_scale + input_zero_point; + interpreter.Invoke(); + y_pred = (output->data.int8[0] - output_zero_point) * output_scale; + TF_LITE_MICRO_EXPECT_NEAR(y_true, y_pred, epsilon); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_STM32F746.gif b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_STM32F746.gif new file mode 100644 index 0000000000000000000000000000000000000000..e427bc867a7296f9916e1f2950d5d1286d637071 GIT binary patch literal 299034 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

A!ie1xXSu9k_YH~W=*0QRP|Lf3`DS(Oj$!y zs4n*Zg@`O?K=+ha4CEjeEfuU+#oAf3f_9RjHEChbdRoJ#wxOnKN+^{#9|%TJu2N}@ z$To09w^-JZKTT~pxXRbh0#>xcEv;#dYgmb%Z9MeC=ZRQ2RjSgK1OL>mR(T6t(h7C7 z!VT_ki96QghPNllOO?QMatL0;7HtVks2|QrcA~?axgWq%8 z``%^AcXo?>z^Lro8~kEe#-0VMh7VfY4|5i=7jo?oW^3Z*u@|<~#Q`g~1>;Q2Sjjg3 zt}&CHtlb=Q_Q0$??;y=XO!W#`$P1oqU0F;N+%O>xN6xH;eY@oS^7qM5{_c&P9AyKC z_?IJ2o(h3%8uv^n>=Vl8yduLMy_*5e9^|57(MURv#X+N z0WfpxOJx=`n-!htgwi7y&ag!-(lI2d zVmD2LByXeBYIbvA#RQBu07KcpFm;<(O=wq>BhJ%~GpwuJG3GIGy6>elz&bjEGXhkr zNAop)>@e(9r@Orz= zKi%+#zo8z^mN>*2ZQx93{9a&NFkDR;Ei8kxl;Z9+6$W1Lmb+Z(d4ajRWgc&vM_uX@ zzc{t+Ku@QVN?KeIy0*Q(>*nd2&r2x!uTie@q}N=R#BKV!XP$PoTm0r$XI!3ojM1;> z-Hcst-q_1-Zn(!i;p#>XvfKXjz^i-i)4n>bH~urndtC2(r@VCij_H!0ygMvUe6fYQ z@TR}v;Y*)->E(WU)K^{38W+#qr z{gfSFDxRk|_J-8E2U>g<%zNQrXWxA8buavQCxhXJe>>DoFL-FTdice^c;oSHxP13> z`LoYE(W5_b>T~}3;2(S~McwX4oFn+&r~mjD|3&jltn_0(0*pNnSR?$HBKey?>}x<~ zIEL@*FnI7k3M9V?M5{880oDU1pK%>7xUKc$yY@rCP5XlCTR;Z%y!sy zz;DSw4P-9YbB$wK8)Mo*9^AFIAiMWF0Fzq*6SO`fOhLkX!Txi=C2T<_WI-9EL5g~+ z*x9$7s;fkDtOEprC|HrDu%00-!XrdMGJHTYEW;;k!Zce!{!2suB}~FMguxi>Bq}Ya9@eMHWDmJ?z0g^g=Ya zpUkq1P$a}NM227-Mq)h0QA9;1Bt>OB7FBG@%Oi1#3MyLuVF~U3gni3HS!Q0BmHWEbtfCNW@EXIxeg@Q!LV=PC7 zG)RzCN0T%#hMYnp3OeX4;Pye)~f zrF<<-lz<-)6p4(4vbP=4)O0B$0pbSf~+{=>AOFyKSn|ubl#LJ=d$gKp+z63G8yv)kvO3oZfqeRNHbVpITwA>02Fqjg?yvJ;O z%nON3%8X6R+{`!>NxkgM&*V$-`^z}fg``BwEhrEFNjywJ!Gwv#Mw*-UhWJ}4M zOxcW1%w)sN#7!mKP3&ApDR4B>lq|Kx$NTED)$yk*NzM##O?~9YV31DsoXzQ^P56Az z`1DNrLK-fFa8u-EV#7gLFPwSM=u2j$kozL8SP`|v-(2TR+ ztf-|tib5JX*wMlrY@ZeKLX&&V=0t+$JWvx&&<15t6|GMer4tlwQ5cO-36;^%^i4%F zFY@p?psO`SLM9XtfanQQ%L7qz1A-FV1q4mf6kSpWT~P>q(HM==8Kuz)%}?+2xodf! zXZgSYAbYC*eUTrPmYM{(G6lkY zBvHc>)Il9pLOoPNHC0qiR8@6UIPJ{}-MK!gQ^{k#7s;&@(Ns!UuMqsb?1 zLC)6v)29`}zeQWY1zfkq+Ekre&;8uRwKvDrJ9MQyG0UXEtOMJyBc_l;fjp~1=}O%x5ZV0I-~DY~4F1T1 z1K{oQUja_sjVxdh9^s=zU<*OMNnIiwTZM@+MzG4gh;4S9i_61=w9^yDNW8_od zft@ZapeZhB6(^1bB&p#!MxHvh<2z=F*)>Dx{bC^w<39G|Y5PDu3FKr|+6UfG9k>HQ zSOYZ>-aZ8sT?|CFgycvr$UIhGS>9t>=HpD(936b8ZVHCGkJ)dI-W`^^AWI>7tV zNmsVkN!H_9zGO_k2sV-1*KdERDv z&SHD6%y8c4hpuP;2*qVF{%6)P%w=t$5@_ROfMR+A(h11MgziJ>o9BjBQ;HVgWnSrt zcIkeOX>-8nrU=^vnBS^s14%#yOOVBVa;)MlX#%~-R_11herbCBW`R`dW^U?nmT5=b zu`{N~uz7)ZE=-%9OSXtHqlRgFZfPI(Vq#=!iT3I1>EN{K9i56UrQu9fXY)KE zA)GKk>uRTd>b%}-`)nw`-lZgqiCe&iJvgviDC|AR1W-_Hp;2p%rrG(pf+@l3$ELLq zeE|yoLF2${qD(T+{_IQ$ZP6a>(Jq5bFzwS$ZPQ-uGH7kre(f)C?Hq{h*q&|Men#BJ z?c3gM-j)LY-~Mgj4sPKdZr!Hs-LCE8KJFnfgFtC+=N2TKk{s#2-cGJ=>ptfYgzk2p zgf|Xp`I_9!wp`*K@8m{q^UiJa?rq>63ifXA9H3$Nj&J#%Z)dG17a035Q{|;~i$8Y=|7-+mk2N%q&gK)c(@bRSZ6JCMLPrauXukjnF@hGSAD!=k6w{k7V@-3J08XvnL4|6de^DxI= zL0&%pq50R@)`Ke`0L7U~w!q&6^m00{^DMt}JkN73?{Yrhb3gy{6$f)NA9O;$ZoHK| za6^)V?owe6(o~Lu8z6B&pL9yEbU?RrOg|V+uk%g+a!w~^Q15hB<}-jQb*p?FPqs2u zUv;Etbyt7&7LIj3k@Z85y-AI46)>Y_1@DqZ7405OU=Q{=6Hj8daAV&XYdm&)nnLPU zc42?^XZIIrcaOA*cI_rjYUiKwHLjO;;#zZ7A15MBb ztlM=*FM-;-5MOVd=e~D+Ps@Dochd0pBi{CL*Y;-T_8wPVt0wqvPn&9V9ES(@XJ4iN zKs@zgKX^_*cxyCfPj7gH&v;Sq_(8wh^wYTnPK^<00S4b?Y?etYcz0(2ad`*2%QJNt zV0I%lbx;TSVBgd&B=s?`)%$k#Z2tIUXAg;=mGG>2r6=}KNBRtK_*sPXjvw`3BRU&k z4@{@{VJ`x!{B*5{_@ifCbHa8!A$hYu`*cU)Gq-6aZ{vSejh5VX61coM=WnH_c&I=1 zrYGCG&-S?qL_4}8C;^Q*UN#ZUac|MDO3_@Z}s$2a`QcY4UL{K@xw%>Mwv zkNl~h98^bPg};=Tk?Ycb6Rag*SK}1N(}1_JYrS-N*R<-M9UN zr+wd_{jCrF(I2UofB(FPf5xu?`k(*$w}1RUf8^KkFb4=0EttS?GLWE? zgbEi%VMv8wnj{n|6o63iB1Vf57I5T9WWx*-E;0&8P;rL_2NqVcR4KvbO9e4u(u|qn z!_AyJcNQ$-6Ua}XLVpY`$`dEjqaXzKYi{9MrOn6~ zAWN?N_%i0qOOtL^nl&t6|t zeBUKc8cv~ae|Q)##~129?%#MsZ2SkHfCR>o1|3u+w;+QXO~8PI%`H|zW7*Y&U1Tgo zXCa0&b+{pjA%6H$PT|!CAA7HH<{pb+x!7J?_sK{`eKgv5297xvxFdo+9_R*-1_lY_ zk3;fUWP=h0u;c~?IH_bwBVG2>V>yvX8J06W@qvgVUdUmWnT0w3CYfJ`+1ZO}!e*Xc zE3Wv}jd2bqr;c?RDPSL%5GmxHed76JC4wb6Q3ooJvBxc(>|q9z6FTagV-I9d)B!AF zK%12kpw$pjV0!53r(yz7=BT8a3aY4NvbmaQDSCDv7<9@S=NduQdZeBN+PUk1x8AzR zAb~1KC`ny_q6;UmTNA@708tsHFR7B#JvQZ)r%fNfwAQ=%pKc@Y`H})23uMrA+kN^T3K!kmZr!@x!g>9B#sVrNUJOCfer8KVG!jag5l|~O}rDJ44Q}{;TeyL z#k(RCv8Y8WwvKmCGzzySlR*&Dpp0fbBN@?{#x*|f4I0cId{2ZQ{7$HgYjmLu_$Wge6!pRo6ml<%Y-G1g zNT>mTvXqOA9b|mhH>B~cm9Bi{DpP67Mk;duN=JCu3UawPHR^JgzWk*wc`3{fvhjjv ztQ|@~qD&Z~Fog#DBQ!xV1sFxS%1ra4JjOIpHmV)ay|Jo6cX%$&G?)%8CL6^V z(T94_jLnLo=SmpPfbvm=u;>H}w^Yq1Sre2)07(*dNCABk=1~nW0XdP=QbE#`o=H^c zMny@_#ViS-K3yqG1xTTv0<~HvJt{_#Ish5^bfCylDIQaL)TaJYC1krQ*&13=tok6A zToq~5c{vCT*|j|a^oyrcq$cje@yI>oMak*nF^BKHE{E#GYQsH{Ax z)sJh4PH>?#*TQ5Mw$h4eLLfN?{>C@4u>D9}XLwSZ_MoVRP3}H%z+CrX0lGt2Fk87P z+x|8ozMq6Jh+WHGx>Ak|UNJHM64s!){!-|!=zZ}zFN^{N7k9SCs_#d+u|mhx)UD3V zZy}q*1v>aBrg;r+b(c6?84{t%G;T731?pktIx)uGb*Cej5aA6!*g1VAz?CY>&3gZyIR!d1F^bq*VFY&Qw_*vAke@SrLip^NB%$c8?&U89TS zYaQ5z2#9la8=_ti2cffXrcj*UJJm*Zc+w*2GMT3wYATa=lea7NOlv&mJ8M|gP5QEj zt@Wp0ovy36b*pkj;$#;z*+IKzj!9$431C2jtYNmemS%ETN`;m9*=9 z-&MhOv?H(sOXStx}@s{rlVG^{P)#+tYNIw18ANTax(C#*08; z`o*;y;gU1G>EYHM)WHX*mQ(!>XoES{*IK#JwEce$9R%0zxh>*oH`kn-K9|cz6^Ld~25ufmFp!jK^3aX$Mx*!*BVHdXG7iOUt(jXa@p$*m`BA}rT zHUb;A;TkSNB=8^{%ApVTpdAX~5awYKy3rd{f>6weOt67KNYoQbpdnTvB68mwU?C%> zpcg)37(${XMxq%`VkN5KC8i-J&Y>H=;SPRc9D?EjZA}!(~IO-w_g5fS6<1qf>IhLa_-k>^~<2pj)GCm_6lA=7u zBR!t~B0d6PHBJ;TeM^XV<2Qz5IAY*9`eHkxBSNNQFutQgHl#8l<2*(rJWAv}+MoXA zV>J>XD`F!)VF^G&p+GvKI2PnVmZU>2Bubtn4l<-Wwxm5yBt=%FOj@KIQX@v*BTu`p5|LhCS2QS@@7!}<`|kLamJ-`E~j^XCwNZgcsgfn z<|TC6rh3vQ98hO<@{LadC3eoIcGf3%if4IhB68wqev+quo+p5&XLMrZbo%9c>Skcl zr+zA^eJ198c4vPIXN3M|fL7>){vcissD`d5ZXPItYAAz-XoEhegoY=7n&^I>sESgk zdA4Ya=HrGIrapG)fyO6je&vFWCRyqzgrcZZ`sj+LXpmkgkrt_JKIb=b=p%6d1C73C z6(p#F0;yq&W?CBQkd~;BTB(-0sD-vBfd*vm73gNd1QdYijY=txE@hhLD3-QqkGkob zUg?&yD3|VLjDo2xx@V0>DVnaSn)+#+!l|GR>YU1HogONZ-l?MUo}M}>pE@9+I_NT$s9@wVrFN)~OQK64lr$x4x^l{%N?DYq!$>YqU-)zEZ21 z9;=4}CcHK)z}joQ-mAdotHBa0>N)4S_N%-0s)?DS#pbH1K5NKU?7?2_$)YS_cC5#ONW;$O!$NEz$g9DYtjW&n#HOsi?jFY)sH4WL z!xn7BO03Ni?adyo&JHWk%4h?!EKPuFiY+bE3a!Y3Ytj}i(q66BN^Jx7EM>GTXU?qH z1})Z(Y|V;m)^4rJ;vj}{snde(%aSe4%B+h$DE{;S|tZQ~Ly{iJuv+e({w?edt?asP>~`+%qVDVFZsnG)w#M!4rY`WJE%Nd% z&gyRO`flLHrtN+r8VE1cYF*|=uh(&|_9`#)`X}9TZ}K*;_=Yd^#;h$&FRg;@r=ISF zZZG&AFZ^~d`7W={es84eEA_4~_R6X8s&4%Lul&w001q(zjxPaIE;OR=*QzgxSnvKm zFa*2r`yTKFQ*Z?fFyLaa1tV(yP8RzXuLNK41_!VR7qA99ZwVu?!glb-5>W)dFbs#V z{rWEnkMIfKunn6n{-*DN#;^~|Fc7D34hu06n=lFwu~f1v@OH)A_5N`G(r^(w@eCs| z6-O}+m#84}Fyef06Tk1~S}_=hu^3lzkp=_+A^8La6afDKEC2ui06+mi0RRa908I%T zh00T?f~sO6Ovq3cL4~UzvXV&4;jD`mC%V#@u_DHf5jlb!Nm8WAk_{=UT*)%kLYFB& zwtP7grp=h7a_Ss-kmt>xK7*bb3RI}kqcoE$UCOj))2Bso*7S(-q}8cct7Z);bt_h= zTAg+sOO~kFsA!R(`+JL#(yNF6FD1S)_VdNj zmw(Q^yZiR<*^^gKf4zO``12ct4LSQ}|Np@kAAs@|INp7h@u%N{2{w43fdmQ|;Dp{q z_~3;YB50n53@Yegh7}HIp@<`b2w{CFrl(?uCWh!@i6nxTVv93!xZ#Q(ewgEZFUm-v zgg?euLG-@ll1e7&qmxGNC?$?GLdj&1Jz81imQi-8 z=%IT?im0QB-nr;&nl!2@rG^5D<)>~=%ITwcR(k2CqlQYVsH}QwDx|NL|9azOijJr1 zs<676>aMxU>MO6EN(yYR#QqxSu)zwOEV8j0yW_ITM$7E9&06ZLt)NP)Ewt2DTPug$ zwz{pj-Fj>7wW-~zYqsRJ8*Z`R&U)&+{k`ihyttN&ZoH`W%Wq=pt~>6%1LJFMrvB1; zF1Yp*EQ-Sg=X)@{P$m3tlCT5}F}ob=yRX6@gG_OL4R74B#1Xf<@W>{L%<`QY$DH!R zpqRYz%E!KZvBeCQEbz%dlRWdpMC;XCu__~V6V{&nJ%bB;IIe_t*-+?to(x#^pqt~%(Iv!1hW zjgO8x=8(_s`scT&F8RK(_bz+ftJ@yD@Z#>Cd+4~|I63XQ4}ZMz$VV?Y@zndxv-8j= zpZ)Vf`~Exg)o;(e_|0Qa{`BE@o&Ngew{QOY@W)R!`ru!m_4)GSKmPo{v+uwA01Ti2 z2WY?j8SsDztW^L0$3Ox)@PP${p#CNpxcaH@f*6!w1U0z91ak0$Ak3fQG8jSam4V;Y|*2tGD(iGb8yAcrWQAmH(khD@X)moS7yIx++sP(dU`FiA*Sk^-2# zWCb!=$xeFmj)^2f5=1%5CX~{OSTLn3S9!`-HjGFeT{%VtUd5!^~wekJ$lc79aq&D-Y$8Mt0kAn>75@kuw zVurGuwG8G3mbuPNy0e!Ncqa#TsY@=*z@GTbCl|IL{|0{U^Pd34LO%maP*%e7paw-K z5yW6lbUO5*D2S*;CrVFs&ajShXtMOB zFfBk#V+ze@!nCF@1tvsy>d<525&}RC>Q9AA)S`xzq9vfHD^tnTraIN2Pu+q-r^?f+ zS{0*MMQTU4%GIux)C5XEYD-Zt)0Ud`tY~#61AL0ovbr^<^t@_ACmPRo+O@4loo8O} z+SQ3tb*X?2>|X~<*tyCztB9RISikC3#d>tB1088yCrgC2S~jhi&Fot@%h}B?R1DK7 zgJTU#TGH}$qj=q`YDb&YdRA5kgiWYy@hRBC|5EjqIz4P+`^s3}GB&KhmF#4Pds*TZ zSF^|MY;sep+?NiN4xE^VF-uF`U7l8+dR^^mwMyEk&i1=cwQVi!dDRNYGO`%eXA_>A z1cvUmx5f3Xbx|tIlb3vWTUhw{S|H811vm(QsW;xTj&Uj9;hn2uyF#vU-^c``Q zsjT2Z8(O9U_$-&ZypcIj;Gkl@?PD98*924=&5_RNdHLL9RzmpAa9(9kA020x+PMUl zt}alytLLtgm$ndyXpSjM=*;G~u!nB$mZ7`oJ&-!aqMUS@&Ai}Y_tl|pPPS}Ay=mR% zxx9DerU9Tn2NH4{YojTbkH*&9RO_t?a1+)Y+_tw!Ep` z+gVqe*4Wmpq>;&O6?^vEybiauft_h3n>p1Cj<>tnE#Xe5lf%o7c%~sua1^*#*ccb- zwDBs+e4ALfkqxUD=-}QZU)$er|NU>kx!g?M+I!b z=d%9!%az>mdq=t3X`OVWgKKn;rxf5LZ*dn|4sT3f8Udy*_sxL~^l`)c)L`F%MaQo7 z3V(FkL&t7j`)y-Hr}gDnkGnh5j`W;DUFvsMbD#Gf1_1Y+=coL;;0I6m4g3A@hX;3; z7r*kxJ6^+(k38ZFPx()~QqEq_eAvPMb+bPkt7i}K$y@LM04PB2E_J$Fam)phyIuxV zpDU*q--+7W{`R_d)m1k3RIJFZ}9T zU-H<`ei|lU`R;q+`=|uJ|3AI&{lJRd3FuG1Ezddcd(WN@)15erDZhO#+CK|XFai(s z&;S1K9|tV}fB`sw0$6}R@P7vQe^dZ|*Vlm7cYhE_c=$Jg6u5vEc!Bwsf$GNu9Jqi< z6h{09f*go|B$$9E$N~hIf+z?BE7*b`paC%Wf-)F`G+2W(c!ML5gF5JfD%gW1cz!_0 zNJ2P-KPd^>>M2c!**sfow>AYxs$87>c4eidR^Qa`=O& zNQbAmigDt#` zi=Nntpy-Uy7>%$vjnvqRtf-2tSdBvnd06IPg6DdJ@Cv*jj^tR5x)+RQD2=4}cU@+V z0|1_W=vY0w36oxJY=# zH;&T>U>vxJIOqV8h>?=mhm?qZytjPw7?SpAdk2}1515W9`HbpljkBnTcW99u36n4B zlBo!XWeAbN|Cf;X$B=^PkQtT*0k(a|$9R3$lBsBi*rIOlau(BVCj`3zyx8SlNsm+CzpiP^^HOaj}r-gNr{w4iH%G7kx+S; zeHWEeIeY|}iC3wTSP6?&xRr$2m4%x7e`9%;X?cr;cw&h+l&(jSt5}CN zAeWjsmvyO^ci9PX0FXI=((OLz@F{-o?_XN0r-9M37NV%aZSdKZ7Gh!I1Tfl3jnGP zjU%AeFre&Epaz!24-qP%{&}GsilH95p&%NfBI=*8 zK%yqIgz= zq>O;1dw`^lU`1O=pSQVvk!fGMd5Ol?2fQ$$`d|pvOK&I_rrUaU% zW4fjg$`4xlrf?dkayqAUx~2J0r~BZccB-d*+NNCkpMM&tf;y;#3Z{Z;sPurSii)O; z|Jtb7unyD!sgmlbk4mYNYN?lssg$Y%w z>ZM%jrg%E5{Xna-+NZd>r-bUKhnlFq`m4Yiti39%#9FMcdaSKlpy{xz%6bmW`V7wc ztkN2-)QY3hP_5XSt=+J#ncA(Knu1VDpA>nYe+7~JNqkz0sI0oK$?B`IYOA~ouemy} z^ct^)8mz|(sKaWk{EDpp+OE?YumY>C1lz6LYOo0Fs8aBxRPdNgfSYJZuHD6!OnI)f zm#SOJt{N+_?z*S)>JRhqv3Yu{9$T{Zx~u!ztZJ&S{i>=h3$Q9Xurgb)G<&c%|9i6u zo2g#_t_|A);u^7}TB`dwjHwEy8#}WC%d#R1p|@ZUce=DATdyaZvM`&kEc>!pi?3B1 zvq%fA*BT5pi?d;yvy!^A1NeqKX^U_rv=#dbM4Pcj8@EThsR#P5OADZF3bj!ywY*BT zGMlx48@OE?sa!j_V=J~~JE>N{u$8z3Y3q|trgv;{wj>z`Sqiti|I52DtGOTh zpPqZX$Q!=UE4s_uyw3Z+&r7}X+pVsvh*3bFu{*nCkiFWwmY>PJx(B}ME5B<>pyYeL z2;8^HyS{(hzVPe53>?4n%ewSyz1VAR{TsQPHo3Tau>vf<8*8@-e7*}T!43StD4fC( zJi#p7x@O0iHo3nT>|9EgrJKYmY{b*s z!mL}r3|W?q+XA$ka<)sk-mAkqjKp1PygyvLV4S{6yuwUe#;1G6W}LKROvXp-#AIu> z_In0r+XFUG#kPi@l3STL?50D!#f*BuUmV7AI<;TQ#%b)vE4;>S|BT2@oVZZ@sY+Rv zGt5%KHnI8%z#iPki_F8m>&1c0x0=kzEUd^&EXs|1$}Swokeq*Z>~^lqZ+M)?LmR+? z>c^aX%lYcbpS-svY{-ZF%fbN6rR>X_Y|3yP#dC}Ut^CS}7R$0c%b6U?w%o;=OTx(8 zrqYbY!o1Dg{L97M&8Cd7kDLX`yv)nBy|+utwLHzN>cb>^4G;>?%sbDDO3zvg&R~nr z`K-^jtj($$&J^6J3wyS*>##gv&dG(&SggC*9MHIY%YQ1*5GVRg9|6J2Hebe9U&pNHqJ8jG~ zX^mS@Z2VQyayGfX*w8H9(;Yq2OHI=_-PBO6)TlhwAYGp#Ey-7QRim_lT?U*+018H% z)K1ORQC-$%P1ZRr)hu1r9eCA3jaG7H&<8yT;OeDfJ=JQR*JrKQW6je~z1MsV*a^$l z;mUy{t!)N&n`6n8co+!lir0Z1*=YUOf~^dGec8J(43@pw(LmXi9n+Ex*^0}vZf$f3 zwNDi_mO9AT4WNU1z`NNX+MPYyv>n0_O0FF&E5O#-QB(0r_A5}4dD5W-vB+_RakOaExAnQ-m2Z& zW8mD+{o3?R-2y(|1Ww@t9^e(8;T(S9(mmLuJ%s>f+-6l?@9p3a4ukVu-YnkYE{@^% zZQ&h0u<4o@1``yAij^k3^ zNPUTY`$KkIwvOw% z{^_1B=)TVDoet`u9_v<4*jKGe?x*0UH0eeD;I0k^u?-HyKI^+4?bLqjz&`B3zU|!J z?cV-s&3p>efE(%aH5Ue(l*V?BHJS_x|hnuI+p+52R2{ zjGluXNbV(&+=bTV?{;PD>zOZdjk>E^0GeaA7y}MIX>DZ}cwz^iFT{G%xmH5B5ke z-8)}^pX!G0HA<*<^+R6r4_oP`*N9i(^+%ugct7?@Z}xuw_hk>-IX|gVzxEzkfoRrI z&aCbY!0JT*xzrR;WA{HF)z<_{3r1P-i5tYEKY1P>-O*sz#Gh!K@R>o(D1G>jRCZLG-A zV@GKkMN%Xg^5aR6C{3m;$#SI1mM>+(q#4sCHJsRV?p(*S=TDzN(Fr9guc*8|Qg-l& zfg=hPrc9t_+2W*0k_uTPOn^Y-MAH^wTg)KqB1u`aLrOHz;A8|_Ds+q}aKP3|O@()bEsj$Hx(l;e35bDz>Njx3`)83H_JzjYTlf5Y164zr&hhn#RS)_ zIy$tS(xo+8F?6^np{=8Y|82M};L5FQ0mI$H;DY-lUK}uA1&Tt-d&% z$nUqm{F8CG0BaQRMg((QX-DgNWKc&Sb(C<(?Ixtq!WdqYYBcw7D-T5UMl35fubPa{ zE#I7I@kJ@0_pT30QUY z)j$WO)zDmU4OUk&hwWBaU?+{#+i#0K7E@%kMT*m9S?~@Gs!S9k)>HYMV_IsjwAMvi z59L9_PlUuf9|;#&LZ`LQfhuI-raC3K3c@QY8blo8tVgul^iO+f$O89L;JxpS z(1b%|U=fdkLL#p4fl6#4=_J@LPo-`PZg5=0)WQJ^?EpK$ue9}~>-qa_qG&&X--U%!q4X8iqFbJfk zGj=KsgAWz@Qfg8(mQsajOl{gwoMyGBVEU<@;x)xMnkp*;z2H&L$(6LN^PsMDCsZN& zR;pHYs#c}zChw`$t@6|uT@9*J#xR5_0v4nu#ZA~?H!XGg4_a+?D_k8b*Cs-?|E`k7 zYh{bUS7DO!tQ|6GQWuBAi>VcowyMihUD{a6&UKoK%IQ^Ao7$aPHm~NmY$&CY$g?dsn@ZgN14VOJCop+ue@zsQ0O(Vn<8d z9$lLP0#eyS>L8DPo?s%r_$gXTbVYz<0UUv z&&%A49=N^ijc$W|YFkkm7IFBE<5@wwIN^>8z@=^2fC>Cz1FKiL=vDA(%`0NrW|g|Z zWLAX9(;+zW_P6gz4PrBl20I4$h#pRFh)axM68|{G4wf#FxBA}d_LVB3{~cRrnIab& zUk}6m)v(Ai@C76B7{opfvXFs1WSN1Po9@}DTf);b`=*AhIv{IT_7`QQ=D3+y{?|6N zyydu_*u-7lbB~W9=8LWvsJK1zeqn4@?Lrx?hE8dmtxV@T`3~}~mi7y1x4PETrZ%mseQiMFGZRP#^{7y%%ms*bx1CTl2k(b5 zPp@*x%Wig^qb==9XWMwUwl%itooij^JG$HMwN;kI+p5S;+*V9N|5#0F><^@S&|J#0 zyWwqbO+&oidH(ag@om|&#W!ay26ng)?r~&_JK6`B6(>toj99G@xAkPZcea;3Ju>0#2+I!!} zZg!-r9q?xlBHQ)7?~K14?sJzr2klOBwgKH5ey9A(-;E5Tr(N)Y=X}KpU*wAy-pFqM z6vqqhp2pK%^{P~n-SMvX%8T9d&4_*GDcu zUir(nz3!cl`?)d0^U|OG^C2F3&>z01zW;rR0?x?c8{p%Quglhx&-~f{-TJ%NeD15i ze)uz;$lQ-QZzW9p0t}!0$G0*PCXfEG13>k2zxEq30*pWH%f1A}6{kzQuBpGT0k>cy zi}qkV6!@p&doQH<9|@=nuM|B15KOwO z%R<>%B^Y2PB+#QD%&RaI!2#qwGZe!kG`u8CK>FJm|6tRf>48Hmu)^@09ToVPB{4Y< z^g-Dh!!kTTA>cbiF zLo)nC>H|el97IwC#Ih^JP)x%@TtJ>`z!%gw9@2^#cow^JLNXu&I>bUP%)cPOLwE@w zPYlLD97a>5wv$LjRb0h2WW@$s!dHyJDMOVIh>|(zlU&?IO5{Q>1Vdr$#@jo^*CH7( zLPc^cM_D_>&_PFLY{o@I9f0dN1kk!$OpiUdMqSLtvf0J}#4sLQFmOTawB%nZz3;0C_@Ot0ijf*eh-Ovl1BOnpO4Ukf$HG`V?^)RWu_oA|^bUA(Zl ztVP_U0dDM0)zA#R$>cmx5@pT>{VK7!L2`PPd!!#xyU*;*O$?pU-Xzdg(8}@r$v-Sn z1YOS)bo&-&9*iewt zj4lOD%OLYcJ{Xa?#Q9sSn9{p5ZQ;IHK ziZo-)xIB#`eE_ha8qV|R&vGA{fyRW z?NnS1%WBP4eZ$u01XiA_!E1y|CEbWeg)WorBz!+Smc>fk5$)pwbp!N*w$gRhs{L{Jg0w} z(1vsuM`eM0)x(R$*o+O?jUBIZEm(owNI(2jpdDF~U09=Z9#{<0l!aIeWIff9$49i- zX0_Ryg;tJD*MbdNtQA^?b+&6TSyoNjrVLw^Y+9KuIjEglw6)2dty-Ry)~$WpK;;Bc z?KY(C)`*ozhfD#jGh4aI}?QK~at|Hf0@)n#4F_1oAz-p$3`+)Z9jU0mKp!#c^<9Y{-p1JhZ|3dt4T z)g@bh6Bz~gK;#YIO}$-XAm8PkU6Fm>-PPKDD?LSGO!n|BE^ZU{t%`yUSmeatNCg-+&chgC$_}ZC(TZ zU<(l{W>MhM7=-VmgG(RXaa8@^%myumLk~6k{boV|KT}~3$$f;qtc9d_=0t^JMBc|YerJU4&v;&FRla6!reugl zO;Y(c|5(;%I$~KZ2xMyjgZC2B)E!>B6lHck=!E7}hrVWRbYy~zXL^3CSCuk zLSe0*D|ldm%U+Nk=*qORc6R5IezlaI=a$CZh_+{QV523wRyrdpzI=o}tquJ+)UM#ml=>zE!irl#phyd5-l<}qE=rK(M4!ho!%(Zu!YKO1U2 znjF0@-(%S8zRm=|eu%&xY{D*V!4?d|PHe?Sh{fh>!j|X9wv21o1G1iM%ckr-$b?(a zY|X~(&fWvi&g{?zZ95q4GU$TSR%$O^Jh0to_*j8kYz2*qV2QO&X&%?eUTodo?E)%n z|KHApG5~JjE(7BJg5o}I<38>jP*6{9Zs&IH4p{5xo^CW20_uiD8n|v+#_sLz?iJu} z4DfF7{_gP>Z}K*8^pPgMqQa0fSV2!C)1e~}2Ua0{pK1jq0T&+rZJa1ZBj5Fc=w1OoYv zx|1|@ml$DAP;gOA94aGaw9)- zAJ=dtPjV(l@+M#MC68G`ZE-5Eaw}JHHw38g1JhNwgK~Bzb9O;1a%(j;8gX^h|0oyn zCtq_Yr&%X|b2g82IiK?o-=ZsTF+88IJ8$tUw`ejo1Jb^35{O{RL{h8eD$?8-RgQ=k*)-^&bHCU>9~`Cvjsxc2+8OWS?(kZ}w$(c4tp< zuIZ<*A|`8}x@*sNY_ImIyJV@09i`<(Wx{Dramq@Z0z+5U$5eOMVE1*07k6)WRgrgk z_f>mGN&32XeAjn=@ArM@8fgi5eGm9!M@nh0%}XElXJ2@PS9phi_=ab8|Haevgr9Ot z52v$!lGfe|A((@6?hs;aRhBgL7##R!uXkTP`F{8HUI%!We|cMnJeZ%4SWgv!C-@go za-qR_ghz7`-*qHA_$7~cp?`EQ6*(Z9Thj`lu6}CtH|A=pS-v9mFNA`cW zd=VyoZ$JJQ$9$~6f=BH7&z~K#xclIre&Kg~ofe6s|Ne>>fATMX z^T++(2m0Xe{t`!i>za7?XX-5Q^YE(@>kWYC|NL2ub+HEs2?7Ta#Gt`L3Kl2nECCJsvqb<%=|5s5{O#%Ma?C{(6SrbeM!)#}wLSSvs%(DmzruwutD@M;$9SpgJG zsBrMW0^EXf=hAgscP@yF6Zi7vxY6(5z<_`5ENu8NVw;3<|1NIqI4R_)l8Zh?I{ETa ztXZjWc7ug0S+t=?CrEpit%A34SKnpb`t^a-u<r-?C=IUifGM-quik$U?1V9sqMiySmafG|l&7)A3L_Y`+G=N=X4si0uf6ihXM?@&iYKuO z21>`E+l7E=qRlS)$sTi90VTDDHUO7G{I!}Xw(^mfD!Ac_yXv^*jtMTSuIk61u2#5f zYZdUyJMWHgvBx2k2rm>>AYn4fC8zvuyjsxv|8l;X9=s|Yb zYfOH2o)O-S0Oy=5sIc3|1`0RabQ^3a7F!^w8SBL*=Q`{5X=HbQ0~m|9g9Xy%jh_$~c4Im0^GavfkHigqgDtzL5q4=IcF&Vzl zDK6|BXq+&HF)&302f0O}axf20NZ}ep^kI_@H-gP+ssXyIp$n5J#Tyw;iB_!QjIemc z!E7;#-lCXlAi}*BB<+JVAmbU)m_{|SagA=&VE5uEg_UXTU9eIe{EB7<6iO&`r0W6; zt0kova^+ek%3=%;>BK@3ppi3lqJv6+!#ybB3n10_baDWW zH03E#2_nJ;u9d4qW^0b&QiCIjA1`~q`b>l;`cE^rAM~w@-YYk_0eBDNeIl(*Nn8 z0-IB%GDpeInG#`^@?=#}eM(S&#&bO1f?#m8HlJZ`ihGb-K~;0|OY}hWp}uq%5h{w& zmNs$=XPmXV~C!lFSGaA$zHuXd`P+)!Bg(Z>Dz*Yu%Akruj*;o2v!eBU zo2VvUl{Ht%(spN(O%M3N?Zrz~k#hQllpr{2Zc|DX^xH>WjtTi7uqPdAPsHV4W<*jWs zbe2I7$T<)~XLVhg1RFN?eS=-EDYZM@;u^I(1yyPjC~MHh1~;zFE#Y4m9AE}(n8IXG zSrHs{SrA?!s5OPD{}NoV-02!NxwuuaIyYRx2({L=2C;9XT1?%7;a3d&r2~+E%!MK2 z_rUWBWfPJ*Q}RlLVjSl1F+Ds~9Vb`?D@g}_kMNT@mtxu zSTC2=r`Y@_dzZk5w7M1(acOIgColtavSp-()w2sYz!o%{V916(bc*d-+zxquPtH) zb5fgm?P>oW|9xH=FxJrxo~L=yJyA2rY??mk)~yX-x4q^%sev|WuK_&hO(UDj5>B;= zL2X=1FZfY`?I)N8yliTBIRwQ;<>?|Wadl7J;8xT&nKN$Y`;B>Qmb;uD<{$`>lf2#0 zf)>gp=v0AMyyg9VdBX=jaZk_uyyo?e%U3L7itoJHzZrGSJIwRGUg~;AKl;lk*In>N zs*mFnie_K?t?8J?*t<``hDw z22fPdlNaBn)3c}dq&F^tDZwtr1Apzo=K$$_H$2m|wQ-JLVd;@`e0LA9C4^c`PFCI8 z<#knu|IKsW4pF}Y9^@c;(Eow-c{n{EQV;g1e;oC$SH0uhzx`?dc|+ho|A6TK|Bc-u4B+h%U?UWu z?j<1aah)v)p92b?@kQYBO(60yO7C36r0@y#Vc#PpUk7R*2zs9gh9CEl;0VTF{h^== zrXUN_-|M{~494IJ%Ao(bU=7}2=>;JFDFWF6AOh|n5C)+F4j~b4T>~Cr@JXN&Djx+V z{{shA!e-b2W*tC)Fa%b;!5eU(2X0{qw!!vw9~PdV7?$7+wxAi>AP%CT8m?g)wxJuo zp%3by5cc34{-6Lt0v_7o9TwpNBH{2^!x9E!6J|{nW))OffJgOG7HT0Edf*p6;uuDv zB+}p+vSB4&A{=I-CB~s99)cWxA{~O_9vUDi@}V9YVITHh0|KHTwj%On%^P&lnv_V@ zEaC??Vi%GjBu*kPcA_t0Vjccs4hkbD5@Rrq;wdJhDI%jXreg6upeu5rRPhqVqyU-N zA|vMFE_z`vieMQ6qcMi#F^VHOj-xs9U^Av8Gaeu+4k0wYV>C|VyH#V-pa&GV|D6_U zqb{;tH|`@iZsIToq(By9IToZrp5rpAV?r*ZA2#F>MkDdXq8hnUTwr59>f_pNqd#t> z{88dT668mMq(~xUD3;5YE+HJ046B3-5`-N-Vq`{gUrz2MNA@H@ z4kSsIB-)`PQ5I!Lnxs&w*N@X)rrCe5JL>kjfwg_J4Wo&4rO@`o2x*b>sW>}8o zP^x8G8YVj?CSjhXD7K|zJ|S>Agsh>Vzk6Njqt|)bGDVH9^oZ4xfF6y2tW1gldltSvC^681PX`ohV zp_T`iW@wQn>Z5)rYno}Jo@t~~>ZnSprKakj`eBx~K!9$lU399af+?t;s;QPLs@|%u z?k5tis!e7p$H?leGAgm!seIxDwM zYV8Hzlmcs<4y&@tr=oT%vZAZEUY)x3DvxTZp$;gulB=lJ|0=GwYqDmmzCJ6Difen$ zYq`>@x%wi$=Bu_EY{4dMwQkC*PAkBM=E2(Qz9Q_z-mAr~Yo+q5e{xX6YNou(X~61V z$PVneV(i66EXr1_#+q!ux@x=%=%j!wyD(uOsEX(F>#)hlQwy4a~ti;}Iy5g+R z60OdHtGiaKpi)z`dMvC~&CiZ3(28u$R;|tYDaB^((eCWhaxJtTgwHDNlag%7V(qpL ztp%R_PkR>$nQ+*aq#@*6l)SZQDkyEueu9H0{d{Xw;@`*-ow97Ou`3u1!iy z&jxGYGAr5MsnsGbyGkzJvaPdn?B4>e*v>8CMy}bS|1ITKuH{lH8~E$f+GFENYU-}8 z=eF+Wt}X1w?%B$&>v}?}_AS^l?&fmtc0#W2f-db2F7T$U=oT#BE^geqEo8DT^VaU~ zzV7HoFY!(^IxqN2Z}^UH=nij=BCYj)g6WFO_U^9tzHjqB zul!Cf`F?NxnlIhXF2$m+Ch#v@vH{$lu57d~{BB+R+Asa$@BJ5x% zPVjnWuLVo!3YYBT+OQ1MFb4~94Fj=4t}nQxB`|aPunPyV5j$}aQ*ZGe)oG;CF~XwRxG zyLM^Qw{Y3UolCc^SFl~RiY1GeW!}Aa`=;ePxRl(&h!5LUyqGc7x{#qpPE7f)UciDg zW40W4bLGyBLyLAhnsjN?k0pO54BE5n*Oy_lJ`L0HYTLJQ(?*?oa_!!^gSXZ!J2vsz zyOZlyzMQ%5=fI;Y=REv4b>qmLH`l(MJMZ7ny(j;_?w7pv>e$f>7f*_P_wV7|XNPRQ zesTNh@2>~HU;caP?Ewhifbor&pLz(Eci@8a5!hgV|M@2&e-S>I;Drh@h+%~mLdfBV z6ix`@dm3)2pNSrJXjqCPiWs7UE2lf;P!#p^+x4XqxjuI%$@i z8oKGFmfE@Kr;-v{X{V2pnkuNGlBlYurN;mI>Zz>OiRr4c;+m_bx>8DOsKCw&>#nHw z`fIJN+N!Lv!}`iAv&SNP>$K?U@~p7LIt#6|0WRxpuqwiG%eBpBTW+-6e(NH+#cqr3 zyXk`KC%flr3op9yQVZR<_tx94zoz1wZ!3%ztZsJV(hKmy0v~Mf!v8$OX-0#2k zW-RZ-13P@NxmSkV@W}dZob0F{Gb}R38k6jDy!^V$GROhf{PN8mODwa>EAxyq$2pt) z^UN(59rV%3rcAWYHZMK&(?VOUG}BOf9QD;Z8%?#-RwIqIcv5ez^(RfUjB?p%SKW2i zVNc!j+iR+plC*!Dx4tm|Qvu=Cqn%@b#?3`ZC zd+osce!J_!=RSP5=q`RbD6t3syYtXTPyF$tSO5I=(q~V-_Qp@o{rBFpx;*yGlMnv+ z#iPG{`0SHDzWMO0AHV$F*H8cY2JU|U{`~jv|Nr*Go&ErrzBv@|fCNk+0vDJ-#l5e5 zm;hY_AxObJOppx~ES~`}I0p_g&x0HE1P4P%LJgYmaV4~%3ir^c+NCgq4K!gO^gsq0 z+AxGM#9xj`xWP5}@P|DdVGaL*IK(L!@d-y<0uq-P1SS^YiA{836sIUfCU(JySHxl# zx5z~*bn%N?45JvwXvHL!@r+SWVj9t?#x}Zfidn2871=0*I@ zyde)?xWe;^$pj@xBqA4y0v9xL29As*Bqhm65?FErn9L*vG`Y!6axw&;*u17Tv-wFpdUJ_ifMgkFFwSxkp`3x-A|C(u9CK^Ev-aG0c(+sq`m61v=0z5VW8NMQA~{c*|Hev7rsMWG>Dt9z`WcJ*r8Pj#Q*0U1l^>T2clqz@;lysZ3)^)0*1!rZ$x*MR&T( zd*V~05%8%f^+{Bq7ImK=Rpca9>CmP+m8nmKs#K>6(W>^6r&!HsQnzZ-uCjCj9Q|rM z#ro2+n)R$`O{-eJiqo~W^{p_?DG{cTgG#zHt4IAQTZ@`kzS7gHcCBhu2TRz(TJ@Cv zoakNgic!FJG^Av8tXNGT27#s(r9sWCTQ>_=&Bpb!oCR%XX^P6q!h)_9UF=Sc3Rutf z)wO`-0%UzDOT+)#_O^#*Y%d)eSldeWw~;kzSR<*|%%UK)$aSklMY~t#Iv1{7sO%W% z0E%hs0hFp;?NIgl*XF)90o;`=C883V;;|zmmyB5R4IJn z^C~u%?bUE^xys~>wwT0VJ#LUg9LxDqIi&@_tbVtAUoO9Rr2;4|foWW0=5aW??<_HE zdmP@z&Oraj6DD$zb4+LZ_HvsisArS+{9q{8Hv+0ms6M4zO)tN=$=-EwXQMk~GA9fa z*F>1)m>Z7zuzk7%sW)4xSikCSYisj4YyInBzj^?{Kt8|Lr*8E;lYQD|Py0;OoN#+; zo3C(>`+k)G_XgNq*w;Qew+Y;BHdynn-PUy{Dlz!N8=mmrPQ2p1&G^PIUhs#1MdT+> zdBh*y@tAKkd^Mkj&U=2kpbtanL!X7xdx7GjM}6v5zi(Kw-t=8Rvh2e?_S&Dl1$Q5T z)ML(Lq{lSKGZq6iF}ljlKi=`3KmF>@pnTY`@%hkqLK?kD{py?k^TzLk_A}4@?Pve{ zaR5L6_Qy~D&!d42=TCq5%g_GwH~;F(8Ya>aL| z_D%!Ve(Q&R=VyNm$OK04fDjmg4mg1nSb_Lge%_aX38;Y_xPb^5f9|(`|2KW^XMrZj z11N|CDY$|v7y~WPf-VSyF$e=Q$O1N~dpP(38lZzb*n>OxgBAdUK`4YnNQ6b0dr0Vm zIk<#0*o014gWNQHkThSgG~5>VmO9mxPr<@ejS*G>!*eu zsD5quhFUm&Sr~$JScl7Jhp#7sdN_i7*oP-$as=>e8RYi z;#ZB-7>C%Xi+K2n+}MfDXMr+?Z2*^xsTYoefQ*P2exUe@f=G$1D2AmMe#EGZ^tg=n z2#ol+hSPYB*{Fd2xQ*TDjdQ4t|A>M3c#oG?dOGL@N@R;zR)yp!dVL^~zUX+M_>M;C zj_(+cG&Ya*h>#$8keSDi0I7}L7>lFmij$a;EZLGu_>vkqgC?kdy2p?);E)0ThGveq zhR2wYTWE?ZDTC~IfxGC8MtPKwhm;~YlEFukC25i;>4)stiW*s!D+!ZWX_Xp4eKpyT zB$tyBDUn6lla2S2Q)!84Ih4{@luDVD>6mzJX_5Qrlu#L!0x6Y|h>BEMh+5f~e)*0r z=tV+_lK`fZo>#y} z=b4`Bxt>acP;dnDSq1ay1NHd>_?e%Uh?=U&nlR>?h{=ookPrG`5A|T62b!SQ zpr8y|5Ao2T?f{_@iVp=kpcZDLW+M_~h4MlpSL~5i;x};3nqyb_L znD7KLX_Ghkfc^=Q0J@9OD0mi%pc49^U>c@knxtg9qX}A}9h#>7pr&a`p(OgIBFdt2 zI;UPr4|aN|Uy7$@s;6bzr$~AZfBFo7N)3TJsD@go(Lkt*+70Xf(5Q#%sF3=gbp?-9 zYLi!rQ-&#)uvw8EIiPv!pko@UqS~it$`5S1q4sd9ZR)0Q%Brr)qI}Aya~i9(TC1db ztB)$ExvHzYx~snWtH3IzQZS`d(4WHhkT;d7pZAO=TA-ggs?Zv(cbclEdaBK;s%zS+ z+KQ&H3ahqSr{Ef{-#V_i+N6jYtmvAqk-Dy9I;=BTsVW$b`jw?xdU>AetkRmV`ud{W zimfWT5B>_U0=uov0gDf}(4yJ8vi%yf2D`B3O0y3Cd$W6butSQnJZrJ)nz1;* ze;#|OxJa*@8VAjKvirKU)C#jI`?63=umdZ#Hfyd3E2}u0wdMM-J?pbwyRMTOnDB}N z@;X`~JDK(huKN10DciKF`mfa*wJi7DcN?)28w_9TwbE(@X_t~j zTeMhsnCE!3CJU--`?#U{w5Qs#u1dFZE3=l%t+N`deM_Wz`?-AExq&;nkP5VB#Gi)? zT4!6YjMunI3%ORIU2gUOS*y^yj~l&EwHhu3$lf2v?Qy2 zruw?DTc|iHyOS%mPP@5f>bG~hx7r)Jz5BeP3%tVrE4)`=b^N&m9cu(KMrm)gx|^D| z&g;FAE4|n{zqTv0xXY*C`>Wi$zwrCJ(g41H8@?DztX6shOOU=OhH)3gdI8F%uG_y% zE5GzR!BIQ2xtqTj%)c7!zZ?v}!Ard5YXp{xy#KjasyDKRhqMn2!ROke5=_Cgo4GNp zxis6s9t^!YyTLYm!#+#6F&M&A@Pes(R_uGUm9WAr+``ctvoJivPHewwo550yy;Pj8 zI$Xs(9Khi#53~Tn#j3IKiUlBLw#w_i@0-M>+Qe$yt&TgzSp3Ft{JS}v#adj)c6`Sa z>%(FTk3%cQ!8UZz zybHRyz?`u7tIEV&%)!dasoct0yb73Xtm=!UCVYpBTX-`T#ks7@yF8>O`@k>y%ia6U z;LN|qJkEey&gQ(R=&a1i?8@w_$Hl9V5lG9moTU}Hi*=gB>732_e8}re&gbmU{|wOk zEYOtNW|8NJit+sqJ11@e5-nhU3TG9-SRXcdpHQ5O~V0SMF2Uva8 zY8};2ZPjkg)^Od{AdL=leb7G)uTk)oUp-(DmIPsqdprPoxtG+}tkr8B*N8pUUn|uv zP1VDY(~Ovuz?cPUS-TBSh^KIYv?cfal;1N#W5YFG0 zO^X0t+nlvjeXUdnKHUip-(rg0&`{#laN;K3;3`hxEH2?LKH)G<+>bru_}${Lt>5wx zshY6d8Gh8xt-6}s;UE6qEARv!oZ|bv;x%sLOa9_c{^U?j<55246)wCxe&Jrd*HdQT zTR8%qP2^XQ+S!ogV~*lxUJOc}=1d;rRL6BjSb?)c_?9+3oWzN;-&8=hY z4cJZq=8(SVrq1Z79_gw+=a-J;tnTWTj_GtP2%5f@ji}+RmQ_O@;uv7$>8q~nukP%r9_`Ei>vs;u#%k;0*y)pWfPWt9fj;U~5a>VH=)f-Q zy1Wd@4(sU-?bF`u?#}M&4)4;AyGRP zKkv-`?hGIA@}BSz|M2Y|?Cg38wGMx`DAan^Q$hHE9Z%|DTJ8ov@(v&I3g6Tc-|#8F z@+E)r*M0G0K!N-J1mvFXZh$W6AW!l--|{B!@+$xHEHCguKk+RM^Aq)R7$5A|$c^~G-W zTHp0t|Lk)g_jV8WJ}=(mZS=_oTeOz+xV>H8j`QK3_PG!aZ6Eb`pZ9Wq_jF(PjlcMe zuitaP_j~SIe?NrB%2v7 zQgRU^CW#K1C1j42*g%7mL0KH^l;9(mLvY!G3ME?9D7t0UkS%DG ztW~2iwW_t7SFl&JZVju9?Aftj%dS<+*6rJ_V$;rri`K3{yao^E)yvQ?(7z5LPNbMI zW63QqJw~8V;e>(|YsgHQvqt4*9azRJhDno$gAq8r@a&l>FxR7UQ>$j(x-Q+jZDG%r zRy#KTYT2iA?|$9ecU;*p`uxV!(3LvFxt25YXc=Mal&rp90p zPcjHoT8R#qnvk$F@r(eChw?~E;V1P%6!AUwN_4M3-t1E`zZ6Ye@kAI=^iMzl7h7bJL@l$t(#smd z#Bt2^ylIFG=3+36i3G#gXff-sEAj~swj%;F6BfkKNeZF-Pf98SwQ^7_2^F+UFb_5V zbjuh6BvVWRPt$QCFK}pqO*Y+JlQAK)qth}xm&}vN3^&ZlPe2vzMb$4EWwky;W0m#Q zM7f02QE_m6w9GSq*n!dmHLWmDP94l{50gXyXfQ2RTB}^uT5K1sbw5{U zwYA!BTYXDca&P5Tur#Bn^wKsJ`*j0&J1wF}$&^JQRGTi%_gR~GiZWb)ug!K~ZM`kH z+iepTSHE)2jdVRUfwlCai;hgp!XQ-|$wPbb-OvJO!|>3KbE!3xTY*z1SmA&Tb{X7- zQ5M(XTxs4F-5sN=7>gl#UeGb=x^TDSQAuF1*~0oQt!0>Hb{gTPV}6-ssT&6W&}ORv zvnc0wH-od-1~XpvUb0CI%~X-kBiZDVqo$hax8bgO<%6@X8SA#;!Def&+x-#Vv6UQK zhO$Q(k_nJGOk?D{*{1tx$P0CQYPlb-Jo32izWQdo8;`i}%`)SxCDK`H!i`}EKN@lJ z()QPK$1#7L^2uqBTXx(z?;LjJROovn>VOpc&azc6{OH8_RlD)njhX%V+$E3xa@%j8 z(r)Z^hdAAe*xgx#mx5eidHskxXA*`d*8{lQ9tOZOnwujUj-qUKm0Lod(C+c#k}DEwF(80Q{^LJ z0S$=27ATN`4fI6|A9#!i#*l)ws~+!YxS#uFPlp&ZM=_Q_IEi8EgW<#22#rWU-mdGL;pgGAJsz;we? z9Vb1hJSR3%m8C@GFl|`ORVLDvtvqBMgLoJV?UGY7z+_AC7)`FmA#wTx+JNop9Kk%nV~}^aw5Fqku6^Q^rk<-DbO{V)1U<NE`yH~kPfH5odRHi8PF?0 zk;+%U5_Yhj73^p&XH>(URk2NFET(q$zW{awruMYwCNB#zO+luodj)N1>-JYunwGS} zCGJmCo6?dgRjnO-C`G@P1gg?Dby#JPO`M?ByrzS<|OAB1omN&q{TyA^T7tU~h8zN#6)xXTs;ev3~jcWA0*k z$2`t*mvs!}APe%mUUY42?ddhzUS^CDJb6aQ87y~xmMwPG331aX}nr zAqRRKgC;U9Au1g+OSiVg;|xZv%YrE1cg_{&v!1;iUjJIU&v?!-p#LoBL9a9u6NBVa zIq0`AcBB(&c5~4PXjv%7`2bTMQJrml<4SY7#~Rl3rhWZuFn=1+r$>}sF`YP5GE$sGIg~WEh%LP%US~Krt_^Eg6ln7 z8Q7P;cD=D}ZF+xr+uRl@ie#pbfQtp5_k=6Dsngd-PY;*7QM&qy2MD|dIqVK{M$TO8vt-*?UV?QisYoZ#l; z`N2u}^D!p;ho;idx|im-mb?7UG-rC#^Brt{N4?k{d?~6$PV%cmTixuQ7R#0X^onbF z=3(cYy={K>K;!(G{!?Psv0m_#pPb|?NV2#+8b+V z*!JA*<~BLebvtRi=Uwl6|9fJ^4tS^!9w<}q--++E__vdf2*qkVrW$_q$V)!;$Y4D) zTK{_3yB^<{ul(3;uX)0YI_Ivf`g%eC?{kD}-3VwXI@ecEdD>&X_R7b7?qOMmcSW+f zFiAYZ)ocL87eM=tKHP@Rz&hh69WdgLJ@S*keDiBOJ%aC{`rZG2_^$vG_yEqv* z1_L?|)V>5zfdK?R)Kfqc>@E~sKzWP66+A!YOFyt{zTBff&^b0vxg{t2K5V*rT{GlD(!z|ps5p16^48$@- zLqa@5GlV%_W5cmyLN|Ovhls=an?q!?L!qG;Ho(F@6p1bTK`%5qA#emi3`IpGlTi${ zL2Sh3V?-H*!@fZfj@Y?t(t2^osh!O0s&Qv^n2 z{KaHM#Z^2;P=my^vpN*(2_vZ&KJ3F8YM&&EUaa6|4E64Sd0y*q~D5Qc{d@Kae#3zVH zTFk~9SOQKw13=tIfHcSdLv%s-_(zPqNOWYzbeumJW5>0c!cM7-IhzA{e8>=N5{U#P zU9?D~Q`^aWw#YhB}AwqzK6drg)6EZLfmK3@Sz$)d5f{EO$p7T)ISCoJfcO62UAI-86%wtIzDzPVUT4;gn3`?9U23 zPTt$h6Nt^zNk{|b0zP~Iy=;ty#4PM;O8o52r}WP5G))S%P^a`y@f0*&s7xGCpyrCr z6a&Dw+mI!)#b~3uGN?8CY|;A!&kMZ~45dkO>gX4@VwMz0QOHYDFT04P8_J~o)P3_bivxPShR6z~Zy~&DLA}R&U)`eJxX8Js5xGQ)ehwQ3VE39WHfE*LBUx3p_|u^U)uT)}*Z0 zdo9xc^XON8%~)^^*l;ydb99D+6;y)-22w@Xgk4xvY}Xo`#E|&CXeCk`kTfeu8I8qM zDD7B|WrkcRSCSoBgFV3aQP`73*=1!_U86SgPGv7y8$n z^;oSvL}K+>pZ(LmBU+)Qz&%h@eu>j}ychPI$4vY|Tcr#fkhC1Qim9zzo5fk~1XPjr z*-*^|zr~HJ9NVEq*|Kfe@_ZJVYFS5hw56q3#|uKp5E#3i+~Lexyrs%y2vx7G1+WF$ zz#UxB4c(%3*P~@w>6}hj1=7#7fTw~Cb%|TZjatf`U2%;|thHQD-P@k^TW9#&A{1Qz z;1%6rE8J)t13H9MUBXKgz@uhsHMU*d*8PAb*v257+qO9#d{t?6u`pON=yC*4kl?a?UO$q6=tViXjS~I6UfAn85I#l!?ce`Z!Ok6E z&wa`RM&R62;CD4%=cG+myCl7Bh04H01_oVc~V*(v8^vcbq8b z;(|v2TTr=TF3jTVI=%eu;>7&o6%65yh^L63|o>u4WfB*;pH|xyC!!5In-8;Ty zOx{yp<>NjM<6B-vP!?o!5ak7q;nNL4dG)1;u;2}7<)o3cSe9j(+~hxgW@wJ)&*f#& z^<@J?wCrQl%z%PDumu|~W>zLr9$sc<_C{xJAzL=nX*uUk&gD-oU$Y%%NUcJ5q2gMw z;&8^|WNtWeE@vOcWoZs*uiIsUw&pYzx$YnqEs)@EHUR<9L1flqe%@C9f1c%zWal%) zXo1dN7^UX%ouz9QP`6VtCCC9YU<6G7B1aVidHo|-hTL^C){6FF)6nRR=4hM-Pl5*B zZ5m~HHaGM{YVoEovvmk{!o#g*JdN?N;(}& zlChUQJ(>PzcP{Ij2IwSCD79W|wr*>;W^04Eg_>3>PAD`(OI*b*M!K1CCpH&TxXq4?77Ya#%^rKer(1rgT}UlOpt8LE`!U)>@U!4&hG5Z{%k1#ZPAXy z(H?DrB<<4h)Gom~QXWgYR4%Z2Eq0`@V1dj&JwQZ~g9X|K{)g25`?P$n-JXCuApsOmGF~ znw*hBq)gq@1qIz+=qfe?Lyk^y{%=Xs@cZg;59ja?4{;EWZxJtX6Blq4A8{2wy%SII z`ljv|r|(N?#o{LJcd>CC&v6|O&@I60!axS;OENRRXwpLDdO z^h&>UOwV*pUrJ8jbWhjKKXTQLxJ*(XbyK$`REH_V5SBNU*uKo901)pq$MEXJR!gkJ zTFP~})pcIq%L4oL-@P+#yW>G@q}g#a4B>bzCR+aHk9f(f50& zc6|Tke9w13SF5ln)|Oc3I}WXA4(znFs5TUwDGo_=sl#ga7zs&-u+td0&^Z zOeeLQ4{(?!HJ&FmqmNyNj|_~TZyCo!Q~UUkXZm}!0j0n6`)c~4uXwI^_NI^e!|VA! zFZ+SlaW}Xw6f@>xQG@1=`FE%Jsy`2|ulun7`HbIry$=C~H+rPE`-r!CsvrEj_r$;7 zd%eGOUpf50uXM!E`^Go?$A5gq2mHmydYljShKKxx9|4^Y_;cs;*EDz1Z(_A~b;axJ z=Vs8EUmef~cWdwVW5@W|ulqMkvD$G@A%74|L|Xb_7{Km zZ-4cNf6SkM`j7t_sDJ#o|MTa)f&>T_F^mu_7=_6a9xVhSbkf416DkoWN~AcYVnsI& zDJ+1{v4F>rA4f*ufP#bxloJH71nCmxgP0O5(41-WCeEBXHSp{S;wMm`H;ND~YBb?d zAWC5fOz|No)TmCIE*)yaD%Pw&v~umb)hpPrFT`FgTf;0>v}e__{aV$mL56W5KE%=R z?!vqc>ssvV7okRuBwvag?D8;TmMI(mILJ_QC*;VI8%LIE`E63nMw?!q`t-ABvZ6;b zEp7TV>eOvlt7ffPLqWS$_u|#7&^BG#2X|x4h$c+n!om#`Z)rRMOv;ZZFUP?Axy}R9 zrz@Zi{qfYy+B1hn-Fa+U@Zm|5cfHp9_9sYn^KLKE3;g&Nfy@8RhJG6R`1Rk9<3D&} ziLEqXamOjv!vNPQ_(XNeDcInH);S2_gv@2<7KWN_HXetdb@-ud<(((qS?-Z>B8n-d zcm|98x%l6UeaOgPj4--kBaS%&DBuP>5*Xld$hB7 zl~r1)9Eh#Gre${{beUyW7pXY^W{YK-S)-0KqM;_5X|`F(j>skU#2kCrnL~mJ1hA(8 zKpx20kVIyno`*vo(N=>SJ_+TNjb8aEq>f4&DU}{_dFiDdeEAcZoqD>)i=n!R363LRGA_P5C(aBd{0U>$TY#U7mKV(T=w<{*d}SK!H~k21-HBy3k1x+!NjEs^A+%})9( zrO`?|Ews`q=_Rt*Zh0tCV0hc>x8aKW=^A>NscNX?zIQH)`myS2tcT5NE4`%F8_O!8 zOz~^5M-o+`PXRYqB%{t6TrI-X9-Q#P4L^Hrpy5JM#l#g`Ve!QoYcXz$9Dj0OogACU z?wR(+iGZxBn*8p)tcbGz2fsn?AaKDoJ8UzD@|fX{Omdy5#tYID_pZz;EL~$F%gZqXyX?R|o87aM0HCe*+Gn@z_Q6cU(QDCl z+l_S6c<1fw(jxnvYP;wP{+|w4r%)>>TeIx7*PsXj>`O^hbX$nHQEr>Im}j1)rJG~h zIp_gq@b=p6jr`{#S3cQ$2UycOR|v-V(o|-qYsF(YN0s18wHa zC@Y_};&3|8c;hn23OPz!aAE!RSY)C7_T7h3ANaP5Pdn{BBqgSa<G`MvJ+dGM zF<3YeaIk|O{NO-9SOO77UJqR-_;9H6aKD096AWSP90> zfr8ZYlkyZ;0V1-ojg+yV8`Fp%5j21T4^Y7^t^qSWe&J3O%-j&_C`drYAdPWUU>l7@ zFq$#4k!5=%BprFk>ZCwXNOX?fo`}g!a*~r!{A3kFsXL$GFeMjcpcwxn#^^!rjA#^+ z+Dgg61StUjWg}FhA#F(qG3@e|xO63-HW(`rB%y;k*nu!V_{(MHNmG(sYuqb0IUnw&_4S)g%l-x0uP`GBo(LlP)PciQqP+&6Vppqjd9hs?7f;O|GG07-H zW0*jXYO|mSOlUVz8pv6CR9F!DB1bIR#hEs=rOsgzIV(980p?VvQ|u{F-zgm-bh4=M z48j_QfY9Yh^acBTYS+%7sfh|y049-{DQDnIxOGTLpCE6#7+ES$}-6&dHnO1|I zV5tlLMJo=wXv|~U(x%HnhvIFgc@H0lu} zi%$@)wF~;(XRiDSiy{=1stz5foJl%COLW=-!I#;5kA zsulDuX*n>_Ue>RdpB?L-5{g@k)^?fFyRK}5S;#!KRdQIU<5$<~+tKRwv+(tAe1nTy z{Y|iRP#^VzzMl!@N-d6V+#{`wrhQ187cMz1JA)? z(9LCUxq3oF@-@CWrZSOH3Dq%1p_b_b2LPipn`W=Q=)KzGrrdley^@2p$f@_D$`y@Izq;Wa9d($fNR!Kg$3Jps8+ z*ae}sYLva*+O|IVk7a%{vE?h^2G2OU=2rE+)m`iw&v{R}uBN-qch!E@ z@M>mgo_y<;$OQ2TO;CJ-H;uPzd7Hs^W4z-IML0?CEOJQyQ3hIVx4`MW?@All&x5^? z!(;9i;AN~Ro=XV0a<20%@*HY)x`f2-RPmq-z33F5IMRgT?Pj2^UqKGBxgVUf7}z<_>wtH? z^F8lo;FaHZGq*hW-4A-;1K<;{_{B565tMj51_oPl}&&2zr~CLqhWGyWyD$FnH{S7*I6wN+KY7X@ zz5Siv{O98@|76g={WdAPc(R`h8w3%%2R_ z9}Uu<7W_t8=oz6L0G)ix8~mU%*q#jzApsVl074)VCZQ6l!3I|Upc7&s6oTLdKH(IK zpaxnY7D}NOZs7?U0w64c7bb!jc3}&?U>TZW5aLW>~f!&>f zQbd-~{GR|4A?z6;0WP5+4q_Hkp&?cwA|4_aE@C2*AtQbvBu1hmu3!pIA|;+-8fKyk zsv!)zVGVNL4;syFNLI28%EdVc5cXjJ{vqudpzZx2A;w}9DqGBA-nmJJeEf-4YLMr4+wxlLHq&&hTM0(yMObjGF3ZDM9-YNlRtCQ%k8YMQ2R_9k$qCTk97Yrdvq!shGA=Gxe1RW_${=B93T z=4k$Aa8f5}Rws56r*;-6cOoY>0^l0JAra9gdDiCPz1}`PCv@_qF7jq}3g>&q=XS#9 ze0Hbgy(LCIW}`tP+EAr>=I4KIW_u3kZdzw)(&tg0rhFo3eKP23;wOMc=y$@Na`tC{ zN@yVzs8;snff}fXF6f6gsEE3xcVZ}1?&oZlCuK0FiDIaRp682pD2U4Fbt>qLI_QYn zCwxw5i&E%9q^OGW1dLuNSQ06Lo~3BgXoxER>5?|-jp}HQvLlaDqg*Nkkg6z)8fk)d zC40uGjTR}GGHIAPDVaVgj@Bnk_UK(!XwUekmcA*6mg$ztshQSklrm_Vs_BV>r+C(7 zkHTpecBz-r>6nVCozCfis$f-0LrDyin)siNwtzA8vgr>kyiuXd`h=4Yrj z2d$bXMi$_$;_9!qs;aW8v*zluu3xYMYo4~~u=;7TGV7&2tFA_Cw@z!UYUivnj1UZ7 zwkoSxf~&SRE4M3XkPB>x}s~6ervn(tG|XTwZ`hW*6U1^>bVN) zBJL}^eyO`QthzpIl+G)*9<079?7vJuWB7;%kKJtjQWJ%I<8^E^W=S zAIq}i@9<}vo=DN=YsE4`x^67fS}oFYt)%BYi@A*5}I#tYi>vIxdv@t*Acg$l8McAujF?ZSmeN?N+YMYOe9-uDU`l%pz~{RxkBh z@6j%=^4hNR?r!sXFZ2fMrUkEsithJbFZOCL_nz>ls@!teI}F96do`wnpZD(dT&Z~B^V0;4bg2C)A=a05HA1VeE5R`Bx@r}V<^vFa`Z zcW?xMFbGd@{EBb^3vdZ5@Z=qE&v@_xvvBtIZwSY*44W_w*D&XLF0J~2C$un9X5jwL zFbM~-4FfR|b8r#2YzxvbCBaU~&k^tsAF&XRFceQQ3{$cEs${5|j=?aEU(1f&STtyVUy2zfnPz6$UMXyzDd(JP z#%ZUUPGb3{o}_V!W}0f!8EBh?3gw9=i1I0@pKvxhXqS-wS!bbmQaWj*Fgm&@po~6x zr=^Nkieaammg?!HsD7H~o|0zj>ZYc`|9UE@tI{eeskq7-tFEo4YU{16k~r(G#17l5 zs>p73i+Ql*YAmL{Mw@J{z*ei-ve-VWZL!iG`)jD7WxFk}-gZlFxziFlF1OH{>u$P- zCTgg>;8JT_Wz9OfuD{b!Q%V*p-i7y62q_ZZ_tklYaW^u%{lo?5fi~yW^qfPPFNO9_~A_ z@!J0T@WJ0+yzs~;&wA@`H&49t(DVMh@yAbZ{q@*qPrdTnJA51S(Yr4F_}yz?efiv{ zul~;Bhfn_d=Er|N>gca8f9>qI55N2S*Y7|5_WNJ{GT44|IaW)8y2yLNKB#68Z?4kj6;{p`aat61=r7m~L%SdwIm%t3AFozj|3KWx=$PA_lfT;vs zHj|KC5TqEkFwJOM^P1Sif;P8_NN5t02;dB-ILRo^XpVE4y-cSq*U8RyqO%0=jHf)6 zc>#Lbvz`;U=P~nn|IB7CV4uk}KtKojPk|bg0tZbfLhoo$QaaR@rOc!n)k#rG8uOyd zgn&jjno*8=bfXEtr$~V*hF^}eo7{Y6O1-&KmY(#beuQa7b2(FY&hwt=^e0aFxl^9* zvZnwIDna4M0G zQ;L$&oQfFpoaz*)%it!fs1jfwQ94rrErvIPW=J z()zZs5n%3YTN_)IYInPT?dxTyXshybyLOd2LGvPDtduX_cvZ*X!P{?smLm z&8B=uOyADVG?b83u3R7KU6>MBwUEu{a<2=~1>4xQt`qmqpnZrxoad)E` z| zDxd4j{;8{)=Y(QQPaEY zUAsXHz83OfCrx8fo155Lg)g&}y>982Rng8S_l&hX;5yek*0sj=UQ1g|Y>s&X`R=x0 z*&J>+V7RI+K4-bly-CHZCm@=0!J#YF$>~YhdiO$ z|15YHI*?N%`?=xQWiQO(IrEo`GzqOv@wz9P*`8;ZztRr6!-r1vV^jO%2aY+&_wDhX z2K?kGCwP!I&1r;#*xzHwdKk7YV#{X1>s+U%*2f<9vZvwO1y4KL*Ut8}ll|>t&-2cI zE_7Gdz36y<_)+Pc=30-y0f6rz~2!Jnmf8}?6sz-x1NQ3H^emS^)EBJmr=!5Xrf$bxzph=MqTgouHLc!)-rh#Xjmi-?Fv|7d{}C=ZAgBhn#qcujgi`7mBFoc%OHNrig~9xQTqBbi3o{E7>lqdi?j%f zidcw<$7^P|b#2BAl~;L}cZZ!gjH7<$lngVRWj)_9HB zn2o1Mdq5<857>W3U|UVsUAy>+z9@~Gr++cPglqVQZ`h7pxP4i0cE`w!_V|p|n2+bT zjhd*6{>X|(NQ(zJkOaAo26>RRh=}lKhqD)ZqxfH0pnYMGeSJWQl~|6R2aLg(b@n%l z2w9K`IfwLEkN8NEC8>=!$d5cojQ_auhcsD}H3^dk|G9Mr368l4UY3}3 zL3WNCd3N*nh)O7dw#a^&calK)kos7PvZs=%*pDq4h_2X?)+dlS8IxSum0tOkFsY8g zH<97UWj^_CT=!pTKzbC$kyu%PTZxnwNPfm>lIU2MkVgf0>6A~2l2XZ%Rk?~T`H~+A zmhfnph{=wH`E?b@lWZVrB#4nfsgZ3NeH|EysdNOIxtWK>nVyM7U=W(AM1Rh=3CGBn zqzFW&*^qsil7G39fhm}`c$IKz1GZTMx0#zMu$xQBo4(nbzZsk}DV)Ozl4OYkWZ9D! zDVcF_my>4?x_~X#Af3~x4%E3U)oGpDxt-YAo%Fz+_%IFk|KJbgIiBWOp6GcG;%T1Z zxt{0Ap77b8@;RUK33;$!pUvWU`MIC`*`F;GJ^vY?GPFV-^g@mhLI>&+3A&(}kSGnR zpbyHR4a%SgTA_Aep@MLs8Y%}Hx}j#E1|J%tB8r(UAb(>?k!HD^x^_}&Ig*q~p7ju; zGCHF)I-~J$qcxhN?SP{+8lLI-qd=Mu{Q#r-zz;!sq(hpdLb{|%%A`*Eqdr=sQVN|^ zTBTNcrSp)bT8gDx%B4E`r8~-_;vlAEiVb6$4rZFBWx5V)dZzBcrfS-zZORGfwUc7$ zn27O&maw@da9Z-5`r}7{Qb((!9Y6M$go60F( zdzz6i3aFm?slp1Zgqo;Astd-Ntd6>@%=)OA>a3OetXe9q&l;widac9yscnyuiPunN1d;fkZPTB{{`oa*>(d3sRn>Z0x{o&!s-o?5K>dJB!JulumC z{o1cOik;W$uLQfY|Jtbri?9qEvohPT4!aJt|5~mS8?m{nt~kb=&RL|u%CQ}*rHJ~m zS=yu`Te3Xh?}_ffVPgiw2_Os zOW$Un{z!Yoo}Ey*o;@%j>+&ySnbH zw3#Zsa9h1kYrW{3x!H@iR?E4>=LIY<1)eLup-a4=SiZ-5zNVYHBD=nj>!WNNy>|=2 z_B+88Ot;;7yZNiXG|RtPsh2x@mILgk1}qN<9H%BMre%w-4E(%IE5G=Azb-7h6@0=k ze8JIh!x@ah;ra=Bd#)bLv$wWZr`4ioC%UAo!H28B3%tTp+QKqy!8IJiFf74SoWnWH z!`yeAX5?EXOt+$*nBQf()mX+`)RRqRPgL82iVF zT+8Siqo<6@tjnpZJj-;<$c_xhw4BVcip6${$Me|5ARNNQJIX=}%shIw=t;7V8o3W_ z%&@%3woA^)JkHK+#hQ=<(kziWYjWEL#*i0e*sRUk+@pkx5BYozX-vPa8_VW=&H_!t z=nTa;oX#}s3Afz4@Ep(9OpldH!ZmBp&3w=VP0Gt`&UGHOYOonoz%EH(%yTgCcRyK#sd)2*8O8wO39MvAZ z*2rhVF|UD%O5*{m(ukFD6Q z{o1QN+pS&Ov@O!?9L3(W#vc#eLkWecQ?%+i%_6A3Y4R?cA`< z+_s(5x^36IEnP!L1-~uaQvXQW$erBFJ>Jz#-O?T1=k3_#z24>xrHsf9}uhHEA8+rgdR z-!0ey&fXkO;0b=<9UkHv?%&UB*;j32m8Ed@JpwC^-=dv`dO+O#J>$kr4An5=I47p5p@!ByQjAdv(0xlkSYu@CK4(F}@9HQ?kxuDk%;`Is#augfUdCbc zedHIe=orB0ZO-bD{_3;-?6My1(mv$jfkw7%`!p6%C827a#9o*wMqS67Et zS=Qv+AD{zL7zSz%2FxDs)2{9Fe(l|k?cSd6_-^ZM4(^@)je(w`>xJ%=MM=hP0VVqG z&hF;&e&Y_m@X%iG5wGj|zVG*b@fc6<6i??G?(2VUt0Fn<_;z9kkLn8F@DMNYDnIcX zpYax7@h%_pE&tE!YY^`7cdkDe>OO@_7ZpyXj_Ah@05G2NDBlZ2Ki<@y^tJBBG7s}j z|MV-*?|AF)U{3CUM(ky--S|}UUU2dZfAnDg@H5ZyOAqzCe)eWR_V(WE3mx)=H1dV6 z;_GMui7xb4cm>iP_Ie-nX|MK9|Mz^q_Ab40yY4NLVOe|?7^zIWwrqi*h75A+UT@;vbPc;D#FuKAfC`0b{J=&}tYSkNFbgw+%#gjS5^kt|N0QgIT7>J~0D zE=1sJ0!D)mMV5>uON0m=v{_x0U|YgM1E~&1Wa(o>fm{qnWFi#^?%>~LH!lv(_!4K~ zoQXNERH>NpW5|&a9~NABGUcE|Gb=UPmvd6kd_zxZI#ufFs!7J^D6xe@g|1(Vu%W$& zjsMoQs@1Y?3zkWXw{)G{eXCcrU*yR>0}i~<`E$&dGh22nxw>`i*%wQv-krMU(BV6e z7Y~}L>EBGETxG9>#01#yAIv5*Wz8Dgxpn7e9ehOax`@lmJLZ~$&cN#ki;lnq8`O?L z?jD2?Lh`_?usjTlAq_pKPFrmU)q11ggb?Pd?Y{h!5Mwv5`hyF&x#D0#K;x9Nak*X! zL{P^F7j*DP9D$UuMAD*bpGmL=^E$k-rw*djIiD z2k@$qOi0T-6HYcIZSzu0E0vQ%B$Kpr$qe(PDh3=-Lu1q=L>!bp4^lAn&_uh0(TPgH z#4DFOgN#(0I47la(>F5}c33rmHM34olg-tgWi?dc$*7{mqKP!9j18>&>U$N@SQRy5 z)&L#FbyrJ${nglGKP7hEa(hKL-A<7eM_mj>jf#a1rFD&nt>P>3huSc?4c2abi$Si` z8V$2Ba@}qBT*Hcem)(aep7^_XGiFv zYno@y8E2crp0j6;%Wjse9Y7{ky+bM+e4m0%8|8|)4(hFBU`Q?uv`}M@lUL0+;)s|d@ zRFU2?ciw&HTvnHbzg2XI^g-~1qFl`(wieipPK26ga(|5Xcgd<&uZKP(44QF5$@8Pgi!OOx9huFgcCQyuDB;y!imqZq-5Kj=qf%QD3LqX+_ zidM{`2JNB&D0&f$yaHkv%SggMnsIdvMB@tMCz>U)kyKCI0d0~t!_2{_iVX0c9A{M= z9l~sneB5LaJt@LZ29i>RBxNZ<^)zTf@pgcMj|;3NNlI1{e^$C<jjURnSPklPl$bG9rs@#vsx>wLj3__iCj3!Je8d8l$HKRDC zYE?Pf(T~DJr(2C3Nrh@sH$0Ln+>=TLbRb1$GId50^+K5BB2$`5)v8m)>Q(g_PQ2z- zuXCjtPflF z*Fy$&i(dGu1l#hqu^LpRGQ0q{DiUQxIMI65wE9A+ zY7?7S48nG4Y@MwFQczpl?zXd-oo;TW3s~d*mZykJ+mnd8ulphPxGTjX)Xe+J*ruVm zD}Zivse4_{#&@strEgueTiM{23QFiK>S2vLh1pt^45W zM%cl=rSN@w3RFg_r#<2QuhLNKy_Z^Lz3ttGf+Y;!%br-bD#k90UHqxW#n{3=&2NT# zm#UUt(6|L1@KOnk$pgofCnYv-4)(U+{B3aiMb*c)B|+mjM-Gs6lCWg=$(U#XwH-jy z7_j!Wv)$xwYdhbf_V%#D4drnURf2YACI7mcIYooR#>?`qb~-?f?R)c^%=^|i#V6kH ze}_BZA=|KrnVE1oCOo2$V>rFfK`w|#{NfU~II&%>=3Xb--!sp68H_FPqL~}y?Or!5 zzXF1H$9vvVaQMTGZf}*h9K}j!`N}a4T#a{^+*Gi0$soA^tnb{CQVTlOqdoMZr`&Hx z9|tm+VRp3tBJKEQdc~c73Bo6DZ@H`~0?Q((2xAf0u<2fpWm&pOw&==G8l zo$NOf``R79_@=+T?Mr{T+$|q-MT7ebQa@+83v2a*6Mpc5|G43UX9EC$9rCMJJL}K> z_}9Ze@|2(a>|uWUxtF=_cE|g-_5beOqNy|VqUZVW6^_TRBVP55cYX6^AN$$38%{AJS`Ve(!n`*`APj_2L_V zEBY^h;9ExihGRYfM8DR1zV^es1C%`K<2?n;yr`Q$q2W8K)39loqbr)V{L8aF8;jFR zy#O3Q5F|k8i#`%;K=oU|61=++oG*BIKL&ikaMK0(1HNR-o@Pp>hEjsvK>_!u8~z(V z+VMa!2|*$h!Sq8x_DjGdWH|@ClNqd@fvbuUv9ymXn9=J$EX14);6MNzLL+PjFbu;l zOhF}FLbgLfGrT-Cyge7}J^wfJi);88D9kzVY9@x7oQJwX{=32d+mpn@nlUWG6)eCb zEW^qp!!%sOr)xvadx|+Uup88XPkEDVA^l&zuTAwdMiP{b!ROhiQ-#9zFS7Cc3~lfzZ4Luk@M z`#6I+XvS%i#r{))T3oAY1H@d^#a%SSL(IluT*PAJJny?Rw{gWS?1F5u4e*=AX-qs) zxJGvbMna571JuSd^u=_c$5A9k7~IDwGe+-IHa;8x30TGx*+YZWL>aInuCv8?+XZYC z!-vF2d(6jPgvVfHL;pAA$BgVLf7CA~nlq|Hs~h||ZLtm7fW|BwNFcBp0NR^Uj7XTI zNM7{Di+o9&w8)x_JdJ#vjr_Kb#JSp$#N=zn^$-}8RK}GIi%uN6c8p1aD*jmeZqXAr0Ox2Xi#+=A`giOke&5XQ-pL`<&v!8=Y0t8zw z+7Z3cOv^kvP5(z&O^7Vc*M!ZPY)#ih&Zv}4VysQ6ILUE5EIjNl;X_CfSppzCO(954 z;`~koWX^M0&gO(Z=RD6S69p+aEz%;HYALr2>Pz|TOY=HNYvF;zLzylT&bI7NoIFnP zR8H~?(DFpj$;`?NQzW2lB(cg(8$7MnIxp;OCC?EHmORYv1W)4x(6{VR0VPlm{m;rw zLIXWT+BCK>@JI>_N{{=KJ2ZQt(E~-$ z6OF(Wy-WsWQP^;(7sbGJbE|XH!W+;|=HkyC%~Bu@QXv)55hYRt^{G8jMfzb<<1;uE zAOJ1Y0RQwtm<)h7Kgm%oozw8_QZM~dJgrJF4b$|5&LtfJ*3!EDlT!IW%PQ40{lb6_ z3Nt$O(RxhIExl7m-BUf~Q#acKKYdRu;L7lGB_$A)bKAiiwE@#CmA1lC|Kw3sT~$f_ z(MaXeNgX>&EmBJDQxuIe53#f}?bJ1GsyG$0Mh(_ig;k5HRb#bP8jPEQ+tqdJLG*$E zXWgJuWyTRpRaU)LVI5Xt%~Oo5R9f}cV+A)%1xM4+RFO=_!30$}Ra7AORYhg5Y;Dz8 z-PT97Q+X{#aLw0m)z>{8*JM>zUG3ERY*QGRg6#xWYfac5o!7VXPHhdfS>@Mog$I9~ zy8ri#PeDyrK6BT%Qdn$_S68LikS)-CmDq_bHgc^${M$LRR7W?x&@VGNkiA#PtXGiymhXk?OQMW+p{IyNflf&Z62UajC3;S)Yz zCPrb+U14B|VqkcKSy(?Bo?$GW%;DY2>(vb@nik}81X9Rf{vBdY1P%cK;r}F7Vkgc$ z6K-NSmc2)iVmbx}YlPk_)>#{l-#N?S9@d>6YzjeUH@z)l9B^I1U1R4x&NoirICi{P zc!N5Y;x?EEa>?T?&SYlTV$8J79RAdm?Eq0O0Ie`%3kbR(EIBn+WH#2^MtEbXc3(vTNlzv`9o*GVH3K~`gJ1;)e8Whe_8i``Vn{n`*A1WLeQAvR@HJ{4qMOUF3K?V0m@ucb3OCpyNT1Vv&|r^W^4yK8B1o zEn7-mX5}6(XbNKP%Vq7dlMX6`_9=x1PnY&m1cvF$3d3EfXKN^lo84(#?rBy7YG6i` zQ8s`avs>UKt)*`2sa)uoX6aalNL>hoYqsR9)@q%O!(GPVP)4^7c!C@VfLX%Lu;s!I zIqR9lWDzZ3VB{Oc4kyLVgvNGk$bRfNk!*yBY|FlE%!ceS#sp93?90v(%T8O$e(V_I zn;5$VzS)DuQSD4XZP#w?*0zmX*n`-PZIc{R+Ysh5D3tkePyZWa)+*r=VQvLuyUq=? z(!myx;Y94w&TP4xkw$b{;?ZtVVoGT3hI=I-szfz1nV@D^n9F7Li>3K|&Y z^H%Tl7UlMKZ}^VyR+;Y=pzr#=Z~M+~{N8WA?Qi~;ZvY4ICK4zryVU}}IRsZwB^4S4 z|5;27zubNTJkSJzPDrx~SpU$^k~__L>+pB=@HhQ%5eIP+pV9d?aTMS16kl-_Z*d{q z@E0#}7oTw&uW=i{aU7TN5?`7GC-9UlEg%o_1sC$ZgK$=`0zuerOSs^1MQ6h_O})u+ zDUWd~uW}Ex@+-%3E#LAf?{Y8yaxj+~5N{eHFLN_L^Zy_J=DhBTE?5O5R|6bU`2VKPU7+KlCvNzLN53G;j0>(r6}l&ozf2XS{+C zc!BetUqdBa{<`kkt@m*i6Ul9c!fWBb5!_-r$b$rK>vxKc#7XIi?4W$&-IJXc)o_ki--4k zH>Y@P|hp+gaf12Ri zFFxaTp4VVYO!}7R!e{UAju-h#9C4O>dL{yQ887*&xB5L7d98PGu1}e1FAIL}%|`1! zTrYcDmnOCE>iI<12+)FZPKGf}Q=H#)?X+({N^e-bWeQBUwp=w{1D&#rn>e-XZc#EzZNL{OPac4)OdX`2Cx7_=_|DtPGrxXQks_G~KY$<-V+e^RC;}7^kZ|D)7z!R(fGFW1#flauV#E+p zLy8(eJ{AcHQY1+uOGv&*$wKAImM%NKya8h-OPMrp+RTYl=T4qIef|t8bSO|8F^wWk z>QO1vrcIxiJUOKWlYu<0TCEy2ij$KusE*j0wJX=MX33r%vxDJ6whP|EjliJ71iEn* zCcsPAp~Q_D{{r?Kcram@B@ZJWdH-}V%*Ko#|4@vhC}pRWFB7$_8MEZhWG7?IO10}( zur5PK9j$dW+9_zotcBqAF73H(Z{Ic%gCa-4g?|%v5d7kBjF2-U#|gqQ^X1N&a|WG! z`sSt8uP0?KUHj*&RL*`6pVmv3^5oB-Pov(A4%zN!%Z*h|haS4YMu;Dx5r>H)qIhD8 zE2`KcZ12G*UtKdAKwo|KwE%!$eEp{pVL%udV2?r;NMw;gBB`U2K|a@{lg}y0pkfe4 zSY?&iVQCf_u5C$Tmn5rvB1){WjTU<>vX2gSTBXlg zx73zka7t~p*MeGNwrp%0=C+@LyDh1!=0)EWpm1_ay6ful#2%WIafPjI%Ftg*Ty2C@ zL{3@x*Pg>Fi{G*X6C5zW2P^8^aa@{V#T5=itcA4^Q~R*B*iH+_m!EKZv6kU>n(DY~ zmTM~+>!J*+tgNiENB<6WlCWF8Mj?El!8hZav(7sw+jFxSOAG}PS`1w@(MKaavC>Oh zo2sWCYZxxKBA?hp$*uaCveqf1D<{3o)*QCjJo`*`!DcIZVH-#rEkqSs2~ z(@)=x@wa>T5ylC0*1E^m;}Q-FCbNj*@|=qo6hd!cLr!GmlM7t7ceX$-uXRP<$Aetxw-~*U3cqN4!-a9B}%sXcjScGAo@vR}x zomk2w&&NewiIl$-@f~;&%L%9 zbVvNQ52oXfKmXL7Cc!EJv{H?C0`#3Iyv8`X^e=%5T;TD@m%Q>kFoMa$5Ct`)JsqS5 zgVxhv_d4jo53HT`t4N9?B4_G5`)oVe#As zZTFxCpfPk;;+Gn)*sIRL(T#0n3=|!dMqQy~1$x}0k6cItJ_0h3f)peU*LOqv8S->T zh#v8Vut3KNPJkvNqT#xL#5(Eae+c;D9n;9fPEt{mO+3Ah8Y+f;q#Fs;3uDc)l3;)Go#ehsOh5lM~_w$ zLk3aeeW>`VA&QfC;oQVH0eZlC9^^(Q7@i9fcuNkzD3eJT#7G+;%f$f|s1v=VIu%II zcj6_eN;T*~cYuW-vXi2?#2Q0GfKM5e@dQaAz)+=1%&l%9qB9@}Q@y&MDZNobCs{!h zeE$VV1HBcRgUkU`1meh{=Cp~rOR4WzT7+`Kv;a7b;$REgL=#|=3xoA(Jne$3rMeWV zSOlU!D|rL)wiHq8PHjbS?mCt!m`pw-%0V3zU zm2qu@T;wA5u_oZDTE^hu;?Y65(bcLZIjDpt_>>6s#U)5wYTh}i1iVJoFA+YuLI3cc zR=wxV<%gk5-qJEowpEylRZ(};(rR^{oW-vb$9my*F3|=2eQa?5+q*POWWa$vZi=r) zqqf8|%7d7)7#v(*0%JKmwe|5x8xqLNXbyIauQdQT)`O{ND@jDHuPEn3^!q8>1oB`cpI)9gLRz-77sCwAs zVhyjYhV-ZBe#~Ie zl_WN{SOsJEG*CHB5INVxyAs~>OTddii%xm1(ah+MpFHVHHQ>p4$#h1$JnDO%`pc@$ zUZU@q;3@|JpWtUVuhZP%c@sN^vS;(x=^X88Upw39(Dt`ef)P9iI@{+?_q!)z5`NhG z9}0npN9g_UfFC^J17CQ;ui@pG>Vn$rCO@!yovwyt;bq8d`3p(D@&AzDyb3!{_Rr5R z^q@~4+4&Qh-3n4d_glS%gr>|j+=2A6U%S|6Z~Hu`o$t91#O`D7``_~c_`#Pu+=(Ce zL%;dXm_GHZZ+&i1AN$GB{xm>wnll(-jg_>7_P1|+z}F)E$uK-2 z+VB3y!+(ckznkdgKYHBXzV^A-fBx~HvHHsa{tcf10z$)}o&DV(00tle@?ZbifddMk zA?V%!QXucK-vm}*1ZH6INkRvDAo3+2^Vx#*MIQ-X-wB#u3aX&@jRg3;gas@CsaS#@ zsG#~4-ufM04#wXOGL8N5pbz?=1_mJkLZA>1;Sp|N680VuF8?4BHenGeVH8T?5=tNj zPGJ=;!Ut+$2y!78mSFTbLoT4;7^#~{rc;DQb2AP(wa;mOY%{NNob zU>iK45jr6s`e7gT-5*||AP!<65~39%q6HSaGmF4iJ9dgC`5 zA}{XZI2K|t8lyR$<0XFK2rlCoz5z4!Qe45+G*+WEYX2iP;^Q`kqdx8>K(f@DY*q(O?L zFp^{?qGUpc-Xu=mBS(5ASdQf|{v}`vW?-h}PZFkD3T0s;W?8mn zV>)JBLgpJv=K1N`%BN>` zrEeBzc!Fns-lu-@XL*w6f1+oAre|!6e~kj3Vin1|BZ3r*AN6n!;y|Mk#9cq>l1voO3p)On?k7ZajBNpsiD%TohmArt|%&s>7LH0!Tc$pBI=12>ZMj{rXK2|aw?vR=%bQp zqz25SQmUp>sd1iWr^>0Rvg)0>>Z^Jxtb*#Sim0e63#qoLpnjvQI%uNyDyD9#s`6^A zj$mt=sjaGMvff##w(6S>E1?4GNB*j>2J5p5E3vX=h$5@8EGx6>>a?0Aw07yLN-LJa z>9tyGx?(G>x}at9Mz?w^xLPW;p8u=4TIs#gE57RMzN#y_u4|xv=(Z-SpDH4`0_?XU zY`+?8wEC;UIxM5o>SOXLjmE3Io@$jotiAGUvu-TIX6(m8tg%k4q*7tUCTzIYYr|Hn z$L6cb{%eS~D|N!_!glP*rYZ-fY|hrK&T_2F1}M&gEQpTms1|H*9<0rxEYGrR&n~Uc z2JOoRtbvm3(NZna-mKCxZPRM))BY>eR&C5utjSt!(Q<9p?(E8zZPx;A-92Zqx~;?t zY|qRr&5rG^rmfRrt=YD$*H$h2#jT!&<}U0Ouh0JNkw5|L{qEJiZtPBP?H;b} z9&h#<@Ah&p)>`80dP46KZS+=e>00mgF0b^eZ}+k<@^+!7vS{-TEJrLK+LEsDx^Mg9 zFZP~o{-&@0b}Aak@4!AU`IayB&a3wR@BT6{0PFANw&egzZvFP}0VDAGHn0L~@CKhR z`YP`NLvWz7F6c(?lFaP~-){zEFs!OD2Zt~Ur|t;5E3kZm1+VZ0x9|5E0@*O8{KmY(C`2+&6_b_ z=A_AUr%#wVgZ}I(lxR_-K#z_}%G97!q&1sD#W}O2)vF^nW=-jGD^{;0t9GS2R;t*j zWQVF<%a+tsrElSyT`G4jTDo!X<}I7{t6#2w18WU?wlLqrb^q?|+qUuI#Ev6NcKcYb zWyY8hgB4|Xv**E}J8RB7xwPrgkWZ(sy!xr#%XndsHOXweR1tfwPu9 zTQXtXxow9&o_u%l-q3|hA0FLxb=Jt4H`ktB`Sa_}OHu!x4xaq$^2Eb`@9tf2`{nPq zub*$ee(?MD^QWiJmc4)O@c}3we&Q8~-hun+r{H+!B^cd+0saS{fe}Ke9)AmF$RL8$ zUFe~N777?5g&$(5A%`atn4)nbiZ~&NExK2tj40OVpp7Qx2;+`1&Zwi0IIbAvk3Cjs zWRXD9sHBiX-q<9OOCouslu1VUB$G~F38jlvPFdxaT4E_?mR)k`<(XE738tDIwmIgS zXug=HoN>+xC!24&NhY3l(%EO7U*4%FlzR@^N}+uI322#$3YzDmh9c@HiH-VcCXb8; znrNgdN;)Z~np%44r=f0YYI&e8n(3;fo(gG$t)~B~>a46*TI#E=)_UuxwA!j`uAT1s zYp=w{YAmoDdio%Lu-qc+u*D)P?X)fG!mF>?UVE&t)N)#%vk*4>EN9V*%I&$`D$AsN z;*Oi`yU?cVt!$d8D;>D;nyan8`?`xRtU+2Qu)WwZ>ueLuACsLn+Hh|z_u59&&Gxc7&mH&PeCz-1_uqgAF8JVB<2^RmZ})BY;!0b6=%a^6 zj`-J#6MnVjjc2a;!;*KtGboi)9(vsqmrgq7m!Gcs-66XTdelXuE_>>mv+j6}c_(iA z=(F$M`|7nbZl33^zYe?a$fJpJ^34ApyzM|fZdUQf8*lyf&GVl9_Rl-t{q5jiOg#0v zYtQ}n=z9;m@a3QHzWMJjzkdAC&#!*r@YA2a{`>QPfBOHM9Q*p`zXHndfCw~T$`Yu+ zwh54c4P;;hB{)GuQSgEQWD)tW$H5MI(0F_JUzL*cg!OmLy*S~ z?2(Uv{9_>XI7k^7QU`P-!VsIV$VMu`k&IkqA{9x=Nm}xfm_(!|>v%{KoWPTx3}q)r zDauk3@|1!kWETpVN>;k^m9HeFEXDXnGmO!exP;;yj)=w``ZA3wl%orVNlalH^O(mp zB`8z5%m`3`na|uK2d0UF3rzEo*vuvuhA0LsbaM>b{H8a@2~Kg6bDNcnq&m~d&URMP z1jvkMHH$gVdfF47)Wl~#QK0_>Y36eR{|u-#1v*fGGQgi)Fz5mn%1~)G)S=FNXfzE# z(TYmcq8QDnMl(uCi$W8XmJFpklR3?ZR=}hXNU2Ioy3&HSl%Ot1C_de}PAt^)rZ|P; zNO#IpdD8QqGYzUx^*L0a!c?LCMCv|?c~FHm^{E%d<3>>$Ri|1Ns#l$=R=4WWpL+GH zKRu~SSt?etzLcs&Jt{JD%GS0f;jKN5t51tc*Se~epGrL{K$GfJeo|7V66GsZt4dg` za@DYhO)O$5I)iYE0TUfiBv8Rh&$1G9uxHKeSos=M$?DXt#>6Q);VReChSigEovd9| ztJl`S7B^+u8rx_O^=Us3N~f2Rck+4tS)ja5alr;u=?=Uj;2`m229yZW64) zHNiJk>)7g|^RBL4YIdnA*xKS&x3K-LcooaYaQ2oCpzEY?;XKKZY$mtdpo7N3yGqt8Gpq+f6R;PIMQ!V}&D zAJ@xX4i^``*bQoc*J(}?m$ow)34c`Qqq$8qg{RwV|&XXe%#Tt6RSGs86liG6Px29zHRQ zGrZDDm*CBzjQWoq)Ef?SRcVY(RwuZej-IegBYj$0Puj?v zopG;uO2@$;-}=~Sb7BaQrEIe={8D|Q z^wxU*D6s`y%w30j+l0>K!8hH69UHaE*hVXt)g9Q9GW(Ger#No&3(jc6n#g_bH^4KC zfPk~u(bqWmh{o4RL@vw8KzNs#hHiSC_ih-LUnp+q)8A??l+mJa)31{p??lI@i~p^|o7g zy!b}#PwS0# zv0MHXmp8lG`>^@V$KCB%553p7Uir+MzU-$*ed$%t`PRGs^_`Es>}L;qw$r}rppRnc z=?=-c`=0l8?>+E;Py9ItU+%{@!rqtfcUc;^)j(eQJwI&w(eHlc%FjL%w$FVac%KJ2 z_`0O}d7B?I(3|7X|i5f+nbc z;)jANh=1xwdzHt2Fc^Z?CxbJ1eKvT5pO=I3w}Z$BeI;eh=B+KkA-03rEiS}ZK?mK zc{Nyu?PqqFcX^d~iK&N)nYenK2#JzthG(dQqBx3ZxQ3?qhJ%=jbhwJF2#ABo0*Q!d z4aJC`XJ)*hiDM^%r`U>jD1;pscA6NB!kCG|*om9SddAp^F=%_s_=!y9evvqX%vgKL zh>X?sJM@+$cp?&flwHb>==dvNPc(NhC1kZOb~%|Hv(+n28y_dS4A=!-4sEeeyi~I5x<4kP!bVi;P8! zTQ`npCW0B+11q_azDS868Fo~6jW2kQOzDjJc#sJ|6$p?qd6i3ul>k|lTsa0t z(2h}nlM%UbJh^#333*v~gj>0XD~NyZsFXihc2w||aQT8#*OX3al24hEd?}R}$d&~7 zl7cyy0=br8d6PCNmO5zwWm%Dxh><1;29i0Mw?vtid6~JCnLl(xn-F%>0FR#u3l~Y3 zuZMb^fQ`A>nIxH)x`&cH7@4jJh?hxAv?)eMaGSUZ1wWvhx!Ie(=>xzSoWhv{!&w8y zd7Q|Z0?G*j%h{YZkd;+AchRYsyy;GN&e4&nbfp7B7Q;(4Ct z*`4aSp4#aT+3B9|8K3YupYmCs_DP@lke~WF4f~m&{OO(U!9l8r2>Y*Syq9Q7yq#z6@nhCiuqA9AP zE~*JC>If%VFK)31wgi9;nV99YnAQn(*r^ZpP!B>nq~%GZMS7&`fTS6!q)Zy5K#HGG z8l~+irBvFVR_dNlnx#&-8m8A9pKdJbt?qH4;fZJG{inxsrB zr*q1rWx$on=LKL%of4T`S9qNkX?9p@rgd7VaB8UFxusP)pHu%jsQj>~{Sc{F+NhMO zrBiyTVoIi&x}}=hsb~7BXd0()I;x~vs?yL6ri!Yms;aBH4!UrsU0IGgnv>6VVaAko zw)mLn<(`DvtA~oHhN`HL%B%W0tdcsZm1?P8im98*o!!Z)o@%Df8m*ujs=q3#t?H)A zz^d8Gt=?*?uo|7R+K>-9mR!}Nxhi(&HK@J{tk(*x+nJ@timdbcsPw9=%-XEfI<5TL zulri9*7~jjtF7I7s^40$bV{nPil7@1Ap0^OM z$J(*?ny(%Ut?T)(D4VhXJFqONTTesGFvTIAQS-ZDe+qD5mt`ECnV~egp>krV% zwQ6g$@;a<;3%B^X4_2zL&MK;QTe($Bw|uL&naj0a+mK%ymf3h@y49mV8?tGKN@z;S!P{OZ68+`uRtzS8@^60EylaJ_qq!P`r^ zg?qXx?7>ZXydsRW2yDU+oWel-!9G01ES$SZ+PQcN12UXrwn}|JE4=>e4mXUji7LQ5 zT)@gZxhq`6LEObeyu}eLzb%XoM~tIkaJ^nhX$7#x8wHLO83x^Ju^o)VLM+BYEToHj z#Z^kO&-=w({KH=C$A4_ZxqAhognb|IxiSB+#BAKijU2pC?4*QB$9o&VdK|)WtHod( z41*lT3CzHoY{#8U$T{iWh-j4cDYx)+l}0hV9mAt=5d) z)-Rpdkp0&69N9H}bK3{DW0=zmCPz)?Z!#GJiU-G85ZEK21>GsusGZt{-Pn^|)+%ZZ zudUdu9nFjV*t5;nww>ECjnsr4*BY(O*muh{< zE!&cP+ty9ny4~8@P2GsC-IV{WwKfg7myHEIr_*hCJ>U7w-}n9CwY}dCj?1`R z;YW?(h#TH^D7N1vOc5q*q`lq=zTnTz;3!@U8gAe99pMsA;rOlJ7QW&%4&fLr)m_=) zpI<2%|0J-kIb^UglIj<2LT(P5$I;e&%T&);K<$Tdn0EuGf1VYCaCy2;SaR;KS8m z=1ZQ~Q@-Ye-sWz8=nel)r*Yl_h&+aLPL|YnOnI)3UmoTOcnjbF=wzPg7mnsgKIq+@ z;fBuXp5E!Ej_7Yr>bF3gIEv*sU3jAVRC=9A%VYuOSm`Bh!kbPEyN>FC{_CSo>Zh*e zzFzF9e$tEH=z*A%<)yRcJ#!1`5DpM@dq_|8E@RSe&9Uc0Qvs&LjUzhuk=l?@<}iDW53(ey$9}oe)NZEApUOk zuJ!lcg+A}~b`SPLZ}!&A^klF1e*gD?U-sW%^lN{Z-ga&dXJI=(_gsIXcaQfZpZAh~ z_JV)#fq(LsPx;3z^T0iSjBMvt|5lzIev}?{iP!Vj4*A-S`Kv$qnxFYcU-@AV`?PQL z1P$?wKCW$;1Ov8Ghkx;KU+ebn1?q_UB{N_*YuMhnbF8$H}{Dc4g@K4xk0Ion$zdzM+=#}pj zQHP&=oE>~|4-gMV7>Sd`!NCSdNR>keuAxJS*(64sSdo~;UKf{X+{n>mv0)*jffPv+ z+R2h5Q>s+fO`5QlFIU23In$;~nKg0dJjZiqPoFVw4kcRDC^e)>u`N}~wCTF1?&3v- zT2-D^te|oj!NDVj6DnSrOaU8aND{OaCPYv>gaQZ+A6N_==wb#Dw0Z58;ETY*SAk3l zBDA28Aw|Rw6JxB#_@mCFkb_SCDLFFb%R()q%>20XW~xp@V-+Ww^i|ZSukQIG_G{R& zVY8U!f~EHV+O}|~uvx>K_uad6#OUR#BQD^9eZmknyjbyb=O#Tv2VI@>XX}-(W5(V+ z`*iT%O^^OIp1SJP@U-@D4ZG}Y+aj7IQJXtMZ!-8f0k>-#%ig{Mb0E1fm|Ms(1f%OH zLFv5P?m_V&bPy=*BAhTh46`#2Jr2|JFtzpC2B#9hy$qP3u?@1_~j8aF`_Sj0q*xn;TJ`~?d zXhr=@1WvdUW0bK08q@H?z{99ikii9+Y;w*c>r9ePIrAiM&(fy!)0+>iERKiS#3IX! zEf6jL;WoAs*x}1CG2ySa+st%pKqfF9OaTkNe6vG1ffRLAJ4>ZdNjy>2Q`J=)?DJ14 z`OL9OD|P_P3np3^QOhx!AOV6#Wq_276jTHd1xqcRF;fi$OM}w}3OmrvPvf+fRBSB_ zl~q%_P1W00V+9pfay=B(&|C@ClCLs@9ky6DBt3Rs;{oVpT_w&ktzX^EpocTUq_^W=AGMcIG)6A@=zx=US?QLkbz0?=4<1rsm}6%D zcxH9$iY-z9%zW!ofsVtNW1xdx7G#lcbYvW)pU%jbrJI%-YLn@9J8H|Q*1PI)&AqZK zTx;GMth2hDPp`bTAbZ{sKEAhTXldBDZOY@m`*O_f*1Yby2j2U0S*PlI9IRo37>z`S z8xA*%Mfm#l#gp}t*^r+FAm6nshkJL<{q5cI&NmMp@47_?oo|x;emLvXyMD1P{y6yc z@MO#On6Ae=)m{+YwekLY-`{3>eDX6le|T-t_uTm7k+*t|znO=P;;tbeLJa&V)gS+# zgFch?FxU=vZR%e5#AiU@l}~Q!`(650)jsw?FnO~ooqGmnIJ{&KK=)f+|42~(FYMJ$ zdjqmVI0|?`Kp`-J3~ZqA&iBIgxle+lGa)&;5I+lEuwCv7RwSL=GnI^6sah>jECjmnUkBQ7zC;A0~1 zqzJ_~#&L=L!L?%<2td!*|o5{jfIunvItmPdmxGO6E^vXnx`lSy? zDMSI1kZs6ZWjUqkN_3`^j@67HJEd~NJnGR2%4!t<{K$Y{iY+dRLZv#F$xMKrGnxa1 zWkCsQKzH7fmJ@_$JP&0S8R3S1)T`$=iD}9-G%jCeASWXK`OIk^w2A&CsYl(I(1nhZ zf?C8T>U2;)i@8BegP>`dG)T7k2r>>Ih#W^tYEF>;RHOzKYDiN`O)MsLr4G%eCtup7 znF@yvl_1lJta?-X05F^w@M%Yt3e=zqG^|A(Dl1WX)EupWrJb~uTk4}0nZjrbQl)A> zhj|=+hD{A%_3B5*ddI(#wXEhuDq7#MR8AT}k7L-T^dvgOwoJAE6EnEL2C7%FoHdK5 z7}Y4I_}bUciq)tl73^R`dsfs|X{`@M98^^Y*}^#%r^3AJJ~Mhd&w`e;0p+b|O-t0$ zhR?96J#29sDmZjOG&jK#&P!?9+`2#yXq2VxMe{nKE9f?`+YK&oNBdpwDzu&ACGT*_ zflK6$g=lA?lw;vaF}e-{wjLzqUkZg=u0BS)y#;S~W9i?r64#dJEv{~rfHI~U|sv-aI7ezS|l{q9!7zU450`ODw(j@P^eR%w)`uv(sRjj@=0uXCR}QR~sO zzRBrqelxt`k@i=|IrcD)%NJq+lbE3>Zfb(x+TsTLO1dBaWZVgaY2DlE^|ToN>WzOJ z-X2dG$XgDwki~J_o7t>H+(fc`7X?b$##o=6weUx_VPzj@SP#XgY>d?n=Ez#bO9Y`+1eC9 zg{Cp084YPi?^xB|tuvM-&E-l9`O=wQFN}J*;1|Ex))VND>_}Z|?P+1ki#~O#tGwz* z9~;uJW_GhYbn*ml#442XG7S00#eV*m=7`1sDPUUjUO{NzFBde=pM zaFh={vf)6wOj{bYlWB+1B;P<_v&~JfEef7y7zw%vwe%RZ-`9EL&?KPkK%}>AKx`gPi zm!5s?J6Qri=)Pc3pL)47KLJD{=UYG8Gr;ycz`lb&N?SSVYb##KAc@Pr;H$uV6Quu3 zfdE7d@{7CybTtH2zXU|N=Ls+`$s^!XG3`$6Br!J}ya;^3d$YCJVlf${!7FSQV*p?#JLqFuiA_PPb1jSG^ zL^V7_L^MTIM7QOcKSs1Hr?MEF*(4d*w@EYrO58pyq=Fsfls)W2UlhesG{XWUMROR$ z0$W5@gg7oavH{qv7k~kzbE{gsMKVGi=IF&=%*J38#%(0VPy9wt1V?d9L~?Av2TU$y z>=KsK6c$l|X{5#*(5h=Bu}#!QVC1oG%tw9n#$rsxa!f(_1Ds@pF=k|eHQ0?kzz=t{ zMTWdZO4O-cEF^lYM|%`Rd_+V4ejLY)^v5Lp$4Wy+#bPUU+$uDrv`v@OkCfiLJt z!SqbR9L2*F&C>i$-vrM8sl-jiJS@1(CDcq8%6uK%vdM#7NKuo(zWlzhT*=(j&D~VD z(cDhq%ueo9%;Q8CbX2>_S~3WHs+^I{*<`}Zv`*}NPtZI=i|kJN98UYZPyE!qx4~m4bJ*}P|`%fG6+2JBs}{o&-+`hib;UChyd#P z8Usze+tfw{4MP(>%Le7m@5HhEEY7#wwVO=M4&|UJq#pfwM89Z83c#umMbHHmLm>6e z6TQb2bx%%_*)lnJ4 z7>%0L1C;_Vz0^)M($B=yO^sDF4b@v6)KP6k_Iy(XW7OaS8rV^?06DS!V^tA-)x)sV zAZ=D>eO6mF!ZHoi2KCfGwANh3RR-Kuxn!-JTpeKTBYXpv9g5UrZO>M%3TA~?Sf$k! zrPgfKR*!6rmIGH)<+A}DHFIUN9dy-pT}m#TRawTY#ZyYX*mZ5$>*p2tkv3#{V=ZOSVa@tr48Gs z?Y%k-BYW-H>8x6~!;!az+pjHLx+PjN_1Xwk+M3PV3?)`z5>UUT*r*c%YZzR@ja%45 zT$y!H#=Tq6^*hIHy2o|Mo{bi^9SB^xTB60=%zfRt6-Ul3!P)IxyZv0;4c)`y1hPfc z`?IS5K)W{Ts<_j&uawQe%XMANRos}3-P?U$+#KCTsX+j-r%oG$j(Gy@m0X`~TWD!r z<%M0tRi@hgu<~VI^vzxMUEgxN1?m0I%5p9vYc5aFgoI2_(?wP9?a5mR-vvG2X|>&h zWnbMb;Er@!Nc23B>>-|PAM+G*in4}Mv*6yeP!;sAzM z69xuuP-0*};cHl77QWl}C09#(h2kdV-9f28Z`Hp32wv!Nfjh_pGq?ixs$lK|#BE#IHd9W#kgasEUuEb5Y`U66o*n$kuubcv}j>t0#Yci(U5AH{^ zKHL<>1Xth&SfGWcZc9&%YQ=k|Mxxh_?bj{?*QRaT&V(;01KZAR-R5oo-~MeW2yWrd zf#D`@<1TI_IBw-O?&YQd;}(MFZf@xAfasp?=6-JOJA&(8?km{dGI%KO*4{l9@0c#{ zfIM#smA`#kV7UhG3dmtgz-M6*R-Tqr%p{}~NN)W`?&9X}?f!4$&SU`}a00)}W;}2N zr&MT3a0U+>1z&Ioe}D&{a0;*R2)A$y&v2mL@QB23(vwv4hSFUbaS4{{+Nat`-!Xf$yoPjV&4k`sTo z&aNjGw*vcJf_vs-eJ*XghB^)SaU$<>FXwVF|MCkLb29I6Ge2|xxj0AqTk|E?r8Zac z!Go;Ie5?FmafUO44j}E;+323W?=T;8Ko9gXAM`&b^g=&$L>F`)Pjfeab4PFVHkV^P zlItA>yrj$KJV${m@5wA@0m3=+B3E=nPjpdta8o~ZBVRM3RQ3FB^)!EVSBLdjpLJQM z^;);}xybcfKXP8@zaoPVU=McBo3>#`l!rTZWKVWwFWb>>Z_8SX0M}>^-RSy8x)0x) zo(Xnu-S(V46r1^W2V6ODANO!y0&*{R^FDWUC-)WMcJdbYZ#Nco=RS7#_I0oKZa4RL zr+0XtcYgnOf5&%izezTS^hbwh<)ZWsg}FAk1cwj2o;?BoGD@**uXu~kc73<^i)Ss3 zkMnkS_j?EVJ+t;B=T&s4Q&;!*RsV1gIN5pkaBjZ$Kfdr{`S%~-zncej7|>pu$N5n2 zcX%EV8W9|j*A-05v%w3YmI{MsS9svVXj@RLO|Pv~2l2Dh_04*_xiCAQhxuMdZ1%*bJMlOOTu z8hgW6^MgltreF9u?;{+p1#2LKr!!pe67cN8`%82_xtotdk4RIvcLP#Km1z( zeT=(#y~lZ;SN)Y=ebs0Ef1ma2j{Tm$d)c@B*?)ci&hLHQ_x-K^{oMEcahInsJAULx zc;)YSijG>gKmwbFgAn-De8rTE7x;M(_}fQ(neTq@PxtTddF>bf@F)NBH-Gfs_tqc& z^v8ENPyQ8z|DdNB#;1G=Om8mG=ODuT0|kf-0x?(^sKMYt7Dt{eY3T4FLx@Fy+<@`o zBF2mwH};_D@#930Ka5lyS<>W594S|_Z0XYCOPDfea*V0a22GqOYv}B`(Y-`2R1kaC_3H>`-L|d0L&sdddw278;QM!P-MVKEE*_CEwcwP9w<ilv7%HC6-u{h~AbV1n?z@Bd%Bf8<_2(Sdd^d!X%JIbnz4*Uj*S*#EUb=c&Cnb z=BX#2efqg)j&Szq+@PE-RV1Pw5gDhDf)2@3L`_Qi4wc>7;PnZ{kj{RUg?aGEK}(AufU?K8*p|9S z2e+)UhaFyy=~i5Gt@)ygcRg|cue~t?;IFXw%1ATLInTMI8cM|no;q|;qA>IbL( z#zOJ4F1pdF+wZ>7%93CIwW=v_ob~Q>XE*^Ot_)s#O9_-9p)hcPfmnDT1hXJP3Qe$r z<-6ckzJtBcfNy&m^qvPn*gfrau!Q0}AqG>3LJP9+HcTNQcYannxe1|$Hl!iZa;U=@ zo(_jOtYQ9QSHZ@Kz$--n;M4-B#KVp2cjgJxwxZaY5>PREMZ6*wiI~MLO2{)s+yfY; za4Iq0B6!@Bo|mksmJGPOhkeu7mA_#`M1Aj(mal8rMvh$%^_rZ)1A z0Iqx`0vt%5QRaaE6C}&QHM;PHFn&!|xVa)Luc*Z$rm~pETuj(D$1=I(5l+gS)8|U* zOg-Ytkc#vpHnaIhL~>J+IPB&(&vlq!N)ePVK;k9`*t=96(351^mL97(#bR=R1F)3l z5a^&!H>6CI?CesRW^jUmdPM_NJm@e(b*2F@^qvk)rd^z~qHzY(h1hw(LQ!cm5D1ir zjZ1<>sn}3zA|{)G1Sd*U8cu6&v!y95SP*p31lvio1LHv_0oBPnX}a^B7x-ENxgb!k zu#uGTbf^gQDM4V?w4I?OrSKm3QDUZYpvENANVD3|G;VdEGkv30xjF!^PLHff7;8bb zI?=Nt^aLRPeQSAOxltd`wXSwWO3jHq zeWFj%g3!qNlmL>1Cj(*Q)Xlnbs#8VkRXHo#S9-Q_VZ|o_((+Y*5@86bZRIIj*4e|- z^h*!rlP_OYQgi*W1{iSPZ$}bUgNjwH&@^N=F~Xz8F%Ys<>hjux~=Oy~*RJKM@uZM?R9E_>U%UE`*)wJ}X& zMbc;28`MD!da%M4xoh6r$Tz>LTCfrMm))i=L9sby>?SCBUF<&gsS}Q_C1t8WeVTy2 z0c9}%YyGQ))V@`&|8+2DQ^nN;4p#(95FS3yG}Hag_no2Dua9p#<9B)oXl8gX>B#U; z1(TMNY3;F)gK*y&+_fpJs00irqQWDJV3mUqyjT z@99Dqw-c>!fpCovn&YCn0L(#d6_5k1-?$!D1_w5nYbPQID3r^!PQ@>C-9y?xKYFrP zMl3ojMZh!oX2TrLE)+jmPji9_#AjBjP{m9e!+MFqqxLg79YSXx$CS;?1Tan6IRNpc z(!Q0Zw4j0gXF}U%*9_@je0M_LqYj(ch|P65U2y55K7m0I8r`#Y#{_~j`?2+eGZ9k% zUFC11c?Qj%tfi-2V7LL8)NL)0 zn#Z`Dr3MSt>rC~Q3z^Qk<}uH4p7Vh#H|(>fch|RiuAS6RFl~SP(ILr_yeYlz6Tds& zBj)tHL;Vtb@B81A?)OWm4u6LK!r|er1%;{Z=M87=(Bmih$wO+uYrj0^LlAlY$GaOj zna4bWL!Se~ABXIwAGpyKKfj}Q-~h<%IqYK(@ga512X?=Gf#aV0-3x;E*v9=G_~3is z2fp`#I6ftcKX|}1zwg|Lg)?Lk{pmZS`qsZb_PLRL?Q>%qK&c%~GGq%&WWN^Xf5iFG zuYN*ILUitbe;eXY_tl+n_3+ny-SMyg{ma3?{U3ht@gAemAKcj={{dhCCZGc5!2$}O z0}>wuKA;2|0`f&d1tuQ`N`eJy;PN$}2VMg8RUh<;VEL6`GMpd^qF^g{pHEa*yhsfh z;DQWdU;3fo`rY6o$e#}GpaI?=5B}i);eikiVGtsq5f&j4HlPw7VFWV&AQL*_1TJ9| zP9YT*LK7|m7G_~0_`w!Z;00#j267-6j^PK69|?w_38rBRYTpr5O2h#{g0zbQ91+62 zfgRQ$4z6D^z+Vpbp&tUF4+f(D0pb%Dq7)|KAy%OxBH|)8;vXcUBXXf6cHtpZq8C!) zC5E9UZXy|WU?+Ow)0rU}sv#+AAN)YUsnFF_umPP&K#~~J8=RmX&SDK4T+%BqRKz zNcQ72j$||jBub)TN)F^63KBwoK%X$0Db}Jx@?k_mq(tK5MPj5!a%4~Hq)+}NP}*Zh z7Nt;vBuSQ}QYIxRisDMLWc3BoO9mE0He^lOBu*M)MII$4a-~-WrBM!LSSkWpnj}-6 z5~W)DlU<#&Y7Uo!Xrav10rf4E2X?Egbo+fHyUmoF% z?U^A>+NEStrdDodSJozI-X?B(W@sX%ZuX{cmL_lpXJRU5YCar*Mv^QW9rzo}Y29roSj8`9)@IQm1vs z=XGu;eQGCdcIS7FCVrA9fA(iJn&)|@XJf8sYeJ`Vz9)QEXJzImB4DR@LIQ-=Cxbqy ze^#i40_1-ND0-r%PSnS8E@y#8CpjKyf|h7b&Zm7kD1}O>imvE|zNmf%XK@Z5YPRS3 z*%6F=9~uVpbDy-7HXX)DwpD^ou=uYf~lUCslSA%ni^`GR;iTU=bIub zrYb67}-+e7@?MhH9sNs;7c#qu%PM=Bl2Ws!C{7rT!_c zx+;~5C6{jMtk&wW%Brp|E2%DJq(Wz}Le8pMs<39NrUt9ACM&XTtFkgHu6Aj&k{_k2 zs^##J`&H|qS}S*|>!M;Sx3+7yeygL(t7nG)tEocixRPsZQERrkE4#v@h4$;aYAd|b zYrJ}EX}YFV_-em6>64=CzecQ^670YptiKj4!p^I`QsccwtDnXy#7ZouQtZW6Y{{A| z##*ewZtTN8Y@ZUSi3%*rUhB!$tjf-8%C2n2-s_DH=&xEr%-Sr?hNP{MtkL4^%_i-r zF08cP%DIMYx(=<-9__>`tf+P19A`fS6t z4%mL})WYhzTJ6}LE#0QA#x5<}?n?@oBghu4*k-NW#_in}F5a@N+KTJm>I)6PLG#sZ z;2N&v4({P9-@!7ihXPCA0`1#E?mB+|rooPE*_y5APHx^N?rw7J&vq`{imW33-RKH# z>BcVM)-L4kEb0!P>b5QCx~}hnZspRh=~C|SnjwGAO6KaT!yYK$%I)03uIv`C@Jes+ z<|^iPZST(R?^18|aw^zJY5>MydQWQESJzOJg{mM?JLF9Jg^|6(lzyYB+W?*lt9_X_X;6GQOFb) zf3X+K@Dz7%{a!JFHgWT!FBp%p0<-ZNOK}($Y7w;M$jC(naBf&Lt7kf>0jMUNI#nzU(9q&G=Qol4bY%#v0`V!fJmmDjIe zXFe4>HmcdPXv_Ls%eJjrw{V@tB{dhS+`Dzta^2gtuiw90wek&1RCS;Q>keJJ zaBtVMgA0c(n|Sf#On>Lz&07?6+qZoypALL@_3PGIYu}E2`Sa$`y+{8aPrZEi^W4*` z&yJov?(gB>yJv5{KK=FgDYg%^sL;eicyxFLuuBBzQF6mg2P)3QQl1WZUWs^Yqm?f4(O6gpeIL=sQm`*0A<(6lb zNv4=!T6v|LYI2#TnRAZ$rk8lGX=j`+(pjgUl*#!?kc7gS=b?A}C_=%tTl+NY+8ve~JgmWB#xkC<-S3a6hMS!k-BvYINXrJDbGDxS~*!=6Y+a zvz7{Kt*cUstFFWr%PXw38Y^t2%kJvzv5sE)YqQi=tL&@DLW|~twsvdnx6?kWt*lF` zs*AVaGMlct;%1v{w6ci^ON79#J8Zl7x~ng_K89=WzW|RaFscHhYw(u=-+S%C@9s;m zCJ;XiZ^Qnwn{UMz^Q$qx2X}07y$KJz?Z_l=Y_h2sD-80-49h6-$>YA*DpT%-4{Q%{QURtzx@Ebp8x~+zWv4T zfd3<)0`tef0pibr1#BMz7f8VdTCjo-#GvRVs6h^T5O{Ow-~~rW!V;QLgl-|<2Uoa< z>$T8@vI`*_VE95A#;}GqM4b!+v4$P`@P|OeVG#d^I7Gtro*^r=wQr#CM;RjT&VryKpK zR=3L4p`w$L$&{%`$4b_+K2xk{wW?Zk%2u6H6suSjsXXQBPNz2Yu6WI>UH2MQzWOzo z+cfD~2kTXh&Q+IP4QgURdQ-DH_OWS=Y*i;aN1R#~tgkvh5mG>ToCMG-&t3^ z_SLkg{p)E}OHVzTbPQssBV}h>)zSYN*0zhyEjyF2*|1WQw~z&Ha3xFJi?;KmFr{f) zISbdX2DP_DXliLwOI@Qnm$lek?LJSM20Fl&4#%Y}Z41lP^5T}fnN3kXaLOfdsF0Lw=D9(%v%Ho6M!_J*!J#`x0Tk+Rbi)pXuEOcY%)Ljc;eotJ?~n z)4#J6?qgAk)-AY~s>xOBFC`pPlFGHM|E=p~13cFR=asws9j$_AjL#Y5mkxu-u^T!t z*zq3rw&%6*b1lnKvT|6%>-{i%jVnhc*Auf)zG{Cxn_`i2_yRE&u!{>EWEs;~yC}u6 zj&Tg(9#eM6T^2H$!&>BN?w9|)A3kJ=oebdH-tw4t9x;lmJYSR=6TWFCFhEy~)i0km zv|Ftj0B1GO2|#S5Cp~4~@;Avyj~g>K$i=QHp`*<1o?ds<&X#AipN&`K3Kqda zoi4rq8s=-Wfydh3_JqNm=1Mct+z2N&xdrZ`L49f#D?8&DkGGdA zy>UbLThSc|!KRJP({_vC=}?ck&L=DEmRkMlCeFIer_Ob!N4>IA)}+gU{#-eZ{pBsU zaM}ZU-;Fvz0R%w6w@*HFTJzJjxEAx1tBPnHcOu7suSDPlKlodZxetgxyy6#6c*gtv z@2`Now|Q{)^XnT zM)H6M2zWc%mumOBbNBSJr6|ckPyA~y9=4_Tg7TN2h33az_RvqH^rKIG>L|5Hx?{zeF8{%z0y{o5b^ z)wf6U2YZ40SJKpH-Qu=f!6nc4)}c;_<0Ssfewg)s)q*Y z2Y<1rekK@!7MOy!SAi=C1TEMCH~<4I0E06)0ySuZIQRiNr~y03gFg6!K-d65D1<~f zghhCSL70O|Xi!PlgidHrq7_wvb!AkiejfOM%lCp>NP{=HgkH#nV0e302!dBghGi&% z-L-yZxQ1xhhHglLYB+*#SblI=hXZ(rc$kMMxQAO9gMD}dF#w1NRSEN^TH=*{Aee=? z7lw@Zg^mBHg%{X>9H@b3IDU3`i6@we^T&rQ*n%q9hoBgUei(|6IEtotiY`csomhXY z*ot}>NF#s+CiiP>$8hCmd6&0&-`9DR*o(MGdB7Nq!Z?h?h>M(OjJlYN$H^c4 z@)(WN$cE>4jhLv3oS1@n2#4$kjh%;#eGmpt&;lA@jx9xDzGsWz7zep{eCAk+>bQjH zSdlQuj)@14@2HW>xQp}HfgebX);Ndy_=*9DiW6ysDro^LiG)e0j*xhNB4~pM$&J~y zX}ACQkctO^pQwtSXo24dejPcK-ba+j_mTA|lK7a9CAo?Chmwz&l2SR9RGEWgzyvg@ zjS1O}w1s{;X?V`plTew8F)5Somyz+6d^Rn19)Ygjtx5h>A1$0kXG^g=mOWb&s(1m5G;zPdS!`$%tinmTq~B0Ev`f zIf-)_l1gcpce#&Fsfw5Rg*~{Mtl63`>6$Rfg{6mkiz$nZ$!}F?emEwXh-Z3J#7e+v z2TmlM#3=|ZbezUXMKgp6n*a;b@SM;YozgiC%?X{H;GEDojMf>Cg4dkhxt8=ensxsv zdgQrETx6c;$wj}3p1~;x?dhI(@SgISN??FWS8$*BnV@du1&V2t zH~E-n8IC%65B|Up`tYFj5TOz}p%hx7@!$^afT0(Y+h8q#atM>TskSnhr_2 zq)fUFO8TTudJa+wrBsRyO-c<|nx$H5rCe$aUTOw$qZ5`>sDw(ShI*)Q>ZOXhsEq&m437G! zQz{LT8mW}p4U>AQm1?P)x~ZHRrAcZ^vZ;-+sFiL2Q(Sqb*O#V`x28f$p^56IOgf== zil-o2qO(e?dz!1d>Zg5*sD=8gz8b7?I;@Ratgi~GnTn~%nykvote(oDpel;ZC#__9 zs;JtIY#dxtGmjp=o+ZNYN+eluID1G-fFDNI1dEaw@L0dJE-ht_^#x5WA!BDzWZ5vGHo8@|v;7 zim%PevHI$yx?l$tsfbiitp|#rIhl(DyR8O`up0}cFsrb3I;Riouo3@zt`r-u6)UVf zsME!Y;w_^LU zf@`*fi?&g!wrgv$+U2(6x1cO5w{r`pG;6N9fVFu$q7loc?|QMjz^H&5wxEl#WIMQJ zTeyY`tzfveQ=qu3#kkmddD{21EE~CVJGqyOxiy=+di%Aa8?>Q|qk$W|qg%SBTf9q( zxDyy!N-Ko{`?fj;sE|v$y_=)tdb`%UyAsQ}efzuIJH5k8y!QWUyq!9}O^UocAfT*! zTCS_0u)DIeE4_movzB|kx{JM<`@Npqz4}YK{0qM1`@aBuyd&F+>ASSe+qmuPqR|V# zNou=zO274+t}v^;!@Ix2OTqXXz~Xzl^nkejTB-`UT?hQSPW!$L9KUt@zz`h4y*j}e zT(;hO!SMRR{@bxN%)vzK!7XTdGtgoNe61urX1rj+y?esL>cA_^!VlZRE=<18VtZzT(Yp$ZTK|D zblh4a+?J9j#6%p%UFxmWtHNZwt3HasYh1``EX8cx#%}){s-w8NaokmP9LY?Jz$LuL zeay#QI=_L8yE$vfX#B~D?8%9Y4sHC#SZs0DI$4m}UG3|TmW;!SEV-Jzt+cGQdwaj4 z49dEE$hkbq`RY*8ioSse$84~?e6_x;oWQRP%a`2D&U_7HT)og7qtm>#*37j;+RM8f zzEjN0+8oQLYsy*7d#J|6$*g$G%*;{@&Fl=u_|VSq9M3V_#7Eq<%QwxoJFQTOdwV&igg||;8yyW=z12&tv6*1hNgdN-J=QRN z(PrJ%U|q_LY?fM#T~oMZ^wj{KSk*aL3Qb+qS)JE~{MBiV)@1$HXYJQ`J=l8f)N2jZ zH~Da2b&yUVgii2xMTi8VaMy)h*?le8VO`dkec34u&~ofoHr8iQ#@Iag*l`fqpg`HA ze7cs+)xtp7;LF#tz1e}S(X|cOntj{0P1`h$x-=+(JeJ8g0jjYd| z-Pb+cyFCo+UBmAU-$H#0!0fNn7ln!4fy2Gn6{&sa&D!W~-3ZR!ihAD+uHex9;L;u6 z2|nQz&e^fN-~4^FTd;DD30>lSdyY-uL@3$Hec<(7;e&nO?Tz0Mj^ZvZ;V;hO9DUd| z$>D#+O|SM=4lv-SJ>s5V;H#Yt{cPeVe!~qe6tj<(zV+a)`yfrJG%4%!PR;5^Rd zU*6_m-sgT!P0h--!R7=wiO&jLzmIuHTHDmF4|R&1P3u-fA_qWXgYXI|{aKIp6t?2Yc|ZjO!-DTaB3>5fT!bhqi&P6sUM>AU{x+^+1*PUyrQ z?#Djt<4*3#?(Jx;+>j3EI9P%@Aa{#yrjdbLeom*v+Eg!r!S6kqY^e(|VY?!`;+9N+O6Z}10yxKGWFXJyRf zrA&6@*g}}o+5UEQ;0+ef>%{-C48>6MHh=RUU+_4e^8v5%9@*EtZTSh;@! zNOyJj)=M@5wr&Bq-tsG81~FgtJOA@ofAv7$^MIc9UjOexZ}p(Q?!m0^Vq|qpCDj4v z^s#vB-6i!eFZNnL_g_!d@t;lulHRa%a_mhey`475OvT8>%tXv{*-FSwOPD1Ul5<|v&r}@ zN%fDP`9Xj8oxl0F-|?7V`?C+~o{HhXU64s&llIkLE+yb?ulV*p^}S#DlmGnC&->Ev z^SICN(eL@wKlG~&_|X53hXQ6~Q&>&&zVfe6gt89~GN1l5um0;#`|h9pns5ENKmXSc z|I2=`+>g`wCx4O#5IRJ3&;TODh=V(3EKJe_%R&<+h726xq+km#aYg{J@Bo9EZ0Nv+ zBw5nr$!g0`Ml06RB{X6$Sq`H)(`L+@%4+TuDJ0v$=J@yOl#Bj<#^;(nYL82?q##30RmiC(0V=neGXPdr#`%-=fcRPi+-MW<9VY%nJAmfZR zFo6g_BChL8y9T)9$Rm)#v+zRrGE6T%_n^`cH4r-t@xu{2V~s=+=Tq@M-0*Wzt^MAL zYdE|_P%OCw2K)#*Gz3$S2r+_m!NCU^t4N~>C8JCm44X6&MfsxSFvTfLg!0PuR%~(0 z`dHj8BpCY>j>i8c&W>E`)5*LGLaKKaPm$p^Q@9eDf#r%%000ZM@udX zb@5A3d;|Y31}}!2tFDF~I+KDE`PAP_oC0~>NvIQ_D;J0(dq_1RdXZFO2#sg?HH zK55m~P*!o>L(%?tl`)Km(s1+4G}pxBM`SyV(8w&1jLc4F>%|t;d#$ZDUqQR&_Fr6e z(-jAD#f@Tzf`1k8qULyH<5-A^{Pf5cMh)0rXko>dUw!x8xHXP#-B#qY5VfL*ws=6p z({b^->pH#;ij3iiJ0)SFiQ}z!-jFjMPh*dJ#<*jkixzrhfRnyBEpQoS`CxLXFb*Pg z9V-9Mz%Xh?LE;ABO=D*Yk1o|{v4bAkY_ikF7HN|Gy?9`$4K||3sKr=lQcCj{Q0uLW z+=ya}mmd4Cpxq7L1?gu&2^y|?8@!$R_P775 z%RQt7dK+K~%|yKGbi{bbbD-*62*KFJFoPGQAq8hBz5HD-hu&(MjKox~0GW`0LqwrM zE;70?94|WvhH4B%Yx5=fUcF42i_WF#JqAxAqB zEs~R@H&6KCzK;jG!eeNyj;s4U@BMVHZ3} zrZB?HcZLyS8BK{uHL`J)s&r&AUkS-$CexLdq~#_1=!8$cta||rUl18UNMHYY>XeC; zzzc*qOkx^SoUw$ZGMCv*bb9cXA!Lvk%>=wb#Itv#Eaki26$dJC)0^Q0Co44>J#*@i zoXE6dIt^;Fl&Q>7#6goaFA%=>xq$9oIL7Dju zPBzU~Gos50T>4VJjDeS1C`?3ehC+nI<%}6krAK}0&v6cvq(g0GNKb0gO06Mie6_|nDZpt^)v1O;h zq)%7v8q}}mb*twr=va?xOS2xVr6i=LVXz=kifj(944Z3D?+R4N78U=XVclyuD(h9e ze)J`NMJHgx^~rWt%?-u?(?Bf0iD)NgO3Iub52KOc=wmaBS-n#BU$0G{W;wgb9C}u6 zES2U4@b*x{*3_oiRINgJnjMh27Php#>~dw>T;>w=wkOpsOK}-K0mfmphn46cd|B12 z9(M(H=%{ifJK4-~@VU`FY75EXKzJO33@TvDZly*#ANn@C+pQ@WFYs3J*=Testd2fg zYu?C0H?|61uX8aw-S_UWx_)$-Lph*b(z-P-zNKngvSZvtzJR<4POyU)EYR{^(zfYs zFK$&lg>@?QslUDOb^|2Un2irP6Dx3tM@(WMGg!z&HgSVjd}PZaxy4KW)(wmowNQo9 z6uX7pa0&Vw(OL?$zejhy5nml?t+WpkU|oEs-U*}6JI%x`5H z+~ERPmwMrG7`~ihF$Y@E>^-rX)68TSNBG4trZa#BY31(X7zKy%T$b_1Wkz}7&tdjO zr#(GrLlgSUp;j`e5$)bL!5%7$n3h7Ffs`;sZSV0T4@oiD2gRr%io~Umu#( zfG+j0i@oM?q*~dmLzZmzJk8Nyp z6I?U~s!3}=ycPAXxZ*I1I zWgJKgi*ny4v^5j_-4R`n_uJqOcgF`V@PmiE&k-h97%o~Kzg!UHpOmnPX zQ|tWRcf~J$0F3Y4=VM2@&_UjGrXPLXY7hC-&5?;XPhG|}syWvw&H}G#0PH%iYuSnZ z_q3y3)NCibvEzGkCO7=PbIzsAv%dAZ4;WPc-n+)h?svdvKJXJhk{UKk1XZ zOv@Z0Nj*x_w~52191%V$ID>8TKAs!D0c-{mJV0`DKy!P*=4-+C6THK-ofu@B_?tkv zOBlkEHj26%oZ>TF0|E147AY9P0xUrjOh5!gK^0^{7i_>Kd_kt0LHLV6HnTwrgA4l` zl6>RA&)Go!`$8YIxNdq5AxwuNJi{YAK_z@bCTv3g25dhF9KEP>x!$udN?Rz0y1q1G zxyE85Geko*OhZ9*LSchLH)O*koItAUj72b%fjvxtKJ3I#97Iq=!cY`NQzXSw z^hHFJ!9^@a=ySxE%fL#^n>0EQhsi@s^eqYz6;3RQT)f6Lm?9W++?^>qNDz3& zS6oPVlt(VhxO$Yxh>Xc?%t+?LNQ=Bl8q7%*+YgZh0^WkL>2SOdJdh&r0ZnN~mAt5G zlu4Lm%9$)gntV!}oXUR`N2|QbW4swUJgdAwAZbI$qCCo^R7!`eJS2F@rgX}RtV*eb zNkTu%4p<27$D1e!~mC6OT%nS#JtFUq)WC8$OyE{ zt&EE=B8(=uw+Sf_XQZ!6>l?siEL=N-mh2{LOv{NZ&A434#OxL7BJD5X< zo0~H69?|K6xOub%$V&pbfm>`1(lpKg!(2_(j7ru#&expF-;~$%z(4JPYhMT zL|$xc`IoI6_zxx44qNb)JG2u#v27uH4M@J z4AB97DTk~-NU_Z#8i3_kApK&-2^B9=s81TT(f$0;9F0;Ph0-47(Fpue{uz@HvOt5x zH^{4}xH8D?qs@%7P~d!0HRaI%EjhOuWm760PAr{MWz*8xOrq!nJ|tBDm{QUwh|vla z0!?sI`=rqgmD0D2(<&X$D{WMjvr{N@NI;6b_;e{{WIZu7(=&C1HGR@Ub<^%l)I}9h zM=jN5gVdF}oT$Su;Nv6eL@guPlI^pcQ<8r@*rya&X+7GFrP+7wScdaGjPN3> z>%Tk9*Z6$L&V+#}K-qZdzS9|6mVMcoCD^1@T1G9~r9Io5O(<3DCElzy>io<71469T zTFT?8GVt1#1>0>jTBPk;zg0T4wb?h*g;kqWnoBE^6$7iqL_W=0?z0%Y&0C@kTgoNd zYY1GyWwXNVQ)(I#w_>Z$jR?5CTE~4_t`*wIm0Z0YTe1CH))mKkz=l|`1={sb%uUYC z#kag@D;%>nUgDJh(QVue$d0Xr+|*Uw$!%TNUEZm@++3IiZirs#orT-&*xV%}>a;2@ zK+yp4kM~?$O$5LYJ6_~nT~Fg%=2hPGg}82;L0h+y@7-3j)&MQnv&(BMvh-yXi;*zI7~ z#9vMUVcHZh0n)Z1_}%b1;S>(u9}L1I$$=QIVk^!(8m`JLHeaM=)LpOzb%9Z*&G*kl**^hCv2qLFQmXj=*O!&^6wR^hD8W zd*W9<;3SgeNiNr0F18x3X1}FfUhZT<4&`E2IU)|(BsC#?1r{fkw-tuv7?|QTo#t6y zUrp9!q00qcmftZ3yW7gUJ`>#tilXEuUoQY)xc4u0~$6RK^Lrv&-wq%^7=X#z7 zZop^%`$gN_LFR^iHPq|nIgEfc9_WV*v354-xMXNc#%6hTXpAk24Ju`qKHGi9%YN?M zskH*0g~pTRh#8S)lD=Z8+~Q9~Uz6_R%zbH7MdVH~;)ls-MJAvE*i7||+nnyQkWM2S z7-?r^)SiathL+Rj&F3rK-lU$ht2&68*4;+duUXqa@}bbrR3fYPX|vtx1l&-NX$`#2 zYpmF7zV2(k?rS^P>%h*0!6t0OK5WEB?808`#Qy8QX6(ZTg+0gwPRNAG-h<1=Y|Y+m z&9(#1c1GvG8lv%MLe$ZqV`ZtgZx@2=1@ zotf_*Z}BGY@HX%BM(^_OZtcFy=sa!smb#V$Qi6;Tr$udyK5O8@>>&wgkA7PL+t(#X z5^gH+^j2>KCx`@J@BnCV2Vd~Li*N~_a0)kY3$Jhtzwiv#@D1m14?pnqp4(N0GV3bw zY&~&$GjVa=SsWn(%!UF%sEbF41?TX>h!yY-&+!S_aUR$49{2Gd4{{+Na$WmyATRPG zPjV&iaPS`9)KYOMk8%>1^5N(eex7L*h;cm#Z8&sj>BRMHmhEWq?U*KcHX@Nsrflib9fWC2n~2va|G)=TwC4BFFWbyt7& zR)=+2S9OD+bxc8Z7|3;9UlbeofnGlXI+XIF^vTpNc1j<1c{6rpUv_41_Bt%>daJs+ zp_^%!cAaSySFAcquXJdK+UaC%)iVP%knZmV^&5{mL8o?g&vtficTInHc#ro>$3lAV zc5b(Ke82a6&lGNVc7OMEVn=p?A9yb>^?;|t7clr;Klp{`b%lTOI*)k&gqL)ka=47J z@w%JwZ&62cKVUWLy-El8gctcG*!P3^^~l8cTVHvIw|8{!KA87+5KnfRXDMo2a}aR$ zR*!IkNA}3*@zU#gSgml9H}=59c}gt#ZNGDe*Z2CG_$cQUi~n@}-iu^N22ub6*^cU~ z{S*%u`H`=6xealjzj<1Bawo5NUElc$5BpMQ@AVGfhktvtM{<;(`?t67hJX0s)qA|p z`?hC!zOVbV-}|+Xb-bf^bCi0<-z{QydVQB^7Qa6K?s&6q+@Q~V&ENc@XZX4Ie9(vZ z&{uo0ukX=Uc!pngU{8IaFLu@+_$t3|*>C;RpZ$NQeWhoorHB0g-B;HdKI6 zz$XO*LKj5%Nwnxuq)Lr4-4Vip1PvCZMy+a<>eZ}Tp>pl2z$!(NV#gLCTb8WGv>4aU zZ0mL)+_-8d&aLb5F5bLv&6ez&a_@-1BV_(HiPH%cn`y@X@Ju?i>EoqL6HFFBK?jVl z8L)2c>{;{Y(4a?CW!vzq+|+14fJni*wQJb2XREGl+ca*wdUvljJ7uL|#D{+;&Qjbs zaxco4Ge3joIh#0(*-Qvp*|Fs8*DtdmE&BUr@8G?T2XMgrdGzWZY+g$ncE{eR=f{6< z-@fkryag`#=%36@03J7ma|J?oAcE3GXW)VfHmKl(5K6d{bwEXSp?2GG2U=|6aVDBT z>ybAii5`|H-e@AKxZ+k)ec0Z9^sROujk(!nlYlwu$lw|g`lw(ZZeSuIkwyME9gsmb zreOy;bOB%v19X5LlTWdC&;d1G)Eb9Byl5hrVWOD-9+_o|Ip&#Sz8IE_ZHg7!YjMgs zC!BQ#xFenb_ITuvLoR5fgM21Q9c9~Z~rxBAn@wX6LeDSFQ zrV9nf>UQk$$055rGOV90`0l;D=E^St02{miiM}rv+~|}EKTBB;?0xC5#6A1`bHzam zJv56%Q(P*5V6*`;(@2P{1=Q@4Jn|ZP%sL>xD!buDPlYBRK@c*>40FJ+xKeP_(mL)Jww=Z_-q!Tx+cj zRv6T>V*k21uw)}jug#NTE!=R#1rB&&sjI%yNPM{-1M9HMK6~smt&aNbg$-Cb@1~FL zdvd{J9Y%A-8;@YE>mnX<;>{mnxZ=<^?ZfgP+bjGDm=mzQ%bt60Huz|VelrP4G-3Yv z*bA@z@9mTRKKz~j2Ymder#={Ax!dpm)av!S^gjUo7r@@_?k{X|U7f18JRvZ!feuvQ z10g5{<|%N3%*zw;ut$I&Xl`uZ+r-&|khUsW2mvO%Tmv*9f)ffRg?uYP3sKk;#OQ=? ziONI{=5Y%tD5?xA48aT67Q+-`h6gUp8|Ge^5hM;VZ+Lqm6qzW+6Q;0B&#M8PFrdZr zM34qvT)`H>C`K)g@r!0WV+5rqK?y#OVL(LR5aKw4?D?yMFXLSJ4mLg#QV{`?s-k(C zXhIHkZF^NTqzLGs6UI~#1@!VE&7QQ!9=wr%AAsQxW0J{3>P$+W{A3x!!>};c%`;Ox zA}8y%Ng1xNlPbI-^+GAjS(38Aqjlh$3=>P3)0-H5;(JUsJx^h!zs>jrcwp2loCvU7^h-BbDJV)W)bCR zNfVs2ZSvH?9N+g&a*ooLv4P+MW4XXvu90K@Jm@Z+B*!Ln%>{+*WA}pj!6%H+S;qWh z=$M&4Yr2qy*o>4S@#)TMel(imRMr;Y`Oxi|l%FmQT`@h`%@8OnrZV^>|F|jAnF>G$ zF|DUe>8R78DvKwd91~pPr4S>gbrn4`67i#bDC+CEPbn8 z$yp}X5Qqr}i^2nLngXT8(wrb@L#!~sA33JYvZ*{LwnSM~H}=b>fGr_JyXsZ&RdlS# ztj=rQDp#~ph6_sYrcM+o+l<_ezJ@R>>cd?hG}c!^FjBo8je@^ytfAMO@j?psV|N-jI--hQ;|OQ@on#mP2#kM zJ196V2?Cp4PSsS$B~9l@^%~dUM%KI9Q-Y8O+fwmz*vTpW?{NP!5vx&j%W(Db2GOkL zmA03Nz?>K7M44j^Ike74PUdg_J7qlEx5v~}f=WGq$Q7dSbA`GCERZwBHX|~Z z@e7|O7q~KycJWrbtY&hu%w|@#>Q2iH-8D;^JLhF+k`=9LN=x^;vigK3%ti(|BbL5R zS+QD=yxxs+;LP_eA)87Yqh$m2DPer;@Oy@ z8o4}$R;$tf+1WZ}x3uKW0Yju#wSS@E1w)S%W zEt_$kz}{eX^t2JKaMPN*;pK*E5XIa$i4$&K7QZ;XGOlr0bKDb}__!v*y>NIZT;L`XEi|#z34_KI?^wm^rbVs z=}!MR9-^)W?oPexQolOZAEEWFZ~YBDn$v={X*$X}uIz94$l`RaJeb2WK3H{o%-;@l zbVsl5YH!zkD1HT>^IdXvpt{wf;w4!!wX#laJL2zt^gA&A?|^@N`l1SUWZF4V#S zBH-}B9`O-E*A*WGMj+2&*7k*;1zw=_fu9DhpXFts2XY|$ZJ-E-p!fPWC_MZ+0pAS?5&_#g_434MZ-W9!p)2!asF`yDEU;|43 zpc6h}_F>=$g5C&LAqiUH6=oq8reF+mVHd8T7s}ul)?W>lA^zC{8ajhDtlk>#p#KFQ z4S1bzv_w>#L5FzJ8!(|BHX$Eso!3DjAWGpBYT+P);1&{MAtIt8g5el4;vqaD89E{i zieV%!LM58v8R{SF<$@c+A>vR(Q-LBlkx5f6;R5y{1)^dg3gRIyq9L}TB*J1C&LSLMoQA|;+7$Z=v0cH-+5qyHh!nmo~ZAVC7|;VDjnDz0J_vSK2-qAb?p zHDaSR+M@bd;xBgNH}YaQjw2=#qYge$6yXgidR;R%G)|-UW#cy1qc?K@qdjV) zJ~kpalA}NN;y(gp8V;m68lw@$(ioMJRQ;YaHlzbSBs`{~JWeD%=A%XK<3-*gK8oWm za%4b$BuEbAFcM@Z!U6Tn4OlRwLq;S;w&Xlk|I zqDYP;Ne*Q(nq&*0Bvr8EJFX;4x};NfU`^g+PTC|@R;5n%<5c40Rc@tE{$y8vWjPY1 zST1WHs`mRo3NQGG=3PC0;`2W9}to@}*_^C1wKVSy})T5N2Vrc@vf+k`nCR{EiYM!Q4_9klvr*ICZP|BuQYG!S! zWCPx2Zic3A{w8m_CUC0ebP}g^Rwi}=WnXTmatZQcY3Mh1DD25U!bq*+ie&~T3Xc{^KeI}@KHmHLZO$IRIiKgXaTBv9$ zCWl7nhSn&Ex~GT2r-+8Ai7q8Bpy-2&2#ZE2g%&A{$|#a*sFK?M=#Azmj_RmoLMe~- zD3E?dkdo2m5$P))DVHYcj52A5g6Wffsgv%gluqe__NW3@>6JpLmKy1W#%Y*}>6|X9 zotEjD=Bb&gXZUSkU$QBn#^~?)-ko-7p`PlcmMW)es-<=+l=^9YO6r!HDxs3;swyLY< zDXc=OsHSSI1}maZ58uI?(DlBX?zs+Fo}q-N@*3ahjNYpzo3v0f{(ChK1IYKnf! zhehjzLTe#Rs|{kSwVtcFW~;g~szD{^xQZ*Of-9w_E3sDptFf*tFqSL3K5DnB=&u4O zt$Jyt(rdlmtHI){wxXf3E^NGVYrn1t4g4#*hU>f%Y{6cv#UgCNx+uf?p2I$@kjf*x zY9+@CEV>9vq%zmrRN^HRHtkohd%O)+(X06g1?b1Fizk+PY;%U`(Ez@%C z)lRL}rtGVlt=F0!(2DKYsx8%;?AabI-m>l5zU{|Bt=vkj-V&|d*6rPbB-ReB+iq>( z4(;B;X1uln8~E*&0ZlbDg;pXk?!mjViF7M*5CyXxJlx|c|Zs+#y?sBf@GOz0@ zuk$u<@OrJfeAeG0Z|Y{R_LeQ_E${PwZ}i6Q^rG(Xn(GnN?)9E7`EIZ7hOhgIFZ_=0 z`_690o^SEm?(wqki*hgYmT&(uuKyTd(L?*(@+_{MJrb1(ug?hOj30i)yz=Nt{C6vWbp~Hp`X-S+2kzz%QtS+w7n9&u+jvz&Gob@r{ z#*qtAnlxn);mVXQTgIGuil)t)H*x0FxpN>(pFny392&H!P@_mawNkoNX49lZox+^@ zQf0}jRkMaX>Cr0JuUe^!?detOQL<>$o{g$@ty#BhNxgjvmFe73cgKdsx)-e9u3O6r z9^AHX;lqgGDqhSuZr;X^AsZ$m;dTbOqsLi$dW@lt}A*p>C$UEtH!)qb8FO} zW6Oq3yS8c2w>Q7G3^+4u-oSC|o^6{r-rUDe8yBuT_-@zFoe!5wefsj^*pp{(t{pk^ z;=g^1{~u4jy!7+iucu$ny}SGG>%+@8PrrA4=;+n!hri#u|M$z?B4Bg`&SxKf`B|r6 zg6uW;pMwAzSKx#OGPvM{81@I@h8#Xf(tQn{utzuKq6UWl1476tKy!KiwtiTFOYN!!1i|nz`{wnFP&MLd?v(ZkA zZL-u}o85D;5Sy*9RS62yvF7$ZM-(N>TkUXiaYMW z?pE6^z{}E$@V*3#q;JCpH=FLk3!BC+!w}1<@x~9^t1Z6~-=%QH_-5>I#}a=`aj^fk zjIpUEb1bvUGlRUc%`X>x^3E~i?6J>_=B#tcK;N9Q(LxVRG}1*gJ#x}L^NcdhHCNsA z&$eC+wbD_$MzYgjBc=7&WN$6?*;Z5i$=6e3?e^PamM!?2ohFddQ4n?t0*z&mKALz6am;?GEbxIw(8-4*c@U3-7$`!$;4& z^s6_H{Pn$0|Gf6ib6@@U)Zb}5*V%h-{`u&quYUO8Z*P6u=#(0~wB;M3MOK?Yjzf*6!w2KBQ$`FZezAPk`h zN4SUBmGE?P&|C^lctWPM@P*e~p$u7=E*RSIfGNzOAZDn+9_EiaHe^Ey|Ajb2BI;0w zU04Gdl$b;&HgO7OfZ`LRI7KR2v5Hr;;uD>?#V&gBi%@(b6~d^+GA7ZCSsX$X(#Xaj zV6lyFRHGc<7)LTxQ3h^QfgblrM>IxpiGTd#9HKbLJpl5Eh@96A)i=Je?LY^3G(jFA zIY&xbk_3;GBqmS5#|`W;1fHaTC__2QQW}7i6G$a0H_1v%HsO_L6eAX3IZIi_G6_>4 zf-ZN-%U)J;2Ef$8D^UKnc~9rZy=+%mRRt zn&0d|1j0$qa+lny4c2SUKFys#BNzY><^Pc!LCMTV_|IGz_la;0fs6M$c z1A-d#pkly6LKn(~hB_3XwR~tqeM!+_R`jCG%%?s#%F&E=lmj32C`d;t&|qHRq$EwL zDp!ilmAbT_FSVvjVLHy5PBWW0&8bdz%F}FyRHMh~tY||^T3jylv2@j}2}bMJk*c<@oAqi)3u{B@)wb5U*X3&hvP;?N-u9xo#VtWoD}rF2 zcB#a4ZW1ml2I8u8xWQ$qY+=hb*|^_?@>*h)BghaxgDTr zfff8$61#T6ByBJ-l^{{5Iuyba&aE@2i`ry@*u4gxsds-oT+F7Gvn6KnUE!LPY*M;N94jN{q%xTzinFOY*wtZegxC;vabC~Ii;6>Bg(Iw!pnt{CGNvpBfu52?uhaKl)$9K+R z{xpfDJXf~9chx4=va12?WxD$Ez z8qoMXGpM2MUqKVv4dS$Rr?Jh<1v7fxn+Er{pUO*l=kv6u-nFlJD`SAq+Q#o5^>LeB z0n;Wn&w55Gyz6W4EyG&ZQcd=a{jF&o3s&GL{~tKP5xZ~;A6%{t*D-LBed}yXJikk& zxXq!B@h!Vq)*>G%0{$%m8mk-K!mM!0$H?@hqnyIQHg_h=i}b3a+vxkmdd-Pi^BL5d z##7d|*vD>GosZep%BFX{I}YQ;Le|BDc7w;+9tJ_z-R^k5d*0I!2fq9L?=J@Yy(`fP z!WZ7~h)=xYr_K1m%RTOokNn;zulKq~xaqkhqth|Zd8NDD2~dx^)UAH>tV46;BLIK` z8bI_vyS~a6hrFfD%lO0F{`R(aeBXDE2Eh0J_rU)<<#*qQ#pB-i$WOfPmrwlWOWygu zhyL@WKYSrp{`!{pLKd{o{q2LX^WN{i|M;;#{)w6&{GZ2kWkah=w(DBU*pI&5na%_w z*uVbx=fVAPpnv}R|Ns3LfC7kr+(&)IH+Ke@fPPng49I|>hkg%Oc?3v*`!|3B*a9(- zff%TP8`yy(zycolfgq>>A5elMc!DUHf)=oXEU1DmXo4>&f-)F_G{}LA)dT9}WdoK( znKfFmcWB|KfV|gz54c7~n12-rfJwN76R3UB*LVjQg;F?$LimJLXobEPgya`|T)2f@ z*nnUNfk#+`V@QTfXn{6ZgEP2>YzTuM00QC^hcZwJ8CO*3b#evhh1ur>8yJHx$a*d4 zhJrYQ1bBT{SbciPd0`lSj5tP?|7V7f7>N@&iIPZ(XLyNdn2DMQ1ej=vWvF?6B!*?n~F|G9_RSdl8ZiE4B36vQ5j~{rCJJ1INrH|g`gnn0x zD7k$|xROe!iA@N2@`!j|Foor4g*B;;?MRV4*?CK_gctdfM46T&sFrG2m06&HNSTlK zRg%Qlk5MU=nD_$#Xagfyl~(D5wP$>FS$GGTm0y{TU@4Z0IhIp-mH@eyY&n#Y8JRG^ zl6c7jUVx8F$!bl>c2IeZXh4BebOq})nxtt3rg@sF2?l_~noHz}y@!ynaCp;Tc(qA* zeYXjODMY$yn27nCH@TRMxs1fgnx%OJtBIVdiJHu*oX+{2&>5XIpqJD+oz|HG*m<4V z37IdzogK(@N11_g|M!gSN0(`ElB!6J_%IFgpbPY%4)Dni@hPA5X$|vvpZH0i?Wv#d z*`Di}5BJ~?0vezMTA&6>pzL{|1G=C9+Mo&gpb#3N63U(wN}=Imq3$^#8M>jm(w`dY zq3`*j@i`#*NunldpD3E5D!QU9x(hD)3@;j^G76)@kO|g63ND%oIf|n^YNI~dqneNj zCo~7j)B@m%nVQLOJq1*$h@MO^W2&ZWst<1Zrf3SM|0$;aS*LVLrFV*_dJ3X^x~F{#re6A`Ejp;@K%<4) z4Tnk%i7E|?|JtRBs-=(`saz_l@=&Rn;F3le21&}44pw<|;G|Cqr&Kzrf=a5U%B5in zr)=7$0{Wk;x(}`jtE}pvu_~u?nx}u7t5UkFy4tJ0TB?K!tisx;#EPhlTCB)wtjS8L z=)ew_TA3Mmq?($Pn+c8P396Vtpnf{4r`oN<3aI|c590c&y6~#zN~^P4tG0@(`}wPO z>aOq_sNXuT^t!CaYOnXItjxNv&kC2?_W?$52I5(*r+BTPs;%|_58Udl_A0O8Iiw_PKvO8%CIn-pK)5T z0%Eae|9Z1FYqJ=8tL^Hg@A|Vn+p*x9tM!VXA3L%oo3u(xsr_n@M3}Pt6^)hWjkWit zFB`L1tDovht`A$WwyLu`yRj`Qv_VU@LtC_Ho3=>1wEWr*O)H-FmzhkUlqA5Zh$W2& zE2;~dwOKo}UJJ2+i?d*Ru{>M2e;TqXYPLixv})V9h|9K+i?5Spr2klimjzPHWuAP8 ztrB~+eA~EP%eC{Ms)GBs=^D1Y3Zjq8qKezPj=Q>Ro3F7Oxt!>)1W36N7gsFHcrLrQ zpPRO!E4qPOx~7Y+V(YPp>$;3ifE|`@YaCz0B$edE~Tli@P4vAtH1l}y;$16{tLinD!>Cw zzzck|2%N$Se8LRez$Oc=F^~pSAi?vSyB55=87!b2+`;n-!XYferAxv)Y{Eo*zA9YA zE&RML+^qas1Tc)0(MrMf+o@BFzf#J>9&D<9`@=vSzyh4WE6l=3e8lV<#!Gz0@cYCw zY>-l%xfgtR&!xdbjK#t#pIghtq zW@V0C0B>BidP~RN>ce;pz+XJbf4s?>+{v6A4WL}elKQq|z=tEygpK^jRu;*ssKav{ zy=$wrm;AM~yvOnR$+(=$X1vQu9Ll0x4~OipG`z@lJ8GIc2v+>cu$;xrY{z#z!nKUL zLR`Y0+{;SL%erjMq8!X{3zsoK1;iY+tlW2Utjxd6%(Z$A5UbAYoVx7{v;$1de4Nen ztPJ*i&Gnqm+Puw9EX=3;mf+0D;(Ty;i^02B&IxPI=lrM#d<_o$(C;kIWL(Yqe9sk) z%@n=R+>8U&`_17zml_3<$ZXK$oWBaK(deAg&79G}aM3RP()(=D3*E$O|J;87{n6Gc zwV-#NogjR)aMCEv&_X@bEM3$v?aN4w&quw|NA82rB6c zK>gG~z0@@d)?yvjGuqT+9n)UD%u$`0{|o~P6m+^r4T z#I4$2I_+62Dd2Cm)+ zp56!U+T{(s@GZ*&N9vS<$z7tM-JgE-e==h;eFTwx;^70 zI0rT^%2z(-Vy@+QPUdoT4(#75E|SlEXRmi+PX2iI|J~+N4v00L<8^N5cOL0n zF6m)j>3dG;n4amE{^c-?r2qW1g^p80@L|)f=rS&XjsEDW?&uv3>6$+2dH(8P-shI? z>ayPBRnF>(-RW$Nq)hOLN_xXCUh23_-KQSsy1weRzU;SN>&#B;&Cch~KJB<3>--() zjqS8dMzEr_<}+UGZVp{=z5-^D?8*-9(eCWjzUk7Q?(R$Qu3KzAMoBS?|nI~+OFi>?t_Q!p|F62}j|2Uw2G@_TcdMnt%9&kNBR?`Jiv|aj*F7!1a%` z#zv^*2q#Wx z_;7a0-7X2;v>l^_Aqj;OM_{CAv4I1PM}?AH%u=!A#!4keo@}*pQOl1tZ{~bi>ea63 zK#RsY+FNLkWq62XLe@xYv|FffQAm5j|692aZm?N1hxaDEd>j6Ks6k@HL549}8Oqps zXUNf^PtWYxI%ewGuWye=we)B3q)m?>|26Dt*ss&lPSO|41>Ct|^d>`pAr?BehYKd0 z{32rJ#G~vv?Fz)s!0Nag5J3h#6DK^a$deGYt)$q2HP_P8FrgA|i%&P+=)(jdF7#6< zFyjV8j)(se6Ocd{8$6z)S1L+tIoh4xFazbgT3 zE=)ef^z%j>|LoGn2hB7T%^$Zi|8LE)Uem7$9dJ{!xZYC0z`i<(i($$t{lh3rE(PsV zR8mXrZqGvzJ(EI3)kKf17Sc0vi?%p`b3P_r&^1##sYJ{PI`RZH(NPC2wwh&-H5Jer zk5zWrRa1>{T2`w~^TJnSh&49Z+S?%s_&&sy4NS=8^+XhXU9rU@P<8fQXakM6)I!UY zHrmswy~Wi=BjWboaN{bDQ`UAxx7SXMU^ka{LUs6Ic$tk@-exBj6JLxoW_4di{pBHx zz7B>fE=Yqoui$gjH4IoC6u`1wVj;G8-kEErxn7(#R&`^3?b@~nkZE<#R)GOS;b5eX zR$4xFSzfqdnWL8aW}B;)|9H%M?bVrQxw8Gai!km2%&+(YPN3|i(^eVJr>C}>>bGN# z`&qh^ty}J`^R~9(9I*ZQ>#*^wwSrl_C89m{3|6}Y!Yo?%uwmymc5=$EmYia^wbpy{ z(0a}gU=H6>qQt_RAYJjrKWL!oIGk|#Fds6h)@|A=zx;OG?Z!H1&U+6>(Y_gN?b{=d z9{G3=iS}#pr5pdXbu1&VeR|t7$2<4x-Q|6I?tRY}YL11s%f#f%E}vxP*M2;s*uSU# zeeC0xKl`lf-;e(#=NxeAKCpF0XkW6<#NS7cdNd^kd-s9H=`8M(}R$>Yn%Z zrZ3NN3uuWO-2VU=|3FPmsesW-f$SD|LhGUMffBT!J6edEJ$No#Xh4$rJeWKX8clVp z8R5%JsKONn@p?jJVFm5?Lg4vrLs7s14Xs2p8-6f{7rK+b4Cq53X0d@2Ora2s_(dd! zMt@)9-{0 zGAI%ZkXdLE4HO7RZN!m|lPqE-DYr*VwlIGu`(xlvhr|5n;7Nu|9pe<421Xw6jgVv| zC0!Xw_k~fGTZy3`#WuV%$fg2ofmD17DM~sF;+LZ%rs)osNFEvol?Pmb9cI_cUr17# zv3%tnt!YVW|GH3{nVcom8n(&(;qpBK>DtIl*R4vVQ<%IuCeswA%v8E@j?kQDJ*#<5 zW8l+R+}vh2X(_`tIq{q%I9|}Y_M}b(%V?#n;vz}t%x%!qp7)$5MfvH^ckE$|XlN6a z3S&mmg)(#{g3lWH^RX~Ilq(XQs6{JEM?GGYk9z}WzdDMAvK(Xs<_sm21X{tMK+T39NClItoml9(*a%O^ArPX^i6~*siq^wIRk3eX>r_{2 zRq=f^|8zW6i(V62iF1*yII$wkSfe-C#HO{Wh-GY4k$T$2I@X(1jq6omW4N&1hAov9 zX5#+hR}ljCv#cs?Xi0lkUj#R`P9^SeRl8a~Lbg$Ef~}-xOGuFx#H5_nE&D+0TkQU} zxLZ1|-dbzZ@u5XzA+4-m3@WZ%~QCF%jcK&{?xCBE4mZGBN|U*O`mw8q`9X(hQ< z0LzrM8_lVs45wN04krs;MI@z`!WWpzxUN}cgKNT5NDLYGYlG7 z1y&+AoJg-kDCzPvwNtUCfiCQOFPA7>;SOupzxuUsfCU_4LP8pB!9ah5ZqcTDGFL>d{BmUN>% z{NXu_n7L9q+YKY&f+wjLiby8TuY}5GLkspC&be``9c^h?&-u=m{xFEUplQ&N)YH56 z;9p~f>O&`b(XXyEhKX%uAkW&%K+bezSteZ;^P1PCX2BBHTq>pH}}r7d~l#Q?BrzBVAwh&DVDpNWSx%q^J1Run@3&h zA=i1hJN|E;Q$6ce7dfquL576i(wL)8dK#6!vQt0Z-ZaPf)ZMOixW^sqANRS&x4z+$ z=e_629(tGq`r4x_z3d#Afxw#Xv9{s-?ThbH)#d(py5HU3d#AkJEiZY!e`n-DpF-H# zuok(fT<~Tu-{I{d^Jlc3B#c*l-6xOvoL4^fkiUG6Gk<$@Z}e|0!zoVv|5pHpoO$5_ z1AYO3?*hX&wB88Zh3Z-F`m1w2^0KGB(2LbKxDV*0rz z{`nbiy!D|!{o2zP_t-}+_qBypHU*9X`&oLD())YTE4~mwKO9iM^=pO$bie5Pw%KdI zu3I+k+ddWOzCU6&U8Af6Gp4dLzU0dQYjZjSY`xV>!1sGS_=~^lgT48S!20t%@be#S zQ4ygU0t2W)8{|M7%!m)Hi_b$n68u3048plvKofL8Aw0oYgNGGl!PN?#-RrztN&ubm zKU2DaCAdN?41ycPK^*J>9lU`yVm=WBLNY8t6-2=Yq(ACwK??M{|NQ%@z}vqJh?Cz) zu`T4n9K6CXM1oZ+!!a~N228^xTthZ&!<)h@G}p>Zy?;1FI4zjJ&^WZc87+)AzNO0WD%y%bBnEXtre%H;~EabiljTrbg?%DCt> zG@Hxn62rT+%g4;idECpfq{Xq!MZf&ZETk(v+k)7-0E4liI$=7m>NHiHI1Fe^8kjK1 z#LLPIO7?qA%goHa{HD$P#!z%g@+zjbJRKGzfB^{3{}W&`CsWP3Y|Y4=P00+z+H6kR zyhkPCD2oi4XFE*Z6u!|pzl`{l&m5p9AjQ-SPu4`vSaePET+Z#H%uU3`=d{g}F}h7l zL>Po36F|%sP#pr8!gNH+)bz&iR5kKU&hwm1^_0yH<3w4&1#Vc-S%|6jga^PJvgs@` z`7Fr5BBx0yPXBzJ)fCVG9Z>XyO%RYJ>63S zbjCba_{y3Owc#u*(w zbR58l(9vYw&W&JJOwH6Gq}5rCR!)@)Sg=+?r3V)M!)pN6^MKK@`c{4gS8<(GS8b7d zLsxZ$*6b-*cb(O;T&ohT)=I*=9Fb3L%90)f}l^*tGRKfcc-2sjXe|sdtOZo=pq7 zwcEPg+o27)ywzKX?Avm)BScNpz;(mIVA})(&FHF6xc%3(Yh1^L+_5cM%01d9wOqg4 z+$GW_!j&!P>a$>>1WmZL(OujyP!7jD-T%kEThtX^*>qjwO+;o!*nO(v` zs42YNSg4PzO%mnv-5gL|;LTJMn%t5lUe`=s-8pW!EKkR~#PWbJK+#hST%OPXAj#1(RV_s(gSfZX_;7Vmhv48D`x``=M9-;{R<{ zCMIJKehsCBVl=j^+c43%ieNBQCN1vJF2-XNoZ~R=W7Y-a98NY)c;fXSh=N?4WT4+7 zc+-JlBCmDf-Fjq7wy;!A&P#6P^5w{4_?5Y(;H>!NAmw8vp5#ilWNubMSXO3PX68gP&Fmyi z@04cOQKf2L*6vN-VGdt-j$C=3=WRYxdq&fH&gbos9W%WJ+1Z1o@MnR}1W+JofZhXy z?mG|$JdGtaY}tSm#!w%wLjRnc=3aI_x9e4&)M(|DolN*>kPc~)2I(^R=#oBZJ17H{ zUTK#8f|hn^DF6$Z&H)RlX_~%ioVID5&S{>`0UGG(n-+qc7HXg_>YX;~D|mtwUTU#Z zYPbBvr%oEER-$C)v#I9HMdD#pyuvw%==n`#Q7g=fmNyQS0w{=Sv`*`zMryTI>!R)e zxQ=VNo@=@efVmD%yso&s*6Z!;>q9#rzz%G`=4-+(Y{Ncm#1`zoR%{aLQ5~h(tB!1{ zwd%>nYRkTCRN~}mGlNVP1W0)VXAp%e5M`zjMu27P|441sUTxM+Y}elF*RHtMo^9Gj zZQH)>*v4($-tEP9?Ei|qY~T)V;TB}9ZXFq=QG~Vv6z+nr?wg&x5Cu4ofbH$vmhIZE zZtKSG>)vkO)^6|aZt%Ws?(D{O8*cMHZwl4yt$u=pPKbz}z~?^a>5d-y4sZMZ?(EKQ z{JwAQ?r;6}Zve0DaYb(euWZX+=<00fsE+Hu2v>=FQqz9b{SI&nuW$>eZpY4W4R5mt zw^I)P@D2xY{1ovJAMq03AsIZ@6c@~YDKQt9tdH7A85bxR_arA0s13>NhOWT|zl|e+ z>zd5a=x*U$!i%Q%86;2g&0O+OK5wLSasy{_DK~N|S8^*ax+}MfD!(PC=GHBr@+Qwh zEeG>3&+;da-TxNH@(TQ;0!MR;6}(Bfg!hi``S`*YA4WVcae}N^3bX`YQE8WK@Kk>)D>X=ghVB*9ds^h^F(?-t?YL^h5vl#qM=Pw*f?#@O;;Ien0nrCwPf7_=B(ZUGGnT z7j=d&c>jHe_$D`Ze7f`r-~V!L4~NAN5lo zbDIr;>s{~tLrj@JzSER;5;yUWC;Fd9_=PX~j4yPhfB2CPdA2`$w>SH?k9)a?d%CXy zvR8Y&m;0OFcGp63itk0L5B#iN`5kYvt$$;$$9KgCcE)FVwCDK72ll$3dyjv6%Ab56 z$a~D+e9iBC%h!9p|NGE)chR5v9FN0R-*K65h{0Zb*RSv0M)4E}dvbUDq!;;b-*wri zegDn}`Om+6&j^ywNlPUA?eYBdejO>VAo&Fb}Q zSFk836etV9EZP8RBQR*Y_HB%T23bA?G5283f_e{bERyjfMvsC6cPu>EFyh0C6aV8a z>Ubv0$C7*AtW24w$=vFWIr47c>> z-+$Bahg*TZp_QXtDAmS}ASi0cZG zv7XR{6FkJQZVTUy;O@Ij#yc;)^4fc^u$JX}Z@cjNJK}TV39M4U1VeW)6PhKAT)GP@ z>~I!dP!VUu6-#_=v6&_-CbJ!@=&YwLQtPp@Ay-S|wge!svIkLl8~-lMe7qowwe68>lk$(W{&h%MDn6{YIVVCq2s% zW0mqi*Kl%84&r~22`67vPoBQjC$0hb++#lwW`zce*ZukLJO97_{QIBef_(5gF5OOd z1Uw)DX^=nz?rwK!YarWVcZ5IDtpXO@fCW`%w{T@eW}T238=Ut%Bl&H5#|d2ZEP{Yk zt*>)*5Cc|{a6Jt2CI@2~kO2k&s1nR=UP%zax~?WlWrVjdh}RkJyckS)H^ z;S8+E1s7b7iD#kX%3g>w{QU8bfFz;&fcV40&Cq)BlcM}0iAPA{@my7;025L;Nht=g zlOYh|-lC@~LtQdBgKL7^h>$8uB9MRreC6z5Da%>XQvY@7nZY{l=8-7qBz~k9PDwVCoTs!L zIaMY^C^fMv*0350hT8Pr3!lkSOC~avWdCuiI8Dk@K+1K6dgQ`eRaw`dl0~X& z%_+;sia`PJZ?1sVXIEqTRyBkP41DzyiUylfl3ue3D!pt;QE37-2DXqXJ&A&{qstEmCFRye{(p`T(a`bprfP{O+rrbmk`;I8as+l~c=-o+wR zIT>IYD)o~qtx#jxlVUX3uf=Y5W{znbfg0nuc-+0JGx^I+&L&yOrKIwKo(fbFn`^4_ zlyPteOkqGTy06VmGF2a~;mj$Rry`=sB{6MfESv02zg*E81OX#8dqNYM5DtsmOV_HSNn`=fI%F&dq{49YA`m#M7V_wH}}y zZE1T6#nOh+wN0&UY?r#*(v~1ji2p6_ao6&d?CLXfe=HzOiwKAAe(1a74QYArWI)0u zH@+(^Y&4z3WXcYp0_@kMNE6&U4gJ9Zd=Twt%VDSve|WelZGFEhZ84 zp%eWPMkj>OJ1%i(G5u4Ve)`Cq9=xM691ly6y3_?xb*f*T;~|eWrm*hse>Y27ANP9K zt&aALv;FHz_k-Kp{s+0!{SY8GIo|WW@|5qr?=7Es&I6x}!4tmlgy+W2RYC@4r{Kha zzy;)sessx8p6f?%I@hzF`Tvh$KJ9An{MkMK`O%Yp?WT|W+fSeRLabi(uCF`n;V%2w zk9_uuAbBDXk^9~AzV>|A`|pGQ_nE`I_<}b)^0`5CJxoj{#Q};0Y|tmLzk%>Zul(RI zul?;~K5d}i{P)8z`qICi{8KkS`pchw_0xX+?e{qR-{1TAFXHz0ufOo|pMSsezyIB~ zxjGyl&JCdTrOhTtPQf?@5O4`o6bji?ANEZi_e~(vd7t=Q;P|nh25#Wo$)5*u;0K1F z@130O-QNgC0t)Ki398`!rJxJ?-|%Uh%UQ$C(Vze(UjbHEx{Sw)WzQ{HALU6P1%{sm zVj%csp!;>860%+rHvgdrg5V0y-xJbb6iOirzTg!CUkhR(3C5rd)|~O(AOX^x7tu?C z#DuVPM0Q1<5K^EUw!s@3AreC26fPkhQsEuep%qpkANHXMYT*_Jq8EN)7&?OuilN~> z(CqBb?Tmm!tYOl%VFV(b<;9^K&S4(fp&o7`CzfC*`XML^q9}6VAQoaS)Sw}bA@b!8 zBhE@;K%yj0VkBDPC5GN7-XbpMqVDY>FXCP(j$#)AA`Aj!@Bv;SBBIf;POvNnmmHNW z(jpvIq7zP|F8*OJ2BS4*;V)+6HeRDJej_##<1mh+C>oVt&L@4w zr+j*6fhMSe)~9_kWp1jaV=6?q0 zg=Q#+cIbh!D0qHogBss3La2F8Xq8lGilXRy?x<0&sE%SNg8FEXz9^B#=xs8mdX^}9 zp8sf$@~D$)sEY!rkQOPG!e}Xa=v7W5$GTo#LaN7Al@{Y&D{p_VC<#^|2Ye84Z=Q*bP6-Ww0sm#Hstzcje(I`%Dy+t8 zsG_N3lIo&1s-NPan0jifx+AIDzyHlqGGDE z605E%Yp`Z(wLa^tmg%Kt$*C4;vSRD9a_hF1YmaJbx02(x9;>>NE4rHNxoYdXM*pj* z+A6i;YOY?Z-O+2j{;R*%>$<`qzJe>N*6X;!>#hRqyb5f<-rc~eCmR&3yEg2;@+-#n zs>UuX!`dsdzN*89CnmHjg~Fr7_AAh3?8Tz&#&G4{ZIbMb9_-1ctj?xf;w;uOt=g`w*s`tHzHQsW?biT>Smvaaa5Ztjk4@4jxQV(ywICK-6! znBp$)CU5NOF6{1Z+tR93?q;bj#u23MpxPp&oH(oEDvGQ!V%(_FqDPLdI)1!J zvLr;2s!pn0DX^eJkS}A(oJq6hDT6I@;3 zL`ijORjF64YJCco>rkRyv4V9-om}^F-pnBbuYK#d_1D*fM}NM( zyZ7nbe}DgPp1r*J@aWTzf2&?Pc!f1?b>_`6(Eogb4b#V1W$^C>()*Z3y9q4^k*%g&30PU56o}2x5v8wm71RCBCQ~ zi!0Vhql+BEsAG&WQg@?`K=wG}jzShWWQIAasAQ5j9?9gBO&Vz-kEKW%<&scp_@k3o zS~;bcU1k}im}G_tCXrNr$)%ZPwmIgRXvQgCf@;#arJHZ!$>y4H*6AmL9^Q#%o`LSE zXP;@Zr|6%C7TPGGhd#MXh2MmyKEwT|m9y0zM=?w?83+wHg9%KNTh`@&mgx&8t? zFSPd-Y^+=CwrlRP0;fAL!4LPV<-`g%9B{-3&k1qG3}gGrzaF1!vBM;b%yGykUtIFW z38%a;${nvPv&PW69J9(e&rGw-FW;Om$RmRb^w1gq%<_mWn+&thK@;t?(M@9v^|nbX z9W~Qe=X~_mRd;Q(*4RxAHrHfx<+a3EKb^MPS&uDssc5gw_Q!MAy|mqK7yY)?U*rGX zHr;-U9r)mT7mj4#cPFkm;erEhxWSJ{E_B>IgJSvRa{tXZl#+LjG~!`9F8bz;L$3Mg z`g&e^&7d!i`s?VL4*Tq~r(X8$leg|V?WEW4JMX}+F1+oyw?{eV$Y&n>^1U z@rXaPp%RzK#3r7>iAjv26sJftMZq#{YcNI>3^2uOq? z79=S}NLn%pm&_y{k7xo+^6`->KMAbP1tTxoDfDLR_1*_GMa&!jn6oX>F%Gk7)RjgwjEK?_IO1I{8l$M3- zTZ4K?xnlO3ob0DwA^T9gCN!KRjVLY)OIX34m9?;q?O_!=20H)PwgjPVEHz0hS+XX; ztYICkUgx<)o@VyAn)R$S>44hQ;#QpEWG7ASYFedEpt^&_ZfgM>Qs}N$w%awV0TOH5 z@(NP7`HX2%SK3>d3RkVfMXr34Yuxmrvbl7fq;&N=-Mi)$qDbX!d&6tk=%N<92o^5_ zqFY|uPT{=hb*_2^4BW?7_`RRy!hVg*R}Opl!}P6ZZuQw&KJK=}0X4B*Ppew7a^bY* zOec)L8`HlMSi#$r@PHFMTMajO5Vq}ra&^33_Lji67yd0|Q%v4;=5)g#o-cjv$cmCGG!?Y-^KbEpo?|sj&ICm9^<&8IQ_AM2^nD`2iO0?5LL3AlZ@dEdsoU)-mIP- z%jZI#7{yu+^nYK>foi__s#Z3$Rm<7jJ9qcMiav7$z6|6_(_s%esB2^4{Mwezna*$S zb64?vQ&Q*loO|@FBeTqEL9@8dW#;sl$&69$Dm0Wfru9dCtmaF5;GYq0F`W_c=?fG) z)S`}LsZG6XC+~T#DsFWur7d7rZ#mX9)^$`n3~6je`plI6@q^ne+E?@T*wr4cHS^4F z=YXp3j+($NY%>6xcVxKgS z)IRbwF`nlvY@7-lhj+AhFm$39od?riwIgqi^QLF>(0-=5)GH2WBwHQLxo!XfY+hr8 zCmf`_Zg4C|OQkTcl*In^MeGFY&(qqnO~U`-f$fGSAD{LSV5AL%#%Lj30s z|N7hi{@s7#@rNJ#{`(*O(HDTz=Y9ECfYkSXj)#EwM}I940}l9r4H$tEIDr(X0Uuz2 z7NZq_7(xA%mK*L@Lqh9U@pcxZ=Z2!BAQd&;+j zQaA=yxP4Jbh*y|}1(<_dsECWmg^vIDgFfhmkl2HdSczH~1&5f4J;VZLmuPKxZ<5!4 zuIGA6_=lwkdzIFDuds@&*ot`Pim*6}vPg=8M}$WxcX)S-fCzw!$Ao_Pi-A~(!Z?VU zh=s+7iR>2zEzpTOMs~fJcCko{#E6WHXo-!Of54}T(YTGX*p0lGir)Bpws?!=sEg+4 zi^CX<&*+Ov_>JKBj^g-tK1YJKw~TJ!iLvF3>j-?jAdPFMetQ^@c{q@I7?9nEi?7Iy z38{?>8IJB)i{&VM=a-Jtc#Me1gA6E;1$l=Yxse8`f*=`$Nt9T(M~}+Lj0mQWhzEPF z_)k6zG~T)C5DS&ryvmWFtM z7g?D)D3@cHnQ)1eO4*qoIe|=Bk9LV;D*1M-7?yNNjaM*4V9=VY`I@j9n`JbcX{1B5 zCqbK#kkg=dyP0>@a(B3yo3QYZ!U>$l`IuuFnUZ;yk9R|=`JB+{nyfjUM?jrcaGlth zo!Ysb)!Cig>76;?1LFVr0^?bpXh@#ushNT~ms!w&VZa2OSWe9tmC$&am39yLU=R2( z5B#YP?C_re8le6;pzTng=^&s8N)HOUp#3=w`{@r58le(8q4-&$4(gy4N}(CLp%$8- z9{QmldZ7<0qPlRQC3>PLnxeW;9V@D$Ec&7?%Ay21pw&U6HhQBqY7IH6qdeN9KKi52 z5Trsnq(oYzq(BWux(k`Wqer@=PTHhUx|$MLk0am(@cEBb_fe%Om97_|`dJTPYM}8j zreu1cWx5V%nxrTRIia(bsAst<6w4|>|Ce)^|?`lW&zri03$ zg=(mWYN(33s5k!#q>g$HYYM57ilme}snTGn-GHgspr)G2scg!oQqXkjM+NTb1o7#0 z1-7MW(2zhzqJ;XXkqWD^+Nf??r~H7Ya$2HximQB@r@rc|gF2##I;@OJtj1cb4CHhL?tyv#>C<6YH~5`>7iHry2XEMtihLtF-pYv`q`Oa@(&_`>0b} zwJN)^R134EigZ?LkKfv`;R?3p3J+gOwupPKXS=p|y0~b|xbW(+k^8YB8@FQGpL3h6 zbi28Bi?^QpxqKU%eme%QC0<@DcZ*5563eqao47xFv5Gn|@k5x}}?{H@l9iYp$-#vX>jQY&*TTyR>hsxwLw>{K~t&TerU} zyuts=vc+4CTx+_6yNZEVxMTag&-x;wQZ%e^Lxz29pM;H$mE8@_3J zwK4mi$%u62tGvtWcFnuK?CZLY8^5+&y_7q@`s=@zi@z1zz4Z&g{|mZPO1cG%0|yMQ z35>ep>Xl);x~<#5iF*ywE3^7RKHJ1j9K}#P!D+n1!Jx%ie8+UW#cbTgYI>bm8^(&bZ>@E{D6GCoyu_8dsTKeG z!fzbMa6H3PY{!yZ#m$PxldQ*k+{NQN0%B}L?8Y(t$dG)= zb^OXUOv$pG$F7XYd`!IB3dmPVXkymOzWh>zT*@kp%8Fdf{;JBWjJvIz#j^~{&0NdR zY|FRI#+zKgw>4m*jCe?_#KgSFkDIGzvL8jnM48&(%D}pN!4HEX?}6&kJqL z#(b!H>cSem(FJ|cmaNd{%)=o)(jcACB7M^6K+)Lh&YbL&Tadi;yrrqTif;e+2_AaL z6kXAYywe=r(-UpcCSAiyO434&(nL+mNNvi@LTK2>S^S-MrL1 z9n>X#&`PZgVExrv?bQq2)I0FdHv3f}ysF-+h?twxV;v1!&DBHQ)kkgDVO`gEE!Jes z*D7t+XboPR6$4`&&z)eZWOxO-AP;ff*g*Z*cpce(t=D;7*~1_VmMz)oI@ykmrmWzC z18l0+{M1nCU6o~lh%Ls4t#u@*1qzzda19Net=XJi+k0)>nVs9Xz0-2t+rGWqeaxO! z$pnENehhbVsExIQfY`15+Oa*`zdhHGP1}7<*}8q%){WWN9o@hk%hLb--Ow!$s{q(o z(2Ua6YFfwKVX)d5Co&GJ>e2w(d0d!nwQ?6*R5I5;2PlC4-VnIx<9L4OU%uyRF5iCs=V%V&W*+E#p5`3vr>y}Bo8FLq3tCR; zwEpSDaO+2&>$-mFhA!%zUfU}U=D(ilB#!7NiHTA^&xqz@^t4ZpP6Z$y>6kw4p(;*Q(_QA6R_dm%$Se_>@MipuI=1z>+ufnOKt3>D(;BY zU*#T(t!@FY?%~m{?(IJC^1jgXj_n7Z@Wa0F3h(Zt?%DP()q?!y5~X36g-ZU;1ENO- zu?`Ld|M9pE@*xlC4Uh2jUh*h!^2Gk|-~Pv;eSjmka|!?607$p-9WU}DkMlX7@+yDw zKF{+j|L~;#fQ=XKf+&M*Nb!B8QYv=t=F3BsP-dFq0=$mSow|B{Y=LV#1VJQ`t;vHfiGI*|XbEpgx5T zCAzcdQKLv-F4fsI=u>PtrB0<9Z{1a_S+#EUCeQ2FIXNoEs7R%(Sub0hY#GBv#{>uk zL41hP<&0f4Yld*4BZiAw6A|B1G-3gx#*PhykV?6dspH3yB|E)IS?OiSP%#JFoV4?2 z%ayA}wMtstx6!G;uI7pktk|(x(5_{|7O?-4BylO|*09Dmn>m;^F~ss$Vqhj32w%*& zG4aR7nWayr?ztLh&DgVR=U%NXuzW{!BqdWLNdohbJ0iBY;;l~Ph%6#OXd6~JtK{1!H6lA zSPP3CPI!of5k0UE3<>O`(gj!roro*|)8I1EI3Z1tQe7kURnlI0l`d0DF(tOkF4U{d zQzVrXV}=Mubk)RIQAjb%PiwsuS8jI=R#jsdfmDW~-ED_H zffJ4mL9z5NTNbzN)?7x#6nNlt$^8~!Vb4`}VTM;Dqlg}Gu=CSUM}4n}_~aepfdej@ zYp#m(4Q$r_G}!XFe-94$I)YV3xZsy#UfC&yD{Yv_n;llxi%$I%QQi>qOCpSF^Cj7^ z7Sb5QUzb^S+S{fbje2UCW3K=C>YOzVhr^wdYt}Ef1kw{#vIQ$T2y4^Ew&bL3HS{7q zQkHv}r=hMISgP~Z8*7{S*7|SM9_|z)_IMT{Yz_n)8@Ub6W_&P=m`n0d%FQTnZ@cd{ z7;~68PdID8hum7{h$qIOaK4m4b!f1aoWYIO9cTPMlP5=cZrthie0Sb^pP8x9(FJ@> zIR$T*JrNYI09M?LbE|nbWG~w=wr#IGcg?eJ*>~OR?*4o5KM$UG&;d_&@U!qu9%H!V zb+Y~CiIARzQVDhYdhEI19%ubU?_a_336FonD-!xZm8AN)4}J@TpUCJZ0@}4rIrz(8 z1-%zO3}#S++Ur~gGxz^Ln31n<0W2Ts1~(hq#7lt;WB^>|2f6Ak?QJWt9Aqr`!42Xt zhdTse4|zB&5(>{OS+IYf0UWMT``_QdH$j(Yc_j}I?sMGs=JcR>^(7tPnT zvhW}a8acsk#@56ZI&pql8sh}vc0(-=@QPX7oE+n*!xH9kh+H!wsF>hKG2#nFBST{Y zU#OfIW{HAul45|wWNtzLD~cr3-rrK`H-^pp7#eW-+yqOgpv`ncxiP%$9l1;;8@#rUN7b4~MwrO>+?QoM!Wy z&^)!Vkq#~3=2E=r3v!CHoZ}p5LGftJf{qZKlr%>%WQn{38YCgPOoKz{PzieO^P0bu zAOJdYg@gVRpd$@wKus#pg{Jf!<6x;n)p-_Yj?r22qv%`SNzcS>R7Kj113woj(vqH( zphI<}N*TIRq#7eXFm0z=LR8aJC2v2yJX9h*$`LCB6{z3jDoV8~RD*8OsOXd^Qom#SqOZCaa&%T@OmdA06!wM)s&=GVS}P3U0# z`ve&nwpkY=Sj8N;r*j$1(FaQa z1JnQYaEzTSV+z}t#lV%^l_sMLgubidqW=GeS&REW~ zfWxaa(UO;%^b|8bbIKbFEWrknQ<0L9py+Nbni-6yGNdnzUsuO@&K+h=rT1*OGp=yc zgkJ9jTwvxuPB97{Gc~FcwGCEB`qi+0bbqm|DG*PL$9QUzZWeHDY{#VubZ~CscnNAx zJ%BEGA-0-TeePtpy4mWcwXEAcY5eN=bWRxXI~knqLV8Oj4n-gFv_sWpv$H$`Oiw!%Fivy0Hzx5jt~=cuKljH+9`8awInVkY-i!ra@D`64 z%%>nAJFs2xHDA2r8Gnqen_l&hKmFthSa|^>P)WJg{L;-R?j?|VhEjif>Er*N^VF|? zhus3{312#yeH?Q=d! zLFQV1o<^f{UG915Q(yk`w?6m1pZ(V3Uq<%VKkEIz>i_#bc*6!;s0D6FhFYKpcw020 zQ@%gKydR4=d*U@C%O?-OJ=`;#845l6>%jWEzw5)g{u@CO?7k7a8eBL)7379ss0Z;I zI`S(W5=$ZqAQjzkzY;sU0@y(wJenzrKMxGT4-7z`6TuKHK>=pC`c?nqkBL~oFHwKsBYXvE=-y; za3gUnMiVqgbu3799LRM{NN0q`Sa?Sld_q`69pi{NOUy@Z)V%+X@x;3T$Ur1Vj}*vr zG{|&RNL4IJlf;yEOvwZ61YnTHhkQY#n#T~MB_t9W#lof=@QpuN16;gFjNC#*0>@zN z$d3d`BMeETL`J0)Nv4F8W_(JPq6cVn26bS=X|M-clgTKIg6O%%pTSAsSh6$N#-Hp( zp#(&$D9UCq%2I60RcuOvBuQr+IuV-61C#|vR4DQLf>Mz|noO^G;k>E}4#Ff$PUOVT z>q4|tOU67(w|vZ`T*|kE%eqv_l%xl$ERVhH%dIRfYrMwF$qPV%t4}MtO)^U~NP%)A z%En|%$9&Dmgv^tiO@xd~xfH`mYsadj$^*=Wc!bF}!eKEq_Y)7z=OL6;k=~KLXoj~i1q6;l{?HbiUHhHO`hV# zp_GQ|oKM??&Fq}agRD>COGCeLhBeF;sFX)7v%JeA8WNa2)k**@49w=d!ES5MiiFPi zq)!U9PwKo++SJYo15OSNzwq=$db_j)iXWBpwW4Xzc_BOq-NMw2&I)x+3&l_wmCYH| z&$)ayx&%+fAyDG9sEpY*XbMtjik1N|ls#dvCmF5?9W_MDiN$--7%fS}t5FTLQR}=> zEagw94A2ghf&m?_0_8Gmnm{Y;HOd(PY($7N>$m?2h0+Us(@~sKDwWJR&CuJl(k$iD zJk?X+1S8A?yrg3yWBqsGjDR>4qh0!Rj(=&wBJDt=$t<*QXR6boPKLrsn z4b(z9Q#2J!5`j-7a?wVGQ&g?ZN5wihl~g=+RaK2uOPy6({W>o_AsVE;_A`NfF_|$_ zB8ym4Q$5vGmDN>+)K>jIST)vHtyO0gzfGOC^|->#OReNdPTdPfMkQ894Zvij({HU( zN`2N$Emw0j*J!P!&ty3i-9bXb*7rQTC*{^-tyen**L%&^WhK`RJ=Yw)hIGvfvVady zEm$42mbH4n!#K3Hqt|X_)_slGV$@Q9t=Rv5Ef7w)Rf(xbU`4uoqd*i;Q2AifQq@+6 zEmnwSRz(X};A2^d9oMR(Sc{$6ehpZ%Gg!e(n~6JAG~hy0V~mqU*_5@{mo3_%Y zo1_KKJ@`_9CO$MzTH&@BD261S$I7lc{SXuZQQPX*~cAS(k)%?AJWCI7gy^+h>9taYSYDdIkWHLgFyk8r$_z~A$y(+_p4(?`W?X(` zbgtu<>db6r*YnioSnw=gV%}`ZBye^uab{+FMYU1ZX9R|1UXE7x(38wXfz(MbI=N)$ zgW}f8XMHv{h_+>ao@oDFPUq~UW_H$9iED_k=>U%=0umM6Z*J&$b?ELxynZ(4A9m!5 zj^@0@XbBD^YxdjBn<#^BXSJ1_iCE)06Jh>@yDcW?|AQ~076*O~n3YAnqE70it`Me9 z;9Y5IqLyl7pz5ktYOE#=__~E-;Oecu2CoKdu+9XoE^D&3hCLu_vYwK)PU|U|5<7tF zIWPmf0Mm`d#M9~7wAHp~69hA;!38kWk;TVO=4mLi>P(pG#9nO1UhFc+gvXBTGMH@2 z{sPOsY|G98zT9lh?rgF6Y|xHnj}~nj7;V!o?bA+e)LsGAZf)0oZPH$C*N*Mbrbl^$ zMY6^1nOsl5yzBo}HqG-jl_>#(khO$(zDU6i0p`faFo4h9yFloUZq}Y|>4xppE>i2p zZjaXP?bhyc!*1`EtnVIg@-A=lK5z7XoAh39_I_?c7LfAx0OibWnyl{#?rr?GZ{G$l zflXV6ScSQs>l1hcw07bJ(%eyX-uA9524C=UYj6mU@CTQ03RiCncW?~Pa1GyZ_wODc3!t@VkdHBPj-lb zbY>rRWnXqnfA%v^qGPv55BV%4Px7)|zEfwSOWn{u zyQp;$Cw4`bcSPfJFePqh2QYvP$7R3uVfS#E%XcD|@Mqs?fG_y+)^><$xLKlh5o>l^ zH=_SAPjW2SYo&VxTj*Xk_eOFD_&u+I+wOCI7j!{~_I29#kDqjd0M|e$zmM}j4|#yU zs+N~@M*nz^7jjC!`9IHdQET*^pKzY-ME@9%7kY_bc>w`}kSTM*adc-Qb7H4t zGm2V#+h)NDcL8t`g{AqFSNWl@cbSKHeo1Dh5Br|?`tn11od1E{Hu|y``(-Ejl81Y@ zpL@2a`?!~TM8|u#H+rad_|U3$U!Qiu-*%0zJxPFrHqUx-Z%@I0{DSxUcAtD{uYAZi zdCIqZ&4+k_mwe3k{A>q((P#F{H}ZuytHNL9WI6nwY+ZNFbJ(x!3jjrL2*mJnrUz`s0;r~1Zs@0#C! z?uUK5@BGit_S?@U+%Ny+Z+7ADBlZ9N=0E@RfB*J(fA(jVrx!J2fBL4E{`t1{)CUMB zR0O)gLIFYngb58CjIeM4#E23fQcNI12M7fjG;EY$!6V2AAwQBFY0|;TlqyTI><9zL zj~+#U%&ckircD+gQjFlK^X1Q=Kzj=HS@ft4m`ZOfrP*|7Ql?O+Qmtw=s#L66w?5VI zWQ38YOq50;%fsxzuuRgfjly6+bxbiUK!ip3B zFK+CZF~_S}#X5ZEu-w6q~gnW2O#>dKyYZSTsKy&EPrBknN9VF81I4M_dn)&-q@Zvd7F3EwCh*mEj&O69R#652m=T(0fG$uw*he$#57Z3Kwj+k-ghH?H64c?ddS>|*NGS+i6d$_9*RGW_8@vJ9+e`D*}*p>jWw=On|^uexJi9z z*!N?OLCV)(7rjyR#2&gR2@57N1h~O}2VV3+b2fRjREji#2Lwso>GWKQV2Ww~Vwh!` zNv4PwVyNbYUb^`vc`BARr;T;OH%DH0-pIzDJKEQ0e1Xp98lQRbNF-kssgUF?oY>ds zG{HPudTV-`-z@53Og&YeFB*%0v0{%XtRet%IF?tV7l;d zFl=kCa}Y~hF2&$heDQTYpbLf??0Wq1x*^9)Z@sw6dqlmv28-*ycLMtVvTXnd*aavB z^G7fyOfs2pr3=r%>BANaJv7Eej~O)5Y%0BUj4+bcG060eOfttNy9Gzdb`JY8%wjMR zFu+OLY%tC_(;{hr49`%PT4%Y<-P%Fx&w4#07=is{**BBTqt2M< zk?BK8+!Y4yTR^@$@4d_Rd*Z$aKm6cMk=FR(LnOa^;>;udyz`0^KYh!{ThFiXZ$W>2 z@$`c1F8JYNp85FRmw!I5Dg$b}@+4d|02yPu{`$@bF)UmK`Rl*`|CE0B|33ixx4XL~ zsSIGyg#jCtgB_e81^{%zZ}`T*y?rNuf8$QxGMF6-apFzXr5V2c2{z*u=QTS+>#tjjnQu9t)&PI@Yp{a+}}~ zyi&Lr41j@lJSH2T*FXlj@|C^Z%pm<(wX(`ZwKC_n>=>jnA2qj;( zvY`$Hqx)#Nts*TGpYiRAXh^4m7fVA!^)>S@{ zoHb=q8}}(yb?UURGA%3>`&UXT8g{S|Mk#U0?Y#Sh?l&pb0Uk> zu`2PhCx~SVXoWSAs+J7Wil`MAx<;o4RJH}ZX=M+R&(XrqujNeZO$8gJpf*;h#Fd#* zshGRl87ZkIIBhJIpabc$vVBV>m1L8OT8lyy3mBd4`;170;u?3dw#+U+2MXPJh5%*j za_y7Wz%KZzcb@U&>{M;5Ja`_LusTI+4|%i(o%P2f=oQRn$$MBLieV6ob?`kIn@Q6+ zv4LxYCjssYUgbqq!Nmjtatt)3wKWy1U2%iw)aeO1X$*!9}x<*QsJC@lUtURb_G2C<7Yd3l^OqLr037&LhQ> z3!cR2&y)a9B{WybhxR0-k*we@Ae5m!e$rZOi{|N85ym^N?q|o`)eWZ-&ZaJPnF*wV z6*+Xg<}GHc1Bl`ddl{X}3=cYKU8&9J!4rGv^9!_$DM1Uzr-f#;u@8MwN$0fD>7Agb zeT?b#o;ufWZYLvmxzt48dDLk>^^0}?z3Xw4o7@pJ51UImI?gTdhU#gpui~vfLFnn% z_U^NfDyw+66B+#6jEUbw91*6^FOzR#dkr z)Ir`Jr#Hw$J_nE6TjVCc1j-xPm2%wrC^8JiJB?PJl%)Gbnxrn~2Hvdouh zd>Nm&yXY{V_;xa`bbDc3=?CEBEhVnk6#~8LMgap)n*Q;Q%Yo}&-#XaC9`8Glz3hMB z1KQILh_$m_<&MY^W7PK|2yEh5%|F;L-3K(3c8N637S~~ z7mj~?Eg&EHNl?D>gt$EBXC6BLrY~JsxWXFfyZ-gDYrXWQ&x7behlka(-t4G9JJ+G` z9?sML^rd$_?o*%p-HY81hiJRnTW<*82VW73`2FzZUiY{&U-`?&JM?YQ_rI%y@YcUR zHx6&S#0w<~uy9Y~B|rIOJfi&OKY!*`um1IKKJ>O{zwYBNeBO_~{`0?o@$qke{qO(v z{?9-C@gD#VAOR8|A|wI=HlG1Pg7G0A-9-WfD&X@)pWW#j;8h>?WnkfLAo;yP9Ha+o zU<;qP2Nb-)8;l?MpR=C& zVGy3787|-vq9O1d-x|Il93r6`Mj#y~p&TmV5=NgBS_2dkp2xg_+iZzR!Nhd96bc?< z7k;54h9M)CVH!Fj8%81|N@5(Up(Q$C9p0fP;^8LdVJl1@ANC;!ZlL9OOmTG79BtGI zBI5WZ;vzPp81^3}P9p5p;w-jdA>866>S6*`A`y0?4+f(hIv+6VVG}yxF+QOQh7Z$d zlPWeL7fzll!Xh<}AurmZ9poY{UgINTA~yEoH|`=hdSfOQBPX7tIpSe5exfLHU@4+v zD#qhyNlG6>wj?q(WZ+@l2oQ}4 zS)fHq<3++jMrx!;jwBFW zD#vLC=QGYF`Vr@AvSwuVzGG>jM=!v3ei>m03zUYbqsf!M&j0z}?+Gs?w z3U})ND3j`EkNT*PLTQu|DU}wfmFDP&I%Sqd-i;E?k~S%r@~D9RsFapzm1ZcKrs<5X zDVBy`mnvzShG}@Z=9rSHod)TYs;QoC=#^?|oL=W!iYR?9XduYxonGUf=IMBvDU685h3qe3dE{%MU$s$+~OiCXHVim9h6DynuWt9~l1 z@~KODCaDT)gm`GHy6SnZDzD}$p6Y6>YO1U@rKr{_YRaCWrYfBVYomJRuQIE!4y&j( z9)00xvMQ^SKC8Bpxj-LvR*5;X6vhRYqtVxyF#nCj%t!ls<^KI zYr5X$yTWU)+H1V_>$l2l3v6ecx+|jUYrY<=b0Vz4w&@wnYpR?py5g(4DlES?tHoCA z!uqS_p`x{7ti(?2zV0f)W-Q76E1!}pN|fuV`s&A)VZv&x$X=|+mMq1B>%dm4mlkTo z-fPRgEX~5~&yMVwI&7&x?9TQc&-!f0#_ZAp?aT%(tP<_9>a5WIU(yOA)M9PT%B<6x zEHHja$5!ptDlOBJtz?#M)~0Q&LLHo5DbfClM-PY~k3htTit-w;NZ8omvJ}&3}ZRa-0E#ww1 zS4y8FfUD(7<>IpI+pg~BdT!*t?%95>!RiS%A)w1FY=DB{!(xGg0A*vDxbcnx}>bicE}Zg0_HMq z>z;4^DsTGsulhbPmHK8>h-lWaob>AI{VuBmH!%M4?*~UP1V3&-001HR1O*fT{{Soi z0000$0YCu&2>$>_c?v}km8nz+1;$z^i(x`l4kOZ<*l<=wiWoDp+IX=eM~@ameq2Rz zq^pxCQ-UlhlBGn5FjpR&`A}ocQw9~@bonx7&z(SV<`g=VXwafMX(~0kw4l?ZN0Bxi z__V6kt5aqEw5heF&#hf~npEjk?AWhp(?V6tHfme2Ox>={idAmhx_9x?rK*>2-@I?b zk{xWeaM`nm3Bz3+*zR7(jUPjvESa)Yz?lDP-pp7q;?IcU8DT zbN#l4%{lgJuDDB!(mlF2@7tnPmjdqEcJbrJlOwOKNj7b{xubg)uGsf)>ez`d*S`I^ z^6bpPPyd%bKKOO(<n_@IRnhDczA9hSIZh8kYzA&4KY$fAfOQutzu zEz+oBjWgnyBaA%u=%b4q-iV@*JDOPJk4GjMq>V&2siculA{n2IwE;P#lUM4fC6rr6 zDW#WFf{EprWLnv!m|uoT<(f;LS!R}SwrM7pbh0_3ozA6M=bL=)=_j7E1*&I^YPOOm zn!CB#=c01{Iq0K>9xAD!e>G~UqfE}JsHTWQN+@x+oOo%bjCN|Or=JQ+X_TVw=jyAa z#{bFbthAmAXsV;O3hS<$%9?AhwFZ0Vt;7l&E3l+us;sf7MvCjN&?4(=w9DG6sQJ zzVi-T@4w-$+T6mECj3;t`ua=n!RsQ-@WlYLsEffIQyj6w<7V8j$P*VV@W&EcOtQL_ zLVPmHDXTnk$RI0>@yag4%&X2G%iJ!@CBJMk!9>U0Gtd?Le00t{Hy!lSNI&iL)H_36 zbJUPBJv7x^SA8|s?%gc4*IgTJwbBTWP4?Dix9v9Aa3`&G(R81^cHMa6{5IM=3jf`4 z-hkg7_$Pu7PI%#nC(gIt+`a4gQGS=L_~bNGzBuD@_Z9ivmK$z&=a*yN_~vYTF8Sf8 zrw)3FqG#Uve59Xl`s}LH{`u>x$IZFyw)b9p?!fErI?%C~{yXn3%^W=Ll?(6P}na?6)tz`_983zuN29|Gxb9NWa}R5Px%spav7{eOc(1ACU;R$odLlgRNhc5h~4*!8TMAX@k z3}!&09@Zd;B6`k=AiSWejz~o|)UXRN#G(?Xz{M^;!HYxqq8Nif#xa)hj50vu64dBL zEh5p4a6CgCyGR8%CZUaY45J?Rh(|v9agBRqqaX*V#xxp|i-jzLAs2Z_6)CNPEBOJEY=n8-|~GXKcSTsrfaxV&XFrzy>9(z2G<%;pA^fXxfU za+TbKr8g(=O>uTpoCb*G0@S(Abh?wB?~Eq}UKxUVPV%1kv}80NiT}oZqTmWP~ zy3BKqvz+KG07A8?gobiq24aBdFuAY=ii)A4zr3hLH7ZPwK2(>>45>()Nzjs-)SA>p z={3WtQf<2Qr7vBl3mC9aa@zE!HO*;4<;l~Y`jn?BJ?TtuS%H}DG@-MEfKr!ARGdEa zrqdj$F+n=js#^7`QWdIJgPKaN!t|I%ed$nfDp7~h6sc!TYde3+*0rkjtvH3NT-!=l z6gV`ZL)~g#nHpAE@-?o1CF@?RnN_SB_OOL@<`(qI*siwJrBCgvWbevLz}mI0bH(gY zGs{`c%JY~S)u>lpKv2m7Hn5u&tV&T?f>I)uq_2%_VowT5#s3Zzms$PlU@fcK-tLpP zopq~lJDbwr8ker`yel1+O9#?A_qouGZc|N*+SDFYx2<)kY^l24*}}H8C#bCn++fy} zK6JSrB`;oA`&-~r7q~?5>~Y;n*>KKRq4x#qMVZT7>53GZ?@elT2TV(rt~9a4ENpkZ z3t;iOmIRTtrFawk(T`%+y}o^{U(qSy;d(f~t*kGI<;&C1^0&GEP4RB0Th!AMc)$i; z=|(F&(T#FSQQ;HpTC?^LjJTuWo*F0+u>x7;|;Z%A_!vact6G-nOXD<#CHwyk_4;bBfaH9b2-S^W$>c!h-fo6meQ)Ow2(JFS56Ds#iU-Vl64*I&Yt?j zbl~x-r3-5Tw^*spcJ-@end#`xn$d|)@U2Iy>(){?z5#A?tMyFox7IhbEG{>Q#~=n| z`+3{E-te>KJ_N+n8Od^CCnTW2nzC)eNaK}5)zgD+>Evm~oL*TN-HZ~XB zjp9ZVyw2WEH@&Bw%?J}V-yje9Yx_-d9m6~0m;W}cxb5BKhzobDUQM{CKWkBBqg=}( zm~_Tj&T~oMJO)3{GIuem=%R<*1CjRo4KYGan`SGBa-~(ZYdezn4Q_$Mn+7z#Z z>ixdtn1UmSfgoT{FVKQ8*a0q>1KZSY5~p4MrGEjq zgKo!u?dO0J7=$fAe?nM<`Db~y2Y^b*gSW?o=@)!X7=^$`d%{)fh71UVMo5G=aE2f-1f0MH`IUn@ScQ@|eJogq9JqoXV24Avhex=0Quv1g zcz|0th+Y79Vfce(2!!vah!fa|K>zoMe5i(!IEfMHfQd+khX_Y7Km~qwUvSuXxW{_A z7ln35imB&!uaJtWxQeXUilX?6uo!r$xP-I_h&xz{$Crz`Xp6ikfPsjGgjj%4Ac1Gl z0-We|bv01L=Zbr0Wy08ei|B}q2z_mrd#K2av1pCEr;XgWd%gILz!;91h=}d?g<42} z`=^B6$a-u5eHt)^oj6~g7f9{X^`sZ zjo|o;!6=A_n0=F&fe(3;IRBZG73q%^*p3wlkH|<|9SMr{sCTI5cI2o?4k?Y(h=eQo zccF-Pi1(B!iHk1TiwYT&TI070OltO7+pg0Ic$$M=_hf7(L zHZYfG_<$xE2UXdGqgaS}$&$7BlC`ImTgjF8H}6dIuxN}&_Fpc=ZN^r@g3 z+MymAqPifW30k5idZHtGq6oU8CCZ}z`JylyqXU`_GfJa2Y7N+sqdK~yHOiwt`V2T4 zq(M3d_;jAymznGNS?%eEhsT!hX=T&EpbC1RJzAyfV5L7wpe(wf7iys$+7Dd{reeyW zWLl;nst+VOrE0pRYwDsZ>ZWiSr&=ncbb6!bV5fB&40kFGd)lYn;HQB4r-3S{ggU5K zdZ=sgf{&PZ^Z%Eg>)nq);lQ^+}~znyGjyqih}W&YN)b0tF&6HvYM!5S($Z&nZp)b1m&Ky7?75FshYZ}#+s=mDym_s zp!-0oql&6u3a!x^t*%#HukiY<279Q*imT#E1rX?{ns%<} zI;oTzrR?gi?|QK{daur!uNyP3`MR$fdZw(pqW>DOCOfbNo3h(_uq=zPE~~IZID5Pb zscIFm=>O%UdAF|Zst@vDu^6ke1Uju8>#;+-vG{tl{5rA(d$KKxvP+w%K)bRnJGJXT zq>(tTSunE@tCs1Svwc9Z?dr2Xi?JGOv|dWI`f9dnTdyF?uW$;rLdvvq8?{thx7|tx z;Tp4yO0MS0kv7|QlzMv%S`T46wuT$DN4u=IP_}EEwvCIlNvpJQ8@F@Iv~+8?g_^mV z>$031s4!c7S<3@_>t$QZwQm==uwbcTd${q+xb%v)MftFCw%pKIE)tQ)oY3A@h=y^brr(@VYdYrWX}wA-7%01CVe3xC5mzT}I% z%DcSXJGQR-zVI8r(wd;PtGy14zYrY3^{c#rf4r5WqKCCs)aEWHIv zzbpL0F1*Ar9K#j-vWl9)Ko`C@%)tR{zFTM_ka?e9-co(D1C#N<7cK%gy<`&(5`cs5X`3 zJkZgQ(HdRO9Np0#jnE7o(t66L3q8`qVA3cp(z^W7D$UDPn}+us%ryJWD*qd|2xxf)_J7N18L9+JkWtd2nPt- z(>}e?Nd48hJh?>;)=C}HM_mkM-Ogm))%L8n3TVn{Nm0<$f$m7vR&9c238P%y)n2{U zY8}>poz_O(*C&nEhV9oNjo6C4*KIAju@}*M_HVaTf(-kPZ;97naI7x9*M!~Kp1s(D zozkH_*o9r%qYc`1+t|UY!Dz`@9))sr-2x5J0#z;B9+=qz&DW%T+PqEFyFJ#X9nXY) z*1}!fzTMlLz1c7Qz1!E?oM}-^7uy{;yjOkOnyuW}t=pfC+}v&4-v1rk-woX1J>K2j z)2dyL&dr(G5N+W!6DV(rl4P2L3l+kg$= z2!7sur~{s8V%0?1?>z|dZG!W?-}!Cf{GH(luHgl~;pN@oAb#K;ey|FDmJIIAh~{lz z=icot;qu+z7_QwM9^wuR-Ucq($Nk|sZsRmQ;)Pt|(+78-=gmsj-Vr|GKZ)Zpe&I4c z<36tAHy-6q-s4Z6-0C|8c^iFGEWGJ0SHTC{W_jdcmjPD*0x@&f`$d(>)6Y zOnsRwVB&8KWn-WN7zO4m&Z}eo1ZuwIOs?N+KHz6Q=xP4vi2p9-g?`vo4#Sm1!!+y! zhS=q56?u82;_qnNl8)qLe&~k2=%CK#i9YJ0uIQzH>W!Z2$~}xw7rKtU>9y2uy;^!n zM}m8PjD1e%fZpVc{^`2@>!EJyq%P>FKJ3MA>>{4(YXs?R4C`_&%&u)?JD2H{?cx*; z?17%`$4>0q?(5!;?7ZIX;@<13Zsjr@=aJryVK4(*Cuow5O)IYH)?R`~fbH6T@7zxA z#PIFq&hJW|@4`Or0^jfE{^sc3?025$8z)yqPVIbt?FGN@)gbWzukZdo@S$As6tD5% z-tid!@yWjH=N{8u2y5;IU=UvIoc;s3;O6-L@)N)DG5;^~ARp`=&+#>%^B2GK-w^Qt zisj7izu)z1(k@LY|L`Qp^5#zSGmrB;Z}R~!@=mYwR8R0f`{<48-r%e5j)qp}H}s`s z>+-(xEid)U0P|D-^lHEMH(&K^@AEDn4M0zf=#A%a9b%MqOPm+>Mvn9nPy=O;_PrqZ z7Vq|kpZ15}_E2y2JsG4dt=R<^-AcR7{ty z{FrUhu<@h+Gd4W0Y{H5P^b;7#fPOVYsHD7&>CM4AfDg zqJ{=Mcr;KLCyN7+5>n)nmkpfBlPFcLtk!aw%a<`>5~EqOShSltaSnsl)8I6wPF)I>>Q$^swPK^jwX4^!@xZS8Mz*Y3v}wJSWSchA6d)R7 zILX4q2wk`W$5^BY;UJ3#PuPIzGUuTZffW_&z^Kte$B!XFkW49+uPHE&fKw(4il zmN{=0U7ED%tfxa~PThL!>$9=d%BH=xt^e5DcID#LO@%i^6b1c~7!lYZnKe@|by4g_ z%nXDVGj1HgV^Cy{BWJVbE>oxK)uUa92R|P5dGqAeuP^Tzw)@)gx3_&OV|U%VzNsWW zVe!In;xc;ZxFoocXff#=gG@5*x^wWs_99GA!U-WnPdo}Ud~ZJaIK0iQC5pH&zbK|C z@I<=)1JDA&j(aE~1EGtqG3u=Ifl;xc zyb_C1gcSv3qlOmAaA8Xs7o%~y>o^LDvdVZgv&SFPG;+-&)x40+HkFhUwUPS!5Tfnk;yX83=+;ui^O!uO*_pr$T{g0 zwZl>GT+2y5{p?Lpz4}5lONKbn(oqBnElxoj#S|&WN-g#7S2R5ZR#;+vjWbweL##oDW^J}oBE!1cd3u<+?cQk$X-c;a&{;ll4k~heF^cQa)_Az_c zetYh1e_#IjjK{P(uaRKLR~(TKwY=V%N#ANnSszQ!p8Ka%+Zov3HO`$e#R^qXJ> zJ9iEJagKlB3*DdaGygua5zl}HOrP4;*MclOFLn>q#{M8^JqcQHZZeFahVqxe@A>b4 zhC)CO2S`E!CU1Fc>sNK&7ATB_q=77?VdZMr#LT_$ayO)66*pKC9SW~iBqJgay@)^~ zDo}-S8x<3!7)2+#5Q;N=VjIv^CfPC2Q*>9koYf_NzaVOIHMaa zm&P?x(2(DYqXv6+5=ZC>2OdmSt4QY`gDBxTg_4mF`-s9Lj`1-|9Apagn&!id5+6o-tZG-WXhxyVzpQkltgBpjO=OIX@L zlC%UNCl7^%T>lP2o14_562?ZQB07OaqO<@hiD`^uB6FF{T<0Uxxyn~El7n-hrd`m0 zg;}a7liZ|3CARsTft3!Nzx?Ac&*=+wX0M$KWoSYR8P5wo^BvHX<|OMGrNbqSY;;Hh zI5pV`ZE}lw-eOS-g*nP}92B9(L?;Yg`cj8BRHo3JDLh$vQwYjar);Tc;Izn`z3_0K zCEE*?W&oUkc9NvPEFwsxkW!W6w59BfDI0An)tagkqFa?HPpA36pI$_%BI9Th{#keP2db*eB$BUQ6{RlHVps$A{rL}^N&uX(3A**h<#1iv&d6KeyRSv@X@801(qtCHq>--c`1G z#o%WBdRyFHv8VL<8ezR@*b9_am;Eg3V%gf*$GR4_v9)Smom<(=K6j^`B>x9ta zbF>B-Ls^OI0434wrP{W=H*F zT!kRlyb5^+dMOLt_g0L$36Ac3>8ncXTJ*kJG^$2La5#>Z07kqVDM8EI+Q=GMy^}?- zd$HDB2AkNyj8w-n@busai%vfoHC={9)?FLlv6Bf2FnKouFe#9t93mcZi5slo1*=%e z@&7&WitWS=TyO&z&alOUuMuP3&RDcZGmv*rOOW4+^iXXz*pDBBgaQ*;z9c?!irxIz zx-!|x619bt?F?mmR5za=)G|^1TR`WSHpgLJ+i`t7U^J_F&1`NnlHa^!+S)cAccwHq z;Bjd?ePPeFBwCnB*aV1xG$LoaCE9pwmqPEc z&U0@4s%d&om_I)xVRu2Q))5-I%!tlJTVmbnXa9oLvZkx8F$?KhC)snno-!|{Oph1) z8q2~iECmwaMNgJ`k5uaMvPH71Xpbx2)224I?R{?)yA$7Y)}TEuvFj;YI^4Mhw*QRh z#TW3RJBSNk_o;300C%5x7qDd5yy;zUYw!Ek8|S#3A#LSm)I5Q+nv!@CUekJ<*j1FRa?NFw+|j^$*lM3I|x>)pwrt zZ2R1A6yJK!zrJ^{?@S*;H~ZOdk#^xJ9p*82y3A>A^LHoO?vuxR-Yb9kzvmj{U7d!V zc`=Q`-$@EcPyE^i>h{J*AmMPAIv@jyb=YIR>wWk8>;Zp!+h<<$nBM${>i>a{(DN?` zia}xN>9_@sogVcIaC`>v>pa)fKwPn>JoTG#ed{k;_m;2yqjCRz+HZd*yC*-X%HR95 zPgEC(&u$9U&3yRBf8DA#EQ{R6zSn2J`uayk_x-Q+e9OJ?vpw|VJ$V|wU`x8=GZE5h z0>(p|)T=*{xIdSpI|<0Y{j)mR6F?69zX2q`0<H-!L33-gR_-EA+~P9BYs(%f$$5Os|y(Ps~M!h4a7n1 z^S&OO!W;ZRE9AE-Our$!1|ZC`xyTnTDu{1N8g7Zeb7MCcSc0dag8!(IK{$*x^Rq)c^g%B4wZrodFhrRX)F^vF5fn)_6;#3mIz9}jyC#sG&(^vz6C5FrD+UOj5`4`fD~Lr0%$?)N3(&@Xc|k#t-}RAk3yY(#W?42YaZdaTEL%)D9LNB@89MvTnG4m7}j^vI9Q zErCqH(8?!s^P#9qM|EVzhFrr8D5*1mNO+q_nykot+(?bgNSx$Ip4`Ss)X9(xN}@?Nub=ye!NMn>`AcvO0679kR;37 z8p(@d2(y8}lhgo|Srlz)N~ffNcZ^4gv`W16O1MOS2qIE<{U5^cauQ zr-S$xbi9Id+yl9s%c%2!R(v-MFei$%$IKMWvE)o`q{OiNOib*>PMoMc7{RbYE5&R} zGFXmSS;@J4%BT#(4`86G%*(6{%+B0PzVu7o3{Bt+PXGBZ2jVPF<0Q<|giO*a$wD;8 zrb)=QOSWryNu~lMdE89R%ud|ANZ#B{-~3JC1kdn1&ay1e(mYSY6h^5dl!M!s5NMv` zTT4=t!0D_^s$`4p)Xv=8Px0){?)1<94AA}zO!F*I3 zp9u_@HB?6Hv;yqh(DC%n@BGjX1x#5y(DOu3)U+oCMLxz;!qs%pE}G0#n?U`{&jIC6 z5fxAn1<)D|QEMbmfK1K=?K6DxA%v?Hgus{jE5`S9D+}EZz<9*#yhje@(H+In4$;vn zy-_Ot#uCLXQ3z5L#jghC01QK%#JQyb0GP3nk^c&f(I}l#8r@PW^-wy^QaJ_BA2raz z{KA*3B_k|CM42?XSh*L(bQ!I7VJGE0EB~A1MQ@PuLq&yzC`z2F5 z)F`+T3%tzgkG)<|Vlz;sn*eN{lTRF7befwI-q$_@@=Qa6QyQH4`&70+KKR%89vyku5! z^-^c$7&lNpX^jpC^bc!|I1I=EGTByPwb5bqR#mmvdiBX=)zdEhL*)!YT1CNh%_Bn{ z#^>x+MFm!QrPuN7R)@t`h>cieomhVDSO1I6EocqG6UbDSM7_4T0T*OL%k0*LEm?*= z*_(XWdj;2H-PekJ*0>Vjkg8po3*LC-m8Q{n=C<+LkR^m_6F_OxmQIv883&*p$s8h}vkR+NwoawIy1t z%~~FH*{!|Uv-4V6g-xd8l7&=6Ybo2fOVsv3+q4Z_wzWu>720HlTf~i9E}RvOWyvl1 zEj{X3oTWg&ok_sG+f~FwGcUU9S;pQU8}7{&CSQ=l@Hq;R@}|q z>784dRoWlYu^SU8E*RUVeFDmjN!)-m0NPy-39Dj`8%6)voSIi1NuYPhJ?`yblv1F zUjp7o0UlrvE?@%=VFVV3_XVvmRmK78r27qC2-cTEQCPr_HhA z0tG9OTm^7P`=mR}jN;`@FaI6>U^WIzE571C%;FPnQBoToQ|FoBh1O7>$+eq~NxV*w6Y zVy5CPt>r@onjp@C$TUGyD?@12-(N1iBr;=H7G_Nj&1073SWaeTZr>~l(_JngKusPn zme3`xW>)?e<zT~c<& z4tM4XkN#+dzQhh*yAk)af;w>0fO& zmDOCRo~x&B>h%59pQ$aauB~Rfg{;1XX4`|T&IC>%Yq8FRJxFV{M(fjTYwI!txPHsV zMd=59I=pR07_eX`<>>8PR!N*{HHPX;7;M5W>`W+w!A9&dSZv1rg2sOA9MCk$9z9JP zKFhxB;p+g**6bXhfzB2J&em+v9&OO3OwT^;6(DWZPHog~?bTN8&W7#KR%A(1tFIc! z+s$5T8mrXYC})^E)ra2k&!50gOKn^j~5DLbuQt zD0DZ%l7T8BG`WUnlovhxS`9_f-D@WCve& zH*`TycU0GNQZ)8}!SDQbcYPO;9JlXdXZ7_?_8N%qw32uAjP$TUciwV#0iSd=hhb4K z1^-Ft4{Wdaq;b9{h4(|h0e0Vaei!uBZTF9-cS7%NkH>fR{`XcVRD6eYj_>&UW{`Nd z0h*7CJx^~Mf%JQy$_ckWN2ho927#|(bkjz8)AsK~H~KLTVp)ImMK^gfNB1Xxc<&{l zPmqL;3V>_Rc0=oToNx4`Z+Vxm`Hb)Pmmhnh7H_owd9#0dfY)=fkNaZ>d6kECx<~j~ zpCmuW`?`mDk?(tDKVhjqcV-`a7T3{q3UwZ_kAJ?OfBR?t`yYM#C-&+Gh$v2s;Al~B zgh7M{c`#&RaLK@k5+^blBc=z0j2bsC;Ao&D$OHuhj4Wx=p#uvVGN_c$(k0B7GGnHs zSyKT{n>SgeK=|Qj&!8ZHvVZ}k2-2iVml9k`R4CM_QeW6GYPH7I8(Oz=?ON6A*RWZ~ zk}WItEZVecj~ZDS)?t)~6dSTNk_94NiUO(J?VII{m%xJ4u!-ZQgvXN+7XMEO>DVOX z3Oaty)LHqm<;Cy5{e%FsJG(>!`$JNNM7zmqQy{(O0&KVq+E zUzaWH*H7oOZcjVD*xkDK^Y6drcXQ7v*9U7?VXuT@EVP)&T+4S*KV{ zJr%)HcSC76(-R;7&>4Cqn)m>TDXMs)c`LfuB8l|jXWDye$>`yYYw717fITWW;3ftB zIHZA`Fo@A~0^~3UCb~Gu$sQpLu)#+bZZH{&8sO&ALLQ99Q(2&m#sA`XFPeEKnlP5B z=7?;9iDQm4x@V(?JA%O@o@WH|pK^2X3FLBr`Y0%IK4L=Pkq=UE5-m_VdW(}+1far& z5K^ep4^tq;WqWVdsTHSiZn|cgWR~jYsivliDyw3;>LskO-gi`gciO7OtykoFD;av^ z*{g4d`f2O0zu{S!k%@9dA(ML;DeR$q!6f*~)iyy|N2ouBYoYq5k5*KC0&D7q*Spg{X9!kjD_<)xKkM*+H& zeHb2SS&~{V#u=ZhF~{Kwq=psowmUMsBAZ+S{iE=y@g)bA{ItkaM&*yADewu7g5E!&T}q zghgTKzWd|7`@VSMdhBe#oXLvA%;VmHj&WO)|W;bSB(>e+l^Su>ZgQaP=Q}{{BZ7-Sy8uR@egq zO*4>~#h`%#qf6fa=s?01uST;0Tm&=dw+r^I0T$DeeV~GY6^xL3;iCZwQJBINs<4GF zJYnWySiY&vYb&^8UlXvPgc(TbeXWZhEapeQYE?>g9z4$xlW4@$EwKR=$ek06_=Rg+ z!wzM@M;WdtMAdyDfKF_p2$}*$CMxlWQehg0&{)PbatBUh8~_~SSR)pe@OyL|As+Ln z#~1QZd?V}Q`EXPr)Xl6yKKx<)BsIiETF5#kpkGc%K*%vZ@{MDo0~EO^p-JtmlaRch zlqML)0Je{T?Mq!8QJKm#zUhN*loA`|D3|?#5dSWpNn+7lxk&-KO_fd*;T~ZqOhB&C zd?pO$3+vd&?Dg_G6&T|h&W6ZDGP0UHyJm%mPy#OC5Mp1nq%$$uAjJ5@nv9g>5{DoH z9jfzmWt^lhAsJ6IuCkW-qrec>_%k^2FL@zIo;nGTPgHuVGCup~4BXZP{aL4;dMu%R z)}^68PE?{kxabiwiqSI)<)I!$CJ7^y&>K<-n+SM75u^!3*uidR<|LvE>gNI!jI@vl zh$%L?Nyr8@@uij2WdAfm#(5G|o<#j$J%{Qb$!Jq%_`9hrUHQR*q0^@GjL~TJGOap> z3<{wV9afgtMK?+{Vk=~&tQuCknc)q571TTpX!8**99lO7@eJ>?aop z*3{P?l%IdC>ugm!*uGM?xcda7XOW=UfBy3dG`QCrOUlI@3O1h6y;2UF>C7Zusta)S z6H77iTG-OJIvl94U8&kvE{IdNP>e2N7dnOCu1}|<1Tc38THL;VHVAUe?K7W>T0%BK zvW_(=aqn7P^ICOE_%s6)ILBSxfXudWn&!U*I_i>VRCDFXFS_>Iy3z&9WO=Ql}cl+^~z52{MP)4lF?PX^sx3!g=+#trVS1>gfeiNO=1@LQ`o9w?`Hsi!RI zjz>D<7k~K4=K=Bjy1cAGZh8O7Z~ooiB{AeHp0&<%zU!txJ?h6^dDSPv5Uv+{>b>6j z*^^umi>N)?C6V^sv%T$kzdP`Qe|LMZ;ZtYWR91qx23#<|`GSA`Bce}u!&ANu*1taX zMIZU>mp<{{|32wgAAZ<_zx=Vk`uNjdee|Ed{p1fj{Nqpi`O6;n^uIsvd$0ff%l-HL z7d`-TgI3YXSxCSXU_!5a4je!q-btSWJ|F~gp9D@I1+Jg_nP2x^AO>n62WH>~z8?sF zUJ|P z^x0qp9%1$=U;1qVC6Utu|ULgr?Ar-D57JgywwIB<=;24r& z491-`)Lk0Zpzz_~5s*Pzgvba*flLU&5HcVV=3yQ(p#?Uf6#iir0%9O)p%vO5A%bBS zCgSatAtRoh7@A=t!k`QW9}TkM+v6S|adeqSHLocdURGSOO7(VknYgDVm}y8e%f8Vk;uT zGB)EYM&k)OqB7E=H9}%7UL!XCpZ{^=4PH(V_9D=9;xHB?^_}A=nxpzLqcg(dGrprV z#-lqzqc+x~J#PQwE!v_r=At)RA~-V5dH6s%LZINOqcN@{JGNsrDkMV=B0Mf6L_TCh z-XlfgqeWh%HgaPn>f$391jl&dK!)P<8DuI-f=0CBukzoMrNZ-+G8bd zWIqDm8+fF~1fwvHq#pX@F_xtGnIudWrBTY_G^V6WQsYv_+2l<+Un}I~ zIIfC7_9RdiWLKgiSPCTEemQKF?{66Q;G z=4LJ?Xg2?*V``*b_Mat0=44u?YWihgVy0Oh=4TdWXvXGj)~0BVW=)c&ZVDblq~=#r z=4!fTW~L=<(q>}Hrg7TlZ7Qc!nkHA$rE}_}i69N8JfK%{CR$!*YYt~|5~p{1W_N;T zaxN!xN}_W}XK>D^f|4b2>ZgPDCx7}Uc}}QuK3{<1A>aW6>g*(fb|`$VrxreGgzhMlaw(YNCX`;Nj1K6KW{iOrsgZK0 zl74BEda09kX`HI)TS6ygQYm#Fjg_kDYqDvWy6Kz-s-V&-l;UZg=2DvSDVF-_n*yqw z!s(z!>X_Ood>ZPZlH-*ws-`k(n?5R}>gbYAeBV2Y@xZtAF# zYN*aCSE447vZkXR>8j@Ht9~l4_A0Q_DutfvrIOHUX6mmZsj_yeuQsc*GAFDys<6sx zsd@q-5bL4t>5N9=t{!5nN^7!y>$C!BwPGu(tN^lxYqz#4s4}a%f~&Yv>$sXLb!z|X zwg#)Wva7p3E57n;zs4(}f~l>N3%aJOadK+ACak~i>$}41{yFTR(rdlqs=?}K6S5x0 zDy+u-E5vqe!v-vLR&1r7DSH;|vNr6x0_?(iEW={s$7Za&O01sxzyjWDt)?u_s_eMx ztjlifsLCv&rhwsz?8_!;QnswV9xcnREYJ3=tI{gaB5KWYEc+R4(;{usE-ltx?b!V& z(W+h478DCiE!9?S&hBj1rfu2!Y|%b#{CO?Nu0hy(%h;|R)0*uCa_!dYE!#%x+OFu_ zX2?kXt<@?m%=Ycxx^3bjuGZddqy}zE2(8@`Zs8uT+AeP88m{IlF5jN*v_iVBy;82{ zcJAh4uIY+y=3*|~MJ4E(Eb5Lf>7K6Ba_;M*ZBMrD*Pg8I;%(}d?&bP!@6s;t{%+&K zZm&g8T5IhFuk2dx@H%howyon@?dq~F4q!%_fC2MXFYik4^FnX*f-m_Jukkjo z@Zuln>dWpuUul-W5_tNk5=^x~_Z|?f9uHLTz4=@3Xul~+20;lhZ z9$!}8M7_q_|E8{%A}j?PZ~{-S0$*c5001HR1O*fT{{Soi0000$0YCu&2>$>*2@Hj5 zl&Mq&55`)^P?f_~4P`}~MXMr3i54@uy10>*M~)vch7<{Mq$raeQ6e>)0_9Pp*7<^zWjpKmV6LoqGA~$J2Ay zzP&qptLx9xB|rXlefr|jo7b=;phAC#2QFh6tnOdef zrj=`|>86)x78&Q83bx7Smw3{7rk--n=_j9c-YMvyWZGHgp?)G4;i82inJ1x*K58hO zls*`#qmWLjDWH{F+G%lmVk+sTqh87>qMsHiYN>(tX{wT}zW;h^s+6u8Yo@r)N^7Dj zqN;1I!2T-huDaD^et1PjeHoIqgw#KAOw84_fY_i1~d+4&(#^^1q)na?Cw$F0g zW4P#!D=wqt{z+}R!>$`|yJohcD7)FZN*^q@ybJHS-9}n&zU$pf@3H=V8}PsC9!#*i z{Vr^-!V;V6u(J=_i!r_i>pL;H04Ln)$Q8>waK$Z|pSDOy8_DC`+IGGSpFfEON;At#(PedcK_R zEqd&)@B8)EZ?1au)B}tB z_tl4wefG0M-u?OLi?9CrNCVHl`{aX4EA+&t|Ni~>FCYK-=J(IN{rLl*0QpD20{Rbt z2n?VC2e?26Hqd~?+1>*uNI?f$u!0aw6ThIhhyQu7gCP812-y(55t@*Mm^h&dL9vE8 zxbTG_grN*)xWX9H@P>*rVGgaL!^HLQhc7e(8UKbzL>OW)f$O7D3zx{mCOR>QT_EBV zo-oBBP|=D@xMC2t$i*&tQ3hWOV;8X)#WI@ljA*Q48r7HtHj?p;aLl3{<0!^D+VPHH z#A6=!$j1JuOoPJCv zI@j4pQqF*o?=)o)%CJQtF4C9y?ByrHS^rLQ`g5B96y*etDTZ1Sft3YCs6rDO%Y`!Z zp}90@L?=qd6XesK7!9UIhbhpGa&(y>4QWUj5KM6n^rR+5sY+MMPnNp$rQM9FOjAlz znr`%>`rIc#tGUyf_Ee=P-~v#8NlS`K^r%HOs#0;v)TVwEr1Bi8GO-ENS6UUOGxe!f z`?=MudKIf*4Xa6CDTab(^sH$0s8lWa(_*$&nj$?bQs-(=R?>B;PQ9sKpQ_en3U#f3 ztpG9=>Qbt56|9F%tXL7-)y6tBtxOFpW8VtbzaCSrcU7t^@yc18M$@i)z3Nfpx>3NA z60RSWDGC;=*w*$ls;gzKYh_E*g#Xgvwse4OWU1L#o>JD6za?!vGn>@n61TGw&8Y~I zsRM@URj9Xps2fDejQo?I?EF8{7o!Q@d)_ zY(tHET;xWyv={Z{a2L8+>RvatsvYQQ_j+CMhS!qbJ?&%*uwAVpw7i4Jtqww)Pt>wC zyY6i-doMdxR6=x?{H1Sw?Tba_4wt#Top1?Myy6sd*t*U1FhnD8)z>!oz+R0lfH92Y z8+$jxK$h@%AzNS#hcpS*m9cY`3|bM7n8YUz6qwi+TI!@H%*~ z+C{XYUpeL*n}EC!KJ$=?yxt4{*2osV@`U9p=ZR9c#8xbBn$g_iQump_U@bD6d#u<( z54zFYg>!c}#lS#4thLsZMLUACha zTV@E8y4I@3bf$a#>u!5H!8ir2xQjaOaswN>rW8Yf*PZR`D%iKo=B8z>N^fX8^WE{5 zt&C^wRM^H>&AHb0i=XT3ZyVgn!ya`!KN{v!6BFONb~miOyklFxTiO#JYqiabZC)<- z<1F5A2?7doW1IZsoBt;Fe6v7jDjeJiqE0y-SxoaC)coc#u&B;=UUG~2ljlI!sn9(-0{j%?3uf)cC9TmPN7~F-k3$+Dy!ESl{p(<_gxEVl_E(s_>}XHB z+Q+{3th@c~TJL(?->etz&iB6iJ@0`3yWm&ua+VwZj0vAPs!jcY2RMG{ ztDd;ksZLZbc%AK-AA5P}j`zXu{qUgweCQ9)`95GB?xs(D*ttG;&Ii8po=3yhMel~z z^SuuwWJBynFZwkW9_GIXz8je!eBu}1_{cxL8-34w5IdiuIPW#J?apzGz8?12hrRNX zk9-~g;rrk>g8%o$KYsF?-~5Fyz3SJ`{`TAc{kxZa{Cgk#^vgdA+dn_|^8t{M+7=cXZfD~AP7I=XeD1i-_fa>%D2AEDAkOLt& zf?Z&FtmOjWhFPE2dMs#rhR1&}SbzgKga229_Sb^$7k4?xda0Lv>IZ*57=+h%fAdF# zMR*4EmxR1me@xhfPKbZ`w|_+tgEl~eRcM8p1OhTp3F<~>Dj0i#_kuFWfn>OW8pwcS zn1%%?e1NBeI|zhAsDyIpcTSiFpcjQwn1_03gH%|9Sontl2#A6hgL(*shWLa__sEU{P zgF*<0afpOQIES=Yi};6tXW)HjW?*0Fcbd3~Vi#Rdl8jHq{d z&$x=L2#c|Jgot>J_E(G7=Z2REjijh{y7zyJ$cw$GgTR<|dq;j{XohEqhH99GET?tK zxQz4IjFRY$(U^+WXpM=8hlY55?>L6-IFJNckY*T=fvA6nSa$)4206Ej4OWikcy?}Q zhr!o}#mI*W8IR8RjUH)_!I+OCNsarcjl+nIbCi(?xsEK^k}mm@FiD2#_yIiNkVb%e z#Q(Hi5?OblD2y|Sk;Vvv+$VP**^$Utl=nE2(^!%wX^SX{hbkG9QaP0fxRNrNkbxKm zRM3zB2$9^ilUv6N6p4;3hjW7Xfmi5%8cCEMDSMLWmiS1D(kP8g$&dZ$kNJ0&RH=pR zm;!v+mw&mJ0a=y@Xp>$^TVUCfbLVnkfPanon2;HnlIci#P(+n^nQn;*V>b<)S$3UC zcATJ@pt%W}2@7fWnWSl&s+pQ0$(pXojry2e-&<>7L^$p8hbO^jV+wc@Ol-nfSS%_t~HF`JVt9p!$gq1R9^5 zX`tk(3kiy#3#y^y84o@hq(C~P>p-MNYN8)np7H6Q zOxmPQDxgprr3K2MJ!+v!YNb_Lp$&?qT&kg7nxse?rX)J1WGW41dZyiwrfQ0&Y}%&Z z;0`i6hJ|ONOmLWp*-L`gotW^Q`jDkUdZd6VreG?hOZub*%A@^YsEI12jQ={NR7#~? z>Zg(#sS6sZUwWy6nyGFIqiedUo%*Ro8mgiir(Ed-bZVzt#hqih3DYp2_0Xq(8mOKs zt6*BFih8TK+Nh4YtCLEpzS^sm+NGE}sG7>DvwEz^DypGMs%z*4OrQZbiJdrlr)QO? z-N~o0st@iEtF(Ho!y2TvdaL1@tB0zqj|!|V`m0*%tMK`)#hR?}8n4Q_rpy`xpQnq` z8gB zto3@YFxLW3ke!CMufFtp;1~z3+NS^;uman%CAy#qd$8oWunOz2y#Ly(#9FaBYo$5c zvlwfvK)bQC+Of_mez_R3TcEG1+L0=|vM!skUplT#I)_OQ;6xqz`JfHmkKi%AsWIvpegzV*9gw zTekCBxJ62|Lx}}S+qR|1qj5X8#R|7otElr3pm-~#U(2<9`?p}*x$P;qgbS*MJG#n> zxJJtYYfFw_IFV-dwod!FV=J*zd%2Tqxec4O!5XZZySae7wVoTepc}lQyR6h{uW9QA zs4KD&$+#%{ukcW%kQ==POQ5t{y|}Bp!rQyryS=+RyrN6G;QxELXDh8nTeQlXqt(ih zcQ*+Aimk6Jy^u?_)@!|xy0_iSyV)DLz`@P{yx~7YK=S!^_WwPz-xX%l}(p$Il zi?t36py>LdgNwiXtEv0jzux=5g-f(_ngs*gRm|(1&I`K=jHL40z_8iN z!7z-$GVH=-%fUIfl~f>MBf9`0?7DDE!XF#I+m7H*3EV?8G#D#!PI+Pwc;Jj1Go72gPfX*a@;9 zjKy|LvIXpm>}!f{yTx1_#1}fmV7$UOi^hh0$cQ|{DF3>~U0k~3d!5Z{yiKsU=^Kwn z*{^;K$k?#Svnsiid%d8Xxks$Vq@2i%%*my^#&ArdrCP_0$h*f&T!K`LzLlJJdyI9NEVr{P%+k!s>sigUY|Yrry{T-< z+}zEm?9I~*&e8nFk8GV;K*y6Db-n0|X4iSJ@V>(w4dWcn^z5_Se9z*n3>v%7yTH%> z{LjDq&Gih>PrS-#+setT%mrM0VcC12Aj|R`&jTIN6D`pAe9`$#&>CIF8=cV=?a`xJ z&gTrW=iEw^ELU?($AfT;5IxTn{m~#D(-_^+`v087H7yMNoYOK5(>&eN^SlNgSgOZd zP?5)O!epZ=Et5X#(oFr*PVLh>9o051)l*H?GcD2bunq=&!zDe%N*i-A&;SXEvSb(t zElteTfYxda4Q&0?ZaoY*{nk(&*H&HEbPd;bJ=c2O$Xk7#j9JpIELK`(RxIX#rdpUQ z-E;@22eP`>j!g`Y-PCfO*LzLVI$hP6ebbhG*<_2?cRksa9omtt)_rZx=nQYu*Ixn! zt%qHcmCyo;y#kDl)ooqdX>Hq}o!gYX+nfE_ncdmG&D)|)+CIR_z&8SfNoMv|*vS2W zt_|A|INP*++mKD&xUJjR9o)nH+r2H^+W+m@-<{o8J>8{^!(NTruUvD^?c7^80FyHiD-_>p1*Dc=q9p3xh-Qext0Iu2n9pK&#zGP4XV~x=09ae*#&MhX^t=-=5 z9pCmX*#rLH7hd25&fNlz;T^u={Jq^Ge&7jid?6rvL$KgqwPeg4;fWpH7LMQfT?{ks z;WnP(Ar9gn&fz=G**WgxJ$~asuHmB#)Fpo23LRxlci71N;tyyB(@o6i}YjxOe7 z4u!f$OKv9E&b8W#-sEkL0buauk-qAzp6Ra6=av5IvHs(lUeJJks;typW~FbSK1w36 z&Q;)v%c)fuI#l=-nUNDNIPL&c7n#S|q!+r&)eC)7J>EPb& z%|7no9_B%f+{laTtMuzfx8j6F>TAC3#oi0X?(N@B?&WUjdam#I?(EMVzMO6ZEJx;a zhHL2UZ>0w8O(*O;000ok?cfUz_CE3bUh&M%?-+0K|BlsDbmUDaSqRW`4-Tyg=)tFc z1ob}e6tD3rfAKEA@=~7fj{ok+#_Z{;J#vw^P>KGm+TQRK2=OT&^e{j4GJo$ZZ}dn{ z^jPlaP)*^Y+VSPLm40o6QzmiN=W7X1@(zH`4)1^{@AN_+_RB!;V^8*Guk=Nq^l7j5 zXutNF4)t7(i&La`b&Oysh;xp|^QNu;?q2K#Q-}a^d=f_xwRP}rfwcHa1;qE>AOo#bkfBU;1{k$*z zzW@8cAN)-}uc)86c>m`5G^tLj4{9SH??#~5TTlJDkN(y_{p+v(8}ALzAOG85zHHd~ zyv5qK$>M7c-AD@%4g_L2GHhKoaOe;wWVp~_!-o-zO(eFg7sY56D?;PA(PKA*9Y2Z; zS<>W5lp|AuWJ$86OPCT@&dgYorb?VSV^TZV(R9o ze|HKVOxSPXrH5ZGX59GZW5XB`e=Azq@@2~2l>TfAHR@EVSCb4GBSy&uuwlodA=BFI zo~>BubT!eog#U#GPUMboLf39Vy?up8zF3_2ambUC2X?GHadYI$jYr2^ee?C;*{MB| z;W>0wD&OBiprHE4nzHEU5ZOZ8?N;1zpb9Ul3A54)wF_Zb?W`x%n}IzdmJD$R6Jvfg3W^&`DB5w69Md;>hB+Km{H2 z(L))9bVgWdwRP5Nj+2zkNF!zIsW^kgVuu-sEN{-&H0&ZzJx#R$DhK>rwaQk#e6?0w zZ?#t2Z5#ErMqYRAbdZNPv)F@m`3#Sl1-+2ZqDVl8uOF!7TxaAWnQ{m z?$DhI><8QX)xryyG`w)yJ5AhZ`Wn|Ra^890+H%l8Pq}lgiT6BsU9Tp6dD8{0+0uxQ ze%;s!$hMwmd^vtH?X`2S((!~O?>+Krf!93q&5t)eYV^-{KPcr(|6S0oqj#NX>*cI| zf3ULeF5eHVjd9-#4mZR%zR9f*c?(qF`x^Mb^yN){6P%ykphp$fNzZot_ zV4s12?}WWe$4^w~KpD31g;S)W3u#zGELKoE^|OlCjK~%Q{7ipi#25fUWrP7HttTc# z;1i=*ML5P0OcK0e^XM3}=iTgU;Q8WOisiF022qe8+#c@GV3!Xlk&V8K;Tzj$ML9MS ziZ86A9V_W79O_Y6fU8aaeCRQ zzVVTV_JZBT2H_s+g;JDYOCxT;cMfM5u#Ku*r7K}6NodZnmeZtT9y2AZ!2fx2aKC(4 z?6$WjLn1L+Z`hp)E62=cK9XdyjGz{u`A&AmlbZ9qA+a>s#ru(_o4#BN9R~5w*@%sk zoaDeT>(hcXi~%=lz-))fjV~ zPF5{?*SK!=qZ`%b^uiL>VF5G=L2XtcS&BrLvbC*OWo%Wg>e!k>_W!Z5!fR!5YD=B& zRb842gFVOEKcM>aq-X2cVWXAUxGHwBlMTmeBb!>*O7^jqy=-ewX9qo{t5UA>V=zfd z)K1XBs7ECtLJ!%}m#S8-vVARc-)dLrVz!=(;{m3;h^a63QVF32u36D$S__~Sw#t33 zbC+x0RbDi@?!+yys=GH~6%@3i5iMuZ!}QM8sFHhQ|_^k zt6X3!Us=oQ6>?5@R0e&aI0{+q_gUAO<~5%GOkm80TFek8!BzrU z)>Y?;(Gl*KjN^PCT5IRh)6TW8t(|91@4C~U4zhG_7;I6Gy3j^EK^U8?zYRvXdagFl zgP8nmP6;gXe(Z}9&euvx84L&=;)jolM^S4rN z#tOpk1N6AVJ?vmldE=LkD?_^LREw6Pk!SK=2 zeM7K+|Lvzf|J{$g_{opI%!8B7L$%q7u#QnF!TSN}n?D+GgrUPf2;4vJ^FHD8KXbT1 z47|IT%Yo%{FrgxwfZMp*>!9cxrO|7^-HX6xkU;%o!Qp#B{?kD5<3KTcGub#b@|Ycf zBf$db!B=~V1tcI996}eQz!*Hj3ba5aT*C2_E*c!Ria|Bvl8b$!J+XK{BEmiXLO~+z z!WR6(B%DAPWCm-?K-UvLT`0dI!zUaJ!T+Lxf!%7I_VYnHOn@FJLC#7z`t!mREJ8m- zLS!hz@RLEyd%^&WLPxucImi%9n8P~k!60}tASi-K%fp4@LOwLTK-@&_14A+N#JMBH z%DV+a1P@Z{r~7F#MNF1P6pKf!LpQ5LE!?n7TtQoWKwSJoBLqY;9K&7=MJ61?V1&6+ z+`BXAEn^EgMO2nn^t@NJLlD4199SKnW2#!rMQr56Y}7_jsb`eLCCGp*93dgRMorYkPy9u2Bu6u}ykIOwzB)fulmK^h$7Zxb z6_7`IoJM=R4>iEYTbxL4w7iP!ME_08$X(n=jRZzv{78SqJ5CVDQJWUzD;s9yR(W~`IHvOT9fgG)jX55*uJ{t8=WEY7Y{zI! zQWk*F;$TuI?awNuQvVsPQ4Y(}EZx%B43g&?K_-FEHY3xmTT(RLPBmpyKyA}N9n>4u zP&mC(uPn+gt<&mMMt9RwpF7h&O;Z?MQ%k*6OfA%T!%`jP)HqdCCU66`NJU0AQ=2omYCz*D2js zaIM!2?bmXpSpRc<))ezh*;&8Tc*b^pRCxWlVr5u}ZOnT;S%;M}i>=s|?Mi^POkAoi ztguZJC>(Wj0n_N%m;~8b#6*&%)sjuwh!t9@^jDS@&zF79j60U9Tej4|L3X7>Y3$jB z{n?TIR+N2MqUG0??OJm^*BYGJv~$`J?24Ea(;!sQs zzN974jLkXh5iMUzHqUf4o|V7(TU)km+memjxZPTyE!4Vw+^;Q%yw$Igq&h}Rwt!Nx zs72d)+`1Jo+`~m&#>LmUrCX!*S2nrKy#gf;;1n23va@`}N23ZAML5t6UD35y8eQDd z9bK-yTmQ%{M-_lgI%VCV%3NQQXUjWtK;%(aSJu?>@-<^fOsW@NoQQ!BC z)#;_)poL%T#Z~&P-=}Te%w11Xd0FNK&F2N+hHc*fzTg5jVEF}J%1hv?aL6FFLn5$4 zAOakZmD+XT6KXU()S_VbwO|5?~;h=M249?U6 zmf;LG-3_i`8!iHvRbam583J@#@-56DMz|Ix;tDp_BktlDe&OF`V!M4EaciA3$l)kP zQ2$1&%paZt6|PCP%nmJ1V!HI=FQ(%#Ug8=iA1S{w~K$cxNeB*_Z zmn@#+BG$?y2IEJTWPTK5CWbmF_PE3O5LO%B0>D`mctizApjG{4O0Hg5zUCQT*=y)#Z~kU*4(D(tidz7ROt^(}PUk&PXN)bhKW1HcK4edk zU=?j-=*321ELvNATYi2)p!;Wl&IExTXo9wbfi8ngK zXeqGhi_U0`-e`{QXpjDAjNa%cc)Bv^f|4$2lTPWAP7-uv>C}1YLA#)so@w{OCC&0< zj>~C8TMzDt05;B^oRelZE@e1|0){?nq)uw2u4sjZ=!K?es1E6n&H*W)>Ky2RtIley z-fFJ)fCa_suMTVen!m9wYqQqF^G$2DUTd}{YqxIew??G1o@=`H>NVt|4$SMArRlxy z>ypGEolZM_xdk&oj}Zn1Ghn|_epfh#>$;9>$QJ9!jx)-hY|E}}%+74hzHH963&;L! z(C%!s9&OTY$h-Dyy+&=-UTqu>?50)9i>}O({GZB=7=1 za7nC}e>=a4Y4E9V@MC;%BZ_bdr*JRe5Dd@oMRjjSWZIk-03&5=F6Ar0+$bA3aTG6c z6<=`{SMVvU7vz3%7oTw&C#Dp?@ku1{9A9Rb?wUC4@$GHtAcwCZUlt?xaU?JDAopt_ zZ}KJoaVID8S++R~k8)EqM&-`(Ju32d)>s;hU?g3a4A<~vA#-IZ^Z!k$ax_nKHD_=u zSMnf%aw+F=AWw3LVevXI-!U!lJEwD}F!1B{a})pb0UxCs7<3gcbmZP~j6?K+gmdZw z5(nen5oiG?8*&eKZ=6Hy*adNUhP4%!^ZJ2tdKptuhp$qPaRrBTK<9HiU*@{bb678J zLErH`A8kB`5CmsHQtzl7U(56D^-%|QURUv#-t}h_c1rgSM`!kCS8vr8a{7>GO-~KP zo^MaT?niU%(5rD$2Xq#0aqULyK7VmyKY&B`_HQR`aX0bo^lTh&b{Hr3c29R{{*8Jk zWqQx|Tes_YcXU->^{{zz_I`6W*P*3#ZTHsS>QqT+fAv~_cK=3?_&$&LQJ46dmUWAF z;yH(SbkTT^5BY}|d6M7wmxgpWNBJJTa+d#Vh0k<_bj57{-UQ@#d!KlYC-{)hb(634 zlJ9w-$N6#}dZNepqQ7~hH+p&hccy20EgyMHkM@*DcsSWy4nK{V*LJz~Y_1n@bx-*;*$B-e{kSxgt)5(-7QKsy}a#Ng`GH0%&Y11W69T0XVC_usI&kjN6 z?9s((kC^~Ug8~)M)Tzz~QkQJJ;XndLi32rUgaJ{))em0BhP|o)EZVbb%dSo9_N~;m zau3k0JNGW$yn6Ry$RIXrSHOZ5Rvc?s>)*sxH~)%k?D(TeG(;oURC$K7GBAvhZcVy=PxMx=Y#0$aYq&B7gS{J34@#FI1E z3!*S|!bc7=HpB5c_Q%;h>bYEU$;T0Wf0mg_W zZg(O_=ABrbc9@|z253wH1xiu!$!Am!NZn_^Yx#jN)qe^SI3$F(O;{w7M=B}dl1VoC zB$QG1)faYBAR*$FSaP_fmL^t7BA6*ohW{dq<$34g7A44tfCp>X2-9hB!ct=wJN8Jy z5bkL}B%giyDJ7szGI=1Og;F@^a)}}u7oZ=h!DW|OLJDGtVOAGr8;+g$-I?KWc9~2u zta-(oo|#$+EOF8zN*Q1snYB!Q48rFvATy{ICw$N<1;NJ5XFP#2I6IF;$Fp zyz#~egEX?p37brC$ta(^vcN2p*Z=N^l0qSb%r%eOrH5A9yfe*NqRXkb1xG9by*1){ zbiQ%ciC+msIGqI45lbEQ${GVKw8B$oZLzgw0<3kz7*Ff$UtF6lHpkC?Jhnnq4MHQwAL9;ktePyFsU&ahM zd_jazU+}n;`7OjKb@ch`pZ~w}1Ni?x04>BD;xQ^nvD*&|3TQu3(M?_!BU%VlP(Z!3 zW_k|1;0dAGBCcm@e53JrmlnXC5rldpSs6J%0?sL*2&$6Y3oB~eRh)N)9Q|~4?#|{b*m-jKIkh7k? zC}*cZ&ajdbU=Qc^Si|ill3oED12(D2nk)7MdMunJI-BUp{)JJS>YTy6*2GLh#?y?P zRObyhnH&jz%sv;fP96Re0~&DW1sYL-zt-eD2-fYG_C%;ds%)&mpL_=!mpGlt!X7wx&d~+hKU)?=Svxd zQh8cuLr;iEQLjLT7vPhf18eF%G1r8ros*eBg~2oNUQ%jNSQKBAE9AdTpkHw@~Cep=I{eln_24P`)Qgw?LD6rX3)yjlB&!yTqIt}Vo! zMf3V+>S{EwgT1X_`=Qu*00goX&4*-Dy4lR0G$W!dZD?P*+LxXLwzIA6T5Ox!xOl|3 z!~dOaDi|8R5E;*|3E^vXvm0IR4wq8h1?!Kbu-;Ra8)D^MhIse-%82%Nzt??-UlZHd z7;s-M-)K};6Pn8U)&swnJ#dLroZu5bcEKwih>dGo55`W!$2D#Ukc&JLhj_LmQm*oq zQ`_2>c1A2lZKi*0b($v17dKVgI_<(+>8vkGav-~+Go!P8=?)4|9Y4xbeXOaT*ZPe!(n4*8^0zVc9SI_5KvDgVu1 z{_LJdJLp5NcF~i*^rjy@+fNVo)UW>Ju1ERYArbq$%YG5IZ-m}y&-dN$J<>9_hTwxg z_~E~y_?*HQqM@l2;@Z!kL2CvW-bGrjo5=REd1|9RANzx&=-J?rBhezT9i{I?%@ z>tU~c^y6Olyl=nzRgBow8h^*-}Jd10U{s^CgArm z;0r>a45r@%ir);@UYod?F;2M*uhiD2#Q6BM8z0jl65WdBMNK4A+Q zpvB!F6;`1Y(%=>1;Iy4z4|bsjdSM0v-ro(O&AovU9${Uapb|>n5;`FiMxhkKU>43H z9b%!~Y2g>*AqRrt9`>OR0wEyQ-xz|R85&EHx}pnCA|+m;CDx)XYT_p1 z;wN@uDE1;KYGNq{<0t}N8`w{j7|Ox1;?XVQD>fq}w%si9A}vlMHRj+g>Y^|1A~ybF zHvV9>ks>(epRA;!8Y&|*!Xo)SqBKV1I_BawzGF9XBRqPeJkn!0-v6V~)m$MSqg^1P zC79zmIwLw}qB~Y&?X}|;)}29OVmuaPLuw;L)}uX2&ZcL6rfk+`Lf)ogCT2`NW@NSiP2NV)wI*(6W?*inZ5AhT>LzoF zCQFW`T(Ty&;bmTeWm&8yak{2)E@xkICvARbayF-Pj%Q;!W^~%+9QiWNIo0b`Gd^8t8`7=YqayhH_|(ifDtj zWr=pBg({tj!svm9D38wQkAA3+)@VbHp-`$PfaXPt?*C|zw&;)wDUd!XjZUd)o+xrG zDTcnMhHj}fN~xDNDV2sP{f(%WT4|E%j*c?viaIHXLaCd+X`70vOCsrHswtRqsVCkk zoXP>{0T=%0p3148mS{!NscPaWp|WY8>gl2WDUmK}AC6<4a-5waYHWU~q*AJ)GAgEy zo0$eEGA0+KR%)Sksi@j#l$I)~CMv34Dwz`Krfwvbf@*w@s-?oJtkSBjrfQf9DvE~c zt=1}n@~MmBs<6hXsb(sH9xKHC=b6q0L49hk^6IQU>##;Eu=*;XVr8pxYJa3-v5I7@ zPAavA>$DQ${3;gJ%CLfL>^u_NcScYq|0(ypF58 z_Uo9w=O>)&vUcjL%4^1X>$+B}!2YYlLaemLE5ItIy=tqvTI{|uY`{{iwSKI`IvdD7 zY{Z7FhnB1?8f&C&#la$D!rmswHmtvTEXmev#m=l-UM#0(>_0l_Q_8H#-fYn3>BQpf z-(jn=4r=eMWz4o~$BwMgLao%Itk8<6&IYKbYU##qE!P6=)P60|g6-4Ntjz|i*ph2K zUafV$>|r|X*pjWt#%7FjyVr3MR eV9OE;8HmEQ`EBT$uHlZZ?WQi`?(U-n1OPj=DxMbr literal 0 HcmV?d00001 diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_arduino_mkrzero.gif b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_arduino_mkrzero.gif new file mode 100644 index 0000000000000000000000000000000000000000..d896534795aee089eb57ce714fbb4be0b123278e GIT binary patch literal 541423 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­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 z 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

xU3NoDnRY4{+!D(e^+3s%HHmt^x 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𝔄obuXV_4UIukRJo{-6gWAL1@QAmI5webhB}|?7 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 z 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

@qgav%N?9B6Cmu(oSDQ3cMa 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 NvmW6$PSXJa06T^ThVlRa literal 0 HcmV?d00001 diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_sparkfun_edge.gif b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/animation_on_sparkfun_edge.gif new file mode 100644 index 0000000000000000000000000000000000000000..057a52d4d18dd56dd7024f6b1fdac2597b6fa349 GIT binary patch literal 639801 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%0DuG)eA=*M%iK<_TX!-8 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⩰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

AcR z^RZZgLaWm{r?WyWG&!TdGoR0<>|@x@(jFCKhzjg{k~6+E5D5P{p*=M$HT5wr*-Qc! zWI$xo0cf;7?Gq+Rqvn`P#$uxz3lk%s(hEyr6)xdOlN2^Sp<3F+1hbN{B2+@{!5jAI z9h+>xCT+mB6k0xK{%iy^@9zcjYx%aWXK10cknQc(^ax>3Do!&dTQm>fGChfs18`J6 zuYz#mb02Y2A^%fI!EtDa6KHfJTn^R9){ZFNT-&ld)Lt99%q?(9glsi5`6h(QgM^S}l$R_7E}Gd5jyfCgxRh<4Kd_9qhT zLKy-&vx?j56+@2H3BsX^ zQf_6}qJ~&Ux~L!=qDUHnlQ3OYZTZzpw!~lCw&32+7cg{gE0lC^wh};q%!Za0ZIK}* zAOuz9e;Ozka>0!Xfv{GAUi*}4(Y0e+?sq9HEAXHJY?pFDXB9w=jYwb>YJm@2s7btM z6G@g)_vbMeh+DWA-H&3 zz@LiOdPiVs#_NA=>tlz-3|j15kN69cqO$G)NY?_ks);eaZ)=(42^_#MzQ|Tv7F2@N zQLqID?l&AL0EWK7fj-!HYXE}rz;-M68)|?AY^h;p0gTPKmx2^AO_+0I_H#j3)mr#M zN7r;)5oaxQkSSD#XP6G}(U5K!1xBC{CWClu7lIw&sel-OMI|CzKr4cwir4cOhNi5@ z_4SP8rR32OiA0X}l9EA6f|c}zV55~+)jfd-YMeKV&$AksX-|xWzRz;eJ~K z_JWv&CQ=v7_IQIK0lPpeAmPHw3T9w0Eca;z?&E)YGX$urRxy}<-dQ$6&>85UR^>(x zmgJ3O`BN-%b*4yZa9{)kLV;?obly1x7^n-BnS=$Ene(_`pEQ~u)sO%9noqhCbe0V? z=N7ry4k0l;r~p2^%ZHbSc^^5MI$;4W*;D>&Km9EXtC!m}=D}bO23Z6>*5iEUL1g_; z0~~n-%C7F}u6QHCimw;|4{;uTr=6N%6T7xoS4oStI0Q^XTsy?0KN_URw|rAEGa)OG z;X1Ajc`)p7G#9ag!6vV{Z=C-n*{{`diy0xj2HP2YGaME{&*&Mz=1g|y4D%>0=3w9u z>WdbWiVt!bR&OJ$FwwH27_9LztV7$nY%E7bZv51`nJM9!+nS```i15CX8oY9O%r+~ zg9>INpJeE}`udFTr;ahn3J4pdlA#d30kfxS@;0b38nF#&6{`&ccI%@or~5uG+XHxn zC%1YQfS?B32`r1SK50h0#apz;8mv3Iq8G<>IBKCz*qQe@9ZULrU)!W%c(zM(L{UI~ z(npf`TYlarNl3uW9HwKMVkR4>&W1to0I@A( zCtkq6W}pU-E@Z)bi}{U}=Z!#Aw!!=7v#X7^kO+y`h?mv`wY!9^NBVZ;o4$7(b!B@G zGayteK>Bj3*oLkG8<7$ZKm@$0b-E91jpezQXOkZY7LtHR(73Q4sP_VIsI#0ffKIwg z?x^@6qJUz|n}W=S?Xs!>tkGDGzfmaz=*{Ke?i?nln5)`|phuT{`Yf8Z_~4xfLdL;- zamdRzRD&SsfJy%a;uDr3GDD%y{k*lOS#;-`+hLf{@n&pWh3GJqc!E}F$Ku6S#1`bp zom)VQu>1!$nXgv?IKH6H6&!XtWYmKfs~;e`QGJ^Opu?f(=3HIGK^4+uo&Q$g8<>Hk z@!c7u5ko50f}4bizE*>EcN>xD8?+!(Cb%1PSWHqN(1-?%1wjfRp?atM2@W9~grOSq zybiiS7^Eho&9JR;JkSNbLbGi?KSs7*W<4zBaMpAxpLJ4V41PLjNYcO=&<)Eoj6}c$ zmK7Z4s{({uMpb+-4|%l?PW>xXvW^j>)otKa&a&+kK5yz=nFXP+Q{Z?*tgxLN3L;<@ znuK|`S_1!|ps*$q_AVExGC zNp}*yy_1OOz~>?Mh~C_rkP^+r-1TY5Ij-sH%7nT;WkSQbf|{4g8iF!+J!g9+0r1ip zTd>(M8+0o##;+XM0>S9CH%QJ@NqJL>^4G z2pTMyC(Vi#Q5Xy;U_gb1iCWTtz;MyW4IM{r%n8#mWJo;DaupKCCq$=`xlAq)c|=kY zBsBkQFnhvii3kJ^9MoL0HJF6JkStdTJ26-a_8L&=LrQ@Bo$y3~=JcvUUTwUU)OO)8Y6UfZrcdu=T?Y;N9a+rCX3cQ)Fy zk@<%G+ZeCm#EXN%g`Ac0<$WqKe{RYTNTVH!_LQ)oDTs#`Y&AoK35a-!~Pe~Xa; zOr>HJK&(eV0t~5WU3K%(2a{WC#nnj&I4DtMX|ovBkxWTM5sW8@C{#%|5t{6AhkQh-sPIx3@-#CGSektM0hZZbKk%HYV(CcrNAu_R2Wi^UfZXI=C zMp-xAaJGmlW}+$F!rr>hJpk>&NX%YroBwS*s{^Ufmq5D6o^Ut3@jCwNy-00%_-h6MzyxH>IQ)4YKk zf6M@W_}~Ne?RS6b^FBWmsQuM-t^>sq#^n55V9OEYX5p zh}4O{C24+juvdsmaU(j=0da?DAeSJw2+9=9UPAE(qU#NLki+(j!o)T{F;uRKW3z~IIuURH z1VC}Y8p_tjE^2IRcx~Hvvybvc@%?<6I^0DKQgfQj;iL;l_gLu~FuMWCO6lFj85?8^%sKv5OQd zPxQ(+z>H&eAOy8|vP5o{Wt+!q=Ekt)DQ{|2r2Y91i*)~iQZ!)eBcnK9Hc9$TkalgR zbtEVJZhFpi>eQV)eJ3L!$w5illaiFYBqo!?&s3zaPlKusMz2$m3Bd4H1aQGKs*nH| zWYw6iNTqOg_)u2{aa|kmq)#Rln4^5kn_}!}GGPj;k;3#7&^)QTVA58h$yKH?$Ck_>hzGp1+taYN9$z-X(3 z=vXIORs=K!05otwMw6LWj>MLke640K_o~qv*)>*o-I_<^THE0E6|lx5?o0@4*yJL1 zx!LR>J%=hAhdDN%dW!7mECwjjv9M4(qE&(lT8aOyYSptYU??vd8rF!$(yUL}2^Vj> zR=55Zx3c8~`pkyS*%tRlu`+_*NVP?eaFjrScT1}!N%a$OIfl9gA>zBK8*f&(+9%LzD!r#IVroA*5m016tuQ^x9Nv3l`r=o= zPR#L0-_nK={A~nQD2W90ir)_l_rMBX@P6UvUh3r2h z_w0!m1N~EnPF0Mxx*Sj%D6I-K^pF5FL062Twoynl4qXtu3f#*= z`%u~pj*CPN&_n5os6+BtowOrQ=*BD>&^H|YXo~}8p|X-WgUo265gefOHxbAO9~qay zf=#!&*KOr@hx)>GlD9s)Oz)*~a=ZUx#`lOZ0RaY7V!ZwyttvA$y@Iz-h;gQ|&nZm= z#xyD-GRV3Bz_Pk=$XL+KU=&L8(FC)DBIDoDx8CgzLtFe^<5zfJfffye$NT^>-H7xS z+Bj);f!r@zqiG9fvD-JuvD^(d`W}v6aW46>9gNP!0NsgQx&va(&jZ zBPb0qfsT1Z!Qd&8GfA1yhFvjeAqxQjdU78OmnqM&!e4+Q#WdB76D!@fM2 zo#gE!LqVG7IFlG|ZQs^tfzvmI#OyX)`#s6zS+o@568*TIr*b=eI=M6{9m`qXa&b(L zQ~?-uswPIV6ap$@0l^nGCe#0K{$_hCmJlS92IgQgUU7C^^aLw_eHUOTlfo3o7d9ei z6iPuoxT2mg{8NOteAxXDUiOPg|LW1Q@365NN`EB0$C>zwUl)zlZz-* z1rQ)RP{AE400iF5_ZThVEIW{nHIM^}p@_Ngj`a9(NVrC!xDuuDAE6fW~d(H(2=@#0U-$^XHb-5 z=1ZIBNk9<*8SseB*nyeChAsvb0#|mQBo!BFXEP^cd?Zzk2Z=dHiBUeqh(g2#^ z2}Kz<0F(?QpauDoN1bqlD<@4mWsmANd7tnE``B(;$(6PFm97YuU-@MnCW~dshqFR_ z55hx-k`ZjFRd2~2aygf}XHmkqR~YaI%-N7z#fPty1-JA7+Mxifl>i{-0ES{cCdn}y z(vmMG03YBG92k>0Ko?GMnUsi=(~$*~cv9Uk1s&&zFgGNP2AWgZEkcHr{Uc6@k(wsA zlj#%(X5{~x_@NB=VL|(-RJ2)z{Rfb@iJO43g$S9KP|yStfe|J{OeZsu5?O|0coE5l z0ma0IOojkuX%2sp22QbB1`sWjs73!&RVQGWgo%>k$(Y0h1cJ$3kph?);3=3#0YhR} zFZXTSSfJyyHvV#Xjwnt_0diUplOnHSkwtt|yL{*k6knpr%ifielJHW4oE0F5UPFW9F)f7hf_$iix)m#e zz!#4AZRuxH&{TOFKm;v;0+A_X`r0*rpmB=VE&8DaT$&7e5S06wl!0?jA_NKadYRsxa8aj+4Nv9J>Ju5p9H3$K|$DSfNiO#osHXxC2;6oz#EJrj1 zU{NU#V6G(y4JYSxebLt0_^ARXQ$P3m8Q4!K-7^861n1s3>ZctUqI&-W>5?x5 zYNO~Fu)%-=ED#Q4kOC9Cc?hcsY@--M;F)CG0UODbP4Zt(@&sh6E-7#&g>g7^i+}5O zx5o;@B1B=+JH6Gro7vTc+dG4zu{2~bDYV;}j^TaY+jHnEv!!E4G{9`+HCki|$~CdHbXA~F`*ShOY{H5xa+00;zk>g z0#uorR6x6Hb4P*@lq(DcqbQr%RLCD&n}n>apjN|)tjO8B5sXY}jfR93{21Unght9e zOvcTiL=Y+v0U!BEnG2oiF}d8DsegoE>5R&Ls>NFTzD40nVlV@M)&-_2gm~b1QL~^X zrOrF^U#Z!Yuy979%09GxCpA?&4Gz@ecV`jM zn)pY#^cnb!2YXo^CaiLJG*d%Oc{x+1J7}up2$VWEn)vdtEG+-g%tg_IY|$5ude%D$ z*sHx9eaTQT#Nd$wy*$UV9KJAndEL;puq8mckRa_7J6c>t7|bYCEH!rL40vaDZ_%^C z5Y%RIM1q~zMkxyOAlS9=bLD%xW%YQ`3@?*xrbY~~waeB*XW3=7IEy%r5xZbhKnAJp zUt7zRnGuvJtaA_@(d$NKfgHULBi4J%w>iww9FT!nO`oZW0zN^!aO4@wI|ZUBien%I z&2-Ostq@zBMyzz5l}nc_qI-p{3k*?OgU4Iiw>(v_I5fm;;(2_U4TDuvJ#~BW2Q8S;|7v0i55HHG%reh*(-3**-6sXH1hUzuE2D+eY zI#rMm#MXvGF-($I(DnQzeB`vcjIW1b-!{Y3ccZ#ak}f92h(Az9<)XTqLAz3p+=?^X zgmeZn@l&L@T$H1xV9j)TE7lpEdS=bdYL&fgpypxFzQ07UZ{8Dq(*pWAWFPwGIoAT) zXKf0>*U1JJn9v93%rVShwD~)DB@W&ws1J*-59iKZ9+6i5HpQ!2?~nrCrf#iGy)xsK~u{yVj; z;J4j5Vvf}Aezy^wYZuN~3bw1~I9sz&zJ;PY1;X}%`2a>48d{{&d zc@855@f`{QVlL3=i+&FJaHt6&C+R>8|4TN*WFGZg?K-j|QDW!mTo43I%pM}lbp~Dz=C+CPUODV!{jA5Z z&1kOd&#Lk^v}#K1@*a?Q(8yQQ`i05P|6f2Oi!_@x=dp&D+z^S)N$I@2w&+`qE2eBF$a!p`E zz_tXLmBEprZwi%jG34n5WEqR#2&_?%%b*5XP#OqI^7oa>OPC2*B;H3pTuVM7B=nk*8@Nf@|&h8)v z_5B-Oi6-`B$f1fB*LQFeWT+_IC`uk_1Mf^sc$dp`g9i}L@|k)9jNNJ-hD`aAfvQr)g$*0c=4mO! zhXo;{m{=`gqtsTuOoehKi&}?H97oG!okcs$tTAG3i}`^Y#?ahQl79KRhU}R&zS;c# z?aM7NHE4hb7eky_tzx#o8uMbzO7djNl`WgXeC&pf%?a5Yn-sc|Xws$Ggwep6;%WyY zrlbL<#)66yvuRs^ZL3OzJ1`Vx`IF{T2Gt#mr)J%mH8Xn6w3)Nx;5bErh@2i=9Y&r# zeDmNlno?gLdr8klLI#K*klPEol0WL9Giq9 zsw$;=N`@;$zD~!AH+N-d`Ry2&o z$QFAs#>-~BY?51wI6}G7M#F4J(%wr>q1LE)0~{bAKvDrECx9S|pZGiJw>-{Upg1e1 z!?L1_oTFtTEQ4{*9CNUv$OZ25$>%#SwM^qV^*-RB1x%KJug;N9s*iv>y0p^<2K>uq z3JHLihbbcJT;a)FoZw&zqZWj3iFsnnr4X8`GSmhqmC=OL3^iON6%Q!`@v+QKEAd1X z2}`j>7G0DvR$L&Xl}1~8v?Ry>&e-t7#~yzb4KCt>l#aIuV?q*u0Frca&iTgsVM6hg z%dT213$yCFkWS5Pv*(HdI z0NN_jkV8o1uEg3nTIM9kpsO8VMwc|yXrq}oRkK4MwILd2%?E6NhU$UcHO>bHGBuP6 z`f34CV2KUQ1Bg31oheTL1YbZLKd3wjG=dev8FRvBQes?e!yk>8Q@&T3VkbAoV438S zXU;3MV@8~d!)-{9+0~a@)r;oXWzTt5TWzmw=UqYjdBD9nO#7Yl(Fd(xE$?duQ` z5F<%Yfe12I3I-CGLFeQX$EeiNCL(Z6`{V6pIw0M2nDWHu*Q{aQ+G)k>+ zl_^tfLmLqw=a} zMxAjP2^SD4Po*N&vz_%RQ%^|A45;w3{2YxRiuun0GHIa3E2!RnGa<4n6iYHJV;LJE z9SuzX;fuN5p#~6W9X47AJ2GKhZiRxym>vfSTPSQ6TiO{VC}FYIWUFA|gw5s_7C87h zNMvnF1Qm|#RyyI;X)>$XcE+l+M&+y{=_%T#@@zfng(_ENJ2TS!v8}kR_yVTJVWtsHWGFLbGkL z2Iwc-crrIp;Eiw0T3aq7Q4>bEm@Lm|92v5}w*;I;)P#GK61-+AGu#Yv-&{E=yvu$6 znli^;+e!yQ+!6>yVKKGLH&A7C1ESOMf%&SZjC|1H#M|wI-2TiJnbt|OY~X3m9D!e9 zg<+iRMT?M!%t-e_GPI+)*{N$p+MaRRXF=O9(ExfRPcErqn83t{HlZ+XlEaT=(feyN;jb$G;ZYcxV!96o%N`zN)G zG$^P?sC?`iPUYYhsyXIi9KV!>z;d;EJxv34x?*%iPAWW0tyEPr)v0weZNAa#uYfzl@ZLsjJMbab@fu}cV> zAKAO72LzQu-=EA|{w_1sYbVUZPAd0!=xk>f}8p&T)?4^@2dBL4NNdS!G_dt3Ap77S)oi zRob_oX0;kO7*yWS=iu;x`ed_ySRUQ$DEGbN*j!Yx14X32_Yd)W(8AyU7xw~~lfS?J zvq9x|uM`<3mIzLdTgs-^1k+!8=+2sXnX*cb;jyuiD{pgN=hu+zhS zQw$>eAi+2cUqC(*EVbhs6%@j_XWF}nA{-<<81*AL$UA_V7(5>T!3l1X#pw7E0my| z8mIyP$wugN0<_W-4I3t}kU^m+03%c^Ag~Dvps6cxIhZ4X0^lFn>Vx7D!=)HTSKNU{ zS)TpFwI;AXlNgANv4Klqpghz(qu{VEGKYv9CfYm3E=r(m0w9P)MrPc%4g9@lB)brV zm1#t$LlmSzG`L@|FWXu~g<64Cu#Oyv04uOQ8Ek=cRKH;VGsl^XyD~CGcI*IXL$C({ zvsI{)-U18ATO7%gHmD?nuh0S}T!H~<8m!0yV%iKMsIh@UMzKINHUKZgk%OJc0zFFt z5cmYM5g@KuQYZxbu5342ZL^QB7+r zNVR;Rwe&R5bb(KJnl(s9YEgnLSU5aHvHQ~_2V#P;fGiQyP2;Rhl)5wx5vjqH&L5l3 z&k2OJ_`p6K3_y&=M_Nh6Obf;o&+%+Yn4~1?LeKO6R1L|rk|cN_Jb+J|l+V)4%rYV@ z`@&E5#F`_D&;I0tI)FM1%PmwutQ+`&`HWAM=nO`HPb$EW1|6*G8c7MwPxp+@+gz#j zd@jwxJqm44V{*>w0g3Ss)Sy7XH0(UPciK+wgfH++%oSAp6elwv$lrWY za!OAjb4v6Z?jZOT~oE>R31&sP^C>! zrPN7<)JHw7RGrgRMHyeIEb=5oLRuYCDXLM+&OJTMz4%jV+|{*%kwFF26HK+GBUYe6 ztvZF(S2b2-W!7I&R&{&Usgl-XO;+)ARbWlBo^q$M!&T4fPQ&2U5|mY6{Z(uw*Jy3b zWmQ*domO^r*L8*0cx~5erB^{TuXdtQZROVBv(-QR*5OM`aShjVwb5}U*z=m#gjHB; zeb;(*SaW^Yh!xaAq*#9K*Nc@=Qu|JUEx3y9Rf9d)g%w#sbyjRGS%^JZlvUZ4ouG;R zSdZP;n8jFs^@i>oSeU)pmj&5!^;44nOHQJ92)L9MKo3+@PT@|Ob z*__4Moh?|YJ=&r*T57ddiCs*t?Nx~7*{ZeLT5Z~Y%~i9VT8<6bvF+KRb=#p8+OECY zxjkC68^m)+TH~wOi&Z43H7c}?RU>2Dwbj|ey;rQI+ssH@#0}5IHQd3~+iitWne|(g z%-9!&T#6Oj$8B53HCo>B+{2|?&dpr4Gu^VK+{%TS(p6j1wcF4YUD%b~%>`T6m0HQ& z+gqJn)V17yW!={OUEA$klLg(mE#A2eTj5>Wfjiyi+XY_b9p2cTTYV6X z*|pwY#arbiTj%XS=VXOX5y^iAISRoe6w-~Bb; z=q=xDXj}aaURhaRq}|%tb>G^x-)Te<0S?~>?qA*Y-#(?)0d`>4?Op>`-~--Z3tnLU z6*b}jPGbY~>M&UXCUgIuw-d1+y5Vm7IZscJm<-e`jQU;7&R^wb2 zGG1O@UH0W)mgZR|<~$zX2!3P=PUUS@W@mooZ|-DkZsuV?Vqvc4Yc}U%R%dVK=5A(Y zXpUxZp5}NCV_IHkbq2(DZs(niuYI0pdIo557U*EE=NYxD|c<4l)=zcEgik4@Tj%AKM=z9+1GX9GSj$(hN zX^1}Qlx}H_zUWW?-so1gWy|GgfR$->ChD0E>4*+zjLzw#)@hY?>Y(mus5a%Irs}Fj zXM;XyoZe}lPUxlnX^j>>OLpg)ChM(!YOVI_wD#(+mgq8#pj6UZIGU1U1>>X}u!#?b;&TF;CYsK!?#kgh0 zW?#Z}?7)8J3#RPBp6t=a?6x-T#RluB^=qU4?4f?_w8d)4E^XBg<;q^^ga+IKcI~$Y z?ZB>Ws5WccwrteaZI}+$-ag;hhUT$jWWhG>)E48rmhR$4=IBml&wlOD{%v*+Zn~ao zfv)bg{@>H1=4(i<#_b;K^@infHq7w`Z}`4#^Zwq##%}69Z@y@4<@Rm%_HNpiZ{enI z+_vud#_i3vVdQRXB!g}LX6{o~Yo;D>u9jeOes2SxaPdBHe2(dCe&fxZ z;TZ?s@4oTx=3`;b*nj{4A^8La6af1GEC2ui06+mi0RRa90O<*|H!vQ-gZJtwM3|7_ zLWd9|N^CgsVMU7=FKVR7vE#;!AVZ2A`LU!)c_iVfT#1n-N|!HT#+*4)rpqeYV{U23$c)2B$I7Mx18s#T#srC!~d6)MxNTETk#I`$^FrdY$O z<+`@5Sh8>3mYw^PuF|u3)5_h;SFc}#ap4N?8+hd}!inDS8;9iYvXy+=wKWs8@+NR=6UKW*H~rhd;t7sIm?Mt` zws@qHOb+Q}kxS}WqdG?#8ReB&CYfcEPa`R0jt;<@IYJ@VS^erZT<--qjE+H>7;ogYH6dGK1!*i ziY9vKr|Y;AYNwl$YUZVxQkE*Gtl9?ZsHVpMT4|}M_DSn)#v*U3hc1A z>dIoVye2E^vamMmtFX|XO00-!Mr-Y~*aB*7tDY*$?X%Th3ofeShFk8rcmur|kyj!oc_sXm9zUX43ufP3zqm94>L!0iwO$MB>!sl)q?OM{Bi{&@=mSge7 z7*mXKHvn_oF*5*zEb_=Ck9>{DCocoC%Cwk_^2)TN%nZvi$87V=HrM>j&eZgLvNb+q zBXh_^XM?c8NGDw|!|HBJp0q^+EVIr)`&+We95)k=GFx-)_19g0oyja@uVVJusH7c> z+G}^hHYjd?BKO>J({1 z7JCZ07n@$k;ZW>aBOf?Lk1i0K^Dm1j&>Y^5%9>zK63Dn zfDEJ{{W!=9l2C((T%igTIRQq(@Q?tEq$DRP#PeCgiI~h{6r)JRDv~Z)u<)N4oWFr|V1w2^un%Hb!Hl?S{DL_w>qD0~uGD%KPe)3;f9Azn2$vst)k`cQM z-Y&(6hy<>&77VSR<7D`@uQ`xVP-F!K654WjuE} z3tP4^7(k6BE%m7ke{z(A1t5S7uHc1;D)gy^qyR(-Db+hx)u~a9rU|YZ%&Knnt6$xq zMNN`A&bDSl`sS)*x#A=xHoP~l$`DThZxyiu~ zc1Wxv6nj%s_Q93&RNzn5NZDD=b)OyWXD=ZDfB+Oz4>AZq1CU8jD>%WlrA;ka3rbpo zuGY1$g{^F#O520~#`dWYD1cOr835h(5~zhBLp{q#+~U5~r;@enNEgdoKk)UrM*Qoa zTKdv0-f()1Rcv#Y@XlTS;iI+O-R*4Gj67%|3Q@=`Km8d{&KBUa6cBA{QR@Y!+PA(; zMP`2I%isR`_qMeSFm3~2M=OMuz*5x(XoDM97Ua_i49rCh9(Y>eE?BM#w1Qg`0R>Sm z))b-uaflb|TFOOL?}f&9Z>CtXqN-0019+;~J@;2cVKU7w1g| zgDs2Z44--bpOEM<|0b6TP>7hu%`Gu>rIBJx>1(hZ?t`7ROJiQ}3>t{O1C4ulh_Zb* zvz`#Lq=%edEy#7fMy*8yzPx19PN2!9y)S;JT;)<<`PBc_vZ}E>gc5X_w*c653>17> zP2^zB6|QT9HR^;o( zJyDBEOS&1AzVt@d9Nz$R+6uBBwYsgGYE$<&%I)5A4(6R@S9|r#1Smi~gR2J(n--t` zWHTQuYt08=)){(8Wr$B!CvG6a7a~Ti#Kj2S4~km|~@4X(i~* z-cy0cA;l(0)r+=M76VbzkcHJXc@3>c{`t)EI@sAZ@`g1dSD(nXE6wQn&o{xmq$fWA z6@Up^pcCDJtCjuD*UxlP!+!R)r#Gu*Nq4f6U<5go={jA!|GV~|{{YB8j?gm-b7xmq zM2@!}YXW)D2P(@jd23T+u~2Q$a(zkz3Warc+~;}auvDX0dLRf=mPT)*^<(qk46oOI z?ze&|n0K?4cD8c`uXTU^7l1W5QvT;U{MSiK(}TjIe2S-o2zYU{qH*$4c3)R{5_l*S z*n~pU2^k1SV01tnm|mghb}q+s5a0xo7HaJGg`?JjViNj4C~?&!tyQP@_=yw1&vU7b_NU$7d4lcXi=C^1J`Xr_6O$wpmJ8I zW>`3Go)!aL=!IaIiKsP(WGIH?pmN7#Oh3ei&*g@s2!NAgG^*%>1oLo|(>Q&_Yz*Qq z7WgWD_;G^<3dEo!hlpsq*o%PEO4^19l4c8L2zqivYs09B!WB@LxNe#Ve=`Svo9Ke6 zc8mu#il=Cb+_+pnvx=aTd_bsY756YK#V%DrUD&5OfcQ3Z*o(WEGl}SEXlI6#wsKdf zZHvfnQYKZ;C~BEFjhtw6)_8X^fQ_zIP1b~C+t`rZI8Mbd4TlDf6j^MObBETKhg`Rj z`O;Ds;|;O!KYyTvEmLj2c#_0$Y?ar0!suP~sCM`mewmd^73PnWc1P_0_kQU&kXTk< z@@HGDR*ibp3_*s5r3FW+DaJU-g_OtFd4+(n zUzF-&2r_n1lB6k?gEoEos8K+W1|D<*uZf^AL^f}U zg^#EUk9cLpSOUNWp%69?hKZqE*alXhp>9N>x&Wfo=?o=s1s-}w<3I)n30fcep%%Jt zM`xm@^_@A;qQP)}OLd9i=|?OM;ag ziJwZ+nO3R}7}#j|R87nfK@*6QVHsoAM0$!iHm<3lXNp5p&~_pCK;mT%0y&{v(*|?e zZ5NuMd7uaRz;ZOIMk`>WIhtM`%A%szry*))kv3}>s;3pyhCe1ki0NV2lv=hjV3}&mM7{7=5@U|80xC=cH{tMYvI>RPqf=~E zo4tcTlT}w_x>4;YJa9B*TH{^@U~U3nZVONVvDO5gyJVm%09s&fFb8G~5Vl};0jP@s zp34AH@VNw#2Ls?)q$;s~1EC89wQITnAhrMuLIdo-3?Q`z;Jf}yyQ2GLQGfveOa)L& zwyT@JyZgWxkiqgQN9Zb-=GnIBnVuoMlzN-J+G{EH3Ao+6FxX&+s1Ux~bhzDSzGNe2 zZB@SNTe4{xo5cseF8PSRqro`T0w7QU8Qi{$_@#ZauePrL;F3!7lP1ZhxSQDBVX)dWo7kfi{^%sU2e499XD#}Z4ia@e=4+N#{k zgu;@2W`GGQm!;bCX67pnj(f7b!%w#VP!4Gc4rwqpc#u(fBe~BLtbHKC91sDTyvds@ zTA45a81TsvAj-CI0KeO>xwWoF`?YN6S+C1-0jvhGJj*0N%Fb%b22jesn*yA6O zt^8dQz{#0h%pf4f!J4)W35z65$8+q=)|-lVe8TIp$4;m;c4!7a&o zjQq$PHOcP`&&cCV)^yKCY|;7P&sY7=TK$~{-PH)4tOEennGn&JK-T%-x@S!V`@96& zimo7Z)%Ps6d%DIbt(2EKeN!z{)nutJ4b#^9*K#b))Qrbi!ZdrVm^uxBKSZa=bwInO z2m0i%22{yoJkJX0k^-cUaT9z73T~@;2h}Q@<#hqyFbky33>e^RN^J|N-3&93tShj{ zDWK4y{0(Gm+m2YR7+S``y4&Ay$>Q)lzrC8@WyZ-61$Ld-DBTUnIzd}FvQog(eLdZN ztwj|3jf2g?*s{Xh4J|qU&6q!=V?K3)KRsDF49`z3zUe)D$+M8;E3&NlX#6?f%y4F_ zS>GT7d>nHJ`8{w2$4cQ)xE?Fu<cX)Lq?xu(vZ! z*xPN>3iI9I4TyUk$>RB@w^La`wX*W`)O@qvV%p+jdR;TnPK*ZPU8J9lpo5M@NijY> zH2%%m2X{)bO$&=j z-6FNTME<-`9_3R1&M!BeG>eRAR}Kln`g_8MPifSB#|THsy1oM%Hr-I#8s%$>Y^!As z)xf7buhYhklc}oCutEyws`CjRx9X@)=W-rOu*l4Lp6gETVRXIIG@$1>mNw{RxIYlx zJk3p}^u~vd=!wq9i@vdo?sY#Z2#>A97-o-_PPsv54!l#c;I?gqt4rFBp~&-Sqi(p& z139%mKB)eHXuvu@?uT<8N^yScv;GLn@VqwVPF$qx$_|0TyhGSF;j|E;5N=)yX~|;F zFTmgmCPE5;loI~ZukGda6q{|3 zUgecLXz8QMj@{ZV@rsT#jgIw{xieP|1$=<*k|thN2==Joh~{3_LHvCl`=BX{@+q(K zZXfrIC%vlh?mLg~Lxl4LoA+?P#%4!pygmg*8Qn2e>dHJyesAQ7nFblmy1L2*z257J zuZ*Mr2D8a~+>cM)Q=j4F&ujq``p|;@zR2(?Ft|n4FPWT^1SYdPBF z3lO>xc_L_T$sL3VJN;SMP~oRiix?fOQ!&!Th>zUBS_J5o$B%}<#K|bJ0C@{ zl4Gl1Fki()L(*oqe9q=c>C)5Zot)!p&G4B;*`G|!qhnVp3^`;~uyy-(oH^6^RIgUHnl)O~s%@!=P`j%C zjVX8(mgS8bDIpnZgew*FaQCcBy7{0&SPHrEmmN1sS5&>n30|FclE*F{|{P#YhtY?7#QF{1t0(d5pafT!K()$ zEQ+LSh(SggzB1Er!^0l)ki*MD6j4OZ+^Fj-7%(`23R_r<%{3THgAq2<%6g9{DVk6S zElhgs!#9Q&OoM_Ui!+X)KVk#tG~FV3s}@~Qiv^?Z!n5up?7&N}O7EhZ?z&B)`lLM| zCX}kYVEEwaDGb=MalbL3+E2Rwo~U!HxroBR0NWC@U;+qKq#)2g3njr&6>M1lF`Et> z1+krV9D7vK5h=6G(n>ee&(1s{#KRL8VH7nVY+jUYJ=4&VYgH(6R4xx6tB3$045Sdw z2vv_f1j!nM$)~v|qa261=$2CH%PznBZVj8XOV+zRde|ZfB|hkaL4)x0stH)5T=S{~ zcw7ojGs5F45r}*uLaK^5)wV0{rud;Y1Oq*w06zg8bl(#C_4iN<`nZ%Zf*pnDoJmIn z5mScet8^Jhijokk6rzyPRD4F2?X=Y1XzeXknPPRfK1!})hEL{o6BAsiKv!3bdmO77 zh88&rR*$EgDbMYgxH3yQnRT|ynKpUJL>RuxHI0&)f>Syu zm=R}|c0o&~mNHkpGYjVE4IqF68c48heknjf?tkm1fE9)f*84++Db4h6hG}u6-H}^$ zGgQ?w)>xa5drg%mPgl(isrl~UAd3)cy)_Mar?ALK(3=sqvQAd2EH+ypZmINi(QVbE zFl7qFOQg9hIvQmmibTQ+YI8f^-|a0FLaPE)3QzpPLro7&z|JkFHr{BG`2QF&5MMsC z7hd1E=~nCefH!k={DjK~ykYbqMjPxPkpg14#Wf}svW{g$Yhsb>SkN5N#fpLk32+Vw zGEjjGoVOGl1DZ(%7V@zL4bMat@U$X?i>#eQ1o<;XK0*zmOGD-)5CRse zr2#KY)V`9Y!l+eYTE95|raID~IATtLh5_O4uIEa))=noHuSj2lB5qL~&Aupp~ zMe|9qZ&WIu!Augv zLj!{mFmW;=3T+s|9}%G+I0(s*7_>l{f)I);iASGxS;g2&h&$PV0i2h-q%Qr$Nx3bt zDn#JXPOJh3QnsWSK&U_(VhNzxU;rKYNM|i+ImD*m(uln5UP;5psK!81n8PIIrNn0; zV8oPJPpD@ngLIZ!G}D>sh-N;ZNse>CCN|fchZ^Li&7SP4Op{E;gYLkx;bdz|6ROx) zgcG$VWUi3W``?LPkRbfLfHn$PS3Z$Nr<{sIC@l$S5Z=eK1r$_!;Oiv6R2e80Vx?pr zjp$vVfRu|ig>nv^RYxokFj7YooZC0I}!1;tXiOp4U|DC(GWGTG9dyf_>*s~ z0|!Q$C=RD_1|Q-ejH6kn2P=ST2IA@fgBprZ+|<{+4httG*ia)f{DW7e05;Wr*G?N&M1@ed!(z#Ba5ao}@Qf)_wCk5KG))NOG} zE}dvDbw$UNJ2aJ%OhWqJ|p)L*N4r z#^Iyjb;Bhvt%tC=nt@saB@L3&JS}vS53?yicCl=?LCF`T^^Kx8jJ>cfgZax=#3C}I z00rTl88r>2$H@}lf&^rn0WNrJ|N5sBLc8nFxRsb3(lyT7HjsG`?2jha8CwtTp-p7r z%3I&yXc$wvJm<}{Gs3Zo>O>>b6#c6ITqD4?w&l{GYcpuA-L&2~ouSCF=%E%+Ca=4+9|Lhv2t!#xnVL>IeIYyWMrlL|+ol}&zlPHLIh zDktBtSDs&#gnZ#$r*d{#q-VaTz>p!mJtRMDIq2J zH*6LdG&BAYy(n>`I19a23cxzEGueQZ;Fy~Ml8-j>xS^wq6c9ftsR^MVjeNMj>L@ZJ z6C$q*h2X;j_Bg&06owZQL0bxf6(xaRz zuR6#m{&@lO1Eo+iqLFhi!@IJ@`lb1cKgN?n{DM4*D+4UtKPTg&fe63{;=E}?hxRzY znQUVS&}vHQXwECxG1A8Ey$(! z!ZKl_Li&=wl&iwY;y-w4geFs&Jg6WqBnVwBh^=Z12V%5B(j`3^Ix097Xy7?3C@~uV zMv&2+I!QWB0wUSFrccPiny|)e6t57RG~^P5LG(A~Duq4hxQw#<2Xgu|&3FD@)9{ zFIYr|giOr;wG2b(A%hrLnLp|#nT?SubxI{hoXb#JrvPjU;RHd)l%3ld zg;T)EJ>bS{j5L`P58`_Y9srY{%*?0!gyFaf_(TM35P`q4IISo$STH?QI0F%agS1?R zSlT51K@~mHBJbh~AGm-%iK~TUIFfrWO$s)}BgHSOIU0? z-h90O;IvU0D#7KnfFm-+5j9aeDztFuJpf&Wt%EK|D@PhVR873mC@oAZxX~Mpgoz42bg-37Aio?sLLiGW-(kc- zDN}(&)4f8G{bIma; z4?;vs8*PO`HB=v@$3zuR8%jY)C_zE8CD{C$TF3~q%2rLq(P$ykkNDJd4KGHUq#U{y z(ilxu4FNyOwVL8B1pvtQi`6E=uicakgsD|q{mn4jRdij!tAwM1OTVWnpayKf&7nd6 zi?vuWSkGlhrK0E$)zgg#`zS*=g>*%-U30D>3Y|KTG*y6vPDnaP=+iTS1Ytmq^rVBD zrOb6~h-E;*{RC0~;m`5QRCUFIPL)zm)y$_l%@$y-7FA2tY$Ig|Ie_#vfX%Xlwa~-J zT3kg~-&ELzt)&cbGKXuK=ux*zE>4@Bw@l3h}q=*bkw+kWfM zuS*6@3rEQe+;#jb6*a+cSOrCZg=FZV<71K;J=7O-SEQ|6%@m?qV_2qpHo=oqC4|*8 zHN4!^T7%u%TSZu~4O_7dyA5!F)|G&)<5v>cxEioHJ#YenNISPnnznsg=AyO#9%X{f zl2jE`+77)Y7AQfrr2;4@!K6FhuR*h1AXnmJM8I`0X;s{|RjV3MTX0l0&7_t&2v0?z zT+6*&uhAf&>lz?>$3%P@;5ra8t=b;D+R;78Da>Ef_1cFSOrq6Xa|B>6a)OFsktw5s z5zvhYC=Vhz52r~4EKS>S7&6C{pe31LyG>eiEQHgzg4rFL?)5jGkk>*WL71&sxS-VY zDAzjp#$*u3^_<>ra06k$H0{+ii$lu272#SsUv{MgMFLPCw%p~4C8{&r6t+rD6g%wN zu`vzEs}0x;DP1b&+Q<75Q4*&Z+F~ChOfUZ8b+O$KK3Nh-+#GS5rs81#@Pl9!fD+W0 z$KV~nd7$9CHC}Mc1wI&oBx?z3IyEnyVEgRE=X z+D!&27y&(SU}P>zP@okq^yahqR029qz&k6K6nPXNY=*4s~8t z6KCjp0O0$ndDP5-@;Tg_YIh zqSed>>&NSz>E_}~nO5T(Fx;=vIus;Q8U9wl9%^wwK}Js8K;FswlVoQY?3NCbrgrK? z^hehUV>7Z>&F!KA3bD2L+$#HOu&xX$Ug)x(;xwfUv{vi?er>o??!O;|KCUG0;@jqe zXaQ|~U%o=*kpR_}u9mm1IkNFyq})mGW#kemh3{=)z^>u75`(bF?r?w$npELPNb2)t z>eAliLhA$Yy3ec39j4^%t3|89Gg|B*+y1`@njF^`hvDCk4GpEOO1x| zNV*yxaa8D8Al}bR@ZWe|SJTGU$aR-o7E}4fZyr17ujX&u)>=x56edR{CkL(2f^sSE z?E$afx3Uz3un?J>@Qci#enJkN?K?2%y$9FCyRcdRnK9!?wIxY2@#s#(OFX~wCW8>j z#Gq8~lf=wE{DQ^Y1k7~vRtUsD9|d|Q>`j*D_I`8eE{Cs4gvv{juW`*K&KziyfF~aE zCyrty$6pO82fuNcz_AcaV1+y&^-92+`-$iQKf3|w9d1*wjbe?BlB2fVC}z}&(bU!) zb(1aHDs%W}dIn-ezw?^zacLpaK__%%5B6j?@hSyRXpc!~e{((;iIz6>^;V5sGfnYB zFE*ERJ&=LlIU-i?wLDd8?s?@TSJOzzm`Z|Qcvse)d$Sai_w-X%RVOu82LWx1$BUWT z7{OvYI2lEevk?V>#GJ`_-hx8vCT_z{M_cy);yvHC)+m`a?V>POPLTF*jR(_nHHW%oTSeKuew|Dt6KshiW%54J7Ik*RKL@%X*3fJU1rsz9A z?MNPCI*4h1%Y{7z;=nAC?5Z?|Z-RdokG9yHcxnqvbfFk8hW5 zH?nl~(|J@xcYQg4O;0(*5TAQkFwe_k8(;&?=X}i{c+Ss!Dx*!(Fa2_tU+cOYMz9cc z2(8tC26@*x#_{*gTlhEk0M^C*+;F%56)bd$H~U14%44VaG4bA&y~)d_=eZYlX|H?b zFKt9`bG=V=$}J?myQq6E6Sueo;o3xoniovJ@4saF?wKK!OrBI@G5CDiOE}}FG=8RbeC0mj(Z0JxSL?t3-IXlRK;T||Rj`Zm0 z@#6=O5l21@A*dpvHhlO9GXv*UsZyHewcPRuQXEL7C@H!rY*i~byG9W$%E_prqF9zP zeR+yht6NPUE~E;E#vNt(x@Ga4F>VYk8|2869Y3yY`7)+77A73%T;Q{3xCBO%1`t5N zfVB@gs8-ARwF?j#K-j4r`?ifGRaAnyXq9AHh@VhO$a&~fohfyGganxd3iRl}e>bXV zh01ayHoJxE{*CL&@AJOJq$vK;(ey~y&zU;s>CjMLs{a1X?9)gya%cp{7^VzaUZuqW zfh~YwAO;1#wSWpyIOs`1!OWA-R8oV|mj2_gepn(5Px1(|#;PIU@C{+|-SsqX!PDM#tw4+1SDLEDs-hJbYSi%H3 zUN}`^Sy4BeB*or(Ub^T1rI_^9M-?exm{}hhItrM91PjVJrv!TKH4dH=;;9TU7kbEH zVt{@)Xo!UplNk^e)P;#T5Tr;Nq>;8*BaJimcPXY!o(WM%KFUA>s1%6$X#@%ap+H>l46BG2bF?!0wf<|{aDc|-W75lPw}Y-W_wLZ;@+lcp0(yffwaklS5H7^ zU|Vd_i9s5fX`2bRwlHIhBcf1a&7Xm0Xs)1!l1r$%d1$tR42YQH$z~07W-n(aezxLh zFZyevr8{IgaI$O$Sb<#lDhxq_3@@zk3?IQ7j1?$kR|lTZB@@mn=B3apt4QVoWJ|*m zD{Qe}q&Xk61!IB#o~Hf*80EZ$5R&KxD(H*>s9F$mGZYQ;H#7}gJi&#y>kf7<)9I>9 zC^1hX(x(lgs?p5UqB{KWiTqL;W55K9?J^XML^s17Q*1q#0&Tk;*NOKwa6xiM7wytR z7$0PFEs&s~q<6w#x$!uV%rf4uK%E@sdu2YwvdhXAe9Fvbgyjr`QK;lDs&8GYsWHOk<-m>!Vzp1h;lY>Cz#v=3X-TA3b z(B2HxhR2%rRg10Fzce(=`1Oeun>iI5x4v7NdbYTl! zY~^^#V_*Y0NTDrlB`pqtP%co|jS-BX4z=JLEcS4d7b0mVF7(b$gk_ZTk)kM}U|di> z5Q`N~g@WqSNXwpOld}Xu4VehWUeo}A5;+kF8dWJ5M;sc3e}KXS^0c2^OI&XK<4RE!cz&rXdZplbZ@0<-z5-1%YXNqF+jALQJvn zRnYQJuQY)}MX2nN8Trx=6F|9|5GV;IG#%L4N9e`ieN5Mo2SwQY?v#6+GPDb*im8L@(7<6^`TfSR`@ zikflRS!gD(nFk_lH+RTm5f3*dj%ku7kR!@Dm7-2gCb5~4OBN|h*}Xny3u`z#!Gprm z4D84f222>87q1~uT;_6@Ph-q4dubU&X)}SEIp!N3SS@9SM4nxc<#RH+pNrBVqj_u& zfB<$pt!Xn~%u~ThKiD9OI+IyA0ZI&!lFpgV=Z7`DX-&%%xn`A8Q%>>HE6#S86c7~! zL#4t!`>E8UUG$3tEvP}&wGMi?qpDP$Dps?a7_Alr9bUEPNF!Rvz94D|ptw*UY9j|b z9PWzE|6oj4%i%3s$d4AFB-;_p&7Y!r_h(9h{?QANq)iJLzE-zQJR`^vYMzfbg1u1p?bnaDo@z zb*GVipJL6KGRlpYk~WoWWJS5t%KDU)L3I+~;w#_zY61_Dh(&4v$l4C!Lr*qH0DuE5 zU;)o10kIiyffLL?-a6{H00u!l!$REQHp2x7Ht=%knl(V2a#LAAMcRU?fjj;ShzEPUZDKUg-oMeu^fY5)ftn63AiFmcQAUj$cys&)N=BywCI z3~CS@grE{48c0ade8vV(gx=3I4C5HLv&QL^X^+pR<3&?~hw>TI`v@)RPWE&03|TStfqZVEVCbe>v5UN(qH2LT8fgrz0~|J#{B z(zc|wQ?V!Xl&9y}V$j@1)=>_PX!S69$2JaSj*lYbAhWMonEpW|3?k|uts>NY;{&Iq zAcf4;H`G$V!@xZ&@L212)`P0`lrjFgC@6{`tVly8Kpt{q=MF`tN%p^ZR{=Ztk=V8s zcD6iWS7S~31(&czT@JLiKI;r;eQhJp7o|BT=7SK`b05+Tk@Tf2Jy=dZmX3#2@2T?` z-%!D+jE|T^OuGRFx1v}LG|Q?V+3(<~#sdoyK8v%b+8`5GsKsfmab)qG;F0 zkcXV(CzhyN1b}kh(Q!3!Iy~YNADcV=Scy6U=mMsRJmxVByKclC&sAV8{{pR5P4$lR zjxh;`@{0bvppP@vM{oK?(>&{=3%?nhzA_EFX^&EN@NDH(;0j_y7^cq4tv4rf=zdDpH2NMy~? zY=(LpXif-jfCGDTr2e7oLg%Yjy8MW@(N$l)_#MH$xt`1Pn7`59`2Ew!6oRRB+6dGD z<{;InMO-*s$L;~&!f_VGC7<#s)bo8H2p$SA1d|0AfjxyBvH9HfNlNz35%=|uJH=p) zf#2y>1sYI`XXMP!bw+G$QvtMJ{B4B9pq~BF2Sxk=^~ixT%oR3#|BHn*!!mq;h;@a>9d$sEE(V0|TylIa4koYgIHUh>p@C%%19}K#i3~C3D)!_JL8ngfx`>j}Z-BUF!;(yJG-So$e6_E$5K=cp+ zBRrd%O%(n6~9?%M?#O1Y3GWHg-tq2!vUkCV(AgT}Ks8<$r0}`gy&oqHx;nVC? zQ?U79$61JO*aaLu|kvrH}(~fCx5OBE`Z2^xrZN|Bl#6oIXC;0&WavJ(-d$ z!y~=hQdHXPDO%;!;y>+5MHn0}?qV{KVjwux8&;fZ$srwvU`8HF^s$l8nN)S@8NZyt z9|jE64dUcv-L=^no*hrmjoUKzS-L?_S1FPJsvdo?HrLeK^+;EL-ZS=H9`J(&NvW4H#$gl4kre`?8FE9ZRg~=>F|HT$s(z6_*X)>J~Fi~o*CKCbG z`g~;dn z-Fzk*Y{sToN(M2~rZI>hFCi=4)6_@?&(XPYb%N)jTFok;`<0NZq9 zh3Xl@xF8p(BVs1zwIP52T<1^b!E1?t6f%Val$K_$D2r}p4wW7ag5SP9o6A+8B6Ju* zy2=E-<8C46AOTp4Y=#;X7QQiBHNK<(&;T%DCy8c@2q2M+sA$QFXIuUq9|$CjKHbyJ zD0|WL{Vw=QdOWqW)-=De4>+ilH!JWz1EEU8tBPm~!z#Zn)uFIUz0JPms8l zIe_Y1)eJpa;-t~hf(R0MvS`k{p9dIG=~W{iEkOXx03UIVyBHS{VFC9+fef_hn1bY< zS-~fvr?Ez8d%EYK7Ak!j>Mt^C99D)p;KOTm8JAt_mL=(Kl9>%eCYn*$e*srFX#;ch zM&y{mQi(u{t?KpF%R3&7fE0n~p=c5m|7R9Bfc89Qu4YSDY{82h!mp0!4~_~7=$Rfo z0uLYh$3pczBs?9GHP+E4EVVAe9)ItsE?U>x8Ho zYOE}Xx`1321h$!Kj4i?R=tUoB(66d0u%d{8)kQ(1jpmfY9|%m;iC06s-)byD^x*27 zGDEBIY7*2*c(&`Pz~li?0E-gq{PAh%aV?)htg=RId`fJ^TI};-?A-kYKCr=nEnCQj zY)C2(nPJ$pqHG7D#(?z!J)}YYJQs0(+nxyQ^;wa+iH~7+gwqvKN6`Sj-f9&!?bFJi z5CyFDUF`yi$|ABW87u-194qOu|4dTE(8Gf5vXU*u_Si4@;2S7g6#ep ziO7y@v4P9QZ39h;?(}9t48$i`=@U*5$Kr;A5X4XV?WroQE)1Q`VxE{*F3&a(T}kH4 z+GGvdpJv@m<7&&}?k!gcpyc`ut0Jl8k`zgm7-!-n`S>57*4XHhuGpIH#GcNfUTn1P zXOIHZ9Zp|tpGsXf>Mhh^adB*$f*FM)1T1C&T0p$H$mD2zsEPK}rR zvL^kWF6?QN{hBT7&L$G~|A`XwLZ7tUF{-7*9I4J;CiYFrTS6li1L6S#ʹfo-q` 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%0AblPUOaXUj5jJ5F%k&C2^bR+18TV=! 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 literal 0 HcmV?d00001 diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/model_architecture.png b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/images/model_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..792d18fab4b25113b2de9a2819b683213220058d GIT binary patch literal 91424 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�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

klG}!`4F{@jg57VGDxfPB`j;#uHD{uic=6$ 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 MQ_@nblShaBAAP&m%>V!Z literal 0 HcmV?d00001 diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main.cc new file mode 100644 index 00000000..f6b297fd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main.cc @@ -0,0 +1,28 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/hello_world/main_functions.h" + +// This is the default main used on systems that have the standard C entry +// point. Other devices (for example FreeRTOS or ESP32) that have different +// requirements for entry code (like an app_main function) should specialize +// this main.cc file in a target-specific subfolder. +int main(int argc, char *argv[]) +{ + setup(); + while (true) { + loop(); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.cc new file mode 100644 index 00000000..0b293442 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.cc @@ -0,0 +1,124 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/hello_world/main_functions.h" + +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/examples/hello_world/constants.h" +#include "tensorflow/lite/micro/examples/hello_world/model.h" +#include "tensorflow/lite/micro/examples/hello_world/output_handler.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Globals, used for compatibility with Arduino-style sketches. +namespace { +tflite::ErrorReporter *error_reporter = nullptr; +const tflite::Model *model = nullptr; +tflite::MicroInterpreter *interpreter = nullptr; +TfLiteTensor *input = nullptr; +TfLiteTensor *output = nullptr; +int inference_count = 0; + +constexpr int kTensorArenaSize = 2000; +uint8_t tensor_arena[kTensorArenaSize]; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() +{ + tflite::InitializeTarget(); + + // Set up logging. Google style is to avoid globals or statics because of + // lifetime uncertainty, but since this has a trivial destructor it's okay. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroErrorReporter micro_error_reporter; + error_reporter = µ_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(g_model); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + // This pulls in all the operation implementations we need. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::AllOpsResolver resolver; + + // Build an interpreter to run the model with. + static tflite::MicroInterpreter static_interpreter( + model, resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); + return; + } + + // Obtain pointers to the model's input and output tensors. + input = interpreter->input(0); + output = interpreter->output(0); + + // Keep track of how many inferences we have performed. + inference_count = 0; +} + +// The name of this function is important for Arduino compatibility. +void loop() +{ + // Calculate an x value to feed into the model. We compare the current + // inference_count to the number of inferences per cycle to determine + // our position within the range of possible x values the model was + // trained on, and use this to calculate a value. + float position = static_cast(inference_count) / + static_cast(kInferencesPerCycle); + float x = position * kXrange; + + // Quantize the input from floating-point to integer + int8_t x_quantized = x / input->params.scale + input->params.zero_point; + // Place the quantized input in the model's input tensor + input->data.int8[0] = x_quantized; + + // Run inference, and report any error + TfLiteStatus invoke_status = interpreter->Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed on x: %f\n", + static_cast(x)); + return; + } + + // Obtain the quantized output from model's output tensor + int8_t y_quantized = output->data.int8[0]; + // Dequantize the output from integer to floating-point + float y = (y_quantized - output->params.zero_point) * output->params.scale; + + // Output the results. A custom HandleOutput function can be implemented + // for each supported hardware target. + HandleOutput(error_reporter, x, y); + + // Increment the inference_counter, and reset it if we have reached + // the total number per cycle + inference_count += 1; + if (inference_count >= kInferencesPerCycle) + inference_count = 0; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.h new file mode 100644 index 00000000..b276b3e8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/main_functions.h @@ -0,0 +1,37 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ + +// Expose a C friendly interface for main functions. +#ifdef __cplusplus +extern "C" { +#endif + +// Initializes all data needed for the example. The name is important, and needs +// to be setup() for Arduino compatibility. +void setup(); + +// Runs one iteration of data gathering and inference. This should be called +// repeatedly from the application code. The name needs to be loop() for Arduino +// compatibility. +void loop(); + +#ifdef __cplusplus +} +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.cc new file mode 100644 index 00000000..ec48ccd9 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.cc @@ -0,0 +1,238 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Automatically created from a TensorFlow Lite flatbuffer using the command: +// xxd -i model.tflite > model.cc + +// This is a standard TensorFlow Lite model file that has been converted into a +// C data array, so it can be easily compiled into a binary for devices that +// don't have a file system. + +// See train/README.md for a full description of the creation process. + +#include "tensorflow/lite/micro/examples/hello_world/model.h" + +// Keep model aligned to 8 bytes to guarantee aligned 64-bit accesses. +alignas(8) const unsigned char g_model[] = { + 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x14, 0x00, 0x20, 0x00, + 0x1c, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, + 0x2c, 0x03, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0xf7, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, + 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x34, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x76, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, + 0x34, 0x02, 0x00, 0x00, 0xdc, 0x01, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, + 0x6c, 0x01, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xfa, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfd, 0xff, 0xff, + 0x88, 0xfd, 0xff, 0xff, 0x8c, 0xfd, 0xff, 0xff, 0x22, 0xfe, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0xa5, 0x8b, 0xca, + 0x5e, 0x1d, 0xce, 0x42, 0x9d, 0xce, 0x1f, 0xb0, 0xdf, 0x54, 0x2f, 0x81, + 0x3e, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xee, 0xfc, 0x00, 0xec, 0x05, 0x17, 0xef, 0xec, 0xe6, 0xf8, 0x03, 0x01, + 0x00, 0xfa, 0xf8, 0xf5, 0xdc, 0xeb, 0x27, 0x14, 0xf1, 0xde, 0xe2, 0xdb, + 0xf0, 0xde, 0x31, 0x06, 0x02, 0xe6, 0xee, 0xf9, 0x00, 0x16, 0x07, 0xe0, + 0xfe, 0xff, 0xe9, 0x06, 0xe7, 0xef, 0x81, 0x1b, 0x18, 0xea, 0xc9, 0x01, + 0x0f, 0x00, 0xda, 0xf7, 0x0e, 0xec, 0x13, 0x1f, 0x04, 0x13, 0xb4, 0xe6, + 0xfd, 0x06, 0xb9, 0xe0, 0x0d, 0xec, 0xf0, 0xde, 0xeb, 0xf7, 0x05, 0x26, + 0x1a, 0xe4, 0x6f, 0x1a, 0xea, 0x1e, 0x35, 0xdf, 0x1a, 0xf3, 0xf1, 0x19, + 0x0f, 0x03, 0x1b, 0xe1, 0xde, 0x13, 0xf6, 0x19, 0xff, 0xf6, 0x1b, 0x18, + 0xf0, 0x1c, 0xda, 0x1b, 0x1b, 0x20, 0xe5, 0x1a, 0xf5, 0xff, 0x96, 0x0b, + 0x00, 0x01, 0xcd, 0xde, 0x0d, 0xf6, 0x16, 0xe3, 0xed, 0xfc, 0x0e, 0xe9, + 0xfa, 0xeb, 0x5c, 0xfc, 0x1d, 0x02, 0x5b, 0xe2, 0xe1, 0xf5, 0x15, 0xec, + 0xf4, 0x00, 0x13, 0x05, 0xec, 0x0c, 0x1d, 0x14, 0x0e, 0xe7, 0x0b, 0xf4, + 0x19, 0x00, 0xd7, 0x05, 0x27, 0x02, 0x15, 0xea, 0xea, 0x02, 0x9b, 0x00, + 0x0c, 0xfa, 0xe8, 0xea, 0xfd, 0x00, 0x14, 0xfd, 0x0b, 0x02, 0xef, 0xee, + 0x06, 0xee, 0x01, 0x0d, 0x06, 0xe6, 0xf7, 0x11, 0xf7, 0x09, 0xf8, 0xf1, + 0x21, 0xff, 0x0e, 0xf3, 0xec, 0x12, 0x26, 0x1d, 0xf2, 0xe9, 0x28, 0x18, + 0xe0, 0xfb, 0xf3, 0xf4, 0x05, 0x1d, 0x1d, 0xfb, 0xfd, 0x1e, 0xfc, 0x11, + 0xe8, 0x07, 0x09, 0x03, 0x12, 0xf2, 0x36, 0xfb, 0xdc, 0x1c, 0xf9, 0xef, + 0xf3, 0xe7, 0x6f, 0x0c, 0x1d, 0x00, 0x45, 0xfd, 0x0e, 0xf0, 0x0b, 0x19, + 0x1a, 0xfa, 0xe0, 0x19, 0x1f, 0x13, 0x36, 0x1c, 0x12, 0xeb, 0x3b, 0x0c, + 0xb4, 0xcb, 0xe6, 0x13, 0xfa, 0xeb, 0xf1, 0x06, 0x1c, 0xfa, 0x18, 0xe5, + 0xeb, 0xcb, 0x0c, 0xf4, 0x4a, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x75, 0x1c, 0x11, 0xe1, 0x0c, 0x81, 0xa5, 0x42, + 0xfe, 0xd5, 0xd4, 0xb2, 0x61, 0x78, 0x19, 0xdf, 0x66, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x77, 0x0b, 0x00, 0x00, 0x53, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd3, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x72, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x07, 0x00, 0x00, + 0x67, 0xf5, 0xff, 0xff, 0x34, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xb2, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, + 0x2d, 0x06, 0x00, 0x00, 0x71, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x9a, 0x0a, 0x00, 0x00, 0xfe, 0xf7, 0xff, 0xff, 0x0e, 0x05, 0x00, 0x00, + 0xd4, 0x09, 0x00, 0x00, 0x47, 0xfe, 0xff, 0xff, 0xb6, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0xf7, 0xff, 0xff, 0x4b, 0xf9, 0xff, 0xff, + 0x4a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x8c, 0xef, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x4d, 0x4c, 0x49, 0x52, 0x20, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x96, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xba, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0xd0, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, + 0x98, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, + 0x24, 0x01, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xf0, 0xfb, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0xdc, 0xfb, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4a, 0xce, 0x0a, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0x34, 0x84, 0x85, 0x3f, 0x01, 0x00, 0x00, 0x00, 0xc5, 0x02, 0x8f, 0xbf, + 0x1e, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, + 0x61, 0x6c, 0x6c, 0x3a, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xfc, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x6c, 0xfc, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x93, 0xd0, 0xc0, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0xc2, 0x0f, 0xc0, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x74, 0x66, 0x6c, 0x2e, 0x66, 0x75, 0x6c, 0x6c, + 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x31, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0xfd, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0xf4, 0xfc, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xe0, 0xdb, 0x47, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x04, 0x14, 0x47, 0x40, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x74, 0x66, 0x6c, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x50, 0x00, 0x00, 0x00, 0x6c, 0xfd, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfb, 0x4b, 0x0b, 0x3c, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x84, 0x4b, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x63, 0x35, 0x8a, 0xbf, 0x0d, 0x00, 0x00, 0x00, 0x73, 0x74, 0x64, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x32, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x72, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x50, 0x00, 0x00, 0x00, + 0xdc, 0xfd, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x4f, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x47, 0x6d, 0xb3, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x5d, 0x63, 0xcd, 0xbf, 0x0d, 0x00, 0x00, 0x00, + 0x73, 0x74, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xe2, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x50, 0x00, 0x00, 0x00, 0x4c, 0xfe, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xd5, 0x6b, 0x8a, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0xab, 0x49, 0x01, 0x3f, 0x01, 0x00, 0x00, 0x00, 0xfd, 0x56, 0x09, 0xbf, + 0x0c, 0x00, 0x00, 0x00, 0x73, 0x74, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x44, 0xff, 0xff, 0xff, + 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0xb3, 0xd9, 0x38, 0x0c, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x62, 0x69, 0x61, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xaa, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, + 0x9c, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xdd, 0x9b, 0x21, 0x39, 0x0c, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x33, 0x2f, 0x62, 0x69, 0x61, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, 0x13, 0x00, 0x0c, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xf4, 0xd4, 0x51, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6e, 0x73, + 0x65, 0x5f, 0x34, 0x2f, 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1c, 0x00, + 0x18, 0x00, 0x17, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x5d, 0x4f, 0xc9, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x86, 0xc8, 0x40, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0xff, + 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, + 0x0c, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09 +}; +const int g_model_len = 2488; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.h new file mode 100644 index 00000000..ffa87402 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/model.h @@ -0,0 +1,31 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Automatically created from a TensorFlow Lite flatbuffer using the command: +// xxd -i model.tflite > model.cc + +// This is a standard TensorFlow Lite model file that has been converted into a +// C data array, so it can be easily compiled into a binary for devices that +// don't have a file system. + +// See train/README.md for a full description of the creation process. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ + +extern const unsigned char g_model[]; +extern const int g_model_len; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.cc new file mode 100644 index 00000000..e114d4cd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.cc @@ -0,0 +1,25 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/hello_world/output_handler.h" + +void HandleOutput(tflite::ErrorReporter *error_reporter, float x_value, + float y_value) +{ + // Log the current X and Y values + TF_LITE_REPORT_ERROR(error_reporter, "x_value: %f, y_value: %f\n", + static_cast(x_value), + static_cast(y_value)); +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.h new file mode 100644 index 00000000..9bb2be65 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler.h @@ -0,0 +1,26 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Called by the main loop to produce some output based on the x and y values +void HandleOutput(tflite::ErrorReporter *error_reporter, float x_value, + float y_value); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler_test.cc new file mode 100644 index 00000000..755b6af5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/hello_world/output_handler_test.cc @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/hello_world/output_handler.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestCallability) +{ + tflite::MicroErrorReporter micro_error_reporter; + + // This will have external side-effects (like printing to the debug console + // or lighting an LED) that are hard to observe, so the most we can do is + // make sure the call doesn't crash. + HandleOutput(µ_error_reporter, 0, 0); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/Makefile.inc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/Makefile.inc new file mode 100644 index 00000000..e956230c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/Makefile.inc @@ -0,0 +1,84 @@ +ifeq ($(TARGET), sparkfun_edge) + INCLUDES += \ + -I$(APOLLO3_SDK)/$(SF_BSPS_DEST)/common/third_party/lis2dh12/ + + THIRD_PARTY_CC_SRCS += \ + $(APOLLO3_SDK)/$(SF_BSPS_DEST)/common/third_party/lis2dh12/lis2dh12_platform_apollo3.c \ + $(APOLLO3_SDK)/boards_sfe/common/third_party/lis2dh12/lis2dh12_reg.c + + THIRD_PARTY_CC_HDRS += \ + $(APOLLO3_SDK)/boards_sfe/common/third_party/lis2dh12/lis2dh12_platform_apollo3.h \ + $(APOLLO3_SDK)/boards_sfe/common/third_party/lis2dh12/lis2dh12_reg.h +endif + +ACCELEROMETER_HANDLER_TEST_SRCS := \ +tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.cc \ +tensorflow/lite/micro/examples/magic_wand/accelerometer_handler_test.cc + +ACCELEROMETER_HANDLER_TEST_HDRS := \ +tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h + +OUTPUT_HANDLER_TEST_SRCS := \ +tensorflow/lite/micro/examples/magic_wand/output_handler.cc \ +tensorflow/lite/micro/examples/magic_wand/output_handler_test.cc + +OUTPUT_HANDLER_TEST_HDRS := \ +tensorflow/lite/micro/examples/magic_wand/output_handler.h + +GESTURE_PREDICTOR_TEST_SRCS := \ +tensorflow/lite/micro/examples/magic_wand/gesture_predictor.cc \ +tensorflow/lite/micro/examples/magic_wand/gesture_predictor_test.cc + +GESTURE_PREDICTOR_TEST_HDRS := \ +tensorflow/lite/micro/examples/magic_wand/constants.h \ +tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h \ + +magic_wand_TEST_SRCS := \ +tensorflow/lite/micro/examples/magic_wand/magic_wand_test.cc \ +tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.cc \ +tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.cc \ +tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.cc + +magic_wand_TEST_HDRS := \ +tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h \ +tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h \ +tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h + +magic_wand_SRCS := \ +tensorflow/lite/micro/examples/magic_wand/main.cc \ +tensorflow/lite/micro/examples/magic_wand/main_functions.cc \ +tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.cc \ +tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.cc \ +tensorflow/lite/micro/examples/magic_wand/gesture_predictor.cc \ +tensorflow/lite/micro/examples/magic_wand/output_handler.cc + +magic_wand_HDRS := \ +tensorflow/lite/micro/examples/magic_wand/main_functions.h \ +tensorflow/lite/micro/examples/magic_wand/constants.h \ +tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h \ +tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h \ +tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h \ +tensorflow/lite/micro/examples/magic_wand/output_handler.h + +#Find any platform - specific rules for this example. +include $(wildcard tensorflow/lite/micro/examples/magic_wand/*/Makefile.inc) + +# Tests the accelerometer handler +$(eval $(call microlite_test,gesture_accelerometer_handler_test,\ +$(ACCELEROMETER_HANDLER_TEST_SRCS),$(ACCELEROMETER_HANDLER_TEST_HDRS))) + +# Tests the output handler +$(eval $(call microlite_test,gesture_output_handler_test,\ +$(OUTPUT_HANDLER_TEST_SRCS),$(OUTPUT_HANDLER_TEST_HDRS))) + +# Tests the gesture predictor +$(eval $(call microlite_test,gesture_predictor_test,\ +$(GESTURE_PREDICTOR_TEST_SRCS),$(GESTURE_PREDICTOR_TEST_HDRS))) + +# Tests loading and running the gesture recognition model +$(eval $(call microlite_test,magic_wand_test,\ +$(magic_wand_TEST_SRCS),$(magic_wand_TEST_HDRS))) + +# Builds a standalone binary +$(eval $(call microlite_test,magic_wand,\ +$(magic_wand_SRCS),$(magic_wand_HDRS))) diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/README.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/README.md new file mode 100644 index 00000000..d9f0c754 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/README.md @@ -0,0 +1,493 @@ +# Magic wand example + +This example shows how you can use TensorFlow Lite to run a 20 kilobyte neural +network model to recognize gestures with an accelerometer. It's designed to run +on systems with very small amounts of memory, such as microcontrollers. + +The example application reads data from the accelerometer on an Arduino Nano 33 +BLE Sense or SparkFun Edge board and indicates when it has detected a gesture, +then outputs the gesture to the serial port. + +## Table of contents + +- [Getting started](#getting-started) +- [Deploy to Arduino](#deploy-to-arduino) +- [Deploy to Himax WE1 EVB](#deploy-to-himax-we1-evb) +- [Deploy to SparkFun Edge](#deploy-to-sparkfun-edge) +- [Run the tests on a development machine](#run-the-tests-on-a-development-machine) +- [Train your own model](#train-your-own-model) + +## Deploy to Arduino + +The following instructions will help you build and deploy this sample +to [Arduino](https://www.arduino.cc/) devices. + +The sample has been tested with the following devices: + +- [Arduino Nano 33 BLE Sense](https://store.arduino.cc/usa/nano-33-ble-sense-with-headers) + +### Install the Arduino_TensorFlowLite library + +This example application is included as part of the official TensorFlow Lite +Arduino library. To install it, open the Arduino library manager in +`Tools -> Manage Libraries...` and search for `Arduino_TensorFlowLite`. + +### Install and patch the accelerometer driver + +This example depends on the [Arduino_LSM9DS1](https://github.com/arduino-libraries/Arduino_LSM9DS1) +library to communicate with the device's accelerometer. However, the library +must be patched in order to enable the accelerometer's FIFO buffer. + +Follow these steps to install and patch the driver: + +#### Install the correct version + +In the Arduino IDE, go to `Tools -> Manage Libraries...` and search for +`Arduino_LSM9DS1`. **Install version 1.0.0 of the driver** to ensure the +following instructions work. + +#### Patch the driver + +The driver will be installed to your `Arduino/libraries` directory, in the +subdirectory `Arduino_LSM9DS1`. + +Open the following file: + +``` +Arduino_LSM9DS1/src/LSM9DS1.cpp +``` + +Go to the function named `LSM9DS1Class::begin()`. Insert the following lines at +the end of the function, immediately before the `return 1` statement: + +```cpp +// Enable FIFO (see docs https://www.st.com/resource/en/datasheet/DM00103319.pdf) +writeRegister(LSM9DS1_ADDRESS, 0x23, 0x02); +// Set continuous mode +writeRegister(LSM9DS1_ADDRESS, 0x2E, 0xC0); +``` + +Next, go to the function named `LSM9DS1Class::accelerationAvailable()`. You will +see the following lines: + +```cpp +if (readRegister(LSM9DS1_ADDRESS, LSM9DS1_STATUS_REG) & 0x01) { + return 1; +} +``` + +Comment out those lines and replace them with the following: + +```cpp +// Read FIFO_SRC. If any of the rightmost 8 bits have a value, there is data +if (readRegister(LSM9DS1_ADDRESS, 0x2F) & 63) { + return 1; +} +``` + +Next, save the file. Patching is now complete. + +### Load and run the example + +Once the library has been added, go to `File -> Examples`. You should see an +example near the bottom of the list named `TensorFlowLite`. Select +it and click `magic_wand` to load the example. + +Use the Arduino Desktop IDE to build and upload the example. Once it is running, +you should see the built-in LED on your device flashing. + +Open the Arduino Serial Monitor (`Tools -> Serial Monitor`). + +You will see the following message: + +``` +Magic starts! +``` + +Hold the Arduino with its components facing upwards and the USB cable to your +left. Perform the gestures "WING", "RING"(clockwise), and "SLOPE", and you +should see the corresponding output: + +``` +WING: +* * * + * * * * + * * * * + * * * * + * * * * + * * +``` + +``` +RING: + * + * * + * * + * * + * * + * * + * +``` + +``` +SLOPE: + * + * + * + * + * + * + * + * * * * * * * * +``` + +## Deploy to Himax WE1 EVB + +The following instructions will help you build and deploy this example to +[HIMAX WE1 EVB](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_board_brief) +board. To understand more about using this board, please check +[HIMAX WE1 EVB user guide](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide). + +### Initial Setup + +To use the HIMAX WE1 EVB, please make sure following software are installed: + +#### MetaWare Development Toolkit + +See +[Install the Synopsys DesignWare ARC MetaWare Development Toolkit](/tensorflow/lite/micro/tools/make/targets/arc/README.md#install-the-synopsys-designware-arc-metaware-development-toolkit) +section for instructions on toolchain installation. + +#### Make Tool version + +A `'make'` tool is required for deploying Tensorflow Lite Micro applications on +HIMAX WE1 EVB, See +[Check make tool version](/tensorflow/lite/micro/tools/make/targets/arc/README.md#make-tool) +section for proper environment. + +#### Serial Terminal Emulation Application + +There are 2 main purposes for HIMAX WE1 EVB Debug UART port + +- print application output +- burn application to flash by using xmodem send application binary + +You can use any terminal emulation program (like [PuTTY](https://www.putty.org/) +or [minicom](https://linux.die.net/man/1/minicom)). + +### Generate Example Project + +The example project for HIMAX WE1 EVB platform can be generated with the +following command: + +Download related third party data + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=himax_we1_evb third_party_downloads +``` + +Generate magic wand project + +``` +make -f tensorflow/lite/micro/tools/make/Makefile generate_magic_wand_make_project TARGET=himax_we1_evb +``` + +### Build and Burn Example + +Following the Steps to run magic wand example at HIMAX WE1 EVB platform. + +1. Go to the generated example project directory. + + ``` + cd tensorflow/lite/micro/tools/make/gen/himax_we1_evb_arc/prj/magic_wand/make + ``` + +2. Build the example using + + ``` + make app + ``` + +3. After example build finish, copy ELF file and map file to image generate + tool directory. \ + image generate tool directory located at + `'tensorflow/lite/micro/tools/make/downloads/himax_we1_sdk/image_gen_linux_v3/'` + + ``` + cp magic_wand.elf himax_we1_evb.map ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + +4. Go to flash image generate tool directory. + + ``` + cd ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + + make sure this tool directory is in $PATH. You can permanently set it to + PATH by + + ``` + export PATH=$PATH:$(pwd) + ``` + +5. run image generate tool, generate flash image file. + + * Before running image generate tool, by typing `sudo chmod +x image_gen` + and `sudo chmod +x sign_tool` to make sure it is executable. + + ``` + image_gen -e magic_wand.elf -m himax_we1_evb.map -o out.img + ``` + +6. Download flash image file to HIMAX WE1 EVB by UART: + + * more detail about download image through UART can be found at + [HIMAX WE1 EVB update Flash image](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide#flash-image-update) + +After these steps, press reset button on the HIMAX WE1 EVB, you will see +application output in the serial terminal. Perform following gestures +`'Wing'`,`'Ring'`,`'Slope'` and you can see the output in serial terminal. + +``` +WING: +* * * + * * * * + * * * * + * * * * + * * * * + * * +``` + +``` +RING: + * + * * + * * + * * + * * + * * + * +``` + +``` +SLOPE: + * + * + * + * + * + * + * + * * * * * * * * +``` + +## Deploy to SparkFun Edge + +The following instructions will help you build and deploy this sample on the +[SparkFun Edge development board](https://sparkfun.com/products/15170). + +If you're new to using this board, we recommend walking through the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab to get an understanding of the workflow. + +### Compile the binary + +Run the following command to build a binary for SparkFun Edge. + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge magic_wand_bin +``` + +The binary will be created in the following location: + +``` +tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/magic_wand.bin +``` + +### Sign the binary + +The binary must be signed with cryptographic keys to be deployed to the device. +We'll now run some commands that will sign our binary so it can be flashed to +the SparkFun Edge. The scripts we are using come from the Ambiq SDK, which is +downloaded when the `Makefile` is run. + +Enter the following command to set up some dummy cryptographic keys we can use +for development: + +``` +cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py \ +tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py +``` + +Next, run the following command to create a signed binary: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \ +--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/magic_wand.bin \ +--load-address 0xC000 \ +--magic-num 0xCB \ +-o main_nonsecure_ota \ +--version 0x0 +``` + +This will create the file `main_nonsecure_ota.bin`. We'll now run another +command to create a final version of the file that can be used to flash our +device with the bootloader script we will use in the next step: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ +--load-address 0x20000 \ +--bin main_nonsecure_ota.bin \ +-i 6 \ +-o main_nonsecure_wire \ +--options 0x1 +``` + +You should now have a file called `main_nonsecure_wire.bin` in the directory +where you ran the commands. This is the file we'll be flashing to the device. + +### Flash the binary + +Next, attach the board to your computer via a USB-to-serial adapter. + +**Note:** If you're using the +[SparkFun Serial Basic Breakout](https://www.sparkfun.com/products/15096), you +should +[install the latest drivers](https://learn.sparkfun.com/tutorials/sparkfun-serial-basic-ch340c-hookup-guide#drivers-if-you-need-them) +before you continue. + +Once connected, assign the USB device name to an environment variable: + +``` +export DEVICENAME=put your device name here +``` + +Set another variable with the baud rate: + +``` +export BAUD_RATE=921600 +``` + +Now, hold the button marked `14` on the device. While still holding the button, +hit the button marked `RST`. Continue holding the button marked `14` while +running the following command: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py \ +-b ${BAUD_RATE} ${DEVICENAME} \ +-r 1 \ +-f main_nonsecure_wire.bin \ +-i 6 +``` + +You should see a long stream of output as the binary is flashed to the device. +Once you see the following lines, flashing is complete: + +``` +Sending Reset Command. +Done. +``` + +If you don't see these lines, flashing may have failed. Try running through the +steps in [Flash the binary](#flash-the-binary) again (you can skip over setting +the environment variables). If you continue to run into problems, follow the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab, which includes more comprehensive instructions for the flashing +process. + +The binary should now be deployed to the device. Hit the button marked `RST` to +reboot the board. + +Do the three magic gestures and you will see the corresponding LED light on! Red +for "Wing", blue for "Ring" and green for "Slope". + +Debug information is logged by the board while the program is running. To view +it, establish a serial connection to the board using a baud rate of `115200`. On +OSX and Linux, the following command should work: + +``` +screen ${DEVICENAME} 115200 +``` + +You will see the following message: + +``` +Magic starts! +``` + +Keep the chip face up, do magic gestures "WING", "RING"(clockwise), and "SLOPE" +with your wand, and you will see the corresponding output like this! + +``` +WING: +* * * + * * * * + * * * * + * * * * + * * * * + * * +``` + +``` +RING: + * + * * + * * + * * + * * + * * + * +``` + +``` +SLOPE: + * + * + * + * + * + * + * + * * * * * * * * +``` + +To stop viewing the debug output with `screen`, hit `Ctrl+A`, immediately +followed by the `K` key, then hit the `Y` key. + +## Run the tests on a development machine + +To compile and test this example on a desktop Linux or macOS machine, first +clone the TensorFlow repository from GitHub to a convenient place: + +```bash +git clone --depth 1 https://github.com/tensorflow/tensorflow.git +``` + +Next, put this folder under the +tensorflow/tensorflow/lite/micro/examples/ folder, then `cd` into +the source directory from a terminal and run the following command: + +```bash +make -f tensorflow/lite/micro/tools/make/Makefile test_magic_wand_test +``` + +This will take a few minutes, and downloads frameworks the code uses like +[CMSIS](https://developer.arm.com/embedded/cmsis) and +[flatbuffers](https://google.github.io/flatbuffers/). Once that process has +finished, you should see a series of files get compiled, followed by some +logging output from a test, which should conclude with `~~~ALL TESTS PASSED~~~`. + +If you see this, it means that a small program has been built and run that loads +the trained TensorFlow model, runs some example inputs through it, and got the +expected outputs. + +To understand how TensorFlow Lite does this, you can look at the source in +[hello_world_test.cc](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/hello_world/hello_world_test.cc). +It's a fairly small amount of code that creates an interpreter, gets a handle to +a model that's been compiled into the program, and then invokes the interpreter +with the model and sample inputs. + +## Train your own model + +To train your own model, or create a new model for a new set of gestures, +follow the instructions in [magic_wand/train/README.md](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/magic_wand/train/README.md). diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.cc new file mode 100644 index 00000000..b53d10d4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.cc @@ -0,0 +1,42 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h" + +int begin_index = 0; + +TfLiteStatus SetupAccelerometer(tflite::ErrorReporter *error_reporter) +{ + return kTfLiteOk; +} + +bool ReadAccelerometer(tflite::ErrorReporter *error_reporter, float *input, + int length) +{ + begin_index += 3; + // Reset begin_index to simulate behavior of loop buffer + if (begin_index >= 600) + begin_index = 0; + // Only return true after the function was called 100 times, simulating the + // desired behavior of a real implementation (which does not return data until + // a sufficient amount is available) + if (begin_index > 300) { + for (int i = 0; i < length; ++i) + input[i] = 0; + return true; + } else { + return false; + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h new file mode 100644 index 00000000..daa67f67 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h @@ -0,0 +1,29 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_ACCELEROMETER_HANDLER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_ACCELEROMETER_HANDLER_H_ + +#define kChannelNumber 3 + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +extern int begin_index; +extern TfLiteStatus SetupAccelerometer(tflite::ErrorReporter *error_reporter); +extern bool ReadAccelerometer(tflite::ErrorReporter *error_reporter, + float *input, int length); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_ACCELEROMETER_HANDLER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler_test.cc new file mode 100644 index 00000000..333266a8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/accelerometer_handler_test.cc @@ -0,0 +1,49 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestSetup) +{ + tflite::MicroErrorReporter micro_error_reporter; + TfLiteStatus setup_status = SetupAccelerometer(µ_error_reporter); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, setup_status); +} + +TF_LITE_MICRO_TEST(TestAccelerometer) +{ + float input[384] = { 0.0 }; + tflite::MicroErrorReporter micro_error_reporter; + // Test that the function returns false before insufficient data is available + bool inference_flag = ReadAccelerometer(µ_error_reporter, input, 384); + TF_LITE_MICRO_EXPECT_EQ(inference_flag, false); + + // Test that the function returns true once sufficient data is available to + // fill the model's input buffer (128 sets of values) + for (int i = 1; i <= 128; i++) { + inference_flag = ReadAccelerometer(µ_error_reporter, input, 384); + } + TF_LITE_MICRO_EXPECT_EQ(inference_flag, true); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/constants.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/constants.h new file mode 100644 index 00000000..4c64a0db --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/constants.h @@ -0,0 +1,38 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_CONSTANTS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_CONSTANTS_H_ + +// The expected accelerometer data sample frequency +const float kTargetHz = 25; + +// What gestures are supported. +constexpr int kGestureCount = 4; +constexpr int kWingGesture = 0; +constexpr int kRingGesture = 1; +constexpr int kSlopeGesture = 2; +constexpr int kNoGesture = 3; + +// These control the sensitivity of the detection algorithm. If you're seeing +// too many false positives or not enough true positives, you can try tweaking +// these thresholds. Often, increasing the size of the training set will give +// more robust results though, so consider retraining if you are seeing poor +// predictions. +constexpr float kDetectionThreshold = 0.8f; +constexpr int kPredictionHistoryLength = 5; +constexpr int kPredictionSuppressionDuration = 25; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_CONSTANTS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.cc new file mode 100644 index 00000000..d0dbd6f3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.cc @@ -0,0 +1,73 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h" + +#include "tensorflow/lite/micro/examples/magic_wand/constants.h" + +namespace { +// State for the averaging algorithm we're using. +float prediction_history[kGestureCount][kPredictionHistoryLength] = {}; +int prediction_history_index = 0; +int prediction_suppression_count = 0; +} // namespace + +// Return the result of the last prediction +// 0: wing("W"), 1: ring("O"), 2: slope("angle"), 3: unknown +int PredictGesture(float *output) +{ + // Record the latest predictions in our rolling history buffer. + for (int i = 0; i < kGestureCount; ++i) { + prediction_history[i][prediction_history_index] = output[i]; + } + // Figure out which slot to put the next predictions into. + ++prediction_history_index; + if (prediction_history_index >= kPredictionHistoryLength) { + prediction_history_index = 0; + } + + // Average the last n predictions for each gesture, and find which has the + // highest score. + int max_predict_index = -1; + float max_predict_score = 0.0f; + for (int i = 0; i < kGestureCount; i++) { + float prediction_sum = 0.0f; + for (int j = 0; j < kPredictionHistoryLength; ++j) { + prediction_sum += prediction_history[i][j]; + } + const float prediction_average = prediction_sum / kPredictionHistoryLength; + if ((max_predict_index == -1) || (prediction_average > max_predict_score)) { + max_predict_index = i; + max_predict_score = prediction_average; + } + } + + // If there's been a recent prediction, don't trigger a new one too soon. + if (prediction_suppression_count > 0) { + --prediction_suppression_count; + } + // If we're predicting no gesture, or the average score is too low, or there's + // been a gesture recognised too recently, return no gesture. + if ((max_predict_index == kNoGesture) || + (max_predict_score < kDetectionThreshold) || + (prediction_suppression_count > 0)) { + return kNoGesture; + } else { + // Reset the suppression counter so we don't come up with another prediction + // too soon. + prediction_suppression_count = kPredictionSuppressionDuration; + return max_predict_index; + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h new file mode 100644 index 00000000..6ff80a12 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h @@ -0,0 +1,21 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_GESTURE_PREDICTOR_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_GESTURE_PREDICTOR_H_ + +extern int PredictGesture(float *output); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_GESTURE_PREDICTOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor_test.cc new file mode 100644 index 00000000..e61a8e3b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/gesture_predictor_test.cc @@ -0,0 +1,69 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h" + +#include "tensorflow/lite/micro/examples/magic_wand/constants.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SuccessfulPrediction) +{ + // Use the threshold from the 0th gesture. + float probabilities[kGestureCount] = { kDetectionThreshold, 0.0, 0.0, 0.0 }; + int prediction; + // Loop just too few times to trigger a prediction. + for (int i = 0; i < kPredictionHistoryLength - 1; i++) { + prediction = PredictGesture(probabilities); + TF_LITE_MICRO_EXPECT_EQ(prediction, kNoGesture); + } + // Call once more, triggering a prediction + // for category 0. + prediction = PredictGesture(probabilities); + TF_LITE_MICRO_EXPECT_EQ(prediction, 0); +} + +TF_LITE_MICRO_TEST(FailPartWayThere) +{ + // Use the threshold from the 0th gesture. + float probabilities[kGestureCount] = { kDetectionThreshold, 0.0, 0.0, 0.0 }; + int prediction; + // Loop just too few times to trigger a prediction. + for (int i = 0; i <= kPredictionHistoryLength - 1; i++) { + prediction = PredictGesture(probabilities); + TF_LITE_MICRO_EXPECT_EQ(prediction, kNoGesture); + } + // Call with a different prediction, triggering a failure. + probabilities[0] = 0.0; + probabilities[2] = 1.0; + prediction = PredictGesture(probabilities); + TF_LITE_MICRO_EXPECT_EQ(prediction, kNoGesture); +} + +TF_LITE_MICRO_TEST(InsufficientProbability) +{ + // Just below the detection threshold. + float probabilities[kGestureCount] = { kDetectionThreshold - 0.1f, 0.0, 0.0, + 0.0 }; + int prediction; + // Loop the exact right number of times + for (int i = 0; i <= kPredictionHistoryLength; i++) { + prediction = PredictGesture(probabilities); + TF_LITE_MICRO_EXPECT_EQ(prediction, kNoGesture); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.cc new file mode 100644 index 00000000..e314ab8b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.cc @@ -0,0 +1,1660 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Automatically created from a TensorFlow Lite flatbuffer using the command: +// xxd -i magic_wand_model.tflite > magic_wand_model_data.cc +// See the README for a full description of the creation process. + +#include "tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h" + +// Keep model aligned to 8 bytes to guarantee aligned 64-bit accesses. +alignas(8) const unsigned char g_magic_wand_model_data[] = { + 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x12, 0x00, + 0x1c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x24, 0x4c, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x14, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x54, 0x4f, 0x43, 0x4f, 0x20, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, 0x12, 0x00, 0x00, 0x00, + 0xb0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x6e, 0xb6, 0xff, 0xff, 0x68, 0x00, 0x00, 0x00, 0x30, 0xb6, 0xff, 0xff, + 0x34, 0xb6, 0xff, 0xff, 0x7e, 0xb6, 0xff, 0xff, 0xf0, 0x01, 0x00, 0x00, + 0x86, 0xb6, 0xff, 0xff, 0xc8, 0x03, 0x00, 0x00, 0x48, 0xb6, 0xff, 0xff, + 0x4c, 0xb6, 0xff, 0xff, 0x50, 0xb6, 0xff, 0xff, 0x54, 0xb6, 0xff, 0xff, + 0x58, 0xb6, 0xff, 0xff, 0x5c, 0xb6, 0xff, 0xff, 0xa6, 0xb6, 0xff, 0xff, + 0xc0, 0x0d, 0x00, 0x00, 0xae, 0xb6, 0xff, 0xff, 0x00, 0x46, 0x00, 0x00, + 0xb6, 0xb6, 0xff, 0xff, 0x60, 0x46, 0x00, 0x00, 0xbe, 0xb6, 0xff, 0xff, + 0xe0, 0x46, 0x00, 0x00, 0xc6, 0xb6, 0xff, 0xff, 0x48, 0x47, 0x00, 0x00, + 0xce, 0xb6, 0xff, 0xff, 0x98, 0x48, 0x00, 0x00, 0x90, 0xb6, 0xff, 0xff, + 0x05, 0x00, 0x00, 0x00, 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, + 0x54, 0xf4, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, + 0x0c, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x88, 0x48, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x9c, 0x0c, 0x00, 0x00, 0x14, 0x0b, 0x00, 0x00, + 0xd4, 0x00, 0x00, 0x00, 0x24, 0x45, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, + 0xa4, 0x02, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x9c, 0x0b, 0x00, 0x00, + 0xb0, 0x0c, 0x00, 0x00, 0xc4, 0x47, 0x00, 0x00, 0x50, 0x0b, 0x00, 0x00, + 0x2c, 0x0c, 0x00, 0x00, 0x48, 0x46, 0x00, 0x00, 0xec, 0x45, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xc8, 0x0b, 0x00, 0x00, 0x66, 0xb8, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x69, + 0x6e, 0x67, 0x32, 0x64, 0x2f, 0x4d, 0x61, 0x78, 0x50, 0x6f, 0x6f, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x88, 0xb7, 0xff, 0xff, 0xba, 0xb8, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x52, 0x65, + 0x6c, 0x75, 0x00, 0x00, 0xd0, 0xb7, 0xff, 0xff, 0x02, 0xb9, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x27, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x43, 0x6f, + 0x6e, 0x76, 0x32, 0x44, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x00, 0x28, 0xb8, 0xff, 0xff, + 0x80, 0x01, 0x00, 0x00, 0x1c, 0x6a, 0xf6, 0xbd, 0xaa, 0x16, 0xfd, 0x3c, + 0xf6, 0xd9, 0x20, 0x3e, 0x64, 0xf8, 0xdd, 0x3d, 0x07, 0xc0, 0x82, 0xbe, + 0x9e, 0xa3, 0x38, 0xbd, 0x13, 0x41, 0xa1, 0x3d, 0xb0, 0x81, 0x90, 0xbd, + 0xc7, 0xdd, 0xbc, 0xbb, 0x87, 0x9c, 0x24, 0xbe, 0x72, 0x08, 0x6a, 0xbd, + 0x10, 0x1b, 0x61, 0x3e, 0x79, 0x49, 0x18, 0xbe, 0xda, 0x09, 0x88, 0xbe, + 0x2d, 0x70, 0x4d, 0x3d, 0x5c, 0x4a, 0x9e, 0xbd, 0x0f, 0xf1, 0x46, 0x3e, + 0x1c, 0xbd, 0x02, 0xbf, 0x56, 0xbc, 0x07, 0x3e, 0x63, 0x92, 0x39, 0xbe, + 0x4e, 0xde, 0x84, 0x3e, 0x64, 0x38, 0x88, 0xbd, 0xa0, 0x32, 0xc3, 0xbd, + 0x0f, 0x94, 0xb7, 0xbe, 0xd6, 0x11, 0x27, 0xbc, 0xcc, 0x7e, 0xf3, 0x3d, + 0xf3, 0x4d, 0xaa, 0x3d, 0xbc, 0x8a, 0x28, 0x3e, 0xa2, 0xb5, 0xda, 0xbd, + 0x92, 0x1a, 0xb6, 0xbd, 0x9a, 0x49, 0xb1, 0x3d, 0xfc, 0x93, 0x1c, 0x3d, + 0x74, 0xa1, 0xa1, 0xbd, 0xc7, 0x48, 0x1d, 0xbe, 0x3a, 0x53, 0xb2, 0x3b, + 0x92, 0x51, 0xa5, 0xbd, 0x6a, 0xc4, 0x3c, 0xbd, 0xdb, 0x61, 0x6d, 0xbd, + 0x78, 0x9f, 0x03, 0xbe, 0x40, 0x1f, 0x30, 0xbd, 0x17, 0xde, 0xad, 0x3d, + 0xd7, 0xee, 0x74, 0xbd, 0xb6, 0x5c, 0xc2, 0x3d, 0x1c, 0x89, 0x65, 0xbe, + 0xfd, 0xc4, 0x48, 0x3e, 0xb2, 0x29, 0x13, 0x3d, 0xcc, 0x56, 0x13, 0x3d, + 0xf8, 0xce, 0x1b, 0xbc, 0xb5, 0x4b, 0xe8, 0xbc, 0x48, 0x05, 0x5c, 0xbe, + 0xaf, 0xfa, 0x0d, 0x3e, 0x74, 0x84, 0xa4, 0x3d, 0x4c, 0x84, 0x04, 0x3e, + 0x09, 0x7a, 0xba, 0x3c, 0xb3, 0xa6, 0x07, 0x3e, 0x7d, 0xe5, 0xe5, 0x3d, + 0x7e, 0xb9, 0xa5, 0x3c, 0x4e, 0x70, 0x49, 0x3e, 0x39, 0xfe, 0x12, 0xbe, + 0xfa, 0x8b, 0x01, 0xbe, 0xb9, 0x8e, 0xe6, 0xbc, 0xc8, 0x2f, 0xb3, 0xbd, + 0x1b, 0x2b, 0x9e, 0xbd, 0xe7, 0x7f, 0x0e, 0x3d, 0x3e, 0xa3, 0x2a, 0x3d, + 0xa1, 0x73, 0x31, 0x3d, 0xc8, 0xc7, 0x03, 0xbd, 0x07, 0x71, 0xaf, 0xbd, + 0xb2, 0x6b, 0x2b, 0xbe, 0x06, 0xc2, 0x1f, 0xbe, 0x3b, 0xbf, 0x30, 0xbe, + 0x7e, 0x51, 0x22, 0x3e, 0x5a, 0xa7, 0x92, 0x3d, 0xb8, 0x60, 0x35, 0xbe, + 0xa7, 0xdf, 0x8f, 0x3d, 0xbc, 0xfc, 0x42, 0x3e, 0x42, 0x86, 0x7d, 0xbc, + 0x3a, 0xd0, 0xd8, 0x3c, 0xea, 0x45, 0x40, 0xbc, 0x04, 0xd3, 0x9d, 0xb7, + 0xe3, 0xdf, 0xae, 0xbd, 0x80, 0x5e, 0x59, 0xbe, 0x88, 0x15, 0xc0, 0xbd, + 0xea, 0x86, 0xaa, 0xbd, 0x3b, 0x4a, 0x64, 0x3d, 0x89, 0x25, 0x42, 0xbe, + 0xc2, 0x29, 0x93, 0xbe, 0x62, 0x85, 0x00, 0x3e, 0xf1, 0x0e, 0xda, 0xbd, + 0x48, 0x09, 0xb8, 0xbe, 0xad, 0xe2, 0x4d, 0xbe, 0x69, 0x26, 0x99, 0xbe, + 0x86, 0x3c, 0xcd, 0xbe, 0x05, 0xe6, 0x4e, 0xbd, 0xdb, 0x8f, 0xfb, 0x3d, + 0xc6, 0xf5, 0x97, 0x3e, 0xde, 0xba, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x43, 0x6f, 0x6e, 0x76, + 0x32, 0x44, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x00, 0x00, 0x00, 0x08, 0xba, 0xff, 0xff, + 0x00, 0x08, 0x00, 0x00, 0x40, 0x7a, 0x10, 0xbf, 0x9b, 0xf1, 0xcc, 0xbe, + 0x78, 0x88, 0x1d, 0xbf, 0xc2, 0xb7, 0x09, 0xbf, 0xbd, 0xd6, 0xaf, 0xbe, + 0xf5, 0x29, 0xed, 0xbe, 0xad, 0x18, 0x70, 0xbe, 0x3d, 0x91, 0x40, 0x3b, + 0x2f, 0xcf, 0x55, 0xbe, 0xc6, 0x0b, 0xed, 0x3e, 0xbe, 0x7a, 0x80, 0xbe, + 0x3c, 0x3c, 0xb1, 0x3a, 0xab, 0xea, 0xa6, 0x3d, 0x88, 0x57, 0x55, 0xbe, + 0x0c, 0x62, 0xdc, 0xbe, 0x07, 0x6b, 0xbe, 0x3e, 0x9e, 0x0d, 0x28, 0x3d, + 0xd9, 0xd2, 0xb1, 0x3d, 0x4c, 0x45, 0xbd, 0xbd, 0x3c, 0xe0, 0x1f, 0x3d, + 0x76, 0xb5, 0x48, 0xbd, 0x2b, 0xe8, 0x3a, 0xbe, 0xd3, 0x21, 0x57, 0xbe, + 0xdc, 0x21, 0x70, 0x3e, 0x00, 0x71, 0xec, 0x3d, 0x9c, 0xeb, 0x61, 0x3d, + 0x0d, 0x8a, 0x9c, 0x3d, 0x2a, 0x35, 0x03, 0x3d, 0x1b, 0x1c, 0x28, 0x3b, + 0xa6, 0xf9, 0xa9, 0xbd, 0x20, 0xfb, 0x2f, 0xbe, 0x8c, 0xcb, 0x04, 0x3d, + 0x43, 0x62, 0x64, 0x3d, 0xf8, 0x65, 0xd6, 0x3d, 0xf3, 0xbe, 0x3a, 0xbd, + 0xaf, 0x2b, 0x53, 0x3d, 0x99, 0x58, 0xf8, 0xbd, 0x3a, 0xbe, 0x43, 0xbd, + 0xd0, 0xe7, 0xc0, 0xbc, 0xa4, 0x8d, 0xf3, 0x3d, 0xa2, 0xd7, 0x9c, 0xbc, + 0x87, 0x1b, 0xb0, 0x3e, 0x18, 0x20, 0x88, 0xbd, 0xee, 0x9e, 0xc5, 0x3e, + 0xc1, 0x35, 0xaf, 0x3c, 0xc0, 0x97, 0x39, 0xbd, 0xa5, 0x6f, 0x04, 0xbd, + 0x7b, 0x03, 0x1c, 0xbe, 0x0f, 0x75, 0xbb, 0xbd, 0xdf, 0x1b, 0x54, 0xbd, + 0xfb, 0xbf, 0xcc, 0xbd, 0x1b, 0x01, 0x10, 0xbd, 0x20, 0x67, 0xb4, 0xbc, + 0xdf, 0xa6, 0x40, 0x3c, 0x74, 0xb4, 0x28, 0x3d, 0x65, 0xe7, 0xc3, 0xbd, + 0x8d, 0x38, 0x91, 0xbd, 0x8f, 0xba, 0x45, 0xbc, 0x69, 0xc7, 0x49, 0xbc, + 0xa3, 0xcb, 0xf8, 0x3c, 0x69, 0xed, 0x2d, 0x3e, 0x0d, 0xf4, 0xc6, 0xbc, + 0xd6, 0xe7, 0xfe, 0xbd, 0xfa, 0xa0, 0x86, 0xbd, 0x30, 0x83, 0xf0, 0xbd, + 0xf5, 0xb9, 0xd1, 0xbd, 0x1c, 0x39, 0x90, 0xbe, 0x74, 0x62, 0xd8, 0xbd, + 0x13, 0x28, 0x07, 0xbe, 0xbf, 0xbd, 0xbf, 0xbd, 0x15, 0xcf, 0xa8, 0xbb, + 0x9c, 0x1a, 0x8f, 0xbd, 0x91, 0x23, 0x93, 0x3d, 0x79, 0x63, 0xc4, 0xbd, + 0xec, 0xdd, 0x72, 0xbe, 0xd2, 0xd8, 0xac, 0xbe, 0xbf, 0x1e, 0x21, 0xbe, + 0xae, 0xab, 0x20, 0xbd, 0x8f, 0xe9, 0x90, 0x3d, 0xbb, 0x47, 0xdd, 0x3d, + 0xb1, 0x93, 0x37, 0xbd, 0xeb, 0xcf, 0x45, 0xbc, 0x33, 0x8f, 0x15, 0xbe, + 0xeb, 0x19, 0x9f, 0xbe, 0x66, 0x21, 0xe3, 0xbd, 0x53, 0x82, 0x60, 0x3c, + 0x11, 0xdc, 0xf1, 0xbc, 0x0c, 0x01, 0x1e, 0x3d, 0xdb, 0xd5, 0x1d, 0x3f, + 0x58, 0xa3, 0x61, 0x3d, 0x0a, 0x2b, 0x16, 0xbe, 0x01, 0x9d, 0x50, 0xbe, + 0xac, 0xac, 0x63, 0x3e, 0x76, 0xdb, 0x8a, 0xbc, 0x57, 0xec, 0x8f, 0xbc, + 0xad, 0x20, 0xd6, 0x3d, 0xc2, 0x63, 0x89, 0x3d, 0xc3, 0x1e, 0xe9, 0x3e, + 0xa8, 0x41, 0x9e, 0xbd, 0xac, 0x2c, 0x2b, 0xbe, 0x98, 0x73, 0xbf, 0x3d, + 0x7a, 0x22, 0x54, 0xbd, 0x44, 0xaf, 0x2c, 0xbe, 0x05, 0x45, 0xd9, 0xbc, + 0x74, 0xaa, 0x20, 0x3e, 0x6e, 0x1e, 0x95, 0x3e, 0x54, 0x20, 0x12, 0xbc, + 0xbe, 0x20, 0xcf, 0x3d, 0xa6, 0x02, 0x28, 0xbe, 0xd1, 0xfe, 0xe8, 0xbd, + 0x1f, 0x2a, 0x83, 0xbe, 0x33, 0x44, 0xf3, 0x3d, 0xff, 0x48, 0xda, 0xbd, + 0x8d, 0x1e, 0x79, 0x3e, 0xdb, 0xee, 0xb2, 0x3d, 0xdb, 0xde, 0x5b, 0xbe, + 0x55, 0x57, 0x49, 0xbe, 0x62, 0x4b, 0x29, 0xbf, 0x93, 0xbf, 0x23, 0xbf, + 0xea, 0xa3, 0x71, 0x3d, 0xa5, 0x50, 0x00, 0xbe, 0xb6, 0xd1, 0xc0, 0xbf, + 0x1d, 0x22, 0x7d, 0xbd, 0x00, 0x09, 0x81, 0x3d, 0xde, 0x28, 0x75, 0xbe, + 0x03, 0x1b, 0x2e, 0xbf, 0x3c, 0x3a, 0x3b, 0xbf, 0x52, 0x1a, 0xe6, 0xbd, + 0x9d, 0xe9, 0xea, 0xbd, 0x49, 0x71, 0x2c, 0x3d, 0xe8, 0x8b, 0x55, 0xbb, + 0x6c, 0x97, 0x24, 0xbe, 0x44, 0xe8, 0xe0, 0xba, 0x6d, 0x45, 0x4b, 0x3f, + 0x7f, 0x26, 0x38, 0x3e, 0xab, 0x04, 0x6e, 0xbe, 0x70, 0x59, 0x0e, 0xbe, + 0xd6, 0xfb, 0x7a, 0x3d, 0x45, 0x72, 0xa2, 0xbd, 0xb5, 0x6f, 0x2e, 0xbe, + 0xda, 0xf5, 0x07, 0x3e, 0xe0, 0x2b, 0xac, 0xbd, 0xaf, 0x35, 0xf6, 0xbd, + 0xd0, 0x2b, 0xac, 0xbd, 0x26, 0x2d, 0x11, 0xbe, 0x7e, 0xfa, 0x87, 0x3d, + 0x3a, 0xb7, 0xf6, 0xbd, 0xb1, 0xd0, 0xe2, 0xbc, 0xc8, 0xa2, 0x86, 0xbd, + 0x19, 0xf5, 0xb1, 0xbd, 0xf6, 0x65, 0x4d, 0xbe, 0x23, 0x63, 0x47, 0x3e, + 0xb7, 0x26, 0xd3, 0xbd, 0x57, 0xf4, 0x12, 0xbf, 0x93, 0xd4, 0x39, 0xbe, + 0x77, 0xf2, 0x62, 0x3d, 0xf6, 0x3d, 0xc3, 0xbe, 0xb6, 0xf5, 0x2b, 0xbe, + 0xbe, 0x8a, 0x76, 0xbe, 0xb1, 0x39, 0x63, 0x3e, 0xde, 0xbe, 0x3c, 0xbe, + 0xd4, 0x01, 0x94, 0xbe, 0x19, 0x1a, 0x97, 0xbb, 0xcb, 0x83, 0x4e, 0xbe, + 0x50, 0x19, 0x94, 0xbd, 0xf8, 0x8a, 0x95, 0xbe, 0xc8, 0xab, 0x86, 0xbe, + 0x18, 0x57, 0x6d, 0x3e, 0x87, 0xad, 0x8b, 0x3c, 0x72, 0x7b, 0x8d, 0x3e, + 0x54, 0x39, 0x95, 0x3d, 0x1d, 0xfa, 0x4b, 0xbe, 0x97, 0xd2, 0x7a, 0xbe, + 0x68, 0x4a, 0xcb, 0xbe, 0xf0, 0x10, 0x04, 0xbf, 0x2b, 0xb5, 0x82, 0x3e, + 0xf8, 0x71, 0x1a, 0x3e, 0x29, 0xf0, 0x29, 0x3d, 0x74, 0x5a, 0x1a, 0x3e, + 0x58, 0x75, 0xd1, 0xbd, 0x38, 0x6c, 0x99, 0x3e, 0x6c, 0xd4, 0x63, 0xbe, + 0xc3, 0x51, 0x90, 0xbe, 0xcf, 0xff, 0xae, 0xbe, 0xfe, 0xf1, 0x00, 0x3d, + 0x52, 0x64, 0x90, 0xbd, 0x02, 0x1a, 0xce, 0xbd, 0x86, 0x74, 0x00, 0x3d, + 0x82, 0x40, 0x04, 0x3e, 0x38, 0x03, 0x82, 0x3e, 0x8f, 0x1c, 0xf4, 0x3e, + 0x6f, 0x04, 0x68, 0xbe, 0x00, 0x12, 0xe3, 0x3d, 0x01, 0xf6, 0xb5, 0x3d, + 0xd9, 0x99, 0x36, 0x3d, 0x40, 0xad, 0xde, 0x3e, 0xaf, 0x74, 0xc1, 0x3d, + 0xb7, 0x8e, 0x6f, 0xbe, 0xb3, 0xa6, 0x32, 0xbe, 0xff, 0xca, 0x23, 0x3e, + 0x0c, 0xf1, 0x42, 0x3e, 0xe3, 0x85, 0x2c, 0x3d, 0xca, 0xc8, 0xb7, 0xba, + 0x1a, 0x94, 0x53, 0xbd, 0x9a, 0x33, 0xaa, 0x3d, 0x9c, 0x7c, 0x79, 0xbe, + 0x84, 0xb2, 0x71, 0xbe, 0x48, 0xc1, 0x2b, 0xbd, 0xf4, 0x89, 0x6c, 0xbd, + 0x1f, 0xd2, 0xf2, 0xbd, 0xd2, 0x4f, 0x28, 0xbd, 0xb4, 0xbb, 0xb3, 0xbd, + 0x6f, 0x96, 0xab, 0xbc, 0x23, 0x9d, 0x82, 0xbe, 0xe6, 0x6b, 0x59, 0xbd, + 0x27, 0x09, 0x03, 0xbe, 0x42, 0xa6, 0xac, 0xbd, 0xb6, 0x12, 0x20, 0x3d, + 0x0a, 0x63, 0x24, 0xbe, 0x75, 0x27, 0x28, 0xbe, 0xa5, 0x62, 0x2b, 0xbe, + 0x1f, 0x48, 0x06, 0xbe, 0x7e, 0xd0, 0xb2, 0xbd, 0xa9, 0xd6, 0x80, 0x3a, + 0xff, 0x7a, 0x11, 0xbe, 0x76, 0x5f, 0x41, 0x3e, 0x17, 0xa9, 0xfa, 0xbd, + 0x5b, 0xd1, 0x71, 0xbd, 0xf3, 0x23, 0xaf, 0xbd, 0x63, 0x24, 0xe0, 0xbc, + 0xc6, 0x62, 0x9d, 0x3e, 0xd6, 0x19, 0x47, 0xbe, 0x92, 0x69, 0xf1, 0xbd, + 0x8a, 0x67, 0x82, 0x3d, 0x17, 0x33, 0x69, 0x3d, 0x1a, 0x91, 0x25, 0xbe, + 0xf1, 0xab, 0xae, 0x3d, 0x3a, 0x21, 0xc1, 0x3e, 0xd8, 0xc4, 0x5d, 0xbd, + 0xc7, 0x58, 0xa6, 0xbe, 0xc6, 0xb0, 0xed, 0x3b, 0x75, 0xd6, 0xa2, 0x3c, + 0x64, 0xa8, 0x1d, 0xbe, 0xe5, 0x1f, 0x3a, 0xbe, 0x7b, 0x03, 0x39, 0xbd, + 0x14, 0xa2, 0x81, 0x3d, 0xdb, 0xfd, 0xb2, 0xbc, 0xca, 0x96, 0x9a, 0xbe, + 0x7c, 0xcc, 0xc9, 0x3c, 0xb8, 0x7d, 0x88, 0x3d, 0x36, 0x39, 0x0b, 0xbd, + 0x5e, 0x1f, 0x3c, 0xbe, 0x27, 0x36, 0x83, 0x3c, 0x38, 0xa1, 0x23, 0xbd, + 0xba, 0xfa, 0xf6, 0x3b, 0x8d, 0xa9, 0xc3, 0xbe, 0x50, 0x34, 0xf0, 0xbd, + 0x92, 0x0f, 0xb3, 0xbd, 0xd9, 0xad, 0x5e, 0xbe, 0xc1, 0x27, 0xb2, 0x3c, + 0x6a, 0x29, 0x07, 0xbe, 0x0f, 0xb5, 0x26, 0xbe, 0xc8, 0xf9, 0x27, 0x3e, + 0x2a, 0x97, 0xa4, 0x3e, 0xe1, 0x45, 0x53, 0x3e, 0xec, 0xd7, 0xa0, 0x3d, + 0xfd, 0x1a, 0x8c, 0xbe, 0x1d, 0x4c, 0xd6, 0xbd, 0x4a, 0x78, 0x63, 0xbe, + 0x18, 0xa4, 0xd9, 0xbc, 0x5a, 0xaa, 0x37, 0x3d, 0xff, 0xe8, 0x3b, 0xbe, + 0x6b, 0x8c, 0x67, 0x3e, 0x13, 0xec, 0x12, 0xbc, 0xae, 0xcc, 0xab, 0xbc, + 0x2e, 0x9b, 0x72, 0xbd, 0x46, 0x3f, 0xb4, 0x3e, 0xdb, 0xba, 0xd3, 0xbd, + 0x7b, 0xdb, 0x86, 0xbe, 0x6a, 0x66, 0xd9, 0xbe, 0x8c, 0x5c, 0x80, 0x3d, + 0x60, 0x64, 0x4d, 0xbe, 0x4d, 0x91, 0x58, 0x3e, 0xa9, 0xfc, 0x0e, 0xbe, + 0x32, 0xc8, 0xce, 0x3e, 0xa8, 0xc8, 0xb3, 0xbe, 0x4d, 0x07, 0xae, 0xbe, + 0xbc, 0xa3, 0x2c, 0xbf, 0x57, 0x9c, 0x21, 0xbe, 0x0e, 0x6d, 0x6e, 0xbe, + 0x30, 0xa6, 0x15, 0xbf, 0xd6, 0x76, 0x01, 0xbf, 0x80, 0x3e, 0xab, 0xbe, + 0xbe, 0x98, 0x2d, 0xbe, 0xe2, 0x02, 0x48, 0xbe, 0xc8, 0x4b, 0x96, 0xbe, + 0x48, 0xaa, 0x2e, 0x3e, 0xa2, 0x19, 0x01, 0x3f, 0xa8, 0xec, 0x8f, 0xbe, + 0x15, 0xd2, 0x24, 0x3e, 0x5c, 0x80, 0xc2, 0xbc, 0xf0, 0x78, 0x29, 0xbe, + 0xfe, 0x1d, 0x63, 0xbe, 0x32, 0xf1, 0x22, 0xbd, 0x35, 0x8c, 0x1d, 0x3e, + 0xb9, 0x22, 0xc2, 0x3e, 0xde, 0x75, 0xc0, 0xbe, 0x27, 0x71, 0x73, 0xbb, + 0x37, 0x41, 0xde, 0x3d, 0x0a, 0x71, 0xfe, 0xbd, 0x9e, 0x66, 0xf6, 0xbd, + 0x2b, 0x93, 0x07, 0xbc, 0x75, 0x1e, 0x90, 0x3d, 0x01, 0x49, 0x59, 0x3e, + 0x0a, 0xb2, 0xbe, 0xbe, 0xd4, 0x65, 0x9f, 0xbc, 0x43, 0x20, 0xdd, 0x3d, + 0xef, 0x01, 0x74, 0xbd, 0xb2, 0xa4, 0xd5, 0x3b, 0xa4, 0x30, 0xf9, 0xbc, + 0xb8, 0x15, 0x68, 0xb8, 0x58, 0xa2, 0xa7, 0xbe, 0x5a, 0x25, 0xa5, 0x3d, + 0x2d, 0x86, 0xb2, 0xbe, 0xc9, 0x31, 0xc2, 0x3e, 0xd2, 0x61, 0x28, 0x3d, + 0xa6, 0xfe, 0xba, 0x3d, 0x4b, 0x6c, 0xf6, 0xbd, 0xaa, 0x14, 0xdc, 0xbc, + 0xf6, 0x7d, 0xdc, 0xbd, 0xce, 0xb6, 0x75, 0xbd, 0x0b, 0xa5, 0xa8, 0xbe, + 0x9b, 0xb5, 0x4a, 0x3e, 0xfc, 0xfa, 0x98, 0x3d, 0x27, 0xd6, 0x39, 0x3d, + 0x1a, 0xbf, 0x67, 0x3d, 0x3f, 0x04, 0x04, 0xbc, 0x07, 0x56, 0x42, 0xbd, + 0xd8, 0xe6, 0x52, 0xbe, 0x72, 0xff, 0xc7, 0xbd, 0xd8, 0x5b, 0xba, 0xbd, + 0xe9, 0xb9, 0xc8, 0xbd, 0xe2, 0x54, 0x05, 0xbe, 0xb5, 0x8f, 0xf2, 0x3e, + 0x74, 0xe9, 0x68, 0xbd, 0x6f, 0x16, 0xcd, 0xbe, 0x2a, 0x22, 0x40, 0x3c, + 0xfc, 0x03, 0xf2, 0x3d, 0x91, 0x74, 0xaa, 0x3d, 0x7d, 0xb1, 0x1f, 0xbe, + 0x95, 0xc1, 0x14, 0xbe, 0xbb, 0xe5, 0x89, 0xbe, 0xae, 0xff, 0x5a, 0x3d, + 0x31, 0x79, 0x07, 0xbe, 0x07, 0xfb, 0xba, 0x3e, 0x4e, 0xd0, 0x86, 0xbd, + 0x68, 0x36, 0x29, 0x3e, 0xec, 0x14, 0xc7, 0x3d, 0xef, 0xf6, 0x06, 0x3b, + 0x76, 0xa0, 0xe8, 0x3c, 0x97, 0x57, 0xac, 0x3c, 0xec, 0x02, 0x8d, 0xbe, + 0x43, 0xaf, 0x42, 0x3d, 0x13, 0x39, 0x0e, 0x3d, 0xf4, 0xed, 0x5a, 0x3e, + 0xbb, 0xf1, 0x18, 0xbe, 0x71, 0x1f, 0xc8, 0xbb, 0x6d, 0x8c, 0x0b, 0xbe, + 0xfe, 0x5d, 0xc3, 0xbd, 0x2c, 0xae, 0x87, 0xbe, 0x58, 0x74, 0x3e, 0x3d, + 0x14, 0x52, 0x13, 0xbe, 0x41, 0x11, 0x55, 0xbe, 0x43, 0x03, 0x0e, 0x3e, + 0xf8, 0x4c, 0x2e, 0x3e, 0x09, 0x6a, 0xea, 0xbd, 0xec, 0xe1, 0xc3, 0xbd, + 0xd5, 0xdf, 0x2a, 0xbe, 0x2e, 0xc1, 0xd9, 0xbd, 0xc1, 0x5b, 0x72, 0xbe, + 0x73, 0xe9, 0x0f, 0xbe, 0xab, 0xc3, 0x0c, 0x3e, 0x85, 0xd1, 0x5e, 0x3e, + 0x08, 0x70, 0x0d, 0xbe, 0x6f, 0xb7, 0x01, 0x3d, 0x0c, 0x0f, 0x86, 0xbd, + 0x0d, 0x23, 0x56, 0x3e, 0x16, 0x6f, 0x10, 0xbc, 0x4f, 0x98, 0x42, 0xbf, + 0x85, 0x4e, 0x44, 0xbe, 0xf0, 0x20, 0x0b, 0xbe, 0x5b, 0xa3, 0x0f, 0xbc, + 0xbd, 0x33, 0x45, 0xbd, 0x84, 0xfb, 0x48, 0xbd, 0x11, 0x99, 0x8c, 0x3c, + 0x41, 0x1e, 0x08, 0x3e, 0xe3, 0x3e, 0x6c, 0xbf, 0x97, 0x2b, 0x0c, 0xbe, + 0x94, 0xec, 0x23, 0xbb, 0x8f, 0x35, 0x4f, 0x3c, 0xea, 0xec, 0x0c, 0xbd, + 0x04, 0x13, 0x3d, 0xbe, 0x13, 0x76, 0x23, 0x3e, 0x37, 0x0d, 0x99, 0x3c, + 0xd4, 0xa3, 0xf4, 0xbe, 0x18, 0x6a, 0x6c, 0xbe, 0x3d, 0x3c, 0xf6, 0xbd, + 0xf8, 0x51, 0xaf, 0xbc, 0x1f, 0x6e, 0x8a, 0xbc, 0x55, 0xc5, 0x8c, 0xbe, + 0x9e, 0x9c, 0x79, 0xbd, 0x13, 0x14, 0xb7, 0xbd, 0x89, 0xcd, 0x1a, 0xbe, + 0x79, 0x14, 0x2e, 0x3e, 0xdd, 0xa2, 0x71, 0x3e, 0xad, 0x71, 0xbe, 0xbc, + 0xa3, 0xc9, 0x22, 0x3f, 0x66, 0x4b, 0x0f, 0x3d, 0x45, 0x1c, 0x29, 0xbe, + 0xf6, 0x79, 0x93, 0xbe, 0x71, 0x18, 0xb6, 0x3d, 0xcc, 0xcb, 0x9d, 0x3c, + 0xa1, 0xbb, 0xfd, 0xbc, 0xc9, 0x75, 0x05, 0x3e, 0x77, 0x4b, 0xad, 0xbd, + 0x81, 0x1d, 0x5c, 0x3e, 0x2d, 0xcc, 0x24, 0xbd, 0x3a, 0xce, 0x36, 0xbe, + 0xb8, 0x37, 0x27, 0xbe, 0xe6, 0x3e, 0x75, 0x3b, 0xb7, 0xb4, 0x2c, 0xbd, + 0x1f, 0x05, 0x47, 0x3c, 0x81, 0x1d, 0x33, 0x3e, 0x8a, 0xfd, 0x4f, 0x3e, + 0xaf, 0x7c, 0x3b, 0x3d, 0x00, 0xa0, 0xda, 0xbd, 0x39, 0xd1, 0x20, 0xbf, + 0xc9, 0x78, 0xf3, 0xbd, 0x9d, 0x01, 0xa3, 0xbe, 0x42, 0x44, 0xbb, 0xbc, + 0x5a, 0xc1, 0xd4, 0xbd, 0xfd, 0xe7, 0x3c, 0xbf, 0x46, 0x37, 0x85, 0x3d, + 0x79, 0x4e, 0xbc, 0x3d, 0xa4, 0xcd, 0x7f, 0xbf, 0x1d, 0xca, 0x69, 0xbf, + 0x97, 0xeb, 0x69, 0xbf, 0xaa, 0xc9, 0x9f, 0x3c, 0xb4, 0x82, 0x9d, 0x3e, + 0xf1, 0x94, 0x77, 0x3e, 0xf2, 0x74, 0x84, 0xbe, 0x88, 0x66, 0x9c, 0xbe, + 0xdf, 0x4e, 0xf1, 0xbd, 0xa2, 0x9e, 0x31, 0x3e, 0x8b, 0xc9, 0x49, 0x3d, + 0x5a, 0x63, 0x5c, 0x3e, 0xf9, 0xa5, 0x4e, 0x3d, 0x95, 0x3f, 0x8d, 0x3d, + 0x1c, 0xe0, 0x68, 0xbe, 0xb6, 0xe1, 0x7c, 0xbe, 0x82, 0x2b, 0x63, 0xbe, + 0x76, 0x6c, 0x02, 0xbe, 0xfe, 0x30, 0x36, 0xbe, 0x8f, 0x5f, 0x36, 0x3d, + 0x17, 0x52, 0x15, 0x3c, 0x1e, 0xc8, 0x88, 0xbf, 0x0a, 0xa1, 0x5d, 0x3d, + 0xe8, 0x31, 0x71, 0x3e, 0xd2, 0x45, 0x01, 0xbc, 0x41, 0x3c, 0x27, 0xbe, + 0xbb, 0xa9, 0x4d, 0xbc, 0x0f, 0xde, 0x9d, 0x3c, 0xbf, 0x35, 0xc3, 0xbd, + 0x5b, 0x0e, 0x70, 0xbf, 0xe9, 0xf4, 0xd5, 0x3b, 0x60, 0x9b, 0xec, 0x3d, + 0x8b, 0x75, 0x23, 0xbc, 0x17, 0x03, 0x84, 0xbe, 0x99, 0x04, 0xd0, 0x3c, + 0xdd, 0x01, 0x08, 0xbe, 0x82, 0xd5, 0x75, 0xbd, 0x05, 0xaa, 0xec, 0x3c, + 0xb9, 0x4d, 0x45, 0x3d, 0xa3, 0x11, 0x69, 0xbb, 0xa3, 0xb0, 0x50, 0x3e, + 0x7a, 0x5f, 0xaa, 0xbd, 0x6a, 0x73, 0xbe, 0xbd, 0x91, 0x25, 0xa9, 0xbd, + 0x0f, 0x8e, 0xe0, 0xbd, 0x50, 0x51, 0x8f, 0x3c, 0xf4, 0x7d, 0xb9, 0x3d, + 0xa2, 0x11, 0x50, 0x3d, 0x3a, 0xb5, 0x32, 0x3e, 0xe1, 0x28, 0x87, 0x3e, + 0x44, 0x83, 0x09, 0x3e, 0xc3, 0x5f, 0x0a, 0xbe, 0xc4, 0xb8, 0x0f, 0xbe, + 0xaa, 0xb2, 0xab, 0xbd, 0x93, 0x40, 0x5c, 0xbd, 0x35, 0xf0, 0x19, 0xbd, + 0x4a, 0xa8, 0x02, 0x3b, 0x3c, 0x51, 0x1a, 0x3c, 0xbe, 0x2d, 0xdd, 0xbb, + 0x55, 0x5d, 0xc3, 0x3d, 0x10, 0x6f, 0x7c, 0xbd, 0x62, 0xf7, 0x45, 0xbe, + 0xd5, 0xda, 0xe1, 0x3d, 0x25, 0xd5, 0x13, 0x3e, 0xf0, 0xd6, 0xea, 0xbd, + 0x62, 0x2b, 0x56, 0xbd, 0x80, 0x0c, 0xb1, 0x3d, 0x19, 0xbe, 0xa5, 0x3d, + 0x3e, 0xc3, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x76, + 0x32, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x43, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9e, 0xc3, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, + 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x52, 0x65, 0x6c, 0x75, 0x00, 0x00, 0x00, + 0xac, 0xc2, 0xff, 0xff, 0xde, 0xc3, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x52, 0x65, 0x6c, 0x75, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xc2, 0xff, 0xff, 0x2a, 0xc4, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x69, + 0x6e, 0x67, 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x78, 0x50, 0x6f, + 0x6f, 0x6c, 0x00, 0x00, 0x4c, 0xc3, 0xff, 0xff, 0x7e, 0xc4, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, + 0x5f, 0x31, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x00, 0x00, + 0x90, 0xc3, 0xff, 0xff, 0xc2, 0xc4, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc3, 0xff, 0xff, 0xf6, 0xc4, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, + 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x2f, 0x52, 0x65, 0x61, 0x64, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x20, 0xc4, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x91, 0x78, 0x9e, 0x3d, + 0x02, 0x6e, 0x72, 0x3e, 0xaf, 0x5f, 0x65, 0xbc, 0x83, 0x89, 0xa5, 0x3e, + 0x99, 0x1e, 0xf5, 0x3d, 0xb4, 0x02, 0x92, 0x3d, 0xaf, 0x31, 0x96, 0x3d, + 0x44, 0x77, 0xa2, 0xbe, 0xf0, 0x3c, 0x73, 0xbe, 0x0f, 0xec, 0x35, 0x3f, + 0x47, 0xd1, 0x20, 0xbc, 0xae, 0x8d, 0x48, 0xbe, 0xce, 0xcc, 0x3d, 0x3e, + 0xad, 0x49, 0x78, 0x3e, 0x11, 0x2e, 0x82, 0xbd, 0xa7, 0xf3, 0x7e, 0x3d, + 0x7b, 0xea, 0x7a, 0x3d, 0xd1, 0xe5, 0x1f, 0x3e, 0x92, 0x8c, 0x7a, 0x3d, + 0xe8, 0x22, 0x46, 0xbe, 0xe4, 0x5c, 0x24, 0x3e, 0xa2, 0x0d, 0x6b, 0x3c, + 0xfb, 0x04, 0x21, 0xbd, 0x1c, 0x6e, 0xd1, 0xbe, 0xd5, 0xc6, 0xd9, 0xbc, + 0xb6, 0xe8, 0xdf, 0x3d, 0xd8, 0x73, 0x09, 0x3d, 0xcb, 0x45, 0xb1, 0xbe, + 0xda, 0x6a, 0x0e, 0x3d, 0x40, 0xbe, 0xef, 0xbc, 0xe4, 0xbb, 0xcb, 0xbd, + 0xf6, 0x35, 0x30, 0x3d, 0x25, 0x3a, 0x56, 0xbe, 0x1f, 0x35, 0x0a, 0x3d, + 0x95, 0x31, 0x21, 0x3d, 0xde, 0xaa, 0x54, 0xbe, 0x8d, 0x0a, 0x6b, 0x3e, + 0xd5, 0x70, 0x02, 0xbd, 0xdc, 0x18, 0xaa, 0x3c, 0x2a, 0x0c, 0x79, 0xbe, + 0xee, 0xc5, 0x04, 0x3b, 0x2c, 0xb9, 0xbe, 0x3d, 0x0f, 0x55, 0x82, 0xbc, + 0x94, 0xf6, 0x00, 0xbf, 0x0a, 0xa2, 0x02, 0xbe, 0xa3, 0x2b, 0x58, 0xbd, + 0x09, 0x4f, 0xd3, 0xbd, 0x57, 0x98, 0x36, 0xbe, 0xcd, 0xed, 0x81, 0xbe, + 0x78, 0x4d, 0x3b, 0xbd, 0xa1, 0xf9, 0xdc, 0xbd, 0x18, 0xc4, 0x29, 0xbd, + 0xf5, 0x6d, 0xb2, 0x3e, 0x43, 0x7b, 0x53, 0x3e, 0x2b, 0x6a, 0x69, 0x3c, + 0xec, 0x2e, 0x13, 0xbf, 0x6a, 0x0d, 0x2c, 0xbe, 0x3d, 0xe3, 0x32, 0x3e, + 0xf4, 0x41, 0x39, 0x3d, 0x48, 0xd3, 0x49, 0xbe, 0x7f, 0x25, 0x9a, 0xbe, + 0xd3, 0x36, 0x0b, 0xbe, 0xa5, 0xa3, 0x89, 0xbd, 0x09, 0x30, 0xe5, 0xbd, + 0x13, 0x17, 0x83, 0xbe, 0x1a, 0x4c, 0xc4, 0xbc, 0x81, 0x1e, 0x67, 0xbe, + 0x82, 0x77, 0xdf, 0xbd, 0x02, 0x7d, 0x33, 0x3e, 0xd3, 0x35, 0x02, 0x3e, + 0x8a, 0xc0, 0x90, 0x3c, 0x8b, 0xd0, 0x95, 0xbe, 0x2a, 0x67, 0x6f, 0xbe, + 0xf3, 0xf4, 0x20, 0x3e, 0x01, 0x28, 0xba, 0x3c, 0x55, 0x65, 0xaa, 0xbd, + 0x76, 0x1d, 0x90, 0xbd, 0xa5, 0x37, 0xce, 0x3d, 0x8f, 0xd7, 0x80, 0xbd, + 0x02, 0xea, 0x7d, 0xbc, 0xd1, 0xff, 0xe6, 0xbd, 0x96, 0xb5, 0xa0, 0x3d, + 0xea, 0xb0, 0x90, 0xbe, 0x9e, 0xed, 0x99, 0xbd, 0x2e, 0xee, 0xd9, 0x3d, + 0xe9, 0xf4, 0xb5, 0x3e, 0xa2, 0xb4, 0xfe, 0x3d, 0xe5, 0x4b, 0x30, 0x3d, + 0x07, 0xf3, 0x58, 0xbe, 0x29, 0xa8, 0x2a, 0x3b, 0xf6, 0x0c, 0x40, 0x3e, + 0xb9, 0x87, 0xc0, 0xbc, 0xf3, 0x12, 0x67, 0x3d, 0xd7, 0x33, 0x82, 0xbd, + 0xba, 0x47, 0x15, 0xbd, 0x64, 0xca, 0x29, 0x3e, 0xca, 0x70, 0x5d, 0x3e, + 0x9c, 0xa8, 0xcb, 0x3d, 0xbe, 0xe3, 0xaf, 0xbd, 0xaf, 0x93, 0x2c, 0xbe, + 0x07, 0x36, 0xb5, 0x3e, 0xfc, 0xff, 0x34, 0x3e, 0x71, 0x9a, 0xbb, 0xbd, + 0xa8, 0x92, 0x4b, 0x3e, 0xb1, 0x22, 0x29, 0xbe, 0xce, 0x5d, 0x3e, 0x3e, + 0xda, 0xca, 0x42, 0x3e, 0x20, 0x1a, 0x58, 0x3d, 0x5c, 0x0a, 0x0c, 0x3d, + 0xe2, 0xff, 0xf0, 0x3d, 0x79, 0xfd, 0x0c, 0x3e, 0x69, 0x5f, 0x03, 0x3e, + 0x66, 0xd3, 0x2e, 0xbb, 0x3a, 0x63, 0x64, 0x3c, 0x10, 0x2f, 0x48, 0xbe, + 0xc5, 0xa7, 0x47, 0xbe, 0xda, 0x5a, 0x97, 0x3e, 0xc1, 0x6e, 0xcd, 0xbc, + 0x9a, 0x9c, 0x51, 0xbd, 0x31, 0x27, 0xdd, 0x3d, 0x0b, 0xb2, 0x80, 0xbd, + 0xbf, 0x75, 0xa7, 0xbc, 0xd5, 0x65, 0x2f, 0x3e, 0xc4, 0x0d, 0x1b, 0x3e, + 0xcf, 0x7f, 0xf2, 0x3d, 0x73, 0xc7, 0xf2, 0x3d, 0x69, 0x2e, 0x98, 0xbb, + 0xa8, 0x5b, 0xa8, 0x3d, 0xfd, 0xb0, 0xbf, 0xbd, 0xa3, 0x49, 0xfc, 0xbd, + 0xad, 0xf5, 0x02, 0xbe, 0x60, 0x1e, 0x26, 0xbe, 0x1d, 0x96, 0x3d, 0x3e, + 0xf7, 0x23, 0x2c, 0x3e, 0x44, 0x1b, 0x86, 0x3d, 0x88, 0x56, 0x48, 0xbd, + 0xad, 0xf6, 0xee, 0x3c, 0x0d, 0x81, 0x13, 0x3d, 0xd0, 0x76, 0x09, 0x3e, + 0x49, 0x83, 0x83, 0xbd, 0x50, 0xd6, 0x79, 0xbe, 0x8c, 0x17, 0x4f, 0x3d, + 0xec, 0xe5, 0x90, 0x3d, 0x1e, 0x19, 0x4f, 0x3d, 0x1f, 0x3c, 0x9f, 0xbd, + 0xe5, 0x47, 0x4b, 0xbe, 0x33, 0xf0, 0x14, 0xbe, 0x58, 0xbf, 0x21, 0x3d, + 0xd2, 0x8c, 0x42, 0x3e, 0x31, 0xe6, 0x9a, 0x3d, 0xf9, 0x4e, 0xab, 0xbd, + 0x6f, 0x46, 0x1f, 0xbe, 0x9e, 0xf1, 0x21, 0x3d, 0x04, 0x72, 0xfb, 0x3d, + 0x29, 0xca, 0x24, 0x3e, 0x32, 0x01, 0xa1, 0xbe, 0x07, 0x9b, 0x45, 0xbe, + 0xf9, 0x09, 0xc5, 0x3d, 0xc9, 0x84, 0x44, 0xbd, 0xde, 0xb5, 0x68, 0xbd, + 0x0a, 0xf6, 0x3e, 0xbe, 0x78, 0x6e, 0xbc, 0xbd, 0x03, 0xf8, 0x38, 0xbd, + 0xe9, 0xf6, 0x17, 0xbd, 0x1a, 0x19, 0x3b, 0x3e, 0x43, 0xb1, 0xdb, 0x3c, + 0xc5, 0x5b, 0x1e, 0xbb, 0xcc, 0x9b, 0x00, 0xbe, 0x01, 0xe4, 0xe4, 0xba, + 0xe5, 0x8d, 0x26, 0x3e, 0x4b, 0x09, 0x0a, 0xbc, 0x50, 0x4e, 0xe0, 0xbe, + 0xe3, 0x93, 0xf3, 0xbc, 0xe8, 0xe9, 0x20, 0x3d, 0x23, 0xa7, 0xe2, 0x3c, + 0xe2, 0x05, 0xa7, 0x3d, 0xd4, 0xda, 0x29, 0xbd, 0xb3, 0x43, 0xa7, 0xbc, + 0x28, 0x61, 0x0d, 0xbd, 0x7e, 0x55, 0xa7, 0x3d, 0x5f, 0x27, 0x3f, 0x3e, + 0x12, 0x19, 0xca, 0x3b, 0xc9, 0x89, 0x0b, 0xbd, 0x57, 0x99, 0x33, 0xbd, + 0x61, 0x8f, 0xda, 0xbc, 0x6a, 0x54, 0x5a, 0x3e, 0x31, 0xeb, 0x2b, 0x3d, + 0x8c, 0x95, 0x97, 0xbe, 0x5b, 0x2d, 0x85, 0x3e, 0x49, 0x3f, 0xf4, 0xbc, + 0x20, 0xbb, 0x62, 0x3c, 0x01, 0x69, 0xae, 0xbd, 0xe1, 0x2c, 0x43, 0xbe, + 0xe9, 0x5d, 0x84, 0x3d, 0xb3, 0x61, 0x17, 0x3e, 0x47, 0x07, 0x95, 0xbc, + 0xcd, 0x7c, 0x87, 0x3e, 0xd9, 0xb3, 0x03, 0x3d, 0x1c, 0x7e, 0x15, 0x3d, + 0xe1, 0x0b, 0xb0, 0xbd, 0x23, 0xfe, 0x94, 0x3c, 0xf0, 0x36, 0xd7, 0x3d, + 0x9e, 0x2b, 0x82, 0x3c, 0x78, 0x43, 0x9b, 0xbe, 0xf9, 0x5d, 0x0c, 0xbe, + 0x07, 0x45, 0xda, 0x3d, 0x79, 0x36, 0x19, 0x3d, 0x49, 0xff, 0xbc, 0x3c, + 0xd6, 0x6e, 0xec, 0xbe, 0x6c, 0xb2, 0xd5, 0x3c, 0x2a, 0xb0, 0x92, 0x3b, + 0x45, 0x87, 0x3a, 0x3e, 0xd3, 0xe5, 0xb8, 0xbd, 0x92, 0x1a, 0x2e, 0x3c, + 0x9b, 0x33, 0x3c, 0x3e, 0x0f, 0x3d, 0xa8, 0xbe, 0x53, 0x7c, 0xa6, 0x3d, + 0x3b, 0x9e, 0x98, 0xbe, 0x96, 0x91, 0xd6, 0x3c, 0x71, 0x5b, 0x99, 0xbe, + 0x73, 0x0b, 0x04, 0x3e, 0xfa, 0x8a, 0xc0, 0x3d, 0x7f, 0x1b, 0xdd, 0x3d, + 0xe4, 0x01, 0x84, 0xbd, 0xcf, 0x63, 0xdb, 0xbd, 0xda, 0x5d, 0x8d, 0xbd, + 0x44, 0xe1, 0x46, 0xbd, 0x65, 0x6c, 0x05, 0xbe, 0x0a, 0x83, 0xb1, 0xbd, + 0x97, 0x4a, 0x59, 0xbe, 0x77, 0x26, 0xa7, 0x3d, 0x0d, 0x22, 0xea, 0xbd, + 0x70, 0x48, 0x14, 0xbe, 0x01, 0x31, 0x04, 0x3e, 0xe0, 0x5e, 0xb8, 0xbd, + 0xd3, 0xe3, 0xee, 0xbd, 0x4e, 0x6f, 0xc4, 0xbc, 0x2f, 0xab, 0x53, 0x3d, + 0xd2, 0x79, 0x2c, 0xbe, 0xea, 0x5e, 0xdb, 0xbd, 0x02, 0x40, 0x4d, 0xbd, + 0xcf, 0x47, 0x5d, 0xbd, 0x1e, 0x48, 0x97, 0xbd, 0x7c, 0x3b, 0xca, 0x3d, + 0x75, 0x1d, 0x43, 0xbe, 0xb7, 0xab, 0x86, 0x3b, 0xfa, 0x51, 0xe2, 0x3b, + 0xcc, 0x0c, 0x1a, 0xbe, 0xda, 0x56, 0xc0, 0x3d, 0xd2, 0xa5, 0x6b, 0xbd, + 0x46, 0xe8, 0x27, 0xbe, 0x95, 0x71, 0x4e, 0xbe, 0x78, 0xda, 0xb0, 0x3d, + 0xec, 0xfd, 0x31, 0xbe, 0x5f, 0xb5, 0x44, 0xbe, 0x2b, 0x48, 0x06, 0xbe, + 0x28, 0x5c, 0xf4, 0xbd, 0x1a, 0xb1, 0xa3, 0x3c, 0x77, 0xd6, 0xef, 0xbd, + 0xec, 0xe1, 0x93, 0xbd, 0x85, 0xb2, 0xcd, 0xbd, 0xf8, 0x0b, 0x52, 0xbd, + 0x16, 0x95, 0xd7, 0x3c, 0xb2, 0x00, 0x29, 0x3c, 0x42, 0x8c, 0xb6, 0x3d, + 0xa8, 0x79, 0x1f, 0xbe, 0xa5, 0xfe, 0xe8, 0xbd, 0x28, 0x30, 0xb8, 0x3d, + 0xb8, 0x23, 0x9e, 0x3d, 0x7f, 0xe1, 0x33, 0xbe, 0x2b, 0xf8, 0x3f, 0xbe, + 0x05, 0x8c, 0x70, 0xbd, 0x30, 0x32, 0xe0, 0xbd, 0xff, 0xd3, 0x45, 0xbe, + 0x29, 0x82, 0x33, 0xbc, 0x2b, 0x86, 0x13, 0xbe, 0x0b, 0x81, 0x07, 0xbd, + 0xb1, 0xd4, 0xa8, 0x3c, 0x42, 0xd6, 0x2d, 0xbc, 0xfc, 0x19, 0x33, 0xba, + 0xd5, 0xf7, 0x29, 0xbe, 0xff, 0xb9, 0x18, 0xbe, 0x34, 0x96, 0x36, 0xbe, + 0x8d, 0x80, 0xcc, 0xbd, 0x55, 0x1f, 0xe9, 0xbc, 0xa1, 0xdd, 0x69, 0xbe, + 0xd3, 0x86, 0xb4, 0x3c, 0x3a, 0xc2, 0x0f, 0xbe, 0xc0, 0x63, 0xcd, 0xbc, + 0xcb, 0xf8, 0xcf, 0xbd, 0x45, 0x7f, 0x5f, 0x3d, 0x95, 0x59, 0xbd, 0x3d, + 0x7b, 0x9c, 0xf0, 0xbd, 0x57, 0xaf, 0xfb, 0x3c, 0xad, 0x44, 0xaf, 0xbd, + 0xa5, 0xf3, 0xbc, 0xbd, 0xb4, 0xe1, 0x59, 0xbd, 0xa6, 0x28, 0x29, 0x3d, + 0xcb, 0x8b, 0x50, 0xbe, 0x20, 0x85, 0x95, 0xbd, 0x33, 0xcf, 0xfa, 0xbb, + 0xde, 0xfc, 0x1c, 0x3d, 0x91, 0xb6, 0x43, 0xbe, 0x54, 0x84, 0xaf, 0xbd, + 0xdc, 0xde, 0x04, 0xbe, 0x69, 0xc6, 0x19, 0xbe, 0x43, 0xcf, 0x23, 0xbd, + 0x77, 0x3b, 0x58, 0xbe, 0x50, 0x09, 0x50, 0xbd, 0x17, 0xa2, 0x2d, 0xbd, + 0xe0, 0xad, 0xb5, 0xba, 0x47, 0x9d, 0xcc, 0x3d, 0x06, 0x72, 0xe3, 0x3d, + 0x92, 0x81, 0x9f, 0x3c, 0x55, 0x1d, 0x06, 0xbe, 0xa0, 0x79, 0x9c, 0x3c, + 0xe1, 0xec, 0xe6, 0xbd, 0x63, 0x0c, 0x9a, 0xbd, 0xc1, 0x82, 0x5e, 0xbe, + 0x01, 0x4c, 0x38, 0xbe, 0x64, 0x06, 0x52, 0xbd, 0xd1, 0x54, 0x08, 0xbe, + 0x0c, 0xb8, 0xc2, 0x3d, 0x5a, 0xd2, 0xb4, 0x3d, 0x84, 0xcb, 0x24, 0xbe, + 0x80, 0xb4, 0x8f, 0x3c, 0x84, 0x69, 0x0c, 0xbe, 0x3d, 0xda, 0x05, 0xbe, + 0x4c, 0x48, 0x0c, 0x3e, 0xdc, 0x35, 0xcf, 0xbc, 0x80, 0x1b, 0x0b, 0xbe, + 0xaa, 0x3a, 0x9c, 0xbc, 0x21, 0xd4, 0x83, 0x3d, 0x26, 0x6e, 0xe8, 0x3d, + 0xe4, 0x41, 0x28, 0x3d, 0x88, 0x35, 0x1d, 0xbe, 0x2c, 0xfb, 0xb2, 0x3d, + 0xe4, 0xbb, 0x0a, 0xbe, 0x95, 0x00, 0xfe, 0xbd, 0x3d, 0x87, 0x89, 0x3c, + 0x19, 0x9f, 0xa0, 0xbc, 0xac, 0xce, 0x6f, 0xbd, 0x16, 0x48, 0x21, 0xbe, + 0xd8, 0x21, 0x13, 0xbe, 0x15, 0x49, 0xfc, 0xbd, 0x6c, 0x10, 0x31, 0x3e, + 0x93, 0x04, 0xa2, 0xbd, 0xbc, 0xce, 0xbe, 0xbd, 0x59, 0xce, 0x51, 0xbd, + 0xd6, 0xf1, 0x60, 0x3d, 0x3a, 0x92, 0x76, 0xbd, 0xb8, 0xef, 0x66, 0x3b, + 0x26, 0x2c, 0x8e, 0x3d, 0xf1, 0xff, 0x1e, 0xbe, 0xc2, 0x6f, 0x26, 0x3d, + 0xe7, 0xb2, 0x4e, 0xbe, 0x31, 0x1e, 0xc4, 0xbd, 0x2f, 0x0a, 0x81, 0x3c, + 0xb9, 0x73, 0xea, 0xbd, 0x41, 0xdf, 0x4b, 0xbd, 0x9d, 0x47, 0x88, 0xbd, + 0xab, 0x21, 0x68, 0xbd, 0x77, 0x20, 0xf9, 0xbc, 0x40, 0x55, 0xaa, 0x3d, + 0x26, 0xe1, 0xf9, 0xbd, 0x97, 0xbe, 0xdd, 0x3d, 0x57, 0xe8, 0x91, 0xbd, + 0x00, 0xbb, 0x3e, 0xbe, 0x22, 0x51, 0x91, 0xbd, 0x6b, 0xe6, 0xa1, 0x3d, + 0x7d, 0xf1, 0xa6, 0x3d, 0xa9, 0x89, 0x86, 0x3d, 0x57, 0x91, 0xef, 0xbd, + 0xcb, 0x06, 0x01, 0xba, 0x9d, 0xc0, 0x4a, 0x3d, 0x71, 0xaf, 0x35, 0xbe, + 0x01, 0x3d, 0x16, 0xbc, 0x01, 0xa4, 0x81, 0xbd, 0xa4, 0xf6, 0x2e, 0xbd, + 0xb7, 0xe9, 0x0d, 0xbd, 0x94, 0xef, 0x26, 0xbe, 0xee, 0x31, 0x20, 0xbe, + 0x43, 0x8a, 0x30, 0x3d, 0x09, 0xa3, 0xb1, 0xbd, 0x20, 0xb8, 0x11, 0x3c, + 0x55, 0x7c, 0x1e, 0x3d, 0xbd, 0x60, 0x4f, 0xbe, 0x05, 0x06, 0xa3, 0x3c, + 0x92, 0x48, 0xfa, 0xbb, 0x6a, 0x53, 0x0a, 0xbe, 0xd5, 0x01, 0x19, 0xbc, + 0x69, 0xf6, 0x2a, 0xbe, 0xf9, 0xbe, 0x08, 0xbe, 0x4b, 0x17, 0x49, 0x3c, + 0xb4, 0x10, 0x79, 0x3d, 0x4f, 0xb1, 0xf2, 0xbc, 0xc4, 0x6b, 0x8a, 0x3c, + 0x6c, 0xa7, 0x35, 0xbe, 0xe2, 0xfb, 0xe0, 0xbd, 0xf3, 0xc0, 0x2a, 0xbd, + 0xe6, 0x47, 0xbd, 0xbd, 0xc3, 0x30, 0x66, 0xbe, 0xfb, 0x2d, 0x35, 0x3d, + 0x13, 0xd6, 0xad, 0xbd, 0x7f, 0xd2, 0x01, 0xbe, 0x9e, 0xe1, 0x57, 0xbd, + 0x8c, 0x02, 0xe2, 0x3c, 0x21, 0x90, 0x11, 0xbe, 0x56, 0x8f, 0xab, 0x3d, + 0xba, 0x5b, 0xdc, 0x3d, 0xaa, 0x5e, 0x77, 0xbe, 0x1c, 0xc9, 0x64, 0x3d, + 0xfa, 0xf6, 0xd4, 0x3b, 0x72, 0x3d, 0x4a, 0x3d, 0x8c, 0xd5, 0x34, 0xbe, + 0x32, 0x30, 0xa8, 0x3b, 0x60, 0x0c, 0x8e, 0x3c, 0x7b, 0xc7, 0x30, 0x3d, + 0x86, 0x51, 0xb9, 0xbb, 0xed, 0x50, 0x0e, 0x3e, 0xb3, 0x70, 0x8a, 0xbc, + 0xc6, 0x3a, 0x1d, 0xbe, 0x77, 0x4d, 0x09, 0xbe, 0xb7, 0x5b, 0x39, 0xbd, + 0x23, 0xc9, 0x94, 0x3d, 0x8c, 0x6b, 0x7d, 0xbd, 0xc7, 0x7e, 0x45, 0xbe, + 0xf7, 0x39, 0xb8, 0xbd, 0x22, 0x46, 0x41, 0xbe, 0x9c, 0xcc, 0x64, 0x3c, + 0x97, 0xae, 0x94, 0xbd, 0xf9, 0x00, 0x8e, 0xbd, 0x34, 0xd3, 0xae, 0xbd, + 0x95, 0x7e, 0x4c, 0x3d, 0x16, 0x3f, 0x81, 0x3d, 0x77, 0x7e, 0x9b, 0xbc, + 0x47, 0x7b, 0x87, 0xbc, 0xb8, 0xc1, 0x14, 0xbe, 0x48, 0x64, 0xff, 0xbd, + 0x41, 0x09, 0xe2, 0xbc, 0xcb, 0x02, 0x2d, 0xbd, 0x52, 0x57, 0x26, 0xba, + 0x2b, 0x92, 0x83, 0xbd, 0x12, 0x88, 0x81, 0xbe, 0x11, 0x87, 0xe4, 0x3d, + 0xf6, 0x25, 0x51, 0xbe, 0xd5, 0x2d, 0xe9, 0xbd, 0xca, 0xc7, 0x6b, 0xbe, + 0x20, 0x33, 0x42, 0x3c, 0xfd, 0x3b, 0x54, 0xbe, 0xcc, 0x6d, 0x18, 0xbd, + 0x50, 0x31, 0x1f, 0xbe, 0x15, 0x5a, 0x48, 0x3e, 0x6a, 0xa8, 0x1e, 0x3e, + 0x1c, 0x72, 0x9d, 0xbe, 0xc2, 0xcf, 0x19, 0x3e, 0xda, 0x99, 0x3e, 0x3d, + 0x33, 0x9c, 0x84, 0xbf, 0xc3, 0xf1, 0x19, 0x3d, 0x3f, 0xf7, 0x24, 0xbd, + 0x29, 0x2a, 0xf7, 0x3e, 0x48, 0xf5, 0x48, 0xbe, 0xf4, 0xbc, 0xf4, 0xbd, + 0xed, 0x44, 0x7f, 0xbd, 0x3b, 0x94, 0x8a, 0x3e, 0xcd, 0x23, 0x5d, 0xbc, + 0x58, 0xdb, 0x8b, 0x3e, 0xe7, 0x74, 0xac, 0xbe, 0x6e, 0x53, 0x84, 0xbd, + 0x18, 0x4a, 0x4a, 0x3e, 0x96, 0x8c, 0xf1, 0x3d, 0xae, 0xc0, 0x5b, 0xbc, + 0x92, 0x87, 0x52, 0x3e, 0x51, 0xcd, 0x55, 0xbd, 0x2d, 0x96, 0x0f, 0x3d, + 0xba, 0xee, 0x95, 0xbc, 0x79, 0xf2, 0x32, 0x3e, 0x9a, 0x6c, 0xd8, 0xbe, + 0x67, 0xfd, 0x06, 0xbe, 0x47, 0x20, 0xd5, 0xbc, 0x67, 0x20, 0xf5, 0x3d, + 0xb6, 0x84, 0xbb, 0x3b, 0x20, 0x91, 0x3a, 0x3e, 0x86, 0x8c, 0x2b, 0xbe, + 0x94, 0x2b, 0xeb, 0x3d, 0x57, 0xbd, 0x17, 0x3e, 0x8f, 0x5f, 0x18, 0xbc, + 0x7d, 0x8f, 0x65, 0xbd, 0x99, 0x37, 0xc3, 0x3e, 0x04, 0x8c, 0xa8, 0xbd, + 0x8a, 0x8d, 0xd3, 0x3d, 0xdc, 0x19, 0xa9, 0xbd, 0x92, 0x13, 0x84, 0x3d, + 0x91, 0xb8, 0xa3, 0xbe, 0x7b, 0x31, 0x87, 0xbd, 0x5b, 0xf4, 0x29, 0xbb, + 0x99, 0x9a, 0x44, 0x3e, 0x7a, 0x99, 0x26, 0xbd, 0xe1, 0xd1, 0x03, 0x3e, + 0x37, 0xac, 0xa1, 0x3c, 0x46, 0xe3, 0x0d, 0x3e, 0xcc, 0xad, 0x96, 0x3d, + 0x34, 0xab, 0xf9, 0xbd, 0xcb, 0x7e, 0x36, 0xbe, 0x75, 0xa7, 0x8c, 0x3e, + 0x65, 0x58, 0x41, 0xbe, 0x12, 0x45, 0xa3, 0xba, 0xd5, 0x51, 0xe2, 0xbc, + 0xac, 0x2c, 0xc8, 0xbc, 0x8a, 0x1d, 0x70, 0xbe, 0x58, 0xb0, 0x65, 0x3c, + 0x00, 0x29, 0xdc, 0x3d, 0xf7, 0x94, 0x9d, 0x3e, 0x24, 0xfa, 0x84, 0xbd, + 0xa0, 0x06, 0xfe, 0x3d, 0x84, 0x08, 0x10, 0xbd, 0xf0, 0x0a, 0xc5, 0x3d, + 0xd4, 0xf2, 0xd3, 0x3c, 0xfd, 0xa3, 0xd5, 0xbd, 0xac, 0x95, 0x4e, 0xbb, + 0x0a, 0x6d, 0x99, 0x3e, 0x5a, 0x84, 0x1d, 0x3c, 0x56, 0x76, 0x8c, 0xbc, + 0xa3, 0xff, 0xa8, 0xbc, 0xb2, 0x9d, 0x4b, 0x3c, 0xe3, 0x87, 0x8b, 0xbe, + 0x30, 0xe9, 0xe6, 0xbd, 0x97, 0xf3, 0xef, 0xbc, 0x67, 0x40, 0x9f, 0x3e, + 0x7e, 0x95, 0x9c, 0xbd, 0xa1, 0xd7, 0xf4, 0x3d, 0x14, 0x05, 0x44, 0xbd, + 0x32, 0x50, 0x40, 0x3e, 0x7f, 0x4f, 0x0e, 0xbe, 0x24, 0xb4, 0x35, 0xbd, + 0xbb, 0x01, 0x13, 0xbe, 0x75, 0x97, 0x72, 0x3e, 0x72, 0xb5, 0xc4, 0xbc, + 0x2d, 0x03, 0xa3, 0xbe, 0x30, 0x9c, 0x85, 0xbd, 0xe9, 0x8a, 0xdd, 0x3d, + 0x66, 0x85, 0xe1, 0xbd, 0x00, 0x78, 0x16, 0xbe, 0xa6, 0xe0, 0x5d, 0xbd, + 0x39, 0xa7, 0x61, 0x3e, 0x40, 0xe9, 0xfa, 0xbd, 0x03, 0x1a, 0x78, 0x3e, + 0xae, 0x8a, 0x10, 0xbe, 0xff, 0x69, 0x73, 0x3d, 0x83, 0xc1, 0xd1, 0xbd, + 0xe9, 0xdc, 0x01, 0xbe, 0xef, 0xa7, 0x5f, 0x3d, 0x1d, 0xe3, 0x3f, 0x3e, + 0xe2, 0x74, 0x36, 0x3d, 0xda, 0xb4, 0x5d, 0xbe, 0xdf, 0x67, 0x56, 0xbd, + 0x3b, 0xe8, 0xca, 0x3d, 0xdb, 0x14, 0x21, 0xbe, 0x26, 0x0e, 0x21, 0xbe, + 0x70, 0xee, 0xce, 0xbd, 0xce, 0xd1, 0x8d, 0x3e, 0xf7, 0x98, 0xdb, 0xbd, + 0x76, 0xd8, 0x78, 0x3d, 0xd9, 0xc5, 0x25, 0xbe, 0x7b, 0x1e, 0x97, 0x3d, + 0x36, 0x31, 0x11, 0xbe, 0x1b, 0x15, 0x09, 0xbe, 0x20, 0xa6, 0x0b, 0xbb, + 0x25, 0xa1, 0xa0, 0x3e, 0x1b, 0xb2, 0xbb, 0xbd, 0x6d, 0x78, 0x9f, 0xbe, + 0xdf, 0xfb, 0x6a, 0xbd, 0xae, 0xdc, 0xc3, 0xbd, 0xb2, 0xe1, 0x8a, 0xbe, + 0x5a, 0x86, 0x90, 0xbd, 0x36, 0x2c, 0x91, 0xbd, 0xa1, 0x4f, 0x8b, 0x3e, + 0xef, 0x10, 0x11, 0xbd, 0x4e, 0xcc, 0xa8, 0x3d, 0x54, 0xf0, 0x7b, 0xbe, + 0x28, 0x40, 0x60, 0x3d, 0xa8, 0x9b, 0x00, 0x3d, 0xcf, 0xce, 0x28, 0xbd, + 0x3c, 0x31, 0x48, 0x3d, 0x41, 0xa1, 0xa4, 0x3e, 0xa7, 0x2a, 0x8b, 0xbe, + 0xdf, 0xd5, 0xf4, 0xbd, 0xac, 0xc1, 0xa2, 0x3b, 0xc4, 0x44, 0xcf, 0xbc, + 0x4f, 0x37, 0x5b, 0xbe, 0x67, 0xc2, 0x4c, 0xbd, 0x8b, 0x10, 0xb2, 0x3c, + 0x50, 0xe3, 0x26, 0x3e, 0xf8, 0x5e, 0xc2, 0x3d, 0x03, 0x12, 0x05, 0x3e, + 0x62, 0xbd, 0x1f, 0xbe, 0x1c, 0xec, 0xfe, 0x3d, 0x6e, 0x47, 0x50, 0x3d, + 0x60, 0x32, 0x89, 0x3d, 0xac, 0x39, 0x92, 0xbd, 0x23, 0x38, 0x3c, 0x3e, + 0x5f, 0x1e, 0x76, 0x3c, 0x94, 0xe2, 0x19, 0xbd, 0x7a, 0xd7, 0xc8, 0xbc, + 0xd8, 0xe3, 0x91, 0x3b, 0x0d, 0x26, 0x99, 0xbe, 0x2a, 0xad, 0x5d, 0xbe, + 0x94, 0x8e, 0x89, 0x3c, 0x4f, 0x99, 0xe6, 0x3d, 0x38, 0xd7, 0x98, 0x3b, + 0xe2, 0x9d, 0x12, 0x3e, 0xe8, 0xb1, 0x8e, 0xbe, 0x2c, 0x89, 0x28, 0x3e, + 0x8f, 0xd0, 0x3e, 0x3e, 0x22, 0x07, 0x50, 0xbd, 0x01, 0x49, 0xb5, 0xbd, + 0x06, 0x7e, 0x76, 0x3e, 0xaa, 0x8b, 0xa0, 0xbd, 0xa5, 0x43, 0x4a, 0xbc, + 0xe5, 0x64, 0x84, 0xbc, 0x7c, 0xb1, 0x36, 0x3d, 0xae, 0x00, 0xc6, 0xbe, + 0x7f, 0x17, 0x0a, 0xbe, 0xa0, 0x53, 0x3c, 0xbd, 0xb2, 0x43, 0xab, 0x3d, + 0xf2, 0xff, 0xcd, 0x3d, 0x42, 0xde, 0xb6, 0x3e, 0x36, 0x05, 0x07, 0xbf, + 0x2d, 0x47, 0x54, 0xbd, 0x73, 0xa0, 0x21, 0x3e, 0xc1, 0x61, 0x05, 0x3e, + 0x27, 0x6b, 0xcb, 0xbd, 0x9a, 0xe1, 0x5b, 0x3e, 0xfe, 0xdc, 0x33, 0xbd, + 0x12, 0x05, 0x2f, 0x3e, 0x84, 0x79, 0x28, 0xbc, 0x3e, 0x68, 0x66, 0xbe, + 0x7a, 0x0f, 0xb7, 0xbe, 0xcb, 0xff, 0xa6, 0xbe, 0xe1, 0x4c, 0x6c, 0x3d, + 0x10, 0x0f, 0xbe, 0x3e, 0x90, 0xef, 0xd3, 0xbd, 0x20, 0x98, 0x8e, 0x3e, + 0x3f, 0x83, 0xbb, 0xbe, 0x22, 0x0e, 0xc8, 0xbd, 0x5b, 0x94, 0x08, 0x3e, + 0xf7, 0x96, 0x9b, 0x3d, 0x53, 0x44, 0x46, 0xbd, 0x31, 0x47, 0xbc, 0x3d, + 0x4b, 0x9a, 0xee, 0xbd, 0x38, 0xf9, 0x35, 0x3d, 0xce, 0xb3, 0x3e, 0x3d, + 0x9b, 0x95, 0x95, 0x3d, 0xcd, 0x6f, 0xbf, 0xbe, 0x13, 0x43, 0x6a, 0xbe, + 0xa7, 0x4d, 0xe2, 0x3d, 0x76, 0xb4, 0x0f, 0x3f, 0x8e, 0x98, 0xa0, 0xbc, + 0x26, 0x91, 0x33, 0xbe, 0xc6, 0x43, 0x7c, 0xbe, 0xbe, 0x98, 0xd5, 0xbc, + 0x48, 0x72, 0x43, 0x3e, 0xf7, 0x74, 0x88, 0xbc, 0xc2, 0x58, 0xec, 0x3c, + 0xb6, 0x16, 0xa7, 0x3d, 0x17, 0x8c, 0x39, 0x3e, 0x84, 0xf5, 0x00, 0xbe, + 0xc4, 0xa8, 0xe2, 0x3d, 0x56, 0xc9, 0x22, 0x3e, 0xa1, 0x57, 0x96, 0xbe, + 0x06, 0x1c, 0x97, 0xbd, 0xda, 0x24, 0x82, 0x3d, 0xb1, 0xaf, 0x1e, 0xbc, + 0x4c, 0x3d, 0x7e, 0xbe, 0xca, 0xe6, 0xbc, 0x3d, 0xec, 0xd0, 0x93, 0xbd, + 0x13, 0x35, 0xeb, 0xbd, 0xbb, 0x88, 0x0e, 0xbd, 0xeb, 0x2b, 0xf4, 0x3c, + 0x13, 0x20, 0x46, 0x3e, 0x54, 0x9f, 0x78, 0xbd, 0x3d, 0x11, 0x44, 0xbd, + 0xb2, 0x3d, 0xe3, 0xbd, 0x3d, 0x61, 0xa8, 0x3d, 0xa9, 0xf8, 0x10, 0xbd, + 0xe2, 0xdc, 0x94, 0x3d, 0x14, 0x39, 0xde, 0xbd, 0x65, 0xa4, 0xde, 0xbd, + 0x72, 0xdd, 0x92, 0xbd, 0xb3, 0x05, 0x53, 0xbd, 0xcf, 0x8d, 0x1d, 0x3d, + 0x0a, 0x84, 0xa3, 0xbe, 0x5c, 0x03, 0x86, 0xbe, 0x16, 0xb6, 0xcb, 0xbe, + 0x30, 0x14, 0xfd, 0xbe, 0xe8, 0xfe, 0x3f, 0x3d, 0xec, 0x02, 0xc4, 0xbd, + 0x55, 0x4b, 0x99, 0x3c, 0xcb, 0xa5, 0x1e, 0xbd, 0xb4, 0x06, 0x82, 0x3d, + 0x2a, 0xd8, 0x92, 0xbe, 0x49, 0xea, 0xa1, 0xbd, 0x25, 0x78, 0x7b, 0xbe, + 0x34, 0xd6, 0xe8, 0xbd, 0xf3, 0x6a, 0x95, 0xbe, 0xde, 0x0c, 0xa1, 0xbd, + 0x81, 0xac, 0x78, 0x3b, 0x55, 0xa5, 0xd6, 0xbe, 0xfb, 0xfa, 0x65, 0xbe, + 0xd2, 0xa0, 0xb2, 0xbe, 0x01, 0x33, 0x4f, 0xbe, 0xc6, 0xa4, 0x8f, 0x3d, + 0xb4, 0x35, 0x72, 0x3d, 0xfd, 0xfb, 0xc4, 0xbc, 0x8a, 0xc5, 0x02, 0xbc, + 0x2e, 0x81, 0x1b, 0x3d, 0xf1, 0x88, 0x71, 0xbe, 0x10, 0xe7, 0x23, 0xbe, + 0xe5, 0xd4, 0x9b, 0xbd, 0x7e, 0x92, 0x9c, 0xbd, 0x32, 0x5d, 0xa5, 0xbe, + 0x3f, 0x12, 0x10, 0xbd, 0x06, 0xa8, 0xa4, 0xbc, 0x81, 0xe0, 0xb0, 0xbe, + 0x1a, 0xef, 0x5d, 0xbe, 0x15, 0x9b, 0xca, 0xbe, 0xa3, 0xb4, 0x36, 0xbe, + 0x80, 0x96, 0x54, 0xbd, 0x27, 0x41, 0xd4, 0xbc, 0xe1, 0x96, 0x7a, 0x3d, + 0xb0, 0xf1, 0xa4, 0x3d, 0x2e, 0x9f, 0x37, 0x3d, 0x69, 0x19, 0xa0, 0xbe, + 0xb0, 0xd8, 0xae, 0x3d, 0x42, 0x80, 0x0e, 0xbd, 0xbe, 0xbb, 0x8d, 0x3c, + 0x1f, 0x71, 0x93, 0xbe, 0xe5, 0x13, 0xa0, 0xbc, 0x55, 0xb8, 0xcd, 0xbc, + 0x55, 0xf0, 0xc0, 0x3b, 0xba, 0xe0, 0x2c, 0xbe, 0xa5, 0x38, 0xfc, 0xbe, + 0x03, 0x08, 0xdc, 0xbd, 0x8c, 0x72, 0x14, 0xbd, 0xef, 0xd9, 0x67, 0x3c, + 0xc9, 0x03, 0xe0, 0x3d, 0x69, 0xe2, 0xa0, 0x3d, 0xe1, 0x86, 0x06, 0x3d, + 0xa4, 0x52, 0x90, 0xbe, 0xda, 0x56, 0x29, 0xbc, 0x2b, 0x9c, 0xbd, 0x3d, + 0x12, 0xf7, 0xf3, 0xbc, 0x96, 0xad, 0x41, 0xbd, 0xb6, 0x4a, 0x10, 0xbd, + 0x7a, 0xee, 0xb5, 0xbd, 0x88, 0x83, 0xaa, 0x3d, 0xae, 0x03, 0xbd, 0xbe, + 0x4d, 0xaf, 0xe1, 0xbe, 0x32, 0x22, 0x4a, 0x3c, 0x6b, 0xa2, 0x90, 0xbd, + 0x7e, 0x81, 0x95, 0xbd, 0xc7, 0xe1, 0xbc, 0x3d, 0x56, 0x42, 0x7e, 0xbd, + 0xb4, 0xdb, 0xcb, 0x3d, 0xfe, 0x8e, 0x0e, 0xbf, 0x68, 0xe9, 0x60, 0x3e, + 0xea, 0x83, 0xce, 0x3c, 0x04, 0x08, 0x6d, 0xbb, 0xff, 0xb2, 0x38, 0x3d, + 0x26, 0xe2, 0x82, 0x3c, 0x71, 0x20, 0x10, 0xbe, 0x82, 0x64, 0x13, 0x3e, + 0xa7, 0x1a, 0xc6, 0xbe, 0x3e, 0xe8, 0xc7, 0xbe, 0x30, 0x1e, 0xd8, 0x3d, + 0x66, 0x87, 0x50, 0xbe, 0x5d, 0xbf, 0x4b, 0xbe, 0xf9, 0x9e, 0xb8, 0xbd, + 0x22, 0x9e, 0x04, 0x3d, 0x89, 0x8f, 0x7a, 0x3d, 0x4a, 0xd9, 0x15, 0xbe, + 0x4f, 0x77, 0x5e, 0x3e, 0xc0, 0x19, 0x08, 0x3d, 0xe0, 0xd6, 0x47, 0xbd, + 0xfb, 0x2b, 0xb6, 0x3d, 0x64, 0xa3, 0xf1, 0x3c, 0x36, 0xee, 0xd1, 0xbd, + 0x3c, 0x60, 0x60, 0x3d, 0x23, 0xae, 0x75, 0xbe, 0xc8, 0x00, 0x89, 0xbe, + 0xc4, 0x9c, 0x22, 0x3e, 0xc9, 0x29, 0x88, 0xbe, 0xd5, 0x6a, 0xc2, 0xbe, + 0x87, 0x71, 0xca, 0xbd, 0x76, 0x80, 0xa3, 0xbc, 0x84, 0xcf, 0xbc, 0xbd, + 0x4c, 0xac, 0x17, 0xbe, 0xaa, 0xd8, 0x91, 0x3e, 0xa9, 0x44, 0x52, 0x3c, + 0xc0, 0xee, 0xfa, 0xbd, 0x2c, 0x3b, 0x24, 0x3d, 0xc8, 0x0a, 0x8c, 0x3d, + 0x37, 0x10, 0x07, 0x3d, 0x98, 0x78, 0xdf, 0x3d, 0x0c, 0xe2, 0xe5, 0xbd, + 0x2c, 0x38, 0x34, 0xbe, 0xe5, 0x49, 0xb7, 0xbd, 0xc7, 0xcf, 0xd8, 0xbe, + 0x54, 0xf3, 0x6e, 0xbe, 0x2d, 0xbc, 0x19, 0xbe, 0xe4, 0x0f, 0x8d, 0x3d, + 0xf1, 0x48, 0xdc, 0xbd, 0xa2, 0x21, 0xdc, 0x3c, 0x86, 0x4c, 0x9d, 0x3e, + 0x93, 0xcd, 0xe7, 0x3d, 0x30, 0x77, 0xbf, 0xbd, 0xe0, 0xd2, 0x9f, 0xbc, + 0x55, 0x3a, 0x8e, 0x3d, 0xf2, 0x3f, 0x6e, 0xbe, 0xfc, 0xb4, 0x96, 0x3d, + 0xf3, 0xfe, 0xa1, 0xbe, 0x80, 0xf7, 0xfc, 0xbd, 0x34, 0xd4, 0x6c, 0x3d, + 0x31, 0x5b, 0x44, 0xbe, 0xcc, 0x50, 0x45, 0xbe, 0xd0, 0x2b, 0xf4, 0xbd, + 0xf7, 0x13, 0x02, 0xbe, 0x60, 0x08, 0xd7, 0xbd, 0xe5, 0x7e, 0x95, 0x3e, + 0xed, 0x1e, 0x7e, 0x3e, 0x30, 0x5f, 0x10, 0x3d, 0xc7, 0xf2, 0x47, 0xbe, + 0x69, 0x3c, 0x8e, 0x3b, 0xf1, 0xee, 0x51, 0xbd, 0x8e, 0x09, 0x41, 0xbe, + 0x6f, 0x3e, 0xbf, 0x3d, 0x30, 0x8d, 0x09, 0xbe, 0xc1, 0xa9, 0x19, 0xbe, + 0xa7, 0xb8, 0x96, 0xbd, 0x6c, 0xd8, 0x82, 0x3c, 0x45, 0x45, 0x3d, 0xbd, + 0x81, 0xb8, 0x4f, 0xbe, 0xd5, 0xe1, 0x32, 0x3d, 0x26, 0x85, 0x51, 0xbc, + 0x86, 0x09, 0x8b, 0x3e, 0xa3, 0x45, 0x87, 0x3e, 0x50, 0xeb, 0x52, 0x3e, + 0x17, 0xe7, 0x97, 0x3c, 0xc6, 0x63, 0x18, 0xbe, 0x34, 0xff, 0xd4, 0xbc, + 0xf9, 0xdc, 0xe5, 0xbe, 0x4c, 0x05, 0x86, 0x3d, 0xee, 0x91, 0xf2, 0xbc, + 0x9f, 0x83, 0xfa, 0xbc, 0x02, 0x38, 0x9e, 0xbd, 0x7c, 0x8a, 0xfe, 0xbc, + 0x9a, 0x13, 0x02, 0xbe, 0xc3, 0xcf, 0x08, 0xbe, 0x49, 0xfb, 0x0d, 0x3d, + 0x17, 0xf6, 0x29, 0xbd, 0x88, 0x7a, 0xdd, 0x3e, 0x6f, 0x3b, 0x01, 0x3e, + 0x19, 0xdd, 0x5b, 0x3e, 0x47, 0xbc, 0x19, 0xbd, 0x43, 0xc4, 0x9a, 0xbd, + 0xdd, 0x16, 0x82, 0x3d, 0xd4, 0x08, 0x89, 0xbe, 0x1f, 0xb5, 0xd8, 0xbe, + 0x5a, 0x44, 0x69, 0x3d, 0x35, 0x15, 0x60, 0xbe, 0x06, 0x34, 0x9e, 0xbe, + 0xff, 0x5a, 0xa1, 0x3e, 0x61, 0x69, 0x86, 0xbe, 0x90, 0xee, 0x8a, 0xbd, + 0x4a, 0x55, 0x36, 0xbe, 0x43, 0x71, 0x57, 0x3d, 0xaa, 0xcb, 0x0e, 0xbf, + 0xb4, 0x91, 0x35, 0xbf, 0x6f, 0x5b, 0x0f, 0xbf, 0x40, 0x82, 0x03, 0x3e, + 0x07, 0x78, 0x98, 0xbe, 0xc2, 0x15, 0x90, 0xbe, 0xf9, 0x72, 0xaa, 0xbe, + 0xe2, 0x17, 0x9c, 0xbe, 0x08, 0x3e, 0xa9, 0x3d, 0x9f, 0xae, 0x1a, 0xbf, + 0xf0, 0xf7, 0x28, 0xbf, 0xe1, 0x8b, 0xfc, 0x3d, 0x5b, 0xb5, 0xec, 0xbe, + 0x64, 0x14, 0xa9, 0x3c, 0x5f, 0x3a, 0xdb, 0xbc, 0xc2, 0xc8, 0xd3, 0xbd, + 0x1d, 0xa2, 0x52, 0xbf, 0x8d, 0x06, 0x85, 0x3d, 0x59, 0xfc, 0xaf, 0xbe, + 0xab, 0xa1, 0xb0, 0x3c, 0x4d, 0xa0, 0x2f, 0xbe, 0x04, 0x1f, 0xd3, 0xbb, + 0x20, 0x49, 0xe2, 0xbc, 0x12, 0xc7, 0x02, 0x3d, 0x76, 0x89, 0x31, 0x3e, + 0xb6, 0x83, 0x48, 0x3d, 0x40, 0xc8, 0xcf, 0xbe, 0xa3, 0x9e, 0xdb, 0x3d, + 0x2f, 0x47, 0x2a, 0x3e, 0xa8, 0xf7, 0x8d, 0xbf, 0xfc, 0x3a, 0x25, 0x3d, + 0x82, 0x9c, 0xb3, 0xbd, 0xe4, 0x25, 0x05, 0x3e, 0x56, 0x7d, 0xc0, 0xbe, + 0x7c, 0xec, 0x9f, 0x3d, 0x48, 0x59, 0x8e, 0xbd, 0xcd, 0x4b, 0x91, 0x3e, + 0x53, 0x6e, 0x0d, 0x3e, 0x91, 0x99, 0x93, 0x3e, 0x54, 0x9c, 0x16, 0xbe, + 0x68, 0x8f, 0xbf, 0x3d, 0xbd, 0xef, 0xa1, 0x3d, 0xc4, 0x83, 0xcf, 0x3b, + 0xd6, 0xc4, 0xc1, 0xbe, 0x11, 0x47, 0x3e, 0x3e, 0x37, 0x5c, 0xf5, 0xbd, + 0xc2, 0x27, 0xdb, 0x3d, 0x5d, 0x79, 0x97, 0xbd, 0x98, 0xf2, 0x0c, 0x3d, + 0x6c, 0xa6, 0xaa, 0xbe, 0xd9, 0x30, 0xb5, 0xbd, 0x90, 0x05, 0x01, 0x3a, + 0xf1, 0x8f, 0x35, 0x3e, 0x82, 0x5d, 0xfd, 0xbc, 0xc7, 0xf8, 0x54, 0x3e, + 0x9e, 0xe1, 0xd8, 0xbc, 0xba, 0x9d, 0x23, 0x3e, 0xc5, 0x87, 0x06, 0x3e, + 0x6b, 0xe7, 0xee, 0x3c, 0xae, 0x75, 0x2a, 0xbe, 0x9b, 0xf5, 0x2c, 0x3e, + 0xc5, 0x58, 0x9d, 0xbc, 0x4b, 0x3b, 0xbb, 0x3c, 0x96, 0x33, 0x7a, 0x3c, + 0xd7, 0xd3, 0xab, 0xbe, 0x33, 0x03, 0x5e, 0xbe, 0x24, 0xe4, 0x2c, 0x3d, + 0xc6, 0x66, 0x09, 0xbc, 0x6f, 0x16, 0x8e, 0x3e, 0xd1, 0x41, 0x07, 0x3b, + 0x25, 0xcc, 0x40, 0x3e, 0xe2, 0x18, 0x0f, 0x3d, 0x15, 0xe8, 0x82, 0x3e, + 0x41, 0x69, 0xdb, 0x3d, 0xe1, 0x27, 0x37, 0xbe, 0x00, 0x5b, 0x9d, 0xbe, + 0xcb, 0xdb, 0x40, 0x3e, 0xe1, 0x3c, 0xea, 0xbb, 0x0e, 0x61, 0x30, 0xbc, + 0xba, 0x37, 0x95, 0x3d, 0xfd, 0x17, 0xf3, 0xbe, 0xc2, 0x74, 0x50, 0xbe, + 0x9a, 0x7a, 0x7e, 0xbd, 0x30, 0x34, 0xc3, 0x3d, 0x54, 0xe2, 0xc3, 0x3e, + 0x6d, 0xa6, 0x9a, 0x3d, 0xaf, 0xa2, 0x88, 0x3e, 0xd8, 0x11, 0x71, 0x3d, + 0x4b, 0xa8, 0x26, 0x3e, 0xb8, 0x2f, 0xeb, 0x3b, 0x65, 0x63, 0x2b, 0xbd, + 0x92, 0xd3, 0x37, 0x3c, 0x95, 0xf0, 0xa6, 0x3e, 0x00, 0x6a, 0x15, 0xbe, + 0x36, 0x55, 0x37, 0x3d, 0x1d, 0x59, 0x4d, 0x3d, 0x7c, 0xdf, 0x91, 0xbe, + 0xa2, 0x6b, 0x6f, 0xbe, 0x27, 0x4b, 0xe2, 0x3c, 0x1a, 0x00, 0x50, 0xbc, + 0xe9, 0x40, 0x9e, 0x3e, 0x99, 0xaa, 0x01, 0xbe, 0xc2, 0x58, 0x70, 0xbb, + 0x83, 0x8c, 0xd9, 0x3c, 0x0d, 0x3e, 0xe6, 0x3d, 0xf1, 0x6f, 0x81, 0x3d, + 0xcb, 0x83, 0x7b, 0x3c, 0x78, 0xff, 0x3b, 0xbd, 0xe1, 0xae, 0x79, 0x3e, + 0x27, 0x72, 0x85, 0xbc, 0x72, 0xb1, 0x0a, 0xbe, 0xda, 0xc6, 0x8a, 0x3b, + 0x6b, 0xe5, 0x14, 0xbe, 0xaf, 0x70, 0x9e, 0xbd, 0xa2, 0xba, 0xc3, 0x3d, + 0x3e, 0x64, 0x10, 0xbd, 0x6c, 0xe2, 0x94, 0x3e, 0x65, 0x6a, 0x08, 0xbd, + 0x70, 0x66, 0x9a, 0x3e, 0x9e, 0x96, 0xd4, 0xbd, 0xb3, 0xcd, 0x70, 0x3e, + 0x93, 0x7a, 0x0f, 0x3e, 0x8c, 0x94, 0xfa, 0xbd, 0xa4, 0x90, 0x63, 0xbd, + 0xcb, 0x07, 0x88, 0x3e, 0x06, 0xab, 0x48, 0x3d, 0x44, 0x5b, 0x3e, 0x3e, + 0x7f, 0xd6, 0x6c, 0xbb, 0x04, 0xed, 0xf0, 0xbc, 0xe4, 0xc3, 0x7c, 0xbe, + 0x26, 0x94, 0x2c, 0xbd, 0x4a, 0x27, 0xcc, 0x3c, 0xfc, 0xc2, 0x92, 0x3e, + 0x82, 0x1b, 0x27, 0xbd, 0x9a, 0xf4, 0x9b, 0x3e, 0x36, 0x53, 0x8b, 0xbe, + 0x0f, 0x9c, 0x8c, 0x3e, 0x2f, 0x68, 0x99, 0x3d, 0x20, 0x62, 0xaa, 0x3c, + 0xbb, 0x1e, 0x6f, 0xbc, 0x9d, 0x1f, 0x4b, 0x3e, 0x54, 0x7f, 0x45, 0xbe, + 0x9b, 0xba, 0xb5, 0x3c, 0x4b, 0x19, 0x2b, 0x3c, 0x99, 0xe6, 0xb7, 0x3c, + 0x0b, 0x45, 0x23, 0xbe, 0x78, 0xd6, 0x2a, 0x3d, 0x02, 0xe2, 0x07, 0x3e, + 0xd6, 0x26, 0x66, 0x3e, 0x3a, 0x28, 0x2b, 0xbe, 0x45, 0x77, 0x36, 0x3e, + 0x2e, 0xf3, 0xf6, 0xbd, 0xb9, 0x28, 0xea, 0x3d, 0x74, 0xdf, 0xdb, 0x3d, + 0x15, 0x69, 0x82, 0x3a, 0xe2, 0x89, 0xa1, 0x3c, 0x04, 0xfe, 0xb6, 0x3e, + 0xc2, 0x5b, 0x1c, 0x3e, 0x73, 0x7a, 0x08, 0xbd, 0x4d, 0x50, 0x0e, 0x3d, + 0xa0, 0x55, 0xb3, 0xbd, 0x18, 0x24, 0x1d, 0xbe, 0xbc, 0x5b, 0xd1, 0xbd, + 0xcc, 0xb0, 0xd9, 0x3d, 0xa1, 0x2c, 0x95, 0x3d, 0x79, 0x70, 0x08, 0xbe, + 0xeb, 0x53, 0x18, 0x3e, 0xc5, 0x8d, 0x43, 0xbd, 0x5d, 0xa3, 0x6e, 0x3d, + 0x66, 0x05, 0x0f, 0x3e, 0xa4, 0x01, 0x8b, 0xbd, 0x57, 0xb8, 0x47, 0xbd, + 0xe8, 0x97, 0x8a, 0x3e, 0x77, 0x52, 0x13, 0xbd, 0x40, 0xa2, 0xae, 0x3d, + 0x8f, 0xbc, 0xd4, 0x3a, 0x8b, 0x08, 0xd4, 0xbd, 0x56, 0x1a, 0x44, 0xbe, + 0x22, 0x87, 0x35, 0xbd, 0xb1, 0x29, 0xa9, 0xbc, 0xfe, 0x06, 0x8c, 0x3e, + 0xca, 0x88, 0x38, 0xbd, 0xba, 0xdd, 0x04, 0x3e, 0x66, 0x0b, 0xa9, 0xbe, + 0x9d, 0xa8, 0x9d, 0xbe, 0x55, 0x60, 0x32, 0x3b, 0x7d, 0x09, 0x09, 0x3e, + 0x4f, 0xb5, 0x3f, 0xbc, 0x71, 0x79, 0xde, 0x3e, 0x2d, 0xe9, 0x38, 0xbe, + 0x9a, 0x4c, 0x76, 0xbd, 0xa2, 0xe8, 0xa0, 0xbc, 0xf4, 0xc7, 0x10, 0xbd, + 0x71, 0x07, 0x20, 0x3c, 0x6d, 0xc8, 0x46, 0x3d, 0x44, 0x3c, 0x16, 0xbd, + 0xfb, 0x5a, 0x5a, 0x3e, 0x43, 0x01, 0xe0, 0xbe, 0x2e, 0xbf, 0x41, 0xbf, + 0x14, 0x7f, 0x1e, 0xbf, 0xcf, 0x88, 0x4d, 0xbf, 0x85, 0xb0, 0xa6, 0xbe, + 0x65, 0xd0, 0x9a, 0x3d, 0xad, 0xbe, 0x1c, 0xbc, 0xfa, 0xc1, 0x85, 0x3d, + 0xfc, 0x72, 0xae, 0xbd, 0x14, 0xf5, 0xc8, 0xbd, 0x0c, 0x20, 0x08, 0x3d, + 0xe8, 0x35, 0x63, 0x3e, 0xc0, 0xf5, 0x74, 0x3d, 0x8b, 0xd5, 0x0d, 0xbf, + 0x3d, 0x94, 0x4b, 0x3d, 0x69, 0xff, 0x33, 0xbe, 0x6f, 0xb7, 0x81, 0xbf, + 0x2a, 0x05, 0x5e, 0xbf, 0x21, 0x19, 0x94, 0xbe, 0x34, 0x2a, 0xed, 0xbe, + 0x10, 0xf1, 0x03, 0xbf, 0x40, 0xf0, 0x80, 0xbf, 0x08, 0x44, 0x1e, 0xbd, + 0x0d, 0x59, 0x46, 0xbf, 0x31, 0xa6, 0xb3, 0xbe, 0x58, 0x5d, 0xc4, 0xbe, + 0x1a, 0x05, 0x10, 0xbd, 0xa7, 0xe6, 0xe1, 0x3e, 0xf7, 0x06, 0xb9, 0xbe, + 0xce, 0xf0, 0xa0, 0xbf, 0xf4, 0xcf, 0x85, 0xbc, 0x3a, 0xe2, 0x82, 0xbe, + 0xfd, 0x85, 0x73, 0xbf, 0x24, 0x22, 0x55, 0xbf, 0x49, 0xad, 0x20, 0xbf, + 0x90, 0x58, 0x3f, 0xbc, 0x5d, 0xbf, 0xb4, 0xbe, 0x23, 0x4b, 0x61, 0xbf, + 0x4a, 0x9a, 0x4d, 0x3c, 0x7a, 0x20, 0x3d, 0xbf, 0xfd, 0x8c, 0xa1, 0x3b, + 0xc4, 0x15, 0x0e, 0xbe, 0x2a, 0xb8, 0x56, 0xbc, 0xb5, 0x41, 0x0c, 0x3f, + 0xf6, 0xfa, 0xcf, 0xbe, 0x3b, 0x1c, 0xfc, 0xbe, 0xb5, 0x8b, 0x24, 0xbd, + 0xca, 0xe0, 0xfd, 0x3e, 0x2a, 0xf3, 0xc9, 0x3e, 0x58, 0x8b, 0x1a, 0x3b, + 0x06, 0x37, 0x0f, 0x3f, 0xe5, 0x79, 0x5a, 0xbe, 0xcb, 0x6c, 0xa5, 0x3d, + 0x61, 0xa0, 0xc6, 0x3e, 0x86, 0x27, 0xbc, 0x3c, 0xee, 0x51, 0x4b, 0xbe, + 0x88, 0x4a, 0x0d, 0x3f, 0x16, 0x0e, 0x82, 0xbe, 0xca, 0xd9, 0xcd, 0xbd, + 0x53, 0x26, 0xec, 0x3e, 0x67, 0xa6, 0x89, 0x3e, 0x3e, 0x89, 0x21, 0x3d, + 0x89, 0x94, 0x8a, 0xba, 0x4e, 0xbc, 0x99, 0xbe, 0xb9, 0xf0, 0xdc, 0x3d, + 0x4b, 0x61, 0xa7, 0xbe, 0x5a, 0x3c, 0x2e, 0xbe, 0xa8, 0x2e, 0x82, 0x3e, + 0x68, 0x10, 0x85, 0xbd, 0x28, 0x23, 0x7c, 0xbe, 0x82, 0x7b, 0x01, 0x3e, + 0xc1, 0xc3, 0x1b, 0xbe, 0x60, 0x8b, 0xc5, 0x3e, 0xda, 0x55, 0xb1, 0xbd, + 0xd7, 0x46, 0x29, 0x3d, 0x8e, 0xff, 0xcd, 0x3d, 0xf1, 0xac, 0xe3, 0xbd, + 0x72, 0x78, 0x43, 0xbe, 0xd3, 0xed, 0x52, 0x3e, 0x6d, 0x9e, 0xe8, 0xbe, + 0x79, 0x9a, 0x9a, 0x3d, 0x98, 0xf6, 0x63, 0xbe, 0x0c, 0x7c, 0xbf, 0xbe, + 0x83, 0x45, 0x9a, 0x3e, 0x1d, 0x35, 0x0b, 0xbe, 0xc5, 0x00, 0x67, 0x3b, + 0x75, 0x3e, 0xf4, 0x3d, 0x77, 0x2b, 0x1b, 0xbe, 0xa5, 0xff, 0xeb, 0xbc, + 0xb6, 0xb3, 0x74, 0x3e, 0x52, 0xbf, 0x3d, 0xbd, 0x7a, 0xdc, 0x2d, 0xbe, + 0x8a, 0x5b, 0x3d, 0xbe, 0xfb, 0x30, 0x6d, 0xbe, 0x67, 0xd8, 0x35, 0x3e, + 0x0e, 0x72, 0xb8, 0xbe, 0xd2, 0x0a, 0x80, 0x3a, 0x43, 0x8b, 0x8d, 0x3d, + 0xd9, 0x8f, 0x9a, 0xbe, 0xba, 0x80, 0x8a, 0x3e, 0xc7, 0x1b, 0x02, 0xbd, + 0x2a, 0xae, 0x80, 0xbb, 0x31, 0x31, 0x08, 0x3e, 0x55, 0x75, 0x2f, 0xbe, + 0xad, 0xc6, 0x48, 0xbd, 0x43, 0x03, 0x7e, 0x3e, 0x48, 0xe4, 0xb8, 0xbd, + 0x75, 0xc6, 0xe8, 0xbd, 0x06, 0x3c, 0xa1, 0xbd, 0xd7, 0xa2, 0xc2, 0x3d, + 0xe5, 0x47, 0x07, 0x3e, 0xa6, 0x42, 0xdb, 0xbe, 0x6b, 0xbf, 0x05, 0xbe, + 0x84, 0x62, 0xc7, 0xbd, 0xb7, 0x2e, 0x97, 0xbe, 0xdc, 0x29, 0x9e, 0x3e, + 0x3b, 0xc5, 0x0a, 0x3d, 0x78, 0xd2, 0x28, 0xbd, 0x41, 0x00, 0x0b, 0xbc, + 0x08, 0xcc, 0xc4, 0xbc, 0xa2, 0x88, 0xe0, 0xbd, 0x23, 0x48, 0xb0, 0x3e, + 0x00, 0x0e, 0x2f, 0xbe, 0x69, 0xb0, 0x84, 0x3d, 0x20, 0x9d, 0x83, 0xbd, + 0x53, 0xe3, 0xa6, 0xbc, 0x99, 0x74, 0xd1, 0x3d, 0x36, 0x33, 0x8d, 0xbe, + 0x35, 0x2e, 0xfe, 0xbc, 0xd4, 0xea, 0xf6, 0xbc, 0xc2, 0xf9, 0x90, 0xbe, + 0x72, 0x67, 0xa7, 0x3d, 0x44, 0xae, 0x08, 0x3e, 0xed, 0x6f, 0x49, 0x3d, + 0xed, 0xe3, 0xa4, 0xbd, 0xc8, 0x11, 0x25, 0x3d, 0xc0, 0x7b, 0x30, 0xbd, + 0x80, 0x6e, 0xf7, 0x3d, 0xb9, 0xe9, 0x94, 0xbe, 0x12, 0x80, 0xba, 0x3d, + 0x03, 0xfb, 0xac, 0xbc, 0xbe, 0x53, 0xf4, 0xbc, 0x8c, 0x26, 0x27, 0xbd, + 0x71, 0x13, 0xc7, 0xbe, 0x6e, 0xc5, 0x02, 0xbe, 0x54, 0x9d, 0x23, 0x3d, + 0xa5, 0xba, 0x39, 0xbe, 0xf0, 0x26, 0x52, 0x3d, 0xfe, 0xf6, 0xc9, 0x3d, + 0x94, 0x18, 0xa8, 0x3d, 0xe6, 0xd3, 0x1c, 0xbe, 0x9a, 0xd2, 0xe6, 0xbd, + 0xbc, 0xb0, 0x1d, 0xbd, 0x22, 0x0a, 0xb0, 0x3d, 0x09, 0x0f, 0x74, 0xbe, + 0x22, 0x36, 0xde, 0x3d, 0xab, 0xc6, 0x20, 0x3d, 0x5b, 0xeb, 0xd1, 0xbd, + 0xaf, 0x09, 0x1a, 0xbd, 0xaa, 0x83, 0x31, 0xbe, 0x2d, 0x9d, 0xbd, 0xbc, + 0x8f, 0xca, 0xb6, 0xbd, 0x8c, 0xa0, 0x4a, 0xbe, 0x4b, 0x67, 0xfa, 0x3d, + 0x3f, 0x99, 0x01, 0x3e, 0x0e, 0x64, 0xa5, 0x3d, 0xe3, 0xe9, 0xd3, 0xba, + 0x9d, 0x09, 0x6a, 0xbc, 0x28, 0x4f, 0x82, 0x3e, 0xe3, 0x4c, 0x0a, 0x3e, + 0x44, 0xfd, 0x6e, 0xbd, 0x94, 0xfc, 0xa0, 0x3d, 0x8e, 0x35, 0x83, 0x3d, + 0xef, 0x14, 0xea, 0xbc, 0x4b, 0xf9, 0x10, 0xbd, 0x42, 0x43, 0x8e, 0xbd, + 0x0b, 0x78, 0x3b, 0xbd, 0x0d, 0xc8, 0x2f, 0xbd, 0x43, 0xc0, 0xb1, 0xbe, + 0xf4, 0x92, 0x85, 0x3e, 0xfd, 0x10, 0xea, 0x3d, 0x3f, 0xa1, 0x89, 0x3d, + 0xb9, 0xd2, 0x2a, 0xbd, 0x6c, 0xfd, 0x99, 0xbe, 0x68, 0xf0, 0x22, 0x3e, + 0x4e, 0x3b, 0xf8, 0xbd, 0x6a, 0xa0, 0x18, 0xbe, 0x91, 0xee, 0x1d, 0xbd, + 0x48, 0x14, 0x0e, 0x3d, 0x64, 0x2b, 0xb2, 0xbd, 0x47, 0x34, 0xad, 0x3c, + 0xb1, 0x9c, 0xe7, 0xbd, 0xd0, 0x9a, 0x8b, 0x3d, 0xc6, 0x5b, 0xe5, 0x3d, + 0xa5, 0x1f, 0x21, 0xbe, 0x0a, 0x26, 0x0b, 0x3e, 0xa4, 0x1a, 0x5a, 0xbd, + 0x3e, 0x53, 0xe8, 0xbd, 0xda, 0xb5, 0xc9, 0x3b, 0xc0, 0x68, 0x53, 0xbe, + 0x85, 0x31, 0x9a, 0x3e, 0xf9, 0x64, 0x1a, 0x3e, 0xe0, 0x4a, 0x35, 0xbd, + 0xe8, 0xaa, 0xa0, 0xbd, 0xac, 0xf7, 0xbd, 0x3d, 0xbf, 0xbd, 0x1a, 0xbe, + 0x71, 0x3e, 0x41, 0x3d, 0x5c, 0x55, 0xfb, 0xbd, 0x4b, 0x79, 0xe0, 0x3d, + 0xc1, 0x0e, 0x87, 0x3d, 0xac, 0xfa, 0x83, 0xbd, 0x1c, 0x1b, 0x1e, 0x3e, + 0xcd, 0xe6, 0xa7, 0x3d, 0xdd, 0x2a, 0xa3, 0xbd, 0xd2, 0x48, 0xc0, 0x3c, + 0x4e, 0x4a, 0xd5, 0xbe, 0x61, 0xa2, 0x16, 0x3e, 0x97, 0xe6, 0x82, 0xbc, + 0x79, 0x7e, 0xaf, 0xbd, 0x3b, 0x1a, 0xfb, 0x3d, 0xc9, 0x30, 0x3d, 0x3e, + 0x3d, 0x27, 0x86, 0xbe, 0xd1, 0x31, 0x5f, 0x3e, 0x42, 0xfc, 0x99, 0xbe, + 0xe0, 0x82, 0xc3, 0x3d, 0x91, 0x85, 0xd1, 0x3d, 0x95, 0xbf, 0xea, 0x3c, + 0x39, 0x19, 0xe4, 0x3d, 0x4f, 0x40, 0x17, 0xbe, 0x5b, 0x8f, 0xd8, 0xbd, + 0x16, 0x8b, 0x63, 0xbd, 0xd5, 0x12, 0xa1, 0x3b, 0xc0, 0xd5, 0x68, 0x3c, + 0x55, 0x96, 0xb8, 0xbd, 0xbc, 0xf3, 0x9d, 0xbe, 0xf8, 0x79, 0xd5, 0x3d, + 0xac, 0x1a, 0xd5, 0x3d, 0xd0, 0x00, 0x14, 0xbd, 0xca, 0x1d, 0xad, 0xba, + 0x79, 0xed, 0x2c, 0xbe, 0xc4, 0x05, 0xc6, 0xbc, 0x0d, 0x1c, 0xf7, 0x3d, + 0xd8, 0xd0, 0x8f, 0xbd, 0x79, 0x0e, 0xba, 0x3d, 0x3c, 0x33, 0x30, 0x3d, + 0x2c, 0x08, 0xbf, 0xbd, 0x4a, 0x7a, 0x71, 0xbd, 0xc2, 0x3b, 0x45, 0xbc, + 0x7a, 0xac, 0x8e, 0xbe, 0x13, 0x06, 0xa9, 0xbd, 0x0e, 0xd4, 0x3b, 0xbe, + 0xc5, 0x4b, 0x47, 0x3d, 0x90, 0xb5, 0x85, 0xbd, 0xe5, 0xce, 0x0f, 0xbe, + 0x02, 0xae, 0xc7, 0x3c, 0xc1, 0x9c, 0x4d, 0xbe, 0x60, 0x07, 0x8f, 0x3d, + 0xa0, 0x57, 0x78, 0xbd, 0x48, 0x93, 0x86, 0x3e, 0xe4, 0xed, 0xfb, 0xbd, + 0x6e, 0x57, 0x74, 0x3d, 0x85, 0x53, 0x01, 0xbd, 0x56, 0xaf, 0xff, 0xbd, + 0xfe, 0xe2, 0x07, 0x3e, 0x13, 0xb4, 0xdb, 0xbd, 0xfb, 0x89, 0x9f, 0xbe, + 0x74, 0xb9, 0xe2, 0xbd, 0x4b, 0xac, 0x8c, 0x3e, 0xf8, 0x2a, 0x8d, 0xbd, + 0x76, 0x7d, 0x08, 0xbe, 0x39, 0xc8, 0x84, 0x3d, 0x62, 0x02, 0xe9, 0xbd, + 0xb0, 0x1c, 0xfc, 0x3a, 0x52, 0x7e, 0x06, 0xbd, 0xec, 0xf1, 0xce, 0xbc, + 0x00, 0x3b, 0xc3, 0x3c, 0x08, 0x4e, 0x3e, 0x3d, 0x5c, 0x19, 0x45, 0xbe, + 0xbb, 0x06, 0xbd, 0xbd, 0x9d, 0xbb, 0xf7, 0xba, 0x9c, 0xa5, 0x87, 0x3b, + 0x1a, 0x83, 0x85, 0xbd, 0xa3, 0x38, 0xeb, 0xbc, 0x83, 0x65, 0xdc, 0x3d, + 0x5c, 0x8d, 0x0e, 0x3e, 0xcf, 0x7f, 0xe6, 0x3b, 0x7d, 0x2c, 0xaf, 0xbd, + 0x9c, 0xc5, 0xaf, 0x3c, 0xd7, 0x6a, 0xc7, 0xbc, 0x7a, 0xc2, 0x48, 0xbe, + 0xfc, 0x1a, 0x0e, 0x3d, 0x9e, 0x97, 0x3e, 0x3d, 0xf1, 0x34, 0xd0, 0xba, + 0xbb, 0x60, 0xee, 0xbd, 0x85, 0x2f, 0xec, 0xbd, 0x8e, 0x6f, 0x7b, 0x3c, + 0xb9, 0x28, 0xfc, 0xbd, 0x4d, 0x84, 0x6b, 0xbe, 0x26, 0x35, 0x4c, 0xbd, + 0x8a, 0xe9, 0x2f, 0xbd, 0x2a, 0x11, 0x1c, 0xbe, 0xbb, 0x7e, 0x08, 0xbe, + 0xf6, 0x73, 0x81, 0xbe, 0x36, 0xfd, 0x11, 0xbd, 0x6a, 0x85, 0xcf, 0xbd, + 0x64, 0x9f, 0x93, 0xbd, 0xb8, 0xfe, 0xff, 0xbd, 0x4f, 0xa5, 0x19, 0xbe, + 0xd9, 0x9b, 0x34, 0xbe, 0x17, 0xac, 0xdb, 0x3a, 0x2d, 0x1c, 0xa1, 0xbd, + 0x22, 0x94, 0x90, 0x3c, 0xcb, 0xa9, 0x6d, 0xbb, 0x84, 0xad, 0x9e, 0x3d, + 0xfd, 0x9a, 0x11, 0xbe, 0x93, 0xaa, 0x13, 0x3d, 0x42, 0x61, 0x8b, 0xbd, + 0x5d, 0x21, 0x28, 0xbe, 0x15, 0x7b, 0xd2, 0xbd, 0xf5, 0x7e, 0x54, 0x3d, + 0xc1, 0x76, 0x81, 0x3d, 0x45, 0x13, 0xe7, 0xbd, 0xac, 0x4f, 0x12, 0x3d, + 0x8f, 0x1c, 0x0e, 0x3c, 0xb3, 0x6d, 0x70, 0x3c, 0x6b, 0xfa, 0xdc, 0xbb, + 0xd6, 0xab, 0xf9, 0xbc, 0x49, 0x49, 0xf7, 0xbc, 0x4b, 0x50, 0x59, 0xbd, + 0x10, 0x1e, 0xb0, 0xbd, 0x43, 0x71, 0x39, 0xbd, 0xd5, 0xe0, 0xc1, 0xbd, + 0x33, 0xc2, 0x5f, 0x3d, 0x48, 0xa7, 0x4a, 0xbe, 0xef, 0x8d, 0x35, 0xbe, + 0xa1, 0x9e, 0x3c, 0xbd, 0xb0, 0x3a, 0xa5, 0xbd, 0xa8, 0x9d, 0xa1, 0x3d, + 0x61, 0xb0, 0x73, 0x3d, 0xdb, 0x36, 0xbd, 0x3d, 0xa1, 0xc1, 0x03, 0xbd, + 0xde, 0x98, 0xac, 0xbd, 0xe1, 0x5a, 0xd4, 0x3d, 0x87, 0x04, 0xa1, 0xbd, + 0x22, 0xcf, 0x2f, 0x3d, 0xae, 0xf3, 0xc2, 0xbd, 0x7d, 0xe0, 0x30, 0xbe, + 0x1d, 0x36, 0x03, 0xbe, 0xc3, 0x86, 0xb1, 0x3d, 0x00, 0xf1, 0xbb, 0xbd, + 0x5f, 0x98, 0x56, 0xbd, 0xdd, 0xcd, 0x06, 0xbe, 0xcf, 0x6e, 0xa5, 0x3b, + 0xaa, 0xa0, 0x88, 0xbd, 0x99, 0x87, 0x56, 0xbe, 0x59, 0xce, 0x37, 0x3d, + 0xc6, 0x1e, 0x9c, 0xbb, 0xf9, 0x24, 0x1f, 0xbe, 0x6e, 0xee, 0x89, 0x3d, + 0xa5, 0xd5, 0xe8, 0xbb, 0xde, 0x47, 0x7d, 0xbd, 0xe3, 0x46, 0x26, 0xbe, + 0x8b, 0x42, 0xc7, 0x3d, 0xb5, 0xc8, 0xc6, 0xbd, 0x58, 0xc1, 0xc3, 0xbd, + 0x4d, 0x67, 0x4f, 0x3d, 0x9f, 0xdd, 0x2b, 0xbe, 0x13, 0x24, 0x02, 0xbd, + 0x8c, 0x30, 0x2a, 0xbd, 0x99, 0x30, 0x54, 0x3c, 0x86, 0xce, 0xa4, 0x3c, + 0x3c, 0xea, 0x1b, 0x3c, 0x18, 0x20, 0x00, 0x3d, 0xf5, 0x1d, 0x0a, 0xbc, + 0x3f, 0xc0, 0x74, 0x3d, 0x5a, 0x4f, 0xf4, 0xbb, 0x1e, 0x77, 0xc5, 0xbd, + 0xee, 0x16, 0xe4, 0xbd, 0xb5, 0xb4, 0x60, 0x3d, 0x25, 0xa2, 0xed, 0xbd, + 0x97, 0x7d, 0x9e, 0xbd, 0xc9, 0xd4, 0x36, 0xbd, 0xbf, 0x1b, 0xa6, 0x3c, + 0x6e, 0xb9, 0x27, 0x3d, 0xe8, 0x11, 0x2e, 0x3d, 0xa5, 0xae, 0xbd, 0xbd, + 0xdd, 0xfa, 0x04, 0xbd, 0xe6, 0x01, 0xe5, 0xbd, 0x03, 0x43, 0x65, 0x3d, + 0x36, 0xf4, 0x34, 0xbd, 0xc8, 0x33, 0xd1, 0xbd, 0x06, 0x06, 0x1c, 0xbe, + 0x17, 0x94, 0xb7, 0x3b, 0x64, 0x11, 0x01, 0xbe, 0xdf, 0xb1, 0xe6, 0xbd, + 0xa5, 0x78, 0x3b, 0xbe, 0x0d, 0x16, 0x58, 0xbd, 0x4b, 0xbc, 0xd4, 0x3c, + 0x92, 0x23, 0x52, 0xbe, 0x0d, 0x3f, 0x15, 0xbe, 0x8c, 0xd3, 0x52, 0xbe, + 0x00, 0xa4, 0x35, 0x3b, 0x37, 0x84, 0xa5, 0x3d, 0xdf, 0xe3, 0x02, 0xbe, + 0xbd, 0x99, 0x0f, 0xbe, 0x9d, 0x37, 0x33, 0xbe, 0x87, 0xd1, 0xfd, 0x3d, + 0xcb, 0x26, 0x39, 0xbe, 0x5d, 0x3f, 0x0e, 0xbe, 0xe6, 0xb1, 0x2d, 0xbe, + 0x4c, 0x00, 0x7d, 0xbd, 0xf7, 0x32, 0xd8, 0x3b, 0xc5, 0xcf, 0x86, 0x3d, + 0x60, 0x62, 0xa8, 0xbd, 0x44, 0x0d, 0x2f, 0xbe, 0xed, 0x1e, 0xf9, 0x3d, + 0x4d, 0x79, 0x51, 0xbe, 0x22, 0xdd, 0x50, 0xbe, 0x74, 0x3b, 0x1e, 0xbe, + 0xe1, 0x4f, 0x77, 0xbd, 0x00, 0x02, 0x1d, 0xbe, 0x07, 0x5f, 0x44, 0xbd, + 0x44, 0x3f, 0xb8, 0x3c, 0x9d, 0x95, 0xa9, 0xbb, 0x4a, 0xe8, 0x55, 0x3d, + 0xfd, 0x6e, 0x5d, 0x3d, 0xcd, 0x7c, 0x20, 0xbe, 0xb5, 0x23, 0xa2, 0x3d, + 0x92, 0xc8, 0x84, 0x3d, 0xa4, 0x4a, 0x3f, 0xbe, 0xae, 0xd7, 0x75, 0xbd, + 0x46, 0x5e, 0xc4, 0xbd, 0xb9, 0xe0, 0x24, 0xbd, 0x2a, 0xba, 0x83, 0xbd, + 0xdd, 0xfe, 0xd9, 0x3d, 0x98, 0x72, 0x94, 0x3d, 0x6b, 0x91, 0x09, 0x3d, + 0x51, 0xae, 0x88, 0x3b, 0x65, 0x6a, 0xd8, 0xbb, 0x44, 0x15, 0x17, 0xbe, + 0xcf, 0xbb, 0xb3, 0x3d, 0xfe, 0xa1, 0x3f, 0xbe, 0x57, 0xbf, 0xd8, 0xbd, + 0xcf, 0xc5, 0x9d, 0x3d, 0xce, 0x80, 0x59, 0xbc, 0x14, 0x38, 0xdd, 0xbd, + 0x49, 0xb5, 0x56, 0xbe, 0xc5, 0xb0, 0xa5, 0x3d, 0xa9, 0x99, 0x10, 0xbd, + 0x39, 0xea, 0x95, 0xbc, 0x73, 0x55, 0x3f, 0xbe, 0xfd, 0x57, 0x85, 0xbd, + 0x1d, 0xf1, 0x65, 0x3d, 0xab, 0xe9, 0x06, 0xbd, 0x77, 0x53, 0xf8, 0xbc, + 0xfa, 0xbc, 0x75, 0xbd, 0x32, 0xc8, 0x6c, 0x3d, 0xec, 0xfb, 0x42, 0xbe, + 0x4f, 0xe3, 0x8a, 0xbd, 0xc9, 0xd4, 0x32, 0xbc, 0xe0, 0x14, 0xbe, 0x3d, + 0xdd, 0xd2, 0x2a, 0xbe, 0x2d, 0xf3, 0x42, 0xbe, 0x8a, 0x61, 0x6e, 0x3d, + 0x34, 0xed, 0x85, 0xbb, 0xcc, 0x83, 0x3c, 0xbd, 0xf4, 0xe4, 0x8f, 0xbc, + 0x6a, 0x4e, 0x2a, 0xbd, 0x32, 0xb8, 0x1b, 0xbe, 0x45, 0xd2, 0x73, 0x3d, + 0xa9, 0x63, 0x64, 0xbd, 0x34, 0x23, 0xb5, 0xbd, 0xe3, 0x16, 0x00, 0x3e, + 0xa5, 0xac, 0xf0, 0xbd, 0x1c, 0xef, 0x3d, 0x3d, 0xfc, 0xba, 0xff, 0x3c, + 0xbc, 0xfa, 0x0b, 0x3d, 0xfc, 0xd7, 0x60, 0xbd, 0x91, 0x10, 0xdd, 0xbb, + 0xe4, 0x68, 0xbe, 0x3d, 0xa5, 0x92, 0x50, 0xbe, 0x98, 0x7b, 0x27, 0xbe, + 0x78, 0xe3, 0xa2, 0xbe, 0xa6, 0x63, 0x21, 0xbd, 0x6d, 0xe4, 0xc0, 0x3d, + 0x68, 0x9c, 0xd2, 0xbd, 0x5b, 0xb4, 0x11, 0x3e, 0xa7, 0xef, 0xa9, 0xbd, + 0xf9, 0xfb, 0x83, 0x3d, 0xd8, 0x6d, 0xe5, 0x3c, 0xc2, 0x59, 0x3d, 0xbd, + 0x6f, 0x02, 0xe3, 0xbc, 0xdd, 0x52, 0xcf, 0xbb, 0x58, 0x34, 0xbc, 0xbd, + 0xa9, 0x43, 0x45, 0xbd, 0x1e, 0xf0, 0x9a, 0xbd, 0x80, 0x43, 0x61, 0x3d, + 0x77, 0xa4, 0x72, 0xbe, 0xa1, 0x17, 0xb0, 0x3e, 0x36, 0x5f, 0xd1, 0x3e, + 0x12, 0x20, 0xfe, 0xbd, 0x5d, 0x4d, 0x7c, 0xbc, 0xfe, 0x0a, 0x3d, 0x3e, + 0xd5, 0xcf, 0x22, 0x3b, 0xdc, 0x2e, 0x0f, 0x3c, 0x79, 0x3c, 0x90, 0x3d, + 0xac, 0x83, 0x2e, 0x3d, 0x75, 0xce, 0x22, 0xbf, 0x23, 0x4e, 0x35, 0xbe, + 0x92, 0x0b, 0x61, 0x3c, 0xcf, 0xdc, 0x70, 0x3e, 0x3f, 0xe4, 0xa2, 0xbe, + 0x63, 0x01, 0x9e, 0x3d, 0x61, 0x05, 0xa8, 0xbe, 0x1b, 0x7d, 0xe0, 0x3d, + 0xb5, 0x3b, 0xcc, 0x3e, 0xdc, 0x97, 0x9d, 0xbe, 0x13, 0xf1, 0x60, 0x3d, + 0xfc, 0x5b, 0x95, 0xbd, 0xd8, 0x27, 0x06, 0x3e, 0x27, 0x3e, 0x65, 0xbd, + 0x3a, 0xc3, 0x7b, 0xbd, 0x77, 0xa5, 0x37, 0x3d, 0x30, 0x67, 0x14, 0xbe, + 0xf9, 0x10, 0xbe, 0xbe, 0x4f, 0xec, 0x53, 0x3e, 0xf5, 0x26, 0xd9, 0x3d, + 0x48, 0x3b, 0x2d, 0xbf, 0xd1, 0x9b, 0x35, 0xbc, 0x7e, 0x60, 0xae, 0x3d, + 0xdf, 0x08, 0x5b, 0x3d, 0x58, 0xe9, 0x9b, 0xbe, 0xb6, 0xc6, 0xf6, 0xbe, + 0x57, 0xa3, 0x45, 0x3e, 0xa1, 0x11, 0x19, 0xbd, 0xaf, 0xb8, 0x2d, 0x3e, + 0xb8, 0x9b, 0x06, 0x3e, 0xbc, 0x03, 0x31, 0xbe, 0x49, 0xe0, 0xa4, 0x3c, + 0x67, 0x3d, 0x16, 0xbd, 0x5d, 0xa2, 0x54, 0xbe, 0xc7, 0x85, 0x1b, 0x3d, + 0xfb, 0x76, 0x05, 0xbb, 0x20, 0x1f, 0xd5, 0xbb, 0xc3, 0x12, 0x65, 0xbe, + 0x1e, 0x60, 0x9d, 0x3e, 0x74, 0x8d, 0x03, 0xbd, 0xe6, 0x87, 0x01, 0xbf, + 0x4e, 0x58, 0xc3, 0xbe, 0x0b, 0x3e, 0x09, 0x3e, 0xae, 0x0f, 0x17, 0xbd, + 0xab, 0xeb, 0x5b, 0x3d, 0x33, 0x41, 0x89, 0x3e, 0xfe, 0x66, 0x14, 0xbe, + 0x82, 0xfd, 0x63, 0xbc, 0x07, 0x1d, 0xbb, 0xbe, 0x80, 0x13, 0x7e, 0x3d, + 0x51, 0x53, 0xdf, 0xbe, 0xb3, 0x78, 0x91, 0x3d, 0x7e, 0x79, 0xac, 0xbd, + 0x2e, 0xe2, 0x3f, 0xbe, 0x46, 0x85, 0x01, 0x3d, 0xec, 0xf8, 0x64, 0x3e, + 0x06, 0x8e, 0xed, 0xbe, 0xf7, 0x7b, 0x1c, 0xbf, 0x09, 0x5b, 0x42, 0x3d, + 0x5b, 0xfd, 0x82, 0x3b, 0xde, 0xa5, 0xe4, 0xbd, 0xcb, 0x7c, 0x82, 0x3e, + 0xd6, 0xe7, 0x77, 0xbe, 0x28, 0x8e, 0xe3, 0xba, 0xf5, 0x19, 0x16, 0xbf, + 0x47, 0xf9, 0x0c, 0x3e, 0x93, 0xa4, 0xa7, 0xbe, 0xa1, 0xfd, 0x0b, 0xbd, + 0x34, 0x25, 0x2a, 0xbe, 0x79, 0xa6, 0x3e, 0xbe, 0x72, 0x46, 0x7a, 0x3e, + 0xdd, 0xb1, 0xd4, 0x3e, 0xa6, 0xae, 0xd7, 0x3d, 0xcd, 0xa3, 0xb8, 0xbe, + 0x83, 0xf2, 0xea, 0xbd, 0xda, 0x19, 0xfc, 0xbc, 0x8d, 0x76, 0xa2, 0xbc, + 0x17, 0x56, 0xa2, 0x3c, 0xf4, 0xa9, 0x00, 0xbe, 0x5b, 0xde, 0x36, 0x3d, + 0x0f, 0x78, 0x2d, 0xbf, 0x7f, 0xdc, 0x7e, 0xbd, 0x8b, 0x23, 0x93, 0xbd, + 0x0b, 0x44, 0x0e, 0x3d, 0xd1, 0xda, 0x73, 0xbe, 0xcf, 0x9f, 0x5b, 0xbe, + 0x50, 0xe9, 0x25, 0x3e, 0x83, 0x6c, 0x95, 0x3e, 0x72, 0x08, 0x76, 0x3d, + 0xae, 0xe5, 0x51, 0xbe, 0xd4, 0xf0, 0xa4, 0xbd, 0xf9, 0x06, 0xce, 0xbd, + 0x90, 0x98, 0x14, 0x3e, 0x24, 0x29, 0x20, 0x3c, 0x11, 0x75, 0x1c, 0xbe, + 0x99, 0x76, 0x2b, 0x3c, 0x9b, 0x64, 0xc1, 0xbe, 0x58, 0x5d, 0x08, 0xbe, + 0xcc, 0x09, 0x0f, 0x3e, 0x6e, 0x15, 0x1e, 0xbd, 0x17, 0x45, 0xed, 0xbd, + 0x15, 0xb4, 0x00, 0xbe, 0x71, 0x06, 0x83, 0x3d, 0xe5, 0x7e, 0xb2, 0x3e, + 0x72, 0x95, 0x57, 0x3e, 0x10, 0x2b, 0x78, 0xbe, 0x8f, 0x8b, 0x17, 0xbe, + 0x7a, 0xcb, 0x69, 0xbd, 0x93, 0xe9, 0x35, 0xbd, 0x70, 0x4a, 0x13, 0x3e, + 0x29, 0x2f, 0xde, 0xbd, 0x49, 0x2c, 0x0f, 0x3d, 0xb4, 0xd1, 0x7b, 0x3e, + 0x15, 0xff, 0x1a, 0xbd, 0x09, 0xeb, 0x16, 0x3d, 0x16, 0x20, 0x94, 0x3d, + 0x62, 0x81, 0x37, 0xbe, 0xf4, 0xb4, 0xa9, 0xbc, 0xa1, 0xe9, 0xfb, 0xbc, + 0x6a, 0xe0, 0xfc, 0x3d, 0x34, 0x3e, 0x4f, 0x3e, 0xc3, 0x45, 0x37, 0xbe, + 0xbd, 0x7c, 0x13, 0x3d, 0x80, 0xc5, 0xa1, 0x3c, 0x95, 0x2d, 0x94, 0xbd, + 0x37, 0xf2, 0xc3, 0x3d, 0xea, 0x4c, 0xb5, 0xbc, 0x3c, 0x6c, 0x0e, 0x3d, + 0x95, 0x03, 0xea, 0x3d, 0x00, 0xcb, 0xa5, 0xbd, 0xc6, 0xdb, 0x94, 0x3d, + 0xe0, 0x75, 0x9f, 0x3d, 0x35, 0x2b, 0xcd, 0xbc, 0x4b, 0xd6, 0x9d, 0xbc, + 0x19, 0xe6, 0x34, 0x3e, 0x95, 0xc7, 0xa8, 0x3d, 0x39, 0xa8, 0x4d, 0x3e, + 0x1a, 0xfe, 0x2e, 0xbe, 0x63, 0x46, 0x8c, 0x3d, 0xb2, 0x63, 0x0c, 0xbe, + 0xcb, 0x53, 0x82, 0xbc, 0x0d, 0xcc, 0x23, 0x3d, 0x93, 0xee, 0xff, 0x3c, + 0xa1, 0xba, 0x10, 0xbd, 0xf4, 0x9f, 0xfd, 0xbb, 0xe4, 0x63, 0x52, 0xbe, + 0xa0, 0x3f, 0xdb, 0x3d, 0xe3, 0x8c, 0xa1, 0xbd, 0x75, 0x4f, 0x75, 0xbd, + 0x64, 0xc3, 0xe6, 0x3c, 0x91, 0x6a, 0x96, 0x3e, 0x5b, 0x8f, 0x41, 0x3e, + 0x0b, 0xed, 0x8d, 0x3e, 0xe1, 0xfa, 0x47, 0xbd, 0xe8, 0x79, 0xa6, 0x3d, + 0x7f, 0x4e, 0x77, 0x3c, 0x3d, 0xbf, 0xf1, 0xba, 0x83, 0x2e, 0x92, 0x3d, + 0x14, 0xc8, 0xc3, 0xbd, 0x42, 0x69, 0x00, 0x3d, 0x86, 0x93, 0x8b, 0x3d, + 0xc6, 0xb3, 0x37, 0xbe, 0x5d, 0x8c, 0x27, 0xbc, 0xee, 0x70, 0xc9, 0xbc, + 0xf7, 0xf5, 0x96, 0xbe, 0x3f, 0x20, 0xe1, 0x3d, 0x07, 0x7a, 0x8b, 0x3e, + 0xc1, 0x46, 0x17, 0x3d, 0x39, 0xcc, 0x3c, 0x3e, 0xd4, 0xa0, 0x11, 0xbe, + 0x24, 0x8b, 0xe3, 0x3d, 0x9b, 0x32, 0x49, 0x3d, 0xc1, 0x6f, 0x08, 0xbe, + 0x5f, 0x21, 0x0e, 0x3d, 0xc0, 0xc1, 0x1a, 0x3d, 0x4d, 0x30, 0x8e, 0x3d, + 0x0d, 0xdf, 0x2e, 0x3e, 0x58, 0x84, 0x4b, 0xbe, 0x96, 0x08, 0x85, 0x3d, + 0x9a, 0x2e, 0x4f, 0x3c, 0x26, 0x4d, 0xc2, 0xbe, 0x78, 0x76, 0xea, 0x3d, + 0xd6, 0x01, 0x0a, 0x3d, 0xf5, 0xef, 0x78, 0xbe, 0x66, 0x9b, 0x82, 0x3e, + 0x90, 0x6b, 0x5f, 0xbe, 0x8c, 0xdf, 0xf9, 0x3d, 0x84, 0x98, 0xe9, 0xbe, + 0x38, 0x4e, 0x73, 0x3c, 0xce, 0xac, 0x2a, 0x3e, 0x1d, 0x29, 0x80, 0x3d, + 0x04, 0xd4, 0x94, 0xbe, 0x5d, 0x8b, 0x2f, 0xbe, 0x02, 0xde, 0xc5, 0xbe, + 0xbc, 0x6b, 0x0e, 0xbd, 0x0e, 0x34, 0xb2, 0xbd, 0xfc, 0xc1, 0x71, 0xbe, + 0xb3, 0x9a, 0xa4, 0xbc, 0xd2, 0x28, 0x55, 0x3e, 0x99, 0x4b, 0x15, 0x3e, + 0x6b, 0x9e, 0x8b, 0xbe, 0x0f, 0xa7, 0xa6, 0xbe, 0x9f, 0x1c, 0x7f, 0x3d, + 0x03, 0x97, 0xd6, 0xbe, 0xec, 0x2d, 0x7e, 0xbd, 0x5a, 0xa2, 0x2a, 0x3e, + 0x96, 0x01, 0xf9, 0x3c, 0x02, 0xaa, 0xd3, 0xbe, 0xb1, 0x3a, 0x1e, 0xbf, + 0x4b, 0xee, 0x50, 0x3e, 0x33, 0x84, 0x4a, 0xbe, 0xae, 0x5e, 0xca, 0xbe, + 0x6d, 0xad, 0x3d, 0xbe, 0x35, 0xdc, 0x8b, 0xbd, 0x7f, 0x3b, 0x19, 0xbe, + 0xf7, 0x3f, 0xe9, 0xbd, 0x39, 0x0d, 0xa9, 0xbe, 0x62, 0xaf, 0x2f, 0xbe, + 0x50, 0x42, 0xf2, 0xbd, 0x0b, 0xa2, 0xec, 0x3d, 0x87, 0x39, 0x6e, 0xbe, + 0xa0, 0xe2, 0x18, 0xbd, 0xd0, 0xf9, 0x9d, 0xbd, 0x44, 0xca, 0x1c, 0x3c, + 0x22, 0x53, 0xc3, 0x3e, 0x8b, 0x89, 0x93, 0xbe, 0x5b, 0xc0, 0x2a, 0xbe, + 0xc5, 0x08, 0xe9, 0xbc, 0x55, 0x7a, 0xbb, 0xbd, 0xa6, 0x59, 0x44, 0xbe, + 0x92, 0x5a, 0x9e, 0xbe, 0x44, 0x21, 0x92, 0xbe, 0x97, 0x4f, 0x57, 0xbe, + 0xe6, 0x26, 0x19, 0xbe, 0x7c, 0x1a, 0xf9, 0xbe, 0xa7, 0x2d, 0x9a, 0x3c, + 0xa1, 0x6c, 0xb9, 0xbe, 0x17, 0x1f, 0xf0, 0xbe, 0x36, 0x41, 0x63, 0xbe, + 0xe1, 0xfb, 0x72, 0xbd, 0x77, 0x52, 0xe0, 0x3e, 0xa8, 0x23, 0x01, 0xbf, + 0x34, 0x23, 0x34, 0xbe, 0x86, 0x7c, 0xbe, 0xbd, 0x95, 0x31, 0xde, 0xbe, + 0xea, 0x79, 0x04, 0xbe, 0x23, 0x82, 0xcc, 0xbe, 0xf6, 0xc9, 0x1c, 0xbf, + 0x1a, 0x7d, 0x41, 0x3c, 0xcb, 0xc1, 0x6b, 0xbe, 0xf7, 0x47, 0x2d, 0xbf, + 0xfe, 0x87, 0x32, 0xbd, 0xad, 0x73, 0x82, 0xbe, 0xa2, 0xd1, 0x3e, 0xbe, + 0x4c, 0xfa, 0x08, 0xbd, 0xef, 0xe1, 0x3d, 0xbd, 0xaf, 0x4c, 0x72, 0x3e, + 0x79, 0x46, 0xa1, 0xbe, 0x5a, 0x73, 0xe1, 0xbe, 0x0d, 0x0b, 0xc8, 0xbd, + 0x2d, 0x22, 0x91, 0x3e, 0x3f, 0x09, 0x7d, 0xbe, 0x18, 0xe7, 0x25, 0xbe, + 0x20, 0x50, 0x49, 0xbd, 0x08, 0x29, 0x4b, 0xbc, 0xce, 0xd6, 0x82, 0xbe, + 0x98, 0xe0, 0xec, 0xbe, 0xcd, 0x3d, 0x2d, 0x3d, 0xf4, 0xf8, 0xb0, 0xbd, + 0x7a, 0xee, 0xf3, 0xbd, 0x21, 0xd4, 0xd8, 0xb8, 0xf1, 0xf3, 0x81, 0xbd, + 0x2f, 0x08, 0x0c, 0x3d, 0x80, 0x46, 0x19, 0x3e, 0x80, 0x3c, 0x9c, 0xbe, + 0xc1, 0x46, 0xf2, 0xbd, 0x1d, 0x89, 0x3a, 0x3e, 0xa9, 0x64, 0x0a, 0xbe, + 0xb5, 0xe3, 0x2f, 0xbd, 0x99, 0x8d, 0x55, 0xbe, 0x19, 0x11, 0xcf, 0xbd, + 0x00, 0x5d, 0x3a, 0xbd, 0xef, 0x70, 0xb8, 0xbe, 0x2f, 0xe7, 0x4e, 0xbc, + 0x57, 0xbc, 0xa1, 0x3e, 0xbc, 0xcd, 0xd9, 0xbc, 0x7d, 0x6a, 0xbe, 0xbd, + 0x23, 0x6e, 0x3a, 0xbd, 0xc8, 0x65, 0x77, 0xbd, 0xb2, 0xe9, 0x1a, 0xbe, + 0x4f, 0xb3, 0x7a, 0xbe, 0x92, 0x29, 0x3d, 0xbd, 0xc2, 0xf1, 0xac, 0x3e, + 0x60, 0x35, 0x39, 0xbd, 0x49, 0xa6, 0xe8, 0x3c, 0x35, 0xf4, 0x04, 0x3e, + 0x41, 0x26, 0x09, 0xbc, 0x51, 0x4e, 0xa3, 0x3e, 0x56, 0x74, 0x9a, 0xbd, + 0xae, 0x10, 0x94, 0x3d, 0x01, 0xe9, 0x51, 0x3d, 0xc0, 0x1d, 0x45, 0x3d, + 0x80, 0xb1, 0xb4, 0xbc, 0x9b, 0x51, 0xcb, 0xbd, 0xa8, 0xca, 0x2d, 0xbd, + 0xa3, 0x12, 0x52, 0xbc, 0x22, 0xee, 0x05, 0xbe, 0xf0, 0x4c, 0x66, 0xbd, + 0x12, 0x0a, 0xa3, 0x3e, 0xae, 0xe7, 0x8d, 0xbc, 0xa2, 0x32, 0x48, 0x3e, + 0xd9, 0x25, 0xc6, 0xbd, 0x9f, 0xe7, 0x0e, 0x3e, 0x83, 0xd4, 0x20, 0x3e, + 0xf5, 0x11, 0xf0, 0xbc, 0xd8, 0xb1, 0x8c, 0x3d, 0xad, 0x03, 0xd5, 0x3b, + 0x87, 0x4f, 0xc0, 0x3d, 0xb5, 0x17, 0x36, 0x3d, 0x13, 0xdc, 0x08, 0xbd, + 0x6d, 0x28, 0x23, 0x3d, 0x24, 0x48, 0x94, 0xbe, 0xd9, 0xbe, 0x4f, 0xbd, + 0x0b, 0x18, 0x90, 0xbd, 0x04, 0xee, 0x91, 0x3e, 0x60, 0x12, 0x20, 0x3e, + 0xa4, 0x50, 0x31, 0x3e, 0x79, 0xb4, 0x91, 0xbd, 0xb6, 0x3b, 0xfd, 0x3d, + 0x87, 0x3a, 0xce, 0x3d, 0xab, 0x25, 0x3c, 0x3d, 0x2e, 0xba, 0xf6, 0x3b, + 0x22, 0xbe, 0x88, 0x3e, 0x41, 0x1d, 0x91, 0x3d, 0x40, 0x2e, 0x92, 0x3d, + 0x02, 0xd8, 0x90, 0x3d, 0x68, 0x3f, 0x58, 0xbe, 0x9b, 0xac, 0xd7, 0xbd, + 0x18, 0x6d, 0x8a, 0xbb, 0x1f, 0xf4, 0x7d, 0xbc, 0xe9, 0x45, 0x09, 0x3e, + 0x9f, 0xfe, 0x95, 0x3d, 0x9d, 0xf8, 0x2a, 0x3e, 0x55, 0x59, 0x18, 0xbe, + 0xb1, 0xfd, 0x36, 0x3e, 0x2a, 0xaa, 0x3b, 0x3e, 0xa6, 0xf6, 0x39, 0xba, + 0xa1, 0x4d, 0x74, 0xbd, 0xd9, 0xe6, 0x8d, 0x3e, 0x80, 0xa5, 0x8c, 0xbc, + 0x61, 0x74, 0x25, 0x3d, 0x34, 0xfe, 0x71, 0x3d, 0xbc, 0xb5, 0x8f, 0xbe, + 0x46, 0x41, 0xf4, 0xbe, 0x17, 0xf2, 0x9e, 0x3a, 0x80, 0x45, 0xce, 0x3c, + 0xa4, 0xd1, 0x8f, 0x3e, 0xe3, 0x2e, 0x43, 0xbc, 0x3d, 0x24, 0xb4, 0x3e, + 0xb1, 0x1e, 0x30, 0xbd, 0x98, 0x36, 0xcd, 0x3d, 0x0c, 0x48, 0x55, 0x3d, + 0x39, 0x6f, 0x16, 0xbe, 0x1d, 0x82, 0x34, 0xbe, 0xc0, 0x7d, 0x81, 0x3e, + 0x73, 0xe1, 0x0a, 0xbe, 0x1d, 0x95, 0x13, 0x3d, 0x52, 0x6b, 0xf5, 0xbb, + 0x42, 0x7e, 0xbc, 0xbe, 0x0c, 0x5a, 0xcc, 0xbe, 0x6b, 0xc1, 0xc3, 0xbc, + 0x85, 0xa2, 0xf7, 0x3c, 0x11, 0xef, 0x4b, 0x3e, 0xa4, 0xb9, 0x85, 0x3d, + 0x1b, 0x76, 0xbe, 0x3e, 0x9f, 0x20, 0xd4, 0xbd, 0x65, 0x15, 0x2a, 0x3e, + 0x6e, 0xdd, 0xfe, 0x3d, 0x72, 0x35, 0x21, 0xbd, 0x54, 0x0f, 0x48, 0xbe, + 0xfe, 0xe7, 0x46, 0x3e, 0x6f, 0x80, 0x80, 0xbd, 0xf4, 0x2c, 0xc8, 0x3d, + 0x45, 0x0b, 0x8e, 0xbd, 0xb3, 0xd3, 0x99, 0xbe, 0x12, 0x64, 0x19, 0xbe, + 0x8e, 0x98, 0x34, 0x3c, 0x3f, 0x82, 0x5c, 0x3d, 0x05, 0x5c, 0x8d, 0x3e, + 0x66, 0x6d, 0x1d, 0x3d, 0xe8, 0xe4, 0x79, 0x3e, 0x09, 0x06, 0x0c, 0xbd, + 0xfc, 0x25, 0x90, 0x3d, 0xd8, 0xda, 0xf1, 0x3d, 0xbb, 0x7e, 0x18, 0x3e, + 0xa7, 0x79, 0xe1, 0x3c, 0x68, 0x65, 0x31, 0x3d, 0x80, 0x16, 0x0f, 0xbe, + 0xa6, 0x2a, 0x79, 0x3c, 0x4f, 0x6a, 0xf5, 0x3d, 0x2d, 0x8e, 0x83, 0xbe, + 0xef, 0x1a, 0x86, 0xbd, 0xd7, 0x98, 0xd3, 0xbc, 0xdc, 0x99, 0xfb, 0x3d, + 0xe8, 0x2d, 0xd0, 0x3e, 0x93, 0x99, 0x23, 0xbe, 0x36, 0xdd, 0x84, 0x3e, + 0x41, 0x0f, 0x0a, 0x3e, 0x90, 0x4b, 0xd5, 0xbc, 0xd3, 0x40, 0xac, 0x3d, + 0x8e, 0x08, 0x95, 0x3c, 0xcc, 0x5b, 0x6f, 0xbe, 0x02, 0x7b, 0x89, 0x3e, + 0x6f, 0x2a, 0x55, 0xbe, 0x64, 0x57, 0xcd, 0xbd, 0x8d, 0xa2, 0xa8, 0x3d, + 0xaa, 0x1f, 0x42, 0xbd, 0x12, 0x22, 0x5c, 0xbe, 0x9a, 0xfa, 0x43, 0xbd, + 0xe0, 0x93, 0x81, 0xbd, 0xa6, 0x78, 0x74, 0xbd, 0x78, 0x8d, 0xd4, 0xbe, + 0x7e, 0xc7, 0x32, 0xbf, 0x01, 0xc0, 0x06, 0xbf, 0xd8, 0xad, 0x7f, 0xbd, + 0xd2, 0xc7, 0xa7, 0xbe, 0xbe, 0xc5, 0xff, 0xbe, 0x1e, 0xf5, 0x03, 0x3c, + 0x96, 0xae, 0x07, 0xbf, 0x43, 0xf6, 0x60, 0xbe, 0x1c, 0x7e, 0x8c, 0xbe, + 0xd4, 0x05, 0x51, 0xbd, 0x21, 0x90, 0x8c, 0x3e, 0x13, 0xcb, 0x85, 0xbe, + 0xdf, 0xb4, 0x05, 0xbf, 0xc3, 0x79, 0xa7, 0x3b, 0x60, 0x54, 0x39, 0x3c, + 0x12, 0x9a, 0x91, 0x3d, 0xe2, 0x53, 0x8d, 0x3d, 0xe8, 0x49, 0x5b, 0xbb, + 0x28, 0xcc, 0x95, 0xbe, 0x00, 0x79, 0xd7, 0xbc, 0x2a, 0x7e, 0x80, 0x3c, + 0xc9, 0x5f, 0x15, 0xbe, 0x4f, 0x7e, 0x4c, 0x3d, 0x4a, 0x6d, 0x58, 0xbc, + 0x6d, 0xa2, 0x17, 0xbe, 0x1c, 0x64, 0x11, 0xbe, 0x05, 0xf2, 0x7d, 0x3e, + 0x0f, 0x16, 0xb4, 0x3b, 0x98, 0x36, 0x88, 0x3d, 0x87, 0x91, 0xc0, 0xbe, + 0x3a, 0xbb, 0xcd, 0x3c, 0x89, 0x5d, 0xa8, 0xbe, 0x67, 0xdb, 0xe2, 0x3d, + 0xd0, 0xe3, 0x5f, 0xbd, 0x2b, 0xad, 0x0e, 0xbe, 0x4c, 0x1e, 0x24, 0xbe, + 0xe7, 0x6f, 0x8f, 0xbe, 0x0a, 0xa3, 0xb5, 0x3c, 0xfe, 0xf3, 0x8b, 0xbd, + 0x42, 0xfb, 0xc2, 0x3d, 0x7b, 0x30, 0x30, 0xbd, 0xbd, 0xbf, 0x49, 0xbe, + 0xb6, 0x92, 0x14, 0x3e, 0x97, 0x15, 0x3d, 0xbd, 0xfa, 0x58, 0x8b, 0xbd, + 0x88, 0x5d, 0x89, 0xbe, 0x8d, 0x80, 0x64, 0xbe, 0x3b, 0xb3, 0x6c, 0xbe, + 0x87, 0xd4, 0xda, 0xbb, 0x92, 0x31, 0x64, 0xbe, 0x8a, 0x85, 0xf4, 0xbd, + 0x9e, 0x89, 0xa4, 0xbd, 0x5e, 0xd7, 0x5d, 0xbe, 0xbf, 0x73, 0x45, 0xbe, + 0x77, 0xa5, 0x52, 0x3c, 0x3a, 0x4a, 0xa7, 0xbd, 0x37, 0xfb, 0x3e, 0xbc, + 0x24, 0x9c, 0x8e, 0xbd, 0x1e, 0x54, 0x91, 0xbc, 0x48, 0xaf, 0x45, 0xbd, + 0x25, 0x8c, 0x1e, 0x3d, 0xf2, 0x1a, 0x92, 0xbd, 0x7b, 0xb7, 0x3a, 0x3e, + 0x0c, 0xe9, 0x98, 0xbe, 0x70, 0x74, 0xb1, 0x3d, 0x43, 0xa9, 0x59, 0xbe, + 0xe1, 0xe3, 0x18, 0x3d, 0xc3, 0x81, 0x90, 0xbe, 0x53, 0x0c, 0x08, 0xbe, + 0x06, 0x59, 0xa5, 0xbd, 0x09, 0x71, 0xa2, 0x3c, 0x7c, 0x30, 0xa6, 0x3d, + 0xd7, 0x3a, 0xab, 0x3b, 0x00, 0xf9, 0x68, 0xbd, 0x79, 0x2a, 0x19, 0xbe, + 0x6d, 0x83, 0xb1, 0xbd, 0x20, 0xc3, 0x15, 0xbd, 0x70, 0x6e, 0x95, 0xbd, + 0xda, 0x24, 0x53, 0xbd, 0x6c, 0x88, 0xb6, 0xbe, 0x14, 0x65, 0x5f, 0x3d, + 0x80, 0xd5, 0x41, 0xbe, 0xaf, 0x31, 0x37, 0x3e, 0xa3, 0xad, 0x1c, 0xbd, + 0x2f, 0xfa, 0x0b, 0xbe, 0xed, 0x59, 0x2e, 0xbe, 0x6a, 0x9d, 0x5b, 0x3e, + 0x37, 0xde, 0x8f, 0xbd, 0x39, 0x9b, 0xb0, 0x3d, 0xaf, 0xc0, 0x03, 0xbd, + 0x85, 0xc3, 0x04, 0x3e, 0x0f, 0x4f, 0x38, 0xbc, 0x0f, 0xb3, 0x06, 0xbe, + 0x64, 0x20, 0x2b, 0xbe, 0x81, 0xb0, 0x1d, 0x3e, 0x57, 0x08, 0x8c, 0xbe, + 0x62, 0xbc, 0xe7, 0x3d, 0x45, 0xdf, 0x4e, 0x3d, 0xa0, 0x7d, 0x29, 0x3d, + 0x87, 0xd4, 0xc4, 0xbd, 0xb2, 0xa7, 0x54, 0xbd, 0x87, 0xfa, 0x8f, 0x3d, + 0x4b, 0x05, 0x34, 0x3e, 0xef, 0x5a, 0xa9, 0x3d, 0xd5, 0xd2, 0xc9, 0xbd, + 0x66, 0xbd, 0x16, 0xbd, 0x54, 0xcf, 0x08, 0x3e, 0x54, 0x8a, 0xf4, 0x3c, + 0xc6, 0xcd, 0x31, 0x3e, 0xf6, 0x6d, 0x7c, 0xbc, 0x7e, 0x1e, 0x10, 0xbd, + 0x30, 0x46, 0x1d, 0xbe, 0x5d, 0x65, 0x9c, 0xbc, 0xea, 0xbe, 0x4d, 0xbe, + 0x76, 0xc0, 0x91, 0xbc, 0x6d, 0x84, 0x33, 0x3d, 0x63, 0xc5, 0x1a, 0xbe, + 0x48, 0xa0, 0xaa, 0x3d, 0x2c, 0x55, 0x27, 0x3e, 0xee, 0x41, 0x94, 0x3d, + 0x3a, 0x2b, 0xa2, 0x3c, 0x14, 0xa0, 0x15, 0xbe, 0x33, 0x75, 0xdb, 0x3b, + 0xe2, 0x0e, 0x5d, 0xbd, 0x8d, 0x94, 0xc3, 0x3c, 0x76, 0x8e, 0xc3, 0xbe, + 0x26, 0xd0, 0x05, 0xbe, 0xb3, 0x7c, 0xc3, 0xbd, 0x95, 0xbd, 0xa3, 0x3d, + 0x98, 0x07, 0xc7, 0xbc, 0xbb, 0xc0, 0x77, 0xbd, 0x0b, 0x87, 0x80, 0x3c, + 0x3b, 0xda, 0x88, 0xbd, 0xc3, 0x53, 0x03, 0x3e, 0xe3, 0x7d, 0x00, 0xbe, + 0x57, 0xf1, 0x40, 0x3c, 0xd3, 0xf2, 0x23, 0xbd, 0xcf, 0x47, 0xcf, 0xbd, + 0x55, 0x35, 0x0c, 0xbd, 0x3a, 0x41, 0x60, 0xbd, 0xb3, 0xc1, 0x21, 0x3e, + 0x17, 0x79, 0x79, 0xbe, 0x4f, 0x9e, 0x0e, 0xbe, 0x81, 0x91, 0x00, 0xbe, + 0xaf, 0x5b, 0xbc, 0xbc, 0xe2, 0xbc, 0xd0, 0xbc, 0xa5, 0xfe, 0x9d, 0x3d, + 0x03, 0xbd, 0x93, 0xbe, 0x1e, 0x59, 0xa9, 0xbd, 0x1f, 0xea, 0xd0, 0xbd, + 0xc9, 0x61, 0x03, 0x3e, 0xe8, 0x4c, 0x16, 0x3e, 0xe5, 0x83, 0x41, 0xbb, + 0xd3, 0x77, 0xd2, 0xbd, 0x9e, 0x9e, 0x8d, 0xbc, 0x75, 0x41, 0x37, 0xbc, + 0x61, 0x40, 0x70, 0xbd, 0xbf, 0xec, 0xde, 0xbd, 0x8c, 0x63, 0xee, 0xbc, + 0xc1, 0x06, 0xe8, 0xbd, 0x15, 0x17, 0x4e, 0x3c, 0xee, 0xaa, 0xf0, 0xbd, + 0x17, 0x12, 0x02, 0xbd, 0xbb, 0xbf, 0x67, 0xbe, 0x35, 0xcb, 0x44, 0xbe, + 0x40, 0xaf, 0xa2, 0x3d, 0xc1, 0xe9, 0x9d, 0xbc, 0x84, 0x51, 0x61, 0x3e, + 0xea, 0xad, 0x7f, 0x3d, 0x5f, 0x13, 0x82, 0x3c, 0x87, 0x1c, 0xf5, 0xbc, + 0x5c, 0xc4, 0xe8, 0x3c, 0xc1, 0xa3, 0x68, 0xbd, 0x2c, 0xbf, 0x98, 0xbe, + 0xf7, 0xa1, 0xd2, 0x3b, 0x70, 0x4c, 0x24, 0x3c, 0xe2, 0x19, 0x8b, 0xbd, + 0xd0, 0x95, 0x17, 0xbe, 0xa4, 0x5e, 0x2b, 0xbe, 0x55, 0x11, 0x53, 0xbe, + 0x33, 0xdc, 0x7c, 0xbe, 0xa3, 0x5f, 0x00, 0x3e, 0x41, 0x5c, 0xf2, 0x3d, + 0x0d, 0xab, 0xe8, 0xbd, 0xdd, 0xf9, 0x24, 0x3d, 0x7f, 0x07, 0x06, 0x3e, + 0x62, 0xd0, 0x26, 0x3d, 0x72, 0x32, 0xf9, 0xbd, 0x80, 0x7a, 0xce, 0xbd, + 0xa8, 0x00, 0x1c, 0xbe, 0x28, 0x3a, 0x33, 0xbe, 0xef, 0xfc, 0xe6, 0xbc, + 0x69, 0xd4, 0xe4, 0x3d, 0x9a, 0x5d, 0x33, 0xbe, 0xb1, 0x1f, 0xd9, 0x3c, + 0xa8, 0xe8, 0x5c, 0xbd, 0xdb, 0x5e, 0x9d, 0xbe, 0x17, 0xac, 0xb8, 0xbc, + 0x5a, 0x52, 0x4d, 0x3d, 0x3d, 0x00, 0x97, 0xbc, 0x9a, 0xaa, 0x53, 0xbe, + 0xc0, 0x8c, 0x18, 0xbe, 0xdd, 0x93, 0x28, 0xbd, 0xa5, 0x6a, 0x97, 0x3d, + 0xe1, 0x09, 0x55, 0xbd, 0xea, 0xdb, 0xaa, 0xbe, 0xb1, 0x0d, 0xa0, 0xbd, + 0x33, 0xb7, 0x0c, 0xbe, 0xf3, 0x7c, 0xe5, 0x3d, 0x9e, 0x05, 0x9c, 0xbe, + 0x52, 0x7b, 0x0e, 0xbe, 0x7d, 0x50, 0x0b, 0xbe, 0x8a, 0x99, 0x1a, 0xbe, + 0x70, 0x90, 0xde, 0x3c, 0x73, 0x98, 0x7f, 0xbc, 0xf2, 0x72, 0x1b, 0x3e, + 0x64, 0x71, 0x72, 0xbd, 0xd5, 0xdb, 0x7c, 0xbe, 0xb0, 0xb4, 0xc6, 0xbc, + 0x80, 0x0a, 0x43, 0xbc, 0x7c, 0x3e, 0xa8, 0x3d, 0x9a, 0xd9, 0xda, 0xbe, + 0xe6, 0x9d, 0x21, 0xbe, 0x5e, 0x36, 0x30, 0xbe, 0xc5, 0x14, 0x38, 0x3e, + 0xd1, 0xa1, 0xa3, 0x3d, 0x22, 0xdd, 0x3d, 0xbe, 0xd6, 0x71, 0x99, 0xbd, + 0xe8, 0xab, 0x8d, 0x3e, 0x02, 0x68, 0x38, 0x3a, 0x4c, 0x4f, 0xc6, 0xbd, + 0x32, 0xb3, 0x38, 0x3e, 0x29, 0x0d, 0x23, 0xbe, 0x84, 0x39, 0xd8, 0xbd, + 0x82, 0x93, 0xaf, 0x3d, 0x5b, 0xbb, 0x98, 0x3c, 0x33, 0x97, 0xa7, 0x3d, + 0x25, 0x92, 0x96, 0xbe, 0x51, 0x1f, 0x79, 0xbe, 0x24, 0x78, 0x0b, 0xbe, + 0x2b, 0x85, 0x78, 0xbe, 0xf7, 0xd1, 0x40, 0x3f, 0xa2, 0xd5, 0x9a, 0x3e, + 0x9b, 0xff, 0x63, 0xbe, 0x0c, 0xcb, 0x08, 0xbe, 0xb8, 0x8a, 0x99, 0x3d, + 0xd1, 0xb9, 0x25, 0x3d, 0xd0, 0x91, 0x31, 0xbd, 0x3d, 0x06, 0x88, 0x3d, + 0x47, 0x65, 0xed, 0x3d, 0xaa, 0xc4, 0xd2, 0xbe, 0xd9, 0x6c, 0xc4, 0xbe, + 0xa1, 0xee, 0xc2, 0x3d, 0x56, 0xbc, 0x62, 0x3e, 0x76, 0x7d, 0x41, 0xbe, + 0x35, 0x60, 0x56, 0x3d, 0x6c, 0x50, 0x1d, 0xbe, 0xcf, 0xf4, 0x84, 0x3d, + 0x61, 0x1d, 0x4e, 0x3e, 0xea, 0xcd, 0x36, 0xbe, 0xc4, 0xc2, 0x77, 0x3c, + 0xa1, 0x6a, 0x14, 0xbd, 0xf2, 0x01, 0xcb, 0x3d, 0x73, 0xe6, 0x0d, 0x3e, + 0xf7, 0x54, 0x4d, 0xbd, 0x1b, 0x0b, 0xf0, 0x3d, 0xd8, 0x6b, 0x4c, 0x3e, + 0x05, 0xd9, 0xbf, 0xbe, 0x29, 0x5a, 0x0a, 0x3e, 0x54, 0x15, 0xaa, 0x3d, + 0x6a, 0xd0, 0xad, 0xbe, 0xb5, 0xa9, 0x7e, 0x3d, 0x5b, 0x9b, 0xa2, 0xbd, + 0x66, 0xeb, 0x1e, 0x3e, 0xdf, 0xfa, 0xb3, 0x3d, 0x01, 0xb9, 0xeb, 0xbd, + 0xed, 0x60, 0x7b, 0x3d, 0xdd, 0xc3, 0xab, 0xbc, 0x9c, 0xf9, 0xa7, 0x3d, + 0x7c, 0x05, 0xd7, 0x3d, 0xf3, 0x62, 0xb7, 0xbe, 0x9d, 0x89, 0x7b, 0x3d, + 0x2e, 0x25, 0x20, 0x3c, 0xdb, 0xe4, 0x3d, 0xbe, 0x0e, 0xee, 0x3d, 0x3d, + 0x9c, 0xd3, 0xdc, 0x3c, 0x00, 0x4d, 0x38, 0xbe, 0xd6, 0x3c, 0x1e, 0xbd, + 0x8b, 0x41, 0x14, 0x3e, 0x56, 0x6b, 0x21, 0x3e, 0xfc, 0x0b, 0xb4, 0xbe, + 0x8c, 0xee, 0x24, 0xbe, 0x92, 0xf6, 0x48, 0x3e, 0x01, 0xa4, 0x4e, 0x3c, + 0x86, 0xf3, 0x0b, 0x3d, 0xde, 0x84, 0x1d, 0x3e, 0xe1, 0xa9, 0x00, 0xbf, + 0xa5, 0x03, 0xa7, 0x3d, 0x2b, 0xf4, 0x32, 0xbd, 0x7b, 0xed, 0x30, 0xbd, + 0xd7, 0xb6, 0x2a, 0xbe, 0xa4, 0xa7, 0xaa, 0xbd, 0x76, 0xa8, 0x59, 0x3e, + 0x63, 0x2b, 0x3f, 0xbd, 0x6a, 0xb1, 0x8d, 0x3c, 0x1c, 0xf7, 0x90, 0x3e, + 0xad, 0xa8, 0xb2, 0xbd, 0x5e, 0xe2, 0x80, 0xbe, 0xb1, 0x3b, 0x67, 0xbd, + 0xaa, 0x58, 0x88, 0xbc, 0xce, 0x93, 0x66, 0xbe, 0x3d, 0xe4, 0x85, 0x3d, + 0xfc, 0x7d, 0xd8, 0xbe, 0x73, 0x8d, 0xeb, 0xbc, 0xf7, 0x65, 0x6c, 0xbe, + 0xc5, 0xd4, 0x51, 0x3d, 0x62, 0x0d, 0x4b, 0xbe, 0xb0, 0xc3, 0x1f, 0xbd, + 0x87, 0x98, 0x69, 0x3d, 0x4d, 0x80, 0xd2, 0xbc, 0x9c, 0x0c, 0x38, 0x3e, + 0x89, 0x8b, 0x81, 0x3e, 0x55, 0x79, 0xea, 0x3d, 0xd0, 0xf2, 0xc8, 0xbd, + 0xb4, 0x9c, 0xa9, 0x3d, 0x7f, 0x05, 0x83, 0xbd, 0x05, 0x77, 0xb0, 0x3b, + 0x62, 0xbd, 0x4c, 0x3d, 0x49, 0x44, 0xc9, 0xbd, 0xdc, 0x3f, 0xb9, 0x3d, + 0x56, 0xc5, 0xe3, 0xbe, 0x5e, 0x61, 0x26, 0x3d, 0x31, 0x0e, 0x12, 0xbc, + 0x2b, 0xe8, 0x93, 0x3b, 0xc0, 0x15, 0x10, 0xbe, 0xdb, 0x6b, 0xd4, 0xbd, + 0xa7, 0xf7, 0x97, 0x3d, 0x61, 0xa0, 0x08, 0x3e, 0x54, 0x8a, 0x65, 0x3e, + 0x58, 0xcc, 0x1d, 0xbe, 0x33, 0x44, 0x63, 0x3c, 0x69, 0x14, 0xf6, 0xbd, + 0xff, 0x62, 0xd4, 0x3d, 0x05, 0x2b, 0x8b, 0x3d, 0x22, 0x2c, 0x13, 0xbe, + 0x52, 0x0c, 0x0f, 0x3d, 0x48, 0x96, 0xc7, 0xbd, 0x4d, 0x35, 0xab, 0x3d, + 0x20, 0xbe, 0xeb, 0x3d, 0x64, 0xf0, 0x86, 0xbd, 0xcb, 0x71, 0xa5, 0xbd, + 0xd5, 0x2a, 0x95, 0x3c, 0x57, 0xaa, 0x06, 0x3e, 0x5e, 0x14, 0x3c, 0x3e, + 0xcb, 0xf8, 0x11, 0x3e, 0x34, 0x34, 0x6d, 0x3d, 0xa4, 0x66, 0x0b, 0x3c, + 0x52, 0x5b, 0x9d, 0xbb, 0x7a, 0x84, 0x90, 0xbd, 0x11, 0xc8, 0x4a, 0x3e, + 0x75, 0xf9, 0x8a, 0xbd, 0x83, 0x65, 0x22, 0xbd, 0x64, 0x5d, 0x15, 0xbd, + 0x91, 0x22, 0x5e, 0xbc, 0xbd, 0x09, 0x12, 0x3d, 0xfe, 0x19, 0xeb, 0x3c, + 0xa3, 0x78, 0x2e, 0xbd, 0x62, 0xf3, 0x7f, 0x3c, 0x05, 0x5e, 0x03, 0x3e, + 0x6c, 0x9e, 0xb7, 0x3d, 0xb1, 0x03, 0x4d, 0x3e, 0x66, 0x72, 0xfd, 0xbd, + 0xc5, 0x12, 0x11, 0x3d, 0x99, 0x39, 0xab, 0x3c, 0xc8, 0xf5, 0x5a, 0xbd, + 0x33, 0x84, 0x98, 0x3c, 0x0a, 0xd6, 0x99, 0x3d, 0x4f, 0xcb, 0xb5, 0xbb, + 0x00, 0x39, 0x41, 0x3e, 0xdc, 0x20, 0x27, 0xbc, 0x34, 0xdb, 0xbb, 0x3d, + 0x33, 0x3c, 0x26, 0x3d, 0x3a, 0x99, 0x2b, 0x3d, 0xa4, 0x31, 0x76, 0x3d, + 0x50, 0x79, 0x91, 0x3d, 0x80, 0x50, 0xc3, 0x3d, 0x5c, 0x3d, 0x39, 0x3e, + 0xc9, 0x7b, 0xed, 0xbc, 0xf2, 0xbb, 0x88, 0x3d, 0x76, 0xb2, 0x5e, 0xbe, + 0x0c, 0x80, 0xb9, 0xbd, 0x10, 0x91, 0x12, 0x3d, 0xca, 0xfb, 0x47, 0x3d, + 0xc4, 0x43, 0xc4, 0xbd, 0xd3, 0x36, 0x82, 0xbd, 0x03, 0x96, 0xda, 0xbd, + 0xac, 0x46, 0xbf, 0x3d, 0x26, 0x6b, 0x26, 0x3d, 0x02, 0xa1, 0x0f, 0xbe, + 0x68, 0x09, 0x42, 0x3e, 0x32, 0xf7, 0x5d, 0x3e, 0xad, 0xa5, 0xec, 0x3d, + 0x97, 0x8a, 0xb1, 0x3e, 0xc7, 0x0e, 0xee, 0xbd, 0x12, 0x2d, 0xf0, 0x3d, + 0x05, 0x02, 0xae, 0xbe, 0x63, 0x2c, 0xe3, 0x3c, 0x1c, 0x86, 0x47, 0x3e, + 0xe5, 0xa6, 0x46, 0x3e, 0x6b, 0x88, 0x8c, 0xbd, 0x6b, 0x84, 0x28, 0x3e, + 0xad, 0xc4, 0x79, 0xbe, 0x77, 0x46, 0xfc, 0xbc, 0x40, 0x27, 0x28, 0x3e, + 0x2c, 0x30, 0xe0, 0xbd, 0xe5, 0xb6, 0xd8, 0x3c, 0x68, 0xac, 0x90, 0x3e, + 0x14, 0x75, 0x1c, 0xbe, 0x0d, 0xc9, 0x9e, 0xbe, 0x4b, 0xec, 0x4f, 0xbe, + 0x1b, 0x78, 0xcb, 0x3d, 0xf6, 0xeb, 0xd3, 0xbe, 0x38, 0xab, 0xed, 0xbd, + 0x86, 0x1a, 0xf4, 0x3d, 0x43, 0x3f, 0xd2, 0x3c, 0xbf, 0x91, 0xc3, 0xbe, + 0x76, 0x19, 0x6a, 0x3d, 0xd9, 0x29, 0x35, 0xbe, 0x3b, 0x83, 0xe7, 0xba, + 0x6e, 0xcd, 0x2e, 0xbf, 0xec, 0x5f, 0x25, 0x3e, 0xb6, 0x01, 0x9f, 0x3d, + 0xd6, 0x6e, 0x37, 0x3e, 0x09, 0x82, 0x49, 0xbe, 0x31, 0x65, 0x67, 0xbf, + 0x1a, 0xf7, 0xfc, 0xbe, 0xa9, 0x80, 0x7a, 0xbc, 0x09, 0x7e, 0xa0, 0xbe, + 0x62, 0x1c, 0x38, 0xbd, 0xce, 0x50, 0x9e, 0x3d, 0x69, 0x4b, 0x47, 0xbe, + 0x53, 0x6d, 0x8f, 0xbe, 0xee, 0x17, 0xa4, 0xbe, 0x42, 0x75, 0x52, 0x3c, + 0xe5, 0x67, 0x1a, 0xbe, 0x34, 0xb7, 0x53, 0xbf, 0xc7, 0xdf, 0xb3, 0xbd, + 0x6a, 0x60, 0x00, 0xbe, 0x32, 0xd9, 0xc0, 0x3d, 0x15, 0x83, 0x9c, 0x3b, + 0x79, 0x94, 0x9a, 0xbe, 0xac, 0x0b, 0xf1, 0xbe, 0x13, 0xd8, 0x11, 0xbe, + 0x25, 0x26, 0xb3, 0xbe, 0x13, 0xce, 0xc7, 0x3d, 0x3a, 0xb6, 0x17, 0x3e, + 0xb7, 0xd8, 0x6f, 0x3d, 0x1f, 0xc1, 0xe2, 0xbe, 0x5a, 0x21, 0x26, 0xbe, + 0xbd, 0x0b, 0x39, 0x3e, 0xf3, 0xb2, 0x87, 0x3d, 0x47, 0x17, 0xf0, 0xbe, + 0x09, 0xb9, 0xd8, 0x3d, 0x3c, 0x61, 0x81, 0x3e, 0x21, 0xe5, 0xba, 0xbd, + 0x26, 0x80, 0x0c, 0x3e, 0x95, 0x3e, 0x9a, 0xbd, 0x45, 0xc1, 0x31, 0xbe, + 0x3d, 0xa0, 0x14, 0xbd, 0x02, 0x58, 0x32, 0xbd, 0x59, 0xc7, 0xff, 0x3c, + 0x15, 0x05, 0xe2, 0x3e, 0x86, 0x1d, 0x0f, 0xbe, 0xa0, 0x40, 0xbc, 0xbe, + 0x68, 0x5e, 0x44, 0x3e, 0x99, 0x1f, 0xfb, 0x3d, 0xfe, 0x0e, 0x21, 0xbe, + 0x13, 0xf4, 0x67, 0xbe, 0x39, 0x82, 0xe1, 0xbc, 0xf4, 0x0d, 0xdb, 0x3d, + 0xd6, 0x05, 0x98, 0xbe, 0xd5, 0x96, 0x43, 0xbe, 0x0d, 0x8b, 0x04, 0xbe, + 0xdb, 0x1b, 0x9b, 0xbd, 0xa7, 0xb8, 0x86, 0xbe, 0x93, 0xa7, 0x48, 0x3e, + 0xff, 0x83, 0x70, 0xbe, 0x81, 0x92, 0xb6, 0x3e, 0x00, 0xde, 0x2d, 0xbe, + 0xcb, 0xea, 0xd1, 0xbe, 0x26, 0x5f, 0x89, 0x3d, 0xa9, 0x78, 0x94, 0xbc, + 0x46, 0xe4, 0xc0, 0xbc, 0xf8, 0x7a, 0x7f, 0xbe, 0x7f, 0x6c, 0xda, 0xbd, + 0xf0, 0x26, 0x7a, 0x3d, 0xc8, 0xe1, 0x68, 0xbe, 0xf9, 0x78, 0x22, 0xbd, + 0xc6, 0xe1, 0x7e, 0xbe, 0x48, 0xa7, 0xa1, 0xbd, 0x79, 0xdc, 0x63, 0xbc, + 0x3b, 0x33, 0x25, 0x3e, 0xe9, 0x5d, 0x8a, 0xbe, 0x68, 0x6a, 0x42, 0xbe, + 0xb6, 0x15, 0x24, 0xbd, 0x8a, 0xab, 0xec, 0xbe, 0x57, 0x0d, 0xf0, 0x3d, + 0xea, 0x0e, 0xd0, 0xbd, 0x6e, 0xe6, 0xd4, 0xbd, 0xc1, 0x3c, 0x84, 0xbe, + 0xfe, 0xc7, 0x0f, 0xbe, 0xe0, 0x6e, 0x3b, 0xbd, 0xb5, 0x5b, 0x75, 0xbe, + 0x57, 0xb2, 0x70, 0xbe, 0x9a, 0xb9, 0x45, 0x3c, 0xc0, 0xe1, 0xd2, 0xbc, + 0x71, 0xc3, 0xbc, 0xbd, 0xc1, 0x3a, 0x0b, 0x3d, 0x0d, 0x92, 0xd4, 0xbc, + 0x90, 0x72, 0x14, 0xbd, 0x19, 0x0f, 0x79, 0x3c, 0x8d, 0xb0, 0xc9, 0xbe, + 0xec, 0x8b, 0xe0, 0x3d, 0x61, 0xeb, 0x92, 0xbd, 0xcc, 0x90, 0xf1, 0xbd, + 0xc4, 0x38, 0x92, 0xbd, 0x89, 0xa0, 0x33, 0xbc, 0x4e, 0xe5, 0x4d, 0xbd, + 0x7a, 0xd2, 0x83, 0xbd, 0x61, 0x9a, 0xd0, 0x3d, 0x33, 0xca, 0x94, 0xbd, + 0x8c, 0x1a, 0xb3, 0x3d, 0x4e, 0x06, 0x51, 0x3e, 0xd5, 0x7a, 0xb3, 0x3d, + 0x6a, 0x1d, 0x01, 0xbe, 0x3a, 0xc0, 0xc4, 0x3e, 0xe6, 0xf7, 0xee, 0xbd, + 0xe2, 0x8e, 0x1f, 0xbe, 0xc2, 0xfd, 0x96, 0x3e, 0x6c, 0xe1, 0x62, 0xbe, + 0xff, 0xd8, 0x13, 0xbe, 0xbd, 0xb6, 0x81, 0xbd, 0xd8, 0xdc, 0x4a, 0x3b, + 0xe5, 0xe2, 0xcb, 0x3a, 0x49, 0x4c, 0xc3, 0xbd, 0xfb, 0x38, 0xa1, 0x3d, + 0x96, 0x5e, 0xa7, 0xbc, 0xcb, 0xde, 0x23, 0x3d, 0x0f, 0x0d, 0x8f, 0x3e, + 0x9b, 0x54, 0x04, 0x3e, 0x7d, 0x1b, 0x78, 0xbd, 0x06, 0x2f, 0x2a, 0x3e, + 0x3e, 0x9a, 0xce, 0xbe, 0xa2, 0xa0, 0xa7, 0xbe, 0x58, 0x1f, 0x5e, 0x3e, + 0x23, 0xe4, 0xc5, 0x3c, 0x25, 0xc4, 0x1f, 0xbe, 0x9a, 0x80, 0x56, 0x3b, + 0x69, 0xb9, 0x17, 0x3e, 0x4d, 0xd6, 0xf1, 0x3d, 0xf3, 0x63, 0x4a, 0xbe, + 0x2b, 0xa0, 0xcd, 0x3d, 0x14, 0xc3, 0x28, 0xbe, 0x61, 0x71, 0x05, 0x3e, + 0x6a, 0xb8, 0x07, 0x3d, 0x55, 0xf9, 0x2b, 0x3e, 0x39, 0x86, 0x0f, 0xbd, + 0x38, 0xd5, 0x61, 0x3e, 0xdb, 0x24, 0xa6, 0xbe, 0x20, 0xde, 0x2c, 0xbe, + 0x15, 0x3f, 0xc8, 0x3d, 0x9e, 0x9b, 0x45, 0x3d, 0xed, 0x09, 0x22, 0xbe, + 0x2a, 0x2c, 0x33, 0xbe, 0x37, 0x8a, 0x54, 0xbd, 0x48, 0x0c, 0x84, 0xba, + 0x2f, 0x23, 0x12, 0xbe, 0xc4, 0x7c, 0x48, 0x3e, 0x82, 0xd5, 0x95, 0xbe, + 0x79, 0xda, 0x06, 0x3c, 0x2d, 0xf1, 0x33, 0x3d, 0x55, 0x60, 0x77, 0xbd, + 0x1d, 0x61, 0x05, 0xbe, 0x81, 0xcb, 0x8d, 0x3e, 0x06, 0x08, 0x01, 0xbe, + 0x95, 0xc7, 0x51, 0xbd, 0xf0, 0x72, 0x99, 0xbd, 0x06, 0xb2, 0xc6, 0x3d, + 0xfb, 0x0f, 0xca, 0x3d, 0x8e, 0x73, 0x7e, 0x3b, 0xfd, 0x34, 0x67, 0xbd, + 0x70, 0x32, 0xdd, 0xbc, 0x2d, 0x99, 0xea, 0xbe, 0xc2, 0x73, 0x64, 0xbd, + 0x00, 0x94, 0x0f, 0xbe, 0x75, 0x7a, 0xba, 0xbd, 0x85, 0xc4, 0x2a, 0x3d, + 0x76, 0x88, 0x30, 0x3d, 0x53, 0x72, 0x9d, 0xbd, 0x30, 0x57, 0x81, 0x3e, + 0x6e, 0x96, 0x95, 0xbd, 0x3c, 0x35, 0x38, 0x3d, 0x9b, 0x98, 0x6f, 0xbb, + 0xf0, 0x78, 0x27, 0x3d, 0xdc, 0xa7, 0x13, 0x3d, 0x6d, 0x26, 0x01, 0x3e, + 0x0c, 0x56, 0x0d, 0x3c, 0x34, 0x73, 0x26, 0x3d, 0x9c, 0xd1, 0xe5, 0xbe, + 0x3a, 0x3d, 0x80, 0xbd, 0x12, 0x3e, 0xf8, 0xbd, 0xaf, 0x15, 0x82, 0xbd, + 0x50, 0x20, 0x49, 0xbe, 0x69, 0x45, 0x3e, 0x3e, 0xaa, 0xf1, 0x2d, 0xbe, + 0x46, 0x98, 0x5a, 0xbe, 0x3a, 0x09, 0xb8, 0xbe, 0x10, 0xa7, 0x6b, 0xbe, + 0xf4, 0x2a, 0x71, 0x3e, 0x34, 0xde, 0x1a, 0xbd, 0x14, 0x25, 0xc5, 0x3d, + 0xac, 0x10, 0x0e, 0xbd, 0xdd, 0xd6, 0x6c, 0x3e, 0x4a, 0x10, 0x6d, 0x3d, + 0x8a, 0x02, 0x45, 0xbe, 0x79, 0x00, 0x82, 0x3d, 0xa0, 0x2d, 0x6d, 0x3e, + 0xcf, 0x3b, 0xaa, 0xbd, 0x62, 0xbc, 0x3b, 0x3d, 0x1d, 0x84, 0x85, 0x3e, + 0x74, 0x75, 0x49, 0xbe, 0x72, 0x3d, 0x81, 0xbe, 0xd5, 0xb1, 0x13, 0xbe, + 0x15, 0x6e, 0x95, 0xbe, 0x6f, 0x24, 0x95, 0x3e, 0x07, 0xc3, 0x22, 0x3e, + 0x71, 0x27, 0x1c, 0xbd, 0xf8, 0x56, 0x55, 0xbe, 0x4d, 0x4b, 0x50, 0xbe, + 0x4e, 0x36, 0x61, 0xbd, 0xb4, 0x21, 0x08, 0xbf, 0x18, 0x79, 0xe1, 0xbc, + 0x05, 0x0e, 0x58, 0x3e, 0xaf, 0xa3, 0xff, 0xbd, 0x20, 0x4e, 0x78, 0xbd, + 0xce, 0x7a, 0xfe, 0xbc, 0x8d, 0xca, 0x02, 0xbe, 0x0c, 0x26, 0xb8, 0xbe, + 0x64, 0x00, 0xab, 0xbe, 0xd2, 0x25, 0x2b, 0xbe, 0x1f, 0x46, 0x4e, 0xbd, + 0x30, 0x12, 0xa0, 0xbd, 0xea, 0xae, 0x29, 0x3e, 0x7f, 0xe0, 0x8f, 0xbe, + 0x9e, 0x18, 0x2b, 0x3d, 0xe2, 0xa8, 0x14, 0xbe, 0x23, 0xe3, 0x17, 0x3c, + 0xee, 0xc3, 0x21, 0x3e, 0x43, 0xdf, 0xce, 0x3d, 0x12, 0x1c, 0xd2, 0xbb, + 0x7f, 0xd5, 0xca, 0x3d, 0x3c, 0x5c, 0xf1, 0x3d, 0x95, 0x71, 0x44, 0x3d, + 0x93, 0xf3, 0xba, 0xbe, 0x68, 0x93, 0x5c, 0xbe, 0x10, 0x67, 0xf1, 0xbe, + 0x2a, 0x15, 0x18, 0x3d, 0x73, 0xe2, 0x82, 0x3b, 0xd6, 0x91, 0xbc, 0x3d, + 0x52, 0xcb, 0xb9, 0xbe, 0xcb, 0x4a, 0xd7, 0x3c, 0x6c, 0x72, 0xa3, 0xbe, + 0xf7, 0xb6, 0xed, 0xbc, 0xf2, 0x4b, 0x78, 0x3a, 0x22, 0x3b, 0x92, 0xbe, + 0x93, 0xd9, 0x90, 0x3e, 0x45, 0x47, 0x15, 0xbe, 0x15, 0xb5, 0x29, 0xbc, + 0x12, 0x00, 0xe3, 0xbd, 0xfb, 0xb2, 0xa7, 0xbe, 0x88, 0x19, 0x9b, 0xbe, + 0x18, 0x47, 0x29, 0xbe, 0x65, 0xe8, 0xec, 0xbb, 0xd7, 0x95, 0x5e, 0xbe, + 0x44, 0xf0, 0xae, 0xbd, 0x5e, 0xb2, 0x63, 0xbe, 0x8f, 0x8c, 0xda, 0xbd, + 0x21, 0xec, 0xce, 0x3c, 0x61, 0xec, 0xc9, 0xbd, 0xc4, 0xbc, 0xae, 0xbe, + 0x55, 0x77, 0xa7, 0xbe, 0x5b, 0x6f, 0x43, 0xbe, 0x09, 0x7c, 0x72, 0x3d, + 0x07, 0x9c, 0x9d, 0xbe, 0xa3, 0x3f, 0x50, 0x3c, 0x1c, 0xa9, 0x0c, 0xbe, + 0x67, 0x2d, 0x3b, 0xbd, 0xc4, 0xed, 0x10, 0x3d, 0x50, 0xa2, 0xd4, 0xbe, + 0x47, 0x29, 0x0c, 0xbe, 0x9d, 0x91, 0x12, 0x3d, 0x88, 0xdd, 0x67, 0xb8, + 0x38, 0x07, 0x2f, 0xbe, 0x1a, 0x06, 0x37, 0xbc, 0x62, 0x98, 0xa3, 0xbe, + 0x98, 0xcc, 0x81, 0x3e, 0x6e, 0x97, 0xd6, 0xbd, 0x95, 0x8b, 0xdd, 0xbd, + 0x79, 0xa4, 0xf3, 0x3c, 0xb5, 0xc2, 0x11, 0xbe, 0xd3, 0xec, 0x66, 0xbe, + 0xa3, 0x56, 0x80, 0xbc, 0x01, 0x00, 0x63, 0x3c, 0x56, 0x89, 0x87, 0x3b, + 0xe2, 0x59, 0x39, 0xbe, 0x4d, 0x6d, 0xfb, 0x3d, 0xa0, 0x39, 0xcc, 0x3d, + 0x69, 0x45, 0x8e, 0xbd, 0x5f, 0x84, 0xd6, 0x3d, 0xa1, 0x84, 0xbd, 0x3d, + 0x10, 0x07, 0x38, 0xbe, 0x9e, 0xfa, 0x10, 0x3e, 0xb7, 0xa7, 0x29, 0xbe, + 0x97, 0x88, 0x6a, 0xbd, 0xbe, 0x44, 0x49, 0xbc, 0x6d, 0xaf, 0x52, 0xbe, + 0x1b, 0x47, 0x60, 0xbd, 0x2d, 0x4d, 0x09, 0x3e, 0xaf, 0x9b, 0x4d, 0x3d, + 0x0e, 0x61, 0x8d, 0x3b, 0x79, 0xf0, 0x43, 0x3e, 0xf1, 0xe4, 0x6e, 0x3e, + 0x30, 0x82, 0xb4, 0x3d, 0xb1, 0x9a, 0x1f, 0xbe, 0xf0, 0x6d, 0xe7, 0x3d, + 0xa4, 0x03, 0x72, 0x3d, 0xf6, 0x2b, 0xa5, 0x3b, 0xd0, 0x1c, 0xd9, 0x3d, + 0x46, 0x22, 0xaa, 0xbe, 0xd3, 0x08, 0x54, 0xbd, 0xcd, 0xb1, 0xc2, 0xba, + 0x07, 0xf2, 0xb6, 0xbd, 0xfe, 0x75, 0x73, 0x3c, 0xe4, 0x9b, 0x0a, 0xbd, + 0xc7, 0x90, 0x9e, 0xbd, 0xf1, 0xea, 0xa7, 0x3c, 0xc8, 0x26, 0x52, 0x3e, + 0xfc, 0x27, 0xc7, 0x3e, 0x97, 0x6f, 0xa9, 0x3d, 0x7f, 0xcb, 0x24, 0xbe, + 0x7d, 0x06, 0xb8, 0xbd, 0xa3, 0x40, 0x5e, 0x3d, 0x27, 0x47, 0x2b, 0xbe, + 0x44, 0x61, 0x8d, 0x3e, 0x04, 0x26, 0x8c, 0xbe, 0x5c, 0x59, 0xfa, 0xbd, + 0xcf, 0xf0, 0xa6, 0xbd, 0xc6, 0xdd, 0x9c, 0x3d, 0x44, 0xe8, 0x70, 0xbe, + 0xda, 0x14, 0x31, 0xbe, 0x38, 0xdb, 0xd2, 0xbd, 0x50, 0xa7, 0x19, 0x3d, + 0xf0, 0x2d, 0x3b, 0x3e, 0xfd, 0x9c, 0xe7, 0x3e, 0xb3, 0x62, 0xbb, 0x3d, + 0xe6, 0xe4, 0x95, 0x3c, 0xa4, 0x26, 0x10, 0x3e, 0xf6, 0x96, 0x4d, 0x3d, + 0xd8, 0x93, 0x34, 0xbd, 0x87, 0x9d, 0x81, 0xbd, 0x4f, 0xb4, 0x85, 0xbd, + 0x7a, 0xb6, 0x55, 0xbe, 0xbd, 0xfd, 0x84, 0x3d, 0x53, 0xa2, 0x15, 0x3e, + 0x10, 0x1e, 0x93, 0xbe, 0x4e, 0xab, 0xc5, 0xbd, 0x55, 0xd9, 0xdf, 0x3d, + 0xca, 0xf4, 0x6d, 0x3d, 0xdb, 0xfe, 0x84, 0x3e, 0x95, 0x98, 0x36, 0x3e, + 0x93, 0x3e, 0xfd, 0x3c, 0x61, 0x70, 0x04, 0xbd, 0x46, 0x72, 0xe4, 0x3c, + 0xa9, 0x0e, 0x58, 0xbe, 0xe5, 0x86, 0x33, 0x3d, 0x2d, 0x46, 0x03, 0xbe, + 0x94, 0xdc, 0xf0, 0xbd, 0xaa, 0x48, 0x27, 0xbe, 0x34, 0xb0, 0x63, 0xbd, + 0x56, 0x1f, 0xb7, 0xbb, 0xcd, 0xce, 0xde, 0xbd, 0xc7, 0xb0, 0x4d, 0x3d, + 0x65, 0x11, 0x01, 0x3e, 0xf5, 0xab, 0x8a, 0x3d, 0x34, 0xe1, 0x10, 0xbe, + 0x49, 0x06, 0xff, 0xbd, 0xb6, 0xe4, 0x69, 0xbe, 0xc8, 0x48, 0x78, 0xbd, + 0x1a, 0x63, 0x2b, 0x3d, 0x7f, 0x73, 0x35, 0xbe, 0x1e, 0x01, 0xf5, 0xbd, + 0x89, 0xad, 0x6b, 0xbe, 0x6a, 0x85, 0x09, 0x3d, 0x74, 0x69, 0xf6, 0xbd, + 0x62, 0x39, 0xc9, 0xbe, 0x72, 0x00, 0x8e, 0x3d, 0xfc, 0xa5, 0x9c, 0xbe, + 0x53, 0x4e, 0x95, 0xbd, 0xc7, 0x7d, 0xae, 0xbb, 0xa7, 0x61, 0xb9, 0xba, + 0xb8, 0x9a, 0xce, 0xbe, 0x80, 0xcc, 0xd2, 0xbe, 0xcf, 0xeb, 0x5c, 0xbe, + 0x69, 0xa4, 0x0e, 0xbd, 0x12, 0xa9, 0x1e, 0xbe, 0xc9, 0x6d, 0x50, 0xbe, + 0xfc, 0xd5, 0xe6, 0xbd, 0x9f, 0x5c, 0xd0, 0xbe, 0x33, 0xcf, 0xbb, 0xbd, + 0x70, 0x66, 0xa5, 0xbe, 0x6b, 0x92, 0xfa, 0xbe, 0x27, 0xa0, 0x4b, 0x3d, + 0x5d, 0x26, 0x75, 0xbe, 0x46, 0x63, 0x8c, 0xbe, 0x57, 0x65, 0xaf, 0xbd, + 0xea, 0xd8, 0x1c, 0x3d, 0xcd, 0x4f, 0xc2, 0xbe, 0x87, 0xf0, 0x0b, 0xbf, + 0x25, 0xdf, 0xd9, 0xbe, 0x5d, 0x6a, 0x4e, 0x3d, 0xaa, 0x06, 0xf1, 0xbd, + 0x31, 0xe2, 0x60, 0xbe, 0x72, 0x6f, 0xf2, 0xbc, 0xb9, 0x4a, 0x9e, 0xbe, + 0xfb, 0xb0, 0xd7, 0xbd, 0x9f, 0xfa, 0x96, 0xbe, 0xc8, 0x14, 0x13, 0xbf, + 0xaa, 0x6a, 0x39, 0xbc, 0x7f, 0x24, 0x5a, 0xbd, 0x12, 0x36, 0xa9, 0x3d, + 0x9e, 0x86, 0x60, 0x3d, 0xbc, 0x33, 0x85, 0x3c, 0x4c, 0x72, 0xf2, 0xbe, + 0x39, 0x9f, 0xba, 0xbe, 0xc2, 0xa5, 0x68, 0xbe, 0x35, 0x06, 0xa1, 0x3c, + 0xb5, 0xad, 0x53, 0x3d, 0x3e, 0xd0, 0xa2, 0xbd, 0xfd, 0x9b, 0xaa, 0x3c, + 0x0a, 0x8f, 0xa8, 0x3e, 0x24, 0xca, 0x09, 0xbd, 0x14, 0x2c, 0x4c, 0xbe, + 0x56, 0x1b, 0xae, 0xbd, 0x9d, 0x45, 0x60, 0xbc, 0xb7, 0x16, 0x5f, 0xbe, + 0x57, 0x8f, 0x8d, 0x3e, 0x5d, 0xab, 0x50, 0xbd, 0xcc, 0x11, 0xb0, 0x3c, + 0x52, 0x21, 0xd1, 0xbe, 0xfb, 0xff, 0xb2, 0xbc, 0x9b, 0xd1, 0x14, 0xbe, + 0xfc, 0x2c, 0x7e, 0xbd, 0x39, 0x94, 0xfb, 0xb9, 0xca, 0x93, 0xca, 0xbd, + 0x0a, 0xa7, 0xfc, 0xbd, 0xf6, 0xd3, 0x7f, 0x3e, 0xd3, 0xda, 0x0b, 0xbe, + 0x8e, 0xf9, 0x99, 0xbd, 0xc5, 0xe4, 0x73, 0xbd, 0xba, 0x7d, 0xae, 0xbd, + 0x5b, 0x0e, 0x24, 0x3d, 0xcf, 0x46, 0x90, 0x3d, 0x42, 0x80, 0x88, 0xbc, + 0x93, 0x44, 0xa0, 0x3c, 0x02, 0x2c, 0x53, 0xbb, 0xb3, 0x0d, 0xdf, 0x3e, + 0xf3, 0x46, 0xc8, 0x3c, 0xc5, 0x84, 0xa4, 0xbd, 0xf8, 0x13, 0xad, 0x3b, + 0x6d, 0x41, 0xb5, 0x3c, 0xeb, 0x74, 0x5f, 0xbe, 0x67, 0x82, 0xd0, 0x3e, + 0x3c, 0xd0, 0x9c, 0xbd, 0xa0, 0x97, 0x48, 0x3e, 0x1f, 0x0a, 0x36, 0xbe, + 0xf6, 0x51, 0x4a, 0xbd, 0x4f, 0xe5, 0x20, 0xbe, 0xa1, 0x8e, 0x0d, 0xbd, + 0x70, 0x13, 0x9c, 0xbd, 0xe8, 0x43, 0xb1, 0xbb, 0xc3, 0x59, 0xa4, 0x3e, + 0x06, 0xd6, 0x10, 0x3e, 0x8e, 0x8e, 0x88, 0x3e, 0xe8, 0xa8, 0xe1, 0xbd, + 0xb3, 0x6e, 0x6b, 0xbe, 0x28, 0x96, 0x7f, 0xbe, 0xde, 0xcc, 0xab, 0xbe, + 0xb0, 0xc9, 0xa6, 0xbe, 0x60, 0x75, 0xc5, 0x3d, 0x39, 0x36, 0xea, 0x3d, + 0x53, 0x43, 0xea, 0xbe, 0xb0, 0x9d, 0x9e, 0x3d, 0x06, 0x01, 0x7c, 0xbe, + 0xb8, 0x49, 0x51, 0xbe, 0x7c, 0xad, 0xe8, 0x3c, 0xe2, 0x4e, 0xc6, 0x3c, + 0x9f, 0x1f, 0x56, 0xbe, 0x5a, 0xd7, 0x79, 0x3d, 0x62, 0x73, 0x81, 0xbe, + 0xe6, 0xc1, 0xd1, 0x3c, 0x4e, 0x1c, 0x18, 0x3f, 0x2a, 0xe7, 0xa4, 0x3e, + 0xf6, 0x80, 0x24, 0x3e, 0x06, 0xf7, 0x00, 0x3f, 0x34, 0x8e, 0x91, 0xbe, + 0x17, 0x9f, 0xf3, 0x3c, 0xc5, 0x69, 0x15, 0x3f, 0x18, 0xd8, 0xab, 0x3d, + 0x98, 0xd2, 0x55, 0x3d, 0xf1, 0x5f, 0xdb, 0x3e, 0x21, 0x48, 0x05, 0xbf, + 0xf7, 0x44, 0x65, 0xbd, 0xbd, 0x27, 0xf6, 0x3e, 0x4e, 0x58, 0xaa, 0x3e, + 0x1f, 0x87, 0xd5, 0x3b, 0x4e, 0x6f, 0xa8, 0xbd, 0x1f, 0x08, 0xd0, 0xbe, + 0x06, 0xd5, 0x76, 0x3d, 0x15, 0xf8, 0x48, 0x3e, 0x38, 0xe0, 0x0e, 0xbf, + 0xaa, 0x5c, 0xaf, 0xbd, 0xfd, 0xe2, 0xbd, 0xbe, 0x54, 0x5b, 0x2f, 0xbf, + 0x37, 0xe6, 0xd9, 0x3d, 0xd4, 0x6d, 0x89, 0xbe, 0xe4, 0xa0, 0xc4, 0x3c, + 0x76, 0x37, 0xe2, 0xbe, 0xd2, 0xf0, 0x98, 0x3c, 0xe7, 0x7a, 0xcc, 0x3e, + 0xaa, 0x3f, 0x11, 0xbf, 0x86, 0x4a, 0x3e, 0xbf, 0xae, 0xa4, 0xe5, 0x3b, + 0x62, 0x98, 0x31, 0xbe, 0xff, 0x4e, 0x80, 0x3d, 0x79, 0xe7, 0xba, 0xbd, + 0x93, 0x5b, 0xca, 0xbe, 0x3c, 0x97, 0x97, 0x3d, 0xf1, 0x41, 0x2d, 0xbf, + 0xc9, 0xa4, 0x4b, 0xbf, 0x9e, 0x2a, 0xde, 0x3d, 0xad, 0x4e, 0x84, 0xbe, + 0x01, 0x2f, 0x5c, 0x3b, 0xab, 0x1c, 0x45, 0xbe, 0x32, 0x41, 0x2b, 0x3c, + 0x73, 0x53, 0x50, 0x3e, 0xe2, 0xc4, 0x06, 0xbf, 0x62, 0xef, 0x13, 0xbf, + 0x6e, 0x3d, 0x86, 0x3c, 0x6d, 0x9a, 0xee, 0xbd, 0x49, 0xbc, 0xa8, 0x3d, + 0x68, 0xfe, 0x11, 0x3e, 0xde, 0x38, 0xfa, 0xbe, 0xbc, 0x06, 0x81, 0xbc, + 0xb7, 0x85, 0xc3, 0xbe, 0x26, 0x4f, 0x24, 0xbf, 0xe8, 0x94, 0xbb, 0xbb, + 0x16, 0x0e, 0x9b, 0xbe, 0xca, 0xe8, 0x52, 0xbe, 0xa2, 0xb7, 0x53, 0xbd, + 0x04, 0xef, 0x52, 0x3b, 0x08, 0xad, 0x1e, 0xbd, 0x72, 0xba, 0x01, 0xbf, + 0xd7, 0x49, 0x87, 0xbe, 0xf3, 0x7b, 0xf2, 0x3c, 0xfc, 0x8e, 0x84, 0x3d, + 0xcf, 0xcc, 0x3a, 0x3d, 0x35, 0xe0, 0xe4, 0xbc, 0x88, 0x88, 0x05, 0x3d, + 0x8d, 0x2f, 0xab, 0x3d, 0x33, 0x4f, 0x49, 0xbe, 0xc6, 0x68, 0xfc, 0xbe, + 0xfc, 0x90, 0x2f, 0xbb, 0x20, 0x38, 0xc1, 0xbd, 0x19, 0x53, 0x27, 0xbd, + 0xa2, 0xee, 0x09, 0xbe, 0x5e, 0x6f, 0x6b, 0x3d, 0x1e, 0xf9, 0x0d, 0x3d, + 0x76, 0xd5, 0xdd, 0xbe, 0xe3, 0xa8, 0xac, 0xbe, 0xaa, 0xad, 0x0d, 0x3d, + 0x91, 0x62, 0xce, 0xbd, 0x83, 0x52, 0xbb, 0xbc, 0xfd, 0x4e, 0x18, 0x3e, + 0x98, 0x73, 0x8f, 0xbd, 0x55, 0x1f, 0x55, 0x39, 0xb9, 0x85, 0x67, 0xbe, + 0x1a, 0xcf, 0xd3, 0xbe, 0x97, 0x08, 0x14, 0xbd, 0xca, 0xf1, 0x11, 0xbe, + 0x8b, 0x4b, 0x39, 0xbe, 0xe8, 0xe0, 0xd8, 0xbc, 0x0a, 0xf4, 0x26, 0xbc, + 0x0d, 0xda, 0x20, 0xbd, 0x52, 0xe7, 0xb1, 0xbe, 0xfc, 0x69, 0xd3, 0xbe, + 0x6f, 0x10, 0xc8, 0x3c, 0xb8, 0xb5, 0x20, 0xbe, 0xcd, 0xd6, 0x72, 0x3d, + 0xb4, 0x1b, 0xca, 0xbd, 0x1c, 0xa7, 0xfb, 0xbd, 0xf4, 0x0c, 0x91, 0xbd, + 0x95, 0xec, 0xda, 0xbc, 0x00, 0xff, 0x2b, 0xbe, 0x17, 0x4b, 0x45, 0xbd, + 0x45, 0x0c, 0x85, 0xbe, 0x97, 0x38, 0x88, 0xbd, 0x76, 0xfb, 0x0a, 0xbe, + 0xe3, 0xb5, 0xdf, 0x3c, 0x80, 0x2c, 0xd5, 0x3d, 0xc7, 0xb8, 0xb5, 0xbe, + 0x94, 0x5d, 0xba, 0xbe, 0x1e, 0x73, 0xba, 0x3c, 0xe6, 0x81, 0x25, 0xbe, + 0xff, 0x3d, 0x49, 0x3d, 0xc1, 0x10, 0x7d, 0x3e, 0x62, 0x4f, 0x55, 0xbe, + 0x3e, 0x29, 0x2f, 0xbe, 0x8c, 0x31, 0x6c, 0xbe, 0xb3, 0x0f, 0xdf, 0xbe, + 0x63, 0x87, 0xb2, 0xbc, 0xf0, 0x8a, 0x3f, 0xbe, 0x24, 0xe6, 0x92, 0x3c, + 0xb3, 0x20, 0xa7, 0xbd, 0x89, 0xa6, 0xb4, 0x3b, 0x73, 0xe7, 0xfc, 0x3d, + 0xe7, 0x9d, 0xbc, 0xbe, 0x09, 0x19, 0x97, 0xbe, 0x7c, 0xfc, 0x78, 0x3d, + 0xae, 0x7b, 0x23, 0xbe, 0xe5, 0x86, 0x3a, 0x3d, 0x07, 0x56, 0x87, 0xbd, + 0x8e, 0x90, 0x87, 0xbe, 0xc4, 0x20, 0x4e, 0xbe, 0x22, 0x0e, 0x38, 0xbc, + 0xe7, 0x44, 0xae, 0xbe, 0xa8, 0xd5, 0x1a, 0x3d, 0x93, 0x4e, 0x93, 0xbe, + 0x00, 0xb9, 0x2f, 0xbc, 0x30, 0xcf, 0xb5, 0xbe, 0xfb, 0x54, 0x8b, 0xbb, + 0x65, 0xd0, 0x00, 0x3e, 0xd5, 0x24, 0xda, 0xbe, 0xcf, 0xc4, 0xd8, 0xbe, + 0x34, 0x93, 0xb9, 0x3c, 0x02, 0x97, 0x8a, 0xbe, 0x8f, 0xd4, 0x22, 0x3d, + 0x9a, 0xfc, 0xa8, 0xbe, 0x3c, 0x29, 0x5c, 0xbd, 0xab, 0x08, 0xf5, 0x3c, + 0x45, 0x1e, 0x42, 0xbe, 0xc4, 0x6e, 0xc9, 0xbe, 0x0a, 0xb0, 0xce, 0x3c, + 0x7c, 0xf9, 0x94, 0xbe, 0x09, 0xeb, 0x1f, 0xbe, 0x82, 0x6a, 0x9e, 0xbe, + 0x29, 0x1f, 0x9e, 0x3c, 0x00, 0x19, 0x0d, 0x3d, 0x47, 0x54, 0x77, 0xbe, + 0x31, 0x68, 0x44, 0xbf, 0x0a, 0x4c, 0x14, 0x3d, 0xdd, 0x90, 0xe0, 0x3d, + 0xd4, 0xc2, 0x8e, 0x3d, 0x64, 0xfb, 0xa7, 0xbe, 0x76, 0x35, 0x63, 0xbe, + 0xdf, 0xe6, 0x18, 0xbe, 0x82, 0x50, 0x08, 0xbf, 0xd5, 0x97, 0x1b, 0xbf, + 0x28, 0x8d, 0xce, 0xbc, 0x09, 0xa0, 0xaa, 0xbe, 0xbc, 0x7f, 0xce, 0xbd, + 0xae, 0x93, 0x7a, 0xbe, 0x6c, 0x9f, 0xec, 0x3b, 0xf2, 0x7c, 0x89, 0x3d, + 0xa7, 0x8e, 0x9b, 0xbe, 0x7d, 0x7e, 0x01, 0xbf, 0x0d, 0xae, 0x7e, 0x3d, + 0xfc, 0xe0, 0x09, 0xbd, 0xf4, 0x70, 0x5a, 0x3d, 0xd3, 0x33, 0xf9, 0xbd, + 0xc5, 0xf8, 0xbb, 0xbe, 0xd5, 0xc6, 0x8d, 0xbe, 0xc9, 0xb1, 0x5e, 0xbe, + 0x93, 0x6e, 0xd6, 0xbe, 0xae, 0x9a, 0xca, 0x3c, 0x59, 0x9d, 0x62, 0xbe, + 0x95, 0x6f, 0x62, 0xbe, 0xa8, 0x20, 0xac, 0xbe, 0x40, 0xb2, 0xb0, 0x3c, + 0x08, 0xf4, 0xed, 0x3d, 0x39, 0x3c, 0x42, 0xbe, 0x31, 0x1c, 0xe3, 0xbe, + 0x1a, 0x1a, 0x0e, 0x3c, 0x59, 0x79, 0xe9, 0x3b, 0xa2, 0x22, 0x10, 0xbe, + 0x30, 0xaa, 0xa5, 0x3d, 0x71, 0x8f, 0x06, 0xbf, 0x16, 0x24, 0xa0, 0xbe, + 0x67, 0xb2, 0xc9, 0xbe, 0x52, 0x7b, 0x0f, 0xbf, 0xf9, 0xe9, 0x4f, 0x3d, + 0xac, 0x49, 0x17, 0xbe, 0xae, 0x48, 0x68, 0xbd, 0x7b, 0x00, 0xb6, 0xbe, + 0xeb, 0xb6, 0x68, 0x3c, 0xc9, 0xc1, 0xe9, 0x3d, 0xed, 0x2d, 0xc3, 0xbe, + 0xa0, 0x62, 0x41, 0xbf, 0x62, 0x09, 0x25, 0x3d, 0x9b, 0x06, 0x56, 0xbe, + 0x9f, 0x8b, 0x17, 0x3e, 0x34, 0xe7, 0x3c, 0x3c, 0x8a, 0xbb, 0x17, 0x3e, + 0x9d, 0xe9, 0x15, 0x3c, 0x24, 0x65, 0x04, 0xbf, 0x3e, 0x1f, 0x0c, 0xbe, + 0xd7, 0x33, 0x83, 0x3c, 0xc7, 0x55, 0xa0, 0xbc, 0xb4, 0xc6, 0xbf, 0xbd, + 0x5a, 0xb1, 0xfb, 0xbd, 0x64, 0x9e, 0x0b, 0x3d, 0x1a, 0xbc, 0x5f, 0x3e, + 0x3b, 0x78, 0xc8, 0x3d, 0x60, 0x10, 0xd6, 0xbd, 0x2d, 0xe4, 0x7d, 0x3d, + 0x9d, 0x40, 0x9b, 0xbe, 0xeb, 0x0c, 0xd1, 0xbc, 0x58, 0x00, 0x2e, 0xbe, + 0xb9, 0x75, 0xff, 0x3e, 0x4d, 0x20, 0xab, 0x3e, 0x26, 0x60, 0xed, 0xbd, + 0xc3, 0xb9, 0xdd, 0xbe, 0xb5, 0xda, 0xa8, 0x3e, 0x33, 0x68, 0xa2, 0x3d, + 0x43, 0xd0, 0xa9, 0x3c, 0xf1, 0x7f, 0x8b, 0x3b, 0x3f, 0x6b, 0xbf, 0x3e, + 0x6c, 0x69, 0x34, 0xbe, 0x79, 0x58, 0xf3, 0xbe, 0xf1, 0x2e, 0xdb, 0xbd, + 0x62, 0x48, 0x98, 0x3e, 0x59, 0x6d, 0x75, 0xbd, 0x37, 0x2c, 0x5a, 0x3c, + 0x13, 0xe7, 0x30, 0xbd, 0xa1, 0xac, 0xfc, 0x3c, 0xb2, 0xd8, 0x2a, 0x3e, + 0x22, 0x4b, 0xb6, 0xbd, 0xd1, 0xa3, 0x81, 0xbe, 0x73, 0x91, 0x15, 0xbd, + 0xe7, 0xfa, 0x76, 0x3d, 0x60, 0xf1, 0xdb, 0x3c, 0x07, 0xcf, 0xc2, 0x3c, + 0x7d, 0xaa, 0x8a, 0x3c, 0xa2, 0x13, 0xb1, 0x3e, 0xfa, 0x90, 0xa3, 0xbe, + 0x83, 0x37, 0x1f, 0x3e, 0xd3, 0xe8, 0xb0, 0x3d, 0xda, 0x49, 0x68, 0xbe, + 0x9d, 0x3c, 0x6b, 0x3e, 0xbc, 0x5a, 0x1d, 0xbc, 0xc9, 0x02, 0x25, 0x3d, + 0x9e, 0x16, 0x15, 0x3e, 0xb5, 0x40, 0x17, 0xbe, 0x19, 0x17, 0x1a, 0x3e, + 0x17, 0x95, 0x8c, 0xbd, 0xe5, 0x42, 0x0a, 0xbd, 0x61, 0x6f, 0xc9, 0x3d, + 0x16, 0x3c, 0x58, 0xbe, 0x19, 0x15, 0x7a, 0xbe, 0x2a, 0xb1, 0xa2, 0x3e, + 0x52, 0xa2, 0x5c, 0xbd, 0x92, 0x5f, 0x11, 0x3e, 0xb5, 0x1f, 0x2c, 0xbd, + 0xa5, 0xf8, 0x20, 0xbe, 0x0b, 0x75, 0xc9, 0x3d, 0x1e, 0x00, 0x82, 0x3e, + 0xfe, 0xa1, 0x61, 0x3d, 0xd5, 0x3f, 0x41, 0x3e, 0x09, 0x65, 0xcb, 0x3d, + 0xc5, 0x75, 0x1e, 0x3c, 0xbb, 0x0f, 0x76, 0xbe, 0xbf, 0xb6, 0xa0, 0x3d, + 0xdf, 0x04, 0xae, 0x3d, 0x9b, 0xda, 0x06, 0xbf, 0x38, 0x8c, 0x84, 0xbe, + 0x92, 0x5c, 0x0c, 0x3e, 0xb8, 0x67, 0xfc, 0xbd, 0xb7, 0xec, 0x95, 0xbd, + 0x13, 0x50, 0x15, 0xbe, 0x75, 0xb1, 0x8d, 0xbd, 0x0a, 0x71, 0x1e, 0x3e, + 0x7d, 0x79, 0xf8, 0x3d, 0x40, 0x97, 0x77, 0x3d, 0x3b, 0xe7, 0x9d, 0xbe, + 0xb2, 0x88, 0xaa, 0x3c, 0x79, 0x16, 0x44, 0x3d, 0xb9, 0xdc, 0x02, 0xbe, + 0xe1, 0xcb, 0xa3, 0xbc, 0x29, 0xda, 0xff, 0xbb, 0xb2, 0x4a, 0xb8, 0xbe, + 0xd9, 0x15, 0xfb, 0xbe, 0xf4, 0x0b, 0x43, 0xbd, 0x3e, 0xc0, 0x17, 0xbd, + 0x04, 0xa3, 0xae, 0xbc, 0xd0, 0xff, 0xdf, 0xbe, 0x72, 0xcb, 0x0f, 0x3e, + 0x03, 0x79, 0xff, 0x3d, 0x91, 0x65, 0x40, 0x3e, 0xb6, 0x77, 0xbb, 0xbd, + 0xa5, 0x8f, 0x15, 0xbf, 0x30, 0x61, 0x1e, 0xbe, 0x8b, 0xa9, 0xc2, 0x3d, + 0x6e, 0xdf, 0x06, 0xbe, 0x1e, 0x89, 0xdf, 0x3d, 0x8a, 0x8f, 0xf2, 0x3c, + 0xfd, 0xcd, 0x43, 0xbc, 0x9c, 0x4c, 0xa2, 0xbe, 0x30, 0xb4, 0x19, 0xbe, + 0xb3, 0x94, 0x45, 0x3d, 0x6c, 0xaf, 0xc1, 0xbd, 0xd4, 0x46, 0x12, 0xbf, + 0xbb, 0xde, 0x5b, 0x3e, 0x30, 0xb4, 0xb0, 0x3d, 0xce, 0x2e, 0x84, 0x3d, + 0x3e, 0x76, 0xce, 0xbd, 0x82, 0x5a, 0x93, 0xbe, 0x2d, 0x20, 0xc8, 0x3d, + 0x00, 0x41, 0x07, 0xbd, 0xb1, 0x5a, 0x36, 0xbe, 0x40, 0x9e, 0xce, 0xbc, + 0x04, 0x6a, 0x0a, 0x3e, 0x1d, 0xc6, 0x05, 0xbe, 0x48, 0xb8, 0x22, 0xbd, + 0xf7, 0x49, 0x95, 0xbe, 0xfb, 0xbd, 0xca, 0xbd, 0x25, 0x34, 0x31, 0xbe, + 0xc3, 0xe3, 0x0f, 0xbf, 0xcf, 0xb1, 0x32, 0x3d, 0x73, 0x0d, 0x86, 0x3d, + 0x05, 0xbb, 0xcf, 0xbc, 0x4a, 0xd5, 0x8d, 0xbd, 0xb3, 0x6e, 0x0d, 0xbf, + 0x64, 0xec, 0x2f, 0xbe, 0x52, 0xf8, 0x15, 0xbe, 0xd3, 0xa2, 0x80, 0x3d, + 0xac, 0x9f, 0x6a, 0xbd, 0x5e, 0xc7, 0xf9, 0xbd, 0xc8, 0x90, 0x81, 0xbd, + 0xe7, 0x9d, 0x49, 0x3d, 0xd4, 0x4a, 0x06, 0xbe, 0x43, 0x04, 0x00, 0x3d, + 0x27, 0xa5, 0xc2, 0xbe, 0x90, 0x68, 0xfa, 0xbe, 0xe9, 0xb1, 0x1c, 0x3e, + 0x6c, 0x40, 0x94, 0xbd, 0xee, 0xe3, 0x39, 0x3c, 0x40, 0xd9, 0xd7, 0xbd, + 0xe8, 0x19, 0x46, 0xbe, 0x72, 0x04, 0xaa, 0xbe, 0x80, 0xd8, 0xd3, 0xbd, + 0xe6, 0x8e, 0x04, 0xbe, 0x80, 0xea, 0xf8, 0xbc, 0xa2, 0x17, 0x51, 0x3e, + 0xd9, 0x2b, 0x59, 0x3d, 0x0c, 0x8f, 0x75, 0xbb, 0xdd, 0x53, 0x82, 0xbd, + 0x06, 0xc3, 0x50, 0x3d, 0xf2, 0x35, 0x54, 0xbe, 0xce, 0xf5, 0xea, 0xbe, + 0x22, 0x31, 0x61, 0xbc, 0x03, 0x0f, 0x4b, 0xbe, 0x1a, 0x66, 0x1e, 0x3d, + 0xb2, 0x6b, 0x22, 0xbe, 0xd7, 0x96, 0xe0, 0xbe, 0x08, 0x6f, 0xb3, 0xbe, + 0x30, 0x04, 0xf9, 0xbd, 0xea, 0x57, 0x23, 0xbe, 0x79, 0x3f, 0x8b, 0xbd, + 0xea, 0xa2, 0x62, 0x3d, 0xdc, 0x5b, 0xfb, 0x3c, 0x91, 0x51, 0x17, 0x3d, + 0xe7, 0x8d, 0x58, 0xbe, 0xab, 0x9a, 0x4f, 0xbd, 0x7c, 0xab, 0xad, 0xbe, + 0xa8, 0x66, 0x06, 0xbf, 0xbf, 0xfb, 0x9e, 0x3c, 0x48, 0xf1, 0x1e, 0xbd, + 0xad, 0xaf, 0x94, 0x3c, 0xf7, 0xdc, 0x81, 0xbe, 0xaa, 0x56, 0xda, 0xbe, + 0x41, 0xca, 0x1a, 0xbe, 0xaf, 0x06, 0xab, 0xbe, 0x9e, 0xb7, 0xa3, 0xbd, + 0x08, 0x79, 0xb6, 0x3d, 0x19, 0x31, 0x04, 0xbd, 0x90, 0xb5, 0xed, 0xbc, + 0x5d, 0xf7, 0x8a, 0x3c, 0x16, 0x86, 0x37, 0xbe, 0xa6, 0x12, 0xcd, 0x3d, + 0x82, 0x94, 0x42, 0xbe, 0xd7, 0x01, 0xad, 0xbe, 0xd1, 0xec, 0xb4, 0x3d, + 0x43, 0xf6, 0x2d, 0x3c, 0xeb, 0x80, 0xcc, 0x3d, 0x65, 0x14, 0x85, 0xbe, + 0x83, 0xc6, 0xdb, 0xbe, 0xf4, 0xd0, 0x8b, 0xbe, 0x97, 0x01, 0xfd, 0xbc, + 0x99, 0xdc, 0x9e, 0xbe, 0xf9, 0xc5, 0x09, 0x3e, 0x12, 0x1a, 0xc0, 0x3d, + 0x95, 0x7d, 0x2c, 0x3e, 0x40, 0x16, 0x88, 0xbd, 0xd0, 0x85, 0x3b, 0xbe, + 0xea, 0xef, 0x51, 0x3d, 0x63, 0xb3, 0x5b, 0xbe, 0x50, 0x49, 0xc5, 0xbe, + 0xc3, 0xa6, 0x2c, 0x3e, 0x3e, 0x64, 0x47, 0x3b, 0xfd, 0xe2, 0x22, 0x3d, + 0x1e, 0xf2, 0x52, 0xbe, 0x9d, 0x8f, 0xd6, 0xbe, 0x39, 0xf8, 0x0e, 0xbe, + 0x60, 0x67, 0x72, 0xbd, 0x05, 0x60, 0x0a, 0xbe, 0x43, 0x19, 0x8f, 0x3c, + 0x84, 0xe1, 0x3d, 0x3e, 0x7d, 0x8b, 0x24, 0x3d, 0x17, 0xf5, 0x3e, 0xbd, + 0xab, 0xf2, 0xe3, 0xbd, 0x8c, 0xc2, 0x9c, 0x3d, 0xf6, 0x55, 0x21, 0xbd, + 0x64, 0x77, 0x8a, 0xbe, 0xca, 0x5e, 0x97, 0xbb, 0x57, 0x52, 0x08, 0x3e, + 0x82, 0xb2, 0xd1, 0x3d, 0x7c, 0x53, 0x0b, 0xbd, 0x9b, 0x78, 0x9e, 0x3c, + 0xe5, 0xe2, 0xa5, 0xbd, 0x1a, 0x31, 0xbe, 0xbd, 0x37, 0x59, 0x8a, 0xbd, + 0xb5, 0x48, 0x5e, 0x3e, 0x6f, 0xd3, 0xe2, 0x3d, 0x7f, 0x74, 0x26, 0xbd, + 0x8d, 0xfe, 0x8c, 0xbe, 0x35, 0xbc, 0x75, 0xbe, 0xdf, 0xa9, 0x07, 0x3d, + 0x2c, 0x90, 0xf4, 0x3d, 0x63, 0xb0, 0x9e, 0x3d, 0x38, 0x84, 0x78, 0x3e, + 0xa4, 0x5c, 0xd1, 0x3e, 0x0c, 0x9d, 0xa8, 0xbd, 0x08, 0x4f, 0x8e, 0x3e, + 0x12, 0xc1, 0x96, 0xbe, 0x9a, 0x4c, 0xee, 0xbb, 0xe2, 0x69, 0x9a, 0x3e, + 0x71, 0x14, 0xc7, 0xbe, 0xc8, 0xaa, 0xe9, 0xbc, 0x1a, 0x81, 0xae, 0x3e, + 0x0d, 0x0f, 0x0b, 0xbf, 0x9f, 0x40, 0x15, 0xbf, 0x99, 0xec, 0x9f, 0x3e, + 0xfe, 0x81, 0x42, 0x3e, 0x74, 0xb0, 0x42, 0xbe, 0x25, 0x93, 0x96, 0xbe, + 0xee, 0x36, 0x36, 0x3d, 0xa5, 0x9f, 0xa2, 0x3d, 0x07, 0x8e, 0x3e, 0x3e, + 0x89, 0x2a, 0x9f, 0x3d, 0xe5, 0x83, 0x58, 0xbd, 0x72, 0xf7, 0x01, 0xbe, + 0x9c, 0x8b, 0x67, 0xbc, 0x28, 0xc1, 0xf7, 0xbd, 0x3b, 0x5d, 0x86, 0xbd, + 0x8c, 0x2d, 0x34, 0xbd, 0x6f, 0x8f, 0xde, 0xbe, 0x8a, 0xf3, 0xf2, 0xbe, + 0x3b, 0x49, 0xb9, 0x3e, 0xfb, 0x63, 0x83, 0xbd, 0xda, 0x2f, 0x93, 0xbe, + 0xd6, 0x44, 0xa8, 0xbe, 0x3d, 0xec, 0xff, 0x3b, 0xb5, 0xd6, 0x04, 0xbd, + 0xe3, 0xc9, 0x19, 0x3d, 0x6c, 0xdb, 0x87, 0x3d, 0x70, 0xbc, 0x9e, 0xbc, + 0x76, 0x16, 0x24, 0x3e, 0x63, 0xb6, 0x6e, 0x3d, 0xb7, 0x58, 0x9a, 0xbe, + 0x79, 0xd0, 0x21, 0x3e, 0x16, 0xe7, 0x22, 0x3b, 0x4c, 0x44, 0x4a, 0xbd, + 0x78, 0x34, 0xcc, 0xbe, 0xfd, 0x92, 0x82, 0x3d, 0x3d, 0x22, 0x9b, 0xbd, + 0x01, 0xba, 0xcb, 0xbd, 0xf0, 0xac, 0xed, 0xbc, 0x92, 0x5f, 0x09, 0x3e, + 0x76, 0x6e, 0x97, 0xbd, 0x6e, 0x7d, 0x18, 0x3d, 0xed, 0x55, 0xf8, 0x3c, + 0x01, 0xaa, 0x4a, 0x3e, 0x49, 0xf7, 0x77, 0x3e, 0xa9, 0xd2, 0xd4, 0x3d, + 0x6b, 0x7a, 0xac, 0xbd, 0xb1, 0x67, 0x90, 0xbd, 0x30, 0xf5, 0x94, 0xbd, + 0xdd, 0xb9, 0xd7, 0x3d, 0xc3, 0x2e, 0x04, 0xbe, 0xfd, 0xc1, 0xa8, 0x3d, + 0x80, 0xf0, 0x41, 0xbe, 0xae, 0x23, 0x8e, 0x3c, 0x03, 0x8a, 0x05, 0xbc, + 0x50, 0x33, 0x26, 0x3e, 0xdd, 0x04, 0xca, 0x3d, 0x11, 0xd9, 0x82, 0xbe, + 0xc9, 0x2b, 0x42, 0x3e, 0xbb, 0x94, 0x72, 0x3e, 0xdb, 0x8f, 0xa5, 0x3c, + 0xde, 0x89, 0xd0, 0x3d, 0x24, 0xb6, 0x86, 0xbe, 0x1b, 0xa7, 0x54, 0xbe, + 0x48, 0x2e, 0xd1, 0xbd, 0x5d, 0x47, 0x00, 0x3e, 0x8c, 0xd7, 0xa9, 0x3d, + 0xc9, 0x22, 0x9b, 0xbd, 0x9c, 0xa0, 0xe8, 0x3d, 0xc0, 0x7b, 0x1c, 0xbd, + 0x27, 0xd2, 0xdd, 0x3d, 0x24, 0x8e, 0xa0, 0x3d, 0x62, 0xf4, 0x53, 0xbc, + 0x16, 0x38, 0xba, 0xbe, 0x7c, 0x6e, 0xe3, 0x3d, 0x7b, 0x0d, 0x44, 0x3e, + 0xae, 0x3c, 0x8d, 0x3d, 0x1b, 0x4e, 0x4f, 0x3d, 0x73, 0x75, 0x4d, 0xbe, + 0x98, 0x9b, 0x44, 0xbe, 0xd2, 0xe8, 0x74, 0xbe, 0x8f, 0xd9, 0x56, 0x3e, + 0x74, 0x2a, 0x4e, 0x3e, 0xda, 0xb1, 0xd8, 0x3d, 0x38, 0xd7, 0x85, 0x3d, + 0x09, 0xbe, 0x3c, 0x3d, 0x24, 0x28, 0x6d, 0x3c, 0xbb, 0xcd, 0x1f, 0x3d, + 0xfb, 0x77, 0x3f, 0xbe, 0x33, 0xde, 0xbe, 0xbc, 0x5c, 0xa1, 0xb3, 0x3c, + 0x6b, 0xd1, 0x9d, 0x3d, 0xf1, 0x7b, 0x3b, 0x3e, 0x4c, 0x2c, 0x75, 0x3d, + 0x70, 0xef, 0xb2, 0xbe, 0xb5, 0x17, 0xe0, 0xbd, 0x61, 0x87, 0x65, 0xbd, + 0x3a, 0x09, 0x3e, 0x3e, 0x48, 0x49, 0xbf, 0xbb, 0x2f, 0x30, 0xaa, 0x3d, + 0x65, 0x75, 0x07, 0x3d, 0xbd, 0xc2, 0x1f, 0x3e, 0xe9, 0x8c, 0xf8, 0xbd, + 0x7c, 0x97, 0xe8, 0x3c, 0x9d, 0xc7, 0x51, 0xbb, 0x40, 0x8d, 0x89, 0xbd, + 0xd5, 0x27, 0x87, 0x3c, 0x92, 0xa1, 0x65, 0xbd, 0xf7, 0x7a, 0xa6, 0xbc, + 0xec, 0x7c, 0xd6, 0x3c, 0xf7, 0x47, 0x14, 0xbe, 0xd5, 0x0d, 0x92, 0x3c, + 0x3a, 0x11, 0x01, 0xbb, 0x9a, 0x3b, 0x03, 0x3e, 0xe0, 0xde, 0x22, 0xbe, + 0x37, 0xad, 0xe4, 0xbc, 0x4e, 0xb3, 0x03, 0xbb, 0x3f, 0xe8, 0xf6, 0xbd, + 0x87, 0x10, 0xf7, 0xbb, 0xe2, 0xc3, 0x9a, 0xbd, 0x0e, 0x42, 0x0b, 0x3e, + 0x92, 0x26, 0x9d, 0xbe, 0x4f, 0xe3, 0x32, 0xbc, 0x26, 0x0a, 0x03, 0x3e, + 0xf3, 0x60, 0xa7, 0x3c, 0x0c, 0x24, 0x05, 0x3d, 0x3e, 0xc8, 0x94, 0xbe, + 0x50, 0x31, 0x02, 0xbe, 0xff, 0xd4, 0x69, 0xbd, 0x1d, 0x42, 0x72, 0x3d, + 0xe7, 0x8c, 0x7f, 0xbe, 0x33, 0x87, 0x16, 0x3d, 0x93, 0x2c, 0xa2, 0xbd, + 0x88, 0xf0, 0xe3, 0xbb, 0xa8, 0x96, 0x84, 0x3d, 0xda, 0xc0, 0x40, 0x3e, + 0x8a, 0x68, 0x58, 0x3d, 0xad, 0xb0, 0x19, 0xbe, 0x97, 0x4e, 0x26, 0xbc, + 0x1c, 0x26, 0xe6, 0x3d, 0x48, 0x68, 0x55, 0x3d, 0xc6, 0xe3, 0xc3, 0x3d, + 0xa7, 0xe6, 0xc8, 0xbb, 0xf3, 0x00, 0x99, 0xbd, 0x2d, 0x63, 0xda, 0x3c, + 0xb4, 0xbd, 0x81, 0x3e, 0xdf, 0xb9, 0x92, 0xbe, 0x48, 0x3a, 0xb2, 0xbd, + 0x9f, 0xcb, 0xd2, 0x3d, 0x0b, 0x38, 0x97, 0x3c, 0xe2, 0x95, 0xb7, 0xbc, + 0xf6, 0x82, 0x13, 0x39, 0xc0, 0x98, 0x1a, 0x3d, 0xc2, 0xf4, 0x51, 0x3d, + 0x0d, 0xeb, 0xf5, 0x3c, 0x1d, 0xda, 0x52, 0x3d, 0xad, 0xb0, 0x77, 0x3d, + 0xca, 0x58, 0x51, 0x3d, 0x5a, 0x2d, 0xb0, 0x3c, 0xf0, 0x8b, 0xeb, 0xbd, + 0x0d, 0xd8, 0x50, 0x3e, 0x65, 0x25, 0x18, 0xbe, 0xb0, 0x18, 0xfd, 0xbe, + 0xc4, 0x02, 0x3b, 0xbd, 0xfa, 0x7b, 0x82, 0x3d, 0xce, 0xa0, 0x4d, 0xbe, + 0x0b, 0xc6, 0x32, 0xbd, 0x84, 0x62, 0xc0, 0x3d, 0x60, 0x6e, 0x1e, 0x3d, + 0x31, 0x01, 0x28, 0x3e, 0x31, 0x76, 0x04, 0x3e, 0x91, 0x6b, 0x60, 0xbd, + 0x14, 0xf5, 0x20, 0x3e, 0x5c, 0x38, 0x67, 0xbd, 0x36, 0x21, 0xc2, 0x3d, + 0x13, 0x10, 0x7e, 0xbe, 0x19, 0xd1, 0x9f, 0x3e, 0xd0, 0x1a, 0x16, 0xbe, + 0x34, 0xb5, 0xaf, 0xbe, 0x86, 0x67, 0x16, 0x3d, 0x11, 0x05, 0x58, 0xbe, + 0xfb, 0x0d, 0xd0, 0x3c, 0x90, 0x88, 0x20, 0xbd, 0xdc, 0xcc, 0x9a, 0x3d, + 0x11, 0x29, 0x7a, 0x3e, 0x05, 0x44, 0xbf, 0xbe, 0x54, 0x1a, 0x0a, 0x3e, + 0xff, 0x6f, 0xb4, 0xbd, 0xeb, 0xa4, 0x86, 0x3d, 0x5e, 0x43, 0x00, 0x3e, + 0xfa, 0x4f, 0xd9, 0xbc, 0xad, 0x7b, 0xa2, 0xbd, 0x0e, 0xf6, 0x01, 0x3e, + 0x90, 0xf0, 0xb4, 0xbd, 0xd0, 0x21, 0x9a, 0xbe, 0x74, 0x43, 0x14, 0x3e, + 0x4d, 0xe8, 0x0b, 0xbe, 0x80, 0x2b, 0x93, 0xbd, 0x87, 0x39, 0x35, 0x3e, + 0x90, 0x63, 0xb8, 0x3d, 0xcf, 0x2c, 0x83, 0x3e, 0xbd, 0xe5, 0x0b, 0xbf, + 0x5f, 0xf7, 0x90, 0x3c, 0xa0, 0x61, 0x52, 0xbc, 0x8f, 0x88, 0xac, 0xbc, + 0x0c, 0x64, 0xd3, 0x3d, 0x9c, 0xd9, 0x8b, 0x3d, 0x80, 0xb7, 0x39, 0xbe, + 0x4e, 0x30, 0x95, 0x3e, 0x73, 0x3e, 0xda, 0xbe, 0x51, 0x56, 0x84, 0x3d, + 0xe6, 0x28, 0x85, 0x3d, 0xb9, 0xe9, 0x87, 0xbe, 0x46, 0x01, 0x6c, 0xbd, + 0x4b, 0x64, 0xd5, 0x3d, 0x56, 0xfd, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x44, + 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x68, 0xfc, 0xff, 0xff, + 0x20, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0x3e, 0xc0, 0x22, 0xe7, 0x92, 0x3f, + 0x57, 0x04, 0xde, 0xbf, 0xda, 0x8f, 0x1c, 0x3e, 0x47, 0xbf, 0x05, 0xc0, + 0x53, 0xab, 0xcb, 0xbf, 0x68, 0x6a, 0x6a, 0xbf, 0xd2, 0x0b, 0xe4, 0xbf, + 0xbe, 0xfd, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, + 0x64, 0x5f, 0x31, 0x2f, 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x44, 0x5f, 0x62, + 0x69, 0x61, 0x73, 0x00, 0xd0, 0xfc, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, + 0xa3, 0x15, 0xb7, 0x3e, 0x29, 0x67, 0x95, 0x3f, 0x4b, 0x96, 0x62, 0xbe, + 0x61, 0x5f, 0xfc, 0x3e, 0xa2, 0xd4, 0x3e, 0xbf, 0x45, 0x1c, 0x0d, 0xbf, + 0x29, 0xdd, 0x70, 0xbe, 0x9a, 0x75, 0x97, 0xbf, 0xfc, 0x0a, 0x6f, 0xbe, + 0xcc, 0x56, 0x25, 0x3f, 0xdf, 0xac, 0x98, 0xbf, 0x0e, 0x1c, 0x8b, 0xbf, + 0xa5, 0xd8, 0x8c, 0x3f, 0xa5, 0x42, 0xd5, 0x3c, 0xa9, 0x8e, 0x7a, 0xbf, + 0x9e, 0xdb, 0x71, 0xbe, 0x46, 0xfe, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, + 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, + 0x6c, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x58, 0xfd, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0xc3, 0x99, 0xb6, 0xbf, 0xe9, 0x87, 0x8b, 0x3f, + 0xac, 0x83, 0x9a, 0xbf, 0x4c, 0x49, 0x3d, 0xbe, 0x9e, 0xfe, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, 0x65, 0x6e, 0x73, 0x65, + 0x5f, 0x31, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x2f, 0x52, 0x65, + 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, + 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x00, 0x00, + 0xc8, 0xfd, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x40, 0x5c, 0x8a, 0xbe, + 0xc5, 0x88, 0xaa, 0x3e, 0xb0, 0x76, 0x1f, 0xbe, 0x35, 0x3a, 0x58, 0x3e, + 0x84, 0xa5, 0xa3, 0x3e, 0x38, 0xd9, 0x49, 0x3d, 0x58, 0x63, 0x78, 0xbc, + 0x82, 0x94, 0x2e, 0xbe, 0x97, 0xde, 0x6e, 0xbe, 0xea, 0x27, 0x9f, 0xbe, + 0x1d, 0x24, 0xc0, 0x3d, 0x21, 0x31, 0x66, 0x3c, 0x80, 0xf8, 0x88, 0xbe, + 0xdd, 0x06, 0x19, 0xbe, 0x3f, 0x4b, 0xb3, 0xbe, 0x70, 0xdc, 0x8d, 0x3e, + 0x20, 0xee, 0x93, 0xbe, 0xde, 0x7c, 0xbf, 0xbe, 0xda, 0x3a, 0x50, 0xbe, + 0x0e, 0x91, 0x6e, 0x3e, 0x18, 0xbc, 0x81, 0x3e, 0x18, 0x9c, 0xfe, 0xb9, + 0x11, 0x2d, 0x9b, 0xbe, 0xa2, 0x73, 0x3f, 0xbe, 0x0c, 0x6c, 0xa3, 0xbe, + 0x37, 0x4b, 0x8c, 0xbe, 0x91, 0x26, 0xa0, 0x3d, 0xb3, 0x04, 0xbd, 0x3e, + 0x01, 0x3e, 0x70, 0xbe, 0xd1, 0xdb, 0x69, 0xbe, 0xb4, 0xc0, 0x98, 0xbe, + 0xd4, 0xd9, 0x80, 0x3e, 0x62, 0xa9, 0x74, 0xbe, 0x8a, 0xe9, 0x83, 0xbe, + 0x7a, 0x92, 0x54, 0xbe, 0x92, 0x5d, 0x43, 0x3e, 0xe3, 0x35, 0x7b, 0x3e, + 0xee, 0x81, 0x2e, 0x3d, 0xbb, 0x68, 0xec, 0x3d, 0x70, 0x72, 0x1b, 0xbe, + 0x64, 0x20, 0xa4, 0xbe, 0x4f, 0x1f, 0x8d, 0xbd, 0xee, 0xd6, 0xf8, 0x3d, + 0xdb, 0x83, 0xb0, 0x3e, 0xd1, 0x99, 0x8c, 0xbe, 0x99, 0x21, 0x45, 0xbe, + 0x97, 0x04, 0x82, 0xbe, 0x25, 0xdf, 0x88, 0x3e, 0xe2, 0xe6, 0x5b, 0xbe, + 0xe5, 0x53, 0x68, 0x3d, 0x0b, 0xcd, 0x40, 0xbe, 0x4e, 0xea, 0x55, 0x3e, + 0x54, 0xd8, 0x85, 0x3e, 0x3c, 0xba, 0x82, 0x3d, 0x58, 0xc0, 0xe9, 0x3e, + 0x0c, 0xcc, 0x29, 0xbe, 0x3a, 0x6e, 0xa2, 0xbe, 0x84, 0x4a, 0x12, 0x3e, + 0x32, 0xd9, 0xcb, 0x3d, 0xad, 0x16, 0xd4, 0x3e, 0xf5, 0xa8, 0x85, 0xbe, + 0x5c, 0x34, 0xc8, 0xbd, 0x31, 0x02, 0xac, 0xbe, 0x3e, 0x15, 0x9e, 0x3e, + 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, + 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x5f, + 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0xff, 0xff, + 0x40, 0x00, 0x00, 0x00, 0xa9, 0xa9, 0x93, 0x3f, 0x3c, 0xda, 0x21, 0xbe, + 0x33, 0xe3, 0x3d, 0x3d, 0xd8, 0xed, 0x33, 0xbf, 0x4c, 0x9d, 0x3e, 0xbf, + 0xba, 0x40, 0xa6, 0x3f, 0x6e, 0x4e, 0x25, 0xbe, 0x6e, 0x5e, 0x93, 0x3f, + 0x48, 0xa2, 0xc5, 0xbe, 0x67, 0xaa, 0x33, 0x3e, 0xc0, 0x66, 0x20, 0x3f, + 0xb3, 0x25, 0x7e, 0xbe, 0x8a, 0x2f, 0xd9, 0xbe, 0xda, 0x64, 0xc8, 0x3f, + 0x1a, 0x14, 0x89, 0xbd, 0xea, 0x48, 0x89, 0x3e, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x30, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x70, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xb0, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x01, 0xf0, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x05, + 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xa8, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x18, 0x00, 0x07, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x1c, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xce, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19, + 0xd6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0xde, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0xe6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x11, + 0xfa, 0xff, 0xff, 0xff, 0x00, 0x03, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x11, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 +}; +unsigned int model_tflite_len = 19616; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h new file mode 100644 index 00000000..42a73c86 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h @@ -0,0 +1,27 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This is a standard TensorFlow Lite model file that has been converted into a +// C data array, so it can be easily compiled into a binary for devices that +// don't have a file system. It was created using the command: +// xxd -i magic_wand_model.tflite > magic_wand_model_data.cc + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_MAGIC_WAND_MODEL_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_MAGIC_WAND_MODEL_DATA_H_ + +extern const unsigned char g_magic_wand_model_data[]; +extern const int g_magic_wand_model_data_len; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_MAGIC_WAND_MODEL_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_test.cc new file mode 100644 index 00000000..838e2b86 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/magic_wand_test.cc @@ -0,0 +1,150 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h" +#include "tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h" +#include "tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/schema/schema_generated.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(LoadModelAndPerformInference) +{ + // Set up logging + tflite::MicroErrorReporter micro_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + const tflite::Model *model = ::tflite::GetModel(g_magic_wand_model_data); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.\n", + model->version(), TFLITE_SCHEMA_VERSION); + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + // An easier approach is to just use the AllOpsResolver, but this will + // incur some penalty in code space for op implementations that are not + // needed by this graph. + static tflite::MicroMutableOpResolver<5> micro_op_resolver; // NOLINT + micro_op_resolver.AddConv2D(); + micro_op_resolver.AddDepthwiseConv2D(); + micro_op_resolver.AddFullyConnected(); + micro_op_resolver.AddMaxPool2D(); + micro_op_resolver.AddSoftmax(); + + // Create an area of memory to use for input, output, and intermediate arrays. + // Finding the minimum value for your model may require some trial and error. + const int tensor_arena_size = 60 * 1024; + uint8_t tensor_arena[tensor_arena_size]; + + // Build an interpreter to run the model with + tflite::MicroInterpreter interpreter(model, micro_op_resolver, tensor_arena, + tensor_arena_size, + µ_error_reporter); + + // Allocate memory from the tensor_arena for the model's tensors + interpreter.AllocateTensors(); + + // Obtain a pointer to the model's input tensor + TfLiteTensor *input = interpreter.input(0); + + // Make sure the input has the properties we expect + TF_LITE_MICRO_EXPECT_NE(nullptr, input); + TF_LITE_MICRO_EXPECT_EQ(4, input->dims->size); + // The value of each element gives the length of the corresponding tensor. + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(128, input->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(3, input->dims->data[2]); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[3]); + // The input is a 32 bit floating point value + TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, input->type); + + // Provide an input value + const float *ring_features_data = g_ring_micro_f9643d42_nohash_4_data; + TF_LITE_REPORT_ERROR(µ_error_reporter, "%d", input->bytes); + for (size_t i = 0; i < (input->bytes / sizeof(float)); ++i) { + input->data.f[i] = ring_features_data[i]; + } + + // Run the model on this input and check that it succeeds + TfLiteStatus invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Obtain a pointer to the output tensor and make sure it has the + // properties we expect. + TfLiteTensor *output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(4, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, output->type); + + // There are four possible classes in the output, each with a score. + const int kWingIndex = 0; + const int kRingIndex = 1; + const int kSlopeIndex = 2; + const int kNegativeIndex = 3; + + // Make sure that the expected "Ring" score is higher than the other + // classes. + float wing_score = output->data.f[kWingIndex]; + float ring_score = output->data.f[kRingIndex]; + float slope_score = output->data.f[kSlopeIndex]; + float negative_score = output->data.f[kNegativeIndex]; + TF_LITE_MICRO_EXPECT_GT(ring_score, wing_score); + TF_LITE_MICRO_EXPECT_GT(ring_score, slope_score); + TF_LITE_MICRO_EXPECT_GT(ring_score, negative_score); + + // Now test with a different input, from a recording of "Slope". + const float *slope_features_data = g_slope_micro_f2e59fea_nohash_1_data; + for (size_t i = 0; i < (input->bytes / sizeof(float)); ++i) { + input->data.f[i] = slope_features_data[i]; + } + + // Run the model on this "Slope" input. + invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Get the output from the model, and make sure it's the expected size and + // type. + output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(4, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, output->type); + + // Make sure that the expected "Slope" score is higher than the other classes. + wing_score = output->data.f[kWingIndex]; + ring_score = output->data.f[kRingIndex]; + slope_score = output->data.f[kSlopeIndex]; + negative_score = output->data.f[kNegativeIndex]; + TF_LITE_MICRO_EXPECT_GT(slope_score, wing_score); + TF_LITE_MICRO_EXPECT_GT(slope_score, ring_score); + TF_LITE_MICRO_EXPECT_GT(slope_score, negative_score); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main.cc new file mode 100644 index 00000000..c1d014fd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main.cc @@ -0,0 +1,28 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/main_functions.h" + +// This is the default main used on systems that have the standard C entry +// point. Other devices (for example FreeRTOS or ESP32) that have different +// requirements for entry code (like an app_main function) should specialize +// this main.cc file in a target-specific subfolder. +int main(int argc, char *argv[]) +{ + setup(); + while (true) { + loop(); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.cc new file mode 100644 index 00000000..5c51f804 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.cc @@ -0,0 +1,125 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/main_functions.h" + +#include "tensorflow/lite/micro/examples/magic_wand/accelerometer_handler.h" +#include "tensorflow/lite/micro/examples/magic_wand/constants.h" +#include "tensorflow/lite/micro/examples/magic_wand/gesture_predictor.h" +#include "tensorflow/lite/micro/examples/magic_wand/magic_wand_model_data.h" +#include "tensorflow/lite/micro/examples/magic_wand/output_handler.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Globals, used for compatibility with Arduino-style sketches. +namespace { +tflite::ErrorReporter *error_reporter = nullptr; +const tflite::Model *model = nullptr; +tflite::MicroInterpreter *interpreter = nullptr; +TfLiteTensor *model_input = nullptr; +int input_length; + +// Create an area of memory to use for input, output, and intermediate arrays. +// The size of this will depend on the model you're using, and may need to be +// determined by experimentation. +constexpr int kTensorArenaSize = 60 * 1024; +uint8_t tensor_arena[kTensorArenaSize]; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() +{ + tflite::InitializeTarget(); + + // Set up logging. Google style is to avoid globals or statics because of + // lifetime uncertainty, but since this has a trivial destructor it's okay. + static tflite::MicroErrorReporter micro_error_reporter; // NOLINT + error_reporter = µ_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(g_magic_wand_model_data); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + // An easier approach is to just use the AllOpsResolver, but this will + // incur some penalty in code space for op implementations that are not + // needed by this graph. + static tflite::MicroMutableOpResolver<5> micro_op_resolver; // NOLINT + micro_op_resolver.AddConv2D(); + micro_op_resolver.AddDepthwiseConv2D(); + micro_op_resolver.AddFullyConnected(); + micro_op_resolver.AddMaxPool2D(); + micro_op_resolver.AddSoftmax(); + + // Build an interpreter to run the model with. + static tflite::MicroInterpreter static_interpreter( + model, micro_op_resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + interpreter->AllocateTensors(); + + // Obtain pointer to the model's input tensor. + model_input = interpreter->input(0); + if ((model_input->dims->size != 4) || (model_input->dims->data[0] != 1) || + (model_input->dims->data[1] != 128) || + (model_input->dims->data[2] != kChannelNumber) || + (model_input->type != kTfLiteFloat32)) { + TF_LITE_REPORT_ERROR(error_reporter, + "Bad input tensor parameters in model"); + return; + } + + input_length = model_input->bytes / sizeof(float); + + TfLiteStatus setup_status = SetupAccelerometer(error_reporter); + if (setup_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Set up failed\n"); + } +} + +void loop() +{ + // Attempt to read new data from the accelerometer. + bool got_data = + ReadAccelerometer(error_reporter, model_input->data.f, input_length); + // If there was no new data, wait until next time. + if (!got_data) + return; + + // Run inference, and report any error. + TfLiteStatus invoke_status = interpreter->Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed on index: %d\n", + begin_index); + return; + } + // Analyze the results to obtain a prediction + int gesture_index = PredictGesture(interpreter->output(0)->data.f); + + // Produce an output + HandleOutput(error_reporter, gesture_index); +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.h new file mode 100644 index 00000000..976f8a34 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/main_functions.h @@ -0,0 +1,37 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_MAIN_FUNCTIONS_H_ + +// Expose a C friendly interface for main functions. +#ifdef __cplusplus +extern "C" { +#endif + +// Initializes all data needed for the example. The name is important, and needs +// to be setup() for Arduino compatibility. +void setup(); + +// Runs one iteration of data gathering and inference. This should be called +// repeatedly from the application code. The name needs to be loop() for Arduino +// compatibility. +void loop(); + +#ifdef __cplusplus +} +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_MAIN_FUNCTIONS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.cc new file mode 100644 index 00000000..6d65c17d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.cc @@ -0,0 +1,39 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/output_handler.h" + +void HandleOutput(tflite::ErrorReporter *error_reporter, int kind) +{ + // light (red: wing, blue: ring, green: slope) + if (kind == 0) { + TF_LITE_REPORT_ERROR( + error_reporter, + "WING:\n\r* * *\n\r * * * " + "*\n\r * * * *\n\r * * * *\n\r * * " + "* *\n\r * *\n\r"); + } else if (kind == 1) { + TF_LITE_REPORT_ERROR( + error_reporter, + "RING:\n\r *\n\r * *\n\r * *\n\r " + " * *\n\r * *\n\r * *\n\r " + " *\n\r"); + } else if (kind == 2) { + TF_LITE_REPORT_ERROR( + error_reporter, + "SLOPE:\n\r *\n\r *\n\r *\n\r *\n\r " + "*\n\r *\n\r *\n\r * * * * * * * *\n\r"); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.h new file mode 100644 index 00000000..a997e110 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler.h @@ -0,0 +1,24 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_OUTPUT_HANDLER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_OUTPUT_HANDLER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +void HandleOutput(tflite::ErrorReporter *error_reporter, int kind); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_OUTPUT_HANDLER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler_test.cc new file mode 100644 index 00000000..8faeeeff --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/output_handler_test.cc @@ -0,0 +1,31 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/output_handler.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestCallability) +{ + tflite::MicroErrorReporter micro_error_reporter; + HandleOutput(µ_error_reporter, 0); + HandleOutput(µ_error_reporter, 1); + HandleOutput(µ_error_reporter, 2); + HandleOutput(µ_error_reporter, 3); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.cc new file mode 100644 index 00000000..432c0f0c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.cc @@ -0,0 +1,406 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h" + +const int g_ring_micro_f9643d42_nohash_4_length = 128; +const int g_ring_micro_f9643d42_nohash_4_dim = 3; +// Raw accelerometer data with a sample rate of 25Hz +const float g_ring_micro_f9643d42_nohash_4_data[] = { + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -665.0, + 228.0, + 827.0, + -680.0, + 339.0, + 716.0, + -680.0, + 564.0, + 812.0, + -679.0, + 552.0, + 818.0, + -665.0, + 528.0, + 751.0, + -658.0, + 432.0, + 618.0, + -655.0, + 445.0, + 592.0, + -667.0, + 484.0, + 556.0, + -684.0, + 590.0, + 510.0, + -674.0, + 672.0, + 475.0, + -660.0, + 786.0, + 390.0, + -562.0, + 1124.0, + 128.0, + -526.0, + 1140.0, + 111.0, + -486.0, + 1044.0, + 33.0, + -416.0, + 652.0, + -134.0, + -390.0, + 534.0, + -143.0, + -365.0, + 381.0, + -117.0, + -314.0, + 60.0, + 94.0, + -322.0, + 7.0, + 190.0, + -338.0, + -95.0, + 342.0, + -360.0, + -106.0, + 842.0, + -351.0, + -41.0, + 965.0, + -352.0, + 12.0, + 960.0, + -366.0, + 42.0, + 1124.0, + -322.0, + 56.0, + 1178.0, + -312.0, + 15.0, + 1338.0, + -254.0, + 10.0, + 1532.0, + -241.0, + 5.0, + 1590.0, + -227.0, + 60.0, + 1565.0, + -204.0, + 282.0, + 1560.0, + -180.0, + 262.0, + 1524.0, + -138.0, + 385.0, + 1522.0, + -84.0, + 596.0, + 1626.0, + -55.0, + 639.0, + 1604.0, + -19.0, + 771.0, + 1511.0, + 16.0, + 932.0, + 1132.0, + 15.0, + 924.0, + 1013.0, + 1.0, + 849.0, + 812.0, + -88.0, + 628.0, + 500.0, + -114.0, + 609.0, + 463.0, + -155.0, + 559.0, + 382.0, + -234.0, + 420.0, + 278.0, + -254.0, + 390.0, + 272.0, + -327.0, + 200.0, + 336.0, + -558.0, + -556.0, + 630.0, + -640.0, + -607.0, + 740.0, + -706.0, + -430.0, + 868.0, + -778.0, + 42.0, + 1042.0, + -763.0, + 84.0, + 973.0, + -735.0, + 185.0, + 931.0, + -682.0, + 252.0, + 766.0, + -673.0, + 230.0, + 757.0, + -671.0, + 218.0, + 757.0, + -656.0, + 222.0, + 714.0, + -659.0, + 238.0, + 746.0, + -640.0, + 276.0, + 731.0, + -634.0, + 214.0, + 754.0, + -637.0, + 207.0, + 735.0, + -637.0, + 194.0, + 742.0, + -634.0, + 248.0, + 716.0, + -631.0, + 265.0, + 697.0, + -628.0, + 252.0, + 797.0, + -592.0, + 204.0, + 816.0, + -618.0, + 218.0, + 812.0, + -633.0, + 231.0, + 828.0, + -640.0, + 222.0, + 736.0, + -634.0, + 221.0, + 787.0, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h new file mode 100644 index 00000000..11a183c7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/ring_micro_features_data.h @@ -0,0 +1,23 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_RING_MICRO_FEATURES_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_RING_MICRO_FEATURES_DATA_H_ + +extern const int g_ring_micro_f9643d42_nohash_4_length; +extern const int g_ring_micro_f9643d42_nohash_4_dim; +extern const float g_ring_micro_f9643d42_nohash_4_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_RING_MICRO_FEATURES_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.cc new file mode 100644 index 00000000..0306721b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.cc @@ -0,0 +1,406 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h" + +const int g_slope_micro_f2e59fea_nohash_1_length = 128; +const int g_slope_micro_f2e59fea_nohash_1_dim = 3; +// Raw accelerometer data with a sample rate of 25Hz +const float g_slope_micro_f2e59fea_nohash_1_data[] = { + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -766.0, + 132.0, + 709.0, + -751.0, + 249.0, + 659.0, + -714.0, + 314.0, + 630.0, + -709.0, + 244.0, + 623.0, + -707.0, + 230.0, + 659.0, + -704.0, + 202.0, + 748.0, + -714.0, + 219.0, + 728.0, + -722.0, + 239.0, + 710.0, + -744.0, + 116.0, + 612.0, + -753.0, + -49.0, + 570.0, + -748.0, + -279.0, + 527.0, + -668.0, + -664.0, + 592.0, + -601.0, + -635.0, + 609.0, + -509.0, + -559.0, + 606.0, + -286.0, + -162.0, + 536.0, + -255.0, + -144.0, + 495.0, + -209.0, + -85.0, + 495.0, + 6.0, + 416.0, + 698.0, + -33.0, + 304.0, + 1117.0, + -82.0, + 405.0, + 1480.0, + -198.0, + 1008.0, + 1908.0, + -229.0, + 990.0, + 1743.0, + -234.0, + 934.0, + 1453.0, + -126.0, + 838.0, + 896.0, + -78.0, + 792.0, + 911.0, + -27.0, + 741.0, + 918.0, + 114.0, + 734.0, + 960.0, + 135.0, + 613.0, + 959.0, + 152.0, + 426.0, + 1015.0, + 106.0, + -116.0, + 1110.0, + 63.0, + -314.0, + 1129.0, + -12.0, + -486.0, + 1179.0, + -118.0, + -656.0, + 1510.0, + -116.0, + -558.0, + 1553.0, + -126.0, + -361.0, + 1367.0, + -222.0, + -76.0, + 922.0, + -210.0, + -26.0, + 971.0, + -194.0, + 50.0, + 1053.0, + -178.0, + 72.0, + 1082.0, + -169.0, + 100.0, + 1073.0, + -162.0, + 133.0, + 1050.0, + -156.0, + 226.0, + 976.0, + -154.0, + 323.0, + 886.0, + -130.0, + 240.0, + 1154.0, + -116.0, + 124.0, + 916.0, + -132.0, + 124.0, + 937.0, + -153.0, + 115.0, + 981.0, + -184.0, + 94.0, + 962.0, + -177.0, + 85.0, + 1017.0, + -173.0, + 92.0, + 1027.0, + -168.0, + 158.0, + 1110.0, + -181.0, + 101.0, + 1030.0, + -180.0, + 139.0, + 1054.0, + -152.0, + 10.0, + 1044.0, + -169.0, + 74.0, + 1007.0, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h new file mode 100644 index 00000000..d3df20da --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/slope_micro_features_data.h @@ -0,0 +1,23 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_SLOPE_MICRO_FEATURES_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_SLOPE_MICRO_FEATURES_DATA_H_ + +extern const int g_slope_micro_f2e59fea_nohash_1_length; +extern const int g_slope_micro_f2e59fea_nohash_1_dim; +extern const float g_slope_micro_f2e59fea_nohash_1_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MAGIC_WAND_SLOPE_MICRO_FEATURES_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/README.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/README.md new file mode 100644 index 00000000..115fd353 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/README.md @@ -0,0 +1,191 @@ +# Gesture Recognition Magic Wand Training Scripts + +## Introduction + +The scripts in this directory can be used to train a TensorFlow model that +classifies gestures based on accelerometer data. The code uses Python 3.7 and +TensorFlow 2.0. The resulting model is less than 20KB in size. + +The following document contains instructions on using the scripts to train a +model, and capturing your own training data. + +This project was inspired by the [Gesture Recognition Magic Wand](https://github.com/jewang/gesture-demo) +project by Jennifer Wang. + +## Training + +### Dataset + +Three magic gestures were chosen, and data were collected from 7 +different people. Some random long movement sequences were collected and divided +into shorter pieces, which made up "negative" data along with some other +automatically generated random data. + +The dataset can be downloaded from the following URL: + +[download.tensorflow.org/models/tflite/magic_wand/data.tar.gz](http://download.tensorflow.org/models/tflite/magic_wand/data.tar.gz) + +### Training in Colab + +The following [Google Colaboratory](https://colab.research.google.com) +notebook demonstrates how to train the model. It's the easiest way to get +started: + + + + +
+ Run in Google Colab + + View source on GitHub +
+ +If you'd prefer to run the scripts locally, use the following instructions. + +### Running the scripts + +Use the following command to install the required dependencies: + +```shell +pip install -r requirements.txt +``` + +There are two ways to train the model: + +- Random data split, which mixes different people's data together and randomly + splits them into training, validation, and test sets +- Person data split, which splits the data by person + +#### Random data split + +Using a random split results in higher training accuracy than a person split, +but inferior performance on new data. + +```shell +$ python data_prepare.py + +$ python data_split.py + +$ python train.py --model CNN --person false +``` + +#### Person data split + +Using a person data split results in lower training accuracy but better +performance on new data. + +```shell +$ python data_prepare.py + +$ python data_split_person.py + +$ python train.py --model CNN --person true +``` + +#### Model type + +In the `--model` argument, you can provide `CNN` or `LSTM`. The CNN model has a +smaller size and lower latency. + +## Collecting new data + +To obtain new training data using the +[SparkFun Edge development board](https://sparkfun.com/products/15170), you can +modify one of the examples in the [SparkFun Edge BSP](https://github.com/sparkfun/SparkFun_Edge_BSP) +and deploy it using the Ambiq SDK. + +### Install the Ambiq SDK and SparkFun Edge BSP + +Follow SparkFun's +[Using SparkFun Edge Board with Ambiq Apollo3 SDK](https://learn.sparkfun.com/tutorials/using-sparkfun-edge-board-with-ambiq-apollo3-sdk/all) +guide to set up the Ambiq SDK and SparkFun Edge BSP. + +#### Modify the example code + +First, `cd` into +`AmbiqSuite-Rel2.2.0/boards/SparkFun_Edge_BSP/examples/example1_edge_test`. + +##### Modify `src/tf_adc/tf_adc.c` + +Add `true` in line 62 as the second parameter of function +`am_hal_adc_samples_read`. + +##### Modify `src/main.c` + +Add the line below in `int main(void)`, just before the line `while(1)`: + +```cc +am_util_stdio_printf("-,-,-\r\n"); +``` + +Change the following lines in `while(1){...}` + +```cc +am_util_stdio_printf("Acc [mg] %04.2f x, %04.2f y, %04.2f z, Temp [deg C] %04.2f, MIC0 [counts / 2^14] %d\r\n", acceleration_mg[0], acceleration_mg[1], acceleration_mg[2], temperature_degC, (audioSample) ); +``` + +to: + +```cc +am_util_stdio_printf("%04.2f,%04.2f,%04.2f\r\n", acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]); +``` + +#### Flash the binary + +Follow the instructions in +[SparkFun's guide](https://learn.sparkfun.com/tutorials/using-sparkfun-edge-board-with-ambiq-apollo3-sdk/all#example-applications) +to flash the binary to the device. + +#### Collect accelerometer data + +First, in a new terminal window, run the following command to begin logging +output to `output.txt`: + +```shell +$ script output.txt +``` + +Next, in the same window, use `screen` to connect to the device: + +```shell +$ screen ${DEVICENAME} 115200 +``` + +Output information collected from accelerometer sensor will be shown on the +screen and saved in `output.txt`, in the format of "x,y,z" per line. + +Press the `RST` button to start capturing a new gesture, then press Button 14 +when it ends. New data will begin with a line "-,-,-". + +To exit `screen`, hit +Ctrl\\+A+, immediately followed by the +K+ key, +then hit the +Y+ key. Then run + +```shell +$ exit +``` + +to stop logging data. Data will be saved in `output.txt`. For compatibility +with the training scripts, change the file name to include person's name and +the gesture name, in the following format: + +``` +output_{gesture_name}_{person_name}.txt +``` + +#### Edit and run the scripts + +Edit the following files to include your new gesture names (replacing +"wing", "ring", and "slope") + +- `data_load.py` +- `data_prepare.py` +- `data_split.py` + +Edit the following files to include your new person names (replacing "hyw", +"shiyun", "tangsy", "dengyl", "jiangyh", "xunkai", "lsj", "pengxl", "liucx", +and "zhangxy"): + +- `data_prepare.py` +- `data_split_person.py` + +Finally, run the commands described earlier to train a new model. diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation.py new file mode 100644 index 00000000..8d30fa19 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation.py @@ -0,0 +1,74 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# pylint: disable=g-bad-import-order + +"""Data augmentation that will be used in data_load.py.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import random + +import numpy as np + + +def time_wrapping(molecule, denominator, data): + """Generate (molecule/denominator)x speed data.""" + tmp_data = [[0 + for i in range(len(data[0]))] + for j in range((int(len(data) / molecule) - 1) * denominator)] + for i in range(int(len(data) / molecule) - 1): + for j in range(len(data[i])): + for k in range(denominator): + tmp_data[denominator * i + + k][j] = (data[molecule * i + k][j] * (denominator - k) + + data[molecule * i + k + 1][j] * k) / denominator + return tmp_data + + +def augment_data(original_data, original_label): + """Perform data augmentation.""" + new_data = [] + new_label = [] + for idx, (data, label) in enumerate(zip(original_data, original_label)): # pylint: disable=unused-variable + # Original data + new_data.append(data) + new_label.append(label) + # Sequence shift + for num in range(5): # pylint: disable=unused-variable + new_data.append((np.array(data, dtype=np.float32) + + (random.random() - 0.5) * 200).tolist()) + new_label.append(label) + # Random noise + tmp_data = [[0 for i in range(len(data[0]))] for j in range(len(data))] + for num in range(5): + for i in range(len(tmp_data)): + for j in range(len(tmp_data[i])): + tmp_data[i][j] = data[i][j] + 5 * random.random() + new_data.append(tmp_data) + new_label.append(label) + # Time warping + fractions = [(3, 2), (5, 3), (2, 3), (3, 4), (9, 5), (6, 5), (4, 5)] + for molecule, denominator in fractions: + new_data.append(time_wrapping(molecule, denominator, data)) + new_label.append(label) + # Movement amplification + for molecule, denominator in fractions: + new_data.append( + (np.array(data, dtype=np.float32) * molecule / denominator).tolist()) + new_label.append(label) + return new_data, new_label diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation_test.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation_test.py new file mode 100644 index 00000000..76bac658 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_augmentation_test.py @@ -0,0 +1,58 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# pylint: disable=g-bad-import-order + +"""Test for data_augmentation.py.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest + +import numpy as np + +from data_augmentation import augment_data +from data_augmentation import time_wrapping + + +class TestAugmentation(unittest.TestCase): + + def test_time_wrapping(self): + original_data = np.random.rand(10, 3).tolist() + wrapped_data = time_wrapping(4, 5, original_data) + self.assertEqual(len(wrapped_data), int(len(original_data) / 4 - 1) * 5) + self.assertEqual(len(wrapped_data[0]), len(original_data[0])) + + def test_augment_data(self): + original_data = [ + np.random.rand(128, 3).tolist(), + np.random.rand(66, 2).tolist(), + np.random.rand(9, 1).tolist() + ] + original_label = ["data", "augmentation", "test"] + augmented_data, augmented_label = augment_data(original_data, + original_label) + self.assertEqual(25 * len(original_data), len(augmented_data)) + self.assertIsInstance(augmented_data, list) + self.assertEqual(25 * len(original_label), len(augmented_label)) + self.assertIsInstance(augmented_label, list) + for i in range(len(original_label)): + self.assertEqual(augmented_label[25 * i], original_label[i]) + + +if __name__ == "__main__": + unittest.main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load.py new file mode 100644 index 00000000..fc9ba718 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load.py @@ -0,0 +1,106 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# pylint: disable=g-bad-import-order + +"""Load data from the specified paths and format them for training.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json + +import numpy as np +import tensorflow as tf + +from data_augmentation import augment_data + +LABEL_NAME = "gesture" +DATA_NAME = "accel_ms2_xyz" + + +class DataLoader(object): + """Loads data and prepares for training.""" + + def __init__(self, train_data_path, valid_data_path, test_data_path, + seq_length): + self.dim = 3 + self.seq_length = seq_length + self.label2id = {"wing": 0, "ring": 1, "slope": 2, "negative": 3} + self.train_data, self.train_label, self.train_len = self.get_data_file( + train_data_path, "train") + self.valid_data, self.valid_label, self.valid_len = self.get_data_file( + valid_data_path, "valid") + self.test_data, self.test_label, self.test_len = self.get_data_file( + test_data_path, "test") + + def get_data_file(self, data_path, data_type): + """Get train, valid and test data from files.""" + data = [] + label = [] + with open(data_path, "r") as f: + lines = f.readlines() + for idx, line in enumerate(lines): # pylint: disable=unused-variable + dic = json.loads(line) + data.append(dic[DATA_NAME]) + label.append(dic[LABEL_NAME]) + if data_type == "train": + data, label = augment_data(data, label) + length = len(label) + print(data_type + "_data_length:" + str(length)) + return data, label, length + + def pad(self, data, seq_length, dim): + """Get neighbour padding.""" + noise_level = 20 + padded_data = [] + # Before- Neighbour padding + tmp_data = (np.random.rand(seq_length, dim) - 0.5) * noise_level + data[0] + tmp_data[(seq_length - + min(len(data), seq_length)):] = data[:min(len(data), seq_length)] + padded_data.append(tmp_data) + # After- Neighbour padding + tmp_data = (np.random.rand(seq_length, dim) - 0.5) * noise_level + data[-1] + tmp_data[:min(len(data), seq_length)] = data[:min(len(data), seq_length)] + padded_data.append(tmp_data) + return padded_data + + def format_support_func(self, padded_num, length, data, label): + """Support function for format.(Helps format train, valid and test.)""" + # Add 2 padding, initialize data and label + length *= padded_num + features = np.zeros((length, self.seq_length, self.dim)) + labels = np.zeros(length) + # Get padding for train, valid and test + for idx, (data, label) in enumerate(zip(data, label)): + padded_data = self.pad(data, self.seq_length, self.dim) + for num in range(padded_num): + features[padded_num * idx + num] = padded_data[num] + labels[padded_num * idx + num] = self.label2id[label] + # Turn into tf.data.Dataset + dataset = tf.data.Dataset.from_tensor_slices( + (features, labels.astype("int32"))) + return length, dataset + + def format(self): + """Format data(including padding, etc.) and get the dataset for the model.""" + padded_num = 2 + self.train_len, self.train_data = self.format_support_func( + padded_num, self.train_len, self.train_data, self.train_label) + self.valid_len, self.valid_data = self.format_support_func( + padded_num, self.valid_len, self.valid_data, self.valid_label) + self.test_len, self.test_data = self.format_support_func( + padded_num, self.test_len, self.test_data, self.test_label) diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load_test.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load_test.py new file mode 100644 index 00000000..8a4ef45c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_load_test.py @@ -0,0 +1,95 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# pylint: disable=g-bad-import-order + +"""Test for data_load.py.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest +from data_load import DataLoader + +import tensorflow as tf + + +class TestLoad(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.loader = DataLoader( + "./data/train", "./data/valid", "./data/test", seq_length=512) + + def test_get_data(self): + self.assertIsInstance(self.loader.train_data, list) + self.assertIsInstance(self.loader.train_label, list) + self.assertIsInstance(self.loader.valid_data, list) + self.assertIsInstance(self.loader.valid_label, list) + self.assertIsInstance(self.loader.test_data, list) + self.assertIsInstance(self.loader.test_label, list) + self.assertEqual(self.loader.train_len, len(self.loader.train_data)) + self.assertEqual(self.loader.train_len, len(self.loader.train_label)) + self.assertEqual(self.loader.valid_len, len(self.loader.valid_data)) + self.assertEqual(self.loader.valid_len, len(self.loader.valid_label)) + self.assertEqual(self.loader.test_len, len(self.loader.test_data)) + self.assertEqual(self.loader.test_len, len(self.loader.test_label)) + + def test_pad(self): + original_data1 = [[2, 3], [1, 1]] + expected_data1_0 = [[2, 3], [2, 3], [2, 3], [2, 3], [1, 1]] + expected_data1_1 = [[2, 3], [1, 1], [1, 1], [1, 1], [1, 1]] + original_data2 = [[-2, 3], [-77, -681], [5, 6], [9, -7], [22, 3333], + [9, 99], [-100, 0]] + expected_data2 = [[-2, 3], [-77, -681], [5, 6], [9, -7], [22, 3333]] + padding_data1 = self.loader.pad(original_data1, seq_length=5, dim=2) + padding_data2 = self.loader.pad(original_data2, seq_length=5, dim=2) + for i in range(len(padding_data1[0])): + for j in range(len(padding_data1[0].tolist()[0])): + self.assertLess( + abs(padding_data1[0].tolist()[i][j] - expected_data1_0[i][j]), + 10.001) + for i in range(len(padding_data1[1])): + for j in range(len(padding_data1[1].tolist()[0])): + self.assertLess( + abs(padding_data1[1].tolist()[i][j] - expected_data1_1[i][j]), + 10.001) + self.assertEqual(padding_data2[0].tolist(), expected_data2) + self.assertEqual(padding_data2[1].tolist(), expected_data2) + + def test_format(self): + self.loader.format() + expected_train_label = int(self.loader.label2id[self.loader.train_label[0]]) + expected_valid_label = int(self.loader.label2id[self.loader.valid_label[0]]) + expected_test_label = int(self.loader.label2id[self.loader.test_label[0]]) + for feature, label in self.loader.train_data: # pylint: disable=unused-variable + format_train_label = label.numpy() + break + for feature, label in self.loader.valid_data: + format_valid_label = label.numpy() + break + for feature, label in self.loader.test_data: + format_test_label = label.numpy() + break + self.assertEqual(expected_train_label, format_train_label) + self.assertEqual(expected_valid_label, format_valid_label) + self.assertEqual(expected_test_label, format_test_label) + self.assertIsInstance(self.loader.train_data, tf.data.Dataset) + self.assertIsInstance(self.loader.valid_data, tf.data.Dataset) + self.assertIsInstance(self.loader.test_data, tf.data.Dataset) + + +if __name__ == "__main__": + unittest.main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare.py new file mode 100644 index 00000000..b5f1fcfd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare.py @@ -0,0 +1,164 @@ +# Lint as: python3 +# coding=utf-8 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Prepare data for further process. + +Read data from "/slope", "/ring", "/wing", "/negative" and save them +in "/data/complete_data" in python dict format. + +It will generate a new file with the following structure: +├── data +│   └── complete_data +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import csv +import json +import os +import random + +LABEL_NAME = "gesture" +DATA_NAME = "accel_ms2_xyz" +folders = ["wing", "ring", "slope"] +names = [ + "hyw", "shiyun", "tangsy", "dengyl", "zhangxy", "pengxl", "liucx", + "jiangyh", "xunkai" +] + + +def prepare_original_data(folder, name, data, file_to_read): # pylint: disable=redefined-outer-name + """Read collected data from files.""" + if folder != "negative": + with open(file_to_read, "r") as f: + lines = csv.reader(f) + data_new = {} + data_new[LABEL_NAME] = folder + data_new[DATA_NAME] = [] + data_new["name"] = name + for idx, line in enumerate(lines): # pylint: disable=unused-variable,redefined-outer-name + if len(line) == 3: + if line[2] == "-" and data_new[DATA_NAME]: + data.append(data_new) + data_new = {} + data_new[LABEL_NAME] = folder + data_new[DATA_NAME] = [] + data_new["name"] = name + elif line[2] != "-": + data_new[DATA_NAME].append([float(i) for i in line[0:3]]) + data.append(data_new) + else: + with open(file_to_read, "r") as f: + lines = csv.reader(f) + data_new = {} + data_new[LABEL_NAME] = folder + data_new[DATA_NAME] = [] + data_new["name"] = name + for idx, line in enumerate(lines): + if len(line) == 3 and line[2] != "-": + if len(data_new[DATA_NAME]) == 120: + data.append(data_new) + data_new = {} + data_new[LABEL_NAME] = folder + data_new[DATA_NAME] = [] + data_new["name"] = name + else: + data_new[DATA_NAME].append([float(i) for i in line[0:3]]) + data.append(data_new) + + +def generate_negative_data(data): # pylint: disable=redefined-outer-name + """Generate negative data labeled as 'negative6~8'.""" + # Big movement -> around straight line + for i in range(100): + if i > 80: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative8"} + elif i > 60: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative7"} + else: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative6"} + start_x = (random.random() - 0.5) * 2000 + start_y = (random.random() - 0.5) * 2000 + start_z = (random.random() - 0.5) * 2000 + x_increase = (random.random() - 0.5) * 10 + y_increase = (random.random() - 0.5) * 10 + z_increase = (random.random() - 0.5) * 10 + for j in range(128): + dic[DATA_NAME].append([ + start_x + j * x_increase + (random.random() - 0.5) * 6, + start_y + j * y_increase + (random.random() - 0.5) * 6, + start_z + j * z_increase + (random.random() - 0.5) * 6 + ]) + data.append(dic) + # Random + for i in range(100): + if i > 80: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative8"} + elif i > 60: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative7"} + else: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative6"} + for j in range(128): + dic[DATA_NAME].append([(random.random() - 0.5) * 1000, + (random.random() - 0.5) * 1000, + (random.random() - 0.5) * 1000]) + data.append(dic) + # Stay still + for i in range(100): + if i > 80: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative8"} + elif i > 60: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative7"} + else: + dic = {DATA_NAME: [], LABEL_NAME: "negative", "name": "negative6"} + start_x = (random.random() - 0.5) * 2000 + start_y = (random.random() - 0.5) * 2000 + start_z = (random.random() - 0.5) * 2000 + for j in range(128): + dic[DATA_NAME].append([ + start_x + (random.random() - 0.5) * 40, + start_y + (random.random() - 0.5) * 40, + start_z + (random.random() - 0.5) * 40 + ]) + data.append(dic) + + +# Write data to file +def write_data(data_to_write, path): + with open(path, "w") as f: + for idx, item in enumerate(data_to_write): # pylint: disable=unused-variable,redefined-outer-name + dic = json.dumps(item, ensure_ascii=False) + f.write(dic) + f.write("\n") + + +if __name__ == "__main__": + data = [] # pylint: disable=redefined-outer-name + for idx1, folder in enumerate(folders): + for idx2, name in enumerate(names): + prepare_original_data(folder, name, data, + "./%s/output_%s_%s.txt" % (folder, folder, name)) + for idx in range(5): + prepare_original_data("negative", "negative%d" % (idx + 1), data, + "./negative/output_negative_%d.txt" % (idx + 1)) + generate_negative_data(data) + print("data_length: " + str(len(data))) + if not os.path.exists("./data"): + os.makedirs("./data") + write_data(data, "./data/complete_data") diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare_test.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare_test.py new file mode 100644 index 00000000..a2af0992 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_prepare_test.py @@ -0,0 +1,75 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Test for data_prepare.py.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import csv +import json +import os +import unittest +from data_prepare import generate_negative_data +from data_prepare import prepare_original_data +from data_prepare import write_data + + +class TestPrepare(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.file = "./%s/output_%s_%s.txt" % (folders[0], folders[0], names[0]) # pylint: disable=undefined-variable + self.data = [] + prepare_original_data(folders[0], names[0], self.data, self.file) # pylint: disable=undefined-variable + + def test_prepare_data(self): + num = 0 + with open(self.file, "r") as f: + lines = csv.reader(f) + for idx, line in enumerate(lines): # pylint: disable=unused-variable + if len(line) == 3 and line[2] == "-": + num += 1 + self.assertEqual(len(self.data), num) + self.assertIsInstance(self.data, list) + self.assertIsInstance(self.data[0], dict) + self.assertEqual(list(self.data[-1]), ["gesture", "accel_ms2_xyz", "name"]) + self.assertEqual(self.data[0]["name"], names[0]) # pylint: disable=undefined-variable + + def test_generate_negative(self): + original_len = len(self.data) + generate_negative_data(self.data) + self.assertEqual(original_len + 300, len(self.data)) + generated_num = 0 + for idx, data in enumerate(self.data): # pylint: disable=undefined-variable, unused-variable + if data["name"] == "negative6" or data["name"] == "negative7" or data[ + "name"] == "negative8": + generated_num += 1 + self.assertEqual(generated_num, 300) + + def test_write_data(self): + data_path_test = "./data/data0" + write_data(self.data, data_path_test) + with open(data_path_test, "r") as f: + lines = f.readlines() + self.assertEqual(len(lines), len(self.data)) + self.assertEqual(json.loads(lines[0]), self.data[0]) + self.assertEqual(json.loads(lines[-1]), self.data[-1]) + os.remove(data_path_test) + + +if __name__ == "__main__": + unittest.main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split.py new file mode 100644 index 00000000..3bf47472 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split.py @@ -0,0 +1,90 @@ +# Lint as: python3 +# coding=utf-8 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Mix and split data. + +Mix different people's data together and randomly split them into train, +validation and test. These data would be saved separately under "/data". +It will generate new files with the following structure: + +├── data +│   ├── complete_data +│   ├── test +│   ├── train +│   └── valid +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import random +from data_prepare import write_data + + +# Read data +def read_data(path): + data = [] # pylint: disable=redefined-outer-name + with open(path, "r") as f: + lines = f.readlines() + for idx, line in enumerate(lines): # pylint: disable=unused-variable + dic = json.loads(line) + data.append(dic) + print("data_length:" + str(len(data))) + return data + + +def split_data(data, train_ratio, valid_ratio): # pylint: disable=redefined-outer-name + """Splits data into train, validation and test according to ratio.""" + train_data = [] # pylint: disable=redefined-outer-name + valid_data = [] # pylint: disable=redefined-outer-name + test_data = [] # pylint: disable=redefined-outer-name + num_dic = {"wing": 0, "ring": 0, "slope": 0, "negative": 0} + for idx, item in enumerate(data): # pylint: disable=unused-variable + for i in num_dic: + if item["gesture"] == i: + num_dic[i] += 1 + print(num_dic) + train_num_dic = {} + valid_num_dic = {} + for i in num_dic: + train_num_dic[i] = int(train_ratio * num_dic[i]) + valid_num_dic[i] = int(valid_ratio * num_dic[i]) + random.seed(30) + random.shuffle(data) + for idx, item in enumerate(data): + for i in num_dic: + if item["gesture"] == i: + if train_num_dic[i] > 0: + train_data.append(item) + train_num_dic[i] -= 1 + elif valid_num_dic[i] > 0: + valid_data.append(item) + valid_num_dic[i] -= 1 + else: + test_data.append(item) + print("train_length:" + str(len(train_data))) + print("test_length:" + str(len(test_data))) + return train_data, valid_data, test_data + + +if __name__ == "__main__": + data = read_data("./data/complete_data") + train_data, valid_data, test_data = split_data(data, 0.6, 0.2) + write_data(train_data, "./data/train") + write_data(valid_data, "./data/valid") + write_data(test_data, "./data/test") diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person.py new file mode 100644 index 00000000..be052134 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person.py @@ -0,0 +1,75 @@ +# Lint as: python3 +# coding=utf-8 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Split data into train, validation and test dataset according to person. + +That is, use some people's data as train, some other people's data as +validation, and the rest ones' data as test. These data would be saved +separately under "/person_split". + +It will generate new files with the following structure: +├──person_split +│   ├── test +│   ├── train +│   └──valid +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import os +import random +from data_split import read_data +from data_split import write_data + + +def person_split(whole_data, train_names, valid_names, test_names): # pylint: disable=redefined-outer-name + """Split data by person.""" + random.seed(30) + random.shuffle(whole_data) + train_data = [] # pylint: disable=redefined-outer-name + valid_data = [] # pylint: disable=redefined-outer-name + test_data = [] # pylint: disable=redefined-outer-name + for idx, data in enumerate(whole_data): # pylint: disable=redefined-outer-name,unused-variable + if data["name"] in train_names: + train_data.append(data) + elif data["name"] in valid_names: + valid_data.append(data) + elif data["name"] in test_names: + test_data.append(data) + print("train_length:" + str(len(train_data))) + print("valid_length:" + str(len(valid_data))) + print("test_length:" + str(len(test_data))) + return train_data, valid_data, test_data + + +if __name__ == "__main__": + data = read_data("./data/complete_data") + train_names = [ + "hyw", "shiyun", "tangsy", "dengyl", "jiangyh", "xunkai", "negative3", + "negative4", "negative5", "negative6" + ] + valid_names = ["lsj", "pengxl", "negative2", "negative7"] + test_names = ["liucx", "zhangxy", "negative1", "negative8"] + train_data, valid_data, test_data = person_split(data, train_names, + valid_names, test_names) + if not os.path.exists("./person_split"): + os.makedirs("./person_split") + write_data(train_data, "./person_split/train") + write_data(valid_data, "./person_split/valid") + write_data(test_data, "./person_split/test") diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person_test.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person_test.py new file mode 100644 index 00000000..3a91ce42 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_person_test.py @@ -0,0 +1,54 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Test for data_split_person.py.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import unittest +from data_split_person import person_split +from data_split_person import read_data + + +class TestSplitPerson(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.data = read_data("./data/complete_data") + + def test_person_split(self): + train_names = ["dengyl"] + valid_names = ["liucx"] + test_names = ["tangsy"] + dengyl_num = 63 + liucx_num = 63 + tangsy_num = 30 + train_data, valid_data, test_data = person_split(self.data, train_names, + valid_names, test_names) + self.assertEqual(len(train_data), dengyl_num) + self.assertEqual(len(valid_data), liucx_num) + self.assertEqual(len(test_data), tangsy_num) + self.assertIsInstance(train_data, list) + self.assertIsInstance(valid_data, list) + self.assertIsInstance(test_data, list) + self.assertIsInstance(train_data[0], dict) + self.assertIsInstance(valid_data[0], dict) + self.assertIsInstance(test_data[0], dict) + + +if __name__ == "__main__": + unittest.main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_test.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_test.py new file mode 100644 index 00000000..9a8f1519 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/data_split_test.py @@ -0,0 +1,77 @@ +# Lint as: python3 +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Test for data_split.py.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import json +import unittest +from data_split import read_data +from data_split import split_data + + +class TestSplit(unittest.TestCase): + + def setUp(self): # pylint: disable=g-missing-super-call + self.data = read_data("./data/complete_data") + self.num_dic = {"wing": 0, "ring": 0, "slope": 0, "negative": 0} + with open("./data/complete_data", "r") as f: + lines = f.readlines() + self.num = len(lines) + + def test_read_data(self): + self.assertEqual(len(self.data), self.num) + self.assertIsInstance(self.data, list) + self.assertIsInstance(self.data[0], dict) + self.assertEqual( + set(list(self.data[-1])), set(["gesture", "accel_ms2_xyz", "name"])) + + def test_split_data(self): + with open("./data/complete_data", "r") as f: + lines = f.readlines() + for idx, line in enumerate(lines): # pylint: disable=unused-variable + dic = json.loads(line) + for ges in self.num_dic: + if dic["gesture"] == ges: + self.num_dic[ges] += 1 + train_data_0, valid_data_0, test_data_100 = split_data(self.data, 0, 0) + train_data_50, valid_data_50, test_data_0 = split_data(self.data, 0.5, 0.5) + train_data_60, valid_data_20, test_data_20 = split_data(self.data, 0.6, 0.2) + len_60 = int(self.num_dic["wing"] * 0.6) + int( + self.num_dic["ring"] * 0.6) + int(self.num_dic["slope"] * 0.6) + int( + self.num_dic["negative"] * 0.6) + len_50 = int(self.num_dic["wing"] * 0.5) + int( + self.num_dic["ring"] * 0.5) + int(self.num_dic["slope"] * 0.5) + int( + self.num_dic["negative"] * 0.5) + len_20 = int(self.num_dic["wing"] * 0.2) + int( + self.num_dic["ring"] * 0.2) + int(self.num_dic["slope"] * 0.2) + int( + self.num_dic["negative"] * 0.2) + self.assertEqual(len(train_data_0), 0) + self.assertEqual(len(train_data_50), len_50) + self.assertEqual(len(train_data_60), len_60) + self.assertEqual(len(valid_data_0), 0) + self.assertEqual(len(valid_data_50), len_50) + self.assertEqual(len(valid_data_20), len_20) + self.assertEqual(len(test_data_100), self.num) + self.assertEqual(len(test_data_0), (self.num - 2 * len_50)) + self.assertEqual(len(test_data_20), (self.num - len_60 - len_20)) + + +if __name__ == "__main__": + unittest.main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/netmodels/CNN/weights.h5 b/components/TensorFlowLite/tensorflow/lite/micro/examples/magic_wand/train/netmodels/CNN/weights.h5 new file mode 100644 index 0000000000000000000000000000000000000000..1d825b3aaf7c391757c4a95f1975498a2e47861c GIT binary patch literal 40512 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
yuq}+BIWsA30?De_~_59_Bp1#AB#&5sGi~MDx39 zzr~IiZNHiar8W1zSNThEHDv*F)66yD;OFDb4JB9@ng3NN`I>G}!b6c3wUQcjsD= zvJ^8qG2%3iKcz{N7M6kD?L(+I`aYh0XGV?uwP?nO9VlKb!=|p8hxIZWP$No#BoF9_ z7LEHMq&f+Yo-IXRD{El#jHp7g9ND>hAJoRD1JkiD7p?n}6{=^rOv&huHWxNZt>wFD@@IbiiD2oZJ~&?+iy*mxpL{Xbr|x&4Dt*r)+%VK3K18Kxeu=hiIh?=sWi_ z?DO~pf=2e^z16jzjVT7aKs8Qdf$Q( zTE_In>Af(w;~H#riH7<`!4PV%NpF7CAU*e(Qd-M;ahMyp$ zwSYD0?SW{aLxxW($2#6lTy|ZR#Kq{+o?t)=#IHHwn&&wGWChr|<>S32@u>A(iq{2!HAs|n{2^ERTd-UrOsl#Vlx-i3K%HefbSiSC!sft-;%>ENzLTVuDP z)5{XB+U1~&xJK7ylB*n1J^TjF1*%c`eO5SYnhx#0rU_q9kmwU;Ou^A^CPZYcMA-!@ z)Vi1C%otJ4G8TF?sBt@LN_Zc=+6_nT+<+FlH>15zCm2;%0_B;nFw%A$7l{8Ft>PBvI$ZkJFv z8JUQl7Cu~6p$T}M3C0U91z10>o)hde6-CA}$PHKspI_ZW_kmm4(i6t?F=tN8?H+>t zh(26R=@yJ|Y=-NNmw>4Wg=fy@q@|ZSt*D(1GtB~U@JS2sbk?ILdlMk`S~2@xU_v#= zpT*p79eUI%&zQGsK%&BTLDbk!a-fTo8=LKlAx`}=AkWZ53_;j|y zUKBhzBg*ye#&-7GjlCy}FrlOjoiCh+!|IZAeEdHKr>P&5HLhij9UoW+L=f-h}18 zui(Kv9(}X)K8CGm!BmrMm#KrRQSPt|ZJeu21**AN6KqV=9^8Wt8WV9#jRHwnk%4xD zm!eQT*TrnW3h)k(fTp(+-Qp{K?6b_2)W2BI1;%Dc==lU}iZh|9N6%nL;6+aH(pNaT z<_jENXGT^WnG3?z>zy~oYZHr{6DWLROc|FOE=fz@gSCbU&DGw3wtaL#bINY8lsSS+ zXDCs(jtW%R?*ON8MuVIx;So10K!X)!;LS*MnV-~2Sn_v>?X!g|(Fle^OK*dhhd)-R z?B=}kw{gx|#~_El6(8OHj)JR-T-pa6Dzn&>Y>>!3(IZ+|{d206KXxyB+|Ga`i?X0Z zJRjdGD^Y&vcQ5xjM*5(H%`E@izGAVR)3Zi~_(tYE~L{ zPDw%Lbr+YazMt_)Pi?}J=t~yuUWlq=FF@;?>tJn?3NKpLp|M2&Qg^!%W}mR4`gKvGDknE1_0EKQPKJd4=`Ppnx;8y= zFAD3=HRCG9Ti`ftDZ~V4q0#qxbg<6DXLC)+t){2oP^E<8m_SJAIv%UXz2`zEuH!0J zO7unsrWl#J4a$yL(Ox%F`ma z6MAf?LYRtog_-7WaIEA_uxjIa(G!Ur!C1NBv2n`8tbZ=7_Awxp>)wNj|5-?nIg6eh z4zl@$W|)xG6%&s;TJ$PP((`T(gy=@s#bEh6N$rhM) zQiFCIcm)mKZk3!9H{hI$6hf|8!W8B%_$!V@#quK65NYuK_VKlbR*Yj7mpfS3>C6Y(c48Xb|%R`AVHdCXq!T$dw|>oAY2Ty_`F9q5X| zH#C45ysOAsUY(j4&cN|=hQOwA>pTv`&WD@O-LMu1O3urM zZ(?y&pcp*QJz}@kyo7156-hlej@`0Ng*+K%OrNBw5&kx0nTXp(nX76bcIrF!P<0hv z-%|{`v~(zYZ7VzuRw2pO=kOL^p4z%=!O>U_=(j9Xtvd({BQ*(cJaB6ob*cIr$(oyY z3yPZS;r0E_SlJp2u|p29f|X^QP4IkR-Y$lj3sN9U;W^i+U`TwmEI7|(EpF_19}M{t zg@V~y+=3elr2a!VYN@CbpMBRc#P>Dlls^n)4^iOKdO?lh5@;wsiqE&HlUHk+(alMX zZizaG1ySzMBIt#l{TJdN-Hfh7*%3b)WSpp-!7xNF8Vs)Pz-0QWHy|%)Z<8Npd z{n%_yPlv^z+nA$Zmlu!ARwg4K3q-NIt=KW051`kUj@WWjR-$9!p@kZUqV5}U&oddq z<2FO_10xWwJy7&uP#P}zU`F}c{_y4#Lt@Sw(ojP=8gN#Z zeGZY-X(}4%p9#w^G$6mWH_Xw`2ENV#m$kOnq2+NDJfCGsJ-2IfnLjQ;6W0yy; zs0>VX)CryT9!`o%ur=lq3fIVqx>>!H+;{knT3+R7rj-Y8)h6J+&*!l`#ss znW%f&!*KP_Xxh_~_FG^`66a7hG{+oz251t?8E^30?!9+<1%O_N%cqr3Kc=@`!0&2Hxwt7e^XekqEaW z82j`Nq-Cm8jYw5$pIM0NDZ^mQVgr&mJDSbYr~{$Tb!XdedBAtODpGi$L4x+of#g>Q zQ8~>FPWZ{wTV)3%ccQd#?aY0^j11)#%+(@&_x8sIUCCL#-(vRAlWDkj%Uw+WZVd<1 z@=;}vC7HJQJ>IH61f_e9K;oQjkl)e_`}>#?CglbfUf_nIQ>xLXj~vwCJtR6qu{@&) zk1sYRPOa*6Z@f9twaCPfDf6+uzKP4zkHS<}3syfzLPwqftnZ`J1yMebPdW3kDXVA^>7-SvohOGM` zEYR7`KK3^tV#y7YShW>w<-Tlay_<)-7M{XsHzUz=pa}CjWI=O}6gEpa0WG%ZQ6&pL zeK-0IitjvO%Z`R~%+v!#`E~E1EG&eLR*UEE=u7Uh%pJ&8fA+;({lnmRy&3t8Ebi)O zPK=6kxX?j|VC_Rq+H1oP42j;wiaQ8Ice?w*gAf@y^I;vVyTKt$io{1(_knxt8kpXD zC}zHW0aG#&I{0tH%Aoh?;oXe*&VrQA)}f<9o`KH2`M4nECEBJbQ=x1ETm85RlMY+a zmZ2id-T8!d?=cK^j(!OjZ`^|sg;{uL-)q=CB^_(Rb)k6O2G9v8gRnl2@X)Lp;KiGA zvHK2SNW)Gb=En4G*K`mU_mk{#VlMoeEVZAu9J3T9_eE>PD9m=^WT%OtV$D*JIl?3U z_4^>SSAVeCzlZZM=>)#36uGEVnZOV5;{?$RlL}uIUG7ci0Kbo@ZjQ1+^xD9bC20^MF%fR>`M(G z9x?!!+l0F$qeI-Y3%SWF_h7JbH0bFa#EXw|;biL!OnvQOK4g>Ept3RWjM*3EF0#fQf7@Xl|c~t)md^>K{gGLw6uDw7x>;fA)trMmN=+bew z-{WA-F<7@S2AqaiVzitA1g(0-=0-cR;?=`lBqnUAK6{;IN(Zv%J{|uB>7A0FF>Lx~P)ec+FtsTolB3Xmz*=&T>AsQ~QC{i~#p0(J($kv#(N&^T&d``HcV9BKtkL#sg;XT=KM_2p*t zwxYLsThdK?A3&Yya~wHRla>wJ&b~;0j%#PHm)!4tC0aO0gB+0PJ&d-xfPzGpI`nD| zitW#F^|xNI?!ocwxk)cTZ^vU`g$~t!Q;sD0C>K@Ws!F2Jht2$_F3dPFFSL z4b|hktF&;=Z8_Say9PsV?SM<4AEKs#7M-xlgcQ`uLUg?&WIntOUO5l&V(LZQv0H~s z+%G9V8MJI0stBLwFI=d$va!SV!Gxy-7&60c5yO*mZ-ZOVA>19HBDp)8gyQpV+>0PBtRFv_ z_3U;MmadlEy_?_xMpoCj)B6f>TyJ%9q*$K}8Kg*NhndprH!@_pExmlD{5*>Aapw|TVxBxS;ne}SG#&am?1KJ@G^==|skt;a<5-4k3-UUjGLeYBhC=e{l76qv25gmtm<5P`%WzsA6D?Sam4O{bfL#pj3m!-;z#9b$k zRWD&{9*byB@3`FbvRJn_J+ zTaP*BY!{X*e1#px#9JCGkcrAUA^{IY!-KTahkJZoPpyt2cpfg2ZnhI!YOBaW9K|Sj9k?j#?3G%Vy$9s)hiR4o|FN(i<;O2gUxAoiQJ_$ z&4?TgyntiV<6zV1+gLT>FboJfjT6Rbk+B_|%*VDfg!I7lxLe}2sk zo-qsq8*LQvYFM5-s0h-A{&;NA7wggRHiyebP)ce7D(rv1D7;3KX7$hH7WoashdcCWQ=%MQ_3SOQvJ#&fgSFtsJ%Wa3yK#e;>r%z|DlEBfNR!{SVCBh;P_d~S@E025ZARh)G_XiSBsQ&<>1R=F ze#xa~AA#rtnvnYRs*B)42|9jog}bW9F{?=vuCIuJ(hieR92^fp{#!ABS~UcEJ_lQ7 zIXqu2L(i2QfzcA$`WUeh_yyW*YPUTuM~oQ~v0o2e0xU^FpDS2m@{MDz%8R0Yl);dz zx+LQsLssrlC&m5Dfpx!!v0G$)GZNePFVrJQw=M&4-$n;lw(zY6vIa)d0M;a z8D~3Cg<3iq5u-Z}80%WdIet6=4ZAx+?Ckv@o7Dg_?Mp#@&N}F?qe)8NOorS`0;u9B&yJ_SPY&z+VNye{mO@%%k?idR<4;YY$ zsdpjZvMj02m&mKvsEg^{WBAmy0E{&?N#MzB7(CMvIW`&CM}7$g<)H7;%-Gj?Jad$W}?e3W~mOgR5#UxpUM6|k{q z53|b0P2u?7YP2YtgLh3;N!JP;vTaui=02Urop9ZNNw2^xOdK_v4a@v=h$PU+iF<+M2TE?RHmVI%ON(1!|0{y_$6*T zo~*C~{=n-ZllOkOywr*W`*ep6+Sidc<|5ubWkBOw>*4!Vd766Jf_r3k9!6*J$cck8 zWZjU%=)cH;@d0&p|?|g?wi^E}Fml|xSD#VqVR`f0N8OH?hX;Y9ceb7nrhRWr6 zP+S}XxjJvSExW8}amP$JI$ENmOgoOAce-QYI!khM2#3?%qoCQf8WVFjz{RpAFp5ut zfis?9pVMEF-|$)TZcu4cI}lcYacY z6%Pgg-B$<9SUoyKqPvp6G8R3LFMuz*IUJ(JBb8OM)N}lGu0whboSf>61!@#KESZOO zh7G7aBN1&oSkn6QN^IGzbud|5hp6AP$Mb<-aN43mOiapU-zur%@HLXRTePllpIBA0 zxy6Lknit@Q@jUu=hBjT|V@~_t&cUcn=G6Ie6NG%z!$*D>z$RP;Gl#zc#RuuYlS{z7 zTPx7EJ_(eSSK}een-F&oQDGL(INc==! z?u0()_Mp2}FF0{D5shME*vFl7G4X8!#Md<(fImI13`ya1r$$ z`39TC2cS$_32#wVym!l-CcPGesw2g@eYL2Jx5S=xtpS^&P@;2Zh^$2bt~qE*j%dnI zua<={`5=$T790kruLiWJI3EVT8wW|#6lP?1AL_ z^Xsr``&9VWOO@0wOW{1use;z?Ld@$^1eqThdT3Q8OuDB)cuPuIg`Yh>vWFaqOm%*jgh)gE0>J=6r&4j#nY6S0yIg*#rTl8pP*;9yw%o4p%-& zz?bV(Npi_P%->!OFVa&Ws`DPm6+0kfpIDf>;}TanYdci*Im+Igvk_DJTae}tC&6i0 zGdtpjB=<=XZE?{WY||p-K7vkjZ%sc+n5P7pW@ zg=+_+{lWp5m0HJf#0DZ&R8UxQ%z6IetFUskJo)k}1AX&DIFY&nDN5t8v*I3{dccZQ z=en{_t{PLjO;6$B;xkwxcZ=gUDX^N))8MgzC28951xEeI2SJ9&B`;i#7WFy}CwFB6 zlk(bGm^l%3Zz~bIrt6ScB@e!Zek^myTvQJoq5iNUo0?hX!fvWXPn$>V5SAg#q8yQj zNSmG=t4ln>^x?D7QB2Z#jD-iyN%(|Lh!PoophpX+o1Z|tC0EdX$Wbn6W)f&#u7jAl zEAfy?G&s4{pw%5E+Bip!#?N{U{&TlM_I4f-ys?L;pE5Ciio`yui=yc6r#LkgJ{fDc z3kQyA!BdkC;G?4kRLTE1p1vWm+Z<8?+s(sJdB`U=@Zf2D`?e#P6rBY1*mzuVKm~o1 z`0SNgIncF9iSUZ=ak0h;Z1#RDBEM@m=*?PyatS=rXNf*(QF6pLrwxek*e20%#bfX( zQJFT*Qlfd`Wf(GYE^9Mr5b$j)Mfc`eQBAw8@On-Y_U&2=wTCxyS;k>dTx&p$JhZ|0 zOFRgC=D6HBEBQMytRJO}e5+0htb$xHxQsG}|>9>A(aSa#a&( z&uTb7$O+}wnxwK~OH^?Gwv!JHqD=!gfXvQ>_0`-c(pDI=5{(b3DIy-kpS=gC?VaJu zFabTGG8-lP{D7*;!Qv1P%xg%L&T-}Zu4^%PF43Ze4`Q)3V!-Zql%iSnFQ{;f#q=gA?%HLHtIYZA zz@l<+|KcJ;t(T!=kP(-MAqDr)-|>fs0@_>uXACS%z$|+Kd&X3sj#$ALd2Js_$Imoi zw{tlg1{2MoSbrSy+UqEB7%S4!>4G`;V?e%cE)%)*IF~P@&6+okMrR*gcI?9dIBD=b zF8ipK5r>~;tSy9ej^`3wxR6Ju?3;^%(dCrPBn&51d&Av%LiUom4xY;?#>{bCF0ex# zr5$=1Bd)HOre^5T1Gn7A+5$7yWzT-_uujC&N2}3m#{tAp1(sy}ia8A#a3snG(oVE7 z7oRj>p>_$Z-c-Sam97QPTuXY|nnsX}kwQ|o3CnA$rYx%7VZGaiqNC9;daB`WG(0sM z`8Da3Xx$Dp%%6nX3xpWN<)&0^90UhP=R&AWEDkY>VY&-!(B)PL_{C?UcHv;GXwXH8 z=6BR&xdj`$Di5kkzJ&`ddi0tnmUPYXSWJ;wfL8EbV1$#QJ^mDxJ-rgLj%~)Y2S-JM zPmG~+Un-Mk)hG(8w8ui6q&DnHN}b7z%N{$n?ThaqS8>q@BR zwk~EReG`37CgQFc9;o4MbHa{hA$(>x_!{fN1V0m2uFKWWBsqaqtRGHQjG&_gj!qvhz)lJN7rmuH-70t9Ap+>j%>o@`3EM0xl2e-55B${tC6!&4{IDjY6lK z49Kd}V_V0^!TfEbApYELSTWR`c8e>3%ouZYPjH1rk(Z#&r2;3)&ZB$yA!_-LL+M0m zI-_f!gsqB4AZxydR?}T@hJ7#=b-zRFgcN&;SpMHgV0=&>)Rt6!d{$N#c z8K(G*#AN|8s(0P^%fdHn7b>NDvk7s zbCINEB>V4`E3$vV*Qx>abBNeyv#NhO5l$T+N@eC``ah4ve$@N5{~LUqzhrzaJ`UF% zgy3?h5%R& zgqNsX*j9CJ^mV>8CoB2;&zG0{!QRlvtDi3dm7FfB{X@hi_DX1iX+?~J!~ + +# Micro Speech Example + +This example shows how to run a 20 kB model that can recognize 2 keywords, +"yes" and "no", from speech data. + +The application listens to its surroundings with a microphone and indicates +when it has detected a word by lighting an LED or displaying data on a +screen, depending on the capabilities of the device. + +![Animation on Arduino](images/animation_on_arduino.gif) + +The code has a small footprint (for example, around 22 kilobytes on a Cortex +M3) and only uses about 10 kilobytes of RAM for working memory, so it's able to +run on systems like an STM32F103 with only 20 kilobytes of total SRAM and 64 +kilobytes of Flash. + +## Table of contents + +- [Deploy to ARC EM SDP](#deploy-to-arc-em-sdp) +- [Deploy to Arduino](#deploy-to-arduino) +- [Deploy to ESP32](#deploy-to-esp32) +- [Deploy to SparkFun Edge](#deploy-to-sparkfun-edge) +- [Deploy to STM32F746](#deploy-to-STM32F746) +- [Deploy to NXP FRDM K66F](#deploy-to-nxp-frdm-k66f) +- [Deploy to HIMAX WE1 EVB](#deploy-to-himax-we1-evb) +- [Deploy to CEVA BX1/SP500](#deploy-to-ceva-bx1) +- [Run on macOS](#run-on-macos) +- [Run the tests on a development machine](#run-the-tests-on-a-development-machine) +- [Train your own model](#train-your-own-model) + +## Deploy to ARC EM SDP + +The following instructions will help you to build and deploy this example to +[ARC EM SDP](https://www.synopsys.com/dw/ipdir.php?ds=arc-em-software-development-platform) +board. General information and instructions on using the board with TensorFlow +Lite Micro can be found in the common +[ARC targets description](/tensorflow/lite/micro/tools/make/targets/arc/README.md). + +This example uses asymmetric int8 quantization and can therefore leverage +optimized int8 kernels from the embARC MLI library + +The ARC EM SDP board contains a rich set of extension interfaces. You can choose +any compatible microphone and modify +[audio_provider.cc](/tensorflow/lite/micro/examples/micro_speech/audio_provider.cc) +file accordingly to use input from your specific microphone. By default, results +of running this example are printed to the console. If you would like to instead +implement some target-specific actions, you need to modify +[command_responder.cc](/tensorflow/lite/micro/examples/micro_speech/command_responder.cc) +accordingly. + +The reference implementations of these files are used by default on the EM SDP. + +### Initial setup + +Follow the instructions on the +[ARC EM SDP Initial Setup](/tensorflow/lite/micro/tools/make/targets/arc/README.md#ARC-EM-Software-Development-Platform-ARC-EM-SDP) +to get and install all required tools for work with ARC EM SDP. + +### Generate Example Project + +As default example doesn’t provide any output without real audio, it is +recommended to get started with example for mock data. The project for ARC EM +SDP platform can be generated with the following command: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile \ +TARGET=arc_emsdp ARC_TAGS=reduce_codesize \ +OPTIMIZED_KERNEL_DIR=arc_mli \ +generate_micro_speech_mock_make_project +``` + +Note that `ARC_TAGS=reduce_codesize` applies example specific changes of code to +reduce total size of application. It can be omitted. + +### Build and Run Example + +For more detailed information on building and running examples see the +appropriate sections of general descriptions of the +[ARC EM SDP usage with TFLM](/tensorflow/lite/micro/tools/make/targets/arc/README.md#ARC-EM-Software-Development-Platform-ARC-EM-SDP). +In the directory with generated project you can also find a +*README_ARC_EMSDP.md* file with instructions and options on building and +running. Here we only briefly mention main steps which are typically enough to +get it started. + +1. You need to + [connect the board](/tensorflow/lite/micro/tools/make/targets/arc/README.md#connect-the-board) + and open an serial connection. + +2. Go to the generated example project director + + ``` + cd tensorflow/lite/micro/tools/make/gen/arc_emsdp_arc/prj/micro_speech_mock/make + ``` + +3. Build the example using + + ``` + make app + ``` + +4. To generate artefacts for self-boot of example from the board use + + ``` + make flash + ``` + +5. To run application from the board using microSD card: + + * Copy the content of the created /bin folder into the root of microSD + card. Note that the card must be formatted as FAT32 with default cluster + size (but less than 32 Kbytes) + * Plug in the microSD card into the J11 connector. + * Push the RST button. If a red LED is lit beside RST button, push the CFG + button. + * Type or copy next commands one-by-another into serial terminal: `setenv + loadaddr 0x10800000 setenv bootfile app.elf setenv bootdelay 1 setenv + bootcmd fatload mmc 0 \$\{loadaddr\} \$\{bootfile\} \&\& bootelf + saveenv` + * Push the RST button. + +6. If you have the MetaWare Debugger installed in your environment: + + * To run application from the console using it type `make run`. + * To stop the execution type `Ctrl+C` in the console several times. + +In both cases (step 5 and 6) you will see the application output in the serial +terminal. + +## Deploy to Arduino + +The following instructions will help you build and deploy this example to +[Arduino](https://www.arduino.cc/) devices. + +The example has been tested with the following devices: + +- [Arduino Nano 33 BLE Sense](https://store.arduino.cc/usa/nano-33-ble-sense-with-headers) + +The Arduino Nano 33 BLE Sense is currently the only Arduino with a built-in +microphone. If you're using a different Arduino board and attaching your own +microphone, you'll need to implement your own +audio_provider.cc+. It also has a +built-in LED, which is used to indicate that a word has been recognized. + +### Install the Arduino_TensorFlowLite library + +This example application is included as part of the official TensorFlow Lite +Arduino library. To install it, open the Arduino library manager in +`Tools -> Manage Libraries...` and search for `Arduino_TensorFlowLite`. + +### Load and run the example + +Once the library has been added, go to `File -> Examples`. You should see an +example near the bottom of the list named `TensorFlowLite:micro_speech`. Select +it and click `micro_speech` to load the example. + +Use the Arduino IDE to build and upload the example. Once it is running, you +should see the built-in LED on your device flashing. Saying the word "yes" will +cause the LED to remain on for 3 seconds. The current model has fairly low +accuracy, so you may have to repeat "yes" a few times. + +The program also outputs inference results to the serial port, which appear as +follows: + +``` +Heard yes (201) @4056ms +Heard no (205) @6448ms +Heard unknown (201) @13696ms +Heard yes (205) @15000ms +``` + +The number after each detected word is its score. By default, the program only +considers matches as valid if their score is over 200, so all of the scores you +see will be at least 200. + +When the program is run, it waits 5 seconds for a USB-serial connection to be +available. If there is no connection available, it will not output data. To see +the serial output in the Arduino desktop IDE, do the following: + +1. Open the Arduino IDE +1. Connect the Arduino board to your computer via USB +1. Press the reset button on the Arduino board +1. Within 5 seconds, go to `Tools -> Serial Monitor` in the Arduino IDE. You may + have to try several times, since the board will take a moment to connect. + +If you don't see any output, repeat the process again. + +## Deploy to ESP32 + +The following instructions will help you build and deploy this example to +[ESP32](https://www.espressif.com/en/products/hardware/esp32/overview) devices +using the [ESP IDF](https://github.com/espressif/esp-idf). + +The example has been tested on ESP-IDF version 4.0 with the following devices: - +[ESP32-DevKitC](http://esp-idf.readthedocs.io/en/latest/get-started/get-started-devkitc.html) - +[ESP-EYE](https://github.com/espressif/esp-who/blob/master/docs/en/get-started/ESP-EYE_Getting_Started_Guide.md) + +ESP-EYE is a board which has a built-in microphone which can be used to run this +example , if you want to use other esp boards you will have to connect +microphone externally and write your own +[audio_provider.cc](esp/audio_provider.cc). +You can also edit the +[command_responder.cc](command_responder.cc) +to define your own actions after detecting command. + +### Install the ESP IDF + +Follow the instructions of the +[ESP-IDF get started guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) +to setup the toolchain and the ESP-IDF itself. + +The next steps assume that the +[IDF environment variables are set](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#step-4-set-up-the-environment-variables) : + +* The `IDF_PATH` environment variable is set +* `idf.py` and Xtensa-esp32 tools (e.g. `xtensa-esp32-elf-gcc`) are in `$PATH` + +### Generate the examples + +The example project can be generated with the following command: +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_micro_speech_esp_project +``` + +### Building the example + +Go to the example project directory +``` +cd tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/micro_speech/esp-idf +``` + +Then build with `idf.py` `idf.py build` + +### Load and run the example + +To flash (replace `/dev/ttyUSB0` with the device serial port): +``` +idf.py --port /dev/ttyUSB0 flash +``` + +Monitor the serial output: +```idf.py --port /dev/ttyUSB0 monitor``` + +Use `Ctrl+]` to exit. + +The previous two commands can be combined: +``` +idf.py --port /dev/ttyUSB0 flash monitor +``` + +## Deploy to SparkFun Edge + +The following instructions will help you build and deploy this example on the +[SparkFun Edge development board](https://sparkfun.com/products/15170). + +The program will toggle the blue LED on and off with each inference. It will +switch on the yellow LED when a "yes" is heard, the red LED when a "no" is +heard, and the green LED when an unknown command is heard. + +The [AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +walks through the deployment process in detail. The steps are also +summarized below. + +### Compile the binary + +The following command will download the required dependencies and then compile a +binary for the SparkFun Edge: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge OPTIMIZED_KERNEL_DIR=cmsis_nn micro_speech_bin +``` + +The binary will be created in the following location: + +``` +tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin +``` + +### Sign the binary + +The binary must be signed with cryptographic keys to be deployed to the device. +We'll now run some commands that will sign our binary so it can be flashed to +the SparkFun Edge. The scripts we are using come from the Ambiq SDK, which is +downloaded when the `Makefile` is run. + +Enter the following command to set up some dummy cryptographic keys we can use +for development: + +``` +cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py \ +tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py +``` + +Next, run the following command to create a signed binary: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \ +--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin \ +--load-address 0xC000 \ +--magic-num 0xCB \ +-o main_nonsecure_ota \ +--version 0x0 +``` + +This will create the file `main_nonsecure_ota.bin`. We'll now run another +command to create a final version of the file that can be used to flash our +device with the bootloader script we will use in the next step: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ +--load-address 0x20000 \ +--bin main_nonsecure_ota.bin \ +-i 6 \ +-o main_nonsecure_wire \ +--options 0x1 +``` + +You should now have a file called `main_nonsecure_wire.bin` in the directory +where you ran the commands. This is the file we'll be flashing to the device. + +### Flash the binary + +Next, attach the board to your computer via a USB-to-serial adapter. + +**Note:** If you're using the [SparkFun Serial Basic Breakout](https://www.sparkfun.com/products/15096), +you should [install the latest drivers](https://learn.sparkfun.com/tutorials/sparkfun-serial-basic-ch340c-hookup-guide#drivers-if-you-need-them) +before you continue. + +Once connected, assign the USB device name to an environment variable: + +``` +export DEVICENAME=put your device name here +``` + +Set another variable with the baud rate: + +``` +export BAUD_RATE=921600 +``` + +Now, hold the button marked `14` on the device. While still holding the button, +hit the button marked `RST`. Continue holding the button marked `14` while +running the following command: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py \ +-b ${BAUD_RATE} ${DEVICENAME} \ +-r 1 \ +-f main_nonsecure_wire.bin \ +-i 6 +``` + +You should see a long stream of output as the binary is flashed to the device. +Once you see the following lines, flashing is complete: + +``` +Sending Reset Command. +Done. +``` + +If you don't see these lines, flashing may have failed. Try running through the +steps in [Flash the binary](#flash-the-binary) again (you can skip over setting +the environment variables). If you continue to run into problems, follow the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab, which includes more comprehensive instructions for the flashing +process. + +The binary should now be deployed to the device. Hit the button marked `RST` to +reboot the board. + +You should see the device's blue LED flashing. The yellow LED should light when +a "yes" is heard, the red LED when a "no" is heard, and the green LED when an +unknown command is heard. The current model has fairly low accuracy, so you may +have to repeat "yes" a few times. + +Debug information is logged by the board while the program is running. To view +it, establish a serial connection to the board using a baud rate of `115200`. +On OSX and Linux, the following command should work: + +``` +screen ${DEVICENAME} 115200 +``` + +You will see a line output for every word that is detected: + +``` +Heard yes (201) @4056ms +Heard no (205) @6448ms +Heard unknown (201) @13696ms +Heard yes (205) @15000ms +``` + +The number after each detected word is its score. By default, the program only +considers matches as valid if their score is over 200, so all of the scores you +see will be at least 200. + +To stop viewing the debug output with `screen`, hit `Ctrl+A`, immediately +followed by the `K` key, then hit the `Y` key. + +## Deploy to STM32F746 + +The following instructions will help you build and deploy the example to the +[STM32F7 discovery kit](https://os.mbed.com/platforms/ST-Discovery-F746NG/) +using [ARM Mbed](https://github.com/ARMmbed/mbed-cli). + +Before we begin, you'll need the following: + +- STM32F7 discovery kit board +- Mini-USB cable +- ARM Mbed CLI ([installation instructions](https://os.mbed.com/docs/mbed-os/v6.9/quick-start/build-with-mbed-cli.html). Check it out for MacOS Catalina - [mbed-cli is broken on MacOS Catalina #930](https://github.com/ARMmbed/mbed-cli/issues/930#issuecomment-660550734)) +- Python 3 and pip3 + +Since Mbed requires a special folder structure for projects, we'll first run a +command to generate a subfolder containing the required source files in this +structure: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=disco_f746ng OPTIMIZED_KERNEL_DIR=cmsis_nn generate_micro_speech_mbed_project +``` + +Running the make command will result in the creation of a new folder: + +``` +tensorflow/lite/micro/tools/make/gen/disco_f746ng_cortex-m4_default/prj/micro_speech/mbed +``` + +This folder contains all of the example's dependencies structured in the correct +way for Mbed to be able to build it. + +Change into the directory and run the following commands. + +First, tell Mbed that the current directory is the root of an Mbed project: + +``` +mbed config root . +``` + +Next, tell Mbed to download the dependencies and prepare to build: + +``` +mbed deploy +``` + +Older versions of Mbed will build the project using C++98. However, TensorFlow Lite +requires C++11. If needed, run the following Python snippet to modify the Mbed +configuration files so that it uses C++11: + +``` +python -c 'import fileinput, glob; +for filename in glob.glob("mbed-os/tools/profiles/*.json"): + for line in fileinput.input(filename, inplace=True): + print(line.replace("\"-std=gnu++98\"","\"-std=c++11\", \"-fpermissive\""))' +``` + +Note: Mbed has a dependency to an old version of arm_math.h and cmsis_gcc.h (adapted from the general [CMSIS-NN MBED example](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/kernels/cmsis_nn#example-2---mbed)). Therefore you need to copy the newer version as follows: +```bash +cp tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/\ +arm_math.h mbed-os/cmsis/TARGET_CORTEX_M/arm_math.h +cp tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/Core/Include/\ +cmsis_gcc.h mbed-os/cmsis/TARGET_CORTEX_M/cmsis_gcc.h +``` + +Finally, run the following command to compile: + +``` +mbed compile -m DISCO_F746NG -t GCC_ARM +``` + +This should result in a binary at the following path: + +``` +./BUILD/DISCO_F746NG/GCC_ARM/mbed.bin +``` + +To deploy, plug in your STM board and copy the file to it. On macOS, you can do +this with the following command: + +``` +cp ./BUILD/DISCO_F746NG/GCC_ARM/mbed.bin /Volumes/DIS_F746NG/ +``` + +Copying the file will initiate the flashing process. + +The inference results are logged by the board while the program is running. +To view it, establish a serial connection to the board +using a baud rate of `9600`. On OSX and Linux, the following command should +work, replacing `/dev/tty.devicename` with the name of your device as it appears +in `/dev`: + +``` +screen /dev/tty.devicename 9600 +``` + +You will see a line output for every word that is detected: + +``` +Heard yes (201) @4056ms +Heard no (205) @6448ms +Heard unknown (201) @13696ms +Heard yes (205) @15000ms +``` + +The number after each detected word is its score. By default, the program only +considers matches as valid if their score is over 200, so all of the scores you +see will be at least 200. + +To stop viewing the debug output with `screen`, hit `Ctrl+A`, immediately +followed by the `K` key, then hit the `Y` key. + +## Deploy to NXP FRDM K66F + +The following instructions will help you build and deploy the example to the +[NXP FRDM K66F](https://www.nxp.com/design/development-boards/freedom-development-boards/mcu-boards/freedom-development-platform-for-kinetis-k66-k65-and-k26-mcus:FRDM-K66F) +using [ARM Mbed](https://github.com/ARMmbed/mbed-cli). + +1. Download + [the TensorFlow source code](https://github.com/tensorflow/tensorflow). +2. Follow instructions from + [mbed website](https://os.mbed.com/docs/mbed-os/v5.13/tools/installation-and-setup.html) + to setup and install mbed CLI. +3. Compile TensorFlow with the following command to generate mbed project: + + ``` + make -f tensorflow/lite/micro/tools/make/Makefile TARGET=mbed TAGS="nxp_k66f" generate_micro_speech_mbed_project + ``` + +4. Change into the following directory that has been generated: + `tensorflow/lite/micro/tools/make/gen/mbed_cortex-m4/prj/micro_speech/mbed` + +5. Create an Mbed project using the generated files, run ensuring your + environment is using Python 2.7: `mbed config root .` + +6. Next, tell Mbed to download the dependencies and prepare to build: `mbed + deploy` + +7. Finally, we can run the following command to compile the code: `mbed compile + -m K66F -t GCC_ARM` + +8. For some Mbed compilers (such as GCC), you may get compile error in + mbed_rtc_time.cpp. Go to `mbed-os/platform/mbed_rtc_time.h` and comment line + 32 and line 37: + + ``` + //#if !defined(__GNUC__) || defined(__CC_ARM) || defined(__clang__) + struct timeval { + time_t tv_sec; + int32_t tv_usec; + }; + //#endif + ``` + +9. If your system does not recognize the board with the `mbed detect` command. + Follow the instructions for setting up + [DAPLink](https://armmbed.github.io/DAPLink/?board=FRDM-K66F) for the + [K66F](https://os.mbed.com/platforms/FRDM-K66F/). + +10. Connect the USB cable to the micro USB port. When the Ethernet port is + facing towards you, the micro USB port is left of the Ethernet port. + +11. To compile and flash in a single step, add the `--flash` option: + + ``` + mbed compile -m K66F -t GCC_ARM --flash + ``` + +12. Disconnect USB cable from the device to power down the device and connect + back the power cable to start running the model. + +13. Connect to serial port with baud rate of 9600 and correct serial device to + view the output from the MCU. In linux, you can run the following screen + command if the serial device is `/dev/ttyACM0`: + + ``` + sudo screen /dev/ttyACM0 9600 + ``` + +14. Saying "Yes" will print "Yes" and "No" will print "No" on the serial port. + +15. A loopback path from microphone to headset jack is enabled. Headset jack is + in black color. If there is no output on the serial port, you can connect + headphone to headphone port to check if audio loopback path is working. + +## Deploy to HIMAX WE1 EVB + +The following instructions will help you build and deploy this example to +[HIMAX WE1 EVB](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_board_brief) +board. To understand more about using this board, please check +[HIMAX WE1 EVB user guide](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide). + +### Initial Setup + +To use the HIMAX WE1 EVB, please make sure following software are installed: + +#### MetaWare Development Toolkit + +See +[Install the Synopsys DesignWare ARC MetaWare Development Toolkit](/tensorflow/lite/micro/tools/make/targets/arc/README.md#install-the-synopsys-designware-arc-metaware-development-toolkit) +section for instructions on toolchain installation. + +#### Make Tool version + +A `'make'` tool is required for deploying Tensorflow Lite Micro applications on +HIMAX WE1 EVB, See +[Check make tool version](/tensorflow/lite/micro/tools/make/targets/arc/README.md#make-tool) +section for proper environment. + +#### Serial Terminal Emulation Application + +There are 2 main purposes for HIMAX WE1 EVB Debug UART port + +- print application output +- burn application to flash by using xmodem send application binary + +You can use any terminal emulation program (like [PuTTY](https://www.putty.org/) +or [minicom](https://linux.die.net/man/1/minicom)). + +### Generate Example Project + +The example project for HIMAX WE1 EVB platform can be generated with the +following command: + +Download related third party data + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=himax_we1_evb third_party_downloads +``` + +Generate micro speech project + +``` +make -f tensorflow/lite/micro/tools/make/Makefile generate_micro_speech_make_project TARGET=himax_we1_evb +``` + +### Build and Burn Example + +Following the Steps to run micro speech example at HIMAX WE1 EVB platform. + +1. Go to the generated example project directory. + + ``` + cd tensorflow/lite/micro/tools/make/gen/himax_we1_evb_arc/prj/micro_speech/make + ``` + +2. Build the example using + + ``` + make app + ``` + +3. After example build finish, copy ELF file and map file to image generate + tool directory. \ + image generate tool directory located at + `'tensorflow/lite/micro/tools/make/downloads/himax_we1_sdk/image_gen_linux_v3/'` + + ``` + cp micro_speech.elf himax_we1_evb.map ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + +4. Go to flash image generate tool directory. + + ``` + cd ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + + make sure this tool directory is in $PATH. You can permanently set it to + PATH by + + ``` + export PATH=$PATH:$(pwd) + ``` + +5. run image generate tool, generate flash image file. + + * Before running image generate tool, by typing `sudo chmod +x image_gen` + and `sudo chmod +x sign_tool` to make sure it is executable. + + ``` + image_gen -e micro_speech.elf -m himax_we1_evb.map -o out.img + ``` + +6. Download flash image file to HIMAX WE1 EVB by UART: + + * more detail about download image through UART can be found at + [HIMAX WE1 EVB update Flash image](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide#flash-image-update) + +After these steps, press reset button on the HIMAX WE1 EVB, you will see +application output in the serial terminal and lighting LED. + +![Animation on Himax WE1 EVB](https://raw.githubusercontent.com/HimaxWiseEyePlus/bsp_tflu/master/HIMAX_WE1_EVB_user_guide/images/tflm_example_micro_speech_int8_led.gif) + +## Deploy to CEVA-BX1 + +The following instructions will help you build and deploy the sample to the +[CEVA-BX1](https://www.ceva-dsp.com/product/ceva-bx1-sound/) or [CEVA-SP500](https://www.ceva-dsp.com/product/ceva-senspro/) + +1. Contact CEVA at [sales@ceva-dsp.com](mailto:sales@ceva-dsp.com) +2. For BX1: +2.1. Download and install CEVA-BX Toolbox v18.0.2 +2.2. Set the TARGET_TOOLCHAIN_ROOT variable in + /tensorflow/lite/micro/tools/make/templates/ceva_bx1/ceva_app_makefile.tpl + To your installation location. For example: TARGET_TOOLCHAIN_ROOT := + /home/myuser/work/CEVA-ToolBox/V18/BX +2.3. Generate the Makefile for the project: /tensorflow$ make -f + tensorflow/lite/micro/tools/make/Makefile TARGET=ceva TARGET_ARCH=CEVA_BX1 + generate_micro_speech_make_project +3. For SensPro (SP500): +3.1. Download and install CEVA-SP Toolbox v20 +3.2. Set the TARGET_TOOLCHAIN_ROOT variable in + /tensorflow/lite/micro/tools/make/templates/ceva_SP500/ceva_app_makefile.tpl + To your installation location. For example: TARGET_TOOLCHAIN_ROOT := + /home/myuser/work/CEVA-ToolBox/V20/SensPro +3.3. Generate the Makefile for the project: /tensorflow$ make -f + tensorflow/lite/micro/tools/make/Makefile TARGET=ceva TARGET_ARCH=CEVA_SP500 + generate_micro_speech_make_project +5. Build the project: + /tensorflow/lite/micro/tools/make/gen/ceva_bx1/prj/micro_speech/make$ make +6. This should build the project and create a file called micro_speech.elf. +7. The supplied configuration reads input from a files and expects a file + called input.wav (easily changed in audio_provider.cc) to be placed in the + same directory of the .elf file +8. We used Google's speech command dataset: V0.0.2: + http://download.tensorflow.org/data/speech_commands_v0.02.tar.gz V0.0.1: + http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz +9. Follow CEVA Toolbox instructions for creating a debug target and running the + project. +10. Output should look like: Heard silence (208) @352ms Heard no (201) @1696ms + Heard yes (203) @3904ms + +## Run on macOS + +The example contains an audio provider compatible with macOS. If you have access +to a Mac, you can run the example on your development machine. + +First, use the following command to build it: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile micro_speech +``` + +Once the build completes, you can run the example with the following command: + +``` +tensorflow/lite/micro/tools/make/gen/osx_x86_64/bin/micro_speech +``` + +You might see a pop-up asking for microphone access. If so, grant it, and the +program will start. + +Try saying "yes" and "no". You should see output that looks like the following: + +``` +Heard yes (201) @4056ms +Heard no (205) @6448ms +Heard unknown (201) @13696ms +Heard yes (205) @15000ms +Heard yes (205) @16856ms +Heard unknown (204) @18704ms +Heard no (206) @21000ms +``` + +The number after each detected word is its score. By default, the recognize +commands component only considers matches as valid if their score is over 200, +so all of the scores you see will be at least 200. + +The number after the score is the number of milliseconds since the program was +started. + +If you don't see any output, make sure your Mac's internal microphone is +selected in the Mac's *Sound* menu, and that its input volume is turned up high +enough. + +## Run the tests on a development machine + +To compile and test this example on a desktop Linux or macOS machine, download +[the TensorFlow source code](https://github.com/tensorflow/tensorflow), `cd` +into the source directory from a terminal, and then run the following command: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile test_micro_speech_test +``` + +This will take a few minutes, and downloads frameworks the code uses like +[CMSIS](https://developer.arm.com/embedded/cmsis) and +[flatbuffers](https://google.github.io/flatbuffers/). Once that process has +finished, you should see a series of files get compiled, followed by some +logging output from a test, which should conclude with `~~~ALL TESTS PASSED~~~`. + +If you see this, it means that a small program has been built and run that loads +the trained TensorFlow model, runs some example inputs through it, and got the +expected outputs. + +To understand how TensorFlow Lite does this, you can look at the source in +[micro_speech_test.cc](micro_speech_test.cc). +It's a fairly small amount of code that creates an interpreter, gets a handle to +a model that's been compiled into the program, and then invokes the interpreter +with the model and sample inputs. + +## Train your own model + +So far you have used an existing trained model to run inference on +microcontrollers. If you wish to train your own model, follow the instructions +given in the [train/](train/) directory. diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.cc new file mode 100644 index 00000000..9ffee175 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.cc @@ -0,0 +1,41 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h" + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" + +namespace { +int16_t g_dummy_audio_data[kMaxAudioSampleSize]; +int32_t g_latest_audio_timestamp = 0; +} // namespace + +TfLiteStatus GetAudioSamples(tflite::ErrorReporter *error_reporter, + int start_ms, int duration_ms, + int *audio_samples_size, int16_t **audio_samples) +{ + for (int i = 0; i < kMaxAudioSampleSize; ++i) { + g_dummy_audio_data[i] = 0; + } + *audio_samples_size = kMaxAudioSampleSize; + *audio_samples = g_dummy_audio_data; + return kTfLiteOk; +} + +int32_t LatestAudioTimestamp() +{ + g_latest_audio_timestamp += 100; + return g_latest_audio_timestamp; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.h new file mode 100644 index 00000000..f1ebe7a0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider.h @@ -0,0 +1,46 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_AUDIO_PROVIDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_AUDIO_PROVIDER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// This is an abstraction around an audio source like a microphone, and is +// expected to return 16-bit PCM sample data for a given point in time. The +// sample data itself should be used as quickly as possible by the caller, since +// to allow memory optimizations there are no guarantees that the samples won't +// be overwritten by new data in the future. In practice, implementations should +// ensure that there's a reasonable time allowed for clients to access the data +// before any reuse. +// The reference implementation can have no platform-specific dependencies, so +// it just returns an array filled with zeros. For real applications, you should +// ensure there's a specialized implementation that accesses hardware APIs. +TfLiteStatus GetAudioSamples(tflite::ErrorReporter *error_reporter, + int start_ms, int duration_ms, + int *audio_samples_size, int16_t **audio_samples); + +// Returns the time that audio data was last captured in milliseconds. There's +// no contract about what time zero represents, the accuracy, or the granularity +// of the result. Subsequent calls will generally not return a lower value, but +// even that's not guaranteed if there's an overflow wraparound. +// The reference implementation of this function just returns a constantly +// incrementing value for each call, since it would need a non-portable platform +// call to access time information. For real applications, you'll need to write +// your own platform-specific implementation. +int32_t LatestAudioTimestamp(); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_AUDIO_PROVIDER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock.cc new file mode 100644 index 00000000..d3403842 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock.cc @@ -0,0 +1,57 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h" + +namespace { +int16_t g_dummy_audio_data[kMaxAudioSampleSize]; +int32_t g_latest_audio_timestamp = 0; +} // namespace + +TfLiteStatus GetAudioSamples(tflite::ErrorReporter *error_reporter, + int start_ms, int duration_ms, + int *audio_samples_size, int16_t **audio_samples) +{ + const int yes_start = (0 * kAudioSampleFrequency) / 1000; + const int yes_end = (1000 * kAudioSampleFrequency) / 1000; + const int no_start = (4000 * kAudioSampleFrequency) / 1000; + const int no_end = (5000 * kAudioSampleFrequency) / 1000; + const int wraparound = (8000 * kAudioSampleFrequency) / 1000; + const int start_sample = (start_ms * kAudioSampleFrequency) / 1000; + for (int i = 0; i < kMaxAudioSampleSize; ++i) { + const int sample_index = (start_sample + i) % wraparound; + int16_t sample; + if ((sample_index >= yes_start) && (sample_index < yes_end)) { + sample = g_yes_1000ms_sample_data[sample_index - yes_start]; + } else if ((sample_index >= no_start) && (sample_index < no_end)) { + sample = g_no_1000ms_sample_data[sample_index - no_start]; + } else { + sample = 0; + } + g_dummy_audio_data[i] = sample; + } + *audio_samples_size = kMaxAudioSampleSize; + *audio_samples = g_dummy_audio_data; + return kTfLiteOk; +} + +int32_t LatestAudioTimestamp() +{ + g_latest_audio_timestamp += 100; + return g_latest_audio_timestamp; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock_test.cc new file mode 100644 index 00000000..e400f560 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_mock_test.cc @@ -0,0 +1,77 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestAudioProviderMock) +{ + tflite::MicroErrorReporter micro_error_reporter; + + int audio_samples_size = 0; + int16_t *audio_samples = nullptr; + TfLiteStatus get_status = + GetAudioSamples(µ_error_reporter, 0, kFeatureSliceDurationMs, + &audio_samples_size, &audio_samples); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, get_status); + TF_LITE_MICRO_EXPECT_LE(audio_samples_size, kMaxAudioSampleSize); + TF_LITE_MICRO_EXPECT_NE(audio_samples, nullptr); + for (int i = 0; i < audio_samples_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_yes_1000ms_sample_data[i], audio_samples[i]); + } + + get_status = + GetAudioSamples(µ_error_reporter, 500, kFeatureSliceDurationMs, + &audio_samples_size, &audio_samples); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, get_status); + TF_LITE_MICRO_EXPECT_LE(audio_samples_size, kMaxAudioSampleSize); + TF_LITE_MICRO_EXPECT_NE(audio_samples, nullptr); + for (int i = 0; i < audio_samples_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_yes_1000ms_sample_data[i + 8000], + audio_samples[i]); + } + + get_status = + GetAudioSamples(µ_error_reporter, 1500, kFeatureSliceDurationMs, + &audio_samples_size, &audio_samples); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, get_status); + TF_LITE_MICRO_EXPECT_LE(audio_samples_size, kMaxAudioSampleSize); + TF_LITE_MICRO_EXPECT_NE(audio_samples, nullptr); + for (int i = 0; i < audio_samples_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(0, audio_samples[i]); + } + + get_status = + GetAudioSamples(µ_error_reporter, 12250, kFeatureSliceDurationMs, + &audio_samples_size, &audio_samples); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, get_status); + TF_LITE_MICRO_EXPECT_LE(audio_samples_size, kMaxAudioSampleSize); + TF_LITE_MICRO_EXPECT_NE(audio_samples, nullptr); + for (int i = 0; i < audio_samples_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_no_1000ms_sample_data[i + 4000], + audio_samples[i]); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_test.cc new file mode 100644 index 00000000..89fb4841 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/audio_provider_test.cc @@ -0,0 +1,71 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestAudioProvider) +{ + tflite::MicroErrorReporter micro_error_reporter; + + int audio_samples_size = 0; + int16_t *audio_samples = nullptr; + TfLiteStatus get_status = + GetAudioSamples(µ_error_reporter, 0, kFeatureSliceDurationMs, + &audio_samples_size, &audio_samples); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, get_status); + TF_LITE_MICRO_EXPECT_LE(audio_samples_size, kMaxAudioSampleSize); + TF_LITE_MICRO_EXPECT_NE(audio_samples, nullptr); + + // Make sure we can read all of the returned memory locations. + int total = 0; + for (int i = 0; i < audio_samples_size; ++i) { + total += audio_samples[i]; + } +} + +TF_LITE_MICRO_TEST(TestTimer) +{ + // Make sure that the technically-undefined overflow behavior we rely on below + // works on this platform. It's still not guaranteed, but at least this is a + // smoke check. Turn off when running with ASan, as it will complain about + // the following undefined behavior. +#ifndef ADDRESS_SANITIZER + int32_t overflow_value = std::numeric_limits::max(); + overflow_value += 1; + TF_LITE_MICRO_EXPECT_EQ(std::numeric_limits::min(), overflow_value); +#endif + + const int32_t first_time = LatestAudioTimestamp(); + const int32_t second_time = LatestAudioTimestamp(); + + // It's possible that the timer may have wrapped around from +BIG_NUM to + // -BIG_NUM between the first and second calls, since we're storing + // milliseconds in a 32-bit integer. It's not reasonable that the call itself + // would have taken more than 2^31 milliseconds though, so look at the + // difference and rely on integer overflow to ensure it's accurate. + const int32_t time_delta = (second_time - first_time); + TF_LITE_MICRO_EXPECT_LE(0, time_delta); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.cc new file mode 100644 index 00000000..41ab092c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.cc @@ -0,0 +1,29 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h" + +// The default implementation writes out the name of the recognized command +// to the error console. Real applications will want to take some custom +// action instead, and should implement their own versions of this function. +void RespondToCommand(tflite::ErrorReporter *error_reporter, + int32_t current_time, const char *found_command, + uint8_t score, bool is_new_command) +{ + if (is_new_command) { + TF_LITE_REPORT_ERROR(error_reporter, "Heard %s (%d) @%dms", found_command, + score, current_time); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.h new file mode 100644 index 00000000..e4c42f61 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder.h @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Provides an interface to take an action based on an audio command. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_COMMAND_RESPONDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_COMMAND_RESPONDER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Called every time the results of an audio recognition run are available. The +// human-readable name of any recognized command is in the `found_command` +// argument, `score` has the numerical confidence, and `is_new_command` is set +// if the previous command was different to this one. +void RespondToCommand(tflite::ErrorReporter *error_reporter, + int32_t current_time, const char *found_command, + uint8_t score, bool is_new_command); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_COMMAND_RESPONDER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder_test.cc new file mode 100644 index 00000000..6231d95f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/command_responder_test.cc @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestCallability) +{ + tflite::MicroErrorReporter micro_error_reporter; + + // This will have external side-effects (like printing to the debug console + // or lighting an LED) that are hard to observe, so the most we can do is + // make sure the call doesn't crash. + RespondToCommand(µ_error_reporter, 0, "foo", 0, true); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.cc new file mode 100644 index 00000000..fe5f5bce --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.cc @@ -0,0 +1,124 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/feature_provider.h" + +#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" + +FeatureProvider::FeatureProvider(int feature_size, int8_t *feature_data) + : feature_size_(feature_size), + feature_data_(feature_data), + is_first_run_(true) +{ + // Initialize the feature data to default values. + for (int n = 0; n < feature_size_; ++n) { + feature_data_[n] = 0; + } +} + +FeatureProvider::~FeatureProvider() +{ +} + +TfLiteStatus FeatureProvider::PopulateFeatureData( + tflite::ErrorReporter *error_reporter, int32_t last_time_in_ms, + int32_t time_in_ms, int *how_many_new_slices) +{ + if (feature_size_ != kFeatureElementCount) { + TF_LITE_REPORT_ERROR(error_reporter, + "Requested feature_data_ size %d doesn't match %d", + feature_size_, kFeatureElementCount); + return kTfLiteError; + } + + // Quantize the time into steps as long as each window stride, so we can + // figure out which audio data we need to fetch. + const int last_step = (last_time_in_ms / kFeatureSliceStrideMs); + const int current_step = (time_in_ms / kFeatureSliceStrideMs); + + int slices_needed = current_step - last_step; + // If this is the first call, make sure we don't use any cached information. + if (is_first_run_) { + TfLiteStatus init_status = InitializeMicroFeatures(error_reporter); + if (init_status != kTfLiteOk) { + return init_status; + } + is_first_run_ = false; + slices_needed = kFeatureSliceCount; + } + if (slices_needed > kFeatureSliceCount) { + slices_needed = kFeatureSliceCount; + } + *how_many_new_slices = slices_needed; + + const int slices_to_keep = kFeatureSliceCount - slices_needed; + const int slices_to_drop = kFeatureSliceCount - slices_to_keep; + // If we can avoid recalculating some slices, just move the existing data + // up in the spectrogram, to perform something like this: + // last time = 80ms current time = 120ms + // +-----------+ +-----------+ + // | data@20ms | --> | data@60ms | + // +-----------+ -- +-----------+ + // | data@40ms | -- --> | data@80ms | + // +-----------+ -- -- +-----------+ + // | data@60ms | -- -- | | + // +-----------+ -- +-----------+ + // | data@80ms | -- | | + // +-----------+ +-----------+ + if (slices_to_keep > 0) { + for (int dest_slice = 0; dest_slice < slices_to_keep; ++dest_slice) { + int8_t *dest_slice_data = + feature_data_ + (dest_slice * kFeatureSliceSize); + const int src_slice = dest_slice + slices_to_drop; + const int8_t *src_slice_data = + feature_data_ + (src_slice * kFeatureSliceSize); + for (int i = 0; i < kFeatureSliceSize; ++i) { + dest_slice_data[i] = src_slice_data[i]; + } + } + } + // Any slices that need to be filled in with feature data have their + // appropriate audio data pulled, and features calculated for that slice. + if (slices_needed > 0) { + for (int new_slice = slices_to_keep; new_slice < kFeatureSliceCount; + ++new_slice) { + const int new_step = (current_step - kFeatureSliceCount + 1) + new_slice; + const int32_t slice_start_ms = (new_step * kFeatureSliceStrideMs); + int16_t *audio_samples = nullptr; + int audio_samples_size = 0; + // TODO(petewarden): Fix bug that leads to non-zero slice_start_ms + GetAudioSamples(error_reporter, (slice_start_ms > 0 ? slice_start_ms : 0), + kFeatureSliceDurationMs, &audio_samples_size, + &audio_samples); + if (audio_samples_size < kMaxAudioSampleSize) { + TF_LITE_REPORT_ERROR(error_reporter, + "Audio data size %d too small, want %d", + audio_samples_size, kMaxAudioSampleSize); + return kTfLiteError; + } + int8_t *new_slice_data = feature_data_ + (new_slice * kFeatureSliceSize); + size_t num_samples_read; + TfLiteStatus generate_status = GenerateMicroFeatures( + error_reporter, audio_samples, audio_samples_size, kFeatureSliceSize, + new_slice_data, &num_samples_read); + if (generate_status != kTfLiteOk) { + return generate_status; + } + } + } + return kTfLiteOk; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.h new file mode 100644 index 00000000..da0c2fe7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider.h @@ -0,0 +1,52 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_FEATURE_PROVIDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_FEATURE_PROVIDER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Binds itself to an area of memory intended to hold the input features for an +// audio-recognition neural network model, and fills that data area with the +// features representing the current audio input, for example from a microphone. +// The audio features themselves are a two-dimensional array, made up of +// horizontal slices representing the frequencies at one point in time, stacked +// on top of each other to form a spectrogram showing how those frequencies +// changed over time. +class FeatureProvider { +public: + // Create the provider, and bind it to an area of memory. This memory should + // remain accessible for the lifetime of the provider object, since subsequent + // calls will fill it with feature data. The provider does no memory + // management of this data. + FeatureProvider(int feature_size, int8_t *feature_data); + ~FeatureProvider(); + + // Fills the feature data with information from audio inputs, and returns how + // many feature slices were updated. + TfLiteStatus PopulateFeatureData(tflite::ErrorReporter *error_reporter, + int32_t last_time_in_ms, int32_t time_in_ms, + int *how_many_new_slices); + +private: + int feature_size_; + int8_t *feature_data_; + // Make sure we don't try to use cached information if this is the first call + // into the provider. + bool is_first_run_; +}; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_FEATURE_PROVIDER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_mock_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_mock_test.cc new file mode 100644 index 00000000..eafd86df --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_mock_test.cc @@ -0,0 +1,66 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/feature_provider.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestFeatureProviderMockYes) +{ + tflite::MicroErrorReporter micro_error_reporter; + + int8_t feature_data[kFeatureElementCount]; + FeatureProvider feature_provider(kFeatureElementCount, feature_data); + + int how_many_new_slices = 0; + TfLiteStatus populate_status = feature_provider.PopulateFeatureData( + µ_error_reporter, /* last_time_in_ms= */ 0, /* time_in_ms= */ 970, + &how_many_new_slices); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, populate_status); + TF_LITE_MICRO_EXPECT_EQ(kFeatureSliceCount, how_many_new_slices); + + for (int i = 0; i < kFeatureElementCount; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_yes_micro_f2e59fea_nohash_1_data[i], + feature_data[i]); + } +} + +TF_LITE_MICRO_TEST(TestFeatureProviderMockNo) +{ + tflite::MicroErrorReporter micro_error_reporter; + + int8_t feature_data[kFeatureElementCount]; + FeatureProvider feature_provider(kFeatureElementCount, feature_data); + + int how_many_new_slices = 0; + TfLiteStatus populate_status = feature_provider.PopulateFeatureData( + µ_error_reporter, /* last_time_in_ms= */ 4000, + /* time_in_ms= */ 4970, &how_many_new_slices); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, populate_status); + TF_LITE_MICRO_EXPECT_EQ(kFeatureSliceCount, how_many_new_slices); + + for (int i = 0; i < kFeatureElementCount; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_no_micro_f9643d42_nohash_4_data[i], + feature_data[i]); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_test.cc new file mode 100644 index 00000000..f6245993 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/feature_provider_test.cc @@ -0,0 +1,40 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/feature_provider.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestFeatureProvider) +{ + tflite::MicroErrorReporter micro_error_reporter; + + int8_t feature_data[kFeatureElementCount]; + FeatureProvider feature_provider(kFeatureElementCount, feature_data); + + int how_many_new_slices = 0; + TfLiteStatus populate_status = feature_provider.PopulateFeatureData( + µ_error_reporter, /* last_time_in_ms= */ 0, /* time_in_ms= */ 10000, + &how_many_new_slices); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, populate_status); + TF_LITE_MICRO_EXPECT_EQ(kFeatureSliceCount, how_many_new_slices); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/images/animation_on_arduino.gif b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/images/animation_on_arduino.gif new file mode 100644 index 0000000000000000000000000000000000000000..66ab9c1a5934256f5243b2970700be21ceb502d4 GIT binary patch literal 1947798 zcmdSgRZQGbz$Ng(wLo!qx8m-_-QC^Yt+>0p!vKT3dy88s?k#QwS||m|?ElMdc9YFM ztYwqsk?_FWdwwT@+#{zTDnR9cxE5bRT3-^PfA zmyuJPmX<`0jnUHFVyr3dW-8CYMHl8_?Q5y-9u$FsfWhBkh+&y9_%q7l58Q^A@7~xe|P)JEd$Is4*hVkw_ zGbt}GgM*V!xUajPh2r?c3^oy!nu=_4e4L;lAKM4|07qkEbGy`nJR%BqRY_iZEpabf zeRo5J!p!ixmTprOzWA&%RSg}tAbeg4F?T=D@W^N$Q5q9_)3CTqBNZtN3nLLp(Tvm( z4MU@}jO@h7(4vAwD+5IbXIoZI9#2YAt-SdsOK2#85O%1Y&DWwdq;)-`qz;gR(Yeh#$L?CKey zCMO1`r)k+?1+epmqmiQsk_Opn662A!b`9lcrI%OKP&2Uf3{DUb6W7%>QjrsP_6)A9 zZqzrnmsC_i+WVzsK6a2XcJ>TG8k&nst3S$qtgNo5CMT(H>Zq-6DX#!`_Ky91eua-F z#F=3cytC~Ym}moje{xz$3GVvF4iX9)0%FpCZ*L84{drj#A0>H&&`ER=NkeQkq-CXW z-s9FcG`DsR1>0&+F|gFtHg?zpYiRGMf}*L)Xls3xRF~mm=YWF&fk0G$;o*@$P!QD{k(#@=gNs9; zjWwl@mxHSvrA?rngDtz2n+u2)_(9Nr7>Wf10l@}N21o)BPCyE9r$8_OIRE+Hfk*&} z1+EN8DG+`FA~N8n064(y1MUEEK%9V}0;dXmULZLDA0R3~+JVCdju#*U&;XUC+1a1LHFF+gc z4(I?N0Kfr0K-z&20(T8G0ALeHH2@Hh2#5g41Mvn#1FQfhKr;Y{0IGl#05U)W$RyAh z05l-I08Bs%P!0fpfEbW}fF7U>XaK+tAQ5N-fGvC3sL_li+-T~u4;Q&a1$^yUw{R4CeAPXP{Kp)w z0gVLI8h{Rn9FS5V*Z@x;+kiEI0N@=c1fYum;D9>-8UXOWS_6OsiUFzsZGbtT7)bSh zMCkwjFJvf44TV{qOE#1`-9a?kwSaTyu5(d#m;m)c(G6-5|s?Ky>_`$J~M@Ns-tcNte&e_T%TUQ z3enGY+@0ynSZ_A(ea+pxe0JZBjW?tkmtg+TeG0v5VI2W~3Mfheoda z22KRi=ZjJrGzM{!bLcY|oEw&(NZa>WLP&X2|uo%TaX`~Ms- z)g?kH+=>VO-tV`2ne7jTJpVZxofKF56#DOF=CI#(aepv$7kX${8U~LqU>Lls^el9_1NKt-da4qOpCaX#1S7yP7@>r+qZ)MQR*IVb? zd^9&@w9QnNb)e6-SFNM>mk#_}EvMI~Fk2+jHbtB7Z@czApR|T)zaR|J(Wp?|bsCk$ z&9b91ouTF{YPl$)plwOk#q??Qr{}u!nusp@Bd@Z+)njn>gaKHxT&&x^%1_nMAwTa6 zw15d*{I$N2NrpZ9vbLcn`Z6_W?76;WVurY(af%+|9FW$=1g!on5PU z=~_{M#I?sGKGw3>C~Vhvo>@X}x~^jUSXxpf10D7C0=FQLb5qFAzMZbin_DwU1q7I^ z^#dIoJ1xCbD*->5sKuS{r$s6UJU@$*oN#`*3w8b}CwMvFwW$1Z#WNzQXUAP1V{%nF zD}S%=`jz&>wa^tvoMOX!P{b;J;2 z&STN?Umpg#7hZpknANs6?c1gPyV=fN4EfVygfa6xmHKn&X{*`!?Jv%_+S|XM+Z5uL zzbY4@na{HnZ?GHU(B)L4YnlTPQtk)>^HLaA(g762ID)F$5=NL+_DuRDff0BcNj6u8 zi0Lm$9G(`AFG6)fPc?>5-4aTrY=QoVUy49VC7R@0)PZ%}IMG&1z$y*Z12ipj{88W{ zPUNZ_^Aq6&v8!vmLKHPlw7krvdW$DxQU$JqemA@4a=f{71>t0m3>$N6l35Y;^Fo{~ zcb`VG4y_gZ_LD5%*Y_!&=rri9`f|d1?^6Sh_9$M?CRs7C(>#=qs8D+4rB5`{)0}B( z(3lkD4DZvkwYO-w^JSF-xzb8$Eg9ve6%-5Fvgih^X%(gwwfowVKWZP7D)mllZE5B- z!XNi}PtEoa-RF!n(6Q^~&x$^4<~5VnuxAn}Tk~b+e@;5#D*vl&rWP5W)X+ut?{WqersMkj<${@xQjY3#6~8{I5_YFb&Uq%q5JhckqO96t`3t2WqHi^* zcy)w>-_?s1SL>v**}l*^=#&PoHU&QL8QC~0eJ0k0gg!LziJBWs_h~m3;59nvTq;b? zto3z0G&#+)82=$&&koh83+sfKB9V+a-*;w)JV2svnf1R2<+S)2PgpP%>Q5oAwYgR| z*s=tDLv+MzFO#{l6;v{;5q<0^ccE32H8KoC>1uDmJ9n}x+}eV+J$5zfI6J!}Zq3Q^ zc8~0`xdpxG?hy0$w7FoJI4Bt(I=1zoW?y-vL$;~8{`74;TuXlxGP#K0E!cEv@-5#s z`6;yCE^FL`x+=W4qtHEY%ljd4oP_={A$Q;|yE$}Gc<1pu|L{vE`{LE*eg*#b5#%?N zPjGVw7pQqdxyc;iM7>+n*x$zp7g}Ph3J>7rs>aE`pvQe=wZy)ho_IHO7@;?3xuTla z4Z^31`z2xZ&aS7Oo4z#}GwBCu?#86qCTFUkXYBhw*i+K7o*CK3Kj>%SKhsIJrmMjo zYwPrW{+I2ZqsL%PdD=6(f8UlljDEuP(Q?iju~l+ZIfMNJ5p>=K1HNdV^+eEUY(d-= zuHbG!4|(`$@z1{x(ip64FqAn>v|CVNX*^6uKo>Tqj)4~3*<-i5?(8^ia^opcQ=)+6aU5hyUb7tvZ{a6v^_Hdqmh zFn5g&Xc1WTC(mEP-#lcUMc&JQ>Ww41`<*B}aDrjhr6NXhVSXQ!#nvsjkl5hVgR_h3 zT?6$EE4Oh>927wm>pxv{%Ms1N6+m;^dzug^LWVLITDc{o;L&2@55jz ztAY0;PXTKE{~AU0A7m3D-&@Lxv}={U}cf;19mNKb2pN zya_w$CqH3qp%2+?vODC%&!OJOj1VUK@8VV>X= z7`$mE{KM=J|4hQpuZJ7ByE~MHV=;O+f#ETF;1zFS9{6DsV?Vv|dl3@AbHzn4%7^^m zi=^6s7s^BS90{K~g*OKw()Wa9cEd>@L?|41d_;1Re2S3niQ=h+W8jD;x`m&8MDk{E z#CW8|mkZuTbbHhFqI^P*SC9Fv7f#sX?=Iny8is_6>?bUM?CFmv$`QyS;U7pDiwBOn zA@E1}6Xd!MddCqH!Vw(m=O4WhV@e5!vJ{5~jf)GNf@dBH5da0pKOxfO#VCQ00>hB} z%@H{^{Bx$_9n9ed^%4vu67mS)KkI?Ay5ob@5%c~;F@Pi8+!KifLJ$rT6w<=&I1*Fj zBY39Zc@KPbrw~26419S)DYGmOzD1kKyJ5FPG=mXC<3jO}Bi0E0+ZiIak&(1V!oNKw zAJj%v5PmAj^C2;h4a-e2N`s5&iHgfj8Cd@WBJ@AD2R++^*f|nPH{kp96T6?{rFtSd z_|t~%6Cwza4EzvF2osSRV^22Vkxx^$yAxs0Q#2(KIm_UY1wVB>!Eh`^M1iAbPLS60 zEPg#W%uQt|9Vh+x=05Z2+#%~kCJ;vm)kk!cK*)b`gkenFJ%iV|&1At!VlWRhlE{+H z&x9e2Lvwc*uS4J_NF}EXNA5{~;0IBgXOr0bKl^>sM~O!E&vxrcRTs>e5CCD`!h}-> z4L{{jxYqNGP{`mI3F*|&pF54?jgN%s&CcFT7W@0@J95GJMp)^2sKisjiGKq3G{J8v&1^FYWiqttZ^4^g?yy0wfkJ_vL0Tw7#(->|KFIYhCeN!g zZ_U9k*#P;>E_&+Gv6U&VS|Je+s-De57?InXNaIjwa9)sd3M=~;gv1aoBbfh}A)IEZ z=rF!iXahdMF81i}CwF(apMsH+X=$h}sRWdHpn_z6!e}aa#7L0ufP7INVTM>dyu5k- zr9*`IU&LSWg=7wa0e@h)nS555WUUmnTy=`>#D0@M#2HRYpod;LYuLpuKk(g+2j z-6kA9727gZ6b5A0Pa+71Rc6L!z3VOsk$1F@EBpvb`7o2RDp2(_UHsaeW66Z5gH`xJ z-8$$XQ=6kE7R!}(GSP}Sps_BMq6H4~sj3MjtS-Kc+R#}Y91$I0#aK|m+*k35%OQ-| zL5seYU9y&!vl_extJ__B3Kc9>-7LZfRi!=GX3kXM`+HV#DXYazYut2MKTL(R6_+{qBc{Kv{4(?(-^hUIkOxU_fPG(}80<10>9TyVI_)jsCz%NXg!Kw#)XV zmG%X~jo>IYD^_F95U@@8F|i|zq$fhSC*BtG$w+9XfS=tmy(L z_IfFK`Lf{nZ+8bN>5ZZdT;Fv^1r1CU4k)1YsWW7C9&`+VI@OKPQX!pr4zLa8$XaDN z)EBLMK~4}TKGL+Wi?0wOfqB20x|b?*d*7vB_bjZMdlex{LGbgWyR)w#ZBnRk;>3^v#>zxJM?RME*V?wW{$YXF!N-`4ku60<=@E$m@Lo+z zOu$HtZNnF*3G{)98C180zX&lLXnk0N2|=yuNaeB|Svnlmf>)!qkm0Iz81^KHJ_*cw zcd)55NMPObjbzy5^^3W2+p4Y==%v4$Z{RU{5(5?<^Qy19%P9JjhBvB1fUt);F^Jj*TOCuVRzo( z1>XL7e2K-!;Kiq+#pkO9`^%ZP`V29Vk#=Xljl5aJf3rx%OQ^|9=(|fpS4$(oNeM+Q z%l@C8S`ZQ?M*BHBNrFbHKmo&DpEpDb9Gn+FaB$#HA~dIs5rw&V)mPU&wo(s#?twZ- zKTIu@iY(L@eSsyI6ElI6Ap17{x+10W&Afj}vU>?T+0Bb#$&jz5!+BOybhSuUnsv99 zf2Y;nzt`BsOa9-gIoa9?vb*5+NcZJTHOHvBFd7+I*XcCqm84Q?B+e+gPL(OYDGnj{ z3Pcl}*>Zr&c?BDh3@6}T88jHy7!)kkx6)^{nDTF9Z~KdD(aPr2vL_>Q?qGevAW}YC zY^-r}+5Bb&*;b{=mRoISZShw9yUHB7VpY*4EwXL4&IYzX%R4NRzhSh=H?V*3$ zBW(Tjx0}euJHeAKxM?13EyyvHXl)#5DdzBciB*4sktN0uN)6VZwi0$OBjceVKErZh zTpW9vPbo)iah&STrtcutSEKsH^Xh%mF9Kiw%|*eZP6>gW{tWKF?(V-`dqBtzR_3=v z(3kWdw*pwU%PBj;>am?U+DHHG^@$#0n;zna9ui`}kOsr3neUL3w;PDeue~D3a!jxH zHI@@?^!)YNI$ibs_Z`dKjhzICU@BdasW3!C8JcUM|Nl%dP3y-#bM}# zS8m!3t>&kb#4$jqO69nt~ak?mtzlfvJ;MVQ*8v@2@~YlI9Bm} zAcO_W{usJmLrLDQeuWJx`|Olf9YYS!<#=31eo+y6Y$MWWz+Pnh<~ps9V`gd=K)O1I zd>O!cGOc7UoN&@pa_KyDxj9f9pEOb$vYej#Irsp1{(7hXU?*h+X+kVkVY>QC0EI)~ zOxoWgx@0{#IE&Zd6FhRT=FM4+ToR6$11sU?m0V9p{KW7BNT6}3$qBCMuOX9qCbjAW z*RM24$4lKlA7*_e#qXq{ZG|DfKkQE?E}U-#{*>#Td%-yQCw9q9aEr3NWLf-RIQ)QE zdP#X3oX&sBDfDP5G1@CJ>J{@mlOS`X8H2s#B79b8<7X^v@@&)0?BgvyRQ*DvPy-7{i%H2P$k2 zTFnO?O#>&h54EMw^@|VgNU%B*Sae(rpG<^**RzFh_0| zg{eP@UmrN@FF;rQuWuJ^V$Yf;Yt`aCOi2%rQt0!CwJQuPlW*upE0YJ3T#@ih+C4R? z)Y9*1xJb1pEv2HRln3mWJS1V$FkqA5)xRDoWKg}gzJ1a-R)pi!sJZI78&xS{_h}ng z(mIOD!H){1G{hZS&J{*N_dgtmUnUcd!!O&CjKpFQ@3>f^vi(ZcV(~eJ?q%}IfL(h{ zxq^D)vWl1M=%h@E04}=R|1ROceXQB6E+p1`)N<0DR3eI&t?L`%iq%vB?WYQn&3l`< zG9I^+oy}i%OXV_tC)?j9&l#d7DHm4y(wsK@tQTu`Z6BeTCDlG8$Gh9z^E)!oH+s{Z zCyzZgexXgN&w@A&l2z*#+M-S9^zi5EVEH^2+*oDl7UcS@k$~Uli{sWGG6&Uu@iu*E+PIMbg;kg_*Q*`(=v!$lYlY;t@v@#FFT{?OodG0jm1hCR+fTFSQ|MT-6u4s z)I1mi2UGjrKwc$jT%Tov6aRxpD;FVmrUwtPQ%9@pzGqN)bS<-p2k%;hwbj&yDT!tE z?px#sar$(xdj-bgS0;(_3Y=O5Z2u)}NbJy8m}vGPX$xf{j2U?v7G7#M3BK*Buk*BM zwC>eZC8(5~j;zHO zUAXTHsN#%zs`V$uS_+cC@H&>#!qVXQr8lDzmbGSIFZvL9bnZIjkP1ik+v-6&??0{tV3#zM|ylK6^MNsEJ=xo#{G;<{*B zo%T=A9LY3pT)!(9TQw2GOP>W>K7<1;j$okPGJ^T`i`K_Bsm>p%rx*+RKazD^9(45i z@$#)R^}1d?a{|^#%?kMWU%ZxPA4R;|BOfaStCDMISTGLVch8f4+bcO1p}{>3QVGJw zr)|^Y6&|SmZ05(D6%MB;F?-|D+Rrwn> zC+)w41|c|TXvJq0mDRhHmkjYMrH|zK_cK~+6kcy054?h35!}6Di?Ctd`AZbBNrr>1 z%!#U2Ixc9brLdz+uHs_o{!Jw_L@w`!J;y*1hIS^AoDPf(Wq*tE&Z}Z@VX2#o@nD~^ z{dD{^LsZ1~1Wzc7$|SRF8r!qZueTb;7%L2K0dEI8U9QF!QMUJaivWH(99jRDlg?3` zzxeBM^CzR<`?!P1MbLNZNmkP4MB;LEgn1Y~%K`ETyZY&x(qPzGni6f(d&#mLur~df zHbs04o@{^wI|(cPKt~q?Xgba0x1{OsCj9LBo)(yhi*hW35m9Wm36~NOEIu`-80Ue5 zR0d=W8E<{)%OL_wD#Y@LK39hACN;7B6@BQ@9>@4ZGuMJg9XH5U)@(>E51Z1KGxo2P zbwM&cgT6UjA|Dy*&~kFa3Z^@375^@j4F#Lhx%{X1ty~=pc0%CAh}K%oXlwa3U9vTp z#>Kw*E0!}m0nG>!>|Gb9^mlAclvOPD_f&C72&f06Mh7Dit$hfYur$`yuf_pttYcg` z9aU$x@_!lxcvF)W;B4hG|7xUGO(M*DpTKPss$|tU)An&P%`q^HAS@*QRH|77us|(*mvNIo2m8cCo3b%KLI*VA$-6Mk_9}v3nipSYpquGLu(UBMt zXL&!yCZFt_3MHeFZq*UB&lbs534Gp*#)#)kDB@05{+dlDKQR_7bEP>OwZYNkC5nmF7!JN3BWvl;5iD?c zR(`hlkjFEz7)>2>Qo8`V*8pPBZB6K;BO9STK=J9*`a?M~iF+@deoE|!>(sDG-ks|M zj&K`bJchdkjbVITN@LLJpOEi-WTI_SGAa*_01;@xXLa3Yw>KQCS8d@!Y&(yUUmW!( zpXdEn2`qjHop5CeuKTaH=<3gnu+|byI3cpu()C(_l;d07YUL%1u1)GT-V5t9hS?B+ z;GBPE^||Mi2oWeRNY4hE^C90$%Kd9XC(W9veg#*P;^qz-Ozo(>@!;ia6MoKn{#ILJ z(_>?DW}r7BZv3Sa+Ju&(oc?TxM(1+V5>FO|Yo4@yu0lwZ1B%5J?x!?Jze$8l%1OnR z83$~=BR;jV3a4lngV9@%5G*4v0p%}O3h^_hR&iV${bH-k%Bz_!ZVlY-&s9@T4_^%Q zX8mQf%3=i>hR$0>Pz;>+^9eNnnz69J*;dB>CjWPiaGIxVW0NSCp<4+eN&ufRbD;4Ebq4kixn49@AC(f7ydx{ zrPZ0^DY<|5Ke|Q!#%kJ=vicpe-dvu(`x;1Rpd|D!*ooHwLzEVVANt|a^k}Ro-w>Mw!AcBq-r1qU8 zj}Sj)JA*BpuU}9Qza>jmD9qBL_H!FtP`&6$c>%~;I06ELKugLdBGYQ#*g`0RF4Cno zo`zWqqj?l@%`whRI?7`_uI&ZKpY_p9S<;-efSypc-@FBXLPShi7E&o0eL3*xH5}eX zi*s8hTSk_8Mtdg(QXYv8M`n29W>VYXCTC_y$rHt5riINS$Hz|d%^2Ixs2 zo)`=6pVUs`8PDfe^(q~Ur#}kiKZj&olRn;uyj+HW;ge0sgb261rhl)J$8AueTh#(#W+3mVB*3VZ$V~ zW@$0Qf!WJm9fz$E7@@wnI5PKB{CKO&WI_kF4 zLVqh*z$$LSmi*Khs^C$a5SdX|SN!5USK~cHI`z@yrO_%FBGxcfKOw)kqL@vcr}I7S znX-@RJHAK~AN6be*eysZ? zGIAJ|!7!`MdN#9%L?M)U!aK6gMMEX}a)w;6x$-&AREXx)kf{TGIIvd*hAqouTtW*T zj;9BfM*{BPn^OGdSoSMi^ULg+m1L>|^=Yu`x%OPuoGRw3s^F38w6rWX+wx3*OQLg4 zY2rktp=6(V1ouJ8#-ZeGc;T=;n$ux8_kpS>4i6-JHflpa>>&J?y9|0y)jw^eqhFN` zgc9wu^DxQyt2@gPn~}{M@EUn=8dF~dCEzqbj3tQ@67Cqf$_v)8Q-2S~&{vnB?_9L1 zU(^MXwGwA3HLg^JqsN3pB)NkoMPvkw+Gj9kGulL$+TcHQKI2DGmX}L%aTGM2NkueD zM9|yNCy*fDd~d?{?{iIT{|YlMO4W=0Ej~U{Gjn@B@?2A63Z7jCj-@(6f>5taHO;^xHnSl~UB}CUgS=XUh7gVkL z$8p^3C52Bj5}`Nz&0OXEcBB|AyxLM^cM&@QrL=tXH;&~n+&FRK3 zpppqirO;wcjJm{rrbu=f1h#p2#1L`$*{mR9bQHYEx1F&x16E_a!B0D@&=$j$arm{1 z9sQK+4U-ADG&E`JojC z)_b`GbCh^tZGSqaHegOdn-JdxL&5=H3CL92xP7^MQHgD8q*K zVP<6)3o1-^gm|wOLac9j&l**zv$Hd-LA%)L?Str8y?NtmQ*>BlEK3Njnl1WEf_ah3 zaR|I+l$$KoOBHPzXxr2o-PC~X20G4Cpl z+Y82O_SkN!lR??TxNgz5Hi5PC`6^Vre#B;o`DTuwAD)h@pzsP~-qB;uN{qL|-o#^E zYc)|WgDsyJ{%$)Q6|}F$^S+08KOHm?CoMr-!v3uxd}B_HY(?!;=j3 z{0Y44$&syYojSdh=#n@Zoy|-Zi}gnZFQQc+U)F2Kh7&xE6MwNriOo^!a6G>9ZIVs~ z4r7k*Oc~tMGDMj0XJm5mafA9J;LCgQ|^t^aEwD7s&hVHl1G=e zIIOL4r$f=&Ir0maSLju-ZVo&;+zkF=nQsJn+;K(8v3%$JI*#Q%NA+MzqT?(*%?YJH zlT+KB&1{HBPsN#N##cHNr2uQE?ID*Pc0%K>jdXTpXq?c&z>w1+hO5by?GLdVeBj@C zgV~Tc&!uOn~xK3w}Jo z8DS~fi>l;o%;AU#zU$tObB5zL__kw;2t!h9ABb_gLw?((%duDBq=rA5Nq=+b>W-u) zbfkJSV11+BdT_d6hrW1wyLT(xWrYd0>t6V&8NST(>t+_Ciw0}?-I569fYlhbMSCXh zeOW_j7wt&rm-iJvX)xGHoAfBWl%T>5lxxRep)S%IH5fHdIx|l?IV;B#7o5B6eMDE4 zPn{=P zZdvw!Yn^$kE#BvZzSlr<=6t-LH1^U~^U*PT;B$N6Xg+;!!|+Vx{kQN=ud#&bDS6><$Udyw_c~cT z5x9F=NM2YrKAwI)UgCa6V$o#It+E6}>{;6_)X>Jcw zMewQ{l4umi4~AJ81LO_qtswQps4_Cml|RxNzrFcRawM-Y%e*S088!xJI`EhL8gp>f zSrjxKk$&9u>7)>eKSe8=;XW->3>?Ka-^Z2u^Bg_0r*6Cd3~a^>Xn{T@s}Zj|6MGD5 zH@yxOQ@}~=HT#v;tqfFC%zMx*9?qaT#f#yGKm&e%CmC|{h1KczvYE&n$3dJOvG)2+ zE(T*z)$fuiYI*PFO~o-jcLbSyo*hotm{d|z{gwm`T-twHA_z(LTWfQ3J>C1k)K7ka zQvdcy^kiE|9_!cr0|%54QaTxOLZt&$CrOo%vK12gxW}>XDGuVUc2(?Qbc^qH6G&ti1_!KWT z-oKZZpq9HCwYonlmhi4dW>4qK_=r3 z{G)j|7LAbDgoKF0j_z~5$e_Ol-Ebh4qm@(6VE9xY+)-`OcW*Qt;^IW=;xX=qAWnEd%6fk`xviL8 z;``)%Hp9uPhT*Mf1w3Ho#^;vq_q!m7Vf9r$8%gE9hzxu?wKoshn)>-#2YSY!G!cMD`9sSzy=gXrj8i?#5)5}#SlKSc&^=>nGV zyVX4=@t}$5?}_i+4^1fq+fI=1S33oYEd{>FmC8!5*_DPWF!x%ARLI<0%h#dEmpNe@ zP9H=X?9m!!o75i_BJ)mgK|-OtugC2Kd~(Ye{($FV)$4z%J}8+whRwGPY1F})Ui z)=Ic~BtYfd_wjJipYUxNDojNY;7a{M}@|AQ%?c$Go*hv)fzTpBS*GbpXi z7&^#Q`n|$)mnYpJz#BO9y+`3__sF|hH=U)%Kkj|yfoLB3Q=$#y>NXn2XE6G&hjJsL zM`baT5k*M4qdj6eP>F8O`-!Zknq>OY=3#sm)eZYQCk&&va0p_Y#8dqZ=J-QOEC83*0YN@UXC!fYuA4AhW)D>MS z{wk_>O>q=Xz7=r^W&>Gql&s9DzRqI4>agM0f|%Afr<=ag`yg4#k4(Rp;%mED+o#2o zv472fNcCP>?ziQkXfTmSSPehfw!qje9PnA+FD!~iN%`s$uw_Qlf>Q6hk-^0HbyFVoUF+O>5!}c(_7hRgYBeV#C8?J=dYNB!n8B*$g|N{y!{Q-f9-2Jcu)~_XFs_Rh zu<)d>p_)B!4t7XRB4l+1o?l*fuak({S5C>}aM42FMN$5ypw!lb6OSnOknAyrt#9ku zyqkz(@TQ_QV^nxkzZc^kpnd0}FH&*Wk~#B2i}jIdhC1|XCY=H`ZjCwzy`^dbg@`i2 zvtOC4$}u$gXU6LO+@k<;y+TOq-HN8?CW5!j@+XUiFp@i@7%0_}SBx+m_JzIx2Rbv; zpMu6dG1Wkm8F+kM)NULW2JjMQ+obWgtNfToI)#{mX0qw>X& z`}R@=SYmqax@jg4uGkt8MyX%0iZoo_ymXxQ7`(I`zn&l}YIUSkhhSn5Xm*w*)_JR{F1;^ zlKepCr!_&lQZsT?xrbagD$!S6r&w+C8azUdP5wFkK8aR8h+$15jknbHfx&RaQ6cQv z&fgVEXPWh$c|Agkr`*?vQOZj`1Kohp_G~51$a0MDX0*IAf2o%AvS!2UoR*1beu7{r ztyQ0IA$0`Zf&3q1y|gV~VkhfSudE_N={N2A=R~ujfdjz`%O&?@JS*7cS{bky9+m-Q zjhn=SgX-z0aq?xME*>|$Oy~&2?A@jQZ2itLS9kA1$c@1&^RA*}OyiyNrIAyuNzX!O zKYX>52^o$lY2Z3W*y{e{Os(w7yk`f`6r=iS1l&`MI%AlXn<7-&jNF~Gb4_U6N!Xu# zo$O(_nRMn5ac6HiW`0BfL{t?TX#Q>qVMvkDT~>Uim}HZuLt26ePyYC`c*chj0*+Cr zZmQB`8rDn&@Ia3_o`TAm_4>T zmU;90<#3oeWo4KUM=i3N_CRu8M5a6TFI-KW6*!G&BwBw;VOBZY{0DXwUY@XIG47YR z-j%B8J&VEyl6OgkG}34GeXAkot&erMV1)F|XgvP>RE>IxIrHq?N^kZ@5xutbH;rGzm5rR?*MSOeFxq<;C9VD~i5NcPWC3ZexaV(mx-H$qP_`TQ zOySktoOc;UqRPWhGV*M=kL8JMKLgsS`@RhMrR2Np%Khr!&wk<`f!nik#wq%GM`Z6` zlGEYEJ+O09lQTZab{D@*+i|&;NUr|F(tL$`@Aq5J;N3NM%1_};or|;=-a6{=)!E2$ar?JbSa+#wq*ag)$C_) zDGV1`_500#hx<^SGGmp(j(25*oZ?1 z?IC68d?cyMW$#i-htGH4eW%=uKR_-pM}f6K#VAKbv=|cIMJF%9zM;hAf?D8Qm}3Z8 zlq*o-=~BT99iXC?zsIH`z(2$f+`*Hwz%?~pk=(+GvA`@TCpIi6O0XcYw7_>fBq%W_ zSSu%3IQ*J!L409BbW=|8NJTkTPKiNH#cV=KPE9^jPR9P73{{Ep-eOO(f_CVTMz?~_ z^gA(r1wC~IwJ$YIC^aL!rH{&Y`ZseXODg)B3g)KoOr8~tftHM4ENODgS=K7x`bh8p zQ886eu{>6=4NmY0G@Cu8`~x2iS6>B(EDfhB4G(@Lix>^F5DlNJ z6|Z6?zb1`V- z`ZF!tMU}>Vl@c}`E8?*_U$y4$(%V}?=?SH3taED2Lv8JA zYV7Z699-$`B1j$UYn+=-L^^AL*EDKhPMmM(U8JgA`siJ|DqZjCJs#=F9c|s2tL-rC zJop&g_vpRp!T9V9UP53W;!`(Sus1WM&(}krPzK=Tp1&(tS(m}TRXX;8|q zf+08t9N5MX;#(8&g(0*F9J&DZ-UEL+VF=T|u7)i6agF%@<(6|L13d)5^# zFcsgN7Yo^BpVTGZ*OfgoWx`%yU7VNoF_jyhmGWH_&@)%DUnB|Dmw$JtGOe$=u&JhI zuJNre)4ZrLwXY4VuduDJNnr-h*w$y%*O4>V57k$Yn1weDbdDigYFH-$h{SvqxDy1AU%4OzNS ztGi&2dwe0ih!@=vPCX^Iy_UyaC6MkKNMDnaD?6Qa{~pW031nb_Wsr}4Xn~e>05Wp# zG^~1&N`5s$&pL|VV2TL;AG2BnM9|>>$#RyMKV4nQ{emM(_ zvi~nGXMw5pf4`h9sr=95+5c`iTU`UG{vR%98{2`!_y1ry+x6d;v%vlu7|#NW@Bh{1 z?En9h+5hqhfaPou3aNZc*?(Eiworm&(byD%pHQgB5(t?bcc#)UrIcVLJuhsQ59A{l zNVu|Sp4&6_OPH6(USB#} zEMj$Y>yr!Ctc+uGYjsx@1@8}M^N98ljJmuw%Cg}5T`s+=G;95#TSu${6$-sAA0Z{l zeI8C(<%{2I$oi|@HV4AdD9C&Go!9a+hfj9AFIG<$41x+&2P^K!@s%QSN<3)%77qr! zpuD1n&rewisr|0OrcKv}w=Z8x)hPU>w<3eqN*6miR>5EgK63pyK|2F42BPj&AM_zx z;&7eAFO;feGKBeo!Zy*HDl^wQMG>Rtxx^uMfAKQirLV!?gP6bj;U>EC3Rv1?P21CW zx`cFXCg%=5?YUAR8W>sJzelPJNtX(jVqa|8CtW|Raww8* z?Go=9j+p|npKW@n>5LQI&gbcq=3c=b;zn=Igp0O0-`uq**Kk1=NLNO$Q$+==k9BHr z^eIcm-#g~))_rUe%lLFpgOl1|J}2hFI@E%lG|@4~pM#`iDBw0*8=)M%J>3}`-{X5d zryeo#ZI;l{uZ2vu4em2d{ZG#hMxWakj7%XGmZW?2!5J^DQ>TU(w=Ko^=uH#dZ9CL6 zCxP|%#Zv`4Hv_Pta;@c9zH{77qR^m|o@dL4((lNe&i30DmNg7iAXk-(*82W|0{dNoF6B7vC##$Je54f|KKM+gYA%aqAS~U z88*>Qr_bb&ZE@auN$-{4dNC;*cxUa;36a;F!Otp)7+;#jR#IP4M<~m2`{Mc>+ej{E zP1SWf+3$W=%U^>xXP>ztMqf&L0xLG8l+5@ZFGD&#&H~E!>!#O!`fjiU{}QcQl|btl zED85gf0Dmrh846`C)c7_CX5xuVZst_`cD8eK+M0>U9z0FA?2YDFNqrQHdSKop=Okg#?soht2rcwSxe#8BApfHs2RFFG(xD46@2eL0|EL8( z)CBQ_m|Nd%RCv1h#jJL$Q`HIo1HIE6a4N2#V)F#ZLk=bjRbR|e&&C%#_YJXx3v^TJ z2-7e}F%g39sS6BwgTznK?v4F}R|$&;LN-a}iU#Z)^%@1g?4heS_QRuVa7Ql`DY0aX ztezsB2D(WCv2cMA+Zg?bv&}H7fwoIquVA;Nx*RNbottBnq_ZSZS#ppW>S4TQNu8yg zNNa8?Nv~?j$yfR^H8zY6DM4AXhB?qj=3&m#w3Re0@o#BomB zEh2FwE7vzn7LKrS%S^=#lcotx#8P}H>0-PxsJ`+6F(YyLr@aI@x_tr( zV-F=JK?_ose3_pWeZy@|Kq; zyWEmdl|x(8pmP)xEkX0+8Mz+baVv9X} zJ)q>+wpR(d4`x)%OMsd#~Txluw zzAi>6hPj&{9r<^fqcUx76?o1W_t+G>lxKhw<2n@!5w17Jl6Y17Vd5fCLl?3TX*As9 zxJggQRPiWI0fk=d7FNpu<7d8R{4fOfILYC}8ZvjRLK_G6|5{g$PHn-w64-`SW69*^ zP9tmE3*v~a2L2wFQ%c0u`S&*=p0bSb=u)I1xp{=MEuC)|(GSwrfV~@XelGl4PJhzL z-0R~Tp`7JYnzM#bvCEnvnCCagwQa%_s=w?kI5bBUz2Q0}W!o5PL8fv(fLxBA&A1gc zv$jsZH0xYD3Eg}SyD@;XwKyl&Y{6bu*ZX4~JA-pYR63T_gkCOcYe;Q*(oDX$2DMcb z8%t?__{H_L);CpaUsE41dMwSRIQNp!=V-{JDPncLiQQ@T!uqjy9t^Fko$SX<`rz_= z_0Y6x=0HydwJpT!f{Hbudg;5mRPwdPV#`+S7&(Kn|9v2JQ(op~5}D!CwRpL4`$Bc9 zd)pshoE*^|@qXnTnjM6UVgyhx)N+>AU2y5S(a zVrPl;#1SF7PHQadY31#rFaLS6pH_2nAN%b2q`IRSOl-OiTupxl>BFzaa(6r2hGcd& zg0!s56w957^CntVpL*1Pi+r8z0_e1Xemv+ZF3JifAEY$>MKJnZ$&8n^cW3@%fyz8| zcgG-`m#BK%DD%EJMr)E>G|05lY<7GYHN=t5a%vWB0_EvMnVj}W= zTAwreci-QKCv2hvj)_uB1rq=mfYAhLTy}ox)?0P9Sn=dm)^{NDrYLC=TD*sOP6QYJ zwout+ch4qjtz>u?Vu7w=Z03V`w`)7Cv2s7M3(nVDz|WbLWOzMUxz|)G^bUchK2d(FX~rk!=xv$qf8tU zW%!qeZK3sh5p0gm9*3e8pIgzQuW-h(RBCRHRW=h=hC}C3r*Egj8mY_Qa0N zvwXf+cQGh+P=#C_*N_$jOmOFLL8y>r$bbHke6#d6NyuohI8wH>iSVc;ume8h=UH0U zhTaEpr}KK7lSaf?bH4aW%I1pD|JIQRNsoVMbijozWQRrohINfse40j1458X zH)k-(mUKyb(}b5^IfLX^gBB@%q$a4Dw8d_X!(VYDafVB7GV~cZMevuUzwOK zI(ooolY^$FTMCzU|H_(k%AV$-pGlc~pIL?*MU3OwX2n@G(C3?@>5#lBs6sk|iW-5! z$!K3Vq1eYf+o@)h$e#-NFVrMqH#v-1HmSs=7T=kvAUQqw`K5wdt7Dd+lxbam(Kz7tq5C+DAo{RP*03Vx zjE;9%!YZ#_|JbiC*KkJ2q zeBR`=I|-qhXjfUgNG`c`8JUD6yHa+fv}xj*3G0U27^T$&vuD?Bs_AK;ih5Fua_shu zB>8n(WV0g`tc{pkYiWj3Dsr3^dpxVK`=*a%)ldqHuM7&7Vt27E3U(q}A$_}`)zXg@ z3O^d^sf9Y60_K9Eh?SQKTib!8n#w(LX|;oSfPedxZV9L|wy@1)n(_&ae5$AI2D$M> zcc+?y*eF@D2)dqISmlM0S+|QU%C;@HY1v7he`&Zm$((n%tS~pdWfFQMs){P-t-VON z+WTDY|M(%on7ObSr3hGI^7FK~+j?M@x;VA9f(v?^DpmZ6ye-y)Y5QOzm^D;&yL0QG zBU+IXI%|!E7f(1m_e-HON?HbKx}2wiZbX6pv8Sz?zpI6PaT>XU=$@S`XrK_0O%z=i zyq!E5waS{i7fOHTDIsK1j-Mr2D{F)V#;R*eQwxha61={LskWfd!#&J}KK#5!0c6a& zf{X>Nn|7vJ$bLF3KrrUMPJE6mDqbOIyDVFz@at#iJDuPEz70PiX$q*yexoe6AbY5D zQqf0At^;U=Yjw#J*J$!Lxn)|l3uc>EyOvCYzU+*#!MtAVSj5nrNDJ9i+x(Ia|B(lT zaML)Q(>4t?&5_ebQV2i|)MX6R^m~oU0~qSd%|MtiDFUDLJg+}XX|z){<<|D4^R!`-V( z)Q%XcsQIe=Jd0V2Wmm1c)ML)dVFE8O-}GJII&j*B@B}ZA5P`4~Vz3iAJqE{20D!e3yuW>eh^rI-?QBdPaqJyJqEUI+Pz>0qkY{35#d$=)N26Y6Rr>j zp5jk11}4tpBF-|d7OF1V*lBvikKNGj9iP-9)(3F`1c3lQo&#Ml2#qia0s#c-tq>xR z0S1xNLC^s$Isq5p01hAmOuz_uJp~@H08?J&R4@r(?g)vX15+;DdcXo1(B&5p1a<)C zeoY4-5a%zD-%9`p1knXLfZ87}2m^5fYEA=R9_9kk0fY|a9ljK2|K8(3?n>7jG8Sd5 ze}vfGV#+s;_Z|(zME)att>wpjlsxIGw-Uw>& zr7;pgDe%fSk-@SkU;NIt+PT`N9k~j=jlzz-{#^aVGyM-YHzU|v;?f^}&1Ww=v zWIzXI-~_a?1Y0l#um0^qQ3hTx5Ejtq_HG4T&;>tElYvgZlDA}00eIk1|3i2(QXj@{_Rta@vP1eQQ!k4|4;xl5AO2~@iai;u^XZ_ zi>xwz5vjbonMR!km>|CV=_*g^X+G#)kpMxV2FzaVBY^Bekq8FQ`S@9M70O)4dxKFR(5b|qp5O9AGdcf;_Px5Ji2YJu;3vlFR;PywJ0RbTUzfbBVkM9yM z@B-lm1_22O?*+Ku`g>3K1@Q(tu>@03_=Fw<1rg_a|ITgNJV`#>tUsUQUg7Nm0R;&m z0}6lpX;1~$zWV1+@MYlb(ytJU-Vjre|8tM{4FC{8di5&P#flaj0~IbDm}Lcq1PmKy zVFF{p1q2Oh0P)h1Vv`3DGs=*1Mqw0z0~1`}Xi{Mfh$iGHG;_ucn1vkzd~i||%+Dn% zE=p`j)ab>LA8-T-V$@HdKaLh+qFU9{Rjfv}4)nCu>sL)-L5(Gw^(#ZHr_`Qh+t%${ zxN+H9Qb>0z-Ak7k>R>76B@MnAA_!hFWy#^5I3TFhNL1w4p>CaU)S*CS(VUPK9@sk& zMaGd6O9DYUa!KdSKA3*281ltJpp%{SiSvPG|LmX(@e;)R5+wEF>c%C9 zbdswikyNR?hFUlwh06vyuNS`h`;CepGGNF72fWgaH!`)d2&3HsD=jiIs8EbIn&bq~ z06YP!LJd2$;)06Q?g(U}IJp?8IEf1S|G+>P$28NZC!RPDqaVb>3puLf0#Z2~d)$#I zAAiiz$Rdd(b-5^!EM!$yTXof|R9B5PFG*Hq%(EAAuyWT$JLn)wV0$spS2WK&Yd^t| zdel*gE_f-}V3UoAu??sVsXk#{d~7p1rGsvT`)kl-o*A;Zlhfp-lME7_Rf$TYdHZLJdRkALx3jNjtNRT znLLr>GPV~sjKeh3>^AKbEV7{F|5RY**5ZyHv8d*(N zMHhu|F&?v-LAWwKz60M}XWm}u)mIi0H$h9z9mo020lGin`|cNaetYt_XZ!6{MUYV1 z@tYt2{q{i}Pj>5I^%S~)Lseb>Q2OsbuJKUKQ>X);R(f|p1SU{{3ryQt)?k!c_$g+U zO4{Kb7rGx{VGP2-onoN zEG8%d5o)muUhrZU#@odszCaoZphkr*e4kcyK*nBBD2?jDg7miJMrf5uO}G-{079@! zE)^?=jho*3`Ub;$|Lu&CM=9Sn@s+QrL_(7|>W=<;$Vqgjvn*X>C+aNuiBF9VIS->J zJtY^TR330_RtyplIH-$R#Bvw4_`)qgKrV3!AqYiVn)|xRNN>7DOqv6YZ5roLziFv^ zKL94;2Ki8khP0b+;o~rylq4p#rE2yQWlK5v7AAg@fL*)a=v0_1oYrkGf8;5>ILb$$ zK2n1-Bq|$<%7!+86J6QC9orc8&E>R!JhK4~90|Yxiym@scNA9PKf~$cn1jybWa=uLwm08c0pYag1-JBc8-oC)S^2jCz2R3N#_Wo~jmY60l>M!DVNCR=ex z6hs|SNPXq5|Ge8tD0Om)mNMAB)W!0|S7pLg3VrQ+U;N_NDDRah z9Fsal+fh~`hG57e1fV<-(69(x&_QP_*j4sz#TA6;65t529cc-7wM2PMSBvXgx30Bs zW_44Dr!~==<`ghEEh}Upt6~_(SO$k3St4V$Fml4KMs9KGUc2kpO5O!6vie!A?wVJ@ z>Nq)v|2t%c6~{bk!izyBGn4wLlue|uNz3pJ=ChaHU=o!~6lFx%d)vl1_-Tm$gMRg!Ui-cXyYnCILuBJbJ=}Av*lvM|u)ux(C z{~E_Ek|%rE*0pA6!W&2C%k()*5`Q+uCx9m4D)Zte6XC?RGQ$N|?~My70kIiSRx|}+ z5|hY*U@nSgWGMgx5|tDaq^+xsq!a9T&Xx{F!+BDu|B5%hqwf<8GM zw=nD?e1Ql=@bw}V5iUDZN^?v=G!bGhF$KeWRD8pAH5lAOv}G(*?}g)oF!7%)L-I`*L#by2u(>$VTGKoU#3 z8C!{-VG3z;3?MiG0N9B&=(%HKJ6YR7^s7MdVKHx0j~$q<@39T}o4?@MKqef)7@-_+ zc{C}!sl-b>4QM>b-~j9*GF6K`FLa{(IY6zeqR>eonwdb0njYxMD(^_M{|r-}DS!eK zf&w~}!{UL9TYv>vcpyM(E5hT!rOPTd?2TfAvUDLg#u7IZ`@{76xwUHvoDdfJ=qflf zp_K!gC3M1GK!l*F9H0?|PgDdUgFBMRLa8GN&8j_7LqIX?Hys<5FS{Kn`ns0kFVA_l z2^<_X%n2?Cpn;$Tu4siJ@jGHHMxyAz$|(XiJMwwf?@L@B(k;G;i6AfAv@^i!< z^ua4^L=dC0UZ4YUAp<8^uDSW0P6Wlt2^s@pN2izsI?%r={EubXGv&*=@9;5wq&@BW zw0|QnSM-@ET9NwFFkH+G+gL_<`#pusl5tT3K3D@wlSoEuLQvd9|46F?8oIO_o4L4h z#%wGfMH;J}YA!=suRwG|@av4u3tNPj*5VTOxV!ZLjznVwMu^9G z6Gw=ILO7Z;iF6;cTP^FlBk_r=v_ho8^O8fPIBH}o)xyS{s6;f{Lb;jAP~@mOm;^Sm z9K@?a2&9r{{L9x_q9n^VRFfK9>$*&mDEG?D4#TJ3p(n=Uz5XK%HCOX;kh%N466gevGYHLEx3T%&3&7a65CpcT$tbu}K_M|bVf z{gI1A6xmXp*LmGgX*oZjgE^NoQmX}6A9NIe9oWx{fdoaxgoRCud{{_Rv@&fboj^D- zc!d}EP<%<#1u!e6h(p6zurHBU8gkGyq^Pv|O_*fHza`iVMb0DL3)%!fK9!IcAOt#! z15OwSMc|`L5QB}oNuh}fCxx821mAF-v09?(>|2KU&l_l5|K#W&40|g~p<;6`R1OXbfgZ2VW zYN-OYg+z0cjq6>gr1QvI+t;*Pj$G|f)fx^Kz0GfR1RD4NjXa@0n9%5R-%aex8}Nz- z15Ze?R-e&X9c>QOHA>ZG*ZeU>%_y$?$}bDxGg3v;A-uID_1#51wlexx2i{#=t>7PY zjP5Dkln6gAO$1UA0vS0oNDUu1lY*^KD83l3>wCMJnOYzeT(n{gv^Cc>3BIag8_KQL zkbT)hxY?1bNkZjZ%i&xaHInS=*3#|Yy{eyf{hy+hy=C&=9Zb$WLN`(C6Br@AWFd6)PNCx5OhCEzuW@ z>?}Lrf*i!o5Rgtx^opm5(HX76+KgQY%*5GI;^{c2|Mf2N{E-!K7Z=f%`TI51vi3#QVHMIGFS=WUl zjLo52dF3z;X5n?@zU4|rhEXgKfWTNBhX+@6=Z@ty-;(76|*per@G>*5YkzBTN;F9yjmhGPN+ zOR=o%f<6nnA%pad-kbTeRHli6Xy}OKg9ZKCZJk-HE=c^$>EevxkG#Qc<6CUwXvBp_ zru~2mi)IiGOb&wz|LY`Tay8e1OsR98X>~G^WcIU*hT+}>u9zv=i56;AhHm8+YcNL1 zZ>9)_$O6^yQr6o8T^V4pt`mYD?Pn1T3evm}dSvz*84M*@ZQE)1P88?$wnK}zA)CV< z4oX1XT(7W0DqLj3R-Tf<>2874t9jSHPUpTtZh4t+9fIXImD>2mnip8&_4w_9#1&FG=dMJ{J$%~|aA zl4AmeT&4c-|K;T{^*fgE^(j~#Z9Z_x8bsy_%yON|z7kVzZDc0Mp5QP}zE|$c$>?aG z#X+k^*=+^lPW;vz7Qb?RumU%5wI*HI8=%Q_Mb>O zA>2L#nlbG})GlInw#d=~00G|e@vQUTe-yPSKT5P9iZn=roq87%h`8PD&|UU&Q@7_^ zeoujp4}uQyq+V!|TjOIz_W;n`fj|O^Fo+muJo57_d`F5nHP+;|j6V}=Ehm{U_L5xM z@f#@2|4u~WS6N4!91cSj8i^;t>|k0+jy(fJC$5`vDhF+F-|pA60hJHsav%6^RQDNo zY!z%7qv(i@S#?Nw!g=#jdi{!L$5>=i1KF$rIiIt*f?kfo70@|^K732P)C}ed^QiX{ zh#z8#e`}|TqC*ho<@lwu3`;I#Vji2o%bdV2$W0#4WGshTQD;b#{aqT~XPedvFK7a` zVRfg-ag>wS*s|*P1_fGRw#jBUjdI)B&Vbxf2&?X_w&I?hNMG_RSQ!S%gV%Fzta>xI z6pODXi*M2Lg{JPH$V8JB^jfKrpJ}}Mikq+r)-Q~#0?pyu@qXJ$l)aQC=- z|C}$|L74UVz4FUz7R%91o9pHGJj2eOxbMN?{^rZPqAYlppA z_+{y(P+G62H1!H1n38FCCE6g-bh`Hm_kVx*&$aO$->0+u+t2V|=SoCob$JJfUIGUS zgg}s>hlCXt4#eOP!NUt<=%4^X#md26Og6gE2qD3Nh#5xq>QGWbLkA8@7HCNjO2Gy) z0}RO65CBe`HwW;PF!Sfah&nYgxnUH?jXj5!DpF)~64R(Q2RgFDh3degE^_4XiE=8~ zAW!N%#iWTKC{PDab@Jp%AltTWGrCP{_b%SNq4b6V>({TTzZuV*5p2`PhQtVC|9VYm z__2kP8a`5DH=)9S8=9n~P;#iX9w3#k$R1;*B$aU*MuVvH5C{PF269jf= zZJ2S*iv<@RJP>2YgGC>=cN}EF7$VTnBd2G`Ip75su{5@uI7nb>&(ST%lMiqHJP8uX zWw4iFXX(ILcrwMp3byH_!+QuK&HXqd1+5Jf2Y#1mav*{U%C+Evfc5pCeGZy3VPI;} zwbxz{4z?PHgn9TOh#n%A7zPL_q}gX0f_EZ{mqo^+NG3YAVrSm%rho#sIf0r$X51za zBS12tVn#jm;M_|=2m}LIGGuj{Up-+EoNzJ8s1lYARG|oMVkn6ajsOBB{~noTT1RFG zS^2PLQj0WVlNvxqMF^d93IbCvP6@aiR~n{SkYHxjr67ZG6*_2MYhifTg^N1M7g~(M zm1u@;5M=44Q*{_(h(LHpq@S4y*zAgDdL2B@U2ef#I`H)Q|E_RZY)q>e7SU`z+W=<)oSCm$L z069=5bEqrICQ#XlA5%S?s}U4yI3nu}U>XL(2OKyF*d;a*I`CYP7OLo@b`6vk!W24; z;a?Af+GD1FDKs(0&jodAbfa?oaYUlwcpVTsrq-hqIUKZxcO>LE|L;MAMAF=04W&SX z2it~8F?d(5YS459jkXmKeFDl~l+cB=w3#(ct3h&E+0o+>0*N9D8gqzJt0MItB4?g4 z>i~8yT508z#k`Istgv}dCFrCHK9(@ubwdo6-48#A7KEz}#39dt_kwAUAG*w~vKcE5 zA>ucV+_ATu39iJYN-;u4ZZ#}B6|e_&Kobl%V?L`AYw{PFzSAatG-w@A$C7wAXU^CU zUWz3c0^KUTdru))kb@O1^cTZ^8fiVpVYl}Z2g`Ym#Ra^7_(9bnz_mAgjr;QZ8-axw z_`RS6i|>|(eB}-4;*a?aC*g3SumOPSSNk~qkT+dF{*I5F|8_~huM7tqmJl0c0go^l z83bH*6}GY!-I$)5rm{j9pTRtw9|u}Sqvm5G-3Qq6g94O zL0za2NG8w#GcVDwc4GJdo(|ZEMp*B9Tq)Imps+SS5V1~q3g5xXXTI|>F+=j}+Z&!J z#c%1air~6p{;a6QExt-MC*zL*<>VSYka0Gzfs;}Ov4s`LphU1(0|{0q5Fya4b@sEM z>wFdgjq&7xd?ZOp<|mv%D$PW>yV834^BzR(0S#A>p+M-+EYZsZ+wR`-xTB4#3cqM|6^}}milTyqAc>Vm%jWZPp~M= zVV228yHU>slZlXGb*Y&MJYX5gxFl4LEj@=Zfe4ah0^Gd7j)cUc?x=$%<}B-R|2d=~ zy}3JnC6YZdgUVE(5`=kDQwTL&BvT@}6fvl2f{^hSzbL?hUlAk@2y-PYV=2p7GEt$@ z;@k)xflo1_=O5M)7WrEm6B>@ z06e9c!bm;U3!3nWJ=Bt%vaA&&zv#3#_h}8h#P}{jh;d27JBnWdDpgb(2cK^{&{Qnc zFem;;t5U3`LNNvdk#KB^S`2H_c-p{Np^Qh#|C0h-<65$k)oiD{=~+}u8P4+bYej#_ z4jGEz0}2l9Dn!8}UzheA-nI0pYOqARo}#!NDzFAmRZJk4SxTu2REVi$UiTs)3Gg+F zmUvkhEf=S^MWMDAU_~qLP6XT8+Vz4JMOs@yngueF;UGJjD{z09){N;drr#uF#*oB7 z-^AbtEMUPrU!=40XwbLhD%Sz2r=lHlw+@*z8~nt@S*dQ8pg?+0gtAILfiaY!sC6%G z^8^UlJjSP{>}z~6#=8Tg^@4x#0)TbvPhyb{Dc2HHlLRAzZZ0+}7tq0iS+IZ?`~Xxp zAR!xd!>xY(1T%abkLRFcTy%a^uusj6|Ix}8+S8F+l)K zKtv&okOqFS9)B-TS2fdgRW|B^A2R$e8ck=Ntb^TtwWX03#8}49Ju#qh6=*@5O~ya~ zVqPVfL$Zw)K@lTzknc|j?&WYGh&`O}~gFAXsXcLYE!vG4$vzaTOeP0U}AID*SQaqKRZoij7=p z2O7o0!x(T0yxBO8@+1Mpj&bk?w@G&u$q;fFTs*GzSem=*R{lEJ!_c>|ll|mVQ9=GL zX4FCAxFJ7~4FHV=>YpuOjsU;2iul`eR@wIMsXH2pjjdUM6Fw`rl5@zJ9pY(|(swIU zz2Pf#>!r0|1JC01|&i-6%iND29`pNX_)2$<(SQXp3~0L^>^9){%Pk* zDc|UE+C|MdF^T36G<4=bBqxGY?m`oBB(7;9T=WWi8l^k_vmE!>5c* z8RfR5rm+Pin9ym#1y_eB+*fOZ?W%)4j1c!MiK(iKy8@OH3H^A7%+PFDylf-1y`}ZP z@&#Z3a!P=CodI@T(RhHn1Qr>*oCB_o4p@tG)LpksoU`!C;u!$lMSw~q4Ip_R^(~$d zJb~k!!gYYqge5 zp5C2D(@4+?beRrJfeTIrgxSmwRmA%cK&wGm2+#l=&KnlI-~w5~dwEr$Ovu6j;l=^s zAu6KPO`Z`xB5W0)Bu*j$en<<>)AeQI1&Y@jau}I0&ISUNp5fQe0Zq_&*dZ0i>kOqd?;W2%H9-3jcG?{!2BKjDgw+$h;{a}Us zVAee&G(sXZ3dRAZ1~y(}C2nIjb|ah!QBE;fOdVX%wI2Kh6&Ge81)`!s2p$^l&WD{4 zVv&bB7Sb8g|099XVTEO%MtD%LMb5F|8%R6>!0@19c-yy4N>&}BH0}*oRU<^2TsKan zH&UcUUSv1UAFK5e_0yTSEgqeb zM@#D2{H#u{t)OAJpB|Yc)2JF*&ZGDZ-Aq8n+8Boz#7Xe|08S2@?mR&%9fY1RBU2h; z*7>AEQVLQsq{qG1QWj=+ZNKRiD5=%fb zro7Dr(}|?WU>l#T!E8Li%}E)u{Y4-MA#O&BUp7&FR!Aa>8$u#tQX1tEt`FdB3Pq}q za1O@b7^i{)5EfQo(d@vLDFk#t*WUo1ADJUWj19`XjCsyslWr;GK+0hw8Yvf@X@BMcac1ECVzI7N>s3XvpaEoDd|0;w!Hqkm43el{dRCY17} z{{fROXp=rElt!tPPAQc_>6y_1_Mx7Jwg*XAi%uZ{48KK^Uo@HyVqJYI{|;EC zLMkkx<&~zdU@1ZH)~yDtzzQtN$*RC+;`Nczi}~t*8NslI3UuHWrZNp~@Bo<_K@_m* ze?SnXhUHqxRp~&cj_4V-%1V_iN9jZXtpsb#gsEE%gb{3R6E2EyQQF%eoZBtw!ftORIEIG#4a?h>8>5^x|ytN@c**<1N3-emzlPJwR4&*ph&M}gu) zw3v6AR0w+1jNX~bD#7r|AqJL>%HpM5RsjD9Mh@QRY4KlBnrft}DsAHDSA8zMN^O2^ zZy>DFd=-)VzVGSAul&yM*RHSqwlDtjA}LxY@3vqPhA814n7J)37({_X3~omiaNoYH z$;H*iMw^a&ox@`9$j&L4;>d7pQ@r^Wn9^+$b}-Mxm6Z(vT%unT#A%4(tW7Ku_x_)H zt!lcCuME$y_|h<6B5l&*Fw!a!(+Z5`=_p>_uMp!e5x4IX4KX0-|4{q>lwq{br|GVW zhVbFYtcM&MYFMJ-Rt!hs7Ewi6;Lt9-X|dkz$hFQuP*gA~{*@n;&IU&-516q%665}2 z9QRUg_xfiIhp!Fma1QIR(mpL92lCTS;}1tq*dPK{Fp?r8@gif)A_s}335kwflZN_k z;m|I*UMd!2q1v7Xj9#)CWWvccCnzhSpm`m>Ea#PFqZBAtZ25rLfyzfL=R{hojZJT( zhJ_l4)XBu@8XNB^3PiiG9$A<^Kn2ovq3wvtMaEHN;5<2Aob|r%)rHHMGqkm$s@nZMB~R1DHZ;L1zZYF z5^nMrDGnuaqeKqQ7oqUtc##r*F-A`BIiItJc+o}BbQvh|4u0xhvT8C9bU}L?D+F~= zzwki|GPt!8C-AdUFLXmUwY=`=c0sg5Qvy|2^;0XEfEZLuDev@Za$$@#N+&3Ru3Ph_ zj{*4zHX?iOIV+Xe^_2$HcE2cQHfL=C8 zpL7$0cJ6wJWoxlwn)MS#DHLTA9ONjSFr&TRW^9|5YT0H&_n=-Ab4DaUGu2< z{^*d}=aEJ&4l8ss)^Y#6rW37~xJ3)r7P;z@|M(=p0dM>kbA=caKpGy2-~UJIFO zJvc%KHZ(U%yXLTh^Cf%1>ufF2k258J5+bFMZl)D6l5dwp>!?&aG=QRN#tov2S2?H} zjBHoll?x>_YWYy_<__EVQ5tOz>$sQ?CXgqQj}uw)RdgbEw}CHtn#J_UI-fWDtylY3Ej4dXU0yq6vcou)TW(hY zWnUkp4GY98xB|M1y3aNYlsj`EH#)0d|DI0oHM3j0y(2hj+2+8^4Zi!dxRbB1UmY>y z@m6(sq6;>C9{LU&q1~*-uw(AMNBqRJ(r-sIo?kr1({^Bwy1SS9v72gcOL&)W{3AB} z(Z;*MOT5ZYyg_cAw;Sn;mwVJQV!9hU$w$hTdwCy2`=IBig_rNaqdK{-Jkgss!6;=y zB7C>^w8N)r%s;rf*F0bs`nu0~`5^hrJ2+w&J=gm>q44-JO8abweQl?^YqGvxNsCyl4Du+I1|U{kltip_h8lBmCPh`=8VO zGv7A(Q+n>d1OC&~|8S_Dy-=F{;u|~8_wXS1aof**rcL?M&%C};=?X2{mn3JZbj!A>!&X5N$}FojD$tuJy?Vv_ z_iRqVR0%7!dde!`mQ)ol2GzLm;G2ydOOAM1ti`}{yHcJ?c4RBIW#JBeTe>Dlot|+@ zmF(JX<)%R6f@Uon^6jaIc^}rzvFPr^G>I0pT%2`g<;yd_{B3+_?U*WmihiDv=W5tw z@6K%f+-K74kr`9=bl$Ld@aUOJhkEoUc=^Jc>sISJvNSrp{(i3 z2&E&f#m{Wyb1USEjLgj$AsdcJ+ERKnC;!5V^g24<0+d7#bDNVi0t?-6&AU*I&&0_* zbFn8gkHqv$PTO10$XW@VRaZ?@Wt7wKP)p525bFf>w7)_Wb*nl{1@_NlcQvgxzVf0A z)+cQXZBM-x<<-?PX+@0OAIm*g)?Clk%2H?N`!(3D(wdh{V?Wi8#8|6iR#<1d+x1FR znN*dwe+NAn|2l*vZS>m}Q~YtsaeJFKVu>vlRK8y|W|Limv4S#B3hfm!WPayF7~1fT zEtO)kQjXTzXE~(N-Gp26cP|b7{BmJj&8=$R!g|JVWA0vNF=o56C3vk+=cU)X*`ih! zTVg$~cS=(`>TVQ8_xd+cY#Ro9=AjEz_)?`41Q)p=%d@iGinEG0?W?icSW9H9eVXs5 zPoB;0=|(d;S(8<+>uiys!z{oq+x$*Nji5D{>j9C}dFY2NwG1$Hf1Z`@SSy;8IlKw( zJ5JO;5=lU*??ut(=$4i8Q0`!p$mPew25|AI$$Sx4ZV6w?^ouV9xL3i)t(3u_*)CnV zR~vTI|8U4cjj?)$v!zn;n*p>ozL*dPSnJSQ92-Moo(6ur<4 zv$uIGNnA=7%y(5i=XG(=DbJ2ZGstu9`sZ*zpsQY zFLrX8v4%IS`ALmck7J3`rV=uR?ayS4f>rv^XFeLH$!)c29|j@V!{)JXgF)PqvTk^^ zN+s5CM(p{7&SvPpa-&`%o4g3RR>lBJ&zpsFtiW z_5*xF{5rPgM{%xYt3MpkgGydY(cVOsbmVrb%4!-}F&Z>%O)vD2)wO8|5(vjXDwM&V zvbIZC7oSRs7jT2hSCw) z+@IiXuC#7I6-}QNAfZ$?=XRwCKKlgdY%4*H;VSpBG^f8dv^ma$qd{z8+5)m`%X^k( z*}OinKjc$nLTT&ZZljjLd~OS^_oxs2sAV4=8>Aa_PE^rP*0q14T4|pu`)P}5AOc!< zIzg&0t|pnb639D^S8YmC+|o~C&?aqGt+ObpaLY1RVJ+wV=G5cFLyke4D5u@yi+IJn z@X4>T?4s?(+>80cLcfjp#6945cM&&k+N#&=N>X~6orGwNQJ<7krh?favbp){vZOaC zOrZ{iesXBU&CBI=!w%dh*z+lz90!wEtNnFM~{H+)if8`-gNjhA*;3%8<@+cpMIii zR{W?uQLz0}-8oec*CMXO<8owg?JGCcNt9pRe>Xmf*tW=;yUT3b(N?M_z4jxY!M$G( z`_wSz&1+BcF4H_$-%9Ci?h5vqsG;t{2g$zkeW%_Me{E^nGt)=ZKzTrd@aik8?o^uE zU5CA*3VzPp0Me;vLzh0kRl~JkJ(nFPy%2+_d(ZOA*jW0D6b zE__34|CVV&X2Q|=74hN?nH#kpmTcAgw+n-*lhfqlnz>nm!LKDY2K zBd2EXp%ZVH{k4u(_0+6Ai`J5awTlHVaiyVn&3=-eP_q=$+C1cM}yRlJS#1oE=-`=`9J!}>Tcua0;7ud13FVcV0-qsEpcB5|Z{}i{_ zBRD(lWBiw4*t#z(*RsN6wYRsHzK3eSofXP?`E@gHF`-U6+3VNVda+YAhNPZw5 z@m}6XxgfZpyuUu}_?o;AU3WCJYzJ_*WZHHD$x5>|4Pa7g>yuFrf@fW&oS z+J$YUq7T$#90V#hU@*LT&3v$^cn*v}w;&&O{=8duJ}^1G$EvmDL)n^|F0-1eOk{+! zOzfgM-piNnEVt`40=oik+b5J<;09p1R)yxp#z`4XT>ov!3cdn6i`U>vM7#}cCjwq z)bPZtm}r)_a+iP>rlf0ItiYcyx%H18WB(*|WM_r!`1=b8;KnDzE#x;R92DkzC15N? zL!$&hC6pEIp0%voerJ9LGv*$I%7{-5MwDkKphbg%pWO$_g(lA&!d2GCpI>rR&r`Sx zK_K?@){m^pV0bo+{-vv-P$3~*?24bAD5cIxXIcG$mdjJGWYKhBqmb6U@X;wZ4xm5x znfI$i_j)}+5K2;_Qh0H3M4N0twC4EU&U{-79gb>ia?CiT1x7$ith`o@SA%zLUw{~G zyk&`3ky#8rWWzn0AEjd6&ZV<*K<~VpRo9v!Cr@T9Icvq5U6Vk*tVg6`RfJD+Zk$(B z;=|YuLO~P+>}pKD0omS1>_`TG5NFLXPb(ptC#STl(R?z3f#K({KUFX363uO<^>rSY zT+LQ(BH81TqI(tT#!%78e=tlxRFKHNpWiez+r2}mbBU&S(WFe6)!gjP`Ega(yq^(C zxM3wDx9?3^RZlT;cm>M z`DpbVk4~F%!s64s88z-8RM@s8D@4^0Jyp&hEx!~v1Q#)s)0afQHc)e`3bue?y;Xnr z{&3U+h{RYSeP2Rcvn5GU5r1@{N*ZCQLB|aYWo9D9!kBfDj7wes%G9<>J^vly$V1C& zZ$bT&B5mJ1U3^Au&TH!$>g@afSI_&0==}rqeE$RJku@m6VKNv@G!_j<0b zWAGU5o<^F?B*M}F5m;|cr6O@O>eUK-Rb}!rY~*FB5-q1=Ieg}q0bR{!gL!nyYE-hV zmC6P9DOO*mTC3C}Mco-RH{GdZij*b&W~QD?6{4v_Hi_g{?d4mndsqTwt8V7%#J|}w z^I_EMMX5i=Z%%hK7=yf_t_;Ms0=Xsr#E%BQnUC5oWgImK#L%1>ls zP8(jQacT_XDc0aP;B#Mg$?t_4_NBM0&Swa6Vlm3PpNu-#SJz(&R^Hb1IJWeTynC*H zpXa6L-Dzs`yl`WsC=fCvVOt6cp}Mc*&w2rcJ=~*sfUbshP81 z^fdnP*7VM^*R$0ol&>ANAPFW@q{z1DNz>c_edj;Va>(oR#&JH$8{Y{*7Un7pUP!Z{ zFedksES4O2vo;BHnhiH`Bh?+nGy3g$uA^jg&v)R$1&$($LC)qVmV5KXHUul6oEti9 zG2pQ6_t{DzVy-4BsjH%1$xG&--;U38mBCcY(UsOM zLIQhPm22^AmeU)Xaif>l#C_tWg;44F(N||V>7^-FCBt8;JP3JJ{^M`7m(!D*7i+5N zq~5GNYs=3Mn^{r480#zH2+#`)F2TofuWz!oL3M0fR@EiDZ^lulQVa~aFAK89x$9$9 zDQ+)r;36<87`Grx0LQM@y5e?&IOzks{0{8TY(*u8#7fWH7Kg(`m-_tot;!MdTTfGf zfgw$EM3yKVeR@AhM`ezW9FFU7&tNV6utVrp=_o#KhE?sCxaV9AoQQW_17lx5`!djC z_MOa=LJ~l*vuk zu++5Y!d#PY>l~~t%b$n549wM4ja%?$0e_iL zN7HnKcHv7KSs(*B+k2;iAg|>=$eL^b)NB!c;CTH-D9xQsT zt>8f;pACzLF8cfF@|3@L4hX$D&}v*aFB@^Z&}+X$fTe659IivOd;KHZYSrF#t-{1D z;*mQm!H4Oq8tcC!xHLiG{dK37*7<a8$uT z+a>=#{bq3L1Yt7Sf_HtfI)(j9oAfVuu@J1I8WUK~%L{hD+9~3Zv9TVUi+T5G3Jd%L zt#P?kSO=Huef+@+vfDiAWW*=syUsCOGO-%KH|Ky~l)^@T+~?$5YKpd@*ZKgFaKa)dmg4>k?pzjElJ9p4MK3tZ z9=SG*WZ4mFuXlQ>c+VRL4_)JAnnT&%uBJk)v=Z7#{2BetCUVxLOa53w zKP$^w?lhni8syne3UDR*WorR!Yw13pmOP7Ua<0q?{Z0^{YVI$rV2xoV=Jt-dp}ecA zJ-teSgXp>hr381Pa71kR(QHSYD4WG-EO|>AGNk^(KgcaMYUkPpoC)EyrmJ(SKU39StE))c7>%AVcah87^Qy|Q^s;)Mb z`!ha!y)=GtO6t_=bFduzvrNHL-yS$x;ar!ot_)?>!xU#L=|7>}&XHD4rD>>SjkJ@= z&GHpwNr-gDzb4jm#&Fp1J#FNFDF_wNN8Ll={p9>P;;JO$J$z4QtOmOnM8#E z9=Ez%zl0Q~S4i8oBvQt-a)j%IS-^#xuzLRmrA6Td!McF#g&5LUMshUAx>``>XvP=r zRv!78ze6v|bS88m#k?so`z9s?c4-l?e~0mGz{zYW&_Sy9L9M& z={=pJ-#BkQVYAnf+gd|KQ^63j0XPIC;B%8h^{)JB;9N1=-!0 zO}p^y{kpF<3_L+na#yP?b1d%Kxu(m|Te?QIsDs#Dq$v{H&f&(Ei&GqqXAKCX`Sh%V zuPGg4Z0hDAkup{3;&cU~aj~^~xs4TBxk&s)PNh9)o8Q9SQ`Pyh4h{eEWVCC<)5g63 zZSG1@;7`x;m~e`8x%T(&UG&~c%)Bf9zLWNJEIH?CU;iupBzDl2$&K!M49WS(_uRI; z8ctV10;ePrF23dBhr0FK-)7PVQ`HftJAK7O4pTld+D1>qL+K}*lF~~aCs9iyVlQ4j zr=u^$hIiTx9?7I#kN&7CyPrqSi-<;k%9JaHAX|NR4pec!`5vUx}2(rH$jHy}ODXxHYt&QXK0$ z6qr^mk|f2R)%^+DIq@w5lQ9DcBw0=2Z5D==jWwSx{8U z0=e+f0j@rh)(0V$FEIbIWz-8puJhyydKN+Sk;anG=4;jg1`^iSUO}3r&c?I>h@~uK=JU_RsS+-GmTTFN-5v7G)J2;+M8tu*$#R82v^n42#1M?Q0(B`QEDbw z2Y9M*7vbN z$(Lbvoh(bK8AJY>0MX?^a^ev0k=P@XknO?lUYa13DM06qU4NdKvKluU6{`LcN2m*e z#qkE)ggV0~fA_KCv`#kBp%^=l`C}Q6%A3%#s@K6C2B6Y4{Pc=pq_=*nh?RQP+l18_ zdreAzNeDT&^c+v@lL{!L^Xm?eoOw0gjfiZ)jh1^&Bm{uCOU*-}(_(bu|4rw{oGWa> z`|#7#kgTW7Wx9_JS{uD z#sa=cyH48Q4w?o)aGngv<4vuYE6Gkb$9O1<*C%d;-rna$KD&kW=d0bJnzMCRJ~^lm z3%-aNA%^Ze;tk(nBQ((B!g_`#Bf~3J{^(yoi3ka7VTq@mgy58s_2pyOVT&>zP9T!v zGK-_@n`m?Z8I+kXLSnRUuxM)j&&+%oTXkjzuhYrowMjjEJw}r(1#3PYg{quHF$t}4 z@g{F#w25pif;2+OQUmFNR^7BB+dKrWa&%6`YrYIDn!=OG@^|SB(@s6)iZlXCZ)`3d z4R97-cB)f%!5^3?lQ9E}@+?xY7+5PXwZ!b^vr{8c65Nsj_SaJ^P^lt)DT322N0fEo zv~ppYtk{dnef6#k!n0S$_pQki_tPzmvMo4}%CiOMP~0QzR8-yJdDxWuo>GaAr>eqA z=l+BZNQbVp4=pbVt7zqoDg5O#ikBstpEN@abT+~m1YYDNxU3-6N z?x^mD_WYS0gk0sA?w9c-S5vQ>(bmp?Nbj}x_~4h_j|yCaEl zG;j>DHS#HlTR^7zmm~^*qv7Sh0szlVT6mLOo3sEXP@XbaJnymGKk+x|;Y4flYnA6} z!Nyx!$WjriyDz_AS-p1|o!&pbqyBq%rTmsS#*;jTUx$D{LF;B?UWNZ2ZAIZlwf&zQ zHbKg7h|O671*G=o6`Dohtt?Uh+E2YUY^%t>uhkKRNo$u}#qx#4fDjlz&Be#@xVDv*(V!$o zuIwwh+^v>!zf@-Z4mP@UnDOs1Ro|PpN>TN5p8fjuC1ML1lWwsq8~?Ox$b#t*_nFreVp({ z1_i2de1M~7$fH8Yqg`rxSLkEuuoz!ryNWT#%(nr@kmEwVI35ZkLNjn)!Q-QPp@_(S z!e`=|u?D>3CFQ2@QMnV2pEF1nwPRSSBj0{aC>!tw0Y`n9Mr=&S-Z92=zf6vsDY?AU z5&vmo`qKjVVkzn09)9u7>Co4nyZDW&CFGy5rZO!6gp0f8`Pw+0VE|Ne!H6M(Q(~JL zL58wFrqVJWH3K!XY||JY)X2ca~cFC z%jLr>cF1AH$N{1Q_%y+gxNLI*cj&<)KvcFl(s}5>ecOj#hy)@)>;OQX4EPoR!Ndj| zMuG4R0_L~E9NaxrGCMq5<1Cyg9Fyp5hzjtH2^h0KBR>yGayQ472p1I&L1dWf$Jm*O z;4G3e%8U|F-nE$YSsMT*hkA^KfLDPKZiJD)gM%)DAs#@&RROxYEQ`2c;VCY|_hEc8 z&HcQdfn%P9&Vxf3{1M9plvM;iI{@)afbKv9Xmn`UrWMhh6%1ye0R+J93%n>0${-I& z3IQoNi^MiCMw!Ta-hdlk~B}*Z&MjxAMH`}QD+oU0||6oB|W?;Y_&@mVqK5tVl zc%`Bb0@7tIIS(F&WU;Mo)j()jVP^$e6i#*@awZR+C=k*maSwfGMk)|K*>N8MV!wlU z`J2!xpUSq={+2=^6zm|>tq>JgT)epb)W=B?^@?rL<{@o)6IgVH*l|rQ5ze*{9-#?R zst=eNx2MUrX8y6{-FV#m0Ytgm{CWp#w6nbR0jITl+(itN9tbaLw28X|*I@{apaM)b z1cnZ*7z`ZO%`TVb?PEi1TIBCBK+JdL9R|mBUrcB}bq`tDjiMpAm|}S|MV?8k?#UX# z+I|XeI5W@ne}P3lI0qhVxf?>HvTSPJ9Uv}j-|Za0#_bTQEZ?EPHRNrg0e5l(FO^jx zC{zvr!Y35-dxpTP&A@+cphdVO7@|I?au!%=r_*mLlRdso74lhhJ=~|!G2=#Y+|uXh zftz&m7n-{}1+&{Fip#>}uoQ8dxOLFVMjH&bz(0noaB-XSH%s69fQp3}Ma1x^L03@Z zP@=>es%$?g<2D)Rp-sq6h!igxoDNI!56c~IdR5>(**a^ZJ1dBSB_vu?u$IU+?f7%5 z_njbdfH3o@7Y_A6^nqP!(FKpX8}+{sD5_gK{X0?lx3{Q={IeGyLO-tzG3Q>F;6P;Wplau`@b5NC{^i}yzVbX!9pWOJ`Huhl^U0459n}5G*?ljeHN5>ZuJe`J-a#wz1MfWXEyMwrT;g__jjsK<5w8h z54Z+{0HsltOOVcS#x2fNeZxc#E71R)XtNd=&-UA;;FqE31+2;&w8{H88W0|XYX9G^ zoG1t$mge|*e@HwE8i@>VV*XGvEQky0aQ$pQEfg0^u2d%ZP$q?1Q_0|BfI1=>_R6AF z1M_GWl+STS!nf} z963;dq(?$JneVG(*OM(K=5pX0Cizwl7ed8TZbzaJSJcb-MMFXneXBlimNaU##&)(| zoEi+=x89;KPp8rBpb(mZu_=tg%$R-!KORy(!U90S0oUt=iKGI^;KbiA2l^8EnW?<0HMmDkl*m-dke^U2hO z+4#z{Xd$A9HeNqrR0$f@|J#0xSS3S|#300I`WMs=bq>$5VUvN!+nYk?n*S0LEscwr z(@>1#Np#(Dvo1fv^|x6KMWhInjMxVMZR@xLP_wL7v)_FUE~1eWnI>y@ppOC|evxsX zrS^a*f}{+*W-2DRY~?H^$z>y-BlJI4f@hbaVr`Bw8<2?zbrbo#m?y3yxUb?53}E}3 z1&0q)^znPExm{7Pk0Cx32PO>{?tt!DgLU}9j<-r`^g?3$5>Qge(CZ?B6Snve3Lq@; zFOEW7l3*Hn1gAbq_K|U4a{%#E20#-4@V&s;`-lu@YWxb$mXs^!f(DJ_GwMD~FKDt&p!~bqIIyRwayT_6W zw|z4s1laXoJMi8Q!wq`D_1ht!>=GHsD5;Y0>Q_%;pVhD0k}GHSqsv<}val3no0Gib zeIcozgZ}<=;WJZmVwZI=_t|oRqKqzdRom&=u{! z_2Ke_ldofH+relcgcHN_7rIZb5e0uA_5}+Hn@3UhvhioEoKQ=;i%{x`A~M7}f7yk` zU=6jD%;>5okH8ZLf`M$jgV8FQ$a`xdt=%a$4&rK)kigAzDL$wg_HZ_?s%> zs$v@V!XA)a4g6%#z5jOiYjz6z|_K!s1J7rq+XIYJkg-V-`=jTPyj0x)C&l)TnNwuS7N}4 zg1JDT50GAl$y4hoWC}}i8vcMoefAFmnX33OS$V8T_Jd-&Tnm#|`jSYDM0x*1I8b** z8A-B{D9fxUMh9yIeMTdmEL}DnO)&;Bh79RsWDPhKjuGS8HS`%8xv0_oXmjR%awReh zo9kqi&;4Mi9Jwa7f}ao{C150+!O^jOyqH0ykFpDcpW1ujTG-BRb2L>pAEBlxd8IEw zK4S*d#S#-W!mhdGQ?I}}PXt3OiNKS<@v&dZ!u6>q{>)#@A3bjjzRfMW3Q&P1(+ENO z7@nj+_Scchlx&Kzye9ptLO-t7_}TC(QE7mx$ohwG5Y+M5s7C+d`P_jf6O-0a3U%i~0Bm*MP z{j+__!>bYJ=-`1n4Om=351o80(I_b;E!%ANQ_nW?tpHO?At?1-VQ<@hdju~x4q>mB zHc+r@OonX<1L>DYZg~gLI$Ky9z z&R*wpYB{szg3dUYNaA1`KSNkNY~5Ngq~O0t9NO=xJ?bg}o72huGY)};Q;)-t!bE6L zA(42%YeT720aW)R;S#XR6wgCf9fW-pGZ{t^DfoD|F1L(NVq!c|>X6q_e{gY( z(a3>^l2?J%tY&~zNF~XxfoF^6_jTS(P7i6OpHJqWwTs6Eg^Od#Ge=oYGT*z{o}3cv ztb&Wgs8N-I|8;sHKya}-3Ala1Lpy%a3Pk&bK@Nm=W488q_WG(d&9JYPqBL6)%ys88 z+k`v&aO%sgpkFvM2`kK*>ql-hD=+B-Gu=`*9yv^yfkb3`mft?*&U+!Xb+NumLKYZ= z=Bzx~cxWv(I$hU&mij6(hT6Ku_8S4JEMQs0S(6tvgLo57+wlTF0YyyZ4%?Sh2;2_V zP_6AUlnfFNb&#geX7#4(<9R3PXGzXWk0`-{?!r%y3(lA-SEy?n?h(H-#|?STB%n#m zJ-SUM{l*3{Xmp+qIq<0EVt&jy)zX?}wMHVxsxKfb98;jdsF-fw_s|dA+x>hA#4HRA zbQLq@N2{r`FZLJj+BUr4ZyP4Yx$(N1ZRh^o_w82@nX7mGIjNJ-J^mTdFoyBDeNz`g z=#AKkp~BkBJSPf9fS*{a%abUkA@*0kGm8e57#zsW*auhcd2#q(L}`Eb=}?$Z{Z^p` zz8bhDll6&Sen#HtMwrT)EPJ7z8jUNPWhP9YmFy@;xzEPye}%;jXbx8Vx9$ z`${W3QIKl$)tNUj&E@Zuem-(x!Zj?eYYMBGq=4v9V7Q!47XlpQ!S6l2rt$Z^l6$;4 z(caU$7Rn7~?|Y$Ya>DRxsMvKVWIB>=7bX@&dPFuzM2BX?WwJY!c!wpP)WRMlkCX>@ zj7)#F`=RD_h^8v~To3cqW!1{UEn)E*j2~TtfOC{q`kv+*(UHX7DMr*Rl|;d#>fuFb zI=d9aVCEhmi|$~|$RIa;rkEaiZgMc%GJlsZM&lcu=nzC}#8Q7DLNMl?7)31(Dk0kC zyomUD;pf*(DEmQ{Ju&9|KN-Oo4YbjOeUxOXoCWO35C~DC#D8eSm_{J4MLRY`CBG0( zOmG@CvS)R262yS`U%!w(#ft_H#B79WR|-vGGI=0DM$2%vxH4*s74AQ!mWAh{}B=WO+SrQRtVn>idza~VHinxSA_`_=1K>7S039`qWN(zx07G0xkY(!#% zL4pu7ZDnz2-$&}F>}l7h>XK?i#C;VJClYlJ0ilFdGd)UTGq9f?(PFLBpFFe`APHC# z^?r^KviPKo*)qw9y$iHV*Hu)~y8jLh{zE3KAWM)_CN zC}>6>Y0H+m+Y3xxc9s$FQOkt3x{+7vmnrMxkN;DX$$^5d%7{=nq6{RNIqaZ7f)l7{zNhAXe ze;m$wj=5Jv^AI&qdEFw8L<%A&EV9QT7OjW8W|YrKB)x;Sev4f`hd*ppvxK>WR)OB?P-UZ0J^DkGP#QcLaV zBOo4LVu|MOKb|6udsj?qMRXjAN{t1NBTfl$5a3*OoQ|{Sy_u-uY34M&iELqtwb~7%+oKhR;4UYJ2qd!n43J|j?fB*!x_F6F8k z+RcNQ>Z)PGq7ot?*tQrw%yfp`ASGB82*~YxlHgC|L_a`=$p%28 zhIb8A8~(7WX{dgJlp*34a4JiQ2q)derW9aebR?8{-c`Rs&O9yWAC!9EUUdvNx#lg|Fmy=>opmM66k9*2ZiAHYK2}NY)lZAr6dNRdhQflW z`2lhm%7rR%RDd?*?{tkA;Zu1~hPIHmieWd=ycLFNzZ&sTZ)S*5R-=l0uH( zS7&5(VE}{ji9mQxDeK*aj7CLyRc7%D&7H||nB>CCu?9ACeV6)*1obc*fPPw4!}^Ul z)m@dsL$1gdp3(MWWQt^+d6U>TQMZ~VL&BhulJ~SO@gM*fuwuIu*(9_HA6q} z6hcrLvP%%sd!q?EG%?`07NMtYf0OkSMq%0>ULT4ej#31_ zrLhoeKXeI=jURf#w9iGa7+O%V4-qF*SmSYBw>wYjhHrf)PtcEJCOKJ&Q`C%W4Bo+{ zhAixZau)J=Rt0gp_Hf?~7QHeSiV5$Cqp(+oQ3=Cn^YeNUg4rzO1R@2!46pz$p}Zp& z2`2OL4K^`_gdaf1anJSUjCL_oTTydJ}$T5{r@oDlDBW5{a=Gq+vu^D~`P12@?ra9+Obwi_JhD~>-7VG!a_as2lK;N3(3sx66yrzQ&ICNrE}?o+Aa7sMqs(%#UG1CJ zS!_7Pgy)(0fcj3t$-^af@{!ipG;;NILudD{&&uZ0e|PNtHHXUeX5WS6HKca^oZ1p< zr7E7jc*aYdCQB@t3w+CO=K=5UbJrwBNlFU>NcJH?6Ngxy$gn4t_0JUN0diR7YH>-r zX1DsV4jNmM07V-+D=YCSHW(f~8!fF2sv>RKiOX5Bja_WB9P|@aRQo0p`=(Xta>+HB zUs&`zipR^m!nteG@6%JWWV|;WzeX_sAmMHFHR<;la737VTo8Bvt0C@NrwNPzL)d26 zjg5#-OK=PqL-+A?tit%98Tp_U2Ij344>@iQ`2YONmNRTj*vK0#8g@7L4BC8&l~;kY zUlZQWr@m@pvF_6_7S^<6E#LgJcxG!D@>$espBh{B?K-R;HhHeb{1}c&nv(=zwqH02 ziPzYL3&5JSmF#V&*J+lHLC`LBQut%5Vas?B3V@{m+0_tkP5xH$s#_|qr2&nQhhNiT zfs&25Sa~~tuKw#rN8GHZ-#o``nDOlX)pf2KFre25@dM?s2iiVCv~k1>?8t{`RD7G5 zHY3~WBu?$Hie2$JfB_N4ZSv-E4+m##f}&P^3?*oOI)DOSI457&PXI`EzgRfa_$}}I zL_0TQwh99?Ia0OjTe$O`ojz6IVS8Sjpp4s`I5drQ67|{7P6y3e_RFU_H^%R7lRNW@ zeQ4}XP&o5?yrIYI@9RG^#UvD`KKorlj)F=~`-S@Xv9IAw{ zGQ^Ge!qhWSN!Qk`R#bC!Y(73jZ~e~n9CRH>Zt#=yxmugAyKL|nqp0RQ-o4nl*yIEK zuQ9gtY5Txk4p6+uP(E>%(oa$vue~q2X6wEt0#?$MSoPyOq7$f^3BpgMgmMmw(##g^ z**D!Be{L6AxfDg9`4ge>&R}&Kp>%ZYJcnJ;gYSs;T(zg`AtH=n-dN=NPPbP|Acgl= zAsXnkZgLv8@oG2~&z^Ya&j|+HCIhcAKD7*46Ggq^1EHZonY~3!&OiRlYirs9rnCtR z?#`WdH*%y$ge5Jv68E|;K4A_?Lke5H5S#T-MfVo&FZ}MYJG6^yzYEAD3n5JGJ#3?( z^PDub|EarwUBz;Fp*DS|l^6Ct4?B$M2gpjuBItR8I-wQz&f!7Ftfk&1w`Y$ZrZt5R z%*tpOQTulJSI((^Kej^2A~5-$XeMv2Y@=oCv5cXZ8l%tFl4Pum3lzhreJqOl3e7C? zGD@VGR+D(2DuHU-+gulENu(L~WM?Gd+Z+)0m%r*8&-cHenR$;Wzt8Fi&{(@s%Zz2> zaQJEmgYH_U8eWjJv%U#_rvrNMy6^cuA_b!u02(hU4 z-n%}5UUIUqb8#d(x+M+c75Um(T0xcRIZrt;7`Hu`hL1Ku!S0~RDXC78Lj`AFwW7^s z_G1zA>n|&~D4A?H42zK~vLO&6CJ*BB8Bl_r#Yv^N>F#h82*?A8zPbR%65+ol5$R&2 zim5PYH#=N3FHdK(NiIsP+Z<5jej~ZOxOlWyL>9BBnF&59ghlF&7t@)-f?9@0i()CW zduC`Lg3mG79*&GnrV-Jq1tJ|gB)0%GEex6yN8z!gu;(Qio^N4c06^4p|K;0I=+Gjo z00yqhZ3sxz&r?7#wyhW*QkfYF0lC;J10N6X4|e$CVaZsD6cWeZ9#qwK&9^p&N8HA! z&HR=9YG*u!+i94|?<3PMxBCE73|yzjm%)fa*{f?^d`TBH5;FA!$9DluG}G@c#yXO< z-Xw>vwRKgUqR=?nxdSrFlwSL_am>fEgRpJeS85ml_rCpA_QZ&m< zyeXZBt1Px@Qi#TZtSH>6+oXKAQcws=_+3;|=V@uMsoSPS^WGX>AxCI8gLf*CsOKW^ z#L=w}pK|m}WLRVVNTcLqXh?L+1<>Tg>8XZlY*Oi{98Bp+hUwIWxP>8zVAb$&f~k!t z%&ac0VgSu0lnE_{B&1Z>ybfgwFGfd|0^N;QO2UL}u~qq8+LQ%6o+o-)swR^UwjrX2 zNoaC!Wzo3B-@tz>mtyPM!2qr(7wxbU`Yf#GGev7+DM%iZtlTjc?jrjry{#*it=*T$=U#o3|HB-K3uKRmuxk*9O`g;@ubSk3P(2Ao-e#lAeaO_6*arZ@fW(yViE8MU^(jE^*GLW7##zHwHznN^0Y1kFa3NprW?qA()%um52pS~$n7Tt@DE9o!+Q+{x+MLj z@P{tkJry;**1OszkzV(LVv;*EX@S2cWV)+{S57ZhB_)7<;LmOJ-#sv*f~yxXf;Bi< z(cg1kT+>E#Nkw44|3IYSAlfljy5Om!4ecG=gVcV#f0pb&9Ut1Bjd`1%Zw3!a? zTlsaFIU19Mo(KWQRp`P{H~>3V9dblSHYp-iFCde^(ATveAB)9xTs49HMPk~{s z*+@tq!78g^)+$0bN>4CptMMfpz!}*lYk8(@d9h1eIh_uP!R;UUC9?nyMK~zj-A*gs@c_%;8P`!faPN>RLE;Ic~69S}y@I z-&yL!WhFL-oeF79X6sp-p$2X1@Qf7#D%mDO3N zRXU|;Bv7|6ZsDn>>$U~su0`f1WMgxjaGkxGfAv_$-&AjZPim7xJ&2ckkZb!UJ)Na~ z%{eRrM&a)T7dMUSO1(RSnZOM9k{C@@)%NBj1wvH?-YlUAOBa9j98CJf`F<9#rFRPT zhsy-xiRD=y^ZEAQQ+$~oM~D1UY-X4cq%lyyY5!u960|*Gvi{C#X5Zw3g)+771tLmv zf`sIPLI}~7-m0x)PVrtjjUK)Vo!7E%-nm^g*083BI1bX#C-N1c{2YV|bM}&qs?9t( zsm$QW5G?h`wLEc)r>zq1j+`ndCbSto*2Kz!df0Ehlt|{|fds`{5I5co?4x=Y+-j0@ zu((i_(Oo8%5jGdIZ4xCaxofx-&TtKX) z^Ly_`ipeI&PxUO!IJ_N@GqJ!mpG8roW6=>~EC6{g`{g;;P7#+?&?c?NbLhYKYfyx9awB z{J%63qz6X_f0l;GNy4?p$c{cJu&_q-% zn9wdaXL=<{x$!VM^yF9g)oyLWI-J=C_e~lqLh3=$JfU5nqT40&kQFN zbqWJxL$gT@H_Dvn^B3W`8QJXc)d$5b! z^HfW_igT1zn+LZ04|RIKs>Xt-Q`H6vG`R+lgCP|Qw+XP3yi-ZBqLd+%ch^HU&R4)l z^{S|ydmpw+$jQOE(V8gRD!LZ=h-^_2s-KvVX}SNHGU&~G+u1#gu^BaAiAR*B^cxv? z9K~5jQ}#3hcGvjBqF~xG zGcyBo{rdkZX!w!vY7#b6ln^s@!xR*^6imkIsWx$PXvZBkf z!$r^M7Q&-YaPm+xn9W&AmK4Aikn>PdMqpY zD8=<=c{oa_)QZw7!Fh_PIzm*E$&|R)Cfr6A@{UwX!NyBx@B5!M~jMO+ezlG>}oU~2bwz+eYR66S(~!EJE5A!iv1_LTBx<2 zP`&g2W^&~BL{YVcsI!s%6p`r&3DP zT@axl#fbwZ^wG_-C!v`Z>@bxBm#)YzUh6*%3L4?>yt zIQcf&dK`}XHba*1$>d-2j}@|uWYaBe!4gk#C$jf4GMyDpm*vdACISdbcsPo&P|78K zo3Cn|)xy%L%|eFYRECh)gcz<6Ia&G16?E-W$VXIw%*d<{&3&~p@bn6*nJaDmHmIWt z1KdLGrHrc*OJy?YzQdjeqgQ@211ZzNI6Z02F-e#C=sCHS>#EU3rt4XIoq=x6SqM@z z2g!v)D>OB==Pj~W#y(Gkcgp%?HRp&kQ+^-U5uXz~6a*X5r#sQ7)0B|CgPhxJj&5Km zmMfKc)O3E78D@uqP$&i4%e54h6PpRrKF*UVE?ip0Qqs%%`8HUBXy>EO1C-WM?Fv=? zi@UpwsVn>%1rG=JgA}&{#oZl>yGzkRaSrb8?(XjHdT@7&dnxW#+{&5$b2GVba%Yk^ zxi|A+_V=Bgz4yv`@~k}Tx8TELZY9ickd_cjif6}PBCPOpE5Cv1;La+3f2A$hD-FFm zkzd&lj+GS#pCVylofOGujBySF;B!=lO@q!6y$bc)DMM2t)zPcM}_lN~kp z*(fb7D#>jt$Lpo>R?Ad~GxwQ2$QDZvW6#$+%bBk*3v(iW94M=MG<7&pFLYzb+AgaP z0!5^OvfV!aB&hT|E&p`{2eUCRao{-}w`%Q9HTTkS#sk)%rZJp z6wbQU=DadLAz%NAwf?ndCv!qKvdyI1R$n(W_ zoc(fTklAjMCPP&$d-m3RGsmXs=3b)WrlfzQ{Em*O}r+8~vPTK+eAT?Nq-^)&nw+t)|IqXf0-u9bbmphUt7E;Ua zuT5XB*#*Yfh*|KM4IBO-L+HZoYzDzoWkD4@o5X{49Jg+NvPS9V&u%EknsHzn>8ojg zeayb-#RWe&yl$B#nw> zOXm~|PB@oi6-RM#?qt{Yo@DD|=?>$>`Puk`vK9T! zalML_#=qfH{RZk(C1-xiS&{Ag(K*a@i@a2ucCoQN1}l}pFhOCW+ zuub5c1!wWVq1^csf^DRTv!2K$<69eQb4SAD=kb-Ai!&yj?{1d8f9y{xgVU>=qp6?K z89YAfWiYPT1R#wt<>oQJ+x^;^4Md#PQP>0J@#VxkpyXY*yo`c>cDUA`^$63Arn%`4 zw&`NTBC7MUJw5r`?+T$b#Q(h88WBN>{w&DSjrwu~xY2di!cRsFPr|1s>t&z< z`O6H@S<8>hDLbw?O!qvI6KdyMcI)w58WxBMUqc&fs~#O{_^r5{%-sSBr14bLQ`o z=C_wFWys1szg=IH?tYtTH_dBjGKcBUS3h}7=sOQ$bsN@d#;ouB71BIGGmo8jTfbj! zCDh&Q&)cetsvD}UZGUcVPlU8+o%gnPdiQ0QaHMrE7DBi=bRqSgao~_-Hn7sa5^v`& zAGeTLOG9~`1Cb5lWOwk!vtAy{5Q9MeHg_E2`&U$s&{c|^kLSDFW};{tn{YM{|94f4 zYW?hHRRMwdMW0G#<|P1oO54GbTv~h?xLA+3ulc?h7x@wskdFFp9xr`p)Nz#h+F2YRBK;yw#pwLZK}V-~Kj%%56%r-+$Q;sjaelx}Tch z&LMw)iD)5W@$BCDcJFs6r}yw=J0&xy`;PrxxNaUO_q*Qi6!8{xIKSL;W0j*6o}zhv z-Rlm&7SgzHBD_RRzPwv)XNl=D^f{=Ehv!@qeacG(Mpe0qlj zAt0eU7QqAQB!sS>O%CCB(EX$9qZl=7r)O53!%zm=T3HwfJ0a5&fZU5+O4hE4HybQdU< zW-P_%e3KJO{I|e;$6QzHKH2oYt)yOA1tSUgyzdM4V)y;-f;^SFTSjD~EVTcH`uU@s zL-<4eBR;(=VjN^x4-5yBYyN?3S2^lI9~IFqU!yLz=QL6 z?hh<49h4l_99+)I-(Ohxk5R7g7VX1m`tJ8DPQQCzx3g893A=3wy@q-EVK7^Y+ssu* zZ^pmRcl~9pX4$9d+|!GJ54k*|B!!E)AjMVw~2f7H|&Q~)^{Hr zHvtlw&avViS{mQGCoev1kq9mKlkectJCQ%i%_l#3Cd2t6q94t?tvS0M!{mg=zK3j5 z3SE-DmxWi+lKGT^qRJuq3oKs$V(ko2|LA1vYF~G*=XH9_Vf!TPS`P8yu!*wZ=jdzO z3+^dneX`W%FQxeamv&yT-xRHGT>&6ms{7e64F3MoFKY7sA>|Cl!L}*E?oGk8Rg^EA z8#l7*uOwveFUlDEi~QhY#|)mnmh`7EY!QUT$H(KYH+%oND1kf{@HD)u|M|s6U-m=C zzqE9XOX`ya^M2*$RFeEa+Wzr#or5FYPL~~wHpTa9u2rNkd0{S9UgaMUr$6rKB zU$K9muS+bC`E>+a-ADSOL`1E0jOY3M&)E}O61Rvnr2ssF=XIV)Ua-F=sB4ZL!k+Es ziojA8WxEdG%1iE6p_CAX`hRAg5Wf*1Apwywa8S_EP%sElfaECH#3(qFKumH>3^YvK z&zSVYSeT!%2tI$pA;lvk!Xy5SM@oQ4L4-#|fRBTPPk={2#!UE$n2?O}zcNo0|6!gO z|10xE|C#u|YdoP6{qHbOTJXgG-%C%v|A(cgr2j>FD#~fq%Z+o*EiC;X*wg=zo{In9 zq^Fwts@mq-rvHZY)crrDr&(RI*~PfoCA-DtwdEP!)wN%HdmRU7^Jiz5XXo0FZ;5Yz zt^Vmq|G&BZZ|13BAQ%yw{$RMFa4;N*z#j8$4qHsVo7EgAVqRTbo}5dKShlHTBAHfI zPHv*9bSjCSciZ7`k;Dz#-X8B%ncthFGg`i8SJJD^>Ay+%Ax8(x+8h1_o|-8BoN@Q0OlerplST_M8;P zHljuB$3=HWEYdx$BW5}Z;#wV;@Y}6rn*gqOekb+7;T9&UWoj-ZKGc>P+nFRfX~i3c zA(klVwUzH=)+@ezPh~N%qKKl&O4rRgXpA&d$p1G^%FjoRZazc8`eiv6lW*O~=(`-Q zZVs&+-b(Q>W>mhL2t0jOVZW@`zPrOHoldzipBG;4fEEAeG7qei{am*;9sOK}9thux z+TaLYYI&KM$1>d^Q)YEWH3c7oFY-n$j$aGS)Md#>k~og9&%>z?PMF2mZ{(n;H%w;yX&)%8_x zcvc027G_z|hO+e;82;lW`POQLjuHJ>eAj)M)Yhrp1BtF|-HIP4bAE^5w;ur{KNQlU zMg}Vv!pX`{k|QXOSDJpHd}yre$0S-YN6=@FT1q3S@o2KAdpCE=$B`73ses`^5ZHJ`UjbQst zw{>f_ldPApZX9wb(sZ15QzV4&Hy`(!$Aaiv5!DgBwc^D?JP zszWlUIgJ`ptPD01@jS}$Ru*jC=jp0@oo2Vjt3R#85!s)t;6gW<8#^_;JLGT9eLh3~ z{e@klKWbW_T|6m@Tt2-eXpY{lvZOp=qCBV6Jr7%IaXIv=6nlN^=~u;7lki8ob%Ddd zPUT;iP$r~^VWuA<}|Kd?;dzBSfbYKPO9GM z`gs{WWXMP|Y%~UhI!#}bau461o`;{QuOa!iRp9M4x)Rl>6Mf;SR-U+sOOROoG!juy z2w2cQnIxrF_F!#htMLxU$r+V9l;z+~N(6?KkPMxW@km{{rH6c>wznYA3{r8luPP=i zTpd`?y%b#k*9jKxDSz_{;xk91)VAz?gnd(6@%N`!jw1fTre9%L6(>x^~vQg~hy&5IQNE&Kfp~D^JQY1>NHOmJ2m>aE>(S3;l}&H`^;La;q*A*r;4;uBw^ zWL-(JtR&n540WvwpAf^%+);&LlNuecloDS)SVgf(wLnCWm|Qce&5=M^pYn3%Pu7@D z^-OpvlvnQJ_AA$J;gvZi=ZaXmHg$~9vaN~riXX(RE@EbjvcnB7mxDjaJW9-# zfM}B0V4b^3^YUExyUwDC*tF|-6cukF{n*JD$MQ8#yDjEVQ#HnD(n^>5omv}gBzYXg zyBZAl!(DaTg{eJ1HLZUTOsq)2X+`|4VX}Ez;`kU<3*;hXazKk1zKY`Nvs5#WchZ>Z zwzg@9(^%PimMqK7g6B=p^7+L(0&-*VizUytB5R znp&ZI_|um)-iSx?&IR>-r7yi{8_0&YTy@Ih?(jeo3WX~WUg+K+v#&_nD!uedurkPn z&bZ=a^9Ax_W$JR#I-x^G;H9UngbcTlsrgvu)Awgci4^u8sQm5V5>P*4yFig>mW|VQ z1)SC%G4~(e%)i|IHlsd*vwxCK#~V&lLHv-dhlJQW?6)*zC3&$)uW7~VO*q#jx$}$a z;_Kki`aFV~L)qBq{?mu6zvk?vZ*JEQIIPkn7^yuYn(0jdWNEoPjJlSus=1|9H9O9B zDT>bgFa#ZJZcc3)0mI#*6RtVAy3M6_mpx>Txlw!`d)MMvz7%7;u}RHPj3vONsIjTN z=Bu@tjuir8_jXxM`kPYQNU|uZJlxM|w-B+5cEN1#+A6^4Zq=D`hJ<{%NEySJAP{8- z0ufcD`=nPbw{6W~DL9;_7}a2oOd}s>}mTM52{5Xf_+t$oTTBn3B)3Ch9L1EExY^94icuvyEmTln3K>0E* z5BVKuhVW1y?NOP@$SbahV)F&uQG^EiGNxPBb4Bbkj%RVriZGjkRPt+f!aPRX9i?C&fckg-4l=L@?NlrZy%e(fKz5sQG|LuB5&5(|EuiMz~FiqYt zCGpj{O$BGRl(qeKtrT{Mrgqxt9=n9xt@*Ace#sgP``&#-lTSLAzB2J0iBC%>=e~35 zCPG=nZW`ue{iKSoT_Qvpn=;@E*J~43R`ni)mSo@};gd4&oH*w4ms^~x$V&syr|WZ| z8D4<4lveA$`MIf71&-e(x0k`Ac6hq~yS9}vf<0vAUMe-|CUO1{}_t&*4HP;WNheo3w70-^2)IDDHVc=ZLJRYsQ(z zs&W+sXmn=28KHj`B~6avpej|DJIqtdUAb2^<7Hx}w6w~0B2ONf(_0hPI1;`#>L86- z&`-qem4#A0CE||+_TZ7uL7aF+Je*iNIgT@=?D69@lTH4izob2DSVm`4xB^E@dloRW%Unmw#pZUVwZWjyBCMOiXAS*!wk zDBYwwQoOa3g1FL3X>8q`lSy8zYtkc%RzsgF=*48d0;TzN!}O8hQyDDTz4_ux@G?Z6 z6oC=x8SCQ3X-N{=dgAa7LMItIVGh{%85o_(pK<->*^-#sLnSgippSeY?Y3RCSvVDz zT-s@WOyWS#cA9t*C}B?Tf3ikKB~?ArWz79^$C9TzDKTW?4CrJwDzdF;Vwfdzo0_?P z62yMx%bB;3X|jr)gdk=3wB#nr>Rs{VPJU55=!}fCjFy-Plo>ajMza2sq0m|xtx;rR zSQu1{6pdM`_JNdmMrC+^LQh4V0Yjf+njRFBX!-P2>W~1*319b4Q+nr*ma>U*qkCc5 zQvRi+`;Vl+_tIj98o zGlIVZ0#1}fAf%we_N*e(x`OT{twl1tvsq_&!m)MLkLQ`(J)pu7SXD${g}7UW30+l| zRjvuHs;Me}c&_jxtZpJKLEx`O`CP4M9VUFH6K-8ywe0(?ET1tm$05@z4LL$@#qnf4 z<8~J?s|%n2)*>fXh~3mMCjeI`QTPjBlvPSic4~xx6}(Y!o4R$oRaH(mutG+4zq~3A zz;(y3<$%wy_qz2aJ9Wwl^{SZz zgFtyUgcXj36^Jhi1OEqxw7&_j0LD51k+>0|I{_L!p@l@04qK%eFo393g{V#r6qScd zc4+NRK;++P0enSJo{C?Op0ie7}o3udZ z9T>r74$e*<$d}!EC)bM70Cgt^2ZBNbiPo1+f)zwtGeE?=4A7;zjrAyq2K{aPU9~O& zh!#X$*i*3842W(4&D>S+%-M+A=LiZrFlAkUttiBFs5Vg`KwiEYunQyN4Mq`#>4v&+`=&f_u&cBDty?Pr-W&>EsR4lN0JL`KLlOk?0%7F}26p8K z5E5aC$Oks8;oi?-1Pl7Rfe2O!u-wE0hns_ZHMN2XLx`+hkfo@JC0CY^n9TJ2 zp!`kCkN19tO(;>QF)v_0KoIDzFaUc4P@IG7+icG{hd19suxA}5aHz0`+`!W-^jY;I zASS|lDF7qMfdF#Am+3)IR9Kw=1doIPIR^mRPR|YsyuHIDfDIrk(Cwk$LT4)cw2*tZ zB+ck#8IOrvLm7iWpBVung%I|;ZnkUUiAj>Yo;Hv`*>{{ zzwSUMq9PbHz|?dP!8?uv=V470fF3F{n^Umm?-N!w{fKN(3n2Ksnpw=i9twq7%0JNI zS@~nDQTj<4g{(DT>JAbHnd>*wP5NF`;u#HxnNgdc5jHd1(q(&}wIT%%@LjuKg%xo)i_+Oa%rb0ScR;Pp*2R z$Oo+11B;~6kAd03QoD@cy>h%YuXeLSx6^~PGiJOqk1#*Vf?1_L*7&b|2j-q$1vP5! z#q&~&ij;K#!Z57&w>=HiIrBbE*FDKp+Z}BHm8LjrHn-HQH?8W6rN^*JWi((=4fyh> zM^piTj5!l|(*ZLF&Bxlf);+EMc@)MsJL~l)!^Yx_&ZeMMQTP+t7xF>I0Kic0xB*Fj zn$W5UuutRHtUb}Z^i(a10pR=J8CSudT9*sBOhZ}GwL%b4xJ`y3g;|9NL=7hWqvo+Y ziEq0FzxHs-liL{y0-1!Ur7Gq1u^L`0*}5p>Z{WX+!t&c4OxQww$~zEc9v3o%(wbk_ z{Af$JJyze|FZb#~1ulCEAA)M4Rt8cTuCi+Xc|#C`qUTI(rz-r|yr1tVzMlmq4Dk<(47y1B(-x+^@J^IuZtI`E#;7H!pmLb{zukhulFR+kw!chNW z-tN3vl4tB&O;&(;*A{8)HoVd71q|CMM&5!g^QPNXgJZxY#@9Nk&j92pIC@c->0f8p zy7iU9+r`2+)w5W+xv?HY5@tndi?9ZKCJ0|dVI@_7Uc(%D%CW9P9& z^+R+h!)LHl<#ccc!IBYP5(;ir0a%N6T%LCXM|NPxeCdI@-q_px8GRF`VMmpD^@79c zi7Dmt@~{-&Q0^6}_-`y43`_~51`gD&8QX{2oSlHHT@S;DyRA7v;RgZ6vx+I`36@3Ph8i8WVIiENgYMt(|*IB2p`=kYz_T|%Y(d(Fu?|qzapOR{!n}D)q?nTeT03Rjx(>pXpOkROQ@Er8EoLmlTd6^#mW1RopHnNz5@w$UA(G0;MD8{Ij&h#pg5>G89uUhkqUV*DPM(KL5oN z7zXbAiXyoR0aOK*uUmvQilT_8#S>rpa42ZeTiIJG8d8VJixJs-X~ihusA$I%BykB! zN;?X$sSwVjUN4IiasVuX|4h{YSkkX*vQSMfYx_e?!x1c9h(jAPqVl)5Nc~hJ6b5yjFxl(~ob{6I6r0NJGNC1Jze4#ehZwC9;0M z6y2cDsu{20S}3StQad~Ro1ArEB7U?%oJw3NWrPAJIJdqDDF_IFl_IK69R@H*1V-mn zKyl99jEavp-ecX;H>c9OrjV0!r=&{tg-j{;$v3>(w>rv_$S(^vb+gKQohvq=VbX%! zzmr|wKNaagwSC!%hd(+@)iEas3B0Q6TG|MP*J}&$8SQ(^X+bNRrJ9gF316#1#FmW~}^EXmD!$@)t^#p@tQLv)p$yazsd7<&{ zw}0c{OfR2jlUQRRkEf|_acWr6tUAcm`7P-3GcDF-FBje;T10A*?t@%bLHLQ@cJWK( zFm^#&{U|MEY+WctWWHX|jLDPUHTuXfGzy#9X(dcoCn4x>T*?e80xfg~(M&0H$yjpE zv*HkauH}YFZCJcA5;x1{pN8+Pi+3}8lpB&2xo(w>vrB7r1Z+*@{7b;dm}Ps#_^otd zt&e}@U@hX3gY4h9di&t2iQ3D6B)mt)z{sRekDvz`Z!4}f>4GGT!^S*`($Q%QU$`U@5K9dku z;5?&jx7JJGH{-?rid^jDA**1X6fSpA+;)N3s7&q1yAD9bP^I|VX0t0~u$JJRmR2e3 za}u+=r^h56L~Gcv`;E6SkmQ?bCWF!qG-b>F_gQC>M*T3R5PFTR20*Cd-f%$B4xj~< zAWaH#R_@Gg^ZSH1U4~>kAu;Q%;0LNUu1i@nV_cPKl3=A0C{Tr?RNo>YZ3hn5FeDXM zb@nD_NAN@y5!%2r6bL&q_-Ub$CbZgQRIHK>B|y@~iRu(xhopLZ zV}!ov?izCyY+5WVyFZTInps5VIn)o>?V=o zHHi1)iRR9}8>n;oT?DJ(GujA3I)+XeIu#W^*32WeqZ(Z7>N`zNPu!Ul<%tH^w}?NG zzzNw99oa{1^Dn84X|lP(LMYW`l8Zif?>1GV;HLO-X&*O-!bkKWt-`#hoZl`~1{PC< zPmRjHuT829?xwaEl? zGk3tfQ_1elSwP+lzc`O%R8{?U5MwRv1Xd4PN+Z)D*QH@wDaS2ApvD(B96d(l{0i-) zf*3-fv?87(iV6E}$^=>jH_tv$hj)HimQ^JrUnOQ%_+(ajnWet`LJFTZ?qf%5VJ#f- zS_@zuXLk1o=ODmqj`9VPGjZ&-<0h@LVqMC%4 zQ)@A!yS>sEzn&=Yg#STCaBSondlEU{MH*CWp!-(g`b!76)law%#@RMWy;YrM%+mo&Ibc zwFx~LE7&lLf7Z~{RYil}!MewJ-BBo~y@99NVOOgq`T2w9U=auT$^)gt*q^)jMUj%os;kY#NlqdUn=w) zc%ru0{@zFF_{V&%8{>R_`b;$AH;FD*De`Y;rhr&l&!2;gwL8NKoq3Y0PO^kg=!~}l z0IBbT@i+^z@2C{eig{d5_`DY&nSlXL~IZnV@&?V7=RnEhd@i`wZ<>Efdlp1__ zo+Rof+8b>7UqJq=A8*{ zcNrVwQ$$e>=zg_RS`IXpZ`{t$+p=O-6m&M`0gEcx4So-VQv~TzG=Db+)A*e`N#=2+ zR~u$x6C!CUu?dL0isR8v6pHy7Wp2JcHvi7+{w`Bf5>FRv-d7J_2~j|l|2JLzB3fL^ z{omli-mWPu|I2ajI`IjXq?6aU?kw>EDWmiXc9);sM?(H?$Kpo|m!*tMXS3#gPO4z3SME@@Vm1!%C=3Y zN7cGviPEP%Te;4&epOYEndIBBgJ;;_PO!^EHfyf3$uZBnM`+pHDQX*`x-^rs^E}!* z91)rB^10N~e!vho4|XtRFfwPg1T}OZ;19-l*1{qKrXzTQRdR>1Q1;hJ(}@UCIaAVM zsxKp88Q$p8Z&8^AdqR^~{5+xA^ix8AP>P&qzrrvI>xiFP4?(J(nRyRdKNkIeBq5Ql-XhHW zY$x@wPW74`X}=3A5IDKig9-Zp;;qK@JK)v|6MlZdk$G{_9|8iN(c*eGwOVQMsgx&awEow zwf$f-IZjhgN@|(U)8a_{8GxDnnlRHgSb+eGn9*D!Y>2Z<7Tgdowsl}nS2e5#4?{J8 zhajInBSb+^kfx-`rJIKUW5imWMhbU5j!vk$Q4cZdWN-}4%}XB_oMAZjW7kO>M<6i~u?LcuW@us799oR=P> z^z6_q5Il50Bpb7YDEG6`}xyFzvIH&ah$9IDlB9{vM5+nc4!T4pC zrL*(ShR+5^?ISsc+(@i3GEfXfNoX7v@@);4=W?dqhx(O5@Ixo`O1{pXH)WolXwAC*nIJd-z=EyZ6_G^XQrs0ILe%PfQCt6ZA$&%Y+S{=u{@B zPL>DiwW|jukP2h%l8#qyj*Ag?>W*!$d{qkkWcb7DE99FUvmSjY% z-+K;jnybJPmo&J6h&><}!qZTc5tA9P+;`Xk2m->X-jGs5g;XL|L%NerV2MtAX|J%gG>JJS?pV0idh}3| zuiw9h9)24{RJL251ivr)_9)YA2{|l(QRn#w`MYlJ#aA-SOOUhRn$jb= zEb*!npy2zBD0?LmR+j@+^l*~^dOC$K14bhQ#<2%D17zSg_?0Gv<^E8XA+(UzvKD0^ ztW&28ftwt}k0#GRm7a-&Gq;*!_o+39UDO{}_DvDS(0&ac7q z58uWUV|G{tVQhb8Nu^?^j;r+6)k^1M2g3L zR2N4z8sMbFdjoJj1CAAbToH-`)yTutTcdMkr1Sy}`1{hF`bs|4NE&|&U0_^CHHK`2 z>^Q;*l9P2_C^ATzK>lKD9ug^`W#m&j7QHhx;G)N=yQ-He?%LM!`yXz3lf;2x3`HfW z<4-D|hG4i(RH(`K6g*(RIhg8>hn!3U5HB?9T#%GK*If8!oQ6QrLHLfRc}sQP!?;F+oEzy zECL$BAEuA=|1-i_puv)%Avg{zQvjzke)KIMG+iNxy5g4{DSLER?wd_Z-xqz=GV<_^ zB^!YV)9Hnm7ieZ-DRzSB?^_|PafecfS)&9z%2sA=YZ6*0vxaG{H37t2c7``rQJ+;u zX}HV><&KT-wjorT*-G@LGD^3d!OHbQ@` zFBp8PpAHhGs&9X*r6Cxl`wi2x9R#XAy;?NC=GG zh9ctS4beNwLTz4Y2{5GSFF8SHgn|oQ(&9G49K1<7=gpy_kBoiJXcz=N5=V-bN&h;R zneG)x1d8tK{&JKr$gxKE(;})0V|7^fjr z3PSbA;UK!tK@8-l1#q+#nIigp0T`C}=p3R^L5gK9eX5TfRGt~H7Xb;)%$3%hf~OW& zojY~8`O{Z6+C9UE#Z=#!Eu9HSRFOW($^7ESPr}bz;E)?D3kH+!(p|A1G;d$uAIQYH z1^=3bGg$lgun^jU^Sw_S{)Z@^48?Q?RZ)QeG2YoeO$(`(Je^^o+SbU4H8$LXtGXFE zR8pL4bo*3&>x_>fExwY~)U%&DRMmD#GnTCU&tC_+4LnBzjZ4K4B|&82Ye^qRv}?Ay zw6_XSSLFUd;5-&M-FUWyomCu_IoP6Fu{?59QpGQ(pC9%?ku1UgP9ec)%p~<;uEzMo z+C$u0zkI^Cy{G0-h9YdQVK23H-h8AX>vIS-+U*04hvPz&7M^rtA$3*2Ds+M;Zu0Z-sjcm|7Y?gDCCKG$UO#mCH=e zVrwRkH5qzRQWr+6b-dB4^3K@h>6oDf4W(hf^T@`GIv(Etv7C3#E7I6ff;J-yVt59$ z=LPSO-tXv)_Lc%+KqxVks|fkuVw@~}b{`I=>?@z3%M)NDg-LZgc{)Al(oYd%)!Y#19sa$(GP(_ zMLYY(wVK@I7WdZ;{1rt_^PDB0Oc&?AF0GsyT|wUn_3U;o4cZlbah$H5}k=s{Op{dR9X>fRv>zZp1(1C zPKO>=d9_E&F}|P&_o_g*P&)ut;VM?)EaE->L6Ptj=j=Kb5uPp#cEtMhzN70`E9De! zS+=mC7pm?$Rs+ct6tS3!zXz7Poqu2aH$AClTr2QD6^=!Yd{+uYh~O}X$6~Z}Ag>QW z#$&fRx%oUCfeA-(@JT#2RT}Jexp0_>n?);Y-u`N*`@0h*z{KZvXo<3*iH890BcUkkQ_#}-bU8;xQ3-V2#4N{!Y^VGsx2 z$ypIx%$23u!l!n+P+Lwb!zBnCy>hNCv1O7mh zH`MIfZq-zV*&UK;})YAG>WW*t56}l$2RA2|8a8 zQh1gqLax&m-@TSZRl#9S#BAy9=ji#;wFGx0Pw9-9bG z4jYF9S&7!Abr|{?=^ZurZ?pv(e|y43l|OXG4*)W%6FR91z0!~@o9eHyh~mDy9%O#H z+!7H~j<-d!5w7czCI+@_oXGi8wYM~S9?bVS(Ldl8^a;CB%PNX|%xF&BOl9Z|(NnLW zOtF%nWd{*isQy%9u{@71o1s+R=qZwJL4{xl=QJei05!}sJdhts4y;&-S4dNto*R}_ zGy)w;tkn!Pca&(CvIvxrNxU*}tWhb($-ki%Bv&FcFBOo4RCr9%1&euEMEYe3taeaR zTclB}j69DLoyJYkp?y7>qpwJAJhrN4m(nR{^Nh4sGeh1**|s-NDh)$2fTjgh_q3Xd ziq+^EOWHr^)`%n2YU;CL=WLV#u@ML_veK1KjpmI_72Y7jt+s<7AxcGOASOmo<>%4O6?7S?Cei*2-wfO*=_uORB%80X9xv<7B^B)5zSKx7t3|~@fN70&7ejx(Mrk15>I4-*LAk?m zpoS^S>m{mLHiIFh??v=j4A_}nQ%K@G7wjlmA_ke%8d4!nP}ep8E1oi0^Ifj{Ht|$d zMqqiC5X8vxR)ZcQ7HzA~^~ zc7qr}tdT58O5jNx-ISkqQ7kpwO6+xRXoZAd%MJeZG^`D2@)@U=Kcrjc)L&G1A()Da zx;Tz?&H8S8>nZMXMs7Hj)S(M%C0jRXp@wJ+5ak~d7HlZcRXPW8Zp72JpNZ&SrHT{X zWJ3zv`jOOLst};c3l;>VGz&3W1vVRny$#|1+~8Vs*-=D2E)=W}A`T)xUPoYGoepy0 zs^~CJ6>Zxcz+3zFcX2g_b+5@)`QdzLj5QOC=>h=$A zIw5ptRkT@+Kv#AmulTc^2pnltJ;$ch`m-9+ni;r6Yg8h>2G6xKQNr6I>#gEdK^q=L z>ZeO5h6JoXI=I`KugTP+lsDIbaYj8~2{BzyK20I#>?M%yHv$HH%SpMiDTmjbcoUnG z&wV_7$J0dqvj)hPYPI3xHC-0f_Dd^HED1k4Y$JjGroxX z6sN7|C^0oZuw@9jaX4sNbL6>%AD?X2ik-P@mP#mOQAzPieYLLYM(m|9J7 zAJ@iqc3VX%V=K8|wJ#W#n&a#CMRZu)ZVI1j_jpHVn48N#y$QQ@0&V8FJ11(HGkFZO z#?ke+*Y&bSCNuy_7FB<+IqKiPreU!&7VVCO4gnVmh7jL#w;8PhU#_fA12?AX*le)> ze#mdW?O$T`?2d`I$O{-;Xy|Y+%l!Q7+Bkn{dp#@XHEXMD=j_pws( zsA*Z}?=@3+FfGiopAy8}DBF`RuA{S1n&9nnE4(h{NfYaL`@6JmwUXjtz2ovXb(tCg zdfEz~7PJZ20kmxfPVz`rQpyUr`XGee?n|Sd71hpLqw(y0!KI^&Az|SxQK1uv*`xlJ3sQ4i;xC$Bm+<$ zo=NdiP0=0-?kscT&kMelAVN!%v2=u9T&rNRlVM)$AOdhk%S}g>NOPab4or>y#vnqa z5|UG!kocg78M=dixF}4 z9VR(uZny5wej0toeC=+}n^rt0(I8OJ6PM8Xk_y}qF^ppV>CNICEd6C_{yJ}tVYR;y zfias=N|qXjDV-OMWI@B7kL8&sNK65zPhOR?14B=V{!u95b|{TgI`w2NmOxmRCN-4R;hdh5RSOI&LDHPsV$I?#bvjdo_xjQ$@#fj%++omSs z4`r?$rng*WuS`__j-(nNa`WevVTq^kuYIW^W|Bz$8+#hqaR=av8o_-W> zjr)QNRJo1hEc_M#;3;6CT)d7-dKoWgNOj}G`mIa`=WV5k*sS5M5 z49754zoAJQt#TnRAYQR?0am$cZy9!s$Kzj^h@Ud3mn8;LRyv)Oq#Bz7t8in?&BUwD zB?((|s5Pc(F9IsOF|57K&V^xib4E)=3+cl~_cKb2t-EXs?6htEo%U-ci_o#1aI(W22&fpr-Xj z7a|QR|4WzCb}C^<59GI1oT2Z5xoQ%=paYnxN?#TymJ|R>4M5f1{6yh6w9YU#a&6U) zxutdsgOKfcSs$xBsuvotGHnVIt?kSRXez3YORh;(XP~tvFUE zUegPc{#K$j!EoG4WWGN?yJ)H$^fO+TW;U?0YHzFA`FnY(eihdf8V+MElE`p5V?CgM zp1V;qPh384VxJ)oYGpndKA;@BU{ZRi;r`1^1A-gZp3fVs(IB=BeV`TXTHSyt9+d*N z)Zup#-rn4hvCi!4%70U!H=P?eIw0R~7j|ry18Il@uZW46^-rfEjDHtWjGCD!%xs^9 z*FGWu$KHeYdF9mMSO|>g5gEc69~f`B>U}GRo$VrH)~_wV2Me*Hv~{G!1aywqRGOQCRZ! z2dnY{4hV<#+xxZnyCjH+l)Ut{e@kxQqUd9BN_XY28J6z}V_9q?$x++uDBAA_m`Y(t z*tdx9!8e`GXKoNHD6O^K&iam=q-~ICSU={A>9Q(M5hxQ!SYm`vhve(uf!EszcUz;x zOAm~T%11@%ZuBCqUi3HQQ;RGr#UgG@`d-d>3buhbO{G>h&oI>teLq<3-MpzCuawC! zHi_Q>))W$Dp6skz5A1(qr`QRaQDE5^rfh?_X;FSOvwI!!ZGO?0r#9ZuGq9L#9r0T| zN6u^t*N4U0V^}+m`BkvgvmqPQvn^Ke3w)zrV3kZVN0oW%9AvxAA;*REAi=%ntzcn} zJ(|ORz`sNlA9EDpW}5GG>mYs{>*7cVvd$lDuAr_bsbEt=bdi3w5oTbb`KprLd?Gc! zIbr{%v}39m^r$qp%SG|1_h5ecu|53m!o*N|r~Rmm>7wFS8B%Cd0S~}VYL+i`ktTl< z!+nI4c41#-Q+y=U`_bZC&Xq6xT()tqY~3tl#dQ!^PErqixp)>iY}6C?RR3^7{La1)L?=fXkDmjmd0jt83^c$&!l3@SC=q=kUw7U$-06Zaq#punlP zFr{WOyI`;QWMQkPT8JzsZU*W?Uj2@>iG_XN`uN(XO)B*2G=e~wvX zHgE!|o-k~m_}CmW+pb41;#7!1xoyIf4e8V(P5(ji^5H@|o}-8kvK?uvhRzVY#fRoDwbJ}PL~T2<3! z+Itm(EK^t-YV0|;QT!vTeS~S;*+)6o>byGBx&C0VfJh$dhMqrhYE#Rc0kt7 zT@#OOQJ38@kqzC>0-W^@RrWVQ0(Iw+&k0G)12cjyBKvvjoFk!({+rG}OWR}qyiL$J zE`@v$UA9eAcSH)j4~jK(=#+Ki8qSSn5AS{?=J_I1z?y1wmS_a1THojHHguI-<=Y4L zPwjSGRu}pE1y}G-=y;lV<1nW=ESuNAX0)=fbc$b6q`lgX8F0kIwzD?3SIh7f={N*= zebkbWdGUN0-?AV7F4;C0a+B!XN&7k~hWtD7JqVPiM>WRh0}=QEs?8;+K4$0+5cwVW zjZ(;nS2*%BI-qxcN8s%6FQx=9ojngA4FvO}(@>pho29$Ip7Gkby*E-=4fXFzmK)2r z_GK$U8@ukCQV*Csp`bkB4xKJx+O+F0bVeC@0os$LpBO-F$=75xtv0|u-YjPbv_27BNr;8Ae@&i`;R;Q0vumuU>b z{~a2G;lI)t4F6{|hJ+ZWgtWM%0F4wUm9(O&vKW`LnwE;ZfQpi|n!bTL7paCdnx>jOv>D+NQ3$)}DGc+4}bWhWdtv_WZ`yzNW^O79!e~mgbhu!Pbtxj{o9f zOis@JCylYRy#D_^jq%ULP=UuDWT^*zNV-`lWa2VS=F2q$r*l#qy8WD)k0DSLRU30A~AobstrvAb)lN&s3q`T@1_-r>Y zfl}r*^7`bU9c+lLF&rfNDO*D!wv78u-^2Qo#4rh`NrOE7){XzOO%dt zKV~X>PBfNk%|$J1YN7&wr=qk0>Yb$Q3+0$*3gNt^t2!oH<_EGn;U5*g5oOc-*pfS= z$mBCy(9P0nqA{`ve^?_+_zavtSN=<;YwGOJ6;Wy#2Vq-~7I5No933}<@Rxkh6cyu4nMHsh zAb_eeTj+reS{Nr}wHqiMwdr~gzwLDS}e_p-; z+x)b(m^)hi6wd0`MhWUtvv91h2TaV~bbvD>mjpfhlbMtw-cJ9xRKzS$Lz6OnmvgmW zY(DeAUCOuZNha$ayFN@Dy84mnF1gcI(y3gISnC@E&MDtc`GYRcY%vs7R6YR}EF6L~tLwrPHze#e2Tb)CnDKhB35B1{WEWygM(+PYjyRj9MuGxDV* zx&`rg{q_3wChnB?D?2VmJ<+Yy!7>DY}z*ecNqXR?>)S;ul5lQ?u_ReL*Wh2jD*H(o8EYJKL4Z2=0epW(`v?( zZ|u*k?q}QC81kB%$DE6W)Eu4+YZ>!2-7N7j(o~BJQ5N&%gF4)aPp?I1Z&O2i?25WadBW#*m!sGnU4b$3Wl=wGa z+<20EDJKFJ`0Cqht3vrP$=)^`6Wx?Y`L@_lIA#6^CoNC}^hDFH#*E}8($r$~FsMOR zNI!tXux+5K%Xp=$tlvlEwHO3!;>u0rsQWZyVLfKiglrK~Hf+W1BX#uobP0H$rwmt? zRw-;6bM5`FMZ5$_srj+<2noE>1SKglTx67(sMx&{eyp^Ba7r5VQm(TyXQKm!;`1|T z-s8pw(bW9x*e$Dc7z9`6k4ekZl~Xi*)oBUjm?2KR2q=K3~S=z=KPlw4xR;;hu4@I({ z-?dee;vP&bx6(#Q%@&GG$||I$+NK|Tk+SiS&xyX$Ws>{UH4HaS_hW5E%`(}G$+(VX z9Ql-^a<7HAHg^>rpOg-J%PJn5$;G&`oARux^M^vt;O8+k0V6Y}XYrd^P#bcwK?%TZ z!BtJJoJM(!6z$S;n(R5fPIJ9_>_XMu%R~er6cqOobuAkMx{DQ}e;YRrF6_VbFO=n| zQ!_-mXi#uDR$ZE$%w&&2M^_ygC~Zz^=@D5doe{c!x3Tk9*L4BzRlO%)x=txDg4zr= zrb9a)ZS7ZouFMb(^!Gzuns^OsUDA9Oj@IV=^{=j&^nNe+YvJmcmOGIsOiJrTz~w|o zT-cS#@LX(zO5`PO5EmJ?+0>KkqU}#~vdn&=QFF9hcrKAaU-qmo*Y!$Ik#6ky@&7u= zG`4SH$w)LSr;S)`T<_hDv7%K3tG-I%DqxX5wKwhaddnq5swa1KGlu)VA}P| zZ-;&F=F@Vb-5j;I74(*a0|3G*A0eDutdhaOBgFg8|Yi3qMALw@Y zjZ>L{b?2=-(v=xGdPfxq_T{O$ODLxk`U~4tui3YkPc~a=y z561M%6*Aqc3MjF!w*BZ=%=>wTY5hrhTLI>-U8EIrB4f>$Cynjlh9hKQOqDdkC4R3Z z6=4@vkelCR$Q4yx*{?dZF~(I`Mg!gMfGXioNJr(AKZH z$WY@BvfQd7EF-OsTI^Zn=*4%qMXex@1e2xE zyx1W(Hsv3^(v~u^>$P=kIbw=ax~~nK)W2UVlGYj6O63oZ*vHoJp?FmOR#n9%C@I`wJ=;)P&l}V@o4p#9v%HO<(-sxES#m_=IUHL z8&>{q4|1!}=rTg4k}rd+??1chRHI z!G>!+c97Pa<#(FfklLe-qK)m52rB@#-Tkg?{(?SB+n2<2oj=|W!~0lc18T9py~Zxh zQ<9;!i6N4epF50wcl9dCUCbU(zE!DL2&{vrETqq~Y&BCnkg|ynxdWoC<=7-$^Q9@>a15a+J&9yI z;Almgy)=3kzgI39lUNxJzY4i|hPq%A7KHob;Tj-Y`(wAs^p|>0cse6MMgSyy31z+$ zuZ2zE$_dN*wUM(@jHy7{XgmP}^f}E9p6M&1m~+Y{wJk%VA>I8dBwRY&$=V_s!%d;q z3?1-vIgg`4GSKGCeTI1aZy*?LxLhTCxB?gb9li#`S5KWhk6GQaJ-LU}#4(jqn+>~0 zVlXY#g5Cs!qlwLF^-i%v+Nf>jC4-onqV;`Tv~bPAa0v#}V*iZ`)_Ex+bcE0~#fs|c zODx${K1pv#Gg-kz-mXf)`tVr1X~MtRpO^!nsSRYQBj_c+U$m(;SVn%FT9BN1p+yDR zE^|s9=v8}!RQyYo84d1x!FgZ*;tc}=YBE8E^r=;bhyu#|F$p#lmxvk>bG7{ox zgZ>^_iDa>tzJ?wThG{=yj;tlpMN>X4hSi>GZ{T?onf+^~3)JX}M`GD|F1QmxYiQ#- z1&k?qZOH6r}5gRhQiB%wWKbeX3*e&?|!qa=?GW! za@{@s7pZzLjk^AkjcQ*CIBU;2fRh!%&Nk|l=`!O@%<>WQWjd{t`(fkF<3nz^;K4Uc zI6rE7ES)h4u7;461K(yHKo?%Q9*arm=BLM12bXS-7nvX7cbx6d+~Kvemd|#c$02Ls z0}<+D6I-mO5(yJuMVDj39MN}V6kl6g;fU(bW#Mho=F6UND#JI(Pb zO+w?>lpRWxJIV?>&xF>{ql?b!fOJgEa;wzUc52BYHjik>ivjc0g?o+Wvn~1b(p!be zMZpb6`6i+|m;=ByDEu#XfMAbq&<U(U$nTc93$jEj3=z?u7lzde#grX?9Giw7wovYl0rN z>=VAJBvvKN0tn|lxKP$<$~L=zu26wmJ9;&#iPpb2h7Te)m@!&p)i-oBR-8h%22@<* z$(t2RU!_wautiZ&LJ)Pb;<~bdFGFBN(g|3Z2tMR@2;8W-7^-30z~el=U)gC`8*m86AfiHO?_E$n)KOP*3^~})lhMi9H+_PmqjuPE*Q2z z!5F0w{MgQ+Qg4_@p(mijnr{!EAtX;3y?iYYq{kiM>JiOj4Dvd6&vzjRc&Tc!w6oQ{ z%vz9aq0e$fAGPz*4UNdrhek+c&C`m<3fyAXH?P*%u_~B>Ei*&#DX1uwmC2*9P%j#B zKHz4Rs0QS(XKPNC;}F#8btY+lvnLkFWj~HhfoX?*@qZu5f4}(N?jw`m6r#DBRzIFF zj$grLkVa~XfQVOrCLJ9sS5cU!$w!;N%F%sv-_fD%(r(_boM=N6*w$}oM^y~>W0 ziy)pn$C&PfO}dH-+E_GOm8s{NOuya(L=(5n#+xbY)U$?if!fdC>=%{&_wWb=@Z{33 zcyU9znt5Gn1i)n1pT}5^x7dlc-~lPn1ANjsJ_Jdw_+g+o4WLzSxeh=eKSNic_pd>v zBq#^iDlD*4vN2S0P20)(5aLa5veu1X?^ceh%}JnNEjG!Ztl)2++jMhQ3R7t(dRoF( zGqT>{?FcV6+K~mW-<%(oK=iAsfOX8Bus3~j;G2Vw^r_KuSMQE*@Rt~AxSxGaw;yv) zShZfX^;djFD&i1jepZ1%cf_xr(Qhd!f{EtqLk=-nEQodca-+Id?itix6!83sKuWBD z$?BJ#PJ}5Z0O>*yqDVGO@n&rNj@`mML_G3lfTGq|si80~O{#9a-Dh&}yeKpv<3)}GWavgV?6wgIy)d(Ce z*o8<>XtCF1HBf08*-)6u(a{GPPaumrSV%!$X*sBOp+~Qwjelx|AtV(hVFwuQSg?K+ zFAkx!fEof@__<1)vf8Aus$RQL!L(Y@yHQg>-4(tOR=ZIdxJup2=%TdH(7VCA-SMEy zYdyVu&+7{%FdIy;IL`(#v=1rlg61OxBXGBcS-iD?3>CM%HOsW!A%v;Q3bi@C?f4Z; z9l^9(DYgNV0xi$9fkFnmzK!VEk8Pg3L*s}h!HRC7y6dwd2Z47n2okuYWe8Wias zI2|*j!<P=B0BGW@xM65;n*C6!%7>Ir2O`9$^j|xOqN1lZ zK@j+=Xx{y&?!-`n%&?54=dff@ynUyrjWD!zr+&jq8wFPIk!x_tl5)n7=; z{;L({UD}&7bbr;de*w#Bd>V zuuL;ocmUWK(No2K@VUfu50oSFzi2l7SV^Myu{Ti3H)wLo2mb#A+^-+^e!(yzMbN%r z=-A9hO3AQ+!7!(Q2Uyn|h2TRpRWx>&M_({lQ`PI08*nz!bMZSU_Brs8v7q|C>S%$? zivvLu+!1=}pc^C-z5eY@RL9;O7Y%ET{tYWo3$vmU|mW2ouS=|=uELQ2)Q~wP#fb>;}D-uFAq z5b7$l3`SeAh4XS zR7kI53!yI(`l4lP9=71cXn$lQwrbavG4-rd$a8o0VY{KA^+KUwjTaS((uie~E+vZ% zNQ5h9A{n~46eZJX^z4z2iye%yVzJSZ>Mk6~rQbn`N))|x`U$+Ik%}HU#DAhw5HJe!}_3Qu2cC9R?#f}%_<8-Qmw8*DJ zP6(ameP)k`md0KD+jmhavC!>D~`bm~1SVx-v-Dy>3% z(nJ-fiI`Y{qB=VwoU1xhG9FvVWYr@~YuxCSxZ2lK?O9LU(gs29DL!Rav;1lyFEg{cvVl4U%yjS}8&9 zuSRMUimQFsnna7j{#6je)2T2agIauA7Ft7kw!K-3nSL2A>RssuDQZgOD~YN@zEqKc;4)G;8ytQ~Fl-T?*(B=@DJ@mT#E(A%WXNC_R!cMW+an$#L zVV(ldv=udrVwAM8Zb}NIxSv~H$^S**fsg-^Zz^Vx#QR9INDYU&hJHH|olZ!10RIZm zh6nG})5_i+-p*!m4IN+GqGV5Z>Z|X=#0!aMd+X_i!L*SNfW_J@U%v(JN3;+Buq7t; zazKPPumka(;0ZLXlMww~Zq9r$Uw!+nUZ7aa;a-@tnP&+sb(WWo=@Pi^X~> z*(01AbI4gJZugoL6U;D-_*)cN9y|JO$!qY#`?bH^LNb^*CV7q!igYQHA?!Vheu&YQ zo;QbBSoi!lNy(l=`1G{120_w(!ak&Bv?+PE=GB9 z3_O@7nu)~mYf7jhE3R7KX}hmJ`aHTuz^F+D*F%4Oyn#VFg3JUzM;~*6sr@$nwr!Tl z4oX%zC=b13MuR_xal7{oLc1 zvOK>ROQ0Lu@tQEt=xu(pKrw0g=Mj%cJ-!?UgHhEV!|_pXAVaAE;W(Z$L=;$Mu+B9I z{$;RTMe~zgzC{+=L>96x=7vcVe-AsCxgnKqR5AOzBsEv*I+k#mLm{F7AxRIxH<4hi z8pe;=gSFL(%4E#)-{v$Wa}^7wd^L=V^tOuEei)aYqM{J4!XC%Be733 zJ)RcqplkkZ=Eah~9LHCa-Y-&>>JqeBMNMH;EdxQG&e0dkiqfY%zM!bKT7S2I5h&($Zz`wfy z$BmxvY{&mA7MJP#D0j)8~OZnya0p#^Eq{nKA6T5ILW zMv^p?G(7n(2i&p>)90lI;DI-+x~5&HH9dt6Q?EGYP$j+#jazNyS*@oO*U{-)6sK6J zaVubB*@dB<>mfEH$$kjrZg*{!UUbu;x+2e_Z8KD5-?6}6lipR<2`=)YaPf3>AQ9he zj%z8~{4@R0nJDG1bUMr~W6G6L$NUg6TeUfepv@@0Q+_tzbF7ps75tuQKRJuIr8NgW z6*G4Mf&R6FM64N%`?@whf&rFKt9N927fC1a81YFJxLJeX9PZ7k7@15Zj9SNHkF5LiuTJWO z;`H2{VL?H#9akK>RVsV3v%b-4is~=--R(TKSD5qgJcx-~MHZ zUWGCU|7wrTA19XYEB0jmlQTy`GY3p0Klo8B34)cK%AJ;FkN#*4a)1?77M7phkEIPq z7zY7?SsB7M4sFmtib^0(lPb=T%T-+@Hg-sLnH$bl6ilRAD3A=vjYcR-iq0lMKyMPl zrW$@R(Zx^7jHt=0#a|l>UT#Civ@B6l8V52<%UPf(F?AT&4i1@m3mu__gb^I1(8SC( z?_AY~?~y|lERNMq2N$jelL(+)cM(*Q`&qa+3gYj>jKSo0qpE}~k;a1@Y)mU9FRqP) zLRn%;!y8giAn_9fF~s-S;s0z9&0O^7dAv+)OC}Gpz$ov`0kXF(XyoB#Cx3C=g>qy| ze@P6BxXP#oK!1lE`2<1W2=pT$jfk~GD|sM>8BFxC_C*G;tB1A;?Bz7k^Eq{sUFCI1 zAC26t)mCOz6jo=&30v|Ml zWS&)R34)48qpi>Om(2sqULo;37mLP#PgBYIAS>sPe zu8H*1jX}hnT^269Cak2pBELJTr;IOOaZ*rPCcFUJWpqDGy1oX1EWZVUFD+;wZ4y&a zLQuh^G)Y-eBubR_0i1U#pr{&?kT-4Y*+ihPg};<@1OtkUoFI`uuIei$B@wn7oxryN zpHGDFX-L=<^x>vR`7U7=o{wxQjwvr#Mh~A?*(G_Ve0!xlFbm$e-8DiPRJaQ%vocaG0P^zqKIbrlT_NjRJo2W>SuOlu5jMFja0U^{7Jy zD6)J(^`c&h*DaFb!r={Gr8j)*W+lhyv{%IouEVBXz!sHpwxuj~7uk)jBJmk*DC)F> zDkha+u6Q37>?x4B6Db%XtDgevCF`{e00JT7CVW7iii_Pt^IvFO@&aK{b&T-bE=5=A zyj(qnWvU~8)f6KHldy?qfpRH(Pb`Py=~S(%k_pq?7*lb3G1u|xbf1b)8wtejGq0Nx zCoLLG*I`WCVWg=_j_Ql+92!wB3Z90+u^oz0AYpDiG3v`g?V2ir5l~0XASC}>y69A_ zB7?~1qB{06awCSO{qz81+ayvOyVMVv@{aWArRcDZFka1y1#nv=aphiZ5NimdkLaDj z6s(e(Ch{tm7BB;9Idvh=?OC>ZfAgb}R4qnzl62Q!?#Dmjr3@X=lq~q2kt;}=1^!tX$Bm^T%TO4d!fp`E5fquqTi&c z8$;=J8AaXK$C^`>DaG3H4D{3&yNr`PV5!7DderaUte2i0)0d~!-3(Dn#mCd7)1kx0ZI}@ z$01p&f^8Pl(Dz`EEkH%8jC?w*E_{Js*gF^gW@TOvG-XOl|M@_KKELwANJbR5uOmxy;xc(MjH z+K|*uqX`m!(a*@(A4dodv^nD6GufPxXQ;mNE6r&yOt z*(!nNuw?Q|xluR(+-5Q)*X&W@+jq-I{qnHX5RQi0?%}QzggT`)3ja2h(#rb9h;`s$ zRIF+A$1%Bz={Z`AhZDo&4S!bO1szti3Qt( zPBX4FXDw5K>^MW$<DeEl$0ZM@wO8x`#z$QEIDnAIM!zEl4FR zyy|h5ImQFzvzeOhi3^iJJI&%+gRfX-Nix|@U%Dd{^<#DJQ!S$!?mFYyJZ>TwHGZ5^ zmieFb{g%r@Rcc+v!mYbU79#Lmdw$d7yUlvNN`^mrda&jU*_LCtdvT9D_Ytgi1#>o5 zpZIJp=e|8!oim|#Xj)+RRVl7Pan1A2wMfs#So>&>cIiqzw5A^%9UD0f6>VkzwQ1t` z?9ARywA#6lDLNBQzJw)cESN|d-srX_E)-8_Q-xV(|BH%#xkW>q;;D}GXbsBrW7(H9~b!Kr)44HGKrV*c+n!ZX9ymv4ISs1cPZ zT=Ox73uE>-&_0sc*>qGf-TgrK$pRKS<>#h~f63DId@rTX0-6$aPQV4GbeYk`PL*^> zdjzEy65p@C@oR}W_PG5_d#rdoai2L9{{`W(!?tD`=e zcj8~CJ%+uIez2a<2aBZ*Yb19$v0u};Fux}wZs>@f+lBK))D zmh!f`jnx`>l@>)p^L~-|8G06+7G4&zi}8MjM%^K&qinpw9VZ&J=&Q2ARtR%{g$QqQ zp+juplihub6LG<+!RT0+Al6gNQ*w1?p;3Iu6*LQ~39qri7mki|RxxprmJH0sXyj4t z-(6I=F)gb;J3sJwj*?@F(;=r@K!PY?H)riv5KW< z?$e$YYQENWH#zS_1(YN^EvskdebB{Ik_`Sbz(hvtU9dlXdr>w$8d}EY9kIP8f`=c% zwONPlOuAe+OrsK);wp0hAn+<(`qhK_i+k=+xU4PYVhYpsh|RkF0Za(XC3HIwu-*KO zAkT8CHvXrrgKwrDt$lnXBF=M?z(kGHp^?UaPsv{;0n&>L-Y6UT`|g`d2FIvIR}X6O z(aihXp~n{u`v7hAfJPyv7uKPf-CEW7M+)FnM$x^%Y4-(sD4u7oTC2Nu!Ls#a{}bDB zk|*-cdGh!iq!=U|zZ)ZIYH%nNJ&B2K zw)((eHoHG`mF=UIQm(ky!&Q|_ML&*Uahye3dgE>u$ZVnP)oXj2X zU?G}JsR+k}iW3coHVP4KFBLp2iBxoyvd_)(ph40V3E60A)S76qwIX?6sIq?WM;hTI8|b*kGi%;p%>X^cjLpB4qZxARCyvNjHjV@bfBVqixvsYzi56zq{Ipz4-YRWu>D>$p%}>s`c_>2DCW#7z6HqriVV z2WgO#M%uGjoY^h=xvJsI`}=+B--!?T{aGFx2$}qK z(uP=^Pe$Y+%cg2AUrA>c6~AIn(2wyh3P+Mzn0Xiq^ZC5*Ha0PiG4MsNX=qNGsQLU; z9-FZi(G(G%d);Ey)ztbrS$EzvqTjm2X?T1&@?@oIcHsK-0YHf7n>;R!zVk_39i zwF5tfA&C9ZhEkx(nE7(#0S9tGQNK++I3yNJ)cbi+o zX^QOBrZxs5Az!KqCFge{kDCL<-GINB^IROx_djO-eZ7LWdYY{aW8Pz@fQHxmz)yo- z_3sGJ$N()_MNe9fhr?ud2d3jp4%buB);o4p>OexV!N@qP6aU`#!@MtWG=EB^G;BY|90>9$}E@S;$ho+9XHt$(~LSQrmM=;Mt^V-LE5zaQi} z{J#kqJm0H$G`jBdk4$dN^pJ zl5-)eg*^CX+<#!COhm2^nHd@x=J2tp9%mUvy-T!k8l788ssS9!&MR(z5jbx78r(z+ z3^<%>V;aJe1qAZjgtFx{pu%s)4Zs?j;lpN6xTJ=iVkxa(rSQc%@~uePa0DFdOdZS# zDXD{AH;gTs2C?eHxDL%Xo4&IlC$Kd2y^dX0oIpLt$By!ylCv*wS&^(mcRW&5G+a1f zKS;E}2<#h9sTR3~SB8_I^htYb zfgucfv;j_PR_s!-Z@e0s#otM?qtQn05|H zHXvOVh{pfM-90{c7KV)-kBwh!+qP|QY}>Y-jcwbuZQI5s8)uVj^6NhBbo%r~JMBzg z^*=as&zw1D?zyhdcS&^nSE7@Ll$k5x#KA=7~b}?*coP16D5G78s&ELHJ3*F^N^v$C{IsI!9viE zl~p0}!?;sJInfb?gwp!YjmUHKLI>Pj{(|$otvV|Es0pH!ylJ(GJS^Y-6$T3q@jg|W zblONBHLpYXe12|B_oZ<{wJt3QL7AueYwnPXQ=|4AZiW1Ozi~tgo4j(o69m0cuw`D$ z!Ky`dF5S9o{i}E#|JH}*5r%L%w6nFhMFwj9QF`Ss5eEdUkXgn=)TXAnX&0GIdDFe7 zFieSbx1=%^2%N{nwcDfcjZ{_%I0z)dZ>J!0((rk0$=<59DIltz5o*P#j7)Zz7JU*f z>0aHRF%hk#)z%eKB^Q>?o~!s`r&C?dJM8qpKd^YImD{v7AW-|xI`T;Wl8z!bSt;%o zrs`$t#3I)tdvh)pef*P5w7=9P{^BE?y3^teRzV9fgQF1+12}<$;?BRW<58e4VE=)~ zAis_k-H5Azm@fvm&#vG-S0_SmEd$HJ$HWoJ2O~!0^;7u9X>`?BbWGec`5Myrq72t6 zu{x3LwN4xYzMbkVyhsw^7@lSmrcssTiw(TsHvA?js9eSwF5!q$=o%*MMi(B?C!prN z7OfQ2#;{w%RR#z_;G>u?Gdl1gHl0EC{l}V!{9g8_%|MJSa{4VMPEg0uQ$V4j8|g}J z|6|3;o^faH>Z*YOex+seHIG;ktb~qbUYZV=IMoq!;1&mRc7)mkVekN=X3~SKo1OS? ztTD)nmBgmHl>Irzkm@Bc1f~Gtbg*OE$)f69OQ-L8sWg&S4!#yiSd+VI|2(`sRHpjf6xx%O}Dq#b1{G>%E z+9p{A%BR<<8nsL|6PpQIk1Gj+C)~^enzhwPeDF4e-jG9m0sozULf{S0VWYAE20ZSK8Ys6Y z3Bw6~OS3N#@N3KP@-d|1Ye|@c#%5?CyPct=twrvaDL*Rl>QTB_MAx)9DJ%}fQmRePc45J zaHQ{K1nVKJ#Xawgpu|*)8*3bU_W~BdoYoc|@fob)H+s}EX{1U$hFWVRoVSStH%_29 zr1}HDp_bt73X}UwN9-%<0jIE0{OCtsIEG*vX<-zp@Gyl%F{a|Cy7v*51%~_3Okp_m zcIW04F(zY&y zRnN^7kwsXIB#!c2Nnvyk=X(4tM0hQA?_-F5QJ($@KHRffWT|}gFOK0Q|Iw8g-cKd! zV)fcf<)^Bl9b;vF4ZL{PJ9ksmNW{Gg>b^uDuM87FCiOOXx}wf_txQ3+7J<5OR!xok zut@uu4tSpShaF zbM>as0-=_ii%i9=0%NrBlSThQK<>I6>5O{i`ncpcF6qi}oy%&IU@{CA5l)Fj(EtNe zXhL4pUTxt~o*Pi@Se#hvU=#ThFs-J}^*Oq>kcuWhga3qp%0bU;-ZDJc9Z{sFg6>?_NVp7rCZkvun z*SUNhzMdP-2(*lbtI4Xa44A)&dc1D?sOf||?F*=Bjp*%B+l;)8F#2nM*THbPebQKm&{5N<3ryUQ`;nJ853YV(q23BG3H}I*9=DI zvTu_OM}*!z-05J~8}h465xriOdM3SQ*yegx!}uZV*9@cm!mW*&%2u;#3Hv^MrbX?1 zHuXd@{oIG$B$)lOPPDi`ZHHoYx4{K#8tqDX9V^CF2^e*Ad!4C?U9E;v>H5-|&9B9D z`X$BHg%AetfSU4f>Qo1Y(f+HIbK6`+6RT?bqUqZ9Wa~|fO3`iTy*q_egZjNkoAvM8 zdY{|*51^eoi)HgiUY~4wN6gJUiTz~&!%6#Hit6eg&@4mPxf$MD?`CZ|&jQw0gW2(T2Yfjt{Slv#2-G^Gso&4VKAeu}IXbU{3qz zh+y9pph6{0mA^q-Y)6oOX$l_R!!eo)Vt+=g{^nf&)UmM`uO4N*2cxTp#eB>#r0-=}2i$E};YR?ep_1kFhddb~IqcUlQxj=XNbSh;`mu;1JM+2_KT zMS6|RhY3aZa5P_)^3j+U<20=EkV;644NbiwONw$)0q%PZ|Hh2w+w>06Y!+g1|48tM zlf3R{Otrt{yJDJ22uk6+U$M%C*0S~ipk}xmIWp} zYi+DYaJmp=24{Z$U?`@yQ@8Tw?nuj8tYl4Pa zSfM8aS!+hKhPQO{bz^Mg%GsqLF8bucrR< z2JV5Hv*KETf|`zNW=B#pC^lw-8cWU@2Ii+0>_A3%tVg6CJfI*udU?ZG`ELcua||p8 zk)21NqzlGOYwz(hwcOEIubY~t>FYYvkioMiV{?Nj2k6KH4Iks#FoU*bwsMM7`|u;0 z!zC7-y9H~T1QQxO6T_rvi?HvLFqAI$fm z$f#3uUw&23l=FJ7dg;e#1i@D%4DWFNO^-U!rgw5@4*oQy`qEPVIHYKkhEeNE(d58p z<_zYcnbW40!){aX>Qd5f*mBt~%WSvMo_$>5p20X6VP^vE=3v{Q5b0o+!XyBG^@B{6 z9gmT7#oge-QlxXAaR5y4+%#f3N1B zeCvn+&yx^V;ssAvtiv}&x^+q}y@vMi0ZxY-Hn@g2?j4SUWn16)x1b7ZsGM7sgcns$ zI>LdD>k!s3DKGcmbQ^F5E0Qmf87<(pUODBA(r=w_5igHmbkJB$0S&;!c2zHQa8Hbm zP8aCAgwIoJ=+-;RIuTp$sr^n5%~nq`=lusR9X>n!iP||tTd-x;B+sko0B;|#nbgS3 zoF3MJ_BJ&jgNLuDdqq=TiluERGvAv-s+64rcqw^gTu4JRPst;!kUBAu$9XxYFOlm6 zD+_wfy^|*Gl>u)^OII;g#Um+`V>wrF3%yf5S2^dqk|2|uoQuSSR4$RBzh#$Oq^rr( zP5M(OGc*JD#ap19x2V#kZb^N`4oB>aV>Eb|E%Zl#Biqjv-dojf#S~7UMt8}R5A53w z4|Kbcr;mO{SE2(aBvv=+K+|jldmFNI+{&AaF1JkNWorm^T_o@k`-HdF_q}}P@h2O% zf@`}(%KJYF?p^k}ov`OX_#U$1PyEPh-a=b~+It-l%jNR>7OCH;6mMK;cNeW&ufj7~ zL?=QC-Jt=~bpJ~vD#u7cT^$=uSq}9~153nCw+;9o{~ddCZQmdu`M$QT>p6R}F01WA z(_AEvQY-`9XItBf?}YfD=@SOB-?wgDpYCLRf1rHGa=aE#90ojlL^D1b&}Y=eJi;Da z#BsP&LOBWX1eg{WY+GKal-z4fX-h3X=2`l(+ud6_pnvas*Qp6Gu5b{e`5B@;DmvO& z8B!1Qa2*t|u-n9S%k{-w2+Tb7_R?jt4AhXJ9rPKpI{E_da=tmoh`x(}-lnkv7Z-k~ z24AB+pYxjju8e%_#$FQzUs1@lt3UxUtY0ij59A9sMYjHxJ)L*HERSG7SNooOL-uQ- z&VUo{;&Z+QSEiCc8X@0KH#)&iQI`ZVMtq_RhmO9L3{MbUhwadJ(Vo9^j=ZN>M3>F( zrQo&RrgS?eziS*^e|a|d3UVIxGgMy;bRr9w8FWsBT|Kn@B@O(j%ecGc^}2I;i?C!A z7weTf@jf&B`U5Snk-+p|6WAQ`y-vp4Psd?zS}UXL_dxW}s@W^|`S6wed5Xt>s#)&+ z)*;7N-jB@rtS02A8Th+^_Zj&8fa=}6-hO=&kmdsPJSBU180lLxc^ljDy$ksw4Q#D7 z{74q%f593cZeii&YL*VQR*L=pLh79`<94a(|FW>D>u_oi`U<8JJi)Rrcp50v9H3L; zUpVjYN}$GiA)JGho^vSJ1zO<#%q`v-kOM;MZq@2TW(;V6){t zUh(|^a(?b~lpoMXCNKr>*hH>h>u=a7ZU>x2*j{f8To`sq6Ll_Dw86uFv3^z$*Su6b zC4I|b3>qdZeK_ne@y?@p)d^l#z*kJfv^Gq?pT7CbRdC$UF_InlyeLsUiTce_nJFER z8>o4EGJQCtbiU#BZu%lTRdD!j1jJjq+yWw_xvqv>?=oFlu7&#kNcFFBRyk$2_H6SNX|_CR zG-e!l7}NQci}4#g@m-a0jrXuTe73$twoJvAp~tY7nYd;5e60ZauRd5xWi@a4{^Yg{ zh|KhUKK^=3;rGk{D#Ekf?tDo{`W^gb98F+6j|`B3ulUz`1^D(((Q^FzQSqsH5$Sjp zWev1EV4^MPZ5Vz&op3U+Wk?3^tB3`%H^sKrYPc3h@IQ#uK6C^qiFtB>f7wU!M@k7^ zO|+RXv3hp+_HYH9%y<>QHZD$c#%9;{G4T+$I2=Uu{dN_SeG6Qd;>$hu%X{^(V=ApD z?YU**d)ZgdT;r5&=g{8>Awzqw%4=|zwy01d3{~zd!S+)B`OR}qSzki zEFJy=edSNhXwDGk?yzN8aitIJ=|{1xs}1DdlI`t_{7YKU-Cy%KO3PJ3R5+vN>-ouY zGvlpy(_?X5Cj-y)Z#%f>;8v(&Am@W%Az5g_!Oz@=_lAo}E%K}E!{%)qn5_F!h}V^) z$ox1^Y1PqAo7NqTQ-gJ4(7rX8S?=cn%IN|FkXA|5*c5*x6EE(`OWqPmN zxFwb9-_or!OK=>b`zJH@qFVZ%XVlx{Jw;{E9>z*^1KA31TzXap#@_mp#s1d$+S%Ux zVNB^%r2^jU(3)+xZ&?EW*iZ14ssgX>IMeLdZ)yU{mA)N+JKRWmQ}^_Tt@QW1{@Eq^ zYk%UAXDMK&;blx!8qatBkY)GN^Leg&KqA`B_Oppd)4D38tUq?lPsl6Hv@XunU&OJs zQIO?nfj|EuAeU5VRH|QsB=A9#ZT{_NUBpcVpU+IJkdp@6RkP5xgX7U9zMCFLII8cNKz3^}|6Wh_QKf*c<^F!YCoVK#RIyuKd*cn-!0!mYNKG#nxsQaF zfqO~QnF~*ITAqr9Q6Z`Cl?H(c)m}(3pc}HMy)N6qP*3f|r`t{kT7lq|*noY?pH0t7 zX)5C2jSnfN=7|WIn-!)jRL%bWgNE`E`Y^VBkywc|F`;)UtOYoKej)Z*CGOD!|Fa$6 za81EM)8_{Vh7KX`I>wI%-ITr!rg|n$1SM{JSFdph2oREY2uNs<-v3z_f`tYA-_SyM z|0`MukBAH(ADa*riHHWDn1q6a5SNsS{y)<~v?Ta+K?3wF>WZ`LDv0X-kk^yu(o+@EGqTjTGBA)QHBjI*&{j7#)-|>^Hr1B3ASAN1bFoqr zvep*0wpF*bv#>Ezbu^H6^u=`25p~j$aq@I=@(pouFmScd@-R{MG?w*dNgl+qvbzt@Ed{<|*pAGA-(Q{q4xiw3;m;o+Pa22`$oIE`v(RmMnf@pMzYCtoQ#u2X)?F# z_3qStijtggC>&yTBdJmd=}$s^ofR{c1iTW`Q<&tcwHi1_AG5CItHpZu3RT>mhtkz_ ztrbCaxrd951_`C6wn{ff*$V9^Q30*B`t2<0HpaD&_A}Ycps5Ibgcj<vs$ zkkkc=5QMKwrd!cbMAq|JlWNiL(Pzef@a>kce)iUXj$D$FO}nl$J|Sj(PTH!e1B+IC%PzGM6agCxyumf5PxT!DyVb39+>DPzvjhoBYDZB zWt4Fi8CzGcb{!If)SZBh@dTT`JZBJK4)FxHZCWb-A zmijSd^AZH9=55;;#5ip4I%f>w)`fw6ye4HcAIq54Gu^@I#fXD>Rl3&1NLy*;=iAu) z81}g+DC8-csju{F;yZ2R?teee+VI}7DvzAMYREsswY~4I|B$&DDoKmkZ#!T`pm141 znnfR})zLFDfryB$8hXj+HcO?Kl&t7m@X<0HETz>}E)c?btF|yVmSQOe8M(si$JOc@io6q*J>?lYtzx5&top4-L zqKf<-thbSUtHG%RSJ6(r54{(A^L|NWRXGJj_&sXDv}+f7;x16FpjjeIA~}Y$g|ioI zg3!Kft7h+2M@%r=(8;h&t#P~=@R>1=6+)QT+Z!LZzi{J%RJl>ULC<@VH5SlRq#YTr zex53le|CKetLs#$Mupg8s$0R>>eEnfWqW1fIBBrmP38D$nCzG(FzWQV_I8FD+3~5P zeUbO1jHbr;{$Bf=faQAOuFb93tb!M35`Li~<0Y53nlt5_EUO#}lH4(m$r*=i|3ojc z!*ysTxU(y@(}uHa2qq%XyLlPRP@`^<22!a22k-gAwGZ`rUU|hj_D>vUqcy`q*mcv^ zomG1QQbcVK3+krP;Y#a0WF-@F4?zd89G#+X3OS&J5AVu?lkA>{L8tl3NS~ggf{tM_ znv>ve4}3kIi&1z)L5Q#qe_p-4sf%z8O_;Ie0SK?J8^T2ik5{TT5lJj zj=Mv0`raw*#tcexlI`VdHZ?xfxOCC87k?eeHz5v>KmcoO*NizjWYwU#-=mhl8Z{}5 zKC!kCLtg5dK0~*cWc?CVYO#qWF<>_Z%aNkQ-UB*)LLNIa>bNIx?mA(@86F8kdr&}e z#aGoe>)=~bxSPLPX}z25LJ$&|gEUtupiWl|k8uX4wR&9GHb|jjhLxwr?I!jXr^XG> z!>zrHTKt?s0MLJzjrT~+p`}F-F7wVYo0=^8!4gixNzGuwi zt=FvGM3}Tvar>z|(HN?f2sc&$T)iZv(3qPTqci^XgRJq?qs3O^GSRQZkVmFd_L@ea zCU&?0aiXn?kQ2quoYzRMh*!WhFEtnbIg8p5ZrW>3rCf*sK|zD%z&D(u82sqrF9bQMEeGHF@5abi)v=xnl5DiNH5nJ&yT}6D_uykHK;%?plI0 zEJfcqDtqKd%@sKnyred8>u24eJk=6*=?=&^YR#*kH3VChydK6wWvu?q`QhVMA=Fx< zLhY@CcF#)7`OoYT*IU!R3)0l$)}9>o{U?Vl$$7~;6AE9(^~H=ISjBcWLbaMBVQwSm z!-&>@$*&casP#7DGuk!7X-+7wSHpRK%Z)QIoufmjKvXolil80toBf#G24Lhul<$eL z`E_KucvS@p*y*b6%(anYhd;&C8>#abzY}O>|NLx>8!4?3=6PwFwl7D(%H9RAWe)l3 z)QO9YHxt7;7nVOUI$7Gy4<^4=an=8@L%*rN#H5{cENlFWil+*`)0rppT7L#XFNsg( z8VOhDtY>|8)<{SL6hrw@myQ@K172{`hb>v zBAbxjuG}Qbl7eGPo)#Y;8f>wzu;8{guc2e8tZ26>9Iisz-DVfIa#0rLHz1+ru}q6k z;%kC$>puOf5jVf)DUnvUsvkPbCY>zV`)ylsfvqL%Rv-Ducj@j3QNknLD1L0};Ab0R zGXKMqWd95!g`*d%(`Y(y{OeR@{$oS?Yt#BoUQhk^Ml#Xk!;(%GUk_nt4*e@dHeRu+ zy;70~sn|uSB!fI<_VeEG#XUebuaILG8zO_+O_Pr}op2{o94me$&wlueK{6 z>upQ9z&=-g!-u-=KQ0O_JBD)sGE(oKLkfSlP#`SCEi_s#p($#h^h<(}9$qF&lN4u*5dFEc7!ZZYP3PF{vUfxTRd2-;;fcpnQ~|JrSeaHdg}FN<|Lc1BqdL8zV^G zOML!hXl6^%lYw*Ga4DsvSi)gSD?!_cxH>SU1cFi%x;QIRTn1H+io#b~`@JYuOS#0R z2Y+H3J$m@Ijr;hg+p@G9tNpRRD)E0Sch^26{l4HDuaFA?7nxr7ircV23HMwcHd%gi z`CV>J2JKWtp(T{5Ta+3mYsJCqhGh_?r;+YjSrP6sVZ~}i0PE)dNh&4pVw%?&RS05n z59|nb#rD@ZCxoul7P1ud33Er`_WOLXu+h>_NH;%$Fnk~rfEkU7xv)1$H#XyT9K_U? zpD;LQiw$&vb;k;xHrMB+)|r3`YLt#1I~87T^XzmtmZge~J+mfG_K4zkO5|p4Q}eB( z6z{q8+|{ISs&u>5`00D;MGX;Ea4Bub;fnktuxY}-eq24&lPc#T4z0}Or&q+2Wms{N zO%Y6jLWO=7jCv`w>oK<@&SvDT2KTau$_%D23Kd1^Xz&D zty9B6O5f-RKZ$S;qcl-*HC4fkp9Iae`&tRG+!|-=GNf;Stv87Pt6<|!SWfR0Dd3w- z`9#tKmLyA>dmTEh@R+U>WH>>W>9A!CO_sw-hg@e{Y6n^hWk!grXI%Ab!~r)cU33Va zb!u=Yc|yA3#&Im7cA{&0+`?soQe}+Gi7j~;zL`}LDo>JSsVOnLWn`v44^IN+*iYDZ z{AY_m(rDIYa}Hft32T~!-=;onu)1<@YKr7C;a4;f-rk#(5qA@w z;MQqlFD`Bo>3yq-*jPWA-!pBmvOl2H^s}UqCf&v|vso`>iKJuBHzKsXn9AEMT)oX? zWc+W^;i?Mxr9wUSu)H}lVp_Gs=FzhTV4_CY(hIF(dq$<|$(2T@vap__#DUZiVx0yC zUG{|I@r)Uv%o1sVq}izDNs%&vGpo77Z%z+s88Ka%9k0y6uqGFkc}HDrC#Lp1+_G!d z*+!i|RIPkJy>+!qGrhG{>s);xE1lCaiju6tDbel7u`}9NZ4HbIE{2?Cr!?a$Vhv>2 z-YE->+ycyf-v?sLvOwv+l3tJW9MQExad5zE=UF{OtQnOGJHQb62vVz_W?Pam7@ z3>q0q=@x!dxL9}8%7S&ryVR;|pJYp&qzx?-KDc~yZF7U|I9D(2s0`ogKb(CMvN>9X z$QFu(V}V+og+|ew4pAju73u60hQB0r@vm8DwWI@On4JEd8m4)HRD$4EwIi(UE>u<= zScW>BE|s;MtB+j7t4PpxY^-c$-eZgzk8itas5NPE<8-<}wY(!t^#M;c2&GLokN@Rn z!YVF7(rCfo_Lxfz!QblcFR(d-YpRIi*&y4MZ4iD28x7&@RS4dVE!XwJ+yQCU)pn9L zUT`_L=jlijDeN>&(OF)R6=sOM40fTrQcq8cp!!I-)Mv@)a`Wf0%+02(V|Ia`IYX1!KF8L8UL@uVZ(1X@!!25TO$e=JB$ znJ85=%&9vVo|hnud+&LXqpgkdPGRnKo4#6&N=|#xtK>>mV2nPD|co2ZgsZzqXY#UlcZOSLtCS_<{ocA5)8JiT}Y)Si-oK4__O77r#4y^K&06nJ5}u5(HxD_{+``$9Raw*Bk&f6 z0sMvDRe{+t$&FRaL-eQ7Nqr~g4>8Ng&(4P4K3qQ zGvl*u-Gg+Z6@4Nv%liCKh6w+T;31%(=K=`hhVbp=N#$X(d`BCp2T;yNiQ*W6T~BRB~MDGV*$GX z`0`*;E>3kNK`SwP@eu=p69G&{IKs>jT8E>>!H{D2(_(`IMe=dIjbqJd&}hFV-25g? zgCP6qp<+KE8WCo|gCSEi)LWh>r}bKK@Cp=ewBBHgxi<4uZOMh5KsWgTOirM1Ll7hg zFknldYogF_MNlb;fZbdS4I{7}Ux05RI1*riU=dWX5&B=fSil+PnEEc_h2ej|94^5TKs5_r!Dwx4a6qb=1w>6mmrG~-ffxU&z`2d}bUs*Q@F$;o%>Ov-rQM1TG%qh21hj?;&K;K>Z} zxCj-3*Z-Rz(Y2%tR>kM?T!s0(+I8J8TLpo|J3 zXaPs*b#14&?NBw@+wf&C5s~s=)Ae?{IEv8H`l~qp$GCTg-9LA+mCwu-pbZk&Y!IRS z=MLaS=2_zBIRsH54|f)S0u%|4H1_92m|++VKwv?)_Xt)u>`xSez@S0FH|v(HzE?tj z7;c~>w5WU3To=00{`?E<9tRwOLws#;JFSn@K^-HWDEEQDC+*?ypQO(%nHzwp&Ml1g zfg&71YU+cQ&+lpjwvijJoe5FX^8pHtd$Np6YWZs}i;$`FP&fdPUkE$nw+qZp#}0*8 zd3h&t!aF$rU~q&xM`V|R8E)j$!xLkXCf8=gHT$kj;Lv*uop~EUw|g@V$4y_?`g4G{ z+gk_y1018{rtjUay`x`@clyjH(2Bq6_W?Hc+qrY_bjoLxi-Q`%hx~UpIs04iBw)}e zkSX;57N?jGys&Y)l)MygZuo*lk0}__Kty4u;qI&|e(yDZw`1}Xm%f((Zvi62I!%q6uq9FkGZSvRIzVAu|wqfTVFK2Hli4NiJ@34~QiIlHi z;sM|MsMPn*3I%^=_O`X>1{D|=J&2+E^4A!dZ|W8Rboc9j1VTjagO%tKO<$Rq*emrEs+5!CAS z|CACe>dZoe;oPn0a=Ba{SC?b)MpcTW0=LI$wNxXOQkgVH1ubdoAwHEd-ZEZy>(z4Q z$n@Dmu_Ce%%NXj}L5x$GW&*KhJ=;Yy@e~RPN@W=rbKP9ahw`t&*I}d@DabLFo}gd) ziSPv6PF-_H174nk|Z1(k8-bH0;-tE&Q4B3_H~SV^mBEeD|0qs_nl2 zZW(Mk-*s3m1#$@`ZeZ653oLZdKc9WcKXvG=9}JjV1Ht^_c*7mKB(S7n8jm@51-YkT zz+SKE1mI3|tl~)W7q9z5A`+#Gs9?}#MndA`qOpkNPbHw@gIpgZ4iQ9QV_6!dqeky~ zSDc&R)=X_-hG42-P(j~rYNd1ORZxYgEvSQWIU4 zTPL;wo|SRT;Pu-Dp7!7|GhS;~{j!peV78NqzvprsRp+DiMPi0K}#^FJsiaUF0x_D?^U~gUP?c ze@7BLgHLLCNj0gQhqLug1$=al5JR~L3hzwg^%qJQqy{;lXJV9x9FBfVs3xNnV^tDH zwlk2ELnDKO4!Mbzk4{DV@Svu{(-wlKx(y|NO^M*?Z%u1DxCqP2M`5cEfMDg`z0vO>qhpJ#JX>=?Jz+LvbemCTEn%?WmWV$-hK9OHdgNp=&oo zl2s;RH4{fMSfOFES~1f{?W!HuN`u8^qXc>LN`s(GfXyCNnn99)8$v-ya5#*?ZIBV+ zHFYFmy;qUBHjTOeOnP1MoA2pVrF0dF&xqa1<}!ww;i z$Q-k5&%})PAdXQ^CBM%%>Q~-}@on~li6AcQOf&mYml9?THnf5ILof`*wXB91n{WtQMwydFK${m=ZxOc zRs^6mSY;*OQeG_&F9P{`qd*BlAuF%k-?H5bHrRbGNhiI`5Cj^pP<12W_qihpfrT1kc1t0aagK%c))AlWb!n2Sq) zcHe0TyXFJ@Vt@Wuy`q`rA55q?-%B<4-C;<|F7M(SZzF;l zAgUGIZDWpurin9X8AbKJNOtgNvdn*8U=4jNzWf!GN9Yy0MiurYM@RaPLokOz4zgJJ?L0V*G+R8sqI^h{ z9%>xl&hl!30{yHxcgq~Jq8j{dFfgI%$OvQmeB&kzrul=j@D_#1;~f@Yo_6|+1L`_Z8A z{UQCs)>N0+Q_99tyi{6U0}?Mx3^v&7nS$`G=;bd4{Se zyT1LAbUhpC)+%vlS{U(HABihB5NIVBPsanL7KJe@c!w4y|I`*16wbI(ni>qx*di$M z7fsX-DVc%MN5*9o2{aVLOoR%i2tZ0AuM1-|DyR?xz*=GE z9OmT3A7ue8TLvpGVS_1OiYM7kvPKuJY!QqAgn}9c6Z#;>S|QP_lKeapYUdHrkP+h* zMZF$IhZC2ab0R4UNn04=6F#Y2$H85{LbkR|L`ENmua=B#84Laq1>+3rQ7ks{Ifeoz z$=evh*vxRx)5ah(#1fqa>~tNuqsAs1LCW)O_!-9#j02meTuFcp?mSya(ix?&)D4kM z0~C?ckeT{2o$x3{7J5X`A(xg}u9kTiG|1^W>FFuxm0+$$y&gHA+{l>mV4^IDUq~eZw6`Y>6eN94sK}C;d8fZ%ku_}Q?BH2>VvHe)`}HDPYUj% z<$v#yYxI^vAd~28o%u$k=v@IB`Uhw|Px#o0b@Pq$kx9>sOwvz=gmH(m2g^>!O_#?_ zr`n1^;@AC}BITwAr_$o2WG-tLEqJWNU;SWbU&bd}fhB?o)007gWd>zr?i-omIz)x= zf#oW8lEDYaW&Ldf_SV)LWv44wrrudeqDzCGL$qLcDQ1N#h7kAG$F+YQPt}99^`T7> zvC4)!$umXGvKvKD`%R--E6$5FJL?oixyTAkQYL@Uq8JTcsvvoP7R=++<;p2#6tWgO zrE~BEgRbUDSjou^j?mFk$K3~SuafJ}z+1nI?$M!|%tRwDGR5gABJL^2T`T@#A8KWh zwQ^ac=xoRMCGod8bYGp( zQx%M+rM&$Bju6ekCoS;X7XUd1!vr_hVm2}1HCXUba&k)XD|>>8eGDIN86{1Ug+Wbs zwdWnKcIfXSkb_`$8g=O{xex2925Wafqe^ymiiiSY)&-32E`>$-4BQ?fiAs6yQl>+)H6T4h~7 zZE*fc%C-$kzYRus0zR8Nt(G^^HMjy35^qAW!rDAt#52@~&M%EkY;hDK>#pVUBbsJU zzTS);=*!vzx3|2*(moEibmk|<<}bcNTk$>JkeN$7j9w~0vCy?WaGN8?Kqm7?uZ!_% zGV&orSVDGr7KPiVdrT!x`dEdmZ0rSlrlb{%AZm^2lPj)r2_V9adj(PsS|czhnyCX@ z#4#5MXc5}!%biAs>#KnMi)*I~rUh5i0zuY{uc5J~{%x)1qo8f71NKTrCQ&*J0jC(=mcp5(G)yiXr zR1;3d{F@TF#hUfm^S4SO%UHcDoT!sS&TURC<1q9ot{g2&Eu^x41S948gdgm1XBDm& zXg55Dp~lCi-{T^oHjKDC{<95cM&ZI-hT|CV>Ss-wy138v`f+N#N~^d4Du7FQlHoW% z%xp{|HCyAQxv;5@!>nclk*RX_M_&@C)_r*tM5Z`;EmUKQFQNju@D9kYIbaX!1lq<{ zHHex7#~r&U3CH&CPp0d?bj>0AGzg6}esK`={dD#Pm^v*R?xDZeqMI3(;ODCYTZv!4 zR&Po-U-J-n_tZxV=6rtrGHj>>GOE?2#v{itUtgMAXtIw&iccAU#d=T8qlUIe;tmoT^=L%*P5FR{eCghRuCH+U3n2W0j@)i zVR#&c|CK;h75?VuLbqjsB{%996;@N-y%f!T?SB6`PKN6@h;yrVl|c-Bmo*pZky2~-$k&^B@YDVZ9@6y#t=Xl@?T3AP^-mMvMIPr#66 z2Z~mRKCf;L^a4jFv|){~8WNC7WjKr#ENAOO7jT-Ux-GP~B@gJ!|IK%$9S$zo2+EEW zk0mV*Z%$mNV6ch~Xl9jiGCd+D$x{N`W~S?;gS=LF6)YyS={`Tb*RzJno6eP6vtqfR zZw|f?Z~ND5>YLA%MY9Rj+wsd6$d>OypHina*I3F94FN!^G}^t2bhcqKjIW8p?a_2G zmR6?A?N-~G|2P6s2~r#?B=v}9%vU3l8#_x4nL&^g<=3J@rQcWK17ZzPnrNs+1gR9S zp=+~B(Po0PFaAOb0fh>0;sEWWf`RD76=>LrE&$kHEg#EFncYF@^TRkke9tcQ-Y9AO zQpHnqOS_x}I41UM<6(|xsDncYh}{iYnVyVFwe-qKFHeozEQA#yH;G7K@_d46p@)_=et z5*>H2+nl$(^)6`+*{hMjL-hac3N}`NAlqU1e|cP=FoJ_gu1V*mf`j= z#gVBWTE{3t9L{=ibTGd{I{|ISz5zy1n2$rS3xgX&q^6aE345jdv|10bfC+Omv&+TF zOJsKHdxR-Fe&3|)bJ4yY30+pSLjjg=5I(V4KBz@LNa{UtKpP9}Tah<{>T-gY)sCVMagF?qzhLPa?5)Gc9+gt%2W$RaPmJ_hp2)TZD@p9gOWb&%dMq{Y zFkoUjDJ&!#Jb_S+?Vjr;@6B`~;wK+WXl3985&V6u zDFl{$)q^eE3>6)mw6ZhAAj2Is@5tp-7_mgpI;J8$-qe}3Q{LCTx&2)Gw^cg z=4h0^BSIT~`I=o@a<5RAV*UDepdqgk9zOLQ14YN{6KcIfRj8*=KgV7sd`&_VUkhWK zi9E7;)4(G$|GTn20TQI**LzC#83 zqfx0=TR9b`MPp=b;xybwQR{YLMMmy7kOsogYOp@`4~mAOVE!!EaXGcXM1{t?kL=jp z0}_#9UC(tm9zo<0CX1eCkO=#SeQ_`$I4;D&urk=f6t55zfl(+fhd6T2^y|%*WcU8* z%h39T4B@&*#F{4gT?l-4(9rNE<^2I_P1B4Syx$yC zj@SEZ@K#iXQm`t82V*Fq0(Ou2mv1e@b4C_H#$C+t!}`t4dlsu^khi-sagAm;)W~AQ zX5-A(jEXP1-2S)9S@+4jDw1DgPUH)ts7_yr7W3&zu8nwc z?r}MH>?C28Q05`SyJ7G6;X|}jn16yP9unH(oh7k0@shq2@*~e!^FPn?NBOW^^QB$_)1rokbTi~HOYe{f$6vcS@E$fkHi0#O(>p#O&wdVa;dx#0ee?4MH zijOl|l^TsN!x0DmrhTrqO{+k~Z&@>hvXpenv@(%GJj0d1usY>|Kw_`2m%?S1*T6Ik zkhU4XC_yZg47q~74esVU9Fr@}M*CX<1C5#3l8@e?FCG1K#f+1B6Hj3Mq z#S);8k%etO{q1xoU=gjJQReRWih_VI_+*Ve2m5^o{TUXYjiJxCdL|) zJg25DspX-kaI&PSMCi}rl*7wmIHL5!+^xD>|7D;OAu5w}Ded!}ITD<>I8Ph@&m}Pl z9_gvJ*-R=uYi3XeuE%uP5^B?Lhqo(`!KMi5*eC~)BCx7@pUjMJfY!7@kHaT zHb`QB{suxOGsFb~bS7bci47SpgYu!GN@Vnl8lt}kf7WUM^$FFXnZ+?E1n#tAdnNr) zu#Ci!xe`!iW6U{Y0($9b6Ptw**V5d*+8j`dM! zMv0i&EI;N$_oVW~nNt@>|55Ww#;mA+;!)Q(zO+UbceqeC*c+AP-TQ5%%oP{@%7^;%!Y*Dbe zjTn9#qH%qUaFDnMZBd`Rs1OE<18>egD|9dFBEBQVBU?{V*61q3g$o-UruYWZ5`Vvo zryU6Z;%X=31_Vp_L-JER7l*WEx&eb$gX1ClGPr{1p^%P0774WGgjV4YCCaK4iECt} z!+pnO(z+>0R7g_=Tbt5L8ZCwX$;?LB9h-|OQ<70RkGa2 zrUcM>5<=rU6QU@{hu?r23&ovN)N-&|_!!Ff*cw71>(1*LqX=UE`47@@u*(9ohV~>3 zA?m`+kkN9*<<$A0blX-jfQ!NB!uS`vfCOMiV&<@WYZI{%)@ z5=k=Bbs}Ywq=|x>F8_|8tzL`#lDjh7fU!k%FcQ`BmT7@^S(@cY2I+Hgy!%Hr^3lOi zuZjI#YI3tXw#|Qm%D-D!k+Y}Spxa!_d+T!7Gw*2CGeP;s-qP=| zx)kGq`$*Wtiy4p)m<<*)^;zcK5j1MBKarR0St2d~LgkoxGi6n)sxCk&B9L4NzUMra zo3j>e)&+xj6kgS1LKMrY3INcs;v^H0R~LIu15;?1M>l|m<>KCta@S^B?);seL5E$E zFUchBXgOygmCd=bn)AKpLM!3cV#PCA|BVAl*XzzQiIdn*mUtyI2cSj$ca%Y&dssv% zax(&84Co8IwH@rHztT+CacR=aL=8HUj?Ww-`@Jc_SY#tmpSfgO3z0}lY>TK}kZV*C zYZabvB(CW^i*K!PGWZt%uaz#G8LOr?4hSQ-qm$kyq79B%V=17w*U>gJubl}%Wg^&{ z7iRAFvIU9JnMF!8WjH{m=cTD@)OQVH{zLH)^F;;PP&X+HaP&SXh(h(1``~U5IF}PU zR&#U9I=3blz{?xSl}H**Nwyb5`<{NP-;>aP+b$>(&O%rB=UsT#l-N|(eLnXh{g~uV z-WZ1b5u^u**s{xDBY8k7k;lv%t(^uzo_Ch`6zYrOX0X^~qlV&<6jHdtI#9|Ms_(Y$ zyD#d1>n(*CiEiSPtjJA4E_3{#fGt?_#u~S9Qg;&upr?5vLJ;Q3ApBmDO}?|4Wf^+RucB`Xa5mh49&uo_78a|7m77%Mw(Ji&j3 zIl~|ZJUBq!-wy2|IpNM}(F`?jmT(&`Arod_;yxy=$Uk?afe3GFr#0MYd}6yT9RP=n ze5A0Yz7>6J3_$Q3MbIT|TaC`b(XP`_MJ_aWDOv3vz&C@Fz7@eR*U@e@i-$HzhZO*& zzNkZBXa<@|Ltv)r9teo{2N=PH?jp_@jk}S+sfL4(<|8ZyJxgHR%shkZ*@RjlqWI6-8xcW=op19NJ?EvOp{nZ?H;9W9%y^GH)FkcYmJS&N6Kj>=ay2$t#}BvPD-8fy8&nt;5azx z7$~I+Asu+gJ2+Z#CSrG02>(_nTT3q2N`BZ)ERZy zrCo3$542p>ts|vSi&BXK7uGUglO*X#@}HGQe#a+%p~Vy!=3>v#RC}dfvE*hkWD~Ab zo|;BpmH51+mfaGkWw^#%on)k+r*ZD5_vD3Yx#bZv2Q&gkU!!f~y@4atPV=B`lL>8YTg;acx54?hrE;}@su=%Fvn@SnA~`KzZ$7xuO&P~$qW>aB{j&C z0~5??NyIBGeUM3WQqO!TDdLf73$Q8+a?8U6lQSo+lvRV3Lr>rmPNI0Jix?>+;kQ#o z&A0?4(`701{VL1AsiUy+(qk(;L}^oa_wEm^lbjDa-SFZ}aB^8S%mvC51JBXXtYhG5 z3lkI4K8-7K6U5f{syU0ZApks;Hig?U&zlvwot6IEG)wOvd>zOD^#5q-0ne@J=+&nZ)d5r7xv!sb*<;# z78cp1l|(Qn>BvshGkvORUL2JLvM7GV0L2n6}K|QKBTAqHkTb< z=rgFc&CP}N&l2AY?JRjotavNKx2byeFI1MxJFjiV@j}OG5A)9Lcv>qYa&4PcPe-?{ zpe(FA4Qb7{Y5A6`%q+^jtdLmQ>ZsHU$wD&DK{`&XnyyxS;@r#V*s8kq${BAO<;(=_ zOZsoE)p{1|=(ORjex;K$41ZWLYgFymb?Km&>3u#4XW*|Ycx@Xv3sw!U0>0IfIH1iL zVhIUyS>tT{G|1rXh%7=e#sVQ>*>j7~O<8rPM(JkFLZ5 zCHefwosn@o6ETMOh=J1H&~SMQx!}aR@)E0RdGg}qvr^0#-QwPyShn^KtJeSX`n>aM zU9h%{0dqC;0u{~hmhg(hIkQT%W-+!bKlQ|NJNrh|ZX1I7A@z!iEwt{}vi0d_l_MqX7XM9rXtg+!`Hy?1que?tm|C#5Di2+U;=yXSC5FH5 zHk`{BCEHBL7WChVcRV@j(=bl&DsS%dH+*<)EO_e=1+6y>ccF7DKXh;AHLIRwf24?- z-?(3QBY!*8rS4lVFLkophM{XwWKz|zIA8?TU6xkwwlY;$GB>>utUK4c;T9(LTIX#u zg=n089v5ymlGZg^tJ{#Jx!ogwE)|spzUFd#|2mPe0S}deFpn9& z@0M!oy!P6PH`DI(`j%Aco-C+tt|k70$1Up1Fj4R;J9eAWZD+ZlOU!@tUV zFZlCaUYqG>E8YiVG?!8Vts7ul!vSPH_ z62pu09cR%ao#mx2yfZ?O-TJqx#?R_xT^0{TmlcyH3(ix)zPgdtllJ?^HA6E1iam7L z{5BdJw9Pf66z#5|J%biyKm282E}iBNj_A_cy-^CGGFD}^Cv}7eq9|N`J)0LCjK3mp^E2)>Ivuj?1HCIX+^WS$@=U znJ8VRw!H6C?KalcB>r2yr!afwNGbIQ_7VP$0W7)O)-sX~7?2v5m9-asM>y&XQ-t#*=kEp~?y6 z!_2HyZ_RW;8FkM8?LsT*MBsqU@ubmH$;M^O`C-2hqN*x*lrjHYzZ9>T9-E%x*SW+H zP330`&YF`dtckIyX=epvji`s42OH-Klfy7gGJ*R5<~^i+JF%G)ow=l5rczrB2v{SI7X z$(TYtYH8%E<|6Hh;GKefKy==Vt$$mY4gxd4wO$QxTm|tBmHSRSIO}r)@xnc7ocP>@ z5b8?5RwK3kwj{dmaokPvdl9<0>8HLVcX+*(i7xm!urluXpy^ zEZ(Q!N-?=9Wq7W*7mqVV%@`%C^tb z?S3oN5_sE6u;mq9AdcYJci00OHWcb9cfQUC@?+71^;paf$A4KQbdvR&9^yofj z_e8VzZn`+61y!yR2~3Ii3T)h{w($q?a$jq9=FPH?34R=Ra?IRNE{L@tyFXC z$9CD3b7_Bjg~acW=%h!B0%htoF-UclB{^G0^3UQsJ}$Nhvi-^oTEtcIu~AHJjAw&d8IM)nOFo`HAp;kK&@%fEdZ?(e4OU}fR-c)Zs%3{D}{Ri~?oAKZ8Ym3z& z_A9N|XSv&swBC1oyNfZ;i6GbO3*W@5HdCP==N>|7O}E8aweL~&;X5sVGG8w{?I!!K z#QQ;GJ|68&JX)aa>OS_ifyNnmv%TRi1{OlKwyF;a#60^ET%1)bSocmDTXH)nLwi%`K zOgp}tsuZ>Usq_}l<*Q(8-CqHHmVs=99A0LtV?W<)xVkqFe;sHDR4s!77MqH&eX@B! z8G?NEAUXMh+S?C2tX>4#nSOb|yH8Y=ybp1TzkfQ&K34^O&Yv{gmr?h8zI5bm^yLXv zgjr}2y}cGyb#c>L2xrit73e0jz!~Xp2`XIh&9kp~WqT;;UX}?_&s(RrY;{$cw z(RIHHc4epXH9fe|MR8I^y&EKXn~429rtN)~av8c8JPi}#dH)Qh`s@G|v?L{rJ$&#o z^5!hMn5kKHR8ic^aVmDPo6wcF%Q@PV)g4WJ5@|MCQn?*!VST3c{ItbQ4}H!6dA=R@ z-Njwa;&;#f>Lya6sh~1;6l2z|BYPtHnD(O2Sv)I*Y`IA5-WKDRes8JqD>_weim2jj zv;FrT>#iqM*X{F&6(@v?WY_rGJ?qmw>;2K7^!W(e7Upw#FJ(V?%#p>%cVFgi<@3}b z)DBm7Iv8dF%5s~Q@<^+B28kJ+a9z@e{u;XX*@gF*0D;DBb)q|Ysk%A`ox?PlKl zU;OHAJ%_h0mpz9IcDxFL7Sb#-eZE*x9=a ze^r`KHZsWZhV|a^-(DIkzyoxt*|RmsS-j&ZD&>+WWi~C9JEW8*Ycv$@_O_#6_TDtp$bGHRXn;XFlgQu$@S zD)}#J?DS>Pt5@qf|GnG8w0Rb#O;rJETSZ3=hV0 ze6Bqr7pI3-1k3j=^ryPI*I8V?sWcFbO)e~`{nMyqhKH) zBO##RApnUH&#dT4iOnX2EqS~?vQ@N z|Gz?a{+|+ed@NOe*=zbcnfZq&`NyRPAbbmOcMS0N3J3}bNXQR&Gml8lj|y~&3i68% zvW^b%jEM-3%S?}tkB(1FiBF43jPp%Q%}LBI{XdF3x&K4lDJU%cZ|F{GRmp!vcm7k{ zsjO-GLU*eFQ`~9mudl1GZ_93|Z*FMmX(ps@Zf>rSDO+uGXsJ!^OrSa%w;ZTF!vE`N+!-Jc#n{2cVA2$n zBT6v+R%9-|KOD%jmx7A9qG*Vxtx3zK<@kOTQm1DIyD4STtePl!rDd4{7$ZsxB=4-X^Z5mf%k(wiC)K|vho0l4j9+0Kr9)1_ z?#2~3!)sT$_khj|{a#sKXe{eF;l6(lGO)>0{L4UXT6>|xs$WyhGnT6S+2gsBXK~GS zrov4@x7oOO4X4+@yzj;kGaMRKp84YIl~p;P^VK*Fbf>#^RyNV9sb|}NzV1pje5T%LDG-?-IcYB?LY zU;cP?%mOr79=IW(+Zd~;Vr9AFr?oY)-}qM95+YiM(3%bwYS284lc$qWw3-oJ9Dsy= z+`6qjHTfFqUMBdG5^WyCu*%-WbJv^uK!~xQ8;QH8>-f#@av%xoyz5GMbU1B#y#xNv zixokWXZzS3hvyEUr0;d343mAoqd?=+v$wOS_^*(o&F|+qSJ6&;sFAnbMeF>a-^(kD zz$T-i78XvOr=961_5)dw{?+LT!xP8N&jMrp*xONx#c34kv#6X)n3;maNjL)&3$q?U7B_B9P&7>uz_Km<@To_6Iq9`aJ z82Uxiyu45~eT-5#)3}jCDXQ_>i>U=K7|Jj|n^Gajw8c3o z#-iYK^|8`kOY#)%oQ#w9l*_|w1GmP*;cZsR51R;y7$ud)I}6-2og%m@SbW>?il9)n z+vqv1e8nGTAYwd3a~k5cslC5?B>-Q~3J> zywYRx-z38#J9DYH#HQJ=7gKkB&PH}0HQdkETa~)*tq14P#|5ad^*;Gc0 z^6Q;AV-Cy9xbm8NRYrM^G*81N+NvO~!#_8YBLc)j%&Rx--|c+`_$notha zgior8)WzgEnqYQ|s0>OhSXXZhZDR!)mOu|rlrQUrBtc%tx+sk#m3irL$B34 znahmu)EY^yM(w^eRo~V@WM{F#6e6){vF6J1Z&{DJ`Lav*0Iq|G3gEqtmm~a7X{~1IU5|mBy&1hS4^8n}OZmqu{sKA!bM+%MfzLFaabm=i&s0dZ zMgZKvp3OyXR3I~0)JiW@r&d-0fs<^8*1qxNa!=DVx+9Zp-gu^57rESzUlkQg8x$Cw zLda!dO0e_a*xdU3k@EK)!wy{q#|Lgr7Tj9s1z5#y#!)pIJ$8mHIP`QtHQJv?gntnh zy7#n)yHs_|#j(jFR8H!6$m;9D-__6#niX~=4y9hQh#C|VN85_2EWibJ_stcpF^lN1 zYN{HId}AiHI7*6wY^ez$5#4H@RI@j1c3Wz3d)c@0ys6+VyJc-Ws2wV+DD;fA)wsIB zDO-3l5Y*LD!@Fv>@!O(5hBeB#W0M#-qC8(_erVQ99J%G!mHqs^DdJEyQNyAt(`<7y z{5FvnTHSMPGg=ed+}D{+2PP%1EfASnoQmjdbYsxpqj) zLTll3EFE~+*mG%L!zswMSeC!dyJl5?-K~ok%frv;91wVUV`Xc+`DBPXSUz=NZ56RQ@(5kA z`tf&0b#QZf9_iggs^`Uy33D=Rf0MD}O`|FiVb8y$%S< z*cIbASJ@eT`3HopxbF57HNyCM;4}&5~buf ztssnR%sdNkHvXH?Dcmbgv$fjk4yBGGmQ!jEFLrYHsX~HL4fPpTho3H{8JaR>SkAC7 z$^l%S=Uk?E$#x}N{$4566en!?C%%$gR%1byHpc#gB~Hg}f+a_6EH42OQtp(CwlGvu z)mQ=o_v$|n<$kx>5dj2Pzf?@@uYfZ(wHXB!G{ysB|BHr1!4 z3DbxK;WB+Urt`mN$8tBpcn?2o>L7vkA2XvrFtlCsK_y;zNz^%`@@me;xToA9Pv#li zIw9mbjphNgfWH*N-Dv^v6jpH|!3WsU`G;Zn zBP#V~Hb2^azNfL-U4>X6XW;{@zv2lsC_Hp6V|5jK3EczPL&lv=R}PB2PM` z?c`y%#pUlPEit^Y7Qz;AZ=C|Oh;QmgrWaeI~XE)}IJ#780G2AyPC87Ac zrdNvgi!%p~Qo6dI7>9TpXL9qZC`5+>S{k?ZJlPX>tejM^_?f1PbiCt|wytGzbyBkD z3d`(}O?A3Se!AkypEyMwe+@7H&T{+1B{%I1BM{9v?pM>6O(S0$ncyjN zJ6#hmbc7;99j(v&64oM2Lvn~$4V7M#*Z&wDbHwVInvRDjdO)Ojh==-Q}pBE6b_0vxl=Rz^ih#F0#}Kw$Cg@lgY`5C@X7r*;}?xpsgCL zTY*qn3>Ts8;VtP<8BCCrghZ1EImQrtUbNWB zc=X0ztLh?=QiEJvF&M$B!JYf{U)IpFQYB3J@>~4ndJMoSt9iY$h`R34+Z^^RBfwkQ ziZ($tp^|eYDHA^L=FL>{G*^eWo_a0$fUT4z*rwO2G}*H9y3@77EW7W#oOLC)FTx5( zFA-0wHtCHe>$UQiN9kmyHXI1Q7Q#C}PtxP1vSDAAU#z`^oF|%vu3VS4=&_~h!zKqB z-b@hR=aDw?R{6ouIstonvk1GgIuMOv zS1({SI5UcaO2L}z0zefu*B13yWp0_GrL%Bw3thb(Q-B4zP8ZMa`z*jCU*F6WsfjD=gA7;LH4WX}6hnJ&M-5WjgcY7;{ zjpzh{N%0nflz)(1{);1lL6irG=0j4_!-Q=>@)CcEC|$l)FwBTUa07$f(LjOvLDBdj zA>gp+?qH`aP*Hd&IR7i&Gc0chH0~ePB8CAtK`VE|z;wf?6O2HJ3_C-^QX|4f54775 z!#im7=>?Ax(l^n?EVU)^Eo zpTuzCo3IcdCvfNjIF%weFGrwDKLEA?jP(OHoPa|P43ZFRT&o2vzZz1nzuy}Oi7Y%G z`5Oc0cC2D-GV%^qn0XxAanQd35XB5j9}gak*rOK>5kLTERu2`%3>T0O2onZU)=%p9 z0}}Ir>hTkC@sp5y;C4<^yuuK017KB`lW(;C3=v77N>swEN?_$rTAKK;%(w&n$YL~D zNH>&AKCBV}6k$FBKp3b`47AFJV(A_y>YvrihrOqV<^Y?7iw9#ShVHILkd6Nx#Se4? z19&q-LpjYNBK7zR&uv755g84$`hy!bLBJq=(-)pa>7VxQ|9yoxE)qSD=euBt2&HB; zl?cj*l?Ce|B?hAhLQUD>3fC_P2@??_jq~0@MsEK8{5=ihGhBlvD7V@0~)GRB+&q6!R(Gf$l z_CR}Y%~8e74(LPsUxE8~gMDm5L4rdG)=#=K429)PrB)-*`_Iz(u0{(?Co=$5;@1}G zAwHtlK7K>yS0nt+TK?V-Wy}B;wzZ5oJl+#$L2J*~xquZinn&@6OsSsA^@R<~ho$qKln2d0 z1E-<$kybj8=DohuBz_=V4ou+Owlx?O8S^S@4=khzOqAVATr{R#UfKP&17tJ%B9Zv><^T!9vWv9A9URfC|qz4vWycD(!WFT)y8 zVOR0vP$vKQIxrYD(`xJjyX*qpCYZuDjxe8K)=)+og><|cU$U8z2DTBi>KtSz5+bBT5Ud_fi44ZW)@@F2b;#sL8#ySC}Qc(q#%Q`kmw z1XelB7RX;f-))A_AL=sR?E0O&B0?(wr{Wk6q4HLP6wVMB?4gd*LN#;nyqkwEaKG0e zs3RT&rWfNCS0H|Ebw-0h$IpcetgPrC<|3V06EE!h&B^rdUVfg{fUd8ft9PMLq3QlD zN;)ij#y~I=osa9^!W(bF1;BC|+{)~(e~*7Ss=axQokm20#;iGl+JS*q*zz&l5t=(` z{LH+-TzXiGM!#>F5beboA)*w9{^jt%)H|IWa|m^JwR-(%W$@xobkE-dE#nJ(wtsQ_ zqJ#vYW3MLs1YSL79{qYJQ)-^<2m!wSdlfTls?0DpeHRQu_quskBD2uMpG%+9hmJp< z_mk^C$Ka~UYxo53Ugf%~ciw72Z}o8<=LOT0#DkVICw~y{iR#~RV{g=MUSLtcfpgbL z${$KQTi8P9Rtz7%e}T;~T@NaL95AkC8lsW!LP&hyp@~@}0}(AENCreRr!W&yntwWD?cgOGrT!l$I#@q+^>&~S#rb91{8 zh&Wh`?D_E~flyc+hT^wCvLOU?Oe|s=6;ttW1kTW6Zq}o*PV2fOV#+-+VJnLEkq!s!9c_-Yb9X_GPr1cZX#I6d&Q@A1GiuhAdqA&S@OjZ5F?F5XE`N zT`_`8U}+Od@qiy%U(&&4Ii)}OIuAp7)giBR((5k z4*$qdcPdSPCyt>OO*VY|5qZlO=ui-nI!nAL27th;x)YhDH#rETTRz>3qzeX;@&slp zt44p@g=A(c^ETR(`2%5F*W03aA&1CVcRC@r?yYXa&+-qQjSDK39T+D|Ssc#=6zQ&~ zQ`~QELT@kCo97YGYkpALiY<=7!T~R$rVfNh1+j}f;(gQ+vtU3h5;JzW78c7qp~p*8 z<(lom(z?zWM-meh$@=#$B*lQFqe9bUVW2-Ku|#l?)6Q zE(ZrBGLVL2z-VI%PqVYC29tcpVV(Hq7v7xzt%HYAXCLKoLe`%yj3waHEc;G&?F zCIc%nv&G%l7+F=#o3TjmJx_Z09RiZmsq;viy>|BGzSvsnqLB91cy|{Nq)Xf#PJyN8 z+(Gdb`?{?Nr;0XvCRWQcQx>Vjp@nOQVM5zIa?HwPT@UHkxH$ZDJa)4DCWT1H&3$$R z6#H2=_(I>rf7tdtOWZ9}zpU$sbAzZ73#21c9aQZaQ`4b;z1K!+_{!K=1wRD$7p9RW zm=XeRA4TL*xd;~dT+mI(X@cOaDeRltQg08giwD?XfnAEht0yP=2}7FCu)+?b*;^IT zMYUR6Nyg~SWMD0ZrUk0#i@xiE)UN^3O0_gRamAKz?-q#K;|0*9-Sz*T10x-?TF9#^ zt8d}P#o-K_VcXs1r6e}yIb+P?04<@}|Eh0Mw4S>H!Z3ufJg?iB{QJ@bfPL@qlPKR_ zHCh;674)f4r8L4wzOE>8^~zlf_%fmT9pV=P@P1NZ z%mi0K1}}=xVL3x@RFjSR`|kv!SiyHtHu;S|=o^K%QVu*2kT!V$HB`N}r;K#D+ejb}Y+QJ{tpy~RAc zdNu$hXP+uFJOExr1Q9xYJb@uz7KXAx7=P?#6h<0JO%(7OC37K*z-Y=Mm@S~3(uxh+ z*^#Y1pdZ~7oqOOk5XDIhiVUO-lsYF#bW#Hld9%vMGpZ&9-Uh%XFJRN#BUq{9>H?qK zhPS%mBH-sm{!tg@QTp9`Q3mDHi)pha{X|O>AlNQwHX~)O4S+wUk)}5SkJ4rj1Vl6x z%9m>aHK7*`?}wH`ba1fwEp_y_Rh#pg9kMIps9u9vN506sBLH%_G;#3!fqqXZ zhSgdqacv7veH^hYX;CzubYaVQEpjY7i+GCY3A{X=3AIVnxVb3wlKX#u79;)ipG`WSgsCYHIF#)}y$M6xh~-jgV*-3pYc^{lBk zb+GgkkXs^=T}VNPuJ!&n7jgKhqT@o}ICVDwC)mj6s-fS+f>-pA2CTGagUEOdj=-H# zvmwfD5;?zJ*0%%=B!)kbRFj;kUOtJ!nQ=udCv*!D@fRR747rAb!5XF4FG^Apvw@>e zH!GGP+?rb)jyK{Z)jld5qsvWiV9?%U(^y@Ha5Zk(o)7H+?hz8>Td=raF*E!oS;LE{ z+ziDX0JV@HteND&R~*3oZ68>+&uhMf}{#% zC=c_&8N&vGuTw%O827AXXlE^#u_>Ri9K706X@&jr_J`+^1Z6Sz**5K9oY~SDAv1WJ zC*s2BmM5Z}NFBc2xJK2CLV`bs!C1T&A2+<3k*mr{zv`+d>5zQTj#p(Uyr4SZGg>P3t;o(1a7=Tb!A>ACK)1&SpoaO5Dd7H>jmuEOj11C6h87Ew(G3klYA5s<(01WbEAD>}j0@o%o?v}I9 ztIR7CokO0uM8F@%IK(j|@eTQOZp-@0_DZExt`UVs>R%3DGKry2-gbCr<8E!ASR3U6 z+7F(VJrQB8hzcn3x(esQOwu|hvSNBMES%j6`2K)3=YWh3${p7FzBA4nIxyvetTebF z+w&m7dL43gvk?zQjm|elX?&tWrQw;{*-5 zDI4b$>!2$61siv9VRgaZf-UAuVl?6HISysv5@r$Md%8x3`>5TD5^{X1?I>XoN49Xk z-jG^U^a>yioUgX&AeBbD=Cn{$c9KwVRm`oDvg3{Fl+7Pb1$wEYh5ao6-KtynwrT^| zLN&?PZyT{$M1d}hugQXOCc_Wg$w>)beh`5DQb;Bi6y>+ky#_8=2EfHC4$^5DR6(Qu z9oQMbT28W`<~z{kCfAze)CyJH$$iM9ghw8lNJ~h-WG;{OjlGKr4APn&avLJB#g<$h zlEp52(3rFop<9>*4Lrp}hz7i@!MlfBx&r(Zj7CSYajN5Ro`>rzl>sT5XA1_}Z)b9D z;c4!g*CRn`YKw2^B~1>FNXVJ?NzAM4n@yrGn;K!p5c?`==%ETn+0lb2ssyISY6j4g1tCurW9dVMiAGHJ=f8D^!*nJm z6Q?P4WYU7+CcZa0%fQt&Fz0pk#tl`*><&QP6}b`MDh0J=g#$f#f?t}TC=Z2b<(q@- zSkb)m=OCwo-fKx!@gnIfi~sf&t;H8bN;5>q%vYeDun?Z8$n+wL>UopVAj)t-^=UVh z@CA}3%gY-z3tiK6F?#;y=O>oC7t3-b*Q~@pxyzNXM!fe7j#!(}s2@EJVi;U3eD}ot z^SfQ$i|2#8k<6B^Nk0iZY1uY6H!;5zJkU;gYgSPXvt= z$$`HXe+z1pJ<5>wXNC|n*P!wfYpUiNi1H_Mi{DHnC|`_sgW5**@gQw7C?ue9?vM~lm zt}QD`(EYuzX-^EWODyEs4dJ3Le8{Cqzu0>yCbKrDhZ>caQLRlO9QiKX78HQt$!D-c z<=ZHf2{&ssuqZ?^;eo12hS|5*m}Hs)2F{R;L;Qy_TynfvCgcmYisuVfFSxl-clI7* z2q_jAm!Yo8%s`!EFO04k;3aHazUaXm!j?S)U`cH{{yidSNurnwCVpUw6Hm*k>2=S@{tG+5= zFFnajbdxalm3O}KAyC|7Z5CG|n_nrImeVSp8N8_H5mRhbUTn*zH~ffcBOo105gq7U zq{Q4nB%i@1)EjwP)NL>r`5L$~1ns47Jlf@gG!VOkQ)nnWgW4y8bhiX~D`nSRQbxsP z7kG%!G1MYU#KRiH@s!!}+Vd+1_;H(6Id0+Z+?ae7*t_W$u@o}eAX;@RF+RzM&c`>3#VtM-*3{C7?ipHHw3-3)3dG(poHJY zhm?xvv=9D+&fGe@6sQ8f z`oE^7TWTT;ZP5*?(pp_LK3V3^kG|K2$dvzH5TpHS>z|jAW0toE$NB0rXwH)0$-J_CL70haknNKc2A9c?`g}uATK3^3!?>z`@iP8-U!crIR35?H)q)D9RGz^T?#5r7 zRx)W5cJ5KeNRzVe!3iQQ9*SprKHzgPy8b}tA2B7S-uCnpMx#`eb3CqX1K9{3vl&&A z{xI+AG5h7Kj?LX1E*<)V+w>4T&YDo+uQi1eE;4j(zu)HOLvsIcotP6tkHJl&A3BXO z6k7=(Y}9q3mxfB!fo4 z#Ie)ZT2&Oe>ah5^3#hs=f5jsVm9kY%|B=s7vb>*Ae9*7gY1K1yCI8jUfZf7?3X3%f z)}Q_G`6#?h!$_DV%04kF#Jb0%tbMOEIe_%(4@f3k^BC(@Yod7#AN94(zGH5hk<>Fw z1;(DFbiH{8qRnOm+@yai>>B`tJ_=e$oyPWNzxv}C5uTFV9F<*Uh3Xv97poXAy3sqw4LkUAf$jkzCO7;u;O2N{96 zu;kmnKA%9BlkS`h2(zzOjVS*8q`+MN@Bt;T$?A3TzFmlz)k3_(`Me=RiY0<(*I)y5 z;d}^)H#tgp`mkPY6D_yQ{3n6JgpV3P}!b`|Sn~6(h9Ot;cLoalO89QUhyYn(%DH4>O>q0Hhs$zV$Zp9kJNkDxCW& zW3W}C%K_3$>ebqTa;9%&|z<&SHmtobKS^v@b}4 zSih{aJb#ln{q8?nfy!#vHsU*rBh>#BLS|g)_p{oyp)2*sBXiz~2Vo&>6f_)?=CThr zhldT8%Q~DJT+R8#;Kp z>~xpvAZ*`ENX#T%XMDy+r8OuanYO zaB?1VMXvCF>x7zWMX>o5L-hzL4AKor0@6GMwm0<`@wX@rUXMfG;9SC=4~Bl>%-8pv z+r@uZG-RLlVJ>!4uoQQZ!l@clTW-~YBs5}SgoY0N3%yFSEZpj530L_?@eWkZ4F?VV zpP|^RrF7YozF_LXB( z{am|LUo9Hz**w(+VrTi}jGL-ic(x$>gj@n>JevFQs&`3T#No!n|34i=s^+{)? zgJW)Ph2dcykqWUn*ptNEkS-o|GseWT)nXwsgD(rWcH$|SeyWGkKv;o?rY_#zqrO?)i@6N66E_fzDY z!M@YDS~W5pNOZCEmS{F%{{EYV`;_%0)EbLSV11wMEDA-6kKO@~^mMsW%1?Wc9PVn} z$n+LO^n^2WTcfr0Ab#uhW*@T0nBeZt28MWW~6Y#*Rz2EoKz8sYXe3gfgg7o#dtqVum$o+_pnFWV|f9 z%Mp&*b|+b)@Y5Ta14orLXmTOs{gCxUUn4m*!N{FCf_Qsoy6>_Hv!N(4%AXC7;b(S2 z19s_qU?_wbk>sC$J^EJ-Exjj5tw41PYRp{WbqNuxNW_wTV+6@FQw0=S2$Et9!8c2P zJX>mYi*S!1QqO6`YISQQ?VO#m^f7LbqF5V1tRw#o_aeT`w)KJ|rV50(8e@|15K+*=|Xs`hFaq=AEwl7uz$Nr+Dl+mMs0abqFqYK_Ln-o)Bn zz?xs|S&{T$yf7r9B9NQxAn*d(aOe40MeDATcz-O6Jv?>752uZh1j=)up;aWb+&M>S zSG7;=SCyvI7U=CX(LyD^Fm35)E5f%gL7@5C2QMfME zvEgm2?#F3r>`jM2w9-lWS&-K%CZUbWT_fQ>q+ z#b#f-jIXt9{8Jx{7#%|#nEnB?>7}t*#b@vmQD+#=NgU>SnI z4&3kp!czkutg;RH+a$;g7k{XSl$-H-j5}v0Bzatd`(R8#eN;v;QEx&(%76j*3&qeW z2orznQkv%nMgG~OwGCe>8mN3{QpDS_N%lv!0+Kl=n8Tc&>qhWRw?)4I4T_UHU5WAh zYi4`b9J-=^2_q%y=qrPzm~SVk#k9x6umr#349lqrCHjKo6Tv3dWyo zWIK1w2>MqR*rAhT>KO{Kh5#G_F09-{jUd?WbA@6-XvVJzavB0s#N7>C zz2B}wMidmu%ebf1iK;TNX_Ky|+S#zaQv8>1$WWRGMR;uM6D~H*g&5h#N5Vhmm62MD zfGJpoP#)s0`OQ(7x}-ff8B;KQ%_T5x^57k+5j?A9=96F6tkKc(Tp>@TGB_ec+0l#X z7cAwJV#U6`qh&8J4e{LPxU&eYZTa(~yr#;VLto)^5e!zm%3|op)HbQu{J*7*=wzeC zrP)g`PbfutC!agV#HgdCtVda`J6&P0A!i-ZkytNLNj~NyX`j$9fPOVb+g2pA>~QLR zDp68$fVIAdHh5CPbJkn#lBI!tSS6fO$kabv`!dC7QR}2AaITQj%EdL;8&fl)Z|W!6 zH2?aTDT`(9gAKsB0frcMf`WB4x>Aaq zzAJ?>;r?d2`fKmbd9Xa9vna!RBN;9~$OIp%$zlwE#@T?+=Zr>Bh=*i_$_>?X6em!QVi(R?n{pt@Cn+i3$ zzidTKbY~*yzGc4mXE+Y-63GkW3C{+>7$-?!ldBj!0avzjBRorcIvJ`UoQ-AFk?i0} zIX*h5gYtG&>g;^kItrt=Kh3BMsv(vwMNvyN*0$6@LFN-UbKR9-xfoosn};swJh#vE z^))JPm0dEZyZN`3hkrjH;Sk!mw*;6vxbnM|DlR$tWvy_c=qhxMU z$oh~h)|s9)MAdNR_G>V<6!&eJjdyJv`MscxcU*O$^$g=nns%BwLfKE}jn0$17uoe+ z$KypI@SN#Jzk8`22UAsgt0?v5_d1_@<3-A@(5SD%wv=c>GlASXEfz^(5>}BI)e5kM zuzfhXAYoQ0q?&7NUg@Qx-;(rH@$nh#mp-le_@+7biY{JnJ8Y67d^E z7hXWYC3iDuH+CN!_>XTD?yC59EcAdh4^7)bywN?UR%fBN z-j6F4E^eJud9U8jKegz#pLyAID%MQy$1bCdoy}Fa>>#@{%g^mG|9}_H8$I0@l3eW>i;ixY zeKZzM;@n5S*84IaZz+;vl_j<9Rire+nQ)Ev93%tVpg>5naaQn^C3da!_l~P`c*|1* zSPZN%SAsQk)C>$`f(l@u^p!=X1G4ebkCix0P%Vs=-z^Nj&&D@}Lw5So^(ZpGX7+;b zez<+_|9vLjF4o^2F}hVq%Vo(ylhm?h1{Q)L?Zquf;UUB$kSC6|>CF;=_LgVZiLVB< zNqN74z|kUw{1Io#PJo8fP;10!;FfE+AFzW|35Jz}vp0c~jF($SALxTy{BYFOrKZk^u?%dMcbcH`d!BEL_LUKhM{d!PzR;zo|pM7C0zAzy$X#G4zk> zPCvv~1|^Bl?^woGCzu4NgFaKpWvWASZj8u=Df@dw5*cV%jKWZDNP_&C;#G*wGLKi4 zE{KN!Rf9oW6)w;ukzi@g4dTxe4O2wyoy9xQhOahRlb_Uf8FHpc*5kfx*Q3Yd4Lgb6JyGpbm%=@ZiNL*8tUCbZ{Bjm}q z*-ho~J3(p)!#D!xU~opx)PvEe(cE$6j_H+K#X;u~2ZRO3sT>XNeezCvWmJC*dYTxG zN|#y;43a2oU)vmhX3HV-nu=%VO`)1hNZ_E94DmmZ-zB4g5?NU05z}Ol3ROg0(v!1! zrr-oe00;(`euSYaEByIRGVwRWqBLKpkb`tELhB^Ax1Sl13114B!NVnx*F+d`i7*O= z8&3u`nAMwoQ;HBNQNW65UODtbli4R_#jQ>e^Yc{P$?J{#TF`NLxhM^%?fmG*~p zm3CIEc;CXrgTV1nI)&dqNNtwjD*Vuzu@E^<8qr_`MY~*{CRi&^QB-)){%paY7*d4IvPE(ntdVT1rSn}VE}7cBB8iIO+%lAYfQ zs3jMQ&F3yt2|9h%VE2&GitueC;d$a#y~1OmA_nsqGG!NMb{?631{Ov{uqlfw75kFW zr%Xc_BAOG5ou9;069y_=r^WWq(8OyD^VILt^!$8Re)2Aj*1`r#E+JsVX4ppiwe34w zgcx=2WU(gK^aC$k`|W7GtttA=+-NKFu}-uV7U~WGf!r1`2eg>v_CM~C>kfiuxlQD- z3U1h~TM}w0aW_>p4!~ihk+d^M1&zl=7sn{4)n`?l?gmQF2Y#boLXy&=`^H$vl3R=G zIvD@K_yR3E1o6f*UFkw$sLm%}-JPUZK;13tTctC}DCH$`$mP6t!z#aTQt%&0+(V%s zypX{Vkn~rdts{l7=r)oyRg~OF-;d7q+SzVLB!1wKZbvMfwB5RgT$0H!kIf!rZbRKL zL|Dzb)~t@%IHnGN&X`v`YBC{VRc6OqobN38q&_>Np&-Yv9oO*W8m6EdQGN4`=4(fs$*J2j(>D= zdCimCcSzTKen}BweZ)xlz)OWfbfxfdLUE-@QKqt@3AyqTKY#@GV(COe8ipU|uzu*^ zMNKzLm?KqOcU6+|yUXznNov$}ZNEu-cgSf6$%IE*@K}oDHO3w=)6I*)JqUFdCR-$ggm{AELJCQm`x#%it&C&Fvmg&F52)x25#wmTz`WzPyNcv^4q0JFeVK{ zl0=PD+U!li3C_wD>-4W}RlZ=|EiWS|@--5b9>MMY?l}uFG~-^A+1|zqCYkG>w^Ef7 zYpl^``Z-su@+x>!$(U7E254L+WKt{zN>JbHxtHK7M$^6@(iG%uy_&2#h{a(64`J0I z>`IT3l6Bl651IW6SB!4p+0ZZBDV zcIG}|_Yg}aDX*siPj|A-Sjj|onM8N`d`y8?OI9uR?E^zK)fOQ)R!2k%u{yyrdb+vmj#RjoR;t$i_}Hg%=vrx0YKt)_?_aBESlx z)Mlf{#=i${+XD4k_{n&m7T*hnrc;P`xde-h>}*=BMriJU7Yh|SHZ^Q|gF+yO=9-)S zWgCtZ)AKHiz-#Lxpw*V^1O?b;SNUQW%0bgrty}ycczWm79OBq9B#=ux9l(LRWDo^) zs;tYJmkvOPG&3jL+E+ZZ1NXE7mo=_=d5n4C(DEYxII%f;v~57^9rEOgU9N#Ukh^X7 zk$Vhj454P?qAGCd;pbHFgmeCT1FR#XT(m<TcFUgLcvOUH%;WYsZh+Qn%q1;mGN+{h8*q!%UIY9^2Wyqb*1F zW&E4d&G(tMibbBzGtB-WRLRrrm6LCkOSh(t?Y15{fy1Ay^;b%#*gKHnDhFS%B2G)!*M zr(Ah0$k)N|h^s#QFFxE%+!=na@eN!FxvpW;oci}fA#!h-yY1PD?*LlgSnRtLE#AD# zH}nh5NO&gG6Yemc!)hw;g4D#yY4$tNSERqb!Pq?jL2krhvf`Fb5VV^fJl@*a<{)DC z{R;L}v5#M~Tx@19sLdY=$lY5(+>U)P!iMFYBU(-wu znS25pmp#2p?mA)uCCFX^a8E09Pc@kVJFP2$ZUJM{F4X9KiY>jrsRHb8{lbTOv!?>^ zTRs7$eOs@W@n)u3ul!!Qe6^Rx^+x`V68+_meZRHdX8xfwV%e{2d~dU2eNAfK&Z#t~ zOFWJg|E6mAiQ#XKPjMIJzJ5aY$9DKlZ}5XYeyukIR)ag;N_HN=^XVjhnL_`J>}Hv- zRtHz!x>s=lem5h+Nu_>Va@4dB$s1J$OnKP zz%~qDFZ5ph!JCu%)m<2P^J;9$Uk_X{kHF}Pa2m{nTYSTqD45lOx(mSjj3nNYRW z8`V@y9R=Ev{<(>aS{X+sgWU&>LPix=rtZpG^>{*_O(;Ot=g~wVfm9Co?t^+8yUAmr5 zf(tmI$9t_%?UTEIaah4_RBn)-#44c0qC9MU>VMu={_f48Wx^=TD-ZrRQ(%McJ~28^nptV`F57HG`Z( z1-c~u$CyI52I;X-WCDwdy|IL3mCYKVryttJd(p^b8fry9|j& z<}EC#XZj%z1}0xQ{T2iotW?AB92^5DGqUP_Z#d%W zBk%ecjCg5Wm4v^vUpzEl?**YNI8%fN`!(*vM`ECwMUvfI|LC(;`aN^4yUDkD2ZTq#O8KBo2ImBg23eM3 z&yr-`%W(~_R+ zx~q~;HLWAsJ)Z#M=I=hSYnrDyF(m_)s;$C!B=mvSH#t5xmi?QX3U2f!84;7Mop+p* zJp6@OEhS&%c}BDHK@0^CJr^P`jJKvtYkNWXo~;-xX`;V_l5&3d|FrGr9JoLyUbyDT z4)^DNaHQWZcWy>so2C8lEXeBX(^)BBl~sTHP=a`-wATf*I_l!*{qkJ%d+npjUGDGr z`C3g5gSco|0atP9d@Ezi?bW>Hmgf4pcxaEI>|g~~9tlH*xm8vY1JTt|UFb$_L2nY> z5>X*(erYv=9fI(j3G9Ku%+Nm}+lH_<%x>QY? zI<+yp=35h^`vgpx^`_5l6la>UKS1Y1z^F+5qm(OECQb^plpl(f;*J5{oPEhmP2s`AsKZd_Ln5p&r;`R7iDor{ySwUKr+e?l82+sx-A(^|FL-)I_h79=2Y}xM^wd ztff%?Wz!yYlMYZ{aB$j(ko$}VWE*EQu9V@4Ef;t-?YdPuP5TaXA*toHj~J&MVlo!X za^}>OTFsvUt#>VKe^(FG(t?ijY|Ff~*xA@_KnASp41I9K3*}ZGy?l1G+dh_#p=E`1 z&>6<8tPCV#ls6|$9|-Wi<+Ea(R%y0QiCTKMlM*llJx}i?lzXeNa$*ao_HYKoTMbTx z*hbgsZlZkJh^?97lDUmfd=feQ`_5|v>9*@p!Ls{ikDDw!@Hd*Ux>9;lE+?6DWhgR^ z^&^|i*pDXr7Ia?YK9?rUNIIBMz^`~^7!C6&UuDS?u=BpE6T zIJeyaf`p#`lFy?k9ltRCfT;C>C08YkEta^P*8X~vLvqhlJU-44 zR5A?uXig?=ZC|{hHt$7niVy_zErdG|X>xmKE5IsD!wPT-O2}WcV)0sl^IwnB84SuY z0l&MM6t*?Q_%$#-aT5IW$+BczUw#_aUWG`y{(_Hl|1wNIgwk^StI4%|sM*VEQ^woX z%CO~S^roPQ#Bl%{U^>QS_;3!O|89&rgT9@Xp8r!GBILv>|LFBtD=>?L`YHLxP~b@D zXRf-85b+G5p1~OQ9cF2~LlfyvDqo@?p1_+PiICgAwWE;~EUZ_?k>h)V5i?Wl^48xI ztOfa=!tG+>dl%0hr;i$qP#a?Y_2Apu#JN^vDFY{)N9(_La_R(j6T22iozv%d75DNM zKAe>co;1%nHBUwI=fY>XyNTrhxDn^8-%-?O@^&kdbo070Re^w;-rsfR@ns3*?^nlQ z@AMVR@>g&6HK01Teq)Hx26a`Ua$uoMt|t|zs_}C#HHr1N=j(rdQP$fsGZuA*R^`S1 zR6m=(n}XpfhvbU-j+zB+LxHAK0{S*i%Fh(}%ly1^^wg!VV;!GxMyh>a`g$48H;&j< zhIuMLTFcXJDdaq#lBe;8cMQ!N(z!Hx_YV{Kh&&H)E(3{1jw|+ zD0TT*^~Blr6h!sZ<@NvJ3aUc-##RQ_hKBN_h6dL}j|W;(K#M8sD1uGVTo zHaemept@BqRzT9&R(w0ej%=ohHjSHo~FuPCbB+^96q-CK2BCX z{vJMI@xJl7|L*~`|Ip6>W&c$_Yp8DQ_)q<;uDQFut+#US=n4$-}x{4+5eaH*?&rI{{S?X{|TU7l{u4C zMxsF4igK%vQpk3)+mLtOla2*r3K&AbsveC;li_me+uV^&XEK{j(c{9VDCDv@?S|>J zRL&KW2E!4`wp!1ZO8%VHpK7gMs-)-PF^6lil}w;M|T`t1uycUgOtd0OLn_3SWAvimXjxuVMr(2zFYV2Fhv?tT)qIQ(moAol& z<5p$~2z=xwv)wL*?fF_Bdi~@LV+Io{e!BB%0i;0U{A{16$FrrS*6!UKyR@l6@CLa> zvyEz9#5MamK`O(0K8H0TPvsenJ^SjuwoQX0RO-c`d6o*}pBS3bYgYZ=V|%W<;TX9A z^*dfVp_7A}iw>XHRtMpfP~KWGP9)mWb-AB(AC~ zVXD#W${hoa@Dp zRZ%IjcU&wPCbLrCU81S{-M&|;vIISC&N6sZISS%NC1ePE!t1gv;*RS)vw}=GxpYe^ zB`A#5LUOPxt4eQ9^b)OYSF{UQL(a-vNp^wbOCcqWfQ$5eq)GJrgqxQfU8cZpi|Uc7 zk%QVnOgn%EZibGIoxVWYPQhL|+@6U-1?+kapI{|@MAxkOUh#Zj*I}cCFZXe!tKbWR zakN0YIn5L8JH2^tbXOIixgx{3>k${0sZ_wT8owkYIHzi;w(rtt_@}0JOy{_3Bx&lj z>@=13o9EYs(d-OgUN&vh1wjbA;N^L7Dhk0)WHw_g*);hq0^Mj1o-APaaE$7HIP}Ap zr6axo@UP~db9GR69pHaG$(^H3Rvvu)<=WYUSx%O_Suu?{$A%V9L@(^NU2ip@ky)H( z$rVsj&hBK`_%A#*q1qd-US3;C%V7XHqN`0$hpMe^ZjlWL$||iq)w7zeBUH_ z9W${YFv>0RtCtNZ*?r27*Y!CKkv@;eV3oJ)&L~#sSZ?~$SMzH%+5pfSEQRNjYil)o zw$FVk4m8GQqnJVgLmK8m;qq&q2CHz=z2;I2AT($HA>a%~U2> z_8AYsu8p}MLTPT0L<>f&_-^$r`mVY!VTGh3e(mBSDScdtyyY~b1qg(XFEDya+Yiu ziPp*FNX;YC2B_Ai7f7kho;2;NU5+U!2is(EbQ4;9jJ6@%x%j3pEQs7SJ`M@A{DNLH z&Oc{Z!0J2C^WQBdMNbWgt z>R4-_AwsM&%Z0E$99kI*xrrhLH%;Wom0REt&2Pc?g{T))09N_Y;vMEt&Mvx@DM5yH z#_3=++_J71IdM{uI$51%x>c>n#V9#fd7DAHggBlJV?5V%f{mp2OO9T_TaN0&OpDrZ zUYfFTCidTCj1<-QH3E?+EmRY>(!SEX4R@c~)@SMlB8DrgxK8Z}+0=A8yGluw^L74q z*CI%cO{Qt}I(XncRNPfD8J`<>OI^2WYmhh+qM5c5jbme~+_b&eqZPrghwIp+B?Gq; zZ=D@f&42HAl@5DqzC(4n4L_a8EB!+?EBnrq_p07E<4qomgVU>#FP+T^R_djkJ|H-x z=1Ui51M~qHoHTOc!*o?`T!?Gq=a*b%`s!f?S@|CemK z`S7MKVX2n7^mAl&w@pC3_5NmEUHniaU3vfc+A=<7u3a~yD3(^QnI5o!>V>YxcvHTw zYR}x#eghnLn`x{h%~QcI^@vexM~y!!U3*QCZFcj`^E|Mf`Ii9L)4o$>Q;JECfVZg^ z46kAE9dkCb&*M!?Sn9Xub-wLc-fz5Qqwaz~=9is0hNwnf>J&pAdM+z8Zf>0tPJ1S= zb{>wC##-~kT#FX}WmO{2B-d4*{>$@b*|;FR?Je($Bot?{(J}5{M&lS!VTa+^$0Gym z`T;0$7Uj8KGxO`C5wnGd=r`Z?EM@Glc|Rq7w4bVP0$r>RxeiD+7rWgw$JP~R zVFyq2d5pwe_iB1ebrsJEEB@vI@uQ+%r0%%atLFkM|8@79-Ti)s<~FG2Q;S`#jx%gGxZ8F~G>b&dUj)$OYFEnN`OXypjRfboNmi%tMlWrp$$4(|DJzIL@OR3LG_K1|{ zmTP8@qsz_HFVKwAQ4X)Jm|mYwO7Iif_b&_o()Q^inL|)`-jg#DdgIFalfUQBi{pNU zqQRIJ{Eu5@7Pq$Y95=fWOWn42P}p<cS+> zw}Kv)y*TG+Honjl&!^sB0T&;r@(V;r|E|8dtQ*;V^}f3eL3MrSVQOmedA%1zPE6e% zfj8~#6Sh8>BwMTc7HQ{!&m^`?Y`N##HxakQPA4` zQ6}f^vBVFWKE=4jrXc_v&DWUQS%bl)l}UoH=eK4_(QPm=?5d&1YB*lEJf z5$qFTtOFdu_#MuyYCdz%$_rS|&=w-Eull>_eAQZtn&o=7>_7jO`LTNhYH13}S{OrW zYwxuCVULp=u4)sbO> zt<?eVx6yDZS ze>e6C;J;czsSGk=<`+2G#8E>g!QJ;B~! zMC?e!&suxGN_Yc0BWBul!>MDksN+=Ig;CzL)DDajv|@f{IB9f9Mis+7d80mSV^%sR zuBj&igk`1GVj0Eb#ntiDy_~|{JX$R@EW?9=n53yIK3k9$C3g`Q>tR(@_9*3XG*Kp^ zlpbmtYIf8~1jELeB=Hm^NtMUp6=W&&JRC>bIzbZ>mSgg}7>cChksZJ@Be9h*#deo~ zfAxYiz2o*+K-9md>mq2NewEk3SPFTU%2!kZWwxjn6&eC1>amwtcT^lSu4Ooc02OIe z@mZ?Wk@)hEJ_WQvR$1H%WJnvU^B*dOo(|6m=)f5+nU6CZ6`mAo8%d(~v=3>+eemc` z7;k9T)TU=U3~uXKZhyK}2U0Zu#nT|~s$`xlHi2pd{RwvFEEb>lG+&v-kFzv#ot&mW zuwUHqWje4WlYwhw!rxdF&6Z(=+! z+KNVxX7Z@3J4kvS?6`3>N)E$vPDwWIOjjZNavm{tpj}D`)4LfSbqI2Yy3%1_a%Z|D zHWS^lUG7tEzIB|OS9VTUFawv_3#aBQWqRF)$`Va}Wl*}$hKV;@j4hP$@JP|it4Xp; z0j-tO;z6MBxt|`o%w$&XAJ@2P+{~Xeg$Z5hi?06fxFzIpC9|-o8`*H5tR&%H5f!Iq zqLB^F)?N)To{=pHhNBUFRjNk8WuQ7aA2v)M zJ|&=Varo5^!Ws$uAC(Sp)|NbB{p~R{9ct-PTIjg^1wbsR#+Nwht^|J{JTKYG0GWK( z4-V(CU^)%^=JN_D7yujxi>GN68lLrixmtW`IwohF6s%z=INgv;+TmENy;!6mq;ryQ zE{{ny-=Og(Y)sriT9{SQu8ramOl%-8AK)mv2s4a(BH!7%vL+`*@1*oTGPl%%rCo>L z_Fpg_;tIB3CqL|sTio_yzRa_{^r}$|zO-~#!69%}! zaiHCF{Q}oM&Z_>@u2y@`Q-f7dNUQs~oE@3tK$R8!^wi+MYoMl?cR}6sFl8?R6*Q2c z8-!<0yXloyR5)MW_*T`Z!r^3!-2|j4rE6_40iM$Y*p@45S;S8;Tj)AZZnQk!*Ogkw zW<}#&U9_ZL2*7O>l3n=2;AL!Mhdaq8QD+2}j@L>}J7B)}@!_Wm$?B?k2jy5f^Gl_{ zb5#K+YUIo92xa0J@WgA5tDA<*k|kTV2cuNGiTZeb3N;(0bSm)7TMs-%J%-TTCEIFC zE7|yDLu3heJJna!euBR6`;Pr|j1VUa>+TO(k9JLdL=%uMdl~R1xVZtPb$(E;EcBIO2iLE*( zR56V%8=?SeR@ij*!aJgJ)4P^Qf@?f~10NC`D`i0GVvsg$zqPWtwbEz2%`~AX)cDxV z%Y!$&bMdC5eC4uUd-#~ss#H5Ovci70SeTE0m`>+-L`K-)k|q4rF4*_YTe7e~Dr~!(>Ea5sVP^yJLEByAr1HDTH--jnjt{_SCozSaw|ExL9&v_vH`Ic+hj?Ke2lW$0&eDC=6FJJ=@KC#WBX z5bfpEp-^?C#PU_-tLjNzi^H93{Nr5Qr_JafbOfgvu;M!gkC8GYRU~`vXKqIsB;BRK z9;xrELYivqxh^>^HgrWDIu+XW2HdPCc-Q?I8CD2stsLhg{N6O@ou7pnKkJrUTBC7v z9_{Q!ew1TXuGf=`U%2ZdZ@sSlla1GyerOY_O?i4;=hM{eRbFDVO+%9_klt&*>zBf* zyI9W{JU<|=x4ctp;QHLEF?WQVyP>wqln+)Yz~08eeoT!`p{hF=12#EQE_rM+J2>gnS6%#Tsp{3v z(R0#O-e23-chOBRV1QcD0|=wrY@cC(S6-~!ml54i?wh@G(QvHQeX=ICj8_)Wn=9qO zo)VdjcQ}6k$sA=Z`-r<_+CE+`=}Xx=`pG|8~65=T9hi(mmCc6~Lw8-!_`>5BkV(1K=?%tMwqPb^`@s|INs%vtEaEK<@f?zQ%U-k8GL5tKlC6W+o0Fphs3fC%k9qtA^Q&7IXx!;>oknC}gdj~Faw%Hq_ z*cDJ=^O&~o?NiIgknwtB+X=r{;1~=vR@%pWb7r9?$rcJcU_N0~xkeae< z%Yaw=FgKapFRr0+v$G7|(UHeSzxOKN_SqFx6J&#DJEjSCrq5c|*SANkYo;x~do~>w zU;w6W4%5`=PCNFdGu~^42>21sO844fQg$vshZ#9e4@ohOCS;bdYs}62`)VbI#Wr<+ zN#vDbp9Kc4D+0x$Kz0XVO`yGvp}`NJV~?TJ7*P@xVX|&;LXFR}1z~hN&a?g!rSwO+ z%pVo(o@aqwR5@CnX=V{LUF7tiTiG;YyIk1O;k5-{R55b$#912l83N~0k$nQb8ZVEXysQB!D8qZP+KHmsLxtl$I zalE2kc#jJtCoIH1{(D7~sEOiK{#<__WpGDS zI~*zf+X3j+tya4N7B8pmI7EhYB9VZ?bO(O*_a27jf?XIzec&dC4@Cgv8j1u$bpH;X z1?IdSN@*WL)9D$?1yZZw`6L0wGzsRa{#h4z=7DknO#)@qfF6hfWuN$>)d+P+1O=J= zA}NHT_ya|8|Hb+jlt$fb*yBbMV9Ag1a0H>S$9@%k`<3pytF`j2Isk=q|4}vQsdF9_ z+xb0@5jL9{8uA`g7UeuY@in06J?9q$WfExSEr^g2iU>0bj58>EBV-)&XVN@0&pt?} z(>r7n3>XRM=I)8yK4@3N2NE#^PSOW%5x6Y~R!$)_YtTp5+(;89!**=i$NC-!LxWgno7>cDo=BN zG?hWYVJhxiOesl$^23-sbUrvVR3V4^>-{kdgT^O>7BzX$CL}D92u$D&nk1o;3zL!M zo{a=M?BAhw(!l{S4J<0P{s?p}bgpnHxdp`8kGN*7NgUQz_N5|h6`2GB=S+zt<`j%r zicbu!B%#tDH1xVH)ti7Y-HPQ2G?L+PHojO->Lm1kqmFWD^cuDt=b2S>E=VRZA!c0RTof_+#}9ka1v~lzePGZf{j&%B;>N0kba57#z4WJH0u2;3fubt zhR@eZucW0(t%q?6l=b~B@(2zTpF z#a%h8fbv4S&fmd9rb>fBcA|-v4E!C)rGrLMWUi-8=Db8`or~~OkzD2EaUfgbjA3b0 z@=bGLC;XYFAe|l-#~_&$M^F!4=v;MIB*3gsi!A=}0}x7GAm0cD3J(J>`#{Tgg(x!R zPez5ByB<2l-#P%O1+9UpiG4dE6E5bv*`KOuTy>A-gJ&7|0YjP7GgXO@1_K<5=f4eM zE0!cSV+p!>DMDF*beu01hF}m25#jnR`~-Na?;e0YEhEUdapGBsR zs!@`I<-?Gb>#`r9ws0{4-E64%(++|?e+e=RxA|-{#FybpYbc2iF@(xJ6h9crQ!~&| zg?SiH3ISoW=_OYz3?m!I@zE&PwySN+A+wbb?$MTLhWT!uW(WS#VyZ=0Es7V=m{5kjP7V!xxXDZ(E0U=kggHVY&XEar!2BGz;=^u$@i)dc8 zqiRz;gX7+BL`0WY?pZ)jRiU)5P!d-3amx{S`EoO}`iwu$@*mbOGj>_gU!SiDEP-BU z3Ak;lLgrFhWN3iQtC)hxuZM-aZr6m6z>f3XiJRyYQRc(USH8+`&(RtI1RD!(UN;7j z#@1xd-3@H4aeyK-SXK%gLcr_4ZAK8Y-3?dB93uxr>MP%LCW(R9yG|)#!AOHR)|2Fg zBA$6aCMSW=akCz1C##!we{qbEN{Py(c!!f82!IN1R)gJ56ahP+F~)41?JLMo8N@h35s7vLdK%n4_y z8Tl>!y;W+b4%MaqO|8{7m3*9O`gTap zV1ujZ>^W(jzbM1~XLaZ^KvnR@{}hfLq=9B=H1OJA*b?Lb>$0kt7Lu&or0A9UY`w^C z_i_!L)X4f7X|6GBy3)YyEj2x39lxME(RdvYo?NC@8X{~ZcVan{ zUi8ey7-}VN<*l056sn#W5kf+9zl5RaE$i6z!6c$?(VuGMbQqM7|{~oAW_D;M2(u>Gl^t7 zaG{`%hxxlqjol|!7GFekX;U79ME_nirHFSHCC&}#En;i>JS#gH#JQN0l3NAnz!9oE zy_c07DlrC~N*A`IZ#590Gdm~KXbx(n7QLq$^JY`|>b*4KY)a(RdD;TAZ{e`1xvCST zZAv3LE6G&0cLwd&4c|YYrz>T2EstK$9K;}raEzcgJx~oRwFE0!f!h?vY1D`ZK*^=~3mLA8Iflt@ z4pNTox@sDF)}TTTW%SmzvK&D~eWOk5Ba%QnN3UGk!%lNoHxL*FxKwQ+TMCKOqD=e%h+Zk4D%>A2{(z*sw}IOykjW4EuEj} zO!J?rO;d<+)#f71s)V;G?FAI|u>i#@wvBV;PC=whj5NnE_(v;d1I0|1!m>;Szn#l3 zH_9KL5gv9<`#my`(JX>@$c7d+_)^{rH;pe^#tB$kq5F`*DI%!)1til+Z55Gv4aKN- zn-+QLMUjqVEIc1u3MSc08yZJ#u@@H+Fl@049Bx&RHR?2ngY_!xZ<)0|b)w6MnC%^* z4Ejb#r0XB$XbJt%sF&KiJbyM)+}MEwEcgL6J#6{WZMI>iaz7)aa#qoQv8#rIPaA&B zZEf$K0|Y+J%)@x=Jw9J6F&DX0s-L&%ey+NJUu~bGX-Eh75A;&c2L&^0oaxXk3HglA z1v;$u=-M94lh6@=66N-K$np+CJ6gU+I8;HGd#{xH?^$T(9O^hcR@zoS#A)JE&Omg= zCqSOk4_RhJu=7;fzQ5|cc_+Adh~{1Sd-R+U&f6cC!TZ*rkhTy@Ks06I?fX6lgs1*A z<4Cy;icM3G}Y! z)qj1ebPr|8wc3gDTDE$_8FvGI?oZuwhYe8)CggX9G0*#gi87mr>Muk{!UTXX{eHsA z7&f(}(d#Sg3Zm_R440~DKa^oOIgahEnK1rE$x-k97nEkyWK8I*V@V0c@*V~6*Z}zW zi~8Ru5cowV7z|6`#hL+%LA<-gy}QY|8%-BqjJmu~%mKzDAXaY~)QHoCCLI)a*bEC! z&v25!p6nb!iUS@ajanRCF&~Yzpc>FF)<8GUC8GiL02GIx*c=!#E4QI!Sk%&v#dma^(Vq zN2iBL9@jsr7|6}4X~+j$D-uW(!AB8IiIr(1r6(10On$mz(V5IH`vYp}(^NS`HF@3| zvczBf$fqKLeD9RMM^f^`WLWAs7yq#p2!FCob8a@|2 z*>5)8ksk}7Lv&zF0TN8aLH&Pe4j*zAU@?41qKh5^Dr5z5g$rl02?|#( z4RRXM6x3s3A$ZWB<8Gu;T2Ru4ygv9~ay1BVUE$z*<+6nPm$mQe{c5w@ca#~4;< z3@P|xnMocg)e^>8tI8jqW16TK$>_`+mV&y}K{1}8qA-{Y>%qd(lRgB}Zr=)^Z9KYR z5A=KU)s_fN!no*VBg;M<3mk}SBU4d#4HiDD0$v-DBSOJN5LQrzWu~Nc4?GwGTrxWX z$g~`bC~^h8uwn>nMhKn!5!nK69RX}7k<4^f%2?`mS`xpe;X#IOSekk%m`c7@)Ur>K zIz;n)`fO`@`nq%UZ&76Cq+$0s0yXE0th88ybZCM!(tO}Y04*hWJr6<$b_%Dk7rpLs zw9vakopm(u22AmgUa`JN^cVx8Ck0gcNLp-gu)n9psIdS-cbXdlc0?RE6TRltndUa8 zZogV?B84Fvy&RpCHIauEGaK^N_UD`JT(BV|4VWw!KY@R9XB%wx99vANJZ89c3~5u3 zSXHtBdJxTlRO8CW= z<@sJ9z0Ja<{DRF;qEZic8Xx>b4+8(p(ji+b-L)JpOEP=F{EfG$Aj%Acvf_~RXeEjq z2uQ$pxe8#t9Nx?e&Y<9TnNn!8ynfNx$}Uj8PVzv`<#q+%R~1dnAd5&#kF>)fFCX{^ zT|G&TQmKUin?ho-p^y-~OwFZJ9X-(GVhIsLn0TvyVt65rydQmuWiUFb&9mE@hexC% z4jOU_YKCInL`^Dma$`#)Fgx9*ch%mmg%l&*2~l*BpeurepLHjYc|3wL1cf1Weq|DY zqypQGZk0`dC+3PdQ(O3IxnhTIq+T`lC-t1Ctj5#AO3D!9DH?7tWa)4ABz!Z8w~Sn% zL;}JFgq)8vHs!V$mU9Y4s|J~X%IBpV-Z%(|^h|>*FAam(ze5SXEZIid`69jnGeq?S zd9H``0_B&*t^yX8TuvF{RQwqB2T~EW#%UUg>HVaYTx(^>3*f#%cU zHRsmNI=}Vsor3C6a$^AvvWHw(F(x!6IA$;L9t7?hdfTUaT1Hv`LdL zU$8E5{92{h4Iitt>8hwaaY>v*aRTlEkBdOn5kd}Xc0`F@>YSpkF^8K@|G3=0)z&g28K(cktfMb@iZD)Hdt{<)Wl%W; zpras>us8}6H%9Dg$ev?d55oJ^MTPjjbuBOtiB-!isj0ysvaJnpuTBECaqF|421V(r zB-j~6ZGut!4diVQLL!hAxofG} zWPo5rtkoqQ5XeE`GcJw6Ev!#(G>D{vbRjZ@sQ$W1-S9lj7DwZ969!$K%Yr8hv1_3^ z>0x@_i7*lI4}v$C7Hs&SbRUetMA8>iHMz~=6ww11HvjCr>BG+0syZlZ@>G|S)gMG} zGfcrZ6pv7(Fr9(Z4i#&VB($)7IgO}dA|E-GEBVH8>d1ma2z|h$3rxm^Yo|)u#-tI5 zZ-of1kMkFeDl7SZwdiy?8wYC~e%YPC>gIB|RjVW~jVhr=rkVk@PrISQ_T9`+eIA$e z8E3>#`8PRc%*ZvRN0G$%qN&A00lvnt~80I-HviO_@tUlv)p(wMfL@k|WjX-d2

lLMkMz()mTF-FVSJ{-Q4cj#ahoo%j2Oi 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%0A^SqsBCV^cg=md^0|8!=)kXce%w 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

GC<)@6oH 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

0VQn7+NF4Xn^Ntc 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%0AgmnJ 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

)I~ng)T%u2mrzVU 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%0DjlF)LOV|wL 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 z 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⪚7qCioQ`8U__D=gIFp6A$Wm6 zJb0Vb8ASgMmGTJ}vi2tgrSAY}Oyl}MXF=xND=8r8-WM5#rp-C%b=q6y2BA3=Kb{YJ zCqxMVLkYje*{p}fdLOwu(J{(Vhln&m7=O-ihCZbdVeWLN@E)d3hE%amBk=*06z7l| z7|NJx%m@%@z%a&OMFxL7<8fg5!8LwuZ2u}4qp~u95;V$<hXHgyo|-V z=O7h4YMzN?q&Kw`MND8~V`)JP$ci*3p9yAFQ*js?N-2h&@>C2Bxg=15YElaM6sMLX zrg2`AAQ}*%Tc`UX2omxvJtg1;KFXwtkQ1cO*+hh3o7eNaBb$%Rv3M=Q6#mj`HIkXd zpd0_>XotQ7%nXeni=AVNcuaa1nB{PX?mLz*jCHK`D3Wnvbd^kZ;)Zk{6)sa8>RWoc z)3ZIH1!D66T|Ia-2BK{PZjD|Qn4~`nYVw!aG+pWBcF=~_C5~;p=$y9I7(V#urt&;X2iE6fW5I7aog-w5I4TV(R~#Xc^h08g_J+-k9ePsx;G>`GV8LAFZ< z2It}sTwF&IHxn(r1Y+qEhb`OGPwM=#I&r$E3v0K+7M3i4+qtfoRJ0>m7+$~x76r0K z6MeoIgK3R|JYS~wu1T>mkY|&ECzTPl_f6iR$4ke?*ms&N7y&QC!$;XI^^XXdWae%t zSmO>ioTvCSf%$6K9Ewvy&$^Fe5rScZk=e|uzOWOy+-0~O1PH^^U~YsNXRz8BO`bz& ze*^tF&FUDAeActQ0G;DD3fWBkW9E`qpdln@(V+ZI2pR66ZEXu8z}npOAVvQjWm03g zz&0adtGqjAFXz;LXfSGZ*U8Qb%lp+kHQiVYW`%vbtwa1mo%L!G;~1}2qdg8@a@?qF zYt7Q&rv03m#Zi0!kSr^Da$xtT4diQY$zAGC2^0N+{`^Ux+jF*b+>z z{Vg;at;iGqsT{Vg?hOwD2?SvBjmKuaBUaw=R9??;Q_8qjs3($o+j`H;;s*Z=zf54y z`iF18YM zMN*(u&1x@yLY|^BJThlOxE=>96~Ers-SWKMl}I5Pd^r)t6<`ez%0rj|(-jS$s0rg7 zTejT5LWJJY0UYAEMT^A{CdY0hW5Sf(-H= zBW(=MoR@uQpoewY@bRD-{NPQ=pAc{qR0WCwI>g>p%?Bz6Q)&Ok66Amw;8X8JAPQ+l zpQ%SjE#aXN(A-eSR!|YFAi;}W&4js^J_(cv7G8tR6M?1RNx|T-92exkU||v0%1l+^ z>BWcbALY%Tcd(FIao`sQ!S!v@=>&lhluT1)llcMHiLFd>CuEWs#i1;qA@{ZHSVGh z9AhZ9QBgS*0Uk%xC6`=yo8ny^?pYaw$ww@L8!5O)D$M`j%EaF;;vfz>7cd@>9x+ga zB|*!bVpUZm0W|^h9N>t+7!f4F;uIpCSmSOCnyQ_E5rPjm>eD24K_IZkcVOSy{EP;C zjFkxx?@iqyDW2}hAqy%JJ^o{g=%ZfrW8p!I=E$Ew*3`}g3@5USQstUwJywXR8lIe$ z0By+iERW^ANX%u`6u8$=MB{cP&ypm`Fs;sDbkyD0+7Mz}&aA~cnpqphg)7>lOg4z` zrKR=Az-HtGdA*2ES(5T(Qxjpw6qFKX$z{Dw5xrEUIFieVaAFxA;8eyy_Zb94DyHly z=16GZ9V`J87(oOz!YDo@u2i6{LERnL-gT*D<30abOZt@ru_a7363vi@YOZDxU5-Cy z9nl0+2xw)y!2xA@2W3Q93#cDpUeFh?3@;TX6AaK{Kp_~qSiWInjg&zmSb+hYz$8x5 z6lA7Wc_ovn;z`zC8=hs%xTI+w)+$ujd zX$A$dOLg7R!Z3~}F;RW?=R!snC|QOF0MHElQ!D3@fD{Pi+836sLlUi{Q;v|oZLwzmUwz-g^?$Erjlj!6n4QI zbmg6xrLVndv(P6(*e%j7k?{HP*VdQ>LA!UTr5#f}F@@D4v!jLv$Mb zEh#HB8Fs>>SjJ-|DA#AcBne8@s{!E;o<*BZ7ngP^kWQ+YwGX?6DRE97nieKH(G$x# zjm+tinyN})ge9Vqr3?CLIQ#GK8V8N=n zGO1@G%dou6oo?uzqF|B=&|0`_ctZawxhxj7uv`GL%nn8oy9p~0I!F*w$R467O$35W zWhbkOX02Wchbj`ez5+g$tGJ#kpuTDyrewMMVAwZNWMFcn1poO$(HNKI^JMW9d~ML zJI>*_M(rx3q{Y&p)i!DUt!mcRs&T=bxS3pD(8O|;XyqB~mp&|H4Q;e+7){;aoL-vI z%FimUE85m##on#dR_(-cY~oq1lbWo9(4;P2L~x18Oa))v-r?me?&4OM)@p5OChmJs zY(ao)yO!%5BCQPG9;mURUG)E{<9;qonuQ@)X)OsU@JX)fLPb=pCdP!Q$1FnW8iL^k z64EwoORgeH;_bKMZQlMaK1QwPZtmum=E8ob$kGgs=nU#IZpux`ct%or!b%>l?#NCl z_Lf`rZm(J->Iq6&?j5fUN$kW@Eb#KKDxNR8nq}7Vt)gltp9U`Mwl4FoX7(~~U67~b zG_3W?tF4l(Ma8U>hR8AkQ|H8vFX8`iiS}5^oBltKW7m*2XFZdo8JTEe`F_Sb}V-imvLGTMrj1 z5R+_n`mZAyX{Ui3=Cc2*EOKYpPA)w*F`X2!0(?rp@jq_x8XoO}iSh07${`6$_#!dAMw#!1tNB(j15dF6YwO%X8A=Uu4i_>htDsmG z@hGQad-y3}xp5pj>^vSR9TOM&h9)L=@~l4aBPa54)vy4MaVnRxFds5Yy>S#1Rx4id z@GhS2jhu#>l;u|L0Z(%Rw{Y?5@hU*D63=ncmas5?vkvzu;M(mIgRCpwu%c3O8E5e1 z-d+^>?t57A9S8p^)`})6+;cth@;ss?IQKK|vF{+iGBC>{v0$?ackJ!9aywTY3$iOM z-*N#{G3EwxCe!n{it{yNGeuX4LN}?BUTiMoa2RuR^7^wjk8_o6t0X%#Kp!*-gOm7v z(?Pq1#GVKF#)U-xsX`!|dH-mERhH@~2f=T1*Q^VuC z)^H`SwKqF#8|QPA^)(;YbWP*5$`F$4c&E9)*zzk)PZZcfKDVqf$;M>J^{Z-Z>{Mtigq2Ukq9H3`RH#$N6~6KYyw z_PW}&(l)ha^RbeOcJD^>w-)zS-}FW=wq7r7`EINir}gftwY)kRorr9*1apVtH45{# z2p3pgYd2Lh_E2l5Pggc^6E|`bHXiphJvX*Jj`dh8?YX8kNQd--f%dp{b}hzr%RKHO zdom%J~RwMJ9;PG@yWOW9;Qc7Jbn$Zq#S>-KJY zH*dG9g#Y6n&-7j6v&6!}_>wPbAMJcI_hVc5J$vwdvm;xV_n(q+fS+`DZ#Iv+k7g&e z>X!fZ;;1*(p725^Hj{_AM^71Sf75d3c$5S3WVd!4@0D#|-AR_Ts-m+ogYAJ8G+Kvw zSt>YatFtdO_^8z^EVp?xp%9prct<{ zp5Tfv?QxGbq{FyPe|4VYIZ3N?l%F}3?=oa#xu!oe9L}~@gRhViHPcphb(1(|?{k!e zaB%B*O9M88r+1_~`G4mvE>A5a<98po^sdYBlp}Po>vD&8@j5#-g7>(W19||fx+vqe zfvY)&YudEmxqcJ1a(D7XAGQ^1tgC+SmUHoZ>#^NhyPbn{$#wW$ze+dr^<5D9$2tFd zUX=7$wtIZru&VC$oNxQ2Q?Ux`d7omeJpXQEFL1JVc8puQuG{*bzM~hzw!x2@y>n9x zmN*$eXZVTj<>iH^{2-tll@9d+x25^VYgAu(y20yC7QX zt~39YsjsoKx2w&&b%xV?omQBV2mHxfw9)r899Oc^Z}q-cJk$?4qO0Pm^K&!PYNCR9 ztTUdM6f~gUFjQNep0;&6$E5dCJ^f)lq<8s~FFn%^JAPBSUw?XPlRJ5feWO!1u}^#; z{W;l>cP*;1OdtAr2es7uGm9Jf&TC0DBl&W7=MB-g;1jW@BeCND3T68}vlRb6N7vxj z*SpY*dUsd*F{?P_$KbyQKHguqR}VW$>vWdDG(rdc<}dijiGEQZ{^S$>Bj+h_8~6Y} zI=Ax*rQiK)1AqF;_k|}s<(o51+kBb7y_vuJpLhO&vm}#)t>*JS?px^Nv;D;p<3e!NfjwF87NfddH^G+59T!Gs1` zxoY@up~8a`DOOa-%3?-er%nm%xDn(>QKBxk+6Yl&%8DFM4&>M|6ibFGX-*6UvLz~= zHF5Iv=(45COdewvy?Js|Ql+1kE=_sVXH=SuH#6q;pUt>G0DjuuX;wPNCco+)1gk z(i<M3X?lz&E|Glc$_Dp?(Y68mgAh#+zdJ2HmnxJp z$ssS)OT;>z42&%HEZYe+1ySsCMd21Lf+f(bdW%s<2@7>GzZa_`jluqO@U-j@& z7a4tbQUO7$??d@WWo_FGZ`zkcXq$BpwkOq*8YY`u z!@`YJTTRz3Ftw1yF1cq`!R9ozYpve9#t8%D`^>QK-VIl(bv?WA#dH(PDxy>cddJ}hCb5Jx;k+r9Mp$1wqH9w-3g#clsUjR)=c!_aZeo;IhwixYU?1s~k> z@F6EZ)`^Zs5a_f}KYe-JT;D#-uOin`{@J?UAN^$e*S%_bGv5FuQa#bluX8wqoQe{) zxBIc`KR46Pnl|=)|}WuAO=fqXnGrK+&0FA zS<#P$fyE$)SSB_?40_J%%DE(nFt%U`kbVCYkla2fK9Vs>dm z+BY=y!S7sg6qbSVm&8U&OiWXoV63R9DoK7Vcd@LQ#b><3j3x5YdKK*A!IRCXv`uiD3#6gq&AHg zJ8^O|jF+sZl>UjiOh(I~)VdS{zbTwD4rG|FSsp1LleqYa(tU3uT?$>2YG;)PYU5R4iBo2R^jc;;=`QQ|t&axPUwk7gHR*amYj*O44D|(D zfA+WHEbfItdFogsxJu>$b*qiS+9mOp6IbDNoO%r_0jZgzs9kh?xFshVi=(21M&)cm ztkFwlI!$+x)StSHkkKF+B;}s9w_bDOa4A@xks)`poRw-x8;hc(LU*>!xma`?8ZlNT z=U3QFj^KV-y!KK}U;F=ZQXBrStmX^uYQN~tp&^ZSjVxBKB62wJT54mJg-aAM zX;1GKcy0k^SCLqTUT6Zgc)%U3=bU!Vhbre`Z%yYC+osY`IZk7=YfUXH<1Rr(XQSYi z%TIN)-VRq+#M{x{Xn}*hKyG-o3mv5DQ264+LQIX%I+}Ltx}V%q_sqb4w$q~{UOpk%wtt{wW4C^9rVFIXeCold`KoWlCnXc;>ZsA0xvX_1DuK1>WZFo~ zoBDOkn0VO)Pny?FJg^6k8{#;#y3*q|;8M}u>Rn&i#igv_;r1M!3QM+t-%2NC#jIm} z%aC*`R<{_}>}~>^S8oSqp{l?9!+-z)A^8La2LPD>EC2ui0N?=*0RRa905b_3NU$J5 zQKAegT*$DY!%V{lZUaRT6hw#?A8Oplv7^V2AVZ4e7%G&*Q6EcoRC&?hsFx*S#+(^* zBTADrS+*32QsIi9KMw*Oy0hrWqevMd>@YE@O`}42T8vmRqSLEbvp!s*6>H6fCZTTS zDz@NEurkx;e7RMq+O<82VjN00s92d@^XeU$kfd9Tdjks=DOW1Y!Af;XObhbt*swnF z&V}3aq~pbG4KwB`ak0_2b`gsPjJRq=&7Db`?P_(jYnPgVdKO)ICuOxHZ$h@5I4J1N zN+;KLdz)*a zRA1p)m(WtwmG&csKE@arcolv}9(*xESyp-4p$4CBa9zYDmX}S*nUxP>CgGBTbucDj zYMun6iD<@&RC~bXWnPLb4%gjR3*NcqKz!a9TTV4H*k_Aix;JQ4%E|fUY#pYTl9y;r zc4U-}W@_MXS7wzbo~fZH%q3DrUEkm^<S(%zv zh7t;ud*>OOS(v1j%4MBzHL9LuD>AF7mNt$X5|Y`=*ckyn}Lbh;GTmx;5*bUQ_4nkeRa^}n{_ zE1j_tt8~(NnNTFf4+*CT3jrro^MJOKSADJSM@o2V5a;OM?YUq;0dz?oo;Qg zfkxY#TOx%k=W(loB3y}%s>43oZ3=Vd0wJLP62(4wd5?I15*?@L;}wwX;b1m|p9kl4TX)a+(fv)#0_bizIBwhNYlhPEYohC*vX&q5`f;5v19Tb^jx{;PY z3a8;x0*fKl@0=R+jOn^{MKk8coADIrti1Nnl1{R7ZxrKhocS5)fYhW`laoZtC`uQ# z?IUU{*(TlAyr+QkKCVk)@V+Th|EMvO&C436WJbs@Mv#q7m7`Hd$f!0Qu99$UsYeHB z&&bWxV80|PR3leZ5$f)eDUBv8t>{u=@``MrjN0MWx2?B5M``v{8Zo6fwP22wtYu}? z$BH;g00t0TGir=+coa%_#?!An!D>Mq*p$0g^k{n3Xp#8VA5I2#a@8^*O!c`&n#s&> zfBGvlhu1|Us#bEeTix>}yUP{-T~#Oo`_NVwqBf%HC!?PYZY)tmxDl$#V~`!5QN!3@6OueEG6BxQpsizojt%>Zq@A?dxMl{L^?z z7^gXXU5kg@zk1D5T>0f!WoWEj9bYJ%DHAc2cMN38wk=5KooH=|%;lM#(qT?bm5hUG zQN5v%aoU{imVAq3uof-~i(U3;4WNFwN)Zx)4?wyLBp%zeWQZQA@`XM2`T%{cQRI!VGZQ`KVu<|;( zMzW&er5AI@2shD;Ki;&XI?YJLwwa}>R!~oit6Z9D7`8|i^_qQa+Z#rjvKWDObu+!Z z@ag)q_dVEwfc8>(Wf`#n9wnOPX;CS=IK9u7_GH%{SFX11ZnGbm;=Y~7DWc!B|TG|aL)-smNnd+8nAMXPnm7$ltUa&$Y0b{o{2 zvR{cmzCUzVFx^)FHhD!MEa{udd({ojHO1lSVVIugQ**@bEo;W}mA!3@V#YLa6Wwh| zyZV!O#=t>P9_bS^yyfbC`FsmDbNT|kNqYPAfI@xY1f9#~Zgk}(T{Uu#vU#+;4Vcsm z7V9hD@$CzCc!8I@Y)0GF?%yWS+PCW9H0w}~rX}#j-`PfE@^f&X8l%`FzU9zDj=!i* zI-V){@ORJE<@vL$ub-T1i-(-c{+w=q9s1T;Ch>sT)eho+buy%bQ`3yEbJ;O%`L)6C zuF;0O$!t$Qcz53F3{Gctsc7-ne{c4UhZfMZ?e&gl(3|bFu-wAF_o}9y);DFi9pNr_ z-uM3Kc<-kFbYmC$sfCP~ziv`py?3uM13sZ{yZO)0`23t7nxezbKd$#CSzA8~#d((| zokwNJR(+}jB{H{9f@geyqiV4gbY5g+NhUFkHE(o~V|N9C7Q;>KtUNOWvRWmXt+Q&?r(2O>HJXC=6V@C9)Lg@Oi0RXK-r!{<(w zlZG$%`txB*)J7%-Ly?#Xn}`EvC`q>hhI0T0Qpi#rqlsCF61`|%{DnXVI5veM zXqg9jQCM3Ob+l2BCNYMY zA&g5giQ=P)bKpQPLlKo2l8%Osps=wa#qRYubX zmQ`e)v!aByRzunXZ_zVIW!H+_!$>FjSavBsotT-;d7rLnLOR$hLzs_?#VfbjdeJwQ z;{lGSm^#!noA)w7{^u{`_H?OcY7sS>W0;&K;gojSp;5`1_^47Z#(Mhan_$v&aQGSl zYJ^I*jr@iNvT{R8HueJc<5qb zp%oym(<~M$N_|(5Bj;+EMW(ukeSTS!f!Tz+Hh`)1Wt>)~M+2nQnF+-I2&lrzp_Un? zM@UBl`a*m8b+&k*`j>1FdT`wrWwptmE>U~E1uhSCQDM}AX|{&jM}UM%H()rG5q6)D zhL`G?2EhoL4atKUSE*V#Ka?6>9<(opw2J7qS`&11)+m5lT7f3mT$Y-I)suj&x~XVo zh$MtIKgy;-TBJmIpIL}`f(ayl`em}AIK#!OvMFMVVGGvUVg@e zIa*EYC5KY>ks~&y@HCg$`4gWBiJXa)9omVg2%fiwTI>p6bs9LXcy9JOT=NXWinh2y1~PDYInuhLPI zHq@7~ zhOBENEMlpEHB?@@J-K0Yuexvl5pZbRsW8U4tZI|oOFqv3>s>yWT*k$1JLOsZGQOg- zf}kXDu=ux0M;q0crPr9R_SL0oCcL`TxIz?S{F|3kYdFzEgQM;r@T|we#KaN@2kd>N29a<(z}o;sVeuvq~ypF`kE>{p6vvR zS0{r&OpE(S#3_uWZ55Q?#aq27#l9=FXUT`H{K~8=cZ;k_;x%ee&1d&)n!ks3@GM|~yt^W; z(>VmD7A%F&%h3jnh=l9Y=2ukytCq&g$GNO}dmDMK9KHjUw^2GjZKRXKgVUe9VlX3C zV_UPZ^V5wzJ=nOlqo|ULi?y3vO;e1qo|~8>yQjJtyj3iF5P2Ov>`5T2si^B+W+#7V z{X$*6J0?ZNxLAno`+@ds*fiV3>jrBNJik5EjXIUA<_NO?D_ox=4q&An{BPLTxWJx^6-MKAD7T)QlMLJ%(y z-|`L9*D8U^9f4mvyuixd1)}&T-=j3RBDA1%fOLG2dH7;)x_X_eHe_tU>7E=B!(%SrgX0**e4iIU(Z64W{7V-6?-P~>DD<`o{~ zxsl;fZs!aR=uVF1)rI1b!RLbi?&lgV;eakFDvs!+7Fr)p8Y50HSDs7R3Vr#sshj1mNgMFa@&y>R(O}1`z8AFak+F5LUniUvT2K zjsyts=L3NR5pLcNu;dSM1x79fy)F>BuItTiyI)Z4vJUMd5bfE1=kcxGEiJ9*+1KPK zZu9)P>vFo4y%0*U?(DtD^!437E2`4ZnL_q2U(F(&3wFI#Msz3l?@u3!c|KoCu!5JO<<>kb3Q4g(Sp@hA}U@ecGO z{{|O;^iNRo><;t}HV^^y?(*C) z1@bQTLQw3*KJY?N_aIOZ6tD#sBD|YTxp4Zy{BX2Ml2b z43G$H5A8Ug_lmCsygv685cLW{_o|=;kZ%wW-||(k1zfNJF9G?9F!C0k9wET`gb(o+ zKnY$@@eT3u{F=r*6>r_V%HN&14wj;%?a)%kW9fe9bIt;LPxyCW`n)azqR;Y~-~(l! z0fb-n9^e5!Fa}NkFa`>6{bkSdOyB}|Q1=7z@7*5(_CEI5Z~2$M0OxN8W$*C?!2sMp z2KHY9E+7684-ni0F32>*jhjpf3l0>b@E{X~3c*ld5HaBrB1BY4I&l#Q6B!DXEZ|l! zp%aTjRJKZCF`*igB&#skB2uMGoH;FG$OOt~LZ6F-V&Lg=QN&?8jTQxp)TmCVQKe3$ zsxav=tUar4<+?N{sGdVd9R+)|Y1mO+wTxifc1p~KVYtN+e{5}3VhkhNr)d3vf-sWDvOK@I#zS3 zwq14$Y%mT+Lawzyn#)hW*32L*Dh4!r2@Ba|7zw8dP>X7p&!DoyrZRv7(2fWwTTsNt zCJd24H6)P0pufIAz=5ya6H>hCih|`x@5n<67N?FxlF234lM=il&k9ngDW_av%k+Sf zPe}5x>`p3GaysEA%pw2|Ck0QUfT9Zldu+Kl<4|*qH&+a?CX-mpZ;3ne#Bs+MGs!bE z9!gUG$OlFZsOUnd6m>8*6*D8jA|N*VgM=0-U=GrgE=nN3!#wziicB$M@wd8e!(quH zV>N3#`mAh{*6x@ZGfQ5#5@o3CeiEzK_2S!dJ1&nsFUl3RszQlHor6h-JLkl4fi4cB zi8LK*Y+x(n4BcWNIt6S64>(Gt$tE-lnr%%#6}rU$Jrj+|%_w|W0>eM5ptBppbfQ24 zNjSnOTp6n+aInE>;4h+&_A7U@E5-B@St2tg%2qEoj;c#yLtd&pjK|v*JCQ|BR@p9_ zMOi8h&Yg;wzyc*EG?FY_2)W_ZWD_P#5f$k%7gZzBPCn!PGYY0X2mvaZ9{9_lg9eQM z6WhUjIM@R>BjiX6QQ2T41g8%m5Ksv9%dr)Qn$V+7hCeN{PhVjLb7Utiu5~9TlT7*V z>@eoIa@uT2 zxH1!j7q7CquNhKsOsLp_eoyV1f1DTtHU3^spsASO*B&JS-C zpR7w;)8pmCyA{J@rU_#^p$ftN!5%!U7DK$J3zDh<;pF-pg2V3$k>A4xrb~{I2-kEQ z!pd%iI$+ubjFJQ;nq^c~t0|fe&FCH&M3gmXSvo4S5@`m!isB9k!5!|#K>1`vlh_1B z!AhH;=Tj3tr7!a2rHVpgQIh;6SqykT-Ye>{8vKhYrbCxTbdM1tq_1Zi^k!0eh0_Ja zT{4L&CpUu0s1%9X-L9}Tx{dPbTjt=b=0&BZ^kBCiXe#0 zI75sV=`cF2uBkQdP)#vvcr# zD-4)q8BbMKd`g|)*`iHbQ?)WG6`9Z?LVmYs)giO*z|O>Rhw^+6(3nb~b!NrQg;iSC zqB_+rFNTsOdph&9oYu;Pm@W#Iy#_`Ya_b4(B0@FdGW|(s`QHj=GwDZHnR6O*+$xwi zO7*Wb5?IkaDgNJ{^*f)dg@#7RuU*#4mb5CoWlhGD1{)Z50g+~u&lM*_SJTcBssgsd zMq(;Dkwea-AQs$^B=jRNl1fL)7&nz-ira7&lxA=+LLlPd*FiqCVIcJw(IlWYYU(7a z-ZfiivPfRDp&O93Xskr^(^;*r+#F6%SLqG3F`@|->7^dA!n(E98|LAVxmM+h(ur0I z(N%4<^hTfxUo+E#2T-(1^U=f##i=|Wpg%@PGSi4FAt16GfDno41!*2l`1!@lMd|4? z7Lp=MEF-S|v=p}uLRj+R9vIDRza1VUM*z5XSJjVIbv5n3+0ZjOv2eyqRhyJv7^POzxaY6n5#gZMQMBs#t1` z5Y3KMbXad6P-#gU>C&5VWxBhi8(%3eeYnQff$p)o4G-&`pyxFEVYx}7N=I1xLm`;| z02Yi>DTyl4Rhs@^G8gvZ1t~E_45HndvE&>-G}8?dlPX{10xy+;Em&qmSEnD9?O4c`q~m z&vDB_&<>Nl1&yuw@;^H(+#SaN9<5Wf_OLGLBs5e!wv<_s@M*=^@L*b#m$Qf*ah=Xgj~Nw%E$Vn_sl0^6Xr;y$ISJL5&C~ z$Ee)?W-48pP%BrMq4B|IL&pVkApr@V{;oH)O@QNUDA2dtD?uCA#$NAm_kmK9q2=4J zR)B%>rX{>LiSO+?7W(^!V-?*7$G|S+h&F`w+&j8k*)90eWwViy=dkp|7%te$Sc$oakgXY&Uy! z%#d{k94z0))A}{3M(EyD62GlmY4HSmPJ&6ALb6LjWQxF``yi3EE20iD8cGXkXN2f_ zP@2K{J-kCzN6`hMe(*{aR2^gZx>k9K1fwb;Js-!|O+htCM?tCztjlt5rVhUTBi>pu zedQM0wWQeA(EVLy+j{zubdtMAS0XJ#GcMijD=IWTT$CXblAl`*?G$$23(|1HBf<)X z!3`3mjDfUD8vgHIA+WOFX*j{b!0qY*)U{B`AW#!xq|2L5xL!U&ZvoD$U>aTUU^JFz z)3B-s@E=uS%f1-+aqJTG{WV*|q)}pLUc8`B!=}#2uTp$JMgd%H$W#rl-9*4ojZ^bU8t>HB z@AAIJie^?3GlXzbjCIAKRa?M`4|OxhyI`u{N}6~#m+;oqG(kw9gb6T9sd7&NS%$>v zvZ`r9PN+k%+(5-}c~Os}fC0f>EHUg;*ubm11}v(BO+8vgD$)*u}E;WQJQRcOHdUR(s2I8R5ukRM{(tnoB#nK)T{&yYpnb z>q42jYV6}+Y=>Yo)Ow)UB;l=kU5*=@%$Sd-+D)=0TOP7vwn^i-~=CrRx z7xqNSF6DpzndfT(10H&_RxyWH2@U2##E^f?gqx6V#IauN#g2CMDRvjEuAt56k$0C; zrj!cBHdn=BB5Am|FoLXfo#mYQBpQF6-La$$NlV){cma~FnLL%g_h zT|BV@c#i91f}e=;{UPZGR{S;3DlMNM+{D{gS4K9wls#5eEBdHcnYK0mmpG&sLhM&> z`vO}k9=#+TI|k|vv1m64h7$?z%yhWS3Yc$bB-o-=44v|=Lc3~j960~Zm7qy8Ut#Zj z=B~Uy?eY?RK2XhUU=isM@`?K!&UjCn5ZxD z2Nxo!GG&gBfnQSni?h=AqhOF>;+4;+pu`|zlr*?<*N+kMBiSWu(`G?UVVB;9;;0Xofp>2C$Qu~x^TZP5v9a)F?=z|D@ z*7cve4Z{S`zZ29^B*`%qwvWIClcM&g!Qc-EF4UArnNyk3)sgGF-f7t#dVZ+-&n>}~ zy)`Q%o+$R~@BsQ)b@qjrXxF@1a?G_5xVpO9M@D*)brJ#cKwuq+E0;>t@M6X?pmJTG@`ueNR>`+@-kL zhQ3jQcAV8D=fnE?B4l9tWtfBhv11{QMT+6(`b1hN)t9c)22;hgMO9@0F>?ZJo1W#G zx%NC6|K6is2$$A*qMK%)jKHJ6qYkIXRjcrV7L^^vSQ-+X#ytuU2mM#=wn5O#+Fu?g zR5@0Q0*#Mq`VJCPlm7v-PACIL^tl16w<|X#m>2a!KX<0xcU#3?bGWV?>{_l55f`D2 z4>*W;(A!Eh_-~uZkjB@)+I^`tgVJo=7cx@SL^}k^3KRcJNRf5DFh_mZpt~KMRD~*+ zhW;Ul43mw%iVPLKhABw}dVj5&czE=m<5;|&L~W!Ov*RXz>r=eD?pq&-c`&D*bLXyJ z;J+F;AHDu($*M1eerdZ4x3jBz(|S&IoUNi}oycuDnpSA6Z!KEpBM1_||5<(#GEX6q zP_Kxh3wHk}C`1b}M55TzDznLv7uX>%d=tOJ_+=~&83iGKiZ^9GwlF_-!#bRF%V3yd z;1hV5ntB{x%L7_1+rnfG`A+(;P4Vo@=F1^AXL zW?`>S&(KC*yvy|6we#H~=cJ3rD$yf0CFyl*MTN)tqj?2zau>Za838 z??Q}byMeY8?mY}fuhpbGCAf|{O3Q6ne2rv$T;xjLJKugmzuvV=Aru&KHCS5Ww{awv zA%Wnq(ZPZ#upB=iwAW94YMj1wesp3{(ADiUw!6m4QcuNQv*XolW~sh6dBasdo?U%& zZ5D965hQ)j7R2;mO$k1WC{&4j2iod(0l?=$%D>?9waHB&Dqqk9-7xMCkX#Rq>VnlG zX^0CRhyz!!F~AKywwj7ODTQB{zhXBegvDX;?W-KONpL7)0b_9P9(L)2X)#FaCD2es zGI`(En|3h&G?795-i>Owabal8Z_qjpNe((d2%)sfV@70RK4$g;2No2t88pBVSp_d_ zAGN`Wmpjst4;T`xu<%My& zYL~~vpJ}66mW-w^6s7O|DrbkEdLFhuq+ zVseXj7uN2%;v~}CWf;!}Fv|ye5I4ObjCg=-@Jr$$0!u)xx~rtm%&o%Jlh`Dy2Bhqu zrSUe1IYN=O!{aedBPK{MoP1rbNnya-IVSbuK8fDkQ}qQOmO>Dxrgvodm>_Ae6h6S9 zzF5Xz`_+-#hA}eX-U08th}z~g;pN%Em1rn7i6Eb`4_JA*`db~|xs!WX0&(L-Wvj1c zR;({j?$*ovkM{;vnVlnFu5UEOZ#IovVQ+5a3s*gXzi=A8AQ-Kf4u4k>C+ILbzi5OK z72~>ST24MqE%|+|CM5hZBgz4>p0QlQ?S#=4x-d#X+&y#ihqR@*=w!C29dtHV#{80B z6ngOUYRGz1A=-oI+6%sS20a?^|LfJQ9V%E^exR0^!6!ar#rNKL`)A3_gH6mxTA zSQ)gV*JH`UY!WzkU0zTZ1W68q?j=8eRx79$nu$FGtLX+pemZ$Cix~AAac~Efx7c2D z=wwbGob0XnZ)aRaJualCbXn^e8|T#j_aCI9gA1uV3v zBcnZ@>j4L9f6spMN<1_&EV9vSE{xa|3siww%Sxt*Mv0hz*B|O5cCkIHtrF))PV``U z=l2oqrl59_UZ(xyv-_Qz0)Qq`f^rlMS_LzVKiQv_f`_9dseZU9X%!R77>$MpDpGM# zGdiV=rJyNXD`KlM!mgs=pTcQ6@-J8ADKJ7|Mp-y6@f~aEgq-aKYKatK_-+W~#Ci~V zEL9q=8r^RB();F~st$1aA+uCug5v-`>UK9nkpz+=fH8#11}YT7NDHY9D0g(yzn$wV zc)Fa)dy$8iS@l_l$L9wsZ0tG)&?2nd9#w@HxoZ1J1*N`v34pM#F_Nc2O1b9}y{9G& z$=35~>EQ;dlNx9B_Lz*=7d>_&t^OIE1W$a$rJD@HU`&o583&bSJwk*94&aTElkmd z!H_;0$KDkY;&ZL6pDFammseX_Y;PQU^si921N)Q~l@i#`khMq@$mGbb$SFfnT3+79 zNyjTZDTRVM$9^VR#7Ugu=bF`^tu1%rPC-htkJb15jcuG6$q4*Aa~FSErHa!s3%&Kv zcoa?aJm}c^@LD|%G`z`VaBG+9$l#?$Vb*VDn`Vv(PX0Wa!^+>4Df=4}ELCTAOAgd#R?oLL7#^Qr0VUJGnPNmIC)#4v^DT%<Gcqzv3bo+G zeJhI@mDOF+f$riXHO+vqvUo+P7D&@iiskGntCwLBcgngc2Ah^*oPt@B!HRMNlC^9B zHlHB|^g?DQjA+UTIhBhKG5GPFJ(G@8(ire3Wt!fj5y68VT7y^!R|N|*pD?k2AeY$a z!kkdjI4(~%{nl+MdSKq7u3Cye8q}hv(-Uu{f-KuK_xNJgPyz!Ebg%q<9dDE=xe1fOD$Fjc;|TDU$|Z0EH` zA_?^p4L|G5O71B<(OQy;R z*xBOfGO{apahh*4)l1JJ-fYvBa&!XSUv~pO?2QpVVzA-HLzmogB4z zZMh>NTlNV7nTE^>-7FxY%pgn3LZ$ZlZf&JE5KNW5 zCqy>V(cEA10RB**hz02ID`F?o4LhO1#r0dEmd!ql+Hk%^<)I#{0e2);$QXpvB zWYt|$&;D{e;mc~-YZi__=ix8pY#kQ=t7cX9(Ay9Y01+rw5vUHK1wnAZRgg*?oyN~Q04waCEy>O> z!}hOeOjgh>f{*;8*TlOmX>|5QWH93gmOU%I925X3_D~qwUT&TfuwZ&BNZ;A$ls$!y zWxdGgXNc0zMy&!YokYy9sKNTNX8t3TpoRMUqd8$iq@Z1xp`Syq`iM{lN6iNa$AHaK zqVM=v^7-MB`2w)u5c9Tm@capon4mBY#kOQfD-062Au%sl3>1CB2J5+xM`d~=8Eh4U zm~^}hVPy042~fY`_k1Ml=Ikg8d}imasxqk#=9X%ziGA#Sg75tnDVD`G!_QByckhrZro&UUuV!Z(QDWM#) zj1&OMB(gezO0LIJ0>&yWdKoh*oysa$OtO!OI0a9!0rwJhg2JDHE!g5_)}AevQJ-kS<5C!)taD+Tk%zVpgIQ69(fQ zV)&~kK5noqjC%+RpdB!fZ!lOf9|4?G5IvpzrN|C0BQo-k5eeG9-$N97BhML+!IPd* zDL=3VjjX;3()?FvfcQWmgD)`y zoi4XqCZS(AUHaVDJ0~GR%8}5TUPZJpx<|f$NpOTSWtWem)g#c!fWUNG`4{MVvN{V% zT1)?ih1D*LPCH2#JJY^L<+_*Wj!;D^%a`Ib2NM$xFA^?^%A__PcR`dhQIA`&N0KWj z3tBffT%ZKO+HIL8O?@CUY&g~bGWh3d492Po22=%qRa8Qpe=$f62AAy+BK-WbLCkIZ zOg;p{dj`f$D6BP@)DslKw>v@9zu|n%%W{SBJE%T97EWW=3w5v!!R4t1VM6cmWb;i zc#sE+rYvNyIZ|ClLP!$Qe3191q$)HbiDiHQzL4F>*Z5=YBe2u(0|IjeOrV=I!xhX3-In{H?$7@IEVh+P;`BWWM zBlaJpVsT1Mv_j1(g%){KGIpCMEXR$)i;nt7ukAaw^94i|C+n|gq8({+s{pmvB?q0JYwwv}U#R9Gu zX}cFKJGraYdMQE@bmyXsh?$e57_d^*;n_@rg(7j5KyYME()?D;G(nNHpx$aZU8q z^?cz9f9~8dy)mFX9rsNbr+uE-!&xg#0PeSqCmF@?lIo^88-aI4Gdt(-4E{?^*)YxYQ-R%ZGF>;G7Vr$fR}Wy| z-QA*ueUM=?dx0y$QZK+fe8w=#q6ZLJX_J-*oCc>&a?lH%H91li#Ap5c?79>U=5K?h zR2e6%pT)qZ#-Zu*AnRru8wv3)9Uq)GTC7yJV)1UlLC;Ays4^nEvZAQo5nhn#H(;Sf-qPjVZD%;qV?Tqc|C$1G zMF_DK;MB&YdnVXrHS}PBlx3rIWG4QHE(de6-630=KO;B%b#>gxoY`u2TEH^M61Z>< zgHG7fW58z#_pAeaqA+wtZf!iL+)kd@xW-WB{@uc-=*Zf7mRw~kS;qD$b1yB&2v!Ua zBInuFaU$fy zm7pS&9q0IEbzlx zj%f=%wjBXLV;D)-Bl5xuWaEM7)W+si2(gt1IKpJIV3EBBiNC6@w(+l?J;u;Ii9Edy z9Q^Td6>|mB8xIy4M{>5dyOuY!c0BiBRkN;xWXrAL-vcef@ZXt+i(6HCpDBUwZ^$=}Ei5#_$Q&WR z9eoTR*8w^zv+WK$?J_`4+}gSI06H)Jw|6?;j)d4S zw^|^4oGw>@E}KDMC+Sw12^-f)Gb!NN%PQ4NdXxJ|eAhqp)!p$fDbr4@{Vqw6DKoY$ zJ+|u$D@yprBeb{651l7ej60u=VTuz;xzW6@!g{O3joJOX+rOH0#*fiq0 zTpY-F-!?pIrd~Fp)fw>lsWH5zJok)LUGNvLf~*})p1e!-KB~1}%~Za%=sty_pLL!s z5${A*iJn0hT@5EsU-wV;zu6*xb?3HvR{w0bFMZBrVmm)@V*CAGymyN4?@D;y zc2_O!_EpS2 z)@0h5akcN!@r3RETCMeUtn?_lcv}PJS9)?K1k(G#d$*asb!sqf{_@6C96 z&BQWzkm*(=1PH!U<=1uvD0XeCI32fsbZxp&{`&Uf^0|HPv(Xj!vD%lX7(h#k%cxSb zCin*@uy)v!n@pFz6})RH(Kk}pU6!fsf^3PM>d$r|$DL~6FZ9lYMKbkPECQV#ILX1a z8zYvBPO+1g7ha#BlHUO$fhV^7Wvv2}y+24J-QP30>yRJ$Oaf2A#VG%S@X$-eqzQ+^ z<8r!np&TJZ!w>=H(jH94BXKx9)Nmloa*{};GuXYI6Gm+i+S~I|pAKg-+05bm+*8kn zavR-fPqk91WO4;O7apvZEtaFDX#lTRZ6*lSO;vAkxT2O~)Vczcc4^MQEsYxWPHppP zmKu!~8&?}bI82AVT5J4ubzAI4{cc3bkUeg;>YrVVsy4G(>^C!=5U_OR*`7?RjiI?E zb(E==OH;WQF|Tr{SX+HJbiR=|{k9u{Zqg;wC#oNlIr@(z@!gnRezTl4XZ z>?h7X9Pg(DpLdD4{ugGanX$qY1v{VH%O$N+?7@H+PJ?*EaapcFOa|Qvl+nUpyPKRx z^ONy66M5QfMzbTfEtA`r73X0+j#RCAKJ-5>hFtF}mzHK>8KISD9EQf*P8@_Ahrnlv zQAuJ5W0bhLQc}@*1aeL9ay_g<0|TSV6Tkw9rXescy+paUEQsqV$bERnT+VV{ zgf@7|Q&tHyae~=#7>YbJvC<`5M>&joyE+QN&CuvUu}?On?jlw;jRg}4|GW#>^FJzd|<;WXYrsRzicyxqF>net7b81v4 z1S^vLEv*jHxc#y9vlU&>OYK6!p{>Fi>3+={ywIhH19BnUYT{C>#K}r{k*aPJRWD<| z_S{_gl!bVO+v6o0C0f(#>>~+hh6AMMu{x-Jtf3iMoIF1P*QQi%Q+LHuW#75X+sBm! z^)E2H1e85p*;M1w^EPOGe-Uo9y8m2jmffkln~}`Gtb0Az9y;BUiKD-(t?; z7T?r2Se*Gs?!NL@nETQS;5uIjX>&3|6!pK+I#-kT*^P&n_}G#5Y(=X!D`aJ$<9 za&SVN!OneMx9~6IlN-mnDv(T?ZOWgi?r3BAL$8~ole53;%$&+yQ)`TG?Byy1S;czQE;NR zFg8|x>U#I9UGsTrwh@cv`MUlm{@2v{;7=tpOC-#LKbw{S)}Q}qoQIxVpK90sb2@2% z4%B;OkB~!-@%3%9Cc1jsV}g%kG~V~12TJqn1M+fno=CMs?6MIYkChRxAu_r+)*0L> zZ}tC%oYCwaCD^g96<^Sg_l^%g_;p;b{{65V#sPEG%ce6a9y%QoKTFbw!#@Ce;Pipd z*PBX-96X&r^RksE$RA&C1RzE6h`6J8D6-?7zL1Tvl^|H>|5gr|`KQ$wiHjk|P!6=^j6Y^jW1)&MS|ioLitO0#c`8Adgbb>nd)t5^l@ zNu8iir4&ti0wcQ2B{D|g4<0OlzBo2zXashwg&W`SuZnXIdG3A`XUAViv~2C3V+ayY zIeQ7f@Ut*X^_YPmG$IKh()hTmCe{u<8}%^+?~XvJ(k z&vH3(G*Lg|Y3qr9>X^w*sMAxPFJ~dTmjKIM)Y+qIUW&)nE>ZQb1tLA{i+l-e@Cs=a z$&qL)i+s7w52+qaOO&)67`i~tC!4wBSbQ5YKKJBA< zjvV~DC~MVdF;a7s(C}moa#1*`h&VH)5_vrs=T7; zwQiC(4|8y9J>1XIhYpY0RkQdCJD?B0)?G*XVYrN6KZk^Q##oPZeX+>z-#@csFtWxl zmjgNZUC)YHosLzYVMJuFt9=Qy#Jj(8DDvDeap6V|!Xv9aQyGU!w zvd6>kY&83hqVyXjp$$$9@WW6y)s^XdA2ofxrK0DdjibD>rz*!teD}3g z>^wHrv|7pj^3L&2iEs@cuQVz!Y0dBKVAdn9)n!)2EkMk7^gOsTk1|*NBr9A|etFqu zcg61glxXty56@>@l{U)Q=$?^?W6K|gp%%YlXm0E|WlcVpF<1~%YQ=*|WUmFE%kPBPwJHL9n#yng&CPn*QsF#PFW{Vg3kkGO z&wMsZU$nk)HtDE4<1J1!gvM>n)O!_a>SvtOj*?UN9c)!2*-i>ceHR}VNqat2;h)0;E@pFk@4VBh~d!*;4#QhP>E5I z5mB*7P-zL!P%+VPNziBLFfjnwc=*@^B-j94Y*Kt|a$Fn?G#p%PTp~t1OaeRrIROC< z01b(VhJcuaf&_p^LPbZ$NJvRdPRYPVjeTJK+nR?z(mPNL&nTX!9s$^Mnlfd z$-yo_#=$|wAtcDf$il_O#>2zO^Ju|KgwHQ5AizfXgNFDAC$k7Ii--`LsD!8(AC)*e zg@l}vf-r}Ivbv%SpQ5~kvW~6_2eGOpikiKex&WD`D5VY`tF9QkuDpn@nw*{#m!8TG zJtIqfD+2>LQUiHT18sF6B7E)E8+7Fr%AN}k3t-i#dHHhSKUmfn8u-eK`R@wtAMDuMPILC$7DQK>@Hd zl#Kk8yo%I;nDpGN?6lE?--TVai{KB$=lJdfm>cY~@;*!de z(yEg3nzHKp@|uxj>_bu>gxLHrp}s%*4nzp+Lqq>_Wni|sm9KsrpBhG&b*fP z{?_KUHbUyQw$}Ep{`Q`c?w*0}{_(+~$+8Gg8_l=h$-lp?LH=Kye}pRk{|Hq@!=W(#;WFdQ>%xlgqOdP7D91uE*i^i!9LL-3G5cb@|eRu=goU6rgE?e;Z*;N+Hsk%^j%YBcsi&nE$MnnNEo2l-l`X2f`&z^&w zA#do5dH-gOa+vqOK#sZX3x~mGe7eMjHNM~Hm`BKkKZw%KW(WxZ5{Z3*k8iFdl>~a8 z%aHiev+L%Weo@Pt1Rj-yA8Cd;@-TYA<>gem#&9}WSccc(nTH`r8Byu}@5L}!-lSiX zSd?t}ZQ1sB$WgfeDkK%vrXJhShYTO%D}8Qi@1p;$~ab0hqTV3lo!XwT{PPwvtoM3yC&+AwutOdV<&a6>-_=21YkrILbv!QD1HZKZ(a5D%cR51WI`y+$;v%)6 z$9p&N4?woQDboOvwH2da@2G3fhi-dZD3$+YlztbPsWy7e@htYs#> ztktj+yz*KIy^JSjGj25EDt`;$&k3EM zcecJDDO~+V*tsjEGo3xqsX0voW1aAfz*~815yOvAm$McxHOO}>>%Am_v*U6l`rFe{ zULo(m&$nE-Q6bT^bQf>%$+rbX)irWgXB!l-l2}4J*`eDX6QREn7RbEH7fE=*bw!5W z48$Q54ogn(Jde#!K+7BQg>J2i4oj(}Lw zFbUb*&X}MDK*Gp@!;y9>xszs*G)GUk#=*RMjZ^)dGiwXYht;I!T2fz*wRFqDg^em4 zp1V$dV<8<_>kx&nSvL5-+U-8*>Ihe^j%qr=zcHDd_MuTu!p}K&-Wi*;j91}8WlueN zff4Utr{YKWBn15_B5?xKER6VUUKSI<=iEG(S#OO$|Byn4&M}dAPNt3~8Bsqxeqp6L zC;yN$HOJ4;$ai;A@W2_)Cc(SFNtJgz-h>^LhjK!Qx^Hml^t^=iCRmWl)uSt*3; zo)7q272F$B)x-HVZi|-aqyS;qnpY_jiT6tabUs(?C*(rbic5Lq>CZ9*3xxvymV(|~ zb3tU$h9C_D#pp8B_Z(|JBWZX$<(JHlgSNhlas_Iou!>icvAknM<X;3!HGFVccQ8kfpfL+zgpR%enOf^&+wHj`53e9KBsSyQ5Z39Hhh_Dzg zS3o*_56eaHkil6Ge)ioXkP*Ha4SwrtGd# zoOj>)jc3EUNU}O%SzZs6^vuTDIr{Z?1c|u z&6u8^MLw)1 z35BiZf)~=OSZU=covYT8P6LaR{`H}&OGZ6G`y(Emt<=`Q^8EH5o7Pd3SQxMOW;cK` z1&Du3&*@dDO7UdPQGeT#PMNPSeW*X|d#>fEvh-%>@!VrRj^)}T`4?=-luX<~Uw5_o zVj!Udm{z$IGIpBG#BK%)e?2|gCdnir* z>53Mw(2oI6=bJhSlL^)LYaO)?jvDMWJD=XoY!Ma2*o!i^WFX`IsKoh{IAJld0M&UV z!`CDQ(n_3X_h%ghNovD=q}!yj`so3m zU)@({JsYu%gaprj)?>(hc@?oN9>L^qGzbYj`My7juHpv)o4@v(Wj9d3)6eb2p2y|^ zuB8EVCpbUt{dTu)0t_7=B#>Kvi@|-!1gr0fGtwz{cR6wX_UyF%Nt5ilUey?TV2O^s zuUzgxJXZO=B6sFDVzg*fmH%D-4$)zNeBlxi6o ze63aXJNcZq)l~lJtv?_b@36S#>6-Vp-fmW4VP|A!cBmd`J??&a>X5xEoCN)k)1lrM zCSV5bv;yf%1>y45sj~y^fXik8`DUuF;UY^J%pJnnY364i5gbD0i&DqJZ zqle{`lu?*Y(FyZWQ8i??;zla{@;`gN%T8*L?9k)W-h_`)>FVsrN-x4)_ z3$#r4YHa5y;WlHY3UjweDlw%uOcl|8@inyayic`KT@85S3I+2Hh^#birPLj*3?s^t zcT8o>iVW%)i_%3Gy@{~Hx}vZNwZ?;?5dcCb)lr#!e8_xcNk@f=r$EN{7l&>`dBM4- z%x?wLd89IYhRcfEC|`*jddi<)rV)CWzIFIAPI*vxTh?%-lm?sFO$87|5IjkFBW~L| zNlLnpg$F^&_M;{-K&A^}d1q>WBk;aAa=9)h74yAI)_72^#$Z9)zr_*`9`ZYtH9H&29cPs0LERhh5Pf(7@Gg`=gxuM`kCGg*aW~=9S~>Tv~+Y zkeD8B%koI0-($z>lapCYq{?lXjE?$IJZs~m6gGC}USyN)bW5(RxwcGmJmYGze5#U< z2a3{ocu2eI!1xV( z?08!gg^~557HW1TLH*OhX6M267{pszb+6^ULB}MD=6_RJi1ye6-0*X+it3V->$4SF zs}r6)S*nI|FRzjvvRy3U(*J4}=hK);MwPKm0IttyHYWUh#S62+QVP=(HoZyy>3`E6 z;6iL*;IE5yc`MMr^2x4qT7lVx&DG^mJEgGL@p4$1*f#2ZwE3&qM#veF1!tj6kWgprVh&83=ITgRB5^!p`^E_RA-U|_`ObN5g zQ>E%CX+qv;0v67rp4Fw0G<~D9YfL3eQy;2ga`LxyFm`*CyYMOotE6t(1S6xF#;dAF zV3qP>v<*H>^|oX8+yqfF43A>MXD*p`W>6%IYk$u)qO8_~Pceydm;a!Wgo5YpqoQ!* zjQy72aU3^w!t(-nmp4&HYDT-xnj2=@_^^~Rc&ru$`_wkqpb+EhXLD*dj8*JrCaK1x ztzC;e#@LURC#Quq)C09L?PSEzy5*m@Q0jIXKWSSceX7FX9I$8k?V{UQzBpf~vmUA? z?{}OpAOktHse4-kJbnCf&$2AEeP(G{lg#%@?PA%w*cOcS;#l+dANKe@&!pan(E2cFFg8x$wJzAm7R-)9;^UZ%sHVOS zMI7|*YSZNYA9?7M1$Kd*FNx))7y}AZ1%JUx!6FM@usSSdRHP%j&N&;9s{O96nmb0Q z;#>4JGH_d<<0e0t#l5}b{>I{BWhQ#_=xR0~$aJA&Nrtw0#cUOhcQP?+C#OFZN>_Ct zpG6CnM`A*EVZisc822Hj+kCuxfqF&Aln>=@v}(boxi$}5XvIKU1uV9gZ$RvBxDNy?89IyS}CM9MB#Jx3FAzqJloewfz z<3#%;kX9#*U`(N92A7u`R(*5Q-5QP{+M>Y5$(R+lz~X+%81x2~VZ zaeGaVz{UoLWzfhBWi)mU9~D%1$GTxohUiQ$T3X8K3;~|{YTG9hs(Tc5`0}OlBhV6l zdNyIwst9mQr#e@Lf(>5M`M}}x5L?duJ}pFn>28Iw9Gje;i4Iuz@oyN5P#>J*gB1?x zu#xO)J8Kl%JQ|XG8cZdqS%b&?tt}sn<#uu)^wH&U{668gk;R7FD?2e1IW??{Fl-S$ zU9`IR2<&e5C^5s&8Q%ef!~~ixNNVl!wF1l+V!H{{Y!tTmJDRXtuz%Lms`m|E)=WhE zDbZSX8ZUOqER`~}h@QIQR4q4`s>ExidRPw-<&;>h=(}E4yPc<5YWEn-jJ#u&RN}7@ zPD~AOCy{84=|r{ItuMTA6{5fQHYyEdwS?S@NyVy-x_zZ1XDr9ewBDmGIJ~FAGj?wk zWPhb6&PuI4U)AfH8*&nEu;|8sOK(cP`W#M6{lZJM!xNy16q?$wU@Bk#1=#4RtdvHq z`@SNDW#9O5Wx<@&@?AHZTIE43x}wn&F>YScYq^HZ=+1$-(R;I)UKFWsIl7nKA_dtO z4IHdJG21${D2@X-8Pqt5^Ka@+mvyP_NVY2pnbe|L4$Saw16GQ~SJXr)cJmR}!LD~- zEvDYhE6h%I^RRcxY>H3e`%EAwK5)~k1YKv^7^? zFirxRYg2r8acT|~_>UO~dJov8j-Drb7d9Br50ji)$#aKZqQkm}mKAk#x5Ss}fVxD% zm!mTOq6lL*HyI3Hq!iiO{3gy!H)Gat6${NNy#;ek9^O)*&V!_;{X_Q;&>Nt`6sW-q zE=zV#RM_FzgrS@LE)fndw+vxw?XC#ML&8wZ`-ral{CGFAO%61oe(Uz-+2nWT1lF7x zbkOcoQupL{p4Ze~4fvsS#olnKU2XqUSnbWN$c6T~$aDT%$UWJowXm7aBlS?n{INO))n71i2WE_A|bRADhUG#MH$+8-9d^=)0QpYt zXpXxGH$hSa#|t3Y)wCN@1PAFi^X|iw%OqDSzyu2YJ&|3>i8@X85GuOg4HSaw#k`7| zKn}tdwen!~fY7gy%gBY`WuY?4F7vMBw?coJ&aVlW<+_>R0?KZ;N41_3x;87X_Ua>3 z3#`l;Ad9!Y({jv*!PbENoz~qyoJbSdcxj)h=OG{9L>49c7ql%DNh6j1cY&P9IDzx} z#DtK*M20}X>(HN6lfNq*blzE{j|0xdkUfDR3Y;e}7^g@W9S?_r9WnYnf;Ne5VV-g~ zQZ$kVLD**|shFQ3VmMb!#&HPQSc|SL!DWh(a#gmOb+qy{t6uQlN zb_hBvZJ`hYVk=ru<;5tzB8Tk=imDDH8j+s+AMH7>^`m z-^Vdn9te9*#5OxbrFqAP35CW} zkvC%1h_`A0#n2KV`3}tCkZCOx2ExX_Wd=ZYR4dV;SBf;KeW&cTZ%(t9V?4#Ns%GlN z5W+g+(F&thd2}rv5}nHQ7)xyU6*-q|LVZdufnfA#l}7z)Q-x93JV=)}UWMQXN?zBD zLrjO9LO9A@!k)q>%~f>M-Uqit2sN6tHWi3(zxtg8HixzV7#!3^X3sY$c)yH39i^xO ze4G%W&(MDk=gVtbLa;)=*y<~J$gH@v*N4j zkG25;#aFY*s!u9CZiKFJ6biYn3lmN=+T1)7t)c}_#~bnljD7c}3zs&@PWQNLem+4^ z2?Jo7ztbXX4@&&5E+A9;=+`4}Qc^^^5)t0l{9)gj0$6M0e>3dMd`E_OVqRjAX0-D% z<%QTFY$KuQE%YIRNFZsmnf>cY*A5<4farY@=UPHpODYoF?RJLr-huc4qH=Ws(P4#9 z?{RQMWY!eX`FI~t=iQHM_s)MREPkRKQUCmKQ2jxx!}ufeH{#o|DFj#}Olb{3!;Yx< zF%(2z>83uVB?!aA$3zM)_Fv3iVL2q|Lxi*s;N59z`x2l?nZ#!Bt-|AZR_7Jj3y$#5 zxW$PU>p+5Rj7SkThUX~5xih!&9?(JopFAXX^aJ3e^(@`Ah*W`bpND5ihoSR6RYCiM zxvg3*wdpkv$zGXiC;v>^(a1(q_6jKoAIl|mHWku3j!lUf*JN}aQJv0?gxm&&vdst+ z68LEYwz6@#jI1O)X29n^pf*NkfSQU)4M%46ofZD;6N$!Q$HdfQWZkB-;&6h($ux8A z)L5yDoRz_p)F7_tUX^B!G5Ct}2Io_cx{$0c%_Xn?mXZM%sQj*2vLRT>iEYJ`gy55d<#=FfHBq=^yu7$k zezP#W%OX6q924#b25{W(`g-{=;$XuqkxnJFy4XA^lQz~lKKL`ZF?eGdlZ`sQGIS1w zN^@H%wGOR+N{AlD6?idJfR%eP7Ap3*n*IWA)ZQ4l6=LxatweKvtHBymZi|X9nC1`+ z?O?FmYJz9uLP4{JtI~RK0HQ-xZ&SGvtNg>CNJwtxR0s?L;FRpgSg{q240`}78G>?= zwb(3i3s?3mRfE=f9z!89F?Zp3mhM`_DrvC6+2(P1CDSA>E3-_K6aN&Xbf8h^f9hseJR&(av)4vd}+MDim}%7 zL=hk39-gy={w#<#0zfVkL9!TEBE2cK0#=o2;s6`{(^lHOSQl zQ)@&U->a^fVi&uaN?h=25ue4=ai69$MR7+PVd`}SW;h1#yED=HM4Pomd9&5s5{Bne zS~k=EYiC3@$lCY-lJ_%EPjS>iX=mC_=oPjd1Z&R7#1|B|AJyH7=Zqf0hDg(1`7xlwh)GYEcAtwNbm5zk4eWZ$HA-*lsN(g zzYbs@2MaI+1)t|^+NgL&<&DaZB{9IZeT2jp3OE(z*Nuk>$V&H#=*_WiTq_67Y2rjv z!Nw&mQQS;26OCEg@6LeKa(C^3O-_MRQ2P!s8*C4idO$3l{ng#)c$Uea}V^ zkb!X)Y4qWv`Q{#Q{VuSI!C?}Kl&e5}<%Mu{*ZS&^+x2#!lkj}}P4 zi}ar!?ETa1cwA_eH9^7`xIG6J5q3|MfsMih(R`p}2vZN-YTnVI`^*d)-1-V}?AsAK z;bJ=VA;aE~n(0W;$(;38Fm6&LZ}eH-Ssb8~(H`{T%EO#0K5Q?4`YVM%F>r8j?!mX0Q1D{~q*E~i7 zEQ2K8DJ04xwYIT&R0fE=6GX50Imu$3I(P|0%1;}s{VQutITCcET9%B^_~sLUVh|0% z))?aF<3Ud$ao1q72syJfQS5wDa?+eB!6f)mT`Ajz^Nw{e#eA6r{6rYN$RMDq$@GUB zU}OMM!$olcCy@vZ(L{~`p=K;21^|vp>AMpamkQ0&U*U;JKm-Oq_FwExa_J}za4sBX zYV-*?*|8+CCibkn$iOj9=PAaA|J+3^UsW>(*7*8B;1b|Ca>{Fa89Y5PV zv4W1=?MT}J#trHqP$dlJLm=Fv6{Uy4xFGh^gKiqRqaAviM9HSk%xe;u_gHK?Ek%X#_9rlI8$dLC7pC)+H61&IYHBtI3DhB~dJ-I}Nt(oj zd@LaP4+4b6MnqpRK;K3<_!+j&n+xJ+aR$dQ0A0a?J?D@lFvMYKl@up_dRBl$D3F9A z=OcD)F&y5g@sp2MU`xrVIvj&uveCF@iDA9~9b_2=9FznM2ha%&IG;tr6fE#j#D|ns z5-o82Lr0c&i=|(?}uZ4<`W3d>(gWPb+IMO6huI z#CdaQi_3H^2+PwCJpKWQ?O^Xu$sYb?xfy2PpvxikP$O@Tg+XT=EzgN9Y!doj-z=`m zBl;VEt>#uWg&E9X62fADFp{AN``pCdsWwK4&K@)^&#PeVU$2lM z77t~^QgdVeu7*G@l7|k4H{JOW5FQc$OSGJzM(^L!__qUy8nc-EDgQGmyxnNQIYe$U zNcvv~*oO;NZ8B11clYPBIuF>2zzU~i7S6sbBd9NNeAR5x#yH+Ph#3NkP`u1bcc4_o zba;k5SnwRa%x0j+6y3{AG-NM?D+q5;&X$w7$4tXSRIfm~cnn!^mG3Gw;+B2%68DN^ zMvGh>yx?!6jf{SO78TB@dd>QZHoX&-4r7hYg$%&Db}whRpay&_IuRQPZM^3%hU_J# zk&S@y=@9lVcjZ#RVf`^W4A)8hc=>kUPVnbMLa_F_YD<3#95m0e*vfb!{yZaQzQ`9Jn(ZnO)Q*ZqBIzTX*KBn^^E4<1889_Nz_z)!LAM!5_q9evvXr5E|gwl%U7EBHn1iV+aMDKI@FcH}TuTDI|k+w76ao8Rk0ocDlp(LlC%y(hTf$4-#J zopiWr3TAE|7{v{IS-{t}0mYF>ya&mMn11%6EHwV65#$6cf9130Tz64l>UF5N3X>; z3bWOIW3oM9hAdPO3nLkbm>Dyz7_F`7W7_FwKu!rcZDHG?e9lj<6l~m^#Ph2DgbQSB zb6u-vnH>o+RwOe0BVE-^e?)Z!PFeu#wlZR|Lt0}sd5gX$HW{rTUrgsm-o+>;tcEQx zjs!IVhlRBZq89=2EWPF03E{d7C7shHmGZNu0V+o6Q+yX507ln;`itmfoqo{wd57U^ zJ0f3^3qm`FEXWUm@Dt3GAn@>=VMiEul<-i6RO?iP>iEHP%g0aqgi^&<6C%Px|3>bo z-B)XPL~`EN;b(`+?$*Y-9EE1fsS=e8&`yi-gal@zxyPP7z_`Z(lS*2P15?rrix+Yo zGKQc;g+Yib%|N9Qf@1v)@<_h5DN^{z7MF1MdCxXN-k(Tq6I|D*G!|pJ#-FEwF|);n zkk=}7^S5hTyrv$_2G?8nW>IyECi%tf@T7PJ#ZLx_aPS^{f)sEUs0PHK!9u}8cs#--i4U)NcLf#BRUJRBO= zgZ^NoAb}b)-(gmpDS0e0zvDDQq~8S;%v3hvp&`uo38tr)rxeQ-k)~u?wwzZRO@(Fy zNQI%OH8#)IeG)v{#{iQ_PNr4@AX0_8JC@*%N%AOG%BbG;J;+%J4;DDb-iyrnK!dgL zN#Za7A*hH<3mubS^axF2t4D;o27?ybzXFr!aQe1frF_%Q-ukI5*KXM?M~gQ82rC>+7%kLO_O;-wiOcdILKGti zVmJXkW)4XIdKYB_0BwywH@&7sqITp)i2K3t>(u@!x-WZ8m?2i9*M2bZ%(&V9%a42v z%i&hSj#$u+gxOA4f|E=igNbD$Pt6dBl+*P(W9&=cjMUMFZ_t3_-?Lf829d(CngepG z8IjxTY-Y5SuSi4Stk-M{)9GDKtx+cM1ck}ys9->#V zOdP-~n@0Q3fMD7g=k#fy_G+DSuEGNE=iFHC?ZsA!f{*8zD%ZJ3_Bw_|jc6M)YB&{I zh!Dg0NbnJRKe+mrl?m$}UEuyGhyKe~rD7lWJVR|euE|S+28!`1CtsiQzvUf2Gl@=! zh;P7uZJ~>|2Ow)dOzNTPpM0$xi!Y+Wj7vjr3XN_t*yKTBKZE3Uumg{f+V(m!EXR$C zMI4-nxC3cVS60XitkOZTH`hk!uiHiHj%qV1;XG}<_b28)_iNZ;7BbAwT@~8jE^6kx zI>L-Z6~S=UNd*1hMZ))G3BC;eEJ#C(I z2H&i~l&uWjZ5N;r6hH#m13iJ)p6~KnZmi#2$~Ma5PCmMf`~k2FivNf_Gp*6TY}6@! zbX#s=h#e#T6Y3ENfpm_QrWtVHm`C6%%R0AKdkE@mV~-qEn<|#l^bG;ki|w^is)vWGH4x+=4a)#St(1*ZL^cSG&T4Rdo^V(Yha)V9K`H$oLX~>u zby7X@bh6j+d^PSF)d)8kB94Jn!r2_C2<|-t+;Z6%2xvT8%{eG(6mt~SzlR|USK}L+ddNGAfR*ch^8jcqw+I7MNqmEhxlns`~>}Fue}v3%c{GH*-n;I3i!!W%KYj z(qJMWm6XURtExy8>u7s8YEV#Ph^o^iLS(U7LWM}uYYR;LRHW)3m6hxO+l>MVb8N;P zNB^5x1vh20&*G`H{eHnfR3e>_NJMB3f%$X#;iQJ*@y^t`6e;4-+uxc_3@&n zsF^1zW|qQGl)^A+6XO91@vmAI&8RB`F^wA@M>dPP zp+$-vhQksV!f=`keyTW95Q!orV#D5ZFK&7<%*jHiP89J!a@`5|%Lr1nE;Wu4ucgd^ z0oXEwZCD1l2WiAv`jAp5Vv*w&h2%km8WTAlR2C$FFL4}jR1Q4@)DT&zM?|LH=5XRQpek}k#5Dbk;^ zq@ozo=B_rWB=V@&gBL759=5;21f}v(qU!<~bh6DzS3g#S9r(3x+fkx+8bS#?nV70! zd5WHP)C5Uh(v{emlovTOM-*nxAVR*_u;P%GDmTX#|HW}dt$T*XH<$#(Ewt;pHrvtc z3QshlEhaBKt}W32y^cZ7kU6@D&H?!IiU6n)V%ecL6+Xst5Rhy@QN+kuQJ{vgGxg+! zMjcKpM|{XecHd@|3IokM7oW%PKaIlDg;Wg1PThiIn^J$ID^XAfQKH-@CEhOaHqNoa zl3B%Kdmm}!VYp`Q&S)7aZZ1!oqn9m%@bJc?9v*wmPXC1XDJ{r56ZQ z<{X7l$WtkaraYFEebOKuW|Vx%&q9GT>G?IW<6ZMPSK!L@8E{-r{L=La9?_j?MF2`N zq*(<~LPOGL9E$LthXantmXo-b+@h=w1BSsEgW4>{LqwyHW^Y%xKI8u24a4?i(m^Rf zv(7vuezPWNsB!gh=_!;4k$_t8{a^LTBijZH49T>(pOfJd^gqji3Ta?^QbOVUC|q&0 z&Yv*rk!>xCD9#vx&%x9RiQ!_ha0r3Pq@;+na^V%o?3_n3HKQKf8ZT1_miga}oB6lkbHBK!I3!he`wi+B7_Xlui_?wuQ>Y&z67sW@w1{lxkd@jX?V0HCp69t_j z7IkT8MA-gIMV+8fh5G=2WLHhRx`<-!h{t8n zkBxg2E)d$(hzyE<)orLZC3iep4naYs7)`{v6%lGa0T?Qg_`?QcGBlPO6!vDspDz${ zz5Q}HN!}X8gZ?1yo^k);vrroh%GxKJX-q^d3MFEwFn3pK-Rry-_;SSxX(unuma6pP z{9mff4~RtUz@S-6`(bj(Be6z{1A+mX z$u?;_cBz^Sr{->4y?X@UnG4nId-bp3c>VI3t;g86-@m}WFZ6uQt&~ei@|ltTJ?X!E z4s|hAINNVYS*NWwTP$$Sg*MW_HGJ-%(*Dvjlz;I2$$u*6+__NUnwo8xHY2&YJO=qU z-0({JjPS?E9A8yMHs-uV4jG>F=`a{M>)RY5`o^sP*G>d`Pwi>QJhi5PTN9l*`;DrfqKH4|7js$ds|ar4nFey!j{+RRIt!TANL3rnb?`F|gCL2Z(ACH0L5B(5!n65d7TIw#SRZ*iOTzYOycXm(D!hxsn?PJTK!U&AeV)x|T#%*ef zE7}{Qc7I^&GRc|+@%MiaKVkMeakNS0lvX%-IIV${cnxwg@O%bJ8l42cpuSp&oo^48 z)1pz&lR(I7f+mu$@_90wubt6~w$rR909_8l0##^;<4ZtR(7xDC$(g8Fe(*g-6dIjY znSX5^FuhT&2#xi6z@s$g2R-1xzwt4FlBLvl{ao9X)#4wljqZDYXF5<(6jbs#T4kTF zfY{;G`uNWJ?Wn3C~-HNT%ltKW~trkLJzf==L&Zp&}WH zpX5yuDxa=lj(=3Ozy`l(1H*a8ZFU){<*`1h z(U6Dhbts8RSkEoH)C>Y=1cZ2_ltob);10}OQV8JNT&8LL1s5u{KM;w-pc{kj8vF5-{)2Ae4}kH5~MbX!y5<*T{Gz!jG1yMBpi>1N>+K1@}STAz5G`Y zUC2l;3XWMrxIaWPVBs*HO{}F5z(GK1Gm9KDaH~;D#kgRN)rNT+qe(L|elEh$NepE0 zm>GiwFzymL?#u6M0x2{~`>kIVh+<5U9}PAqrXm>&ts5z~J;@UT@)Np?ZA%AmU*)hr zOj$a~(6f&+RE1$np?~Vl8&Xl+YRX`CQ$P&HET(MSU=kb!$3Y<>9gCOlX7|fCQ(*XD zsEC|q98e9;2pNo$$B2=+am6V3?=R(`d3B>$;RLc-WvDPF+o~9Qb(H$`QrXyPS+C<+ zUhEipQQIdh5}E6l;^GC9(ZHPsxV&PA z$L!L?LeUUZ2V~Jz*vePLtI;}toFvj&yhxpghMwn0&;%@ABwAVMQ(1 zg_BYZyVx(W2o1q1S3kKZ479QURD|Y&w)fHo`jtv{S9Ijk$K_VFyFpB5lt#*Dn9P`~ z^Meg45@bzYQKVrNOvc4{Sd z@>XYXGK@l5l&uE;N-vdQyiWfZ@0O@ccRH?1t=?>r>8reMcr zSQkE7B)zY+bh(uDyc{AbAS||sd}Z(%oL_Ld*or_bQBs=;KyGYhAb&hl8@XZ;-b^Dx z?mb}WhR~MqwVD@TAdX?&kO*C=9{2hp;T$~QoFJIoJ)3B~?$yL2s43}JN~u@f6p_QM z|M_dI5lSuirs?K#OfTku=r;1Ux)UO<$WAN5G^XcqZ%d-Kp_F!I@q8m0d+pO|Rp2&_ z49Kuchu+eda8N53MPR!DSKG+Obk(YO)me)qVZDV)wrpms*=q=S8m5Y>Vy>~V+E@jqwA3SrKYSYA zz125xKC)n$H*CvGlYv!7sFK6gnYnKyfW0-G^46ndu_98lYC#on4F+E5TD_?~yze^p zKsADuH9R}rzNCUt-6c}ev*MvY;?g&KuG}L`p#n9n$irC31l8z4w&{j$P<}aKo7WJ? z6mg8+OG?ANcs<6T{VE}HoWix2I;=5#7vWCTh$M@tyf$Xw$8z3iEEfJSCR z52N_7a-pf2Ok|xz9ISWx$MZV`hi>Mk|42DHb9t~Vt zY4;l5H$VDb#3Yl+fh=hWxjV6sR*6o%Y}&-i&p2^+?D{|K;hiocHq4ow^q^UZkIJGx zNbHtu&v#qjh+L&5Ir)FvZ=)SV1ztF1J(u|7p&5Lscq7kG|1c$KWn zarABi#MVoVxgyJOxDvnl>)%)qAsnjasPsf`~-@AUQAG3=lGj({y9g z%NerP5~^M&j{P1liKU;#84mN>-&2#!+|uycCN9Oj#mR`G>}c}$ma~;D)3~O=5tqKr zO|mLC71)tD#)GDfnGod^?CfTkRnOkUiX&P>3;(7?-_rYyFY`Ucs@utmIuW^d6t|T# zVjlowiPl(Z%AGyM-`dO09>bCE+#&hYoZriTaKy560~gJIZLwT72)nbra7X<8F}2`2{QJdA)XwgzsYmEl_{n?A7q=Lj!y%8& zII8>iQu9W?59gM1_f~Z}e3gX#Gqfaz@0-&AId4-QTO0A` z)$9DN+f)DgrTyO5=C<{_!3*6n=FYdDxP4%XulNNhlWw#b> z-%WafBkF(rTOAibcOi6vyQ`OOY{AhVKR0Cfd;cyzc6FY7!wpCDk9)7I`nBx2^{f#HGlQ>kGO;Ab5?-|GyjKB#o>WsC=ybu^T+62!JsM}4mOqUB%Vw} z1z*u{`W@8-ph%8bDvgO|DxE^F+3MnXZzL64WWj5~iDo{lNJPH)tl4xp71(Grf~SR1 zp%7DNzsP=l!lV=MY^}oB_H;mcN0l+u z^^aSHVm)1xgs&Gys$?0?S7XWef-QZ7X%5>6gRbac1Bu`E1*q1FuYRt`Lty52Q9;UGdpD+5OMlVG#hs34Su+|y8LBqM+)6?`E^#Cko&+Y53WIT31y z?%2FjTC5~adLnvFrAC!K1%S0DNUBfr`BZ8ep02VU8|v4lEyazgM&ix-n4D@zZggUo zruzv#-$j4bggnaA!Xd-5?Ee?8oxu6pv4(WSXsNev&{}zJI=*sA{^oJoLI{-Fr1lrM zcGB%EdI!D>9d6F`qyjXmZoEj25n;nLYe3;V&$ZnO#xhj`hMLq*&=8rGM}9fhks1MZ z1X*s^7zOp^%BeW@vp|f=V$C93SGkYy;^(y^CB|p16$#%3O@_MY%Oylp@5dePjupio zJItH%@vr11rc>{L3w*ARSe+?jE^1oheiI8Aj3d|Ucg5VB z+%c|1MS@`^PlPs}MHT zzU$>x|6FLi5bquqT#!cwT6Kg#ryMwLjdb)ZLqK^*E$EwgJ&~P=XgO`74XbY~5xb$; zy{h#kn`M=RjW0LrnrBUA`P{^)J;S3}&Qm9X;W>C#b}n4?i}&s##<|78FI*m`^yd`R zGQN^yZXEvTh0m$`ZM3E92w_oGW@&9p6^y*L`$iCk7_AIShUQw2MlQJH@O#-o_6sX>fZ+###X_xuUyW0vuA>AvMVm?5v2Yg_TXTFWQ8m z=%`=!(aEy3=!Ek}xWof0j2Wv7%pO^Bj*4Bi5#nOpNZ?rY3d*eKCdTO2r`4GV^5;D?^c%+$xY_jE3ngNLs70ZT{D0=8PY9asoq3x$^3> z((dv?5sC2G#12w+|MeLsbkIfN(zsNHS(+_|5VL}&$yhNebLoegauu|SQ4|u5nhTPO z4)Ko8C7DQaN~DUha`Kf<0eQ8MZCSzAw9>|Hc$af6XG0}H<^m3N^M&f8EfhrcLb`=>h`{IFD7ex#>;n0;KNL zV`zsZlRH&tz!mphk;-6ogY44hroJFI7Ra=&ffSFx&YO?ODn^?uICWc2N zS(=b`kr`2)8C|;6$Bk~n*7PPIsYeir&FvT zfFb^n)Cj%WUHD%b`8CJLQDj?|N1RWSaai2cVnjAyM_$tq({*VZF=x3mYoj+m9Dog+ zQ3h#N!_eex|0EpDf4WW3AbtP$+$K!I|Dc7qsj+E8>do*xIGqIe>S z9Mg_M%Arsw4NERiRx0VBIOK<8qs<>Q)0sSI>Kz0rR_f6L%n%6%sYjEsQi%ZR9O;%y z)htPLw`Cm1Gua%v00Gm^=ftHNIb$b&c=Thn5>wMx3NO`Sr2@sGO$zw7D(yDegjL8W zR?CGnQ|(5|DdmU#v3PQFrtXFtlL&fRZJTY(8~ut5<-?Mzry9*pg}Yb8${(jX9p#i= zr_t_rJA;~0T#4|R4QiW`GH)-{9_?dOb;eVAvpV1S2MYa<*nh6JI(yZIXvo%oo87Oo zz3qVCb0F*c>A}}!^-Y@Z=%K8_f^L;Ygul%7S9I|WL0IuKLfQr)fF4FjZm(D zmS$f&7W6bnV=~0V&7s~8FV## zH=yvDVloz@HVwz&z?Yji_G1S6$mnFDJl~VmkGe?9X2oJzfq;m5(s`kaUJ_%&m6k7^KTK;LD~0xF!2EU#j+kx<;gygMAQd%giq9iY`KJ;%}q}>+F~7rGsbZfcnGuw|1#vRTnFnxu_XB zwU#jVD6=z_aN|HH+897^ z8?jy7U~C2N$~JSjAiXv7$4Hu}^av)aXj@KensyyDe&qOb62z2cedwCyNw`*uT-(|9 z`@2KzQ1hvc!{T{Wt7XC;?&fg0!VKoFy}z@{Hl_ZB$SkKn2BEy?+izKqZ?w|+%sZ^L z^KAhA#b~8v@6_VEZ1SdQJE!W|$3OUs3C8boOJt|}y*OspxAxl6)BVf1M$PG&Hi?0A zV1R7Fa@GB3Wi^<0K3aOi;$R2*%&FN9PpqlgXw7xBt&5N{_DN`Ko4cl+;syMH=RJ0b ze8xT7pb?2@pc`}QHgj>CP3 zqbz}4W~6Z~-Xf;*P-lYDm9ws#SPK78=Sx7m4#B_LijtS;xj1IB%g@IPgD`^E#+b!m zlnNmzYl&AGW{RoB&pL=NXI~$vRS)$fNX01;1II;U52ZWaga~P225U4N>PjvV3#0v` ziKg2!S%~vQ)gvd;U<2WJ#B4)K?$e-{43bGMB?~&n%M_9#SUorE^4$3#91_^Bf(a6( zfz1fTY?29cN-9S?vE5NFcs^;oIg2Ir!iwrk=mEU19F=j5G^T#PQ%B-Z(%|pp9l_~-&t8X9kYFdi8j2F2jb+D95iqhsA)Iw ziwU3k3YrK+ewh)^c|Mkwa4buQ@D!~IN5w9(Wr=%hBuAS~tB8rGF#dcch%2I2BgMW1UlC2wg2y3=hB0= z8cAKDBKsx;W>KnUr;3LT*Q#`H@w0=o*V!9cfP$a&byhE}Y>!mO7(w_7+~k`|zPFA! z$KcFy)UT#vC)aWB{3+Q%Hq;m43z-)GEHBm>n7VeDhYeHAG9Z5%t$D@7S0CG_$>8tk z*0RMceLNvub*SL0YwEkNkO`Y2X!Fmk+WXT})!LiXEqGPUWHHdokKmha?rwI9-aasH zZJKnjWx185F4@+=*Y)VNiEr*O=6!K0xwqD@HT*19hNjWfQQtJqGm-Daj%i_sUbcGQ z!Dz(1&@%wPBiS{v*2yBg9B}B!^q_p~n}L}K7?j=Q;lLZ1R<}FM*ziaet#ElNG&Yn; zY9pj_Go!6h9(BOu8sl*5MqC{Ac}p);0_N8C-^0lCJ#Lv+%(7YAB6iq(-_rslR`t`X znvwo~R=TdzDbG!D?P^sC2q3l22<%#3K42&!ADN0%?>?rzb!mXPIVQ8NPJ0h+vl#zl z;6?rO92jQR^Za7}N7|g+>c0R&K)t^jcG4Pmi4e)YUy!00x*ts7-S-VvyT*}+dhOw= zzy8;JReSDYPdK5k9LP7~YTksktlEM-uZk~_bjT}OqJTYO%O^dZ|8lF~KBV%&Zx{0j z-YRDYnc!-76zM9}8GyQGbnEH1pTmYQz4Mq(qK8FUXe~9^z?pLAT(lF&PriWfHS?HR zShBY2D;g&V;9`S|MKqiE3=2QiDeN887b?1EsB!8OcfT1T*y0mpe zg?eh|d9b2@s;3=DM_K?kMHG@?Pjr4b<8MJXFiE#BR-zroW^o#bP%7hZbjUNRV|sKm zc)8?q-lbwlHDD_%)^YZK8H`@Ue=lBU(X}Gx2vij%HH*GaM0Dc2eau@I-a|VLMcWgk_e2Lg#d# z_lrE|f*R#zUnMvswkN|!fmLUA(YAxx)?#3_G~d-)J*7Qw6(WfhNW~a&cDG-3!-49^ zgm_3z1bB`YNLG*sj;;7w%J_^&=oMI)g(p^n;iO7F<%hhaFn(2N{8(Z7)N8}IMD@3l zzNdp(D1x0XIoMrxtvh^+;A2uWy2IAv`pb{Q5xI+cNZ zxQ#y6lTqm#1{si01&taPbm7y4Beirv2|UR5l{@!PeJGFeSdy@2fz*{QGN)*c2!d-j zLr{}_n3zn>XoSB+b7)miy(oyZw|1OIkJ^Vg`(%Id0)G!FgGF_BS7(MonU5Hhb%Q3F z=~sLeXN{gIPis;xu26j^5$x>7QWsQ~TX+q~bpoWWJ>6AgToaPCV%gA~Yd1thFkF>*J?b(Jy zNkqG8I^;J{gGrH$)R`NIm2rubag!fElTFJ(U!Ccmy(EDbwRhwMh=GQ32NRKMSt$Xi zm};k&4Cqoc23uzJiAs572T6C2_?cAMfYrEI6E}7?36>Dboc-mRmE?|k^HlXIYq&&- zulS)libQ<}htc?9d}(L*G%kI4mk+9(V+f9)Rg6q&oX(P!a8skT7jO`GYRg1d8+to3 zmzIASfw-rkOUZ(r=W!e-NwWo_y9uR&hKpY2kO%6aT1qn$_)xlpm|_`t);T`w27AV* zqd_{Hzd3+{Ic{qI3Y-8LnA6juiWeVf!!}r2TZk8Xhmxl!)@-IYot`?Op89g#xKu|O zK_$qd`&pH|*QoB*osAk&*i@8oNVDil&L$rpKwFJ~*h_$AEO#8qSKBH3y?lTB8#Bnu*DN7Ui1K26%rOo2hq_uEm~u zm#xoggzrk8Q21b7Nk-OWt7u9y8#1GpDTAvBuHo8WfH$E8OPdIJiW4}4{Ysdh29vQG zuMZooUR9pT`db7zZohMO>2g+1|rG%pJzIrnhBxLnSKcis>kO@QD=3=N`e5$wACtU&YGn6m8ri8r3dSsYl~GF z2eg<XB@sn}iXaxmcFQXq=sxlQz1DkE?X4DR<>Yqv*xA+j*Hvse03>Zl7yq zFFTe_#-B~ru~pbkU)Gb?Lc7a`W!Kue#8_4gb%A*og0&TnjrEv}x2-~ZtRO4A3&^vf z3q+#-tDk1%xSQCm!bZJzSTC#ziqiL7)_c7n_^o?}V!_M3%@n?+2(!qWaAtX;%sYZ1 zS0%`^ffSa!?unY#_r8xQUGr;p#Am;eB&2MGz|>-^ap$!5W{wUilR6t(y<~>_dSwa> zzlbslINC}O7=yA4!LOHPtJ9=Ix^2`bt>pNwyQo;B*pj}gEro}^?pwJfOurQci1S#t z!s~aoH-(GRRHH}3ScSned%?*jrSa>%E9$=2tD7XOp3&x$EL^&x8;SeMsHe-18Of4) zX~W1Nt!r9`LRd8c{B#gx#YU&Py*t7#{J9|2sbJd2c>2X;cs)58pe%cE@JhxId$r2{ zI-pWAP8}=4TTCtUOR`@qn%DWOM2e_W48`gAdT_>;1)Q05`@u_wzw4`q@M#f~T*-xK z#1O?(cQ|o5B~J^AJ_+fzcj%wsmqNxXJL?Od4P3uwi+7-V8NPeCfE=cMm|2<(xo}HT zJD0n&w!A_En7XCIeXENPh_2$pZ=3<9uFT4T%(wCc+2d+o6OrMVfJU=2yWGKj=8dPD%wmhU{Cs*lEWH?O z$y|ztit;vNaisI5PCn;ER8xujt1t^3(YkBWOd8Jpq_Am&jMcc&GsLLB_h|F~1iWRM zIXjtB9SXuIJ+1+mWT}?Bf?TJeNRNtXRS-wO-a1~XrIj$<%nzi^s5{bUDRnQlg@)KY z0lm*DG0C0#Y!y7P&BxVP%#Nm9L~@L^;1@XhD9Da^KA+fF(VW1GoL=Iqmn7?qdTf?8 z)Wy=melXW+m>i`B8JH`a)W*z#K-{2Yn!)Tlf0CM@@l3Vti;RBe%T>m^mOF?t%+st& zf#{sq#EObqI+*q3TnG&!XxX$*TBQ(O&xbX}Dh)D>nb~-J+lA?j|EAZmvc0ptyM8xg z5T&m-OrkeOG6AGQ$th{ssAFL@(VHu`XP3)s+rFV}r02TNM2y*1N8GOr4GA-tqY$xcb|A7|>}OLkfFn-n&T63cv%M zOj2FQoy6g?3%eF`dt#`K7P_$h=Zbi{oqtT9C3$Ui)wB&4USPO{a(JRH>%oaOZ<*&N z8E0`l<96LmMQrKLU5cX!=$tH<%Hxf=k$Jz0_QKMr)aJWDb8Ma444}y-Nb}U>tvcU? zB&1}`YOM&%V=7Ns9xM_J-TKv|1FmmSwn1lI-Z!Qn1Z8_Z?06^tl&c#%Mq9pCMPjJK z{Jx~>rT5KpENtfS=rf(&;3rAvQP?tbS=U)rJKSM_W!QSN`OjE=rzNe&*&WHG&7B^5 zrtSU0`s~?+yR;g3*le47-TPK#zoAHi9I;c`+E|w z4#~^>((%D8R;uR;34J*yTEeZp(aF2i844Asz=`>H%3XX`E$^xLs@T`i`c2!Y$&TQH zxd3FuuCYA)%2xT-3; zk7C^5CPsfuJP>-o2StDMMxXR`Fr>e7@_Bv;dII$^;qfLa5KB*vgpl>ALG{0o^oXE* zAP+o7AKGV4rSa4CAn)}jUsCyQnpwJC{oU79KJ4y}x?Kmn@qCj^oU{>25PDD$e-HRd zKRap9^-s?StP%Ed`teJF^oai&f*|!%U-;4F_en4K{;u|j!0THw_9kBkpl_l^kDfkW z=R~cX*TrQw|EYBjni)Rb=sNCEMRt;C_T?DiN*yzfPxNpA`fqUcR)6_uulWAHTfam6T;8@ak=>%IQWzQFH(_j`P@IgiQLMstJ$dB2{Z}Y zwcU^02yauq;-3fM8lD0IAp<3F|M+kJSV9Q(4-mfu4*VrZ5J4X@1QKFcsLmG|3JFf6 zNb%6XAOsQV+4wNXM~xlLBq1q#hC^- z3fwYLsLrB5jVxtqMCQ|^FAHwURFP^XtXZr6qN;P?CY@cmiUsS{D=4&IJ9YYMl_03G zX64Qmm{#pov0>l3&0801+r4xJSEWRWYh1x{;SStDP{9Vsk9lbHQ$z%0q&-eV7U87L zBhZ$>xWN2N#gMsIJWVPX$VUjyzrHjI#86=Wg9c_xI3TcFMiNGa2yW(}z^ElaL>k`? z;zyIEMxtdvpnf?c#o{;wT`3|QA>$N9UJiQlq56gwszDDo+oR(7(i80-)&%(MbG-P$ z>d)W*YT~ibTFk5g0W?rC#6sFiue#29t1H3|l&~$r7M#$iAdLIP2!tNPZ2>2;AnJ@K zoZx`5Cv;k1MS-61!i_t?h{6T%1iNCQ5KtWAGlrh1!7MkDfZ;auQdAKF98mj?F`|U4 zY`PP3YiW=ttIOkyfe!kGh}KeQ5sX1FVhl;y9wF+siXbtBE)a^#>9D;PlruoG>Ql@v zye2{f>4kuE4)twOWqwj`p7T{Q}0*on9_ z?SU7ZXjY&lR0VHXQH5P0StZ68!>c60qYlyfwi4IQzu=@(D*@9@Fu+F-?9*Ix;d+-r zNEhu7QNH$^6W<2=g}2_g3gebfi=nuyzo@cK5SryU&fe2 z4sEL-PQxF_;Q2k%z9bT-H^sI87hMO>^>1r{|D|Z&t_}QT?8GYJSL|}b_FB)228yYv z3~>VrNK7+Lc0{|GoCxWZ@K)}`iuTCDy(Nj7^|8}lgwcx`iHt!Yq-T~(I5pq%& za#aq=x4rG;UIA32i4Yk0&}Jb#-Beg&qi)hZv%lUNUHl%*&tJdD1z1tK`s!LxLFKDm zZQBJV{&=KXOelroCV1dWFQShXVlKG2;zp52hTe*~sx2H^vtG?1dt{Z5!E}=;j(!Xw zzYjkQtM0-?b`#4rXb=;Q~~@(~G05UBk`aCUj} z6W4O5F0|oJY{$b>y2=v&r`}PpL1{xwh0cb&u1#SI8NtEySWv9&DZl_pQdSd2Bf$AF z&|`D^h4TpN93_kUtB18dJl>=3XoPdOZ6u@K(c$~(<*P-x{hFQ=mk>^6S zFgH!8c{QUL6}-1P98Dw-bP!5mDpao770-it`rrlGRkn2nY=bBiMZ4r9A>*M?kO103 z5(ua%DY|Tj98e;~Aci_8p3Y`-xKUkF!m4vuA^s4 ztS|%>L@8O<3&I22gB=be=?f6in*!x$MT1@n2C(sv+%A;_bOsBCW%2_ZL@*I7s8WDv zQ01vNh&hjB1$9hQ0eXTR66pg3AwX{yxl@m&@1P5SrTSjv zofr~zq(D8u0l-5v2~{)@G?n8VQOZ)`B{OTtYo<;C^UXY(#U*L-Nlgknl)q+)BZ&1Y zn<_wni68<0eQi1@&0^@Gf+`h9@zImeHXBNs71aSE^J>d13D6_bidLYN=R65Z2R9IG zdhj6`tDu$`$WZMKwb`ai{X?j`q7*@VtR`RSr9rmQq@+5*X_^{47js5J4APAR5|%Im z?6$KyV`8gPz1vXm7IgrEX=?)BQ&b6Ej7X6EtXRc5J@)dHiI6EPWpXAPhql(WW} zF;)?jc$0Sf5wKmk#?rL>C$FQ>=}YVNTa`|z4vU=>g?(aSj!d}1lMJ2R!J^9qu_D0C>l_vo(I}r9} zRelryZjy#qOda!{R##8nah2Q3p{zv+xDXOQqU9lVXOrB_JjxpqgnricTgjFP#MJ zjSPk?(H6Hi$)lBx+mg~~72!6@QqFWmK>bX>2KTpw`r3ssD7(Hs7fyBborK|B5WyNn z&I@sKbC)ZjTWdrv{q)=~@|@yY?A1}YId!AA@R2P{S~ey*@&=-fG3||@1}lWp{rFp2 z9CcN-;wJZ{$9SG9|9Hw`G}T;&sp`CH@K1jQo4admM_Jd^f^F6?optT+V8_|Rymqqx zuq}dNH#@4}irjNWB>UL?@kU4^Fo3svTvRJ>Kqch7sG}1CZE1JA0en#Zd zDk8vj9Q}(V&v%NS9W_`58Q@&6bb=?0b=mNmZ+njmUTp&~8;ySSg|E5aOCNZzmu~Qz zI$i2-rb!vjG>}N#q87aHMK5k41~I&VAZ1{Rk`J`H@>UzlRu*+?E1t;V?4|-O_EPd3 zJH>Nj{K)!cJ5?)pM8F?$a!>KHzL^OjlOESyK*u9}$|C7!^^BY!C+Eg3|F)+TtYA{n zHRlOla9`h4FlrX~Lu3+TorGNgD04%17UqYp>AmK%N5FTddS2$eU5ZiG?DQ)CB4kdT z9q;IFsEY&N`->kxyvdRYT^9w-0y((n0786B^DVGE)X47u@=XaMQg`pu_--htybms4 z_EcitE4vQ(FA5f8pZ0(V2PDYDjbMl*z#(Mah7>G69Tm0Oy8s-oE%7OgqJwS&yv*V> z4T(8Y`vnw00R!163WT@}P(B>uF8!)N14zE(+dXMAsoP1WRa=aCgA@~Vrt6EaZd(Bt zR1q7CK^w!4x`Qs;dMod{kQ(d09JH@F+coUDl!<7#AuEF*5t1^HfdBv)A8-W(EPyTO zBb=#(8!IXr%ZR*dt3cb5f%uUDaEi;oKn0XCS}_X%kigUsmhxM}$x9;tHe4PYkcjVF z!#J$N7r4WYd!P}Zw5_@f`ALd~xQ_uF9^l#&GHbOkLqx{A3v-Dl{nDh?IwyB(3`o2! z7>kX#v!&(0G)vkI^3pEO!nHKi8CuY@T&RVxqqzzwsv}&e=D8{ikThm{jV^?;CCLF? zES%qv2sMmDq!PT!IxmwkG6&oe0RVtwjH|JGy_I=Aka0%2dPZoJ#)^s=YlOX5$}SsG zEPH7w;dzu|ayOY;#H-mtDoZNj^Pvd{z%kOU+sdp*b0_ZemMj@ODd-G0pat(JMS+N~ z)$*|;(gavQg(+Yyk%A5E*dpeb!GgG)0^ETe=)!5irvnH>`_VoB&pM}X;|;SD2o#8b z2tdP%Kmh?Lryf87`2!-ATuEf1yp()Nyk;r89#{}x%h)fb2<=h6h~vCHTpQ4 z6l}Gh`#Ew{I7!^8RrD|7dBvBTzzeiM0ld4306Q^20VJTf3lKYk@Pn+BCm*P&#NZH% zWFE(1t(4&bh*YE~>M60LElJ8Jc|p@p80|E zV!ZiS3+PlP=(Ij-f~Lkqly;muF|tiZ%tEH5%ty>k;akNW(>8;}B`U;+CHfjj&Zwqz|yESXG1M~XlJ z8vuaew9AT!fQdj!`Qyrj;LwlT(7xo*gc41ya;o0}r00xIWvZ!gMA7MEJb#P5M|;4I zd`zX>&XU=vd{Tj)$dcXq(Kncq`YeP*kk3S@g-ECcB#i_|s7Ki#(IXM~-w9y>tWr=V}cqsSP+~n2p(qI2F(Wt;NgK zPTJf`SE~dE%b=dDPU<_v>nx~{Qya>X9~o??)&#{$oJWm>A*h&w5zz%py;NMlR876q zU&sYn@KiU*Lk@Jb++@mZ6af;e#VT^40>#4w)xh%nPE8Cd%p68e!%#gzNkgIx+GvET zT)#yaQim`T?%PpgT_wUSuzPX5Wks%IDpY6%lpG8>fAXh#vQ{$8R&6E2MRlItD1+yK zg;=l!T#yCkf)1ldgho);CiPKl`$R{a&5&|SiU}U z)8N5Hl~$-kRJ6R5x*^Tz0fdK@3Sr%t#j($+OuOZyQvQ0?uME#xZ7S^wSX=EXH5CYU zB~s{UBSqjmp%~VZ6%)<_QAK?Zf!)d=lq=86xe*efKvBW4;K^e;!9dlC@PoFG?Flpc zFoJVZ8O_F%UC3x%%STlw#!;dz^@Gr`I&&1ckdYMtNdSG#z_$83r~)mETT6Q-z}o}b zRTSDhCEA*^GzrN{2_ynH*xQAW(=~e7L3mn+ZG77|7IgH0Al&UtVzB~ed{Fm0UP+>= zkP3>q!msz}35+FGQNv(sHQx>dvVnL71Aze~hzJzO+;+V&C2`>`u?ZEbfFS@~g9wBv zh%M2@RxB;icT}?M6GcL;pgtYSLG9WWoj`!1#2bu6vn}A{m8vYX;OvAH1~AQu5|%5F z*)%!lP;)JZ&Ty9RblH4-vM}Zj5#K_Cd zb%fHC*wR!9N`QzjxW7U6(Jdg|p6O&7owkLoAO)LS|D6{k2CHtRt#cI5YR0X1e57&4 zHtA05ttRopi z$9>#&3^(25s$!fR7(mJYEU|NCN-5r1#8l8- zodnzL-N8)k#6}$?S*6OH6{$MzR|$y$TzVC^aiwX*+3>*tGHok2cm){)3cyPe6*yf{ z%3hJeSIgvC<4fGGTD^h=ki0CXJZN9j(T>(Lh#G~3E;Y7g zA znEP{P+ir-Nod}+;(x(J%IK?L6CJ-6LDky%y$jwImJRW(hX;Xb}Jyo~ig`^No6YS0( z5;5<6G7q&ZYC!IRIiTzfPiR$6CG$v1y?$NCD7W6gYLXNHtR^6lBm$H~0yk)188C#_ zON23Y3P7%4QCw@0O9*M+?Nn}E1U60p+@pBQDFdswonBomKi2ZS-$+HF36I?GTrm)) zY2v)wC!pv5dUi&`-X#7EXABk~%ti4_nGq1rPgISFbS4=ih^M`N>-IjGaZBNWfFhLi zgZ3Sz<|qXIOb;y~1hSig+rDkLZQASwD%j<(vCg~$H>L!4>A%)bEhi08cR^BzUgQ;| zzFug*=H#5B>?~LxYVqP`#BMnq<*>>x@6^r}&zlKe5_byIn*f2|H4PlVU;aX9@~Wy; zIT_Oa9IRfVl(g@KNQ5oib2lc6=Wt=rZP^`h2>otex4u9&abFhuH7OsYl_uMud|*`^ zlL)^SkAAM8^&uw4@X6dKZP{>I-*-u{*hF5W#T^JXNSQHyP?m_Iz}3w{TvwOLDWp0;u6LFqQ zac6Y_ek60ITcXxM^;r^G_X@=B^;M=@d4<*dw%KVu*`xqy#zonRySSh);pRafl3Hk? zg6{K02p9f&i5;Xtyfr&vuhkRdyONT*;JI zs}FjQteDiTh)i#hTJd&X_4xfQdvL$>;zr}z@LyNc*eNGlXFa>BM|^a~<)LqIWXHY# zAf76`*Q%AbaHEKAIx|GNszj#Q}u@u=9L z(&g6b?C-aH=pH8}%K6*Ct}4KKL$?!LG3M<+TO(8_% zXz(DyUn4FsY>;3>K{|vGYN}}QqNaozH*(ZCYSgb(2UC$O2~z;U`cFL4hJ1njt2~4oZ6><*5*+O$<(_3W;dw(MmuXU$}Vz;_J)< z28$%s8H7!gEPvLrmDA&`&YDaY&^=J#ZrHIgeBjU!H}27fF;d`A5h4Iyn+|UOGAx+H z3lasJBubB8Z!YgFJ(p>9xwn$K{tg6P5dQjY?($8RX%{)n59gIDXbnk z6mk>r;K8R7PbiXPr%)z8g8W_5c*^L^Q}QI^1PTuzIa<2xZX!enjX9y>960;cG-jgZ4laI z79n~h2j|#yjUyoN3WF>pHrDtD;R!(LA07qk-F$Qmp zsL4o2eK19(MlF=*LK|F|kWigtNog7gLBRQ^h7CxW+ng5$_8w!2PPP#dNyKQ9Mvffh z2&I%Zaw&`l#g>N~sx|UOl#dqW)KNH&HmO0>Rau-!%Mp1TO3BH(9HgtN5eKe#7L*2o zJNW9IcOD4)U{YAF+SF6&*;Zem8P*pcaSXiWM4M}}snUPv;ou4wFMO%t7I%0t#}g@b zB!U5Cj{1ucQZ!ITjEBguz+4LWlvqwQSy+IVTrz;)Un#=n+G>elDhQ=J@^@*A9LboQ zQ&t%E^(48osA*@`DqW|zI-l>|{+A#qDlgJR2AX$jGU(+3eUuU#TY zQBVo&w)aZ{J~&49zG2re<(T@Sz1RgyYm~&(KWOHn*Oely2;i3fJ@{%!7h5+^BM4lv z#Ts|)ajG5-`EjeY@?>Ph)u|!099cg5IkFlyyYqZu9u8)ePcz6-A6H>zxTZBrmTrVm z+b)6`{V}?_WEW3W>J?VWXWom8a#O4k^W7zA6q?~ zEcj(TK7L0f3+bFns)no_`9fDms_E~|w^8Z!&#$xn_6OSk_IShQQ3Uf|i>cK?!0{`$bm};)V*ONLbs^P+v?_tYyJufttZk2nPiyw9&4P_%cWU zzElLf?d2_2JP0Q|;Rz}tgm8vb$zT$xET_C+k1GTY5Lacsk^L}YL_AWJ=mRZ?iI0P& z^JM5`2f7}4;eXQeU+V^O6+i$eYvocN1GBa`@0n5m3G3<~zt9FKEnP`01Y>0x(kQ_M zm_~z<6k%pyFvVZ2p_$E8ncoaqI3I0^evG=pXgIaZW2SE;9}yCeB3C|F$x3~?Dk96c z={fj0adr>dBs;-0fh;M3GeuLSC1SLKMn2({1U$$qb2g%SERg|IxI??h3wI@N9OO+b{OS5&}3EkQ!94U&&^%`)7VDZ@o!OAWYaZ;km8fMtM%GxH95k%BW zgB|Rk3OjIu6CDjv4g4Sj5S4)hQ&5EeIu~M6yyi6z6e%x^0gEkQUaZD_WgdESnd9ZH zS9x_zNRMR_WcT{mnCCTSafXJ@qq60X*n)~IzzR_T=P$TFV`BlIh}PdhST_`0=JIJW=Qv z?>MdSjW2=mMOjJzn2ri=UlUya$v`wTDGN<1Wfm5M&@3dM@)r&ZS}t|K^7`{Ot*e{Q5v7LmY2$M5TN^JIBL0 z*o_-I*~hLNM+n=Is{_04k2{d;c&bU3>X=kWUeI;8kQRhGZJ#?Ahyo|e)0S5>>c6G) zf=DR&^V;@{-o96+EgNwEL5fz4+@lSNW8Pb}2L_AOZ^r1A6JOf}b|1?GuOH=C6=f~pOb`LONG=tq1e^CN&O+JP zm#}Sa=$akAG26uPCs;EE9jJi z0xZbFD!fRYv6%(w6VYJ6AyGzchUE3&c7WZ(Al^Z61`r~i zGM!(|%?QUp(%b$2#@lfmwZYy>xYQIn;W1f3faFa}%z!m{2O}vJ34kF9?AsMiU2Js9Eu+1ap`^|{*2#2Z^hOCJswQSo4Q z_?+jtl|4C(4^o^?gkf|ITP0M2H?duE$XLh4nE8O*o=KqqlGGibOu12D;1L1zrN|Eg z7(-E;CG7_~NmkNjkYm{qP$b4~0Mwb(B7#g9r2U;_RTJbDhHVAgSdow9^@uX{AQJch z3JjqUe%(5i-6ifH|7GJ%!ClA*Ahf}v;lRugjU$u14=>-r|kF^og9X>z`kS~QY@$hi<4lSX8_;AJgn>%HWL#=aJl3T2 zEm5h_#~sB8L$Zbu9FG-Hk3M0*7I4hD=vW8I&m!fUdg0*E-65nA#x6#Sku_RuO{7U7 zj!h*0kw88YU)|oHvE9dsq*HJsECzx>bdO68(Ml+pU7F%v-ezp_<#pZWOS;kt!~!6c zQrAG;yd@^O_+vW7i29XZAa+>fO17j z+qE8BPQ^*Kk0`cYUM57L)!1AnCpnTqd$td6%A^CK6yeDSjwDZY-U}GzK?oiIHYJo` z>XmCj#JtH92$7*}IOI*Lo*r@;lpNo7g6DvRiVIXl;w(!g%FzFHQ%OP&T%ILGoG0$B z=S=zme3I8Ctt1(+BsuQNOV+53)+LUbiHyeBeePxA5lybdi9^!F*!-3Zyn*q|%N=6> zCc6Av`TayhHH(8al=p$n8j|IhNGGJ}g-41?bcG5xUE{K$W_^yRY06%iT15bnQjRW2 zj?O1sjU$iVXq}xwD<$X8`9QzjLdBrHeCCcFx%dD2GZY^pA8lXKy*(D~cMe zc9oWVPFK~x6aI3A+vXG)n}NCFy+m1rgk z7E2LqS_ZAveQLuXU*@FgY_5^f1>%JM1(e3>f6hd_##b;78Eg$IR}o~&Vwr-TE4_U! z=dCNdR&C!&L~6Wjrz}?q$ZQHm=>crO6r?3%YTOgTZsoW&s72e3sBmL;-2?4(BB8R5I+XN~N zKn~ObcMdhR&hkY8ZjNqyPu=MBz!7i|HTQPFy`2)*STP!Ium?B>9bgq+nv58fRusX> z7MN`)o-XE?@A%v;$dTMPt=-1;h7Rpe>jEu87;;Fs0wNDvkHDuRKQfXSC`$Hi-|{Nn zoht@rvOyVjp4ydvnWjaN1MEmXh2YnZqN>(g#a7$8oSp9n+Z-+ z@C0vAKT$!wD6J+_0e}`X=Rm=CAO$BkPyZ-1yCg`h7LgM$bO~o?P&c(p(z8Qg)BP6U zDUShCLzjucP$8HnprPf@rsw!lVGS#?BF7kGPKCzo^$ypxd%`p&<3Y)Z(KS1TYidda zRi4-Vr~amO(H2A;k7`oL;~UeFFAAOk1FAy>6rN`P%>?`CQ*t&(sPhKD;Z9<<82`z2 z_?Kf7uxX`79j7yX)*C>}bFuUqb>WjTXCrHdbPh`ndiu6-`v(p!0uJ#tepM@9FZXoq zH4lvugQ8bo9zn($1ShCL3kVt42zAny-w>|X30QT0#->|D^^FK{8I=cV-|w&tfKhPIXZvuHcFB{oJw{zV=z;XImdcQ4=Z$lt8%T_N8RPrSf*brX{mMo4^hldfK&J zPxIV;+5j0h(Yhx}%Vl0oO$S1+J&~gqV`*(VvFRu9$h~bKo=PZ<;wS{6lWDR4YT_o12lBwUzDEkAt%2)b2 zIu3bkicl)zxo7hn^FbfDhO%oj5X`bLwDwU z6Ivy!nm9LU7PeajvRt#g7_l1NvPB|Lc43^P;rsDIL5l2yLrUwd7*E# ztA)JOf)Bb1z1ebu8=Br8dozt9a0z07wx$w+yl>v3Q$`>_wK zgqKe%ygl5G;F8-p(df%4Y~r868SDz< z+b+3jJ0!D?0C^0iN(W7W%%dm&yf^MWGZXwF%f0BIZ;{;XvZd%BXCg>f#J`HdVA0CT zbCcgQy-Q!0jXAtbyX>L`=uM@hr>QW;C8j_ zmy=WUTmIv`^_By~s9&9a6*PDdVM2uo{VZIVr{ExlfgDz}coAbpgMc|l!A&nY8 z{t{_2WXeM-SGH_4aMGlaGiP?P2?{69fd^9+BsFl9K$;GF8WcM8qAR7aTqSJvRN+&p zMoX1K3KVEifvLD2<*D)i=2f3mZ+68hHlv|HYuPSpOA+NqxpLz!GI=*5TD=uzI_%4L zFD1c)V-hY5vvAC@dl{E4x_D=%$c!ofVtN^tQ>F-CbyiAsX=tdYNKX}8`lr^QLsdI| z%-U;Zk}M(BZgkS+?a7D}S1L&9H*nc#H)Z`DT=H<%zG3nVtDNRzP(I6Yb{$*!&ylgX zW5(?B)lQzCHG4KM)ih<)P8X`Cjy)s6_s&;~hwe9V!c3BZ7dQNsKl|>hX}<#bGmyFg zG1^Zd12-v7L9n{o$|kZ}d+jRsv?GPX>^{q^z4FdOkHnhjLk+(6D9ma#u8c~G#p&wX zaH|MyywSl09o(`1k_REX5g{KDWDm&rDm+WPP?RJJLkT;4ugSf>0}sUU%o8!a47Gx? z!zY;(YC7Vsi>gQg%S4L7k$6lqvIhgy1Wq#}bo0O=&-_x(`iMFW%qS!D&bx|6EK$N2 zSwvD$F1^%FP8BuOGsYC}%jw8FO|%ow0ux-*Qab%RE;&OjC3DN3+!OVy=qxlYJ1RE= zN;E)89CRrbp>p)rO_Ms6OjeEL5LmK)9PlVjMn$txBkjcW&NVqbmPk=gP0du|{`|2@ z%PgAJvOzQ4b}U9qee|p?lf{<88pBmmQfpI%R#`WN)sar*CJVJ$e4*qKUUQxEbv{TN zYj?P&_Ox~X)+~`~lfeMb9o16^hlQ5WRm=1D+XOKl z57vZpU9c)(2^~3EiftAc#tXeVrOXRaT^T<#IUagwp!IXDU!T!+F~~`A)~LIvtIW1r zs;zT1(QQdIn?XQa(2g$ftIh=o?D~p#j2pAHdvDL z6iva>6pgm&w0X7eZu$U*xk0+s8yI6_Wh1&-$RMQ_@1rxf^~7Q^=9WB`CqJ0*&KBbt z&%gtgyKXfF_EXGC8Bg0eW`!oX#zkN2o7J5yJp5|fvz}6QChhB5bQ}e&ICE2hUr_kM z4G%g0dM8txPh~SV+`Lh;bw=A_6<_U~VJTDRvS9#|?sC1#DAg&<>gAt*c(M^id~3|p z|DE^6@1!+6+S*^jYVxw^pzKSi^Io{_2fcBDO?v8i&Ti-jGI{YSe$vX|oSv68&YiD; zh9gh;7Ir`bf~$i36Ia0qQk18)DutvYR=>1FqsB$-bEZQf{!R!(9NrK}Vq;ywVn{>f zolSp-N}#w_D5$a#EQqq&j1G6DFezP*aE*ha1b>Dj#|6)*Um zC`BtF%!({T9UG0tx4W6qgRX1d20fIMF+xc%@AG5!%o0K)rD{TJL?Mm5$G&2H?{irH z8z1O&}fDNZCz}d4F_Yxv+yr4C)M(R*4w!P$Wj$NpX@R0u2=dSw02k zFL}air5C?uH$WBU%01&~|B#FhQbHb)EYPjxa91KMUPRJ4LoBHIH zmyBt@a<)i@m9&^M!z0UX^)7U$BvlV}c~4hHFr1kr)&&39Pu7_1YNo8^jABNjRQ7E~ z{suE-W#egc) zoT9UaWkV_^`EtR%anpoa;$9G^Nls5@?{w5uX+DQ&nx@9btd0B^@`}ncx033aC~BWi ziAX*f1#?eC^%)uv5F|IQ4L?7L2dQxQA_&hd;x3cJVwj|SJjGHArcspMokokdCbuXbJT^$LmJaetU}m&)J7<^A%sV}-eJ;M$07Dxe;dhJ zS3S67B#iM26}U3!hE1oxLY(xTTQ5V6$+4U?GF7<>;;v4&P^SYTOc@KFxL(qMyF9CH znMhB1+Vz(I4P@ugN75S~63RXPC8Z+8=Kexe$SVF@as@2f+G?@MP8~`tII}Q#x-6k* zt>RZ>oZxp7kgP@0t6B?sVuIqYX{^+o?-*Fj51Y7BuoY}<9X(wC;*J>DfUflRPS?!t z49w4FO`a`94b}X0)|yq8tepXvD^NQvT1rvwwh_3?lNtF)87?f5$d1&b)f^* zFNxLXY4i%Qu@LVgv(W=ShQ@KY^O|vhLkIADZ+TJ&AGTMEiRs_%5xzN1oTN0%!n{c} zoGeE$p&=VE4oMB@#}?5QKf|(S6C5K`dA8u%n$|6w+@)_7w3tY~-iw<%mp3kRC`c?w zU2oi*6`XpAI*zU;fA+6-m2v?a3Qc>Dvr8{`>z_%9YKC?H{O(S7bJDMVv#ZMum%Uu9 zj-7{4FL#v6$kgaIzc=tl;qk#GJaAH`2GsI`Qp;GfEZJxUu!g2nj(%_T9qG7m(}o3^ zx^`ZI->2#gYFv4!q;f%jRce!7&bC$4%OpLm#?#Pr1>XbEQ$+Ch%Y< z+3}8T+ctJ=yJOqx?zrRZ*tTukw$rgX9jlSAYibT=rrv|8`f5&Q{S8mms^?nw^}Eq( z*l4$|{(R}Q6l%dkmDz= zj&4|07i_tKG;0o1yXXGR4suX6#UwUW<9}{f9J2S} z;m>}opg{PiZs7SGw*GBe9dWR%V$oSacKtmr#SbcER_^*+1?z-*WyDsg(okmV^le1` zqRVUd>+kx>jhuL4;?&iSd-jP8Cj%40W5&!y21__9vMCR_t%F~hGB z9TKnuE>QmkL8l6f}O5;FXH9UNxI!UfKAkFn8g25S;a&ox-wj^_%@9sTD?Xz zT_oIWh7G}=Q|67HDiixKPIyeURA;BKB$(RAF8G?WvDWu9v3E@98fXlsZ@|hyW>zLH z7zVr$C^#VX57lLOTWV!js*CuL(*$M)ja*)PdOy0OkC{XQSoOEVixY(gubO*WWfu|} z)VGMA#z2*JLN&5wRSY_0C>$FiA-FSZ4(|=%_l`UEd;n$4HC=5ycdpB>p!=#E*U}K< zsJCj^Gb?bh9@7gwIa2i^h@Fm)GimO|Yj65xpsB_>-esqhrxTSlU73i;ku9o`vkzo{ zc_;K&opYUG)qVnf{-=Lfc$S(PyMQKz)I86)GuTBmCXj%476Gei_7n?S#=VZ466`JPZ!$gK0L7j!+L16s)6s7)VV1%xkA-gMf$X4YK zb1f|VRbiUyjV5_7QF7}0PfcLGRTti5|@>n zte1wk@S_q%44LdAbg1jYWz$p|-R5sC435>;8ZB*kZQ=y(vli!*IeCF(56WDQgCYmS zLDU~=qguO7Ok{Inoto4V2>RpLr)be4ADhjjwJn_>2DYPy6Ri}!x0NkR^yoZi_9HHm zY#h8o&yyr=vHg1}Sh^yOR(*m+A+{${L_{?q9@Halok1t^(WOb()sq{CXJXeif2fc zx(bBBDaIBR@|6m}ql!7tW(#OGmS!f}9|=2wSl9SyE!_hLvN*82USXMZ zYI0vRL8nHdKFv6%uRf8hYU)P)8^l7*PI6;O3oY@M+V>(nN_r`C(P`#VXL@ldiW^OH z8hhpSH01cig=kBKiP(*0WL)cXqB)4-hP(ikbKYo9y+7Z2q zQWyLo-J({l1{Ig+(W%S*!tJY>Y!sCq;;$1(Rc{z@Lr;a5!Mkil!r^tE3K&=VQVrZb ze9W(7^lSApS-f?D1xauK>0TNbVPO8J^4RnLPI>%CJmL`lpUNX06D29(|EfGP{`Zte z330A}&a)&~N?M2x%uOSsq^2UlqoS^@svxAQETe8)7($W^8(v_k$5aKkH z<~CH8G}KZulH)Vd5Hm8hF}5`^QKB?a<~7mRHZwCcvoo{MSNQJ}kAc?eU!8P<+$@74 zlYb}evADGAKM;=%?Nzlc)lJs64%O`BciI+tPF>H=o81qDR?$N(%i`k9-Tgye5LI zsAt78mP#4CB5k<5JGojmYNg69ev5-_yv%UKAAg+l#Y`rT=-#NcvaMDfZIh9%Te_)o zfFExq zyF-Rl-fJ@kC1$aRBy_3g4c_0kE85c@^_Ce-Dk<0y`HWK>9hOZ9`Yog0_>Yqf6p2y; z@Ho#F#i&U4NcpOL3jGI#KJbVP?VNrVJ4q=!iPq~*`6VX9q2l%`j-`#rj+AK9zE{fyL@G6H(J#f)Qq&IaubCTKdZigEq3VeP_+YX8Y>yhi}K_eKsmDoiX z23E(V^UF6^svTdCKKs$O8GUaoXYmaw3*nPH zU6M~xFf{A*TLxu{)5Ysyh-pNoQMz>I;ptb9_JnrQK7n0!f}H?OUSx{= zIAO5bbLoDHhrSL$_Pj{?ZiZ#VH_LA&i>>QcBI`KDhx(#IC_Ol`ByYLbP^idRAU4jWNM-r)U}D2)7NzF;GUgkFAwTaclG89Ier$# zHK+~$g3*mvx6q1Q-k}ff`sb<4$tA1#m^qXcZ{1~94%}5CWaK#xTHZA&ITP+DBGx%j z4LQNvSGT;i0x3red%-u67BB(0U%BaenELjbYSbAQ5#ia*l&TC$`$*CM6fZ9C3RTas z{1W1-`3_dL?YyoUE1DSMB>5>5B>#FIVM01#UnGDY%V4B`wN}2ia_ObhqBE`ZWTCel zC_nGmKf+ahEAvtL66pbN%sXN#W&0Gat^2ESe{+uIZqQHhvwi)>>TjY$w4)31dP>>9 zHKVo;J$DXrLV9FA4(O}T-#e`pNp#aUhy}KQYlNLnI!qp3ZHHbM z5ZjYy$|L{$h-MYFAMWpuUamgS*Xyc)@7o(?kBKV zDPi#Y%P4o0$gLO@SKjl8Z0@<+1@|m0E{uGIBzD!b!E5mD1^2TUXlh#1Q6X{mYK0pwR>2>G$g(woL@o+OBFufg0gR#=U*Da)0hzYuZ@+6qk~-7Oe{1mrSfaEn zSI8ewQb!C0oC6^{X(!k|nfxkf4qleoxK}jgVv^P_xhTdT#2pd|Gmr#_Dw6n{@>ElG z6+`7~RbqQW<;|lePEb|k`l#_N_R<36LOlnRp zGgw*qC~5A!PEDQKgKE#5w!5*RsMAZcv3|u1<3;!8X#q-^P0Ib*WLEsaxKCmTo=?aG z(;S4$MAkSQ#QJJEI-b+V4ZB4 z=VNRz+Ym-0)(+*H4yvkbl{)^mMbJh#$%Q5IWOUJR+`o45sB|>UP>Z(FeeUN~ydb>a zGB$y=XS&L!=vSfPpvA5Ymt?UkZ9*~mJ|h36wZ5gqNIfoV&05sS^=Pviw9hzPM$PMo z`S}x0OeVL2-%_USs1D+4=8F1XZM%Zp6t6S{t%|wX=E&Lu4T4`18yRbi*b2;_&Wb5} zK6n|*?Mm#$$3r-E2(XqU%%x>v_VChC~`6%2P)4B-av<1!V^$ujbvzz~1Ixc%F+QZ8#j!?~8*7;R5w3Q~E z)m|A?yX&N**%y6fa`Ef4WsZ8T&ePATsKBnQ+-&5`QWthana(V~!_;XTadOfrjX41K zF{zx7+)#L|a*)5z6jP;=hW@DTy0lJf*rG1?W|+~vKlBa}XQH(-D>46^q?gy!_~R^u z-u$NkSEl18E6e8{mOv|C>*mb5IJ1DmKBvxd@_y-4Oh@nsk~t|RNE=TIrPzT?M)dq=9kBz}B$ z4}wuv_%P4qps0UU)NVO`@%h9*#a^KmO}xL)Xc6YdWvg=f*#a)6uD!}9oJ84M%tmC8 z`J0Jmfsv2eK3{1eOS7Rou4&dbC@+XfINvVPwJ)99bjFh|rk?ROFme5!Di_jgk*oZ- zbGGTlsAlgwz^}NOZ=x!q&QTF8NUjT~Z>a@peACgO*3G;x*YO)LjrX#DXj{1GCER%W zRnUv%o_VBVHgW0`?enKza}&B4jn~9#P=T!FA9#!P(qIdY0OBDp@>XX?d{^Q#*8nYQ zEZVQEt=;^RC0eKF+=cR8_9(x6je^aY>8Ii5Y(8;^%h z*y!HFQ!LpyWUY~KdNW!d8@l5OCTcTzX$DG7d_{S%my9GAItPzGo8q18i$?nMPDGR} zJ0cp5}~*|6d8;-lqv;cf|ST9?tm{Vc2JoFhq#+{S~=ubn+&MSo^uB^L|B_mzIh6J3T4 z6+V*T+?Pw%EnnRMxim_WFUmaf>lFZJwcY&PhEa+)ZhG~r(wZ8}n1@M*-LbAR4zKC$ z3BQc2Ei_L+OKE}xFl?eNHq z{1GLcw3)aG*qtE;Si0Hz|FVPB2%PLEKfauCK@6U7)Nk41A<3fSj!1ZkRyI!NmZ@^z z1L-=AE>6>>WWmCI8P6xK3bbM~1W87fMFJZuRFW=G_>@E5D#FqdzCmHsTrBK?X4Aa+= zqGUe7FmrkPI-;t$!KmuV3~M7`m}z?jrh=r~xdaQNiavo~l!f8ydm-gy!OD@=243Y; zMR-1LI9N92?3)K*sBUY$1koN6>0cdvsgrAEkIY>bb(}%;@4|ogIag?iw6979t8<5I zx~!F>y!yc>tG-QW6JB_W8`x22d~^C(3!1!Cv?2&x!YQyrtPKL!-|E(ly~zm_SD8!{ z^Sw2BPP#}-X1g&)@x&NS3M#=V1j-?2MW;tqdKzCM33H#RT8tOfZKl>Ex!sMaZ?sj9 z%9=||mbRz+qwp7#+vYYP2#QyIZsGfOIp!Q1lG(eRCxk;2{4ZOl1QgBe52nMPcQP=i7$MSRH93;Q~=`Z=abVcx3*L}-m>*WxKy zHAdKs*skv_Z{eWd_WLa!N2nrwyOR--P6H{=OR;hJ)eT-Kk(RbYNk;98Ks~Xtv`a&q zAiFTKz4n&`g`pK)hC}!_e4+S{DJvh{)_%IyUBlq8rS`t7Dg?grd;Vlq43v43XSMil@n{3?)J-y4sY867oq-;sY2}{RrxgR$h5Z+LPW;KpV}*t(gM2zwFZkgj$MvUtg-tfy1w1AVL;*|z zb+F)crsb0Uj0B$2O0YjaGI5Wj&%f%a^Po8PWF`}4SAIq1@p2*>Nw zZ~Zi{?(xTHsjRUD^)$*4;&}U>3GbZ=vB0*Ys4m9};Q+qTFTVzYd)y%w$v2Eb?r+ip z(yV#>ioDeml-?szokH!{Irad~!=G)WFBC94sdr9!y)J}W8|CV&$jO&O9 zTU)N+)}7{{83nSic4qvG$GwU0Fpx)S=v#LF`Z@uFJ^rrQIuZ=vSlD_Cj6(u@%73kdI! zkF-JPE>n$DbYdOeP^M#a=T7HE8{a3&Wt%e>(7NFZ-l8OL>zo;Ix&`6e?FMAF5%?MC zZ*R8I#hR!*v#Z^(a^*fGm^RKND67Q#JTbtjv|Jw7Z(mWc?r%bPHUM+C(Wtz68W|4x zv0?n=(H^%QpNP=Svb~Q193lal4s9nWfdbSt;(K>8KW{g(ta?A}w7%5aQ{}nKE&kiX zmmdjPnpSiExbhm^R){d&8F0evpWSie0AA+q)HCm9-fpKh?}dW)T|lHQe^|z5k*DK! zvLz6jn)cNt5kklh0DXIi4yigM6_?s{8LJ(WcpF!;RyE)EJqCA3Ylw*$ZX|5Rd{yU5^RB!#0cT!*c+f2R7h104mM^4R!=gRyZSPKpDk> zJm}Q)%gHba&W+47@6MmsZb zJ+t~)(6Jz?POD)yddRJ;&EI-yMP}=&}QBBUVxdfyv`sz zn;JCxA{=AErRV@qR~(Sw`eXes93c2Y)s&2S0Sd5q1*;B}9)PAexMC}~hEWHO@7*-8 zULlDeO2@~lvMkE848a7}_z8IeY_!7^lPEr8mE@hnB*Ju|UAx@C=^p^b{@y6fAz$|W zD82!xkl*MIfIf?ZxEi3d_I?1=Z^%9Y9La$&W^il=S6?h{J4t_DsQ{zZZn1*y;Xejp z`|6;G$xm4F0qu2H#f3Lmpa&0Ec$Rsr1JQGMvxid?SkNa#rG9v6wFkZgtZ?#2wfeiC zH&A;!M@tpW3OS^fwe--}%f?AC#(4;`{m?XGAon16wSl`XR)C5)$ebKN>UwRc28U+` zrwoB}B)>te2W|EJfK|Wy1cFmVzv8V2NrPZ18}2z9ZUcYbfWKn!^}mGozhJ4uW#z*X zt3lDQ1JlJ`mDNBA=r1rF@8j{;-~xa;JG@UnfNtSN=@!-;0$=U|BbV?f?fOb}`$PLr zqpFBcVDG@M*eWU58FlxthdGc-(D`Rl!1x|)X&*4=;HIJP-Cz6<5;RQ4$0rcDADT_= z?rQ|xIY{fhXw!v zIRAR#p{77VK=JwAFr*`l3>uK|fATJ%fA@EyUkc6opBx zAR$fJw`*fTCpe}Frah9}_dq<34q4f^aVu#{qMt*=@V1}K6gAAcbjRpAfGuP;g=(V z3_+Usi@X!W*pRg1nX{!gGn`*tP{p*vJ^nET+)MnmoMB%CD_TAwaF)W#A8-Mgfs+i+Lq{>5p+O5qw(+o^1>6=1-Gr!)Rf;9k+WSnklFUP zfJm(?p-?Q>JSak9i=c7Lp+w66x6`4YZhdGIH!0| zi8>X(G_E04TeYeMi`yY9kEX66Z-T=A}8UgUA^8)8y;I$jPC zICutg`uq0CZ-4gToUZG3ZW^*U1v5yPI0h4w@rLpN`o=M-^d1X?5ikpE3PVZS*YL4W zSqWa&32mK$v0joOtun3=z zsiv(7|6tD(KW4(dES4G*_XP<_&6k>$c3p36(n$gv8{37_br4I#h;_vXg-HD|OThB*ar+bkGgc(1pLbIEJq4#3L(h&elbwL$| zrZ5<`D_tPrnnLaApiTgx7{`Xpp^#)8~)+ z$m4&uW~`}4*R?B9(voF+Mzu&KQfVvcA?5bP3S>zKX5rKdzca3M#vf_9U?; ztRVD9uspQFEu>wfx)0rm>x8nx`7v%5=kzhhC*Oc>t9u+i29DE25#klB|zB0R^ zhC{6mm@!lISHMe5n#jw!r_B3Jt@>^!rT$Z6anH4DM%#mY#3$6_Y-8muV+yu z82S}WFhefqst6BLM%tJRLppcO6FW$Y{288G{N5^i!l3w&-iO+Q)(Qlxd6r;gGpXEG zRc3yap1kIV69ChaSGr;@j)1iAm2)AbT-a1`$WOndchDB20n;8=gKw z&8pjaZwC6NhfFo6rYIey#W02-lYl6NIdpr-4kV|OCkMnK$8rf}^2Oi4+Hnjb;7`CQ zhrye(pqR6V;jfem(tI4S`57l`V5MRA0UFql)WlDy3xcw=PC21BrjcP%=KKV{>+DVi zT04uRG#lHwt3w0?|3wO@Z6AW zQh@4?_@obJV_hj?d#*|_gN*O9wq)VD1gla#awQAp`2};toHbe8>!hA#L>Jv^PMZ;p zA~CY<#)Mep;D>h-Y8GBts*OQhCOHwSb+U6f3OzkkI-IK;flsENfyz*6=dZiLz~AVU zWCE8{{Bt>`Gn)&}#m)&OKk}W0v^~AwoLwx0|1I#2cwBCYy^p-%pHlr|Nzj$+9y<@? zF)lb53r7jUh!NJ0-@5GGrq+`n`c7$ofX~8z6e-_M(q>cof+{)2@#UFydSm?+?s)y<s+YXBpvXOR6ph#jn)ts*izZzLv$v9L?9?A z5EK)aI1xzXfU2#ConI?Jd|_NStu+>|BF14&BhWeZWssp(!V*DXea(?K+pt{T; zj(4_=t~^jsZ%P0!hmZu>Z7U3R5YQG;ClU&(LlU|H8lGA-t3#+AS@bY;z>;Zb#y(p^ z2s`i8m50N1$5MNb~J4j!x^YW8bm^|)`&oh1Bg1% z4-Ca66-Z>y5tEWjjILqDH;5M`1S-3k2F&SvqK9ex+kGsuk+Zta5(}*Z$AmpWyjTP- zA%l8{h*~XhPCGKrD>5Oz;V;l0Zb}1W7h# z)077Ol60=V4T-*7Oj>eIj`8;*tZcq5_g;JqZd;8;I!j)1t-|gwG!m`Yo$sTG9$_KB zL;uynyIo6)3dXN4#Cf@(Bn`R5rux;eIg`3@10BP4#7A`+f=jd%LVzNszn~MEr?v_d zU@>RQ=n2sAn;(+|GZyiTcC0NOJN+lsm@-TnQxAorMOQw4@27{ zETR^eH9cxDZ9>BtnL0;eg0~whpbD;b?=518wp3EFik)ZX7m%0c=_eM*w(UmyA#u4p zHzYLE*nwj=Le>>1l13HW@mq@is)2Km~4P6!C_#8$IT_0$_M}h*T4|W#L z7C8i-i1US!c>PdHHN$Q~RDU0(i20_89;>)#$y8i}nS-dv473`M*@$}8E2-EX_*n>> zIVr71XNi}#u;ktx0hwwYl7h?9Bq1S=WUGiV3VOo{RbmG#3z7_tP7avc#~K#QYFlAa zet|O!or)bT{qd4WDmkK;g+xNBqG{%*%tTCK*psB3J=CQG9^>mJODHwG4QR^P5vVEB{NOqo5Sbx;bVEvJ!Ij`CF&^oL zFi70Q65*)xkBf8m$YrMGF7nI}PDW*J zL#i0@eo9J*RfWZJ!&HGM_Ng~QN;8pP_b^u}_oeawMkO_rR;nlIbsMSpAJv#WEy(_v zcQfKcOIp4=-pm8%{~U>aJcyDDGr-Kn_yy*Pm6#p0#d0wVlm1h0&=Hm1h=?EYy}x4^ z`9=jHQ~u?$;?|4hewXKQcZWL+x*RO^va8B`z8=m)D|60T8Hl>_xo1ha-KuuV=8kSPG(|DFebE0YtcQX-|FPoL+>?u8_t}CU&FtifwW||G0;+O| zd(r;Sr@Rir6#Z>m%N1+ReBwPbFCLYA^-l!nJfx=Gu@9M)w@Q@?lL4)2%36c>NAd5( z#;<;}X0XWP&7zmX?NTiGv;suDCE{5$@+_iCD845kltNj!Mcmm&_tjlw-t{yE3!b?( zpJP#BRMdhXi#ny{Cpd%U3&s)8MG85tCR5m20;vfe6VL120?)mJ)&tVNL9biwO;ljqE=TH!MB8HupVppz!1<$G#%MKK!q$ucM~X>50knTjtRQ*PhIdB^Gq{A|Cjr7smVXQib@AByA7uthrusT z9ny)L5w)=GMhVxf{B?0@x{fQl=j!Dh=n;E4%Xl8NX+Qgroru~{FN0*}mM(;$bn?d( zL|PY$y4hV<1(j!!I5;cuto>Gr&e2wzD9}-JRKw~{_bNjlyU2tbUU{7yNdu8vud?Vx&w{i2@{z~jBGd*nx;(J#(d4%GKtk`Kp{seubu+YU786 z5X4>}or3*MTjz&eu7F}ukEF=^^lq$ZP7bV24XG+Lj9szmPo_o?(K|}AhZCJMtkuKG zoTy7O2kb-zkX&|g-cjZL22+9gE;YmIXR@iSn@Ljiv6+-So9z-Zxl}f-GS0jjY$aMz z+bV_piP|f}z+o+Mr`c1U*hhHVRW^+)uk5*zwL=4zbKU9XlMEuJJeH{M&vjM-y1hLN zY+^E?1uoqNX%_kW1`;f2Q zWB#J)Io>u%KZh%4Yz`sAM-I7}#q!RG`SaKl2_oS>uJ*X^b3o zMCt6{eN{$9c5_h6vViVl^kL~4qZ4q>!^akNuqWIyr|70ZuUNMV?cU^pS>SwJdC@8i zHIbaMx~Hc5ERUa|%UeH1sJHZ=ypTMmRkGFTJ+$t!Kgt~1M-L=Uo(OTf55Y(I;bt(GL)YDx;9uuOUEcFdNzf(95=!{d96)f> z1$X#v2#^#taha%{dP%dN+8EW0N;vwDMq+naMl<3H$_!<=}w(LgP5?@d$%@vj##w!mF69-BShdkXJb(Yn_+w4nmX zTG1=4?Vd^ZEwpPO#V2BDoWYQx)KE8l7@ptImC;{CxV_HctYxROw%(CHEJVY=acbnoHfThz51%%8Je zJJ0XLus~P}6UzfDb|^_$Bm{QHj)kDXNCb4w4%5Y=L3A<{(YNo32(hBUz(it!r2_I~ zOg|pZi>7%6W+s}o$U((_bwMH<1?Hi#c#=F}2}G8ui*tn{<`_;VMy<-_3XbmsQF^PF zGaQ0+kq2AaRno|OT!%fG-dxE2Mg+ zuMGeoNbTeP_7}DJzt6Y`|9G$s>J(PEQ%31Pz~j48W?9N$%hGs6CJ5GNuH)8xbR$$h zp_G9GM48m-fsmztUnf9Q)+oh6-mdZ+kt#t*i)KN~3NPoGt z?NKy3@^}1(wzQ1-C5F^#Y|AFSJpW^_*Sp+&1c(vczVHk_b~ZTcnQ5(i)f2~oi!n3Q(~O^B z;3}qhwi;5sZm zQn!`mEXIu-7BWm44!2>Bz{O=u5`u0jAXutPgGjIa%=mVm84yQb39!#;}5G|Qnm?zzgyH0~=K=1@nO;JE99`mdhk zct5K63QJjsd(m)@;p`QmAgEp&_BGE{a=GU*5kRDlw`$=bsWt&)AO0mmpSZGm4n|VZ z;xq+DPZU767$pXQL6chX)bELHLniFQ%hfR<@p3%e2C=}Ihiy1xQidXpYa4e*<;FoZ z%D80bu23guM3L?LM9T;nyynSNKGuOLvY5M|3-R@(G%0MqH;7uizIEtQdbCkua%2S5;aCp;~6%^u6_M zxZQ?CCxT+U2fh*1h9%~LM#x;DusF3Gk^~6DHoVgmeHrAw@dyHvU)NG%YnuX#H@5d5 z)fDvwimB>p|ONTX+viCaksN(jW6{%vXF$zp^?wMa;)SGUmg;)`>H3A{>73M<~4#9C6UTLV$nTG2QksR}rUgzJB>&k-=Q2xQNv z!dXNk>wgLCV1C8Jf{k+!I1!GeV<^}FYXcjfuOu}`d?nib;ibad3zQlOT8SSY4WPo# z2qmi{=l$DE%e1TF{>dn(%!vZ|J$oLpMNyk`X%_M@F|^J!OxgxsseONH#m|~J5_gr` zy(Tm3Pkoh}Z<3m3XC2v!V_Ml(tt7D|%i9^H!hX2(eRZsftg^+zB~3lxB<#4hnZp{r zNVQ|qJpkJ8r6=f?;lip$_Tc%QY9Q?Lq6 zJsvf}aVkCPsX5weuBSD?c0J#^!W}6#Ni}&$xJ!uEgpHDlf7S+gOXy8X|BflM<(mPh#j(T2HkhmB{4c75;9eS zu&W#2StK({EXCEL0M>QvS<5p^$*14?tZ zGI*Wuxiw55&e-W@WP%4e-A*xM=b0|1bda2=uqjelLPM4D-q{@AxhqJH@Xv!SRfV89 zjRRk$lrm(v^}l$zzQFC2Zzxv}ui6`v-Z5~Mau}s2pVsS&4<8e*#YJW_7{y>xAo-JP z$7*`&-Ya43q}IWY$zvnXZo;efgy14jz|yyTs3pVi9QSZ$Nc~Hwe{k;jEn=h`K*d6a z>;$t!2x>^g5Uegdp9}W?{^c7mBfkyC%8^xLeI0no$(MrClImFWUE=zFjlPr~-Y`?wo4IVwp3LcL@}*P-p+oke=Ucw4me7V4 zy9I0OU=DX8IK+JNIyCG>n_wqBrC2=ICVFxGB$TB~cWdnVMODz|WhJB*B~N~av#4@r z9j?mJXYpIy?nNF_w^X-NX`VnmD<1X02cWh!c-cCc#0OAxJi%cEp|!E31D?#M5?+^% zv6cA@z+5?qto(@=W?>YJ+JSN(i5vBcWC zfj2f^w;vZne8CB&L9e^9m5D}MkljHV zqd^IM|C|-Lb9o${@te1_5cM1E4$`k_Mu*fnhBN>YU)`u)7 zQXVeIE(6i4C)NnNG}1Q}5`ANd3Dr|d3P_y4k&cBSZWW*+!J*lIBbh2t>5=^K)NKWl z7;zU~(C;eiN$Bz{M}-HWV@jLj&%)NiUGtk17iKk8qVfetB5P2PjN_j!R(CqM8qh#An4S$e~~)`1D_%m z6}pSZ5+s=HGV|&4ECyGVuAp-Xl)HRR#o|Q`UPvsZQg0ptcLcZo0vwQd_0h192e>#J zexn|uj=vHLw;w!tC_D$3*$Y8DU44MF5__j4gE{#UInHuOsm@x;rn62am`cK&r&Wb( zbUQTid-F}e@;W0QTU-^^*6bPsU}ClhWuB{VZmEb-bXI9(9Ym9AN*VXG#FsT%ZanV* zQtk%r0M!=Oc5~jW!tj7#0_N2aD}qrBGG}GtvDZAN$y}A25>0N*_t(OK0b&iEvctrg zhm-GYm)jonDI(7w;iyjlpty3M8Ht(ek{=Il90s{TQF@5dQFmsnym66&UCCc3=TxWM(ok^D=d`V)c7Uc9T=J zB{&XFur6cChtXg_@9|M#nSLYA}*Rivfj-vg42R9_7WtM?u_<~@)e-k z>LT|K?GPjjTdQ-gz2crzwJlpqw>s$;dy^m0b6tyhI`hg(W$o zXOvoVU1G2EN%w!{^xun z9%$mn0V7)p@*wF*w-HP=y8Q435bIQ2Q9(mfb$3@`l6YkultV+G@y=+LpgRiFb?sCh zvnn;y!I+No?Hl8ZPdK(tSP&Kk<+CjOt)X)Q98U?f0sO*?(c9VD+9FJ^gIdjN=;2b5 zWEpMkyW0Jw(dmCW@ZpW+e*sQFvA;rQN6-MAKyMPZZl!5$h@^lLG;I+yTjy4E%K?0u7BUUXOP{s#en1Iq@ z;mrj37R^LN#uAjTIRTB;66peH*ZK;}*P0R8(o384z|$sCr>YP~#FPLhCzgE~unsU{ zKL4j~(d|>Lf)gV!-$rp1D=?;blwh(d181>h`iiR_ih#n{KRRAfT8#{JDQV6olw{Y) zv@ogSV>Oj9*^*+_vR=MH>PpOR8UTSAn5_sDfz{58Y^-fpR#-g7;;iNE2JY`WwyUqw zoykgsE9@=1KCu*^!W2_6jHsF>Z?X>|sU|zB79$t=kO2gNK*6#WrByFg90B!$FdT%z z42bGnQO^e0ARe<<9v0}Jl+ov{DU$A*Cwo-u{#pb!FP9MICWyfeQ2*Ht zR%&;yslF;n2t(kPq;4OE9Wc581irwztY8A7;kzZC_mNPUpo>Rz$r=foBr^2>DrNz5 z8Oh>WVXmV_%T^=LL?labNOLo89iJv4A5VDP56KNY@ubDTjd}Xdj=U64nK2Ffop{`D z^%ArTHUYEp^ww$D)#i#pdsk#RVD0e~F`Hr5LIxVofIkbxrN#swZ0|{uAlXV(DPM`? zxgsllb)fR@A_o^)1FBB?O}oNlNUt?pk2Fay$*atyAxOep({)|XwKvao^Gv9cT1+`d zBjIibR^uXfXy%uCsT_u}9n;`SjImR4DGS?li8U_J4spm*^9G*v-4^ncw*TEn8-y#s ztKK&8HY;%Vc#qvVoGBfjOy0F?f3sin5R>q0E;hD3zct&2sV?5OrFQ6U7xlhwCe1qO zWyh^%*XulrbX&VMHkYpEgaV&t@j2JOAxm;$dOu^WR{nV#m_aZn$C}rFRDRJyN(UqEdkWH?Q^$ zb7yn-Xfs>4p_ef+ieFjVCX|Jmk9xoK^d&Y4>TGxSI3@?~hr`gKKL59h*SL_NwON05 zQ@jF{gLacDw}3-t-B|OI7BNBoB>4#UZ{xO9JH_%I@8C+XS8Xw8V>zRWY-i^Ol()E1 z3^-`Ff|Ij20B2mC$1UFwv2+q{z7A_aZU>PQ`4g-8 zVIp_m)E0y5dikVwssFlvEL>iz^so;*ut{!2llSkf(%P&uw{rXKDOmF>1u&}@2_;-S#>X|ekGsDQ zyrXA)gfFqDd%Uv?R9IVjMx(sk(nXY$_OnBK0u#8oAM$>qtdSh_oiQZ!^^y@ zlQdWp7p)F&mP_eqTY6&hIoCJ+#a*D?zP+t0yTTh3(?h4bfBQ6Zc7)j)t`YE~8}Jg- zz0hyH)*B|T8@_N&{n@*1vtN3Z|Gdr@K66&P+ArzglmB~hGd|WoocJWZ+LkgKJJ_Tyl)kg!+U=_e(nqW*_-{rBYZ%GEYSzQ z@>6~-&OTU7eodyk#3MVk<9X0Ga>O^j$bbFvOI*DtxlI}-$#Xxh6Fj!lepI}9X!~lV zufI^ZwSc?7gC@O|Pr9yDbSp`I?}z_l0t6>s0|^#1co1Pig$gw-bolU~CW#Y4RpfLL zW2jICGeY#pG2upy1V@tORq|s>l?h+HddSLEOqntd&YU^WW~){!ah_Ur>f|b(LlKS| zg%hIDqd}1x^!W+uC!#|IPEA?SYSxAWDNf9q)c+#Iq8iDTJ!y3#NVH$swsq(#XwIH+ zr#}7p)9qEGE7QIl**EW7vVl2nW$Ki0(2R>ECMIb(V%NWAJJvOMd97p39%B}Sn^ULF z%yETkR=TvV&xL9CZeESjajH~KL7jx0*Hdnck1x8;B=$9B;edGx*NWJ5YS7CSF8@qZ zrRukvpYlF^z4}?qm{GeP%Q$(}+FXB+r*7W6cI2zALuE_ca`*J}dy;k@x;Rk5zOn09 zpWQl!>NBmiqh`~tx7cK3tSYV&!>X{`ylW^d$zVeeH_GVSFgEC#x~VkI)I*LH1(ia} zuD!6EkTnMRW2&~?OlmO0#;J3P*7FEG3^^R~zRpGjOS+m4BM`;cSk!U6 zAPMVl!2}gl%t9LpM5#gup|mnTD&dPRBEAxX#i^ED`q4AcSQ2f@z@$sDE%}Bl3P%P9 zi|sKiyZlouK*ih9#lpViamvr=rubV}&tYRZ*xT(#nnz60}A%ug`g0@EwM zA`6Me?^>;LvOS4K(YP?}oYm9*RDz`?&(aK+7d4Ayj?zz;Rd?NDql{51)?RE;&w44e z7hn0rTva@72^}@KTvPRwU6Mj`^Z&uSLM(VchL22G&`6hs5Z**Z5k*>6VRMz*sPgS; zDS%&UZ{O?Ko7mg*@YBv$`wm{1&pZ7)j!0P{Ud&JaPF*s>e0}a2-^)a1=--li)_Fzh z5Kfn6<{o_bJclhCvO=|nrkP}$N%mQ!Op6|Fz($k(y5w!~FKax#+u=o*?bR6VZ}x-tUf(y>P6}gG(FQ^X72&nm>K{F3*9A{{L)jfh`{OfDc=I$yTT2xH8gNMLx2^*==5I=^-Vb$h(u$ z`u8NyhN;AfJr5n^?q0=};8>yUdUxcJ81e$gzWW(aT(vtN{ir9RvAIut_3Ksx2S}z0 zc4|gB6J2&J!o2V~$$;IG8u~(#AFSM2HP)58?QAv2R+tzICR{!@<&3nndM&&(GuUp2Sn*vFl3|i zVw=oGmod7~Y*(w|3Rn0mUK;mNdYmtb{-kquyfIKIJKj zgVp;to7^!&I&jQtQiB zDfH4wL=pr|PV8m*SXjzjjtfBND~$XEXEaLM?vC38qZo_0#*FbME8r^QJn7jshbd8a zkph@7*?7(?f<%tcOlPnN3dG>4vx=%*i9E?zB!nWykvCKx^t@R*f1Rju0!3EB49B8@ zE{~XCd8ps)=}C+Zla&gjQwn4D!w;2&STy`-@7CwfAl6b&NK#!%%}AG)F>!%r`VduU z6UZ78^>*A08UL~}>Crrnl%`L`-V8sA8ft#Bsc(@dxI(HlgH^Oi?p$SRR5>bs`Ho9= zfoHNLnz4fxbVCcmkTnrRw$F`In34kIYUS+=i(&{q%X11!ET}ippS`Y<33?9@z9F zy3fK-asF}?ALD1$vh7W*R2{4CW@=R5+G?xw6xLtMHJ3NF)`R%W53lfv($MCWP12nd zRUrvm$_=P_j#Oq?)fO$8wJ2xmvsTz_cB?}IcXe;vWpklAsgUv$tkzxPW@{SJ`~`?- zI@Hj3f&aF(J>vGZ@GTZ==Y&~q9#X(r)um^P8cNLqwv2hnT+Fbmxv%0^zjCYQb_%pT zW-3%-!($e4{**h|y*I7`H73yz+_&vr^^2D!Fv*15P`@%4!)y~WVY>=WV1d%U)NO5t z`-o(r)z-mGg{igF>dI>lwNOp8n@K5*OCGn5y)NF*j?4F4!m5dXM26d$>FF*ft52VA z1}g3B%g+hht;)b#DV%2{VFyhY%6i3LdJTMMxAxCYWDc`-EnAcylgl|*VNnbfykF{O zD8knhub*|i)H7mRiQjI6nxpKs zA#tH3vsPc%%9Zx-W~0j88AdysM!sCMY57ZS>qOGS3Z}5T`E7qE*2@;gEERDFau`Zko&ofb6)p$$bu^B9inSyaRcJ(@~qc3P7mtGlHbWyV(gd5?Blx$0TT zT%-J#c;Yy5hIbt z&)4wh#xEW=S^2LuO`R9YxWxAn74en4NgFkYa5|@dp5T2 zUYg&V^0vlQ{i>DDljJh~^+)%P>z%FLYwz-9yVq}rH^101rYuwnfB3@H=qF@$y!b_f zyYyQQSlR1a%OAEkbaUTW>YbAN^5?QNQ$7Ai^19^kjY(Y7BuD*t$+kXFxp?LIq|Jp^&Qi=Q=Kt``(T1ty z=uT=nS|_XK=J!|+%ubL6w+e2iZRuDpa~|)~6lt@T zj0JPZ0b@=F=PraaulFuVkBV^k(8>xm?zf^StxBx0nlSdB%hl+O*^M;LtY!+eu-w9F@~%(k zY;aEW4}`k#?a~YkJ1=tFs?ek*>mZS=-cYMb5Z>ZV_89SC7_g^EYGr&W5NlD^*l_m@ zG46Vak=E_NqAvZq>ktQUinwc&hS2~!a2K_y=>{vvSn>Uc%75nV4$G-fR)THLB+b3l zDdU=Nr^HGb2Tl~x=iMxB0LjtnJPxlgXAu=|0pTqgA?*(HP~%vz1t|!EGOf?9Dte$S z0=-D{P|p+LZxY8bZ5WQ<+->4ykX9Wp(Fj-4+uEtFif)xGW({8t1#tov5fJKLq7mKiZ7}RVa1o;H z4IizM?=n&FO46J*t&qx3)^-hzTFDuukm6i&2+8gR$1NcO0stZT1O)~FqW~-b0002s z0S*BG2>$>_2^>hU;HXUq6B=B|u%IYW2L(cGNRi?SP@p1atjMwB3XKstA{+Uuqe+Pu zQ;H-wvSG=SCrPIKh3ueAk})NQ+!?ATPLw5Y-W=5vrcIwhX(~0EQz+A?EPn#Uh!HB( zO#`tq9A?!ZSDh?(GTn%>Ys`;m$%5rsljhT!EE>#M+ zDB+}r2P1`BH|osAGV{9h+fwpbzmC;fw)hZl*v)|#YQ7A5W!BH151;*N`DJ8>Z8Z{x zNp*JRzkN?1-E9}H)5UXp%XK&v6S(wRHX8dj7{QPM7=uI;L9zd7Tucpu1c;>;EU4_!gSfp3aEtx2$axv=Zj^`Z*Dt;&qCDnre@&Co& zV{NHfR%m0g)#__=)_Nd~nC)pPtPIB4=1jpVx~i0#if9w0k#2V7mWY})p`mDUnqHSZ z&d8%m#ID(`Y7XAoX>Q9F_amKPDobv1#nQDWfq%Xl;DSEd`W~1%^@`$&Qjr!|b)o_+ zVnUN{g=NB835T$xl8Q8~l9pnNUcJVN>tDb8UEH32@o7fpk#8aU-;==#=`W)L2mI4x z8KcV~s_W9K+K{y#d8e9Zig~cI$5vHulXfjUsX`i_7_navefR0Ws(L&bl2dM|Er%?o z8l2XtnF^tIt_5kVtS{4CGtR)0X*P11v3O~P)5Tq9WIF3eAY^2NbaSsvg8wb0gI`P6 z@Y39o_w2TZdzt0a7IzzC-WY%U>#|puTN_V&`imXqffqhszI4jma*YfY%5RzJ{W~Vz zIKJFp$XmPat7B^)%(ln9&>pnWiby>1iA8%@slrZ&X>jGM7CaVxU257az$~YQEby!M zi#DkHv58sADob8Bo4x{SD9_p6X)fIhDmmbVl0TshB51 z@}Vtfx|<|Q}x9MFV2Bb4{%WE5j~YZ$?BVc*R4sHiNiX)>H){O0GRF`~(D z%_5Z?RY)_#olA~b4OrL%rDQNwBILa=VKg-3;`X>kT(OW#9jw~hq* z%mSszOU1+zj=p)L7QMwv&FRog>nx=tjrpF5z)*0Vaaxw{7ym#z=JJ2?v{ue=h|LvZ z%}1Q<;qe$VMY+9?mQzIMn@$ERB7%*P0g`AA18ObP#RQq!$y9iLx4&lUWuwN^;}>C> z%UDLwYk+H%d{$?^Aa0aUwj!1rzlE>Z5HN_^vneiWU{RAoOZ%Pg=xFUQ%i1 zEs&PZdb&fcr<0e3W(NHUGNJB{u5*lOX5EynhY zM-|r+WWw_1>rQxL2Lc8LBHN3X45f+#!CyI@!PZ*#9)t5v;_Bj86)q@mK;@D_5tqJ}pDm zzLT|POu@TA3+C#yA#_iee{`X-ojH^?CM06ZS~hx_wZ3n*p;sEl#_m{>pwbfSdVy$C(yb@HnlsP08_$FuJBp zXsy|mcE3hN>28q{385Q@jEMV-aWx<2#uUeXwB`>+Itm26E61xId7T3Feo z{-n4n*VHK2Tc3PB_0@hjBN3AE$!YaBr3^VqTCTO%+eMYQVav1q!nE8!J~y$ojb3E# zHn$|zUlF0&?51+KP|GefwNvXub9URK@c+HEADi7vjT##&S-V%e6gjsB7WdZ>f44&> zPVsF^yuYy3Hdo_IJePC$Z%q=bQBApAHpd>4mqm!7ORaWcf0M5`zoV`{dZSoXoJ7~1$$V2 zFxDZ_->+HGc6a2qc2E)KNkxYN3AS-X^Cz@rRobU+f0lU=I6<>lcc|8Rf+udTwSVO{ zKkPfTZDjjYcrI6knot zdF)46Mh0*hD1JQ%D6P|USN~N({K8*jrhkgpI9$_zb?85UXlf7k7EdK-(V`W*2a12< zZcPYUSQlsV1y^hrc1|}`i`aK+CLXH?L=IGjJJxza$boK1XaQFjKRACqw`YwMe+mLI zk-|HGm0xaGa2iHdsx~w9vs_Q7ikoPSO*eA4MuV&eUNqK=>W5a`VtTiMWj!T~V+Vjp z)+YfqO3xHR(1b7&_lebrI%HRNfmkhFGj>KtKuiR3^;d6em5rhoRu}bHQRjqW_=Rw@ zatyXr+yyx>pFQ*dbnQTPIO zuQyK|`HQ1ci(h6?R{v94cvy%R2t9JRfWjk+!?Th2c#j>%Tf$X_64YUO#)ci}X2)nU z>X?WS^oMU{TVgmmfc9LgWok`Cd`e}3`eTt$I6u?GJBi~t?dOsAC}59Ai%B<)426c? zNL_DchSpSgFeoQXhJ@imHySu7Lx+i3sCy}>ig>1J=Z0HVC}g_TmVQT5i1}W(w2~EQ zZNg-bIcJ7-rzfKqi#f%C!PFmd1%kshjx-s1EL4$Bm5CUKmRRzUkQsheId!D8i9>~R zfjOJ()L2CbWQxR%1jj?pCQ0FzeRz0IvT1A@8Jn*;VaQmNX=jfLXj`{MbkXQuQWsq1 z14p|#D4`~8r2nXb08*D!6m(q4W>05PR`-p@cvXV7l|CsR@+gncv5|S08caAR`P#m8^Mp zfEaI`>7#9VqNeB(E(o7SwuNOklE);aFfw#AM~)HHRZn(?=?8Pc7=%;laH+^sb~#2g zriOL&Z~Q1Stq3pYXFR#ndq^0Ptto8DNS2Uwao07Osh5-;6hgZ}5JjiQ4%DwUh#mhYIR`-rLUXHp^sR;T)RKUsjyS*mdnou0Tq zbXsKYmZEwnbgNd34HSk#N@et?e7!21iVC4pcTls0G3khR_f~^6Dkh~inWG4;h)R0f z1gcSmH6TTqW!bJF=znepH!6gUDfg;3a&gxJRQFdTgejR1N|3kOjSgvUT84o~nrk9c zuIsl~XUcn(Xf0A*cv@L=i$+L%s&Kg(v@Cm?fAz6F*%YdJwDSmXO)IiL`f2J{ zq~7X;T7pNhr7?tRtF3f&cqx7IC$#ei<=g;xb28;wRM(! zc$)cjY|(n6^!294RGknBQ+tLoA1b=&i6r3}J&ikr@3mc`X{<|`vRj3J26?HJwWpeB zlxOss8vCsJ2t0iFo}L=Rld-OyNuXRfsnj^EIS8Z@>44l=RdyRReHOp#hq{~EPJy(V zS8InTj7hgwuhS}>MH{?hd$~{Q!7_|zC>wWhsJ{bCOxW161emuO?41{5sqVpGBE&R{X3CV^6AH*wVqZG2D|*IxEXlM7z|C5KWs$5~2yP2)p zF?~YAh#A3PD4RoysW9xwG5WXUyKv7oyKNQ0RyT8}B~$$B!2iU;M<>V3M5{X|z|Z-% zlNXL-sf6fS$Rhc;@-{5Xi=-1um-ZXPEAho&SFw&Yzn9onIs3r8=+06GsCu@j?#a3H z33KxHoY@>~)oi!8$HMqVvfn67+YD?+XT~kLddEz|RlLRv`^E?NwUDN_1|4{{vv98F z&ppP-I4r)x8*XY>tnC}QVBCU0EW;z|yF!+{+mQfL;G@XC@lM3I_IjjM)q z*m|uv2+11so3**J-%@1D`+;Qrdk2Y?XqAxTIX-3C)S_&;q^DI;EwHm{z?mx0B+Hxq zs<|apW|IuU9<|1>Q`Jb+Jse!1kXCCjon_BEvlP9kK9|zAxy$!_jLL{%$VN$gEY;$6 zdm;L`#JIy-y0A}azsu&Ch^=80OVcpBLq4s+$2XiMX|WQ@(f4Jja`-=UoyA(1j3oWU zV_CT_j5$c1r))XCylba3>D4Yx%dd)8B$lqXz1EQHrPsz<^Z%<~d8@58jV;gg*Rsb{ z%&pIrH*Au7mI`=eYFdi1v%AF>$V{2kMM|31e0g7~)+J22&aHTQlzEG|EntgZYI@6B z9de^hYK)o6NA1I)#neQ`y0>}R^4fk;tcA3jhDvPUn3;;0*3twGxBtjE9UR$EX|rpn zF<#8zP6j8L662bEv_=~|Sq;V!7SO*7NyodnO*ovQ>93K5+FsYFd+o9$PSh2{x4XSs zv)GrzqMl0KzxDz&9bVTkh=MId;iZ_sN$H28Yu-3MrDCbVa5B2JJd-~qvoYgmU|q2E z##lG`cG{{+C62|)8{MbfsQkO3)hXUFZsXI8)qY!rqyH?CE4^#kn`idD%gEfS+B{cS z{)MW`+d(5($v4Nwlx_O)HN*%t1+uQRIkzS%%ozu7L<~BD?*zL8F>37lRuH#5|v@LdalgLXOpE3?m6rULE zn~l(`OWy&BI{TZ?bRNelD_5wF>5aTlgsHeDy4XlQ%qKqX0>`F*YS*)A>qUi(9r^73 zh?Fr}$0p0-CH9hz9X}|Ou)*Hf2;X&XWU}wF&Ug~<;4INqm*nZo#1@b16s+fe=$wA6 z$xm(E?5e`F>yLp&Def(QvG}K$yXOR=ortFE$uj2z%TTj zi<#l`c%LEsWL6tvdSM0FRUg$tiDY(1e zq4+U$n% z>#5j2H0yip%-DbRAI;&n+0uO9#RClxqd*NDC2-M-6$TN4DtK_BMR zHE!gnabYNf6hDqcD3RpJg(e#k6lsznM3^c&avWB(W=nxHb;{i75yMXm3VRNnX>-_0 zm!gy^RVb?I(v?P`Iwd+WW>Tb8lNO5VP^-e~+qYyJmPJ;# zBFM5T({{C*(4t6!C$wQY~it$LH^F}Y?J8)X~SW!9~EH+JAW^yo3jPSH|s zDSGK>uVb%@^_Ul;=Du7zf>j+G@c-9~n`3|En|ba@)pqS_eqDFvU5r9WZcXc#_wty{ z5$lGn7yqVvZhOrG1eq(OtJyBlc_uOrkYHy(CVX(Ceqd;jXC$E zqKiKZ=Tq(=;#w2YC&qB&?>^@o^iQwXYFlnRyjWzAKm{MvPsfsK+>EfoGQ_QvWi|4!OeDHY5KM*7^`tG(fN+S4t}{xt43R~MXePWpIkkwTu>OborEBnz+7#KJ;# z#8-uVPtO!bYYbK>&xDjT&c}|^ivW6|654xdiHtbtPY1SPR<%fTvNpd2e)N&N5v4`d6ymw>^e4{ z4eg2Qn3!s{A0MjouS0L!bJ97dn{=-=@Koc~(=NSrNzdcjAkJ;AJ!`DN$kle>dE&Zr z)Zy-X=A~;kICBh{clS}bBlR?f{~jY+Mt6kfEF3t`}>DkUP( zOV+X@7G326$`Cp;C?gT$>_P;{;Ke0$vX(;_!UZ;P(=m9{qpj@dN2l47H57ybH;w2g zDN0F3%G8rEG{_SonjLeZ6O9jp9t58vM-0N#aURqXmgMA~36Uu<3iM}Aep)PG3RMJV z2muhHz|exwG@(l<07sf2R60mPkQ*U`6GqyEiblW<97yX%96C_JCe#RL7^epqaL}Sc zbN{ZLoJkZkQP;WJfe8b3;Rv^&hbU;44H0Dk8kpdOC~R^jyJTfteJZ{ip>bao>yB@} zq6pmPwsG+s*yBP&75m^ZQ7Fq+1C>>wc9nH31eNSVcRC6V(DVUM*rqW*s?8RRVG`JM zBz8Gcg)K}{BNvs(4ZLszW|kBVk9ce#wyDa-jv)Z^{ee#AdxXI%QX)XW0(>LsTvJlO zw5Bwodp~gCN5EGH6b-}?{CdeHoK~niZEY*X$phHZv5r!mkm9FZd+Z9t5F&F+K^mIX2{d$MaSLwvyleYQ;xaB{KjbH({mc^X?a z+wgeCCyFr1h~w$3;8yHAH4`AQwnS|hzn}_T4x&yk4R4HkaUw-vtr{@fLp5jOqpH?* z6Nur{I0)9(X+CS6Gpa~dvVsC9nf z5`Fut^6U~|A^v&E=!M6-Qes@)_u9|@*@vwEM36Mt(+Ri&GW-(;1SGPB;)Ntjz=BgR z1_ZkU~9+w_ET5Dwqf=kiQaGH&Cmn>0J|G|E&-f0P&1+}a)4|DKQ~k(6%@2$IUMopyjkSAn~0o< z85Mm}okM&UKqSOJBp()1g7bon3OKs5Xn>2Nvk{^!Nc<%->@@glz)xJePTWRG83B!HV>)Wh_nEy?jd^8h;XNSgj)zR?jo-!T*Y-80rDWdQf#{M0;$=1t^d)Jz)7S+j>M)a?8w5JD2j5( zbj+ex?6CGIKc9n-f!P^(1e14+7sksAfodTZsG5zqNq`(h*r>@STA!bM0f?N&Ly!nY zU<8CDB?K%rO6Y?j*nu6WAt2L=8v7&lx+E?jyn-Wv6X>@r!@X?uMzLhOqFTt}dzR`W zigipUUQ9RD2$+28ybSV`c(fUJY`kzO3!T(Q_wmElxyij;pTN`!zywU+nTSN32tr^4 zLYOojFn~rHLQl*_!{R3HBaaH}g7~whodT~eXemtyO>d+^uvDsTB&dO`$UA69*5tOo zaZNmGNfGNOK>LrDNkM;%w0^`#qTs_A%E`jyP5%d|A`6=cNNCJ|q$tQ_#?(ARXUrwd zm_lb9OXzw|X==bS7)wCdP67ZT5>SI1l0xwuPwmtkGc-ZX;YFD%F;Y<+57RI(Iiv5h zs&ay`s<_P7q)E65&fr7<6qvrWEQnheF9QgJ0zI!{>a|IvKcZMd$*jg1gG#4^I8~BR z?JPdh%TDlA2C%HeHTcjAozVRJ$q|jo4uelOOhJ`wnO-VU-DDqRGR%>p0ve^!0d=G= zxPk+PJyhF2suZfB`+~JB!ZrIk5FmiA#8Fp_&=5UM)4a}Zw9r$-Mk+nF_FK{#L>kw4 zC$oUTJZwXl%tZ@Xz=fheXmrs*0KmA`95g8o1C*#UU{H#AHq4AY;PfR@TuV+c0HZugLhyq|6a+u;g#G%c zC#^82TZCe;fCqi1j|(&T>wzn)O#jE+$fbN%IoMcF^vo#z&TAF5(u&NuO4iUESxQCO zMkPCzRn$o>D>hY^pz~671 z)dd7p0q#>&Rs+vIpios*&7Me9GzdW(t4@#|RA?nr0E{*ad{%5VAz@HdDy`KpOQc33 z+1ndHJ?Mzg6usQcJkc{4L&Km6Au+QENK#4F1oT-EVY5{oTz(XzCQ~aaSlUWBx@3w_ zs_}w29Y7I5C|P4S4wy9Zd?aCoBqLz8tHZwuj8-iK(Jn|@m$CuY`@OMyS+a}Uej_~4 zg4?-uza`ZhA89}FqtC7aA^-IRJ*J4?X+BipdWP-?x_z&bDm2s>?jI7|CXl#RDWwOmGp z+jFJa3klvo`YqqB9;m6uLYy(n7HzG6Yph+wz?VBj*!q)_B7 z3zb@2)EnOle5z9$!2c08UDNC)A2_fkKm!Gp1hRFk6;@OfaM)o&xdSjIK9=D~vx1>y zpm((txKuwNrV+tBVi;3m47SQGBq1B<1KbJ%EuMo$0OUuj+Jf){JsyQ_Wvc1Cv^h0k zR&CB{EahfhxAf)MvV~S}R0bP(V>_rj3Us<_QemlmVU*kBKknn!Bv(Ub&6xAw$idPb z97kpL%luR-Jp0q|RW4$R>M$EP_?BC13u{IuGyNIDWH1eNm)aKYvkAXYbJ#zuy0W} zPo2y6v#YPU+yCUmSAXgxXp|<6F10gtKgXhgxstAJE~XW(X75r?ZSpv;)k2L>WzPN1 zt8GT*V`YjA;btZ0YcyTs!$z69);y4_Xo3KK_U9zH0vsq;`1$1|5b1n`0H=29YZQPp zoJMk`XdnrZ=Fu5q#an7ltJS08Qe|f@N~z89D%E$k78RPzWnL ziuKxFRm)aqry^tNmaTC~gJ5F!T*9kPzJ&F>1YFLiWO=@DkfYy*J;-W}r6rpi`6XxSsE04?W>MqEfVMb^Bvibe1J64!&J zy)J-mZ%Q)N)TJSsf>w($s5H9q0)YOjNOK-;;(lkIeQxj^0q5RpkX^vT4$YySzTunH z3xK^WSjNcZE6T1i8BWsG&RYEvW|_=VklvW zKcMF#7;!7g0~R0P%huW{9icjpSFGTTn$7bW5hi`5Z(sj)IqyZ_q$)) zpANHv{_rZ>XB0pLrL_XXCW;mvyb-Lpa~4Vd9`-}7kI=n-BcM~+8~ccdZ%B^#XPtcT z-~CJ50rOvdvkOk%`F8hM%MsDzzDg?3!Zi4)MMAbFjsD(5OztWBi?T{?>C)DufQc%V6U z;wUd_U#e|EGXjV%DdAM8TjA?hVK^nxeBdPz15HDkazgM$MMjteI{)^7X_Vp)nk!e5 zaB5W&=F9-_aK7yMGi8Gb#iD8WkPOJhIEjSJDN*F(yaIHxERm%O4;~;j*5vB@_s(M! zHvxy-nXuEF29F|V>f(9x;yf*9m4jS*&Vr!Va0kgm=acYKZNF*SJ@3?=V<@)p>(|W5 zG7Cl`X~2nekrNTl7$@OBGGCHO))_%CU4)!w94JT-gA3Y~$3dep6ov&BM0ABRz3paz zLl>a1Q4+uvVO&efxx^NBDMm%yNXNK{of`a^N1$FN4wW5dP!Xo$fYr(7BaeFpXq;eM zNcY4@H*6J~b~Wmxj1TO+6j*w(Rk>td31*hZTr?upgM(Vq*#F>|&q)}Pg%#~!M1`nT zWI%-=J+#qk@iCO2SJUMtBSlwe0Y;F4@)Sc1D&m2jc~+*RoRda18f0~mUiIUHg5tF( z1M7A4fp2XE@F`Q=qMbPk4lo(uDq9!$X+=#3NIUILciuTFZBrp|g{9r%|mdh#H!rXOxor z<4=!TdMHjzaQd64p+fc)W{#Enqz??3ifXEYCDm)YQ}(c!5JH_dm9OTKxn*blj-g4J za*S4*X}cw%Q5MYhDW|m2=Hww6Sc1bZ9RgECrmsc+P62W)Xg+A*b6pL*(rU^C*Y3_?Tj%G10c^&40s3^(B0u(%dc z*S^47bwU|<(puYbd5z&gzbtuqF$4-BO9lxQaoJ}H3+Lewog)qQ63HfWfGv}=RuK}* zg1S68<(0?GGZdNg4BX6`zdR*bFx4>E(CvnXSGq~_M-?wiS{7s!QDE1W;SmHy6dhcZ zg%dCUBnn&(Y9N-j+LyJ>l2H#!f(6(W<4p&J2VBqv^;NWeJ@(dj@!_=Hm*Jg;3ngD- zP9WU&RBLI;DS73S$K25-@xQdQw@18XAn~O$+W+Kb>=He`{!%oxwTyyF{Q)3Q#&Qw^ z5+*}k>Czn{xPbXws$%J~RaO|p1LfHbLeE1BANnw-5R#CDBk5lEAZHY7HRehw&sU@HxJM^g!%3@?6u|ZHwVp3b!8Iff-%#e zaE=x@p&gSM!Z3V+J}2s?~t|)$;bEG8=wH@m4=xCNYn2G`b zwehJ$NHJne=sLm%Rb|R=`1%YS%ymGJ)dUG$n#zA(g24veYfQNW%R<-&GCC@gT9A{L zo320xGMI!h*81Ias7J$(wd|Vk!<-~RDjjjvESya2mC_J8uAwbqo#5dJM~Ond>&$XV zZgOP-Rpqx^-Ya1kMHFU`V2KxeT=#9{rAwyOj3y0NY zPE;d%?Bh?Bv#TUIOMi-7q|0iCR*_2Ob7}wOrb&yF(oCXHuEt>;b{N1FB(bMns!RzN zEDE%P#05i+8^N0tprAq2K(UEfBQWG*I{xL7BoV;c@dTPwTx#|_wo2+6=DOQ>afo)HI~=s`dOu~s zigjSHLS!p4&je8S5hXau8Vbg^hk!~cLK}rrd8xeru;gN>-2yIf5edjy6^n zOk`uez@UK*9oAGza8s@jbmRvh&@BHa2l<%qQ;Yv(Vh!(|Bz8sl9Yxn{TFgZxH^(GG+X;uTv)r?G&iUr-pQakANCYriY*o2(i z6B(?-XaMoa7!-mvPrwXjcm%wv>{30|a-e0j&v?x=v0=XC5){EjF4!{!*rcUGNtn|@ zsYhRX`4MjVVjQ=^XU*DvG;?a*oHq$f;2Q#^l2k^caz8B{sdm{;D($N)#{j3BoY~By z6&4zVa*;X@NnHtg;7zhi=E}Gr!}fgf1cUv%VAI-hc{tWcaM728QM3yi=-7w4N=*`a zC=9$wD6V`t8}E7qBrEgQli&ZUL!8-6$~-DmAkwYwb+ft6qE-r-d;{aBT2g8@@EUy5 zM?~H+Z?y8f^TPHSR#G8Np90NwvGHsIfU{2FV$^fqB0iEpvqclr!|<3FD&}Ki8>~6X z7NaA*)lh`uhCUPb%^E4cL|)q5CEg9Y1Mz8K0~^bXc*?|BCYlHk>?E;f4Vp-+DBMMol$i%8(&>y`!b0g8%o3(pvj zhlU{wr3~0meIQOAz#0Dq$cWsnezYR6L$=On@Il#3iRJmEtRa)N~0NJ?I;u*p%#1b7#AK|*CA60`N_|PQro%R?*-pY zEP@)YVFp?n=CqYaZO(4l0y2%@fsqr_HCzCGS2_8I>Tr#`sES{l#3SS&hmDpXRSmZN zUn;TK+aw$nGSv}^(R5%?$zloUKe9(hwW*HFL!DwVwMh$IVreMD z=@_2xp-A#!pxx!&%)sF{<<=awK^xFS2%?_;1kXK*9_sjz!{J%}sgn8yVjy$EEy;;nL)N;ND*I8;8x$wVmOgpRY_XX!~sRd z!Oskq;l0}>dB-vaqI9Ja`Y}%wl!mrBMv=Xe3#>sAh@3De0|U;%9$0{U?A+rli35yT z#u0!|g;kF94hdipF@Tjgs*5*5#W8A$kl-Mr*@@N-lT%^=R7Pd)ts*Pl$xLBa1bW#+ zvCIl!K*}NHBPnDW;+6-hoPiZ2R{ernA{viOk?x5P1Qs20-O zA8kb9kI)_^_yP=p(yWD8+9e%00w%V!VB&=ZVqjjVt=8M%hK|$~1&vBmZYF1T=2Si< z1fc(8?h&P;2-&k}!MC&z-<72{1xKcxl_j~{Fw7$N=ch5oms< z2KwbDa?%q=8iIqC<7CR<3^nH{j6l>~#M#+^s-*_m?MwX~)OA`X|6mCxNTCZc3=%YF z>&T$yy(1`sr@=f4PL!VEn5T_m8yo%6ik@f%oj_NqOq8YOTFsWG+2?(FltY@-$|e74 z;}vKVG^qKB-}xn|luqe^z6CQ%sXQ`bgw~X5{F)@#j%Ar+Eluc5mWx0lA$S@k)qQBK zq>Lms5cU)ZuJxc_`lhMH#Ao71engy~`e{#Do&>%LTL8)muqJ@172j#jPh?sLHs6)< z2%F)h_)%$;UaFNwD)>R6!9>#vwkhU~%~4eW4xlFd1i%E`>5P;?VuI=?np2BnABhr$ zWf~6sWoE&}+h3aKP!gW??Wl4kSZLKrSIQ@CInt)-qE0a6&NKo^X{rEu4f+WYwPLCh zKr0|#YJG2B3OzFI6%);|iwS4dbPG2VODq&Y?={kduiUY?qg2-^sw1a<$0lc=CS z%1RW@TbOxh13<~1;)n;L5Qew#jzsmTRALHfXfbHEH_1Lf1aSU+8{^XrW16n5K*nA zdTo?yjZh$jx0c_N4kb`>MvB6UEUGI%S|)rgL_E3%0_ceT$?SNj0HVw*G9ujaY+|qW z)KRwMiIA;=tq_DI)C3*{uT5T1s;IV%%E6+R!>Z=pCF=$@s#rqnv(EpH2?n0-m><|u zs5t52B>9mMn+8NuuPO) z+6O$&g(to){Kl^*60X?1t}V$bCvoB)4sPrgE}p4|3qUTPJP83@mY625_3;#>jph8{ zCu;`B_0}6q4QLQ?O$2lAKNe5n`A;Q+-s{%v^6o|a9$fbUPXM;={Zd~>^5_d0Mpr@G zenB41bqC%u?`g^%vhb(%LNC;6U?b3?vq~-fXe3M)u@PgFPZa;d^wtTG{$~&!LE2uh zPCRkGA3T*!pT>qx&B3yE3iL_eAV)>JxtT39A(vAA>&?gtQI9DoA3rbV3vHaJ65RW8mj|yE`0{r9qT8u zN-rrdq!G`-4?pY@Q&ArM-7HH}yZszoCSkYr>Jms^I4=KC6If)K!2k>pPpL5gfzY7S zWU?EN@ms>FCFu<`F36^NfAYh}R|wKi`Pk=pSaigLp) zf)o%WK|ZPwmvhXBvp6&L(2yc2Vzo~ACr{uyaO$XTW$i{oKWz>*q(yHo z-s#q(+7Pogw<2WpLzW_D`yB&@uCK#KuH}x`W-&uIgRCpRlHV9_; zPFVH@JcY4PCVrcR{kZ1@L5YCZ?|(y3KJVKD>cDX3)bHA$i7R7th<2|IXKTOids;Ah zqYp60G>)_Lfv>i3V?pAUrUp258!|XsDQOTl`AAgxWP3A}n^ehRIT*^FmY<`+6*`3e z(3wL94YJp zJaO4@NrDc^I=#DNUtdQJdAZfiy` zTd{i7Koj)b#ljf}&2#g{-A6qzxse;AVsnHmUwtO4DnEO*TRW9|Jjh!&wigkwBMVS~ zbf+2ofTn!4w!Euv%56?@%=`NHLMd)m@#)4()BHINYHer>?Rxqm8y+hiPw!)Ad~vAU zb7OR}L%Fj)`m{&AbxVCGjQkwRB6fhUr(0{hjPJ~YxVu~H#$GInhkef1JBrsll?mwg z-n{w^i-sGul=Y0=b?)zT zKFy0e&bz#pR;=20z2mnyl~VukZec3fn>{n`TbQTMLznWhH}@ScA2>I9(KqVf3%->T z{*;+~e~p5=jXuodyyfqH+kd^}1JP%*eAajGB&~hpQ}N`3e%H`GhPT|MA^7P-YO+I8 z@>Mlgq=EAJeE{7el9n!_Uwk!5hxaaCAO|S!lfOt~brgGqE$7>h`W>1qxUxenTs^(B zHzdbvv((1t^#eqjG@}R>G$g^kAhZ=~kFiKJ6#25vSRZNEQSW~AO zscK~Ua8o0#8>>#8+Nl5JK#~n{#ste1YFV{wJBHH0Hs(y3aN+(4^D<1(ymVs{0a<4Q z7{LcI6gI3>DoCV@uQsmOIP2D@jyX=IYVavoz90o|mZ+8KWze2Umo|MGbx9(tSEv4K z&{u36pD`o0cspvys!=aPwa78_M&MrwN8IEZqCkeOHG4&i9C~!=(FIqpesFL>>(-~k zT`g7`3a6;uQL{Y;QU3@Xa!^U&$ zy_a?qF2UL|rhAhkc5%RCY{_2NAqSJYed~dW05lT9#fLQ zgp%X0moTI3?a4CDJQJ=RG0?Ikq>NLLLHw|!txB^Jx^qa3B3zECJV`5NK={y1&CNj# z)v!Rb46O4!hnkD>D>>n$%gZboQm)8~R5Y!aPCWG#D+*APE{xl* zQyev^I;~A_Q5|W7HB~N0s+7n#9d#B;@W!oG+wjbbmtGHZJJPIm-J|tUZ^@k0K_NdK z&QW4V%Xa_Xdev2!%7cr;_0_F(<=4JrU&RcjAaL3f(@Qhel--7>^{rrJHM_W7aC4>f zBVXD3FgI3Rwidx^d0TNzm0z|@%97JWPi2`;9C|ZZJ3iV^5Iz2MWFI>`IoC&b_EyiP zU#t;U8)trU5w&{8P}l_Q}%jM z#UZzO!MYE3)L6=&7M5hJ@s+&6zbP!)?8=s;GR2JDt(xh9M<1BPiXRshN3D5$oNwH< zR<{4Z9SbgYYbR^YGDh*d$BpbHORqds>yNCk?9gHCjN^@wCmwmspO)A2l_O^sXI;ni z*VGxq-tS(n6A!?S^)Let$b981k#j1>FbHw1cvj2Qj}B-sVsTDty;7fi-sZbvNzX-V z>XzaJml(tiZd8z3-Sc`UF?=y^ey%G|YW9#Oq}>o?nuA}`3J5X8dFXSo9+9SoYvEz3HfS{x?X8P0+>qzkRz@f>&vdy%(aoGl zA2!m4b0oZ03A6X7rCbYgR5Y2y;)KD4?TmiVdsqj-2pt_3GFlSyVtBacD$=oRBzXUn zBAZ$lNE7~0f!iCL+LCyh-GoncGsNKX%7(`DQLKaSdx^%twnGd4On#0WWZpIw#Ydix zXc5y};Oa<6InL~o6S_$C?pH+IU9on6G*_ZRcgyk!QhdU5Q9~feG+Y8sNLdU0Z~tpmr!md&w_vq~lU7@wqu%0W6qZ z1Yk-~al;gI($0$9D5HBp)X0a@g(H<{DJ5qjZE~uAXr<>-wFtMimgtBvWvtgM*q)-oGP1D) z(?rRYIzpOpdIkNXM_4)6C}vYkMzyEmTy;i=UMYjH(=36eq)xv{mS728DNaWS)8B!z zu(R^nVL@w0l0MOeof}?R$m*Sg+4O#NLu~gp`7hso5u0slpi*he&4Kpov+EMBc*l#e z<^qwa$BW>k$OxqM8f?2ejc3DV+gSKs_M`s`ujT$pKKgc(pNfK~(?0)FTJjz(EJo_+ zY2!E8)P6Hm0vjw{S4Ud`GE=t-R-m-v>QS0OOsmi()G0|T-pO|Oyp)|*@eCM2^-gSA zs|{9&O@~$wqYk#`q-q^UYuqJb)@?zaC_$J$8N=37lW!*8eObm^UGTf z57c6Q6DK<?!fwu%s}IiVd);@*dC-Q& zY!5qP;3OMIZmI=a)MgrEKBJkz6b5p9rmQl6lN&A8e^9n0*rVwi`@yCLEfphyH-7{NSqvpfHop$u`txhjRzN|Cm&68sw1)vnLl6bt`)i@?xGe+P1_@Bauuu5#Fp_vn1p}nu@Q2H)(D4Wl;mFPmC#?O5j`)}`@yH`w zE{p;H%kTPXiTKd0#t;sXFVBW76#bC%Qqa2u%kSpNf#PkgZqRs4uA@HZ5m68n^-UGm z&lB^=|G*8xR#B+@OPs)~igYmSv@QM4s&xNCjTU*vtg_JKMvD%k(a+8>7aQ>cSI_j! zZrs9A9l3Gy=2 z`JRv!#Z2%fPA{tu1hdVRSS;YyQ5}_158JOA#g6_|(%lF##0+pP5tABwFEh@&?VAybpcI!sH9umt~+Ad?FGpwsaD>p5Ky`A%?o;IbQgr8*Zg zHW3goMKdC$Eh0uQh`f{Fh)qv+QT04?-KyrObn)bdQ3&bo?a&7e%@66G6MCS~>$DLk zt1LV9an|Zmc4}$oCR0EQY=Zy#vNM;_s4$Q`FVGSztN~%L^a5!a&GQW35ix_2N1-Y} zv5+QX!sb-;%v97tlduS95Y<@p1b@>rPtGN$v+TkStQ4^8dJG!ta-TGCDh2A|D$}XD zh54v-s9JJB6>ZT#%Rq&0GnGc867moqudQY?^+JTK_OlV^ll}VB8S}A_oQW%yXD3DM zMdPX!MN?5FlRvjnNS%&IZ4OTeVp7$xJ5Mb^E!EWe4#qwZO3PCY6$njxk32{9EgMx7 zy_8$@l(G=f0xJ?Ofon>i$q|827v<|87j;p~@lreRz>ZYw3QZw_^idgfZc6pZCKM^P z?QMp$VH&kR1#^P*fYzq15i z&5!(u^6ct3yNe_l)jn|({R=dWGUMtjG??h6I)FDbXB%h_(TLlKaw3ImT^)P5KGh1R?xjjHe^h8*oMt$OSV#f6E;cOb319c}<|tKe-$>r2^>hUpuvL(6A~Q8aG0fr0zoO9=+iXB>V1yq_XMN0IFwk=VEVKp+``O;`cv?lGcWlPm9 z)RjqDn)PcmYGA^MYx2Zt)$mrZPH&bh%aknEu0@49eR}w6S;|?#1`djG^I)lVxzZ)< zQDkDb6)9(&%Q|jK)wdM0!ZxS3N2w zB9O>=<5x5EwJ7G8!pW7|g~hd|Qf4m-m?fGgWrQ7<$SFo)W0jGnRb=4psT5;HHZ@tG zsD+4Sl%ZkyU?Ge)Drb%&qBmBF?JZ*Ie{@DTmyK!F*UYD6ifQPh2l@zGc?EU{W09Hm z7}K1lG5_c%l7~jg(Pdb@_uH(1I=7^dtV*X`pN~^8vRVkAuf{B->veo45Vr|OB zUvR_$NG*tej!I*ksD0aNskr(oXlXKX_Lr3n9;V@VkTvxfhtUn%B%DJw%A;d!N(y9* z&w}dZQXQlyu)PXR3vQ@(Dtn(@m45_hz$q76a9* zw;E!HYp+y7CLz5-Hk@dP}V27`6`Shy$o@Y_P9o!1F#2&Y~Y}<7A8==KG z=Kl-p+IZjlE_dl-2pw}1bEn+OQy{P6F&+fXalc9(r zrOyw{v9vkIwG-(&?hT;Gs1{Fb(zR8-rt)mZK5W;|-3r};l6N~Vuvy0ssrVz;JG{7? z-)uekrS=T8vv6~fZ+OBYy9I7{RzVNiXp}LdnJ;_%gAL+X*DkZ|20!%^kL*6jHR{!m ze#Xj8_dwXOW({Tz5o}%F2v#tVY+`!U+1r?KW2&;zkWZabmiNpP9?@Ydbt!Ze$^S4T zye9qXcSuB;qV8uwB*u(*;|t=r1coyhxlm^=^4Y0?CNa-VFMF`N8P)6rp_94oZ&Ea$ z3h9=%IT49^7(^NmbG95?smh5^`kwa&=tKVb%z1y5p3>yQF!f*#b#v1r>Y^AcGeS{> z81$!!<6yYrCAr?^$xt8q6W4ZCLl~y9PH%HwDz!K*Fa>f`H@ z^&;@`X+7)7kdD;mD6oMrcw4;X#?ptTUM6mr@$yjDhAB?q5wK6>fu=8KDF4c9Nz;{7 zlqD)PNvQ-v1XFS9ColOE6giENY4hZqJZ~ef$c2)F7mDabAqqKuWptPNoMa36wzC(m zZh@TYlK-%GvCQ4`M)9fTB|%w7jj5BC7W5+z=NG6%BI~D9vSgtgCnKNQv6IrVVMqZN zQ0am0kQm^ifi6YWgqM@9YCUc`>5`{$=y1-u&ZN$@nP}`(>-2Orv!O9n zn}pTxn25f})|Et39b_(>sygPm38Q697-LOIusbPnOAH$-0wsE-5C3+CN_g?=633{_ zj#<`eU3F`k7Wmo5QgO1Oog#b6Dyr2I5MZg*Bs?7pFiL)wr_k+CBa3>pt;N%g_ERL) zc;&9Vu&%gVqUuO_(%iKLma}wyCvdshy_TNSn+im4(Im88=|(nn$sFrDt)`#q^s9jf ztet*y2+)5X>@Nikq8Dl7S&nH%hls7&TD)7|1wRnKk%CZxtm|86vUa>djcc9?0Zf?~ z!^3fMZ~#9yE8ipok+~!E zZ<}jNWSffhymDmo=Qyn5$Iht3rSayTM+eBfUNgd(N-k6db7i#N_Q+8Ft#(A9iml14MZ^z}5xdQSB_M;frnHsRxR zPUOghSl-yRA}&ukly?7Mcrsy4nV1ub=d{^zZZ^}NRt zW|%|ByJwY^>|o`QNvo)BfeT!$P#U`sFT{=98cO z$d9{T0m&cfi2EzrV;WV*UthfdSXI|Yev$)cKg4tt^;I{OLRD8RoyT(zl`CFXcn)G{ zRA+k@m0nRLYyFjU{H98dc5h9`e@^Cs-PCy67j;?GfR}Q2m$y2}mvKJ?F&qd@o7Pq@ z$4-#takfKxELb!6L4X@(eZJ;b%_nJqwRp_8e;_z9e8q(O=WuwXOI3w00SJITl~0>- zZ5SmoTgY5CsA@*Gb0PL@KbU$fC?$slUA)0@eRYMcaeiK9dm>j-prco+hk~)iPqwB$ zaQKISScN&*Y&n=%?^aI1v}$rVgDq!OhX3Xr<5Vaz*FPTvM!(m8+E;_N#xpOZhpX2m zuqS?@qdg6leGL_ea)>ECcQ??-OZ!w<8b&djH%xHVA8ECAAckmD2X{}$i>?zromhWJ zD1)igE!5O6+V)dAhEI10huXz`2=y-nGKmr_SJ1{^^0BtRqDzcn^DC4pAPa9?7F z0p&Dlr;fN$Ix8h1(>Hya7>^Vwh)ZV@RtHhqwPC(vg!-t7nwLa9WJJ67R%tjY!&gl# z$Ac3_j4D)rIA($@GIHGY5^=L`0sr`HOP6<|hFNnq)1Z8wh`6<5c^V(p|) zQfO~D6_;?Cj_!0kdPZhWr$)qQk$QQAW{FKl=R&4MiZs(g_xE^OxqbNRxBWC@$(UNMeMNwqu0MiH#|TCnfcjpGa~3W=)<# zf0)=_d6{ssS)4gJRlmhOy8p-?;G}Y|XnA#ZQ8Cw#>`5HLSvb{0jSksG-??!oxsw!z zoD&IoCYX#I7=4~teVciAV;POh207ezd$)C3P3N6|c7egEb8T5vkVHHZ)PU+2g&2kb zj8%?)No^BZZBY}T0m?!k_nK;XRh4;#wb_|7$(e=cC$t$&=69jHWlm(6qmV>XA2v1} z$TAe^T0j<>Gdh1F%4kxlp~W~_^fhymhjQu1Py*VDtC%kah=ElXnCrKLvzSQm7G35x zKI9afKx!)8*^}dijdxj~nP_rVNt8(UmuH8WRQVU5m{r#~jA81G6{#YUWQJ_YqEuRh zzloC>`JlBzL4r4^ivKEH^#nd$DxEBPm$;Ulg~XvtYMnb$hsVejM+%P*=AW7rs*=Zt zD=M3T>XH1Vb*?y?W*JWWcxOjxd4;;Cb@`UWmT7M2bH-VQI7dbX>ZO93jiy+i8yKQ? z*bB;fcAV;|KUb(gazlO4@5}v*kTMxonZH0u!vO6sf%1#afw!=ZdY$xcUiDy zp%{vTE!m+7Dl|)GrTs@xz-f!h2%<{5jF0w8*y(?_2T_!&GR;_UE_kL2rkrfpWB53L z?dpA>S$p70E5HJJuvuAzr%a`kqMJH}a7LbIh>2UYti8a5s~3!ON`LzYk;&*v;smf; zq@So*q>UM(cK?H4rbCveS%@b?c*N+BviK^eNnK%sU<@0UKZ!vgYqKgiu*e#$PI#5Y z=&aQlOEgAWdWeqD7n07XfqQ|aaz&{++JZ&5v4xn6#kXr;IkpEHIU^P(Q%P~6G@zi0 zRoPmQFcOMSI<)}XN_-WOV_8Qi$h3P)xb>-}2N-cc$YIVYt5oGKTHBczE1$y?vALR~ z^TY ziBjgf)dfpQgO9X!z{S?S!UVNos&{P3jANU8ka~k}Qnw(Pomgh68jQgk9JzU`uP}+U zD8r5A8g=0Ld!1v9!K;S#Wv*!TqdY2&Xj8lBD{S_9er>ot{A*|1DZlLJhk={0b@WR zZ~qEF2M55c%bH3ow+J^Q@abQ!>Q|ealT;|a4BT!Rdc%f?T?}-`Hhfv82Zo5c!Js+A zRR62GqFRL-9Ao9^CZ?;ecO)}CsyERGk_hz1+-h|O9K*@eu&u~13+H|kdwjRbyU#m~ z412tsyG=YOumD`I=PE=>!%Abkl~&AP05r9=gST*c7wyQWu!%Pq>3!q-sITjz`=e{9 zs=|cIGzs*+WB4698a_dZ&28tJ#$3SRD}2SQcef%xJz8k->VjrnwLkp zsC^^AE;x-&iNFx7ytAZ{7JEpGjL5hfYbv@gp_!~92>LE8E6Jcr&9&XLi@Q-gnU$NztZu{JdMclr=T3l#?ttq z{u$O$+af4qtz^v_;i$M-Jiz6=wTneAj_uAky=FUQ!`mdyT>Qm2i_XRhWgQ&VQwYuK zta5fN%tritu#3zzD%=n{yY5KFHeFAxUBSfZd$ttO^-P31Th9dNkwe{j(f@jh64|n# z-PcdWMJ}t!zPyjG%gJqvO~(gc>dV<}TzfY<&pDKm``e;KsonKhrT-knKzT5@Y~Cmh zt=2nxj4Y3o_ot&QyDZ1ms6Eqj!@z`Ti0hJn4VQoq*JKEMVIo|&Jn>!w+jv9?fncAm!Hd!^h=IP+H&7D~bgKTb)f&c9_YbxF-&dY_q z&|h@eKncHw9I0*?-bw(PVU$+>)WSii$Jm5^e;O>*jcQZ}P2X!Bdc~lmQb?v7}RzoZI zc{4cdWp}u5xrOHjrNax^mJW&Dj8Z>5q)(|;tnTFKE=~-tT+0sR{4BV&c38V?n_jE7 z%1M6wuHJh7yQ<7SI7&nlA9Qil)}N-xVVkvYra?Xaw1U~~JO6%AL(a44I9kR>k1cIv zy2)|4o^M&Fc*wfD*GB%1wEXn8j`n@q-jGh(1Xa=t*0rE!){?HwR?WJ?{g@dT z^{=XEt`6bwxc5Wdj#~KQG#lFAU2|eP=f>yLmMnY@{&9H5rCmQDhiph;dnO)!R5rh; z^Ui6HFU(=-w+KFyo1I=)W~vdlU#6VjZ(p1jkMAMP=Rcl;Uk@%!NsD>*b&G`Um2Z2{ zxz;75aHPH(N-pT%xUJ`@f@oi)fak%zcKHhku@-)aAODV80?Fy&?9u6$)O|nSd*RSp z|LKPR*UoO8_6v%6nDY;1Md16QDM#V-z8D(t0xtj%mIMwYSkT}>f}jMxVAycQLTAnl zDuk#Z;XqIsBU*|`QJ^=C9#@Pc`4Az(j2KTIEa|c0sE!&{LQMH`F*f^`ld$R>R_4dK4(pv1!Me%&IeN z!-REqGF&7@!`-`cHNJpIQ|-)>aT(HN!FQovFo|#4b!d=r-=0t{P9=#EuS=MX)$*)4 zk?G2yK6egFT9)eHp?}>{JbgAY#!Xk-n{bL0iDKgOtCbVTOf^Quoj9BS*| zNj{|pf+CT&D!OzUHZ@9V)Tc|J&-Qy@c?Ubu1 z3Hc6K?=pwVTMfna)SK@^@VJBUL-D$!FU9RN90Bvci&Qrtp&h1R6q;PXhi_4~akhME~L-Iae~^3rG=lpr8>JwFFTlmV$r z8sutBW_Ps^$h9Us6HV0?AwUUiv8_T0(AsDt3nUDR`1ZY@z_ihX^N*bESI;Im(WanM+d zF`gkpi!$H<&zA@!$ks(K*iCBzbieVH+S#OvYDr*Yu(?TI0pzc#ozqfKK`M6@i_Ef| z3=ZaMuT6IZg2ugrfsSpsz>Eln`2U8N1+w)A;v_PD2tyz`u7=}|G7eG!V6?a3 z;^QA+u==JV3_ckmL<}%!2p_Jq!N?>!Zkg{N29n!uI8^YHRdCV0LLeBPumJLf)~2`c zO}%a72nJU2g5tE8{*hWHC9GLyI}ZelXUJ01b=V(QPc}iCjY2y0%}g`8^xK~bN}+~3 zWTEM&tENEeCfFc|gDse7UZ5!UhI|aNS-$sp6hvUc1xc*mJ6x>qIO*VlIxk;`0t8wk zEjFC@pm~??b)z5-*oGQv=oK(qi|P_!_mj4-P70rWcalox`r8KN*LRBjX#1m3>KpEIUAOWbJ-J4s6Kw!Kk!?zP{>z#KqPPnWuq|FryrUCh||+y_!5DqcS-;ct2{^)thUeZkxz|Ipr<70b~YmrfdY^N0`v+PKZ?F_ z3&ike9QgLjuq0q5=Ig<~w#i7{p=NXdVqkz=XCTo0hmb>&(jFs}O>t_4I5)~^PaZM~ zj6B1n=Zxq5+@=W|j_;wvB&PWaX3u#Nv3s>NU_m|L194?-lkhCx^VWGr;sva$>?9OJ z-?&0v7;&Ryr6&Q$0)ji{=bOrGU`8|u({aW$buXnLmMr+!tH5-FEA3rOe)7lP1x6&e z>*?+oBGfzKtN&?dl&U{-@V@tPjumvH-#wGKP*0|HZ=n34{Qg$~g06&;Uxi}%SnIv2 zF<=Qkh@~W|poJT_LAPvZWfcAfRz8u|d&F2mV=;)*oHP?zH)UNOyE33<>dLR-Jd1$_ zYg|1#7KAO~?skFtobQeVyFt1O!^*&^LOpeDe-f7{8_+H;aG?tpbFU7jpu?~h!BF*7 zV!HxJR{Hg~lav#!CgG_HjOxH}aX@GJ3PlF2s#2?;lCC{(ixk+MO%UPNT?UrVVO#Dv^|}zBX4S zJr*w0(QI2LH>PE|>4pvUZZ|9ykpZDusR#k6tN{k9Tzp{*m;T$!w7N+gp^?15Y_nA=2cJCQd-IOQ>Dil#&L3+ z7o#CB_qEsXa+rT{gj*fyFuw@5THx_Hu`Nm^J&d`e8#-bANV-DO)ZhlMuCyGf z9jK#cM*|qoUnahrhA$jE5LZ}3(l%6qV4T`+zQBDUr!;rhT-#OWQ>PL|fJs5lQtXs9 zR3;oUBW#Pq==!j#$*1aZZ93lac9j)GSE;%GWz|a_`B)OK>_ZAm@;ilYz?beNx$38m z!W-U)qRyeQOkC>C8V=`k6(d32gb1BA1K!bPPlvm-t zhGRGoG&a>Ry#dGqJv_OAph1FIg%a?9&*7mGx)voIK)X{PHmfbQVD5I_O*I}pn< zP_Z1d%Ow7Sxg$(1=wm#)^R!9hw!SMxrZO@uv$<@1$Elh`N(99Ms7Ebhn|7Q>dW1d6 zaHL%$y)p4ZQdpq2P^MaRI!4h&vjMw@8phj^7h#M@iS$K>Op7@TsQ(BM2tODIPY{Sz z_#qXz00%GtD*%*_6FEzRvYG2Pfe3;m*cL131s6dupu0bW&_PYuKf`IfZ)`_LWXVlq zHXD4CHIW_{ESG!X6QW#7$s$UJWXLdUELmJGoVv5g8%S6z$Ou#j6;mKd!>A*JHE-Lv znR7Cl1SYmYu(R9^llm9la|;hCi0r8pAs|VCSiRNj$N=NA<};jw$^^g^Gr<(I9W+N) z0AE0$zXCow2*8dZK6D~AH0%O^BFnUr%rgK>klRLbLl-MFf)c=j0Pq460Zk$LOd7HT z(tM$VxPcomrCvJC&#WPhV?I11i!HRZ9D5|Cb43i|BTEP@tdu|*p(g**t2ImHuL284 zX;aA%voNZ<8dR)+I`TLMluNnZ#2=%wD5H`srIal#G9v;VsgmLV&dh^Gb3B6- z4nWdPR{S?W8@5>!&WLLj6|x@*yAox1-K9F=4fry@(sDAUm7 zOezk|KV!23_2V*+QBf)&p3U+P?>PW0Fq^cDy`Tiq_{l%@!!Oz*E(SBqp6p9tN~SQg zGBJ}!n6pmUT(bhrA04VvEBz`hozfi@)yPWHq!iNbY}L+00Se^_u_)8+GaXrsF4HN< z2>rk|l{hv%ww^;83!_Yxq*HHety04k7Eo4Pi6Rw!HiOVh75zS{p&HpECSE$!NJFx; zL;O`m0C+_M%d#jS!xK}569H|{Cq17j?biSV z#yL_OS49Xi@W<++O2F7v(WpQuXjmwCo$csVgb=};V$T1)^9{?y*eFb+T{JvpwGmAL z%@^t#KX3#;@Pv&d2uCoH2l!Ip%G5>NQFy8X6bM-L$jO@&fDv0TcEQFhTUT|h%$uCA zu8IOXNFD&NN3%J~^Ra<}5!t6bH5Y=~kD=N!dQGMDS1MfzCYmx>Eu)S=I=Yg;qH8XP zZCI`3IbcP>UL8TsBF76MPbyPLWOB~9bxy=_n2-S#J>1EHI6p>M31bk1!3_dq7#oWl zyJ8&(dgPW9P|JT+6{2k#Vn|SN4Z!)jPp1hW)H0yKOf61QgQ2RTC1}SZ!yiyJO?ufF zf;oVGRKbc61Ag7wpcMcGZPk`Jf%uBUi1Cpb5flG~eXfOFAOW#A$7oxMHP*&k%eA~% zV%w)gh{}#_Gti<}dH|6m#464bgiW!L)!JE*)=z1_uZgWUfcHm>8eDC#-8MiJ2|6-lufVbm(7#F0J|DBxvjb#57Q4-mq*>zq8-IG)K>49u^nRjkCjsTQ?(Os0;0M-O1 zDz#nP&A882L5Vn1&C5c{W|k=q!`_U=fmB5fq`VkO3GvK@)W>KCo`N;npv6Ez(qN zqJXWN6Y$|jk>oN613vg)iQ?Mau5MQjz25Dv?zTRo=1rBN=LZHbwd7ow(MDJn<3OEi zsrDdvoF|vP6s%>pJC;j(>CrHd1xzF+Rk|(NHs-lGyM)TzcYI1 zDZ@0SE*irtp%%CZ$}Xlp4Q1X=&DRMcr{Y?PE2XQ4$I$K2`%HKm-Kp zK>|nuG5|3E;B)(9l<=LSm&3ab=4fkH60#0$rBX@Z?jjomk5d;u?G~!C%K{5Xf(E>f z>3|SX4Z!-zS*Q@_Bmwk6cd^|`bUs4#G%XgzGgL^|>@z0gMsJf?e?PmmbU9eu+P!o( zE`Y@DqNtj!)0|HJ{+vnsf-6{ZDWg`l*#kic<}rwxM=>5*%ix|(D&|9D)%x;pJ9o{c zB#e@yeWf3dG0Fcn31GqrYy*I2)SHRIHtcf$T%8>;>*i_sTkhrpUK)F(qP{6>hYdA7 zF=|U=_=fNHE#`!GX<|)eBI|f4%W}{T_pP2_pbz@d{xU$h@E#2DCnqQgc!o=QA7{+y z_S5uN%K;RK7n_DODpTnX)kiSrVFERCR;gJvmp`!|ZD$AKusHxU{FqhE=R7CT@5KrS zqBHRRGu{-C#-5VLX89`)I!6;XnFmpBXUm;e_)9CKy^7%^kKd?`_;OolLH>g37tr_YK7h8AF%!(bwj#FjE;iu4Rnr6DU)eQJ~y)~p$| zVnrJDD_D_w^e|!a)eG9RVJ(sAAyiV;r&@uceGq_Sm5&k;kT6K#S&=Rr*GO!z=CB$y zKjHs|mE@S~;~kQ-;*l5ui>Az2!nA3F!oY#QCk~JyU;u@}DOU&@#DQaE7%p7=79pbH zV2|9og@!FNwaga;Bee8vt+FP{pe=9e+~k~Q&Y#E)PT#baqjjT7O^maO%@qqlMw>|0CG8oTW$hIRuO^& zR+I-ZLqsr!IQxb|Tdp|y5}6$wT3(-#uGp&N`)p$8U)e=y{LZ6+xf z)k!?^1O<>YAy?Bu*-=O2j_yrI-GV^%XV4CB5j7Wj=}9$M1znkU2A553l~H-`iOK&W zLw0cV1e$50DbigB1@Mf0GR`QVcy#$EWnbu#AXyhhTC&mR~pvcgQH>TF&PZUXc5usjHBph)!f#PFvE{%EQPPE#z z+^pxN*W{RwVM(KwSbF&-WW!<~-h-By=D{v@d21Jz ziaF>jRYKrZsDVXs_n(!_>e-QB`mq!#ZYL)31z=fpdVy?KpeE8344KN7z^7`Ihm)u_ z#GH^zvb2&*LpCgNbq_-!-H@b^VynhNy4aL^yf&*Iu_c?l?8tMb%+eADwF&>$4Kcf{ zU!K=B0Ob%JeQVbQnJwXhWZ^DA;2lLHcF>0>D6L7htb{AD5mQP{v;h-M2^1O|GSndo z7g%wD3VTYbBH3XOQ0me#5@oZf&1I|-P)3eSlXAC8N1dxML8tL^GEp#w2Q-XT1L2S8 z*A%&UWSerk1}ob*uw21s-pVl7C-4%N1$G!%deD5Pw``1Cpb+M!dU^u`qid+OtREQR zWGphEaO^CtrchoC`c{G}Amk+|n;?`hoXZK>0Atz~btwSW`B`#BYbGtS2v`t99I?X; zZ!EEnwaOZ+drgS{Hv{D>9Y-R`Hd=Y>CvWwhoU1SIwEXkO&%Q)n-Tkeo3(j{heQ-j?D8MCJeuI(udI3R4wwgIwrrXZjSRq=3@Av&lnSnom6 z?WFg%l;90JJc^F3?&d-y=?H%ZDa#g?phE}{u5}~(hWiSoEciLjaq6<6wrs~gwA=`3 zG|Ng66hVQ^h(%R4fWZ|5=c4k_#xPq$g1C?-fZ(WLfeLIL1Bs?M(xppkQF#&uGiU*O zxu%XDlw(xff}ufK1t!bYOUiX^G5lV7fes4<@8>}RJhYI=?$kp!e3As8$=*> zNwb?BVrTtGAJ7)Bd>0hs)*{+l2AQ!AVAG=|Qg9tyCNr4AZJS7po1o!}$GF3lkR@uS zEfVS`0Iq2$E;9VjsASR6cSVjcXD>Bc^mYtk!y7S<$CTaNH6i>mR3UxS7@He_ZD3MhaP zFpJhenxWM-kZ^KWeOA*gi*!90b7-s71<|l|J!wU*gyVGI5o$=K63In|+q5Fk*wNT{ z*-%^Ry1o*J<X`#i*J;(AHu{CD#w;BH_k_nKzSwM&{y0>)93N~wp;7K1}0SX$i zJlSWYo+TZKacelj!J~@vsI@|ZTRxUn)F1LocnthwmV~)Nn&Tk^R&x+!vuFcdAPuIL zEXdTLNTqsgki6nJp%YY1B-}lDpkw?nnu?R#uzGA_6RmCVahlvVzj?XSeP%XJ8!WL# zvw|JWSpH39wykCpcxHDHDQ9SkyhEdd(kz#wd{WL5;M`gX#x1p{jtN>6-FwblkQcNtCv7mSQ$QG)+&*2V|b9VHD z#WNnuRmJ%P407{a4Jf%5U3cxoRQdm)OJ>1lOfZ_6dX^_J1k2t^lgsQv`i~i84_4JQ zg`$>fZS@lCj>?jm<0Ry={%L-Q0r0qTFMK#AtaRT|bHrKmlhj_}rPLw=8RU3JghZRz zJd6zP!K0*C^uyn30`QnP~qJ5PH?$Frim2w5e1r)(0P{PXWam3S2 z*<(yW6{HdAaN&>*8>pPf6&=A3Y|t|`8y%k1iSfbf0iWpU93k;pkc8LYInr~qV0QR| zA=&~WZd{tE-}*J;;vwOeIhq9NA69Ll=5ZcJdEVFkL=@nVn{bh~*q0MZp}JMbZH3Y9 zzzCuoRHWs=lrX?&_yD0G47C(t%@mFBy-TTtMF+K6YZzNemE8zh9|SO9fHceD&BV&t zARoq1_dVBz8KU&9o@cdUmqA7;l9F4go6wP%SLS=V z5km?ZGlmyL23}4zLimBtMTX^xnbZamL2sZBTF#z17MacwrCWX(ClL@hwj^C*Q_ED* zyucpJ;0!|;Lo-;}FUe%-pjKd3MXw3SPy)!Fd;t;YWrjrHEnef%Y{>$=k%jD{QjT4w zQP^0OmP}fr7}Eb@wb2x(`-IM4eX+R_NRaTCxG^+ zTnH#;xd?vNC&^4Enfw&eXu?QT3Q%&L6|z?;@|)DrUV&L>I#!h4O_)oqRA68Zn{9{A z>7d)l93gIxGNM}}v}jMf=V&&JSdPMcPSp<}%}|LzXKjId$dbKjCl~@oT6*A0vLs!S zVneA1N(%qh2ABchc;GK>A$uKHa9)Xaxr+rdAfNyjuwZGHj){Y!&5!yFOXXSTpukt$ zm<`5UjIHKPxTsh1laZjNdY03~kW+k)Ns~QZBuQ1}L=s~?%Yh226BMcw+z<{4Dw0y6 zCV7BvPDJmB2QMK(8SFrkAq$BD$|eFOqn6e-B?=IcVQ%8)S|FL->CSdy=lSU09zrQH zdfWM}=-j~QIl1Uf!KwHeUPPYI-p!?-_GqFKYN0l2pGJ$X7OSBq>w%J}Cf$Yv$`eKH z(M0@3QQ}>$448(x7fL=S{}Gpe_+R}UQS(T!SVz4BAOrtHZQ=@|wRhql#Fjw@T13KAeeQbi7# z<=_8>l%`c4PlA%b_Q_RL?8T12Rbu68vMH_B4U5|9o6f;{s_B^I*vkItucj>4I;xMc zkI{bV2;G5kKIVibpu&1--f1fP+#{$0n@;A@P9~R-Ud3m8<`3dj%jJX%#;MaTRyZM1 z-^@fYu+P%Yhx%15%F-(oVl8MQ5zOw`z*WT9O6WQg-;O2hl~$JI-XrC%W3EUi9ti)X zs?e>YR4PY=E&i0>-z9D0>1tNCu6eC1$MnK74qcm-Y_GD9jyj7CA*-KaEui|;v&^gw zS)rEZo^s|^KK)Q-Hrm)OZa1ckZ^6lB6k&n#9@5RtMB=TRe&zW2ovbp4Vx80X!YkZ~ zBm5a|B~23V3KfnLmHS4a+1is57$thlFR1PZ%;N7E@!>?h75+}3(X0#t*enRTS^}k! zo)GWyNnE-zZHuz!152&=#c9UAtGCTTF<`I;%P!4TPFa@T4Zsr|qAyq=?oSbwqUA0m zk}YLwu0aiL*MXG5ZYWeuXxSof4C|Oiea*hu0EzBi=E~Z3@ol+cPmID~$|(O<_-@~u zBC(j1<;xsId0`UAnhq1og@rz zv7PQntTr%V$?@P4nzhZU$l4GX0ALlTFAA65j=qKc{tC|;vWb~a=w^oeiJZ?7^4JZ~ z)ad{v8zl&|v6Ed*<)n!IT$7u8!Q!kfs18iQCeq9~vD22{_*TyhGNj*PFbr<+AJ=P7 zU9nHWVF-{C8a(Oc?yF{9lLs)%Z;{*Uk&_F=n?-oY^zXn(n0B0OAbfTn)4*7FKZ4hoGKw&6P z*XaPR0Z25569kjz3`TG=+U-?tum;2KIiGAT4;5SBGCk`Yt{HT{HKnx}l?QIo*zNPL z>7y~BM_y3T6WLb+lp`k|HBuX99!WGf&QBHwbSK^jW(aBm94hsROD9snE?l+nz%gA_ zkJ7%NVSSH$YFl)GvsnAB>jEwZx3sj#^a-zXtKsqy%$*H9Vlz(fRS4L=;?_eMkU6rzOMmlWAQ#ZGsx3WTg?L*672yBEJO#8J=)p3-fm1&e`ji%f zAH;t6RwsUdVmEh63ir~5G(szC=v%bLQ|ev8Mk4xb*DVq)>nJ&T(NW=)`&1(bxI`qv zl^5$H^v8bAbzvm4O*_ag$ft>$y0GvwK*q_`j8{4k>>kaNcA`Rs$&Z)Ig)8Vj|CU(i!ZidP%Lqp z;_ACTFySe&iwkax(s#o@d^JS9!*_7Sk4Zm<3P5f=2x$Op4)VCUJC5?H`kL&l;~31( zw9AvC3HNTxv(w3w{1guMu!`{d%Io#Mcv}BD6R+~n&uKTCS64o~L;$**%RDc~Jd?@H zi-$A1`nsDgeYe@rjU)Tv+h$niJ}B&d!B4y0r%a!|ukZ)5$d@n{GiV7@lGqPF^P7C} zgZ|me{QH)Dx!ba$*HH~6o({^*d#>(@YLBdWp_eDezR<_%=Zv>U6sHRHAN(6u%~Km0+} zt=NWPF0^J_y7GoA3Vj^}^8(>0zKF^4E=)KmN#DO+G6f8?YOgdWi$Qk$w`KF8h+_bU zjk4qA>Yq-Ac67|x~M-1%>(J747^JTr-LK`v2(40AGNDZWHva;cr z8!W|@tRyV36tOd|M=A?sFh>5W5v-atr=#*FHl2C%g*c_0b4m;?i4sm6*xZxPCQbCK zMxwCH@=ENqq%6%uStLubp2j55IT)AfbFnZZEQ+bS@WKcp-8|Kg(ojY1ZKL|Olk`fH zSnR7yNIhybJ1=7lv`V3P0u?$OzwEQS>u5YtFrAkqbX#bT^#Z^E05nRixQ?;}K zxr9uheesL6+m9Qfb<$$*4Omix6Kt7ha(8mrQXj32 z*JaLTh5F{Ik25pm{X7O)eXvSg-!# ztvTHw3FX(tURj2=$JEhIn^BY(EYNJuT~!YEUSb0K?%S1iaN0I^9JKCJL$8r|$UT2p z^fEano#tqzC$|6gcjZNK^UL}R7P`YX&iFx=9Y4+^+LOCg*Mt@QInmh9^qP0w4}RbK zK$VYNZLVql97xrJ9UXuco0{gPBeMWb&vT+Xpa6Y^v(&XoZgRrZ5~Gn#eUa2+Gp{*M z_EA%sIQ-TLO_@z!4o@(-EMyS>I1(Sua(Uv6;~RO{PHGviP}b~c$%1Ilg_^UCAw9@3 zl{qk1c@U+K(hwM7R4w4W&xI*$q}~qp#9rD?gRV?q_|n;~>ilYzd(@sp!%0+dYI2r_Y37Kt(#4R#{1ym*euV8d8CL_|4{pIBqwUM~yBFyczD<`g0&sVTM8vM)cc4CR+TJ4|Dl(TiaN zlRAl$TfjbM55awG_YyhT5k>}+lEfaDYHHkoZWfv=yzOM-C)w3)vbSps>IA3D&;}iG zr~gYWQY~uKq<$2z?>sHz1UbpvHq@)Tq$v{PSJ=cnww}8qT6$;nTbm9Rv8;k-bg%!| z*;F<3lM(D|Y}=c`1go=47$xUV7mP~s9o2{B^<^m3wb(NS`-CEW8KDfFw)R}l~*jnv&m&b1$D0jD~Q~xQHyyf&U;txNpwhds;S`>nac$y?=;OB>|G zNtkYYT_70|JgMREOQ}5K@p}o~F|^hf(eHKNa0i0O1|ieG3RBqmpi5RL*6?`Jt?Y{! z30p*W&A~bitYHJaTnnSFk7%{*jnj(TgU0aEnw9k#+Z(tU(>k+?F6ebqoZ|mt>NB75 zNi2V{l~;znna$aPX?9_3+aVg(%}Z6+Q~7#0znXHr)ZMcYJ$Yo`Mfi+H9-~;<2Isb+>!~;I=uq#Q$ypDU2%7(IJ3~lcH$+_Qkl~M5wN3ugb%!ch+rVhhb z@a0j}W2%Pso3pz^Iv4s{(R4FZIbLECGd8~*1#Oy>>gVdQ_I6-gpTNruV@yN5))O9h zOrLyk?mism0xl{`aJi=I{#4xLb#i@i?9`=hnpF5Eb=g{u@{0a zE^m1mw;o?l*O19MT~Wr{{L&<2+t#NY-?inb)}krUpLGr%;kvm?mlppp&KRe=t+Lw4 zMT$A=%57jeXUZ{^AGqbD)@;i4{`GTH+}oiHq$^b`^>$i4iMU?vsPpaJpyxf&RZn|U zkIu)BJ4<1tD@t)Vr_0aH<{^nEdpOZ@L?_ewJ>x%&WO%Ayc{3b+(_jX$AUF$FQn> zHJ8%Mt!c}*z2ADrA0j_^lc+}>pr~!-Vy|xsPod;aO)5>^Y7cj; zX#znD&EgNXGH_uC56HNvw)~0ys%-hnFZwtPaN+Y?(YA>?#g`4u?+C}_C@7L ztoHb>!|G?g#P8h%h0rwW@jwp%ORUH&N(GNlwtUZcp2pLpZ2eki#DY)(Jg( z105>{Nops|=j0$}iM}e#(v1B0jPa(b|4yhFREy&X4udjo?;P)kPDjBYY|i+N$b4*D zzy)ahW%x>l`P5E-Fz)q+$qJ>)w-%=WAIZgl?70vtK&J4SBys<2Y_nP_@N%sLGfRc0 z$@oqw?zGJZ&&)~`ZsA}>?ugI!kWIi?E)ZGm-V%+|I_(9qZxNO0%WCRI%#I^+k;~wX zrC5)I6l9;~hZY5mlfGsQeFw?9ZBSk;{yvTUe69n5(8K>)#Ps4&ZC>%)T(Ag>M*12L z{C=>k7R_X`?TYwmUn85$zO=LR9a(_%3~vtHoH)-T2L(ypIRbQ6U)*^FEKany-4s zPUp1c0|S!nE-U(oNdP$!ie}6E9*^@zEgZ#Y9mUP8Y>+RC3*>C^7(q<1`sHtO!o3Uy zVc;gQDo~!*XYWibN78Vv%8lTV2<6ht=1MXaDa`mvE*5vJ?pntw3(^=Jkm!bR9ODq| zDlx>`tk+a*3w?2*3<(`Kuo{&zq}nIOO6`)kalQYVgAxNX^OUXIXbO4eX4=q;Cqt2P z%+igfZ6=kl_dsed(~=q0Ebm5!+^P>K-4SnS5WsqI7LyCkXiO|gj=eZ(-l#I{h|DPm z5D1N<#^`D(?8W?;tGA-eZe)=kZ!gtOPYT764Vla#L52Dh(b_s|**>x_ajGWikuTx# z5~FKNKJn8!PXk4(H~;Vn^{+JXEbZ7!!yJJ269ID*IZZO>t~-v*gld7Ec>+g zsAERM(P8zqN2yd}TTk}+4IdU-y><7xP-8cQE@$v5|EokRb%jP&XWDQ|nYG?XHmYb+ zS7&V+d3LavC`{#*H>VaoD`{bQ5@F$UVr^3LsPcPyRk(mQXid#SkM9(F3>TDCse8(l#3@QC1~(HF=b2i#Jy%44|-5&Ky&DDGhUd6Jjb9Fo*N< z0M_@0GBg^6B8P?%F~^b21Ysm?J{d+rFR*K^w=&t3El2JRV-ha2bw}%WQk4o0sj(UP zFL7tqVND9|3eihpkx~CP)*@|Zzb^7tcg6iour}C9N1?ShB=0+h~_0wGM9;_HAQL zgmaDqZIEl9lwtKvg|&%$Cv|Df^MYL$QNvRur!jyR&Jw6tIQH&E%c1u)lgQ@hqaZO}pL0u2&IPtry_ssqPeAZi zm{(9K_mO9sxtSf8kLS_=1-RFQHkMHRXKg(-{Qc=XPwS`xli!Wkf6`E zG%eCSG5VkhaeA|okeIJV0r*nIC)fPWpffq4DU+txHD9w+>9kdk*>sWR*e-w7p7)E( z*sY57I&c3-n3bmvxiU96*wK-bSay+`Es@#iwiaCrdx@d;QSp^}zcVK(&~qc3TSHTs z9W}47tdBRRCofGm57-mIPh9IUnAHxo;h5-V84C@Svs0I%Pq~C?)(86!Y$y7MH5+!) zlN`&q9Z5K4hPxKyGNl>~wEGo(rm%of$V|Smx3}nvZdREU6RtJarK#JJoAhOUS^hLy ztxVRUX*j3G8?Ijzp;k#-yX(v$fSl$%J6 z(G4rhDs#Itqpc2Aqf}2T<&e+Y-az`JL3#^`yQH_wkWAVnIg_ldxT9S~Tn_C1{98H@ z8=RiovxGfZ(8OhW4_Xz`SUW{AcROh(LCBvYQBCPM=AQW$*&7D6s>g?yx5*Rg$Yi;> z82wgzx&joX?RH&3G-6|Pt)=%*Gqb=`7kUe_Mx7i^$-8sCe6d;F5_j-bpt`s}6RV0F zxqB<01{h9PTzrLlnrG}NMa#wyN@|hXGSge#Sfv5kR(ns;YD1gB=1{#m*pGV_m@Rk7 zZ1kW50stZT1O*2Gpa3iY0002s0S*BG2>$><2^>hUpuvL(6Ao;quwg@J5J5$BSPP$^TkbZAp0&7Uw??xd-c zqfDI(SMHSg^5#N|ixwd@NwsRiP0bj_+*>inJ!{ z-qqN-^ufA%-+K0`((_=Fcu}Ix98-49yh25DEqhlmYSy272Q`dQHB_k=HJe_38ZqVP z(3Nk7trT+PoYpOOG|e%0aORyw>;Im-S?}uBJXQD3OSo-f%i8^7Zw{Az?e5!)AGd!P zJnXChY84)36%m*nbmYZHoJ;#9SfF`o>DHZp1Ga@5QGW%79&U`im79C(33lOA?6ua{ zZzuvcUP;D5#UX`f30PiMq*3RRg%^6&A6(L12j7BS&A1qhU2Uh{bQ#_jUyctR=@@IY z$;Ka&Br-`_Q&{H6+eaGqNMw*-PUd2h(ZPq1`1!EFOgCX{)8O zj>fyIqzK#itG=K9M>0~L`gh6z_Qj^s&_nPog-l&Q7&gWTj$`xvZ$HzPggXH~QyspH!3EWwq-Tn{s(-izn-eM&Eii zgIlplR?u&k{UosW(*H>C*ZBs@^I`qw_vW%UPpfyI{GN?-+JKqq-%X?5c|GKD(eaU%z6q!NG$FtwWn1;6MWoCR;?3DL{<}DvaD|*`k zmy$}DFhHdcec_5=*~)dCGz4)q`2!5rhNYD{X3#3C^Iw_hQ@#UX=7~{hVh80nzXoD2 zU=Hl#zIx~(v!Ts~_o2(t^t46b9ST-bn;3^4B|%b2aAlzAL|!D7$K~0p1F%S?DpPs0 zwF&ZIQ;Va^2ni|IC60=q{7*t~7d%CBk%2M%kpaiJxuaE5fpIApBXMOtY#|LhLSz~B zMnbI9pfXs@dCV*?<2)!9Ynxhop@{-1J6$%AeNjwgC&lEJcHU4zv+)z>cn36|A+u1- zTuwDt$Nxxx`Hx2dLRrYNWxy{IRC-`5Umm^UB2WD*dbZqU4AD5Fbs98AperZ=zjw%t zzQ&kCAsV|3rnFJL>!JHXg(=pDBSS{Ce@5J(Opm3-M@5c;qtv1vcec@e<@1AD?%Yxny1rLlN|yd`iaBh|15SPg?xj0eHgB3qHhB9GKN_ zs>L}VS_dVxu*ET7?V6?7cxA?9%Jp_D^dlD0cu!zn)RP9ODmO)jGQ?W5j@QIyVFQ>> zX#aJyq6Qk?PXAamT$UD~_amY`gPTom@$j-~99zsV`8bSCl(fbJEpZe`6#iG=(TD>OUI-t+?i7-$LZ70zFnpV?Y620mqpl$c(%G1JbRN33B3YT)!?LGHa zgfR+rnRH!;MDxBdq$O5D7F+ju(^y!mY1K-3+f5y|mh|K(GY?hTnhMyi*D+jyZ#h*T z?iG>gg5^PVh*ov_cEkoQ??6_nTA*gAZ*r6^J6|a~o1WFdJf@o|5qe>AN>P!OMW}Er zNewpzFH_Wou}`JDLzzO9H~&?VBkjsr9^zMdEG4i;7Hnk>g0*VMEi>cl3nG_3@&APx z@ZTDHf+Ka6^9$kj%=Gq(w zkd|!?*cFj^F}tx1zu#FC9AU)3QD2#91g%cv4(;YayO4b}CKs`4nVeqjQO0Hb?xtxS zNJzm{dYBbnB!64Z;ojHAc-836;>u;u7BI`M4s}QPJVZIYLN2rBHF!k_Z?ZRqkXjR)*si!@c%6Q$^!G;IU z@B@!SU)198dC;un>9Tq6eN&B^`_yDLHb+&=PKOB%(<2V;SWhS{icVU?DgVQOqt!ZF zJdzH+1dq7@Th>hA+FQ#1oN_)n-oYu65nk$E6tzPoBn%dmx3t!y%9qacgi2bjU5!!G z!QE)@o)?BWJ2J%M_V`c>)4|xn+PchhdL*exQ>} z&D454l~r| zfG)^=-iL7w*ME1DSV5wBV-ZeFWl`xTWcb#Bk2ErwCKg-MQc}iPqN9XUM+-Q%S*s*i z#=;ZfRb;nzfmG6KLegF+7H!3LN9gxFz7l`+W>FjCf%;=;=KrRAf+to<7j`bCbhdNYXTzt5R5*$GRd|QkVY=pJll3v*ba?y)er6_jJh)urR68cbTB!$b>Lzy0 zQiAn1btj=?j>m~|N<0Oj?!mV_t#Qp=Rs$bST0DIA7B>ex@yA~S_%gq??C{Re`4 zba@CgZ%S7;4_1-JmW%+TfF^{6O~-b5=vPm7ALn?AdH)xFzE&S=lZoL+CZvXwr{)^W zhf5gOYRQ&ruhEcsBY)hud@Q*d2Et0P<6tEhVSzPXt{78vG;R>)k~~r)+9Z!+gD^9g zZ`6o-!L~6hHeB2ScZQ?6R<85naj=&d!oH&y=xor+f5;R#;EJ$L{7j?CFkUAHM zsAq;AH+vm}WqAgV_18m`sce?`f&mtJp(0)dd4M;mRk0{{+*Fp#0(5QeUONf4QYg$&2vC zon$#d1e$d|wUutBgLOu1Cxw(E#boxzTnsf?&xwrQG^M*kf-aL&dD)~}1&8AqPy=|R zN(5e1X{1o;p6~gQcNmd)r-_mwj}P;fSN}F5Axcaj#~DMoeQhQs{fQhcgaM+dsYqFx z%(*WO7OGo#EXGNt5htkBREKzHeBVfqVybOAid{&!saFMd$~CDlm!@sTb5{y5k}7(P zRX9a9n)rMD&Gi>Z>$_w!f->UMrqD z%W|daH-CC#&4VvvnYJ?bZQ1Co?1{7{iEWV*p^c_Il+agRrj@`Xt}D& zxQ=@!EhdFy%dVSfDF+Cj60>`VomxF=xpynH< zy+%r;YQ1}ky>KU9INPTHcY&1_uLly8)qANCdU5u+wVd0f`Kxx``M-6=t0V@yOIouv zySS`tulS3vrPIH_i@1MzTh;ou5Ot`bdrlU+dvjT=%sDR zyRpl_qu7r&OsA#UQ&?JnNymR+s+te0x+AoQ)3_L>TYQabMotW*$#-H>tE_4ZtgtGl zx{JSV5xJlEuIM?e??<8cTe9-PgHQaGqIOjdgr(vwAWQLx4b+LLpxwN~vDhgCtTwhrTtR%Z*rfV$~Dz-POz#Ifp8rW|(YMVz( zPr&?|de?m~2fJrHaAbx~-zLBaa(M=m2c>5D zi=+yQ_UC^ToY799tGTRJ@A$ukDp`|RnfW-W#cYU(yOcnTzM-*CXsx;BnaBW&$nxyJ z1Le5i~K$}Q^7*kJVJzSTNvI!j%I8hThAhh$O_2poz%;zbM)tY!t=F$O+Qu1HJgmk6 z-O<HJl0li=fPH?mfm1IF<1&v%NWCCYpH|j?pg)aaANyT7AeYGr;Ubmz1`Jm0UZu?lKw(WlAe44>#!rJ86 zv>OBI4WsZf(b^}zJv)w=TsT|4yAxP{VQt{9O4(@Hiik+0Q7eo!*E$MKGaQWKrRNF!Hy6~1)`t5x!mK*g>UF_qe#J>m z3Pzb+`c5u38$d?o$MWCo?wLT zck8gj&CD>{<9;33cbx4|zT^4bHj(OzD@43(e4&Kh;0ZdQ1Gv-(+2ojfkh~bcF8*1W zEo&OgV*owrJnBr^{g#Y4@#9u&lGy6c-sr83p?VaU7^v#a&ab}M$j+s2nn?Cp+S4xWa0=lK2NV5Ki$JMtt?>$enju*s?ruGQwu*%6Lr0}p_6p3a7< z(>pI;PHxC5DX=!K%O}3tpB&-5yw_^0@tWtUk9v@5z4TXF{00B9 z{Yy0v1F-x?lKr;7M6WUcVp00t@A{2C;kBA>bg%Y^!>Pv3?!Vbu#ZT7>oQlo_5E?*% zs#DOQmVyHb4iu>HpcIG-B{F2F!D13u8KqQw(GerWhy*=e49U^qM2;R&f_Whk2ac2_ zQG!}A6QoU&NoMZU>2l}Ki7SKx1=$hkqD3^5V!+^YCsL+ODFUThwJI#EQKQlvDAnp$ zuwj29bt-nHP-xJUrcKM$>|3B^s>r1~*RI`}D)i2+m^Y?EWdxM{1r=B@0heIDOks?8 z>clB$M=Yj{WJF7aR=$iiizH~0D@a5msIwD+MA9D{B490cq!u!pXR;nq`||%rg|Kq7 zO**qTZ?$mWk`1bRw{GN5yKXWr-1+mh(1WfG9$Y%~1$&ij=YD6&W0VA({1l>ufm2T0 zbwn0vYfBDZsWx9`xccp>=BD%Nxa4w^vBa(zV50b-bYj*(7CmwZCfuN) ziCj@)LP82UoJfW-j+8{pGn?Q7OES$YOi2$sKqI~X#`x}8X{}NttSMv|_Q_%koA$9^ zchW(jT-gB8KeG~;iNq0IV7F3K$I^<^P+7b;Q>|(Q)!#^G%t}>)RrT>w;tHmU1>0&H zV2b~;3m4rH(PiR+C;Wufybl8Of{7XutoWp6SuM=t0Bm5O%moHoVv8RFkapEcZya5 zodfnaVd}mn&eDBhj3I{Ubo}@1;(`a2c&ydVR7K_sM)*Xm@$Pi*h5N4Ub4k$kp(W$x6w#%)SDah6lni84*p~#N+3^{z*oQq`HBIu zT9?ln@T`sfXINM|R(d3|1)!iX3U&zApGH-#8wwD04v^1IqTxCLe#Hpe2~e0Ih`|Ih zkSSx!+7vk>BYaKpfKc$tz_jQ)-nC7P9oSS^oL7^ur7DU}DOCuQ2rCXm09wjwT?^l3 z8pvS_N=GmjC$vYjiV+D)#L808q7X!dO+a4mBOn_>5Ct=MK?{gnpE59~F!-QpOp*G{ z8cFrZyA5Y6yo+E3L3lRhnQe?@bfdjS@ye0FQkJvyNE=%jBn|LseT&iM$oz;c`1tUK zU5LiI+~h)ZogfE&?4=KxNV?IjPng=O;g@2l1~vZ_fiX7V!Zaac!@?Bg0#X~CM6R%* z^JNK}Z&}tG6!eu>!iZFwG9DPq_9zTSP@i*~)D~As#u!nNdbqje-a=tD6Jh}b3oU^{ zYgbJ2T`ppQstPtCYQ$+S0DgbE=r!MWM6ghc7bM^S`F7wRl*-U5?>mq*QHD?gfuLtO zbDuIpDg^elCvVe}-lkq;MG0DwpSN?Maqva9-%Tp1{Axx9q1e=>swk-RET~mr`j`Q{ z1~XMPp#VxSkz3&54;@8fL``~3v5@dx7WI%u-TKz;xM^Dy4GUY>U`#uDbFC`vlScM) zfjW$-trK<5FW=cjmLL^jxeKLos9H+7nFarq)BEDv1ol{;LRGVy9Y$w8``O0kNG8%L zN>)uvvRfX_WlAI9B5AtUl>Ur7a+RwKUr43~z%`}UjBQ=9H(0j5R=D7SP-bG=+k%z# zKDGm@Q1QuFp$0UcMO`ZJ-bO*5N^qz^x~K2B8bZ^a7A~rl2qE-Tvn5ubJ0hJIO@n(R zy~L*sND>h!=pvu_qP35RUWufPtV`BBwAW35}qLK73&fYxvu99_FY%BMmirPV(mn zG#VpdAqyus!JbI~7)`*SkGeJ1qzO#vk{$Pw-UQv=0(pocJx`-E;Km=#{uIRDd(AhR{SS^ua=f?zq|g zQwD*nu96aOd&Ft0jKB3@B~>^nHXUv9&eyQ)1_pav^;>|@PhIt*FMy?4|9aS`KK9(= zc@$q{uPYAE-b;0?cH#e-^Lb+G_E>(=Tq;CkzQ?!k(jKzkgSN1p6dn{!M*$@iV%`qr zI5c+}xBxVYQ6cLL$z&qK^hNp-$)}I;&j(SF3iNsSdw#*NH{#jtkK`UO`sa7)LJFTH zm?tre{o^(Q6u{Lg!25y|u?R8~NgGkyxxn+X-?6Ul!aY)oH&AQ9`57r{fiL)2Cg-Cz zwW>99Iyz8@HZ&;(OArKKBLqLlnIn=q8Dy)6qmWFv!LjNpG7${U%O(U6j6bL({~MM_ z<2Lv5KLwPi|2l)U$~0&yx6wZi!EPEmcnz!pp z1~g1VG(0mN=?MRqi?yv9FbDmIgW0VR1pEXltQEVBxm#Vvs*G+@6X6Tgj_ zpVC`90J}s+D*!zhgNqugBZ|cXycU;%3tGAi-}l@r6tR&uX{$oIjd4+J_S)9N4Nzlpn^)cg%aqmIOzi~$h0bu5-h00 zb2OmEz(f_uMUi2x!8yoKT*vVfnP|!jQUo`)TZ5Tgy471Ie>@qeWE626!hj4&#n~JP zFvxOQ8JG-v>2+iv%>n*61kgdFD6raN+lA_U0ENz4mC0ycu)VG7#}hqTvAb+>#YisK`9QI*HGj$e06osRy~wE6h)5O5QIJ8&^_3LO#(TU8^x6RxF!2R z7Z|qelLI-RkZq$2`inT!6PED=2OE{Wj8h#YAgMo^7O~2>5oynM3{4IZq4-pd`s^z) zSW+X?zZs>dMEi*=)VENu9W--}Fw!|TjFg9zC#!l0Fb&h8!?6*3&=2W55V3(iPz3*p z_|PDrg~aHCih#-G>;vVrfCHG)D|8Ikn+X8;Q$Tezvir`j(6#VuFN!k|>Wq*1v$618 zp9yF&*83LtYy;O&6C@=9#A7%)AyQ#$y$^vUcJm+z)IA#+MutpFqspQ_a{z!_P=nYh zLV=F<*~zrpMFT3RN2^LRKpfLC9ln$#`mBif#81=d&Zmnh@LQGJvZHzgy{scC(yXB+ zY_N=)&W?&l_TwDVEVP9?(vP^1i$JZk+_q)KRjZn(nVZcoYu7P@IZBZayI_pba2SNR z&1qx^TQf?d#6!c94qHt#(X$^V@qr$~7Co&+D_{~PktEbuI4Q~1jhnx#Yu5kp1G$k} zut6O^Mtah0t;|z25F3Rj{M?TuCDt$*6tmDj*4nx)yw|L$BG<$~x)GH!T|5E+GTN}$ zt0E|u<=2a~LpVu7lZpfFp#uq^gZV^*9+0#@Ie{>ch{6NSAO+9*gD<-nM@=)PH{iBL zWz;#`)$nx0MWv?46N31wsfS&(*szlWpwJU6k}gPD`9ukagU~_?%vqAK;h|aB^xNO7 zAjuS?BO1Us8u!qs^Mr9~GncmlvM1BL{V{2U4f)u!`ieah$lp#QJ(KEJh$=gBYl`y;|J19H+&abXf!O`-c!12SL%(*@F?;aK|_-q?V}5DnVFxgu%yokgCOWZVIp1{yr|01L~;_gBG~00 zW8p3dy9B6R)(I)3_bud1pWitRb`w&l&W;)F)Je<8P!yK zw=3<^5C)-J<>Vn`v;@=(v!Gr?joq6Bsp)(~I(*@*>t6pnIG5EKpZTncV2hWTa6g&M zG%|SR6_O*8_JGCd!3I#i82#S74O$=xAd^lSK0t(2F3b{`4B60BVm;u2qXW~7OaZ`= zt@0!?B&B>dl{F0J?Uh23j4ADqHiTAQayGf?bwU&d5MoX)*zM;0!=c5Qwu~lD$I-Tr zGvK6IvOS;#4^Wo+Tyrt`4FW!W|X zW7Gu0%o09Nk}iNo-Vy<5qpGLJj+bEaCDdb;)&tcT&XdcAi#M)6!jS10z zLA4*znbkZVYpEf-Do|Ym&N15N1W*RZ6pCrl2Iv2?!>v6_GVk>4U*6v{#S=ygkWMXv zyR>4s4bn|YQuH;W7kyCx&P`lu3$(a5-4RB}4ruURS&Ozu-~1?T^`*jc>AWg!_Qt`H zeebNMXy9fv&P-oHaaj6c02kd@_6D%@zyk(2g78rY%{egk+dtKwKLrfy@ zzn5?l27Uu@C<7D#jZ$vgVqMux^D3|6k<5xY=n6A6wwI$qwF!h9&`tz&)z&D*j^1|Y zPBur<))KxtQ-@CQ^<1C&76BC6LSdzfRwOpyCM;^@->U4(s*G*H9L_Vj#;)D8?=@#t z=&#V;YS6~fAN8iI45vEDSx$iDEACD_71#e&PUy@A@vg*R1rktp^`b2D?(oJgEJDi_ zr@NY)JtxzP9b0fw0ZJLONTo+zKm(*=3O=ezhUH78o^J#&=#6|mB z?|+m_%)X=~?q&vm4wt-ZAxmd1w6C|tyfm4NGS31E?kkP`5cfIxwZ5`)Lx;7t|YAFb9U9+z7h`~IG z!1OiFWuXL-_e)y`7r!JQ=p*m!+PO*#*!9IAfil3;*g%3oi6V#z3yOEZ}(zRj*4j39nos1cyg!I%cW0|rwT9N zwy4Wy9xt-cJDiDm+<3X|9l)#ku5NSX>MHMcZLx3kHqWjg0}xQ);kA?hnTS?z=Y9V% z0U7s}mdCT$+wKlwJE!xq97CI3^Cu z7dswDDLx5S)2Y98uj6$$u;&hLMwj@CVeYPv@X+LJIq=MSa$6Lr3^I7Q@{3cjXyqC| zFLx#Q>SFlg>D$Tn^~x^QW?6egr`Vf^_?YkBtAoeuZQ}&L4j>}2ukhTTJH^iruy)t` z0RL5tX#ve$q1F*wO@l(Tn?C>O1n#XT?`St71K^?l@VF8Y0L@^!!zbRQ%S)YF{M}u1 zM#AjA_@G&vxjfH)i)^0T!SnE5K(<~21sMN0Fxs9uB9;MT@CEKtud6v`R$+d2_n%`= z|8%{_k^0VKk*`8p1c)hb-he7-uwajaphzGDKtfG}hzdbH@Y2G}#DWmlM1**7!2*Sn zMye^Jv4M&TDLJaixbO_j0tJk?6nW5trf55Cf*L|cp@k%2lo73B^aRo(N4qeEktB&h zs5K|j>7g_x%&7+HaEe$4$%uki3XUqP6;zD0YGEDRq!w-3wi7qGbZeI_+No^u<~^J7 z2;hPdaOx>cGY2T0ih2JrZcNgzR&W|2Q=SO!a?Hw_H;aAZxy3=y6a$17{H81FjWA5( zX^rQRnIRn3oK$ARgTW|v7@)D55ha1sN@}v)NYWul$HZmI>uVSxXER{Oz)UtMn{v*wxx@l_KP`E3SZK?MSFC!KXR0T`cs4(0}qhh=El zpe|umsAeB24CMJRLvjG$aaQUnbt83QOj*ysVMnjmDF2Ih^Vl`=vggv5i- z89L|=vAPx>Nl=bDkr)S6SyPo%de@v^B?!AHdvD!WpL6rgcV?OG)#cZne~nn6LIZY+ zXkrcKfSHyS9*Qlt9(wU;7bTv0q>Fb*B;*BHfchtb2;%gdM=z->$wIAu6x581Ocohu zn8_+fR+FN^p%}j63dX`xL1=Cs<+@~&K~{8z0}hnECl|JFy4NOTaq(yDM2bR|=UD=Z z3a-8^+gtyz%Toog!4tSz^w-MFAs4H*5;}$%0z+!z1HA9P3xdz*LY(cA_VQ>zmr8Kr za&fj2cq=Gv9MA_@TYJ4VuTcd&RZPMf@ugsphFRHKaLU)LnI3!W=9weUO<|tYmW(HX zOW;xHwlTXZxU@Fc%&0}<9+V(;H1SBpK;|WqK{OI569)n9HmMN<45pCdfTQ^M(#H;@I&HGu>TmG`N*rnYGNQca0BTD z=@|b7LW!_$SryFnvY&M%3mu{tzDgIXfB_(Uw?oPWxb_!Y=q@U|v)};?;2fAi<_i_$ zSjdj07rVvhF4L19nw&F%30$v**dq|0VhAg5&G1Q?nOyvvB!>Cp7p+*m&qU1zoCWZ^_v_@jv=@4wNH544PCq(~=)DmgA zAO>+XfnMBYP7&%O0@7wwdT_z!SV@2^WHXl=TvvF;R}g7};*Dgnj$necstfw=rWN8Q z+w4*(W04F${Gkt0J=;|OFw!q#m8_#i^r$N8X`U9vYK64AOqK=It4)wu`T|jq7Vx%F zVckk-?r1z9MmC`vMco~iV>(r7*P>BpQ(T#rmMmfx&%?OL9rtY)@%QSvZz%Ztn7y$ zIpZ0fwA|B0YIJv;2rhCF2@6IAiO8G66=LeJiQ%<_aLlZk;1;JPGr5px8mBnT=~+aM zvk@O_7|k}I71A(}F%JEuy<%L(7qi4K#n~$11}29%jAsb|{s5d4u$xcHxz2HhGZvpT z1&6K_iIzG8WWU^i=j?U3CYTy#x`;KxD7Yt6gdJ-J4MwjdX~vbFT2B^-yKe6323m`w z?rQqA@m5Qu1KA{HzJLNNgyn6;id#~tygW-L5`|Evpa=`<+W_5wG81y3Wu^Nh0~eTf zVJ>#D&udX!#=#9^;9vaG=7eX%8P1q+#3wxQ2}fY!lLwLkxU2tDHOCMo#z%S`gVD`w zh%JeRG@eWX$4oS$@kVK65DWo$mK-s@)?7&f_TqRIMyCT&ssq@Eba-)!hAzMJ{O=7< zti_|5l82@e>QSGyJJ^kAV*OGCRkM1tqop!zW1UW;cECN?JeIgZ;0SS~Qy8?+S@rTho63PQFr zJx=jh&S}inu_evWv0lNVGJEDkHF0LL|+F9nWy5u1R;Uen|i z)?|?YshtT13Iqrr5u#wirJy338d40HbA&=DINaMfl@8wEl%>#nE!8m8o%SKh54;)a zY2g-(A}PidA&Q^)#hnzQ%_F#(BuzxP0Se{;fz5%T7~Y>bfF2EC(xEw5m{oxW5CQ!d zpH3h_60jALC{u~amf<<#bA{2_VOqX@)Y$=BN^}oZ6b2{xkUueBC8-_nz@U?fmN|(G z_PNaTMA<8>BRh70JEqXxh@EMz5h(7-_SpX;KIS7nLQB!ai$5ZWW)z`7o&bx4;^gs@ zjs(;v)#53f!v5uAC~W~RR!tWmfIvLN5mlW*fk#CqgT*>{0MwJjPM)KyZ3d0B7WWwCw0)8Bc@q3F zWmB?NO~4;NIVDv(B|pIs6Hui_l*1%+o=N3G0+iwB4Gow%qobWp9fi-?1m3D(6cS9M zZM5O~Ig~QC4DL;gY=PKok)%cGloVQ>=b+*UHliU$4pL;29ic!^tpH=5g|ejMTu7NJ zIwntI)eF8^fY4Jtp-iV(WoLR)wN(G5Xo99vPNjy7kGJuh8Jb~OCV>9kf>>sN4Ez8E zBmy)N8BC=F7g#{A-PIh<*jHSnNBW)z-d^u5qhT3D19e@$1xH^cUE|&6vF*%Fp&8bZ zoX*sWcWA(sjgYh0pjg(J!e zCTWi5Zg7PyGy@?VDUu%P15p3L|2YvmK>$p=rIdhy2jKx1d?LP80URIz3%nFXZ4z+~ z-gNQa05x84-UJ)uqe`tS7Q$;!#bU50+zk3eK{e5RAUU zjIv`s(MTX9s-N5=qcSRcCgr2Pr=;eM_-v+VD&#KkXMY~4C)h!34iqEUf%TC8WBi_KYVeIwj?RfG7257#=AjK*Ig4<|HUU z2#n4?0iK&;hSabst|I>(s_h;YK_^G~A~p^X>=h@;b!eOhloYC5HJ+QKSfcYZ0%@ga z#WgEdJ!Z5PDlJHBwL%!T-qvSEYI|y?BpqdEa;(X)j11|?vtjBf5W;>U=_w?D|E+5d zuowXm8t}O(h#ua&!rQQ6BkT2HZ28;Ph3Ik&ip0d^ADSd_niim@<04^V#HLAP$|zjW zsNlFlmW2U=f{E7Z5@sT$rGjk9c&y0^4kgKHISc|7G$a^)0vW=rDm3ZOFkZac>zCHg zympkn?&@4}on4~cj73xwz1tQM4h#g%s>#&hYKm;x?DKh(+f`Y4GAwwalOv@`PEKvb zW^U$g2DEM>G%Wus1}V;diLF*xYCSe8>V7TBb}N9f*6FmOSLPosbY6h=qH-MP-7c4! zvLEj%kaU&ggKAyw>aLkF2?&M{tEETn(ABcN>EZz@=N`)3~KgL@K8pXXl) zns1*-RS0~<8C-Wv8u$9C?*ro`& zs&PVSy@3Cyie+F(%FMkUu<00K-9isgI&jAvRrH7ndd8#1#3-R+?)6e^paPY6)dZgA zXz6CGwagRhb|wge3sspgMm1AmR36Oo0_Id68h8@H5Dd=r;#BHDeB{i5wc%U&nx;fu z6T!g<)|D#o27ysv<3x!4f&dfwuNF}z^;|Inhm4iEmjs_vWM(j2K;o3TLI;cJJE`)= zwyxl?6OP6*Z6=1F4Pt|sqQAiv8nA&A$YtvRWJ=~NWiU}MW0L+X(X-`nrpeL=AmDN} zl>X#NM|GFW!kmd6ahJvH7FZqK!XgLH=h3m)@o|EmwJ6-}WI0ymnlNVDbaIV~aRpPW z+=c%q)o!upMq<|lqt&7oKlhgj|1*I3R|y}%E6Z|k7N&v-s1xPL`pUo)n}+bI;NH3f z4gZVYp2Z>;lSAk7G3$r|+-gTZFNFwl?O-$W(GSG{0Tp;s4;ZJ<&dU^2TxFtjvoez8 zLfJa57kjanO;_UNYK%L-XcaGD4%%HD^|MPHG^ZJ~ENg`gu+y~`H2PpI*2YhZWfNm; z^dR^}3IN;{nI05f*9i6;y*zS21`j0XMhXybM*|8)|0~N>9vP4tL5?ux6d*V^9Mp0$ zQblgl_MkeB$tZtv7gMn2YOQQX&m3jOTVKQ?}CH+NHYWqbF88E|Ud zD7PGLY&6uorZyAQ$!?Tb=sD#CP(cePNqrhhR;KY(q^U>YTWfcw-(Z@unIC)4H%PG9 z=eWV~ZN~lx-}x;wp-D_A*XT@x@}3Iy1#i{_KR0y0bDutJ25Ycm=S7GQoR+yDQh(ic zr-$-Rwu*lbH?m0o)J|3gScEnKX?BX|xut76!O5)mT(X>xGqSQ-DQg4fWbFUXZpc6k zM=^qrc9CQBL?FR)_8btnY(f-paqZa@gYR)Sw_ilT@4a7ho|R0pM|J> zGX_z{)qazlL!TMzU7XX*kW`NP3Qt+qi2`T^7073N-1uLVFB#F2k9y8m;aLZUY^O*u z7P4+YI-Awa21YFNC$VdcpwYJlAT$1a_ByTg5-P06I@_2$6US+Ind=mT|ej4cscHZ^^oG#3y>#rp&W@N5nTf z1)Te~a_w>RXnmU^@v-2?Bes`U8Oz*ss#9zlpoJ{FJdEmlC(Jy}GfQIQ`-g|R_OY|T zci;CW{LfFx!9OCy1K|Zcd^}MSk9VzmTKxHbZGBe;)K4mVUi{ur8`IB8qFnvdk6y{Q z`ofO7&g;jj!+ff%dZEH|Iz6oSW{AJ+yuZx4uJHVI0Q}F7I8fhx(Nn}fJF3=my|{yO z)zg!cW97sHzP2vCj*_mSSC8VCZs6}|wMTtn3zd{vT*@QTpT7UPUqh@c7(~lwcp8j; zzJor^pMEDe?E}wy7YCKH@*s=8{c&$!J{M7dT)N~#rPpS>#8W)9BMR8M^3!vC8`Edw zXYAKkuTYl$poD(ZqQ2Qff9j_>I>z8Q%9`c7KH)3^_jf-TJ2p7254IBY_`Go%OS%ZV zR`n3RqvLnA@X7lRH11;+{C5iOKlRp%J<4C=@&g1Yfdi8z8+Z_5LWK(tHe&b?qC!~{ zDW<8|31dc$uQ+Cm_z_~k7%?8g5(o=rN|h@?wrsc(LrhSiXoiB=q>0OqB6Nb<)e~sY zhc<{7J#rK&&Z8i64ov#g=~JUqizcip)TP0X4jWhA?BYba_N?V8IJ7{Izn}iqjv988L&i!#SWXzg>Gt7J(xhv(% z54w7L7q;Evo<%=5eQ_`9*{e5oZw&>nR+zM>E5vY8LwSV6)wc)p9)5h|%x4M&qcHw^ zm$zrW@Gn`b-$Z*QH`iYKO0_wzJ8dmcHWHA$`o@dS!S({Q4Vs=dOKtrX6<{o}rRsVDtC0b7tkD0wt!|V>qO&y0>!eNuT2A;H84lj?8;FwPn8r+QeA~G&>&-#%Ogtp1azc7<)qHd?jn2@*ixU2t;}M>1Z@#w zSq(NeHY>bvS7t+6=+3fwy^c$+#6vRMG~LWo+HfN(Gsb0m{EW;n(@fRE(8P_7v`r}@ zGA&KP6*I@SI^8!<8!x3c*LMZpD_uz=W!3*otWsS!SxX1ruGdW&CCjb`1>KiPXTP0} z+k+qeI5rH8EjZoh5bmp7l1M7>+&?*nYh!8gEKlEjq3!h7H8loV;FHZ&ZP?I!Zdg=~ z{mp9HBzI0Q-=bL#Rp(E4H7HtSKjj(gD;b_tP^W3E+Gv|?bk?LZvle1Z1Dqc6vt$mDjlN(7!Im@jLH#~0)+uU(9 zu|e&4b0FQ$HfgUM!u(p&_j;*t$yHbVOt}SL(qOGuANg^gTeq8O&JXssq-b|EomzRJ z`~1flULSSlZ~yL6^I2;Qeq5oKK9c`x-iObt8D)o_9pOiNCsVJIaaTNd^5JYe)1d15 zo>pipANTs?o!2W3>uP-&YOtm6DDAR!>I-9i(jV`%*DC1kZB_(?-0W`mvyhN1b>w0i z{CsvZ{Vnc+qZ=FW9;hpu#cT#49MG#2G_S7->4Qg0Ai#dNEdp^+Si~#I`@$kI^zF@n zN?Tt6x7Wj!AuV)15*x!rb-}#B5MCllUem(z!QJr8|xUuq_XIEfkpN1_!uEab$kJGn>0` zSiL~z(2mN=9R{oDKQVIcj6wek8QV}7KHVMee?z=cBkQO>Ig*Nxi|pFdveTsJc+hxo zDH|Nw=g91hk%m;X92q4UumWzk?gDhl2|7AYmrO@WrIwp z9x1NVEWUhRzwnqzoK4G`P7>%f8HY&fKu(vfA|E4RhB^W2lSjVlrJP_mLJBU;Q<$S# z216K2W!f`(IPzi}g;+ZNu@H9m0--n?modF5k9+G%XF7HGD6)aapzv#70Q(uJVwyCd z&(h>YG1<;{$!|}=!`uHi{fJVW$y0Rtq)RYaay<*h6szv+U?oi%&FR%JJ5(KN;YD1_)orU|*)T=7ClcF>x`x;0%V?y+kVMXluLS->5k1_9_uL%&Du^2YK(w<^(|~xM^Rh;Rh13oq4%20 z!T9-iysG_|WQqSN!XO+N!3iG7fg!e7kR}dKw9pjkBs@Rkn$>v3#c*~-TUkmr6_){v zuXIH$)3xHu!llvVn|_-*_y!c2j;&%4wj;mV!m6AOjb0=1IbVl1lV3VoaZYiJs|%v9 zE))7EW)(KtO#`eT6L2!*R0=g!bPp5yInUpUIW92TkdSl&ScL9d3 zy!u6y7LActuLe`NiB&$SCtXWfys53xdS2}@ zwKY-21{szr^9$7I`b5r3bjeKiB!2hF)hXxMz=}q*)S6gbql)^3ep_#WnF~!?RG7Ps ze%};n^{oF)qEo6__S+M838OoXn5lpE=G1(g;y>!y%+YqCZUhbh7;h30PrDo45Ktxx*N|;HEDf zYfEI%$qgP#AkA9RK-QCJ=^OJ-`WflUo^}c$OLK>9@pdfdm3AF@ZdI~bx^#6WzfBEw zfs_B(t)rQ-$}!1AoZmUIs5Z01&(58e`V(%BEAfY0P4lu}H-?s6n_C4BZB#QE=`u_C z%cqHzZFe=Z_v7?~o*nRrqE(}H5BzYcn{drhjgJ0RXO0T+vOl@H5;dtzykgGJd z>D@rA%sNKb2#fdf>D!8lpi(QI?n&?HC|?rH0~Kt+)~;K8jq>VF0xPDT7V!I$Xx0D1 zE}vZQi^R^)qUx#I?#s}|1fz`o03^m9M%iS=={|74fG{;gFS>;9!|isEr~J)|@TpaHR6y#DzX$4}x$Hwk)DP(BzV@UCPY} z_bgtt@W(=8(ZbHN%&F3vXYf!3^wKWkrpougtos5;_Uz8WaxdZe|wkFrojj@YHmz z7GJLb)u-eprdq7c{(`Zd$|C5B1pmgdVmgt;_>Z%GkJ0Q+=2FY%#PGay%e(+h`J9dJ zJ}eh&unZGw8z)i9kOtXNsp$5=tw$A*-EzmF}B5_Hl zeo+&BC(U}z3Kvd~%1j`e5?|D84*|{%(ZT}-A{?JC)_@WPRZcDXl8^s9Cm~1A|5OX# z=YIBe5Ti2p1zzC?#_c`7;|O@C^T1a|eqqI2-P+K$Ji| zZ$i-#CTsLFq;5gclhXLlN1yZZc8V{xi3$-CMcpYZ;jyf41v&py`i!v}9q#%l>@tll zAkph60kcIx(-)J_%h)EarthR|tQIG;8TnC*tnsx5NGE@BMgdO`t*`5*R2wNO7UL8x zGqNnv5Cp5z0abAhsbl|Ij`OT@CgBk$b1Ud*Z{D7%&lJ-XKSwG<>#IO(&R(r*D(X&M zZHDI3B9{^>dn#13lYSmDG{jL*x2_AB5;3t4Qc=@L0n{`7@fx)fuc#_Ei}42`F+=C^ zzm!WUkF!#T4Jm1A4e=5$`}7;Ltq9eUemL(_4OIVPRaF0>@Od4c$@M{-bzQ^J9`SGfpt64a@;EycK%o^zvG57wa5FuusNRyXz^=#^ zc0Uhx6Q@p9Pv@S(GebMh8zof!ToOKiR83tJptK_{J+yOfmJjtbC($)tS$1IaR7T^p zP2~{`cP98$GAi#bLD0f}($N!Z_T2nVKI3Y&md`M{ixA}>L%PV#nWW08hV(pvvp5&4FcGI!K6EpY5e6i_kHU^zA4 zRPxz2byQ81UKuxu4DwGog~3e2p3;^@S=L5BR|L5g=Bf-c>9Jp^i8yPPS|N>f6N~Zs zb#*yZOA$79Ne$vY^$p*37vEJdYXnuHtTuTO{`Pi3l=M*pHzlyp{wrduD;g7=H(Q*=9+K! zGvOlKzGdpIb!va~&tBmwRYqZ2-bnTcvRcCQ2zRc`v|hboCgubT<5oC6g~(_*_C6~4 zsd8yzUobi)6Ex_w*9#?SvDR|eU@W#?;`n_LKD&#bINfk+?>F6WZ^{t27`w2sQR685 z;Lu0(J+4a)d&T4WPniG`BllJj*o_7Zf8({Wzc3Eeo<2Rk1F0d~3p2{n=5`D*N6 z7ToP(O3%N~uhd|fs9Rpj6;oq zNr8!uiit;w$w-2QiHk)@iHk#qPehDQLWxgCh)+d~PeVw6gGE4yPe{&6giAt1PEA5W zK!$}z&OkyzNlQsaL`BC;%}NTOrvb2V(PQ8;Qj#!*h%j?-v#K;9jg6J4jFowf^|Z~*49x7zEc6tt$;fRS-EB3$+388xIcVECTHBjyxERa1 z1mL;qOStOGyZX4h286jg8+%ymdYh~Hm?`+N^7z>s`nlNn1$y~`68sZ#18g+DI{`!7 zEJLExLXyCt$Yi13uAw1*q2UpsDMis~W7RF$Xdf#D|KB zB01H>(=9HBrFbT~6K4O15`}!?T;ujCo?0y>aE%73;&atXtgTSVJYkx{Vk+%=MMTe& zgF>&t*+@ifOPxs~m+~KyI**^TX--+*X9DS$+ts{3i0X4T>CT4Y$W7+$s#`~UrO)&^ z`_w&GSF;ZPmLnmp*=Gu6hee>en_JG{IvqOq33!}Eg=C{8yzbO#mSpcLd|o{?|E`|; zjg?52+o*OGoAL%X|Jq`n#V-{1wb*OKZ8^-Yu6%G6<5+#tCE{Oi1f(*ap3^DVM|?K z`K68nWsNnyq&2N~dKe+lmQ3Cx2tbj@iuGcckZGs8AIZB@MPk1d(V69KB&}PCI=B~zfGPj!#e&$Gaizv@xWJ>-5O4}S4-6%5>j1Gamy@E>C8!;?}|~H;aSPmd=7mWn3BlYj9${u zuUF}O*7+Z^lCaadxUb}m>9{3~)8Te`Z)HPe(U_}^mM=f=p2s?&J^9g3ws&)Z*Pf!) z5P9<3J3tNjX&G6BS z9h(b>0M)_wbYkR|>Ls5*tHtDH zk3;J>e87KJ&b}BhTQldC->zd8K+QeICUfgTF6wnbnFdoV)>9p^T@nf=*n1`faMat~ z7n*}=x(Hu|+FYbPD7K?H*;&C<%y}P@d z?y;O3P)gUwhYolI<0=BnJTf?Fzl>j)>5vwUA|Fto)%hoLF{@(Qkv2!WT3NF5?}C|- zRf@vWJ4iz9J?l>nQu?~aL;Ii%90k^irfun>>ZctOg~4IJyvZPCD!6eiRUY2{Yo0la z_xKw&Ul>a>EBaO=a7{$`=_xOdB|4d0;%KqpO{cUohY)xpezITpgt?or80+wA8P?@Z zE_%Hj6?uZra#2+x2g{kV)K<=CBhY`PcIo+@DwQHZZ|;MnCEwC~3Wm*FiuWm5Gl94e z;Fk3z^c2Gqu4rk#{sOA&2<5cCC{x_5*kl*(e=x!|FJeoBStJE`1T;9>EM41)Eg1eY zabRb_zUtKt;CP1n3K{Z#%GZ%ksOQ_1o^_(w&+kyy2d)3Gls2(b_=Uis>1mb{1@s(N zD`~B~jo)Q(k?E1k#3^BjP|&cEnm79!Wqnp>!mF%LuV97wPYgrJoZQJ{<(CjGTD~uQ zfkoa?VV#uzmX{dZscH@7CJ?<%LMe%--Mvw-dP#MIOp4H`wZR%?wTiw~AUAC|l4P9m z=%Dv-HLr5+)G*QZqeA#u&}71V;=lP zTBo7fd;NKmBhq9ZE44>uC+!Drs`hH@oI15*Y6g^W#XNNHxseHG2dqsCBzHsK)sU3` zlRz(Y_^n0gn@Kb2wL>9GAu75YZoCiWqP6sKp46&+uV@<(<&E^6H^bMf)|E42t@)!t zrl7el`9tGpJL&1q!HUbZd?26gk%J4yW{)vEzIOLpS%z|}XPYe*t_X=lnZCK+_!jSz zAz8Zvg^zq)G*I5zq`YJRJYifrwA`J$tJTrKL;)v@vs&UP8y*v#j%Ovz7(>%=MNt=Fd z)x}V@ZJi7*mTiYeLQ$}MBw_~U_0Xgf_CtR)U zlC_Kp*=P%0z*EMLYd!%rt`DFe^fo&S!1 zzbhIi%Vz3R!(P6*)}KZ`1dfHuewFSQOzJs&4!xEs1hl&n{b1hjqzz4TA3bBod^X7c zPbR1QJJf&FyV{~I_}_%v&GxgjvO7aN{xkEQuzliXT-lUxX_s~YID`MA`tcYtE@g&# zNsYATH)eW*SwFll!}6~O@Z2TSwChJSO4(&UAwj^puO z#qo%O$9|`>uN-#AVQ`QtAaaOVa47KNx^Y7UV^z>21`O>k+>@x>48 zi1eJ{v6`h-PJ)f{m-C)E4yEws)T<1cZ}-UDinP?Vjo{bBF1CpA7WHoh!FPF5N=AK6 zYHVmmbhgF$_=aA)BTE=Io!O#EV>qf^P`Y0XEl%1;U2i)fm-`z57!WJ!s z_o0t+L%9lSl?;g%NHJxI)XoUNStCZE_3p!V_j^$}v;AIe#h8LiFBIe5UK|r@>zlM4 zpP`$vN+ZP-gYlYa-+>rzW~=E&tra6_7;O<jc3Q~>t)Ah1g`1kcD!0*dFMtF z#&u=qazAMP&;x8$xWtV*HBVTLVumg~TfR~!m}fHkLo4=l$6H+m&I-t!Y;&ISh48mJ z-qRO~pT|IiM@-@e;SiPW5|j}zx|3W3YcC3nyF6VG^WO?07Vn0R_D5qTi zG&@C01*Ns>Y)=Qoz_{g4i7d9|%z?{&ZG!(;7D!?j5Zl{o#46EjhD=5jMG(3Y^SH`J zl?_WpbgJhG+lTzH(PJZWE=N$r$};8rf{hofjyHi%r1vfPTN$IJ7d+;bP)WfprBH@d zrgD#%8yXo)Un%C6ov%2q)X}LzV^>lJj@N{b4g`e*cQV0|rZKvVpOjX}tvf!De>FcA*6ef{k z9LPaP8d(qmjOV%N{0hbVWGQ;9Lk>4mab zu%?ZXAs(kx)g_i+c)B9XUX>y{q8N!$AjX=!JgL*dPx4ug(Uv|eQ=JM)Q_8Q(lrF3v zAzdLO7;stFdeVjp9aPWH6I7Goms9IRRBV@BSy7XP{9a1WkVeDA#86`!&{Gsa*Tf&y z@bZ*#Z^g#ut)-Nk$k5^JaMi?;O{>AE|DqKdx7%ie5F9q!THI{^)J9V$q>u32j=xh- z2{xm!)qM%CPtvl>((Y!_R~*hZ*aWd1wln_(HlZmhz*c0NWhvZ7d)e4!yb{$IU0R6; z6k}(0ksdYO$owLO-^p?2k zp3ko1z2uY~i%smQ{D>J!u?6qmU_i$tpA!%Ln~bI-tNnAj8W3cuh4&@S49G#r?jUIX4?`@y{jY*7+ZuYhq*CS9$ zxli^ZdXDWUlMWx&c9mnU90nR^8w2j;Iy*hRyt$=&vh^h9&Z{%MSzW})I0I(2k>B>R z{2Y2r^Lp%Vm0Z6RvLk8}_>=~$Z8QyOOGm#utvHZYvOxL}(VSRb-r$XrlllKTs zbO>4T1X>P0O)Mv4f;YwiB>%AB4Ql$}ysHvw;zlFG{?bh!n%?dm#n$giqe*?q0$svf zwa)H&IrmJ`L;9)Z>2!e~!nlfq8{6)#eT7s^RYh}CdOFec$O4Ih6Vba32`ExcdS$6N zr9V=MkUv26UbU9`bVWkbYP%F~U6GE8rLg9MihiAjuT5spt|d_|r2b3XTd~|Pt@C-< zMgJ`-TLk)7Hr>chK0SF1{=-MSjY>r+@V|O5J(rmh_o|R|2Ib8a@TcbNEqPs8(xMJR zxDLq zYHMaTYCz<6?E8Rh70fWlK6sN7s$ub1t&kE}eJ{jpO! zKRyR+0j=+3^<<>%^^3RdcLp6T?YAf@b_oOy$X9J^ZmazQk6!dub#APi|7*XTy}#a3 z-vlR8NtV}1>&xt?%t*jd(RJI(U_vsDe;l?i(yB_j)%&^Ro63Vs#EReJ-pg?%x1&*f zxw7o#4P!)6e4qIUA4P1hr~5I+afVB5_gSn1olSjRe@PFrd_(wwVypBcQzFwp=i(bH z4+cags4&zsjKcxxYz;w$&X z@Z%#OLhfm@=VTL~`v5qcPIWx@m&6jgRFr&fb*>faUDQ*TNhaNg-G0zzQUT(I= z`^0?x5=i3D|NcsRil^Y~Y2?<@XgG|DpMd;s3zyhWOuBP8r$$Kb)qctPEBsU{agR3_TN1A)wpRi(83pS9WNbBwCUb9GfK#4<~kwxXBk5or8_J zTOiJ(7CqU22(P*K)h-aOa=+A_u{0uQo^tjj)V`TP=0Kzb5#XfL(sZJGq?ib(d~yCv57vBUg_PWeAC`$`o4$k>~Pg#+KJ z++VvVNzt$GjTlAOd99QK$UUyzWn=ew4jU?jpiPm^<^;9l*S}K7SsAu!_ zYcfeWQ4*VmKl7_pZ%z%$&%vI?$D#}z#hUBy9jC@ODsA^8Y zd@8D{@yV6@sba1;-}$2-CO}R;EtrvIM$3k#O1)gAL_gy~yH2}MfBtRlQaeq4*f}1d z<7S~aKN-!kcI9Zd1D$U^gGuvpKiyc8_iW3@dMDnO6mMM~^YW;L&u2kcKl5B+I6`rN z=8eE*bIQ+1#W~N9OJ|9`y5j6Dxu}{04Me_63(2zBBz^p= z8)3VxxdS3P$M;5lEY1*K@TfBVuLMur4?U0Eg(Bxi*%u+!1# zNsany$4bYr(1(eVNPZ8NDeapzLI7rutChrN47AY>d!-E zH&b0pN-PUJ9BmGZd>5_in!>9j+CwL%p7ld{fV8$ASYnSmZ8)KM?8Tq#inG8A(|(O5 z1*ZH)Ne=QmbuC`DGcVzzDXw+-X$0=63cYWJbIs(74qm&q&@dTwIy`;MdKiiknarl} zUdifiDM7%Mg3Gzo3CMBJMpeZ9kR+dKy7qKfr?zEJ?JddCxdnK;R08$bT-5{{w8V5a* zDrg7hzpfy|#&9B0L&;5jdBg z;!&pq#blHb90Pl@R-yLKULDNu8oElYIB37bbJVa5XlCqL;yp74jWM zlQJK_PEeuOoh!i$5+kJ-vqW$&I${fPo!}QYL$FvYd0wl^?@bo>$DxEKq~wfbo>F&p zpOV1Yc#)-lOhM5LDfUol!=P$U@bR(8=>O{jSZ$BeXNEF2wdNZm5O7VIMZ(?$!*--2 zo;+Vy#ly!&cG5>_2>04r`{f0&x^PR-DG)+fi55@4V zW{Kt>f=u>+k(?PyCa_g^O9+WZT$7#E`GT6pjBS$S#QZgnVu@{YKXZCbRwXw8X&Y)^ zy{)RC&fV91Y52W*_CTXt&}dyPf>-?`bif9lkwMZ?vbZ0L%7DW^ldREGQ|}kQ;lM5(@-%kksbfHSPY4Dad;YCdgfd& zYUK&Es3A`54e-`NlRR1qKdq4$u&oy2elD-8c6kFZp@AETMduq@PP|8fY4-OB2})a% z6oUv987Ph{J~RYr$&d|VvuSpQ>?O<@^ppe0+}Hy zszJi!cmfBBG7A}{r|^m1<3Ky0uf{IYnOtS>8SUREdJed0*}SGab$&+xO72{Epm|6kvM!{ge{BRtIuE3s)dKZ>9D&g>Aww)m(wEX?Np@4ENFM-8gU z!%WcG2ADy})(luIg3D4neoj!nO6zkW8WGhcyj~(KX{g<)o&};c>LZvUw0^@(dV&+h zNW2&gQrva0ZW9`<)bp%?rLfe_V*f>5n*lZ-oXVuQ2?vSSxg9pYAX}H&<0V9ei%7q`2q})hGC--C!qY zrd{+5#Jon*zw`1_#ro-9PfV?#1jlSlDBMp*wNUSFD&a_`oY5U4^mkt>{a+GZ41YkG zIUER@MP39|VyiH9cJM_VO#c*MOYlUrsG}YKU`C;@WtYlLZbX9XJ&v5hvSn;R z33lufG+bcQ#CkCF)&FzFhBzJvj(x~IbMe2u)w@RT3y^8qjqK z&m)Kqa*pH{4|eVcc3o=^jy0h0%9}oKaBF z^Y0&+B|%lrOJG{>rRgc89*k#voWJ+6Xc%H;36zJi5q#Fw73Qz7njsN#rvB%*url2- zl@vunHYM7R60GWz*i#i0W`*nJj~xMyMW5al%Vi)ro$W!Uwp!~{~kQG|K>QN>vjFf6`yM3NaH*7Y?7Ha*AQmV`pcF7s*1{wG*z9RgNIM5;U%~;}s z#DRnn6MAf=ouV45TM->8jfV6Udu-u=V*jQqD00gsh@i#lTEf)HMa21sOiXPkI7}qZ zL9C}#xW1QvGrP}Ny~Wv0oK)f4hvYD!r|8e-8sasQqoW8TTLfcY5S1@f<|sYX)3+P*4(Y5eSML z94Fn(1m&_QLkJeMl53C;KZa1|q)JN%*lq_fnZ@6B*(eYTN-)tC{BtEvXqr+aktOmz zX2o?-Vksb?V}@YSP9ZdfMmiNG0(+V0F+xdS#(R+_%tuT9g|xBfMzE7ZT}sR8dd9$M zLyC_Q9D75!y#u;j;@V?aM25mUzxhud2m?b0Q(7@7EGn7*{WYVK!!LCDm*Rh+q1n}h zVmZT#iT`=w`+sW6I6C$iwaJK3i$I=s+orPxGc#fT8gm@u`@jk*+70Dc8xvWTR{f9- zJI(l_M8K3`m|S#AqdV?Du@!cF1rhD#D0M-T`^tFj5$g(*W%UiSf)MmU05E4olzBL7 z-IRl4HI%E!fTo=Gs1RqL804jVX`awjju`K%EU(8!*3%XU`0|nx>gtYIA!c_-15o_~|UBry8cnl4_j_%jj5VuUbMF z!Z+Jxes^`eglG}4x~Q$XD7d;`6R`t1V{3=dotdR+4~4HSc~%I?^#%e}X$7NQ41P=% z`%D&dYV@I)+K>PwSrnmH1j`DRh4Y<_bDxWIXL`{P_(CpcrtDfO zNEiLw>)tWYU>9CO1|dX0NQ~N>E-fBDQo>(p&I1yWE<3Rv-Eb^ zVL`+R^R$stif}iL!f+1F_G&R#T58atYGZm8&y0?WbB=MaL$RA`v(txRsr4e-YGnv% z77#-z6b-;?x0m-WAmCI|Q1l?5K?0Egmml*(9@Y0m>JxPmuC)->j!U3F5ZY8)=4ZI1 zQ$VMEW|AQ_Sf0rxv3WB$$%!-?4gkR{BIE9`bR zR2)N7A+Q$Z6XMLCA+((>XHFWuX-O1zxx+#PZojH@O>@5tiisfni->xTsHrf9EKnbP$)u_{+BK5)kA+oAXC}Yz zt{3q~Z(3^u2Q2byw_H+J{TH(SfKaHwSzS18vl)# zX?jdk!mA<*n^NKhI{H0gqJDXTr{VYBMkmzRlw6K$pfD-bY`Uy$DZmL1pehAKG$R*e8*F>K*RFE!cNy@g3hYZ6| zcz46FhT>_vJlM)m0vecMugSAd{cM-;1}(7rN3e&V(G6vvKfa}nWOp?I#ao&ghX7jh zms~VIjK7%yQ@$}c*6=z-frDm=v$az|q&Xr;16$Yte*W;}Y>sC(|?mzaQU-dW2pernEqQXHVsnVgFPD1oNoawp-5>+?lbd( z52}XhFO0&SmG|<;>Tg8^?!=_?wi&vz`zS@4q_5S!5Yzh6J*OX1RtD4N={=5dWwtg+ z`e{YY`)8F1#I#snEHG269mlDO8g>YI!cKyY%a~_Gc@B>D4`<5+;`@y+Nlbkrwgzv_ zr3wW96K5#BYGZVUfjI|CSgB2wDNjTQX9Sh;?Hy>L7=#%qv+>CEH3?e@AJ#e^Pp=tq zX$sxUSLLkjOpP~3I<#Zh(n1v|m;{;c<8DdJO` zg_=n9?tkz}%|jAHT!9Fn z_0Sli87)()PDYnc4%hW#hoq5mHO8A+#N5tMF%PHRDiu+A>7~VbQ57Kz76;l?)yiw$ zgm=kRAaQGtJqDn1_Gg`~A#X-39YM7mP+^m|P?Hh1Ac8WplUetN^*oS}PS2w7x^&;o zR+@d6v@R$;o}MX$aZmV)aVpHh{c6d8IYH}eUYgT2esJ+q(EXEHZsM|J;|EbZ#JKTo zESmj$pR{U%qp-+s`Kb}#?)>ktY8jUBtCquw`FZVslir$W@44a@x1c)31Y^%+dbr`n zQz)k8>CE|vMY&~(%03IDuE4(|Oz(*=XCBtnbDiHpSG^@LOzezK%go}_0P*kRXC=JxI z(0(Ih7*=bGRQvNCX3clA+YUKYZYMx+dkKugVZVfk$i2CNvpBX$a+vX@QRzDzLngq= zgvhn$&-t4Ok+<>i1huSh@I8dRYUv13E*dM_xYfu0{&vTm8qZE|OZ$WMb$ACvBw4tQ z*us2Ws1Uz1mG>&3Xv_D8+djcXumWmKMxFY@4De;re{a1rzHdJd85TKr{{gKO(#^>3 zj06FN@KyB7!w})1;^?na|F!bhqOAok3a7#+Dg@E*fdXfadW$Te+cBf|%)Rqu!`*|& zOem16jKBrXd9-{Z^Z$)oNc@u*E#w?|8#spgYIoHix zn-C^C$D!*U#Q4_`vj2UV7rJHGKKp*x{G6MTWIJlhQ7dd^st7pk zCs&1~=tp0F-?h2?+ArL1jJt@;Gq6YFvprEU6cOkcgTHK-DY~+VA_ry-#W8HHx9vc3k7L__(WQ=L zltHlas)dg>fr3ZDvHevP27=OSqWAqpDFuS}G32Nkh0B$W>mkT)Wv5COioe(O)vD}Tt;h1-e4^$WyAP0+G|~^stWSm3HMxKuT^Tqh<@5> z(*dK4JMQzUAq9-LgO z*OZDFUwHE={MOrX)-Z8{_i6m!=|wmm0bKbI1pxa&=R@s5%CT)j-x5{Kl8^*s*-=EU zbBQsANGit3^lkVd+NjSbB7u-G179Uso#*S%03;lez4nVMY)t zqlY5w#l4SsW8ErV+CJK}+O-qtF2aCpn3{^ssWfFIa{Yd| zzmC+Odc7Clt@tlTvK^3$`Eltn7#ZGn{iXOZIsvSZ6}n$k?HeIC@h;u?hugk zFL&I(yx?H+itj)0AySqQH6F&K&5iR0sb2Q>h#rP0&MMJVk`C!g^{eBtjGL|Iiwd}> z@^kRQ5sTotx?GM`LP|eGC+}&Vi7DmBP?W3BP?1uMljQcwZ)aEzz4g1WxzgQdUT=~A zZk>211u2cePt6$DQpkdsSUZLtT!<30&?tmS$Rx{cF6}cE_Z}wi>DGDpfejj+p->-0 zmjDRP6v)%%bad^EuzZS1uWu4ZkmMz~(L4(+M_;9hjp%y#OTKM}BGa9L z55>LGywf~)pQs~U-24K?VJehP)wXT|R>ObH(UQaDvNWGW!zL&-3lkf+#mW!XYA+6T zsbjkyXC%VEZ95@88Qg#ESLZmnGW*$~IYXiBpjC%bNRdFGK$Jo$tH=F=a1o5hs7>eR zpJL%XG$za^6BRLGr~yZ{1L+ar3|bDTz-qo2l2EzPPM6g2crJmU|1e8;5m$r{9D=8s zpheKG(klZ{sSL$ma%9dVVYt5uH}*M*9z5m7bHrm7j~qb?X%7uIK%Nawfsqy+MmLVbAQQSC z4W6fwFh)L+{m9I~n?sg_b3ne-NM8l0WzllyqjE2fVo3Keqx#2Y%o@|}9h|E8tRp7~ z!cs*^H0fZe<6e$~vh-Q}uFPr@h>1I6715~BOI_HRoYJb8o%J+2!poif&V3^pszTs1 zvGK`~@ZoK<6%g2WlktHUuw;4ioXBEBCJt#wUT5W%xLXZhT@t_ghWVbCz zAy=eozily1!%n-%6%k`t(K^W9fMS-pAX62F%4m#<@7iMkuSel%zh5Y0u-XmH4i6t} zjc|Ywa<+(=v-B=`EomzpJ31ZG$NHdbChH|MdXHI1(Z!v#`X2Yx;xjP2T9k4ZV4@Zv zKRry+ZXa>Gvx9cEM8U-o6euVs`<2eQz7$-7vybUm`ne* zD)fq{2^G@};KnSvSXqjtcxOsbS~<81d~I>#Gq)Jm-`M6c z>tSH7|DphJJvDTi1tSybR{fcyfAK--$g&ac-HjVvSn9=ZGW_w#gz8BU!F(=KU#h{e z-8$Xu|2^K)D0s(ryw$#1eRt<%pRX3E=ato?pu~gn(z9e`-dpI)mqm?dh!Qq7ZQTrw953j>nY-byjJ0q57sT5Am0!S|ON?ROKSJCq+;@!XB^QtT{hyL6 zjC&*``ayA_6OtcurryAD4i7eJM(z8FLZLxGU^p&meBGXY{$W3!(bs z)(hR)4&HAcwx-OL5qIB@2ci5x%-rf{cZZQ~ts)+Wv|-jIOvb;_dCI>Z50{+PWMu!W#kb@4or~GPBbSRR>URL=Fo!m+TC>}+0&B#zMZhEj0@Dul+nt& zY?fX)h3rR8piw^qtxG&h{3$!iiH+YTb}Da-$Phg6fX_dD-6ID0p}s(1|Z5P5rRM0|2E=!EV> zwFeel>z6?4R>&o2fi6{w=K_K-RyXu*mS6!(*vCUM z#)n3^VsS3WB^1q~l`R1>VU<6=OfQnPZimH&3Be{X#hAnEZVX2AA*k=d^ALbC39KWD z9G%P8^&S3cF`gsn*kWl`J@|yYF*Q?G^QhmrSifv_I3~0-#to!tGx(ixviFDJmcU}S zBdl8^RQIZr(Kvl&GWn!%xAX-lYtjROx>9YW7rJC0OYl*qdh=Il8mz~nM3xK_sddN4eZ*f7JBv@jX46Us0LR6U`zYz^wa+)j5xq3Fj*t%J(cUbhI=AsJXh4Li_d z{YvE}w8}pALieVP1$Nn{pp=}=xR&GH(~Vq)$nq1ktfkd1mSr%pa+F1eU@j?DQ{*9! z7B6jeLbE3kFSXIyP7*)AwhPbDeu^#SrkoR{_jg&)Y zhf-eyTvWCRr*@5GC{NBZ8xw}$bQgGtK!CCl?%)C%0X6!+vsgf&SBA1x-%zm_P4iKy zKoEfdkB)NeNsC>H>j7#3XxoY5Okz)kt(w%giE@UJ5IWI77B1V-f8FQu#5O;Q{aot5 zPr4BM!e>}IWN#B^(I3af70$F&yw*Q1j>&=dA?Vz-8{Msaw9aUZlY#`+`C3r~u1W7uAjntGW=)h8j*L;cpnr z5RH=P2rrdXS|WvLFdS~5)#|ZkcJf@jd9<&vbqo@+fc3d`gx z<9tCB!mx7KlS)1NB*Svp5U77pRG>4iy(buo?W2b6gOT;u2({dBsl;LgdqHGkn!+?B z20?;KF^mP{tZCv^?$S>5^KomSSZM^Kt{VhD<&I!XX2E$iD{s8kG97Zv2y+V*Q=VDj zIU}k1w(HDSZ6D$#5+{`+84R146p<7|#c3FWu>Cuvk>oFoCY)nZRwN*Ag-_Y07k4S~$SGLv66+<7EX3|*k!YPUYDMJI=^~)zWu-pidLvOU6=ObLKPKcntkSjJ5r@FA?h015Ptj5aK#Y zJFt%|QDlb2W?2{$QP^SjPG<=*Go?aS4xSlykZ#0*84ly77{K|;8q8G&%Z9C*Fs43- zKEW?^1NS4zy1Tv#7Tx8#-M900JL<|NXR>bcN;uYGt%{g(gfDKETfyQZ!K5)kbbMFP zs{nwug~0!IB{e2@W_q=tg(-cBbn371W)I`{gkyWJh9_gT=eNtPl3S?Pi%UR3KVH>N zMT1MG%T@CsTNxz5k~nYV5$rGR+dnLoXuD#`_TX{6f>1k?v7e(W!L!XsaJd?WM5ql#NMc7c&{KhM zeE#?uQfKG?NLhE6V)^X6^89lN&r$uE6=jz^&Z{QL%JBOFI~w#UJ<=x4Wo4Z+hR*oc z4a@+YQwhn`!KMB0Y8~Y!7@a2A)`}6iJ-9|g#76OUkuqmYao&!f5c36xiRhQrbpA!) z&e+SO<>{R`cxMh$4s!ytNI={&z(NL}ebu}9kWv)>EAV`<@3+|83OEGD7!mD*N7~FeY{AfXb^{Ex1IYVjO3awk5Ze-{J{FBI>HLr6N@;s)q>$f%lC7|!-jEIzLo6rb#3dake=kKI^ye%7H>41)0|qnVIyp|2d#Z$ z_GbM*-eI!HaRfoG_)I2jyTj%L_K+Q|1I2FWN*dZZdV$Q`1?!K3?*=H}hZIUr5dV8T zxCV}R+ow0Qb&$be8mfFguj3gnIE%}EGKW6Phl%Nea3^duGLmYE=1 z`Fh~bGEj)hvIm27`CcCMJ6%kN8WJH*MXYAuDqD*zr@Jh0l+Nr`73PVc8avU)ZH~-Gcqn$zzI~T527&5SgC?@ zVJWM6;iKR@5IU6Qd6TJ1LcKN~a82WUh>OAItiEs$;S9I_XG@o7ZJ^!~TNs(pIHy}V zqGFLMuoslu%oj-=q9cgJZCrv;p@<9dt%rCFZosdP1cQbm#1!#%4{ILoGvyC$jE*1$ z4axup9NA973&OWzA?N18m)Pd?se5NBD1<`#a~wix)gLWH-7NT^+vGz?Ra`oJ=cVcL zIx5uPr4NDfKm!JE?vZieGz9nS7!8~I6t_V-MFCsP0-u1G>~(W7aF_a4fMQvDhKe2r zu)wQ?4?ri+VWOlv5hiB4I;?Qi=fc|uUkI$P*lyZ|F{HcOqld7j1h|&O69J)JD7>ce zk;^K;jl?Al1lC)$VP?XqwMgfF&_&|K{AM&pYV38q4SjI}rlWGKZHmWhs<~(V4}4*= zLsGe~AC>`FT8FfxOG(z_8KhOT+8E_v(M~*23Zq)mz=}CqRtZ=PNYUJNyFaLb(3Z zcT~`Wo!Gh-BmHH;Ecw}P@9abYI*b!!*Fx=hAsov{*7vlD{6oH0ODNO#Wu{^xSyeCEtoOWnP~BldB>!dY zeyW#i!Ex^9l}@iL;1&+C>Zy3HG#F0wfc=QYggX&SMe;Rt>TEs}e1wKp%D6b%uQCF{ z&(>vnQI4fnal?sWrX9^h^LT87dVSsJFYx^0r$KYE+0S?@MEUgQn56c~=yCJr<#LSu zF57<7IZu3@+yU68<9Rcv*LO*OiNfuW+T1hRa&O2b7kT$oi5KtJ@FM;WdUL7g|7yMj z)2-|W;bO7vujtTm9N36&W~fMCS4pT%ALk(x{%t;_NEWL9emB%g8GOk%Io)+j4%xjZ z!w+A#r62$TT}8`s@Bv5?m@*A@`bh#7iv}B?FHbRTm7?z)9(i_sXrkZO7QLWZYB9b| z>)OOss^2_Nk>OYwY-Vm~7<3B&W<*3oJuG0Th&quNj3s$W@;@UgHWcXLBdvncRah@wbgiu9(ag45C2 zpk}Q`D-2=~vDqpyo=(}!EARWv6`|;moXb44^iZW3@}RG(*Tvg5ubU#H1?heDJXeuV7r>}2Wt6}US3~j~jdMm8BD+(?N z!_zt*!^_WmLLaYf!l=2X{%{!Hqh{`h*L<&u`W5ZWx2o^tJ?VVXKQOf!8$8OZ#RsTl z?yKVSdl|T2lVL5bUJcewh44(jn7|OVJ(4Ob@Wg4*ygzIFPE(szGb{=b!#=l>({EjK z1TJ^e5CE`2pB1vqW^EPv?PS@kv9Hcc)y2KYZ5XBTb6cfK%u3g0FvNE8c1UeqXscEH zeKxw}OkLI68|`M<&tApvx@hsUP2Y%4N6=x7n$ba{ZA|;Zu|?2mj!}lP>DzLw>ORr# zxw9Q|w6NGBK_3G%f75$6p0ti zE$~OG+RYfQ=xEionqMO6b!{eEzc0n042`ohg8(3bY#mp8uqt|X66=CYL=e++F*pTO zSz5?x%gvJXk!sX)8v ziBVNEkv7T%q3S8@iJowtdq`Vg%1>2ZZDIi8oHVag$N^E(M*W&0g9|H&7)Ed<5qqz& zn!~rT=DZVa1gQe}=1768w)t=V67831G!e3}cu%`*-&&3#r z5akVY%JmUZKg)U_^BIGg&ouOO%YSgrJ-Fy5=Yv{9Hc7i7hIpcB6UK>;#x*y(w&@%r zMQzi6kxz>0Vr z)TwsPmSPN}%Gp*ZXAI+;3Ql|u-{s%y9RH0{F?t;y(vTBXVBQ-Xv^ zD~N^M`K3>6e4`H4m}4du$G=&!CbttYj4qUsM~w@!eTlGnw8W#VX>tsPjsALDbgB+c zRm#PZ{)9{g> zRo|)RQa`pZvGJdjm0l2YbmCiFc=AwT48< znX4?Nyu=oh?cga{+bPvXMu?Z{DRf8q-`9lkVP$vnf|?>C?{D$P2uzW~{lHo)N>2P~p&);}g&T5+!C)z3+x` z2F_iIwxmkKX_S7C5Jh)-;TAXF2F^UyfUra|$?&bFoP7-&%;6?8@S#y$=^BFD$Br7gw{)W1x|PLZ z*>UL(hI^|i!@)iH`Bo}pm$3L6gP@sd$r#L1cU30VQL=bJZlU$tDx2_~TX*!-{~R4? zNW1Sc6@E|jn?tltU8k`5++JBc;c(2oN^7DR$jqhsNjR=SFsGu&9HxuEuLIvW8fMg- z-H&{1Mc4yMF2;J|otpVKuQjFT*vtx?yk{)MTnyOsIP8WzD}gC$jq|LFPW7CFX&w@^sPzGqg;=ljP6>2 zNmceQox^hW^*-zZtZKfBt(&}+;01{K+nb6e*zb)$S8nHwHW)>m51jR_&d@O|RGT)< zacjvXofHt5feXK1@pzrK>WdRqQlvDeu!m!NO$Mns zhLxr$_8QbN{GD~;#c%4BV0Z7=AL^@)*pJNUxB;(S@u%)SX!}MDwpU~L2MPsm+XGkg zvdukxrN~}Yx;DO|BhqQgh%BSM{Ts~`26dFzh0RoZlNbHlG&8<3gOczc)-?ZK$(MMo zOZFl&5oWf&uGY`&(t4-@fgJCK;eF(1RtXgRt7YP3W4!)VLf*zNe<)#FO{v*6g&=^% zcNZO6tE1niug)I+0oM(2U30_#g3X>2r*ERoigw?@bbZt^rvy~%gC^kU^zrVNId8N( zSJvk!;BUgPM`#ITi+cY%FFfZIi;>zKuhKFdJX0n2)TL$l z6m`%EWJBdc&1Q5r7tIU}>EEaUgb!?S)C> zkR@zG_ZU-JW&t2@t)_S2Jjm~Dm;JnF@r#ga*>(x#aW`L%Hled^=8+-PHei=hAW}-e z7KpMvQ$NFU$lzCp`Ii?ESCAC<-_#BDV2Xi@cazOBmp9=sKP2_xZ8RuScgu$6GC(xN zv9{xlG)-p+|0)z}aPncg_IHu8zDLB{H&l49Q9v`d2u33pfz_pZPKz)XV1FP9T+gj=@Ah#7$8q6Utt(=wV1B^Zlri`QHK!!@Q&!Z#}9Q?0XN(c4c$XT+^n`l zVE=+p=9Wi@s~|!(9x0w;lSQ)Nj3S?@Ld#o_8B~O3Kps82j@VQV zvtX|Da*)urJ55URu*wgG`||+0P~BOMVrji_TbW#|uT)66gwn1kIv&$4efbOcp?Tf$ zq1fq-IK?hj?vZdRfMB*Z9;SLwoITAN<68M)nGxR#iLGFobRmJGsrjlgcC>u{?jVT* zlkOKTJobchgQUHdv11ut4GSAHA#(HW8S~%7nHS9)#2iFH0CHx04JR8617Aak{mmyg zzyq!}i53ZrZxNb|6?sg)(zu=@AX)hPf%vy0^N*0tJz6Xm>h!00X#K3BH~{HE((>nT z!ui|c85Z-$GH7x#fgO!R6Iq?hDz(&I-?_tLQ-37OPh^Aa4wJ(C^0)SBzD zZwqL5GF}NY0^o_P=AWR-*41+tM~|FO9S#ofOy^Y{e}{^r@OZo`e=1C_vSa^orYd+o z-;dRxC@0nWyB;@Y3A*ZzrNWh-NA(yBM!OjRma#++T$K>6DuSZ+_T>_%{=kOKDr4qK zG^C0G|H!0LznT0`#blw+lJh<5&R~}0V+wXhQ|?69HhP|IYr0BwDU>Z{ z#;1Erq-D{n)F^O7{fYb(yqA|tW%4UWMRt8wMaQ42lK!?^F-(;9Rg?@_xT{s1PL#(P zh!!^Fa78$4_A}`AGlRvg@D1ZuY!=67!YGDioAt#qq=>l%V=|`NKoN}2?qoHsNK$nySC~AcfiNUJE1mcX-s2NILVDCFQ7*35qtZunchHRIXY7R=<;azc;_5dU%=p z9!|hbQ#hAJ4gb{^o&DzC^}+#27lxO!b(-bCopYze{Hvc9P$3uooxvW!ZuJJ>hQ7j@ za-<7$P|kCikbcCTdw~Yd=ww7~kWZc2>j>($m-bpb3|uJHm!q-JxS3oPUqe+hA(5Q~Mq-XLxVS8heA>)DjuKfMnQo3&a_@qON~7T_;}qR9&!(rLDMy!H|Aoqjja{7i(BSLk zeSELkt`c@CpBSJM0d7z?z~aD(2$}wUz)I>_VzwL#I`PrJP@CFb`(?B)s!d zmNodAQ#aEhy9*J}d)O$m{#6@1epbN9I{&vbg#-usI4TXY8S?~dzcA&L z<~C7SX3SfrNDSW6lh$H5FvQqw+N9(1J2MJ@DUH%M)0HLHbOK%sxhVl_phIiC4ht$# zCHi)XV*D74yorc=tN&C;uHIF;?w3m+9P27rRMTy$?Y^^q^OZn<3`_5Pc^{Q*Z8wyn2y5*W#T$>hS;OA)l*Ia%CW0QA$oSN zQD$3K96_8H1-P*hj}}f0CU7 zOQf{}>BnO9HI}i(DI?rw-X+DewFFn!@Y64;A|giVf!AyB-+-p5iTqL#DB0VcY zj?Zs<(vcNg3$8Ec>(v|n*H&Fi{rWvni$(D~9CjIqgEv2H*DsYGY8h@@i4DG~H$wyz zoi-2pTX|uslSkzgFGyZL8Ey``C%7!!p+72R%9v?kTRCpeMfW4ckn_XG%u{k|)j}=1 z;s6aEwQddXUPRB?!xX+IMc!9-ogH2HZ!QC+F7X|$K@TTK=uW&&PFWi9C*jMYV|GBA z(|p57QXZEgV|tQ8rn6n;oKdgfhV1L8!VHMdj^lN*6X&QKayHxagY_fM`Ijq~ZUZPL z`_HEqrJpid?sid~Uk4_PRmgcqyTx*b2licqz{%=sZjqU$I<^HFW+xNeAa{m*_{SP7c{|z4ZzXyK* zfw?aK0p<$IL!gpB9ZBt%M<5YV^I|m>i$!Bm5NuaA9STb&;|0gEGLw${i@bX4awU}x zB-8Q?Zd)#rlm^qA_{XNkSWM+|`CNQSp(HO9OF$FPNV1eI6*ELg=TR>vla*;iWEXQ+ z+pI+583e0&KkN?%@%sde@+4cU)>0P`r(HhP>2$ahb+t~umJYSkC!CPsbllD5ajZ;E zPiZzD4%n`+r~ACro8|d7Xz$QG-j3ykGN_T#q?YfTD#V z|IwR7w>(^pSHRJm_IbG(8=ouJ``~m}Y?)_}Y2fbNw+mmbTN{mEEB06hjKTcCXK?}k zwB(aWX#7%V-l_1RatY=A_C7ekNr|6Z|7tbdzg|ekwbZUU(Km*?DBE%g;?npN67$`P zZCpTgJoNTm>;Z0zG=F6An< zbaef-mC{`zcjVH|XR+Me0BO}7Sv&009n+4PC_G<%f+!O6QfhCK;6U=9vx)>u2o0Jf zwU4awBEg4HWm_L+YFZUzsj>YC4rfR!kA17PQx7KVXrl;HcXE`V=ITz;Jf2xiYJc`3 zO*$v3QTe6wlcy`!?O{quTVJ zUD)gFEMwoZ&`a#t>`WL)xw^sW;%O^OBv9>>E@ISh*J!eAntSKJ&sHRQQG*{RDP0d( z^;62?z9-{N_?Ne}A{@NC1HbXjcl($tbR2rC>b0TOcR+D0KgsHk@rQD9vPY5MBuynLnYSjHv?Sef=x z*S(q+>XKz^W>sMIe73Z5NO`7`B)qKte3{EXYT}{z04Adl3~mAm^<(a<#a(E+?(`sS zi}fE4y4WwlZsEIoqEK-tl5g_=6lWpZ!MWXW1W#y%^XJT3TJKJDA_ zV-zkI*`um$6Qw+fF=q@VIN4O;3Sqi;BY-2^F<F-))= z<74z{uu0T1ILPnFS)c>3diwzsOgtzqyM%gM+Px-a&hphH!LWpEj%*uj55${;K zYgDXW@=3a=sLQkB5bH`xn%|_jcUW>qYg%_EI!UfGyb*!qC5#@wkSJzrwo+{(E%T8q z^k)(EB73y;o(v{orr0nk_iR*!8#U$Mvg#PlNmE4@ig`>*NvILKi1qOBM>0;fNp9rIfUXmDs?_gM1?otr zq%BoZ&pF;7!hlpg+o z8#e+X5B0R-wUgsRuGJrUoFX53x)f48?D?lmg1mT1r(#(%NfHyTvfP7$m(6p`>sJQM zaJw+Y2lDs7<#VS^Q^9LXTSc}M3Q$ywGBdQ7(vK4}58y3knmX0864V&#lfyJ2PX`x$ zUhFM5$@03yIj6K7vNb0RCh%tEzrHm!@!+E}7r>}G1CJGdi?ZcEO;AWIRf}{|H&&4= zpAu%QBUN9dm8~~#{XIEs9GAWqYM;j6rvD%q{@J~bhvFd-u#;G_=u4>k?lH3Cy{ufX zuWg_n(j~(7)O_2&EgN?wHH}!A1u2fH(kZi_>PeFYy12{OgTKA8mDY7`CNszhHPg$O zQcFz-$Sai+yYAamM18n3ni4lWmv{5^YAx2)xS8w@(+od6IHAFy9jL^3aDl=qYwcZ~ zPL)#WUq-9NqxTu$+EFUK$U;~FyEFFAh8o%!-+Owauj71LGU#a6^5-Deljcp3<}{ZN zHoM%K{gNEIwq^hvsg($!Zz&@8w|DB9Dbvbbv1}o{+NWQb8;U_`BYP;aJIOJJKhtdB zz+jB^vmS8*+aA40$7f4mAZAGG9z8^d|I{=0WW_G&w2Uhy`&AQ}#dq?y8{T70|0*}h z^zmB7%*g6%3#$%Ya9*qppEf|zYK9`QoMQpB_bZBEXmxs;G%Bl$fR|DPROG0ZSi8>m z?l_u}=$=qJKsN;T)HIWRuZlG|_qD|z;f}zu_btx&!R4{~lHn=cp=6IosFQhD#cqS= z#Z_NWZ&_NoD3WI^c>%(Ra#7(hud?oz2K#cWfa%VpQ=Oa+UJ6n~Ko9NuH|tNXt11J? zr4FJ1HGV`1GD6+C90lV$uJ#-waC!?GGpTdc`S}A)=?i;BjTYd4m{M0JtWh%5HP$g& zO9^>T+?e96_}MAQjq(0m;B!{G{OG;@Ig!0`cG;K$aZnw?L@=55%o)+uBVubm7pe1B zIjM-9!$LhVKUAkZcw&3T6iDMQGr_Qh>{;{DwvS=QyRF7EKhNuZ?e7c6 zF%V#O*oJZAw^_v!#keaQ#Pn%ZOpG0Y1#K8H>jrf|#-1LhO}^NNjP2##Ui+1W{+3rW z6DC1oi0&bwj%Ob6N1X-Q?fZCq&&lwM&uPSrJa$puuDL`}Mfi>9m<8f{%nNR=48a88 za_KDjr)nPHYYUZ+J0|?V{qq7zaJx;dKL<%par;ET|+S4pBi_TsNuW#R=k?(zSm=SO?ylJ?nMu@cc3{~5CG|C7VJR75H&4T-2v<`Y4Lwsa#MBJ7;^62*bsK04 z66MtRum}$__cJ_Ik`yD%V>9{HZnIMyDsO4^mTZGzNrpG(q5R@zqG5Azsx3Ssgx+op z@nV2FqSddg6QAOk_aj8!S>YEP;v@;Fv*sF+?n!108Cj)n$%N+U?&{zisW}blu{q{k zn88}mE{Nge^GasuV2s;dth6oc=PnxTi$!`D?jkiBY}uy49I2K$rtDf7g1H_ts%e3p zDQ~f^5{ix0lK@}MaXCAS+63WRL+asZXR>=+)#i7maGwNY8 zt{D%45uD=c0W6tBNFE2|l6Viory}Cy$!YYY8A);;AL@zc%)%b{7?n9k*T7rp0EJ zumfr7H=0rsso?CDA;}dAEt1H+8n+dcKJ~0C-j;;moY2t`8oV4vq#?Vp?nAbbif3h4 zLK!Lbzy`6R4w^xHVJ^~==Gns*;aw59a)eaF<(|=DzQAG!rKxBoWs~(NHQJgq!s!Hb z6#SB=u2Dvn!V$b)ktQwX)C3;h!$I!anj700@S~oZk{N~8?j^>I;ijREP&9M>{2@l#-kL~s{{GBe;dzh}~T}<$vEHa$Sk*yYz&wT&7q) z5os#d!G+O*8^s-eu$pI2T{_fuo#qFOAsb=hKnd_ve)cFJsUT`*lxfe*ctfWU zFZa?Y%DM1|KIfjD$j!(Smfy&KsmfifPCn|S@~DoveUBvq5W%TcrKxZrkg*ay*EXBy z)Ob6uX}jr#v$I&%tukj5M_8&+m8MNJ3{q9@NJJU0IIfsgI7I2aNTn$a3D8Ox1Ed?8 ztMneVb6hv2i>hlCUmF#Ss|j%BIwUiFH2h5>YyPa(+`VU64hbh^=>uul6;Gy4{frm& zb@;~NB+$R4sEGyHTKn=jtJ~W!YQi@=3+Dt}b#Me_kAY8wy#c(psPQ6-4 z(L7ze>X=bu#kuU%JACUs+%D7bKO)PnGz6qN%@ku=`?Bn=(drMZ(rIO~f~pNH(kzPE z+D~0wd6ui5BU;MGvH(7w^XyeGDS*Yxh~br@tF_41^5Uh>E`*vMzp2u$ALw*g?xtL= zKJrYGuBDV7pLW=fj+bhS-+ zN7qC_S$o{53v_~1VDaXVoQVtMZRy(~lI>?khw~vZ!2de83+Q8XW z#*8LbkE^YlFiUqNe8e8*WQ;{wNu&2veEcgTmh4hzCidi)>gZN?*GBUCF7~i;N!I>F z4wmIHVdrzB_ZTsq| z8&}f?9m$#Y86?sbj*E;7s_5sL7`fWYII~f>mGM4d{r&#Nml{_83>%%2-4sYu9#+$Y zxiwBv8l4}EGcyAsU*MBwr;~x-u4&C#)B-me^`pC#NDhxu9# zcIx3(A}4u9ahU zs87;UV@6%$|Eb}bQD6dVuaKjA;WFDMZi-pXv+K(i7gjGaCB;9T$B#2rxv3uf>9eX; zV{#=OlE*8c%cwt5u(e%Bz`jHt-O!`kTfaRo(n= zHQ&X&-j)*=Rhv8h`nhT9rDpI|=VI&rFD$MKpAVj8An8-%wPxh>RZYBsVW1go7Uzry zzvT}#T-VKpp3xOlx}BOE5`UHL2W2IwGEO%fmsGbi_+w|0^X1nSRp_8K0ok$GDK3N@ z*A~&zC&9OP(Bb1U@Gw;{B9XkW?q;|4Ap7qL&ru^8riHdy| zOUvY$_JpE1!M2dC-H4A_5Fr_e@!2%%w$@e66Ta#BT2wf`&rCS{#>Ef$1 zurId=io+e25`Z1T1FYLEkM{G+cC+ZH3NpZ>~iIL{VK-%*;db>a{| zLCSkDtJbVBagGk361_ej1i@{Ox6N$V0;01~(`G8c-+=u$A?|OsIrk+PxXQWZ=o`$M z>O&y?h0QP8M#!@Boc!vA^);2OUdJnSTA`pdrv z4l&h^^>QUrvcdRy&ArhV^vuUB_(lahnsNxHdn{=h3VmHt>?4$j}0yDBtUcUvJJg07>h_y>B`KeYxxUM9aY~uwkX8HzcEH zR}cFvU9P=2@^_n0G^5|+fLkK>H?-yEZkNErmVKV5sm52VFCXmc$(BSY?{0|IC;cRb zmmt*q&lm8gHwf^zZ1*5V%&t+S4%rW&T)p)he!?V&AyKl|f&XuN55MS`^~9f@ZRS7z zxBiP-k$bUIQ|idy&VoqJgx@>BNTD#t#F~r>M4=GK2(;^r8U(>excbhT$SR}}AgJog zl#K@>G0EK4q@GlZQmG_L+QwN*Nm3!mn8L%@X)vx0rv<8XM5tjZnupaxxR}Khb-#noov#uw`sx@syp{aIfY6 ziY$5S&aMM4mp>^O-S%~AD%4nWJzv6V9D@16SyhF7HE&_I1hh+;$k>KoW(HQ;DJ!7@Cw%i%uUy z(|%D$ieVKnP8VT}HHvgbYd_T!(R!<%)#0HY77r5$Um?Q=Cz2-6756d2vb{w&CkQOh zThj^B8suE}FIi8aOwB#WBoczrGopgR`5G1{NFim3A`1Tae`z|DAp8_n~EJ{ht zpdBDsk9ihNt6~BLN3lU4uxG%*z!*nS;R(Bl;#$%b2J*pbmlR3R#EvIu?UZFK|6>Qx zw(AiX&z2l83-47ptr`o92v2rQpfLzNnV_hp7fb3`T$DnPIVKWQ7g_glO5ylq)W$aq zsff7*N}XGy+46-|;Q6T|%-%J#t!(VrvqP?{1@%7jGTMdLk%aV|dL=>QnG=7v3saQ} zdY*H`I#x!7|AzW8QVy*G+R%j>FXKL~%|XgBa2!(uSwd{vS=AvpTb_n?ppr+8#BT;F zv7(Z++ym;fk}R$b9gu51&Uf)quBJ~SzB@@M)`hnnUyEUQIE%GAoP}_71WAw>e*SG& zUO})w8_rF^aw!C41eQR1RNDHaMdY}CF#gz*ipc33r~%pi{5zx&-`(H zkaWK=1YsK0ve2LHgG1ABFU<)4Hh67unXz~2m=eB(cxl@|0{~1o?`=V%xAHqM1O{kc zXLt$oH9!5Q0OqU)+CDQMMSM*#6dV}b6nCh}`S{mx*)-Mj{q&pqNvd(ytsgKBQd*lR zSN?aj)X`ydvUedUsk5w$d?N^Uu4Q)>5pAfBk_L!85+^jw4fs*C4yaWbJB#3~71{Eh zL^dHP>j(|>p9Ad`(Q!x~UqYb9bD%ToVldPTL><~j6-Zc_A(`1=}rYZFI;+F$iI~0CO9YjnUPS9NPrjlmmRU{?t)) zM_9PK=ELO|vJRkwCfMd^Nla%$aKp_yE5Ark+rdUK=^fMb%*R6sdoXPCoh#Je5BY(W z8y#gol*!3SXr=7X69o3*DORw9xoeq{;JxQg0ldOS@}?1ih}yQ`PbQmO9_MYIWpioP znHKybX{2bSN$QN6gXB}^IUM%#Nba69Se?xvo>_ZFv$W=teXJrlABy~h|ap^_tP|MMQl2B{OtNo6w!})m$8YiEW zI_l&sRcBYI)W<}6kY;)5UQ`CAA3(np8kf}X7h_sl1dRr|Cg;2e-63TN=%mutZHth8 zDqE))(VV2#18?Z6*Mlv>OrK}H)a>A4;jINr*gEnr>}XWPj@5QDID02seL?|q;@3D> z)@~GBB@*T*xcTxG5ZaSTen7R7;=Q2-Bq<(4;fqVS9uG1fPVak&f3XQx;>?p z@vKE~EY4UpToR0d@L3>>yTyj>3j8kK%Lpu->zY;+=C>X7}A&z4O zvU)BlI+s~sFu*wYD3xukj0{V4hM$KFJ*d`V}_?0q&{J@f+>|-woRuo*_TLm&A#r=D5kl z!}YfBrd-2*CgSnQZ?Z%?qnjZ+oZ}Vea?-}Vn_aaj0$nwG)|s}Si!_oxhr5yc*HVWE zP!BicN!zt%ueodAD}5+WK1(4G+)K-Gz!aFd!Lgixh1(1>`xiE8z{XgBzdgClt!=s~ zk%Pz|@52+*)Ps-P9gA{m8n1)u$&G*zc~AF6CZ$P=gzj1oZo$4Fe#k;-my%*Pp<-&o zLw!C9GB7c;I#*^Sz zL%PK`%Q0l(s~rbEQ4-&1qA&&9FH1_QhIl=2dQW&n31ENkvVchhf(LW5A_-PQJ61>< zf}2eV!M};ZBasz4;tO<;?oABx7Y{Pf^j3o6ml@MmgR-E=5Z(ZoSr+roaVt<+h4f_0 zT9Jv=xVKmOZaNL?5(c9X248hf zE(VEFb}EKu7Y{WiA5xJ&wBhdo6BJgX*Y+?kceyLm4g}GjOf`}|0O1+(knfcnPG^}i z!Ecoyt`2qf2$Q~UwF{6SY;g9P46^fX#TYMw?y~8p>wOi>1B{5xq$kcZVBau}&zQ9_yOy z4s&HO&%!qD0fam?lBLmNa0gZ2S1(nsPK-^ zL#5`I@>1{)gUZscN!2&!R7)9UP$8k0G)=Zbku`S@7CyB(6_a4PaOKEkd0&E!3^RCc zb(^-p|FA>~vrgi3(>kGa=|3U~F@_2;g2fT>Ii`%ftOuLJYqw9sc2KS_;6j}wLnpSI6_+4bVhMDJ9lvU^p^lBTSDK5+d7MPJ%Z<%5aMFQPJ}GE<2pUW-U{ER)Qr3_~pv=Lb*aFX!(qFa_G@5#dI zfr(&^ZKMwUYLtR={S6ih??oC&YSmaE8u+9ume!pOsw+0*4a~g`QZkWuCsUMo$f7TU zCL{@Ph?U1lR6=JCqLv(5FJw6^t+C=>#B56X!x>L2ge0p?L_5H_&@C(hj7!n{i`kKv za(ywlQ7!=(jPq!bSWrp=d!ga8OS4w_=eiWwb&Ff8C)+Wk?ap_`pd|zH9hL7J4S930b)2|Z9;V7f$>9$xZq#w?>fVENgml7nQI!F#}v1}M;R_v zA|7ioqIvu(SzA+@7RgdRHKegdjUYocvUrPs)I}X;dEAdDO)yP8!H?jPM>S_#yRRA3 zuB<6Fk0H~qpi@~^Ah+oXv{wSk<>-xoI+Y?#USQ@-3GxaN3IgGw^5JMX|e_61$ZdW6w1$k|HoNR%6Z}Eu3mjH}*D=G)$#CLYD1A5@724((Cpy zRfS>FXKJf)3TuDYhW)stx#vY%;ZsnAN9qhcc7_`wx{<2|j}rx2iq!-y_NF{Xmk`HJ z8bufG1K!Lr6E%pVEwLs9htl<{>N|O(DbrnjQ|*!3Ggo-gEb!jb%EKF?t%~tB+Z;MZ zkmtZh8`P>-IZwj>BV$zbE&A1Z>N7iG{nDkYOv^v90?pc2eNDzVLo0SZ!3q3Lvn~M?|d-Y=Jjm6~h zhA+L*m#e1JrA2;UpOstCwwqc!oA6QEHvdP6W4?M2_=ZA?5Xxb9uelQw%v<#U4~C^*~j)JzD4eiE>-oQmd1t z(*)1ZD5b>bVfMEB8W`N2_?q)|War#3xL>^#D%S`mBKiMfw zE8Q@iZ9ISI#of~D1Zl5&h4gxff_m-mg5+k7L5T9=r=I;za=&a&VXbE_PEVc4T=j<7 z{Ll1uqFLwH=ntsgH~5Lb*Aw&{p4rvF*LB*T9Hj_0%8rpoacNMIz}o0xci{&hn@m^w zB-+w|vc#Q{4AIyT{zW?Ydco!KQ0$3}+nL&S;Q{g}tne~n*;syou$5$g3 zKg?P7iR$_Oy{(4q7fiioSD*IVMl;%F<8NtZd=A2Fz5G+5wRbhmw{iG&`A+RE3;v>T zNKnWiZ-E(DDCyj##L_{3=$!jXFMiwGz!BJ(Ny#4CTE!-FDR~UQ<=j8k*iFG6z6)b8$4q)c0ON5)zdEX3b$hfO`cOv^ej>vIHdFP)q}=kt*I4V)fDQju@vqNQA32- z4%-|5=YFs(O4GmeYSnp>4?2>`H5HEK6K3UXb&pzGcgp@O*OmRxD`(0$!)3<;!?i%u z!&YoDk8UV5HJkVF>jt;S8+d(9+Q~$txkO73mEnKo=rFHdzQrn;yu3j_?;0-x$2N3v z`Q#X1G<9{53VGt=e)^I=*|Yjj8bmcvpLh9d`7iNz8?cS(o@ji3d!J5S&9HOvIy_;ZWxId#Va&)G&`E+p`xk&`+7u6eJAnqv%UbnQC=fhzapnooT{*P3vF&> zB99fK)eqdGI~ojiS9a+sU!0m--eM={(3BfqhWk>F`xviGT(9OqWun|{j_{2`f;V6P zQF$sRrfjWV0gWNg1_35z!da|5^#w>#Eg!$crusX^B5%vxz!-Al=;q<&_0mpfyyKPr zglmgX(ryBZ6TdJ(hkNcWSiYu1iueaiVIqYNo6RO-0RW%4^hu zpSo%_$#pBivs*i{{WMl>*r#Wp4s_#&Zp);4Ehy!y;cwr-g8d@(JJ^EFKv1H26UQ?DF3AXv!EiNlZ7&N0rdlNvQ^1;U7IPc*nwly ziZ74WJyW;x+p>KspYfUevhn5*ljU?sh8^}7LIM^9*aQ=Vw;+SLY_I`zF154=bv#{m z;Xr-ZHjrqmm2?pT0T!fTE=(}7*a9Z;W!!2lwy54FT#OM(VFe-=K!Picq$32!y%Zf! z*-g^ZKtft~Bv;*Hl5C-%|j6_#0+2UmPpVfCI{X}x9t9zu5!WS1Fc zme?PDY2>gYU?N(Cpny;2NT;27M!DyK2GwR6h7vK=Kw*g;cLAcRDe7m5in(}T22Cb+ zr*J|IpDE*D*Gg#d}5%Y0x|e-rWcaA)JGyuZI&U4F2$4rQZmW_DG5H1 zP#^?D5j1T}D4;-tg9!{UFOJVP*<(i$ZL|@N066pzfG73aZ({%$?CD5!u>dNPMG|G* zVsGxnR0yC#a%)-0c^Rv$VVy_UeC(NpWwVXV1?gUO8a8LL`!2ixY{@alL~WX8Oa>}K zQ>?M`2?>If%ed`6@j+mAq^e?xK+y1;hk1RdQEyBl9bUrmq7-pXLuR4bbPf~gEVId- za5T;fa+#i(wZuu4(VIK#q zs&hKZmkA=QD};#$(X|m{%ZU{6OcI5n?H^C|u#>`tMhOY(u3AOqeXPS+R+b;vCi}>@ zGWbS#C+AHPx-OE0V5d!giuc+s;?M*bUT_wKN$e^{`I3fLVUQ0e-aFjDYPEEzv~3Xt4F!3H9%^gVpbGAg7A~VN32SvsT)l#040QJg8 zKt&I5P-PrT*a}8aZ7?MhPP=eGwlq?+nzbz7`kKeBfdr9T%q)ox>|n_0*$*ZXd*I<1 zCZ;ZpvTd#V3M!|>zgD@ESD?60JbAT;$^5WEUxXHOjs}3K9fy{=Y^J^R#sj{ct0~q3 zTrT*KMVKI_GZ2i|*sS(~(Rr%_9+e>(Rb_!eHDqr+n`Y*qwW;x0L7E)GR#66mhAUjb zkrNt75ya2~an=ND7zJsABq1dNwsWYmf~P0(<_AFS^LD`k=q>5xyQl{ABM05nV=$;y zMy-i~bom+CLbSY?c&0}p%}DPKL(r$Kw3fpE0S>)T>LliEXh=Unpe9;k*HG0jNH^pV z3LVG64pu=7W5`e-6ca#_IgyH5YOLGliACD&FJ!IK1R^p!qNQ@SG2Ba{3uDF{u%dBb zQ2CEmFX#k1(7~53(cpp{@D$-;qqbu_?DD^OWRDFr>HZ@wj?REKL#RDl;z)48NxktC!dt)YfX#LGr|8wWoGwJl`A z*y}nbKv-SLirH^&1MlrxA`dl(Js{?@_=B!)dY#xoLy4?W7cCDt}Cr9#*VbB)#QI zt5Y)*f~9P_VCprgHmgklwTT)3)Py0plz4=&gLI>75r&}jXDyx@ohCSBJVTdH<>s8O z*>^e7Stzj|1~G@v(>f_?#ecJVG7}|BU8Y>jCN~9R&EgAg&UO0Ci`ljkV4F)nsG&7; zdVz0TZ8aOK6i>7MR%m@p;F9?OH7#%Rkaz9s6LNr)At-hU|BBdXcZtL9JoefkJ@Gx2 zA-=!d_R!^$h2$~4T4f4@(r28rmk?mnDZWU($@Np=FpcFTEQ}5~8rx4dD>R`2EUsZd zY@0uqVL0iP!Dq#2Ta|3!mQFf<)C5eV?7<~M6a+|5a@ay!|% z#~QW#R|CAK!q0r=AIW8$PQu^ z^_UsKm{CMn4b&VQJv~_yvJ(}8pa@pAzOM_(Oa~idwAH{tlx@7Syz<8#_?gZ)E_yPV>$ky3Xq!-gj5gW;`+FtAwCNj z9@_cUS23#pTr-`QJKonA{s}8d1Qakp0d8N3=v<_+pLIc62F~FoHslh1p2m>kDoo@= zq7fjpgdU2cXK4>dcI5a3S{}hqpcPu9#0xZL3Pwl^hvb)TZDIR#h%WKbz12nv$b=8- zqr9AzawwG$5Mwrx90Fe6#l)fKp~vwVRjwSBvc;28fg*z(Wyzc(i6KOJ<&u6hP%DDl zy~!9M=@&EZB1v`-5e}CQ(9jYn(VqoOa{S$CAciHD2m=C}TXGe01VV$Im4ES4FeVqk zu?{zeB4nvwd!fQXjTeJ$(Ap@_QvpjX+Qk~JO;v(f^5M+_nO*`tpE*8-c~NC~!9m4%i-Q51#N;H}?Ev82AP@AT zT(w-^v|P$@=Rk<2xP_)_ltdJG3-wVC6EqZ|8H8Ce1`}0q+!G;4f`qD0-BqMUZe&SBW-4}MM>eK8ekeyW#VY0D2xezkssMVy zn13wJ;N^l5#HU`mM2orv)L_7D%4iv~C;03DLdmFNyr{XTXlT*}5d2`w+$fBe$ZCxL z*+6_jYNjBE=;rBQ7hs-}6FO)oF4|v08AZAiMS5V&bQyIm*y>&9Fq!F@z7m*;XdR3o zGQDXKl9SS~%X<=`i*C>0fyfN3=Vd-8Mzy9(xB+BPrxdhM%LVEg;J~BY+K?uPJL)J@ zAb}f@CR%1(9`Rk}HBX_6++uKnBIwX>x#)i4BR26|q8VrC`CJ7K9B?{iE_CV0z$(z4 zPG4rt-Mr}tT4yA=X?eA&n>GlhWhl)RWEXUtjx`^Cj@nncsPQ0b@{GVN=Gn3)k&kj) z3l$QeModBh=+coY8~N70^wO{C45TJ&Sz2m-@ThYDF?#;p%RLM z$NZbffa$BEg1`PNVd|^Kyh>6k(j9);aakun?F_HB>4+559qNq+q@f^H6Q*)&7DPc- ze(Rlvl}Vt1thG^zM8Rs(BY3{%e|(fr+RtFUDASSbgE+^y8PAQf%pidu0u zT?B&IPFF*ynVgiQdtEG42r9H%)5%1E=42f7#b~BJ-GSi1isD}{Z5s;=loSFUpLXkg z%F9e@#?Goy%VjI1^5VCGhd}1S7<6q#VCjM8Q$sFg+%;|SdEzx5tyrl4!slA;)Pk<( z!rjK?>jX(2M%4_!^&R*~8-!6yoiY#z~2aYdojV%f1RZ6}aNQO%t;R#9I* z?T6vhm07L(_ABYG1^e>rs>%}&FK3XXP5}R}(c&+c3CU1)DrZ#xVHMU4Z0;>qPVmJs z@E~Ok{eB3a>iLU#SE-Tcq z{L*S1;sp@r@gbm&a{e&pZ4e1RW*;)~6F>1D3d`-_$Hhu9@oX$BHr)f$E~474wZWg$ zo<%;@C~#JSaD+MJA{4@Ubw0%3TEpTtbQoE97weZgMqOGyHBd zD_d^8LYeAZLVJ93+Dygj5GlX%UNieT-^R4G`puKG?J)hKM;LqYGPW};=d?ZFG!oMVPkXdRcJ1rF zF8rZt!CqO%c(bW)nEDQM%xE(l_uVpU?LJ4dCVIu&@zWJ6pB#ZSnufG8f;EH8U&Hol zQvr1e8u1L{iYB^_6M>R&qAD7jGzD%gRMRjwqZvapbcIP)gUYlshjIQ6wov1$VXIPS z-AuxwHDg0cK0Vn24nr||tf@QJGN_IW8 zccE`lhO>5CauMHmMN4#usquDeU3tQzK#dHkxj8?iwp)mbG{KQFAG;_d8+kjC&Worno2VwL?;cgIl(i*Leq~A5_k@ zX%id^^EMm1d6@_JLZf(Op}2xe8{Ne#l-oI@|8`Lirair%g(o_za$?;5UMU-N2})!O zi{e`6xz;+fHTrW*Lza~{`i^6H{7D&npHW-u4}-_?``US{N95%$v*oV&oTK^^dUqN_ zvzV`Mloz?9<2IeQjT~ostaqbwTcdy*D61-ZD6u+(*SMc2)dtpjci(vUM)t2K-L|ve zlcTh8CiAerHMm8!8!!8IkK#!)nhPWUWaq{>x@$5iRr{i;`Baa$cD-wIw+4Wf>%9chk4Dfan#>DM4q>)^E+m1V9;Ah(vLWfb4->Z{jqPh zX`?)hySiTn9M8@5OXDkKRlT%l{V5OpQqQ~8yF2Bwbt=oez7P3z#rKx3FxmHc+ABT5 zkG#Ad{>z7YljFOWJE)XhJ2(>mKJl=--fLOKEA*E>yCqj{oHt>_7dWx2{)NZ1)GxY< zn>yr|_Hj26>Z5(StFR3xc-=j|-9!85i@cBvAIsxY&RaEK%R9;6y4=G)3ZFemtGQ7p zeeL7^Rbl)EzO}>uzNx;x3^#r7ySlq4KIQ|^mPBN3UvlPm{J&GiBC3=TPaZ6V5T!_k23?l2Ni!2mnhT)Sb6#x9(<#$T z9!r|CT9l~Nteucn>}nGKtHz8=!P+!ilq1HDU)i>G`&QyivMp7fed!Z#O1c+ghUEk| zY1fTQl?pw&5-VSlSG95l{8;8p$w|k)^($5{WX+p7=LPvvZr_$})rJlkaWcxwYmxq? z8oA?YokE!|_8ZhGU5%SfFNRxMtVP6!I~O+&`L5uVuU-32==mpf#dCGzY}ofH?ax1J zbAM_*>gvy^RRf1<87Jc4!qZk&8yLDv%FhL}I)48&?$dW~!c6WHwEiGU%Pz0TN({d6 zPz&p;1&PWHEZweCPrK$kYfLty;sS0$+sw1Bx4j6o=(gPqByL0wP4o@F7SWR~LGSQF zrLF;0%1prXL<|xCMy0C4?zYz+vk*k_^12Gho;XC2MZnJDD6^n4l+Qh=c-v4F7qyJ9 ztlx6Gal8)q3lByeql(VM2U|;%HZc+0NhUVq+7eCo)*B16@yhCt$KULuQ%e&0>vK-r z_?z)CFw0Ex$pG6#OTR+x+{#MTqLfrYET`O*Q$QtDaYPE=yK_6!3CBRiM!fj?p}qWA|KCqXyYY zRC~1eQX#ozE9PUTMe*f-QGWVcg|7~ovdYRjs-c@++q`PLgCI=aG_rtkZdls5>B#Sov zbYe3sdE&}Pce?K|F9h7vNWDfnOGQ15v1b2<%YAgO2IZIdenqQ&SLE4-o7T)XRdB+M zhF+5YRKg{HT}Fb%U0TJ;fCYMNfdofad0i1j82zdRO)ggTIA@=DA$3n#?WMDBx%|km zw^e(f3Z_p!*g6=QqIIuYG0k?ZsY&e|M=$BbYJSA|Q_=i1x%8!{K*AGP1|w*(oAqdW z<)K^B*47yTPG@;(OHro!mm2Qf4SWa;ljdNTzxWt#6}hVs@KRO03kk1qTYFcHbksiT zP-TPD%G=)V2b;t#PGbec+O^meq)=XI;cs)@3un;4Bhk;9FF)@4Cc(rxP}g-%ps`$tEATV8)~xDA zJzV2MsWUk+iBdF499~FM+RdkV5Rn&5U`D^@yjfbYVsUh*8Rd3ShFUaG>tkB~h?dwV zqdm!7^?b~!%to3_CTxzGJRD3f_R=#>Q)~6wX6N9zEkhnrnF>AVm5yXODiL*Vg@Mo_ zakaAJA?%lEE!$2&VOM zb)k5qp&&)NoxL`Tk)(y4BF*Y2+*Wc_bRCUS3Cb}*O;9r-#iwCWcoA8(OO&+@En2gi zImJ#Ls&xr8Xk^tbZT>o`L0S7^Mbi|+p0uOKVp?6UQ0RImX#Kean2`@V_2y45;k^~ z5;UCon^!~EG_r$o^lvvv%itn<(Bz%r$rLPRPzM;R7Upud}<%pk-5(-@sDAB9PEP9!nBT*Rv(;Fj}eWi#(ic#l?!D?Vd}l$cG9E| zmhOY@SJ6EV>$DN*OAI%YoYj`~pjDdVm9DzJwh_2L6AV_qCX~ZR<#R&OSLn7`FPgDN z7O0=RI@}Ia)2K|P{Cr4YSyIN&`WBx^P1eJCJ5Ykn(`tB$Xvi8$+mi5gHoPNOZYd8l za>W`p&0R!cojaUkbzb2W4YovgZkfl12JJ2}1K^5^T-R*&E~883tx1oOvK|+1(X-z7V@}<{ zMO56rr%d?L+l}r@hcU4|A8ZT;@V}o|T5}bvE8eTwGOB!cGa-fFT_Qfqa9wJlO<&-Q zZI;o28?3>t3C=njS@T`jFzg%oI~tN%im9w5JMX=%|5?@S3)lD`4ca);Hb0))C1C{X z`s`2g@Q1;kd0rpCoBZww`N9Wf+$;97Pt-1K@se-j;EvhSZDkk`RHSUl*rvXAEWzM! zI4-MwzG?&O&w^-8hjwC!o{i6f#r{+ateoz=wk($aNayx0N%sotv;d0PfM|rA@0j-Q z?CehHLMh=8a3Wkm2&bmJq-HVBWvVyobX#IKh+%kfw*<#=tb z#!urK$E9j5n~3K3PO99VZuXYt>gq1$MlK{+3n|7&YO0Qba7esj3uEj^(xmUc0BW7a zNCZo)4c9FA3XToI5B(r!_?#>dK}Y)_uK?jN7yN3f#>Y#TLqy&P)fVjnHLA9>=S$dw z<(x{7`p@ZjFYcVmL6i`S81V~xaQVy%%Dk=u@vQ{)gxUm-2E8zfDDU%za0rV7(p-!4 zR!-Y4h?+ddk`|5f%mdfdu)>fEwE{8p4z9cZ?rk}4F~Vp^8ZV8UgoRX8kl#cR67w#u zQ11i>LJpBI_#|6t$A}LaR=1{7R5F_L18n=;hxC&OTCk%aX;lwfC%x?yvFeNcZ z0OiRPDU0U>MFef`So}{VWe5WQah@p5l&-J}NrDnDF(XZ?elAb(+(jKZ@tT@2uu@Jv z=#L81G2RxXL*&k;u!phOup2S!|Ej48dlCp=3-bQ#rjo49G_hyIkbL!EPw~$2BwtVWj4tQ@{AI16tNiG!-u6UZs0a@m>CMprjlSWhZyln(&5#SzZ=4vg_uC4`F&;ZHLe{8bZ zen~si>p3fj?-r5f9`hMz&*9EV@1S%4;Baax(z)WIGt-bxlu|R}rY`d_*7|L1R1qRi z5V4NVFYn43OU>~->*!RIG9_>j6UiirL7)Z6OcTm8_~JzpA}9u{RqpFzIczF7q8Vv?MSS zlUgv$3}@>6Zov@FJ`c~o1Oy_VYlQeD>U@$w3p6x2t0u8gsFcq|FGVKNv1e8@0%0^4 z3!*}U5JOFZwT$q|s450g!X0nyz#MHUL-6nN@Qw11D(`ZcNH8mTF%ehqKr{!4qDxCl zPcRdU|3uHF9J1wT()j8wHw_aM0s;Ub`2+HO>c(9qkRGuI{Ohu95LWd6-LNmB=V?>J}LlT5Wvg8VpC{teK_^aip6)<1QoH?;2 zLX9z9!c@sqr_Y}=f7blPbEM6pA4d&z#xx>Rp%;NdMM|}*Rh1n&TwUsPEIQMxjRI)f`VFVdiQgT90-crQ-8Xpa_F%eZl4j1`+< z+$!(wae!h2z}6g*e;<-4~(mVTO4H{rOb zKMNoJwK8ern^SuRdzS6kz9jW_o*vpVW!QsvXSZF`?Qg(=xugGXs$Hz>s^m!*e5$l` zNcPeZOXW$UcxNxPXy7-#VL=3s`j3HTw77!J4? zh=v75;$OckyQxnav@tJ>~b>y+X;#;BA8 zLaO6;Nc!rdnYCf+EJ(7tm}hLJPRkmD_S$(WwE6<4UUS|qTdsk(LU*uT|BaPjmjIU8 zs5F++%Bq_UZVT#?5oYS@p*u1AEqMWJcqzYw)hp|Hl#N+ zYB_q}d-BnXp}u~iZ18$HN~dGVqY3S4i*Z6dCzBt`4CRzsRa!|w*EEg^l=KlZM)tl@$RJXU5XyG=_V%Xe9d-^D{)wk8vbFJ<3((ii=}?Pc$+{E z-z|vpzO8z8#lM-C<^yh8`*y^$CUBj)Gk+r1MnMmn^MsvSR)^11+@t0dteu4`WMb=E zr%heHD!tJXU$Dm&VEyhi z*4tTtbSEOBEU;(tJ6gq5B{2lEM+WF1&V{$K~|{fHo?avZhQoMpc#AjzOfA}gL=A^9Od>qij{C;Sz3f1 zds9Lyt*&b(yb0`LD8UMTsaY!`q7KUjzw{PNHb1JM<;cXlcEo+N&>rN=}c^^etL8vo0p39qE49#;UT9kpn@+SAuXM z5h~=9*j&j)r*=(wmX(C*D(NIu!#z2NAbM4Dk8cpSG z@(9#p(sPAvQKI2ANz^KZ@?>CTWELN`rKx!|G4g8br_P8&-=&dPQ59@T_u5Uwd6uC9 zF$Ftu7!t3_@urHnEA%46M|b}b7O0G&>@)*=O3(!Bqh_O?ZD=|>X!a0Y)Z?XH*Lt~Z zb{3N&9U9sYYDRO-#jBsa3^BoEN_Y;nIf^Z1aHtg8Sh{MTcEzpNsA$7Jvdf?^i|-AE z14*1TQ?f0UDh;X0!e2snSLnQmYnOPq$3BsN{1fUij~CLKf%UKxOKN{jiA2c-$xD?5 z>3+S3%B$_GzH$Sx+rGJ6{X!G7B*oqGycNub#8yW8!&Ug8s9sN2Z>QcBY4nm?UI<6i zpFE~)nD+R_YH{|yDQ)3e7y8Y=lF-ESIWZWg=sV-i&1OW7=UMf5U?U%Rwvi8P2 zSe~$#NW=`9d)3kSbu|BZ)18@1n@E`?D^kjT6Uvb>h-D1iWrVF2+&jrzVSwT^qXk-N zp-XdH>FOzT5S4RcH=MUw{&ho=bXRWU`bsm=l+t+NVr?lJRqy(A!CkGWQ~w8%0FIWB znhZ5>9i~~+{g}nrvaeiVN5m$dwt;69y7~#(k}Vc4Sg?E6wWvC`&_T5{)fl-v zL+Z-}E8ny^W@~kp&b^02Aqso#zwpA=dm?CGto*XLD`rMwwo^p$icPWWR zgxN7hG%3H_zf#gxv3N`{VP|YCkRg2Nyd+saM1{ zySkg@9ap}c^&7i)a4y6}B9H4w6{AJ*9`jb>yYO^Ha7IH3=6nwJw!X}E_IA>+#a?}v z8-|f`j4Nwhr%i)I5^E84?sF@1yTpS{_JCa*^Tmw!`w-1Lu9C5jRq3e8c53lG0?7CNvVoe9gypI|yic*JY4Zg2L220MtV5 zCrVhSRC;%O&y`;&} zh_e5OdF1nI4mEeKk$_*ff}ZDPE0b2PhjAM zZ3kXp$acUrjA{5@+_j2ARW+NlZApZ3!G=<|w{97tFmITAKo*3chlI;zhGW--%4kON zsDq3~XyU~%gJz9Qmx{ADb&1z4Q%7{XHh7CTkXbl>;8%d<7lC^Mi!|7andd>b)9)z zf+*#LfaiDa6N8UdI-%%6(HM|zSd=QsbRO4%ZU<)5h&_Y`bk+!v{*-g0rjrGUkx`g} z$Krktc{EQ#lfBhDthi#2wua!?jzcp~-54aafUQm>6ei;!!mjl2vDQJ-3mdc$E9cjRRv}uI7yT=0_3K zc5$bda0M^(vzC)(iAA$mXc>xz>2;$xf>joES!smsNOhVSlqHyn!t!`3W-li5V=TGQDLBQ>r1 zGlfW*XYw2{_kR63J@J==$T~xt=(=bfX`ELJe@)Ad zKg5Pt2AfiAZZ^w(Bg<)mny0o(vt?+WaM@?`=X;{YkRFSsbIYVlx~A8fpb#^8g?c+_ zOE%DIR7HzN<&m+ob{(1Ju0$$Gd?<)S>a_hTM7vg|_*aCS>Y!%(k+JxZZf|+(*nYOE@i3&B9 z9U7mO$({CLl)wXqj+-Lnmr5=9w7siET*|eQ0do}ghyA#| zlv}x!TfH9nf$iC~io0>4RbzRZy_@!*ySloMNmhx=xu82~=(MzZs&0wql;nFBN*TMd z8?c)zoCmDA_!~#>inrpazoUAYUBrI(tFF{aim)3vgSx z)|#KM_@@E=Sce4#LlcCe_mR%s(>sbeY>$5H?KQCcA4cN+QbjbiLN5n~n!Fj^E+-+2=y6H=lSLe4a8@_~m!?4;# z6&bpYyuY7lL4j#bNcy_aOqzadjL-~sWVerYd#JwbfPQ<&&qBYzd_Qo-yH&f88Ju=- z!)+~!x5=w08altC*}4o?##5V=3dVtf7P7H2n@v2?H0;D5>%TD&1L}F$Eey0S zSJ9fgiUWBz>UFX83%OmLO#kPjl6~1Us&JW|%_Ft4hC-fWJEdrMU{i+?rEYGD@KXFEo_xKLi4+y5JB zvkA;*X~?#ntzntfw`a@Y)2Jtf+hG5r+I~`F^O?f73w%6zYWF(Gc&v}U+u57+lZ{-% z{dv>3jijdR)b`jR&mfM-Un;SORE5>e!o9uV{Pm(UjDyO=!4EE6WQf5jYoBaZ zp~EePxU9Rv+{~hiOmA8yP;8=qw`sO=;wt(hP-ryq?U89M;onN+9BZ*P9(8rQ(Sqc$ z-WQE3JF5Owd38tPG<>ypY@=}qm8Zj-O^vx48*77zGW@rF1?J8@y4KsJ-_c9od~Ij~ z>zq35gxi~DT)o*KTxvP3$XNdx;KG}Rw#|ZX>c&y(xj}oKk}K(Ex8azc=?MLFNs4$3 z2g5)tlU(=NWe&Sl9?n8sh=cnx{>+%qO4bJpr!_9&`Sa1XRg!M`YMtq*5QJbn70vOe zC1yD6gMM7n8_5h+>`{E=UfkeMwU$seWN1|8uXyS~?4-}E(l?IhxoJAhkIG22{WFPAl?2-+%312V9T!gbqAjZ$$=sS6O%sSg(e+hN8b?nre?Ppd zsrL%rB9FiKV|~c?aq5q}&ZkY>hc0e)?wN-T_g{MzS}+g}kou`V_XWZATJZYnLG=WI z_l=+T9-a4tEB%Q9?G5)Dxd-f(fdcU1{{{FD5ConPK;p@u!8%9;5|;mgG@4JT4WfidGjiFHOGAxRP; zMGYDnS`qosWkFBQT+UpHz~;@3&ScVjIMM-&gBXNDgT~XS%c4gcZaT^|rnHzrheDMG zb*WW@7?jdeIe8&^xUk7j;6xJ}VLr)n2xBI~kQ_|g!igV#pumkTq7&kd zG6uAPKNv_`@Qwcp>}KFF!Th4#x^if#fHKd!?npi zlgpqX=ul82x(pmb3@w0Jql&yV{A?vnA~TH$O4?`$zXg_yPD2s1(ufsJVDERG30Mer|*hXRXY3<{c%us9v~dQb!= zBE$a=M+%Hw5zr-;fHIL80Sz>{0(jB%1P_*Abcshy5cSOi-Ec#>DLrvRI0+eW6;cF+ zkwgVBK8Un6Q%&UbgrlBG!2>4@q7x67nBYl?E`}H)H|cmx6F#lvi(%UBkizPz^0?eG zye+@Pwo7cm46{sfwM3J?XUk&2ff3qm7dpXOr1HoyrM8vj8avIwD_TU##$f2{O*@AY=K$ zlS59{z_C|58XESYU=uco*O{r5qRME?-4;czz(p%)^LkNwX>qT;Dy*lgB3fvwwS)f% z&2-070f~`d8g$_!QrtMNkq@P@MBy~ubYbXv_9T!%1{K0%=ircFt+(ZD*`Oieg1d<( zwpiKFl$|)$;F%_HqKHgQOPMb^WHo~2gLZj&1X=lV2@cNfWxN-(x)eq9=)2N&wkmN-D%=aYnSvROu`~*A*;0oAg z+G6yLEkH*PxfxCJmjTit#$&7EiAr>$9p2rJTHRS4ifo6JE@>qOy~_&IzU2R{Z#Bbc zVB(7S3#V}Q2a6omg zWILy{t|=mX8n?6syAAd(j}r9Y2gB3>Ku*m}CnTh_vNIM9u&@kV!w8keRyhd?NPix< z%VMS=MA8kUa)_yo5(dOTLE)j38S-DQROQ4H*&%N8q8v|t<;b~B(G0rM!VOFnDK>;4 z3Ksz5^ei(dygkW(GK?gSE~y|Fj^Juxlw-o>7MUJ4!y0!#*+`MkxoC%tyrIO!>SAJZ{92Actl&enrh9J;0Gg07CzQDqs@Mw4=_0m-8 ziX{!Y@paFn&+b&0o|O9Wj}k-|^0GEl;YoxhTigm5hO?t%RkZ)BLNF0_78O~@lJT-I zv?}6!S{o7=l{jmdYGtL!*qCUBmsX%GSprBLi%NE5Bxx5BP_mP5RZW`YIcZC;1}TYYvpZFXX35VqbsYtbESB9q+IVTva-}W(%_t+}%3E%r8a?4< zgD?Wa8WupQg@L-;`2o#qPzZ_5vL;WoOGF+K2m+L#%!7OZpn$<#-3WSOzEk_S_p+5kx+Es0GK&MLG934z(Sph-iJbuxR}QI!(^;)uxSokbh8i{2=z>$}6B zJ{;nJF4s*Bn_zAlInuY2icIHo@kMMz3w2l?A{%>dZEKlLBq#J0tPmIiP{9ud@iHV% zaSJL~mou@>0^b%6r9ex(y!T!74rhFy(8`T(B-l#lswkpV@l@c=rn8Kz=xjAysf{+> z_@lEmK}iFcIaYXvp5Fl1t;|~O9w`Z|A1vi^Lxkicho}^lXMoDYnno!8XVjsMy$}a} z;zAdELXnR37)KodR3CUxTf^}BCYAA|o2eGKj=X6OFI?s-DYrF_U?^Y?7<(qY*3_)+ zzLFb;^YZ`|94~ zQou@8g<%q`L6`pfzS;Ge`q#hKBB6oPtIo>=3U8IzgdlbIG%r_EZrtmBDf z83+tqh-G85H`7226r&$HxW{sjksB`Jd7}VhoopGfu&WMT^QTd=I`(pt8j3jMssaQU zx5cV56o9oqFo;rM1VK26=d!NqbExXsDPcmY&;bUw-fc|)h zTc`xp1`#Zy8uTpfaiigPq>8=K&Udk9 zI_ndTVe^4TVLd&_AwA=&J?k?Vyf;vc24Aa3IMlm(?3`s&i;AR3SFB35>KTi)NR1pn zX{jB~n@0EWJdW!&lB5=LSul-kt@(1qg)^f@EEt}0xt}=94cR%V+`ZSkuu>p|Qt$(m zu>z3sg2n7P$YQss3qLiQkX9Q(TuC+`XiF>fk7%H`_bJ6pQ79h!Gk-}V@pFxxv8O!I zgcqq3WwA}R#GBj<#@<|uU_8tJ;1o`^EDI30u5M8>XqgtWh@e4C3+#&z33EI}8z_ov zL`+gZoRpaS5(CL}iJ5bRgYW}^Ay1(6u|Ei=ZWO<|;X?Vs5gn7K(`=18#INzn1lJTB zN#Lmk*+M&@q^N?vF+v0S1QO9WPzr-D1zk`gXix{0kylL1MVJ`2!YG(w@X@ktub<3-Av))Xi8Nt=9B4?;=XRk-Yt^ zy%Y&hVbv8y0#UXoONkK;QC+NvfUj#cfVen-8{(xlc)7OxDn$hhkEF!fA`vfn&QrZ6 zl;Wd5%(!f0NqK6XSgW$>497x3wK6q7F*U#tVSr1SqF0d%ATa|al#`5_Rxs*NJuQKX z3N46@*y)2!M@iQI>jXa5q`+-lPxLY(L=~c?Y7Jzo!v{?QFTGPs#nfrd5rW;hi!{5@ zAtQ7WG_LW|lxPo9?L)ECym;k4l`63LItzCBM#WkzHiK68U_?^|R8P|?eT;w@Sw-J) zft_rO{h7C2(bno>oTRnAs47!V4A4X<#qKJNjs;Y+9X|G~qWn`3N&!%0v!N_7Hj%ji zv7*-05)FdbIipOt`FUAW1Dy|rx41%$Q5ddeqD#I4rxHR*C1cuLIz zI=eHAFF>vTv1FC9)J@s=(BEaFp6Edy*w*&Lj9ZmZjqTic%PQJ3%J|&86zn{|QryPX zOOjl&K8#8JY`VlqKl&Pz%t=#!EtrU4S9M+7-qKtKT;D}R&!sIF<)BB?LXKH76stWLIm8(m$qOo+ zVbaP$U7HF1!4GF-h!X9=+`Ix*Km~!^MvWcFw7ud(vq`3^C}UbRfHcI^3|YTTEe)0! z!~6~Zg0O&*%rgw8O#c;*2(2iGZI$ZXkf*>Y;=-Ed%uoX3I*tpjG3{AvtKm#IWJI1} z&%I#}of3<6t4jgc!WDyniC@PdVi0(^i+IS9&_d3c0&pF+`T5n;^o=3FwNtyHbfT~G zh27HN+#R0b^jf4UE`oxKjNFXi9%xx%6ON@kO60uOD@|3xC|w9x)-nWc=xO=0d6 zss0LNl;pY=K8vi}+*q|UMy8rq9!osv0ax*~BeSa_QwUALT_P1R`1n2h1x>%x z#iZSHDuP7aO5_;LBo(cN>D)D7jlDYi)Di|9NS{+8kkH^R$lwG)T^8yP%#6}qwdftY z!m~roEuBxfJ7FTrS-eCcmD=9y4J?(+DI1j>(2eM?JyW<|X);k{EKW^iJl!k78`rh7 z$ErF=%mRpY0V%wfR?0OuD+@)Gu|&IK0#3SQ%;M{W;DG*Cf+hm7QY4m0f=%WTyv^HU zHe-woZHZjVKy>Df9z<@E8tqj&<> z%Fbie6|x)DcJ@VEh1BTasF!ZKtm?7423;KvR_SXS)78h5AcLnSJ6`LV(%{s@Y_lSG zP_q+l<4jJLOzrOtDelF~vWBLOl4GZxZ(-_U7W^RAIhNU0Ab4sk?VRzpz3+XNRDMS$H+W@#PIHx*9fOm9Ky&doWBnZe0DBfd6 z<{U3l7ea~`IPE|_$!+Vn7|uotWI{)lZ8Fwz;mPk|QlfrA-Ac|=Ay0HKND}Qn@+wC! zvhe}n_TUkNgNq~^XfA<}Y1HSoXf@&izFfhYq$U^mRPg5%}v1GOg% zcIb(;W#Aj}WhS(P66&*FZ`U>p5CUmFs+!&QIUN;S%?0!wZ}3k)QnOe?L-%6wvPrOF zvsI#FefvEnIjCJH4J?*fJ_p&;`4Cb1$^r;fv%T*8dORbj@Za6+yqgFFh0lck@QkER z-L0FA6il0nkL|m2Y7QQYEq7ULR%M55{ATuEq@tOg^rJ}K#voh&q7&UG8KV%W%*u3C z0d9~`zdz&?uWo17=mlWF+ks@mZ8^~ERcvY;6p__(4aT6u%pT_KE-Rf1aYZgQefP>H z3*YvJMhI$GwI(D-&*vS14T|4#^quRD7bOT53x{ub@ZqQfzPdiOT{{Gsd`>Y~LY2C! z@6D0;qqurI(1a`}mS`pQY3+l#mAyBWTp4}UM*5N~}#I0dE&j+8_ziOxZKTqHXr zXY{f36oACy2DO;JLqf0J;vgn$-l^~B1eX_XtH8N2^A%wG+3d6z%#;x5#(g^=D;&8C(e}l(kIZM zLWdHSv*Rd9IQhj1D09G$p&5U7?P>u_wk|ago3L_4lv?S=*7{Wmf z!6{9;GHuC;Koun_))M0nFa=M`U5qWQHF#s|U3 z`WZZ~$xsRsUm&4|11fxRkPt|Wph90lI2c$=+HJSpN=Tts0EQPf2AO_gjP@ajpoz#C zh*2G27ls00H;@5F*i?jE_C0hRN3?we1x7L0CXsHy<(Sb&7y+jdjWlk-lma!>K%;Wf z%_LosH3=47lrB-%Lqubk2p&XOnb+QH7jD4+p(cezFhvnMJlMz{_<2IthWx$RMFa;F zu>hWrDUp*3dp(oj6pB3vn3P4P=bTJP(YN7#lX-H$i3LU4C8U)?iqZ*KN+?tbB~Ubk zKtFhx1dSKX#!*K*{)iiqJoZLXt5sICi+Li5Kpa}hU1-!zhf*o4f57URr9)LkRbFZ? zMB^f&)D30=w9wjDkQ;Fxd87n?I_DpvcowF_B0e_9nzI&Sr>FpU>N z*@*L+XCEI0^`P3P1f(<&0uF&8>~K1^G#g02on#}yDA}5&87CC5Q?EH#eDRdaE<3J- zPBLemPCqqF?oL)kRcuxVVPR!+z$B9Y$fhO~ngaqCut=8&IUkpZYrI4YSb9#zOac<9 zu*eg1=oUtDep^-+FVyvNHqjMi*aZ=&F?AZDC(ndRuLdI*bR&>t4_S7?XUit`n@pyt zF->q6#VfF3vfYiZqlE7KKdH0VbQ1QPuaRes8wxv!)B6Ndja{(3KZzgj(MWP z;&8an2@zHp@zvf5Fpc-n))7SiMx~Dd;BDzRmNembKu;$Kz|(Gki%3KQ7r5AkE!r@t z)x~8qL@)pf{`EYFc#2w~8UffwMm*ferXwaa$w(F^yoDK0B0x9@Y<%_;nBY%V&0?9@ zJVzX?Im9wUpaW#G1w)6Z4}i$SBgesmWYK5ghm9pNaH1rdCUOV1~exd zNEf(>}tu( zwh`ovo)8t546uQN;O+n@IH{xV$;*m#s-=39QGD{qHna%|cxLk^*>ak~-U(|LK4s*{ zL?=|yHEd}d4OIwENt`hvm1-)xlMsHW3H2?N4liTY`y8p37-EbQTZD_gn98v%kThDu zfkVd9RXNnzf&yj#T!ug{(Y-EQfUX8XNCu-qhAgCXeVt?JxwZL&(~OH$5C0_|`Xiy!!GT)gzPkCLafrbX%lwgQ4T6u=0kXr)WA zq{Yo*PnCla40@iYPyr@VQ+_R%fAG=(M0#sa^n@H5py`FsAVMIxFe7O<5QZWkLYg0? z>oc;D1yPQsg8EufO7h@R?ZWhpFSuK)%yvS@j!m)KJeb%f;8Xd^SF*R2ju%^a*(rez zF_t9^cH-~|l-`52O@4o67v{?$RLSMv~CzJb8 zd*wnRBIP9i3LqDTDL8;YLrtv+s@J1hN8pvwX zrXWTCQb?4H5T}heH>aHmHU zcjhAHsnc4EcMS1f>>P1DK}laxRVtVj;^|q(xWg-*nUQz0vOS|5<#CCoFqiraZ zlKXhtafk$g4J>%(HmqY~9&?)ieday)IL{A1z}VEl2~;mSgUiK3~+))qk$JdqxnL@rh0o!X~VM+HkS@3x=E;bOoe#+Lw*hTb5d`jM;`JD zuqCYhouWl{mbZpclUK03IN~D3FyiI*Ea>Ue{#Z&!yd=FwGr& zBq`#ScjXW-{TDWFT(?9aM1&2)m?9yOAoaPVVufKV#>S@QBTf=fKlWoSx*#3w!6j)~ zQ%KnlVAb33pCcwDM9!Y5teht71+FnfUie9_Ekwfw4K*g-6%EEzf+WJ_*Bq&&p|IbT z;Fn2?Weu4jj}(jt#^cSwTukPqTvo|0zKNCHC6-Z=oJ3Fn*nnUDWepyb9AuXsEDI9c z-~Mq@PLRP5_&@-}2^=873rOR_-4jt29cHKrAb%16#yR#E?2Z#s+<{3Bilr{pb)2Q;P`9OrS4fq?l0 z9nRh!p21!%n%;os*&$74!rn`0Rp({Y)@7r+pe5p6NGAP~x*!gpf!!&+M2a2E3bbbi zE>_F^5o5L2POYL%X&-y`rhe)qY%JZDsY}k>0ALzt3^FI=JSX~STq=EIo;XRuRV6iw zT@`VrbqdNP3PTxGBzQ93doadH>Q76(1#4oPRtD6vyxuvr$xLC>(8BpO%4K?j8H-^{fC%ehq4u>nv};g9}&-tH0G z0zRcepve0escbmIdjeUcJz9*?rd!rXjRKnTb<#%#!Yb`25a1|i+2x!1CLCU8F!D;8 zXUG|iLw=NLkk5oRsF~ShxX`4DmTHw~D)mt-wGPRsW~;U`1F3py3avo$ zNf!}>!HgILIRQ+4;p8Eipt&;VIKHd8#3om2=&pJHBo`LzvR)`rMd9dNrBOX8pxUYu z`fFBwS=E%Qz#t^9mYJYBYX+83r#>I2-sWx=OiQAWi%Kkd1=*x}hG(>qFNAF0f!wN^ zAYj(nBEEsjDkYf#fP2V*HKJ!o23LC4n%l99S|}hdMVt)nOI`5Ry&7uR8Rd~?rq+yO zT4d#;Xa%Zjg%%h9lp@VJ+NAYStvY2aT#l&-fzvN^t=D$Ob%X#L(pSmukJz5A*hUDN zXrT@)VkW$8CbTWvNm(p4X?HT3K%t-!E{9Tp$`#t}&gJbE?Clk82#8&&5$s9@`AXeI zqMn6}Fp!?`1r!GrACYnCcjDMwwrIp|6V`J7t~YI~=yt2OW<*qY?2U~qN*HHjmhJJp zMjWMy?3&)4(EyUDj4Y+VEN&?3NmaioC$wbLK$#sHloGy)5e;+&;nq*_0s(7L$$1*t z_`L}vonDM(fI$?HuuWByF&)&M2IU?V7$|HGl#)4Zr7{xC#Qqq1H5TvWh~H_`=w|D* z?&dE%nhB<=>lTFmvIboopwA?v@AeyHe53*A;rcAEClE05l9CKC6!85YnWP2*CtX&4 z9eM_;e@yo>fKdQV|~e(y;oDgcP`E z@t{!X&hNIeWs2f2w5{&`Mi;pjn1GW10qi>9knYW2aqt#isr{hGkqkm98E;V7l8AMf zQ%E5VOjriL&xRz=2+Kg?_S38Nn=2J8M{V(-m-NT|pypBtQZvfa!>04f9x~ zvFHuE7d^)B#v0zFHVhFI@ewaFBP&Y?kDpf%=`9|F?xHaq%Yb~v@IvT72^;UZirU%G zI}3~@z-L`ts1;yL6-mW5b4~7!MgOoL^#b-iv#^Lp*(P#@&Yj&=j6Zq;CQ!j3RL7Dm zFplQiKKIQ|INm$|V;8$L!*X&!uA@z;hX^yEnQ*WS>2UJ#Qg3#! z^kU;^3V1LSswzGn1OR0JfGr8r=Uk-B(o0ugt1=7Ar*gDK*Cw_G14fJCAbT}8k5hnf zfo;dp5QsGQz9D)}@0+}^akK=?%BefEZ43JpQy<-Kzo|ebU_gdrWt-C^EKb`3GpuX|B+gSH^~R_wFhX|O*|r|v)nm%+N{1S=_LHO0=Lc46xvgk>iRoBpE&aAO>5`j9 zhw2~CHmCKK4WKJ?Z}zbgcsbc9mI-)Cuab^(6m#EYt6H~#_ar|a_0&ChUFNkDM|eJq za4&DTUn{pnjEZMSpNvW@tf;m;debw@wu+mnC!~Rlk1FVqs%sZk#QL|8jq4EyIJz=8 zh9CBW568M@Z;&JZcY?dn&>^sf2d6DVR-Hz;ku!Ec=BSoMIfiSGkYD(fFS+=})bc^Y z4o{!p0n&V`sE^3E#R|ua&$vLiIX0(u{Py>Y>o|;`*Jz1KE#|1K$Tfs3xs?+(v6yR? zZ#Z#N`O!@HKp=ULLsowdIB|1$mLxZmZ*_Z`VjqRuOwM=7%J`eZd5i}`sK;kn)484F z*rihq`2gl2cIbth0pa(ji?@fabx<1CbqsO$auPdwSYp%<@QPesJo zwxJr{BVC&Rv+=Y$y(6c+`{j&;`NwW8x0xZDyI-oI$d~=dYy8NJRHS-r$1Z%O;;&(uI#>rhP160$ zKi0IT0dR;qd-AuOn|V5=iXhiL29P!2=ZLtkE+eCTk$5z3I#a^8{j+9Mw{d;oKfB`b zJ;4|Myvkp#egj^7PCcNF0^^r{TDzwXXR6z0y&l=`nnN=WUoFgMdbPXC{9<|wjUmUr z_uykYc%P)IkMZ0THf19H=N#u9W1@W2JIUuJw zkdz9H8^8GTJmnw$#lEHGga77ZE%#G2MR>ZZ@V(}Lekas_56?jEKm4S<@9zMFCxHVA z7Ho8oU<`qzq%~|<5Mo4$6Dd}-coAbpjT@FvcW3tMKK@fI%IoGPiRwHsCF9HK?@25ak1;ZYUpX`_xICcX;vR5gV^5b!u_7 zWXX5knfSa`)kEp$4eHkV^}%$j-nTuwH`>hdue|~dJg_v&*rN=s?-WxEu;p9}jw^)b zA`rukRud?Q)aG04EYgA*kwg-CBkr>l>FSIl2@!k|#{C4uAiv5~f^feTVf*a=CLNIj zk3qO%W6r4gKD4Vu>5?pwNu(UB>^vSpgsQ*NVtjHp8V@WBNiL-e(#GL_18_>bc6<&@ zB6B({C85YP(nBUSG?6qG-Qy3<7S~)e$hH2n%_RlXtMM}Qywr0f^R5JR%mf7`bF)T0 z3$x1R94$`5xm*P9Mh92qPrWWRy)d@u^sFyC4V4@+G8H@Vj?d9(nv*bB(+qXY3w?`n zyDv9#2u#Vm0`^Wxl~>V7qXq4uY>_1uyiZSibum_xQl;@8;9_lsF;;@d zb=Ockt7Pz4MB#%LUK}%CP_uz~z1Ysq$c3^`ia(~-s)DucGu&!tP*+Wl^jk?c9m|{b z;~7Vu7}GGLJlVz;VUkUn7nl7nUO~q?F3myl3w644gC<$kXV0=(Q=-4pYg@4Xd~#Nm zxy!mvogWUH*@`i9w9warj*#aZM*?@f0JS34-AScP3uQwqwV6tGZwuF9#^~&L%9#;P zF=Xa8rgXiB@P!%E$`{9XxXb6|@?FGz^;p3COn$Rdz+p@9Elx)btz|r4HheFGQw3XW zuPY1zEdS@b3>Ez1}Ibqi7_Alkve}>!t<RWoVs~1u|K2lrjxOXSj zEDC{P*&D$^$D;-6FJBcZnsvB!H<75WZN%!?j^0<7h7oFg-}{n-LJ}-Uk*je}t5Meg z6~5U;CPQl(m-tqP7Zi!BFp&$?{or=D9Kx%94H}(g>@`2m07-AQWU; zVSbF{7p}3eM*s_7mTI@9^rt;>IH1K-KmR;~%wPjt2VnX{@lx)ug8 zhBh?awfP7Ss)$7uCU8=$3tZ%Sr?;~iQC@%l3|{881~u9!&{7!$Uhx=L zqg$~II3)ub0h{=#O!cvjd!pQ24(J?1;>14AgXIe!vqu_&>55np82aLNLc(2dXV|-1 zFtcSwO9_ol8Z*x^OLoltS+0c8yq?Ltl|N6KZIu6;C5HgBA;+~RRkrLPw&=z>KXMXg zH>8>qqlGKXbth+llGPy#L&W9%@M^`gAs$yrz$7j(j{o}L?P$qCr&tT0G z%DDbfkAZD8A2Z*WxP@I5l3UZ{4>c*RWV&&a*WBm-Kwas&BRITOnRFV_sJ@JpHLYQ4;)E*O!ikFBD`7!tW*<5IX|+>bC{Jp;lr+M2wij)p zo*)TOztWU_hl(!GtkS{b8Wwx}LnWV8*JGY1RAz@K|aMO#HmU)!8HotEP&YiGmxV z@VfQ4VijCm08F%V3iM&Eb?DgiYSH`}hq{s_uCMsoR@SsGU`P|?Lj}AZ+2V<1A2x`o zq9fshk+)U6HYQouTnv5JW-ViZ}jBZaw_jQzdrOPvdt?=h96{tIL2Ox#QP3Du*-JRf8QI3!TL z^*sTDu{oux<*aRrIzunvqVTn?t?g ze8)69(ME2k72fY?^H9l+)ZrihCf5}Mjl?rn>2lAQNprH?wM8T)qK-FMBbFJJPufs< z)!ZX?%F~m^R&!QWquz?<*h#62`pPlt))J>rp8j%{g}dBpUiyY6JR z=CjaxWb{T4T;USAZog2Sbj3M8Z1<%4*_;+;BHyiXB(E3Y5`TPMm^ed6%d+Z6Cui5; zv{)4)mVy6*mMgzb8X8ruR78$a6P+kFYQJ}#iJi4Z6I_=!LvR+s{kcGTVh{PJG?Mnu*dtLm znM&`4fDU6+hWU&P=$w!5%0}-(Z;G_<0Zk5V1W#+i4d4z;lJIVbDvRy5uA@?H+X`)O z%1D(?F0Dw5-=O07bg#$%I8dx+C#;BX>9$3t)=e;6i8@Bl|J;snZcpOasG%@#zAljG z{;X-N3xq<+j@HUkP%FN6r|^i-@2qR$AfnCu@3#2D%@pgUxUlr5$2(Z-tCG+EcCZ2G zBrsCylR7Z%eikc4V;2hwef{1EM?04e{tNja`C zyKpf4-VOT3s*5OaFNUtBQV^_Ug8HTl-Jp=7M$oJ-3={(or<{n-UW;UsY{bUzuMTw_NKaAJ7y-asKG)vSLq)5JnUS zt+*T!>Z%YrRuC)?CZRNP3?Y#nNiO>`@qKQPxFT`m$};Ne$Pv+U7ICg4_XY6o^2`3p z{A3S}NT}WaMso1h4~(Qy>hR5H;*s&FF8orm5)()N9@5gZa0`R2GG&dk7Eq?R(F7Ik zm1gF&z)lK*4HkK@E**$@=u!OMPQ*r2)CSS+=54=}iz-plGq2I@z)=x<5y-Gm`Gm6C zl(6FfPc~h1FlptQs7()vkwx;6IPWm#CTZNTaS9PLH^)!{Z?5D{Q!d#FHrXsP*DR~{ z4jgUq&Ft@M=u+wMDXjWVRGe{3MWsKBg5 zx6gh5-ihp9b0Krn&`eWCU&qj9(>f6h8FeH)SI|7e5<S^O}?>jTGKk zOf!OuEwN7lYbVQ~@)*DKLrIhMtR$5rabEZ{gd&c^rU$detR5#z9i=TQnQ{06apb1b zZnE$)1+f2S0=I-rL#b2Y)GN1yDIo8(J7I`J>-4^yV{G&>GY{20E9tt{69W~GHLa?~ zcFr<8Pb{qtx605^I}X~glM8##u{h2h7YsQyHAK-VPZH+V1k*SJvjkNWQmxKNd&?C6 zt#eW(kev3D{Kb47czGB;DVI)q4vkRs(21{sj_{xHI_QXm_LS&xl=K!y;R z>J8QO>Mk-VGnC!}wDIn>E8nl=aMHFK3?i?C=p<4tWl{lUb2#@AVKGRRk}^knk13yP z7nANTH)vj+wIc;X>9jS*3iC$0O^Xl`6L<9Z9x~N<^Wsbu2fgWBS@8OdG2>Y3EeSIv z!?fY#bHJF?TM5=cXLJ)Eb^h4UFi($D6Y%rElVxv}JtK4+A52f}tQ~!|o*XtvCo(vP z@+u1y1#|CXx0V&Fl0&T$X_U4lIq>&X?=XY*1r3u4WA)`gHAa2XOm%ba&@fT|q1FPs zm8fViVwtR0v-WE_CBYCC6Ae`*kycQ(iRY+o^!(FsM$0L^^aX1YO79UjQ?6=qbkuqj zO?8uWb9JklMItRTby=5P#|h+)6gl0M^>DOE*)j=_5SzkQTI2I^?N(SpXLd;kH&2ED zN9YNwC2H$qd3{u?()6s1EHr#f?|830WtI{rt>AzZC?l*$yfdSw(n2Gyq$u>;G#0ZY zmy9M%bX^8?Qt=a=mSlk|Az==A-4}0-b|IsdZ+($wpH~rg^2Y>f`rt4JZ}42@QJZi` z!?26ke0DAyR!Ju;{=BegiFTn7?gKk9ZpFq`)9{NNFsJraU*`;gEfQ+~_tsLw(brUP z7kSGqNiT*Q)?YhGWKC!@efBYDECwIzUI7epYUwZIsRtL+J}dUzIP5^X7k_E&HE*JM zSr$@$@^pVvLR)ur7xAxnvFGSkVTCi9R*SO!_G`^76d$Z@by!=QxZE&!Wmq#FHP;Cj zEiPxVCEd4Y35@L2(0gz7e*uZjOjK8`Ryj)8yvUe&E-?t%1aY$xYjlu4^>ihQP3T(X%Rd)z?>5~W7a;KmaQVSAQMKX+g!DV%_bt$lqa}|2IGJ|JX+T!i} zSV*;CnHWJB9&vT&%9idjSLFOGUt2Ap=4oIFxx)yjt(oDci4oD zwnhR103rDV1qJ|%04x9i007_t4gmlN{{R;W97wPrK~V?~iYhp4m_mb#5K0sXsv;cnNqXG2 z?W5PY3OROUX;bgThDfm%H3>N6NtjUg8XjEntz(*nB9ATfcBsjNM5P|SOqFwAreq20 z{7HH(V!TP6F3sBXwC1p&bAA*%`myb@X60SIop5Bz4!}EHE}VO z1N)U;)M(+`*yTEwZ5(!J%&fsT|Hs|g`(*B=35$*@m@!t=-`Rr~yPkISs@ZwB)y=kl z{<+#Yv`}K6C6}9D*Ug6@VAVy3-d7E}_E$;wz4xDfl1ZlBY&ykOTYd6@7!-5HiC3a} z-MKd3Vk4p!7k>9WHJWUb3D(|+7hZ_ccD?O%*If%vD4mEbwv`lzXRSA6W7E0V(u*YK zs1|KK*{EPuG~#C8cvW^~A8aSGc$#@Hed!fw-F>O%Za3m5Wm=6v=hl=H^)%pyy)D;N zkOv-D+>9dW3FMAty2%hyEgEQ8Yj4s?ACh2}7$Z+xl0?>WQISdIbE&OKo@vevN9Ckk zotfs3jY9aBc&ow*TwijE|8%BAv_h8PaC<7o5p_Qr7~x1pG8P$f&&9bTs#5OPUvXe{ z8XjU9Zg!)E@`ae*mER$W?WRSlIjXm$`t)q7|MAC{plAvA8HaSWn`e_o!iRyZS|aEr zvpD+NC#KhG<)g93lDi^(=q5Jdrdu7FVRd~B z{q`zYBj0%^$cz#vBA>)9*sD|<+BO!PD!y51bZw@Iv8KVQcIu0U{wn99;&yvpixwWb z@`Hha+HtyY>G$f%b_rN=t#C0ouf6r@1vIlmUsW)y815^yz(_-PV9J^9>~^@NM(J~m zb7kCIZI8BTW~ZWF|BU0)fLHcz)LkN5tDdqhtMs&bH*GA+Vb|n0+>`}LZnS@s_^sbY zkEp5K-s!w0mOL|QDBmHayfm3UvKe@~YfnkI;dCju?XoNf40A^ydCj4%*+z{i=6EUU zZ_|yU7krVDm;QE3+-Ci@rOqqwVtvS;8@lKTzn&fL+g%TN;;_JSFMuoNn!9c&?kg|* z=-w(mq%E6WA(zRr^|kJ)H{LL#dNU8Tq{Xq*J#S41^wer12Ed#x&U;Uz8sz3wC#0}>&v|9VuQU3t(%GSt8qYquFp~+bN4;V>_x-wDgESDlQV$8_p zrJX91V?6Ux$32FRY{;WqB+XSqef2L?89iYwXK1Dlbt`6NOHmAWxzH9WQ*64Vph075 z6HpeeM-v&G!GtF=tD%ya(43&du7}0n^^AS(%N=t*7Sl7r@R6~!8BO=b8jO*XinxSf z1`SD6*b%0qU8D3rJUW*KRdDuS1FJ+rBodon0GKfscAzdTCZU_?^|qk{c-MI+2Wk@@(LQIbeUe z3Bd%;<;_%c;6Hj-!8DsDPN#Ob!)Z8($%WQlOlslQT{OQgO>upno z$yPEDO)a$F39%$&7-I*T^<_!Bmcp(Ik4K3q6|u&sy1(f1361^}ua)@=)^xto|C@(= zn3CDb*GUd_%_wyghAr6MxneE87~r7vh6f+H=nqO;<8h+xcxdIiuQa~Gb9ob3WEJz2 z&X@MoiKCT1wMrU7>7~LQ9$a^qmnkX2&o^?qKz7SX~EeUwN)Mzzs4ZHFgbW zx9$(76Beg=wKP$cej2o&RZmp+I8R7B*tuLgY~9}5WAw_@%!$KQqvO@8ezlH-NM2~M zhsDZ?g;2mocADABEa3j0S+YJnHlCUqY6;>qYlH3`(3-l^M7vjrj<)C6F390^tF4Dl zs^XIASE$%J+pG>H_w521?sn5Omt}sbyb~VEbE&J@$u=!A?X6xm-ilv*|D0*SPis6_ zw^rqpOjf2(d{8DLQjs$>Ic#k{=e+`$Td^}R#f%q0;&wbS?ws#}^~)QaUel>7{P4C| zm0uJV^WX0YD>hSEU4#|;dj?aaWL0JHL#xxr`>yik(p&1No)2x&RXc6Qs;896B|{nrg&v@rrb^9E6!^_x{}`I_V4bV$T6ntwofjq z%y&=UD<34oV}8=TzF6q47PdLfi|OCXaF`WGClYD+*UuX``Xd%j|5AY~ciCxInz#qM znqjWhJOi$Tgq%4!SGRmZDX;9rqdMs%UVpG3s_I%MKOJb%`Mz>rXHFxF0 zdGhs9o9A?2MLsMiPcBDa|954JCt9x3Z`=lZA$V#l^KBrsdLu-D|K)B$=tt$JAD}i| zWQR{P2uH>RGYZ2ypQLj_)+-jKH9JOR)dW6@l6-9Ta=8^*fCqCN_ysWiVmWF^ ziQ+auYUEMfwn)3EgR9kZ+z~N?_b6aviMDilzs6LIWO6xHfg2ZVriOsPBZ$@(Xi#T< z1tuu`v`vo)TdHF;Bp72+xPJHpZ?{Eo)5mF(HEA^GW_T2Wy7P#tXlb@6dDvB73b+&F zmt~#=ZD3e!Z3v3fBv6Z1Fw%8%W{8hPxIh=iguO_IAV@+Zx9)8pQJBWC4K3aVhxo; zI*5#TgKLwcdiK{jmxg*j6fEjkMWNPpam9cPm_>Pnb$1hJjrE5vG(39t>I;@mws#salN^mPU3j4S7mg8a##RQK(N0BnB}%~ZAWTJC!M3#dye^3;pv&SCR==0 zehnvv9(YN|nk0iKZ`!|P`iA|81CPB_E}Cn zcu}lZmcEpH8@7glSe;GhMhWPTt+}09CRB+iq>NUh!3Cza_$h@*ooZ=2A?Bp#*?O?% zreM>g21hOOXp>{In^lL3Ryrv)8AfDTcOr?HF8_*@4mCf>b(L|2of-(0f^=i-rK2Wj zknt#Fc{*);x~FFWFLJu6;5eTag<=r;m4miRp$M7shpBzpn70{ezCoY?3PlnagrrH7 zZC6|$XQoZ*kz1HY3&}92!jfm#T-`UOLjtM+>YV2$fJGRRoF;7`Wq_k;fTXjOODS>O zMGE4&EaMtmFZZDs^{Oz!ZpZRtQWRlzxk?CmN`7Z~B$E)v%6i6SrW@p`TGnU^17TM< zYjb5M5;(1b3Z1nlsOjmBc~7Ai-#o z-p8N<3Z^yj3RTFRscD6rB~sqG8#wl|sQ(F2uc(kLAZ zY;m;TN^hMCYyWu@<@&Llf<4Z-eC}y~1Bj}i8b(^1V4JErwuj@IU3kiHJwVzH}gGiW(g!zaDD6tvqv<1kT9GVl_`T~Ostvf|#U-e9^xqG04 zwR{t@TW6A~<+qJWJDh5?PkEY6xw)Hlu{TSpo=TcA;H=4nRDnXQRwQzygBPgtpAp~gR8VkJG+BxzT_*uvo|W_h+`^9NkucFt1HTi zIsod&d3eBk#+d;HGB{u!Q~yjWQe4F#tic&9vF7Sg44lSxysiNFTwC>c@2SKgBc5%0 zR|?v^ZMwlvY|1fv$Ih#i5*nyN%$_prGK-s{1D7g)2v$%`O8yTjti*%{^#%S?cG#1%b{BLtr7WpSzp`9> z8-0*PN6k>h%0sKUhD(837|Qi4v_q+Ua;H}qHieDKbD$v1UXs2Nd&)Ys&>Kfzf11lW zE2KsFYOmPUekZvP;j(3Gu&->I1ZSQq3CPL@McJBn(Cl*^-MSqV(Y#F2jr`LRHhEoj zHZ&`rsA|(a{CB>WKi@{C3lgbD?Y%{(_lYwl#fLzV7h*-~2Ij@R+&8Bz3=SMqsWw()irY%j!f@sp)mS<7Anh^$nN1BTW z`@8ZW%=;45X8&>9v<KA}t`T0ogjjdjh?!wuLW6xNFg%c&d2 zawxym(l$OrLh=&Z{)TF8+<>MX*hW0;mnTaR9+t^|;iSriaJ*_9KEQ$cwE&994acH< z*q&GAaFsNo8+*%pidzlz>5A^YcZkL~I4_t!oA`#hjb(xS45v){+iP06tP16lI$lJx z#;B%gPC9wyYnJ=}brZjzpHi^auWso5JUdTZoY)$6@+S5YS4E!IxWF)ni}eObfm@2NJ! zY5Ux&3+^?X#LV+~i4E`A<%_nr)kOZC@2k)UVl4wd_JoA(*dAZs2=m37&C(>*1ekk5 zbnFNUb|b#OJbUYvdZOMFOz-U8X20zW?~p0pkHHJKh8?=~``-PG>Fy0IV_UI_nT6!+ zhyHHNn=kMeF1@MzyxJbnUyt3z{GFZdgAo@g--oBFlvV*N+OL0@avz-^Uu&Zq@OS;{ zJkPGq_0l~G<@P()$EuLYj@X7f`GDwBVVbgUTFJtGW#P3?Moom#IH+%Vv72}1o&SGt zcgfOZZu|XM_0ucl0N>`5F8tug;e|=Tz`MjU2izMC@SZQ;lv#ZNc+*2EZczjfiv$i_ zQE=EIP@n{27{)N6JczJhEtEIVBEp6eCtBRN5h1~gAUS5-R&rZNlqprNWQkJLOPCsE zlB7uz<3xoHGv4$ll4nGqAr)f07?fzmk1bblY}wSQQ-cqICVWb;B2}MN7eXCcl%-T> zVIyi)8rAGrrdZLAE!4KHRj^%&Zk<|J;>eLY@7~Rtb|%h}WQA@Oyt1a=!xR(CWyrH= z!=Dg;5~j#BspQCnuhN`c*mKiSaUTk{JNol!pJ!ELeHwbT+{kaghW2_hHU9?9xIcO< z4O(Vq%anzhMBUmm-^0mkR)*_xu1m=|>0V8$81n9+)E$B@{&_TJ*V(HZj?G%FXtGPa z7gULst9t9ErNTv;(rj@0T@nA?j~shP;$nyaILdkw&OqnlJISODUfONE?yPz+xd|J? z?m4^&G!41}k(%nU=xi$wwg`*c5W>geJF73K3=3}*u5Nm9zURI(PqdtHG|DmIn5#|1 z4SySNC+K(^P$UF-M6t*A8hkLa1{o}II0rGbaW2+KqjI(yJ;dxu6ziIDOfi|v4>s_W z%&@Baw2Ep>I7vJ(ILO2dsv`*#)XYTz`vmNy^g76^GXCHkbk8h7^8eC2+xGG=%rZU1 zFh4NcGc?ZV>XUOss@!AD(iU0ttxXeubo0wCnOjS*O8?x;zCeZ4^VGmDiz&~+j^oQW z#g4Ky#LFgK(!R}#1(q!x>$}v@9aAi_x=q(JsIV2uBvn5g*K96N5|u4&*Sut1Qa}(J z({0%If+aL2Q7-*fS^VrYQ(Z{4vusiEa$T!ebeGiyO*BR`qh<3%VH@T4 zOL&Lec2!3UeeYbn`t)m5zZQg2&`^zYuUuTeRZ%*14a_kuB)1FK%Z5|)7q#r*<5ABz;=b!S)>*q8Fslz;h`C0zHYDV->w~vG~jw^?7HT_UdW}hCOY^ z&2IANCtXhSafd(`+u6_7jGe3Tz20&eYz*Vz!s{7ePNo@8xFMF7S($WBg zAUp}JHM(0MgQA2uSlJFgFB28Sax+1|DNsk{%HGL5RsX<6gwHru%Su!GJ!E}N3Z1Azc#+ZZEngS&TN90#ysX6w zQDF1YY?1`8#cc^qW)qL>)TWlBbm}}StC{S2fHY;v281$7}%l>=X^sn1R?|_FdzgfLFp6%(1y>QR1O*y z0uqT}5sf~B3>G-e5H@hS2t;E6LtOwzT>(=Zh=Bo%Kq)xIV1q8u6b>m315A;bgB&E& zrxr-6D=6>`oJN4FJQau$l%SFTct923IB6AeTGO^NwW&SoAP2$YHaC@UpDhHDTLssy z!v%I!?Fu9H4oMvn{s)X%ik>P7D$o!~kN*H{6&(w>nM@O8mIh8RW(2l?)q!}H0v8BF z6SnXSq0;oUT=>BcxDWw45Vfc<7y>O-JZWBA zwJv#-%$CEJh{3@TD!ylW(QSN`sqm^IpB8ZdO+$Om5U@iAych^ChTsM_G(o~lSgKr8 z%F@t&zzSygKvnMW;lk)(s&MeF2gngx20TIyD^>$JMElj#V%5NlkO2i?EZ4F!K*xso zWo#v(iaNm90}~JdgqM(AJqW}O4gVf0N@T!>M6kHUOHja)X-oqZFTf(JJ%J0%D&BR5 z@pkD&k`((YGc>=9cs+aX+d32G^P+t?8qWy)?B@Y|LAFcSLI_$A zlCxr1t~C~j7rek(3&&vyh~|Zs7omdy59H8gbqY~c!2k+uIm#%VEj!NnR&Y33rk_@6 zf&=jZALrngTQDYtW%^53f8et}R*4KkLIWk+!4AG=s;aZA#@7KRaT?Q2#c-pO@eLG; z&ms*biKQ(*N2oX35+&TMWW8wB`F-C#^&+M~SsEkQ2Dml16DIJ=;Ho6nnH@+V?9GJU z!hxfTF88IwdJ#K(d8jH_0{=Vgo#3E;7#xRsx z*UFU_F$GG|57n0KH*eBo>l8Pw21lcX4K{VYqWnUWEu$BJl>j7N{oxPn`qwl0q+QVQ ztX;t5DM0wZZ|8SYqW`gDBU50lGF|!W0TEufUOK|IzVzEmzGdN)n(a)$wH7oU^4#*C z;=)bU#JQZuO#G`@D zng9uCuq|6Y4*0k#U_2vBfr1+{kF&ty*evRkyR7>@@PjzgYCKZ0qT{KcN;(wYkU#68 zAeczHy-Gq#L82Wh3n8)*=TWo9s;kIClSe8D)Dj2-$btt$HD36w-RiWIfF>9yf^RrO z*`h4kI)MuGwEqC~zTEmgnIbA&D?{z;Kz6djHTbo(I{_)nEE9N!2q1&!nmZoSIs&^r ztuuqq7$zHILzYM;B%&Z6gtqw8IoJ`BgPIt}13IJ&D9B@%%_|*JJPk@>Gn>JokbosD z(1pWWxYWu%Qd78ri$#dTu~nNx>BBzWqD4Ks@~G^Q$nTNucJ!~=*!Hw;6=8^k&j054r^0J_sa&yXsJ zOv4##!~Z5Lz+|*YjGVXvT)`W9C+9-Q)3`^&ZOBcfA|zfeat!M42WL^=r^A`zG) zTsD_Ho$g7bBLb(Lw4WE!NuV6c0Z2*E;K|}pA<_9qR-^()paQ6Lgj;~J61YeN+{lc4 zNH4U=G{iegGsePz$n3hoh{VNPBu23OF$N1csZy;TB0t8%fhq8_^C^R}G)u4CLpT(}1*#p3u}N~7 zzyIQ~3P7#HULG`9hCfE66D5jeLMtEOsL$)aOF9fMhxCjfN<|-pucJ{;YAKrXLPBjz6MvD;rfAN}0-fw!&Xfev5~WUs znx;>qOw066MmUA3tjaT(QHn5t)O;q?n#HFWssZcCar%NXP$%)jr-~eb&_sZ%R5)?E z2-k$ZT`JJr)J=_Kv8~j~iWElJQ%ohy#B*U4bPO1C!5|0HP_H=|tg# z0_CM1$iOPN%?G{3x`aJuoYFzn(wmW%zp|wCi<>js#L^ifnrNSW6pY6tur);q#v{r( zZBJ$^RV@{qDZO)y$(f_PP4q-P> zn;dJY0v~`%s0>J-x}g9(J};~a70?1jor33j zMcIqeX4R?C!h%Z0+Dethr?9Tn96nqW00Cgl0+0l{rO^U3NGA0#)P&7T-BK#Txm0OC zyP1yS>_p%(POqUJrb{`pz*)!L*~djxcr&iZrQD5jTYpWMSwXtTJDkDTNKTX6htz3*RZmJwL;lq4NKl#Q2*sqK3y7G;uWUi zC0?yUi7t@CleFBbYzcSLmB^92a`n^}b-y7eJvZj8u ztZ!nfURnf8AcTSN1S-%4NG(~KvVzZainNVHRG)j`#~BPkdS5 zkdpX%zrt-47w!&;I3b4I-pkZJhV0C?;^B<-y(}$*&-F$GLx4}Sf*|k%KQJaLzyfLI zU1tb})I}@YtbkY4J7mJ$9$U3xLc`s)--T7+g|kKg2-!0P0snK$z{0~p;5)I}+u}DQ zH#Sx~lkyB*b(c{U+#-PjKc>lXtzpYcTst}!9X8fBJYbT|ACO9@Wik~g-6oFGX2b&S73C^6!8_1_ zd>TYx)&qCG<3%gM=7r@*qcktmWt2p*u>`eV9y!g00RM{4F*v5^Vzy{DPG*iiF%D?3 z`i;bBPFL)WHsVYgI1!-~#!Ol3#e+0Ua;_`{JrHo%cLh{Sjo6$8 z>4k1-<$WeFc4sR?gIA_Yh&Hz4C0^k*=AboZyY^*?v|h@gzx22{8D=(Y7S7W^%ASl6 z_I&AXJ;=m9OERuyM>a%5EGsoWQO5f-cbeb>2m?pB2v6{YqV@tmaI~U!V0Sg^v&^V? zeI-WyWVKUmBPgp4!`4^y#aUKpA^xuDduy<)J^xBwx0KxM=PcOGE^f^}ZfWedEgr_) zifwS>YjF+iKVCnHIvS!RQJ>t-!}e6Pc8as6>VpPn0*z%XHBfj82}@vv@k|Nz-cwWv z0zue=JqUxU9=vT$ZLJ8>sCwYD?r%9jW&rP0jFi1d-cg=~J|A#vu|C0wHmVIUZV2at zu8Q#DKB@<=a8SN$WJ1OYfLjlL=Fc?c;qJ{*f^On;pz7uB;^5rQEy=MI-~IGHZ?*!= zK!t$_f<>TWgy;hcpoFnH03IK0CKiLy-s~cGGy^DWj06DG7-K*UVy05ix|LFHmA(#7 zV1kBH<+ZK4n{pK6X!QJXK_YGnhszXtBmWM*02D}1iw0)=9&ZuOf@-o?(F;c)bh8(h zZaoL&=?0!0k0)prm3M3k+12t$RPx3(6wFNt7h`H0cyvQ6Ei!m14@Ov|I;susU;~xl z6r*XpV{#@%0Ka#$vV_qWB^WNqnJe(UjGaG1{8)2wBXtL@eF@;2l( zOYY?pAgu`p@+){wWG8bB-|Ppgs{dSy-qE~UxYY_j<5EjhcFoJ5EIQmh-?=7HmD~_{ zvxeNE#iw!u>f9a^&;s|ukTA;T>ge)uWVS?QsDVGGXZQ!q*lsGpLLdvbsqgGWf^LUOczlYqGeVH7*S zIqXj<{oQv*C&qWk_*8`*2wS>eJG!Lm@6K2%ufQp2OpxtvDCT7dxB!?!;-@1kp%#GA z2Xbsega%XnF*kIUXs2T*zyGDUo-a*YW>X-9T4A?GOW*}#soMK2h53yI-b8TowHUKT6$0TmgRut;&lg)1T# zIwQ#t14Vf$A8y;|vgIOJE@P64QS;`_iZ*xBgyQpLO`Q~la0JJTm&Kz;ITrmkR0!0W zQm0a_Y89N-tZO!ou|q+kjfF709PsjEp&kZi&NifIfMJ9oi^yecpysX`v2db398qS$ zUX{V7e3`q54B{+9PX9a`fy&a%0!fV;wMgP}QigXlLydOk^P&nK&rk(yx(pJARlc0~ zE6IfmrVt?X6+j@Q#KtEnCMgT1ELt*stPsaRvB*Zr6~C3}82VvqhFX3*D@hU*hU`7F zb2mwfWlLBxg_6hV^E{N8;1_-mnzgi&mdRiR{PYgB<2bTCK?=%qYDs)CE7k#OT3rJ9;&W^+ArnJS^> zuo0CI;b29C&m7>_6@3tPz!zEcAr>FOHW_S4MDRKyu~g1>WmPuTc>$YLjTfGmQsJbY zc-dwv)HdC|$SaACaA67}Z&dk!qH8dIafJ)4 z%GeMJf9$mb8E_rC@S$ksfmgq-PFB&Vp-K#IofT`eBcDvt+Cy)X2HQmm7xapQZ?g6V zq6N~m(f{toO#XJAJT-&a-AhwZ`{j3chNmXbJ)_B-#8}zaYMoZ9i!syieg>L-5h5WC__)U#DK$i*@c$CXl+oise8;3g&7fuWkAPLS?KCFYuv?@Wtb%$FQZD?t=YWu z&S!K}SPs#)L_yMO>ut}RfbU^pa6xGj*99r8%QjRwR}Yb$`2y!OgL$2p;hLFVx8l-7 zo=!G-NqTxL^%PSgiAg=>Kbe$02}@MPInf}lN@^2H+fNs2_8HS z*V@9Q1I>gB7CB#MV$?kPP=+r{SdiL|gC&7Mr3ywe0S@DaAK%q&gL%uF+gQjb+i6cM zSGdiwfMu*CERSWv;=>hCz_=+cYlf&Q$qL@HrtJW5JY8gun!Z#(o&^miJ7bAw(ilM< zI4}-wbYoLuC&vrY@lKV&9n|nfn?5n*Paz}}el#_s783C(3IWywj0YDfDFF#cFp>it zU@wbl&WeAd467vcLp+2kZkbrrWEjvfDfN*6PAb?Gn$t&=kz`nWsGRvol^>8Gfd5MX z#181Hb-*6(q|rPn ze=6!c>z!*1?dd)h$4wduUw8KL8q9LE;-%KZy4Ij!{8}TizPE7 z$P~?7Mwzvi=>=(v=v5S3DG*oQPlPda1zHp!);(TOTQ;-k7t@rwV2X=%UH>c{2E#d@ z9Y%&lC`Bpnrddyrdf=Mv9O!!#2d&@n5PUS!%!oX&mPAesbFLylDlHXRB~;Izo}`yY zS~FBnb`pr-yXnMSTBB&l1#@~h2^mhnwv&+oQMM}9U|r^$TlGdUKvK=J$SS@oW|54a z0}7fjDkkw%>!Q0<-9?Xgk-wqpvdXLvbQPsWlisyITU!E5(U}#&_MmntoNiN}i@YN! zHj(B{AaUQ2R~c0LhV4K+Ht?Xr_jKB&@l8nw=u) zkm5=-qSD&vG2iMQihAx^$eoE7=Of3wiZrg^eU)JmEQb+Sx5RVt4yjaMx>=m zoDa^M$O+tY#dQ^JNR_)uz0HXtrNx{`h69#7AR#0dumj<+$;XDNe zJ*@*KTq~RvZ&_172CjkZ${DZye0annCR&J1+_WedqRjysp@Fs=fi~ilVqvYUUH%)F z#gb(L(R&J>?V3{m?egN!cp_?3 zv)jU+=IBD$A#Whin;nL-)1uR8#p&uV)~Mp(OrpS>n4Y-LJ+0>17(*9}u28o%jA0bro$T!=q2s&NgamKRy9ZV3`a3d3z;2iAKYlXUf`#{V5HIy3K#Z_~kT?5QzJo3=i2 zzK&f;Q?VY}4Y1`FDBzW})1LNjiu*h7+dYwc4Q25g#ZsGf)Ezr@(_)zI@sZEfz+X+E z$B9*@311xkOxfl^^Q~Dg%;f}5vV`*%I?*d%?J|=;-{c2<=wa2@YtBA;1fTj$<6j!^ z5}LA=Vy^_$LJiQ~HGv zfVh+g%oMh9lMgabQar*Vh|Qbacqv0RFTL06GeVRhTp?FR`;*}E~AN4;Aa8I$BC*TKEZ4Ejg; znUr_gprEy3`bFJLuv~r(-r8+MilE)#1cwUb&2%^r2e83H5Sx!E*`9F7{NY8^2pdCq z;1+Tr1MZb6YK$rJO&;*kvK*95F##^%!lv~B5x@^gMA7580$Ax24qC;xO&}Z!*W+y& zdN^1a0h2}{mocfJ3Jy=u$p8#88U+<1)5M-vC;*em)EIgI7Mxa9U{yq1SFshFq_9x3 z_0a>+*u5x@zLf?QE@9Xin%Jyw$)WL*$00zh8EKgOcB>71+-PT&~< z%FUd(^;@MCN02FHxe<_qWz@A~CFG$MMNVWR1cKSk+gMJ3Sz6wi$Q$ioWGPAwM^>X; z6r1Up0Yb@9B2J?O4M=jZktgy+v>Do3)?=Q~95Wrof5AogcwF5Dn_@CoKT?D&F2W^5 z0!ehEue{c-bYK>Qqc(P6;Y~$SW&cI5EM>HuTYh-U9j4~DY$Yj(rE7|1yt$@Xs$*8r zTT$dxkM-hP2Hij|h-J#&R7Aj5fe;;x!8nd11)xFfEaumA;U>My#9@{c(UaW)+I%r* zb3!75I6*EfLoO@?Cg1`l+yGAj&q!XC1@^}BsG)ICnr;SXbU0Czg$~nXS!$XGz4IhK@A()MUpgce*QbdJ5rdu#T zJHFlBDBP=DTS`eAtUMEAw&{v8piziYT7)8SJj8bjUM)t^h^*&_PL z_Eo?U8>oUI-(BIlH2({Wv>u3!276tM-Ynt0)QEPv4T##S@~~X;*#g2QER0SS>d9OL zx}s^3m6(a9Y*pB_5?AWv=jz<&=wxe7Flmua7<(*Ub)@IFBCOSA#n~~1vb8MHIK>^Y zsJgD}akeNqHsP9r;So~OciC$e-s7`{$_6PMb(%|`vS}yws?xHP>P?`rlA%=8=@We` zEizHW&IV_!Vx?6q_WjaUu2pG*ns80j$d)amZY%nXg4(X_j}BaRd8y@`X{+GfdkWgj z+DS<6=$DO^*2&(&?2FbRz#|0_CV@(61XXf;(zCt|@<2ca5FzwPfF_wsspcjYLYu&% zC~o-(hsY_^t^bQnIpW}qF0MwbQc)~ZV%fzOSCamWoopX3g)F3w?4#E1F#J#2mTbu~ ziAy9U-2N*Y{iLf%kTc!wo#?HPEx`#)!rKuq@iIyoEJVQY)1O|4*%-kZTtM|{j}%!- zh}qbETt<;O?_3p8Plg=6I$H)#3H#3JlIbWNB-DY$Z~oNR!!!r};&0SWD!FLXp)Sw| zE~*{E+W=2l9@?%b1n}BEl;91Vq!t`;U>sC3(i@qt@dlPyeQJX40N)r@2Ya2-^l2e< zz(1W3xb;dT>Z-Yx8OSYNPH7gJJz(Mj#*IB-``$49qJa+Ya1I-oltiWKIft0#uMj(M zv`Xu=p8wiJI$om|@R-~uqMj{=VXP=ru@&F$%`vb8x6&B$FTo(f53t41rCR?1>ILhG z2CG+H^h=<<=`FIxcr{3yxgQm-P`ZYeRQjYmv18Vi>ALWRb!MacpaCzgua6iq4twMI zR8r1z?GdAd9GVVRT1x@Dj>jhHgITiKR)y~B?t+PsNH`9T35W=kvX^bd5s-4KopDCG zK}G^v`LITAw8lo3ac~G9V0Om$YFhb@?;5BAq5kC}_8k@8D{eLNe%x%mN>eZLFD@Z* z&ox-sDygY0&=LzUqWZ5y_U{RH^U48Vb*K!b>I(~oDl1!s45TPM@*N8`1s@lHi3C8} zQ2#)SMK8DsZY1i3MC9x2P_9ul&;~1@jh*fy7;a_JRh$qnM>wwrG7u^G@V`oB_zNE&Tvt+a%?0!@q|^`HJ{-2PVw4`bEL-R5wPGn;|bJ7qqW8K-Z;`F-I>K{ zK|oQ0JU57sAPgv!>v5p)ozv@Kp4%?lH!|>ewmnkOSgPK;x$HUL8hXtR!<~ z**faizOI#ltX0-${{X4Ob}6VfV@n?|9RxuO_>r9A7!3`y^yYI64-d&~#)yKjbD^Re zPwb$P*|Rl3^;U{ge<9d#0GYjKReQAnX)G}&DgtM7M<3(ri1jxsVxXYoL$qL8zyHf? zhA~|ZMTZb?RtOEEOz4DOo5f*DJ=zGNzQHlFw&Y5fNXpz^ZfGhVBP z10Vq(4|YZ>t>$Xpo4ym}GSywsZQd#1V*mAfcHIV!UntSdgZx?O2F@hQ?lqUmLr!+$ zZL>E!9=9MP^%YY^IW1?3v357tYxLC(jB995Tqsp9Wp%iRt1ng8u?ndI@mUDq4BFDl zmkP}_y0~hhsZjHjF6l9?+dN37`P%8~K*0SkBr9VwVl!}!?N)V4=9dV*1BUr2e!O|xa;|>X#{eb^38}y&|Uv? zpfY0UG7CFC4N}kJUpD4}D=NEjG)Kb~f|n+dgLNHY>l_qQp&$9Rl1n%PV>ey6RHQOm zNBIm3Y*F*7hcjT7kGYHYYKOy!Q5p8Yo_QYEm3o6XE)%Y2m2YFcPhw~$X)n~BH@I|T zHFNt+Mp2)XL8Slc5;t#j8M-8}qh*w*;25v;E(_qka(R3t?yf@Hho`TbZsbv<;_-;O zVJTJX3G+g^ONv*J4Mgx@MewEKb`SyekXq|@Y%>CHwQ{c&NFO@97yo*YZ!F^>`hGwu zDht@~5c}n+>ujE-zVkPZkLew!cY3EUn+^=`9cU+txZUP8=F#x!MmxwwDr|}3V)k~r zPUp_eE=BHn$1}J_#k;)cIkpNpnC?fv$7WhXdMN#{`b&kuG-lP;bc6vn0#?G$kOWmV4rs9)a^Gr#b)Yxu zsXe#X&H$k&YJkJbxJvp=tgNa;nh`{r;^I(Pb;aZIa#-YdIl3xjrA5a~A#Tz0g2o1p zB`>gwqnHu}7{(qnwPX%(F1>CE=kD;`3(g_m4pWy;fbA2N3IDpTPw`0exv#tXqlPTW z!~4j~dlWMmCS%)Fnq9yf`^v(7&zyU-779>D!_La~zp!L6bbboA-4(W8)d&rI; zmXW-*IJQ*yCq&GC7zg`q3TW>>kIfz!wCVmJ0K_7Jk_g_BAaKzV1!(N(z_S3MK!p)0 zMx?Q@qQ!w56Dr8~5hTJTZkF6JY0@H_2xvmKbSbi8nUNAbJS!kDivyMdnMBlpL=8fA zi-05m0s^54r8GStRDr;XgO?#=OcmG&E7nDgwvzHnD*xlxtXr>k&5HGf6ofI@o;4eG zPTW^><<_r8;*laIz7# ziY@+E@7?IksQ-4k0Xq>d+5-sge&IW!2Vtz24|&7;4VNoNGU)O+#~6j3fh2?vLq_I` z4H~?OGFpcE7P+G~f!JXu3SJacBN~eAXow(~%(IWe0o8Dijn*clD2``lQq8F~Xqt^S zfi6HJLnbuDEh7dQ?9Ie0t|$(J4VTMHtgqk#i~mNg4C4yN!m5#OIz{Ai36!qnnaUZT zz`*V$@@$;)r5tit1O)>#0^-4*l1fA<2hn&avLbl0NkBppD z4MFYAh$4oN=t{`=bAr_e4}`5uo{VCL3J9W+Q&#J|6s=G|^85>sV85B7Ma(9&15g5U zh0oAFQDqPXKJyDuMFnhVBPD9txXi)@WI|{PRm4?=A`O~6jYsCjs%W?zbyO}?mx8(U z$g8Nk7o=^rY1FC}RuG7ffN?OFU{}E46#pTE6<#=At3F*AN`YJehhmDqEXYqSV-sqq zjsHTBOgKX#ArUto+|MN!Kcwg(0CeO;1chmd^T{+&caFPZ6jQj)G zEcEYBo?)|ou9|d`_gG0NevYj6|qx4Ky>9d_>$-qh%27qal~UI}Cua`qJ@M~Ol>5X3-@ z)HT5xC5d?%tcZ**Ae0c0A!FAwU*}}ju=riBgonW%NSe?>`q`*`L}|(RrV_)C>}-Z+ z08a;5mz=|_3u{b^8rR&F!5|zl4M|kuyqIVy0P?O2rc z=?F&R4E(3S6mGIWg@N!UF$-Vlyz?9%x7cs;<#=t-^XQM$mw zBOyw0kOABsyOw98CR)v2IR8T8BN6CCOTi`PAn=`I*lc0jyxPvF;P|l z^TC*|luGEqs$?k(SIb6e1AGakk}_Gr15)v7pG71!a~er%DztY1tQuV#ia^mG5U0*$ zU}}3wQEU?Qt-;Cd6g7Gng?%xx;YpA5E?Zp7ZVF-hOUq4FVWc~OaucAKFr*oGliwvTu?xumr3 zh<`Xi5o>b2gLSKlVMoA4$;+=zV_IxY>(i|y7{_=OEi-RyN%E?8cK=HMgrKu zLSAk0@LMkW>Nk09CGnIMb;WFA_qI_(@{*a0F7UQks_8W(LW0`k1e>|81%8XvygOTH zYWFwI32kAE4CVB|-rYnq z2}$Ac*uf0e>jSf^y9i(Mz8F?=Rj!FlL_gJ&RNGJGBtD_{Fz&>PhXi(OG_W?0m^|S2G>f4EH5r<-PUt zBLDl%GT$++TW8qP8`&^NmxXx_Iup=e|>^ZTYpI zzbf57Dl{IBR*tnqL! z{18s8$}9W?ZS*L}^2*QrtPDv24ewS>~G7Y=mS>|1kncP@QSu@2h)Pg(*IH~ z!s0IPK&{}KW7B5q@nq2IJdgbbY|jE)w^oFkiu}*+suJ%~Y)(Wie z9B-LYukaKM&8X_v7%Z6_3Y*3)h-B;qH*M1RO8!_3%d$=As?K!^Y2|#d{@yO-B2e?V zD+!;Y2=5T1(2wh=EAtdEu#gH}{7(D6&MR`x;2H|Nt}we6ae3rynA|PbbPC1Z4+q_l z++vKn264^S@Q@Cyrc!KxB+%L9umY9j4lPg*hp?bJk;n${mo8E3Y%b>duH1l0?l$fX zDGuFHz*1dFNzB~H_XB>NPpuZAi5yzLk-Nyg&N1B=hH2>kIt~UZTU;KJU|V zM;se0)Y1_CWKR?AEfv3T>a0;AXDt1IPwHZC2l)>nMNkK6@%p;UBBKx-XMm|J@)ygj z%$P67hU(l7kLLjKv`!28?C%^+(g1O>AVUir3(!XvFy!Fv^}3O?Hc{b#FDJWi={9K& zZ_oPhZX+3w<`xLM1QOy1jMkuWl;kA~r;wrCkqXr@;V7;sWsnBjjRm7ACZ}u7hU%z0(}n>;gZxU&mhgQ6Ag0Vq>s%o?$kI^&Hw1H9@jC`Mv{`I zNGt2D3iGP3Hi;2CZpg;4CoR$&!xGoTa{8hu8^_G}HYzG7GT#=`3I7u6CW_Kr@iZfo z^TskGTN5y+NEgX0@ZJ$J3lC}#keK?fGG(zWq0p#aaPf$$5`l2H*itj|GW7O^?EtPW znQb89axBeJFOv=xxvdGEkTa|A85iym4~_l)@MHFr)@2opNe%m<-Jn#waV1@0Kd z4E1>GwVKg48O0MIeh(SY+d9grBWt0*_|{o1lF|FW0j5;Q*%38!m2!LUI;a}VDz z3a!#LO%oYk^O#=lCHCNlNb)>^?hDxyH%l_{U@L&MvL+kTLjTWEDgRDF!EcE2ayqRu z-k!@q1q>}O%o?-J+yv1NrLN&hu+Cl+L*s8kTU7rNur(2kLJ5!4z7Dl2?Z+GnL>rSR z<1@M-Eo%-A(&E!B)$Ssx(MUs6G(j)GNDV^O5DB+&K|^%?_;1%^({m+Ew70{FZQHhO+qTUeO>ASwwr$(CZBCrbytB`IRbSQlAI`eytG?{& zs$Q#q&+~9B{d!%~AX}N#G15e0k+k*H%nG8%$YhtzpvMc-WY15bpPID#;pjYbRnl0-j%vIJ=YnC=&}3431JS<daWqSO(BKF_=SVPK!tU2g`FxrmOYUfu;>GenF8dvXRpV8Nw&?|&3h!A2ZOsVAlR4}WtJ;gd z_?0^IjrWaR3#Cy5#!JF117|Vqt!f3H0DF5vS*y8%DWa7zhN)y{RY$|!>P1_-$_yEb-P2{ zV5w(kwQIK~LuU?hVeon9)l;)n^2XwM`F4C@-EMl}&CJ%|$i@FkI0e z=_vpkwm$RPDcqEzD<)Fx#GOqOPmkU*nm)bnM~SRfwJs^}-tImhN{`QhN;rOTIzd{< zumU);X6ynP=uUE&d=~G%gG}P>UWT3R>gG$A`kGTy-24P|cSX@)jTVJYdJ)K?930N~K39J}6bp60K>e=4o7gIH$*;c1TYZ}b{VV}OYe!(J*aohl zaS6td%%)}>9!|;b?H~F`4wiIo(aY+dkh7m&NbD zn7?K|cs+G=jJkf*cIZTGB04!nN4)dsDyE@vGdS8^GJYGQX%e-|Ue=iBbCHuR zLw>z)`E6{Ltc|Ox(p00O!M(fWvO(jdr1|=0(rR?lcK?i74#M#o}Q2 z{cfwlm7?$#v+gd4lJyp(sk~b617cI_L&c#tlKGWvn|`d65}`(dpcC5qmeKstE`6_B z%nTayC>nWsVaJU4Z^KwmXBP2VeHSllo=g2Nvs5|n1g34^=2l7&TA>6w1sXu%GA;0W zez{EV82?@P8Wnfnha3ezu@omw3c!NW@h(kwdXH`$Ix}x z_S9*nE2QNckD*nOlDp*2se<(s@2~e){iEvFipyi0y8~ML{I*zr%hLBYXfOBWz`d<@ z(@y@89y1fih`(vRs|I7E7EPo4ahHm1^LIENZtt${;7v~Lr}^)1PPmu~wnj)AzPYum z1fvDLlErVn9aP`0(AddX0eKu+IYG-{A$4_1Pvv-R z0|EghoA@%tUO%Dsi-McB2isB?fhdX&zvf=U3N&@`Jc_ znZL7DTL*CW{KEW#H*>Sn2sE2*nY0Y8%3p2rb>+&x8zWvI2j69W>i*Y0v_cDX4k{Cg0x zx=nr42X`vmH0(|MfB@e-BH%iS6Jg`lKfy#__D+?Q;HF#q)GcQ|S6c(oAPwJWG2*QWr%fZ&apV;i%D_EWz+K0fgAdcxPuj^se03cn_H&Uh~t^EaCWXc1NPV zj>nfhG-D~A2chz$*y8WH1fH_uH_OXDeIfwM8Pd^mdzk}rl3Tvl znosk8OQ2J(%SD0~J*H$AB6!WQO0rw@8s&ql4-Lbdt8$q^+&efG^{N>-7Tm_O&&R?6pk9 zUsw1Jkc*Q4wJ)og+yHvRATW99Mix9QP{HDP zkURKo^FUa$c`LrS9QXBauV)g061j+IrKT~{__%= zYdj8O=p2T4@)ha_G5g0{yf-lX`xJ{{BEZFh*hB z#rWL^2W+pM8-NFG;T8ZC>qkbv?yLsCA(Ouce~;82ev7QOf*Ta^c!sQU48!&9sHF#C z?5-^1EpBnIopiPgyZ_G0;`)!cM20t=>f^IK+l*qrn`UQk701rtUp%Pa-mGtJl;j-5 zLh|B*3xBV53BTj#k@D_sEGLznOM?ex_p>BB$l7AydQtsPZjkK#U5?S-Z>9gP83yIp z2All*Ish#jyV_AN%=?9!$5%v7SA0z4Yc=ZWwZj2PnW%F<#NW1q2P~K-?J66S9wVi@ z+i*FoY)ChkekZI>pXIKtZn=*MgW7@rPLsY+Ht&^oATP?zB@^buW#RUHU|;fAeC_72 z3#heU@b@FKe}Bg5^k$WQ&p5bXQ}KQ|63$lC&kv%ko%|&0Zmsds#Migat+dW;f&)Le zpIzCk*E)WE>c8)5MXIHRAv`iecbVMPoVe-((HfJZIAT|SWpN{7G+uJ3 zh*Q{L>3SFd{%&5st@BLV6#lKI@8Cqj#n$%y&tbZ|5&27K1FKw>Ec>RHFTdHO+0JBy zcL4a`$K>d)A0BArA50^^ET%BfJ04^o0TI_+O@P6zsp!#e;)Gg-5|e zKt@79!AC$PMZh3Lz@$J$BSk|&Lc=CQqbEd1!$QX+!@?xS!6(2W#={{ez@fy$#YD%& z!@(nA#>XNgAfX^6#3e>YCZQuFC8HuI#wVv?q+lkZrlq82;-E#vVjv@A2o_>w<78r? zW~QTHWv5~z!{?x*z;o#uo;}#SX65^m1p(7RHW)GA(BGs@#)pXL-5~9$Npw<^)H<08sQ2O@- zQ8bk0F;o{ZG_^6ZH8xfxH&)^{*3&XGGcdC=v(S^bCML0Qbhp(IvC|W`bI`JLw6-@@ zcQKZA@yB-67kAZ{bM$(msL!9QCz4;Tv$+im|c8?Z$eCTQchNKa(r@X zMsj9CYEob-Fh4b~B5fcxBR4BMJvBEiBsV8Fw>c*-CoV4+nAdKQpXileSXNL{URY9H zSejW}Qdv@3RZ?D4R$X6S(^6rmQ&HbhnUY*x-B8`sSySIyTi00I+E?G+-^eE0*g4eH z*woZ9(A1gN($v=0*4oxR(%v=D-80bLKR!4#IXX5oGqbp$Z?&+RxIX{yPTxN{={mbv zzPY)7|DE#n{pa_8c3}Uf3l;?C^#7RFMNF!&NW`37b{NCq@G#thTdJvL(YSc(0klu% z6G=owZcuV9WfUpsYCyy3mh##7c-($Rx>d_kX#}x}bU>@kVm5;twqSKC*>Y)0sy?FM za>;5UdWgKyRTKG$ngkb8xh)q%MWbn^a{wH$RwK#ECU&1c<7~UcN#wf^ud_kAMLgkR zT`tppDhD%(IDm80S$^ne%rg^W#`*3<8e(m~Jf7x8-cK@fVk;~S>mrj$?l)YY`m^z5 z_1Xu2{%Mu@j)e9qg53PA~1L=>hQjb2eKhJTs;x_Li-pxpiKR6mk^IVAb-vsbAzM-x+B zXC;CPXp@HLOQ5t$6piip%_hC)_+EcW;uAfrgW)3J^p@t=6NtU;oHhUBz;{38GdmWC zJ8LEM0-ASOmfi0yM+x>sJIBV=NT=9z+HUhC`DNI57r-jEacoM;T}>S5-komd%_zN9 zD4u4?XBM|2w5FB1gax}E&*v0lVQVdqwUZ!GfoqxOG+|d}tlL7Bm#FyHmIMH%AEQ}d zUs7ph=^g}^rVR-XOC__&1%qGwr`^lcNaJr*e&MfiJ-SSV6Fd{ev;0b$=)@2Jx~CSs z)N0ifG~miTa~Wh?kO{BNwVnex;jL5TUH~|3$b+ah%pU^c(>s5$P2Ly;VpXF>Rm$(& zMBUF%;Aw9z$j@{TS?!i5=-L@zQPrnL*yos{ciR=mzWH5x20r6er480s?YGRX$P!eP zhWa>n4=l@&#y0`8Y^`8U;hTJaa5Gk$ZFCcq28?{`+}AAc(78Buki|7dezruP7tV#o zZjPXm=RL?4OMf($yf8;RByuDfwu~_y<~ro+3~Zk^U`FjRXO!Gem$keu(BIEQLLDNL9;+Q2!qEU5?vgR3%C6?x2!Ob^iMnu1*=?NyNU))x3_xB1+k6kDSgr9$p^`46=T4_^fT+RV|cx638^6t9P(bf-R@h1oI+uBDoD7(>J7Gd#`_=<&R+9d>}w^yG? z*`Ls_V)~O{dE4*DFjs_YD88l6(W^E~1KU!F&{cX(;KMKb|Yj9OM=6()QS=aY1YVT2*VHG43Ryp zhag<>ZEQ%~fnu`;wMKzMTz`t*XFaw^F~d`$;jK#Uo<&c%7Sl`O4DlSQns@_*ee|ym zLGZ+wAPXqeA6QX&Pl0No>f)rwj5NaAL`z}UY3PV7>9MlxbJ0L|OYagNLa>7AbW#Kg z8WB9f!KDUnidTz4#<8m7epboJ7m^KAJz*~~7MJ+ZqPPyqiZ!x%CvH#bqG-BFy-+nE zCq`~Gx$QjadUM!*d4Kx(65Ds5X&-CE!rKyRF}`kb2WxdpIW#LN zB>W{Jqy^i*Y6sJ(aBPxXt6D2(rhG45CE@VwsYzsZVGmm4?UIO&xrmnmsPfB%D-r&X zWx2T59rbu_Kjdq|bDQ0v_;2=6V#3JN1#s-wn*tqkrrnIEL zE2`5aslm-YL~z8l%mnf640K}n>fT>RGOLd4Fl`qOVhlLBP(kwk@+1#JU=+^E2$>^#; z$w{W|tvM@wsAfM48}aP_)D_5~ZKXnH8@i}B1S*(rbZI;facjLhrl?4}l@ak`hSm*S z6YxVtVk=_kmd)!l@op+IrwL%%M`)35+kH0o+%0LAH^fg%pr(w)) zmuXhL6XZ+J@ew9k|E8Lb74e28@UZiulj}VjK0tKR{c~}8 zd`~Us7r+|X`teV#9K|<>P;y7(Qd8BY4^{TW&&V}vU73U9*p?cz@wZy1`7>X%jzYAV z6ZCx<1tAFT2w_ai0Fzo9Qw`momxS|FG@>Dz)BBx{iIp@C*tHyTzpdZ1_Kgup1}X*H z3GH|Gw^;n3ukHVc>r2o;*2ldWpUTm~mjk(OU?Uom4n7i#}TZ{e_@K+pTGs>=S z)6IBmzXx~%p4Zu%pS?MB>O9t?FO97_(T-CR61t`{9@j$7hulHLpLe?c*O}{8hb-Ro z8ZUF5DM^0{GaL_WPHnP&yvEJw(n5N1C4pleh28pB!pi7^Q zjFfikx?^%S#JF48I&A^>S6x}-{(}7H4dOg=<@wtD6KT#LFDJg|lk2#%Hy8a+8= z1R9Nocm5J?@1o!2JFFLG8J-}Tyn^_Be*CAY)g|q8xN{y9L6+_OfPP<<&f?xks`4m6 z2g>kI6390TXmPR;IMnnfe3x-LEy3Kbbj>!JzA!M7=fh9OR~_EQ4XoYK`J7AWg}cYnQC(JJ z2Er)+%}&NWUP4**J;+WP-ljk^Qc`sG_|pQuPc=u_(YSm0H07jnazm?E$TP6_|-s4|j70SvL znmbLoT1_fwN+tVvGJ}<@I(XCi!68 z0di|x-7)ox>i`A9YVgwdxp_m}hjf{uQK|k{`UF~$hwUCLU0EsFzAQ7w3^(+For$Ls zTp^QT%^z_ln4uCeR`D_=y&AdkO-xwy1!DGPqBl7%XqBFRnDqd3H2H%27|L+!R73r! zHcd*=n4o4{`&Y{BMZ9cg5S;K5j@L2(NH1^0Txsrm!QW0EYE$g;c$p4dOBePo0N5AH z(ib~_mqsq3)pytQU1MHi^4wnM1dfLnlzHD~rY1uAA@l^o$COaj_-A}(q;!OGL`FiL z#7)`Tv!9aAca-X*7ccr{9`hB1WoL%q)t2^DHuhjFeWxB#rOkd6aPmg0e5QbOE9ypp zOc4o*R|y7?{5dzi$GrKQ|H5j~|F+i>Md@+>LpFfJf-#_N_mlA-7PE^t9SEtx(eO8+8>qMehrG;llRz+qE&ZO>7HVS+I zh|L9dzQeMXYPdlHHG*hxnDY9l28CbngeyQ-*$bb1{-R2mI(nU!H2Sy|+-jjOpS7qw zfOmBaeEglPO9M@bA8opwRUNNDtAIgk8y}9@u5b`;#N8$**>|u9Y=lXNsLLfQazxx| zm5st%L_tinSxmB3Wt?VI$UA3+9baj~i%0aNeBfD*Pi%c1JqAY{?rF7Mk-YMtSJrt> z;OvcoSY>DMZ1bjGT0yS)5*&}wm7U^lH=AGk+gAQhg9!Jk!hz5vM=J8k&D{N8?dA&g zPWJVl^iBBic}uWLR@J^Ru!1X)0QPhHv|WI#UbUVb+)`YRy>E$vfePbqmpANW(0Y%K zPAAb$_9zI>XMRct-^ObF25*PIh9IZXaJbm2OjjbT?~f1F%~jRRRUB4zsw!m9&TKTH zf7)LM9q<~_V{5`Nhk%mVK|KM(*wxA^Zsmu|(8ANO%i2mYdssQ}4q^Vxzdf9|zz&z$ z4*X5FKknsOI6eOf^zZDt7cumTQ>*V)CNNR>(bWvjRyvd2IYfN8oo~`~ITXY))Iyq7 zc3sEndHjywn5~lRn&^)6*8a z27N$4IyeZOIrm)fucD(nqtt0w+Js z1VNnF4;cSjs{C!uw!`0yfc6gF&|zR-ta9_L>Tx5`vCW{e{K(faJ8srdn2YLVqfS(jq?! za>PGu>gleJR(}!_eqnno&z)^ZyCQ=}zf&GC_L<#$mg}G3sn=nU^4^thmpZ2G7ye^2 zCT7gfRFMy%uL`~{(gk1`$xzgk>&dK7XtNXj(YdrNVOcj9`aL;1Ezk&%)NA&vbp(|c z6(FRB3OIoorm2f(ll?PrIC?KIbe{fc)~K!}VJg435uA?5Z;T7>CM&;%x3Tx1^sXCG zovV7!Tiaq-H;D5|bffzcRdK9D~hxF zWPbj(vop!wi&$tg*OsA><|jbGo8fJ)AjWZRzBYb+Z%JvvuH*2qbGs!Yo%*#b8P1ow z&gaxgN3)`Z@ir{c)iv0Lt^=dv=#aK9H|dl<)-h( zx7G`Ab-U$(2g?fiPF7<>RRQ6Z8x{lT6C8;>S+I42TJTt zpGiGLca_=2&GrEn3C`4M+$#{ojjgxu_X~^iBbcLiQ)e108O-|2SY$z3o4kQy0va1n zAK9dD7oC&IqC6YW^OJ(}s$qt^IQ5-#K8==uGXuLJ6t6{l>C)o8;z(tmOs9yQyUnS& zB20v;*87gof#!hAGozXx{o&$ww3RE_mTEIlDQ2snvHZ3wP`4feOX8OWO9m zL$x{+x5bRrN?|>~5K9&^z^xZ?%re2bC`Fv>YvFA5ao)`?$UkQuVO|%YVhwW@!?W!6 zu=O=IjU}W_hdk1P6otXiE*TiZ=tvWg=d&(nrSoF$cj0pWN4w4U!l}1I;ZMBhe^;=U zDUfYT5U`;LZ}-cT2LsNdNzaAm_EQ4=x3K#=rj_yQR!_ea7r#I;hcraDleCSZ|3!ZV z-X`k}3TAu4Hm<*%@A{m3pCZd7zTHdp^4b|I)?F6$OP?v3oG2dDx+`g%8q8MIUriDn zhZ64*h>XMT@fgBAMqX`~RtK=5FxDyN2%pP9J9je=Ofm0yJEsS_)EjcwU*0k~n6h|f zv#wk$lz4@?lOvoO?RD?%C#|;c-ncdIil)i^@zj)$+{$NfX4B#&C!e|9U4!V;A!brR2Jew3h_)kO(h!-%an)+Xt|h(WTu;O#Iqw; zj7$iJppwV5QY#}4+ZhSJz7SVZ6ti!^Y$w&K&`MJ$;-YuZX;M$aMiSt@kjodD&)L^o zzR>?SC{GmP-8?f&@=Aa>>1wgqOZRKt(aP1Nnk<0T!oM4>a+NKHlMr|0+h#SK%g!9w z|H7u$X^@t(pwz-&(`hv4O6%y+WvGHE z%iz#v>?1R}j6J<@o(s6L-nNyK@7xb`G-%e<`l(%&&T8Fly56{{h~}X2d9dCg#Q(yj z+F4hB(r^ginvO7}6%&PsgD9aTgde+#gYuDuk0xHhRVFXZx&j|*&*O-LYYRR_WdX96 zE}$lN5x~Z$|44Hgubg>7tf?}dwUl1cUsbN1Q@p*A-n9QsKS?lb;nt98UF$*}FYanK zj{8IWs7$g%k{%9~RJ1`-`XSm3oSEs#6h;UU?Ind#erRYGI-N2cHLU7Ros@cFZY7H2 zpH2fQQ?|`Yj>Zi(O({h6C>RoNfdPC$hFk(fxzx-WjE=_Zipwt0WjMDm(aNZmqWCFUfi_c2 zS`>cQBgJHXS~X-^M_p_k)S&1S$yd`OwrMAS!22RtPB@ zJpDV2@E$7%rEK7lH*{8)VO26K^&2uLITsgwJFZTDEMxA-$}(Mu)_+MFy3+{k9rgNs zEENVAM`p2Uvz#el z-K6Pk;^yH{{5aSihHmS7n<)sDr3mm03X!`E?97+IZDy(6+2 z2g4<9Bf?xqO+e$5LK&@|AH0M0zxR2DOgz24SZ9FQp4H~-Z3Q!8X~qINzzfO=r+^W3 zi#}B~nAP5!g;#Qqq3dB-O59SQ25Y`xZ|*A+?3O0>o$WiX&)T`+9I01bnrr zA_3IIrf_i#*bQ;*5dwQA6n9-CP+Md+{yU2trKAev?8R8}-KFV2uloq>2%PdOEg*j< z1uAz+fJHf8rtJ$E#sgLu^R>zLIcyq%xoCvzLCJ(w4WjSN1{^%#8b$^c?{Y#Mj6zr} z`LgG9Dm|G?tb)}jTF`ufQ--sZv^WBdBkLD7?|4kvM68R!GB(3!CpNKNC=up4wGJ;w zPWBU&%SiSDBhP?bs3h2zKLx?yd3RaXkh?T3#M;RwXO$gTDgf7j0O=oF{nH;^SmR81ag`&=7+G($H2#eM~r3<3E| zuDGDtk)WoG55G#1HJ;I&Kt@S_A_;Mht^RBS1l*?euy%G&o|`L@44y1gMb6}iAnK%l z(uj+6jb!jFZRrB05LruR3$0f=-EGU+$s?9$&Rl4tYR|K)qnKM7rZ{_I;5Ks0)LC$$ zd8x0hXDgdRFd8X=Khm&fqf1rR?a?%eU#=!DXZY{0M3Zd1>ab3MBhK|$FdaWr_DR<{ zEfH!ZijQt79^He&2466B&QDQ?Sz%gp&mC>p1hSj>q3Uv(l(fTo z4f|nV{c$C2zuIi;c@04sdMj~bIuf%ISR3(f=tDsj^*5u|L~H5jZIZG#UFbpGMW!3< z9X$)O4%a#kf++*XMw3~0HRXcMbT#W5Evo^GBz8qa)Jkq#w$BlQ7&a}EB_lkJjtxc? z{6xU0a21!jJH{H%90D@MCjb>z+RB}}boJSc5KpzBF0}Y^#jq}1 zi$cS*s+P{$;^^u{*FG;-5Wg1XX#*k2P%W|L{)Uo7219!?d)VfL$yME4Lf+`CEcEF7!rryTnsJti{j8zr7dl1Pr_esbEjzua?)cNVS ziS+1cZ&=yrAohp2#?+vjFvnuxgDVpT{Rlb#Vh&r1(UdH?wQv_Wjjx}nEK5~ciajet zsfsNs3(xSOW{D2^oDC+jE?vMGG^)@>a8*tgK}^Z&80rwkUo8270@W9FSw&q9=Y$v4 z!lbkL{?7;l$vGsB8Y|nP@?S$`8!(B?_J|J(%JLTV34Hy(HL=t*u0hyIPoPh823sE6v?QX_>wFL826%2`dg`Y$RZ?9FD5Sz z5QY>H|5;KD|5ldgzsbyaerfvS(R_`*9{W#`aNxT1tSIQeY*5541w1V6`YhS`?{cx+ zbd%lS2ZAPec@EGB+A$hhOU+RDXEJ|C~&*mXcL$D4M>G zMND?M;<=M1POOnF#I?5)J}fO#Vze`-Hr;{=9t>W%xhr3Rw!B#4r~0tpaadX?I1&c8 zj9|5Tb?2eph#~MVu%C*|Nn6+YE3Y13=T49!+!a8k$CF%jBn zDL27l&gQT(jL18|tWZLtJq(;F-iX>^X}k8A*I;nAey&uJ?^f8sXNIO6)T_@>>?ZK$ zI&eUlOm}J@N;l;23S^tDs3>7Ih#qgEx!Ln(Y`tij{#sgwTs&Z{6GuH8M?7zkAJRv% zFV!rBT6GphlPi3uI!|3*D12%^j6rQpB-w%DxMRm)(mcm?u|xqEG`l6)s+!J{?vx*GqufMyxLw6p8_2)E$U(VAzpJ1|iI! zoOL@3)LrzIBOeu#g~yDiv){?bAfVNaOCnZa&XZVzwSQyJAYdZkHMe^DN_k&ypDG* zIqvP|2ISMdqupa6d$(f4cA+eyQZ0-M|Ct3hM?+Avs_=cLq5h&4PVbh##hhzeL?lc% zkeg79r@|Gg!F;Ynw3HywY-OIx@oWYb3(nEeLh-^cI8nrMHc<(w&XUc9l6i#D4^bpx z@W471pZL$jQ*t8g_YyB*;L&nLq=!m;LcoF5`#`}-gz?olp3>K+TPNXpE77%PbEAoK zJc!N18dZg=f5&sC-fECY$w)}`NqhB)`wFHSDr$Rt(w~~sa+-`tz z)E%C*_QWpGiLQS#hG1}oYwSXDa7i=?EGL60=v#(xtxM`_)r#9mJksU8)FI>1!R?O4 zBNCv7YNgh^3L*t88uYbM(yPYvPEA@W>!elkC_;eH-`a8e#Ju>$N^X(&+-Ha^mH%!l zu%q$epmy;{3i(n-52>#L>c@{ll?`7C49A(X8Hl^dI4IU;e|m1MgmDvT%_zm?9RI7B2PH`09TdXqiokiSvw&zQv9E?lEF1I}Fd z34YbT1bgabD#J{LxPhwykSpQpp-Cw?(N=<>@H*W#Xg!?4;ro8u=Z!|c z)80p0swh_HZ>$Cqr>!U_ZP43clvK~v*kJN&Vnr=clA`=`xXMq;Jr_K@*7=asWk}Xv zVMJ4#v#xo(LW&PYocc_Y0($!yj#<5iCU4U`IjPHqBf}91dSXm?rGdIsO0t-~dZI+! z{qu`&dQeBNdMH|8_*w?q0(@S7L!Os6~ z_}RtB`C!rn(_1PP<5NS}Y$)%*WKX8FOrnEjq#}+CoCMMstc052w<@!+eRb#6qW$G8 zstX$h^0MpGpLSM;%rn@g$wvYwZ+4d@mh$`G)m zY>u;9miP=mo;}hiiEwh~bCV3+RVCU& zbs2I0(Gajulz-^E@PVSOnfg3a)_hF3>b~+HR=U$A%CvWi-x4w0nwscJU%x0S`D=>C z?Q=@UpIdFd;P`q7?0#hv1shi?I2>@c89&}@2b|ya+M;LH_pa`5m<=E=B^Yz8 zFdqKmi}<@oBX}%8+LPD(g}WMbHyC!%pYsrpZDkR0<~4laE{^IMXkO^x@Dfoom3o6X z2%krklqpC|317mcN-h8)Fr?Um8O?v-ZT8(k*7dpX8c1U@(S>mvnYFV!!QK ze5u6d-n9n=p{V25AT}&1n!(=BR<|yQv^7&B>8!xeC=$ z=optIif2Vm`E&gT7lsHm;3jYWX_xv@ndfPia9-VblGW zGb6rTGf*=N^peQvkYw+WX^WG2uuHkaUf7rwsm8Ei#-(C5#rY-|LN(zV7ECE&V*AV?0&7yNpxBz=t#_Hblr*5h{@w)da=~zheUuDrbBKX(gI1OSSIdV0n>6-o7fuVocZ|iy71ANwDqQB~Q%88O9p2B>-E`OYXgohky8HzM_ zk;UX7_E_)JmB5lKH}0+J81fgir0=b56+QeaN*ObVQoOzK$8gMrBEbm+UITW=oTf*k z*@azf^tR>nOGn6#nX+dB-OQ>tqqV~ zO$mh#>Az1i`!`2vCHwVM%Q#o2O2ur+9-`^$qP;#yj0q)%=LHG=Py+Z0TU~MmFk2iD zhjW*jn?)O|-i28BC1Qafpb4rR%zQl?g9h0fHNiDXt|ldEp$mNEIARPnhu`Vyh}(G! z*QIL!?GlwdssQz%`}B=8F-KR9=Y7wtU9AfW=b5Mrr*Y^ep!vhg_v79$GH1x6^6y)b z^$;}*MMrz2&>cKh(W=PTr!Y9go0L6XHcX(j;r23yvN~ZDCL%0f)2@6w*9L(~yxbdD zM3s=28pICxWD0{86h)d6yZ5N9u`e2xxJJfbRI@Fk8%)|FwM`tER?~ZlB0#ZhQZd3CmNptMBzS@tNt_3c zDn;I&C|PEGD&M%&_GVuW>T3%wMdX>cMlLg6%GT`~4-UpG%vh2JN_nF)71*L*4%MK- zdlsg`cUCPL2Jr-!4%2G(m=ergn$xIzl$L zjkD};N5>T6yN2yednniOOrH_RjQ0%j`$xA{|G4)4Z%3V(?3^5mxrk~Ls>Mmj0E!%ry~#7X0KOBac8vE3(p#sNUV7B zfaVHnJ7?j*UYa{tG0`D1Ado^zZ1Bivt%WOL^|U{Y|&M; zreKIseOKjj7`}kwkjgJ`WaP5+&E-08^cE>Q_AIeRymK1b<%|h_Z5sCROBZheecK~$ zAt^E%*Rj$4T}@uhU&W5l#96Cyj70*k$BvW%_DY4o&75(hS??tK%`;jomgl87O@&jF zLXHKpZLRN?HrR?Fns7Q`1F+@Bu2>cXNv9`N=DSEJjrMwKbUvvyS zPouIssY3(nZbi!8&!^#zt1^31<5pDurZcJQXgtf+Vd8gWX8~Ok8BpTxa&zR^PEcI_ zaCTIDCni357ua&i&xQxzI72N!)`%1}#D;)#Tywfvxq@bpMSt)4G4&SiL3bp?kjHex zt2E|Fz9<+j7$lU%Q8JlmZA8bvbXyfog)NV9AQXtHk+2bSu|i$Ks+N^{MITHL7${ zcksyf5Rw%35vVC?VN{aD$ZWRt>(@Vu?ZOg}iLfC_Z8daFeUT8#@xX`os}t8tV-F#+ zv!0qIp{Zh$nTG+qV{(ncvgw+Z;&7Bgg*0`XX67{?w+Mc({7? zXv!Yd=#^(FdEJ5^tkNNI_C=-cWr}l-!{KtAVl-r+jO|QDdjYsDL~UDo(fPZxP>h3R zFr#+rCQbbfru)lOdCSX+#GXdlci3trDMtQbiCCXhm?Cg>bTOozh(@AxIaDNKbj_w% z&>cLSnyeWa2mTh3yaF9GEI6`b1x<2leC{%*rL>WNk_fl6x%P09%c5UrIv7u+D+2xc z4UCiu@>4-62bEBxuBOWKEWLO_4%UC@+4bJ4u{}=ymmrhc?@#jXliBtaPD#YVu`UH!Z58RrDgv zf0psSUhP1)-7mC^A(27Gx792eIpYn@u0dd~WZ-WYSFI}Y9R>y6F7)D=ic zri!BKv$HY;5omDw2rc()uajeD`YnPL0A$aPl_{DgQa^^CXDLJ4Y$866nQ+pV@e_#K zF24^u*{_wk1ZWhjdvSqyakMrL5Y^Wpj$1GBPIr!)hH$|Cpz3^UQ-rrVu76;M)#&UzQ?_2u%PNDbo@ z#H7@FxCY^^EJgnN50z}$a^#JSTPOMM2KmQ=i$RvEnmKPpgQ|_Zzqj5rM>olDxhn{b z;Fp^F2i9-?Sh_nB-2K>HULNbwbm0&61CCOcPChKi+xY1p82t|bT|lD0<)=@*@L;RD z4_|769`r6msdc!SeMMW1B|)0-L&9;f?m_=C<8a{CG&5Q}e-gvZhgiIcRzs>#havVgfL0ZO>TRF2DaGbt(EI71uVowyz94j{$HA=1@vY8H+#CZwnh_viLlD6s z6~P1gAm<^+5$qh~1VIp}pWld+m=*s)nVpXiPMr>j1PCD+7(AdAuwS0M+Cex0tfiFw zX;NgR(}Vfcbip7Ro&*}C3L6&37XXejg-{$-gb}n)z74<%bl?|~+KQQ#2WVl4yiqXS z6p(E}3HV)BFdzqPNDx+`^YnoO-k}537Lkcp8XyW5*@f->T4kN#VrZPmokA#z;wVBH zDVAay{uLWu76zfzEA8R5We68mA?7_EBOz25_>P@effG8K*N_cDEuuz2Py>oo<@q7} z0b&6zMhpOp4BmzQE?(u1zv>R8mFM!8lB=P0-E5Z zqAC(f;`I>h+}A-=LN@Z8u!R4J7xKpjB1_&BV<1k5*^p3H$y^uq;DpT4%#9sd$UqL3 zSqQ}+1Fi_s6_^u{ffGCFptG8sok5G6;T4D{R1rgdvpD{eWT$h-ucb+2*B{gm5a`WCmvqGUnlR*-uJZe7dK^DVP{W zQM#!U=ZMaq@t!4-C3KACX_mq_b|-3zC2GFN{fQ?RWtc$80c=hLmvtCz5>$G=X9UM%Q!#&=|g;oUjMH7|mMBsc9KP9aUC9-k6&A1BA1GlQ8M14;Ml6Iz zD94SQk}~UbvT2iyht%}z<@oBpJZU8SEj0saOTEMLX42-pZd(oCaufv50k#EWX-Fu?V4xC?5#;xrg~zh z2&u%P<0nq7f%fW}DpkHN+2l+swVrKjDy`aX>^C}{kNWGm*6f^aZLvOWk|}HzRhgjC z)86{0+0NQOt*zk3EviZ=)DGI3Hf@iRAydJto$l?Oj^yFC#dX?Kf?BS=UarS>Y{!Bl zQ1$;Q!Va$JTFS#R>(|amxt(sZ@@kIys_IVex|!y?%4x+ogu4&921kI_}LrXlaIJvL37Cu45X4Cc7ckfc9;_;E(WjFX{TOvkFjG zxh|THZ-jp8Cni+Wml6zJyinY7j~1bZakB52oUt~W|>(>Rgx66;%lD%0}C8EDL$@tF_#FFtIq=Oo_>N5r*Q8Aam>Cj67&D9 z4co5-C+yuum*s{e-O?_co-f5x*S#k20avcFHr2=F?foj*jWRB-!EW$U4P5+Bx*k|v zFtIo;769)a5%+B1wXjz@XrAtHxprk7Gw{g4Y?@XuXMW^4t}o?2Fn|JWvK|;?Mal=8 z>$(yt94D4mb|L~t@zc)n)&3RwYNFw4Wc)&`a$)i!bMB7fEslzDbU-op9+s!va4FA= z8T&;V^I6;CZ_pN1{*o~~rD-4|Z`E$)Cs~;!Yq9T9@zhbT5a-$_q|^OA-Bl(HD2gxG zgm2;c=MrZ!)`npcHSMVqFTK9Ych;ImYHZZntuwc25>L|4YVjX~=74^20W<%dlo8sy zSa3XL2RIv=s*bbfzAqyGa6Yqf8s{w~YofCrG2@0~CwZ*y!SdgQ>M{4RD*NpzR}O>` z+Hw`Nt%?*DE{;1&* zFaa0u<_fEVnKf4Kuje-LMux3jSMexiwJmFEQirkpvhfAGG5BIOzTE$aDf@HBfpuap z9Y{8_P&@PtvvXh%an3d`^s;aEiZ$XEF=b_Q;XM^@^Q*eD^-1S;Ju?_ne`i8Bu4i8M zG#hu%KJO6Eb-!kh5-4zf+-MH9{M56(92o<8{0eGd3f(Vi&I+^QqJxv<7!K%L23~J9i@^ zHG`vfcw2AoCDyrN@^R-{9jCM?DYt*8@Vap_J1X~UL!ESO5zxAFWQxM!C%E+e&|f!qyy@n&ilc5ktcHg}&L#qv_|usZ)Yl6rMnOBRT8cqv1# zy>9GtJMlp0D=&j@g;6oz`<`PkYInD;j)E_y|8Hps>))28_$UvXxq zc7lq82d_3_&$%g}Gf-NOPaC!V@we54_I~ z?XHJ$p;x-j%Dal|`Nk`(g^uXndMzNdJaUz&KF)4l6KF#K#wJPG45yi1tVKe>|9H?nKDniK!%xmzuE+8Uxy*gi|MKI5Ks4?U=> zw%f+;eDgVx>#!|2{z<=fM_YPdXe6>yxoK>Ef^NhH`4}^s>G^ z>gR4f|GGvme!C0%oTjhKt8IwqxWTu2lreT~&oSR;w=AP;_y?=IPdiA5yR!H7)MoxC zTe@A$?vPNwu4qft?6`GFT8HL0h40EgaYoVnm4(DOQx&si7r^ zqa1RwXwg#0g&!j-{FG5-M~@p5qQqE`BFvaDF@iMda3o2cJ9+9%D3GTrp+kwLf;hD2 zPNNl3C3X4~YROZmPDP#RbYRPsQW;9k=o0^-*HB%pmh>4CsK$*rFOF236=+ALEIF!V zSvDq0l^)?2n-(q7qE+gw&%C3W3z5i6AJtD&IoZk(zY+_4lGHHi zOj5Z|dx~;3059y$%N5!BOF`6}#EGviM>%cNRU^#JGt7e3@~`WPozhR#)Lc`-oyQC+LlQ49Q1wo~ClQ$`)N3Xj#7qGa_=U^RJB*Gy`gQ7>4h4bWI+ zm0A})JgKD4U)v;FW!XE~Jox`8p|CV_vEV}O?MM86>~y(@%Y)9x?7HhQ&vOOkQ>LxT zboaTtdOZ)(I4}DbIRd+7(Aj{mYS+Yp56<+_CsP#bE;_GWxKn>oCQMmj1tk{B7**wu zuaiGyuHhCdZkbQucncU`rizl3L}`1y_FFl9&epk5vHRI%tC@B4PJ{7%`B-+}%{S4c zWtDK_xrml*8QR9=6f{oUI%!G*cYeH!4M5*KS`2pPh7gX~&cDflJ!DSvF(ho$|=J{4H$Hu^sg) z;U_1Mb1BspcgbN#ul@gT6U_zdagGNIz3tJX8l0=ZQ&oBV0rd^nzU8{t&f&CAToLm& zp{JQs?k+9g)&>uUn_t+aHgaCnsm!i860hyqNN*GKlk28;yUjH4K)A7v%FxHA#qEx9 zk>XtjZKAU?y)SDf3y{^6mpmK!Y*v5r+-neo7X;EKZlm#E3qQ0v@}%%KH0lfmR~AE< zeXmyGGZuqnw!XC?>~}Xao6~f2w53U`Nzjv;#d60m*W|BPHD^$d! zh@+@6=O?FolLNE%w$hj?jIJ}B%{ZvUt+i)y^O@CLaMm!|EKG$HJ6`ejcSV;a>Q*JA z2^#%ZJtI;mK~MjT4PZ*QKpjG=WS&A^_QWQ>KZWpW%JEzL=0`?_B~fc$!=Ufp$Fy-h zuznkYWg!PR%i#r1Y;tMjE-}_RL%uPEaS2(<(8n(thVow>MA|6XNIx)T2AaO2Pr^1> zO|BggVke^_32hlm60Ry_3=t1IvFOXOZXwl>t#6a;8v}5n9)Dr>BO;L25$LCk|VpM`;%>cvkU|wmBO0zy~av zPBd?8bQS-u&{#}ns>qEARaYR(COChjJ){@TAsU&^sC;|6Zl5h>CedOUP!)iyz1ru9D ziyy_-8m_w?Nr2wG-2%;dp8!VEQE;T_7=;KmWPU7sr~NAtI|@!hHjXr=kS%9x)y%oZ zuCcjIpB=M_M{N4;KgUVlD<39L^PH+>ku7RBvq;tE{?vw@l`CAy6}(unrl?;VEk6V6 zKyuQxUzHSVQpQV1;5k!%j5A8)q*Yla0dj??Dq&xX8BKp4(zI8zs!P?UK)d`GWGUn7 zq5l7AJ<&05uBIbYCaEh|(fakZF;(16?}$nB7VN^0<&=9nXf4sUlD&cyWK(;VPN~9A-QGIRmn`O`MvD_y+Uv#;Gy6|=9a@%aw1y1ZCc)HT;uF!7fHw8vDz_l$Gnujc5N?9d+vLVWa z6$@u1XRmz*3T;ZK%2em>skGV6nT%GZftF;SH*e7|6vw6o2+vh0MY<#{qa*1bE zQ%?$SOKxq(QjKSC_nP4^$GERCy7l~lv`P!*9?UB(Fp0yPX~q8ZsN1&I6M>}~#KDU% z+oh|#Hj>iTd~avZXP#;;qLj=Y-TRsG^Yy2#ysAK7ynYoeL6hiKgG(2YyWP!Ln{unS z2Hs=jmHV=qYj4;+Gn1fgJb5GfxnVty>l7z%!oA!O!DO4@>M* z_7S*@MN(an-KP72j_O7JwV0vvEpg=?+9LgV&++}}ypkQ;TE**9dEda-H{G)m&!O9W z{E2`703rDV1qT3}04x9i007_t4gmlN{{T4&97wPrr%ebA9#qJ%p+kfD7N!!IY9hpe z6)iHF%_1~d5~tPpEEmh0!lR0 zP@^?R@?46Mpi!neeM*%IHK)j`SeY(b)bk;%uV4{2Yu1r$R;wZ{s_hDKYtOYim1^C% zFe=QZHw)?A8x^fhj5Y)B9Za}tT&EyM0e-sDX;H>P5uY8&nC9fSNdd16dO33E&qCc= zjX4&y*R2^VN`#8iab44zF|%x~cQfJJnJ>!DJN4IY+`i{#?adkJ;=izyVjBAKg&L|PA$?O3 zSs+#aCHdh|Na^R_eGg(e=$Ph+i@|oSuZT|JbUfgqjqi1ur@(C8Wp+%CUT58{Q zswPQqf)<>1%7R*Cpy53^t8RVXh!daf;e;J&WG;#%thMUeAFn0)Dydj+=`?I(#sX%R zkc}z0t4tRX>0o*)9y?#S>L%vxp4L*vVPEWmY3{@Hw)NAiur@p%w<~pEpT_XjOKWM9 zLHKXCaZ2c_nB*$jFuDbom!QR~MyXi3xv?x5YkZ9h^M3RaODvDUo|Y-dl%6+q#-8@9 z?R26}d7Q)No(Ac9jn-_gtdAYl5}7A+sWyjBJU!>y7!r2NMo)?~fO5 zyyv|2y?VQo3VrWxvK#E}<&j4CyT!sMFPXJ`bN)AQ-!8g*$+aJEtJm8)-}Lz8zslm! zvEK`?n!#eaDTFZI$#!a;B93A3wmQ>%+yglPUWs_@gPP2=N3fDv2xtj}(}kD?yG!ZF zEcyyukcP88XIU^}6bfL3K={B%DK1JE)1aRiIG}yGP;-;pAecB9!5Z4je`#_`?4(zv z3|@?X*2_@`|ADBU)nKh^3v-xm-1Ii&(XD>&0u-a%r@z_x4t-F<+VyORy|e+VG|!V^ zpmYZNv$kKgyLbG*flC`u8v;3q3Mt$t*eO+iwbmLp}4r5d1(%Q zIJ8&%;Ah4=HK~0REKmOg)+4!m?1=_U9}G3wJ{Nt>SajTy&Jx(jLMq~CjWb)O@@C02 zVTyiTTFoo_1j{xZtx-SHBj9d@Nv7q-as|w!C{>0_p|yoZGE(2fuJuO|va(zPL4}J{ znGoB2aFdc6Sc)_vCj=@51K`wO7?VW707eoqa!Z&oGjzZr1}IwJnb>goPDtdctP)GK6iiCH_Qq zo1lKwiQkFg3X{pxh^3UNHmW04*fYpIZjq3tJX^02iI#)%@0CPtsynxuG}X1PdCUI1&UQDHpI1jXC$ko^4O$*|>dBW*NOh6rnO-e*N;%?;k*ma@!Z@qWlJ*j#_Os@L+_Qn~~caHW%sc=V2JH3sQXpDrQH=)VU?lj4neGy`D z+2^<4@=$Ov%awA^iq{)47oaU1jbQ&uF8h@-bMFP~Io;*74d6o)T=ZK{a+wBhD1H(W~i3E4S5OHI}X$qReLVx-zM{n1(RCPH6AO zB_=biz%G?3LUnx7hWhncU%hbtYPs6==`x6Ia}-s@IA+Wy(ZO3>Ux`EJ-7c;b|G;8P z@!R73*@|LdwLe;1mK{gkJY!gDOzc{c*=(vdj<|=vYS7)PHD}+5IiFB9jCLK&Ex5`U zyvyxxh=RIIJJjm?@2Q$SXz`RYv4J)c-OAZmbIZ2g)18{7nVZJt<(jXO zyUM5gSMCAcJC*PvvJI&@zATrm-xft;S%V4Vn;m;~qAIV9!;P)&rntSh|C6`m!2E7= zue;qd9yPuBb!V_`ZAp4|xy$@*sDdL;$OP_en=2kcU5&fCxK6Zo!_1v>FI+9ETyS%- zedXtBbl!U=qC+R?Q1UD`-|*hJE%9QZs~S1Y2mf`HVcT_Po+`P`TlgqV9d&@m*wu=Y zoz*ee@S2O8;rPzFb(Rh+}WLyKaFdb|KDsbZ36$JwY~;nTwzcG79;pjWi8{NlY? zidy`-1SF!8K0CQ!+rH3452(IRuU_&fne)o~x8dg<&qPzWi(1z;|EJIWUEq1$WiWP* zi0hSe)d!S!*;yvaZ>>+)M}~}53$X6}WnF4l{nZ^cW91isMMP1>wSIW_Z*&q-V)S9p zQeAH6TY}bVm}XA|bbGhR1uKMi7Q1R78k@sx>`ebae$NT66b# zSvOQ6H+UYCP2SgoYxR73wI?^Ib}RCF{%3E{raL64G;-HCNH}Urc4|`iLf?dj4p)W- zLtk76MO(IW*hGiuC5Db?RbE(hjYn+zvU{axKwQXBVG(h2|3PJKXL4^xc7;}X4uoS> zC|}73Bkm`Ofn`0GIDfSUg0r@Bp5t{q7)664JS~-3tRq9(CUpdsBVJZ@jI(%%RXcXY zVVNg_5N3;rc!m;Ki*blJLPUQ!f?eALHE-r#)%Jfgh+lHGXr=OuDim$)M|}d9Zr8Xg zkeD$GMR{PBYN!<=yx29F*huJ@j`Br`q4-nDsD;GniChST+oOiOR)j%@N9Z?XB?Qe4M;J2^;<@D|mk{KLUFni} zmzdGTcR96?95I$4!*4e!d^jc?b#+#n$&sN~9h3Hy5rGc_HBhh+1O!D;GZ74@Nl=P3 zn!!Lq8Mqf|aGH&<2(DR@+&6e6$y6E`H-0FPW)hfxH&&8`Q*f9^4RxHNV~G!^XVI8) zP&SO@sEI3?REL*^fs_`~GbyV%3Z{vgsfh~W|0$ju)18T8YvDcv! zVrGv4=}QS2L&_Nv2)S;ID2x}0F<3^6>L2#0{i?-K$ zx6^)InV23@cdQ3%V#14c;-BN#b9oq|JPAZ=T8ulWjWU`Fx5=SNN~aZy4=k~y5n`Hr zItS>1q2HMX7KniQ_oKO2WG*+9G8&0T|1>3XIfgB&dDS;fWNMvl8lBN4NmMw5k_jpb zS9%|Loy|v-bIP9SiKHlDr*p6xqdA^SS`mOMo_=~|qZ&%N$U54&Sm)t9(_^2gfv5Oz z5T(|J{28a22Zg;#obYvHHhHOBb*wzvsc_*hs^*JzB@$0+s)aC{vg)dS8lk3o5UuK} zA6gQo%B`!qq6vnKNi>k@cPK34XVaKx!{)1yIjpHfcVbC#&|065Se8{7c)H4r5_yI@ znsOESn=vGDF6U(uoz@b4f6ja2I|0!1RYK+`R zlV`+bgn38c*eo&^sV=EdO~{y+|I~=C1h7lEQ~SE65m|Ucb%BX!hsk9qU~sfx;1Nhm z5!{Lj9l!_UDz4gUo>~9~0=1+|D-c-=d7>(uC^(lUdW1Rphy&_|dhb?vX=yCRpfWTn2_B$pbfVOG4jYF;vi@ia>zqAX!zqV>Qe6Ne>w#B)?4!lDr{5=H`ZraW* zmviKYzKVou>w7=&yv3GudD9jeH@U@Sd_^qDFF_Y63X6qArG;Y5(5j0}Xp3+j76UF# z#me--B{R`8|4d^in1ZT|up9l2IW3q1T4@VPXe`X21WJpP_{_}$$++4;DBaLIO252n zl=Xv{#QLmK9KSqfmX&%_YRbcm?1M8j(AC^?SQ?0!8ik2?(m))v3_X$4_H;pQ%^bbJ zIyO$6nZ<2*(Ig6evUYt4^T>9mhxm7G%mZRSJT+RAHDeu}Ankf$3qabe%6HehRehg= z+_ssjwt`qwiA;WPNU$+k$hXS1xun(xtW-uFN^oU%UTv?yTZ+9H*nLf@4Sc!^CDNCz zOSd$cIR<*#7rrKUjLJ&67R_VU5ucRp(=B4!d)<%iVu~&NsNC3Ii|uZy_B}9axuDBM zLfkWO|B1)bJ9St%zlfT2=1j{eIYw;6RSuoa{k*d&+P2~Sy}&iPDIIw@b8hz7+9yZf z{nF8mEXMvl*|~Mtl*WymT9envz|&397F>zojDs+((u~}!gt*KhX?~uEOpD~%@8^L5 zx6UbKi<9Tx_DyvSKFjgdZmyHL1fF-wOFwNXmpnY+-R8n&oP#ZRmqi>^b_m`Z3Ea6w z#L|~HKwi`D9OJd!jM?SeQ$5W=DB7f`cQ!112uFY%?vx%lzJcw}%KeIt`b#z*wz#{` zJ^AEntK?g4Ty7cQzQ$^DA$sP$kCU8+#Al#LZMT>ykY4P2ceLCuZnCwd<2iGYuT92x z|Gg%{8KXg$+w%Rzl^TAi;?S&&)7Zw}XC#AI4v>lN*k|WGdVEgdkqJwG zw&bhV+_w|r)vcC19@&r+Rw11sQAv2Rb>v^$=kQnJLC(nn#@uQ#uOAK7Xs*0L?v)U= z<}4141Zsm;PS-&kut|kt<(-X~3y58gcL{yp2KKMNz0im5d14#Q9m!FqHc?39!=jB~ zR_WP?w{FUJXuLkzciH8+8|)|?(x~0-1kCRe9J%Ie!759-2S3mHY2>ng)jevJd)k43bdc?d6~PUEL(0a_4+Mzp%j= z>zfX8=>6-V;Zp0=)%gzBCrk?Ieag>u;Q5M`09V`PyOEztpTf;?;GVgJ`O}Igc7hoy zre|;}s#sws^67TSy`%8|Q{_;w&DPw$Zu`>jet(<&_w;zb>4lUZ(%@k(jnP(v#(nMB zXLH4j?vfq6Ih}I{Z%XlU=UJJ`v&T_FVI0eq5CiJ z`?Gvft$qj99IY@W0pm&!5u!J?ojdbgg!URpx(x|EmGF9}>48 z{zs+(h9S;n4o?sb{lEYHdFJ~`@cu#>{t5WY@^=*C9~JVy&FL?`Vh<3U1P&xvkP`-j z17j>qc#zm{Md$Op=74 zl$$714lpRQrq7uJgQC<>(5KLsC52K1)3m0*P%D+zf!YwKM58f}h7?%GtISbVITe*C z6{b$CXcfY8$<{4Kv1*|rT(gOQRY3MMPirYDak zjCu1#PPIRiZf4r`DpJ6k&+feIS*vK#b(I=EtdcEBsV>#R1!-mX_HL{i21a}}X|5;*znndyYo4Sw5 z0yzo_dIO~e1oEN{KKP)?6%>hJAQAoqQl%gm4!}W1gM>JN3le2~;<|!<_=Q9l2~uK+ zFmTXGlYzcbAp%>3ia-J-vLf*Y4_rvHh$1Zzqm3Vsyf8Mw04%PpkNTpJz!)CVt+?In z0xr1=b;^(^zWfpsIj$<4FrfvMtWGZzzTrin2!0r73n2*=|4}*@1r@@^A;=(T2qBAz z;7tv4Sd`E%&VVt?Fow{>LoOm(o#ac%O*zEkhMFLYYWZc3_QtK z1tBB_*wlD*U=LgP{0Eqm|#POAO%`t z2|F52frbo%8w^a7Qd)3VHxZoct>6Ar6E>3Nw20d^SVg zb=ZP}00zEwpdttg!;FY^x(MJusp^0}hk;?^18fc)QA=p+!Vi;wJlIU_d$cXEq zIRWBrwU=n2(RnA$9o^gAI7j%XUGOGW>Se+RJlcMdc!^1%Tc=_|0hzY0E}TsU zdhpiSK4J%nMPX@Ya{~SV*r<&#fglOM*d6Xb|FnettV|^B*v5@U%aK}2F$2umE zy=CuLii6pMbOk5xEoWvjgB}1g2fB>x%Qrb7fc+9>uo|&%AY7nB{&J8ygK4XDyeQhC zFsPvfM$isLXdo6vxV|o4&4UyKp$R5cHyS|jZfEO(v5sRxIQorP7>HrXW`?q1$&gOg zlN<>fR6S(jjE6?4Lffo(5>^MMja2wu5R!iKLo zfM6bwA|^jKJVmY1U{kQt;Yw)2vMfk&5eeJ~|1-TXu~3h8QWk7D)2q#FFHd2T8T!id zrMW~UZr;HHh>+vHDNHel`;mkyo&ke~|L}r}kwO70)$q+eebZ7DAcGI4sD>^Ss(vuC z+!3!y&P#!=0Z(gZLPA(hF0u}AIwa=gYV$D+Fg#)SEHW&hTF9ZZ9L)eEdZN>yMyZf_2~)u{RK^TM7akJ8P|vBztLJyO``lTV>U5{^BdRFS6IIUGhyB|g^9`I$lg>-?WO6VJguu$X}K7q^5i3* z84FVdYni|%7BY$jih~Thr>zQv{|ZzsfgTk(R#R?tq>*f7)Y`fq9f>FlSH&t>HM+yN zzVd`{%;{Wb$PgP+PpA%J7POdhSnzzMhmi3rT86?jF&IP;lS18E8&U>%Efl$>Mb&8w zLV}OFHFu7JuKOaJ(M$3vqcduX7LsbJ%VO4WQNi@c8Q zt#3C1iGrNs76vE**0Nb&@dEL7*k!2>bRei~!ixtAHm-4pr%ALRm?A=yp?C4a&)3#v zy{(PyY)$6Zjro-YBW8g{NPJ=xlX$3hm@Fp_Q4mMmf(`u@Kp3rMRt{}WyA;JN4Dygg z&VI*=Ar)g1#j4h(fz*9T|08mJG2_C#(lMb5U9Da5eMPq!39O*ALj^~8;t-oA1PIOG1p}0mI|QljSVNcHIrpiv($t7HRgG${ zsz4QB^%IY;G=eF7GtPx-C%%65F01@Xo&L4F(koCb>xkMeBM-=yE-Y@T zUE_hYIAUI~YH1zG=U^+5&%jm{Cc_Nsj3790x;DyP}taX>(2 zFGK*!X!nxoN~%~X|FsQ%T!Gv|+niWMe~Dy(1B3ymzbN0W*xAHUF4>~g`kL zpaOF`Afvm2K6t_d;4`udLLo#B?b8E2@PQ}cIt5g)d6Ox?s{k=H!HP?tdP=}U!2%ex zC-!SY|MnX&*dZ=2SwpoDrSRE5WICw)qoo1#!Nxd^XV8}n973%!j8J=k!V?6;;{+@$mMwHwhKji3Wfq`VplLGY@&=~}fQl0@?Byhy=9f(W6Ha6?u^JAI15 z(cr%qy1@@qwErua;3E)y>nqA&EXF#YrI;u}9L9q1gVq~}O!EXk7zktBlyMt6GL$KM zLII5^l@+ACc!H5=st8ZuC4OYqjV~rIPC(HcB5YS&VgjDlwxB z3%C%eTMP=xGFduE_nJXlY@9y=s69-( zLKb}EBlG-00-&(dL72RJps?W=(-Q;SK?^!Wq>fV}vop!%6Dv=&x*gccP?SvPQ`WIGvZOF|Pj&xy|m`nn|w8pJHb z<6O1U+ng!LyjA<49UHcoLeSKSH@U$=77PUh06YS)38v$3p1|5uBHuL8IA z5l{CNMJDSw;CaCws7}k7f>4M}+)H@L#lyv+P*OJ%z$M_p7rDM~@xR%F%B@Ka7Ooz`bf z))j;SF6hY#lNhJ@w#@-WxfsxHJtTfnL$vh14H$telDaS0NfR5%{{TG$jJ3pCxDoYu z5Y<{wEHfOCjgxbGE3lvb-e~kct9Rq30gNRA9L_*kBYc~hk0aW!y z5~Q>)C|BK~Sc;&=>ukptq^JqAGtqHNMBPVZ3nbTC7THWbFs#?6#Z;i}TA;N`mCc}h z3bcvjz|zE*5HUi{6RYYXSme7XiU7~J$j}o|%l{}5Er~)8IoGGFBF^#I=~`03?M0wa z)OgjhNOdEE)I&?FsJ9izlD*Zi&9TSL(FV#jjUY#JyH<6>SLpP$jdC?lfh18)MTtp* z3$Oxu!p`di6pSr^#T(p&Fw_7Ez*JbAJ8Tf7q^+IPTDEF1|6-fm{m24QDOk~^q=TI` zh|JkiYhLIo$CYAEz_8rW?W{5Q&hFgRvYCQHa**cg&RCP(?O5GL%|mCSyOAwl%i3Av z{k;DSTHytZ({s82{lv)4h|~K4M#9fd$yA4m&MF+G(iIBtV%^s~Tkh0^Z*;CdXy7Ad z(Av|2xQMo(Ox)K(-@}>6MbDWRM+<9+7Y(GBZWHn zy;0dqVZuZtbFEiwg-&WR)w0b~y_JY)eZC?=xBwo>|NqR#sJJ=di{f1pVL09oGaXJK z&RFum;uQAN&t1w=yb|Z&Ih`9&X#8R}g~@ZlKvp4?3K-heGmO6dKwNEE*o?b5W*XS7 z;mkq{gzX}(_1!+c)W)S&!;$3VjLBjPB|YY2SOZ%o`arVcT;z3K!L0@N16Le2g7+}m z4nt$pEkonYElE8{NQDawJ|?@QOTnnS^m-Y(^iS6*IoEy2OLgLcjmQO-Np8vC0I&{w z-7zy@m{nfkR<>qa1xE$-4ZwX}JZ&OIb^%AUSu|xw9TCzY)dcOGKH8Juu$4LVRc4); z7$)WX7B?yBd++}i|Z>6DX}|6~rTEPYg+I0uZ@*OSnnmdflZX4U0p+Pqw8 zo+RgN-Oq2TJwlP$`7`P&0ozZU5jm^TR)*-IPQ$?lmAtLz+dk>BJb-d~N2Jwfr#?Vt zrc2ta+JfZ2G?_ad9BY^~2;%;40B>x6F#`oI?0dCLgs$doB}AT9prf|J0@zwv))xd& zT?UXu?cU!5Jy@t9-sbS!a%4I%s@|qXmn{tG`o!%`8RPUuZ_UVOX{EM443O*;?)uKs zVHWFD;_oG5Y=S86f*@|^{=$&_&g64d*!=+COe8zdNzKt!KQ;Rq(^Tgw z_}6znzIW@{3Cro7(hRDuZCA+c{|en?FjE;D)HmGSJsdyoQDqGvzp5u@=*m7gJkF+x z+3Y~c5ApovPo15hdDHBvtU3$n3xL9n2<%tg0BaO2wjAk=mJ6!bL1AsS!=7pWXoTJq z%9EIYA9riR;BSl0m*O+fmW)r${$l|801amiY^v+H1|`W{@E?a|LpFd206XX9+`NV^ z)QNTOT)ijA1w4H8#N<9>YoWgg?w+bUz~I4t^Xh|Y1Z1zd2@M+Xw?EOX6l?#%E|p30?QMMym1 zD}*}Vk4YPbZ}^+O>8v46|0i%M5WnP1rr}cS?1B*+z~FTgshv)ho8NR{Rlg8izT;ne zYVkzZlokkNKTKV}f(wXIM~}Uo%H-ZI_yLJKYtP{MmT3W`X@~#uI;ZJ0)a#fO@o?v= zPHuXQA9<+h_Hzc;hoQXK7SIq^uI(6t7$sRImTOwicg37GbO{xmWbbIDbW*dbghD8q zV;TL%aeSD2Z1?n!7)-p+dxn>DaCwA$`Sqo*5sYWzf$s0U7@azP5AJkRhb}*3)q0nz zsK3R!2*L7dt=m3$g4N4~T)>1+2mxDYMDa|X%Jf9ijeO-6*BhY!?>2T{B znjK()z=d3h1k8Xq?~j!!aDecCangre9#DNyk4sC|P~b){0R;MgR!4c9{~J)f`WMWv zaro2b){6%SP67uKENJi`!h{MJB3wh_p+kX^&QMH5N5+T$e1ZB#tv6&U6lu77Yb;Kca%7u@6@e}C{9)JS2C{PGxk z3A%#Wf}FIqSpb*?@Pk2t2!vZu-)N|zL_-PqA&3OImIwzNje*buEi~aq1Qaa6(F7AX za>^%=cmf;{xM;G)T1}-OB3^_|)ZtG(g>@usuXXqkUP4V(L=Q{y5~6@-rAHTC@KsR3 zhw_CoSb?NCCjVJrG4#jSV`z3+WnB)!C5D3nJs5_Z6GEtv3t5FlC7;P*gpXBL|#vZ)j{3bO~g$(~$p(uwB@UFdLa z9N88W$E)2Y^qQ#6DVJMrg_^6tivj^b5*1V|)9x~ZlrwLoHDr4)i9;gv1#_Wjw7@~n zOv#C-4L~L0hSkLsWUCFR>TR{Lz8EnC73+b9K`vo|MR#y-GwQ3M#w5A7F_wcG=6TNh-r&>IB#jwV@(M3_BHrBXM ziTrm7yXHE$e`K=!U$PA0YAj+lBfF+!`AE(nYF9{j;oF&?O(N%6nTXPC2<=E>N|-<$ z_0$Q_yHVDyJ0ujq`(8&bSYK`Rx{*bN+xNl;SJC7SL}MJV=(2){Dn&7kOfqu^`Rg*_ zhN+AXK50(oII#!~J7)GEHq*@G2mUfXv(GX#?FBZd-(yF^X-*}!@n37uNe300?`%|< ze*X&pmr!BOqG&LNsKCxN#VdoHXlI1(h|4|H2~PvfHlE*!%`2OlmFHeXtBzf4c^T5v z-we01zi4kjz(UO?!eqU#RF6vEdtoYK7{h4sg+lMsTu7J#x^fMwhfdHT)0C5eNtk00 zxj14jAho&(T+M(4nL-g5;-cCSMg^NwSOXj8FgPITb*Nzl0jOd@_kgfZnt(vY@>YN= z3IK3p!VQR2vy_fZAKQM%0YNka$AlxuSp!1;)eW*y1L?H^3kjNtj z5h+|qiijmr-y@`yI~oQoEC?8d1C^J&K#5X<5`hS{C>W?G6_Sjl?41Dg#XH4~kpE?Z zi(Jg!=d0wTaF5>$Q00Cg%vO5q13au>A`hud?WExW{NvvtqB*q*D8Opq8ltUMm9`H) z5rkEUo$abP8Ipx}EaLJ_jVV=l6xZlJ>>DA5K;5F%=Xxac7;@jpuGK`l$j<`oH`1qUePn@AWy z^CFYBfsvCmqtfOAIE4gHF+~L|h2Sd1_@{){swS*Sr^@nSvcXM{dU))km;$OtoApv< z!Ajxvbj8!D4$`5ER?&)lPZj)#fES(rsq^cYR}dXwK~?7egkR-b1;RV(xT-n*S@$%M$a4haU@heB*1{A*jO=xsea-DM|b2tWG320eC z#7I!#nW>Z4BqD5r0_M(0?FH{0o^v+XVpy)>+#)J%mmv**F~hI@um9M9ci$1_v5sSM zoPJdZTv~E3sROlR3-tp%!=ZSwBH)BdfP91@w+~d2d=w=snN=rBC#GD}B&b>|q*`sb z#2FsXRuXE1*%iseS>BptyripQH8!{{JMN6Brw}wJWVrY=?i~I(V_^1}r$inyLGFBn z>70POevVY6%0c0qZkWVP2B&jO+$x+dHqlO2?`bthgbSeW3W5|dqf6$?Io^_HZsxRV z<{0BO`?Jk0jB}mgiyNOKc09-}oSn?$`~(6poN+pGWvy0#UaE4FqnTinmYhB|XNoF(f?$*4$n1lmE>L7G(h7%IiWx!HLGmSXY)>YV8I!(ny1R!NYE= zg~Dr@a54$V%?z)jaDxt?ZbRJL6Q^p$F(b?$G~qQ!(0B(EmZ(@i^ri$zH==YP&VT<1 z~g}2DpOl>%W+S59IGcZ40tQQDX+S}Ij3d4lz zqc0Xh&AvDca)R!t!>S-MX#7BEkQENt?c*qBgV1-f=KeL-9ow|pWcEvK?hV`RTLGnb~d;juX^wvKjElw!t!(O09}3V->DhC z5MlHekjiq}cZ3MUw%01j;d)iqYQRnr*a7#I+}YVMKAzpyueogh`p>y+Nid1Q}>x6wr<<6#tAsa2I4HzzKwiny^_b*`5_b+d$D# zFkm6>l^P2s)WAK<&qUcQmBtb>MTSrS!w`~?xd8&YoD```4NxBa+>jeW1p`DE9hOQV z&0OS}ff#T>*6i9>WMIR|UYgO~uk6_4^jzcAU4aOm7ZzO@iXkVt2?8V@O|%HVW#0`F z*xsqIhh8d4NF~G6=MI4H8~pC+w=w4F5 ztQtgq#RS+7H~v_i;iW>ZOSpOCfhD9v$|OmCq&%KkujCWm4H%Ij-5nML8K{pzBq1jV9OY1DW7rtC&CE#l zA_}5qkChn})>6*!CT8~IvH&DPi6Y_co=)nSPKujxuG-Qyr*keHG>VxorrHbuXCILu zd~HwaX`!?&PIrRj$;8K0#bUVSB&7+Q6{IJ6UfLzTpm4IEZ>dR|MU@rGr(n8}Fq&jh zQ72<|BzC@I``t`5dgj~A$)p`9g1#VoE*CS}#d)n%Dwo+RV-dwyWj5=eF`HTt{reg9*;gH$1aU~sDsHqWS zf$XDM5@?2AC<*;&;yj{<68~wps3lB3X?8v-`HWAG9#&y`S}*bnx8YH3BBqkwbE*8QsEM+ z@~N822clYLBA%!`GXK^{vgF_8(X1LPzVZ=Mp(MbPWe@-?kcz2M;U-!79Q#eEzbdS{ z_K~c{>Z|IKWR$`SYh6bv(`s`P_slE9MY)(S1rqN&Qxs$c@+uGXx?(d^ZVhqN}U=JaNG3hicI z?Dp(!;2x&jy8o?y4sCUY>~xB1r=G@GrYWFy0_&dIo+_@O`YO03=Fa8pZkjFMg08T@ zXD)v2S~9GyrtNo1YR@8VVkYZ;>8Bzp?^%LdQ8}-|-m96?BYkpc(hl8!+3oZ)Z#}vm zi!Cn|?rz{2FIU#9+I9l$VsCa@BKqpAnRTk3uI}TyFP0MR(~fM;&TqE_Z{b;{Wc)Mn(+F@DeN51b6NJ-kytj?q$*~xxT5$f@$>79q{_^p!#Nhyp8mJ?w!6Z zqSmk)*RVZuZEdx0t{$tJMX|09@bgNrjt!Rt7wx*%Y|oXheL(Q`UasbDt{9^*&T4SF zE|m)p?hKdO1N*W5a>5=cL|BR|uTC(rvg8~mDG9>yFi!3En%Pv8zU_PgL2fGaY>@DCO_`{DwWgjun%J~Ldj{Bf^f6`?|%j=iH4*PUvVyt+8x{Q z8fPmRkMP67aTG_+UAge>k}5HQvF#Sr&`s(Whb`jhs@BR`%@lBBMso{qS{v_dhz2gI z&i}FV(r*^$oi9@=B9pOw9BJMX>IPdWnQ>2^65GQn5(DjDu?L5o~-uD*_%b~^&p&?fJsv+^gavq7Mrg=w*M~H zHu6;qU1pE9xC-fD)3a&Qa9NMp64Aw)5Bmv$Kw6#C3MLrYzyg@yMn!1&{JQ2JJYP@pTLFD(Cf>E-Zkv^x;_bV+(e# z9x85IDab-CC$nE9yRj3~-D$Trbn~@XyLS#(FsIt`&q}x-!(U|Au_%k|7z6HSf3G}S zbX$LMKaMs&N#bA!_|bxBB^E5c9$b76?S0nh{l2&Whc!AcbUd1PD`&F%f&cb*yKh$4 zw{kDIa0~RS4D2O`wPANpg%gWuSNDYnsgd3iS+Atw-gs{>Fidy%LZfnmcXM$2im0vl zKkxYa)^zl4IbQ%a+TtgTgLRInF`lB|I~V!;nm0*%rG?XXA$xPGj`u+GQjfcJeh2RX zH=JIpHXjdf^ENm8c6OB`HZoH8HOKZRk2P#tFz@-|m=C<$Lh~bU^d>KRh5B`< zS2ZNdsj4Hh?s}`h*Sq-UvRdB?JWsl!X1R@P_=jFI6c=x7*Z8_)@Pmu>=nC}g>avwP zxJL^2ztSe+M0}-+ps60ROSihdpSPelyPMwi6puN$!!xUY`8(qLO5dzXdiqL2bgxtR z#ozSB%ldpnG}rs8&P%n%f-|X;yw-=Zt&3VLt9FM2v`9a=!|D3MH@8ZP`=dJe-dlWY zb834>^wLYZPp>YV{o-+DZJ{DLgFm;3o4DMcx!B{hysP{PF8?{i2Yl00{e4`t!575n zqb0g0GKgyWx?}o;|GWUFKIb!fx#PF8&L{rXuUkWYi66fDrfqU>+k}%hZF75ZlYYS$ z{6UmHhr|8hZ?w=$xHR{=KEC~kbNciibUr(~*3P5pVrP;Ey3)gA@n?6s?mPH@J`%sp z@k=>RvG@ADDa;cz^ujOd!}y6WzdfgY!j(Uf+Y{bnwC;aD@oVu{?7<%F!B_X=`adyg zyZ7Ds`*Ll1baVX&l4;w|E4DRr%H}HnFaGCV>hf;k_A|J>6aR~E`zxC|!LGkR9KYVC z{;$$9`>K1}!#TTS+t{0RL*qZ_jYaLVjqwn;slmGW{!}_?gHBxW;1h4;BW3u!Y z@lN;hu+usGZGTA1FZwfLlQS%qTK}seGrzy{lFz+|V`R_|)I|zrV1z3v25aag$T>`YZo(@#CMnIzJPtrjDSW z`*)INAvZ7SKIi+%r+x2}xZQR9lIt;a|MHvHIr4|M%;x{<`#DDcKO<(ixvMoFTX*%! zrfu&RBKzwFOS|>+uxQim$J_k2D==>p9OTVZ)JHj!o zi*J6e_di>!{-j6#lTUmnv-__rKf$j5`V%a{6925LvwkHaOUt(_uw!__vwrH!_ZsWc zwnw}+|NqYZK5NS_ag(m4^D_k(P9HnGsB6AO$M}0&@+Bkxs~SAPRy!9qeAyy5R}bm7 zBa4t0F)r=-%kwk*^Dw&VKfgyCwzD-q1O4~wKc9Cy=kv8!=iT}TtlS|#hyeC6=KO2_ zIh?oshC}x)^ELhpFJt|2w>Ld>=Ugeby#hPEs{<6Di?>cA#QMKH`&Xs%t6z;Hqx9n) z9S60Lekd1PxXHu3xv%PzD{v7vy(9Nmus1nRFS+I$w``NRsK5N`YxH9vKZw{lB@3z4 zzkC*Z+v=Ax>$CQ%W^3^K_atvWu1{>Xga7x*XLAlOdGIIqwr4D!ukm;{?uW9!P7B2G zBgFa>?CCrDF>5;T?>(r}_}=Hg!j)zJPpkX_JP*@YvIpo=i9Ai;{r~I#@AEg~$0@S6 zz4EiaK(N1960Dv7`bA^(;;%R^v%7u2@M9h{fe zrhYp8tKXh{rVK+RT?ftcG`@f?#Ni(v@ zuRc;M<_Jo?vD|!wP_zFGHM|ALS_6Pz#YOndI3+(z6 zEc@f*hax|4BERY@zyIU1>T9~ED=)Dhqq%QBmnVG7Pb+`ec3XS5-nqTQ6F;0!9Lozk zY{xjZ&pqpFKK|3$`rCO$Q?i{`wDEH^odRvcoqP2jC_iefKfw~L=zq0+zj)2p zBh8=o#|r6w#s4dBd&=G_t%rS|cKkQ9_21UMao<=^i@fT;cJQ0`l~#YrceV1f(E2OC z@q;RJw|(fYJ}I;Qroa3=zyJJebNPjDI@AAu#0S5Hn|GvF{0ndX1G~5aKYFzD_KEYk zu@L`~^MBcn;6fb#$rCL5TQtEEY{CbuVGHTY(=tD@{@{xwE{CqBGj)uszUx}Q$Zz|H zZ~J1Pd;B8r1J8XUD*G1iG(*?_w)5%fFUFEH_+dLg;BR}>(KApQauF{#wYr3fO@U|Pb?#nm{_pI(~{Nh(T3LWFN@3hFj@Z!t% zTmSTNCzPH4D8Vu}Z^!@h2dVU9xb&|%uI~EGFFbRLIt9o7$BOnQoBZDn^AF>CLUDE4 zpM7J8xM6SmD(f{{SN~=3Z+r58==xVOC4aT@3(F-3Z2Uh)!2bG0*Q1cK{)f6Zt_JBb z+W5j}^xzjG{)@ck|9B8H7OW@z9t*3*>Gh3s3XIhq-Kn>j-l-oL9TUw?DzMzqP$Q zbhG}Df~80bJ+UK1z_NZ>#=nrhyu%Xv!VBv$(m5$_>82lZ*)q64Mzn>;c$}X8ycTIv z!}kAERhE0T->>tz=dtL2G{L(5%VTQ77wl<2)f2b7t&2QYxBbZy|9`*w66_vSvSfTU^5^Q_ySYf7FtG!>jhlRfvwkINx~4xSn2#tM>u(Q- zJ`bS|EM@Z)+ZLvq8Tx$#4H>>1s#2Pw;!W$@Sd z%ZKu|=VC7dz3L0U?4!SXW4EaPeu%R*WS>83S2`yI1OOrV1O)~Fl>jUN0002s0S*BG z2>$>p3G6_ynZbhxD{We6P~gC34jm#ys8C@-ixVY6OZAYWM~o3UV%(U@W66ppp^YS| zlBLUyC`Ybb0W#%^n>Q_X?D!I=MVvr`3LQGC=qQCoi6%|@aB0(}N1uk8Iu$9@qoFEM z)k?K1*R4=BW))jB;@7NbyH?eD_N>~iZq>%E`j)9utZVNMoojR_O`s3kUj6IStkgvX zM>2#padE@O1W`hs3HhW-i5e?r?%8wh%#bB7yOqqDCg0L}3#nF3nsC_EWwD-)ZI?FJ z+fKg*zKYxH?Amn)>kht`F7e~Y+2S5PIC*pA(C-cuJbduBcTxX zbtR#<$=E1{1a>*;qnOSI8>1p-=OkVliYO|dc9v>psc3SSVtHwvnGr?edH>oFb~N63 z=ZxuT37>wpehJu+Eh!0Vr~UnhD5qrsiKMbj(wd!cU=6#Vm%cfgX>gw|`d3@~SxMct zpnAq-uBB}U9-FYbm{^Iag5+*}wxa8&WVAxr(!A^oQwDl@An zkKC(Gk$&wTo~S(yGiST~`*X(Ht}W`@g;^`~wGs2`8r&{BjG@^Sr~hShr#cJDx4-w| z4W?&=HEp%3=3c!k%4U7X^~o4u;2uODhfOEGio%PwgqvSHWYh%H3-{a00qgeQTW>lg zSXml8IF=UA4k^#=NgTMNxC^KAijGGH{A3|_P4detpV#lLEu$K&e{R}mGpX4IxaX33 z+0J38p9YG0_6z>K<)8#F+bEF-pI+!3vIOCN8olh-(fjYa6`7JScI@%~BA++8@w4M(x2A zs6e3#Q3E}Ixph<%dUZbauR zU6qe~>SJ226csoQj)g-jqmattR-i|9uZqT6-V-53!!pt^2n+F2FU-isJ#eRWi(3p2 zVZkm}rK>Z|t6Yp?WFt4JE<~IYU(XihBrcHLtAS&0?WaXxd{9wV;ZX& zN09wcUblKBEKjz@k=>Guy!2I|B$djcy>OR3gPNDL82^NuN@* zph1BWN*bCnSw-2VL$%V-8lG}G;k2kP%W0zR@Q_WQ0pPPdN4b~va8K@<=P*x&K<2bk zpzF(7=NL&f?1+Yhhver%or$!aMsTI6;bfj-Xi;XAF-H|mp&mC=r{EQDm8P4ct6Ev6 z@X!Zd0)*Lt?r73}s?0i>t7m!^`O`|)ji-uTQ zKAFqD&T)8Id(~6d`BZeFbEGwr6H5*FS5)>ZbDQ}QSPh*K^G6KHHs)T*5W#lDGvHy|Oa;N;7U-U$-tmd|?BdjVsfh)MD zX>YB!YtHOs#iMTROc55XRN>g7$x-@-sL_%|bnh0Yz^?L~Sxgm*j@M4b>h_&oJ)&)M zskx!GccbxCFHNUO+)0vCv&QP+fX=#4gl5)h#N~@oM`@Kggp?)XbV@J6IbLt7(2yz7 zpLf3t-;cB?U*8!bI_-oW8zJ(;BGDx~`zclu`ww7}v{!vQ3mfDb)Wrc~qBAQR1RVTD zlzW|$Ts6qXNYSvlxc!(@9fzjIDz8@=PG#wofE{_)tVOTeg9_y2^t+3sRF%u&|@P_SMj87*^LVFrS2A{V{t z<6K&^_4X*CGy5sumU~GUD|f|V9-$L|sZrONkuoS;keWsF%f$})hZhm@cLCYQS|T=j zg?=7vMIi1qo>t)*CfIRz`EElCZWt~=5IE?RF- zr%74F7{?FJWN(yh%01uc)1cP&YGdn8#{T)M)0jRg&Nplo5?i#)`@9rgE2S8?dgNRcnvj zL-UAw)i=kSEvZAI>s6Uy&SN`=-%er*VvybNes|Gry?27*y|VW`H?m+MO1H?Bg+Te{ zl0{qNyvPciEsuPL?QA+j*PNbzPJ5r#F71-`9aa0K^Vu3cTr9gTU`%iN#g!guX3Z|C zHGH#mz0$@L%HEAOjveSvCHV;#nMJk?`TlV^Y2Y@fcdTB*p1ZaTOCsv<@Z=TdHhu21GaaT)Zd~XDB3>Qmy=6)A;cI1*W zp5j6v1%3HvByC3~+|p`eHGluMWh}!|DFq9Rhjj@Bd$X5l>ve7G zBy)E5a>F--Z8w2!5+b#dP6ae^v!;N>XBcqjQcs6L{*`^S_C4=5Q$trijRSn=q%H#|gvXbDNY-oGlskeJVAc10 zFgQgAs8fj8g_Z?IHvh>AYsA@EIVw~o4FGq9BLp-s?BAeGuYKKdCmVrKKe+g7} zB1nb2^l*2lP-fFD$Q3z2gNeL0Gs3cY_{DvO<86KgQSl{o9ma$*f`@I`d!xpIUuQg} zR&#}=CVLn=!i9ZI$X*hXZ8sHd8kQe^HeCM4R_*qAL4rQMIA$IPEtcpsAxL_ar+}qc zGel!Y4d+yLsEqM9gzeW=bO>MRw_C+Xi_%vwzBP_r);0vmJGN+2%M^f`@=U4bEol>t zK!=4WCT8POXj8Qu5~qS=WmD{zb@kLS^O%hCsE0zhk9RmV@b@mb7?G^>kG$2A_Qy0& zn1C_$WR!(T4gdLEtfO&@_KNJ$Bq#-mWw?YI>0~i6byJmfUgup!q=9;9g!Z^(6ljzq zRvL21e8h-~0YrW3b(9T+Pl9w@-~x!VC_RzoNERn_WwTS_7)2MkQr0MxrxK7$6=cll zaKDt5HxxXp6_R(hc_yi95P4g0^kI&OkVYbF<@XPsdb{1jvT%xRD){h`L5j zyhSroCWx<=ib~m!r3i%rS8bo>iLpXC>=%MG$5%ErXiv#6ZkJei2vR2qdNbmcyfZrJ z1%P6RN&Xj23*~)@xsa1qfB+U~1I3P>8Bd#dgHqX)p-FssSej1hjHKw7?l+a97(gcm zl$}SFHUAiTETbQ5f@SAebn@ek9#=HrX`D)ybP|a=#G+dHsg{YjERSh@ z2l3Q+;pclGr@wuPH_L?$tgbv!AkQtGP z$aR^yh@Uf`CFYZUH=1~fn{<|ZK9`>VnTDdtosQ8uy9I}?rJGd=iVC`&b$Mh{_lr{s zmguKTB_o@BqKcMhrQznBC;E4)=a%6@qD(rO`;u8)Hl;TBAw%k;U5AFZ4h=(p^2micAn0OL?RYbKc^|eS%$TUGbzZY-;$6SN|W@oju16K zAl8}T=tun+o+4F*^~j0cv|-q3kMPJDt#X};`I$@jnuJ+0EeSCgS$Dhlq4+sSNgARR zqFnV^oYnM!b4QCDI+t=uhG=M?!n&4ZD4HF0s{<;33fibRN3OBCuJR?WSqh~y*(0ix ztlnBoZP^^*`mA_!S%GFZ-sZ0dwXH0Qf&sdB)9E={I;I#Xe@UjWlc#}#8Utjit_l~f zcqxknNrNJ&j=h$a63U@L3Z~R3Pn~*TtbwJ{x@)#pCm8FhbXuZBm#@EH0= z<*Fuwc#k1@v+T;F2OBzfh^Cslu_GE^I*NJq3LFroo78i(&N`9kSW_xUtfERm7>Tjf zxqQ=yvcn3i#OG0wH+DJ8s}B3KXN$9F+oBt5vC!ABq*{L?*s6N+ka?<1+QM8%b5nzw zs*D6#yhw@drE_x&sDyi#%U8HjI%mtctbutyTI!|9v#t==HII5*YWuVP6^(uBKu8O5 zKm=xNYN@-{lZ-2dpL&G@*(DE0f6o)T4CHU%D1p5SobKABWxJ(1i=95pSEFdTJ-dgQ z`?C1RRKeJepHWBJNQt)_C9Mg&R=K;C7hc-xJM!kd`e%Z3d5UKfRpUuEZvT6&0=u}< z*NvzmjDB#XuZ4kGR$;A1o!d&UL4MM~0>d5^A zYH`w+p-2(QyS~UQv>6PW%L;`RdaQ&@lO(atd{7Oge9GET&eeRc z7d1w{Y-RbubwKrV#42px8Glk(xuVE{VvCHuXEHP^rs)FHGXE{HbQsWtD#?G>eUvgAZN1v%>4)qE+C6<@V4wxKjS~()1XOKoc?<@KO$~(&ZP^UfS8&|J zokq9K+c$CCV1O{vOfkIKf+L-*mP&R;TF}G`%o@DNi~kG1!fe_A4ckzOc5#i7)JWZU zFJ8c%w92Rlr&!u#=E=$AX|({!ZT@nD5H6G|jk(}$){T7Lpy)&6x_dZ6(H<4~L3Mrt7?Evigx z;~LA_4l8q-?7;;3u#@bi+)3KY%#L=%!d+g~asOwr{WpRaTw-ZJfGV1>(4iaEhS3 zxBS9#n%PE+yWG0OofhU+A?a!E-v$;Mf-PM>qo%J5Z-YYZfYWViJW5-;~`y){P9s;n8wB@X3OF4ysC4_VSGb&RzU9DeyioY}W{WcERI3 ziS~da*3$e(qsi)VD)&E#;b3R7GUA+$e=3H05bVs1nWG9_Otf$3 z!=y*k<=b|2=&57p{&hHe?EhEXND+=|4OTW?xW3EwJ=^&=@KB*L&Yo-YGvMcS)e6Q+ zwy12o$Wd=MoEq}?wTi@3CQtci`I+Ze4 zR9s25gg!%WMjF?n&ql`7BM`Iidi3$e8|8a%$k!Ho%0TS`-0H6S1{?4!#Bl8>ZN0Xw&u|~=6G>@a!=*x;u zASog;$UvpM?o81_WdChH|CWr4xR?a7Lj#w)Z9{DlRWVaX-F$P$Sb2JKOBxrmwY(iql5|jfe|~bw{s4~eveJARoJ4PveGWW-77bVRRu9lX_MqkT_Gn0Z&rdF zi+5gOV+=U8hV?y+vz7n5uT_=TMbk@#?+x*|6vHKvFJ`Ml*kRYgr0QrhRSh@k2qTqJ z=TFbtR^X|+JO9|}qzP;{zg$bc7v()8>-tAsT{e4PLh+5cz<-;@+Tx*n<_gwHO^ETbd_7G3cff|2x$r2{yBHFhw8SaN!*HePgIEURu@^qbr@o7>s?f z$JPr9@#J|aA3d>NL(ey{<5BAB!70t{_wbz8hHyEiQMEI7-Z*Z(!*OYMe{Bg*n;Z6` zYfn@5?9nFK`Q-Vp9I9U22W&Q4Rj<5KHsq~OIFjn#qbSzECgqP&ihCQf__jOe5RE~- zd6bou#{V<bJT0u@~)Mcwhhp0pd+0G+2cdk z(Xf6qc}QLs)-xo&j#Y$qYb+Pq@*S842nWK zSavqpE$r}dkbjch2}k9(N|EJS+<_l$CRs3&Im<8yl+#KwsK)Vx4tVX^A1i+)$TX^} zX5ho$;0hQq$Zb-8=1LIxQkbEssc>1bNu$%L&=gViGtsi!iwRuGJhE6f<#mM4la7XMT@ z^(eYO<3qRw-sst%-x(TD9rctYr*^f0t{f%8rqon923iBjW!@v)*(RCCR1Uesn$ATM|U zg_;Pm4r=Iglf5ZaL1|VoM!0sVGO%yxm)XKajJ(_{Vsm4Q-u`K=qGNlE*SH#A$bv2@ z!usc7$;LO`aZ-Yp^;^15*%bmyLB|^4@s5+wV*)D($R)}#fh|^K9>>ifLH`EaOM1Ly zqmh<`MLtk~i5pMW`chB0d?OzA*??BfCaInX{`)Zsl$)2J>Y6r8`0DLHZ-&i zWoo0F1&a3cr<0>?Xv>wFNeu7);yJ?(V`Qeg&Mld9wPMK#vR>f?>Ho?!spS6Zx6WKF zl1v3Qv%K`U+v}dV7Is{TaFg5H8s~V&t)20Yhg{?%4>ie6p6!yq8|CW$G)+KG<+#4@ zyb&~&<@|@>#>9BUp1mfoWGl{>(Nja0G9w<5t4yiYnvn)VLKU1|hNnmU=>)LCpQmsF ztUG-QBS5k;obC|thB-{nQZ=_*?bWek3e+sTl>h6oHS;-{QZ(3d2%rSy zBj4-EXZ{Js5C#iuAo>ibL=KWa1Q^(&4coUt5vpH(U~J(B(dT{~n!ok!^Wh0wZ~-fl zUxn<`ga|`O1oJCF1`A+36k#|49Q?lkvm*kzAOrBbz5^J$?Tdg~SO5kTf+FC8^xHlL z_y!78z6)?NG3Y+#Q-UFYz76mQGSC6*>jDjcfg#Ypv7-QGAObBY0}70Q2pk6(kbvgH zzw`?L4*-S=bifPbwja=g`rE(;+(53&nYQXM!y2U#!?#=Ore15pG~AwO2c{^@1;;u_0U$I*SsG z_Sh$K(lAjXEl2XCLUJ2++?DbonlTFt73e#PBd}K_#4(7&BM5;?U;|qGzc|##4`6~N z;DAMpf(Y;d3TOfkP=H|czc?_#F|YxJWP$~3!2dj4$Ss(_|ARv}(8wq#NHu`Se4I!X zY)DKj0tV0nlU&J1NXa3Pfs%9sH`u{ih{=yE$^OI0m1KaKqyq{p#wB0_CfEfLK*%L{ zf?d>so*YP-B*kyg17#Ql4{!p4^v42dz^POKJLt+3pn;bh!Y+tO`fEQhjK)2atR!3~ zUn{7tp}kv)42fCGpX(=vqc`K~xdYoNg!!tGdVwn7z%evEuA2g$M8y{Hf+u(Y8MsIW zWW;d@056yTW~{!CyaCC?!5V-`IaJI*u*j@rK$TQO7CZuu1W57AObXac6YxJ+%uJMQ zO%h|ZEK1Cr0RJFB13VB*2AF^lNY2&#KQK7SK-kSnAjm@m zKQv6v=$u7}BnRLGg06&0mE2A{0LzC2K<6XN{?kEv)G;l~9(2j5B}};4+r}njD#idf zkq`+xu@!saDDHxjaWSM0(kkxJo76cKV}nn{5{SU;yT&s- zwbZh#K$f)1P32M99Ls_9N+29k4uk>j>`LrxP8FTitCUP9EdxuHNhzgLr%V7za791> z1Wn{lDo6nF>_{Cb&o~4DFSWcw+&2BPBW!9dTO&|B<;HBqw>HhAatc?Y6Sc*XA${wU z))CONVyKXEE1)8gng>{wRaR1w8g6Cg`koxzbT11UJkR^3=H zaDeY?RGC!3@tjguwMq)~*rE(iG|X4>1c5xf#BcZlX|=d7(~Z?xLNtq^Qu415YpTAI zBZ8x^;4)hEc}GuCAE}{Q_K~Z^;v`hz(@Z=(y&HnDECZ+{)S{HxX8hFgM-&h}7wlM% z4Li}})WEG#Kcgo1s`tPPgKP51>XWp;_J@+zxCKh4WDWpgA#6ri)nqfA-%f5#PljVoHbYUK zSx*k-wzWwuCS_K}-&Ag8@T~$#J3t(uJS!OGD1K%4%Vk}LWg$E~F$9Bj+{QBNyBDq&gO0AW^Z2Pt}|6EpaMsr0&_0s9Uf6$ z9$#GUWp{4pH7M42mgiFT<#%>vd_GxtzUOZ+*bS6risQrs&;rOqf^~*vd#2~^<>$v7 zT4~#qVa~=Eqa^=_LZzlvE(p3Wwj{Vc?PibuW{|GOkRIu57HN|v=|v9I3_Jx$XlX(q z1V&&4N4SL?RAnBf-uoS5gtliDxL+IwhNz?1oKDe9u4kjp=XuU&R6gof#^+eZypDTD z58Y|1X6l`;NVL2WGK8dq+Qx|aS^!MjgLm@w63^BQ|q=qX}FH-kVY~W z1O@{z0G2)kNO);RAcS(RX<`M2VKhuN;Jc-+YN`VU%ahl=i#ryOWzRdlVm&;?Ht4F> zyYpP#js?5Ggu0(LaiLYYZc_HAj9=nWpIy2u<*t13!oW z5+H%P`|PSdV$;?F()(@%Py&KB?e!%?B{=V@zQ6tL0xkgKG9Y6(gv0P&ZKP)CPFCMJ zZteUI@Q%f5*e$Sw^XokDkpGq6ZZuzW4)<^n|M1|}Jjnxca`uE0KLskd1#-ZGIlODVtArO{=p!A^G^TPy zKVqxyZbHxAcz$wsme+WWUe-?Z{kHV*K5evAxY->gs|xD~PcKpsa}Rq6*1H0)%Q~q; z#_Qd2SKo2PD{aCI<~EP>3kU8uFFX|Z>08)ybKdh?;9&!hMaA3zE9l$`NOn#>^igK? zq`q`a$6u*__W$c{XJ7R7g}*B3?zm%iXpeSqZ)z*o0LmJ;C*+zdv0Yr*ZFU!RclYvk z$E*)?i7TjU6?k5I?`eI{cYg2px?XjyQwGj9JGG$KS8r^^OZd}X_|h{yIS28@Zq5I! zV}M^bXFi|QVITH2?1OD@bQw4FUWRNJ99wVKZ>0{qR2Sa{=)0Vzc9;KlIDYbuAIT>! z&OwKHEzWtJ-}!Ja?ALzi<>hpo%Q-ch!eTb&K zsc*ik*Lr{N`m0AjH-EhP4a|%$g_wS6bk+q){__?;_FdLxOg`vGmxWzKfH|;iHPAmu z2kIJ4WBp}Sl@#e8I$eKGWCm&chi@z5JQZXTaa;ujW75O-p1q(p( ztOGmF{$lYxMYb#3+LwFk&u4j^c9WO(Jm`VUTueu-f6vT+{NMk~1c)nP1_lsF@J7Le z1@%-)FpwN+vLvjOC}V(Z39F;ZmoZqvlnJw@ z%$S>I@+9Rm=TDtMai;9p@deVPN|z?}==9{tkSnB~_-0iJoUB?+yzAN!&R14q#fDvQ zb!^$QX_c(~>elVIvLNFMIg9nKU958*NYOIDFN?q$HI6`lr0};P7i9nW@l>jmCn{91 z{Z_mI; z9I+DTSFT9$q7}cP_J@+X@_$T5xinKqP#AaRw zVM#|7I09RFjdk3JTbX!bU2~ym7Fubwq#|5$l{R7}W`(6_*`W&m(J81R4@ z22f$-EtO2hg8(HcGXw$A#Rd$E3k+ewI5Lt}mK8`;wc=K9cxnIJ2}PJ$i5a`~rW$o% zUKiGUr_uLXSJeUH8~}C-0i6VAkP|@##)$?cL+5p;-J#qeim0NEGQ_AJ+m(siqNKrR zAEx+S(bs}T0r=@l2-+0XN&=F?ps6_#MJlVU_T;Kh8TKVBtsB~k)E8@ssH?6bUX~(V zS~g@FTqW*FqiH18sD@m`642vd7Zx_c7d;3d2?G}pd8A~w7*Il++WOH)A6Im_)s+WO zHriWqSSkq;y{09m9%J|rDZb=10jQbP0rMpuVEPIIyKv?J5mzMWdELU5gi)jqWa!Xl zaSah#UZgKpg73zK=8MM1A$trd$R$VmoTZpngaStTtuX(Ur%tUZ6wRh;tYCpL(+umY z0p{GZfkDSmD^k(UdUUNx4`6Vx%F@~EbnhaYqrk=<$Lp}iwnc29#RZI<3q=UT7ujXk zp>3CB4C#m$emq8qAcU0Sha(1ax!goX1)B5;LM*6xL{EX(v*DhJ1Z~rs?7rplG4>9eLeP;0W!1JkxSllTzyBOTEM}>78bPfq(>3DP?m?TqhT{ znJP&KId>e5D7A+fV0fT(FjUHNgDgH-i&(oPsa3VeFsbpr#!`>Lhm^1_^L3?IA%^Uxf&W4yX zohqOs8r`VIG+I)f_1xYG;VBXBjmR}N7|9&=fQo_2LKc+>!e_{J%Z2XJfC|kaA_}OC zOKA>IZOW6vFq%29QEZeP&1k?hnkU1saD-J`PK@FQ(v4;XO|F~(17>)z8k#H&4D}^W zbBc(+iNOMmlpM#9nanl1l$}k?Utc`(&1p(eRH^a_Hj(!#r*3g)T7=$%I&v8Mi4&Yk z1EFQm2}ihS&j{;N=NaQz26n!)tndHi+C5WhMtjmTo;NdJacc3TyM>^yXnWY*APPkN z9R#pmKnNPb#?qBCR-}u4teqO`L4a|zqA3*WwZPUn`Y@JZUL!yeBElzz&D3?0(gO~& z^vj0wp|!4EZ7z8k$OC*qF}u7#F^$;+sM%*-CpaonlOoj)Sv5h`6bgm7NgypMcX`E4 ziDhCVy2CiLs~F-DaQGP`qN0(k_?#y`&q`MA#SyOGHBDPR$4-qMOi;yiAq8CNff~ZV zrnmKu6>Pv)!Umv7k;+0uXGvMl5?HbY&fKrS!qG_@*rN{Cle`}I;1xkKVgAZP4UcHw zUT*4{Ib|&__lkqvY)TBO;a&eRc}o#G{njuCc_I{>OHBej530^}P*ty*V;yheSLKXu z6=eAvBv6;DVI19A&pV?!o>G16MQgjhXHU9Hnabe(t|iHvMEJ%xa_^-;0kLGJ2!!@D zJ?t-g?8es0vKg|Zm2N04tAc6;ClOQ1s0iC^(h{y%!WF&~iw3M`iO>{ZCAI>Zs^DS( zXJOF*u0n}HOxqz{!EX7%!B2VTyCx~|lSKY251~1VQO~%z*M#aeWt_aAHLtl9_3@9X zp@P{C| zSIQI;0Q$~X+C|Xwfy4iu6$I#TY*{$4Ca-`*25J;VqO>eoJSlG>bXF^0kizJy(;VxR z_G9)X13RaXgn`Ib;A#7Vz$Hxt0B2;PILtIq$&pM>|E|$^3obTitW79r%x3`-+Nq`o za#Ta8LOTX|M}j>tX6vPl-K}fW(C0KQseH*RS8@8r7e4sSFW4%z69}RW!y|04bw0F# z#QW5pKb^V0fUJ$TJ*$F=0$O0yO;~;|zVH@Gft;4ZOb5TFKo&Z-loMz9aq7K*3;sFJ zcPaFC9^M7r><6@X`<4|JK?c}FIthNy8{I42=+;79w;|-TW;HvE}p7cy(|Ad=LqI#uV@^3ZY;CcJd$pA_SJGuKB~bx-VDZr5#ZZOqSM~!<@P}> zwGKod?38xOxemF%@JL95XfrY)01`mkI+kT&qR+AfDuCnW%SwIEc}}AI)GnIe=35zF zaycsn9JzvEn(rCW*0XScCcSeXwzmZ>3P5vdOy|~^n^ydNwu*6>mD;!*KM;kS+;Tk^ zbMXwRcvDEs8a?ro`?N*tm0l*a2n0461Xf_6kX{7#oaVe9>~D?&|heL$q5`<7VyDO_1*q7)27tcr6C=PZCYzkT&G!_2V+geTN~y5b6+J z4Hec1njjESLJc8Po}dzEEC%M-+Xe{VW^@5?>=g|B2Gl`a7wDA_<^W=NP`s4TvJjz( z7?@+hqE>(eb=YB@bP`Q<%rosB9vGZ55Wy&TUlJf6Xdv8c`O*}uUmFx&nQR)G$cN$q zmljS%6iHr|5Avvy4Ig;a)#Tl=eULl^{mWW;jteys9pS#eb zJ(~ZL2IAS5HDY|-OSKIVKt|#P_@hJg3&XUaC=mb-gvN0!1{$1BDUM<(u36|j+Yypb zgZ)`XZseem-3(P2+|j`e@DdpSKrpHs4z-5hxu5%S;lS|}7Dil(`A+MQp%UTR8IqdD z?O3Pu3>;$KCT!C;^33U}Pd(Mutg+D@vLoy9VNvqo{ng_=VxI%P;_4_OBlhEN)K@@u z@s1%DpAy-@VrSO^|Mhp|15|L{OtJE(JHip>aVT7a?He5nwj;#LN(mLu~(= za=ee{Z5DG#WzVhSRGtND&ZBF(OCYYM9K26Qbs$7$Wf6gyR|aI4?8fhX7DKKen|uut zJVLb1SDKj)XQh&b&EiVMASwnq|gJRCN<)j+|#!-cOjE6^&yY=snI;BhBHXgUTj6x*mmIs0QvET`mC=pbkH#3DZTQi0&pq8Yp(IVA^S<2Nnsp z5sbeK3!Dw1b4tRTm4@)yCAi@uUB>1L_9YZ<1l^q^XwfLSSz-JsToYm1kQD!%dgj)G zDjthv0eswAbqQA*dSMUJBA zb~R{e$`p0BZD!?mL_nWnD?rBGdUBq13V~vHKp-f@10WW8 zq}V$s+KqahIjNB-C2jT9n{rT8Mq1)Uae&n7qjv6+l-8C9kz{R6+DHJbFs)YL{l<14 zEN?uhO`dHZ3Qtp9WB*|$jj`H)@+X(>gnsraP}~HYO{%8m?WSI;-p*#}spg%Y=CWPj zA2N-LK&Wi~oTTb0%+4OodZo>psJPK<=o|sh{;cK}#2B1Wl<5EB^c`gG;G#Ze7SlGU zrD7+V%o3Y9p_k#S)pDO;@&VR%r{gJ{){d>KrUkI|nZjC!+SX^=f@x7~k;I;gjBP2G zDo>nttn+s4A;ufet?6qvugaP%v?3zNbQ`tC?94{4w%w2s^ld-YYnu@O=JM6%ChBOl z>`5ggksZ;yRv5Py2Pes(`9iHfmQvOFREuHSLJrw{G9OH$>ekYhs?r~dC7sCn?nJN% z*$6L5R8fBx@9`FImtL%d_++YV9GVi2j0&r}wh1&2qV>L}15RbLo^bQZQim=gBSPf& zf^R~A1a2{#{X&WKQSC?W><6r`-o$L5(Bk!3*m#(gwM74_(ry`~p6==Z$-P7^*z~V2 zZc+|d+_r+EbRwpbuHVM=;-%EzvjSTan}w=I%YIy5Hw|b2a-)A%F!Maug0LlWDu5k7 z1f1yY-_9t`O4tJ>ZuMfXAYU)}R;t&iYZP$r3xy!~wtx_gYbbsjN7Y{Gto2MyYW?3w=zxi)SPq6`s}R_NwqyIF4j_AeLn z$1e>uOXe;B>#i6VGTP?B1Vtw?!`PKJv&hkHfL5OJN_1s9j}@)jgopqTc(g}f+b)bW zNjrf_Z^3uqhOuSwYuNq=-<1HrYqR5aHf zN>B5dHgF%mG$0c$$>wadMy<=<^yBVy2|oXFPYY3(*_klYC>ZQUnOr3ho-!~Llv8(` z8zd)mfC0cHTKB9*9m2urAYYXU!Rl5q zB`kfwTx(1L%S04J!*Qp$twr1I8yoKidv{Ch!s;USNGmpZANF}qz<3w-7F=>vLL=&C z^Mb183ZoQ-Vz%Qh@;EoLLcqYrm?qx}>Vyr13!6@QJT=u}WDzrX1E|1AV8keR32QXx z2)CK(4w@{Pj7X;S*OF(z2JA%u-eMZ)?oO>uW^*07R8AUmsdQ0ihTMU8w-;q>P-3Z# zbt!o#HhLR&VWUZpt9KK)v(!qBQU3qo^_A?g!jm-0r5?(oHm{}>7XTf|KsY0Ke|L63 zmd>QOG@CZBjhF~Y&9i2|5E2(*gKHELSVA$TAXbFig+FhPwsMDixLSvJGLAS&!bfAK zEV`a8C^~nfad%Y_&*ZtpO>Epo=Xf0Q4Cd))dYdXDhNQJz;@=!>jNI^>=SKll;v?L#L!6G%A!60oA|y>0x!$%# z1$Ug+<|XRY6T)r@+5#ptyDdEXhvT_2CUAOA3N)UjO=9(3Ka)VK;e;3up#!L3YiTn3 z^;FF*DNI15?|4XubWxo*kPH90k2is)%XOzKIh@XE!9+PBGtF>^RF%IlPR9_3raGT` z_O|ihK+d+qnW7Gt35D~U7TmDKuz^m4Od?>+;(V5aX9nXcLDnI}a1J}kb0o3T2|%|1 zF0A~@?*g>n`QN$Zz{z~ItF%!4GL*{ai}{^SqI=|dX@A0aUpGQ{pL>lrLP@K8QBitg z!~1$aJ*JC5T*LG|-uJyzD3t3c)N;THShP&_NNg z!S*WW7_O2<_N=-SiHnj0I|HY_GY5=P2?^}r)3tBOTR5DDwG;Pm7+gXwU;^XkLM~jw z%S$^J#x~(u+H;?HAyfa9eE?E*ZG=dGx6c>g0qR(*RftfoN-tdc-K#rDYmf%5yL!99 zrpvkQ@3HOY{+Ek&2m}0UGvck=!ERV9h)SD7z~1ilrp&S*;7iU1rH93LG9BPPD;$CA zTYnAYvuOBQ*HA6)Tw)o_@+OAvg(rfpA2*gX0pwo-`4ebRp+k38B6{?vQAtag{ygDkOw7u47tENWt zggrA9@VCQ?b2K&@Q%+>102=H7(YI??xh7mpA){=_XT_B{Cx%1Xbm}{+SqEl3!~+D` zvaeXMH6~Z?T%RuC!t|rXQ?->gSRsHy3koY)lHh2b49b@3vf)!DTm0aQQ?%axPHDxH#do0vP7_xU)GjkZXev(PqO=yY2)9Z@lroP%e!0 zG+5L<_~bhX!2IlsR8sl^d~_520F+3hL<6|t(;q|~)j$ImL`gvgLyUuiATQJqNLXd{ zk=9ykHOxb)sLBf~vq*fPg|^lX!)Am)_D~`}2g_+6V)eNOHsE6X1yWp^GrO zKmq^Ggb~Q1j4$w9?|?6qA+x&cGUG1X@5Ix%yz>-Y0pyS|9f;DAF^x&T{{-~tQjbb* zh&W-34HZ;UO+A&RnyPhm)}CXv73iRaZZ#1O9#H`4q>&b@h8ke-HB@4W1(xbieV9=K z7sDD?+3c9Ag4#D=DC3)NjqDb+N{-AJuq*LJI?5D!oW6AA;S#Bf?E;KQEd90x+|3SBV52&nTcrO76DgWBBYiok`=!LB)t3f<^f zS3)T8=Ti9LR0>gs5&ZDUaKwpO>}E#0n%T^DAqXGQwDT?A{m^H=3u4g3Vzdrb4~ZU7 zq7zDztL9+>6Q}ruCqCf_Oxy%{Okjh#d;+e%V2L&7dKUh?_CElckzQXsBm1)Fy)%SH zDh%KePxA1Y_$j4c=UZbQ^(Kh{%Ekr@gi!(s3Bw0MtbvJiz~9DZE=N8kgBt(bVE#I$ zC@_FQge2^b2{*~fmGuXOD)bMfh;v9BxULN|q+!%-h(m%EZEdmaq4r9Hq`cLV6-x0T z5aZTMU;Yx9!4zhaY;wdTG67geNTLFcfRYxR!WN#OVhf%}g9xbPm`hPx8I;jRFm~yi z<`X9$aoIjsJrWD&q7Zn7;FormbC~^umttxpCgH5eEQ8eNJ`vf^e)i!2jKj{kW}}Q- zYHpGp^q?gfWxx>%1cd>Ls3%*tLIIU-W&4pRf7&C+QpQk$P=ng+ZYZjEZj(?cJzEaU zR<=N~v}}s`R^DieElJ#xYx0ceFL5QmV=l7>Re1ylKop4tEPXRK+tySu{0fg=NU;5Hu8ya0mm6<<_=Q^rHFB;CHTrZbAToE{o#jtL*tifRIbc8 z3$MshKD4n?6RPYBAiwS(Av>zS*y|_-tV=rG}~jum9dwS)ttFKsP>HFG^qZxdP*ZI z5Tdt?Q!IlDOJ!;XCebw2LaQe#Kpc%yw#OZ_Eurem0o|$%Uucjw*8_LzyajJH<}2k|1p8L+e9P ziJlNV7BUk~r6x3>&Z0@Q8e)~vI6Y&?$alVTq|6Au4-`QNa%h-WAH#;dT zn8A_7YzigJG7C?1(4R!KqBoT?N4H1B4}4%~OHA5kHsPspT;h+df)_YH_ql3IYivhd zYEqM0)TdUp+D_!W>GgPeNOMDwnHWVPL*f*eNWgM~n!*1bNp%CsY1cK)kYZ;^;=R>* ztCHe+1~1FB0!;}TH&H4v`>No~?OnrH^|wbo_CUXOHmsOftXDmhTh7_0@}Bve2gWKm zgn<_HM;6@+dl%Z1s@n*qda**vcG9vM7I;PyLJiM45X6%XcI-%%st-LJ;>?Tq@*X5{ zS2s`7Tj=!0IbM~$rrR$ePc5|Khw+QUI(bI?02OR~iX$htsS)TNQ?|JAz^@IEr-`S>p3RLR6d zB-7B({n}3mhmZ&nZwnMa5FWtg4uJ`a>=bqZ6P6}-C~pLptuk&-EkK0=v`!MZNez@F z^&|)kCD7=`>1VF3y{4>uxCNJdDKxlj1BK>jZbeyYA$T}&R=(j-01tK|Ep${+QuK}O zH0!VE&FygT!74%q=dRzRPqOSo2T$pe!p~+Fr0^~g2#YWXH<1%Nan>Gz5-0%@2%*Rb z!4wbSil|U5Zomc#tQM$b3|;U4+C?pl1vcKv0CSEos&1@cPcZ7soMNSxNMiv7i+|8Z zh$>^`T!ZT73V7%ss-RIj?qX|VC8hs-VvZ8<*yw=E+6hB4FapiP1QjfkMutDK?+_yl z5M^)$w=etjtq>K#g%sh@RtJ<&a0mac63vevJJBEe@gFtu@Sv-Dns5{ufe=ms|K{)q zEWs97g#$hV4wDYO%7>fQ%mSxi1h7m6crm}IDvjD_BE9YR8ep5&jH~YJB1bX~XAS@) zK?|`so+p>5GO0{q!0QkOYWL- z4m3p`|0*7#awPuEQ6LRvC^7I(!a)F1EE{hu53ei((jSLP2NGZximVh75*2q%{`BAn z#vrX+WM{~bBvVgq$jM7^N+kcI&5e8s5DGJZ*vBtrjGTCJ+S*B|h{h^3@TTHI)yfV6 zIL`~24yN=_%fx99nXf&}k&~hi-&hdCs?QJ;jRvQZ?pg>QGfW;;1{#u5#CY&4ZRad= zQ#Uh_H#^bcEH2`ThOe056i9ItM^Pc=(#gsJC*5ZkQ?D8K@_#yVH9V3rd5JK2&oA|o zI}Ou2DG)V&X-d@4F+PqB1M3#qLa>fa7`GE%J~Qpgu~PEQ!C;Wl3Jo<^M-XSw5gidV zm689JKYmHKeXyP zu=lKUFs~ClLDWOV6HEVcN*qzlgM7dS!Y3|%Ej!5&J{2V?*KYdolZBX4Dt|O9`Lph< zl0SviDGO06F+fxDG5mgI9|>=IU*@lkNVG%8v_$y` z55LJ>Qj|>Blub|6JuBlV1@8ik<;0jGCF5{^vhW0TG&L{k5&bkjNz(=WRKg}|HT_c~ ztg>W0t1G>-K+A9NWI_ZabxJFhO0N`W%5T(^MyckH2A1o~Y)VW!ltZoXJF$~S@l;6M zR83X&O;O`0M~ev3i&e`Et6)G+Cowbybr6BHby~1c4J~zqwcjwzNMqC9G-aY91^g7K z(w@}eGF4S3)l&bfHR5t8hahxY@`?tOs%cyi+;HRwl?)oKA_U*To#f~_Pvhf?2CK9z z0cq~8cqR_Yg^ti@pdhjf=ZenyG9^`OcecdFbnIWWtDHU%p3rp} zkwhFnWj$w4?}tb_uv*FuQ;NWNrU$3XckF2|Peso6#}#fO*bv zXOBQK&1|rKa$h+EYNMh7*avYsZI9M-XW>P#j4>8L?-nHp4qZTLJxx?8=mrdnnF4AG z!f0OQWsUz}<67#(W15fqI@VVYvF-pBSckPgAxlU#f;IbdWSz1R?NfyOu2E5`#9WDU zarR|Jp!_JcN+oq>Yc^9&qH}FP$Eak$@M3LvcK-Gv3{ya9>|hLcR@NdQ1N_yVXx9!D z;BW7W4QzK9J52#P1Y)-hcAcQWc-IZ|qIhyA>5lMufvn2j2zdm{PPz7YL_p8ZsA%<~ zX}8yE#dUlaU^;RHM2siczCdnd;Nr*?dbzP|D)y3W5M$ZyDGL>UHI`3B7J&V;SZ9EM zA-53`7yLeoKu0TeS=Mtu7lNg=bT2JMD)>>wf^~%#ERMv}JoR~N33vAkHMj|Ohd?Y; z&no{s*l&ySzi{LmMGvpKb*ngo8bny_mJ5VixZ<; z7rBk7cZ&wWc*vJ_Cs~VHB}>+Gky*uj@(g<20DUSU1(HXHrB{i2*mbQ%8FW~cy(=+D z*pOYBh=Ev@{j~wYH-}wu0n8(4wWx>5pbgwtS&j*Mq&MtLI3|vga7iX4{OwWbE-U}@ zvjw5KR~@WKEh3u(n46iwjVBD!n)Q@asY&aYf%6!h(-~*~_?$@!EVOEu33fHAiIQ7l z5b$Uc?BbFq;EHqS4d8EhcOe?JXC88dvgMS zB)OC)fCg}hlxNv`0Z2?R*)DmP9B3JNYiXpTfRcF`2_i_Lp*WD7u4tc_mV>wCPD&iT zSOc6de*=`712kh9_nOIgDo0kE0hk@Rc|X3-spVMGMy#AGO;)Sgs@u5-$Ip(hnyO(Z zD5s3#lqt3TM{Od`Lk3}elnIG!qLKaR)gZ)-lIYPK|oUY2+PddrooxSwTF*6y0Pgn4rMYL?krlecZl z5XUnRO9kxLp?+Gmhni4ZTM>zssPpY&)zMd%`cS(WjbD2{KJ4H|fzm!}5~sS-guAPY z8>_dvhDt2B)dMcLO^NH(le-X$SPro5FqfAHiYtK%f{ZonS*GnkuTL%k@Hy6inH*kN zi#3}GqT2*g*`@>k`w(x@a7B7+GelQ9QYHkgo@VIr#(fooCZ_duenpWLhFay?8 z%hts_TjJm8a!dzt{h=Nc=90Dk{0TP7MD`DmENaX?AI z*mQt(KYcVvYumOdEM$*b7Rdcj6Zf{6I%EG6@4gQO&(XKt{juaY#T)9g>V3uiZqhHE z#hn$Zp_;@V^*}JuS_$6Zha6_FwBQduR~Q~RAHJA=iqs|kx4PG??SRu-9g8rT)$c0V zKuFsKZCOimSlyA(fRrjZqTB;GAy(edU)~)TEhCgvDV;A8dmG>FUFTJN=f8Nlb6(OU z5x7apKrd0@9e&}@?+23}>6_l^8T9EPe&XmfyT~N9{}(G&Q>Zok!g(|XPjkZ3APx9K z?8iRcUEbx#U8xIw!}~K89-?$+^F4AD9~t%P@ot=h{@?$BTM|p@v66D{nOoqQKI#b{ z>U&e_5&!TN{~wor6RFUa<6r*gpZ>$z{_mfH`8Y)M1o8m_431EtD#d_>kd#7&1{;xT$gq;cg9{lhG}urg zM28z4dfbSyQAd#vM^^lZ@?@HoEM>WD3A38amJR=BR+~6yPR5crdukjPjj_UynZiI2Mrlkwv7CMh=POkzy^$WRt;F0$_Eb zP1)6S3trS5mLjnxoP#NXl%RqsMz>%?7vgpsZ@=ASQ*IvivXoF^GI-^Q&!ISGfhImz zR7Z>a31y2K1j?k6hLTlil8P>>-;0Tk18JmDPD-hZU=S*4rH*E5sYHBy3M!|f0w}7K zf=(F{GzL`(U7ljX7Tlb&=DC`NbACt~OO@!lrfM8%GrJhP|xh-Og!?XoW>#0}eqD!s01ED6bXzI4> z6}wb=^=H4&TKR9lvl{0bP|VTET!D;a{nVE*LXS$hTufzHT=D@QVNZXgK8O*G+ z6S0=uC{(FyvZY{QdTqTbheofI`tplvzWCzHYLzL|%=5{k+`LoIDDT{J&P5+>^w0n= z&9t<828<$tOEFAl!pCY%wU#DL?3=?CKg_GIBVC-au|eSpaNWdTch3moT*QorcPp;59gW-pZ)ph4GY!r zm+^mm>#f;eb-lAr>mRG1R{CAI01EIZBZD0Ds5dIr)}>^*uYmaD-fKt} zk%HMycXWCU>%!(W^G#@cGuhC^h7~^(jxK*CikkZ**c2A>>2xuWq4I8syk{McdHMRA z0)LppAPO&t0komP9#kgp&0vYP(bJZaqZ%Yy&?09F;YxNwlMqUbf?5pL`ff5Dj0F#L z?{gLIz!$y&0&jNuQ=|VIaY)4f-7I+kgk$fz@;tt!ZF#yQV{sZJAvV%5iWij4ljgU< zG?s>IR-_3DUoxDL5vznV@FEy7Hp#X>4HSNk|mh zBtmi0phfP7NlkLFn%W#?Ib&&>Qd-4-2sG)1gCFG3vBd9I_&itAiGm^xviX_+5vQ#?m1r(~Y+o?BfikPz&vTGLw z`#~%6(vn{EQXo0`V3WdcHa1kd4@~pe^x!rwmiF<99K7>3{vSCS@>)0DH|3-jv-cCW#%|bRzyNBHmBc7;ys^Q+uU9?tiKJDUFo&Z zve3}tdSkT$a>;ck&gcEoc4W7bo7mg_WTT<&=}f;_({}1{zyI0HB$K+{*d7=$0UT^q z7hK6p{Ii9IsY25>$iHAj=5+Z9U665ks#cbra#QP4k)l}ARuyi-p@#SO2hi=hlX{Wbu$X0cyM_3Xj zXIR%l64ZD8cV7+&c@=_oJxEOP~7UEp_M#rB4P zG-B^ph6ERHtp#`}H%&n$L-)3Cu~mp>xOx2cz2e#glvd@!M9Nag@dv(fI#+w&*)~N6gnxCijAjI?j(z$xNVOZT7G70 zf@W(Omtt-giR{#Ie#Lx4Cw%q?fydZ^*#&pfG-IOIdFZhS57=UB=f6OR`idZ7M z_GqVejkm{*Y3Pppg@2ILi_~>!xVDR($8No^ohWzMXfgh%c=U#XAEJ7LSdGx= zdZWgNU1nKiM{+qxi?BG02MLo^gmk0DPvf|D|Fv1QR5rzDd4fiX=Qv{_*k409X~Jld zVKtJ7s94dalu(3G%UE#PSV+QHc2zlnO?7bSr(&IiVCv(O^~e8;^M{0aR*WhJlVl1ZtQWXDw@v`CR>Vh#C|aEOruF_xnqT;C~uvGSy*^g0ojx|7I3xLcxMumXeVoImy1jI zAoi4mm>6X1QSUxRYI3N#3cAeh8gcs8K9PmqAs2l?HW! zX-1=2i|p5rK~bI7X_IRwe3K|oU4w^&DUjEde1*A?KDYCXXg1#Iw?(FC`I+hkb?AnjP-7xId{3zl(O5K-MAZn1hghXsAq^_lswY8+*c8pmmkrwBZd3R-s z`JIzTjtDw&f!dp~B4d@vhPO$77Xx-0hl5+kQI}V0oaSu1#HD;Di*9L^9jT*}nxrhj zYN1-E2nnFM*_ucPn0s1Ujw+xwiC20GK~$P*;Yt6I0+o8H7-Pbjl7^&2^eL%Smr(CW zj~9xP>1nKSI!vM}qQ1AHUbudDSE}bTQmjZDCc1&?Ms8eGtLFKb@Q8v?xRUm`XV2DT z^wXR!^mGVloB$c8E_t8GYH+WntfLxQKuD9NDWyo*izxP*LWrJk*{aV;sF#GFi5i!e z$DGk*ig?I{7!-f&YEI2HtkpPmGzX{cim?Spuk`ws%_^QOs)vROn}tfSS*n{(ieP3(GT=TlIQT8xi!c?_(lhQh^ z^+b$Xil8L>q}ZsF#-y^x3Y?`wu6CHPw3Yv#HCv_~RA~Q5kcM=z+xU{ga!Xn6FPtt05bXsfvNucCA;d zcm0Q?W@>VEHX=dll=Y}t$z`AS1-oSEyKKv!uqJM}`LX`lrvb~i`s#~dxng8ry8@aJ4uDDd8Zkm>~3$#xeyvK@uTvN2Fs)3=~iMMu<*PBc$ zhNW)zv@!a*+*-O?Dp>n#LSVbToVx$3Rp_Z4T4xnIEAHFAW9Oia7{8A+LP<-Q^IL)| zd!k<^v%Q9s{)uj-XP|nBwP6>T2mHOWWqWT$U=$mHRe5Mcdcw0fyx~KXTe`Uw+-k}+ zg8mA(SbDW1w{F5(t^S*Q>l2c=i)=wz<9cU)=c(?^^GgnP>K9xE&j=&Fk+R z5wfpQlmGGJQ-upCEk=^1U`$@GQ9$dhfsE+1M;KK2Jr;A54JaKP;0pfHm; zYdb=xFz)#=g10PHJ(G-$84k%~mo<@N%HNWt@3%4CNn_Vp@j1%s(-G}guzulh;Yu*}oNm&EOg^U#qnU>vP)ocZylg9G3rrZRgxK07t>h&_SOILrqPura$LYh?3s~ znt|ua%>dp_@kC^`EKQe@?gA#^P_IwHhW}s*_c-KULSkE>24klR(Zs@gm%y$k%=Q!= zY~LY4Z1C>9o<~ynKUBt5^H;Wxj{cjRfWJ6lS{WqFWl z-)@VtU67ei3~Y@f0I76lYS67FId*+!KwnzG zMx+fRitm(dU)E55eUvWa^sk7W^4{0%ip8DQ)!l`&xzWs8=XmO!h`F%=*PW`E)m@aS zquCyQ+jeNBuft#;M=g|XmfCz$hkj(~j2)sz_Sqym=Jiy?gOSTM+xi*&`Tcgt!$jFm znEv!~UAy0eMNW*HoWf~%oy+YE&30QZT8PEOI;6 zTL-1vbDyYEYnT+0< zD+Ihw?fxD>I<`SGAHx3argq%;jabBgUAs3cFxp=kM7(93aF~lzvF{hgb9bn&P#3S2 z%=CU1OMH$!dp?0Q1xgq?#J9k+-;H-4J+Jz)%y{9(GZ>9{W}GvQ$A9_X-H}$o0g+>% zZbfTEf3se$<8ZA~kFDXBL*k8euUkEXBRxshK5|vB;y9DGMPEkdTxT2*fABL?xvMl95xB(=t+!5K^)b)6h}TFmuwO<1mr~8H0tH z*twWlX;|nf**K`#$q6~>sknH!xr8aXxoNpYzwxrL^Kx?X^YaKG6A6$K35f{{bJB>= zlZo)Ki3_kxh;d0sOGpaRN^wz3D<~_8aVx24dcTm?5rqqN3 zYDv)O3UcU4a_K3G>!~Z~%kt{0is&0#8CV+{Do_|I@)+u9n3(99*qE5*DBT%G+wT^$YGEVVsNmAy((cs{utPmuU5KrfjV4sk%h>(<`Xb+2+w4%6Bx45vt z_%NIJ2=9cL=%k#iU#p_NqcSDAx~8GJsk5fO zwYILYuC=$my}z+@u&J@Bsbiq2Gq1I|t&Nzjt*y1aYoNVnxT}A(yJz6X;Ka!2^z`(? zyspLkO5*&g3QIpgU}W=hQ* zIV>7^ITnkCQF<&(xm+Rm{XV&ts?jXzqz`Nmr;SuRacSUa_>_%Gw78oktWPzgdaZGS zKpBYV_Pe~bly1FwQ^ii3^TEA+j!L;wIbI0r+O!6%N~;$Fh19fHty+fzByGgBcKvZr zNVjx=g3pC)8gMPgo&UMYcs7s!2XR8j!+rtlbAkCa?ytq7Ooy7++*XghAM6-~)X1vr z57SydK=p{b$D1c8^0@G*E=*E;X~muG!ah7Uy^$jFRyD*`*0<~Fo?io#!d&l{jXL8b zPQHF#NsO6|cMM-P#{;1^BCj7BT|XZV0 zw8y*0i3~p2R}FQDV>3wuA|e3z(&qe@xIs(|+QfEsL!Crn)dAXO{^w)bY9?3t>nBMq zHj~R_iHMrqPBv(z_{cHfvOL%F?vkR@?n=2fn(;T8DN5s_=)B2+M%nY-%NV z!;GmoG@e#{*1lb4aV=Ehnzu{@wY`b2b1vy=J z9NE~~UfZN1SIFD6&!T`dYNn)k_9Wf}u(u1BhHsp*$`sFOQgey_A(FuZ^7g?-s=f_j zqK**`U1yl|WS!2qw~c*_1vy7b?}5^1KZ=!@in^e_Gu_49W75@*n2{)0jnMQ090pl` z)II4Wr`$TkzG(JXq^*4D|7@oaek-1*BZ#A%b63%S&MQ-zXfR~#m1mmQn!ok1h|7sC zX{i>!Zf+}mwd8W+7wNsv7cz`89OJT0C@M9co~|0y`q#xiuBt@!zwU-*1T4|}CE7m> z`2Q#PRv~+!U2G0vC3KMKDW7mRl#{t*aiQRZa=lU}vhVCZcm8?dup}T;vFO5qz%{Z) zzW#pcVXIejk4Z%LcApv>=#na5$t1J}m;3h`995iCaiT!aqU**U`1g1JuSCAa#?ygG z(v}z!8lQ7aOO*Cq9p1O9a+;_Dn zzAv^an&*-{75r$XM{#&Lvv7Pp9=19Gy?alqv=l#g??NnqkM z0xXUr*wlBT8$t&Gs171HB{<{88y%=Eje5#{>0w_zoeX@4kYgM#pm^v&vWv?!y?RgegqSR83hyZyeOX z?^{?}RWQOaWQn>+Z4|%YqN%BIP^3R^2yibfx`FxdN+9<_!c6f#mJ-$gFigpBp024S za#h(BH;O;QbfARf60bu2Jsoud;Sm6O+~;s+F$YFzpbLAVjhhDeucgGjm}4fvskto| z-R#e9W-t-*d2bqhqdo}&E_|J#f$BxwRLn%g!HQPmV08L9TcjwoS`o5H#{>jJb)Y8E z$~?p`#c34AGy!{^-*B%Ixv+L7w|WN%cWPhLl*EsTRANAGHF(+1r#Pc_NHhQG5-Eum z>x@lFw0+0-_JB~QP|ltUt_S*Vc{ntSU$>{{KpzULZ*Kna$ds)`-m{;-7xD~mQ5IX| z#$0LO^L2K~C6Hie%_tfLOzD#S>ha}XRYpHv)N*|WOJB4HyGz7K?1sIWm#?2 znxCAq5YsQoHOCb^-Bc@0<87M9Wk3vaZO#joNzZ$|Qr&KlLf*b@EReZmcH5jQ7^*G7 z^d*@IMP`XWQ!37={+LhxS4-3QQcVV^Mt@gMaL2-~>ZBG(M?SUAJ@zZ?N30c5b45z( z-ZnHSGL@U53WNs(6kLamkJU2&Iwo zqmLpN#Y!u0ni*AY_IgeBnmQA)tQ~yruuIK+9JybC0ZxpV7EXe1%2~E$F{3)ifJ(jN z?5&}EkAnLhwQG1Oi;_2m1;I$wlPOfgR8=#66MYkLOjG$fRP?I zjm_OhU0|j8?1keSuLlg#&!5}Mvn`H40xU?_K79_?3_5c%rqiqAw0;~L`S{7yww3+oM#1eWD?hpa{rJ)Hp7~nnlYg2BEw-IgvpC}dYym9nYVwo6 zGeFfllBCEmPz^1Ixyv>|`A_{z2A$YZo|)dra5$k$Fp?}o_H|J>Omfh7n8VXxr}?iA zf8SK;VH941lK1^u^X&^#DM5nO>_2H^j)&{Uy2S;R78|%)KM{K<^jP#JrKpUhjo0bA zYeziNj69&Zj^KLdbe+eOgruQd*da#WY;~>xxuVghepyjZ{<}C6PLcf0cU^|lG=Hj> z=D++a*Q!ssW~GkxLwVNl11y>f8ti;`Tf2vZ-O7=@mIxtdAVkiXEi$wEYAvFZKa;6( zy9rw5Vr{mvPMbl!C~KA>e>Q~U{Qjv{Xp_$Q%$M#zj`SUMriVC9n|A6WDEqT@vROt!U}l4!x( z?z`R0L+q9~Bx_TGrQ$g>icaPEpRC8}oLNQ2#nDiT&d9IGwQMiGo)jjzMPA1qf)Rb+ zfK%GQKX>-fQ7ztZG(I!MV}}AkK6<=N?Il;&3iU~vVb(kI*?wF05sB!LKrNIKXu_&Z z3PX+d&#o!xDkY8AnB}=}{!Hmz@BR;tnp9ecx$l+wIY?}?Shza}(4QBh@bIxv4&Y2Q z-pla=r(FH7v z&C?j@8zFGqBeK!W*RxTfPjn^r8%UE*CexoMpFqs;Ip`6w%aNgI6I(Bu>F&byt$ zhgK?~Zglle9!&U-m*ak%E1`+wjKm#5a5y120GlsApdszh%TGMuh;f>*$V0VU9w1ZN-yjdkBzIUjQn7fm7;&Y~H;L(Loo2qt5 zv!P@}D_1yBf58Xj@bJo82Rc(a=1DVTbQxJ?glJs`Je)_d(CD?a`)_E42_G3yq&Zkn zhlF{Du4Y;*1F+8~)af(AKP!B|u;Co5?&jL|6d7Kv|HS}2-B)0Iw5lRjF~b3u#!ek( z8PuHa?coz$-~Vd)+LT8DHC<#bdBGV$C7NXJqwGWfCk&NuN-X7L_ zFd+ew5i@2nVXg8r)5H}KBc(N%IiO4+m1GMoU(MkB-vBT`*A#~AV5?N>(vPuJ+60c!?%-XUD9_enA(*9~r&_6TGWJ55+;_;}HYw<+@ zVooC2ftD7|7TJzv?l$WegotopdL4I#|I(OBjH4%rX>AgQxf6xxqjXPbIT6_Ry&bk! z-TdBx5>|XD|5IaP38=55BvXK_m(Ocwl zQ(tp>uaJ6e#4jc?MDZ;kHlwI)lFK)P{tE+6zGv6`;%u_cTglG8!q(`2GZnkat|U;r z`WgxN&FekDpWCMc=;Y63fkf&HF6eeff0#njON-4EMS7k>Oob>U<(j(0!~3CwN|(2s z61DRS@J$3h3fZMgKKM(R1qxNCN$EZi*I`Up5lgT5LsJm4%2T9x2rGU~iasvoptvic zoki?OCXHT76dqTEdNaI(Ez!1$AhXKieC+1R!)E!ZM&AoWc?%)Cj;zP7VE z->cNPvFn2i44MlV2>lnMDzaT-L~QNC<ucD;})Atgq(IN*K*0Obf-7{ z%J}P3tcjJC5N$$ASspQnc#D8}V^dD8Th*q6{=>GsLpeRI2atgX_#t7HplQIvFT-P- z_&YLsFFd^}+|)0t2KZsim|n??uO~9D+>q8**Z?@HZM8yQLgTUBwAmIJjL) zoKiw1!Mqx$_CBy$S<;NqH;*Q^;$u-hk&-9l3Z3U@aB*3L`!fQepTsgB?IVy zAG*0Zx&UaCDtqM)a86z7BfO3uLa1oFS1>)?hdQQQx<;20Pj4RXo7=pOR}4Kh>{$IV zqPzZN=rfH}Lq$y_g6phSiu{K>z8#z6e+&*tSh~IK?>6m^2uN1BC0VIenm3r2a)r`R zn5HxQMX~$^&DD8ljlL%VV^FDNZKjOt)j;V=L%vobiTtIE<_!-noLVQvgW z$LWU0t*V=B%Ir_WB)Fz{@6M%K%SW($o0NIga~5dF)1nJq8tGf`mqtniQCH0dvAAyz zo>nV^PT?Oba>|@s1HHP5xI*i=7OEO&fh+xd8eYfjBLCiE72Yz1nbH{UO3msbiW6Y| zme76;onXv>wRMt^H^-E0_!dk-$a<9_VUH1F>CH7xF%jZ7G2QnWT07MWq^s)sZpCA8 zGvu1Z&PNkD47gdZYq>hKRWk@$HU&L`uDab;3W5FyVKpav$wY5=9%CK3Er8==aOF${ z<-gGSt|pA!^!Jg{C<1YDuQ6!Grk0f^yAcb;m)<~VOJpM*c!yGrmpW&R=b;q%x+cF|JBX`)v8GUQzF9N2QpGj^3siP_;&_RhCF!>+k%&!sWZ?Ew}tG1?CKjBRE3 z2I*3r*-z)}4JWOX4ueb@Wh+|w{>M?qvTgBaBP&&oa+{@$)qdk)i8UY9g_u%rWj#wo zVTz1{9}#6&4AvF__?5HMZySTrb|CSY$z!H=yKW!kxoUjGR6T?EDeLCavVdPQ;qJAI zGJkqObCu`UsUuy@xHtZFa2wTD?abbF7W-_?0VhTO>;>D&1m5T=$sV51HC<{SA}1!Fxok$n2ldpW2hR5Y z)9S@NrKa^8OV_wV3{=+E&B;41_|{p+;)KodoZG(bHqk|_udg=5pRerI7@$sC??#6p zpDrM5VQ=?ZYxNS;=VQ{YB!$hqo`XZbV0ZVfslNAEd?&HgygDlP&GPtLQS3kX#8Yh2 zwWa3clpot#u22b|efl2P$+dGlqtho1ScbGWb1j=*u8iH>=+FK} zxb74A`!NY6O`eSlycMtaIy0=X{qmLV1CVt}e~|;ZJK*;j^6%9VKDB4+7=fB=2I0jj zmW$Vfi@)ttwpLA6C-*NhWh9%9NL0g&ie=biXW+YhyVpppiSLaH(N_7#AG<=2sAshd zS&a9C+zj(Vf{whztKKmo=u_tIU->tz<&W^+YTq(0VT=Z<*Oj*i;!aSyD41`S;D=nQ zpQ50n3?`S)`f_%GDF%j?WC;(``vZK}qfF}ePZ8DcfiG~>HA{C3o7r1CI=A$cYsphP zj?9TxERp}(9QbdGG!s@-Mn4Jpb85HJ(hXig3s?PCIh^WtJYw$4FEN*gK3K{i{mE)*D`Av*|JpgObZuhQ*;5-U(S4u! zP%4yYm!^2UQ9liTCg!6v%++96>a?qVtNFpg^}EXvuIiWP|M$+n<9$|5&z_X`z6ut7fX!g|bjEln1PX!A zIg-t&b_%7eFfs2nMz^b~Tu3Ca1xPQ4sgR4KrfZI{av__<u zB_z8{`mW5`R66c^Bg3v5N;Cd<)SB4xr~MlW01)gsY+ zgMiqQjTJrl*z`YJS6>d1W^)ZJdqj@IJ?JMbhMy|#k6p9@VQ^G3Wu|jUCnSHXpS`V0 z6kyr$gs}bvqYm+S@RD3wod*M?)L5qs1Flw3;#klGc2587nqNIck#h5k_nE3i*C*{B zqg6&I$R<&f&e}OOjut@-!y^U+5A(+|Fxdd;N{GTn$h&spC=l$z=#j$4A+Cm^#wU-* z@W@-ECGe-3QjmpEUl!U{75XL_Oa0yM+RIS6QW>GYz)oynXTKSSjt*T8Sz_WV%4l@l zVNn3Ki7!HQR@nZJt;PN~>oU7y<8iVN}l(Gc1S!!l@9!Kp_s;eDX zaai0=_V)k-(mJIbb?OAwh^iw=3#e5&oDOOUQ=5f=5PzISlL5x>r2Ix5Q-< zj5nZIW`Nn?K_(UD4uA|(hE9kQW6yIf*9L(ZnaxGc!gftbO7FS$e69ENIqDXJ4Pm_F@88Wy1D$&hi%>xhwk1(Rsb789=&WugmqCS`h z-dsnf*ae6##BL^`QP|qkbQAb~7QIj`1dtEzFxnpAMg=@K^)J}iy%l@$9d-%L_S~Uj z#jrV z>?`iHI5C(^QoDDWr@dT55|LOI|4Q8ps)m_KRRmJ`w>M1sQFJ4vk`1UXTvB-3T#8$Q zs^opywI7O{-uxDeLi5dyr_rSt$r3%ZJNTTFF>8qI2^8G&?J^e)-<~{s=XgH0qXXLV z1`+Qlq&Gucnt%&JNlP+}2(c@Qr)kkaM-OxbuVPW;68ZS=@>zN4X%eKE*UJ_`@ddI&eLmP`IEgs|u}m>4jGAdO|t z9O5aDHm#~{F`_e<(OFkJ7afnUqc>M@2+xl^lK=zGz0Qc3L0O!Fg>eHE3+Tvhev!E{ zyvtFAPIu<@CfA8%+~Ui`gXLsYlal+V@aV6&>s0}0LOERES@7)?T>5o$B( z?$2w-tA=7O8q2RoEF+nW?qV(C$m)x$=U^j1FYby$#V*cyx1?46w;na>7>O3ZfVF$r zC9b4bte{b58+RN}nK#y~UgmCMYG~L**D9t0^PoVU8TcyiI|ad_10wIJQH~%DMx;b- zT_32ZY6>zHg&W`2A7;WH#K$gza580BMgBD=^;--TcjT}ed9n(%Y2E=>z*dv@O(C`l zpd#D6VAsZv(d3V%k&c{AlUc>M22ACpqh_M@DZzuUPNL=g6+;pv$G@jh^aVBlV!j3p z?ezS6ADEw7b&pt~QBQ&b3oAip{){sYU*-wP>J7cs0-Gv0swsvryfHhgnF8TX23z^N z@|y3Z`|c5^$!pB6UI8SlEtkp@B^Z6=tG;<4YbBN*Gw^l&`IB}%(YnW z$gj6|(xC0M!9eS?<%e+0wP7BVj72_Iy=wx6w(V?V4xEdrDH@fhHB`ApN%+PZM%30` zx7P$z@Uyuuwcra$Y7g@tKZKJ5k8a;gX|eC^5POLjUS82!J_644j#@OlOS<}Rs9B?9 z;I}dSHnXqF|78uTcvFI@5Ge)@+wYM~38S*;2`(3l7O|$D65N?#z6^nG7)*yfo@ip{ zy-gAI@g^vwfEk^{#E7pFq^RA{5PDP&rms6z6vlX#INk zPj}LvekNN|OoIE;{^vibtP!pjI?kWmtpuz%CCLNvU)1D>@J4T;r2dgB%c03;;rG}5 zMyEzop@Nb_KWn@iVg1nNAo6xMyx{_L;f3tO>$HfyIuzfS45>>cJ4gsgT`?AkB{0&lTxU$J7utlVMYSbi}= zTj8Qyp3f5+;^|_lTCNjU99h>cl~xL(QvN%)W+uoET_}+_8%{c*u518rfM2u$9}Jsy z$Xao*(M>B_b&-~Dvvz7L)FVW^ODA&+tePzT7iv8J61akns`XoDv6s_ihZzq) zx49Z%C(yV4E)n}E(fk3F9Ho>>lR$?E@xBr3MT8|+Z`uU+Kbz2Jmc*43wa*>1P*btf znSS#I4Nuwi{3kzhYKOsw4uOl+Wv3Ia$reE@!F>O7R2e&5>ZY(UXYd~+rgj^0-tC9P z)WGDiz>1oP8Dz@?);P9a2+nT`KwD;yO(usuiJfF|I~0*?NN}&sXn9sQDW-VeCx$#% zx?werGL&bNmvvW$WfGSSA`CMbie;Br>!gSY zKXm3F@=JkH$B()vESQsOaOYh#QK%bB8RF-2+4K(Uq&#}-j%>wcC-X97yS{vzf_$>N zJdbNe)U9+|6Gp#F$+KKjmVP1%xQF(mJ#D3%(xy}8CAe{#?;^Q?-x=duG}P6|u-+!D zjw}Xca!IpG%Jd6l$a4gj|G@k;1uk8R*z%OQkJw_5uqCi7v{W{_Cd5FGof|PMI;C{# zgg}~LF4TWT= zODJUi5gPrgAStQOFg5)BjtI+HvPF%)Nyc`HRH*tqO}K;ub2zPU42cSU5Onq&qc7U2 z-vvNNXF&0lSwkLM&Z^J7W(d{e@k8W;UajFf31x-|`$M4Y_%z87kNosIh6@3Yt~NyL z=P*`0h&(@dQL>}RnLg!1@Z+X8EM@JFF=+ZO0RciLAo z*`Qh#@77kl;^huEK|y!2FE2_6UPVPV9La}Gl{@^IkQgz1V1{EE1oWNsMm$vSRLQ(h z%ft|s;gTSUt13yFD#F?z-JRO^Y;owkDw&XOP(RaDW*N z+j4B2Oh|+JiP+33T#N# zSl}RH(l!sZx2}UF_%g~=GClQJlNtM4C^uoH85s86Hc=1)Mmn1Mn~i!KAHywnr2`b3 zQ3{S^yLQaTrpIw_Gwf_@yPiV?w%)GpN`#W{o$k8DjwUyw!7y_?A)2^*pUab?MX5%U za4^!60)Gp}mz^t!m`J5jBJOWDL7|7i^bRC{^yIMc5clyvtsJzloGgM4Oql@;V{$N) zF-+!jh-jT&z>+9hKE~zyGHS23)SPyL6wZdV5y*~ZOqZk9KV}cQ2h#t5(l|W`+ zM??KB-@ETvb8@6R1)9NFV^&UTI6%WySHzDVkB=JvTFQjq)R3bpM8p_o{snVa=SWn0 zAU>8Dl||;%Ts_Bpj_}#U+d`YJKu6rt_^iC|hv>1or_PLv#?*gAcV7SghS2kS_A$0>~+3Le)LYrm@t3fvbBX~lF2IAzxCOS?uUjN2JxvS z(<$kitRc^_Zwp|7z|!xfo<~_$+7Q5F9$Kn;xPhqJihSAd1)XjoT%mic%<_FwH!r;Xstv+!P1f_;Lgn<#XZ?(wD|N5$ z*ni+^*9OBo26Af0@K-K#-(4_vhf0a3QUsAY2IZdDIO}rh={A$?`ZUyfDsy;%&`s#3 zU{|K-;EEkfUB>%nUv0-}XsY)7smFS7xwM^Fpp}=U9(d=>_un*!W^Qi;kiK{EXkqPX zXs5IeStr1VS(53&U%uRpRj9mhEn&wTxH2dtc;%oE@}7kOlD$d7YzQ#jyzG+)>!!e7 zeGQu}u!t0wU%VgLA@JRGM{eYS?N$n`UO#t?rfmEotPEQ~M8vtY$}@gfb-pHNUqA5m zglZSt8#cy$XRcsTkg}C$$D_m3hVTzznS$#ZZRvYBb zUi*qI98e8!podJk_pNl{PI6r+IoTx5b&E2YIhMjgF)Pp-xrk3uRDMzFRuCs)ukJrx zhR$h9JdN%jDOmA4I_sw0TQMpD;GI?)9)DU|eeLgL@i?VN-d(=NbgDSfWZbRO|5%@= zMm<)SoebOcqy+>o$lnV!0r|9Z4F>j{{*LGUx}Q2Qtr5Y87B!xKSp;2;g=|RCyYwCP zL)!uF9!;rtLIkxZTgC@ zgbv61-Cqq__|)~!c6da9sqcwUc^(R)-m{hR+r$r5T>mizaFfzRjau&=(MsLk< z8MZgbaB-Jty(Yv$t^B!l#l(BcxC3pi1>1ODPlZ9tLQpX_d@tB5Db!s$40ICrn)q~8 z`&n-yTD0%yu5cbbFz0DZFnL3Pwg-eiPS1Pn`#_UZAieu$uTyBL@G4YPE|*MCw?8)KdnT7@V6A@K)4gpbpcVu=dd6~U2D6jJu5fv*{!tdsNQ`4xQ70;3~UA)QqQw)bsATeFhuiBuJ4IKL^2g0z%n7y3I**A*4bQwj4+ z;`Q{O@eqM3iuO{xPq}k?GC9{@WJQMFHk!7zjS_->|Jkpb{uNTO}r1!-Cli}J-LeT@NeS`Ck+Ixafspi3ge zg?O!yQocJrk2lviS=f>CyPmJlJyJ1pjKr#}aerDq z7}#boN?hcAxd7xE?U@GHX*H6JWeD%|gpNbtr(u5keb}dmW;T7g_9kiZ{u~MhOR{vn zTU4cEef~i&Be$wR;488&Pk_Uq=BPi%_9*6_Ojg#E;=@)f{Ovv+&Y^>k=!DimyGt-G z#ZBS5B$bKjj*>w~9EYh~i4z)IG`gq#{W94=me%;(I0$MDA`H!Jm2D6iiu7|(Aun-ZDO^>QVe!_+T{}+e zp}$JE;b|!vh8I;88zb@ahP~5}5Xv`4g*>X=PA2_-4$=^F{x$ZdR9|X?0 zDV<{maOp)4Y%Xe=c0@vfiNZBCvFx}^MimX3uEcR@t?Fz0!bEXpx zQ}M`U*?by%4$DM2SUF=tP~AmgCAduRh<7c>#Sm3-!$$x$FgH9cPca4OG6Ok_O_9gX zbH%fk9cV+}BT1&wGTkvF)AWl4Q3a8xQmaO(T}#khL@Dr;wIGR~9D~^(lNtsqsIe0! z>FsXv;*QP4Mv7$Bc60#ET;$^B*~-*6)vEP%R=@`hCra=e!Gbd%mayg|R$yCRm*mp` zUr{)pxmpfdBdp}d-Z`97w;0BsiR5ogE~!cq*-%Q#5q=2arZmcV24snnb^lN!U`^_yHuR*`(?#MQ$x7P^xG zmq^p^AJJ`;n5ogEuJeISX(As-3xRv9ioDQ+gG`_b5hcD0>}7sfiku;&D@17gWe7MC zo8ki9tzldL|EL^e)l}3)F-kZN%kFV(={@B2h*XkEaFvtY3)Ob?DXvqhyj5&9Pf4W7 zDk6o$Ekx197Nzgm7H5T=3)SAkNL~RA=`Crld{4Of9BE+H#Ww7{SheucGcbR5lQo1r zk#dSU=7Q9V=8qGdOv1OUu4ZFKV^_3Ru96sC(PN#9k7U_(>P9aQ70@6fhD4iZdWP`1Q(F`(I;RD%Dq}FC;ptkpI>W>#c?I6zwQHelAkO9_j1S5#9$HcT~@pw6{jX z5-L$gDrT>GL*oxV)|3ccaj`+mNo}EF!V9TFW(J4FEI5F38Kolbx{x%8r+>GlBt{}w zCQMG*u+^jv5VkSUMOexkG4PLkJki{boG5Kf5D6i0R9sPNk&$ue^e%cez9T~J)Lf3u z6{O~Uqhe6eB8%K=Q9}?uoB=FTz|tFsprVXJVWh&8K%!{_aQwt@>qN&M6kZ^asi%=7 zl{@if?WJ;m1%Cy~J#s@>xjHoc%)|2{VoX&mLU^?`K|-}+Lp#a>FGE7Alt2hCS^|L$~zYl+`GDrbfdW~o73PQR*uOT8$yuTbRh~Q?gNXrztcIJC_^I&$J?fj`U=-JNSi>vu(zshTVxZ;gFnDe_K224PjEj$$Xa^Sxq zmI`(&ThCZd{u9M@?mA)jN+q@*SdcX^FJ6kQeNd0zU(y_P^J;*Vu0}h1U*FzFf`|)S zKXW+6#O3r2F@sp6MuXXp${{uvVRP6+-_&Oe46WH0 z-c+)XLJR%)*7#G9iGzm@>_Nm?Lx^P9@ziqUr>cmN=?$VopHg_A-AJDa$a>6LYc5~9 zC)GP~1Y{E4;PN?1oWJ7^SGg-sS_v^YvSWK`^y?Gt-**z^-zAma+wi#9*E`yZ0n(&E zO)cbxc@2$yMBM%0cHnz^6eYVP^UH82LKF=d^1$P~7}FS!E|;LQ}BK)#I>Vx!zPgN5+Cw51%^&9skXyoRT3&$l>|5~PSFFq5Se za^MiLqZre9u>upMEY+m=%P!!Gp%2DYfpv4C35=A7+4iTPHf1`LiM_L#KK{&v^(g1d&E2o!|EJb@JHh!T|JsT zUkySGmyhDsf|!?_EIoQt3P=2CKJ~pMTZ;?lfchy!S_7=2twHQND!z}!%y1gEtH$iO~uTW{15n5Py#G!I3y!>KGw&-O)l^|y)PD9tan%zr zysuL<-o84)t*IiuMS@TWZ!4?DfHf|hVM1+@UAEgneah}wu>cDnlKwTL;ftoFS^g`X zbW;7)a7d3g=M1vvyg;lpTjxZ{I!BI#%uX{I`=7Qay(~UG?a6yE@-94aXt!TXT|a|b zEKmzyGdfixkFcP4FU7Q;{(O;-Ak7BIsgbvqe}RH~KfS3r9oU zI%GX!og}KPg}NAPI>N2U0pi_+VLE?$kH}s8jwwk#b5s`#!$&!B#~naCd;!J~#vnlg z2R@239#4Zs2*_r&zw8?2GL(h<<XZ2{o9onz|v^T6i^1?7PXjrdvubWR*BnjaPI_k39^0{BUBird`=eAl+}+e0s5y z6%Wb?igD-xbI7qMerXczW9pW*ir|KH=^RW`{pvHZQS?5dt05|5&kaHbiw^}FmBIYT z?a_)H+v<|*-+fnczyfJS{McB{!Fb&?U>57&!5kl4C)+RL^4A(Xs#u((L@0%$;jQn; z%F_wzknU-vT|+br)gay5Lw;O5Bke3#F7=GvAv8pNw7Q}BNvR=^Wm$m;06O@46zTs~MQJNk@E`8Yy3+SB@W??SgY(Qzp8$a?z%hWOw`v6AI@6^-fG zEna;jZo5Qwf2h-VXz=g?rvv@B&T_0MzrMmj&M*bF9+xWQ!u#RmYQBt0%xU}@ZS+dN zXr;WJ6$<0~-FB^G`CTYA+O(Ycvr?5->O3z z))zx(kSP7apy`jgUCD&$rvIVto_{<6;>M1zZQHiJdu!XaZQHhO+qP}nwr}sgy{1iy zJWbl9Y0^Joewk!GGxK`0Cm6_|E{Yc-8!sD84t_0D8$Bz$d&ytA*XajGwn`lh0ns2& zFX3tb~Q1dxeH2E~i(gP^2nfSt0~#g`}3fOD2-np;#D zJ6d*)rbk7k2*VwQH8JX{LsFh3dO5=S+=4?@;BKmPV^Ja$oB{V5su56+NbS5~C&US@ z(%WTty*mAgPg}nmTSI9!cnsqiQ^y3>sO@hw(yi9dg+(^JWecYVMoir6M^bz$4_Dhw1JMlBeXCOppnVtGpT zeGr~q*`eESI7Ec2Tp>vrO~yR?S>Fs`*GG?F|ab!kEKbRhw9 zL}`4)`z1q9SoT7YwU|jvm4c5!2yjrTE}}7MG|J93FK3qZZSoDHn_;&W&z^+p%smRr zk(WGGd=t#6s+NZ{HZ!#ArgH5WtUK2uFg_KugrOFit=CY0@w#jxGv8^7uICrC=WLKC zMaw}vkrC}OaN53WCn<;Letc;+rY0oxSz@J0sby&z=J%2Gq=~UWdpoGYQ=Vv^>YKIW zt5s{am)E@;afY#cK8mx%oei^3X|-10)s#$a)yJZpN8UUF-yVnYIwAx`hvTcWhBqAw|W_OQ5?~TrL!&r=REE~Pp_rnb2?I((iJLo+DCGMH(kBfnl>y>9MGePn0?9pxu_>w0Z zCL8M!5#UJh75AigQ>vg=ljZ2b0GaUc^|kVyc=*8A|Ehs}pUOXyp8B?@>~-95rLib9 zLT!6%WKoewuMY^H%{eR~>u@9H{5r*N8~MoMEtP%hVMAsF6LAE4IN|GArEbBWq5Ppr zpdw1jdwuI&aPdtmnsRc0WPv6N02PBCCf<7J@Y~?o3p<25=FEg`mk+6ttGUgX_KR*Y zUX9=t_~vjM{9!H;Lzhk-N-t|6-Vfob)vWTb_YHpwf#%rh|+zD^{1`EbGin< zlEr(*1n{({W3kZ7dK&S!mQi4ox$L;1Zz3rp#>MFh^h~kXf6*o0*TQhn<1)4Gw!?tg z=%nu%0ls4d2mTI!DMKIy{1@)uj#JcM{ssOoa|@>{q_RtW)a82TCC}7^eD^iY_b>fs zI6v}?WkoH2DFLDwRt&elRTGkY@%j{v;VOGh7f~69SXE$Fjr{nQrgxh$Yjmk^4TBKLK z(E+s@wIDX?;9ZY&>y4-~ZF;}oYnSURnV)rWnhIB|6pq4oYcd*C()^%bOsCMFW}!YntPE|vm5%GKaK&TQrjlz3BpbvX9> zYnV{y@KG=9c8e#L!?M0QFk`ccwmqWBkBM(xISk?A*;HIm3Pzb(7!m1i5c;IVm=`UwtZ8YO_!OdSQOaetbJh`e;^xF5~& zU>X)@U18hl`#|M;PmEV;1ZWgO7HG~(aaP8WZj_niarW?Bh1!2O*OBx(Kn07EXe@6tt^;VHU} zZFR)OWoib^=|h-hT?22LWeZ_xTm9g{TWBCLiDO@WNzJ8M`#XBKv1?v;3k6VlEu{Gn z2PIU4F;?I3{SaXQK1~((?>n_e_ZADKt71BU+nSA*ljk}%EOMLeV4(laX?CFt{-JTx zex`7yZsD$}2?9Rn-V)_eKP`M*cy=eGnRb_XMHL~}ts3i>x`7&o_-9dSsJ?p!HCxI3 z@vMlVzg{>l1f0jx+wHx3v85pm!@g)kK-I*cB>meW`yW}>5mFO(-;`T1<~~x$rT=1* z0MK*Ws7#;ln2E_S*S2W>SL(L2xohV-%lX~veVQ-+F9w;fx4yF;yF;(HG22G)rC_D< z_Au1tQEGeNZFZwu8CQ;QyPNJ4*XlB)fw}8?G9-`YwE@lgVqMaviz47*c5XpTEkMHN7>0yDq`Bg~U8r+#g!agT-} zSe0xa05_H=X-GVRGrJTd^IJ6Nqt;vMZ=tD8t5x64k}F>n!R5zq;s%BzUV@;i@DG~v zNrgo`dv@)1!+!|VAjJ|fWFDE4yVo>AD``qht1Hi2ivCBn&u~fnf^EL_h7Q(1%}Qg% z$4Kjxa zqC@gi&nt183rD_%J-);4!tvOOd7KSFmN;jVY0p>EeCR1;O`?=h;hQ(YAxVbv_uA;gL=SeU zgB!$1DQPLyP%L&z3@7X`M=xQ{MSmTKoSqm%4v;K4#-v1F zn<0`6ljg^~{!|;KBET?c@hzu`nq09$VD$;pqZR#K$qyvZoUvSMF+zmB=I*@IVn#ePpm!HhTnBm6}yk8;En08zOKW#a&hhO*u_uN0Ct1 zSBn6)RxKaXjb6zjm0^iUT|&6j)|$OrWBFoU!VW>#JhYp3?>a&2nQrD4{s)H+yt7}h zewBZ)^+aRGQt(7ey7MlX0r-lx+Qq1edqS>cUy0-Na?4jC4ax! zV-hR!)WY|6x^K*;hnu^8H@OJ5ghfia>d{-l=NRXwe@hu;|jdiMeeTg$1i3 zxH@ajFPA!K*vL7#gEIU+IW=L;F1TMdCm1&Cz%aeJjrx}HK6L7l#~r=P6q_9-I_hx; zxhLos_Y0gj=`tJ}Cky5u6E-oXAK?K0S}wg$D#Q$Z<9zpG&krYtfZgkU`p+|t`dl3s z2D0Mt_m-X5o5F>D?ydUVyGbzi{GdNH!&j=;;m4c=R`ZsozdMKC>?=2c7e1U*9A1jV zeHRw;+~*GYcB}JR??hnKs-b@$H|y11o{?V!_p9bcLOeNY=b6`SH=AD~tjM9K9;kHt z&!=j9E!}GMAuQEza-b;k- z6`cEkx_A?10J5V03*>06JRJ?trTPn|Q08e3zE-}C(r`>7(JO1E~RAQ*I2x1$emMbI0|Oq<6@soU{mo{CpAkAu}=AHo-)zZwq9V>AmJXA+sS zJ>?(5W$Iv{--YKbV3H02@yG%0q*yUCrF6zWf%ogWX0fJD!rn^_?TKA{^_Q+sf4gbw zNRU4x>As{Du%n`Yw5&_vrlQE^&z$Km&zY1`72(Md=5UmL+PvgmPlGzH9^j>u12W?%evn0r3Th}Wd##jld&=C`*9EtppxRvdj?U9r{g+0u^OEeBd4P7zFg{!Yg)yhe&f^G$;jo-m( zfMZo2U=Yi3#E6amRs^v)hfs3>2d~m|gAJLQc#Oc&ky^-7e=02f?#|A%F{OG3E6s{X zztqHU#m0oX=9Y*o2^&io!mj;=uJCa`)XPMe^vE9Z5U^V&tHTO8vcy?qf^}A}T@-!t zO5H<|uBya-7tbW;L9eTTh)!?IfxN(HZrVc>gIi&(c;|!yyF5HiM>hZ_L&%X#fN_F^ z!lLu^7=0{r!HC*M3jxoL>+!G@udbtz^mo^MzJHA!Uxu^m1qnD^O3TS!oFvBn!Du-H-!|!!k zDJ#=hj#%lb%5OG1<#Jaj=qK?26~(10r!%)dI0z;WX?i6~7=Tn9R*!YVH`swhnk!@{ z|pN%!9ai!}d7z~XSb=!*ZZX~no4Uvs7ZH?(5Gf1?#E{tK;GT2=Qy(27<69j(~hQ~!@vWS0D|x?)Fe zQ+xk^(-pgi+dF&y(TZLDWB;M9_`jkR|NQ;?|G%vGpI7i-bw$O)s^ES;>eo~xVv$g2 zDJj>_s$zKJHtQMj|ZzwXdgB zokRjZdh`$0N4Z|Ji&S^5sT;*iQ@{eu-{}kok$k~7n!0T?#-j=Y{9oxbThwbce%LRv z+Nq6aL-yo(=z3kPR@FEPYNOOj^kS`qdNr&6(4GBp=7{9@8&0OX>;c{kep{{1^#K(p zd2??bPv`xTEL6nb%bw>qk*o{uxL?mFi`+RefQFs*!u8d5Xd5~KtoqHzL91baZU625 z6IaJQM)sbK(&_V`RWuW&piniBfh&r`AWx%+tdMOriww&sXfSMYEQXH)hfg=n1E0Vy zj-^0{I`d`m;4(~tXq^2Bb@gQMwvE^#FD|Xf0(z{iU|D7?W9Q+iPHYPosRG>{}}EyNysnO{qux(UkmnVIIu z-xjA?hH{p~Dc{7KhPl4hm)N1SNnJ;hJxW(bG-YX(XEu##lsU3hL0}}AO!i--$zeFr zre=O^lqN};cbizMMa@?EZV(7lXE|oy04sxJpLt2kVzct^yyD*Jh;6S+r;MHIq~Hpy z^sILn&6pptt;)J>a$NH&ME8hl6YKekstR8iEW*&i0>Ez9l+T5}2@?M~xSG(YI6ir6cnL8*{cO+P9 z%j!jtUi;XL)o>l{2M8Th@8on?#^&sNPaKIW>a5FJ`~#fT6maue`{-0JNSdZM>Ys{1 zMQW<1Cggmdr#Zu=sHa&%2|pcuYMp9LS(<)}^i|*+^7Cq8NH|Li0z@5~twE`*<>Bpp zF|)#}?B5P^uDqY@8$=E@X=`HDfOhwyn>E<8J!olKj{Y2X-}cbQB6{~lUI&|+op8v{ z`pLTxFm+()ZjucPm2D?M;6>Y(OXQQ;2r!F z_slgx8F2PyfFfRyPs+vHAnE3S;bV$pCOybjcT06Rzwq7{CIl6cqM9=SjN^~_O zno$R5s}d8TeoeE$!1}DZo{?ZjahVS<2X?*?H^gs9Sj|tT&w-Sq#<{cF^v63crQ&q$ zUQN(YG;02;H7nN~2h5YWtHfuG?toB+vq~n<$KBzf3FBr?Pe5Dqbk)SsB1%uFe!^$K zvtOWliDT|GCP(CdDeWd}D1>l8+VAfkGLcTtPi@tSBgg1V@41!5EW6sgwB(kAkB!wY zzL(cCI%2^dj8RO>!z50FF>O9&ZJp|BcJ#A2^B04ZTeY*e7XQ@r_4AMz z+sqg!57rN)rd{r@N;hK?*rX4EhCkoutw76rW$t~en_R0i^-aqU*^dv0Y=j+pAgq2bCp+9^{u`_?#G z#+R;^w955Ln)(`F*=zCHt7(1$APO9UJK6a=3 zZG>RZ1xUI$yLPsVkwzPkPBzsmypA<9(!qDkd63JU2Z>rE_uv?Kd|S0*gfh<|)}HV7 zO6Au0nQ(5us=dICXEDQ)wIPX(+cTBR-iYBze>@% zlA!-NPg#2@6-+@+Qgf%Wwvr+;?nqsmIHeky*1Z9W*II=X*eLefnlUeNZgLmLYJ{() zJZ{fScn5LcFzk?0?${CwqQ2$HO0%=+@DUvNv5=V%HHPACAw33m4E~xiKU>P0#UF9{ z_Zi}r6(qS^CohLH$IOaoWnu3l^t!Li`vL+zxd8Alz#Y?j7mxb3NkO-XOFg;E=8(R1 z51=R~pWrr%{KZAWAVA$HyDp46#pHNgLS5x0xm&2Q;D5$?3BruMLG6T%tfr{e3K5o96e1NC8E@DaeGVt=~smo?!DY^j^8<`7vH zoU-AtDdsD29^g1(weUfAL#Y+vp+%8G>Iq5nvB81j?hcjCA%`iVnBfXtB6@mZ#4uq& zzG;FaZdll%&wc4J72#Vq;jN1)`7nXwUx63fD&vgKl6x*WXA$bp&Ql)lL859a_o+*i zA@Neip%`j^dZz0DMd#k;-{um+;l>?M;WE#u%3$efni+60A!wpum#J(P1*kM|^mKqf z5%9WnJm`>?3$^U!v|Jar3NVrGf96-;2opXR27Wi~$8cS;(65{bcyLu2=9DUL50pa{ zn^BG8wxqfd4i5tjrkIq?6coV7WGvBi0Y~vF&9p1$vS4ivBfM~F$mFr0bS5ncmoSZZ z4T}*l4MeQ)jg^RTSF^^;^k-hSf@up=v$O?f@$TjDF}|?CPY)n}kJMN8|9CdJeRA2x zO1M#p8A*2}!Srxh4{AlT-pe$(sdUL+4<e~Z%^v1H;BGnowbk}&HxiU~s3 z*yr-6{s?PC#~b_9gur%xim*bzvTHvJLZ?mueGh&04CGQx`JE|_4zOV34JB>$bp73F zjv48af}Rp!!o&BG9Ng(6dBw`+DoOYm(+h4P97!dp5_uL$Z{#9@6GbaOA>bZvFQnVZKISsB?Y^x1Ut`-w15r6m`M)?X^~{AU^^bX0I1ACAPp(O&S@fd$tX`u z?BXG=WZVeJ`9$L@P|s(|3N>I!*=r48#a2!~gqe?m4K2)_=|Wk@E@TIWotMg!*Fu5p z&g~B@gqciwF^vP6iiPvE zb#uB8OB_pf!oQABRSR$ARIV3sNUajZ#K=n3RQ*6M<+Co8X(|VnhGkSL?E``hN)$hM zL0#^GMHeaz3?vm;%Yg0B@&C%yO7}{`D&Y4F%MM9T2YgnPeihSdS;9*MgK(i(U*{@3 z70z>4&=Xg*DOUI#!K`!VH8vs%2USUKmlQ-Nu|TIcon&oos>hmWdt+x)qXqhnmd24d z#Ylv-Qv0ow*{4|ZC4;9hgO;>U`IcRX^UblenX#0*MT|}p5T=BGu171qn0l=?s?}4EW!FX7tVUcT!b?eZs_tuNA+nL zxQV%aQaW^Rhf-CCp-p6bRn_Qwr!J83xI>T1m&>;B>79PM9o_-g|{|0lGY4SJeaOpv{aqJ+0 z5NW^6B+?|eqp*DF3WS4>ou|ZYp0Y8F$+X9fcgL=>)(MaMY^PMW^s%T7;~}O!f-KbT z*s(4Yx`vj;Eeg0P?;Grv+bO}-sW_|dkf~WZf>X0_N3jW&=6$#7lDg7z z0gisn#z-sATuEsUZ*5_LNd?6u5w)r70?1Uz>7Xv+G#xLC3{ac9zBSp7sEA*5J%Tms zZzFHDx~N*DX?C)|bl1dd2fy9qQ%)s_lV?m{>nKb`!V9+w^A>J=cfivYGCq~V+IoG$ z+9^y95H9Bhr$r`w8Pm!{YOi}}bQft+c?i0t#cLaq&w#f8!+d!6mrM$dHm+pv*17z*|(>>RJ7a?bkrjOOC%^KTm+JNthDXyzr{5xB_ zj~yvD`O-nN?$(9wrt;EFv8N7!iKQ`WXWdy%1&<6pd=E8cO+!T{liNyg|BiQa`**=y zG}m2#NrO_@iy8PhR)&L8do$s~2Qk;GAFEl!KpwP*k#0YXk%gC<+~uICjj|jQf0#Ap z{co7hT^@&1@|vlgYU7JD;SV<*K|oyB2$Uy7Bjav^GBuU!L7P~qWizlfWjv+QUNul9 z89>ovY|LvCQ#&1_(S7jq@6V!mdv^guRr@9hL^LizIBiEHD+CUGN3;z^pUUhY-eQfd zN#b{BV;K(vydcXCQL=km1|TMR=qSyP)HdrX`#EyiuYGV~l}}-7I`JhBKCTF0TMs6Y zT5O&i9y_eov-|=(HL#flFP&LHDhG={Xt8w$(Xk|mDY88 zJS7&tucRtH-NS zqb~ZWuh)V~2J&jht~Otrf4Fito_xA5Pfj}ndIpxjNg=MDMr>2z?jX^2KOD6En4kZ% zB}PCmI46A-k>EHFs<(c24O4*8EQ-50^N1if{c+lkji#1lzl}9s9hoh@x-=+1;&6QC zST90Wkif4Js=EXJfc@T&)xW^ZF9>;$Wt%RRS)+J@zwxoG{wt1~^3u8h$6D%Ky_R=$tyi}d?s?SL;r!ZBnM&l%9B!-Id^vqF_NI}> zYyZkeLo{a63ZRz0O7bGsUpTk-{FpzW!}cgJUi}aDmAi)Dcr`2KL|gyfB^bf+Z}?5= z+9Qqr5LWBsa{N#Pf<>pl4U^g%g$(C|Y)1w2U6i*vyuBA%!RN_Q{`q#7-;`#$fAyO9 zZyaK8S5)KL;WU`^d~Y{!F8X}=`twTn3HqpRVq+|1>u$X~DBbkW5h@ldNbi^O83uH( zPWBvaXitM9wkGcHP&oD62y9|(n^m$m@7~sfIvt+6#TM>{#3YYAk~S6YyZHAGzrgRF z=l3M^55Dz{QZDWjb&`=@Xc^FT09_|HY-Zm#wpNem{ENj)n0!#VZBF2AzE=A5T+ zo`3^}FaZauML8|dliQ>PFUcd13DNrZ*6U05L9tT@slGSW^Om{s-JvROVU49;iI6;m zZ{BkUpj7JLH-}1C$)2)T6~vGV4{y$es0t6nioYB~ncm?--em?9#_O@d)KC=@F6Lj~ z?8zl;e+^Q%kFu{TW-m@ zGomOMu)XfH8XJ8YJA7V)y$3YX7Z0S^n_Q;0ryfARp#M4(uhQth^!UU$^NKw)IDZc=r$@G^Ec<$z)=c_4r?s8eq_~bmvgib64V#o>Y&TAQXHusg=5z;^+Iq)u6J?tl(lfR0;d1B zDN>4hqmiE)y3YEoN|h#eo>`8gtZd78UUwM!TSe9RF#MQqf{KsMbKdT+VKogfxm*`BWK z4Fp@}5Cgv<&DZl`D^0Vg;qwTQ>@0*VI^@G49zQ-21TM^45=0;Jvp zhNfY4J36JdG1;-^f}@tH8bPEquDwYdj+u@_bmm4harK3~yl6B90SRXX%9tF?519@w z^cV$*2Wr$i1c49DnIw`E24)0e@)qkdl){mXo*EoQwNg4X*s=%&JL)BFI4W@^ajd2K z_<9y`O7(?4~Lz6N?BHw5#X)e#})b1FDH>?G3Sa z91IF8Mw*nupQD9}BIgpM(?jQ+Zk{MSMR8f*W{aXX*zccZs%88jx1mF_!=E<{Ax|om z<3vnHh{Tt~pA5WQ4dsH0?OC)nro%mn4Y4$dd=Ow2d`ud`jp8AKxFecd)(o=#M1TW% zn3jZESjXR*jD%w{Y@r(b1TIRH$6sn^(z&BiXM&xFSC3GDV=xRx?gywHA<#F4{!<^Y zK#Zd(!?{I4J4hKrMyl_OnVX7d5fTVRr`bx-#?37kIXBat1V#)aO%My$uu6Y{u=#oD zgm@bw?%L53WNBj*#KVlVYq#;Nsid2KKUcNJpSmn^TYL{RT+!217Rav}h7W~zc5R}G z<7dG_VoF>xw=BzWxD_Yesq}&(C?@lyNKK0n3(1#kLef^E7GHE#G$Pw^X9W*6nRdk9 zSo_Zjw^`SR`MjxxPHE$4ETz$!{;AzC*rbhqUi|yo2rt4rdYx0_uPepbr#yiOw&>5H zvZW$82qIBO3EmVV2>Jp!xI|>=k7I!4O{Xs+(l$ zY9m?Hlb0d#mqZ}BGGo$YDH-7(5fsEfvUL8tTF&2Ya-{$*Nv^{f?JQO5qHQQyjRRkK z+*xW!*LESgLga-9XD1{HUm+Ri9AqSnz(7hqVwFC+^VUtKU>yN46+Ikdm^Rdo58u!O3{DJt;; zwlz$x$6TGbtC(f2ToNp>GEpxifUqN(3h{kr&*{ZcY4|S8AT;o&}tT#PlQZx{#&}Z-PttBD^ua1b8Tk4(yxf@3pS;Z}8nC*{^A*xvn zHM&e%fOlYr*^rgr8B6%pU?2#Hm?RL-A`fwepF`r8bVoq{meP? zEGHKyRBP7gd_6PfBlitMcJA?I5vM5qSXGIPOY`$NMgkUhE*2gw>qZ$%W61;@_Va||jq+o%%= zTsY7~h7clRh`;e$EQA;H`5lP+KI*B_coJhqt#{5e5jYGc zM0yL(N7OCI`#AUFj$qiI&!j^vzw`C3sY5+Ii51>xnK@cXBt{iHj(EdLjex^T!r6s- z0I!*_hd@$;&q2~6qnE^#n9R-?NaiRIYQX-IP7unwdX{{ZidlJyFW^0FnEA?yBK*WU zJED^S|5!4u3+D4iV|oJuJ{vQHyz?GLXO8_8@q$&gHD&06i(j=GXQR)ngDdI$*o0je zI3uVxi1_65n|Y9Gy{AFs!4IG?CioAc>=_L8Czm~R((+V*{7O2A8gVBR_UG)4yM;SZ zG`kYPJAxI)>ux215(y2!2+s^t9Q*|(qIu*^J6&`8%kQz>A)PtWQF_eW@a=9(;j`~B z0PqJ80Q5Q_Scug|lR&SCCzwQ3ZrwQyLRzzw8_AP@3(D-hosYuR)7}XVzdH!;3$7Cg zKChBxx-DQqjINk6kgD0Wq7w^c$Xkfg4$??C(}{InBot|djn^y0d-zK?vu02kh2WC+ zVul7|sO|H2Ty-!F=XD)4S;~y{@MTSIe9o{K6O3I9yDTkBW)2pRAU#}9WBv&PT_Nk= zB^JtS7B<yfkP)9kxTY-IbIK zhkXx*ZBxI8uaw71uE`a2Y8ZPZyoMO6ZjcFy1Ugg7X<^w@UJ7h(McHSFj9&ZCkigD| zh=5VSvL$o7W<&r}xTFHQ!_`9MGf!lYuZeNpL%txRG&rK;Jw?Kfb#W#1{2@dsDs=kA zIYl?Ir#PHuKTI?unStL!p`=vN$k?kOK{YY$nN9U{)%;sHU7>*>lAU8JDfOnyP{g0@ zi>U1pP2CQyM7c?%_9{fY(4AJN<#Su~4T0IH$>W?Vc@rf$H&K~5rj5y9qfV~kuDu-Z zf{lL9Jti?dlC`mpuTn-&1u`z=ES^DfO28gnIrXyAom9CD(ZW8@K#^V}%4|gG(@;R0 zv+y>hQ=ucyrBjfPz%hZPG_T;yiQUnkpzEUJyDgF4*yCU;P{OpmF;r2$&XTC0@zFRX ztiowe(DQ(URCIdbj!ZZ@IIJE}S}`}1!Fe1yMr(N`T;XxcnaAe5`PWRdt$E`nVFD3Z zAe@e&pt6pk-s+!rB$r|)Sc0li%AXf(=0;GO;$j-lF4V>GDCWu)S}swxP8Bi=BO3Wj z?@`RrAa*Vo=D>dJC>RDypiIp_#)H}Oth|8&<4sPkQ7taSK}7894K_{ zA_G+}N*uBaNqHz1`Ch)f-(8be*-Ne=@*1PEA*vk|BP5X9!*f)uEQ_ETxC>8g!2(n? zueVANYJbYj8X!YZi9Hts@*zSaZ89 zlI2}kOT%xLGES&j2V+G$h4~G^{%)$0q!AR}z&6_`LF5n)1_oVuw({ua?Y#sI&(z%L zkd!ntP`JpRQ4P(|p#vH6_RS89KGDOfgu;*upF%T{jN%*EVVo?h2=pbYPUB3Lh_>d) zVfzgPq;}(k5!6wsio}gYY;#|G2mJ$NtgK}BNELDlkx9g`;mb@m}d;64uI_&zEes&j<*A_!aRRxoVz*d(oZRGQ0`eUC!7H6Qed7++r zSMzmColZL;@~Sj4xA1b633w5e-FN_rB3)D?p*#JPs|iD_E32+Ta6F+np3Gotq7P{5 z>#ltW*M(g}k`BXEar{bw#04`#TalT)CVw`?*(7>=wP~{C?SkZ!*d?|9F!8y_=bK0v zpRT&PY0ih>4MYw_$P{A$g+lyE(@qQ{x}2x`!s!bZ5YE%ouT{IKZLxAA^2TK=Ox^|| zk}K3yU-cEvtt6uHiv!c`e;Z@r1q(cw5`wS>2%x7Gk6(Z=xP(A2wm1-4~%J%uxl9MA3>{cW&aLhgQ9Yn z!Ro_lxEO~0y(0j}(N_0ufgICJM>0LW)mhAz2qs-(`>=(LI$rXhY$~9Bh3@A0NsD;*#5y z$wVk+Lix;_1Z$JLM%%Gh?WMh6p*wG@v|0N1k~^xXOC=swyk{m$$Aq<92f%I$Av*G^ zDe%`AM9YR8g#mqgX~Nf(E7Rvh=rF{{ot@=U7mJJ6@M-Aad%As6>ipFV2cip~VUxff zjNuZBP|`d)7aFE+JCVd7Ip_EfKF?n?h7zJA-=h(K5t(K*{F648IrufEQYF;!ol-uN zju4{5J#~0{!%S8SuN7eK@clHb<)>9z_RejsISaw6LuEA#<9thiu|V?F-6ACt%?i8$ zq1b46yv2QY#Y&~LPYZArK4M&asO`FWc-~4#IM(u3&tkt9N?lxwsXd^o4;pnM#f_R&DqFyXk4`ER6Ck7GBCFK zw4|GoH&Ni$%Hae3f34Jlh}G%%kTulG-FX&8X;K z7n;>+%hawjRgn>s2)aXy#l`4b15ba-yLX){hk!2#;p3 z5=*I0%whdR4;BPYFY0wO_~kwAwGd@8fRi|valyoy26*gq^x>_6upFlHp?|pSu(u{u zb1-1;w@%2$XsyO0?2q+z7p=4gOwTt#{wQzB)*~Su6DPJ|4KDVbW62|kP-UuRZJDja zj)Qlgx1!s&c0M0iI*gWIP*&*`-8)a@-=Dxc;8}tI*cO7H9zl$`F<1BQjr;R35U^j( zfY}YxZ< z?iiZlV#P;Aie$cB6@JOI!GS9)*waJ8k`J=SM*bVS3KjQ17BiS&1#dl`0~PY1WKX%V za~aR9+s_)}ZHWb9JAzvZ379G$UmO)sGNI|1>xs{Rir^)Xm9S!mKirO&TqPsNQvzSWd5&_VN09$k=4Bg@!*Ik~aMzBEzn45y zG9`E6KzPtef6#C)Xi==t#fe6C7k2tHF{&Ll~-^N111AKPP!P z44B+}V}L=if58oJ&bZ7t@_tl68P=J7$Vd}xBF+)a+Q( zs<6Ki&!v;}zL(9qEjJneAumoi-_<#N>ieM0KAba~GYcq?YBd@ndqV!TmlELG+wK}P z&N{O!mqqxd*zx>6{FTEQBhr;8EoO4?$3?4FKAL^2SmHX9{*L`XzWl+BC*DOi-apGrQyZq;&?QQ82}1p00N0ZcNuP&6$~>6_tP{8JPM1=LWO4;bQl4T!y%n| zDMKn5k1gTsZJd@#X5 zfUUih5<}9_)Ds*!SfSfiB|NkTP(T@n-VlIH;?@X>b&*&Q3ZZqR0R@ys1{pSVR}leG z9%`+ityV)Q^b&h?|!a!^W z<_jbhGANgXoe1h6g`$D-nLwAJ$l@CtGNj=dkxFVsW2A|w&S^BA`HkQ7>%4Tysc7HyxLm7SurpDH<8&YE@P_SFI~P289nE zFtB9;XpIJ+N_6<~TYlO4f`y*G6z7M3a{fjqhJNIs?Vpx~rXZ)0A^O>&6SkY(8`%le zBBW=0sBC*l2~g*}b`q;vsx#sX<4?K)M^qmT=QzkGMj(Vj4G#(N9g#tFA=Y#yLc~(9 za6(yG4mo(dZE_xq_$+G)WXAv4y>p;~#vJnb5(|zytnns6K!_nm15lJ17#47fOIipW zNX2TNfdppBWDUYQbxQIEyzYeYh7xe23vKIY8ux~+vWb~$S|Y$JUAk$&(E59kL13u# z)7*jSp@trVxCDzHHHwVvuOAmAC22EA=Nu1#lQdGZF3VNkYlzH;hA24eMeR;lR560Y z+6uweeu`!Jt8yWrwDivkK@A~h3I1s)XKhDznWFDn-EO@r9VFh`oAR4B*}bzZyQPBH zdV|qj{3IMscfj`_sZ@aIqx%ab z&q)%m5Y1PJg2yK2`mq21AY=~avk%4q1Zw$35kmL?Vvfffa-r>Sw&6m5nr5JQ$`qbC)CNPbH4skgZmHo<*Y-uF@qOxT8B|+k{*@x`DS;qgNe@_@Ber~b zp@%;FArQSVEM)Wjp-HSQi>*Y(rn51Ejh+++Q{4#TU~N$ADwH`vNKUOK zs)GxP-PT|uxt0Ruak6?URGmf32Fi1uA*0e$42DA+CN5PS%7PhguuY(q}A@>LBfq3OfqXbg6)d%M@-(P!=Ss zMz-BbRpDZm5ZUOgJ-pW^ZK4ICg!MT{*l341z&#ogRAp5JsRMTE0G+L&5v(vu0mN_$ zEbIV`{$WE|0+?5~MxdP$kY$vfaIM*PcVL6lWnt;*M8$^7vG&#D>0ICf1*%e&vEWs&dPg0+BL=fGI zf^5E|W9(S(8|AJhW}`-1;FX??z)=05TfkFUFgCY&&DMwvD^xwnV zhN8MBJim+iUX;dN%Wf6Q%_}W^C|Pp3pqkf_eV56qr(RK`4`ES55A5)(wve62QQ0?? zdQMfF^?WWx{@&ckG|<0s98p z(F%5vhwv!Jj~Smy9AFqJS_3{BpmCM~>RjQ`7H^bI5IkLy!A(lM*7|8iX)Ro@iIY$j zlCPZ~z0ltZ;*Jo-O%Jg^Ys|#mFbNQD%q`v0VenuC6pg1ooD8B?PpQ`V;fR~%A=teLg@D|k30giejuq$#-aI0?-5+L6+Y|s^kqOyD zRT{zMoJ3&&@1a}1Ql!A-6<&r-TXW4KV6of+Y|+a_ z9cU4v9)6J3{h_aUQ?SVz3W;49Bph(~zx%40!((b1c>?_SN-WT035q zFP>Sg@!>cL75EV%9bjDNwaDr@BM&_!8>QUHjYv5npgCS7Msnf-mf{BTlCU6NMyBF0 zt)lZ$-bl&f6Ivq`tRw`n)%alKId&sM)tDg00UowT)_@*@nU-jc+18bo)rH^0(I8P+ z976^qS&Ypn;-1sto+oakNV4MEdEqK%;Cr1<G#w0tMA{s^%zV+Nl){>T7Tz2e1 ztB_(Bj%B8-W7&ZYel%RweBKL^83z%gAI=NIA>}gi6Y*`;Y&Xya3KteGTs)(aV zdSpzN&s0q%Iws*0{gT`{rg)fRh>W3bjnQVxPc5+pVRZjxye(fvP(e>Xf+VD-=N%-& z;o54tX4UYNU(TjH-5;}!;CMvKZg_=7X;f=~rOaU-R+Z#QSW^qt%0fk+CWWPJ?B-)y zlcI^HlaZw16`2?W0#IDcKLv%iJfM&Xr(`bL0*2;6DjaGdSk}m8IhEgn(WZOyCHK4{ z?Nv;rQOt_P79+{re1i`1p4gQ3X71)~enB?+mf zjP~gZslfmiDGy{L5(%ksC5s)dm0D%#MwCnv`2ECES4&be+25)9S@80vG-gbfGol)^@Q2{OD##-q>mXHGJhoapV zWJ1*mOM4ikna|GQ&fW_5z;3$nxOf+n| zae*B?DiYvDBCf{8xa@MYB|6$94L6lu)GaYbpq-pNYu=w436maOcXq11&MADu{63_r){s7q-U`A-n3Ab=!7GjE2Y>IW5a)oI&slgF& zY3}am9tdCs`vTe~7srC3=^g*>YtEXyh*<*vYMISy12=Flw$va(?G6DZi~QN?C8M!9 zq!%08#mO)ca~v3-@iR8#Z^72;iV`Abuf>7xL32oVobH4?dzAGb3!|prFY`q|h-C5iuB>M`>cNV^p&0jd3P(GBl1|`>9_R z&n3=E@lpM;A?M*uDpi{#a+^J345Qv7S+EazO(8m?4o0#Ds$JGE0+3r#+@VwVtL zKUhIz#e3M~obvx&HV-a)Qqn`8h|jX1P|LL{a0*W!6~BtMtpPOgU?+A)Gb3jPWmm>! zC$Ub+MNN8LaP&5Cqn}#9vT&ny23hoiL;~wbOzPj+d{pl1ns`|1_ca z_m#)>X{ULB*S9LPxtq5+kq`8p{@Q7^i-8Gc>omwjYqK(C`QLi^WWY9`?{u)1cEedW zTr0FuzjcIgonokO~v=j(PeH=lzOYUMbVKY5@7YwgTVXd6017x|lG$cK~mhNrra zcVFQ;`2{UEkYDE7BJsMNa^Ly^yL-U7Uy5Io>m`FN_p!^k1qnLP?kRxtB;l^MiaxjCKD($FuxyeR zwp0Ii9^UErZM&@6HQ*-Lw=+BIbW@BP*r%s;f&ryypXaq7xwxacqdWQy4&>-b`?VYU zzO$gWxB8h!_u*nQyAST1bNkLdIwASOE6g>T2d=i~D~Mw|6Sp;e?|Y>maK8_*r!#TA zRc=^(W~|anY&)Mj?=R_#20eAYkA@ZeZs${`MHb2Zh zb;97=zFT*G>>qHt3qMl!zSK+oqxU{Tx4a@vKJwRTK^Fg^4}6v`23$fHAT%4GU9X(yOF7lwp-6{|>|JhRS3+Eo9iDzRfh z8m0IZZPKnPVYXfS7NXTtY!6z6dl#-xu34A5G>UTLSC)8(hB8bTapItTTL#T&S8?RR zJ$>S>9QI;Zv0fGTm27bCXPluqyDSa3p=i~sM{cExFfi((vpvTq44H4mQ=uDcWbHWh zRLrk`7q2_qxap5%8T&Sy*{tW~KbQ7iY2D*g;l8i8-EMNX#g{LOdNP0BJ9h6?X-Z!_ z3jV0%#+hHX-8#AZ>0`-qXGZ!YjU z0WHJ%;`=Z@$?Pf+KGrVt%RaUo>JLDs0@F=5*joFqq|91G3?mrR6Yu{)9u;gTCgswT zib(W~9P+>e-QsRX=ad5r$`5Y@?JC?nq^zv@w4$!N&9-bxzNnH!a5mZ&oKmR(g*=i- zB@`Cu^hP~rim}jD-TVMUgaL()mj z(DilPvVP1KL@RHjP+AnhEN;c=2E~tBcSj_OHyg|Rbzn0?eGva)36(V1;BeP#tVjp5 ze6_0r%~b7M9JvY<&?hsFYp>g$eT-jBDOOV}=6wBY#zr0P(Lsy--LPH3jCB&poZ*xh z$YL)hm`Z)ylk!ekE&J2jWVIE#Gm>NbIHCH`TJh<0hh{X|Zpn?*;c=G?jwq$g_4GoE zT~4>bn>3YmT7ivD`90S_>*=DUYpjXTioJX>g=!Ehj5g8>Iw<-S4F;Schj;NToo^3=Zd4$?q zY8V|YI;wc3Qsc>@c0^IJP=|3Wp`0w`uQ%RpP;&n>l!&BO9~b(tbCJUs^(aTW8%j%2 zhdUdoS{F7FBB~^bW8@>{_{hmf@IO_&n)&=#$~l>8k}1?843!nH7*TIqm9tXTUB`h~jG5XzXMU0d$>Z@ci<`Pt4TEUUdhSYBFY3<*r^wFK6eXT7#HXVK+Cr=$Qe(i3 z3(6`e&V#m$Ss@~g$b8vR4R&;4`EqBqMmn0|VUe84#N!DE^viF`C{3u74MeZzGS@9K zH<|A;HXf4f^&1TqbdJIU1Un6DvqeT^yDY0v%2RIld2198{UGM zon@Nzk|GjQ_VQ!H37WBx#GK?c>j=>w>hPoSvKNhP%D1b=)ryFlpG;NS#m|8Zn)qSg z?qbPTxK)jsEK^kGIGCFeLeN`Qoux|g3do&S7NibcsYtho(6FBAk`I01Gg*32x{i^O ztWa%^+`7i&F*d2hxh!VoI@_aaEm|5~DrP=g%vI`*eksLiTE)6D)}}R!YaQENBn#Da zVojWC-R(S`I8({VXRA?t3>4iM+u=wvaE7fCCn<)NMWKrE};PaXcOOAx_Y(LsE%Tkwk!CdB7MVe5!Ntj}KIn8N92)fk4 zbaWxB=0DkHK?P^Go!*L^T$yS!5G%M=Ku#f&%j-iZ|8~KEX<%vXO0R?pmt+v0*gk2M zv6Q-pw1Qk*g3o+0Sp$HI|gVD`gQaRO*=8)SjI&GdHH=GnHnb z4;AfIFN)7vw^Tp0{hypS+3Ej06Vz}F6XL$ce9BoN*}|jFARdD~=oB9s!$D28X93+` zTHDUO>YG)?xOL@-{)>YSCbE)QifkXlItz7>fT4Q(n^D#sLKuJ z^f~v&u{}`^^3pV#2GLt>M9Q~Bx~%3-)%UVj*L|!P=j=KMqVZ~ZT(gA+((0qV_M#7a zu6tzO>LZKYlAas5sq`qZ-`&n^_xq{ijqAl5vT^56o45I%d#zQ5V&U}`Z?K!i7T`E;)JSmH(_C#Xb_GDwKGLXkV57ON zuXqXp?<~UFt@Mu&pL;?Z;A^8La1^|ozEC2ui0N?=*0RRa902v7!NN^Luft!vs zTiD^Cz-A5~MtnG|BEyLoCqiUou_D4n3lBo$2(6?^iXBTL2X+KlZgMi6|0tNVuDZoQdH~m z>`$K=9WTzC)97ZuTqj4Zn)zzz#bvc(UL966t>m1#3I_B!3M#~PWefnG0P=CY!1&SLyYl>Nut6mRPXXJre zV{Q*G|9K(j#~^fWd8b!_ z?zzU_M;3Zk+G-b$h1zSu;S^eY(Ipt3bnmGb;fypgXBA){<_Mr%{N)zXf1j17l89tA zg;;g+9og7&Ov=dIhAGlkVuTYCCM0~6(MK1HGvX+qWikdv;dLewc4Lt6y_X%9+HuI; zWje+=oQE12gd1i088)Dc3NrbZjeQ21+Jjf&IpuY3`dOoZ0HzlwY*IOSrkFmRWfqW@ zvR5g2F`k%artbOq9foq|_+yn(&1GS#r!uxDXG4zv#87Q2%G4xa1{NA6jx~zt<$l(I zN9ma6Es7M4I&vkOaeT&CDT-Kvx*mGGE;%V*T9PN}QsX`OXkK>4#G|3&hTBz?w8ARr zMfQOR?UE=Ghu@cq(%Y+|_tLi}lt%WHELM;m*srFfeLCNY%{f|PzzMfGrJJQjOp=cj z*TvIJy6GzMU1rj$CxwTu+mXh?2|F-%puU?hn21W;D2qu_BeTMh!Z>Zg7DdaLyARuS zm-~>#KgviW=0z<-DhX-0mvs$Rx*{>4bxl=rx(71^wo= zE(7WCi!Bm7G?*6>i=JR>XE^iSMP^N|mg=VeE9WufVmGdl6hAFB$y5);DnwlKTyler zgZN~<1o}61%UfEicG~JWnB7)~63gDsDZA#j*}cZCy2HQa%z3H;_U7Q_fIA&|kHs|} zE1Dtui>;nEZcA&2*5cb>@p{`$C8`FyjCb+}mR+#pa8Ik(e9;U2e7?xe-uLSh7mhL0 ztv<+ZVTn6lw5tJ9yKGsa8{cPgtb$yz%{%eciLK)iZ1F4{#PH1y83+iSQ zH|P6HIvH+a$uV5{GB>aM$?IdTI}Ww@#i5;LNq@pi)Y+WWJnw;Qb!?$o z0hQIe6C%)Anp20PFm*WK*efM@LLYvVG(xY4X?By_jQj#+IU9zJ ze@_&c6gTHQn?VqB?gCf>AxOWlm@#QHoMI1`W2y<}$57@HjRr4B7@d+-2M$8@2 z+QY<`;me8e3!|;77{O-wPm6u?;r-y0%F3MPkJD2fBiB?WT&@mlL^2kgMn%XwT}dR0 zNTwp-LO$PUl5um~h(b1KxdAcGk9JfLrH~jySH8%18k(XCp@+s-mQ#(w+f)--Nk={f z%#b~!O7R-V$VQS=JRw8{F^jqXPS05^eB*1H9hs*#z*#dSR1?gCLg=?+0dr(9@n$Z4 z*3T}b6K<^&*(9^nHUcIoeg>`_}QNc0QgeA2l&Ti$h zb)e#~Aw_0Q^$8lK#LGmDx{qrM`<^;+W#6AqyULhgGzd9QJa`Gsx}p)v6SUr z59lxbkxiqVTCLfpY8ku#2C<8jVQh+Y+t|$}?Np!z?bQBRAOQX@xLn&^;y^OoBSrLf zK7>e-li|RS&B)-VQ5#x#^2od6O~S zU{ZZfn&UQyWJ;Wl^qNS!ODRbwswWoEy!fnYf>j&R0UohSn__BJZ%A7ovWc#* z=-_I?*Rj3dDu2}7Z#Y_0_s zmQ|#~;^U%rV;Qw9U@sZptX8dJGVUo-Wd$7KteAeRD=suML_tKBSB^He?bn35)a9KM zyt_PYm{HffU}+Ek!86qGN9u9UgzzR;f1cHTNP zY@37^jY;~=RF*AJXY<2m!HH3TM)RZ}x}x!_IhSl5q^BQU67h+6)R_HP|4PlpD`Q#E zT_ccYGwE5Nn)=jbKAD(>&1gpwn8#%n_L)Qq)z%z)FgqkK8`(04w26(APXo2H1No}Q zVw*QQwOUwJ+|mUPc%+4{wF?C-zz~I#&16<8xckNG(0y0I(UU7kx8qgPe(10uPXi_K zn-XZ7Tz35bQ*rxX5@;wvO=N17Qs(Tn#ZPyOg+RM-4w1#?t<3w(>ZCZs@2P90K8w0V zcVu35DDfHFMxUst_iy$<)aRDm)6I-*J8$#vPPdAi1Q+D5om*mxqc^n?W^}}+o3xxt zRDL3?Eyv9ptfT{qtQc``l6j`^nD=oAlZ}op}a9`F=uc&CV_hJ=uHUqVt})6{u_ zr-{AzXqQKfu|{fZ6^wsJM0oLM{|JlVh=Db;hOdM@UQ<8qC`7<^kaD(mSE!5xcRs>3 za)RZ2ci46BIEg<8C~>8BRa1nBs7nljgFS?4Vr+9qr4^NZD@hrkzF$8SjW|ms%YB5++F)3q@CyPOblLFW}R&|SS>0lgVmva}5(uHmuSB`zD zeSC>bGG~1<^=(_$dU;4M`o~{)W>o7IT_Kd6tP{&AbtoeMs=XTPlb9O16TZx1E$W3MkhT8>!b(DbuT27mI ze-Zj@pO}Q0D4+59Hwh}E$kCyhS)3@CeD)cgUYTCyRvxdxTE+L2u$OEqg#j4B3@4X$ z0VPHFIAuy0fiC5Wxfz~?mXb2Mmoyl86~|dN>ZQw*R3iy~ciD8vSx9cTqMoQpkOiZq z)?{*;Y8t7aE$E36*+@`yZ;ps|Q`m@S)^554lPY!w~o86hCjH;*A7LPyKr6VT}VL6a=L}j^{sTt=Tf|{xyIBQF( zd==V?xVUdzHKh{=JoV_8?fG`ew?T`lmt00@G4`VeVF@c>3Dyv;dtgk~P^C>8t<^e* z1NnoSI%d5_k=f^yel}zjS*jOmjC2};%o?6qYMEN9eN1{G>BFN1$*Gr^qk%K3&AKn) zz!v?=ANz7)q%*LV#+?cHs!7_0t3;E!>88#YePIbuCW)F^Xp&$#Uy=5hSh`SF_;vb; zs#&G4jDQLoz=>^ysgDS6hUadL$DgOUt=wvS$Lg@17g;3#YOS$@u?b4C8Ht)1s$cL3 zLpjEsKuV_O7sl(ZPEyk2T%8!ovu?~2(%=xLo=aDY!KKS-kHH)He z8zLyEw?!BPu=0-2V~YgIf!cV8m_tZZ7^dywxMRzuLi)8B6ODNKrl$(7x*Dj!I<~e+ zC?M;xR|P!1EP~z%YvS3O0c3K# z%e=YDurwO66RW<&La$EyunOn56R`mrAgCgjup6>Ubr)|f)RWh?J+r#CUK+N^#fubt zv|ZbbWfy0St7)Cee@UjnUZ$jTYljP&m21bQU&~KPS;BGXg=u9@Q(Bu9377JiiNU(K z%^A4L+mNwmrRGYXK8msu?8B{=fawOAMHIAmI;OW*d_g5&C%aV&Jh(banDrY2c6`Tm zoW-E_D5(j6#%QYhH(iOgp16f4(73rN?5WcK34Nl9#)&GM>6j?3l*BiDw*0A(5Hc`( z1%$qc!OEIMb;`949LlTtTWO4977KJitdv>{#$w98-Q>vR8;X1@mN1;R{l$}kC(6sI zy+3Pbr7FZB+7{F{%nh1idYrVL=NxM2flYiwX+yG_Hm2)VhEm+3f*Wh4J13Yt$Gz*Q z*HyK=9KGu|yOEljrb=T`8_csyx|N(R_o|DM z49>VLFsJIZX-mfxyS2`{!3rI(p}WOpRil`DtKFwBYuu@##h`3KvIOeBiCDRa+Ri-e z$}Lyzas1hEIkAk#s5 z&sX{^h|Io33C>}h$3{8Mo}8NtT{OzbY&7X&Vmv<$ZM_}Ydcs<)Ud(@H%flw~tv0y7 zFR*Jki@*cCP+^SEM6AJRT!@RAllf+tzss67&CVU?gn?Gq0-ezH$g?(A$(fqEUWul# z36cgVviVC;2|UeSqMi+mhOaiNfXkL;jo51JN#g3kqFco-{nQZ*rrAhyUwnK^T}H<2 zidoct9Q}rJqawb%nAMw{5G~ZU)T=i;*q)2jDygAT*2DwOwoC92oV z@FIr2S;Q#%+ScncuZEH#O*iap%;*QUU_C_kYsclxcYq9SAj`arlFSkf(l&XLgX-L} zr`Zhz6%rJi$;%VjMlnD7#$PmZjx0v%q^-G`(>7D5{?Q zop5-N)xFI?RIcbr#+*!CyhGZcjc+3qy?(~qmE>;>9=aq4+!5Swu4hbr=c%RC!S)-F z1^3#Ut<2~**#@WGH+sYL8-~z`p`#02?K;q_TG*gU7gt@{H)q%x`hCAvtB%S#+zc(_=;GaP?Avo{?%@)4H|>)! zN~-;S;N)DKvc_D5xYOW{M3B7V-#ZnQ?;!zmr@9a`ho806yz zIj8;Qv(4=8IP64fxleY~9v_J61UZJ*uE*}8ahl{IhTP^Y>YXIK{9dBjqu9jBj?kU+ zy58Wg`1TTB=!C4{=q<=%?$Dg~?}Dq^ukP284#(di^x`gh|25Am%%fU;_yi2IMT_`3 znbeiH%-xCSAox1$maiW@?$(aB)i+QrT$39tj0PoN-VC9XTBrJ^?$zk-nd@?157jU3 z?pO{>H3!4EE9mha-88!|uH~BUw2i&~p9|dN0ne=8STg3~;yfbmF7JKHk;RI6?CHCe zp*QlL|9^b{Kh}&-*HRz;#lOxPi0ORXYK^70K415N+m-EYvri7q1;ylq*TIvk_pl|V zlmqZL2oTU1VPG^6+9C`D3ob0Uh~Yzs5g`hcSkdA`hX^ljWayBi!4)Ad9z6I_B1MV= z8zR(bktIum7){Qkd9voj4x1Kk;;Hl4F_1lT=A`+v+0kY(R}N!}6Q)z3P+yYV+0tf2 zq#a2rR9SIr!mm?P-c%^ItJSkR8`fNLbK}#MT1%>R>viPPxookD1=|v3-=<3K)+J1K zX-};~g(}9VQ?N^>k&gx)RuyefnS-VJEgFL(RhMr^jUJ1YuFAZ430{s1_jBQq9wDP# z8#;FXX_F~a@9l`U>RrtfVGl35HtJ&4iWeUTUfb%^ynS=KhK)OO*V(MkzL3(rd&lor zUswjq-8|{?P5gW)_+jC%$4)-%#P}jrhveV3G5?eL!|to4j1$binLI0wI0l0Y zut5kvBXF;mDBO=ang)PK!wp}EAtfpBQ!k14%*)NY@G1(iwuQjZ;KkEEDzPdQyX#NC zfl#dQHtu|DXhq>RtE?arfn<@lBZH)`zPFT&Fs>NMW30E+9D7p2gvdf`LMT0=N zbg4!%d)z1qtWw12JdVm7?IAS5Q;_imL{u0UDE6VgvHyN=QZlfu-eOn)-Y+ABNjOg_F! zgNZunoQ$y7FHSJGiZTcoVOEH$Am9sj8L@(}csum2peer47lC?fLV(#M9H8~ZD-ihC z&xhv4m)}Aaw&(&R;6xAKibk*)0fEExYElfH1r8`|g_E{0t~dqNGGcA+l7*}0%F+HkuK8$e)0l`cZzA|g#(ETd<>L&n;)DxYykTyw7vO>C$ERM`W{qS63+0soWp-ngD;>=91+yhJS}o`0iVG35KAvpc7{2NC{gFH=dEF837{z3erZNaj13R zg_o+8p#bU)z^G!OCc1a!Xtd>Z#ceZ|FubFn(|_b~tyNfGu2KKAEVgYkZ!9-$t$Y-7 zfc>U^;%Zj6=y$pV?n@COjGmF48kiFhB-O;9v!>N40{u!GuxJ0|#_Bz1|TCgc^(j6PDnGI+S4z zWzd5jifD(U`7MWrFvQLZa0fL=f_NdM!6X{sIM|Uein$UJlk~#C2!ZZdW(<&Wcyc78 zJfjnvP}&n86;%es)Aswmhe@k}lRgbhIu?nb{ua0(Op@H5fy>P=>lJ zatx63UA`jdwe-?3ioO%0MP$H+999IBH)YTg*Z~6{NSGRVt%sjycSf$?-5B^`Cw}?xslhKhaIA&IkPP|GL$v zJS)~Pxq`8W{?nZuKMq}P@tXzL8cRrn!_hafpgdy<*IHO)t)Bhzm3PXBE3S5KN;bh~ ziR82<%-OGbmB<>_FzO*|O#xx^&zogF^udv-uo~KSbgXzY#MhrkS+( zvf|0I(In9()2=MSagLKrS;q?N7Po!xb`$i<^Q1HY+Wm5v>(r`)^t7d|IPOWxT%Hl( zL(dzA={4_s!Q%GzrE|wi`mv~f;R6m>cpkp`sA(CO8a^Qu$*Xyt<7DPMx z)2}@BiQ@o$ox5EnaCF&wJl~tNY6{iVG=@oE`_QL9xXK-&-dzs&xA$F;ve!NA^?rZc zTLkIOb4u?|oOIO4IGkvb!%DI2I;_wrF;Kxet0TDP%NCHsyhNcs>w~@sv^7e5q%+eU zwM#h-jHKjx7rs&fYEl7p(Z1I+n%?Px2ZOgmST1WsHtw(G>0tH0NSKM8xo zOiaBEv_zd^k2!Qej6)*{8Mp%sL}b|?J)%Y8a4*r@#a(O@CPaW8V~AUz0%9aaEa1NV zb31$!Mf6jF4L|{Ydc6*e!Gr>V;(0Z-yE#$>!_3n+8ss!V0!4A$#BnUgQaeX<0uzExUV&TSAvb8@o|cGVWu^ zF`<&u!9$S}ojnw|{P8e*WVA->Nmlc|jbj1kipGZs$ViNwNNWHx(3fN62$Sr@gyApZ zxh0dsA?0!%^GY;wG&0Dsw+)=e&r6;{S_nfbOS3#nEUcYXE2J=JOSilML@=ZqjFU%)%5+PNk(YNEj`sn72FtQuP8a@B>u!1Sl;O zFR0S2k-2wyN#cO54t)p+HJn!JvQN#uC~DJLJr{r)D-Q^*Q5rJNLrEJDAMrU8fNNG$ z9o4ra(+B`kK&`)}%?i;qmnl@t`O$hLK4I%mJd3n;6sS>u>Bl9kjhcDI4LPnJYNh~l&uJiHN5GBj+U*B88x5H z^i=XRP+B@Wix?|yluX+*$BpE~&6=xv>dbwbP*z=5h9%WDDVVmg0EC3kBG9xvkX2x@ zv0PIlZoNqft#A&UC@-EP6GfC%iEI(xOIef9FrchX8099otQu&AOEGwx zXMIbEX~MJ8tQ#^>@iax81+`KX&rckoobtQ&D^KBU96aEIfW@i3X}w^DE3T=pnGhV4 zY0{^)8n}6b^9!!Pw)+7t%a?>D(V+ zr>E7<|1j9hsGX$4?ZCG?N>&obyyM7oztU=gSNU{B1uX1WQbP1(>{e; zP%F=U)tWpQT%ePK^HQQQEMS6~T9=IAompGLg|sqEN;vyd^HNxeDH7v6fMm?MV@1uQ zsVIxNf_ID*{~=kz+PXNpN8NK5_LY}|xdX$QLAC!_jR?5p~H5cDWTyMVt%ZR-1xGxf(L=vJMuS z|15Y~BY2dQY+j^<;Fp}^GYHePrLO7tzm1(mTBNVGExUomVW}Np9?m_;Jmj^p*t7y- z+yS4ojNuGYKg{*WnfqG=#$Li5f&CNBF2=^6!s4WiU{RhOoed*$%@`ZzyZD`C*s}sY z;DYI$UTP~Si&!p$yg7rEV&yWYmuBh=zU=H3C+&#?-J3>KJ6QieBGc9Zp`2K~j7J+d{Q8lS}_S>66~z zw!NSMgJqf{9wbZR!uCAFJxGU1#f@z1zc$0YquCVdU;R=)%Y;XMJS9vp4|FK+^M;_ty z{HK~_Vr?YTpkkfmPVVt@feXg!e4WTn98Ul^=8M4X6$NLEw%0wyn}KHIsu>N1o@M4K zy&|y!-98rxI73N`Rqw1`AhFNZ9lRGV5Qk<9)gH{YzFo>C!Gk7T1QulGZD%U0;M*4I z^41`Tcmgq)ReT|WYxG8A6@)a10xb2{r*ZD*bnEPHHP`M!Ns~;Sg>9@x*qM_E$`0J@ z(a42?7$Sg|K{+28m+?nNZwRQvDcjRl$0zR})9)D_Ne zAKPV{joXZVa`L5Zke2cp#@zp9%e?hpQGY{wR-0*#GkNg=)!IxmWi4}g>-huaDQEBT zMY(n+@OC*pc{44OZqjs4+QAtr4f1mv2VFYYrvQ`Z&(>lv*KmU&TgJ22Ea9mCLqP4? zTIADBW-;6g3r7Wi z(#^a%?}GFoog@F0iK#0*r=M%OzI7KB z%($lcX-4z)M6H*HSb0O%iREFlr&Ze))fRXF&(i@hs~zKh_0?NtwpPZGH}kE+)mvZb zosx4_C4-esl6+Z&o^xeugI!{uN`;q$cm6F<-DAkG606tv%zuz$Q#k&-AB#uO?jtpm zr{s=4D3P~EE_b9P$0?@*t+qKr#gT}o{m#LK`{FH||Fgn*^AZ8SKRKy zLDyIIO|N{&`_kB+B0H%6E4zP9Rde}V`LBxLN!C0crf$eA;cR7l^HzP zph3ku8ZTDtnDGRPFUsh6v{)-69+Vv=q2%SVAR|dEOVX?vsv;R27eZy3@`a3*3s$&r zskp%vQjdrx?kw5k4FpXb@^Gl>l%@kBQmoe8B<`y?MqtN&tr#PQSg~l!rVY#WEnI_R ztxE9tvL(U1GWC*Z`R#8^aDoRD27E9_t&?#V|1)lUIPQsw9Y4T*Qql`eJuPYG;F^%Y zk;@YqPz*dX@Jg!~M@N<_ICVypk?ro?k&&tZ3KUk_&TR0?0jEI2Tqv_UAwkPnSb}6 zOnl})fV{~uAbSNG$k-VW7{mluM_u-W7cD?<(a}02O`{^^gcb6X~}AhzpI;&_f1= zpoeC(As5?Q2x%yZ3g4(y(tRtcqF8+ZCN@xVuq8Hx2Tyfmfqco$7Gn`f4#^xJ%#~4- z6-E@%(S=hT$VeClX;2*$TrD!BdSuN7{})aX>*}! zFlv*fI%iZ;eR8FzX=fnV5dsvl=ayQ>*jlT3-Fby)W45Zdr-|&avmmjVMO8x$8D%h) zmDIhdnoF$?#w)ds$z)XsOG3Eqpjt{80A|10pj#0&!Z=4!Ede)$5gcKe?ps}$6c-X# zsIV2L7ZKJMUdQ#D7jOAlHAYn0I{0Uwpo*GAdP726Ky{^Isa3V)oi!e=x{_t)tr?3c z4iLpw$Izlns3xs|mePr1#VxnE|EHQu%KDqCI7Of!Z$-2r-$q1Lsm3>*pyH6CZY)9C zXbdkVu|dYoM`&XiTEy42#?How(%v4d<-%R_0oR2>&KvP{S@x>&Cge3-t6Xx?ie8y* zyA9Ub7>_(Gu_1>Hm#~e}R;Ouy)9Etdb1o)^Wk!7);ctF2ag}$eYOLS|nqA=A za>M;n7bxjhA69Y%>YLx6a)E+ zCTW{hm@3Gz;@PQhIKi9zvNtF20j3~2I+^%Vcpz>CN>Ge?93wz*p^TuQNQ#*fmgF=# zIiUd!(*psb;PMA&5%CK~;zj=!!>_0bpaiubT}Nz}y9OzYYo?0V2!%&27f+| z8RIY6? zC4p)B;AknZ<`Fel1|`Vp0l35^9RxCx_9+pL04&-G^u-zb7zltsbHNSiaJ9qL>@8L} z6{qaN9wgYwR~PHf+`KfNF>$h%xvCZj`6jG|K8IQ6f=w_ZS{-A?5SbjR1-Qb+g`pVW z3ts30L^~2XlQj)x7Fkm%ndr`WYGRL2k=JJaWi5|Hjw`sx1t%?VMJyWWPFl$hm;UKb zSH|s?;8{=Gh{~3(Jg&9MmMLRbBRIkrNY?55f?EvEqOdu?br> ztr;^~SRqpM0)PmUg!Zh6D%>qFVfLEzC@H-{E!eF+9qZzB*|t;Ww<%g)V$x)C25X@VhzFn5Su$5 zW^Ml*irL;?6V`9k7qh}dk{kpKWD&lCsH-~=YH zyyY!7QMQq#=xrOVhi#m;qRdOl*zHGO?$n$*N#4G8H(9n+0!flgYbif_hJ7vq8_^`b zJBs&v-&XHhS5FHk1JN35qeydMi%QG3RChaLBs)P1cav4`%wV|N_@>|~cX%?}Fe8Ul zYvJm0mQRKaHSqRS>@d0>_V5uWr!siAAYco@2r6~WnKG1to1v?w3SW55(2Kt8|CnmZ ze+WwV1F3Ws(Upd2Y4Qo`fm8)7oV%-;nl+li-exuD8g5@a@pWZCXNN)8vt4$Kr&*kM`F z*`*y)t%DW1M-(#QF!Wj-A=+q6TJn9*$~4Uq*nt_IAsQNj;5ic%jX@KT%+bikxLr~l zl>r!h7X3*Am@%8Ay-|PM&pDkR9Kg^voxl`il@8G0(xAu;(Ugu6;grc=1gRT+l|Wo* z0Zv$Cn>7rHC6iSg)#Arg~RipIjffG4Y6IG&y zQDPC)khTO>+>}vud7=VhA$0K?cZgybLRG4bR~m&O8n$8@)?>>p|G~0o;||IMOwCv% zxm6-Qj{P9fB)y0sZd01fpic+}0Td80g`da`;`x2tMHJ%dJ(<%?q<@iGA==mQ1s~;9 zV7$Cv*2SOam763@Bmf%R?7`V}y^Rwl;F(}yIT|3ZnPV81&ofm>qhU`@(&Nh6<2*-U_eNO;RPVWXCSqvp_*Bt)KWsf;uJQs|xFLFQfioldo&oC%Jl39^Y; z3P4RX3*y+y-~-0&<^PxjFA;)twsZIfr@DeCDF(>^_*K(8gKcRlda#S1;!9u{{R8_i*9{orLfi`)POt1 zm7PSIo$;O)Mq#e0V-=dwT*RbpTGy52WwWhVWl_do{$@SiTwf9<{ZWDiXxF$brws_q z=9N$8aGXF!rUoDYLK;eAas=uq;j28(>MW5Xt(GIUOVy+x@Hw9f!j3iqk%thFSLwlN zNS^4qj6vC^uVta!)F-aoo?QlK6seeUR-1pqOkWZwa1!VTC|!b#K>(P6gFfgBDMscj zQygFt*yv!`+{ht5nM87@il|>jd8MTx#~QGXX{zLb3DKb#Q2zyCFE!%WBqF^HV{!Zk z0*ITkDFtxcAv>;_Exn|P-K7N?AUSRfIwIhog-ehP|0sN@;b0nQn)KuroYxOL=!53h zUnrPng&Dl1WK5|PX}(EkJmmV3>6KMdcQ##^&SxX3m*8*!^>IiZ;z1#~K(xh?xOG8? zx>|O0k{GoT868ic?x$6N*smqrkmjV4vY06{DR{jF_S9k`sC&Joddq9~OB$rn1)rgkQG=9N|a9|Z;JZE~1(d1BeklEd{V zifLkxnwd`iz<9l*qeiN-W)HJAtE1^g_h=)^83xgv=-)V?Y|m+GW~FE=)R^kIZYG`u zMNo{6n-HXZTx`>XnZ@zwCuY!*c4DB`lEomLuIB2nxtT%j>a4_>(8|RFULvD1Ec6@! zpYf!_MoS(BmXwHBO=(hX?C{sv{G+>Ks}8N^wyJ5kj+#t0PG&Wxd5Wz; zWB~#Y2PXPXt<7zI!X+2V9w*+d*~MAy4Qs$AmA@XTA}E5zG@zd%E#Wlhqk7}};fx&0 zKp#D$G!oHQl9Xz0-69nwN|`4k%E_88|3PF(EoSNf;ial|IG!^`C!_&L#ZFG=T_uzR z$q;@i?Mh_3q~K4jfbI$`u-&AOO4rW1nTQFmkt$DHj#y3Z>d(#r^ER*ZIMPyCCiY&5vEoGA-ptXNE8#WGRBDIEWi5h^2+7`@+YoY@D(z{6c%k4X|S&CUI+W@2e+{m5^V%y*9gaj;zm)P zvF|We>iovgHC+?Cp=UrkA|ZD!=+HnU+TR=w9tnEyA=7}}*)RQiTOy5A`VfE&gqpN@ zT;EBX8vqj=T*z33a`U}yCC_5ccmz9yle(b@=^zG3EHIk!uFcLQukP*M_G$(LEFMR% z*EL|-3G=Qr9B;0p+1W7{ZeqbYhQ;-9gD8$~lGZYf#ML0*#s;wxbpd#uV?`JdX-t#iA6gGoM^X|Y>vo#+ZfTlEY(A~qt z%%rwz5C^db*={RdluPsxBCAmp5M+peZ+lAZ7F4puzAz+<38;b4%sB+CI641oTBl8`0t}l8r^5d}dLu&~yXS7Yut+PMalIa|q2?_p^5(8^A{^7xN$cpbvGh)YV1zw&f$bRc1<~sAq=%NQ`iiQvtq+hS zF{}>8h>X_}v+~CV|0Xya#9AfjN_4>?7mK8v(l~eW%;f|Dvtc6HK@X6ow$_$XG*9xX zBVSiE;G!eW=5gKFC0(CbKYesD8!s1~NnraF5tNx>w_*(fCTu%YiZ-=hu$4T24^?L| zomAy2GoK8ItURM3KDNm!8wxCvoIwxYVWgG}BmkU@#5^0do;^-szRQ}b7G6o13jA9G z|EZ5IoX^UoZ!hm+#jywf>jr%^MH8;yCbt%?Bw@?l4!(46?XY-((2TXwF8NhUL;)JP z^lz$>K2rF!?lZ(LCbB{#dKR+KMc&JWXaU$j0EG4#4uToD0vCuAta+vB;aPHh@H+N& zT>flbGc#O=|Dqc+Lp0atp~~eRb4e!aNSIokw&MQVjaN2c@&NIy}nzlX~`{tsI>{A3WB&WTAVzjw58D5XQH)*_w ze0?wJ3lwdLsWH8lG1}ea!X?&3BRp>-xCNzwT%-ZEXZy8_1=3r4^9r|bM?Cf7$?j4- zp!~RShPV`iSERXK#Ut>aHN^xe}$s5HV?% zG#Tc{g$p%#_NQ)`t!YZlt>K|Dx86 zP!o>Ds!e34sTv1roAWjeT(l!Q)m0mj>{Y3I!$P$RlImB$e0c)(dDC#=AA~95bo>}H zPR0|BPCiO`va5?qIWKzp^lR6LSF38oTTw6RhO70mT_?44Y0+lIrdF5+wOhG!1D_3& z)^6Fife|^es{;{fGuwDhT zCk@dq{I#xSk2Oyfck#cw?^<1(&@|VYdu_a)+=Bu^DB43#BL=xDkRUIl%8tScDSU2& z?OfSVGYCZz&qJn0@{XVtJQS-p=I%ppD*N(!@4?UvB+IncwxWqY-FAy9|2VaFq_4I4 zu%e4GkAP!uKqLtZk4YxE)1bsqCL(dlDPL$Z#4NSc@-yHpa&fEJ!Xgex^AP$HrPsWo zafUX>43I9|+&U|?xa`catp#KJ55UQke#ZPd}Gww#pG zNjKRfq%YGuG_WA+?6ki37@F z1Q1a&d##k%VvQ}(FXLA1?L4kn+t1KwPZh4s^}fsx+x*zVHq`*{3a-q$_!P9yW=GT2 zK=}GpjU;qgtobWk$R(ET6 z12w#0nQc5c?wi9NMn=;w|^)^+%moBK`juVygpNzz(G^eOV7^ z$Rgi($hVxNIfP>z!%9?S^uPN#FkZsro8jIxH|Uj0T*MpP>Du+1+@z0Lh})UVdIYZW zNzG#iGoHX+#yHzhP;lE>R$3l-!M|iMIjHGj|0;LE1P#c8pt_#J%qGJbcCd&fB+SBK zb&XF`jqI1sINcD*-kJZvs zn_}fmyj2i?VT55wLMg@oP7{p$JDMm*88mIuQ%LV}+aS@VNg)1nm7l7lHCdLLU@kOH z4Gm@0T6i&^m=HGY^byYbrnnG(EuNT@T|J33yR3aLp&>)5DP@Vl6@}B7zucga!1T;y zv6P$}8|h9->MK|Zgo;$`r9AuiMTml|KhtZa|2qq6G?o4IZHZdWJ8ii@XMxW}I4xw` zQ1-pM;nGq(6)W&)X3CygWMR_eARg%#P>~XHslzL(TaW5gsFEpP`J$R0LCIGoTGf|E zFj^BJz1f71>6sCtXiQG*@(0pm+P|w9wM|Fy3+aGs>9S=5Md3ADH}r*w6mmR0^eq1 z$v$mbH`N@*aJ8V$COE}YvQap%2*t5z z`?n_27Iv8=ht z+wJQJd(yggvdix+*e1CrH0BPvzNF0YWU$LT0DJAqc@~WG#4BSXf-ty}Oj3{1_pL!| zac{FUDUZqdV)ZsU%zCYpVI`((|9s{0ja0MmS7#?GOY6{DH_cptnT$5;4U)-Z^Ox(7>Y2Cg0x%qewbhv{jo~j{ln8;pDB6Y`FR;3}6 zlC|7o)6^NC`Bq!4bQZOuon~CkzKPt?Q|^KhdRpc@Rh+vk*@Uq<+#9J#zTlf%#!b85 z)N*>n&AuW?_qW~Ckb0>A@9S9S{bswqi_t}X`K}8qVHkoin@2}gg_SMNBd#xeYfWc- z3z^~Ly4|&g<_XAamdki1|CP0fbG6>5y+-@B62Sv0qTD?jVZUL!Rx#`P`~of28dH_h zWA-`;ADJ?q2b_q_)Nhj%z%i1pYy{|r0Zkto0hOCu7r7QM_ z!>{vaA1__fKDaY4T&@M=f^l5=rP(wD>iI-q|cuS3#|I%S97JJJ}e{E zj`O4jOJj(36~aw=>ZquZ#-i0VX(evdKr4DnRx5TeJHA%AW83OFWEF@>?EKs*S(&O& z_54iLj^tLD2j$d6nl3Egd;fl!tF%5+}5cD{X<_N7o z?##)`=fqU$KRPIY|5PsYAV;yV4Dy5|bdJfAhzYthkh*4tfY1l5C}-2at(lI^qVlc= zAL|IO%~P%~Etqe_`c2bLPX}vFd0Hg;?kQbDFa#SgWe-@0u=mvM@ z3**SBT$nHlTZmdj3go0P@J8;yhGpcWu$J;m-ZqdpUM9!P3wO%I*JzHt*3Ap&jl(qW z=L$`%e9y6rj~Oz}QVhZb?Js_K>$8UHw^Gm!>!-W0jHj+@n51fLE>8pv4@D-62e}7t z6wf0r5dGLo*7hn6TW1TyO15y(_L|TMpKQuXkJ;#s;_wXyJB76@s}IMB8IsYD9I*Q` zC5?!X%wUe_|E5srWKh32(9#~!o?`BPe(?!K56>t@bT$j?Of7m?uY%Ok?o`eNUGVEb zF%&;#ymV=?>=DzrQFYv7jR?;cJx&ILZ~$9vktEPMfYF3Z&9e?z>LiiF0I;#Zt0AGv{}AS8^i0~=QJg}G-}J{K z@eS_?&h?;(+i2;GTBiJ9Ey(DJ1Q`isx{75qu;F|N<8rVU4f5cy2dgyimCWgnM$gHZ z?25ES4|~VcMyEhDM zRE*7Y05RLP&WLR4C<{*k<12XREj7ol?+wFI+l zKJj!)=`Qt+GKJIehHZeBa5$l__i&LjiL&R~5sA+1WPWbUsOPUt(&lK<%gj+853|Wc z?-KJ&F(Z@U3Q{($3<4_?DcuJFt#Z`95co0*Y=UmH5N^5>PJ3d}iL8@c%B<4bhiDRx zvk0hHOcK8wZ6uFTzEE-$?=#l=PaOLTk}yv_A<`#dtlCTu`@GK?>vPWFZtXhm*nIA; z|BCE`qI2>L@C{Kdhvc$Ei>^TfQaD$#H$@CLm5%!`bCis8MDuaYVgx?JGv~&W^Ts42 zf0Rj04(yDSi^ysth3$|aP9&`{`PQ%)!E!c*P!)6ZODkdzn6E9}3B@YYqkJz9uPn+A zPyn&8Jn=Bjo-(2Eq@o~E!G=)62~Cyy!s4aG;+&7gRn4%5HMe`s(dEg zs!K`BhDU#qgT4|$;eVh<8&K`}IMD05YbhxG7A1qX&V*%d+^lX@mixV%;QbgW$u zBq@b0)l$e1mrz>WkuSZ}Ub!`7lCxl`E?0@M92=HgiL@Q>FKQB#Q)!QIS`SmhvW=>mlYjFwzKNc>|F6t7bz3LadifEome$$we?|_rv4VyGO9>7dGudQ zN5FoD?v6|Vr*JCaEb1<^TOae3K=x`q7DsP!$fge~zcn-M&QRg%^L$Pc|Lb)Wsd9Z% z4`_{#XQ8xT5%WKQk#X2{>F`tgxF}kgaeIh!S}(If^VH!?*5!r}8;2)33Dji#H6#<& zxDpjC8SMtWwMsuX7ztBhiMG7*mCDBBYfFeGzsnlka~*Lm$;Q%mTkYKr4!%Z~LL=3X z)G{jtG03iGbEtGKtBzp3QFbX2U3ID+Z%=Nel4~tgQpuBIyXz}+(^inv4kfpJev>B~ zw?o;|^q_7&N0WHB%09!^cpdLohEG&e_L+cmOOGl{H21NDR}JIwo%T&`Z`T+3t5U^N zMi0 zkogx(3fEz!7kheZg)GS!`><)}cA`vpdugx>nd={~*O40-N6Zv_w^(OxR&D4oH=|`d zp^mY#wt9n?f6I(SeYSHoxU^;$dNuMh6E<_bbcm@pwu%W%|3wf4t2lsZc3dxND@&{^ zYZ;A0(G%xW+oH~!)wPY)iXL-#jfjJeC*wkwSvI!>GDG$qRdVJRM~5MssaH9OKdfr(?ID?}N! zBFQ#mFK;-3m(?8KrHL4I6o^!*^jJ zlYwV;XTErgBlTxej3RATHs4l6;YpaX*N+?%AkmE%pPJ!@IYz~g1CRLB0Iy9EhRK$!?@Z5Du*L8gT&Eo$>N2^>hU zpuvL(2X5Pzu$jSBsS-+@NKxUzi23pziny_2!4)eWb`+QqWJ!}JQJNe{Fy+0MFk`+X z`Osxdk2rJcytwgRPoF-2l5|G2sI#F(cY2h`bS6usNLAW2ic)Awq)!`agvzz6#AaY? zLL5t$V?(bN5pLB8lBQd?ReQ4BDmU%OkSn9MwfVDc-=S~+q8&__CQ*uq^&U<<_-ISR z9UTk4c{i@znsO-@+FYn`WY3^0IuxzYY{t+^={o&f+N#x(iv9A9%Qp7jnKA*#?#mf= zR@9&=f2Eo?ci_lJfhH#YQEFz(ypuY^`yXy1cHCEe1#4W~LYTC8roN#Pu22))@1+`y)Q@w}P zdg@^qpib$1L?BN&(WP5($3a$}Q1G3&-c%Pk=v0Li=0@FD8y0pTdIjEy(`pYkS6pdL zUG?H`^hH(PN^9LkBw`}gxYRK_de~A20Yz9pHKh0|gA zol)C~Ibm{CT{)a`%PnUlot2$LpPM4h)})0JuGJ)I8migVLJX;e8HWG@w<3mHzK7;p zw88cubdU9SCU!wqiey#78G2}gJuVt2R-T<^AF8%7^(K4s?f(|xb(xhI-k_pxlqgq- zI)tc?<9&GOQy7`YTBBzv`C6JidfKdlnn7FNUasZpRdt)rDxHCHJ{hZ!bG4~ho-G2l z>ScT?D_VTkLglM>u!;&)iGKph8g@83hhlzV^2!;svR#L(ny$KAXP5;dJ8FzBM%!w$ z{wW(|Xal!9?3jwi8>@OiYA5N0@lG1vmk;|UY>O~nwI6utrpcjWNrAf9x3`689Ll$G z2duuWQ95XCDR*bFwN{eM=$an#c(0|uDV?usFxJ;zs1*~)qN6xdyW@}AicI6ymKADg z(Dr?daLwVe%H_}mS2^V|P~z;ajU;mlnW_o{SZa}zs{gF#bNrRtrI+?t z-Od?f(?ScDbf??}-sR0~Z%F0loCj;`hhf2c?V~BDZ7#rn+xxYb$Nu-UnV+uKGsU;! zmZ7S&vdkvqt(|MIz`2hID5jaG3U`Nd#Vy|J%adjzf{l|kBA9nW-MVgv6V9-IeY>jt z<48}t_scnAOCp)Qq2BV7z@xcsnSXg*JYmQ83}xtXOU`bx0g4DIM|j&9t|GQ28sW`P zdP<<{m{qp2sjq5l!kpDE#Un`RPDL*Y*zi`iHyJTZeR-Q7YT!1M{P9m}%?ls4%#tB> zjj2KM!JXtpsJXMr?sgI+o`3??wSdjeO_U2Fe*e%%L($oceVz+US)hiz{qZVGBivZt z7{t1CZBJ7jL(3HrLqBQ7&xIj^Q2esvFWlTHfS)VkwaSP*j7_UbaD11ISm-$F3CdoG zLmbBdcgGpcC_#6+8rT$gAGv8!I?Os-YAiRs;kZmo^MaxpyJ)-=$|;FX6k(x2q_qS3 z3|%oiU6~kpoFGPxd}K4<`4+iI+5n7?z9U}MU>3qjI&UFd+!{%!G{MlNu`$0SmLYo= zOatmMXi~G)O%O=NK_XKjj9J*@BDYK__Of8T)1$^vwlf=MZ+y1Q*c?0HOkY|}i~DM$ zGhG8iZ<6hD$SU3CR(P~Lu`Y|VGng19rT@c2f-6*jJfT*0#!sGwGc~(%UOw5A#4|am zVvAS=|0*QOQbj6&Li(e}6lW?wqSBA5Y+5V5M>%Vb&Wt}aXx8urp`5Mnp#AGrLTfpp z=Fw4{4=t&A!a_PPk;1GuqY8l1XzJ2*qf{pxI@@%I_m=|`4qTOqkAsMoN_f1F%sQib@tZ(hogk;|oH=Q=XumCvmTWm0DS$})zK zkeB|HBf(4xm)0)uo^BJVLsjHX|Nj+qRY}6sXalRb-3q9#sq`#8sR>Zg!qQ=+eVL+S zdr5y`DWa5`lXPbo*dhV0Wbd?YW0~33q5f@A#Z<0kJM&T`E);}PC8$S}n=5tFRI}sU zZfc7L(XO`io=UPC9|cOJf@PL)WD=%aMawCuiWi&uwBp*vW-_(1*Ses?YDy6c;paN8 zL2mnQvf?AM?MC#&OY<2}Ggn{=jS#MF^<6m?h}-|El!8EWsfzgvQwi5ju$F9G7>5>C z4EXqL?2?``0caNxdsk=_ZC7`_^;R>=?@@YfVK)8iQ>mtsR^X!UgU?A}nR-#6?zONK zF&x(E6|j_%j4PEttWCCwwf{K%q*&lcmDeZ%H@ttkaFT0v9|v0%m&2)_B-1-dU-kHS zvAv^v%#;3bij(&W1Jr`P_OXhqQ-DG$(HRCqzYTF}* zFreKiSDxPV)#5H8tj`JEmC?J}y{ydhFdbF+$ZWl%z9bV*wAfS`PTt49X0tKl!QFZS6E&44Kl@h+TdELZrJi#5G?PD zUoJjY$@Q-E%x}$AfERqLDN2-SrCsTw;Y_RNm8_4qzIAa`@6|Qcvx_5k)+=FA!yyJE z5(SylJ==4KSIwZZF-~lUI(y@;zI&O;ZRf909nx}3i#n058uU)BsNvEdDc$1iQf5q?^4$DUTE<6#r%WszK-9F2GujAQfW`!3)!D*;RKWpU*o>A>W$$V8?dz1CC3P-+YzR zmoEu|c6+xp7+`c$(@(8tTXc7S3FK4*m2&MDMZl$O_9k4|#a73}X?;R+F=T#_hgHqD zaE-=w0XHRDL_(rwLf5BUD2Qk)B3h`Ie;HSR8D~dGVsMKlBOFJ0LRBLW17mB}fSJ}q z-UDW0H+P3Of+$CM!z6eo*o4xzYp^GS8b@nYwIBWlY@aq(U$$5G0)bo=eq1Oey>*0! zLvwgnTo-gqtg?R{m`AxqF0K`TtM_qD^n)E?dZv|i^fGOl19L3IZK4E)#Ugtwc3W|w$XSTbG(fU(CQC1@mWHY=&dQ2CLFO9wrIw=B;Wg*RAFs;7dc7+Shl zicq$PhBZ{l1BHQtiYAu~#5Xm3UqlW^5=0SJT~(>=Z@R)bV$247zm0g)*!}ycRmo0^Oj6@hoQ)Pup=~wcEI+M3d@{^R$hLfDclsBh`$@f*p zbXxg?m0B5?z9))TSAZwjddJ9A*MyMjMTYePI=AO*Johuc#eDHJmqp1|=mC#4sFx}E zSAdCQf(47NN0#l_h<>wG4V8*m7kT?CDZ*^1((pTn7jRhETLWswy) zfZjHpsW(+x$x;YPgvjPwPgtYg!iE?rqOU1UrrB@gp`34JpBid|K&O@9xGu4$URU#o z8uDx?%7ii~d~{(AL9h{~KoF*&Ulht&Yb0YJXlTDbWTd9(q z38vDSVTgF2XR)HA2cWjNqx}+P%k`7t@TZob0Rv$TZULy)kaTl2d~6tjb^m00oyDj7 z`KBLwai^DxAt|=bEGkN}8zkGMJj5)@X8{`i%tZh3N@;yy&78 zSF(v&5F=2w3i_%vN~v~PaqZT40BeGbnv?7qU$Izn>x!5srKHr^w%nF?*Sf447m8rF z6&oP7V34}Nnp2f~WAa)|4W?013##KrbdKwp(|CX}HJanU)B3M-f`*)2BNn{e2y zK6BCaXF!C9)fcT#X1$2p9qzPYq- ztHhz$i3@7O5(mKW$%p&KmH&Iee4D+a?8EQsniPx2ZRt;vD#@yLzn9FxUYw>D{H@G+ zEmBvNThpm28?4ZV$f$Rm%~+~YiNgDN$go^QD=dZ&)~$=2xh>kuP^*zG+rL7Za)DP* zHe1Ab9Kvb)t#`c4eXCUAM5J4ZvN0UZxmp;ew_(AW%i=W6{d>!;YQ?2Fmg0M>)=bXM z<6Mh-%8hW`7+yujy>AD*$3ZoxdH3 zbUVoM*~339IAdnQS%inH>8T2dKQ)`D7CkcF223bQ(;s!ynrD2q2hA9#t}h#@2^|AJ z#*!h@yIfpkiEGkj3CvH!sK-3O-7LdO#L-rb(ZHx=AGN38JibCn%CuO;$SAHty+0mY z!+H3ynQGK>3y;QIu$aub@LSh`7};|6jOMu4U)|GLtGo9c#EGU|c1zE|=Xg^Kl=rEl zlU%$m%)r=Lt*RWO^8-;3xXAwrKYzK^F`&1jSaPAP!%92Kq3t;Vin4#lZxkHM@5spP z?2%5qWwXT3A8W0Y996tI!48MRdM#z(2G~X{IurjYZBeMaT}#qXJUDp!V~ZJO?Ayf8 zP1n&|nVh_<+~(c1DOi;^n-! zKnT-|)qV7xmqr`C{EejDSk3uu$iZtr``FG4j#mH1<4VX-LxNE?rf~IF$!XoXNH^Bz zdfnJ9-Vxrro_B8pxg$fJ#8fQPE}nTpd{|t~#91Cx>pg0zqePS~+2EzEdR(~89jiP3 z(8Dd|5$f4!?$d9bkutZJ{tVV_{3Eiw*F^v0iTpT~c^;(u?b0JoDDY8wqd3@vNVFm= z=8#R#>dfbgO>YF9+M5V65Cr29UTh&9%*t(=RQ1aMZ@{Ln$m|HG53N*~V(&W_PKoI6_|@;QK_{$((qh z?&q_ab6`!xYfRxGQ<%P1>3yzCIsT<_XOfQ;(HCnPvmR_67=HO%J*Ba4+l#b&8_=TO zSp>Z1rc>&3H%5B>Or;!g_L!FFnthasnQdp8QM|#8Db^NlinH$H2kM@Kb=xy|;c*JC z8Gcui_OG(Ww#*hZ`mJ*L6zT6S*I@sHod>Sx#XeB?Ew|EM=F%?de1lF21;UwK5 z_RDIa9@UDai5UOte4fbsTy#xp;N$F;(-+kNAKR9O-WS@kBaOU4n>1nHcL&Sw|Gj`- zTeTn@y@01qCEn@yC=A7>8aewdM-lgN( zf0?b)+J1>P3-Gly=1;#(N$>(v@B->Nw$7a0cx~eGuIr+VR&5VpGfw6JD&qN9?p|NS z;$Xhev%_aiQ!ww)ueW@-hU3qkqB~IsEujIKe=ESB`IxWyK7#p1ZT!$Q{KMa|#IO9R zo&@>C`S>mn#NX?=RQ%1{QGNdr{9j1Nw4InrO>7v>uxCoX|6TQh5A%?0s>ZeLOj_g{ z@%;3!{q=AE_iz7Dbp5Cc5G!6tIaJV~!GQ-A78EFjph69Y?k%LaFbP9}6DhvHm=Day z0S*&ZRCvs!29XC}V8FmIB}s_)7R?-32c%7$5GBIoSu#~BhCEH~Jl0cUj2K3@1;uF8 z;5MjFmlloc)GA4uS+8zYnboV-jX;@JoT+os!lGAgS`>-XZCjKsQ96sO6Jgkg2pz)Y zh}RicrXuO;9avZ;SC0Ae30-m6=*Y7*;r5+O@T||TW%>U6i8X1@%XXU{9lH~7#|}f& zrggd$@#3$iw<^wDTXg^9u%R7yU8S zjS#oUp%$}-dt|#J7SM446XhaG7vgRs;>1y0IU?sd~{Gs6WoG=6EColmmLk#)XgFz$Q0Bwb0$JP>c<<5a@GkWyFY4MX3Evo86>fO(FJIFQHu(~SI)KXh?z(d=O zOtVH?1FJUMD(#b9{1%f6w@}jfMbJ>POoA6-aRj7wUfBwq zO7491w)ZsJ{slN-c^8e8Kh4S_*sH?t?kUz-hYsY4FocCTV_tr+~yA8YuV{?mcpnwj{C*g?%9bD#)bRj^$!F4t=fB6}ve+Z#zJ@6o#;y{ugqlN}J z)#7!II}{_@GM0d0_@-qv9S*4t^4uQf3L;roILa@3Xly@M0tqX$m^0780S(;n{y3A{ za60L0+~5YQ@)Nqz+-q_1Bi!8r7e932NkNH&5Ns4y5fxN~02R5xhC0L@?sUO?3&Gy1 zFxUSqhYin4rt1ReFa|kJEKP)maMtI%7l@pJ&S5KpiSK;J!VVToM~6`11V(2jPHjMf zstc9OU`Rvp`EV8$kwMeCG&UW9iH9~SLoL{M1tR<{ZG8LRy!_OX{!mDOa3fHi{FWas zl5vcJV^qM_HaIpGN+x%iU!90zN9C+9d@k%98M*~IYUQzfxaxg;RF|B6Xn;O$B zMja=}%n2UwfDw!rMJ8m@2TV+2%f`2Mt7CnkIZ59_h zA=%>4AtU6{AX@kc{TPS8`^7DohN71k!$=V|y75mwL5yb{N4P>TQ!#SP2>!y@Ky&|@ z(IdW@pp@LyG8DWFO^FQIrK+U_9xBb8rL2^oPm`kPtaT~jqDUm9iDLdXgL{4E+HE~K}iUk>6#7J_(td+B2 z9(+^BUdJgg0n~dfR1PIom{BOz&?q*`XH}ObrIj5m4D@trxTg9HC{|Q_Ud!YvL#Z{e zs)7>|m5Vk-YCn~lri%xvP`zr(Abj1g8Gj|zgV^)H0@8F(gJ~ny>n@h^PboAOCSK{5Cz8H5Cv28TNbC%k zJHuromB}-oD?{0=o#3b?Kw<7kwZotumBHn^FoYR=RNh|rzl)Z#lp{RR286k};yi7Y zEpjv@7}}jz-cfHWjc5^HH@n@HEH(9$S4ge6jQ65*oE>;m7Sy_cZ|QTNt>V6dJOL(D zP#L&%MQHsRbStnzB&xH9rYc5S%#hA>h@DMZC>QX^pY}*+w>ss2MtXbB=HnHyh?(#n zbESHV*LNvJue#yMZt;$>u3;R~tneAV4H`hUNa7F{q(z2$DnvMbK|4={y1iY@EqUrnJVIJZYYc0E@lU z-;8hSp#R0#uR7m(+uoI8d#BmQz9w(Kk0$Wz8eKgEC+`Tp@C-e|gbgb?!5;ij-A4oF z88Xi}NiO~cD@|MpD({KMZ`-nNCOYWVUNmRN{dSmJWvADb)ZyONZdfnVuQ26bi`mxh zpbISTNALBVcO7t~BcAC*uSnqm?s%mygbG%HoB^!Nl?4zW?K}lm$ccmXo@O2aX$rZB zyC4CcwCV&URJ*RvWV!^$z2)Gx^g>WhuDaJ9@cW@vz19DW#&wxF@M=~YU7W+~wLqlI zhgW>S5p(C}M?d*7Z{O%OuMk2&f{+D4I9mVkG7^{?^QC^WsiAagO-EcIWr+5v$xmnA zvOMr)2PQD#HFyZstLHENz5Ppi^Wj?@Q+fshG@Ie`F~SRp1Z;~>QwcjWitfm%3Q&m2 zBZ(_Gn+lM&@e?;nOSQ{WvJv7qX_-B8ld)~{z{eRu5fnFYVk}MhJ`4OSd7J4q(uVs6+$yaWIHwtQnkNG zH*2axS!1_hYLq@;PI6T&&f3K>LY(~HRSI-a74Rp`Y?L=#YnKoICM zNR!2t>j6n1LKH#;N+`f0c*m28s^T!VQ9~-E`a)C6I+)0%9%w==@`8f^NQzJ$?5dnF z*qz-8wth0XFT@bW(!IgEH^w*$daD~4q#yqmQ^xONi6<#TE+j`y1IcPEFfjup`^q-; z$ueDGItUbkA<#sF@PuR`#0@z`6S&Dmn1epZ0xCO6ae9s+1C=URsLi4lA9#iyfV$=} zM@J*C1_(k=6S<=74fG+JbgD|M%u1!Ppgb^w1nCPn8W{7c!FLlB{{Rq}N=A)b6qQ4v zmg5{SYs$5ZIJsgD2qXY7*%F1Qgj+BGEGVd1WUvV60}ZjZ{i+2=G%Xc8gz&Q^6wm|@ z04_S1%po)arA)^Vq%lUbNhgVbQ8Xz{2u;!K646wE)q|^T1dR6K4bLDTJiI@Pw8;K* zrnz(vk`%D>^T@TMv1}|mgfjpsyaoRO5P*-0nNstT5Gil}zwW{aD2Pw}+dH&e%ZFeA zs9U+@^fI3`DgW}X%=*uX>Oh7(6ff`tLMR1;Cn{%zG}4sE4S3FXQq%vQQibrV0;kIu8Iyt%Wzp@s!UG7%fh5R+3;;ik02!6P zIJ{By93x~x3NL~|!2(h{Y>M?{v);tVlC-xmJ;?_H(f<54k+cd%xQaaxgdo_13n+mc z(V@+xMqLD#Q^iLW5IYb!HW!F0QA{tgYo06&E(euVwTRLXiBi4bRX&glF#uE=^*;QP zFhgyd2@z5>y213kzuIJwKU@f8J-}+!)n$`VN+1bs(1s-VRxzLi3y=v7AWU=37Cv>E zH;fe$P&89K)y>?2fL!N*D<~sYz~BQV*|T0<5@4Lr)qAa= z;YS#gH|}CqM?qBo6O{j2GdtyTypP*h?2J~Y;3^jKl!hZnm>}8fGJ_wvF6k`QBh?Xm zHHhuRG?av}c;(I(#k6bttpD6um6X{p-Nn#5r-}JD7%^CI1=eq!!WUhc3TxQ10Rb#< zSZ&e0!tyyp1yYK&LmrhkcT3b6{ zB+h?p*4;y?_+$v#^f`;=yZ4kIwXC&SDaDU-OM0xvNgXxUZ8@)8TFgR-ZGp!ItV~=o z({&v;yL}ued%ge6qE5VZOA4bsD2deqE3|N`+W?JAY-?L*Kmev(h%C5*2o((}sa_$% zP_3EK(2~n!sTnh+JBign$a13{{W-JTJ@uWes|`}u%T)E7Musf3XQWBPtXCbXo%I79 zx3$1@Ev+HYn!GJs^PAbDIS6K4v~xSS)v`%?ZO#EpURY(V-KxTx1Uv9!L*KH8i9v(M zWg+}ENQB)d**-@t9B({ zGxkDG^RNHLlw!t=S=T*aPD9>^5dr|nw#);z-L1}8eNhNN1Q@}UlpT%>uz)Q1g9()r zv7%lKsg6OO9RmZ}U(=${owe~IqpWp7zS_H$THTUs;v_{wK{T2v7E|?EV>PTOl=aYN zDM(Bi-+|L!oW4>VX>mHJz0AxAiepY2ODY?0NOa|+MI3-6-DFSAxh~Eukqg`P!ddD~T-r5SZW}?CN z-4~wo+N%Y?q(~A*xp_FLG%D>R>!=TH{Gm{#hYl~;L%fOX2;$K_M1E;73v zfjL+-0al1Ke&$_5SSj{W zhS=(o##{hyoPGqq86HmKpymR_Uf?T`(M=SH4LVImK_@Xmh%;&dwcj*U&J?ugGCWMD zCQX5Is-hIOfwYJ|_yJ}yEq&Is6fR^_M1eU_ryK&7v!>k;QBeL(V>fQ8wT;_};P_DpjMLs-9}qQP?a?Q>PZS z=NWKQC;%)y3~%o_rs26%(ol4?fAyZB@n_Ng z>wtWiH+bFx7UADMfeYY7D;`w_umO-sK`5^90ryS`bz+IOFQY!}!NzbdkKzBJO{X4M zZbBYPD{ynOLj;6F?yWw$qcv$P%0*q(@Se!26PUZ0a3J-((ynX)f_&4X_(fhi!PA{cdwaJRAoXj{+mrN>b-B) zCG$S-$yVyh{p3cEVUM)%OE-kbROBsgofb&ZP1*9BwC*QY+BW?~Ucbdto@}&HF5{_3 z$}{t9KiP@$WhpQ12hCGpv^}qZW`bWx>Wv`zrK3UD;l$$6y%Dd^-9Z0JWn+`HYzoD} zZO?ejvGnKEq&=Nd^`L5z4^1+#By1DEA-`u-rfS#OBMqKjHHU%WE;3V{`MnKn{r%fE zu6GDVVN%y`?%R+JkY1Dabq(g~=Z2saCw3U-_Oc5y4Cc1;TKJs4BY2z7E>djI-CDpS z;y5HVdo)4xR`0|7=6x0HNUzXJ&6(VOUOQl`6#00izX01MTo3!gZTR0{B53(DfB+fPQ6|Pp!1Toy!mOb zCk={?c&+zXPfj*@*6iW?$O^Ua>a@zB=5+t&Z`E;{CS{5|HJH_zYpazcxDLZkIAc3`ZVKwod*31#X1Cd`LkztcSS2t!pDT=?=L zimW9j_N-)RPjqF3^eL7D`IrCKb!7jPKl0mzUK2F771PzlP4CQXv4k|m3#H!NokytuL=&NDhS?zo9( zrObpD$dnm40tZZjBVHCfkR*xGFJBPVnX>ZGn;u#D4H}pn!cfkTH+zM!=6HFQ;+%;I5D=I;V}-^T{gNzFq6StgW8nH|EJLI{S@n`+)=rIlY6*+z$OYTyBb86Gh35oZ%H;MGGk zg?CZ|s&EqAV>s29M^265Rah+>Vxb3(dR%c_Q74^HMHxMQfrC>|30WR-R{%-WRt@Ea zLJ!huMjwl9l zBbxf{7v_I*IQwjV(Yfj>VaWOyt4TiCQCWgwy!q{BE5TqVf11o;C_xY1fWr_uoP>n7 zN0fD4qI^i}*#Zk3o9Als$%pAh0H{Q*gd$E@BLvfd`YA&iIBcqr+fgSggUDI@td}J) z`NwurJ$J>8#EPumuUJwE1zNz44A@D20;d08f65jc?Y{kq8FK|*`a55?Wzp%?&nLLh zV@^f5l3GkTVJNgpbL?S52pZaUl?DtUpr{Im)P^q{`Kl4?qmCukB1Ai|_#I@6U1hP2 z5KoMQ+iwS%#06uq`k>vh8j+|`M6lQE%DUzn_ zYoNCTl9d%!$I8L4*AXd&1w#z5p&D&P!6GVE&H*wd{*>PN#1#|_yV5{R^(WSDkbCvvk;c7V!ga{%4+^n_B zvWMIG_v%J4`@u1`q#YD2LF9o2DhU7m`MrbA+Gto)of4#O3E$jX)}ZV7g*uMu>*waIk~IBh}h)^dKDqrFIR&9+h4Q z!@>zmO5EGhu(V_z_w=HX+H(sHRS28Dpb1;_L5vPF^1uMW4t>VCA4AM{84V2xe+Pe$q}<)Kn_reRYw{Jp%ufhhW1Tjo`&6z9>DXTF{`a}HZhrkEW{O0Vx=^OHba8kpjJo9o16To-2Jjn+I1v<+oGxjY;;7inAk5eR z@hsbMUKOym$w+NWr@+4zifX-Y80DUOEB1`c?;95fX+#J!h{B zyUv{Y6sTb|7EsI7uigENjIyaz1U{hI4=kaxos}j@S{4Nbp&$Se0H_$6aRF8IMviEZ zK~pgmOfd}yY!G1&jj)v}`H_gX)0)@t1XL9*Sb<0=7_2`#2gUoCv})%WBw`oq(=H(a`HVf?tZSkBpT6cbhUEdz7U5kRXa@3(3v3Oyzv*pT zjq=Rvou{1G9Vh>n)H%cLopYw(V=RhS++D|h7hpAnL$CW)qF|$=aLk#(| z2YQox_1A(WS0@AuSsPTxc#^I0#E$36b@dEaOo_$DMy?-j`n61`hl^_2rWbM)R^ zIy1J$W_?~kz-Yc4IyZ)R#8h(yFb{N9m=K_(;U0Fomrlk?S7b`; z%xj$dgCwWNuad@9o+%kYK*y%X6TGM`>x4Sy#jDw1+^mq@S4OhlK?pnA?_g{L)-F|f zQeRL(gdzW>Mz6IMs~VJ56HFxrg?+HyPvMdBn&jHYUAj6V8&->Ndg2+HxECoyWSQDv zi-8jyT%k6!fauIJvjloDK{gmEBhIbVQ5GC47}O;0Ba^o zi90?XEgjU@P3CS|fSMx&@xI1_1Y$v<@P!xp;SCA6Z^m$)+H+)Ll$Bl7_Q6I?(XSG&s9uw1&?^IykD4Jzktni71)-8oe*RTBcz z!5q03^C+ML*4zO;VB#2`@>QS(o=oG-8h5FfTsR+22~s|IAe4j}gLPkDw9G*bjSnfw ziExy=^b>J7!G$qZosv$U3E}_X z7ZINmZjK%?puF`J)g_;GC0++29wdq2dPGuoiJ`X2$TuJ(<+_D5*Uz{ zIUomkfDG2yCq>ZzJe+Q|k^~gM;N?!2k%W}>8p?eivlM}bAV+uH#qcp;sx8n@krTfO zQvB_d%COUR$ys7mBFP|~__*3QHP#x6*IU_*oygJpvED1y;S$<`LP6Ta*`b;668scF zU{Q??Z~-b|K^taO;Jr?Lbec91K(!U)oh49*y-2>Kgamk2g6$vg2iB8?51Ii4drp5vjIV=Ed$4&FrM6yd&yU|}F}pj^DzMPg(|R$~19 z+zdb-(kvANSx29u=ZB={AK)_?{Z^_q|I zQ^WNmvl!*b7#=r{p+{yTRf42rT8Rub<~G`zSdL|Q&0txcB|Ex_xDfy2>6O*h1=JSt ziK4kuK_Y+_{GlO=9K-Dxr4iGCy$ewS89Z89)mf5P0f(Oml@4ZrY&{h%nGFLxR4*Ly&e;9k-hYnTWCbxj*x-2ndLiG~O;E|?BxjFdgZ zAZi;2a43xU2BaklMBST#dLScZ<@0T!R%RsPIp`#soHI#i&RPGcxNKI1ic%{I85cCc zqJbYAv`&g*ivVt#ivCdg<%t0LqC_Gjzyuo#LDiQk+hpv>$&H&)V%@!6BZEe!;&r2e z!dM4R-&RInk?N_ED%_Le;}U)sp%$v45-JynQHq`kwQXB{&YgL}8JMkzA8jd3dMIJ` zj@t1bl|s#wzC@zBJ7(|J#OgyeMM)VLCzxYk9Tz8YNQ1IJ3r=!S6Ogw;0XU;Xh8~Ia@&=f&JDUEoVM%-^r1vN z(dkA2?}S?lbQWh#n+-;RdQsfz9KjwXy~% zy%x(}lCN&c>9)vr(C;mUM!!0vXGI9YD!}RD6CB*`@+K=Sx?b72)ufc}#hs1^gy#gg zCK$;N*MS#!-lmfv!Fad@28fdd(p1tZ?e%6a(rzVTRqV=e;0A@SSs;Q83lt5Xult5T z`esi&4zIjoN(~f|!<8;qiH>s3?jSJ1PMZHH196Hi!Is!O0}Wi9wvh-C#V?_x$L#j* zvVL6xyyE{d#2^qPGzwW4cd_17ocMXLtGFvJD6urQ zPqI~efd-vtnG0+8kDq3k;)*eexC2+wlT&Z*-iuJdiLlvpeahvVZqZjq*f zF#D3jxEW>~bKvxGMycU}0CEqtVSR1EUHWP;T24p7l85TSzi^!si&90a7Ngu+}8h&0_3V_LUA`c0eD{BwOLa8y|E0Hq&lr?pUP?q z^XaS2KtgMSHbm@nrNSKB5vYM0)TPJ4T^{8oT0-=(MwdwyDoW_~mmN^SB%Q2F5{LI; zs5x)lD%-5Da&y-)D>`%YB?liU3m8nM)EDy!5!tALjTwlj?ICb;i;xu=B$Ny~@zD%s zW#E#ddCl&z4r~3<(j6ZjGj6`w)Q}D|4GHOst&moxlhcg#3IlTq&uUqO%Ex|eG4ov- z?y-3I@lOq+qctfe06`~DU}a!}$gH4Q*1!b1vsuE?gz9vrP3SwPO|B~NS?==)5z!3| zbvEyZ9stI!#bW(*u?@5Vx)}diX78u|(ni!>K$|HoC2k^fawWK$utnA}SwqrTJI%$a zYA+*F$AaYws9QT7?F)~kRJ0sDHqr03WO{VL?y{mI_MX?V-h)h-DiLQn;D`!7j`WyM z`LrvEHjw~hGu`2V4ghgpOTv7G@r9!15D3gD&!E`pnG04#a)6BTK$jaYXC_kQ_adlO z-f5ToXgJ2Uf6F${0W(#mQ{jdn8X7oT6U&)B%o->7({;(g6|&T#bLZla$XfVfBR2Wi zHF#}jlr|}o3P=WX=XDdeJ!dF)PKKa(rrFZK*`^u(IBW>__njWz28JQ^hO6KJ-NaIC zcm4Q^rGbzSIgtbSY(xKTfYUM>hDkBwcGErisHhMy;qc~a_^npBlVUiBdw7%bs&@uz zDUH;Ca3*q#EO)CVh+p@7t$8USLNZk~@||jq@2T}YXO9z7(Q&Wz73n$^d2DY9L)-CF zR;917_FD{+o~JcfuC-d5(ujd! z_ys-Nx?b=#t9n|RdO8a78hdLThoY-S=X(SlLWc=-zUqJP_Y1{YkLLLb`O1=`S@w;L zTpwzuFR6xyIyMXHpptBQV6C%zx(!A4r_)D?KU!`k)82AQ4XDqUt9aIa~O7pf|J&)w`~ErN4n;S5so5qc94i zQ#ktjBFsF^``k}KJk@co=l=0ZU_eFOy2p7ThlVFl8jjoPHp$M z(`ThO&JfA-JD`s|y_-C}&uX|jZq$p98ImMPdSQ)c_0uB#q&s|G?3&xhwGB7(3~#HH zOS;?N{m10J-aGSI(C{Ar{V|vJo7a@A`*^N1sGQ~Uk#}oleq_i~$&kCd)+=rqc4Xx< zL*@H=zbpUNH&TAu-$mTVy_Ao|Nyf0iw>?Me4-LaGF?$feJ9*(s<+|@TeG@6+th{N1 ztJcT6_D(*M%eJ4^ny|OL(_{SfYGIr&-{*@ZZ_^p_VsziTg6l&+@et3VzW{>+9QZ2! z2TrCrl{;2fJs|P=kYfDR2l>@A^t)4L@W1xPgMV~F-)Zaj>@UClcgdOk&E&cKrvbzv zfdd8JTXYa%LJSxV#UMCPoH&9JB|fxx5u?Qz8!2{dG%;gHkrNwzY$(vAKb07@rE!Te z&BHk`Rr({@QX5L0CwoEc^>gRQkP(CWlz5bANs~ocHWT_3YE-FH8yc)i6>CqMJ)4hG$>aF+|EnA{A znRa#jSgJ$FlPN!3R2e15g&e_NJX=xi*tCm1A4`0AFV?}HJM&E2x@=Csb@Nia>vjfN z$7YW<<$V@&aN)y=cg>eC_%_X(mp8vDT=B=H(Mdx_8ZpRV#a;y;iiy{@-@kWlMuyEj z?rZf>*h3j#9DaQH!x1*d%z0>g(3SU3_a9g^*Ir|cy6Dgg?IyfhGA=iex-%+2iozl- zB?-Tp55o*KRE@a~J!I&@*qYmDD#;!*5yHf_0x&@puTzSpx-yzeL9N7F5w{9O`mO)K z-!}Xa$RJ5t;lm=2%j}qiM$#-ZxBf!VJ_afD=t;qPdQie1>DrR6iMWi(A{k3eF-qSG z>ut5uR=d)${mv5-&Nz!plFrSNv(U}%vJ{a;2rJw!GT>mW(#8K`SQ9GbK4Ky>w0#F+y%fcygqY~9qN6WKBDtm2p$6|dgY(^TRg$>L^wH56)HhB|}S5ZOj z4ai@GJvT#7or9~%0d=JG$)r&GQ%eAGZI;#alqHZ+F-u#i)<+-JEkR}n4R!yg8*${e zzft|1ls@?AG^#^%Z~d2Dig`RZR*e9)6|O#6odG0y4P-5(Abj#S%Ek=?=%b2{H$D!YhnnSxf zM>Q~<#pb!^fmGI=pxwRe(#G04yA8LryY1Fi+xet9T*=AvxOlW9ELZ>F0CPWm_NMcO z73I8@5A^bcFV7d~Y02lErtH2%Up3(yRb1SH7nePL)yOpSN@Np`o@AYggIGDgzTr8LR1F$mvLrY`2>vcc5^LNB%M`fdk;i$&Gur(6wx%@c#(#ec zAd)(GI(0pbdkoWB3EMKVJMqkd6AV`V-UmA8?F=S{F`(mG$SA={PiW8b+P?5>-3tm${3$Y&c^B*US=AHqkB3Ub6z5nwAE; z=s78c;Hnnx9K@F=V(f;`VVfN{);fp<&15EXoy@k#vFmlsb3XrD))#GfAjkO5j?r?X zz-XnpBDTqKskxR-yfr3JMsjgK+gx=w%F5=FV2*}c(zpDL6tOV~(P zrp`Ekk(qi<)hTmQvXTv=BQoI`zG<}&jl6TF0NGeg!VND({v;F`(<4HMxs#JrJ7xhN zRM5`=2Ri3OrzDFsq;);AaK>AwskkSd3#Cw13yqH)&sRSp9te0aQC|<2BqKFy%UgWp z;~>>`s8LGtc{7DnFZn{4V4f&f;&WE2&iOx!n#+h*bCLfC(ezP`eR8L=s^=SR$VEz? zQBf-eA~sJ6o-P)2o%USh6qzbL1HQ+Pz7KdGbs%?n;4)J5gjYiZ9T-g;=lr*8C=RPxE{RXl|Pu zvO-u@y?W7}l`JReZnskPEpSf4bL&at*cN11>ksIz0x`lZ3kcoom0eCANCAvQCv`p|GXRDv2;|-&>e4LF&QLrw2lW0Wp8#BIQX7T)lAW zw~XU0v5@VjR>`Wjui9KOP%YSG%(z&pL9EqFBg$UnDR{P9`zjpeoYNvdEW`W#F<_5O zUCP+?x(IEgp1Xp>FhU8;&||WdDg$T1c6oHJIc!5e>%X497iK%I)-^$9<$dkam7eyS zDf2j78p_U#6?W*Bch=w3?lroTMl2H%-8=s%L-TEa=4yGLDr!16w$+10TQ>zgrZ#_i zo`wDxLj#*^Qxe*tp7pD#>8V;B=e4c;l&(O39UJe;b+0i*T4OPtU47cLk4l~O&9-^t zUSIc2NLAF-WNk$rKlZ%i6yj`f>PSEp2#|!dW=r?EUD|Z1+;(>NyEoa=SOFJq@rG_x z@r*w%t5u%9VReHQN>qPAvG^w&HI`Nf2#F9e&`hq zJ!iX3^t@>W?Hnamv0;X^sN2n_Edu|U*(N4#q!XORzQ%C6`4aqJ#UArV8yVJP(fR+r z(`WOxR<;Uhjf6Ul+UVE0}rNa9br z`L$ci!Koc=q7oPJbv!Uy$3L6iqc<;+oBX!<4!?z)EnL7hzN@7Kc$6?`hf6AG zdFFNO@Gs6t?Tlt`gt*N1!tXpdsN(`=lNRK_Y6Jr7jkdrF<1P>8WN%HZL;kRC`#R9F z&Pv4uFx!YmvKVJ1_JF$@4g~)-iKc3;;=*aG$c+JO4gTWgqx{Qi{AufS%j#qeF*wlq z5{!bv&Hqp@#j@wt>TdML?E;Ul{eI5p4rO;{k7Zg=0oASJ3NZJ$F!FBit8ON{2;&E1 zC&S9H`vUN80*m~XOr*}Pc+iamm2l8lMCSU>-pVd6sxY6HX??D(0P(DG#E9);kZ>X| z0hueyl<)bxY(h}X?hM^1g+{0r)rP*2L>@AW)yu59t4Piy5*pZp?(ExTzbFNZ&m07Y8cbkc$xkPZg7}oP<&O2#^hX z?C_S%<1S|p1fm#+(bBSo1*Omsoe|jRt`pNw9A}Jv{!0N{%^bI{n}TcQ?qg4&rxVvo zB5e*2!3Pa92-i&RDe5uA{;>8+5t=%w_s;R3a<1W2%@r98A|EevPBGm?5cV_=#dxT< zB9Y{%ule|6EugUdqRaor1N1iWn>Ml-RWJ=f(*3^BCEXDa@96i6&ifWC_%v`@PQ4YE7 z6-yGa&Mc$i(QyCNaRmQQBmXNN=?y4XjP(j}z@Vfk)smUm#u!QQ><}!m?$5C1?t$EJ z0(%gH5(*k$4B!GX#U9Et%gYHJ#_GWB=JGD1U!|tLE=0?Tr%S&^3Wlot}~(SqeF`4PYKorm#@VhN%T-C6RKg z2~%z?y>mm7Ec-_D2tQ}q(Cn&oa4+w3GEMRdqtVaa8Pb3=@t! z7l|dSrxu%Xqo^*S3b7z@ux3(J7fI4dag+57>irxNJrAu?B9kq*Ye$xG!z3^zjgu~+ zvfso)DK&1^+)^A*FcFCh{4HBzU2s02%2-8mGt!H#IsTT7wAd|&JlnRZm z;zHC12hkb7&;@(5wc?KDcxyjx$AJVh`sR=;)5Xe6=u1P4X-xF>0Om1Wiz6%3(#RAJ z)hLAC?hrTc?Od@sWe~+e^A&j7QwoWb$~x5Z0JgN$kJBdagWLxoy;Uz8C{9_Y9c3lQm_d9U2;#an*Z*_0F)OD3S6Hfir!2bSJOWLLb$5hzB`2 zl`6>wbaH0>xGrZ$(JT>1T!{|lva_Uy)!4*K`*!kOQcu$)bY9OChnfpsH*#}`OQsH8$Z5X~2`b@($xv@@+^fal>lj9#>!bM^B$n(ll4h zxUuyNjq<=UWmXl+nAaFzl|51SWOy^g?|tYnRw@ z>86Fu6c_KZEsv)yo0C?-G}!Jf>THxV>(z#1)KxYQV?C?1Tt{QUX^hAgghO}_ac+6_ zwR*jHNvUv!ne-KV=w@+ti2hWK-)Y#u?uZAuf@t*FSn;JeFSjE1KxwaV)6f9-)sAC$ zGZT2zQZSOa@O7pV^S*bPQU&YMwz@$8JdGX>3kqlR;T*y_|V6BFd3BMc#Y3)0xblEID%A2@$AGpUwsv)##HV z(5Fy|CLKz2qSB@^V$69;_MsPd{= zlS*Hn8nfoXs>6%_?r9k~Z>?N8pQMRCd2;CRZ=ff`FsJlOBrZ@pu06;*$ zzg%QC$we4=j^WjudQ<7;m~2AnwiI!4U51!**fGf5h7=m8VS^Z|Ru_Wn@ipRxd>JO+ ziY!L>Ur7QYH(zjYDahYm1-_-DdT1SJqltY9hT&$48TK4>ospLwST9PJ-I1-ChN5xT zLDpfDC~DOskoy&x9%U`g2vV3zZBn0@wW&9oTRK&knLKb-msf8CW(3<^5w7NINRMV7b4;iB zp;_CU8nQ_(Nv_2Q<#2EMiLIqudiffZK}wgcsfqT=opE4I`RIq;`s$#lu1-prd*>oM zD{hMP>#w2>6;&pvCe3E>!7;k^QGSQnmeQ61&S{;O!hXo>cMQ9!uf?Znyr-zZ{-z&U z)@CSRdHQ`SWW5(#EY-%P-sd088a4YPr}vFHGr-`Mi!E#Il~`7=)GRfcpP|Cc;h_${ z3NMkAS#T_?Af6~Rt~?l$h{*HTBd(XwmFqnt6XXgKp@&ki)AhF0kv#zBuCcw)+@$ZhV9GVS~O!Xdor z@oGC?_TnsB9_I3->pc1JsUlzU$TTz(sjpV$JK)Qr=9#Twrz;&x(%|}sKKNM>N&nj$ z@4Az{eaXi)xQokrj#94+YOsCgdZ5#|wWoV6NIQQ6&C1x)Dwk2|f1@*@4#S2sXPK>1 z0;7uX|G+~Zw|S&osY?|LGsCg!?Qn^F8lcJiR;|9tYCFJzAjklSFWzV#RydiP2Yp!hEV(y4KTm463r|cRG(KI0@MyF-Psv8J*8BCr0 zOKdmtA#MEQkia-|Fh4>T|De)KPR31>*=pt>1;!;|-tLcABj&1f7r$l#2%ffj&bEvO z|GjD!43=+EBqE=sO*D%B2r{>)#I#?wxC7VVLk^KKG@aQ~lUP!S`Y$(E?V`>`Sjfl{5#!(Nh@(S4`o$IMR$Kt<>o%VnG=wl8&{2fC`Ze z0aGQy@^yYw?OZJh%F?>lkw(Gc6HUMM(z2EFi2)p5G85!h)sEDn++$h9zQR5)|1#FG ziM8x21xi1}DlD_Q#p)5MWxEb;j!$R%?Gu!VA2a9s$y$Ee3It4_f@L^shB|A`lw|g%&s-Z zxKySx^rO~7%nu2u*S|hHSp9f6U8$~&di-xqQMflL#rJ9Td|~&b2~3~{GjeIA zpDb-D#||%4bEJBo56@dl&#Y8`p3N>Dt7kX&)|Xv`q@iyPrK_hwlg3uct?ir$R}=?y z#Unu}56`Azrh*rtze8?l$qO{D;+SFl^=FhCD80P8EW^zK0w7zV2Q=~x4#}Ou-55srUhu9M-Fq-p!OGm@64HD zKU9dqj&U3vy3pjNRBtjJCKziBZ;rus-X|l_+df5V6W+{?PG+~A4;j~|h7$t_Pq@!c zjpxbi+i4@`Wl8vkXzd_KPAb|L*N$coXPjV|vRx z_3o&{Ey#$E?4{;#nR%>-wDTf%{nj3Qv-MB zSH>)sWu|VIN9%hq_hzNB+1|?MY4xc;@P4%3F4TbTjNkW_|JV~K;i0biLYVwAy@Y?k zma2*PDX+VxS~K(QhS-d&>!Fo{e{R{;+VMo!c8_d@2W8yY^$W_iUI4ZlO{*2{?55l7Vugewi11 zGzfPU7=Q8yd&<{xhDUmRl{WN|N_Yh^4rmvV)pd+@Io1Pi0Cs+8_FA~5Xb)s8t%M^d z=o_0~^SI)sc?MmCM)Ys4dkQw276H$RP0TvTX-Mwn`L z)O`5me|q?aSr|sqr#&@iciYo~ej#0ywPS49E~BzFgNS3qwTSYEg9-C@8t9LLCTPr7 zhH5y8YKKe^7<(mGLLWDe)aHrvGL9*20&f5Qf#Mb;3!6M0*#9JYfbV? z1o=t_D25_4i+QAs;CCZ_NPAhhI|tZG!+2|f|M!H)#Yc$7IByt=-1bd3)oq5PM0_`f zJ$He!xPv^nVVK2jJ~$aNI4#TQcdb*73rTTec$3`xH5RK!Blx$Q#->!B`H?b|lqu+!v$=k|@@j3iY)<5w+&5_E zn4E1XP~qZvOUZP-MS3a+X>qAtJLYITz$&y>dSwjpdlrAjDn)a*`PWHV*X`N^ms+KhK%*4g6qJR zwmD1r>2hhZqh-ihJHtxERU<}71_?ZlXp|)?pNDahC7CQz>Q>J+B)$iXCwPqNB9bdg zqm0R-nOA&zVTiZEh_+~^Uz%(~|E7Ng#fo=FpK0op4aJf8$f&-UiZ+UM-@=*oS(w`s zfqV*~LU}8ogPrw`~P z8P}*Y1(gc8t7!?8<;jFV3Ym!Le!7{NQ74kVDUkZNi)&Mv{I{ZBd7@0#qMGWE&WWMr zT9KWZYaQ5c#$~DI`mFfLO>#M_^`oOB=y_aolpg0B;)!>)1S27-i~lLCnL=x6$w;BN zY+UEB;WMs5Nt)HUqt!^S0BVLYW1AYND%<#v%s8M1if06?lE3PyIz?ZD$#0qotg~sa zF^8#`d4^qzg^l_qhNNy?|0O(@xO){^r#neh32UC(0#@JGq?jgaZ3s8SsVw#8d^qJ0 zG4-P)D^743pE7BYXn9cc2zE9{od-IY(?*|4h}kKt!|+X|ZUDqMym2 zqZw^shC#jQi!xTSBPy^oSf$B&w$B<{a{9J)OM<+HI=hyau&b@W_l$!0S%_Jwek(Z* zQ+3M=9PwI7jGL05|GTvn2UZSPMecT&Nqdk68ElM`n=9C@XiBZp*K`7co96btRMl=$ zD@KP2h0x;!gmYBP0>3zBT8t8+_oDf~HL zFvf3}x&CK$Kg?{9i>tiJ#vu!~8N8v#D}m|zjal|3Ao!_LrBB^Pq*;Y}@20gnHg!Af zw#VtX7iXi{|A)Vj8>oofte%LjQ(4B7hn)6PwW9)*HdU%1Y^u^~Vgned96FQ*7fup- ze4rdbthT43nZ88{hjuH#R0=m$7;>EHzhn!&_jIhz%oLi=5eY4n|1JO#Sd7i;BnS2oaZ*H7=t;Rsud!w_Zz=!!pz^k;(NBg|Hn}W%Fw*7Zx7AaHV9J*N#3h@qAQ{qn3-jb z)?o*ESIBZ3WX6t-xx>lJ5Xq`niO=Bs7=((ltGKNe-M{qLok4xoaBNvk*wvd1&c#|v z$ym=AylUG?rfkd&?%f^~%JO;8Zfl_rO5kBPy;>)ee%<28ySXPVwf>mNvufcgEwnK(oa(k?nCIN^+#*V;i>(wTiiOENY4a5M&X6n${N8J9j)b^%Qrih+vt_X z4r~KZ5Op9BQt$%vk?$Jt0{(6p{~qw+A@Ewk@A-}r`o0ij-0$qI0fS=j`_5+uU+3hQ z1Q3s&dXxmdo!%Emgs7dywJ3G82+XU#x>I?Kr|y&nzw-Dl1)SmXBLVYF|6%bm?@|QM z5Dq`5KXLC5e#r^n@;^@yb-?q_Y>Fz1HkV$rxZ+&($BbbY0B18Pw6gZpMMwV zkqLM;to5(4^hH6!FVFA>vG74Z_8Q+XPM`B@kM9@p^t+nyNgvobA@gV7?-~!k^p%=f?F`9Kd1MDY8yj{qYu``=D-ll|$uN}|Dw&vu*8OTBI$|6evMJE=(p{ObX!8RGqK;(!qg2IYLxMWPykz$dKT^0%?K!ju)8$EJxtD=F+kS7)_ zbX+7v1q@dO#cbdyG$TQ72N^;Xqjcp&RX&w)d?8OBL}*2|Zsoew>Q$@+kA>}8R_i9T zo6N3V)XeQ!v039nquaF^TfA87cHApBuUQrct2kZaBtnQE92Xu;yy#-jid(jj`4PtH zojY$HLyYRPfwCb*dGRW$Y4qvP1vv}h>x#@4q*6I@d@ff+jprfFh(eBSQoxTu7%Q1Syb=gT)ZiEjH2+ zGQ&a-AR^(wF%;u(3=kRMa0oYaV`4Q1Vzf>bDNf{RjWS}C;R7aQU;rejRMd?PAQ#XO zAsRBE2&(2_>q$Z*^{UT4_~w(6O0UquQoinrVy`{*zS^?9F5B|5JGu56bE^TSn5w73 z4zh*Alekhs27&_cf*?A0xraAGl9fr65{jwumWA z$SD_=(D64TxY70sEus~9Wc%EDi>E2`QnO5zzjPTamaTFY<}H;`;tPtAqR>R1$}K=C z0!52sieK&Uw%`hNJ`qAEE_)=#3O!)gT{lpq|DZG(d5$OwJB-dXB?^HE5FtHtDB6w$ z=p0(&w3R-Hid_e0GT^8f1H+(|Nrp>rzM=J-t(Vsm?=P6s4DaPBX_nTxQ6o~JtKbA3 z(t{=x15INFEOfysqP0%xi0A}kvFiTJ1)A$9*eJb2BttZ*USJ=7v0#DUEUZ7NDTsql zDOlyPYddh#qBE$`z6_9|fj`LVyKm~N=L<{>5HGxBDW6R|BPi0yPgFv=zz>r{gyA(ni%APq&tg-=hAc59BXk?c3{{n9Sr1t#REx-_ zB{LKf4v&K*BpzFavKJ&_Fri!I@uKLqM@4RV>r;vv;pn;Jz43LEf=n&GSPM{kGIUX@ zWWs#48ZMq|faXe=U|2u|t$;xVku*Z+Z26=(6p55ptfFY7hqo03QZIsQVIT(wLqOJ$ zO^K93Go9H?rZ95=&nzT06WN*?{}n`<)`X@uv2`A1Rw0QMU|$;{i5&Y3WO;IX3Z1|R zFh@QmlDl*y3F!Gqt?h>}8qmT44$u)Tj6i^r3r>O5xRiI^E1|y3Q$Nup%($$Fn8@0r z9tl@IjLHx^*^Fgbx=EFTOjD#ICFw`;Qb>$2$4^waMG0K6IZ58~FYxr@jrMiWQ<`&# zlYFNdmQ&A###A)=QA;7vnRLsJu2PQ1Y3V=2W;F|iZ_tY&qhP{`zgCC=gG^AdUrZ|=GK!_0HAh+;99>#f4m$G6xV}vRbp+YdhNN|4Y9BNN- z>Ql%eai;FNCRJ7tOqm|X|FD3t4;|B!z3g?>F3!@ZvD88eQfRh&VRcVgO}kO5a)p{@ zC?H4RCQ~zn!2ozD;y`;fS&leB1qc{H=XBE&WsCp;BXkoW0I{t_ARt4c`2qpNxfTYQ zC2~t;C|kx!*h%U%yPlnkS5+9T7;uHO^MXN{w`pwz+fG3PN#Vt%D zfOZ`u2!8m2Ju%4^0`PVU$h{(Ud3aEPmL;coIbu`~Ye{$B)TxD~E)wT?+W}rRq8jE> zXh+sZ(1uvV6eaCe&r3ay79_o0S#L>Q{LEB=kRx(UU>+#htGwI{G$}zqM|_yG>xW$&hcaoR8J&7xTypc*#ZX4xJO>t&JI54Cvm$L-c}W}D*M|p ztC!WUMmfq8Jr*>sK!8h@b(+l*^NN|mK~2KT3*8D~62U{*0qz;F`D-#wHN~tR!wEDO z#-fB53OVBzI@DAumY2Zi=(SMUe0_xISF$WPmI+eIsu0ZMynLRI37EGdfJhxw+iM+S zfgrbFF4*4Fp;avs32wdhzPi$+9yDlp%+jYS=aoN(v=Tgcpf`g|IT3m{>yIT9kCiFv z<$hC|O3uda|7mBbf?58BwdVt9o=|`SaSqE2lwbs#526c~5=&weJ`cZwfCH5vU=B!_ zZV4Be>jg*lw|r7}!pF3vdcRW@GU);1x^QzUT~6ns!}-=eEafV37T}GomdnQa73JQN zb~l0z%f%JaXLCw#c<`QLr58;89IW%2ai++ zHJ(6HGeM`y*92i(<^-0xUDTlhu&Ax*N$`KS+n-{5o-6EaOii&)1=p3$%1fs5a3|=AK{ zU>zg?HI}2Ih2y1%8JQ2!Kh~**`a8e_OqBaO4+AW~95j#4)41tdykrB6ZQ8VrawY;O zD4sBz3WP3lf{Y|Xs|YMJz^fET@Pkqi1VSK$QgAo}7_|e~KHBL_hF^Pb>w|>qLKY1R0AT1E{4x*q2ZWELT*bx={vK zIKBal2rj_Ch9Eg6$zU<7t-$F5+3dh=jk|-*MM1e!GfN*KLD#!u@K#Hky zteJU2ZA6bqq{69VN|f9Ze&Ltcu>rd=1H@oPxRSbu%*6{h6hPC-U1T*u+oTcMr0H0- zd*e90vb9hGr7n{jaS5}Rpvt2r2&2@?H83E_I;^?-B%ZV z)+7VoxBw55m}rba?wPWTq!O#zl7rhvBje7f3eBK2f)CQ1emSFIWB|GAh(8fS5MmMa zyHA-yto>6JFz6f@D6aKnr@!<+R6@+qNdyw)jLzB7GgL?`pu2{WJ_6{2*F?@=xl4!< zz*n43I82Yx>MVv^MAHg8dCE>)^3Z|HJOLU$PP!scD~?0Cqyij+|6wG&f?!QCsui^R zuS=7gyX+RFaR6O}Fn7~U!BoFc14z)UQob@Sz5~ksM5F;tN093RC`~SGib)WX%7?Q8 zofyy^l)C^GnwPpPltHF$tiV1kOfc=6!aR-O`z@gOr-CU_zrz>Z1C|`bDKcPzJzX^p z$%qPupZFIXG7BqZegeRy`9=!WcI%t(4rdBRmBSd9Z?5V%36p zRIIE_`+JwA!wWneHX;Nok#xMIWT6zfg?o@qyjky9hQ4I zQbn~Rh;vY{eFHywtj8J;M~plzo7<9IS-T}PWTh7@x>s^hNM`hkew{TS6_6{)EBW)< zU*XxTiJjI0%pj%DBCXAw43v9w6}!rs(pXzNvPYvBCc1pe0X-qGNW_b}ThmRadJ@W> z`GAgS3Sf*`^(o37_<{pyB)lSmbc_x`h?idND*{ri|J+pAo~+HgO4bUfT8zP5r)-0UZwE>byS)E|~y*H=@4>DdBM%7@691d6l;*g&i z?9~FUH92g*^$|fbH317l)T^yr_6%Tco#GLVV?UDh!*Ry+_QFkU&nWn+uwxyTjX+^kL=$fqF=%9b@=m?hy$ z1upkYfN9ASoSr_PA%f@DCOoN+pl80iB!j8rp+_ZV36%+@)uV(iwr4J@q{i3YbZU~mU(0Ql zsGeGvjh9{=gAZEKP;OJqcGEnB(C=i=GqfPk;RuHj4dgwgx`R)X&chg7>DJO?dDCdC zVF21X-k;1vKt=T;{*)#sbm_yvyG1 zj<%SeZs{o^y^KTV`)Ucav|A`GFD$c6L9qKCi7C}l`C?(clG|5gthBadq8&d=_IaCReYdg}qyNkbf$ORTxULOe<$faqa0C8R8l zgHV74^k$=ks-fgcH-x{RBvR{AUBA3s{LXeg*l!l2-mXpag)eS9*WO9YWYc8_b|B6B z(D)s8@R{Odsed`BDxQN;@*BYQAUceGEkq@{38{%!-Eg|M;*)7^73o@6YOYH%1?s7P z>6g!SwsJ}t&qV_KY5YR&r1!{`9UG<(_v02~bYJ_6kMfbxa|wc)mcQ+%#BYF<*J`{= zuM2EAv5=M*7p+ZUmGqb7f=g}hna-!p!#u~F1nV2jw^Utc@omxDZabjwsF8G11XSb+ zrqGG+z6EO8|2IP3bZT)r)|)%_>XnQD9^sSVIZq17c7@=8zVm{^h}8znTmoFv-OX@diX0Q$QgKbJ~p24(hUBc}%KO&}lz615D}Mr*niM_wrxaf$u*(kPP7A z5w!=1MFO8Z@gZ>0ql5`P9296Ki~$%hEKsuI!o`{#CrZ$vu!N1kB@G4gD!IS}N)sbj zvTQ)IB+G`Z(#6!H2O}O<4jmHU2Iu5SnQDeMa7i-e!J-F;c)$X|CWJ6ZkrHv31jUFf zTBeRH!gXYxJYUC>Eo=5H+O%p9Qiz%J?OLws=Dw|)Gw#ZCdHgl?#S2o75!4lcvgbtD0nIL4k>iuXG9?Ao(Wu+7e`-W?=K zY+niBylxWe_m=M+e!bob@&PwtI~Wa`C=DUAY~laE7&iYvo4NyiIfDdmVNZC}Q#TJ)RsLdo-dTXqK z|DcCn(uLFrUGimGZNCX|)Jj)Sv=S}@p@^7eQ%ILY5-vWqgfaruA|#RmMHoAz-bV#4384C^9j*FMs!Z-p)j$~t zmi5z50)6pXq_d6T5rhaGLQv}Y{{`!&o2~-@ z6C^;jEldLGuu^6MWv4ytp&6vH!Z8rAJ+g2tL|FoXl_EAIUhz&uU1469@PnW15leU_ zBq6b61eW%tMN#4kU$|TdL-LvLd?H)l$snT`7Pe=2@f#G;Y{wRX*nxheTg)=3aEe1f z;uM&Og#SzjFT4DxBt|&HL25{bEe)$HUpN*XwB#UO6b(#NTv>1=R4z1dMTFXeQINcJ zL9y_VEaQt|`-UNqdxYyAe&i$M>gX~B6^Q}A;!3Lq5w}U44ii-H1QVNxi3GgPb3^c4 z0m2k1c?kt$nURPl4ETlVz{x%6QHiqPWyZ|KBnN^l%SLMQ#v;%X|BIrbBg;zp%Ei4B zQNz&VFQL&8Kkl)Y+EHO411LJAIDvjLcxFOQ$Bs+*>lD_+#4`K`82`ypKJ&TQg1%+~ zPkvHH%8+0!7of{D4l8Y)n;bXBa;(+p2|Ic)&UH8?5|-ovE(ZwI#a zgQ-wr{*jN#+0Q^{)XbF>k(r;0ChQ`Si;dI#jG7B!*oG z38UOPi69bGVOOY8hRRwAJUEptZNM3%5%T#Id@iC)MZJk|z;e8Z4pU|?Ys|CZTIR+64k1oTblVBtbe$WIRU?!7h|N0u_(!m8vc!6LCan0Hu z^aW%QEjvU(*qeA1v7d6!YqP4$7~Q&6L#<>JR=uO)ViwiO9)q&K#G^v9n7+k+#Z^wI zXiPlYRqu#)w3(?vfvmYiCLY2O0~3|eG8x4Ud9!S!SxV2aw9<@F&SNK_72DWZFQV+G zit#Ke$iPH^3vf)Gg$+;fZpGQ}iR-a=yqsgNYT4~pR*zY25od2yT2qnNvrzybB{p#g zLO=o%gm^C`96<$;W|RE&mmQQmD=VTx0VK;crhV;PX&C$y<0rN?b{L zMw34Fvscp>7FLfl7T%;!qkP;;Z&j)=ZgJw8|H?R5#EG*a!1IpQqN7?1CLv0AovKu8 z&9Mp@(HE&3vnx$peMeWY492j6mHlWdw~q`4f0e=i$;mM$Hq>8PL1YhVYH){pQN<`m zLoj~bVsbpiRQGJYpUv9j%Fj9*vTHazF8?YFab7m z>T#2APGdo#FN&}Y@6r$M+88S^-KOsZdU2(USF^|vd@#$n#Hl_m>M9Q0l)5mvMH@))OaY>y_qZOGg#|MOu01HSCK_`X&47cTDVjKlh&x=wLa3kmEK zAG^m{5AM!iR^-wt3yu~ccUZyQFotmx<)D%RkKSDqu#-WPlWGDwM9;xUQ9>yU0piC+S7U}ivBs;$^l zy;2#qRQ3rv+;ZbFwi@3p3h@ofb2ZTij!5x-pSP%8>;q2&34{$&!nj#S4&K1O< z=SgC95h5X`-XlJu9j#su+8?)!9X4j;94O+74HGnc<5XyXS?Em8XreK3V&svdfCP^l zc}2jv!5}OiQGL)B2HZ~o|Kir@hQg3yy=dX^{o_lZk(b zBsn5r7jOX#6vt6H(~x)s-bF!<(1FeWa}o}@{Bp2m@7{iOvC z$(gxS#X#W9M6svSuM(V=#!_SJ)=~ZKJmd z3AwS_+QsB=E?bsOj}E-yN>IVTILx_$ia=1oW$*}d!b_`kN?9<(J9fr&vf*xU4KA+D zK@{XK;$EjbLRWl7l!ci|kUw(hZicG3Lro-GALIR6xY?DfA;6;-Qa8fXEj=5 z_Xub(tYx8$|D|S$Tn*Wt0U`wo*d!7V(e+r*W`x!!GR1hY=N__wtI(rlx(JAd;v0Y| zjx1*Y1z%#iV3v8uksxGjAqeO!$C_;5wxC53y_%79jt2JEMbamL?kHK}=UMt-=mn{e zHew^XC6dA(n?=2ftICH^&p!ys-os+ zn$1Xyr2(~8Yg}$4H@=LfE>zk@X-sq~cyTDL-r1~HmjrJW^Gz)O6F$_B`mgjYtR^Bx58Pd z=BT>ZDy{L}xt{7+1mnGq*SR86g%V)OscOlptDO=GySg36rt4sS?5CJxwwfI?Vx5n+ zCd29|?4c zu4-+Bx~%MQtwg=5*gE8LwuQN55z->XTrwl+edO!)t1~KU!Afe;E-YClZ2#3K47s1{ z86xf7r~A33cd4Y?`s-Qr=G(z4@7e3PcH-7H0pv<)9y$uIF7C+ENSX?!=0a}fMy}GC z|3%!zT{vp$%yMK|@KV5b=P#}a$pn_!UeqN!f-rS0B zkM?V$?ylNqTo8B*BJQWalJDxarM3?2VkPepCgJZnWNwv=&saszVDH|{h)hb3?g4O| zSZ_M!)VE4rs1no7CN1o~Zb#}L)r}r6nWfk$+;27%BDVc5Ce2_ar&HxvR&G=>yUvCbVOc6GzJX|VU5+TF-{~!`~ zFB7{h;Oedt7bwp@urxAO8W_~i64d%uLlV#B!$u;s&Su;C?h_X(442EO8eju|>Ke0g zxI(RVKrrCm?2aDd3ajl5LGcM!!xJkp?5?ov$}ZhLD$!u^6B!f#U*VdR&hyEqx^=i5Nflt;<5ME|0ertqrrx; zfJ$&X6R0ECGkz8`IR~`wTHP-fG_nSBSq|?mPjLn}aXPgAfL$9XmLUcrn@}i2b8B=v1vvSWGvpqv= zL-X@V*0E9N?N;+BQ>S%#sB{K5ZQXk0_u_LWGc;OQHBG;BT!3&O@3kuv?=&kjZfY?~ zj&L>C^(;p!f2y@&TPl;fCQHXL@uFT3wvb_4HCA6WLeaEPtA)l9|8-;+Efp8;VvqL3 zJ+<&=RS~<)?;f@>r*u^VHvHc7T8A)!ez3!WGaf%GLG^QPvo>PWAZZ7;Uo&airtfv| zEa-(XPUAIbYxV6C>NPGRJx}*wf3{B-vS;(LrJ8aMo+W7)w{U;<*VXlp-t}*%@=$X# ze`0e-dv}2Ds37NZV4F8G&uxKPT$T9R*~zD$7nc88xhhjTc9ueO_| zxTpy-Ml<+WuO@pRIN>stgtzy819w21wrSh$h66c&!}vOH|8_YOEqf<l+b*H=^y$*|F`IZ)8+T2$bcargG^WFNPK+qs-W ztbQMCfcLkibFecibR$CnCy%qM3pjkkI&&X5v)g%X8?v)cxQdPUqYwC~ReAWfx@$N3 zu?LN^5A~Nj@i&V&q;K4(S9`!RH?ns-gtN6{53j0E|0BEak}DUwf=6|HXY*Q|`+KXl zo=YoklUg5xx9J9MuOIrn(~MqMG>A{?!_Ii5d+~K2DSm$&ZIa}rspg*(JI5O>E*oyV zdo?Eud&2j7!&mb)OS@#RZF7(Lv--QYD(kxgw8~$5$sf7B%X(O2E59$fl+z_)N2$c? zdrq6Va9=oCtNU~vw;<)b)89L*i*;RQbF>3|lhZi`pSnf+CpELPWm~q5BQolKWRXMn zZV!CfD>kXiJEBhXIwv^Pr*9zpD@w{O&=dW*J9wGrcM%SzoUE4 z&$&#?vwiP9eIt5rZ}rWW`DH_X(Jy?L6Z-7t{NX>ivBxn{vph!Qy>U0Wm~XGwe?CVC zzRElFu6O#(Q+n+$I{p#9Fyc3Uc^?!Z~eLbcFL=b^#78NuY#9+dNX&5$axKLq4i3bbLv8XUuu!$Qv zPRuxC2E>RKNnY%@@M5uIi&VBe7!qd7cr(|%TvxMNwU;bwo)qbmCe5EdiDKMjlvL89 zOPMxx`c!B|jUk`%3>uVYRjmkF4wNcY|6oUlV+m@tYV~7IwQJKZ#d))*POxlAQUt1& zB~r92HzvKBGcVnqSEClgFg`Rs0xoVX6`ZLxmgJsn?NXUk)ToHZS6mQ}MF> ziWu|I#H($VF6q&u+{79w4(15hpx?hy;r5>S)wj}kv3CzoO&N;r7|L@WcmDh~NRXL> zOONV&k7wy9zWeM*QY{kUIy< z!>BXPMqClc^JE*ZsTDhfa@^fjQyff`24LLX-3NE~AcMOM?(XjH?l8E!yIXK~1`QA( zxFlGxkg#9v&Hjh&KhQT_b-GUXc^@U_zm+Wt{99gY-8{F036t{Kvd( zL1h_uUa8pr@icaj>mLth4I!~CF;)!_ukafN;Ma@_Evbtzf#LXE(^+$FarT;3 z;=pqMtdBJTH!7P^@&est#4;VBrE%6OBf4SNkX$r?qxs5YpFleu@|SCs(j1~D3#lF2 zk``MpYKF{OHE|l^sYP&#a!(c{e;#t|0C>eI;MsKy19UYNq*W-pyG(vR(ROKkr&?T} zk|doV{4Tb-F0joKUZlfaZd7$6qS=K1u*}3^_10Fvlx=^E6Ns;L`aOzg>)bQ>GPFj{75DBD?N>2rIj4tO??^DRK1R7i=+48~U5>9sksJ z3q{4>-A;Ow)n6J?krS3Z4}vW2aU9&9_EbgFk{d zdD5ag^kRd?(#1f&4-tZI6#dkQm)Yyo27EU21m zvl#y<0t#5yd#3DK-sLS2=}$RfxLD4OYlpUv6XOn+Bj6h|bH zi2vo~PXl?UvE%F0XVpw@ATqs^V%n;`@!c3BJ{ps4Vd^?#oem(_--F9SqfqxB)+)Nf z@f-d&fkE4hW4bV=B}#3>sm8mYeO!FfJmuePLGOhJwg21(6Ot5*kGK9LCCgvy&J<2Q zZj9nNDdwesEnB>vgKBFl*=mjzv(gTRU`3_j;Iw#8@)X#U@lVF{Van{GkbDh@n(&iZ z3^9hof<}M(3VqD!y!`pYglJli?&|MVcnj=21)3jcb1&ytNKkcy0>p^vcybMFZ4U+{3Butu_k<-#6Y(|vK2q|bd{hbA1vdiA6$edtY7PXdNV|TOy4mp6rkkZjRQtrsPtU@pG|t&{izt#A2IPf>UIycs z{jH5zYCZ!Ng8zB4xSY`cSGZOFQ?bLzV1Dh$UuTRqzSIH6?)3VQ)CeC~hV$SvcM*0< zx~5JF9!ZK&J}U+;`$268;`ARt8@B6y^s=8K8qP=g2S@_A%p`oKb~`MB<5=yXFg|8y z`3$bk;BAFI!_Wh;PH*p;64>wtX3@(V7LN zQ3nHJenK>}O7c&qju!ed@DWX?=67!Q;_odm+vfHjg?Ej2G>>i?)5gZbdZuR6;!ATv z*{8Qd8gB>2v(u^}kEC4Eu;CI5s$8#(o@UO{!mO*>_o?|R;fAr0c?!IpzHe5E56hWZ z##o-ob2QWZdCSqwF!QIk-MPL#@j6b*4e^uFvv>bJ`208Mj;9)Ng}+fwpB*6Q0E8+y znsTSmJF+IYib3CbD1BuWR< z`pVW-;N5rzg^_ATf4e?{_u-8rYU0a*ed-c*(F_2otuOnZ8 z0G*Z+*^G$z%~sz$48!FSE32D!Ol2N&uDlA`TZBVdIy8NrePvCTR>hUz)jsBBCLHc4 zS-tXt^DZ8JEas z(OG=PyUI`HU)S9#@b*dJHp(SdNt=U~16GP_Nxxpn82n@}`ZMS~kkDbBTl8b*-wy2V zj#=uR5T^aEqg5B+;qRbLn|ocZzP+9;F^}_kxcO|So`qmWFk7w7sVp40Nea8&oVC7P zNj1zgh?-ax=%gSlVztD?qkx)A+S3!4fX6CIm?8k?C62OA%U zm>M6Cf{=uikc^s;f|!tol#q^?2oHydn2?x~odlnZl#-T=jEDjUgOZ7iiW)#eK|;g8 zLd#B0&qznl#>0q(&q7Vg%EimZLC?-a%gGJkq9);CqT}V~;}xUj<742H5Eo$Q65!zx z65NAQ%aaiT2>k;!T^-ymEi@*DyyqX@~LWo)D%V3RAe;_ z3^nD*Pt;Aaip= zb9-}3eMK7zN?RunJFPGF`cn3eAbTep2Qy7q6M5G_0yhIGHvH!mx_ zATzumzo4Kkzc4?supqmz%djZLyQrk9xV);Qyso4or>wlDyrQ+0# zxUYY>Z)o!C$n^Nc+}zyq(t64g#ASVBdt>oGM7Q_kYW3>s_Uc;q`A_=?~peZ<<#J9hSBj&PpEV`@L%3 z3BU%ty6?k*Wn=K~y$lSh``$QO3kCH6S&iN`uk$a=fPn2 z;6;+!sz1BMiF7~bs9P!8c&fJ*Q`eAMZ=5x7WfR^pOr*qLhLGRxPS9+ zn?hsc>^V&nZ(I0)@Xt3jfyOIhCnMD9Qyj2NHbsn9KEkXbQOdJw@ zlwDaBXPp9U2b~q^Zl2Iby3PqzOkNen_z)b+J>z8YLLN5 z!FU=kP2gbV+qTBwQgixlciQ6Z^Gq)FgfQvgPam^=5*Qyca~rH2KuT6X_1Bk8WqnPD zXza%4oqgoz5K0Z5zO|#HrkIJ(^{8h`f92@-sFIQVhd48n$954vh3$_zvMW~xk#mx1 z6vS&AIk{kx)>=0T;^Mr={k^-|+JEy6jp(?3_XD_(divAK*948LG;%lg3#9q6-rxz3 z*(#mc1UrarzDt1D8d?MjS5~tDkylB`m8i$qQXAua_mLt$%WmuNXFN;IWxFG*8%IsI z!-ns%5x0X#gV?h_nQZ58J*NGe;-p0k3eAI4nj4<;Gl!b{wr!n-)|I~Eke-ZK+kf1v zwpAu4Invn)g4;}gMdz~9`jx$X(o1Yj%TgMO10%PxiMw+@Qsir{EXNRoW&#cT-0QS( zTw3Z0YRFh7o~8DQR-7?|dkP(kkza0mUBz9cOifctf2Gq9QI%>ZrRsE+sM)nLJ-o)W9Q-Tt`&>|T`Kq$2_?jirC?u!;bi~=; zIbR7LAAuE7b<&yhgXlj^wF(}YnR{K4VyBUC^bwlDxHRJ%%4c%ysI5I6b=G}hJQbh= zlb&51jIxfK2NI{6T!?1G!@5dgn4q?~41!g(=rzeKxq7W})zhZJ01GnM`eQpW@S+c; z36jn#G`q#%Zs#BCGGJ^jYpQGOz_Of+e?6_SQ|C4vrHJf>`!B9|a|~==N!tZ&eiO1+ zVUiXEDIeiGPp0D2oi?}DP5Xmc6TPVy?pMIo z<=E*qD-hi&Dm-3B1a-ZnlR}K9sR}^?G?qqXhO<4X&uMlAcXJbu;}0NzhFeO9sR7H$ zB^F83&C#Qw1TMKGKuaQCj7Rf#A>A#-8QbXJhS*WKy4$t9FPf_B-o`8h4OjB?e&kQ) zSF4bb+$Scbrexdv!gLOF6Tn#J z-^a3}k4(*-EwKb~Zhhk*?NFEA1r?tMZ9{Mz>q>mFPyl*PJzhLN1EBjjZvjj+ic5+9 zqLLcH*92;?<#OJlFpfygTQ}6%+1-)8vre_5f^XEtn-|fZT8jMI02);8V3gN!iF#O| zM4v<^9jVVOmK7_7(^6_cIPSE-Enn~cN0`I)N%5TQxL?Tl7@tF>|5*1}K{;oHvZG|w zTFR-V>8g-L%|FInTMBX3PyapipZEbhoggy+bgGF+;(70>*s>t_VP%#_t++Vr+<-8&U*?B+Z{% zfD0%JCv!Z;HkiH~4K)0xe-0-Fmxi~Tahb(zj~|Xvhgr!C{>cM%R!7q}b-@iE=z~P1uqhv__;pkbui;rCkX#KL6-co7la3-6 zZ|b+Cb{|_NQgW^AOolV9wf3%hKq~KNu{?!g79XAM>w>p=`eT|+GUF+l=6!aaGc^@z zJ}58YzR1GG=Id_G*?rl)^8j$mVt--$tKdR^yiTE^+FZH{BEE7>5PQk}x3;J=zj$KV zRSnt%Ge!oI@m!0}6q|2$Ws_~5Ws8m?AT}E<$H%4WJ>Hr;(mh1iXI*oaM%&TKs-u`3 zd9P%bO^1Y4h$<0JRh3spk;pN{vVK{#J4;^z;vSJBxqsipXBvJuzXO9`HE#1)W|hTWGpX(r#ae0GOZQ`~ zMHlOEu~|RrPis`3pn-zZ%XN^_17SvAncqC)mUqw^;c2p*6J`k*6`{GIOzhUZ5Z zPd#6US36D1FFFyQTmWCjr1F9|wKZBDcgTuR*$|j=SQ&i{=x!{;;p|3q2!8H~>FV11-5!A6B0*vnVI;tGD z_W9M+2MFQc1l%8e0_Ur6nh_(YiF}~!bXN(KW@NO;iL|KJjl|_ZH>09Iz0_T{tagtb zW_0XfbnP~*qZxek|1*VcXY@@fqm+nz_AAX$e1O`rWP>t6Os_7T717Zzo{j?YUx3~n zxHi%+yd#M2!bmZqpK%^%5dVKNzV8)bRqGLverkVpT~uHBXkXoYdqI-)N*qY8^9ZpO z=QJmsv5^*ZjT<3iJl;R7cvAghUSE9wZOU_Qg%=4Z#>d8PoM0cHCGMZg4f6P3$wt+7 zsQ~4JGvqnR)*ZyHB7X@uH%5x5RSPbI<#+TFySvFnvfMiur3thX2CO|k7?RX-HAnUI zCv$}&^) zL`iglNfD#*zv9&Ge{kc~7~E~jF6r5ZMJC+-2zF=u@7IY*hfhWqyd$?~xE~>x6-0lF z5cn{Yg3XkU`*~^qb4DsDH;jQHZLr4D%O@xZ353I_|HVQW?$~P*;-%!1%$JvDyJ@7z zlhyKKzxM(V@Q+~W)is$)z>^PD?@jAIH=*xII=^tsyqBW2%r4hUwvBg_(RC%u@dDbX z7|nR{#1k0ic|z5O`#_@jBL?XWoPl zSv&E!^fyLDAvq)FxQMt{S>0%N^}JmBSeI9MxwsXV#J8as(cIo)Y8cyJq3SOh3H;h_5V8RPIcl2KyV*YBzkSG zueG1cCtYF4Th3`8pNNpos=e2Fp1NgUnt`rwK@SHGy+i~c?=jjpPBVXzH$E26o5RCr zHYQA(srVo(TWBo@g(R#jFZ@(r%%v`cf{ypFFQOvaQ=ZWvkI|9lpxO71YAo+o(vW6i;l(^>7AIOE0)G*=&?2mhWw0%n-?G?7^iYE+I@Z)2UKk=G1wKXB*7{}s(G{H8>*!ncK(df}pE04YN$F9+JEDap1)iUtTBXEPKY;nno>x|o4d`3c^+%%QOL<_nq8)p4aVV__h< zM&^gcFqG(D>mBb`;K28egPbHw;l_r`G~I#R*}g7dUuWH#jJj-f4v9^QPe^(kkr_%i z4@(HCV*Slr$+u}nUX%z+r6y&F{zX6%#=ECrps6W+Cz-!ea(`#yYZl>^@X(3&hGvob zZ1vqscw1k`qCzx`T@!6>=Ql-9lHB^0&3Ml)Js}a0cV2srT<>sHmTN%>_ik6jblski zdY<}Vv4J$*WIu?+32{pkM3SGBP|Kgkd?Q0)9az8>Z$HeEpE{RHvFXG3nHbV6)bSKh zOxrOSm&i7guXskxL}1^UfLg*@-}WRpu!A7~HPFClqe}XujQ^S9&!ZP&Up`;KS0nQ_ zT)Tc~#(rM!p;kO^RQ#`h0&Gq;hL#L6i3~Gbk?V|6Mtp_bM(eZNrblRIg2hSwec%J{ zXxZHH8zzXNNfp(NcoG^NWx@eHblz?RH~Bw=f&fktS>?edabulK6@!BH^#zu#ieDu_ zog1Eg!X#`Eb6?Cd84qJZIuhe>;ETnE$hSrlgp8e4P5Y5zF=F$|7ggS)E%8wS~28ZYB zc=Uu%)=%w<&hbv`t~ZX}7gWLp35CrB+Br5k&CKMLPkqcxwxhXY__b>&$m;0Faue4R zzn9+MOh50o)QR}&2f554HTfZn(iZh@3lA>xe64ikZh92}eI{9RA{(C)uGn9xg_MYh zmt;jD`L9zUn^APe)8HN^y~*273jb=Zn8ho4L>~hskae>Fm||WTQZ=~xHImTz2#|_!?>Q*=BN#=$jl*p;I3yF zS}YJ)8$LbhKK%gFWd0Wx4qat4Q}tyCgwt2UWZrtNYgK;GjgCqf*p@U%SAmW4;o421C!|@Fv%fIdX;NlLryqj)>_URgD zUH89WIgezD+b=_|IO9iihUK6c%7p+sp`Vj8LpV}FfqSjUi(e{4G^-|EZJmhN2biy7 zIAdL2hRf}Cq7zcCpY#f1cJ3wljf))A*_9rG_9KRnh>WKsDy_GA5ALy%yP0;)ghM=q z{~-+_ACvZL}b*`}I*SJ@^WzQ%tsLz|QgWo1EMNviI3{#w6) zaJbSOAj90kJ(G)+w|{?Akt+OpjS#~c;#VhB>cMvA-BfIz)HN#lt|pcNq`Zo%Uo!vR zXm!ASbDJ}bxU@%6Tq$msXRw9C^O|f3!otic7L55B)E9;S0=2j(D->(E7hk@wIWvR2 zw2T~)oN>94)0kPcaC1t1@}oPrEc>&uAw*ojo?PTuR1ZcHNjvD@zM=bDeu0Gk*E&iS z1=atEy%yPzRa?=dSjRo+Kaj5oSOY#F8a?$x$tYxam)%M?bIAxyYKp?%m7~d6B7kO; z-K?fmMC6^>(+@dwK$M?${)xOs#bh`!VnU@q_mWaLK&D%H)-y*j7QxdaNt+i?mVv{P zEEph{Ti_&>{rnSmO;zr}@ROwy)pp9$2 zmF!TR;UrBUMMW;mJ!di`)2W{2vUm z-dD43)s|)DnKJ-YV<>kAy@=4u*@_TT#b@x-@!QLl*o&$IS@6bApwN6v@RygPn}54M zSx=uyTm-M!BNBxMWZgNNGt-pV`A`kv zga|goQY;xLR1o9i9HUHQd6bJ(PGCt`5)+FCejWoRC`++A%HT60%>|lp- zsmnrCw%cx6D`2dm+eSDISRR%dm1GJk63~2uz5zH|8P{-doxF%hthC$Mz_n1J!%jly zERCXKW$`9V;fomAl>d!nWy5ag_6ng2NqfWM%eD(Yb?TXU+fBrFd^@(C-43_T^}MKH zmQ1iVSjVZa{>)aczw=fx9&?E7F!n=j>|yDruxK6a*q`i|x}2JOS%F2~z;J4YrTBKx zWVE6!!>^NNP$n=JEtJ66yHbu?p=R=c%-QOk=0-~`--Fg+ z#6f4z8X+p<09tLAEr;s_=g@2ZYCfZDr7A++!+sn^3@4cui$cJ_DmKGT-hMtD(z4l! zYM{2vxkl5d7;sT#HM$E3BW1?@E{c2IBOTlmvSo7d{m+qk@_z`Rd7-l@L}0b!R(isC zJ;&5$6Ib)y4BrF=%9{Oz8uN)o7agu05w8CT32EHu8b-HW9eNafHh_q1?huwWN+}X{ zJ9n1K?6aI>Zxr3yZVws9Z47RrG;%0_98ug2nnACDen&&`?YXP#a=*zDXRKIluA7~d z`9g{k*)#~@x7dLnT?nFo1eS}J_!G4i1^~7Y$v!Ndmz7mtl1jRF_^wx%97~UA6#AWF zN`_-t-47kgjNrS3@XDn`gex7DY` z&U&%Z#=s5%ln*Hg7FZ zI;F^eDk~zmK(pD-jYr^Jz0?Cby^PqYY`BPZgaAR|ZtTI^IKjjs;*Dh$$`GbMAqE2< zqZlYM);q{KJ!_PWo{EYVS|Ufk3j&$#GFF5#3!m~pYzr(;aNP@Z8632>-ok&Y^^5`^3~mp|2EA|^3w)2(B!HpOCc=MclL7}mvE z(iRoiajF$(!J-^SE;?Mtx?Owu;Szc@H=IMCGDyz*pO&g@yt2VDF@wvsjvx{dW8;;K zJ90NFyfR+=t!txA`d7E%l*@F8sI_mc%6M=?h3(4m7^kk|(ajI(o`uN~=3j-67urZL zfBNj+#uJK1=0q)fRzema$qoy4`{E?d4jEoMYxI}x4?b~Q)X88O@~asyk={f4ms$my zyeONi#aZvN*qYz4-tscXQbeu<~fkyYTewU>c4K?)(ZA$3soD@!{qXi z2E~H#VZA}J#9_-Hth@(S{n=?acr6Ip zdS%!>sIh2T!{EO&kFk`r8Y6R>ZTm0xZ#vu08x!80zE8bxA$~6Tg&=Z4|84$zwr>?Q zkC;SlA@OfjtmJ;WmG6XqH?m_h2Nq_g_;rx@-_vOE*|(D1fhbHUeQ(wC?}(=Ni*oH- zD@*@m5qbG7!bTxx7@;wygK zJSg}d*GRZ%(zvAKp|H}1N4e_vgG<+>cM&1 z0mmgV$qA9rq?6|R1I17~kt{^TtPlr@l-9}Pp;C{MF@r|V6&I__=%Gp6?t>0%god>s zXWnUm>g{-x?vzUECAXWg7M-@UY`qcU{NY$Em<08i6g8ud%CnS^lpi@Irq>^Z1;vUJ zf!`q>WYw0)O8j>m`Ii9Q(ImcX}jn#soE|n1v(>i5HHQvIJXkgBaVEY_7PFz(-5bHzCc{h>g8r z4xBi2II74pA3vx~si+XA#~7s-7Of{A2P9Jxu9Opo$V_rqvp6Xkz$`?#Pe!kgPwx)$ zmS*MUsqC_LOLwXOwRsP=2^vnqXoyAH`X)Z(gXTirIX^uY$Y2HSD~Au#;0^qu&-Y*n zHQN?76a+G>G~p;P&2l;Bt0_E14=(0UpQg=>Y7e;Ko*GrY@MM~?sx@{>y+Ra`^`L1b zm1GAPoai|3!oMH_Re$ox=6^`Wn!#)9MT2sQ?Wm(;+(>^T!7<@P-DWVF&P!sDE+?vo zg*9Zv)+t4jr8S(82%)T+zeOrAY3wRzT-z<<4h)=>hmXHCLf%IN!m&{7zjPuu5IgsJ z{^$nM%4jsoSi=>%?L-3lR3y|V?1V~zWSY!+6M;%fdznH>aU+(EN>II;OjdwGZGQ89 z;zMY9YU)9Mk+~dojoK5uFIsBIh*3urZUK7562k_PLMQsN*UE{2)lQ~qWjx(s zw{#K(>`jKjW`7~uVslpUu9zDQpf=>rjbdG=QxIixpsBw?D^jNn$+)lJ;u8>)Qo83h8P5UBXXkc!}yqpdIn9apX%#tDf!8Kwu0ccgT zQ=akCszg*zZ&J$OfCxb~=|_+6pt3Lwz^QG|@~3C)8j7tJy3x!zg@?h-iPYG%ank=9D!IweMU%O}4Vhknw`VEh=A`rRJR`ly8Yaiu*7l=^S)p z;bA)RU4{?ukiyQD&$SJSqrWToC=;h`72#Rw^4Ls~LumQ>G=Hq3B7*ly(igl6RUdZh zkLc14y$ZIk>Pf0}nBR8`igecSzZ&5USl;B)Ny2Rho6bfmGrTf?mxmP zR!sly4>OXtJx%HrtKe~$!#r4*1F<@h=`^n9@$EKfOe!cGAV9cTV7HJsYt~GJBsOka z{vQ!z(g%aJ$tB0XtOYdGr%WV!L8jYPfY`b)5Fas@UUZP-{3F+xO}c3UUv+`j$g0X= zd_a%i{F+AwEerv+V?3B`Mo#)KGDF6zL`Et&?zS0NM59)?RyS`g~X^!}8=Y#qI@ROmx z`zFNl_w?FXSC@UyBj3bBX2eKk*-+(_Nwo350cW>tEBXN=Y@H6BVm_Tsc|8|PNu0G& z>7*^k@R=mqLhVWxqH5mKY6@pdxxdE0HK&vMY|qzniFIsnT=ajF=g9gjS6Pp|y&?1E zg2lHZK1qUL5T5&tL1v~$KTs!CZ>;e#(pJ=tDH^*B{_bflMz>PvKpUj1@nC~KWR~=c zt$$9Gq8S)RxqZKbyQC7gllcw!tmnkWl46P)X^}Bf2N*)gHM1V&Q@@4U2aG+&)KSSo!;=J>_JVY92Kct{Q+6YoShF}jb~ux?>G@uR3R}- z_I@|0wM35m%*VfSHc0~S(Ojz1!dzz{G{2Hw@)XtjvlFhdTAFXDRy|*FLBjG5oMWk> zKEHQcSCc3T49^QhY3^no{=qISRQT2-g=3B_^JV)Gm480 z$5MxLr-Q9rjiy`#lNiEv)}(%)%-J`akVVfZ9sf(}QQY%nSQh;Y&Vp<2n)AWt&#CUZ zEq7Dk_96k}w%(cRL&Xq%FRZu(6_Rcdp+uF*bq0^2w$DHPF?uJ|=*uXj-bYQ2_SRE< zaCV;!amLZbKP0Vw6ITe@SThqKl-s&Za}Yh%8I%0b$Lh!5;!6x4hw`yYX)y~iw}v3t z;h5D~vI`onIRdyjfIK!#vzFZM|TUUS*MuDcaX=l*W8hqY$SVlZ({smZEd19Ei_yBx!gyMylj_$(SJKYUtKu)zE3 z^y_$aZ(JG-Edp-mYK7BBjcZSgzkfRVz7^3j1l#tBTB@N}gT{n;`ZdW2UnXUL8#EW@ zb9l+wFO#|fb*R}?4wQntv=WQ6R89DoKO7RCes4@2I`DGWdn37q&O6JTqy2i6U_Y`c zIXgU_;qJ1h_fRTVcynBa*n~qna8ZxRHtA{xvTT({EmVy#7hcm5c`&u03CbHbJTx!f z`JCSxjJsplo|gt2^A$bL8EYl-_ma>Or`K?jeKG86hM+JJh{rlsY^AU=sL1yRms46VCYLn;XSq^90PQ+yGuHj%RvYafxSc9cu zvfUn{xZSSNMxeTk`B$Zxi4==1_vIJnscTORy@c9>l#S0{#5iLZL>$)M26!wg_^(8~ z7Z+uvaTxFj;YX5(VF;)Q6Bk-svS>+gDiVx+id6YAu%4|?9a1M?GD=0O3wP*>MG95+ zsL{AXsFftl7@QSGn##FK0$zgsR^E!`8Uhqe`Pz!9 z(a#og892!DsK>u$xJpm|HhbrFKrhtopxDW`$lNyVU!kv+1JJ~EBZiEIk3S{Wmiuza z9P)S-i6S*kgtPS`{uItj7~yj; zG^;8BU+#V2ctEPS07(=MbT5SF!QM1Pl87mwZHt6(-4$~bsTqTCO#VvZ82b+dLZ7CJ#un&d4%N zma#)A@|Qs{v36mXr8WnY+ar|P1m)&?MUg1hW@MTl+8XP%cT3@=x7W%LT5U`sN=jhZ ze>XIQxYHrC6si{!Irx=E;VD!(oPfzyx9VY!`&KG_c`yA=^AwT08vL~R4vm|J|F$8u zDUd$^T$-zLzQ-PfuK=Rlm-5V_!9#UaMJYo<)D@_jf#*d+(rl8a; z%-hkn8wmj&WsR^K`oQLQM!`hNWpQFN_?II5wVQNDphf7Qbs4NnMrE9)AK{L7RKgXQ z!J)zPjvryWU<#m(@t5F=+5W$+Pg@$_-!sdhor0=C!^n^v_4JY?)Bg8B<4%Fpo_p*mf};%F z-UdPUl*0;kD_a412q_wGOf$|WTUQH9ubFQ1C11&pOhHZS>fl(%F`45utgN_vZtjDj z?-z3b=p6yw;m6Zl9=rGR-}A(Q#_(66pI&B4Ir0buhY|fIN3M4AD8^FVbV$8T^ky=8 zQ4C`v(1l6NTFl2%=p^)QKFM}KS$$GF9GSvLJPG)M`gsE387|C!6N3B+h4B8gh(d+o zrf#K@OQIXJ%oC%S;!o1#|J6=P1kB(DXlR^FqDY37E1T~YSxhK#4D(q_DpePzimbqx z>!Bs1#(;gOZG4hZ?^WH;K-gb?k#!U4$HKImQ|Tm>+()bbOGej4ZTqeBfP_ToAlpF^Z01`$O-SX4l|b z&+ki|wv$S{j3F_j*?5NQHLC!&PrGpUZ-Lq}2>4-bIV$(oSwU|k+d`K)Q*=K#@@z&q zfN-+6_Vn!6(GmE(BXIv^k<~^0h`^LsR!;NWoG`26{LUDyj@mk#F3Ti!jpl*)(=+|okl<^vSsiuVO;90q2sC5GnNXTDs%Fh z*Y@`jKRPRl4#n|3keoh|CU*V|0*3w%wjCbzGqI#-yfwLk>j(+dWPMUMr1C(jnVBP(`Vug10D7EQ-KgrX zFnFbR-DBK7`6LP_xC;_9iHV0-O3C%*2vk}mW!Fu3v`2Oi)-jD zP^4f0qV=Zp6HbBZrTIqNSS{p;35-oay+i3?zCz6KjGTn zD`cydYr4-dJ9N|rs*9dHhqN^|{TnktX@5pm1z4*_z9mkUf54pW)Bw*Pe14u69gi3KG-|6hk0B#VpF6G3QE%mTj8G8 z$I=ueSZoU0JD?$T;WK+*n=L0p;%hCf zavsWf&Tt+e3{Fkfh@k#L94$4(#avw*Ue5!;262-VClsw*AiGsKBa{XEl=TIKcz(*2 zt*_2zeHm{YXrXefR7j;-j}Xyz13#*@LQk~Dog}93q4EfWPXf@k zrK02(dDze@?s!^tgIQ`HP}q$CrEN?7Cq^6!np@v&?#7s0sGszsU{JV;px5NWlxI?E zmk z{#SCbg90w@Xue27d*QbeD$&`8v&FBV96?QxRIFA=4%#MV<55fM-y6~pRt#X!@%U%( z{ z*=SRuQ`E?MMTyn^w$Qp9j*O0^Idu=(BTBHCDl6OUrDm=!XKuDQH=ZGVRzoeO!bFQ& z**IofkRmmc+H;%v7$Vdli>3}HppHm&H4A&9BYqhn9V9M|&RVJBLh&NcVcONLnWZu? z-rI{OCLTs$n?-&QLz-0iaal_(lugUhT#na9V_hc2P6Wq3_}%bMBAR+sU5^|S<}(Yc zag^i(3R832O(Ro6aP*0;tdnUrl~^5_NIPCH^BTWo=P9|9jhtQwPEdhzNpA*UVdhL( z<0I~vag!vRD0w2DmbL%rIgeHmfus*f5xR~xfDg!q1hn8=Am5Il-7eMa4Z{^at^$WW z4N@q)D?lSuArp~7o0-7(Wzy8Aq1qu1ec1m{caKe)MS*&T+s50rZ5z|J zZQHhO+qUg#+qP{?cTZ#H&7@9HIhCqZDxdNv_Fk*@ey)4sQ8y6>fDu3;f{EoVAloq( zq^eg84TJ0qQnag8HYFyqk7M}nKVtO^ZL=_0+SO%Aq&ex|XTEu-GAU=;5x@#hitv)L z645e{W`i#FjQJ;bRJEb!g!NgUeqOmNLi4eMVqcdMwFH=I(iF3g%Z?N2a`5 z<~lQ@dpZ)^IqE*@QlI6q$wgK*=I$+JgYCy<{F9i$6)+w`i1$ZAMqntr#fX!GjFUlN z&&0ky>nS88R*0w^=M^}~r|1Y+6uH&63dpdCRkcI z6xuG8K)ph@stW)h3~SPiz-3b@j3BZ{J#r55&1%-~9z&^QzTk?Iwwr; zBTeykXxoX@%0d3z=1|{aJ13a;B0&bWi?P4>tfKR0EKyI#)oLED{O{z6U zP@T_+498I|gB?s_A^s?jZ&T~BwIV#CfnPr9`Z7zUZl2%wr-dfsAoYNb(+6_EuvL0 zV4b9k4}k>GI5nU6DP4qWWZWz;=6L$g-&kCn| zPhh)^Atxonb){Cg(E@|A>(8q$!nW-17U*9ugLBq;T5Re%fV5IEWp&3j1NXxOhcpB< zMUYP*n43XmGDRqE!q9ON#St*V*9I0-2{B;=*_kNl0(% zB2qH_;&3`9Hl#7KR#|nxu!P=$6k{)v=PT-<4!Rs4VlAGu5a-fto!x$NPz2AbtQ6XX$Dj;qN(ZW)sXtvNlNr- zLNsR3SosJPVp0i&^1-|E!a;hI#XEEqtI)MQ35NvgpyR)FDpY^zEuo|c(eJe}7!aL` zcke?`>h2mGWWv|aihS(Vw8Wp{!aR)ZmT`kuD?pAmfmt>Cnv_MuMd2R8IBlS6OLSaQs$R!>XE87VXfMT8xKp4?9;58 ziV8Y4=r22hR0kzaQzTTdhfJM!w!7Bo1N2W4U|M@D;YzS?a1RHsuR+?&uS{-om+$BZ zsFtWJ%`MK(Rj7cKRlu zN(mqY19wgzu#mE3cEB8}qjHfp1R8T=bIFQB2LPk{(GY zDXoH7vy+=sytMS6{M(Urz3!Z)<0b5EYJD&mmAmo z%5#htGZCf8OxR*u8g-aY^@LC32GBw@iWI!@Iz@;63@m?n;@>Lf`+lLM%W1yGv#9F< zC{?1}y`At~Samt8ke#$9+ORL~K(hOU3Ds_`QIQ?VF(*`VEI}rNyvV-C>t^5XC0l4* zZAz&TUYI*k>s^XSfVWLyd1y(yGIkm`u?@%OO;5jX*itFcg^KLT8a&=2wz79VtSwJC za%qY7iS%7Ew4Ac2g=e7F;KQEbA5gJEfeSLspt3S(=`xWD>!4?s%%P(Xfw)&_Yj(~S z<^8BkB!(5=l&#zn2OI;;aP2Su!euM;)i7|Io-EB9gGYs46+E?e(yWq2eTVMC>?bXD zuqi}OYInscwxj!UF9EW%pNtLB*Y_UfV`ugaTX!P1lys|fqR{SPHbfpZ^~M7xe10<%YQ|v4r8>{>NuTEixmJuX3~2y`q&`A|%p5y#!Qt->db z!kM(dzwAnUROYIj==JW3z3z)Jz~cb<1c_EA>k2YuI(KD5B1t-V>xK@?^LELDS2)K) z!(J0h3r$?PwD~I3Lx7S!Cj9NeLNUK*_!Ig9@e&?pXp(u~N4 zq}&xf9qw)}?tv3m`!zM^hsYL&dQV7~OI0DnGj8a2off&=(JSlS$NIa?x}LEocv8t4 z?_G(uuVLAwdYux7_OF(oLOmRRb(*P>Z#QgG&j_qwQj<^enYT(_a`b(#lqOCc0~cPVx}VQF+<$rpT|j=T`4U~+SNQhCVzD1=Hxg>{44iwreDTr& zI%>9I@mZ6LG4x*NuH?e_9eRnE8!0q7JCSx3m4~ovzMXVGsU%7D8hkzPPCXHbPzZ zXe@u0DS8LHY>lV#)mC`V{tF$HaDz z7x(Q!mQxw{8C+16GhJJ??FBH^(~$#BzFrod+L`wL zN*e!R}6U_zR^X3+gM`TwjX=6Zn3s!CmS{~fggh-es`_`&({Gj z#y?B~&t@I7^CfvM0|RV{fleE}I#`XLg<-^%9GAVfSy(@suzD8;e9kZY?lu49X`Gqr z{?r5;t<(pXO~>^DtTu!dVsoNHUK@)=p`j7Bd7+p}#5L$y|Efw>pVT0eL{*b=!Wd2? zRV`<&UN#cWCbAB2gH0_F3P<$B+|@#>nu;M-)LFHrwNfenhnC%K!P-z&O30hHY&WT_ z%j$MZ0PlRRNSCWkrm)fNx|I$wbD0Fho`{4-t zu$)asRoF!Aecoy)rjmcERLHeo&dd?CZR?db#IqGYPp4q{KWoC=;KoFo?g z1#a3hq1{;MH4Ed2iz<#H$g{PSp{eRJF!f%dUf1U~wbDo-SFXf~4G``;R?&oitMH6C z;oXh>`TlyCo#c#rqW>6FizDk$5QPZ>~pP>r>Y??+VkZBxbtt@?*6GQG@ z5*M&!Yi*L``EZegz))Wzh2@}#QQ*6HW?$g2HJy`wIka_|+LeP(suOZTK@C9}pqz7B~bP33Ub>t$Y<+4H;oAOW%;VMY(U?aoXG{QT`? z6#JXGK6?itd*18^qN4QN^h(m=lg(b%$&yw-miX=_nwK!LA?F8g?4O%CmPEQ9pH`Vb zwk3-O3L6|=+r~79Qd6#WfIY&;8k=E`XdC)vVQV<<#nC0<`#rj&nzm3{^6<7A!vjXo za3s1z^DXSkotpi<7E0&##5=wF{YX#-tD!ZlE@Cf4uPU$OtO#`Pj&%M&_GP$*z{aDP zX#mnHAC4lPI=bzf_ghIkCTov{DV+b}lD~ZFbzjwB&IEvn(wt%5rRb+L^VlbPhNvPxy` zd@yE2?+3=ceK|Xhjavk#yS$1gH^T1beWjd=V63Zy@6G_T_1GbSqW1s}N=Jnm^{-ni zM?XHxA7j|{)N^qekm`wZxZ8cQAuRSd!W#IB=Tp%pjSi^%MqK$9LaGLlslsOS=)o_F z8P$%-?LB7rmMUn z#dqmZ3=J@Z+Ut}1R63^-kE^;*3#UQE9w3k1yg^S(j+lj97yc(&aV`|!G<_75)o%j+RVsv4~>NM1n1Qs4Gox0|l8=Lfx!q=q^2v*5` z5uKDi9jz&U>N~b$rTuRyTaG#+FBdj=aifg&VW^R+P~}6Xl`UC!tjErXvd!F z++CE#cN+@UnZ;0@&Em!!OqZrsv``s>48aN5nZ$?akT&@&TFWG~Vc0SlRfhKL3GG1T z>Ipv?6VvOA!tyUVz6RJwC>0oW(W)hNIkD?3!gUPUptgZ&}_7*3IL#u;+a+-;o!ZsC5F@?I$D$=#$q-9Xp@q~9`@mEgEx)9jwJ>-l< z^>q6@2t1Vo;jSgu+*UHnpJE$3te}aQmXQ!xVS!A2TAhR*t=wjfdG1?ME%O>}e&a?s z@(gmGtgmf_Vx>9FR60w{A6s1rtgKg+TGIURUrKbgV5R!gUiW0NAM;&jXR};)Lu=7C|7g> zUwqRF_K?kEuH04AB5$CW3x7rdFd8{G6vNqZuf)4lfNy6N=s7d-+4>BYUmbX=)g!uT z2XLC#xdG`+*()18iGh6`p{1Ox&>d3+CyvD51hhZNK2G8OFrV|1yQ{jw598ioSGN{C z&-L5NMT$5E?@6pW2~f-GPIR=i%o8_vYXEhVY*~^bI#|4e^RJLiC9i+%^^85oyPw58 zgt{^`Zam#RjEdeHh2)!Vk`vAk?sWxt?mG8;!|=l5Ip$IDy$u{UIDCP*umnsv_VV1# z41%wb1uF{l`TcUq*eTF2k=wqg?=(PKuiti;EDLCiKViVg96hCXX^mv~ERb0dVnFo1 z(|Yh+3(Vf+si944XrTCRMqxdOzM%rK?G+&s_l?KY%JqE1Qb8)Qv8mA*X3`V3GJsHySYslgv{qn99FMspW2W>`>D2ZnGyKpAlUBU_iRC;6}1RY3vb8Zq#ushFK?sl zAiI+)Hj#gqP=7_yg~yREbTm}`Hi61ysIi!YotXJkA&*#^2!M?VxCMx**p3J;z7JQt zcF5$POMi%24zb3q;3hv&GIu;Sbjdk>tdEbB*&CCWAe7#()F}AKIY8CV9ePxhgxH>F zC5)YpcM`&tUn^ehD!qg~i~$J&Q0{OD@s4L+qt8(eTc~Ekyv}cojL5xEqqIqA>2T-& z1e05PY$mvG*2gN&f0-Xdn2#ywDVUpcC=~shcc(fKJj83ls$0sqrj+^YaYkqo+Oq*< zd}|hbCb~T@q^l4*@BJoE)P}?c7SiXqQx$OP5an};m|%+rXi%k&b15wQ*!#AG4OZoc zWhqLk1#lw3h}#^JaU986BtDTZ-)9jDLVR%?uQSkN_?Sk1d0E+iib z=`vD~6Db!7OJrmysKEG|h-dkKtV%DVB=k}|YG_psxjg+;rTzUQh3j&204vPhnA|lp zpc0|~nuZ3}Az+>H6RG8sn3^~-iCk+j`}BFkt+rvn_R-Cn*4XwR;9QM)27Og?hDx87 zU_H}<^m@*C+2Qm%VlU1%xNTZmYhlv|VA8ZqQz|JUb;%_S zudvzl-bPg_V)MOi^U$&AIcZzNy=Y9Y0_8vNmGZ)dk{ViNw`+k|w0zyyrbI)xG&0{5 zyZiLBgf$MLNvQw60YSBZli5@72|GJsUL$oeA$eet4YHn=0A6((ZsukCifu_T49?}1 zZ~^~)ncj-Y5?Hmo|0xTyLP`kDh7^6XN=*ZnFT<3*G@pc+A$B`+%ShJVG~$358}%|Y z&cqmMpQte}c{0_DE~~$ znNI!{lkyDJ03>AlrGy~QV)OND8fs#78L6JcycyP4l}I@X;{j@a-qNICeozRdb6@SV z4qcLN31&&+X96|1Z@e6tQyl(Xy;MDo8PoUlH8NWoYBjoWIJznx0?|Y1@$VJ<@~aWO zicJ_)LEskKAGZ~HYxRo&cUIda)fqW-!sctFS*D@N$3DgSBo02kF;sY|A%vGlqZe4` zW$DsXK1kXvV1sBMe%uwq>E zsE%$lD@d4?&0c?9m%qo@Oy`UwSHHy2Mw8f@!{p6C*Zry#AKON-s%;f|*u>@Q-=SPx z6{Lu+lv{_P)ix^e9osKFtW@+Z!GP{q)vZM7jYdxms$)*1n$Nn$YM^&*)nK!rCp9w0 z76&ezYaXtLBJC?iGy*8;I6pkNp_45_)n`QH8Fn;wdXkCU-DjbmZJdv>N*z38kgz*j zY3xm3720RqkDG*C9qhO=Vh881s^l4GGSGv^uny74*xSTxX{3 zz*+Tu|GU5l4Kn=yBrxLtZ}>$*a(s0B|CL|F`%nBLEeSqdkih?oz$hZb_8$o2|50Gn zfWrU(A7M=S-y@6#WrhD&2xCic!+$~;+y5uR*xuFO-ZR|QKl;yM{D&|Og5du*hf&A; zKPbl4wXJ^?;|2)b#^&CCfQ(mUO8>)T{P_I-|D9!o0fL18SAnspNwE-uRL`o3xH7Z= z7s<~HP%;{e&E&Ezm0VPwNc_VBUpmEXGL=HLMz5PSMK*)kG$D??nUp-7!~A+Rx`kve zA5{^q-Fxb=yi|mtoqVi~hNch$gK{)#l}s{M*%xi~(+)}DztxPX&KH}H2@obxK zjRDebqg=OpcBZ*3R>QBgwR%UwJ`Y~!Ia&%+V0aJuqu0b*am+@3zQ=jORrx@JpFZ!- zWfh+;enKAgd*16E`BYGWKGsff1L&rKQ_;sbKnYo6Lf5f#48zzORFEpg1&7gdTZ@2@ zGsks1+{z?$7bkNkz(M{sD?n$e6E85nIjTSfQsqq9U%T70#Afvm%(3udGBvr}2TLYt z@E8V`0qr-a=aDA{sYIGFQ;g<`n5Ojaj6_gI4>LpY7V1N<$?_=GXj95{i!g4?HL`RI z0q<$&jwi~4_=qt{{7k*!4vZ}8o~?6jS=MOsRET-Yy&x9C9IJdPpE1IaFix1Q613-N z*l>&SO&TpP@sISBctV?vvZb>M3;Wu0U?!GZb+yc@14T;*K}D>$c%ha;@^*F;sv!AR zSQ9I@mLzvhO=)DhnGKysTZvX#i5Y86eY$B&PgyYo;aH53O|{FuFF=OlET#~p_n=vn zwu-QfPvXp>#dX#_!KVcay}%v zhBk(2*+*B~zdTi~M?UXQnZX)<`V8RBb`~L&$X~|=hx2J@T9XmqjZ?HO8-z6o1$mYf z0Xk|HHopk-&AQAhYF;LI{=P0R=XLKYF|-Gn>>C8Te4ka_gul1 zU*0YCFbL=rzja8omu(N|U+pAs0bx1AI*;;_Vs#1l(Z}`Cw#y@sq4zrMZ9nmJG;yKj ztj|PD35)3TX0(_#vn#;LFC41{48@S3E$tR;SK=AWnMV=o*wui*D@rJf_;m2`J)) zdJg!zHWH;>{+wV6{7wr_tZI6cwq~iUgTDRSumo2G!t?7VSOiRf|1sv25k&V`Iies; zZty5ocZNG$RuD=uTw|N7<*Evr+0aw$kc*15Nb8QtWc# z?LT4J!@o4hn5t&+IA;UcP*ouOtK}gEl--0`VvxU7N)<>X6pdpw6_aq}v>6wj)%?g0 zO3uV|!JITWPb%v7FM;Beq{;EJ5UcCUIFii&hwQiTp@4-hi62i6Wze~YRt zts|;W5NO6BXBPcx*IgB*4D1sjr(pgT^Q2+2IbVkrH_W}oD@_AZdkG zY1X_0<^!F;*ysQ)#@1mD#)fik!D5w;zM~KqqZ|OCR1m)uXFGWFy zsd4>=v~r)5gFLaE{=oTL1tg!CN0^?*ulC0%qfeTcbx&g8R=S~yJ|bwMBrn2xTbffz zq59G_=PS>m?8P^kOlN8rVg74L=5GGy`HH%+iK82}iCMjo4Ox$ZM9}iEokg#sKSGuxt#HV7YHiA}y|FAW z+Yq5^1@Tw>Y{ibU#S>g$X#0BOzFTKziAMSYV!0&|v`(W)Mb8v`i86<Lk!VW<;;v% zPxkVSY0n;oDBaV5njd0^dWPTF(%k1v_b*RvvAEdk8mwR)W#xNzknF3dKECch3vSr9 zi#?wUULvLa;^LHAd>r05KcOH{P5_Zz&by>0$=Hwerg zH&;i@-AMb*Is52mD!VbCTgvHL9ZY+IG2*<07H{x_2FuoEf+v@v?y}8dY!!CGbJv~o z+#vKuVzDAOnOu91f@;$9)i5xa4&b#R;^FTNv+>g$tfy{!J4zol>LrCuS&*VBt?#a+8ofsk1> z$FsJV%h%JTYq7tzW^0-i`D@~Q4S5)hsP*rzCw*jkoApuFDY!xJfK7XQjwQb*q2~8S z_|(b)$H^keh*gLSDX}~Mfk2LM$7PT~*-$0Dg*!)gYoww!1y8hRltusarozV~YX=>< zV5?^1uaAzadYXF+rOQdG~b=LW^kts&!`;D_+w`tlA=p^j_u8645`K?}KQ7ZQ7;B&ABv7vSDNwW@(YqlmJ z&8eV)sW9^lL6`|2uMxuG%q2)`uBrRt_8{O;A~X1i-5RUYbd$|gwM z=6P}9ms|3$)?|e7?nk60ogeAkf#d)#8VHrZ7Eb zf6Lmyrnr(s)@OlLq2Da znU^3xjBiAx?6HP>z=WmorgnmxQW}=$SP6OHIgb*RaGNKIPKeUeo5&oM8ZXd2Y`I;T zc14;s+}q7d)y*<^G1E`hGnxWJ$;Zl9hbvs`UuMBVj1W`9;5}mFmnZFr{ak4j_GB0i zl>|qIphZ{Y@u+Hix{2;^Y|wZJEvBrRhWVsMw8wAXaZ#_BbH`R{Ry=p_RZJP>*MPw& zKMgI60JG373(pR+;7&^|(I^$@aqn1cvo$j9P)Jj5kC06@y+jM*z>z3MsbDa7-``sP zaK9oysiKEpwA-nC1}FG+R_VRNWo}P37movKD)kj6BQ`2XC_2Q3)_I@0yiPe2EiJ;S zyL?eZStvCFv|$31VLXD;Lq?9Ho}>aHGjy)Ted;me0NoL++^KJ=fq#Hfj`*JGx$pBt#+_!~qxZnUQ=yN8Rm zYpq@y5roGRSi7l78|HYpC0NGyN@dtv1(BlwQZuIIM{{#RIF>BMGbB&|uW$Ez+~Dl4PtEX-8d~ID8AKR`T{%T@0(s@2nEBUgGmGgB3C5 zxp6C1G)v~5OEoLY1UgMYJ^Z9pOPRB?!Pl~6uj#vK++l&)DPbD)j$UlmTREbhiM_Rsz(9iJX=8K4i%pt~T4kjaq70Ti#C_vGL118I#5L z)UndP%3O2e6>Nx^QiC2c^4)NBeo7_#!6tjCCAI!517LZW(0Dm-F@R&bBDxz7+n7m8 zPz7DmR!)1UoW*iUrCL!}Emc&4@%W8gR^f+~U2sb0%lM|+6gT1&+kM)VXeh}@s^v%} zetl>S|E^bXR{`nLe#8v|f#6tKEw1Uz5b$veh)F5I%pIc@&bso6r3sbo&P$HsxdXSw z&Wy}yF*ctzNTZAa%hl4fuHV(EjD)IF)$||}Z~6nos79sZaDI4!x?K1Wv6ZWq~i8XGd^|`JjpD~ zv9Q>1+&(pw(lV7fYm?S8bCRXXqITNG&Nt`mRMRBsj^QH5m8!m=G@Mk1m-g6zE_%00 z*VM=pfb{f%H!Q>SbYHC?4e3k+Pl@lU?m4Ly+7gLYjof#2n69dU*lBu`$YHd5~~ z;#JwnR{Y>@TiLE*`wZ;W z?TSII;vTC7_mm!sYEOkPyAZ2Uy>a-^$x#Qow2J9;-Cb8%)3x8@V1+@|M|vqMnlYI2 zO8)WkzQjwRrFH>hP2Tua3WVd+u%imABvann@$x!2y|&4avP)Gn9b(6Xjl3>W-Tds(7uMj-(}xu-OBmw z3cQ)L9;G-2v_#C7%_dK4QaoL%YdR)Xxx-K<9N+_bUR;UD_Jz8c|+^v-7{>UuFdMkK7bzgZ7YC`VOS zQA9wdF!JM(Pdf@tSzzv(!+%dS`}Tm=FJaHQYgz&r57&L0U{i}qA_UUB0N?~hpqN6a zFil{!{Atlm5D?8EjLeXzPn)Qq;4n=fMGRZm%^<`KnDNX2z~N@O0D$(8C0A%IH6A9D z0YJA6)3FCF%L3^Z1QW%)pLqug)(=7VxP`w607=-Ek%w#%*m)P&{BwtDb_hP~bWltH;o*cH zU9`Wge?-E3fbiJHY~F->9p=8LK0Xtf#vcgtVWRe1d>c>Jumt>;VEu(2Mb-!^mjEI| z9?-pa1il0*QUJ*TvMt1Ts%HcxwhtoF050%%=jHB1E@_ACXiFjhOJ?v0Q|M4I3DQ8} z@O~Fkn-Rf52!LmB^hU7D1%TMOJCj=6)Kow%5jdb21i^AT>5yrmQQ$1c!}DPrlfac7_Q671jlhZbw}+dqf(D_r z2SG864p|oWqMM-ojQ|*c18$JhHvxd!04l%;V7`BjYjlba0->OU3Y%~tZv-h!cu1$T z=HvurR0QGl_p&q}1Xk&2K=3T?4wUfUdcD8R7Rvilx;)HkH*!dTJ3l*q!inu)Xm+K0 zAhx^}??g)E1Ojwj9pqTK9%?`SlkUV2`-ya5Mph+X&Jr2)d2o0{ih282~n7 z@HjOOF;@V>k#y2Fx94eaM0$7%77RTdaCOdb+CX@XwR8=p42J0Vs1pE&z7K#h0^uIG zfeJX#2i`-lKOBiTt%uvS1}FSG@85NTYhEv3sOjh*JEZ1jD@;g42;jsR=GD4`tt;Pw zb>5$V6`rUiotg`QV?XY-&OKK$-jFLp?J`^t&YzATJ!d66W!;@k58TQR-rxkjSpwG3 ziO+cFx8aCR2^{xTil9A=u89iXPV2#h7T+B1pPmq3sse7=k)JB==YyC%R5oYVv(j{G zn&Eyo8CNv^9NYEhDj3qPU#=`ffkjg%IQTjLtSoSskMyP}h)RrnMZ@wkV(^?qa3-7d z@BR$7h;+xq4B4)DE)DX|et4$be;Z?X``6$dn(5mx;mA4Yywv~Of#?wu6bcLlGScv< z5XkU{$nXN+>BZMbAE?m=wL91j1NU%t(VhAMSJ!n@+uWf25!E)xGdZL$(+??p5{wKO z4qF0T3Kum&5o9nMyDX9nN1`C}7E?QujxpLO&>wCtnT%2pF&KC`F$)9IWLgekmy=83 zBIF^4vxA4uL!p^c=(k|U+K?Eg?-AXb$L2wj!lagvAAP1(SzGlOaa*8!6vP!a#@@T(aa!07pXL z;mD$-AdluChTL<8SkE98PPv_#H4MR&)(HWrb(w|6uT!0d zXW(*YnS1|!*>hmQnGA&?6AK}dZaPde&_Sq>E0-YY+zyg_sK`}~hS=;f@Ir_QErnte zB?&_j2J_uj;Mgo5P7>PFrc^=lqEq%VR8gD8-`)bqA@GMv7A1m+DM;-Hu+buk0eGrVen8-cPB4${I&mr? zn~(u?cUIx&zC+YkenLRLyrP*MiF6D?2FAB)%W<-?Ba0BUODRR)FM8}mcD!;b+tseU zZ3{Elv7<)k$!)NnQv1nBcol}o%P9uNa?Msx3)z#4bRA<5#&G6QdLa z!YHDq^@K>9Jdc0dibLN9KSt(kgy>IDasv7o4*3V!5^xAvG7S!HgO#Qh;Y!~Ah#eDM z|KsO~SZ$h?ndrGl)3ED!tE0Wq2)6Y)STMktTs%n>aJw8j2I`X7mKV=#dPU9{M5z|U zzukkYBxunP1v2)%KLE&{B#Sb^YT1OO^&p9nP;g24!Hb$wBB9iRE(B`uY(e}|A?D7@ z9PC|9iUCWlXeAEj)y-zP2ji?*c%)XPu3R8J+!3yVABM^N8H8;n4$cCSmbsUf1aI^d zIh#!pzROPS=Wqgu!d;a$#X!+MsRU>LK7>mZ8^hn`h3-;tsps01MzzBRCpcAa!nAif43`R#Mcr7-TWO13KGp%_=lk&5y(>id7b`DGA6nXb&i3 zJD^7}T0KF6p2mUJmQyPfJ#J(Ft`%=#h(Y2+-zIZ03JY;lhV-K&6*(>oP@NQ`6gyhy z**(UX)^~6@f!p9IGDh>28g;AwiV`%_?A^H&)ozg0zk7@a^$m^n_rjVt(ROMsW-c(r zE?51nv)*4&mc1zGYsjq=h7nOTMsFn?%itFb`Le7NhThSnh{0XbREr}WqP_GQZ6gUt zW+rf67sa6$Mpq1?qs{m_Iv2^z$rb{~Epa*SxqcnJ6E=<2<;QF+;-=L_MZ7_PJjl@~ z_i|Uhy$^F2290L*7B^QjyIZFYy+rsa3slgA9kSszP7)eC_m%>+qho%71&4q=5)pCr zo&5pUNlb6r|x-DZLrhu|D(o*Yd#`FoVR$q3#fDb%1pBM!Qi zW*qFYS;QB`e(p=7bjY1iip(((#^Tw30wje6^9VjC;#oAOg&=cL2%wo`A8OcE9BBZ6 zf`f6e#hb?c<#j8H)?dNL;%m7UFHFdVCH5wnGeaR=J+10-;4&)+o=W6OST+dsFT*`qeQZ{< z0OCGxm?s@;kQt>%^RCVb?naLVBT&zrC062|r(<}&IMz2^T}U-9F8XS%30+Dd;!Z(s zp3$a&H^4q=W?H6{vYVvm4?xrlw~kpZ*;g)TS=DySb^JwsNkzTT5JL2V4;hM-l^!mT zj_Z&II7XHhyUSyjHp*HdT3aLgOe@|`qY7l#u5t>UllDswj0TLS+g~;YV)E^iHV*Os zeM(~LhA~?TueYy{)q^3!>~<1o9L76uq~PvCUB{Dbvp8@YBd5H*2_E1`F_wxMp6l}J zWrW#Z?}!0AqO>Sn(N$-t64e)pbDA6u#3Wr(cbPD8V|^ek+K@h^YV;O0`}a?y{^}U~Qfu$}%YeD2dz%my{~7#=#|6e0Cv-ez zOQMwXsTd4>oUol*)a23>#vO24X)?=C)F0Dijn)h>zRaQ9__&XJF|<`MML~#uC|JU2 zMu!lGO@(AZwYr<(@hOlP-<_I4j0UOUY?G}&MnJEp1#eZuW?vHUXN4c&e~4&WBq;Iyve}V-V1=YsZbkZiy4GqDTNy zpnbhqB}Id<{3BaNH9!PCW^Wu=HokUNyjEhEp>$Hzb2eejZ>}>Ry36G%)K)=Uw;o@< zu;d-#lv>O*tx$28knk0Oh!MIUqNwsB_)a=$4YD0s%LMT}KjXfl$ize@Nodcvh6hr4 z{FAwqM=R^QKq;d@i-=pv(FbX~Sm5=jYie4mX$95w;)8XVkzp$StmGNOk-*WhF(`*Y zc`;Lv2(xE}k_kZ~mr4lH4_($&kW7*g{vK*v7BoEpBLRVM>dR=tVJALiE8)QW$)$eIhW!B|3ZgcJ@|%s4yL&N~M8Ay$+D-@pTapBT0`e%#N*;uv zHC#SBf3&yiy5SVR}hoQlWqm!gCFymNy84MJWoLJx1Cou`ms>Zb?}9cd*AViSkn+Wpt81Ws{;iaZjp^IXZ3B z!xITCf|o^2W~W$ttJ!diy+t|r_&$rr-%(=J6Z=kMWKWrxI>GvFrNcMD*i|7R03inW zkeuB7kfMdTXZ)sLbBNz^tvXW&I&5Db!HBwY{HeA4qTmy^aIK)?!%qns9up(Hc|}TI zYsTKwBVfHX)3ie3V{_BfDU)maezG1{g2x~OI%T{j?uhIvxCYOK4^!wGy)blM8be>f z5t|@{pM;oaYtU%0kJi;UVtE5xRcv-=vim~}SwO9|Jr+PCZIzfMil7?$G>!G`lZ4sc54AM;~E-#bi$TadbwjAMBpADy8FORRuq@L*<@1{)k zF~izr!r@KgD}@5dLXm8QurLNtNu*P9b~e-X`~1~N80pmT|0wiuLozg7;Fk4ga1Q7HPq_?txyHtTvw}?4x&! zhN4n^^_M@g{b)UaEiw#V)bNn?<&{*e3-XuvS(+!&{81 zVen{|i%wo?2je~j=btwfgZp!*H^VM%i=mb8&ZX)4f zX5yP7jlJ`(H6!;O>hOdli9bl^VdVN(h)JAC`v_xcg+w6gGfU|9pn<3Vi%Vh4r5)4UmY>PC99)W<=D z@C%kbmuToZa5t;jW8H-jrkEzES@Zkh=WsPOWYT1Ez%WHe>}I}cByM^e%#Lk{zPNji ze>G26i@EntQ(d<@AB<->7OSu#!9QfC*^Lqj-T=RFq2m{~YB@fWJUuh{C0n@w*TQP8 z1J8SX@+qP}nwrzLWw!3WGw(agS|HQ0j;?C-BZrpY5a+4XE@B4fV zo5J>v{UetpENQV;nF7dLN< zw-E%rDVNI`qqg)h5-{p{8*nE|u}>K=F)$&bNz0RC^c-}y0z6kmb+a%aD4+FK+tYmT z1n@`gvUtHWx~tbY*$O-xJk|YlM6RiCp$6Vyq0sMiP;STP69%@n3-Src%nRTIPp}aS zCBogwU#n;C!(aO{Kc9_4JeN@JhmKZf==b*0loXKr4 zVOhPRSgD>!V^DP!9y!Af_{&0(qn@Z8w+-n}uG}&qW|f%QL@5D76J(3WhuRa`c49c& zt{RT_Cj21DmLRWoo4wTVaG{BX7OI}$FsrU4BWw?CQIWHZrBO2t4>Jr^+~x_UjLrnc z^6sA6pbhp_YyS}QFtr`zmZTdTClojc+A%y|UM4Xro?~U03(mnMU)42VhdvCBCZbFs z(eNy!_$Zd|Z>=yQf*+-%wCR3jE=+5kzkY%I_FiQOB0d*Q249Xu*+1*H zxKGyDI~NQB6iIJMVrp7_CcjYirT2SAYu;@7>1?P9Tb<2t{ULF;sC$asN9BdOa*Ctj zmRW)aoG}34;>Z7};&|NTpGL)Y!nL}jO~BMlyr5u>Fk`AQ&2s zgW(%v_^JrR%QHg1Sk^LvFouFL9#R5?5j!1(hGA*o+g&^mk3?WG!PF9=93@1d5#SF7nap#wVMoWRiUjknh@L2T(hI=C>c)M;9hgwD~2g#&v(dYEg$AoEKI$qp7F zN5F@q9Mt4>=n^s*Am_SRpyesVqH5tbNgE}VYCvvv-4s1X^I2vI{; zQt7qlw>n(MOU8SI_>h;A0$ovA!l!rETO1i{W3xXD<`$sQMg_7MUxyzm;3%k}5FwHX zgYoD(KtjlW766Da+#pM~v)UdglHg|m2sB+a%ycAG`-=t8dc=n$a4i4-CUk`uuL1~y zn2NV`nUK_=C5R*d!MbXVW|FeBcc-vw1$o7o$(x|wGNOerC2J}2U+kqGzD#fVo_f9>Z zml11mNRjh3>|!XDC<76&&!jrLQyM^;*w++UgDlG@ZIb{GL~Tj|`O#6DKiyltv``Qg zMVoPPwz!xcAzLab^sGoMokN(g8qOQF@u-ql{n}3Xb-T`yWnKR@0LHLmZY1D3g60TsQ2S?7)92PW)u~V(^A-V3jV<$2wT=(rys87q+zIl z{Habj;;6KlhGY#`Ycjud4GOcmHIt92!<7a(FYw@WCv2o=j7Ou4&L0Nz1BDn-f*@0> zHb{&r6cjQ5TMb@7?gfH7jv?%CvQ821!C3Tc;d_V(UqevA#ACGkCcNZw#SvjyjMp)y zEcl*DmJ$_RDq$6m@6sIlE4O)SJG+~!I*ygre3(-<;JJ;@5^oeMJ1`gyrL62B1gGCg3^Rb$`#a6x34J-0}6Kl4f_vZ1TLl=%EKHK3eaX7?h&LM zGCQx7_#vL!d6 z3pqymEUeI(RV-~zK*->vZJ>*{$?3=VBE;-%HAD9`7T)^IFJt*2tYm6~n$wAX6@9vp zixCw!_&<>D=mIh^->t||5n&C<3NN@)r7irQ$3F@UNw2P2QE|M4249MU%7KL8wkI*I zL=OV(v%7@Ch)}^qFY85+@r$I6FoWtAQNreG)bOV@AZ0#d5~6er451tf^s} zM|E&EdCjZsfa)b7ocGJt)8&?@Mq3sIiGb;aY{@;{^@1rwb{w zedu)WEz>}nL(x<|=7hDXj+@)a+j98mZscgEH02GjTE}j)|9$CUE4K7d@lHVE)E0PC zZ_E=w$fMx5Zc#jlL1#FHkmDYl%YHIXyI+|=iEs+1!ls9#EE2_iYOMf3J%=#>_H8Pa zV)!Q@sSyW6$h=56A_k0pn|zg(;rgI!JgJ5#XL87;^8RzIgdsG0H>Ci}o0obK`#X+|N&TSUGsgj+aBehZDQU=*%28raF zDLN@BzeH8^-QjB~AKN-_a89MY)ZwB)j!_I7DZ%X*D)zdr4FMm6*kc3PpiZEb2s8s| zM-LDPW6nBg#Tg-c=2iU36OhpC4M4dh`DO`D>j}T@dl#;3Fa8mvEtKp-k`y`;Tw8M} zfnQ%wKAO#1&5UHM3}K11yQi=vSja`<=pJ8PD4oGrxk(IWbu1O3*>go*D^ft#(bDmC zuv8luQ>h zN-X-YViZj^rL4`Zkjjq|u>BX~ye;WT)Nd`PCgdXF-# zaoh5=1Zh7F<@XJGv{R!fB?K9)jyeZ9A!)=8C>^vq&&1=;rodD#x>xGX$>F;6R7g%0 zNwi!Y3mBt4GbZrJ7n3GYQ)4hPn#Jd8&Mnut+vqOQs}>3Se1-xMeSDxg6wWqm_Vr&P zKhG6g7ed@Ys=9!DO|9N4fv!_a>TAygcxdjrA&*% z#Wgi(Y8D$I4ph6^gu=27SDQZ{O>;qV?3-hv7@MEi-qmdb=w3Ib_jNs`6UCeqr=IK3 zjGcLR9xT%v@y}cBB4veai4)&{@15quFA(&kP$P^WeiQzT*a#%&lYc*eG;M5QP!?!1 z6UyayD@SShP_q@pwe@ZkScF)Bz zRlTDO2%Qo0`8pEdF{ow~!ynZyWgOv#&clT4W4I8JWm?7S4t;ka=c(=Nfku+jV!L*GBzlf6i)aF!3kI zGY7ZLFO;g_pdBh2eV%A91rFx5{@CzAEP!||(1ya!tl7t$c_rlS(*g>ksk`|t$RZ*1 z#nt{q3eQO+5Ab8jr_JI9wg-#z5t!|6$|!VdZBC!u85 zzv@v5CzuOQd+EV8d24!cK`2dX#<#}2;tbBy1tTks{CBg*tv-zE+asn2y{j#Hoh-OX zj{l06{-?i>P_1LArH*!hcI~{Sl7<>+9EQy{WQ)JejJOccC+Xpjyxpd|Q#X1Ky4cXC z``xH;7oGYOSDd;y<>Y@9%)SxWhM)BTiq(Hai>VvCARIUv2V0tV?>5m-hDAWXokuo^ zudoJB1j-18z=TN}@^c6$gUGxHK;=7ToijRC-X_|TzCb@>GuV~h5SCyIL#dS!je>W< zNfQba@~q1T;n-+EJoxfc>6@KTo>ix)2cx*tp_u~aSq70jRt*VY{z99CY3W6vH z&VW*Z-1eGnZIV%Q3r0m4^t6r<9x&bsA|y!A0r;81rW5@tGyInyO#C(Kk39(WH{vy$ zfCXtlOr#_aLW&h99Hl*8JOYdK4r$r4Jw&%w=DJC01W0$~NOi7m2lgifR&@g;f+>Z`!|` zh~JbV#MI}6i4Y~{;>xXlPhc#As83mCmFaXZj#Zh{O6TPX$$a5hR<&i?z0DxGkyl!q z)u@YM%vkp0RTA!5z64+O=P7^K$wu_Y8hAi=>G@FzNF+#m zu?2%@YCB~;2Si3iQm8kl+L%=S3q%&)r5s1Cr+rl< z^SkFKrDz`yCjqE!u?ag%iLO(Se|0vXf(NkTa zBT=QwygO(=v)IalkqQR+`NkrX0*I*Ms~QH&Ksg+aAtiSDnfy5_n&uL4u=Pgc!|w&W z&_jJC!t3usMZtemnl~~f64j+TkfuqoIVo2GVWw3n)fL4w&EZ$oAvNV+cwJ{O)hgPK zdo(q0Nj2>@|v}Cnb zTa_pHlP%5aP&$$BFYDMY7dZSnBqtcH_mg;{{jQ5u}sF zcD)YQQ#Q2-SHiX;)l|i4jRBCVHY&fL@LSe)l)ttb$n3V8LKfks{W)kY!L}!*YBWJE z-7k<&+-$pO3@2i0%Sg=RjkTl^&TO5_}JyFelWvI~9E>hUuaaN;yomL*pa?2ZjG>xeM7t?q2K@E!H!eFI-uraBnoh)hDjS=&j~o^4Mn~ z6tt<_3j5q)NmS#0gyZTJVh=%{bWUu0j2bMi-f-OR<%ImX($%7>4FYvI_^K>kvh}9V?#@gEbUuo32KYAq zMta1!yewEcrg_2L-@1JaKN9WzZ&m}*(i+|?4>Nj?J_@A*!u`&`KRo;J<*Q;e;^lmx z6blt(?yd0|Z@oi;g9{v%lK}27RL*Q4sOsr_mN0ur#?Zv0qefNK#vh4lM~s$Pvu2ig zW-zoX3$R=otlQqdE+x__>Iu$FqzwBL_E2MqcXdxJf=#|`ECU{ny;YACK8);GSRC6^ z3$V)nr7YRtfxp0?Z&4##xJnw)B3*sinhB79sZ=u;4Q=yKI`UYwaG-4qleQk^w9q5B zq`_{R$vk>6u?SeY0PDf%)TR+!U$#MQgy&ZPZ7qyg+ajE7G@4Di7&cOjk1uDgVx3MB ztk3&t%vny&P3D7Lg7}zVoM#i&`Gf|B#>u13NcCRhL%|*IjoP;@HOBtCydx zwYUs7&O|pt)>|G?7FkKgv`J?9XE;^Xru|vVknm=@=PFiGR`vZC>53BORAwq%P9Yu-kIomaW9j4Q- z7#zE$n`&#hjEKez8rh)$E}6^k~7JBv^|e({!J@7to}G%kH-Y1h6x|+)jvfTa-eIGhsgrCi9A3Vu ztnXVD$`p_6J?`jm%p>LJjL&X~B8UCNHQ*Tz2{Oh41!&^X`|+a8|82w)O_%R~l^$J+ zP+6}W(l0Y;pNRFweVH$%XFVl6_Jx0B1zXR}Uv?pu6luS`oH5#81=y8!nll}bvQs}n zmeV*Jo@9o(5BJ)_MBV=IY)$*WaIdrbCAiie`-lg=7Dl!kDmKOB`h?rI+qN({vp&cA zmOHgLR}TA7DRP=(bym2#d2@1O=zL}2wR4Mh_HBM}qIncSzp*qtG*5embH3w`13Pk9 ziRN+ZtJm*zf!th&b)fU!wrEX%z}nw`$F>EYkS2-mis<_7uDNv~zl~ zH>eGM`!tb$qZxci`+gh9c8UFVs=MxegX$R!gXLjGsGxjeMjz^2I?r4T`_@dv|EHdiFbG zTb};F_g<8|8u32yw0mYlbJi*{^NtSf_BpTq>0f`ZOpX-rbp)R4_Kprez0ZH2N^&`} z27dVRZi1gac6j*O0L{Vv6od+Nfb+z0_IEM5(`9`cUJG)AhS3HO!Cm;7eD#Wj&G0Wz$=(wR)pjD&!Lr zhdgbzSWsn`h`@$huUsgUamI4!f1y{aXbRJ7$a5`~%Er>kSKVx}15M;=O#}mGVwz8c z6OCA7N@-S2)w*0S9o&7MD5-Kqa^L!L)$H~2#9)`jxMZC4wP3LncVj(lH!JKS+igad z&9~an*gX^`Wv&&}$zvlF@Za2QRwWfbS7bF`ZRoY;lC*;WUV>jI2Ru%QkZ+)%W*&j^w|NHmNZ``>2JY*z6gt5vy50%arfTr1Dh% UCa6pb|7WHVjMN&Mt=0iMF(!qagI=eJPtgftm=&1^3)C6&3U zHD#v0E!_f6X_lJ1)u|C-b$EWfhcHZho~EPPYUICl*V*}*mqdA-akGaRC{eRy!FxB_ zMP-g~2p5HJ17F5PSn1U&QAIp+mpP%oPxP2$Vy<*#I*%^fp zo;Pqw<1~i?bomq8Dc8;46%yZf88oQjBj{!H9RIFz@XxAeNu+#_ICbSVwW@9Xf@kHH zO6coO+o!%g#kiO&R;NGBK=k-34eIi5RRK@$f48wmv8y~oi@jYk?i?san4b)jV7d^z zhq!N;{TI${eYpndV~$Z)hp-fmb<15-(_6}Hp}Z;5*=bNOl6 zk{45RJ(>SxjczsKc#M+Z&JSx_Q>9A3Oq4aaa zl;MA}>F2?xZ5v7MFFJ~ZY3G_>MS=y5?2u;g z#QR{M9IYAM)2}zXOcIIR2N|fAqFa&m+G{OZs@%uJoELLJur(;^!00{j>-2WADh7ot zUyVJpPSKAf7zwGk6|0F2F?Q2-YRJYZeyoqt`DHKP=;R2@L99_~|uyF<8 zMR0wZ6Oz?b-qJt$k0+(+6UL|vGPd}qR??${V96)cMquJrH3!Kk z0VZL(@XJ)audqt-%6eo>ZR=Bd7IQh}I=CNzkK94C8V%*El2;H;`N)9f*q6{_gyXKM zkiC?caaTq9!;hJ6H7hmx86AA_b1A+4hvbAbUE)L&;pQx~&_Y{;R=x=VzoL|~e7{t2 z#GKp-GAU0Q^MiSo_Q`Fp*1%%$17IPbW%kQ#KEL;h2+KF6&Io7O+Yc@oI(>5{rQju^ zc@tMy*=Fg*pl(-)`Z~WJa5hjJDYb=)0XUuwT z4!hanPW)qIIKvUHRoH1VUpk?otvNvgdB6zL$$b&ehABdDiQ#>Bq znJsV9X}Zb$g3+$jC*er-=(~fpC6hW3zp)+GtDKHHGn!3E$kuVa%Wl0qME!27J6}=W zOySaUM}kemFE$H&zLY<=fXY|@W^`bd+QRK`%R4(I7qk1}MhSg0Q?H};hqNy*KcTj?T$H1(|?`eIs;$jd&=`&sxg zZ=J}Db7j$+#=(>1u9y5L#9jqivpnyuR^=sbVS8tpL^tP`ZWy4*8)pr zd$pvNsngm=(q1xt`b?mbmtaQN#OFF7|Eh+L*HS5p+NQ2c)&2g4s-YcM&#VXREXA|7 zJ9y7?%EcjBTsPm5okVPm2h_cC|M=l+7h3Is&{+1`Qdc;Ed)J@0G#9Mkd=-Pzo1noF z=KbW4)R-J^_FSvtpB`RQg(-S#jW?Tx+1JW{o0?btOrpLDq9E(OUM~(C#g$WbGX#?} zQ}Mg*4LC0ohqCb{DuxD+0^EZoOL&$U5ep8+|IR~`(8R9{IOC^vx4f>hhkk?e-FZ=5 zDvdZ~sfv)$~n zxke^U#GiuAo3&UZhO`OpFI5V?RHJ$J(atB^^}4Lr?HXHlik(E4&3?fuZYR@BWEk(2 zUfhbcO1Z?T3_F~9m1?mP7FwCD7sZ~eo?r{YEpx3-yH()Q&9oNXcpKTfi$H9rrFE`v z*A>IGr>#=mK%IyD^}E&Jh%2w)S+p08>A7pDqQaLK&r5ZGU;8W1-w(UfNI^>=>hJXu z?~a%TmAtHMo9{dn)op?Otq;}4hTZWsua3aiO!i%IRjCwZi32kzk#>AnaF&fMb#-@( zZ1-2@^?b`PcW7)2sP>5LfIrUXcwQUPk~$v8`K3ErjoGL9v4W@Pn?_xAP@175qv;tz zeO>6fi9wg)h2&x?ADWT5&QLfZj>MYy5zQD>`bnY;T%=(@b?y_3&|6Q_B(fzBlR(VZ z^h{&Am`^>6!dB~oFv@&N)2zkhN!%oo1TV6{!Nm!(Ecr2*qEx}^%)<;-E*S)vBU*6yHX68!8=76Q3=sOMY*&64fnW8+FO#Dy&sx z_3XNy*(J4>ez>MWHgS!>lDMszcR*)UZ> zpmh@FfYzruIbu%1RNB}5vor1VtM9#VD1_s@Fuv}GcI(BU)N!bLwCN;?R4>umO!O$n zEf2&>%yEjLcKNBA0WZ~ z@AXZR+|gG0VXS$vvYwRtA%bmOMD z*jSTyPV{c@@2H*r=*CCrpUp0nry2V7oN!hBS)k`(EFyZ@Z}Yl6VHZ`Uu-S6EYO4>&qrCctfq^L|Yqw3GgD$fSt9Sx?ZORR<76Xmo<3OtQh&(cnp5W zm3mw`Z{I^K_ihl(dj|?*2YqzZNM_q2QvQc`KaJ>NUe7yTHPRsyjt1Hyq z?OMz~D}NVbD9H{-g}8@4Ymd_UNj22uh|5(lXVMLt^%o3AsTJ){qa4%@o^Uq@vfOGF z6UYj%sVQU!4gqNsY$uCJ)M8^V%rRU;#W2}8BWa&5qQkwZ@Y)*^y~&cUZ<{!9uWhs3 z8BsYGC#QuZ845ha5UL&7*xfrV!p>K4f`^+V?PeE1$>t=q+>99mD}_T@bG8*^UebxAc3GmPq#M51k%US0-fdxYskch?Q z#*}|4WK`wKTVvSVQ(Ebu$r0C91UrT|&~ac}s0dmEo!K-P1T*OfMd)+EauE^!;*968 zs9OHO|5o1&OHtKOi)Jm0SB!?6PEMf+b!lEW>P}OawpLAC)Z3P?i>?VPV2yolDiZDB z88F~TZwM{L!o(z|XIB=s8_$#ro)tOd8^LOd=1WIxwWzJU7{^IFPhO`*W!*R45 zS?M-gHNZs8AK@_XpOZ`*C#VBk*^ZJQ51#4*5TdQ_rX}B_`b+T-19}<1=r!kRhk_{B zn|liXvgNzi7QfG1D&Kc3O!ftCG7n8@76gd{4W&+y_jN>bJOd^_WzKH7Q+@l;5(ROW zUWs>0U+H7DpSJYi*-=~nsyp6~(|EzVy0Y3ZyhA@7Ob=}alZmNly*>yomb z_!P6~=a-3t4cDky3!^OGjw*JUM=##3cj9}G#Z0^_+(`64Q9(mpzq~sb~X*f8fQFA)G}hZ;2)^Myejs>n_D$s z^E?G9>DN*5ALk@)x|7b@&A}Z4mSl3z7G#>4CA${$AS*ixu#`37Xun3@Y^agNI^XzGG7xj@LfJV)0L zp^~Z;!75DF&9Uiv@$a5tkbP=Human84V`VlSGJn$n#)-dmg*mwJzrT2mbsW2_n!!+ z%rwLcdgP8{OH`}h{61<2^cT~=fYb6xl62#wM@ynga`@%M9J-whnxnYW*ja zaR;}b!=!oly)?JV-3*Nr;RR&RB>7RO9ENp<1}_<=fQeCEy&2PfV`Q4-tu}^dv*4To zmAY5Wx`n_HnidJm}w&*yY=0eJk%u0jG0B?eOIzt2D4F2yd0eMq}>64iR zB(6i``=Ul6v}UV|Frpci$v{gPiEZB8hE!A^*jD7 zIj&jzSY%&3n_f(@zi(`o0jHq4zE(Y^w05w*&Pw#B8;kK5(r@S&|C~G=E!EvJLB3vy zQVWh$d|JPxdqurig}o@xm6HZH>!`gt#$$MxM=~a}yMPUmlBtWno;w?4sEwK0L_XOW zlNv`wSem6fqh~r)iyFPYs)xV3(@_N(x@*>{SyYqjC~3%*pL)??>1>*swSv3+;U#V|H#-+hJHSPEEj0 z*VPj2&k@e109J}8LveUt_{F|SX;3(nVA@HsDr}@iy21!!Zv;20>fKt16*tS< zEql*4g$qY$g};+%V#oT4kw%{Dux82}XDB1Ua3`_{q?nL*hX=S~+UbKUnprW}jq{Xv zg+YFJFg}~5M1}l~R7}p4;$3qr4h^kZk8ODmY264ppbBadW7?_k6+KoJ=i=ytR#%P^ ziXaV}==5;C;4u)39GeILAB{G9cAM1n!1>Vph7mfa41mE_QyaI~@=C%HjtVsnXUK|u zY9-0Du)JD}+LLhg2@P0z!u6kUYBMJZfb#$1a(QictM;(`YG*Fuii15f8(34V`AC6A z=ZvI6X{3y@0G=h$SOue2xpQ^WGi{JUK{NGx%8F{?Zai@@hpJ&zN|8mG3Tj!!PVlju z+GLO0Jwe9>WYX?In)O`R%UgRjab=h`rM9m67?ZnNvn%*$a$IT>f>K+~s>V}BdRMCj zsEpyol1bl@Ve^oaah`aml_qVbc-VHv5^ysoj>C4G1!Ab9@=!Y|a;ZwTN2rJeepKrBah$OJC1$fns;_(ZU(FN|J!hO2r`zp-!n}l_rj2DIw$k))W~yvba`{ zNZN!u0!G^!Z6u|5s~f<^0VGYfoo!=R9lzI7lBjZCBcrOg`~)JB9zz4AIs@#yg72X+ zuh^6JGJWnjlUE{gUsm9#J98`9xnalcP194^Qj-ihQ_wFm;=(vd!?QkN({nYphhz=Xm^3$9Q9T&T^ZwRw{L9$M?d-HlCM7 z1Ff`Rpmpj;)mtU=o0Fq5I<4tCU9+)Dd0Ev@&0*;}3bf8>ZD7JetE#9xD_D+QdB1e^ zI~|Z>QWw2lT_}p~RjsSN^3cno7&N2vOQSZi6@x4RaR>0jg@AD%UE|Uq5u31XE*Y#1 zA!W=AVlus+Ox1G{Uwsd!rD%QIufl#@nuntb5_1#v=uF|{+7J+h$*t=2b?vmaJm9cf z(n$r4O~ck_(BL}}TuhymT4fZtht#kad8tF-iB_Js%XfJ$j|bGaklOE;7n7yY@XmcUfF~A16hfhe3C2Y_emkmphdt>D%SFng@N0^GnIcrvwn&mkk*B&HqE#CO z#`_AQ;+8vKI;QnIyyc+S{5C>Cv?rN;E7}P+gMX_tOP4Ycw`11K`tPWjrDm%)gpt{I z$p=rXiL3i5X5F(WlotrLy^@M13c{L*90GimOoh3bx!zYYXLU^X`)m6$u)A`BtfLjj z{N_S{fW~Ry!85$<02R+0HCi<#RSO$P{9bGHk)d^F_63$3G-EiIB+;|p0 z^VN6P&270^sr8=v$07@nRYxj2O}(d+5Guw>3L%;orX$HAX29psqi20hq?BD=AKuLX zjfXpPsZFAHb`OO{d6cW29ILCPr9`RLT6SO2Sl)$~7OS!3zmjfOAby0!)L0m9^Br$( zXHC~d?%=y^e?$d61ZN0qRe?|MxIdp;2wkU1XVJ%6PS2|TFlhCI&t?%A)n4Y zvzn!rDIl(qhtGVyIF;S2ARHpWPo{=*r$R>Y`IhML5>m+6C1+`8j;E&Z}85IRHJ)45)7<#k^^)+OGR>aw_u{Z@b7% zI*vGo-X`Gl6S%>Q(UKSspx3W+|#UN?ND2uq*7&M>Q+f{4shY$v&SZNx2a zN%!w^1dFHtX@)6&^5#^_rtJ#HOn&Ehj-}ZjY>I^`HYIuj8_zWU%>_Vqx1}{Y`!mOdrI^Cm&5UN^P!v5?g#2Ml$}6Y{@nDb%~jn+qn~CTnpA)5 zX5dvIyq<(9{hYbK5mde|&3Y}RMrKM|Wd(x$Y>HwWux`6vW*Oyn7TPQ?0ozx{uMP4h zk{dT$ZN_M-a!Yq2=3aYwVYiji%mq4How!=@-;PVbcL}q^#>us_6Yos6#)9JJQ0r)T z5qweb6))26j^1Qzjr_rN{GTo!dfX{thcowU*UCqj15|>IbT^*K^dOvwxZ~};zU72# z6)Bv0ksHk68a3`rKYIH9ku4}?vRJ|VuUOkJzkfUZi*~U}JRa!(TC!*3)8+NT^Tiua zV%~b`;$2TG3vE?y0L!HUB<)eW{k3qj+pPci!uYg#QRjZH$_3mKeaH`}&a`OhncLy5 z521gh)ncV(?BVnrCUi}5;D{b}p5ES!+vuE40trsn{Z#eM!?i1#UhJw3ZEcP#5+rB5 z-35-~_Kq8eN^Q>G zR?@)r%~*VfuV%w(NE9z-22}k@p6s{tYs{v2<|fDHJo{&L7PoNT&F42J=xh4!IKw97 zchG-Q3;xwSR$Ym79X$0J<3nB@TxE4n@8!YViWpp?#h88bHI#L=YR2C(V#LkeT&7De z!h0RZFr0lWG$mXW#97zK>gF#LZ0&E9Y0eqOmE-6zKw$$&l11CM3%XHO)@H#x$`1IAKIZ_|G@?C;$aT(}yU z{L}*eJze|V1uD$r&L95$_wo?1AHaEAlXv*vcn*#~QkY&-4e)JkHp`hm&y4slZGYFS zs_taqFGC%!Y&L@2J!<5Ub5Q1j}!F-6zae&R;#< zP@dP~w|}$k{4Rj*W>IfLJ+P6>e!zFm9vdzmMSi)B+Y~nNgD*SurSqUmf{_k9>FAd3kFPip2sIJ5|z;Uz4|s9X+4IGAT+p@X0epAkU!J{;_}&IHcB#m zDX-Oqj668CG$Rb|^>D06TT&oir_FXXKU2?#oVM{;rCuesz&sX{dMSiwd?+5?(@weD z*bwP=RKBxmZuIDrqD(ZkxNY-Zek5$VL%nPo0tZFcWA+v8HRqX^#9qKD(^ zpgv?aW@^gGR=lC?m*H16CL7ScsVQ-*Ku5RkVlW7=KtW&E_9!dQevK>+$M)zeRkRF!G;si}zBUG({b6Dx1@XEBA0gPCLKrH}P+tOj^PI&r67& z+CP7(@D#Xxw2wN9e9CHsd0j_3}M!- z5Z^gUB+^LCW)h-ETgQS|W-HFf1n#kql8tJt@*-VI-0%~>_Q4n@LC7zstDj(wXF0Ga zWoc^nJ6Rq6>-RPz2tDzP&~{@O?nnB-gevIMxR2XZ%kM@j*7TUGIxmZVkxpmT z#2wSnBvD^!XVqb2L)e+Lgh^aPGg#yKQK$v$<2AGxBYl}j*?s+4 z_o-&5U-vUqP_>KzI5(|-<`Bx(Wia5cn)hhYWY`U2fash|ac%OeMb<^Lt@ILj;V6@0 zsE3KFDdL!u$MVo^%BE`O|1tJoEc_ihaaa_r%_{J{ni?r?P&~W=hB~VAMak`%!uh%S ztgMSiWJeIy#@N8aLX_HiA81B=eYl8}R-p^%dO-mz=;q0Cw-O=-foizU5*QLVKC-eV z#K;SYjz#ZhgWN1C08NR53OAV9lISDmkDl^$lnDF;v8H-8cRkUO%gis&-neo>Q6!N+ zdTr|a`P5_&uKMv3h+6CDJu&=sBzJxt{+9a}Vey1sATV@r-Y3Z=H&%y*5G13x;3vdU zgVDo*l%=r9Y+OBX;(RItg{*LbF;ECrg~k!gJkADy3-|TDa7OgcT_PeDCqwYdQ&hr$ zP$BGM?Ch&#;wF}Tbr$N3GvB9_-LPFwsMFErGLq#yc{ghEgQ6p3&zgFHO36LH^p`1mI zA_~FYx|PV_=p-ag+wmh_|u7p%y&2cmx0mfRPeBC9a;raM*A! zoz>d^ny|=7Gt3lmtN%5WCs#_HIB9rLN`)jTNNVE)QH+AXy`UkP1|s2V_=d4`Ccz=n zQb4(kbYIN80h$3tuyRTV47rVIbSXhGrdmVT2SPJONKILCAfhx~T42U9^O<9MWyl&J z!Nx!qSNO_WLy$=+Nbv(ui1L$D&fiR<%ttP{azW*wJJzAO0|%L^a)lHP=oR?HGoq2` z^Hu^`!l)t?h2ZkaFzIJRem1D=l037P3RFa*a11b|Wafz5R5>oFB>q)I$FEfYwcwa2(md4aG|%Eb~QBxgMK^9Ar;B+eEObGU5TB{}k8+ z>T(72N2M+KG)OWGDC984b^g^+CXk86GTLq~%b^Tcrd=H!&S#-t%!(3&rMbv`mezA4 zhqU+TDHubX9COBLkC=+XF`~{C!v6w-Zo;jVW5b-*U0Xb{P&ksasup{7L9WID4LU>p zJkY!<=-&Q63FY(>VC|#|;<{Ynx>GA>kGBS?SmZ}$9*p9@Z4in7Y!~cDA5~X5Sme&q zgLkujrIp$WnT@0=VRKiXb&N|(eBR?uKYdMAWU@7imJi_t>KD$mkpfuiGXp-8KjM=> zP>5*BOi7JV$-mT?FLDX3!BE(vb@oO>Nj?vnMucYSZ;jA9 zWn=Gsv$LcF)V1%80QmMTs0rEQ+=4A$>#P+a{zTV+29?2(v_XO{F9{YKsG{*;WLIX> z8h?|C#Uk0QSV0tP_lmnZMH*sC>-A&#o+LA+7)1(yn)&J1LTF+lFCe4?{QRT9nvd+H z5I*>xD3a?eoI(&6#`zhfKzBzASfQ|b@WCmzmm)Z<#4v6YwacBiBP^7#J*E3;YDw(P3F}$4VP*Ii8^WlF7={YZ~ z0pWj{2i*t8citvvrVkdZe-AaQR78lJqL?r1;H_mpNnQ4qFz9d2My$+)0Qq7UPX4_) zf9G^9)k(y3S?R%{bL~G0tO->zHzN}oxAqP6|C9oP@j+`8_kl=y`1X2}j=!1<$ff3U zUkC=_vJNJA3!WA!0vOdx$aa}?oq7D zOSo*_>>>2bd7LoOvQ}P0-Je?kU2CcHq_5rk-0FY7JVYOQ(_r{o_9M8V!O4^hy20ZP z8}oFET8h*vy43{#E;io)1kWb>&cygnKM0YvNhwMBMDEh4u_@v^gl~Td-XGSeX2HPf zk~y@K`m=SGMdBWlA{XEY+<3Pt?cvOi!^j^*x4n}uWp=|=Vt>P7Ic0}%W%LDuKvCiK zB5L!&W9Qw7!HGr{2?UE^Gxr9_L$g6-His5$TL6|o7Tzb7R0^=tJZ;wJ9!kmV%8 z78{F2>38NqN$%-Eb%S)#8E)<*IDMrfV#XpKg)zH?w^b^DQD%LDIg;_B(aMX|XXPwn zDRB~ujQRVLl5#_$WSIC(#s6*x@IRx(x6st*<_r)-@Sm>N5b1)2P6bsK3!1{WhoiG`s)KVtkC=W+ zAc%{^HFaJ3^xYjww;hRT0%Y*`Tl2j-s_Dets~8tHMdrQ63Frqz*D{^y@;6kfDO1gPHfBX{2jgf(P0L#af4?Vbt4nQbu%w@*$A}PX{I7;rTC; z$H>dU*DfK00~J(HAyv!4S09J_c$s(1dfHt3`9G(DnDB&Sk#WH^(d7xLe}k$TiE&GR zwRXY}@WT)|$0WGG!xDf?oAwP1$p0Ri8kdW~KRWC#uni`A4HhjB)|3+jRFi>u&W51P zyrLIf`A)LN^dZ?wo6=A6DhKltL+YMFYLtU-b}4LyNDt}te84Nt+A7UmPD7h1!^BSZ zlJJdtW}NC%OFWF^SvSGoWp;J&dPFJZP8Fmzb;z1>fws$$!l+#E3V4I# z`d^@Cgb*xr5+EzjcO1}NHHiyH{!T~&8;%?}#2KSAuGRTK;#e+cS^`tz?w?EO<29|V z6t9krnVUx~{Y38~Cx%q-p4L_l)wj~niiKn-nFgwZt7?OB%*j%MgEhf48FY`<&kw64 zmlXN|*&p$H42wBh!_bYtkWA}fp|)u1}%u$(Wo_C%u9kD zMJumGT;0+v=`{q;F6m)W(HH}0jnT+s)+Nug{U*gN*ZW{El+S+c~s>G8GW^DQzCB<7BjTlRQF;qUwJR?rn zx4P_N5B(m8{b`WDJ;}s1ov7_9U<0=Xb3)_cp!NIB)l@|z+=>Oj@YOGQf|!l<(U^lg zId~01H2oQd6_!Qeh!>zs2Hc&Y*&q4%prH)*Xd*(UH8~=5=RyrmWi&(A4C_K`yESTZ z3^tBI4Y~~iIL3rJ2{w;sfNdneN3qOhD-wk_^gNaf6a_{{eT;Oc(anp*;?4QO&&@#f z#eRj&q}wWGFcu;1AjY;S)g~2jtKV2T1N3AYB@tks1M+4yM3r}2^Q3Cy*|hl+w1@=| z^XA~3A=5N&8oJO>AW(bNPrJIxq4dO)#t$W%%iEA6DB0cs@?K@cHLs;9%RAhn^xf}z6<#ul^$pdsQ| zH$quiFxx^&OeYPZ`gJ;hvU>GCEISD~jBbZ4s1^fq_$HVdCf+z(7jB&a?E0m`5W#${g!^3yp_0pi+mH&6J(GT8$nF7ehReH3x=;o zhR}NqVcNRP&>Ga{jB5E&1Vm3dsixB>gvv_QB=qd0Z3=HW?F%e_HZ_m+e|nRoH@E-n z*%#`^0qo;hXxXm-E6jq`ZjW>vL$%gUqpTp}3G?F-t#^6MQgEk#QLaP33yg^nE;T8! zi7WiOcg^?~K$VX84pPvt+E%H6r&?VvkQVD#KhhT`{>7H!HjA;l zAeJzSqXuCO-TmnvkaTkABMCx*|o*MnuehfjS~&D&u+lC^)JXg-7OVm6*>Td#ndMjT|-Gmt|u zJp}T2nWmx+Y%;`-(yTBw+;R||5W6RX7mJbgDp9TQ4Z>lU6wg zoY`7y_(VHT**gvtgp4%fU+Vy87qAXWEd*Qaf9Zo#M` z5*gp~VNP*bwTXEzGtAjLh^|@|u01X&*I|W;gr_8zbavQeb`G2GtHAeLJ^x6?WJK|; z0dtqf#__bvX50uvcN;;O;a(iczQCVTCt8+*ih}rdkNC-EK;(rlKfzinAZ#xfga(%9 z=~I*oe^EJ%3J>!=u0AS()EtC!7-+_B>ve0W=Sh+D63M)R(t%)X{}H=~v1gUWhyHUN z>H_@;z^`z}Gf=$MXWUUja+Cy51``sGu+Y3Yv>!Njiz!=*h8SFIVg^Yrbf7zzX#3C@ z@$oXNp;i89H<9ZT0r=IpdN{b?v=Dw+10wR27a;=s?C(?v9vw!VfRAq=1aq#ObL4xf zy4W@~^fsR@U_u8kg^Y~ffSWjL``CdT7o2D1lbK>WVVszugp?$>nw5pBUMapE;O3A0 zOJ*ws^XJtQ3q7tU8G8LJ^sV>M4fpM8{j7$#Zl5zH_wyfbs|{@BUp&yrAgqC*0a`6| zR-FNmL~SA#kfIBhwIzmJEUH1eS8*dMF#%_3!12+$Vaa703gz$ZPX^X3G01sx$h;01sDhCas-bfkv?gkhwkDM>hJ$k<4l{vq?-uB_T zp$9`iZ6ebVMwAI8Wi@RAhs>i^;Z?P@&sA0kWookDW#lYPhsA*P$zA(_^j^!o3XXxH zaXwQf7A^V(Gf}bmX-ek#+=l_7x8?SvBljf&lI34qZ=n%{KsvmuYpH>vX5_Q1J{Isn zLaAaES99FYP|LqRjFp}lp<_WZrkMs6Zt_SPL?8+R9*w)EjT;Ba+(Z`7w}32$DqNWu zifglELQd23mL{I$1}%PssBe!siu|s* z@(?o*2GrAF8WlfE1-q-048b#^ux(Tzt|3Eeu%aYp{h+eTR4o+~PE3P{t&lALRTqhz zSE;+E{j&hF#go2)oVxR}p@k%B`Y}lwHVNP{EG|&~9>Lbp)`MtKqz?}#%`@09kusAW!MO zbmgM{{TPJ>)~#BQ;G7FWM^UDB4O6|d9k;{fvE%YS_3twUeCOOW)^N^bKe3z4pwstPSt)a#BBijh!mw?#o^m1W zGn=XOjYah9I9#78c2-H8JX%ynnAHnOu~UJ$a2r9R>nI<}cR7?Evvf*>GKYjZGxN|b z*n{do#QE4Q(`1guD895RhOBdugpbYr=TR1*UyOX2%MLi&BiJE1vooR3E|_~=7{jTF*={5O2p$v| z_+>;q+NUEG?Yo=Uz8$v0#H2F zsTQ^sYZbfDELdC$K$`q54b2(bF7jc^gur|QP_cr04~!yAu22Wb6*GAqst=nd!2qW3o^*)k06a^E8Ad63Hzoq90PCk2X#+bCOQwSGjchgqO<=bYiUU$5Kin>C zn)sWzD-GK4>I*5YU<@paQ0J#rEqnQ7k@=JhWoX9t7FE5tb-m+=Z-#}91Ov-lQ)WrD$2-?>~~a7 zLI)_pk88N<@r>;4a}gL-S}^2-jo(-IZCs*M@s4$&RHuv~@J9oh$2!e8{AH{xb)aE1 zUBL)91+buBR3uG7;V&}@ni(8LK)KnZU48d^etXtJx=3fi3C2WYXFQ{zqq;DHn>7o} zIHGI#(H`a?`7UOW3K=5voyP_WL*5M>e(R13K-5`gp82VvW0>wchJr{p1{jl$TnBPS z={O1Gt)Gajs;CM^zbb_!+2j$pi(h10WeP;z!&XYX{!!x)LwQcJUb5eSoA=+ulC4)+ z&a3qd!aF#|;e({?3DGOnu>>C0m9$#_aah*#-5; z=r>ks$tz(@Rws}Ybg=xK-$)z%>u8>i`@iI&d{d6r_(AExOu78; zWG77XfcgYR%f8=B?x)7x-;p)d7QAbzCoJ@Mxe1{3d>RDq9J`@pGTGC%8zOvji-K6q zV&5i#VHL^xm60L>m7Jk6NNrJ|T&^T`Q&bb5JBX?;7{>}b-nl6|oIr=Tjb)=bSoB!y z7>M4APtYRFn&>`T`Dmkp?I%P6yY=D&2rDdO0~2G^WaxC4_}De|q6w|-ZEjwzxjWW= ztReDR_m%IM6lmU=DyA0~i97L!XK9Hd_bW6d{~mj8riZPhFz|hm&7M1N-V9dNH)lOu zFP0U!U8KM0*fHN|z+$E3Ym9KY@+zE;Dhc z2yvBn7g?ld-{LFUP^@9lX3b+xC5-DsRh|ooa&Qd)0<=lg392(k=VXvDQWab4SDY${ z2Hobo8BB&HfQCPZ6=hx}z$79-@^nD{naldPJ`&pCq9Tdtn>s&Qbg~d(vTSm5 zd{vh2ek47tCVX)D1yX9D;k42d2AO_!XYHmOjzkhaoM6vo#sp{o8mxBW6ClcWHaSc|$y; zz()a>BUNqDgamV86Iif=k%T*1o|aOd&6X+h6gfVozIv4`!+&0t|F z!*T}6KTBYaYQtE6hM@Wyjg><`gKQD(Ey{vq@)a8K>yA*^ha)ILZf2k=L+w&)?ufFO znhb>|(|~A)m1zI7&Ke5kY)KgY_CZz#$%>P^fbM%~hY(+GD9lS#e-YmLg-U8tAoNgB ze46KE9I?L3u*D5X#s=jXr%3SZng$um?;Np8WZ51`EAQZD>Fb-vp_}6(^s~%Nx#r6! z0kPk*E5v0g*d{eA>D)6?X`p+R5SOGA*hDea-X&L^qQWD*B9I8F0 zx=~mJ>F+6mrpupZu=haxn~t2nVP*HQ*#IG~H_Cbq>D(0+4C4XTvTx)Qsv32%6ks znLHuV0g$47Mj>1l&n$uD6jTf_q=2YElSEExVo4!#+$oDW^Umwv%K>B=>rdKl*D93D z)nlKVlwk14TF1;dI9ox5mSDnCMYsh;p$6OcZ6LX>=?6vEJc^he?I4^H7C%h?bqGiq|B<(fR1sgUS*a*)>M7NkT1 za6>>v_Ri&}Qy!b6!x@Dk@-o5bw*t)j;JczQG(s_P@c7*)YKjAg4MNZ1<6>`NMNqZ1 zJ0|!s37j~r4aq~UQG(jyE*NQz(`~~(W34RK@$}yks_d6yK@E%cV?9@Z8j>16+IU4H z-BlO7^pa(zQ!7_H1>+iWlY2yptov~p=S0bE2Pi{C^x@4Byg@=N<^t(+?c&e@Ys81g zMwpz+Sg(5kaiwsCevYW6`ePdH4r$VbBKZ*go+$nHv|r#W6k218W?`_881RMNB&L)b zWuoe_FpyMNr&CFlN%ta|-&HeHO2mkl=;rij4V&0qLzH_#3`;=_YogeUYx-SfpaV*| ziq&9S^A)dHqM4>FCdi`pdYaq-&6tVHD^xCv3zMem(fwajd6c`)HM{3EV{c2HZI_24 zHAVefr3-YP-o$r z>Zv-{NT%ke>|o@oNzRz}cYV!`DSZ$p?tv5R5Pg zG(@6rnm7q%lFr6JOBkAOWXdV@4kicc@*H*)#*)FALKL<3N2^n2U>#m-{YPo-@g-m{ zvTS?pLgrki+uf#{*B;6ntPjKjCi_+?MOuNPko39E@K4|8PV?_q&BVWt|<1yt=t+uJmGDdhg6%SLMrs5d|IfmSdWmvdMI`8JW<(_AGup{yKWnL6FWB{_U*BpDsTZlv#;C zOA=hTgt?g#WuCh8Al&k^uLALBan!JPAR&wSXZeao6-aQ))oqfD#6_A&`{eH2U3cgS z+brGgcIvD4O;PG5?I}x{=IT~4hb}+O=e3Qzj|=jmL`~svP_r5z#U1*R17@*3D%?#4 zNQB(92$w-W4YKmHy7+ToIWz84C#2DFraFWXkhxLN4OFyFY1YDlFk9!LmgCP5YHgvZ zlaYScrPy%NVW2BptDD`RYS+lE4A7R4h^%`g1NMbfkJ^r7;L(uiUjD@m@$V0!Jut>k zFjuiw#Q+clZKWK^35~#+Hjq_5D2#}Wu@L`}5zUzHD@L5g8g89tn{OMN-eX}+M}I>S z#0-jbuwQ6s1y}408bmJJQ~2yfmQe0Y@W4wJ#H-RCu%Pr4+OC0@sph8+NJ+s%C$$aa z3%uq6ND?ML;~5>;w869>)tLzflfVXcL^ zF{7xuDd%;?1^I9L?Qrv=%iSMcm5MGSiLF1J>Ai{5A(l^ApjK|;D66fWIq_UUcJWyT z3iFB7lP<sa)oAHaew)SUE6_5yOYg$Y~GvrwuTw^ zsX+4kKD7J)p@*odwv^L%CI}o7;$K22-V4+WLs6`vVO3|1vAyzYIFp@70YL6J9dI&= z?@tG4y*Wg8baeW@ivB?Y#b?Pm?~;T5+wYyZ`(e5o_Kg}$NyU<3b4{z(Wtm*lziHIR zJBw%eQE1T7~YkF2*x z4k)L>5Q3_upb#toEJkQE);TdzcwBgFWNCTmflwrT-&2#iA+cCIE>z+^lp`?$UTN-A z?0fQhydicg+x5gjaVRz{bo?>ae$ZSD1~cCbH4)|C&?M**a~5;?oa(->o@?RC=wa;A z$|bmJR)b;mrsc1~2|%)f@MKDqf6W~`-DX^=W{yqwl)kpY(+-Xg%s-nQ&UaC|(a#uT zTEXB&topCa<*j%`0;cq*4rb%YG+J?&XopF(8nR%=W0KM#&_Z^fj zVUlziOuvRZccJ zjfsoD?(iRGp75}44B8`?!^JuB?2P;Gw3dx1R?*gFNnoDBfkb`1N1n1sd=L#k5m3Z! z_S-4!CkomqvS`8J@XbUEVB&;@rO64^Hx)zyBhoO!#I$;2#I)LafZv;(qKA}eoV->Y znP!1OBM>fl_CPXpU2^bZh7@RWWKyUF`dID-V%c)+e{k7o6L%(S7s%@UukME_J=^a3 zHi%g{hQX$!8hSOJhpE+f;^gVON8$t|h-3YIh%I9Fa%dO;waqY$-x_IHH81@D1@!Gw z<1`LIHT?h$_kvA0)!c^iAUvioSd=K$!5_&)LTB}VU4#v=IMwAq@Xl&gN9TW;yE)M! zG3GZ`m3xRHIsxXJh70;nb{YpcHYWsS!KX_#`V_Oo<+{8E4uBeCj9E={a_@! zkLgH$7>VhiZFbed$l4Iy6b@SW*n08ivF59BnsSil2sa)Ht)eS_3R(S_7*^sIKb>EP zO-}2cAwXzQ?lF;n6|owvIrN1q;R5Oj=!aFy%;APVT_dP2+HHjQo?4IZq?yx$V`^!~ zV-NuO!;I`F#7aT<>I^k>LRDmn@b_hOrA>%Z6-l~8VijZ5vN1FbAM50Fv1a{{QLk8GfCqny0_k z|E;gp!Y2%+>w!|}svvXFZb?2yNjHWd91CCWh>kWM>? zcLT;}Oa|*|GwiY{G0}H6T{v8wP$FS=PNv&lzr2Gnt@m$hJselHKM;?tmmN~euqc9G zc%*A@6gu_D%ws}Bb5sz>xCy*#A^(*So@MwA!Eg_Pd8E}uLjBw3)khsHE4(vYCyFee zY&HJfxUiXcA0SsHqJfDT9A!-c9qqD=0dY@o0a_&xy^m4TawI^L8iXN&zx$lyM)Xn~ zsd=MDDvLfZEAW{d^=w4OHC$hUL8S_hG*!YwFYFv z2|S`4YR{o}$i$EFT+(VFXGBSf6_-=RrorJZ7>=WfL9SR*rDd@NQ{p6!D?ZnzjVXYD z*Zo-}+a_8Oo|BYLPmPO#a)5?b8k%7rGImy;fxmuPL7BY|O0ob`DdFVv~R|S6VOkU6;JA zPbEMBGjnNvpPQ9(Mj4+0>%6j4-J}5gtN>z!doN98 zDstL3kxH>~EfeoI{4PK{W!!C3FU{(Qw`n}vp${H(O_FCCVNI5!8W%L~e)1IxQPOkL z)$%iqFBzgn7CPKp3NA&h)1fF=Gg_J}C*&v>ncg+Zd!OsWZH@!KB0Fu^ke$eKs(%{1 zv|y53=Qw@T>Mp#qB*~ z0u`nG36R~IFl>&O(YXAXD!WvJ8Hbutut4RjUFw>K`Ddj$+iljmNA4QZey_8FuT^hn z1Cdb(pqJ@dghwp9rIFGja4MW#H5aww{yQAu9QRcZ=llDmXU-W-`vcgy3kF2(gXzI> zEy{-Z(d%lr+^zb;i$i~xyKGl`Y`D2K!gAB#QtC;z>y2A){>{y~Cvr9Q{gmW^NeCa(wV#99px$1TZaP^`x>q#sVpFjs19k3r4wSC=?@ zyLz}St~kPBNI{;zI|COc8#SoT@ho|zh3Bi2w&SL>OxN4cY4J4`vHY=~3U`;3=DJ&L z^bx-r_Ml(OgXBS$Dx1)+j-^n`>=xfPE`luiP#5xIw9r}NYzd)E#adl~FiPq&nF%yW zy0q1oqvQ^^q}-JqejwNZSx3-9bY6@?8C-^R^u#pHU$N?6kZeH1*>_oF!}}C=dJ`3o z4m+cu`<=KcO*bgrnn2Kcy7DVRLp<+46z&I;Z3sm60eD+V0G&_&SVOwZwf+KS535K& zOv>Ko6_>oL1~;n)%gxRmpWmAmMtCwT!z;dbInM3z3Y&mdYfa&n$CAx1%)F8FmMlT> zY;%s&j8ush2%^~zG=d(FS&ZHBl^2^vJsUx>`|ZU%_jKEuy9v+PK~+x9f&J>UBq+VT zzfEnaZ2dzz!|PL*itMS1l8={}YP*VgJRiEcGv+^Z&-Uc#7ItxG9}?5&mU^-$YY;c3 zB;S(trRoz(T&)Vyb5{ri-{*$qa0IA$v=J<8R_krYJ0gJwjxUH_Bas}{J^UG$o@K?Z zka6~%u-&J&C)~-~S?0?#8#kWQT&Y?%y6q}{vqh<&e}5Y6$F??~N2Hl`@GyC1iFG}c z8#;vX@w*9ucdi}y@-`?$CpmKZ3DB-~M~vgTCP-W@L4TQombsfHb;hfg zeY86GIZmJMzj7G$P0DI$u~c*XSsQU{KZ73ofm^$)Sas!WZ~i#5y8yep5Dq40F|kqs zgudN^FWNP;yQOBlgjPP4RQ_VWy|XzVNSR8upM3%b)m#l#jjNA*oyH4X&-$A6FN4h- zYwvReNk3W5fqz`zr`T3Q%zmx~LC7SWB_teXBy58@e&@umMAUs5)16hvLjuN<1m(|@ zX1}Es;2P=S=^TC7<6o%H{`CW(2^>BmB1)n{!J}(FlqJFR7)qWQ2K^oG_-hWg;;v3B zPMDcsg#PCGnj^!h{0XB+KKY3Rsf?6so7Zz@SC_Cnq4ZqcU2199aDv_B5>ke?2a6Te*ap38KB~Nd4|@s}@&|t`r|hhcygo zePla|2@B=sW@VmWRpB#^`T5kgQ~m0y9Qpa%0`H3%o(lX2Olb}S`$d&^4eRB=*L$WT=&Pf4$EeY3#(%2?<>xy%l_p@}9H_v_Z6xk>%x(y1K_Ea@DpkB=MVw8xz zmhf^aU{WZMMKkDj4$X>=^lFlb7!LQqu!gRfI7}`j@@1BvzNkcKb(d=iEN%-+%Cx?+ z4wrLtD z5F)Bt(2FQC_w4oYphAsIKd!0`ZHSDLFx=*FlGQM~#!+A7DOa5%SRG()EZv*-vBJ@4o2!uUZlI<9Y-g#09I{>QvDkCV&*L)V^r~Tu z*73!nF)f;6rl|2CA-)AAXuDoh(lox*xiIidvn5{p1fs#;D6WN}P+P*0$f1rO#omiY zJ3ut%tXv~WG0}3Mv)-_>lcAddndh6eXMUK^G5)NFS4n}wOW?3XV}op>bYc3@sd!O2 zoh_^)9l40`&;S)V##2$xz{Vt$s)#2QvjcW>7^3ut8kI0|1||7=Vujs~sg^uel*+&IZ7l){zl^oYzt{8N_gmowbz+%=~<0|gVK#5`JjebPdc>{kVMQZ;?bl`Z7Hn@y*8OTp6x^vg8|@rEd1w1kYyd)jgL-Viw2F!OT*$!R;Zhu zP>*wG!$meTmCHO{n8Homu6`U-dCv1$dOXGOXOy|+l1y?E#T(OweL`-;f~tZ$2oIB4 zdkS$4f^0K81(gabP=(pL^VT-Fjuhn zt|FZ5*$9TI>EVuQis`QAy{_({j`!X#vZ<(YH7ib=vv4ZUU?LBYG%0WoN&%r7xoNX5 zCJB&NoAIU61BX>fY8c?~H2E<+g<04HOVh(Vl)@ZdIc{3O7ng+@oCA!O!ckUvI5OmX zv=P@a$;O-TV^fVFow}ZzAwgRd@a{XQo!uoGStQn;3zF3hUVLdVy=z*R9oM`VR=5M$ z%~n%|hns&%p$4M7TBtlCye!BLI{E!_5y8?@6>5mnLaWKTT4eV0ph)}`kS?vJ!6)Yt zi?O6X&doD88Ph+$JcFu9gX4&$kf@V^a+jJojUm(dLX7pK;F8X$q9q#t$}hIYfAgvW z8tb&)bkvn>Te9Ml${?eLo?4X5m+vlu$0G&jnS_JwXPCb0cF=eYntprAX^rTO_X)laU49BSXvYR1uTQSUQ97dE1yj;|AQaWG)%kPT>im$jx#@P=cpvpuM1Fg+mPEmdAT zQ8K*5g|~(PoWhxTMC~{fK@(F8J-u|u6Yzt+kN%}O}V8WxW-Aq-=s4T1dkC?5@Rwajt^4Axi_l5DRO z7#`Q3>ih%RdFkGmuUUB&tCvY!v2^HlE{%F(e8Ib}{DbZODxRMpPdNpu^5F?(ex2p9 zt=P+GjBa`b(Hm)&QH6dPChg0(JO@p`JHzC%7l=J;1+oK^F_WB?;=0 zF*7{)FgAuaNqvT`(@X$)`?5dn1$f&H@J9#|l9Jmup!u8p)HoE9%z~4D25-WlJcbBh zy92r`zi^_3HoFt=6xF<>o72Y_TB9#Kj7?A@D)p^yaEOK83)a_4w%g8JJuBzef=5#; zuQcnMH)dT}m$^R%dH5CBa`5S#!fhU@xkk#Q6qp6%8-rCOAkzvNHl=rK_xQIKEWOhO zFv9gPVshW-Qr(qcu%s2#W;wW~AV2BlyelO%-DT`%Ji4A06=GGEM~^pt0{6Sx6t__b6E_Pv)kS0JBO1=0Lw!d=}Zl)PiD&trGpee66*nC=YYyVLmA zXE$4;=x(SYKfjk&Eu^LgQni+u{45Z>QO~9?iZj+xH1iX^Q{4+8Uf{Z~cJ7s28$I1g!twrH=z><+fK{upP+2q{ z-6-^GA0xm!(BLApoEtOBE4TyOM#$Z(({&iw8gJAemdTlHO?N4pKB^IX9r)$X)8VV| zzIVs(;R2}&9v|m|lh96Ro6gGF$rId~N-jaT6@WeWLvL2g;5UU<7x3ky$S37&TgqWT zV{q(gvb{bRpI`y>b7ns22CH%2atR7+ZNT_F%?~eS*}v(wb+djU`{~-EN~5Penv-Lr z575HG)K;p&aD&6D_rY5gaCM#Q6=3(q1Mu7f;WtFuf|SdB8a3Sh`5xg190M4gfG~8O zy*Pp!N>A$l1!6UhdQbIMtmAO(1@Ls7WY&&~HP@7_c)4~3yp!HsX8d+x{-Nih_I}2N ze$m)?m+yMxl!N$UFsGXrps_+#X0V`!?0;gIg&_1j`ZXG`vEY&wED&&-kJZeEcDVnf zL;rmA8`o#iQ^{as*bSJGnuSUfFyD;#oll6@{yiO=-ZN_80lX7Z?q8W6PT2f-ye7hS zW9#nZ$b)z3;U1YI5P;^SlnMwxgoq6>|uFK;EAZ?PfYHWKexy zYS^4o5mpjlUjw`!HicrNQz-b_gs>7)N#+C>v1~r3UVnC&1Z>y*e9xrY{xnMa-w{088dj##KHUEO6 z$@>d@l@t&;yQbOeC2Baf<-Id60ZqeO;U>+Lf%o$BmHs6^MOHDsPddX)!7U`Z{)t_hSS&_*; zB*@ImWI96H%>#YCj%}aRF`A#v?|r~dtI3dY;Vr%JKec`|!*Ea(KDC9pY_KBtsQ^CWNuMO z{sa&*4wylV;O2-R-toIlTJZ0+=)g7v;B7G?r^W+63B zkyh%~yZgr>z&;KF`LuRIx3#ozPdJrgbY7mdI5p?7Z14i?;5;7IeGIbo<}>;A68Vd~ zya=g2m(B#s)3c*8S4z$l)9<*}TmOxtV=|w`{!69g0kP6rc53o9J(S=seA_49%kt$; z%ggJz-9Pun|Ltz7=q{!wSnFXJ?{V8Gcs28Vl%UCAv(71Bv*HbIJwq}*?fhp(mWY4g zoj|>oM_PPVW%Kv&u)zh5fZO;EaJ+5-c#}6}lG&q#g>rSL188{BFtW?flw@#db6Ohe zZ53icdWyuZ^Z5F$)%t_O-)*@5%X+a6#i-AP=?;l+{nv-Fh|uIZ;q_IHZg9toc^1XG zpozlU^+@j5cwV>Nr@NwKgI|D`o&97zA+?CXrQLTHK8WS!F7oDo-&TXo`8)wsM%mAsyUx7qPIq0>53 zZg>dS2_$XLBOnOMBzy_=lQPg>Yxg-(%FD+BJ_Gzd`+I56d>$?2TZQWLxx$_}lZJ(MsJd6gdK_TzgV1(|o4*Xv+HQnk z=!t;E)YxaCf`3=tolPF$$np-Zl3!fB--A{jiME?BV1rt_UW9tS-qa6k=vyWyW5T!X z0=i#ECoAK<=CcJ%BEPgg*e8p=uQ|G&k2datKa}eeaUgqUH<$cJbK$4)fxZ}0U(d~F zd5q^d8Y7p7GQFO~Wt-`A{;p>Ulrk?*xNj47o&*T$Z; zFUO#7O7?Ycy4~`udZvcW>+3P6(;`q{!Ir2UyyM1;`sKP z3jdCh&%BS?FeAmCaGaxI{k5u|wGYFo_Sf`^#%(n0UA#7v)yyED-7EZ~Z*PtMp-$=qq=5auxr=NZB^u1g{5vBzhQhxl z6?Q(1eDB7q)*jYHe7e?%(g)D+3xPGE$3{(&YbI2JaFc6*2cI3K#{;c=Tqf_e3YT|W z?fkEmbM~GZ0v>M-pO1X5W*vHSG>a1G~ORDu>a)Zp+E-yM=t(<(~8Ia zFRgeybbLG_GJJe&LR3T|8hm0B3Q|H`(*N^Tyr?)I)&E^9{+EWet%Z%Ts)M1lgAb;o zuBfA~jH8FMqfd~ty`hVRw!5jahl#8gBZrrbzL$fgm#>>wNUV2kwy%ZC|8pq5w6LhW z=)Z*G|1|%z;;a4>imz$@pP=~ehW`%5xApw9;@i6amr(rD^7{X;P&~+gKL5D*(ErB8 z7xV{1|HzXatNSe$ltwD+n~{*rtccB^!C$WOd-$Ji8B{FZKu!^lN|hzw-cT$WK_%0} zjvZMzoyb6Pwnf8SHj~Hq6AS?t234_8$ZO{)V##dwHx-dAsW-b-f0hyn;vssrlZ(EP9+C}LKbLQ7TfzmTeDj>{Rb^K%e|Dkn0EAq-Eg$rxtn z`7$PPM3%zZeqf_{TSg+!6}N%5A`jGtgM*3Xaq?;+rbawXX)8svcp>*r23U{|wx88X zI9is|ddh|`J1GrSg4o1Mp>@)lo0;1R%?pv6cDs6xBWq@6W*{7@wMo7~6jqT5Jjtkz zXJlB#QL&x<>2XjH?mt!2uKk$CrnoK>)4!f)%{;ZW|LH7Vmll{|S;jiCapKR>gNs{} z^aM+gOWg3jo}Xf<^UEL7J#4?SRdnJqje$b%GB(dXN+YHyC@kN${6PArBBm{-FKqkO z^P*hJ6)Q8@vdi6Bb9&24X^a4FfT|N4*PaZzd821O(@st)zLN=DPO9c*9Zp`-st_mb zCgU_3p5K3BPzY?6)ReRs{sT8a$iLbjd)|3$Ekt+_^KaDh|p zH=}Nj>(b(!x@8_#to7ypt}+*&Zod8x6qvk{T#PGqucF$ zd_Ik?gB2HQuA-_=z3icAxBIVZq*~qd(g*&ndD_LcJsOsXN9!ot!sS>PW$SuUyB{q zYF9op)#88%L>TpS#JyVW=7C5;v$wD zp>I^DK#k$XXl)cC`y@8R-BC_zTAbhDGA701EmCXZ;~)sJXEOFdhTONmBAL#*H@ArS5SP*9jW&72BqM^XYSj_Z7yIQn zSc3C+$_kV^>$Sx(P0BkeB+%KQv_~X~b7tWrUCI1||H;W%GIano6-Tr;LQ>pEkJ4OY zeE?*``TTO2MN}VyR1!RP0qcsk)08|9$CoJ5@Lm6+oV_5_K3#^VH2P~LI-OUu5>~Q? zu*h06GdZkg>Tp2Z^H~Ea7R1+a%S9Iaqae3wH`-|_d{DfY;qLiLXFZLI8kJc}Ju12G zq>YwHY-)uh6~(ySP9U|&nLCB}&(h5fPaYd6Ct-K8RxwS3J>8EW5v4S?a*T;wGFYnO zDyXmiDuh-2XwBlX)RlIIM0;vzXjUpqIQhv^A~Y1+%u0~3Hmg~4R1 zkWmRmv6~V#hJMLc%#ishM{*RFy<4PfQQ27M{|I)f1LUWi>gP_BqIQk34OIz4p`E@^Wxkowk6kd15=tQ@@5VvB|?N|}X zQTJ^Xy|(4pZM!O2E`s${pEOgcw&q;5de>L-MX0}c>Rs~DmZ#E$sO&K7q(CZmz7WQh zRJ96UsY)oqf8^9f3UQ^$`As^T44_Ag=|^$iwX%^b9E$`>u4ra3d;-lcCT5HYqY}5e zP&4pQuSU42A+=|=+)EL&>d5ou#>OM=>i()O<69Z zUQc)2Bn{iY4LmhK30qtO@>g1S|FUj49U9anZSIIM6Le(3J?3hXx}_54_Ne7b;R!SK z-{P+2IEiT!%T{aOlr(fw_Z#UFgA&Gx`=lm}?Oq?P(JkF_T8;mULF%e@fmO8UW9wJX z%^I225WedT2aRY&W)9r+`Yf#}V)UaU{oZORCMT)>+yYN**EPNSb;(NHNhi2$Wy?32 zBTB{)dllyhuQFfZj%q$5`?nX@dE7&$-ZN^K*PZR*#;E!3*5y-YXQq-{-5k_TkCU)n zhy4%d+8~UN7=FIf8s*_UXOn+8yG2`~|K|ah_-(gV^B`7wZRtsQMIVao?YH&e&$E0et3|oU4Yn~S zU+r_TocY(}aFfR{p~fC_*H$|;akPSH@ibrSMQ40uUi_kP?)PBvXKoiLQO2Yr1!FqS z_g&70cff{xmj-3!qHs*4AI>y>6liM2XL;+iL5+k=VFXWJWKp;#QY;fE>xNYo#dmiR zeSC+1ukm#6fkFf56#=z;PJ>I2LSsCrXD*a_D;QlT0(`*LTKa}B5;I`RmndL}H04BP zWMh7N#Wg8KdbL-7Wh8HF2t<3AQzMrfMd(;(r(?pxaLQ(Lv!{kTNL9=ibRQ;94d`RH z=XH-yJ>aRhZP0)fDVv$9GH^+e9q=7G0e=s&<`s8b;7>WZ3O|KU`2{uO|D2Xaq zjF9wyx+FIwwtg8%h-GJs=(cc6wszAa6d4Fcbkun-g>_|CU!>H0?GcI9=4Ib?gfC}f zUpQ^FWp!Q19YQvN!6CFXvxt5c6JdJAda@QB>UfUr=5D!0Q29rH{N`db z_E-5OXMC||L1bmycNPv5ac&fQ5As-I=!$8`7SASbcPM=N7GxmJOfV=h;kR% zfsz=4b|)%oLWy;lj;g~tOSqGzXp^JmdgJpuV3asqeh#|Eo z0CYPM#Y)^~c0ILjS1Db6_$$U1mSU+eg84w-gGN=kU3~*sk!Wdl)sqeQMo0*M=m=hT zv2%iRXeBjjsYGzYV`!N%)+ zYgfpbDEXEkiDlepVIu~M3fO)rICH-ziYm8aB4|%X*F(>Fj%PxQ9=B%U2R3w=kWx30 z@ZnhP|0Qq=NpIQ$beyA-E2&E8L2hd^cHDT4H`ASAw@<^@CC)ir)~S;RIUDiTnxvzN zf5~g$=ZzsbZ3Kp!rgUSxnV{_^6mHpFr&McwwQ`X3o4RM5z*nF{BbWL~TFSVHrzA?I z#DQm+kiExT()WBDv4s7hZYJ0|vH4SShi|>Pj2LQbp4c#jhl-_0Q5i>a4HcTg)SHXMxi_BnWZUsYzcC$iIblLHm0|RUa57aVt8k!X+!5q*fV%YWl_V=u|gON(cb0&0}+GZRyheLkql&?tSY6p5|2qr zr<-{otz?L07cf@@q6E|_&03m47=%PfSs&+`hvx z0;fm3YGB)HtY<}iLq&yCij~Bvq=1BoNhw<%)PgC8qpXC71{Hld<<^d#74LO@xjz|D|oa z_bf6ido2N$F)N@qs)EhMkg|Ggim`VpYN$=8sFb>i_qRPh^<$Tsn>@%^_UBepD7A7H z3&O#*FDeYY5DXCaRBh^$-xipPMWpWtco;LP#1w4@$DOCCr}0|1-U_W0VXg(@fh^0W z^LB(eS$$boC##2}ToRj~Ct`(lRF#@z=6QTDx-en`TAWjCaK}N>s)}RlN|S|W>ZedB zieEp=f0;RlYuRhS*pOcdvd}hH{8^n)Yh4ayxbudjl=?GX17OqTv+=rd!cYr-z!1OS zyQ+67haiuxmR_bhvtr0cTNt_p*}II`r{0;LqBl^}$CVRXrL&rypryLa{~M>Jm2dv~ zuXlT0b3=h~m8}C2yr{utf#|YfbfKS`YV;dqvDRfGC%q}_r%~#K5KFuQ9I?(cw1!Hn z4*7LzMQ>PJn4;*GISO4?#87axyRzG=ky?c_5eyv6!GKyvD-tC8D6N%;M%0^gT%(5y z6ovUIg8UajP()J|dsFjgqPP2{RVySL%V2qtruOx`=TqT6F5OS1CloQX+RdAN0K=$2rHuCa?#2b{g&YM7z-l@0uK*E^=;laaeiw>$c$ zC){6}6lSvn3xUvA#lytYxVTxXV!1oL!b!3Zo3d}zy?Ya5%#>M#|0=HkS)0W*eO%OZ zKxDQ;>#TkY!uevatoV*FS&t%0cXw|D6g~fjZ~?bF6W{L z3sei~Xe_#alB|_(3c51pj5+v+H|$SmICK}3!=jP}exMV30F5{C3!{uJV-Rj6thVqO zM-2CK<~fa=M|-PzfEe}1KKit*18fp&vHwb-_W8s!s>zUia3skiI?BmnN~Vci5P*85zUJD7iqS}dDY8wVX5}WztwWXY5%Bv%}w4~$%wR91=%tFk(%%cZ3_ z{K%6$c!kKNQY)ud`LL-hrSb>HzG|-wc*L4|nR-lcCRVHz|D2~osjs`a#Q#=bq8rJ-?YzEGCU_gmVyqNQy5;vzm_*b?9d*`M!yFBY?gq4IJFO-C$u_$z#3#K4)x+i)T&;Fd zpGcaBGj4vHboINPXX}i<334^ut$Y>Ho4Cak-PRV(#kfq9$yhRQC}S1eY%|NCc^r$i zOPOvsm{@(&psG&Rc+fng*hfmYc!bksZPux3(i6P3%4ERN*c+Q|#Fb=aMtU?^N00CK zps#8p6jo8%!C6|V+Vq!}B5ATw!dv1gZNjbHG4!&l|7OCZJIH&D(9YT024%qa9I@o8 z!NXm?Q3-mvE65Tp-%vf@^_`+m#FNa}gD=T?risa`Dy&*Ykbk&QF&DDZEj}&m(51vc zYa38T3(;;;vF135ap!0EW zz}#Kq7FcL`T&s`yyrdoC`a0s)i;tCz;lX?p6pK?1spEXgFg+e}?(9!&w6k0k_mUMyzwXxIZb3a*U}o7<|stVyiljF#ghZxUVDFk!k&*Vjhvy zz2J@cz;W(*rU%-;t;U*m<4~%ER)p%5ZRP(P&ftm7t7c7xN8PxVtOabQ$!^#Q9eFPu zOhH!AxQ?m>t;IupdW8(DUe(3us$XWT+Z(yoidVKq9Oe#+oPm6P^@_H9{iy7%yT1Hz zVKQ4b41;62zniLBi#!rg$u73mwf?2WgARvqCtt9C#9K|0%cBFe^R3eX3QhO(B<5jvcgob=1n?Of=aGp*B4MNtD?UT*yF zgPfQL|AtQtiQ}6RP|m~SqU=IX^5e~B9Zs!;PtxmoQQN7Vt1jccgwP0Bvt&JbcOz<3 zPMr}=$s--~y-RhzSf-1K>CeaM@CG{?ecAlci=l+Z2=%L1EVpHjt8PB|{DgzHYHzx@ z?NyX=REt6Enfe77@P-6|k}a*||2dzrl3L4;=V4E+90-I~SI$;w>3P?(VDDVnROFUO z(U~~oXg}U__oe{X^r<;WBM1erZ5OTx|Dv{J~lO9$iKTk)hxjBNk3S6AF^`fcFDxHZz9J5sJqxP~cz9^JWb=Dc_@M@Q+H zb>zm%&B|o_*!y#eq^&3Jt~qS^(&$r%Sk06sUxb4atEX55W z15CE@c++pct>{y+v7&qf?KjIX>ruq`1Qc&R@hs~P$g7T|$vp>cvk^7juG@{V15?Wh zt?u+P>`9?wB#puoGo*++nn1kqAu3Buvq}>;VzVzN-#oL;lCnB(MA%9MZq7WfoU^?M zlY?@{Ak_?TNW!)&|1zQ^F$B;~_>f~uKIKC6&mkQl)bvjUm+H{V>sW&BGZ@n|56LVi z%Mwl?zibgaSjQyEMjS6Ib4eXLjMY4!4jhtJvFroQSE#tc^{Sez3e`0wMO2eg1dS~) zSp4j2@K6>v#f?Ptp!5{j6@4_7Rlx@JRY>3HEbP|8)ZMkZ&f03VTCZxG4N_wV9ZT9Z zccg2!`?f3;;2aB5*5D+YRrEMW7bPw^&Mft;K`QSWb@-sEv&a&eWfGSTun4Nx8N^nd=uA(sxq?C-a76oN{fjui%9l*Mb*IOrsWc3 z8dapYOLTo>|57tC&)hRS8JR5=+pW3o?Oixu{f_L*qSF#%?y}2OPjGenP3b^o6SUz% zJDnC;gArENHF{G_(7>YQCLGbT%KUHPpJztXL#$^G`9q3J4)k)FpL=$*c<)9nXyl+a z8|B3+wRO6#pB%YHIWhNX@WrW~(P7VtwDU-XdrsJAMtQIF_Dh=#mBpzKJ-X?t1>~6R zVozJLy|@oEcW2d0C6l*sr)_ZuAIQ}7Mdnoi>Q?MdGuSuppAFGeVf=9yDeQP{cQr(|C<2d@E zYI^^=6!yF|q0%ABeHxopw)SVc=vi=d0-U0&HrTIf4GVVB+M*Vr^(&G=(QYnN9_~sc zzyD2)Xj8h}$vg)?mpLv`A+(z8HdBaGl`Lk2dXauy=eFCOa5)@u$zOnUI@n~8M5YTL z2N9S=yrFNA#OflJNO+(1u*N^2`=Q?mHoTvKPE=46mmNhoqXJ?sM!O8{}d}MM#?Rd=0FP()NhT)rb+8tZCuPUidW7)X4X%H* zt7u7~=)-Y-Ep-cpB}DSM%ZAnyBr$cUFciwkm}1Bx=e$rr3F=Px_0w)I#brh0P)(ZNwh@WxD!Vu~z&@p5ou8D~QBw`{4 zv)Ew`+Fc zUciwHT!0{Z*hE@f2?rS{!~rr|L4p&UnA$ejrhae&2_m8fx(0%-1VKQFVJloU&|n51 zn8At(;#Wo_g2WF{urR972pl(J#uwI)4m^;746sxOA|}X*H;jn1^nnRL|NcOc*ANMX z=z#|wjtBxIY+C>D{s@zU%xN(E*$Z0mF+{ligf4_z3x{4n0#>61 zg`Apoowc`6Tw*v#UbGih4yHayHJkv8bm^+R8 zJsZ=w+#|RO95_kiIwfd6St~oUh&PIRf~8Zw7-+lID82|Yix42ae{-n_LZ)FEqQ;?{ zf-)#mi6+phA7ra9)DkPrGQ8zUBK3%@_B*Zln?2@Z0t`I8h+x7pFftcRv>$-LDU+~? za{?`Jz8M<n&O<;g z_%`vfyC#$ZaO=9Xh`yxwfh7F54tTB}A}uvjrA*Ql3A(=I=_AO~A>V-^j*1xff~cr6 zEnf<*Dx$QY2{?cQI6wsJ2r?KoPHVp@XvGm+w*a`mDF6dFPy*$%JAQKl zG}yW^)I!_4LkY}4g^;v2v_rMp11G4$BUpl6qyvLvGKffm`jZNCgSTWnJ?7)IQ~Q8K zTm$})FEGoOFKDktrM-f(Q9O^>GA`q4 zffg7wvZFug6SP(HG-CunP-CeRAg&PDxZWzR|6BX9n|pveECVjI$OM=HjO>U>Q-Z2X zgD!vpf@rZxn*ozd15RtP+&e>}qqZ8ut}om_5c7jL=zvV~fh+LHCh*CiQArz119H1K z>+(7J3xx9VlN{j@@uQ;yA~sMQKS}f>Wbr-*xxpIg$AuWK#=+3gE zv^F`UMJ1FlM@zIHtII2!K!6j51T#SrV7GlMz)R!0zEm*^gosFMu{C5##5BVVRiK?ys$Hr%iTN#?xZg9x_KthDR0ffa0eMtV=823>S zXPQbw+9r%D&1(S#CaS7{(U;8v9k+tP{{&Dcb<+L>(9+v0r-V_0=mm(-1xI*L4uAkJ z<*_ccMhy)bYkL6%kV29)Q_BQS|KtSG0AM@3RKearQR-CD%-l2q4Nv7fy&9c8Tii%M ztv1WFgM;%5PxPXvS)sz?O7AN+)EqnvvQJ84Pn$9#hy(!>6oFiYzKiq$q%BCFtF5GENgZT@BFK`4}=mlW#1*tFsEAX)|J0yLO|IS>U|*oDd{Opj&G%|$R7EdUHP0L>-9 zH65EjiZ6AIn>?XU|2^TG(~Q3v8s3$AwlaeO+B(IFON!!Z+VC2K^r}=mjfk}h(7lD% zdhJ_YNP;MW%XG%26NEL8+|lDukVUxKZC}nES-rg7p6kUA7yv&7xB$rCki=NT z9Nn))UDg$bId}z8Fbfj>O9Z}EmNMIERmJxeC5w_At{N-i0IDuaJP6JhBNd=AV1WWN zf!-oo5jaJ&XkHySVNN1QT3z84mQ|hoTbuo`1M2{T{D>O%}wN-?Tslsh9(8%ueKsg{(if~U5f;a_M6lVi<2oi!2}MLbuH!xiWI@j3L9XN4 zn%*YmSsS)7=Yj}YPzV74flzya^Bqnemf1KIgEHGC560X!ZBs#OH5mxNz3XE|<4CSs zNe1PJTSy8i76vpx15t?O4(z~KJYf^|InBi7QHHgs^JQ?%V_91$KG7TFDVHPtAVUpT zc#O|8jzj@`dT=UMoINCru3 z+ek5p0z(5h&P3p}1GU>#03hH35*7wrCtcExE^WQ6F#A^VETt0{h$0aT!-~&Mz1T7W; z^SbQHwJz9NzT{fLfg{>8)y%XQWd-O(Iu?WPB;224oQQ}8h+uGn*oC%sZ~6BLS$BI(#_RrWZZ$#%L5T@S1 z4K+h}bXqV3h;W36Fa$xc*5ax@@_cRpBuPwe^9?WPjIII!)KeMX4KYs&G=OUbR|qoi zh**wAm)ZoQGdPzj-}22?*o#aSRDk~uQw}hJ9@q8N0_=Z5V=%Iqbd1?VE_8O%S+Fke zZ~kLJg>h&-^~W88_U?#UhzMTL*I3AfaEFCl*aHqYTMD&NTQp_8WC1Bh@=;EKLY!lv zR?4WwKX*%SSSAQFXXOyAIz$L~B;)e_yxAPXF;T}+U|-q@4R%4J=PKG$mLF|FXnB}tgpR0#Q$u2?&RkVh zZvX&*KjkC=_x03o!@zgAb>FTP@<2zvL?>E1M1#O<-pX~0cRB6&V^He>yLQDSwHyfm3q+k z;eDP2j12gSb@w-Sx+@Roegof5g{!vduaV**nSL*=1az)6RKhlU|Lcwqqi$+KAN1h& zFSMNdG^NW475T9CHjL8&DyZlp=ex@2Jc_RQo8MvdK2Eo<-z%@(+V*~QPxqDNH_ps{ zepiTF*ah|1{D}B%GVB_j8mURxNl=mqV@s4VOLDA9^QKIjIxq0- z`9TEGpaY=@95XNu(mYC+G9@GsfzJ#XAX26J6Jm!BRR@OH`mpMUuUxSb^g1@IgR~VO zK=d;9D5J7tD+uc|Xb?jlL4r_`Yw$pVz*GkiE?huu0<&I$|F8%Vz{3j}EEFhsYT{UVZ}>xSue4xn+UyNH5DY_avmMF=nmLxoeq z!BvG79}J<$AyEo4r65u4VU$?H6vU!JT^0#KSHbzw|C>c5%G4coBjx0Ya@tvklXo@E zq?nvoC4?9TdERN+1@-|&P*|4PN#dOa-k0THcxpu-qXT}1kfDk?kf?YN5ipR00+|8E z6J%_m0~1vY1t^RaHnErxLTFh7XNQU4g9uQ`iU5a0*uj{YQ)LCfWge{M;$M#uz*&|L za0MfSF|I%YRWm?@gqqCl0tS#vD4_%$n@lnkB#QW;!y1r85$#q}W??Ht!vSbPf9)0} z5k+LCsoYE4ne^sO+g+zGOxfM*6-)r@^i@KX&UbL7$CkISnGGv^V4|PBsB57JN;)Z} zh_2_w6;}+E>QQub5yU`rY$a-fc77<)5FnO}|KNHJ^9n$*#_B2KK!$NRB4$?M?A2_- zoW>AqRK0@AE}39aEgBFivfhf)yu7oCd|6Y>ZbwVZkL5l_-Tky>hOYAUn2R3@_e=sL^Gvj&Ab?2}FNX`() zm3J{RUk|2Bl^#{mWw5Q2;TiK&K-f_O3%TlGg0Gf7@VaG@AEvU3iofMSa5XYC$19@j zKG2V79HB(eR>{yo3=m@Vf*n#)Ic1qxH>`twFDq9F_LgYB{o66k#IL_*`8%-O)0r9f z@~j7S6>(X)&nU2jw-30@g4T?C;etP$|9H+G&g=roG{rH}3FIz#*<7v`Kmako!hY|n zn5qc(HB4oOEWx@|a3mLi!SL!?iYb~fP~jD73F$$3(t#rOP=n@0a0pZhL?EzMB|E%O zeh%9nOaA4YwYg+%)Uk z3^GVBBuWGrlS4g%9IrzSu$5y*m!tv=q!mBl0Ttqyp*cnnEKC%TuySTW!lh^fH1ofbrqqnbl$xTiC zYEJp;1U|N@WF@|O9W38Bfk54n|3M-k)%tR&B1j>mK8K2;27-AR3s&rvhHB!@FcZt4 z`OPeqQw$grfk3M8fMA7*r08m=$A{#CFLLbI9M^>wZAJ{1vQys!SY@oi7-R(Q^dmes zFq%~%0S!yT!a#~ALWrOukfNX#@#qDSt3iYdU4s&Eco(o{G#K97lYj538 zp^TZ>VKyL{60qS^VAi_e=*p!&<7H8YMN>^d)250Ml?xz)RQx%113X9rI6LL3y{xnW zd_x{VJ?Ab8;u~cItB@~*|%v#P8?n0d7!Fk{eEHgF$H=TL}AM6rsujD2{S$GVo0PUfp zei$q_Sb>`D|3d?)^0qBnK(Ro%BFQ3;YoXA6p%IkZpTOqe)nfJ%zVWuv=X6(JZ}Mn# zPEEe<_}gBlZi$06BRhpB{8#yXWt@X8=zBLV%!C#TEK57miYwD~DI%b?pWuX%LsK!Q z<;_bG7e9eafeh2O-pX$`GjnFVA%dMQ3V`V=6{uiwhyM0cO$-LEC;KMkN`=VQ zC0>-oH7H@4-hWdF|7!i(s>F5QNA#;-TRqoOr<#1IZWwywloK&qxvdv$yH4BA zam9kzx|9vGy&Z>AGjC<#6-rKoK0V0^3nG9Rmzb4X>jTuj!IvKD2?sf&AFv`DRE=Gv z$!T35|1&H>w^(rkL6l&mkGVk&kjR#MfWQSYh+z+trsR@L_Xoy^p%IPnvDHb+rE-BX zB&F`*_u^*o@B;D3RL1To+Z0~U>{{DN9q__;)@|gxIb-_kINuc${f%w5r_ucWKyX@> zF|srAMK!m_w7*Vfr&RY^A|?fxPr-OfwSD!+R1bQ<5H1`?7&DNF8ca~04S@-0jipTz z&IQ&K*`4he2VgviZ)nfku#)dR$H3%EtBq3HVU+j~90ms5+kn#><=?X4PnJ1c+$EI? z%9*`oU4uDam$gs!k;oevSohgQ;N4XCjUQ9>M+a$1if~2~pjM}-U-``n63U8uOSAa35RDHn;y7Xf;CtTxB?Y`|4LCo zh!EHs6o?EQu-p!03Z|6Hxj+Ha71;uy5h2J2!Zc)uTwDs8W6(X-dx>2BjiB;agzaI{ zLG2<8#SlTDRmcRRFcu3*MFC-{9v!TKD1};*#UW03Pu=7MxsZ|%QKOr9$22}-a%3W^ z;F41jA_IyOIS!?Kp(7N@mpV3#7U)L!Jpx2j;u$Vd)&Po%_*tTu*T#rkP61FaiG2;w}o_)4^qxm<5o5jXcQ{)*YVl zETcg6-rTT+a~_eL7@XbIVNG(E+FS=TUZDB7L0fPqv0=!jgr|6#K_BwKS{@>opeGa( z$h}cYFmaohF=A8N&?K@ZIe~}){RA?T4X?KBw*5|ghCygSsK{TB8L*=C0gP_eN`%z zC`@Xl9$u72B$*E7WF2l`MYW+#sr7n0~3pm5OeH=vFKZ8n}U0 z!If|B=8wgIAVSJuEyn9X&qP_HP5NGTp52|ES1Yw>ll@-fMOanTXif>xj7lnMMV=F; z=cA5RA>wEYj-zF93<(CL;Y|V~q+iZe#a*BbQ5lpaCczJI|4LctiG1vz=d8|wCTM2P zD-8S~^=aFzGTdzH2|$)9qRl}j48$Rc$&#I6FfOWb9H;xqB^=%8Sx++UBWTp{z4ej(4W4FnH(O>Zr`Rlu~JC7)Zge5mhVB=N=9rl88o_oNDN$-yS*6 zmlZ~jx*%6zA(@>BP;qOktkc6)T&I2^XcDPF1kEGF|G*IXfmfQ0aDI!z4$35Ru zd@0M$=FCj5V-~L?4rJY;4QeKsI(?>G*nkRz+i2b$f@~<5HPy`irR{VtFjcOAiAB4T zNO55=<*{A?YR&33&(gY|UzXHqN}ASWM0NC#5N$`v=8M^$sB{_`?&2w+{?L_F1s>qR z9>ReIUoi1zFlS9`m2DIB?G*DG#Pp8vQ;aYO%O(kn@ZH`NXX=K8tR&}V8)5xTVxW%V z%FLB@C}rtUG3hAVEfekZ;8ry3%^sts5DCf{|CdPO9u{(FqCm!m^@kO>hwSFTvTESQ zs#=|r-Jj+zo*HIeNtmT7Mh0te3^#8ErLbha9iW+Tq_cK0N~9_3a?Tx3Fbs>4+}#$KUY^0`vh(G#^!oA% zYu58R3>PV_$XOvW2c+dhs^v(*(4EWxA*~R=F+{F$&75W->u`p3OlB3y>OgU0UBJ}j zvgJ16_zuP9Zc@)i2-T4%1>dhYY-;-2$O(KIDQmF16VQk9m=-MqHnqnT|3SJ8O$j4|Q{OrVd_hgf_t@ z)8cNa?02e_Onz*^-Qn*JGwUopyJ$ zHX~|T2@V<*7H)Mbn}6^f&m`VZytNHBi*;kc7cBUK3r|!f(Y0C%xP(gs;qDIe$v2zz z&n!@smI|T5tTNpPa2qm!Qqw?rTX4Kl!rp+d2ASiU$*6jl$37YI8SqRh@M$-uXJ<8) zrNr&Bt<_4~&wDY48+HrY9CTxX zc3+WlS10hY_H$JabSV||jYqX*iSNuKwQ7HSDmUTyatN|GvHxG7F5kQTgLrj zgfM{v2^KVX5KqE12MwO_@-R#oh7&1Pv^Y?ru!s=_W(4zbBS?`Vr?8;0sg$pZBrqz$ zAVOeD{3=OC@;7RkrgP8>Z zOk}bZ|LDXUT&a%u0mH10qCyEqt;%%G9=U-0{DE}WASh4+JN5PZ7qBKx!aNn$dsuMd zP=*=vMSSX%K*);;F4imAa^6swADc2oI2CBmgu#|(NTy@QE~-O9Jj1#*N7J)ar`AYt zWNt7ANleMa@C%k3B#1Bkd7L)ytrnOQb#U}(>74^jOdN3i;ES-c3v~BRy{2gyHmLUy zID-g58Y^_5<Ja=R*%C|?6HGMG1{~19&JsL~GX)D8jI;&| zlkhRj92?EE&n`=Drn&}7h#=!CGQ+jkaNCGO(?Y_?Hit@l(ZqqID99IGd;!J{qmDSP z{|X;sNUDRW61ad!>bSC~s;ZEp&8L{2dyb$awQ{mZ4zs!rO918*0tM;TDrg28qC|@Z z3@{Lgg{ndr$Vasn2+@v$6v2zL1p{O3Ks*RlfVm;5EOn}Z_&bOa$*jc_+XDj?^iRb0e2`m1 z2d(f?Ye5sOm2@>MchS)*)71~T=+GlMN@KLhUQIOxE4E5Uq*6?S9Kk{gEOUI5a8+pgKC{vDk_gOP0i(a%|Z<>I`;VBTSbo6$?j~LR-ixvsZ+vjvz;*9n8)q& zGC>OzcTq+Qd>34Gd!DG#$UqAal7Uo4#6yGdpv??jojx&Nhcx<>#Db_MYCSBp#sZZY zg)#W2GjDY+R%P278SN=st$4d#8(vA`0;0tA>6s2VU~XFzI5mN{1rnp|||i4l%H zyh^np9$T3H@{$DdJnxjb(8>tymca%YWl-|LCWoxM`mma! zsAcb>>bf~J@r~Tm*q!&@KP66>^$J3R*tRS#S;!1Nc=Ae%(^mE2TxHeU|0=gJhS>Hc zOCun9ARov=E~VvyVg~h|S9PK>s3p3uZ+Z5X+|=DwZya0{F6Nloam*Y$W@ct)_Lv#R z%*-_Qn0d_1%*@O&GsVm?#2A=cQC+D=&kF97DV`KM* ztW{WQel8=DT?S|3D%FN3s;`)Gpw!?Ne^dPL{E0oKpbFj*RXC|p6O#1(Hb$Zud8?6f zfSB3H=R9g$!k9%ACUu=^WLLc7hfgez9BH196C+0gP9RjSSP9Ld(Jo5IP`)y$nWE%S zOO(@?sZv#h2Sn~n4WMUXu6hw`8yBb#J@|9o6l2$>m`uu@aUK>G%~VxPdV2$FDAvI; zdX+e5A4j-B3Yby_*>Gv<@}f&5Yx+FOFX5S|#??u} z(2FU=ll6Wq6baEOlyIksF%tX%xztIHEtzlLqupL$mD%f)rogFOj;y6`=9=L+>7l~% zA7;)WPoICoN21JoV#aBuZ_W4or`WnBdbkHJ76;=GeF_`*dc@9?R2}_htx7FN`DiRr zffD^W1;%$GV4c~zjijY{S-2Zlwwb$1;td%Mq#(YM;jaltBruH5F^4K4IE96~e*cNt zHJpJVyQDwkKJ_2zg|beOhyy0p7gd9B{Gt2YL$X;RJCqUGYB+@Ft)IaOFlX)b=PZ^B zb+(Z`XLu2r4X@8&Td2br(O(Z@5l@^-zt!rWH*cML)i&Cx%f>`q@5Q;~8JO1Ur%*u^ z1`X1=mI$iDvMoyD+g^YUk{ zZXzW64DPJZk<3dy#c_?3^4LIw>Wf_(Qxt37kV>jUqGLR^wFaG>l|O8DZqOW&s5yrr zS&SwX;1M2CN`0+HIICZ!+)kX+kUi}(i7IekuqsZZ!#JeBye;%c$`dZXU! z;d%Y{jKV@=2uFdeTTO9zBBdDx#^v;qDvLS-5Pn~S(^k98fZW@bOJvP^gS-u`bF`^L zhT?*A*7xXr)HR0e*o5q;bjPYRa>ePL9JXFTbAbVAO!uhg&&$7Z^PtQ^7<1?_w-Sr| zF^vta#Yx;#1Tiwx1JB~pcz;J+bC86t^|yIfpNS>DI#OR5{g@a-#jbE;DisuJYgF~B z6{~;W)qm$$ps$$fIga?mN^f8gLthfVcppXDNJP)Ih?#5gsQWL|U~OA5dA1~r@SPT) z8SJ(AuVE`TZq+}VsM2ocWXvt5W)27lc5hY)=Kc6{5DqA z#pgA?V?k&7RW*#1o!+-0kQyMFQNsG@y`LnQ+2DF+)I_b3KO+juOaiC#UJ@Pcj%_|L{vVg;Nv{=9Xlx)T!h z;`N#u9Xox0qqz$}xt3bb4olko@Xi<1ll>JI{wgXpVX_)0kHL!~JlO80`@!2-@R$}W zR>3OPzGYpLlNU)`b&@nMA?W{NruyL8*i)paHx_SmFV}QdIkn2#cz8!q@HzX9uE}Nu z4=eGGQ~i$qI;g5KDCZ`&Dd{IKniqVP!LQn%Ep!MX4XseDaFcE1c{3@~#iXm%@Bc2? zM$eQ@aoNu4*}^WW{%J~k8&J=`#D4O)r)p#P2dunj#Sjly`%#n(llwCSblJyw4*5qn zNIH&p;>=sXR+07d=nt$>)n|AatdI4?Z^*;H)hDxG64l`8V`i=sTc%I9U6A~eUx4g? zP1F!Wnxq|FKao_KqJBZPjz|l2g<^3)EvWusqwY92VR=ov2miE2R|+mdw@GwC{ju=I zyMzi+0E(+)C}9lbeLvFFz%#7LLPfKMjo_+lL=_7|&zQzIxQ7o=`FREW7m8VRbC1}5 zVG{Ud2gL4eFNb(sMPQ4Cgv9ar!P@j22hq72boCGw`XzD=WQQAt?rA?Ujc7g7qG5}j zjQY704ebb)ZOoQG5|1X?2J{ndkmL67;p1uvT`2|fsPPqyD8ATKk(W#i=N=a6>K(k4 zV4pOR_{F}d8XdERlI)Q(`;0QAhS)sW$6noz_))5@4nE)#f_RO?MrUX+af^KNgL4$M zn}&>v{f<8FPB8gRIpM~{DLw~`zg7E{<$=wy9-ESBV^h76`r==BOBg06vgITNSqnEU z_BRGjZ^TK4N<>CmDn>GF#zxL6`1o&F>+d z;7aG3q`$y!j5Cus(~;bjiDDh!P_w;8qJCBVZ~j|?efBd&$|Jp#J!9t){e0DAE zL2FZRVMeEk>h^&QuQWC?o^90QsH3Wxb5wj`g=v<9=Sg)#vnzJ%r>%fcWGTp*DMw8>C5P2ago zD|jktw2H7<(Bvm&?>{Owx&_zCb5ClcZlO_6YQ?)h(#54?0a5?lrE@9NOWt}SoMWjg zz$v!6&?cs<7NSU*?0fOo!Ys`()&HZlR7N@C2OVA+2vdA*q zrnuA=$B5Rfj3dRY)USx7q+~B6p^ZA*thJP=f#kss<-pir*SK7rnz@ini@+yY`&yaw zb*V|OkXDTlPqGU4z3Ty>QvbH!a03;^4wi-CcJpZN;P#Y#rm=I!lYWkqPczv05=V~Z zQMX3I)vRk*q2Z<>9tMJ_v*-ivja^jW-yewEg^@~^4y(~rn7Hs%9WYjcl&#PAsX6IVv z-%4+MTLHbzvPv&fL6`O!cs42> ziksVm`!v40KE8-?%DcEHk4B4)!Ya1`#!+n2Ot_b0XN=1`K3C)mus>OI+MSoE!(8Hu zx1S@HI~rHwr5vB20$#@fVa$$V&4Ec*^XG%_?-K_SAHG~3K1&>2fu*%@7tebwqXiEU z=(AJ#tCP|%L$`I{R;r>v^6dnUi{DB}L8i$luJ*>PkoBr!*alTpr%#IK*JnESAKo6e z?H(r{V)f4&v&(P(ywYO4(&o$FDxGVLqh2&jF3&HpD(Mz}?qucY=vAiEr8ammXy6M~N zuBYhJRqXVeIR?QxVPYso7tZ)ET)9opQalKfl{eR1wovo*014gr>9?qq&!%*pAFO`(0#qI6*MkDgY01OMcP$_0$xBY|4!& z0DoF{8mZcP2$V#(tc)k_k?TkJjq~0Hn_Sz`zbv46r}4WU>E$wx)|zo$n=yB0Kx;DV zf2pKDxH4?pJk(MRMJdtJ)|DXHg{C^$(C)(NPP%t}yIgPBAB6p(`WZsMq5}l95k900 z^-I1#0DSQ+IIu;Z9STyg=FA z@c@GK^6an&PTv2nCFIQW{b#hdf?pZnnVW#PIPE)L)OKkh z$k|l41WLw!luX!U8Jnu)Ww0U8xDf>bWF#=C2hvqG>vzd2WTB_MrwB>av+dMnK-8H6 zd|i5!G*S&laYVfkwcO5>BZxD?HVkQA8esy!qq?!>{-qnQaX=@Z`7KFAz4f!l{GC@& zKW>HuXN~}0E5}Y(0*Q!=f7yZn$+2znu)C}2QqK6ZB~xPg6=vqMf3@24TEl4;|2E)O zpupixND5-Fi&qtqBktZIx?@XcsU78%;rpDL&i1= zHX2FkGZxL7o==OKey?4*R=r^=pY+#5y0&T+{%?udnl2z7MbKVDs8Ve!Ff7Mtp2%<| zcOGH0M&Q{t&LH`F%Ww*DX4vjs7hq&%b#_UprrN*R3qJ|T*uHihB9IGF5w;O~HS*i` zT)vy_>}w^-&pNmZ((0bHmI9<{C^;B@WpxE?TccYiv4E#Gps=uxF zPa-8zsoU1zbx`t8k+2N>uePLuCl(`c zFY0p?(M~eSNB>5^dcTNlX?Fu3IjYRg6eoE!oR8f+sZIn*^p?f~!*;OQ@Ty!;Oqj6Q zJl;>{JnH_K(?Y{tCm|q~epP>O`ggoH6Vf-}>So4{PO(T?v&QM5;XAttXhX!#Hlx?U zXvk-O1!b2zKIg_Zc;PlL{CDQ6DRwWM;V9GYL9yPvhb&$qkql)pBtJ7B>hSlJDSvLM z;Us_ON`&OfBQPByg!5D2eA@o?-@ZgH{{*Bw^PR_-1j6Ch^`ur~aIcAr$M5*r^2zc2 z+NIt~UYrm9VA0( zf{)PVf!H7jWuzX(%>Eh2!Od$Sfl}_mDrsJV^v0j{$`2Fp^nK>hKa#*!1^il9A{nn31Q8 z8BEdWGzQ8*j?%F(JO&FZ1b09!09htgxclC`HkyGdrv$i|J{QFXWx`Llb5B>zBNWRV z)4xBKFXjpP7f+N{Dp_7+=6xieRx}@}md0BiyPCFMm(ycUJk_2i(PS~}KK_wjx6x=h z+%tZ~QESlZIl8bHyTQ5*(scnnqvX03Fs;@Eqb34zjt&zd1J2MDS}d(* zX?dQEv)@^kN(Is2<`sw=3?{997M#6rvuo!{*rquP@^+4Ff>TQ7uYbQ<9D0p2I{9rp z-?WeCx>#R5^ST{`5qwwiTlX^CS&nuPLpI?*&L4&Nzf6;zog{oS2I=@^KTd&v+9i_v zliHuH$o_!46~*g)H$4GjkC;9A)JI5Tsux5G1s`mK<4?I`Jsr9-ba@7j06C?IzL=AQw#+iB4y&{67oR!k1BoOQ-3?Q69j;`V=J@v zlJCn!d}$`v`(GX@K*a!s%**M=vvD-Ff3!KoG*Q7O``ZlQ$fP#xl_0E0Meisx*_gn> zw=~q(B9U0-c_lFzw2BRc8xa5oX5qyiSTVj6oM`^(_B#yo1D)f>IaH)txvST#=QtIx zpU^~o&+pE(a}va@$*yToysCCD zVe=l=b`cm6UR6?D<0)I)8d$T%(6}%{%TNp`@dH3JWjp-MYc`1JXlv)e+0LHfVE+b_ z-X9gYCY#Gd&T(7iBu=rR#s>8rA&9dM$yz9vdVz%xepW3!GzQnD^9$+st!~6S6m2OB z+~s4+&cX!~&!QJUG96P4@iI(g9qqHcGKrc&WfMYA1UW z&U}9QQc%yk!<_!J%=%KtY;Z0 zy6v>|8?Y5~*VfjY+SjVQdZ?`kJvK1zT=7FU+7ak*9eSE)KaTm{6ND1FknS8#BEA}I zF0HcGSdGt-v$ij(Fx?1+yNaN*Y&D%%v&F4E3A5%DB|2B^U9i@9beB{_(F{hbWb=Ac zcM3KrZEc&JpQn#(t}ON){QQ0BA)CdwsD)$LG542V>R+5jSQ&n){+_Jjh+^`Q>uFnO zzKhdNZjrgVEWwjXW%ydIZjbbaC`QX?O~B0h^+$W>wuse#md;$ka;ew|43+@B#JXGR z%isxsB~(yb?=#c``(ls9pT-L7SBJ-F_PD(`;y;r0J?ah~3T(#U$Wi=|xyf@IcLBP>LV)AXzyv&rHeCNy;~Pp7Q^g%v|h$K z2>0J_g8Q%W5+ge%rf$_m*Jn)N)TaBW@GnF~OEN7^CRh>~Ty(|fNUy^6=Mp5MJ!rQv zf47x2H224wLRxlwUbM)_VbjvOb28|(F6PBzwfNpjm;5YHlwP}j`YexFhpgHOdz~$2 z&KhE$YRgKUk2gl}j+8q3ACGs$I0McC_C?)? zgQZA4#9}LaoMMo6p{UoD`aA%^`p0$hMmV2n;3<=g3f@_GykMi#zjhAR|ArRQR@rAT zbgE$y@(!9jG-40sOT}39f>Q09t0O<+pQyX{Kqdj=1nqY z5p=sx7u$YdMSl3Nx(v)ZSP2_D)AGbWNG^p{^2I=HXw@W&5V#_f7ecG(*&l7IUFtd-w_ZL7+`w(rV85!fpr z=%d9baVJq+Jq$*t>JDH4SQ8mTzufBiGJmx(zffBI;A{0Vy8oo1ME;vXv-u|rO;+Oc z;Ab=+sg(5O2wgtYC{}FnA}NP1+3Pe5wi;f;)1mOjDyN%GdTHAY&_f`nzdWgM#GuI_P|szTen^%->Dksc1H!RjbrX} zzAyZ8)azRjq%6%2l!|a;UwYIs-rNp2JqXV-AB@t-wA^jwmdlnu{pCnjsd( zU#5rgrt}!qbEa2{Q9`0rf@-%mwafPT8TG9sM0wXXYX)UhWG;;gmu)6K`bmAK^+B)r zT5ki$8{sk?p~hB%NZ(23g=u`JBBxrCu={eDWxGp%U2ALoYnrcF#px1G%fKq(w}s1b-BBOwI6dWevL2g6OJnugqXtN6|ZT%+mgs?AE+o*h$F*1ew8 zjF)STy-NQr#DLzk8DfW&YM}m8&stll_fF>C-Bx`g@4?SrJ0jyXAo@GEsr0WNa}uaR zhppC}X3o6zI-Y5F;{*0y2#rJk zJo)?hQ~&5WSKFPF{t|)Ct5dY5D+bW)_0*gz6_?_+z2OzsCD4mQilFM!&pc-_hK~cs zKoyQ7b*fjyMRh$O7jZ9VaTycJXE<&ZK4z(2sss;Ck|5g*Z85SeA8!zLN{nW(r!M)q z^I@e|3_N(vR{J=bV*ES|=h>PZ6i%yYEvjqx?|p0BVI0 zU4_p^hUsVNSOti2ICh*otwaf5f}nR4FPBpqP<>t6uO&jA*qeiM+z;g~abM3%RnyuF z$Yl;6`9kkd%Wd4ilZr#@Wx*qEy5_{Roo7kN`TRX z@8o21#+dF2cI*-)Wry2Ze9OIpI#uX`tEIzVlu)Z?-HnMy>Rm5Q3zFUla3)2Bro5K1 z8Bd#+;aLp4c$i^FnZ9{ZaYyiPrK{=11o%2V$a`0>gMBOGy+HBG8$JQx4AJc50EN^F zelKMLwY(#TeE0-oDi;T$<-b-iBs z4XJ+l2xapwEUV^Y_Bj9N%R@%9o@%fOICC=`!0yv&vc-f|(0W?vs2@ zeOrV&ikn;~6=s#jX{3*zO~IprbXY1szn=Id#2mvtS3XDXNsF&UC-a1!)%ZfgY(m53snM&rL_) zU~$}woiQ&+I$TxK&W#7yDLR$+TpVwi3Pk3UHEHB|Nk^#|B1a5GqeSW-eaC}AsWt-{8BE3TL*UWrjw&K|4$r+{K07!0-(2%6@T z{(|*CkQAiut(Hs|E!#O38?=CvEPj9tM_=B-6* zr4fONR>UrqLAeg-qEqwh;c~mvbz@ms2y!%+=S_A+hWhJbuOB`H5i@|ha$#86?Sn@U z%&`}*xH40hy=K4D9v zdoz7V`mOvAVsVEL68^aSn*IR?)m|VR3?BN_!-uc9?)PeYp zOvA0ChSOY@>35iqUmSW;f4=QDI$V(%_Wleqw_tcUx3Cy)4~i_}%5qX`o{)uGV%{_tGr zBWn&UH1FNQ-vy16bsy`yEl(53*UVREN5z13Xp@S!Vl*NoCH20guwlR1h6b2K8M*Nj zBYi7%>h`m7e_$bCu(R3UF!jyl6rd=P)&ZG?t*ca5>XXA}S(R5VK)r3$#RdqD@*^jn zt#gtKx|mGN{kF}WV?XGaEBb=1PUZcatM}t-ou_V6d>NyxKr0RSEVU93`qfeUvO1^D z+U+$ro+gaGYnkPu{Dm?1?wjYq>2}*Ti9}0XI6>_{2&_tSQ>zX8S%Mi!6X6`X>z(}Z zf3w=4@vTkk?Am$8rd4U~P?nkuoROAy}FAx=h&A9Qoq0Llvu5ai$N-060K;6z?EYsE~`jk zTWo80%i&ul8Rz`Ni|Wl_+3Zw6H)=$X#}QlSub1sCx##vcV}c0*b$XHnV#(&il75z5 zm&X1p{aa(s2*Hv7r^&A*@}2?7WSG~FcdROZ?&^c?C|rN3eLvXII&U0Y8{)`1WG2Yl zA4f6kklMU9>8w~lw+es{J1iNprAv!sayZw*d(Xq?SzH6VNxAPHQ-Es11%A4H2dAHU zBM2{fG3z4CCIwo6hNSC(QOQSmb2fBjpG_EzjYobQLN#TFf2qg`p+Dm5igyez@v!Lm zcbkRo^5mpzxacrzt2Zq|#(x{%`tgqz{w?C`M!38ZT3XR2UV6#J?okgV^UR7Iz$=ZW zjEhMMlgYRT*2k4g#)_Jg;SS48(a3z^{>!)z$+M(p&T&wWZCl-l)y*gwc1Xw+1H7%Nn-wvj2`ciS5rkl6@i*$p{(N9D8b02w>jl!(KzlTf|35%}`wAHUNatcF% z-*)S0=pQ|if*!7|ey_jQDST^;187-q_GI>DL}>uiA~TygwQBFwwNx^%zWrLokuZ#0 z$ZYqFq4@ivG@^XNq$ZV`LyJH6lp?Qa>roilwF#XP@K5tL`gMvtKSp_wz!hy!W<25D zDbry+4fM?;H8;pqq_Qp$;JQ#IrTOd9OG>EUcL1c{} zGT?5Agk7x!wA*yVc|$e%%R-_VcJ4Pc#(o~wW!19Ur0q?;9v8t3ZWynk#g1b+qeR7g z(4Rvg7yevxa|{_~9$KjO*_6PGN32jhK4(UamQB8U;8I!H1>q%6K=Y*DvM_yap3XEv zNpk&qZvng*a3IO~CW(7oU7jUpd4MK`Np0qIIuE>_eS}g8ire12iss8VU(Ts0Gr!B( z?y{y)=Xi6hw0uDlJH&gb;qqEpP+e#4fo6GxT_{osvQ(5UCEzhXGVfa6q72f9^F$q3 z*f=_PRSlSA3OFhh&<6dN8qP>t{4bYC%?;R!zpxgwLdoPs&^fbZCmUd5$LQh_HS2Z9 zS)1ymB|`JNrY=|ukY|2bCTz2O^1_#Dt@7oQ`LRv`Y)1U+$8GPTG#k*}eTaLl@V23Y zZI<{m=v?6EtDwQA6rs0}P_=DqraZ@jv`$&A5aDm+*?~iog~BGQB2g*r%*DGeZtxDf zXMZ}$_q@E)tm9J?8o9s!_yO>s_B=|Kw63R;o5Ouy(*w7*jyY=*8BJ(C9JSfY-%qVn zL@6@IA$_c3l4!e&{53U7B2jdHIfVu}u>8bNGcUy$9Cn60H*@y;dTd^k0QR|Aw7*@FLA@<$J57|&To&aOwc~Fj%-6u!RH3`2NT`mrG zrwD0DX8|_lfCOL-x+?#4f@brj^|Exm*~nSEQ6bNTCxN26|2(oXr}C8=jQ@spZEARM zA31=b8=zS$Qyw=lmio5ZmI+d?3*z*+^}JnD$>zls7qUKYs*ksZFojx zpAK382V`5V9g%a|KgnFyz$h3(?A5(nH7(2i`q``ddySq}xNSM&xm6AOCcWcLxB})k zIupm#1ox(Pc3RL;A&1JX(V(A-r4E>qLPmA$pc+jwaS`6_>o z90eR)MCBp_D1JKC1RyXSZATSoV>--~pK?uA@UDy@3hIT(+2~he_RdK z)~Bm&jJy--+w`sLtoO4GpQh9ZzW@?D5rdbhy_8!nwZ+{SaL03wG(rkwQBsv{2uq5xV)& zOr-P30k{%%ZW)i*vs7P9%Pg*CxGy)d_`M!@SW+l-$rbNP%bR}2Ph&q8n$@t~u~#)^ zSkv4ddl+Hdnq5&Q2>m(iT%swZo2=p7^<*COFDaAgNBH;N%!Y^wh}7;b{DPgVg0=5A z+t&2b69;h}GfV=2hKwSZj$nW*a7@=9orcv=0-(r87wxU_Snl)`9ftDDTnj-rzST2; zN4Esm-h$5UuN=P%f*c&ORfQZ7hgX)AUMaWJf}S8OLdS>nS!oQK#GnV#zK3uZ30;*D-y9hf`NG*V8OU*Ov1lR78dewOOygCs=+HP*EAS zxvc+p)MKer^9kQMi$IQ@k4r$-Tgx{*lhW?KEr6iP*Fes5_dlY=R?A2;O4CQ@Q>PO= zpAV^S$Oyz~8oKHp7DIzhsG!8_jFe@#P7o|86%sEO@?SyX^NbF8qr$-T+>_CNPxn5y z4Zi{Ta>Z!Njsz~ReF@PC#CfBPbnA`Cx1jv*p62GaYUoKfC*JDX+t zlSEnZzxr0`iZNZpu8o@;rnzE1yNOLj$y92TdB-)EsIF&5Q6N0V@z&sNXA#!G` z5E{KPe61AAY(18TDY=4?SPeZYMCwp1FPnEHZPty1%U|HHmHNT>PM)2Nc=DXo9j5J4 z9yro6gdJ)~`dV-(kzG8TB4df(zP8N10&-mve|>$@)*^GQZRdOx_94mi?+G99>UjiV zaq=|#P*2w_oI}X@z(4s-OrzZ-Bg8eYu1QfQ{-*6uQYU905AzjZ;wwMjek;c$be{ z)<+mOYeB1sDw;FAFy6!K#;YV z0z)#%xa-;!5QU!8B3hBtHW{=PSXZ4q8+sM zCHs$7(k-8{pn}b(F4lMYR2PPVb!I%?w!tS(kI%NxJ zyCLaizLY1^=%qDnI!hLH+QL-!q*iz+5o0NeTv&F(d_-oYd_KoyAsrpwHcT$#nrP&E z6#qpcIf6cub@Cm7$@g&D<;cRUcAs;iR0)8kB7gLgWd)Ml^ts$kc@%YRwcepbKIf?Gsh-7Q^#TvOB=Kr6cMIX+7;%OXN%Hn+q{P==;}3P z>${g~OaVoI;OaMMm-R3Rqsir+R1|=#V~+_f>&v1i{3L&(s5BzEMO9G_gDoT~Q?RCk zG3_{7a7?kOO08!=Ts>-d{>etji8vpSR^ zmy*w+y(XmjEjE!KjMXi-uUH*Y#V_-QJ(#R52Ph`@FVFXtW8y6Ft8#`^iz@pun4FuE zmgaHz2DZr-doa>%PGvZ5)VE~C8D9ZD2;+LR8dSC+cb7(WUn;QIZ3MEz)8)v}yel5J zeZGGb%N*rw*)t``R6@1uZMqxxBAZexg%kX}zQxfGo(hz%c{4FJlR*RA;=x6y^x!?@ z=<2PaL(90!^JH&E>-(vqIUNT+MJ|J?ic|dP_iS@`{`UH;&`5vV{NYArm~goKTrMS@PnQ#O4St9u=txtVIGo1v)C zbqLM?ZI*M$FB*r2Y^zqKQq%cmiFSNAv^L1|fk824$VKhU5Vr+VG4pP$9aUS=RUq;}xsU62fFm z*a2gboFIotgsfWDtM;EtVYD_a%sW|GLja6y&vHh_+#LyOfk8K}fz%enX0OiBHLvTQ zp)~}-xhp5&J573T-(IbuOsTN0Ox8 zo>lciuV7-*EGtNi4uhE~Np;hb$)=q(tu4@d9rz8kF`=#K#x8ho zB1>RdbA5e8MbPD0pm-`fLo-fNxvE(>(p(*>5I-;Z#=7>KAs`;mWmr=-NEhZtDr{Zd z<1b~{_G+L;*Y^D-(QQ;4=BaLECv{D?Tl_k%v8y%}isp;1IOMgPL+vwZCf`DWUZ6^+ z0yfGA@AQoznS?r|7XBg9`{Rd0t9T8zOPcT$w|5FgO(p`jt!+&S6AeXgO;8v){jJF$ z{)mgG&QqAGZQc$u>8R<~ke5sy{hZFQvpjPV5K{Y=0(|94t{dh?tX}?|@x6O=J1G9BUqHMf&{Z&0M~q<3-VtIO_RD(Wv=V=uE$gaGqh@ocWxj8h8BQj_a(#Na0R4 z-bSf!U*w~FW?ALrV9pqPZgF~GSDIsR2hx}*S_h=AOPwwxaHsW?_wb@^jvYgNh$Q1y zb46kcUg>P57zyh=fuolqs!n+($(*dYz zYMm;MsOk6F%L$;xvY_zHHEb8p>ddQ{dP3qB6_K!`ol5#x^q=wBt0AuDa&L{T73?f0 zap=#R8}q+ibyis~CUx`hTW~U*RiGawP?Qy5(ps%@?jq}3uG?B5>7X_CD-Ei5G}7$h zUW?et?4D~k=JBF^US+saFh1+6NzfUG?({Ms_QPG%KL=KpY!4Zd2Iqq*qQlCqK01-o zcNs+{9}|{81?2kaRzKIfYXy#R%rB5`49b9$n=5BLQ#a80_6v|#9}#oB(AK=RCnpnP zO7cy{kb4gpcc{B2V-d<%F9l`d!n}=FR+y`B7;8Tb*mqLUGk3# zZx)Nq7r8|CSXj#8f_4*(g{yAc>Ssw|wIbB*2}`CR#^p_ZJJrKt@h;Uh1P%C4e4 zwwSyRBDD^7QT2L?%nBAbon-An=M33$7L-MSd@A*fawoS+*<`s@qKfC=>dO+)a=hEm z;hr7ddiD*;3xqYZ@Guu0{}o$9l^vIi2l{oKD7mRv(@RK-@)= z|J5WM%v%1M@vkqR=(yeFmCOy_pU1h2L+70oC6AYInA_;hUiCKD|JY177H!$wLu$B0 zNgRAZSNNnVoGlWH2WEdoKTugsI}}-}=o$?%*l4*e5xm>7QDTSd%Xe4yS?S+KC0>gO zT)7LX?FiNm7WMyHK=&(4rQd46quwBwb^+_33*y~=k;-5W^G~{tvC~TXcJj$x+BAID zwM^xXl)TF};nTM*dXA{|>z>vxfe9V&A?&Y4E;{p}cYF0BHzo~tuu$u(G#4$KAK@Z4 zL^w;`_WK{YKXK<-2ARy|5oc5DHr#w z-;Ka9Vp4gM&upnDd8JowL5G&B1ir@qtS)Z|z>JMEhw^k;KR zcXHWC-rnxY4#pV6fEJHbHARhNYkqeLyos;l^^Z!xGuO?xf5ZvAzqbS#mnct?9^vW+ ztJ~}UO}H4Pcjf)Xg)aG_Z8h4fS#Ue;ss!DY2-b}?mguV(Bd@i}5a=4|6$Iyiq`H(5TE4zp4+&v>Gj8 z-`b}!%BnE05Gp19Hw|#mYd1#VlNEfXpKQ*a&K%n&y4Y`2J3mq};B8y%HiMzFN?>T; zjE%AWzW>JK3EkZSbCv8Gb-CZ{)>0xJEx_ozk+d6-z$9YQ)c`FA@$cI*kb$wbTM)n&KpZDuF))LP?p7?j^OThv8GsKv z<7d2-AUv^yQAhTAAk6?5aGw% z6x!{bgb@q(c3{o--|p+R^}`vz2+u-0j>~xakRXvq;KIZPQd8$}C`}?vn4)bA3P_mn zB77Ze4}=M;lCUrF8Qqr3tF$NkVQ$`~A7j)~QPjbF&ydEZ$Nga7aq_CJ8(eBZ0}C0V1oq4=ax_|9538 z*T+4tet2Z@!(O|M?VC-Ih7_R^v$U-7$ahyQST)61idGJO#gG8>B4YS1MJ=dm7^*oi z2DeWi#2TN9#KJs8hHwOr)zkztq9=*nu@&VV-h%QVoG)eID;`cQkpv%Ri=W;kZLY_O zqQWjkh$smE<)k%VfAd@b=?XDAM-xetLLN0%4~`=5DJ1j+hHxk}GU3b&r6tdzlYW$( z3J_!GPE5+Ng`>=|aAhi;`ZXinnw0btsR{41?iX zRU=zSuii5N^BFH8f}jQk$@_!ii?`m7(>I1$B;mtQGqY==g{IZd%VtmtXXH^i9`+Fr zL~|r;vm>0)?T)EcT&d7m)p*w9hT$a}#Zc5_N6)PRZfsQBw{4mzn@1t!lgtbq^=lrn zSBYNL7X+zxlz&%xGk;_Ssrtu^XQ zxUFEuIam*|?jVcd!n|D>k)`5&v$|h%vFn(ukmc8QEI@Tyz3T-n5VNZ*^ z+C@Y&J14ie*}zMCGF*14Y7RRNyad7^9%_aIPIwJR7#z--1y=FL-p+Pgn}fU)M`!#o zobE%0zuo7k*pU;-Q4JC@f5eFnDJIPIe&G?f02!De8SPIOWXIws)fJFMWOf>DI#0d07WkmE>5$df;n0d7h~Cp;r>lcRMg6gM0OQ5|;g2wqO@=de!M@i1j~o zXRr;^v;1c#5UZQ7$z~plrw)Vp^yhy6#S%&9^3&Y)(j`A47`b5Kc>Zf~s9JPSTJ-<| z;|*qv2EqmMYPCy{7$<_wcrn+()Fkuk)GdRP#ux%LkAQh&`}H%Zw`#fd)iS?6I+6jh z|MBuCdR*n$!vm%gX+gT8rSEaQu+P5%RjxP~`Ww!c5-(0~Oa)D(DEV*T#opjM!BEJh z|JWy%FK!{y_ipHt#YS%R_iVZnR%uj;D?}l720kv-d zgNsj}D&q#dJ&-M7;0GkA_x)fMQ-|>!yVD7WXy7?od&Ty&h&ym9*e&v2i+feyMZ}AR z`bs&gw}=OFdupn4>R?7Ji8^?(V@&A(^Bmxz-^A%~#zJ8>KM6*5Lxm)8shbNOTBwCW z2^_o8mP0?uOO9$aQ!Nfl;fjFdrKOprQT#ct^(m=u2Im~A?t5!sr=;g_#8f>cDkZZ& zM;4l=GB{rnu}~$$=H_)cq_#_?bqQo+Di5%8O98LM8;bM6_fb5g$i}XbZ0ud@R1p$c zt%VUHmb=moJDq=z3y%C?H!eqU+d39tdI|W8$d$RDb7P(@%Bf<+T*fBen4}$!U@!fK zs~$%M9VFoNCRK%Ht(e6R{6^Ygy0P{7*ImW+M;Sgbi89Q}J?XQ*XNw!e%joyP9rzNW zS&3%r%Y)*_owu4;su0XRA%;&O$jLWDK_y{IyYiM+eHdKwSm+cf(&)Fd4Wuh{X-crt zo`SN<(vZMuXRGNPE<$DJ@a%>dTwPTTDbC5RU2{aB7*560%80oCn?Dz?Ej6sb9&A+c>i=b6YGs_+qP|U zV%vPKUFMxkWtpMQassx^S%?Hl%R=>t06z%o&hr{ui=SfJE^m7S`uYJ z8gaxi=Y$b)qS9_rzpr0~2GL&Mr~$s#JMtW>sp|FDoap`Ic@47anGL4VQ0MbP5f;-#o_4V5o> zgmmyX0)iP?O>+fJGkc0SAI+34m6T}k%qk^mcUC*yDFsA)R$qKkio88v6}XMDmXPTZ zv-Z^FN=h@XKek#@B|M(jGBPEk1T*SM)(V<6(nfb-s@wxwsS2BFS`ahCKi|MD)wT5g zh7u=qglqSJ`7ep;6KZ2KrnZNHy1YU~ZHffewd0`a;y<+$5I5p5HtH8^lbR=cGBHtW z6dz&LHRMM$?V=+yB-95={&i2tEHm^^Gvtm)55fq^jI@g7WJzbq64yW=w=V}&ax`ANWlkQ#}G-ozxum+cFb7^oKDLaP3v1X21P|n?1xSs z`8?C%MlQ7OGt^8JaR@0f3>xu(nQ8FsOy}hk*w?v2)wLj$!pfU31P`B@-)Ej`*m{4C z3Q#!2FsBi?4y}v5+ATf-s?A|PSmEs=Ai(D~JoYzG-UJ)Gt5Er^DY(P>n*$z7tcgB` zbq5SOOM!oyLf8gEH>hNT461fBtQ6fecMC^^7zGSNH-tkQ>MeQ{Vuz*ZrvlPe%^Z;a zvmo-O26paYN)vg{N7t~kV<`oxQ@&W%mkyo*V&-^ zgZ1gt<${5p`jCjhU^4nCD)}3Hgf1p9wUXyz?|O%QX=u8_TeKBDvi4Ek#4CgWo9_vN zeNuuGLK~d+{L2WzKoS6KxjJ~O04HrF$nz~m;B3jXfzkR4P0t7uJtD_0z5mUSy0?ez zp?mAFWlLLi_kn*N1e>qVU|*prl4QVVBCG(18LPu^#TrL_z;7K=o{IP{`e3$cJGVvU zY-O<$4^K?mOe`N-SKCa?OWW$b2A<*vUTk6QfL_lExV`KSgP4XO;v(34Xb`g@%nKoEH;^ah!I4n08Q@hO~-UIg^wQl!u9RI^j9c zu!@gQ%Ist4nr|Mgenyu;ZyZ_aT z+%Cdut7#WotM|Bvv-X@lhvToAkgSw@S`gZL?yN&niL`}7$1X#nFdzVaAmr34PWG2E znfO8;C}ua|b7WH-(Sf3voi3lVSAn>qw}=BA=&kb$G0t5?d!yk{`Jau zlu_=6)%dY)K4%7c<>1r40NZhkQ>~rfM;BmJt9l}$p_o=c|IQPK!TphM!a3-AU@JwY za&}ebiVqwclCnUY4DbzZ^YA+Z8f|vaggwQItu%e`k0NxIa&Y>U(OH?fa7w|K4p`wZ z`w5f0&ZEIWv$n4BwaqXss%!h&r)x|>^+U}@cV2LzU$w#IbWUR6`Yt!PTCiE8E)yXJ zAU8Yv0nIgD#0D&VXFE56VeYLKffFX_6R7860;%&zAR)l-wr3U-Y0pIP`#nc%_Vt1G zcohCokv*9u?p3v^P^^)N;X%In-8RZGl4p1AJ0(+jbFg$t+&5TCLKd5mQtl#OKp1WY@xc8tyAPCdcx z{npzFF_sI)N-7we7OnciX09nO=cQugw(PC+>xkQ@lWGp)i{9D>X;JeA3i+=Z0v_!t zFuS4^S1@UqaLx1jE(Yo&vJM1yL)dnEE~o*Y)?+y%FeJ@?3Q9@5C{p1 z%;NzME^g(SKF%M9>vX?k3ByjQpZ~^#&QAs4b{Q(^?a~+R+NMA3`-(#>g2=?!<1{K|&S^ zUSm{;IH>DkZ9f$G!y57-hJs8l@kpx7!)3)|ie(W$2a#9TyFI8IW_@m=W=Xb8yrz%y z6t`q!Tq)0?9Ei7l{f!(puq?rkoCNdjn($b`(q~NWs=$?3eb%7Oe9K2N%rNJT-|??u zZU=`IX}LwZm}0yb$T>FeIZkK#Hvy`tCIh^h{szdSO2R3LT?&Qjg;vTFG(I&0gz@XU zepLJc!!ozG9dpJbS3Ft{nUa%6frJ(|U6<)u@w)}?5>WSFD&~T{_eIY@F=#r=$3y;?BqbMZHEO><6b=iC zKWxHyND=zWFI_HkD4_twCwzW>Ulb8a%%5P!T`wM)LJDnY^?Sc$B7@a(v3f!k`&%0E z_kd#^5pZP)C>z~{CZ~DgOn>n>=?&xlrEj9*j8@Dja6_!})lMh8e+Hm)c;UB)e*^3y z(;4-1SLT5v&~32h-CoYnGX_A{`Ds)R%h|y`D{*s?5K7oAVDc~s;ff@DR9FZYs%%ny zhjJSBb9EiH`IQd(7wn7ps@-q)(&b8$pNiTnrnbpgh=SQxEMyKbtWwk|^=LP@sRU!9 z%ad4RUD2r&sz zJam(SM3o#*wAO$+OAOaUJu#}arwk&7WfFTY%nGQ!9mR98jxROqPM#8Y!qOl`I$6^& z;>TiAU#tNE9kir&L_s}|2LUd!qV{m#Jf92;elmcLj{*i7MDH=LFn4l|a@q^9zu}q> zgtg~1lMlcT%e2I%T_2aBQ$II{!o%Ls2}zK4p|&9kZ!Z_6yIIGjPHa5IwX2pfQ;F|Z z;4+QNw0Q-~ivKy89Y4pi9Gq&%;zj_BLZ?AcZD^Dw$H2%!8G=&*w%Asn)}QH%YWSq1 zU{W(cnHV5C^#i~Rvnr~-E!bD&iay2GQ_8*UPz4KfPJ>BeijlM2pdeaAM4AaX0SAyN zP~3{Me|kMfgp^?55?B5SODmNTf+;2mP6-~Twy&%iofnJsX}l|8e-kJA#GQ`N1!j&l92Z$Vp1Wcq|#CYaPpp z?}`e|p8Tfo-_eBMO0%Lf07M7=^_uUHAKQAe74JGe%3TXEC(&&E7%jc4Kf0^|2XS;% z1hm;T7! zd^d*Ud<)0J!j@k5y~tO;$SD`me69kArYrThg;uJ)L&h&LrzafNBL}5G0d(Zu7 ztmX>`W-lJt=UL{c*3iI}ODS87Cya?Tr#9OoA7Qz>h3)2!61pQfqI@!EG+WX3zCm$- zKMv26!?cq?)Dx3PFjPihil92wT5?4$NE)x}X_sUy_gPAq^X;3G#u+Z-8YMFQl)uEl zl!G3jPg9~6)e%uJYiVRLM557T9WX5{XMg;dRObRt%s@o4(TOZTh`ysk@+kLX^MiXw zU7~_9V)j~@$lHXmi=p+mw1N~Y{l8v3iMIDc^PgCI)r;nm&U=L5(J#8r%58_6i86=G z)EG}DqDxR7a`j5YQ_^qhZ7iFP40GIrTm$*HUyav!3|MQO1yy0N)y%`x!A+!p;2*JI zxb(3I!nIsCNzZ(gkVtMk%bEhM=HDF zZzFiR26>0)vw5f@6yvfcYtdFlF8sn4`b{aI0oM#LpNDheUYmdxjRxusmK6;L%zpd}f1 zZLuVMhu9p>?p!Kckx(@xxIp>6suN0tK<$51naO9$#`5bp)>reXjIN=Q`7{NXu`B{8 zmv527gMjnsrQZ`J)71=<2G`dEfr*(`7qOac&c(?7po63Dr1>X71!G4**r*)E*B>H^0asp@2z$p&9_|h?m>ZivUqpV_G=nK!>DII>s4_8G z<)D5Ww##DNhP$AfXu|{z()NbNlp9PPW>kL-YYsuGVYMu+2EGAN~ zA^U!gCShv6i#mbLqc>sNl0I|Gnf}_OA7}8+h5L@F zt3k-07Rx0k;tu!8p^Pc2An%~Mrq6IyS063H^?o7Gv!l=b+BtJ zJv#Ku@dEiO4+*RM4QNV1EIhbXXPYf0@{en7g`@{}i|f^56cZfIXtJ4&TBS-)lx}b| z<1fOkde2YRId9QMAl6J)eUuI9PKlBR@Wd4G*m_%)sk!C585ONG?ewZQldRnMXbM{k zZvTq@Y|6IL^WrLlx@0!+_qtg}{23%go3Abx38WY}y+R|l`i@I$$MWs>7ba0}Q--B+ z^+2sVsoLy^hKS4S8^8|(HYY_erx+*Tpem|hNU@E!d;g)GWs0s1n(w$|Q$OSI-O zs-&kije1P_ME>~O6r8tW1FN3K+H)9toid$qg%7_PK^2L>pc_Pc>mXF(!$VJ7E0|ko zKfLtgJuFZCQNAY#-DquvJM6qLN+mPf0n=lWXBK`rNoiw_DGzg?J|~6NeF&drE^Tno zmZN&7-v)&4GTnknmoE}xi>lTn(;i}52_V<{S~)dF#i$bBJ}zI?E!;WUjoZMkwm#es zs**V#nrm{TiV<0@=ZFU^bfk$F2{M8N+gZ-^vWZgOzv}XE)Ov#NcE~l z?ii8Mgu%-Lho!gv-xu~9aJW;UZhD26HX9JQ?7kAPDx}HUf_AH-tC@6HGW>_KY$ks+ zAJQv`?@&juapmxz@9y>MhU>m=2U0OD@$ud7X*7h_+&Q_XTEGK<`3(~jrqLT*Qj~06 zuoedvUcn$Nf2z)Rhmv$#)+b*jZXP7Oo|Ohp2CleiHLhFO`cXo>wK*RT?(yID6gQPJ ze|@}TySEea_s#esMPRI}`lW4@T_(QxBfseL71KCS_>T#%*x_cT`S_dh=}EMJ-5t?J zOzUgcezOp$VZv`sd;e&0M$<;S*F1{|CGDIwxy))RRDOin+M6(UU z0l9;+P#L7Y^2{ez!d<`fF=#biv`HW>u=ND8WJ|1mcJ=A{!APH{B$YDmDF{j38((o82r+$C@c zCTqv3kq@M>8#e5GzDI`ESf>$r3Z2V=ZJWlDnxZn>W zRddrj!GRM>Q{4&Lv@XaxFM)Yd$D!pJj@k#ur!QX3%!jqefe>9?h>0P@#e(!kl~goC zG%R+Z#+0OlGEOul`x)+DuZ|qIhVGS@U!!$^n3WGC&|Ob@R8Xn)kNHc1sjUp~f+jts z4y87OAcWfCgO{s~rdk+m0N|^D0`k#V`p#iM! zI+$U~(LE+Zp|ND4F+<_WMN7WCe({XXCZu3K7O@1_J+P---QWS7=QlX-;S>NGSXxae zyT1-SP7GmAmbQ(?h-%0*viKKUfuMt25lvH`Vj{6%o^l+*2tk}OKiMaBmBJZ>%WHku zC%jqOjS>kI?z>lvAch-gPt#PDM>R1Ac+A<6qS{w#{-(*;yW9Gxjxl>QtGX%?Rn6<$ zInG$Y&(Ai8t4*ERAx$ucXKC5E?NI9Pz`*qbzJcT0o11<|DAKD%tSu)0#=pYRBCg{G zMXpP9!7jtaBH}tv;M3o~P;SPSJJE7rmhzb^lb~kau-5^uWT8RGbCX@YG5moVIfxJ= zB!exS`2+NHN?UUX;MBHfqzW*ZlbpNG zj7Rvsj_Vx>@-4aXoM`RPRuXR zao}@QY5Tg-<7d=RM4{F56|}_lTo|xeOZ)u{M9{%T^{Xw^?^J4tiE7QPO}iz2?5q%a ztV4g0kcBVjbeu`UT>4uOaxw}h(GN6lm_`-oO9L;F@X5Re%1R_ahWf=AodP}jRA1l9KDZwhO!F1uM=4pp&mA@H&liW%6?9aa5B=EeNFwE$4 zkm}{2=^UQx`?rL*|3zQYrPV{+D1TJWWYo?mqzS=USnjMGmOc-@Q5XpLns?}aWl45} z7Y%FDZ?ew#hJkMlQpfzzb`JoL^_lP4T;K1Z@V}Wtk31dhMEFjfO8`Xjj*VI~Gb3b0 zs@);3%YsHgDZK>;)QaCgDvzulP2noX(1yAV!&xin8`n1oZ zH4BD8wBqV;UE!ab`Na&^tYJ|MSU0QU4C->r^x)qJuoO9!JKGgx5XpL6LQ%92jU_2v zLdjYSshmpAh;oO$87rV9YL)(G)`*z0SLSvZQo7=QJ2SkQ1u}IP%+hp}4y4rD*-&Iq ztY?za|JJc`O#AU-m)R?0fBo}kvw6lSO+?INb!R8Wa8HeAJ2YTLTyHQy(-F|Z*^A9(O$te5GKW@^TLWhqI@ON@MTxKcx#}?&|(=x z%y!f{k~WSj>dG2!N)XI0;p{#e9Y2tq0j0sHb&Mh|pkQhh3Yp5yf1HZg`81Tw%e$CK;bg7W_z)TWCIK+>QOg4==#zcEaR00a z@s&0n?$FQ!97)fKxxu*z$ zxz-3`IBU}UDQDkdrwes&t>G|bqm*hUMTBBz4ka@SZmf+$q%KDGLa4Lb^sqmACQzbk z(Ncgxn&&0+4QELXwI={=&F z^e)2Hlu44$u$&}1^p2n!Ub_QTRHA9Sq$KSLE1oyF&+=bpaBD^ zi?5uHzD2N^^z7T@O?9fhD3&*>N4>bo`_ z)vW!TeX$Y8$4eW2)7Ei?YW7!7e9JE+~vMJ6OZ!--BWgp4PJ$jh0?OMj`A=;vQC21E0V z;}2MTqB_E4DDH6TW{+FjHNlpCIQicgk5O6#sE*fcUEk>3%*pz`)gU1s;*bz5GsaDM zZpOB1d04*7!z#{8xPiRT#XYqfT2iQ9U1(KOlIf64tewh;9rcnE-&uQq9u+Hg7~N*2 z^W#(}WrW~c2{-vkB}Eb zdaqx~Oq~`fgzRuT6fc&_OL?&x@lPhL{2=Ai&moYnMc#P!S#tl!zE!T?=hbUm&@&TnoV(;=Ei%6tFFD5Y z!!64t0`|b}>v#FR#KnAVHO+MVNud?cCeCu2Eh-9WyZU&d#ws;;y1U61 zo|G}xIj=?(tSzCbtb9Nxd4TRSydJSr=_NV|o_EW-rg}o4#0Xn=UC(i_TP>;=cw-M> zi4~{^#dvdfkJ2s(9&r7B*qKC3Fkf^Du{r`O4(;VG=+($6eQHvt{0X_ zNZ|LP_H$zHA50Yy&lq+>EfS?b#9W+rUMNw3M@B{`FoujoN{~fDvcGVpSt>;=5m$lu zW&u&dTE|G=F$|Jg$%k>{rMbiipKVaOqBhS6jV7gsL+>6Zr3YlNS%xofzbTWF48ZYV zth!;Nmxq*LQ)$v8IG2yd!}7IG&#RqIr&2IkTzNnIkV%l1^FY91H&YAJVKQ66b+;SJ z##Jp8&p;Ux?lO7Ngs~*O+aC;j58$phb~zc2P}*Ml&g(`mAaIkh>2|DVLV-GM+_)I2 zRi@wLg7|yhUMzVqt(zmUWpweuJeeF-X|Ga)5W5{dhu`MKWfktWYVj7cG6b z4KGRzwcAg*NN~nYcq*K~M-I?k!A_B}AudPq$(xvDR|U%aWDBe_lynUZnC8p!EjW7e zHKW5ZTPz?6Rl!$Oi3Q@2;Q~o7{&60G?Dv`u$_Ur;c7jZ~hYsHAYSoD|VklCw?Bzp; zP#Rv`!l-w%%JZsQ!9m)px@xt$a+Ll_=_*_&(Ln^7RkFJniVxj>Zt~F-S@1ATY#C*d zn)7{f;m_zvSOJjg6h)<3p)w>Q(#jNVulSuDUqAXl=(4I&%!0&{e)V5U0W)QmYVbU1(ITEi8u}a*IZ0oJ@lB2#>p=_w zr5m~sj=Uxa7$Ok02~)z3{cy;;p8W$*K<&UQ4OQth-pt`f5~@}1PFDRQECIdgxErB9 z4+dgpYLqS@ms^liSN2gTgeVW0oyY77nV4P8Frm z*j|YNC7us#7OmM=l;ERXqb#p>xr_SAH0l);Toj2C+iNyIAB+`%Qs@G@BGhC~)syU4 z)ll)*(ZW-)eLC4>n$kH__q!Bt&WpO{NC*c*Rq?7w9L;GtN{(oPjA}cISM9er=KwkQ z;7rm1ynh$Uk@PgrrqrUR%~$!RUp!#hE8Oy;d^GOc1B@H;>N0w`vW>Az(;!a!DdLOU zyH(daC*RiDpjg=p;lj{HQ5ey~=%$Sw^VzU%l`)Gl8*aqgRbwtV0pta;to17aPsX- zfv1#d-3CZO3t})non;(E!^Gbnqto+^=SOxUi%FQ2#}Nh}+Ng8$A!)fqzD(FXXC?hc znp+7G$7kIw2IK(-ctr2LqC(U+Kv*agaHQ3<@a_z2F-LS$TjBQ3HIBu^D$sj=jJOxh zuN62pD*l4nxE1V;;p*T4-n4n;vPjYu<_KYgTv{Lu2OchJ>Tr=}bM7cE+qMgd3V)hN zZs9r+)ptQmtJB{(aR?JojqCeqD=>^VA|wwxkSE6pVwm)s-JtKYM| zhJnr~M+5jR35jer1~5h?q`C!GAt^eR)Uq%cKBv>@bOVXbXte+RBS4 z%lVb`hBQ*-2x^Q>*0QujqJAs?h{ z)xg-tj1K%$bSIib%O@)h+-_oWZ#X{0Q&)4Gl(QQLO?8(5l#1~`J0J?5(fJTK8Y}P- zg+wY`owD%rLQ`7}kh z%<1JztvoBOlnas^eEJ0?GMe?YgGb5dNAg;a=0Wra*|4$&BRY=~ptJ^o&(%4w%Ik;)pX5UAWwak6#R%9*B(T|<0Wcl{|jN-9z9NAWV{VB9(7 z4QSQcqVb*_JbDD1XhzcjTZup2TlhO`{O92Gfe1|qt_(v#-$C7s&MWEt(2BPHN4mXW zM~nkdn6{xb)%cVZB45{CS#~gV2Cf0z((?j|m2SLzXNS_-)eB}SdIbi<&&^%q3b$?w z8oMvMf4fII8>Vx+lyoNVN>L{^0}=feR#!2-;aaJKGxbfDIdKM@3?gxjqfNe1b@XZq zGH9{bsZlY&>aa8;^7-1Wr>sl^lEcVd)vkV&$Z~oJyWd2aQ_^z_J-Gjg!H8nj8<2fl z%F8&o7XfejP;lv-A1AMUaV|i%Gpt zxby<%EGe%{6uJuwMqM?lBpKm-U7IB1x$~AKFn(zfOoDXxkN}tL4VjKySHTZ=gKB7v zY4^q_7Ia+;tB1`cnVR;cJ6X-rn+FPsST-lAs|BLyq@>??Er>VN=B(pffA|`#;~6aG z+=;UpLkKL(D>h=#_fkE0gzepwoQUvIqza$YT)9U2Q$C2;d$fC9j)C14sBGttf&2~7A z=XlrL<)2WFyw2Fgc&6NsrL|dB&r*u_;Z^?HUSELJP6Uv>x_#LoZd$v=q3yh*WwO zw%T!1od0<}f@ynuJY7Z~xq7469ef>@5)Tdf?Fgo){F-0cI9+RTQ}>OA2}GTQeqfKDOL21hyf1 z1nU0j-%NuG^X@Vd)c4u%;0$93N7**l@4FKt!H7-z(%smo2uuyy-BV`#H)v0D|L$(T zF-1$%A|pW83~4Svgw?!J%e}jl%$&kv+9V=7-go|uh1Dv^fl=8D`uSX$Fl^}jc&v!A z$NX=52G)`pkeLXuzrry}Kv<~%19J-ixmV+8Fk|!}|Km*DS4M@`OGFE~-=VC(W~{h1 zWQJp#|AbH}Z>*XPy5C=RM9pLFP^@1muZPfKtU{>OlD(brfV(Mn#shxS?nXgunWDha_N+*S;wj5AEfJi2)!iADmrfYPX91N@mX(TW5301KMdJaU)_EMF4&Q|yei za$d0uw)YhT@&lCb#oOR**K~sB&$*eKEA?tLwCe>hd*=5^RZ0@p`bB%(qC_-|q%tH% z8ehbNZdO<&m!u0P{PcPny?9iRkSa4p{fWnYu%9zc(=GFoDwS#V*T;`|ptw)zN?6knB#c!qDgZ&x;iuo{4k|m0DnlcW<%&%cXhR zIH!zsH_GxkKD+#ehMBE8a)Uh6L=~pUQc;iN>jD7Xv#s3m z*8SO|ycY;rqNJ+d7rr8}Rg)NIp&DSqsz7V>VnHThN0mz!HLc+&Kp}rpC1hdesJf?H zt3_vsO5A5cnnHkHl7k1qx`Jb{A}n2F;IZ)Cqoi255dmwu&J%@({#={Y@>fiWII>AC z{t?}x6ER6*S8HMmI1vMH>eNnNlV>>bVVBiA?x|D~qWj`#JqWciy-A|WhPigEUti1D zGtM}7?Yr_exnQ5f3DZr`A{S!%yD4Ta()>|i&P2C#xli6#5fzh{XK2ndwiJl~(BY_~ z899oWrrfcs!(cT~crrezvkC3VOLRSI(kCkTKTyrpvD(Jt&#@@b+ZAua( zvfTkoRDxHdjZhb5K(`1|UrIE@Oj_P=ElYdk~RJ9?idlEpe9tChBvkhtapnYq8QaB+!qs3F0kguRE~CUbB+83K3|S$Eeqn zFMvtT6Bk z>|}K2TD5ow=$IyT@)eFZl}%C<7&w0blDkh=hRI1b=&M)P_GPQ)lbFNU9x4LO$RDEj?r2!9=7iOES6sR=}6A?6ksk^esvqF*FT&Rob6zn78BE~x_FP(e6 zAvzzP2G3qB_EsaQ&K&hhyumLIM>Z{4Ybov5Rsu*BYgbE;fhMMzgjt)G6|}@rH%*h+ zWe(GOHxm`crX_WMg_odN=#3}UOBZopdTP`}sW4Y~6*gyq72((d7-i0BRQNyS19pa*fjRSz(iro1ebZ zkOXa{oe5(kTbb(k&dWh^>JCKP?qK+>pu0L^+QcqcgFBcqc&OxHd5F;~;be@VYlQq_ zc6VJ}K}v@iV{>%nvJt3{VnMf1^Rj4Y^dD$GjbSoBY8?ejifB|2wsSi_!3BaslhXt6}-oM*hgaDjd| zrGT$x31vv9wu?Z%M4Yv`XRZsFu>Pb-HgQKz=ko}UN?&1rIsCIdr6OI*f&wE!nU$`Ihm= zyzX2w%vWGfkudX^JfrI#>KGZ86WE4D36I!Gq_-;KIzBieT462CVfMF-Ld=<#-U=qyl>)Zz zGMRcz?XZq4IX;-7wl9SpI;acl&N*BwZtF!=x;Y`5?`D{z87tN+t$u1NU7!okgw({k zsCg~1Hk+@se3*?L)uZ9eQhrq?GICbg8B3Xfcd7wLN;FHAfM$fdy@@#{+3f>GtWHpl zn%>OD9B!sMNO=W6vECXT$KA&w3+KGl+vh~nN{Ta?Pc_PNQ;)>A)E`g3C`HJh(}{p9 zJ({~a4$m3jK~dqsp|EbBxCE!A9rTLjee{|c*h<0CKrQhL66isyk*NyqX_o3~Qu1sw z=Jj*PWh5)QO{l%V^-J-hiFUgYpNQug&!-&X17nbmxANAzc7=_{oT28ESHooQkEZvc zTA{}my3E-xQqRGaglg`UD8W_!9pGUNXgrG11L76^{8Kas%|YyPhBaM&rm?uSH!28!hJ1E zW2e4*+z4$%9?-#$hAba-J1Nq0{YOflIloS@0qh~LSC{C zaqMYeUCtND-g5T$#mE|A&hl((m8{X5{@uBu;#)KDkW}`_^QoIyu@av7UR$wU|NA2@ z=QDPWAirTdCjLa~8ojk)hsPdwNa2ko3Xc4T~Nr-SNHv?DZj9OkNNsS) zAF1M_zC>Po$I`X8Q)I0<{<|6f*G7~@K=xj0y6cG-;NS6@7h$;e^bsHJ))4aK97_EZ&yb=AO)t9S0rIi+2AERP4cexc;p}Zr7e@5W3u!fZ***$;%zBTYVx6IZ5-uywF zo&Z=&Fx6k$^1t!FzJ)Y;8Pk8T2Tfw}-;}hU7~uMmVJ-t*)g8ND$dG=`{fo%sw?4re z=E%E|5lZagd|2Yv%hY`{pt_TrJKjJmY{B(qNocGK?FN2yZJct=ry*hRU~><3kS_ccG17L4wHEG4Gr!pzJI# z@m2uz-sklPRP&kjj>G@bnk!o&;IRj)LjBcXo259wThP$iheZGjdQK(l-A?45lEQKS ztSMyU1^wx(J>i|W-eg&GFJIVD&`DWM652Oej?4L_+?S>Cg1g0zA2QbB2*g_;;}jLR z`loWETi~C0Qj>b?M0)28NvDYHm+p+5DT>Z{QH=>u_54VFvK=h#@R>4dz;Mh@~B3f=lizs>tw54fx_j; zQ+NIH*T^34*$wEUp~mCW!)ouJuIuh$>c1?iWm7=bW$Jq$IKiv8*M6Rn%paoqvVg8v z-W^cKk)G#~mR}Ub+x)@aKR&*E)3*fY6$+H)Z1ch*Lj)rYafBXkIQ_M_8n z%G)ztYbcaMQ!vRpDiU0r+xEdr&j}YOy5#>|_NkjZ-$|g{9=j!})Lb><8HZ>4;7vrk z@rTp2=VRbWZ*TXHC*PwC5t*2Oza#gZ3)98cPPksPd!R>Aa<3)G{~mR#z9M_DCGFfO z;6jB9a?dx;wfCV)U?J@3hsJjD)XuhJUt`p+Wi(o(R8N#ivqZW-vBV2oao#m*-l~Jw zQD(;)h1x9L@(tJSWVG746hY3A&MTA9mg~P2`<_SexId^uUD;oin%)^Oq z5WxIF^52_DobTR**vH{e&t9JX>%^~ZaQqN4BK@tvXXy0J>phz@zgOFT0vbG0B_L%5 zANwJ|9+?kull~Bi+-8o`oPoZ^K3Bc@&4&rwA}Nl4+4e$3O6jGL@oOP*0xDWZ3z>UW+5z{PX+1m5$y+EG0%!L3 zAMg13(S}2)JzD^SmashzR04M@^}m;UE!X#&rm1^#9iU6xMVS_@Jr7&Y&0SBU$0IgS z!}C8r52lUX_jHh+UeSK0U$6b9exCm69rkvM|3Wld{uGgMiB>irXGL9iV;gTePT)4y z+U^m@`J2qTL<)Ce_u6BuMBG7f({p_Dex+je^Ow3f~&qXZ@ZH{Ptg|l z(J|-cq-_T@&R3}SQ7MoXI<;w9(i(%;da1@&O0(5`Em*tYZHcwEtmJnoVx*kT52fX2 zYnydt`af!c1XFXR;cE=bK7ch-7w`hG;2v9K_s^*yJ%f*bI{5x1=}mN-qZ?hQ7h}1LtLEZyz|z9oLf3W=Ce%Rdxze8 zjW4=p?y?#>iXUmU#`N8tOIa&jqa~ZvkJ-$m46fSu%WcYu{^*fLHL{j~|=T zfy{{ktB?i!?KpblDIF4q;3f=Lj>|c zExrVLYwyq+!`FffRi4j6tsjm;g-XllUo{W6yKnimhu$Nz?aWyrI_SU;=ySJ@CtOGc zCFgV{NEkhe^=(`?&R!=8OS~vBypEgl45qdf&fsd2WT05jNR~X;omGFD(mRe)RBW@v|@fFN8F8J@N@%1JU_^+h& zj-YyfGV9K^yt}OlJ)r){IH-A*XjTCF7_hzRUO&un>`khqVWek}Q1>a$fnWqt17K}^ z_E88Pc?gv4IpXWQi^M?BpE-FH{#Ht@5IR~m5uXkFxmPx8N0_3_a0@rcO&SE@el|9z^y2)mf1m^dGm1UrSK zyt1MQhoXvxk}RK+f~1PBo+<~ink9<5y}E_~ndUcqEip=6K2|+(c0C1AJ#~3~X)b+L zA$?;@11m#Ac~V0KPD33H6B9iXYZFr)SqnlUOFI`UH6iQ&_o@1MUsV0#|4G#^D=aE6 zE~zZ8s4b~%EY;U4t!XVwOsJ^%4^_YFKUDqhIu_}=w*LCM`ueu)hL+x@hUR7h>gMLA zmiFG3j=}!}ReyP9;|r|+|0`Ah3#lIgi!bd&Tp0`l_(JN}7Ys$9kjZ9q+o=x8V6*9p zmoJzU$0vz~7i&8eODB@6sq#;t9m@n$lCh+)-;s^|WEDAV)=4fE&f}Ju{Lon}`N9cm z&@%Y^Rvj!=Bq7w7ZK+(T0&oe2RVG%I)EW2rY)7eDPbF$Ep}D^TtQ8xDfveeHyZ!l} z;#;e!boVzqtvn+a(^Z(ZOTWSZFB<$ycOz-|MuL)^=;p?w>ZVBHbeT>{{SG=1r_&w> z8;cZ|!8en*P0P_f@Lg6mv$0gsoN`Uvx;vs=w&5S_jpiH75lC}W zYkz+i`(|2@e`0xS)-;s;13lkl_=(@;9%Qw8r!ZNq@iN70(Y&_nJUI(^Dmm&tKg~BN zl;WD~ykaZ|opP+==>Kx+gO_?N9|rV(IfI$T{BuUqJBV5kMr@w}v~fLmy< zT61-byFgyav!YnU@QtmI=&+3yoB5sylSC7Dv%NTVR!_nxA`70?Uzaly znITKC5`{5AXuPJeSXr5>R9>{W`npa&?)#ynKQ#A^-(fSXEJhBXi%OqNCJ7y((6H1U z@ZLrXi;zuRsH!l$L5Hx_1Lm8RX}LZ$XMswKuW2s+!@}caYZW{lSJK6DUwAX}+9owew@MpWt!P|mc208W zY`UULZc!I=JLu_9K}nr4wEt*%Bg^=qd3ZOJifwV6HuO!dra<}Ughj%f;aI8Bdu@5y zSiz6#`WDi%)9NgoHhL>>udHga__`l|ORWxU*6DIkeY`e0fY&cofo+Ffm%5^9+3FE8 zo<7a<2j+b8^v5lSd7)p+dQlyJ;r9a%UROKPmP+WH#{pd?f%}zo+%m#i^gacOfYBu0 zixx8`eal&&SI}2jE;0$xh~~$h6m!Y?>CdNx@ml(d#)+G&{V{=mJRZGdj1|N^s=Hg> zezv)^dwnpS3TFFiTR-GZBG>{>+w|Mw+B2;@2;B3RkTUJVmSXkTszi|SD$jFzQY$0o zIeT&G3h&3ro4{l5~043%s}#e19r!Py=-4Sj+DTEB>!UHjT4$R_jd1Vla0 z_u_2N$(*vh==b)nGRn%pr3Y}liw|_c37Sgu{{}oj!@mebphOPxAlXT3Ufj#u;oRi9 zY=$pRrDm;jhlHxjtyubNLSudni0J%gm{2gb1bCX${ z(3ZFc{>y=OX<@p<~)4 zhRNuODmTHqk_DUPM-L*>e0R&Ap7i*<)^L!Eq`BR=x->`N?r~x(upPiP1#lk(`*dI+AaexT6^Q%6K+HuFFb-jOPYL2gkkqr%+$4Rvy0z z7Ks8dMdIA()K-?gfgICSXd9)#_SDaS$u52`k|VjemANBcvx8*35G6keF8UpEK`Q*> zMM+1?`qU|f^+Z_+BNeAd!E~1V{7C|tveJ7F>Y%2g<3F_-N5EZkp6Z;a!OX@}hoaGG zVPu*p(dxO;Snhm4k_&+3wjAiiHCnrK966Db&t%RlRxY)Ttj6Nfu?|ixrzE8Ia!5j- zQB;c)Ql!z2Mz^&=X=y9u8-4EDCig+>s4R?U=ngm^Y}KZ$S;Ok@A}BRxmUF9SwF++_ zS658`mbP5!(QH^LNJd|x(xdM4X0z7m)^&<&G@ay-!CvE3)bUYhg=3Yh0-%19ut>Nrt6A!#dD~d0eovdDfEsDp&N;R5AtZGlOR$gm{@VSUhuFcA) z!AFr(fc;aSbFU`M-kHzAd)4JlMNF$3DNw`pm6eVY_|nA6cE*}xZ6@x>Crjl~hMMK( z^k9fD+-5O-!ObN?E&Jr0rjmwT%WHo8$`}ck5PQ^_>b7ckWBStfS!DZ3&a*|*b`zv~K9&q8EsD~~KebeDVHz0@7d{25sBd`+b}hV*ZP7;B=j z5na4&EWgh-x@xg|zxbU})JRO!2QN#6_qIfv->Y5eIS|}&Rl!;_P4MrY+9X;*wD%| z@&J*faR|!0aicw1MyIr@kb3&+ly0A{s;TFYs~Hn0CCRj1`zn)P7~*WdHQGD+KPt1kwt!$-dVle>A_lc9aS zET22=#j3>k^3b*z&%5a}eOzbD@?EZ1vh>>vOG2BwmFWe0*7km9=62&@a?|AyHimfv z2YJN@WH+ZV%coFrcPR3uQ)Xv=v{hN$^l1wWb~9w>eqcfw|+^Nff%Jm zWwL`##(<1=d{UBr%J+lhH)-q?d8{*T@V9xz^g#S#E(Yc?jn`3rcuJ!Hgq%SR;9;b$+#tpW)^E_5Z>VxDTjr@Vt{YADdy*JnAnGu$YQ%Sj%CD(F(*_S zcX5_jEJGt_Jm`OPhb5J0bEC&lR#hV?SB=#ukECQqZ>E3^!a#U2ZMvs`!Z>q8WHE*$ zjz!c{+U9V^1$rBJk7uV;s&axDBZ86tIBF93K|D8^Cepe`R&BkR0agh_ml{618rGs~QqG==$ zvJeOiAq<{2i(~SZ-BW#=RyT&JMHEV=11cPJhJV=AS@%PYHz}o>c%36RW;tdWJ7!_E zGl3UFVVKECayp|V$cd6xelWqGnI?~K)<|9dsbn!@aK05f*(j2vHimOHYuYz1YrwW+F@eo zO7Zt|%2tBeD5-mtmI&u-GQ@-$T7#OYi5J?8ws)CJx~c%DhqdQu%o&&1L!~UWo#i-n zcPA(*x}uEAC-??o`39?{7Ov1lpS%`tkcdR4x|B-kk7^kdXt{2P6FGL$e{{oIU8Pt zM}DQJBo~^41+b9$Xf_C@`K-+#eq8g`MP(~Z4 z{z`jH%DULglqGAjZ`Y1mH?!6M3av={bd#e&5p^BV3z%UUgR_>UF9x)&NK9&LPtAF6 zcw39OF^7zYe*Vfp`Rb}X7Qg~rCVmUNCE=ORl)mS7ujIS0<^+9?ba_Kcj!zn5<=I{E zTQt6?i>aquP3TUbcDaoSZER+*ik7!ei+r2tjs|=YEZA=awz6k;vfuiqvf5`jg@L@s zzBuejl#90cX1rC`V(3-65E_A(Cbw5RrL@|@t*}f3oN}L-TLlPk>=Ic08@+X!Xh&Ot zr3-Sv$(x{Jcb)oA&#Dry_F87@tAUh%IHQsTcR|JWj|>WCc-N_Tx}+~^!oKUj-aEy8 z%Woc=vM?-b)v3UV%25sf47-AOZmnpSu_eT|n6VxFB|+UmW2n6+(3R7tGArn{G}S-z9%g@zYH!Fq|^xu7}uRQXG7Qu)hxx`4c! z#{%5Pt-8Wd3!GHNfC9I_;Y6Zm%f`#ej}okkXxX$!=Nb74qMD?pH)?pkxN%?z$rh}` z)Vs$$t(m!NctG0T2~${1PDEo49t{k&BC7j2vaFM~;ez(lXr zVQj}bpTrooyrg674A1HbzIIEf2;9W1{I7#3P*h2d;p1jdYPCouC$Rd^VtA@-^@SX4 zb|!6UY*V|GS+{2Y>zSfl#%KIV2DrK~T+w2~u~KWNjv;Cc+@4m-JIuVt7GsD=SHa2~ zi1q4WNJzZ98Fn9?yb=1cW*B!6S-Y8v#}KWpVLH7|txdP+q&8TL5N)jl>(07)!N`J2 zttq^6?b1jVt2ljKrAN>wB*}r3n12RV8XPt=9Jeo1#_Q}F7umhX9FK)ewKm(-@%)4# z{hiFUX?(YmhU`WVcxt>d=u1+5SbB3_-Gt%+{m4 z8!0H!ot(?48p2z9wX52v0>Yb3_106?n~?2KISO|W{KKI&GDSOmg64chn~J1YqpppY zH|&6M^v8q$I~zP5#mBtUH(kPEWm!GTy)F9m~OvjKmz&V;;T{?#?_3>Ps zu7X0Dv`~%jA(-06O^mcy>)z7Z=biE9{^yh9fCrGq@2JhAWpn79E*{A4KL$VOhMt*+F2m6U@~_?QJ4%973XS)f zSlT>M1s#im?9s|auD>qlVhqX}Tl5=_8Ke4Ir&GvEAJ2~#^SbR-uH9){9IsFv>sn&k zltoPzujKTUtSG%c7yZkgCuF^Q>?RMrb~?x*DQ>gY)*jl^Zf%*IO z6gIzr``+Zv3AdVzPMmx_rleW{?zg7P_RTNP`L&*3-2CkL;7fn~QfyuFe%H$XYxJH^ z!`rF5n@GTq2jH38GazF*$B%=UcHYTfk4_)*2M6YRo2jInfbgH_AwJR22@sMb4I^04 z;K5;-FeO}g>C!=m2qjK5I4NPlhYul6(nzrr!HyI$GK}cZBu9}cRg#P(5F|&J16R&m zxsc{dg$gBhI?2-~Pme$$iUgW7Cr+C;mC^)-6l6t~Mt?>`*f8o(mN+p|9jS9^&6_9< z8Ttx!Y*m;QKPna2w&X^bC@*RR)pTS{OFh+=W!v&{;MOK&~9wXfcmg(B@8%GopjQMsyTqlGLs zZtT3l{eHFB*D-I^I~x*a4x02`q(%{EN}QZ6s_3P(SFYQAacJmwxe9)qy7zRtoD0sG zL$JNdws`c+r{B7ed)cxN3ex|&;(d}Bs&BsV@XODo^-zlrK-vt}al6D~bTKlbuA=eAz^Dt*rcE|+&%gvl zf{?6<09neyMT9JbJ^J8!5Wf0K{BO725}Z&bgP4@iLJybZ50L)Io9!ew30l%t%s7n*XJtNKOJ_f`*SVz<>oW9FaQagJuZ-`jVs@iK7OBoc>@3J{oC6 z<{AW{f{8#VDaZ@31tHdiCdNK(A}h3gqJs>aEV=8h5%62&EG6p<->epc(=(}N?8_xkHC~J(p`^dj!CT0fG;iBZ$Cu*#prz2>whs;DsQfmdF8jr&i;K z4-7uY^<{@GdT#MG)C#v)eWDyXSvSOJ#Xaly^J2Z;f4?O*N1Mb4-9h1Be3Qr*oRBkv zIDrYL6Uh_2@W9Z`>4wm+5Q;4Z!0b!^VfLeQ;(F_}3YF00B%+L<}U{LnjF` z1Fxk{gMQq@&o1CX8WKbk!}x(DF<`X?@==eLTtXcB00$cWfDl~+;>*ww2C`)@4o6G^ z2{w?D5gdeAtQ!}i&=aDLbcQOR=}H&-#~ok)sS!M2gqRpTG?z7HhDUBBXTnUvmpT}7 zfSo%?7i?Jt7+`XevfG{k0szD_yi*N)W8@GgIRYORBoC;AK^o3bkX5pihHqf#Fw%gx z=?!zCGbErdEBS+b{_75TW931&x3;xWbcs$3q{l+=11U<81QbkPgaj9{Fjj1h@zc;X ztpk;a0c%ZBQO|hFNzO5yN`?yE))f;F$Q@!!h{>a271S9+*7=Q>PHj|Wm&XyVL1z@K<3uCQao+U*r~7LSLb$ffnE-$wTBV`&j+(%{-tMz6%-+oy zNyNRfZlqIXCqQkuM+9n83`h{2NmqDVG&~fvT7c^Gn0SRnHXsI@ouF?k`cdMBVG2p8 zA>KfE#LYf61u9$Z7InlGz+%RW?W3s{`-Gxa-PA5(>~2sTL%;huDkErA)ntKsB|$3k z1M@YiN@!Nv=FRnpW}wIv9~j)Dj+S-wP2eAY2HNp80F`M~0@J!?wG(#r4M#((7ScKl zP@eLXy=$s5?dF6YXz&S{4KN9IwgeP=^t1supAvTmNZl<N%W3{d|!bS?gl&&+#*_PSJ)mjm? zAv_-e2nKk>!|8+d=RZ`ZS}YUSO0Sc!yZ9dSK>5OR&CD91~x^?Pz9%=ueu3t zBncKt)Tkan+d3Q94nh{+nGQxLYuPcIbetzC0ogi(JtIUsot4JgZ!Isyn3V?PrBkE& zR3gJ-pr0DSjE5Dx&wC|YMDwrR2`Yz)d6p$F?8M@L7E|qRUo+|Nz+WGJB@(OBtVr3O+Q^aL4pwsiO{uqzP9?zrhaV9 zQu`()?q}l%ZIFwflGwyXLb7L~`P{)EOb$9Y1yI3@bkvz`XT?!_F%|4MVssOTC2~xXD_t%P6-p8o*4GI{_rbK}^Dw*ga>V z55Rl7-#ZgXEW6Wy!Ufcy9Vmi{C<0bvgQ~N{jHhUttQ8W(Ncs(*I!t)xV97j?N8oja39 zj6_O&mdU9;8JIX_k_b*DfC=bEFtaCJ)I(qN#QifxUHiAw`xzG7#i~IFUPuKx;01}O zILyOCUKB?j{6#T&m8%fOVPri)><~^%Mv=fQ^D!3lQ5I%ViJfW4FZ9A?G>+3E11Q>nOxr5i&z0$n9GR&e6YvT$YfT%Bn1AljBI+W{%#Dq#@}D@rZ%$e(XAN@RQ!ck`z5x)j+%j+}E! zyCOxUpf7s_O*Z_6f;a?ILdUfULmD$je=5jaC`cXX7DY0y1mh>UL>&w;!-9yznSh1= zzZA|k%o^i_BuIE9c$Fh)#-5yPB1xU>Jl!O7`NZof;7%teDMo%B6cXlZ3HX z`^lcHnY6P#f}jNo$x?B@VhIB60bkDL3Gb#g4rTEKuY{N8211w-jC_}I=L`(y< zDjmox&Z3BuNsT2djlw`mn+m7Sq%;FGO<$3x0U${X#Su<4h$1L~7Ek~N00Avy!-~=m z=li&AYoO!dfe;$clU&CY>%^33!I&IQUQmUUn1xx;1e~0LiD><~0M^{eyEF*FEC^sQh*^+FvyuXXx-eEUQXVi+9B5R;?5z+o zOh@&)nHU2zIgsC&yD9xg#gd;PoXkVy(k=5oP!!KE71J*rRnshk=UmTUpoP}#gH|J=OwEOxDT)W)&i0Wmfl;t2p(p!%B~8 zdcAysA36C{QH6~33=~?Uq;DmsLm-4hIM-UJ1@=UUavg+2-~uNdp(bE8I;DyE8_@16 zE(VQDz7U3al*O79i9bcF0y|DhAqYjF6hcTFxch_kSlERH$_k(W1?Wou5a0j=sy>dB zgGES^;Q+$y=*PzhKrofNLzvu%tElgiS%ROOry<&s&`?%ODKoopl-pT;K&>7}$fz+N(7okfIu- z`4eZYuE@OD6HumcVS^8S6q!gBx3$boeT_KL)RRTorLanUG)=K#gmVRizBLGlwSyD& z#2pL(!}U1)JImax&!;n7$E{eU^%W@)DC5ky4f&EmV5`8GSc>JPDsr}sbyyYozbVbm zx@|9DsZcsWM!O{&lY-gsNiEWp%wL5{okUM8i!DJ?Tj$i=3Zb393?DeFC%QnURIFXx91Lj4i*)54U=@nDW8ym*mQbb3|Oi$UpU4nYeVSro;f>9_dq|+E%l;HtFf>MfBNsdf;rvTNod_VcU|)TmK5Z8N?&aXkl~xkQzDos;39TFz z9+6|D(sYaArfgm3n*d!SQ&`hY`sAh8m05psu0j6I<R*vSb>4Hee0zY;TMBoo~1}V#pPXvaW>hsLILtkFb z5j^=O3T<7~i`K?7v`kt<#N}aACDHNZ-v@fOHJAziBL>%lV1;&arzl{|8X$vQ=mj9C zzXJZ{V*X_ZhPYx|LC+&ho6ONvP$ev&sO#m*|K)>fKH?}iWqtmVo&f6qCowum#Se|$oMmd*SMF1I>DU2YiuhYfxRub}sJVb{sV&0O$#P!Dv%I98q@Rqf z-9*cCyaHt2>x^kpwZ`UdhU*wOo3p`9WpQZ#d?hg!W88!b>|UvZ1Jyrcx$F0U{nh0wlPAWj5qKWWu-2Fvz5+Jf7WV*B z&VhYOyv38)26gPO@VvlgMMG~vgFy0Oz=E(Dnlc=&jG$8?b>J@l8GE)HNDNZVjgr!Q<}!@GLfU=<9Iu z-dwM~)Bdf(rHJ$Mjy3tVKON|ER;_5_GE!_*3CFb}%R1hf;8T<-^sW;LBA5XSQzAc4 zmq13ESJp^11uI9zfuY6_jER;1E?;VO)6B^5G>aGYp-yvg=lF6LZi}^mR_8_|;w^hV zzN)S+h!rTOojg3Bwr^gE5EE`1P{E5kc~)xlIEb4AXM-_>7lgNR;{sc*3g2C;-MtI4 ziO;n3#bq(ccEXeH4Ob@%qH0X`coN5Yk8kxx9kJeO0zx7g;l1Q3{>?uBmp<_NBnNJg zJ4p}bQ=>=ez}`G%TOlH7um*!GWf~f5spj3VRA(3ZE(;rT*BMv(ZXPc~Domr>>lN9X zG=S!G_fqw&M*Kt0dYn1+t4DJ*A92oCbM!v*U<+$yg{~Cx-KZ|08JAT-Dj^cwZw&~#S?BH%1=if z`UCbq5q(2Orq5UN*&lB1zkHEL?~sD+*mh3g4PFx_1jgip;nKfv*3%xOvX=?_sfyQ- zlR9&RV*kBAUjqmX8%B&6X7J#!5di`qY-o@M8iP&<5E?TA)$t_Vl8^`!1bVon-F;5nxiWTVyF`^$H!CM;TNE5rb1C zT-VWlKRBlUg%&*gCWH_`CRsp==dD@6f^lx3rbHQu`NIu-aI(lrEH&iFS%283n?b>K zl@$f!ZIuNdjj|YHj6T6wV^RjuSe#SN-MAu+s2KDH8lj5nkQxmwf#-!}iI*60t13#Q zkcxSQq=CaRnWR}wX6IBBjZ*2}uT^5`V5MWF^M39m4X&h zh^0LleDHIWS_)lIlSaDKrZzgf@L8LD3M$4Ip8=B@YIN)c$QS{*uXf$JDp#@GsmK94!5R?JG7o}e+nYvXCDHhPg5N~0!OPxUo9pDcjz0hq36*^#Q20I9aG=3Tilof$- z-h`H8753n0pE>0#FCt+ZWP}yG;n0Jjo}nm#1YC8&2Hbbtu~fmD2E~((bxW%7Nz5g@ zBi<7;?3Ne@#oY4AxSFS?2HP#(GH8dPcT%r^p|swx@|~3c=MH$zE$ED%1RzY@8fKYg zo|O(1vTuP)b(iBhXzqlCu8YGSxBW>;*pB$_`=ghig|?w^Cd!#mYs5Xb-U#mvF~XSY zooU{|6P4+T5v7Z5uvU z@|TXs6#x{d0~X0KiVaXMx0CI7=I@ypx}R$zfm;bDrJ! zc0CwH2XEHn3R9R;DUOkNuix(wI77IEiRRm;_qQpPgSXz+mz`2rAmAT&P&f;~bZ z;{1N(G+Uv>LMwoQ18wI6*jz<)v(bT*Zs08Bk?TawdJ_T<7)IGWZC4&36A$p!2!v=t z6Yh$aP!b_WJ^{uhzBwHQ$mkR@fbDXZkd)m3DM*94#Z!F)Bza1RBN!C`@Ql-WcS=f-0aXO=?lyy9rQd>?|7V-5@kB735;Zmi>{p7_65&=TofFOj0 z#Kr|)NTY_(;vt2C?rFN(fk}G!%5>QUO(0reRq!~*(}j_0Bse4gY&MKhAcPKo+Tahz z@HHRSa+ry_CRYZfljcR|CzCSH-K=+0L>4lUGTO=`DGA9>aZG!#A^=j8YQr+>OjkGT zsLmLKGYXmJE(jfJe#XGFUUlVc=oy(sb`Y*4c?=F_^++$B^gjl{;C8qF`(+I}bWt$k zFPOj#fI>DWw^e3;_@*mlw8Y? z9V?6RDpq!r0duJFX95FJIDfAQJR0i2)(FDF$>ugf%<}O9m&hy0C zlM$riUS>dTS4kTA2Be|eaSb6@2oYB^C(>XGF9m4RC)?)#q~X9urJIv3SaT}NNXsH5 zy_OXPj~y~u6?Tn%obVMN)LU)Wbeh1Q6%g#)%g!o0CCgX_0K&CHrXJPFRA~T1e}Nb? z`Vbqww7gnyt=Z80RCKip2tf=4L}nJeGa+@I70QQkXIj!Z1kjf8h~`LMdv}`+yz4@t zfY~_W1iD@{-CH9uy`#(in9+>|&C)k@#|&iB+k zstedd3dy^)@e#AQ#Vj=O)wo=}MG$4P2fEP8fzDFPoJ;nbz(R3#x`no0dsnqni+8s$ zN^XD9!?vHI_@FDECv6Avx+727qi<=lpFT$rR*T!ENZ#U4^L-(ulLqcIGn1M7P~D6dSMpR zRiAhnpH2WzpbS@qou3FglEQ(334%c?yx)J(Q=qlV6hT4$oR2+yQL07F#vvG<6%>r~H(r1=-Rq(j-b@DP*E1W?~frN#JQAD3X{^ zIDtd>LNJ^nX^enIh#Pq%i~T81+dNJEVNws_kFe3VEqZjN2S&uN|D=b zgfX7Ux7`k+t;ioZ8Wmm|3PqlFXj-|wTO~@OyJ4axmXq{=qBn*XK}dl?sNE)s30^T{ z9Yj-awF$BP;`kVb3?K^~`hc1tm9IJfkqGz}h7Hf1Ak?~a(&*TP7Nmg_oQ5&piT`nc z%Q2LqEn4mkL(d6$jzhJ*!69sR8Zb% zLE$IZNFiaPRc7E=cBc7|NyL@^rCI7i9^8T$o~AF{f<(-~4EUwm0GreZ8V$h{TrQuT z4S)s>RLOW9f*odt=@-J?*IwGt@>Ebb&D(KGo;OJ*b5de*dM0#=AcU--Lx3R?z?xgg z!5z#b0R50yK>@+2oMKLt{8d2}$WlErh%Y4uhkStjz~+>Rr@;jy7quZ44Ia$IO*MKK zWkMcjnvZfGCq_mmflB8L8crZO&P?9J<(B0#73~@iUL6V0VW#~ShdX9ksAwcg9 z+)y%2!AVtw?AMY$Xkuy6T6EF>xrX6MAk#74b50*M!rL`IA&@PnDp+JFav_jzkAK-j zVjjd8I>eIxi(a}T8F^`)J=*~&py+uHFs+H05{sq66Jm{G&?u3sm>avYfY&^TpKb;0l|tVdP2>zPHUzzQJ5xc zwbmi2P3*}r>oAcgRfMSwLTg=(Dx2^iM0Vb5l#bQGS;+3rjX{NSLLZS08M)?&60R#p zmaAlPV>D(YBzB-2$x9L01ovc&PYU9ibT)QSk2O43Ll~t*n(>v;0{i12VK zQ4*B@feqZ)QQ^C1rMti6YebnFB0)mAV;#BRenN^9WWYS zovaQ88Kc`weW1S8fp!os;SjDJ8*P3vZuEkd+w7J|3>OQh#t|IBngGEdp2_Kcz|ah0 z6CBq9tjj^Jq(aRe=xPWd=cW+7UM=w?uNq|Ang;3d@S06dnUv|NECy^{@8R zzD`|$VH#*c540`kv=!+gMBxPvonoK@OK`b)B`^;Kjc!x#cA^@43MeddCtSjRcHgEo z%JOgxzg4p}SMwYrZdpNZ2tcSZ1|&j2F7Hi<76~FpnSdtGj`@!AAVX3Lr%G-y$so`F zGZB+&eUfStwp&I!@ZHvw7gJ+0?^xf>>sH_!2DjpRr8H+bMI7+l%TWO;M`{O*B)A{|L>%Ow zg{cgb3Cu(h^#-PZT(VU)$mD>^t8wW*Myjc#bN_WRQH_p1hiyUTb6p4_dN}I=g0gkU zs933DItMJ9e1H?>uX?qCz@#i1r}Y<4p%kXuT90u9>y6A>V^Xw&61Iq4)2yw6($4x^ ziHVjRN98pSHenA&tAO0wfXdzl>vUfAoe7#gbu!oiSDoC2V!v`JOR0)_Z9-!Iz!G7E zQBkV^^&&lo3X?K6LbfDHsu@0Q5*7S`Ip@<|R)|ET!5h#rYih@`J&y?W?aMmhFvIFx zL*hxi!Yjxdo#ZuU>b9ToHTwt*bVE0oU5RFKnjKs>b|bXHZHZW8K$x!IGG1#eJ%DdI z4g$2_Yd*jg{rqnuGL4*Q&b? z4s&CQ&RX6aHFpJ}cr-U-i1^CU@+`gXY)zUcn6ng!fo7CT?hoDx(QX8Bb@IE}{MzNzRb19Qrux>l^S-ek0cgz`zvL$s34rpR*MDp89YOYoP=-*zl)s zw;Nrzb@D!9aNn)1>!}#iDzFDTUbpNL@^+*+GZpihNC|?U%hx|t`^T~lN;(Yc+IIE~KO?v%J+EBoJhkd<(8 zrcW=S#yh)bdXS2HxtDxpoBQE_Ovsa@x|936mpsacjJqRlf2n(ocl?k8QOo1}x|=-W zhO3@X{J)d=%BppavTAWFca8)*(<{9iN9NG|5yUin6kPwutyqw z+qH2vPUCU+x^V-0#jJ5&yLt6(ICAnRGxr3{Qp_U$kNdrz=2Oob3r}E_K}+9j z$F!Hv*1g$F2fvCv$-DmAlggxfJEz0GkTx%;)BcdEKDWPp+Kc_*0iF zr#X+QtHGZ|;>(+`8}HCPFm$YOx?jAd`d%x62Jw-w$vPXL%7+&l? zb?u`*+q1sy@9`af%<6YM{o`>S&p-VG)%^p68i8hp6*O2-%|V3=88&pdaG)78b>38r zc=2GJgNq_v@)!!Fr;sBzZ5oCOWl4jc9)?_4l4MMoGii=2X!BuCojOnT^m*#!NuW1@ z4&8Z_Xiii@L4C~hv}x0p9#_H?c@=Bbla~}GY6vI)BAPR2j#@N(HZ0j;78$}hIQGrj zv~%eSM2b{m+>CY=@{PmyZeWOc|E@877%@eNcm6cybQ2R+QC25^vRu)BIfYT0#f`KfOzh5z2OD53R3 z<2>E!l~|_BjTKh#>ujaa@T*Ke+Ts(5!25z?X+a9F>W@O$fRhiT`kvxw5r>*vZouQh zJFy`1$jga4Hm*|#k1vZwf>tPn~5WaDkCtu9>9HZDKoDiYyZWCP2EaJ(_F z^#1s6VsObeDXsR@QZb_qTO(@~^Hae>)so5EtPM3nPH9?IT_aOg;(B~ER7Yj4K41F+WcgS^5KR{ zD{!Y)G$c1nY7unSAr8NFEzLF2Z297MS@yN7jU?IVu1P$Sgesk@;wooITQ)N{$Y9pF zV59w|HBD4^7MN$BPgYvedCUCx$cbk&x81;yym~WNL93Fq1U(ivOb11-sz6bNLig3F zqt$q_xnHX~=1$#2dgtGwmbzg~yxtANzKM1aXi%F58cwAF54vYKGw~O{-6q$xSfg30 zSZ@U}mvCmTuWjjUq+EHMT&zt!yhN2a&iF}qIiK`$ya~Tn=+bnv++#@j&b`*e?JIKe zq+2(uv8@?7kZh*?Z;h$8!0|gJV^Gh=bnj!bYZe@q~S$3*bt&_pQ{erZrB=9^6=G zx|O}lLIjMB2G?b~2|W*f@Izp$dZ)ksoltn1GU4R@mqPv-?{~&)-t4?(K>Cm{a0?uj zX0*2-Q}qya6Kq@CvL!C3kq=57Gn);611{W|#B~viV#?SQz}@-piXRkQ?Rav<74nXF zJ8=)EkoUjlVW@qVQC#nIh&JsJF+gwhp$~;P#FC|LWy8~!wr~?SXK}`43Vh_?9JechuE-tN;r=rQ_Ftb=>ac}=sP zM_E}`qs4G*J3Sl>o{2XmHUs1DI3#jYZ8q2vMqsu&DGb?90MRxZNa9(Ab}yrdB!e;d zOmChJSyr@!2|h7#jfet+mjN~BG$M75yc%kA+Gs&JMSdrLH;=LxORrfi{W!1p-g|u`T zo!aQ&362G$Z5td6YBRp;{`?^^w~{J-GPRbI_)uehZM316I#dj!Sxhxz4mXXc)BwPe zW&if5K9;xypT{fYy?mw=Oh4WE;9G@HcPlbCOVY2mRSi-aukx5pV;?+Su^t%*APpTUsukGiS=Z#s-~~Y)Jm8IUY_^sC;oKx5?Qwt8uKNqo`LBBiOv$ zr>d%rqdL8}l8}daX$jYKBvrO&yFb*D3oN4%1&7l;P}(rnx1iNt?%nz5P>Kb#6=9Uh z|JwJvuIC$Po~Hh;!tDI*5)hG=9TZuz2WVI8+smQ4!tPVr#R7!?xWcsPr;&OK`qMw$ zuJ0p&{VTruDf&Ix361S^mz%q(Z=JC`P?BmHssW`Pcyo=0w|mell-{kw@cW@G(+ou$ zyYL11;olsK+2#OaT=?4ZDbRohiJC)S6T9rQK_DL@wWS@s@BF=~`#?+cF_%f{mi`OG zO^SmzB45569Hwraa`|IAW1a)_E~r4AgPU}VNn%ZcG^=RmOSX3WXoGd5#OuXU`5&IE-065DEc>e7zoNYB`{u0`h=JH=NtjB+@LBVL|| zeWi}Uy2k(39fQ~clcq+K_$e8Sy_zefYG3XMWLtdy6ELGx!Co07shIe<=3T(0^pvYg zZ}0Dp19gP$jPtXreS6_of{|J+_kpT)bmsIcOFcZlwsa>~-wx96^BEp19Ffi8Im@Qg zeFr=H%@wEX35!VN8&i%M^aDq(+8(A@0~%9LGuQuY|5de|#ZyOy)>7X@T0QQhuk>B* z&0EPzDM*# z#{(5uK6}*X&Fhf2t*%J(O_API!_G7erJnjZy8jC)IC}&_GIy1E+1v!scXt7qt4*=W z`toqT{rV6c{>Z*LEd*CqEEit7)$chL0sNn5k+F#Ey&U9jtK?y0}>qQg61DT}OKWb=SZPH127o;**)Xjp~@qqaBaH&-~l|2C-qumEe& zI~(3P)WAM@8gEywhV-aF5KGu7;~`k?x(h71`%=NxzthvU7Hnp*B>?;&ECC;6zncu; zjg}U9va$MCU!hYwa6WFh72m^c0n)XQ^#u1jq8y!R&fdoNu+nWHR&Aa^e*KOs5Y zfTVo-Ne^zkn7|yfD$EqvBKP+bIbFf_4Zm@|1<4EZ;#Tga&*{2@x8XMODvz@93?a7u zy8?MZ<6P9m3DVQy)u9r)xUp(YnJnbrvRpCQJ_xp!8KM>Tm&K1s$?8uKa^qCPwG!2- zWYi9+O~PE=wJ_>)7N7%VwlAv@5^Vuw;<#4?GV^ho4>d9@Zo}f`G|YDT70<+Jr*ojMKp34w%Qf*JFFfq z8)dF*v6}X#fxK!$LB3~%t;9m{bVAQu8$n-cQO^9hcLC zMR%wlf9{t=o*R$;gTu~88%{98*S^EAWV>gzwUb1Ii$(60oxYx#oOighfLOZ6oeGVy zBY$W&j=63)7@|h$tP@76xsPn(GIP$*Ncdh!0*|&kHnQzCkQ!Q3I6PN<7rn$$SBRNfXkD4YrD+}u zXEj%`9Jrm**N8i^YWg9;Mz3#%iAYZN!0<-Sz6p1|OsR4;;Y0y>(Q2ez{hjgyGuniVt@5_FD3Y*%XI{lDe`y%*C*f=>u6O zUSAr&jmPT&w#~8>46gfjyG1%g)**6 zR7hiZ0`NxZW{hGW@MZ0mF117;3YDAY-^7vq7ou~*ff_w5hOBj}lE54<-%Ywgx+u}iQqTA=&NdkP*c*DJ@PQ@O;iVBZ55{CP zZA(jK=lN%gq_ZwId4qIFK2Dk%Hr+~l=4$zd4Ni-?1{s3J&~KC(|CBT}(P;6`7rpKV z@f!_IfmOP37U6M89aDJ2;;5&OR(&pc;zLz=mi68Yk8dzfLeu91qo=5pc1~qB+OQ=2 z%x2@-b^$67O6Vos@T}v1E@_xcVuAB=;~Lyw2oy{%cM!8xe(Ng5u9A1j@|}w2Vrl(^ zsVPc#G&pUHzIBm7O_DjDD4Ge#LQewfFXqhCwEeDTs_>Ai3oD;+!s?u69_%Zie*+4d zQ-56kQ$e=)o@1v;{M7+XwReBd{G3}e4;`9LqH`-|Mk7qYyfk`YL7DKq=C}@DtfYF z4<6U1ma3zfBsR!>$;+M&p=9&&>OO}d`E&te2v{mf6FEs6r)(eiz`VY%=LIy9d@W(v z+8AWB&YdRpOtsQf!aHGR{3zAbb63C$#v=X8-9FdC&2kO-l8AQn`aPHaUju^g@&XTI zYR8r)8r`hVY_j<>z~NV`=n*QJy$3Bun~vC3&L!%V9fKPMjyp$-VY-SSRk>Q=jK?O! zm4||4?WS<@7m%tqSo_N?O*1)NTU#?C zjmsXx(S&5n#XF{z6y0=o(*!32sO%Lvx;#9$srRqvd!vEyGvk0U#UM;szLrK*Y7?e) z?QlhN(BwhYaTx+{RfYve_<|=;9!-%*C%%)r%_qa&SnJn>mTWz%(%rL|X9vVyGjb#M zP0=57sf@1;S<2RUm^L3;lY z0tc~<9X`DkA;dbfza^78zq-G4b*m+;u45tcXeQ_|Tb0ETg@NellIG5ezn7UXfrar- zPb5L+ip6;x8ADjf%GIAHlj#E1$-_O)rtmG}l8$!UY68vv2EwCg4llv>w_bR)PTmNs*YB=jjs4W(Izs7$70frU@)n_*n7N}1F|MO@qL9awJZti^ zLpn-5y&>reBMp=HucW4ieWs!MH2&gRmKYa#blM1WPXemyu>;Rq4nR%_9f!fj?jhk3 zid%%Prkayia1b^0sXYt=H_Q6jqj(LW`7Vd0$BJq#o@3299i#AX3tgwTtZ%oxhqu9> z*KG~FRj8SYo9v>@*x(bb{K_6688zoD_Rcmp3`?yjv|gGjH0GvG>UvjED5sSOe6;nm z_$s#Mw1#6FW!S&B-5Gt>A;rmq-S_)MT9oR+v6c0EyL(PnCy^oEVi;WxcGK{8@BLIzeX676?KEyHEWj0K-~@N=2(!)9qDX67Y^-(gt(f9s_iQ#AW^D`R z^2!#V$Y(Qbb?hvC;DBeTLG(GznhNU8i1N;I)o1Cm&KytE*ihO00o!Sqg3Cdq7{+-= zb%z**n#Hf*E+o&>6Ftj6$obzl_g(dV!dm z?WQ`F6+xK|>>1dajt~aV>U%R5!SOK`6&XP7ryEaks=q>NC^AogF`==$meJx4e1!k6 zia!xt^@jx>v-WPp$vhT(JQ;;d{(xL!8Aiv%`ab^+Zx#mx*On9lpZMAz3BmZYTi$Zr;}=7IBA ztctPN<$}c`SpYUp_}Ry{W{u_eb{htkXAPRn!NirrQOfBLBE?3GPJ>4Cx0FTvC>-`R z#btF*|Di8~>hVw0@+R)@!fw?}Z_9_CV8no;2u92CSCnsp=FlhHmn5z3HoMI@i1$T>|if6^{eh9dfY*>ZEpe6tb9?LvEIpqRvE}M3(?f<|j4W|89ADl#_Vx`8!$q*l zq~;&?*=s|Iw~GH1u-*I;_DeA~WRC6+b>0`PR5E@EaO10eBh_QomM>5gygZ~8L>5}U z;fRgyXrwcO7GfMc!6En|@?Q{>Ha5YB@T~tS3!#EUMenS~;{4hnWL#A1Q*U=B@V$4A zDu~PUbzcH~Q=aoav0y9_ZLlpDT|MLCr6x(S@cDJ+QMIteSo@g;N6h)}Dq3c$?Ht%B zL3D3Fv%F!prrt#I%Fo3OeJXtO6Ni+eEQjpg8$-U z5#ke5{!jdu;QxXD5;C%JGOrq zt8VJ7ZRxG6Z)|A)AM$TYb6ZP$-~T25_WzTAyZXoe;lG1JlS5#Hqhm8OGm8s)mJ6#1 z3u{jQzmR{MiiX4fPx+T@SP6!VKTpRcMJfi8!FG45*_GrHkFes+n|A0eWq9_8ulNdox06*JbNm=;SA<+d00LrbGlvYg@n8U3qsqJ zX6bq@jdD)hMYFklBOxR=uFD5trPXm1?RHP4(VvC(DFN(4o;vEeGXcn)$bv zp&)1Tda|fCb$lM$#b#UR@T=r3`}uC1_ti$kC5MMuVzzp%mRvjQ%&-9LtW|z`^X8&I znKSmzeWk@*nq5J>&P)5;sH1soNA7C<#mb^QPrKF zHTzXhBmGc|!a5CbUgA^slLtdrt|wzR=JRmf*m;GCr^u>#tE zY0HqmDp?$;&C_a`ux1!sOQGLQBv8h$Hk%W(XAQ(2&27&8xgD#~SJRSnKdTGhO)+E-MOV_WZ(Ph&l}wT}NW5&`lT9_}hRHHN!+@nCEjIFEzMvpq8kmGyp;i_m~S%jMD{ zb^%jHxUWNh>)&l-=2DQZR-xGQXiHE#-_ycCNBG^P)%718}yoKWNkO6dM3IvXv zGE*K*jurm%#GE&U?WX#lHhAI8gMhq z@5@;#64sDsXY;XL@y;VMw>~!q_V^^l{u)QRali@~1uVVw+{cd9@-O zDuQo8Y9(!Ir_f^sIu<^989kI3H&KIm_Ui7w@M?A0K!!B-Xxur$cqg_41-#2GplT$_ zl$$#e?X#pNQA|I373*WEs2iKgFw$KWvLppZrq6KVrF%$dF1oPPBg4Uq z{FhKNhlwFwV%~@_evSr^Iu{?s{ZD@Pf9#F^UuovsqmoRDE6u|7x*00`ni(yg{?(XE zUn{mmOfl$L<8jt%^0u-CMp!MOscJJmT-!o3n9`atl_ewrmp`yY4HeYmm$ms9e{g-=Im$aZR6!2bUhN3x9ZBM2@Cn?*x&|Qqi zP?{Hkkh^4tof}wRpPT0SyYGH0%#CBq8mUfgm>$j9RA^y+X-cO?S~uWxPcKoQY0qL6 zx2a+Dlzud9v+lyBPykD{mh7ba?XW>_A92Z^3J&51Xlx>E={!P=W`zNTjV{(v)<*Ikn5LW_<`oOGB34A-}CNa#G6rTly!p%k4t^4O>^*nxp6Gdz4Znr0AvAO z3&!pN`XZ;UlKz>zB4HY4u%AaSpQ_{{!=c5(ef4UfXoyViir{3W&-~}}tr^n^Bn=;O z>BKYs#^YiYH0##qv4QhQ_j0t?+a$c)sh66E?khHdRrMdQ*zR}Zs5j%4O`%^eCoro2 zYM=9~?`QU@LU)2~4EgE^_Hl_a*K^#R)hyAgM0~9&?uaUPlTJCSmAg?g#!cJf<>TH` znX7B_t|-yMn;0KP`|Kow--<-(UbeN}4QIjLo7P75IkQS9bpZ-pWszSO+G9;GiOM%* z&IMsnBGF?T)&i5h+nt^cFhTQH-bw8NBx7oM5v)M;z)fh3-ZSo7Yagmgzxz(NrFO4a zYs;%L1F^P- z>NGwcW(;S+2ymn=GJ%X6VZ1WJkw=c5r%Wi;9y65^ zNG}$6o3ipCZr%wdMKeRTG?@$Z;3c(CxMdSBT=VA22wOPD?snHQDvzrNcN}Uf$Tpt1 z2|rF~56N_z-(G?9-{wxla1MS|{vaB){*Iusb}|_=ps%Md@vCDbtp}uRlrC&^maJI< zwCYquRO%KNM3k8tE|BiGEkT#R*dZxbI1h(UIHrzrVVZ9iJ6W50D3%%vj;!ZtN?a`s zv;AaXy^hDxi+Ky2SwE}WZYtsk7}AglB1TwT)Onx}gr&EJC^d~cCRE(bOUO)BT=_WF z;uQ0}r(-HDf)^#~h)M9GTOws~{Pvar05@S!Dth_U*Tg~&Xr-zM6M%BtT_o~)if(ONDcz#rHOm~JMR?9QuXbk9@aG)1K zY*V31#@4IbK&}Q9pGvv-D132+x&+UWXt1)tQVWn zAr8i0M0@EW<(qZfof}r2v*m3QfvIr*B;|U+-Kr%j4VQaQ26w6(*Tv&Uk{v>Xo3`@X z6h|lHTt|n_j&yQbZyPTVDXOfPj|%|c=a&}E6DzjW$vuy>vjjyhboqu*>yfrO5Bui0 zZ!zw06f(q+21Vu=4DEBI9O@E zXTm0u3P7Xh3KKqh@72`*=pSJfH#)`g>!bSY7AEr+Gve)`t3Wgk|dd2r%5Q8o6Q zIZd<-G?}sMk5tAZIbN5nsJdQ`bcMuE1ZO20gcGiJQq`DzI`*D5ENc022>jX6{xLme z(^Vc*A7Ku9S<*EcXAtT6-N`dvDxw%n7?L@)y49Ig^||S;Ux4Juiqyp(dt90%%FCcs z{!)9_dPjUT+UPVhfW@AdYzc*6l`eOHoFiN{zsV7TmIY$ZR#EY@l0QUJT6dv1c}3-^ zSrfl_-E*NWLJq35%czA4#$g#_Og&O}vFl_S*iJpEySIKc5ZcBlbcicV3`X~R3EI#F zHe$&)i`O?yjwSzG`hrDk1fA)`Y*e)!%e8-O=C_@9 zd#k75lKT|Nb`?u&HqnV+@M>T%xCr@&Pv9C!_;tK*2$+;5J(XE7+OuX%HOuh>m8pXr zc(A%=3Ro_3*4nB&s$>&CsvdD2;JTU6V&cxH>S}5uBX~3BuI#LFItIRTt?lfL6J%@o z+1i=1(Nt&4f_B`dMr|KHa#Ci+#4q}ER*HwW>TbOAPoa3zdVx#FErc>=B<->3Bj%I7;}w{-YoBWdp)`oG;6{YF0`zc`%k+9 z3NZ>lElFM`a*b-bXwQb6!o`pThgE9RLhOfwLlLkXhQ;T+#sQ)nX~|z7Wx9SB{9nHxT7ZO3{D^o~4CD1V)%(fYlzz%Rab1MsFfI>>g zkvBS`iQlK}P=GPPg=0&u4RJ1JNp6-}tkTJ>)Q(+%m8??KlQYJz;kn-VSwP759k$*Ed>`MKgDn@!n&vZ(F_|r0m$}y9vJn0>G z8}kv{QQP4a^&U=MNKJ*ik+BL5l^#=wgah1h6Rh}SXmOp*e8M6=F*QHKI$`bh&Kt%E z-FH3P074d;(1BJl>#Ou7xL+*sNFzH4lm4|?B#KQ1Qh5t{v1DD@b6g`7{Q07qTlXLj z{kp-c(BhEk#nQc*XU`FCr0RgyQGPoun*cd~L;Eay5B|9}gZRG4+zbFH!Kr%buCpV6 zPXHZxak{rb2Qg%WK5tOLiHIqdF~fR-zq6ZarQ%z0k2Y}Ddt*JtHn$gRMpS;jnQF9f zW-%{j-H}jh;OCH~!rJ*|L@YysL09R?$>KRtKBQy8Y2dzL?rh;`?kz%baG+R>!lsS& z+)C_n6jA}X{{nP`+|zsjmHE<6K5Jyi(v{pcgn`_TGu3DK-!XrN*<`&HBK&LvRv*V4 z|3XiQ5_-CywI&gjZ0PVrG_?W|R%q6aeqLtO*lQx{OrGJXLYxl`%kWTjO(8Q+H|ea{ zp#QuDZ7=|W+4b^9tBwC69SDJ7*%5JsZjao-;cT2vm6A_w3kvYaj_Lo)Zw!Tvyg%_% zIU_N$Bv3!4UtDb53@;*@xEPBm|*)QL&He-lW%s)pWSC zO_;xI3g?i$GgsEOJb0PCl0JmePt_@W72I^0zHr@Ea0!WaQ`Q4#k$kbjY(E=$x$xgb zgc7}j(WxJE&2GY3`M?EJ=*6YeEqg#45G67Uevh-YWH4-i!8fMIAn2DP4~q%Jf5H&$ zk9RC!P!>(Mkfsn2#gK}s_ufjV2#xonMXklms1mHG!YUlzqR{w1phdx;JykBvn;s;F z9&8|>F-#xxgi(nXujz!5v_c+XA7FXDuO4^=U@#JIQ4V1q=7KKKb_+aLUljXX>jsKu zX^RC`Z>s0q1R4SVv406es3d}`vApoPKnEqDM%5UC_ep$HWQ9~O1ZO>fjt_Z(zXP{Yenq>Bicb0y ztpWqf0;f3yHGc~S8+=c(1Z5}!ho%foYw`!l1wyk3^~Vr|IqBkAO{H4HVHBRfsK}<} zjhj;+{J#%Ax$NoQpyMlxKdt{kIDdl`2SY2EJoFacE10|o96&oMKiCh!Xt1J1G=f3i zLGv@bO_Dr#Cp`!*z5j!s$cL^Wzl))ulVPk_TT_kyXc|M$8-41sK*1-2Lp?mi7kx6L zf-+mDgqp2hLvf|uZMc`hjcvcSTiiS+V{z82u5(2IVgp%Q9!x!EMs3MwpQx0-Pa{IvNk^PRW`$a1hSp@6$(6|o$GLROa@Ms*g#u36iCFG~}(=9hZc z{MVdT)D_>e-SeL><``H0p*hf}UdJ$aYf;E$@tX3`9#m;;e2vSlJ2hpC2oAjCB?VL^ zQu-W;k;@*O!<7nsy4=SR5WC2S)UeAK}rIp=Ix#n?UsYJXrK z>WH&Xv)_YDjAei^h{v^slnyUI5r8)d3jVc~S!3;CCF2c;s)@!ImW4z3vO|yVc|SI1 zseG*{VVSM&IeL_P?qIyED2t1!rh8hU{4rnGw~9XS=Q`DWq40SLypBdw(lMTYgSKT* z09HYMkr>hPh6);5;M-)G!Z-z$7F#@(v!M;RMh??Q+j6JhrNY7F!G(_fZ`Uji zbbRxp2rl|uG$O@992&;%CLWeEC9OT2@YjKd#;^(pQUr!1uK1w9e z+u6IGT(uhOLk4xaoE3>nTKZDMyIHHs{um_>(-w>pMnWvE4tlFSxGmp^a`Gzb1$L*- zxdTgfoxrHjP)O+g95H4#bd-e7Ez|+HFg%C}T6HRP>AL;QE%7xDIxEAtk%a*j4{=Hw zZag*|NmguKz6?iZe!5;aKBQ~W+uu9?NZH9Ni^>p1`hp5Jq`bgc{nwIiC?EC?mjn_0sL??qRZRu1I2 zWQ`-HZ$Tp}!&8KTNF~v%$2q?djHHB|%wVb8>Kh_V9T{Xum16njHna8@sIOOgZFd=V zX1S>yGqHIDi&rV-1Q!pF1?g)&J_4*O?SHNCdc$uD83UO7e!o$#`G}8Ug=}H`YFt{- zIa1+qV2tBMVTd&w__s|G&51(uVi=7Wv&=pk7}ynwADv{R+8_j@Z!+3mNE{aP_PH~4 z7!D>5moCH_G-N;Br%Rvfd*Ufjo9(qgNzIW=7uxiMon@h2FN-S<#7H{;(AuQK$%%*I z9h<;X_PbWh#^wL0P%Ml0q&_wkVEJ!vZ|p7@$5tL6&>lr zE@M#-k6<4bsD1P{j&8wtiu&Y{W&I{`Mzdka#rPwXlRi)`326Jfm(UCxY2&gUrt!%0 z6YQ3OE*{7Z2f4e)Lr&wadP@+booQxmY7PxHzwj3!Yspg!*R6H^nheRpehm|7)wBpDJ7$P8i*83b>wZ1*7daX_~1(X=*E z`8~y)3rO9VJC~5%%u_M+GeO~-w^f3P#K@mzD^p>{rG?TEEvPXlL8VCx_1|tvU4_g7 z|BP;UQEZI5Eh!F0!dJmhS@AUF6ZpHAv zKUa!`byX?)p;J4NS+#I_6VY2IbxzrkEon-Q zro?g5aF*`TRB^qHiF(e4Kb#D2oZ+Eg0I0C9Cz1fn^YRZ#^?y=d893~gQnP~RceO(K zl|}tgWMdb2DQez<2FU}uVNnHS;NiRth0AuY+hajdT-v@C2M{Oeq#ds&-VLq>4BX+d z46jS}NjfY%G#i;*7T401Mk0HiwKD6BQ<6!ZPNgvgt7Y}8njjEHk!R$(Co+xBGnHR= z-b|zKz>vP@lyzZV3%k{zx*QJ!9Vu?N1Ws8t!5>Q;M1~0lK8jQVdYqodnG);pi~$9O zsHoAF-!pKaXCWB?6tIUxM?_5+TuAuwadmh{@j9B&IX@54Omx_5*<7$KrkOD^JuSEx zZMAI>CGUQFRCsJNo0~iA-%D%tA4S-yJJ&4`2X_Jqd?9d*9%Bs!OW>HkuV z(od=OD)Q@h(}=uSBZ19n0y^bb4ico_KV~fnOEjWd0~OAzOoaQRR@ zY0u*C)Na5aG!eC%@gln}hk|(Gpst4BM_iCE-fHHWQZKU0 z&JpVP&*TiVH+*O>Y92})tu@GSUV0VE9pZfR&I!Fwc;LIone5Om^l?pV!0lV=QTVlz z;01czS{wm;L`$+pW8`S*9InYB&~f+V^zI$9aj1SyaA2;gr?*$%l>H-@7DP{$HyVsf z__q!qXQ@c~aP*c(ch|UJjiXPpXTlaH>_mCK4m3KT3mkZR6;lXAJ$Si}ZjBT8Sl+m1 z$72)UUb5_ZHbcqBO>QtdBL9#X<_Aok$>*1H-$3taAaxhh3FcNT^X~~+M2oS1A6MY3 z$}UYOA5#wzZhY;Cg&KbtC<{1Z4E6;~6Fy~C3b4T^Z8m81HMF(n zXAu73v!CetsSQgGGeT(fSMU!Ng={_9c*D=4HnA)g_z4Q)@8rB=k5FW3Rv=2xP-b(6 z6xb{0F#R?}#ErBH#k2ptt2`nUZPPt_7%YUW`z&CPW^BKd^qUqv1)(9X#P8M5Q(7VL zva0;%>q$ltN!!ux(Q>}8%-Tx@en;kZrDDyzKVP2Vs+0ywVQ34H4#q)rdW73SzPU{f z&hX!<7i=Jxf}NoWcmY|F;8P~kLo(Y6F+?%k(gdy9R0y||6IVr;E>JS;AF7@z#Nx*c znbry4mM~2ase1rL5)LH{H}V5*gbY(0hHk_HAT9zz5S|MCElZ36f}jQPTG}yQsgeHG z5rS~Q&!DJ!yI=|Yjp#L+g`ZOYjL(A!$Mm}CBZMr)T+XlU>|>B z-&Es^jAbwk`Ey|FLlAGS@uZdIH(iMjBo^*@gpp75Whit5D*q-uNlP~}@zj_?nuyM_ zr1Ga^n8W}r6ldfWAsjn?0X!+w?ubt<78^Q6z-1pnF5g;B=F3Nq8QXvkJ1|9Fl&lKe zWUddtiyXlPheS?bNdV+0SE9Kcs=2~~y)~qR$oKoxRdA+?aeVeYQx_M_7>U`zHJ4-~Agajl7sf!h;6 zw5SU;go31S5imju#TiQ!Gl7yj2-CTg5yuVx#?AsmtEx0d;t>B7m-J;KU`@lYAxsDG z3(gi=c%+2?4%r5Txd>vt4okXA%H);_6LtZ-VkgTki~J~wz(=AbF3}5rmIm&2r+&0C z$MJGp=KHE=e}UxUDP%vlL@98?go{M=mLiP*M1=c<>pWJ89YFkkVt22Fh+C7zHyu^9 zZ+dr^OU@H+vtiBN!7s<4W2TsDs0u3?h0_Lu8N!ULPXe~t#trk$v0aXNXiWZe2cO8p z@I@D@gA>*Km-JerE||_>=9621qHRa01o4K09Kt0~=Oui?C8{FU%AlK36@$h^1PtUA z8U6{UVNNK2S<`Qh#i(&t!GU=fjimeyYkT%h0 zWz2!2%nl_YgfSS3&;^Su9EykofY8DD%=J_g_?52-6>%*qtD-}5EIR#lng0`DEN+{u z3Co`euXy`Jf#C!{`>k+#6~d*G7%n=j^b| zWV4`d+9prhqG`T%PbuVgtRl3|)K&mujMbi!@D#0NQy3l96z-lny(TEm43cna`lCsr z|B0Hm6;7X-Y?fuAB<64E`AOH-O2JsmvEyQ?Yyt`Y;YJ zuzpy#oB+Cyyie^*9k77W<$cAkXg*W{8A_)w-1wJraD|Uxx4=+uM`2j3h;_L^XHako z#0&~$1_O$MfC5{hU#J3j>2T`ikWQX(I3Wu0g4moh)z>-b?_iq?jIkryn4sUcLm)Rn0DOi7`t?PncJDps(y=6tl4J^nsNGdp?Dc+W?erNa zj`fopl5!gec<_<$q;jxoa_(vy@Fm}m<>wMW@Pz;aXL9l+Lc~!cb*e-J!6(>cwK}Uc zg|ApzJptdPPfT&3)(QErAMtQHT{=#Zs_4QHJ&&|8YoUAdAbvckyLbpu6UZ+eO?dsE z$(-gg>`XP+8!x9u>4^^~8`!!p|fsgeq`{3Gi`Iz47Me1z&8 zBf=H|SmI7BF!$gOT*?yTg?Li3s~g;}Om)nOxsP01+=YDhD#=@y4zV*_PdrF-=oV6rgt!-~>y zNl0c8Rq@SqgdH9Ssg78t&0v}+yb(6gJ^tWuwRtvcWP7{$#-Cv1ntVT&67!xKw;lD} z|3-g9FR6j)R5kjjqbfyABZhGfK~U)oLc@m(9GFX@Lf~ZJ15Cn7<2S-X*2YyqPFgwy zeMXr^bsW08FP*g{OwiS41Z+R+S#QRd%S$`R^8&-ebJdBh`%Xv{7`3++={!waz!!)pKUSGP# ziiOsOgWwQ7X84pd|cld0(R(pR+4CJ&+ie7bSE@@i3X%$>D^9-ysVmM+& zZpn+|4%E9fHN@D3{JSptfRX^QOG*I5lUp@4K6+L&vJH%VHFI^dt3s8kg#Ebd;m*ed z%x0sRUlI^@k@DDjIBg6&}RD@AF=a|ibvIdUaiV#RwzES z-J*{gx_P@6hoay6>C|FZ{pt?bS(Is()ww5homw!ni7pk@vZrpFr`B#SXdcvho)q>R z+U~lIQYWe1ajGeQ#gjt!Jf)Zo^(~(;jGa0K|J@ZJI+Gqdn$BUhE)5L9ye~}bF|DLT z?31P4l%~Rtnk?6{My`mCsg`$c>o4Q+A?w5LaezHzm&;N&3RXB~K-+Pexk3+=3idb8 zTF3_unOsWd&YEV={kDywr6-|5rP-kLxf8uE+U&n($t4Unak}TsMBCpIXBx3d4XxN2 z>#|50AV@4yLRi{RQD{Vk``6slLO0FZIF~s;s@7eh@oU}}3aeKR#g}K8a)rzLtu|-! zeHZcBw;-H=hPBqdY&xyk%QFeWC!1+j?!$ zI`=n5n1HLPcfU)wa_Eo3B{TzAA9Q^(eg-Y? z{@6n`JX;=#=_R4%O2#gh zk}2jeYw{ZCHf-nSqys9WuN@tK>Q=tsy1xd(`*hL#q1*7(mU8$JS7uCUbUqC^PvX(D zQ-9CV?kA&P+UugyZF8@Uyzzr@RVR!(3;Ya)j>$4~1{}l&gh3~?x+fh8hcWDu^I7|5zcO(Y#a53qJulwyNA!KnWB4 zk0tSkcu%Kfv2ZB#fi7`kq@gGkQL*HMm5OjloLC=_I5(itmTuLeTt_WJs8EA zYpJSrCV}luYqiqx>MQ|={J%{}$Vmr`zW#1d>7g63O-V0bnwnhDr+l@?;SkXY`ZO^Y zMH^w+XH{W}oP6v1m})_o{JSrYnEx1q*)x9ySQM)5Np0mzMC$60!8)NOhoLh*o8Zai zX_zH}k|kS`qiKjGw`~n|+GJGU8=Gp zxNrfhvX7Qig}@-rILxpD(rsC4t8|Q_kWq{Own?XSv#;;E)WdHKoAQQ@WAGwda}yPk zEp@}pyZ;wA*#*B&7TLfgOk$hn#E>BbXqF|9R^t%@MvIy;(p7R8%De2+4lR^(;3H^q zrW)vQa~|}#SOzMKqn7=Q$asq2sWH7qNWf^?Q=>{Ef0wy^eyLzryU2gXMqwZG9l`cdl|Z3jcw%A`th!ZDA!?e#_J`A&*4;^kT&p=tb*&5k2FHLq zys{d`j|Rg~T%0-^sOCi-=vo_UwHDHfJlXXfYwvLDSL$*vFg}f*H`)t1mHi#wo#vPm z-X1mD8|$WSQ9O^&QhCF_Xz!B@%)f(-ih=k0`CzF1jO-7nFb{j3`zUDpYd@372C`<* z_y&GAd|uimVLc>r*G0Wdn)E>z5-flJ9h%GOq`vAY@A*{~PA!c=I$+a6O<#^kFX9rC z9gx|5cHIE%X+5Y3h{ERKDnX;X)E+EoqV2(oM5s%So7!S!k6nvLuoctII#?mBpo9xH zTR|)hSqdkLnWI-k149kN#k)zOv;JSy-D7j5QMjPtj%~B!WXE>Wv5g(0W81cEcZ?m| z>5gsNMtAJqr_ZUHnlDo`A5PWO%=;r&)w|a7TsQmB1fv8rhkm1@7fcrh;_nLj8aEcF z*_1&M7Y)v2bbD(-lN{*Ghhfln6a#n!v4epz5YxF*yym-DdZk6dQ{KGJWwZ>IL^~{j zoh3v;s3=azms~aPAT&R+48$*-q!cEyDjKh8S&&?!F&Yp`e(1Ys!Doc#cx<6^WBNQqb`}2?sAAq< z{mh~FMkpnaeRCZXIeSREB^j2WP=ZCxSPnIM)D&3$IdYULzg+??H#oWY2JL`(0uB5P zi5+NJJ&2*>l!7)Q9 zOc_-4mKg;WB2#*{btU$AXYf?^FL)I&*^;R8QHi|%WO0XTihNV?q~6SO#utSJ>otJ3 zJ4Rc61QQML$ZEm6s--d8tmb;`FsrGu5N0ELA8TbWT+AEGwN_!*T)It7(;CGPdwh0V z+lH5Hi7sS*Ttros9+K8PJqIy6T+}HS{VQ<=qCo>>Yz|CRE()fgiUh`G&^_gLl0$s} ziE-=QBc|=LdBX}dqYH9(xdk)O@$mh|mi)b^zz%}db76}0+Y635v|8m6!Kr*Cc@t7` z8h?5YynnIHU{dcQ6GoHLO&4_Ts4*Ath}??)mkqii{z4mlp5mT}2ryvYvD?lk85c@> zb@4S_w&gs-HTsDp>AsnZSh#(nM>@^nTqyXSi7`MC$`r7FuwLang+>BN^yCoznM)YwQLD(z7 znV-z{zKbV^Kf=Y<&dwHFI8J1t6GPu^g~3hJQs&}lUw|350osxH5PvYsX{H9%Yc^tl zNJPm_t;)skmqy4pBD4ynx?ofx=t=QG7yD?XDs((Gc=n^|7IlSM4>R8EaSEtPT~r?1jhUDGs2+a;2YSt#FXk-6^)nlS zd~P*hYp;nnJIr=)IOBW4`Gq)9aIEW(Y{ZNCumBm+!fz{LU4d8Ppp0L+InbPQHWM-c z)1bVZg)Q~U6bNaQd4t7J2<}{$mCJoS&5}1veZuP@K?zyrG^8>*+L(cnbcp>{Avd@o z_DK!3w9Gc_ldO=cJ19t85By`3ga9fE+9qWs&Q(0Iaz$p38I^3}ZSJC2tM4@mMb%m% zzgbDyVs)1&qI0}3?ZKwT5I<_Co+)l%l=gbBDxZqbnAEFZsB}pEh`ftN5O@EkT+~fu zswjkQ4YMW8WoMtEd7zo&)Ma-gLYG;ROQY&rb4B-GjvXnAza|BFW93l^xVM}~DdPTg z(L0U-%JnR7tA1R8g~p_qy}xJ>DaHue*;3~^W@A$A{K;UT6GdpR4HsS8esjL%w6fr+ z&G_y8D5{nexJC{_xnci0L0q24oP;JPWc@TRr2}DoYB|(+1cN>TxbFq^&5bB<$ln!4 z*1Wo8s&mEB8?wdrh4H<0<8oP_rymo*(kvk=zfPvY--rTbL*Iq<=3Vn2MqHzme{EiT zN-u4TbaF-Xpg`f{L*veU=`17)W1VQA3ipGL3%W%uC&<2W#*$cq-!wDG($LxE3NK;R zpU~ePRD{Oz5=HaFoeRQMaoaV>!>|gIf?*~=^~)<(l!SlT-p!ZNFN^wkTz>VBJ@8(d z@Yc9+ifthVe`l2>#Z)W!sDh8#iWw5xNa4byc+3NTM}hqw2{D4w+p@`83V|OaN}orL z%Q%6HDWgZW{1=dhrm@%TCdRlHLSG7ltuKc6D>V%UbvQ2_4m${84TW!cE?6ejCrX4^ zmyG7xcy(Uh=wWuge|19tfVxf1-W-R>p?I}61}&nvetKbBD4~g9$CcV}0Y8_806h}0 znJ1)0J5^lEDf?8lTEMsIT)4{HtA^LM76QM9h`2`~3R41*U}ZI?<-;Yyl`Mo07BSu` zMkWqHowOmeTQ-Z{RC{rj9-smyj?0dbmDxSQH`}AwLCE`VPPDTpKJ7l2^DsVCl-9oezSd zAnP(WgG@je|G<;)7a<$#hZdv6^I8nMg;n=Yp!B9(RY2olGh!XV(-9d%0u90M&8}#M zJ@lF)nS4i9k_xml5dh|+fxwxghz_sI!(?Q@fe?A>GMngX(7o=CIsJCB~Fk~ z6DS+uA$o-NR^yIWufhD@Y_>d&Cy)|c4Ax)T}= z*vF%6BX_N#rBKD~#K;^SHx~4WQt>Ds6-iT!hzCef+fo!PQtjKYlYbK{nkf5ftZ2?0 zjqlKfas7C5m1HiZ6rFB$kwm5uEXV!}e(HN+n!56^ zy4-kb)u(y*)P5`~PDg)MKsw1=!&3O3p7DxS%Q}hrQ%c}p&EPI2>DD|tD!@?@IE;bw zd>S zV8$LFqSP;RV*cyJy_X=w-lE$f+>UUfGPaTBFj}dpAS1g%v~i?lgdOW0O|d7_sNm#( z1_)h}L@MD?nZ*UY9es!k#s?o=C4HC_Azb)d7M4|xoL~sHF`e#60j$iLTR;NwhhEe~ zCWKl4zZSP=*^%b~DzRFOCp%4X&bVbM3TU2g4&$P6PvI5+l&+CFJ$UaqU!)%)o}?Cj zAEPoz4lkwrAYZbeA^@Yj3o_LOl#2VkvfNg})mliMsY1qnm z??;~KG0?;I{NwNqV4Yxf@r7W#!voaiq1dBHH#Jf-HDlL(Lo@XkHJz}8z}_x{I@?wF z$34V#rHIaL%gWvmuY{HB?P!f^_ z8J^4;IuVUY2o*VF(f}ykgC}++<#vpTC;EDVHEzlw{u{h``(BuZ7&(S-q`_MPwe#v8p1j zn?-f#r?_^1vfg;LPgSgMR3lPp%#z7Yy!RnIXdnVupLLYwgAwhG3GGt1&zf$)i*eo#Rk97XvJ@KxObNHT zRZOOyBEj3%qDyQwU@HPp);a zUvA~b&uEmyRs()l38D~L$yj517|}*)BYAuCqwM@xp2=wBMzS1*>L1(Uf@EAw@GH7p ze?_^6a1`-}opG{k{w-EQW3oea*&8eXyj)&f{k8z6VOpSI{COSRfSX}PQ%~9-Z*quX zCW~Jf#HVI)#npdJ@C8KC=+_&AUn64nrAgG(SfqVtMN$ION%yJ>0_EWcvH~uo!?2`n z99CKjfj$SfdZAe!vQzNah-iAk(qLL;Wm&yyQgrL&fuZ1ygVDBK{CJo1rwG{^mJaTH zp~XfOg}4`M8jP1AbdDfpJNO=a&Rpo)=#4vNMp5wfrL;+OsPUuBZlmNoHCJS7<$-M= z*~3={OVcCuKsrgB?fMG%80?<@MT~zM3TYrC=(Wu$x|2<0qWPU0M76bC@%OO3r=j#l z#)i}#-#%3X|Kue&PrjCO_agV(q!yw1gQyI+pUr?vahGPVJJP%wc_rDkj)A=5blQt4z-?OPQpA=nGZv z2%7j~+{{BbjRQC>b2lSEp8Za02K7W1#Z{4SZbqp!-)_`gz!k=`_Y)@cp%oTFt5R;J zdNHC|DX$p>S;1WWoITm|_uNV1ew;xfvL>7y=@AeF<=ckJl=p9v%7jX66d4N{q|_|# ze~O-Y_qE1;$zgi6#SA`@$h6LpouEX6<-5a!6NcPZ_mlRG@c&DXuJ^KOylmCl>S_SUf5QWnuw)%u3!+nU@GrXEM93%7A3Ny^YqszT!J1kVzIRDFA z-7O1vUWWW+RUN(QY8I$!Zc-`%^Gh$s;j9?#4Waejt1PRPS68?9MVI+ns&^`sYmZ=9 zsy+UwC(OKY_v>2~Gz9oZVBz6{d`EaN2Qf;Zx;qp|aF*Eg%xR$5;3u|752upp%ZQoF z{3?vR`FZe6N}4-qd0pxq8CrZpGn*pEeer|sfmV$jd3sZjz22KO%U&;?9X?ew0`qwO zU27~(6SV{iilc*ybN5}-h=qZI{Zpug`dETe|MmyWPiAvJQmdWqanCCqwI^*m38iD- zK>`f464SGvp@Z+Pmx7fOE{UQDGo=1o!u~fie0!TWUED&8i9(@w&^ZFV%PhSnTtYdq z<~{_%pFo6eUbENy5B^B-oAk0;*G~%L-GvLQSB9Pt6C|#kP+LQ)ToZ<1yaHbuxS}5%pdt0=*d|hPFKM zr@NUSc|5Bs`rP(^hwcbp-}miVN*@0d-W?72`Ge@XuP-bo@O9DgXwm-mw~4+?UfP5O zRv*n&K65A35Nq(DNH7K6pCyqnI6O>7E0wf?NJNCbrZq%UDJ>$dCKE|#GWsM;@q{!l z#N)BB0zp2z@su*z2zKj;A-8k2>EKik;GGWUcctKD3c!bJB-)RElyE+V7p#p&1%FjY zn(nd!5Tu?7+ShFbpR3m!W`>lFEnThG*sjz2-AgfTGMgSR7}z$Ut7aO1d%PCls1?l( zrB%|0pC=#AAj5;=dX=kS7$N%F&QFKQNccz0N?|#?KKIEX z)%SZJI!nfANABTh%(+(U&#M=wgSmBOi?6j_FB40p-*!*G`C^o$5UEt~B2qcEpD2K! zM3dH3tm5E*m^Oe)=)~kuks`-c(9^FdYg=b&22q7Cub`N?=P(D*T0iJQ7{5L7BFZ*p zOXwaq{gGHt29J_*T~2XCDJ|CZuZd|S%S4D^BZ{2Es)4F_OY<=6C@^X$s~C$oZ4-s) zmoTSThgF?_%Oz@`OX?c2c8`lR z40g@qvRf@&vny`HuCq6O)avG# zrq@T+;JGn5eU{$q9q}<;%2T370~4m{v{Gk)T-YJU?9szvOjV2)F!`3_)$HL!Kl?c2 zQ2^1SBNe|t4mW~V)yi@uPB#{f+vS(jS3`s?obys02_Zci zg3>R`lIz-eC&z?Wt39N?J&pCks(Mb54!Wl$kNF9_!k4{U9RrY=$WXnw)*RFW<^Q;!yb>MSXqx zVCxHNc3)ctO3ORrdIC>^k3aJ_w^jqUOU<^Sp95}g)5>2z=L6?CX4%o8PJC5=S-J@Y z+=+j?QQk?}Y(FsrQ;7Kt&uDom#{x2CuLyd(Kbi2HL~Ce9-mK!(I1gZ~#o!4;)t=SufPNh9*hcTjK7C{9JnDuc5r@QJ znvK;(Lupxmm5ckY;DP<1|$-i5lpKa!ZQM9frzWsPPdjZk|~DgUjSWRGbwf_JsOY@GE)d4qXk>C z1V^NNJu(&;Y`?|LsI_cZf;Cd5pyafb5Zo&96{}-WuaPB#H3SM?n(UK%1MB8Y#(i3cxD8b&Vb0NcroVTOl=3HBy4sA2J$gI$*Jyp(-+tE`= z(PR&-S#q6yRcZrx)F4U#oztIHM|~Fiev%ZCdg3q^T01*CNL1^NgZX%;b=xcE^ow_H z5Jy#Gp1g9mDpaLq2GVdRt2!0W{V`TW;~QHB;*%Yr`L3LG#bP$q|a@G-3x?ngOqb78m> z5CR}#lYUfj=9tXrcKrE*H)gV8m2PUi`V=u00jQU67;&7wY%1u9=aR z>7~5awOx8e{Cv1t>Q#4RL3Z;3UAJCOxh|F8LW?DtU|)M=mhyq&NeAbFyCyBmn}51T z4TBAdJ=2cGw|wFe6F7yage6sLBOQA?sD$2W6XMwQmAQ%pp8_m69@W|tXY>;O?Tf{3 zJAndsy2#cc?00rrVpWaI%q?Z{=4Kprk45&5LVJhqAn|Qx)lKd4 z9aOIats5ge->hceb}MaH3G-3I$8$+Ho+1?DjlW6_#nab@Wj~`iif9%up_w^q7DlspI~MBTNyD=Q?rhK`eF9lncHE1P4Qffr5QN({RX*VA@-)J zHX$IY9-T#H40WT0p?k~p?TNuW>}vm_esjQ~9$YHl+mNs>sKRB@kUV75bW;Wa<)}9@ z@t$IP&RupkhtPT>J@P@jMxoFNDdW&KcBW?9?FQ1prv5kH+&ne)TAB1a3+-9SZsd=3 zL)u6Zg#r@Rta}gQpR}c|Nn+}zu z4vz2;^;;nM*&c-_v8nG44b}RID>6}Vq4MLTfOm?C>*9tP{Q55?NwF`r4oNnPV#!xW zbs9GC`!nK*?y^E1C-F+GFwzM%O8GumFtXb(4CiHZOsLj& z`(#xJa50;97}t;G*l`;gjAtOF^@(}a@-^4^ird$I_FSS z4p3X0y?c;0E2jP-0re_z2j|QXUd-Y?=2YtCgg0x^G1X8-s)n3RL$Ph?9CKH6k~~Ff zvp{cTD#ng-0bW0jqj!hVY zBNk6OYwZgrebH|;k{E<`qbFdu4OuyeP^xVl zQNXCYzIAQ-4t+lGESt6>XpYQq!$Dh8m#`c{>lQ^}MKe1ZzGGWmN$s!qk^BeQ&Y@@ z98RNs3aGglM5BqhA1;3;5?^Or`2BwqBQz3z%D)fYWyN9P^)swXAk2qMJ*PDKDqxLR zK|>=f61v7vPb+z1-ru>n-IR_app{=+VUqRF4FQ?uh?K6aF2~T>pdQa-{Z#*Ox?n2) z!B^Dy!eB)vZ-ZlxeE{n|NgT&AEHnMrd2>$#-TOwah|SR}Qhgn>@QaGjy*dvZlW4O1 zP#-n?^9*t7g5)#%NDg&_3!1`jH4z@m^*2VA<}?Mgd&#FpZt1!3j9D2BbtyVDJRCW& z2-l>H>}(sz=SAbr!G0DDikcT3BW^qtNOzFao5{>`>0(an&Ptc69-wE^q~}pE{@q`r8d^0 zDN2(%AWA%2v%c7)7yc5?RD?pD!@k`_ zibXd?nJ}{zI@aU062(FOoM*ar5+C=`ZRPlmL%p8^Pm6o8O|ERN2}po;N6f=Tprs?e z2+zS~7hYjp9PPn#tp!-t@AZ`8#dT+k51-L`VrTOLL_qhq4%)D5lq9-QPIrfCVOTc$ zEV6|mxFLZ7$j*VIk24@HA`kgdX6$IRAUQSrAzpaRBB#Ia^*aQke|ikE-~mrxW{ zVngK5$F&&k*P0a=o(6K3>qrC-tCN}_2xo`)YiF!;fbDAR&$TUluK&nml^M9*h651V`T!iy(yj#+%675w%_5lsvp>jQnATl&=} zxA$k}*gwI}&r1gm7W;S>wCJ$IOpv#{nnGR&Wc3!j^&|*qA+d`(sY`8C6LJP?T@y>b zkDBZTvGloWk@&Adfp^t~ZSeI^F^$JhcX6r738@fB$WX80wH@(+<)IgLt8H0{r@$JC zMqjYrYkF|1U*}5pdR$yMoaUq^?hj`lA#cmZ`4BunR(rII9&;G=ldt)T|6rPB1!gi< zM~>=!PItEUu%|*dhCz5{zAXW)(W=E9?E$J*D)k?)Q7&*oS?2lt<(Eao+J|X59o5W+ z0{07h-_^>64m~z!GQC@|Z_9}&s&1CCXT_crnd_f9PC%ZTSQ)Q8yqsJnXTINPmcs-9 z%RlZ+)WPa5U!~a$n1BkYFKXdF==YBtJcj~I-VeMDMXT%x(yIy62;cV;15*jKYP0eW z@vFgjjXv4D??4(8jt%0AT8At&fYx)?AJp+b>O>kU$s5xbY!4S0sFyA=C`%SU74*PR z3?8O%KPm|WaFHm$otwxF;Do1Ut zFx6>fw{;|n9(CbNi!^94+pDSA&LK=|f#=hl0o)q});XT;G^%VV)QlW78dQ-Ds!(ZB zIz$1{4^;V>jHB`;);=xPh?tT&~WopLv1isQ5QMnn+-ye7#h`QXbxTig7y;qmk z5+Y?aGzNWJYHAa~$r;N6`lhy7Wtz!Ik71|vdA&}2`xY7bE&8D{pH#fSdKTC2Trh5B zMCoQmH+Jg)&l2wY%LFe-8KE^*5$hc;Ggtn-;6YVUEyg~JGV;0nT)U9gy%F3qohmRZ z*F$u|EbWrmN+3z-0(CPS=sMK8x$B@hg7;Pmvo!S0d;DqM$MOl;x4g3Q$(7(e!+=&- z-Yvi>E#m7teWGHj%I#FrW4k79JWkBGXcNtE0-a<21KbqyS@kp)Lay+5Ed-{&W;%yz z_hX&IzijcS{og9iN3=$}*#TV%Rk9AQnc~~dlf$?bxmyzXNYlA#Fu&I(o7Y8jEL*bp#v5VH~v=W~uLcn)Q3kS`v#oePG|DtvM*Ml%iQ)by!r@z0sU$o29Ch^qoB< z(1eP#s>up_P%XX2@d!rOq+L|2suycEqTc(({l_P|dp&i-+1f@;vzEa++ef&ZD;W8; zK3*xu-X0UV51>bR*ZS8=pEX4sY)tPOCjWwI18Vzj%7C=GHN4}At;o-^?(_-GBqmmdz1N8{z0;P|1V(O+W&%eYwG{mx^*r86V`2P z?QL#s`5&roUt8DzPSstW=3QRiSpCAVy0(3A&~bDze@>}#adCZdsrB@p{QCCs{%QUB z_wSegKR-afJd36BAzKgP{;q6wDSGRTC*WSaMW1cy=nu zI4nTAMki*Oq&%x>T@Sts=2R-XJ&?G{*;4smAi^OH+l@*!pUa+}ItROIzJxFKNiZj^ zV!TK$ytt+#?P4JZzZ3Ra4wqgd-Uz2)nLdqXvyFatB7YONX0x1>uly=Yl}WdT0?Ux_ zqxrks03Mu?i?H)WG8H@rE0C!+@0UwrmbbSICbdlAujvUvZC@^ z>WE&~llC|}%V^o<9sO^Ro$4|t^+&sN4spea;#OAO!D@A_Fd8ZW-Q-9L!Otm_XP@hQ z9&2&%D8UN-Y~2wV;DyUG@t+U9T2r+STvf5EW!mI5|z}A>vG@$u2hA$NQ1tl4&~;G{R>D zMlsV=C$X4>nnzX<$1R7R!t9R};o=C^NxpV|-6^_r&Jl=da0? z$0ItPV+NLZ$#5>O==5m`5&&lv{){3Ib$6RGV_h2fB8$!C$_=-|i1z#v{J#KW+r)e@ zfko_zY!1DAPF-eB9nZxXeN9+fv_&zNaNA{^QG9Dv?r!wT*YMIhtz!^#jOUTOy@A|T zTb2dr)Cn1Aah6t^fHwV9*ov*|=&!tUR*;a{ z&4|+t&A-mjuAc0m??GEe!^T?tnxzx^OAZP$JMU-E6jCJ7|{`x>>6Sbuj|{h3PC3i+#krfe)JylikCysV+?Vnm0brf|Q8ru0HtiJ8Z!$40d1CHW z<38Q`QH*93cm1V=YM;fp1;w*J)$f4r!lvF_3bj*~?Wcn#hIsDZp{rn_7?|FJS_VV| zAO7|zal>>stZe3E2K_W!r63?SagV~R_MGT!Zju`xwN8@X#wEc^fH{*cU$tAuCfYmX zC__Q-smhse{ucxnB%Ky9`;|j2XXCa3fcZhh8W9O3QY$gM2|@^GH!=#?b(nrC++4H6 z#OQJYQp|6-+=GlNYtU}whaw7_za7T+%N4DB0_R&t1x^Jly~lx&7N>BrK??Ud_?82} zmATf$R0(rrRy#F@o+E?-y6G74Wj3qMR`b`Mpv+M+e)NRv%jK6h$&MDz#^f&5qrJcQ zHMFPZl|3JSQ;tQXOu3tjz4k9u0 zXVBsm6~{BN%M`k~Lt6DFoxhnr?pK)FPKtoq7DfN+Y|rC0D10hk)vh_`UluP_X5GK*Vq z@mZ>Xw$uz2>`E2G;KA4lZ1QPSI>!Q@X?1^#NS%ePfu|^GN!9xx83~FC{?2+U|8Xf` zS|$L&LORLhPf6=XhQKghHL7lfqqom-L>iZBHan=C7rXMF)uZDNhFg*YIRa#@wT4FT zyppQDl?2*-_mSXe?mUJ8th>j*MQ+T@*$d)Pd|8uCqEarJWFId zBAo)it<>rR%jhNzhjlR6toyhB4PuSy^c4%W=`<^5$|LY>1a7&|Nj5`! zSD9&C(HofjPstT0ZMY|1$`Q?OSGe<8(+D`(Zfjek5ui;rZ!sq9CRz$qC+T^yURx>3 zmt)O^wk`!DhiyY@0-tft&IiN z)S47Me~&!HMGv z??#-5!ehu(|G04Qv7Y~Fu(S(bPt!Z*yRa=V57-x$6+5stz=PzEKoT%Y1q!$M!tw|0 zo4L2b^51G%6b$Bn>N^nWo*->6ZW&zNN7!_0B0UL>1lrTG^N^@H?+WJqq|^Skfj?D7 z+5S7u@ro0Y?>}73piFB}0~K-UsDzEN#2!Vf6qs zFvO<8M)Ona&GG^3GNs7CfI~dqzYw+l)dBK_Ly@;a;zx8xse>1)Jc%2G+ryB5(zW8L7XJsYV-f5uZJ9(J5GH7oO3(?l2 z8IJZ`2$3n%r7Lr@UefzGj@3E!S2l6|yyul8#1duMhh^{$L$G%xn;415 zt7An7{xe{Pb!eLn7U%#!aH65sbP>iJuDyKz&EDjVGRL@Uax}V`!Z4O;(BqAVuc`W* zo<&==VT|5K^shys)B5^@PfQ@a6-`f*j3R@v&!o)RlYfqK2S1wgodEKHro?nUm*vTT z3hBFW9(#B1%nXNBJbB|5ElBQwg_m!?c>x@0@eyLMWZ!#YK%;qWm6;f1IT3=e-*?8ll z$AU`3ld$ph>n&r`qZO5LqVJ@c7_5EXpL0qdG7GHY3|vxX;j|NJ+ycdnWIB`{aj6yu zJyoq!mdCkBVZxulrSU%?z4o=eco9tP&w|L+ec??K#KMdyM}mOtUXqo*!bdsxgRZ+e z#zE^spYSH0t}Z{u@+N5cAV4hF73n^WHj@9&0SJvu>rnXtFS~GcsnK}U&Hxw~Eg#A} zH)_+IW03{P&_x>iWiQ%IN=d4Tl%Xg|(SLC=9q&v!^GF>aV~(Z_UttMe$<}^J6^+#q zAmeXyP!~XO?M!f)j(y@Vp1ae@CERN`GMTF@Od!(br7D~mKS18YFXt>5M>8=*hMyZ& zCQMda@0?>DA&5vba;Qd&Z_`VE?a4$U^vvkb3AGAJT)T|*ojvb zkCQ2^TP_aP4xe}_{+g{8o0C|pBl|#WXwp?)F-90n=;Nvru%%Pt*(HTUfVsv?yowJv zBalnc4)vioh(FQNL&)@RNy^Tykkzhq#4*I+109mNxSIa^V9~KZ&=Jo z`wv=@3q46wUKEeN3iyE#rENgzDYcxQMzR~BR_E;f2%+Qjy5GliSuItuS`?=qN<<`1IYP}%Tf2)$_SkGGTsBP6MQbtt# z0qyOjRi6To;9S>$cuGGd^!5{TFTalhg_I|Bh2O5qz0hZ=Ab2Kf19+t&3XM5La@ z5X-gFjk3lar5kRT(|0z0tc9<-m=>KTQav=Drh7bt+tXoZm*QTi6i{}2yjMlY^o z{#P^MM|AzZe7+GqdOI0H?-yjy**EOy&ZC^vSzSAOL{<9IgcQB*B_5af;}$apr>>ly zn$2e9%_vFG&v46V=}lTR)1pwgx)@nLLCg5kMG!9BAfgvi5EK~I} zm`5Mp6V>=89#O-iQs&O%>nFZx6g~p)uixk7r?Jz*@q>rt$CcL4;~vkK*li-ZGKO9j zT5GMXVffDYs0*%JxfUjF*N4sFWE-ydP!dou>ianvOY#Z4wny7lFs^38h7&Q z=}f)El&Ru=;(-vG>58tlro5;YyC0DG(Iqy;s~rVvv}62cVr69`pef?SDnMEd7y3!j zb7kh$o5#dCBTz4w;ms&E&(xhh7aL&)ucWOG)QnbDyT3VLl4{j6J|_a!8-$7uWkR%| z{wT@ARH4qKGl<}$xn=Aj z6zPyR7g!UlfXsv!NB0Y8rs|r=K>b}YK8T7qx3)U&RxgS*Z-EbdN&LjnpCuL{H!)Xm zxzQl>jn|;iW4%Q%ZLn))qhU(_8fJPAe}nDV`UN{?sJieOH*#8IHp9ZHS$hGgx2^i3 zmWg-=*ppx-zt(orzvVv@hrF7f>V3l7gb9|t=g>#m; zs;Dp>JBqEJNvK?v zE2)GOzdCKo<=fjXzqdm?C+fRV6gGpTy*O&xy}xld$<#5v9SCL6#_@N?>aR1s*DChM zDBXtPrNZ93RiW`w*M9TTU&UBz*#+DDb#vb}^n}2EZ_p30JPDreCR)JZs#(~A)Y#ef zW~JTUT~)bqb|`=qv!Ib zdV+AXO&2x7Mreh@_orTbX^Vd-PDG#Gb|Ym}$CQF*oh<`=MekO?73J;V;2sQ&PYy!K)%~dV6T;C|{P(#+Hz;rq+*8Be z3e4+qmX`!9w#>i%;+`l4(@5e>(RS^HdgJ_Jci~`TpkD5OEqU701k~7#Kmv|<9Ag$4 zQ$I__!VQKtvlgNWesGSO-v|dDj{H7a9-;6`?H%!hD;NH->i-rQ9{ASUkLYe=*igq@ zp0KT{PNEOSi#60p*g*wUr19fkz&c$sUB%=&urHbmR=R; z?u^vudx)P5pCovp06kalT&sQDwFm;z8;23Ws9{~(>k(Sq$?kQgyTz+NJjj(;=KV)X zvcm>^?tnWhY&2nf2s+MJnTrindRRRO3gRTFiKb#cy@tAzm(Ef<`pN>zH1g!y4A3py=E)lY6wE7uF5j@=XK zx;z()U1*UGc57<3yJ;%RcX4M6jx=?~smvB}i#2mYR0bh6(Gx|-<5_T6_8%!%Ysn1a zD7ZrW4@YN+9l5k6T%w?YEk3N#W z&mJdXuF4{VH%${iJJM3azQHuU&2a6;g(9(cB$PDtpPx<66c-lwDwNNNl_H3~bx=&u zzRC?Ev3!`B-eTdK+FkUOhS}7&Uo1g2NMMTUJ1~E>bW;)n@4TUjA;*U$@E-Ra#EZk( zry=!k7jL4;wfTkBOEXIjDstS#JUEDCIUpkoeRe=y4{o4evNEiEOr-ELj~2&+CZud8 zyWnC!RK=*sp;6`_-xt;T*9xb=f8+)41u>?@kz$o=_{TZMd#2DA?5Lj?;#j2c>vLP! zdDtjY6qc3l;icu)r?9)^WIt7Bg>*u>=A~9C>gHNfrY7q+u^5rGL~;lJbdy5$NXYc* zQsaJ8S&mCzPXsQyjVp&iH&!U`r$*Jj!rOYxy*21v$!9-ct`_q?UpDoB2uivy(}G)= zDooM|Q9F?EhM0_M^j+1I++6K31yv1}8s;1;>@P~wrZ@l!itY>6^;(jTz~P?-49k)j zNcSz0dPqI)s=4$q=xc5yr0a%35GU#5hPCPJCot=+uG6{MInxGa=STBP-W$*FJaDl(RC2Jaormpc5<2k=e-=C*Oy=m&(pt2=S{@3#JO^n*M-_{;XhB{|mk``+x7r3>5D#*BoT!B8JxedZ& zvk{$q-{WieECUA*)@McLm9i%|Qjf>Ry^Q>}_iqn|T7FBro9Q|yH05_~xjgo5Ty=3s zuPrYsQYDEVCG_w}r>_I^C37e>79N*A-Mvc@`2_W(B5p|+t)#!g`t{xtO8w~lgOTC! z!JkjhHKhBs;&G{f$!O=#RsW6Iq9?|fmV-|21&D|L+P^k%xMZvW6DI3G^*u4sGZFD{0=d3w7w2gRs7Y)j1<%;`7=QA9{^84 zu)nZ4p^=iEN}iT7HlkDiVzOzDab_U{=R~DZGhQ9qCYw+*Hu|k^cz$f4A>7HRMIx_c zJd$S|`Bgw@E)#KF{NwKMX{^+sN{ZVFU^YXgFpbq}c8LN>?G6e>P-(7AkIZ6*%49WO z?lLvw8dnT+L`RGXgbto0sYv#4MjEa0p0RT0Arj|OIxqsJ+F9v^z^Kq4elvXP3Yj89 zQ^HZ@sWrVzngX{(!YUe3eEi$wVcayNb3uxrWD4g_mxYp;wsa3$&BGzM>eZ5NPpkSe zOG`nAyg@8crcp6OJ=+zCIs9uvA~oqu`3XBA;^d4A^-ype6VxO5E}{ozDBzNsvQTjh zg;iP>QpU-(W+@8)Te^n=k z2YcpKpN(4`1w};0Cn8Z*hJ}t~OryBig;bzZC7T4JmX)dYkYXR4q}Ld70_Z|_wVrfs z?)os0DsXnX+8u}%!n0L@c-O655^q-5Slrzate3yDEjQ=HDr+52x5Na@Z#UL5ZF-cr z!GV=B-8CJZnNz)tjNt*VPIQKp>DY zbV9@kQ9y}3$p#GDU=UvzLTpYe2q%P90|yq?wiLBasNu3k?(J!Nl}OFrf$wf5vF!Q! z_MX)(R++N@i=hx#bfsCs5U8JI8jTN91`IbC#Id@99op~(2n%EgG2SwSVNiuC^Z^hY zj)@Mk41zHeqz_~k2n{$ZVm36P2E)j(m|bRvA>4q^*hSC-WZZy3i?U-q?harT7SY-a z(@WUA=>u1IqR1k2xj=oY<0cEjbL!@A1ocpw;v#k9* z3@gBT3qari13L1A9vryDByd6#jIHYyOk@pZ<}(JC0PJavq0WiEHDs8e=dii}1lv|6 zW*NO->GU$lMT6kH;)g`OLX>1f&6^8}bk+WjT8A3_8zY?>rBh|`%Hh=l9f)9Pge>9@ z$aeAz+jbinfq5NsSgBkw)BECGA37Km{4RWp2AF~~qj zwh#fRCtM(UX!RL75{H4fx!J@9^DtaJjD=%325ML~v#09-v*S883J6acm<@1-K%vFx zR5`uiwDKaZk7+%NWpgRCsnMuAlw{izzu>L&TMEWNKAMsP;dg1Rz+LUb_n(gDq%DqO;-&Zr1P-P zI)f8H0Nl)-^9<&V)`bAJVqpb;rpaBU;K>sHoDHhv;+N-}|a03sR zJ^vdy-rG3J6ABTiB*wx!kufOta<6K_C{k%Y7?K$O$}ceb90M7kd@H;*8o?U_8xLBW zj;K5m`vCO|vyUUcW;=+kgD@5lv)*%pUK=(JK!~z~FxFE80<1ILD?LIRhE1q}4Cp_X zdA1_By%%(dUTZ%CbhsXbj5dfSax#}Yv8a}NyzlcUReBvknz`J9w5kf6(rT^$Ly$7C zx~t?+K|!&hONv7ZYqlsrx*Z4s+{3Oam;w94jj#&|8IVETP=FKo0na->KpeJV1HvV6 z!eOwp=juO9q{K=Yvm3;NIRF6zNJ3dN00S5Sq2RajTjl9pDH*u+z2yus>s@wm*c73-|zNWI&OS#*i>QYa{_` zG{z$wL?o<4Gh;eTtg!wwy>R3*hWNyg`@?6fMk~WX7AOJ#u!Az{oJoSY%y_8d)2j;n zxxG6k#Gx7jBZ#jW$hOFXj?k)P`7Af=s)1}shIAFL@$EWXh-nuXA+Bsx-(6>nvcJG1PO2DF^|v zY{rdbMn?oj2pma|JP1qdvy*fPYW$i(NGqm{f|wjdoNPv6>qx%5M%p1lCq@#Z_~#P{3yursVTys zh4K%i2^$3ADyq!N=%h@?M9Y#ggMkQ!f%pYT2m^?_vVr5XD9Ew{2#*B#O7SZ{ev5)K zU_^x2L*dKF=bC}AySQVFfz|6jlqAd48_gK-F#T*t?9u}9BFoP-KlZ~*;4DgG8BU)H zoGx-OPGO(;@+2cmGTx9%p-{-lq)h9au3zwlf!Kvzs0BIPOQFci0~Dzs*h3fnH@hqY z8KuFTgbe)r&OBp+@x-v#%)}mjP2P~rxGcSHj0qLBKLkL4L4-?TThbcEk$WpXdnBqW ziqI*-xt*DfqLjn$g37I&1Fif}F+GT2C{tbd1rmh>Wh6BJ7f4d*x=SPFOEFtS_e?Q_ z_yP3902m0b3@cD1T~N(rh#C+?00hwgJk;0R&zLyL*)+nv#7G)#Qu$1}jv&R40M={GR&9;2gwxg+ zB*o}iwC#8~AG@0@$(s2x!%!tGR#Z#~oKpou&lbc}B6!aYUCIsxQ(9%m+*406D*$Iq z(Z0l1VjWn4ZAAY=yS!Y0|Eoj{08rWd&)3X?I;dFxQlQN`m{@8xRwCuif+bjMCDBB&orfFB?rTn?hJ2(i2kI+}L5j1zzadAoagG>ou{hMh7Tc0ytZ< zW!SWZT8<@Iv_(HfGfZ-2%tO(gbp-{)4BGKx(vg!eGs9WFZ9h}g+f!r+?hJzf5X%nm z0z5bZDVRJ1vrqDTQW+cs7>Ix)W8UX<5Qtwugg8LPkcGtc)HV-@x@X(~Xnd}u6)y&8Q5!H{Sx^Nb z2!g2ECV2NYkg7aL(?Eng< zU`%~4SVYW$YPS%?peZ}fg2FUs{9L3x&{gy`^Nrl^G+*gu$MR)c|2R;}?Fcf^0%LRq zfv5#qsDsYOIh}DgWI^YF?r~@^~f+cueC`@Dj*nPkE1Hi(K+7!UB35MY`5*JIETTun3#!CJ8p;CZ60FCS3G2Ta)7rKMb!f2!kUSh+VCK3n1I`tOP>nLtDceCn8$PjZuC`yc07<3*j;>&2uG-vKo|Zjcz*X%16Z)k>GvVnP~1 zkQ}s%+|ywYfEIvHQZD7P4LdC80*2^1ycCmJB>R( z17;v7KZ=%Ue}&iA6{>ts9YzF5K!ky??5CyV(S+NH#?v=-fEiGP_q)OLoZ(6-=!tM$ zUf|kU5C&`0Wh!_!JxDeGfhz<-croDy?lmKB1{Ns>wt}eb!;Nlky&g+BCIY6dyPIP# zb9Gk~d7?YcnpkzpF9ogmT-HLv!Otx3=e=p%kOIdgQT7&yTVQYaW^Y;0g;>Bi3b5zV z7KpR;PvAv0-!#O|g>6y9wPP!`@zX(uI9-8|WnMsqUOs!{}%9pXayZ7twz}J z9>456J4f8SgFu@BaCOquEaHVt;bLX5aVF3pp2@dWTPpuSi)3qohKy851=RJr0YS$PIAZ4pKCx78{#fQ88|l^oVPgVSz=orKOV#P5gBXwT>2(?L zrsJE2TNuQGD`SH;NMNpxU@cr=)XQf?4$W^R;oYm=s5Zp>hF(EUNrx2*S;h_5r2-;! z$wWByv_f@NA9FEJb1|FjBaqiiv;ab%VDP<4Gzyg9vB!|k^Lk71T$Gk}{MmZVS6QV> z%bf9`opKat?O1#3G>bbkn0D+G^U!Ns5~E3NpYm+(WWKy!B>zo8w#XvA+KZgjRH%c6 z7Gr^!g_zi7Hu&;Kc;aEm!+J07;)W|v)NsmPhE#w}r$6L(n&SXAMB*{cUV}E`fK9jaXLbghq%kNChS!!Yq(SQ6>TyQ{pS=GB03y zGB5Mj_T?PFT`9(ES|81ireGJH(bno0Dr&DW%v+YV^Cwa4LH1jG?pfM>`+$8~j682` z*58abQo5&6RMzOYCh!$lfxe%*-8BOlK;jZOU@0eAeHL;Bg+v+U0h$bgq8)G4{QHir zGk{Klik*d5Sa6Z(T2eszGbRW!@PNX9%pYKca~3lVSGbA3`VVjJjO5J88}gQP=4)D^ z_sQ=6c-npJ4x00gT;cay83u666I%0T;nqxK>rH;qBzJF*fEA9qR7MCY5IrcE_Swb3 zx>h>+Ae4JgNX301u@+&V>=iz0tX07 ziiq$a!^nyUFT)lxWGILb#D)?Vw#boVVug$xCUP8RWnq~%ct#F7BF1}ED~EDqU^D^JqY)wuW6DqiRH#p<4t)?c>cXp5mlDO; zbSc=bRGnu1njve3v}d1cXlix=T#6Idcxf^OOCN?Oz z3x5ET6y)zjh!G`{xx?t73?CLNHsql3dBYGAiGVDV($IBGJAu};+0r}Bn=`rV{bYFA<%D2R4dl#@bT{tTNb}&?5PFcTW4Kxpj!!kwSWqK{qayC4lOd2 z8G$KCAVq^|Xut?$AaoRN$t6ZnK_|$!o@XPn*W74HoF)+|yhxN9DQRRe+iZ4#WWyQ5 zBJvXPkAe#Gg~~nUx<`XbIMqd|{E*)qqSLc)^~6C7Kn39DT8y z6Mxuwmk^pcaH#`iEK~pj3<+QZ9tb%WL<%!FN~sMWFlXncVqsR5oiCEo(2K*Uf#VWc z2+2rUih#6`LLOm4h6h6=xey)6CQ_VX$FU)2l+H;@C56@fiW4Q-VzTW@YRA)o1S&B>>7PtGrQ1btEzWQLPK5R)-pJ zEWywcyEcSJK_#UcDiOyCS5iral>w0yL=$_%oKY62VpAtXF?C+y#QWaBN=(N&ulm$a-&|C*8sIQbojW;f#hJ*_Y z(b2J522u1dfh0LJ($PWrMGzU|L^um$JeC0uXELbz8>xmN<4D zPk)!nELZpoDX)fQh6= zHDpnb66iV;^U_tWbA6{gFkw@h$~3(Ax1GuBrLu}UBPC$?fo4~qO zK9wX0j_4+8%W)b%Gx9Es9>#tQ7y)$xDo_`yGHZzcG*j3PO1*ALG)>QgC`5;HuA_$R zqfdk%2~7&pzp6-${z2k>_=q;VDK0K$^y0#l`BH86^^Yno+!y8Ghs|=<4`AdRTeL7T zMds(D;oKVohd~49Fc1ed0Gx8xsRxG8Kz{K9lR$^Yks<6VSTO*ek3b5|Il{-DKG7D| z?t03-=CGhU5enBNs#m!}ETz`Hu1ziby{ky^r05HfNOu|D?*5XvDiyE!_?R+_L~d`% zbm@c2NUs6jbTgh}R8GOTGbju%DnIxE{Y1tx4UE=zza45ewMR}ArNKs^0gY4FiGy8T zunHEIU|ljGF)kTIB2BvI!G;Lj_F?HlB|P!}iIcLWIb_GJ$u+2Wf|9OqNw+-Dy|LJG z2-x9X%2Ssmsi8n8Oh8=}mn7Whp$w?h;nrzF5+V*C9MgsvY>GZe{&C0PFqEW*GMgC4 zCZ`ToU6kT-2v`AnxF)-o5huRgE z0NiOM5vnidI=4?nO>PE#v65Q8shQs;k(C2MCmZF|XoX$WOo$lqD?|V0>^#-KA`7+7i!#U7{ z!{;$dvkO%acfrz@(sLfH=K7r<2v&B)e;sZt_=EKtKc{u)tXgyd&Nvo~eUaQLVuC_D zjwM(~_Imdl-(x>At0bY^<-!%Zk`B7cDWv5z1YLj#Qujz5{&mD2y6-!F^)Mn~^2uVH zlMb*!s=?_IdGA&Wc7wqlqOd9dH>mId#3F(lu58$>OY6D;hWLWN^6Q9;J)k=&yU?wD zA3@Vs@Et3n4Q3Y{Z8bOL(7U@%zy@^kbfv*?Xt3cE!|Bnho7MqKQM;4hWXZyJBKLmJ zR(0LUOx&Ui{*z;^#Vvlwi(F0`;DPw$@^ytbJY@shI@bq}RB1~vgbgwKak`R-L~u}& zZr^l9aD=VJ9*kvMM^KmaJr|km*zq-B147y_dDOZI+0W%19!XIG4#lYrUF6|X1uC2d z6vwjx#_eTPWe`TJ!H0$rSYaTGCq#ik2o+(hihyBPU#(vJnO6A4mIpb+{yBpG5ruFB zi+ zT@u30$ITL8w3qc=0QzB0MHNa^sLXV{VZzN+bxoX*L6`t?K;-lQAWGUJJVM;XNgt(Q zX2>137?j-w-vR<3-qo0>?H%7iAa@a2CoNy4SzvmJmj`BG>^T`%iBZ^fU{hEDAP8Cs zq*}AN8>axGYn6aqn4sN&VJ%q!;F?8+lV*)X_H z%t^sIlG62M8Z&kPK79$;_+H*!V=P%?B8r9eMAsBrAw$H0;SCx5d10XxBAL~H?9*1;w$#3q=WM+ib#au7g%m_rx@|7G0GA>n+ zRh*IkT-pQ`K)s$vrX06n<8DS6msMD3;YpN+u!7w%=35VLrH4g^I}gaM9Jq8A057?9hG>W`d8Q~24I=J*Y%5LT%1Rr`I} zX8wz@f`BQe=FDkT?QA3w{!Zg9ig!B7lWyxIOhS%5p`>9cjo~JWxNP)XX{QQICyXJv zzSlb1LApX2QX-#$}H^Th|Ty&Z23qF4T)+U=frQsJfg;1YgK0pitqa4O%*(5JSQ z*YsV^s@<|u)448$nyza#k>fKx-#7vj`z@?xB&So5r(cv}`Po7()B-~gEER13!QNr5 z8cJ^3+9{LPps`}5eCZ|W-D>1MjM^T>G5KfzP~Xl5=8`ign4# zvg|4CEw&Y4v;{7vrCo5C9q#UIKtdao`3}cEQ#jS4#tLekb}z1mlW`^-Vf~N4N(AiC zir+L?7YS^Db=iRx$k{STQ2`09cC249WiZX5>E1`6a&I?I&S2{4SB+=9q1*c&nnvQA z7YMIN*ez{FDUC^Dmi8Xag6b>nUjFH<>e_F^QJM#@;&ufL7T%3UoflZ(z+PZ(14)D} z5bP|G8?S=lNO(*HfJz%w!Yjx^C>V|wpn?{V--zTHft|n)JirMVnKps{@Qe;h*PU(t zBtS(8u;p4GELL$9L)sf=q9+O9)F|P~W~yz1Wb`m1bYZCz`t5;EFoJ%Ib|8`iyDcFm z5`;|FbQl}7EM^QBr4m=$SWI2|M3V_tv zm!~GEKl|-JqcJd_0zv2P&5A48fJgDFY!KE78q7u0J@n;5jvG<*Jzn(qxw43f7^EPq zM;|QvI!e_Jg%bb(2_Pqh{D7^=PTP6Fj(FLYC7Bj~BZH4kZRFD4a5dlrouun9ZV7$0lUq8)*1n{KsN>Q zbO@F85zB}~GdZISj^ZzdZX66?uiwm}V}3AZXEwa$+j`RfM$_OxR%YVIAhpObTg`T4 z*U&6;@v_Y#bhkz|FYohKuN+D0P)p6ON5J*oP&048bz8@rZ-aqTNnB{)3?diOYSo6H z3@2$#k_=WsB`_yh_dp;62yDmw;ClRzWy<7B@r)9he-6GK(K5C zyX=-4bl=L@L1)I5&TN?cEvx7^RrfcfX(Q0BwUHzLEY88TZx4ko{6ZvzK@t?Eeh8J@ ztm8icP)`;KVt=UE<}0vlxnMtbhHC6&!f%IORu*X#oPAwtt?logVh9){@KTl<=ce9r z>5cd8T?qxaZuRxV_AkpUSL-;Sqg#Zw-HBmfJqq{yEN~{v*V;_> zDOv}6Lo-rza2|FtXJBvmW~MI|)hI7nGyb&>5J3uzC&L;J3OZ>YaJmb=cWUpqoy(9T zO7)K4`9sn6YnyS7&n!V7`ziQ$7#XV5Vw$2KxuOSMu(c;M59|~afn9$<5$Hi0)WD^9 zj127PXzR(aVsfkPW94}H5$81jb`JBkxQEyO%V!k9ok%%6uI{bUI!VlUjn7a(mn1NA zn~%r$@*ume+X-s}{1^*pq~f+j!_Tt^ti(^eZmTt=Z;@O_{Ikc8E$G5T%!>6gQUB)6 z-E{cKS9wx2vA`TFI3mWF5v}){c=*QQQn0d9QHot)rEf<$0@$c+4s8in?xe96mSWtB}oPLv_$ z>RXihhCn>CKM*HJ?m@;A4APDw27AE^bl?U#r?%y%UXQWoc|*7Y;TOK)7k-Z6)6fN^ zPL|xqX1vtP9L2x=#E*64e{@7&zLE$3Y|~QwqYzdRWP#|9XAR)M3H5KMCm7h5@Ynhy zV6nX9Z3VTRd*wj!cr$yFvZ)u1SRal2fb9f>&>hmHr6d1`Ek#tt^d|+*|huj=VbF=jsOJ|@Cu!Z zFbu)LfbhYGF{MBn=02C2~Dnf+vvA`BQa4j4#2#q#I#qgj-#VSRSNCv?`K_C^EY~n!~Ibih87*4g2 zuq9XUOw`RvlgI}`TWg_-CkPvDF}YT85$HC}bn(j02~?KhH;vPq~< z!aRzTFr#x5yqKy@b4+d998 z5xFYMqPevr|r?78NqDrOHe%yUnhtsK_>ZYje;2&Js!7u8EO@f-Krws%HnGjZ| zkEN;%wN8~ZSuQyv7DJ3F)Sx*=oH@O!sw=D3-P&ud6|*s_x&E%q;K3Yal;MEfx(>Xs;#zgaz+^lj&KpV|U05h;4q*g|` z5Jpp@WX2&3>A|IgU8XR&rDt6PlE)yd05iwfnTj^F%Mhgm`7HO% zZWFTqBY}lv_5&hVFIv2tTG+J2C2qZhOIF+Ax3mSrQj}tcYD?u#aM(6Wlw>^bIwDrC zl0;i7u`%>YQ4`Jg2R_WwmL?Mc3xM!6AB4_Nurna6-a{lHOyrNGGb4^{1;_}QC}@tm z3l>gCG{x1gbgr=($662@2Vk>9qtj*t)k(josgrWO$q--0FdGBSZfz;dRS!-wSs$elRXtUJFNNO!(^CVJ z%0cOT8iD~e#|0y}zq4g+2i6UIV**~?!q>(`80ZgMQ8#kS(0*v!-w8(IOX=INSMcxYambp4jYhO+o~ zAC4=G$wj?~zAcDw)2k5!o8!FZM0!=36NdT(vzuv#nq! z+a$xb(kshsY*n)|cS018dI?0}J587@ARm;dyIk!*`K!UTt#+7=OznRm+2k=lIZD9{ zFq!i!<>uy!7I9t|!Nsdx$`O~pS6GyPu6nGqCVFv$a$={$devk*F|TLX^j0z*pjPKM zPr&Lsm57zD!Y20EBaUp6l%3E-X8ETHCT_R;ykI?V``mk;M}o=!9dJIc^n4Mv^SlG< z?}pl*;NcaLprhT@iO&`fhYt0o^Ln`kC%EIMb8A*yo)wQTxbwpLRjpMi;a=w?(t%y) z>N1;3d+)nK`Q?_tzaI9n{}0EzCvWxGL2!X9pWV)t_uBVTd*jI^v~&zhxQ> zhBy{bcoxsaXIZ@SugTfNqy& zNumZVy&6L}G;XfwEdosm`4;cqM2UtJ?+CrB&baRA%+9PPC)cW@JA94BWNn6!kj;i- z*u0K9TI~F+OAED51KmsmA&##K%X((;yNFA}GHMNx$h%Z94t-({-|!7}@DUsjyaa7> z@{lU{6MjVl+h@vqY{g2DYBy(t1trp8|n}bs@HyEcN9(tvF6o;uJgXo z0w<0adr=T$F%WMt*#zxP9uDJ*4H&o3*pv>|-cbTe5$kwR7wa(;Igt}vO&p7mCi08{ z?XeK&jR?sw8ZFUz9+D}BZu-iRl(f-nEU=(5a`O~X9MO;K7SI&U@$6y@7lkqG-qA|p z@z2VtAET!s*(NwzX(X4;AFt~W=Mf(%5+x3@5kCw7W33|D%p?0Ptj_HJobS0_k{Zor z3NddxT1{QhW&)AN8k4XSL+=pp3{61L3Rx1l&O{0K4C3T!&VKPEBaZCI&K+Y>EXT4T zQ*s_b&n0V;1C4Jkn+@Z}asY)bA7N#|ZGmD2JS6Cxk-@v8Fk z@XP`&lKG&cloSygK~YQ$3JLFx&zAA6I#83CVoo5kO|u=PMIPV83R}{-R1*Mc zG5Nxg6vOW)K~g7|qw$F6Hn(vhld=L|axtIM`i>L(C{Y!d=O(0UIa>`ht@87pi~1yz zD(x(k9IiIUFD=z_34yIU`3W6$$0dK#HT$sPOtU=6u^e49CEJtq&=LqaQVUD$%m%6( z1+%%1P%Ak}@v>1VU92%{%{Vg;IWO_w)(Q(DP!fqU`519CkrFJsa5zKZJ0nyy!?P_1 zZrQ+YL&M{EN-{3_@Z!#nHHl3nnGQ7npV1gC6Y@H9MLAFs%kMsgv!8C0IunyPrS5EA z0XaXgM^DKbg%SgsFAKi}Du)#P9@7Ie(<_NkHwg+nHIz!pvMf{cJQcJZi}57al1i~o zG?%dn!{tSrRPtMGvK!4T7A?ZW5GbT_40T}?YdX)}|OQVDhJ#6>*c)1RjGtDNy!MRGNj@L(sjJcF$t zi*+w4)Gxm7b0`ct$;gn#5r#O35TLVtT2vl1iQAnY4Rbvw&(S;|a z1~S2PO;0ZpsZR1Lbxi+qG{v*%CUs!Nk}nmKVLy{5fz>_Fa#3ZoXYn;x%ZgC_(_$}{ z)|eB;^fc;Lw))U?RZW(~A`&xOH7E^A9|ckr%hVguY*`1h^Gfd+`PD^lHPwby{8$oR zXVV<%HY|xTZwr-6;Wj`2L#$pc@*hoa>zprN8!*Le%}uYhTfr4uvsKqtVKVzv>a14# zP66A~w@m>42QUTKoXZ9_FzGaL&*o!K)>S2N6(o1ztaeQ)S6Q>JGXHY|o$d*f3tB1D z=!n&CS@(5MlXMaGF9&gTrDlBXZCHy^Ex*)ljZ0%`Eexd-czrid`IAW}R$oUi7NnGG z9oHrtHwu~4G0`SnQWZ#1HZmg=P1H3od6#KBb$o?4lv=b{)7N2}7HV;ocKK@#zN zwLTwId{>AoB@`O}w~q9JP&(06`kHfG2~bTI_i-7w^1Q<-k#~O=>JcB43Nf@<9WJ5J z6+%r{LcL`pqnBODk2^CMb{X|_L-GO#lYGsOZI~5Ufju{E%v2PmPvxk&3A|KE| z<=BM}jtez+ds7w@^%-nY7-Vr4em#>L6`8v1`RWw(kzMys!Ek`;tWS0*62sD-3IAFKdn;}zWk=F6zVK*YuOlEG2{V7Hb`^$lnobz zk4{tn$#$)q5S_`nCwUlt0kAmYIejg<>*y7qomg)X@~qi5OQ3Ibg%cb{uledXuycB# zPgN>DnJYfIhUHq6t5satxS_k2^9rt1p*I0rdv|SFnUT7d@3)d)_ID{ck$ut&PxG)j z)`;zmAGf-l!!mg3)v$ZoFp+OUX}g@y=2B<7tUsD+0Zz0@yYgTgud(^ovTvyy@PJ)A zg;jx^qq#X@8zW=+pfGYz@7Sex8VaR)6os3lu~>}fS$zqUORtuKz4uj-@ltEKKPOT} z_u8$eE_n-FRFw;^4=!8>bPBQAu8&hU4}5ypd-I;#j`P=YJN2A3RZ$VjHmlaKb+zdK zkj`iim6sn`e793OrCE@D*e}JlU`g@2lNz|In@HRGT|u0#uY0t?6--sTY|!>wwJ|w; zxOg7Aa*0@-4;M8xPf20bcxpR=pRb<1`Xgz!L@Rg<0r!wCxW#t1Z%f?2qm+z~*~&l3 zj@P?MLDhzQ_pR@mw1XUSw>!M2F06_(e1l|8e#*9&_HXW3X$l}6{4`6j$_uNTGt#}Q?D zT8*RfK&kUUlf210HI|hy*-`3{S(z2hp1A!3p!Cd`Oxted=p$Qy~?q9Hh+oz zZR;(g%N7g`^QaRNs>8j?ul&S$+NgnAfD1}-vt8A>J1RjI0f~Iy1s=1F_@Vh)k8wOp zusX6O*sS}l*cm(6OE}YeS+O%d0%G~FM(=bgM{^?2x8-R#|d&v9J2 z;a==9ne=(Qw*CIN{20bRxOAygQZ+b+#FV7F*Q5n=%pd7VMNHluk?f6q zAVHqLJ3FQc_>`R+`<3y`xjyXudd^Bcl&5jYpWm~Uy3e^c&Vl;Xjo14gANr}izD4(P z#~)d>yl4e9b88>!iyiv3RPNW`l7C*IDLwuK%^zIc*A<$t7NeV++NVCmVE=RpGIQaE&x~7I!$11`*7`Y`y+88wA)l>n zIO79-OKDsFU5#*VK0V(bgOPEs6OTOJ7(2wH!jNQsP>CR=FJOVg7O# z(N1?eMim3)YIm)ZyVP48UW zmq**R=FV4HT`ieMF`vpeAJ(0+)r}sVoqOol9dtL|@Vy*-t=DBU5&RhS`#n#UE16iA zSJT=0&T{?gI#E@jKb$Su9&HnPWg&*OKXE~s?P-{X5BO@5lbaQuwLjJ=TOHz$+Fair zqq(=ktz4B&Y~vsFUUhUKUA&mPZWyzeeK+04f7|i@LHcYP|EUWW;r&(XySeHam_Cyb z$VFSBbwct}z0MQ9tpE4;AGcL?zSZG+u9teEwLKr1pNL`fwrQPyJ5-X(x|091AXPQ$ zrJO4_vgsw>iW~1t^;hdv^`0R^fZdr+HN9eIMgdX`HhW!|z&MufIWM+@tF~b|< zquaatetqOq^;P5bqcb}Z%a`zx_*j`yYui>wA%7nUkX4DFh1K2Vz3;S1J%&j=h83D@ zK>M^wd5&+`xuF?Ob6DG*vemU+dAG0ItDl7d9^jo)`2*V$8{J+rd*gjQRc-UO%~R8P z(>M3Ei?Q}T%{_?Ye26=nTmpTmkKV`s*B|-IS6q`)7GyydWI^&po75*?v;!D`1+r}upMlhc$VRQb*IYKA(SX*fB1eu!}$0iU+7vwlhAmEVueyhFZT?S1155_=;S z#oxTGoE+DqyymBTyp=0)6S|Zcdg!wT;fs8aaqYw|K zu*>VWI+~WLA0-w)JYjAguLdL|JhyJ zIV*ndJ>O-Ev}~MwjYN+j(QF zlXN;($F^efByo_n7A`~(n4YD`@_C;z@1 z@@c(1jZW*`El`c0=*TwT1t$7OY(;gUcllD}r(pTUW#-_&7y{5q4JE89{ z2<#=cPw|cU-cp3`fZG=u?u*idfX4h$eR%CbHzjwaWlxO|kc`8}y1xxlmG<|~= z@hIbZhaETCWO4t!_L-@&m#iXGILehODG-1nJYw@|mq+t>uorr%r^VKP%*MYxo#|7) z9SEEI8>kKV5bm=5+!pw;pwr8ciRT#ocf}{GHqmoy66-HdF2_;MT|1A7LsxUO(Pp6d z|GZmdVKNtUD}Ns_@|3tmWcA(N@>dKt^2A(pW&e0Pvk?t%85R4G#J#P*t(S_?F-kH2s^lH*@iz zxpMrsWaEPksK?~w7dGO*UMX9Zt9<dOo?Uo*PtS6>TA$Rg zy~h)*P|C)~`dgfPKj|KkGF&tpwwEP4I;!e}Ykv0+w3 zE0gs)oaDU_;oZS&2~?{8w>REPL*&Z8VaxFEUiRCg2ICyjt(O7dm*GDq>tP_$`D(Z$~XJ%FyehTd27={x#5FStQ2? zv~CngaMa)ZzHD^kao*KjrWNS71xlYBHw^!m?C#$IUFn{zY5CC*_kI(0L2C$P`{3uu zhU>j+P$OpCxPRI5cN!NU2?yOkK8s{`K6K&~9~qNV?Ov-0#A5IZ1Z=m!$=?(F^>-kS zc`zt?$qCIDi1f;H7BQHgPT%|UzPE+=^n}k!uztwqmOS=nPSBfNW^I;@XojR?L4ezg zjqtsh^*p~D7XRh{f z*+U2Ky$XNP0PnsF1!-mSn*B%_Q0uuX#`h@J8<8@go!%IySseyn!K-x+u7B7==-t$~ z=nCDqmcvr6C0gt3+y_sN69NsgkmN294BK|Z>1SHR6Yqwn@30BQ{aU8yyB~tw4vkHD z@$pB4^Cbax$KB-X4Q3bMu)QOuvtyv|mW#K1N#Dz5j!13|z6b{9vOo9>XIp1lvKXI) zio}5oWr16(wuatZFGi8Ti_gch>u67LLFdiUsfUXOIW3p49~2%WE` zcA9ynfG!OthW$k9e~Nl>_T+QPilskZgJ#p;Cy=&V*}PM)a1Vg5{C6vNGQzCQ@4x+B z5VnjmV%ziSdP6sw;+l!)(s+zMGVW49F7baCYelTqxI`T?csKIq2z)7i@{gSIR=fxf zi)qOM*Z=nCMZEZ~r>h*iY(L~^g}!JWB4_tn%7%%cM;?8?2<5es@HV5oi_krEuq8Zw zES|r4JLBcO^yd})Tbq>xoQJI*ZusZcKz4mkcF4M6IRxSkJKOQQtNp^g{;p@CoF+d0 zO;o!vsdckxBJoG-vXGtUneHGwPYeRib06dRX0@GRT(@6DA71$bUY@67-7-rZEes;E zxoErQ!3koWsrde!e0ThlR~h(Pcz=KHO}c%~*?;jb;Q0`EMmDRBASCqC34Cz2-3jF0 zWvw@3@!qH4E~Uo#m=Y~j;{HwV&&f4lYwdqP`D=G6_yCRB`(w8#orD!Gx3%A>C-l)= zO>XNCzbwa^iWK8;KH(f8NeA3#(+L)%)+3MY4v@{@wSRT{4-aPl$4#z*l#D^b*>YJc zH7VHt5<7;#82`g7?1LkNhXVirI5<=|K0k1QdJ(R8j;CLIg|-R5VgF6eKik zGBkQZbTlkwTEJTalNvaYhOwX&i8AJkD(Q(xE8ThAt2-#*Y#-_X#W)7aMczi}PCt(`+1 zy(67nefHnESXP$RoIQk-O?@;H zNv$e|&ZR&p6~Pu;u~Xw*F;6y`9;>T`?pKV2Pgf4U8oFkcSff>Mr5p8H1qz${)25oe zQnI8Rx>Pi(gI>GHxOQ*X3Y~1Z0`QQ^2mAN05}fEmDR}qWr2)S^{FSREv-Q~c+PPGM z40f{^WI73CpVcOV2z!Ddw@&stl|gP9pSrB)bDcr83kV1M*IVV)(9)v1*$<~bvlQ0# zb=z&~Hq!;@b|;*ev=3{P(b=iOJ$zHKma#hIxgGyLxUZlYfw+F|Jlki8DWM1}5qy0s z^|-m;opt@=yMHkKeYM8mRr53sD5+&NGC79l@CMD3>yA09|M_4jjh`4QQ3g zaQ)3>RTz#ncDC#FY{_dH!k8Lrrjyf>u}#IojI&{mJLj1dz-R`WYn>$2apX+Po@(a! zC35pu#Vz0j+IWb zIZollE0MK_&Uz_PQ{No5%9FvyI`%_Xue31FDqSy5=N(ErPnLOW#m@*fOHB&K`5Q*# zOYFB|>i8|MgEBeCS(hXvu4|Oe`|=Bqx`6Ah!_t#^4D_B;_9JPtD8D4g6~k|-GNM|~ z9}kDj!ZC>3B-tB3gU+0HvV=f~Q%azyyd7YYWCyKl80j(-JdZh<>>WhI$EwtAU+AH!W(9!$2C%2Ja-)$n`T>-XvP z!aVruBcUx99#lBEvJrS!|C0|77+RG@Sr@IseRjNBJNHOGl$v=`(Lr1 zqo>Rti(Yr)G^NYt?KwC*-MO2m18BpaP0gGvHZS>4T~*FI_0me&R|zh--4!XzdG}L^ zwoHE}U#ZS(a*#xFFsht%1iK>j36uo~Y#6>BmR{9Sy)`->MO*GmT*kF^HE66ghuKC& z=(+Rpd-YmSq_wduj(Egbb2h3?m+HD zQd`w7Y6KICSTE&%& z`9sqHvV}aNE+Qxc>lc3iiF>vHxjJ`p!+XKO3_nc}%i$PcsU@*jY zZgGzObf)=&9+`Bl@v0@+dymAtoD4*gSl-iH9j<0ngngG(mkI6-k8Nf z)Xdr|D(;Gcc|#?#xTkyxF%mQBc737!bllEf0l@sw=P`-k{UXvv+JatGDNfSa`7r)% zQ$jWwu6U(d9USuX%z=(^Vk=Z2MX_d!uS^?r)vfW`!XcA{E8nKp_jLW4()!KTT6HTG z1?lS&l@z?G5c>;TQd2#KY`*HV`3XC`PqaWxSQ#q##t`4_xsv;%}=vuQGlX{V^e5r)#wLi5l96=T-6RoE>tx0Vobx;%n2ryjEg629`}SbMbe&B z@&~5OV{UZdkKm)s4&d09(zPXO^%}+GW1HSRi|lz74a6tXgX2KzSMzA ze{YsAf=gZB`tCCfr46L3v?;qO7x-y4rZ=vMBPExZCsd}QL{~5Ie)})Z zX-7a8l-VB(r;jmfymFk`;|_A1<0fCG*GYz2ZS8DraN{&iQ}Mnq{zCBqYuPAs zN8qgaI%6%~T1sSkiJIRzB}wgG(L(!{CKqg{6Kc~&pQP@}^{__76*Z?!gi+(it|D?# z-UPPl5ysSNZ@t%H#N36@#w@XU9e`h;xx2`>{b~Ba>n-ZE+Faiy#oE65WJ30KD`XIS z`)BO1y)4VBZ`X|4gC+5R2V1LiZiFSAesjhri@P78WbHcxp6UChtiAH6jUWro(h>xY z3s|4s7Q3BEw`FysMq~|MVVYbzaLr^0F~xLp3iwxDBe=4c&DqC8awY4b657Cm8`f*c zh`4R$saMmCt(8m@DGg*y^kA|f#~_a$WlF-dG{uj}ZYZ8ztP;d$e9T4q zGzMpdkyfKi8hZ>y6LVY@my*|ga+hpcb3X9Hi`F`qPTbPF=H}hHc1FmKT!mm2-??SQ zNPn8gI%kE|4tMF$ZQUzcSDifHV;-uTpzdWdf!dtK17WgKcHY}g?TjZ-YBeu_;l`v_ zeP;RKaW?7c%A(qEGtgJc{uE4LOoDDqeL1eAOXf^B&;UKr91A&LtaeF6gmXSV%cEKO zI;-QpyZcnVFsJlpx|ssV>0Ao3tzooZl)!B5?Jeal4XWa&(@A}@3`69plCW- zIf2wW-$IY+<_Z#WQ)BDy2<54*%|EnA6Yy@l*3*^sd14cF^XljRP*b}I4z1wf1UvHhPVO>YD!H z;=M6($_#s9`XuSmvi4rjmd%U3b@eFzoVzX0(h=^$$ZW`m@{D}qyMbZ3sTcp(IGf(w)4zS+k8>5punb0HQ^PGY^S*U_cp<*eS%3g4PylO3;AiRzwx5u^zd z|8AZVHf+E@^#^sVCA93E0B_+M=zW~Tv%+Ezz8fllu7i&!p=qn-ytewQzSO42WcDk z&vEURW}^k@Aj;>U?^Iqcn%|Ki-09MMe?!=?=!6(siyV8ni2G$pxMF2gNlEi`?p+`p^>zF9lKhnf4ON)@$!(B8a)hD}w=V&X&7!7p z_KJQjmm1!AOw@VEo~|zYTIAm~=85N^s)HcWa`Qc`xCRC4dh{s{zwXiN&W3hNRE$6Mn-mO|@AL2P)cR<;@Ch+KTOvoNt)ya z^&b`<$+~OU5$SID8wQqAzL3jolVw5lR-x<{SvVbDkr2rhl7VSfjsujD%ADb+Hd4_e zQC*!0ZZ9r|bXK*rLTl!N=jHBK9*KdpsO=T${o&Do!ta`=il4B06CVCvSdwob8hZta ztTh-GI9q`Ocf+5jnWhu&?leD!?maHOB1a+YlgZO2#2xkuIq;t|FRa6drQ_FALau?% zFk`B#wpnP+(c7IA70Z53Fkbf14nVH3h0d@&i5TKAncv~|giE|koymu~DYGsXzt*#9 zhkbh8#Zz0e6VExlG@Sz@awBk)l=&>JQ-FpOx@yut`*bskc!Kk7!?$?69V5el6%OJ@ zX^JD>gOpkVvcY3~+#($R=#`A&h(JHvACH9q2o2mk6YUIv}y zwu%xzSwmQ_)O+`&Z`SdY@A-KVQ5M>OfOo+Fk67e0qHh;ioJ*OAve6%)7FrYjc#qEF zYTNIj6=hlKLE6~E2Cd|J+8EnEK`>dFcr8qa%$g`OhySzP>!KO%It7w^9;eh7n1N%>}4nw@fvoKMJ; z$gM>3o(so2Kz7*H&B2+lUZ&QBEyJgq&=^%@S)6^= zRk)j#?G~7yvYE>e8SSXq!kbz=DW6@?R^T`##5j>!$B|W8R-D*b*~vpR=}4dD9x{a!~Fnn}17F?Fu=+h-8-)5!@2hppTQ#tzDsQ$yt-~nyOjT zt9P%=RgDghoQVEPEGypP%EK|yd2ZldGj68J`k*gp!fC#iSIE{EK0jgM%O*p!?(sfJ zzHTGBZk2KW=uXC!AnHn40%}-6#N6T1B6pD!pLacDb$WrS#anD@J7FxOBZH~AEUF|u z_fCsYGBbvv6PqI>KLH-S48^Yes>^WoeZ|o;EB>zd+4|f%B)ZQ26TTqotQ8wR)UEtq zYXf7@j!@``@yQJq(KPWJvcIhxtobyAZITo{b8lo*Dt$V<#sn0n{U9Pev2A1EUV5Lt z<(c!iMz0(Do_l`ls=lT2hQt>>8clA<$_#<;bMCNF_6}roH7xaVpa9fxS9MLv2!XC5 z3TeYaFo$8TElWU7`>8Z*z%S)pB|lbU(h!+4;nc*@MC*3fJ>ITs%Lp-PT!jzNTe z)iKDzNmw)hKYxSKlSGYnc&mIh#CuPAYFt5(!2J|+0kGx$YMcmedf1LN7SL@%&}UB7 zVG29ExK)U%*FyRlv18i`d0`h%i>kX1D{5blbqA#z08LVk8X$^l239;$$|RH>wKv5O z7h{EnK>ak`9DCO{?V!68CitE?ISgt+| zJDi|@r)-O8tM3eNQ^A^&Io$jVL+0IPDnDq`0@HvOPN^s5H1zL96n8}r=XQp|zrV>b zi}vt(moB}CcIMW-cvq@hUfb*$W18*Z)oOKH)$Ci=idH@@`~G0IGcXK>xOIQpn}j!5 zG@y#0d(NgrZv3iJIKEPUF^*W+MZLPbn>{4=O=obzEWN6x zi`*qMdWkus+BK)uI4!lk*rvy+x;Q7_a;>36_S=DFS_N-@+;nM)OrzJCKmJWk?6*mO z!pfgap|=M9e3VHh<<7iRM`2#g6rHb4h!{p)fKv&O}sG5bR835E>dYI5?*pqwN3R( z2GqeMF&hk=ZN?lUUzV+K=hImBn^;k<78cQ*QBfO?LLV0VRQ~p6d{^=N`_A|a8>Dgp zdF+7AWfs7KPcf$ZN~!Qen$HRl+sQCbFCb)Tzb8;#9w%*3{JZrLJTxS;JjLBn`)H8zM{uch;9K@|EB)Y-iNt9QyW!o zhrQp?;CM8}YZryUkr1;fBn+Q##epPJhS9f$0-+uH#c;!$_=Lh$6F~kI_ZW_K(R8v5 zfAyv=mmZe7s34K#oU(fT*^&q&6}T?wL_+LnXb9zSFGGt0sqD#ZJX-t_KT zAML+D$J#*2{@?jGLa7G(O?gH0adinjRlMan(W~XF>4V*oL$<`t2#8KQ(%G(ghQvzR z8=Z5v5&T=3Bbt#H^6&M=@@u^QQI1WIU?`K4uT{3(57r+ykX2FEe`G0sw30>Ne5bxf zDe-c5IC}Vuo3Mb-Fz&rW{H{JZoxV05ePeGxp(qdSl8sH2K;F67z5W}yug}&>rpu!h zhX;aW!I^o<_m}$E$Tdx^UE9R+_SYPB+kP!@07@~v&Zo$b;CqKpr@X{nT-G@r%aCUF zR(<@5*rd<=j?5A0^8t2MZ7H+@cXy()c0sAParihc0XMbaxMhT&mbh#}^3QeO$Dx0J zZQ+)HXufSXB*8=Y0v5C6Ickzr1QrW*2yUdgWF(GM93`;H zTsj7dLF-U9v5+c*&5}Nc_Kre2gTNbM#v}&VbgQ(AoWie<2Ks?wW71iWlB!Y zxyy84cJ|2o&Yjmm_aIN)oM4mJw(A!$ zMBk*^m)kM@OBA*hUcQ4E(jd0~-sXz3y^*%3wsR0rUCZ5%zpc`p=gm+r^2agfJI8F* zaHTu}#un`ly{MsCX?<{o}NB{`YrXM-Qb z=w4l_OgLCjO_SPGAFRy+XiKSM|K4j`RNHK3qE<*6p^(+28SESeYDo>*HAPB?QzjK7 z2^z;~xo$9P5ugcNhDRuKIdz(ZyV*uu+s#>)JrZMewneZg;tlZ@Gh<`D3>pshds?y9egGG_41|ptTN`=5y4=K~ zcvgS&sZHA_>YY5JW9%4}E;(x@C@mrK2Y22`a?`3Md)Vw{_O~Us_f=}hpC7tSL_crQIGoT zPWn_W+D`_{3cPD7F+}3GzDSF8znT#2U#8K=uJ%)rbh0qZY$Z_dl`Km!n;q-%+ZSrC zy0fl21O;=QGK+s!+qXj>-&^KnhZ{=a9`yBmF5htYXt}Mau-OZm8})md$v`KWUWz$v zoJ70DceKwbB3k(fD3|w)6!t6C+fTl&JW)Tg0Uhd?nYVy@aqW?lp^=K29N3@N#~^;N zL~C~eg-Pco%<6z02iBQp>;N0+)(Sia!)v|GKL$%I(+>1<0r=}FmnR+DSWd2SSIHOi zu-ufysuo)EL}8cM;*@O+?(vlcHx^JN+LOH+B{ux*Iw)S|)EyeOzg3_(K)5KY=mH8g znR&?{;L>@D(^*Z&%!uhd`#Mv?x?gKW2@ocRN%3vTvS^9<9`>CXL7e!FL_+a zeLkl5%EdVTN2<$^Q?t1mF#uV_JY~2htCfg87oXm>xC&X9Y%+pRyenN@r5s2b4<8nHhp3$*2!AiwH;>fV>~2sPv{KuJ^aZQnV0p z*w^rAJ`wEnfmH?uGu9&DvMfe+bD?P#s6$Y#{NP1*oIhOFB@iU#)!iq9F`GzDttv&& zkz9jfQD5=4y`{GDo=O&E_==Iv`64jmy*ru_u&dqz9AEG%6Q*{MjKbGCa zRBOUH!)6UBRJlUiX;|86`(jJhDL>hYnkVT9eqk^Q$4VH3_)y2ltw0U#q1qMH2ub3c z+6@9iSGzen+TxeYS?00koZ!~9Az#-urJvWj6w3uoe$CA^SXVGWJ<56^)WG192&=2h z_3TTxX5pJ}20v`J5Ad;rKNZhanJ_iaVYEpTnf|pfG9-$qBGhl}#JIij>mw(zdY5lg zIksDA8*SdFd?crRYt0h7vkyv4W{)eLgQ9iGD)!_X}`DCkSkGbg7fpDG#JrIrBP*~mY>CC0m3Oj|K=+R#R63-#(uw+3Blz<@AwBgP`BLP!fp$r?mc zYwf`a8BI~AbDP9!5&($CORp#7!OGE6E!yhU~EoH~%iQgRVlr;W4pBw|d6$L|xB?vZI zVd#_jMic>TRljlq6kx@c6mCV!OPLS_t~aPsg&!({2W~V-LeMmbT~nK9Lc8@$m!K2D zL(6k*(p$iGlU6xN4^<&#Nc6Tmq@c(b6ChDj^cygu20?(HAzSM$rFIm7w2!duqXJ6~ z+wi3V9koepvwQb8Y9)Qf2N*T1dRf4a)_cgFoLjo;Zc;;=p=R(NC@R+jQb56*cna$! z6r%|gYx_`^RKkN7%gDBTgcoi^T?q2_+uT|npH$QQX)vbYQn7FZPE!Dsoy5<}A<-cK zXMufP@Zh<$tT?=l-!nRx*bUeo*i`)rts~v1dyxTg{8c--m6}W#wHpIlZf!gDu5$u~ z&}G!RXaXDN2dwWYM|S8PASFA8)aX2zZAwO-@k#NBY8kRW zh$PF>ju=t*K6$i%74jUINkanDT%Ju@=s!%*0U|%myxP9&-D@L=`R=Mv-rL;tuMf*S zgAo>4-gG8hxJR^8Ax7XK)m(yakMg%X?b#hEk$d|wk~l1whv*e7o#*^uHq1);;GGlr z``j$pCpS(37*wQJ%Jgh->bGWrZZI@i2-X6?Lp6VuJ|7R5P!J$s>#CRawHIclAHoxy zq(elwLNrGLKniG|qVItO)_+t|C`4kMKjhET7o=TKIzUv$by9~ylHy3x1%rQXbd;ggX}Lh=3?*ZsV{S2GN2+u1@ozSOj5INKj^1JZ5$;7bRa(3{7_O4*zVtXCx7yPogP3%|0VX|=q61Kf!=bnhqpU$s z`iPJW5{1=Wth^8qlmj>&{81eoklS4qTU~fIU`U>U$@&1mvN-*WNF8bGdpBQQv-rQp zi;#-8V7-ycJ1UQ+if|ukf?zJ3n)JV>!ds>tMR#l%F{FCR##re&omT%?AnVROnO zJa{pLog61~f=B@*KS~crZSgoK?l6bOgeM~8>o*xOp8y<_8d4`gD+xiAfvKM^&Co64 zIMp(5(F(=BSjHd2p~?BV+Y;htg)GjkVMnys-b`-vQ8Vw=nefamY9rXwV(0KsIP-k! zS1bz20jhjpvndjqE;85`&B%!2^Plqd)f@s65&0TjPz4;zIi1Wo&Cmvc0_%{|5{VDbQ4^6@+KzVi&c3*D7( zonVF{B5nYj30Prv@6KcF?xRc=-Pl8ms8WwSgAaG<16XK`N-gEDdCn1uhTsv5;NQoR zU*;+c$BNDjoy}Lj%w2g*6)Jxa($HRH+ZoKklbiIWPF-GyZkO`26?_TCrvAaXdU{0hdUqAw*s_0&=WLaO8mr%3{cR zsk8ZGbe2$+f@w;)Q95Z#PJ1|6zgqy(ndAdVI5r_R*QCtHOJZNGdbeJ8qt_g?52-H- zFlLn#M&Nzeo*E#0-W6n8OBa&kQ_cY1PY zP!OrMC%0}@;iYl15H8UxMQG+=)}AyLrS;7JPG-1aZ)3P&Fwa&-CRzxdhn69QF#A;O za0>L99!0+b$7X0mj#fY!Xm}QRHq9nf3e^&;D4UXlOPe(l&966qXWXW7Q<9 z?c^(!RA!t{(7;;9C#Po0WFO)^cC9@{?6;ODB^%OoD$Qg#(d_ABNKb$W0)sK(1?ZDP zs3EAUGlWW+@RJg0c7!O{`!wl)!)tBS5_pzfHZ2f<~s6`I?RX#&Yw%#;KhR|*L_c4ImgN{m_?B%QQcX6F;lbk>!i zTWCXo%KSDbnV?is%QW1#28{O(U?i4`f^jAk+ZbS&Tza#fLw?B!BHS5C>gm4uY@{ex*%`q@6F^Ih} zjONk=$u^H_^{gFy@h#413>z8*i-z*8hmKK2MEo>}tYtrR<1?Ev1lt*j!J0EQ8;S4{ zE5c)%S}5s7ptg=IRg=e|uA21OQd#L$#o&k-zEWEa-I^{1cwhy<6|7kqf?Z>27DhvE z9qVr!s!=$smU8~;6&mA@#?%y5LwfB5d*#QRogsgk3-y)!wbidp zq}j-{kqNQ+(yB~f-E`-(!dP3)eG4x^3(&(I;;4q;rVXOE(E@uG30Y#%c@2i@Gw#$} z?UbAZ7hN>W*?(#o!nZUC?g-UihmOklHy;Mm83a=9n-#kXvW7LlXqZA4gLCB71}K<= zxW;g(HYt_$xM)L*m-(3yP-igbhrE>sEHFjEPQ`(I_;6{v%UBd|86QW`GsV z^05U3;b3hK-iYB=9AlY4aQp_xm;iQLh#U|pS!?YF^FpXigp3v(>SP4#kOF|~P&#F^ zth4P?#j{iT0KK>rqzOyIT}$K#);(|HH+hDGi~TDFss*l7fjRiG84|`r^OYO@7c9$; z2;-0pXg%Iz1q(1=0ka&95KWT<0>GJ5oGhlQ#)G293#HJo5P-obLVq8g$z6}VMK->s zm$2i^<7a2Hdf;}-3d-wQv!&df643r@mkw)B_DMp9uAmcMi)Vq?y3GLF@E7PHc8BR^ znF)HG4g*q{79yAwT=K8-E!5H{LXZS5k0zG}s%Makf^Ogpc$#@XIC38~v5^p#rCszo z-}(itRfNIog+T#8Pc)P+N8Ed^$vaP^ZVSAu%{t1)jxgY|eD2KU)Dl@?PUXJLb|^(? zl}tjCWv`JD(e3=YX1y%tJgUyd<)-!%GicwijV0oWg%pAu*H%s+Y9V<^_HM2!ccpwc zi1Zu`gB3iIdVM-qsMRQfV%=8D&)W1AIyfQJP}Gv1If8-KPVP~(!rfNsn;lrRU73+M zM4zIe5x`D)OCj)lyfD{+h*mClbrrkV>7+%f?k4hCteLo(X1C|P#R%jRx~8URSic^$ zNT6k$5sFFyDU2H8J$j(pc&teM>-j-BrDbDhMHik74FXnxjpf zZgpq?C?r~?*G4SDDcA{0qT>{v2MT_#iOVSjg&_!gKF~&4|X=7Z;u=#2U2^_&F?$n_>*7QXZRD~Nax2K-vp2qwClu16rjsg zA$A_63@t*BTY0sH~xddZK^T%?Lu_gfilzD1cjQZjVWrx`MwL^U>rEj zK0Hz0$zIbBi_vGly`yVrQ|^c$Aedp}Wc z$<=#_z5+C>L7tIiP=(oL>K?LJX(JB}3pCIYVsN zio^h@%w`7rcN9ShgiLX?l|jW}DeTfs_O@tRn4E+Jk>Ga_W~4c&{<_D9_cXbQJp9VE z{0C>s5oXLVQ*TS?%L?jb?p0Bf^sCi+jq0UcSajnxdZDqS%PZGXjg&+ULhIO&1_-zV z;*Tagl7Oyn3_Y>cKaNKGgFye1Yiq31Nl|Jb7-rmsqU1C&*CNJDi3?I8dH=bc3o=pJ zprKE0R5KY_>$q})eP8l+(VaObq##GW{eRgL9BCHpgDnqJ({?|6vE-67_?(EK5#3-P zPNWkhtv|;>w5qfC4F6jFeO=l9tc$Y>P+IsMuRa>HbjD=0GE6HEGU?f=X#f40MgS{v z{s$xyP@LG7VIZ40hU4!L+K%HNYAcB;|F0B!Js8SNb4yv&A~94|`w<)!|Lkm zxe%^MS(-1Z+H$ZdiJ|riMmE?1friAV-Dr-+8#jo+B7_)51}9yf=bi; zU1`0Vcj0wHqxUd6PW^`65{9KN!-^RCZXck}_ zwI2$PYa0|s;LV1PL1QKjjP$l>8_#7lBMni32x|+%)d&bUz+Vuei9sgX=grLFPZ}!&0+=iD}Y$0E@{C z&z{F>13!A~F>+}Q(P!=pR4as*NnOJmgm1M=v3&2#XYed*i!v=(#=x6UK^vfnPGEH))#*B#j}~q zFJX>mv@OXi-flXFX^J5&E^C`d$Kusbd6>(jd*VQ#W+Hfu0Y4W7;8eJvMWa`;-#j!@ zY(VEF;T%4LsY5xfa>>XL2A-%aBOF2FkKxI*;ZLRVzTkI=-@|G&q`k^yzs(_?ss3_s zQmfNVmT^+}gVc3<5Kx>75;;7VyYAR0A0wEfs&-DiBAMX!XzwPHRmBn~GIo}sTQ-cc z?3hNy)wF~r>{Vt7-Ul?vvoZ?sB2c=+t1wxChx~3Fu@<4l4pluBwriB7!fPZ;>9Pv0 zv;2W+&HS-)Ct(>IE0pbgmBsjY1IS>U*B@hdXwK;RH#qgXI zs>@bfK0eF502&Q9&|&V*T<$?L$>JgjNT#lRK(KJeO*NQ&6Xqr_A%@8D0cvF} zw>EIdWva@8s58GykH^Eo;MB-BH7MRoO$Lx+)QoyO2(pz88pW?rbdxHahrN9oy~lD< z{mVe@cP`G>B01rr$KhLQ;-U&8Z8&p|G6A0CR(5owOOFw{%oUIlD<%+;_X^P@qElo| z3>ECyt3Tk5euD<|GZO#W3X?J62V;k*Ws61yBDAFBIAw{#i=#G6UQj9LV?mbwScMZ1 zMN@?&>_#4w*JbOl^R@htL3%AfR1T1^DWpG`*gxmUGbJx+vdc!Z(TxsH+0z?%&u$0> zmyv521f?;8hvO+8z=ErSlWQtM(~pSp+uK!OKDDamRs4$54WTgSLDd*GIdBMp-rmQg z(S5+iZa8bj=ly=UJ7aZO>b;Bv?O?tHv%`_6$Gj^AZ#(g;YAh#s;MfmqrXt0Q(h-Ha zO4S5FMEr}fd8!McThxA>*0e+}wQ~q>o)xkosRZutCliWAD_r?vjY7RXWXbnaooL<@ zlw+TB!w+1G0avZwOs04_(n{_Fn3~$ z>L3XGX0k~{IY2PFrn9=l!~O`3G_r=?XE3=0evy2Mt3>2hQlztV{ntO5uVRyTNGWvx zxE6P`=gN>0Az=ko0^S45XlI$}S29tXr#j8nRctj*cH)jF^gP3OJTNH%6UIp`-0n1| zknecV>zNuQU~{(S87aC1DKMiv-zvH$&yn6Mzn6b&L6B}{o9_;}{2dB!-UsnIDGhn~ z61`xh(-~v-aGa$|DiC9P{}qAo=)L5&k%cheM5y>@&L`Y&Z&SFzCFMmIVdts^@8Leb z%CXuUw*;EDKcdeW1+I42<`gGr(|N4O87A$?Mr`VNBPAAXV5Y!cGT5{=yZMkX4G^+t zHv|o^Mqys)91X!7Mr0fug&F9*H5Bj!8yDDc+pCHuK89?oFC*{<%;@=+s{qa3FKa1A*7Fj4fem=p~|q$!_K z@d#tyG@SQbr1oDaZ3uqbORvP2_#T3vys;dq4=G0Tvt23@zzB}plIqbeM?lk$z zngYqcFHM$BF1xm3YN+Uz=+F^>Q5ui8GX4d%#|nqJA-4^HkpE)c12*JJ_Xcu?vAcb-4c~Qs%&`$zS&Ns1907H(yS`-)LVxzNAmQqL4#zN(PF-O zI8bCyqj)iZ5%``7l=)<9RrL7LL3qlL`Ok5pAK9#6qM%Y!p)YBS3|x;A+&H>@oI)+M z-D$=jfmenL6(%Wn1~WaG69XCHl!#`qaSK&HcmASId0-h2ks9EW8L)Z9m6^=Po{p4sGTiOAW}uG7bu5N#;yWe?qAN5RZTArW#Vp-tM)` zNK)=kXn@o=&&g*ErH_~#^))^w1=Bw$_W(%B*H;yO>!33 z_F^~*0KeQqsULd9=Y%S)0k@2SB%M;8sM3GA7BH^&s5 zX*XFwBaS}4afRTs)E)A9B8> z^r2duTBRkmPepiAD9%W)m`xOQHR__WRA~TmMW-c+vU?mYc^JgcxH6{sXSLM_0}R86 z4PkUl$+_cD>2f+|&;&M!*M z?^4R2-O|*AJTMO&6^uGf&ALC3g#NVD92Y^$3NM7+R-69xbJn`A%_xWT``z{6omG zt5FG|R_v#RwR_m18_ZQKHU{gdV%T}ok%LX>-MbaBX;EY12s_wI!^+0h0CB5j+eRhR#}kG3)FJdFF-$z9LcbdHns|TAYNPo) zLu$&=RlMyv0|BP$(kVdIZfTf7E=C+kk~%`%sh7N(@+OIF`Alzz^vAUau2fl*eD6Ss zK-kToH+5C4iNIf#K~{3reek&yrrF!_+xs&s%OW_Z8fq~h%`8)_QPqQEb}%W+%8U%b z{~+(4zUzScgpW5?W7{@Q+}O5l+vbUF+fGiLrm-74X>6O#+j;J0y_d7r+|1vwZ#I7W z`vF1Tkm*`chOF_Pi}#C=rJhT3s5+lzAaJ9#alogOj^}WhieK#j9=~1AF+lV}%TeMK z?|$Q)7j|-1!$h4Vn%Y30LN|X}#YwDAHrN{R{{~xmHbGQXT89Vei5-CVXJz1c6)_ho zu#UpP>2?bS=hI;=;%2S5&Lo<4OIa6JhoG*=_?y8+*+d3^me`m9ey;q%?s(-?EM;

z$Vf+JM6pC)eCc+2o!;5&;PKkXUf9WFLRt{bWwkg;;?(Y7DWLU=^O z$j1iKEeQ7ItH(}?;x!gSdB5n|I*rWwQxs;tm%rRjtK)`-gBjZ}%8eWl7{Fk>Mg!nk zwd{88sGndR_W6>AWA#md$y|{uIv0M}1^gBZyY-$PsXRlJ$fpCG-mYK6WjOFn@ zN90I{DBBaEl7b)AlfCAIZzl=VN6UYM<|!G#!~mT_Nn#RQZ*nI~R>yzWPLsHF(#kJ_ zFxxA4pP-Jg1JHek7%Js(D|60qqM_G% zFs@?Vi>I{V)7C=%=wM3{8D#jL|G?Gk&v6mYK9*dYhRhj#k6ZBESpabMNlHdWx-$ZG zKoJi{cp7v+i3_qcQj5sZNM;zT1*RkAAk;7rITI#S%Q!JzrnXjp#jV%;tsa>pA zZXf=%*vb}%naEXUiqb0k4m@E5{q$LCGYWL?&h)=Hv4>rK;XKk&|4{QNvTo?%#AhSY zI+|hkxBr6w%~bN&y(9ySaQKcU|L0rv{x_A@WO{$lTUUJ|=7+oU9qVU4?t+8%Inxb~ zU&8{3U$FR&)r8{XccbiM$(%4@iM_QC-&kbN7_m#Z&FokK|5#{vb*u$+T)xr5xs(*; z*WqR#toIZo>(2B{q)8a&yIbM$OvlJJK$fYC`6;R*_2p_~IwY}s*t!Jo<9vQoQv9a> z68TR1W(UW0iI2O^_A@CMd{wk#HBum~Kzu~eYa)s@BmDz8ncwg>W4y#~(-AoF(|=2m zu*-ZB<)YzReToXU=bsDX-@`&Gnj_#9Po}<4!$TJ{xA}l7P{y^0zRSV6&MQ z6q?$wekd4RHZ^h-U?T|!?(-w(ZGDzw3}f1iRU4W0ompG!BN8%tuhmK?r)@E~|U*OV!r_ zwPFQMKH3Hx<4Tk5f(M!hmc2%>jX*Ew29~3?difLRt_G00-0mvB*6Ta2VloUwVZGRw zyb@whp^dzCd6lzZNe8$-ec-wskCjMgU^$b;>9UUi*kSGl^3O5xg6+npugMbiSUSd6==>6La1Pwo5=yHPQ8jG+*FQW0V} zPJxNju={ilay%2mQ2iy;eZe=<8q(3{a*OBa)B==bT5p(!rTmQZBC_PX~Kz3kB?#H$qr zc_n!oZ-&%I6FjUgtIMu|wE)I%@f4J(&v;jUGoZ^TFEvTC4`rK1fZLv2oqbIwJv4kk z@3r9KDgwUthPzd;;hyx1+gUx13JF{^o6u!!RGVPbO$=S zVLRUyOG(&eIGW+a8Rnjg88YBBTDIa6w-2vw23{&ME>^r<)AE zKD>&scY&%L&Q6>B@7skM0OT$;6p5)(PDJXUWlE9b^M12e=Ew9^oiNm~jZ9NJ^U2W_ zBl%8p!3ckT#B=VmurY~hX4?n|O+WuBOz7r+@?P!{s=D-;Fy|IbT~@$BzYm8zHi!{5*=?{#5XwNi0DXu>t?nj#CO+FY5fp*1%o#BI3Sq%*p>VDy!$T)% z>fgIj{srIn-lMfLz)_tQs|yV&7LRd+3ZOuCdV5U%+>8u z;oVb1uSjOqU?BJHn3BT|J}naQrIA`{_e1dr!eD~zgueT@jf+PM=}5DLpib>fT^5=p z?sJ4bB+e>yih;q+b}nCjvuKapihxkr)Ic<*rZCrWmEAQRB!=x0biYJ#@!3OvJvb=O z3{-n$h0!i~mnYZlMgAWLAg`UrW&Ms5DeB ztqW69Q>>6QqHu&jFL2JX{zSRi)C6Ix0i94XC7zea;-eUZx0A(LlIAKs%A`sf`t_C4 zxfr_O!xJM@ZLL8pF82`GP{ZzUiL{Xi8f~0`mB!Uy#R^YU_lwm_L7^BheQsPb{ubqT zDa7&1J z+=ImT!nuwC%vkp=k`JLR0WIW`HT@KM{xjt)Y0W~~PZJIR8gxc-eNRISEf{uI81qr8 zO72n+Cw|o$S`tbGWpaoFldT$ySXfrOt_=_7mz55M+GB1pVfh{fn}Ve?3HQeLbj7on z2n^CRISgkR>){F@LHT_BJw7GMYYFjm5_9JbI;+pjbQVa!1A-s z5=BLN4zA)6W!ofL7#n{=^ssa?j6|)ptqd%+z&njZBX#_|W$h|d@P%|pDoqOHHG?>mo7#l5R6>QnUA9r~#6+}U%%iGVl&p|$TH z{86qW)^8A~HkeNuBy3h(W&K7F|Hah1hWZ3jU6)NK;oWooJ zB2v}_proXRF#YaQwhQC_PJ>O1=Bw#rM{MPh)4y5&!k4A-A&k+2+wT>q1y?Gz*=iX=&JFZnZ_|Kx^KAW3y%>p_ zWi##v@5C^6u8w#60EUFaxMN4}{LTW&AJi~$GV@~3Btl=4Cz5_vVx~}fl`B8y6dPcJ zYx7Z9%Kn(dDrq_13(=KgTs>38v&%$^QSIxSV6x3C-{e;XDN7DnL<3LW2*y|+$ZyKYf&yNasGJ&s;Gggex`7XN zgtdoGbx|lvjnTJbV&GOpq#R9sI}qMM-hw4R`F>ewHS3BJDsli-%p{36brg$Q*(G&lTt zbw&s^Y?WIR>7>-PTt@VH0fY=Ma*4;?rKZ+bIfF#Vph+Z`Z>IgJOhGwMA$k2&jYe5_ zN0E1j@l&=7R+bjKg7Ep$^}EwXGzylZg4Ob9k=d;RZ^Mv+9ke~l-|aoD-3q49Xa=M+ znwT+47&MWdJ)AH9#G#Qo=DemSEJ}I+8*95QYm>_8H`o%g&;_cL`EoKST10mGxTbQX zKWg(zMvj!v$gXC}iu2)Ek;z0$!$b+T%-$%PT3{o4NiIA8EXpYof2ET!+0Vv3oCKC9 zHueSX2_Gs%Zq}5)H;hl;&L2l23C5FAw2^tAs~KE@yw3G$eT+o@%Kle#jFIy$1~)Vt zv%+?bNa!vPCuSVK>M(yU(5$e#vW(KeurXMEXHU9UqOey)Qq7Ea;!V0jiLd`rqACQF z`XlH53*H$e3KhkB;bVl7q-lZpPs`u!CgM-CA55uS*tq*Nhc*Kh5Yk6IkX9H->(r8J1B!mbY}k+ZXcu_Vq+IKdoz&#_`FiDC=X zf=j>o)m@9+l9`-mMSr;2L{nkl9T00f1CT?HZ}x?{7NztPWt}Bhq#YkE62#px5K&$D zBI|K#QYcpzrGpz?{T}4@Wu%~5IEZC{ZbzvksZ_S;Lo@dL^3u}b$w2%K!Ca zW!|UMu+>x)Td;mEN=c(zsVPI-HZlK5z_fIA(Q5fTX^zxjP_|7~o~{ruR%T{*#Dq8? zPC#Y+T4TWxPup~>L>^xJP)bwz;SLjcqU*mXzrdkJudZIjP7H;pu)rx*q`s-sELFfM zYU`wF|EPcS*m=~9RD^LdhDu$fc6`Jtz%D7>Xo$71Usn) z&Z_mc!Hi?-DKDvD-kCCEY6!OhCorXmIrSaTw0?5Pg&zs)-hM{d>QCMyHgWznxz}WG zl^I4i_jgfBO;v`u7in=P?l7No}~o z+*DE4BVBg!Q*bYEH~dsrJ5xwaHtboN-5;cWPK^pzgvLb9FJ?_ahueEuEXYRc?x zeLrQ|-Ig-*TYdrCwg%ugs_90#=veh^PMGfB`ut-NUGQ4NP9KJ=WJTwi&UY!B_GRE0@niG9)@{XCb!ZQ=|XMe{>-cNpck$+Z0iJ%MAKwp%1j5; zm*6c+hwhBnXHLTswK)4bW+4Dj&3dT0-Ax}|NnX2?Yc2Lyi-BolBx6RfEPKegrr`UF zSsoUqqNmqVNQ|k?KTAgEx`J1>h^Q#kvp!W&b~BWhC1 zXxGI(_=OsiTlRI4aPmb4LOGrFK}Q`k?@^gi8swn;YSqw^&Y5P}ij|}Y3P$YcSa-=y zdhMLiiko{WSV`aP>12*jw}gMus%SMTb5DawbJSf(e{7Y;Ui0|LW$1{TS+wf^_{4?j zg**I^y``P}b0K*lF6tV~1S&Jou(O~D7i(E7BF5^kh+F)#MxbPCT3}^4d6$(Aw&LDm z{H1#=gf@+6M?U>}aGv#l1>=2vt-A(=Lw(BoLsZ*O)qH$yO z)@sZWZVJAo3y8^mYOe4+$X-~)yH!-U=34X>7m?xwQ%|+GY)WU#uc)A z@AVta5r!{j1z>G?UoV^;%9@?{^`unQ+GgRpgySYITyb9xTp>#ws?_k1EH z+clB9o9@#JZc!q}5nIaE9CkynSJn`-bY(s_eha>rXS~$9d+Q{qxdgtaqI;L(Z`Lbu zw{@ns31kMv%oV-ov?7D*1y{8XH3pfnjq~t3#0i43akamS+6}+{WqNV@O`9t6)PCx2 zTF^eYNa4osa~Cc6A_uFd;p+w9q&7fY8eb~vZn?I#yiln!lzf8nXw$vJaeB=7yNu=R zV|=r*Cx+~sEUIwp_}nU%yhq&EN1U^#ymJQ?JC9#B()V9Df}e9!9w?o=dt&?ortx!r zWu;a>7X`k}xNde@piX7HLZ7SDmhcq5mSisw5Z~heyiH`0d>+Qu?P^+g%lHVa;uF4m z4fbAl#?LBlQ#D}KcA4Jb-MD6==2`UN^eQx#APu+tP(T6bFa%G?b^T-_W0h{Gourb%^B%uDth+0EfESa6+4 z!)td{KlV@4YR}LU;s!48QH;*MQ|s@9Q?a3#3KiY=;vhhd*|<>sKahWuFt=H?3f{7!*JxSI0aCkmdzGCzs0> zZ~k1@N_yPcQ9xoz>M&r(}@JtRKzg4A$UqB>Ok<_u9U9nimAB-PX ztfV3lkTBVF)^`iyX*2>MYTRgLiNw;_VQm@B)&vuhjf*SVU1yT7$-I-vW0S* zJpMLx)v9?anuM3ykEPSOdVCY#c~ouHbCrKZq*k-n{Z_RjrQ__Lw-8C-JM821)gWI^ zb-3N`<-<1Jj3fBbWvPKmvW;s6>IwW8OuRKpD(W)oc_^T zbGoRc`_nv2v$nd)+j;`z2Qph*E%GR+zf^Y?pNNS;fQeUU)snNNW&4B6zvq~Z&j3W0pt?x*@tlwmk3rIRyMJiAsz3|>)7854I!Rul9;hx^_q|fx z9f}A_SF^yp4by7{6^7KYgYj_n%XwV6)F@(FKWy79)R~&ZWuFo!-yRcAYtxoz3lcx- z-aMjMb1&)~Vx^pR<-2Qph$Jl0#KyeD{1y2&ope(}>pN%%j86_Dz=N~{UH6QJE+pZR*4UQwL z91M?V826CHg;5j|0C`}*hLlAd`u&L3G|fNYwV(>Wc zR;t7pRY7O0J#4RA8m(RURr;KD!cbq~f?3plQ50F$bXJbD+la$NV+(BNU17@f7s$Hq zTu*A#_F;^NP06JnM=0?tFtKo`?VKw+DF(oo&`8B`L1!nuiBH_x{dnuBN}HNlMeCOV zdFIrexOCQApfS}nG|DW!=a@2KwiV(+L%|zho6&Na{MqJ>tXw+P0a9(rd{-IqH2^r9^Smpz_j<+vzLdP&KD8y zyU!j1xEI+BYeX;SSGSM-tIPHS8$F+cZ+cyIiNSfVZQ0X5yxNiL4&c`&SG8ohoMR{p zN`wjc-d^@JU|)HsRwY*-S`bNAwD#BKhevpQcEIkhi-8`h8Nr|U*A3o(*J|ezBL$sK zY6{}GYX0VHd<-3&W48_4e^)VTQTaAbfq$fJ%Ox$6@3RPMeyL(s-y@Z6K2YmpO=1qU zcTxMvy~utT_FKQvHw}U_nfGUzwOh}=qJHdXZ*mod31*4bmmC^D5v#qVvT5#qb9#1z zakZS%J>ldwHCyu7a3nPU{EChQ59D^Nf7M3eU%f|y^k8X&wIa+@8rUBtMW=yJvI_lF z<_yZpR!W?HI$yrk>cyX0jsa;ZIbd^P-Ow&b+{z}~KE?NaN`&?bEit%9vrxrb`m73; zaw%j*s>8?*tceWkBp9Pw{d7f)DQ&K$e^5SLcLOzxb?CSLz~uzJLf-7- z*-G94eW}U>cFVF@cw+i|OUX^KGwxAJ0K1Eg6_#3=PHnq#39EYThAtk_I}f8RYkDFp zVGYB3TRY0OB8x*f^>4508PgEv;JCC}EPM%(0vb#ynYK($=Th?JXce1Q_f0P<$ytab ztj2}+Bh6gzc5xZn<}eDa_f3E-*;TUzpQ+q{p!vMEagxIKnoZ}nr%~Q6jJ#_1Ixcka ziGQquT`}WOH9;Mg!s-BJ?)SxMP|z_~_&Sy8$YXT`@Ley>WVUL+t;idXW((OK;F&d? z2C*eWHW#4i)5XZJ8@8^BU(eO>0#~N&^fJ5u3GDkzp&}oQJ3aP^Vv$^yd<1T*SjhV< z{#UsvME|?0>SaydAlQkl{G)Lp;tX%z2Qx>Yt?5S9eUvcci6d+5N(`nD@;tkX5*sdhl0tSjJgQ`geZ5SGY2iqZ6aXkhdq3q)G2VOUcPtA{p?%GYg% z+3*?3=W>`$6rA`{AEhhTCtb#QBSpKnTDGzBaJQvUq#ID-!`S{% z%Vre`v=Tv?gD=3}DS3o70%l(&{hqEWPSur{cUVXx&Y+2@%;ypuqxtDI&2li@{G()W zBiELu3CPPBiLIb8YP5QBdy}|Qi?Q-po;ye7!ylBw!~qxRfd^jDAv!xm3@e%1VdA=0 zJveoZz@D)RVRNS!$x!Za?d1X!8X3Wx>NO{$s$xH?yCD{Rr%@rcWT@+%_@$PfTjm$j z-?U^s=D|xCr#M4cU*fp4-^U&j{=L3RKc{Px>F%$X`d*>x`lYVrLp;Dw?E_`$x2+zp zD4N@7(R(RRg&xtxl%jdoSV<51j02F8^eJOt6yxj@p(YAHnh#7y4U z>IB+R1E{5Zj2D$*DrlvDYi?9bNp^%SZRRPaGpKNA!k1HGF%IxBND~tU%E@p8Y%qVg zafBM3$O;5A;>x zktvjZHqUzchc1Ft)@U!j*J5JU&}L&Ej_d4(Rg#J}9ntkTv31aFH2ZE->Iyk4;XXsY zNfAEhSh0bF%mXG;^$@tf&7!V>(nq2kS{#8c;XfET4Trd_iGfO4Fy_nL&O7OzjANP_ z`*y9EuAmNcQc=%Z4<21nuLK%B(G%*wupVNdc+>-xy1STV2{VP^#J3S+%~A<uLsX1mOo4X8|v>+?<})CUSGJ@gRZar`%OIr$O`IElv!p$iHP^IlM& z*RXiHw;SYO2h-4VuZ*1si7-GK)l}-BVgolGe3V+gST}$P6hNszz-WFRJ2uXMd`X{I zDSz)#r>Cn=fenTD-S6+r&kEB%`|6*_QaJJyq)Fb01IF_swN;>2NH!I=_Au~BksVEAYtKyW8DrvwW%&WfY+Vb^1E}G_ zX4=8#y+Y9mXavAQaiez_nF0cj_pKM3xknZxFeCDLT-?y0Vj4yP@vm;1ZoXQQ#05jZ z{>Ow|HJ`~4-bJ2-cIgP)a7oKCTw@w3?-9(57cnbp+T=)c*({hO`Xk{C4ni=n|41Rw z-v>5tHL%5)csJ5TPLv(-M%7Qj!tjlT$O0GZ9kJP*5?l)1Y9|lm3sf z5Q+biLd1kQ#5pJ>R4q}|?A6o-$Tgq|G)1X&_}FyC zICSMjbk*eaqyTy{yP>@S5@EoA1tJ+uI?We((~W2khb3D zrq)(Mn%35qwvJv<*Z*BCN}5P8EU`$BSQD9e6b?I4?T~Y_ zWc(nLd>GFB{-89zxXr~&lDT9QBeqO-7OP5WaAA~k%J&a&K3a?A@UlUY2MpRr4#BlN{-IGHNE z)PQ~m*)A^X%UwTqylZVADpD`LG6-0Y^|4K@(Vy2&G)HMs{hdWY;L{oZgZd}?Q-%@h(MCT z%B{Epo#`z=eZd`6QT=s42prwwt)$FvwxlWzqn#i$3VzhCwtt7>#We(K@GM$j1(=g& z(lc_?761P1qHCcjmp=DOBjdJ?&p)xK_otnPs%iQoXth%m9#unCB*#`m-{{!u%U}hckisVHF*2LvsCwpxvAlBq-WEC z5b3TjSKPp6oER5~&?=0^0#fuD9pgKeiw?;BD>y*#-DW>*U zGnYkbiZ}2C1y<+-0ykL41g~Gc&h6?Mtm>Hw@u&;^|M=WHPvynwM5F=*S}QS1;xA`n z*mys-rZX;E8ew2KOSW*@@ewX*u5dYb!AzPP^EiJ;TVFF_+i*2$(%0BD_Vm5;6{Tg2 z<(?q8=KI@N-u-;Kq{BlUNyTW%HFpd^kwN}zVTy27C#K<;9CJ|)&2634U{SA|A_FV~ z=~s>WN9+^6dzt@g+&YphncRZuG-C*vh7)}pS8pc z{Ds9SwmN;r#9vMF`>myTBz#mU_1>t34yKB3o8ILq26vt#5}^1QYs(h9G1X($%e)7t zKhT+6cA(a^zAA!M_fq6+RwkC2X$wRlh)V$7Z zhHlYuK@Fdr{PRT>!7j5-?_lz_8t!%^djodog$rp;?0O)Dm3))dSCrMGRLN>(aiOEI zr}-Lx%24S~6~~&aV5fr3tN2E%x)qI+nK&XJ-dk(4oN7utr@@L*)GT1HyXme~^`+Ru zd8Kk6L+w5=OjcBe$kCXkM+tW}##YsoRfo3PzwO=VLZzCO+eO2D>0YANc9EG8oI5^a zHHa0#VwzsEejpOg8Jaz(Nx+E{#<4FVtB=NYoO&|H<|!aF&Za|NrcNSy-_DzSo^-TP zvQ#W4Bf}GGRZCVXF3T-zKY*6!T}*=n6W#L-Nh$JjD8*Y3UYULiv4RTf2)06dQ8ibD z+;PfGd9J(!2;R&NeBamc^z0b$b5AzlFV(T)DU#2NinF&vVV%RMb__UbQaaNHNQcX< z7`w+l`q~YhNbnKU(bk_b=;@#0PSk*s8+-+bL%6hv-wxR|OQx!?0&MbHzs5m2(E@Sv z{44UOh_rnAdZbB>)$I&iAcxB-9X4}el%sOQ)`2oDZE+qQaQO^jPfTm2UvO$Eb?!RX zXjWX;p*7VKSUpjEC$f^D+1q%B7HhZToNp3Lbs`!Zl3B*Hm66KzNP{h@^qXik-JOuQ zs^uMV`o~r|o0~i@1?QY*?4)uE>15Qb;%AroU&pIpp*E7LZT5`n*t@}vSN+G31i^si zKYz&F!=e$Z3`Qh&I|U|3F4Yf@eAa1jn9%DkD3dl_B-VIu7dxQDPCcb**nVa%1fPkp zF6!vbEZ8u#FfJw+SyTg-aE5t=>hrES0$*H>0d6#`2+@2{y}|ovx2Z~mj88IW5Dw=kUZ?uU@Gb!Bmk%6IM31Kqt`0@dZvCM zo>5w^Mx0kv*YVT5+qN-zOXK8ZgZh~-3i%%-x=e_3%e1I*{^e%hDr#W6&zj8_*!q;~ zXra%hKBmKYsM92i;Ov0_gL$2AD{y;Ej`e%ViL~H$qF(AMlO3378P3woBc`RMoW5a> zq}_<{bPm~U?{7DK@!P~-EkCrCRJgtNJEfl(1d@M89R@MOR}ZPXVW5K9D;;(HhGC+ffCbLApRN0ZQ4=BtR1BaBY?dU}U+?rkYRf+PXFCk(`8{rDnr~ds zKnZ##FKD-i0SC8t#0_-7NWf|zwapVY26JxZo?i2D$JboVW{G!9;KX1VkBoD{bfpW+ zOeh6ld|lsTu)yA-#IST4KEXO~<4=#kvTOH3pv}I)5f`dZhKHE2AUK&EgjN9EvZ1bq ziY|-?(ZRp>GF1jkGt6?Ss|U^nPuDAGQyVTJV{%KMQL}kW!!&G(3fDz`5XTfn2Nn&H+(uOV*QG8C>AuG)?q$y=#A)honnoJfQZ4|~dKVJU zRA;{uufqxa8}15jU0O`%pzMh1?}gKTWcTNCqsb@H^~~(F&^_a4k6s zR~Zp7aL?4IVZTJ5|!}YbdA$++{N*rh&`!-hG2_t$goJVGG9qcdIjlUjYS^8vSJ+>2|lI%fpX=_h-_bup-&53gGw{u zHVD89_v}n73YBcZ4rR#<@9WIrjS9lW<~)%C!Y!K_vw08Grj9?y{Dx#!rsW-8ad~-8 zse--HCgnlrsnJf${K+3RR;2Vit^*C zinPZ<3(X=JWK!`X3!pu{Le-pm0e)j^wk_lCX$O%*4+Xz4?6r>V#Ay`~bObJ3N*F>vMVpY)=YfIg2ggr^rMo&CBryne0IE({h}S-kC~{Xc{SAxo;53= zxkD1*RokK6{GBTcU<&pst0B>{@UTnqCnBZb)H8IV6pmE4Mq|+>Gl8i-0h&QH6JA56 zp3N9}xiU2vh`Cbl)TS8zsx8>)P+4BrNZdA z#n_orFMK>5F2pu&#%JLkMU_KQ&MVpFB+GVqG&+UHb(b_iM~kZ6b+us+Z6_-ogtrJS zEPdG#!weh`x=z?V^+%-Ox?pH zMY>SwBHnta^!UlIr*tk`$=!v_a$tk7QZK*0(^Hf&=p0(z;=U6Tq z_T~t^P00*Cb9H*D)>hZnj;xl&CF<(xeAkB(gXenk^XmJy2rsSNk7}KiE>Y61kgp{@ zqVq7Nj-C&(gM6I*qEdnsKgM(Q=yi}gev?5>aDc5-RY!k7 zr*CAABKh|%Vf38I7}ktN{fy!gsjf*Kr`GPazip+_KsR5~qJ!uTjP~3a=yZ}H6I^eQ zWw-pAru^a;cyEg={lHE)q;X#{hQLT#m=q>`|C9W%Sz%jo$Dna~9ChQvZOH48Gofsj z{G{Bc4&7--dA3<^9cFCyn~Vb8cDe_=*XM+;823PT55 z53oyZAgf*d^f?ROk_T-=HyBWv&0v2k*1st-hO(9u(NRf_T5ewDe|?z$d_H(ZYmYcy zywKWDpg!i10|H(|ee?5Z5zR@K>H3K9{Fkgdf}_^!_AZ+04LY0{h?+8~o*}$YHn7a1 zm$Uc5?JSfXC(cN?)2SNOu(nEqb$(Bsjn*f7#GzL8wXVt3qooUfZ4*3a73-Ptt}Rkh zPT?G*9)E07EbV%#RVml&r`pIvj0w=t({;!)ty(Q#B7@Dait9R3DYdDo)Exj>SVVn| z_gP{&C0B;UR*M1OHTtU(ucb$R=(&|lr4q`{KI&=i(J;xvD^m(E0=6Or(_<|V&0`)$Ys{L~I_|s~p+8J|u0@M>A>3;;)h46-sLyF~*>8?q8 zcTjBRVCCSua|p{;C3kYfMcemQVhnVRMS%GZ&@d9%DPid+E+Y*fg!Qc(Vur!>CVb^}3_HTA z-g=BQsu}D(q(&;tANX6p$3dCdZhcxUVpk<+^C^*t@a*)sY%AAZ|RKR+0$6xfN-oN>w-LgmQi9-oo(>)=+H z-m_VTV(O6K3;S!`vn!C{@n$d1t3m!+BL<&rA3d8;ooXC06xA`MJ~pb&JLML;S8bJh zgvcRGuLBlezkR;pBvX@)*l-%7bmu$A?zhTQYCjA=!&E(O?zLkHyMFkkcjTy0eB7CM zoprS9Dq2U_KgfGbn0NgC`nwzd(EJx1p}{yM?--zZ0X9u&qjUA3;;@+Sl(5w8IM!CF zN|MaJVOgfm)jvSy%HcU{ckB+7K-O1!p+;}JAX&Us+pCol=JK&W4P&W+aG-A`&Ae5=LRrn8$trnh;U>RUUa zagntG=-wi8arwN8d$y{kOY` zo7!=tYy8@;ggS0hbYtLXJ^NMW7jNBazrC;XpPD#}Fc{c#q0=7jm3ikG2Y~`fakDwc zk4x05#p3i|qthY4zzj~$(ddsidHAzpxav`amRS29LJJ{LZ6)&2)DpEEsncKd+b=@? zYm10+BbmatQZ>%yL)C1*87HZPjgyJt*Lj!X(EO;<<$qBXgGAIG|JAC!!zo zu1-u@PJ=Aezd6XS>L%mKVydy^YY>@nh%e|s%MJu|eMr~@=aQLrG4!>^PNLCLa|EfV z9DgFt<%dxv?G(jf0SEMq4=3wREcD&v%;ki>Zn3iK#Y1odI4OR&oV!5N^ZEvnJ4ZmJ z413+ojz-G$NWIGi`sBux&h03zznR=GwqGeF3{Adc{Eaeh%rs1M z7l~z1?c_Idl#!y-)6{=b9Xa^VbLoDO@lB#LuE?oO3+lZ-T+{w#6J?XqP>xd<8&`Q? z5fK98SgNRu=HyyHH%vkKMb#oZH<5=oc*Ty`#)r`_We@Hu^KjJV(Z3C;w$Or?6?QAY z8=S(SDTrR|IkV~Y{{UM+q`%dYwj=Y~bV3$u8#1}gmMsrDS>-Z>Sn-~%E5<@1UU*`Z zAWdpwR;!Fo(@?hq^RooSh4MiYz2mnhkog;Uhm+>rmc>8TA-Nf55P=6XA(0huG%tTQYm z>$A!0vD2$1CNAodo0gkv5#9E!ZH=?#c*V1yE{-m34di(|_*y14Y?x7$6=f)&v^+#yqBTdURCq9tj z=rlS?4dQSlr!*nya?Dv$fEwea3ppuog?g63CSn34zTgGOQ-}#x2azTIZVWomK|-P! zJh=Hli&~VP6%&Fzhya0$h#>=Ep0gZDcgXyxcwCg40jtq?0 z7@)AnPgyS^Ltvvs$e=V}X-PqZb6@!GRJeA*us)cn+^%G3Gb~{yeYS&Dr5y(8ZKVEd!v|XG0KR&m z3~~6vIDcA8sBy1hEwZR9P?r zVvZo2RITL=is}R{9G3*povKlry9Dqy5xn5l!gw2S-s3(24aY5OdKCgxfvn)DQwT#* zflGuigh2{PPy%j;}`~c+Mv#r5CPUfc85U-NW9?({)J|JziM2C>>(jqKml>}$Ok|8 zp$to)twNR%haJn*wR``7L?7Y{)){C)40&jB9@0RApC*6>PEbQ1@=(^ig7*!1AhV3$ zs|2(vwYV6#gBf-pYPae4!t?q+EUrE+h2PRXbKFqFQRjjk5Y@vwv1?Vs;S&wT-DN~6VTUNuA zoEHFZtXXRV<>uI%1trACO%o}hS4w_)C7OWZH z7E^m7QHJvyjB4x;$f3EzfJ2$zs{r}h_zb&#rY*^x+~N|t+~jsbQ9p3kFA4&Y(CT!Y z5(+ODS`t3)+gtz6Dt+)9>PR+-o#eiw6cYni$!vwSlnU22N+^bLi}QpwT2)&HF9-nw zBjn$pkyg0IoLH2^lg0{Tq!R#A~BCID`}7hF(d@&SpI1bm<#mo z)-u2O-S2g6ECm-A00ui=x_*`5}<(0L(I(IzX1XLsASy zQf$3k3dJ$h!3;D+NL((7AUdCOy%D&!_mV1dWWCmFL0{X$v0?)tvp;bZy)|1ifT~Aj zWI!N1!!=_(Jsg8OP@^o=jeUugfpf3~YeGN)KdGr9g{qZfsg`_6$Ry;jjKG77a2@}Q z#K_3V$kWLn+R2I2(V%t8G76x80E%5Wj zKyK_tp6p4W5gi%&6o`m~2LU{4Z0Sz1s6YR3b;4aLm6V%2$#YO}xxMu!BH=0+KV#!u-qtJ4^(a z2vPhZw|huuiM##qu(&%6tVqpG3QHHtH_@q0j&vPg1fz<)P223vg5sbh8a@9o_=SYn z1;15TpNW49&p|HY*~i zj3_ZQYSHy%&kvX*>Owm+G(qr;%}weM z)E`(37%#LO%LzZa6VR|RAl1=LFKrIFTpI$#2wh0kUAP5A6D-ygluSINOXXwA?L@RfWlYA))JD4$ zw!1zijQ(G+aVh(H25po9N};DwSvf--zoY89w~ zEm+ZHNkpB-V2rqqT^0DwN^!h2s%iGQNUP;@XqKe&j@Tz z_C!n+CEGak3;HX|x6?Z)+!=r?HJd3Fg$bXAjM;*?1EKu@6+3z*03R4xgC$JlbjBg50T+k?L+ed%_L<>Gbl}YK%QNTS(=oQ=?m89&=!;u8qdolu3kO%=tC4vIjD>_@l49q5S1wc?a zD2R>Eeb_7NLqDt~E8qbhpn@QX0n<8BM1{A;3`$2-h*Y=;Sg6=E7=<)Q10}$MVSQj5 zq`j5{R?)3s8L;3B&R`AJ;F93m$<$FfWyN#x8Bj~CZiSpyxvcz%q{E38Y#|EHOvyKV zNmpCi3Gj>QbtMPcRloRDwd_${)d7AAOnCHNQtW~@BuSP!w;IqQrEO3vuw4_dg`(x( z(LJshXxQisfb%WA?Ml9zXn-}CSb>-Yfq(^ENMrvsUgI=I*d{{?GKjF_ zI|ed6-s2#{^R&@j!z9HoUpP>4q`f~hPj_KgBj)&LE-9yTD->ZPj7tJ%?Y z0X~$06M$7zYCzL+S_|FXk+WJI%!MEv1~ZljURYyTkca^;2^(xV{PntP#^P(9V7mNc z#pBZ0JlQRL6^SZBNn;MQEDyxMWT(8Rp$*c?0!fZoTd+g(znd97#1#-ulxj!YAi?v z$x>xkv?1c<#AJ3OWv3Qd#BEi4zQ@KLo-8P_OC~Wc=xQ+d>JlgdlT?U9h$pF@U10*z zRjRXMKIULU0VsI0D!>67sO!<~>J5P0+YJFV_1J;kHk95$p13WK2qE1bj|MokMBjMM=h&c+DXSd*ISFm~sv#)vv1 zv%k9B4)8~Jgl$85 zn2G3xlF)=yNbDOV0)2{L&+|OV9yWTtnN*W83hUWhIwEuY2B z;laqh9mB?pl1^?{)?R3Rb_3{6w2Y_)vW77jJA{;*twc3wz<%qt#sC?ZYtj`0Vy%D{ zbT?jp>^{xOTa^r95Qu6XhEcGIUl@hNW?(c+h&g+)6=QJ&Co2^rDofO34abSG7Q#P* zZc1L>c7+*b32OCL7%+XiXkZywS`Fa2|Ubt(pUs? zetYjsHzBA2p!yEe=_K5npk8D;+;F)!d#{QaKCX|mwQBF`KJH^8Y=jnPaUILCOQVyo6+6yuvPOa z&b8`iL`e{g2-nqfUPuLww+Zbgct?;Xlh^uYgYi6+B?{-KKyY~-rNIi|P)C1!q+d$7 zH5ziqRLL=S$$;wXt=SEid`y>Gzq~OV4gq|l?5Ed3Vd`iS_`Lk9Vq=;m9_YHNNIA2Y z`;jtcVU}X(Oo9I-=kU-)^O|-0E(fcpg+r?qrh3e??V`YuCTxY6W{5cKhyVjW-=$;% z#6O^dHuF(G0s=m$0l>#hWa|RDvTLK$(d2vF3dCjPrf3o)_n#(Im-? z5G$_q*wQ7;CkDgBqI##w z!mLi6lKJB!Kn8(62@uF=;Vb|EEf0iD;5LH?o-}B{Y`9^D!5K*C@a0w4ATF1rfvisM0=H@h69<3yK4iPogB(Ziq(mlQOxUhR_u2o4Zq zi=bkVOr6euGa2N4>362!b%PTxZhTnrzr$gAT8>N6@$7f& z7pFsS8=m4vj2+Fd{~jHwg7^wh9HeoXr zG!=it2!$FM2BNf-Szv*8RC-ET2;FNWR5!y2C6b5)ib#|P%R#sVcF+-rVG$W=W>Dsl zBUo9nNEaUHz(!R;awg$qG^Rix3#YZ`T5EC5romr=NEyj9Rn}T>x%$_LCOUbL zUeLYhQ7SOaC?O|}koKchIZ>q_C0$H52UUYaAMjBWok(iNKCEP(|iCi`tv_k&zhZWCyMzUt4 zd6b%;uC>4elTOZxHB~t7cJ3wZ9weN%Y=@a8xoVR;_g_icy|oA?aEB*sZ$|ZR*K!iP zQFZ9GnJJ&DLXf9=0?VA~;(89OfW(!1G~wl#12t3-LHs+$D;sa+)C&g2)P#O9`GjCY zSwvOPsxqG{--oIhXli*WqA0XWejStwU#XxWBN2)XlcT&c1ag}rR*s>84^q#8NM$x% zr6_4VNUOcR5%JKSqjgwi<#2J!?a{a0GKW6<-||H-Sajt#@{k<7@w?{(_U| zFX93Rum?=)J*h(2Ov1phnRHG$ka{4boQ1mY4I@cuI*Q7k5`Y(6YF+`Tf-E|Rx)G9a zgg&a+fjF|BCy9h+WT{A64#t)OdWmN)*$ZEC=(D;QCPv01P*r3Aq(Ia_f})Aq@_2=# z%0vb=(|V$JLWGqHq{k(>8Pg;t0Y6M|iHqv%l5xVAob>fZUF9odxya`@N~MQ8+Ib@! zP13*pJ&ulbv=@0)c*p77kxnaloVzNhK!z<)kbF=Z<|ZS9hL}KNe{k8%K5z#E$$}R8 zA>m{WbxGK;z;=_`lj9)i$urpy3p+Fj9nz3W;N?(Gkv3dl3|HHx3C;4nue9rXpBtTsRM|dBM7CWcoX)A+eM$9zRz;_Bx{2F5 zzUQ)*dl4X2~z@y$Xnhe4{fkSsDoiCgF3m6A!U-ao=u13 zDPDR^H2S@4g!R`hL#!6G>Z2yQ#`W2re#yYjDREQx6c_(qIGlFoSmZ7iHayOFa78Ar zZn+s@J|0k^N9kk&2Pp)43KN2mfJ9v$r4x;9mYaGK;uGMohdyw+)1BjiS+7f~Mv9nD zCLTsz56VXFZXhZYzHfTK3o8!kgd1c4})e(pdlO3+t&fQWQuwkKx( zn)3wyMF2yHq#S8tiKl56S5Z5gQ&605&7N(5p;7;(S8@NDH5tyMkU<1UuK)dsvw*l*VvP^fH)3yUyNWMZqAzwPwD+m~?!MlM~(?z`G zB?214z%yDqG1t51^<|a6wkPiy)iWW5n&<3oq2sJ>5<`_+16vjNVsdgvL-00xAdp9gZfcQc?{Z!zO>4$`iJgeufKv6FbKS2Y4OC?VGfbAlFN)B`9N%LY%QCF-j7EWu}aGXfa{ zYC@x5Z_;@+d~#M-f)RnC##-j-vXebHC}&c(k20n7wMen(7}JDi3k!gQoXT20IBV0d|WS*a+VJK&-hQ+ZmX-F&l6(-qKCryqKQsNuAZ*Ue#qz z1N8^R97K2ZK+8c5Nl6>Yd|J4XTT*<4s?~;3JOB(_m*Y&zS;0_wBuK)6QQHqi$1$N-+k@`+uDVV@Ux z0SdrV#o0wty!3RXo{E`2iy*MAo&=BpESSw;;_<5D~?3X7N0dM47^~Pc!k=*M+u(QyqN)8 zecCz>1yqO~L_OlNK!HMNPyz7G#=zbPPU2jxVJ9LaT9Tr%Q4h&UTWF|aL~7r;(FRPd z&>CFP<%J{|aU{EdaM36!<&rnL2dd>eJ#1)P%AsVB2Rc0!tG(KO^DM}}#pGVXTs&!Xvvfx-=VkX{Z z%aH)^bw+)OB5-Y!)+#)F0F$HhpA)`K9HFWIbUg0RE+7 z8m4LOV)Ih4scy~^$8^g0GR6PllUZsN=Vo_N5zxBVS!#B|>I_BI4^URJ%RhcrvOX*4q~p zMX=6aQZfIAf3%gN7y%m?0qRH)ZXOA&&C-n}1^%GgOZEf+fZBI#5Z^dz!j;f+*{ZI- z3asv`t-gj&o*Yc1!6%~SLIzt(8Bwyrn!rTj*7TB`nqV#J6m_Pk7;T$&8knA{4WgbR zH5q2jE~CT>oyE56#h$Chwq};>EM^)C-N~!7?F0F;!?9*D&zTFsM=*Bvy2C0u@9}(?I7#7A2*9 zsN)Tp-+2mdU?^X?~Gl4ucf@XMPx*6H+OaIsrFk(qn`|?{x|z&Ms;M;z*nwkkO0{-so&jE!%!> z1=Rql?ru}9!^q`EG*otuOmNZW^k=Vot7%RxVw^lg|<@2m)`!5$)yn?xi|i=*FTVA|@Oh zM5sm#Bl_p39N(i!Oc1=Kv8>P&@W9a=K{B!Cc1fZ#>Zl(fNe;Z4{$@*7*bKAsSv~^q z1plgXq=6<(#v1&H3y13SP{Dj5O9X?IvKiAf*4fEcfp3x-%t~wKxor8m)A@o);`0BZ z?%`!!yl>7rCjEj4=LQPshOQO6&=sSK6<6`>0HJ*>VrD7=_VhudH83i2!BRPi!qNwQ za8B1Dnz<6_KFSYVt}WYgM-j?=97@#L6_<95$S6{4Ok^LA7ewi=-Ru`sow6i5gja%ujviBf z8AKYyD86Y-z9OCpT7VJ?g33K%TJ0HZ`~~c!?A%@<7N*VFpy;#}@kU;20N($tk&1Dg zg0cxZF67>a8ZbcxHnS>cu?n)XY%Xdm&*Z5zX}u+&7c1IK97gF%0T`sgAXW4r@v=GB zs;z34k1Y~1o$XfKRe6pCs=JdXCl1rpeR3Y)vZihI<8tl7 z8S_1n>3ftVbm*^vIWvFtXF#E*rV-K?AH*%pLM_aKCTIc}DB5AxBOijNgFu41`i2lSVLzFYQgvYW9Vz%1=r|7Wh{0VKeI z0w)F<)U_tu0w>ghbGI<*y2Q~;Fg$(0#^mk_zQ@>=?N|G+G=DTex9Q2sp6D?4Reog$ zo83H3OX2~@)KGPlBph)srJNmC$#SYiyR7rn2(qoxLH2i)WwZgs*DZZS@aj%#}wQE-qlAcz_~B@!Yz!#oO_T! zR|h=FB>^0;BM_Ub`OT^g152+ss%lutigj^8k~yW-5SIU5gjc41XgV8yS(1F&j_Y7wEvK-f&YJFDK{BYIcZ zcLqD{s-us8IMM@hQ-V`S(4~JNE}w4Obh^4p# zswCGNcnlJwMXP-nM6~L*d3hL*>%~(YlMG&AKo*?iW4u)fw&|&<8VxC(caQK(%$t(}rZIgHBF{gV>&LBxRpqr|e@w(?8I z3p9()0|E90(yXwX#c0rX55R8syvdLwC3ZyK7+D$D@Z|yQVMTWb!a* zSK-#{;u*2li*|BeHoWSSzIdX7tpmg`fdV}hyo9M!!b%Gl4IDPe;lqJu)KEMV24k3r z8##9L_%Y%Zky=QSFG4=nh`5D@?{*AGHs)b&_*07wOE9pYUaal=u`MMr$RJJ~E|3T!=WzjYc07nBY;5$bzrO`q#_I~u(cwKj3W{P;O)W=H?WMiEZA@;kwOePaT0_O zx^1J`P(h`))@%z6Hrs5>Z4(@GbB+H-8lU^|wikmO&a*)HI5LkUDFTwoCaZfAN|dbo zC_3#1@@1o61j1qj6}mi5i3bGY>%8)wQg00|_IT-q1gN5~zPaF(Fv0))>yNDaA{qh; z7y=k<2tNfBkHXBF64bG{#2c`|%M?(7iJu_M!6OoU>T(7mW~fY{4F|H}Cmz-c0t8Pt zq9O}{$hhMU5+!-9Md1=MZMN4~i_M_Y2*R<)UWe2bwgJov`PO7Y7>r(27Y09Nv!Z7RCQJ1WaBlHUVR+4Mjd5!QR8Ms z{wUawjPz{elz)8o3n^KauBMl|3r3e;Y<`o7#(>Zv2C}rJt4#6qTHe+KYQJNGk? zQTr5=3@|*2elBXr7+iq~tiiQfJWd~_w&9qEp|;wljDGlNAgmapVvZQfm^Qd&V+}Nq zFWyz-T6M)+WsZd;S;$a=+tuX04X0AMm&Is#@x?QQLksYR3FhWuvh7m8LBUP;qYKde z3upr4gj3x_+cg^9tq-%0^#X-f>*=5?Jk{Y2#2t6uPkGiM2qt|0!S_qG4cFiP zWgjYJZn&L)-q()uzE%G<87;Q8nuomR$7C2R-FyO9fy@zZ3Mo#Y z>J+K2_@@6-m&#NeVy}iQBG#<*7!mOeq&PlY=g62d8a04&B@qEAwnEya-t_=tW*U=9 z$L574yz&4wc%Mc4BZTWTFbE9o6i80cp!58IQvbtC4)W@=wJNlu5Id{?hK4OK9yV+J z3?09IFib(D6reqzNg4j|2O!Ljfn&O;^yGG|z@-qiK80jbi5f|yHV0UAJ8e^)T3c}P z&8Rx8=^}VrBH#M9vq;)1`Pdgvc^U^f$59eJZO72e5{~>cd+>#U%89*4=q?MOhP5QfcL_q#TmfRx-B99%f0h%d z643up*?nd}1_EW%={x|?0gGV;^~{1G*qf3goOB3vp{x1QP??}b7qAYcm>e8AH=fd_ zg*?@!inU3-MoKS`&9m){X>7w)-1x?%?L;&u8O`PS7OTVk;a8EX+&UatFHp!D!8FT) zhQ(>T(v|Y-)+=3q{VBeh6#`{KDBw@cl%tlD!BIG}1D=(MXG*y5z1AgQ{1#SROOS$` zBP+BT(D}YINsyY^N+=YJQqBdclDLJHImLHXA*W1(KSJi4sDQz->h)8r%dTU?j4l5u zOE*$tMe9SYdtYGRtJudrntcsyIk(V}cledB@$i{XB8(^3ZeGF(va^IRHrm@?)*K9u zAndlR@t#u92)3$_hzy5naZ*S_8p2eR4b7*&LeO`$B5fj@-jvg&_E^af8Sp-4Gq?Yy zp(01!aEIeqoSUANLUzm$J@VFtuNGMw%TVOx9vS2m+lV@exwGhsha}S#Lz#iS9AA=q zy8k-WM@9hH>!1y$b7h?kvW8!bP*JR5crO6??DK1n>QnQTj0xhKR=B|Y2icke6xEC^ zmCz9Z=$7uBlOV40uz=3=)~I~Qt?w8$U&0YFMz_j4L z3QF4QgbMh;N@9ZaSW0sSLhK+!Z3+!#PHeRq?MdqlYyI_WCtgcEH&Gf{|EaXq%RPOxKEXs8Ggk(veWRAZY;j5JV9HfAvUWGs6yt(ux|2W5@? ztg6*I@qHkV4|nH5LJ82$DhnBh>rC-F3hW3B%6wqPo`9!u&~VsZ@#?}#%pxoVLV*9Y zrFJH7IgGC}no9~>25m^n7T+MU_Q`kJutUggN_t=c*$@?t&vO49LKE!efdJ><;wJ6} zap9(E`f4MbaK))c=BWs$;p~RubZEyiQDn}^Z4!Z!Jdqg?;-XIwNQHX*l zAcOH#1acs&Fo-(IAfE)RY%zEoa{fH;7A*|V?#}>iE`tQH^yG}YaDbRXP6XL*5K%C; zt|w(aLB+U-WL`n<9P#03OgM1t?@~>0a0(uU1qeH_6MKs%O$4~I%H#Yo){=1{i!vY; z^73904_8hpGg5uz5EvbYC|M?Pq7oR*a22B^E6)%sp%N)Gf+7;HhlZmY4KBu}3dN{T z5UmFtQ?gbBf+gXSCFhcnHIg5%Qhd$0!Gq zF<%A%`_U;Gauw5OF)6b$Z_xl}t{|&}8Zk3U9<#`xNe{}BBug`!O7n$OhWc1&`x>$C zWN^m(=C-!yEf=W-O>%}BqVUFvH_1})eDb8A2_F@cIEynO`;jR<$v7<&AT!b_5wkI) zb4n}|I?ty%!O{x=k~vp`IV%$}XRW4m3=yBl1ZOk0(lQab3ATJ>HN`RSn2Ijr^Tq12 z24xZwVN5RrXW&?CBw^)*Rt-2T!J7I~;Yy8p9>SQAvbd~pAD2@*m$Q=+lOOqUlM?e2 zB~(HY5;5HgL$mXfoW(;eVl$VdE7vC<-$~?1ixU6&(=^w!j~r1EP3Si0lKUL)1xswH zg2Xp`!)|I6EpPM0V(5f0;YWZp?nWaJCE_8FY@UeINni~_Z!#iCt{+b{4(_oGI1_YVaFv^6px+NN*7C{Bxb+)JN}fHUTspTX0S5ZdX@yBms`n{)PnE zQzem

-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

jMUZcJ~RwYON3x zEIsO&H&X9~TTsca#jtFCFj&Tuav|qmTD{!e+VSQ|CmhpNzm;)gg5{|oNsu3zj zkyz|xWJf{zH&bX}_NDkzN>36@C5B;SXcS#4w~oHeyNx&PWHo_^jtxr7&tMg{XM%qX?#+D(fiYt(oz*3L>Y~sbvJ44Ku*!R@K3$u@IM1qDM^;Dk!HvC}IO< zW9NyZFtDq7lxHydq5;)>=C<_5jqJ^Ni+c@nL7#BRK{1=1 ziRD80%*Nwcp2E#loH5rDsU~U3zd@C`VrM8@M;Owr6ti$tDgq3mC?bMZ7+G&LAv=p$ ze7MWfp1CYpq{kVW`i;o3jn*9 z3iMXVx0F|f@~zca@(^;f)he#Vwix-=3v#&Ttf(-cw_?WrOFXshki-b(^M-T869CHXa6NQ%xPEu^wLn1kYiHI*H(nQ z%LvzY-9}qoJIcaho}i~Ai;%72-|DkZAx$+Q{N2{Z&^DJ!V{P?Z#6_xVfd*hzPpyjz zgpeC*61CGPtC68JCMCCiqNk*_B0`p;@=T5Pt2U@5OYQ%zc|sbzQ$4{_K_bQ_gmIXvd?K z>)-ke^n$r!-tb{d)1W8cO2C;K$GAByxA!gyLK1v3~I z{x!QslU#iqRXj^{n;5JFntin9id+*p^mTi{z;ioHwj}(@0W9 zQyTB&;?;a-fWw8mp#+dy!K6LmqRZZV_T#;|o)J)5?yG?rO9c3nW?G?s;`tPtF+BCv zPOU(x7G1;l96mpl+=fzl3K@H5{H-HQA={opB6o9NbJi-gK_B-nFq7U7@sDybCVA$n zBA3}UWb041#dp)eTeZkkmwg(R2z@2$7SaCb9Uzr7vGT_4)>TQmGC9^q_0p#AyF=q@br42L2P!r6B6Uez$zmbCQl=21m|2{ z*PS@=OU>Yz9S;jd=1CtV9Z}|<*%88dn%rmW$jV^=cQ8&Ik@hw%{do zSZH%Y164KMAWu2dzC(?iYL9b-a$`j`2+L5M|8PJ(RXqWf+hZ3yr!(F22K=B5e1|$ajRMXX`x|UjqVKhBLIX#b8$vNjwVj6C3d&R{w)*P>4<+} zl&d(GFKb7)4%R#Ez(Gk9Y%xxL94Go1bD+_TFK}npr7&85_upov5?~L_uy9dZieE(4 zHfl{UoCuqGq|j@Q)HKse8^d$I*kUFK>`7k$^RB-=bHl{S43s1;XWtStyXi!lr zH`67m&`fQUJyEmq6ib?i@DV@dAAX8z)JQoei$rz|HTqEb{9vXD(nYdNJP`J>S!YoY zrMYHK5(!Odl}P9<2^Pyp)t>aRXAfH**24yK`=rPz8%T~$(TY3wDq@p9CQnTjkGy1Y z5?0MA1A;EnQ0R@wCHp`FIYpz_FtkW>>j1b(J((D5r@KUY3iAX75Q^oFO{(Bagc@$T zrDZDKi4$;(Akw(NtX-yNEW!Z66jV?ageYb2Zh8q`WMEY!xo(D*aOBTvW;UnLqfDuR zCutOW`fV-B-lQcI6SIFoWPnxW5;yuHIu@`+##J>G{oQo7d6DjUG%*Kfr5!i$QH_G! z6yBtyzJ5tp_{XfAXGXJF^N0I#zen6%aJV%qq%jo{zajl>=E_o(+I1G$g}LmGy8rGB zn`=_j*vuXbH_1hg+!8^16iV9(E^JGRn(FjgM#=xOh^Id)A%Z9^bSU?j%I81Kvl=S9 zoh(7EL4wu!n(`l5N+hjDV!y=o_JX)I`XY$;U^tp*B2 z1vMtw`(Gh@bd^7}A^BXP-$|BBjnxEjdD)<8WEt`_d4?QlZeUfrirJm85ZgnM$uaYtX3icbCp(hRe^04-GBLP51F1@n5brw?@5?6 zGWimVJGDcX8-{Du1anq)WQI(|S8=k{wk92j%DP_FdwEs8P2mSRKz(Pg{^$-h&6vwl3*?X zH7#Gb`uA+e=h)pK1|{)Y*<_nh5LMCMdK6l2l4;dh?cl60pxJ5~%?kdZgxTuoebjc4 zrR?{o`BJHlX{8=(xcj3jm#|ucTsdEQMARic(}=P}TMA7PBXBBOAh0^vvJ!fw8hYTh zr*OUD(;15)s@sCpJPRu*?v^~@&QtYueK zv1;KuZ+1Q3F-!UH_5t-kH_gHynTN>d-u=SclkaIF>Ph?x zryE{M?N8g=j=?P>Aq`F2Ksmv;i$W+}+DMUu|L5&1dMlymtibC?;E7PA+8 zY+(Rq>n6YH-)_nhK^<||BdINCV<~%iixW@HEU&#bXQ6_fbMrlJhY>(T&nB~`D7tLW z_CTqb*=-r3aFa+soGdV$R==AKO-3@U*6SwcB6rq5R>rQhU4iyidTv9pxP0bfD`Iyw z11C29EVjkj2e2*Y(j`?f!(9Y#<4U#}@2x8IIhtd8hJ_`&N7j4MJC~GB6CXA>QE9cv z;EP20ya%%)8E}^uBTB{da*oB@9;~eM)kKz>wr&D)hXPdHcuUyQ!C&j%q$H-Q5e|1$)E*|K}nq0_$(@oKWNBs*h zKk~5~lTgYWn(WD@T$SF*IH?NQp7yu-)l03zscFsc3U$OYeT=->i{cj{?{`(vms~nK z2r7Ge`D!CXr}ry;?a}2KAj2VLI38?JeSGwNyEsz;*dv zyBs=|v$3&_JJC0~b1ge7tyO!)t<(#IZ|ul*9oKvEWWExhd(P`(rY2dPODP|YbwVn; z7~-~bO>>iBXSUIPz6tlx#`{>k=P?6ea|_3S_U{}JIy!tyKaE)@D9bR5KGp`1MQ?WC zmsi|7Q!<13%yZLmuXg9K?+NrQ#)M$Lut~I2pbU!AcZV*#gf?*K7C+R%Uzg4;hd>>b zWnYTb&-97#L+l)v`YcVR0W|Dzg{ST-!+2_%mZ6I;+va^ zWAs@R8K9q5o@TJN3-Ia>VE8&>Ak%Dqe>75W#d=kr>*|6ELb(@+I5B+6(L-j%zq|ZK zbyxWGY5XL4!OzEs%!zMFmPZI&K*^r}bk2ut*ni2`|1?g0H?2hXY_O9DSn1K`Z>f5Sp!Bi@zYqq&;7K$V2n2;f zVMYxx&I<&D{zXvQSTM|wM*n7oILZ(w8VkV{g}|y{ARJ0YKulZtSRkHGW8m*=(O^Eq zk7Se%o2gtrpEpPkfakTCydW)+WOOvDa-l3M$SS$IVL?Hmh|O)WtA%;FP%osS1t+ya zJ=~}_nZGMpX{(VZ1l3I`&{nUT!58&}p-DV8ho>Qsgt<{02J*ivEpGK=?t8Ol61<1XUi6Xh5W90W&u zim-!EQDlH~jmXB%m7~`uf*$5B9YjM6E5H~ABGd%@PM{P!hz>@tSg_;fO*;Sr?HnwJ7Q%m^YyPM}sg7$534xw?_X4h8v4c z+dz@$Mf5LC?YvIen1qpGL#(*Z! zP`6Cl*p8r@+5BVh%qldU9Oh7r*dQVF&O&ie*27^Em z%looG{EH!5cmsw{&08P@J?*Wdi z+(eMheM)T|@JdjGA*frT7UjV)NAC-p=W*)GWpxA7f1&Okn=Ad|wn4|X-LY-kwr$($ zWXDc+Y};nXwrwY!q~oN6-p~J;ms3+SFYc90s%x#PwSMPuf~rhvQ(t*xY8-Al z$0KQ8TOd6=CLt2F57dXYp+&JiZ(iZfbV3K?!S`g+jKux?Hc1+ANFgn(mm~4ltqN7mEtk69X1f9 zI5oD}n23S0j+FGAKf?5io%-W<+YzZCBRqTug6Rh>kKoI_4OmJRvLLR5LiXVqNVMOf zph;iXi||=ZU%{P57W?_}ZD0Jp>2+|lFHQgIQmnO4Km+9G4k}*3X4e!#B-?Hfd0RDN zi~HA0{P$4oYdjLJYrNA{v(LP%cL>0hDB%~aBJ6_bQ&WO*L7iZWMPYwRGqQ%EnX`xJ zevYe)W2P0Q;PRseDTqqo*yBaA5}8?1hwTQA^CS~UAKCmU$-|204dWq(g1bEtMQSV! zZTf~blQTqt5u-^1^JexQY2K4imCW16It|sxUB#QrYTt7$*U+{kAhZhaEthhQlkfvH zf?+p*h(3S=FbXhPUwMlJ>CA35$Qvv#*(n#(`eFb($I^U9{@S5Sd0t zP`EN2H6hYiDGai>2*UT^AXOSI^b=aR5lwN-#1;MN=S%hl+)z|6&!{WTJXF2umcNu> z`B98ykr`50B1Bc-0!m_2yViW}z_d7{zO;+;bcL#`#Ef_LDi>!zRRHIUR|6wjFO-MY z&QTFJV@S)a396m*^oPw!}Uy zc#m#L8xBh=TcQ2dz<5V~M}L!jw*H4d4Fyw7f8Ta`xz`$l(bYC9AM&f|Px)#G69vUH zuQpR*yX9hGA1=dbWo|{MI;L!S7DRTdM0?9^;ywrTKf$<_9PloLvpbPM+KRqQrCGl{ zffRx>aol@}WvNm;4i}PW<`8#fIK#m_NT@94Qw1hjMD6Y4$EUUkg$s1gokQ3iY!zs- zEEgDyLSbCC$ADCB#ye|D$v7Ou0Fw_3SX_L*M0N^W?dZaN5K9y-FhIru+E(bG%ea6U-WA9Ipi@U@HzvH1FY89(-K^aYbV zTMW@98)J>)&{8rxIi%%qBF8%E@-EsNK;*!5Px%Dp0_Fg&bA7fkq$u9^?vM039@%~} zB*so5M#QG&1lo4g_B#Exe+hUF;KrC5F9<4i7DG^Onm!qcW8r!yP_6!mA=Ib- z%~14Mg|b^zjSC^_DqOtyN1&Q*xBQ77GoFONB*oFA3@O;3js$maa<=A zrxlmS=bMEJ%bFGCa(0-}c3EO>ObsCB3YQBC=WBw=uT-Y&)=1xF%gml7#(5C^Qsuvt z$7)u<=Iu*FaAo|bQL?36kXp!yh9P5gZ70mT>QrY_XS25n=l9wg?TQA@8_$X$ibL+x za6Qn%b^5Q@rO&N)gu>KaveNq0O+nc`KPj)Q@y?IviP$D=Ir6|o`|uE->OERtbik+} z@n`iHBmIKZV=Bm{EHluL%EtJK=;FcHRYL#}Ubzjbr$5F+g(5t{$7PI>e`iUiM3 z67oKTxaPh$FE_9Z+JXN)8suoVJ)G8fK`D%t8Mp1XEd=IJSzz~lOU@n8IbCk-K}NIo@k69G5q zQbQNPXc5{ZD}rMuo}3nf;1I%_0bEBlyfhR-!xw;H%apj;2#_tH>E_`@C$lV}g+_yr zmmqVh>E6c>4i$xN52eJwAS3D;#0iYXOOC@Us=}`m!z&sh(8ML)9cqQZD_SYyXJAx# z=$v_^r@#`g5Nm)Kt^MmTKp|288aKe)D&jiaoDh-@xQCViV_Kv2yrTGb4gTv0_blVNG~qU&+W#jpEM) z#lI7v=!yOO2x`dki+5r+=+e;4IHmP7+sQ@Po~SWf=>7rQ1T2^VS7nwHcNSRT?xO~A znI%1GA_gqcId!x>lC~ez{U2SwQu7pMg}MpYxE$cg4!P6xArq2?F5!yh-hZ9C3m0#5 zf_y9d=xaBYrD4ekTgcK)N15pG5p;Rs^om$WMDa)lGjJ%$0@Z)n$zhr;g}4pVBF)HT zzSj(J@DFQ@g8)7KTeNX$Rg-ge$lW!PRy7^{+tM`fG8$Js8PynryrKZo(0{xrXj|YD zvbgO-$;$|-4sO(3)!>DUlT1y?DUYn}7UTfheso%4{Ae`JDu%3FiIPodM$Tv%e@db* z`8q)|djFwZbX4NOX*+m^2Uf`zPRWH&v0?QbWcs>_EYfiO(a!&V(wfMZ0~T}hhSjC^+qH}Qme#eS%O0Zd+rxm`t~ zysO~5P699dRrY0=zzJ zuqGKibnYVHzka)NS=&XJ7unw$(rotQ@q#@Bb{&Cn;vXa3P(j0=wDR^x)T{yjZU4|1 z#L>Ew(AtaeTeain`k9{^Dn5Xv=iTvqdvTIkMeI#AlKNT>P4;QOI6X9IO;JdS?_6lH zRHR3QZ!{<|QEIMmo~cmTiB-hizf?Dn^PK*YI4kh+q}&51Y191Nhfs1fl%t@oTBhYom1cz#mQrpepRvnHw1!BC1z(i9qB4`ufy<|w(3dtY zZF<|LZ`kP}vf%lmP>*SrIg(C;*sf!RzaQUi#6+zag&D|5th*OT6Gd4F=PhOQQu7@%k zOmn?|viyMOc>IWFeZi$?TnYaI>Zhm(xZ{6UHz{pHj$vg95r=FZFCH=uBq1q-3Vur$ zZ`V53*Qz-rxF9b}|JGFd%ju!Guo9;Ye_5b9mK&C=9D3IO^9lveP-*sQAPh1o1PF#M zxRO~ee_;oXcQfdCEq{FdOV)r3Z&mE1WL^776&3kM>@q`@WdcP#nej6Q9$w-qm>9m1 zY(7=Bs*?`A(^f&gYKcXw*2pMzo(O%NyyOEZWSl!% z;S7G{7mkL_2;UDUA#a$6bli_^PfLbjHgh_BwJZ7pFb=r_<8-F3m z|HkIS6|ZAzn}`{xnGDp}R#qV?d#rY1CFcz&m7gf&I!cy~<7*A#V~oU9KwMjf`1+F( z?ReDh@gB2lhhL#=@8Eb+YxMAB+(n!L7KBOkwdU@V#QwrYM2Rj^kQ5j4{UwV z)HT9&2Vkv^$#w{B>}s4%wVJd_fy68pcDP;~4H1f#*&?R%9U8sDfC2JFWwupZK3mar z5FSiZ6WBpqM^0yPH|jkb*BKd)EtgEu#2@%N09y7pK^()M0&kWIg%5WCha<|60Oh!K z)!ezu+fc5_4tlT!_ZM8BI$eaS>I_#_6zK@QWck7_!vi|VGvsiP^)(@3FVZ41;O){d zE+34??;t4d;I~GRpfU37DoYA~KPA-Zx7^mhAQQYXGq4JoPhtcj1dQK)a6`zdwS!07+y zaXeuuB!)wUCX8C-RbAXze6=E;`wsk-Iu)Nk5O24jQ<^7dPGgKFVddQvWZH*t#_TXN zzLqr(eV57JtMb0FJoeyI&xOp&h4fUm@n}e5h$iFko*cANOx!UP2s!mjJbP?6#>HXK zTvjLNG%*b}H!C<)-?(|{$b!+)vnsLN-p05b`H ztFKIhpCd*l0ImJ4+=NmcPc)e)?OvEHlm4AyrOISC1sipz8%*boNze>z>42VZBcjtI724q~fbMY<$?wNML8-0``CtkoL(z(KVAiRs5RZQ$}oGU0zM zrD!ok>=uvg;}iDt4)^s4f_m^1Q*M7_QHnf)POeFkC7;^bO&tWUwK<%F$?uV4Pj42Z zkG&jc%A~6r_oD zQjcK{gZWT5iLItu5@jN04Uq#<$ja%6?*)737b@W#-0_EluszX8nJeXjTme=jlHRLC z_LK)9PXQ{HrF44PBLoFAsiG@W3a{YcT0mlcS=`1?4n$eWx+-wpf8P3(6E1xa-7&)V zPnsCoK3;%JJWoEMZ6SS?1n~Mu-Cz515oMwM`j%EDV|T(o3jLxV<{<{~CxM3mFtk?_ ze7rj7P)2UN(ggUcc`yS*9}jeGEqQ5>Nv?0%2=h-e-5<1*{^EN^7q8x)M?ENbN(#r5 z%sygRqbMaq;gL@J8J8B!=k%?{9b(f+uXj!{WjOSc&HmyGuU}^kx_B5FF@Rj-ft4oGEnN>jE5Ei0bd8++Sf z9Xed#rMw`1W_o@#1u$_t2R71zoCtxC1>PIz10}!h5Yykaxv+R#!!lSYG2hc1cgC!{N*Gc<{G(f&!eg86L(@F(K384_AA0G1J8CpA`maBdTv+w z=-GD<$?-mV%RB0nt%8mI->wd$?LFymI0AeR--$KZXfy_uc9m}v_;?Hf1-l-{rNxj; zknlCxl+EcN9w|SZqbM5WYz8zY5fc026iOIhnA>KSYBCj>E+cy2gF3i6G$c5yQ|!al zO1X@Kb+wuVX_6421A%=qIz=T~yRoB;_2^if&0!rW9!u`9yesPzBSN6_cDFB|6}t~h z&4u+>04(CVWtNL>m<<+4L=$OA@pux5teyq$b#580+=fC&ZpMkuc<=#>Rm~N2_WlmtTeG`OYl~r`H)vsdTV<~blQUJmb znA)1I9`ReM4&MhBc<`GX6ufZ=wDpEr_!bYk`777@zNjMiIf>;EuP0^to0e*Z;-^@; zNxBj{_xcMAQ&#H4L6`D-@tc@ZZs9uP?oZfo*7(ZsjV!R$(3`Td$i7 zLt`sSgjz>M4Tr7CIiW5|C`+G=CbGs=KzZ_FC1-Tz^_Q+nNg3Zhogi!atomPd&2rP>on=WLbQkHkBpKEVRg0T*bg|Q1&TF0PTY@T@UU3XN zte6fhoVNAq)wz?ng=iW{g?LRTUGi3?ZgCsqdr$ z{TN<0!PBi@iXDnG9QX)5jOlM=0V{kcBvzsbFssELTGF@$ufwoJBU^<|sQ0GZosZPEh zEOr++0#>_nFN_@&en1~9c(DEixHNGSC83Me62U`s`-`X)3SUUq86>J@{2-X$1#y)V z!dg+fSavi(n%dW~1h7jFD*@{a<8~C4qdd^tC@$q#nLZne)naGJTlmIjoIVF{d?44`bT5Vfy!1C$oTyxi)28qx5HahzyHU!J-9|1{2G z<^*kCJ10i=h$(M~tdAwqX^^F(Ums?l_VQ`Jy@?{xriB&MAlh1|1f!EAZ-WI8Eyj%0~)q>&f@wTRBlIHdDh5|4*f z43}RQk_6lqJu4WDU^8V#;~`wem>T2jr>u^V9zGTYYmNzHjCQ-~S;;7%k`f?K1~D2Z zn_(yTq&VCeLa-Iu68tW<6lEZ0;W)9p%iCsDsnK~l)ea3;2OY` z_^Q9c&WF4E1^GE5ZhGgbc5so3P02j6DWH=3N9cMT%VhaDfI

t&eyxHbqD?I^3a? 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

Kzx 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�p?GCsO?;;?n9oi-#V}y=74| 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

2QG)%LCRK{_rNyC7 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�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

(p + ReadScalar(p)) : nullptr; + } + template + P GetPointer(voffset_t field) const + { + return const_cast(this)->GetPointer

(field); + } + + template + P GetStruct(voffset_t field) const + { + auto field_offset = GetOptionalFieldOffset(field); + auto p = const_cast(data_ + field_offset); + return field_offset ? reinterpret_cast

(p) : nullptr; + } + + template + flatbuffers::Optional GetOptional(voffset_t field) const + { + auto field_offset = GetOptionalFieldOffset(field); + auto p = data_ + field_offset; + return field_offset ? Optional(static_cast(ReadScalar(p))) : Optional(); + } + + template + bool SetField(voffset_t field, T val, T def) + { + auto field_offset = GetOptionalFieldOffset(field); + if (!field_offset) + return IsTheSameAs(val, def); + WriteScalar(data_ + field_offset, val); + return true; + } + template + bool SetField(voffset_t field, T val) + { + auto field_offset = GetOptionalFieldOffset(field); + if (!field_offset) + return false; + WriteScalar(data_ + field_offset, val); + return true; + } + + bool SetPointer(voffset_t field, const uint8_t *val) + { + auto field_offset = GetOptionalFieldOffset(field); + if (!field_offset) + return false; + WriteScalar(data_ + field_offset, + static_cast(val - (data_ + field_offset))); + return true; + } + + uint8_t *GetAddressOf(voffset_t field) + { + auto field_offset = GetOptionalFieldOffset(field); + return field_offset ? data_ + field_offset : nullptr; + } + const uint8_t *GetAddressOf(voffset_t field) const + { + return const_cast

(this)->GetAddressOf(field); + } + + bool CheckField(voffset_t field) const + { + return GetOptionalFieldOffset(field) != 0; + } + + // Verify the vtable of this table. + // Call this once per table, followed by VerifyField once per field. + bool VerifyTableStart(Verifier &verifier) const + { + return verifier.VerifyTableStart(data_); + } + + // Verify a particular field. + template + bool VerifyField(const Verifier &verifier, voffset_t field) const + { + // Calling GetOptionalFieldOffset should be safe now thanks to + // VerifyTable(). + auto field_offset = GetOptionalFieldOffset(field); + // Check the actual field. + return !field_offset || verifier.Verify(data_, field_offset); + } + + // VerifyField for required fields. + template + bool VerifyFieldRequired(const Verifier &verifier, voffset_t field) const + { + auto field_offset = GetOptionalFieldOffset(field); + return verifier.Check(field_offset != 0) && + verifier.Verify(data_, field_offset); + } + + // Versions for offsets. + bool VerifyOffset(const Verifier &verifier, voffset_t field) const + { + auto field_offset = GetOptionalFieldOffset(field); + return !field_offset || verifier.VerifyOffset(data_, field_offset); + } + + bool VerifyOffsetRequired(const Verifier &verifier, voffset_t field) const + { + auto field_offset = GetOptionalFieldOffset(field); + return verifier.Check(field_offset != 0) && + verifier.VerifyOffset(data_, field_offset); + } + +private: + // private constructor & copy constructor: you obtain instances of this + // class by pointing to existing data only + Table(); + Table(const Table &other); + Table &operator=(const Table &); + + uint8_t data_[1]; +}; + +// This specialization allows avoiding warnings like: +// MSVC C4800: type: forcing value to bool 'true' or 'false'. +template <> +inline flatbuffers::Optional Table::GetOptional( + voffset_t field) const +{ + auto field_offset = GetOptionalFieldOffset(field); + auto p = data_ + field_offset; + return field_offset ? Optional(ReadScalar(p) != 0) : Optional(); +} + +template +void FlatBufferBuilder::Required(Offset table, voffset_t field) +{ + auto table_ptr = reinterpret_cast(buf_.data_at(table.o)); + bool ok = table_ptr->GetOptionalFieldOffset(field) != 0; + // If this fails, the caller will show what field needs to be set. + FLATBUFFERS_ASSERT(ok); + (void)ok; +} + +/// @brief This can compute the start of a FlatBuffer from a root pointer, i.e. +/// it is the opposite transformation of GetRoot(). +/// This may be useful if you want to pass on a root and have the recipient +/// delete the buffer afterwards. +inline const uint8_t *GetBufferStartFromRootPointer(const void *root) +{ + auto table = reinterpret_cast(root); + auto vtable = table->GetVTable(); + // Either the vtable is before the root or after the root. + auto start = (std::min)(vtable, reinterpret_cast(root)); + // Align to at least sizeof(uoffset_t). + start = reinterpret_cast(reinterpret_cast(start) & + ~(sizeof(uoffset_t) - 1)); + // Additionally, there may be a file_identifier in the buffer, and the root + // offset. The buffer may have been aligned to any size between + // sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align"). + // Sadly, the exact alignment is only known when constructing the buffer, + // since it depends on the presence of values with said alignment properties. + // So instead, we simply look at the next uoffset_t values (root, + // file_identifier, and alignment padding) to see which points to the root. + // None of the other values can "impersonate" the root since they will either + // be 0 or four ASCII characters. + static_assert(FlatBufferBuilder::kFileIdentifierLength == sizeof(uoffset_t), + "file_identifier is assumed to be the same size as uoffset_t"); + for (auto possible_roots = FLATBUFFERS_MAX_ALIGNMENT / sizeof(uoffset_t) + 1; + possible_roots; possible_roots--) { + start -= sizeof(uoffset_t); + if (ReadScalar(start) + start == + reinterpret_cast(root)) + return start; + } + // We didn't find the root, either the "root" passed isn't really a root, + // or the buffer is corrupt. + // Assert, because calling this function with bad data may cause reads + // outside of buffer boundaries. + FLATBUFFERS_ASSERT(false); + return nullptr; +} + +/// @brief This return the prefixed size of a FlatBuffer. +inline uoffset_t GetPrefixedSize(const uint8_t *buf) +{ + return ReadScalar(buf); +} + +// Base class for native objects (FlatBuffer data de-serialized into native +// C++ data structures). +// Contains no functionality, purely documentative. +struct NativeTable { +}; + +/// @brief Function types to be used with resolving hashes into objects and +/// back again. The resolver gets a pointer to a field inside an object API +/// object that is of the type specified in the schema using the attribute +/// `cpp_type` (it is thus important whatever you write to this address +/// matches that type). The value of this field is initially null, so you +/// may choose to implement a delayed binding lookup using this function +/// if you wish. The resolver does the opposite lookup, for when the object +/// is being serialized again. +typedef uint64_t hash_value_t; +// clang-format off +#ifdef FLATBUFFERS_CPP98_STL + typedef void (*resolver_function_t)(void **pointer_adr, hash_value_t hash); + typedef hash_value_t (*rehasher_function_t)(void *pointer); +#else + typedef std::function + resolver_function_t; + typedef std::function rehasher_function_t; +#endif +// clang-format on + +// Helper function to test if a field is present, using any of the field +// enums in the generated code. +// `table` must be a generated table type. Since this is a template parameter, +// this is not typechecked to be a subclass of Table, so beware! +// Note: this function will return false for fields equal to the default +// value, since they're not stored in the buffer (unless force_defaults was +// used). +template +bool IsFieldPresent(const T *table, typename T::FlatBuffersVTableOffset field) +{ + // Cast, since Table is a private baseclass of any table types. + return reinterpret_cast(table)->CheckField( + static_cast(field)); +} + +// Utility function for reverse lookups on the EnumNames*() functions +// (in the generated C++ code) +// names must be NULL terminated. +inline int LookupEnum(const char **names, const char *name) +{ + for (const char **p = names; *p; p++) + if (!strcmp(*p, name)) + return static_cast(p - names); + return -1; +} + +// These macros allow us to layout a struct with a guarantee that they'll end +// up looking the same on different compilers and platforms. +// It does this by disallowing the compiler to do any padding, and then +// does padding itself by inserting extra padding fields that make every +// element aligned to its own size. +// Additionally, it manually sets the alignment of the struct as a whole, +// which is typically its largest element, or a custom size set in the schema +// by the force_align attribute. +// These are used in the generated code only. + +// clang-format off +#if defined(_MSC_VER) + #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ + __pragma(pack(1)) \ + struct __declspec(align(alignment)) + #define FLATBUFFERS_STRUCT_END(name, size) \ + __pragma(pack()) \ + static_assert(sizeof(name) == size, "compiler breaks packing rules") +#elif defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) + #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ + _Pragma("pack(1)") \ + struct __attribute__((aligned(alignment))) + #define FLATBUFFERS_STRUCT_END(name, size) \ + _Pragma("pack()") \ + static_assert(sizeof(name) == size, "compiler breaks packing rules") +#else + #error Unknown compiler, please define structure alignment macros +#endif +// clang-format on + +// Minimal reflection via code generation. +// Besides full-fat reflection (see reflection.h) and parsing/printing by +// loading schemas (see idl.h), we can also have code generation for mimimal +// reflection data which allows pretty-printing and other uses without needing +// a schema or a parser. +// Generate code with --reflect-types (types only) or --reflect-names (names +// also) to enable. +// See minireflect.h for utilities using this functionality. + +// These types are organized slightly differently as the ones in idl.h. +enum SequenceType { ST_TABLE, + ST_STRUCT, + ST_UNION, + ST_ENUM }; + +// Scalars have the same order as in idl.h +// clang-format off +#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \ + ET(ET_UTYPE) \ + ET(ET_BOOL) \ + ET(ET_CHAR) \ + ET(ET_UCHAR) \ + ET(ET_SHORT) \ + ET(ET_USHORT) \ + ET(ET_INT) \ + ET(ET_UINT) \ + ET(ET_LONG) \ + ET(ET_ULONG) \ + ET(ET_FLOAT) \ + ET(ET_DOUBLE) \ + ET(ET_STRING) \ + ET(ET_SEQUENCE) // See SequenceType. + +enum ElementaryType { + #define FLATBUFFERS_ET(E) E, + FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) + #undef FLATBUFFERS_ET +}; + +inline const char * const *ElementaryTypeNames() { + static const char * const names[] = { + #define FLATBUFFERS_ET(E) #E, + FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) + #undef FLATBUFFERS_ET + }; + return names; +} +// clang-format on + +// Basic type info cost just 16bits per field! +struct TypeCode { + uint16_t base_type : 4; // ElementaryType + uint16_t is_repeating : 1; // Either vector (in table) or array (in struct) + int16_t sequence_ref : 11; // Index into type_refs below, or -1 for none. +}; + +static_assert(sizeof(TypeCode) == 2, "TypeCode"); + +struct TypeTable; + +// Signature of the static method present in each type. +typedef const TypeTable *(*TypeFunction)(); + +struct TypeTable { + SequenceType st; + size_t num_elems; // of type_codes, values, names (but not type_refs). + const TypeCode *type_codes; // num_elems count + const TypeFunction *type_refs; // less than num_elems entries (see TypeCode). + const int16_t *array_sizes; // less than num_elems entries (see TypeCode). + const int64_t *values; // Only set for non-consecutive enum/union or structs. + const char *const *names; // Only set if compiled with --reflect-names. +}; + +// String which identifies the current version of FlatBuffers. +// flatbuffer_version_string is used by Google developers to identify which +// applications uploaded to Google Play are using this library. This allows +// the development team at Google to determine the popularity of the library. +// How it works: Applications that are uploaded to the Google Play Store are +// scanned for this version string. We track which applications are using it +// to measure popularity. You are free to remove it (of course) but we would +// appreciate if you left it in. + +// Weak linkage is culled by VS & doesn't work on cygwin. +// clang-format off +#if !defined(_WIN32) && !defined(__CYGWIN__) + +extern volatile __attribute__((weak)) const char *flatbuffer_version_string; +volatile __attribute__((weak)) const char *flatbuffer_version_string = + "FlatBuffers " + FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) "." + FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) "." + FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION); + +#endif // !defined(_WIN32) && !defined(__CYGWIN__) + +#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\ + inline E operator | (E lhs, E rhs){\ + return E(T(lhs) | T(rhs));\ + }\ + inline E operator & (E lhs, E rhs){\ + return E(T(lhs) & T(rhs));\ + }\ + inline E operator ^ (E lhs, E rhs){\ + return E(T(lhs) ^ T(rhs));\ + }\ + inline E operator ~ (E lhs){\ + return E(~T(lhs));\ + }\ + inline E operator |= (E &lhs, E rhs){\ + lhs = lhs | rhs;\ + return lhs;\ + }\ + inline E operator &= (E &lhs, E rhs){\ + lhs = lhs & rhs;\ + return lhs;\ + }\ + inline E operator ^= (E &lhs, E rhs){\ + lhs = lhs ^ rhs;\ + return lhs;\ + }\ + inline bool operator !(E rhs) \ + {\ + return !bool(T(rhs)); \ + } +/// @endcond +} // namespace flatbuffers + +// clang-format on + +#endif // FLATBUFFERS_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatc.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatc.h new file mode 100644 index 00000000..522fa2a8 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatc.h @@ -0,0 +1,104 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_FLATC_H_ +#define FLATBUFFERS_FLATC_H_ + +#include +#include +#include + +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/idl.h" +#include "flatbuffers/util.h" + +namespace flatbuffers { +extern void LogCompilerWarn(const std::string &warn); +extern void LogCompilerError(const std::string &err); + +class FlatCompiler { +public: + // Output generator for the various programming languages and formats we + // support. + struct Generator { + typedef bool (*GenerateFn)(const flatbuffers::Parser &parser, + const std::string &path, + const std::string &file_name); + typedef std::string (*MakeRuleFn)(const flatbuffers::Parser &parser, + const std::string &path, + const std::string &file_name); + + GenerateFn generate; + const char *generator_opt_short; + const char *generator_opt_long; + const char *lang_name; + bool schema_only; + GenerateFn generateGRPC; + flatbuffers::IDLOptions::Language lang; + const char *generator_help; + MakeRuleFn make_rule; + }; + + typedef void (*WarnFn)(const FlatCompiler *flatc, const std::string &warn, + bool show_exe_name); + + typedef void (*ErrorFn)(const FlatCompiler *flatc, const std::string &err, + bool usage, bool show_exe_name); + + // Parameters required to initialize the FlatCompiler. + struct InitParams { + InitParams() + : generators(nullptr), + num_generators(0), + warn_fn(nullptr), + error_fn(nullptr) + { + } + + const Generator *generators; + size_t num_generators; + WarnFn warn_fn; + ErrorFn error_fn; + }; + + explicit FlatCompiler(const InitParams ¶ms) + : params_(params) + { + } + + int Compile(int argc, const char **argv); + + std::string GetUsageString(const char *program_name) const; + +private: + void ParseFile(flatbuffers::Parser &parser, const std::string &filename, + const std::string &contents, + std::vector &include_directories) const; + + void LoadBinarySchema(Parser &parser, const std::string &filename, + const std::string &contents); + + void Warn(const std::string &warn, bool show_exe_name = true) const; + + void Error(const std::string &err, bool usage = true, + bool show_exe_name = true) const; + + InitParams params_; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_FLATC_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flexbuffers.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flexbuffers.h new file mode 100644 index 00000000..f9dc0973 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flexbuffers.h @@ -0,0 +1,2133 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_FLEXBUFFERS_H_ +#define FLATBUFFERS_FLEXBUFFERS_H_ + +#include +// Used to select STL variant. +#include "flatbuffers/base.h" +// We use the basic binary writing functions from the regular FlatBuffers. +#include "flatbuffers/util.h" + +#ifdef _MSC_VER +#include +#endif + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4127) // C4127: conditional expression is constant +#endif + +namespace flexbuffers { +class Reference; +class Map; + +// These are used in the lower 2 bits of a type field to determine the size of +// the elements (and or size field) of the item pointed to (e.g. vector). +enum BitWidth { + BIT_WIDTH_8 = 0, + BIT_WIDTH_16 = 1, + BIT_WIDTH_32 = 2, + BIT_WIDTH_64 = 3, +}; + +// These are used as the upper 6 bits of a type field to indicate the actual +// type. +enum Type { + FBT_NULL = 0, + FBT_INT = 1, + FBT_UINT = 2, + FBT_FLOAT = 3, + // Types above stored inline, types below store an offset. + FBT_KEY = 4, + FBT_STRING = 5, + FBT_INDIRECT_INT = 6, + FBT_INDIRECT_UINT = 7, + FBT_INDIRECT_FLOAT = 8, + FBT_MAP = 9, + FBT_VECTOR = 10, // Untyped. + FBT_VECTOR_INT = 11, // Typed any size (stores no type table). + FBT_VECTOR_UINT = 12, + FBT_VECTOR_FLOAT = 13, + FBT_VECTOR_KEY = 14, + // DEPRECATED, use FBT_VECTOR or FBT_VECTOR_KEY instead. + // Read test.cpp/FlexBuffersDeprecatedTest() for details on why. + FBT_VECTOR_STRING_DEPRECATED = 15, + FBT_VECTOR_INT2 = 16, // Typed tuple (no type table, no size field). + FBT_VECTOR_UINT2 = 17, + FBT_VECTOR_FLOAT2 = 18, + FBT_VECTOR_INT3 = 19, // Typed triple (no type table, no size field). + FBT_VECTOR_UINT3 = 20, + FBT_VECTOR_FLOAT3 = 21, + FBT_VECTOR_INT4 = 22, // Typed quad (no type table, no size field). + FBT_VECTOR_UINT4 = 23, + FBT_VECTOR_FLOAT4 = 24, + FBT_BLOB = 25, + FBT_BOOL = 26, + FBT_VECTOR_BOOL = + 36, // To Allow the same type of conversion of type to vector type +}; + +inline bool IsInline(Type t) +{ + return t <= FBT_FLOAT || t == FBT_BOOL; +} + +inline bool IsTypedVectorElementType(Type t) +{ + return (t >= FBT_INT && t <= FBT_STRING) || t == FBT_BOOL; +} + +inline bool IsTypedVector(Type t) +{ + return (t >= FBT_VECTOR_INT && t <= FBT_VECTOR_STRING_DEPRECATED) || + t == FBT_VECTOR_BOOL; +} + +inline bool IsFixedTypedVector(Type t) +{ + return t >= FBT_VECTOR_INT2 && t <= FBT_VECTOR_FLOAT4; +} + +inline Type ToTypedVector(Type t, size_t fixed_len = 0) +{ + FLATBUFFERS_ASSERT(IsTypedVectorElementType(t)); + switch (fixed_len) { + case 0: + return static_cast(t - FBT_INT + FBT_VECTOR_INT); + case 2: + return static_cast(t - FBT_INT + FBT_VECTOR_INT2); + case 3: + return static_cast(t - FBT_INT + FBT_VECTOR_INT3); + case 4: + return static_cast(t - FBT_INT + FBT_VECTOR_INT4); + default: + FLATBUFFERS_ASSERT(0); + return FBT_NULL; + } +} + +inline Type ToTypedVectorElementType(Type t) +{ + FLATBUFFERS_ASSERT(IsTypedVector(t)); + return static_cast(t - FBT_VECTOR_INT + FBT_INT); +} + +inline Type ToFixedTypedVectorElementType(Type t, uint8_t *len) +{ + FLATBUFFERS_ASSERT(IsFixedTypedVector(t)); + auto fixed_type = t - FBT_VECTOR_INT2; + *len = static_cast(fixed_type / 3 + + 2); // 3 types each, starting from length 2. + return static_cast(fixed_type % 3 + FBT_INT); +} + +// TODO: implement proper support for 8/16bit floats, or decide not to +// support them. +typedef int16_t half; +typedef int8_t quarter; + +// TODO: can we do this without conditionals using intrinsics or inline asm +// on some platforms? Given branch prediction the method below should be +// decently quick, but it is the most frequently executed function. +// We could do an (unaligned) 64-bit read if we ifdef out the platforms for +// which that doesn't work (or where we'd read into un-owned memory). +template +R ReadSizedScalar(const uint8_t *data, uint8_t byte_width) +{ + return byte_width < 4 ? (byte_width < 2 ? static_cast(flatbuffers::ReadScalar(data)) : static_cast(flatbuffers::ReadScalar(data))) : (byte_width < 8 ? static_cast(flatbuffers::ReadScalar(data)) : static_cast(flatbuffers::ReadScalar(data))); +} + +inline int64_t ReadInt64(const uint8_t *data, uint8_t byte_width) +{ + return ReadSizedScalar( + data, byte_width); +} + +inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) +{ + // This is the "hottest" function (all offset lookups use this), so worth + // optimizing if possible. + // TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a + // constant, which here it isn't. Test if memcpy is still faster than + // the conditionals in ReadSizedScalar. Can also use inline asm. + // clang-format off + #if defined(_MSC_VER) && (defined(_M_X64) || defined _M_IX86) + uint64_t u = 0; + __movsb(reinterpret_cast(&u), + reinterpret_cast(data), byte_width); + return flatbuffers::EndianScalar(u); + #else + return ReadSizedScalar( + data, byte_width); + #endif + // clang-format on +} + +inline double ReadDouble(const uint8_t *data, uint8_t byte_width) +{ + return ReadSizedScalar(data, + byte_width); +} + +inline const uint8_t *Indirect(const uint8_t *offset, uint8_t byte_width) +{ + return offset - ReadUInt64(offset, byte_width); +} + +template +const uint8_t *Indirect(const uint8_t *offset) +{ + return offset - flatbuffers::ReadScalar(offset); +} + +inline BitWidth WidthU(uint64_t u) +{ +#define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width) \ + { \ + if (!((u) & ~((1ULL << (width)) - 1ULL))) \ + return BIT_WIDTH_##width; \ + } + FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8); + FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16); + FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32); +#undef FLATBUFFERS_GET_FIELD_BIT_WIDTH + return BIT_WIDTH_64; +} + +inline BitWidth WidthI(int64_t i) +{ + auto u = static_cast(i) << 1; + return WidthU(i >= 0 ? u : ~u); +} + +inline BitWidth WidthF(double f) +{ + return static_cast(static_cast(f)) == f ? BIT_WIDTH_32 : BIT_WIDTH_64; +} + +// Base class of all types below. +// Points into the data buffer and allows access to one type. +class Object { +public: + Object(const uint8_t *data, uint8_t byte_width) + : data_(data), byte_width_(byte_width) + { + } + +protected: + const uint8_t *data_; + uint8_t byte_width_; +}; + +// Object that has a size, obtained either from size prefix, or elsewhere. +class Sized : public Object { +public: + // Size prefix. + Sized(const uint8_t *data, uint8_t byte_width) + : Object(data, byte_width), size_(read_size()) + { + } + // Manual size. + Sized(const uint8_t *data, uint8_t byte_width, size_t sz) + : Object(data, byte_width), size_(sz) + { + } + size_t size() const + { + return size_; + } + // Access size stored in `byte_width_` bytes before data_ pointer. + size_t read_size() const + { + return static_cast(ReadUInt64(data_ - byte_width_, byte_width_)); + } + +protected: + size_t size_; +}; + +class String : public Sized { +public: + // Size prefix. + String(const uint8_t *data, uint8_t byte_width) + : Sized(data, byte_width) + { + } + // Manual size. + String(const uint8_t *data, uint8_t byte_width, size_t sz) + : Sized(data, byte_width, sz) + { + } + + size_t length() const + { + return size(); + } + const char *c_str() const + { + return reinterpret_cast(data_); + } + std::string str() const + { + return std::string(c_str(), size()); + } + + static String EmptyString() + { + static const char *empty_string = ""; + return String(reinterpret_cast(empty_string), 1, 0); + } + bool IsTheEmptyString() const + { + return data_ == EmptyString().data_; + } +}; + +class Blob : public Sized { +public: + Blob(const uint8_t *data_buf, uint8_t byte_width) + : Sized(data_buf, byte_width) + { + } + + static Blob EmptyBlob() + { + static const uint8_t empty_blob[] = { 0 /*len*/ }; + return Blob(empty_blob + 1, 1); + } + bool IsTheEmptyBlob() const + { + return data_ == EmptyBlob().data_; + } + const uint8_t *data() const + { + return data_; + } +}; + +class Vector : public Sized { +public: + Vector(const uint8_t *data, uint8_t byte_width) + : Sized(data, byte_width) + { + } + + Reference operator[](size_t i) const; + + static Vector EmptyVector() + { + static const uint8_t empty_vector[] = { 0 /*len*/ }; + return Vector(empty_vector + 1, 1); + } + bool IsTheEmptyVector() const + { + return data_ == EmptyVector().data_; + } +}; + +class TypedVector : public Sized { +public: + TypedVector(const uint8_t *data, uint8_t byte_width, Type element_type) + : Sized(data, byte_width), type_(element_type) + { + } + + Reference operator[](size_t i) const; + + static TypedVector EmptyTypedVector() + { + static const uint8_t empty_typed_vector[] = { 0 /*len*/ }; + return TypedVector(empty_typed_vector + 1, 1, FBT_INT); + } + bool IsTheEmptyVector() const + { + return data_ == TypedVector::EmptyTypedVector().data_; + } + + Type ElementType() + { + return type_; + } + + friend Reference; + +private: + Type type_; + + friend Map; +}; + +class FixedTypedVector : public Object { +public: + FixedTypedVector(const uint8_t *data, uint8_t byte_width, Type element_type, + uint8_t len) + : Object(data, byte_width), type_(element_type), len_(len) + { + } + + Reference operator[](size_t i) const; + + static FixedTypedVector EmptyFixedTypedVector() + { + static const uint8_t fixed_empty_vector[] = { 0 /* unused */ }; + return FixedTypedVector(fixed_empty_vector, 1, FBT_INT, 0); + } + bool IsTheEmptyFixedTypedVector() const + { + return data_ == FixedTypedVector::EmptyFixedTypedVector().data_; + } + + Type ElementType() + { + return type_; + } + uint8_t size() + { + return len_; + } + +private: + Type type_; + uint8_t len_; +}; + +class Map : public Vector { +public: + Map(const uint8_t *data, uint8_t byte_width) + : Vector(data, byte_width) + { + } + + Reference operator[](const char *key) const; + Reference operator[](const std::string &key) const; + + Vector Values() const + { + return Vector(data_, byte_width_); + } + + TypedVector Keys() const + { + const size_t num_prefixed_fields = 3; + auto keys_offset = data_ - byte_width_ * num_prefixed_fields; + return TypedVector(Indirect(keys_offset, byte_width_), + static_cast( + ReadUInt64(keys_offset + byte_width_, byte_width_)), + FBT_KEY); + } + + static Map EmptyMap() + { + static const uint8_t empty_map[] = { + 0 /*keys_len*/, 0 /*keys_offset*/, 1 /*keys_width*/, 0 /*len*/ + }; + return Map(empty_map + 4, 1); + } + + bool IsTheEmptyMap() const + { + return data_ == EmptyMap().data_; + } +}; + +template +void AppendToString(std::string &s, T &&v, bool keys_quoted) +{ + s += "[ "; + for (size_t i = 0; i < v.size(); i++) { + if (i) + s += ", "; + v[i].ToString(true, keys_quoted, s); + } + s += " ]"; +} + +class Reference { +public: + Reference() + : data_(nullptr), + parent_width_(0), + byte_width_(BIT_WIDTH_8), + type_(FBT_NULL) + { + } + + Reference(const uint8_t *data, uint8_t parent_width, uint8_t byte_width, + Type type) + : data_(data), + parent_width_(parent_width), + byte_width_(byte_width), + type_(type) + { + } + + Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type) + : data_(data), parent_width_(parent_width) + { + byte_width_ = 1U << static_cast(packed_type & 3); + type_ = static_cast(packed_type >> 2); + } + + Type GetType() const + { + return type_; + } + + bool IsNull() const + { + return type_ == FBT_NULL; + } + bool IsBool() const + { + return type_ == FBT_BOOL; + } + bool IsInt() const + { + return type_ == FBT_INT || type_ == FBT_INDIRECT_INT; + } + bool IsUInt() const + { + return type_ == FBT_UINT || type_ == FBT_INDIRECT_UINT; + } + bool IsIntOrUint() const + { + return IsInt() || IsUInt(); + } + bool IsFloat() const + { + return type_ == FBT_FLOAT || type_ == FBT_INDIRECT_FLOAT; + } + bool IsNumeric() const + { + return IsIntOrUint() || IsFloat(); + } + bool IsString() const + { + return type_ == FBT_STRING; + } + bool IsKey() const + { + return type_ == FBT_KEY; + } + bool IsVector() const + { + return type_ == FBT_VECTOR || type_ == FBT_MAP; + } + bool IsUntypedVector() const + { + return type_ == FBT_VECTOR; + } + bool IsTypedVector() const + { + return flexbuffers::IsTypedVector(type_); + } + bool IsFixedTypedVector() const + { + return flexbuffers::IsFixedTypedVector(type_); + } + bool IsAnyVector() const + { + return (IsTypedVector() || IsFixedTypedVector() || IsVector()); + } + bool IsMap() const + { + return type_ == FBT_MAP; + } + bool IsBlob() const + { + return type_ == FBT_BLOB; + } + bool AsBool() const + { + return (type_ == FBT_BOOL ? ReadUInt64(data_, parent_width_) : AsUInt64()) != 0; + } + + // Reads any type as a int64_t. Never fails, does most sensible conversion. + // Truncates floats, strings are attempted to be parsed for a number, + // vectors/maps return their size. Returns 0 if all else fails. + int64_t AsInt64() const + { + if (type_ == FBT_INT) { + // A fast path for the common case. + return ReadInt64(data_, parent_width_); + } else + switch (type_) { + case FBT_INDIRECT_INT: + return ReadInt64(Indirect(), byte_width_); + case FBT_UINT: + return ReadUInt64(data_, parent_width_); + case FBT_INDIRECT_UINT: + return ReadUInt64(Indirect(), byte_width_); + case FBT_FLOAT: + return static_cast(ReadDouble(data_, parent_width_)); + case FBT_INDIRECT_FLOAT: + return static_cast(ReadDouble(Indirect(), byte_width_)); + case FBT_NULL: + return 0; + case FBT_STRING: + return flatbuffers::StringToInt(AsString().c_str()); + case FBT_VECTOR: + return static_cast(AsVector().size()); + case FBT_BOOL: + return ReadInt64(data_, parent_width_); + default: + // Convert other things to int. + return 0; + } + } + + // TODO: could specialize these to not use AsInt64() if that saves + // extension ops in generated code, and use a faster op than ReadInt64. + int32_t AsInt32() const + { + return static_cast(AsInt64()); + } + int16_t AsInt16() const + { + return static_cast(AsInt64()); + } + int8_t AsInt8() const + { + return static_cast(AsInt64()); + } + + uint64_t AsUInt64() const + { + if (type_ == FBT_UINT) { + // A fast path for the common case. + return ReadUInt64(data_, parent_width_); + } else + switch (type_) { + case FBT_INDIRECT_UINT: + return ReadUInt64(Indirect(), byte_width_); + case FBT_INT: + return ReadInt64(data_, parent_width_); + case FBT_INDIRECT_INT: + return ReadInt64(Indirect(), byte_width_); + case FBT_FLOAT: + return static_cast(ReadDouble(data_, parent_width_)); + case FBT_INDIRECT_FLOAT: + return static_cast(ReadDouble(Indirect(), byte_width_)); + case FBT_NULL: + return 0; + case FBT_STRING: + return flatbuffers::StringToUInt(AsString().c_str()); + case FBT_VECTOR: + return static_cast(AsVector().size()); + case FBT_BOOL: + return ReadUInt64(data_, parent_width_); + default: + // Convert other things to uint. + return 0; + } + } + + uint32_t AsUInt32() const + { + return static_cast(AsUInt64()); + } + uint16_t AsUInt16() const + { + return static_cast(AsUInt64()); + } + uint8_t AsUInt8() const + { + return static_cast(AsUInt64()); + } + + double AsDouble() const + { + if (type_ == FBT_FLOAT) { + // A fast path for the common case. + return ReadDouble(data_, parent_width_); + } else + switch (type_) { + case FBT_INDIRECT_FLOAT: + return ReadDouble(Indirect(), byte_width_); + case FBT_INT: + return static_cast(ReadInt64(data_, parent_width_)); + case FBT_UINT: + return static_cast(ReadUInt64(data_, parent_width_)); + case FBT_INDIRECT_INT: + return static_cast(ReadInt64(Indirect(), byte_width_)); + case FBT_INDIRECT_UINT: + return static_cast(ReadUInt64(Indirect(), byte_width_)); + case FBT_NULL: + return 0.0; + case FBT_STRING: { + double d; + flatbuffers::StringToNumber(AsString().c_str(), &d); + return d; + } + case FBT_VECTOR: + return static_cast(AsVector().size()); + case FBT_BOOL: + return static_cast(ReadUInt64(data_, parent_width_)); + default: + // Convert strings and other things to float. + return 0; + } + } + + float AsFloat() const + { + return static_cast(AsDouble()); + } + + const char *AsKey() const + { + if (type_ == FBT_KEY || type_ == FBT_STRING) { + return reinterpret_cast(Indirect()); + } else { + return ""; + } + } + + // This function returns the empty string if you try to read something that + // is not a string or key. + String AsString() const + { + if (type_ == FBT_STRING) { + return String(Indirect(), byte_width_); + } else if (type_ == FBT_KEY) { + auto key = Indirect(); + return String(key, byte_width_, + strlen(reinterpret_cast(key))); + } else { + return String::EmptyString(); + } + } + + // Unlike AsString(), this will convert any type to a std::string. + std::string ToString() const + { + std::string s; + ToString(false, false, s); + return s; + } + + // Convert any type to a JSON-like string. strings_quoted determines if + // string values at the top level receive "" quotes (inside other values + // they always do). keys_quoted determines if keys are quoted, at any level. + // TODO(wvo): add further options to have indentation/newlines. + void ToString(bool strings_quoted, bool keys_quoted, std::string &s) const + { + if (type_ == FBT_STRING) { + String str(Indirect(), byte_width_); + if (strings_quoted) { + flatbuffers::EscapeString(str.c_str(), str.length(), &s, true, false); + } else { + s.append(str.c_str(), str.length()); + } + } else if (IsKey()) { + auto str = AsKey(); + if (keys_quoted) { + flatbuffers::EscapeString(str, strlen(str), &s, true, false); + } else { + s += str; + } + } else if (IsInt()) { + s += flatbuffers::NumToString(AsInt64()); + } else if (IsUInt()) { + s += flatbuffers::NumToString(AsUInt64()); + } else if (IsFloat()) { + s += flatbuffers::NumToString(AsDouble()); + } else if (IsNull()) { + s += "null"; + } else if (IsBool()) { + s += AsBool() ? "true" : "false"; + } else if (IsMap()) { + s += "{ "; + auto m = AsMap(); + auto keys = m.Keys(); + auto vals = m.Values(); + for (size_t i = 0; i < keys.size(); i++) { + keys[i].ToString(true, keys_quoted, s); + s += ": "; + vals[i].ToString(true, keys_quoted, s); + if (i < keys.size() - 1) + s += ", "; + } + s += " }"; + } else if (IsVector()) { + AppendToString(s, AsVector(), keys_quoted); + } else if (IsTypedVector()) { + AppendToString(s, AsTypedVector(), keys_quoted); + } else if (IsFixedTypedVector()) { + AppendToString(s, AsFixedTypedVector(), keys_quoted); + } else if (IsBlob()) { + auto blob = AsBlob(); + flatbuffers::EscapeString(reinterpret_cast(blob.data()), + blob.size(), &s, true, false); + } else { + s += "(?)"; + } + } + + // This function returns the empty blob if you try to read a not-blob. + // Strings can be viewed as blobs too. + Blob AsBlob() const + { + if (type_ == FBT_BLOB || type_ == FBT_STRING) { + return Blob(Indirect(), byte_width_); + } else { + return Blob::EmptyBlob(); + } + } + + // This function returns the empty vector if you try to read a not-vector. + // Maps can be viewed as vectors too. + Vector AsVector() const + { + if (type_ == FBT_VECTOR || type_ == FBT_MAP) { + return Vector(Indirect(), byte_width_); + } else { + return Vector::EmptyVector(); + } + } + + TypedVector AsTypedVector() const + { + if (IsTypedVector()) { + auto tv = + TypedVector(Indirect(), byte_width_, ToTypedVectorElementType(type_)); + if (tv.type_ == FBT_STRING) { + // These can't be accessed as strings, since we don't know the bit-width + // of the size field, see the declaration of + // FBT_VECTOR_STRING_DEPRECATED above for details. + // We change the type here to be keys, which are a subtype of strings, + // and will ignore the size field. This will truncate strings with + // embedded nulls. + tv.type_ = FBT_KEY; + } + return tv; + } else { + return TypedVector::EmptyTypedVector(); + } + } + + FixedTypedVector AsFixedTypedVector() const + { + if (IsFixedTypedVector()) { + uint8_t len = 0; + auto vtype = ToFixedTypedVectorElementType(type_, &len); + return FixedTypedVector(Indirect(), byte_width_, vtype, len); + } else { + return FixedTypedVector::EmptyFixedTypedVector(); + } + } + + Map AsMap() const + { + if (type_ == FBT_MAP) { + return Map(Indirect(), byte_width_); + } else { + return Map::EmptyMap(); + } + } + + template + T As() const; + + // Experimental: Mutation functions. + // These allow scalars in an already created buffer to be updated in-place. + // Since by default scalars are stored in the smallest possible space, + // the new value may not fit, in which case these functions return false. + // To avoid this, you can construct the values you intend to mutate using + // Builder::ForceMinimumBitWidth. + bool MutateInt(int64_t i) + { + if (type_ == FBT_INT) { + return Mutate(data_, i, parent_width_, WidthI(i)); + } else if (type_ == FBT_INDIRECT_INT) { + return Mutate(Indirect(), i, byte_width_, WidthI(i)); + } else if (type_ == FBT_UINT) { + auto u = static_cast(i); + return Mutate(data_, u, parent_width_, WidthU(u)); + } else if (type_ == FBT_INDIRECT_UINT) { + auto u = static_cast(i); + return Mutate(Indirect(), u, byte_width_, WidthU(u)); + } else { + return false; + } + } + + bool MutateBool(bool b) + { + return type_ == FBT_BOOL && Mutate(data_, b, parent_width_, BIT_WIDTH_8); + } + + bool MutateUInt(uint64_t u) + { + if (type_ == FBT_UINT) { + return Mutate(data_, u, parent_width_, WidthU(u)); + } else if (type_ == FBT_INDIRECT_UINT) { + return Mutate(Indirect(), u, byte_width_, WidthU(u)); + } else if (type_ == FBT_INT) { + auto i = static_cast(u); + return Mutate(data_, i, parent_width_, WidthI(i)); + } else if (type_ == FBT_INDIRECT_INT) { + auto i = static_cast(u); + return Mutate(Indirect(), i, byte_width_, WidthI(i)); + } else { + return false; + } + } + + bool MutateFloat(float f) + { + if (type_ == FBT_FLOAT) { + return MutateF(data_, f, parent_width_, BIT_WIDTH_32); + } else if (type_ == FBT_INDIRECT_FLOAT) { + return MutateF(Indirect(), f, byte_width_, BIT_WIDTH_32); + } else { + return false; + } + } + + bool MutateFloat(double d) + { + if (type_ == FBT_FLOAT) { + return MutateF(data_, d, parent_width_, WidthF(d)); + } else if (type_ == FBT_INDIRECT_FLOAT) { + return MutateF(Indirect(), d, byte_width_, WidthF(d)); + } else { + return false; + } + } + + bool MutateString(const char *str, size_t len) + { + auto s = AsString(); + if (s.IsTheEmptyString()) + return false; + // This is very strict, could allow shorter strings, but that creates + // garbage. + if (s.length() != len) + return false; + memcpy(const_cast(s.c_str()), str, len); + return true; + } + bool MutateString(const char *str) + { + return MutateString(str, strlen(str)); + } + bool MutateString(const std::string &str) + { + return MutateString(str.data(), str.length()); + } + +private: + const uint8_t *Indirect() const + { + return flexbuffers::Indirect(data_, parent_width_); + } + + template + bool Mutate(const uint8_t *dest, T t, size_t byte_width, + BitWidth value_width) + { + auto fits = static_cast(static_cast(1U) << value_width) <= + byte_width; + if (fits) { + t = flatbuffers::EndianScalar(t); + memcpy(const_cast(dest), &t, byte_width); + } + return fits; + } + + template + bool MutateF(const uint8_t *dest, T t, size_t byte_width, + BitWidth value_width) + { + if (byte_width == sizeof(double)) + return Mutate(dest, static_cast(t), byte_width, value_width); + if (byte_width == sizeof(float)) + return Mutate(dest, static_cast(t), byte_width, value_width); + FLATBUFFERS_ASSERT(false); + return false; + } + + const uint8_t *data_; + uint8_t parent_width_; + uint8_t byte_width_; + Type type_; +}; + +// Template specialization for As(). +template <> +inline bool Reference::As() const +{ + return AsBool(); +} + +template <> +inline int8_t Reference::As() const +{ + return AsInt8(); +} +template <> +inline int16_t Reference::As() const +{ + return AsInt16(); +} +template <> +inline int32_t Reference::As() const +{ + return AsInt32(); +} +template <> +inline int64_t Reference::As() const +{ + return AsInt64(); +} + +template <> +inline uint8_t Reference::As() const +{ + return AsUInt8(); +} +template <> +inline uint16_t Reference::As() const +{ + return AsUInt16(); +} +template <> +inline uint32_t Reference::As() const +{ + return AsUInt32(); +} +template <> +inline uint64_t Reference::As() const +{ + return AsUInt64(); +} + +template <> +inline double Reference::As() const +{ + return AsDouble(); +} +template <> +inline float Reference::As() const +{ + return AsFloat(); +} + +template <> +inline String Reference::As() const +{ + return AsString(); +} +template <> +inline std::string Reference::As() const +{ + return AsString().str(); +} + +template <> +inline Blob Reference::As() const +{ + return AsBlob(); +} +template <> +inline Vector Reference::As() const +{ + return AsVector(); +} +template <> +inline TypedVector Reference::As() const +{ + return AsTypedVector(); +} +template <> +inline FixedTypedVector Reference::As() const +{ + return AsFixedTypedVector(); +} +template <> +inline Map Reference::As() const +{ + return AsMap(); +} + +inline uint8_t PackedType(BitWidth bit_width, Type type) +{ + return static_cast(bit_width | (type << 2)); +} + +inline uint8_t NullPackedType() +{ + return PackedType(BIT_WIDTH_8, FBT_NULL); +} + +// Vector accessors. +// Note: if you try to access outside of bounds, you get a Null value back +// instead. Normally this would be an assert, but since this is "dynamically +// typed" data, you may not want that (someone sends you a 2d vector and you +// wanted 3d). +// The Null converts seamlessly into a default value for any other type. +// TODO(wvo): Could introduce an #ifdef that makes this into an assert? +inline Reference Vector::operator[](size_t i) const +{ + auto len = size(); + if (i >= len) + return Reference(nullptr, 1, NullPackedType()); + auto packed_type = (data_ + len * byte_width_)[i]; + auto elem = data_ + i * byte_width_; + return Reference(elem, byte_width_, packed_type); +} + +inline Reference TypedVector::operator[](size_t i) const +{ + auto len = size(); + if (i >= len) + return Reference(nullptr, 1, NullPackedType()); + auto elem = data_ + i * byte_width_; + return Reference(elem, byte_width_, 1, type_); +} + +inline Reference FixedTypedVector::operator[](size_t i) const +{ + if (i >= len_) + return Reference(nullptr, 1, NullPackedType()); + auto elem = data_ + i * byte_width_; + return Reference(elem, byte_width_, 1, type_); +} + +template +int KeyCompare(const void *key, const void *elem) +{ + auto str_elem = reinterpret_cast( + Indirect(reinterpret_cast(elem))); + auto skey = reinterpret_cast(key); + return strcmp(skey, str_elem); +} + +inline Reference Map::operator[](const char *key) const +{ + auto keys = Keys(); + // We can't pass keys.byte_width_ to the comparison function, so we have + // to pick the right one ahead of time. + int (*comp)(const void *, const void *) = nullptr; + switch (keys.byte_width_) { + case 1: + comp = KeyCompare; + break; + case 2: + comp = KeyCompare; + break; + case 4: + comp = KeyCompare; + break; + case 8: + comp = KeyCompare; + break; + } + auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp); + if (!res) + return Reference(nullptr, 1, NullPackedType()); + auto i = (reinterpret_cast(res) - keys.data_) / keys.byte_width_; + return (*static_cast(this))[i]; +} + +inline Reference Map::operator[](const std::string &key) const +{ + return (*this)[key.c_str()]; +} + +inline Reference GetRoot(const uint8_t *buffer, size_t size) +{ + // See Finish() below for the serialization counterpart of this. + // The root starts at the end of the buffer, so we parse backwards from there. + auto end = buffer + size; + auto byte_width = *--end; + auto packed_type = *--end; + end -= byte_width; // The root data item. + return Reference(end, byte_width, packed_type); +} + +inline Reference GetRoot(const std::vector &buffer) +{ + return GetRoot(flatbuffers::vector_data(buffer), buffer.size()); +} + +// Flags that configure how the Builder behaves. +// The "Share" flags determine if the Builder automatically tries to pool +// this type. Pooling can reduce the size of serialized data if there are +// multiple maps of the same kind, at the expense of slightly slower +// serialization (the cost of lookups) and more memory use (std::set). +// By default this is on for keys, but off for strings. +// Turn keys off if you have e.g. only one map. +// Turn strings on if you expect many non-unique string values. +// Additionally, sharing key vectors can save space if you have maps with +// identical field populations. +enum BuilderFlag { + BUILDER_FLAG_NONE = 0, + BUILDER_FLAG_SHARE_KEYS = 1, + BUILDER_FLAG_SHARE_STRINGS = 2, + BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3, + BUILDER_FLAG_SHARE_KEY_VECTORS = 4, + BUILDER_FLAG_SHARE_ALL = 7, +}; + +class Builder FLATBUFFERS_FINAL_CLASS { +public: + Builder(size_t initial_size = 256, + BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS) + : buf_(initial_size), + finished_(false), + flags_(flags), + force_min_bit_width_(BIT_WIDTH_8), + key_pool(KeyOffsetCompare(buf_)), + string_pool(StringOffsetCompare(buf_)) + { + buf_.clear(); + } + + /// @brief Get the serialized buffer (after you call `Finish()`). + /// @return Returns a vector owned by this class. + const std::vector &GetBuffer() const + { + Finished(); + return buf_; + } + + // Size of the buffer. Does not include unfinished values. + size_t GetSize() const + { + return buf_.size(); + } + + // Reset all state so we can re-use the buffer. + void Clear() + { + buf_.clear(); + stack_.clear(); + finished_ = false; + // flags_ remains as-is; + force_min_bit_width_ = BIT_WIDTH_8; + key_pool.clear(); + string_pool.clear(); + } + + // All value constructing functions below have two versions: one that + // takes a key (for placement inside a map) and one that doesn't (for inside + // vectors and elsewhere). + + void Null() + { + stack_.push_back(Value()); + } + void Null(const char *key) + { + Key(key); + Null(); + } + + void Int(int64_t i) + { + stack_.push_back(Value(i, FBT_INT, WidthI(i))); + } + void Int(const char *key, int64_t i) + { + Key(key); + Int(i); + } + + void UInt(uint64_t u) + { + stack_.push_back(Value(u, FBT_UINT, WidthU(u))); + } + void UInt(const char *key, uint64_t u) + { + Key(key); + UInt(u); + } + + void Float(float f) + { + stack_.push_back(Value(f)); + } + void Float(const char *key, float f) + { + Key(key); + Float(f); + } + + void Double(double f) + { + stack_.push_back(Value(f)); + } + void Double(const char *key, double d) + { + Key(key); + Double(d); + } + + void Bool(bool b) + { + stack_.push_back(Value(b)); + } + void Bool(const char *key, bool b) + { + Key(key); + Bool(b); + } + + void IndirectInt(int64_t i) + { + PushIndirect(i, FBT_INDIRECT_INT, WidthI(i)); + } + void IndirectInt(const char *key, int64_t i) + { + Key(key); + IndirectInt(i); + } + + void IndirectUInt(uint64_t u) + { + PushIndirect(u, FBT_INDIRECT_UINT, WidthU(u)); + } + void IndirectUInt(const char *key, uint64_t u) + { + Key(key); + IndirectUInt(u); + } + + void IndirectFloat(float f) + { + PushIndirect(f, FBT_INDIRECT_FLOAT, BIT_WIDTH_32); + } + void IndirectFloat(const char *key, float f) + { + Key(key); + IndirectFloat(f); + } + + void IndirectDouble(double f) + { + PushIndirect(f, FBT_INDIRECT_FLOAT, WidthF(f)); + } + void IndirectDouble(const char *key, double d) + { + Key(key); + IndirectDouble(d); + } + + size_t Key(const char *str, size_t len) + { + auto sloc = buf_.size(); + WriteBytes(str, len + 1); + if (flags_ & BUILDER_FLAG_SHARE_KEYS) { + auto it = key_pool.find(sloc); + if (it != key_pool.end()) { + // Already in the buffer. Remove key we just serialized, and use + // existing offset instead. + buf_.resize(sloc); + sloc = *it; + } else { + key_pool.insert(sloc); + } + } + stack_.push_back(Value(static_cast(sloc), FBT_KEY, BIT_WIDTH_8)); + return sloc; + } + + size_t Key(const char *str) + { + return Key(str, strlen(str)); + } + size_t Key(const std::string &str) + { + return Key(str.c_str(), str.size()); + } + + size_t String(const char *str, size_t len) + { + auto reset_to = buf_.size(); + auto sloc = CreateBlob(str, len, 1, FBT_STRING); + if (flags_ & BUILDER_FLAG_SHARE_STRINGS) { + StringOffset so(sloc, len); + auto it = string_pool.find(so); + if (it != string_pool.end()) { + // Already in the buffer. Remove string we just serialized, and use + // existing offset instead. + buf_.resize(reset_to); + sloc = it->first; + stack_.back().u_ = sloc; + } else { + string_pool.insert(so); + } + } + return sloc; + } + size_t String(const char *str) + { + return String(str, strlen(str)); + } + size_t String(const std::string &str) + { + return String(str.c_str(), str.size()); + } + void String(const flexbuffers::String &str) + { + String(str.c_str(), str.length()); + } + + void String(const char *key, const char *str) + { + Key(key); + String(str); + } + void String(const char *key, const std::string &str) + { + Key(key); + String(str); + } + void String(const char *key, const flexbuffers::String &str) + { + Key(key); + String(str); + } + + size_t Blob(const void *data, size_t len) + { + return CreateBlob(data, len, 0, FBT_BLOB); + } + size_t Blob(const std::vector &v) + { + return CreateBlob(flatbuffers::vector_data(v), v.size(), 0, FBT_BLOB); + } + + // TODO(wvo): support all the FlexBuffer types (like flexbuffers::String), + // e.g. Vector etc. Also in overloaded versions. + // Also some FlatBuffers types? + + size_t StartVector() + { + return stack_.size(); + } + size_t StartVector(const char *key) + { + Key(key); + return stack_.size(); + } + size_t StartMap() + { + return stack_.size(); + } + size_t StartMap(const char *key) + { + Key(key); + return stack_.size(); + } + + // TODO(wvo): allow this to specify an aligment greater than the natural + // alignment. + size_t EndVector(size_t start, bool typed, bool fixed) + { + auto vec = CreateVector(start, stack_.size() - start, 1, typed, fixed); + // Remove temp elements and return vector. + stack_.resize(start); + stack_.push_back(vec); + return static_cast(vec.u_); + } + + size_t EndMap(size_t start) + { + // We should have interleaved keys and values on the stack. + // Make sure it is an even number: + auto len = stack_.size() - start; + FLATBUFFERS_ASSERT(!(len & 1)); + len /= 2; + // Make sure keys are all strings: + for (auto key = start; key < stack_.size(); key += 2) { + FLATBUFFERS_ASSERT(stack_[key].type_ == FBT_KEY); + } + // Now sort values, so later we can do a binary search lookup. + // We want to sort 2 array elements at a time. + struct TwoValue { + Value key; + Value val; + }; + // TODO(wvo): strict aliasing? + // TODO(wvo): allow the caller to indicate the data is already sorted + // for maximum efficiency? With an assert to check sortedness to make sure + // we're not breaking binary search. + // Or, we can track if the map is sorted as keys are added which would be + // be quite cheap (cheaper than checking it here), so we can skip this + // step automatically when appliccable, and encourage people to write in + // sorted fashion. + // std::sort is typically already a lot faster on sorted data though. + auto dict = + reinterpret_cast(flatbuffers::vector_data(stack_) + start); + std::sort(dict, dict + len, + [&](const TwoValue &a, const TwoValue &b) -> bool { + auto as = reinterpret_cast( + flatbuffers::vector_data(buf_) + a.key.u_); + auto bs = reinterpret_cast( + flatbuffers::vector_data(buf_) + b.key.u_); + auto comp = strcmp(as, bs); + // If this assertion hits, you've added two keys with the same + // value to this map. + // TODO: Have to check for pointer equality, as some sort + // implementation apparently call this function with the same + // element?? Why? + FLATBUFFERS_ASSERT(comp || &a == &b); + return comp < 0; + }); + // First create a vector out of all keys. + // TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share + // the first vector. + auto keys = CreateVector(start, len, 2, true, false); + auto vec = CreateVector(start + 1, len, 2, false, false, &keys); + // Remove temp elements and return map. + stack_.resize(start); + stack_.push_back(vec); + return static_cast(vec.u_); + } + + template + size_t Vector(F f) + { + auto start = StartVector(); + f(); + return EndVector(start, false, false); + } + template + size_t Vector(F f, T &state) + { + auto start = StartVector(); + f(state); + return EndVector(start, false, false); + } + template + size_t Vector(const char *key, F f) + { + auto start = StartVector(key); + f(); + return EndVector(start, false, false); + } + template + size_t Vector(const char *key, F f, T &state) + { + auto start = StartVector(key); + f(state); + return EndVector(start, false, false); + } + + template + void Vector(const T *elems, size_t len) + { + if (flatbuffers::is_scalar::value) { + // This path should be a lot quicker and use less space. + ScalarVector(elems, len, false); + } else { + auto start = StartVector(); + for (size_t i = 0; i < len; i++) + Add(elems[i]); + EndVector(start, false, false); + } + } + template + void Vector(const char *key, const T *elems, size_t len) + { + Key(key); + Vector(elems, len); + } + template + void Vector(const std::vector &vec) + { + Vector(flatbuffers::vector_data(vec), vec.size()); + } + + template + size_t TypedVector(F f) + { + auto start = StartVector(); + f(); + return EndVector(start, true, false); + } + template + size_t TypedVector(F f, T &state) + { + auto start = StartVector(); + f(state); + return EndVector(start, true, false); + } + template + size_t TypedVector(const char *key, F f) + { + auto start = StartVector(key); + f(); + return EndVector(start, true, false); + } + template + size_t TypedVector(const char *key, F f, T &state) + { + auto start = StartVector(key); + f(state); + return EndVector(start, true, false); + } + + template + size_t FixedTypedVector(const T *elems, size_t len) + { + // We only support a few fixed vector lengths. Anything bigger use a + // regular typed vector. + FLATBUFFERS_ASSERT(len >= 2 && len <= 4); + // And only scalar values. + static_assert(flatbuffers::is_scalar::value, "Unrelated types"); + return ScalarVector(elems, len, true); + } + + template + size_t FixedTypedVector(const char *key, const T *elems, size_t len) + { + Key(key); + return FixedTypedVector(elems, len); + } + + template + size_t Map(F f) + { + auto start = StartMap(); + f(); + return EndMap(start); + } + template + size_t Map(F f, T &state) + { + auto start = StartMap(); + f(state); + return EndMap(start); + } + template + size_t Map(const char *key, F f) + { + auto start = StartMap(key); + f(); + return EndMap(start); + } + template + size_t Map(const char *key, F f, T &state) + { + auto start = StartMap(key); + f(state); + return EndMap(start); + } + template + void Map(const std::map &map) + { + auto start = StartMap(); + for (auto it = map.begin(); it != map.end(); ++it) + Add(it->first.c_str(), it->second); + EndMap(start); + } + + // If you wish to share a value explicitly (a value not shared automatically + // through one of the BUILDER_FLAG_SHARE_* flags) you can do so with these + // functions. Or if you wish to turn those flags off for performance reasons + // and still do some explicit sharing. For example: + // builder.IndirectDouble(M_PI); + // auto id = builder.LastValue(); // Remember where we stored it. + // .. more code goes here .. + // builder.ReuseValue(id); // Refers to same double by offset. + // LastValue works regardless of whether the value has a key or not. + // Works on any data type. + struct Value; + Value LastValue() + { + return stack_.back(); + } + void ReuseValue(Value v) + { + stack_.push_back(v); + } + void ReuseValue(const char *key, Value v) + { + Key(key); + ReuseValue(v); + } + + // Overloaded Add that tries to call the correct function above. + void Add(int8_t i) + { + Int(i); + } + void Add(int16_t i) + { + Int(i); + } + void Add(int32_t i) + { + Int(i); + } + void Add(int64_t i) + { + Int(i); + } + void Add(uint8_t u) + { + UInt(u); + } + void Add(uint16_t u) + { + UInt(u); + } + void Add(uint32_t u) + { + UInt(u); + } + void Add(uint64_t u) + { + UInt(u); + } + void Add(float f) + { + Float(f); + } + void Add(double d) + { + Double(d); + } + void Add(bool b) + { + Bool(b); + } + void Add(const char *str) + { + String(str); + } + void Add(const std::string &str) + { + String(str); + } + void Add(const flexbuffers::String &str) + { + String(str); + } + + template + void Add(const std::vector &vec) + { + Vector(vec); + } + + template + void Add(const char *key, const T &t) + { + Key(key); + Add(t); + } + + template + void Add(const std::map &map) + { + Map(map); + } + + template + void operator+=(const T &t) + { + Add(t); + } + + // This function is useful in combination with the Mutate* functions above. + // It forces elements of vectors and maps to have a minimum size, such that + // they can later be updated without failing. + // Call with no arguments to reset. + void ForceMinimumBitWidth(BitWidth bw = BIT_WIDTH_8) + { + force_min_bit_width_ = bw; + } + + void Finish() + { + // If you hit this assert, you likely have objects that were never included + // in a parent. You need to have exactly one root to finish a buffer. + // Check your Start/End calls are matched, and all objects are inside + // some other object. + FLATBUFFERS_ASSERT(stack_.size() == 1); + + // Write root value. + auto byte_width = Align(stack_[0].ElemWidth(buf_.size(), 0)); + WriteAny(stack_[0], byte_width); + // Write root type. + Write(stack_[0].StoredPackedType(), 1); + // Write root size. Normally determined by parent, but root has no parent :) + Write(byte_width, 1); + + finished_ = true; + } + +private: + void Finished() const + { + // If you get this assert, you're attempting to get access a buffer + // which hasn't been finished yet. Be sure to call + // Builder::Finish with your root object. + FLATBUFFERS_ASSERT(finished_); + } + + // Align to prepare for writing a scalar with a certain size. + uint8_t Align(BitWidth alignment) + { + auto byte_width = 1U << alignment; + buf_.insert(buf_.end(), flatbuffers::PaddingBytes(buf_.size(), byte_width), + 0); + return static_cast(byte_width); + } + + void WriteBytes(const void *val, size_t size) + { + buf_.insert(buf_.end(), reinterpret_cast(val), + reinterpret_cast(val) + size); + } + + template + void Write(T val, size_t byte_width) + { + FLATBUFFERS_ASSERT(sizeof(T) >= byte_width); + val = flatbuffers::EndianScalar(val); + WriteBytes(&val, byte_width); + } + + void WriteDouble(double f, uint8_t byte_width) + { + switch (byte_width) { + case 8: + Write(f, byte_width); + break; + case 4: + Write(static_cast(f), byte_width); + break; + // case 2: Write(static_cast(f), byte_width); break; + // case 1: Write(static_cast(f), byte_width); break; + default: + FLATBUFFERS_ASSERT(0); + } + } + + void WriteOffset(uint64_t o, uint8_t byte_width) + { + auto reloff = buf_.size() - o; + FLATBUFFERS_ASSERT(byte_width == 8 || reloff < 1ULL << (byte_width * 8)); + Write(reloff, byte_width); + } + + template + void PushIndirect(T val, Type type, BitWidth bit_width) + { + auto byte_width = Align(bit_width); + auto iloc = buf_.size(); + Write(val, byte_width); + stack_.push_back(Value(static_cast(iloc), type, bit_width)); + } + + static BitWidth WidthB(size_t byte_width) + { + switch (byte_width) { + case 1: + return BIT_WIDTH_8; + case 2: + return BIT_WIDTH_16; + case 4: + return BIT_WIDTH_32; + case 8: + return BIT_WIDTH_64; + default: + FLATBUFFERS_ASSERT(false); + return BIT_WIDTH_64; + } + } + + template + static Type GetScalarType() + { + static_assert(flatbuffers::is_scalar::value, "Unrelated types"); + return flatbuffers::is_floating_point::value ? FBT_FLOAT : flatbuffers::is_same::value ? FBT_BOOL : + (flatbuffers::is_unsigned::value ? FBT_UINT : FBT_INT); + } + +public: + // This was really intended to be private, except for LastValue/ReuseValue. + struct Value { + union { + int64_t i_; + uint64_t u_; + double f_; + }; + + Type type_; + + // For scalars: of itself, for vector: of its elements, for string: length. + BitWidth min_bit_width_; + + Value() + : i_(0), type_(FBT_NULL), min_bit_width_(BIT_WIDTH_8) + { + } + + Value(bool b) + : u_(static_cast(b)), + type_(FBT_BOOL), + min_bit_width_(BIT_WIDTH_8) + { + } + + Value(int64_t i, Type t, BitWidth bw) + : i_(i), type_(t), min_bit_width_(bw) + { + } + Value(uint64_t u, Type t, BitWidth bw) + : u_(u), type_(t), min_bit_width_(bw) + { + } + + Value(float f) + : f_(static_cast(f)), + type_(FBT_FLOAT), + min_bit_width_(BIT_WIDTH_32) + { + } + Value(double f) + : f_(f), type_(FBT_FLOAT), min_bit_width_(WidthF(f)) + { + } + + uint8_t StoredPackedType(BitWidth parent_bit_width_ = BIT_WIDTH_8) const + { + return PackedType(StoredWidth(parent_bit_width_), type_); + } + + BitWidth ElemWidth(size_t buf_size, size_t elem_index) const + { + if (IsInline(type_)) { + return min_bit_width_; + } else { + // We have an absolute offset, but want to store a relative offset + // elem_index elements beyond the current buffer end. Since whether + // the relative offset fits in a certain byte_width depends on + // the size of the elements before it (and their alignment), we have + // to test for each size in turn. + for (size_t byte_width = 1; + byte_width <= sizeof(flatbuffers::largest_scalar_t); + byte_width *= 2) { + // Where are we going to write this offset? + auto offset_loc = buf_size + + flatbuffers::PaddingBytes(buf_size, byte_width) + + elem_index * byte_width; + // Compute relative offset. + auto offset = offset_loc - u_; + // Does it fit? + auto bit_width = WidthU(offset); + if (static_cast(static_cast(1U) << bit_width) == + byte_width) + return bit_width; + } + FLATBUFFERS_ASSERT(false); // Must match one of the sizes above. + return BIT_WIDTH_64; + } + } + + BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const + { + if (IsInline(type_)) { + return (std::max)(min_bit_width_, parent_bit_width_); + } else { + return min_bit_width_; + } + } + }; + +private: + void WriteAny(const Value &val, uint8_t byte_width) + { + switch (val.type_) { + case FBT_NULL: + case FBT_INT: + Write(val.i_, byte_width); + break; + case FBT_BOOL: + case FBT_UINT: + Write(val.u_, byte_width); + break; + case FBT_FLOAT: + WriteDouble(val.f_, byte_width); + break; + default: + WriteOffset(val.u_, byte_width); + break; + } + } + + size_t CreateBlob(const void *data, size_t len, size_t trailing, Type type) + { + auto bit_width = WidthU(len); + auto byte_width = Align(bit_width); + Write(len, byte_width); + auto sloc = buf_.size(); + WriteBytes(data, len + trailing); + stack_.push_back(Value(static_cast(sloc), type, bit_width)); + return sloc; + } + + template + size_t ScalarVector(const T *elems, size_t len, bool fixed) + { + auto vector_type = GetScalarType(); + auto byte_width = sizeof(T); + auto bit_width = WidthB(byte_width); + // If you get this assert, you're trying to write a vector with a size + // field that is bigger than the scalars you're trying to write (e.g. a + // byte vector > 255 elements). For such types, write a "blob" instead. + // TODO: instead of asserting, could write vector with larger elements + // instead, though that would be wasteful. + FLATBUFFERS_ASSERT(WidthU(len) <= bit_width); + Align(bit_width); + if (!fixed) + Write(len, byte_width); + auto vloc = buf_.size(); + for (size_t i = 0; i < len; i++) + Write(elems[i], byte_width); + stack_.push_back(Value(static_cast(vloc), + ToTypedVector(vector_type, fixed ? len : 0), + bit_width)); + return vloc; + } + + Value CreateVector(size_t start, size_t vec_len, size_t step, bool typed, + bool fixed, const Value *keys = nullptr) + { + FLATBUFFERS_ASSERT( + !fixed || + typed); // typed=false, fixed=true combination is not supported. + // Figure out smallest bit width we can store this vector with. + auto bit_width = (std::max)(force_min_bit_width_, WidthU(vec_len)); + auto prefix_elems = 1; + if (keys) { + // If this vector is part of a map, we will pre-fix an offset to the keys + // to this vector. + bit_width = (std::max)(bit_width, keys->ElemWidth(buf_.size(), 0)); + prefix_elems += 2; + } + Type vector_type = FBT_KEY; + // Check bit widths and types for all elements. + for (size_t i = start; i < stack_.size(); i += step) { + auto elem_width = + stack_[i].ElemWidth(buf_.size(), i - start + prefix_elems); + bit_width = (std::max)(bit_width, elem_width); + if (typed) { + if (i == start) { + vector_type = stack_[i].type_; + } else { + // If you get this assert, you are writing a typed vector with + // elements that are not all the same type. + FLATBUFFERS_ASSERT(vector_type == stack_[i].type_); + } + } + } + // If you get this assert, your fixed types are not one of: + // Int / UInt / Float / Key. + FLATBUFFERS_ASSERT(!fixed || IsTypedVectorElementType(vector_type)); + auto byte_width = Align(bit_width); + // Write vector. First the keys width/offset if available, and size. + if (keys) { + WriteOffset(keys->u_, byte_width); + Write(1ULL << keys->min_bit_width_, byte_width); + } + if (!fixed) + Write(vec_len, byte_width); + // Then the actual data. + auto vloc = buf_.size(); + for (size_t i = start; i < stack_.size(); i += step) { + WriteAny(stack_[i], byte_width); + } + // Then the types. + if (!typed) { + for (size_t i = start; i < stack_.size(); i += step) { + buf_.push_back(stack_[i].StoredPackedType(bit_width)); + } + } + return Value(static_cast(vloc), + keys ? FBT_MAP : (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0) : FBT_VECTOR), + bit_width); + } + + // You shouldn't really be copying instances of this class. + Builder(const Builder &); + Builder &operator=(const Builder &); + + std::vector buf_; + std::vector stack_; + + bool finished_; + + BuilderFlag flags_; + + BitWidth force_min_bit_width_; + + struct KeyOffsetCompare { + explicit KeyOffsetCompare(const std::vector &buf) + : buf_(&buf) + { + } + bool operator()(size_t a, size_t b) const + { + auto stra = + reinterpret_cast(flatbuffers::vector_data(*buf_) + a); + auto strb = + reinterpret_cast(flatbuffers::vector_data(*buf_) + b); + return strcmp(stra, strb) < 0; + } + const std::vector *buf_; + }; + + typedef std::pair StringOffset; + struct StringOffsetCompare { + explicit StringOffsetCompare(const std::vector &buf) + : buf_(&buf) + { + } + bool operator()(const StringOffset &a, const StringOffset &b) const + { + auto stra = reinterpret_cast( + flatbuffers::vector_data(*buf_) + a.first); + auto strb = reinterpret_cast( + flatbuffers::vector_data(*buf_) + b.first); + return strncmp(stra, strb, (std::min)(a.second, b.second) + 1) < 0; + } + const std::vector *buf_; + }; + + typedef std::set KeyOffsetMap; + typedef std::set StringOffsetMap; + + KeyOffsetMap key_pool; + StringOffsetMap string_pool; +}; + +} // namespace flexbuffers + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#endif // FLATBUFFERS_FLEXBUFFERS_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/grpc.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/grpc.h new file mode 100644 index 00000000..dc4c78ab --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/grpc.h @@ -0,0 +1,390 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_GRPC_H_ +#define FLATBUFFERS_GRPC_H_ + +// Helper functionality to glue FlatBuffers and GRPC. + +#include "flatbuffers/flatbuffers.h" +#include "grpc++/support/byte_buffer.h" +#include "grpc/byte_buffer_reader.h" + +namespace flatbuffers { +namespace grpc { +// Message is a typed wrapper around a buffer that manages the underlying +// `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify` +// and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer +// is refcounted and ownership is be managed automatically. +template +class Message { +public: + Message() + : slice_(grpc_empty_slice()) + { + } + + Message(grpc_slice slice, bool add_ref) + : slice_(add_ref ? grpc_slice_ref(slice) : slice) + { + } + + Message &operator=(const Message &other) = delete; + + Message(Message &&other) + : slice_(other.slice_) + { + other.slice_ = grpc_empty_slice(); + } + + Message(const Message &other) = delete; + + Message &operator=(Message &&other) + { + grpc_slice_unref(slice_); + slice_ = other.slice_; + other.slice_ = grpc_empty_slice(); + return *this; + } + + ~Message() + { + grpc_slice_unref(slice_); + } + + const uint8_t *mutable_data() const + { + return GRPC_SLICE_START_PTR(slice_); + } + + const uint8_t *data() const + { + return GRPC_SLICE_START_PTR(slice_); + } + + size_t size() const + { + return GRPC_SLICE_LENGTH(slice_); + } + + bool Verify() const + { + Verifier verifier(data(), size()); + return verifier.VerifyBuffer(nullptr); + } + + T *GetMutableRoot() + { + return flatbuffers::GetMutableRoot(mutable_data()); + } + + const T *GetRoot() const + { + return flatbuffers::GetRoot(data()); + } + + // This is only intended for serializer use, or if you know what you're doing + const grpc_slice &BorrowSlice() const + { + return slice_; + } + +private: + grpc_slice slice_; +}; + +class MessageBuilder; + +// SliceAllocator is a gRPC-specific allocator that uses the `grpc_slice` +// refcounted slices to manage memory ownership. This makes it easy and +// efficient to transfer buffers to gRPC. +class SliceAllocator : public Allocator { +public: + SliceAllocator() + : slice_(grpc_empty_slice()) + { + } + + SliceAllocator(const SliceAllocator &other) = delete; + SliceAllocator &operator=(const SliceAllocator &other) = delete; + + SliceAllocator(SliceAllocator &&other) + : slice_(grpc_empty_slice()) + { + // default-construct and swap idiom + swap(other); + } + + SliceAllocator &operator=(SliceAllocator &&other) + { + // move-construct and swap idiom + SliceAllocator temp(std::move(other)); + swap(temp); + return *this; + } + + void swap(SliceAllocator &other) + { + using std::swap; + swap(slice_, other.slice_); + } + + virtual ~SliceAllocator() + { + grpc_slice_unref(slice_); + } + + virtual uint8_t *allocate(size_t size) override + { + FLATBUFFERS_ASSERT(GRPC_SLICE_IS_EMPTY(slice_)); + slice_ = grpc_slice_malloc(size); + return GRPC_SLICE_START_PTR(slice_); + } + + virtual void deallocate(uint8_t *p, size_t size) override + { + FLATBUFFERS_ASSERT(p == GRPC_SLICE_START_PTR(slice_)); + FLATBUFFERS_ASSERT(size == GRPC_SLICE_LENGTH(slice_)); + grpc_slice_unref(slice_); + slice_ = grpc_empty_slice(); + } + + virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, + size_t new_size, size_t in_use_back, + size_t in_use_front) override + { + FLATBUFFERS_ASSERT(old_p == GRPC_SLICE_START_PTR(slice_)); + FLATBUFFERS_ASSERT(old_size == GRPC_SLICE_LENGTH(slice_)); + FLATBUFFERS_ASSERT(new_size > old_size); + grpc_slice old_slice = slice_; + grpc_slice new_slice = grpc_slice_malloc(new_size); + uint8_t *new_p = GRPC_SLICE_START_PTR(new_slice); + memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, + in_use_front); + slice_ = new_slice; + grpc_slice_unref(old_slice); + return new_p; + } + +private: + grpc_slice &get_slice(uint8_t *p, size_t size) + { + FLATBUFFERS_ASSERT(p == GRPC_SLICE_START_PTR(slice_)); + FLATBUFFERS_ASSERT(size == GRPC_SLICE_LENGTH(slice_)); + return slice_; + } + + grpc_slice slice_; + + friend class MessageBuilder; +}; + +// SliceAllocatorMember is a hack to ensure that the MessageBuilder's +// slice_allocator_ member is constructed before the FlatBufferBuilder, since +// the allocator is used in the FlatBufferBuilder ctor. +namespace detail { +struct SliceAllocatorMember { + SliceAllocator slice_allocator_; +}; +} // namespace detail + +// MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator +// to allocate gRPC buffers. +class MessageBuilder : private detail::SliceAllocatorMember, + public FlatBufferBuilder { +public: + explicit MessageBuilder(uoffset_t initial_size = 1024) + : FlatBufferBuilder(initial_size, &slice_allocator_, false) + { + } + + MessageBuilder(const MessageBuilder &other) = delete; + MessageBuilder &operator=(const MessageBuilder &other) = delete; + + MessageBuilder(MessageBuilder &&other) + : FlatBufferBuilder(1024, &slice_allocator_, false) + { + // Default construct and swap idiom. + Swap(other); + } + + /// Create a MessageBuilder from a FlatBufferBuilder. + explicit MessageBuilder(FlatBufferBuilder &&src, + void (*dealloc)(void *, + size_t) = &DefaultAllocator::dealloc) + : FlatBufferBuilder(1024, &slice_allocator_, false) + { + src.Swap(*this); + src.SwapBufAllocator(*this); + if (buf_.capacity()) { + uint8_t *buf = buf_.scratch_data(); // pointer to memory + size_t capacity = buf_.capacity(); // size of memory + slice_allocator_.slice_ = grpc_slice_new_with_len(buf, capacity, dealloc); + } else { + slice_allocator_.slice_ = grpc_empty_slice(); + } + } + + /// Move-assign a FlatBufferBuilder to a MessageBuilder. + /// Only FlatBufferBuilder with default allocator (basically, nullptr) is + /// supported. + MessageBuilder &operator=(FlatBufferBuilder &&src) + { + // Move construct a temporary and swap + MessageBuilder temp(std::move(src)); + Swap(temp); + return *this; + } + + MessageBuilder &operator=(MessageBuilder &&other) + { + // Move construct a temporary and swap + MessageBuilder temp(std::move(other)); + Swap(temp); + return *this; + } + + void Swap(MessageBuilder &other) + { + slice_allocator_.swap(other.slice_allocator_); + FlatBufferBuilder::Swap(other); + // After swapping the FlatBufferBuilder, we swap back the allocator, which + // restores the original allocator back in place. This is necessary because + // MessageBuilder's allocator is its own member (SliceAllocatorMember). The + // allocator passed to FlatBufferBuilder::vector_downward must point to this + // member. + buf_.swap_allocator(other.buf_); + } + + // Releases the ownership of the buffer pointer. + // Returns the size, offset, and the original grpc_slice that + // allocated the buffer. Also see grpc_slice_unref(). + uint8_t *ReleaseRaw(size_t &size, size_t &offset, grpc_slice &slice) + { + uint8_t *buf = FlatBufferBuilder::ReleaseRaw(size, offset); + slice = slice_allocator_.slice_; + slice_allocator_.slice_ = grpc_empty_slice(); + return buf; + } + + ~MessageBuilder() + { + } + + // GetMessage extracts the subslice of the buffer corresponding to the + // flatbuffers-encoded region and wraps it in a `Message` to handle buffer + // ownership. + template + Message GetMessage() + { + auto buf_data = buf_.scratch_data(); // pointer to memory + auto buf_size = buf_.capacity(); // size of memory + auto msg_data = buf_.data(); // pointer to msg + auto msg_size = buf_.size(); // size of msg + // Do some sanity checks on data/size + FLATBUFFERS_ASSERT(msg_data); + FLATBUFFERS_ASSERT(msg_size); + FLATBUFFERS_ASSERT(msg_data >= buf_data); + FLATBUFFERS_ASSERT(msg_data + msg_size <= buf_data + buf_size); + // Calculate offsets from the buffer start + auto begin = msg_data - buf_data; + auto end = begin + msg_size; + // Get the slice we are working with (no refcount change) + grpc_slice slice = slice_allocator_.get_slice(buf_data, buf_size); + // Extract a subslice of the existing slice (increment refcount) + grpc_slice subslice = grpc_slice_sub(slice, begin, end); + // Wrap the subslice in a `Message`, but don't increment refcount + Message msg(subslice, false); + return msg; + } + + template + Message ReleaseMessage() + { + Message msg = GetMessage(); + Reset(); + return msg; + } + +private: + // SliceAllocator slice_allocator_; // part of SliceAllocatorMember +}; + +} // namespace grpc +} // namespace flatbuffers + +namespace grpc { +template +class SerializationTraits > { +public: + static grpc::Status Serialize(const flatbuffers::grpc::Message &msg, + grpc_byte_buffer **buffer, bool *own_buffer) + { + // We are passed in a `Message`, which is a wrapper around a + // `grpc_slice`. We extract it here using `BorrowSlice()`. The const cast + // is necessary because the `grpc_raw_byte_buffer_create` func expects + // non-const slices in order to increment their refcounts. + grpc_slice *slice = const_cast(&msg.BorrowSlice()); + // Now use `grpc_raw_byte_buffer_create` to package the single slice into a + // `grpc_byte_buffer`, incrementing the refcount in the process. + *buffer = grpc_raw_byte_buffer_create(slice, 1); + *own_buffer = true; + return grpc::Status::OK; + } + + // Deserialize by pulling the + static grpc::Status Deserialize(grpc_byte_buffer *buffer, + flatbuffers::grpc::Message *msg) + { + if (!buffer) { + return ::grpc::Status(::grpc::StatusCode::INTERNAL, "No payload"); + } + // Check if this is a single uncompressed slice. + if ((buffer->type == GRPC_BB_RAW) && + (buffer->data.raw.compression == GRPC_COMPRESS_NONE) && + (buffer->data.raw.slice_buffer.count == 1)) { + // If it is, then we can reference the `grpc_slice` directly. + grpc_slice slice = buffer->data.raw.slice_buffer.slices[0]; + // We wrap a `Message` around the slice, incrementing the refcount. + *msg = flatbuffers::grpc::Message(slice, true); + } else { + // Otherwise, we need to use `grpc_byte_buffer_reader_readall` to read + // `buffer` into a single contiguous `grpc_slice`. The gRPC reader gives + // us back a new slice with the refcount already incremented. + grpc_byte_buffer_reader reader; + grpc_byte_buffer_reader_init(&reader, buffer); + grpc_slice slice = grpc_byte_buffer_reader_readall(&reader); + grpc_byte_buffer_reader_destroy(&reader); + // We wrap a `Message` around the slice, but don't increment refcount + *msg = flatbuffers::grpc::Message(slice, false); + } + grpc_byte_buffer_destroy(buffer); +#if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION + return ::grpc::Status::OK; +#else + if (msg->Verify()) { + return ::grpc::Status::OK; + } else { + return ::grpc::Status(::grpc::StatusCode::INTERNAL, + "Message verification failed"); + } +#endif + } +}; + +} // namespace grpc + +#endif // FLATBUFFERS_GRPC_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/hash.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/hash.h new file mode 100644 index 00000000..a197cb5f --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/hash.h @@ -0,0 +1,141 @@ +/* + * Copyright 2015 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_HASH_H_ +#define FLATBUFFERS_HASH_H_ + +#include +#include + +#include "flatbuffers/flatbuffers.h" + +namespace flatbuffers { +template +struct FnvTraits { + static const T kFnvPrime; + static const T kOffsetBasis; +}; + +template <> +struct FnvTraits { + static const uint32_t kFnvPrime = 0x01000193; + static const uint32_t kOffsetBasis = 0x811C9DC5; +}; + +template <> +struct FnvTraits { + static const uint64_t kFnvPrime = 0x00000100000001b3ULL; + static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL; +}; + +template +T HashFnv1(const char *input) +{ + T hash = FnvTraits::kOffsetBasis; + for (const char *c = input; *c; ++c) { + hash *= FnvTraits::kFnvPrime; + hash ^= static_cast(*c); + } + return hash; +} + +template +T HashFnv1a(const char *input) +{ + T hash = FnvTraits::kOffsetBasis; + for (const char *c = input; *c; ++c) { + hash ^= static_cast(*c); + hash *= FnvTraits::kFnvPrime; + } + return hash; +} + +template <> +inline uint16_t HashFnv1(const char *input) +{ + uint32_t hash = HashFnv1(input); + return (hash >> 16) ^ (hash & 0xffff); +} + +template <> +inline uint16_t HashFnv1a(const char *input) +{ + uint32_t hash = HashFnv1a(input); + return (hash >> 16) ^ (hash & 0xffff); +} + +template +struct NamedHashFunction { + const char *name; + + typedef T (*HashFunction)(const char *); + HashFunction function; +}; + +const NamedHashFunction kHashFunctions16[] = { + { "fnv1_16", HashFnv1 }, + { "fnv1a_16", HashFnv1a }, +}; + +const NamedHashFunction kHashFunctions32[] = { + { "fnv1_32", HashFnv1 }, + { "fnv1a_32", HashFnv1a }, +}; + +const NamedHashFunction kHashFunctions64[] = { + { "fnv1_64", HashFnv1 }, + { "fnv1a_64", HashFnv1a }, +}; + +inline NamedHashFunction::HashFunction FindHashFunction16( + const char *name) +{ + std::size_t size = sizeof(kHashFunctions16) / sizeof(kHashFunctions16[0]); + for (std::size_t i = 0; i < size; ++i) { + if (std::strcmp(name, kHashFunctions16[i].name) == 0) { + return kHashFunctions16[i].function; + } + } + return nullptr; +} + +inline NamedHashFunction::HashFunction FindHashFunction32( + const char *name) +{ + std::size_t size = sizeof(kHashFunctions32) / sizeof(kHashFunctions32[0]); + for (std::size_t i = 0; i < size; ++i) { + if (std::strcmp(name, kHashFunctions32[i].name) == 0) { + return kHashFunctions32[i].function; + } + } + return nullptr; +} + +inline NamedHashFunction::HashFunction FindHashFunction64( + const char *name) +{ + std::size_t size = sizeof(kHashFunctions64) / sizeof(kHashFunctions64[0]); + for (std::size_t i = 0; i < size; ++i) { + if (std::strcmp(name, kHashFunctions64[i].name) == 0) { + return kHashFunctions64[i].function; + } + } + return nullptr; +} + +} // namespace flatbuffers + +#endif // FLATBUFFERS_HASH_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/idl.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/idl.h new file mode 100644 index 00000000..8de343d3 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/idl.h @@ -0,0 +1,1241 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_IDL_H_ +#define FLATBUFFERS_IDL_H_ + +#include +#include +#include + +#include "flatbuffers/base.h" +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/flexbuffers.h" +#include "flatbuffers/hash.h" +#include "flatbuffers/reflection.h" + +#if !defined(FLATBUFFERS_CPP98_STL) +#include +#endif // !defined(FLATBUFFERS_CPP98_STL) + +// This file defines the data types representing a parsed IDL (Interface +// Definition Language) / schema file. + +// Limits maximum depth of nested objects. +// Prevents stack overflow while parse flatbuffers or json. +#if !defined(FLATBUFFERS_MAX_PARSING_DEPTH) +#define FLATBUFFERS_MAX_PARSING_DEPTH 64 +#endif + +namespace flatbuffers { +// The order of these matters for Is*() functions below. +// Additionally, Parser::ParseType assumes bool..string is a contiguous range +// of type tokens. +// clang-format off +#define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ + TD(NONE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ + TD(UTYPE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) /* begin scalar/int */ \ + TD(BOOL, "bool", uint8_t, boolean,bool, bool, bool, bool, Boolean, Bool) \ + TD(CHAR, "byte", int8_t, byte, int8, sbyte, int8, i8, Byte, Int8) \ + TD(UCHAR, "ubyte", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ + TD(SHORT, "short", int16_t, short, int16, short, int16, i16, Short, Int16) \ + TD(USHORT, "ushort", uint16_t, short, uint16, ushort, uint16, u16, UShort, UInt16) \ + TD(INT, "int", int32_t, int, int32, int, int32, i32, Int, Int32) \ + TD(UINT, "uint", uint32_t, int, uint32, uint, uint32, u32, UInt, UInt32) \ + TD(LONG, "long", int64_t, long, int64, long, int64, i64, Long, Int64) \ + TD(ULONG, "ulong", uint64_t, long, uint64, ulong, uint64, u64, ULong, UInt64) /* end int */ \ + TD(FLOAT, "float", float, float, float32, float, float32, f32, Float, Float32) /* begin float */ \ + TD(DOUBLE, "double", double, double, float64, double, float64, f64, Double, Double) /* end float/scalar */ +#define FLATBUFFERS_GEN_TYPES_POINTER(TD) \ + TD(STRING, "string", Offset, int, int, StringOffset, int, unused, Int, Offset) \ + TD(VECTOR, "", Offset, int, int, VectorOffset, int, unused, Int, Offset) \ + TD(STRUCT, "", Offset, int, int, int, int, unused, Int, Offset) \ + TD(UNION, "", Offset, int, int, int, int, unused, Int, Offset) +#define FLATBUFFERS_GEN_TYPE_ARRAY(TD) \ + TD(ARRAY, "", int, int, int, int, int, unused, Int, Offset) +// The fields are: +// - enum +// - FlatBuffers schema type. +// - C++ type. +// - Java type. +// - Go type. +// - C# / .Net type. +// - Python type. +// - Rust type. +// - Kotlin type. + +// using these macros, we can now write code dealing with types just once, e.g. + +/* +switch (type) { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ + RTYPE, KTYPE) \ + case BASE_TYPE_ ## ENUM: \ + // do something specific to CTYPE here + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD +} +*/ + +// If not all FLATBUFFERS_GEN_() arguments are necessary for implementation +// of FLATBUFFERS_TD, you can use a variadic macro (with __VA_ARGS__ if needed). +// In the above example, only CTYPE is used to generate the code, it can be rewritten: + +/* +switch (type) { + #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ + case BASE_TYPE_ ## ENUM: \ + // do something specific to CTYPE here + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD +} +*/ + +#define FLATBUFFERS_GEN_TYPES(TD) \ + FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ + FLATBUFFERS_GEN_TYPES_POINTER(TD) \ + FLATBUFFERS_GEN_TYPE_ARRAY(TD) + +// Create an enum for all the types above. +#ifdef __GNUC__ +__extension__ // Stop GCC complaining about trailing comma with -Wpendantic. +#endif +enum BaseType { + #define FLATBUFFERS_TD(ENUM, ...) \ + BASE_TYPE_ ## ENUM, + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) + #undef FLATBUFFERS_TD +}; + +#define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ + static_assert(sizeof(CTYPE) <= sizeof(largest_scalar_t), \ + "define largest_scalar_t as " #CTYPE); + FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) +#undef FLATBUFFERS_TD + +inline bool IsScalar (BaseType t) { return t >= BASE_TYPE_UTYPE && + t <= BASE_TYPE_DOUBLE; } +inline bool IsInteger(BaseType t) { return t >= BASE_TYPE_UTYPE && + t <= BASE_TYPE_ULONG; } +inline bool IsFloat (BaseType t) { return t == BASE_TYPE_FLOAT || + t == BASE_TYPE_DOUBLE; } +inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG || + t == BASE_TYPE_ULONG; } +inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; } +inline bool IsOneByte(BaseType t) { return t >= BASE_TYPE_UTYPE && + t <= BASE_TYPE_UCHAR; } + +inline bool IsUnsigned(BaseType t) { + return (t == BASE_TYPE_UTYPE) || (t == BASE_TYPE_UCHAR) || + (t == BASE_TYPE_USHORT) || (t == BASE_TYPE_UINT) || + (t == BASE_TYPE_ULONG); +} + +// clang-format on + +extern const char *const kTypeNames[]; +extern const char kTypeSizes[]; + +inline size_t SizeOf(BaseType t) +{ + return kTypeSizes[t]; +} + +struct StructDef; +struct EnumDef; +class Parser; + +// Represents any type in the IDL, which is a combination of the BaseType +// and additional information for vectors/structs_. +struct Type { + explicit Type(BaseType _base_type = BASE_TYPE_NONE, StructDef *_sd = nullptr, + EnumDef *_ed = nullptr, uint16_t _fixed_length = 0) + : base_type(_base_type), + element(BASE_TYPE_NONE), + struct_def(_sd), + enum_def(_ed), + fixed_length(_fixed_length) + { + } + + bool operator==(const Type &o) + { + return base_type == o.base_type && element == o.element && + struct_def == o.struct_def && enum_def == o.enum_def; + } + + Type VectorType() const + { + return Type(element, struct_def, enum_def, fixed_length); + } + + Offset Serialize(FlatBufferBuilder *builder) const; + + bool Deserialize(const Parser &parser, const reflection::Type *type); + + BaseType base_type; + BaseType element; // only set if t == BASE_TYPE_VECTOR + StructDef *struct_def; // only set if t or element == BASE_TYPE_STRUCT + EnumDef *enum_def; // set if t == BASE_TYPE_UNION / BASE_TYPE_UTYPE, + // or for an integral type derived from an enum. + uint16_t fixed_length; // only set if t == BASE_TYPE_ARRAY +}; + +// Represents a parsed scalar value, it's type, and field offset. +struct Value { + Value() + : constant("0"), + offset(static_cast(~(static_cast(0U)))) + { + } + Type type; + std::string constant; + voffset_t offset; +}; + +// Helper class that retains the original order of a set of identifiers and +// also provides quick lookup. +template +class SymbolTable { +public: + ~SymbolTable() + { + for (auto it = vec.begin(); it != vec.end(); ++it) { + delete *it; + } + } + + bool Add(const std::string &name, T *e) + { + vector_emplace_back(&vec, e); + auto it = dict.find(name); + if (it != dict.end()) + return true; + dict[name] = e; + return false; + } + + void Move(const std::string &oldname, const std::string &newname) + { + auto it = dict.find(oldname); + if (it != dict.end()) { + auto obj = it->second; + dict.erase(it); + dict[newname] = obj; + } else { + FLATBUFFERS_ASSERT(false); + } + } + + T *Lookup(const std::string &name) const + { + auto it = dict.find(name); + return it == dict.end() ? nullptr : it->second; + } + +public: + std::map dict; // quick lookup + std::vector vec; // Used to iterate in order of insertion +}; + +// A name space, as set in the schema. +struct Namespace { + Namespace() + : from_table(0) + { + } + + // Given a (potentially unqualified) name, return the "fully qualified" name + // which has a full namespaced descriptor. + // With max_components you can request less than the number of components + // the current namespace has. + std::string GetFullyQualifiedName(const std::string &name, + size_t max_components = 1000) const; + + std::vector components; + size_t from_table; // Part of the namespace corresponds to a message/table. +}; + +inline bool operator<(const Namespace &a, const Namespace &b) +{ + size_t min_size = std::min(a.components.size(), b.components.size()); + for (size_t i = 0; i < min_size; ++i) { + if (a.components[i] != b.components[i]) + return a.components[i] < b.components[i]; + } + return a.components.size() < b.components.size(); +} + +// Base class for all definition types (fields, structs_, enums_). +struct Definition { + Definition() + : generated(false), + defined_namespace(nullptr), + serialized_location(0), + index(-1), + refcount(1) + { + } + + flatbuffers::Offset< + flatbuffers::Vector > > + SerializeAttributes(FlatBufferBuilder *builder, const Parser &parser) const; + + bool DeserializeAttributes(Parser &parser, + const Vector > *attrs); + + std::string name; + std::string file; + std::vector doc_comment; + SymbolTable attributes; + bool generated; // did we already output code for this definition? + Namespace *defined_namespace; // Where it was defined. + + // For use with Serialize() + uoffset_t serialized_location; + int index; // Inside the vector it is stored. + int refcount; +}; + +struct FieldDef : public Definition { + FieldDef() + : deprecated(false), + required(false), + key(false), + shared(false), + native_inline(false), + flexbuffer(false), + optional(false), + nested_flatbuffer(NULL), + padding(0) + { + } + + Offset Serialize(FlatBufferBuilder *builder, uint16_t id, + const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::Field *field); + + bool IsScalarOptional() const + { + return IsScalar(value.type.base_type) && optional; + } + + Value value; + bool deprecated; // Field is allowed to be present in old data, but can't be. + // written in new data nor accessed in new code. + bool required; // Field must always be present. + bool key; // Field functions as a key for creating sorted vectors. + bool shared; // Field will be using string pooling (i.e. CreateSharedString) + // as default serialization behavior if field is a string. + bool native_inline; // Field will be defined inline (instead of as a pointer) + // for native tables if field is a struct. + bool flexbuffer; // This field contains FlexBuffer data. + bool optional; // If True, this field is Null (as opposed to default + // valued). + StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. + size_t padding; // Bytes to always pad after this field. +}; + +struct StructDef : public Definition { + StructDef() + : fixed(false), + predecl(true), + sortbysize(true), + has_key(false), + minalign(1), + bytesize(0) + { + } + + void PadLastField(size_t min_align) + { + auto padding = PaddingBytes(bytesize, min_align); + bytesize += padding; + if (fields.vec.size()) + fields.vec.back()->padding = padding; + } + + Offset Serialize(FlatBufferBuilder *builder, + const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::Object *object); + + SymbolTable fields; + + bool fixed; // If it's struct, not a table. + bool predecl; // If it's used before it was defined. + bool sortbysize; // Whether fields come in the declaration or size order. + bool has_key; // It has a key field. + size_t minalign; // What the whole object needs to be aligned to. + size_t bytesize; // Size if fixed. + + flatbuffers::unique_ptr original_location; +}; + +struct EnumDef; +struct EnumValBuilder; + +struct EnumVal { + Offset Serialize(FlatBufferBuilder *builder, + const Parser &parser) const; + + bool Deserialize(const Parser &parser, const reflection::EnumVal *val); + + uint64_t GetAsUInt64() const + { + return static_cast(value); + } + int64_t GetAsInt64() const + { + return value; + } + bool IsZero() const + { + return 0 == value; + } + bool IsNonZero() const + { + return !IsZero(); + } + + std::string name; + std::vector doc_comment; + Type union_type; + +private: + friend EnumDef; + friend EnumValBuilder; + friend bool operator==(const EnumVal &lhs, const EnumVal &rhs); + + EnumVal(const std::string &_name, int64_t _val) + : name(_name), value(_val) + { + } + EnumVal() + : value(0) + { + } + + int64_t value; +}; + +struct EnumDef : public Definition { + EnumDef() + : is_union(false), uses_multiple_type_instances(false) + { + } + + Offset Serialize(FlatBufferBuilder *builder, + const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::Enum *values); + + template + void ChangeEnumValue(EnumVal *ev, T new_val); + void SortByValue(); + void RemoveDuplicates(); + + std::string AllFlags() const; + const EnumVal *MinValue() const; + const EnumVal *MaxValue() const; + // Returns the number of integer steps from v1 to v2. + uint64_t Distance(const EnumVal *v1, const EnumVal *v2) const; + // Returns the number of integer steps from Min to Max. + uint64_t Distance() const + { + return Distance(MinValue(), MaxValue()); + } + + EnumVal *ReverseLookup(int64_t enum_idx, + bool skip_union_default = false) const; + EnumVal *FindByValue(const std::string &constant) const; + + std::string ToString(const EnumVal &ev) const + { + return IsUInt64() ? NumToString(ev.GetAsUInt64()) : NumToString(ev.GetAsInt64()); + } + + size_t size() const + { + return vals.vec.size(); + } + + const std::vector &Vals() const + { + return vals.vec; + } + + const EnumVal *Lookup(const std::string &enum_name) const + { + return vals.Lookup(enum_name); + } + + bool is_union; + // Type is a union which uses type aliases where at least one type is + // available under two different names. + bool uses_multiple_type_instances; + Type underlying_type; + +private: + bool IsUInt64() const + { + return (BASE_TYPE_ULONG == underlying_type.base_type); + } + + friend EnumValBuilder; + SymbolTable vals; +}; + +inline bool IsStruct(const Type &type) +{ + return type.base_type == BASE_TYPE_STRUCT && type.struct_def->fixed; +} + +inline bool IsUnion(const Type &type) +{ + return type.enum_def != nullptr && type.enum_def->is_union; +} + +inline bool IsVector(const Type &type) +{ + return type.base_type == BASE_TYPE_VECTOR; +} + +inline bool IsArray(const Type &type) +{ + return type.base_type == BASE_TYPE_ARRAY; +} + +inline bool IsSeries(const Type &type) +{ + return IsVector(type) || IsArray(type); +} + +inline bool IsEnum(const Type &type) +{ + return type.enum_def != nullptr && IsInteger(type.base_type); +} + +inline size_t InlineSize(const Type &type) +{ + return IsStruct(type) ? type.struct_def->bytesize : (IsArray(type) ? InlineSize(type.VectorType()) * type.fixed_length : SizeOf(type.base_type)); +} + +inline size_t InlineAlignment(const Type &type) +{ + if (IsStruct(type)) { + return type.struct_def->minalign; + } else if (IsArray(type)) { + return IsStruct(type.VectorType()) ? type.struct_def->minalign : SizeOf(type.element); + } else { + return SizeOf(type.base_type); + } +} +inline bool operator==(const EnumVal &lhs, const EnumVal &rhs) +{ + return lhs.value == rhs.value; +} +inline bool operator!=(const EnumVal &lhs, const EnumVal &rhs) +{ + return !(lhs == rhs); +} + +inline bool EqualByName(const Type &a, const Type &b) +{ + return a.base_type == b.base_type && a.element == b.element && + (a.struct_def == b.struct_def || + a.struct_def->name == b.struct_def->name) && + (a.enum_def == b.enum_def || a.enum_def->name == b.enum_def->name); +} + +struct RPCCall : public Definition { + Offset Serialize(FlatBufferBuilder *builder, + const Parser &parser) const; + + bool Deserialize(Parser &parser, const reflection::RPCCall *call); + + StructDef *request, *response; +}; + +struct ServiceDef : public Definition { + Offset Serialize(FlatBufferBuilder *builder, + const Parser &parser) const; + bool Deserialize(Parser &parser, const reflection::Service *service); + + SymbolTable calls; +}; + +// Container of options that may apply to any of the source/text generators. +struct IDLOptions { + bool gen_jvmstatic; + // Use flexbuffers instead for binary and text generation + bool use_flexbuffers; + bool strict_json; + bool skip_js_exports; + bool use_goog_js_export_format; + bool use_ES6_js_export_format; + bool output_default_scalars_in_json; + int indent_step; + bool output_enum_identifiers; + bool prefixed_enums; + bool scoped_enums; + bool include_dependence_headers; + bool mutable_buffer; + bool one_file; + bool proto_mode; + bool proto_oneof_union; + bool generate_all; + bool skip_unexpected_fields_in_json; + bool generate_name_strings; + bool generate_object_based_api; + bool gen_compare; + std::string cpp_object_api_pointer_type; + std::string cpp_object_api_string_type; + bool cpp_object_api_string_flexible_constructor; + bool gen_nullable; + bool java_checkerframework; + bool gen_generated; + std::string object_prefix; + std::string object_suffix; + bool union_value_namespacing; + bool allow_non_utf8; + bool natural_utf8; + std::string include_prefix; + bool keep_include_path; + bool binary_schema_comments; + bool binary_schema_builtins; + bool binary_schema_gen_embed; + bool skip_flatbuffers_import; + std::string go_import; + std::string go_namespace; + bool reexport_ts_modules; + bool js_ts_short_names; + bool protobuf_ascii_alike; + bool size_prefixed; + std::string root_type; + bool force_defaults; + bool java_primitive_has_method; + bool cs_gen_json_serializer; + std::vector cpp_includes; + std::string cpp_std; + std::string proto_namespace_suffix; + std::string filename_suffix; + std::string filename_extension; + + // Possible options for the more general generator below. + enum Language { + kJava = 1 << 0, + kCSharp = 1 << 1, + kGo = 1 << 2, + kCpp = 1 << 3, + kJs = 1 << 4, + kPython = 1 << 5, + kPhp = 1 << 6, + kJson = 1 << 7, + kBinary = 1 << 8, + kTs = 1 << 9, + kJsonSchema = 1 << 10, + kDart = 1 << 11, + kLua = 1 << 12, + kLobster = 1 << 13, + kRust = 1 << 14, + kKotlin = 1 << 15, + kSwift = 1 << 16, + kMAX + }; + + Language lang; + + enum MiniReflect { kNone, + kTypes, + kTypesAndNames }; + + MiniReflect mini_reflect; + + // The corresponding language bit will be set if a language is included + // for code generation. + unsigned long lang_to_generate; + + // If set (default behavior), empty string fields will be set to nullptr to + // make the flatbuffer more compact. + bool set_empty_strings_to_null; + + // If set (default behavior), empty vector fields will be set to nullptr to + // make the flatbuffer more compact. + bool set_empty_vectors_to_null; + + IDLOptions() + : gen_jvmstatic(false), + use_flexbuffers(false), + strict_json(false), + skip_js_exports(false), + use_goog_js_export_format(false), + use_ES6_js_export_format(false), + output_default_scalars_in_json(false), + indent_step(2), + output_enum_identifiers(true), + prefixed_enums(true), + scoped_enums(false), + include_dependence_headers(true), + mutable_buffer(false), + one_file(false), + proto_mode(false), + proto_oneof_union(false), + generate_all(false), + skip_unexpected_fields_in_json(false), + generate_name_strings(false), + generate_object_based_api(false), + gen_compare(false), + cpp_object_api_pointer_type("std::unique_ptr"), + cpp_object_api_string_flexible_constructor(false), + gen_nullable(false), + java_checkerframework(false), + gen_generated(false), + object_suffix("T"), + union_value_namespacing(true), + allow_non_utf8(false), + natural_utf8(false), + keep_include_path(false), + binary_schema_comments(false), + binary_schema_builtins(false), + binary_schema_gen_embed(false), + skip_flatbuffers_import(false), + reexport_ts_modules(true), + js_ts_short_names(false), + protobuf_ascii_alike(false), + size_prefixed(false), + force_defaults(false), + java_primitive_has_method(false), + cs_gen_json_serializer(false), + filename_suffix("_generated"), + filename_extension(), + lang(IDLOptions::kJava), + mini_reflect(IDLOptions::kNone), + lang_to_generate(0), + set_empty_strings_to_null(true), + set_empty_vectors_to_null(true) + { + } +}; + +// This encapsulates where the parser is in the current source file. +struct ParserState { + ParserState() + : cursor_(nullptr), + line_start_(nullptr), + line_(0), + token_(-1), + attr_is_trivial_ascii_string_(true) + { + } + +protected: + void ResetState(const char *source) + { + cursor_ = source; + line_ = 0; + MarkNewLine(); + } + + void MarkNewLine() + { + line_start_ = cursor_; + line_ += 1; + } + + int64_t CursorPosition() const + { + FLATBUFFERS_ASSERT(cursor_ && line_start_ && cursor_ >= line_start_); + return static_cast(cursor_ - line_start_); + } + + const char *cursor_; + const char *line_start_; + int line_; // the current line being parsed + int token_; + + // Flag: text in attribute_ is true ASCII string without escape + // sequences. Only printable ASCII (without [\t\r\n]). + // Used for number-in-string (and base64 string in future). + bool attr_is_trivial_ascii_string_; + std::string attribute_; + std::vector doc_comment_; +}; + +// A way to make error propagation less error prone by requiring values to be +// checked. +// Once you create a value of this type you must either: +// - Call Check() on it. +// - Copy or assign it to another value. +// Failure to do so leads to an assert. +// This guarantees that this as return value cannot be ignored. +class CheckedError { +public: + explicit CheckedError(bool error) + : is_error_(error), has_been_checked_(false) + { + } + + CheckedError &operator=(const CheckedError &other) + { + is_error_ = other.is_error_; + has_been_checked_ = false; + other.has_been_checked_ = true; + return *this; + } + + CheckedError(const CheckedError &other) + { + *this = other; // Use assignment operator. + } + + ~CheckedError() + { + FLATBUFFERS_ASSERT(has_been_checked_); + } + + bool Check() + { + has_been_checked_ = true; + return is_error_; + } + +private: + bool is_error_; + mutable bool has_been_checked_; +}; + +// Additionally, in GCC we can get these errors statically, for additional +// assurance: +// clang-format off +#ifdef __GNUC__ +#define FLATBUFFERS_CHECKED_ERROR CheckedError \ + __attribute__((warn_unused_result)) +#else +#define FLATBUFFERS_CHECKED_ERROR CheckedError +#endif +// clang-format on + +class Parser : public ParserState { +public: + explicit Parser(const IDLOptions &options = IDLOptions()) + : current_namespace_(nullptr), + empty_namespace_(nullptr), + flex_builder_(256, flexbuffers::BUILDER_FLAG_SHARE_ALL), + root_struct_def_(nullptr), + opts(options), + uses_flexbuffers_(false), + source_(nullptr), + anonymous_counter(0), + recurse_protection_counter(0) + { + if (opts.force_defaults) { + builder_.ForceDefaults(true); + } + // Start out with the empty namespace being current. + empty_namespace_ = new Namespace(); + namespaces_.push_back(empty_namespace_); + current_namespace_ = empty_namespace_; + known_attributes_["deprecated"] = true; + known_attributes_["required"] = true; + known_attributes_["key"] = true; + known_attributes_["shared"] = true; + known_attributes_["hash"] = true; + known_attributes_["id"] = true; + known_attributes_["force_align"] = true; + known_attributes_["bit_flags"] = true; + known_attributes_["original_order"] = true; + known_attributes_["nested_flatbuffer"] = true; + known_attributes_["csharp_partial"] = true; + known_attributes_["streaming"] = true; + known_attributes_["idempotent"] = true; + known_attributes_["cpp_type"] = true; + known_attributes_["cpp_ptr_type"] = true; + known_attributes_["cpp_ptr_type_get"] = true; + known_attributes_["cpp_str_type"] = true; + known_attributes_["cpp_str_flex_ctor"] = true; + known_attributes_["native_inline"] = true; + known_attributes_["native_custom_alloc"] = true; + known_attributes_["native_type"] = true; + known_attributes_["native_default"] = true; + known_attributes_["flexbuffer"] = true; + known_attributes_["private"] = true; + } + + ~Parser() + { + for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) { + delete *it; + } + } + + // Parse the string containing either schema or JSON data, which will + // populate the SymbolTable's or the FlatBufferBuilder above. + // include_paths is used to resolve any include statements, and typically + // should at least include the project path (where you loaded source_ from). + // include_paths must be nullptr terminated if specified. + // If include_paths is nullptr, it will attempt to load from the current + // directory. + // If the source was loaded from a file and isn't an include file, + // supply its name in source_filename. + // All paths specified in this call must be in posix format, if you accept + // paths from user input, please call PosixPath on them first. + bool Parse(const char *_source, const char **include_paths = nullptr, + const char *source_filename = nullptr); + + // Set the root type. May override the one set in the schema. + bool SetRootType(const char *name); + + // Mark all definitions as already having code generated. + void MarkGenerated(); + + // Get the files recursively included by the given file. The returned + // container will have at least the given file. + std::set GetIncludedFilesRecursive( + const std::string &file_name) const; + + // Fills builder_ with a binary version of the schema parsed. + // See reflection/reflection.fbs + void Serialize(); + + // Deserialize a schema buffer + bool Deserialize(const uint8_t *buf, const size_t size); + + // Fills internal structure as if the schema passed had been loaded by parsing + // with Parse except that included filenames will not be populated. + bool Deserialize(const reflection::Schema *schema); + + Type *DeserializeType(const reflection::Type *type); + + // Checks that the schema represented by this parser is a safe evolution + // of the schema provided. Returns non-empty error on any problems. + std::string ConformTo(const Parser &base); + + // Similar to Parse(), but now only accepts JSON to be parsed into a + // FlexBuffer. + bool ParseFlexBuffer(const char *source, const char *source_filename, + flexbuffers::Builder *builder); + + StructDef *LookupStruct(const std::string &id) const; + + std::string UnqualifiedName(const std::string &fullQualifiedName); + + FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg); + + // @brief Verify that any of 'opts.lang_to_generate' supports Optional scalars + // in a schema. + // @param opts Options used to parce a schema and generate code. + static bool SupportsOptionalScalars(const flatbuffers::IDLOptions &opts); + +private: + void Message(const std::string &msg); + void Warning(const std::string &msg); + FLATBUFFERS_CHECKED_ERROR ParseHexNum(int nibbles, uint64_t *val); + FLATBUFFERS_CHECKED_ERROR Next(); + FLATBUFFERS_CHECKED_ERROR SkipByteOrderMark(); + bool Is(int t) const; + bool IsIdent(const char *id) const; + FLATBUFFERS_CHECKED_ERROR Expect(int t); + std::string TokenToStringId(int t) const; + EnumDef *LookupEnum(const std::string &id); + FLATBUFFERS_CHECKED_ERROR ParseNamespacing(std::string *id, + std::string *last); + FLATBUFFERS_CHECKED_ERROR ParseTypeIdent(Type &type); + FLATBUFFERS_CHECKED_ERROR ParseType(Type &type); + FLATBUFFERS_CHECKED_ERROR AddField(StructDef &struct_def, + const std::string &name, const Type &type, + FieldDef **dest); + FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def); + FLATBUFFERS_CHECKED_ERROR ParseString(Value &val, bool use_string_pooling); + FLATBUFFERS_CHECKED_ERROR ParseComma(); + FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, + size_t parent_fieldn, + const StructDef *parent_struct_def, + uoffset_t count, + bool inside_vector = false); + template + FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn, + const StructDef *struct_def, + F body); + FLATBUFFERS_CHECKED_ERROR ParseTable(const StructDef &struct_def, + std::string *value, uoffset_t *ovalue); + void SerializeStruct(const StructDef &struct_def, const Value &val); + void SerializeStruct(FlatBufferBuilder &builder, const StructDef &struct_def, + const Value &val); + template + FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(uoffset_t &count, F body); + FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue, + FieldDef *field, size_t fieldn); + FLATBUFFERS_CHECKED_ERROR ParseArray(Value &array); + FLATBUFFERS_CHECKED_ERROR ParseNestedFlatbuffer( + Value &val, FieldDef *field, size_t fieldn, + const StructDef *parent_struct_def); + FLATBUFFERS_CHECKED_ERROR ParseMetaData(SymbolTable *attributes); + FLATBUFFERS_CHECKED_ERROR TryTypedValue(const std::string *name, int dtoken, + bool check, Value &e, BaseType req, + bool *destmatch); + FLATBUFFERS_CHECKED_ERROR ParseHash(Value &e, FieldDef *field); + FLATBUFFERS_CHECKED_ERROR TokenError(); + FLATBUFFERS_CHECKED_ERROR ParseSingleValue(const std::string *name, Value &e, + bool check_now); + FLATBUFFERS_CHECKED_ERROR ParseFunction(const std::string *name, Value &e); + FLATBUFFERS_CHECKED_ERROR ParseEnumFromString(const Type &type, + std::string *result); + StructDef *LookupCreateStruct(const std::string &name, + bool create_if_new = true, + bool definition = false); + FLATBUFFERS_CHECKED_ERROR ParseEnum(bool is_union, EnumDef **dest); + FLATBUFFERS_CHECKED_ERROR ParseNamespace(); + FLATBUFFERS_CHECKED_ERROR StartStruct(const std::string &name, + StructDef **dest); + FLATBUFFERS_CHECKED_ERROR StartEnum(const std::string &name, bool is_union, + EnumDef **dest); + FLATBUFFERS_CHECKED_ERROR ParseDecl(); + FLATBUFFERS_CHECKED_ERROR ParseService(); + FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef *struct_def, + bool isextend, bool inside_oneof); + FLATBUFFERS_CHECKED_ERROR ParseProtoOption(); + FLATBUFFERS_CHECKED_ERROR ParseProtoKey(); + FLATBUFFERS_CHECKED_ERROR ParseProtoDecl(); + FLATBUFFERS_CHECKED_ERROR ParseProtoCurliesOrIdent(); + FLATBUFFERS_CHECKED_ERROR ParseTypeFromProtoType(Type *type); + FLATBUFFERS_CHECKED_ERROR SkipAnyJsonValue(); + FLATBUFFERS_CHECKED_ERROR ParseFlexBufferValue(flexbuffers::Builder *builder); + FLATBUFFERS_CHECKED_ERROR StartParseFile(const char *source, + const char *source_filename); + FLATBUFFERS_CHECKED_ERROR ParseRoot(const char *_source, + const char **include_paths, + const char *source_filename); + FLATBUFFERS_CHECKED_ERROR DoParse(const char *_source, + const char **include_paths, + const char *source_filename, + const char *include_filename); + FLATBUFFERS_CHECKED_ERROR CheckClash(std::vector &fields, + StructDef *struct_def, + const char *suffix, BaseType baseType); + + bool SupportsAdvancedUnionFeatures() const; + bool SupportsAdvancedArrayFeatures() const; + bool SupportsOptionalScalars() const; + Namespace *UniqueNamespace(Namespace *ns); + + FLATBUFFERS_CHECKED_ERROR RecurseError(); + template + CheckedError Recurse(F f); + +public: + SymbolTable types_; + SymbolTable structs_; + SymbolTable enums_; + SymbolTable services_; + std::vector namespaces_; + Namespace *current_namespace_; + Namespace *empty_namespace_; + std::string error_; // User readable error_ if Parse() == false + + FlatBufferBuilder builder_; // any data contained in the file + flexbuffers::Builder flex_builder_; + flexbuffers::Reference flex_root_; + StructDef *root_struct_def_; + std::string file_identifier_; + std::string file_extension_; + + std::map included_files_; + std::map > files_included_per_file_; + std::vector native_included_files_; + + std::map known_attributes_; + + IDLOptions opts; + bool uses_flexbuffers_; + +private: + const char *source_; + + std::string file_being_parsed_; + + std::vector > field_stack_; + + int anonymous_counter; + int recurse_protection_counter; +}; + +// Utility functions for multiple generators: + +extern std::string MakeCamel(const std::string &in, bool first = true); + +extern std::string MakeScreamingCamel(const std::string &in); + +// Generate text (JSON) from a given FlatBuffer, and a given Parser +// object that has been populated with the corresponding schema. +// If ident_step is 0, no indentation will be generated. Additionally, +// if it is less than 0, no linefeeds will be generated either. +// See idl_gen_text.cpp. +// strict_json adds "quotes" around field names if true. +// If the flatbuffer cannot be encoded in JSON (e.g., it contains non-UTF-8 +// byte arrays in String values), returns false. +extern bool GenerateTextFromTable(const Parser &parser, const void *table, + const std::string &tablename, + std::string *text); +extern bool GenerateText(const Parser &parser, const void *flatbuffer, + std::string *text); +extern bool GenerateTextFile(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate binary files from a given FlatBuffer, and a given Parser +// object that has been populated with the corresponding schema. +// See code_generators.cpp. +extern bool GenerateBinary(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a C++ header from the definitions in the Parser object. +// See idl_gen_cpp. +extern bool GenerateCPP(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate C# files from the definitions in the Parser object. +// See idl_gen_csharp.cpp. +extern bool GenerateCSharp(const Parser &parser, const std::string &path, + const std::string &file_name); + +extern bool GenerateDart(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Java files from the definitions in the Parser object. +// See idl_gen_java.cpp. +extern bool GenerateJava(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate JavaScript or TypeScript code from the definitions in the Parser +// object. See idl_gen_js. +extern bool GenerateJSTS(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Go files from the definitions in the Parser object. +// See idl_gen_go.cpp. +extern bool GenerateGo(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Php code from the definitions in the Parser object. +// See idl_gen_php. +extern bool GeneratePhp(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Python files from the definitions in the Parser object. +// See idl_gen_python.cpp. +extern bool GeneratePython(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Lobster files from the definitions in the Parser object. +// See idl_gen_lobster.cpp. +extern bool GenerateLobster(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Lua files from the definitions in the Parser object. +// See idl_gen_lua.cpp. +extern bool GenerateLua(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Rust files from the definitions in the Parser object. +// See idl_gen_rust.cpp. +extern bool GenerateRust(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Json schema file +// See idl_gen_json_schema.cpp. +extern bool GenerateJsonSchema(const Parser &parser, const std::string &path, + const std::string &file_name); + +extern bool GenerateKotlin(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate Swift classes. +// See idl_gen_swift.cpp +extern bool GenerateSwift(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a schema file from the internal representation, useful after +// parsing a .proto schema. +extern std::string GenerateFBS(const Parser &parser, + const std::string &file_name); +extern bool GenerateFBS(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated JavaScript or TypeScript code. +// See idl_gen_js.cpp. +extern std::string JSTSMakeRule(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated C++ header. +// See idl_gen_cpp.cpp. +extern std::string CPPMakeRule(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated Dart code +// see idl_gen_dart.cpp +extern std::string DartMakeRule(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated Rust code. +// See idl_gen_rust.cpp. +extern std::string RustMakeRule(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate a make rule for generated Java or C# files. +// See code_generators.cpp. +extern std::string JavaCSharpMakeRule(const Parser &parser, + const std::string &path, + const std::string &file_name); + +// Generate a make rule for the generated text (JSON) files. +// See idl_gen_text.cpp. +extern std::string TextMakeRule(const Parser &parser, const std::string &path, + const std::string &file_names); + +// Generate a make rule for the generated binary files. +// See code_generators.cpp. +extern std::string BinaryMakeRule(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate GRPC Cpp interfaces. +// See idl_gen_grpc.cpp. +bool GenerateCppGRPC(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate GRPC Go interfaces. +// See idl_gen_grpc.cpp. +bool GenerateGoGRPC(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate GRPC Java classes. +// See idl_gen_grpc.cpp +bool GenerateJavaGRPC(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate GRPC Python interfaces. +// See idl_gen_grpc.cpp. +bool GeneratePythonGRPC(const Parser &parser, const std::string &path, + const std::string &file_name); + +// Generate GRPC Swift interfaces. +// See idl_gen_grpc.cpp. +extern bool GenerateSwiftGRPC(const Parser &parser, const std::string &path, + const std::string &file_name); + +} // namespace flatbuffers + +#endif // FLATBUFFERS_IDL_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/minireflect.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/minireflect.h new file mode 100644 index 00000000..3bd75a21 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/minireflect.h @@ -0,0 +1,547 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_MINIREFLECT_H_ +#define FLATBUFFERS_MINIREFLECT_H_ + +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/util.h" + +namespace flatbuffers { +// Utilities that can be used with the "mini reflection" tables present +// in generated code with --reflect-types (only types) or --reflect-names +// (also names). +// This allows basic reflection functionality such as pretty-printing +// that does not require the use of the schema parser or loading of binary +// schema files at runtime (reflection.h). + +// For any of the functions below that take `const TypeTable *`, you pass +// `FooTypeTable()` if the type of the root is `Foo`. + +// First, a generic iterator that can be used by multiple algorithms. + +struct IterationVisitor { + // These mark the scope of a table or struct. + virtual void StartSequence() + { + } + virtual void EndSequence() + { + } + // Called for each field regardless of whether it is present or not. + // If not present, val == nullptr. set_idx is the index of all set fields. + virtual void Field(size_t /*field_idx*/, size_t /*set_idx*/, + ElementaryType /*type*/, bool /*is_vector*/, + const TypeTable * /*type_table*/, const char * /*name*/, + const uint8_t * /*val*/) + { + } + // Called for a value that is actually present, after a field, or as part + // of a vector. + virtual void UType(uint8_t, const char *) + { + } + virtual void Bool(bool) + { + } + virtual void Char(int8_t, const char *) + { + } + virtual void UChar(uint8_t, const char *) + { + } + virtual void Short(int16_t, const char *) + { + } + virtual void UShort(uint16_t, const char *) + { + } + virtual void Int(int32_t, const char *) + { + } + virtual void UInt(uint32_t, const char *) + { + } + virtual void Long(int64_t) + { + } + virtual void ULong(uint64_t) + { + } + virtual void Float(float) + { + } + virtual void Double(double) + { + } + virtual void String(const String *) + { + } + virtual void Unknown(const uint8_t *) + { + } // From a future version. + // These mark the scope of a vector. + virtual void StartVector() + { + } + virtual void EndVector() + { + } + virtual void Element(size_t /*i*/, ElementaryType /*type*/, + const TypeTable * /*type_table*/, + const uint8_t * /*val*/) + { + } + virtual ~IterationVisitor() + { + } +}; + +inline size_t InlineSize(ElementaryType type, const TypeTable *type_table) +{ + switch (type) { + case ET_UTYPE: + case ET_BOOL: + case ET_CHAR: + case ET_UCHAR: + return 1; + case ET_SHORT: + case ET_USHORT: + return 2; + case ET_INT: + case ET_UINT: + case ET_FLOAT: + case ET_STRING: + return 4; + case ET_LONG: + case ET_ULONG: + case ET_DOUBLE: + return 8; + case ET_SEQUENCE: + switch (type_table->st) { + case ST_TABLE: + case ST_UNION: + return 4; + case ST_STRUCT: + return static_cast(type_table->values[type_table->num_elems]); + default: + FLATBUFFERS_ASSERT(false); + return 1; + } + default: + FLATBUFFERS_ASSERT(false); + return 1; + } +} + +inline int64_t LookupEnum(int64_t enum_val, const int64_t *values, + size_t num_values) +{ + if (!values) + return enum_val; + for (size_t i = 0; i < num_values; i++) { + if (enum_val == values[i]) + return static_cast(i); + } + return -1; // Unknown enum value. +} + +template +const char *EnumName(T tval, const TypeTable *type_table) +{ + if (!type_table || !type_table->names) + return nullptr; + auto i = LookupEnum(static_cast(tval), type_table->values, + type_table->num_elems); + if (i >= 0 && i < static_cast(type_table->num_elems)) { + return type_table->names[i]; + } + return nullptr; +} + +void IterateObject(const uint8_t *obj, const TypeTable *type_table, + IterationVisitor *visitor); + +inline void IterateValue(ElementaryType type, const uint8_t *val, + const TypeTable *type_table, const uint8_t *prev_val, + soffset_t vector_index, IterationVisitor *visitor) +{ + switch (type) { + case ET_UTYPE: { + auto tval = ReadScalar(val); + visitor->UType(tval, EnumName(tval, type_table)); + break; + } + case ET_BOOL: { + visitor->Bool(ReadScalar(val) != 0); + break; + } + case ET_CHAR: { + auto tval = ReadScalar(val); + visitor->Char(tval, EnumName(tval, type_table)); + break; + } + case ET_UCHAR: { + auto tval = ReadScalar(val); + visitor->UChar(tval, EnumName(tval, type_table)); + break; + } + case ET_SHORT: { + auto tval = ReadScalar(val); + visitor->Short(tval, EnumName(tval, type_table)); + break; + } + case ET_USHORT: { + auto tval = ReadScalar(val); + visitor->UShort(tval, EnumName(tval, type_table)); + break; + } + case ET_INT: { + auto tval = ReadScalar(val); + visitor->Int(tval, EnumName(tval, type_table)); + break; + } + case ET_UINT: { + auto tval = ReadScalar(val); + visitor->UInt(tval, EnumName(tval, type_table)); + break; + } + case ET_LONG: { + visitor->Long(ReadScalar(val)); + break; + } + case ET_ULONG: { + visitor->ULong(ReadScalar(val)); + break; + } + case ET_FLOAT: { + visitor->Float(ReadScalar(val)); + break; + } + case ET_DOUBLE: { + visitor->Double(ReadScalar(val)); + break; + } + case ET_STRING: { + val += ReadScalar(val); + visitor->String(reinterpret_cast(val)); + break; + } + case ET_SEQUENCE: { + switch (type_table->st) { + case ST_TABLE: + val += ReadScalar(val); + IterateObject(val, type_table, visitor); + break; + case ST_STRUCT: + IterateObject(val, type_table, visitor); + break; + case ST_UNION: { + val += ReadScalar(val); + FLATBUFFERS_ASSERT(prev_val); + auto union_type = *prev_val; // Always a uint8_t. + if (vector_index >= 0) { + auto type_vec = reinterpret_cast *>(prev_val); + union_type = type_vec->Get(static_cast(vector_index)); + } + auto type_code_idx = + LookupEnum(union_type, type_table->values, type_table->num_elems); + if (type_code_idx >= 0 && + type_code_idx < static_cast(type_table->num_elems)) { + auto type_code = type_table->type_codes[type_code_idx]; + switch (type_code.base_type) { + case ET_SEQUENCE: { + auto ref = type_table->type_refs[type_code.sequence_ref](); + IterateObject(val, ref, visitor); + break; + } + case ET_STRING: + visitor->String(reinterpret_cast(val)); + break; + default: + visitor->Unknown(val); + } + } else { + visitor->Unknown(val); + } + break; + } + case ST_ENUM: + FLATBUFFERS_ASSERT(false); + break; + } + break; + } + default: { + visitor->Unknown(val); + break; + } + } +} + +inline void IterateObject(const uint8_t *obj, const TypeTable *type_table, + IterationVisitor *visitor) +{ + visitor->StartSequence(); + const uint8_t *prev_val = nullptr; + size_t set_idx = 0; + size_t array_idx = 0; + for (size_t i = 0; i < type_table->num_elems; i++) { + auto type_code = type_table->type_codes[i]; + auto type = static_cast(type_code.base_type); + auto is_repeating = type_code.is_repeating != 0; + auto ref_idx = type_code.sequence_ref; + const TypeTable *ref = nullptr; + if (ref_idx >= 0) { + ref = type_table->type_refs[ref_idx](); + } + auto name = type_table->names ? type_table->names[i] : nullptr; + const uint8_t *val = nullptr; + if (type_table->st == ST_TABLE) { + val = reinterpret_cast(obj)->GetAddressOf( + FieldIndexToOffset(static_cast(i))); + } else { + val = obj + type_table->values[i]; + } + visitor->Field(i, set_idx, type, is_repeating, ref, name, val); + if (val) { + set_idx++; + if (is_repeating) { + auto elem_ptr = val; + size_t size = 0; + if (type_table->st == ST_TABLE) { + // variable length vector + val += ReadScalar(val); + auto vec = reinterpret_cast *>(val); + elem_ptr = vec->Data(); + size = vec->size(); + } else { + // otherwise fixed size array + size = type_table->array_sizes[array_idx]; + ++array_idx; + } + visitor->StartVector(); + for (size_t j = 0; j < size; j++) { + visitor->Element(j, type, ref, elem_ptr); + IterateValue(type, elem_ptr, ref, prev_val, static_cast(j), + visitor); + elem_ptr += InlineSize(type, ref); + } + visitor->EndVector(); + } else { + IterateValue(type, val, ref, prev_val, -1, visitor); + } + } + prev_val = val; + } + visitor->EndSequence(); +} + +inline void IterateFlatBuffer(const uint8_t *buffer, + const TypeTable *type_table, + IterationVisitor *callback) +{ + IterateObject(GetRoot(buffer), type_table, callback); +} + +// Outputting a Flatbuffer to a string. Tries to conform as close to JSON / +// the output generated by idl_gen_text.cpp. + +struct ToStringVisitor : public IterationVisitor { + std::string s; + std::string d; + bool q; + std::string in; + size_t indent_level; + bool vector_delimited; + ToStringVisitor(std::string delimiter, bool quotes, std::string indent, + bool vdelimited = true) + : d(delimiter), + q(quotes), + in(indent), + indent_level(0), + vector_delimited(vdelimited) + { + } + ToStringVisitor(std::string delimiter) + : d(delimiter), + q(false), + in(""), + indent_level(0), + vector_delimited(true) + { + } + + void append_indent() + { + for (size_t i = 0; i < indent_level; i++) { + s += in; + } + } + + void StartSequence() + { + s += "{"; + s += d; + indent_level++; + } + void EndSequence() + { + s += d; + indent_level--; + append_indent(); + s += "}"; + } + void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/, + bool /*is_vector*/, const TypeTable * /*type_table*/, + const char *name, const uint8_t *val) + { + if (!val) + return; + if (set_idx) { + s += ","; + s += d; + } + append_indent(); + if (name) { + if (q) + s += "\""; + s += name; + if (q) + s += "\""; + s += ": "; + } + } + template + void Named(T x, const char *name) + { + if (name) { + if (q) + s += "\""; + s += name; + if (q) + s += "\""; + } else { + s += NumToString(x); + } + } + void UType(uint8_t x, const char *name) + { + Named(x, name); + } + void Bool(bool x) + { + s += x ? "true" : "false"; + } + void Char(int8_t x, const char *name) + { + Named(x, name); + } + void UChar(uint8_t x, const char *name) + { + Named(x, name); + } + void Short(int16_t x, const char *name) + { + Named(x, name); + } + void UShort(uint16_t x, const char *name) + { + Named(x, name); + } + void Int(int32_t x, const char *name) + { + Named(x, name); + } + void UInt(uint32_t x, const char *name) + { + Named(x, name); + } + void Long(int64_t x) + { + s += NumToString(x); + } + void ULong(uint64_t x) + { + s += NumToString(x); + } + void Float(float x) + { + s += NumToString(x); + } + void Double(double x) + { + s += NumToString(x); + } + void String(const struct String *str) + { + EscapeString(str->c_str(), str->size(), &s, true, false); + } + void Unknown(const uint8_t *) + { + s += "(?)"; + } + void StartVector() + { + s += "["; + if (vector_delimited) { + s += d; + indent_level++; + append_indent(); + } else { + s += " "; + } + } + void EndVector() + { + if (vector_delimited) { + s += d; + indent_level--; + append_indent(); + } else { + s += " "; + } + s += "]"; + } + void Element(size_t i, ElementaryType /*type*/, + const TypeTable * /*type_table*/, const uint8_t * /*val*/) + { + if (i) { + s += ","; + if (vector_delimited) { + s += d; + append_indent(); + } else { + s += " "; + } + } + } +}; + +inline std::string FlatBufferToString(const uint8_t *buffer, + const TypeTable *type_table, + bool multi_line = false, + bool vector_delimited = true) +{ + ToStringVisitor tostring_visitor(multi_line ? "\n" : " ", false, "", + vector_delimited); + IterateFlatBuffer(buffer, type_table, &tostring_visitor); + return tostring_visitor.s; +} + +} // namespace flatbuffers + +#endif // FLATBUFFERS_MINIREFLECT_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/flatc_pch.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/flatc_pch.h new file mode 100644 index 00000000..77132790 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/flatc_pch.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_FLATC_PCH_H_ +#define FLATBUFFERS_FLATC_PCH_H_ + +// stl +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// flatbuffers +#include "flatbuffers/pch/pch.h" +#include "flatbuffers/code_generators.h" +#include "flatbuffers/flatbuffers.h" +#include "flatbuffers/flexbuffers.h" +#include "flatbuffers/idl.h" + +#endif // FLATBUFFERS_FLATC_PCH_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/pch.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/pch.h new file mode 100644 index 00000000..804e99ed --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/pch/pch.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_PCH_H_ +#define FLATBUFFERS_PCH_H_ + +// stl +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// flatbuffers +#include "flatbuffers/util.h" + +#endif // FLATBUFFERS_PCH_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection.h new file mode 100644 index 00000000..9c85956e --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection.h @@ -0,0 +1,559 @@ +/* + * Copyright 2015 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_REFLECTION_H_ +#define FLATBUFFERS_REFLECTION_H_ + +// This is somewhat of a circular dependency because flatc (and thus this +// file) is needed to generate this header in the first place. +// Should normally not be a problem since it can be generated by the +// previous version of flatc whenever this code needs to change. +// See reflection/generate_code.sh +#include "flatbuffers/reflection_generated.h" + +// Helper functionality for reflection. + +namespace flatbuffers { +// ------------------------- GETTERS ------------------------- + +inline bool IsScalar(reflection::BaseType t) +{ + return t >= reflection::UType && t <= reflection::Double; +} +inline bool IsInteger(reflection::BaseType t) +{ + return t >= reflection::UType && t <= reflection::ULong; +} +inline bool IsFloat(reflection::BaseType t) +{ + return t == reflection::Float || t == reflection::Double; +} +inline bool IsLong(reflection::BaseType t) +{ + return t == reflection::Long || t == reflection::ULong; +} + +// Size of a basic type, don't use with structs. +inline size_t GetTypeSize(reflection::BaseType base_type) +{ + // This needs to correspond to the BaseType enum. + static size_t sizes[] = { + 0, // None + 1, // UType + 1, // Bool + 1, // Byte + 1, // UByte + 2, // Short + 2, // UShort + 4, // Int + 4, // UInt + 8, // Long + 8, // ULong + 4, // Float + 8, // Double + 4, // String + 4, // Vector + 4, // Obj + 4, // Union + 0, // Array. Only used in structs. 0 was chosen to prevent out-of-bounds errors. + + 0 // MaxBaseType. This must be kept the last entry in this array. + }; + static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1, + "Size of sizes[] array does not match the count of BaseType enum values."); + return sizes[base_type]; +} + +// Same as above, but now correctly returns the size of a struct if +// the field (or vector element) is a struct. +inline size_t GetTypeSizeInline(reflection::BaseType base_type, int type_index, + const reflection::Schema &schema) +{ + if (base_type == reflection::Obj && + schema.objects()->Get(type_index)->is_struct()) { + return schema.objects()->Get(type_index)->bytesize(); + } else { + return GetTypeSize(base_type); + } +} + +// Get the root, regardless of what type it is. +inline Table *GetAnyRoot(uint8_t *flatbuf) +{ + return GetMutableRoot
(flatbuf); +} +inline const Table *GetAnyRoot(const uint8_t *flatbuf) +{ + return GetRoot
(flatbuf); +} + +// Get a field's default, if you know it's an integer, and its exact type. +template +T GetFieldDefaultI(const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return static_cast(field.default_integer()); +} + +// Get a field's default, if you know it's floating point and its exact type. +template +T GetFieldDefaultF(const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return static_cast(field.default_real()); +} + +// Get a field, if you know it's an integer, and its exact type. +template +T GetFieldI(const Table &table, const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return table.GetField(field.offset(), + static_cast(field.default_integer())); +} + +// Get a field, if you know it's floating point and its exact type. +template +T GetFieldF(const Table &table, const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); + return table.GetField(field.offset(), + static_cast(field.default_real())); +} + +// Get a field, if you know it's a string. +inline const String *GetFieldS(const Table &table, + const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::String); + return table.GetPointer(field.offset()); +} + +// Get a field, if you know it's a vector. +template +Vector *GetFieldV(const Table &table, const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Vector && + sizeof(T) == GetTypeSize(field.type()->element())); + return table.GetPointer *>(field.offset()); +} + +// Get a field, if you know it's a vector, generically. +// To actually access elements, use the return value together with +// field.type()->element() in any of GetAnyVectorElemI below etc. +inline VectorOfAny *GetFieldAnyV(const Table &table, + const reflection::Field &field) +{ + return table.GetPointer(field.offset()); +} + +// Get a field, if you know it's a table. +inline Table *GetFieldT(const Table &table, const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj || + field.type()->base_type() == reflection::Union); + return table.GetPointer
(field.offset()); +} + +// Get a field, if you know it's a struct. +inline const Struct *GetFieldStruct(const Table &table, + const reflection::Field &field) +{ + // TODO: This does NOT check if the field is a table or struct, but we'd need + // access to the schema to check the is_struct flag. + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); + return table.GetStruct(field.offset()); +} + +// Get a structure's field, if you know it's a struct. +inline const Struct *GetFieldStruct(const Struct &structure, + const reflection::Field &field) +{ + FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); + return structure.GetStruct(field.offset()); +} + +// Raw helper functions used below: get any value in memory as a 64bit int, a +// double or a string. +// All scalars get static_cast to an int64_t, strings use strtoull, every other +// data type returns 0. +int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data); +// All scalars static cast to double, strings use strtod, every other data +// type is 0.0. +double GetAnyValueF(reflection::BaseType type, const uint8_t *data); +// All scalars converted using stringstream, strings as-is, and all other +// data types provide some level of debug-pretty-printing. +std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data, + const reflection::Schema *schema, int type_index); + +// Get any table field as a 64bit int, regardless of what type it is. +inline int64_t GetAnyFieldI(const Table &table, + const reflection::Field &field) +{ + auto field_ptr = table.GetAddressOf(field.offset()); + return field_ptr ? GetAnyValueI(field.type()->base_type(), field_ptr) : field.default_integer(); +} + +// Get any table field as a double, regardless of what type it is. +inline double GetAnyFieldF(const Table &table, const reflection::Field &field) +{ + auto field_ptr = table.GetAddressOf(field.offset()); + return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr) : field.default_real(); +} + +// Get any table field as a string, regardless of what type it is. +// You may pass nullptr for the schema if you don't care to have fields that +// are of table type pretty-printed. +inline std::string GetAnyFieldS(const Table &table, + const reflection::Field &field, + const reflection::Schema *schema) +{ + auto field_ptr = table.GetAddressOf(field.offset()); + return field_ptr ? GetAnyValueS(field.type()->base_type(), field_ptr, schema, + field.type()->index()) : + ""; +} + +// Get any struct field as a 64bit int, regardless of what type it is. +inline int64_t GetAnyFieldI(const Struct &st, const reflection::Field &field) +{ + return GetAnyValueI(field.type()->base_type(), + st.GetAddressOf(field.offset())); +} + +// Get any struct field as a double, regardless of what type it is. +inline double GetAnyFieldF(const Struct &st, const reflection::Field &field) +{ + return GetAnyValueF(field.type()->base_type(), + st.GetAddressOf(field.offset())); +} + +// Get any struct field as a string, regardless of what type it is. +inline std::string GetAnyFieldS(const Struct &st, + const reflection::Field &field) +{ + return GetAnyValueS(field.type()->base_type(), + st.GetAddressOf(field.offset()), nullptr, -1); +} + +// Get any vector element as a 64bit int, regardless of what type it is. +inline int64_t GetAnyVectorElemI(const VectorOfAny *vec, + reflection::BaseType elem_type, size_t i) +{ + return GetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i); +} + +// Get any vector element as a double, regardless of what type it is. +inline double GetAnyVectorElemF(const VectorOfAny *vec, + reflection::BaseType elem_type, size_t i) +{ + return GetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i); +} + +// Get any vector element as a string, regardless of what type it is. +inline std::string GetAnyVectorElemS(const VectorOfAny *vec, + reflection::BaseType elem_type, size_t i) +{ + return GetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, + nullptr, -1); +} + +// Get a vector element that's a table/string/vector from a generic vector. +// Pass Table/String/VectorOfAny as template parameter. +// Warning: does no typechecking. +template +T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) +{ + auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i; + return reinterpret_cast(elem_ptr + ReadScalar(elem_ptr)); +} + +// Get the inline-address of a vector element. Useful for Structs (pass Struct +// as template arg), or being able to address a range of scalars in-line. +// Get elem_size from GetTypeSizeInline(). +// Note: little-endian data on all platforms, use EndianScalar() instead of +// raw pointer access with scalars). +template +T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i, + size_t elem_size) +{ + return reinterpret_cast(vec->Data() + elem_size * i); +} + +// Similarly, for elements of tables. +template +T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) +{ + return reinterpret_cast(table.GetAddressOf(field.offset())); +} + +// Similarly, for elements of structs. +template +T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) +{ + return reinterpret_cast(st.GetAddressOf(field.offset())); +} + +// ------------------------- SETTERS ------------------------- + +// Set any scalar field, if you know its exact type. +template +bool SetField(Table *table, const reflection::Field &field, T val) +{ + reflection::BaseType type = field.type()->base_type(); + if (!IsScalar(type)) { + return false; + } + FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(type)); + T def; + if (IsInteger(type)) { + def = GetFieldDefaultI(field); + } else { + FLATBUFFERS_ASSERT(IsFloat(type)); + def = GetFieldDefaultF(field); + } + return table->SetField(field.offset(), val, def); +} + +// Raw helper functions used below: set any value in memory as a 64bit int, a +// double or a string. +// These work for all scalar values, but do nothing for other data types. +// To set a string, see SetString below. +void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val); +void SetAnyValueF(reflection::BaseType type, uint8_t *data, double val); +void SetAnyValueS(reflection::BaseType type, uint8_t *data, const char *val); + +// Set any table field as a 64bit int, regardless of type what it is. +inline bool SetAnyFieldI(Table *table, const reflection::Field &field, + int64_t val) +{ + auto field_ptr = table->GetAddressOf(field.offset()); + if (!field_ptr) + return val == GetFieldDefaultI(field); + SetAnyValueI(field.type()->base_type(), field_ptr, val); + return true; +} + +// Set any table field as a double, regardless of what type it is. +inline bool SetAnyFieldF(Table *table, const reflection::Field &field, + double val) +{ + auto field_ptr = table->GetAddressOf(field.offset()); + if (!field_ptr) + return val == GetFieldDefaultF(field); + SetAnyValueF(field.type()->base_type(), field_ptr, val); + return true; +} + +// Set any table field as a string, regardless of what type it is. +inline bool SetAnyFieldS(Table *table, const reflection::Field &field, + const char *val) +{ + auto field_ptr = table->GetAddressOf(field.offset()); + if (!field_ptr) + return false; + SetAnyValueS(field.type()->base_type(), field_ptr, val); + return true; +} + +// Set any struct field as a 64bit int, regardless of type what it is. +inline void SetAnyFieldI(Struct *st, const reflection::Field &field, + int64_t val) +{ + SetAnyValueI(field.type()->base_type(), st->GetAddressOf(field.offset()), + val); +} + +// Set any struct field as a double, regardless of type what it is. +inline void SetAnyFieldF(Struct *st, const reflection::Field &field, + double val) +{ + SetAnyValueF(field.type()->base_type(), st->GetAddressOf(field.offset()), + val); +} + +// Set any struct field as a string, regardless of type what it is. +inline void SetAnyFieldS(Struct *st, const reflection::Field &field, + const char *val) +{ + SetAnyValueS(field.type()->base_type(), st->GetAddressOf(field.offset()), + val); +} + +// Set any vector element as a 64bit int, regardless of type what it is. +inline void SetAnyVectorElemI(VectorOfAny *vec, reflection::BaseType elem_type, + size_t i, int64_t val) +{ + SetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); +} + +// Set any vector element as a double, regardless of type what it is. +inline void SetAnyVectorElemF(VectorOfAny *vec, reflection::BaseType elem_type, + size_t i, double val) +{ + SetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); +} + +// Set any vector element as a string, regardless of type what it is. +inline void SetAnyVectorElemS(VectorOfAny *vec, reflection::BaseType elem_type, + size_t i, const char *val) +{ + SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); +} + +// ------------------------- RESIZING SETTERS ------------------------- + +// "smart" pointer for use with resizing vectors: turns a pointer inside +// a vector into a relative offset, such that it is not affected by resizes. +template +class pointer_inside_vector { +public: + pointer_inside_vector(T *ptr, std::vector &vec) + : offset_(reinterpret_cast(ptr) - + reinterpret_cast(flatbuffers::vector_data(vec))), + vec_(vec) + { + } + + T *operator*() const + { + return reinterpret_cast( + reinterpret_cast(flatbuffers::vector_data(vec_)) + offset_); + } + T *operator->() const + { + return operator*(); + } + +private: + size_t offset_; + std::vector &vec_; +}; + +// Helper to create the above easily without specifying template args. +template +pointer_inside_vector piv(T *ptr, std::vector &vec) +{ + return pointer_inside_vector(ptr, vec); +} + +inline const char *UnionTypeFieldSuffix() +{ + return "_type"; +} + +// Helper to figure out the actual table type a union refers to. +inline const reflection::Object &GetUnionType( + const reflection::Schema &schema, const reflection::Object &parent, + const reflection::Field &unionfield, const Table &table) +{ + auto enumdef = schema.enums()->Get(unionfield.type()->index()); + // TODO: this is clumsy and slow, but no other way to find it? + auto type_field = parent.fields()->LookupByKey( + (unionfield.name()->str() + UnionTypeFieldSuffix()).c_str()); + FLATBUFFERS_ASSERT(type_field); + auto union_type = GetFieldI(table, *type_field); + auto enumval = enumdef->values()->LookupByKey(union_type); + return *enumval->object(); +} + +// Changes the contents of a string inside a FlatBuffer. FlatBuffer must +// live inside a std::vector so we can resize the buffer if needed. +// "str" must live inside "flatbuf" and may be invalidated after this call. +// If your FlatBuffer's root table is not the schema's root table, you should +// pass in your root_table type as well. +void SetString(const reflection::Schema &schema, const std::string &val, + const String *str, std::vector *flatbuf, + const reflection::Object *root_table = nullptr); + +// Resizes a flatbuffers::Vector inside a FlatBuffer. FlatBuffer must +// live inside a std::vector so we can resize the buffer if needed. +// "vec" must live inside "flatbuf" and may be invalidated after this call. +// If your FlatBuffer's root table is not the schema's root table, you should +// pass in your root_table type as well. +uint8_t *ResizeAnyVector(const reflection::Schema &schema, uoffset_t newsize, + const VectorOfAny *vec, uoffset_t num_elems, + uoffset_t elem_size, std::vector *flatbuf, + const reflection::Object *root_table = nullptr); + +template +void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val, + const Vector *vec, std::vector *flatbuf, + const reflection::Object *root_table = nullptr) +{ + auto delta_elem = static_cast(newsize) - static_cast(vec->size()); + auto newelems = ResizeAnyVector( + schema, newsize, reinterpret_cast(vec), vec->size(), + static_cast(sizeof(T)), flatbuf, root_table); + // Set new elements to "val". + for (int i = 0; i < delta_elem; i++) { + auto loc = newelems + i * sizeof(T); + auto is_scalar = flatbuffers::is_scalar::value; + if (is_scalar) { + WriteScalar(loc, val); + } else { // struct + *reinterpret_cast(loc) = val; + } + } +} + +// Adds any new data (in the form of a new FlatBuffer) to an existing +// FlatBuffer. This can be used when any of the above methods are not +// sufficient, in particular for adding new tables and new fields. +// This is potentially slightly less efficient than a FlatBuffer constructed +// in one piece, since the new FlatBuffer doesn't share any vtables with the +// existing one. +// The return value can now be set using Vector::MutateOffset or SetFieldT +// below. +const uint8_t *AddFlatBuffer(std::vector &flatbuf, + const uint8_t *newbuf, size_t newlen); + +inline bool SetFieldT(Table *table, const reflection::Field &field, + const uint8_t *val) +{ + FLATBUFFERS_ASSERT(sizeof(uoffset_t) == + GetTypeSize(field.type()->base_type())); + return table->SetPointer(field.offset(), val); +} + +// ------------------------- COPYING ------------------------- + +// Generic copying of tables from a FlatBuffer into a FlatBuffer builder. +// Can be used to do any kind of merging/selecting you may want to do out +// of existing buffers. Also useful to reconstruct a whole buffer if the +// above resizing functionality has introduced garbage in a buffer you want +// to remove. +// Note: this does not deal with DAGs correctly. If the table passed forms a +// DAG, the copy will be a tree instead (with duplicates). Strings can be +// shared however, by passing true for use_string_pooling. + +Offset CopyTable(FlatBufferBuilder &fbb, + const reflection::Schema &schema, + const reflection::Object &objectdef, + const Table &table, + bool use_string_pooling = false); + +// Verifies the provided flatbuffer using reflection. +// root should point to the root type for this flatbuffer. +// buf should point to the start of flatbuffer data. +// length specifies the size of the flatbuffer data. +bool Verify(const reflection::Schema &schema, const reflection::Object &root, + const uint8_t *buf, size_t length, uoffset_t max_depth = 64, + uoffset_t max_tables = 1000000); + +} // namespace flatbuffers + +#endif // FLATBUFFERS_REFLECTION_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection_generated.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection_generated.h new file mode 100644 index 00000000..2bfc9798 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/reflection_generated.h @@ -0,0 +1,1399 @@ +// automatically generated by the FlatBuffers compiler, do not modify + +#ifndef FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ +#define FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ + +#include "flatbuffers/flatbuffers.h" + +namespace reflection { +struct Type; +struct TypeBuilder; + +struct KeyValue; +struct KeyValueBuilder; + +struct EnumVal; +struct EnumValBuilder; + +struct Enum; +struct EnumBuilder; + +struct Field; +struct FieldBuilder; + +struct Object; +struct ObjectBuilder; + +struct RPCCall; +struct RPCCallBuilder; + +struct Service; +struct ServiceBuilder; + +struct Schema; +struct SchemaBuilder; + +enum BaseType { + None = 0, + UType = 1, + Bool = 2, + Byte = 3, + UByte = 4, + Short = 5, + UShort = 6, + Int = 7, + UInt = 8, + Long = 9, + ULong = 10, + Float = 11, + Double = 12, + String = 13, + Vector = 14, + Obj = 15, + Union = 16, + Array = 17, + MaxBaseType = 18 +}; + +inline const BaseType (&EnumValuesBaseType())[19] +{ + static const BaseType values[] = { + None, + UType, + Bool, + Byte, + UByte, + Short, + UShort, + Int, + UInt, + Long, + ULong, + Float, + Double, + String, + Vector, + Obj, + Union, + Array, + MaxBaseType + }; + return values; +} + +inline const char *const *EnumNamesBaseType() +{ + static const char *const names[20] = { + "None", + "UType", + "Bool", + "Byte", + "UByte", + "Short", + "UShort", + "Int", + "UInt", + "Long", + "ULong", + "Float", + "Double", + "String", + "Vector", + "Obj", + "Union", + "Array", + "MaxBaseType", + nullptr + }; + return names; +} + +inline const char *EnumNameBaseType(BaseType e) +{ + if (flatbuffers::IsOutRange(e, None, MaxBaseType)) + return ""; + const size_t index = static_cast(e); + return EnumNamesBaseType()[index]; +} + +struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TypeBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BASE_TYPE = 4, + VT_ELEMENT = 6, + VT_INDEX = 8, + VT_FIXED_LENGTH = 10 + }; + reflection::BaseType base_type() const + { + return static_cast(GetField(VT_BASE_TYPE, 0)); + } + reflection::BaseType element() const + { + return static_cast(GetField(VT_ELEMENT, 0)); + } + int32_t index() const + { + return GetField(VT_INDEX, -1); + } + uint16_t fixed_length() const + { + return GetField(VT_FIXED_LENGTH, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BASE_TYPE) && + VerifyField(verifier, VT_ELEMENT) && + VerifyField(verifier, VT_INDEX) && + VerifyField(verifier, VT_FIXED_LENGTH) && + verifier.EndTable(); + } +}; + +struct TypeBuilder { + typedef Type Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_base_type(reflection::BaseType base_type) + { + fbb_.AddElement(Type::VT_BASE_TYPE, static_cast(base_type), 0); + } + void add_element(reflection::BaseType element) + { + fbb_.AddElement(Type::VT_ELEMENT, static_cast(element), 0); + } + void add_index(int32_t index) + { + fbb_.AddElement(Type::VT_INDEX, index, -1); + } + void add_fixed_length(uint16_t fixed_length) + { + fbb_.AddElement(Type::VT_FIXED_LENGTH, fixed_length, 0); + } + explicit TypeBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateType( + flatbuffers::FlatBufferBuilder &_fbb, + reflection::BaseType base_type = reflection::None, + reflection::BaseType element = reflection::None, + int32_t index = -1, + uint16_t fixed_length = 0) +{ + TypeBuilder builder_(_fbb); + builder_.add_index(index); + builder_.add_fixed_length(fixed_length); + builder_.add_element(element); + builder_.add_base_type(base_type); + return builder_.Finish(); +} + +struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef KeyValueBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_KEY = 4, + VT_VALUE = 6 + }; + const flatbuffers::String *key() const + { + return GetPointer(VT_KEY); + } + bool KeyCompareLessThan(const KeyValue *o) const + { + return *key() < *o->key(); + } + int KeyCompareWithValue(const char *val) const + { + return strcmp(key()->c_str(), val); + } + const flatbuffers::String *value() const + { + return GetPointer(VT_VALUE); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_KEY) && + verifier.VerifyString(key()) && + VerifyOffset(verifier, VT_VALUE) && + verifier.VerifyString(value()) && + verifier.EndTable(); + } +}; + +struct KeyValueBuilder { + typedef KeyValue Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_key(flatbuffers::Offset key) + { + fbb_.AddOffset(KeyValue::VT_KEY, key); + } + void add_value(flatbuffers::Offset value) + { + fbb_.AddOffset(KeyValue::VT_VALUE, value); + } + explicit KeyValueBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, KeyValue::VT_KEY); + return o; + } +}; + +inline flatbuffers::Offset CreateKeyValue( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset key = 0, + flatbuffers::Offset value = 0) +{ + KeyValueBuilder builder_(_fbb); + builder_.add_value(value); + builder_.add_key(key); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateKeyValueDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *key = nullptr, + const char *value = nullptr) +{ + auto key__ = key ? _fbb.CreateString(key) : 0; + auto value__ = value ? _fbb.CreateString(value) : 0; + return reflection::CreateKeyValue( + _fbb, + key__, + value__); +} + +struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef EnumValBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_VALUE = 6, + VT_OBJECT = 8, + VT_UNION_TYPE = 10, + VT_DOCUMENTATION = 12 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + int64_t value() const + { + return GetField(VT_VALUE, 0); + } + bool KeyCompareLessThan(const EnumVal *o) const + { + return value() < o->value(); + } + int KeyCompareWithValue(int64_t val) const + { + return static_cast(value() > val) - static_cast(value() < val); + } + const reflection::Object *object() const + { + return GetPointer(VT_OBJECT); + } + const reflection::Type *union_type() const + { + return GetPointer(VT_UNION_TYPE); + } + const flatbuffers::Vector > *documentation() const + { + return GetPointer > *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyField(verifier, VT_VALUE) && + VerifyOffset(verifier, VT_OBJECT) && + verifier.VerifyTable(object()) && + VerifyOffset(verifier, VT_UNION_TYPE) && + verifier.VerifyTable(union_type()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct EnumValBuilder { + typedef EnumVal Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(EnumVal::VT_NAME, name); + } + void add_value(int64_t value) + { + fbb_.AddElement(EnumVal::VT_VALUE, value, 0); + } + void add_object(flatbuffers::Offset object) + { + fbb_.AddOffset(EnumVal::VT_OBJECT, object); + } + void add_union_type(flatbuffers::Offset union_type) + { + fbb_.AddOffset(EnumVal::VT_UNION_TYPE, union_type); + } + void add_documentation(flatbuffers::Offset > > documentation) + { + fbb_.AddOffset(EnumVal::VT_DOCUMENTATION, documentation); + } + explicit EnumValBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, EnumVal::VT_NAME); + return o; + } +}; + +inline flatbuffers::Offset CreateEnumVal( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + int64_t value = 0, + flatbuffers::Offset object = 0, + flatbuffers::Offset union_type = 0, + flatbuffers::Offset > > documentation = 0) +{ + EnumValBuilder builder_(_fbb); + builder_.add_value(value); + builder_.add_documentation(documentation); + builder_.add_union_type(union_type); + builder_.add_object(object); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateEnumValDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + int64_t value = 0, + flatbuffers::Offset object = 0, + flatbuffers::Offset union_type = 0, + const std::vector > *documentation = nullptr) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + auto documentation__ = documentation ? _fbb.CreateVector >(*documentation) : 0; + return reflection::CreateEnumVal( + _fbb, + name__, + value, + object, + union_type, + documentation__); +} + +struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef EnumBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_VALUES = 6, + VT_IS_UNION = 8, + VT_UNDERLYING_TYPE = 10, + VT_ATTRIBUTES = 12, + VT_DOCUMENTATION = 14 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Enum *o) const + { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const + { + return strcmp(name()->c_str(), val); + } + const flatbuffers::Vector > *values() const + { + return GetPointer > *>(VT_VALUES); + } + bool is_union() const + { + return GetField(VT_IS_UNION, 0) != 0; + } + const reflection::Type *underlying_type() const + { + return GetPointer(VT_UNDERLYING_TYPE); + } + const flatbuffers::Vector > *attributes() const + { + return GetPointer > *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector > *documentation() const + { + return GetPointer > *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_VALUES) && + verifier.VerifyVector(values()) && + verifier.VerifyVectorOfTables(values()) && + VerifyField(verifier, VT_IS_UNION) && + VerifyOffsetRequired(verifier, VT_UNDERLYING_TYPE) && + verifier.VerifyTable(underlying_type()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct EnumBuilder { + typedef Enum Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(Enum::VT_NAME, name); + } + void add_values(flatbuffers::Offset > > values) + { + fbb_.AddOffset(Enum::VT_VALUES, values); + } + void add_is_union(bool is_union) + { + fbb_.AddElement(Enum::VT_IS_UNION, static_cast(is_union), 0); + } + void add_underlying_type(flatbuffers::Offset underlying_type) + { + fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type); + } + void add_attributes(flatbuffers::Offset > > attributes) + { + fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset > > documentation) + { + fbb_.AddOffset(Enum::VT_DOCUMENTATION, documentation); + } + explicit EnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Enum::VT_NAME); + fbb_.Required(o, Enum::VT_VALUES); + fbb_.Required(o, Enum::VT_UNDERLYING_TYPE); + return o; + } +}; + +inline flatbuffers::Offset CreateEnum( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset > > values = 0, + bool is_union = false, + flatbuffers::Offset underlying_type = 0, + flatbuffers::Offset > > attributes = 0, + flatbuffers::Offset > > documentation = 0) +{ + EnumBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_underlying_type(underlying_type); + builder_.add_values(values); + builder_.add_name(name); + builder_.add_is_union(is_union); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateEnumDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + std::vector > *values = nullptr, + bool is_union = false, + flatbuffers::Offset underlying_type = 0, + std::vector > *attributes = nullptr, + const std::vector > *documentation = nullptr) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + auto values__ = values ? _fbb.CreateVectorOfSortedTables(values) : 0; + auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector >(*documentation) : 0; + return reflection::CreateEnum( + _fbb, + name__, + values__, + is_union, + underlying_type, + attributes__, + documentation__); +} + +struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FieldBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_TYPE = 6, + VT_ID = 8, + VT_OFFSET = 10, + VT_DEFAULT_INTEGER = 12, + VT_DEFAULT_REAL = 14, + VT_DEPRECATED = 16, + VT_REQUIRED = 18, + VT_KEY = 20, + VT_ATTRIBUTES = 22, + VT_DOCUMENTATION = 24, + VT_OPTIONAL = 26 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Field *o) const + { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const + { + return strcmp(name()->c_str(), val); + } + const reflection::Type *type() const + { + return GetPointer(VT_TYPE); + } + uint16_t id() const + { + return GetField(VT_ID, 0); + } + uint16_t offset() const + { + return GetField(VT_OFFSET, 0); + } + int64_t default_integer() const + { + return GetField(VT_DEFAULT_INTEGER, 0); + } + double default_real() const + { + return GetField(VT_DEFAULT_REAL, 0.0); + } + bool deprecated() const + { + return GetField(VT_DEPRECATED, 0) != 0; + } + bool required() const + { + return GetField(VT_REQUIRED, 0) != 0; + } + bool key() const + { + return GetField(VT_KEY, 0) != 0; + } + const flatbuffers::Vector > *attributes() const + { + return GetPointer > *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector > *documentation() const + { + return GetPointer > *>(VT_DOCUMENTATION); + } + bool optional() const + { + return GetField(VT_OPTIONAL, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_TYPE) && + verifier.VerifyTable(type()) && + VerifyField(verifier, VT_ID) && + VerifyField(verifier, VT_OFFSET) && + VerifyField(verifier, VT_DEFAULT_INTEGER) && + VerifyField(verifier, VT_DEFAULT_REAL) && + VerifyField(verifier, VT_DEPRECATED) && + VerifyField(verifier, VT_REQUIRED) && + VerifyField(verifier, VT_KEY) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + VerifyField(verifier, VT_OPTIONAL) && + verifier.EndTable(); + } +}; + +struct FieldBuilder { + typedef Field Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(Field::VT_NAME, name); + } + void add_type(flatbuffers::Offset type) + { + fbb_.AddOffset(Field::VT_TYPE, type); + } + void add_id(uint16_t id) + { + fbb_.AddElement(Field::VT_ID, id, 0); + } + void add_offset(uint16_t offset) + { + fbb_.AddElement(Field::VT_OFFSET, offset, 0); + } + void add_default_integer(int64_t default_integer) + { + fbb_.AddElement(Field::VT_DEFAULT_INTEGER, default_integer, 0); + } + void add_default_real(double default_real) + { + fbb_.AddElement(Field::VT_DEFAULT_REAL, default_real, 0.0); + } + void add_deprecated(bool deprecated) + { + fbb_.AddElement(Field::VT_DEPRECATED, static_cast(deprecated), 0); + } + void add_required(bool required) + { + fbb_.AddElement(Field::VT_REQUIRED, static_cast(required), 0); + } + void add_key(bool key) + { + fbb_.AddElement(Field::VT_KEY, static_cast(key), 0); + } + void add_attributes(flatbuffers::Offset > > attributes) + { + fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset > > documentation) + { + fbb_.AddOffset(Field::VT_DOCUMENTATION, documentation); + } + void add_optional(bool optional) + { + fbb_.AddElement(Field::VT_OPTIONAL, static_cast(optional), 0); + } + explicit FieldBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Field::VT_NAME); + fbb_.Required(o, Field::VT_TYPE); + return o; + } +}; + +inline flatbuffers::Offset CreateField( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset type = 0, + uint16_t id = 0, + uint16_t offset = 0, + int64_t default_integer = 0, + double default_real = 0.0, + bool deprecated = false, + bool required = false, + bool key = false, + flatbuffers::Offset > > attributes = 0, + flatbuffers::Offset > > documentation = 0, + bool optional = false) +{ + FieldBuilder builder_(_fbb); + builder_.add_default_real(default_real); + builder_.add_default_integer(default_integer); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_type(type); + builder_.add_name(name); + builder_.add_offset(offset); + builder_.add_id(id); + builder_.add_optional(optional); + builder_.add_key(key); + builder_.add_required(required); + builder_.add_deprecated(deprecated); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateFieldDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + flatbuffers::Offset type = 0, + uint16_t id = 0, + uint16_t offset = 0, + int64_t default_integer = 0, + double default_real = 0.0, + bool deprecated = false, + bool required = false, + bool key = false, + std::vector > *attributes = nullptr, + const std::vector > *documentation = nullptr, + bool optional = false) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector >(*documentation) : 0; + return reflection::CreateField( + _fbb, + name__, + type, + id, + offset, + default_integer, + default_real, + deprecated, + required, + key, + attributes__, + documentation__, + optional); +} + +struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ObjectBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_FIELDS = 6, + VT_IS_STRUCT = 8, + VT_MINALIGN = 10, + VT_BYTESIZE = 12, + VT_ATTRIBUTES = 14, + VT_DOCUMENTATION = 16 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Object *o) const + { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const + { + return strcmp(name()->c_str(), val); + } + const flatbuffers::Vector > *fields() const + { + return GetPointer > *>(VT_FIELDS); + } + bool is_struct() const + { + return GetField(VT_IS_STRUCT, 0) != 0; + } + int32_t minalign() const + { + return GetField(VT_MINALIGN, 0); + } + int32_t bytesize() const + { + return GetField(VT_BYTESIZE, 0); + } + const flatbuffers::Vector > *attributes() const + { + return GetPointer > *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector > *documentation() const + { + return GetPointer > *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_FIELDS) && + verifier.VerifyVector(fields()) && + verifier.VerifyVectorOfTables(fields()) && + VerifyField(verifier, VT_IS_STRUCT) && + VerifyField(verifier, VT_MINALIGN) && + VerifyField(verifier, VT_BYTESIZE) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct ObjectBuilder { + typedef Object Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(Object::VT_NAME, name); + } + void add_fields(flatbuffers::Offset > > fields) + { + fbb_.AddOffset(Object::VT_FIELDS, fields); + } + void add_is_struct(bool is_struct) + { + fbb_.AddElement(Object::VT_IS_STRUCT, static_cast(is_struct), 0); + } + void add_minalign(int32_t minalign) + { + fbb_.AddElement(Object::VT_MINALIGN, minalign, 0); + } + void add_bytesize(int32_t bytesize) + { + fbb_.AddElement(Object::VT_BYTESIZE, bytesize, 0); + } + void add_attributes(flatbuffers::Offset > > attributes) + { + fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset > > documentation) + { + fbb_.AddOffset(Object::VT_DOCUMENTATION, documentation); + } + explicit ObjectBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Object::VT_NAME); + fbb_.Required(o, Object::VT_FIELDS); + return o; + } +}; + +inline flatbuffers::Offset CreateObject( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset > > fields = 0, + bool is_struct = false, + int32_t minalign = 0, + int32_t bytesize = 0, + flatbuffers::Offset > > attributes = 0, + flatbuffers::Offset > > documentation = 0) +{ + ObjectBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_bytesize(bytesize); + builder_.add_minalign(minalign); + builder_.add_fields(fields); + builder_.add_name(name); + builder_.add_is_struct(is_struct); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateObjectDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + std::vector > *fields = nullptr, + bool is_struct = false, + int32_t minalign = 0, + int32_t bytesize = 0, + std::vector > *attributes = nullptr, + const std::vector > *documentation = nullptr) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + auto fields__ = fields ? _fbb.CreateVectorOfSortedTables(fields) : 0; + auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector >(*documentation) : 0; + return reflection::CreateObject( + _fbb, + name__, + fields__, + is_struct, + minalign, + bytesize, + attributes__, + documentation__); +} + +struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef RPCCallBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_REQUEST = 6, + VT_RESPONSE = 8, + VT_ATTRIBUTES = 10, + VT_DOCUMENTATION = 12 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const RPCCall *o) const + { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const + { + return strcmp(name()->c_str(), val); + } + const reflection::Object *request() const + { + return GetPointer(VT_REQUEST); + } + const reflection::Object *response() const + { + return GetPointer(VT_RESPONSE); + } + const flatbuffers::Vector > *attributes() const + { + return GetPointer > *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector > *documentation() const + { + return GetPointer > *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffsetRequired(verifier, VT_REQUEST) && + verifier.VerifyTable(request()) && + VerifyOffsetRequired(verifier, VT_RESPONSE) && + verifier.VerifyTable(response()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct RPCCallBuilder { + typedef RPCCall Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(RPCCall::VT_NAME, name); + } + void add_request(flatbuffers::Offset request) + { + fbb_.AddOffset(RPCCall::VT_REQUEST, request); + } + void add_response(flatbuffers::Offset response) + { + fbb_.AddOffset(RPCCall::VT_RESPONSE, response); + } + void add_attributes(flatbuffers::Offset > > attributes) + { + fbb_.AddOffset(RPCCall::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset > > documentation) + { + fbb_.AddOffset(RPCCall::VT_DOCUMENTATION, documentation); + } + explicit RPCCallBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, RPCCall::VT_NAME); + fbb_.Required(o, RPCCall::VT_REQUEST); + fbb_.Required(o, RPCCall::VT_RESPONSE); + return o; + } +}; + +inline flatbuffers::Offset CreateRPCCall( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset request = 0, + flatbuffers::Offset response = 0, + flatbuffers::Offset > > attributes = 0, + flatbuffers::Offset > > documentation = 0) +{ + RPCCallBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_response(response); + builder_.add_request(request); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateRPCCallDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + flatbuffers::Offset request = 0, + flatbuffers::Offset response = 0, + std::vector > *attributes = nullptr, + const std::vector > *documentation = nullptr) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector >(*documentation) : 0; + return reflection::CreateRPCCall( + _fbb, + name__, + request, + response, + attributes__, + documentation__); +} + +struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ServiceBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_CALLS = 6, + VT_ATTRIBUTES = 8, + VT_DOCUMENTATION = 10 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + bool KeyCompareLessThan(const Service *o) const + { + return *name() < *o->name(); + } + int KeyCompareWithValue(const char *val) const + { + return strcmp(name()->c_str(), val); + } + const flatbuffers::Vector > *calls() const + { + return GetPointer > *>(VT_CALLS); + } + const flatbuffers::Vector > *attributes() const + { + return GetPointer > *>(VT_ATTRIBUTES); + } + const flatbuffers::Vector > *documentation() const + { + return GetPointer > *>(VT_DOCUMENTATION); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffset(verifier, VT_CALLS) && + verifier.VerifyVector(calls()) && + verifier.VerifyVectorOfTables(calls()) && + VerifyOffset(verifier, VT_ATTRIBUTES) && + verifier.VerifyVector(attributes()) && + verifier.VerifyVectorOfTables(attributes()) && + VerifyOffset(verifier, VT_DOCUMENTATION) && + verifier.VerifyVector(documentation()) && + verifier.VerifyVectorOfStrings(documentation()) && + verifier.EndTable(); + } +}; + +struct ServiceBuilder { + typedef Service Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(Service::VT_NAME, name); + } + void add_calls(flatbuffers::Offset > > calls) + { + fbb_.AddOffset(Service::VT_CALLS, calls); + } + void add_attributes(flatbuffers::Offset > > attributes) + { + fbb_.AddOffset(Service::VT_ATTRIBUTES, attributes); + } + void add_documentation(flatbuffers::Offset > > documentation) + { + fbb_.AddOffset(Service::VT_DOCUMENTATION, documentation); + } + explicit ServiceBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Service::VT_NAME); + return o; + } +}; + +inline flatbuffers::Offset CreateService( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + flatbuffers::Offset > > calls = 0, + flatbuffers::Offset > > attributes = 0, + flatbuffers::Offset > > documentation = 0) +{ + ServiceBuilder builder_(_fbb); + builder_.add_documentation(documentation); + builder_.add_attributes(attributes); + builder_.add_calls(calls); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateServiceDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + std::vector > *calls = nullptr, + std::vector > *attributes = nullptr, + const std::vector > *documentation = nullptr) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + auto calls__ = calls ? _fbb.CreateVectorOfSortedTables(calls) : 0; + auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; + auto documentation__ = documentation ? _fbb.CreateVector >(*documentation) : 0; + return reflection::CreateService( + _fbb, + name__, + calls__, + attributes__, + documentation__); +} + +struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SchemaBuilder Builder; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_OBJECTS = 4, + VT_ENUMS = 6, + VT_FILE_IDENT = 8, + VT_FILE_EXT = 10, + VT_ROOT_TABLE = 12, + VT_SERVICES = 14 + }; + const flatbuffers::Vector > *objects() const + { + return GetPointer > *>(VT_OBJECTS); + } + const flatbuffers::Vector > *enums() const + { + return GetPointer > *>(VT_ENUMS); + } + const flatbuffers::String *file_ident() const + { + return GetPointer(VT_FILE_IDENT); + } + const flatbuffers::String *file_ext() const + { + return GetPointer(VT_FILE_EXT); + } + const reflection::Object *root_table() const + { + return GetPointer(VT_ROOT_TABLE); + } + const flatbuffers::Vector > *services() const + { + return GetPointer > *>(VT_SERVICES); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffsetRequired(verifier, VT_OBJECTS) && + verifier.VerifyVector(objects()) && + verifier.VerifyVectorOfTables(objects()) && + VerifyOffsetRequired(verifier, VT_ENUMS) && + verifier.VerifyVector(enums()) && + verifier.VerifyVectorOfTables(enums()) && + VerifyOffset(verifier, VT_FILE_IDENT) && + verifier.VerifyString(file_ident()) && + VerifyOffset(verifier, VT_FILE_EXT) && + verifier.VerifyString(file_ext()) && + VerifyOffset(verifier, VT_ROOT_TABLE) && + verifier.VerifyTable(root_table()) && + VerifyOffset(verifier, VT_SERVICES) && + verifier.VerifyVector(services()) && + verifier.VerifyVectorOfTables(services()) && + verifier.EndTable(); + } +}; + +struct SchemaBuilder { + typedef Schema Table; + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_objects(flatbuffers::Offset > > objects) + { + fbb_.AddOffset(Schema::VT_OBJECTS, objects); + } + void add_enums(flatbuffers::Offset > > enums) + { + fbb_.AddOffset(Schema::VT_ENUMS, enums); + } + void add_file_ident(flatbuffers::Offset file_ident) + { + fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident); + } + void add_file_ext(flatbuffers::Offset file_ext) + { + fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext); + } + void add_root_table(flatbuffers::Offset root_table) + { + fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table); + } + void add_services(flatbuffers::Offset > > services) + { + fbb_.AddOffset(Schema::VT_SERVICES, services); + } + explicit SchemaBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + fbb_.Required(o, Schema::VT_OBJECTS); + fbb_.Required(o, Schema::VT_ENUMS); + return o; + } +}; + +inline flatbuffers::Offset CreateSchema( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > > objects = 0, + flatbuffers::Offset > > enums = 0, + flatbuffers::Offset file_ident = 0, + flatbuffers::Offset file_ext = 0, + flatbuffers::Offset root_table = 0, + flatbuffers::Offset > > services = 0) +{ + SchemaBuilder builder_(_fbb); + builder_.add_services(services); + builder_.add_root_table(root_table); + builder_.add_file_ext(file_ext); + builder_.add_file_ident(file_ident); + builder_.add_enums(enums); + builder_.add_objects(objects); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateSchemaDirect( + flatbuffers::FlatBufferBuilder &_fbb, + std::vector > *objects = nullptr, + std::vector > *enums = nullptr, + const char *file_ident = nullptr, + const char *file_ext = nullptr, + flatbuffers::Offset root_table = 0, + std::vector > *services = nullptr) +{ + auto objects__ = objects ? _fbb.CreateVectorOfSortedTables(objects) : 0; + auto enums__ = enums ? _fbb.CreateVectorOfSortedTables(enums) : 0; + auto file_ident__ = file_ident ? _fbb.CreateString(file_ident) : 0; + auto file_ext__ = file_ext ? _fbb.CreateString(file_ext) : 0; + auto services__ = services ? _fbb.CreateVectorOfSortedTables(services) : 0; + return reflection::CreateSchema( + _fbb, + objects__, + enums__, + file_ident__, + file_ext__, + root_table, + services__); +} + +inline const reflection::Schema *GetSchema(const void *buf) +{ + return flatbuffers::GetRoot(buf); +} + +inline const reflection::Schema *GetSizePrefixedSchema(const void *buf) +{ + return flatbuffers::GetSizePrefixedRoot(buf); +} + +inline const char *SchemaIdentifier() +{ + return "BFBS"; +} + +inline bool SchemaBufferHasIdentifier(const void *buf) +{ + return flatbuffers::BufferHasIdentifier( + buf, SchemaIdentifier()); +} + +inline bool VerifySchemaBuffer( + flatbuffers::Verifier &verifier) +{ + return verifier.VerifyBuffer(SchemaIdentifier()); +} + +inline bool VerifySizePrefixedSchemaBuffer( + flatbuffers::Verifier &verifier) +{ + return verifier.VerifySizePrefixedBuffer(SchemaIdentifier()); +} + +inline const char *SchemaExtension() +{ + return "bfbs"; +} + +inline void FinishSchemaBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) +{ + fbb.Finish(root, SchemaIdentifier()); +} + +inline void FinishSizePrefixedSchemaBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) +{ + fbb.FinishSizePrefixed(root, SchemaIdentifier()); +} + +} // namespace reflection + +#endif // FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/registry.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/registry.h new file mode 100644 index 00000000..cc8158b5 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/registry.h @@ -0,0 +1,141 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_REGISTRY_H_ +#define FLATBUFFERS_REGISTRY_H_ + +#include "flatbuffers/idl.h" + +namespace flatbuffers { +// Convenience class to easily parse or generate text for arbitrary FlatBuffers. +// Simply pre-populate it with all schema filenames that may be in use, and +// This class will look them up using the file_identifier declared in the +// schema. +class Registry { +public: + // Call this for all schemas that may be in use. The identifier has + // a function in the generated code, e.g. MonsterIdentifier(). + void Register(const char *file_identifier, const char *schema_path) + { + Schema schema; + schema.path_ = schema_path; + schemas_[file_identifier] = schema; + } + + // Generate text from an arbitrary FlatBuffer by looking up its + // file_identifier in the registry. + bool FlatBufferToText(const uint8_t *flatbuf, size_t len, std::string *dest) + { + // Get the identifier out of the buffer. + // If the buffer is truncated, exit. + if (len < sizeof(uoffset_t) + FlatBufferBuilder::kFileIdentifierLength) { + lasterror_ = "buffer truncated"; + return false; + } + std::string ident( + reinterpret_cast(flatbuf) + sizeof(uoffset_t), + FlatBufferBuilder::kFileIdentifierLength); + // Load and parse the schema. + Parser parser; + if (!LoadSchema(ident, &parser)) + return false; + // Now we're ready to generate text. + if (!GenerateText(parser, flatbuf, dest)) { + lasterror_ = "unable to generate text for FlatBuffer binary"; + return false; + } + return true; + } + + // Converts a binary buffer to text using one of the schemas in the registry, + // use the file_identifier to indicate which. + // If DetachedBuffer::data() is null then parsing failed. + DetachedBuffer TextToFlatBuffer(const char *text, + const char *file_identifier) + { + // Load and parse the schema. + Parser parser; + if (!LoadSchema(file_identifier, &parser)) + return DetachedBuffer(); + // Parse the text. + if (!parser.Parse(text)) { + lasterror_ = parser.error_; + return DetachedBuffer(); + } + // We have a valid FlatBuffer. Detach it from the builder and return. + return parser.builder_.Release(); + } + + // Modify any parsing / output options used by the other functions. + void SetOptions(const IDLOptions &opts) + { + opts_ = opts; + } + + // If schemas used contain include statements, call this function for every + // directory the parser should search them for. + void AddIncludeDirectory(const char *path) + { + include_paths_.push_back(path); + } + + // Returns a human readable error if any of the above functions fail. + const std::string &GetLastError() + { + return lasterror_; + } + +private: + bool LoadSchema(const std::string &ident, Parser *parser) + { + // Find the schema, if not, exit. + auto it = schemas_.find(ident); + if (it == schemas_.end()) { + // Don't attach the identifier, since it may not be human readable. + lasterror_ = "identifier for this buffer not in the registry"; + return false; + } + auto &schema = it->second; + // Load the schema from disk. If not, exit. + std::string schematext; + if (!LoadFile(schema.path_.c_str(), false, &schematext)) { + lasterror_ = "could not load schema: " + schema.path_; + return false; + } + // Parse schema. + parser->opts = opts_; + if (!parser->Parse(schematext.c_str(), vector_data(include_paths_), + schema.path_.c_str())) { + lasterror_ = parser->error_; + return false; + } + return true; + } + + struct Schema { + std::string path_; + // TODO(wvo) optionally cache schema file or parsed schema here. + }; + + std::string lasterror_; + IDLOptions opts_; + std::vector include_paths_; + std::map schemas_; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_REGISTRY_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/stl_emulation.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/stl_emulation.h new file mode 100644 index 00000000..c9a1a8bf --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/stl_emulation.h @@ -0,0 +1,449 @@ +/* + * Copyright 2017 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_STL_EMULATION_H_ +#define FLATBUFFERS_STL_EMULATION_H_ + +// clang-format off +#include "flatbuffers/base.h" + +#include +#include +#include +#include +#include + +// Detect C++17 compatible compiler. +// __cplusplus >= 201703L - a compiler has support of 'static inline' variables. +#if defined(FLATBUFFERS_USE_STD_OPTIONAL) \ + || (defined(__cplusplus) && __cplusplus >= 201703L) \ + || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L)) + #include + #ifndef FLATBUFFERS_USE_STD_OPTIONAL + #define FLATBUFFERS_USE_STD_OPTIONAL + #endif +#endif + +#if defined(_STLPORT_VERSION) && !defined(FLATBUFFERS_CPP98_STL) + #define FLATBUFFERS_CPP98_STL +#endif // defined(_STLPORT_VERSION) && !defined(FLATBUFFERS_CPP98_STL) + +#if defined(FLATBUFFERS_CPP98_STL) + #include +#endif // defined(FLATBUFFERS_CPP98_STL) + +// This header provides backwards compatibility for C++98 STLs like stlport. +namespace flatbuffers { + +// Retrieve ::back() from a string in a way that is compatible with pre C++11 +// STLs (e.g stlport). +inline char& string_back(std::string &value) { + return value[value.length() - 1]; +} + +inline char string_back(const std::string &value) { + return value[value.length() - 1]; +} + +// Helper method that retrieves ::data() from a vector in a way that is +// compatible with pre C++11 STLs (e.g stlport). +template inline T *vector_data(std::vector &vector) { + // In some debug environments, operator[] does bounds checking, so &vector[0] + // can't be used. + return vector.empty() ? nullptr : &vector[0]; +} + +template inline const T *vector_data( + const std::vector &vector) { + return vector.empty() ? nullptr : &vector[0]; +} + +template +inline void vector_emplace_back(std::vector *vector, V &&data) { + #if defined(FLATBUFFERS_CPP98_STL) + vector->push_back(data); + #else + vector->emplace_back(std::forward(data)); + #endif // defined(FLATBUFFERS_CPP98_STL) +} + +#ifndef FLATBUFFERS_CPP98_STL + #if defined(FLATBUFFERS_TEMPLATES_ALIASES) + template + using numeric_limits = std::numeric_limits; + #else + template class numeric_limits : + public std::numeric_limits {}; + #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) +#else + template class numeric_limits : + public std::numeric_limits { + public: + // Android NDK fix. + static T lowest() { + return std::numeric_limits::min(); + } + }; + + template <> class numeric_limits : + public std::numeric_limits { + public: + static float lowest() { return -FLT_MAX; } + }; + + template <> class numeric_limits : + public std::numeric_limits { + public: + static double lowest() { return -DBL_MAX; } + }; + + template <> class numeric_limits { + public: + static unsigned long long min() { return 0ULL; } + static unsigned long long max() { return ~0ULL; } + static unsigned long long lowest() { + return numeric_limits::min(); + } + }; + + template <> class numeric_limits { + public: + static long long min() { + return static_cast(1ULL << ((sizeof(long long) << 3) - 1)); + } + static long long max() { + return static_cast( + (1ULL << ((sizeof(long long) << 3) - 1)) - 1); + } + static long long lowest() { + return numeric_limits::min(); + } + }; +#endif // FLATBUFFERS_CPP98_STL + +#if defined(FLATBUFFERS_TEMPLATES_ALIASES) + #ifndef FLATBUFFERS_CPP98_STL + template using is_scalar = std::is_scalar; + template using is_same = std::is_same; + template using is_floating_point = std::is_floating_point; + template using is_unsigned = std::is_unsigned; + template using is_enum = std::is_enum; + template using make_unsigned = std::make_unsigned; + template + using conditional = std::conditional; + template + using integral_constant = std::integral_constant; + #else + // Map C++ TR1 templates defined by stlport. + template using is_scalar = std::tr1::is_scalar; + template using is_same = std::tr1::is_same; + template using is_floating_point = + std::tr1::is_floating_point; + template using is_unsigned = std::tr1::is_unsigned; + template using is_enum = std::tr1::is_enum; + // Android NDK doesn't have std::make_unsigned or std::tr1::make_unsigned. + template struct make_unsigned { + static_assert(is_unsigned::value, "Specialization not implemented!"); + using type = T; + }; + template<> struct make_unsigned { using type = unsigned char; }; + template<> struct make_unsigned { using type = unsigned short; }; + template<> struct make_unsigned { using type = unsigned int; }; + template<> struct make_unsigned { using type = unsigned long; }; + template<> + struct make_unsigned { using type = unsigned long long; }; + template + using conditional = std::tr1::conditional; + template + using integral_constant = std::tr1::integral_constant; + #endif // !FLATBUFFERS_CPP98_STL +#else + // MSVC 2010 doesn't support C++11 aliases. + template struct is_scalar : public std::is_scalar {}; + template struct is_same : public std::is_same {}; + template struct is_floating_point : + public std::is_floating_point {}; + template struct is_unsigned : public std::is_unsigned {}; + template struct is_enum : public std::is_enum {}; + template struct make_unsigned : public std::make_unsigned {}; + template + struct conditional : public std::conditional {}; + template + struct integral_constant : public std::integral_constant {}; +#endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) + +#ifndef FLATBUFFERS_CPP98_STL + #if defined(FLATBUFFERS_TEMPLATES_ALIASES) + template using unique_ptr = std::unique_ptr; + #else + // MSVC 2010 doesn't support C++11 aliases. + // We're manually "aliasing" the class here as we want to bring unique_ptr + // into the flatbuffers namespace. We have unique_ptr in the flatbuffers + // namespace we have a completely independent implementation (see below) + // for C++98 STL implementations. + template class unique_ptr : public std::unique_ptr { + public: + unique_ptr() {} + explicit unique_ptr(T* p) : std::unique_ptr(p) {} + unique_ptr(std::unique_ptr&& u) { *this = std::move(u); } + unique_ptr(unique_ptr&& u) { *this = std::move(u); } + unique_ptr& operator=(std::unique_ptr&& u) { + std::unique_ptr::reset(u.release()); + return *this; + } + unique_ptr& operator=(unique_ptr&& u) { + std::unique_ptr::reset(u.release()); + return *this; + } + unique_ptr& operator=(T* p) { + return std::unique_ptr::operator=(p); + } + }; + #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) +#else + // Very limited implementation of unique_ptr. + // This is provided simply to allow the C++ code generated from the default + // settings to function in C++98 environments with no modifications. + template class unique_ptr { + public: + typedef T element_type; + + unique_ptr() : ptr_(nullptr) {} + explicit unique_ptr(T* p) : ptr_(p) {} + unique_ptr(unique_ptr&& u) : ptr_(nullptr) { reset(u.release()); } + unique_ptr(const unique_ptr& u) : ptr_(nullptr) { + reset(const_cast(&u)->release()); + } + ~unique_ptr() { reset(); } + + unique_ptr& operator=(const unique_ptr& u) { + reset(const_cast(&u)->release()); + return *this; + } + + unique_ptr& operator=(unique_ptr&& u) { + reset(u.release()); + return *this; + } + + unique_ptr& operator=(T* p) { + reset(p); + return *this; + } + + const T& operator*() const { return *ptr_; } + T* operator->() const { return ptr_; } + T* get() const noexcept { return ptr_; } + explicit operator bool() const { return ptr_ != nullptr; } + + // modifiers + T* release() { + T* value = ptr_; + ptr_ = nullptr; + return value; + } + + void reset(T* p = nullptr) { + T* value = ptr_; + ptr_ = p; + if (value) delete value; + } + + void swap(unique_ptr& u) { + T* temp_ptr = ptr_; + ptr_ = u.ptr_; + u.ptr_ = temp_ptr; + } + + private: + T* ptr_; + }; + + template bool operator==(const unique_ptr& x, + const unique_ptr& y) { + return x.get() == y.get(); + } + + template bool operator==(const unique_ptr& x, + const D* y) { + return static_cast(x.get()) == y; + } + + template bool operator==(const unique_ptr& x, intptr_t y) { + return reinterpret_cast(x.get()) == y; + } + + template bool operator!=(const unique_ptr& x, decltype(nullptr)) { + return !!x; + } + + template bool operator!=(decltype(nullptr), const unique_ptr& x) { + return !!x; + } + + template bool operator==(const unique_ptr& x, decltype(nullptr)) { + return !x; + } + + template bool operator==(decltype(nullptr), const unique_ptr& x) { + return !x; + } + +#endif // !FLATBUFFERS_CPP98_STL + +#ifdef FLATBUFFERS_USE_STD_OPTIONAL +template +using Optional = std::optional; +using nullopt_t = std::nullopt_t; +inline constexpr nullopt_t nullopt = std::nullopt; + +#else +// Limited implementation of Optional type for a scalar T. +// This implementation limited by trivial types compatible with +// std::is_arithmetic or std::is_enum type traits. + +// A tag to indicate an empty flatbuffers::optional. +struct nullopt_t { + explicit FLATBUFFERS_CONSTEXPR_CPP11 nullopt_t(int) {} +}; + +#if defined(FLATBUFFERS_CONSTEXPR_DEFINED) + namespace internal { + template struct nullopt_holder { + static constexpr nullopt_t instance_ = nullopt_t(0); + }; + template + constexpr nullopt_t nullopt_holder::instance_; + } + static constexpr const nullopt_t &nullopt = internal::nullopt_holder::instance_; + +#else + namespace internal { + template struct nullopt_holder { + static const nullopt_t instance_; + }; + template + const nullopt_t nullopt_holder::instance_ = nullopt_t(0); + } + static const nullopt_t &nullopt = internal::nullopt_holder::instance_; + +#endif + +template +class Optional FLATBUFFERS_FINAL_CLASS { + // Non-scalar 'T' would extremely complicated Optional. + // Use is_scalar checking because flatbuffers flatbuffers::is_arithmetic + // isn't implemented. + static_assert(flatbuffers::is_scalar::value, "unexpected type T"); + + public: + ~Optional() {} + + FLATBUFFERS_CONSTEXPR_CPP11 Optional() FLATBUFFERS_NOEXCEPT + : value_(), has_value_(false) {} + + FLATBUFFERS_CONSTEXPR_CPP11 Optional(nullopt_t) FLATBUFFERS_NOEXCEPT + : value_(), has_value_(false) {} + + FLATBUFFERS_CONSTEXPR_CPP11 Optional(T val) FLATBUFFERS_NOEXCEPT + : value_(val), has_value_(true) {} + + FLATBUFFERS_CONSTEXPR_CPP11 Optional(const Optional &other) FLATBUFFERS_NOEXCEPT + : value_(other.value_), has_value_(other.has_value_) {} + + FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(const Optional &other) FLATBUFFERS_NOEXCEPT { + value_ = other.value_; + has_value_ = other.has_value_; + return *this; + } + + FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(nullopt_t) FLATBUFFERS_NOEXCEPT { + value_ = T(); + has_value_ = false; + return *this; + } + + FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(T val) FLATBUFFERS_NOEXCEPT { + value_ = val; + has_value_ = true; + return *this; + } + + void reset() FLATBUFFERS_NOEXCEPT { + *this = nullopt; + } + + void swap(Optional &other) FLATBUFFERS_NOEXCEPT { + std::swap(value_, other.value_); + std::swap(has_value_, other.has_value_); + } + + FLATBUFFERS_CONSTEXPR_CPP11 FLATBUFFERS_EXPLICIT_CPP11 operator bool() const FLATBUFFERS_NOEXCEPT { + return has_value_; + } + + FLATBUFFERS_CONSTEXPR_CPP11 bool has_value() const FLATBUFFERS_NOEXCEPT { + return has_value_; + } + + FLATBUFFERS_CONSTEXPR_CPP11 const T& operator*() const FLATBUFFERS_NOEXCEPT { + return value_; + } + + const T& value() const { + FLATBUFFERS_ASSERT(has_value()); + return value_; + } + + T value_or(T default_value) const FLATBUFFERS_NOEXCEPT { + return has_value() ? value_ : default_value; + } + + private: + T value_; + bool has_value_; +}; + +template +FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& opt, nullopt_t) FLATBUFFERS_NOEXCEPT { + return !opt; +} +template +FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(nullopt_t, const Optional& opt) FLATBUFFERS_NOEXCEPT { + return !opt; +} + +template +FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& lhs, const U& rhs) FLATBUFFERS_NOEXCEPT { + return static_cast(lhs) && (*lhs == rhs); +} + +template +FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const T& lhs, const Optional& rhs) FLATBUFFERS_NOEXCEPT { + return static_cast(rhs) && (lhs == *rhs); +} + +template +FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& lhs, const Optional& rhs) FLATBUFFERS_NOEXCEPT { + return static_cast(lhs) != static_cast(rhs) + ? false + : !static_cast(lhs) ? false : (*lhs == *rhs); +} +#endif // FLATBUFFERS_USE_STD_OPTIONAL + +} // namespace flatbuffers + +#endif // FLATBUFFERS_STL_EMULATION_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/util.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/util.h new file mode 100644 index 00000000..f5feec4c --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/util.h @@ -0,0 +1,782 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_UTIL_H_ +#define FLATBUFFERS_UTIL_H_ + +#include + +#include "flatbuffers/base.h" +#include "flatbuffers/stl_emulation.h" + +#ifndef FLATBUFFERS_PREFER_PRINTF +#include +#else // FLATBUFFERS_PREFER_PRINTF +#include +#include +#endif // FLATBUFFERS_PREFER_PRINTF + +#include +#include + +namespace flatbuffers { +// @locale-independent functions for ASCII characters set. + +// Fast checking that character lies in closed range: [a <= x <= b] +// using one compare (conditional branch) operator. +inline bool check_ascii_range(char x, char a, char b) +{ + FLATBUFFERS_ASSERT(a <= b); + // (Hacker's Delight): `a <= x <= b` <=> `(x-a) <={u} (b-a)`. + // The x, a, b will be promoted to int and subtracted without overflow. + return static_cast(x - a) <= static_cast(b - a); +} + +// Case-insensitive isalpha +inline bool is_alpha(char c) +{ + // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). + return check_ascii_range(c & 0xDF, 'a' & 0xDF, 'z' & 0xDF); +} + +// Check (case-insensitive) that `c` is equal to alpha. +inline bool is_alpha_char(char c, char alpha) +{ + FLATBUFFERS_ASSERT(is_alpha(alpha)); + // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). + return ((c & 0xDF) == (alpha & 0xDF)); +} + +// https://en.cppreference.com/w/cpp/string/byte/isxdigit +// isdigit and isxdigit are the only standard narrow character classification +// functions that are not affected by the currently installed C locale. although +// some implementations (e.g. Microsoft in 1252 codepage) may classify +// additional single-byte characters as digits. +inline bool is_digit(char c) +{ + return check_ascii_range(c, '0', '9'); +} + +inline bool is_xdigit(char c) +{ + // Replace by look-up table. + return is_digit(c) || check_ascii_range(c & 0xDF, 'a' & 0xDF, 'f' & 0xDF); +} + +// Case-insensitive isalnum +inline bool is_alnum(char c) +{ + return is_alpha(c) || is_digit(c); +} + +inline char CharToUpper(char c) +{ + return static_cast(::toupper(static_cast(c))); +} + +inline char CharToLower(char c) +{ + return static_cast(::tolower(static_cast(c))); +} + +// @end-locale-independent functions for ASCII character set + +#ifdef FLATBUFFERS_PREFER_PRINTF +template +size_t IntToDigitCount(T t) +{ + size_t digit_count = 0; + // Count the sign for negative numbers + if (t < 0) + digit_count++; + // Count a single 0 left of the dot for fractional numbers + if (-1 < t && t < 1) + digit_count++; + // Count digits until fractional part + T eps = std::numeric_limits::epsilon(); + while (t <= (-1 + eps) || (1 - eps) <= t) { + t /= 10; + digit_count++; + } + return digit_count; +} + +template +size_t NumToStringWidth(T t, int precision = 0) +{ + size_t string_width = IntToDigitCount(t); + // Count the dot for floating point numbers + if (precision) + string_width += (precision + 1); + return string_width; +} + +template +std::string NumToStringImplWrapper(T t, const char *fmt, int precision = 0) +{ + size_t string_width = NumToStringWidth(t, precision); + std::string s(string_width, 0x00); + // Allow snprintf to use std::string trailing null to detect buffer overflow + snprintf(const_cast(s.data()), (s.size() + 1), fmt, string_width, t); + return s; +} +#endif // FLATBUFFERS_PREFER_PRINTF + +// Convert an integer or floating point value to a string. +// In contrast to std::stringstream, "char" values are +// converted to a string of digits, and we don't use scientific notation. +template +std::string NumToString(T t) +{ + // clang-format off + + #ifndef FLATBUFFERS_PREFER_PRINTF + std::stringstream ss; + ss << t; + return ss.str(); + #else // FLATBUFFERS_PREFER_PRINTF + auto v = static_cast(t); + return NumToStringImplWrapper(v, "%.*lld"); + #endif // FLATBUFFERS_PREFER_PRINTF + // clang-format on +} +// Avoid char types used as character data. +template <> +inline std::string NumToString(signed char t) +{ + return NumToString(static_cast(t)); +} +template <> +inline std::string NumToString(unsigned char t) +{ + return NumToString(static_cast(t)); +} +template <> +inline std::string NumToString(char t) +{ + return NumToString(static_cast(t)); +} +#if defined(FLATBUFFERS_CPP98_STL) +template <> +inline std::string NumToString(long long t) +{ + char buf[21]; // (log((1 << 63) - 1) / log(10)) + 2 + snprintf(buf, sizeof(buf), "%lld", t); + return std::string(buf); +} + +template <> +inline std::string NumToString(unsigned long long t) +{ + char buf[22]; // (log((1 << 63) - 1) / log(10)) + 1 + snprintf(buf, sizeof(buf), "%llu", t); + return std::string(buf); +} +#endif // defined(FLATBUFFERS_CPP98_STL) + +// Special versions for floats/doubles. +template +std::string FloatToString(T t, int precision) +{ + // clang-format off + + #ifndef FLATBUFFERS_PREFER_PRINTF + // to_string() prints different numbers of digits for floats depending on + // platform and isn't available on Android, so we use stringstream + std::stringstream ss; + // Use std::fixed to suppress scientific notation. + ss << std::fixed; + // Default precision is 6, we want that to be higher for doubles. + ss << std::setprecision(precision); + ss << t; + auto s = ss.str(); + #else // FLATBUFFERS_PREFER_PRINTF + auto v = static_cast(t); + auto s = NumToStringImplWrapper(v, "%0.*f", precision); + #endif // FLATBUFFERS_PREFER_PRINTF + // clang-format on + // Sadly, std::fixed turns "1" into "1.00000", so here we undo that. + auto p = s.find_last_not_of('0'); + if (p != std::string::npos) { + // Strip trailing zeroes. If it is a whole number, keep one zero. + s.resize(p + (s[p] == '.' ? 2 : 1)); + } + return s; +} + +template <> +inline std::string NumToString(double t) +{ + return FloatToString(t, 12); +} +template <> +inline std::string NumToString(float t) +{ + return FloatToString(t, 6); +} + +// Convert an integer value to a hexadecimal string. +// The returned string length is always xdigits long, prefixed by 0 digits. +// For example, IntToStringHex(0x23, 8) returns the string "00000023". +inline std::string IntToStringHex(int i, int xdigits) +{ + FLATBUFFERS_ASSERT(i >= 0); + // clang-format off + + #ifndef FLATBUFFERS_PREFER_PRINTF + std::stringstream ss; + ss << std::setw(xdigits) << std::setfill('0') << std::hex << std::uppercase + << i; + return ss.str(); + #else // FLATBUFFERS_PREFER_PRINTF + return NumToStringImplWrapper(i, "%.*X", xdigits); + #endif // FLATBUFFERS_PREFER_PRINTF + // clang-format on +} + +// clang-format off +// Use locale independent functions {strtod_l, strtof_l, strtoll_l, strtoull_l}. +#if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && (FLATBUFFERS_LOCALE_INDEPENDENT > 0) + class ClassicLocale { + #ifdef _MSC_VER + typedef _locale_t locale_type; + #else + typedef locale_t locale_type; // POSIX.1-2008 locale_t type + #endif + ClassicLocale(); + ~ClassicLocale(); + locale_type locale_; + static ClassicLocale instance_; + public: + static locale_type Get() { return instance_.locale_; } + }; + + #ifdef _MSC_VER + #define __strtoull_impl(s, pe, b) _strtoui64_l(s, pe, b, ClassicLocale::Get()) + #define __strtoll_impl(s, pe, b) _strtoi64_l(s, pe, b, ClassicLocale::Get()) + #define __strtod_impl(s, pe) _strtod_l(s, pe, ClassicLocale::Get()) + #define __strtof_impl(s, pe) _strtof_l(s, pe, ClassicLocale::Get()) + #else + #define __strtoull_impl(s, pe, b) strtoull_l(s, pe, b, ClassicLocale::Get()) + #define __strtoll_impl(s, pe, b) strtoll_l(s, pe, b, ClassicLocale::Get()) + #define __strtod_impl(s, pe) strtod_l(s, pe, ClassicLocale::Get()) + #define __strtof_impl(s, pe) strtof_l(s, pe, ClassicLocale::Get()) + #endif +#else + #define __strtod_impl(s, pe) strtod(s, pe) + #define __strtof_impl(s, pe) static_cast(strtod(s, pe)) + #ifdef _MSC_VER + #define __strtoull_impl(s, pe, b) _strtoui64(s, pe, b) + #define __strtoll_impl(s, pe, b) _strtoi64(s, pe, b) + #else + #define __strtoull_impl(s, pe, b) strtoull(s, pe, b) + #define __strtoll_impl(s, pe, b) strtoll(s, pe, b) + #endif +#endif + +inline void strtoval_impl(int64_t *val, const char *str, char **endptr, + int base) { + *val = __strtoll_impl(str, endptr, base); +} + +inline void strtoval_impl(uint64_t *val, const char *str, char **endptr, + int base) { + *val = __strtoull_impl(str, endptr, base); +} + +inline void strtoval_impl(double *val, const char *str, char **endptr) { + *val = __strtod_impl(str, endptr); +} + +// UBSAN: double to float is safe if numeric_limits::is_iec559 is true. +__supress_ubsan__("float-cast-overflow") +inline void strtoval_impl(float *val, const char *str, char **endptr) { + *val = __strtof_impl(str, endptr); +} +#undef __strtoull_impl +#undef __strtoll_impl +#undef __strtod_impl +#undef __strtof_impl +// clang-format on + +// Adaptor for strtoull()/strtoll(). +// Flatbuffers accepts numbers with any count of leading zeros (-009 is -9), +// while strtoll with base=0 interprets first leading zero as octal prefix. +// In future, it is possible to add prefixed 0b0101. +// 1) Checks errno code for overflow condition (out of range). +// 2) If base <= 0, function try to detect base of number by prefix. +// +// Return value (like strtoull and strtoll, but reject partial result): +// - If successful, an integer value corresponding to the str is returned. +// - If full string conversion can't be performed, 0 is returned. +// - If the converted value falls out of range of corresponding return type, a +// range error occurs. In this case value MAX(T)/MIN(T) is returned. +template +inline bool StringToIntegerImpl(T *val, const char *const str, + const int base = 0, + const bool check_errno = true) +{ + // T is int64_t or uint64_T + FLATBUFFERS_ASSERT(str); + if (base <= 0) { + auto s = str; + while (*s && !is_digit(*s)) + s++; + if (s[0] == '0' && is_alpha_char(s[1], 'X')) + return StringToIntegerImpl(val, str, 16, check_errno); + // if a prefix not match, try base=10 + return StringToIntegerImpl(val, str, 10, check_errno); + } else { + if (check_errno) + errno = 0; // clear thread-local errno + auto endptr = str; + strtoval_impl(val, str, const_cast(&endptr), base); + if ((*endptr != '\0') || (endptr == str)) { + *val = 0; // erase partial result + return false; // invalid string + } + // errno is out-of-range, return MAX/MIN + if (check_errno && errno) + return false; + return true; + } +} + +template +inline bool StringToFloatImpl(T *val, const char *const str) +{ + // Type T must be either float or double. + FLATBUFFERS_ASSERT(str && val); + auto end = str; + strtoval_impl(val, str, const_cast(&end)); + auto done = (end != str) && (*end == '\0'); + if (!done) + *val = 0; // erase partial result + return done; +} + +// Convert a string to an instance of T. +// Return value (matched with StringToInteger64Impl and strtod): +// - If successful, a numeric value corresponding to the str is returned. +// - If full string conversion can't be performed, 0 is returned. +// - If the converted value falls out of range of corresponding return type, a +// range error occurs. In this case value MAX(T)/MIN(T) is returned. +template +inline bool StringToNumber(const char *s, T *val) +{ + FLATBUFFERS_ASSERT(s && val); + int64_t i64; + // The errno check isn't needed, will return MAX/MIN on overflow. + if (StringToIntegerImpl(&i64, s, 0, false)) { + const int64_t max = (flatbuffers::numeric_limits::max)(); + const int64_t min = flatbuffers::numeric_limits::lowest(); + if (i64 > max) { + *val = static_cast(max); + return false; + } + if (i64 < min) { + // For unsigned types return max to distinguish from + // "no conversion can be performed" when 0 is returned. + *val = static_cast(flatbuffers::is_unsigned::value ? max : min); + return false; + } + *val = static_cast(i64); + return true; + } + *val = 0; + return false; +} + +template <> +inline bool StringToNumber(const char *str, int64_t *val) +{ + return StringToIntegerImpl(val, str); +} + +template <> +inline bool StringToNumber(const char *str, uint64_t *val) +{ + if (!StringToIntegerImpl(val, str)) + return false; + // The strtoull accepts negative numbers: + // If the minus sign was part of the input sequence, the numeric value + // calculated from the sequence of digits is negated as if by unary minus + // in the result type, which applies unsigned integer wraparound rules. + // Fix this behaviour (except -0). + if (*val) { + auto s = str; + while (*s && !is_digit(*s)) + s++; + s = (s > str) ? (s - 1) : s; // step back to one symbol + if (*s == '-') { + // For unsigned types return the max to distinguish from + // "no conversion can be performed". + *val = (flatbuffers::numeric_limits::max)(); + return false; + } + } + return true; +} + +template <> +inline bool StringToNumber(const char *s, float *val) +{ + return StringToFloatImpl(val, s); +} + +template <> +inline bool StringToNumber(const char *s, double *val) +{ + return StringToFloatImpl(val, s); +} + +inline int64_t StringToInt(const char *s, int base = 10) +{ + int64_t val; + return StringToIntegerImpl(&val, s, base) ? val : 0; +} + +inline uint64_t StringToUInt(const char *s, int base = 10) +{ + uint64_t val; + return StringToIntegerImpl(&val, s, base) ? val : 0; +} + +typedef bool (*LoadFileFunction)(const char *filename, bool binary, + std::string *dest); +typedef bool (*FileExistsFunction)(const char *filename); + +LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function); + +FileExistsFunction SetFileExistsFunction( + FileExistsFunction file_exists_function); + +// Check if file "name" exists. +bool FileExists(const char *name); + +// Check if "name" exists and it is also a directory. +bool DirExists(const char *name); + +// Load file "name" into "buf" returning true if successful +// false otherwise. If "binary" is false data is read +// using ifstream's text mode, otherwise data is read with +// no transcoding. +bool LoadFile(const char *name, bool binary, std::string *buf); + +// Save data "buf" of length "len" bytes into a file +// "name" returning true if successful, false otherwise. +// If "binary" is false data is written using ifstream's +// text mode, otherwise data is written with no +// transcoding. +bool SaveFile(const char *name, const char *buf, size_t len, bool binary); + +// Save data "buf" into file "name" returning true if +// successful, false otherwise. If "binary" is false +// data is written using ifstream's text mode, otherwise +// data is written with no transcoding. +inline bool SaveFile(const char *name, const std::string &buf, bool binary) +{ + return SaveFile(name, buf.c_str(), buf.size(), binary); +} + +// Functionality for minimalistic portable path handling. + +// The functions below behave correctly regardless of whether posix ('/') or +// Windows ('/' or '\\') separators are used. + +// Any new separators inserted are always posix. +FLATBUFFERS_CONSTEXPR char kPathSeparator = '/'; + +// Returns the path with the extension, if any, removed. +std::string StripExtension(const std::string &filepath); + +// Returns the extension, if any. +std::string GetExtension(const std::string &filepath); + +// Return the last component of the path, after the last separator. +std::string StripPath(const std::string &filepath); + +// Strip the last component of the path + separator. +std::string StripFileName(const std::string &filepath); + +// Concatenates a path with a filename, regardless of whether the path +// ends in a separator or not. +std::string ConCatPathFileName(const std::string &path, + const std::string &filename); + +// Replaces any '\\' separators with '/' +std::string PosixPath(const char *path); + +// This function ensure a directory exists, by recursively +// creating dirs for any parts of the path that don't exist yet. +void EnsureDirExists(const std::string &filepath); + +// Obtains the absolute path from any other path. +// Returns the input path if the absolute path couldn't be resolved. +std::string AbsolutePath(const std::string &filepath); + +// To and from UTF-8 unicode conversion functions + +// Convert a unicode code point into a UTF-8 representation by appending it +// to a string. Returns the number of bytes generated. +inline int ToUTF8(uint32_t ucc, std::string *out) +{ + FLATBUFFERS_ASSERT(!(ucc & 0x80000000)); // Top bit can't be set. + // 6 possible encodings: http://en.wikipedia.org/wiki/UTF-8 + for (int i = 0; i < 6; i++) { + // Max bits this encoding can represent. + uint32_t max_bits = 6 + i * 5 + static_cast(!i); + if (ucc < (1u << max_bits)) { // does it fit? + // Remaining bits not encoded in the first byte, store 6 bits each + uint32_t remain_bits = i * 6; + // Store first byte: + (*out) += static_cast((0xFE << (max_bits - remain_bits)) | + (ucc >> remain_bits)); + // Store remaining bytes: + for (int j = i - 1; j >= 0; j--) { + (*out) += static_cast(((ucc >> (j * 6)) & 0x3F) | 0x80); + } + return i + 1; // Return the number of bytes added. + } + } + FLATBUFFERS_ASSERT(0); // Impossible to arrive here. + return -1; +} + +// Converts whatever prefix of the incoming string corresponds to a valid +// UTF-8 sequence into a unicode code. The incoming pointer will have been +// advanced past all bytes parsed. +// returns -1 upon corrupt UTF-8 encoding (ignore the incoming pointer in +// this case). +inline int FromUTF8(const char **in) +{ + int len = 0; + // Count leading 1 bits. + for (int mask = 0x80; mask >= 0x04; mask >>= 1) { + if (**in & mask) { + len++; + } else { + break; + } + } + if ((static_cast(**in) << len) & 0x80) + return -1; // Bit after leading 1's must be 0. + if (!len) + return *(*in)++; + // UTF-8 encoded values with a length are between 2 and 4 bytes. + if (len < 2 || len > 4) { + return -1; + } + // Grab initial bits of the code. + int ucc = *(*in)++ & ((1 << (7 - len)) - 1); + for (int i = 0; i < len - 1; i++) { + if ((**in & 0xC0) != 0x80) + return -1; // Upper bits must 1 0. + ucc <<= 6; + ucc |= *(*in)++ & 0x3F; // Grab 6 more bits of the code. + } + // UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for + // UTF-16 surrogate pairs). + if (ucc >= 0xD800 && ucc <= 0xDFFF) { + return -1; + } + // UTF-8 must represent code points in their shortest possible encoding. + switch (len) { + case 2: + // Two bytes of UTF-8 can represent code points from U+0080 to U+07FF. + if (ucc < 0x0080 || ucc > 0x07FF) { + return -1; + } + break; + case 3: + // Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF. + if (ucc < 0x0800 || ucc > 0xFFFF) { + return -1; + } + break; + case 4: + // Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF. + if (ucc < 0x10000 || ucc > 0x10FFFF) { + return -1; + } + break; + } + return ucc; +} + +#ifndef FLATBUFFERS_PREFER_PRINTF +// Wraps a string to a maximum length, inserting new lines where necessary. Any +// existing whitespace will be collapsed down to a single space. A prefix or +// suffix can be provided, which will be inserted before or after a wrapped +// line, respectively. +inline std::string WordWrap(const std::string in, size_t max_length, + const std::string wrapped_line_prefix, + const std::string wrapped_line_suffix) +{ + std::istringstream in_stream(in); + std::string wrapped, line, word; + + in_stream >> word; + line = word; + + while (in_stream >> word) { + if ((line.length() + 1 + word.length() + wrapped_line_suffix.length()) < + max_length) { + line += " " + word; + } else { + wrapped += line + wrapped_line_suffix + "\n"; + line = wrapped_line_prefix + word; + } + } + wrapped += line; + + return wrapped; +} +#endif // !FLATBUFFERS_PREFER_PRINTF + +inline bool EscapeString(const char *s, size_t length, std::string *_text, + bool allow_non_utf8, bool natural_utf8) +{ + std::string &text = *_text; + text += "\""; + for (uoffset_t i = 0; i < length; i++) { + char c = s[i]; + switch (c) { + case '\n': + text += "\\n"; + break; + case '\t': + text += "\\t"; + break; + case '\r': + text += "\\r"; + break; + case '\b': + text += "\\b"; + break; + case '\f': + text += "\\f"; + break; + case '\"': + text += "\\\""; + break; + case '\\': + text += "\\\\"; + break; + default: + if (c >= ' ' && c <= '~') { + text += c; + } else { + // Not printable ASCII data. Let's see if it's valid UTF-8 first: + const char *utf8 = s + i; + int ucc = FromUTF8(&utf8); + if (ucc < 0) { + if (allow_non_utf8) { + text += "\\x"; + text += IntToStringHex(static_cast(c), 2); + } else { + // There are two cases here: + // + // 1) We reached here by parsing an IDL file. In that case, + // we previously checked for non-UTF-8, so we shouldn't reach + // here. + // + // 2) We reached here by someone calling GenerateText() + // on a previously-serialized flatbuffer. The data might have + // non-UTF-8 Strings, or might be corrupt. + // + // In both cases, we have to give up and inform the caller + // they have no JSON. + return false; + } + } else { + if (natural_utf8) { + // utf8 points to past all utf-8 bytes parsed + text.append(s + i, static_cast(utf8 - s - i)); + } else if (ucc <= 0xFFFF) { + // Parses as Unicode within JSON's \uXXXX range, so use that. + text += "\\u"; + text += IntToStringHex(ucc, 4); + } else if (ucc <= 0x10FFFF) { + // Encode Unicode SMP values to a surrogate pair using two \u + // escapes. + uint32_t base = ucc - 0x10000; + auto high_surrogate = (base >> 10) + 0xD800; + auto low_surrogate = (base & 0x03FF) + 0xDC00; + text += "\\u"; + text += IntToStringHex(high_surrogate, 4); + text += "\\u"; + text += IntToStringHex(low_surrogate, 4); + } + // Skip past characters recognized. + i = static_cast(utf8 - s - 1); + } + } + break; + } + } + text += "\""; + return true; +} + +inline std::string BufferToHexText(const void *buffer, size_t buffer_size, + size_t max_length, + const std::string &wrapped_line_prefix, + const std::string &wrapped_line_suffix) +{ + std::string text = wrapped_line_prefix; + size_t start_offset = 0; + const char *s = reinterpret_cast(buffer); + for (size_t i = 0; s && i < buffer_size; i++) { + // Last iteration or do we have more? + bool have_more = i + 1 < buffer_size; + text += "0x"; + text += IntToStringHex(static_cast(s[i]), 2); + if (have_more) { + text += ','; + } + // If we have more to process and we reached max_length + if (have_more && + text.size() + wrapped_line_suffix.size() >= start_offset + max_length) { + text += wrapped_line_suffix; + text += '\n'; + start_offset = text.size(); + text += wrapped_line_prefix; + } + } + text += wrapped_line_suffix; + return text; +} + +// Remove paired quotes in a string: "text"|'text' -> text. +std::string RemoveStringQuotes(const std::string &s); + +// Change th global C-locale to locale with name . +// Returns an actual locale name in <_value>, useful if locale_name is "" or +// null. +bool SetGlobalTestLocale(const char *locale_name, + std::string *_value = nullptr); + +// Read (or test) a value of environment variable. +bool ReadEnvironmentVariable(const char *var_name, + std::string *_value = nullptr); + +// MSVC specific: Send all assert reports to STDOUT to prevent CI hangs. +void SetupDefaultCRTReportMode(); + +} // namespace flatbuffers + +#endif // FLATBUFFERS_UTIL_H_ diff --git a/components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint.h b/components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint.h new file mode 100644 index 00000000..1fa1654a --- /dev/null +++ b/components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint.h @@ -0,0 +1,983 @@ +// Copyright 2015 The Gemmlowp Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// fixedpoint.h: fixed-point arithmetic, with basic operations and +// a few math functions such as tanh. + +#ifndef GEMMLOWP_INTERNAL_FIXEDPOINT_H_ +#define GEMMLOWP_INTERNAL_FIXEDPOINT_H_ + +#include +#include +#include +#include +#include + +#include "../internal/detect_platform.h" + +namespace gemmlowp { +// Part 1: Low-level integer-arithmetic primitives. +// The implementations here are generic implementations valid for +// scalar types (e.g. std::int32_t). Architecture-specific SIMD types +// (e.g. NEON int32x4_t) may be supported by providing +// specializations for them in separate files. +// +// The purpose of these primitives is two-fold: +// - They will be used to implement higher-level fixed-point +// abstractions, namely the FixedPoint class and its arithmetic +// operators. +// - They will be directly used to implement some more involved +// fixed-point computations, e.g. the fixed-point implementation +// of math functions such as tanh. + +// Some compile-time traits around raw types to handle SIMD aspects: +// number of lanes, underlying scalar type. +template +struct FixedPointRawTypeTraits { +}; + +template <> +struct FixedPointRawTypeTraits { + typedef std::int32_t ScalarRawType; + static constexpr int kLanes = 1; +}; + +template <> +struct FixedPointRawTypeTraits { + typedef std::int16_t ScalarRawType; + static constexpr int kLanes = 1; +}; + +// Returns a SIMD value duplicating a scalar value across all lanes. +template +tRawType Dup(typename FixedPointRawTypeTraits::ScalarRawType x) +{ + return x; +} + +// Plain bit-wise AND +template +tIntegerType BitAnd(tIntegerType a, tIntegerType b) +{ + return a & b; +} + +// Plain bit-wise OR +template +tIntegerType BitOr(tIntegerType a, tIntegerType b) +{ + return a | b; +} + +// Plain bit-wise XOR +template +tIntegerType BitXor(tIntegerType a, tIntegerType b) +{ + return a ^ b; +} + +// Plain bit-wise NOT +template +tIntegerType BitNot(tIntegerType a) +{ + return ~a; +} + +// Integer addition. Not saturating. Overflow is undefined behavior. +template +tIntegerType Add(tIntegerType a, tIntegerType b) +{ + return a + b; +} + +// Integer subtraction. Not saturating. Overflow is undefined behavior. +template +tIntegerType Mul(tIntegerType a, tIntegerType b) +{ + return a * b; +} + +template +tIntegerType Sub(tIntegerType a, tIntegerType b) +{ + return a - b; +} + +// Integer unary negative. Not saturating. Overflow is undefined behavior. +template +tIntegerType Neg(tIntegerType a) +{ + return -a; +} + +// Integer arithmetic left-shift, equivalent to multiplying with a power of two. +// Negative values are OK. In case of overflow, no Undefined +// Behavior, but the results are implementation-defined (in practice, +// they currently are saturated, but we make no commitment to that). The idea +// is that the caller will want to implement the overflowing cases with +// saturation with compare-and-mask, so we don't care about the results +// in the overflow case, we just want to avoid undefined behavior. +// +// tIntegerType may be int32 or any narrower signed type. +template +tIntegerType ShiftLeft(tIntegerType a, int offset) +{ + const std::int64_t wide_a = static_cast(a); + const std::int64_t wide_shifted = wide_a * (1 << offset); + const auto min = std::numeric_limits::min(); + const auto max = std::numeric_limits::max(); + return wide_shifted < min ? min : wide_shifted > max ? max : + static_cast(wide_shifted); +} + +// Integer arithmetic right-shift. Not rounding. +// Relying on implementation-defined, but in-practice-consistent, +// C++ compiler behavior. +template +tIntegerType ShiftRight(tIntegerType a, int offset) +{ + return a >> offset; +} + +// Each bit of the result is set to the corresponding bit of either then_val or +// else_val depending on whether the corresponding bit of if_mask is set. +// Equivalent to the VBSL instruction in ARM NEON. +template +tIntegerType SelectUsingMask(tIntegerType if_mask, tIntegerType then_val, + tIntegerType else_val) +{ + return BitXor(BitAnd(if_mask, then_val), BitAnd(BitNot(if_mask), else_val)); +} + +// For each input scalar, the corresponding bits of the result are set if the +// input scalar is non-zero. +template +tIntegerType MaskIfNonZero(tIntegerType a) +{ + static constexpr tIntegerType zero = 0; + return a ? BitNot(zero) : zero; +} + +// For each input scalar, the corresponding bits of the result are set if the +// input scalar is zero. +template +tIntegerType MaskIfZero(tIntegerType a) +{ + return MaskIfNonZero(!a); +} + +// For each pair of input scalars, the corresponding bits of the result are +// set if the input scalars are equal. +template +tIntegerType MaskIfEqual(tIntegerType a, tIntegerType b) +{ + return MaskIfNonZero(a == b); +} + +// For each pair of input scalars, the corresponding bits of the result are +// set if the input scalars are not equal. +template +tIntegerType MaskIfNotEqual(tIntegerType a, tIntegerType b) +{ + return MaskIfNonZero(a != b); +} + +// For each pair of input scalars, the corresponding bits of the result are +// set if the input scalars a, b satisfy a > b. +template +tIntegerType MaskIfGreaterThan(tIntegerType a, tIntegerType b) +{ + return MaskIfNonZero(a > b); +} + +// For each pair of input scalars, the corresponding bits of the result are +// set if the input scalars a, b satisfy a >= b. +template +tIntegerType MaskIfGreaterThanOrEqual(tIntegerType a, tIntegerType b) +{ + return MaskIfNonZero(a >= b); +} + +// For each pair of input scalars, the corresponding bits of the result are +// set if the input scalars a, b satisfy a < b. +template +tIntegerType MaskIfLessThan(tIntegerType a, tIntegerType b) +{ + return MaskIfNonZero(a < b); +} + +// For each pair of input scalars, the corresponding bits of the result are +// set if the input scalars a, b satisfy a <= b. +template +tIntegerType MaskIfLessThanOrEqual(tIntegerType a, tIntegerType b) +{ + return MaskIfNonZero(a <= b); +} + +// Returns true if all of the input scalars are nonzero. +// This function may currently assume that each of the input scalars has either +// all or none of its bits set. Otherwise, its behavior is currently undefined. +template +bool All(tIntegerType a) +{ + return a; +} + +// Returns true if any of the input scalars are nonzero. +// This function may currently assume that each of the input scalars has either +// all or none of its bits set. Otherwise, its behavior is currently undefined. +template +bool Any(tIntegerType a) +{ + return a; +} + +// Returns (a+b)/2, rounded to the nearest integer. +// Equivalent to VRHADD in the ARM NEON instruction set. +template +IntegerType RoundingHalfSum(IntegerType a, IntegerType b) +{ + static_assert(std::is_same::value, "unimplemented"); + (void)b; + return a; +} + +template <> +inline std::int32_t RoundingHalfSum(std::int32_t a, std::int32_t b) +{ + std::int64_t a64 = a; + std::int64_t b64 = b; + std::int64_t sum = a64 + b64; + std::int64_t sign = sum >= 0 ? 1 : -1; + return static_cast((sum + sign) / 2); +} + +template <> +inline std::int16_t RoundingHalfSum(std::int16_t a, std::int16_t b) +{ + std::int32_t a32 = a; + std::int32_t b32 = b; + std::int32_t sum = a32 + b32; + std::int32_t sign = sum >= 0 ? 1 : -1; + return static_cast((sum + sign) / 2); +} + +template +IntegerType SaturatingAdd(IntegerType a, IntegerType b) +{ + static_assert(std::is_same::value, "unimplemented"); + (void)b; + return a; +} + +// So far this is only needed for int16. +template <> +inline std::int16_t SaturatingAdd(std::int16_t a, std::int16_t b) +{ + std::int32_t a32 = a; + std::int32_t b32 = b; + std::int32_t sum = a32 + b32; + return static_cast( + std::min(static_cast(32767), + std::max(static_cast(-32768), sum))); +} + +// Returns a+b, saturating if the integers are 16bit or narrower, +// otherwise just a plain addition. +template +struct AddSaturatingIf16BitImpl { + static IntegerType Run(IntegerType a, IntegerType b) + { + return Add(a, b); + } +}; +template +struct AddSaturatingIf16BitImpl { + static IntegerType Run(IntegerType a, IntegerType b) + { + return SaturatingAdd(a, b); + } +}; +template +IntegerType AddSaturatingIf16Bit(IntegerType a, IntegerType b) +{ + using ScalarType = + typename FixedPointRawTypeTraits::ScalarRawType; + return AddSaturatingIf16BitImpl::Run(a, + b); +} + +// Returns the integer that represents the product of two fixed-point +// numbers, interpreting all integers as fixed-point values in the +// interval [-1, 1), rounding to the nearest value, and saturating +// -1 * -1 to the maximum value (since 1 is not in the half-open +// interval [-1, 1)). +// +// [The explanation below specializes to std::int32_t for example purpose.] +// +// The mapping between IntegerType and the interval [-1, 1) is unique and +// implied by IntegerType, which is assumed to be signed. For example, +// for IntegerType==std::int32_t, the mapping is +// real_value = integer_value / 2^31. +// So in this case, and leaving aside rounding and saturating, this +// function computes ((a / 2^31) * (b / 2^31)) * 2^31, which simplifies to +// (a * b) / 2^31. +// +// The 'doubling' part in the name of this function comes from the fact that +// this operation is very close to a "multiply-high" operation, keeping only +// the top half bits, except that that would be effectively computing +// (a * b) / 2^32, +// so here we are computing 2x that, since +// 1/2^31 = 2 * 1/2^32. +// The idea is to use all of the available 32 bits in the destination int32 +// value. +// +// [End of the explanation specializing to int32.] +// +// This is equivalent to the VQRDMULH instruction in ARM NEON. +template +IntegerType SaturatingRoundingDoublingHighMul(IntegerType a, IntegerType b) +{ + static_assert(std::is_same::value, "unimplemented"); + (void)b; + return a; +} + +// This function implements the same computation as the ARMv7 NEON VQRDMULH +// instruction. +template <> +inline std::int32_t SaturatingRoundingDoublingHighMul(std::int32_t a, + std::int32_t b) +{ + bool overflow = a == b && a == std::numeric_limits::min(); + std::int64_t a_64(a); + std::int64_t b_64(b); + std::int64_t ab_64 = a_64 * b_64; + std::int32_t nudge = ab_64 >= 0 ? (1 << 30) : (1 - (1 << 30)); + std::int32_t ab_x2_high32 = + static_cast((ab_64 + nudge) / (1ll << 31)); + return overflow ? std::numeric_limits::max() : ab_x2_high32; +} + +template <> +inline std::int16_t SaturatingRoundingDoublingHighMul(std::int16_t a, + std::int16_t b) +{ + bool overflow = a == b && a == std::numeric_limits::min(); + std::int32_t a_32(a); + std::int32_t b_32(b); + std::int32_t ab_32 = a_32 * b_32; + std::int16_t nudge = ab_32 >= 0 ? (1 << 14) : (1 - (1 << 14)); + std::int16_t ab_x2_high16 = + static_cast((ab_32 + nudge) / (1 << 15)); + return overflow ? std::numeric_limits::max() : ab_x2_high16; +} + +// Correctly-rounded-to-nearest division by a power-of-two. +// Also known as a rounding arithmetic right shift. +template +inline IntegerType RoundingDivideByPOT(IntegerType x, int exponent) +{ + assert(exponent >= 0); + assert(exponent <= 31); + const IntegerType mask = Dup((1ll << exponent) - 1); + const IntegerType zero = Dup(0); + const IntegerType one = Dup(1); + const IntegerType remainder = BitAnd(x, mask); + const IntegerType threshold = + Add(ShiftRight(mask, 1), BitAnd(MaskIfLessThan(x, zero), one)); + return Add(ShiftRight(x, exponent), + BitAnd(MaskIfGreaterThan(remainder, threshold), one)); +} + +// Returns the product of a run-time integer value by a compile-time power +// of two, with either a positive exponent (equivalent to an arithmetic +// left shift, saturating) or a negative exponent (equivalent to an arithmetic +// right shift, rounding to nearest). +template 0 ? 1 : Exponent < 0 ? -1 : + 0)> +struct ImplSaturatingRoundingMultiplyByPOT { +}; + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static IntegerType eval(IntegerType x) + { + return x; + } +}; + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static IntegerType eval(IntegerType x) + { + using ScalarIntegerType = + typename FixedPointRawTypeTraits::ScalarRawType; + const IntegerType min = + Dup(std::numeric_limits::min()); + const IntegerType max = + Dup(std::numeric_limits::max()); + const int ScalarIntegerTypeBits = 8 * sizeof(ScalarIntegerType); + + const std::int32_t threshold = + ((1 << (ScalarIntegerTypeBits - 1 - Exponent)) - 1); + const IntegerType positive_mask = + MaskIfGreaterThan(x, Dup(threshold)); + const IntegerType negative_mask = + MaskIfLessThan(x, Dup(-threshold)); + + IntegerType result = ShiftLeft(x, Exponent); + result = SelectUsingMask(positive_mask, max, result); + result = SelectUsingMask(negative_mask, min, result); + return result; + } +}; + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static IntegerType eval(IntegerType x) + { + return RoundingDivideByPOT(x, -Exponent); + } +}; + +template +IntegerType SaturatingRoundingMultiplyByPOT(IntegerType x) +{ + return ImplSaturatingRoundingMultiplyByPOT::eval(x); +} + +// Part 2: the FixedPoint class. + +// A FixedPoint object represents a fixed-point value stored in the underlying +// integer type tRawType, if tRawType is a plain scalar integer type. +// Alternatively, tRawType may be a SIMD type (e.g. NEON int32x4_t) in which +// case a FixedPoint object represents a corresponding SIMD vector of fixed +// point values. +// +// tIntegerBits describes the range of the fixed-point format: if +// tIntegerBits == m then the range of representable values is the half-open +// interval [-2^m; 2^m) where the open boundary on the right side means that +// 2^m is not representable (how close the maximum representable value is to +// it, depends on bit-depth of tRawType). +// +// In "Q format notation", +// https://en.wikipedia.org/wiki/Q_(number_format) +// we are describing the format +// Qm.n +// where +// m = tIntegerBits +// and +// n = NumberOfBits(tRawType) - (m + 1) +// Note that the (m + 1) in the above line is because we adopt the convention +// that we count the integer bits exclusively of the sign bit; so (m + 1) is +// the total number of integer bits inclusive of the sign bit. +// +// Accordingly, the number of integral representable values in our range +// [-2^m ; 2^m) +// is equal to 2^(m+1). +template +class FixedPoint { +public: + typedef tRawType RawType; + + typedef FixedPointRawTypeTraits RawTypeTraits; + typedef typename RawTypeTraits::ScalarRawType ScalarRawType; + + static constexpr int kTotalBits = 8 * sizeof(ScalarRawType); + static constexpr int kIntegerBits = tIntegerBits; + static constexpr int kFractionalBits = kTotalBits - 1 - kIntegerBits; + static_assert(kIntegerBits >= 0 && kIntegerBits < kTotalBits, + "bad IntegerBits"); + + typedef FixedPoint ScalarFixedPointType; + + static const ScalarRawType ScalarRawMin() + { + return std::numeric_limits::min(); + } + + static const ScalarRawType ScalarRawMax() + { + return std::numeric_limits::max(); + } + + static const ScalarRawType RawMin() + { + return VectorFromScalar(ScalarRawMin()); + } + + static const ScalarRawType RawMax() + { + return VectorFromScalar(ScalarRawMax()); + } + + static FixedPoint FromRaw(RawType x) + { + FixedPoint retval; + retval.raw() = x; + return retval; + } + + static FixedPoint FromScalarRaw(ScalarRawType x) + { + FixedPoint retval; + retval.raw() = Dup(x); + return retval; + } + + static FixedPoint FromScalarFixedPoint(ScalarFixedPointType x) + { + return FromScalarRaw(x.raw()); + } + + template + static FixedPoint ConstantPOT() + { + static constexpr int kOffset = kFractionalBits + Exponent; + static_assert( + kOffset < 31, + "Constant not exactly representable in this fixed-point format"); + return FromScalarRaw(ScalarRawType(1) << kOffset); + } + + static FixedPoint Zero() + { + return FromScalarRaw(0); + } + + static FixedPoint One() + { + return FromScalarRaw( + kIntegerBits == 0 ? ScalarRawMax() : (ScalarRawType(1) << (kIntegerBits == 0 ? 0 : kFractionalBits))); + } + + static FixedPoint FromDouble(double x) + { + const double min_bound = static_cast(ScalarRawMin()); + const double max_bound = static_cast(ScalarRawMax()); + return FromScalarRaw(static_cast(std::min( + std::max(round(x * static_cast(1ll << kFractionalBits)), + min_bound), + max_bound))); + } + + RawType raw() const + { + return i_; + } + RawType &raw() + { + return i_; + } + +private: + RawType i_; +}; + +// Part 3: implementation of arithmetic operators for the +// FixedPoint class, and a few related functions. + +// A FixedPoint multiplication is just a +// SaturatingRoundingDoublingHighMul operation on the underlying +// raw integer values. The IntegerBits simply add up, as is obvious +// from the fact that the range is [-2^IntegerBits, 2^IntegerBits). +template +FixedPoint operator*( + FixedPoint a, + FixedPoint b) +{ + FixedPoint c; + c.raw() = SaturatingRoundingDoublingHighMul(a.raw(), b.raw()); + return c; +} + +// Tweaking IntegerBits gives exact multiplication by a power of two. +template +FixedPoint ExactMulByPot( + FixedPoint a) +{ + FixedPoint c; + c.raw() = a.raw(); + return c; +} + +// If we want to leave IntegerBits fixed, then multiplication +// by a power of two has to be saturating/rounding, not exact anymore. +template +FixedPoint SaturatingRoundingMultiplyByPOT( + FixedPoint a) +{ + return FixedPoint::FromRaw( + SaturatingRoundingMultiplyByPOT(a.raw())); +} + +// Generic arithmetic operators. + +#define MAKE_FIXEDPOINT_UNARY_FUNC(FuncName, ImplFuncName) \ + template \ + FixedPoint FuncName( \ + FixedPoint a) \ + { \ + return FixedPoint::FromRaw(ImplFuncName(a.raw())); \ + } + +#define MAKE_FIXEDPOINT_BINARY_FUNC(FuncName, ImplFuncName) \ + template \ + FixedPoint FuncName( \ + FixedPoint a, \ + FixedPoint b) \ + { \ + return FixedPoint::FromRaw( \ + ImplFuncName(a.raw(), b.raw())); \ + } + +MAKE_FIXEDPOINT_UNARY_FUNC(operator-, Neg) +MAKE_FIXEDPOINT_UNARY_FUNC(operator~, BitNot) +MAKE_FIXEDPOINT_BINARY_FUNC(operator+, Add) +MAKE_FIXEDPOINT_BINARY_FUNC(operator-, Sub) +MAKE_FIXEDPOINT_BINARY_FUNC(operator&, BitAnd) +MAKE_FIXEDPOINT_BINARY_FUNC(operator^, BitXor) +MAKE_FIXEDPOINT_BINARY_FUNC(operator|, BitOr) +MAKE_FIXEDPOINT_BINARY_FUNC(RoundingHalfSum, RoundingHalfSum) + +#undef MAKE_FIXEDPOINT_UNARY_FUNC +#undef MAKE_FIXEDPOINT_BINARY_FUNC + +#define MAKE_FIXEDPOINT_UNARY_FUNC_RETURNING_RAW(FuncName) \ + template \ + tRawType FuncName(FixedPoint a) \ + { \ + return FuncName(a.raw()); \ + } + +#define MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(FuncName) \ + template \ + tRawType FuncName(FixedPoint a, \ + FixedPoint b) \ + { \ + return FuncName(a.raw(), b.raw()); \ + } + +MAKE_FIXEDPOINT_UNARY_FUNC_RETURNING_RAW(MaskIfZero) +MAKE_FIXEDPOINT_UNARY_FUNC_RETURNING_RAW(MaskIfNonZero) +MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(MaskIfEqual) +MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(MaskIfNotEqual) +MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(MaskIfGreaterThan) +MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(MaskIfGreaterThanOrEqual) +MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(MaskIfLessThan) +MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW(MaskIfLessThanOrEqual) + +#undef MAKE_FIXEDPOINT_UNARY_FUNC_RETURNING_RAW +#undef MAKE_FIXEDPOINT_BINARY_FUNC_RETURNING_RAW + +template +FixedPoint SelectUsingMask( + tRawType if_mask, FixedPoint then_val, + FixedPoint else_val) +{ + return FixedPoint::FromRaw( + SelectUsingMask(if_mask, then_val.raw(), else_val.raw())); +} + +template +bool operator==(FixedPoint a, + FixedPoint b) +{ + return All(MaskIfEqual(a.raw(), b.raw())); +} + +template +bool operator!=(FixedPoint a, + FixedPoint b) +{ + return !(a == b); +} + +template +FixedPoint SaturatingAdd( + FixedPoint a, + FixedPoint b) +{ + return FixedPoint::FromRaw( + SaturatingAdd(a.raw(), b.raw())); +} + +template +FixedPoint AddSaturatingIf16Bit( + FixedPoint a, + FixedPoint b) +{ + return FixedPoint::FromRaw( + AddSaturatingIf16Bit(a.raw(), b.raw())); +} + +// Conversion to floating-point. +template +double ToDouble(FixedPoint x) +{ + static_assert(FixedPointRawTypeTraits::kLanes == 1, + "not applicable to SIMD types"); + typedef FixedPoint F; + return x.raw() / static_cast(1ll << F::kFractionalBits); +} + +// Rescale changes the number of IntegerBits and updates the underlying +// raw integer value accordingly. +template +FixedPoint Rescale( + FixedPoint x) +{ + static constexpr int kExponent = tIntegerBitsSrc - tIntegerBitsDst; + FixedPoint result; + result.raw() = SaturatingRoundingMultiplyByPOT(x.raw()); + return result; +} + +// CheckedFixedPointConstant allows to specify fixed-point constants +// initialized as real numbers, in a way that does not compile floating-point +// arithmetic in production code, yet still checks agreement with the +// floating-point expressions when asserts are enabled. +// +// The raw integer value provided is always a int32, encoding a 32-bit +// fixed-point value, regardless of the actual Scalar type. This allows +// writing generic code that applies just as well to the 32-bit and 16-bit +// cases. In the 16-bit case, the raw integer value is internally +// rounding-shifted by 16 bits to the right. +template +inline typename FixedPointType::ScalarRawType RescaleConstantInitializer( + std::int32_t int32_value) +{ + typedef typename FixedPointType::ScalarRawType ScalarRawType; + static constexpr int ScalarTypeBits = 8 * sizeof(ScalarRawType); + return static_cast( + RoundingDivideByPOT(int32_value, 32 - ScalarTypeBits)); +} +#ifdef GEMMLOWP_ENABLE_FIXEDPOINT_CONSTANTS_CHECKS +template +FixedPointType CheckedFixedPointConstant(std::int32_t raw_value, + double double_value) +{ + const FixedPointType result = FixedPointType::FromScalarRaw(raw_value); + assert(result == FixedPointType::FromDouble(double_value)); + return result; +} +#define GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(FixedPointType, \ + ScalarRawInt32Value, DoubleValue) \ + (gemmlowp::CheckedFixedPointConstant( \ + gemmlowp::RescaleConstantInitializer( \ + ScalarRawInt32Value), \ + DoubleValue)) + +#else +#define GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(FixedPointType, \ + ScalarRawInt32Value, DoubleValue) \ + (FixedPointType::FromScalarRaw( \ + gemmlowp::RescaleConstantInitializer( \ + ScalarRawInt32Value))) +#endif + +// Implementation of exponential function. + +// Returns exp(x) for x in [-1/4, 0). +template +FixedPoint exp_on_interval_between_negative_one_quarter_and_0_excl( + FixedPoint a) +{ + typedef FixedPoint F; + const F constant_term = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F, 1895147668, std::exp(-1.0 / 8.0)); + const F constant_1_over_3 = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F, 715827883, 1.0 / 3.0); + // We're evaluating a Taylor expansion around -1/8, so we do the change of + // variable: x = a + 1/8. + // In fixed-point with 0 integer bits, 1/8 is represented by 1 << 28. + F x = a + F::template ConstantPOT<-3>(); + F x2 = x * x; + F x3 = x2 * x; + F x4 = x2 * x2; + F x4_over_4 = SaturatingRoundingMultiplyByPOT<-2>(x4); + F x4_over_24_plus_x3_over_6_plus_x2_over_2 = + SaturatingRoundingMultiplyByPOT<-1>( + ((x4_over_4 + x3) * constant_1_over_3) + x2); + return AddSaturatingIf16Bit( + constant_term, + constant_term * (x + x4_over_24_plus_x3_over_6_plus_x2_over_2)); +} + +// Returns exp(x) for x < 0. +template +FixedPoint exp_on_negative_values( + FixedPoint a) +{ + typedef FixedPoint InputF; + typedef FixedPoint ResultF; + static constexpr int kFractionalBits = InputF::kFractionalBits; + static constexpr int kIntegerBits = InputF::kIntegerBits; + const InputF kOneQuarter = InputF::template ConstantPOT<-2>(); + InputF mask = kOneQuarter - InputF::FromScalarRaw(1); + InputF a_mod_quarter_minus_one_quarter = (a & mask) - kOneQuarter; + ResultF result = exp_on_interval_between_negative_one_quarter_and_0_excl( + Rescale<0>(a_mod_quarter_minus_one_quarter)); + tRawType remainder = (a_mod_quarter_minus_one_quarter - a).raw(); + +#define GEMMLOWP_EXP_BARREL_SHIFTER(Exponent, FixedPointMultiplier) \ + if (kIntegerBits > Exponent) { \ + const ResultF kMultiplier = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( \ + ResultF, FixedPointMultiplier, std::exp(-std::pow(2.0, Exponent))); \ + static constexpr int kShiftAmount = \ + kIntegerBits > Exponent ? kFractionalBits + Exponent : 0; \ + result = SelectUsingMask( \ + MaskIfNonZero(BitAnd(remainder, Dup(1 << kShiftAmount))), \ + result * kMultiplier, result); \ + } + + GEMMLOWP_EXP_BARREL_SHIFTER(-2, 1672461947); + GEMMLOWP_EXP_BARREL_SHIFTER(-1, 1302514674); + GEMMLOWP_EXP_BARREL_SHIFTER(+0, 790015084); + GEMMLOWP_EXP_BARREL_SHIFTER(+1, 290630308); + GEMMLOWP_EXP_BARREL_SHIFTER(+2, 39332535); + GEMMLOWP_EXP_BARREL_SHIFTER(+3, 720401); + GEMMLOWP_EXP_BARREL_SHIFTER(+4, 242); + +#undef GEMMLOWP_EXP_BARREL_SHIFTER + + static constexpr int clampB = kIntegerBits > 5 ? 36 - kIntegerBits : 0; + if (kIntegerBits > 5) { + const InputF clamp = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(InputF, -(1 << clampB), -32.0); + result = SelectUsingMask(MaskIfLessThan(a, clamp), ResultF::Zero(), result); + } + + result = SelectUsingMask(MaskIfZero(a), ResultF::One(), result); + return result; +} + +// Implementation of tanh: (1 - exp(-2x)) / (1 + exp(-2x)). + +// Returns (1 - x) / (1 + x) for x in (0, 1). +template +FixedPoint one_minus_x_over_one_plus_x_for_x_in_0_1( + FixedPoint a) +{ + typedef FixedPoint F0; + typedef FixedPoint F2; + F0 half_denominator = RoundingHalfSum(a, F0::One()); + // Newton-Raphson division + // https://en.wikipedia.org/wiki/Division_algorithm#Newton.E2.80.93Raphson_division + // Refer to that page for the logic behind the 48/17 and 32/17 constants. + const F2 constant_48_over_17 = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F2, 1515870810, 48.0 / 17.0); + const F2 constant_neg_32_over_17 = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F2, -1010580540, -32.0 / 17.0); + F2 x = constant_48_over_17 + half_denominator * constant_neg_32_over_17; + for (int i = 0; i < 3; i++) { + F2 half_denominator_times_x = half_denominator * x; + F2 one_minus_half_denominator_times_x = + F2::One() - half_denominator_times_x; + x = x + Rescale<2>(x * one_minus_half_denominator_times_x); + } + return Rescale<0>(x - F2::One()); +} + +// Returns -tanh(x) for x < 0. +template +FixedPoint neg_tanh_on_negative_values( + FixedPoint a) +{ + return one_minus_x_over_one_plus_x_for_x_in_0_1( + exp_on_negative_values(ExactMulByPot<1>(a))); +} + +// Returns tanh(x) for any x. +template +FixedPoint tanh(FixedPoint a) +{ + typedef FixedPoint InputF; + typedef FixedPoint ResultF; + tRawType mask_if_negative = MaskIfLessThan(a, InputF::Zero()); + tRawType mask_if_zero = MaskIfZero(a); + InputF n = SelectUsingMask(mask_if_negative, a, -a); + ResultF t = neg_tanh_on_negative_values(n); + return SelectUsingMask(mask_if_zero, ResultF::Zero(), + SelectUsingMask(mask_if_negative, -t, t)); +} + +// Implementation of logistic function. + +// Returns 1 / (1 + x) for x in (0, 1). +template +FixedPoint one_over_one_plus_x_for_x_in_0_1( + FixedPoint a) +{ + typedef FixedPoint F0; + typedef FixedPoint F2; + F0 half_denominator = RoundingHalfSum(a, F0::One()); + // Newton-Raphson division + // https://en.wikipedia.org/wiki/Division_algorithm#Newton.E2.80.93Raphson_division + // Refer to that page for the logic behind the 48/17 and 32/17 constants. + const F2 constant_48_over_17 = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F2, 1515870810, 48.0 / 17.0); + const F2 constant_neg_32_over_17 = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F2, -1010580540, -32.0 / 17.0); + F2 x = constant_48_over_17 + half_denominator * constant_neg_32_over_17; + for (int i = 0; i < 3; i++) { + F2 half_denominator_times_x = half_denominator * x; + F2 one_minus_half_denominator_times_x = + F2::One() - half_denominator_times_x; + x = x + Rescale<2>(x * one_minus_half_denominator_times_x); + } + return Rescale<0>(ExactMulByPot<-1>(x)); +} + +// Returns logistic(x) = 1 / (1 + exp(-x)) for x > 0. +template +FixedPoint logistic_on_positive_values( + FixedPoint a) +{ + return one_over_one_plus_x_for_x_in_0_1(exp_on_negative_values(-a)); +} + +// Returns logistic(x) = 1 / (1 + exp(-x)) for any x. +template +FixedPoint logistic(FixedPoint a) +{ + typedef FixedPoint InputF; + typedef FixedPoint ResultF; + tRawType mask_if_positive = MaskIfGreaterThan(a, InputF::Zero()); + tRawType mask_if_zero = MaskIfZero(a); + InputF abs_input = SelectUsingMask(mask_if_positive, a, -a); + ResultF result_if_positive = logistic_on_positive_values(abs_input); + ResultF result_if_negative = ResultF::One() - result_if_positive; + const ResultF one_half = + GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(ResultF, 1 << 30, 0.5); + return SelectUsingMask(mask_if_zero, one_half, + SelectUsingMask(mask_if_positive, result_if_positive, + result_if_negative)); +} + +} // end namespace gemmlowp + +#ifdef GEMMLOWP_NEON +#include "./fixedpoint_neon.h" +#elif defined(GEMMLOWP_AVX2) +#include "./fixedpoint_avx.h" +#elif defined(GEMMLOWP_SSE4) +#include "./fixedpoint_sse.h" +#elif defined(GEMMLOWP_MSA) +#include "./fixedpoint_msa.h" +#endif + +#endif // GEMMLOWP_INTERNAL_FIXEDPOINT_H_ diff --git a/components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint_neon.h b/components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint_neon.h new file mode 100644 index 00000000..7ec6399e --- /dev/null +++ b/components/TensorFlowLite/third_party/gemmlowp/fixedpoint/fixedpoint_neon.h @@ -0,0 +1,387 @@ +// Copyright 2015 The Gemmlowp Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// fixedpoint_neon.h: optimized NEON specializations of the templates +// in fixedpoint.h. + +#ifndef GEMMLOWP_INTERNAL_FIXEDPOINT_NEON_H_ +#define GEMMLOWP_INTERNAL_FIXEDPOINT_NEON_H_ + +#include + +namespace gemmlowp { +template <> +struct FixedPointRawTypeTraits { + typedef std::int32_t ScalarRawType; + static constexpr int kLanes = 4; +}; + +template <> +struct FixedPointRawTypeTraits { + typedef std::int16_t ScalarRawType; + static constexpr int kLanes = 8; +}; + +template <> +inline int32x4_t BitAnd(int32x4_t a, int32x4_t b) +{ + return vandq_s32(a, b); +} + +template <> +inline int16x8_t BitAnd(int16x8_t a, int16x8_t b) +{ + return vandq_s16(a, b); +} + +template <> +inline int32x4_t BitOr(int32x4_t a, int32x4_t b) +{ + return vorrq_s32(a, b); +} + +template <> +inline int16x8_t BitOr(int16x8_t a, int16x8_t b) +{ + return vorrq_s16(a, b); +} + +template <> +inline int32x4_t BitXor(int32x4_t a, int32x4_t b) +{ + return veorq_s32(a, b); +} + +template <> +inline int16x8_t BitXor(int16x8_t a, int16x8_t b) +{ + return veorq_s16(a, b); +} + +template <> +inline int32x4_t BitNot(int32x4_t a) +{ + return veorq_s32(a, vdupq_n_s32(-1)); +} + +template <> +inline int16x8_t BitNot(int16x8_t a) +{ + return veorq_s16(a, vdupq_n_s16(-1)); +} + +template <> +inline int32x4_t Add(int32x4_t a, int32x4_t b) +{ + return vaddq_s32(a, b); +} + +template <> +inline int16x8_t Add(int16x8_t a, int16x8_t b) +{ + return vaddq_s16(a, b); +} + +template <> +inline int32x4_t Sub(int32x4_t a, int32x4_t b) +{ + return vsubq_s32(a, b); +} + +template <> +inline int16x8_t Sub(int16x8_t a, int16x8_t b) +{ + return vsubq_s16(a, b); +} + +template <> +inline int32x4_t Neg(int32x4_t a) +{ + return vnegq_s32(a); +} + +template <> +inline int16x8_t Neg(int16x8_t a) +{ + return vnegq_s16(a); +} + +template <> +inline int32x4_t ShiftLeft(int32x4_t a, int offset) +{ + return vshlq_s32(a, vdupq_n_s32(offset)); +} + +template <> +inline int16x8_t ShiftLeft(int16x8_t a, int offset) +{ + return vshlq_s16(a, vdupq_n_s16(offset)); +} + +template <> +inline int32x4_t ShiftRight(int32x4_t a, int offset) +{ + return vshlq_s32(a, vdupq_n_s32(-offset)); +} + +template <> +inline int16x8_t ShiftRight(int16x8_t a, int offset) +{ + return vshlq_s16(a, vdupq_n_s16(-offset)); +} + +template <> +inline int32x4_t SelectUsingMask(int32x4_t if_mask, int32x4_t then_val, + int32x4_t else_val) +{ + return vbslq_s32(vreinterpretq_u32_s32(if_mask), then_val, else_val); +} + +template <> +inline int16x8_t SelectUsingMask(int16x8_t if_mask, int16x8_t then_val, + int16x8_t else_val) +{ + return vbslq_s16(vreinterpretq_u16_s16(if_mask), then_val, else_val); +} + +template <> +inline int32x4_t MaskIfEqual(int32x4_t a, int32x4_t b) +{ + return vreinterpretq_s32_u32(vceqq_s32(a, b)); +} + +template <> +inline int16x8_t MaskIfEqual(int16x8_t a, int16x8_t b) +{ + return vreinterpretq_s16_u16(vceqq_s16(a, b)); +} + +template <> +inline int32x4_t MaskIfNotEqual(int32x4_t a, int32x4_t b) +{ + return BitNot(MaskIfEqual(a, b)); +} + +template <> +inline int16x8_t MaskIfNotEqual(int16x8_t a, int16x8_t b) +{ + return BitNot(MaskIfEqual(a, b)); +} + +template <> +inline int32x4_t MaskIfZero(int32x4_t a) +{ + return MaskIfEqual(a, vdupq_n_s32(0)); +} + +template <> +inline int16x8_t MaskIfZero(int16x8_t a) +{ + return MaskIfEqual(a, vdupq_n_s16(0)); +} + +template <> +inline int32x4_t MaskIfNonZero(int32x4_t a) +{ + return vreinterpretq_s32_u32(vtstq_s32(a, a)); +} + +template <> +inline int16x8_t MaskIfNonZero(int16x8_t a) +{ + return vreinterpretq_s16_u16(vtstq_s16(a, a)); +} + +template <> +inline int32x4_t MaskIfGreaterThan(int32x4_t a, int32x4_t b) +{ + return vreinterpretq_s32_u32(vcgtq_s32(a, b)); +} + +template <> +inline int16x8_t MaskIfGreaterThan(int16x8_t a, int16x8_t b) +{ + return vreinterpretq_s16_u16(vcgtq_s16(a, b)); +} + +template <> +inline int32x4_t MaskIfGreaterThanOrEqual(int32x4_t a, int32x4_t b) +{ + return vreinterpretq_s32_u32(vcgeq_s32(a, b)); +} + +template <> +inline int16x8_t MaskIfGreaterThanOrEqual(int16x8_t a, int16x8_t b) +{ + return vreinterpretq_s16_u16(vcgeq_s16(a, b)); +} + +template <> +inline int32x4_t MaskIfLessThan(int32x4_t a, int32x4_t b) +{ + return vreinterpretq_s32_u32(vcltq_s32(a, b)); +} + +template <> +inline int16x8_t MaskIfLessThan(int16x8_t a, int16x8_t b) +{ + return vreinterpretq_s16_u16(vcltq_s16(a, b)); +} + +template <> +inline int32x4_t MaskIfLessThanOrEqual(int32x4_t a, int32x4_t b) +{ + return vreinterpretq_s32_u32(vcleq_s32(a, b)); +} + +template <> +inline int16x8_t MaskIfLessThanOrEqual(int16x8_t a, int16x8_t b) +{ + return vreinterpretq_s16_u16(vcleq_s16(a, b)); +} + +template <> +inline bool All(int32x4_t a) +{ + a = vandq_s32(a, vextq_s32(a, a, 1)); + a = vandq_s32(a, vextq_s32(a, a, 2)); + return vgetq_lane_s32(a, 0); +} + +template <> +inline bool All(int16x8_t a) +{ + a = vandq_s16(a, vextq_s16(a, a, 1)); + a = vandq_s16(a, vextq_s16(a, a, 2)); + a = vandq_s16(a, vextq_s16(a, a, 4)); + return vgetq_lane_s16(a, 0); +} + +template <> +inline bool Any(int32x4_t a) +{ + a = vorrq_s32(a, vextq_s32(a, a, 1)); + a = vorrq_s32(a, vextq_s32(a, a, 2)); + return vgetq_lane_s32(a, 0); +} + +template <> +inline bool Any(int16x8_t a) +{ + a = vorrq_s16(a, vextq_s16(a, a, 1)); + a = vorrq_s16(a, vextq_s16(a, a, 2)); + a = vorrq_s16(a, vextq_s16(a, a, 4)); + return vgetq_lane_s16(a, 0); +} + +template <> +inline int32x4_t RoundingHalfSum(int32x4_t a, int32x4_t b) +{ + return vrhaddq_s32(a, b); +} + +template <> +inline int16x8_t RoundingHalfSum(int16x8_t a, int16x8_t b) +{ + return vrhaddq_s16(a, b); +} + +template <> +inline int32x4_t SaturatingRoundingDoublingHighMul(int32x4_t a, int32x4_t b) +{ + return vqrdmulhq_s32(a, b); +} + +template <> +inline int16x8_t SaturatingRoundingDoublingHighMul(int16x8_t a, int16x8_t b) +{ + return vqrdmulhq_s16(a, b); +} + +template <> +inline int32x4_t RoundingDivideByPOT(int32x4_t x, int exponent) +{ + const int32x4_t shift_vec = vdupq_n_s32(-exponent); + const int32x4_t fixup = vshrq_n_s32(vandq_s32(x, shift_vec), 31); + const int32x4_t fixed_up_x = vqaddq_s32(x, fixup); + return vrshlq_s32(fixed_up_x, shift_vec); +} + +template <> +inline int16x8_t RoundingDivideByPOT(int16x8_t x, int exponent) +{ + const int16x8_t shift_vec = vdupq_n_s16(-exponent); + const int16x8_t fixup = vshrq_n_s16(vandq_s16(x, shift_vec), 15); + const int16x8_t fixed_up_x = vqaddq_s16(x, fixup); + return vrshlq_s16(fixed_up_x, shift_vec); +} + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static int32x4_t eval(int32x4_t x) + { + return vqshlq_n_s32(x, Exponent); + } +}; + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static int32x4_t eval(int32x4_t x) + { + const int32x4_t fixup = vshrq_n_s32(x, 31); + const int32x4_t fixed_up_x = vqaddq_s32(x, fixup); + return vrshrq_n_s32(fixed_up_x, -Exponent); + } +}; + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static int16x8_t eval(int16x8_t x) + { + return vqshlq_n_s16(x, Exponent); + } +}; + +template +struct ImplSaturatingRoundingMultiplyByPOT { + static int16x8_t eval(int16x8_t x) + { + const int16x8_t fixup = vshrq_n_s16(x, 15); + const int16x8_t fixed_up_x = vqaddq_s16(x, fixup); + return vrshrq_n_s16(fixed_up_x, -Exponent); + } +}; + +template <> +inline int32x4_t Dup(std::int32_t x) +{ + return vdupq_n_s32(x); +} + +template <> +inline int16x8_t Dup(std::int16_t x) +{ + return vdupq_n_s16(x); +} + +// So far this is only needed for int16. +template <> +inline int16x8_t SaturatingAdd(int16x8_t a, int16x8_t b) +{ + return vqaddq_s16(a, b); +} + +} // end namespace gemmlowp + +#endif // GEMMLOWP_INTERNAL_FIXEDPOINT_NEON_H_ diff --git a/components/TensorFlowLite/third_party/gemmlowp/internal/detect_platform.h b/components/TensorFlowLite/third_party/gemmlowp/internal/detect_platform.h new file mode 100644 index 00000000..391f27f8 --- /dev/null +++ b/components/TensorFlowLite/third_party/gemmlowp/internal/detect_platform.h @@ -0,0 +1,166 @@ +// Copyright 2018 The Gemmlowp Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// detect_platform.h: Sets up macros that control architecture-specific +// features of gemmlowp's implementation. + +#ifndef GEMMLOWP_INTERNAL_DETECT_PLATFORM_H_ +#define GEMMLOWP_INTERNAL_DETECT_PLATFORM_H_ + +// Our inline assembly path assume GCC/Clang syntax. +// Native Client doesn't seem to support inline assembly(?). +#if defined(__GNUC__) && !defined(__native_client__) +#define GEMMLOWP_ALLOW_INLINE_ASM +#endif + +// Define macro statement that avoids inlining for GCC. +// For non-GCC, define as empty macro. +#if defined(__GNUC__) +#define GEMMLOWP_NOINLINE __attribute__((noinline)) +#else +#define GEMMLOWP_NOINLINE +#endif + +// Detect ARM, 32-bit or 64-bit +#ifdef __arm__ +#define GEMMLOWP_ARM_32 +#endif + +#ifdef __aarch64__ +#define GEMMLOWP_ARM_64 +#endif + +#if defined(GEMMLOWP_ARM_32) || defined(GEMMLOWP_ARM_64) +#define GEMMLOWP_ARM +#endif + +// Detect MIPS, 32-bit or 64-bit +#if defined(__mips) && !defined(__LP64__) +#define GEMMLOWP_MIPS_32 +#endif + +#if defined(__mips) && defined(__LP64__) +#define GEMMLOWP_MIPS_64 +#endif + +#if defined(GEMMLOWP_MIPS_32) || defined(GEMMLOWP_MIPS_64) +#define GEMMLOWP_MIPS +#endif + +// Detect x86, 32-bit or 64-bit +#if defined(__i386__) || defined(_M_IX86) || defined(_X86_) || defined(__i386) +#define GEMMLOWP_X86_32 +#endif + +#if defined(__x86_64__) || defined(_M_X64) || defined(__amd64) +#define GEMMLOWP_X86_64 +#endif + +#if defined(GEMMLOWP_X86_32) || defined(GEMMLOWP_X86_64) +#define GEMMLOWP_X86 +#endif + +// Some of our optimized paths use inline assembly and for +// now we don't bother enabling some other optimized paths using intrinddics +// where we can't use inline assembly paths. +#ifdef GEMMLOWP_ALLOW_INLINE_ASM + +// Detect NEON. It's important to check for both tokens. +#if (defined __ARM_NEON) || (defined __ARM_NEON__) +#define GEMMLOWP_NEON +#endif + +// Convenience NEON tokens for 32-bit or 64-bit +#if defined(GEMMLOWP_NEON) && defined(GEMMLOWP_ARM_32) +#define GEMMLOWP_NEON_32 +#endif + +#if defined(GEMMLOWP_NEON) && defined(GEMMLOWP_ARM_64) +#define GEMMLOWP_NEON_64 +#endif + +// Detect MIPS MSA. +// Limit MSA optimizations to little-endian CPUs for now. +// TODO: Perhaps, eventually support MSA optimizations on big-endian CPUs? +#if defined(GEMMLOWP_MIPS) && (__mips_isa_rev >= 5) && defined(__mips_msa) && \ + defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define GEMMLOWP_MSA +#endif + +// Convenience MIPS MSA tokens for 32-bit or 64-bit. +#if defined(GEMMLOWP_MSA) && defined(GEMMLOWP_MIPS_32) +#define GEMMLOWP_MSA_32 +#endif + +#if defined(GEMMLOWP_MSA) && defined(GEMMLOWP_MIPS_64) +#define GEMMLOWP_MSA_64 +#endif + +// compiler define for AVX2 -D GEMMLOWP_ENABLE_AVX2 +// Detect AVX2 +#if defined(__AVX2__) && defined(GEMMLOWP_ENABLE_AVX2) +#define GEMMLOWP_AVX2 +// Detect SSE4. +// MSVC does not have __SSE4_1__ macro, but will enable SSE4 +// when AVX is turned on. +#elif defined(__SSE4_1__) || (defined(_MSC_VER) && defined(__AVX__)) +#define GEMMLOWP_SSE4 +// Detect SSE3. +#elif defined(__SSE3__) +#define GEMMLOWP_SSE3 +#endif + +// Convenience SSE4 tokens for 32-bit or 64-bit +#if defined(GEMMLOWP_SSE4) && defined(GEMMLOWP_X86_32) && \ + !defined(GEMMLOWP_DISABLE_SSE4) +#define GEMMLOWP_SSE4_32 +#endif + +#if defined(GEMMLOWP_SSE3) && defined(GEMMLOWP_X86_32) +#define GEMMLOWP_SSE3_32 +#endif + +#if defined(GEMMLOWP_SSE4) && defined(GEMMLOWP_X86_64) && \ + !defined(GEMMLOWP_DISABLE_SSE4) +#define GEMMLOWP_SSE4_64 +#endif + +#if defined(GEMMLOWP_SSE3) && defined(GEMMLOWP_X86_64) +#define GEMMLOWP_SSE3_64 +#endif + +#if defined(GEMMLOWP_AVX2) && defined(GEMMLOWP_X86_64) +#define GEMMLOWP_AVX2_64 +#endif + +#if defined(__has_feature) +#if __has_feature(memory_sanitizer) +#include +#define GEMMLOWP_MARK_MEMORY_AS_INITIALIZED __msan_unpoison +#elif __has_feature(address_sanitizer) +#include +#define GEMMLOWP_MARK_MEMORY_AS_INITIALIZED __asan_unpoison_memory_region +#endif +#endif + +#endif // GEMMLOWP_ALLOW_INLINE_ASM + +// Detect Android. Don't conflate with ARM - we care about tuning +// for non-ARM Android devices too. This can be used in conjunction +// with x86 to tune differently for mobile x86 CPUs (Atom) vs. desktop x86 CPUs. +#if defined(__ANDROID__) || defined(ANDROID) +#define GEMMLOWP_ANDROID +#endif + +#endif // GEMMLOWP_INTERNAL_DETECT_PLATFORM_H_ diff --git a/components/TensorFlowLite/third_party/hexagon/LICENSE b/components/TensorFlowLite/third_party/hexagon/LICENSE new file mode 100644 index 00000000..0353ff4c --- /dev/null +++ b/components/TensorFlowLite/third_party/hexagon/LICENSE @@ -0,0 +1,231 @@ +/* Copyright 2020 The Qualcomm Innovation Center, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted (subject to the limitations in the disclaimer +below) provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Qualcomm Innovation Center, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY +THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==============================================================================*/ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/components/TensorFlowLite/third_party/hexagon/fully_connected.cc b/components/TensorFlowLite/third_party/hexagon/fully_connected.cc new file mode 100644 index 00000000..75adbd9e --- /dev/null +++ b/components/TensorFlowLite/third_party/hexagon/fully_connected.cc @@ -0,0 +1,318 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +/* Copyright 2020 The Qualcomm Innovation Center, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted (subject to the limitations in the disclaimer +below) provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Qualcomm Innovation Center, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY +THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/fully_connected.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/fully_connected.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "third_party/hexagon/hexagon_tflm_translation_fully_connected.h" + +namespace tflite { +namespace { + +// Input tensors. +constexpr int kInputTensor = 0; +constexpr int kWeightsTensor = 1; +constexpr int kBiasTensor = 2; +// Output tensor. +constexpr int kOutputTensor = 0; + +struct OpData { + // The scaling factor from input to output (aka the 'real multiplier') can + // be represented as a fixed point multiplier plus a left shift. + int32_t output_multiplier; + int output_shift; + // The range of the fused activation layer. For example for kNone and + // uint8_t these would be 0 and 255. + int32_t output_activation_min; + int32_t output_activation_max; + // The index of the temporary tensor where the quantized inputs are cached. + int input_quantized_index; + // Cached zero point values of tensors. + int32_t input_zero_point; + int32_t filter_zero_point; + int32_t output_zero_point; + + void *hexagon_data; +}; + +TfLiteStatus CalculateOpData(TfLiteContext *context, + TfLiteFusedActivation activation, + TfLiteType data_type, const TfLiteTensor *input, + const TfLiteTensor *filter, + const TfLiteTensor *bias, TfLiteTensor *output, + OpData *data) +{ + TfLiteStatus status = kTfLiteOk; + if (data_type != kTfLiteFloat32) { + double real_multiplier = 0.0; + TF_LITE_ENSURE_STATUS(GetQuantizedConvolutionMultipler( + context, input, filter, bias, output, &real_multiplier)); + int exponent; + QuantizeMultiplier(real_multiplier, &data->output_multiplier, &exponent); + data->output_shift = -exponent; + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, activation, output, &data->output_activation_min, + &data->output_activation_max)); + + data->input_zero_point = input->params.zero_point; + data->filter_zero_point = filter->params.zero_point; + data->output_zero_point = output->params.zero_point; + } + return status; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + void *data = nullptr; + data = context->AllocatePersistentBuffer(context, sizeof(OpData)); + + if (data == nullptr) { + return nullptr; + } + OpData *opdata = static_cast(data); + opdata->hexagon_data = + tflite::hexagon_fully_connected::HexagonInit(context, buffer, length); + + return data; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + OpData *data = static_cast(node->user_data); + const auto params = + static_cast(node->builtin_data); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = GetInput(context, node, kWeightsTensor); + TF_LITE_ENSURE(context, filter != nullptr); + const TfLiteTensor *bias = GetOptionalInputTensor(context, node, kBiasTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + TF_LITE_ENSURE_MSG(context, input->type == filter->type, + "Hybrid models are not supported on TFLite Micro."); + + tflite::hexagon_fully_connected::HexagonOptimizationEvaluation(context, node); + + if (tflite::hexagon_fully_connected::HexagonOptimizable(context, node)) { + return tflite::hexagon_fully_connected::HexagonPrepare(context, node); + } else { + return CalculateOpData(context, params->activation, input->type, input, + filter, bias, output, data); + } +} + +TfLiteStatus EvalQuantizedInt8(TfLiteContext *context, TfLiteNode *node, + const OpData &data, + const TfLiteEvalTensor *input, + const TfLiteEvalTensor *filter, + const TfLiteEvalTensor *bias, + TfLiteEvalTensor *output) +{ + tflite::FullyConnectedParams op_params; + op_params.input_offset = -data.input_zero_point; + op_params.weights_offset = -data.filter_zero_point; + op_params.output_offset = data.output_zero_point; + op_params.output_multiplier = data.output_multiplier; + // TODO(b/138810107): Figure out whether output shift should be inverted + op_params.output_shift = -data.output_shift; + op_params.quantized_activation_min = data.output_activation_min; + op_params.quantized_activation_max = data.output_activation_max; + + reference_integer_ops::FullyConnected( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + + return kTfLiteOk; +} + +TfLiteStatus EvalQuantized(TfLiteContext *context, TfLiteNode *node, + const OpData &data, const TfLiteEvalTensor *input, + const TfLiteEvalTensor *filter, + const TfLiteEvalTensor *bias, + TfLiteEvalTensor *output) +{ + const int32_t input_offset = -data.input_zero_point; + const int32_t filter_offset = -data.filter_zero_point; + const int32_t output_offset = data.output_zero_point; + + tflite::FullyConnectedParams op_params; + op_params.input_offset = input_offset; + op_params.weights_offset = filter_offset; + op_params.output_offset = output_offset; + op_params.output_multiplier = data.output_multiplier; + // Legacy ops used mixed left and right shifts. Now all are +ve-means-left. + op_params.output_shift = -data.output_shift; + op_params.quantized_activation_min = data.output_activation_min; + op_params.quantized_activation_max = data.output_activation_max; + +#define TF_LITE_FULLY_CONNECTED(output_data_type) \ + reference_ops::FullyConnected( \ + op_params, tflite::micro::GetTensorShape(input), \ + tflite::micro::GetTensorData(input), \ + tflite::micro::GetTensorShape(filter), \ + tflite::micro::GetTensorData(filter), \ + tflite::micro::GetTensorShape(bias), \ + tflite::micro::GetTensorData(bias), \ + tflite::micro::GetTensorShape(output), \ + tflite::micro::GetTensorData(output)) + switch (output->type) { + case kTfLiteUInt8: + TF_LITE_FULLY_CONNECTED(uint8_t); + break; + case kTfLiteInt16: + TF_LITE_FULLY_CONNECTED(int16_t); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(output->type), output->type); + return kTfLiteError; + } + + return kTfLiteOk; +} + +TfLiteStatus EvalFloat(TfLiteContext *context, TfLiteNode *node, + TfLiteFusedActivation activation, + const TfLiteEvalTensor *input, + const TfLiteEvalTensor *filter, + const TfLiteEvalTensor *bias, TfLiteEvalTensor *output) +{ + float output_activation_min, output_activation_max; + CalculateActivationRange(activation, &output_activation_min, + &output_activation_max); + tflite::FullyConnectedParams op_params; + op_params.float_activation_min = output_activation_min; + op_params.float_activation_max = output_activation_max; + tflite::reference_ops::FullyConnected( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + const auto *params = + static_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *filter = + tflite::micro::GetEvalInput(context, node, kWeightsTensor); + const TfLiteEvalTensor *bias = + tflite::micro::GetEvalInput(context, node, kBiasTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData &data = *(static_cast(node->user_data)); + + // Checks in Prepare ensure input, output and filter types are all the same. + switch (input->type) { + case kTfLiteFloat32: + return EvalFloat(context, node, params->activation, input, filter, bias, + output); + + case kTfLiteInt8: + if (tflite::hexagon_fully_connected::HexagonOptimizable(context, node)) { + return tflite::hexagon_fully_connected::HexagonEvalQuantizedInt8( + context, node, node->user_data, input, filter, bias, output); + } else { + return EvalQuantizedInt8(context, node, data, input, filter, bias, + output); + } + + case kTfLiteUInt8: + return EvalQuantized(context, node, data, input, filter, bias, output); + + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_FULLY_CONNECTED() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_fully_connected.h b/components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_fully_connected.h new file mode 100644 index 00000000..9f4fac7d --- /dev/null +++ b/components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_fully_connected.h @@ -0,0 +1,78 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +/* Copyright 2020 The Qualcomm Innovation Center, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted (subject to the limitations in the disclaimer +below) provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Qualcomm Innovation Center, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY +THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==============================================================================*/ + +#ifndef _HEXAGON_TFLM_TRANSLATION_FULLY_CONNECTED_H_ +#define _HEXAGON_TFLM_TRANSLATION_FULLY_CONNECTED_H_ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/fully_connected.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/fully_connected.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace hexagon_fully_connected { +void *HexagonInit(TfLiteContext *context, const char *buffer, size_t length); + +TfLiteStatus HexagonPrepare(TfLiteContext *context, TfLiteNode *node); + +TfLiteStatus HexagonEvalQuantizedInt8(TfLiteContext *context, TfLiteNode *node, + void *op_data, + const TfLiteEvalTensor *input, + const TfLiteEvalTensor *filter, + const TfLiteEvalTensor *bias, + TfLiteEvalTensor *output); + +void HexagonOptimizationEvaluation(TfLiteContext *context, TfLiteNode *node); +bool HexagonOptimizable(TfLiteContext *context, TfLiteNode *node); + +} // namespace hexagon_fully_connected +} // namespace tflite + +#endif // _HEXAGON_TFLM_TRANSLATION_FULLY_CONNECTED_H_ diff --git a/components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_svdf.h b/components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_svdf.h new file mode 100644 index 00000000..fc3a81cd --- /dev/null +++ b/components/TensorFlowLite/third_party/hexagon/hexagon_tflm_translation_svdf.h @@ -0,0 +1,80 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +/* Copyright 2020 The Qualcomm Innovation Center, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted (subject to the limitations in the disclaimer +below) provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Qualcomm Innovation Center, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY +THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==============================================================================*/ + +#ifndef _HEXAGON_TFLM_TRANSLATION_SVDF_H_ +#define _HEXAGON_TFLM_TRANSLATION_SVDF_H_ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/activation_utils.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace hexagon_svdf { +void *HexagonInit(TfLiteContext *context, const char *buffer, size_t length); + +TfLiteStatus HexagonPrepare(TfLiteContext *context, TfLiteNode *node); + +void HexagonEvalIntegerSVDF(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input_tensor, + const TfLiteEvalTensor *weights_feature_tensor, + const TfLiteEvalTensor *weights_time_tensor, + const TfLiteEvalTensor *bias_tensor, + const TfLiteSVDFParams *params, + TfLiteEvalTensor *activation_state_tensor, + TfLiteEvalTensor *output_tensor, void *op_data); + +void HexagonOptimizationEvaluation(TfLiteContext *context, TfLiteNode *node); +bool HexagonOptimizable(TfLiteContext *context, TfLiteNode *node); + +} // namespace hexagon_svdf +} // namespace tflite + +#endif // _HEXAGON_TFLM_TRANSLATION_SVDF_H_ diff --git a/components/TensorFlowLite/third_party/hexagon/svdf.cc b/components/TensorFlowLite/third_party/hexagon/svdf.cc new file mode 100644 index 00000000..a0b59d9b --- /dev/null +++ b/components/TensorFlowLite/third_party/hexagon/svdf.cc @@ -0,0 +1,610 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +/* Copyright 2020 The Qualcomm Innovation Center, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted (subject to the limitations in the disclaimer +below) provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Qualcomm Innovation Center, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY +THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/activation_utils.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "third_party/hexagon/hexagon_tflm_translation_svdf.h" + +namespace tflite { +namespace { + +// Input tensors. +constexpr int kInputTensor = 0; +constexpr int kWeightsFeatureTensor = 1; +constexpr int kWeightsTimeTensor = 2; +constexpr int kBiasTensor = 3; +constexpr int kInputActivationStateTensor = 4; +// Output tensor. +constexpr int kOutputTensor = 0; + +struct OpData { + int32_t effective_scale_1_a; + int32_t effective_scale_2_a; + // b versions of each scale are kept at int since the numbers are just the + // shift value - typically between [-32, 32]. + int effective_scale_1_b; + int effective_scale_2_b; + int scratch_tensor_index; + int scratch_output_tensor_index; + + // Cached tensor zero point values for quantized operations. + int input_zero_point; + int output_zero_point; + + void *hexagon_data; +}; + +/** + * This version of SVDF is specific to TFLite Micro. It contains the following + * differences between the TFLite version: + * + * 1.) Scratch tensor allocation - scratch tensors must be known ahead of time + * for the Micro interpreter. + * 2.) Output dimensions - the TFLite version determines output size and runtime + * and resizes the output tensor. Micro runtime does not support tensor + * resizing. + */ +static inline void ApplyTimeWeightsBiasAndActivation( + int batch_size, int memory_size, int num_filters, int num_units, int rank, + const float *const __restrict__ weights_time_ptr, + const float *const __restrict__ bias_ptr, TfLiteFusedActivation activation, + float *const __restrict__ state_ptr, float *const __restrict__ scratch_ptr, + float *const __restrict__ output_ptr) +{ + // Compute matmul(activation_state, weights_time). + for (int b = 0; b < batch_size; ++b) { + // Perform batched vector dot product: + float *scratch_ptr_batch = scratch_ptr + b * num_filters; + const float *vector1_ptr = weights_time_ptr; + const float *vector2_ptr = state_ptr + b * memory_size * num_filters; + for (int i = 0; i < num_filters; ++i) { + *scratch_ptr_batch = 0.f; + for (int j = 0; j < memory_size; ++j) { + *scratch_ptr_batch += *vector1_ptr++ * *vector2_ptr++; + } + scratch_ptr_batch++; + } + } + + // Initialize output with bias if provided. + if (bias_ptr) { + // VectorBatchVectorAssign + for (int i = 0; i < batch_size; ++i) { + float *output_data = output_ptr + i * num_units; + const float *bias_data = bias_ptr; + for (int j = 0; j < num_units; ++j) { + *output_data++ = *bias_data++; + } + } + } else { + float *output_data = output_ptr; + for (int i = 0; i < batch_size * num_units; ++i) { + *output_data++ = 0.0f; + } + } + + // Reduction sum. + for (int b = 0; b < batch_size; ++b) { + float *output_ptr_batch = output_ptr + b * num_units; + float *scratch_ptr_batch = scratch_ptr + b * num_filters; + + // Reduction sum vector + for (int i = 0; i < num_units; ++i) { + for (int j = 0; j < rank; j++) { + output_ptr_batch[i] += *scratch_ptr_batch++; + } + } + } + + // Apply activation. + for (int b = 0; b < batch_size; ++b) { + float *output_ptr_batch = output_ptr + b * num_units; + for (int i = 0; i < num_units; ++i) { + *output_ptr_batch = + tflite::ops::micro::ActivationValFloat(activation, *output_ptr_batch); + ++output_ptr_batch; + } + } +} + +inline void EvalFloatSVDF( + TfLiteContext *context, TfLiteNode *node, const TfLiteEvalTensor *input, + const TfLiteEvalTensor *weights_feature, + const TfLiteEvalTensor *weights_time, const TfLiteEvalTensor *bias, + const TfLiteSVDFParams *params, int scratch_tensor_index, + TfLiteEvalTensor *activation_state, TfLiteEvalTensor *output) +{ + const int rank = params->rank; + const int batch_size = input->dims->data[0]; + const int input_size = input->dims->data[1]; + const int num_filters = weights_feature->dims->data[0]; + const int num_units = num_filters / rank; + const int memory_size = weights_time->dims->data[1]; + + const float *weights_feature_ptr = + tflite::micro::GetTensorData(weights_feature); + const float *weights_time_ptr = + tflite::micro::GetTensorData(weights_time); + const float *bias_ptr = tflite::micro::GetTensorData(bias); + const float *input_ptr = tflite::micro::GetTensorData(input); + + float *state_ptr = tflite::micro::GetTensorData(activation_state); + + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(context->GetScratchBuffer != nullptr); + + float *scratch_ptr = static_cast( + context->GetScratchBuffer(context, scratch_tensor_index)); + + float *output_ptr = tflite::micro::GetTensorData(output); + + // Left shift the activation_state. + { + float *new_state_start = state_ptr; + const float *old_state_start = state_ptr + 1; + const float *old_state_end = + state_ptr + batch_size * num_filters * memory_size; + while (old_state_start != old_state_end) { + *new_state_start++ = *old_state_start++; + } + } + + // Note: no need to clear the latest activation, matmul is not accumulative. + + // Compute conv1d(inputs, weights_feature). + // The activation_state's rightmost column is used to save current cycle + // activation. This is achieved by starting at state_ptr[memory_size - 1] and + // having the stride equal to memory_size. + + // Perform batched matrix vector multiply operation: + { + const float *matrix = weights_feature_ptr; + const float *vector = input_ptr; + float *result = &state_ptr[memory_size - 1]; + float *result_in_batch = result; + for (int i = 0; i < batch_size; ++i) { + const float *matrix_ptr = matrix; + for (int j = 0; j < num_filters; ++j) { + float dot_prod = 0.0f; + const float *vector_in_batch = vector + i * input_size; + for (int k = 0; k < input_size; ++k) { + dot_prod += *matrix_ptr++ * *vector_in_batch++; + } + *result_in_batch = dot_prod; + result_in_batch += memory_size; + } + } + } + + ApplyTimeWeightsBiasAndActivation( + batch_size, memory_size, num_filters, num_units, rank, weights_time_ptr, + bias_ptr, params->activation, state_ptr, scratch_ptr, output_ptr); +} + +void EvalIntegerSVDF(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input_tensor, + const TfLiteEvalTensor *weights_feature_tensor, + const TfLiteEvalTensor *weights_time_tensor, + const TfLiteEvalTensor *bias_tensor, + const TfLiteSVDFParams *params, + TfLiteEvalTensor *activation_state_tensor, + TfLiteEvalTensor *output_tensor, const OpData &data) +{ + const int n_rank = params->rank; + const int n_batch = input_tensor->dims->data[0]; + const int n_input = input_tensor->dims->data[1]; + const int n_filter = weights_feature_tensor->dims->data[0]; + const int n_unit = n_filter / n_rank; + const int n_memory = weights_time_tensor->dims->data[1]; + + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(context->GetScratchBuffer != nullptr); + + int32_t *scratch_tensor = static_cast( + context->GetScratchBuffer(context, data.scratch_tensor_index)); + int32_t *scratch_output_tensor = static_cast( + context->GetScratchBuffer(context, data.scratch_output_tensor_index)); + + // Shift states. + int16_t *const state_ptr = + tflite::micro::GetTensorData(activation_state_tensor); + + // Left shift the activation_state. + { + int16_t *new_state_start = state_ptr; + const int16_t *old_state_start = state_ptr + 1; + const int16_t *old_state_end = state_ptr + n_batch * n_filter * n_memory; + while (old_state_start != old_state_end) { + *new_state_start++ = *old_state_start++; + } + } + + // Note: no need to clear the latest activation, matmul is not accumulative. + + // Feature matmul. + { + int16_t *state = + tflite::micro::GetTensorData(activation_state_tensor); + const int8_t *input = tflite::micro::GetTensorData(input_tensor); + const int8_t *weight_feature = + tflite::micro::GetTensorData(weights_feature_tensor); + const int32_t output_max = std::numeric_limits::max(); + const int32_t output_min = std::numeric_limits::min(); + int16_t *result_in_batch = state + (n_memory - 1); + for (int b = 0; b < n_batch; b++) { + const int8_t *matrix_ptr = weight_feature; + for (int r = 0; r < n_filter; r++) { + int32_t dot_prod = 0; + const int8_t *vector_in_batch = input + b * n_input; + for (int c = 0; c < n_input; c++) { + dot_prod += + *matrix_ptr++ * (*vector_in_batch++ - data.input_zero_point); + } + dot_prod = MultiplyByQuantizedMultiplier( + dot_prod, data.effective_scale_1_a, data.effective_scale_1_b); + dot_prod = std::min(std::max(output_min, dot_prod), output_max); + // This assumes state is symmetrically quantized. Otherwise last bit of + // state should be initialized to its zero point and accumulate the + // dot_prod. + // Equivalent as the following: + // result_in_batch = zero point, which happens to be zero. + // result_in_batch += dot_prod_56. + *result_in_batch = dot_prod; + result_in_batch += n_memory; + } + } + } + + // Time. + { + for (int b = 0; b < n_batch; ++b) { + int32_t *scratch_ptr_batch = scratch_tensor + b * n_filter; + + // Perform batched vector dot product: + const int16_t *vector1_ptr = + tflite::micro::GetTensorData(weights_time_tensor); + const int16_t *vector2_ptr = + tflite::micro::GetTensorData(activation_state_tensor) + + b * n_memory * n_filter; + + for (int i = 0; i < n_filter; i++) { + *scratch_ptr_batch = 0; + for (int j = 0; j < n_memory; j++) { + *scratch_ptr_batch += *vector1_ptr++ * *vector2_ptr++; + } + scratch_ptr_batch++; + } + } + } + + // Reduce, add bias, rescale, activation. + { + // Add bias. + { + if (bias_tensor) { + // Vector batch assign: + const int32_t *bias_data = + tflite::micro::GetTensorData(bias_tensor); + for (int i = 0; i < n_batch; ++i) { + int32_t *output_ptr = scratch_output_tensor + i * n_unit; + const int32_t *bias_ptr = bias_data; + for (int j = 0; j < n_unit; ++j) { + *output_ptr++ = *bias_ptr++; + } + } + } else { + int32_t *output_ptr = scratch_output_tensor; + for (int i = 0; i < n_batch * n_unit; ++i) { + *output_ptr++ = 0; + } + } + } + + // Reduce. + { + for (int b = 0; b < n_batch; ++b) { + int32_t *output_temp_ptr = scratch_output_tensor + b * n_unit; + int32_t *scratch_ptr_batch = scratch_tensor + b * n_filter; + + // Reduction sum vector + for (int i = 0; i < n_unit; ++i) { + for (int j = 0; j < n_rank; ++j) { + output_temp_ptr[i] += *scratch_ptr_batch++; + } + } + } + } + + // Rescale. + { + const int32_t output_max = std::numeric_limits::max(); + const int32_t output_min = std::numeric_limits::min(); + for (int i = 0; i < n_batch * n_unit; ++i) { + int32_t x1 = scratch_output_tensor[i]; + int32_t x2 = MultiplyByQuantizedMultiplier(x1, data.effective_scale_2_a, + data.effective_scale_2_b); + int32_t x3 = x2 + data.output_zero_point; + int32_t x4 = std::min(std::max(output_min, x3), output_max); + tflite::micro::GetTensorData(output_tensor)[i] = + static_cast(x4); + } + } + } +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + void *data = context->AllocatePersistentBuffer(context, sizeof(OpData)); + + if (data == nullptr) { + return nullptr; + } + OpData *opdata = static_cast(data); + opdata->hexagon_data = + tflite::hexagon_svdf::HexagonInit(context, buffer, length); + + return data; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + + const auto *params = static_cast(node->builtin_data); + + // Validate Tensor Inputs (dtype depends on quantization): + // [0] = Input, {2, batch_size, input_size} + // [1] = Weights Feature, {2, num_filters, input_size} + // [2] = Weights Time, {2, num_filters, memory_size} + // [3] = Bias (optional), {1, num_units} + // [4] = Activation State (variable), + // {2, batch_size, memory_size * num_filters} + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *weights_feature = + GetInput(context, node, kWeightsFeatureTensor); + TF_LITE_ENSURE(context, weights_feature != nullptr); + const TfLiteTensor *weights_time = + GetInput(context, node, kWeightsTimeTensor); + TF_LITE_ENSURE(context, weights_time != nullptr); + const TfLiteTensor *bias = GetOptionalInputTensor(context, node, kBiasTensor); + const TfLiteTensor *activation_state = + GetInput(context, node, kInputActivationStateTensor); + TF_LITE_ENSURE(context, activation_state != nullptr); + + // Define input constants based on input tensor definition above: + const int rank = params->rank; + const int input_size = input->dims->data[1]; + const int batch_size = input->dims->data[0]; + const int num_filters = weights_feature->dims->data[0]; + TF_LITE_ENSURE_EQ(context, num_filters % rank, 0); + const int num_units = num_filters / rank; + const int memory_size = weights_time->dims->data[1]; + + // Validate Input Tensor: + TF_LITE_ENSURE(context, + input->type == kTfLiteFloat32 || input->type == kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, NumDimensions(input), 2); + + // Validate Tensor Output: + // [0] = float/int8_t, {2, batch_size, num_units} + TF_LITE_ENSURE_EQ(context, node->outputs->size, 1); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_EQ(context, NumDimensions(output), 2); + TF_LITE_ENSURE_EQ(context, output->dims->data[0], batch_size); + TF_LITE_ENSURE_EQ(context, output->dims->data[1], num_units); + + // Validate Weights Feature Input Tensor: + TF_LITE_ENSURE_EQ(context, NumDimensions(weights_feature), 2); + TF_LITE_ENSURE_EQ(context, weights_feature->dims->data[1], input_size); + + // Validate Weights Time Input Tensor: + TF_LITE_ENSURE_EQ(context, NumDimensions(weights_time), 2); + TF_LITE_ENSURE_EQ(context, weights_time->dims->data[0], num_filters); + TF_LITE_ENSURE_EQ(context, weights_time->dims->data[1], memory_size); + + // Validate Optional Bias Input Tensor: + if (bias != nullptr) { + TF_LITE_ENSURE_EQ(context, bias->dims->data[0], num_units); + } + + // Validate Activation State Input Tensor: + TF_LITE_ENSURE_EQ(context, NumDimensions(activation_state), 2); + TF_LITE_ENSURE_EQ(context, activation_state->dims->data[0], batch_size); + TF_LITE_ENSURE_EQ(context, activation_state->dims->data[1], + memory_size * num_filters); + // Since is_variable is not part of TFLiteEvalTensor, check is_variable here. + TF_LITE_ENSURE_EQ(context, activation_state->is_variable, true); + + TF_LITE_ENSURE_EQ(context, node->inputs->size, 5); + + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + if (input->type == kTfLiteInt8) { + TF_LITE_ENSURE_EQ(context, weights_feature->type, kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, weights_time->type, kTfLiteInt16); + TF_LITE_ENSURE_EQ(context, activation_state->type, kTfLiteInt16); + if (bias != nullptr) { + TF_LITE_ENSURE_EQ(context, bias->type, kTfLiteInt32); + } + + TF_LITE_ENSURE_TYPES_EQ(context, output->type, kTfLiteInt8); + + const double effective_scale_1 = static_cast( + input->params.scale * weights_feature->params.scale / + activation_state->params.scale); + const double effective_scale_2 = + static_cast(activation_state->params.scale * + weights_time->params.scale / output->params.scale); + + // TODO(b/162018098): Use TF_LITE_ENSURE_NEAR when it is ready. + TF_LITE_ENSURE( + context, + std::abs(static_cast(bias->params.scale) - + static_cast(activation_state->params.scale * + weights_time->params.scale)) < 1e-5); + + QuantizeMultiplier(effective_scale_1, &(data->effective_scale_1_a), + &(data->effective_scale_1_b)); + QuantizeMultiplier(effective_scale_2, &(data->effective_scale_2_a), + &(data->effective_scale_2_b)); + + data->input_zero_point = input->params.zero_point; + data->output_zero_point = output->params.zero_point; + + TFLITE_DCHECK(context->RequestScratchBufferInArena != nullptr); + + tflite::hexagon_svdf::HexagonOptimizationEvaluation(context, node); + + if (tflite::hexagon_svdf::HexagonOptimizable(context, node)) { + TF_LITE_ENSURE_OK(context, + tflite::hexagon_svdf::HexagonPrepare(context, node)); + } else { + const TfLiteStatus scratch_status = context->RequestScratchBufferInArena( + context, batch_size * num_filters * sizeof(int32_t), + &(data->scratch_tensor_index)); + TF_LITE_ENSURE_OK(context, scratch_status); + + const TfLiteStatus scratch_output_status = + context->RequestScratchBufferInArena( + context, batch_size * num_units * sizeof(int32_t), + &(data->scratch_output_tensor_index)); + TF_LITE_ENSURE_OK(context, scratch_output_status); + } + } else { + TF_LITE_ENSURE_EQ(context, weights_feature->type, kTfLiteFloat32); + TF_LITE_ENSURE_EQ(context, weights_time->type, kTfLiteFloat32); + TF_LITE_ENSURE_EQ(context, activation_state->type, kTfLiteFloat32); + if (bias != nullptr) { + TF_LITE_ENSURE_EQ(context, bias->type, kTfLiteFloat32); + } + TF_LITE_ENSURE_TYPES_EQ(context, output->type, kTfLiteFloat32); + + TFLITE_DCHECK(context->RequestScratchBufferInArena != nullptr); + const TfLiteStatus scratch_status = context->RequestScratchBufferInArena( + context, batch_size * num_filters * sizeof(float), + &(data->scratch_tensor_index)); + TF_LITE_ENSURE_OK(context, scratch_status); + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = reinterpret_cast(node->builtin_data); + TFLITE_DCHECK(node->user_data != nullptr); + const OpData &data = *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *weights_feature = + tflite::micro::GetEvalInput(context, node, kWeightsFeatureTensor); + const TfLiteEvalTensor *weights_time = + tflite::micro::GetEvalInput(context, node, kWeightsTimeTensor); + const TfLiteEvalTensor *bias = + (NumInputs(node) == 5) ? tflite::micro::GetEvalInput(context, node, kBiasTensor) : nullptr; + TfLiteEvalTensor *activation_state = tflite::micro::GetMutableEvalInput( + context, node, kInputActivationStateTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (weights_feature->type) { + case kTfLiteFloat32: { + EvalFloatSVDF(context, node, input, weights_feature, weights_time, bias, + params, data.scratch_tensor_index, activation_state, + output); + return kTfLiteOk; + break; + } + + case kTfLiteInt8: { + if (tflite::hexagon_svdf::HexagonOptimizable(context, node)) { + tflite::hexagon_svdf::HexagonEvalIntegerSVDF( + context, node, input, weights_feature, weights_time, bias, params, + activation_state, output, node->user_data); + } else { + EvalIntegerSVDF(context, node, input, weights_feature, weights_time, + bias, params, activation_state, output, data); + } + return kTfLiteOk; + break; + } + + default: + TF_LITE_KERNEL_LOG(context, "Type %s not currently supported.", + TfLiteTypeGetName(weights_feature->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_SVDF() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/third_party/kissfft/_kiss_fft_guts.h b/components/TensorFlowLite/third_party/kissfft/_kiss_fft_guts.h new file mode 100644 index 00000000..28835996 --- /dev/null +++ b/components/TensorFlowLite/third_party/kissfft/_kiss_fft_guts.h @@ -0,0 +1,175 @@ +/* +Copyright (c) 2003-2010, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* kiss_fft.h + defines kiss_fft_scalar as either short or a float type + and defines + typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ +#include "kiss_fft.h" +#include + +#define MAXFACTORS 32 +/* e.g. an fft of length 128 has 4 factors + as far as kissfft is concerned + 4*4*4*2 + */ + +struct kiss_fft_state { + int nfft; + int inverse; + int factors[2 * MAXFACTORS]; + kiss_fft_cpx twiddles[1]; +}; + +/* + Explanation of macros dealing with complex math: + + C_MUL(m,a,b) : m = a*b + C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise + C_SUB( res, a,b) : res = a - b + C_SUBFROM( res , a) : res -= a + C_ADDTO( res , a) : res += a + * */ +#ifdef FIXED_POINT +#if (FIXED_POINT == 32) +#define FRACBITS 31 +#define SAMPPROD int64_t +#define SAMP_MAX 2147483647 +#else +#define FRACBITS 15 +#define SAMPPROD int32_t +#define SAMP_MAX 32767 +#endif + +#define SAMP_MIN -SAMP_MAX + +#if defined(CHECK_OVERFLOW) +#define CHECK_OVERFLOW_OP(a, op, b) \ + if ((SAMPPROD)(a)op(SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a)op(SAMPPROD)(b) < SAMP_MIN) { \ + fprintf(stderr, "WARNING:overflow @ " __FILE__ "(%d): (%d " #op " %d) = %ld\n", __LINE__, (a), (b), (SAMPPROD)(a)op(SAMPPROD)(b)); \ + } +#endif + +#define smul(a, b) ((SAMPPROD)(a) * (b)) +#define sround(x) (kiss_fft_scalar)(((x) + (1 << (FRACBITS - 1))) >> FRACBITS) + +#define S_MUL(a, b) sround(smul(a, b)) + +#define C_MUL(m, a, b) \ + do { \ + (m).r = sround(smul((a).r, (b).r) - smul((a).i, (b).i)); \ + (m).i = sround(smul((a).r, (b).i) + smul((a).i, (b).r)); \ + } while (0) + +#define DIVSCALAR(x, k) \ + (x) = sround(smul(x, SAMP_MAX / k)) + +#define C_FIXDIV(c, div) \ + do { \ + DIVSCALAR((c).r, div); \ + DIVSCALAR((c).i, div); \ + } while (0) + +#define C_MULBYSCALAR(c, s) \ + do { \ + (c).r = sround(smul((c).r, s)); \ + (c).i = sround(smul((c).i, s)); \ + } while (0) + +#else /* not FIXED_POINT*/ + +#define S_MUL(a, b) ((a) * (b)) +#define C_MUL(m, a, b) \ + do { \ + (m).r = (a).r * (b).r - (a).i * (b).i; \ + (m).i = (a).r * (b).i + (a).i * (b).r; \ + } while (0) +#define C_FIXDIV(c, div) /* NOOP */ +#define C_MULBYSCALAR(c, s) \ + do { \ + (c).r *= (s); \ + (c).i *= (s); \ + } while (0) +#endif + +#ifndef CHECK_OVERFLOW_OP +#define CHECK_OVERFLOW_OP(a, op, b) /* noop */ +#endif + +#define C_ADD(res, a, b) \ + do { \ + CHECK_OVERFLOW_OP((a).r, +, (b).r) \ + CHECK_OVERFLOW_OP((a).i, +, (b).i) \ + (res).r = (a).r + (b).r; \ + (res).i = (a).i + (b).i; \ + } while (0) +#define C_SUB(res, a, b) \ + do { \ + CHECK_OVERFLOW_OP((a).r, -, (b).r) \ + CHECK_OVERFLOW_OP((a).i, -, (b).i) \ + (res).r = (a).r - (b).r; \ + (res).i = (a).i - (b).i; \ + } while (0) +#define C_ADDTO(res, a) \ + do { \ + CHECK_OVERFLOW_OP((res).r, +, (a).r) \ + CHECK_OVERFLOW_OP((res).i, +, (a).i) \ + (res).r += (a).r; \ + (res).i += (a).i; \ + } while (0) + +#define C_SUBFROM(res, a) \ + do { \ + CHECK_OVERFLOW_OP((res).r, -, (a).r) \ + CHECK_OVERFLOW_OP((res).i, -, (a).i) \ + (res).r -= (a).r; \ + (res).i -= (a).i; \ + } while (0) + +#ifdef FIXED_POINT +#define KISS_FFT_COS(phase) floor(.5 + SAMP_MAX * cos(phase)) +#define KISS_FFT_SIN(phase) floor(.5 + SAMP_MAX * sin(phase)) +#define HALF_OF(x) ((x) >> 1) +#elif defined(USE_SIMD) +#define KISS_FFT_COS(phase) _mm_set1_ps(cos(phase)) +#define KISS_FFT_SIN(phase) _mm_set1_ps(sin(phase)) +#define HALF_OF(x) ((x)*_mm_set1_ps(.5)) +#else +#define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) +#define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) +#define HALF_OF(x) ((x)*.5) +#endif + +#define kf_cexp(x, phase) \ + do { \ + (x)->r = KISS_FFT_COS(phase); \ + (x)->i = KISS_FFT_SIN(phase); \ + } while (0) + +/* a debugging function */ +#define pcpx(c) \ + fprintf(stderr, "%g + %gi\n", (double)((c)->r), (double)((c)->i)) + +#ifdef KISS_FFT_USE_ALLOCA +// define this to allow use of alloca instead of malloc for temporary buffers +// Temporary buffers are used in two case: +// 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 +// 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. +#include +#define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) +#define KISS_FFT_TMP_FREE(ptr) +#else +#define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) +#define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) +#endif diff --git a/components/TensorFlowLite/third_party/kissfft/kiss_fft.c b/components/TensorFlowLite/third_party/kissfft/kiss_fft.c new file mode 100644 index 00000000..33eae186 --- /dev/null +++ b/components/TensorFlowLite/third_party/kissfft/kiss_fft.c @@ -0,0 +1,438 @@ +/* +Copyright (c) 2003-2010, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "_kiss_fft_guts.h" +/* The guts header contains all the multiplication and addition macros that are defined for + fixed or floating point complex numbers. It also delares the kf_ internal functions. + */ + +static void kf_bfly2( + kiss_fft_cpx *Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m) +{ + kiss_fft_cpx *Fout2; + kiss_fft_cpx *tw1 = st->twiddles; + kiss_fft_cpx t; + Fout2 = Fout + m; + do { + C_FIXDIV(*Fout, 2); + C_FIXDIV(*Fout2, 2); + + C_MUL(t, *Fout2, *tw1); + tw1 += fstride; + C_SUB(*Fout2, *Fout, t); + C_ADDTO(*Fout, t); + ++Fout2; + ++Fout; + } while (--m); +} + +static void kf_bfly4( + kiss_fft_cpx *Fout, + const size_t fstride, + const kiss_fft_cfg st, + const size_t m) +{ + kiss_fft_cpx *tw1, *tw2, *tw3; + kiss_fft_cpx scratch[6]; + size_t k = m; + const size_t m2 = 2 * m; + const size_t m3 = 3 * m; + + tw3 = tw2 = tw1 = st->twiddles; + + do { + C_FIXDIV(*Fout, 4); + C_FIXDIV(Fout[m], 4); + C_FIXDIV(Fout[m2], 4); + C_FIXDIV(Fout[m3], 4); + + C_MUL(scratch[0], Fout[m], *tw1); + C_MUL(scratch[1], Fout[m2], *tw2); + C_MUL(scratch[2], Fout[m3], *tw3); + + C_SUB(scratch[5], *Fout, scratch[1]); + C_ADDTO(*Fout, scratch[1]); + C_ADD(scratch[3], scratch[0], scratch[2]); + C_SUB(scratch[4], scratch[0], scratch[2]); + C_SUB(Fout[m2], *Fout, scratch[3]); + tw1 += fstride; + tw2 += fstride * 2; + tw3 += fstride * 3; + C_ADDTO(*Fout, scratch[3]); + + if (st->inverse) { + Fout[m].r = scratch[5].r - scratch[4].i; + Fout[m].i = scratch[5].i + scratch[4].r; + Fout[m3].r = scratch[5].r + scratch[4].i; + Fout[m3].i = scratch[5].i - scratch[4].r; + } else { + Fout[m].r = scratch[5].r + scratch[4].i; + Fout[m].i = scratch[5].i - scratch[4].r; + Fout[m3].r = scratch[5].r - scratch[4].i; + Fout[m3].i = scratch[5].i + scratch[4].r; + } + ++Fout; + } while (--k); +} + +static void kf_bfly3( + kiss_fft_cpx *Fout, + const size_t fstride, + const kiss_fft_cfg st, + size_t m) +{ + size_t k = m; + const size_t m2 = 2 * m; + kiss_fft_cpx *tw1, *tw2; + kiss_fft_cpx scratch[5]; + kiss_fft_cpx epi3; + epi3 = st->twiddles[fstride * m]; + + tw1 = tw2 = st->twiddles; + + do { + C_FIXDIV(*Fout, 3); + C_FIXDIV(Fout[m], 3); + C_FIXDIV(Fout[m2], 3); + + C_MUL(scratch[1], Fout[m], *tw1); + C_MUL(scratch[2], Fout[m2], *tw2); + + C_ADD(scratch[3], scratch[1], scratch[2]); + C_SUB(scratch[0], scratch[1], scratch[2]); + tw1 += fstride; + tw2 += fstride * 2; + + Fout[m].r = Fout->r - HALF_OF(scratch[3].r); + Fout[m].i = Fout->i - HALF_OF(scratch[3].i); + + C_MULBYSCALAR(scratch[0], epi3.i); + + C_ADDTO(*Fout, scratch[3]); + + Fout[m2].r = Fout[m].r + scratch[0].i; + Fout[m2].i = Fout[m].i - scratch[0].r; + + Fout[m].r -= scratch[0].i; + Fout[m].i += scratch[0].r; + + ++Fout; + } while (--k); +} + +static void kf_bfly5( + kiss_fft_cpx *Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m) +{ + kiss_fft_cpx *Fout0, *Fout1, *Fout2, *Fout3, *Fout4; + int u; + kiss_fft_cpx scratch[13]; + kiss_fft_cpx *twiddles = st->twiddles; + kiss_fft_cpx *tw; + kiss_fft_cpx ya, yb; + ya = twiddles[fstride * m]; + yb = twiddles[fstride * 2 * m]; + + Fout0 = Fout; + Fout1 = Fout0 + m; + Fout2 = Fout0 + 2 * m; + Fout3 = Fout0 + 3 * m; + Fout4 = Fout0 + 4 * m; + + tw = st->twiddles; + for (u = 0; u < m; ++u) { + C_FIXDIV(*Fout0, 5); + C_FIXDIV(*Fout1, 5); + C_FIXDIV(*Fout2, 5); + C_FIXDIV(*Fout3, 5); + C_FIXDIV(*Fout4, 5); + scratch[0] = *Fout0; + + C_MUL(scratch[1], *Fout1, tw[u * fstride]); + C_MUL(scratch[2], *Fout2, tw[2 * u * fstride]); + C_MUL(scratch[3], *Fout3, tw[3 * u * fstride]); + C_MUL(scratch[4], *Fout4, tw[4 * u * fstride]); + + C_ADD(scratch[7], scratch[1], scratch[4]); + C_SUB(scratch[10], scratch[1], scratch[4]); + C_ADD(scratch[8], scratch[2], scratch[3]); + C_SUB(scratch[9], scratch[2], scratch[3]); + + Fout0->r += scratch[7].r + scratch[8].r; + Fout0->i += scratch[7].i + scratch[8].i; + + scratch[5].r = scratch[0].r + S_MUL(scratch[7].r, ya.r) + S_MUL(scratch[8].r, yb.r); + scratch[5].i = scratch[0].i + S_MUL(scratch[7].i, ya.r) + S_MUL(scratch[8].i, yb.r); + + scratch[6].r = S_MUL(scratch[10].i, ya.i) + S_MUL(scratch[9].i, yb.i); + scratch[6].i = -S_MUL(scratch[10].r, ya.i) - S_MUL(scratch[9].r, yb.i); + + C_SUB(*Fout1, scratch[5], scratch[6]); + C_ADD(*Fout4, scratch[5], scratch[6]); + + scratch[11].r = scratch[0].r + S_MUL(scratch[7].r, yb.r) + S_MUL(scratch[8].r, ya.r); + scratch[11].i = scratch[0].i + S_MUL(scratch[7].i, yb.r) + S_MUL(scratch[8].i, ya.r); + scratch[12].r = -S_MUL(scratch[10].i, yb.i) + S_MUL(scratch[9].i, ya.i); + scratch[12].i = S_MUL(scratch[10].r, yb.i) - S_MUL(scratch[9].r, ya.i); + + C_ADD(*Fout2, scratch[11], scratch[12]); + C_SUB(*Fout3, scratch[11], scratch[12]); + + ++Fout0; + ++Fout1; + ++Fout2; + ++Fout3; + ++Fout4; + } +} + +/* perform the butterfly for one stage of a mixed radix FFT */ +static void kf_bfly_generic( + kiss_fft_cpx *Fout, + const size_t fstride, + const kiss_fft_cfg st, + int m, + int p) +{ + int u, k, q1, q; + kiss_fft_cpx *twiddles = st->twiddles; + kiss_fft_cpx t; + int Norig = st->nfft; + + kiss_fft_cpx *scratch = (kiss_fft_cpx *)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx) * p); + + for (u = 0; u < m; ++u) { + k = u; + for (q1 = 0; q1 < p; ++q1) { + scratch[q1] = Fout[k]; + C_FIXDIV(scratch[q1], p); + k += m; + } + + k = u; + for (q1 = 0; q1 < p; ++q1) { + int twidx = 0; + Fout[k] = scratch[0]; + for (q = 1; q < p; ++q) { + twidx += fstride * k; + if (twidx >= Norig) + twidx -= Norig; + C_MUL(t, scratch[q], twiddles[twidx]); + C_ADDTO(Fout[k], t); + } + k += m; + } + } + KISS_FFT_TMP_FREE(scratch); +} + +static void kf_work( + kiss_fft_cpx *Fout, + const kiss_fft_cpx *f, + const size_t fstride, + int in_stride, + int *factors, + const kiss_fft_cfg st) +{ + kiss_fft_cpx *Fout_beg = Fout; + const int p = *factors++; /* the radix */ + const int m = *factors++; /* stage's fft length/p */ + const kiss_fft_cpx *Fout_end = Fout + p * m; + +#ifdef _OPENMP + // use openmp extensions at the + // top-level (not recursive) + if (fstride == 1 && p <= 5) { + int k; + + // execute the p different work units in different threads +#pragma omp parallel for + for (k = 0; k < p; ++k) + kf_work(Fout + k * m, f + fstride * in_stride * k, fstride * p, in_stride, factors, st); + // all threads have joined by this point + + switch (p) { + case 2: + kf_bfly2(Fout, fstride, st, m); + break; + case 3: + kf_bfly3(Fout, fstride, st, m); + break; + case 4: + kf_bfly4(Fout, fstride, st, m); + break; + case 5: + kf_bfly5(Fout, fstride, st, m); + break; + default: + kf_bfly_generic(Fout, fstride, st, m, p); + break; + } + return; + } +#endif + + if (m == 1) { + do { + *Fout = *f; + f += fstride * in_stride; + } while (++Fout != Fout_end); + } else { + do { + // recursive call: + // DFT of size m*p performed by doing + // p instances of smaller DFTs of size m, + // each one takes a decimated version of the input + kf_work(Fout, f, fstride * p, in_stride, factors, st); + f += fstride * in_stride; + } while ((Fout += m) != Fout_end); + } + + Fout = Fout_beg; + + // recombine the p smaller DFTs + switch (p) { + case 2: + kf_bfly2(Fout, fstride, st, m); + break; + case 3: + kf_bfly3(Fout, fstride, st, m); + break; + case 4: + kf_bfly4(Fout, fstride, st, m); + break; + case 5: + kf_bfly5(Fout, fstride, st, m); + break; + default: + kf_bfly_generic(Fout, fstride, st, m, p); + break; + } +} + +/* facbuf is populated by p1,m1,p2,m2, ... + where + p[i] * m[i] = m[i-1] + m0 = n */ +static void kf_factor(int n, int *facbuf) +{ + int p = 4; + double floor_sqrt; + floor_sqrt = floor(sqrt((double)n)); + + /*factor out powers of 4, powers of 2, then any remaining primes */ + do { + while (n % p) { + switch (p) { + case 4: + p = 2; + break; + case 2: + p = 3; + break; + default: + p += 2; + break; + } + if (p > floor_sqrt) + p = n; /* no more factors, skip to end */ + } + n /= p; + *facbuf++ = p; + *facbuf++ = n; + } while (n > 1); +} + +/* + * + * User-callable function to allocate all necessary storage space for the fft. + * + * The return value is a contiguous block of memory, allocated with malloc. As such, + * It can be freed with free(), rather than a kiss_fft-specific function. + * */ +kiss_fft_cfg kiss_fft_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem) +{ + kiss_fft_cfg st = NULL; + size_t memneeded = sizeof(struct kiss_fft_state) + sizeof(kiss_fft_cpx) * (nfft - 1); /* twiddle factors*/ + + if (lenmem == NULL) { + st = (kiss_fft_cfg)KISS_FFT_MALLOC(memneeded); + } else { + if (mem != NULL && *lenmem >= memneeded) + st = (kiss_fft_cfg)mem; + *lenmem = memneeded; + } + if (st) { + int i; + st->nfft = nfft; + st->inverse = inverse_fft; + + for (i = 0; i < nfft; ++i) { + const double pi = 3.141592653589793238462643383279502884197169399375105820974944; + double phase = -2 * pi * i / nfft; + if (st->inverse) + phase *= -1; + kf_cexp(st->twiddles + i, phase); + } + + kf_factor(nfft, st->factors); + } + return st; +} + +void kiss_fft_stride(kiss_fft_cfg st, const kiss_fft_cpx *fin, kiss_fft_cpx *fout, int in_stride) +{ + if (fin == fout) { + //NOTE: this is not really an in-place FFT algorithm. + //It just performs an out-of-place FFT into a temp buffer + kiss_fft_cpx *tmpbuf = (kiss_fft_cpx *)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx) * st->nfft); + kf_work(tmpbuf, fin, 1, in_stride, st->factors, st); + memcpy(fout, tmpbuf, sizeof(kiss_fft_cpx) * st->nfft); + KISS_FFT_TMP_FREE(tmpbuf); + } else { + kf_work(fout, fin, 1, in_stride, st->factors, st); + } +} + +void kiss_fft(kiss_fft_cfg cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout) +{ + kiss_fft_stride(cfg, fin, fout, 1); +} + +void kiss_fft_cleanup(void) +{ + // nothing needed any more +} + +int kiss_fft_next_fast_size(int n) +{ + while (1) { + int m = n; + while ((m % 2) == 0) + m /= 2; + while ((m % 3) == 0) + m /= 3; + while ((m % 5) == 0) + m /= 5; + if (m <= 1) + break; /* n is completely factorable by twos, threes, and fives */ + n++; + } + return n; +} diff --git a/components/TensorFlowLite/third_party/kissfft/kiss_fft.h b/components/TensorFlowLite/third_party/kissfft/kiss_fft.h new file mode 100644 index 00000000..c288d47e --- /dev/null +++ b/components/TensorFlowLite/third_party/kissfft/kiss_fft.h @@ -0,0 +1,129 @@ +#ifndef KISS_FFT_H +#define KISS_FFT_H + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + ATTENTION! + If you would like a : + -- a utility that will handle the caching of fft objects + -- real-only (no imaginary time component ) FFT + -- a multi-dimensional FFT + -- a command-line utility to perform ffts + -- a command-line utility to perform fast-convolution filtering + + Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c + in the tools/ directory. +*/ + +#ifdef USE_SIMD +#include +#define kiss_fft_scalar __m128 +#define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes, 16) +#define KISS_FFT_FREE _mm_free +#else +#define KISS_FFT_MALLOC(X) (void *)(0) /* Patched. */ +#define KISS_FFT_FREE(X) /* Patched. */ +#endif + +// Patched automatically by download_dependencies.sh so default is 16 bit. +#ifndef FIXED_POINT +#define FIXED_POINT (16) +#endif +// End patch. + +#ifdef FIXED_POINT +#include /* Patched. */ +#include +#if (FIXED_POINT == 32) +#define kiss_fft_scalar int32_t +#else +#define kiss_fft_scalar int16_t +#endif +#else +#ifndef kiss_fft_scalar +/* default is float */ +#define kiss_fft_scalar float +#endif +#endif + +typedef struct { + kiss_fft_scalar r; + kiss_fft_scalar i; +} kiss_fft_cpx; + +typedef struct kiss_fft_state *kiss_fft_cfg; + +/* + * kiss_fft_alloc + * + * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. + * + * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); + * + * The return value from fft_alloc is a cfg buffer used internally + * by the fft routine or NULL. + * + * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. + * The returned value should be free()d when done to avoid memory leaks. + * + * The state can be placed in a user supplied buffer 'mem': + * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, + * then the function places the cfg in mem and the size used in *lenmem + * and returns mem. + * + * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), + * then the function returns NULL and places the minimum cfg + * buffer size in *lenmem. + * */ + +kiss_fft_cfg kiss_fft_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem); + +/* + * kiss_fft(cfg,in_out_buf) + * + * Perform an FFT on a complex input buffer. + * for a forward FFT, + * fin should be f[0] , f[1] , ... ,f[nfft-1] + * fout will be F[0] , F[1] , ... ,F[nfft-1] + * Note that each element is complex and can be accessed like + f[k].r and f[k].i + * */ +void kiss_fft(kiss_fft_cfg cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout); + +/* + A more generic version of the above function. It reads its input from every Nth sample. + * */ +void kiss_fft_stride(kiss_fft_cfg cfg, const kiss_fft_cpx *fin, kiss_fft_cpx *fout, int fin_stride); + +/* If kiss_fft_alloc allocated a buffer, it is one contiguous + buffer and can be simply free()d when no longer needed*/ +#define kiss_fft_free free + +/* + Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up + your compiler output to call this before you exit. +*/ +void kiss_fft_cleanup(void); + +/* + * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) + */ +int kiss_fft_next_fast_size(int n); + +/* for real ffts, we need an even size */ +#define kiss_fftr_next_fast_size_real(n) \ + (kiss_fft_next_fast_size(((n) + 1) >> 1) << 1) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.c b/components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.c new file mode 100644 index 00000000..3f567a66 --- /dev/null +++ b/components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.c @@ -0,0 +1,159 @@ +/* +Copyright (c) 2003-2004, Mark Borgerding + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "kiss_fftr.h" +#include "_kiss_fft_guts.h" + +struct kiss_fftr_state { + kiss_fft_cfg substate; + kiss_fft_cpx *tmpbuf; + kiss_fft_cpx *super_twiddles; +#ifdef USE_SIMD + void *pad; +#endif +}; + +kiss_fftr_cfg kiss_fftr_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem) +{ + int i; + kiss_fftr_cfg st = NULL; + size_t subsize, memneeded; + + if (nfft & 1) { + /* fprintf(stderr,"Real FFT optimization must be even.\n"); */ + return NULL; + } + nfft >>= 1; + + kiss_fft_alloc(nfft, inverse_fft, NULL, &subsize); + memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * (nfft * 3 / 2); + + if (lenmem == NULL) { + st = (kiss_fftr_cfg)KISS_FFT_MALLOC(memneeded); + } else { + if (*lenmem >= memneeded) + st = (kiss_fftr_cfg)mem; + *lenmem = memneeded; + } + if (!st) + return NULL; + + st->substate = (kiss_fft_cfg)(st + 1); /*just beyond kiss_fftr_state struct */ + st->tmpbuf = (kiss_fft_cpx *)(((char *)st->substate) + subsize); + st->super_twiddles = st->tmpbuf + nfft; + kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); + + for (i = 0; i < nfft / 2; ++i) { + double phase = + -3.14159265358979323846264338327 * ((double)(i + 1) / nfft + .5); + if (inverse_fft) + phase *= -1; + kf_cexp(st->super_twiddles + i, phase); + } + return st; +} + +void kiss_fftr(kiss_fftr_cfg st, const kiss_fft_scalar *timedata, kiss_fft_cpx *freqdata) +{ + /* input buffer timedata is stored row-wise */ + int k, ncfft; + kiss_fft_cpx fpnk, fpk, f1k, f2k, tw, tdc; + + if (st->substate->inverse) { + /* fprintf(stderr,"kiss fft usage error: improper alloc\n"); */ + return; /* exit(1); */ + } + + ncfft = st->substate->nfft; + + /*perform the parallel fft of two real signals packed in real,imag*/ + kiss_fft(st->substate, (const kiss_fft_cpx *)timedata, st->tmpbuf); + /* The real part of the DC element of the frequency spectrum in st->tmpbuf + * contains the sum of the even-numbered elements of the input time sequence + * The imag part is the sum of the odd-numbered elements + * + * The sum of tdc.r and tdc.i is the sum of the input time sequence. + * yielding DC of input time sequence + * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... + * yielding Nyquist bin of input time sequence + */ + + tdc.r = st->tmpbuf[0].r; + tdc.i = st->tmpbuf[0].i; + C_FIXDIV(tdc, 2); + CHECK_OVERFLOW_OP(tdc.r, +, tdc.i); + CHECK_OVERFLOW_OP(tdc.r, -, tdc.i); + freqdata[0].r = tdc.r + tdc.i; + freqdata[ncfft].r = tdc.r - tdc.i; +#ifdef USE_SIMD + freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); +#else + freqdata[ncfft].i = freqdata[0].i = 0; +#endif + + for (k = 1; k <= ncfft / 2; ++k) { + fpk = st->tmpbuf[k]; + fpnk.r = st->tmpbuf[ncfft - k].r; + fpnk.i = -st->tmpbuf[ncfft - k].i; + C_FIXDIV(fpk, 2); + C_FIXDIV(fpnk, 2); + + C_ADD(f1k, fpk, fpnk); + C_SUB(f2k, fpk, fpnk); + C_MUL(tw, f2k, st->super_twiddles[k - 1]); + + freqdata[k].r = HALF_OF(f1k.r + tw.r); + freqdata[k].i = HALF_OF(f1k.i + tw.i); + freqdata[ncfft - k].r = HALF_OF(f1k.r - tw.r); + freqdata[ncfft - k].i = HALF_OF(tw.i - f1k.i); + } +} + +void kiss_fftri(kiss_fftr_cfg st, const kiss_fft_cpx *freqdata, kiss_fft_scalar *timedata) +{ + /* input buffer timedata is stored row-wise */ + int k, ncfft; + + if (st->substate->inverse == 0) { + /* fprintf (stderr, "kiss fft usage error: improper alloc\n"); */ + return; /* exit (1); */ + } + + ncfft = st->substate->nfft; + + st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; + st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; + C_FIXDIV(st->tmpbuf[0], 2); + + for (k = 1; k <= ncfft / 2; ++k) { + kiss_fft_cpx fk, fnkc, fek, fok, tmp; + fk = freqdata[k]; + fnkc.r = freqdata[ncfft - k].r; + fnkc.i = -freqdata[ncfft - k].i; + C_FIXDIV(fk, 2); + C_FIXDIV(fnkc, 2); + + C_ADD(fek, fk, fnkc); + C_SUB(tmp, fk, fnkc); + C_MUL(fok, tmp, st->super_twiddles[k - 1]); + C_ADD(st->tmpbuf[k], fek, fok); + C_SUB(st->tmpbuf[ncfft - k], fek, fok); +#ifdef USE_SIMD + st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); +#else + st->tmpbuf[ncfft - k].i *= -1; +#endif + } + kiss_fft(st->substate, st->tmpbuf, (kiss_fft_cpx *)timedata); +} diff --git a/components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.h b/components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.h new file mode 100644 index 00000000..cd7b710b --- /dev/null +++ b/components/TensorFlowLite/third_party/kissfft/tools/kiss_fftr.h @@ -0,0 +1,43 @@ +#ifndef KISS_FTR_H +#define KISS_FTR_H + +#include "kiss_fft.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* + + Real optimized version can save about 45% cpu time vs. complex fft of a real seq. + + + + */ + +typedef struct kiss_fftr_state *kiss_fftr_cfg; + +kiss_fftr_cfg kiss_fftr_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem); +/* + nfft must be even + + If you don't care to allocate space, use mem = lenmem = NULL +*/ + +void kiss_fftr(kiss_fftr_cfg cfg, const kiss_fft_scalar *timedata, kiss_fft_cpx *freqdata); +/* + input timedata has nfft scalar points + output freqdata has nfft/2+1 complex points +*/ + +void kiss_fftri(kiss_fftr_cfg cfg, const kiss_fft_cpx *freqdata, kiss_fft_scalar *timedata); +/* + input freqdata has nfft/2+1 complex points + output timedata has nfft scalar points +*/ + +#define kiss_fftr_free free + +#ifdef __cplusplus +} +#endif +#endif diff --git a/components/TensorFlowLite/third_party/ruy/ruy/profiler/instrumentation.h b/components/TensorFlowLite/third_party/ruy/ruy/profiler/instrumentation.h new file mode 100644 index 00000000..c4dc71a8 --- /dev/null +++ b/components/TensorFlowLite/third_party/ruy/ruy/profiler/instrumentation.h @@ -0,0 +1,230 @@ +/* Copyright 2020 Google LLC. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef RUY_RUY_PROFILER_INSTRUMENTATION_H_ +#define RUY_RUY_PROFILER_INSTRUMENTATION_H_ + +#ifdef RUY_PROFILER +#include +#include +#include +#endif + +namespace ruy { +namespace profiler { +#ifdef RUY_PROFILER + +// A label is how a code scope is annotated to appear in profiles. +// The stacks that are sampled by the profiler are stacks of such labels. +// A label consists of a literal string, plus optional integer arguments. +class Label { +public: + Label() + { + } + template + explicit Label(Args... args) + { + Set(args...); + } + void Set(const char *format) + { + format_ = format; + args_count_ = 0; + } + template + void Set(const char *format, Args... args) + { + format_ = format; + args_count_ = sizeof...(args); + SetArgs(0, args...); + } + + void operator=(const Label &other); + + bool operator==(const Label &other) const; + + std::string Formatted() const; + const char *format() const + { + return format_; + } + +private: + void SetArgs(int position, int arg0) + { + args_[position] = arg0; + } + + template + void SetArgs(int position, int arg0, Args... args) + { + SetArgs(position, arg0); + SetArgs(position + 1, args...); + } + + static constexpr int kMaxArgs = 4; + const char *format_ = nullptr; + int args_count_ = 0; + int args_[kMaxArgs]; +}; + +namespace detail { +// Forward-declaration, see class ThreadStack below. +class ThreadStack; + +bool &GlobalIsProfilerRunning(); + +// Returns the global vector of pointers to all stacks, there being one stack +// per thread executing instrumented code. +std::vector *GlobalAllThreadStacks(); + +// Returns the mutex to be locked around any access to GlobalAllThreadStacks(). +std::mutex *GlobalsMutex(); + +// Returns the thread-local stack, specific to the current thread. +ThreadStack *ThreadLocalThreadStack(); + +// This 'stack' is what may be more appropriately called a 'pseudostack': +// It contains Label entries that are 'manually' entered by instrumentation +// code. It's unrelated to real call stacks. +struct Stack { + std::uint32_t id = 0; + static constexpr int kMaxSize = 64; + int size = 0; + Label labels[kMaxSize]; +}; + +// Returns the buffer byte size required by CopyToSample. +int GetBufferSize(const Stack &stack); + +// Copies this Stack into a byte buffer, called a 'sample'. +void CopyToBuffer(const Stack &stack, char *dst); + +// Populates this Stack from an existing sample buffer, typically +// produced by CopyToSample. +void ReadFromBuffer(const char *src, Stack *stack); + +// ThreadStack is meant to be used as a thread-local singleton, assigning to +// each thread a Stack object holding its pseudo-stack of profile labels, +// plus a mutex allowing to synchronize accesses to this pseudo-stack between +// this thread and a possible profiler thread sampling it. +class ThreadStack { +public: + ThreadStack(); + ~ThreadStack(); + + const Stack &stack() const + { + return stack_; + } + + // Returns the mutex to lock around any access to this stack. Each stack is + // accessed by potentially two threads: the thread that it belongs to + // (which calls Push and Pop) and the profiler thread during profiling + // (which calls CopyToSample). + std::mutex &Mutex() const + { + return mutex_; + } + + // Pushes a new label on the top of this Stack. + template + void Push(Args... args) + { + // This mutex locking is needed to guard against race conditions as both + // the current thread and the profiler thread may be concurrently accessing + // this stack. In addition to that, this mutex locking also serves the other + // purpose of acting as a barrier (of compiler code reordering, of runtime + // CPU instruction reordering, and of memory access reordering), which + // gives a measure of correctness to this profiler. The downside is some + // latency. As this lock will be uncontended most of the times, the cost + // should be roughly that of an sequentially-consistent atomic access, + // comparable to an access to the level of CPU data cache that is shared + // among all cores, typically 60 cycles on current ARM CPUs, plus side + // effects from barrier instructions. + std::lock_guard lock(mutex_); + // Avoid overrunning the stack, even in 'release' builds. This profiling + // instrumentation code should not ship in release builds anyway, the + // overhead of this check is negligible, and overrunning a stack array would + // be bad. + if (stack_.size >= Stack::kMaxSize) { + abort(); + } + stack_.labels[stack_.size++].Set(args...); + } + + // Pops the top-most label from this Stack. + void Pop() + { + // See the comment in Push about this lock. While it would be tempting to + // try to remove this lock and just atomically decrement size_ with a + // store-release, that would not necessarily be a substitute for all of the + // purposes that this lock serves, or if it was done carefully to serve all + // of the same purposes, then that wouldn't be faster than this (mostly + // uncontended) lock. + std::lock_guard lock(mutex_); + stack_.size--; + } + +private: + mutable std::mutex mutex_; + Stack stack_; +}; + +} // namespace detail + +// RAII user-facing way to construct Labels associated with their life scope +// and get them pushed to / popped from the current thread stack. +class ScopeLabel { +public: + template + ScopeLabel(Args... args) + : thread_stack_(detail::ThreadLocalThreadStack()) + { + thread_stack_->Push(args...); + } + + ~ScopeLabel() + { + thread_stack_->Pop(); + } + +private: + detail::ThreadStack *thread_stack_; +}; + +#else // no RUY_PROFILER + +class ScopeLabel { +public: + template + explicit ScopeLabel(Args...) + { + } + + // This destructor is needed to consistently silence clang's -Wunused-variable + // which seems to trigger semi-randomly. + ~ScopeLabel() + { + } +}; + +#endif + +} // namespace profiler +} // namespace ruy + +#endif // RUY_RUY_PROFILER_INSTRUMENTATION_H_ diff --git a/examples/tensorflowlite/sinx/CMakeLists.txt b/examples/tensorflowlite/sinx/CMakeLists.txt new file mode 100644 index 00000000..5669b0d9 --- /dev/null +++ b/examples/tensorflowlite/sinx/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.15) + +include(proj.conf) + +find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE}) + +target_sources(app PRIVATE constants.cc main_functions.cc model.cc output_handler.cc) + +sdk_set_main_file(main.c) + +project(tensorflowlite_sinx) diff --git a/examples/tensorflowlite/sinx/Makefile b/examples/tensorflowlite/sinx/Makefile new file mode 100644 index 00000000..9b01b7fe --- /dev/null +++ b/examples/tensorflowlite/sinx/Makefile @@ -0,0 +1,13 @@ +SDK_DEMO_PATH ?= . +BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../../.. + +export BL_SDK_BASE + +CHIP ?= bl616 +BOARD ?= bl616dk +CROSS_COMPILE ?= riscv64-unknown-elf- + +# add custom cmake definition +#cmake_definition+=-Dxxx=sss + +include $(BL_SDK_BASE)/project.build diff --git a/examples/tensorflowlite/sinx/constants.cc b/examples/tensorflowlite/sinx/constants.cc new file mode 100644 index 00000000..ac7d6ae8 --- /dev/null +++ b/examples/tensorflowlite/sinx/constants.cc @@ -0,0 +1,20 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/constants.cc +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "constants.h" + +// This is a small number so that it's easy to read the logs +const int kInferencesPerCycle = 20; diff --git a/examples/tensorflowlite/sinx/constants.h b/examples/tensorflowlite/sinx/constants.h new file mode 100644 index 00000000..e77bb0cf --- /dev/null +++ b/examples/tensorflowlite/sinx/constants.h @@ -0,0 +1,33 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/constants.h +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ + +// This constant represents the range of x values our model was trained on, +// which is from 0 to (2 * Pi). We approximate Pi to avoid requiring additional +// libraries. +const float kXrange = 2.f * 3.14159265359f; + +// This constant determines the number of inferences to perform across the range +// of x values defined above. Since each inference takes time, the higher this +// number, the more time it will take to run through the entire range. The value +// of this constant can be tuned so that one full cycle takes a desired amount +// of time. Since different devices take different amounts of time to perform +// inference, this value should be defined per-device. +extern const int kInferencesPerCycle; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_CONSTANTS_H_ diff --git a/examples/tensorflowlite/sinx/main.c b/examples/tensorflowlite/sinx/main.c new file mode 100644 index 00000000..44bd4659 --- /dev/null +++ b/examples/tensorflowlite/sinx/main.c @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "main_functions.h" +#include "board.h" +#include "bflb_uart.h" + +/// Global Destructor for C++, which we're not using. +/// See https://alex-robenko.gitbook.io/bare_metal_cpp/compiler_output/static#custom-destructors +void *__dso_handle = NULL; + +int main() +{ + board_init(); + setup(); + printf("model load successfully!!\r\n"); + + while (1) { + loop(); + } +} diff --git a/examples/tensorflowlite/sinx/main_functions.cc b/examples/tensorflowlite/sinx/main_functions.cc new file mode 100644 index 00000000..2af5fdf7 --- /dev/null +++ b/examples/tensorflowlite/sinx/main_functions.cc @@ -0,0 +1,126 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/main_functions.cc +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "main_functions.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "constants.h" +#include "model.h" +#include "output_handler.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Globals, used for compatibility with Arduino-style sketches. +namespace +{ +tflite::ErrorReporter *error_reporter = nullptr; +const tflite::Model *model = nullptr; +tflite::MicroInterpreter *interpreter = nullptr; +TfLiteTensor *input = nullptr; +TfLiteTensor *output = nullptr; +int inference_count = 0; + +constexpr int kTensorArenaSize = 2000; +uint8_t tensor_arena[kTensorArenaSize]; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() +{ + tflite::InitializeTarget(); + + // Set up logging. Google style is to avoid globals or statics because of + // lifetime uncertainty, but since this has a trivial destructor it's okay. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroErrorReporter micro_error_reporter; + error_reporter = µ_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(g_model); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + // This pulls in all the operation implementations we need. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::AllOpsResolver resolver; + + // Build an interpreter to run the model with. + static tflite::MicroInterpreter static_interpreter( + model, resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); + return; + } + + // Obtain pointers to the model's input and output tensors. + input = interpreter->input(0); + output = interpreter->output(0); + + // Keep track of how many inferences we have performed. + inference_count = 0; +} + +// The name of this function is important for Arduino compatibility. +void loop() +{ + // Calculate an x value to feed into the model. We compare the current + // inference_count to the number of inferences per cycle to determine + // our position within the range of possible x values the model was + // trained on, and use this to calculate a value. + float position = static_cast(inference_count) / + static_cast(kInferencesPerCycle); + float x = position * kXrange; + + // Quantize the input from floating-point to integer + int8_t x_quantized = x / input->params.scale + input->params.zero_point; + // Place the quantized input in the model's input tensor + input->data.int8[0] = x_quantized; + + // Run inference, and report any error + TfLiteStatus invoke_status = interpreter->Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed on x: %f\n", + static_cast(x)); + return; + } + + // Obtain the quantized output from model's output tensor + int8_t y_quantized = output->data.int8[0]; + // Dequantize the output from integer to floating-point + float y = (y_quantized - output->params.zero_point) * output->params.scale; + + // Output the results. A custom HandleOutput function can be implemented + // for each supported hardware target. + printf("x=%f, y=%f\r\n", x, y); //// + //// TODO: HandleOutput(error_reporter, x, y); + + // Increment the inference_counter, and reset it if we have reached + // the total number per cycle + inference_count += 1; + if (inference_count >= kInferencesPerCycle) + inference_count = 0; +} diff --git a/examples/tensorflowlite/sinx/main_functions.h b/examples/tensorflowlite/sinx/main_functions.h new file mode 100644 index 00000000..4a906dd9 --- /dev/null +++ b/examples/tensorflowlite/sinx/main_functions.h @@ -0,0 +1,38 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/main_functions.h +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ + +// Expose a C friendly interface for main functions. +#ifdef __cplusplus +extern "C" { +#endif + +// Initializes all data needed for the example. The name is important, and needs +// to be setup() for Arduino compatibility. +void setup(); + +// Runs one iteration of data gathering and inference. This should be called +// repeatedly from the application code. The name needs to be loop() for Arduino +// compatibility. +void loop(); + +#ifdef __cplusplus +} +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MAIN_FUNCTIONS_H_ diff --git a/examples/tensorflowlite/sinx/model.cc b/examples/tensorflowlite/sinx/model.cc new file mode 100644 index 00000000..61596f18 --- /dev/null +++ b/examples/tensorflowlite/sinx/model.cc @@ -0,0 +1,238 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/model.cc +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Automatically created from a TensorFlow Lite flatbuffer using the command: +// xxd -i model.tflite > model.cc + +// This is a standard TensorFlow Lite model file that has been converted into a +// C data array, so it can be easily compiled into a binary for devices that +// don't have a file system. + +// See https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/train/README.md for a full description of the creation process. + +#include "model.h" + +// Keep model aligned to 8 bytes to guarantee aligned 64-bit accesses. +alignas(8) const unsigned char g_model[] = { + 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x14, 0x00, 0x20, 0x00, + 0x1c, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, + 0x2c, 0x03, 0x00, 0x00, 0x30, 0x09, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x60, 0xf7, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xbc, 0xff, 0xff, 0xff, + 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x34, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x76, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, + 0x34, 0x02, 0x00, 0x00, 0xdc, 0x01, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, + 0x6c, 0x01, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xfa, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfd, 0xff, 0xff, + 0x88, 0xfd, 0xff, 0xff, 0x8c, 0xfd, 0xff, 0xff, 0x22, 0xfe, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0xa5, 0x8b, 0xca, + 0x5e, 0x1d, 0xce, 0x42, 0x9d, 0xce, 0x1f, 0xb0, 0xdf, 0x54, 0x2f, 0x81, + 0x3e, 0xfe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xee, 0xfc, 0x00, 0xec, 0x05, 0x17, 0xef, 0xec, 0xe6, 0xf8, 0x03, 0x01, + 0x00, 0xfa, 0xf8, 0xf5, 0xdc, 0xeb, 0x27, 0x14, 0xf1, 0xde, 0xe2, 0xdb, + 0xf0, 0xde, 0x31, 0x06, 0x02, 0xe6, 0xee, 0xf9, 0x00, 0x16, 0x07, 0xe0, + 0xfe, 0xff, 0xe9, 0x06, 0xe7, 0xef, 0x81, 0x1b, 0x18, 0xea, 0xc9, 0x01, + 0x0f, 0x00, 0xda, 0xf7, 0x0e, 0xec, 0x13, 0x1f, 0x04, 0x13, 0xb4, 0xe6, + 0xfd, 0x06, 0xb9, 0xe0, 0x0d, 0xec, 0xf0, 0xde, 0xeb, 0xf7, 0x05, 0x26, + 0x1a, 0xe4, 0x6f, 0x1a, 0xea, 0x1e, 0x35, 0xdf, 0x1a, 0xf3, 0xf1, 0x19, + 0x0f, 0x03, 0x1b, 0xe1, 0xde, 0x13, 0xf6, 0x19, 0xff, 0xf6, 0x1b, 0x18, + 0xf0, 0x1c, 0xda, 0x1b, 0x1b, 0x20, 0xe5, 0x1a, 0xf5, 0xff, 0x96, 0x0b, + 0x00, 0x01, 0xcd, 0xde, 0x0d, 0xf6, 0x16, 0xe3, 0xed, 0xfc, 0x0e, 0xe9, + 0xfa, 0xeb, 0x5c, 0xfc, 0x1d, 0x02, 0x5b, 0xe2, 0xe1, 0xf5, 0x15, 0xec, + 0xf4, 0x00, 0x13, 0x05, 0xec, 0x0c, 0x1d, 0x14, 0x0e, 0xe7, 0x0b, 0xf4, + 0x19, 0x00, 0xd7, 0x05, 0x27, 0x02, 0x15, 0xea, 0xea, 0x02, 0x9b, 0x00, + 0x0c, 0xfa, 0xe8, 0xea, 0xfd, 0x00, 0x14, 0xfd, 0x0b, 0x02, 0xef, 0xee, + 0x06, 0xee, 0x01, 0x0d, 0x06, 0xe6, 0xf7, 0x11, 0xf7, 0x09, 0xf8, 0xf1, + 0x21, 0xff, 0x0e, 0xf3, 0xec, 0x12, 0x26, 0x1d, 0xf2, 0xe9, 0x28, 0x18, + 0xe0, 0xfb, 0xf3, 0xf4, 0x05, 0x1d, 0x1d, 0xfb, 0xfd, 0x1e, 0xfc, 0x11, + 0xe8, 0x07, 0x09, 0x03, 0x12, 0xf2, 0x36, 0xfb, 0xdc, 0x1c, 0xf9, 0xef, + 0xf3, 0xe7, 0x6f, 0x0c, 0x1d, 0x00, 0x45, 0xfd, 0x0e, 0xf0, 0x0b, 0x19, + 0x1a, 0xfa, 0xe0, 0x19, 0x1f, 0x13, 0x36, 0x1c, 0x12, 0xeb, 0x3b, 0x0c, + 0xb4, 0xcb, 0xe6, 0x13, 0xfa, 0xeb, 0xf1, 0x06, 0x1c, 0xfa, 0x18, 0xe5, + 0xeb, 0xcb, 0x0c, 0xf4, 0x4a, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x75, 0x1c, 0x11, 0xe1, 0x0c, 0x81, 0xa5, 0x42, + 0xfe, 0xd5, 0xd4, 0xb2, 0x61, 0x78, 0x19, 0xdf, 0x66, 0xff, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x77, 0x0b, 0x00, 0x00, 0x53, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd3, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x72, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x07, 0x00, 0x00, + 0x67, 0xf5, 0xff, 0xff, 0x34, 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xb2, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x04, 0x00, 0x00, 0x78, 0x0a, 0x00, 0x00, + 0x2d, 0x06, 0x00, 0x00, 0x71, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x9a, 0x0a, 0x00, 0x00, 0xfe, 0xf7, 0xff, 0xff, 0x0e, 0x05, 0x00, 0x00, + 0xd4, 0x09, 0x00, 0x00, 0x47, 0xfe, 0xff, 0xff, 0xb6, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0xf7, 0xff, 0xff, 0x4b, 0xf9, 0xff, 0xff, + 0x4a, 0x05, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x8c, 0xef, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x4d, 0x4c, 0x49, 0x52, 0x20, 0x43, 0x6f, 0x6e, + 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x96, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0xba, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, + 0xd0, 0x03, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, + 0x98, 0x02, 0x00, 0x00, 0x24, 0x02, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, + 0x24, 0x01, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xf0, 0xfb, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0xdc, 0xfb, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x4a, 0xce, 0x0a, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0x34, 0x84, 0x85, 0x3f, 0x01, 0x00, 0x00, 0x00, 0xc5, 0x02, 0x8f, 0xbf, + 0x1e, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, + 0x61, 0x6c, 0x6c, 0x3a, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xfc, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x6c, 0xfc, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x93, 0xd0, 0xc0, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0xc2, 0x0f, 0xc0, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x74, 0x66, 0x6c, 0x2e, 0x66, 0x75, 0x6c, 0x6c, + 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x31, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0xfd, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0xf4, 0xfc, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xe0, 0xdb, 0x47, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x04, 0x14, 0x47, 0x40, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x74, 0x66, 0x6c, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x50, 0x00, 0x00, 0x00, 0x6c, 0xfd, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xfb, 0x4b, 0x0b, 0x3c, + 0x01, 0x00, 0x00, 0x00, 0x40, 0x84, 0x4b, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x63, 0x35, 0x8a, 0xbf, 0x0d, 0x00, 0x00, 0x00, 0x73, 0x74, 0x64, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x32, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x72, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x50, 0x00, 0x00, 0x00, + 0xdc, 0xfd, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x60, 0x01, 0x4f, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x47, 0x6d, 0xb3, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x5d, 0x63, 0xcd, 0xbf, 0x0d, 0x00, 0x00, 0x00, + 0x73, 0x74, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xe2, 0xfe, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x50, 0x00, 0x00, 0x00, 0x4c, 0xfe, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xd5, 0x6b, 0x8a, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0xab, 0x49, 0x01, 0x3f, 0x01, 0x00, 0x00, 0x00, 0xfd, 0x56, 0x09, 0xbf, + 0x0c, 0x00, 0x00, 0x00, 0x73, 0x74, 0x64, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x44, 0xff, 0xff, 0xff, + 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x28, 0xb3, 0xd9, 0x38, 0x0c, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x2f, 0x62, 0x69, 0x61, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xaa, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, + 0x9c, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xdd, 0x9b, 0x21, 0x39, 0x0c, 0x00, 0x00, 0x00, + 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x33, 0x2f, 0x62, 0x69, 0x61, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, 0x13, 0x00, 0x0c, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x48, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xf4, 0xd4, 0x51, 0x38, 0x0c, 0x00, 0x00, 0x00, 0x64, 0x65, 0x6e, 0x73, + 0x65, 0x5f, 0x34, 0x2f, 0x62, 0x69, 0x61, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1c, 0x00, + 0x18, 0x00, 0x17, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x84, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x5d, 0x4f, 0xc9, 0x3c, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x86, 0xc8, 0x40, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x32, 0x5f, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x3a, 0x30, 0x5f, 0x69, 0x6e, 0x74, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0xff, + 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, + 0x0c, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09}; +const int g_model_len = 2488; diff --git a/examples/tensorflowlite/sinx/model.h b/examples/tensorflowlite/sinx/model.h new file mode 100644 index 00000000..6d47f6d9 --- /dev/null +++ b/examples/tensorflowlite/sinx/model.h @@ -0,0 +1,32 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/model.h +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Automatically created from a TensorFlow Lite flatbuffer using the command: +// xxd -i model.tflite > model.cc + +// This is a standard TensorFlow Lite model file that has been converted into a +// C data array, so it can be easily compiled into a binary for devices that +// don't have a file system. + +// See train/README.md for a full description of the creation process. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ + +extern const unsigned char g_model[]; +extern const int g_model_len; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_MODEL_H_ diff --git a/examples/tensorflowlite/sinx/output_handler.cc b/examples/tensorflowlite/sinx/output_handler.cc new file mode 100644 index 00000000..28a4c874 --- /dev/null +++ b/examples/tensorflowlite/sinx/output_handler.cc @@ -0,0 +1,25 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/output_handler.cc +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "output_handler.h" + +void HandleOutput(tflite::ErrorReporter* error_reporter, float x_value, + float y_value) { + // Log the current X and Y values + TF_LITE_REPORT_ERROR(error_reporter, "x_value: %f, y_value: %f\n", + static_cast(x_value), + static_cast(y_value)); +} diff --git a/examples/tensorflowlite/sinx/output_handler.h b/examples/tensorflowlite/sinx/output_handler.h new file mode 100644 index 00000000..4e19bea7 --- /dev/null +++ b/examples/tensorflowlite/sinx/output_handler.h @@ -0,0 +1,27 @@ +// Based on https://github.com/lupyuen/tflite-bl602/blob/main/tensorflow/lite/micro/examples/hello_world/output_handler.h +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Called by the main loop to produce some output based on the x and y values +void HandleOutput(tflite::ErrorReporter *error_reporter, float x_value, + float y_value); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_HELLO_WORLD_OUTPUT_HANDLER_H_ diff --git a/examples/tensorflowlite/sinx/proj.conf b/examples/tensorflowlite/sinx/proj.conf new file mode 100644 index 00000000..451b911c --- /dev/null +++ b/examples/tensorflowlite/sinx/proj.conf @@ -0,0 +1,3 @@ +set(CONFIG_VLIBC 0) +set(CONFIG_BFLOG 0) +set(CONFIG_TENSORFLOWLITE 1) \ No newline at end of file

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 K8Ho=cME(P5x61(l literal 0 HcmV?d00001 diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/images/model_architecture.png b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/images/model_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..ce91faddf672a3de20c4c5ef05a3d7889cf382ea GIT binary patch literal 68413 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 N002ovPDHLkV1jFP@qYjS literal 0 HcmV?d00001 diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main.cc new file mode 100644 index 00000000..30a71dd7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main.cc @@ -0,0 +1,28 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/main_functions.h" + +// This is the default main used on systems that have the standard C entry +// point. Other devices (for example FreeRTOS or ESP32) that have different +// requirements for entry code (like an app_main function) should specialize +// this main.cc file in a target-specific subfolder. +int main(int argc, char *argv[]) +{ + setup(); + while (true) { + loop(); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.cc new file mode 100644 index 00000000..39e2757b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.cc @@ -0,0 +1,179 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/main_functions.h" + +#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h" +#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h" +#include "tensorflow/lite/micro/examples/micro_speech/feature_provider.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/model.h" +#include "tensorflow/lite/micro/examples/micro_speech/recognize_commands.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Globals, used for compatibility with Arduino-style sketches. +namespace { +tflite::ErrorReporter *error_reporter = nullptr; +const tflite::Model *model = nullptr; +tflite::MicroInterpreter *interpreter = nullptr; +TfLiteTensor *model_input = nullptr; +FeatureProvider *feature_provider = nullptr; +RecognizeCommands *recognizer = nullptr; +int32_t previous_time = 0; + +// Create an area of memory to use for input, output, and intermediate arrays. +// The size of this will depend on the model you're using, and may need to be +// determined by experimentation. +constexpr int kTensorArenaSize = 10 * 1024; +uint8_t tensor_arena[kTensorArenaSize]; +int8_t feature_buffer[kFeatureElementCount]; +int8_t *model_input_buffer = nullptr; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() +{ + tflite::InitializeTarget(); + + // Set up logging. Google style is to avoid globals or statics because of + // lifetime uncertainty, but since this has a trivial destructor it's okay. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroErrorReporter micro_error_reporter; + error_reporter = µ_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(g_model); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + // An easier approach is to just use the AllOpsResolver, but this will + // incur some penalty in code space for op implementations that are not + // needed by this graph. + // + // tflite::AllOpsResolver resolver; + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroMutableOpResolver<4> micro_op_resolver(error_reporter); + if (micro_op_resolver.AddDepthwiseConv2D() != kTfLiteOk) { + return; + } + if (micro_op_resolver.AddFullyConnected() != kTfLiteOk) { + return; + } + if (micro_op_resolver.AddSoftmax() != kTfLiteOk) { + return; + } + if (micro_op_resolver.AddReshape() != kTfLiteOk) { + return; + } + + // Build an interpreter to run the model with. + static tflite::MicroInterpreter static_interpreter( + model, micro_op_resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); + return; + } + + // Get information about the memory area to use for the model's input. + model_input = interpreter->input(0); + if ((model_input->dims->size != 2) || (model_input->dims->data[0] != 1) || + (model_input->dims->data[1] != + (kFeatureSliceCount * kFeatureSliceSize)) || + (model_input->type != kTfLiteInt8)) { + TF_LITE_REPORT_ERROR(error_reporter, + "Bad input tensor parameters in model"); + return; + } + model_input_buffer = model_input->data.int8; + + // Prepare to access the audio spectrograms from a microphone or other source + // that will provide the inputs to the neural network. + // NOLINTNEXTLINE(runtime-global-variables) + static FeatureProvider static_feature_provider(kFeatureElementCount, + feature_buffer); + feature_provider = &static_feature_provider; + + static RecognizeCommands static_recognizer(error_reporter); + recognizer = &static_recognizer; + + previous_time = 0; +} + +// The name of this function is important for Arduino compatibility. +void loop() +{ + // Fetch the spectrogram for the current time. + const int32_t current_time = LatestAudioTimestamp(); + int how_many_new_slices = 0; + TfLiteStatus feature_status = feature_provider->PopulateFeatureData( + error_reporter, previous_time, current_time, &how_many_new_slices); + if (feature_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Feature generation failed"); + return; + } + previous_time = current_time; + // If no new audio samples have been received since last time, don't bother + // running the network model. + if (how_many_new_slices == 0) { + return; + } + + // Copy feature buffer to input tensor + for (int i = 0; i < kFeatureElementCount; i++) { + model_input_buffer[i] = feature_buffer[i]; + } + + // Run the model on the spectrogram input and make sure it succeeds. + TfLiteStatus invoke_status = interpreter->Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed"); + return; + } + + // Obtain a pointer to the output tensor + TfLiteTensor *output = interpreter->output(0); + // Determine whether a command was recognized based on the output of inference + const char *found_command = nullptr; + uint8_t score = 0; + bool is_new_command = false; + TfLiteStatus process_status = recognizer->ProcessLatestResults( + output, current_time, &found_command, &score, &is_new_command); + if (process_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, + "RecognizeCommands::ProcessLatestResults() failed"); + return; + } + // Do something based on the recognized command. The default implementation + // just prints to the error console, but you should replace this with your + // own function for a real application. + RespondToCommand(error_reporter, current_time, found_command, score, + is_new_command); +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.h new file mode 100644 index 00000000..d2219ade --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/main_functions.h @@ -0,0 +1,37 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MAIN_FUNCTIONS_H_ + +// Expose a C friendly interface for main functions. +#ifdef __cplusplus +extern "C" { +#endif + +// Initializes all data needed for the example. The name is important, and needs +// to be setup() for Arduino compatibility. +void setup(); + +// Runs one iteration of data gathering and inference. This should be called +// repeatedly from the application code. The name needs to be loop() for Arduino +// compatibility. +void loop(); + +#ifdef __cplusplus +} +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MAIN_FUNCTIONS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.cc new file mode 100644 index 00000000..23ea3c63 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.cc @@ -0,0 +1,119 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h" + +#include +#include + +#include "tensorflow/lite/experimental/microfrontend/lib/frontend.h" +#include "tensorflow/lite/experimental/microfrontend/lib/frontend_util.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" + +// Configure FFT to output 16 bit fixed point. +#define FIXED_POINT 16 + +namespace { + +FrontendState g_micro_features_state; +bool g_is_first_time = true; + +} // namespace + +TfLiteStatus InitializeMicroFeatures(tflite::ErrorReporter *error_reporter) +{ + FrontendConfig config; + config.window.size_ms = kFeatureSliceDurationMs; + config.window.step_size_ms = kFeatureSliceStrideMs; + config.noise_reduction.smoothing_bits = 10; + config.filterbank.num_channels = kFeatureSliceSize; + config.filterbank.lower_band_limit = 125.0; + config.filterbank.upper_band_limit = 7500.0; + config.noise_reduction.smoothing_bits = 10; + config.noise_reduction.even_smoothing = 0.025; + config.noise_reduction.odd_smoothing = 0.06; + config.noise_reduction.min_signal_remaining = 0.05; + config.pcan_gain_control.enable_pcan = 1; + config.pcan_gain_control.strength = 0.95; + config.pcan_gain_control.offset = 80.0; + config.pcan_gain_control.gain_bits = 21; + config.log_scale.enable_log = 1; + config.log_scale.scale_shift = 6; + if (!FrontendPopulateState(&config, &g_micro_features_state, + kAudioSampleFrequency)) { + TF_LITE_REPORT_ERROR(error_reporter, "FrontendPopulateState() failed"); + return kTfLiteError; + } + g_is_first_time = true; + return kTfLiteOk; +} + +// This is not exposed in any header, and is only used for testing, to ensure +// that the state is correctly set up before generating results. +void SetMicroFeaturesNoiseEstimates(const uint32_t *estimate_presets) +{ + for (int i = 0; i < g_micro_features_state.filterbank.num_channels; ++i) { + g_micro_features_state.noise_reduction.estimate[i] = estimate_presets[i]; + } +} + +TfLiteStatus GenerateMicroFeatures(tflite::ErrorReporter *error_reporter, + const int16_t *input, int input_size, + int output_size, int8_t *output, + size_t *num_samples_read) +{ + const int16_t *frontend_input; + if (g_is_first_time) { + frontend_input = input; + g_is_first_time = false; + } else { + frontend_input = input + 160; + } + FrontendOutput frontend_output = FrontendProcessSamples( + &g_micro_features_state, frontend_input, input_size, num_samples_read); + + for (size_t i = 0; i < frontend_output.size; ++i) { + // These scaling values are derived from those used in input_data.py in the + // training pipeline. + // The feature pipeline outputs 16-bit signed integers in roughly a 0 to 670 + // range. In training, these are then arbitrarily divided by 25.6 to get + // float values in the rough range of 0.0 to 26.0. This scaling is performed + // for historical reasons, to match up with the output of other feature + // generators. + // The process is then further complicated when we quantize the model. This + // means we have to scale the 0.0 to 26.0 real values to the -128 to 127 + // signed integer numbers. + // All this means that to get matching values from our integer feature + // output into the tensor input, we have to perform: + // input = (((feature / 25.6) / 26.0) * 256) - 128 + // To simplify this and perform it in 32-bit integer math, we rearrange to: + // input = (feature * 256) / (25.6 * 26.0) - 128 + constexpr int32_t value_scale = 256; + constexpr int32_t value_div = static_cast((25.6f * 26.0f) + 0.5f); + int32_t value = + ((frontend_output.values[i] * value_scale) + (value_div / 2)) / + value_div; + value -= 128; + if (value < -128) { + value = -128; + } + if (value > 127) { + value = 127; + } + output[i] = value; + } + + return kTfLiteOk; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h new file mode 100644 index 00000000..3d47e545 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h @@ -0,0 +1,32 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MICRO_FEATURES_GENERATOR_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MICRO_FEATURES_GENERATOR_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Sets up any resources needed for the feature generation pipeline. +TfLiteStatus InitializeMicroFeatures(tflite::ErrorReporter *error_reporter); + +// Converts audio sample data into a more compact form that's appropriate for +// feeding into a neural network. +TfLiteStatus GenerateMicroFeatures(tflite::ErrorReporter *error_reporter, + const int16_t *input, int input_size, + int output_size, int8_t *output, + size_t *num_samples_read); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MICRO_FEATURES_GENERATOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator_test.cc new file mode 100644 index 00000000..757c922e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator_test.cc @@ -0,0 +1,176 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_features_generator.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.h" +#include "tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +// This is a test-only API, not exposed in any public headers, so declare it. +void SetMicroFeaturesNoiseEstimates(const uint32_t *estimate_presets); + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestMicroFeaturesGeneratorYes) +{ + tflite::MicroErrorReporter micro_error_reporter; + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + InitializeMicroFeatures(µ_error_reporter)); + + // The micro features pipeline retains state from previous calls to help + // estimate the background noise. Unfortunately this makes it harder to + // exactly reproduce results in a test environment, so use a known snapshot + // of the parameters at the point that the golden feature values were + // created. + const uint32_t yes_estimate_presets[] = { + 1062898, + 2644477, + 1257642, + 1864718, + 412722, + 725703, + 395721, + 474082, + 173046, + 255856, + 158966, + 153736, + 69181, + 199100, + 144493, + 227740, + 110573, + 164330, + 79666, + 144650, + 122947, + 476799, + 398553, + 497493, + 322152, + 1140005, + 566716, + 690605, + 308902, + 347481, + 109891, + 170457, + 73901, + 100975, + 42963, + 72325, + 34183, + 20207, + 6640, + 9468, + }; + SetMicroFeaturesNoiseEstimates(yes_estimate_presets); + + int8_t yes_calculated_data[g_yes_feature_data_slice_size]; + size_t num_samples_read; + TfLiteStatus yes_status = GenerateMicroFeatures( + µ_error_reporter, g_yes_30ms_sample_data, + g_yes_30ms_sample_data_size, g_yes_feature_data_slice_size, + yes_calculated_data, &num_samples_read); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, yes_status); + + for (int i = 0; i < g_yes_feature_data_slice_size; ++i) { + const int expected = g_yes_feature_data_slice[i]; + const int actual = yes_calculated_data[i]; + TF_LITE_MICRO_EXPECT_EQ(expected, actual); + if (expected != actual) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Expected value %d but found %d", expected, actual); + } + } +} + +TF_LITE_MICRO_TEST(TestMicroFeaturesGeneratorNo) +{ + tflite::MicroErrorReporter micro_error_reporter; + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + InitializeMicroFeatures(µ_error_reporter)); + // As we did for the previous features, set known good noise state + // parameters. + const uint32_t no_estimate_presets[] = { + 2563964, + 1909393, + 559801, + 538670, + 203643, + 175959, + 75088, + 139491, + 59691, + 95307, + 43865, + 129263, + 52517, + 80058, + 51330, + 100731, + 76674, + 76262, + 15497, + 22598, + 13778, + 21460, + 8946, + 17806, + 10023, + 18810, + 8002, + 10842, + 7578, + 9983, + 6267, + 10759, + 8946, + 18488, + 9691, + 39785, + 9939, + 17835, + 9671, + 18512, + }; + SetMicroFeaturesNoiseEstimates(no_estimate_presets); + + int8_t no_calculated_data[g_no_feature_data_slice_size]; + size_t num_samples_read; + TfLiteStatus no_status = GenerateMicroFeatures( + µ_error_reporter, g_no_30ms_sample_data, g_no_30ms_sample_data_size, + g_no_feature_data_slice_size, no_calculated_data, &num_samples_read); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, no_status); + + for (size_t i = 0; i < g_no_feature_data_slice_size; ++i) { + const int expected = g_no_feature_data_slice[i]; + const int actual = no_calculated_data[i]; + TF_LITE_MICRO_EXPECT_EQ(expected, actual); + if (expected != actual) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Expected value %d but found %d", expected, actual); + } + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.cc new file mode 100644 index 00000000..ce8d768b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.cc @@ -0,0 +1,23 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" + +const char *kCategoryLabels[kCategoryCount] = { + "silence", + "unknown", + "yes", + "no", +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h new file mode 100644 index 00000000..05dbb788 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h @@ -0,0 +1,43 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MICRO_MODEL_SETTINGS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MICRO_MODEL_SETTINGS_H_ + +// Keeping these as constant expressions allow us to allocate fixed-sized arrays +// on the stack for our working memory. + +// The size of the input time series data we pass to the FFT to produce the +// frequency information. This has to be a power of two, and since we're dealing +// with 30ms of 16KHz inputs, which means 480 samples, this is the next value. +constexpr int kMaxAudioSampleSize = 512; +constexpr int kAudioSampleFrequency = 16000; + +// The following values are derived from values used during model training. +// If you change the way you preprocess the input, update all these constants. +constexpr int kFeatureSliceSize = 40; +constexpr int kFeatureSliceCount = 49; +constexpr int kFeatureElementCount = (kFeatureSliceSize * kFeatureSliceCount); +constexpr int kFeatureSliceStrideMs = 20; +constexpr int kFeatureSliceDurationMs = 30; + +// Variables for the model's output categories. +constexpr int kSilenceIndex = 0; +constexpr int kUnknownIndex = 1; +// If you modify the output categories, you need to update the following values. +constexpr int kCategoryCount = 4; +extern const char *kCategoryLabels[kCategoryCount]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MICRO_MODEL_SETTINGS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.cc new file mode 100644 index 00000000..a4e5cb30 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.cc @@ -0,0 +1,1597 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This is a standard TensorFlow Lite FlatBuffer model file that has been +// converted into a C data array, so it can be easily compiled into a binary +// for devices that don't have a file system. It was created using the command: +// xxd -i model.tflite > model.cc + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/model.h" + +// We need to keep the data array aligned on some architectures. +#ifdef __has_attribute +#define HAVE_ATTRIBUTE(x) __has_attribute(x) +#else +#define HAVE_ATTRIBUTE(x) 0 +#endif +#if HAVE_ATTRIBUTE(aligned) || (defined(__GNUC__) && !defined(__clang__)) +#define DATA_ALIGN_ATTRIBUTE __attribute__((aligned(4))) +#else +#define DATA_ALIGN_ATTRIBUTE +#endif + +const unsigned char g_model[] DATA_ALIGN_ATTRIBUTE = { + 0x20, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x94, 0x48, 0x00, 0x00, 0x34, 0x42, 0x00, 0x00, + 0x1c, 0x42, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xd4, 0x41, 0x00, 0x00, + 0xb4, 0x41, 0x00, 0x00, 0x24, 0x03, 0x00, 0x00, 0xf4, 0x02, 0x00, 0x00, + 0xec, 0x02, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0xc4, 0x02, 0x00, 0x00, + 0xbc, 0x02, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x16, 0xbd, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x31, 0x2e, 0x35, 0x2e, + 0x30, 0x00, 0x00, 0x00, 0x94, 0xba, 0xff, 0xff, 0x98, 0xba, 0xff, 0xff, + 0x32, 0xbd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, + 0xfa, 0xee, 0x28, 0xc4, 0xee, 0xfe, 0xcf, 0x0f, 0x1e, 0xf7, 0x1f, 0x06, + 0x0d, 0xed, 0xe9, 0x83, 0x5c, 0xc9, 0x18, 0xe3, 0xf9, 0x14, 0x28, 0x2a, + 0x09, 0xf2, 0x18, 0x34, 0x62, 0xea, 0xef, 0xd6, 0x36, 0xb7, 0x1e, 0xf7, + 0x3b, 0x22, 0x28, 0x39, 0xc2, 0x9d, 0xf1, 0x07, 0x5e, 0x0b, 0x1e, 0x2c, + 0x07, 0xdd, 0xfd, 0xc3, 0xd8, 0x4a, 0xf3, 0x28, 0xa7, 0x16, 0xd5, 0xf1, + 0xc3, 0x05, 0xfd, 0x27, 0xcc, 0xba, 0x1e, 0xcb, 0xd7, 0x3d, 0xd4, 0x29, + 0x00, 0xfd, 0x28, 0x44, 0xfb, 0xf2, 0xf3, 0xb6, 0x4f, 0xcf, 0x09, 0xf0, + 0xfa, 0x45, 0x41, 0x49, 0x05, 0xc5, 0x17, 0x5d, 0x64, 0x00, 0xf8, 0xee, + 0x48, 0x17, 0xf4, 0xe9, 0x2e, 0x4b, 0x2e, 0x3f, 0xdf, 0xee, 0xe4, 0x08, + 0x38, 0xf1, 0x16, 0x13, 0x2f, 0x2a, 0xed, 0xc2, 0xbf, 0x36, 0xf4, 0x02, + 0xcf, 0xaa, 0xd2, 0xfa, 0xac, 0x13, 0xf6, 0xe8, 0xb5, 0x68, 0x12, 0xb6, + 0xce, 0x0e, 0xdf, 0x58, 0xe4, 0x49, 0x14, 0x15, 0x03, 0xed, 0xfa, 0xd4, + 0x40, 0xa7, 0xf6, 0xca, 0xfb, 0x00, 0x4d, 0x5e, 0xe4, 0x55, 0x1d, 0x30, + 0x45, 0xe2, 0xfc, 0x01, 0x48, 0x81, 0xe9, 0xf1, 0x1e, 0xfc, 0x21, 0x32, + 0xed, 0x4b, 0xed, 0xfa, 0x2f, 0xd2, 0xfa, 0xfb, 0x4d, 0xa7, 0xed, 0xc7, + 0x92, 0xdf, 0xe6, 0xdb, 0xf8, 0x1f, 0xd9, 0xfa, 0x91, 0xf5, 0xe5, 0xc5, + 0x8c, 0x17, 0x0f, 0xb9, 0xd2, 0xc7, 0xfe, 0x68, 0xd3, 0x51, 0x2e, 0x49, + 0x1f, 0xbd, 0x01, 0xeb, 0x31, 0x17, 0xf0, 0xef, 0xff, 0xb8, 0x5d, 0x62, + 0x02, 0x0f, 0x1f, 0x78, 0x6a, 0xb0, 0xf9, 0xfe, 0x4f, 0xcc, 0xd3, 0xff, + 0x0a, 0x96, 0x1e, 0x2c, 0xed, 0xbc, 0xf4, 0x0b, 0x42, 0xc8, 0xf1, 0xea, + 0x6e, 0x58, 0xec, 0xc4, 0x99, 0xae, 0xdc, 0xd7, 0x12, 0x87, 0xd8, 0x06, + 0xa2, 0xc2, 0xe6, 0xa2, 0x81, 0x24, 0xe9, 0xac, 0xce, 0xb6, 0x15, 0x6b, + 0xba, 0x00, 0x19, 0x58, 0x29, 0xb6, 0xfe, 0x01, 0x25, 0x96, 0xd2, 0xec, + 0x0e, 0x9c, 0x60, 0x5f, 0xe9, 0xf4, 0xf5, 0x69, 0x6b, 0xb5, 0xe1, 0xf6, + 0x5e, 0xb7, 0xb1, 0xe5, 0x11, 0x9b, 0x18, 0x10, 0xe3, 0xe1, 0xe0, 0x0d, + 0x4f, 0xa5, 0xde, 0xe5, 0x6f, 0xe2, 0xfb, 0x99, 0x82, 0xa5, 0xc9, 0xb6, + 0x1f, 0x46, 0xf3, 0x04, 0xc6, 0xca, 0xd6, 0x97, 0x90, 0x1d, 0xc0, 0x95, + 0xf0, 0x19, 0x30, 0x77, 0xc2, 0x3c, 0xfa, 0x24, 0x02, 0x4d, 0x06, 0x07, + 0x15, 0x02, 0xb0, 0xe7, 0x27, 0x22, 0x67, 0x4d, 0xf1, 0xc2, 0xf4, 0x64, + 0x38, 0x40, 0xdf, 0xf6, 0x3a, 0x43, 0xb8, 0xe1, 0x0d, 0x15, 0x11, 0xfe, + 0xf5, 0xec, 0xf9, 0xe5, 0x22, 0x36, 0xe4, 0xfd, 0x6d, 0xbf, 0x0d, 0x8e, + 0xb7, 0x15, 0xbf, 0x9f, 0x16, 0xad, 0x0a, 0x02, 0x8e, 0x14, 0xda, 0x9b, + 0x8e, 0xc3, 0xa6, 0xca, 0xf5, 0x7f, 0x51, 0x56, 0xc1, 0xb3, 0xd9, 0x35, + 0xf8, 0x7f, 0x04, 0x0a, 0x03, 0x3f, 0xbe, 0xee, 0x19, 0x68, 0x78, 0x50, + 0xf9, 0xa7, 0xf7, 0x7f, 0x1d, 0x76, 0xdb, 0xe8, 0x33, 0xb9, 0xd7, 0xe7, + 0xe8, 0x69, 0x15, 0xf7, 0xf5, 0xb2, 0xfe, 0xe8, 0xf3, 0x5b, 0xe2, 0x06, + 0x6e, 0x09, 0x36, 0xb7, 0xcc, 0x38, 0xbf, 0x8a, 0x28, 0x14, 0x2e, 0x18, + 0xa7, 0x26, 0xcb, 0xb2, 0x95, 0x37, 0xac, 0xcd, 0xd7, 0x51, 0x67, 0x44, + 0xcd, 0x31, 0xde, 0x04, 0xe9, 0x6a, 0x00, 0x13, 0x0a, 0x0c, 0xdd, 0x16, + 0xe0, 0x24, 0x7e, 0x49, 0xf1, 0xb5, 0x04, 0x52, 0x01, 0x50, 0xdd, 0xf5, + 0x26, 0xc9, 0xf4, 0xf8, 0xd6, 0x31, 0x1b, 0xd0, 0xef, 0x03, 0x0a, 0xc0, + 0xd4, 0x4f, 0xe2, 0xfd, 0x72, 0xf4, 0x5a, 0xc9, 0xd7, 0x31, 0xc0, 0x8e, + 0x17, 0x5e, 0x57, 0x00, 0xb4, 0x3a, 0xc8, 0xd2, 0x92, 0x32, 0xcb, 0xd8, + 0xc3, 0xa6, 0x63, 0x26, 0xcf, 0xbc, 0xe8, 0x57, 0x9b, 0xe9, 0xf7, 0x1c, + 0xea, 0x12, 0xf1, 0xf7, 0xdb, 0xb9, 0x7f, 0x16, 0xf6, 0xe0, 0x08, 0x70, + 0xa2, 0xed, 0xcc, 0xf1, 0x1e, 0x10, 0x04, 0xf7, 0xa9, 0xb7, 0x34, 0xaa, + 0x0a, 0xdb, 0x2a, 0xa6, 0xb6, 0x10, 0xea, 0xf8, 0x5e, 0x06, 0x72, 0xdd, + 0xd0, 0xb9, 0xd6, 0xa0, 0x10, 0x9f, 0x5a, 0x17, 0xb1, 0xe7, 0xc0, 0x01, + 0x9d, 0x01, 0xe0, 0xe0, 0xaf, 0x9c, 0x46, 0xd8, 0xaf, 0xe8, 0xce, 0x02, + 0x8a, 0xbb, 0xe4, 0xf6, 0xf3, 0x36, 0x07, 0xca, 0xcb, 0x87, 0x6e, 0xcc, + 0xd6, 0x9e, 0x0a, 0x2a, 0x81, 0xd7, 0xcf, 0xc0, 0x04, 0xeb, 0x24, 0xcc, + 0xc9, 0x95, 0x33, 0x81, 0xf7, 0xad, 0x1c, 0x9c, 0xa4, 0xd6, 0xf9, 0xe6, + 0x3d, 0x84, 0x7f, 0xcc, 0xd4, 0xb0, 0xf4, 0xa2, 0xe9, 0x3c, 0x36, 0xee, + 0xd5, 0xcf, 0xcd, 0x2d, 0x28, 0xbd, 0xff, 0xff, 0xc2, 0xbf, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x31, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x48, 0xbd, 0xff, 0xff, 0x4c, 0xbd, 0xff, 0xff, 0xe6, 0xbf, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x8a, 0xfe, 0xff, 0xff, + 0xa9, 0x00, 0x00, 0x00, 0xd0, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x4f, 0xfb, 0xff, 0xff, + 0x4a, 0xfd, 0xff, 0xff, 0x12, 0xc0, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x80, 0x3e, 0x00, 0x00, 0xff, 0xf9, 0xfd, 0x0a, 0x07, 0x08, 0x07, 0x03, + 0x07, 0xf2, 0xd1, 0x09, 0xf0, 0xe9, 0x28, 0x09, 0xdf, 0x05, 0xfa, 0xf0, + 0xe8, 0xe3, 0x13, 0x0e, 0x08, 0xef, 0xd3, 0xee, 0x0f, 0xe8, 0xeb, 0x14, + 0xf7, 0xed, 0xfd, 0x1f, 0xe8, 0xd5, 0xeb, 0xfc, 0x0e, 0xf4, 0xf7, 0x07, + 0x05, 0xea, 0xf6, 0x1f, 0xf8, 0xdb, 0xdc, 0x0b, 0x03, 0xdd, 0xd8, 0xf3, + 0x0f, 0x19, 0xe1, 0x09, 0xfc, 0xe4, 0x02, 0x04, 0xf1, 0x04, 0xeb, 0xf3, + 0x1e, 0x06, 0xfd, 0x11, 0xfc, 0xfa, 0xf6, 0x1f, 0x0f, 0x02, 0xf5, 0xf7, + 0xff, 0x24, 0xdf, 0xf7, 0xf8, 0xf3, 0xf6, 0xe9, 0xef, 0x03, 0xdd, 0xf2, + 0x28, 0xe1, 0xf2, 0x22, 0xf4, 0x09, 0xf7, 0xf9, 0xf0, 0xd4, 0xf9, 0xee, + 0xff, 0x14, 0xda, 0xf3, 0x11, 0xe2, 0xf6, 0x0c, 0xf2, 0xeb, 0xf8, 0xe8, + 0xe3, 0x08, 0x02, 0x17, 0xf4, 0x0b, 0x0c, 0x27, 0xe6, 0x02, 0x03, 0xf9, + 0x14, 0x18, 0xf6, 0xeb, 0x1f, 0x0c, 0xf1, 0xee, 0xfc, 0x08, 0xf0, 0xfe, + 0xfd, 0xee, 0x17, 0xfd, 0x1c, 0xef, 0xfd, 0xde, 0x04, 0x05, 0xf0, 0x31, + 0xfa, 0x0b, 0xdc, 0x0d, 0xed, 0xf5, 0xfa, 0xf4, 0x08, 0x0c, 0xd7, 0x1e, + 0x15, 0x03, 0xf5, 0x02, 0xf4, 0xfb, 0xed, 0x01, 0xfe, 0xd6, 0x1f, 0xfd, + 0xfd, 0x0e, 0xfa, 0x06, 0xf1, 0xf9, 0xe2, 0x16, 0xe9, 0xf1, 0x03, 0x0d, + 0x0d, 0xdf, 0xf9, 0x1a, 0x0e, 0xf6, 0xfc, 0x0a, 0x19, 0xe2, 0xe0, 0x09, + 0x15, 0xf0, 0xf1, 0x06, 0xf1, 0xe1, 0xef, 0x1a, 0x08, 0xe8, 0xfd, 0x12, + 0x14, 0x06, 0xf1, 0xfc, 0xea, 0xfb, 0xf7, 0xea, 0x1d, 0x09, 0xfa, 0xf6, + 0x08, 0xf2, 0xe7, 0xf8, 0xfc, 0x16, 0xf5, 0x0e, 0x08, 0xf9, 0x0a, 0x03, + 0x26, 0xd8, 0x02, 0xf5, 0xf6, 0xf6, 0xef, 0x1f, 0xe4, 0xe2, 0xfb, 0x02, + 0x1b, 0xe6, 0xde, 0x00, 0xf2, 0xed, 0xfb, 0x18, 0xe4, 0x16, 0x1a, 0x1d, + 0xf1, 0xf6, 0xea, 0x16, 0x05, 0xde, 0xfb, 0x18, 0xf5, 0xe4, 0xfe, 0xe2, + 0x1b, 0x1c, 0x0c, 0xe8, 0x02, 0xee, 0xfb, 0x07, 0x24, 0xf2, 0xe9, 0xfa, + 0x0d, 0x05, 0xf1, 0x03, 0xfe, 0xf6, 0x19, 0x06, 0xff, 0xf9, 0x04, 0xfb, + 0x15, 0xef, 0xf1, 0xf8, 0xe9, 0xe1, 0x10, 0x04, 0xfc, 0xe6, 0x1f, 0xed, + 0x0b, 0xef, 0x00, 0x1e, 0xe6, 0x16, 0xf3, 0x09, 0xfd, 0x08, 0x08, 0x06, + 0x06, 0x23, 0xdf, 0xfc, 0x08, 0xf4, 0xea, 0x0c, 0xf2, 0xe6, 0x18, 0xf5, + 0x02, 0xf9, 0x50, 0x09, 0x01, 0xda, 0x0b, 0x05, 0x12, 0x18, 0xef, 0x04, + 0x0e, 0xd9, 0xff, 0xdc, 0xf6, 0x16, 0xf9, 0xf4, 0xec, 0xff, 0xea, 0xe6, + 0xfa, 0x0a, 0xed, 0xef, 0x02, 0xf0, 0x25, 0x21, 0xf1, 0x26, 0xf5, 0xed, + 0x09, 0xea, 0xea, 0x24, 0xfa, 0x11, 0xfc, 0xdf, 0xf3, 0x0a, 0x28, 0x0c, + 0x19, 0xff, 0xf5, 0xd6, 0x0e, 0xe2, 0x2a, 0x06, 0xfa, 0x03, 0xf9, 0xe6, + 0xef, 0x23, 0xf9, 0xfa, 0xe6, 0xfe, 0xfc, 0x03, 0x06, 0x1a, 0xf9, 0x08, + 0xe0, 0xe5, 0xff, 0x05, 0x01, 0xe7, 0x12, 0x02, 0x1d, 0x05, 0x03, 0x05, + 0x0b, 0xee, 0xed, 0xfc, 0x0f, 0xf3, 0x02, 0xe0, 0x15, 0xdf, 0x02, 0xed, + 0x10, 0x26, 0xef, 0x0d, 0x06, 0xee, 0xef, 0xf6, 0xeb, 0x11, 0x09, 0xf4, + 0xf7, 0x06, 0x0f, 0x01, 0x2a, 0x0b, 0x01, 0xdd, 0xfc, 0xf4, 0xf1, 0x17, + 0x03, 0x04, 0x07, 0xfc, 0x22, 0xfc, 0xde, 0xfe, 0x0b, 0x03, 0xf3, 0xfb, + 0x0c, 0x25, 0x04, 0x19, 0x04, 0x03, 0x01, 0xfa, 0xfb, 0xf7, 0xf6, 0x0e, + 0x15, 0x0e, 0x09, 0xff, 0x06, 0xfa, 0xfb, 0x1e, 0xfb, 0x05, 0x22, 0xf9, + 0xfe, 0xf7, 0x1d, 0xed, 0xdf, 0x18, 0x09, 0xeb, 0xef, 0x04, 0x12, 0xea, + 0xdf, 0xfb, 0xda, 0xf6, 0xdf, 0x17, 0xef, 0xef, 0xe1, 0x1a, 0xd9, 0xe2, + 0xe2, 0xfc, 0x05, 0x11, 0xf6, 0xee, 0xe8, 0xf2, 0xe1, 0x08, 0x26, 0x04, + 0xed, 0x03, 0xe0, 0xfb, 0xee, 0x0c, 0xee, 0xf6, 0x04, 0x2d, 0xf2, 0xd3, + 0xf4, 0xe0, 0xf8, 0x0c, 0xfe, 0x11, 0x0b, 0xd7, 0xfd, 0x18, 0x07, 0x0d, + 0x07, 0x08, 0xf4, 0xc6, 0x0a, 0x0a, 0x1f, 0x0c, 0xf4, 0x1d, 0x02, 0x0b, + 0x09, 0x0e, 0x21, 0xff, 0x17, 0x0b, 0x0d, 0xf2, 0xed, 0xd7, 0x0a, 0xf8, + 0x03, 0x06, 0xfa, 0xe5, 0xfd, 0x03, 0x14, 0x0f, 0xe9, 0x1a, 0xf4, 0xda, + 0x01, 0xe6, 0x09, 0x06, 0x11, 0x0d, 0xfd, 0xeb, 0x16, 0x23, 0xfa, 0x00, + 0x0b, 0x17, 0xf7, 0xda, 0xd7, 0x1b, 0xfa, 0x01, 0x03, 0x05, 0xfe, 0xd6, + 0x02, 0xee, 0xee, 0x02, 0xf3, 0x06, 0xed, 0x03, 0xec, 0x01, 0xf2, 0x0f, + 0x05, 0x17, 0x0b, 0xfb, 0x0f, 0x05, 0x03, 0x13, 0xff, 0x06, 0x02, 0xf5, + 0xf4, 0x18, 0x2b, 0xf0, 0x00, 0x17, 0xfc, 0xfd, 0x05, 0x0b, 0x0e, 0x14, + 0xe1, 0x24, 0x08, 0x24, 0xe6, 0xeb, 0x21, 0x12, 0xfb, 0x12, 0xe7, 0xf4, + 0xe8, 0x0e, 0x18, 0xee, 0xf5, 0xf3, 0xd9, 0xf3, 0xdb, 0xec, 0x0c, 0x1e, + 0xcf, 0x14, 0xdb, 0xe3, 0xdc, 0x02, 0x0c, 0xfb, 0xdb, 0x1b, 0xd0, 0xfe, + 0xf9, 0xfe, 0x2a, 0xf5, 0x00, 0x0b, 0xcd, 0xe0, 0xe2, 0x0e, 0x04, 0xf8, + 0xda, 0x1c, 0xe5, 0x0f, 0xe8, 0xf4, 0xf7, 0x15, 0x06, 0xf8, 0x02, 0xf7, + 0x0f, 0xfb, 0x17, 0xf9, 0xda, 0x01, 0xda, 0xd1, 0xf6, 0x02, 0xfd, 0x16, + 0xf1, 0xe4, 0xfa, 0x07, 0xee, 0x0a, 0xf3, 0xfd, 0xf2, 0x23, 0xf0, 0xe1, + 0x0a, 0x1a, 0x12, 0x1f, 0xef, 0x27, 0x09, 0xf1, 0x0c, 0x13, 0x23, 0xfd, + 0xf5, 0x03, 0xfe, 0x09, 0xfd, 0x16, 0xf8, 0x07, 0x08, 0x25, 0x08, 0xf8, + 0xf6, 0x0a, 0xf1, 0xf5, 0x07, 0x09, 0x05, 0xcc, 0xf8, 0x08, 0x13, 0xf9, + 0x1d, 0x11, 0x0f, 0xdc, 0xee, 0xf3, 0x27, 0xf9, 0xf9, 0x22, 0xfa, 0x0d, + 0xe2, 0x13, 0xfb, 0x11, 0x03, 0x1e, 0xff, 0xfb, 0xed, 0xf1, 0x0e, 0x0b, + 0x0f, 0x00, 0x06, 0xe0, 0x15, 0xf3, 0x13, 0xfc, 0x18, 0xf9, 0xff, 0x09, + 0xfa, 0x1f, 0x12, 0xe5, 0xe2, 0x06, 0xf9, 0xf4, 0x07, 0x15, 0x0b, 0x04, + 0xdb, 0x0d, 0xeb, 0xf3, 0xe6, 0x06, 0xe5, 0xee, 0xd8, 0x22, 0xd8, 0x10, + 0xea, 0xf9, 0x1c, 0xf7, 0xd3, 0x11, 0xc3, 0xf8, 0xde, 0x05, 0x00, 0xe6, + 0x07, 0xfd, 0xd3, 0x03, 0xea, 0xe0, 0x13, 0x14, 0xcf, 0xeb, 0xcd, 0xd3, + 0xde, 0xf5, 0xf0, 0x0c, 0x0c, 0xfa, 0xeb, 0xd3, 0xfb, 0xfd, 0x08, 0xf9, + 0xf4, 0x10, 0xfa, 0xd3, 0xf4, 0x11, 0x11, 0xf8, 0xef, 0xf8, 0xf8, 0xf1, + 0xfc, 0xe1, 0xf7, 0x12, 0x04, 0xf4, 0xfb, 0xed, 0xef, 0x0c, 0xfd, 0x1c, + 0xfe, 0x0e, 0xfd, 0xe2, 0xfe, 0x0a, 0x02, 0xfe, 0xe6, 0x1f, 0xef, 0xe5, + 0xe6, 0xf8, 0x16, 0x27, 0xe8, 0x20, 0x05, 0xe3, 0xf1, 0xef, 0xee, 0xed, + 0x0d, 0x11, 0x16, 0xfb, 0xf3, 0xff, 0x14, 0x01, 0xff, 0x15, 0x10, 0x02, + 0xe5, 0x28, 0x29, 0x13, 0x13, 0x16, 0xe6, 0x00, 0xd2, 0x26, 0xfd, 0x03, + 0x04, 0x05, 0x07, 0x06, 0xf1, 0x0e, 0x05, 0x0d, 0xe2, 0x0f, 0x02, 0xe1, + 0x07, 0xf7, 0x1c, 0xfa, 0x14, 0x30, 0xf7, 0xee, 0x00, 0xfa, 0x3d, 0x06, + 0x1c, 0x04, 0x06, 0x07, 0x05, 0x1a, 0x10, 0xf6, 0xee, 0x0a, 0xeb, 0x04, + 0xeb, 0xdf, 0x1d, 0x09, 0xd5, 0xe8, 0xd6, 0xf4, 0xf0, 0x0f, 0x1d, 0xea, + 0xf2, 0xf8, 0xa6, 0x0b, 0xdc, 0x09, 0x08, 0x24, 0xee, 0x24, 0xaa, 0xe4, + 0xcb, 0x15, 0xef, 0xe7, 0xe9, 0x0c, 0xcf, 0x06, 0xe3, 0x12, 0x11, 0x00, + 0x07, 0x14, 0xd7, 0xde, 0xf6, 0x0f, 0x0b, 0x04, 0xfb, 0x0d, 0xf8, 0x0d, + 0xf6, 0x1b, 0xf1, 0x21, 0xdd, 0xfc, 0xf4, 0xe9, 0xf8, 0xe8, 0xf7, 0x06, + 0x03, 0x1e, 0xce, 0xe1, 0xea, 0xf6, 0x05, 0xf9, 0x16, 0x15, 0x04, 0xe0, + 0x14, 0xf7, 0x1e, 0x1c, 0x0a, 0x27, 0xef, 0xf3, 0x0f, 0xf3, 0xee, 0x04, + 0xf8, 0xf1, 0x07, 0xe3, 0x05, 0x0b, 0x00, 0x1c, 0x15, 0x27, 0x07, 0xf7, + 0xfa, 0x0b, 0xfa, 0xfa, 0x17, 0x13, 0xe1, 0xf5, 0xfb, 0x0c, 0x21, 0x2f, + 0xd7, 0xfb, 0xf5, 0xfd, 0xd3, 0xf4, 0x07, 0x0e, 0xfd, 0x0b, 0xfc, 0xfa, + 0xf5, 0x0e, 0x02, 0xfa, 0xfa, 0x19, 0xfd, 0xfa, 0xfc, 0x13, 0x24, 0x0c, + 0xe4, 0x31, 0xf8, 0x12, 0xf4, 0x04, 0x18, 0x29, 0x27, 0x19, 0xfc, 0x08, + 0x11, 0xe3, 0x07, 0xfe, 0x26, 0x40, 0x05, 0x02, 0x04, 0x02, 0x0f, 0xee, + 0xf4, 0x27, 0xea, 0xf4, 0xf5, 0x11, 0x26, 0x0b, 0xe7, 0x05, 0xd2, 0xf6, + 0xea, 0xfa, 0x0b, 0xf9, 0xfa, 0x16, 0xba, 0x00, 0xfb, 0x0d, 0x0b, 0xf9, + 0xe6, 0xf6, 0xc5, 0xf8, 0xf6, 0x01, 0x0f, 0xed, 0xed, 0x13, 0xcd, 0x0d, + 0xda, 0x06, 0x17, 0xee, 0x07, 0x1d, 0xb8, 0xfa, 0xe2, 0xea, 0xf2, 0xee, + 0x04, 0x00, 0xdc, 0xd0, 0xfb, 0xf5, 0xec, 0xfe, 0xf1, 0x0d, 0xf0, 0xdb, + 0xf9, 0x0d, 0x03, 0x03, 0x0e, 0x0a, 0xda, 0xd6, 0x01, 0xf2, 0x06, 0x14, + 0x1c, 0x1f, 0xe8, 0xe8, 0x0e, 0xfd, 0x0c, 0xf5, 0xf3, 0x3d, 0xf3, 0x05, + 0x10, 0xfa, 0x1b, 0x18, 0x08, 0x36, 0x09, 0xf1, 0xeb, 0xf9, 0x22, 0x01, + 0xf3, 0xf7, 0xff, 0xf0, 0x0c, 0xe9, 0x01, 0x29, 0x21, 0x15, 0x03, 0xee, + 0xe9, 0x1a, 0xf7, 0x15, 0x06, 0x25, 0xfa, 0xf0, 0xe4, 0xf1, 0x1f, 0x01, + 0xdc, 0x2d, 0xce, 0xe9, 0xea, 0x0b, 0x06, 0x2c, 0x0a, 0x30, 0xe7, 0x09, + 0xf4, 0xf0, 0x10, 0x29, 0xf9, 0x3d, 0xe7, 0xdc, 0xe4, 0xf7, 0x3b, 0x27, + 0x23, 0x3a, 0x0a, 0x06, 0x0e, 0xfd, 0x2c, 0x07, 0x2b, 0x1c, 0xfa, 0x00, + 0xf9, 0x11, 0xea, 0x14, 0xeb, 0xfc, 0x18, 0x03, 0xf1, 0x16, 0x12, 0x04, + 0xcf, 0x12, 0xdd, 0xe4, 0x0e, 0xf0, 0x09, 0xe8, 0xf3, 0xfb, 0xa8, 0xf9, + 0xee, 0xfb, 0x1e, 0x1d, 0xfd, 0x05, 0xab, 0xe5, 0xff, 0x01, 0xfe, 0x04, + 0xf9, 0x02, 0xb9, 0xdc, 0xdf, 0x05, 0xf1, 0xef, 0xf1, 0x1e, 0xc7, 0xee, + 0xf7, 0x1e, 0x00, 0x00, 0xf8, 0x10, 0xec, 0xe8, 0x04, 0x0f, 0xf6, 0xff, + 0x04, 0x09, 0xe0, 0x0a, 0x0e, 0xe4, 0xf0, 0xf1, 0x16, 0x2b, 0xd3, 0xe1, + 0x0a, 0xef, 0xf9, 0xfe, 0x0b, 0x22, 0xf5, 0x01, 0x0a, 0xf8, 0x02, 0x00, + 0x17, 0x19, 0xf3, 0x05, 0x21, 0xfa, 0xee, 0xee, 0x12, 0xf2, 0xfa, 0xf5, + 0x05, 0x12, 0xee, 0xe4, 0x28, 0xfa, 0xf1, 0x03, 0x15, 0x16, 0x18, 0xfd, + 0x0f, 0x21, 0x04, 0xf4, 0xe5, 0x0c, 0x06, 0x13, 0xde, 0x36, 0xe8, 0xfb, + 0xe7, 0xfd, 0xf6, 0x12, 0x0e, 0x1d, 0xea, 0xf8, 0xd4, 0xe8, 0x19, 0x07, + 0xe5, 0x1c, 0xf7, 0x0c, 0xef, 0x05, 0x0f, 0x09, 0xdd, 0x1a, 0xea, 0xd7, + 0xf9, 0xf9, 0x12, 0x17, 0x2e, 0x10, 0x08, 0xfe, 0x14, 0xf5, 0x1d, 0xfa, + 0x06, 0x33, 0xed, 0xfe, 0xf7, 0x11, 0xf0, 0x15, 0xe2, 0x24, 0xf6, 0x0a, + 0xe2, 0xfc, 0x23, 0x12, 0xdd, 0x11, 0xfd, 0xe5, 0x08, 0xff, 0x15, 0xf6, + 0xf1, 0x1b, 0xae, 0xfe, 0xe6, 0x15, 0x2c, 0x2d, 0x15, 0x15, 0xc5, 0xf8, + 0xea, 0xe7, 0x07, 0x04, 0xfe, 0x28, 0xa1, 0xf2, 0xe1, 0xf9, 0xf8, 0xff, + 0xf4, 0x22, 0xb4, 0xdb, 0x03, 0x20, 0xe6, 0xf3, 0x0e, 0x19, 0xe3, 0x0a, + 0xfa, 0xee, 0xf3, 0xe5, 0xd8, 0xf9, 0xf1, 0xde, 0x06, 0x05, 0xf2, 0xf5, + 0xe7, 0x16, 0xd8, 0xfe, 0x07, 0xea, 0xee, 0x0e, 0xfa, 0xff, 0xdb, 0xe7, + 0x03, 0xed, 0x01, 0xfd, 0x09, 0x1a, 0xfa, 0xe6, 0x05, 0x10, 0xe9, 0x01, + 0x1f, 0x13, 0xf7, 0xf6, 0xfb, 0x13, 0xff, 0xdb, 0xed, 0xfe, 0x0a, 0x10, + 0x09, 0x29, 0xf5, 0x04, 0xf5, 0x26, 0x0d, 0x0c, 0xf9, 0x16, 0xfa, 0x02, + 0xf4, 0x2e, 0xde, 0xf5, 0xe1, 0x1d, 0xfb, 0x02, 0x0b, 0x23, 0x07, 0xea, + 0xd9, 0x0a, 0xf3, 0x0a, 0x0f, 0x1e, 0xe7, 0xf1, 0xd7, 0x0b, 0xf6, 0xff, + 0x0d, 0x24, 0xcc, 0x0a, 0xee, 0xda, 0x14, 0x12, 0x11, 0x29, 0xf4, 0x1a, + 0xef, 0x0b, 0xfa, 0xec, 0x0c, 0x1b, 0xf4, 0xff, 0xf5, 0xef, 0x0f, 0x10, + 0xd4, 0x04, 0xf9, 0xf8, 0xec, 0xf9, 0x21, 0x05, 0xd3, 0x27, 0xf3, 0x17, + 0xff, 0xf6, 0x15, 0xf9, 0xed, 0x0a, 0xac, 0x02, 0xfd, 0xfb, 0x04, 0x29, + 0x06, 0x03, 0xb8, 0xe6, 0xd5, 0x17, 0x09, 0x1b, 0xf6, 0x1b, 0xab, 0xdc, + 0xdf, 0xfd, 0x06, 0x09, 0x09, 0x37, 0xbb, 0xed, 0x19, 0xd7, 0xe2, 0xdd, + 0x05, 0x01, 0xec, 0xfb, 0xe4, 0x0e, 0xeb, 0xf0, 0x03, 0x17, 0x04, 0xeb, + 0x09, 0xee, 0xeb, 0xe7, 0x0c, 0x16, 0xcb, 0x0e, 0x17, 0xd8, 0xe1, 0xf8, + 0x2b, 0x19, 0xde, 0xeb, 0x10, 0xf2, 0xff, 0xf8, 0xee, 0x0e, 0xe7, 0xf0, + 0x15, 0x08, 0xf8, 0xdf, 0x06, 0x0d, 0xf9, 0x14, 0xfa, 0x0b, 0x04, 0xfd, + 0x15, 0x23, 0x20, 0xff, 0xfd, 0x1d, 0x0c, 0xf1, 0xfe, 0x15, 0x0a, 0x02, + 0xed, 0xfe, 0xfb, 0x04, 0xfb, 0x1e, 0xdd, 0x05, 0xe0, 0x16, 0xf9, 0xf6, + 0xfd, 0x32, 0xdc, 0xf2, 0xd3, 0x08, 0xf4, 0xec, 0x17, 0x25, 0xe2, 0xf0, + 0xee, 0xf1, 0x0d, 0xfe, 0x13, 0x2d, 0x01, 0x11, 0xd4, 0xe4, 0x07, 0xfb, + 0x32, 0x11, 0x14, 0x07, 0xd7, 0x02, 0x10, 0xeb, 0x2b, 0x1d, 0x01, 0xfc, + 0xf3, 0xf0, 0x13, 0x1a, 0xdb, 0x20, 0x00, 0xf0, 0xf0, 0x05, 0x16, 0x03, + 0xd4, 0xe3, 0xc2, 0xf0, 0x06, 0x02, 0x1e, 0x0a, 0xec, 0x1f, 0xab, 0xea, + 0xfa, 0xe3, 0x20, 0x22, 0x03, 0x1b, 0xb3, 0x0e, 0xe3, 0xf3, 0x1d, 0x27, + 0xe3, 0x10, 0xa7, 0xda, 0xf3, 0x00, 0x0a, 0x0a, 0x04, 0xfb, 0xb2, 0x0f, + 0x0c, 0xf5, 0x07, 0xff, 0x13, 0x1e, 0xdb, 0xf6, 0xf9, 0xef, 0xe8, 0xe7, + 0xfb, 0x18, 0xeb, 0xec, 0x09, 0xda, 0xf1, 0xf0, 0x0b, 0x04, 0xe1, 0xfa, + 0x1c, 0x25, 0xee, 0x01, 0x0b, 0x29, 0xd7, 0x0c, 0x04, 0x0b, 0xef, 0xfd, + 0x1c, 0xfc, 0xf1, 0xfb, 0x0b, 0x0f, 0xdf, 0xed, 0x17, 0x38, 0x0c, 0xd7, + 0xff, 0xfd, 0x01, 0xfc, 0xfb, 0xfb, 0x18, 0x1a, 0x18, 0xe3, 0xf9, 0xf4, + 0xfa, 0x20, 0x06, 0x09, 0x11, 0x08, 0x1d, 0xf8, 0xfa, 0x1d, 0xf5, 0x1c, + 0xf5, 0xfe, 0x03, 0x07, 0xe4, 0x33, 0xc8, 0x0c, 0xe1, 0x13, 0xff, 0xe5, + 0x10, 0x2c, 0xd3, 0xf0, 0xed, 0x04, 0x07, 0x01, 0xf1, 0x16, 0xe0, 0x13, + 0xfa, 0x11, 0x07, 0xfa, 0x19, 0x16, 0x01, 0x00, 0x07, 0x26, 0x00, 0xec, + 0x1d, 0x23, 0x05, 0xf4, 0x07, 0x17, 0x2c, 0x1d, 0xee, 0xf0, 0x0c, 0x09, + 0xe3, 0x1a, 0x24, 0x0b, 0xf3, 0x1e, 0xce, 0xfe, 0xfe, 0x12, 0x21, 0x1a, + 0xf6, 0x23, 0xc3, 0x03, 0xf4, 0x10, 0x1a, 0x2a, 0xf4, 0x08, 0xbf, 0xff, + 0x04, 0xf4, 0x0b, 0x1d, 0x1a, 0xf8, 0xcc, 0x00, 0xf7, 0x13, 0xf4, 0xfd, + 0xf4, 0x19, 0xbd, 0xef, 0x0c, 0x0d, 0x02, 0xfc, 0x12, 0x13, 0xe9, 0xe7, + 0xf5, 0xfa, 0xfa, 0xf6, 0x1a, 0x2e, 0xce, 0xd4, 0x01, 0x12, 0xfd, 0xfc, + 0x26, 0x10, 0xcc, 0xe7, 0xee, 0x13, 0xee, 0xff, 0xef, 0xea, 0x00, 0x0e, + 0x1a, 0x17, 0x04, 0x0c, 0x04, 0x0c, 0xe6, 0xf3, 0xf6, 0xdb, 0xdd, 0x04, + 0xf4, 0x22, 0x11, 0x16, 0xf3, 0x07, 0xec, 0xf8, 0xf2, 0x07, 0x03, 0x02, + 0xf5, 0x0a, 0xf6, 0x02, 0x1d, 0x1b, 0x11, 0x06, 0xf8, 0x06, 0x02, 0xea, + 0xf3, 0x1d, 0xce, 0x00, 0xed, 0xf9, 0xef, 0xf6, 0xec, 0x22, 0xc7, 0xf0, + 0xed, 0xdb, 0xe0, 0x02, 0x11, 0x07, 0xe8, 0xf0, 0xd1, 0xed, 0xff, 0xfd, + 0x0c, 0x2e, 0xd4, 0xed, 0xec, 0x0e, 0xf1, 0x07, 0x01, 0x0e, 0x0e, 0xfe, + 0xda, 0x0b, 0x0a, 0x0a, 0x1f, 0x2e, 0x13, 0x07, 0x00, 0x07, 0x14, 0x21, + 0xe9, 0xfc, 0xf0, 0x1e, 0xd7, 0xea, 0x34, 0x07, 0xc6, 0x0c, 0xd4, 0xec, + 0xfd, 0x06, 0x24, 0x0a, 0xf3, 0x15, 0xaf, 0xff, 0xe9, 0xf1, 0x0d, 0x3e, + 0xe9, 0x18, 0xba, 0x13, 0xed, 0xd7, 0x0b, 0x31, 0x05, 0x0e, 0xaf, 0x13, + 0xd6, 0x0e, 0x10, 0x02, 0x02, 0x14, 0xcb, 0xd5, 0xf9, 0x0c, 0xf9, 0x0e, + 0x1f, 0x24, 0xd5, 0xeb, 0xff, 0xf1, 0xf5, 0x0c, 0x08, 0x07, 0xf4, 0xd7, + 0x06, 0x10, 0xe8, 0xef, 0xfc, 0x2f, 0xee, 0xf1, 0x18, 0xf8, 0xf4, 0x02, + 0x11, 0x21, 0xd3, 0x12, 0x14, 0xe4, 0xf4, 0x02, 0x05, 0x24, 0xca, 0xf2, + 0xf3, 0xeb, 0xe7, 0xf8, 0x16, 0x1a, 0xeb, 0x0d, 0x05, 0x16, 0xf1, 0xec, + 0x11, 0x1c, 0x09, 0x1e, 0xe0, 0xe6, 0xfa, 0x0e, 0x0d, 0x2a, 0xea, 0x2e, + 0xed, 0xf9, 0xf7, 0x16, 0x09, 0x05, 0xdd, 0xd6, 0x02, 0xeb, 0xf5, 0xf3, + 0xe4, 0x3b, 0xed, 0x04, 0xe0, 0x0e, 0xfd, 0x09, 0xfd, 0x35, 0xdc, 0x18, + 0xf3, 0x04, 0xfa, 0x05, 0x15, 0x34, 0xe5, 0xe1, 0xe4, 0xf4, 0xe0, 0xf9, + 0x08, 0x32, 0x04, 0x08, 0xf4, 0x0f, 0xff, 0x08, 0x09, 0x2f, 0x06, 0x02, + 0xfd, 0x05, 0x0c, 0x24, 0xe3, 0x1e, 0xf5, 0x0c, 0xdd, 0xf8, 0x18, 0x20, + 0xd8, 0x14, 0xef, 0xf4, 0x17, 0x08, 0x25, 0x14, 0x04, 0x06, 0xb0, 0xf5, + 0xf5, 0x09, 0x0f, 0x3e, 0xff, 0x28, 0xb3, 0xf5, 0x19, 0xd8, 0x14, 0x21, + 0xd9, 0xf7, 0xb7, 0xe5, 0xfe, 0xe7, 0x07, 0x1e, 0x04, 0x15, 0xc5, 0xf9, + 0x14, 0x20, 0xeb, 0x01, 0x01, 0x18, 0xce, 0x00, 0xe6, 0xe2, 0xf7, 0xfb, + 0xf3, 0x0d, 0xd3, 0xf3, 0x04, 0xf8, 0xf0, 0x03, 0xf1, 0x25, 0xb5, 0xef, + 0x05, 0xe0, 0x01, 0xf6, 0x04, 0x16, 0xd1, 0x01, 0x0a, 0x21, 0x01, 0x05, + 0x0e, 0x01, 0xf0, 0x0a, 0xf3, 0x00, 0x03, 0xf8, 0xfa, 0x03, 0x0b, 0xde, + 0xfe, 0xff, 0xfb, 0xea, 0x09, 0x02, 0xf5, 0xe8, 0xe7, 0x08, 0x00, 0xf5, + 0xf8, 0x0f, 0x13, 0xfa, 0xeb, 0xe8, 0xfb, 0x1f, 0x08, 0x16, 0xe6, 0xfa, + 0xe1, 0x00, 0x03, 0xdd, 0xf1, 0x26, 0xe5, 0x1d, 0xd9, 0xff, 0xf2, 0xf8, + 0xff, 0x33, 0xea, 0xe5, 0x03, 0x0c, 0x07, 0xf9, 0xf8, 0x0f, 0xe1, 0x1e, + 0xdd, 0x0f, 0x00, 0xf1, 0x06, 0x21, 0x09, 0x05, 0xf3, 0xec, 0xe6, 0x04, + 0x07, 0x32, 0xf1, 0xf9, 0xf2, 0x01, 0x18, 0x1f, 0xd2, 0xe2, 0x0a, 0xf4, + 0xca, 0xfc, 0x28, 0x16, 0xc2, 0x10, 0xf2, 0xfc, 0x08, 0xe9, 0x2a, 0x0f, + 0xfa, 0xf5, 0xa9, 0x07, 0xec, 0xe9, 0x19, 0x43, 0x0b, 0x1c, 0xa6, 0xe9, + 0xf4, 0x16, 0x0d, 0x2b, 0xfc, 0x11, 0x9a, 0xe1, 0xf1, 0x1c, 0xf5, 0x0f, + 0xe4, 0x18, 0xc0, 0xd9, 0x14, 0x26, 0xe6, 0xf8, 0x0a, 0x17, 0xec, 0xfb, + 0xe1, 0x22, 0xdf, 0xf2, 0xfe, 0x1e, 0xd4, 0xeb, 0xd7, 0x0e, 0x08, 0xf6, + 0xef, 0xfc, 0xe6, 0xd4, 0xf7, 0x0b, 0xfb, 0xf5, 0x01, 0x25, 0xd7, 0xfb, + 0x0d, 0xfe, 0xff, 0xf3, 0x1d, 0x32, 0xfe, 0xee, 0x12, 0xf2, 0x0c, 0xec, + 0x02, 0x10, 0xef, 0x01, 0xf2, 0x0b, 0xf3, 0xf7, 0xfa, 0x25, 0xfb, 0x0d, + 0x11, 0x15, 0x04, 0xfc, 0x0c, 0x21, 0x12, 0x29, 0x00, 0xfa, 0xf6, 0xf5, + 0x06, 0x22, 0xea, 0xe2, 0xee, 0x00, 0xfd, 0xf0, 0x0b, 0x1d, 0xd3, 0xe4, + 0xe4, 0x0a, 0xfc, 0xe8, 0xea, 0x2c, 0xed, 0xed, 0xef, 0xe8, 0xf2, 0x05, + 0xfd, 0x15, 0xd8, 0xda, 0xca, 0xee, 0xfa, 0x00, 0xfe, 0x0e, 0xf2, 0xf0, + 0x0e, 0xf5, 0x04, 0x03, 0x1d, 0x2b, 0xee, 0x05, 0x0f, 0x10, 0x13, 0x35, + 0xe2, 0x04, 0x10, 0xdf, 0xcf, 0xeb, 0x40, 0x26, 0xe4, 0x03, 0xf3, 0xf9, + 0xf5, 0x14, 0x24, 0x2a, 0xdf, 0xfe, 0xab, 0xe5, 0xfe, 0x1c, 0x27, 0x35, + 0xdb, 0xff, 0xac, 0x01, 0xf6, 0xfc, 0x19, 0x1a, 0x11, 0x1f, 0xa8, 0xf5, + 0x02, 0x0f, 0x1a, 0x1f, 0xf7, 0xf2, 0xa2, 0x00, 0x15, 0x22, 0xe4, 0x13, + 0x00, 0x09, 0xd9, 0xd5, 0x02, 0x19, 0xfd, 0xf8, 0xe7, 0xff, 0xfb, 0xe0, + 0xef, 0xf7, 0xee, 0xf3, 0xf3, 0x19, 0xb0, 0xdf, 0x00, 0x0f, 0x08, 0xf3, + 0x15, 0x17, 0xec, 0x0f, 0x11, 0x14, 0x02, 0x08, 0x10, 0x17, 0xe6, 0x08, + 0xf7, 0x00, 0xed, 0xf7, 0x29, 0x07, 0x10, 0x05, 0x05, 0xe7, 0xed, 0xf4, + 0xf9, 0x15, 0xf9, 0xf0, 0x08, 0x00, 0x03, 0x09, 0x21, 0x28, 0xf6, 0x0e, + 0xfb, 0xf3, 0x03, 0xf7, 0x0f, 0x0c, 0xf0, 0xf5, 0xe3, 0xd8, 0xf8, 0xf2, + 0x09, 0x1c, 0xe7, 0xfb, 0xe4, 0xf6, 0xfa, 0xf8, 0xf1, 0x42, 0xf6, 0xda, + 0xdd, 0xd7, 0xfa, 0xff, 0x2f, 0x2c, 0xda, 0x0a, 0xde, 0xec, 0xf1, 0x14, + 0xfb, 0x1d, 0xeb, 0xee, 0xf2, 0xeb, 0xf3, 0xed, 0x0e, 0x35, 0xf0, 0x06, + 0x19, 0x04, 0x2f, 0x23, 0xe2, 0x07, 0x13, 0x0f, 0xe9, 0xf0, 0x22, 0x2e, + 0xd9, 0x1a, 0xcb, 0xed, 0xfd, 0x04, 0x27, 0x1e, 0xf6, 0x07, 0x96, 0xd6, + 0xd8, 0x11, 0x18, 0x56, 0xd2, 0xfb, 0x92, 0xfc, 0x0b, 0x0a, 0x17, 0x2c, + 0xe5, 0x04, 0xa2, 0xf8, 0xe2, 0x04, 0x1a, 0x0d, 0xeb, 0x11, 0xa2, 0xe5, + 0xe5, 0xf8, 0x02, 0xf7, 0x17, 0x03, 0xca, 0xe9, 0x0c, 0x1f, 0xfe, 0xf5, + 0x18, 0x12, 0xdd, 0x08, 0x15, 0xff, 0xfc, 0xf6, 0xe1, 0x1d, 0xe2, 0xe1, + 0xfe, 0xfc, 0x03, 0xff, 0xf2, 0x23, 0xd2, 0x01, 0x13, 0xdd, 0xf3, 0xf4, + 0xf2, 0x07, 0xef, 0x03, 0x15, 0x21, 0xd8, 0xf8, 0x09, 0xf3, 0xe8, 0xea, + 0xe8, 0xf2, 0x08, 0xf0, 0x04, 0x1a, 0xf2, 0x19, 0xfb, 0x1b, 0x15, 0xfc, + 0x1d, 0x30, 0xe5, 0x1e, 0x09, 0xe8, 0xe9, 0x09, 0xf7, 0x2a, 0xe1, 0x0e, + 0x00, 0x21, 0xf3, 0xff, 0xfb, 0x01, 0xdf, 0xf2, 0xfe, 0xf4, 0xfc, 0xf0, + 0x0b, 0x0b, 0xdd, 0xe4, 0xd2, 0x14, 0xf7, 0xfe, 0x0b, 0x39, 0x01, 0xe6, + 0xe4, 0x27, 0xfa, 0xe4, 0x04, 0x2c, 0xe2, 0x04, 0xf5, 0x07, 0xf2, 0x03, + 0xf0, 0x10, 0xf5, 0xf6, 0xfc, 0x16, 0x22, 0x1b, 0xf8, 0x11, 0xe4, 0x09, + 0xf6, 0xf0, 0x41, 0x1e, 0xcf, 0x04, 0xea, 0xee, 0x0e, 0xf6, 0x1b, 0x2f, + 0xc7, 0xf1, 0xba, 0xef, 0x0f, 0x16, 0x1e, 0x39, 0x05, 0x1e, 0x90, 0xe6, + 0x0d, 0xfa, 0x22, 0x3f, 0xe3, 0x23, 0xa5, 0xe3, 0xe9, 0x0f, 0x05, 0x27, + 0x02, 0x11, 0x99, 0x05, 0xfa, 0x05, 0x03, 0x01, 0xff, 0x26, 0xd3, 0xf7, + 0xf7, 0xf9, 0x05, 0xf4, 0xef, 0x23, 0xd2, 0xdd, 0x05, 0x08, 0xfa, 0xff, + 0x03, 0x04, 0xbd, 0xd7, 0x14, 0x06, 0xef, 0x06, 0xe5, 0x05, 0xea, 0xea, + 0x02, 0xfd, 0x0d, 0x00, 0x08, 0xff, 0xe7, 0xfb, 0xfe, 0x13, 0xfe, 0xec, + 0xf9, 0x02, 0xf3, 0xff, 0xff, 0x08, 0x04, 0xed, 0x19, 0x1d, 0xfa, 0x0a, + 0x0d, 0xf2, 0x0f, 0xec, 0x25, 0x1c, 0xec, 0x0b, 0x01, 0xff, 0x01, 0xf6, + 0x08, 0x09, 0xe8, 0xe2, 0xec, 0x23, 0xe5, 0xe9, 0xf0, 0x2e, 0xbd, 0xe1, + 0xef, 0x14, 0xe9, 0xf6, 0xf5, 0x1d, 0xdc, 0xe3, 0xd7, 0xfc, 0xf9, 0xf2, + 0xfe, 0x24, 0xf2, 0x05, 0xd5, 0xed, 0xe9, 0xf9, 0xfa, 0x2d, 0xf0, 0xfe, + 0xee, 0xf2, 0xe8, 0xf7, 0x06, 0x14, 0x01, 0x10, 0x06, 0xf3, 0x0e, 0x0e, + 0xc2, 0x1d, 0xf2, 0x1c, 0xed, 0xe3, 0x53, 0x21, 0xb8, 0x0c, 0xde, 0x03, + 0x15, 0xeb, 0x46, 0x39, 0xdf, 0xf6, 0xa3, 0xee, 0xf6, 0xe0, 0x33, 0x50, + 0xdd, 0x27, 0x9f, 0x07, 0x13, 0xe2, 0x1f, 0x35, 0xed, 0x1f, 0xb7, 0x07, + 0x11, 0xed, 0x17, 0x28, 0xf4, 0x20, 0xc1, 0xec, 0xef, 0x16, 0x02, 0xfa, + 0xe0, 0x1b, 0xf7, 0xdb, 0xfd, 0x0a, 0xe7, 0xfb, 0xe7, 0x25, 0xe2, 0xe7, + 0xf8, 0xf0, 0xee, 0xe9, 0x02, 0x06, 0xc9, 0xe4, 0x14, 0xe3, 0xe2, 0xf7, + 0xf8, 0xfd, 0xdd, 0xe2, 0x08, 0x0a, 0xe4, 0x05, 0xf5, 0x16, 0xe7, 0x01, + 0x00, 0x1c, 0xe7, 0xf0, 0xf6, 0x19, 0xfe, 0x0c, 0xf2, 0x06, 0x03, 0xe8, + 0x0b, 0xfe, 0xe3, 0x19, 0x08, 0x1a, 0x10, 0xfd, 0x00, 0x21, 0xf0, 0xeb, + 0x18, 0x02, 0xf3, 0x04, 0xf0, 0x18, 0xdb, 0x05, 0x01, 0xde, 0xed, 0xe9, + 0x23, 0x15, 0xaf, 0xe6, 0xf1, 0x0a, 0xe6, 0xea, 0x01, 0x18, 0xd8, 0xfd, + 0xf1, 0xe6, 0xec, 0xf5, 0x0e, 0x1e, 0xcc, 0xfc, 0xe7, 0x00, 0xe9, 0x11, + 0x00, 0x30, 0xf9, 0x14, 0xf4, 0x19, 0xdd, 0xf7, 0xf7, 0x2f, 0xf4, 0xf2, + 0xff, 0x27, 0x15, 0x1c, 0xbc, 0x2f, 0xe9, 0x14, 0xf5, 0xe8, 0x44, 0x30, + 0xe8, 0x1d, 0xe4, 0x18, 0x11, 0x00, 0x0c, 0x2b, 0xf3, 0x29, 0x96, 0xe0, + 0x06, 0xee, 0x3e, 0x55, 0xdc, 0x13, 0x98, 0xdf, 0xf0, 0xfe, 0x17, 0x33, + 0xe8, 0x09, 0xa3, 0x07, 0xef, 0x0e, 0x1d, 0x37, 0xdd, 0xfe, 0xb5, 0x00, + 0xf7, 0xe0, 0xea, 0xfd, 0xfd, 0x19, 0xbc, 0xfd, 0x15, 0xfe, 0x01, 0xf3, + 0xd5, 0x20, 0xbf, 0xe3, 0x15, 0x0e, 0xf0, 0xf6, 0xf2, 0x14, 0xcc, 0xf0, + 0xf7, 0x04, 0xf2, 0xff, 0x0b, 0x02, 0xd2, 0xd8, 0xfa, 0xfc, 0xe5, 0x02, + 0x00, 0xfb, 0xf0, 0xdc, 0x1e, 0x10, 0x02, 0x01, 0x00, 0x18, 0xe9, 0xdb, + 0x1e, 0xf6, 0xfc, 0x03, 0xef, 0x0a, 0x00, 0x16, 0x00, 0x0f, 0xf4, 0x16, + 0xfa, 0x0b, 0xe2, 0xfa, 0xe0, 0x07, 0xfb, 0x02, 0x21, 0x0e, 0xdd, 0x0b, + 0xea, 0xf0, 0xeb, 0xfb, 0x19, 0x09, 0xd4, 0xf2, 0xef, 0x0b, 0x00, 0xeb, + 0x1a, 0x2f, 0xea, 0x06, 0x03, 0xf6, 0xf8, 0xfb, 0xfe, 0x1d, 0xea, 0xdd, + 0xed, 0xfd, 0xfb, 0xe7, 0xfe, 0x18, 0xf4, 0xfc, 0x0b, 0xf6, 0xfc, 0x0b, + 0xfb, 0x28, 0x07, 0xff, 0x07, 0x1e, 0x03, 0x21, 0xcf, 0x22, 0x05, 0xe6, + 0xea, 0xe7, 0x43, 0x2e, 0xe7, 0x14, 0xfb, 0x0a, 0x1e, 0xfe, 0x2c, 0x24, + 0xd5, 0xfd, 0x9e, 0xd1, 0xf2, 0x1c, 0x32, 0x51, 0x01, 0xf3, 0xac, 0xe1, + 0xf4, 0xe5, 0x1c, 0x37, 0xf1, 0x0f, 0xa7, 0xdb, 0x00, 0xf6, 0x0f, 0x18, + 0xe1, 0x10, 0xc9, 0xc5, 0xe8, 0xeb, 0xf2, 0xfd, 0xf6, 0x02, 0xc2, 0xff, + 0x00, 0x19, 0x03, 0x0f, 0x02, 0x22, 0xd4, 0xe7, 0x07, 0x0f, 0xe5, 0x1a, + 0x09, 0x0b, 0xdc, 0xd2, 0x00, 0x05, 0xee, 0xf8, 0xdc, 0x14, 0xd0, 0x0a, + 0x0a, 0xfa, 0xeb, 0x04, 0xf3, 0x06, 0xde, 0x05, 0xfb, 0xfd, 0xe3, 0xec, + 0xfd, 0x14, 0xd7, 0x11, 0x0e, 0xe6, 0x06, 0xec, 0xde, 0x22, 0xd7, 0x00, + 0x03, 0xf5, 0xf5, 0x0d, 0x01, 0x05, 0xea, 0x0b, 0x16, 0x04, 0xff, 0x13, + 0xf3, 0x12, 0xd2, 0xdf, 0x0b, 0xe4, 0x06, 0xf6, 0x08, 0x2d, 0xd3, 0xd6, + 0xe7, 0x0a, 0xec, 0xff, 0xfe, 0x01, 0xdf, 0xf4, 0xdf, 0x1c, 0xfe, 0xf9, + 0xf7, 0x13, 0xca, 0xff, 0x03, 0x06, 0xe9, 0xf7, 0x06, 0x08, 0xd7, 0xf3, + 0xed, 0x08, 0xe3, 0xfd, 0x0c, 0x11, 0x15, 0xfb, 0x15, 0x08, 0x28, 0x40, + 0xe7, 0x0d, 0x08, 0xec, 0xe8, 0x16, 0x67, 0x46, 0xc8, 0x16, 0xf1, 0x02, + 0x24, 0x00, 0x3a, 0x43, 0xd6, 0x12, 0xae, 0xe7, 0xf4, 0xf8, 0x3a, 0x65, + 0xe4, 0x0c, 0xb2, 0xef, 0x1f, 0xe8, 0x29, 0x59, 0xf8, 0x11, 0xc4, 0xe1, + 0xfe, 0xfa, 0x27, 0x43, 0xc9, 0x1e, 0xbb, 0xfb, 0xf3, 0x13, 0x15, 0x0d, + 0xf1, 0x13, 0xcd, 0xf0, 0x07, 0x19, 0x07, 0x00, 0xd8, 0xeb, 0xbf, 0xf0, + 0xfc, 0xf6, 0xef, 0x16, 0x01, 0x02, 0xc1, 0xdf, 0xfd, 0xe9, 0x06, 0x06, + 0xf1, 0x08, 0xd7, 0xcc, 0xfb, 0x0e, 0xfc, 0x14, 0xf2, 0x1a, 0xe2, 0x0d, + 0xeb, 0x09, 0x07, 0x10, 0xe6, 0x13, 0xeb, 0xf5, 0x15, 0x14, 0xeb, 0xfe, + 0xf9, 0x17, 0xd2, 0xe3, 0x1e, 0xf5, 0x04, 0x0a, 0xf1, 0x0e, 0xde, 0xe7, + 0x01, 0x20, 0x0c, 0xfc, 0xdc, 0xf9, 0xe5, 0xe9, 0xff, 0x1d, 0x0a, 0xfe, + 0xec, 0x25, 0xaf, 0xd2, 0x01, 0x16, 0xfc, 0x17, 0xe8, 0x1e, 0xcd, 0xd9, + 0xe2, 0xf1, 0xeb, 0x08, 0xff, 0x33, 0xe5, 0xfb, 0xeb, 0x04, 0xfe, 0xf7, + 0xfd, 0x1f, 0xee, 0xff, 0xed, 0xf8, 0xe0, 0xff, 0xfd, 0x2b, 0x0a, 0xf5, + 0x15, 0x1d, 0xf3, 0x3f, 0x16, 0xf6, 0xf2, 0xee, 0xf4, 0xef, 0xf0, 0x56, + 0x0a, 0x1a, 0xbc, 0xfc, 0x2f, 0xfb, 0xf0, 0x56, 0x1e, 0x0e, 0xc6, 0xe8, + 0x06, 0x0b, 0x11, 0x62, 0x3e, 0xf9, 0xb8, 0xc9, 0xed, 0xeb, 0x02, 0x63, + 0x2c, 0xfd, 0xc5, 0xe9, 0x00, 0x17, 0x0f, 0x37, 0xfe, 0x20, 0xcc, 0xe0, + 0xe0, 0x0e, 0xe6, 0x20, 0x0a, 0xfd, 0xdf, 0xee, 0x0b, 0x02, 0xee, 0x1f, + 0xfb, 0x06, 0xd2, 0xed, 0xfe, 0xeb, 0xfc, 0x12, 0xfd, 0x14, 0x00, 0xd8, + 0x08, 0xf6, 0xec, 0x17, 0xf9, 0x10, 0x00, 0xd9, 0x18, 0xf1, 0xee, 0x0f, + 0xf4, 0x03, 0xee, 0xeb, 0xf0, 0xef, 0xf2, 0x06, 0x04, 0x00, 0xf4, 0x0f, + 0x09, 0x06, 0xf7, 0x0b, 0xfd, 0x01, 0x03, 0x03, 0xf4, 0xf6, 0xdd, 0x14, + 0x1c, 0xef, 0xf1, 0xdd, 0xf7, 0x13, 0xd9, 0x15, 0xef, 0x02, 0xd2, 0xe7, + 0x05, 0x05, 0xe2, 0x09, 0xf2, 0x11, 0xf5, 0xba, 0xf0, 0x04, 0xe0, 0x01, + 0x06, 0x10, 0xe6, 0xef, 0xfc, 0x12, 0xf9, 0xf4, 0x1b, 0x2f, 0xe3, 0x0f, + 0xd7, 0xf6, 0x0b, 0x11, 0xf7, 0x0c, 0x00, 0x06, 0x18, 0xef, 0x06, 0x03, + 0x0a, 0x09, 0xf6, 0x1a, 0x0d, 0xed, 0xfe, 0x2c, 0x43, 0xf4, 0xe5, 0xde, + 0xf5, 0x02, 0x25, 0x5a, 0x49, 0xd4, 0xe6, 0x24, 0x1e, 0xf7, 0x0e, 0x5c, + 0x5d, 0xf0, 0xf9, 0xe4, 0x1c, 0xeb, 0x28, 0x7f, 0x5b, 0xec, 0xfa, 0xdb, + 0x0c, 0xf5, 0x20, 0x49, 0x51, 0xe1, 0xed, 0xe6, 0x0e, 0x26, 0x28, 0x33, + 0x35, 0x05, 0xe1, 0xe4, 0x1f, 0xfc, 0xf9, 0x39, 0x18, 0x04, 0xed, 0xed, + 0x01, 0xe7, 0xe6, 0x08, 0x09, 0x03, 0xe7, 0xf9, 0x0e, 0x06, 0xec, 0x08, + 0x12, 0x1a, 0xda, 0xef, 0xdf, 0xf9, 0xe2, 0x1e, 0x1c, 0x00, 0x12, 0xd7, + 0x01, 0xf7, 0x21, 0x17, 0x13, 0x19, 0xde, 0xe0, 0xec, 0x16, 0x01, 0x1b, + 0x06, 0x0c, 0xf0, 0xe8, 0x18, 0x03, 0x06, 0x0e, 0x09, 0xfa, 0x03, 0xf3, + 0xdd, 0x01, 0xfb, 0x0a, 0x2a, 0xf4, 0xf6, 0xda, 0xe9, 0xfe, 0xe9, 0x12, + 0x19, 0xe9, 0x05, 0xdf, 0x00, 0xeb, 0xf2, 0x10, 0x0c, 0xe1, 0xcd, 0xcb, + 0xf2, 0x1f, 0xd9, 0x0c, 0xfa, 0xfb, 0xe8, 0xde, 0x00, 0xfc, 0xe5, 0x00, + 0x11, 0x02, 0xe6, 0x17, 0x14, 0x00, 0xf2, 0xfd, 0x00, 0xe1, 0x10, 0x24, + 0x12, 0xec, 0xed, 0x1e, 0x09, 0x18, 0x03, 0x0c, 0x04, 0xf4, 0x15, 0x0f, + 0x10, 0x18, 0xd6, 0x29, 0x10, 0x04, 0x1c, 0xef, 0x0f, 0x0c, 0xc7, 0x04, + 0xfe, 0xeb, 0xff, 0xf5, 0xe3, 0x15, 0xfe, 0xcb, 0x10, 0xff, 0x12, 0xfb, + 0xe4, 0xeb, 0xf9, 0x00, 0x02, 0xf1, 0x14, 0x13, 0x01, 0x02, 0xf9, 0x01, + 0x06, 0x0c, 0xf5, 0x0a, 0x1e, 0x01, 0x19, 0x0e, 0x05, 0xf5, 0x0a, 0xff, + 0xff, 0xf2, 0xfb, 0xdb, 0xf8, 0x06, 0x17, 0xf2, 0xf7, 0x0d, 0x0e, 0xf4, + 0xfa, 0xf7, 0x14, 0xdb, 0xe0, 0xfd, 0x08, 0x16, 0xf7, 0x16, 0xfc, 0x09, + 0x27, 0x07, 0x09, 0xfb, 0x0a, 0xfc, 0x0c, 0xe4, 0xdb, 0xee, 0xff, 0x10, + 0xf3, 0x09, 0xfa, 0xf4, 0x23, 0xf3, 0xf4, 0x19, 0xff, 0xfa, 0xff, 0x19, + 0x0f, 0x11, 0xed, 0xec, 0xf8, 0x0f, 0x10, 0xf3, 0xff, 0x0b, 0xf7, 0x06, + 0x0b, 0x0e, 0x07, 0xe4, 0x18, 0x0a, 0x08, 0x0e, 0x02, 0x0a, 0x05, 0x19, + 0x02, 0xf3, 0xfe, 0xfe, 0x0b, 0x0f, 0xfc, 0xfa, 0x05, 0xf9, 0xe2, 0xf9, + 0x1b, 0xf7, 0x0f, 0x07, 0xfc, 0x12, 0xfe, 0x01, 0xfd, 0xf0, 0x04, 0xf4, + 0xfd, 0x07, 0xf2, 0x04, 0x04, 0x07, 0xef, 0x0c, 0xed, 0x0e, 0xf6, 0xef, + 0x08, 0x07, 0x04, 0xe9, 0xf3, 0x20, 0xda, 0x15, 0xf8, 0xff, 0xec, 0xe0, + 0xf6, 0xff, 0xe9, 0x08, 0x01, 0x10, 0xf0, 0xfc, 0xe9, 0x08, 0xe8, 0xf5, + 0xf8, 0xe5, 0x17, 0xe6, 0x03, 0xfc, 0x09, 0xf5, 0xdd, 0xf2, 0xff, 0x05, + 0xf6, 0xf8, 0xf5, 0x07, 0xfc, 0xf1, 0x04, 0xf3, 0x13, 0xe1, 0x0f, 0xf2, + 0x0a, 0xf9, 0xfd, 0x1c, 0xe0, 0x11, 0x1b, 0xe6, 0xef, 0x05, 0x05, 0x0c, + 0x23, 0x10, 0x09, 0xfe, 0xf7, 0x1a, 0xf1, 0xfc, 0x11, 0x1d, 0xff, 0x03, + 0x03, 0xe6, 0x07, 0x11, 0x0c, 0x0d, 0x16, 0x05, 0x05, 0x25, 0xf3, 0x10, + 0x10, 0x06, 0x09, 0xe8, 0x1a, 0xf0, 0xee, 0x09, 0xff, 0x24, 0xf7, 0xfb, + 0xe6, 0x06, 0xfa, 0x08, 0x03, 0x00, 0xf2, 0x04, 0xf0, 0xeb, 0x14, 0x1c, + 0x03, 0x21, 0x14, 0x1d, 0xfe, 0x03, 0xf6, 0x02, 0x09, 0xff, 0x00, 0x13, + 0xef, 0x10, 0x1e, 0x0b, 0x1d, 0x1c, 0xf1, 0xf6, 0xe7, 0xfd, 0x14, 0x01, + 0xff, 0x13, 0xf7, 0xfc, 0x00, 0x21, 0xe3, 0xeb, 0x07, 0x0e, 0x09, 0xf1, + 0xf8, 0xfd, 0x03, 0xee, 0x19, 0xfd, 0xff, 0xfb, 0xff, 0xea, 0xfb, 0x07, + 0xf0, 0x0a, 0x04, 0x04, 0x0b, 0x12, 0xfe, 0x0b, 0xe0, 0xff, 0xf6, 0xe5, + 0xfc, 0x11, 0xed, 0xfd, 0x15, 0x03, 0xdd, 0xdb, 0x04, 0xfe, 0xff, 0x0e, + 0xff, 0xfa, 0xfb, 0xe5, 0xef, 0xf6, 0xfe, 0x22, 0x0f, 0xe8, 0xfe, 0xf4, + 0xfd, 0xd9, 0x03, 0x0a, 0xdf, 0xcf, 0xf1, 0x14, 0x05, 0xfd, 0xfb, 0xf3, + 0xfb, 0xfb, 0x0f, 0xf8, 0x05, 0x09, 0x03, 0xf7, 0x05, 0x05, 0x13, 0xfb, + 0xeb, 0x23, 0xe7, 0x18, 0xfb, 0x00, 0xfe, 0xdd, 0xe9, 0xea, 0xd3, 0xe8, + 0x1a, 0xef, 0x01, 0xf1, 0x09, 0x1d, 0xd8, 0xfc, 0xda, 0x19, 0x03, 0xec, + 0xe5, 0xf3, 0xed, 0x0a, 0xf4, 0x13, 0x0b, 0xf7, 0x0c, 0x00, 0xf9, 0xea, + 0xe3, 0xfe, 0xff, 0x0d, 0x0a, 0x1b, 0xd7, 0x17, 0xeb, 0xe9, 0x00, 0x0e, + 0xee, 0x24, 0xef, 0x09, 0x07, 0xf0, 0xf5, 0x07, 0xf5, 0xf5, 0x10, 0x17, + 0x06, 0xf7, 0xfc, 0x02, 0xfb, 0xf9, 0xe7, 0x0a, 0x26, 0xf3, 0x01, 0x01, + 0x09, 0x0b, 0x02, 0x27, 0xf8, 0xee, 0xfd, 0x1c, 0xf8, 0xf2, 0x0f, 0xfc, + 0x0d, 0xe0, 0xea, 0x02, 0x0b, 0x00, 0xe0, 0x08, 0xfe, 0x10, 0x04, 0xfe, + 0xeb, 0x13, 0x01, 0x0c, 0x0e, 0xed, 0x09, 0x01, 0x0c, 0xe3, 0x10, 0xdf, + 0xd1, 0x14, 0xf3, 0xef, 0x09, 0xf0, 0xee, 0xe5, 0x11, 0xf4, 0xf6, 0x00, + 0xe8, 0x20, 0x0a, 0xfc, 0xea, 0xf7, 0x02, 0x16, 0xe7, 0xf3, 0x0d, 0xe4, + 0x04, 0xe6, 0xef, 0xf8, 0x0f, 0x23, 0x02, 0xe0, 0x01, 0x01, 0x01, 0x05, + 0xf5, 0x0d, 0xf5, 0xf5, 0xe1, 0xff, 0x04, 0x00, 0xf4, 0x0d, 0xee, 0xf1, + 0xef, 0xf7, 0x0b, 0xff, 0x1b, 0xec, 0x05, 0xe7, 0xf3, 0x13, 0x12, 0xf2, + 0xf3, 0xfc, 0xea, 0x06, 0xfe, 0x13, 0x12, 0xdb, 0x11, 0xe2, 0xfc, 0x0d, + 0x1c, 0xe8, 0x1d, 0xfc, 0xf2, 0xe2, 0x13, 0x1d, 0xda, 0xf6, 0x1c, 0x18, + 0x1e, 0xf4, 0xfa, 0x03, 0xdc, 0x0f, 0xff, 0xff, 0x18, 0x0b, 0xed, 0xf1, + 0xf8, 0x02, 0xf4, 0x10, 0xf9, 0xeb, 0x0b, 0x0e, 0x0f, 0x01, 0x02, 0x1b, + 0x06, 0x10, 0x00, 0xe7, 0x23, 0x0d, 0xf6, 0x11, 0x08, 0xf5, 0x0f, 0x05, + 0x13, 0xf7, 0x01, 0x01, 0x0c, 0xf6, 0xf9, 0xf0, 0x29, 0x01, 0xe9, 0x11, + 0x02, 0xfa, 0xeb, 0x16, 0x0e, 0x10, 0x09, 0x0e, 0x1c, 0x0a, 0xe3, 0xd3, + 0x01, 0xe3, 0x00, 0x06, 0xe2, 0xe9, 0x19, 0xef, 0x12, 0xf3, 0xfc, 0x02, + 0x0b, 0x0c, 0x0d, 0xed, 0xfd, 0xf6, 0xf9, 0xe9, 0xf2, 0x28, 0xfe, 0x03, + 0xec, 0x03, 0x00, 0xf8, 0xde, 0x0d, 0x25, 0x07, 0x1a, 0xe7, 0xfd, 0x29, + 0xd8, 0xf7, 0xfb, 0xde, 0x0c, 0x08, 0x06, 0x22, 0xee, 0x1d, 0x05, 0x07, + 0xf0, 0xfb, 0xfe, 0x07, 0xf1, 0x04, 0xe9, 0x01, 0xfc, 0xf1, 0x00, 0xeb, + 0xe3, 0x08, 0xec, 0xfe, 0x04, 0xeb, 0xfc, 0x01, 0xf6, 0x0e, 0xdf, 0xf8, + 0x12, 0xe3, 0x16, 0xdc, 0x21, 0x0a, 0xe6, 0x06, 0xe5, 0x10, 0x07, 0xf7, + 0x1e, 0xde, 0xe3, 0x07, 0x16, 0xed, 0x23, 0xf2, 0x12, 0x0d, 0xe9, 0xf9, + 0xe8, 0xfe, 0x0e, 0x02, 0x18, 0x0a, 0xea, 0xec, 0xfb, 0xfe, 0x0c, 0x1b, + 0x19, 0x20, 0xfa, 0x07, 0xe5, 0x0c, 0x04, 0x27, 0xdb, 0xe6, 0xfe, 0x0d, + 0x0a, 0x0a, 0xfe, 0x39, 0xdd, 0xde, 0x05, 0xec, 0x09, 0x05, 0x0a, 0x2c, + 0xf4, 0x02, 0x1f, 0xd3, 0x24, 0xee, 0x0f, 0x3c, 0xf5, 0xfd, 0xf8, 0xf8, + 0x12, 0xf5, 0xf3, 0x19, 0xf9, 0xda, 0xf6, 0x0a, 0x0a, 0xf4, 0x09, 0x0f, + 0xfc, 0x00, 0x01, 0x01, 0xf3, 0xf8, 0x05, 0xf3, 0x0c, 0x19, 0x0e, 0xfd, + 0xfa, 0xe1, 0xfc, 0x0c, 0x03, 0xfb, 0x1b, 0x06, 0xcc, 0xe4, 0x08, 0xf9, + 0x10, 0xe9, 0x06, 0x00, 0x17, 0xe8, 0x0d, 0x12, 0xca, 0xf5, 0x23, 0xe4, + 0x21, 0xf6, 0x19, 0x33, 0xdd, 0xfa, 0x0c, 0x01, 0x14, 0x07, 0x00, 0x34, + 0xda, 0x05, 0x07, 0x01, 0x07, 0xe4, 0x06, 0x24, 0x02, 0xff, 0xf0, 0x09, + 0xfc, 0xf4, 0x03, 0x06, 0xee, 0x08, 0xe2, 0x1d, 0xfa, 0x0c, 0xfc, 0x02, + 0x03, 0xe5, 0xf0, 0xe2, 0x0a, 0x18, 0x12, 0x0c, 0x1e, 0x20, 0xed, 0x20, + 0xe4, 0x01, 0x2a, 0x09, 0x0d, 0x0e, 0xd0, 0xf4, 0xdd, 0xfd, 0x2b, 0xf2, + 0x08, 0x0c, 0xf8, 0xf7, 0xfc, 0xf9, 0x15, 0xef, 0x19, 0x1c, 0x01, 0xff, + 0xe2, 0x01, 0xf3, 0x30, 0x0e, 0xfb, 0x15, 0xe8, 0x1c, 0x00, 0xfa, 0x16, + 0xef, 0xea, 0xfb, 0x05, 0xf0, 0x0e, 0x02, 0x13, 0xf4, 0x01, 0x03, 0xe5, + 0x29, 0x07, 0x09, 0x24, 0xf9, 0xe3, 0xf8, 0xde, 0x2d, 0xf4, 0xf5, 0x40, + 0xed, 0xdf, 0x07, 0xef, 0x0f, 0x0a, 0x0b, 0x32, 0x0d, 0xe8, 0x00, 0xe6, + 0xf6, 0xfc, 0xfd, 0x19, 0x11, 0x09, 0xf3, 0x03, 0xea, 0xf1, 0xfb, 0x02, + 0xfd, 0x06, 0xff, 0xfe, 0x09, 0xec, 0x06, 0x0c, 0x15, 0xf9, 0x06, 0xd7, + 0xe3, 0xf7, 0xed, 0x01, 0x03, 0xfd, 0x14, 0x01, 0x0e, 0xe0, 0x37, 0x0d, + 0xd2, 0x18, 0x2f, 0xea, 0x12, 0x0d, 0x05, 0x3a, 0xd5, 0x07, 0x1e, 0xf2, + 0x21, 0x11, 0xf9, 0x36, 0xd3, 0xf5, 0x12, 0xf6, 0xfb, 0xf6, 0x06, 0x0f, + 0xde, 0xf9, 0x06, 0x09, 0xdf, 0xff, 0x0b, 0xf3, 0xf5, 0x01, 0xf1, 0xea, + 0xf2, 0x02, 0x12, 0xfc, 0x0e, 0xee, 0xf8, 0xeb, 0x00, 0xef, 0x21, 0x0f, + 0x09, 0xef, 0xeb, 0x1e, 0xef, 0xf2, 0x26, 0xf9, 0x17, 0xf1, 0xf1, 0xf0, + 0x0c, 0x10, 0x1d, 0xff, 0x1d, 0x06, 0x03, 0xf6, 0xfb, 0x14, 0x1b, 0x03, + 0x22, 0xfd, 0xec, 0x03, 0xfa, 0xf8, 0x01, 0x2b, 0x1e, 0x1b, 0x09, 0x09, + 0x07, 0xff, 0xf0, 0x20, 0xee, 0x14, 0xfb, 0xf6, 0xf8, 0x11, 0xd9, 0x29, + 0xf4, 0xfa, 0x07, 0xef, 0x20, 0xf9, 0xf2, 0x30, 0xee, 0xf0, 0xf3, 0xd6, + 0x0d, 0xfe, 0x03, 0x36, 0xf5, 0xd7, 0x01, 0xe6, 0x04, 0xf0, 0x05, 0x1f, + 0x0f, 0xdd, 0xff, 0xf8, 0x1f, 0xf2, 0x04, 0x37, 0xfa, 0x00, 0xfd, 0xf8, + 0x10, 0xe1, 0xfb, 0x0d, 0xed, 0xf6, 0xe2, 0xfe, 0x08, 0xfe, 0x07, 0x08, + 0x08, 0x11, 0x0a, 0xf0, 0xf8, 0xf5, 0x04, 0xea, 0x08, 0x12, 0x06, 0x0d, + 0x0f, 0x10, 0x40, 0x28, 0xc0, 0xfb, 0x3f, 0x08, 0x1d, 0x09, 0x1b, 0x3d, + 0xee, 0xf4, 0x29, 0x13, 0x20, 0xfc, 0x11, 0x4c, 0xdb, 0x02, 0x15, 0x05, + 0xec, 0xeb, 0x0a, 0x22, 0xe7, 0x00, 0x02, 0x01, 0xd4, 0xea, 0x0a, 0xf3, + 0xe3, 0xf8, 0xf5, 0xfa, 0x01, 0x0d, 0x19, 0x06, 0x24, 0x13, 0x02, 0xf5, + 0xf1, 0xf1, 0x1b, 0x0f, 0x19, 0x04, 0xe3, 0xf9, 0xe7, 0x02, 0x29, 0xfc, + 0x29, 0xec, 0xe9, 0x04, 0xdc, 0x22, 0x1d, 0xfd, 0x1f, 0x01, 0xec, 0xe8, + 0xf5, 0x14, 0x1b, 0x19, 0x06, 0x0e, 0x02, 0x0d, 0xf9, 0x06, 0xfc, 0x15, + 0x07, 0xfa, 0x0c, 0xe1, 0x18, 0x1a, 0xe8, 0x1b, 0xe9, 0xef, 0x0a, 0x18, + 0xfc, 0x05, 0xf9, 0x14, 0xdc, 0x04, 0x01, 0xff, 0x07, 0xfd, 0xf0, 0x2c, + 0xf2, 0xec, 0x0e, 0xe7, 0x1a, 0x05, 0xe8, 0x35, 0x13, 0x09, 0xf9, 0x07, + 0xfe, 0xfa, 0x0d, 0x40, 0x0c, 0xea, 0xf4, 0x04, 0x01, 0x11, 0xfc, 0x23, + 0xeb, 0xf4, 0xe9, 0x04, 0xeb, 0xe7, 0x07, 0x09, 0xfb, 0xf1, 0xf6, 0xfd, + 0x02, 0xfa, 0x02, 0xff, 0x00, 0xff, 0xf1, 0xf1, 0x1a, 0xe9, 0x10, 0xe3, + 0x0b, 0x0c, 0x08, 0x04, 0x1b, 0x0a, 0x2b, 0x10, 0xe1, 0x01, 0x1f, 0x06, + 0x04, 0xec, 0x19, 0x49, 0xee, 0xf8, 0x22, 0x0c, 0x20, 0x02, 0x07, 0x31, + 0xe7, 0xff, 0x0f, 0xf0, 0xfd, 0xea, 0x13, 0x26, 0xce, 0xfa, 0xff, 0xee, + 0xe9, 0xfe, 0x15, 0x08, 0x04, 0x05, 0x0d, 0xfa, 0xdd, 0xf8, 0x07, 0x0b, + 0x33, 0xef, 0xec, 0xf9, 0xd9, 0xe6, 0x1d, 0x10, 0x41, 0xf6, 0xdf, 0x11, + 0xe3, 0x14, 0x1d, 0xfb, 0x2b, 0x15, 0xdc, 0x09, 0xf6, 0x05, 0x16, 0x00, + 0x1c, 0x27, 0xe4, 0xfc, 0xf7, 0x16, 0x08, 0x08, 0x2f, 0xdd, 0xf8, 0xfa, + 0xe9, 0x0e, 0x0b, 0x0b, 0x02, 0x12, 0x02, 0xfd, 0x19, 0x03, 0xeb, 0x11, + 0xf4, 0x09, 0x09, 0x15, 0x12, 0x0d, 0xef, 0x1c, 0xe4, 0xfe, 0x17, 0x0c, + 0x09, 0x04, 0xea, 0x2f, 0xf2, 0x1e, 0x02, 0xfb, 0xfe, 0xe3, 0x00, 0x2e, + 0x04, 0xf9, 0x0c, 0x05, 0x27, 0x0c, 0x07, 0x2d, 0xf7, 0x0b, 0xfb, 0xf9, + 0x1c, 0xdf, 0x11, 0x36, 0x05, 0xf2, 0x02, 0xf8, 0x0b, 0x07, 0x05, 0xfb, + 0xfc, 0x0e, 0x13, 0xfa, 0xfb, 0x09, 0xf5, 0xfd, 0x06, 0x15, 0xf9, 0x03, + 0x18, 0xfd, 0x1a, 0x0a, 0x03, 0xe2, 0xfb, 0x00, 0x1e, 0xfe, 0x4f, 0x27, + 0xe1, 0xf7, 0x31, 0xf0, 0x1b, 0xec, 0x07, 0x5f, 0xe2, 0xf8, 0x40, 0x05, + 0x17, 0x24, 0x0c, 0x3c, 0xf3, 0x10, 0x13, 0xf8, 0x0b, 0xf3, 0xf9, 0x36, + 0xe1, 0xf3, 0xf4, 0xe8, 0xef, 0xf8, 0xfc, 0xeb, 0xe3, 0xfb, 0xf0, 0xee, + 0xdb, 0x06, 0x0c, 0x11, 0x1e, 0x10, 0xe2, 0xe9, 0xeb, 0x0d, 0x34, 0x0f, + 0x43, 0xd9, 0xef, 0x08, 0xec, 0x05, 0x1d, 0x02, 0x33, 0xef, 0xf4, 0xf7, + 0xe6, 0xf9, 0x22, 0x07, 0x04, 0x06, 0xe9, 0x02, 0xf0, 0xfc, 0x24, 0x20, + 0x24, 0x17, 0xe6, 0x0f, 0x05, 0xf6, 0xfc, 0x1f, 0xf2, 0x01, 0x0d, 0xe7, + 0xff, 0x1d, 0xf0, 0xfa, 0xd0, 0x00, 0xff, 0x0e, 0x23, 0xf9, 0xf3, 0x11, + 0xde, 0x0d, 0x05, 0x04, 0x0b, 0x0b, 0xfb, 0x26, 0x0d, 0x0d, 0xff, 0xe8, + 0x16, 0xe8, 0x0b, 0x3c, 0x18, 0xe4, 0x04, 0xff, 0xfa, 0xf3, 0xff, 0x40, + 0xee, 0x06, 0xfc, 0x0d, 0x00, 0xf7, 0x13, 0x3f, 0xf7, 0x13, 0x06, 0x08, + 0xf9, 0x13, 0xf2, 0x19, 0xfd, 0xf9, 0xf3, 0xe6, 0xfc, 0x07, 0xf6, 0xfd, + 0x0a, 0x22, 0x00, 0x01, 0x19, 0xff, 0xe7, 0xff, 0x08, 0xfd, 0x03, 0xfd, + 0x1f, 0xe7, 0x28, 0x08, 0xde, 0xf3, 0x43, 0xf6, 0x0c, 0xfe, 0x1e, 0x52, + 0xf2, 0x04, 0x17, 0xf2, 0x08, 0x0d, 0x04, 0x38, 0xde, 0x0c, 0x10, 0xef, + 0xdf, 0x0f, 0x01, 0x24, 0xde, 0xe1, 0x0d, 0xfd, 0xd4, 0xf6, 0x12, 0x0e, + 0xed, 0x01, 0xf0, 0xf3, 0xfd, 0xff, 0x18, 0xf3, 0x36, 0xda, 0xf6, 0xef, + 0xe8, 0xef, 0x37, 0x27, 0x4e, 0xf8, 0xf4, 0xff, 0xe5, 0xf3, 0x32, 0x0b, + 0x36, 0x08, 0xe9, 0xf6, 0xe2, 0x13, 0x21, 0xfe, 0x12, 0xed, 0xdd, 0xfb, + 0xf8, 0x05, 0x0f, 0x03, 0x1c, 0x04, 0xfc, 0xf2, 0x23, 0x0e, 0x03, 0xfc, + 0xf9, 0x18, 0xf7, 0x01, 0x1b, 0x03, 0xf5, 0xfd, 0xde, 0xf3, 0x19, 0xfc, + 0x11, 0x02, 0xe7, 0x13, 0xde, 0xd8, 0xf2, 0x05, 0x28, 0x02, 0x02, 0x27, + 0x07, 0x08, 0xff, 0x07, 0x27, 0x0e, 0x19, 0x40, 0xfb, 0x02, 0x0c, 0xf6, + 0x0d, 0x07, 0x0f, 0x47, 0xf8, 0x05, 0x0e, 0xfd, 0x03, 0x1e, 0x07, 0x32, + 0xe7, 0xf6, 0x24, 0x01, 0x01, 0x02, 0x0a, 0xff, 0xf6, 0x26, 0x15, 0xf0, + 0x04, 0x13, 0x03, 0xfa, 0xfe, 0xf6, 0xf1, 0x09, 0x2a, 0xe6, 0xea, 0xf6, + 0x17, 0x13, 0xeb, 0xff, 0x15, 0xeb, 0x23, 0x06, 0xc8, 0xf6, 0x33, 0xeb, + 0xf4, 0xe7, 0x12, 0x2a, 0xe3, 0xe6, 0x32, 0xfa, 0x16, 0x15, 0x17, 0x40, + 0xf1, 0x08, 0x1a, 0xf3, 0xf6, 0x0c, 0x0c, 0x11, 0xd0, 0x22, 0x02, 0xee, + 0xea, 0xf4, 0xf8, 0xf9, 0x13, 0x10, 0x17, 0xf5, 0xf1, 0x0a, 0x0e, 0xfd, + 0x32, 0xda, 0xf1, 0xe2, 0xdb, 0xf2, 0x34, 0x1f, 0x53, 0xfc, 0xe4, 0xf2, + 0xf6, 0xf2, 0x1d, 0x04, 0x4a, 0xec, 0xee, 0x06, 0xdf, 0x01, 0x1a, 0x04, + 0x27, 0xfc, 0xe6, 0xfd, 0xd9, 0xfd, 0x0e, 0x00, 0x0c, 0x16, 0xf3, 0x03, + 0xf7, 0xfc, 0x0e, 0x0f, 0x09, 0x06, 0x06, 0x04, 0x08, 0x02, 0xed, 0xf5, + 0xe4, 0xe6, 0x07, 0x06, 0x03, 0x18, 0xea, 0x13, 0xe2, 0xfa, 0x10, 0xf2, + 0x02, 0xec, 0x03, 0x3c, 0xf6, 0xf6, 0x0a, 0x10, 0x09, 0xf8, 0x15, 0x24, + 0xfd, 0x0d, 0x09, 0x01, 0x00, 0xff, 0x00, 0x1a, 0xf0, 0xee, 0x08, 0x03, + 0x1d, 0x05, 0x16, 0x46, 0xe6, 0xf8, 0x08, 0x00, 0x09, 0x09, 0xff, 0x01, + 0xfc, 0x20, 0xfc, 0xec, 0x05, 0x1b, 0x03, 0xf1, 0x12, 0xe4, 0xfa, 0x24, + 0x1c, 0xf5, 0xf2, 0x05, 0x11, 0xe7, 0xfa, 0x02, 0x20, 0xea, 0x31, 0x10, + 0xcf, 0xd8, 0x33, 0xee, 0xff, 0x09, 0x20, 0x3f, 0xe2, 0x0a, 0x29, 0xee, + 0x3a, 0xf2, 0x1e, 0x39, 0x02, 0x1e, 0xfe, 0xf2, 0xef, 0xe2, 0x0d, 0x0f, + 0xf1, 0x19, 0x02, 0xe7, 0xec, 0xff, 0xfe, 0xe4, 0xfe, 0xfb, 0x02, 0xf6, + 0xf1, 0xf4, 0x07, 0x1a, 0x2a, 0xf9, 0x06, 0xf9, 0xda, 0xf4, 0x22, 0x02, + 0x4f, 0x0a, 0xf3, 0xfc, 0xf3, 0xf6, 0x25, 0x0a, 0x28, 0x01, 0xf7, 0x09, + 0xe6, 0x05, 0x28, 0xf7, 0x1e, 0xf2, 0xee, 0x13, 0xee, 0x05, 0x0f, 0x0a, + 0x09, 0xe8, 0xe8, 0x0e, 0x05, 0x12, 0x0f, 0x15, 0x02, 0xec, 0xf8, 0x02, + 0xf7, 0x05, 0xf8, 0xff, 0xdc, 0x00, 0x01, 0x00, 0x12, 0x17, 0xec, 0x19, + 0xfa, 0x09, 0xfa, 0xf3, 0x1d, 0x0b, 0x07, 0x25, 0xea, 0x0c, 0xf5, 0xfa, + 0x04, 0xf7, 0xfe, 0x33, 0xfe, 0x14, 0xef, 0x04, 0xf0, 0x00, 0x00, 0x3a, + 0xea, 0xfa, 0x10, 0x01, 0xe4, 0x00, 0xff, 0x23, 0xe9, 0x26, 0x15, 0x10, + 0x04, 0x14, 0x0d, 0x08, 0xf8, 0xfd, 0x10, 0xfb, 0x00, 0x21, 0x06, 0xfa, + 0x0f, 0x08, 0xf1, 0x09, 0x28, 0xf0, 0xd8, 0x0d, 0x08, 0x09, 0x02, 0xfb, + 0x12, 0x03, 0x0e, 0xfb, 0xce, 0xf0, 0x39, 0xe5, 0x09, 0xf6, 0x1f, 0x35, + 0xdd, 0x1c, 0x25, 0xef, 0x17, 0x0c, 0xf6, 0x3e, 0xf0, 0x21, 0x08, 0xff, + 0xd7, 0xfc, 0xfd, 0x1f, 0xe5, 0x18, 0x12, 0xe9, 0xf5, 0xe9, 0x12, 0xf6, + 0x02, 0x13, 0xf4, 0x0a, 0xfd, 0x03, 0x09, 0x08, 0x2f, 0x07, 0xee, 0xfd, + 0xd7, 0x00, 0x2b, 0x29, 0x3b, 0xdb, 0xde, 0xf1, 0xe1, 0xf7, 0x47, 0x12, + 0x35, 0x0c, 0xe4, 0x09, 0xef, 0x17, 0x2b, 0xea, 0x2d, 0xf8, 0xe8, 0x18, + 0xef, 0x03, 0x11, 0x0a, 0x10, 0xff, 0xe8, 0x07, 0x0c, 0x07, 0x03, 0x18, + 0x05, 0x08, 0xf8, 0xf8, 0x06, 0x18, 0xe9, 0xf9, 0xe0, 0x0f, 0x0d, 0x18, + 0x04, 0x01, 0xf0, 0x1c, 0xf6, 0x14, 0xfd, 0x12, 0x0c, 0x0c, 0x02, 0x34, + 0xf6, 0xe6, 0xfd, 0xf9, 0xf9, 0xfd, 0x00, 0x2a, 0xfc, 0xf9, 0xff, 0x0a, + 0xfe, 0x1b, 0xf5, 0x34, 0xdc, 0xf9, 0x15, 0x13, 0xe7, 0x1b, 0xf7, 0x25, + 0xfd, 0x09, 0x08, 0x0a, 0xf0, 0x17, 0x0f, 0x04, 0xf4, 0xe9, 0x06, 0x07, + 0xf5, 0x02, 0xfc, 0xf5, 0x09, 0xee, 0xf1, 0x07, 0x38, 0x03, 0x05, 0x0f, + 0x16, 0x0f, 0xed, 0xff, 0x21, 0xf8, 0x34, 0x07, 0xd1, 0xf9, 0x27, 0x00, + 0x0c, 0x21, 0x18, 0x42, 0xe6, 0x02, 0x1a, 0xf1, 0x2f, 0xf1, 0x0e, 0x3b, + 0xee, 0xf8, 0x08, 0xea, 0xfe, 0xf9, 0x03, 0x18, 0xf5, 0xf8, 0x0d, 0xeb, + 0x01, 0x10, 0x09, 0x02, 0x15, 0xfb, 0xf1, 0x0b, 0xf2, 0x06, 0x08, 0x09, + 0x2f, 0x19, 0x02, 0xfe, 0xe4, 0x06, 0x1f, 0x17, 0x49, 0xf2, 0xe2, 0x02, + 0xef, 0x04, 0x26, 0x16, 0x3f, 0x08, 0xf1, 0x0a, 0xfd, 0xf9, 0x28, 0x01, + 0x15, 0x0b, 0xf9, 0x10, 0xdc, 0x02, 0x20, 0xf7, 0x16, 0xe6, 0x09, 0x03, + 0xf1, 0xf5, 0x12, 0x1c, 0xfb, 0x2a, 0x08, 0xfa, 0x0a, 0x16, 0xf6, 0x15, + 0xf0, 0x06, 0x11, 0xfd, 0x0e, 0xf9, 0xf6, 0x12, 0xed, 0xf3, 0xfd, 0x1f, + 0x0b, 0xfa, 0x08, 0x30, 0xf8, 0xff, 0x0b, 0xeb, 0x10, 0xff, 0x07, 0x22, + 0x0d, 0x07, 0x09, 0x03, 0xf6, 0xf8, 0xfc, 0x26, 0xf8, 0xee, 0x11, 0x02, + 0x03, 0x0a, 0xef, 0x38, 0xfe, 0x13, 0x1b, 0x09, 0xfe, 0x06, 0x05, 0xf3, + 0x04, 0xdf, 0xfc, 0x00, 0xe7, 0x15, 0xec, 0xf1, 0xf8, 0xfc, 0xed, 0x05, + 0x0e, 0xf3, 0x15, 0x09, 0x01, 0x0d, 0xfd, 0x00, 0x24, 0xe2, 0x31, 0x13, + 0xd5, 0x1b, 0x2b, 0xe8, 0x03, 0x08, 0x1d, 0x33, 0xdc, 0xfd, 0x24, 0xe4, + 0x20, 0xfa, 0x07, 0x33, 0x01, 0x12, 0x06, 0xf5, 0xef, 0xf7, 0xfa, 0x13, + 0x01, 0xec, 0xee, 0xe0, 0xfd, 0x0d, 0xff, 0x09, 0xf6, 0x00, 0xed, 0x07, + 0xea, 0x0e, 0xff, 0x0e, 0x26, 0xfc, 0xf0, 0xe7, 0xe7, 0xfe, 0x30, 0xff, + 0x24, 0x04, 0x06, 0xf4, 0xf5, 0xf8, 0x23, 0x0e, 0x3d, 0xf2, 0xfd, 0x04, + 0xe8, 0xfb, 0x23, 0xfe, 0x33, 0xe1, 0x01, 0xfd, 0xdc, 0xfb, 0x0e, 0xfa, + 0x22, 0xfb, 0x11, 0xfa, 0xff, 0x08, 0x21, 0x30, 0x13, 0x03, 0xf2, 0x03, + 0xf8, 0x0f, 0xec, 0x0d, 0xef, 0x0f, 0x10, 0x10, 0x0f, 0xf6, 0xf9, 0x1e, + 0xf7, 0xe5, 0x08, 0xfa, 0x09, 0xff, 0x00, 0x15, 0x02, 0x00, 0x08, 0xfe, + 0xfb, 0x0e, 0x15, 0x28, 0xfa, 0xfb, 0x13, 0x06, 0xfb, 0x05, 0xf6, 0x11, + 0xf6, 0x0b, 0x06, 0x15, 0xe1, 0x00, 0xe9, 0x0f, 0xe1, 0x1d, 0x18, 0xfd, + 0x0b, 0x0f, 0xff, 0xf2, 0xf5, 0xfd, 0x14, 0xff, 0xf4, 0xfe, 0xe2, 0xf8, + 0x14, 0x0b, 0xeb, 0x07, 0x35, 0xe2, 0xeb, 0x0b, 0x04, 0x22, 0xfe, 0x0e, + 0x1d, 0xf2, 0x24, 0x11, 0xcc, 0xec, 0x25, 0xf7, 0xff, 0xf9, 0x06, 0x29, + 0xe4, 0x07, 0x1c, 0xdb, 0xf8, 0x1d, 0xfa, 0x44, 0xf2, 0x01, 0x0f, 0xe6, + 0x11, 0x03, 0xee, 0x17, 0x06, 0xe0, 0x0c, 0xd8, 0xe9, 0xfd, 0x11, 0xfe, + 0x07, 0xdd, 0xea, 0xff, 0xde, 0xdd, 0x0a, 0x09, 0x30, 0xf2, 0x01, 0xe4, + 0xe0, 0xeb, 0x2d, 0x12, 0x2d, 0xeb, 0xfc, 0xf0, 0xe8, 0xf9, 0x1f, 0x08, + 0x3f, 0xeb, 0x0e, 0x13, 0xf9, 0x0c, 0x1c, 0x02, 0x25, 0xec, 0xf6, 0x05, + 0xf3, 0xf4, 0x18, 0x08, 0x12, 0xe9, 0xfb, 0xfd, 0xf9, 0x08, 0x13, 0x1c, + 0x08, 0xec, 0xfe, 0x02, 0xf1, 0x19, 0xf3, 0x1d, 0xf1, 0x07, 0x11, 0x12, + 0xfa, 0xf2, 0xf6, 0x0d, 0xff, 0x17, 0x0a, 0xfb, 0x1f, 0xf8, 0x11, 0x24, + 0xf6, 0xfc, 0xfe, 0x07, 0xed, 0x05, 0x1c, 0x21, 0xfe, 0xfe, 0x16, 0x0d, + 0x08, 0x0f, 0x09, 0x33, 0xf4, 0x1f, 0x14, 0x0c, 0xfe, 0xf5, 0xeb, 0x2a, + 0xee, 0xf3, 0x12, 0x19, 0xec, 0x01, 0x06, 0xf7, 0x05, 0x22, 0x0b, 0xeb, + 0xeb, 0x06, 0xe1, 0xf5, 0x0d, 0xee, 0xfb, 0x0a, 0x31, 0xff, 0xe3, 0xea, + 0x18, 0x09, 0xe3, 0x07, 0x1a, 0xf8, 0x15, 0xfc, 0xcc, 0xf2, 0x2a, 0xe5, + 0x01, 0xea, 0x10, 0x1f, 0xd9, 0x02, 0x13, 0xf6, 0x16, 0x01, 0x0e, 0x3c, + 0x02, 0x17, 0x04, 0xf1, 0xf7, 0x02, 0x07, 0x0c, 0x02, 0x1f, 0xf4, 0xe6, + 0xf0, 0xe9, 0x05, 0xf4, 0xfd, 0xe4, 0xf7, 0xe9, 0xfc, 0xef, 0x06, 0x02, + 0x26, 0xf1, 0xf1, 0xeb, 0xe9, 0xe6, 0x30, 0x1c, 0x38, 0x0f, 0x03, 0xf1, + 0x10, 0x04, 0x30, 0x19, 0x1f, 0xfb, 0xfc, 0x05, 0xe2, 0xfe, 0x18, 0xf2, + 0x1c, 0xf2, 0xf5, 0x0e, 0xf2, 0x05, 0x1d, 0x28, 0x12, 0xf0, 0xf0, 0x0f, + 0x0a, 0x03, 0x1a, 0x1a, 0xf3, 0x08, 0x13, 0xef, 0xf5, 0x1c, 0x06, 0x00, + 0xee, 0x12, 0x1d, 0x03, 0x18, 0x06, 0x0a, 0x0e, 0xf0, 0xeb, 0xfa, 0x0d, + 0x08, 0xff, 0x06, 0x24, 0x0f, 0x03, 0x0a, 0x0f, 0x0e, 0xff, 0x08, 0x33, + 0xfc, 0x00, 0x0e, 0xfb, 0xfb, 0x05, 0x07, 0x19, 0xe8, 0xe7, 0x12, 0x11, + 0x15, 0xf7, 0x0c, 0x1a, 0xf6, 0x28, 0x08, 0xeb, 0xf2, 0x25, 0xee, 0x01, + 0x03, 0xec, 0xed, 0xfa, 0xf0, 0xf2, 0xef, 0xf1, 0x02, 0x23, 0xef, 0x01, + 0x41, 0xfa, 0xf4, 0xf4, 0x15, 0xf5, 0xf5, 0xf9, 0x28, 0xde, 0x20, 0xf6, + 0xc7, 0xde, 0x21, 0xe4, 0xfe, 0xec, 0x0d, 0x2c, 0xee, 0x24, 0x10, 0xf0, + 0x1d, 0x12, 0x0e, 0x2b, 0x06, 0xf8, 0xfd, 0x01, 0x08, 0xef, 0xfd, 0x0f, + 0xeb, 0xed, 0xe1, 0xdf, 0xf1, 0xe5, 0x16, 0xe3, 0x08, 0xfc, 0xf6, 0xf6, + 0xd8, 0xf0, 0x23, 0xfc, 0x2b, 0xf5, 0xff, 0xe7, 0xf4, 0xe9, 0x29, 0x09, + 0x2b, 0x0c, 0xff, 0x08, 0x0b, 0xed, 0x29, 0x14, 0x3c, 0xf5, 0xeb, 0x18, + 0xf6, 0x10, 0x22, 0xf9, 0x17, 0x23, 0x02, 0x0c, 0xf6, 0xfa, 0x2f, 0xfe, + 0x1e, 0xeb, 0xfd, 0x03, 0xf0, 0x07, 0x1c, 0x09, 0xfa, 0xe1, 0x0d, 0x0f, + 0x18, 0x03, 0xfe, 0xf0, 0xec, 0x0b, 0x10, 0x02, 0x14, 0x06, 0xef, 0xf7, + 0xea, 0x0b, 0x05, 0xfe, 0x1f, 0x06, 0x0e, 0x07, 0x00, 0xe1, 0x01, 0x01, + 0x07, 0x05, 0x09, 0xf7, 0xef, 0x15, 0xf7, 0x12, 0x05, 0x03, 0x04, 0x1d, + 0x04, 0x10, 0x12, 0x06, 0x05, 0x00, 0x08, 0x18, 0xd6, 0xf2, 0xfa, 0x07, + 0xf8, 0x12, 0x07, 0xfd, 0xdd, 0x00, 0x04, 0xfb, 0xf8, 0x09, 0xf3, 0x09, + 0xfb, 0xf0, 0xe8, 0x09, 0x27, 0xf5, 0xf8, 0x06, 0x01, 0x02, 0x0e, 0xf6, + 0x1f, 0xfa, 0x29, 0xf8, 0xd6, 0x01, 0x22, 0xf8, 0x1d, 0xe3, 0x1a, 0x39, + 0x0a, 0x0d, 0x19, 0xf5, 0x12, 0xfb, 0x1d, 0x2a, 0x03, 0xf6, 0x0c, 0xf2, + 0xfd, 0xec, 0x18, 0x13, 0xfe, 0x1a, 0xe8, 0xdd, 0x01, 0xf8, 0x30, 0x01, + 0xf8, 0xfe, 0xe4, 0xe7, 0xff, 0xeb, 0x23, 0xfa, 0x2c, 0xf0, 0xfc, 0xe7, + 0x0a, 0xf8, 0x18, 0x10, 0x23, 0x01, 0xfa, 0xe8, 0xf1, 0xfa, 0x1d, 0x0e, + 0x17, 0xe7, 0xe4, 0xf5, 0xf9, 0x0c, 0x17, 0x0c, 0x13, 0xe8, 0xe1, 0x17, + 0x19, 0x05, 0x0b, 0x0f, 0x23, 0xed, 0xff, 0xfe, 0xe0, 0x14, 0x16, 0x00, + 0x0d, 0x1c, 0x0b, 0xf5, 0xfb, 0x18, 0xee, 0xff, 0xff, 0xf3, 0x18, 0x0c, + 0x05, 0xfa, 0xf6, 0xfe, 0xfe, 0xf8, 0xf8, 0x09, 0xef, 0xf8, 0x0e, 0xf0, + 0x00, 0xf8, 0x0c, 0xf8, 0xf6, 0x07, 0x16, 0x11, 0xf8, 0xea, 0xff, 0xff, + 0x01, 0x20, 0x07, 0x08, 0xfd, 0x1c, 0xfc, 0x06, 0xed, 0x0d, 0x08, 0x15, + 0xf0, 0x25, 0x01, 0x1b, 0x00, 0x02, 0xfe, 0x01, 0x05, 0x01, 0xfd, 0xf1, + 0xe5, 0x0c, 0xe4, 0xe1, 0xf0, 0xfa, 0xee, 0x0e, 0x35, 0xee, 0x15, 0xef, + 0x0a, 0xf9, 0x01, 0xf5, 0x1f, 0x05, 0x1f, 0x0d, 0xe1, 0xf4, 0xff, 0xf5, + 0x23, 0x02, 0x18, 0x30, 0xfc, 0xf0, 0x0d, 0x04, 0x0d, 0x06, 0x29, 0x1d, + 0xf9, 0x08, 0x06, 0xe5, 0x13, 0xfd, 0x0d, 0x26, 0xef, 0x09, 0xdc, 0xf2, + 0x05, 0xdf, 0x0c, 0xf6, 0xf3, 0xd9, 0xf8, 0x08, 0xef, 0xeb, 0x0f, 0xf9, + 0x3a, 0x03, 0xff, 0xe0, 0xf7, 0xf0, 0x15, 0x12, 0x41, 0x0b, 0xf1, 0x04, + 0x04, 0xe2, 0x0e, 0x0b, 0x2c, 0x03, 0xea, 0x02, 0xfb, 0xe7, 0x08, 0xe9, + 0x22, 0xf3, 0xf2, 0x1c, 0xfa, 0xf3, 0x11, 0x04, 0x1f, 0xf5, 0x02, 0x0f, + 0x1a, 0x1f, 0x24, 0x0b, 0x06, 0x1f, 0xf3, 0x06, 0x00, 0x02, 0xe8, 0xf6, + 0xf4, 0xe8, 0x07, 0x2e, 0xfb, 0xf8, 0x10, 0x09, 0xf0, 0x0e, 0xff, 0xfe, + 0x1c, 0x14, 0x17, 0x06, 0xe2, 0xf1, 0xfa, 0x01, 0x11, 0x13, 0x12, 0x29, + 0xf1, 0x0f, 0x1f, 0xfa, 0xfd, 0xfd, 0x02, 0x07, 0x0e, 0xfb, 0x0e, 0x04, + 0x01, 0x01, 0xed, 0xfe, 0xde, 0xfd, 0x08, 0xef, 0xf6, 0x0a, 0xff, 0x0f, + 0xe7, 0xf2, 0x0f, 0x02, 0xea, 0x10, 0xf9, 0xec, 0xfd, 0x09, 0xea, 0x1f, + 0x46, 0xdd, 0xe2, 0xf7, 0x08, 0xf5, 0xf7, 0xe9, 0x33, 0xfb, 0x2f, 0xf6, + 0xb5, 0x1d, 0x15, 0xeb, 0x11, 0xf7, 0x2a, 0x2e, 0x08, 0x1d, 0xf4, 0xfb, + 0x15, 0xfa, 0x22, 0x34, 0xff, 0x06, 0xf6, 0xfd, 0xfa, 0xf9, 0x03, 0xf5, + 0xf4, 0xf4, 0xd5, 0xea, 0x01, 0x08, 0x22, 0xf1, 0xf2, 0x06, 0xd1, 0xe5, + 0x0c, 0xef, 0x12, 0x03, 0x08, 0x02, 0xf7, 0x05, 0x1b, 0x07, 0x39, 0x34, + 0x21, 0xe2, 0xe3, 0x0b, 0x0c, 0xf6, 0x29, 0xf7, 0x24, 0x0a, 0xfc, 0xff, + 0x1a, 0xfd, 0x05, 0xff, 0xff, 0x0e, 0x0a, 0x1a, 0x09, 0xfb, 0x15, 0x04, + 0x03, 0xf7, 0xfe, 0x00, 0xfc, 0xfb, 0x11, 0xfa, 0x1d, 0x0e, 0x06, 0xed, + 0xfc, 0x23, 0xd8, 0xf2, 0x04, 0xe5, 0x0f, 0x16, 0x29, 0xfe, 0xf5, 0xec, + 0xe2, 0x0e, 0xeb, 0x09, 0x1d, 0x11, 0x05, 0x11, 0xe4, 0x29, 0x12, 0x02, + 0x12, 0x19, 0x0e, 0x1a, 0xee, 0xf9, 0x05, 0x09, 0xf5, 0xfd, 0x05, 0x04, + 0xe4, 0xf1, 0x17, 0x01, 0xf2, 0xfe, 0x0b, 0xf4, 0x0d, 0x04, 0x06, 0xfe, + 0xff, 0xec, 0xe9, 0x00, 0xff, 0x03, 0x03, 0xfd, 0xf1, 0x15, 0xfc, 0xf3, + 0xff, 0xfe, 0x09, 0xee, 0x3c, 0x01, 0xec, 0x02, 0xf0, 0xf6, 0x20, 0xeb, + 0x16, 0x07, 0x32, 0xf3, 0xce, 0xf0, 0x02, 0xd4, 0x11, 0xe6, 0x28, 0x0e, + 0xe3, 0x21, 0xee, 0xce, 0x1e, 0xd9, 0x23, 0x26, 0x06, 0xfa, 0xf9, 0xf1, + 0x01, 0xe6, 0x0b, 0x07, 0xdc, 0x21, 0xbc, 0xe3, 0xef, 0xf8, 0x12, 0xfc, + 0xe6, 0xfe, 0xf5, 0xd4, 0x15, 0x0a, 0x00, 0x13, 0xfc, 0xec, 0xf3, 0xd6, + 0x1a, 0xe3, 0x21, 0x36, 0x2a, 0x03, 0xe9, 0xe3, 0xff, 0x00, 0x13, 0x1c, + 0x0e, 0x20, 0xe5, 0xf5, 0x24, 0x0b, 0x20, 0x14, 0x13, 0xf8, 0x04, 0x1b, + 0x2f, 0x0a, 0x15, 0x00, 0xf4, 0x1a, 0x11, 0x0d, 0x03, 0x18, 0x0f, 0x18, + 0x04, 0x1f, 0xfb, 0xf2, 0x1f, 0x15, 0x03, 0xfb, 0x0b, 0x17, 0xfb, 0x0b, + 0x1b, 0x1f, 0xf4, 0x07, 0xf9, 0xf9, 0xf8, 0xf4, 0x14, 0x0f, 0xf6, 0xfe, + 0xdd, 0x0b, 0xff, 0x01, 0x18, 0x04, 0x1b, 0x0a, 0xed, 0xe7, 0xf9, 0x16, + 0x02, 0x01, 0x00, 0xf7, 0xf1, 0x07, 0xf0, 0x06, 0xf8, 0x0b, 0x02, 0xf3, + 0xff, 0x20, 0xfd, 0x01, 0x04, 0xf5, 0xd9, 0xf4, 0xf4, 0xf2, 0xe8, 0xff, + 0x04, 0x00, 0xf0, 0xe2, 0xfe, 0xed, 0x1b, 0xef, 0x20, 0xfa, 0xfb, 0xf4, + 0x02, 0x18, 0x07, 0xfb, 0xef, 0xe4, 0x08, 0x0d, 0xe1, 0x0e, 0x25, 0xc6, + 0xfd, 0x0c, 0x1c, 0x0b, 0xf0, 0x01, 0x1c, 0xd4, 0x11, 0xf5, 0x1b, 0x09, + 0xfb, 0xda, 0x13, 0xe3, 0xf9, 0x10, 0x14, 0xf0, 0xf0, 0xfd, 0x1f, 0xcf, + 0xf4, 0xe4, 0xfb, 0x0e, 0x0a, 0x11, 0xed, 0xdc, 0xfc, 0xe6, 0xf7, 0xfc, + 0x13, 0xe1, 0x0b, 0xe4, 0x04, 0x11, 0xee, 0x21, 0x14, 0xe1, 0x07, 0xe4, + 0xfb, 0x08, 0x03, 0x2b, 0x27, 0xf6, 0x0d, 0x02, 0x1b, 0x09, 0x09, 0xf8, + 0x14, 0x19, 0x0f, 0x0b, 0x01, 0x10, 0x09, 0x12, 0x03, 0xf5, 0x18, 0xf3, + 0xfb, 0xf5, 0x02, 0x0e, 0x0d, 0x00, 0x07, 0xfc, 0x18, 0x25, 0x0b, 0xf0, + 0xf9, 0xe6, 0x08, 0x01, 0x24, 0x14, 0xfa, 0xed, 0xe5, 0x1f, 0x09, 0xfe, + 0x08, 0xee, 0x1a, 0x1a, 0x05, 0x00, 0xff, 0x0c, 0xfe, 0xf9, 0x11, 0x11, + 0xea, 0xfe, 0x08, 0xf9, 0xf0, 0xe4, 0x01, 0x0d, 0xf1, 0x00, 0x0b, 0xea, + 0x19, 0xea, 0xf3, 0xf8, 0x08, 0x12, 0x1c, 0x1f, 0xfb, 0xef, 0xf0, 0xf2, + 0x14, 0xe1, 0x03, 0xfa, 0xf9, 0xda, 0xe9, 0xfc, 0xf3, 0xff, 0x12, 0x04, + 0xf7, 0xfc, 0x17, 0x0f, 0xfc, 0x29, 0x03, 0xe5, 0xf2, 0xee, 0x1e, 0xfa, + 0x04, 0xed, 0x25, 0xf4, 0xe1, 0x15, 0x10, 0x1e, 0xef, 0x1c, 0x04, 0xde, + 0xe5, 0x08, 0x21, 0xfd, 0xfd, 0xea, 0x03, 0xca, 0xda, 0x26, 0x00, 0x0a, + 0xfd, 0x05, 0xf0, 0xd4, 0xe1, 0x1a, 0xe4, 0xf5, 0x07, 0xe7, 0xfa, 0xdf, + 0xd4, 0x03, 0xf0, 0x10, 0x15, 0x0c, 0xf4, 0xed, 0xe3, 0xfb, 0x0f, 0x1e, + 0x16, 0x09, 0x00, 0xec, 0xea, 0x13, 0x16, 0x0b, 0x01, 0xfb, 0xff, 0x00, + 0xfb, 0x07, 0x13, 0x08, 0xf4, 0xe4, 0x12, 0x00, 0xfb, 0xfa, 0xfc, 0x08, + 0xeb, 0x19, 0x02, 0x1c, 0xe8, 0x26, 0xf3, 0x10, 0x09, 0x0f, 0x19, 0x02, + 0xfb, 0xec, 0xf7, 0xe2, 0xfb, 0xfa, 0x11, 0xf3, 0x0b, 0x08, 0xff, 0xd9, + 0xf8, 0x12, 0x18, 0x06, 0x07, 0x22, 0xff, 0x19, 0xf5, 0x0b, 0x0a, 0x13, + 0xf2, 0xfa, 0x02, 0x21, 0xeb, 0x11, 0x17, 0x17, 0xec, 0xe1, 0x0e, 0xf7, + 0xe8, 0xd8, 0x0e, 0x01, 0xf1, 0xed, 0xed, 0xf0, 0x09, 0xf7, 0xe7, 0xfd, + 0xf0, 0xf9, 0xdb, 0xee, 0xdc, 0xfb, 0xf8, 0x0a, 0xf5, 0x0b, 0xd4, 0xd7, + 0x08, 0x06, 0x18, 0x06, 0x0c, 0x13, 0xfd, 0x09, 0x13, 0x26, 0x12, 0xf4, + 0xef, 0x00, 0xf5, 0x28, 0x18, 0xfe, 0x04, 0x0e, 0x21, 0x1a, 0x0a, 0x1e, + 0x09, 0xf0, 0x0d, 0x0f, 0xec, 0xf3, 0x17, 0x22, 0x00, 0xec, 0x0e, 0x01, + 0xe9, 0x08, 0x09, 0xf2, 0xf2, 0x08, 0xf0, 0x0b, 0xd9, 0x09, 0x14, 0xf5, + 0xf6, 0x04, 0x19, 0xf4, 0x11, 0xe9, 0xf2, 0x0d, 0x20, 0x17, 0x0a, 0x05, + 0x0c, 0x04, 0x01, 0xfd, 0xf4, 0xfb, 0x1b, 0x0c, 0xf2, 0x0b, 0xff, 0xfe, + 0x01, 0xd8, 0xfa, 0x0e, 0xf5, 0x14, 0xf9, 0x01, 0x04, 0xf8, 0xfa, 0x02, + 0xe8, 0xf9, 0xf9, 0xea, 0xf1, 0x07, 0xff, 0x1e, 0x01, 0x0b, 0xf7, 0x0a, + 0xf7, 0x0c, 0xfd, 0xec, 0xf3, 0x05, 0xf8, 0xda, 0x0b, 0x15, 0xf6, 0xee, + 0xf9, 0x10, 0xfa, 0xfe, 0x08, 0xf0, 0xe6, 0xec, 0x05, 0xff, 0x15, 0x19, + 0x1f, 0x11, 0xfc, 0x09, 0x08, 0x01, 0x06, 0xfe, 0x04, 0x08, 0xfb, 0xfb, + 0x08, 0xf4, 0xf6, 0x28, 0x10, 0xf9, 0x28, 0x0b, 0xf8, 0x0d, 0x01, 0x00, + 0xff, 0x02, 0x05, 0x08, 0xea, 0xe9, 0xf4, 0xf6, 0x01, 0xea, 0xdf, 0x1f, + 0xfe, 0x0a, 0xf9, 0xf7, 0x0c, 0x1b, 0x06, 0xed, 0xf6, 0xf2, 0x03, 0x03, + 0xfd, 0x04, 0xf5, 0x10, 0x0a, 0x0b, 0xf4, 0xf8, 0xf1, 0xe7, 0x05, 0xfe, + 0xe7, 0x0b, 0xf1, 0xec, 0xf4, 0xec, 0x06, 0xee, 0xde, 0x05, 0x1b, 0xfe, + 0x13, 0xf3, 0xd9, 0xea, 0x04, 0x10, 0x05, 0xed, 0x15, 0x02, 0x0b, 0x10, + 0xfa, 0x02, 0x05, 0x0b, 0x02, 0x07, 0xfc, 0xf5, 0x15, 0x14, 0x05, 0xf7, + 0x0c, 0xfe, 0xf6, 0xf4, 0xfa, 0x06, 0xfc, 0x13, 0xdc, 0xe4, 0x09, 0xfa, + 0x02, 0x23, 0xec, 0x06, 0x11, 0x13, 0xf8, 0xfa, 0x27, 0x28, 0x0b, 0x23, + 0xec, 0xf1, 0x09, 0x17, 0x0f, 0x13, 0xff, 0xf2, 0xfc, 0x0a, 0xf5, 0x0d, + 0x03, 0x26, 0x01, 0x0f, 0xfe, 0xf1, 0xfb, 0xe6, 0xf0, 0x02, 0xf2, 0xff, + 0x02, 0x11, 0xff, 0xfd, 0x1c, 0x02, 0x0b, 0xf6, 0x14, 0x0c, 0x0b, 0x21, + 0x28, 0xf0, 0x11, 0x05, 0x06, 0xed, 0xf9, 0x0a, 0xf2, 0xef, 0xf8, 0xf1, + 0xfe, 0x0d, 0xf9, 0xf7, 0xea, 0x00, 0x08, 0xdb, 0x02, 0x0f, 0xfe, 0x04, + 0xef, 0x20, 0x16, 0x01, 0xe8, 0xed, 0xe4, 0x22, 0xf6, 0x19, 0x00, 0x04, + 0x01, 0x13, 0xeb, 0x0d, 0xec, 0x01, 0x08, 0x05, 0x0c, 0x0e, 0xfe, 0x02, + 0x12, 0xf7, 0x27, 0xf9, 0xfd, 0x18, 0xfe, 0x24, 0xf7, 0x13, 0xed, 0x1e, + 0x09, 0xff, 0xd8, 0xf4, 0x12, 0xf8, 0x04, 0x0c, 0x1c, 0x11, 0xfd, 0x17, + 0x1d, 0x01, 0x13, 0xee, 0x11, 0xf3, 0xf8, 0x06, 0xf6, 0x16, 0xfe, 0x15, + 0x16, 0xdc, 0x1f, 0x00, 0x25, 0xee, 0xff, 0xf7, 0xf6, 0x02, 0xdd, 0x15, + 0xf1, 0x14, 0x08, 0xe8, 0xe5, 0x21, 0xea, 0xf0, 0x1a, 0x07, 0xea, 0x08, + 0xea, 0xe4, 0x1e, 0x00, 0x13, 0x17, 0xec, 0x11, 0xd6, 0x11, 0x18, 0x17, + 0x04, 0x15, 0x03, 0x3a, 0xd6, 0x02, 0x07, 0x04, 0xe6, 0xe5, 0xfe, 0x0e, + 0xff, 0xed, 0xfc, 0xfb, 0xff, 0x1c, 0x06, 0x0a, 0xfb, 0xf9, 0xea, 0x1a, + 0x21, 0xf5, 0x04, 0x06, 0x0a, 0xe3, 0x16, 0xea, 0x04, 0xe2, 0xf9, 0xf9, + 0xe6, 0xfb, 0x0f, 0xfc, 0x06, 0xfb, 0x10, 0x07, 0x07, 0x13, 0x07, 0xfc, + 0x16, 0xef, 0x07, 0xdc, 0x12, 0x1f, 0x08, 0xf4, 0xe9, 0x14, 0x06, 0xf7, + 0xf1, 0x0c, 0x01, 0x0c, 0xe6, 0x04, 0xf3, 0xf2, 0xe5, 0xf3, 0xef, 0x1d, + 0xf6, 0x20, 0x07, 0xfe, 0xf4, 0x05, 0xee, 0x10, 0xfd, 0x0e, 0x0b, 0x02, + 0x0d, 0xd8, 0x07, 0xfb, 0x26, 0x0a, 0x1c, 0x21, 0x06, 0x1f, 0xf4, 0x06, + 0x37, 0x18, 0xfa, 0x16, 0x1e, 0x24, 0xfb, 0xf0, 0x12, 0xf9, 0x02, 0x09, + 0x17, 0x16, 0xf3, 0xf9, 0x17, 0xf2, 0x02, 0x0a, 0x2d, 0xe7, 0xe3, 0x25, + 0xf0, 0xf9, 0x0f, 0xdd, 0x15, 0xe6, 0x04, 0xfc, 0xf1, 0x17, 0x0a, 0xea, + 0x24, 0x07, 0xf1, 0x11, 0x13, 0x29, 0xf4, 0xc5, 0xfb, 0x07, 0xef, 0x13, + 0x0b, 0xe1, 0xf1, 0xeb, 0xf8, 0x1b, 0x09, 0x08, 0x1f, 0x15, 0xf2, 0x05, + 0x02, 0xdd, 0x09, 0x0f, 0x16, 0x10, 0x01, 0x30, 0xf2, 0xe0, 0x27, 0xfe, + 0xf1, 0x0e, 0x0e, 0x07, 0xe6, 0x07, 0x0b, 0x18, 0xfe, 0x0f, 0x01, 0x07, + 0xf4, 0x07, 0x10, 0xe7, 0xfb, 0xf3, 0xf7, 0x0b, 0xf9, 0x15, 0x18, 0x25, + 0x0c, 0x14, 0x02, 0x08, 0x0a, 0x0f, 0x10, 0xec, 0xee, 0x1a, 0x03, 0x14, + 0x0f, 0xfa, 0x25, 0xff, 0x18, 0x0d, 0x0b, 0xea, 0x1f, 0x28, 0x10, 0x0c, + 0xe7, 0xee, 0xf7, 0xfa, 0x03, 0x15, 0x0c, 0x1d, 0x01, 0x00, 0x12, 0xee, + 0x01, 0xf1, 0xf8, 0x0b, 0xf3, 0xfd, 0x04, 0xf8, 0x02, 0x1e, 0x0e, 0xf3, + 0x02, 0x10, 0xfd, 0x07, 0x0b, 0x09, 0x03, 0x10, 0x3e, 0x08, 0x0e, 0x0c, + 0xf4, 0xe7, 0xfd, 0x1c, 0x27, 0x1a, 0xed, 0xe1, 0x08, 0xdc, 0xd9, 0xf1, + 0x1e, 0x07, 0x12, 0xf1, 0x10, 0xfb, 0xc8, 0x08, 0x0f, 0x03, 0x1d, 0xdc, + 0x23, 0x04, 0xf9, 0x0a, 0xff, 0x08, 0x0e, 0xc9, 0x39, 0x0a, 0x01, 0x07, + 0xec, 0xe0, 0x05, 0xe8, 0x14, 0xd8, 0xe1, 0xfa, 0xd6, 0xf8, 0xed, 0xdb, + 0xff, 0x1d, 0xf5, 0x17, 0x0f, 0x1c, 0xdc, 0xed, 0xff, 0xff, 0x04, 0x13, + 0xf5, 0xe7, 0xd2, 0x12, 0xdb, 0xe1, 0x13, 0x11, 0x23, 0x0e, 0xf9, 0x31, + 0xdc, 0xef, 0x07, 0x0a, 0x20, 0xf2, 0xf9, 0x13, 0xff, 0x1c, 0x2a, 0xdf, + 0xdb, 0xe7, 0x11, 0xf2, 0xfd, 0xfb, 0x28, 0x00, 0x15, 0x03, 0x02, 0x20, + 0x07, 0xf7, 0x19, 0x13, 0x13, 0xf6, 0x09, 0xfe, 0xfd, 0x20, 0x14, 0xf5, + 0xf5, 0xfc, 0x14, 0x0e, 0x17, 0xfe, 0x15, 0x04, 0xf9, 0xf6, 0x1d, 0xf6, + 0x1b, 0xe4, 0xee, 0xfd, 0x00, 0xe9, 0xee, 0xce, 0x0f, 0x20, 0x05, 0x02, + 0x0d, 0x06, 0x05, 0xf8, 0xef, 0xdf, 0x16, 0x17, 0xe6, 0xf1, 0x10, 0xf3, + 0x06, 0x04, 0xdb, 0xfb, 0xe7, 0xf8, 0x02, 0x11, 0xff, 0x0d, 0x0a, 0xfa, + 0x27, 0x0a, 0xfc, 0xe8, 0x11, 0x17, 0xf0, 0x0d, 0x0d, 0xee, 0xdf, 0xdd, + 0xf1, 0x15, 0xd6, 0xf7, 0x00, 0xef, 0x2e, 0xe6, 0x24, 0xfd, 0xd5, 0x04, + 0xf0, 0x08, 0x08, 0xed, 0x22, 0x07, 0xe1, 0x09, 0xd0, 0x0b, 0x18, 0xe6, + 0x3f, 0x0a, 0xe5, 0xe2, 0xf9, 0x08, 0x02, 0xd6, 0x13, 0x15, 0xbd, 0x00, + 0x0e, 0xf8, 0xe2, 0xca, 0xec, 0x0e, 0xe6, 0xef, 0x15, 0x11, 0xcb, 0xdf, + 0xf9, 0x03, 0x22, 0x10, 0xfb, 0xf9, 0xe5, 0x08, 0xe1, 0x11, 0x10, 0xfc, + 0xfa, 0x00, 0xf8, 0x30, 0xe5, 0x08, 0x14, 0xe8, 0x12, 0xe2, 0x04, 0x19, + 0x0b, 0xfa, 0x33, 0xf3, 0xec, 0xfe, 0xf8, 0x25, 0xf8, 0x21, 0x28, 0xef, + 0x00, 0xde, 0xff, 0x2b, 0x03, 0xfc, 0x10, 0x0c, 0xcf, 0xfd, 0x19, 0x0a, + 0x0c, 0xf2, 0xf7, 0x0c, 0xfd, 0x02, 0x1c, 0xdf, 0x26, 0x0d, 0xf0, 0x0b, + 0xce, 0x15, 0xfb, 0xec, 0x27, 0xf6, 0xf9, 0xe5, 0xe2, 0xfb, 0xfd, 0xd8, + 0x28, 0xec, 0xe9, 0xf2, 0xca, 0x09, 0x02, 0x06, 0x0c, 0xfa, 0x05, 0x01, + 0xd5, 0x0a, 0x02, 0xfb, 0x04, 0x17, 0xdd, 0xfe, 0xeb, 0xf1, 0x09, 0x10, + 0x12, 0xff, 0x00, 0xe0, 0x26, 0xf7, 0xed, 0xf4, 0x00, 0xf2, 0xfa, 0x07, + 0x02, 0xf5, 0x06, 0xe8, 0x03, 0xfd, 0xdc, 0xf2, 0xc2, 0xff, 0x0b, 0xd6, + 0x25, 0x04, 0xe9, 0xf0, 0xd9, 0x08, 0x09, 0xc5, 0x23, 0x12, 0xf6, 0x13, + 0x11, 0xf3, 0x18, 0xf0, 0x34, 0xfe, 0xfe, 0xed, 0xea, 0x02, 0x17, 0xdc, + 0x1b, 0x1b, 0xea, 0xfe, 0xea, 0xfe, 0xf2, 0xc4, 0xfd, 0x04, 0xe9, 0x0d, + 0x0d, 0x09, 0xca, 0xd4, 0xe1, 0x04, 0x1e, 0xff, 0x0f, 0xef, 0xd6, 0x0f, + 0xd5, 0xf8, 0x26, 0xd6, 0x33, 0xe8, 0xf5, 0x3b, 0xf1, 0xe8, 0x39, 0xe8, + 0x08, 0xe5, 0x01, 0x02, 0x04, 0xf6, 0x19, 0x0a, 0xd0, 0xeb, 0x0b, 0x15, + 0xf7, 0x0e, 0x23, 0xf6, 0xf4, 0xd8, 0xf4, 0x17, 0x23, 0x25, 0x14, 0x01, + 0xd7, 0xfd, 0xf9, 0x1f, 0x1b, 0x11, 0x0a, 0x18, 0xf5, 0xf5, 0x0f, 0xe0, + 0x2e, 0x01, 0xe5, 0xdb, 0xe2, 0xf2, 0x14, 0xfa, 0x2a, 0x00, 0xe2, 0xea, + 0xfd, 0x0e, 0xfc, 0xc1, 0x35, 0x08, 0xf6, 0xf9, 0xec, 0x00, 0x06, 0x00, + 0x0b, 0xf6, 0x01, 0xfe, 0xea, 0x0b, 0x08, 0x05, 0xe4, 0xea, 0xd7, 0xfd, + 0xee, 0xf3, 0x0c, 0x0c, 0x0d, 0x02, 0xfd, 0xee, 0x17, 0x10, 0x13, 0xfd, + 0x07, 0x03, 0xf8, 0x0c, 0xd4, 0xed, 0xfe, 0x07, 0xf4, 0xee, 0xf4, 0x03, + 0xc2, 0x18, 0x2c, 0xd1, 0x33, 0xd8, 0xdb, 0xfa, 0xed, 0x10, 0x1c, 0xe3, + 0x37, 0x0a, 0xea, 0xfe, 0xf6, 0xef, 0x20, 0xed, 0x32, 0xf7, 0xf5, 0xf3, + 0xca, 0xfd, 0x0a, 0xcf, 0x0d, 0x10, 0xde, 0x07, 0x18, 0x10, 0xf0, 0xd6, + 0x0c, 0x04, 0xeb, 0x1a, 0xf9, 0x08, 0xc4, 0xcb, 0xe4, 0x0b, 0x19, 0xfc, + 0x29, 0xf6, 0xec, 0x07, 0xf3, 0xed, 0x2b, 0xe9, 0xfa, 0x02, 0xec, 0x2b, + 0xf0, 0xf2, 0x2d, 0xe8, 0xed, 0x00, 0x12, 0x13, 0xed, 0x1a, 0x3d, 0xf0, + 0x05, 0x04, 0xfc, 0x13, 0x10, 0x01, 0x40, 0xf2, 0x06, 0x02, 0xf9, 0x22, + 0x24, 0xff, 0x18, 0x00, 0xeb, 0xe8, 0x14, 0xf9, 0x25, 0xe0, 0xff, 0x03, + 0xe5, 0xfd, 0x08, 0xea, 0x2e, 0x0b, 0x05, 0xe7, 0xde, 0xe4, 0xf5, 0xea, + 0x3a, 0xf4, 0xf4, 0xe7, 0xed, 0xec, 0xf8, 0xee, 0x30, 0x0a, 0xdb, 0x05, + 0xf7, 0x16, 0xff, 0xf7, 0xfa, 0x1f, 0xef, 0xe4, 0xce, 0xf8, 0x13, 0x04, + 0xf9, 0x01, 0xe1, 0x03, 0xf9, 0xf9, 0x08, 0x04, 0xfa, 0xe4, 0xe7, 0xf7, + 0x28, 0xfd, 0xfd, 0x00, 0xfc, 0xfb, 0xef, 0x0a, 0xec, 0x0c, 0x0a, 0xd2, + 0x05, 0xfb, 0xcd, 0xfb, 0x9d, 0xea, 0x1c, 0xe5, 0x25, 0xe8, 0xea, 0x0b, + 0xf0, 0xf3, 0x0d, 0xab, 0x49, 0x0e, 0xeb, 0x00, 0xe2, 0x03, 0x29, 0xe0, + 0x3d, 0x06, 0xf7, 0xf8, 0xcf, 0x0c, 0x1a, 0xd6, 0x1f, 0xef, 0xfd, 0xff, + 0xef, 0x0c, 0xdb, 0xe0, 0x20, 0x06, 0xdf, 0x1a, 0xe7, 0xfc, 0xb2, 0xd1, + 0xdf, 0x13, 0x07, 0x1f, 0x0c, 0xf7, 0xde, 0x0a, 0xdb, 0xdf, 0x1a, 0xf5, + 0x29, 0x0d, 0xeb, 0x2c, 0xcf, 0x0e, 0x26, 0xfe, 0xef, 0x04, 0xf5, 0x14, + 0x09, 0x13, 0x34, 0xff, 0xfe, 0x0e, 0x06, 0x0e, 0x10, 0xf9, 0x2a, 0x0b, + 0xe6, 0xfe, 0xf1, 0x1a, 0x36, 0x29, 0x29, 0x05, 0x05, 0xd8, 0x14, 0x12, + 0x26, 0x0b, 0x18, 0xff, 0xd7, 0xdf, 0x0f, 0xed, 0x31, 0xf7, 0xfc, 0xec, + 0x0b, 0xef, 0x0c, 0xd2, 0x30, 0xf9, 0x04, 0xfe, 0xef, 0xe4, 0xfb, 0xd1, + 0x32, 0xe5, 0xee, 0xf0, 0x0c, 0xe6, 0x13, 0xed, 0x1e, 0x0b, 0xe4, 0xe0, + 0xfa, 0xf4, 0x14, 0xf4, 0x18, 0xf7, 0xd9, 0xf6, 0xed, 0xea, 0xfc, 0x06, + 0xfc, 0xf5, 0xed, 0xeb, 0x05, 0x03, 0x1b, 0x0b, 0xff, 0x0b, 0xef, 0x01, + 0xf1, 0x16, 0x05, 0x00, 0xee, 0x0a, 0xdb, 0x10, 0xb4, 0x14, 0x0f, 0xe1, + 0x1c, 0xfd, 0xf0, 0xf8, 0xc3, 0x11, 0x17, 0xba, 0x47, 0x15, 0xe6, 0x01, + 0xea, 0xf1, 0x0c, 0x08, 0x4a, 0x15, 0xf0, 0xf7, 0xea, 0x00, 0xf5, 0xd4, + 0xf1, 0xff, 0xe0, 0x0c, 0xf4, 0x17, 0xd8, 0xea, 0x03, 0xff, 0xd5, 0x18, + 0xfb, 0x07, 0xc7, 0xc9, 0xdd, 0xf3, 0x15, 0x0d, 0x22, 0xea, 0xdb, 0x0a, + 0xd6, 0x09, 0x1d, 0xe5, 0x2d, 0x04, 0xfc, 0x35, 0xc6, 0x0e, 0x33, 0xf1, + 0xd7, 0xea, 0x01, 0x1b, 0x0e, 0x01, 0x2a, 0xff, 0xef, 0xf1, 0xf7, 0x0f, + 0xff, 0x00, 0x3b, 0xe8, 0x0a, 0xff, 0xf4, 0x0d, 0x1f, 0x04, 0x17, 0xf7, + 0xdf, 0xec, 0x12, 0x26, 0x36, 0x07, 0x0c, 0x06, 0xe7, 0xd6, 0x13, 0xe3, + 0x30, 0x09, 0x00, 0xf5, 0xe0, 0xf3, 0x11, 0xe2, 0x38, 0x0d, 0xf6, 0x05, + 0xec, 0x05, 0x00, 0xe5, 0x24, 0xef, 0xfe, 0xf8, 0x00, 0xd8, 0x18, 0xf1, + 0x26, 0x0b, 0xf2, 0xfc, 0xe0, 0xe4, 0x06, 0x0b, 0x1a, 0x05, 0xc6, 0xf6, + 0xe8, 0xde, 0xfe, 0x0c, 0x03, 0x09, 0xfe, 0xe2, 0x18, 0x1b, 0xfb, 0xf7, + 0x06, 0xf1, 0xfe, 0xf6, 0xef, 0x1b, 0x07, 0x0d, 0x01, 0x0a, 0xed, 0xf0, + 0xad, 0x1a, 0x17, 0xd6, 0x37, 0xfd, 0xd8, 0xec, 0xca, 0xf1, 0x15, 0xc4, + 0x33, 0xf1, 0xed, 0xf0, 0xe9, 0x15, 0x0d, 0xf2, 0x36, 0xde, 0xfd, 0x0e, + 0xfb, 0x10, 0x0f, 0xf6, 0xf9, 0x0c, 0xea, 0xf0, 0xe5, 0x0b, 0xee, 0xc1, + 0x10, 0xf4, 0xe8, 0x1f, 0xee, 0x00, 0xd0, 0xe4, 0xe7, 0x13, 0x07, 0x27, + 0x12, 0xea, 0xea, 0x0f, 0xea, 0xf4, 0x14, 0xee, 0xfe, 0x09, 0xfb, 0x31, + 0xdb, 0x1b, 0x1c, 0xe7, 0xef, 0xf5, 0xf7, 0x1a, 0x06, 0x01, 0x2c, 0xed, + 0xfb, 0x04, 0xfa, 0x07, 0x19, 0xec, 0x2b, 0x0d, 0xfc, 0xd8, 0xfc, 0x0f, + 0x1f, 0xfc, 0x2d, 0xf3, 0xc9, 0xda, 0x0a, 0xfe, 0x29, 0x00, 0xfa, 0x09, + 0xe8, 0xf6, 0x21, 0xf3, 0x4a, 0x1a, 0xf8, 0x00, 0xe7, 0xf0, 0x21, 0x01, + 0x22, 0xf3, 0x00, 0xe9, 0x06, 0xe3, 0x15, 0xd7, 0x3d, 0x0c, 0x07, 0xf1, + 0xf3, 0xec, 0x17, 0xdf, 0x29, 0x1b, 0xfd, 0xfe, 0xeb, 0xed, 0x17, 0xf6, + 0x23, 0x0a, 0xea, 0xee, 0xf9, 0xf3, 0x0f, 0x0c, 0xf8, 0xf5, 0xed, 0xe8, + 0x1c, 0x14, 0x07, 0x17, 0x0b, 0x0d, 0xed, 0xf7, 0xed, 0x10, 0x07, 0xd5, + 0xf2, 0x09, 0xd6, 0xf7, 0xb5, 0xf6, 0x19, 0xc9, 0x25, 0x15, 0xe8, 0xf5, + 0xc4, 0xf9, 0x2a, 0xb0, 0x39, 0x0e, 0x02, 0x11, 0xf0, 0xf7, 0x1d, 0xeb, + 0x39, 0x10, 0x02, 0x15, 0xe0, 0x08, 0x01, 0xee, 0x1c, 0x1e, 0x08, 0x04, + 0xf2, 0x02, 0xe8, 0xda, 0xfa, 0xfb, 0xe0, 0xfe, 0x05, 0x02, 0xd3, 0xca, + 0xf4, 0xec, 0x10, 0x16, 0x05, 0x0d, 0xd7, 0x09, 0xdc, 0xf6, 0x1e, 0xf8, + 0x10, 0xed, 0xf7, 0x27, 0xf5, 0x08, 0x28, 0xee, 0xec, 0xe0, 0xf8, 0x17, + 0xfb, 0x23, 0x2e, 0xf1, 0xfa, 0xf5, 0xfc, 0x1a, 0x10, 0xf7, 0x32, 0xfb, + 0xfb, 0xe8, 0xf1, 0x03, 0x24, 0xeb, 0x25, 0xf9, 0xca, 0xf1, 0xfe, 0x01, + 0x2e, 0x07, 0x18, 0x03, 0xe5, 0xea, 0x10, 0xfa, 0x3b, 0x07, 0x0f, 0x11, + 0x04, 0xf7, 0x1d, 0xf1, 0x24, 0xd9, 0x08, 0xef, 0x02, 0xdd, 0x07, 0xc8, + 0x2c, 0x0d, 0x06, 0xec, 0x17, 0xda, 0x21, 0xdf, 0x34, 0xd9, 0xfb, 0xf2, + 0xf4, 0xec, 0x0e, 0x0a, 0x0f, 0x0f, 0xdb, 0xf0, 0xfb, 0xe6, 0x0f, 0x00, + 0x04, 0xf9, 0x01, 0x05, 0x05, 0xfe, 0x08, 0xf3, 0x0e, 0xf2, 0xfb, 0x01, + 0xfd, 0x18, 0x1d, 0xf6, 0xee, 0x06, 0xcf, 0xfc, 0xae, 0x27, 0x21, 0xd2, + 0x33, 0x03, 0xe0, 0xe0, 0xc9, 0xfb, 0x3a, 0xbd, 0x4d, 0x04, 0xe8, 0xf5, + 0xe6, 0xeb, 0x19, 0xf2, 0x4b, 0x1d, 0xfc, 0xf7, 0xd9, 0xff, 0xfe, 0xea, + 0x0f, 0x04, 0x0e, 0x00, 0xed, 0x19, 0xe9, 0xe9, 0xff, 0x11, 0xef, 0x14, + 0x01, 0x17, 0xbc, 0xb5, 0xef, 0x0c, 0x22, 0x27, 0x0f, 0x01, 0xd4, 0x03, + 0xce, 0x01, 0x25, 0xff, 0xf9, 0xf0, 0x0a, 0x1c, 0xe5, 0x0f, 0x1c, 0xee, + 0xf4, 0xf1, 0xf4, 0x0c, 0x00, 0x08, 0x1c, 0xf4, 0xd5, 0xf1, 0xfc, 0x1f, + 0x11, 0x00, 0x18, 0x03, 0xf7, 0xe4, 0xff, 0x07, 0x09, 0x1a, 0x18, 0xff, + 0xea, 0xec, 0xfd, 0x13, 0x2b, 0xf8, 0x0c, 0xfa, 0xdf, 0xf6, 0x11, 0xda, + 0x2a, 0xdc, 0xfc, 0xff, 0xff, 0xec, 0x12, 0xe1, 0x37, 0xfd, 0xeb, 0xfe, + 0xea, 0xd1, 0x12, 0xfa, 0x28, 0x1a, 0x0d, 0xf0, 0xf7, 0xe0, 0x0c, 0xeb, + 0x35, 0x14, 0xeb, 0x00, 0xeb, 0xe7, 0x1b, 0xfc, 0x09, 0x00, 0xf2, 0x04, + 0xf9, 0xe5, 0x1a, 0x0e, 0x08, 0x12, 0xf8, 0xfe, 0x09, 0x0f, 0x0d, 0xea, + 0x03, 0xe1, 0xfe, 0xf2, 0xec, 0x0d, 0x02, 0xdb, 0x04, 0x1d, 0xd4, 0x01, + 0xca, 0x13, 0x29, 0xca, 0x28, 0x04, 0xe2, 0xf1, 0xdb, 0x0b, 0x2c, 0xcd, + 0x44, 0x00, 0xe7, 0xf4, 0xd0, 0x12, 0x15, 0xff, 0x42, 0x11, 0x05, 0xfd, + 0xd9, 0x11, 0x1c, 0xf4, 0x15, 0xec, 0xf2, 0x24, 0xd6, 0x1d, 0xec, 0xda, + 0xf5, 0xec, 0xe5, 0x22, 0xf2, 0x0b, 0xbd, 0xd0, 0xeb, 0x05, 0x07, 0x1b, + 0x01, 0xed, 0xf5, 0x02, 0xcf, 0x08, 0x15, 0xfd, 0x1c, 0xe5, 0x04, 0x19, + 0xc7, 0x25, 0x22, 0xf3, 0xde, 0xfb, 0xfb, 0x20, 0xf6, 0xeb, 0x25, 0xfe, + 0xf5, 0x08, 0xf5, 0x17, 0x0e, 0x04, 0x1c, 0xf9, 0xee, 0xec, 0xe1, 0x06, + 0x12, 0xff, 0x2a, 0x13, 0xed, 0xfe, 0x05, 0x18, 0x25, 0x20, 0x09, 0x13, + 0xea, 0xd7, 0x05, 0x06, 0x33, 0x25, 0xff, 0x0a, 0xf0, 0xea, 0x17, 0xe1, + 0x30, 0xfa, 0x0d, 0x0a, 0x04, 0x00, 0x0e, 0xe9, 0x16, 0x20, 0x0d, 0x02, + 0xe8, 0xed, 0x07, 0xe8, 0x3c, 0xf1, 0xd9, 0xfa, 0xe1, 0xed, 0x18, 0xfc, + 0xf0, 0x09, 0xe3, 0x05, 0xfe, 0xd1, 0x0b, 0x0e, 0xf5, 0x25, 0xfd, 0xfb, + 0x30, 0x1e, 0x08, 0xfc, 0x0c, 0x21, 0xea, 0xfc, 0xe5, 0x1e, 0x16, 0xf5, + 0xf4, 0xfc, 0xf0, 0xea, 0xc4, 0x21, 0x27, 0xe9, 0x2b, 0xdb, 0xdb, 0xec, + 0xe5, 0xfe, 0x37, 0xe2, 0x46, 0x25, 0xfa, 0xec, 0xe4, 0xf3, 0x19, 0xf2, + 0x4c, 0x06, 0x00, 0xfb, 0xeb, 0x10, 0x10, 0xf7, 0x2a, 0xf8, 0xe9, 0x18, + 0xee, 0x21, 0xe8, 0xd5, 0xf4, 0x0a, 0xed, 0x24, 0xfe, 0xf9, 0xb2, 0xbc, + 0xf3, 0x1d, 0x00, 0x2f, 0x07, 0x08, 0xe1, 0xf1, 0xed, 0x27, 0x27, 0xfe, + 0x22, 0xfd, 0x02, 0x20, 0xd8, 0x05, 0x25, 0xec, 0xf1, 0xff, 0x0a, 0x0f, + 0xe6, 0xfe, 0x46, 0xfd, 0xe1, 0xca, 0xf7, 0x22, 0x03, 0x08, 0x21, 0xf5, + 0x0f, 0xf7, 0xfb, 0x0c, 0xfb, 0x14, 0x2d, 0x03, 0xe5, 0xe4, 0x09, 0x0b, + 0x1a, 0xe6, 0x01, 0x28, 0xe9, 0xd6, 0x0b, 0xf7, 0x2c, 0xfb, 0x11, 0xee, + 0x0b, 0xed, 0x17, 0xf0, 0x3c, 0xf5, 0x08, 0xfa, 0xf8, 0xcd, 0x17, 0xfa, + 0x39, 0xea, 0x11, 0xf5, 0xed, 0xee, 0x0a, 0xec, 0x41, 0xd6, 0xe7, 0xf9, + 0xfa, 0xc8, 0x15, 0xf7, 0x08, 0x0e, 0xe3, 0x08, 0xe8, 0xec, 0xfd, 0xfe, + 0xf1, 0x00, 0xe9, 0xf4, 0x09, 0x26, 0x02, 0x16, 0xf0, 0x01, 0xef, 0x01, + 0xff, 0x03, 0x22, 0xdb, 0xfc, 0xf5, 0xde, 0xe5, 0xc4, 0x01, 0x28, 0xd4, + 0x38, 0x08, 0xd0, 0xec, 0xd5, 0x04, 0x2f, 0xce, 0x4e, 0xeb, 0xf9, 0xe7, + 0xdf, 0xf0, 0x1b, 0xf5, 0x42, 0xf1, 0xf6, 0x09, 0xd5, 0x0a, 0x0d, 0x08, + 0x04, 0x05, 0xe2, 0x0e, 0xd7, 0x19, 0xdb, 0xda, 0xe1, 0x25, 0xde, 0x15, + 0x0e, 0x14, 0xbd, 0xb0, 0xe3, 0xe5, 0x24, 0x1e, 0xf8, 0x0d, 0xd8, 0xf7, + 0xf2, 0xff, 0x18, 0xf5, 0x07, 0xf0, 0x02, 0x25, 0xd5, 0x1e, 0x2e, 0xdf, + 0xe7, 0x05, 0xef, 0x11, 0xe8, 0xe7, 0x47, 0xf4, 0xe1, 0xde, 0x09, 0x36, + 0x1a, 0x11, 0x11, 0xf5, 0x12, 0xe5, 0xe7, 0x18, 0x01, 0x17, 0x2a, 0x03, + 0x05, 0xea, 0x09, 0x0b, 0x12, 0x04, 0x17, 0xf0, 0xee, 0xd7, 0x11, 0xed, + 0x3c, 0x17, 0x16, 0xff, 0x02, 0xdc, 0x21, 0xf3, 0x2e, 0xe5, 0x13, 0xef, + 0xec, 0xe2, 0x10, 0xd0, 0x2e, 0xee, 0xff, 0x01, 0xe0, 0xe5, 0x0b, 0xda, + 0x1f, 0xf8, 0xf6, 0xfb, 0x07, 0xdb, 0x05, 0xf6, 0x0c, 0xf3, 0xf0, 0x10, + 0xf9, 0xf5, 0xf2, 0x0d, 0x10, 0xf7, 0xf6, 0xff, 0x2b, 0x0d, 0x06, 0x1e, + 0xf3, 0x0c, 0xe9, 0x01, 0xf2, 0x23, 0xfe, 0xe9, 0xdd, 0x12, 0xdd, 0xf7, + 0xbb, 0x22, 0x1b, 0xd4, 0x38, 0x29, 0xd4, 0xcf, 0xf5, 0xf9, 0x27, 0xdd, + 0x47, 0x00, 0xf2, 0xe5, 0x09, 0xfc, 0x0e, 0xf9, 0x34, 0x0a, 0x02, 0xfd, + 0xec, 0x25, 0x1d, 0x03, 0x15, 0x09, 0xf1, 0x1b, 0xd0, 0x17, 0xda, 0xda, + 0xe7, 0x07, 0xe3, 0x15, 0xf1, 0x02, 0xb9, 0xce, 0xe6, 0x0c, 0x10, 0x31, + 0xfe, 0xf7, 0xd9, 0xfa, 0xed, 0xed, 0x33, 0xf4, 0x19, 0xe7, 0xfe, 0x3f, + 0xe5, 0x06, 0x2e, 0xe6, 0xf2, 0xdc, 0xf5, 0x18, 0xe6, 0x01, 0x2f, 0xee, + 0xe7, 0xe4, 0xfe, 0x2c, 0x03, 0xf7, 0x20, 0x05, 0x07, 0xe2, 0x06, 0x1e, + 0x05, 0xed, 0x2f, 0x03, 0xea, 0xf8, 0x0e, 0x0c, 0x1f, 0xff, 0x20, 0xf4, + 0xe8, 0xe1, 0x1c, 0xec, 0x22, 0x1e, 0x05, 0xfd, 0xf5, 0xca, 0x30, 0xe9, + 0x30, 0xe4, 0x14, 0xff, 0xf2, 0xdc, 0x17, 0xf8, 0x26, 0xe1, 0x0b, 0x01, + 0x11, 0xc2, 0x02, 0xf1, 0x36, 0x10, 0x02, 0x05, 0xed, 0xf1, 0x15, 0xfa, + 0x17, 0xf8, 0xf7, 0xf1, 0xe8, 0xd3, 0xfd, 0x08, 0xfb, 0x27, 0xf5, 0xf5, + 0x13, 0x06, 0x0b, 0xf0, 0x01, 0xf9, 0xd7, 0x0e, 0xec, 0x12, 0xfe, 0xfd, + 0xee, 0x25, 0xd8, 0xf1, 0xb2, 0x09, 0x1c, 0xbf, 0x34, 0xea, 0xc8, 0xea, + 0xdb, 0x0e, 0x24, 0xde, 0x47, 0xfe, 0xdc, 0xe0, 0xf3, 0x06, 0x20, 0xfe, + 0x2b, 0xf6, 0x18, 0x14, 0xcd, 0x19, 0x16, 0xfe, 0x1a, 0x15, 0xf8, 0x11, + 0xf4, 0x22, 0xd7, 0xcc, 0xdd, 0x15, 0xdc, 0x14, 0xf9, 0x02, 0xbb, 0xca, + 0xe3, 0xf3, 0x0d, 0x1e, 0x2a, 0x0c, 0xe4, 0x05, 0xe0, 0x18, 0x2a, 0x07, + 0x20, 0xed, 0xf6, 0x17, 0xcf, 0xf4, 0x2a, 0xd6, 0xfb, 0xce, 0x03, 0x37, + 0xe2, 0xfd, 0x1d, 0xfb, 0xe5, 0xe0, 0x05, 0x29, 0xef, 0x16, 0x23, 0xf7, + 0x01, 0xf4, 0x0c, 0x14, 0xff, 0xee, 0x31, 0xf9, 0x12, 0xf9, 0x14, 0xf6, + 0x0c, 0xf6, 0x0b, 0x0f, 0xd8, 0xdc, 0xfe, 0x0f, 0x37, 0xfa, 0x01, 0x09, + 0x04, 0xd1, 0x0b, 0x0c, 0x29, 0xf3, 0x0a, 0xf9, 0xed, 0xc2, 0x18, 0xf4, + 0x25, 0x18, 0x0f, 0x08, 0xf7, 0xed, 0x1f, 0xf7, 0x4f, 0x0e, 0xf0, 0xe4, + 0x00, 0xeb, 0xfa, 0x1a, 0x0c, 0x03, 0xe9, 0xfc, 0xf0, 0xcc, 0x06, 0x05, + 0xf2, 0x12, 0x04, 0xe2, 0x16, 0x0a, 0x0a, 0xf3, 0x0b, 0xf3, 0xdc, 0xfd, + 0x10, 0xfc, 0x0e, 0xe2, 0xe0, 0xfe, 0xf0, 0xff, 0xb1, 0x06, 0x1b, 0xe4, + 0x30, 0x13, 0xc6, 0xc3, 0xfa, 0x0c, 0x1e, 0xd9, 0x57, 0x11, 0xe1, 0xd6, + 0xfa, 0xee, 0x1d, 0xf7, 0x37, 0xea, 0xf0, 0x05, 0xef, 0x24, 0x1e, 0xf1, + 0x10, 0xe8, 0xeb, 0x19, 0xd1, 0x18, 0xf5, 0xc8, 0xf8, 0xec, 0xf5, 0x1f, + 0xf2, 0xff, 0xb3, 0xd2, 0xe6, 0x0e, 0x06, 0x2e, 0x07, 0x17, 0xe0, 0xf5, + 0x02, 0xf9, 0x20, 0x07, 0x16, 0x08, 0xe8, 0x1d, 0xd3, 0x08, 0x34, 0xda, + 0xf2, 0xce, 0xfb, 0x1f, 0xe1, 0x00, 0x2d, 0xdb, 0xdf, 0xcc, 0x05, 0xfb, + 0xf7, 0x00, 0x33, 0xf9, 0x0b, 0x01, 0x13, 0x28, 0xf8, 0x07, 0x24, 0xf8, + 0x0f, 0x03, 0x0d, 0xe9, 0x06, 0xfe, 0x18, 0xf9, 0xed, 0xf5, 0x0c, 0xe0, + 0x2c, 0x0e, 0xf9, 0x06, 0xfb, 0xce, 0x27, 0xe8, 0x29, 0x19, 0xf9, 0x01, + 0x0e, 0xc8, 0x25, 0xed, 0x30, 0xeb, 0x01, 0xfe, 0x10, 0xdc, 0x1e, 0x00, + 0x1e, 0x10, 0xf9, 0x00, 0xfc, 0xc8, 0x0e, 0x04, 0x13, 0x04, 0xf0, 0x02, + 0xfe, 0xd8, 0x0f, 0x1b, 0xf7, 0xe1, 0xf8, 0xde, 0x12, 0xe2, 0xef, 0x0a, + 0x02, 0xe0, 0xdd, 0xf1, 0x0e, 0x2a, 0x25, 0x15, 0xeb, 0x02, 0xf4, 0xf0, + 0xbf, 0xfc, 0x27, 0xdc, 0x42, 0x0f, 0xe9, 0xbf, 0xe8, 0x20, 0x33, 0xc9, + 0x3f, 0x10, 0xec, 0xf3, 0x03, 0x02, 0x2c, 0x04, 0x38, 0x06, 0x0a, 0xf9, + 0xe5, 0x1c, 0x3f, 0x0f, 0x0c, 0x25, 0xe2, 0x06, 0xe6, 0x03, 0xf4, 0xd7, + 0xfe, 0xf6, 0xe7, 0x2f, 0xfa, 0x03, 0xb6, 0xcb, 0xf1, 0x11, 0x0a, 0x2c, + 0xfc, 0x1e, 0xe0, 0xff, 0xc2, 0xdd, 0x1d, 0xf3, 0x10, 0xfa, 0x07, 0x1e, + 0xf6, 0x20, 0x07, 0xe6, 0xf1, 0x0a, 0xe8, 0x27, 0xf1, 0xf5, 0x24, 0xed, + 0xfd, 0xee, 0x13, 0x15, 0xe9, 0xe2, 0x22, 0xe5, 0xf9, 0xdd, 0x1d, 0x32, + 0x04, 0xfa, 0x25, 0x00, 0xee, 0xfd, 0x0b, 0x0e, 0x23, 0xfa, 0x0f, 0x01, + 0xf8, 0xf0, 0x15, 0xe4, 0x21, 0xf7, 0x10, 0xf9, 0xe7, 0xc3, 0x19, 0xe1, + 0x34, 0xff, 0xed, 0xf4, 0xef, 0xd7, 0x21, 0x01, 0x31, 0xee, 0xf7, 0xf2, + 0xf3, 0xe5, 0x0a, 0xee, 0x2e, 0x1e, 0xf2, 0x0c, 0x07, 0xc2, 0x08, 0x0a, + 0x14, 0x14, 0x00, 0xfc, 0xf9, 0xd6, 0xfb, 0xf8, 0xe5, 0xf1, 0xfa, 0xe0, + 0x15, 0x21, 0xef, 0x06, 0xf9, 0x00, 0xf5, 0xf4, 0x0b, 0x0b, 0x18, 0x02, + 0xf5, 0x04, 0xdb, 0xfd, 0xcc, 0x32, 0x1d, 0xc9, 0x3b, 0x12, 0xd9, 0xaf, + 0xcf, 0x0f, 0x26, 0xde, 0x35, 0xe4, 0xdb, 0xd3, 0x22, 0x11, 0x2e, 0xfb, + 0x36, 0xfa, 0xfd, 0x02, 0xeb, 0x0f, 0x37, 0x0b, 0x14, 0x1d, 0xdd, 0x18, + 0xe0, 0x10, 0xe0, 0xdf, 0x14, 0xf9, 0xf0, 0x19, 0xf7, 0xfb, 0xc4, 0xe5, + 0xe7, 0x11, 0x01, 0x31, 0x1a, 0xf7, 0xd8, 0xf1, 0xe9, 0xf3, 0x21, 0xf9, + 0xfe, 0xe4, 0xe9, 0x02, 0xd0, 0x06, 0x14, 0xd7, 0xfc, 0xec, 0x06, 0x10, + 0xfc, 0xf0, 0x1c, 0xe7, 0xec, 0xe3, 0x03, 0x21, 0xe4, 0x04, 0x12, 0xf0, + 0xf3, 0xed, 0x16, 0x36, 0x02, 0xfd, 0x13, 0x11, 0xdf, 0xeb, 0x19, 0x07, + 0x10, 0x0c, 0xf9, 0x08, 0xf8, 0xf4, 0x1d, 0xfd, 0x1d, 0x16, 0xf4, 0x0a, + 0x08, 0xec, 0x0c, 0x09, 0x3d, 0xe0, 0x0b, 0xee, 0x10, 0xd1, 0x1e, 0x15, + 0x43, 0xeb, 0xfa, 0xf3, 0x05, 0xc7, 0xf2, 0xd9, 0x25, 0x20, 0xee, 0xe9, + 0xfd, 0xce, 0x16, 0x0c, 0x27, 0x06, 0x0a, 0x06, 0xf9, 0xd6, 0x0b, 0x05, + 0xe8, 0x02, 0xe8, 0xd2, 0x10, 0x01, 0xf2, 0x15, 0x09, 0x04, 0xd3, 0xe2, + 0xfe, 0xf0, 0x32, 0x1b, 0xd9, 0xf5, 0xea, 0xcc, 0xcb, 0x10, 0x1c, 0xf1, + 0x3b, 0x02, 0xd4, 0xbf, 0xca, 0xfe, 0x12, 0xdb, 0x3b, 0xf8, 0xd5, 0xe7, + 0x13, 0x10, 0x1a, 0xf4, 0x38, 0x09, 0x08, 0xee, 0xf4, 0xf4, 0x3c, 0xf7, + 0x15, 0x04, 0xe4, 0xfa, 0xf4, 0x04, 0xee, 0xf4, 0x07, 0xf8, 0xe9, 0x3b, + 0xe2, 0x1f, 0xd5, 0xed, 0xe6, 0xfd, 0x18, 0x49, 0x21, 0x06, 0xd8, 0xde, + 0xfa, 0xf0, 0x1b, 0xfe, 0xde, 0x08, 0xf7, 0x14, 0xc7, 0x0f, 0x1d, 0xcf, + 0x00, 0xea, 0xff, 0x1b, 0xd5, 0x08, 0x0d, 0xd9, 0xf1, 0xf4, 0x16, 0x23, + 0xd8, 0x0c, 0x29, 0xdc, 0xf1, 0xf2, 0x21, 0x49, 0xfc, 0xe2, 0x08, 0x01, + 0xf0, 0xf8, 0x17, 0xf9, 0x0f, 0xf5, 0xfa, 0x1a, 0xef, 0xec, 0x09, 0xeb, + 0x1a, 0x0c, 0x17, 0x09, 0x11, 0xe9, 0x1a, 0xf7, 0x29, 0xf9, 0xfd, 0x07, + 0x01, 0xdd, 0x0a, 0xec, 0x22, 0x15, 0x03, 0xfd, 0xe2, 0xd2, 0x15, 0xec, + 0x4d, 0xd7, 0xfc, 0xf6, 0x0b, 0xcc, 0x0e, 0x04, 0x03, 0xf7, 0xfb, 0xfb, + 0x0d, 0xeb, 0x19, 0x07, 0xf4, 0xf4, 0xe5, 0xde, 0x22, 0x07, 0xea, 0xf7, + 0xeb, 0x23, 0xc8, 0xee, 0x03, 0x04, 0x0f, 0x19, 0xc3, 0xf8, 0x06, 0xd0, + 0xf7, 0xfe, 0x0e, 0xe7, 0x0a, 0x02, 0xb0, 0xb8, 0x00, 0xfb, 0x18, 0x0f, + 0x22, 0xf7, 0xe9, 0xdc, 0x09, 0x15, 0x23, 0x0d, 0x22, 0x13, 0xe2, 0xed, + 0xeb, 0x18, 0x20, 0x0b, 0x12, 0xfc, 0x02, 0xf1, 0xdb, 0x0e, 0xe1, 0x04, + 0xdb, 0x0f, 0xf3, 0x1a, 0x06, 0xef, 0xdb, 0xdc, 0xdd, 0xfb, 0x00, 0x2a, + 0x20, 0xfd, 0xc1, 0xe3, 0xef, 0x01, 0x14, 0xf2, 0x14, 0x00, 0x0f, 0x28, + 0xd9, 0xff, 0xf4, 0xdc, 0x09, 0xfa, 0x1c, 0x08, 0xd1, 0x03, 0x0a, 0xf4, + 0xe4, 0xdb, 0x20, 0x30, 0xea, 0x06, 0x11, 0xe2, 0x26, 0xf7, 0x16, 0x22, + 0xf9, 0x07, 0x02, 0xf5, 0xf6, 0xfb, 0x1d, 0x0c, 0x16, 0x0a, 0x07, 0xf9, + 0x11, 0xde, 0x20, 0x08, 0x19, 0x04, 0x0a, 0x0b, 0x0c, 0xf7, 0xf4, 0xfc, + 0x41, 0xf1, 0xf8, 0x16, 0x09, 0xdc, 0x0e, 0x1a, 0x2b, 0x1f, 0xe7, 0xfe, + 0x01, 0xe0, 0xfd, 0xe2, 0x34, 0xec, 0xf3, 0xf5, 0x03, 0xec, 0x0b, 0xfb, + 0x04, 0xf6, 0xdd, 0xfd, 0x06, 0x14, 0x0d, 0xfa, 0xfc, 0xf1, 0x0a, 0xca, + 0x01, 0xec, 0x0e, 0x0e, 0xec, 0xd7, 0xee, 0xd4, 0xf2, 0xfe, 0x16, 0xfa, + 0xbd, 0x0d, 0xef, 0xcb, 0xc4, 0xee, 0xed, 0x13, 0x10, 0x19, 0xf8, 0xb1, + 0xf1, 0xe3, 0x00, 0xf3, 0x0c, 0xf6, 0xde, 0xc6, 0x15, 0x27, 0x14, 0x29, + 0x15, 0xf6, 0xf4, 0xf5, 0xe7, 0x00, 0x0b, 0x2f, 0x0c, 0xef, 0x03, 0x0f, + 0xfd, 0x08, 0xf3, 0xf9, 0xf9, 0x05, 0x0d, 0x34, 0x15, 0x1b, 0xc8, 0xd1, + 0xf2, 0x1b, 0x0a, 0x22, 0x12, 0x11, 0xe9, 0xf4, 0xe1, 0x2a, 0x20, 0x03, + 0xf2, 0xf8, 0x14, 0x0b, 0xd0, 0xf4, 0x0e, 0xbf, 0xc6, 0xd8, 0x04, 0x05, + 0xf8, 0xf4, 0x04, 0xc9, 0xea, 0xfd, 0xf7, 0xfa, 0xe3, 0x1b, 0x11, 0xde, + 0x0c, 0x11, 0x25, 0x29, 0xe5, 0x02, 0xef, 0xef, 0x02, 0xfa, 0x1a, 0x21, + 0x19, 0x09, 0x08, 0x05, 0x04, 0xe5, 0xfa, 0xed, 0x2d, 0x26, 0xfa, 0x17, + 0xf6, 0xe8, 0x12, 0x12, 0x31, 0xfc, 0x0d, 0x00, 0xf7, 0xeb, 0x19, 0xf1, + 0x2a, 0x06, 0x14, 0xec, 0x08, 0xd3, 0x21, 0x07, 0x32, 0xe3, 0x02, 0x0b, + 0xfb, 0xd8, 0x27, 0x07, 0x05, 0xe6, 0xf5, 0xf5, 0x0a, 0xf7, 0x2c, 0x2a, + 0xd8, 0x1b, 0xda, 0xf7, 0xea, 0xf6, 0xf9, 0x0e, 0xf8, 0x0c, 0x05, 0xc7, + 0xd6, 0x06, 0x12, 0xe3, 0xe1, 0xe1, 0xd8, 0xdb, 0xc6, 0xf8, 0xe6, 0xfa, + 0x0c, 0x07, 0xf8, 0xe7, 0xe1, 0x0f, 0x00, 0xf3, 0x03, 0xf0, 0xde, 0xcc, + 0xf5, 0xfc, 0xef, 0x1e, 0x16, 0x13, 0xfb, 0xf4, 0x03, 0xe9, 0xfc, 0xfa, + 0x15, 0xe8, 0x15, 0x09, 0xf1, 0x0d, 0xdb, 0x0a, 0xe8, 0x09, 0xf5, 0x1a, + 0x04, 0xf8, 0xd8, 0xd4, 0x04, 0xee, 0x25, 0x29, 0x09, 0xfe, 0xf3, 0xf5, + 0xd4, 0x0a, 0x15, 0x19, 0xf5, 0x12, 0xfe, 0x04, 0xe7, 0x01, 0xeb, 0xde, + 0xbe, 0xfe, 0x09, 0x12, 0xdf, 0x13, 0xe0, 0xef, 0xc7, 0xff, 0x03, 0x08, + 0xfe, 0xf2, 0x19, 0xe0, 0xe4, 0x0c, 0x22, 0x1e, 0x05, 0xf7, 0x16, 0xf2, + 0xf9, 0x06, 0x17, 0xf6, 0x0c, 0x1e, 0x23, 0x08, 0xfe, 0xdc, 0xfd, 0x17, + 0x11, 0xdf, 0xf5, 0x0f, 0x01, 0x03, 0x08, 0xee, 0x1b, 0x02, 0x0b, 0x1b, + 0x0c, 0x16, 0x1a, 0x00, 0x0f, 0x26, 0x14, 0xf8, 0xf4, 0xf3, 0x19, 0x16, + 0x22, 0x0a, 0xd0, 0xf9, 0xf1, 0x05, 0x2b, 0x1e, 0x1e, 0xef, 0xf5, 0x06, + 0x05, 0xe7, 0x3f, 0x2a, 0x06, 0xf0, 0x15, 0x14, 0x13, 0x20, 0x1b, 0xde, + 0x10, 0x05, 0x33, 0xf8, 0x08, 0x04, 0x17, 0x0d, 0x0f, 0xf6, 0x01, 0xed, + 0x28, 0x25, 0x1c, 0x13, 0xfb, 0xea, 0xfb, 0xf3, 0x1c, 0xf9, 0x1f, 0xf0, + 0xfb, 0x17, 0xf8, 0xff, 0x10, 0xf7, 0x0b, 0x24, 0x04, 0x00, 0x0d, 0x0c, + 0xf7, 0x0a, 0x16, 0x13, 0xf8, 0x05, 0x0a, 0xf1, 0xf5, 0xee, 0xf8, 0x14, + 0x0e, 0xed, 0xfe, 0x1b, 0xfe, 0x17, 0x13, 0x10, 0x12, 0x21, 0x1c, 0xfa, + 0xe5, 0x0b, 0x08, 0x0c, 0x10, 0x1b, 0x03, 0xef, 0x0d, 0x05, 0x0a, 0xf0, + 0x04, 0x11, 0x15, 0x00, 0xfd, 0xef, 0x02, 0x18, 0xf4, 0x09, 0xfa, 0xf6, + 0x02, 0xf7, 0xfd, 0x13, 0xef, 0x13, 0xf7, 0xf9, 0x17, 0x0f, 0xfa, 0xf8, + 0x15, 0xff, 0x04, 0xef, 0xf0, 0x15, 0xfa, 0xfe, 0xf0, 0xf4, 0xed, 0x06, + 0x1c, 0x02, 0xfb, 0xf7, 0x05, 0xfb, 0x0c, 0xef, 0xf4, 0xf0, 0xf6, 0xec, + 0x17, 0xf3, 0xf5, 0xef, 0x02, 0xfd, 0xe5, 0x21, 0x0c, 0xf1, 0x1e, 0x08, + 0xf1, 0x0b, 0xf7, 0x09, 0x1d, 0xf2, 0xf9, 0xf2, 0xfb, 0x0e, 0xed, 0xf8, + 0xfa, 0xdd, 0xf0, 0xfd, 0xdb, 0x1a, 0xf4, 0xef, 0x0c, 0x06, 0x0f, 0xdf, + 0xe2, 0x06, 0x06, 0xee, 0xfa, 0x0d, 0x17, 0xfc, 0xf9, 0x15, 0x1a, 0xe4, + 0xfb, 0x0c, 0x1a, 0xfc, 0x1b, 0x04, 0x07, 0x20, 0xff, 0x09, 0x0f, 0xf2, + 0x26, 0x19, 0x1f, 0x0d, 0x02, 0x16, 0x03, 0x03, 0xfd, 0x05, 0x01, 0x1b, + 0x0a, 0x11, 0xfa, 0x21, 0x13, 0xfb, 0x0c, 0x05, 0xf3, 0xdd, 0xe4, 0xdc, + 0x22, 0x1b, 0x15, 0x14, 0x0e, 0xe8, 0x00, 0xf7, 0xf8, 0xf4, 0x0b, 0x0b, + 0xfd, 0x21, 0xe3, 0x0f, 0xe1, 0x22, 0x01, 0x21, 0x0b, 0x1f, 0x09, 0x10, + 0xe2, 0x18, 0x11, 0x0e, 0xed, 0x01, 0x14, 0x12, 0xfd, 0x11, 0xf6, 0xe9, + 0x20, 0xe1, 0xf5, 0x1b, 0x27, 0x22, 0xfa, 0xf7, 0xfe, 0x13, 0xf6, 0xdc, + 0x06, 0x0d, 0xf4, 0x05, 0x20, 0x0d, 0x0b, 0xe4, 0x15, 0x28, 0x0c, 0x00, + 0xf5, 0x07, 0x0c, 0x0a, 0x06, 0x0e, 0xf3, 0xfb, 0xfe, 0x04, 0x08, 0xf4, + 0xef, 0x03, 0xe4, 0xeb, 0x06, 0xee, 0xed, 0xdb, 0xeb, 0x1d, 0xf4, 0xfa, + 0x0c, 0xfc, 0xfe, 0x11, 0xf7, 0xf8, 0xf5, 0xef, 0xe7, 0xfc, 0x1b, 0xdc, + 0x17, 0xfd, 0xfe, 0x00, 0xea, 0xf4, 0xf1, 0xf7, 0x0f, 0x21, 0x04, 0xfd, + 0x0d, 0x0c, 0x0a, 0x14, 0xfd, 0x19, 0x09, 0x01, 0xfd, 0xe2, 0x0c, 0x0c, + 0xe0, 0x25, 0xfb, 0xff, 0x0d, 0x18, 0xf6, 0x0b, 0x19, 0x12, 0x10, 0x09, + 0x0b, 0x06, 0x12, 0x1c, 0x10, 0x03, 0x13, 0x0a, 0x05, 0x0f, 0x09, 0x01, + 0x21, 0xe4, 0x01, 0x26, 0xf9, 0xf4, 0x05, 0x19, 0x00, 0xff, 0x0b, 0xff, + 0x16, 0x09, 0xe7, 0xee, 0xed, 0xf5, 0x0f, 0x2f, 0xee, 0x19, 0x03, 0x0a, + 0x10, 0xee, 0xf7, 0x2e, 0xf4, 0x08, 0xf7, 0xee, 0x07, 0x00, 0xfc, 0x0e, + 0xf0, 0x12, 0x08, 0x05, 0xed, 0x11, 0xfc, 0xfb, 0xf7, 0x25, 0xf1, 0x05, + 0x0c, 0xf9, 0xfa, 0x03, 0x0c, 0x16, 0x04, 0x25, 0xf8, 0xe7, 0xfc, 0x11, + 0x0d, 0x19, 0xd8, 0xfa, 0x0b, 0x06, 0xfd, 0xef, 0x13, 0xf6, 0xff, 0x0e, + 0xf9, 0x04, 0xf1, 0xdc, 0xfb, 0xe1, 0xf6, 0x0b, 0x15, 0x07, 0xf7, 0x02, + 0x0e, 0xf1, 0xfd, 0xe3, 0xeb, 0x07, 0xf1, 0xef, 0x03, 0xfe, 0xf8, 0x07, + 0x10, 0xf7, 0x00, 0xf9, 0xf2, 0x0e, 0xf9, 0xf2, 0x1d, 0xf5, 0xd8, 0xff, + 0xe6, 0x18, 0x2a, 0x1b, 0x03, 0x16, 0xfe, 0xf4, 0xf5, 0xfd, 0x04, 0x01, + 0xfe, 0xfe, 0x07, 0xfc, 0x0e, 0xfa, 0x15, 0xeb, 0x02, 0x15, 0xea, 0xfd, + 0x04, 0xe5, 0xfe, 0xed, 0xfe, 0x1a, 0x09, 0x2a, 0x1b, 0xdf, 0xfb, 0xf8, + 0xf1, 0x04, 0x1a, 0x34, 0x07, 0xf9, 0x0d, 0xf5, 0xef, 0xec, 0x10, 0x1a, + 0x0b, 0x0f, 0x13, 0xfe, 0x10, 0x22, 0x1e, 0x02, 0xe6, 0xf7, 0x11, 0xfa, + 0x11, 0xfc, 0x1b, 0x21, 0x12, 0xf4, 0x18, 0x16, 0x29, 0xe4, 0x0c, 0x2e, + 0x12, 0x07, 0x20, 0xf6, 0x1d, 0xf4, 0x12, 0x33, 0xf4, 0xee, 0xfe, 0x05, + 0x06, 0xfb, 0x13, 0x0c, 0x0e, 0xf0, 0x00, 0xf8, 0xee, 0xf3, 0x17, 0x00, + 0xf7, 0xfb, 0xfc, 0x0f, 0xf4, 0xd5, 0x0a, 0xed, 0xeb, 0xf5, 0xe9, 0xef, + 0xd8, 0xf0, 0xf8, 0xe2, 0x19, 0xf7, 0xf8, 0x0a, 0x0b, 0x09, 0xfa, 0xe7, + 0x0f, 0xfc, 0xe8, 0x02, 0x00, 0x1a, 0xfe, 0xfd, 0x1b, 0xe6, 0xef, 0x0f, + 0xe3, 0x10, 0xf1, 0xe2, 0x0b, 0x0e, 0x06, 0x29, 0x00, 0x01, 0xf3, 0x00, + 0x11, 0x04, 0xf2, 0xf7, 0xea, 0xf8, 0xe0, 0x09, 0x0e, 0x13, 0xf4, 0x00, + 0x09, 0xfa, 0xf5, 0x0c, 0xff, 0x18, 0x08, 0x0d, 0xfa, 0xde, 0xfa, 0x03, + 0xf2, 0xf3, 0x1b, 0xeb, 0x06, 0xea, 0xfb, 0xff, 0x0d, 0xf5, 0x10, 0x17, + 0xf8, 0xe8, 0xf1, 0xf1, 0xf5, 0x00, 0x03, 0x0a, 0x09, 0x0a, 0xf3, 0xfb, + 0x33, 0x26, 0xe7, 0x17, 0xe3, 0xfa, 0x1f, 0x24, 0xfc, 0x07, 0x02, 0xe2, + 0xeb, 0x08, 0x2c, 0xf8, 0x02, 0x1f, 0x04, 0xeb, 0x0b, 0x04, 0x17, 0xf7, + 0xff, 0x1c, 0xed, 0x00, 0x3f, 0xd5, 0x17, 0x1d, 0xfe, 0x03, 0xf1, 0x1c, + 0x17, 0xec, 0x0e, 0x54, 0xee, 0xf5, 0x25, 0xfa, 0x08, 0xee, 0x13, 0x32, + 0x0e, 0xd8, 0x09, 0x0f, 0xee, 0xe5, 0x06, 0x10, 0xf4, 0xfb, 0xe4, 0xfb, + 0x09, 0xde, 0x13, 0xff, 0x02, 0xf9, 0xec, 0x0a, 0x00, 0xe9, 0xfd, 0xdc, + 0x06, 0x04, 0xdb, 0x06, 0x01, 0xf8, 0x09, 0xe2, 0x0c, 0x14, 0xda, 0xfe, + 0x20, 0xe3, 0x09, 0xda, 0x14, 0x12, 0xe1, 0x05, 0xff, 0xf3, 0x00, 0x08, + 0xfb, 0xf1, 0xfd, 0xf3, 0x04, 0xfa, 0x08, 0xff, 0x01, 0x1d, 0x0b, 0xfd, + 0x0a, 0xf4, 0xfb, 0xfc, 0xf9, 0x19, 0xed, 0xfc, 0xf2, 0x06, 0xe7, 0x02, + 0xf6, 0x0c, 0xfc, 0xfb, 0x01, 0x0c, 0xeb, 0x1b, 0xff, 0xff, 0x08, 0x1d, + 0xf7, 0xe8, 0xfc, 0xf4, 0x0c, 0xfa, 0xf1, 0xee, 0xed, 0xdd, 0xfc, 0x06, + 0x05, 0xdc, 0x1a, 0xfc, 0xf9, 0x07, 0xdf, 0x1b, 0x14, 0x0c, 0xfc, 0x01, + 0x16, 0xe1, 0xed, 0x09, 0x34, 0xee, 0xe4, 0x1c, 0x1b, 0xfc, 0x3b, 0x03, + 0x15, 0xf2, 0xeb, 0x14, 0x00, 0xdd, 0x24, 0x04, 0xf1, 0xed, 0xfd, 0xe6, + 0x32, 0xf9, 0x24, 0x04, 0x0e, 0x22, 0x03, 0x14, 0x2f, 0xf5, 0x1a, 0x37, + 0xf4, 0x18, 0x03, 0x0f, 0x4b, 0xe6, 0x0d, 0x5c, 0xf7, 0x1f, 0x1c, 0xe6, + 0x23, 0x0c, 0x15, 0x4e, 0xe0, 0x05, 0x1c, 0xec, 0xff, 0x04, 0x13, 0x15, + 0xee, 0x07, 0xec, 0x0c, 0xdd, 0xf8, 0x0e, 0x03, 0x0c, 0x1f, 0xe8, 0x0e, + 0xf5, 0xec, 0xfc, 0xe2, 0xe8, 0xfb, 0xf6, 0x00, 0xe5, 0xea, 0xf3, 0xd3, + 0xf5, 0xfd, 0xd2, 0xfd, 0x1b, 0xed, 0x09, 0xd1, 0x23, 0xfa, 0xd4, 0xf7, + 0xe9, 0xf0, 0x0a, 0xd6, 0x14, 0x03, 0xe6, 0x10, 0xf4, 0x18, 0xfe, 0xe1, + 0x0b, 0x25, 0xf5, 0xfc, 0xe9, 0xf2, 0xe9, 0xf4, 0x0d, 0xf5, 0x00, 0xf9, + 0x17, 0x02, 0xfd, 0x03, 0x04, 0xf8, 0xf5, 0x14, 0xe3, 0xd3, 0xeb, 0xe7, + 0x09, 0xf3, 0x14, 0x17, 0xee, 0xe6, 0xf6, 0xff, 0x11, 0x26, 0xf4, 0xf7, + 0x02, 0xfa, 0x05, 0x08, 0x16, 0xff, 0x0d, 0xf7, 0xf1, 0xf7, 0xe6, 0xfb, + 0x04, 0x04, 0x07, 0x02, 0x04, 0x09, 0xf5, 0xfc, 0x5f, 0xd6, 0xe7, 0x2a, + 0x23, 0xf4, 0x1b, 0x06, 0x01, 0xea, 0xe7, 0x05, 0x25, 0xe3, 0x25, 0x07, + 0xea, 0xfb, 0xfb, 0x09, 0x25, 0xde, 0x37, 0x04, 0x07, 0xe5, 0xff, 0x14, + 0x2f, 0x0a, 0x30, 0x23, 0x04, 0xf0, 0x23, 0xfe, 0x1c, 0xd2, 0x2b, 0x55, + 0x01, 0xe5, 0x26, 0xfe, 0x14, 0xed, 0x24, 0x46, 0xe6, 0xee, 0x0f, 0xfd, + 0xed, 0xef, 0x0e, 0x1e, 0x05, 0x0a, 0x12, 0xff, 0xe4, 0xf5, 0x0c, 0xed, + 0xfd, 0xea, 0x0d, 0x13, 0x1a, 0xe5, 0xfc, 0xc2, 0xef, 0x0a, 0xe2, 0x0f, + 0xfe, 0xff, 0x0c, 0xf0, 0xff, 0xdf, 0xea, 0x00, 0xf6, 0xe1, 0x04, 0xd8, + 0x26, 0x20, 0xdc, 0xf4, 0x19, 0x06, 0xe8, 0xd2, 0x10, 0x04, 0xf1, 0x02, + 0x0c, 0x06, 0xf0, 0xf0, 0x04, 0x1f, 0xf4, 0xf5, 0xed, 0xf1, 0xfa, 0xf1, + 0x04, 0x02, 0xf8, 0xfb, 0x04, 0xf1, 0xe5, 0xe4, 0x0a, 0xf0, 0xfe, 0xef, + 0x1c, 0xe3, 0xeb, 0xf3, 0x00, 0x17, 0x01, 0x13, 0x19, 0xda, 0xf8, 0x06, + 0xde, 0x11, 0xea, 0xf7, 0xf4, 0xef, 0x03, 0x04, 0x0b, 0xe8, 0x08, 0x0e, + 0xe2, 0xee, 0xde, 0x06, 0x0e, 0x29, 0xfb, 0xfa, 0x00, 0x02, 0xec, 0x1b, + 0x52, 0xff, 0xde, 0x3a, 0x2f, 0x13, 0x30, 0xe9, 0xff, 0xf6, 0xe7, 0x15, + 0x1d, 0xd9, 0x3c, 0x0f, 0xe6, 0x14, 0xee, 0x13, 0x1f, 0xe7, 0x33, 0x08, + 0xfc, 0x06, 0x0c, 0x08, 0x19, 0xd9, 0x2b, 0x1f, 0x07, 0x10, 0x24, 0x16, + 0x29, 0xfc, 0x31, 0x4d, 0xf0, 0xd9, 0x3f, 0xf2, 0x20, 0xe2, 0x25, 0x49, + 0xe5, 0xec, 0x0a, 0xf5, 0xf2, 0xd9, 0x22, 0x1f, 0xed, 0x22, 0x02, 0x0a, + 0x16, 0x08, 0xf7, 0xfb, 0x0e, 0xfb, 0xfb, 0x1d, 0xf3, 0x1c, 0xf6, 0xe1, + 0xcf, 0x19, 0xf4, 0x0f, 0xee, 0xf9, 0x04, 0xd1, 0xf9, 0xe2, 0xda, 0xf1, + 0x24, 0xf5, 0x07, 0xdf, 0x1d, 0xf9, 0xdb, 0x18, 0x0b, 0xea, 0x08, 0xca, + 0xf2, 0xfa, 0xec, 0x04, 0x0e, 0x17, 0xed, 0xf1, 0x06, 0x15, 0xfc, 0xfd, + 0x08, 0xfa, 0xe3, 0xe4, 0x0a, 0xfc, 0xee, 0x08, 0xf5, 0x09, 0xef, 0xee, + 0x06, 0xef, 0xe1, 0x19, 0x07, 0xe8, 0xe6, 0xdf, 0xea, 0x0d, 0xf1, 0x16, + 0xee, 0xed, 0xf8, 0x09, 0xfa, 0xfb, 0x0c, 0xf8, 0xeb, 0xda, 0x00, 0xfc, + 0x04, 0xfe, 0xf5, 0xff, 0xf6, 0xe1, 0x0c, 0x0a, 0x13, 0x0d, 0xf6, 0xf5, + 0x15, 0x07, 0xca, 0xec, 0x50, 0x0e, 0xd0, 0x26, 0x4c, 0xf8, 0x23, 0xeb, + 0xff, 0x08, 0xe3, 0x11, 0x2c, 0xf9, 0x2a, 0xf1, 0xe9, 0x0b, 0xe9, 0x0f, + 0x15, 0xec, 0x33, 0x11, 0x0c, 0x0d, 0x01, 0x01, 0x32, 0xe3, 0x41, 0x27, + 0x11, 0x02, 0x2e, 0x07, 0x09, 0xe3, 0x22, 0x4d, 0xf1, 0x05, 0x27, 0x03, + 0x25, 0xf5, 0x2c, 0x3b, 0xf4, 0x00, 0x16, 0x0b, 0xec, 0xfe, 0x17, 0x0d, + 0xff, 0xe7, 0xfe, 0x24, 0x06, 0xee, 0xf0, 0xe9, 0xfa, 0x1c, 0xf2, 0x19, + 0x08, 0xfa, 0xff, 0xd2, 0x01, 0x02, 0xea, 0x05, 0xf2, 0xf4, 0x0b, 0xd2, + 0xf9, 0x0d, 0xcd, 0x0d, 0x12, 0xf2, 0x0e, 0xe1, 0x1f, 0x00, 0xe7, 0x14, + 0x04, 0xff, 0x09, 0xdb, 0xfc, 0xd9, 0x06, 0xf9, 0xeb, 0x01, 0xef, 0xfa, + 0xfb, 0xf5, 0xfc, 0xfb, 0x14, 0xe2, 0xf9, 0xf5, 0x02, 0xfd, 0xfc, 0x01, + 0xf7, 0xf3, 0x00, 0xec, 0xe7, 0xf2, 0x00, 0xf1, 0x11, 0xec, 0xf0, 0xe9, + 0x11, 0x0a, 0x07, 0x04, 0x01, 0xee, 0xfb, 0xf2, 0x14, 0x01, 0x12, 0xf0, + 0xf2, 0xf1, 0xf0, 0xfb, 0x08, 0x03, 0xf8, 0x01, 0xe8, 0xf9, 0x17, 0x26, + 0x0f, 0xea, 0xf7, 0xf8, 0x1e, 0xfe, 0xf2, 0xf8, 0x3f, 0x00, 0xd4, 0x1c, + 0x53, 0xfe, 0x1e, 0x0f, 0xef, 0xdd, 0xed, 0x10, 0x19, 0xe7, 0x34, 0x0e, + 0xde, 0xdf, 0xfa, 0x0e, 0x29, 0xe3, 0x16, 0x09, 0x06, 0x12, 0xeb, 0xf9, + 0x32, 0xe0, 0x1a, 0x1d, 0xf3, 0xed, 0x10, 0x07, 0x31, 0xf2, 0x12, 0x52, + 0xeb, 0xf7, 0x1e, 0xf7, 0x1a, 0xdc, 0x3e, 0x33, 0xe3, 0xfb, 0x1f, 0x0b, + 0x08, 0xfe, 0x13, 0x1a, 0xf4, 0xf8, 0xfe, 0x08, 0xfc, 0xe9, 0xfe, 0xeb, + 0xe6, 0xf6, 0x02, 0x18, 0x02, 0xe8, 0xfb, 0xf3, 0x01, 0x08, 0xd7, 0x13, + 0x04, 0xe6, 0x02, 0xe6, 0xd7, 0x01, 0xd4, 0xf0, 0x0e, 0x05, 0x18, 0xe5, + 0x08, 0xe5, 0xd2, 0x16, 0x12, 0xfe, 0x0e, 0xd3, 0xfc, 0x1f, 0xe9, 0xf8, + 0x11, 0x06, 0xf3, 0xd5, 0xf8, 0xff, 0xf0, 0x04, 0x0a, 0xd9, 0xf8, 0xfd, + 0xf5, 0x12, 0xff, 0x06, 0x1b, 0xe6, 0xfe, 0xfe, 0xde, 0xee, 0xf6, 0x18, + 0xf1, 0xf8, 0x06, 0xf3, 0x02, 0xea, 0x04, 0x14, 0xfc, 0xee, 0xe6, 0x09, + 0xf9, 0xee, 0xe3, 0xe7, 0xfc, 0xd9, 0xef, 0xfc, 0x0a, 0x0c, 0x03, 0xf6, + 0xe2, 0x11, 0x0f, 0x19, 0x18, 0x10, 0xef, 0xe5, 0x22, 0xf5, 0xe5, 0xe9, + 0x4b, 0xf7, 0xdb, 0x0c, 0x4f, 0xde, 0x22, 0x16, 0x09, 0x16, 0xd1, 0xf8, + 0x19, 0xe0, 0x24, 0xfe, 0xb8, 0xfb, 0xe5, 0x12, 0x1c, 0xe3, 0x22, 0x09, + 0x05, 0x29, 0xf7, 0x10, 0x31, 0xe1, 0x33, 0x3f, 0xfd, 0xed, 0x04, 0x03, + 0x2e, 0xed, 0x30, 0x36, 0xee, 0x16, 0x2f, 0xf5, 0x1b, 0xdc, 0x3a, 0x56, + 0xe5, 0xef, 0x26, 0xff, 0x03, 0xd7, 0x31, 0x16, 0xef, 0xf1, 0x08, 0x13, + 0x01, 0x02, 0x03, 0xf1, 0xf2, 0x08, 0xff, 0x05, 0x12, 0xf2, 0xee, 0xda, + 0xed, 0xec, 0xea, 0xf7, 0x0c, 0xf1, 0x09, 0xe6, 0xe6, 0x00, 0xcc, 0x10, + 0x0d, 0x0d, 0x20, 0xf4, 0x18, 0x23, 0xec, 0xf9, 0x00, 0xe4, 0x07, 0xd4, + 0xfb, 0x16, 0xd2, 0x01, 0xe6, 0x01, 0x06, 0xf0, 0xfe, 0x03, 0xf3, 0x09, + 0x01, 0x0d, 0x05, 0xf7, 0xd4, 0x02, 0xfb, 0xfb, 0x08, 0xf0, 0x1f, 0xf3, + 0xfe, 0xeb, 0x02, 0x0e, 0x1b, 0x0f, 0x04, 0xf5, 0xf0, 0x1f, 0x14, 0xf7, + 0x06, 0xdc, 0xf9, 0xe9, 0x01, 0xff, 0x08, 0xf2, 0x06, 0xff, 0xff, 0xf3, + 0x05, 0x1a, 0xfc, 0xfa, 0xeb, 0xfb, 0xfa, 0x12, 0x20, 0xf6, 0xe0, 0xe8, + 0x1c, 0xfa, 0xd6, 0x0d, 0x2c, 0x04, 0xe1, 0x09, 0x3b, 0xd3, 0x2a, 0xee, + 0xf7, 0xed, 0xf1, 0xf7, 0x0d, 0xf0, 0x32, 0x0f, 0xc9, 0x0e, 0x00, 0x10, + 0x24, 0xfb, 0x31, 0xf0, 0xf4, 0xdd, 0xf5, 0x04, 0x25, 0xc7, 0x27, 0x25, + 0x16, 0x11, 0x2e, 0x09, 0x30, 0xd1, 0x2c, 0x34, 0xe6, 0xf0, 0x21, 0xf5, + 0x21, 0xc8, 0x40, 0x39, 0xde, 0xf0, 0x12, 0xf3, 0x10, 0xe8, 0x1f, 0x18, + 0xfa, 0xea, 0x07, 0x11, 0xdf, 0xed, 0xfa, 0xf0, 0x07, 0xef, 0xf3, 0x05, + 0x10, 0xe5, 0xf3, 0xe9, 0xe9, 0xe8, 0xd6, 0x01, 0xf9, 0x05, 0x0b, 0xee, + 0xf9, 0x12, 0xe3, 0x05, 0xfd, 0xe6, 0x16, 0xe2, 0x1b, 0x12, 0xc5, 0x00, + 0xfd, 0x02, 0x04, 0xd2, 0xff, 0xec, 0xf6, 0xfd, 0x00, 0xe4, 0xf7, 0xf3, + 0xeb, 0xfa, 0xf8, 0x0d, 0x03, 0xfa, 0xfe, 0xe4, 0xdb, 0xe3, 0x06, 0xff, + 0xf4, 0xf2, 0x1b, 0xf1, 0xf7, 0x02, 0x01, 0x04, 0x13, 0xe5, 0x0c, 0x05, + 0xf7, 0x0a, 0x03, 0x03, 0x0b, 0x03, 0xee, 0xf7, 0x21, 0x20, 0xff, 0xf3, + 0x09, 0xe5, 0xff, 0xec, 0x17, 0x00, 0x06, 0x14, 0xeb, 0xf2, 0x18, 0x16, + 0x1f, 0xec, 0xee, 0xe1, 0x1e, 0x03, 0xfa, 0xfe, 0x28, 0x03, 0xc9, 0x0c, + 0x3f, 0xd8, 0x30, 0x16, 0x03, 0xf8, 0xe9, 0xfb, 0x28, 0xe1, 0x36, 0x0a, + 0xdf, 0xe5, 0xeb, 0x08, 0x1c, 0xcd, 0x29, 0xf2, 0xfc, 0x0a, 0xed, 0x01, + 0x29, 0xf1, 0x20, 0x13, 0x04, 0xec, 0x17, 0x0a, 0x35, 0xc3, 0x1a, 0x46, + 0xe0, 0xd7, 0x3c, 0x09, 0x28, 0xd1, 0x22, 0x20, 0xd5, 0xfa, 0x28, 0xfa, + 0xff, 0xea, 0x1d, 0x23, 0xe0, 0x07, 0x07, 0x0f, 0xf1, 0xf1, 0x08, 0xf0, + 0xf8, 0xff, 0x05, 0x1b, 0x05, 0xfa, 0xf0, 0xfb, 0xe3, 0xe4, 0xcc, 0x1a, + 0xf9, 0x09, 0x06, 0xee, 0xf4, 0x03, 0xd0, 0x14, 0xf4, 0xff, 0x1d, 0xe8, + 0x11, 0xf4, 0xd1, 0xf4, 0x04, 0x0b, 0xfb, 0xdc, 0x0a, 0x0c, 0xeb, 0xed, + 0x06, 0xf3, 0x04, 0xdd, 0xdf, 0xf9, 0xea, 0xfc, 0xf5, 0xf2, 0xfb, 0xea, + 0xe3, 0x03, 0xee, 0x0e, 0xff, 0xdb, 0x1e, 0x04, 0xf7, 0x1a, 0x04, 0x0c, + 0x0d, 0xda, 0x04, 0xe9, 0xff, 0x04, 0x00, 0x0c, 0xf9, 0xe4, 0xfb, 0xf6, + 0x14, 0xde, 0x1b, 0x00, 0x0b, 0xfe, 0x06, 0xf8, 0x0f, 0xdc, 0x01, 0xef, + 0xef, 0x0d, 0xf8, 0xf1, 0x0f, 0xf9, 0xf9, 0xdf, 0x0d, 0xe4, 0xd9, 0xf9, + 0x2b, 0xee, 0xe8, 0x09, 0x40, 0xf9, 0x2f, 0x0a, 0xfa, 0xe8, 0xe9, 0x01, + 0x0e, 0xe7, 0x23, 0x0a, 0xd0, 0x19, 0xd3, 0x0e, 0x04, 0xda, 0x2b, 0x0f, + 0xe7, 0xe6, 0xf3, 0xfb, 0x2c, 0xd3, 0x36, 0x19, 0x0e, 0xfe, 0x03, 0x1a, + 0x2e, 0xd0, 0x23, 0x32, 0xf1, 0xe1, 0x2a, 0x09, 0x1b, 0xf6, 0x29, 0x3e, + 0xce, 0x15, 0x0a, 0xe8, 0xec, 0xdf, 0x44, 0x28, 0xd9, 0xfd, 0xfa, 0x09, + 0xff, 0xe7, 0x08, 0xec, 0xf4, 0xef, 0x01, 0x19, 0x11, 0xf3, 0xeb, 0xeb, + 0xed, 0x1a, 0xdd, 0x15, 0x0f, 0x07, 0xfe, 0xeb, 0xff, 0xd6, 0xd5, 0x04, + 0xf5, 0x07, 0x10, 0xe6, 0x0c, 0xe4, 0xda, 0x0c, 0x08, 0xee, 0x06, 0xd8, + 0xf8, 0xf1, 0xe0, 0x01, 0x08, 0xfe, 0xf9, 0xf3, 0xdf, 0x03, 0xe6, 0xf4, + 0x0a, 0xff, 0xf2, 0xe0, 0xd9, 0xeb, 0x01, 0x10, 0x02, 0xfc, 0x0d, 0x14, + 0xea, 0xf8, 0x03, 0x18, 0xf3, 0x09, 0xfc, 0x0c, 0x0b, 0x1f, 0xf5, 0x05, + 0xf7, 0xf9, 0x00, 0xfd, 0x04, 0xfc, 0x16, 0x07, 0x00, 0xdf, 0xf9, 0xfa, + 0x0c, 0xfb, 0xf4, 0xf7, 0xf0, 0xeb, 0x07, 0x17, 0x20, 0xfb, 0xf0, 0xec, + 0x04, 0x00, 0xf8, 0xf2, 0x2d, 0xf9, 0xd9, 0x0b, 0x55, 0xec, 0x33, 0x26, + 0xf8, 0x0a, 0xf2, 0x0b, 0x25, 0xdf, 0x29, 0x05, 0xd1, 0x14, 0xe2, 0xf2, + 0x12, 0xdd, 0x28, 0xfc, 0xec, 0x08, 0xfd, 0x02, 0x3a, 0xe6, 0x29, 0x25, + 0x0d, 0x10, 0x09, 0x0a, 0x32, 0xf5, 0x17, 0x2d, 0xea, 0xfb, 0x35, 0xfc, + 0x28, 0xd0, 0x29, 0x2f, 0xcb, 0x06, 0x0f, 0x04, 0xf2, 0xf3, 0x34, 0x1c, + 0xf4, 0x08, 0x05, 0xfc, 0xfd, 0xed, 0x0f, 0xf8, 0xe9, 0xf0, 0x09, 0x16, + 0xfe, 0x02, 0xff, 0xd4, 0xea, 0x0a, 0xeb, 0x0c, 0xf8, 0xf4, 0x09, 0xf4, + 0xf2, 0x07, 0xd9, 0x0b, 0xfd, 0xe4, 0x1a, 0xef, 0x14, 0x08, 0xd8, 0xfc, + 0xf5, 0xe1, 0x03, 0xcf, 0xf1, 0x11, 0xdb, 0x15, 0x07, 0x10, 0xf8, 0xfc, + 0xe2, 0xf1, 0xf5, 0xde, 0xff, 0xe7, 0x01, 0xea, 0xee, 0xe9, 0x02, 0x0a, + 0x18, 0xec, 0xfe, 0xf9, 0x09, 0xf3, 0x0e, 0x02, 0xf1, 0xfc, 0xf9, 0x16, + 0x05, 0x07, 0x09, 0x0d, 0x0e, 0xf7, 0x04, 0xed, 0x04, 0xdb, 0x04, 0x04, + 0xf6, 0xdc, 0xee, 0xec, 0xf5, 0xfe, 0xf4, 0x02, 0xe4, 0x0b, 0xe0, 0x17, + 0x0a, 0xe0, 0xf7, 0xdc, 0x11, 0xd6, 0xfe, 0xfa, 0x35, 0xde, 0xe6, 0x06, + 0x44, 0xf9, 0x35, 0x0a, 0xfb, 0xff, 0xec, 0xfb, 0x16, 0xd9, 0x23, 0x0f, + 0xd4, 0xef, 0xdf, 0x06, 0x0b, 0xd9, 0x25, 0xff, 0xf8, 0xeb, 0xf4, 0x0a, + 0x20, 0xe5, 0x22, 0x1c, 0xeb, 0xf4, 0x0d, 0x0c, 0x19, 0xe1, 0x1e, 0x31, + 0xe9, 0xfb, 0x20, 0xf0, 0x23, 0xfe, 0x35, 0x28, 0xb4, 0x06, 0x28, 0xe7, + 0xfb, 0xe9, 0x2a, 0x1a, 0xef, 0x15, 0x0c, 0xed, 0xf1, 0x04, 0x0e, 0x0a, + 0xff, 0x16, 0x01, 0x04, 0x17, 0xea, 0xec, 0xdc, 0xf4, 0xf7, 0x04, 0x16, + 0x1f, 0x0a, 0x11, 0xef, 0x12, 0xdf, 0xd9, 0x0c, 0xf5, 0x10, 0x02, 0xf3, + 0x10, 0x03, 0xd3, 0xf5, 0x0b, 0x02, 0x00, 0xcb, 0xf6, 0x23, 0xf6, 0xf1, + 0x1f, 0xf9, 0xfc, 0xf0, 0xf6, 0xfe, 0xfa, 0xf8, 0xf9, 0xf4, 0xfb, 0x0a, + 0xd6, 0x29, 0x09, 0x02, 0x00, 0xfc, 0xfc, 0xee, 0xf5, 0x05, 0xfb, 0x1e, + 0xf1, 0xf1, 0xf3, 0x02, 0xec, 0x1c, 0x0c, 0x0e, 0x0b, 0x04, 0xf6, 0xe7, + 0x14, 0x08, 0x27, 0x01, 0xfe, 0xe5, 0xe7, 0x01, 0x1b, 0xf0, 0xf6, 0xff, + 0xf4, 0xe7, 0xee, 0x18, 0x0d, 0x08, 0xf8, 0xd6, 0x07, 0xf4, 0x08, 0xff, + 0x1d, 0x13, 0xe7, 0x0b, 0x42, 0xef, 0x28, 0x00, 0xf9, 0xf0, 0xf3, 0x00, + 0x15, 0xfd, 0x1a, 0x22, 0xc1, 0xf5, 0xe0, 0xf8, 0x09, 0xe6, 0x0e, 0x05, + 0xf9, 0xf6, 0x01, 0x01, 0x13, 0xdc, 0x1f, 0x0d, 0xfb, 0x04, 0x08, 0x0b, + 0x15, 0xdb, 0x28, 0x34, 0xed, 0x0b, 0x3a, 0xed, 0x16, 0xe3, 0x39, 0x32, + 0xc4, 0x0b, 0x20, 0xe7, 0xf7, 0x02, 0x35, 0x24, 0xfc, 0xe8, 0x1c, 0xf8, + 0xf1, 0xfa, 0x0c, 0x1d, 0xf2, 0x05, 0xff, 0x12, 0x0f, 0x01, 0xec, 0xea, + 0xf0, 0x03, 0xe7, 0x15, 0xfd, 0x05, 0x08, 0xe0, 0x1b, 0xf8, 0xe1, 0x1e, + 0xed, 0xdc, 0x11, 0xeb, 0xfd, 0x1a, 0xeb, 0x09, 0xf9, 0xf3, 0x00, 0xe8, + 0xe6, 0x08, 0xf7, 0xde, 0x1e, 0x00, 0x00, 0x00, 0xe4, 0x09, 0xf2, 0xf8, + 0xe7, 0xf2, 0x0d, 0xfa, 0xe2, 0x0f, 0x04, 0x08, 0xf2, 0x13, 0xf8, 0xf9, + 0xf1, 0xff, 0x03, 0x11, 0x12, 0xe9, 0xf4, 0x13, 0x07, 0x0c, 0x13, 0x2b, + 0xf7, 0xdd, 0xf9, 0xe9, 0xfa, 0xdb, 0x1d, 0xf6, 0xf6, 0xf9, 0xe4, 0xf6, + 0x0d, 0xeb, 0x0d, 0x08, 0xe7, 0xe7, 0xf2, 0x03, 0x1d, 0xd9, 0xd8, 0xe4, + 0xf7, 0xea, 0xdc, 0xdc, 0x26, 0x02, 0xee, 0xfa, 0x38, 0xfc, 0x1a, 0xef, + 0xda, 0xf1, 0xdf, 0x0b, 0x1a, 0xe0, 0x16, 0x16, 0xdc, 0x04, 0xfa, 0xf7, + 0xee, 0x02, 0x25, 0x02, 0xf5, 0xfb, 0x08, 0xf6, 0x11, 0xf5, 0x12, 0x08, + 0xf4, 0xe3, 0x1b, 0xf5, 0x3a, 0xdc, 0x20, 0x2e, 0xe0, 0xf5, 0x30, 0xe4, + 0x09, 0xf8, 0x3c, 0x45, 0xd3, 0x08, 0x23, 0xd8, 0x09, 0xe4, 0x35, 0x30, + 0xe4, 0xfe, 0x07, 0xf6, 0x05, 0x01, 0x05, 0xff, 0xf6, 0x0d, 0x02, 0xfd, + 0x03, 0x05, 0x0d, 0x00, 0xf5, 0xd6, 0xcf, 0x19, 0x06, 0xee, 0x0d, 0xf2, + 0x01, 0x18, 0xef, 0x12, 0x04, 0x02, 0x21, 0xd9, 0x02, 0x0d, 0xeb, 0xe9, + 0x13, 0x08, 0x15, 0xf0, 0xee, 0x03, 0xec, 0x06, 0x17, 0xed, 0x00, 0x1a, + 0xee, 0xf2, 0xfc, 0x09, 0xec, 0xf8, 0xf8, 0x18, 0xf4, 0x13, 0x04, 0xf6, + 0x02, 0xf0, 0xfc, 0xfe, 0xe3, 0x01, 0x0a, 0x1c, 0x1b, 0xec, 0x0e, 0x01, + 0xfb, 0x08, 0x11, 0xf5, 0x00, 0x14, 0xe6, 0x12, 0x07, 0xf4, 0x15, 0x07, + 0xfc, 0xfb, 0xf5, 0xf1, 0x01, 0x21, 0x01, 0xe9, 0xe8, 0xef, 0xdb, 0xdf, + 0x1f, 0x0a, 0xdd, 0xd1, 0x16, 0x04, 0xfd, 0xe1, 0x24, 0xf0, 0xec, 0xf4, + 0x38, 0xe1, 0x16, 0xfd, 0xe0, 0xec, 0xe7, 0x0c, 0x2a, 0x04, 0x0c, 0x17, + 0xdc, 0xe8, 0xf2, 0x03, 0xec, 0xfd, 0x19, 0xfe, 0xf3, 0xf0, 0xf3, 0xfb, + 0x18, 0xdf, 0x1c, 0x00, 0x09, 0xf4, 0x18, 0x0b, 0x1f, 0xf6, 0x34, 0x22, + 0xf4, 0x22, 0x45, 0xeb, 0x23, 0xcf, 0x32, 0x34, 0xf2, 0xf9, 0x29, 0xd4, + 0xf7, 0x0b, 0x38, 0x2a, 0x09, 0xe6, 0x05, 0x01, 0x0b, 0xfe, 0x17, 0xfb, + 0x00, 0xeb, 0x08, 0xfd, 0x0c, 0x02, 0x1d, 0xea, 0xfa, 0x0b, 0xeb, 0x09, + 0xfe, 0xfe, 0x10, 0xe0, 0xf6, 0x06, 0xf0, 0x15, 0xf3, 0x09, 0x11, 0xe4, + 0xf9, 0x07, 0xe1, 0xed, 0x17, 0x05, 0x0c, 0xe1, 0xdb, 0xf2, 0xf8, 0xea, + 0x22, 0xe9, 0x02, 0x00, 0xfd, 0xe7, 0xf2, 0xf8, 0xf9, 0xfc, 0xfa, 0xe8, + 0xe8, 0xeb, 0xe9, 0x0d, 0x04, 0xf8, 0xf8, 0xf7, 0xf8, 0x0d, 0x03, 0x0c, + 0x13, 0xf2, 0x0f, 0xf9, 0xe6, 0xfd, 0x0f, 0x19, 0x08, 0xf7, 0xfa, 0x01, + 0xf3, 0x12, 0x1e, 0x05, 0x0a, 0x09, 0xfd, 0x0b, 0x07, 0x08, 0x02, 0xfc, + 0xd6, 0xe8, 0x14, 0x01, 0x13, 0x19, 0xef, 0xda, 0x0e, 0x0a, 0x07, 0xef, + 0x34, 0xe0, 0x05, 0x1e, 0x4e, 0xe9, 0x19, 0xff, 0xe1, 0x04, 0xfb, 0x0e, + 0x11, 0x05, 0x1f, 0x15, 0xd4, 0xec, 0xf9, 0xe7, 0xf9, 0xfc, 0x25, 0xff, + 0x06, 0xf2, 0x01, 0xf6, 0x2a, 0x17, 0x24, 0x11, 0xf3, 0x1a, 0x1f, 0xfb, + 0x32, 0xeb, 0x33, 0x2f, 0x00, 0x08, 0x2c, 0xf0, 0x26, 0xf4, 0x25, 0x36, + 0xd9, 0xf1, 0x1a, 0xd5, 0xec, 0xf9, 0x32, 0x27, 0xfc, 0xf4, 0xf0, 0xe3, + 0xfa, 0x0c, 0x16, 0x17, 0xfa, 0xf9, 0xe5, 0x1f, 0x1f, 0xfa, 0xff, 0xfd, + 0x0d, 0x02, 0xe9, 0x0e, 0xf0, 0x12, 0x09, 0xda, 0x02, 0xea, 0xe5, 0x0a, + 0xff, 0x03, 0x13, 0xf0, 0x0a, 0xf9, 0xe9, 0xff, 0x10, 0xfc, 0x1a, 0xf3, + 0xf7, 0x0f, 0xf4, 0xfa, 0xf4, 0x05, 0x10, 0x0a, 0xdd, 0x09, 0xf7, 0xf0, + 0xe5, 0x07, 0x07, 0xfa, 0x02, 0xd7, 0xf8, 0xf7, 0x01, 0xfb, 0x0e, 0xf8, + 0x07, 0x0f, 0xfe, 0x03, 0x12, 0x05, 0x09, 0x13, 0xf8, 0xdc, 0xfd, 0x27, + 0x0f, 0xec, 0xf7, 0x07, 0x00, 0xfc, 0x12, 0xf8, 0xfb, 0xea, 0xe4, 0xe9, + 0xe9, 0xe0, 0xff, 0xdc, 0xd6, 0xeb, 0xf2, 0xf7, 0x0d, 0x1b, 0xe9, 0xc4, + 0x06, 0x00, 0xfd, 0x04, 0x46, 0xf9, 0xe9, 0x13, 0x2d, 0x0c, 0x1f, 0xf8, + 0xd3, 0x0c, 0x14, 0x11, 0x05, 0xe5, 0x27, 0x08, 0xc5, 0xef, 0xdf, 0xdd, + 0x04, 0xf8, 0x11, 0x10, 0xf0, 0xe7, 0xfb, 0x03, 0x3c, 0xe7, 0x14, 0x0c, + 0xf4, 0xf6, 0x1b, 0x0a, 0x23, 0xf2, 0x2d, 0x1a, 0x08, 0xff, 0x32, 0xe7, + 0x1a, 0x05, 0x2b, 0x34, 0xf1, 0x0a, 0x00, 0xe8, 0x02, 0xdf, 0x2c, 0x2a, + 0x03, 0xe6, 0xfc, 0xef, 0xfc, 0xe4, 0x03, 0x01, 0x03, 0xee, 0xe9, 0x15, + 0x05, 0x03, 0x13, 0x11, 0x0e, 0xee, 0xf5, 0x22, 0x1b, 0x0e, 0xfd, 0xf3, + 0x0a, 0x02, 0xdd, 0x20, 0xeb, 0x06, 0xf8, 0xe2, 0x06, 0x0e, 0xde, 0x0d, + 0xf9, 0x16, 0x1c, 0x0c, 0xe0, 0xf0, 0xec, 0x0c, 0x0f, 0xf2, 0x27, 0x1d, + 0xde, 0xe6, 0xf0, 0xf9, 0xf0, 0x02, 0x0a, 0x07, 0x06, 0xf9, 0x0f, 0xfa, + 0xf0, 0xee, 0xf1, 0xf7, 0xff, 0x02, 0x0b, 0x0d, 0x1b, 0xee, 0xf6, 0x05, + 0xff, 0x1c, 0x17, 0x04, 0x05, 0x17, 0x00, 0xff, 0x0d, 0xf3, 0x23, 0x10, + 0xfd, 0x05, 0xfb, 0xea, 0x03, 0x10, 0x07, 0xd7, 0xf7, 0xff, 0xf3, 0xf1, + 0x17, 0xed, 0xd3, 0xcb, 0x14, 0x1c, 0xf5, 0x03, 0x47, 0xf6, 0xf7, 0xf2, + 0x3e, 0xf2, 0x22, 0xf4, 0xed, 0xfc, 0xee, 0x0b, 0xf4, 0xf1, 0x25, 0x10, + 0xd0, 0xf6, 0x00, 0xef, 0x10, 0xfc, 0x15, 0xe5, 0xdb, 0xf3, 0xea, 0x10, + 0x22, 0xf2, 0x2b, 0x11, 0xf9, 0x0a, 0xfc, 0xf5, 0x53, 0x16, 0x25, 0x43, + 0xe0, 0x0e, 0x13, 0xfc, 0x2d, 0xe2, 0x55, 0x65, 0xf4, 0x08, 0x01, 0xdf, + 0x0a, 0x00, 0x49, 0x1c, 0xfe, 0xdf, 0xef, 0xf2, 0xf9, 0xf6, 0xfd, 0xff, + 0xf3, 0x02, 0xf6, 0x14, 0x0b, 0xe8, 0x09, 0xfc, 0xfc, 0xe2, 0xe5, 0x11, + 0x03, 0x09, 0xfb, 0x06, 0x10, 0x1a, 0xf3, 0x0d, 0xfa, 0x0a, 0xd5, 0xf5, + 0x1a, 0x11, 0xf2, 0xfc, 0x1f, 0xfe, 0x0e, 0xe4, 0xef, 0xd7, 0xee, 0x06, + 0x1e, 0x04, 0x12, 0x28, 0xf7, 0x0e, 0x06, 0xf8, 0xee, 0xf0, 0x1a, 0x01, + 0xf7, 0xfd, 0x03, 0x11, 0x19, 0x10, 0x04, 0xfb, 0xd7, 0xfa, 0x16, 0x06, + 0x07, 0x23, 0xfa, 0x14, 0x11, 0xf1, 0x12, 0x10, 0x04, 0xe1, 0xee, 0xf7, + 0x21, 0x0e, 0x0a, 0x0a, 0xf8, 0x07, 0x0a, 0xee, 0x03, 0x1f, 0xfa, 0xc4, + 0xec, 0x12, 0x01, 0x1e, 0xfd, 0xf1, 0xe8, 0xcc, 0xf4, 0x17, 0xff, 0xdd, + 0x45, 0x10, 0xee, 0xfa, 0x3d, 0xe7, 0x27, 0xdd, 0xd7, 0xf9, 0xf4, 0xf6, + 0x06, 0xf8, 0x1e, 0x13, 0xe7, 0xe2, 0xf1, 0xe3, 0xf3, 0xf7, 0x18, 0x12, + 0xe4, 0x0a, 0xdb, 0xff, 0xff, 0xfe, 0x20, 0x09, 0x00, 0xf7, 0x23, 0xf6, + 0x2d, 0x14, 0x26, 0x28, 0xe5, 0xff, 0x0f, 0xe3, 0x1d, 0xe8, 0x56, 0x43, + 0xe7, 0xfb, 0xf9, 0xe6, 0xe9, 0xe2, 0x19, 0x19, 0x08, 0xfa, 0xf3, 0xe5, + 0x23, 0x07, 0x0f, 0xf8, 0xf8, 0xf3, 0xfc, 0x11, 0x2a, 0x05, 0xf4, 0xf1, + 0xfa, 0xfb, 0xf1, 0x1e, 0x13, 0x0f, 0xf9, 0xf5, 0xfa, 0x09, 0xf9, 0x03, + 0xf0, 0xf0, 0xe7, 0xec, 0xf1, 0x0c, 0xe6, 0xee, 0xf6, 0x20, 0x0f, 0xe9, + 0x00, 0xf4, 0xfe, 0xf0, 0x13, 0x0a, 0x17, 0x13, 0xee, 0x13, 0xfb, 0xff, + 0xf8, 0xfd, 0xf4, 0xe2, 0xe8, 0x06, 0xfc, 0x14, 0x03, 0x17, 0x00, 0x03, + 0xe6, 0xfd, 0xf2, 0x12, 0x12, 0x20, 0xeb, 0x10, 0x02, 0xf7, 0x13, 0x0d, + 0x11, 0xfd, 0xde, 0xf5, 0x07, 0xf3, 0x04, 0xff, 0x06, 0x05, 0xfb, 0xea, + 0xf0, 0x0a, 0x00, 0xb5, 0xe8, 0x1a, 0x03, 0xfe, 0x0d, 0x1a, 0xe7, 0xc0, + 0xd6, 0xdc, 0xf6, 0xf8, 0x39, 0xf5, 0xd5, 0xf8, 0x22, 0xfa, 0x22, 0x05, + 0xd0, 0xf4, 0x2d, 0xfc, 0x00, 0x0a, 0x1b, 0xfc, 0xe6, 0x09, 0x14, 0xfa, + 0x00, 0x1d, 0x1a, 0xfd, 0xf3, 0x18, 0xfc, 0xeb, 0x15, 0xf5, 0x0e, 0x0a, + 0xf3, 0xf1, 0x1b, 0x05, 0x14, 0x03, 0x2d, 0x27, 0xfb, 0x18, 0x22, 0xef, + 0xf6, 0x06, 0x28, 0x2b, 0xde, 0xec, 0xef, 0xe8, 0xd3, 0xfe, 0x17, 0x12, + 0x01, 0x13, 0x05, 0xf7, 0x00, 0xde, 0xf3, 0xe5, 0x03, 0xfb, 0x07, 0x0b, + 0xfd, 0xdc, 0xdf, 0x03, 0x0c, 0x00, 0xfa, 0x06, 0x0e, 0x02, 0x05, 0xfa, + 0xfd, 0xed, 0x09, 0x0c, 0xfd, 0xfb, 0x0c, 0xf0, 0xe4, 0x04, 0xd6, 0xf3, + 0x09, 0x0a, 0xf9, 0xf8, 0xe2, 0xef, 0xdf, 0xf0, 0xf8, 0x03, 0x0f, 0x20, + 0xf4, 0xe3, 0xf8, 0x02, 0xe2, 0xe5, 0x25, 0x0f, 0xeb, 0xf8, 0xe9, 0xfd, + 0x04, 0x0c, 0x0c, 0xfe, 0x01, 0x08, 0xfc, 0xfc, 0x1b, 0x01, 0xe5, 0x13, + 0xf9, 0xe8, 0x07, 0x20, 0xfe, 0x06, 0xec, 0xfe, 0x09, 0xef, 0x14, 0x04, + 0x0b, 0xf5, 0xe7, 0xff, 0x0a, 0x02, 0x09, 0xe9, 0xc4, 0x16, 0x0d, 0xe7, + 0x15, 0x14, 0xf1, 0xd0, 0xec, 0xe7, 0xf0, 0xf0, 0x33, 0x05, 0xda, 0xf2, + 0x0b, 0x08, 0x38, 0x01, 0x07, 0xfd, 0xd8, 0x06, 0xd9, 0xf0, 0x16, 0x1f, + 0xff, 0xf7, 0xe0, 0xd8, 0xf3, 0xf7, 0x12, 0x08, 0x0e, 0x05, 0xf6, 0x03, + 0xef, 0x1b, 0x12, 0xf4, 0xe8, 0x0f, 0x02, 0xfd, 0xf2, 0x16, 0x26, 0x22, + 0xe0, 0x07, 0xf7, 0xe6, 0xeb, 0x16, 0x22, 0x1a, 0x0b, 0x01, 0xf5, 0xea, + 0xd2, 0x22, 0x0f, 0x13, 0x15, 0x08, 0xf0, 0xfb, 0xed, 0x11, 0xf3, 0xe9, + 0xff, 0xde, 0x0a, 0x18, 0x0f, 0x02, 0xfb, 0xf9, 0xfb, 0xe8, 0x12, 0x18, + 0x01, 0xf4, 0xf6, 0xf8, 0xf0, 0x1f, 0x24, 0x15, 0xf5, 0x00, 0x1c, 0xf9, + 0x01, 0x0a, 0x11, 0xd5, 0x01, 0x12, 0x02, 0xec, 0xfd, 0x07, 0xf2, 0xea, + 0xf9, 0xff, 0xf7, 0xfb, 0x15, 0xec, 0xe5, 0x01, 0xeb, 0x05, 0xf9, 0x10, + 0xfe, 0x28, 0xe5, 0x0a, 0xeb, 0x1b, 0x0e, 0xf9, 0xde, 0x02, 0x15, 0x0a, + 0xff, 0xfe, 0x11, 0x24, 0x03, 0xf8, 0x00, 0x08, 0xfd, 0x0e, 0xeb, 0xf3, + 0xf6, 0xf7, 0x14, 0x0e, 0xfc, 0xf5, 0xde, 0xf5, 0x9e, 0xfe, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xab, 0x01, 0x00, 0x00, + 0xfa, 0xfd, 0xff, 0xff, 0xa2, 0xff, 0xff, 0xff, 0xba, 0x00, 0x00, 0x00, + 0x24, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x54, 0x4f, 0x43, 0x4f, + 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x24, 0xfb, 0xff, 0xff, + 0x68, 0x01, 0x00, 0x00, 0x5c, 0x01, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xce, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x03, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x1a, 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xc4, 0xfc, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x1a, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x31, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x34, 0x04, 0x00, 0x00, 0xcc, 0x03, 0x00, 0x00, + 0x4c, 0x03, 0x00, 0x00, 0xdc, 0x02, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, + 0x20, 0x02, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0xfc, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf4, 0xfb, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3b, 0x0e, 0x00, 0x00, 0x00, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x6d, 0x61, 0x78, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0xb4, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x11, 0x1e, 0x23, 0x3a, 0x9e, 0xa1, 0x15, 0x39, + 0x23, 0x69, 0x45, 0x3a, 0x09, 0xe4, 0xe4, 0x39, 0x65, 0xd7, 0x13, 0x3a, + 0xe0, 0xb2, 0xfd, 0x39, 0x1b, 0xc1, 0x53, 0x3a, 0xc2, 0x50, 0x2d, 0x3a, + 0x12, 0x00, 0x00, 0x00, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3a, 0xfd, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x54, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2c, 0xfd, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xb5, 0xfa, 0xfa, 0x39, 0x1f, 0x00, 0x00, 0x00, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x5f, 0x66, 0x63, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x2f, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x73, 0x65, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xa0, 0x0f, 0x00, 0x00, 0xa2, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x74, 0xfe, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf2, 0xdd, 0xbb, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x32, 0xa3, 0x25, 0x41, 0x01, 0x00, 0x00, 0x00, + 0xf6, 0xa0, 0x50, 0xc1, 0x05, 0x00, 0x00, 0x00, 0x61, 0x64, 0x64, 0x5f, + 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0e, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, + 0x2c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x0f, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, + 0x32, 0x2f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x4a, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x5c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x50, 0xd0, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xcf, 0x41, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x68, + 0x61, 0x70, 0x65, 0x5f, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xc2, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x58, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x94, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x50, 0x50, 0xd0, 0x3d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xcf, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, + 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x07, 0x00, 0x00, 0x2e, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x60, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x3a, 0x6a, 0xac, 0x3d, 0x01, 0x00, 0x00, 0x00, + 0xd0, 0xbd, 0xab, 0x41, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x52, 0x65, 0x6c, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xaa, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9c, 0xff, 0xff, 0xff, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x96, 0x08, 0x29, 0x38, 0x0b, 0x00, 0x00, 0x00, + 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x18, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x9a, 0xbb, 0x84, 0x38, 0x83, 0x84, 0x73, 0x37, 0x5b, 0xa3, 0xa0, 0x38, + 0x16, 0x41, 0x3a, 0x38, 0xc7, 0x9a, 0x70, 0x38, 0xed, 0x70, 0x4e, 0x38, + 0x54, 0x4f, 0xac, 0x38, 0xfd, 0x07, 0x8d, 0x38, 0x0b, 0x00, 0x00, 0x00, + 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x44, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0a, 0x00, 0x0e, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x03, 0x00, 0x00, 0x00 +}; +const int g_model_len = 18712; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.h new file mode 100644 index 00000000..8979c20d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/model.h @@ -0,0 +1,27 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This is a standard TensorFlow Lite FlatBuffer model file that has been +// converted into a C data array, so it can be easily compiled into a binary +// for devices that don't have a file system. It was created using the command: +// xxd -i model.tflite > model.cc + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MODEL_H_ + +extern const unsigned char g_model[]; +extern const int g_model_len; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_MODEL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.cc new file mode 100644 index 00000000..8168acdc --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.cc @@ -0,0 +1,61 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.h" + +const int8_t g_no_feature_data_slice[g_no_feature_data_slice_size] = { + 89, + 68, + 96, + 83, + 111, + 96, + 115, + 87, + 99, + 76, + 105, + 84, + 105, + 86, + 113, + 91, + 108, + 87, + 110, + 78, + 80, + 46, + 22, + 74, + 88, + 72, + 103, + 86, + 80, + 68, + 48, + 24, + 68, + 48, + 55, + 36, + 108, + 90, + 90, + 63, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.h new file mode 100644 index 00000000..33598a99 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_feature_data_slice.h @@ -0,0 +1,29 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was extracted from the larger feature data held in +// no_features_data.cc and consists of the 29th spectrogram slice of 43 values. +// This is the expected result of running the sample data in +// no_30ms_sample_data.cc through the preprocessing pipeline. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_NO_FEATURE_DATA_SLICE_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_NO_FEATURE_DATA_SLICE_H_ + +#include + +constexpr int g_no_feature_data_slice_size = 40; +extern const int8_t g_no_feature_data_slice[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_NO_FEATURE_DATA_SLICE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.cc new file mode 100644 index 00000000..0b7dd40b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.cc @@ -0,0 +1,1984 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h" + +// Golden test values for the expected spectrogram from a "no" sample file +// speech_commands_test_set_v0.02/no/f9643d42_nohash_4.wav. + +const int g_no_micro_f9643d42_nohash_4_width = 40; +const int g_no_micro_f9643d42_nohash_4_height = 49; +const signed char g_no_micro_f9643d42_nohash_4_data[] = { + 103, + 78, + 64, + 76, + 75, + 54, + 53, + 67, + 77, + 60, + 56, + 70, + 76, + 71, + 68, + 58, + 74, + 32, + 23, + -2, + -18, + 11, + 13, + 15, + 9, + 20, + 5, + -7, + -18, + -2, + -10, + -18, + -10, + -12, + 9, + 7, + -33, + -12, + -4, + -18, + 57, + 17, + 55, + 62, + 70, + 45, + 61, + 37, + 67, + 52, + 48, + 47, + 55, + 46, + 57, + 47, + 73, + 17, + 27, + 20, + 19, + 8, + 15, + -6, + -1, + 10, + -12, + -29, + -6, + -23, + -18, + -3, + -1, + 5, + 3, + -4, + -12, + -8, + -1, + -14, + 65, + 48, + 58, + 43, + 48, + 19, + 39, + 39, + 57, + 57, + 58, + 55, + 67, + 58, + 49, + 50, + 70, + 27, + 9, + 16, + 37, + 4, + 25, + 4, + 11, + 9, + 7, + -33, + -7, + -12, + 3, + -6, + -29, + -7, + -7, + -18, + -12, + -18, + -2, + -1, + 0, + 31, + 60, + -8, + 51, + 59, + 70, + 40, + 71, + 57, + 52, + 38, + 66, + 48, + 17, + 6, + 59, + 8, + 15, + 7, + 18, + 4, + 18, + -23, + -8, + -4, + -3, + -12, + -3, + -26, + 1, + 10, + 2, + -29, + -29, + -37, + -7, + -4, + 6, + -33, + 67, + 44, + 59, + -4, + 64, + 51, + 68, + 55, + 74, + 9, + 40, + 15, + 57, + 33, + 60, + 18, + 40, + 25, + 27, + -20, + 25, + -16, + 6, + 17, + -10, + -12, + -23, + -43, + -23, + -23, + -29, + -37, + -4, + -16, + -16, + -60, + -20, + -23, + -10, + -29, + -12, + 15, + 12, + -37, + 27, + 15, + 61, + 44, + 50, + 8, + 48, + 22, + 49, + -18, + 46, + 33, + 42, + 34, + 46, + -8, + 4, + -18, + -43, + -43, + -10, + 1, + -10, + -16, + -10, + -77, + -16, + -33, + 11, + -26, + -23, + -37, + 0, + -8, + -16, + -29, + 42, + 40, + 68, + 24, + 47, + 46, + 53, + -128, + 30, + 2, + 42, + 21, + 21, + -4, + 43, + 2, + 43, + 5, + 32, + -26, + 7, + -37, + -43, + -23, + -2, + -8, + 2, + -37, + -50, + -60, + -1, + -7, + -33, + -77, + -6, + -18, + -16, + -50, + -12, + -33, + 53, + 8, + 52, + 18, + 51, + 35, + 69, + 26, + 44, + 8, + 27, + -128, + 21, + -33, + 17, + -14, + 38, + -128, + -14, + -18, + 17, + -20, + -14, + -37, + 8, + -60, + -33, + -33, + -33, + -43, + -12, + -29, + -12, + -128, + -33, + -60, + -26, + -77, + -26, + -50, + 57, + 29, + 11, + 30, + 53, + -10, + 45, + 15, + 18, + -10, + 42, + 2, + 31, + -29, + 10, + -4, + 42, + -37, + -50, + -128, + -4, + -43, + -20, + -77, + -14, + -26, + -33, + -128, + -12, + -43, + -8, + -33, + -33, + -60, + -43, + -77, + -12, + -60, + -26, + -50, + 40, + -23, + 36, + 35, + 50, + -2, + 37, + 27, + 26, + -77, + 49, + -7, + 28, + -43, + 6, + 11, + 41, + -37, + 33, + -26, + -14, + -12, + -6, + -33, + -16, + -26, + -20, + -77, + -14, + -43, + -8, + -50, + -14, + -37, + -26, + -77, + -26, + -77, + -14, + -29, + 50, + -60, + 25, + -26, + 57, + 38, + 51, + 1, + 50, + 1, + 53, + -18, + 30, + -23, + 11, + -128, + 18, + -43, + 20, + -26, + -10, + -26, + -12, + -128, + -50, + -60, + -37, + -77, + -20, + -43, + -50, + -128, + -77, + -128, + -77, + -128, + -33, + -77, + -20, + -60, + 53, + -10, + -37, + -128, + 10, + -128, + 60, + 18, + -8, + 13, + 37, + -37, + 8, + -128, + 3, + -77, + 32, + -29, + 14, + 10, + -12, + -77, + -37, + -77, + -37, + -60, + -23, + -128, + -43, + -50, + -16, + -77, + -6, + -33, + 0, + -60, + -43, + -128, + -16, + -60, + 20, + -2, + 51, + 19, + 43, + 2, + 63, + 20, + 60, + -4, + 42, + -50, + 4, + -128, + 2, + -3, + 32, + -33, + -26, + -128, + -18, + -128, + -33, + -43, + -7, + -60, + -50, + -77, + -29, + -77, + -23, + -128, + -16, + -26, + -23, + -60, + -37, + -77, + -37, + -128, + -1, + -33, + 39, + 48, + 60, + 5, + 8, + -128, + 44, + 11, + 4, + 0, + 13, + -77, + -2, + -20, + 33, + -128, + -33, + -77, + -8, + -128, + -14, + -128, + -33, + -18, + -12, + -77, + -16, + -128, + -37, + -128, + -12, + -77, + -60, + -128, + -23, + -60, + -23, + -128, + 36, + -50, + 46, + -128, + 66, + 39, + 18, + -14, + -12, + -77, + -20, + -6, + 24, + -128, + 28, + -26, + 21, + -77, + -6, + -33, + 1, + -128, + -43, + -128, + -1, + -50, + -37, + -128, + -50, + -128, + -33, + -128, + -18, + -128, + -60, + -8, + -7, + -60, + -60, + -128, + -6, + -29, + 20, + -1, + 73, + 40, + -43, + -14, + 33, + -43, + 33, + -3, + 15, + -29, + 29, + -43, + 20, + -60, + -29, + -128, + -20, + -26, + 4, + -77, + -16, + -60, + -33, + -50, + -29, + -128, + -60, + -128, + -77, + -128, + -37, + -50, + 0, + -77, + -33, + -128, + 39, + 8, + 47, + 10, + 62, + 16, + 2, + 1, + 10, + 7, + 4, + -7, + 6, + -128, + -77, + -50, + 19, + -77, + -77, + -128, + -77, + -128, + -50, + -128, + -60, + -60, + -33, + -50, + -37, + -128, + -128, + -128, + -60, + -128, + -37, + -60, + -18, + -128, + -33, + -77, + 37, + 23, + 29, + -128, + -128, + -128, + -16, + -128, + -16, + -33, + 21, + -20, + -8, + -60, + -2, + -60, + 11, + -128, + -50, + -128, + -50, + -128, + -29, + -77, + -16, + -128, + -26, + -128, + -50, + -77, + -43, + -128, + -128, + -128, + -50, + -128, + -33, + -128, + -33, + -50, + -23, + -128, + 24, + -128, + -128, + -77, + 4, + -23, + 32, + -128, + 1, + -26, + -14, + -128, + 10, + -77, + -4, + -128, + 1, + -50, + -8, + -77, + -77, + -77, + -23, + -128, + -50, + -43, + -33, + -128, + -43, + -128, + -128, + -128, + -43, + -128, + -50, + -128, + -128, + -128, + 44, + 15, + 14, + -128, + 9, + -128, + 21, + 0, + 29, + -7, + 18, + -7, + -7, + -128, + -33, + -50, + 14, + -60, + -60, + -128, + -60, + -128, + -37, + -128, + -43, + -128, + -20, + -128, + -50, + -128, + -43, + -77, + -26, + -128, + -60, + -50, + -60, + -128, + -77, + -128, + -3, + -128, + 14, + -77, + -26, + 11, + 47, + -77, + -7, + -77, + 45, + -43, + -12, + 14, + 37, + -60, + 22, + -4, + 5, + -77, + -14, + -128, + -10, + -60, + 22, + -77, + -12, + -60, + -50, + -128, + -60, + -128, + -60, + -128, + -43, + -128, + -50, + -128, + -77, + -50, + 27, + -37, + 33, + -128, + 4, + -29, + -4, + -50, + -20, + -128, + 6, + -37, + -33, + -128, + -50, + -128, + 34, + 15, + -43, + -128, + -20, + -50, + -3, + -37, + -37, + -77, + -77, + -128, + -43, + -128, + -128, + -128, + 4, + -26, + -26, + 27, + 0, + -128, + -29, + -60, + 35, + -26, + 23, + -128, + -29, + -77, + 19, + 14, + 28, + -128, + -16, + -7, + 31, + -1, + 17, + 11, + 60, + 44, + 8, + 11, + 18, + -128, + -33, + -60, + -1, + -128, + -43, + -128, + -23, + -128, + -128, + -128, + 59, + 43, + 35, + 61, + 37, + -77, + -77, + -50, + 116, + 88, + 98, + 69, + 78, + 53, + 78, + 40, + 48, + 7, + 29, + -18, + -2, + -14, + 5, + 12, + 65, + 35, + 31, + -12, + 33, + -2, + -6, + -1, + 44, + -29, + -14, + -60, + -4, + -43, + -37, + -128, + 29, + 18, + 38, + 51, + 8, + -128, + -12, + -37, + 115, + 91, + 113, + 77, + 89, + 36, + 60, + 44, + 49, + 36, + 27, + 31, + 63, + 30, + 62, + 14, + 55, + 49, + 42, + 0, + 45, + 17, + -23, + 1, + 30, + -37, + -50, + -77, + -8, + -60, + 9, + -60, + -12, + -50, + 13, + 4, + 23, + -6, + 28, + 13, + 107, + 78, + 101, + 73, + 89, + 46, + 63, + 17, + 34, + -43, + -6, + 30, + 67, + 40, + 77, + 21, + 53, + 39, + 38, + 12, + -6, + 5, + 28, + -2, + 18, + -43, + 0, + -128, + -29, + -77, + 18, + -128, + -2, + -77, + 39, + 35, + 38, + 35, + 50, + 29, + 100, + 70, + 94, + 69, + 86, + 50, + 45, + 38, + 45, + 12, + 58, + 64, + 74, + 36, + 77, + 45, + 78, + 62, + 8, + -60, + 38, + 6, + 21, + 7, + 8, + -37, + -1, + -20, + 48, + -37, + 8, + -10, + 8, + 13, + 45, + 39, + 38, + 22, + 49, + 25, + 94, + 63, + 87, + 66, + 84, + -128, + 29, + 20, + 55, + 51, + 80, + 36, + 62, + 30, + 81, + 72, + 68, + 37, + 51, + 27, + 54, + 22, + 16, + -29, + 4, + 9, + 57, + 15, + 35, + -43, + -77, + -20, + 4, + 6, + 37, + -1, + 40, + 31, + 47, + 14, + 89, + 68, + 96, + 83, + 111, + 96, + 115, + 87, + 99, + 76, + 105, + 84, + 105, + 86, + 113, + 91, + 108, + 87, + 110, + 78, + 80, + 46, + 22, + 74, + 88, + 72, + 103, + 86, + 80, + 68, + 48, + 24, + 68, + 48, + 55, + 36, + 108, + 90, + 90, + 63, + 83, + 63, + 87, + 64, + 90, + 92, + 113, + 88, + 102, + 79, + 109, + 83, + 100, + 89, + 109, + 60, + 56, + 21, + 75, + 62, + 81, + 45, + 63, + 73, + 93, + 65, + 94, + 80, + 89, + 81, + 73, + 3, + 43, + 60, + 102, + 70, + 84, + 67, + 99, + 74, + 78, + 57, + 79, + 50, + 93, + 82, + 98, + 56, + 77, + 70, + 91, + 71, + 85, + 82, + 86, + 13, + 45, + -18, + 48, + 40, + 53, + 28, + 85, + 60, + 65, + 52, + 86, + 78, + 76, + 46, + 73, + 19, + 35, + 54, + 75, + 40, + 71, + 60, + 82, + 37, + 69, + 42, + 62, + 40, + 96, + 70, + 85, + 77, + 70, + 68, + 103, + 84, + 94, + 69, + 81, + -128, + -128, + -128, + -43, + -37, + 40, + 2, + 48, + 45, + 76, + 37, + 65, + 16, + 43, + 18, + 58, + 20, + 27, + 12, + 71, + 31, + 53, + 44, + 88, + 47, + 50, + 33, + 39, + 8, + 89, + 57, + 88, + 69, + 72, + 63, + 100, + 68, + 81, + -77, + -10, + -128, + -128, + -128, + -128, + -128, + 13, + -77, + 8, + 27, + 60, + 28, + 41, + -128, + -37, + -128, + 28, + -43, + -18, + -128, + 47, + -37, + 45, + 27, + 51, + -29, + 15, + 39, + 52, + 30, + 49, + -33, + 65, + 15, + 76, + 71, + 90, + 19, + 46, + -128, + -16, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -18, + -128, + -20, + -128, + 32, + -128, + 21, + -33, + 45, + -128, + -128, + -128, + -12, + -128, + -6, + -14, + 43, + -128, + -128, + -128, + -128, + -128, + 52, + -18, + 69, + -43, + 78, + 55, + 42, + -128, + -29, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 14, + -128, + -16, + -128, + -128, + -128, + 7, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 12, + -128, + -128, + -128, + -128, + -16, + 59, + -50, + 35, + -128, + 42, + 0, + 47, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -33, + -128, + -23, + -128, + -128, + -128, + -23, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -33, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -8, + -128, + 36, + -50, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -37, + -128, + -128, + -60, + -10, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 21, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -12, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -128, + -128, + -29, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -29, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -50, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h new file mode 100644 index 00000000..e86826f3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h @@ -0,0 +1,23 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_NO_MICRO_FEATURES_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_NO_MICRO_FEATURES_DATA_H_ + +extern const int g_no_micro_f9643d42_nohash_4_width; +extern const int g_no_micro_f9643d42_nohash_4_height; +extern const signed char g_no_micro_f9643d42_nohash_4_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_NO_MICRO_FEATURES_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/static_alloc.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/static_alloc.h new file mode 100644 index 00000000..f64e49db --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/static_alloc.h @@ -0,0 +1,33 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_STATIC_ALLOC_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_STATIC_ALLOC_H_ + +// Checks to ensure that the C-style array passed in has a compile-time size of +// at least the number of bytes requested. This doesn't work with raw pointers +// since sizeof() doesn't know their actual length, so only use this to check +// statically-allocated arrays with known sizes. +#define STATIC_ALLOC_ENSURE_ARRAY_SIZE(A, N) \ + do { \ + if (sizeof(A) < (N)) { \ + TF_LITE_REPORT_ERROR(error_reporter, \ + #A " too small (%d bytes, wanted %d) at %s:%d", \ + sizeof(A), (N), __FILE__, __LINE__); \ + return 0; \ + } \ + } while (0) + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_STATIC_ALLOC_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.cc new file mode 100644 index 00000000..4acf4001 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.cc @@ -0,0 +1,61 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.h" + +const int8_t g_yes_feature_data_slice[g_yes_feature_data_slice_size] = { + 86, + 88, + 108, + 75, + 108, + 76, + 98, + 64, + 75, + 61, + 71, + 66, + 85, + -1, + -77, + -128, + 46, + 61, + 92, + 69, + 100, + 93, + 113, + 80, + 108, + 93, + 113, + 91, + 110, + 80, + 85, + 15, + -33, + -128, + 12, + -50, + 34, + 50, + 70, + 55, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.h new file mode 100644 index 00000000..90530283 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_feature_data_slice.h @@ -0,0 +1,29 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was extracted from the larger feature data held in +// no_micro_features_data.cc and consists of the 26th spectrogram slice of 40 +// values. This is the expected result of running the sample data in +// yes_30ms_sample_data.cc through the preprocessing pipeline. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_YES_FEATURE_DATA_SLICE_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_YES_FEATURE_DATA_SLICE_H_ + +#include + +constexpr int g_yes_feature_data_slice_size = 40; +extern const int8_t g_yes_feature_data_slice[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_YES_FEATURE_DATA_SLICE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.cc new file mode 100644 index 00000000..bb22bc7b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.cc @@ -0,0 +1,1984 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h" + +// Golden test values for the expected spectrogram from a "yes" sample file +// speech_commands_test_set_v0.02/yes/f2e59fea_nohash_1.wav. + +const int g_yes_micro_f2e59fea_nohash_1_width = 40; +const int g_yes_micro_f2e59fea_nohash_1_height = 49; +const signed char g_yes_micro_f2e59fea_nohash_1_data[] = { + 116, + 98, + 118, + 95, + 106, + 85, + 101, + 81, + 67, + -18, + -33, + -12, + -26, + -128, + 9, + 34, + 56, + 45, + 9, + -12, + 5, + 30, + 23, + 28, + 0, + -18, + 0, + -128, + -60, + -50, + -50, + -37, + -60, + -60, + -50, + -26, + -33, + -50, + -33, + -50, + 83, + 61, + 81, + 55, + 76, + 61, + 73, + 64, + 38, + -8, + -37, + -20, + -18, + -20, + 48, + 29, + 52, + 41, + 55, + 18, + 25, + 37, + 44, + 37, + 8, + 15, + -6, + -60, + -128, + -50, + -37, + -37, + -18, + -37, + -26, + -29, + -37, + -60, + -50, + -60, + 95, + 59, + 52, + -4, + 54, + -18, + 68, + 43, + 31, + -18, + -26, + -33, + -37, + -29, + 33, + 7, + -3, + 8, + 26, + 24, + 36, + 6, + 36, + 23, + 14, + 8, + -29, + -37, + -37, + -37, + -50, + -50, + -26, + -8, + -26, + -37, + -18, + -37, + -60, + -77, + 50, + 48, + 83, + 44, + 56, + -128, + -33, + -60, + 1, + -26, + -60, + -43, + -14, + -23, + -18, + -43, + -26, + -33, + 13, + -77, + -43, + -77, + -33, + -37, + 16, + -12, + -37, + -50, + -50, + -77, + -20, + -43, + -60, + -128, + -60, + -77, + -37, + -77, + -60, + -128, + 37, + -10, + 65, + -7, + 28, + -128, + 10, + -77, + -37, + -128, + -77, + -128, + -77, + -43, + -128, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -14, + -128, + -43, + -50, + -37, + -77, + -128, + -128, + -77, + -43, + -29, + -43, + -20, + -60, + -37, + -43, + -50, + -128, + -77, + -128, + -18, + -128, + -60, + -128, + -128, + -128, + -77, + -128, + -77, + -128, + -128, + -128, + -60, + -37, + -20, + -128, + -60, + -128, + -128, + -128, + -60, + -128, + -77, + -60, + -128, + -50, + -60, + -128, + -77, + -128, + -50, + -60, + -37, + -60, + -50, + -77, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -37, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -60, + -128, + -128, + -50, + -128, + -50, + -128, + -50, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -77, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -128, + -128, + -128, + -77, + -50, + -128, + -128, + -77, + -77, + -128, + -128, + -128, + -50, + -128, + 85, + 43, + 65, + 53, + 69, + 60, + 45, + 3, + 46, + -12, + 9, + -23, + 32, + -1, + -128, + -128, + -128, + -128, + -1, + 37, + 38, + 33, + 43, + 36, + 58, + 70, + 68, + 39, + 6, + 10, + 32, + 6, + 8, + -23, + -77, + -128, + -29, + -128, + -77, + -128, + 101, + 87, + 102, + 91, + 110, + 88, + 101, + 83, + 110, + 95, + 111, + 83, + 81, + 84, + 106, + 90, + 93, + 82, + 98, + 91, + 108, + 95, + 118, + 97, + 118, + 97, + 116, + 96, + 113, + 90, + 110, + 96, + 107, + 85, + 94, + 66, + 69, + 36, + 29, + 0, + 100, + 60, + 105, + 68, + 92, + 93, + 113, + 92, + 107, + 85, + 107, + 83, + 104, + 91, + 105, + 85, + 112, + 88, + 101, + 80, + 101, + 79, + 96, + 80, + 98, + 80, + 105, + 83, + 98, + 81, + 103, + 71, + 100, + 79, + 83, + 78, + 91, + 47, + 50, + 13, + 108, + 81, + 93, + 78, + 98, + 76, + 105, + 76, + 98, + 40, + 77, + 72, + 81, + 62, + 93, + 77, + 96, + 80, + 98, + 61, + 97, + 69, + 88, + 61, + 71, + 56, + 98, + 68, + 97, + 72, + 89, + 51, + 81, + 61, + 88, + 75, + 86, + 56, + 48, + 13, + 71, + 22, + 84, + 66, + 76, + -7, + 48, + 61, + 77, + 62, + 91, + 65, + 95, + 74, + 88, + 59, + 75, + 58, + 83, + 55, + 87, + 55, + 76, + 43, + 76, + -3, + 56, + 60, + 79, + 57, + 71, + 54, + 82, + 33, + 74, + 71, + 91, + 45, + 18, + -7, + 61, + 56, + 77, + 41, + 73, + 42, + 82, + 49, + 59, + 63, + 82, + 65, + 66, + 38, + 83, + 34, + 48, + -8, + 46, + 20, + 54, + 33, + 54, + 6, + 48, + 16, + 60, + 37, + 58, + 22, + 58, + 14, + 65, + 53, + 75, + -4, + 42, + 16, + 16, + -50, + 22, + -128, + 80, + 54, + 43, + -50, + 42, + -128, + -10, + -77, + 28, + -29, + 68, + 43, + 73, + 2, + 25, + -60, + 47, + 14, + 45, + 7, + 66, + 4, + 62, + 37, + 71, + 7, + 46, + -10, + 44, + 22, + 55, + 53, + 57, + -29, + 26, + -10, + -3, + -128, + 38, + -128, + 46, + -10, + 16, + -128, + -10, + -26, + 60, + -7, + 65, + 38, + 70, + -60, + 35, + -8, + 42, + -29, + 6, + -128, + 34, + -128, + 36, + -60, + 44, + -12, + -2, + -128, + -7, + -60, + -60, + -128, + -23, + -128, + 31, + -33, + 22, + -77, + -37, + -43, + -128, + -128, + 3, + -128, + -23, + -128, + 17, + -77, + 43, + -77, + -7, + -128, + -20, + -128, + 17, + -43, + 32, + -128, + -43, + -128, + -128, + -77, + 21, + -128, + -50, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -37, + -128, + -16, + -128, + -50, + -26, + -6, + -128, + -128, + -128, + -128, + -128, + -23, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -16, + -128, + 36, + -7, + 16, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -37, + -128, + -50, + -128, + -128, + -128, + -128, + -128, + -18, + -128, + 11, + -128, + -16, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -26, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -20, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -50, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -1, + -18, + 5, + -128, + 40, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 4, + -128, + 63, + 66, + 75, + -128, + 70, + 60, + 34, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 87, + 86, + 95, + 76, + 91, + 62, + 72, + -6, + -50, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 64, + 83, + 104, + 70, + 98, + 90, + 111, + 89, + 109, + 80, + 71, + -128, + -128, + -128, + -128, + -128, + -20, + -6, + 27, + 33, + 86, + 88, + 108, + 75, + 108, + 76, + 98, + 64, + 75, + 61, + 71, + 66, + 85, + -1, + -77, + -128, + 46, + 61, + 92, + 69, + 100, + 93, + 113, + 80, + 108, + 93, + 113, + 91, + 110, + 80, + 85, + 15, + -33, + -128, + 12, + -50, + 34, + 50, + 70, + 55, + 84, + 72, + 108, + 81, + 111, + 88, + 100, + 80, + 84, + 73, + 97, + 86, + 99, + 65, + 85, + 43, + 96, + 78, + 107, + 94, + 118, + 98, + 115, + 92, + 118, + 94, + 111, + 93, + 111, + 86, + 99, + 52, + 32, + -16, + 48, + 31, + 81, + 74, + 85, + 64, + 78, + 64, + 98, + 70, + 110, + 92, + 96, + 73, + 100, + 72, + 94, + 73, + 98, + 76, + 85, + 67, + 101, + 83, + 101, + 83, + 112, + 89, + 98, + 85, + 105, + 78, + 98, + 72, + 102, + 80, + 95, + 23, + 19, + -8, + 52, + 57, + 103, + 91, + 95, + 65, + 74, + 8, + 77, + 49, + 96, + 76, + 100, + 87, + 105, + 81, + 94, + 62, + 94, + 78, + 81, + 72, + 99, + 82, + 101, + 78, + 108, + 65, + 82, + 70, + 100, + 63, + 79, + 58, + 80, + 59, + 87, + 48, + 50, + 57, + 93, + 67, + 86, + 80, + 103, + 56, + 77, + 31, + 81, + 57, + 62, + 41, + 96, + 85, + 91, + 71, + 101, + 76, + 89, + 78, + 95, + 76, + 96, + 79, + 103, + 81, + 103, + 48, + 70, + 57, + 88, + 66, + 84, + 11, + 85, + 67, + 104, + 37, + 38, + 67, + 90, + 54, + 81, + 62, + 90, + 52, + 78, + -60, + 54, + -8, + 68, + 40, + 55, + 8, + 77, + 52, + 66, + 31, + 55, + 13, + 60, + 26, + 69, + 42, + 63, + -29, + 57, + -128, + -3, + -128, + 3, + -128, + -29, + -60, + 52, + -43, + 63, + 56, + 86, + 75, + 95, + 75, + 85, + 63, + 82, + 10, + 50, + -128, + 31, + -77, + 0, + -77, + -23, + -128, + 12, + -77, + 51, + -3, + 58, + -14, + 44, + 0, + 48, + 4, + 53, + 47, + 28, + -128, + -128, + -128, + -37, + -128, + -3, + -128, + 49, + 61, + 100, + 90, + 117, + 88, + 107, + 94, + 112, + 64, + 96, + 83, + -128, + -128, + 7, + -128, + -77, + -128, + -23, + -128, + -23, + -128, + 16, + -37, + 65, + -8, + 48, + 20, + 14, + -77, + 57, + -18, + -43, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 24, + 12, + 74, + 76, + 105, + 76, + 99, + 80, + 108, + 79, + 103, + 85, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 42, + -128, + -8, + -128, + -50, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -60, + -128, + -128, + 5, + 73, + 53, + 93, + 70, + 101, + 73, + 94, + 57, + 86, + 66, + -18, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -50, + -128, + 36, + -128, + -128, + -128, + -128, + -128, + -20, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 23, + 37, + 75, + 54, + 97, + 70, + 83, + 52, + 85, + 65, + 7, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -43, + -128, + 23, + -128, + -43, + -128, + -33, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -26, + -37, + 65, + 33, + 76, + 37, + 73, + 50, + 77, + 47, + -12, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -7, + -14, + -4, + -128, + -14, + -128, + 18, + -60, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -26, + -60, + 71, + 42, + 68, + 53, + 81, + 49, + 73, + 36, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -18, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 15, + -26, + 44, + -18, + 59, + 39, + 57, + 20, + 62, + 26, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + 49, + -128, + 30, + 8, + 69, + 27, + 62, + 38, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -43, + -128, + 28, + -37, + 48, + -10, + 48, + 11, + 74, + 37, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -77, + -128, + 11, + -128, + -7, + -60, + -77, + -4, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -8, + -128, + -50, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, + -128, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h new file mode 100644 index 00000000..3820f8ff --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h @@ -0,0 +1,23 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_YES_MICRO_FEATURES_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_YES_MICRO_FEATURES_DATA_H_ + +extern const int g_yes_micro_f2e59fea_nohash_1_width; +extern const int g_yes_micro_f2e59fea_nohash_1_height; +extern const signed char g_yes_micro_f2e59fea_nohash_1_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_MICRO_FEATURES_YES_MICRO_FEATURES_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_binary_mock_test.sh b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_binary_mock_test.sh new file mode 100644 index 00000000..f18b7fa2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_binary_mock_test.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Bash unit tests for the example binary. + +set -e + +OUTPUT_LOG_FILE=${TEST_TMPDIR}/output_log.txt + +# Needed for copybara compatibility. +SCRIPT_BASE_DIR=/org_"tensor"flow +${TEST_SRCDIR}${SCRIPT_BASE_DIR}/tensorflow/lite/micro/examples/micro_speech/micro_speech_mock 2>&1 | head > ${OUTPUT_LOG_FILE} + +if ! grep -q 'Heard ' ${OUTPUT_LOG_FILE}; then + echo "ERROR: Expected logs not found in output '${OUTPUT_LOG_FILE}'" + exit 1 +fi + +echo +echo "SUCCESS: micro_speech_binary_mock_test PASSED" diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_test.cc new file mode 100644 index 00000000..4dd950df --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/micro_speech_test.cc @@ -0,0 +1,149 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/model.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/no_micro_features_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/yes_micro_features_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/schema/schema_generated.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestInvoke) +{ + // Set up logging. + tflite::MicroErrorReporter micro_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + const tflite::Model *model = ::tflite::GetModel(g_model); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.\n", + model->version(), TFLITE_SCHEMA_VERSION); + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + // An easier approach is to just use the AllOpsResolver, but this will + // incur some penalty in code space for op implementations that are not + // needed by this graph. + // + // tflite::AllOpsResolver resolver; + tflite::MicroMutableOpResolver<4> micro_op_resolver; + micro_op_resolver.AddDepthwiseConv2D(); + micro_op_resolver.AddFullyConnected(); + micro_op_resolver.AddReshape(); + micro_op_resolver.AddSoftmax(); + + // Create an area of memory to use for input, output, and intermediate arrays. +#if defined(XTENSA) + constexpr int tensor_arena_size = 15 * 1024; +#else + constexpr int tensor_arena_size = 10 * 1024; +#endif + uint8_t tensor_arena[tensor_arena_size]; + + // Build an interpreter to run the model with. + tflite::MicroInterpreter interpreter(model, micro_op_resolver, tensor_arena, + tensor_arena_size, + µ_error_reporter); + interpreter.AllocateTensors(); + + // Get information about the memory area to use for the model's input. + TfLiteTensor *input = interpreter.input(0); + + // Make sure the input has the properties we expect. + TF_LITE_MICRO_EXPECT_NE(nullptr, input); + TF_LITE_MICRO_EXPECT_EQ(2, input->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(1960, input->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, input->type); + + // Copy a spectrogram created from a .wav audio file of someone saying "Yes", + // into the memory area used for the input. + const int8_t *yes_features_data = g_yes_micro_f2e59fea_nohash_1_data; + for (size_t i = 0; i < input->bytes; ++i) { + input->data.int8[i] = yes_features_data[i]; + } + + // Run the model on this input and make sure it succeeds. + TfLiteStatus invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Get the output from the model, and make sure it's the expected size and + // type. + TfLiteTensor *output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(4, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, output->type); + + // There are four possible classes in the output, each with a score. + const int kSilenceIndex = 0; + const int kUnknownIndex = 1; + const int kYesIndex = 2; + const int kNoIndex = 3; + + // Make sure that the expected "Yes" score is higher than the other classes. + uint8_t silence_score = output->data.int8[kSilenceIndex] + 128; + uint8_t unknown_score = output->data.int8[kUnknownIndex] + 128; + uint8_t yes_score = output->data.int8[kYesIndex] + 128; + uint8_t no_score = output->data.int8[kNoIndex] + 128; + TF_LITE_MICRO_EXPECT_GT(yes_score, silence_score); + TF_LITE_MICRO_EXPECT_GT(yes_score, unknown_score); + TF_LITE_MICRO_EXPECT_GT(yes_score, no_score); + + // Now test with a different input, from a recording of "No". + const int8_t *no_features_data = g_no_micro_f9643d42_nohash_4_data; + for (size_t i = 0; i < input->bytes; ++i) { + input->data.int8[i] = no_features_data[i]; + } + + // Run the model on this "No" input. + invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Get the output from the model, and make sure it's the expected size and + // type. + output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(4, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, output->type); + + // Make sure that the expected "No" score is higher than the other classes. + silence_score = output->data.int8[kSilenceIndex] + 128; + unknown_score = output->data.int8[kUnknownIndex] + 128; + yes_score = output->data.int8[kYesIndex] + 128; + no_score = output->data.int8[kNoIndex] + 128; + TF_LITE_MICRO_EXPECT_GT(no_score, silence_score); + TF_LITE_MICRO_EXPECT_GT(no_score, unknown_score); + TF_LITE_MICRO_EXPECT_GT(no_score, yes_score); + + TF_LITE_REPORT_ERROR(µ_error_reporter, "Ran successfully\n"); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.cc new file mode 100644 index 00000000..4ff45a54 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.cc @@ -0,0 +1,16022 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h" + +const int g_no_1000ms_sample_data_size = 16000; +const int16_t g_no_1000ms_sample_data[16000] = { + 5, + 1, + -10, + -16, + -14, + -10, + -4, + -5, + -10, + -15, + -13, + -17, + -22, + -21, + -23, + -25, + -22, + -26, + -28, + -31, + -28, + -25, + -20, + -24, + -21, + -13, + -7, + -1, + -1, + 3, + 3, + 4, + -4, + -6, + -8, + -10, + -13, + -4, + -2, + 5, + 8, + 11, + 26, + 28, + 34, + 32, + 34, + 30, + 21, + 18, + 15, + 13, + 8, + 5, + 14, + 13, + 7, + 8, + 4, + -5, + -7, + -4, + -9, + -13, + -17, + -21, + -16, + -14, + -12, + -12, + -14, + -11, + -9, + -2, + 5, + -1, + 2, + 0, + 2, + 1, + -3, + -13, + -14, + -16, + -11, + -10, + -9, + -13, + -17, + -19, + -25, + -21, + -21, + -20, + -13, + -5, + -3, + 0, + 3, + 6, + 5, + 1, + 0, + -1, + -7, + -10, + -11, + -9, + -6, + -7, + -11, + -10, + -5, + -14, + -20, + -23, + -22, + -22, + -19, + -15, + -12, + -6, + -5, + 3, + 13, + 16, + 17, + 25, + 26, + 28, + 34, + 34, + 33, + 34, + 30, + 21, + 22, + 18, + 13, + 20, + 22, + 24, + 27, + 26, + 23, + 21, + 18, + 9, + 5, + -2, + -7, + -8, + -10, + -8, + -8, + -4, + 2, + 2, + -1, + -7, + -10, + -8, + -12, + -13, + -15, + -9, + -5, + -4, + -3, + -6, + -11, + -11, + -18, + -16, + -13, + -10, + -12, + -6, + 0, + -2, + 0, + -3, + -4, + -8, + -12, + -19, + -16, + -17, + -19, + -23, + -30, + -33, + -36, + -38, + -39, + -40, + -36, + -37, + -32, + -27, + -25, + -31, + -38, + -41, + -47, + -52, + -50, + -42, + -32, + -16, + -7, + -3, + 0, + -1, + -1, + -5, + -16, + -23, + -29, + -34, + -33, + -27, + -17, + -11, + 1, + 4, + 10, + 18, + 21, + 24, + 24, + 25, + 30, + 34, + 30, + 29, + 26, + 23, + 20, + 15, + 14, + 13, + 14, + 16, + 23, + 28, + 21, + 23, + 21, + 13, + 12, + 12, + 14, + 17, + 21, + 26, + 27, + 30, + 30, + 26, + 20, + 15, + 15, + 9, + 8, + 9, + 10, + 7, + 8, + 7, + 1, + -2, + -6, + -10, + -10, + -12, + -15, + -10, + -7, + -6, + -5, + 0, + -3, + -3, + -12, + -25, + -35, + -49, + -53, + -49, + -51, + -48, + -46, + -48, + -39, + -33, + -31, + -37, + -42, + -47, + -49, + -46, + -47, + -47, + -46, + -42, + -39, + -33, + -26, + -23, + -14, + -8, + -9, + -7, + -10, + -11, + -13, + -13, + -19, + -20, + -16, + -11, + -9, + 7, + 16, + 21, + 29, + 27, + 29, + 28, + 21, + 14, + 13, + 17, + 19, + 20, + 18, + 13, + 17, + 16, + 18, + 20, + 17, + 13, + 16, + 23, + 26, + 26, + 25, + 27, + 31, + 30, + 31, + 34, + 32, + 35, + 32, + 36, + 31, + 26, + 23, + 27, + 27, + 29, + 27, + 26, + 32, + 31, + 28, + 26, + 23, + 14, + 6, + 0, + -4, + -7, + -9, + -10, + -8, + -3, + 4, + 12, + 11, + 15, + 11, + 8, + 2, + -3, + -3, + -4, + -6, + -11, + -14, + -20, + -28, + -32, + -38, + -46, + -42, + -44, + -40, + -34, + -26, + -29, + -25, + -23, + -24, + -17, + -21, + -26, + -23, + -25, + -19, + -10, + -11, + -10, + -10, + -12, + -9, + -3, + 0, + -3, + -7, + -10, + -13, + -10, + -14, + -13, + -17, + -22, + -22, + -30, + -28, + -29, + -26, + -18, + -6, + -1, + -3, + -4, + -6, + -10, + -13, + -10, + -14, + -16, + -11, + -15, + -9, + -3, + -6, + -1, + 2, + 3, + 4, + 6, + 6, + 3, + 4, + 12, + 14, + 17, + 21, + 19, + 20, + 16, + 17, + 15, + 21, + 21, + 22, + 20, + 17, + 16, + 16, + 20, + 17, + 15, + 9, + 5, + 11, + 18, + 24, + 28, + 26, + 23, + 23, + 26, + 22, + 18, + 21, + 23, + 26, + 27, + 25, + 27, + 29, + 26, + 20, + 10, + 7, + 11, + 8, + 16, + 25, + 33, + 37, + 38, + 39, + 35, + 30, + 20, + 13, + 9, + 6, + 5, + 13, + 13, + 14, + 15, + 12, + 8, + 3, + 3, + 3, + 2, + 9, + 11, + 10, + 5, + 5, + 0, + -7, + -11, + -12, + -15, + -17, + -12, + -13, + -18, + -19, + -21, + -24, + -22, + -27, + -34, + -36, + -36, + -32, + -20, + -16, + -15, + -5, + -5, + -9, + -10, + -9, + -17, + -19, + -20, + -14, + -13, + -10, + -4, + -7, + -7, + -14, + -19, + -28, + -31, + -30, + -31, + -23, + -19, + -20, + -12, + -11, + -14, + -16, + -20, + -18, + -20, + -21, + -24, + -29, + -30, + -30, + -34, + -31, + -25, + -21, + -18, + -11, + -4, + 2, + 2, + 3, + 3, + 2, + 4, + -1, + -4, + -8, + -3, + -1, + 7, + 15, + 18, + 22, + 20, + 20, + 16, + 16, + 14, + 13, + 21, + 25, + 26, + 35, + 28, + 28, + 28, + 25, + 21, + 19, + 18, + 21, + 24, + 20, + 25, + 28, + 19, + 16, + 15, + 8, + 3, + -1, + 3, + 5, + 13, + 18, + 25, + 31, + 33, + 39, + 36, + 36, + 32, + 36, + 37, + 39, + 42, + 36, + 32, + 27, + 30, + 24, + 18, + 15, + 10, + 7, + 5, + 6, + -1, + -4, + -10, + -17, + -15, + -19, + -15, + -7, + -4, + 3, + 0, + 3, + 4, + -2, + -7, + -13, + -21, + -23, + -28, + -27, + -26, + -25, + -15, + -10, + -4, + -6, + -5, + -9, + -5, + -3, + 1, + 2, + -1, + 1, + -4, + -7, + -8, + -17, + -17, + -15, + -14, + -9, + -5, + -7, + -6, + -9, + -16, + -15, + -15, + -16, + -16, + -11, + -15, + -15, + -6, + -6, + -5, + -2, + 0, + -9, + -10, + -12, + -13, + -10, + -4, + 0, + 8, + 5, + 4, + 2, + 0, + -5, + -8, + -16, + -15, + -12, + -3, + 9, + 17, + 24, + 26, + 30, + 28, + 22, + 17, + 14, + 9, + 8, + 9, + 8, + 11, + 12, + 12, + 15, + 14, + 18, + 20, + 17, + 19, + 22, + 21, + 12, + 5, + 0, + 3, + -3, + -4, + -6, + -7, + 1, + 8, + 8, + 8, + 10, + 2, + -3, + -8, + -15, + -20, + -24, + -22, + -23, + -13, + -6, + -7, + -5, + -10, + -8, + -15, + -19, + -22, + -20, + -17, + -18, + -13, + -10, + -1, + 6, + 5, + 3, + 1, + -5, + -11, + -10, + -14, + -19, + -15, + -13, + -8, + -2, + -3, + -4, + -3, + -4, + -1, + 1, + 0, + -3, + -4, + -8, + -18, + -21, + -25, + -24, + -16, + -9, + -2, + 1, + 5, + 1, + 3, + -2, + -7, + -10, + -23, + -30, + -29, + -23, + -9, + -3, + 4, + 11, + 11, + 6, + 2, + 0, + -12, + -20, + -28, + -24, + -22, + -17, + -22, + -19, + -14, + -21, + -17, + -17, + -12, + -8, + -3, + 2, + 0, + -6, + -5, + -8, + -12, + -17, + -27, + -34, + -31, + -30, + -27, + -19, + -14, + -14, + -14, + -14, + -19, + -22, + -21, + -19, + -14, + -1, + 5, + 9, + 8, + 6, + 5, + -4, + -2, + -3, + -3, + -1, + -2, + -3, + 2, + 7, + 8, + 7, + 6, + 6, + 3, + 2, + 1, + -2, + 0, + 6, + 11, + 18, + 18, + 19, + 17, + 14, + 9, + 4, + 3, + 3, + 0, + -1, + 3, + -1, + -5, + 0, + -2, + 0, + 1, + 7, + 7, + 8, + 20, + 29, + 33, + 31, + 24, + 14, + 5, + -6, + -11, + -8, + -11, + -2, + 6, + 10, + 12, + 16, + 26, + 26, + 24, + 18, + 12, + 10, + 4, + 7, + 6, + -2, + -12, + -17, + -17, + -20, + -23, + -23, + -18, + -8, + 1, + 3, + 5, + 6, + 3, + 0, + -6, + -12, + -12, + -15, + -12, + -7, + 3, + 3, + 8, + 7, + 7, + 7, + 1, + -1, + -1, + 4, + 11, + 17, + 25, + 32, + 35, + 42, + 50, + 52, + 56, + 50, + 55, + 53, + 52, + 47, + 40, + 38, + 30, + 26, + 27, + 28, + 29, + 25, + 23, + 23, + 28, + 30, + 25, + 26, + 21, + 19, + 14, + 9, + 16, + 22, + 25, + 33, + 39, + 45, + 49, + 48, + 55, + 51, + 43, + 35, + 20, + 14, + 13, + 23, + 25, + 24, + 20, + 22, + 28, + 22, + 22, + 17, + 16, + 13, + 10, + 10, + 10, + 9, + 9, + 14, + 11, + 10, + 10, + 4, + 0, + 0, + -2, + -3, + -5, + -7, + -3, + 1, + -8, + -8, + -9, + -4, + 4, + 9, + 11, + 14, + 11, + 6, + 8, + 3, + -6, + -10, + -19, + -22, + -24, + -27, + -22, + -16, + -21, + -25, + -33, + -33, + -32, + -30, + -21, + -13, + -6, + -5, + 2, + 1, + 4, + 9, + 7, + 5, + 1, + 1, + 8, + 6, + 7, + 6, + 0, + -6, + -15, + -18, + -23, + -22, + -23, + -25, + -22, + -21, + -19, + -17, + -13, + -10, + -10, + -16, + -17, + -15, + -13, + -8, + -9, + -14, + -13, + -17, + -20, + -26, + -28, + -31, + -29, + -26, + -23, + -13, + -10, + -6, + -1, + 5, + 7, + 2, + -3, + -7, + -20, + -18, + -16, + -21, + -27, + -33, + -25, + -27, + -22, + -22, + -21, + -16, + -11, + -7, + -2, + 2, + 11, + 18, + 11, + 9, + 4, + 1, + -1, + -6, + -4, + -5, + -9, + -12, + -16, + -25, + -29, + -37, + -37, + -38, + -37, + -33, + -23, + -16, + -14, + -7, + -1, + -4, + -3, + -4, + -5, + -11, + -14, + -8, + -8, + -8, + -8, + -9, + -4, + -14, + -21, + -22, + -21, + -18, + -15, + -2, + 3, + -3, + 0, + -2, + 0, + -4, + -7, + -1, + -2, + 3, + 3, + -3, + -10, + -13, + -10, + -16, + -19, + -17, + -17, + -14, + -7, + 5, + 5, + 7, + 8, + 12, + 7, + 0, + -5, + -13, + -17, + -18, + -14, + -7, + -4, + 3, + 11, + 11, + 12, + 11, + 8, + 4, + -5, + -5, + -11, + -15, + -17, + -23, + -22, + -18, + -14, + -14, + -12, + -6, + -4, + -1, + 3, + 1, + -4, + -10, + -22, + -29, + -30, + -26, + -15, + -2, + 6, + 16, + 21, + 28, + 32, + 25, + 24, + 20, + 9, + 5, + 0, + 3, + 7, + 10, + 11, + 13, + 17, + 15, + 16, + 13, + 11, + 11, + 8, + 7, + 1, + 1, + -5, + -2, + -2, + -1, + 4, + 8, + 17, + 22, + 24, + 24, + 26, + 23, + 20, + 17, + 16, + 9, + 4, + 6, + 5, + 8, + 2, + -1, + -5, + -4, + -10, + -14, + -14, + -17, + -19, + -18, + -16, + -14, + -6, + -3, + 1, + 3, + 0, + -4, + -6, + -4, + -1, + -1, + 2, + 5, + 3, + 8, + 7, + 7, + 14, + 13, + 20, + 24, + 29, + 24, + 12, + 7, + -1, + -6, + -15, + -22, + -20, + -27, + -22, + -14, + -6, + 2, + 7, + 9, + 9, + 2, + -3, + -7, + -8, + -10, + -9, + -3, + -6, + -11, + -12, + -8, + -5, + -4, + -5, + -3, + 0, + 3, + 6, + 6, + 7, + 5, + -7, + -10, + -14, + -13, + -14, + -17, + -11, + -7, + -4, + 1, + 1, + 4, + -4, + -8, + -18, + -23, + -23, + -25, + -19, + -16, + -15, + -9, + 3, + 10, + 19, + 25, + 30, + 31, + 26, + 27, + 23, + 19, + 16, + 8, + 7, + 2, + 0, + -1, + -1, + 1, + 5, + 6, + 6, + 1, + 3, + -1, + -7, + -11, + -17, + -19, + -19, + -7, + 0, + 3, + 11, + 12, + 18, + 20, + 16, + 9, + -2, + -7, + -14, + -19, + -22, + -30, + -33, + -34, + -36, + -26, + -14, + -11, + -9, + -3, + 0, + -2, + 1, + -2, + -3, + -5, + -12, + -15, + -19, + -14, + -9, + -8, + -2, + -6, + -13, + -15, + -19, + -22, + -25, + -26, + -21, + -20, + -11, + -1, + 1, + 5, + 9, + 13, + 15, + 12, + 11, + 3, + 1, + -1, + 0, + 8, + 13, + 16, + 16, + 15, + 16, + 15, + 12, + 9, + 7, + 8, + 4, + 6, + 4, + 3, + 3, + 7, + 0, + -4, + -8, + -11, + -18, + -18, + -15, + -20, + -23, + -21, + -22, + -21, + -27, + -25, + -15, + -7, + -2, + 8, + 9, + 8, + 8, + 3, + 3, + 7, + 8, + 8, + 8, + 12, + 11, + 12, + 4, + -1, + -7, + -11, + -15, + -18, + -17, + -17, + -20, + -19, + -13, + -11, + -3, + -3, + -1, + 1, + -3, + 1, + 1, + 8, + 10, + 15, + 24, + 26, + 29, + 34, + 36, + 26, + 20, + 12, + -2, + -6, + -9, + -7, + -6, + 1, + 10, + 13, + 19, + 22, + 22, + 18, + 21, + 24, + 28, + 35, + 37, + 34, + 33, + 34, + 34, + 30, + 19, + 15, + 10, + 19, + 21, + 23, + 24, + 21, + 19, + 18, + 21, + 22, + 22, + 27, + 30, + 31, + 32, + 33, + 32, + 32, + 24, + 18, + 10, + 8, + 10, + 10, + 6, + 2, + -7, + -14, + -22, + -29, + -27, + -29, + -32, + -30, + -28, + -23, + -22, + -11, + -11, + -13, + -3, + 2, + -1, + 1, + 1, + -3, + -7, + -5, + -7, + -11, + -17, + -23, + -25, + -26, + -27, + -26, + -23, + -14, + -5, + -3, + -1, + -2, + -2, + -1, + 1, + -2, + -7, + -4, + 2, + 4, + 10, + 13, + 6, + 3, + -2, + -6, + -7, + -11, + -17, + -21, + -15, + -7, + -2, + 11, + 16, + 22, + 25, + 25, + 23, + 24, + 23, + 21, + 22, + 25, + 23, + 17, + 17, + 12, + 8, + -2, + -4, + 1, + 0, + 4, + 9, + 8, + 10, + 9, + 9, + 15, + 13, + 10, + 8, + 1, + 1, + -3, + 1, + 4, + 11, + 10, + 9, + 5, + 5, + 4, + 1, + -1, + -4, + 0, + 8, + 7, + 4, + 3, + 3, + 0, + -9, + -16, + -19, + -20, + -21, + -18, + -16, + -11, + -10, + -9, + -13, + -12, + -19, + -25, + -21, + -15, + -5, + 8, + 14, + 21, + 24, + 18, + 20, + 17, + 6, + 1, + -2, + -2, + 1, + 1, + 4, + 1, + -3, + 2, + 0, + -3, + -3, + -4, + 1, + 0, + -5, + -11, + -17, + -21, + -20, + -20, + -20, + -14, + -9, + -3, + 3, + 7, + 5, + 3, + 1, + -1, + -3, + -4, + -1, + 1, + -5, + -1, + -1, + -7, + -11, + -14, + -12, + -14, + -17, + -18, + -23, + -29, + -24, + -27, + -19, + -12, + -13, + -2, + -3, + 4, + 4, + 0, + -3, + -5, + -2, + -1, + -5, + -6, + -7, + -7, + -7, + -9, + -13, + -9, + -4, + 1, + 1, + 1, + -4, + -11, + -8, + -15, + -19, + -19, + -12, + -5, + 1, + 7, + 12, + 8, + 10, + 10, + 10, + 11, + 11, + 19, + 12, + 9, + 9, + 2, + -4, + -13, + -22, + -24, + -25, + -24, + -26, + -19, + -14, + -10, + -1, + 5, + 4, + -1, + -4, + -5, + -10, + -14, + -11, + -8, + -10, + -8, + -9, + -7, + -8, + -6, + -1, + -5, + -10, + -18, + -27, + -29, + -24, + -19, + -11, + -7, + 1, + 10, + 8, + 8, + 5, + 2, + -5, + -1, + -1, + 0, + 2, + 2, + -2, + -8, + -8, + -14, + -26, + -25, + -23, + -18, + -9, + 2, + 2, + 7, + 13, + 6, + 7, + 5, + 4, + 3, + 2, + 1, + 7, + 2, + -1, + 1, + -2, + 2, + 0, + -2, + -6, + -3, + 5, + 7, + 9, + 6, + 5, + 4, + 2, + 0, + -1, + -3, + 3, + 7, + 6, + 14, + 18, + 22, + 20, + 22, + 19, + 13, + 9, + 2, + -8, + -11, + -6, + -2, + -3, + -3, + 0, + 0, + 0, + 1, + -1, + -2, + 1, + 7, + 11, + 10, + 11, + 17, + 17, + 11, + 11, + 4, + 6, + 6, + 13, + 19, + 22, + 23, + 27, + 25, + 24, + 22, + 14, + 11, + 13, + 7, + 0, + -3, + -9, + -11, + -7, + -7, + -6, + -4, + 1, + 7, + 9, + 15, + 18, + 18, + 10, + 5, + 3, + -3, + -6, + -5, + -8, + -5, + 4, + 8, + 8, + 11, + 10, + 9, + 4, + 4, + 1, + -3, + -10, + -11, + -8, + -16, + -20, + -22, + -19, + -12, + -7, + -10, + -10, + -13, + -14, + -11, + -11, + -13, + -18, + -21, + -19, + -17, + -22, + -18, + -22, + -22, + -16, + -9, + -3, + 0, + 3, + 6, + 3, + 3, + -3, + -6, + -9, + -14, + -1, + 14, + 21, + 30, + 37, + 33, + 27, + 26, + 19, + 15, + 14, + 11, + 20, + 12, + 9, + 10, + 19, + 20, + 19, + 22, + 20, + 22, + 17, + 13, + 14, + 10, + 8, + 12, + 15, + 13, + 12, + 12, + 12, + 9, + 10, + 11, + 11, + 9, + 6, + 4, + 5, + -2, + 1, + 1, + -1, + 5, + 1, + 8, + 6, + 3, + -1, + -4, + -15, + -24, + -27, + -26, + -23, + -19, + -9, + -3, + -4, + -9, + -9, + -10, + -16, + -22, + -19, + -18, + -15, + -2, + 3, + 5, + 6, + 7, + 8, + 11, + 3, + 1, + 2, + 1, + 1, + 0, + -4, + -13, + -18, + -19, + -19, + -20, + -23, + -15, + -10, + -5, + -3, + -1, + -1, + -1, + 3, + -1, + 0, + -8, + -11, + -13, + -14, + -13, + -8, + -6, + -3, + 1, + 1, + 0, + 0, + 5, + 4, + 5, + 5, + 5, + 4, + 0, + -1, + -4, + -13, + -22, + -21, + -28, + -26, + -22, + -28, + -23, + -23, + -14, + -11, + -10, + -7, + -8, + -5, + -4, + 1, + 9, + 10, + 15, + 19, + 21, + 17, + 18, + 19, + 16, + 13, + 16, + 21, + 27, + 29, + 22, + 22, + 13, + 4, + 1, + 0, + -5, + -6, + -2, + 3, + 5, + 8, + 6, + 9, + 10, + 2, + -3, + -9, + -8, + -4, + -2, + -7, + -6, + -4, + -8, + -6, + -8, + -11, + -8, + -8, + -6, + 2, + -2, + -2, + -1, + 2, + 4, + 8, + 5, + -1, + -8, + -10, + -7, + -6, + -5, + -6, + -5, + 6, + 13, + 22, + 28, + 33, + 31, + 38, + 35, + 28, + 27, + 22, + 22, + 23, + 26, + 23, + 21, + 28, + 28, + 23, + 23, + 22, + 21, + 20, + 14, + 6, + -1, + -5, + -8, + -5, + -1, + 2, + 5, + 5, + 7, + 8, + 5, + 4, + 0, + 3, + 6, + 10, + 13, + 13, + 6, + 4, + 4, + 0, + -2, + -3, + 0, + 3, + 5, + 7, + 9, + 7, + 6, + 10, + 8, + 3, + 4, + -1, + -4, + -2, + 0, + -2, + -2, + -2, + -3, + 5, + 8, + 6, + 4, + -1, + -7, + -6, + -7, + -12, + -18, + -11, + -2, + -1, + -1, + -1, + -2, + -7, + -7, + -3, + -3, + -5, + -6, + -6, + -6, + -6, + -6, + -9, + -12, + -9, + -5, + 1, + 3, + 5, + 5, + 8, + 7, + 3, + -5, + -3, + -2, + 2, + 3, + 5, + 5, + -1, + -2, + -4, + -8, + -9, + -9, + -7, + -12, + -13, + -17, + -19, + -16, + -19, + -21, + -21, + -19, + -11, + -6, + -3, + 7, + 8, + 6, + 2, + 0, + 1, + 1, + -2, + -5, + 0, + -2, + 2, + 1, + 2, + 0, + -2, + -1, + -10, + -21, + -25, + -24, + -21, + -19, + -14, + -8, + -3, + -5, + 0, + 0, + -5, + -6, + -3, + -6, + -9, + -13, + -19, + -20, + -21, + -21, + -24, + -25, + -27, + -27, + -29, + -26, + -19, + -14, + -14, + -13, + -8, + -5, + -10, + -10, + -6, + 1, + 4, + 14, + 22, + 23, + 24, + 20, + 20, + 18, + 14, + 11, + 9, + 6, + 8, + 12, + 15, + 18, + 18, + 12, + 8, + 9, + 9, + 9, + 7, + 4, + 9, + 5, + 6, + 5, + 3, + 3, + -1, + -1, + -6, + -10, + -6, + -8, + -3, + 0, + -2, + -3, + -2, + -6, + -6, + -7, + -3, + -3, + -3, + -2, + 1, + -1, + -10, + -7, + -13, + -21, + -23, + -20, + -19, + -18, + -18, + -19, + -15, + -16, + -7, + -6, + -9, + -13, + -12, + -6, + -1, + 3, + 6, + 7, + 5, + 3, + -3, + -11, + -18, + -20, + -26, + -29, + -27, + -27, + -24, + -30, + -29, + -28, + -23, + -18, + -21, + -18, + -15, + -9, + 1, + 9, + 17, + 21, + 23, + 18, + 14, + 5, + -1, + -2, + -1, + 0, + 3, + 6, + 5, + 4, + 4, + 0, + -1, + 1, + -4, + -9, + -13, + -11, + -20, + -21, + -19, + -14, + -9, + -4, + 1, + 6, + 10, + 16, + 24, + 30, + 35, + 31, + 38, + 37, + 35, + 39, + 36, + 36, + 32, + 30, + 33, + 31, + 24, + 19, + 12, + 4, + -1, + -7, + -11, + -7, + -5, + -3, + 2, + 6, + 10, + 16, + 19, + 21, + 21, + 16, + 10, + 14, + 12, + 14, + 13, + 12, + 12, + 5, + 6, + 2, + 0, + 1, + 3, + 4, + 6, + 9, + 6, + 2, + -1, + -3, + -10, + -15, + -13, + -17, + -19, + -15, + -16, + -15, + -13, + -8, + -8, + -7, + -10, + -5, + -2, + 1, + 5, + 5, + 11, + 10, + 12, + 10, + 9, + 9, + 15, + 23, + 33, + 35, + 33, + 34, + 34, + 35, + 34, + 24, + 30, + 26, + 23, + 21, + 20, + 15, + 10, + 3, + 4, + 0, + -7, + -8, + -9, + -9, + -8, + -4, + 0, + 5, + 5, + 2, + 3, + -2, + 0, + 0, + -1, + 0, + -1, + 1, + 2, + 6, + 3, + 1, + -9, + -5, + -6, + -2, + -8, + -12, + -9, + -10, + -7, + -8, + -8, + -6, + -2, + -2, + -1, + 0, + -2, + -1, + -8, + -18, + -19, + -27, + -37, + -42, + -40, + -39, + -33, + -30, + -23, + -16, + -16, + -9, + -13, + -11, + -10, + -10, + -8, + -3, + -1, + 2, + 0, + -1, + 2, + 6, + 4, + 8, + 10, + 17, + 21, + 28, + 31, + 33, + 28, + 20, + 12, + 8, + -3, + -5, + -4, + -3, + 2, + 6, + 9, + 8, + 2, + 7, + 4, + -6, + -9, + -15, + -13, + -15, + -17, + -14, + -11, + -12, + -5, + -6, + -4, + -6, + -11, + -11, + -7, + -4, + -6, + -8, + -13, + -10, + -7, + -12, + -11, + -12, + -13, + -12, + -9, + -9, + -10, + -10, + -6, + -8, + -8, + -7, + -9, + -9, + -7, + 2, + 5, + 5, + 6, + 3, + 4, + 6, + 3, + -1, + -2, + -2, + -2, + 1, + 5, + 3, + 4, + 2, + -2, + -7, + -9, + -13, + -11, + -8, + 2, + 12, + 23, + 31, + 37, + 41, + 40, + 37, + 36, + 31, + 31, + 27, + 28, + 24, + 13, + 16, + 14, + 15, + 9, + 4, + 4, + 5, + 4, + 7, + 12, + 16, + 14, + 11, + 13, + 6, + -2, + -4, + -1, + -3, + 3, + 6, + 6, + 9, + 7, + 9, + 7, + 5, + 0, + 1, + -1, + -2, + -4, + -1, + 0, + 0, + -4, + 0, + -4, + -9, + -15, + -16, + -18, + -15, + -10, + -6, + -8, + -5, + -2, + -2, + 0, + 4, + 7, + 0, + -2, + -3, + 4, + 3, + 2, + -1, + -3, + -8, + -19, + -19, + -19, + -16, + -8, + -5, + 0, + 1, + 2, + 1, + -1, + -2, + -10, + -12, + -10, + -4, + 3, + 4, + 2, + 7, + 8, + 4, + 1, + -5, + -5, + -4, + -1, + 9, + 10, + 12, + 15, + 15, + 14, + 11, + 20, + 16, + 19, + 18, + 26, + 29, + 21, + 23, + 16, + 16, + 3, + -3, + -4, + -10, + -12, + -10, + -6, + -7, + -12, + -17, + -14, + -16, + -19, + -13, + -10, + -13, + -13, + -2, + 2, + 3, + 7, + 13, + 22, + 21, + 21, + 21, + 24, + 27, + 23, + 22, + 20, + 17, + 17, + 16, + 13, + 11, + 5, + 1, + 1, + 5, + 5, + 3, + 2, + -1, + 2, + -5, + -6, + -3, + -11, + -9, + -6, + -5, + -10, + -4, + -1, + 1, + 2, + -1, + -4, + -4, + -9, + -9, + -7, + -3, + 3, + -2, + 1, + 1, + 4, + -4, + -8, + -8, + -17, + -17, + -13, + -13, + -18, + -18, + -25, + -27, + -21, + -22, + -18, + -7, + -1, + 5, + 9, + 11, + 11, + 11, + 15, + 11, + 4, + 1, + 6, + 8, + 17, + 12, + 10, + 5, + -2, + -3, + -14, + -17, + -25, + -26, + -22, + -20, + -13, + -12, + -12, + -13, + -10, + -4, + -6, + -6, + -4, + -6, + -4, + 0, + -3, + -7, + -7, + -10, + -17, + -14, + -9, + -3, + 4, + 4, + 6, + 1, + 0, + 0, + -6, + -3, + -4, + -3, + -6, + -9, + -9, + -5, + 0, + 1, + 2, + -2, + 3, + -1, + -4, + -5, + -11, + -14, + -17, + -14, + -12, + -14, + -19, + -21, + -25, + -35, + -40, + -39, + -31, + -24, + -13, + -4, + -1, + 0, + 0, + 2, + -2, + -5, + -8, + -8, + -9, + -6, + -2, + 0, + -5, + -6, + 2, + 5, + 4, + 1, + 6, + 8, + 9, + 14, + 13, + 19, + 15, + 19, + 13, + 14, + 20, + 16, + 16, + 14, + 14, + 17, + 13, + 12, + 11, + 6, + -1, + -7, + -9, + -10, + -11, + -2, + 8, + 12, + 12, + 12, + 8, + 4, + 1, + -3, + -4, + -4, + -3, + 1, + 9, + 14, + 16, + 10, + 12, + 9, + 6, + 4, + -1, + 8, + 6, + 3, + 6, + 1, + -11, + -10, + -10, + -13, + -9, + -6, + -2, + -2, + 9, + 13, + 17, + 17, + 19, + 17, + 16, + 9, + -2, + -5, + -5, + -3, + -9, + -8, + -8, + -12, + -17, + -16, + -18, + -15, + -9, + -7, + 1, + 10, + 17, + 18, + 23, + 25, + 23, + 20, + 15, + 17, + 18, + 23, + 33, + 40, + 43, + 45, + 51, + 53, + 47, + 36, + 27, + 10, + 5, + 1, + 4, + 5, + 4, + 0, + 0, + 6, + 7, + 8, + 9, + 3, + 2, + 1, + 0, + -1, + 3, + 5, + 5, + 13, + 7, + 4, + 4, + 3, + 11, + 17, + 21, + 31, + 31, + 31, + 31, + 28, + 26, + 23, + 19, + 16, + 17, + 16, + 10, + 10, + 12, + 9, + 7, + -1, + -7, + -12, + -15, + -15, + -15, + -13, + -13, + -16, + -19, + -19, + -23, + -31, + -34, + -38, + -39, + -31, + -30, + -21, + -21, + -18, + -11, + -16, + -20, + -25, + -22, + -18, + -14, + -7, + -8, + -3, + 2, + 10, + 13, + 12, + 10, + 6, + 2, + 0, + 0, + 0, + -6, + -4, + -1, + 0, + 0, + -1, + -2, + 1, + 3, + 8, + 9, + 3, + 6, + 2, + -4, + -2, + -3, + -7, + -4, + -3, + 2, + 6, + 8, + 10, + 12, + 15, + 11, + 15, + 12, + 13, + 14, + 15, + 18, + 14, + 8, + 4, + 4, + 3, + -4, + -5, + -4, + -2, + -3, + -2, + 4, + 9, + 13, + 18, + 21, + 20, + 18, + 15, + 11, + 6, + 7, + 10, + 8, + 6, + 3, + -3, + -7, + -14, + -21, + -29, + -33, + -32, + -26, + -17, + -12, + -11, + -9, + -3, + -10, + -13, + -18, + -23, + -21, + -26, + -26, + -24, + -28, + -25, + -29, + -30, + -30, + -27, + -17, + -7, + 2, + 10, + 13, + 16, + 16, + 17, + 18, + 17, + 19, + 19, + 20, + 15, + 14, + 16, + 14, + 10, + 5, + 0, + -4, + -18, + -21, + -25, + -20, + -16, + -13, + -8, + -5, + 2, + 6, + 11, + 12, + 18, + 16, + 18, + 15, + 13, + 17, + 18, + 22, + 21, + 25, + 26, + 25, + 26, + 28, + 31, + 27, + 20, + 10, + 3, + -6, + -10, + -16, + -19, + -18, + -15, + -13, + -10, + -2, + 0, + 2, + 4, + 3, + 5, + -1, + 0, + 1, + 2, + 0, + -2, + -1, + -6, + -5, + -7, + -12, + -10, + -9, + -4, + -1, + 3, + 4, + 2, + 4, + 4, + 3, + -3, + -6, + -11, + -14, + -15, + -23, + -25, + -29, + -30, + -28, + -25, + -22, + -19, + -21, + -19, + -11, + -7, + -7, + -3, + -3, + -6, + -8, + -13, + -10, + -10, + -5, + 1, + 4, + 9, + 7, + 6, + 6, + 4, + -5, + -11, + -8, + -6, + -3, + 0, + 3, + 7, + 11, + 7, + 3, + 5, + 6, + 10, + 12, + 14, + 16, + 8, + 5, + -1, + -1, + 4, + 0, + 0, + -3, + -5, + -5, + -4, + -2, + -2, + 1, + 4, + 7, + 5, + 10, + 9, + 6, + 9, + 12, + 19, + 28, + 32, + 32, + 33, + 31, + 29, + 20, + 17, + 16, + 14, + 15, + 6, + -2, + -5, + -7, + -10, + -10, + -11, + -9, + -6, + -3, + 8, + 10, + 10, + 10, + 12, + 12, + 7, + 7, + 5, + 3, + 2, + 2, + -2, + -5, + -4, + -7, + -2, + -6, + -5, + -6, + -11, + -14, + -13, + -10, + -11, + -15, + -16, + -11, + -11, + -11, + -10, + -16, + -15, + -15, + -16, + -10, + -11, + -11, + -5, + -1, + 2, + 1, + 2, + 0, + 1, + 4, + 8, + 5, + -4, + -2, + -4, + -12, + -18, + -24, + -20, + -25, + -14, + -3, + 4, + 11, + 13, + 13, + 7, + 4, + -4, + -9, + -13, + -17, + -10, + -6, + -1, + 0, + 2, + 2, + -1, + 1, + -8, + -18, + -22, + -19, + -19, + -22, + -20, + -22, + -20, + -17, + -12, + -9, + -4, + 3, + 9, + 9, + 9, + 7, + 6, + 13, + 10, + 11, + 8, + 4, + -1, + 5, + 7, + 7, + 8, + 4, + 2, + 2, + -2, + -8, + -11, + -16, + -18, + -12, + -12, + -9, + -2, + 3, + 3, + 5, + 5, + 6, + 9, + 11, + 20, + 22, + 26, + 30, + 28, + 22, + 15, + 15, + 10, + 11, + 9, + 6, + 9, + 9, + 11, + 10, + 12, + 10, + 8, + 8, + 7, + 9, + 4, + 3, + 9, + 5, + 1, + 2, + 0, + -3, + -3, + 0, + 3, + 0, + -2, + 1, + 4, + 6, + 4, + 0, + 1, + -4, + -13, + -13, + -11, + -20, + -21, + -15, + -17, + -23, + -22, + -24, + -29, + -24, + -29, + -32, + -21, + -13, + -11, + -9, + -9, + -8, + -13, + -11, + -11, + -11, + -11, + -17, + -17, + -21, + -23, + -27, + -32, + -33, + -32, + -31, + -35, + -31, + -26, + -24, + -18, + -10, + -1, + 5, + 13, + 17, + 15, + 13, + 8, + 4, + 6, + 9, + 10, + 13, + 11, + 12, + 13, + 9, + 5, + 6, + 8, + 12, + 21, + 25, + 24, + 23, + 16, + 8, + 7, + 0, + -3, + -8, + -9, + -2, + 1, + 11, + 18, + 25, + 30, + 31, + 27, + 21, + 19, + 19, + 18, + 18, + 22, + 24, + 16, + 14, + 8, + 2, + -4, + -9, + -7, + -10, + -6, + -8, + -8, + -13, + -14, + -11, + -13, + -8, + -7, + 6, + 9, + 10, + 15, + 17, + 11, + 11, + 9, + 2, + 2, + -2, + 2, + -6, + -6, + -7, + -14, + -11, + -12, + -13, + -17, + -22, + -25, + -30, + -24, + -16, + -4, + 5, + 2, + 7, + 5, + 2, + -1, + 1, + -4, + -4, + 4, + 8, + 8, + 5, + 6, + 6, + 2, + 1, + -2, + -9, + -14, + -17, + -16, + -15, + -14, + -12, + -11, + -6, + -6, + -2, + -3, + -3, + 6, + 13, + 18, + 27, + 27, + 26, + 24, + 22, + 19, + 18, + 19, + 12, + 8, + 7, + -2, + 0, + -6, + -8, + -6, + -4, + -6, + -14, + -16, + -16, + -15, + -12, + -2, + 6, + 12, + 16, + 18, + 14, + 16, + 13, + 12, + 17, + 16, + 17, + 17, + 12, + 13, + 10, + 14, + 14, + 10, + 2, + -1, + -3, + -5, + -10, + -15, + -13, + -20, + -21, + -21, + -21, + -19, + -20, + -18, + -8, + -4, + -1, + -1, + 4, + 2, + -3, + 0, + -5, + -5, + -3, + -1, + 0, + 6, + 5, + 6, + 7, + 7, + 3, + 2, + 1, + -5, + -3, + 0, + 3, + 5, + 7, + 4, + 10, + 15, + 15, + 11, + 6, + 8, + 9, + 14, + 19, + 18, + 14, + 12, + 16, + 15, + 11, + 9, + 9, + 5, + 4, + 0, + -7, + -12, + -18, + -22, + -29, + -32, + -36, + -37, + -38, + -39, + -32, + -24, + -20, + -14, + -10, + -2, + 0, + 1, + 9, + 13, + 21, + 26, + 31, + 35, + 40, + 38, + 32, + 33, + 25, + 14, + 11, + 7, + 1, + -1, + -6, + -5, + -11, + -20, + -22, + -19, + -16, + -9, + 2, + 9, + 14, + 14, + 13, + 13, + 12, + 10, + 3, + 2, + 1, + 0, + 6, + 5, + -1, + -4, + -13, + -17, + -21, + -25, + -29, + -30, + -23, + -14, + -4, + 4, + 11, + 11, + 12, + 13, + 13, + 5, + 6, + 6, + 7, + 5, + 5, + 9, + -2, + 3, + 0, + -2, + -3, + -5, + -1, + 3, + 9, + 16, + 18, + 17, + 17, + 11, + 5, + 1, + -4, + -13, + -12, + -7, + -7, + 1, + 6, + 4, + 2, + 3, + 1, + 1, + 0, + -1, + -5, + -5, + -3, + -5, + -1, + 8, + 9, + 7, + 12, + 7, + 6, + 4, + 3, + -1, + -1, + -4, + -14, + -16, + -18, + -24, + -34, + -44, + -37, + -37, + -36, + -28, + -19, + -15, + -6, + -2, + -3, + 2, + 5, + 6, + 3, + 6, + 6, + 9, + 7, + 3, + -4, + -15, + -25, + -34, + -37, + -41, + -41, + -38, + -33, + -27, + -22, + -14, + -15, + -18, + -18, + -15, + -8, + -7, + -2, + 2, + 0, + 4, + 12, + 13, + 10, + 17, + 20, + 16, + 17, + 23, + 24, + 22, + 24, + 22, + 28, + 26, + 24, + 22, + 26, + 28, + 27, + 23, + 17, + 10, + 4, + 4, + 1, + -1, + 0, + 4, + 9, + 15, + 14, + 15, + 14, + 14, + 13, + 8, + 0, + -1, + -11, + -13, + -4, + -3, + -5, + -3, + -1, + -6, + -5, + -7, + -4, + -2, + 2, + 7, + 15, + 20, + 14, + 13, + 8, + 2, + -6, + -15, + -23, + -25, + -20, + -22, + -20, + -14, + -10, + -4, + -2, + 1, + -10, + -15, + -12, + -8, + -8, + -7, + -5, + -10, + -12, + -20, + -28, + -26, + -24, + -16, + -8, + -5, + 3, + 8, + 9, + 12, + 12, + 12, + 14, + 13, + 12, + 10, + 13, + 23, + 29, + 28, + 33, + 36, + 32, + 28, + 23, + 25, + 26, + 30, + 34, + 27, + 22, + 16, + 12, + 3, + -6, + -13, + -13, + -15, + -14, + -9, + -11, + -13, + -13, + -16, + -15, + -20, + -22, + -20, + -32, + -30, + -29, + -24, + -18, + -18, + -18, + -13, + -15, + -15, + -16, + -17, + -10, + -11, + -12, + -15, + -17, + -17, + -19, + -21, + -22, + -26, + -28, + -21, + -18, + -14, + -5, + 2, + 6, + 7, + 5, + 3, + -2, + 0, + -4, + -2, + -3, + -6, + -9, + -12, + -11, + -11, + -19, + -23, + -20, + -21, + -16, + -19, + -23, + -22, + -24, + -21, + -22, + -17, + -15, + -8, + -1, + 4, + 14, + 18, + 23, + 24, + 25, + 25, + 18, + 15, + 7, + 2, + 14, + 19, + 22, + 20, + 23, + 22, + 20, + 19, + 20, + 17, + 16, + 21, + 22, + 21, + 18, + 9, + 3, + -6, + -14, + -19, + -30, + -36, + -40, + -32, + -22, + -21, + -16, + -7, + -1, + 3, + 2, + 3, + 6, + 9, + 16, + 20, + 22, + 26, + 27, + 29, + 32, + 30, + 23, + 19, + 20, + 21, + 18, + 22, + 24, + 15, + 14, + 9, + 9, + 7, + 6, + 9, + 9, + 16, + 22, + 20, + 18, + 18, + 9, + -1, + -10, + -16, + -19, + -22, + -22, + -20, + -16, + -11, + -5, + 0, + 1, + 4, + 2, + 0, + 3, + 5, + 10, + 8, + 12, + 10, + 11, + 9, + 8, + 7, + -3, + -4, + -10, + -11, + -5, + 2, + 8, + 12, + 12, + 13, + 14, + 15, + 14, + 12, + 10, + 14, + 13, + 8, + 0, + -2, + -3, + -9, + -6, + -13, + -21, + -12, + -12, + -8, + -9, + -14, + -16, + -19, + -23, + -22, + -23, + -30, + -26, + -17, + -14, + -9, + -2, + 3, + 11, + 16, + 17, + 17, + 11, + 12, + 13, + 12, + 9, + 8, + 7, + 10, + 17, + 14, + 13, + 9, + 7, + 6, + 5, + 10, + 10, + 6, + 10, + 9, + 1, + -5, + -10, + -12, + -17, + -16, + -14, + -13, + -10, + -6, + -2, + 0, + -1, + 2, + 2, + -1, + 2, + 6, + 12, + 18, + 23, + 22, + 23, + 24, + 20, + 16, + 10, + 6, + 9, + 16, + 15, + 15, + 16, + 14, + 8, + 4, + 0, + -3, + -7, + -4, + -5, + -5, + 0, + -4, + 1, + 1, + 1, + -4, + -10, + -17, + -25, + -25, + -28, + -28, + -27, + -25, + -20, + -20, + -20, + -22, + -14, + -11, + -4, + 4, + 6, + 11, + 10, + 12, + 9, + 6, + 2, + -6, + -10, + -12, + -7, + -1, + -6, + 0, + 1, + 2, + 5, + 1, + -1, + 1, + -3, + -6, + -4, + -5, + -4, + -6, + -5, + -7, + -10, + -10, + -8, + -11, + -9, + -2, + 9, + 15, + 14, + 20, + 19, + 19, + 16, + 16, + 11, + 3, + 2, + 2, + 5, + 4, + 5, + 3, + -1, + -1, + -6, + -11, + -16, + -18, + -18, + -12, + -17, + -18, + -13, + -15, + -5, + -4, + -3, + -1, + 2, + 6, + 7, + 11, + 14, + 17, + 17, + 18, + 21, + 18, + 19, + 18, + 23, + 27, + 36, + 32, + 35, + 30, + 24, + 25, + 18, + 10, + 3, + -1, + -4, + -11, + -16, + -21, + -33, + -37, + -35, + -36, + -35, + -30, + -26, + -26, + -21, + -10, + -7, + -3, + -4, + -3, + -3, + -9, + -12, + -16, + -25, + -22, + -11, + -6, + 2, + 5, + 7, + 4, + -2, + -8, + -16, + -23, + -30, + -28, + -23, + -20, + -11, + -11, + -8, + 5, + 2, + -3, + -1, + -11, + -15, + -10, + -13, + -8, + -8, + -12, + -9, + -10, + -15, + -8, + -4, + -3, + 7, + 6, + 13, + 20, + 25, + 24, + 25, + 27, + 28, + 25, + 23, + 22, + 27, + 28, + 27, + 30, + 28, + 26, + 20, + 16, + 13, + 7, + 2, + 1, + 6, + 3, + -4, + -6, + -13, + -18, + -19, + -21, + -15, + -3, + -1, + 10, + 16, + 17, + 20, + 24, + 28, + 28, + 26, + 26, + 28, + 27, + 24, + 23, + 20, + 20, + 24, + 20, + 17, + 14, + 6, + 0, + 2, + 1, + 0, + -3, + -7, + -12, + -18, + -29, + -28, + -30, + -32, + -23, + -27, + -25, + -20, + -17, + -13, + -11, + -14, + -17, + -21, + -22, + -18, + -11, + -12, + -6, + -8, + -9, + -5, + -6, + -10, + -18, + -19, + -16, + -13, + -9, + -6, + -7, + -13, + -10, + -14, + -22, + -30, + -37, + -35, + -37, + -35, + -34, + -36, + -30, + -23, + -17, + -16, + -16, + -11, + -6, + -2, + 3, + 7, + 7, + 6, + 7, + 7, + 13, + 21, + 20, + 22, + 23, + 22, + 24, + 17, + 5, + -1, + -2, + -8, + -13, + -14, + -17, + -24, + -28, + -23, + -22, + -19, + -12, + -14, + -10, + -14, + -21, + -20, + -21, + -22, + -13, + -6, + -1, + 6, + 4, + 10, + 11, + 8, + 10, + 10, + 17, + 20, + 27, + 34, + 32, + 26, + 26, + 24, + 17, + 13, + 6, + 9, + 12, + 15, + 17, + 12, + 11, + 9, + 3, + -3, + -3, + -8, + -9, + -4, + -2, + -2, + 2, + 1, + -1, + -3, + -7, + -8, + -11, + -15, + -8, + -5, + 1, + 9, + 7, + 10, + 13, + 17, + 14, + 12, + 8, + 6, + 3, + 6, + 9, + 8, + 5, + 0, + -2, + 1, + 1, + -3, + -6, + -12, + -17, + -17, + -23, + -28, + -33, + -31, + -29, + -30, + -35, + -28, + -25, + -17, + -5, + 0, + 6, + 10, + 14, + 27, + 31, + 26, + 31, + 30, + 32, + 41, + 42, + 42, + 43, + 34, + 32, + 21, + 12, + 2, + 1, + -3, + -1, + 8, + 13, + 20, + 19, + 18, + 19, + 13, + 8, + 5, + 7, + 6, + 7, + 6, + 4, + 3, + -2, + 0, + 2, + -4, + -1, + -3, + 2, + 12, + 22, + 33, + 32, + 31, + 35, + 35, + 34, + 32, + 26, + 27, + 26, + 21, + 17, + 10, + 1, + -3, + -14, + -21, + -19, + -21, + -19, + -24, + -24, + -19, + -16, + -13, + -16, + -13, + -15, + -17, + -12, + -9, + -4, + 7, + 19, + 27, + 33, + 37, + 34, + 35, + 30, + 24, + 23, + 25, + 21, + 20, + 18, + 15, + 12, + 13, + 8, + 2, + -4, + -12, + -18, + -17, + -14, + -10, + -14, + -8, + -14, + -14, + -12, + -14, + -19, + -23, + -31, + -32, + -28, + -30, + -22, + -20, + -13, + 1, + 0, + 6, + 14, + 15, + 20, + 22, + 20, + 16, + 9, + 2, + 1, + 3, + 6, + 7, + 9, + 10, + 14, + 17, + 16, + 14, + 4, + -7, + -16, + -31, + -40, + -41, + -40, + -38, + -34, + -40, + -37, + -33, + -28, + -22, + -17, + -11, + -10, + -12, + -5, + -5, + -8, + -4, + 0, + -1, + 1, + 1, + 6, + 11, + 14, + 22, + 25, + 28, + 31, + 32, + 32, + 31, + 31, + 20, + 13, + 12, + 5, + 4, + 4, + 2, + 0, + -3, + -6, + -8, + -4, + -4, + -4, + -1, + 7, + 9, + 10, + 13, + 13, + 16, + 10, + 7, + 3, + 6, + 8, + 8, + 15, + 20, + 23, + 18, + 15, + 12, + 4, + 1, + 0, + -4, + -4, + -1, + 8, + 11, + 13, + 21, + 24, + 19, + 12, + 2, + -5, + -11, + -15, + -17, + -17, + -19, + -23, + -28, + -34, + -33, + -37, + -29, + -27, + -24, + -17, + -13, + -8, + -6, + -2, + 5, + 3, + 4, + -2, + -5, + -4, + 0, + 2, + 3, + 1, + -5, + -5, + -6, + -11, + -11, + -15, + -15, + -19, + -17, + -17, + -21, + -23, + -21, + -22, + -24, + -28, + -27, + -25, + -15, + -8, + -1, + 2, + 2, + 3, + 3, + 2, + -2, + 0, + 1, + -1, + 2, + 5, + 7, + 2, + 0, + 2, + -6, + -9, + -8, + -6, + -3, + -3, + 3, + 0, + 5, + 0, + 0, + -5, + -12, + -13, + -20, + -14, + -14, + -6, + -5, + -2, + 0, + 6, + 11, + 9, + 9, + 11, + 10, + 13, + 19, + 26, + 29, + 36, + 37, + 40, + 35, + 27, + 20, + 13, + 6, + 3, + -1, + -1, + -1, + -3, + -6, + -8, + -14, + -16, + -25, + -28, + -23, + -21, + -24, + -22, + -22, + -22, + -24, + -28, + -35, + -43, + -42, + -37, + -29, + -20, + -5, + 2, + 10, + 23, + 28, + 30, + 31, + 30, + 39, + 43, + 40, + 41, + 43, + 43, + 38, + 29, + 18, + 14, + 12, + 3, + 6, + 3, + 3, + 0, + -1, + -3, + -5, + -5, + -8, + -8, + -10, + -6, + -1, + 1, + 5, + 1, + 2, + 6, + 0, + -3, + -7, + -13, + -10, + -7, + -8, + -7, + -3, + -5, + -4, + -4, + -4, + -5, + -2, + 2, + 3, + 6, + 4, + 3, + -1, + -2, + -5, + -16, + -22, + -31, + -39, + -38, + -42, + -47, + -42, + -42, + -35, + -27, + -30, + -28, + -25, + -26, + -24, + -20, + -19, + -19, + -19, + -19, + -14, + -16, + -13, + -9, + -10, + -1, + 8, + 17, + 21, + 28, + 26, + 28, + 24, + 14, + 8, + 2, + 0, + -4, + -4, + -13, + -16, + -16, + -13, + -12, + -7, + -5, + 0, + -4, + -1, + 2, + 4, + 8, + 8, + 10, + 10, + 10, + 14, + 16, + 17, + 23, + 20, + 27, + 27, + 27, + 21, + 14, + 11, + 0, + -4, + -8, + -8, + -1, + -1, + 1, + 6, + 8, + 23, + 22, + 23, + 23, + 25, + 26, + 26, + 22, + 21, + 20, + 22, + 17, + 12, + 8, + 3, + -2, + -2, + -4, + -5, + -3, + 1, + 7, + 6, + 8, + 9, + 12, + 6, + 1, + -4, + -8, + -6, + -3, + -4, + -5, + -3, + -7, + -6, + -6, + -11, + -11, + -19, + -23, + -26, + -28, + -34, + -41, + -41, + -44, + -45, + -47, + -40, + -39, + -33, + -29, + -21, + -14, + -16, + -6, + -7, + -3, + 1, + 6, + 8, + 11, + 14, + 14, + 15, + 15, + 18, + 18, + 16, + 17, + 12, + 15, + 20, + 21, + 19, + 21, + 23, + 22, + 21, + 16, + 12, + 8, + 7, + 7, + 10, + 13, + 13, + 16, + 16, + 16, + 16, + 15, + 15, + 12, + 14, + 14, + 15, + 12, + 11, + 17, + 19, + 19, + 14, + 13, + 15, + 17, + 18, + 20, + 24, + 27, + 24, + 19, + 11, + 10, + 1, + 0, + 0, + -1, + 3, + 8, + 16, + 18, + 17, + 22, + 22, + 21, + 19, + 7, + 0, + 1, + -1, + -2, + -1, + -6, + -8, + -12, + -14, + -20, + -21, + -24, + -19, + -9, + -4, + -3, + 2, + 2, + 3, + 0, + -10, + -19, + -23, + -29, + -31, + -35, + -29, + -33, + -28, + -25, + -25, + -19, + -22, + -23, + -24, + -21, + -17, + -15, + -17, + -13, + -15, + -12, + -15, + -14, + -14, + -12, + -9, + -5, + 1, + 9, + 13, + 13, + 17, + 17, + 15, + 11, + 12, + 8, + 13, + 20, + 24, + 30, + 29, + 33, + 30, + 26, + 23, + 13, + 9, + 4, + 3, + 3, + 5, + 3, + 2, + 5, + 3, + 2, + 1, + 3, + 6, + 10, + 14, + 19, + 23, + 21, + 20, + 21, + 17, + 11, + 5, + -3, + -7, + -12, + -15, + -16, + -13, + -15, + -13, + -7, + -4, + -5, + -5, + -1, + 5, + 11, + 8, + 7, + -2, + -2, + -5, + -6, + -1, + -2, + 0, + 2, + 8, + 13, + 15, + 17, + 15, + 16, + 10, + 13, + 3, + -1, + -4, + -4, + -4, + 0, + 8, + 13, + 15, + 9, + 11, + 9, + 12, + 9, + 10, + 10, + 5, + 11, + 16, + 21, + 20, + 15, + 13, + 5, + 3, + -3, + 1, + 1, + 0, + -4, + -7, + -9, + -7, + -9, + -10, + -7, + -6, + -3, + -2, + -3, + -3, + -6, + -12, + -16, + -22, + -21, + -26, + -28, + -25, + -24, + -23, + -23, + -28, + -32, + -29, + -26, + -26, + -23, + -29, + -23, + -16, + -11, + -7, + -9, + -10, + -12, + -18, + -20, + -20, + -26, + -23, + -16, + -17, + -10, + -7, + 0, + 3, + -2, + 0, + -4, + -7, + -8, + -6, + -3, + -7, + -5, + -5, + 1, + 0, + -3, + -2, + -3, + 5, + 7, + 10, + 19, + 17, + 22, + 21, + 20, + 16, + 8, + 9, + 10, + 12, + 20, + 28, + 31, + 28, + 28, + 26, + 21, + 14, + 8, + 5, + 4, + 5, + 8, + 9, + 9, + 13, + 17, + 16, + 14, + 20, + 17, + 13, + 16, + 17, + 18, + 18, + 15, + 11, + 5, + -2, + -8, + -15, + -17, + -17, + -24, + -24, + -23, + -18, + -13, + -13, + -9, + -7, + -4, + 0, + 3, + 6, + 2, + 2, + -4, + -5, + -5, + -4, + -4, + -2, + 2, + 6, + 10, + 7, + 4, + 2, + -2, + -3, + -8, + -10, + -14, + -27, + -29, + -37, + -36, + -29, + -27, + -19, + -7, + -3, + 0, + -2, + 2, + 8, + 13, + 18, + 15, + 10, + 10, + 6, + 1, + -5, + -12, + -17, + -20, + -23, + -23, + -22, + -19, + -17, + -10, + -6, + -3, + 2, + 0, + 4, + 11, + 14, + 19, + 16, + 6, + 7, + 3, + 3, + 4, + 1, + 7, + 8, + 7, + 3, + -2, + 0, + 0, + 0, + -1, + -2, + 0, + 4, + 3, + 5, + 9, + 9, + 12, + 7, + 5, + 0, + 0, + 1, + 0, + 2, + -6, + -10, + -9, + -13, + -15, + -19, + -15, + -18, + -16, + -17, + -9, + -5, + -2, + 2, + 2, + 3, + 7, + 2, + -3, + -8, + -13, + -8, + 1, + 8, + 12, + 15, + 17, + 17, + 11, + 7, + 0, + -4, + -8, + -8, + -3, + -1, + -4, + -6, + -6, + -13, + -12, + -12, + -13, + -12, + -8, + -9, + -5, + -4, + -2, + 0, + -1, + -6, + -7, + -6, + -10, + -10, + -8, + -6, + 1, + 5, + 6, + 15, + 18, + 16, + 12, + 12, + 12, + 10, + 13, + 7, + 0, + -9, + -10, + -11, + -6, + -8, + -8, + -4, + 0, + 6, + 10, + 11, + 15, + 15, + 15, + 12, + 10, + 6, + 6, + 11, + 12, + 20, + 25, + 23, + 25, + 18, + 12, + 6, + -1, + -4, + -10, + -12, + -9, + -13, + -16, + -15, + -18, + -18, + -22, + -22, + -17, + -14, + -12, + -8, + -3, + 1, + 4, + 11, + 13, + 7, + 0, + -8, + -11, + -11, + -13, + -14, + -12, + -11, + -9, + -6, + -5, + -2, + 1, + 5, + 6, + 10, + 18, + 17, + 15, + 13, + 11, + 12, + 13, + 10, + 9, + 13, + 16, + 16, + 13, + 11, + 6, + 5, + 0, + -5, + -4, + -3, + 2, + 6, + 5, + 6, + 11, + 14, + 20, + 23, + 28, + 27, + 22, + 24, + 23, + 22, + 16, + 17, + 12, + 7, + -1, + -9, + -10, + -9, + -9, + -13, + -11, + -9, + -2, + -2, + -7, + -8, + -6, + -7, + -12, + -12, + -10, + 0, + 5, + 11, + 13, + 11, + 10, + 7, + 3, + 0, + 0, + 3, + 10, + 14, + 16, + 18, + 19, + 21, + 14, + 15, + 12, + 7, + 6, + 7, + 9, + 7, + 11, + 6, + 4, + 4, + -1, + -9, + -12, + -12, + -14, + -9, + -9, + -6, + -5, + -4, + -6, + -7, + -12, + -15, + -17, + -27, + -23, + -20, + -19, + -19, + -18, + -24, + -20, + -25, + -28, + -33, + -31, + -29, + -27, + -15, + -12, + -7, + -3, + 1, + -3, + -3, + -5, + -8, + -6, + 0, + 13, + 17, + 24, + 25, + 23, + 24, + 18, + 8, + -3, + -4, + -4, + -7, + -3, + 1, + 4, + 7, + 9, + 10, + 14, + 14, + 20, + 28, + 35, + 38, + 42, + 43, + 43, + 39, + 30, + 27, + 19, + 15, + 8, + 10, + 12, + 19, + 25, + 26, + 27, + 23, + 22, + 15, + 10, + 6, + 8, + 4, + 6, + 6, + 3, + 7, + 7, + 15, + 11, + 7, + 6, + 5, + 9, + 6, + 0, + -3, + -14, + -21, + -21, + -30, + -39, + -42, + -40, + -37, + -37, + -36, + -32, + -30, + -24, + -21, + -22, + -23, + -24, + -28, + -31, + -31, + -29, + -27, + -30, + -31, + -31, + -31, + -34, + -33, + -34, + -26, + -21, + -15, + -10, + -5, + -3, + -2, + -3, + -6, + -5, + -11, + -14, + -10, + -5, + 0, + 9, + 10, + 18, + 21, + 19, + 21, + 11, + 7, + 4, + 6, + 6, + 7, + 3, + -6, + -9, + -16, + -23, + -24, + -23, + -26, + -18, + -16, + -11, + -8, + 0, + 6, + 5, + 6, + 10, + 8, + 8, + 16, + 24, + 24, + 23, + 24, + 24, + 24, + 18, + 9, + 4, + -3, + -11, + -16, + -15, + -18, + -14, + -12, + -9, + -3, + -4, + -1, + 8, + 11, + 10, + 19, + 21, + 21, + 23, + 20, + 22, + 15, + 9, + 7, + 5, + 3, + 1, + 12, + 13, + 10, + 18, + 23, + 31, + 37, + 40, + 36, + 38, + 40, + 40, + 38, + 27, + 24, + 21, + 14, + 12, + 12, + 7, + 7, + 15, + 18, + 19, + 18, + 17, + 18, + 14, + 12, + 11, + 7, + 5, + 7, + 9, + 9, + 15, + 14, + 15, + 18, + 16, + 7, + 0, + -5, + -6, + -6, + -6, + -1, + 7, + 9, + 12, + 6, + 4, + 4, + 2, + -1, + 2, + 3, + 3, + 5, + 4, + -1, + -13, + -19, + -29, + -34, + -39, + -43, + -49, + -54, + -53, + -55, + -55, + -56, + -59, + -58, + -49, + -41, + -32, + -19, + -10, + -2, + -4, + -1, + -6, + -19, + -27, + -26, + -27, + -27, + -21, + -22, + -20, + -26, + -26, + -20, + -20, + -20, + -21, + -17, + -18, + -7, + -6, + -6, + -5, + -1, + 7, + 18, + 10, + 16, + 25, + 24, + 31, + 30, + 32, + 30, + 26, + 24, + 22, + 23, + 21, + 23, + 21, + 24, + 19, + 17, + 13, + 12, + 15, + 6, + 2, + -5, + -9, + -13, + -10, + -5, + 1, + 10, + 13, + 17, + 13, + 8, + 5, + 5, + 6, + 5, + 13, + 19, + 16, + 14, + 12, + 7, + 15, + 18, + 19, + 16, + 4, + -1, + 0, + -1, + -2, + -9, + -15, + -19, + -21, + -13, + -13, + -10, + -7, + -7, + -7, + -6, + -11, + -22, + -18, + -19, + -22, + -22, + -19, + -18, + -10, + -7, + -9, + -7, + -12, + -16, + -20, + -27, + -35, + -37, + -37, + -33, + -24, + -14, + -4, + 8, + 14, + 19, + 19, + 16, + 12, + 6, + 2, + -5, + -6, + -11, + -17, + -16, + -14, + -13, + -12, + -17, + -21, + -22, + -24, + -18, + -14, + -12, + -1, + 4, + 9, + 17, + 14, + 9, + 13, + 14, + 13, + 14, + 14, + 12, + 11, + 15, + 11, + 16, + 21, + 20, + 20, + 22, + 31, + 30, + 26, + 15, + 13, + 6, + 8, + 5, + 1, + -5, + -3, + 2, + 9, + 14, + 13, + 16, + 17, + 18, + 13, + 10, + 8, + 7, + 9, + 12, + 21, + 23, + 23, + 21, + 19, + 16, + 14, + 5, + -4, + -12, + -15, + -16, + -12, + -9, + -12, + -14, + -17, + -16, + -15, + -14, + -15, + -28, + -27, + -24, + -12, + -8, + -3, + 3, + 9, + 15, + 18, + 25, + 25, + 31, + 32, + 35, + 36, + 33, + 36, + 24, + 13, + 2, + -11, + -19, + -18, + -18, + -10, + -6, + -4, + 0, + -3, + -3, + -15, + -18, + -17, + -9, + -7, + 2, + 5, + 7, + 6, + 2, + -2, + -12, + -16, + -16, + -9, + -3, + 6, + 8, + 15, + 17, + 16, + 18, + 11, + 5, + -4, + -8, + -17, + -16, + -22, + -24, + -25, + -28, + -23, + -19, + -11, + -3, + 5, + 11, + 22, + 26, + 29, + 24, + 14, + 12, + 7, + 6, + -2, + -1, + 2, + 10, + 23, + 33, + 36, + 32, + 31, + 16, + 3, + -4, + -3, + -3, + 1, + 8, + 11, + 13, + 12, + 8, + 3, + 5, + 3, + 1, + -1, + 4, + 2, + 3, + 8, + 5, + 5, + 1, + -2, + -1, + -3, + -1, + 5, + 8, + 10, + 17, + 17, + 15, + 19, + 27, + 18, + 21, + 23, + 19, + 20, + 15, + 1, + -7, + -18, + -24, + -24, + -33, + -28, + -32, + -30, + -30, + -30, + -30, + -29, + -30, + -41, + -43, + -50, + -51, + -49, + -42, + -32, + -19, + -10, + 0, + 4, + -2, + 5, + 9, + 8, + 12, + 19, + 17, + 10, + 9, + 3, + 1, + -4, + -8, + -4, + 0, + 5, + 7, + 10, + 9, + 12, + 0, + -6, + -7, + -13, + -16, + -10, + -10, + -9, + -1, + -1, + -2, + -6, + -11, + -14, + -17, + -18, + -10, + -3, + -3, + 0, + 6, + 1, + 6, + 4, + 3, + 3, + 9, + 16, + 22, + 28, + 27, + 32, + 18, + 21, + 25, + 20, + 21, + 18, + 18, + 22, + 23, + 15, + 8, + -3, + -9, + -10, + -13, + -8, + 3, + 7, + 18, + 26, + 23, + 26, + 30, + 17, + 11, + 9, + -1, + 0, + 2, + 2, + 12, + 15, + 6, + 1, + 0, + -5, + 2, + 1, + -3, + -1, + -6, + -2, + -4, + -11, + -18, + -30, + -38, + -36, + -33, + -32, + -27, + -19, + -18, + -14, + -13, + -16, + -11, + -12, + -12, + -4, + 0, + 7, + 13, + 13, + 10, + 11, + 6, + 3, + 3, + 3, + 4, + 10, + 4, + -1, + -3, + -11, + -21, + -27, + -34, + -33, + -31, + -33, + -28, + -22, + -21, + -14, + -8, + -13, + -10, + -8, + -12, + -7, + -11, + -3, + 3, + 5, + 7, + 7, + -1, + -12, + -13, + -17, + -21, + -8, + -2, + 4, + 7, + 13, + 18, + 18, + 16, + 15, + 13, + 11, + 15, + 13, + 12, + 17, + 18, + 15, + 15, + 11, + -3, + -1, + 2, + 11, + 15, + 10, + 18, + 13, + 10, + 12, + 9, + 2, + 2, + 4, + -1, + 6, + 9, + 11, + 5, + 7, + 13, + 8, + 9, + 10, + 11, + 9, + 7, + 11, + 5, + 3, + 1, + -9, + -19, + -31, + -40, + -42, + -33, + -27, + -24, + -22, + -20, + -25, + -20, + -12, + -17, + -23, + -23, + -25, + -25, + -20, + -18, + -17, + -19, + -15, + -22, + -20, + -19, + -13, + -8, + -12, + 0, + 2, + -6, + -1, + -5, + -15, + -10, + -12, + -19, + -8, + -6, + -3, + 9, + 5, + 12, + 22, + 10, + 9, + 12, + 5, + 8, + 28, + 13, + 20, + 25, + 11, + 16, + 19, + 10, + 15, + 14, + 6, + 23, + 19, + 18, + 32, + 17, + 12, + 19, + -1, + -8, + 11, + -4, + -8, + 9, + -4, + -6, + 0, + -10, + -7, + -3, + -8, + -11, + -11, + -23, + -7, + -4, + -4, + 14, + 6, + 4, + 9, + 3, + -4, + 4, + 2, + 9, + 26, + 19, + 26, + 33, + 22, + 22, + 24, + 13, + 20, + 18, + 18, + 28, + 28, + 19, + 24, + 16, + -1, + 1, + -12, + -34, + -28, + -25, + -27, + -13, + 6, + 8, + 21, + 25, + 22, + 19, + 3, + 4, + 0, + -5, + 6, + 8, + 1, + 6, + 8, + -4, + -3, + -10, + -23, + -17, + -9, + -10, + 3, + 6, + -1, + 3, + -10, + -22, + -28, + -49, + -49, + -36, + -29, + -10, + 8, + -1, + 4, + 14, + -3, + -14, + -5, + -16, + -10, + 8, + 7, + 21, + 24, + 17, + 25, + 15, + -4, + 13, + -7, + -23, + 0, + -7, + -14, + 12, + 1, + -18, + -10, + -27, + -43, + -31, + -34, + -19, + -3, + -10, + 15, + 20, + -7, + 10, + 9, + -20, + 7, + 28, + 14, + 42, + 54, + 32, + 34, + 24, + 5, + 10, + -11, + -13, + 11, + -6, + -4, + 31, + 7, + 0, + 34, + 3, + -9, + 5, + -24, + -33, + -14, + -11, + -1, + 8, + 0, + 10, + 7, + -7, + 11, + 10, + -6, + 17, + 16, + 0, + 10, + 3, + -26, + -23, + -33, + -39, + -26, + -29, + -18, + -6, + -9, + -1, + 5, + -11, + -6, + 7, + -6, + 1, + 13, + 8, + 1, + 3, + -13, + -23, + -25, + -33, + -28, + -21, + -9, + 2, + 4, + 1, + 8, + 4, + -13, + -5, + -12, + -14, + 3, + 14, + 18, + 26, + 30, + 21, + 20, + 15, + 15, + 10, + 5, + 13, + 11, + 20, + 25, + 29, + 18, + 19, + 9, + -10, + -15, + -13, + -12, + 1, + 16, + 20, + 30, + 39, + 37, + 21, + 15, + 3, + -7, + -9, + -1, + 2, + -6, + -7, + -10, + -20, + -19, + -19, + -31, + -25, + -12, + -15, + -13, + -17, + -18, + -14, + -24, + -24, + -18, + -28, + -24, + -3, + 1, + 17, + 46, + 48, + 43, + 46, + 34, + 12, + 6, + -14, + -19, + -10, + -14, + 3, + 15, + 3, + 7, + 7, + -13, + 4, + 9, + -2, + 3, + 22, + 19, + 25, + 41, + 48, + 46, + 36, + 42, + 40, + 24, + 33, + 50, + 29, + 30, + 57, + 35, + 13, + 29, + 17, + -9, + 5, + 15, + 7, + 13, + 38, + 47, + 40, + 56, + 72, + 42, + 29, + 40, + 18, + 14, + 36, + 52, + 50, + 58, + 55, + 42, + 22, + 20, + 13, + -8, + 8, + 32, + 26, + 41, + 70, + 48, + 51, + 65, + 36, + 27, + 23, + 4, + 5, + 1, + -3, + 2, + -8, + -23, + -6, + -30, + -46, + -24, + -40, + -45, + -22, + -32, + -35, + -24, + -50, + -41, + -35, + -56, + -38, + -29, + -55, + -25, + -7, + -40, + -26, + -25, + -63, + -51, + -40, + -61, + -47, + -38, + -38, + -5, + 2, + 3, + 26, + -1, + -7, + 8, + -20, + -17, + 10, + -14, + -6, + 41, + 24, + 27, + 52, + 26, + 13, + 25, + 5, + -6, + 2, + -7, + -2, + 10, + 4, + 29, + 36, + 30, + 74, + 93, + 91, + 131, + 150, + 132, + 167, + 177, + 158, + 189, + 188, + 178, + 200, + 199, + 187, + 212, + 202, + 188, + 210, + 188, + 173, + 187, + 175, + 183, + 215, + 218, + 236, + 264, + 253, + 279, + 296, + 275, + 290, + 288, + 261, + 261, + 261, + 230, + 216, + 199, + 157, + 160, + 147, + 115, + 108, + 84, + 50, + 32, + 7, + -30, + -56, + -96, + -130, + -146, + -179, + -199, + -223, + -255, + -280, + -293, + -326, + -341, + -352, + -391, + -410, + -429, + -464, + -489, + -507, + -538, + -559, + -577, + -602, + -634, + -656, + -679, + -696, + -702, + -700, + -699, + -700, + -687, + -666, + -665, + -656, + -634, + -626, + -609, + -572, + -539, + -518, + -484, + -462, + -444, + -418, + -390, + -364, + -336, + -295, + -245, + -210, + -175, + -127, + -97, + -63, + -28, + 10, + 45, + 83, + 121, + 167, + 222, + 272, + 324, + 369, + 396, + 439, + 485, + 502, + 536, + 571, + 585, + 618, + 656, + 676, + 705, + 729, + 744, + 767, + 776, + 786, + 798, + 796, + 813, + 849, + 855, + 865, + 883, + 862, + 843, + 834, + 794, + 781, + 778, + 767, + 746, + 744, + 721, + 702, + 681, + 638, + 607, + 562, + 521, + 490, + 447, + 398, + 361, + 313, + 255, + 204, + 123, + 20, + -59, + -143, + -217, + -270, + -328, + -400, + -462, + -529, + -607, + -666, + -737, + -797, + -854, + -906, + -936, + -944, + -955, + -965, + -976, + -993, + -1003, + -1007, + -1032, + -1040, + -1045, + -1055, + -1039, + -1016, + -1003, + -990, + -995, + -1026, + -1046, + -1070, + -1079, + -1058, + -1060, + -1062, + -1028, + -1010, + -1006, + -991, + -1000, + -1004, + -987, + -981, + -958, + -921, + -890, + -852, + -798, + -754, + -713, + -681, + -682, + -658, + -617, + -585, + -524, + -452, + -404, + -332, + -258, + -224, + -183, + -144, + -132, + -94, + -64, + -31, + 37, + 99, + 147, + 219, + 280, + 329, + 389, + 439, + 483, + 563, + 632, + 702, + 799, + 884, + 965, + 1050, + 1107, + 1150, + 1209, + 1260, + 1308, + 1383, + 1446, + 1514, + 1582, + 1632, + 1679, + 1727, + 1770, + 1804, + 1837, + 1872, + 1916, + 1961, + 1999, + 2038, + 2071, + 2089, + 2097, + 2107, + 2091, + 2084, + 2072, + 2051, + 2021, + 1998, + 1940, + 1868, + 1814, + 1734, + 1641, + 1559, + 1480, + 1395, + 1305, + 1213, + 1115, + 1015, + 901, + 785, + 667, + 520, + 381, + 256, + 110, + -26, + -141, + -284, + -417, + -528, + -670, + -805, + -935, + -1080, + -1206, + -1324, + -1438, + -1527, + -1622, + -1725, + -1798, + -1879, + -1956, + -2006, + -2063, + -2128, + -2166, + -2201, + -2238, + -2257, + -2292, + -2316, + -2337, + -2357, + -2356, + -2362, + -2382, + -2375, + -2368, + -2367, + -2358, + -2337, + -2329, + -2318, + -2296, + -2273, + -2240, + -2195, + -2140, + -2095, + -2044, + -1990, + -1932, + -1872, + -1803, + -1737, + -1673, + -1602, + -1520, + -1428, + -1325, + -1219, + -1112, + -1006, + -896, + -780, + -681, + -591, + -481, + -388, + -294, + -189, + -85, + 30, + 148, + 252, + 348, + 466, + 579, + 692, + 811, + 918, + 1041, + 1162, + 1271, + 1389, + 1507, + 1611, + 1735, + 1864, + 1965, + 2085, + 2203, + 2312, + 2436, + 2536, + 2614, + 2697, + 2760, + 2812, + 2886, + 2956, + 3010, + 3066, + 3088, + 3098, + 3120, + 3110, + 3101, + 3106, + 3108, + 3130, + 3149, + 3139, + 3122, + 3085, + 3016, + 2951, + 2874, + 2770, + 2671, + 2559, + 2435, + 2315, + 2198, + 2059, + 1915, + 1761, + 1570, + 1387, + 1185, + 984, + 787, + 601, + 413, + 224, + 40, + -158, + -348, + -560, + -760, + -960, + -1147, + -1312, + -1471, + -1621, + -1779, + -1925, + -2069, + -2206, + -2333, + -2463, + -2570, + -2664, + -2743, + -2811, + -2860, + -2886, + -2934, + -2976, + -3015, + -3057, + -3074, + -3076, + -3079, + -3060, + -3032, + -2998, + -2950, + -2920, + -2893, + -2863, + -2837, + -2806, + -2761, + -2715, + -2662, + -2607, + -2554, + -2486, + -2402, + -2325, + -2264, + -2190, + -2127, + -2063, + -1989, + -1932, + -1862, + -1788, + -1724, + -1640, + -1545, + -1455, + -1346, + -1234, + -1112, + -984, + -859, + -735, + -610, + -494, + -384, + -280, + -176, + -68, + 40, + 140, + 244, + 363, + 478, + 596, + 739, + 876, + 1001, + 1128, + 1240, + 1352, + 1474, + 1595, + 1717, + 1853, + 1972, + 2093, + 2215, + 2328, + 2432, + 2533, + 2641, + 2744, + 2855, + 2949, + 3055, + 3157, + 3242, + 3329, + 3415, + 3479, + 3528, + 3569, + 3588, + 3617, + 3649, + 3676, + 3708, + 3747, + 3751, + 3753, + 3744, + 3693, + 3640, + 3576, + 3470, + 3369, + 3248, + 3098, + 2976, + 2838, + 2690, + 2557, + 2395, + 2222, + 2055, + 1872, + 1675, + 1488, + 1279, + 1057, + 851, + 623, + 393, + 180, + -74, + -315, + -537, + -771, + -979, + -1161, + -1373, + -1558, + -1729, + -1932, + -2110, + -2294, + -2478, + -2636, + -2785, + -2917, + -3007, + -3094, + -3183, + -3247, + -3319, + -3402, + -3450, + -3510, + -3564, + -3595, + -3622, + -3635, + -3627, + -3635, + -3639, + -3620, + -3620, + -3610, + -3596, + -3581, + -3535, + -3495, + -3455, + -3410, + -3361, + -3323, + -3265, + -3202, + -3141, + -3078, + -3001, + -2919, + -2830, + -2739, + -2640, + -2540, + -2430, + -2320, + -2192, + -2057, + -1909, + -1761, + -1603, + -1422, + -1244, + -1059, + -887, + -726, + -570, + -425, + -256, + -92, + 69, + 238, + 411, + 557, + 728, + 910, + 1066, + 1229, + 1403, + 1561, + 1727, + 1895, + 2050, + 2208, + 2352, + 2492, + 2638, + 2765, + 2893, + 3025, + 3145, + 3263, + 3387, + 3496, + 3595, + 3707, + 3804, + 3884, + 3975, + 4046, + 4105, + 4167, + 4204, + 4220, + 4237, + 4243, + 4247, + 4260, + 4255, + 4251, + 4246, + 4201, + 4143, + 4092, + 3996, + 3885, + 3772, + 3604, + 3435, + 3283, + 3086, + 2923, + 2742, + 2535, + 2341, + 2130, + 1887, + 1649, + 1411, + 1137, + 915, + 659, + 398, + 163, + -81, + -351, + -580, + -814, + -1069, + -1262, + -1476, + -1689, + -1850, + -2043, + -2237, + -2395, + -2591, + -2763, + -2918, + -3095, + -3224, + -3319, + -3435, + -3508, + -3582, + -3698, + -3772, + -3858, + -3950, + -4008, + -4047, + -4088, + -4093, + -4085, + -4098, + -4064, + -4052, + -4057, + -4033, + -4028, + -4018, + -3991, + -3971, + -3933, + -3865, + -3802, + -3727, + -3633, + -3562, + -3477, + -3392, + -3300, + -3210, + -3115, + -3018, + -2924, + -2819, + -2721, + -2606, + -2490, + -2381, + -2246, + -2111, + -1963, + -1810, + -1638, + -1460, + -1293, + -1132, + -980, + -828, + -666, + -496, + -322, + -125, + 72, + 264, + 470, + 676, + 879, + 1087, + 1280, + 1457, + 1633, + 1799, + 1970, + 2152, + 2327, + 2501, + 2678, + 2840, + 3007, + 3165, + 3301, + 3434, + 3558, + 3667, + 3791, + 3912, + 4023, + 4140, + 4257, + 4359, + 4475, + 4554, + 4614, + 4656, + 4682, + 4697, + 4726, + 4749, + 4775, + 4810, + 4812, + 4812, + 4810, + 4768, + 4697, + 4620, + 4502, + 4368, + 4210, + 4031, + 3860, + 3663, + 3472, + 3291, + 3076, + 2849, + 2642, + 2392, + 2140, + 1890, + 1610, + 1325, + 1064, + 782, + 494, + 231, + -50, + -329, + -593, + -861, + -1112, + -1345, + -1588, + -1812, + -2022, + -2257, + -2467, + -2682, + -2924, + -3126, + -3317, + -3495, + -3630, + -3737, + -3855, + -3941, + -4031, + -4128, + -4200, + -4281, + -4348, + -4388, + -4427, + -4449, + -4444, + -4450, + -4458, + -4452, + -4464, + -4460, + -4451, + -4444, + -4425, + -4384, + -4344, + -4289, + -4234, + -4160, + -4076, + -4000, + -3917, + -3837, + -3753, + -3669, + -3558, + -3460, + -3354, + -3230, + -3111, + -2966, + -2824, + -2665, + -2495, + -2333, + -2151, + -1951, + -1752, + -1554, + -1367, + -1222, + -1053, + -882, + -716, + -520, + -331, + -141, + 62, + 270, + 476, + 707, + 923, + 1133, + 1349, + 1534, + 1735, + 1943, + 2124, + 2317, + 2511, + 2668, + 2839, + 3002, + 3140, + 3317, + 3481, + 3615, + 3771, + 3920, + 4050, + 4196, + 4319, + 4430, + 4556, + 4657, + 4765, + 4868, + 4945, + 4999, + 5057, + 5075, + 5100, + 5123, + 5133, + 5134, + 5127, + 5104, + 5084, + 5058, + 4968, + 4896, + 4750, + 4575, + 4381, + 4179, + 3971, + 3776, + 3590, + 3394, + 3209, + 2991, + 2800, + 2535, + 2269, + 1972, + 1654, + 1319, + 998, + 697, + 384, + 105, + -187, + -476, + -759, + -1047, + -1316, + -1579, + -1841, + -2085, + -2317, + -2550, + -2745, + -2938, + -3145, + -3326, + -3523, + -3706, + -3859, + -3998, + -4124, + -4218, + -4288, + -4346, + -4386, + -4437, + -4495, + -4550, + -4619, + -4680, + -4732, + -4779, + -4813, + -4820, + -4842, + -4825, + -4791, + -4773, + -4742, + -4715, + -4709, + -4683, + -4652, + -4605, + -4527, + -4428, + -4315, + -4194, + -4086, + -3978, + -3872, + -3779, + -3685, + -3569, + -3458, + -3313, + -3121, + -2921, + -2693, + -2454, + -2230, + -1998, + -1783, + -1588, + -1414, + -1240, + -1069, + -886, + -690, + -473, + -256, + -36, + 170, + 384, + 594, + 797, + 1015, + 1235, + 1449, + 1664, + 1882, + 2098, + 2311, + 2504, + 2681, + 2843, + 3019, + 3171, + 3337, + 3534, + 3709, + 3885, + 4072, + 4235, + 4380, + 4524, + 4641, + 4746, + 4864, + 4979, + 5087, + 5213, + 5308, + 5393, + 5450, + 5468, + 5475, + 5472, + 5452, + 5462, + 5467, + 5453, + 5451, + 5425, + 5342, + 5255, + 5113, + 4914, + 4725, + 4512, + 4273, + 4053, + 3866, + 3632, + 3436, + 3205, + 2955, + 2705, + 2420, + 2095, + 1794, + 1503, + 1195, + 941, + 639, + 342, + 56, + -269, + -601, + -894, + -1208, + -1499, + -1736, + -1994, + -2239, + -2426, + -2652, + -2891, + -3099, + -3361, + -3588, + -3793, + -4013, + -4183, + -4302, + -4439, + -4523, + -4613, + -4734, + -4809, + -4891, + -4999, + -5056, + -5090, + -5131, + -5092, + -5061, + -5044, + -4987, + -4954, + -4955, + -4924, + -4911, + -4873, + -4809, + -4755, + -4673, + -4555, + -4440, + -4316, + -4187, + -4088, + -3986, + -3881, + -3802, + -3717, + -3605, + -3495, + -3359, + -3207, + -3063, + -2889, + -2698, + -2504, + -2306, + -2088, + -1861, + -1627, + -1415, + -1201, + -1000, + -799, + -593, + -410, + -220, + -7, + 203, + 412, + 634, + 865, + 1126, + 1367, + 1602, + 1838, + 2052, + 2257, + 2474, + 2659, + 2863, + 3076, + 3255, + 3429, + 3617, + 3773, + 3939, + 4102, + 4222, + 4358, + 4501, + 4611, + 4733, + 4846, + 4939, + 5056, + 5147, + 5217, + 5301, + 5357, + 5388, + 5428, + 5417, + 5400, + 5430, + 5422, + 5406, + 5442, + 5446, + 5431, + 5437, + 5381, + 5304, + 5212, + 5057, + 4874, + 4683, + 4465, + 4249, + 4026, + 3767, + 3545, + 3304, + 3021, + 2741, + 2450, + 2113, + 1807, + 1490, + 1151, + 841, + 544, + 212, + -102, + -439, + -788, + -1091, + -1413, + -1730, + -2033, + -2336, + -2627, + -2854, + -3118, + -3350, + -3560, + -3781, + -4008, + -4194, + -4376, + -4524, + -4640, + -4757, + -4865, + -4945, + -5016, + -5083, + -5131, + -5170, + -5184, + -5198, + -5208, + -5211, + -5210, + -5209, + -5192, + -5174, + -5154, + -5108, + -5052, + -5002, + -4932, + -4854, + -4780, + -4704, + -4604, + -4514, + -4421, + -4309, + -4208, + -4111, + -4004, + -3880, + -3751, + -3622, + -3496, + -3367, + -3210, + -3047, + -2867, + -2654, + -2430, + -2177, + -1897, + -1651, + -1417, + -1182, + -983, + -793, + -593, + -406, + -211, + 17, + 232, + 461, + 716, + 958, + 1197, + 1441, + 1674, + 1899, + 2130, + 2355, + 2573, + 2788, + 3004, + 3220, + 3419, + 3612, + 3809, + 3973, + 4120, + 4277, + 4433, + 4573, + 4742, + 4902, + 5037, + 5165, + 5282, + 5377, + 5460, + 5539, + 5596, + 5654, + 5716, + 5741, + 5759, + 5770, + 5776, + 5762, + 5751, + 5737, + 5706, + 5675, + 5644, + 5550, + 5446, + 5324, + 5169, + 4974, + 4767, + 4530, + 4289, + 4067, + 3823, + 3621, + 3391, + 3145, + 2878, + 2575, + 2228, + 1890, + 1525, + 1149, + 807, + 473, + 145, + -152, + -454, + -769, + -1057, + -1374, + -1703, + -2033, + -2372, + -2701, + -2977, + -3258, + -3495, + -3694, + -3897, + -4089, + -4270, + -4483, + -4668, + -4840, + -5015, + -5140, + -5225, + -5304, + -5334, + -5350, + -5390, + -5398, + -5403, + -5428, + -5438, + -5449, + -5472, + -5463, + -5441, + -5401, + -5333, + -5252, + -5151, + -5051, + -4974, + -4880, + -4805, + -4729, + -4626, + -4526, + -4403, + -4248, + -4088, + -3939, + -3778, + -3617, + -3464, + -3308, + -3173, + -3027, + -2852, + -2669, + -2461, + -2233, + -1979, + -1713, + -1455, + -1216, + -996, + -796, + -610, + -397, + -198, + 21, + 272, + 517, + 775, + 1037, + 1295, + 1544, + 1790, + 2007, + 2211, + 2423, + 2634, + 2848, + 3081, + 3319, + 3551, + 3792, + 4000, + 4171, + 4303, + 4418, + 4518, + 4596, + 4679, + 4807, + 4913, + 5044, + 5172, + 5288, + 5405, + 5518, + 5609, + 5664, + 5713, + 5735, + 5735, + 5737, + 5701, + 5691, + 5656, + 5633, + 5611, + 5552, + 5475, + 5394, + 5293, + 5177, + 5064, + 4924, + 4737, + 4599, + 4420, + 4237, + 4048, + 3828, + 3623, + 3413, + 3183, + 2915, + 2622, + 2308, + 1980, + 1657, + 1261, + 901, + 549, + 205, + -85, + -383, + -688, + -969, + -1246, + -1530, + -1850, + -2206, + -2561, + -2915, + -3224, + -3482, + -3713, + -3921, + -4107, + -4287, + -4470, + -4660, + -4850, + -5057, + -5239, + -5395, + -5540, + -5619, + -5697, + -5724, + -5697, + -5675, + -5633, + -5590, + -5579, + -5530, + -5486, + -5442, + -5426, + -5391, + -5348, + -5276, + -5197, + -5124, + -5039, + -4925, + -4808, + -4677, + -4581, + -4479, + -4343, + -4218, + -4087, + -3970, + -3858, + -3729, + -3570, + -3384, + -3206, + -3020, + -2839, + -2636, + -2453, + -2287, + -2185, + -2154, + -1926, + -1562, + -1223, + -758, + -473, + -64, + 395, + 599, + 880, + 814, + 938, + 1172, + 1498, + 1928, + 2127, + 2422, + 2608, + 2841, + 2937, + 2886, + 2815, + 2985, + 3324, + 3757, + 4152, + 4481, + 4652, + 4917, + 4965, + 4766, + 4583, + 4328, + 4503, + 4815, + 5118, + 5408, + 5682, + 5956, + 6082, + 6055, + 5744, + 5426, + 5341, + 5427, + 5606, + 5882, + 6065, + 6226, + 6428, + 6477, + 6385, + 6009, + 5728, + 5552, + 5439, + 5339, + 5200, + 5008, + 4947, + 4835, + 4614, + 4330, + 3887, + 3521, + 3111, + 2460, + 1983, + 1297, + 650, + 279, + -353, + -720, + -1044, + -1518, + -1668, + -2117, + -2496, + -2743, + -3266, + -3607, + -3790, + -4149, + -4075, + -4042, + -4096, + -3981, + -4138, + -4226, + -4214, + -4503, + -4455, + -4577, + -4642, + -4346, + -4351, + -4270, + -4263, + -4522, + -4521, + -4673, + -4814, + -4731, + -4950, + -5011, + -5004, + -5288, + -5341, + -5566, + -5833, + -5783, + -5929, + -5847, + -5765, + -5828, + -5644, + -5613, + -5615, + -5428, + -5291, + -5014, + -4554, + -4277, + -3964, + -3854, + -3829, + -3612, + -3603, + -3438, + -3137, + -2831, + -2164, + -1438, + -939, + -330, + -156, + 46, + 242, + 73, + 242, + 220, + 239, + 542, + 565, + 739, + 872, + 801, + 857, + 676, + 543, + 586, + 567, + 828, + 1142, + 1490, + 1985, + 2508, + 2982, + 3438, + 3699, + 3939, + 4069, + 4178, + 4420, + 4622, + 4917, + 5338, + 5801, + 6285, + 6658, + 6963, + 7213, + 7233, + 7328, + 7176, + 7038, + 7031, + 6860, + 6957, + 6767, + 6599, + 6523, + 6212, + 6147, + 6063, + 5860, + 6020, + 6015, + 6033, + 6184, + 5722, + 5607, + 5016, + 4337, + 4063, + 3229, + 3080, + 3006, + 2804, + 3035, + 2541, + 2136, + 1879, + 1012, + 401, + -575, + -1584, + -1930, + -2278, + -2485, + -2477, + -2712, + -2747, + -2766, + -3320, + -3592, + -4188, + -4669, + -4672, + -4939, + -4789, + -4426, + -4203, + -3674, + -3563, + -3656, + -3759, + -4067, + -4257, + -4522, + -4970, + -5204, + -5237, + -5139, + -4907, + -4911, + -4917, + -4921, + -5007, + -5230, + -5654, + -6122, + -6464, + -6733, + -6948, + -7067, + -6972, + -6800, + -6520, + -6132, + -5830, + -5382, + -5091, + -4797, + -4546, + -4472, + -4362, + -4350, + -4235, + -3851, + -3454, + -3144, + -2735, + -2341, + -1845, + -1262, + -958, + -549, + -166, + 66, + 382, + 366, + 352, + 341, + 85, + -13, + -176, + -303, + -235, + -341, + -309, + -227, + -249, + -50, + 143, + 384, + 874, + 1149, + 1552, + 2155, + 2767, + 3499, + 3994, + 4460, + 4920, + 5288, + 5569, + 5704, + 5881, + 6094, + 6461, + 6653, + 6803, + 7115, + 7311, + 7521, + 7612, + 7443, + 7380, + 7124, + 6742, + 6495, + 5964, + 5656, + 5415, + 5167, + 5656, + 5813, + 6027, + 6401, + 6351, + 6787, + 7019, + 6581, + 6512, + 5965, + 5308, + 5140, + 4336, + 4147, + 3899, + 3398, + 3360, + 2830, + 2624, + 1968, + 1026, + 395, + -699, + -1424, + -2327, + -3006, + -3192, + -3435, + -3337, + -3686, + -3513, + -3350, + -3502, + -3261, + -3878, + -4005, + -4063, + -4187, + -3767, + -3598, + -3384, + -3300, + -3094, + -2857, + -3023, + -3274, + -3851, + -4352, + -4523, + -4943, + -5477, + -5612, + -5682, + -5733, + -5714, + -5965, + -6110, + -5950, + -6158, + -6548, + -6897, + -7165, + -7281, + -7352, + -7258, + -7185, + -6659, + -5946, + -5470, + -4738, + -4046, + -3707, + -3210, + -3108, + -3270, + -3227, + -3222, + -3218, + -3017, + -2943, + -2668, + -2296, + -1593, + -1061, + -811, + -403, + -513, + -361, + -128, + -595, + -633, + -991, + -1205, + -1159, + -1284, + -1330, + -1164, + -999, + -729, + -538, + -336, + 27, + 350, + 794, + 1245, + 1646, + 2446, + 3210, + 4017, + 4835, + 5271, + 5739, + 6028, + 6140, + 6212, + 6161, + 6066, + 5984, + 6081, + 5995, + 6152, + 6301, + 6278, + 6424, + 6377, + 6396, + 6362, + 6152, + 5788, + 5309, + 5071, + 4860, + 4704, + 4804, + 4919, + 5258, + 5869, + 6121, + 6365, + 6694, + 6692, + 6694, + 6532, + 6187, + 5808, + 5704, + 5302, + 4816, + 4611, + 4043, + 3775, + 3249, + 2600, + 1933, + 982, + 336, + -848, + -1538, + -2242, + -3103, + -3374, + -3756, + -3975, + -4017, + -4061, + -3972, + -3749, + -3609, + -3853, + -3850, + -3714, + -3760, + -3736, + -3914, + -3923, + -3830, + -3541, + -3649, + -3757, + -3661, + -3913, + -4038, + -4231, + -4594, + -4769, + -5009, + -5273, + -5588, + -5676, + -5937, + -5997, + -6060, + -6164, + -6414, + -6623, + -6765, + -6857, + -6771, + -6921, + -6914, + -6535, + -6187, + -5626, + -5206, + -4742, + -4189, + -3618, + -3120, + -2823, + -2606, + -2550, + -2703, + -2736, + -2626, + -2498, + -2406, + -2133, + -1852, + -1348, + -753, + -318, + 162, + 330, + 524, + 375, + 9, + -204, + -866, + -1249, + -1532, + -1669, + -1455, + -1235, + -723, + -283, + 262, + 535, + 862, + 1340, + 1712, + 2316, + 2625, + 3171, + 4015, + 4698, + 5516, + 6006, + 6452, + 6838, + 6921, + 7003, + 6735, + 6339, + 6138, + 5768, + 5575, + 5593, + 5568, + 5728, + 6041, + 6233, + 6260, + 6175, + 6048, + 5728, + 5366, + 4931, + 4340, + 4194, + 4174, + 4330, + 4743, + 5028, + 5754, + 6250, + 6598, + 7120, + 7114, + 6962, + 6675, + 6157, + 5373, + 4797, + 4081, + 3237, + 3153, + 2588, + 2143, + 1639, + 1021, + 681, + -149, + -816, + -1987, + -3003, + -3493, + -4138, + -4420, + -4607, + -4841, + -4725, + -4254, + -4033, + -3845, + -3842, + -4063, + -4035, + -4099, + -4582, + -4718, + -4779, + -4689, + -4437, + -4327, + -4352, + -4119, + -3881, + -4061, + -4345, + -4768, + -5248, + -5610, + -5920, + -6383, + -6779, + -6731, + -6673, + -6677, + -6597, + -6659, + -6619, + -6417, + -6516, + -6862, + -7017, + -7069, + -6944, + -6715, + -6376, + -6000, + -5162, + -4333, + -3577, + -2884, + -2355, + -1807, + -1366, + -1380, + -1590, + -1869, + -1962, + -1945, + -2006, + -2141, + -1960, + -1516, + -1025, + -471, + -135, + 85, + 348, + 239, + -8, + -475, + -951, + -1245, + -1520, + -1569, + -1448, + -1188, + -517, + 134, + 827, + 1585, + 2114, + 2792, + 3214, + 3651, + 4230, + 4546, + 4894, + 5321, + 5588, + 6105, + 6583, + 6877, + 7014, + 7087, + 7068, + 6876, + 6695, + 6280, + 5684, + 5385, + 5205, + 5064, + 5033, + 5028, + 5080, + 5322, + 5510, + 5461, + 5390, + 5541, + 5494, + 5443, + 5306, + 5065, + 5193, + 5338, + 5513, + 5818, + 5911, + 6345, + 6506, + 6514, + 6543, + 5981, + 5703, + 5082, + 4228, + 3517, + 2424, + 1880, + 1245, + 562, + -130, + -864, + -1156, + -1561, + -1970, + -2597, + -3357, + -3707, + -4189, + -4521, + -4975, + -5477, + -5478, + -5585, + -5445, + -5353, + -5327, + -4971, + -4580, + -4431, + -4469, + -4432, + -4422, + -4275, + -4227, + -4507, + -4745, + -4758, + -4752, + -4845, + -4933, + -5118, + -5117, + -5124, + -5324, + -5673, + -5971, + -6152, + -6366, + -6702, + -6970, + -7159, + -7136, + -6929, + -6917, + -6703, + -6520, + -6302, + -5794, + -5484, + -5123, + -4694, + -4254, + -3722, + -3334, + -2917, + -2410, + -1721, + -1010, + -584, + -312, + 27, + 321, + 327, + 214, + -17, + -363, + -402, + -550, + -638, + -469, + -315, + -86, + 142, + 242, + 387, + 448, + 458, + 423, + 321, + 194, + 285, + 417, + 717, + 1176, + 1673, + 2402, + 3144, + 3985, + 4764, + 5406, + 6056, + 6507, + 6783, + 6891, + 6868, + 6850, + 6717, + 6532, + 6359, + 6248, + 6303, + 6279, + 6140, + 6071, + 5927, + 5687, + 5480, + 5146, + 4835, + 4572, + 4447, + 4481, + 4578, + 4840, + 4936, + 5246, + 5659, + 5732, + 5856, + 5658, + 5403, + 5282, + 5004, + 4949, + 4843, + 4681, + 4884, + 4886, + 4967, + 5108, + 4781, + 4647, + 4240, + 3443, + 2768, + 1830, + 983, + 309, + -769, + -1382, + -1987, + -2553, + -2750, + -3346, + -3555, + -4052, + -4400, + -4599, + -5196, + -5437, + -5945, + -6340, + -6343, + -6554, + -6611, + -6381, + -6184, + -5681, + -5398, + -5098, + -4751, + -4529, + -4138, + -4100, + -4088, + -4044, + -4186, + -4189, + -4263, + -4453, + -4465, + -4598, + -4651, + -4726, + -4919, + -4926, + -5142, + -5286, + -5490, + -5831, + -6002, + -6341, + -6492, + -6562, + -6710, + -6553, + -6506, + -6219, + -5766, + -5521, + -5008, + -4556, + -4002, + -3293, + -2769, + -2069, + -1467, + -824, + -34, + 509, + 1034, + 1385, + 1560, + 1650, + 1664, + 1419, + 1016, + 834, + 511, + 353, + 381, + 299, + 523, + 833, + 956, + 1280, + 1492, + 1425, + 1547, + 1350, + 1143, + 1114, + 931, + 1054, + 1217, + 1583, + 2217, + 2917, + 4017, + 4965, + 5827, + 6816, + 7393, + 7875, + 8197, + 8175, + 7924, + 7578, + 7040, + 6566, + 6242, + 5746, + 5530, + 5334, + 5222, + 5237, + 5074, + 5146, + 5011, + 4902, + 4753, + 4442, + 4482, + 4254, + 4247, + 4319, + 4187, + 4516, + 4690, + 4935, + 5193, + 5229, + 5350, + 5332, + 5486, + 5386, + 5143, + 4999, + 4494, + 4304, + 3961, + 3421, + 2781, + 2032, + 1404, + 614, + -88, + -956, + -1714, + -2155, + -2684, + -3038, + -3237, + -3368, + -3423, + -3569, + -3809, + -4213, + -4533, + -4973, + -5514, + -6011, + -6663, + -7084, + -7258, + -7158, + -6947, + -6639, + -6111, + -5548, + -4887, + -4362, + -4043, + -3895, + -3940, + -4107, + -4452, + -4836, + -5143, + -5500, + -5532, + -5510, + -5485, + -5096, + -4739, + -4375, + -4065, + -4063, + -4094, + -4252, + -4576, + -4904, + -5431, + -5837, + -6190, + -6402, + -6310, + -6292, + -5992, + -5516, + -5025, + -4342, + -3899, + -3386, + -2697, + -2077, + -1493, + -994, + -392, + 232, + 931, + 1608, + 1988, + 2360, + 2589, + 2639, + 2623, + 2471, + 2121, + 1708, + 1478, + 1181, + 1167, + 1296, + 1279, + 1648, + 1859, + 2107, + 2368, + 2359, + 2390, + 2122, + 1904, + 1629, + 1418, + 1502, + 1524, + 1859, + 2357, + 3041, + 3909, + 4810, + 5751, + 6449, + 7128, + 7534, + 7767, + 7908, + 7699, + 7460, + 7032, + 6647, + 6301, + 5876, + 5556, + 5190, + 4948, + 4762, + 4576, + 4464, + 4370, + 4338, + 4275, + 4287, + 4265, + 4320, + 4221, + 4066, + 3947, + 3514, + 3379, + 3003, + 2635, + 2534, + 2078, + 2040, + 1950, + 1958, + 2152, + 2085, + 2390, + 2321, + 2319, + 2359, + 1851, + 1643, + 877, + 168, + -527, + -1245, + -1704, + -2519, + -2739, + -3251, + -3382, + -3236, + -3527, + -3294, + -3523, + -3732, + -3916, + -4434, + -4888, + -5615, + -6161, + -6729, + -7283, + -7543, + -7920, + -7865, + -7660, + -7430, + -7034, + -6758, + -6224, + -5866, + -5441, + -5076, + -4998, + -4760, + -4673, + -4539, + -4410, + -4308, + -4131, + -3992, + -3791, + -3611, + -3448, + -3213, + -3070, + -3046, + -3048, + -3168, + -3244, + -3354, + -3607, + -3834, + -4170, + -4439, + -4648, + -4864, + -4892, + -4928, + -4821, + -4524, + -4211, + -3576, + -2819, + -1968, + -929, + -19, + 1029, + 2064, + 2949, + 3716, + 4159, + 4450, + 4536, + 4503, + 4301, + 3968, + 3655, + 3242, + 2979, + 2856, + 2744, + 2750, + 2771, + 2749, + 2859, + 2850, + 2793, + 2702, + 2402, + 2179, + 1877, + 1672, + 1581, + 1543, + 1769, + 1967, + 2485, + 3089, + 3783, + 4662, + 5406, + 6246, + 6950, + 7542, + 8016, + 8200, + 8245, + 8027, + 7584, + 6958, + 6241, + 5494, + 4710, + 3974, + 3255, + 2653, + 2274, + 2038, + 1986, + 1964, + 2141, + 2321, + 2513, + 2772, + 2756, + 2743, + 2636, + 2406, + 2125, + 1836, + 1456, + 1247, + 1145, + 995, + 1077, + 1140, + 1290, + 1561, + 1685, + 1762, + 1609, + 1391, + 1147, + 544, + 84, + -754, + -1546, + -2107, + -2806, + -3137, + -3522, + -3732, + -3826, + -3834, + -3609, + -3493, + -3340, + -3254, + -3499, + -3621, + -3981, + -4455, + -4859, + -5513, + -6080, + -6626, + -7061, + -7372, + -7556, + -7573, + -7515, + -7366, + -7091, + -6799, + -6366, + -5887, + -5484, + -5098, + -4746, + -4334, + -3941, + -3558, + -3269, + -3053, + -2844, + -2663, + -2497, + -2314, + -2227, + -2185, + -2141, + -2139, + -2070, + -2037, + -2031, + -2062, + -2205, + -2348, + -2544, + -2774, + -2979, + -3298, + -3520, + -3647, + -3622, + -3395, + -3054, + -2513, + -1829, + -948, + 64, + 1090, + 2169, + 3127, + 3987, + 4712, + 5229, + 5560, + 5754, + 5741, + 5619, + 5401, + 5005, + 4666, + 4287, + 3967, + 3734, + 3476, + 3322, + 3203, + 3147, + 3144, + 3116, + 3080, + 3011, + 2871, + 2735, + 2544, + 2363, + 2245, + 2075, + 2032, + 2118, + 2263, + 2688, + 3066, + 3605, + 4244, + 4746, + 5384, + 5819, + 6151, + 6319, + 6194, + 5938, + 5495, + 4929, + 4305, + 3581, + 2924, + 2279, + 1713, + 1372, + 1086, + 1006, + 983, + 1006, + 1146, + 1249, + 1349, + 1360, + 1231, + 1084, + 794, + 502, + 264, + -85, + -238, + -411, + -504, + -394, + -322, + -51, + 188, + 420, + 589, + 624, + 666, + 573, + 338, + -86, + -564, + -1056, + -1560, + -1925, + -2434, + -2806, + -3017, + -3341, + -3320, + -3375, + -3480, + -3410, + -3567, + -3553, + -3595, + -3805, + -3919, + -4284, + -4482, + -4754, + -5190, + -5354, + -5806, + -6050, + -6136, + -6387, + -6343, + -6330, + -6206, + -5851, + -5468, + -4960, + -4549, + -4080, + -3542, + -3150, + -2698, + -2440, + -2318, + -2132, + -2067, + -2081, + -2017, + -2099, + -2151, + -2060, + -2067, + -1916, + -1823, + -1718, + -1523, + -1386, + -1221, + -1189, + -1141, + -1014, + -1008, + -966, + -996, + -1015, + -916, + -809, + -648, + -467, + -128, + 237, + 735, + 1358, + 1969, + 2697, + 3399, + 4060, + 4732, + 5295, + 5720, + 6077, + 6169, + 6139, + 5928, + 5614, + 5292, + 4766, + 4247, + 3705, + 3262, + 3030, + 2827, + 2702, + 2684, + 2728, + 2887, + 3092, + 3216, + 3310, + 3313, + 3214, + 3098, + 2873, + 2620, + 2343, + 2031, + 1799, + 1589, + 1491, + 1537, + 1645, + 1913, + 2210, + 2548, + 2922, + 3295, + 3650, + 3951, + 4100, + 4099, + 3972, + 3740, + 3421, + 2948, + 2427, + 1762, + 1136, + 574, + 44, + -330, + -642, + -846, + -852, + -751, + -520, + -229, + 44, + 272, + 446, + 502, + 443, + 329, + 66, + -191, + -492, + -841, + -1002, + -1240, + -1237, + -1199, + -1177, + -936, + -867, + -660, + -456, + -508, + -464, + -706, + -997, + -1265, + -1780, + -2178, + -2724, + -3270, + -3735, + -4142, + -4378, + -4609, + -4666, + -4749, + -4575, + -4355, + -4137, + -3767, + -3563, + -3218, + -2970, + -2834, + -2630, + -2716, + -2776, + -2920, + -3210, + -3363, + -3764, + -4023, + -4125, + -4268, + -4194, + -4223, + -4005, + -3639, + -3258, + -2891, + -2644, + -2297, + -1987, + -1751, + -1587, + -1570, + -1485, + -1415, + -1342, + -1194, + -1100, + -889, + -613, + -267, + 161, + 482, + 865, + 1269, + 1639, + 2005, + 2202, + 2381, + 2549, + 2628, + 2700, + 2625, + 2559, + 2481, + 2357, + 2319, + 2192, + 2142, + 2199, + 2283, + 2514, + 2670, + 2919, + 3214, + 3510, + 3830, + 3971, + 4080, + 4073, + 3911, + 3700, + 3359, + 2954, + 2549, + 2094, + 1766, + 1556, + 1442, + 1462, + 1560, + 1808, + 2070, + 2357, + 2606, + 2730, + 2831, + 2737, + 2582, + 2309, + 1931, + 1585, + 1178, + 834, + 529, + 288, + 214, + 218, + 302, + 470, + 679, + 944, + 1211, + 1420, + 1562, + 1674, + 1631, + 1548, + 1355, + 1072, + 776, + 375, + 25, + -320, + -614, + -818, + -992, + -991, + -906, + -755, + -525, + -291, + -17, + 225, + 447, + 528, + 546, + 466, + 270, + 96, + -205, + -536, + -861, + -1148, + -1383, + -1586, + -1688, + -1814, + -1783, + -1772, + -1745, + -1630, + -1611, + -1505, + -1488, + -1462, + -1409, + -1519, + -1489, + -1609, + -1723, + -1755, + -1977, + -2042, + -2132, + -2215, + -2184, + -2268, + -2205, + -2170, + -2107, + -1978, + -1990, + -1909, + -1886, + -1943, + -1997, + -2152, + -2326, + -2500, + -2762, + -2987, + -3227, + -3392, + -3522, + -3630, + -3579, + -3469, + -3262, + -2916, + -2555, + -2103, + -1581, + -1090, + -531, + -20, + 457, + 873, + 1228, + 1561, + 1809, + 1999, + 2105, + 2139, + 2196, + 2201, + 2149, + 2113, + 2038, + 1990, + 1913, + 1787, + 1705, + 1595, + 1490, + 1372, + 1201, + 1113, + 998, + 917, + 917, + 894, + 961, + 1007, + 1098, + 1321, + 1470, + 1681, + 1882, + 2067, + 2317, + 2465, + 2626, + 2750, + 2777, + 2783, + 2694, + 2569, + 2431, + 2142, + 1843, + 1597, + 1306, + 1069, + 824, + 622, + 532, + 430, + 388, + 357, + 377, + 438, + 414, + 481, + 468, + 431, + 454, + 383, + 374, + 305, + 207, + 187, + 133, + 157, + 115, + 113, + 206, + 244, + 382, + 475, + 591, + 753, + 821, + 916, + 908, + 855, + 754, + 577, + 399, + 123, + -159, + -399, + -647, + -784, + -923, + -1010, + -965, + -918, + -806, + -647, + -504, + -355, + -253, + -179, + -130, + -138, + -156, + -262, + -339, + -401, + -552, + -600, + -671, + -697, + -662, + -673, + -616, + -597, + -522, + -495, + -513, + -490, + -624, + -701, + -804, + -961, + -1073, + -1328, + -1503, + -1656, + -1798, + -1801, + -1913, + -1863, + -1785, + -1720, + -1453, + -1309, + -1051, + -846, + -715, + -487, + -457, + -357, + -331, + -400, + -427, + -627, + -765, + -873, + -1021, + -1105, + -1255, + -1312, + -1357, + -1370, + -1288, + -1261, + -1165, + -1139, + -1062, + -917, + -808, + -680, + -597, + -452, + -277, + -104, + 122, + 312, + 558, + 771, + 919, + 1110, + 1205, + 1312, + 1355, + 1302, + 1280, + 1151, + 1049, + 946, + 818, + 733, + 569, + 451, + 429, + 388, + 408, + 387, + 376, + 426, + 463, + 542, + 576, + 632, + 666, + 673, + 740, + 766, + 791, + 845, + 829, + 857, + 841, + 822, + 835, + 796, + 773, + 671, + 600, + 560, + 484, + 460, + 371, + 311, + 284, + 242, + 277, + 261, + 261, + 277, + 273, + 358, + 380, + 410, + 433, + 435, + 471, + 432, + 414, + 386, + 330, + 294, + 194, + 149, + 108, + 69, + 84, + 69, + 92, + 83, + 75, + 88, + 53, + 12, + -96, + -194, + -269, + -369, + -438, + -523, + -553, + -528, + -500, + -392, + -277, + -136, + 53, + 240, + 466, + 678, + 870, + 1050, + 1178, + 1294, + 1336, + 1310, + 1247, + 1080, + 916, + 677, + 387, + 120, + -182, + -471, + -740, + -972, + -1148, + -1273, + -1343, + -1402, + -1363, + -1263, + -1129, + -922, + -724, + -518, + -288, + -79, + 111, + 250, + 364, + 405, + 405, + 395, + 284, + 199, + 83, + -43, + -126, + -244, + -313, + -400, + -451, + -497, + -610, + -672, + -807, + -951, + -1087, + -1325, + -1517, + -1736, + -1929, + -2086, + -2260, + -2318, + -2356, + -2271, + -2125, + -1967, + -1685, + -1379, + -1000, + -598, + -238, + 149, + 481, + 790, + 1042, + 1185, + 1287, + 1274, + 1195, + 1068, + 868, + 654, + 386, + 138, + -65, + -273, + -450, + -598, + -665, + -670, + -669, + -620, + -553, + -425, + -288, + -179, + -72, + 15, + 122, + 205, + 263, + 324, + 357, + 435, + 518, + 603, + 709, + 779, + 892, + 1006, + 1107, + 1170, + 1183, + 1190, + 1173, + 1116, + 1016, + 890, + 750, + 628, + 488, + 331, + 197, + 95, + 43, + 25, + 1, + 22, + 97, + 209, + 363, + 495, + 615, + 724, + 833, + 937, + 984, + 990, + 933, + 884, + 851, + 747, + 678, + 573, + 497, + 469, + 401, + 391, + 352, + 339, + 352, + 337, + 354, + 361, + 370, + 402, + 411, + 418, + 440, + 468, + 526, + 576, + 619, + 683, + 766, + 857, + 965, + 1038, + 1114, + 1159, + 1172, + 1167, + 1106, + 1006, + 840, + 644, + 426, + 177, + -110, + -390, + -665, + -929, + -1160, + -1375, + -1497, + -1550, + -1592, + -1553, + -1507, + -1394, + -1201, + -1084, + -863, + -685, + -540, + -322, + -234, + -68, + 29, + 59, + 160, + 141, + 170, + 140, + 79, + 77, + -11, + -53, + -179, + -274, + -327, + -480, + -564, + -736, + -884, + -995, + -1185, + -1300, + -1461, + -1617, + -1711, + -1832, + -1831, + -1863, + -1865, + -1776, + -1691, + -1516, + -1353, + -1168, + -954, + -729, + -490, + -305, + -93, + 81, + 211, + 322, + 364, + 392, + 384, + 332, + 264, + 146, + 29, + -101, + -230, + -357, + -486, + -616, + -705, + -752, + -801, + -809, + -788, + -750, + -654, + -546, + -456, + -328, + -200, + -78, + 45, + 137, + 232, + 316, + 388, + 447, + 485, + 528, + 578, + 630, + 697, + 760, + 835, + 910, + 988, + 1068, + 1124, + 1154, + 1157, + 1166, + 1163, + 1116, + 1070, + 1024, + 994, + 986, + 988, + 1030, + 1110, + 1212, + 1303, + 1411, + 1498, + 1551, + 1599, + 1587, + 1565, + 1481, + 1336, + 1212, + 1028, + 847, + 669, + 466, + 330, + 187, + 61, + -9, + -54, + -55, + -20, + 11, + 69, + 133, + 195, + 244, + 253, + 225, + 182, + 133, + 62, + -11, + -96, + -168, + -199, + -214, + -213, + -197, + -167, + -127, + -105, + -86, + -83, + -109, + -140, + -217, + -323, + -448, + -588, + -717, + -854, + -971, + -1086, + -1185, + -1211, + -1227, + -1180, + -1135, + -1099, + -992, + -918, + -788, + -704, + -651, + -562, + -542, + -470, + -421, + -431, + -391, + -429, + -386, + -344, + -336, + -260, + -257, + -162, + -61, + -6, + 100, + 120, + 178, + 215, + 179, + 132, + 15, + -106, + -238, + -416, + -595, + -765, + -929, + -1066, + -1170, + -1252, + -1278, + -1290, + -1258, + -1173, + -1114, + -1012, + -945, + -868, + -741, + -695, + -612, + -547, + -494, + -388, + -332, + -225, + -110, + 22, + 182, + 318, + 496, + 677, + 835, + 992, + 1104, + 1162, + 1166, + 1133, + 1054, + 916, + 709, + 430, + 164, + -90, + -340, + -600, + -853, + -1033, + -1135, + -1177, + -1146, + -1079, + -946, + -746, + -500, + -208, + 83, + 377, + 673, + 950, + 1183, + 1356, + 1503, + 1627, + 1707, + 1735, + 1708, + 1678, + 1668, + 1645, + 1588, + 1494, + 1419, + 1354, + 1291, + 1194, + 1052, + 900, + 718, + 524, + 325, + 110, + -114, + -330, + -500, + -630, + -729, + -803, + -834, + -795, + -727, + -627, + -492, + -325, + -125, + 54, + 238, + 393, + 528, + 642, + 691, + 706, + 661, + 585, + 504, + 380, + 245, + 87, + -61, + -195, + -320, + -435, + -556, + -663, + -742, + -814, + -883, + -952, + -1009, + -1038, + -1047, + -1067, + -1063, + -1050, + -1020, + -949, + -888, + -795, + -698, + -574, + -405, + -257, + -70, + 68, + 203, + 381, + 479, + 580, + 619, + 623, + 645, + 565, + 492, + 364, + 206, + 106, + -71, + -191, + -331, + -460, + -469, + -527, + -471, + -441, + -386, + -222, + -123, + 60, + 168, + 245, + 404, + 470, + 596, + 605, + 581, + 633, + 548, + 562, + 468, + 355, + 334, + 192, + 161, + 62, + -36, + -39, + -146, + -121, + -167, + -243, + -229, + -302, + -276, + -327, + -415, + -419, + -444, + -396, + -433, + -455, + -407, + -357, + -244, + -221, + -158, + -63, + 36, + 172, + 210, + 296, + 326, + 351, + 424, + 367, + 369, + 300, + 224, + 235, + 124, + 54, + -39, + -122, + -118, + -239, + -304, + -360, + -403, + -361, + -418, + -427, + -394, + -342, + -259, + -232, + -176, + -110, + -48, + 27, + 48, + 78, + 90, + 86, + 91, + 76, + 57, + -1, + -34, + -53, + -103, + -151, + -209, + -239, + -261, + -319, + -354, + -372, + -382, + -385, + -411, + -432, + -428, + -431, + -446, + -471, + -496, + -512, + -532, + -562, + -570, + -567, + -543, + -499, + -457, + -379, + -290, + -204, + -94, + -11, + 78, + 155, + 196, + 234, + 222, + 198, + 160, + 113, + 64, + 5, + -57, + -108, + -136, + -175, + -186, + -196, + -184, + -125, + -90, + -25, + 58, + 146, + 271, + 372, + 472, + 562, + 636, + 709, + 741, + 760, + 752, + 730, + 710, + 688, + 655, + 608, + 595, + 570, + 556, + 540, + 517, + 513, + 511, + 497, + 481, + 449, + 417, + 401, + 347, + 325, + 295, + 248, + 261, + 238, + 250, + 294, + 295, + 367, + 380, + 416, + 454, + 430, + 479, + 443, + 431, + 430, + 386, + 397, + 333, + 292, + 238, + 176, + 153, + 54, + 24, + -37, + -84, + -109, + -172, + -155, + -199, + -220, + -219, + -261, + -227, + -255, + -280, + -266, + -293, + -277, + -273, + -243, + -214, + -221, + -179, + -153, + -130, + -109, + -154, + -149, + -151, + -155, + -186, + -243, + -253, + -311, + -326, + -358, + -434, + -427, + -491, + -533, + -554, + -598, + -596, + -655, + -668, + -679, + -714, + -671, + -694, + -643, + -607, + -602, + -532, + -496, + -409, + -408, + -377, + -309, + -289, + -211, + -223, + -196, + -145, + -147, + -104, + -157, + -123, + -125, + -177, + -152, + -229, + -192, + -204, + -243, + -213, + -259, + -194, + -190, + -172, + -98, + -123, + -43, + -12, + 41, + 103, + 87, + 148, + 150, + 166, + 154, + 113, + 118, + 80, + 54, + 8, + 4, + 25, + 12, + 59, + 70, + 162, + 260, + 305, + 387, + 427, + 501, + 549, + 564, + 571, + 517, + 488, + 423, + 355, + 294, + 206, + 165, + 113, + 92, + 77, + 62, + 115, + 116, + 154, + 162, + 171, + 218, + 210, + 221, + 208, + 192, + 215, + 176, + 169, + 114, + 89, + 89, + 52, + 62, + 29, + 35, + 73, + 98, + 167, + 195, + 261, + 325, + 349, + 401, + 382, + 393, + 368, + 302, + 254, + 174, + 104, + 6, + -78, + -136, + -203, + -229, + -291, + -303, + -284, + -294, + -241, + -235, + -222, + -186, + -187, + -156, + -160, + -149, + -122, + -114, + -71, + -44, + -28, + 6, + 20, + 47, + 57, + 54, + 52, + 55, + 53, + 23, + 9, + -16, + -59, + -86, + -158, + -223, + -292, + -372, + -421, + -498, + -532, + -561, + -570, + -531, + -512, + -456, + -367, + -297, + -206, + -125, + -37, + 26, + 88, + 147, + 157, + 188, + 169, + 152, + 152, + 131, + 99, + 62, + 44, + 46, + 53, + 61, + 61, + 79, + 110, + 159, + 175, + 185, + 237, + 220, + 278, + 276, + 239, + 264, + 203, + 190, + 138, + 70, + 34, + -9, + 18, + 1, + 10, + 71, + 115, + 191, + 220, + 255, + 265, + 296, + 319, + 270, + 266, + 214, + 189, + 187, + 155, + 145, + 123, + 149, + 166, + 172, + 186, + 179, + 195, + 213, + 201, + 182, + 161, + 150, + 116, + 76, + 41, + -29, + -58, + -101, + -183, + -209, + -269, + -314, + -342, + -385, + -379, + -380, + -348, + -304, + -273, + -197, + -144, + -88, + -28, + -5, + 11, + 20, + 27, + -5, + -24, + -22, + -61, + -73, + -87, + -124, + -118, + -133, + -150, + -160, + -198, + -196, + -219, + -228, + -239, + -281, + -276, + -275, + -288, + -277, + -305, + -324, + -302, + -294, + -292, + -266, + -261, + -224, + -203, + -210, + -190, + -198, + -176, + -180, + -201, + -196, + -198, + -175, + -166, + -151, + -127, + -114, + -59, + -48, + -8, + 39, + 75, + 126, + 131, + 168, + 160, + 152, + 142, + 82, + 36, + -13, + -49, + -81, + -105, + -105, + -103, + -65, + -38, + -16, + 19, + 33, + 67, + 82, + 95, + 110, + 98, + 111, + 98, + 87, + 67, + 54, + 66, + 52, + 49, + 53, + 71, + 106, + 139, + 186, + 224, + 270, + 320, + 361, + 413, + 433, + 462, + 473, + 478, + 480, + 459, + 441, + 391, + 339, + 298, + 239, + 206, + 159, + 149, + 120, + 114, + 117, + 95, + 106, + 81, + 67, + 61, + 30, + 11, + -29, + -42, + -76, + -97, + -98, + -124, + -107, + -107, + -103, + -69, + -71, + -36, + -12, + 23, + 69, + 86, + 129, + 152, + 158, + 162, + 152, + 127, + 81, + 48, + -9, + -80, + -120, + -172, + -201, + -225, + -276, + -297, + -311, + -330, + -339, + -361, + -375, + -389, + -376, + -365, + -374, + -378, + -375, + -370, + -358, + -347, + -355, + -338, + -314, + -289, + -244, + -212, + -168, + -129, + -80, + -26, + -12, + 47, + 79, + 92, + 105, + 105, + 113, + 99, + 85, + 29, + -18, + -53, + -110, + -133, + -167, + -186, + -196, + -199, + -176, + -177, + -150, + -122, + -106, + -73, + -61, + -30, + -34, + -29, + -40, + -68, + -63, + -85, + -84, + -71, + -65, + -40, + -16, + 23, + 56, + 87, + 144, + 167, + 196, + 206, + 221, + 243, + 226, + 233, + 210, + 192, + 190, + 150, + 140, + 110, + 91, + 77, + 43, + 27, + -10, + -5, + -5, + -22, + -9, + -7, + 27, + 48, + 59, + 64, + 70, + 87, + 104, + 139, + 151, + 188, + 239, + 270, + 317, + 311, + 336, + 349, + 341, + 330, + 274, + 254, + 223, + 195, + 163, + 102, + 81, + 43, + 20, + 8, + -37, + -28, + -31, + -29, + -21, + -39, + -16, + -22, + -11, + -21, + -41, + -32, + -47, + -39, + -60, + -75, + -71, + -94, + -98, + -131, + -147, + -139, + -145, + -146, + -165, + -150, + -136, + -112, + -90, + -106, + -86, + -91, + -87, + -98, + -136, + -121, + -135, + -124, + -132, + -144, + -114, + -108, + -87, + -74, + -75, + -50, + -30, + -5, + -18, + -24, + -3, + -3, + -6, + -41, + -76, + -98, + -127, + -159, + -215, + -257, + -263, + -268, + -266, + -262, + -237, + -194, + -144, + -113, + -99, + -61, + -28, + 12, + 21, + 46, + 76, + 92, + 130, + 115, + 123, + 132, + 135, + 149, + 134, + 133, + 132, + 135, + 138, + 94, + 76, + 51, + 19, + -15, + -72, + -98, + -125, + -135, + -154, + -174, + -171, + -164, + -139, + -130, + -99, + -74, + -40, + 9, + 34, + 86, + 129, + 176, + 214, + 226, + 245, + 250, + 280, + 271, + 256, + 250, + 226, + 234, + 212, + 187, + 178, + 148, + 144, + 104, + 79, + 64, + 37, + 36, + 9, + -10, + -23, + -38, + -35, + -62, + -67, + -67, + -82, + -70, + -80, + -75, + -59, + -34, + -3, + 9, + 48, + 76, + 101, + 120, + 120, + 123, + 126, + 131, + 112, + 92, + 77, + 61, + 54, + 32, + 3, + -18, + -28, + -39, + -56, + -71, + -91, + -92, + -100, + -124, + -134, + -142, + -144, + -155, + -177, + -178, + -175, + -171, + -168, + -160, + -141, + -123, + -89, + -73, + -64, + -46, + -39, + -18, + -19, + -34, + -32, + -46, + -51, + -63, + -74, + -73, + -81, + -70, + -83, + -71, + -49, + -39, + -12, + -1, + 30, + 48, + 65, + 94, + 100, + 125, + 136, + 148, + 156, + 138, + 140, + 124, + 115, + 86, + 58, + 57, + 32, + 43, + 40, + 44, + 63, + 60, + 83, + 90, + 99, + 115, + 113, + 135, + 140, + 148, + 164, + 172, + 187, + 182, + 190, + 183, + 171, + 171, + 146, + 139, + 121, + 105, + 94, + 61, + 46, + 17, + -6, + -34, + -70, + -89, + -121, + -138, + -158, + -178, + -190, + -206, + -206, + -210, + -214, + -204, + -196, + -173, + -154, + -128, + -97, + -81, + -58, + -51, + -46, + -38, + -47, + -49, + -57, + -58, + -57, + -59, + -49, + -58, + -58, + -54, + -60, + -48, + -65, + -72, + -72, + -78, + -70, + -77, + -73, + -76, + -79, + -76, + -90, + -90, + -91, + -88, + -76, + -67, + -43, + -16, + 6, + 27, + 39, + 55, + 69, + 71, + 74, + 65, + 56, + 60, + 47, + 37, + 27, + 8, + -5, + -29, + -50, + -71, + -89, + -96, + -114, + -111, + -113, + -115, + -105, + -112, + -90, + -78, + -68, + -49, + -46, + -26, + -14, + 5, + 18, + 10, + 14, + 3, + 5, + -9, + -20, + -15, + -30, + -26, + -33, + -31, + -23, + -23, + -12, + -21, + -20, + -16, + -23, + -20, + -13, + -7, + 6, + 28, + 47, + 69, + 96, + 115, + 134, + 147, + 154, + 166, + 174, + 186, + 196, + 202, + 204, + 198, + 193, + 181, + 164, + 144, + 125, + 113, + 102, + 96, + 90, + 92, + 91, + 96, + 99, + 99, + 100, + 99, + 99, + 93, + 94, + 86, + 68, + 55, + 44, + 36, + 22, + 13, + 15, + 13, + 15, + 21, + 16, + 11, + 3, + -15, + -31, + -50, + -75, + -105, + -125, + -145, + -154, + -155, + -164, + -178, + -189, + -186, + -177, + -174, + -169, + -152, + -134, + -114, + -93, + -65, + -42, + -23, + -4, + -1, + 6, + 6, + 2, + -4, + -18, + -26, + -25, + -25, + -23, + -32, + -31, + -33, + -39, + -50, + -68, + -69, + -74, + -79, + -78, + -83, + -85, + -85, + -77, + -71, + -61, + -42, + -27, + -3, + 28, + 59, + 95, + 123, + 146, + 155, + 160, + 162, + 144, + 130, + 112, + 94, + 82, + 67, + 60, + 46, + 35, + 35, + 22, + 4, + -14, + -27, + -35, + -45, + -52, + -61, + -62, + -65, + -68, + -55, + -52, + -43, + -38, + -34, + -20, + -8, + 8, + 18, + 24, + 34, + 36, + 37, + 42, + 46, + 51, + 50, + 58, + 76, + 75, + 70, + 67, + 58, + 53, + 48, + 36, + 23, + 18, + 10, + 3, + 9, + 14, + 24, + 39, + 43, + 53, + 62, + 63, + 66, + 62, + 66, + 64, + 59, + 51, + 25, + 19, + 6, + -10, + -19, + -26, + -35, + -43, + -44, + -37, + -47, + -43, + -50, + -54, + -60, + -69, + -75, + -84, + -91, + -93, + -98, + -96, + -99, + -91, + -87, + -91, + -88, + -84, + -80, + -75, + -61, + -48, + -44, + -40, + -37, + -34, + -45, + -52, + -58, + -72, + -82, + -84, + -78, + -68, + -65, + -63, + -51, + -42, + -27, + -22, + -13, + -3, + 8, + 20, + 26, + 31, + 31, + 37, + 33, + 29, + 33, + 31, + 32, + 31, + 34, + 44, + 55, + 68, + 74, + 69, + 75, + 73, + 72, + 65, + 63, + 67, + 70, + 83, + 81, + 81, + 85, + 84, + 80, + 75, + 69, + 53, + 44, + 36, + 27, + 20, + 11, + 1, + -4, + -19, + -26, + -27, + -25, + -21, + -14, + -12, + -12, + -14, + -9, + -21, + -29, + -40, + -50, + -50, + -54, + -46, + -35, + -17, + -4, + -1, + 7, + 20, + 28, + 26, + 22, + 23, + 21, + 23, + 18, + 13, + 12, + 7, + 6, + 3, + 2, + -1, + -1, + 4, + 6, + 17, + 29, + 35, + 34, + 34, + 32, + 28, + 33, + 26, + 22, + 16, + 16, + 22, + 20, + 13, + -1, + -1, + -7, + -15, + -20, + -30, + -32, + -38, + -39, + -45, + -45, + -53, + -63, + -70, + -83, + -96, + -107, + -113, + -122, + -122, + -118, + -114, + -114, + -113, + -112, + -111, + -110, + -107, + -103, + -102, + -94, + -80, + -71, + -58, + -52, + -47, + -40, + -43, + -47, + -48, + -50, + -39, + -46, + -44, + -44, + -44, + -43, + -45, + -41, + -40, + -34, + -32, + -23, + -12, + -6, + -1, + -1, + 6, + 12, + 18, + 20, + 22, + 32, + 48, + 65, + 80, + 93, + 109, + 122, + 128, + 131, + 135, + 135, + 129, + 126, + 130, + 127, + 124, + 125, + 121, + 122, + 115, + 118, + 122, + 128, + 137, + 143, + 143, + 141, + 142, + 134, + 131, + 121, + 109, + 105, + 97, + 93, + 99, + 96, + 96, + 94, + 83, + 84, + 80, + 77, + 66, + 59, + 46, + 42, + 44, + 32, + 28, + 20, + 12, + 8, + 4, + 4, + 5, + 3, + -4, + -7, + -6, + -14, + -19, + -24, + -34, + -40, + -45, + -52, + -61, + -62, + -60, + -57, + -57, + -61, + -63, + -61, + -65, + -73, + -81, + -89, + -94, + -93, + -89, + -87, + -82, + -82, + -84, + -81, + -86, + -82, + -84, + -86, + -90, + -86, + -83, + -82, + -81, + -80, + -80, + -76, + -75, + -76, + -70, + -69, + -68, + -61, + -53, + -50, + -43, + -38, + -42, + -43, + -41, + -41, + -39, + -34, + -27, + -21, + -16, + -20, + -22, + -27, + -36, + -39, + -38, + -40, + -37, + -35, + -28, + -14, + -6, + -3, + -2, + 2, + 4, + 5, + 15, + 18, + 25, + 35, + 36, + 41, + 45, + 48, + 52, + 54, + 52, + 50, + 60, + 67, + 76, + 85, + 85, + 90, + 86, + 83, + 84, + 77, + 77, + 72, + 77, + 81, + 89, + 91, + 93, + 99, + 101, + 102, + 98, + 94, + 87, + 77, + 70, + 69, + 63, + 62, + 55, + 59, + 58, + 54, + 51, + 53, + 57, + 62, + 65, + 60, + 54, + 48, + 45, + 40, + 29, + 17, + 8, + -3, + -14, + -17, + -18, + -20, + -25, + -34, + -40, + -44, + -53, + -56, + -63, + -71, + -71, + -69, + -66, + -62, + -66, + -67, + -68, + -71, + -75, + -79, + -79, + -73, + -67, + -60, + -49, + -46, + -45, + -45, + -46, + -55, + -64, + -67, + -72, + -74, + -70, + -68, + -67, + -69, + -70, + -64, + -56, + -55, + -54, + -51, + -41, + -30, + -26, + -28, + -29, + -30, + -28, + -25, + -27, + -20, + -12, + -5, + -2, + 2, + 3, + -3, + 0, + -7, + -8, + -14, + -15, + -9, + -7, + 4, + 12, + 24, + 36, + 41, + 52, + 58, + 59, + 51, + 45, + 48, + 44, + 46, + 43, + 40, + 42, + 47, + 53, + 52, + 52, + 63, + 69, + 74, + 75, + 80, + 78, + 69, + 68, + 59, + 60, + 54, + 54, + 54, + 58, + 66, + 71, + 78, + 78, + 75, + 78, + 72, + 71, + 61, + 55, + 53, + 42, + 36, + 31, + 28, + 29, + 23, + 19, + 25, + 27, + 27, + 23, + 29, + 29, + 20, + 11, + 5, + -4, + -10, + -31, + -38, + -39, + -36, + -33, + -27, + -17, + -15, + -14, + -17, + -13, + -14, + -25, + -33, + -44, + -51, + -61, + -63, + -63, + -65, + -67, + -66, + -63, + -59, + -52, + -48, + -45, + -44, + -50, + -62, + -74, + -84, + -89, + -100, + -101, + -102, + -96, + -95, + -85, + -76, + -78, + -72, + -71, + -66, + -61, + -63, + -60, + -62, + -72, + -69, + -69, + -58, + -56, + -50, + -37, + -28, + -17, + -17, + -16, + -17, + -18, + -18, + -13, + -7, + -4, + 6, + 17, + 23, + 25, + 28, + 24, + 21, + 17, + 21, + 27, + 30, + 33, + 35, + 46, + 49, + 48, + 54, + 56, + 57, + 58, + 60, + 64, + 62, + 64, + 66, + 67, + 64, + 70, + 77, + 83, + 82, + 84, + 88, + 89, + 95, + 86, + 75, + 64, + 51, + 36, + 29, + 26, + 21, + 26, + 31, + 38, + 40, + 55, + 63, + 65, + 65, + 64, + 60, + 54, + 54, + 49, + 41, + 34, + 26, + 21, + 9, + 6, + 6, + 5, + -1, + 3, + 5, + 3, + 2, + -4, + -13, + -13, + -24, + -32, + -33, + -36, + -33, + -24, + -18, + -15, + -9, + -5, + -5, + -14, + -17, + -24, + -34, + -36, + -42, + -43, + -36, + -42, + -43, + -43, + -38, + -36, + -27, + -20, + -23, + -21, + -28, + -25, + -22, + -24, + -25, + -23, + -22, + -30, + -31, + -26, + -25, + -20, + -15, + -8, + -10, + -11, + -13, + -18, + -22, + -30, + -36, + -35, + -39, + -35, + -34, + -27, + -24, + -19, + -15, + -7, + -6, + -7, + -2, + 0, + 7, + 12, + 14, + 19, + 20, + 26, + 26, + 24, + 16, + 10, + 4, + 1, + 3, + 2, + 9, + 11, + 17, + 19, + 27, + 31, + 31, + 32, + 30, + 27, + 25, + 28, + 27, + 25, + 22, + 23, + 23, + 20, + 21, + 25, + 36, + 38, + 40, + 43, + 40, + 32, + 27, + 20, + 9, + 4, + 1, + 12, + 27, + 37, + 49, + 63, + 73, + 72, + 73, + 70, + 67, + 53, + 39, + 33, + 26, + 23, + 13, + 9, + 6, + 0, + -2, + -3, + 0, + -1, + 0, + -1, + -4, + -9, + -16, + -22, + -21, + -24, + -21, + -19, + -12, + -3, + 0, + 12, + 14, + 13, + 3, + -6, + -13, + -27, + -34, + -42, + -41, + -44, + -42, + -43, + -46, + -42, + -40, + -39, + -36, + -31, + -29, + -30, + -22, + -19, + -21, + -20, + -17, + -17, + -22, + -31, + -41, + -45, + -54, + -65, + -64, + -68, + -70, + -74, + -70, + -64, + -62, + -61, + -60, + -58, + -52, + -46, + -43, + -37, + -35, + -40, + -41, + -47, + -52, + -58, + -62, + -61, + -53, + -54, + -46, + -41, + -40, + -34, + -29, + -20, + -15, + -8, + 2, + 12, + 28, + 35, + 41, + 42, + 42, + 43, + 41, + 43, + 39, + 45, + 44, + 46, + 55, + 54, + 55, + 55, + 51, + 48, + 42, + 43, + 39, + 40, + 46, + 54, + 65, + 70, + 76, + 81, + 86, + 89, + 79, + 73, + 70, + 62, + 56, + 52, + 39, + 32, + 28, + 17, + 18, + 19, + 18, + 15, + 19, + 20, + 15, + 13, + 13, + 10, + 6, + 5, + 12, + 10, + 15, + 20, + 24, + 30, + 31, + 28, + 22, + 17, + 2, + -15, + -24, + -39, + -52, + -53, + -55, + -46, + -40, + -34, + -26, + -21, + -22, + -31, + -32, + -38, + -36, + -35, + -32, + -33, + -34, + -30, + -28, + -27, + -35, + -40, + -42, + -45, + -44, + -45, + -44, + -52, + -54, + -57, + -57, + -53, + -60, + -63, + -63, + -65, + -51, + -45, + -40, + -40, + -39, + -39, + -43, + -44, + -46, + -52, + -46, + -51, + -49, + -45, + -45, + -47, + -47, + -45, + -50, + -47, + -40, + -35, + -32, + -24, + -17, + -19, + -14, + -13, + -9, + -7, + -7, + -7, + -9, + 0, + 3, + 7, + 13, + 12, + 14, + 15, + 13, + 6, + -1, + -3, + -9, + -10, + -5, + -2, + 6, + 9, + 11, + 12, + 15, + 19, + 24, + 37, + 47, + 47, + 56, + 53, + 51, + 52, + 52, + 47, + 39, + 38, + 40, + 41, + 43, + 44, + 42, + 43, + 42, + 41, + 43, + 40, + 41, + 35, + 37, + 39, + 40, + 41, + 38, + 30, + 21, + 14, + 5, + 2, + -1, + -2, + 1, + -2, + 6, + 2, + 4, + 2, + -1, + -11, + -16, + -23, + -25, + -20, + -18, + -25, + -27, + -32, + -27, + -24, + -16, + -15, + -11, + -9, + -3, + -4, + -2, + -9, + -10, + -18, + -28, + -33, + -38, + -37, + -41, + -41, + -33, + -24, + -22, + -25, + -25, + -25, + -24, + -33, + -38, + -42, + -52, + -57, + -55, + -50, + -51, + -53, + -52, + -48, + -49, + -49, + -53, + -55, + -58, + -51, + -34, + -19, + -12, + -12, + -5, + 1, + 1, + 0, + -6, + -2, + -10, + -11, + -11, + -6, + 0, + -6, + 2, + -2, + -6, + 2, + 5, + 16, + 18, + 18, + 21, + 16, + 18, + 18, + 20, + 20, + 13, + 18, + 9, + 7, + 12, + 7, + 8, + 10, + 16, + 17, + 18, + 23, + 26, + 36, + 44, + 51, + 55, + 60, + 64, + 69, + 68, + 71, + 70, + 62, + 58, + 52, + 44, + 35, + 31, + 34, + 32, + 33, + 36, + 37, + 38, + 41, + 47, + 55, + 56, + 58, + 60, + 60, + 57, + 48, + 41, + 29, + 19, + 7, + 4, + 8, + 9, + 10, + 8, + 13, + 15, + 13, + 8, + 8, + 6, + 4, + 10, + 8, + -4, + -6, + -9, + -20, + -28, + -39, + -38, + -27, + -24, + -22, + -19, + -23, + -32, + -35, + -36, + -41, + -48, + -51, + -50, + -52, + -55, + -60, + -67, + -72, + -76, + -84, + -82, + -80, + -81, + -75, + -64, + -50, + -36, + -28, + -18, + -14, + -12, + -15, + -12, + -18, + -24, + -21, + -22, + -19, + -21, + -19, + -22, + -20, + -18, + -16, + -17, + -19, + -15, + -7, + 1, + 0, + 0, + 9, + 14, + 20, + 24, + 20, + 16, + 17, + 20, + 20, + 25, + 27, + 26, + 32, + 33, + 35, + 38, + 42, + 38, + 37, + 39, + 46, + 44, + 43, + 45, + 45, + 42, + 37, + 34, + 25, + 21, + 22, + 33, + 44, + 49, + 54, + 53, + 58, + 54, + 51, + 46, + 40, + 37, + 37, + 39, + 34, + 37, + 39, + 31, + 39, + 38, + 36, + 35, + 32, + 33, + 33, + 32, + 28, + 23, + 18, + 22, + 28, + 31, + 27, + 18, + 3, + 4, + 0, + -4, + -7, + -15, + -18, + -24, + -32, + -34, + -39, + -42, + -36, + -31, + -24, + -12, + -10, + -10, + -13, + -20, + -28, + -34, + -44, + -49, + -50, + -53, + -56, + -54, + -52, + -53, + -47, + -43, + -41, + -45, + -41, + -38, + -38, + -33, + -32, + -34, + -35, + -33, + -40, + -45, + -53, + -62, + -61, + -67, + -72, + -70, + -67, + -68, + -59, + -51, + -47, + -38, + -31, + -20, + -13, + -13, + -13, + -14, + -17, + -21, + -22, + -29, + -31, + -27, + -23, + -13, + -6, + 4, + 12, + 17, + 25, + 23, + 23, + 25, + 30, + 30, + 32, + 31, + 28, + 27, + 18, + 14, + 13, + 3, + 5, + 7, + 19, + 35, + 47, + 61, + 70, + 84, + 90, + 95, + 92, + 94, + 89, + 77, + 71, + 66, + 59, + 50, + 51, + 50, + 51, + 53, + 56, + 65, + 67, + 69, + 75, + 74, + 69, + 67, + 56, + 51, + 44, + 34, + 25, + 17, + 10, + 6, + 7, + 7, + 4, + 6, + -1, + -1, + -2, + -9, + -9, + -9, + -7, + -5, + 1, + -2, + -5, + -11, + -19, + -27, + -39, + -38, + -44, + -45, + -48, + -48, + -54, + -59, + -53, + -51, + -49, + -52, + -50, + -50, + -47, + -42, + -32, + -28, + -28, + -26, + -27, + -34, + -40, + -40, + -36, + -37, + -37, + -34, + -37, + -36, + -41, + -36, + -40, + -46, + -48, + -52, + -47, + -44, + -40, + -40, + -38, + -43, + -43, + -47, + -59, + -62, + -59, + -59, + -51, + -41, + -29, + -19, + -8, + -2, + 1, + 1, + -4, + -9, + -19, + -23, + -29, + -29, + -25, + -23, + -15, + -7, + -2, + 6, + 8, + 15, + 27, + 35, + 43, + 40, + 36, + 35, + 32, + 25, + 22, + 19, + 17, + 13, + 13, + 21, + 25, + 28, + 36, + 44, + 50, + 57, + 56, + 58, + 59, + 62, + 66, + 70, + 73, + 69, + 66, + 66, + 66, + 62, + 53, + 48, + 44, + 38, + 39, + 44, + 52, + 51, + 55, + 57, + 52, + 49, + 44, + 36, + 26, + 16, + 13, + 13, + 14, + 14, + 17, + 14, + 10, + 6, + -5, + -14, + -23, + -24, + -21, + -28, + -25, + -27, + -29, + -29, + -33, + -33, + -39, + -42, + -43, + -41, + -40, + -43, + -46, + -45, + -43, + -42, + -41, + -41, + -46, + -46, + -52, + -52, + -52, + -59, + -63, + -70, + -68, + -73, + -77, + -73, + -68, + -66, + -62, + -64, + -66, + -58, + -54, + -51, + -52, + -48, + -47, + -43, + -40, + -39, + -33, + -26, + -19, + -17, + -16, + -17, + -14, + -9, + -10, + -3, + 5, + 5, + 9, + 5, + 9, + 8, + 4, + 3, + 0, + -5, + -10, + -3, + 2, + 8, + 14, + 16, + 20, + 27, + 39, + 40, + 44, + 48, + 43, + 39, + 34, + 29, + 22, + 12, + 8, + 5, + 0, + -2, + -3, + 5, + 12, + 16, + 19, + 22, + 25, + 28, + 35, + 28, + 30, + 31, + 30, + 39, + 43, + 47, + 43, + 42, + 41, + 41, + 41, + 37, + 37, + 39, + 37, + 38, + 43, + 44, + 41, + 43, + 34, + 28, + 25, + 23, + 30, + 34, + 32, + 33, + 29, + 21, + 18, + 13, + 14, + 11, + 3, + 2, + 1, + 3, + 1, + -1, + 0, + -3, + -1, + -3, + -8, + -9, + -7, + -9, + -2, + 0, + -3, + 0, + 1, + 5, + 0, + -1, + -9, + -13, + -8, + -11, + -18, + -23, + -25, + -29, + -29, + -26, + -27, + -29, + -25, + -24, + -23, + -18, + -19, + -18, + -17, + -21, + -22, + -30, + -38, + -42, + -42, + -42, + -40, + -41, + -43, + -39, + -38, + -37, + -36, + -33, + -31, + -28, + -27, + -18, + -15, + -7, + -8, + -8, + -1, + 1, + 3, + -5, + 0, + -4, + -5, + -4, + -8, + -10, + -14, + -21, + -24, + -25, + -20, + -11, + -4, + 3, + 6, + 13, + 15, + 12, + 17, + 16, + 17, + 17, + 15, + 21, + 28, + 33, + 36, + 35, + 35, + 29, + 31, + 29, + 28, + 23, + 21, + 14, + 15, + 27, + 36, + 40, + 40, + 43, + 51, + 56, + 62, + 69, + 77, + 80, + 88, + 88, + 88, + 82, + 76, + 63, + 52, + 44, + 36, + 26, + 23, + 25, + 24, + 27, + 26, + 31, + 21, + 13, + 8, + -8, + -8, + -11, + -14, + -18, + -28, + -28, + -30, + -32, + -29, + -26, + -26, + -27, + -24, + -20, + -14, + -8, + -6, + -8, + -5, + -10, + -14, + -18, + -26, + -34, + -36, + -38, + -44, + -51, + -57, + -66, + -64, + -68, + -72, + -75, + -75, + -70, + -68, + -65, + -64, + -62, + -68, + -63, + -60, + -65, + -65, + -69, + -68, + -67, + -57, + -46, + -41, + -38, + -34, + -31, + -39, + -40, + -45, + -45, + -48, + -47, + -40, + -39, + -32, + -26, + -24, + -14, + -9, + -7, + -3, + -2, + 3, + 4, + 0, + -2, + -2, + -2, + 1, + 3, + 2, + 3, + 8, + 13, + 20, + 25, + 29, + 31, + 26, + 17, + 11, + 3, + -5, + 2, + 6, + 9, + 11, + 19, + 26, + 40, + 51, + 61, + 60, + 58, + 61, + 55, + 55, + 57, + 60, + 54, + 40, + 42, + 38, + 34, + 38, + 37, + 34, + 32, + 35, + 36, + 35, + 41, + 36, + 32, + 29, + 23, + 22, + 23, + 22, + 14, + 13, + 19, + 19, + 20, + 22, + 22, + 17, + 13, + 6, + 9, + 13, + 15, + 17, + 19, + 11, + 15, + 8, + 4, + 6, + -1, + -3, + 3, + 7, + 11, + 8, + 10, + 7, + 6, + 4, + -4, + -5, + -11, + -9, + -16, + -14, + -14, + -16, + -16, + -22, + -19, + -19, + -13, + -9, + -4, + 1, + 1, + 2, + -6, + -14, + -25, + -32, + -41, + -46, + -50, + -49, + -42, + -39, + -34, + -24, + -14, + -18, + -15, + -17, + -21, + -23, + -21, + -19, + -21, + -20, + -19, + -20, + -19, + -16, + -17, + -19, + -20, + -20, + -20, + -20, + -22, + -22, + -23, + -22, + -22, + -14, + -5, + 5, + 8, + 13, + 16, + 19, + 23, + 19, + 21, + 16, + 16, + 18, + 13, + 18, + 13, + 15, + 18, + 12, + 12, + 6, + 11, + 8, + 5, + 5, + 9, + 17, + 14, + 15, + 14, + 16, + 14, + 14, + 12, + 9, + 7, + 9, + 11, + 13, + 15, + 15, + 19, + 17, + 14, + 8, + 7, + 4, + 0, + 3, + 8, + 10, + 7, + 8, + 19, + 15, + 19, + 18, + 19, + 17, + 9, + 14, + 10, + 4, + -3, + -11, + -19, + -25, + -31, + -35, + -36, + -28, + -21, + -8, + 5, + 8, + 11, + 13, + 7, + 4, + 1, + -7, + -15, + -17, + -17, + -21, + -28, + -33, + -37, + -40, + -39, + -41, + -45, + -46, + -44, + -40, + -41, + -36, + -31, + -41, + -40, + -42, + -44, + -47, + -50, + -49, + -55, + -52, + -52, + -52, + -45, + -50, + -52, + -56, + -58, + -60, + -69, + -75, + -82, + -86, + -91, + -87, + -80, + -80, + -72, + -58, + -52, + -45, + -33, + -21, + -13, + -12, + -10, + -6, + -1, + -2, + -7, + -7, + -5, + -6, + -3, + 9, + 15, + 25, + 36, + 35, + 39, + 28, + 16, + 11, + 8, + 11, + 17, + 27, + 34, + 36, + 47, + 49, + 52, + 52, + 42, + 46, + 49, + 55, + 65, + 66, + 67, + 62, + 56, + 53, + 49, + 50, + 55, + 53, + 62, + 69, + 72, + 73, + 68, + 61, + 54, + 46, + 43, + 38, + 34, + 39, + 43, + 42, + 39, + 36, + 31, + 26, + 24, + 17, + 13, + 14, + 14, + 21, + 26, + 29, + 28, + 26, + 24, + 18, + 19, + 16, + 11, + 6, + 2, + -2, + 1, + 3, + 2, + -4, + -3, + -1, + -3, + -2, + -2, + -5, + -3, + 0, + 3, + -3, + -6, + -6, + -15, + -19, + -25, + -30, + -35, + -39, + -34, + -34, + -34, + -31, + -17, + -17, + -8, + -2, + -2, + 8, + 14, + 25, + 24, + 26, + 22, + 16, + 10, + 2, + -3, + -5, + -12, + -15, + -11, + -14, + -16, + -17, + -17, + -16, + -21, + -18, + -18, + -21, + -23, + -21, + -15, + -11, + -4, + -2, + 3, + 8, + 10, + 17, + 18, + 25, + 24, + 24, + 24, + 21, + 24, + 23, + 24, + 22, + 23, + 31, + 39, + 49, + 58, + 64, + 67, + 63, + 57, + 53, + 52, + 44, + 45, + 43, + 40, + 45, + 42, + 49, + 50, + 49, + 52, + 51, + 48, + 46, + 38, + 37, + 35, + 36, + 37, + 37, + 37, + 44, + 45, + 47, + 42, + 42, + 36, + 35, + 44, + 40, + 40, + 28, + 24, + 23, + 18, + 12, + 9, + 8, + 10, + 17, + 17, + 18, + 12, + 5, + -2, + -12, + -16, + -20, + -27, + -29, + -29, + -26, + -22, + -17, + -16, + -15, + -14, + -15, + -11, + -11, + -15, + -19, + -15, + -20, + -22, + -24, + -37, + -52, + -62, + -63, + -68, + -64, + -59, + -51, + -43, + -42, + -36, + -32, + -33, + -33, + -33, + -41, + -48, + -51, + -49, + -48, + -47, + -42, + -45, + -42, + -41, + -40, + -39, + -33, + -29, + -25, + -14, + -1, + -4, + -6, + -11, + -16, + -19, + -26, + -29, + -28, + -25, + -17, + -10, + -1, + -1, + 3, + 7, + -1, + -3, + -8, + -18, + -20, + -20, + -16, + -13, + -11, + -8, + 0, + 6, + 8, + 11, + 14, + 15, + 20, + 26, + 26, + 26, + 24, + 23, + 24, + 30, + 34, + 41, + 52, + 61, + 70, + 80, + 85, + 86, + 89, + 84, + 87, + 79, + 67, + 60, + 57, + 59, + 63, + 68, + 74, + 78, + 84, + 89, + 91, + 87, + 81, + 74, + 69, + 63, + 59, + 59, + 56, + 58, + 60, + 60, + 59, + 54, + 49, + 41, + 40, + 34, + 25, + 19, + 11, + 1, + 0, + -1, + -4, + -8, + -12, + -12, + -17, + -22, + -31, + -44, + -54, + -58, + -68, + -74, + -80, + -80, + -73, + -65, + -61, + -61, + -55, + -50, + -50, + -59, + -65, + -69, + -73, + -73, + -78, + -79, + -83, + -87, + -87, + -88, + -94, + -103, + -107, + -107, + -109, + -106, + -113, + -115, + -110, + -105, + -100, + -100, + -92, + -78, + -62, + -49, + -39, + -35, + -27, + -26, + -25, + -24, + -22, + -23, + -28, + -26, + -22, + -15, + -11, + -4, + 4, + 13, + 21, + 32, + 31, + 28, + 30, + 30, + 28, + 23, + 25, + 23, + 21, + 25, + 21, + 26, + 27, + 32, + 40, + 48, + 53, + 55, + 54, + 55, + 55, + 54, + 48, + 44, + 47, + 48, + 54, + 60, + 71, + 79, + 79, + 74, + 72, + 59, + 48, + 42, + 32, + 26, + 22, + 21, + 23, + 22, + 31, + 42, + 44, + 41, + 36, + 30, + 30, + 33, + 38, + 35, + 30, + 28, + 20, + 15, + 8, + 4, + 6, + 9, + 16, + 26, + 27, + 23, + 19, + 16, + 10, + 4, + -4, + -12, + -12, + -16, + -16, + -19, + -24, + -23, + -23, + -31, + -34, + -38, + -40, + -41, + -39, + -39, + -36, + -36, + -40, + -45, + -48, + -53, + -66, + -73, + -76, + -76, + -78, + -75, + -71, + -65, + -59, + -58, + -59, + -56, + -60, + -62, + -62, + -62, + -64, + -68, + -73, + -79, + -80, + -85, + -87, + -85, + -78, + -72, + -66, + -56, + -48, + -42, + -37, + -35, + -32, + -33, + -31, + -25, + -26, + -27, + -16, + -18, + -18, + -13, + -14, + -17, + -22, + -24, + -25, + -23, + -19, + -14, + -12, + -11, + -7, + -4, + -1, + 2, + 5, + 8, + 10, + 10, + 18, + 28, + 29, + 25, + 22, + 29, + 21, + 20, + 21, + 22, + 30, + 32, + 41, + 41, + 45, + 46, + 49, + 52, + 57, + 59, + 58, + 52, + 46, + 47, + 56, + 58, + 49, + 49, + 46, + 40, + 33, + 23, + 14, + 11, + 16, + 29, + 34, + 37, + 41, + 42, + 48, + 54, + 60, + 61, + 62, + 62, + 69, + 79, + 76, + 71, + 72, + 71, + 64, + 59, + 54, + 49, + 40, + 42, + 34, + 23, + 27, + 18, + 13, + 9, + 3, + -4, + -8, + -16, + -18, + -20, + -26, + -28, + -30, + -32, + -29, + -32, + -35, + -39, + -41, + -38, + -34, + -31, + -26, + -18, + -21, + -20, + -22, + -28, + -35, + -34, + -31, + -33, + -31, + -31, + -40, + -43, + -45, + -53, + -64, + -67, + -74, + -75, + -74, + -75, + -70, + -61, + -56, + -45, + -37, + -30, + -33, + -35, + -32, + -31, + -27, + -25, + -19, + -17, + -14, + -9, + -4, + -1, + -3, + -4, + 1, + 8, + 14, + 20, + 24, + 25, + 18, + 11, + 7, + -3, + -9, + -3, + 4, + 15, + 30, + 29, + 33, + 33, + 36, + 35, + 31, + 33, + 34, + 42, + 43, + 42, + 47, + 49, + 53, + 61, + 69, + 73, + 74, + 79, + 81, + 84, + 76, + 69, + 62, + 47, + 39, + 31, + 19, + 8, + 2, + -6, + -5, + -3, + -3, + -1, + 1, + -2, + -3, + -3, + -6, + -12, + -13, + -15, + -11, + -5, + -4, + -8, + -14, + -9, + -3, + 0, + -3, + -4, + 0, + 3, + 0, + -6, + -14, + -23, + -33, + -38, + -41, + -38, + -38, + -34, + -30, + -29, + -29, + -26, + -31, + -33, + -41, + -49, + -50, + -56, + -57, + -58, + -54, + -46, + -39, + -39, + -34, + -31, + -28, + -30, + -30, + -31, + -29, + -27, + -16, + -18, + -17, + -15, + -13, + -15, + -12, + -7, + -11, + -9, + -9, + -4, + -11, + -7, + -7, + -8, + -9, + -10, + -7, + -9, + 1, + 9, + 15, + 12, + 19, + 19, + 18, + 17, + 13, + 11, + 8, + 6, + 10, + 17, + 20, + 26, + 28, + 33, + 39, + 30, + 25, + 25, + 18, + 16, + 21, + 26, + 30, + 33, + 32, + 36, + 42, + 49, + 46, + 39, + 44, + 44, + 37, + 35, + 30, + 24, + 22, + 23, + 26, + 23, + 25, + 21, + 24, + 24, + 22, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h new file mode 100644 index 00000000..fd891313 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_1000ms_sample_data.h @@ -0,0 +1,29 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was created from the PCM data in a WAV file held in v2 of the +// Speech Commands test dataset, at the path: +// speech_commands_test_set_v0.02/no/f9643d42_nohash_4.wav +// This should contain all 16,000 samples from the one-second file. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_NO_1000MS_SAMPLE_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_NO_1000MS_SAMPLE_DATA_H_ + +#include + +extern const int g_no_1000ms_sample_data_size; +extern const int16_t g_no_1000ms_sample_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_NO_1000MS_SAMPLE_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.cc new file mode 100644 index 00000000..591502d7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.cc @@ -0,0 +1,502 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h" + +const int g_no_30ms_sample_data_size = 480; +const int16_t g_no_30ms_sample_data[480] = { + 5713, + 5735, + 5735, + 5737, + 5701, + 5691, + 5656, + 5633, + 5611, + 5552, + 5475, + 5394, + 5293, + 5177, + 5064, + 4924, + 4737, + 4599, + 4420, + 4237, + 4048, + 3828, + 3623, + 3413, + 3183, + 2915, + 2622, + 2308, + 1980, + 1657, + 1261, + 901, + 549, + 205, + -85, + -383, + -688, + -969, + -1246, + -1530, + -1850, + -2206, + -2561, + -2915, + -3224, + -3482, + -3713, + -3921, + -4107, + -4287, + -4470, + -4660, + -4850, + -5057, + -5239, + -5395, + -5540, + -5619, + -5697, + -5724, + -5697, + -5675, + -5633, + -5590, + -5579, + -5530, + -5486, + -5442, + -5426, + -5391, + -5348, + -5276, + -5197, + -5124, + -5039, + -4925, + -4808, + -4677, + -4581, + -4479, + -4343, + -4218, + -4087, + -3970, + -3858, + -3729, + -3570, + -3384, + -3206, + -3020, + -2839, + -2636, + -2453, + -2287, + -2185, + -2154, + -1926, + -1562, + -1223, + -758, + -473, + -64, + 395, + 599, + 880, + 814, + 938, + 1172, + 1498, + 1928, + 2127, + 2422, + 2608, + 2841, + 2937, + 2886, + 2815, + 2985, + 3324, + 3757, + 4152, + 4481, + 4652, + 4917, + 4965, + 4766, + 4583, + 4328, + 4503, + 4815, + 5118, + 5408, + 5682, + 5956, + 6082, + 6055, + 5744, + 5426, + 5341, + 5427, + 5606, + 5882, + 6065, + 6226, + 6428, + 6477, + 6385, + 6009, + 5728, + 5552, + 5439, + 5339, + 5200, + 5008, + 4947, + 4835, + 4614, + 4330, + 3887, + 3521, + 3111, + 2460, + 1983, + 1297, + 650, + 279, + -353, + -720, + -1044, + -1518, + -1668, + -2117, + -2496, + -2743, + -3266, + -3607, + -3790, + -4149, + -4075, + -4042, + -4096, + -3981, + -4138, + -4226, + -4214, + -4503, + -4455, + -4577, + -4642, + -4346, + -4351, + -4270, + -4263, + -4522, + -4521, + -4673, + -4814, + -4731, + -4950, + -5011, + -5004, + -5288, + -5341, + -5566, + -5833, + -5783, + -5929, + -5847, + -5765, + -5828, + -5644, + -5613, + -5615, + -5428, + -5291, + -5014, + -4554, + -4277, + -3964, + -3854, + -3829, + -3612, + -3603, + -3438, + -3137, + -2831, + -2164, + -1438, + -939, + -330, + -156, + 46, + 242, + 73, + 242, + 220, + 239, + 542, + 565, + 739, + 872, + 801, + 857, + 676, + 543, + 586, + 567, + 828, + 1142, + 1490, + 1985, + 2508, + 2982, + 3438, + 3699, + 3939, + 4069, + 4178, + 4420, + 4622, + 4917, + 5338, + 5801, + 6285, + 6658, + 6963, + 7213, + 7233, + 7328, + 7176, + 7038, + 7031, + 6860, + 6957, + 6767, + 6599, + 6523, + 6212, + 6147, + 6063, + 5860, + 6020, + 6015, + 6033, + 6184, + 5722, + 5607, + 5016, + 4337, + 4063, + 3229, + 3080, + 3006, + 2804, + 3035, + 2541, + 2136, + 1879, + 1012, + 401, + -575, + -1584, + -1930, + -2278, + -2485, + -2477, + -2712, + -2747, + -2766, + -3320, + -3592, + -4188, + -4669, + -4672, + -4939, + -4789, + -4426, + -4203, + -3674, + -3563, + -3656, + -3759, + -4067, + -4257, + -4522, + -4970, + -5204, + -5237, + -5139, + -4907, + -4911, + -4917, + -4921, + -5007, + -5230, + -5654, + -6122, + -6464, + -6733, + -6948, + -7067, + -6972, + -6800, + -6520, + -6132, + -5830, + -5382, + -5091, + -4797, + -4546, + -4472, + -4362, + -4350, + -4235, + -3851, + -3454, + -3144, + -2735, + -2341, + -1845, + -1262, + -958, + -549, + -166, + 66, + 382, + 366, + 352, + 341, + 85, + -13, + -176, + -303, + -235, + -341, + -309, + -227, + -249, + -50, + 143, + 384, + 874, + 1149, + 1552, + 2155, + 2767, + 3499, + 3994, + 4460, + 4920, + 5288, + 5569, + 5704, + 5881, + 6094, + 6461, + 6653, + 6803, + 7115, + 7311, + 7521, + 7612, + 7443, + 7380, + 7124, + 6742, + 6495, + 5964, + 5656, + 5415, + 5167, + 5656, + 5813, + 6027, + 6401, + 6351, + 6787, + 7019, + 6581, + 6512, + 5965, + 5308, + 5140, + 4336, + 4147, + 3899, + 3398, + 3360, + 2830, + 2624, + 1968, + 1026, + 395, + -699, + -1424, + -2327, + -3006, + -3192, + -3435, + -3337, + -3686, + -3513, + -3350, + -3502, + -3261, + -3878, + -4005, + -4063, + -4187, + -3767, + -3598, + -3384, + -3300, + -3094, + -2857, + -3023, + -3274, + -3851, + -4352, + -4523, + -4943, + -5477, + -5612, + -5682, + -5733, + -5714, + -5965, + -6110, + -5950, + -6158, + -6548, + -6897, + -7165, + -7281, + -7352, + -7258, + -7185, + -6659, + -5946, + -5470, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h new file mode 100644 index 00000000..026ff3a1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h @@ -0,0 +1,32 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was created from the PCM data in a WAV file held in v2 of the +// Speech Commands test dataset, at the path: +// speech_commands_test_set_v0.02/no/f9643d42_nohash_4.wav +// The data was extracted starting at an offset of 8,960, which corresponds to +// the 29th spectrogram slice. It's designed to be used to test the +// preprocessing pipeline, to ensure that the expected spectrogram slice is +// produced given this input. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_NO_30MS_SAMPLE_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_NO_30MS_SAMPLE_DATA_H_ + +#include + +extern const int g_no_30ms_sample_data_size; +extern const int16_t g_no_30ms_sample_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_NO_30MS_SAMPLE_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.cc new file mode 100644 index 00000000..0837432a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.cc @@ -0,0 +1,144 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/recognize_commands.h" + +#include + +RecognizeCommands::RecognizeCommands(tflite::ErrorReporter *error_reporter, + int32_t average_window_duration_ms, + uint8_t detection_threshold, + int32_t suppression_ms, + int32_t minimum_count) + : error_reporter_(error_reporter), + average_window_duration_ms_(average_window_duration_ms), + detection_threshold_(detection_threshold), + suppression_ms_(suppression_ms), + minimum_count_(minimum_count), + previous_results_(error_reporter) +{ + previous_top_label_ = "silence"; + previous_top_label_time_ = std::numeric_limits::min(); +} + +TfLiteStatus RecognizeCommands::ProcessLatestResults( + const TfLiteTensor *latest_results, const int32_t current_time_ms, + const char **found_command, uint8_t *score, bool *is_new_command) +{ + if ((latest_results->dims->size != 2) || + (latest_results->dims->data[0] != 1) || + (latest_results->dims->data[1] != kCategoryCount)) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "The results for recognition should contain %d elements, but there are " + "%d in an %d-dimensional shape", + kCategoryCount, latest_results->dims->data[1], + latest_results->dims->size); + return kTfLiteError; + } + + if (latest_results->type != kTfLiteInt8) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "The results for recognition should be int8_t elements, but are %d", + latest_results->type); + return kTfLiteError; + } + + if ((!previous_results_.empty()) && + (current_time_ms < previous_results_.front().time_)) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Results must be fed in increasing time order, but received a " + "timestamp of %d that was earlier than the previous one of %d", + current_time_ms, previous_results_.front().time_); + return kTfLiteError; + } + + // Add the latest results to the head of the queue. + previous_results_.push_back({ current_time_ms, latest_results->data.int8 }); + + // Prune any earlier results that are too old for the averaging window. + const int64_t time_limit = current_time_ms - average_window_duration_ms_; + while ((!previous_results_.empty()) && + previous_results_.front().time_ < time_limit) { + previous_results_.pop_front(); + } + + // If there are too few results, assume the result will be unreliable and + // bail. + const int64_t how_many_results = previous_results_.size(); + const int64_t earliest_time = previous_results_.front().time_; + const int64_t samples_duration = current_time_ms - earliest_time; + if ((how_many_results < minimum_count_) || + (samples_duration < (average_window_duration_ms_ / 4))) { + *found_command = previous_top_label_; + *score = 0; + *is_new_command = false; + return kTfLiteOk; + } + + // Calculate the average score across all the results in the window. + int32_t average_scores[kCategoryCount]; + for (int offset = 0; offset < previous_results_.size(); ++offset) { + PreviousResultsQueue::Result previous_result = + previous_results_.from_front(offset); + const int8_t *scores = previous_result.scores; + for (int i = 0; i < kCategoryCount; ++i) { + if (offset == 0) { + average_scores[i] = scores[i] + 128; + } else { + average_scores[i] += scores[i] + 128; + } + } + } + for (int i = 0; i < kCategoryCount; ++i) { + average_scores[i] /= how_many_results; + } + + // Find the current highest scoring category. + int current_top_index = 0; + int32_t current_top_score = 0; + for (int i = 0; i < kCategoryCount; ++i) { + if (average_scores[i] > current_top_score) { + current_top_score = average_scores[i]; + current_top_index = i; + } + } + const char *current_top_label = kCategoryLabels[current_top_index]; + + // If we've recently had another label trigger, assume one that occurs too + // soon afterwards is a bad result. + int64_t time_since_last_top; + if ((previous_top_label_ == kCategoryLabels[0]) || + (previous_top_label_time_ == std::numeric_limits::min())) { + time_since_last_top = std::numeric_limits::max(); + } else { + time_since_last_top = current_time_ms - previous_top_label_time_; + } + if ((current_top_score > detection_threshold_) && + ((current_top_label != previous_top_label_) || + (time_since_last_top > suppression_ms_))) { + previous_top_label_ = current_top_label; + previous_top_label_time_ = current_time_ms; + *is_new_command = true; + } else { + *is_new_command = false; + } + *found_command = current_top_label; + *score = current_top_score; + + return kTfLiteOk; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.h new file mode 100644 index 00000000..87ccd3d4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands.h @@ -0,0 +1,179 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_RECOGNIZE_COMMANDS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_RECOGNIZE_COMMANDS_H_ + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Partial implementation of std::dequeue, just providing the functionality +// that's needed to keep a record of previous neural network results over a +// short time period, so they can be averaged together to produce a more +// accurate overall prediction. This doesn't use any dynamic memory allocation +// so it's a better fit for microcontroller applications, but this does mean +// there are hard limits on the number of results it can store. +class PreviousResultsQueue { +public: + PreviousResultsQueue(tflite::ErrorReporter *error_reporter) + : error_reporter_(error_reporter), front_index_(0), size_(0) + { + } + + // Data structure that holds an inference result, and the time when it + // was recorded. + struct Result { + Result() + : time_(0), scores() + { + } + Result(int32_t time, int8_t *input_scores) + : time_(time) + { + for (int i = 0; i < kCategoryCount; ++i) { + scores[i] = input_scores[i]; + } + } + int32_t time_; + int8_t scores[kCategoryCount]; + }; + + int size() + { + return size_; + } + bool empty() + { + return size_ == 0; + } + Result &front() + { + return results_[front_index_]; + } + Result &back() + { + int back_index = front_index_ + (size_ - 1); + if (back_index >= kMaxResults) { + back_index -= kMaxResults; + } + return results_[back_index]; + } + + void push_back(const Result &entry) + { + if (size() >= kMaxResults) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Couldn't push_back latest result, too many already!"); + return; + } + size_ += 1; + back() = entry; + } + + Result pop_front() + { + if (size() <= 0) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Couldn't pop_front result, none present!"); + return Result(); + } + Result result = front(); + front_index_ += 1; + if (front_index_ >= kMaxResults) { + front_index_ = 0; + } + size_ -= 1; + return result; + } + + // Most of the functions are duplicates of dequeue containers, but this + // is a helper that makes it easy to iterate through the contents of the + // queue. + Result &from_front(int offset) + { + if ((offset < 0) || (offset >= size_)) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Attempt to read beyond the end of the queue!"); + offset = size_ - 1; + } + int index = front_index_ + offset; + if (index >= kMaxResults) { + index -= kMaxResults; + } + return results_[index]; + } + +private: + tflite::ErrorReporter *error_reporter_; + static constexpr int kMaxResults = 50; + Result results_[kMaxResults]; + + int front_index_; + int size_; +}; + +// This class is designed to apply a very primitive decoding model on top of the +// instantaneous results from running an audio recognition model on a single +// window of samples. It applies smoothing over time so that noisy individual +// label scores are averaged, increasing the confidence that apparent matches +// are real. +// To use it, you should create a class object with the configuration you +// want, and then feed results from running a TensorFlow model into the +// processing method. The timestamp for each subsequent call should be +// increasing from the previous, since the class is designed to process a stream +// of data over time. +class RecognizeCommands { +public: + // labels should be a list of the strings associated with each one-hot score. + // The window duration controls the smoothing. Longer durations will give a + // higher confidence that the results are correct, but may miss some commands. + // The detection threshold has a similar effect, with high values increasing + // the precision at the cost of recall. The minimum count controls how many + // results need to be in the averaging window before it's seen as a reliable + // average. This prevents erroneous results when the averaging window is + // initially being populated for example. The suppression argument disables + // further recognitions for a set time after one has been triggered, which can + // help reduce spurious recognitions. + explicit RecognizeCommands(tflite::ErrorReporter *error_reporter, + int32_t average_window_duration_ms = 1000, + uint8_t detection_threshold = 200, + int32_t suppression_ms = 1500, + int32_t minimum_count = 3); + + // Call this with the results of running a model on sample data. + TfLiteStatus ProcessLatestResults(const TfLiteTensor *latest_results, + const int32_t current_time_ms, + const char **found_command, uint8_t *score, + bool *is_new_command); + +private: + // Configuration + tflite::ErrorReporter *error_reporter_; + int32_t average_window_duration_ms_; + uint8_t detection_threshold_; + int32_t suppression_ms_; + int32_t minimum_count_; + + // Working variables + PreviousResultsQueue previous_results_; + const char *previous_top_label_; + int32_t previous_top_label_time_; +}; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_RECOGNIZE_COMMANDS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands_test.cc new file mode 100644 index 00000000..bbc3f77b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/recognize_commands_test.cc @@ -0,0 +1,220 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/recognize_commands.h" + +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(PreviousResultsQueueBasic) +{ + tflite::MicroErrorReporter micro_error_reporter; + + PreviousResultsQueue queue(µ_error_reporter); + TF_LITE_MICRO_EXPECT_EQ(0, queue.size()); + + int8_t scores_a[4] = { 0, 0, 0, 1 }; + queue.push_back({ 0, scores_a }); + TF_LITE_MICRO_EXPECT_EQ(1, queue.size()); + TF_LITE_MICRO_EXPECT_EQ(0, queue.front().time_); + TF_LITE_MICRO_EXPECT_EQ(0, queue.back().time_); + + int8_t scores_b[4] = { 0, 0, 1, 0 }; + queue.push_back({ 1, scores_b }); + TF_LITE_MICRO_EXPECT_EQ(2, queue.size()); + TF_LITE_MICRO_EXPECT_EQ(0, queue.front().time_); + TF_LITE_MICRO_EXPECT_EQ(1, queue.back().time_); + + PreviousResultsQueue::Result pop_result = queue.pop_front(); + TF_LITE_MICRO_EXPECT_EQ(0, pop_result.time_); + TF_LITE_MICRO_EXPECT_EQ(1, queue.size()); + TF_LITE_MICRO_EXPECT_EQ(1, queue.front().time_); + TF_LITE_MICRO_EXPECT_EQ(1, queue.back().time_); + + int8_t scores_c[4] = { 0, 1, 0, 0 }; + queue.push_back({ 2, scores_c }); + TF_LITE_MICRO_EXPECT_EQ(2, queue.size()); + TF_LITE_MICRO_EXPECT_EQ(1, queue.front().time_); + TF_LITE_MICRO_EXPECT_EQ(2, queue.back().time_); +} + +TF_LITE_MICRO_TEST(PreviousResultsQueuePushPop) +{ + tflite::MicroErrorReporter micro_error_reporter; + + PreviousResultsQueue queue(µ_error_reporter); + TF_LITE_MICRO_EXPECT_EQ(0, queue.size()); + + for (int i = 0; i < 123; ++i) { + int8_t scores[4] = { 0, 0, 0, 1 }; + queue.push_back({ i, scores }); + TF_LITE_MICRO_EXPECT_EQ(1, queue.size()); + TF_LITE_MICRO_EXPECT_EQ(i, queue.front().time_); + TF_LITE_MICRO_EXPECT_EQ(i, queue.back().time_); + + PreviousResultsQueue::Result pop_result = queue.pop_front(); + TF_LITE_MICRO_EXPECT_EQ(i, pop_result.time_); + TF_LITE_MICRO_EXPECT_EQ(0, queue.size()); + } +} + +TF_LITE_MICRO_TEST(RecognizeCommandsTestBasic) +{ + tflite::MicroErrorReporter micro_error_reporter; + + RecognizeCommands recognize_commands(µ_error_reporter); + + const int8_t result_data[] = { 127, -128, -128, -128 }; + int result_dims[] = { 2, 1, 4 }; + TfLiteTensor results = tflite::testing::CreateQuantizedTensor( + result_data, tflite::testing::IntArrayFromInts(result_dims), -128.0f, + 127.0f); + + const char *found_command; + uint8_t score; + bool is_new_command; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &results, 0, &found_command, &score, &is_new_command)); +} + +TF_LITE_MICRO_TEST(RecognizeCommandsTestFindCommands) +{ + tflite::MicroErrorReporter micro_error_reporter; + + RecognizeCommands recognize_commands(µ_error_reporter, 1000, 51); + + const int8_t yes_data[] = { -128, -128, 127, -128 }; + int yes_dims[] = { 2, 1, 4 }; + TfLiteTensor yes_results = tflite::testing::CreateQuantizedTensor( + yes_data, tflite::testing::IntArrayFromInts(yes_dims), -128.0f, 127.0f); + + bool has_found_new_command = false; + const char *new_command; + for (int i = 0; i < 10; ++i) { + const char *found_command; + uint8_t score; + bool is_new_command; + int32_t current_time_ms = 0 + (i * 100); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &yes_results, current_time_ms, &found_command, &score, + &is_new_command)); + if (is_new_command) { + TF_LITE_MICRO_EXPECT(!has_found_new_command); + has_found_new_command = true; + new_command = found_command; + } + } + TF_LITE_MICRO_EXPECT(has_found_new_command); + if (has_found_new_command) { + TF_LITE_MICRO_EXPECT_EQ(0, tflite::testing::TestStrcmp("yes", new_command)); + } + + const int8_t no_data[] = { -128, -128, -128, 127 }; + int no_dims[] = { 2, 1, 4 }; + TfLiteTensor no_results = tflite::testing::CreateQuantizedTensor( + no_data, tflite::testing::IntArrayFromInts(no_dims), -128.0f, 127.0f); + has_found_new_command = false; + new_command = ""; + uint8_t score; + for (int i = 0; i < 10; ++i) { + const char *found_command; + bool is_new_command; + int32_t current_time_ms = 1000 + (i * 100); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &no_results, current_time_ms, &found_command, &score, + &is_new_command)); + if (is_new_command) { + TF_LITE_MICRO_EXPECT(!has_found_new_command); + has_found_new_command = true; + new_command = found_command; + } + } + TF_LITE_MICRO_EXPECT(has_found_new_command); + if (has_found_new_command) { + TF_LITE_MICRO_EXPECT_EQ(231, score); + TF_LITE_MICRO_EXPECT_EQ(0, tflite::testing::TestStrcmp("no", new_command)); + } +} + +TF_LITE_MICRO_TEST(RecognizeCommandsTestBadInputLength) +{ + tflite::MicroErrorReporter micro_error_reporter; + + RecognizeCommands recognize_commands(µ_error_reporter, 1000, 51); + + const int8_t bad_data[] = { -128, -128, 127 }; + int bad_dims[] = { 2, 1, 3 }; + TfLiteTensor bad_results = tflite::testing::CreateQuantizedTensor( + bad_data, tflite::testing::IntArrayFromInts(bad_dims), -128.0f, 127.0f); + + const char *found_command; + uint8_t score; + bool is_new_command; + TF_LITE_MICRO_EXPECT_NE( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &bad_results, 0, &found_command, &score, &is_new_command)); +} + +TF_LITE_MICRO_TEST(RecognizeCommandsTestBadInputTimes) +{ + tflite::MicroErrorReporter micro_error_reporter; + + RecognizeCommands recognize_commands(µ_error_reporter, 1000, 51); + + const int8_t result_data[] = { -128, -128, 127, -128 }; + int result_dims[] = { 2, 1, 4 }; + TfLiteTensor results = tflite::testing::CreateQuantizedTensor( + result_data, tflite::testing::IntArrayFromInts(result_dims), -128.0f, + 127.0f); + + const char *found_command; + uint8_t score; + bool is_new_command; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &results, 100, &found_command, &score, &is_new_command)); + TF_LITE_MICRO_EXPECT_NE( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &results, 0, &found_command, &score, &is_new_command)); +} + +TF_LITE_MICRO_TEST(RecognizeCommandsTestTooFewInputs) +{ + tflite::MicroErrorReporter micro_error_reporter; + + RecognizeCommands recognize_commands(µ_error_reporter, 1000, 51); + + const int8_t result_data[] = { -128, -128, 127, -128 }; + int result_dims[] = { 2, 1, 4 }; + TfLiteTensor results = tflite::testing::CreateQuantizedTensor( + result_data, tflite::testing::IntArrayFromInts(result_dims), -128.0f, + 127.0f); + + const char *found_command; + uint8_t score; + bool is_new_command; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, recognize_commands.ProcessLatestResults( + &results, 100, &found_command, &score, &is_new_command)); + TF_LITE_MICRO_EXPECT_EQ(0, score); + TF_LITE_MICRO_EXPECT_EQ(false, is_new_command); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/fixed_point/simple_features_generator.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/fixed_point/simple_features_generator.cc new file mode 100644 index 00000000..eda2fc2b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/fixed_point/simple_features_generator.cc @@ -0,0 +1,221 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Reference implementation of the preprocessing pipeline, with the same +// results as the audio tutorial at +// https://www.tensorflow.org/tutorials/sequences/audio_recognition +// This module takes 30ms of PCM-encoded signed 16-bit audio samples (at 16KHz, +// so 480 values), and extracts a power spectrum of frequencies. There are 43 +// frequency bands in the result, derived from the original 256 output from the +// discrete Fourier transform, and averaged together in groups of 6. +// It's expected that most platforms will have optimized versions of the +// functions used here, for example replacing the DFT with an FFT, so this +// version shouldn't be used where performance is critical. +// This implementation uses fixed point for any non-constant calculations, +// instead of floating point, to help show how this can work on platforms that +// don't have good float support. + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h" + +#include + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h" + +namespace { + +// q format notation: qx.y => 1 sign bit, x-1 integer bits, y fraction bits. +// Use standard (non-saturating) arithmetic with signed ints of size x+y bits. +// Sacrifice some precision to avoid use of 64-bit ints. + +// q1.15 * q1.15 => q2.30 +inline int32_t Q1_15_FixedMultiply_Q2_30(int16_t a, int16_t b) +{ + int32_t big_a = a; + int32_t big_b = b; + return big_a * big_b; +} + +// q2.30 * q2.30 => q10.22 +inline int32_t Q2_30_FixedMultiply_Q10_22(int32_t a, int32_t b) +{ + // q2.30 result + int32_t tmp = (a >> 15) * (b >> 15); + // q10.22 result + return tmp >> 8; +} + +// q10.22 * q10.22 => q10.22 +// Will overflow if product is >= 512. +// Largest product in small test set is 465.25 +inline int32_t Q10_22_FixedMultiply_Q10_22(int32_t a, int32_t b) +{ + // q10.22 result + return (a >> 11) * (b >> 11); +} + +// float => q2.30 +// No checking for saturation. Only used for inputs in range [-1, 1]. +inline int32_t FloatToFixed_Q2_30(float input) +{ + return static_cast(roundf(input * (1 << 30))); +} + +// Performs a discrete Fourier transform on the real inputs. This corresponds to +// rdft() in the FFT package at http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html, +// and to kiss_fftr() in KISSFFT at https://github.com/mborgerding/kissfft. +// It takes in an array of float real values, and returns a result of the same +// length with q10.22 fixed point real and imaginary components interleaved, so +// fourier_output[0] is the first real value, fourier_output[1] is the first +// imaginary, fourier_output[2] is the second real, and so on. +// The calling function should ensure that the array passed in as fourier_output +// is at least time_series_size in length. Most optimized FFT implementations +// require the length to be a power of two as well, but this version doesn't +// enforce that. + +// input: q2.30 fixed point. output: q10.22 fixed point. +// Outputs interpreted as q10.22 fixed point are un-scaled. +void CalculateDiscreteFourierTransform(int32_t *time_series, + int time_series_size, + int32_t *fourier_output) +{ + for (int i = 0; i < time_series_size / 2; ++i) { + int32_t real = 0; + for (int j = 0; j < time_series_size; ++j) { + const int32_t real_scale = + FloatToFixed_Q2_30(cos(j * i * M_PI * 2 / time_series_size)); + real += Q2_30_FixedMultiply_Q10_22(time_series[j], real_scale); + } + int32_t imaginary = 0; + for (int j = 0; j < time_series_size; ++j) { + const int32_t imaginary_scale = + FloatToFixed_Q2_30(sin(j * i * M_PI * 2 / time_series_size)); + imaginary -= Q2_30_FixedMultiply_Q10_22(time_series[j], imaginary_scale); + } + fourier_output[(i * 2) + 0] = real; + fourier_output[(i * 2) + 1] = imaginary; + } +} + +// Produces a simple sine curve that is used to ensure frequencies at the center +// of the current sample window are weighted more heavily than those at the end. +// q1.15 output format. +void CalculatePeriodicHann(int window_length, int16_t *window_function) +{ + for (int i = 0; i < window_length; ++i) { + const float real_value = (0.5 - 0.5 * cos((2 * M_PI * i) / window_length)); + int tmp = static_cast(roundf(real_value * (1 << 15))); + // Saturate the 0x8000 value to 0x7fff + if (tmp > 0x7fff) + tmp = 0x7fff; + window_function[i] = tmp; + } +} + +} // namespace + +TfLiteStatus GenerateSimpleFeatures(tflite::ErrorReporter *error_reporter, + const int16_t *input, int input_size, + int output_size, uint8_t *output) +{ + // Ensure our input and output data arrays are valid. + if (input_size > kMaxAudioSampleSize) { + TF_LITE_REPORT_ERROR(error_reporter, "Input size %d larger than %d", + input_size, kMaxAudioSampleSize); + return kTfLiteError; + } + if (output_size != kFeatureSliceSize) { + TF_LITE_REPORT_ERROR(error_reporter, + "Requested output size %d doesn't match %d", + output_size, kFeatureSliceSize); + return kTfLiteError; + } + + // Pre-calculate the window function we'll be applying to the input data. + // In a real application, we'd calculate this table once in an initialization + // function and store it for repeated reuse. + // q1.15 format. + int16_t window_function[kMaxAudioSampleSize]; + CalculatePeriodicHann(input_size, window_function); + + // Apply the window function to our time series input, and pad it with zeroes + // to the next power of two. + int32_t fixed_input[kMaxAudioSampleSize]; + for (int i = 0; i < kMaxAudioSampleSize; ++i) { + if (i < input_size) { + // input is int16_t. Treat as q1.15 fixed point value in range [-1,1) + // window_function is also q1.15 fixed point number + fixed_input[i] = Q1_15_FixedMultiply_Q2_30(input[i], window_function[i]); + } else { + fixed_input[i] = 0; + } + } + + // Pull the frequency data from the time series sample. + // Calculated in q10.22 format from q2.30 inputs. + int32_t fourier_values[kMaxAudioSampleSize]; + CalculateDiscreteFourierTransform(fixed_input, kMaxAudioSampleSize, + fourier_values); + + // We have the complex numbers giving us information about each frequency + // band, but all we want to know is how strong each frequency is, so calculate + // the squared magnitude by adding together the squares of each component. + int32_t power_spectrum[kMaxAudioSampleSize / 2]; + for (int i = 0; i < (kMaxAudioSampleSize / 2); ++i) { + const int32_t real = fourier_values[(i * 2) + 0]; + const int32_t imaginary = fourier_values[(i * 2) + 1]; + // q10.22 results + power_spectrum[i] = Q10_22_FixedMultiply_Q10_22(real, real) + + Q10_22_FixedMultiply_Q10_22(imaginary, imaginary); + } + + // Finally, reduce the size of the output by averaging together six adjacent + // frequencies into each slot, producing an array of 43 values. + // Power_spectrum numbers are q10.22. Divide by kAverageWindowSize inside + // loop to prevent overflow. + for (int i = 0; i < kFeatureSliceSize; ++i) { + int32_t average = 0; + for (int j = 0; j < kAverageWindowSize; ++j) { + const int index = (i * kAverageWindowSize) + j; + if (index < (kMaxAudioSampleSize / 2)) { + average += power_spectrum[index] / kAverageWindowSize; + } + } + // Quantize the result into eight bits, effectively multiplying by two. + // The 127.5 constant here has to match the features_max value defined in + // tensorflow/examples/speech_commands/input_data.py, and this also assumes + // that features_min is zero. + // + // q10.22 input + // integer output + // + // output = (input - features_min) * + // (output_max - output_min) / (features_max - features_min) + // == (input) * (255) / (127.5) + // == input * 2 + // == input << 1 + // Also want to round to nearest integer and only keep integer bits + // => ((input << 1) + 0x200000) >> 22 + // == (input + 0x100000) >> 21 + int32_t quantized_average = (average + 0x100000) >> 21; + if (quantized_average < 0) { + quantized_average = 0; + } + if (quantized_average > 255) { + quantized_average = 255; + } + output[i] = quantized_average; + } + return kTfLiteOk; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.cc new file mode 100644 index 00000000..e3ec0615 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.cc @@ -0,0 +1,1675 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This is a standard TensorFlow Lite FlatBuffer model file that has been +// converted into a C data array, so it can be easily compiled into a binary +// for devices that don't have a file system. It was created using the command: +// xxd -i model.tflite > model.cc + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/model.h" + +const unsigned char g_model[] = { + 0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00, + 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x4d, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xf4, 0x47, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0x54, 0x4f, 0x43, 0x4f, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x65, 0x64, 0x2e, 0x00, 0x09, 0x00, 0x00, 0x00, 0xd4, 0x47, 0x00, 0x00, + 0xb4, 0x47, 0x00, 0x00, 0xe4, 0x02, 0x00, 0x00, 0xb4, 0x02, 0x00, 0x00, + 0xac, 0x02, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb8, 0xb3, 0xff, 0xff, + 0xbc, 0xb3, 0xff, 0xff, 0xc0, 0xb3, 0xff, 0xff, 0x1e, 0xb4, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x89, 0xa5, 0xe8, 0xc1, + 0xb1, 0x89, 0x5b, 0xc6, 0x4f, 0x9b, 0xd3, 0x74, 0x93, 0x88, 0xff, 0xaf, + 0x89, 0xff, 0xf4, 0x70, 0xcc, 0x75, 0x78, 0xbf, 0x92, 0xcd, 0xa9, 0xa8, + 0xd6, 0x6a, 0x6f, 0x7b, 0x7f, 0xd8, 0xa8, 0xb1, 0xe6, 0x32, 0x21, 0x70, + 0xa0, 0x9c, 0x6f, 0xc8, 0xc6, 0x59, 0x67, 0x93, 0x97, 0xca, 0x3f, 0xde, + 0xcb, 0x74, 0x7c, 0xb5, 0xa4, 0xd9, 0x66, 0xc6, 0x87, 0x98, 0xa5, 0xd0, + 0xbb, 0xb9, 0xc2, 0xb2, 0xaa, 0x79, 0x25, 0xb9, 0x6d, 0x5a, 0xc8, 0x7f, + 0x70, 0x85, 0x79, 0xbc, 0x6a, 0x9b, 0xd1, 0x9a, 0x9c, 0x51, 0x53, 0x71, + 0x89, 0xc0, 0xb4, 0xac, 0xae, 0x47, 0x67, 0x70, 0x79, 0xd2, 0x81, 0xa5, + 0xd2, 0x09, 0x38, 0x82, 0x74, 0xc9, 0x5d, 0xaf, 0xc1, 0x4f, 0x53, 0x99, + 0xcb, 0xb7, 0x3a, 0xba, 0xe8, 0x7f, 0x76, 0xb9, 0xb3, 0xd3, 0x60, 0xc0, + 0x93, 0x9f, 0x87, 0xbd, 0xd0, 0xb8, 0xca, 0xc1, 0xb6, 0x6c, 0x01, 0xc1, + 0x5c, 0x5d, 0xb2, 0x82, 0x76, 0x77, 0x39, 0xbc, 0x72, 0x6a, 0xc3, 0xb4, + 0x79, 0x21, 0x48, 0x42, 0x86, 0xa6, 0xbd, 0xaf, 0xae, 0x23, 0x9c, 0x69, + 0x78, 0xc3, 0x6b, 0xb3, 0xab, 0x43, 0xb2, 0x88, 0x71, 0xc6, 0x6b, 0xbe, + 0xc3, 0x75, 0xc2, 0xc3, 0xa5, 0xcf, 0x32, 0xbe, 0xcb, 0xb0, 0xb8, 0xc1, + 0x9c, 0xcf, 0x64, 0xc4, 0xb4, 0x96, 0xa8, 0xb9, 0xcb, 0xc0, 0xc0, 0xb8, + 0xb8, 0x77, 0x65, 0xc0, 0xc4, 0xb3, 0xc5, 0x77, 0x9b, 0x61, 0xd4, 0xac, + 0x7e, 0x36, 0xb1, 0xae, 0x36, 0x36, 0xb8, 0x39, 0x6b, 0x70, 0x9c, 0xb5, + 0x88, 0x5c, 0xb3, 0x6a, 0xad, 0xc5, 0x7b, 0xb4, 0xad, 0xaa, 0xc4, 0x84, + 0x5e, 0xc4, 0x67, 0xc1, 0xde, 0xba, 0xcf, 0xbd, 0xa0, 0xd3, 0x35, 0xb3, + 0xe7, 0xc8, 0xb8, 0xb8, 0xaf, 0xb4, 0x59, 0xb8, 0xb4, 0xac, 0xac, 0xaa, + 0xc7, 0xad, 0xc8, 0xb6, 0xac, 0x99, 0xa0, 0xcb, 0xc1, 0xc8, 0xcb, 0x89, + 0xc3, 0xac, 0xca, 0x8b, 0x97, 0x1f, 0xbd, 0xbf, 0x13, 0xad, 0xc8, 0x41, + 0x56, 0x3c, 0x86, 0xb2, 0x61, 0xc4, 0xbb, 0x71, 0xba, 0x92, 0x8d, 0xc3, + 0x86, 0xcb, 0xc5, 0x8d, 0x88, 0xc8, 0x6a, 0xbf, 0x9c, 0xcd, 0xcd, 0xc0, + 0x81, 0xb1, 0x47, 0xb5, 0xf0, 0xce, 0xb1, 0xc1, 0xaa, 0xa8, 0x54, 0xcb, + 0xbc, 0xc7, 0xc5, 0x8e, 0xc3, 0xce, 0xc7, 0xb9, 0xb9, 0xa1, 0xc5, 0xbd, + 0xb8, 0xb8, 0xb7, 0x81, 0xb6, 0xba, 0xd2, 0x90, 0xbc, 0x96, 0xbe, 0xba, + 0x53, 0xb5, 0xc7, 0x3c, 0x3c, 0x1f, 0x90, 0xaa, 0x5a, 0xb8, 0xba, 0x7e, + 0xbc, 0x9e, 0xc2, 0xb1, 0x6e, 0xc0, 0xc4, 0x91, 0xf0, 0xb5, 0x60, 0xad, + 0x73, 0xba, 0xcd, 0xba, 0x6e, 0x94, 0x39, 0xb5, 0xe4, 0xbe, 0xb4, 0xb5, + 0xa0, 0xa9, 0x51, 0xac, 0xbc, 0xc2, 0xb3, 0x8a, 0xbd, 0x9a, 0xca, 0xb3, + 0xbf, 0xaf, 0xb5, 0x9a, 0xb9, 0xc3, 0xb6, 0x92, 0xb5, 0xc1, 0xb0, 0x95, + 0xd6, 0xcc, 0xbb, 0xbb, 0xa9, 0xb9, 0xac, 0x4a, 0x62, 0x27, 0xa7, 0xa7, + 0x30, 0xbd, 0xb1, 0x73, 0xa1, 0x74, 0xc2, 0xb7, 0x58, 0xc0, 0xae, 0x8f, + 0xe1, 0xac, 0x4e, 0xb0, 0x55, 0xc9, 0xc8, 0x9f, 0x83, 0x8e, 0x3e, 0xd5, + 0xb5, 0xbe, 0xcd, 0xb2, 0xa6, 0xc8, 0x64, 0xac, 0xc0, 0xc8, 0xaf, 0x99, + 0xc5, 0x9e, 0xb8, 0xbd, 0xa9, 0xc2, 0xb3, 0x81, 0xb4, 0xc2, 0xb4, 0x8f, + 0xbc, 0xb8, 0x9c, 0x88, 0xbe, 0xc6, 0xbf, 0xba, 0xc8, 0xb4, 0xab, 0x5b, + 0x92, 0x51, 0xb1, 0x9a, 0x44, 0xb9, 0xab, 0x80, 0xa5, 0x3e, 0xc0, 0xa5, + 0x5c, 0xb6, 0xa8, 0xa2, 0xb3, 0x9a, 0x6b, 0xb3, 0x34, 0xc6, 0x7e, 0x96, + 0xcb, 0x88, 0x48, 0xc6, 0xa3, 0xbb, 0xd2, 0xa2, 0xaf, 0xd0, 0x6e, 0xae, + 0xb4, 0xce, 0xc8, 0x8f, 0xd7, 0xad, 0xc8, 0xb0, 0xae, 0xb7, 0xb2, 0x70, + 0xb9, 0xad, 0xc1, 0xa0, 0xcb, 0xa2, 0xb0, 0x9b, 0xbe, 0xd3, 0xca, 0xb6, + 0xbd, 0xaf, 0xa9, 0x82, 0xa1, 0xd7, 0xbc, 0x9b, 0x8b, 0xac, 0xaa, 0xac, + 0xad, 0x37, 0xb7, 0xb6, 0x46, 0xae, 0xa9, 0xbd, 0x6b, 0x90, 0x5e, 0xcd, + 0x23, 0xa4, 0x76, 0xa1, 0xc4, 0x96, 0x50, 0xcc, 0x95, 0x99, 0x93, 0xa7, + 0xb2, 0xe1, 0x7c, 0xbd, 0xbd, 0xb5, 0xbf, 0x9a, 0xca, 0x80, 0xd7, 0xae, + 0x79, 0xa8, 0xaa, 0xb2, 0xbc, 0x51, 0xda, 0xa3, 0x80, 0x8b, 0xa2, 0xc8, + 0xd1, 0x94, 0xe1, 0xc4, 0xbd, 0xae, 0xae, 0xcc, 0xb3, 0xca, 0xd5, 0xa1, + 0xd5, 0xa7, 0xaf, 0xd2, 0xb4, 0x8d, 0xcc, 0xc8, 0x63, 0xa3, 0xa4, 0xdf, + 0x6f, 0x7e, 0x98, 0xdf, 0x1b, 0x7b, 0x43, 0x99, 0xb0, 0x99, 0x71, 0xdb, + 0x63, 0x7b, 0x69, 0x9c, 0xba, 0xcd, 0x90, 0xd0, 0xb6, 0xa6, 0x9e, 0x95, + 0x50, 0xb6, 0xff, 0xff, 0xae, 0xb6, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc7, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, + 0xda, 0xb6, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x44, 0x00, 0x00, + 0x2c, 0x30, 0x38, 0x5a, 0x3d, 0x4c, 0x44, 0x3b, 0x48, 0x48, 0x44, 0x57, + 0x3f, 0x43, 0x45, 0x3a, 0x24, 0x32, 0x21, 0x5c, 0x3f, 0x3a, 0x38, 0x3a, + 0x35, 0x35, 0x2f, 0x51, 0x3c, 0x3a, 0x45, 0x3a, 0x3b, 0x41, 0x39, 0x55, + 0x3c, 0x41, 0x39, 0x44, 0x3a, 0x40, 0x37, 0x48, 0x33, 0x47, 0x36, 0x3e, + 0x3c, 0x41, 0x3f, 0x3e, 0x3e, 0x47, 0x36, 0x3e, 0x41, 0x33, 0x3e, 0x3b, + 0x3a, 0x46, 0x45, 0x40, 0x48, 0x3a, 0x35, 0x4b, 0x45, 0x4d, 0x3c, 0x49, + 0x42, 0x44, 0x3c, 0x4c, 0x3e, 0x3c, 0x44, 0x32, 0x33, 0x41, 0x36, 0x4b, + 0x38, 0x3b, 0x3c, 0x38, 0x3b, 0x45, 0x34, 0x46, 0x40, 0x4e, 0x44, 0x35, + 0x43, 0x36, 0x3d, 0x40, 0x3e, 0x48, 0x40, 0x34, 0x3a, 0x46, 0x45, 0x43, + 0x45, 0x3f, 0x47, 0x37, 0x36, 0x35, 0x44, 0x3a, 0x3e, 0x37, 0x39, 0x40, + 0x3a, 0x3f, 0x3f, 0x4c, 0x3e, 0x41, 0x43, 0x35, 0x3f, 0x3d, 0x3d, 0x4c, + 0x3c, 0x4a, 0x46, 0x3c, 0x3a, 0x41, 0x40, 0x4e, 0x36, 0x47, 0x40, 0x3b, + 0x47, 0x42, 0x38, 0x4d, 0x48, 0x47, 0x3c, 0x3c, 0x33, 0x3b, 0x3e, 0x42, + 0x3f, 0x3e, 0x3a, 0x3d, 0x32, 0x39, 0x41, 0x46, 0x3a, 0x3a, 0x3e, 0x3e, + 0x47, 0x48, 0x4e, 0x36, 0x44, 0x40, 0x41, 0x45, 0x3a, 0x3c, 0x38, 0x55, + 0x2e, 0x26, 0x2f, 0x32, 0x3f, 0x41, 0x3e, 0x4c, 0x45, 0x36, 0x40, 0x31, + 0x17, 0x2e, 0x14, 0x53, 0x34, 0x30, 0x34, 0x3f, 0x2e, 0x44, 0x2b, 0x4e, + 0x34, 0x3e, 0x34, 0x43, 0x3d, 0x35, 0x3f, 0x46, 0x39, 0x40, 0x38, 0x3e, + 0x35, 0x3b, 0x35, 0x45, 0x3d, 0x40, 0x38, 0x37, 0x40, 0x3e, 0x32, 0x3e, + 0x41, 0x39, 0x30, 0x41, 0x3a, 0x32, 0x3e, 0x3d, 0x39, 0x31, 0x33, 0x3e, + 0x41, 0x47, 0x40, 0x47, 0x35, 0x33, 0x3c, 0x32, 0x40, 0x3c, 0x42, 0x49, + 0x34, 0x38, 0x39, 0x37, 0x39, 0x35, 0x40, 0x4d, 0x37, 0x43, 0x42, 0x3e, + 0x3f, 0x3c, 0x3e, 0x51, 0x36, 0x37, 0x42, 0x41, 0x36, 0x31, 0x43, 0x3d, + 0x46, 0x43, 0x37, 0x46, 0x32, 0x45, 0x42, 0x36, 0x3f, 0x42, 0x42, 0x41, + 0x3d, 0x46, 0x39, 0x41, 0x3c, 0x3f, 0x38, 0x3c, 0x43, 0x43, 0x3d, 0x3c, + 0x3d, 0x41, 0x38, 0x42, 0x3a, 0x3d, 0x43, 0x42, 0x41, 0x40, 0x39, 0x36, + 0x3a, 0x3c, 0x3c, 0x4f, 0x44, 0x36, 0x39, 0x35, 0x46, 0x46, 0x36, 0x4a, + 0x3a, 0x42, 0x43, 0x39, 0x3f, 0x3d, 0x3c, 0x47, 0x38, 0x3f, 0x43, 0x40, + 0x36, 0x3c, 0x45, 0x3b, 0x33, 0x36, 0x3b, 0x39, 0x3c, 0x35, 0x40, 0x38, + 0x40, 0x3e, 0x3f, 0x48, 0x3f, 0x34, 0x40, 0x53, 0x26, 0x2c, 0x29, 0x39, + 0x2a, 0x38, 0x3f, 0x45, 0x32, 0x31, 0x4a, 0x37, 0x1c, 0x28, 0x09, 0x43, + 0x35, 0x3b, 0x33, 0x3c, 0x32, 0x3f, 0x28, 0x41, 0x36, 0x35, 0x3a, 0x37, + 0x41, 0x39, 0x32, 0x3c, 0x40, 0x3c, 0x3c, 0x32, 0x38, 0x39, 0x37, 0x44, + 0x3a, 0x33, 0x41, 0x36, 0x37, 0x3c, 0x35, 0x3a, 0x3d, 0x30, 0x3d, 0x41, + 0x37, 0x3c, 0x45, 0x3a, 0x37, 0x2f, 0x36, 0x3c, 0x3a, 0x3d, 0x39, 0x48, + 0x46, 0x33, 0x3a, 0x3e, 0x40, 0x3d, 0x3b, 0x52, 0x38, 0x45, 0x34, 0x47, + 0x39, 0x36, 0x37, 0x56, 0x42, 0x3f, 0x33, 0x36, 0x38, 0x3f, 0x40, 0x53, + 0x3e, 0x37, 0x3d, 0x3c, 0x48, 0x3a, 0x3d, 0x33, 0x39, 0x40, 0x3e, 0x35, + 0x3d, 0x46, 0x38, 0x36, 0x37, 0x43, 0x3a, 0x3c, 0x40, 0x38, 0x39, 0x3b, + 0x39, 0x3a, 0x42, 0x3d, 0x34, 0x3f, 0x35, 0x43, 0x3a, 0x35, 0x46, 0x3a, + 0x48, 0x38, 0x3b, 0x48, 0x3c, 0x35, 0x42, 0x3d, 0x3a, 0x3d, 0x38, 0x42, + 0x3e, 0x3c, 0x33, 0x39, 0x34, 0x30, 0x42, 0x44, 0x41, 0x3d, 0x3c, 0x39, + 0x3c, 0x3a, 0x39, 0x41, 0x3d, 0x44, 0x3c, 0x40, 0x3f, 0x3e, 0x42, 0x3f, + 0x37, 0x40, 0x39, 0x3b, 0x42, 0x43, 0x49, 0x37, 0x39, 0x46, 0x35, 0x3c, + 0x3e, 0x39, 0x45, 0x52, 0x24, 0x2d, 0x38, 0x35, 0x3a, 0x3a, 0x3c, 0x44, + 0x39, 0x32, 0x51, 0x3f, 0x16, 0x34, 0x0a, 0x49, 0x39, 0x38, 0x39, 0x3e, + 0x2f, 0x36, 0x24, 0x3f, 0x37, 0x34, 0x38, 0x3b, 0x34, 0x34, 0x30, 0x3b, + 0x3d, 0x36, 0x35, 0x42, 0x33, 0x40, 0x37, 0x35, 0x43, 0x3f, 0x3f, 0x39, + 0x3a, 0x43, 0x36, 0x3e, 0x39, 0x3d, 0x3f, 0x3d, 0x47, 0x3b, 0x39, 0x37, + 0x35, 0x42, 0x3f, 0x3b, 0x41, 0x3a, 0x42, 0x4b, 0x3d, 0x3f, 0x3d, 0x3e, + 0x38, 0x3b, 0x34, 0x4e, 0x3f, 0x39, 0x36, 0x43, 0x39, 0x35, 0x41, 0x4d, + 0x3c, 0x39, 0x43, 0x33, 0x37, 0x3b, 0x41, 0x48, 0x3c, 0x3f, 0x39, 0x32, + 0x35, 0x3d, 0x42, 0x35, 0x3d, 0x3e, 0x37, 0x3b, 0x38, 0x3a, 0x44, 0x36, + 0x42, 0x35, 0x48, 0x40, 0x3a, 0x44, 0x44, 0x39, 0x43, 0x41, 0x3c, 0x37, + 0x47, 0x3b, 0x42, 0x42, 0x45, 0x3a, 0x40, 0x46, 0x35, 0x3f, 0x3a, 0x48, + 0x35, 0x44, 0x3f, 0x37, 0x33, 0x3e, 0x45, 0x49, 0x39, 0x43, 0x47, 0x37, + 0x3f, 0x3f, 0x3b, 0x44, 0x38, 0x3d, 0x39, 0x42, 0x37, 0x3e, 0x40, 0x45, + 0x3b, 0x3f, 0x40, 0x34, 0x42, 0x3f, 0x43, 0x3c, 0x43, 0x41, 0x38, 0x38, + 0x38, 0x41, 0x55, 0x33, 0x33, 0x39, 0x39, 0x3c, 0x35, 0x39, 0x38, 0x42, + 0x27, 0x26, 0x32, 0x41, 0x41, 0x32, 0x3f, 0x47, 0x3a, 0x38, 0x48, 0x37, + 0x11, 0x27, 0x08, 0x49, 0x35, 0x42, 0x3c, 0x2e, 0x34, 0x43, 0x25, 0x3b, + 0x3a, 0x33, 0x37, 0x30, 0x3c, 0x36, 0x2d, 0x3c, 0x3b, 0x39, 0x3b, 0x40, + 0x46, 0x3a, 0x30, 0x42, 0x35, 0x32, 0x36, 0x3a, 0x3a, 0x34, 0x34, 0x33, + 0x3d, 0x30, 0x3b, 0x42, 0x41, 0x3f, 0x3d, 0x3b, 0x44, 0x3d, 0x41, 0x41, + 0x3d, 0x3f, 0x40, 0x51, 0x42, 0x42, 0x36, 0x45, 0x30, 0x40, 0x32, 0x4f, + 0x3a, 0x3c, 0x40, 0x39, 0x3d, 0x3b, 0x3e, 0x4b, 0x3d, 0x37, 0x42, 0x46, + 0x40, 0x40, 0x47, 0x3d, 0x35, 0x3c, 0x3f, 0x46, 0x37, 0x37, 0x3a, 0x2e, + 0x3d, 0x3c, 0x3a, 0x46, 0x3a, 0x44, 0x3c, 0x3a, 0x32, 0x44, 0x31, 0x41, + 0x43, 0x36, 0x49, 0x39, 0x3d, 0x37, 0x3f, 0x41, 0x3b, 0x3b, 0x3c, 0x42, + 0x3c, 0x34, 0x3f, 0x3b, 0x40, 0x3e, 0x48, 0x47, 0x3e, 0x3c, 0x38, 0x39, + 0x3f, 0x35, 0x39, 0x3f, 0x3e, 0x3e, 0x3b, 0x43, 0x41, 0x40, 0x43, 0x41, + 0x3f, 0x37, 0x39, 0x41, 0x46, 0x32, 0x3d, 0x41, 0x36, 0x3f, 0x3e, 0x3f, + 0x36, 0x48, 0x43, 0x3d, 0x43, 0x3f, 0x34, 0x3d, 0x34, 0x35, 0x4f, 0x32, + 0x3c, 0x3f, 0x3d, 0x3f, 0x39, 0x3c, 0x3d, 0x47, 0x23, 0x36, 0x33, 0x45, + 0x37, 0x2e, 0x42, 0x42, 0x39, 0x34, 0x4f, 0x3f, 0x19, 0x2b, 0x01, 0x50, + 0x35, 0x3f, 0x37, 0x3c, 0x33, 0x35, 0x25, 0x32, 0x38, 0x3e, 0x40, 0x40, + 0x2f, 0x38, 0x35, 0x3d, 0x31, 0x42, 0x44, 0x3c, 0x3a, 0x3d, 0x2d, 0x3e, + 0x3b, 0x3e, 0x3d, 0x31, 0x3b, 0x37, 0x35, 0x31, 0x36, 0x35, 0x34, 0x31, + 0x41, 0x3a, 0x33, 0x32, 0x3c, 0x31, 0x3e, 0x3d, 0x40, 0x3b, 0x34, 0x45, + 0x36, 0x39, 0x3e, 0x3f, 0x3c, 0x45, 0x37, 0x4b, 0x42, 0x3d, 0x33, 0x43, + 0x3e, 0x40, 0x35, 0x4e, 0x38, 0x36, 0x3a, 0x33, 0x38, 0x44, 0x3f, 0x3c, + 0x3f, 0x40, 0x3a, 0x3c, 0x3c, 0x3c, 0x44, 0x29, 0x3a, 0x40, 0x35, 0x3a, + 0x3d, 0x48, 0x3b, 0x30, 0x45, 0x41, 0x45, 0x40, 0x37, 0x32, 0x3a, 0x35, + 0x3f, 0x38, 0x3b, 0x43, 0x3b, 0x3f, 0x33, 0x40, 0x3b, 0x40, 0x38, 0x33, + 0x39, 0x3c, 0x3c, 0x3f, 0x43, 0x33, 0x43, 0x40, 0x43, 0x3d, 0x33, 0x42, + 0x40, 0x32, 0x3e, 0x36, 0x40, 0x38, 0x43, 0x40, 0x44, 0x38, 0x34, 0x3c, + 0x3e, 0x39, 0x47, 0x43, 0x40, 0x3b, 0x3f, 0x3f, 0x3c, 0x3b, 0x4b, 0x33, + 0x36, 0x49, 0x32, 0x41, 0x48, 0x45, 0x57, 0x3a, 0x40, 0x42, 0x40, 0x46, + 0x36, 0x35, 0x3c, 0x46, 0x22, 0x2e, 0x33, 0x3e, 0x3c, 0x39, 0x44, 0x4d, + 0x3f, 0x41, 0x51, 0x44, 0x15, 0x2e, 0x02, 0x4e, 0x39, 0x3a, 0x3c, 0x35, + 0x30, 0x38, 0x1e, 0x31, 0x40, 0x3b, 0x39, 0x3d, 0x3a, 0x37, 0x35, 0x36, + 0x46, 0x36, 0x3c, 0x3e, 0x39, 0x3e, 0x32, 0x40, 0x3b, 0x35, 0x42, 0x41, + 0x41, 0x38, 0x41, 0x35, 0x42, 0x36, 0x3c, 0x42, 0x3d, 0x41, 0x35, 0x31, + 0x3f, 0x44, 0x3e, 0x41, 0x3f, 0x35, 0x42, 0x4b, 0x3e, 0x36, 0x37, 0x34, + 0x36, 0x3d, 0x40, 0x49, 0x41, 0x3e, 0x3d, 0x3b, 0x38, 0x37, 0x40, 0x47, + 0x35, 0x32, 0x43, 0x38, 0x36, 0x3b, 0x33, 0x47, 0x33, 0x34, 0x3d, 0x47, + 0x3c, 0x37, 0x3d, 0x2b, 0x3a, 0x36, 0x3b, 0x3d, 0x43, 0x38, 0x35, 0x32, + 0x32, 0x37, 0x43, 0x36, 0x3f, 0x48, 0x38, 0x30, 0x3a, 0x3c, 0x42, 0x34, + 0x37, 0x3c, 0x37, 0x40, 0x48, 0x3e, 0x35, 0x3b, 0x3f, 0x38, 0x39, 0x3e, + 0x37, 0x35, 0x36, 0x3d, 0x3b, 0x3c, 0x40, 0x3d, 0x34, 0x40, 0x46, 0x42, + 0x3f, 0x3c, 0x3c, 0x3e, 0x40, 0x40, 0x3d, 0x3f, 0x3f, 0x44, 0x46, 0x41, + 0x32, 0x43, 0x40, 0x41, 0x3c, 0x42, 0x39, 0x38, 0x48, 0x44, 0x3d, 0x38, + 0x34, 0x40, 0x4e, 0x31, 0x3c, 0x42, 0x39, 0x48, 0x3c, 0x33, 0x3e, 0x40, + 0x20, 0x27, 0x39, 0x45, 0x45, 0x36, 0x47, 0x4c, 0x35, 0x3e, 0x4a, 0x36, + 0x16, 0x2f, 0x04, 0x4f, 0x3a, 0x35, 0x36, 0x3a, 0x2d, 0x36, 0x21, 0x34, + 0x3b, 0x32, 0x3d, 0x3c, 0x3c, 0x3f, 0x3b, 0x3b, 0x41, 0x46, 0x40, 0x3d, + 0x3b, 0x44, 0x33, 0x42, 0x34, 0x33, 0x3e, 0x45, 0x3f, 0x46, 0x39, 0x33, + 0x3b, 0x37, 0x37, 0x37, 0x42, 0x47, 0x3c, 0x35, 0x31, 0x41, 0x44, 0x3a, + 0x3b, 0x33, 0x39, 0x44, 0x42, 0x33, 0x3d, 0x3f, 0x43, 0x33, 0x41, 0x4a, + 0x35, 0x46, 0x36, 0x3e, 0x39, 0x41, 0x41, 0x4c, 0x34, 0x3d, 0x38, 0x33, + 0x3c, 0x3f, 0x43, 0x44, 0x37, 0x35, 0x35, 0x3c, 0x43, 0x34, 0x3e, 0x2d, + 0x3f, 0x35, 0x38, 0x3c, 0x33, 0x35, 0x43, 0x2a, 0x40, 0x33, 0x34, 0x40, + 0x3d, 0x38, 0x36, 0x2d, 0x36, 0x3c, 0x43, 0x3d, 0x37, 0x3d, 0x39, 0x38, + 0x3b, 0x3e, 0x3c, 0x46, 0x35, 0x35, 0x43, 0x44, 0x39, 0x40, 0x34, 0x39, + 0x3d, 0x34, 0x40, 0x45, 0x38, 0x35, 0x3e, 0x39, 0x3c, 0x44, 0x48, 0x44, + 0x41, 0x3e, 0x3c, 0x45, 0x3a, 0x3c, 0x3c, 0x46, 0x3a, 0x40, 0x39, 0x43, + 0x35, 0x35, 0x3e, 0x45, 0x3a, 0x34, 0x3c, 0x39, 0x46, 0x3a, 0x4f, 0x35, + 0x32, 0x3d, 0x36, 0x41, 0x32, 0x38, 0x3f, 0x45, 0x2d, 0x34, 0x2a, 0x35, + 0x43, 0x3f, 0x41, 0x49, 0x41, 0x3c, 0x4b, 0x3f, 0x17, 0x31, 0x02, 0x4f, + 0x30, 0x38, 0x39, 0x40, 0x33, 0x3a, 0x25, 0x38, 0x35, 0x3c, 0x39, 0x35, + 0x34, 0x41, 0x34, 0x43, 0x40, 0x40, 0x46, 0x3d, 0x40, 0x38, 0x3f, 0x3b, + 0x35, 0x39, 0x3c, 0x39, 0x34, 0x38, 0x3f, 0x36, 0x3a, 0x38, 0x44, 0x3f, + 0x3f, 0x38, 0x3c, 0x33, 0x41, 0x42, 0x38, 0x33, 0x3c, 0x3b, 0x3c, 0x46, + 0x38, 0x3b, 0x3f, 0x33, 0x3f, 0x48, 0x3b, 0x49, 0x3f, 0x3a, 0x3d, 0x3f, + 0x47, 0x3d, 0x30, 0x45, 0x36, 0x42, 0x3d, 0x36, 0x43, 0x38, 0x3b, 0x3d, + 0x3c, 0x30, 0x3b, 0x43, 0x3d, 0x41, 0x34, 0x2e, 0x43, 0x3d, 0x43, 0x46, + 0x43, 0x3c, 0x3c, 0x2e, 0x3c, 0x43, 0x34, 0x43, 0x3e, 0x43, 0x3f, 0x2b, + 0x45, 0x40, 0x3a, 0x43, 0x36, 0x39, 0x3f, 0x3d, 0x3a, 0x3c, 0x35, 0x3b, + 0x36, 0x3f, 0x45, 0x3e, 0x45, 0x40, 0x3f, 0x36, 0x45, 0x42, 0x35, 0x3e, + 0x3a, 0x3a, 0x3f, 0x40, 0x3e, 0x3c, 0x39, 0x46, 0x43, 0x3e, 0x3f, 0x3f, + 0x40, 0x3c, 0x40, 0x4b, 0x41, 0x35, 0x3b, 0x3e, 0x49, 0x32, 0x3e, 0x41, + 0x31, 0x37, 0x3d, 0x3b, 0x3f, 0x45, 0x50, 0x3a, 0x3f, 0x3c, 0x44, 0x36, + 0x43, 0x37, 0x3d, 0x4b, 0x29, 0x39, 0x2f, 0x38, 0x45, 0x36, 0x40, 0x4e, + 0x39, 0x3f, 0x48, 0x43, 0x23, 0x3c, 0x06, 0x51, 0x37, 0x3b, 0x3e, 0x3b, + 0x28, 0x45, 0x2b, 0x37, 0x3f, 0x33, 0x3f, 0x41, 0x31, 0x36, 0x33, 0x3a, + 0x3a, 0x35, 0x3b, 0x33, 0x3e, 0x36, 0x35, 0x40, 0x3a, 0x34, 0x3a, 0x38, + 0x34, 0x3a, 0x3a, 0x34, 0x42, 0x45, 0x40, 0x3e, 0x40, 0x38, 0x39, 0x34, + 0x38, 0x37, 0x3f, 0x3e, 0x3c, 0x32, 0x3f, 0x46, 0x3f, 0x44, 0x3b, 0x3e, + 0x44, 0x45, 0x36, 0x3e, 0x36, 0x3f, 0x3b, 0x40, 0x39, 0x34, 0x38, 0x41, + 0x42, 0x3e, 0x3d, 0x47, 0x3e, 0x45, 0x33, 0x40, 0x3e, 0x3a, 0x44, 0x3d, + 0x3c, 0x3a, 0x3a, 0x2c, 0x3a, 0x3d, 0x35, 0x45, 0x3c, 0x41, 0x36, 0x30, + 0x32, 0x32, 0x3a, 0x3b, 0x35, 0x3c, 0x43, 0x2d, 0x35, 0x3f, 0x41, 0x37, + 0x3f, 0x46, 0x34, 0x39, 0x3c, 0x43, 0x40, 0x3e, 0x3e, 0x36, 0x3e, 0x3c, + 0x37, 0x3a, 0x3d, 0x3a, 0x3c, 0x38, 0x44, 0x41, 0x3f, 0x3b, 0x3c, 0x47, + 0x40, 0x3b, 0x41, 0x47, 0x3e, 0x45, 0x39, 0x3e, 0x37, 0x45, 0x4b, 0x4c, + 0x37, 0x37, 0x37, 0x3c, 0x3c, 0x3d, 0x40, 0x38, 0x39, 0x3e, 0x43, 0x3f, + 0x38, 0x45, 0x51, 0x3c, 0x31, 0x34, 0x3b, 0x48, 0x46, 0x41, 0x40, 0x40, + 0x2c, 0x39, 0x32, 0x42, 0x3c, 0x2e, 0x49, 0x4d, 0x3c, 0x3f, 0x45, 0x38, + 0x20, 0x38, 0x03, 0x55, 0x33, 0x3e, 0x32, 0x39, 0x32, 0x3b, 0x24, 0x2b, + 0x42, 0x35, 0x45, 0x32, 0x2e, 0x3b, 0x2f, 0x3f, 0x3c, 0x37, 0x39, 0x3b, + 0x34, 0x34, 0x3d, 0x36, 0x3d, 0x39, 0x3b, 0x30, 0x3c, 0x3e, 0x40, 0x32, + 0x3d, 0x3c, 0x3c, 0x3e, 0x33, 0x33, 0x3f, 0x3a, 0x33, 0x3e, 0x46, 0x36, + 0x3a, 0x3d, 0x40, 0x40, 0x3f, 0x41, 0x3a, 0x42, 0x34, 0x32, 0x34, 0x46, + 0x3b, 0x31, 0x40, 0x37, 0x37, 0x32, 0x3e, 0x47, 0x3f, 0x3b, 0x3e, 0x43, + 0x49, 0x45, 0x3a, 0x3d, 0x3e, 0x44, 0x40, 0x31, 0x39, 0x3e, 0x3b, 0x2d, + 0x3b, 0x3a, 0x33, 0x3d, 0x39, 0x37, 0x3e, 0x32, 0x41, 0x3c, 0x3a, 0x37, + 0x3b, 0x40, 0x39, 0x2f, 0x3e, 0x3f, 0x47, 0x32, 0x3e, 0x3b, 0x3e, 0x3e, + 0x40, 0x3e, 0x40, 0x3c, 0x41, 0x39, 0x38, 0x46, 0x45, 0x32, 0x47, 0x31, + 0x36, 0x47, 0x37, 0x49, 0x3a, 0x3f, 0x47, 0x3a, 0x41, 0x3b, 0x3c, 0x4f, + 0x3e, 0x36, 0x3b, 0x47, 0x35, 0x39, 0x41, 0x4e, 0x3d, 0x3e, 0x3b, 0x46, + 0x38, 0x39, 0x3b, 0x45, 0x3e, 0x3f, 0x44, 0x42, 0x44, 0x3f, 0x55, 0x3b, + 0x41, 0x3d, 0x43, 0x43, 0x37, 0x3f, 0x3d, 0x4c, 0x28, 0x3d, 0x36, 0x3c, + 0x3e, 0x3e, 0x48, 0x50, 0x3e, 0x39, 0x45, 0x41, 0x22, 0x37, 0x07, 0x4f, + 0x2e, 0x33, 0x38, 0x3f, 0x31, 0x3a, 0x1b, 0x36, 0x34, 0x38, 0x3c, 0x37, + 0x37, 0x3e, 0x36, 0x35, 0x36, 0x3b, 0x3d, 0x38, 0x42, 0x48, 0x3d, 0x40, + 0x40, 0x44, 0x3d, 0x39, 0x37, 0x3b, 0x3d, 0x33, 0x3d, 0x35, 0x42, 0x3c, + 0x39, 0x3e, 0x43, 0x2d, 0x3c, 0x40, 0x43, 0x43, 0x45, 0x35, 0x3c, 0x44, + 0x34, 0x3c, 0x3d, 0x31, 0x39, 0x40, 0x39, 0x3d, 0x3e, 0x34, 0x3e, 0x3b, + 0x40, 0x38, 0x42, 0x4a, 0x40, 0x3b, 0x35, 0x3d, 0x36, 0x38, 0x35, 0x42, + 0x3c, 0x3c, 0x3d, 0x3b, 0x38, 0x39, 0x45, 0x28, 0x3a, 0x37, 0x37, 0x35, + 0x3a, 0x3d, 0x35, 0x2a, 0x3c, 0x3f, 0x37, 0x34, 0x37, 0x3f, 0x3e, 0x2b, + 0x39, 0x43, 0x3b, 0x45, 0x35, 0x36, 0x36, 0x42, 0x33, 0x38, 0x3b, 0x35, + 0x31, 0x3f, 0x41, 0x41, 0x3c, 0x41, 0x45, 0x42, 0x3b, 0x3c, 0x39, 0x46, + 0x3c, 0x3e, 0x3a, 0x41, 0x39, 0x3d, 0x41, 0x4b, 0x40, 0x3f, 0x43, 0x3d, + 0x39, 0x39, 0x44, 0x44, 0x37, 0x42, 0x3f, 0x44, 0x3e, 0x37, 0x42, 0x35, + 0x44, 0x3f, 0x40, 0x42, 0x3f, 0x3a, 0x47, 0x3d, 0x38, 0x3a, 0x3b, 0x3a, + 0x42, 0x36, 0x3a, 0x97, 0x32, 0x31, 0x30, 0x36, 0x47, 0x3e, 0x46, 0x51, + 0x42, 0x34, 0x50, 0x34, 0x26, 0x3b, 0x06, 0x55, 0x3c, 0x3b, 0x2d, 0x3a, + 0x37, 0x37, 0x1b, 0x32, 0x39, 0x3d, 0x36, 0x40, 0x3b, 0x3f, 0x33, 0x33, + 0x3d, 0x37, 0x35, 0x37, 0x44, 0x3f, 0x35, 0x39, 0x33, 0x3c, 0x43, 0x39, + 0x3f, 0x42, 0x3e, 0x34, 0x38, 0x38, 0x39, 0x3c, 0x48, 0x3c, 0x2f, 0x30, + 0x40, 0x3c, 0x41, 0x3e, 0x3f, 0x3e, 0x36, 0x43, 0x40, 0x3c, 0x36, 0x43, + 0x43, 0x38, 0x3a, 0x47, 0x3e, 0x37, 0x39, 0x3a, 0x43, 0x45, 0x38, 0x43, + 0x3b, 0x45, 0x37, 0x44, 0x36, 0x45, 0x3a, 0x3e, 0x3e, 0x3e, 0x3d, 0x33, + 0x39, 0x36, 0x48, 0x33, 0x30, 0x42, 0x33, 0x39, 0x37, 0x3a, 0x3f, 0x34, + 0x34, 0x40, 0x40, 0x40, 0x3f, 0x3d, 0x3f, 0x33, 0x41, 0x40, 0x3b, 0x43, + 0x3b, 0x3a, 0x40, 0x3a, 0x38, 0x3e, 0x38, 0x3b, 0x38, 0x42, 0x40, 0x40, + 0x41, 0x35, 0x37, 0x38, 0x3b, 0x3c, 0x39, 0x4b, 0x32, 0x39, 0x42, 0x3c, + 0x36, 0x3d, 0x32, 0x52, 0x3a, 0x31, 0x40, 0x40, 0x3a, 0x43, 0x3d, 0x46, + 0x3c, 0x3e, 0x3e, 0x33, 0x3f, 0x41, 0x4d, 0x37, 0x39, 0x39, 0x3e, 0x3b, + 0x40, 0x39, 0x53, 0x2d, 0x46, 0x3c, 0x32, 0x42, 0x3d, 0x40, 0x40, 0x4d, + 0x2e, 0x34, 0x39, 0x3b, 0x46, 0x3b, 0x42, 0x4f, 0x3d, 0x39, 0x4e, 0x36, + 0x1a, 0x31, 0x0e, 0x56, 0x36, 0x42, 0x38, 0x44, 0x36, 0x3a, 0x20, 0x30, + 0x36, 0x34, 0x37, 0x38, 0x40, 0x41, 0x2a, 0x35, 0x3b, 0x3b, 0x3a, 0x38, + 0x33, 0x39, 0x36, 0x41, 0x43, 0x39, 0x35, 0x3d, 0x37, 0x3d, 0x33, 0x31, + 0x45, 0x33, 0x3f, 0x3b, 0x44, 0x38, 0x39, 0x34, 0x38, 0x39, 0x38, 0x3d, + 0x3a, 0x3a, 0x41, 0x40, 0x44, 0x3e, 0x3f, 0x45, 0x34, 0x31, 0x34, 0x43, + 0x3b, 0x34, 0x42, 0x3c, 0x3c, 0x43, 0x35, 0x45, 0x36, 0x38, 0x3d, 0x3c, + 0x3f, 0x3d, 0x3e, 0x45, 0x41, 0x43, 0x35, 0x3f, 0x40, 0x3f, 0x3a, 0x34, + 0x3d, 0x32, 0x41, 0x3d, 0x48, 0x42, 0x37, 0x2a, 0x3c, 0x3a, 0x3e, 0x49, + 0x38, 0x36, 0x38, 0x2e, 0x36, 0x37, 0x34, 0x3e, 0x3c, 0x43, 0x43, 0x39, + 0x39, 0x3b, 0x44, 0x46, 0x44, 0x43, 0x37, 0x46, 0x43, 0x34, 0x3b, 0x35, + 0x42, 0x41, 0x3f, 0x3d, 0x3d, 0x3a, 0x42, 0x3e, 0x38, 0x47, 0x3d, 0x49, + 0x45, 0x49, 0x3a, 0x3c, 0x3e, 0x37, 0x40, 0x46, 0x41, 0x33, 0x45, 0x36, + 0x37, 0x44, 0x49, 0x3b, 0x44, 0x40, 0x33, 0x46, 0x37, 0x39, 0x4e, 0x3a, + 0x43, 0x38, 0x3a, 0x42, 0x3a, 0x3d, 0x45, 0x50, 0x26, 0x34, 0x3b, 0x3c, + 0x46, 0x46, 0x4c, 0x54, 0x3f, 0x35, 0x4e, 0x47, 0x21, 0x39, 0x0e, 0x54, + 0x3a, 0x3a, 0x2f, 0x40, 0x2d, 0x3a, 0x1f, 0x31, 0x31, 0x42, 0x34, 0x45, + 0x37, 0x36, 0x30, 0x3b, 0x3a, 0x3a, 0x36, 0x40, 0x32, 0x36, 0x3c, 0x3c, + 0x37, 0x42, 0x35, 0x3e, 0x39, 0x47, 0x36, 0x32, 0x41, 0x30, 0x42, 0x39, + 0x39, 0x44, 0x37, 0x30, 0x41, 0x3b, 0x3d, 0x3d, 0x43, 0x3b, 0x38, 0x45, + 0x3b, 0x3a, 0x39, 0x3a, 0x31, 0x33, 0x43, 0x46, 0x3f, 0x41, 0x44, 0x3f, + 0x3b, 0x44, 0x3a, 0x4c, 0x33, 0x33, 0x33, 0x3e, 0x37, 0x3e, 0x45, 0x45, + 0x36, 0x42, 0x3e, 0x43, 0x40, 0x34, 0x36, 0x31, 0x38, 0x34, 0x41, 0x3b, + 0x32, 0x38, 0x3e, 0x29, 0x47, 0x33, 0x37, 0x45, 0x3c, 0x3d, 0x43, 0x2c, + 0x36, 0x3a, 0x3c, 0x40, 0x3d, 0x46, 0x3c, 0x37, 0x40, 0x44, 0x37, 0x38, + 0x3e, 0x41, 0x3c, 0x40, 0x33, 0x3f, 0x44, 0x32, 0x44, 0x3a, 0x43, 0x42, + 0x3e, 0x38, 0x44, 0x3b, 0x41, 0x48, 0x3f, 0x4e, 0x3f, 0x44, 0x35, 0x45, + 0x34, 0x3f, 0x42, 0x4b, 0x37, 0x37, 0x3e, 0x45, 0x46, 0x45, 0x46, 0x3d, + 0x3e, 0x39, 0x3b, 0x3a, 0x46, 0x3a, 0x56, 0x35, 0x46, 0x3d, 0x40, 0x3b, + 0x36, 0x39, 0x3f, 0x54, 0x27, 0x2b, 0x34, 0x3c, 0x48, 0x3d, 0x49, 0x4c, + 0x3e, 0x3d, 0x4e, 0x42, 0x25, 0x3b, 0x10, 0x4d, 0x30, 0x36, 0x3e, 0x36, + 0x2e, 0x31, 0x1d, 0x37, 0x3a, 0x39, 0x33, 0x3f, 0x39, 0x38, 0x2e, 0x36, + 0x44, 0x3e, 0x41, 0x37, 0x3b, 0x30, 0x3b, 0x48, 0x31, 0x39, 0x41, 0x3e, + 0x37, 0x37, 0x34, 0x2f, 0x35, 0x3b, 0x3a, 0x3e, 0x45, 0x3e, 0x3f, 0x35, + 0x39, 0x39, 0x3b, 0x44, 0x43, 0x3c, 0x3e, 0x46, 0x40, 0x3a, 0x36, 0x45, + 0x41, 0x40, 0x36, 0x44, 0x3a, 0x37, 0x47, 0x47, 0x3d, 0x36, 0x43, 0x4e, + 0x3b, 0x38, 0x40, 0x48, 0x44, 0x43, 0x45, 0x3f, 0x43, 0x3c, 0x3b, 0x37, + 0x43, 0x41, 0x39, 0x2f, 0x3d, 0x45, 0x3e, 0x3e, 0x42, 0x40, 0x41, 0x2f, + 0x47, 0x38, 0x3a, 0x48, 0x3e, 0x35, 0x37, 0x2a, 0x34, 0x38, 0x41, 0x3b, + 0x3d, 0x37, 0x3b, 0x35, 0x38, 0x3e, 0x41, 0x3c, 0x41, 0x43, 0x3d, 0x46, + 0x47, 0x47, 0x3d, 0x35, 0x48, 0x41, 0x3d, 0x3e, 0x34, 0x47, 0x38, 0x38, + 0x39, 0x3e, 0x38, 0x4d, 0x43, 0x36, 0x42, 0x40, 0x3e, 0x41, 0x3f, 0x4c, + 0x3e, 0x3e, 0x37, 0x44, 0x3e, 0x3b, 0x47, 0x3e, 0x3f, 0x3b, 0x39, 0x3c, + 0x3c, 0x3c, 0x53, 0x3b, 0x3b, 0x32, 0x3e, 0x3f, 0x32, 0x3c, 0x37, 0x4b, + 0x33, 0x30, 0x2f, 0x41, 0x47, 0x42, 0x49, 0x4f, 0x3b, 0x42, 0x4c, 0x44, + 0x1f, 0x37, 0x16, 0x4e, 0x3b, 0x3f, 0x30, 0x36, 0x35, 0x38, 0x26, 0x36, + 0x32, 0x3b, 0x38, 0x3c, 0x30, 0x3e, 0x34, 0x3e, 0x3d, 0x34, 0x39, 0x3c, + 0x36, 0x47, 0x34, 0x41, 0x31, 0x39, 0x44, 0x3e, 0x39, 0x41, 0x32, 0x36, + 0x3b, 0x3f, 0x32, 0x3d, 0x36, 0x3e, 0x40, 0x3d, 0x45, 0x32, 0x45, 0x42, + 0x38, 0x43, 0x40, 0x42, 0x34, 0x3a, 0x43, 0x38, 0x47, 0x3f, 0x41, 0x47, + 0x34, 0x44, 0x41, 0x39, 0x3c, 0x46, 0x36, 0x4f, 0x41, 0x3e, 0x38, 0x38, + 0x3a, 0x3b, 0x43, 0x44, 0x37, 0x3f, 0x35, 0x43, 0x34, 0x3d, 0x40, 0x32, + 0x3a, 0x3b, 0x3d, 0x34, 0x35, 0x43, 0x31, 0x2c, 0x3b, 0x36, 0x38, 0x41, + 0x3c, 0x38, 0x3d, 0x31, 0x45, 0x46, 0x42, 0x41, 0x33, 0x3f, 0x3f, 0x3a, + 0x36, 0x3f, 0x3c, 0x3c, 0x3c, 0x3e, 0x39, 0x3e, 0x40, 0x37, 0x47, 0x3e, + 0x35, 0x39, 0x3d, 0x3d, 0x37, 0x36, 0x3e, 0x45, 0x38, 0x3d, 0x45, 0x43, + 0x3a, 0x32, 0x3b, 0x3a, 0x32, 0x3c, 0x3d, 0x43, 0x3d, 0x33, 0x3b, 0x3d, + 0x46, 0x3a, 0x44, 0x45, 0x3b, 0x3e, 0x3c, 0x42, 0x37, 0x37, 0x52, 0x2a, + 0x3a, 0x35, 0x35, 0x3f, 0x40, 0x38, 0x40, 0x5b, 0x35, 0x32, 0x2b, 0x3d, + 0x4a, 0x3c, 0x46, 0x56, 0x44, 0x30, 0x4d, 0x39, 0x20, 0x32, 0x0f, 0x4f, + 0x33, 0x3c, 0x35, 0x35, 0x3a, 0x45, 0x29, 0x3b, 0x31, 0x38, 0x34, 0x38, + 0x42, 0x45, 0x37, 0x3e, 0x37, 0x2e, 0x36, 0x43, 0x3f, 0x38, 0x2f, 0x41, + 0x3f, 0x41, 0x3c, 0x31, 0x37, 0x36, 0x37, 0x39, 0x41, 0x3a, 0x3a, 0x40, + 0x3e, 0x47, 0x3d, 0x37, 0x3c, 0x38, 0x35, 0x39, 0x3a, 0x43, 0x3f, 0x42, + 0x42, 0x38, 0x3e, 0x40, 0x3c, 0x3a, 0x45, 0x48, 0x37, 0x3a, 0x3e, 0x35, + 0x3a, 0x3d, 0x45, 0x4a, 0x3d, 0x37, 0x38, 0x3a, 0x3d, 0x46, 0x46, 0x41, + 0x37, 0x41, 0x40, 0x48, 0x37, 0x34, 0x3b, 0x2c, 0x39, 0x34, 0x37, 0x35, + 0x3a, 0x43, 0x39, 0x2e, 0x39, 0x3f, 0x40, 0x3e, 0x40, 0x40, 0x3c, 0x2d, + 0x3e, 0x3c, 0x37, 0x39, 0x3c, 0x3b, 0x3d, 0x3f, 0x41, 0x48, 0x3b, 0x3d, + 0x3b, 0x41, 0x45, 0x3e, 0x3a, 0x38, 0x3f, 0x3c, 0x3d, 0x3e, 0x40, 0x42, + 0x46, 0x38, 0x43, 0x34, 0x35, 0x47, 0x3d, 0x46, 0x3f, 0x3e, 0x32, 0x3f, + 0x3e, 0x3d, 0x47, 0x46, 0x38, 0x41, 0x45, 0x3f, 0x34, 0x3f, 0x41, 0x43, + 0x3e, 0x3e, 0x44, 0x3b, 0x3b, 0x36, 0x51, 0x32, 0x37, 0x3c, 0x42, 0x43, + 0x33, 0x39, 0x42, 0x61, 0x2c, 0x3b, 0x2e, 0x39, 0x42, 0x39, 0x42, 0x54, + 0x3c, 0x3a, 0x48, 0x35, 0x26, 0x34, 0x15, 0x51, 0x35, 0x40, 0x36, 0x3c, + 0x2d, 0x37, 0x25, 0x38, 0x33, 0x3d, 0x3d, 0x39, 0x3e, 0x3b, 0x2e, 0x4b, + 0x3d, 0x3b, 0x42, 0x37, 0x37, 0x40, 0x37, 0x40, 0x35, 0x45, 0x37, 0x37, + 0x3f, 0x41, 0x36, 0x39, 0x3c, 0x32, 0x3e, 0x38, 0x41, 0x40, 0x3e, 0x3f, + 0x3b, 0x3c, 0x43, 0x35, 0x3e, 0x3d, 0x44, 0x44, 0x3a, 0x36, 0x39, 0x3f, + 0x3a, 0x31, 0x42, 0x4d, 0x40, 0x33, 0x40, 0x45, 0x44, 0x3d, 0x40, 0x49, + 0x41, 0x3f, 0x42, 0x3a, 0x34, 0x46, 0x38, 0x46, 0x42, 0x34, 0x3a, 0x40, + 0x40, 0x41, 0x3d, 0x32, 0x35, 0x48, 0x35, 0x3e, 0x44, 0x41, 0x40, 0x2c, + 0x46, 0x38, 0x38, 0x3f, 0x36, 0x40, 0x38, 0x2a, 0x43, 0x41, 0x3e, 0x35, + 0x46, 0x3a, 0x45, 0x46, 0x46, 0x42, 0x3a, 0x3b, 0x40, 0x38, 0x35, 0x43, + 0x38, 0x3d, 0x3b, 0x41, 0x36, 0x44, 0x3f, 0x3f, 0x34, 0x3e, 0x3c, 0x3d, + 0x49, 0x36, 0x37, 0x4b, 0x38, 0x3c, 0x43, 0x37, 0x3a, 0x3f, 0x31, 0x45, + 0x3b, 0x39, 0x3f, 0x40, 0x37, 0x3c, 0x42, 0x3f, 0x3c, 0x33, 0x40, 0x3b, + 0x32, 0x3c, 0x52, 0x31, 0x3d, 0x44, 0x3b, 0x31, 0x46, 0x38, 0x40, 0x60, + 0x2b, 0x3c, 0x37, 0x34, 0x43, 0x38, 0x45, 0x57, 0x37, 0x39, 0x49, 0x33, + 0x2d, 0x3f, 0x18, 0x4e, 0x39, 0x39, 0x32, 0x3b, 0x34, 0x3b, 0x2c, 0x45, + 0x33, 0x37, 0x45, 0x42, 0x3d, 0x37, 0x2a, 0x4c, 0x3d, 0x3f, 0x3c, 0x36, + 0x37, 0x3c, 0x39, 0x47, 0x3d, 0x44, 0x3d, 0x40, 0x3d, 0x41, 0x34, 0x3e, + 0x40, 0x34, 0x3b, 0x3a, 0x41, 0x36, 0x37, 0x40, 0x3e, 0x3f, 0x3a, 0x36, + 0x3e, 0x35, 0x3b, 0x48, 0x41, 0x40, 0x3c, 0x42, 0x34, 0x41, 0x3f, 0x44, + 0x34, 0x39, 0x33, 0x39, 0x39, 0x47, 0x40, 0x48, 0x38, 0x3a, 0x43, 0x43, + 0x48, 0x3a, 0x3f, 0x46, 0x35, 0x3a, 0x33, 0x36, 0x32, 0x3c, 0x40, 0x34, + 0x40, 0x3a, 0x42, 0x3a, 0x39, 0x38, 0x41, 0x35, 0x3a, 0x3f, 0x35, 0x40, + 0x3f, 0x39, 0x39, 0x36, 0x38, 0x40, 0x3e, 0x3e, 0x3a, 0x31, 0x32, 0x44, + 0x40, 0x47, 0x3a, 0x3c, 0x43, 0x43, 0x46, 0x48, 0x40, 0x35, 0x3d, 0x37, + 0x44, 0x37, 0x33, 0x44, 0x3b, 0x3e, 0x3f, 0x37, 0x36, 0x3a, 0x38, 0x47, + 0x3a, 0x44, 0x36, 0x42, 0x3e, 0x44, 0x34, 0x46, 0x33, 0x43, 0x44, 0x3e, + 0x30, 0x48, 0x37, 0x38, 0x33, 0x3c, 0x46, 0x42, 0x38, 0x3d, 0x50, 0x39, + 0x33, 0x38, 0x3e, 0x40, 0x3b, 0x2b, 0x3b, 0x5f, 0x2b, 0x32, 0x2f, 0x37, + 0x3f, 0x3a, 0x40, 0x4e, 0x34, 0x38, 0x47, 0x37, 0x27, 0x2b, 0x1b, 0x4f, + 0x36, 0x38, 0x3a, 0x3a, 0x3b, 0x38, 0x2e, 0x3f, 0x3f, 0x42, 0x42, 0x42, + 0x36, 0x3e, 0x3c, 0x55, 0x39, 0x40, 0x44, 0x43, 0x3e, 0x33, 0x3c, 0x43, + 0x38, 0x44, 0x3b, 0x46, 0x3f, 0x45, 0x34, 0x38, 0x3c, 0x41, 0x42, 0x3d, + 0x42, 0x36, 0x43, 0x3f, 0x3c, 0x39, 0x3e, 0x39, 0x39, 0x42, 0x33, 0x47, + 0x36, 0x3d, 0x3f, 0x3b, 0x40, 0x39, 0x3b, 0x49, 0x36, 0x40, 0x3d, 0x41, + 0x40, 0x34, 0x3b, 0x4e, 0x3b, 0x36, 0x3b, 0x45, 0x40, 0x32, 0x3b, 0x49, + 0x37, 0x38, 0x3a, 0x47, 0x37, 0x40, 0x3e, 0x38, 0x40, 0x3f, 0x3c, 0x3a, + 0x47, 0x41, 0x42, 0x30, 0x40, 0x3c, 0x42, 0x3f, 0x31, 0x44, 0x39, 0x38, + 0x3b, 0x38, 0x42, 0x43, 0x41, 0x35, 0x3a, 0x39, 0x3e, 0x38, 0x39, 0x3e, + 0x3c, 0x42, 0x3d, 0x49, 0x47, 0x3c, 0x3f, 0x35, 0x41, 0x3a, 0x36, 0x43, + 0x43, 0x3b, 0x39, 0x3b, 0x36, 0x43, 0x43, 0x4e, 0x3e, 0x35, 0x37, 0x3b, + 0x3f, 0x37, 0x41, 0x48, 0x32, 0x44, 0x43, 0x32, 0x38, 0x39, 0x45, 0x39, + 0x3e, 0x3d, 0x35, 0x39, 0x35, 0x39, 0x50, 0x37, 0x39, 0x40, 0x43, 0x47, + 0x32, 0x2a, 0x40, 0x62, 0x24, 0x30, 0x36, 0x3e, 0x41, 0x32, 0x47, 0x58, + 0x39, 0x36, 0x44, 0x34, 0x26, 0x34, 0x1e, 0x50, 0x3c, 0x3b, 0x3f, 0x42, + 0x35, 0x3d, 0x2a, 0x4e, 0x40, 0x38, 0x36, 0x31, 0x3a, 0x30, 0x37, 0x4b, + 0x3c, 0x3b, 0x3b, 0x41, 0x3b, 0x3c, 0x2e, 0x45, 0x44, 0x3f, 0x3b, 0x35, + 0x3e, 0x33, 0x37, 0x3d, 0x40, 0x39, 0x39, 0x37, 0x40, 0x3e, 0x3a, 0x3e, + 0x3c, 0x3c, 0x45, 0x40, 0x3c, 0x3f, 0x3a, 0x51, 0x47, 0x3a, 0x34, 0x39, + 0x3b, 0x34, 0x44, 0x4c, 0x36, 0x3d, 0x3a, 0x35, 0x34, 0x36, 0x38, 0x4b, + 0x3f, 0x40, 0x3f, 0x3e, 0x40, 0x41, 0x47, 0x43, 0x32, 0x38, 0x46, 0x44, + 0x46, 0x43, 0x43, 0x37, 0x39, 0x49, 0x37, 0x36, 0x3e, 0x3d, 0x37, 0x3c, + 0x39, 0x37, 0x34, 0x43, 0x45, 0x32, 0x3a, 0x3a, 0x38, 0x43, 0x3b, 0x40, + 0x3b, 0x3f, 0x3d, 0x41, 0x40, 0x3d, 0x3a, 0x3b, 0x48, 0x37, 0x3d, 0x41, + 0x40, 0x3e, 0x38, 0x41, 0x3d, 0x3a, 0x38, 0x49, 0x40, 0x3c, 0x42, 0x41, + 0x3a, 0x38, 0x38, 0x4c, 0x3e, 0x41, 0x40, 0x3b, 0x3d, 0x3e, 0x3c, 0x46, + 0x3e, 0x42, 0x41, 0x38, 0x42, 0x42, 0x41, 0x3e, 0x3e, 0x37, 0x3c, 0x43, + 0x43, 0x3b, 0x54, 0x2b, 0x45, 0x3b, 0x43, 0x41, 0x41, 0x26, 0x3f, 0x60, + 0x25, 0x2b, 0x2e, 0x3a, 0x40, 0x31, 0x40, 0x49, 0x40, 0x31, 0x46, 0x3c, + 0x1e, 0x2a, 0x1a, 0x47, 0x33, 0x37, 0x37, 0x34, 0x31, 0x36, 0x25, 0x41, + 0x2e, 0x36, 0x35, 0x33, 0x33, 0x34, 0x31, 0x45, 0x3a, 0x3f, 0x3d, 0x40, + 0x3c, 0x41, 0x30, 0x3c, 0x3f, 0x46, 0x37, 0x3c, 0x3a, 0x3c, 0x36, 0x3a, + 0x47, 0x3d, 0x31, 0x3f, 0x40, 0x3e, 0x36, 0x44, 0x41, 0x3d, 0x36, 0x3f, + 0x37, 0x3f, 0x34, 0x4b, 0x31, 0x47, 0x43, 0x3e, 0x3e, 0x3a, 0x3b, 0x4b, + 0x37, 0x32, 0x38, 0x3d, 0x37, 0x47, 0x46, 0x4d, 0x36, 0x3c, 0x3f, 0x3a, + 0x41, 0x31, 0x47, 0x43, 0x3d, 0x3d, 0x3e, 0x35, 0x3d, 0x46, 0x49, 0x2a, + 0x37, 0x3c, 0x39, 0x3d, 0x47, 0x3c, 0x34, 0x2c, 0x3e, 0x38, 0x47, 0x32, + 0x36, 0x36, 0x41, 0x38, 0x35, 0x44, 0x48, 0x3b, 0x39, 0x3e, 0x38, 0x3e, + 0x40, 0x36, 0x37, 0x46, 0x39, 0x3b, 0x34, 0x45, 0x40, 0x3b, 0x48, 0x36, + 0x34, 0x44, 0x37, 0x46, 0x3f, 0x42, 0x33, 0x36, 0x43, 0x3c, 0x41, 0x46, + 0x31, 0x42, 0x43, 0x44, 0x44, 0x3e, 0x42, 0x3b, 0x3b, 0x3a, 0x3c, 0x37, + 0x42, 0x41, 0x46, 0x38, 0x41, 0x3b, 0x40, 0x44, 0x37, 0x3c, 0x4c, 0x2e, + 0x3a, 0x3e, 0x3b, 0x36, 0x33, 0x27, 0x37, 0x5d, 0x27, 0x34, 0x32, 0x41, + 0x41, 0x3f, 0x40, 0x5d, 0x40, 0x3d, 0x48, 0x39, 0x2e, 0x30, 0x1f, 0x3f, + 0x38, 0x3f, 0x40, 0x33, 0x40, 0x38, 0x31, 0x3f, 0x42, 0x3e, 0x3b, 0x3a, + 0x42, 0x36, 0x3a, 0x42, 0x3c, 0x3b, 0x3d, 0x41, 0x3d, 0x40, 0x40, 0x3e, + 0x36, 0x41, 0x47, 0x3d, 0x33, 0x32, 0x33, 0x44, 0x3e, 0x3a, 0x3e, 0x3d, + 0x45, 0x3f, 0x38, 0x3f, 0x40, 0x3a, 0x3c, 0x46, 0x32, 0x42, 0x3c, 0x51, + 0x33, 0x38, 0x3a, 0x38, 0x41, 0x34, 0x45, 0x4e, 0x35, 0x3c, 0x42, 0x3e, + 0x3f, 0x45, 0x44, 0x4e, 0x39, 0x47, 0x3a, 0x33, 0x3e, 0x3b, 0x45, 0x42, + 0x37, 0x3a, 0x3e, 0x33, 0x41, 0x48, 0x32, 0x2a, 0x3b, 0x37, 0x3f, 0x3d, + 0x3a, 0x42, 0x41, 0x2f, 0x34, 0x3e, 0x49, 0x3b, 0x38, 0x3e, 0x3d, 0x3a, + 0x37, 0x3c, 0x44, 0x41, 0x39, 0x42, 0x3f, 0x39, 0x40, 0x35, 0x3d, 0x41, + 0x3b, 0x45, 0x44, 0x48, 0x3d, 0x42, 0x36, 0x33, 0x3e, 0x44, 0x3f, 0x41, + 0x42, 0x40, 0x49, 0x34, 0x48, 0x41, 0x3f, 0x40, 0x3c, 0x45, 0x47, 0x34, + 0x41, 0x37, 0x47, 0x3e, 0x41, 0x41, 0x39, 0x42, 0x3f, 0x3a, 0x46, 0x33, + 0x39, 0x41, 0x38, 0x38, 0x3e, 0x42, 0x41, 0x38, 0x35, 0x32, 0x33, 0x38, + 0x3a, 0x3f, 0x45, 0x66, 0x33, 0x47, 0x38, 0x3c, 0x41, 0x2f, 0x48, 0x55, + 0x33, 0x3e, 0x49, 0x3b, 0x3c, 0x30, 0x24, 0x45, 0x3c, 0x44, 0x43, 0x32, + 0x3d, 0x3f, 0x35, 0x3b, 0x3e, 0x36, 0x38, 0x3a, 0x36, 0x37, 0x3b, 0x41, + 0x38, 0x42, 0x3e, 0x43, 0x39, 0x3f, 0x3c, 0x40, 0x37, 0x43, 0x3e, 0x3b, + 0x3d, 0x35, 0x35, 0x3d, 0x43, 0x3f, 0x3a, 0x35, 0x37, 0x3c, 0x31, 0x47, + 0x44, 0x45, 0x40, 0x32, 0x44, 0x36, 0x38, 0x51, 0x3c, 0x41, 0x45, 0x37, + 0x39, 0x44, 0x3e, 0x4f, 0x3c, 0x3a, 0x38, 0x40, 0x3f, 0x34, 0x39, 0x4e, + 0x3d, 0x39, 0x45, 0x3f, 0x3e, 0x3c, 0x3b, 0x42, 0x3b, 0x3b, 0x34, 0x3d, + 0x41, 0x44, 0x39, 0x2e, 0x37, 0x44, 0x45, 0x37, 0x3d, 0x41, 0x3f, 0x33, + 0x3f, 0x3e, 0x3e, 0x40, 0x44, 0x3f, 0x37, 0x32, 0x35, 0x3e, 0x43, 0x41, + 0x39, 0x37, 0x35, 0x3f, 0x48, 0x3d, 0x43, 0x49, 0x38, 0x35, 0x3f, 0x48, + 0x3b, 0x3a, 0x34, 0x3f, 0x3c, 0x44, 0x3a, 0x40, 0x36, 0x35, 0x44, 0x36, + 0x44, 0x3b, 0x3d, 0x38, 0x3c, 0x44, 0x47, 0x3a, 0x3b, 0x45, 0x41, 0x3a, + 0x39, 0x35, 0x44, 0x3a, 0x49, 0x36, 0x48, 0x31, 0x42, 0x43, 0x42, 0x34, + 0x41, 0x40, 0x4d, 0x36, 0x3e, 0x35, 0x39, 0x3b, 0x3f, 0x41, 0x38, 0x39, + 0x3c, 0x44, 0x3f, 0x39, 0x3a, 0x36, 0x3d, 0x36, 0x3a, 0x3a, 0x34, 0x3b, + 0x38, 0x2f, 0x40, 0x34, 0x32, 0x4d, 0x43, 0x45, 0x4e, 0x3f, 0x48, 0x35, + 0x3b, 0x4d, 0x4f, 0x39, 0x42, 0x36, 0x46, 0x36, 0x4a, 0x3c, 0x37, 0x41, + 0x40, 0x43, 0x50, 0x36, 0x3e, 0x39, 0x44, 0x40, 0x36, 0x47, 0x3f, 0x36, + 0x45, 0x40, 0x45, 0x41, 0x3b, 0x37, 0x41, 0x39, 0x3b, 0x48, 0x37, 0x34, + 0x41, 0x45, 0x49, 0x3f, 0x39, 0x49, 0x3f, 0x3a, 0x42, 0x34, 0x38, 0x37, + 0x44, 0x34, 0x3c, 0x3d, 0x40, 0x47, 0x3a, 0x36, 0x3f, 0x3c, 0x41, 0x3e, + 0x47, 0x46, 0x46, 0x43, 0x3f, 0x38, 0x3b, 0x40, 0x3f, 0x48, 0x3b, 0x4c, + 0x3d, 0x4b, 0x34, 0x3b, 0x44, 0x43, 0x3c, 0x49, 0x38, 0x42, 0x41, 0x36, + 0x33, 0x36, 0x40, 0x46, 0x40, 0x3a, 0x42, 0x3c, 0x3d, 0x35, 0x3c, 0x52, + 0x3e, 0x40, 0x43, 0x43, 0x41, 0x3b, 0x3e, 0x44, 0x3f, 0x40, 0x40, 0x43, + 0x3d, 0x3f, 0x36, 0x42, 0x3f, 0x3c, 0x34, 0x3d, 0x33, 0x41, 0x3c, 0x39, + 0x34, 0x43, 0x3f, 0x34, 0x3c, 0x3a, 0x3a, 0x37, 0x42, 0x41, 0x40, 0x3e, + 0x3d, 0x3c, 0x41, 0x3c, 0x38, 0x33, 0x49, 0x46, 0x40, 0x40, 0x3a, 0x46, + 0x38, 0x3c, 0x37, 0x34, 0x3e, 0x3d, 0x32, 0x38, 0x3c, 0x4c, 0x3a, 0x34, + 0x35, 0x32, 0x39, 0x40, 0x3a, 0x58, 0x40, 0x46, 0x42, 0x33, 0x45, 0x39, + 0x34, 0x4f, 0x53, 0x45, 0x43, 0x3e, 0x41, 0x36, 0x3e, 0x3f, 0x40, 0x47, + 0x4e, 0x3d, 0x53, 0x2b, 0x41, 0x36, 0x3e, 0x38, 0x47, 0x41, 0x3f, 0x34, + 0x47, 0x40, 0x38, 0x39, 0x3d, 0x42, 0x3f, 0x3c, 0x48, 0x3a, 0x35, 0x3c, + 0x45, 0x49, 0x3c, 0x33, 0x33, 0x3f, 0x3c, 0x46, 0x43, 0x3f, 0x45, 0x31, + 0x35, 0x43, 0x46, 0x3a, 0x45, 0x3c, 0x37, 0x3a, 0x37, 0x36, 0x35, 0x3f, + 0x38, 0x49, 0x34, 0x3f, 0x3c, 0x42, 0x49, 0x3e, 0x3e, 0x3c, 0x39, 0x49, + 0x3e, 0x3c, 0x3b, 0x43, 0x44, 0x45, 0x39, 0x4b, 0x47, 0x47, 0x3e, 0x33, + 0x3c, 0x31, 0x34, 0x4f, 0x45, 0x43, 0x40, 0x3d, 0x42, 0x3b, 0x43, 0x50, + 0x3c, 0x3b, 0x37, 0x42, 0x47, 0x42, 0x3e, 0x4a, 0x3f, 0x3a, 0x48, 0x3d, + 0x48, 0x45, 0x3e, 0x40, 0x3a, 0x3c, 0x3d, 0x39, 0x41, 0x42, 0x3c, 0x42, + 0x43, 0x3c, 0x3b, 0x3d, 0x47, 0x49, 0x38, 0x3c, 0x46, 0x3a, 0x3c, 0x3f, + 0x3a, 0x46, 0x3a, 0x3b, 0x3d, 0x3a, 0x49, 0x46, 0x38, 0x40, 0x3e, 0x38, + 0x37, 0x32, 0x40, 0x3c, 0x42, 0x3d, 0x3b, 0x40, 0x3a, 0x38, 0x49, 0x33, + 0x40, 0x38, 0x2b, 0x3a, 0x3c, 0x4f, 0x4d, 0x3e, 0x35, 0x3d, 0x3b, 0x40, + 0x3a, 0x54, 0x3e, 0x3e, 0x43, 0x30, 0x47, 0x3d, 0x3b, 0x53, 0x52, 0x4a, + 0x43, 0x41, 0x49, 0x37, 0x3b, 0x35, 0x44, 0x3c, 0x45, 0x40, 0x4f, 0x36, + 0x4b, 0x42, 0x41, 0x3a, 0x41, 0x44, 0x47, 0x32, 0x43, 0x35, 0x3f, 0x37, + 0x43, 0x41, 0x43, 0x36, 0x3f, 0x3b, 0x3d, 0x38, 0x3d, 0x40, 0x42, 0x36, + 0x44, 0x3a, 0x39, 0x47, 0x37, 0x34, 0x42, 0x3a, 0x37, 0x38, 0x37, 0x3f, + 0x36, 0x3b, 0x45, 0x3f, 0x3f, 0x3d, 0x39, 0x3d, 0x39, 0x41, 0x37, 0x3f, + 0x3f, 0x3d, 0x3f, 0x41, 0x43, 0x41, 0x45, 0x43, 0x41, 0x3c, 0x3e, 0x40, + 0x40, 0x39, 0x41, 0x4f, 0x47, 0x42, 0x46, 0x48, 0x3b, 0x3b, 0x3c, 0x46, + 0x47, 0x3e, 0x46, 0x37, 0x38, 0x3d, 0x38, 0x52, 0x36, 0x46, 0x3c, 0x3a, + 0x3b, 0x37, 0x48, 0x4b, 0x3f, 0x42, 0x3c, 0x36, 0x40, 0x37, 0x33, 0x4c, + 0x39, 0x34, 0x41, 0x34, 0x3f, 0x3b, 0x35, 0x4b, 0x3b, 0x45, 0x43, 0x31, + 0x3e, 0x39, 0x30, 0x3d, 0x32, 0x43, 0x44, 0x3c, 0x3e, 0x38, 0x43, 0x41, + 0x3e, 0x37, 0x41, 0x39, 0x39, 0x44, 0x43, 0x38, 0x3f, 0x37, 0x48, 0x3f, + 0x3b, 0x44, 0x37, 0x3f, 0x3a, 0x3f, 0x3b, 0x33, 0x42, 0x3e, 0x2f, 0x42, + 0x44, 0x4f, 0x52, 0x3c, 0x34, 0x33, 0x39, 0x46, 0x31, 0x55, 0x43, 0x4e, + 0x49, 0x38, 0x4d, 0x48, 0x34, 0x4d, 0x5c, 0x4d, 0x49, 0x37, 0x4f, 0x40, + 0x3c, 0x3d, 0x41, 0x42, 0x3f, 0x51, 0x4b, 0x2f, 0x46, 0x35, 0x39, 0x3c, + 0x49, 0x3d, 0x4e, 0x32, 0x43, 0x47, 0x31, 0x3e, 0x42, 0x4a, 0x4c, 0x39, + 0x43, 0x46, 0x3e, 0x3f, 0x44, 0x3c, 0x42, 0x30, 0x3e, 0x34, 0x3b, 0x3b, + 0x3a, 0x3c, 0x42, 0x3d, 0x3d, 0x48, 0x48, 0x36, 0x3a, 0x45, 0x38, 0x40, + 0x3c, 0x41, 0x3f, 0x49, 0x42, 0x41, 0x38, 0x3d, 0x3d, 0x44, 0x3b, 0x3d, + 0x35, 0x48, 0x43, 0x3b, 0x32, 0x41, 0x3e, 0x3a, 0x46, 0x41, 0x40, 0x54, + 0x38, 0x3f, 0x3c, 0x36, 0x3b, 0x36, 0x43, 0x50, 0x38, 0x3c, 0x44, 0x3b, + 0x43, 0x47, 0x32, 0x50, 0x3d, 0x46, 0x3d, 0x3b, 0x39, 0x37, 0x3b, 0x4a, + 0x47, 0x43, 0x46, 0x3d, 0x3d, 0x41, 0x43, 0x45, 0x3b, 0x3c, 0x39, 0x47, + 0x43, 0x42, 0x39, 0x4c, 0x34, 0x41, 0x45, 0x3b, 0x38, 0x3e, 0x37, 0x3f, + 0x45, 0x43, 0x39, 0x42, 0x3c, 0x3d, 0x3d, 0x3c, 0x48, 0x39, 0x3b, 0x3a, + 0x46, 0x45, 0x3d, 0x3a, 0x3f, 0x3a, 0x45, 0x36, 0x3d, 0x43, 0x36, 0x43, + 0x42, 0x3d, 0x41, 0x3f, 0x3a, 0x3f, 0x31, 0x37, 0x48, 0x4f, 0x4e, 0x36, + 0x30, 0x3a, 0x3e, 0x3e, 0x38, 0x57, 0x40, 0x47, 0x47, 0x38, 0x4f, 0x46, + 0x3d, 0x4a, 0x50, 0x4c, 0x42, 0x3b, 0x4d, 0x3d, 0x3d, 0x33, 0x40, 0x41, + 0x48, 0x4b, 0x46, 0x39, 0x4d, 0x30, 0x45, 0x38, 0x48, 0x3c, 0x48, 0x3b, + 0x4d, 0x40, 0x3b, 0x40, 0x46, 0x41, 0x51, 0x34, 0x40, 0x43, 0x3f, 0x42, + 0x45, 0x42, 0x3e, 0x35, 0x3d, 0x38, 0x37, 0x3a, 0x42, 0x40, 0x43, 0x3c, + 0x3c, 0x3d, 0x43, 0x40, 0x45, 0x3a, 0x3e, 0x3a, 0x3e, 0x40, 0x43, 0x35, + 0x37, 0x3f, 0x3f, 0x3e, 0x39, 0x3f, 0x47, 0x38, 0x3e, 0x44, 0x3b, 0x3c, + 0x3b, 0x32, 0x40, 0x3e, 0x42, 0x45, 0x3a, 0x52, 0x3a, 0x3e, 0x45, 0x40, + 0x41, 0x48, 0x3f, 0x4e, 0x3e, 0x42, 0x3d, 0x39, 0x3a, 0x33, 0x3f, 0x4b, + 0x3e, 0x38, 0x36, 0x3e, 0x31, 0x41, 0x3a, 0x40, 0x3b, 0x37, 0x3f, 0x3e, + 0x3e, 0x3f, 0x35, 0x44, 0x3d, 0x42, 0x3d, 0x44, 0x42, 0x3f, 0x3e, 0x44, + 0x3e, 0x45, 0x37, 0x3a, 0x3b, 0x42, 0x3f, 0x41, 0x3b, 0x3f, 0x41, 0x41, + 0x3e, 0x34, 0x47, 0x39, 0x46, 0x46, 0x37, 0x39, 0x3f, 0x45, 0x39, 0x39, + 0x3a, 0x40, 0x38, 0x3a, 0x31, 0x34, 0x3a, 0x41, 0x38, 0x41, 0x3a, 0x41, + 0x44, 0x37, 0x2d, 0x41, 0x43, 0x4d, 0x4b, 0x3b, 0x2c, 0x30, 0x42, 0x3b, + 0x31, 0x56, 0x43, 0x47, 0x47, 0x38, 0x50, 0x44, 0x40, 0x52, 0x5a, 0x50, + 0x44, 0x3f, 0x4b, 0x35, 0x3a, 0x36, 0x41, 0x44, 0x47, 0x4e, 0x52, 0x36, + 0x45, 0x39, 0x38, 0x3c, 0x42, 0x44, 0x40, 0x3b, 0x4b, 0x38, 0x35, 0x35, + 0x3f, 0x40, 0x4f, 0x39, 0x3d, 0x37, 0x34, 0x3e, 0x41, 0x4c, 0x40, 0x37, + 0x3d, 0x3b, 0x37, 0x37, 0x40, 0x42, 0x35, 0x39, 0x41, 0x42, 0x3d, 0x34, + 0x3c, 0x37, 0x3a, 0x3d, 0x46, 0x46, 0x46, 0x3f, 0x44, 0x3d, 0x3c, 0x40, + 0x3c, 0x3a, 0x3d, 0x3b, 0x3b, 0x41, 0x47, 0x3a, 0x43, 0x43, 0x43, 0x3b, + 0x3e, 0x3e, 0x42, 0x46, 0x36, 0x37, 0x45, 0x35, 0x3c, 0x3b, 0x31, 0x4b, + 0x3c, 0x3e, 0x3a, 0x3a, 0x42, 0x42, 0x34, 0x47, 0x37, 0x34, 0x41, 0x3d, + 0x3e, 0x39, 0x43, 0x47, 0x31, 0x3b, 0x40, 0x3b, 0x42, 0x3d, 0x44, 0x44, + 0x37, 0x39, 0x44, 0x3b, 0x40, 0x3a, 0x3d, 0x44, 0x3c, 0x40, 0x42, 0x3b, + 0x40, 0x3e, 0x32, 0x3d, 0x3c, 0x3e, 0x44, 0x3e, 0x47, 0x3d, 0x3f, 0x2e, + 0x3e, 0x3d, 0x3f, 0x3b, 0x3b, 0x43, 0x43, 0x3c, 0x3a, 0x3c, 0x3a, 0x36, + 0x38, 0x46, 0x30, 0x3e, 0x3f, 0x35, 0x3e, 0x34, 0x3c, 0x34, 0x32, 0x4a, + 0x41, 0x48, 0x48, 0x3f, 0x34, 0x37, 0x42, 0x43, 0x36, 0x59, 0x42, 0x3f, + 0x4b, 0x3d, 0x5d, 0x45, 0x3b, 0x51, 0x51, 0x4c, 0x41, 0x40, 0x4d, 0x36, + 0x3f, 0x34, 0x39, 0x3d, 0x4a, 0x4b, 0x4f, 0x33, 0x48, 0x32, 0x3c, 0x32, + 0x48, 0x4c, 0x4d, 0x3a, 0x49, 0x3a, 0x3a, 0x2e, 0x4b, 0x44, 0x4f, 0x33, + 0x3a, 0x48, 0x34, 0x43, 0x38, 0x45, 0x44, 0x35, 0x3b, 0x3f, 0x40, 0x37, + 0x35, 0x34, 0x38, 0x3e, 0x41, 0x3e, 0x3b, 0x47, 0x41, 0x47, 0x3c, 0x3c, + 0x39, 0x40, 0x3e, 0x45, 0x36, 0x41, 0x3f, 0x3f, 0x3c, 0x44, 0x3f, 0x43, + 0x3d, 0x3c, 0x49, 0x42, 0x3e, 0x3f, 0x48, 0x37, 0x43, 0x37, 0x43, 0x3d, + 0x32, 0x42, 0x44, 0x39, 0x36, 0x37, 0x40, 0x46, 0x47, 0x3d, 0x3a, 0x42, + 0x3f, 0x38, 0x37, 0x48, 0x39, 0x40, 0x3c, 0x37, 0x33, 0x38, 0x38, 0x40, + 0x41, 0x3c, 0x3f, 0x3b, 0x40, 0x3a, 0x47, 0x46, 0x3a, 0x37, 0x42, 0x47, + 0x3b, 0x3f, 0x3b, 0x40, 0x33, 0x3f, 0x3a, 0x3c, 0x38, 0x3a, 0x36, 0x38, + 0x36, 0x40, 0x48, 0x42, 0x48, 0x3c, 0x43, 0x36, 0x32, 0x3b, 0x34, 0x39, + 0x38, 0x46, 0x37, 0x3b, 0x44, 0x34, 0x36, 0x38, 0x3c, 0x43, 0x33, 0x3c, + 0x3b, 0x45, 0x38, 0x38, 0x44, 0x33, 0x36, 0x4a, 0x46, 0x4c, 0x4a, 0x34, + 0x36, 0x37, 0x43, 0x42, 0x33, 0x58, 0x43, 0x48, 0x44, 0x38, 0x5f, 0x3f, + 0x3c, 0x4d, 0x53, 0x52, 0x43, 0x47, 0x52, 0x3e, 0x3b, 0x2d, 0x3b, 0x3a, + 0x4b, 0x49, 0x53, 0x38, 0x4c, 0x2f, 0x38, 0x31, 0x42, 0x40, 0x48, 0x3f, + 0x44, 0x3c, 0x3c, 0x34, 0x46, 0x3f, 0x49, 0x3a, 0x43, 0x3d, 0x34, 0x42, + 0x36, 0x47, 0x51, 0x3c, 0x3d, 0x39, 0x39, 0x3a, 0x3b, 0x35, 0x35, 0x41, + 0x47, 0x3c, 0x3b, 0x43, 0x3f, 0x45, 0x3e, 0x40, 0x3c, 0x3f, 0x3c, 0x42, + 0x3b, 0x3e, 0x38, 0x3f, 0x3f, 0x41, 0x39, 0x39, 0x3d, 0x43, 0x4f, 0x3d, + 0x48, 0x3b, 0x44, 0x45, 0x3d, 0x3b, 0x49, 0x43, 0x44, 0x3d, 0x37, 0x3b, + 0x3c, 0x45, 0x46, 0x44, 0x35, 0x3e, 0x32, 0x35, 0x34, 0x3b, 0x40, 0x43, + 0x3e, 0x45, 0x37, 0x3d, 0x3f, 0x43, 0x36, 0x3f, 0x3f, 0x43, 0x39, 0x44, + 0x3e, 0x3e, 0x45, 0x40, 0x3e, 0x44, 0x3b, 0x3e, 0x42, 0x42, 0x3b, 0x3d, + 0x3a, 0x40, 0x39, 0x3a, 0x32, 0x36, 0x41, 0x30, 0x39, 0x46, 0x33, 0x3f, + 0x46, 0x40, 0x3c, 0x31, 0x41, 0x3a, 0x3f, 0x3f, 0x3b, 0x36, 0x3f, 0x38, + 0x36, 0x3e, 0x35, 0x35, 0x3b, 0x3d, 0x3f, 0x39, 0x46, 0x37, 0x3a, 0x47, + 0x37, 0x39, 0x2c, 0x55, 0x40, 0x4b, 0x4a, 0x39, 0x35, 0x42, 0x3d, 0x40, + 0x3a, 0x54, 0x41, 0x48, 0x51, 0x3b, 0x61, 0x3e, 0x3e, 0x4d, 0x51, 0x52, + 0x3e, 0x43, 0x52, 0x41, 0x48, 0x2d, 0x35, 0x35, 0x4b, 0x44, 0x4d, 0x3c, + 0x54, 0x33, 0x39, 0x27, 0x4a, 0x44, 0x4a, 0x41, 0x3c, 0x3a, 0x31, 0x2f, + 0x3d, 0x42, 0x48, 0x3f, 0x42, 0x40, 0x44, 0x3b, 0x40, 0x3e, 0x49, 0x3a, + 0x3c, 0x35, 0x30, 0x3e, 0x3e, 0x3d, 0x36, 0x3a, 0x3e, 0x3a, 0x4a, 0x3e, + 0x3d, 0x49, 0x40, 0x43, 0x3e, 0x45, 0x3f, 0x3c, 0x3b, 0x42, 0x3a, 0x39, + 0x3b, 0x47, 0x3f, 0x39, 0x49, 0x46, 0x3d, 0x34, 0x32, 0x44, 0x46, 0x42, + 0x47, 0x39, 0x49, 0x48, 0x3b, 0x38, 0x45, 0x45, 0x37, 0x38, 0x46, 0x46, + 0x37, 0x42, 0x35, 0x34, 0x45, 0x42, 0x35, 0x43, 0x3b, 0x3a, 0x43, 0x43, + 0x40, 0x42, 0x35, 0x3f, 0x38, 0x3f, 0x3a, 0x3a, 0x3b, 0x3f, 0x3e, 0x36, + 0x3f, 0x3c, 0x48, 0x3b, 0x3a, 0x41, 0x41, 0x35, 0x33, 0x3f, 0x3b, 0x45, + 0x48, 0x36, 0x40, 0x38, 0x47, 0x3d, 0x35, 0x40, 0x41, 0x42, 0x41, 0x37, + 0x41, 0x3e, 0x36, 0x48, 0x3e, 0x3c, 0x32, 0x39, 0x41, 0x40, 0x38, 0x3f, + 0x46, 0x43, 0x33, 0x40, 0x43, 0x43, 0x3a, 0x49, 0x3f, 0x35, 0x2c, 0x5d, + 0x43, 0x49, 0x52, 0x3b, 0x3c, 0x41, 0x40, 0x4a, 0x33, 0x50, 0x41, 0x46, + 0x52, 0x41, 0x68, 0x48, 0x44, 0x53, 0x54, 0x55, 0x42, 0x42, 0x57, 0x44, + 0x47, 0x35, 0x35, 0x3e, 0x4b, 0x44, 0x4e, 0x38, 0x55, 0x2f, 0x36, 0x2d, + 0x40, 0x48, 0x4b, 0x41, 0x48, 0x36, 0x32, 0x32, 0x44, 0x42, 0x47, 0x42, + 0x48, 0x3d, 0x3d, 0x39, 0x3e, 0x35, 0x4b, 0x39, 0x38, 0x3a, 0x39, 0x46, + 0x38, 0x3f, 0x3a, 0x42, 0x4b, 0x45, 0x3e, 0x32, 0x46, 0x43, 0x3b, 0x40, + 0x45, 0x41, 0x3e, 0x43, 0x37, 0x3d, 0x43, 0x3b, 0x46, 0x48, 0x42, 0x3b, + 0x3d, 0x48, 0x4a, 0x3c, 0x3b, 0x42, 0x40, 0x3c, 0x3a, 0x42, 0x38, 0x47, + 0x3b, 0x3b, 0x3d, 0x41, 0x3f, 0x38, 0x3f, 0x4a, 0x44, 0x3f, 0x47, 0x3a, + 0x47, 0x44, 0x43, 0x43, 0x34, 0x3d, 0x3a, 0x3c, 0x47, 0x3f, 0x3e, 0x39, + 0x42, 0x4a, 0x40, 0x36, 0x40, 0x41, 0x42, 0x3f, 0x3f, 0x43, 0x39, 0x38, + 0x3c, 0x3b, 0x4c, 0x2f, 0x41, 0x39, 0x40, 0x42, 0x3f, 0x42, 0x40, 0x36, + 0x3b, 0x45, 0x41, 0x41, 0x44, 0x45, 0x42, 0x37, 0x3d, 0x3a, 0x33, 0x3e, + 0x3b, 0x3b, 0x3c, 0x3d, 0x38, 0x49, 0x44, 0x39, 0x3f, 0x48, 0x3d, 0x41, + 0x42, 0x43, 0x44, 0x3e, 0x41, 0x3d, 0x32, 0x59, 0x45, 0x4b, 0x4b, 0x38, + 0x37, 0x3d, 0x48, 0x42, 0x3d, 0x52, 0x43, 0x46, 0x54, 0x48, 0x67, 0x4d, + 0x45, 0x4e, 0x49, 0x52, 0x45, 0x45, 0x58, 0x3b, 0x41, 0x38, 0x3f, 0x3f, + 0x49, 0x44, 0x4f, 0x48, 0x57, 0x31, 0x3c, 0x2a, 0x3e, 0x4c, 0x41, 0x40, + 0x47, 0x3f, 0x33, 0x34, 0x3f, 0x42, 0x48, 0x43, 0x4b, 0x38, 0x39, 0x3d, + 0x3f, 0x3e, 0x4b, 0x3f, 0x35, 0x36, 0x3c, 0x46, 0x3c, 0x45, 0x37, 0x3b, + 0x3c, 0x39, 0x41, 0x40, 0x41, 0x43, 0x44, 0x41, 0x45, 0x4f, 0x44, 0x43, + 0x44, 0x3c, 0x45, 0x34, 0x42, 0x45, 0x3f, 0x46, 0x3f, 0x43, 0x3d, 0x3a, + 0x39, 0x47, 0x45, 0x3d, 0x3f, 0x3b, 0x3d, 0x42, 0x38, 0x48, 0x48, 0x3b, + 0x3c, 0x3a, 0x3f, 0x41, 0x44, 0x4b, 0x44, 0x48, 0x41, 0x3c, 0x3d, 0x3c, + 0x3e, 0x3a, 0x4a, 0x3b, 0x49, 0x35, 0x3a, 0x3d, 0x41, 0x3f, 0x49, 0x39, + 0x44, 0x37, 0x3f, 0x3c, 0x42, 0x40, 0x4a, 0x46, 0x39, 0x38, 0x46, 0x37, + 0x41, 0x46, 0x41, 0x45, 0x40, 0x3b, 0x3b, 0x33, 0x3b, 0x39, 0x3c, 0x43, + 0x37, 0x3c, 0x44, 0x3d, 0x46, 0x39, 0x3c, 0x3c, 0x44, 0x48, 0x41, 0x44, + 0x41, 0x43, 0x46, 0x3b, 0x47, 0x41, 0x31, 0x41, 0x44, 0x40, 0x43, 0x42, + 0x3e, 0x43, 0x34, 0x65, 0x4f, 0x50, 0x4d, 0x3a, 0x37, 0x43, 0x4d, 0x4a, + 0x3d, 0x54, 0x40, 0x42, 0x5b, 0x3b, 0x71, 0x49, 0x44, 0x4f, 0x54, 0x56, + 0x48, 0x40, 0x52, 0x41, 0x42, 0x38, 0x3c, 0x49, 0x4a, 0x45, 0x51, 0x35, + 0x54, 0x2f, 0x35, 0x25, 0x4d, 0x3f, 0x4d, 0x43, 0x49, 0x33, 0x32, 0x3a, + 0x46, 0x48, 0x48, 0x3d, 0x43, 0x3a, 0x3c, 0x3a, 0x48, 0x40, 0x4b, 0x3b, + 0x45, 0x3b, 0x3f, 0x38, 0x37, 0x41, 0x31, 0x3b, 0x41, 0x43, 0x43, 0x37, + 0x48, 0x3f, 0x48, 0x37, 0x40, 0x4a, 0x43, 0x45, 0x3d, 0x39, 0x37, 0x37, + 0x3c, 0x3f, 0x47, 0x48, 0x43, 0x3e, 0x41, 0x3f, 0x3e, 0x38, 0x3e, 0x37, + 0x45, 0x45, 0x35, 0x44, 0x38, 0x3a, 0x49, 0x43, 0x40, 0x41, 0x40, 0x44, + 0x3c, 0x3e, 0x40, 0x38, 0x42, 0x41, 0x3c, 0x41, 0x3a, 0x3b, 0x3c, 0x3a, + 0x49, 0x3c, 0x42, 0x44, 0x3f, 0x39, 0x45, 0x32, 0x45, 0x43, 0x45, 0x39, + 0x43, 0x41, 0x4b, 0x39, 0x32, 0x3c, 0x3c, 0x36, 0x39, 0x3f, 0x46, 0x32, + 0x39, 0x35, 0x4f, 0x32, 0x3e, 0x40, 0x3d, 0x3e, 0x3a, 0x39, 0x4c, 0x38, + 0x43, 0x38, 0x49, 0x3b, 0x33, 0x39, 0x3b, 0x36, 0x36, 0x43, 0x3b, 0x3c, + 0x32, 0x3c, 0x3a, 0x45, 0x31, 0x3d, 0x37, 0x40, 0x3f, 0x3f, 0x35, 0xff, + 0x49, 0x4e, 0x4c, 0x3c, 0x36, 0x43, 0x46, 0x45, 0x41, 0x59, 0x44, 0x4a, + 0x53, 0x44, 0x71, 0x4a, 0x39, 0x4f, 0x50, 0x4b, 0x47, 0x42, 0x5a, 0x3c, + 0x45, 0x38, 0x3e, 0x42, 0x53, 0x43, 0x52, 0x3a, 0x52, 0x34, 0x31, 0x20, + 0x49, 0x4e, 0x46, 0x43, 0x4b, 0x3d, 0x2b, 0x27, 0x46, 0x46, 0x47, 0x41, + 0x42, 0x37, 0x39, 0x38, 0x45, 0x3f, 0x51, 0x3d, 0x48, 0x3f, 0x33, 0x3f, + 0x38, 0x45, 0x31, 0x38, 0x41, 0x3d, 0x47, 0x39, 0x42, 0x40, 0x4c, 0x3f, + 0x40, 0x42, 0x41, 0x41, 0x41, 0x42, 0x39, 0x35, 0x3f, 0x46, 0x45, 0x36, + 0x3f, 0x43, 0x3b, 0x39, 0x41, 0x38, 0x43, 0x37, 0x3d, 0x44, 0x3b, 0x40, + 0x36, 0x3d, 0x42, 0x41, 0x41, 0x3d, 0x38, 0x4a, 0x40, 0x4a, 0x4c, 0x38, + 0x3f, 0x40, 0x45, 0x3c, 0x3f, 0x4b, 0x43, 0x41, 0x43, 0x3e, 0x43, 0x3f, + 0x36, 0x40, 0x40, 0x39, 0x3f, 0x3a, 0x3a, 0x30, 0x41, 0x3c, 0x3c, 0x34, + 0x46, 0x38, 0x43, 0x34, 0x3a, 0x42, 0x43, 0x42, 0x40, 0x41, 0x49, 0x34, + 0x35, 0x40, 0x47, 0x3d, 0x3d, 0x3e, 0x4c, 0x33, 0x3c, 0x3b, 0x39, 0x43, + 0x3a, 0x3e, 0x3b, 0x37, 0x3f, 0x42, 0x31, 0x3d, 0x41, 0x3e, 0x32, 0x47, + 0x34, 0x41, 0x3d, 0x35, 0x39, 0x40, 0x38, 0x69, 0x4f, 0x4a, 0x49, 0x37, + 0x37, 0x44, 0x43, 0x46, 0x40, 0x58, 0x43, 0x48, 0x54, 0x46, 0x6c, 0x50, + 0x3a, 0x50, 0x50, 0x57, 0x47, 0x46, 0x5c, 0x40, 0x40, 0x39, 0x3e, 0x46, + 0x53, 0x46, 0x5c, 0x36, 0x4f, 0x32, 0x30, 0x2d, 0x4a, 0x48, 0x41, 0x45, + 0x47, 0x2f, 0x32, 0x2b, 0x43, 0x40, 0x43, 0x3c, 0x40, 0x44, 0x3e, 0x37, + 0x39, 0x3e, 0x48, 0x42, 0x45, 0x36, 0x47, 0x3f, 0x3b, 0x41, 0x35, 0x35, + 0x3b, 0x3e, 0x35, 0x43, 0x3e, 0x41, 0x3d, 0x36, 0x41, 0x3c, 0x40, 0x44, + 0x3d, 0x40, 0x35, 0x32, 0x48, 0x3e, 0x39, 0x42, 0x44, 0x3d, 0x39, 0x3b, + 0x3b, 0x45, 0x40, 0x4a, 0x3f, 0x41, 0x43, 0x39, 0x42, 0x44, 0x4c, 0x3c, + 0x3f, 0x3e, 0x3f, 0x43, 0x40, 0x42, 0x4c, 0x3b, 0x3e, 0x3d, 0x49, 0x42, + 0x40, 0x44, 0x40, 0x34, 0x36, 0x40, 0x45, 0x39, 0x42, 0x40, 0x3e, 0x44, + 0x45, 0x37, 0x3c, 0x38, 0x3e, 0x49, 0x3e, 0x3c, 0x41, 0x3d, 0x42, 0x32, + 0x40, 0x45, 0x3e, 0x36, 0x44, 0x3a, 0x4e, 0x38, 0x43, 0x38, 0x40, 0x38, + 0x49, 0x42, 0x40, 0x3d, 0x42, 0x48, 0x48, 0x3d, 0x41, 0x3a, 0x3f, 0x41, + 0x38, 0x3c, 0x44, 0x39, 0x3a, 0x32, 0x3a, 0x3e, 0x3d, 0x3b, 0x39, 0x38, + 0x3a, 0x43, 0x3a, 0x6b, 0x45, 0x50, 0x47, 0x33, 0x38, 0x48, 0x4d, 0x4f, + 0x39, 0x4b, 0x46, 0x4a, 0x4f, 0x42, 0x6f, 0x4b, 0x40, 0x55, 0x54, 0x50, + 0x42, 0x47, 0x5e, 0x46, 0x40, 0x34, 0x40, 0x47, 0x52, 0x46, 0x55, 0x3b, + 0x4f, 0x2b, 0x35, 0x33, 0x4c, 0x44, 0x44, 0x48, 0x47, 0x37, 0x35, 0x27, + 0x4a, 0x3b, 0x41, 0x40, 0x40, 0x3e, 0x36, 0x39, 0x3e, 0x3c, 0x45, 0x3f, + 0x4d, 0x41, 0x3d, 0x48, 0x47, 0x46, 0x33, 0x3d, 0x3d, 0x3e, 0x34, 0x3f, + 0x3e, 0x3a, 0x41, 0x35, 0x3b, 0x3e, 0x42, 0x3c, 0x42, 0x42, 0x40, 0x31, + 0x37, 0x40, 0x36, 0x42, 0x48, 0x39, 0x3d, 0x3c, 0x3a, 0x43, 0x39, 0x3d, + 0x47, 0x49, 0x43, 0x3d, 0x45, 0x39, 0x44, 0x37, 0x3e, 0x4d, 0x3d, 0x40, + 0x3d, 0x4c, 0x4d, 0x44, 0x3c, 0x3d, 0x46, 0x41, 0x41, 0x42, 0x40, 0x40, + 0x41, 0x3a, 0x3c, 0x3b, 0x3c, 0x44, 0x40, 0x34, 0x44, 0x38, 0x3b, 0x33, + 0x45, 0x45, 0x44, 0x3f, 0x3e, 0x3a, 0x3b, 0x3b, 0x43, 0x39, 0x3a, 0x45, + 0x3b, 0x3a, 0x4b, 0x39, 0x3d, 0x38, 0x41, 0x39, 0x42, 0x45, 0x43, 0x40, + 0x3e, 0x35, 0x44, 0x3f, 0x45, 0x41, 0x40, 0x3e, 0x43, 0x42, 0x37, 0x3a, + 0x38, 0x35, 0x3a, 0x48, 0x3e, 0x3b, 0x40, 0x38, 0x3c, 0x3c, 0x3b, 0x6a, + 0x48, 0x4d, 0x4d, 0x34, 0x38, 0x40, 0x4a, 0x45, 0x3c, 0x4f, 0x41, 0x4b, + 0x58, 0x46, 0x71, 0x49, 0x3d, 0x53, 0x44, 0x52, 0x42, 0x3e, 0x57, 0x4c, + 0x4c, 0x38, 0x40, 0x3b, 0x5c, 0x4c, 0x52, 0x3e, 0x4c, 0x2d, 0x32, 0x37, + 0x49, 0x3f, 0x41, 0x47, 0x4a, 0x3b, 0x2f, 0x26, 0x45, 0x40, 0x47, 0x42, + 0x3d, 0x39, 0x2d, 0x2c, 0x3f, 0x45, 0x46, 0x44, 0x48, 0x43, 0x42, 0x48, + 0x40, 0x41, 0x3b, 0x3b, 0x41, 0x3b, 0x39, 0x40, 0x3b, 0x47, 0x3f, 0x38, + 0x3f, 0x49, 0x3b, 0x35, 0x40, 0x45, 0x38, 0x35, 0x36, 0x34, 0x3e, 0x3d, + 0x46, 0x3e, 0x33, 0x38, 0x43, 0x48, 0x3f, 0x45, 0x31, 0x44, 0x38, 0x35, + 0x3c, 0x41, 0x4b, 0x44, 0x3d, 0x43, 0x38, 0x48, 0x3c, 0x39, 0x4a, 0x42, + 0x3d, 0x43, 0x3f, 0x49, 0x3e, 0x47, 0x49, 0x41, 0x3b, 0x3c, 0x47, 0x3a, + 0x3d, 0x40, 0x4a, 0x38, 0x3d, 0x3b, 0x47, 0x3a, 0x36, 0x47, 0x42, 0x46, + 0x3c, 0x3d, 0x45, 0x3b, 0x48, 0x3f, 0x38, 0x36, 0x39, 0x46, 0x43, 0x3a, + 0x41, 0x3d, 0x39, 0x39, 0x46, 0x37, 0x3f, 0x3f, 0x3a, 0x46, 0x3f, 0x39, + 0x49, 0x44, 0x42, 0x3a, 0x3a, 0x43, 0x3e, 0x42, 0x3d, 0x3d, 0x43, 0x40, + 0x43, 0x3c, 0x3f, 0x43, 0x40, 0x42, 0x3b, 0x57, 0x4a, 0x4f, 0x4a, 0x2d, + 0x3b, 0x48, 0x45, 0x42, 0x34, 0x4c, 0x3e, 0x4f, 0x4d, 0x40, 0x6c, 0x4b, + 0x3b, 0x4d, 0x4c, 0x57, 0x49, 0x3d, 0x5d, 0x44, 0x43, 0x29, 0x42, 0x3f, + 0x5b, 0x47, 0x4f, 0x3e, 0x54, 0x2e, 0x34, 0x34, 0x4b, 0x47, 0x46, 0x46, + 0x4b, 0x34, 0x36, 0x28, 0x3e, 0x3f, 0x42, 0x40, 0x3b, 0x38, 0x39, 0x42, + 0x49, 0x3d, 0x49, 0x47, 0x47, 0x3b, 0x43, 0x34, 0x39, 0x36, 0x42, 0x3d, + 0x37, 0x40, 0x37, 0x38, 0x46, 0x42, 0x49, 0x37, 0x44, 0x3f, 0x38, 0x3e, + 0x36, 0x32, 0x33, 0x38, 0x40, 0x46, 0x42, 0x34, 0x41, 0x42, 0x3e, 0x38, + 0x44, 0x3e, 0x3f, 0x43, 0x3f, 0x43, 0x35, 0x3f, 0x4d, 0x3b, 0x43, 0x39, + 0x40, 0x47, 0x3f, 0x4a, 0x3a, 0x3f, 0x45, 0x45, 0x48, 0x42, 0x3b, 0x47, + 0x42, 0x4b, 0x47, 0x3e, 0x3c, 0x42, 0x46, 0x39, 0x41, 0x3f, 0x48, 0x33, + 0x45, 0x34, 0x3d, 0x30, 0x40, 0x4c, 0x40, 0x40, 0x39, 0x37, 0x40, 0x33, + 0x49, 0x42, 0x45, 0x38, 0x3c, 0x43, 0x45, 0x35, 0x37, 0x33, 0x34, 0x3b, + 0x3b, 0x38, 0x39, 0x41, 0x42, 0x40, 0x3e, 0x3e, 0x41, 0x33, 0x3a, 0x36, + 0x40, 0x3a, 0x3c, 0x45, 0x43, 0x3c, 0x40, 0x41, 0x49, 0x47, 0x35, 0x34, + 0x3a, 0x3d, 0x3a, 0x68, 0x4f, 0x48, 0x43, 0x36, 0x37, 0x3e, 0x45, 0x49, + 0x3a, 0x4d, 0x41, 0x3d, 0x46, 0x45, 0x65, 0x46, 0x38, 0x4d, 0x4a, 0x53, + 0x43, 0x41, 0x5d, 0x47, 0x41, 0x34, 0x39, 0x43, 0x4e, 0x48, 0x50, 0x38, + 0x53, 0x32, 0x30, 0x2e, 0x49, 0x4c, 0x4d, 0x3f, 0x46, 0x38, 0x34, 0x2b, + 0x44, 0x44, 0x41, 0x41, 0x36, 0x40, 0x3f, 0x32, 0x46, 0x38, 0x50, 0x45, + 0x3f, 0x3d, 0x3b, 0x36, 0x3b, 0x43, 0x3a, 0x34, 0x36, 0x3f, 0x39, 0x35, + 0x3c, 0x40, 0x40, 0x37, 0x3c, 0x39, 0x3d, 0x36, 0x48, 0x3d, 0x43, 0x34, + 0x3b, 0x46, 0x43, 0x41, 0x33, 0x3e, 0x44, 0x3d, 0x44, 0x44, 0x4c, 0x3c, + 0x37, 0x49, 0x42, 0x35, 0x45, 0x3a, 0x3c, 0x41, 0x3a, 0x45, 0x46, 0x41, + 0x3c, 0x48, 0x46, 0x36, 0x36, 0x42, 0x3b, 0x46, 0x42, 0x45, 0x44, 0x47, + 0x3f, 0x44, 0x3a, 0x35, 0x37, 0x46, 0x40, 0x38, 0x40, 0x3d, 0x36, 0x2c, + 0x34, 0x47, 0x40, 0x38, 0x3f, 0x3f, 0x44, 0x2d, 0x3b, 0x3d, 0x3e, 0x44, + 0x3c, 0x40, 0x3e, 0x33, 0x3c, 0x3a, 0x49, 0x40, 0x42, 0x42, 0x3a, 0x3b, + 0x33, 0x3d, 0x3c, 0x43, 0x3e, 0x3d, 0x3a, 0x3a, 0x48, 0x3e, 0x3c, 0x39, + 0x3f, 0x44, 0x37, 0x40, 0x3f, 0x3c, 0x3e, 0x3d, 0x38, 0x42, 0x34, 0x62, + 0x51, 0x47, 0x44, 0x3f, 0x32, 0x3c, 0x3f, 0x46, 0x3d, 0x46, 0x3e, 0x45, + 0x4a, 0x3e, 0x5d, 0x43, 0x45, 0x49, 0x4a, 0x55, 0x41, 0x3c, 0x5a, 0x44, + 0x43, 0x3b, 0x3c, 0x3a, 0x4b, 0x4e, 0x4d, 0x42, 0x49, 0x30, 0x3b, 0x38, + 0x42, 0x44, 0x51, 0x40, 0x48, 0x33, 0x3f, 0x2b, 0x3c, 0x41, 0x3c, 0x45, + 0x35, 0x39, 0x42, 0x37, 0x40, 0x46, 0x46, 0x3f, 0x41, 0x45, 0x42, 0x3d, + 0x43, 0x38, 0x3e, 0x38, 0x3c, 0x39, 0x40, 0x38, 0x37, 0x36, 0x3d, 0x3d, + 0x38, 0x47, 0x45, 0x3b, 0x45, 0x44, 0x42, 0x2e, 0x37, 0x40, 0x42, 0x42, + 0x3c, 0x36, 0x3b, 0x39, 0x44, 0x4d, 0x42, 0x3f, 0x3a, 0x3e, 0x45, 0x34, + 0x3c, 0x43, 0x47, 0x43, 0x3f, 0x48, 0x3b, 0x44, 0x3d, 0x44, 0x43, 0x3e, + 0x40, 0x4a, 0x31, 0x42, 0x42, 0x43, 0x48, 0x45, 0x3a, 0x42, 0x36, 0x2f, + 0x3c, 0x3e, 0x3b, 0x3b, 0x44, 0x3f, 0x3a, 0x2c, 0x47, 0x3f, 0x4a, 0x40, + 0x40, 0x40, 0x3c, 0x2a, 0x3e, 0x44, 0x40, 0x43, 0x3a, 0x42, 0x39, 0x34, + 0x49, 0x3e, 0x36, 0x42, 0x3f, 0x42, 0x33, 0x3b, 0x3c, 0x45, 0x39, 0x3f, + 0x3e, 0x3f, 0x41, 0x3d, 0x32, 0x3b, 0x31, 0x40, 0x3f, 0x44, 0x3c, 0x3f, + 0x40, 0x46, 0x45, 0x36, 0x36, 0x42, 0x30, 0x57, 0x47, 0x44, 0x48, 0x3f, + 0x35, 0x37, 0x3f, 0x3f, 0x38, 0x4a, 0x41, 0x46, 0x50, 0x3d, 0x5b, 0x41, + 0x3e, 0x3c, 0x4a, 0x54, 0x45, 0x41, 0x5b, 0x46, 0x3d, 0x3b, 0x43, 0x33, + 0x45, 0x4e, 0x43, 0x3b, 0x44, 0x37, 0x37, 0x32, 0x4c, 0x3d, 0x4c, 0x3f, + 0x49, 0x3b, 0x37, 0x3a, 0x33, 0x43, 0x3f, 0x40, 0x44, 0x36, 0x3b, 0x44, + 0x45, 0x40, 0x3c, 0x3c, 0x41, 0x44, 0x3b, 0x3d, 0x33, 0x37, 0x3c, 0x35, + 0x3d, 0x3f, 0x39, 0x38, 0x33, 0x43, 0x3e, 0x39, 0x3b, 0x3e, 0x41, 0x35, + 0x40, 0x46, 0x43, 0x35, 0x41, 0x3d, 0x32, 0x39, 0x3c, 0x40, 0x3e, 0x3f, + 0x42, 0x38, 0x3b, 0x45, 0x3a, 0x3d, 0x40, 0x36, 0x3a, 0x40, 0x46, 0x44, + 0x48, 0x45, 0x3f, 0x3a, 0x45, 0x45, 0x3c, 0x3b, 0x40, 0x4c, 0x39, 0x3a, + 0x38, 0x39, 0x46, 0x3a, 0x3e, 0x4b, 0x34, 0x39, 0x3d, 0x3f, 0x40, 0x39, + 0x45, 0x31, 0x45, 0x29, 0x3f, 0x38, 0x3a, 0x3f, 0x38, 0x3b, 0x36, 0x2d, + 0x43, 0x3d, 0x45, 0x3c, 0x46, 0x3f, 0x40, 0x3c, 0x3a, 0x3e, 0x3d, 0x38, + 0x3f, 0x3c, 0x3f, 0x42, 0x35, 0x3f, 0x3a, 0x43, 0x3d, 0x43, 0x3d, 0x33, + 0x3d, 0x48, 0x42, 0x3d, 0x45, 0x46, 0x3d, 0x35, 0x32, 0x44, 0x42, 0x37, + 0x3d, 0x40, 0x3c, 0x47, 0x4a, 0x45, 0x47, 0x2f, 0x33, 0x36, 0x3f, 0x42, + 0x38, 0x43, 0x3e, 0x3a, 0x41, 0x3f, 0x5f, 0x3f, 0x48, 0x3a, 0x44, 0x47, + 0x41, 0x3e, 0x57, 0x42, 0x41, 0x33, 0x34, 0x39, 0x42, 0x44, 0x42, 0x3c, + 0x49, 0x34, 0x37, 0x33, 0x47, 0x38, 0x43, 0x3d, 0x43, 0x3e, 0x3e, 0x36, + 0x41, 0x41, 0x37, 0x40, 0x39, 0x3e, 0x3b, 0x3b, 0x3e, 0x41, 0x3d, 0x3b, + 0x43, 0x3e, 0x39, 0x43, 0x2f, 0x3e, 0x33, 0x40, 0x45, 0x47, 0x30, 0x46, + 0x3f, 0x3f, 0x37, 0x42, 0x3d, 0x42, 0x43, 0x37, 0x38, 0x3c, 0x35, 0x34, + 0x41, 0x43, 0x3e, 0x3e, 0x3f, 0x49, 0x35, 0x35, 0x38, 0x36, 0x3a, 0x43, + 0x38, 0x46, 0x48, 0x36, 0x3f, 0x39, 0x3b, 0x3e, 0x48, 0x47, 0x41, 0x34, + 0x3b, 0x3c, 0x37, 0x3e, 0x40, 0x41, 0x3b, 0x3d, 0x43, 0x42, 0x3a, 0x39, + 0x3b, 0x43, 0x38, 0x2b, 0x43, 0x41, 0x48, 0x35, 0x44, 0x44, 0x3e, 0x2c, + 0x46, 0x40, 0x3e, 0x41, 0x38, 0x34, 0x35, 0x37, 0x34, 0x3f, 0x3d, 0x46, + 0x33, 0x3c, 0x3c, 0x2e, 0x3b, 0x45, 0x3d, 0x3e, 0x3a, 0x42, 0x3c, 0x36, + 0x3a, 0x42, 0x39, 0x43, 0x35, 0x39, 0x40, 0x44, 0x47, 0x41, 0x44, 0x3d, + 0x41, 0x3e, 0x38, 0x39, 0x45, 0x3a, 0x35, 0x43, 0x3f, 0x44, 0x41, 0x49, + 0x47, 0x3f, 0x44, 0x40, 0x38, 0x43, 0x40, 0x3e, 0x39, 0x42, 0x32, 0x3b, + 0x42, 0x47, 0x57, 0x37, 0x36, 0x38, 0x43, 0x49, 0x3b, 0x34, 0x54, 0x42, + 0x3d, 0x3f, 0x3e, 0x3b, 0x38, 0x41, 0x43, 0x3a, 0x44, 0x39, 0x34, 0x2c, + 0x38, 0x43, 0x4b, 0x3f, 0x40, 0x3e, 0x32, 0x33, 0x3d, 0x44, 0x45, 0x44, + 0x3e, 0x35, 0x37, 0x39, 0x40, 0x3e, 0x40, 0x3c, 0x34, 0x43, 0x37, 0x40, + 0x39, 0x3e, 0x3d, 0x43, 0x3a, 0x44, 0x43, 0x44, 0x3d, 0x3b, 0x45, 0x3b, + 0x3a, 0x3a, 0x3f, 0x37, 0x43, 0x3b, 0x33, 0x35, 0x40, 0x47, 0x3e, 0x3c, + 0x39, 0x3c, 0x34, 0x29, 0x3c, 0x3e, 0x46, 0x3e, 0x3c, 0x38, 0x3f, 0x2d, + 0x3d, 0x3d, 0x3f, 0x3f, 0x3d, 0x45, 0x3b, 0x32, 0x39, 0x3f, 0x41, 0x38, + 0x36, 0x3e, 0x3a, 0x35, 0x40, 0x3f, 0x3b, 0x32, 0x3c, 0x39, 0x3e, 0x35, + 0x3e, 0x45, 0x34, 0x38, 0x44, 0x39, 0x3f, 0x31, 0x34, 0x39, 0x3f, 0x38, + 0x44, 0x42, 0x3f, 0x3b, 0x39, 0x3d, 0x39, 0x3b, 0x44, 0x46, 0x38, 0x3d, + 0x45, 0x37, 0x40, 0x3a, 0x3a, 0x39, 0x35, 0x3c, 0x39, 0x40, 0x47, 0x3e, + 0x38, 0x42, 0x41, 0x3b, 0x48, 0x3f, 0x3a, 0x3e, 0x3d, 0x3f, 0x32, 0x3b, + 0x3f, 0x3d, 0x3e, 0x44, 0x43, 0x41, 0x44, 0x47, 0x48, 0x41, 0x41, 0x36, + 0x3a, 0x33, 0x3c, 0x3c, 0x37, 0x3e, 0x40, 0x34, 0x3f, 0x42, 0x53, 0x40, + 0x3f, 0x35, 0x3e, 0x46, 0x3a, 0x3e, 0x4b, 0x41, 0x46, 0x32, 0x39, 0x36, + 0x3b, 0x4f, 0x36, 0x3c, 0x40, 0x3a, 0x40, 0x40, 0x47, 0x3e, 0x49, 0x37, + 0x3f, 0x31, 0x3e, 0x40, 0x3b, 0x3f, 0x43, 0x44, 0x3a, 0x3d, 0x31, 0x41, + 0x41, 0x33, 0x43, 0x40, 0x3c, 0x3a, 0x41, 0x40, 0x37, 0x3f, 0x34, 0x3e, + 0x44, 0x42, 0x3d, 0x3f, 0x3f, 0x34, 0x36, 0x34, 0x31, 0x41, 0x32, 0x39, + 0x3e, 0x3d, 0x42, 0x35, 0x3e, 0x3a, 0x41, 0x47, 0x3d, 0x42, 0x33, 0x32, + 0x43, 0x42, 0x36, 0x41, 0x3e, 0x39, 0x46, 0x39, 0x35, 0x3d, 0x3d, 0x40, + 0x38, 0x44, 0x3d, 0x31, 0x44, 0x39, 0x3a, 0x45, 0x42, 0x41, 0x3d, 0x36, + 0x3f, 0x3c, 0x39, 0x3d, 0x32, 0x39, 0x42, 0x34, 0x3f, 0x38, 0x44, 0x3c, + 0x43, 0x45, 0x41, 0x2d, 0x44, 0x42, 0x3d, 0x3f, 0x44, 0x38, 0x3d, 0x35, + 0x3a, 0x48, 0x40, 0x3b, 0x3d, 0x36, 0x3b, 0x40, 0x3f, 0x3a, 0x3a, 0x3f, + 0x3c, 0x33, 0x39, 0x3c, 0x3c, 0x38, 0x47, 0x36, 0x3d, 0x41, 0x46, 0x41, + 0x34, 0x46, 0x48, 0x46, 0x3d, 0x3c, 0x40, 0x43, 0x3d, 0x41, 0x37, 0x3e, + 0x39, 0x47, 0x3f, 0x39, 0x46, 0x43, 0x3f, 0x41, 0x45, 0x37, 0x40, 0x3a, + 0x3d, 0x44, 0x3f, 0x3b, 0x3b, 0x40, 0x4f, 0x3d, 0x3d, 0x41, 0x3c, 0x43, + 0x3e, 0x46, 0x4e, 0x40, 0x3f, 0x34, 0x48, 0x29, 0x45, 0x44, 0x46, 0x41, + 0x45, 0x32, 0x3e, 0x38, 0x39, 0x3a, 0x3e, 0x3e, 0x4c, 0x34, 0x3c, 0x40, + 0x4a, 0x44, 0x3d, 0x46, 0x3b, 0x3e, 0x42, 0x42, 0x3a, 0x41, 0x43, 0x41, + 0x39, 0x3f, 0x3e, 0x3c, 0x36, 0x48, 0x3f, 0x3e, 0x3e, 0x37, 0x3f, 0x3f, + 0x3b, 0x40, 0x3e, 0x35, 0x32, 0x35, 0x3f, 0x33, 0x3f, 0x38, 0x43, 0x37, + 0x49, 0x38, 0x37, 0x3c, 0x3c, 0x40, 0x40, 0x3a, 0x3a, 0x46, 0x37, 0x34, + 0x34, 0x3b, 0x3d, 0x2f, 0x3a, 0x38, 0x3d, 0x46, 0x3d, 0x3b, 0x3d, 0x38, + 0x35, 0x37, 0x44, 0x3c, 0x3d, 0x3e, 0x40, 0x3a, 0x40, 0x33, 0x3e, 0x38, + 0x40, 0x3e, 0x45, 0x37, 0x3f, 0x3b, 0x3c, 0x40, 0x3b, 0x3c, 0x3b, 0x33, + 0x41, 0x3f, 0x3b, 0x42, 0x31, 0x3b, 0x3a, 0x39, 0x3d, 0x41, 0x39, 0x40, + 0x43, 0x45, 0x39, 0x3b, 0x3a, 0x42, 0x43, 0x3d, 0x3f, 0x40, 0x47, 0x39, + 0x37, 0x3f, 0x47, 0x3f, 0x45, 0x41, 0x39, 0x3a, 0x41, 0x38, 0x3c, 0x3c, + 0x39, 0x40, 0x39, 0x3b, 0x3b, 0x3e, 0x38, 0x3b, 0x37, 0x48, 0x41, 0x3f, + 0x3e, 0x37, 0x3d, 0x44, 0x3c, 0x3e, 0x40, 0x39, 0x41, 0x42, 0x3d, 0x45, + 0x3b, 0x3e, 0x4c, 0x3b, 0x3a, 0x3a, 0x3e, 0x47, 0x3c, 0x3f, 0x48, 0x3f, + 0x46, 0x3f, 0x39, 0x25, 0x44, 0x3a, 0x3b, 0x40, 0x41, 0x39, 0x39, 0x47, + 0x3b, 0x32, 0x49, 0x42, 0x41, 0x3a, 0x43, 0x41, 0x3e, 0x35, 0x37, 0x3d, + 0x49, 0x40, 0x45, 0x3b, 0x3c, 0x38, 0x48, 0x3c, 0x3c, 0x35, 0x3f, 0x41, + 0x41, 0x4c, 0x36, 0x39, 0x37, 0x3d, 0x3b, 0x3e, 0x44, 0x32, 0x3d, 0x3f, + 0x3a, 0x3b, 0x3a, 0x47, 0x38, 0x42, 0x36, 0x34, 0x43, 0x3f, 0x3e, 0x40, + 0x34, 0x31, 0x36, 0x33, 0x42, 0x37, 0x41, 0x41, 0x40, 0x3d, 0x3d, 0x37, + 0x43, 0x3a, 0x3e, 0x44, 0x43, 0x3c, 0x35, 0x38, 0x38, 0x3c, 0x43, 0x36, + 0x3a, 0x38, 0x40, 0x3f, 0x3d, 0x3e, 0x37, 0x3b, 0x41, 0x3a, 0x3b, 0x3d, + 0x3c, 0x41, 0x3c, 0x41, 0x47, 0x3f, 0x3f, 0x3b, 0x3d, 0x3f, 0x3b, 0x45, + 0x38, 0x38, 0x40, 0x38, 0x46, 0x42, 0x39, 0x3d, 0x3d, 0x3b, 0x42, 0x36, + 0x42, 0x41, 0x3e, 0x3e, 0x36, 0x3f, 0x37, 0x3f, 0x36, 0x48, 0x3b, 0x39, + 0x3d, 0x3f, 0x43, 0x3e, 0x3c, 0x40, 0x48, 0x46, 0x43, 0x36, 0x42, 0x39, + 0x46, 0x3c, 0x37, 0x38, 0x49, 0x37, 0x36, 0x39, 0x3e, 0x42, 0x48, 0x3a, + 0x3c, 0x3e, 0x42, 0x30, 0x3e, 0x34, 0x39, 0x3b, 0x46, 0x61, 0x46, 0x1e, + 0x4c, 0x3b, 0x40, 0x2d, 0x3c, 0x42, 0x32, 0x30, 0x49, 0x3e, 0x39, 0x34, + 0x30, 0x40, 0x31, 0x38, 0x40, 0x3d, 0x3c, 0x35, 0x3a, 0x36, 0x40, 0x3b, + 0x41, 0x40, 0x3b, 0x39, 0x37, 0x37, 0x3f, 0x3b, 0x3c, 0x3a, 0x40, 0x3a, + 0x36, 0x3c, 0x42, 0x39, 0x3e, 0x36, 0x40, 0x42, 0x39, 0x40, 0x3b, 0x34, + 0x37, 0x33, 0x36, 0x3f, 0x43, 0x33, 0x33, 0x27, 0x3d, 0x46, 0x40, 0x31, + 0x38, 0x3e, 0x41, 0x20, 0x3f, 0x39, 0x42, 0x35, 0x35, 0x45, 0x40, 0x1e, + 0x32, 0x35, 0x32, 0x3c, 0x35, 0x44, 0x46, 0x29, 0x3a, 0x3d, 0x37, 0x42, + 0x3b, 0x45, 0x3a, 0x26, 0x38, 0x40, 0x30, 0x37, 0x41, 0x40, 0x39, 0x2b, + 0x49, 0x3f, 0x43, 0x43, 0x40, 0x3a, 0x38, 0x29, 0x43, 0x3a, 0x37, 0x40, + 0x3f, 0x35, 0x3a, 0x28, 0x36, 0x3e, 0x3f, 0x43, 0x3c, 0x39, 0x42, 0x2c, + 0x38, 0x42, 0x38, 0x3d, 0x42, 0x38, 0x35, 0x2d, 0x34, 0x38, 0x3d, 0x43, + 0x46, 0x3e, 0x3c, 0x27, 0x3e, 0x40, 0x46, 0x39, 0x35, 0x3d, 0x42, 0x35, + 0x42, 0x36, 0x40, 0x3e, 0x3a, 0x3e, 0x3c, 0x37, 0x3a, 0x3c, 0x48, 0x48, + 0x48, 0x37, 0x3d, 0x38, 0x4b, 0x40, 0x43, 0x3b, 0x41, 0x46, 0x3c, 0x34, + 0x46, 0x3c, 0x3c, 0x3c, 0x4b, 0x64, 0x4a, 0x22, 0x52, 0x41, 0x42, 0x3b, + 0x42, 0x4a, 0x34, 0x37, 0x4b, 0x44, 0x3b, 0x4a, 0x38, 0x3f, 0x38, 0x3a, + 0x40, 0x41, 0x42, 0x3c, 0x33, 0x3e, 0x3c, 0x42, 0x2c, 0x4e, 0x47, 0x3f, + 0x38, 0x33, 0x39, 0x3f, 0x3b, 0x45, 0x37, 0x3a, 0x42, 0x42, 0x44, 0x3f, + 0x3c, 0x3c, 0x3e, 0x3d, 0x3c, 0x3c, 0x40, 0x2c, 0x3c, 0x3d, 0x42, 0x39, + 0x3a, 0x37, 0x43, 0x2a, 0x3d, 0x40, 0x41, 0x41, 0x46, 0x46, 0x42, 0x28, + 0x39, 0x3c, 0x37, 0x44, 0x46, 0x41, 0x47, 0x2b, 0x44, 0x33, 0x39, 0x3f, + 0x3f, 0x43, 0x3d, 0x23, 0x3a, 0x43, 0x41, 0x3b, 0x41, 0x42, 0x33, 0x1f, + 0x43, 0x3e, 0x3d, 0x40, 0x37, 0x33, 0x42, 0x28, 0x3b, 0x38, 0x37, 0x3c, + 0x34, 0x40, 0x44, 0x2a, 0x3c, 0x3a, 0x41, 0x37, 0x45, 0x3f, 0x3e, 0x26, + 0x41, 0x40, 0x35, 0x3d, 0x45, 0x3e, 0x3d, 0x29, 0x3c, 0x39, 0x3f, 0x3c, + 0x3d, 0x39, 0x38, 0x2d, 0x39, 0x38, 0x38, 0x44, 0x3c, 0x3e, 0x38, 0x26, + 0x40, 0x36, 0x39, 0x38, 0x3f, 0x32, 0x39, 0x35, 0x3d, 0x3e, 0x35, 0x3a, + 0x3f, 0x3f, 0x31, 0x35, 0x34, 0x45, 0x3e, 0x43, 0x48, 0x3b, 0x37, 0x39, + 0x4d, 0x46, 0x54, 0x40, 0x41, 0x4e, 0x3d, 0x38, 0x4d, 0x38, 0x3a, 0x3b, + 0x49, 0x5a, 0x4a, 0x1e, 0x5e, 0x39, 0x38, 0x37, 0x3a, 0x51, 0x3a, 0x3c, + 0x50, 0x3f, 0x40, 0x42, 0x33, 0x3b, 0x2e, 0x4a, 0x3f, 0x4a, 0x3b, 0x43, + 0x36, 0x3e, 0x3d, 0x42, 0x39, 0x46, 0x4b, 0x3c, 0x3b, 0x3b, 0x35, 0x3e, + 0x3d, 0x4b, 0x3f, 0x41, 0x3f, 0x3b, 0x42, 0x42, 0x38, 0x3a, 0x41, 0x3d, + 0x36, 0x41, 0x37, 0x2f, 0x38, 0x37, 0x3f, 0x34, 0x35, 0x35, 0x45, 0x30, + 0x31, 0x42, 0x31, 0x3a, 0x3a, 0x3e, 0x3d, 0x23, 0x3f, 0x43, 0x3b, 0x41, + 0x35, 0x3b, 0x40, 0x25, 0x45, 0x3e, 0x42, 0x3b, 0x31, 0x40, 0x36, 0x28, + 0x43, 0x42, 0x30, 0x42, 0x32, 0x32, 0x36, 0x2c, 0x35, 0x3a, 0x3d, 0x3a, + 0x3c, 0x36, 0x3e, 0x30, 0x41, 0x42, 0x38, 0x41, 0x41, 0x3e, 0x3c, 0x23, + 0x37, 0x40, 0x3c, 0x3e, 0x3e, 0x3a, 0x37, 0x2b, 0x36, 0x40, 0x41, 0x42, + 0x3e, 0x38, 0x44, 0x22, 0x46, 0x38, 0x33, 0x3b, 0x3a, 0x3a, 0x3a, 0x24, + 0x36, 0x3b, 0x38, 0x44, 0x34, 0x38, 0x40, 0x28, 0x38, 0x3d, 0x36, 0x44, + 0x31, 0x3e, 0x37, 0x37, 0x36, 0x3f, 0x47, 0x38, 0x3b, 0x3e, 0x2c, 0x4c, + 0x36, 0x3c, 0x3b, 0x41, 0x4c, 0x3d, 0x3d, 0x40, 0x49, 0x44, 0x52, 0x3f, + 0x3b, 0x4d, 0x3c, 0x3a, 0x4f, 0x3b, 0x36, 0x3b, 0x4a, 0x5f, 0x4e, 0x1f, + 0x57, 0x3c, 0x3d, 0x3d, 0x46, 0x59, 0x42, 0x45, 0x52, 0x3d, 0x3a, 0x41, + 0x31, 0x39, 0x39, 0x4f, 0x43, 0x4e, 0x3e, 0x37, 0x3a, 0x37, 0x33, 0x47, + 0x32, 0x45, 0x47, 0x43, 0x31, 0x33, 0x38, 0x43, 0x3e, 0x47, 0x3d, 0x32, + 0x3b, 0x39, 0x3c, 0x42, 0x3d, 0x47, 0x42, 0x40, 0x3d, 0x3f, 0x3c, 0x34, + 0x3b, 0x3e, 0x42, 0x3d, 0x43, 0x35, 0x42, 0x2c, 0x35, 0x3d, 0x3c, 0x3d, + 0x3a, 0x3c, 0x46, 0x25, 0x43, 0x35, 0x3d, 0x39, 0x3a, 0x3c, 0x40, 0x2b, + 0x33, 0x40, 0x3d, 0x46, 0x45, 0x37, 0x3c, 0x36, 0x43, 0x37, 0x3e, 0x3a, + 0x3c, 0x47, 0x3f, 0x38, 0x36, 0x3e, 0x3a, 0x42, 0x3c, 0x42, 0x33, 0x39, + 0x3c, 0x3a, 0x3c, 0x40, 0x48, 0x3b, 0x40, 0x32, 0x37, 0x47, 0x34, 0x38, + 0x33, 0x3d, 0x49, 0x2d, 0x36, 0x42, 0x3d, 0x3e, 0x47, 0x3c, 0x42, 0x2c, + 0x3b, 0x31, 0x3f, 0x3c, 0x3d, 0x3c, 0x3f, 0x2b, 0x41, 0x35, 0x33, 0x43, + 0x47, 0x39, 0x34, 0x2a, 0x3a, 0x3a, 0x40, 0x3d, 0x44, 0x3c, 0x39, 0x34, + 0x43, 0x40, 0x33, 0x3a, 0x3b, 0x42, 0x38, 0x3b, 0x34, 0x35, 0x40, 0x43, + 0x4b, 0x41, 0x3d, 0x38, 0x49, 0x44, 0x4d, 0x37, 0x3a, 0x4b, 0x40, 0x39, + 0x4e, 0x3b, 0x30, 0x38, 0x47, 0x5d, 0x50, 0x1f, 0x54, 0x35, 0x3a, 0x39, + 0x40, 0x4c, 0x46, 0x42, 0x52, 0x39, 0x39, 0x45, 0x41, 0x3c, 0x30, 0x5b, + 0x43, 0x4d, 0x4a, 0x3e, 0x31, 0x39, 0x41, 0x4c, 0x36, 0x44, 0x4c, 0x39, + 0x32, 0x41, 0x47, 0x3e, 0x34, 0x49, 0x45, 0x3b, 0x34, 0x3a, 0x3b, 0x47, + 0x43, 0x3e, 0x43, 0x32, 0x40, 0x3e, 0x3e, 0x38, 0x37, 0x3e, 0x37, 0x3a, + 0x3a, 0x40, 0x48, 0x2f, 0x3e, 0x3e, 0x46, 0x3a, 0x3e, 0x35, 0x49, 0x30, + 0x3a, 0x41, 0x3e, 0x39, 0x34, 0x45, 0x3d, 0x34, 0x48, 0x43, 0x43, 0x42, + 0x33, 0x39, 0x3b, 0x3f, 0x30, 0x46, 0x41, 0x39, 0x48, 0x3a, 0x3c, 0x3e, + 0x3f, 0x36, 0x40, 0x3d, 0x43, 0x40, 0x3e, 0x39, 0x44, 0x40, 0x44, 0x3b, + 0x43, 0x42, 0x39, 0x38, 0x3a, 0x3f, 0x3b, 0x3f, 0x38, 0x3d, 0x34, 0x30, + 0x34, 0x3d, 0x3f, 0x42, 0x44, 0x3e, 0x34, 0x32, 0x37, 0x46, 0x44, 0x38, + 0x3c, 0x45, 0x39, 0x2b, 0x41, 0x3c, 0x40, 0x40, 0x3a, 0x3a, 0x3c, 0x32, + 0x45, 0x42, 0x3d, 0x46, 0x38, 0x3b, 0x34, 0x35, 0x38, 0x43, 0x3d, 0x34, + 0x42, 0x3b, 0x38, 0x3d, 0x37, 0x43, 0x3f, 0x39, 0x4e, 0x39, 0x40, 0x3f, + 0x4d, 0x43, 0x49, 0x3f, 0x36, 0x41, 0x44, 0x39, 0x48, 0x3a, 0x35, 0x39, + 0x48, 0x59, 0x4e, 0x25, 0x58, 0x39, 0x42, 0x35, 0x43, 0x4e, 0x42, 0x3f, + 0x4a, 0x43, 0x3b, 0x3f, 0x3b, 0x37, 0x2b, 0x5a, 0x3d, 0x44, 0x3b, 0x40, + 0x31, 0x38, 0x37, 0x44, 0x32, 0x3e, 0x41, 0x3d, 0x2c, 0x42, 0x42, 0x3c, + 0x37, 0x45, 0x41, 0x41, 0x3d, 0x39, 0x41, 0x40, 0x3a, 0x46, 0x41, 0x40, + 0x40, 0x3d, 0x38, 0x31, 0x37, 0x3f, 0x42, 0x38, 0x3f, 0x3c, 0x48, 0x30, + 0x3e, 0x39, 0x3f, 0x3d, 0x3d, 0x44, 0x52, 0x35, 0x3b, 0x32, 0x42, 0x32, + 0x3a, 0x43, 0x39, 0x3b, 0x31, 0x43, 0x36, 0x3c, 0x3c, 0x3c, 0x41, 0x45, + 0x42, 0x49, 0x41, 0x3b, 0x42, 0x3e, 0x41, 0x44, 0x36, 0x41, 0x3f, 0x3c, + 0x3e, 0x47, 0x45, 0x41, 0x38, 0x41, 0x3f, 0x43, 0x35, 0x32, 0x41, 0x39, + 0x36, 0x47, 0x35, 0x42, 0x44, 0x3b, 0x3f, 0x34, 0x48, 0x41, 0x43, 0x42, + 0x36, 0x3e, 0x3c, 0x3d, 0x3d, 0x3b, 0x42, 0x44, 0x3a, 0x44, 0x36, 0x2a, + 0x41, 0x39, 0x3a, 0x41, 0x46, 0x3c, 0x44, 0x2f, 0x36, 0x39, 0x3b, 0x3f, + 0x38, 0x45, 0x3c, 0x3c, 0x3e, 0x41, 0x3c, 0x39, 0x3e, 0x40, 0x2f, 0x45, + 0x3b, 0x41, 0x40, 0x3c, 0x4e, 0x38, 0x3e, 0x48, 0x46, 0x40, 0x48, 0x44, + 0x40, 0x4a, 0x45, 0x3c, 0x4f, 0x39, 0x37, 0x3a, 0x4e, 0x59, 0x5c, 0x22, + 0x58, 0x32, 0x38, 0x34, 0x40, 0x4b, 0x43, 0x43, 0x4f, 0x3e, 0x39, 0x40, + 0x37, 0x3e, 0x2f, 0x55, 0x3f, 0x40, 0x38, 0x3f, 0x3a, 0x33, 0x37, 0x3d, + 0x34, 0x4c, 0x37, 0x3f, 0x32, 0x39, 0x45, 0x34, 0x44, 0x4c, 0x3f, 0x3b, + 0x3c, 0x36, 0x36, 0x43, 0x36, 0x47, 0x41, 0x46, 0x41, 0x3e, 0x41, 0x3a, + 0x43, 0x3a, 0x48, 0x42, 0x42, 0x3e, 0x4c, 0x36, 0x3d, 0x39, 0x43, 0x46, + 0x3d, 0x42, 0x42, 0x3b, 0x45, 0x43, 0x3c, 0x40, 0x39, 0x37, 0x34, 0x45, + 0x3f, 0x40, 0x34, 0x38, 0x43, 0x3f, 0x36, 0x47, 0x3f, 0x3b, 0x49, 0x3c, + 0x3a, 0x3a, 0x42, 0x4c, 0x37, 0x3e, 0x3b, 0x32, 0x47, 0x40, 0x45, 0x4d, + 0x39, 0x3b, 0x39, 0x40, 0x3e, 0x3c, 0x3d, 0x3a, 0x3d, 0x3b, 0x3e, 0x43, + 0x3e, 0x3f, 0x3a, 0x3c, 0x41, 0x40, 0x39, 0x3c, 0x3a, 0x38, 0x39, 0x37, + 0x36, 0x33, 0x43, 0x45, 0x3f, 0x45, 0x41, 0x30, 0x3b, 0x34, 0x3c, 0x39, + 0x3b, 0x45, 0x37, 0x2e, 0x36, 0x34, 0x36, 0x44, 0x3d, 0x40, 0x3a, 0x3c, + 0x3d, 0x3b, 0x38, 0x41, 0x42, 0x3a, 0x32, 0x4b, 0x38, 0x3e, 0x41, 0x46, + 0x57, 0x3a, 0x44, 0x48, 0x47, 0x45, 0x47, 0x3e, 0x43, 0x42, 0x45, 0x3b, + 0x50, 0x39, 0x37, 0x3f, 0x47, 0x51, 0x5e, 0x22, 0x59, 0x33, 0x3c, 0x37, + 0x43, 0x50, 0x49, 0x47, 0x46, 0x42, 0x39, 0x44, 0x44, 0x3d, 0x2f, 0x53, + 0x35, 0x41, 0x40, 0x3d, 0x2d, 0x35, 0x2f, 0x3e, 0x3f, 0x37, 0x38, 0x3e, + 0x30, 0x45, 0x46, 0x38, 0x33, 0x3c, 0x3e, 0x3b, 0x44, 0x42, 0x47, 0x49, + 0x43, 0x40, 0x3d, 0x3c, 0x38, 0x43, 0x3e, 0x38, 0x3d, 0x40, 0x36, 0x43, + 0x43, 0x3e, 0x40, 0x3c, 0x44, 0x47, 0x43, 0x3d, 0x41, 0x39, 0x3e, 0x45, + 0x39, 0x3d, 0x39, 0x40, 0x42, 0x40, 0x3b, 0x4a, 0x40, 0x41, 0x3f, 0x37, + 0x43, 0x41, 0x37, 0x4c, 0x3f, 0x3d, 0x38, 0x3a, 0x42, 0x46, 0x43, 0x4d, + 0x3c, 0x3a, 0x43, 0x3e, 0x3b, 0x3d, 0x46, 0x4a, 0x38, 0x3d, 0x3d, 0x39, + 0x3e, 0x3c, 0x3b, 0x3e, 0x3a, 0x40, 0x40, 0x34, 0x41, 0x3f, 0x3e, 0x3f, + 0x47, 0x3c, 0x32, 0x3a, 0x3c, 0x44, 0x3f, 0x42, 0x41, 0x43, 0x3e, 0x3a, + 0x3b, 0x42, 0x41, 0x39, 0x39, 0x37, 0x39, 0x3e, 0x3d, 0x33, 0x3e, 0x35, + 0x44, 0x37, 0x40, 0x35, 0x3f, 0x47, 0x37, 0x41, 0x35, 0x38, 0x47, 0x40, + 0x43, 0x44, 0x2e, 0x48, 0x35, 0x44, 0x41, 0x3c, 0x47, 0x3d, 0x3d, 0x52, + 0x48, 0x41, 0x44, 0x41, 0x42, 0x4b, 0x3e, 0x3d, 0x4e, 0x32, 0x34, 0x47, + 0x55, 0x57, 0x5f, 0x22, 0x57, 0x33, 0x40, 0x37, 0x40, 0x4a, 0x4d, 0x47, + 0x48, 0x38, 0x3e, 0x46, 0x37, 0x42, 0x28, 0x57, 0x38, 0x42, 0x36, 0x43, + 0x35, 0x37, 0x39, 0x39, 0x42, 0x39, 0x38, 0x3c, 0x35, 0x3c, 0x3c, 0x3a, + 0x3c, 0x4c, 0x45, 0x3f, 0x43, 0x3d, 0x45, 0x45, 0x40, 0x47, 0x3e, 0x3e, + 0x3d, 0x4b, 0x49, 0x35, 0x43, 0x3c, 0x36, 0x46, 0x3c, 0x46, 0x42, 0x44, + 0x3c, 0x42, 0x3d, 0x42, 0x44, 0x3c, 0x4a, 0x40, 0x40, 0x3c, 0x3b, 0x3c, + 0x35, 0x34, 0x2e, 0x46, 0x38, 0x3d, 0x38, 0x44, 0x41, 0x40, 0x3c, 0x52, + 0x3b, 0x3d, 0x3b, 0x3f, 0x42, 0x47, 0x44, 0x52, 0x44, 0x44, 0x39, 0x3f, + 0x43, 0x35, 0x3c, 0x4d, 0x39, 0x3d, 0x3b, 0x37, 0x3e, 0x38, 0x3e, 0x49, + 0x3a, 0x37, 0x3c, 0x49, 0x40, 0x41, 0x3c, 0x40, 0x3d, 0x38, 0x39, 0x3f, + 0x44, 0x3e, 0x42, 0x3e, 0x47, 0x40, 0x34, 0x46, 0x48, 0x37, 0x45, 0x3e, + 0x46, 0x3f, 0x35, 0x39, 0x38, 0x3f, 0x36, 0x2c, 0x40, 0x38, 0x3e, 0x3c, + 0x32, 0x3c, 0x46, 0x3a, 0x3f, 0x41, 0x36, 0x49, 0x42, 0x38, 0x36, 0x43, + 0x3d, 0x41, 0x46, 0x35, 0x4f, 0x3a, 0x41, 0x5c, 0x4a, 0x42, 0x4e, 0x42, + 0x46, 0x54, 0x3f, 0x45, 0x4c, 0x30, 0x33, 0x44, 0x56, 0x5d, 0x68, 0x26, + 0x60, 0x33, 0x3e, 0x3a, 0x42, 0x49, 0x52, 0x47, 0x51, 0x46, 0x40, 0x47, + 0x41, 0x3b, 0x1b, 0x4f, 0x3c, 0x45, 0x3d, 0x3d, 0x32, 0x2f, 0x3e, 0x3c, + 0x3c, 0x3f, 0x3b, 0x3c, 0x2c, 0x3a, 0x41, 0x3c, 0x35, 0x3e, 0x3e, 0x3c, + 0x3d, 0x3f, 0x3e, 0x40, 0x40, 0x44, 0x42, 0x3c, 0x3c, 0x3c, 0x41, 0x3c, + 0x3c, 0x3d, 0x3e, 0x3d, 0x3c, 0x3d, 0x4a, 0x46, 0x3f, 0x35, 0x33, 0x43, + 0x42, 0x41, 0x4d, 0x48, 0x48, 0x44, 0x3e, 0x41, 0x41, 0x36, 0x3c, 0x4c, + 0x34, 0x47, 0x42, 0x39, 0x3e, 0x43, 0x3a, 0x53, 0x3b, 0x3b, 0x42, 0x3d, + 0x41, 0x3c, 0x3e, 0x52, 0x3a, 0x44, 0x34, 0x43, 0x3d, 0x3d, 0x3a, 0x50, + 0x3e, 0x33, 0x41, 0x40, 0x3f, 0x38, 0x43, 0x42, 0x3b, 0x37, 0x3e, 0x43, + 0x3f, 0x3c, 0x41, 0x49, 0x40, 0x32, 0x40, 0x3e, 0x3b, 0x3e, 0x44, 0x3c, + 0x35, 0x37, 0x3d, 0x41, 0x34, 0x3f, 0x3a, 0x3c, 0x47, 0x32, 0x41, 0x3d, + 0x3c, 0x3a, 0x4a, 0x31, 0x43, 0x38, 0x45, 0x37, 0x49, 0x3c, 0x34, 0x3f, + 0x3d, 0x3d, 0x3d, 0x45, 0x47, 0x3e, 0x37, 0x48, 0x40, 0x3b, 0x45, 0x3d, + 0x4e, 0x42, 0x3f, 0x57, 0x4b, 0x43, 0x4b, 0x3d, 0x3f, 0x47, 0x4a, 0x43, + 0x4e, 0x30, 0x38, 0x45, 0x59, 0x60, 0x64, 0x2d, 0x5a, 0x2d, 0x34, 0x35, + 0x47, 0x54, 0x4e, 0x3f, 0x44, 0x45, 0x3c, 0x43, 0x3d, 0x40, 0x1c, 0x5a, + 0x36, 0x3f, 0x3a, 0x39, 0x37, 0x3c, 0x32, 0x3b, 0x2d, 0x4a, 0x42, 0x35, + 0x30, 0x41, 0x43, 0x3d, 0x3d, 0x45, 0x38, 0x36, 0x3e, 0x40, 0x3a, 0x4a, + 0x34, 0x3d, 0x44, 0x3c, 0x39, 0x3b, 0x52, 0x38, 0x40, 0x3b, 0x3f, 0x3f, + 0x35, 0x37, 0x46, 0x48, 0x38, 0x3b, 0x40, 0x36, 0x3d, 0x3a, 0x4f, 0x45, + 0x35, 0x3a, 0x35, 0x33, 0x37, 0x43, 0x42, 0x52, 0x37, 0x3b, 0x3d, 0x42, + 0x44, 0x3d, 0x48, 0x58, 0x33, 0x3f, 0x41, 0x44, 0x44, 0x3f, 0x3b, 0x52, + 0x47, 0x39, 0x32, 0x3b, 0x38, 0x35, 0x48, 0x50, 0x34, 0x30, 0x39, 0x43, + 0x42, 0x40, 0x3b, 0x4b, 0x43, 0x3d, 0x34, 0x44, 0x33, 0x39, 0x44, 0x4b, + 0x45, 0x3e, 0x3c, 0x3f, 0x3a, 0x3e, 0x3c, 0x45, 0x36, 0x3e, 0x3d, 0x40, + 0x43, 0x46, 0x37, 0x3d, 0x3b, 0x42, 0x43, 0x3f, 0x3a, 0x41, 0x48, 0x2f, + 0x3e, 0x39, 0x3a, 0x39, 0x3f, 0x3a, 0x41, 0x40, 0x40, 0x3c, 0x3b, 0x3b, + 0x3f, 0x40, 0x3e, 0x42, 0x38, 0x3f, 0x38, 0x3c, 0x49, 0x45, 0x3f, 0x62, + 0x55, 0x47, 0x4c, 0x3c, 0x3c, 0x4a, 0x4c, 0x46, 0x4f, 0x39, 0x3a, 0x3b, + 0x5e, 0x58, 0x6f, 0x2b, 0x5a, 0x2f, 0x3a, 0x35, 0x4b, 0x47, 0x4a, 0x46, + 0x45, 0x3e, 0x38, 0x4f, 0x3b, 0x3d, 0x21, 0x4b, 0x3d, 0x40, 0x37, 0x40, + 0x2d, 0x2c, 0x43, 0x3f, 0x2b, 0x3e, 0x3d, 0x39, 0x2f, 0x39, 0x44, 0x3c, + 0x39, 0x39, 0x43, 0x3b, 0x3d, 0x3b, 0x44, 0x39, 0x42, 0x42, 0x3e, 0x40, + 0x3b, 0x42, 0x53, 0x40, 0x32, 0x3d, 0x35, 0x3f, 0x3d, 0x45, 0x48, 0x46, + 0x3d, 0x43, 0x3c, 0x36, 0x35, 0x39, 0x3d, 0x4a, 0x39, 0x39, 0x3e, 0x41, + 0x38, 0x36, 0x3b, 0x53, 0x3c, 0x36, 0x32, 0x3b, 0x43, 0x3d, 0x42, 0x57, + 0x35, 0x2f, 0x38, 0x40, 0x2f, 0x3d, 0x3c, 0x4c, 0x40, 0x2f, 0x3a, 0x36, + 0x39, 0x3c, 0x3a, 0x51, 0x3d, 0x37, 0x39, 0x3c, 0x42, 0x40, 0x43, 0x52, + 0x3e, 0x42, 0x3e, 0x45, 0x36, 0x34, 0x42, 0x4b, 0x3a, 0x38, 0x37, 0x3f, + 0x36, 0x41, 0x3a, 0x45, 0x3e, 0x38, 0x35, 0x41, 0x35, 0x34, 0x37, 0x3c, + 0x3f, 0x31, 0x3c, 0x35, 0x33, 0x43, 0x36, 0x28, 0x44, 0x42, 0x3e, 0x42, + 0x3a, 0x41, 0x43, 0x35, 0x3d, 0x3f, 0x40, 0x3e, 0x3d, 0x33, 0x31, 0x41, + 0x3d, 0x40, 0x3b, 0x40, 0x51, 0x40, 0x3f, 0xfb, 0x51, 0x49, 0x4c, 0x3d, + 0x44, 0x4e, 0x47, 0x42, 0x50, 0x39, 0x39, 0x40, 0x59, 0x5d, 0x70, 0x2c, + 0x59, 0x39, 0x38, 0x2f, 0x46, 0x50, 0x51, 0x47, 0x4c, 0x3c, 0x39, 0x48, + 0x44, 0x3a, 0x1a, 0x51, 0x35, 0x3e, 0x34, 0x3a, 0x3d, 0x2b, 0x41, 0x39, + 0x37, 0x4d, 0x3e, 0x43, 0x38, 0x3b, 0x3a, 0x35, 0x36, 0x3a, 0x43, 0x39, + 0x39, 0x3a, 0x46, 0x3b, 0x39, 0x3c, 0x46, 0x36, 0x3e, 0x3d, 0x4b, 0x3d, + 0x3b, 0x46, 0x3a, 0x41, 0x31, 0x3c, 0x44, 0x4a, 0x37, 0x42, 0x39, 0x43, + 0x43, 0x3e, 0x40, 0x47, 0x3c, 0x3e, 0x3b, 0x43, 0x34, 0x3a, 0x43, 0x53, + 0x3f, 0x37, 0x39, 0x37, 0x3e, 0x3b, 0x46, 0x59, 0x37, 0x37, 0x33, 0x3d, + 0x38, 0x42, 0x36, 0x58, 0x2e, 0x32, 0x2b, 0x45, 0x32, 0x33, 0x36, 0x50, + 0x41, 0x3f, 0x37, 0x3d, 0x3f, 0x3d, 0x46, 0x49, 0x41, 0x38, 0x33, 0x3d, + 0x33, 0x32, 0x3a, 0x49, 0x41, 0x41, 0x3d, 0x33, 0x3b, 0x3b, 0x3a, 0x46, + 0x34, 0x44, 0x3f, 0x3b, 0x2f, 0x3f, 0x32, 0x3c, 0x3f, 0x43, 0x3e, 0x45, + 0x3a, 0x3c, 0x43, 0x26, 0x46, 0x37, 0x38, 0x3e, 0x36, 0x31, 0x3e, 0x34, + 0x39, 0x3a, 0x38, 0x42, 0x38, 0x3e, 0x32, 0x42, 0x37, 0x37, 0x3c, 0x3a, + 0x48, 0x44, 0x3a, 0x68, 0x56, 0x46, 0x4d, 0x47, 0x40, 0x4e, 0x42, 0x46, + 0x51, 0x40, 0x38, 0x43, 0x58, 0x5d, 0x6a, 0x31, 0x57, 0x32, 0x3c, 0x36, + 0x49, 0x56, 0x52, 0x48, 0x4b, 0x41, 0x2f, 0x4d, 0x31, 0x43, 0x1b, 0x4c, + 0x30, 0x44, 0x33, 0x36, 0x2c, 0x3d, 0x45, 0x3a, 0x35, 0x46, 0x3d, 0x39, + 0x2e, 0x38, 0x3f, 0x37, 0x41, 0x44, 0x46, 0x31, 0x33, 0x46, 0x37, 0x37, + 0x3f, 0x41, 0x45, 0x30, 0x46, 0x3b, 0x50, 0x3b, 0x40, 0x39, 0x42, 0x43, + 0x35, 0x37, 0x40, 0x44, 0x3b, 0x41, 0x3d, 0x37, 0x3a, 0x41, 0x3d, 0x46, + 0x36, 0x41, 0x38, 0x41, 0x38, 0x3d, 0x45, 0x58, 0x3d, 0x3a, 0x3d, 0x44, + 0x45, 0x38, 0x48, 0x5c, 0x3d, 0x39, 0x43, 0x45, 0x41, 0x3e, 0x4a, 0x56, + 0x40, 0x33, 0x30, 0x31, 0x42, 0x39, 0x38, 0x56, 0x30, 0x3a, 0x35, 0x3e, + 0x3f, 0x38, 0x36, 0x47, 0x3c, 0x3a, 0x3d, 0x3f, 0x37, 0x35, 0x3b, 0x4d, + 0x43, 0x36, 0x39, 0x37, 0x3e, 0x42, 0x3d, 0x3f, 0x40, 0x3f, 0x34, 0x3b, + 0x3f, 0x3e, 0x3b, 0x39, 0x3b, 0x3a, 0x3a, 0x3c, 0x34, 0x3f, 0x3c, 0x2a, + 0x49, 0x3b, 0x36, 0x3c, 0x35, 0x46, 0x38, 0x3b, 0x3c, 0x39, 0x38, 0x42, + 0x39, 0x36, 0x2e, 0x4a, 0x3d, 0x39, 0x3f, 0x3f, 0x4b, 0x45, 0x3e, 0x67, + 0x4b, 0x4b, 0x49, 0x3e, 0x3f, 0x53, 0x4c, 0x55, 0x47, 0x32, 0x3b, 0x39, + 0x54, 0x5b, 0x6f, 0x29, 0x5a, 0x34, 0x3e, 0x26, 0x45, 0x52, 0x59, 0x44, + 0x59, 0x39, 0x3c, 0x47, 0x36, 0x46, 0x16, 0x50, 0x32, 0x46, 0x34, 0x35, + 0x35, 0x2d, 0x39, 0x38, 0x2c, 0x42, 0x43, 0x3b, 0x32, 0x3f, 0x37, 0x2f, + 0x34, 0x43, 0x46, 0x3b, 0x3b, 0x41, 0x3c, 0x37, 0x3e, 0x43, 0x4b, 0x36, + 0x3e, 0x3c, 0x4c, 0x42, 0x40, 0x3f, 0x49, 0x40, 0x3c, 0x40, 0x3c, 0x48, + 0x35, 0x42, 0x3f, 0x42, 0x44, 0x40, 0x45, 0x4f, 0x3f, 0x3f, 0x40, 0x42, + 0x3b, 0x3d, 0x49, 0x55, 0x42, 0x39, 0x41, 0x3b, 0x3f, 0x38, 0x44, 0x60, + 0x34, 0x40, 0x3b, 0x3b, 0x35, 0x3d, 0x41, 0x4e, 0x35, 0x33, 0x30, 0x3a, + 0x3a, 0x32, 0x42, 0x4f, 0x33, 0x34, 0x2f, 0x38, 0x49, 0x38, 0x40, 0x4c, + 0x35, 0x38, 0x3e, 0x46, 0x3f, 0x3a, 0x3a, 0x45, 0x3b, 0x34, 0x2e, 0x39, + 0x32, 0x3e, 0x40, 0x48, 0x35, 0x44, 0x3a, 0x34, 0x3f, 0x35, 0x3b, 0x32, + 0x40, 0x43, 0x3e, 0x38, 0x3b, 0x43, 0x3c, 0x2b, 0x46, 0x43, 0x40, 0x32, + 0x42, 0x3b, 0x49, 0x2e, 0x3b, 0x3a, 0x3e, 0x41, 0x3c, 0x3f, 0x31, 0x3b, + 0x41, 0x33, 0x41, 0x3c, 0x4d, 0x40, 0x38, 0x68, 0x4c, 0x4c, 0x4e, 0x3f, + 0x3f, 0x54, 0x4a, 0x3d, 0x4c, 0x33, 0x3b, 0x3a, 0x5d, 0x60, 0x71, 0x2b, + 0x59, 0x33, 0x3c, 0x2c, 0x47, 0x52, 0x4f, 0x51, 0x56, 0x3d, 0x39, 0x44, + 0x35, 0x41, 0x1b, 0x4a, 0x35, 0x41, 0x37, 0x35, 0x2c, 0x35, 0x37, 0x35, + 0x38, 0x41, 0x38, 0x3e, 0x3c, 0x40, 0x3c, 0x2f, 0x38, 0x3e, 0x3f, 0x45, + 0x40, 0x3d, 0x3c, 0x35, 0x3c, 0x46, 0x43, 0x39, 0x37, 0x42, 0x4e, 0x3c, + 0x42, 0x46, 0x37, 0x33, 0x43, 0x3f, 0x47, 0x4a, 0x3d, 0x3e, 0x40, 0x40, + 0x40, 0x3f, 0x4b, 0x54, 0x36, 0x3f, 0x37, 0x40, 0x39, 0x39, 0x47, 0x51, + 0x3d, 0x39, 0x36, 0x36, 0x40, 0x40, 0x41, 0x5a, 0x38, 0x39, 0x42, 0x38, + 0x40, 0x39, 0x43, 0x50, 0x3a, 0x3a, 0x32, 0x3c, 0x3c, 0x35, 0x44, 0x4a, + 0x37, 0x35, 0x36, 0x3c, 0x35, 0x30, 0x48, 0x4b, 0x3c, 0x33, 0x37, 0x3e, + 0x42, 0x3c, 0x42, 0x4e, 0x41, 0x32, 0x3e, 0x33, 0x49, 0x39, 0x3e, 0x42, + 0x3d, 0x39, 0x37, 0x36, 0x35, 0x41, 0x3e, 0x37, 0x37, 0x3e, 0x3d, 0x38, + 0x3a, 0x3c, 0x41, 0x29, 0x3c, 0x3b, 0x39, 0x40, 0x43, 0x3d, 0x3e, 0x33, + 0x3f, 0x3f, 0x3e, 0x43, 0x43, 0x38, 0x38, 0x41, 0x3b, 0x38, 0x35, 0x3a, + 0x4b, 0x44, 0x44, 0x55, 0x4e, 0x44, 0x4d, 0x49, 0x3e, 0x53, 0x45, 0x3f, + 0x45, 0x3d, 0x36, 0x36, 0x4f, 0x5b, 0x6b, 0x28, 0x59, 0x34, 0x39, 0x34, + 0x4f, 0x4d, 0x52, 0x3e, 0x51, 0x34, 0x35, 0x4a, 0x3b, 0x3f, 0x21, 0x45, + 0x36, 0x3f, 0x38, 0x33, 0x2c, 0x37, 0x32, 0x2f, 0x2b, 0x44, 0x47, 0x3f, + 0x38, 0x3a, 0x3f, 0x2e, 0x41, 0x3f, 0x3d, 0x41, 0x35, 0x48, 0x43, 0x40, + 0x33, 0x44, 0x40, 0x38, 0x47, 0x44, 0x4c, 0x3d, 0x41, 0x3b, 0x39, 0x36, + 0x3e, 0x44, 0x49, 0x48, 0x3c, 0x3b, 0x34, 0x34, 0x3f, 0x3c, 0x42, 0x52, + 0x43, 0x41, 0x3c, 0x3c, 0x3d, 0x43, 0x48, 0x54, 0x39, 0x35, 0x39, 0x3c, + 0x43, 0x3c, 0x44, 0x5f, 0x39, 0x3d, 0x38, 0x3f, 0x36, 0x3d, 0x43, 0x58, + 0x33, 0x3d, 0x43, 0x33, 0x3f, 0x36, 0x39, 0x54, 0x3a, 0x37, 0x2d, 0x46, + 0x43, 0x41, 0x47, 0x46, 0x3e, 0x42, 0x34, 0x49, 0x3a, 0x3f, 0x38, 0x50, + 0x3a, 0x3b, 0x42, 0x3a, 0x3e, 0x3c, 0x3b, 0x40, 0x42, 0x45, 0x37, 0x3b, + 0x2f, 0x3b, 0x46, 0x30, 0x42, 0x3b, 0x3b, 0x44, 0x3b, 0x3e, 0x40, 0x1e, + 0x33, 0x40, 0x40, 0x3d, 0x39, 0x3a, 0x41, 0x33, 0x45, 0x3e, 0x3c, 0x3f, + 0x3f, 0x38, 0x31, 0x46, 0x3b, 0x35, 0x42, 0x39, 0x49, 0x3e, 0x3d, 0x66, + 0x53, 0x3f, 0x44, 0x40, 0x43, 0x45, 0x48, 0x45, 0x49, 0x2d, 0x3e, 0x3a, + 0x4f, 0x5a, 0x62, 0x27, 0x54, 0x37, 0x35, 0x34, 0x42, 0x50, 0x54, 0x43, + 0x4d, 0x38, 0x39, 0x48, 0x38, 0x4c, 0x21, 0x3f, 0x40, 0x3a, 0x3a, 0x2f, + 0x37, 0x2f, 0x29, 0x2c, 0x36, 0x47, 0x3f, 0x41, 0x31, 0x33, 0x3e, 0x32, + 0x3e, 0x40, 0x42, 0x40, 0x42, 0x3a, 0x46, 0x33, 0x44, 0x40, 0x3c, 0x43, + 0x3d, 0x41, 0x4d, 0x3d, 0x3c, 0x47, 0x46, 0x43, 0x42, 0x3e, 0x44, 0x4e, + 0x41, 0x3a, 0x44, 0x38, 0x45, 0x3b, 0x49, 0x4c, 0x40, 0x3f, 0x37, 0x3e, + 0x3e, 0x46, 0x41, 0x51, 0x3f, 0x39, 0x30, 0x40, 0x3e, 0x38, 0x43, 0x5b, + 0x33, 0x3e, 0x31, 0x42, 0x3d, 0x2f, 0x49, 0x57, 0x37, 0x31, 0x46, 0x44, + 0x3e, 0x35, 0x40, 0x55, 0x36, 0x35, 0x3d, 0x3c, 0x38, 0x33, 0x42, 0x52, + 0x3b, 0x39, 0x34, 0x31, 0x45, 0x34, 0x3c, 0x51, 0x33, 0x39, 0x3c, 0x40, + 0x36, 0x36, 0x42, 0x3e, 0x37, 0x3e, 0x3b, 0x40, 0x3d, 0x36, 0x41, 0x30, + 0x42, 0x45, 0x40, 0x49, 0x3d, 0x32, 0x46, 0x26, 0x40, 0x44, 0x3a, 0x3f, + 0x3d, 0x46, 0x45, 0x31, 0x33, 0x34, 0x3e, 0x37, 0x46, 0x3b, 0x32, 0x3a, + 0x3d, 0x31, 0x3c, 0x36, 0x50, 0x41, 0x3b, 0x5d, 0x53, 0x42, 0x44, 0x37, + 0x3e, 0x4d, 0x41, 0x4b, 0x49, 0x2f, 0x35, 0x3a, 0x4e, 0x59, 0x5d, 0x27, + 0x5c, 0x30, 0x3d, 0x3a, 0x46, 0x50, 0x57, 0x4a, 0x4c, 0x36, 0x37, 0x46, + 0x48, 0x41, 0x24, 0x49, 0x36, 0x3e, 0x41, 0x45, 0x37, 0x38, 0x2e, 0x2e, + 0x34, 0x3c, 0x38, 0x41, 0x36, 0x3d, 0x43, 0x36, 0x3e, 0x3e, 0x41, 0x3b, + 0x42, 0x3c, 0x43, 0x38, 0x3e, 0x3d, 0x41, 0x48, 0x47, 0x4c, 0x45, 0x3b, + 0x37, 0x41, 0x38, 0x41, 0x3d, 0x41, 0x46, 0x4e, 0x36, 0x45, 0x38, 0x39, + 0x42, 0x42, 0x37, 0x4c, 0x34, 0x46, 0x3c, 0x44, 0x4a, 0x39, 0x45, 0x53, + 0x3c, 0x3f, 0x41, 0x35, 0x3c, 0x45, 0x4c, 0x5a, 0x44, 0x41, 0x30, 0x35, + 0x40, 0x39, 0x42, 0x5a, 0x36, 0x36, 0x3a, 0x3b, 0x43, 0x35, 0x3c, 0x56, + 0x35, 0x38, 0x2b, 0x4a, 0x3c, 0x40, 0x45, 0x54, 0x37, 0x37, 0x3a, 0x44, + 0x42, 0x3b, 0x3d, 0x4a, 0x3f, 0x37, 0x3b, 0x35, 0x34, 0x3f, 0x40, 0x48, + 0x45, 0x3e, 0x37, 0x38, 0x41, 0x41, 0x3d, 0x37, 0x43, 0x3d, 0x3d, 0x45, + 0x3a, 0x38, 0x3f, 0x23, 0x4a, 0x37, 0x42, 0x3c, 0x3f, 0x43, 0x42, 0x33, + 0x37, 0x39, 0x35, 0x3b, 0x41, 0x36, 0x2f, 0x3b, 0x41, 0x3a, 0x44, 0x3d, + 0x3e, 0x45, 0x44, 0x50, 0x47, 0x47, 0x48, 0x3c, 0x3f, 0x45, 0x43, 0x3f, + 0x4a, 0x33, 0x3c, 0x3a, 0x52, 0x52, 0x5a, 0x23, 0x58, 0x31, 0x3b, 0x3b, + 0x47, 0x44, 0x54, 0x45, 0x42, 0x38, 0x38, 0x40, 0x43, 0x3f, 0x2a, 0x46, + 0x3b, 0x46, 0x3b, 0x46, 0x35, 0x37, 0x29, 0x35, 0x38, 0x41, 0x3a, 0x31, + 0x44, 0x41, 0x39, 0x36, 0x45, 0x41, 0x40, 0x3e, 0x40, 0x44, 0x47, 0x37, + 0x3f, 0x42, 0x49, 0x34, 0x46, 0x3d, 0x4b, 0x3d, 0x42, 0x3b, 0x42, 0x3e, + 0x41, 0x3b, 0x3f, 0x43, 0x47, 0x45, 0x47, 0x41, 0x40, 0x3a, 0x3d, 0x45, + 0x40, 0x36, 0x3b, 0x3b, 0x44, 0x37, 0x46, 0x55, 0x35, 0x42, 0x3f, 0x3a, + 0x41, 0x41, 0x44, 0x5c, 0x31, 0x44, 0x3d, 0x46, 0x39, 0x38, 0x46, 0x59, + 0x41, 0x3b, 0x3d, 0x39, 0x33, 0x3e, 0x41, 0x58, 0x33, 0x44, 0x34, 0x31, + 0x48, 0x3e, 0x4d, 0x56, 0x36, 0x3c, 0x37, 0x46, 0x46, 0x38, 0x45, 0x53, + 0x35, 0x3d, 0x3a, 0x31, 0x42, 0x48, 0x45, 0x44, 0x3b, 0x3b, 0x3c, 0x41, + 0x3d, 0x42, 0x3f, 0x2f, 0x38, 0x3c, 0x3e, 0x41, 0x44, 0x3a, 0x4a, 0x24, + 0x37, 0x3e, 0x37, 0x48, 0x40, 0x3f, 0x46, 0x3c, 0x47, 0x4a, 0x38, 0x47, + 0x34, 0x45, 0x31, 0x42, 0x43, 0x44, 0x3f, 0x3f, 0x49, 0x40, 0x3c, 0x41, + 0x4d, 0x43, 0x42, 0x39, 0x39, 0x48, 0x41, 0x38, 0x47, 0x3c, 0x3c, 0x42, + 0x44, 0x55, 0x62, 0x2a, 0x5c, 0x32, 0x3a, 0x37, 0x4c, 0x44, 0x4f, 0x3e, + 0x4e, 0x42, 0x3a, 0x42, 0x41, 0x4a, 0x35, 0x44, 0x45, 0x3b, 0x43, 0x41, + 0x33, 0x38, 0x28, 0x36, 0x40, 0x47, 0x3e, 0x3e, 0x3e, 0x39, 0x3a, 0x37, + 0x44, 0x44, 0x3f, 0x3b, 0x41, 0x3c, 0x45, 0x36, 0x38, 0x3a, 0x3c, 0x42, + 0x42, 0x3f, 0x59, 0x3c, 0x47, 0x3d, 0x38, 0x3a, 0x42, 0x44, 0x41, 0x46, + 0x3f, 0x43, 0x48, 0x42, 0x44, 0x35, 0x3f, 0x45, 0x36, 0x3f, 0x38, 0x3a, + 0x44, 0x3d, 0x3d, 0x4e, 0x3e, 0x45, 0x40, 0x42, 0x3c, 0x33, 0x43, 0x5a, + 0x38, 0x3e, 0x45, 0x3a, 0x3e, 0x42, 0x45, 0x52, 0x3c, 0x42, 0x3a, 0x38, + 0x3d, 0x3b, 0x4a, 0x57, 0x38, 0x37, 0x47, 0x44, 0x3e, 0x3c, 0x38, 0x48, + 0x36, 0x41, 0x3f, 0x41, 0x3a, 0x3a, 0x46, 0x47, 0x42, 0x40, 0x32, 0x33, + 0x43, 0x37, 0x41, 0x43, 0x3e, 0x40, 0x3d, 0x3a, 0x3e, 0x38, 0x42, 0x30, + 0x3e, 0x40, 0x46, 0x42, 0x40, 0x44, 0x42, 0x23, 0x31, 0x40, 0x3f, 0x3d, + 0x3b, 0x33, 0x40, 0x33, 0x41, 0x33, 0x43, 0x41, 0x3a, 0x3e, 0x36, 0x40, + 0x40, 0x45, 0x37, 0x42, 0x46, 0x42, 0x39, 0x48, 0x44, 0x40, 0x40, 0x45, + 0x3c, 0x49, 0x41, 0x3f, 0x4c, 0x3d, 0x2f, 0x3f, 0x47, 0x52, 0x54, 0x2c, + 0x55, 0x42, 0x44, 0x3b, 0x46, 0x4f, 0x48, 0x3c, 0x45, 0x39, 0x3f, 0x4b, + 0x3f, 0x3f, 0x36, 0x42, 0x41, 0x48, 0x44, 0x44, 0x36, 0x3b, 0x37, 0x40, + 0x39, 0x49, 0x3a, 0x35, 0x3e, 0x48, 0x31, 0x30, 0x44, 0x38, 0x4c, 0x3c, + 0x41, 0x3e, 0x46, 0x32, 0x44, 0x3b, 0x42, 0x3c, 0x38, 0x3a, 0x47, 0x3f, + 0x3a, 0x42, 0x3a, 0x43, 0x40, 0x4b, 0x47, 0x3c, 0x42, 0x46, 0x45, 0x42, + 0x3c, 0x46, 0x3d, 0x3f, 0x3e, 0x36, 0x38, 0x3e, 0x46, 0x3c, 0x4d, 0x43, + 0x49, 0x41, 0x48, 0x3c, 0x3d, 0x39, 0x43, 0x58, 0x3a, 0x41, 0x3f, 0x38, + 0x37, 0x3f, 0x46, 0x5d, 0x3c, 0x3c, 0x39, 0x36, 0x3d, 0x46, 0x43, 0x50, + 0x3a, 0x47, 0x39, 0x36, 0x41, 0x3f, 0x3e, 0x51, 0x31, 0x36, 0x3e, 0x3c, + 0x3c, 0x3a, 0x48, 0x41, 0x3a, 0x43, 0x49, 0x3e, 0x42, 0x46, 0x3f, 0x41, + 0x49, 0x33, 0x42, 0x41, 0x45, 0x40, 0x3d, 0x2b, 0x3d, 0x38, 0x40, 0x37, + 0x3a, 0x31, 0x45, 0x26, 0x33, 0x3d, 0x3f, 0x39, 0x36, 0x3c, 0x38, 0x33, + 0x34, 0x3f, 0x35, 0x44, 0x3a, 0x39, 0x32, 0x41, 0x35, 0x40, 0x3c, 0x3b, + 0x4a, 0x3f, 0x3e, 0x3e, 0x4a, 0x3e, 0x42, 0x35, 0x38, 0x43, 0x3c, 0x37, + 0x3d, 0x3c, 0x39, 0x43, 0x3f, 0x4e, 0x54, 0x33, 0x4b, 0x37, 0x43, 0x3b, + 0x43, 0x48, 0x43, 0x42, 0x3d, 0x46, 0x45, 0x49, 0x3a, 0x39, 0x36, 0x4a, + 0x48, 0x48, 0x37, 0x4b, 0x42, 0x47, 0x34, 0x34, 0x43, 0x42, 0x3a, 0x3d, + 0x3c, 0x46, 0x34, 0x39, 0x40, 0x3b, 0x3e, 0x3e, 0x37, 0x3d, 0x53, 0x3b, + 0x48, 0x3c, 0x43, 0x44, 0x3b, 0x3f, 0x57, 0x3d, 0x39, 0x3c, 0x39, 0x3a, + 0x3e, 0x3f, 0x43, 0x3e, 0x41, 0x47, 0x3c, 0x41, 0x40, 0x41, 0x37, 0x3f, + 0x3b, 0x43, 0x35, 0x3e, 0x45, 0x40, 0x47, 0x59, 0x41, 0x49, 0x3b, 0x3f, + 0x47, 0x49, 0x4b, 0x61, 0x39, 0x48, 0x39, 0x3e, 0x44, 0x34, 0x3b, 0x59, + 0x3c, 0x42, 0x45, 0x35, 0x42, 0x41, 0x39, 0x52, 0x42, 0x3c, 0x3d, 0x3e, + 0x3d, 0x4a, 0x4a, 0x4d, 0x3c, 0x34, 0x44, 0x3c, 0x41, 0x34, 0x38, 0x46, + 0x38, 0x45, 0x40, 0x45, 0x40, 0x3a, 0x3d, 0x44, 0x3a, 0x37, 0x3a, 0x3a, + 0x3b, 0x42, 0x40, 0x34, 0x3b, 0x3c, 0x42, 0x40, 0x3d, 0x32, 0x40, 0x27, + 0x37, 0x39, 0x37, 0x46, 0x48, 0x31, 0x40, 0x30, 0x42, 0x42, 0x3a, 0x40, + 0x3d, 0x37, 0x2a, 0x40, 0x41, 0x37, 0x3c, 0x4a, 0x46, 0x45, 0x3d, 0x34, + 0x48, 0x41, 0x42, 0x3e, 0x3f, 0x39, 0x3c, 0x3a, 0x4f, 0x3b, 0x32, 0x3e, + 0x43, 0x51, 0x4f, 0x2a, 0x46, 0x3a, 0x3d, 0x3b, 0x40, 0x3d, 0x4c, 0x3c, + 0x48, 0x40, 0x36, 0x4a, 0x3a, 0x38, 0x42, 0x43, 0x4c, 0x3d, 0x47, 0x47, + 0x33, 0x3f, 0x2d, 0x37, 0x4a, 0x43, 0x38, 0x3e, 0x49, 0x42, 0x42, 0x3d, + 0x43, 0x47, 0x41, 0x38, 0x46, 0x37, 0x46, 0x38, 0x47, 0x42, 0x49, 0x3d, + 0x3b, 0x37, 0x4c, 0x3c, 0x3a, 0x45, 0x3f, 0x37, 0x36, 0x3d, 0x3c, 0x40, + 0x3e, 0x45, 0x46, 0x41, 0x41, 0x40, 0x3c, 0x44, 0x47, 0x43, 0x37, 0x3f, + 0x3e, 0x3a, 0x3a, 0x4b, 0x3a, 0x36, 0x3d, 0x3f, 0x38, 0x3f, 0x3c, 0x58, + 0x40, 0x49, 0x3d, 0x42, 0x38, 0x3a, 0x47, 0x50, 0x3b, 0x49, 0x40, 0x44, + 0x3e, 0x3c, 0x38, 0x52, 0x3a, 0x3e, 0x44, 0x3c, 0x35, 0x44, 0x3a, 0x47, + 0x3e, 0x49, 0x3f, 0x47, 0x45, 0x39, 0x3b, 0x46, 0x44, 0x3e, 0x41, 0x46, + 0x40, 0x41, 0x40, 0x40, 0x3a, 0x35, 0x3e, 0x36, 0x3e, 0x3e, 0x3d, 0x35, + 0x3b, 0x3c, 0x38, 0x46, 0x3b, 0x3c, 0x41, 0x2c, 0x3f, 0x42, 0x38, 0x3b, + 0x36, 0x3b, 0x39, 0x40, 0x40, 0x38, 0x36, 0x33, 0x34, 0x42, 0x2f, 0x44, + 0x41, 0x40, 0x39, 0x35, 0x3b, 0x44, 0x42, 0x2c, 0x41, 0x3b, 0x44, 0x41, + 0x35, 0x44, 0x3b, 0x34, 0x44, 0x49, 0x36, 0x39, 0x3a, 0x52, 0x4d, 0x2b, + 0x40, 0x40, 0x3e, 0x39, 0x48, 0x42, 0x3c, 0x44, 0x46, 0x49, 0x3f, 0x54, + 0x43, 0x40, 0x2e, 0x40, 0x4f, 0x36, 0x3e, 0x3f, 0x38, 0x48, 0x44, 0x3c, + 0x44, 0x43, 0x41, 0x47, 0x40, 0x46, 0x40, 0x37, 0x41, 0x34, 0x3a, 0x41, + 0x41, 0x3b, 0x49, 0x39, 0x42, 0x38, 0x3d, 0x39, 0x34, 0x35, 0x43, 0x36, + 0x3e, 0x44, 0x3f, 0x40, 0x43, 0x40, 0x40, 0x3a, 0x47, 0x42, 0x3e, 0x42, + 0x46, 0x35, 0x3a, 0x46, 0x3c, 0x3c, 0x3c, 0x3d, 0x3f, 0x40, 0x43, 0x4c, + 0x3a, 0x37, 0x3f, 0x43, 0x47, 0x38, 0x42, 0x58, 0x42, 0x3b, 0x34, 0x37, + 0x3e, 0x48, 0x3c, 0x57, 0x44, 0x3c, 0x3d, 0x3a, 0x36, 0x48, 0x3c, 0x51, + 0x3d, 0x48, 0x45, 0x45, 0x38, 0x45, 0x40, 0x3f, 0x3b, 0x35, 0x3d, 0x3f, + 0x38, 0x47, 0x39, 0x3b, 0x36, 0x49, 0x43, 0x40, 0x3f, 0x46, 0x38, 0x40, + 0x3f, 0x3e, 0x39, 0x32, 0x47, 0x42, 0x35, 0x33, 0x39, 0x47, 0x3c, 0x36, + 0x3b, 0x37, 0x43, 0x35, 0x3b, 0x3b, 0x34, 0x3b, 0x38, 0x3d, 0x3e, 0x3a, + 0x35, 0x49, 0x38, 0x40, 0x3f, 0x3f, 0x3e, 0x37, 0x43, 0x3b, 0x3e, 0x3e, + 0x3b, 0x40, 0x44, 0x39, 0x3d, 0x3f, 0x31, 0x42, 0x42, 0x3b, 0x41, 0x3d, + 0x3e, 0x3c, 0x37, 0x34, 0x48, 0x3d, 0x49, 0x4a, 0x47, 0x36, 0x3a, 0x34, + 0x37, 0x36, 0x3e, 0x38, 0x33, 0x45, 0x39, 0x44, 0x34, 0x49, 0x3a, 0x3d, + 0x34, 0x31, 0x31, 0x3d, 0x34, 0x3d, 0x41, 0x3e, 0x49, 0x41, 0x34, 0x3f, + 0x3a, 0x42, 0x3e, 0x40, 0x3f, 0x33, 0x46, 0x3f, 0x34, 0x39, 0x37, 0x46, + 0x3e, 0x32, 0x3f, 0x45, 0x45, 0x41, 0x3b, 0x4b, 0x35, 0x35, 0x3b, 0x4a, + 0x3d, 0x43, 0x3b, 0x44, 0x3c, 0x38, 0x31, 0x43, 0x39, 0x35, 0x41, 0x45, + 0x37, 0x3e, 0x43, 0x47, 0x39, 0x40, 0x41, 0x41, 0x40, 0x32, 0x37, 0x3e, + 0x3d, 0x39, 0x3b, 0x49, 0x33, 0x35, 0x38, 0x41, 0x45, 0x37, 0x3c, 0x49, + 0x3b, 0x34, 0x34, 0x41, 0x3a, 0x3f, 0x3e, 0x47, 0x39, 0x3c, 0x34, 0x3a, + 0x38, 0x44, 0x40, 0x51, 0x3a, 0x37, 0x3b, 0x3f, 0x3d, 0x3a, 0x45, 0x48, + 0x3f, 0x46, 0x35, 0x43, 0x38, 0x43, 0x35, 0x4c, 0x42, 0x47, 0x44, 0x3d, + 0x40, 0x3a, 0x39, 0x4e, 0x3d, 0x37, 0x3c, 0x42, 0x40, 0x48, 0x44, 0x4c, + 0x31, 0x40, 0x42, 0x3b, 0x45, 0x45, 0x3f, 0x3e, 0x3d, 0x44, 0x3f, 0x31, + 0x3f, 0x44, 0x45, 0x37, 0x3e, 0x3d, 0x35, 0x3b, 0x2d, 0x44, 0x4a, 0x3a, + 0x2b, 0x37, 0x38, 0x46, 0x41, 0x39, 0x3c, 0x3c, 0x46, 0x33, 0x36, 0x3c, + 0x4b, 0x34, 0x49, 0x50, 0x30, 0x3c, 0x33, 0x41, 0x44, 0x33, 0x43, 0x39, + 0x36, 0x45, 0x33, 0x3b, 0x3d, 0x36, 0x47, 0x30, 0x42, 0x37, 0x49, 0x3e, + 0x3b, 0x49, 0x3d, 0x3b, 0x3a, 0x41, 0x38, 0x44, 0x42, 0x3b, 0x3f, 0x40, + 0x46, 0x35, 0x38, 0x3c, 0x48, 0x3a, 0x46, 0x41, 0x36, 0x36, 0x41, 0x3e, + 0x43, 0x3e, 0x32, 0x39, 0x3a, 0x41, 0x30, 0x3e, 0x40, 0x3e, 0x36, 0x3a, + 0x45, 0x45, 0x3a, 0x3c, 0x31, 0x3b, 0x47, 0x3f, 0x36, 0x3a, 0x3c, 0x41, + 0x3b, 0x41, 0x39, 0x46, 0x3f, 0x3c, 0x34, 0x3e, 0x41, 0x45, 0x41, 0x42, + 0x39, 0x40, 0x40, 0x44, 0x45, 0x42, 0x34, 0x3f, 0x3e, 0x31, 0x3b, 0x41, + 0x33, 0x43, 0x37, 0x44, 0x44, 0x3a, 0x36, 0x36, 0x48, 0x3c, 0x37, 0x47, + 0x39, 0x3e, 0x3e, 0x3c, 0x3c, 0x41, 0x3c, 0x44, 0x3b, 0x42, 0x3f, 0x3a, + 0x43, 0x3b, 0x3e, 0x48, 0x36, 0x3f, 0x3d, 0x34, 0x40, 0x43, 0x35, 0x4f, + 0x34, 0x39, 0x3b, 0x41, 0x40, 0x39, 0x37, 0x4c, 0x39, 0x36, 0x39, 0x39, + 0x47, 0x41, 0x43, 0x3f, 0x3f, 0x33, 0x42, 0x3f, 0x42, 0x40, 0x37, 0x40, + 0x3f, 0x34, 0x45, 0x3d, 0x2d, 0x3c, 0x44, 0x3b, 0x43, 0x37, 0x26, 0x50, + 0x43, 0x44, 0x3d, 0x43, 0x42, 0x2d, 0x3c, 0x33, 0x4a, 0x32, 0x4a, 0x53, + 0x33, 0x38, 0x27, 0x36, 0x42, 0x30, 0x47, 0x3d, 0x36, 0x45, 0x46, 0x36, + 0x3b, 0x3b, 0x40, 0x33, 0x37, 0x36, 0x44, 0x46, 0x3d, 0x35, 0x40, 0x38, + 0x3b, 0x40, 0x36, 0x3c, 0x3d, 0x37, 0x31, 0x41, 0x33, 0x3c, 0x38, 0x3f, + 0x43, 0x3a, 0x40, 0x49, 0x38, 0x39, 0x38, 0x3d, 0x43, 0x3d, 0x39, 0x3b, + 0x3d, 0x3f, 0x38, 0x42, 0x34, 0x43, 0x33, 0x3e, 0x43, 0x3e, 0x40, 0x42, + 0x3b, 0x45, 0x37, 0x44, 0x43, 0x39, 0x3c, 0x3d, 0x37, 0x44, 0x3a, 0x3b, + 0x47, 0x3f, 0x3a, 0x3c, 0x3a, 0x3b, 0x3f, 0x43, 0x3e, 0x3d, 0x46, 0x3e, + 0x37, 0x36, 0x3f, 0x40, 0x42, 0x42, 0x37, 0x36, 0x48, 0x35, 0x44, 0x44, + 0x39, 0x3c, 0x3b, 0x41, 0x44, 0x49, 0x3a, 0x40, 0x41, 0x36, 0x33, 0x3a, + 0x3c, 0x3d, 0x40, 0x3f, 0x43, 0x36, 0x3c, 0x3a, 0x3f, 0x4b, 0x32, 0x49, + 0x49, 0x3e, 0x3a, 0x3e, 0x3f, 0x41, 0x3c, 0x47, 0x40, 0x41, 0x45, 0x3e, + 0x47, 0x47, 0x3f, 0x47, 0x45, 0x3e, 0x31, 0x43, 0x4a, 0x44, 0x36, 0x40, + 0x41, 0x47, 0x3e, 0x42, 0x37, 0x40, 0x3b, 0x46, 0x37, 0x41, 0x3e, 0x3c, + 0x27, 0x40, 0x49, 0x42, 0x42, 0x39, 0x30, 0x49, 0x43, 0x38, 0x3d, 0x42, + 0x43, 0x2f, 0x3b, 0x37, 0x4b, 0x2d, 0x4f, 0x52, 0x30, 0x31, 0x2f, 0x3a, + 0x49, 0x38, 0x4f, 0x45, 0x2e, 0x47, 0x3a, 0x32, 0x33, 0x3f, 0x4a, 0x2e, + 0x33, 0x3b, 0x3e, 0x3e, 0x49, 0x45, 0x44, 0x38, 0x3c, 0x35, 0x45, 0x47, + 0x41, 0x3b, 0x3c, 0x48, 0x46, 0x39, 0x39, 0x3b, 0x3f, 0x41, 0x38, 0x42, + 0x3d, 0x46, 0x33, 0x41, 0x36, 0x3f, 0x3f, 0x3c, 0x33, 0x3e, 0x3e, 0x40, + 0x44, 0x40, 0x3c, 0x38, 0x46, 0x3a, 0x40, 0x36, 0x42, 0x35, 0x3f, 0x3b, + 0x3b, 0x43, 0x3c, 0x40, 0x40, 0x49, 0x2e, 0x39, 0x40, 0x3f, 0x45, 0x41, + 0x3f, 0x30, 0x42, 0x3d, 0x40, 0x3c, 0x3a, 0x3b, 0x3b, 0x40, 0x39, 0x42, + 0x3a, 0x3f, 0x3f, 0x3e, 0x35, 0x3b, 0x38, 0x45, 0x47, 0x35, 0x44, 0x3e, + 0x3b, 0x3f, 0x3f, 0x40, 0x3a, 0x35, 0x30, 0x49, 0x45, 0x35, 0x3b, 0x39, + 0x3b, 0x48, 0x3f, 0x37, 0x39, 0x40, 0x43, 0x45, 0x3d, 0x40, 0x41, 0x3a, + 0x33, 0x3d, 0x3a, 0x4b, 0x40, 0x42, 0x40, 0x42, 0x43, 0x39, 0x3c, 0x49, + 0x3e, 0x47, 0x3e, 0x44, 0x3f, 0x3a, 0x40, 0x41, 0x3f, 0x42, 0x42, 0x37, + 0x3e, 0x3b, 0x36, 0x3e, 0x3b, 0x3c, 0x48, 0x43, 0x2d, 0x46, 0x4a, 0x38, + 0x45, 0x3a, 0x29, 0x46, 0x40, 0x3c, 0x40, 0x44, 0x40, 0x33, 0x2f, 0x33, + 0x48, 0x2e, 0x51, 0x4f, 0x2b, 0x32, 0x2e, 0x2d, 0x45, 0x33, 0x4d, 0x41, + 0x29, 0x4b, 0x41, 0x39, 0x2f, 0x3a, 0x49, 0x31, 0x37, 0x40, 0x47, 0x4c, + 0x3e, 0x31, 0x41, 0x3f, 0x43, 0x37, 0x45, 0x4f, 0x41, 0x3c, 0x30, 0x4a, + 0x37, 0x37, 0x36, 0x39, 0x31, 0x3d, 0x36, 0x4b, 0x37, 0x44, 0x3c, 0x43, + 0x44, 0x36, 0x3f, 0x3b, 0x34, 0x3e, 0x3a, 0x35, 0x38, 0x3f, 0x33, 0x37, + 0x3b, 0x3d, 0x46, 0x38, 0x3b, 0x37, 0x38, 0x3b, 0x31, 0x3e, 0x3d, 0x3b, + 0x3d, 0x39, 0x35, 0x33, 0x33, 0x3c, 0x39, 0x39, 0x48, 0x39, 0x39, 0x3f, + 0x3e, 0x36, 0x47, 0x3a, 0x44, 0x40, 0x32, 0x3c, 0x37, 0x35, 0x40, 0x3f, + 0x3a, 0x38, 0x3b, 0x3d, 0x46, 0x45, 0x36, 0x43, 0x40, 0x3d, 0x41, 0x41, + 0x47, 0x3a, 0x3d, 0x3e, 0x43, 0x42, 0x32, 0x36, 0x41, 0x37, 0x3b, 0x35, + 0x36, 0x44, 0x36, 0x3c, 0x43, 0x32, 0x3e, 0x3e, 0x42, 0x45, 0x32, 0x3c, + 0x3a, 0x3b, 0x35, 0x43, 0x41, 0x3d, 0x44, 0x50, 0x43, 0x31, 0x3e, 0x44, + 0x44, 0x41, 0x3a, 0x44, 0x36, 0x39, 0x3b, 0x3c, 0x32, 0x38, 0x3b, 0x45, + 0x38, 0x43, 0x40, 0x42, 0x33, 0x3e, 0x4a, 0x42, 0x45, 0x39, 0x2f, 0x42, + 0x39, 0x35, 0x44, 0x3e, 0x39, 0x2f, 0x34, 0x33, 0x49, 0x29, 0x50, 0x4f, + 0x2b, 0x36, 0x34, 0x2d, 0x47, 0x33, 0x49, 0x3c, 0x33, 0x51, 0x49, 0x3f, + 0x34, 0x39, 0x4a, 0x2c, 0x34, 0x45, 0x4f, 0x47, 0x34, 0x42, 0x3a, 0x3d, + 0x36, 0x4a, 0x3b, 0x43, 0x36, 0x3f, 0x39, 0x4b, 0x38, 0x3a, 0x31, 0x3d, + 0x32, 0x42, 0x3a, 0x47, 0x48, 0x3e, 0x44, 0x3f, 0x39, 0x3e, 0x44, 0x35, + 0x41, 0x3c, 0x45, 0x3a, 0x3e, 0x3b, 0x3d, 0x2f, 0x37, 0x40, 0x3e, 0x43, + 0x39, 0x39, 0x33, 0x3b, 0x37, 0x3b, 0x37, 0x37, 0x37, 0x39, 0x36, 0x31, + 0x39, 0x3b, 0x41, 0x39, 0x3b, 0x40, 0x36, 0x37, 0x42, 0x39, 0x3a, 0x46, + 0x3f, 0x30, 0x38, 0x39, 0x35, 0x32, 0x3e, 0x3a, 0x43, 0x43, 0x3e, 0x33, + 0x42, 0x3f, 0x41, 0x3c, 0x46, 0x34, 0x34, 0x40, 0x43, 0x37, 0x32, 0x43, + 0x3c, 0x37, 0x36, 0x33, 0x3d, 0x36, 0x3a, 0x40, 0x39, 0x38, 0x32, 0x3e, + 0x32, 0x3d, 0x37, 0x49, 0x42, 0x47, 0x41, 0x3b, 0x3d, 0x3c, 0x3a, 0x37, + 0x3c, 0x45, 0x3a, 0x45, 0x36, 0x44, 0x3a, 0x3a, 0x3a, 0x3c, 0x43, 0x3b, + 0x3b, 0x35, 0x38, 0x47, 0x36, 0x40, 0x32, 0x43, 0x3e, 0x39, 0x42, 0x40, + 0x2c, 0x3c, 0x4c, 0x4c, 0x43, 0x3b, 0x37, 0x4a, 0x3f, 0x3c, 0x45, 0x44, + 0x3f, 0x30, 0x36, 0x31, 0x4f, 0x2f, 0x5d, 0x4b, 0x34, 0x34, 0x2d, 0x2b, + 0x44, 0x31, 0x4e, 0x40, 0x2e, 0x4d, 0x48, 0x3e, 0x37, 0x2b, 0x49, 0x25, + 0x31, 0x49, 0x44, 0x49, 0x39, 0x39, 0x4b, 0x3a, 0x3a, 0x41, 0x3e, 0x42, + 0x3c, 0x36, 0x36, 0x4a, 0x32, 0x44, 0x3e, 0x48, 0x3e, 0x3c, 0x37, 0x49, + 0x3d, 0x34, 0x3f, 0x37, 0x33, 0x36, 0x46, 0x3a, 0x3a, 0x31, 0x45, 0x3f, + 0x3a, 0x31, 0x3b, 0x33, 0x41, 0x42, 0x35, 0x39, 0x38, 0x44, 0x36, 0x3a, + 0x3f, 0x3b, 0x37, 0x3e, 0x3b, 0x38, 0x2f, 0x32, 0x44, 0x3d, 0x44, 0x41, + 0x39, 0x36, 0x3a, 0x34, 0x39, 0x38, 0x34, 0x3f, 0x3b, 0x37, 0x34, 0x34, + 0x40, 0x3d, 0x34, 0x3a, 0x46, 0x42, 0x3f, 0x34, 0x38, 0x33, 0x39, 0x44, + 0x3f, 0x41, 0x3c, 0x31, 0x40, 0x32, 0x3f, 0x37, 0x37, 0x41, 0x3e, 0x35, + 0x37, 0x48, 0x3b, 0x41, 0x3d, 0x3a, 0x3f, 0x35, 0x33, 0x3c, 0x36, 0x3b, + 0x3a, 0x48, 0x33, 0x42, 0x37, 0x33, 0x39, 0x41, 0x3c, 0x3d, 0x3b, 0x4d, + 0x39, 0x3a, 0x3e, 0x44, 0x3d, 0x41, 0x3b, 0x38, 0x49, 0x41, 0x3a, 0x38, + 0x34, 0x38, 0x38, 0x3c, 0x45, 0x3c, 0x37, 0x3b, 0x36, 0x3e, 0x4a, 0x4b, + 0x42, 0x3f, 0x32, 0x45, 0x46, 0x35, 0x46, 0x41, 0x38, 0x33, 0x39, 0x37, + 0x44, 0x2b, 0x60, 0x4a, 0x2a, 0x2e, 0x35, 0x2d, 0x43, 0x37, 0x51, 0x47, + 0x2f, 0x4d, 0x50, 0x3e, 0x3a, 0x33, 0x4f, 0x2a, 0x35, 0x45, 0x4a, 0x4c, + 0x3b, 0x3d, 0x43, 0x44, 0x3d, 0x3f, 0x4a, 0x3e, 0x49, 0x37, 0x2e, 0x4f, + 0x39, 0x3f, 0x32, 0x3c, 0x37, 0x3b, 0x39, 0x4d, 0x34, 0x3f, 0x46, 0x44, + 0x3d, 0x40, 0x3f, 0x40, 0x39, 0x33, 0x39, 0x3e, 0x3d, 0x40, 0x31, 0x30, + 0x35, 0x3d, 0x3e, 0x3a, 0x3e, 0x32, 0x31, 0x3e, 0x48, 0x3c, 0x40, 0x43, + 0x3f, 0x3f, 0x34, 0x2e, 0x3a, 0x3e, 0x3b, 0x43, 0x45, 0x32, 0x3a, 0x31, + 0x37, 0x38, 0x31, 0x35, 0x34, 0x3d, 0x42, 0x36, 0x46, 0x37, 0x32, 0x47, + 0x41, 0x3c, 0x35, 0x35, 0x36, 0x41, 0x3a, 0x3b, 0x42, 0x44, 0x36, 0x31, + 0x3c, 0x3d, 0x34, 0x34, 0x3b, 0x40, 0x40, 0x2e, 0x40, 0x46, 0x3b, 0x43, + 0x3f, 0x40, 0x3b, 0x3a, 0x32, 0x40, 0x46, 0x39, 0x3c, 0x49, 0x2f, 0x3d, + 0x49, 0x3e, 0x44, 0x3c, 0x3e, 0x35, 0x3f, 0x44, 0x41, 0x40, 0x3e, 0x47, + 0x3d, 0x40, 0x3f, 0x41, 0x3b, 0x41, 0x41, 0x3f, 0x40, 0x3f, 0x3e, 0x3e, + 0x3f, 0x43, 0x35, 0x40, 0x2b, 0x42, 0x45, 0x56, 0x40, 0x3c, 0x2f, 0x44, + 0x44, 0x3d, 0x3e, 0x3d, 0x40, 0x2d, 0x39, 0x31, 0x54, 0x2f, 0x61, 0x48, + 0x2e, 0x37, 0x37, 0x32, 0x3e, 0x2d, 0x52, 0x4d, 0x2d, 0x4d, 0x4c, 0x3a, + 0x3a, 0x31, 0x4e, 0x2d, 0x31, 0x48, 0x47, 0x54, 0x45, 0x38, 0x3b, 0x3d, + 0x42, 0x41, 0x44, 0x4a, 0x48, 0x42, 0x2f, 0x4d, 0x31, 0x34, 0x3a, 0x46, + 0x37, 0x44, 0x2c, 0x45, 0x46, 0x43, 0x40, 0x3f, 0x34, 0x33, 0x40, 0x39, + 0x32, 0x35, 0x3a, 0x40, 0x3f, 0x3f, 0x36, 0x32, 0x3f, 0x3d, 0x35, 0x48, + 0x3c, 0x48, 0x37, 0x39, 0x35, 0x3f, 0x37, 0x3d, 0x44, 0x46, 0x2d, 0x2a, + 0x47, 0x38, 0x3a, 0x39, 0x45, 0x3b, 0x40, 0x2d, 0x37, 0x33, 0x41, 0x3c, + 0x40, 0x35, 0x3f, 0x32, 0x3a, 0x36, 0x40, 0x41, 0x3a, 0x3c, 0x33, 0x31, + 0x42, 0x3f, 0x41, 0x3a, 0x41, 0x46, 0x38, 0x2f, 0x3c, 0x3d, 0x3d, 0x39, + 0x3b, 0x46, 0x41, 0x31, 0x46, 0x36, 0x40, 0x48, 0x3c, 0x33, 0x42, 0x32, + 0x3b, 0x40, 0x3f, 0x36, 0x37, 0x44, 0x34, 0x35, 0x32, 0x32, 0x37, 0x38, + 0x33, 0x3b, 0x37, 0x4a, 0x3f, 0x46, 0x3a, 0x41, 0x32, 0x37, 0x30, 0x3e, + 0x40, 0x35, 0x41, 0x40, 0x37, 0x41, 0x2b, 0x40, 0x3d, 0x3d, 0x32, 0x38, + 0x34, 0x3e, 0x47, 0x61, 0x43, 0x3b, 0x3c, 0x42, 0x46, 0x3d, 0x40, 0x4a, + 0x3c, 0x2d, 0x33, 0x35, 0x55, 0x38, 0x69, 0x4f, 0x33, 0x37, 0x30, 0x39, + 0x44, 0x2e, 0x58, 0x4b, 0x2a, 0x51, 0x4b, 0x3c, 0x39, 0x2e, 0x51, 0x2d, + 0x30, 0x4a, 0x42, 0x53, 0x3f, 0x39, 0x3e, 0x44, 0x3b, 0x40, 0x47, 0x44, + 0x47, 0x3e, 0x39, 0x4b, 0x40, 0x3d, 0x42, 0x39, 0x3b, 0x39, 0x32, 0x42, + 0x36, 0x36, 0x36, 0x42, 0x44, 0x34, 0x33, 0x40, 0x40, 0x40, 0x3a, 0x3a, + 0x41, 0x3f, 0x31, 0x30, 0x3f, 0x31, 0x30, 0x39, 0x46, 0x36, 0x35, 0x34, + 0x40, 0x43, 0x3c, 0x41, 0x31, 0x46, 0x35, 0x26, 0x44, 0x32, 0x3d, 0x35, + 0x3d, 0x3c, 0x36, 0x32, 0x39, 0x3a, 0x30, 0x40, 0x48, 0x3e, 0x38, 0x37, + 0x44, 0x3b, 0x3d, 0x42, 0x3d, 0x3c, 0x32, 0x2b, 0x3f, 0x41, 0x39, 0x3d, + 0x3e, 0x3f, 0x35, 0x2f, 0x46, 0x3d, 0x3d, 0x3b, 0x45, 0x37, 0x31, 0x35, + 0x44, 0x40, 0x3a, 0x45, 0x3a, 0x3c, 0x39, 0x31, 0x3b, 0x3d, 0x3b, 0x3a, + 0x43, 0x44, 0x39, 0x47, 0x44, 0x36, 0x3e, 0x39, 0x48, 0x3f, 0x39, 0x4b, + 0x3c, 0x36, 0x3d, 0x44, 0x44, 0x3f, 0x39, 0x43, 0x3f, 0x37, 0x3f, 0x37, + 0x3b, 0x3b, 0x38, 0x3b, 0x3f, 0x40, 0x31, 0x44, 0x30, 0x44, 0x46, 0x5b, + 0x46, 0x3f, 0x39, 0x40, 0x40, 0x37, 0x4a, 0x46, 0x3f, 0x36, 0x40, 0x39, + 0x59, 0x3e, 0x66, 0x57, 0x32, 0x34, 0x2e, 0x33, 0x46, 0x31, 0x58, 0x44, + 0x26, 0x4c, 0x4b, 0x3c, 0x39, 0x2e, 0x4d, 0x35, 0x32, 0x46, 0x52, 0x52, + 0x3e, 0x40, 0x39, 0x3c, 0x39, 0x3d, 0x53, 0x48, 0x41, 0x3c, 0x3b, 0x4d, + 0x3c, 0x3e, 0x38, 0x44, 0x3a, 0x3a, 0x29, 0x4a, 0x3c, 0x37, 0x36, 0x38, + 0x3a, 0x31, 0x37, 0x39, 0x3a, 0x40, 0x46, 0x32, 0x42, 0x38, 0x32, 0x2e, + 0x3a, 0x45, 0x44, 0x34, 0x34, 0x38, 0x32, 0x2e, 0x35, 0x40, 0x3a, 0x41, + 0x42, 0x3d, 0x37, 0x2c, 0x3f, 0x37, 0x3c, 0x3d, 0x3a, 0x36, 0x33, 0x35, + 0x3c, 0x34, 0x3c, 0x39, 0x3c, 0x3a, 0x37, 0x30, 0x30, 0x3e, 0x3d, 0x3a, + 0x44, 0x37, 0x36, 0x32, 0x36, 0x37, 0x36, 0x3a, 0x3c, 0x41, 0x3a, 0x35, + 0x36, 0x3a, 0x34, 0x40, 0x39, 0x40, 0x3e, 0x32, 0x34, 0x46, 0x33, 0x3f, + 0x36, 0x45, 0x3e, 0x35, 0x3f, 0x38, 0x3f, 0x3e, 0x3b, 0x3a, 0x36, 0x3b, + 0x36, 0x38, 0x32, 0x3f, 0x44, 0x3c, 0x35, 0x48, 0x38, 0x39, 0x31, 0x49, + 0x3d, 0x43, 0x36, 0x3f, 0x31, 0x43, 0x36, 0x3e, 0x3e, 0x41, 0x39, 0x3b, + 0x40, 0x42, 0x3c, 0x43, 0x36, 0x4a, 0x48, 0x67, 0x4e, 0x43, 0x36, 0x46, + 0x44, 0x3f, 0x4b, 0x4b, 0x3f, 0x38, 0x3c, 0x3c, 0x5e, 0x38, 0x70, 0x52, + 0x38, 0x32, 0x3b, 0x36, 0x4a, 0x2c, 0x52, 0x46, 0x29, 0x4f, 0x48, 0x42, + 0x2d, 0x2e, 0x4f, 0x28, 0x28, 0x45, 0x4d, 0x52, 0x42, 0x3e, 0x3f, 0x41, + 0x3c, 0x3a, 0x47, 0x50, 0x44, 0x45, 0x33, 0x4b, 0x3e, 0x3f, 0x42, 0x3d, + 0x43, 0x34, 0x27, 0x3f, 0x42, 0x3e, 0x43, 0x3e, 0x3a, 0x3c, 0x37, 0x3b, + 0x3f, 0x30, 0x3a, 0x3e, 0x3c, 0x34, 0x37, 0x24, 0x3d, 0x43, 0x40, 0x44, + 0x40, 0x46, 0x31, 0x2f, 0x43, 0x38, 0x38, 0x39, 0x3c, 0x34, 0x2d, 0x2a, + 0x38, 0x31, 0x43, 0x3b, 0x39, 0x3b, 0x32, 0x34, 0x3e, 0x39, 0x41, 0x3b, + 0x3e, 0x33, 0x3a, 0x2a, 0x41, 0x3f, 0x3c, 0x43, 0x3b, 0x3e, 0x35, 0x2c, + 0x38, 0x41, 0x33, 0x31, 0x3e, 0x3f, 0x3a, 0x3c, 0x3b, 0x35, 0x3f, 0x3d, + 0x42, 0x3a, 0x3c, 0x35, 0x3f, 0x40, 0x3c, 0x3e, 0x37, 0x41, 0x3d, 0x38, + 0x34, 0x31, 0x36, 0x3d, 0x3d, 0x47, 0x36, 0x44, 0x3f, 0x45, 0x3c, 0x3c, + 0x35, 0x36, 0x31, 0x4f, 0x46, 0x3a, 0x41, 0x42, 0x40, 0x32, 0x33, 0x41, + 0x34, 0x40, 0x3d, 0x43, 0x3b, 0x3a, 0x32, 0x3c, 0x42, 0x42, 0x3d, 0x43, + 0x37, 0x45, 0x45, 0xff, 0x4b, 0x45, 0x3b, 0x40, 0x43, 0x3e, 0x47, 0x49, + 0x3d, 0x3b, 0x3e, 0x33, 0x58, 0x35, 0x71, 0x54, 0x2f, 0x38, 0x38, 0x33, + 0x47, 0x35, 0x5b, 0x46, 0x2c, 0x4c, 0x43, 0x37, 0x36, 0x39, 0x4f, 0x30, + 0x26, 0x48, 0x51, 0x48, 0x46, 0x45, 0x3b, 0x39, 0x42, 0x50, 0x47, 0x4c, + 0x4b, 0x3b, 0x3d, 0x4d, 0x41, 0x34, 0x40, 0x44, 0x38, 0x32, 0x2d, 0x43, + 0x39, 0x36, 0x3b, 0x3b, 0x40, 0x3d, 0x37, 0x3c, 0x44, 0x39, 0x42, 0x37, + 0x38, 0x38, 0x32, 0x2f, 0x41, 0x40, 0x3f, 0x3a, 0x37, 0x35, 0x3b, 0x2a, + 0x37, 0x30, 0x3c, 0x37, 0x40, 0x38, 0x3a, 0x27, 0x44, 0x3d, 0x43, 0x40, + 0x35, 0x3f, 0x3e, 0x32, 0x3e, 0x3c, 0x40, 0x39, 0x39, 0x3a, 0x41, 0x31, + 0x3b, 0x3f, 0x34, 0x43, 0x3a, 0x38, 0x42, 0x2a, 0x47, 0x46, 0x3b, 0x38, + 0x47, 0x45, 0x39, 0x31, 0x43, 0x40, 0x37, 0x3a, 0x3d, 0x3e, 0x39, 0x30, + 0x36, 0x37, 0x3a, 0x43, 0x3f, 0x32, 0x31, 0x41, 0x45, 0x3e, 0x43, 0x38, + 0x3f, 0x37, 0x3c, 0x49, 0x3b, 0x33, 0x3d, 0x3a, 0x37, 0x44, 0x32, 0x50, + 0x39, 0x44, 0x3e, 0x3f, 0x3d, 0x41, 0x3e, 0x3e, 0x42, 0x44, 0x45, 0x3f, + 0x36, 0x3f, 0x37, 0x39, 0x3b, 0x3d, 0x3b, 0x3b, 0x2f, 0x46, 0x40, 0x6d, + 0x50, 0x45, 0x3b, 0x45, 0x46, 0x3b, 0x42, 0x48, 0x42, 0x3c, 0x39, 0x37, + 0x57, 0x3b, 0x6c, 0x5b, 0x32, 0x35, 0x3d, 0x39, 0x48, 0x31, 0x5c, 0x46, + 0x29, 0x4c, 0x3f, 0x3e, 0x37, 0x33, 0x58, 0x32, 0x2a, 0x43, 0x4c, 0x50, + 0x3b, 0x44, 0x3c, 0x41, 0x39, 0x48, 0x55, 0x4c, 0x42, 0x38, 0x3b, 0x51, + 0x3f, 0x38, 0x44, 0x46, 0x36, 0x3b, 0x38, 0x4a, 0x3f, 0x37, 0x36, 0x3c, + 0x31, 0x3d, 0x32, 0x39, 0x3b, 0x3f, 0x3e, 0x35, 0x38, 0x3f, 0x34, 0x2b, + 0x37, 0x36, 0x39, 0x40, 0x37, 0x41, 0x32, 0x27, 0x36, 0x33, 0x40, 0x3a, + 0x3f, 0x44, 0x3f, 0x25, 0x38, 0x34, 0x42, 0x3c, 0x3a, 0x40, 0x38, 0x31, + 0x49, 0x3e, 0x33, 0x3d, 0x31, 0x36, 0x39, 0x2b, 0x44, 0x2f, 0x43, 0x34, + 0x34, 0x37, 0x39, 0x33, 0x3b, 0x34, 0x42, 0x3c, 0x40, 0x45, 0x36, 0x31, + 0x43, 0x47, 0x3e, 0x3f, 0x40, 0x3a, 0x33, 0x34, 0x41, 0x44, 0x3a, 0x43, + 0x3e, 0x38, 0x36, 0x31, 0x42, 0x44, 0x40, 0x41, 0x44, 0x43, 0x33, 0x42, + 0x3d, 0x41, 0x3d, 0x3e, 0x3c, 0x39, 0x3e, 0x4f, 0x3f, 0x37, 0x31, 0x40, + 0x3b, 0x38, 0x35, 0x3b, 0x44, 0x41, 0x41, 0x37, 0x40, 0x42, 0x2d, 0x3d, + 0x39, 0x48, 0x44, 0x3e, 0x34, 0x48, 0x49, 0x6d, 0x45, 0x4b, 0x3a, 0x44, + 0x49, 0x40, 0x4d, 0x51, 0x3f, 0x34, 0x3b, 0x40, 0x52, 0x34, 0x6f, 0x56, + 0x33, 0x3e, 0x40, 0x39, 0x41, 0x32, 0x5d, 0x45, 0x2e, 0x51, 0x48, 0x3c, + 0x2e, 0x2e, 0x51, 0x39, 0x32, 0x45, 0x4a, 0x4c, 0x3b, 0x40, 0x40, 0x3b, + 0x36, 0x41, 0x54, 0x4e, 0x4a, 0x49, 0x3b, 0x4d, 0x3c, 0x41, 0x38, 0x47, + 0x3d, 0x3c, 0x37, 0x48, 0x3f, 0x42, 0x3e, 0x36, 0x39, 0x46, 0x37, 0x3e, + 0x3b, 0x38, 0x40, 0x3b, 0x39, 0x32, 0x3e, 0x29, 0x37, 0x35, 0x3c, 0x3d, + 0x37, 0x3b, 0x35, 0x2f, 0x32, 0x3b, 0x37, 0x3c, 0x40, 0x3e, 0x39, 0x27, + 0x3b, 0x38, 0x37, 0x36, 0x39, 0x37, 0x37, 0x35, 0x42, 0x3e, 0x3b, 0x43, + 0x41, 0x3c, 0x37, 0x2a, 0x3a, 0x3e, 0x38, 0x40, 0x36, 0x3e, 0x44, 0x2e, + 0x3e, 0x3a, 0x37, 0x3b, 0x3e, 0x41, 0x3d, 0x30, 0x3b, 0x3f, 0x41, 0x45, + 0x3a, 0x48, 0x37, 0x2f, 0x3a, 0x37, 0x34, 0x43, 0x42, 0x3d, 0x38, 0x41, + 0x3b, 0x3c, 0x39, 0x3c, 0x39, 0x47, 0x2e, 0x41, 0x42, 0x40, 0x32, 0x36, + 0x43, 0x40, 0x3d, 0x4c, 0x38, 0x3e, 0x3b, 0x41, 0x3d, 0x3b, 0x34, 0x43, + 0x43, 0x3f, 0x44, 0x3c, 0x3a, 0x33, 0x39, 0x42, 0x43, 0x3f, 0x33, 0x3d, + 0x33, 0x3e, 0x48, 0x6b, 0x48, 0x43, 0x36, 0x47, 0x49, 0x44, 0x4a, 0x49, + 0x3c, 0x31, 0x35, 0x3e, 0x5c, 0x34, 0x73, 0x53, 0x33, 0x3c, 0x32, 0x3b, + 0x43, 0x27, 0x59, 0x4e, 0x2b, 0x51, 0x4f, 0x37, 0x36, 0x34, 0x56, 0x34, + 0x32, 0x4f, 0x46, 0x50, 0x40, 0x40, 0x3c, 0x3e, 0x34, 0x37, 0x50, 0x49, + 0x43, 0x47, 0x3e, 0x52, 0x44, 0x38, 0x3b, 0x4f, 0x3a, 0x3d, 0x2b, 0x4c, + 0x40, 0x38, 0x3a, 0x35, 0x3a, 0x3a, 0x3d, 0x38, 0x3d, 0x3b, 0x37, 0x48, + 0x3d, 0x3d, 0x32, 0x30, 0x3a, 0x34, 0x3f, 0x3a, 0x3b, 0x3e, 0x35, 0x2f, + 0x3b, 0x3a, 0x45, 0x3d, 0x42, 0x33, 0x33, 0x24, 0x44, 0x39, 0x3c, 0x3d, + 0x41, 0x3c, 0x37, 0x2c, 0x3b, 0x36, 0x34, 0x41, 0x3d, 0x3f, 0x39, 0x32, + 0x3c, 0x40, 0x44, 0x3d, 0x41, 0x3d, 0x3a, 0x29, 0x3e, 0x3e, 0x43, 0x33, + 0x3f, 0x3e, 0x3e, 0x31, 0x38, 0x3a, 0x34, 0x3d, 0x3f, 0x3e, 0x3a, 0x3d, + 0x3e, 0x48, 0x45, 0x3d, 0x44, 0x37, 0x33, 0x3d, 0x45, 0x39, 0x40, 0x40, + 0x42, 0x3f, 0x3f, 0x3d, 0x3a, 0x3b, 0x41, 0x33, 0x41, 0x3c, 0x32, 0x55, + 0x43, 0x3a, 0x32, 0x40, 0x3c, 0x3e, 0x40, 0x43, 0x37, 0x3f, 0x40, 0x38, + 0x43, 0x41, 0x36, 0x42, 0x44, 0x3c, 0x32, 0x3f, 0x38, 0x42, 0x46, 0x59, + 0x4c, 0x41, 0x39, 0x47, 0x46, 0x46, 0x44, 0x44, 0x35, 0x42, 0x32, 0x39, + 0x4f, 0x34, 0x6d, 0x55, 0x31, 0x3b, 0x3a, 0x3f, 0x44, 0x2c, 0x5d, 0x43, + 0x26, 0x4a, 0x4f, 0x40, 0x36, 0x32, 0x4d, 0x33, 0x2f, 0x50, 0x4d, 0x57, + 0x3b, 0x40, 0x42, 0x44, 0x41, 0x3f, 0x52, 0x4e, 0x35, 0x41, 0x44, 0x52, + 0x40, 0x35, 0x39, 0x4b, 0x45, 0x34, 0x2c, 0x4a, 0x3b, 0x41, 0x31, 0x33, + 0x3f, 0x3a, 0x36, 0x3c, 0x3c, 0x33, 0x30, 0x38, 0x43, 0x3f, 0x32, 0x2d, + 0x3f, 0x3a, 0x38, 0x41, 0x39, 0x45, 0x36, 0x2e, 0x3c, 0x38, 0x45, 0x3f, + 0x40, 0x3f, 0x3e, 0x26, 0x41, 0x37, 0x3c, 0x44, 0x3f, 0x3f, 0x35, 0x37, + 0x46, 0x34, 0x37, 0x3e, 0x48, 0x38, 0x36, 0x34, 0x33, 0x39, 0x40, 0x3c, + 0x42, 0x3d, 0x3b, 0x31, 0x38, 0x3b, 0x44, 0x42, 0x45, 0x38, 0x41, 0x30, + 0x3d, 0x42, 0x36, 0x3f, 0x3b, 0x45, 0x37, 0x32, 0x3c, 0x37, 0x3d, 0x42, + 0x38, 0x3d, 0x2f, 0x31, 0x39, 0x40, 0x3f, 0x44, 0x3a, 0x41, 0x44, 0x46, + 0x3d, 0x3a, 0x32, 0x3b, 0x34, 0x47, 0x36, 0x4c, 0x47, 0x35, 0x3c, 0x33, + 0x3b, 0x3c, 0x30, 0x43, 0x43, 0x3f, 0x31, 0x40, 0x3a, 0x37, 0x30, 0x46, + 0x39, 0x3b, 0x42, 0x40, 0x2d, 0x3f, 0x3e, 0x6a, 0x50, 0x3b, 0x31, 0x54, + 0x47, 0x3d, 0x48, 0x4e, 0x3b, 0x41, 0x3a, 0x39, 0x49, 0x36, 0x64, 0x4e, + 0x32, 0x39, 0x3d, 0x37, 0x42, 0x2c, 0x5c, 0x43, 0x2a, 0x4b, 0x4b, 0x46, + 0x30, 0x29, 0x52, 0x31, 0x35, 0x44, 0x4a, 0x4b, 0x3d, 0x3b, 0x4e, 0x42, + 0x3d, 0x39, 0x42, 0x52, 0x3f, 0x36, 0x3e, 0x50, 0x3f, 0x32, 0x35, 0x3a, + 0x40, 0x39, 0x35, 0x48, 0x3b, 0x3e, 0x41, 0x43, 0x43, 0x45, 0x2f, 0x36, + 0x38, 0x34, 0x3f, 0x44, 0x32, 0x3f, 0x37, 0x33, 0x33, 0x35, 0x2e, 0x41, + 0x37, 0x3e, 0x38, 0x28, 0x49, 0x30, 0x46, 0x39, 0x3b, 0x30, 0x38, 0x28, + 0x3b, 0x3d, 0x3a, 0x43, 0x3f, 0x34, 0x43, 0x36, 0x39, 0x3c, 0x3e, 0x3e, + 0x39, 0x3b, 0x39, 0x32, 0x3c, 0x36, 0x3e, 0x38, 0x34, 0x3c, 0x3a, 0x2a, + 0x46, 0x3d, 0x40, 0x37, 0x3b, 0x39, 0x3b, 0x34, 0x38, 0x31, 0x43, 0x46, + 0x3b, 0x43, 0x39, 0x2b, 0x38, 0x40, 0x3e, 0x39, 0x35, 0x3d, 0x2c, 0x36, + 0x37, 0x40, 0x36, 0x40, 0x41, 0x38, 0x32, 0x3f, 0x36, 0x46, 0x34, 0x31, + 0x40, 0x3e, 0x3c, 0x4e, 0x42, 0x3d, 0x36, 0x3f, 0x42, 0x3f, 0x33, 0x40, + 0x34, 0x37, 0x3c, 0x3b, 0x31, 0x47, 0x32, 0x3c, 0x34, 0x3d, 0x42, 0x3b, + 0x37, 0x41, 0x3b, 0x64, 0x52, 0x40, 0x36, 0x4e, 0x46, 0x3f, 0x3f, 0x47, + 0x3c, 0x3a, 0x3a, 0x41, 0x4a, 0x32, 0x5e, 0x50, 0x2d, 0x39, 0x3a, 0x38, + 0x3d, 0x2c, 0x5a, 0x3e, 0x2e, 0x47, 0x3e, 0x3e, 0x33, 0x29, 0x4c, 0x35, + 0x30, 0x4d, 0x4d, 0x4d, 0x38, 0x42, 0x51, 0x47, 0x39, 0x3c, 0x43, 0x4b, + 0x42, 0x3f, 0x3a, 0x4b, 0x44, 0x3f, 0x3a, 0x44, 0x3e, 0x37, 0x30, 0x45, + 0x3d, 0x36, 0x34, 0x3f, 0x36, 0x35, 0x37, 0x36, 0x43, 0x3b, 0x37, 0x3e, + 0x35, 0x3e, 0x32, 0x34, 0x32, 0x38, 0x3c, 0x3a, 0x3a, 0x3c, 0x30, 0x2b, + 0x31, 0x37, 0x30, 0x42, 0x36, 0x37, 0x36, 0x2c, 0x3c, 0x31, 0x41, 0x37, + 0x44, 0x41, 0x3b, 0x37, 0x41, 0x3f, 0x38, 0x3b, 0x3a, 0x3a, 0x3c, 0x2f, + 0x47, 0x41, 0x3e, 0x33, 0x42, 0x3a, 0x32, 0x34, 0x44, 0x40, 0x43, 0x3d, + 0x34, 0x41, 0x38, 0x35, 0x35, 0x3b, 0x45, 0x38, 0x32, 0x37, 0x3c, 0x2e, + 0x39, 0x40, 0x30, 0x3e, 0x42, 0x35, 0x3d, 0x36, 0x3e, 0x3d, 0x39, 0x46, + 0x3f, 0x36, 0x37, 0x49, 0x41, 0x39, 0x3d, 0x3d, 0x33, 0x44, 0x42, 0x50, + 0x3d, 0x3c, 0x3e, 0x3f, 0x42, 0x42, 0x3b, 0x3d, 0x41, 0x31, 0x39, 0x3a, + 0x44, 0x34, 0x38, 0x47, 0x44, 0x38, 0x3b, 0x42, 0x30, 0x42, 0x44, 0x57, + 0x49, 0x3a, 0x39, 0x4f, 0x41, 0x3e, 0x40, 0x43, 0x37, 0x42, 0x3b, 0x48, + 0x50, 0x29, 0x5b, 0x44, 0x2c, 0x40, 0x3f, 0x3c, 0x46, 0x34, 0x5c, 0x41, + 0x2c, 0x48, 0x46, 0x46, 0x35, 0x32, 0x4c, 0x35, 0x2f, 0x3b, 0x48, 0x44, + 0x41, 0x41, 0x49, 0x45, 0x34, 0x37, 0x44, 0x45, 0x43, 0x3b, 0x42, 0x44, + 0x3a, 0x37, 0x48, 0x49, 0x34, 0x39, 0x33, 0x4a, 0x40, 0x3d, 0x33, 0x39, + 0x39, 0x3b, 0x30, 0x31, 0x3d, 0x47, 0x3c, 0x3a, 0x34, 0x3c, 0x3a, 0x2b, + 0x3a, 0x34, 0x41, 0x40, 0x42, 0x36, 0x44, 0x2c, 0x40, 0x47, 0x3b, 0x37, + 0x38, 0x42, 0x44, 0x29, 0x36, 0x3d, 0x3d, 0x36, 0x42, 0x3b, 0x35, 0x36, + 0x43, 0x39, 0x41, 0x3d, 0x45, 0x41, 0x31, 0x32, 0x40, 0x3d, 0x3c, 0x41, + 0x3e, 0x3d, 0x35, 0x34, 0x32, 0x38, 0x36, 0x3f, 0x3b, 0x3d, 0x39, 0x36, + 0x40, 0x3e, 0x3d, 0x3a, 0x3a, 0x3b, 0x3c, 0x32, 0x40, 0x34, 0x3a, 0x36, + 0x42, 0x47, 0x3e, 0x33, 0x3a, 0x44, 0x30, 0x39, 0x40, 0x3a, 0x36, 0x44, + 0x3c, 0x3b, 0x3f, 0x33, 0x3e, 0x3c, 0x35, 0x53, 0x43, 0x3c, 0x3f, 0x43, + 0x3d, 0x44, 0x33, 0x47, 0x42, 0x40, 0x37, 0x3b, 0x43, 0x3f, 0x33, 0x41, + 0x38, 0x42, 0x44, 0x3d, 0x2d, 0x3f, 0x46, 0x49, 0x4e, 0x3f, 0x36, 0x45, + 0x45, 0x39, 0x40, 0x42, 0x39, 0x39, 0x3a, 0x42, 0x45, 0x2c, 0x61, 0x44, + 0x30, 0x45, 0x38, 0x3a, 0x40, 0x37, 0x58, 0x39, 0x31, 0x3e, 0x3a, 0x3e, + 0x37, 0x32, 0x4a, 0x39, 0x2e, 0x47, 0x3e, 0x4e, 0x3f, 0x3e, 0x48, 0x45, + 0x3f, 0x48, 0x3a, 0x3f, 0x40, 0x36, 0x3a, 0x44, 0x36, 0x3e, 0x3d, 0x41, + 0x45, 0x36, 0x36, 0x4b, 0x3a, 0x3d, 0x45, 0x48, 0x38, 0x45, 0x39, 0x38, + 0x38, 0x3a, 0x42, 0x34, 0x3f, 0x34, 0x39, 0x34, 0x32, 0x3f, 0x3c, 0x3d, + 0x3d, 0x47, 0x3a, 0x2f, 0x3c, 0x3e, 0x3f, 0x39, 0x35, 0x42, 0x3c, 0x2a, + 0x3b, 0x35, 0x42, 0x44, 0x46, 0x39, 0x38, 0x39, 0x43, 0x3a, 0x38, 0x42, + 0x3d, 0x3a, 0x40, 0x35, 0x34, 0x39, 0x3a, 0x38, 0x43, 0x42, 0x42, 0x2d, + 0x31, 0x3b, 0x33, 0x40, 0x3b, 0x47, 0x35, 0x30, 0x3a, 0x3c, 0x3b, 0x47, + 0x3a, 0x3c, 0x38, 0x35, 0x3c, 0x35, 0x3e, 0x3e, 0x39, 0x3d, 0x39, 0x40, + 0x37, 0x33, 0x49, 0x38, 0x3c, 0x43, 0x34, 0x40, 0x39, 0x42, 0x3c, 0x3b, + 0x3e, 0x45, 0x3e, 0x51, 0x3d, 0x3f, 0x3b, 0x34, 0x37, 0x3c, 0x40, 0x47, + 0x3c, 0x41, 0x3f, 0x41, 0x37, 0x3e, 0x36, 0x3c, 0x42, 0x40, 0x3f, 0x3a, + 0x3b, 0x42, 0x44, 0x4b, 0x4b, 0x37, 0x41, 0x4d, 0x41, 0x45, 0x40, 0x41, + 0x40, 0x38, 0x37, 0x40, 0x42, 0x2c, 0x57, 0x43, 0x2d, 0x49, 0x3a, 0x3e, + 0x37, 0x2f, 0x52, 0x37, 0x31, 0x42, 0x3b, 0x3f, 0x39, 0x38, 0x48, 0x3c, + 0x37, 0x3d, 0x3a, 0x39, 0x3a, 0x45, 0x4b, 0x49, 0x3e, 0x44, 0x48, 0x49, + 0x3d, 0x39, 0x3c, 0x41, 0x41, 0x38, 0x45, 0x38, 0x33, 0x3d, 0x37, 0x47, + 0x34, 0x3f, 0x3b, 0x3d, 0x39, 0x34, 0x30, 0x39, 0x44, 0x36, 0x34, 0x3c, + 0x37, 0x38, 0x45, 0x34, 0x40, 0x33, 0x41, 0x3a, 0x3e, 0x3c, 0x3b, 0x3a, + 0x40, 0x3f, 0x3b, 0x3d, 0x3b, 0x46, 0x41, 0x2a, 0x3a, 0x3c, 0x42, 0x46, + 0x33, 0x3f, 0x2d, 0x3a, 0x45, 0x45, 0x38, 0x3b, 0x44, 0x34, 0x35, 0x3f, + 0x34, 0x43, 0x38, 0x3e, 0x41, 0x3b, 0x42, 0x38, 0x3d, 0x3f, 0x38, 0x45, + 0x3b, 0x35, 0x39, 0x3c, 0x43, 0x43, 0x38, 0x34, 0x44, 0x43, 0x2e, 0x39, + 0x39, 0x40, 0x39, 0x41, 0x41, 0x34, 0x3e, 0x44, 0x3d, 0x43, 0x3a, 0x3a, + 0x3b, 0x3b, 0x36, 0x45, 0x3c, 0x43, 0x3d, 0x48, 0x36, 0x36, 0x39, 0x55, + 0x35, 0x40, 0x3e, 0x49, 0x40, 0x3a, 0x3d, 0x3d, 0x34, 0x47, 0x40, 0x41, + 0x40, 0x47, 0x39, 0x3e, 0x3b, 0x38, 0x3c, 0x3a, 0x35, 0x3e, 0x41, 0x4a, + 0x4b, 0x3f, 0x36, 0x3d, 0x40, 0x3c, 0x39, 0x32, 0x33, 0x36, 0x30, 0x42, + 0x42, 0x36, 0x54, 0x48, 0x2e, 0x4c, 0x34, 0x3c, 0x39, 0x36, 0x4e, 0x37, + 0x2f, 0x3e, 0x30, 0x3d, 0x36, 0x3b, 0x45, 0x36, 0x37, 0x3e, 0x41, 0x4b, + 0x3b, 0x36, 0x45, 0x3b, 0x38, 0x45, 0x3e, 0x43, 0x48, 0x46, 0x44, 0x44, + 0x3e, 0x3b, 0x37, 0x3b, 0x3a, 0x3f, 0x3d, 0x44, 0x39, 0x38, 0x45, 0x43, + 0x3d, 0x35, 0x39, 0x2c, 0x44, 0x41, 0x36, 0x40, 0x3d, 0x39, 0x3d, 0x2f, + 0x3d, 0x39, 0x42, 0x3d, 0x36, 0x46, 0x43, 0x2c, 0x41, 0x3a, 0x30, 0x45, + 0x3f, 0x41, 0x35, 0x2b, 0x3b, 0x38, 0x3a, 0x44, 0x32, 0x32, 0x39, 0x3c, + 0x3a, 0x3a, 0x3c, 0x3a, 0x35, 0x40, 0x3b, 0x31, 0x36, 0x33, 0x35, 0x34, + 0x3c, 0x3b, 0x3d, 0x36, 0x48, 0x3b, 0x3f, 0x42, 0x3e, 0x33, 0x2f, 0x3a, + 0x49, 0x41, 0x39, 0x3e, 0x3c, 0x44, 0x3c, 0x39, 0x33, 0x39, 0x36, 0x35, + 0x3d, 0x42, 0x34, 0x3e, 0x38, 0x45, 0x40, 0x45, 0x3d, 0x48, 0x42, 0x4a, + 0x3f, 0x45, 0x38, 0x42, 0x44, 0x40, 0x34, 0x49, 0x44, 0x3d, 0x3a, 0x39, + 0x3e, 0x3a, 0x42, 0x3e, 0x48, 0x42, 0x3e, 0x3a, 0x3f, 0x3f, 0x32, 0x3b, + 0x38, 0x41, 0x3c, 0x39, 0x33, 0x45, 0x44, 0x3c, 0x48, 0x41, 0x41, 0x3d, + 0x3a, 0x3c, 0x37, 0x33, 0x41, 0x3f, 0x38, 0x3a, 0x3f, 0x37, 0x51, 0x3c, + 0x37, 0x3a, 0x43, 0x37, 0x40, 0x31, 0x4f, 0x34, 0x3b, 0x44, 0x45, 0x39, + 0x40, 0x33, 0x49, 0x33, 0x3e, 0x35, 0x44, 0x3d, 0x3b, 0x3f, 0x43, 0x41, + 0x43, 0x43, 0x48, 0x44, 0x46, 0x3b, 0x43, 0x3f, 0x3c, 0x3f, 0x3e, 0x3d, + 0x3b, 0x41, 0x3c, 0x43, 0x30, 0x34, 0x39, 0x33, 0x3f, 0x38, 0x36, 0x2e, + 0x33, 0x3f, 0x3c, 0x40, 0x3d, 0x3b, 0x3b, 0x31, 0x36, 0x41, 0x3b, 0x38, + 0x46, 0x36, 0x34, 0x31, 0x42, 0x44, 0x33, 0x35, 0x3f, 0x36, 0x3c, 0x30, + 0x3f, 0x31, 0x39, 0x3e, 0x3f, 0x47, 0x3e, 0x34, 0x36, 0x36, 0x34, 0x39, + 0x37, 0x46, 0x40, 0x33, 0x3b, 0x3a, 0x3f, 0x41, 0x37, 0x44, 0x3a, 0x3f, + 0x34, 0x45, 0x37, 0x33, 0x3f, 0x47, 0x41, 0x36, 0x39, 0x3e, 0x40, 0x38, + 0x41, 0x3d, 0x3d, 0x36, 0x40, 0x3a, 0x3b, 0x3b, 0x41, 0x3b, 0x3a, 0x3f, + 0x3f, 0x3b, 0x35, 0x42, 0x46, 0x3a, 0x30, 0x45, 0x40, 0x37, 0x39, 0x39, + 0x3d, 0x38, 0x3f, 0x45, 0x3f, 0x31, 0x32, 0x3b, 0x35, 0x3e, 0x3b, 0x38, + 0x3b, 0x44, 0x37, 0x39, 0x37, 0x42, 0x3f, 0x44, 0x38, 0x36, 0x37, 0x44, + 0x45, 0x46, 0x41, 0x3b, 0x46, 0x42, 0x43, 0x43, 0x3a, 0x4b, 0x37, 0x35, + 0x3b, 0x40, 0x32, 0x38, 0x41, 0x38, 0x4f, 0x3e, 0x36, 0x3f, 0x47, 0x3b, + 0x47, 0x3b, 0x4a, 0x2e, 0x3d, 0x45, 0x3b, 0x46, 0x3e, 0x38, 0x43, 0x38, + 0x41, 0x48, 0x3a, 0x39, 0x40, 0x45, 0x3b, 0x43, 0x40, 0x3e, 0x43, 0x41, + 0x41, 0x3e, 0x39, 0x3f, 0x35, 0x42, 0x33, 0x3f, 0x3d, 0x32, 0x45, 0x3c, + 0x41, 0x31, 0x45, 0x38, 0x43, 0x45, 0x41, 0x35, 0x35, 0x40, 0x44, 0x36, + 0x3a, 0x3b, 0x3c, 0x2c, 0x3e, 0x41, 0x33, 0x3d, 0x46, 0x34, 0x3b, 0x30, + 0x30, 0x42, 0x43, 0x3d, 0x3d, 0x3d, 0x43, 0x31, 0x3f, 0x40, 0x3a, 0x3f, + 0x48, 0x3e, 0x3b, 0x39, 0x44, 0x43, 0x3b, 0x3a, 0x42, 0x38, 0x38, 0x3b, + 0x3f, 0x44, 0x37, 0x3e, 0x45, 0x40, 0x41, 0x3b, 0x3c, 0x3a, 0x38, 0x37, + 0x3b, 0x33, 0x3f, 0x35, 0x43, 0x3d, 0x33, 0x41, 0x3b, 0x46, 0x39, 0x32, + 0x39, 0x3f, 0x3b, 0x39, 0x47, 0x3c, 0x3f, 0x39, 0x34, 0x3d, 0x3c, 0x46, + 0x3f, 0x3e, 0x3e, 0x44, 0x34, 0x40, 0x3f, 0x39, 0x3c, 0x38, 0x36, 0x45, + 0x42, 0x46, 0x3b, 0x44, 0x3a, 0x3d, 0x3b, 0x42, 0x3b, 0x3b, 0x3c, 0x45, + 0x42, 0x3d, 0x36, 0x37, 0x3d, 0x43, 0x3f, 0x48, 0xa6, 0xfb, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, + 0x39, 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x68, 0xfb, 0xff, 0xff, 0xbc, 0xfc, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x70, 0x02, 0x00, 0x00, + 0x70, 0x03, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, + 0xa4, 0x02, 0x00, 0x00, 0xba, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, + 0x24, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x6d, 0x61, 0x78, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x3c, 0xfd, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x3b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xfd, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x61, 0x64, 0x64, 0x5f, 0x31, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa4, 0xfd, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x97, 0xf5, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x87, 0x35, 0xa0, 0x43, 0x01, 0x00, 0x00, 0x00, + 0xd6, 0xd7, 0x28, 0xc3, 0x92, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, + 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x52, 0x65, 0x6c, 0x75, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x19, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x14, 0xfe, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x05, 0x80, 0xbf, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x85, 0xc0, 0xbe, 0x43, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x03, 0x3c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x5f, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x2f, 0x46, 0x61, 0x6b, 0x65, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x57, + 0x69, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x56, 0x61, 0x72, + 0x73, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xa4, 0xfe, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x17, 0xac, 0x6e, 0x3a, 0x01, 0x00, 0x00, 0x00, + 0x20, 0x4e, 0x97, 0x3d, 0x01, 0x00, 0x00, 0x00, 0xaf, 0x27, 0x21, 0xbe, + 0x96, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, + 0x31, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x31, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x1c, 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x42, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x44, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xfc, 0xfe, 0xff, 0xff, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x17, 0xac, 0xee, 0x39, 0x5a, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x03, + 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x73, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x5f, 0x31, 0x2f, + 0x46, 0x61, 0x6b, 0x65, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, + 0x68, 0x4d, 0x69, 0x6e, 0x4d, 0x61, 0x78, 0x56, 0x61, 0x72, 0x73, 0x2f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x65, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x30, 0x11, 0x00, 0x00, + 0x0c, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x9d, 0xaf, 0xd0, 0x3a, 0x01, 0x00, 0x00, 0x00, + 0xe7, 0x29, 0x9e, 0x3e, 0x01, 0x00, 0x00, 0x00, 0x5b, 0x91, 0xc3, 0xbd, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x4d, 0x61, 0x74, 0x4d, + 0x75, 0x6c, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x1b, 0x1c, 0x3b, + 0x03, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x14, 0x00, 0x1c, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x18, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x1c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xfa, 0xff, 0xff, 0xff, 0x00, 0x19, 0x06, 0x00, + 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 +}; +const int g_model_len = 19800; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.h new file mode 100644 index 00000000..fecf8169 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/model.h @@ -0,0 +1,27 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This is a standard TensorFlow Lite FlatBuffer model file that has been +// converted into a C data array, so it can be easily compiled into a binary +// for devices that don't have a file system. It was created using the command: +// xxd -i model.tflite > model.cc + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_MODEL_H_ + +extern const unsigned char g_model[]; +extern const int g_model_len; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_MODEL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.cc new file mode 100644 index 00000000..1fe4dfae --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.cc @@ -0,0 +1,64 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.h" + +const uint8_t g_no_power_spectrum_data[g_no_power_spectrum_data_size] = { + 255, + 7, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.h new file mode 100644 index 00000000..fe3007e9 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.h @@ -0,0 +1,29 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was extracted from the larger feature data held in +// no_features_data.cc and consists of the 29th spectrogram slice of 43 values. +// This is the expected result of running the sample data in +// no_30ms_sample_data.cc through the preprocessing pipeline. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_NO_POWER_SPECTRUM_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_NO_POWER_SPECTRUM_DATA_H_ + +#include + +constexpr int g_no_power_spectrum_data_size = 43; +extern const uint8_t g_no_power_spectrum_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_NO_POWER_SPECTRUM_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.cc new file mode 100644 index 00000000..09123420 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.cc @@ -0,0 +1,2141 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.h" + +/* File automatically created by + * tensorflow/examples/speech_commands/wav_to_features.py \ + * --sample_rate=16000 \ + * --clip_duration_ms=1000 \ + * --window_size_ms=30 \ + * --window_stride_ms=20 \ + * --feature_bin_count=40 \ + * --quantize=1 \ + * --preprocess="average" \ + * --input_wav="speech_commands_test_set_v0.02/no/f9643d42_nohash_4.wav" \ + * --output_c_file="no_simple_features_data.cc" \ + */ + +const int g_no_simple_f9643d42_nohash_4_width = 43; +const int g_no_simple_f9643d42_nohash_4_height = 49; +const unsigned char g_no_simple_f9643d42_nohash_4_data[] = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 67, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 139, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 195, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 230, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 7, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 7, + 16, + 1, + 1, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 7, + 22, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 238, + 5, + 20, + 3, + 4, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 144, + 4, + 19, + 3, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 42, + 6, + 3, + 1, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 1, + 5, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5, + 1, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.h new file mode 100644 index 00000000..ea6075e7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/no_simple_features_data.h @@ -0,0 +1,23 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_NO_SIMPLE_FEATURES_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_NO_SIMPLE_FEATURES_DATA_H_ + +extern const int g_no_simple_f9643d42_nohash_4_width; +extern const int g_no_simple_f9643d42_nohash_4_height; +extern const unsigned char g_no_simple_f9643d42_nohash_4_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_NO_SIMPLE_FEATURES_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.cc new file mode 100644 index 00000000..1404e2ce --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.cc @@ -0,0 +1,153 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Reference implementation of the preprocessing pipeline, with the same +// results as the audio tutorial at +// https://www.tensorflow.org/tutorials/sequences/audio_recognition +// This module takes 30ms of PCM-encoded signed 16-bit audio samples (at 16KHz, +// so 480 values), and extracts a power spectrum of frequencies. There are 43 +// frequency bands in the result, derived from the original 256 output from the +// discrete Fourier transform, and averaged together in groups of 6. +// It's expected that most platforms will have optimized versions of the +// functions used here, for example replacing the DFT with an FFT, so this +// version shouldn't be used where performance is critical. + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h" + +#include + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h" + +namespace { + +// Needed because some platforms don't have M_PI defined. +constexpr float kPi = 3.14159265358979323846f; + +// Performs a discrete Fourier transform on the real inputs. This corresponds to +// rdft() in the FFT package at http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html, +// and to kiss_fftr() in KISSFFT at https://github.com/mborgerding/kissfft. +// It takes in an array of float real values, and returns a result of the same +// length with float real and imaginary components interleaved, so +// fourier_output[0] is the first real value, fourier_output[1] is the first +// imaginary, fourier_output[2] is the second real, and so on. +// The calling function should ensure that the array passed in as fourier_output +// is at least time_series_size in length. Most optimized FFT implementations +// require the length to be a power of two as well, but this version doesn't +// enforce that. +void CalculateDiscreteFourierTransform(float *time_series, int time_series_size, + float *fourier_output) +{ + for (int i = 0; i < time_series_size / 2; ++i) { + float real = 0; + for (int j = 0; j < time_series_size; ++j) { + real += time_series[j] * std::cos(j * i * kPi * 2 / time_series_size); + } + float imaginary = 0; + for (int j = 0; j < time_series_size; ++j) { + imaginary -= + time_series[j] * std::sin(j * i * kPi * 2 / time_series_size); + } + fourier_output[(i * 2) + 0] = real; + fourier_output[(i * 2) + 1] = imaginary; + } +} + +// Produces a simple sine curve that is used to ensure frequencies at the center +// of the current sample window are weighted more heavily than those at the end. +void CalculatePeriodicHann(int window_length, float *window_function) +{ + for (int i = 0; i < window_length; ++i) { + window_function[i] = 0.5f - 0.5f * std::cos((2 * kPi * i) / window_length); + } +} + +} // namespace + +TfLiteStatus GenerateSimpleFeatures(tflite::ErrorReporter *error_reporter, + const int16_t *input, int input_size, + int output_size, uint8_t *output) +{ + // Ensure our input and output data arrays are valid. + if (input_size > kMaxAudioSampleSize) { + TF_LITE_REPORT_ERROR(error_reporter, "Input size %d larger than %d", + input_size, kMaxAudioSampleSize); + return kTfLiteError; + } + if (output_size != kFeatureSliceSize) { + TF_LITE_REPORT_ERROR(error_reporter, + "Requested output size %d doesn't match %d", + output_size, kFeatureSliceSize); + return kTfLiteError; + } + + // Pre-calculate the window function we'll be applying to the input data. + // In a real application, we'd calculate this table once in an initialization + // function and store it for repeated reuse. + float window_function[kMaxAudioSampleSize]; + CalculatePeriodicHann(input_size, window_function); + + // Apply the window function to our time series input, and pad it with zeroes + // to the next power of two. + float float_input[kMaxAudioSampleSize]; + for (int i = 0; i < kMaxAudioSampleSize; ++i) { + if (i < input_size) { + float_input[i] = + (input[i] * window_function[i]) / static_cast(1 << 15); + } else { + float_input[i] = 0.0f; + } + } + + // Pull the frequency data from the time series sample. + float fourier_values[kMaxAudioSampleSize]; + CalculateDiscreteFourierTransform(float_input, kMaxAudioSampleSize, + fourier_values); + + // We have the complex numbers giving us information about each frequency + // band, but all we want to know is how strong each frequency is, so calculate + // the squared magnitude by adding together the squares of each component. + float power_spectrum[kMaxAudioSampleSize / 2]; + for (int i = 0; i < (kMaxAudioSampleSize / 2); ++i) { + const float real = fourier_values[(i * 2) + 0]; + const float imaginary = fourier_values[(i * 2) + 1]; + power_spectrum[i] = (real * real) + (imaginary * imaginary); + } + + // Finally, reduce the size of the output by averaging together six adjacent + // frequencies into each slot, producing an array of 43 values. + for (int i = 0; i < kFeatureSliceSize; ++i) { + float total = 0.0f; + for (int j = 0; j < kAverageWindowSize; ++j) { + const int index = (i * kAverageWindowSize) + j; + if (index < (kMaxAudioSampleSize / 2)) { + total += power_spectrum[index]; + } + } + const float average = total / kAverageWindowSize; + // Quantize the result into eight bits, effectively multiplying by two. + // The 127.5 constant here has to match the features_max value defined in + // tensorflow/examples/speech_commands/input_data.py, and this also assumes + // that features_min is zero. If it wasn't, we'd have to subtract it first. + int quantized_average = roundf(average * (255.0f / 127.5f)); + if (quantized_average < 0) { + quantized_average = 0; + } + if (quantized_average > 255) { + quantized_average = 255; + } + output[i] = quantized_average; + } + return kTfLiteOk; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h new file mode 100644 index 00000000..8f3a8228 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h @@ -0,0 +1,31 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_SIMPLE_FEATURES_GENERATOR_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_SIMPLE_FEATURES_GENERATOR_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Converts audio sample data into a more compact form that's appropriate for +// feeding into a neural network. There are reference implementations that use +// both floating point and fixed point available, but because the calculations +// involved can be time-consuming, it's recommended that you use or write +// specialized versions for your platform. +TfLiteStatus GenerateSimpleFeatures(tflite::ErrorReporter *error_reporter, + const int16_t *input, int input_size, + int output_size, uint8_t *output); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_SIMPLE_FEATURES_GENERATOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator_test.cc new file mode 100644 index 00000000..b3481743 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator_test.cc @@ -0,0 +1,65 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/simple_features_generator.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/micro_speech/no_30ms_sample_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/no_power_spectrum_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.h" +#include "tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestSimpleFeaturesGenerator) +{ + tflite::MicroErrorReporter micro_error_reporter; + + uint8_t yes_calculated_data[g_yes_power_spectrum_data_size]; + TfLiteStatus yes_status = GenerateSimpleFeatures( + µ_error_reporter, g_yes_30ms_sample_data, + g_yes_30ms_sample_data_size, g_yes_power_spectrum_data_size, + yes_calculated_data); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, yes_status); + + for (int i = 0; i < g_yes_power_spectrum_data_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_yes_power_spectrum_data[i], + yes_calculated_data[i]); + if (g_yes_power_spectrum_data[i] != yes_calculated_data[i]) { + TF_LITE_REPORT_ERROR( + µ_error_reporter, "Expected value %d but found %d", + g_yes_power_spectrum_data[i], yes_calculated_data[i]); + } + } + + uint8_t no_calculated_data[g_yes_power_spectrum_data_size]; + TfLiteStatus no_status = GenerateSimpleFeatures( + µ_error_reporter, g_no_30ms_sample_data, g_no_30ms_sample_data_size, + g_no_power_spectrum_data_size, no_calculated_data); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, no_status); + + for (int i = 0; i < g_no_power_spectrum_data_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(g_no_power_spectrum_data[i], no_calculated_data[i]); + if (g_no_power_spectrum_data[i] != no_calculated_data[i]) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Expected value %d but found %d", + g_no_power_spectrum_data[i], no_calculated_data[i]); + } + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.cc new file mode 100644 index 00000000..aadba1c5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.cc @@ -0,0 +1,23 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h" + +const char *kCategoryLabels[kCategoryCount] = { + "silence", + "unknown", + "yes", + "no", +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h new file mode 100644 index 00000000..53602de6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/simple_model_settings.h @@ -0,0 +1,43 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_SIMPLE_MODEL_SETTINGS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_SIMPLE_MODEL_SETTINGS_H_ + +// Keeping these as constant expressions allow us to allocate fixed-sized arrays +// on the stack for our working memory. + +// The size of the input time series data we pass to the FFT to produce the +// frequency information. This has to be a power of two, and since we're dealing +// with 30ms of 16KHz inputs, which means 480 samples, this is the next value. +constexpr int kMaxAudioSampleSize = 512; +constexpr int kAudioSampleFrequency = 16000; + +// All of these values are derived from the values used during model training, +// if you change your model you'll need to update these constants. +constexpr int kAverageWindowSize = 6; +constexpr int kFeatureSliceSize = + ((kMaxAudioSampleSize / 2) + (kAverageWindowSize - 1)) / kAverageWindowSize; +constexpr int kFeatureSliceCount = 49; +constexpr int kFeatureElementCount = (kFeatureSliceSize * kFeatureSliceCount); +constexpr int kFeatureSliceStrideMs = 20; +constexpr int kFeatureSliceDurationMs = 30; + +constexpr int kCategoryCount = 4; +constexpr int kSilenceIndex = 0; +constexpr int kUnknownIndex = 1; +extern const char *kCategoryLabels[kCategoryCount]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_SIMPLE_MODEL_SETTINGS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.cc new file mode 100644 index 00000000..4335c366 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.cc @@ -0,0 +1,64 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.h" + +const uint8_t g_yes_power_spectrum_data[g_yes_power_spectrum_data_size] = { + 8, + 89, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 13, + 1, + 6, + 23, + 20, + 6, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.h new file mode 100644 index 00000000..7fb3b7ee --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_power_spectrum_data.h @@ -0,0 +1,29 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was extracted from the larger feature data held in +// no_features_data.cc and consists of the 26th spectrogram slice of 43 values. +// This is the expected result of running the sample data in +// yes_30ms_sample_data.cc through the preprocessing pipeline. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_YES_POWER_SPECTRUM_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_YES_POWER_SPECTRUM_DATA_H_ + +#include + +constexpr int g_yes_power_spectrum_data_size = 43; +extern const uint8_t g_yes_power_spectrum_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_YES_POWER_SPECTRUM_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.cc new file mode 100644 index 00000000..0d2d640b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.cc @@ -0,0 +1,2141 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.h" + +/* File automatically created by + * tensorflow/examples/speech_commands/wav_to_features.py \ + * --sample_rate=16000 \ + * --clip_duration_ms=1000 \ + * --window_size_ms=30 \ + * --window_stride_ms=20 \ + * --feature_bin_count=40 \ + * --quantize=1 \ + * --preprocess="average" \ + * --input_wav="speech_commands_test_set_v0.02/yes/f2e59fea_nohash_1.wav" \ + * --output_c_file="yes_simple_features_data.cc" \ + */ + +const int g_yes_simple_f2e59fea_nohash_1_width = 43; +const int g_yes_simple_f2e59fea_nohash_1_height = 49; +const unsigned char g_yes_simple_f2e59fea_nohash_1_data[] = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 5, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 19, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 3, + 3, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8, + 89, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 13, + 1, + 6, + 23, + 20, + 6, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 19, + 177, + 42, + 1, + 1, + 0, + 0, + 0, + 0, + 2, + 3, + 119, + 51, + 5, + 139, + 92, + 58, + 58, + 15, + 2, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13, + 165, + 176, + 3, + 1, + 1, + 0, + 0, + 1, + 1, + 32, + 214, + 26, + 19, + 113, + 103, + 28, + 22, + 27, + 3, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, + 55, + 128, + 27, + 1, + 1, + 0, + 1, + 4, + 2, + 52, + 93, + 10, + 28, + 156, + 10, + 21, + 21, + 3, + 3, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14, + 99, + 32, + 65, + 7, + 1, + 2, + 2, + 6, + 13, + 121, + 36, + 15, + 11, + 112, + 125, + 14, + 5, + 13, + 4, + 4, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24, + 25, + 32, + 5, + 1, + 0, + 0, + 0, + 1, + 0, + 7, + 5, + 1, + 1, + 3, + 3, + 0, + 3, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13, + 13, + 5, + 1, + 0, + 0, + 0, + 0, + 0, + 3, + 4, + 1, + 0, + 1, + 2, + 3, + 1, + 1, + 1, + 4, + 8, + 1, + 2, + 1, + 3, + 1, + 1, + 0, + 1, + 1, + 3, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 8, + 2, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 1, + 1, + 2, + 0, + 2, + 1, + 0, + 2, + 0, + 2, + 2, + 3, + 1, + 1, + 0, + 1, + 1, + 4, + 5, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 1, + 2, + 1, + 0, + 1, + 3, + 1, + 1, + 3, + 1, + 1, + 6, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 2, + 6, + 2, + 4, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 2, + 1, + 1, + 2, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 1, + 0, + 0, + 2, + 3, + 5, + 2, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 2, + 3, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.h new file mode 100644 index 00000000..2d2cb559 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/simple_features/yes_simple_features_data.h @@ -0,0 +1,23 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_YES_SIMPLE_FEATURES_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_YES_SIMPLE_FEATURES_DATA_H_ + +extern const int g_yes_simple_f2e59fea_nohash_1_width; +extern const int g_yes_simple_f2e59fea_nohash_1_height; +extern const unsigned char g_yes_simple_f2e59fea_nohash_1_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_SIMPLE_FEATURES_YES_SIMPLE_FEATURES_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/README.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/README.md new file mode 100644 index 00000000..2ffe3e26 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/README.md @@ -0,0 +1,207 @@ + +# Micro Speech Training + +This example shows how to train a 20 kB model that can recognize 2 keywords, +"yes" and "no", from speech data. + +If the input does not belong to either categories, it is classified as "unknown" +and if the input is silent, it is classified as "silence". + +You can retrain it to recognize any combination of words (2 or more) from this +list: + +``` +yes +no +up +down +left +right +on +off +stop +go +``` + +The scripts used in training the model have been sourced from the +[Simple Audio Recognition](https://www.tensorflow.org/tutorials/audio/simple_audio) +tutorial. + +## Table of contents + +- [Overview](#overview) +- [Training](#training) +- [Trained Models](#trained-models) +- [Model Architecture](#model-architecture) +- [Dataset](#dataset) +- [Preprocessing Speech Input](#preprocessing-speech-input) +- [Other Training Methods](#other-training-methods) + +## Overview + +1. Dataset: Speech Commands, Version 2. + ([Download Link](https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz), + [Paper](https://arxiv.org/abs/1804.03209)) +2. Dataset Type: **Speech** +3. Deep Learning Framework: **TensorFlow 1.5** +4. Language: **Python 3.7** +5. Model Size: **<20 kB** +6. Model Category: **Multiclass Classification** + +## Training + +Train the model in the cloud using Google Colaboratory or locally using a +Jupyter Notebook. + + + + +
+ Google Colaboratory + + Jupyter Notebook +
+ +*Estimated Training Time: ~2 Hours.* + +For more options, refer to the [Other Training Methods](#other-training-methods) +section. + +## Trained Models + +| Download Link | [speech_commands.zip](https://storage.googleapis.com/download.tensorflow.org/models/tflite/micro/micro_speech_2020_04_13.zip) | +| ------------- |-------------| + +The `models` directory in the above zip file can be generated by following the +instructions in the [Training](#training) section above. It +includes the following 3 model files: + +| Name | Format | Target Framework | Target Device | +| :------------- | :----------- | :--------------- | :------------------------ | +| `model.pb` | Frozen | TensorFlow | Large-Scale/Cloud/Servers | +: : GraphDef : : : +| `model.tflite` | Fully | TensorFlow Lite | Mobile Devices | +: *(<20 kB)* : Quantized* : : : +: : TFLite Model : : : +| `model.cc` | C Source | TensorFlow Lite | Microcontrollers | +: : File : for : : +: : : Microcontrollers : : + +**Fully quantized implies that the model is **strictly int8** quantized +**including** the input(s) and output(s).* + + +## Model Architecture + +This is a simple model comprising of a Convolutional 2D layer, a Fully Connected +Layer or a MatMul Layer (output: logits) and a Softmax layer +(output: probabilities) as shown below. Refer to the [`tiny_conv`](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/speech_commands/models.py#L673) +model architecture. + +![model_architecture.png](../images/model_architecture.png) + +*This image was derived from visualizing the 'model.tflite' file in +[Netron](https://github.com/lutzroeder/netron)* + +This doesn't produce a highly accurate model, but it's designed to be used as +the first stage of a pipeline, running on a low-energy piece of hardware that +can always be on, and then wake higher-power chips when a possible utterance has +been found, so that more accurate analysis can be done. Additionally, the model +takes in preprocessed speech input as a result of which we can leverage a +simpler model for accurate results. + +## Dataset + +The Speech Commands Dataset. ([Download Link](https://storage.cloud.google.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz), +[Paper](https://arxiv.org/abs/1804.03209)) consists of over 105,000 WAVE audio +files of people saying thirty different words. This data was collected by +Google and released under a CC BY license. You can help improve it by +contributing five minutes of your own voice. The archive is over 2GB, so this +part may take a while, but you should see progress logs, and once it's been +downloaded you won't need to do this again. + +## Preprocessing Speech Input + +In this section we discuss spectrograms, the preprocessed speech input to the +model. Here's an illustration of the process: + +![spectrogram diagram](https://storage.googleapis.com/download.tensorflow.org/example_images/spectrogram_diagram.png) + +The model doesn't take in raw audio sample data, instead it works with +spectrograms which are two dimensional arrays that are made up of slices of +frequency information, each taken from a different time window. + +The recipe for creating the spectrogram data is that each frequency slice is +created by running an FFT across a 30ms section of the audio sample data. The +input samples are treated as being between -1 and +1 as real values (encoded as +-32,768 and 32,767 in 16-bit signed integer samples). + +This results in an FFT with 256 entries. Every sequence of six entries is +averaged together, giving a total of 43 frequency buckets in the final slice. +The results are stored as unsigned eight-bit values, where 0 represents a real +number of zero, and 255 represents 127.5 as a real number. + +Each adjacent frequency entry is stored in ascending memory order (frequency +bucket 0 at data[0], bucket 1 at data[1], etc). The window for the frequency +analysis is then moved forward by 20ms, and the process repeated, storing the +results in the next memory row (for example bucket 0 in this moved window would +be in data[43 + 0], etc). This process happens 49 times in total, producing a +single channel image that is 43 pixels wide, and 49 rows high. + +In a complete application these spectrograms would be calculated at runtime from +microphone inputs, but the code for doing that is not yet included in this +sample code. The test uses spectrograms that have been pre-calculated from +one-second WAV files in the test dataset generated by running the following +commands: + +``` +python tensorflow/tensorflow/examples/speech_commands/wav_to_features.py \ +--input_wav=/tmp/speech_dataset/yes/f2e59fea_nohash_1.wav \ +--output_c_file=/tmp/yes_features_data.cc \ +--window_stride=20 --preprocess=average --quantize=1 + +python tensorflow/tensorflow/examples/speech_commands/wav_to_features.py \ +--input_wav=/tmp/speech_dataset/no/f9643d42_nohash_4.wav \ +--output_c_file=/tmp/no_features_data.cc \ +--window_stride=20 --preprocess=average --quantize=1 +``` + + +## Other Training Methods + +### Use [Google Cloud](https://cloud.google.com/). + +*Note: Google Cloud isn't free. You need to pay depending on how long you use +run the VM and what resources you use.* + +1. Create a Virtual Machine (VM) using a pre-configured Deep Learning VM Image. + +``` +export IMAGE_FAMILY="tf-latest-cpu" +export ZONE="us-west1-b" # Or any other required region +export INSTANCE_NAME="model-trainer" +export INSTANCE_TYPE="n1-standard-8" # or any other instance type +gcloud compute instances create $INSTANCE_NAME \ + --zone=$ZONE \ + --image-family=$IMAGE_FAMILY \ + --image-project=deeplearning-platform-release \ + --machine-type=$INSTANCE_TYPE \ + --boot-disk-size=120GB \ + --min-cpu-platform=Intel\ Skylake +``` + +2. As soon as instance has been created you can SSH to it: + +``` +gcloud compute ssh "jupyter@${INSTANCE_NAME}" +``` + +3. Train a model by following the instructions in the [`train_micro_speech_model.ipynb`](train_micro_speech_model.ipynb) +jupyter notebook. + +4. Finally, don't forget to remove the instance when training is done: + +``` +gcloud compute instances delete "${INSTANCE_NAME}" --zone="${ZONE}" +``` diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/train_micro_speech_model.ipynb b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/train_micro_speech_model.ipynb new file mode 100644 index 00000000..1a1d5ff2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train/train_micro_speech_model.ipynb @@ -0,0 +1,599 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "train_micro_speech_model.ipynb", + "provenance": [], + "collapsed_sections": [], + "toc_visible": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "pO4-CY_TCZZS", + "colab_type": "text" + }, + "source": [ + "# Train a Simple Audio Recognition Model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BaFfr7DHRmGF", + "colab_type": "text" + }, + "source": [ + "This notebook demonstrates how to train a 20 kB [Simple Audio Recognition](https://www.tensorflow.org/tutorials/sequences/audio_recognition) model to recognize keywords in speech.\n", + "\n", + "The model created in this notebook is used in the [micro_speech](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/micro_speech) example for [TensorFlow Lite for MicroControllers](https://www.tensorflow.org/lite/microcontrollers/overview).\n", + "\n", + "\n", + " \n", + " \n", + "
\n", + " Run in Google Colab\n", + " \n", + " View source on GitHub\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XaVtYN4nlCft", + "colab_type": "text" + }, + "source": [ + "**Training is much faster using GPU acceleration.** Before you proceed, ensure you are using a GPU runtime by going to **Runtime -> Change runtime type** and set **Hardware accelerator: GPU**. Training 15,000 iterations will take 1.5 - 2 hours on a GPU runtime.\n", + "\n", + "## Configure Defaults\n", + "\n", + "**MODIFY** the following constants for your specific use case." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ludfxbNIaegy", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# A comma-delimited list of the words you want to train for.\n", + "# The options are: yes,no,up,down,left,right,on,off,stop,go\n", + "# All the other words will be used to train an \"unknown\" label and silent\n", + "# audio data with no spoken words will be used to train a \"silence\" label.\n", + "WANTED_WORDS = \"yes,no\"\n", + "\n", + "# The number of steps and learning rates can be specified as comma-separated\n", + "# lists to define the rate at each stage. For example,\n", + "# TRAINING_STEPS=12000,3000 and LEARNING_RATE=0.001,0.0001\n", + "# will run 12,000 training loops in total, with a rate of 0.001 for the first\n", + "# 8,000, and 0.0001 for the final 3,000.\n", + "TRAINING_STEPS = \"12000,3000\"\n", + "LEARNING_RATE = \"0.001,0.0001\"\n", + "\n", + "# Calculate the total number of steps, which is used to identify the checkpoint\n", + "# file name.\n", + "TOTAL_STEPS = str(sum(map(lambda string: int(string), TRAINING_STEPS.split(\",\"))))\n", + "\n", + "# Print the configuration to confirm it\n", + "print(\"Training these words: %s\" % WANTED_WORDS)\n", + "print(\"Training steps in each stage: %s\" % TRAINING_STEPS)\n", + "print(\"Learning rate in each stage: %s\" % LEARNING_RATE)\n", + "print(\"Total number of training steps: %s\" % TOTAL_STEPS)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gCgeOpvY9pAi", + "colab_type": "text" + }, + "source": [ + "**DO NOT MODIFY** the following constants as they include filepaths used in this notebook and data that is shared during training and inference." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Nd1iM1o2ymvA", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Calculate the percentage of 'silence' and 'unknown' training samples required\n", + "# to ensure that we have equal number of samples for each label.\n", + "number_of_labels = WANTED_WORDS.count(',') + 1\n", + "number_of_total_labels = number_of_labels + 2 # for 'silence' and 'unknown' label\n", + "equal_percentage_of_training_samples = int(100.0/(number_of_total_labels))\n", + "SILENT_PERCENTAGE = equal_percentage_of_training_samples\n", + "UNKNOWN_PERCENTAGE = equal_percentage_of_training_samples\n", + "\n", + "# Constants which are shared during training and inference\n", + "PREPROCESS = 'micro'\n", + "WINDOW_STRIDE = 20\n", + "MODEL_ARCHITECTURE = 'tiny_conv' # Other options include: single_fc, conv,\n", + " # low_latency_conv, low_latency_svdf, tiny_embedding_conv\n", + "\n", + "# Constants used during training only\n", + "VERBOSITY = 'WARN'\n", + "EVAL_STEP_INTERVAL = '1000'\n", + "SAVE_STEP_INTERVAL = '1000'\n", + "\n", + "# Constants for training directories and filepaths\n", + "DATASET_DIR = 'dataset/'\n", + "LOGS_DIR = 'logs/'\n", + "TRAIN_DIR = 'train/' # for training checkpoints and other files.\n", + "\n", + "# Constants for inference directories and filepaths\n", + "import os\n", + "MODELS_DIR = 'models'\n", + "if not os.path.exists(MODELS_DIR):\n", + " os.mkdir(MODELS_DIR)\n", + "MODEL_TF = os.path.join(MODELS_DIR, 'model.pb')\n", + "MODEL_TFLITE = os.path.join(MODELS_DIR, 'model.tflite')\n", + "FLOAT_MODEL_TFLITE = os.path.join(MODELS_DIR, 'float_model.tflite')\n", + "MODEL_TFLITE_MICRO = os.path.join(MODELS_DIR, 'model.cc')\n", + "SAVED_MODEL = os.path.join(MODELS_DIR, 'saved_model')\n", + "\n", + "QUANT_INPUT_MIN = 0.0\n", + "QUANT_INPUT_MAX = 26.0\n", + "QUANT_INPUT_RANGE = QUANT_INPUT_MAX - QUANT_INPUT_MIN" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6rLYpvtg9P4o", + "colab_type": "text" + }, + "source": [ + "## Setup Environment\n", + "\n", + "Install Dependencies" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ed_XpUrU5DvY", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%tensorflow_version 1.x\n", + "import tensorflow as tf" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "T9Ty5mR58E4i", + "colab_type": "text" + }, + "source": [ + "**DELETE** any old data from previous runs\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "APGx0fEh7hFF", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!rm -rf {DATASET_DIR} {LOGS_DIR} {TRAIN_DIR} {MODELS_DIR}" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GfEUlfFBizio", + "colab_type": "text" + }, + "source": [ + "Clone the TensorFlow Github Repository, which contains the relevant code required to run this tutorial." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "yZArmzT85SLq", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!git clone -q --depth 1 https://github.com/tensorflow/tensorflow" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nS9swHLSi7Bi", + "colab_type": "text" + }, + "source": [ + "Load TensorBoard to visualize the accuracy and loss as training proceeds.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "q4qF1VxP3UE4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%load_ext tensorboard\n", + "%tensorboard --logdir {LOGS_DIR}" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "x1J96Ron-O4R", + "colab_type": "text" + }, + "source": [ + "## Training\n", + "\n", + "The following script downloads the dataset and begin training." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VJsEZx6lynbY", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!python tensorflow/tensorflow/examples/speech_commands/train.py \\\n", + "--data_dir={DATASET_DIR} \\\n", + "--wanted_words={WANTED_WORDS} \\\n", + "--silence_percentage={SILENT_PERCENTAGE} \\\n", + "--unknown_percentage={UNKNOWN_PERCENTAGE} \\\n", + "--preprocess={PREPROCESS} \\\n", + "--window_stride={WINDOW_STRIDE} \\\n", + "--model_architecture={MODEL_ARCHITECTURE} \\\n", + "--how_many_training_steps={TRAINING_STEPS} \\\n", + "--learning_rate={LEARNING_RATE} \\\n", + "--train_dir={TRAIN_DIR} \\\n", + "--summaries_dir={LOGS_DIR} \\\n", + "--verbosity={VERBOSITY} \\\n", + "--eval_step_interval={EVAL_STEP_INTERVAL} \\\n", + "--save_step_interval={SAVE_STEP_INTERVAL}" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UczQKtqLi7OJ", + "colab_type": "text" + }, + "source": [ + "# Skipping the training\n", + "\n", + "If you don't want to spend an hour or two training the model from scratch, you can download pretrained checkpoints by uncommenting the lines below (removing the '#'s at the start of each line) and running them." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RZw3VNlnla-J", + "colab_type": "code", + "colab": {} + }, + "source": [ + "#!curl -O \"https://storage.googleapis.com/download.tensorflow.org/models/tflite/speech_micro_train_2020_05_10.tgz\"\n", + "#!tar xzf speech_micro_train_2020_05_10.tgz" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XQUJLrdS-ftl", + "colab_type": "text" + }, + "source": [ + "## Generate a TensorFlow Model for Inference\n", + "\n", + "Combine relevant training results (graph, weights, etc) into a single file for inference. This process is known as freezing a model and the resulting model is known as a frozen model/graph, as it cannot be further re-trained after this process." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xyc3_eLh9sAg", + "colab_type": "code", + "colab": {} + }, + "source": [ + "!rm -rf {SAVED_MODEL}\n", + "!python tensorflow/tensorflow/examples/speech_commands/freeze.py \\\n", + "--wanted_words=$WANTED_WORDS \\\n", + "--window_stride_ms=$WINDOW_STRIDE \\\n", + "--preprocess=$PREPROCESS \\\n", + "--model_architecture=$MODEL_ARCHITECTURE \\\n", + "--start_checkpoint=$TRAIN_DIR$MODEL_ARCHITECTURE'.ckpt-'{TOTAL_STEPS} \\\n", + "--save_format=saved_model \\\n", + "--output_file={SAVED_MODEL}" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_DBGDxVI-nKG", + "colab_type": "text" + }, + "source": [ + "## Generate a TensorFlow Lite Model\n", + "\n", + "Convert the frozen graph into a TensorFlow Lite model, which is fully quantized for use with embedded devices.\n", + "\n", + "The following cell will also print the model size, which will be under 20 kilobytes." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RIitkqvGWmre", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import sys\n", + "# We add this path so we can import the speech processing modules.\n", + "sys.path.append(\"/content/tensorflow/tensorflow/examples/speech_commands/\")\n", + "import input_data\n", + "import models\n", + "import numpy as np" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "kzqECqMxgBh4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "SAMPLE_RATE = 16000\n", + "CLIP_DURATION_MS = 1000\n", + "WINDOW_SIZE_MS = 30.0\n", + "FEATURE_BIN_COUNT = 40\n", + "BACKGROUND_FREQUENCY = 0.8\n", + "BACKGROUND_VOLUME_RANGE = 0.1\n", + "TIME_SHIFT_MS = 100.0\n", + "\n", + "DATA_URL = 'https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.02.tar.gz'\n", + "VALIDATION_PERCENTAGE = 10\n", + "TESTING_PERCENTAGE = 10" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "rNQdAplJV1fz", + "colab_type": "code", + "colab": {} + }, + "source": [ + "model_settings = models.prepare_model_settings(\n", + " len(input_data.prepare_words_list(WANTED_WORDS.split(','))),\n", + " SAMPLE_RATE, CLIP_DURATION_MS, WINDOW_SIZE_MS,\n", + " WINDOW_STRIDE, FEATURE_BIN_COUNT, PREPROCESS)\n", + "audio_processor = input_data.AudioProcessor(\n", + " DATA_URL, DATASET_DIR,\n", + " SILENT_PERCENTAGE, UNKNOWN_PERCENTAGE,\n", + " WANTED_WORDS.split(','), VALIDATION_PERCENTAGE,\n", + " TESTING_PERCENTAGE, model_settings, LOGS_DIR)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "lBj_AyCh1cC0", + "colab_type": "code", + "colab": {} + }, + "source": [ + "with tf.Session() as sess:\n", + " float_converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL)\n", + " float_tflite_model = float_converter.convert()\n", + " float_tflite_model_size = open(FLOAT_MODEL_TFLITE, \"wb\").write(float_tflite_model)\n", + " print(\"Float model is %d bytes\" % float_tflite_model_size)\n", + "\n", + " converter = tf.lite.TFLiteConverter.from_saved_model(SAVED_MODEL)\n", + " converter.optimizations = [tf.lite.Optimize.DEFAULT]\n", + " converter.inference_input_type = tf.lite.constants.INT8\n", + " converter.inference_output_type = tf.lite.constants.INT8\n", + " def representative_dataset_gen():\n", + " for i in range(100):\n", + " data, _ = audio_processor.get_data(1, i*1, model_settings,\n", + " BACKGROUND_FREQUENCY, \n", + " BACKGROUND_VOLUME_RANGE,\n", + " TIME_SHIFT_MS,\n", + " 'testing',\n", + " sess)\n", + " flattened_data = np.array(data.flatten(), dtype=np.float32).reshape(1, 1960)\n", + " yield [flattened_data]\n", + " converter.representative_dataset = representative_dataset_gen\n", + " tflite_model = converter.convert()\n", + " tflite_model_size = open(MODEL_TFLITE, \"wb\").write(tflite_model)\n", + " print(\"Quantized model is %d bytes\" % tflite_model_size)\n" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EeLiDZTbLkzv", + "colab_type": "text" + }, + "source": [ + "## Testing the TensorFlow Lite model's accuracy\n", + "\n", + "Verify that the model we've exported is still accurate, using the TF Lite Python API and our test set." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "wQsEteKRLryJ", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Helper function to run inference\n", + "def run_tflite_inference(tflite_model_path, model_type=\"Float\"):\n", + " # Load test data\n", + " np.random.seed(0) # set random seed for reproducible test results.\n", + " with tf.Session() as sess:\n", + " test_data, test_labels = audio_processor.get_data(\n", + " -1, 0, model_settings, BACKGROUND_FREQUENCY, BACKGROUND_VOLUME_RANGE,\n", + " TIME_SHIFT_MS, 'testing', sess)\n", + " test_data = np.expand_dims(test_data, axis=1).astype(np.float32)\n", + "\n", + " # Initialize the interpreter\n", + " interpreter = tf.lite.Interpreter(tflite_model_path)\n", + " interpreter.allocate_tensors()\n", + "\n", + " input_details = interpreter.get_input_details()[0]\n", + " output_details = interpreter.get_output_details()[0]\n", + "\n", + " # For quantized models, manually quantize the input data from float to integer\n", + " if model_type == \"Quantized\":\n", + " input_scale, input_zero_point = input_details[\"quantization\"]\n", + " test_data = test_data / input_scale + input_zero_point\n", + " test_data = test_data.astype(input_details[\"dtype\"])\n", + "\n", + " correct_predictions = 0\n", + " for i in range(len(test_data)):\n", + " interpreter.set_tensor(input_details[\"index\"], test_data[i])\n", + " interpreter.invoke()\n", + " output = interpreter.get_tensor(output_details[\"index\"])[0]\n", + " top_prediction = output.argmax()\n", + " correct_predictions += (top_prediction == test_labels[i])\n", + "\n", + " print('%s model accuracy is %f%% (Number of test samples=%d)' % (\n", + " model_type, (correct_predictions * 100) / len(test_data), len(test_data)))" + ], + "execution_count": 110, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "l-pD52Na6jRa", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Compute float model accuracy\n", + "run_tflite_inference(FLOAT_MODEL_TFLITE)\n", + "\n", + "# Compute quantized model accuracy\n", + "run_tflite_inference(MODEL_TFLITE, model_type='Quantized')" + ], + "execution_count": 111, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dt6Zqbxu-wIi", + "colab_type": "text" + }, + "source": [ + "## Generate a TensorFlow Lite for MicroControllers Model\n", + "Convert the TensorFlow Lite model into a C source file that can be loaded by TensorFlow Lite for Microcontrollers." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XohZOTjR8ZyE", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Install xxd if it is not available\n", + "!apt-get update && apt-get -qq install xxd\n", + "# Convert to a C source file\n", + "!xxd -i {MODEL_TFLITE} > {MODEL_TFLITE_MICRO}\n", + "# Update variable names\n", + "REPLACE_TEXT = MODEL_TFLITE.replace('/', '_').replace('.', '_')\n", + "!sed -i 's/'{REPLACE_TEXT}'/g_model/g' {MODEL_TFLITE_MICRO}" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2pQnN0i_-0L2", + "colab_type": "text" + }, + "source": [ + "## Deploy to a Microcontroller\n", + "\n", + "Follow the instructions in the [micro_speech](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/micro_speech) README.md for [TensorFlow Lite for MicroControllers](https://www.tensorflow.org/lite/microcontrollers/overview) to deploy this model on a specific microcontroller.\n", + "\n", + "**Reference Model:** If you have not modified this notebook, you can follow the instructions as is, to deploy the model. Refer to the [`micro_speech/train/models`](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/micro_speech/train/models) directory to access the models generated in this notebook.\n", + "\n", + "**New Model:** If you have generated a new model to identify different words: (i) Update `kCategoryCount` and `kCategoryLabels` in [`micro_speech/micro_features/micro_model_settings.h`](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h) and (ii) Update the values assigned to the variables defined in [`micro_speech/micro_features/model.cc`](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/micro_speech/micro_features/model.cc) with values displayed after running the following cell." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "eoYyh0VU8pca", + "colab_type": "code", + "colab": {} + }, + "source": [ + "# Print the C source file\n", + "!cat {MODEL_TFLITE_MICRO}" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train_speech_model.ipynb b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train_speech_model.ipynb new file mode 100644 index 00000000..fb56dc3a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/train_speech_model.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Redirect","provenance":[],"collapsed_sections":[],"authorship_tag":"ABX9TyO1u6oks1qPVEQNnHFD3Cyo"},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"markdown","metadata":{"id":"86C-FMxpdZxv","colab_type":"text"},"source":["This Colab notebook has been moved to [https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/micro_speech/train/train_micro_speech_model.ipynb](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/micro/examples/micro_speech/train/train_micro_speech_model.ipynb)\n"]}]} \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.cc new file mode 100644 index 00000000..009bf1bf --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.cc @@ -0,0 +1,16022 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h" + +const int g_yes_1000ms_sample_data_size = 16000; +const int16_t g_yes_1000ms_sample_data[16000] = { + -7, + -12, + -18, + -20, + -20, + -21, + -21, + -25, + -29, + -31, + -31, + -30, + -30, + -29, + -30, + -30, + -29, + -28, + -24, + -22, + -17, + -12, + -8, + -7, + -6, + -1, + 2, + 5, + 7, + 8, + 11, + 15, + 18, + 19, + 23, + 24, + 24, + 27, + 27, + 26, + 25, + 28, + 30, + 32, + 33, + 31, + 29, + 27, + 28, + 30, + 28, + 26, + 26, + 24, + 22, + 17, + 16, + 15, + 13, + 10, + 5, + 0, + -4, + -4, + -7, + -9, + -12, + -14, + -14, + -13, + -11, + -10, + -8, + -6, + -3, + 3, + 7, + 8, + 12, + 15, + 18, + 21, + 19, + 19, + 21, + 23, + 24, + 23, + 22, + 19, + 17, + 11, + 5, + -3, + -12, + -22, + -28, + -35, + -45, + -54, + -62, + -69, + -76, + -84, + -92, + -100, + -109, + -116, + -117, + -120, + -120, + -120, + -122, + -124, + -126, + -123, + -121, + -116, + -113, + -107, + -97, + -88, + -75, + -61, + -50, + -41, + -27, + -12, + 4, + 21, + 37, + 58, + 76, + 93, + 108, + 121, + 137, + 156, + 172, + 184, + 196, + 205, + 215, + 224, + 235, + 242, + 245, + 242, + 240, + 238, + 231, + 223, + 214, + 205, + 195, + 178, + 158, + 135, + 112, + 90, + 69, + 46, + 19, + -11, + -45, + -76, + -105, + -133, + -159, + -186, + -211, + -236, + -260, + -280, + -294, + -308, + -320, + -331, + -336, + -338, + -335, + -326, + -316, + -301, + -286, + -267, + -246, + -225, + -203, + -180, + -154, + -124, + -91, + -59, + -34, + -8, + 19, + 42, + 64, + 87, + 103, + 119, + 134, + 148, + 162, + 174, + 182, + 188, + 190, + 189, + 187, + 184, + 180, + 177, + 171, + 162, + 154, + 144, + 137, + 129, + 118, + 106, + 95, + 81, + 69, + 58, + 48, + 37, + 26, + 14, + 3, + -7, + -22, + -31, + -42, + -52, + -62, + -69, + -75, + -79, + -82, + -87, + -88, + -92, + -94, + -91, + -87, + -85, + -81, + -74, + -70, + -64, + -55, + -47, + -40, + -33, + -25, + -19, + -12, + -6, + -4, + -1, + 1, + 1, + -2, + -9, + -15, + -17, + -18, + -20, + -22, + -22, + -26, + -31, + -33, + -35, + -31, + -26, + -17, + -4, + 8, + 19, + 31, + 44, + 54, + 64, + 71, + 79, + 86, + 92, + 102, + 109, + 111, + 109, + 104, + 96, + 84, + 70, + 60, + 51, + 38, + 27, + 13, + 4, + -3, + -9, + -13, + -18, + -26, + -33, + -32, + -27, + -20, + -10, + -4, + 2, + 6, + 10, + 14, + 16, + 21, + 25, + 29, + 31, + 33, + 35, + 37, + 33, + 22, + 15, + 13, + 11, + 12, + 9, + 5, + 2, + 1, + -3, + -9, + -17, + -27, + -32, + -35, + -36, + -36, + -42, + -50, + -56, + -66, + -77, + -85, + -96, + -100, + -106, + -113, + -118, + -121, + -119, + -117, + -119, + -122, + -124, + -123, + -112, + -94, + -77, + -64, + -51, + -37, + -22, + -3, + 17, + 37, + 54, + 68, + 86, + 100, + 114, + 134, + 154, + 167, + 174, + 178, + 182, + 189, + 189, + 187, + 185, + 179, + 177, + 174, + 171, + 157, + 138, + 123, + 108, + 94, + 76, + 50, + 25, + 6, + -8, + -20, + -37, + -59, + -86, + -110, + -132, + -147, + -159, + -169, + -178, + -191, + -203, + -213, + -217, + -215, + -208, + -199, + -194, + -195, + -190, + -178, + -165, + -155, + -144, + -134, + -123, + -103, + -80, + -56, + -35, + -18, + -4, + 11, + 23, + 36, + 50, + 65, + 78, + 93, + 111, + 122, + 129, + 132, + 131, + 127, + 125, + 126, + 126, + 128, + 127, + 125, + 122, + 118, + 111, + 108, + 104, + 99, + 93, + 89, + 90, + 87, + 82, + 78, + 75, + 68, + 65, + 67, + 69, + 66, + 61, + 54, + 39, + 28, + 15, + 3, + -7, + -18, + -25, + -29, + -35, + -42, + -52, + -66, + -78, + -83, + -85, + -86, + -86, + -82, + -83, + -84, + -83, + -81, + -75, + -62, + -57, + -53, + -49, + -46, + -41, + -34, + -26, + -16, + -10, + -7, + -2, + 2, + 6, + 12, + 15, + 19, + 18, + 15, + 17, + 21, + 24, + 30, + 33, + 27, + 22, + 21, + 20, + 23, + 24, + 21, + 15, + 13, + 8, + 3, + 1, + -1, + -3, + -4, + -6, + -9, + -11, + -11, + -8, + -10, + -13, + -15, + -19, + -17, + -11, + -2, + 1, + 2, + 6, + 9, + 10, + 12, + 13, + 9, + 8, + 10, + 13, + 20, + 18, + 13, + 10, + 4, + 1, + -2, + -6, + -11, + -13, + -16, + -18, + -15, + -18, + -21, + -21, + -22, + -23, + -25, + -23, + -22, + -20, + -19, + -16, + -12, + -10, + -9, + -11, + -15, + -19, + -22, + -19, + -14, + -11, + -9, + -11, + -17, + -20, + -18, + -19, + -15, + -11, + -8, + -2, + 8, + 19, + 30, + 36, + 37, + 36, + 38, + 45, + 57, + 69, + 77, + 81, + 79, + 75, + 76, + 74, + 69, + 66, + 60, + 53, + 45, + 36, + 28, + 22, + 17, + 10, + 0, + -5, + -11, + -15, + -18, + -26, + -31, + -33, + -34, + -34, + -35, + -37, + -37, + -35, + -28, + -24, + -29, + -37, + -45, + -46, + -41, + -36, + -31, + -32, + -33, + -37, + -37, + -36, + -36, + -34, + -27, + -19, + -14, + -11, + -8, + -1, + 6, + 14, + 19, + 21, + 25, + 30, + 34, + 38, + 38, + 33, + 26, + 22, + 19, + 20, + 18, + 17, + 15, + 10, + 2, + -3, + -5, + -10, + -13, + -13, + -13, + -16, + -16, + -16, + -15, + -13, + -14, + -13, + -16, + -19, + -20, + -18, + -17, + -18, + -16, + -16, + -24, + -28, + -28, + -28, + -23, + -21, + -21, + -20, + -24, + -27, + -23, + -18, + -14, + -7, + 4, + 11, + 15, + 19, + 21, + 25, + 33, + 39, + 41, + 45, + 47, + 50, + 56, + 58, + 57, + 59, + 59, + 55, + 50, + 47, + 39, + 34, + 30, + 24, + 18, + 11, + 8, + 3, + 0, + -3, + -8, + -14, + -15, + -13, + -13, + -12, + -14, + -17, + -17, + -12, + -10, + -4, + -7, + -12, + -10, + -14, + -17, + -17, + -19, + -25, + -28, + -27, + -29, + -30, + -31, + -35, + -38, + -43, + -47, + -51, + -52, + -50, + -49, + -48, + -47, + -45, + -39, + -32, + -30, + -31, + -35, + -35, + -31, + -24, + -17, + -12, + -11, + -14, + -15, + -17, + -16, + -9, + -5, + -3, + -1, + 0, + 1, + 0, + 3, + 12, + 21, + 26, + 33, + 35, + 38, + 45, + 50, + 53, + 53, + 54, + 58, + 61, + 64, + 69, + 67, + 66, + 64, + 58, + 54, + 51, + 46, + 44, + 45, + 41, + 35, + 31, + 27, + 25, + 27, + 25, + 20, + 13, + 12, + 16, + 17, + 17, + 12, + 7, + 3, + 2, + -2, + -4, + -8, + -14, + -19, + -25, + -29, + -38, + -49, + -60, + -69, + -73, + -71, + -74, + -82, + -89, + -98, + -103, + -104, + -103, + -99, + -98, + -98, + -98, + -99, + -97, + -94, + -91, + -85, + -82, + -78, + -74, + -74, + -71, + -68, + -61, + -54, + -52, + -47, + -41, + -36, + -32, + -21, + -12, + -3, + 11, + 26, + 36, + 44, + 48, + 55, + 64, + 77, + 92, + 100, + 108, + 117, + 120, + 122, + 128, + 130, + 129, + 130, + 127, + 124, + 122, + 121, + 118, + 114, + 110, + 102, + 92, + 85, + 80, + 77, + 68, + 55, + 46, + 39, + 36, + 34, + 31, + 27, + 15, + 5, + -1, + -5, + -11, + -20, + -29, + -37, + -43, + -46, + -47, + -54, + -61, + -65, + -74, + -82, + -84, + -91, + -94, + -96, + -104, + -109, + -111, + -111, + -112, + -113, + -111, + -112, + -110, + -104, + -99, + -96, + -93, + -89, + -87, + -81, + -71, + -63, + -54, + -45, + -43, + -37, + -30, + -24, + -17, + -12, + -8, + -2, + 2, + 15, + 23, + 28, + 35, + 41, + 42, + 44, + 52, + 58, + 66, + 74, + 78, + 80, + 82, + 85, + 88, + 90, + 92, + 92, + 88, + 87, + 87, + 79, + 73, + 69, + 64, + 62, + 55, + 50, + 45, + 41, + 36, + 29, + 24, + 20, + 16, + 12, + 8, + 5, + 2, + 1, + 1, + 0, + 1, + -4, + -4, + -4, + -4, + -1, + 1, + 2, + 1, + -3, + -6, + -1, + 5, + 6, + 7, + 8, + 4, + 2, + 0, + -2, + -3, + 0, + -3, + -4, + -3, + -4, + -5, + -8, + -15, + -20, + -25, + -28, + -32, + -37, + -38, + -39, + -43, + -48, + -55, + -62, + -69, + -75, + -75, + -78, + -81, + -83, + -89, + -89, + -92, + -91, + -91, + -89, + -83, + -81, + -74, + -66, + -63, + -54, + -45, + -39, + -31, + -23, + -15, + -4, + 6, + 14, + 23, + 29, + 35, + 41, + 45, + 49, + 55, + 61, + 69, + 75, + 75, + 76, + 75, + 74, + 74, + 73, + 74, + 72, + 69, + 69, + 65, + 62, + 57, + 52, + 44, + 35, + 33, + 29, + 24, + 14, + 7, + 3, + -4, + -12, + -17, + -20, + -22, + -27, + -32, + -34, + -39, + -42, + -43, + -42, + -43, + -40, + -38, + -36, + -36, + -37, + -36, + -33, + -31, + -27, + -24, + -23, + -22, + -17, + -11, + -7, + -7, + -7, + -3, + 5, + 13, + 19, + 25, + 27, + 25, + 27, + 35, + 40, + 40, + 41, + 45, + 47, + 50, + 54, + 52, + 50, + 45, + 43, + 44, + 40, + 34, + 28, + 24, + 18, + 11, + 6, + -2, + -9, + -14, + -21, + -27, + -35, + -39, + -43, + -50, + -57, + -62, + -66, + -68, + -71, + -72, + -73, + -74, + -76, + -76, + -77, + -75, + -75, + -74, + -67, + -61, + -55, + -49, + -45, + -40, + -30, + -21, + -11, + -4, + 4, + 13, + 23, + 34, + 44, + 52, + 59, + 65, + 70, + 77, + 84, + 87, + 88, + 90, + 91, + 90, + 89, + 85, + 80, + 75, + 72, + 71, + 64, + 56, + 48, + 41, + 34, + 27, + 21, + 12, + 1, + -11, + -19, + -28, + -33, + -39, + -46, + -50, + -53, + -58, + -63, + -66, + -71, + -73, + -76, + -76, + -74, + -73, + -71, + -67, + -65, + -62, + -60, + -55, + -51, + -45, + -39, + -35, + -31, + -27, + -20, + -13, + -6, + -3, + 1, + 8, + 12, + 18, + 24, + 26, + 30, + 35, + 38, + 44, + 47, + 47, + 51, + 53, + 52, + 53, + 52, + 50, + 51, + 49, + 50, + 51, + 50, + 48, + 48, + 45, + 43, + 42, + 37, + 34, + 31, + 31, + 30, + 26, + 24, + 21, + 15, + 12, + 11, + 7, + 4, + 1, + -3, + -5, + -7, + -9, + -15, + -21, + -26, + -28, + -31, + -35, + -39, + -46, + -48, + -49, + -53, + -58, + -63, + -67, + -69, + -71, + -72, + -74, + -75, + -77, + -77, + -73, + -72, + -69, + -65, + -60, + -55, + -50, + -47, + -43, + -38, + -30, + -25, + -20, + -12, + -4, + 4, + 9, + 16, + 20, + 24, + 28, + 35, + 43, + 50, + 58, + 61, + 65, + 72, + 74, + 74, + 76, + 79, + 78, + 76, + 78, + 76, + 76, + 74, + 70, + 64, + 59, + 52, + 46, + 41, + 33, + 26, + 19, + 12, + 5, + -2, + -8, + -15, + -20, + -26, + -31, + -37, + -39, + -41, + -44, + -44, + -47, + -51, + -52, + -52, + -48, + -45, + -46, + -48, + -45, + -42, + -40, + -36, + -32, + -27, + -24, + -22, + -18, + -16, + -11, + -10, + -5, + 0, + 3, + 8, + 11, + 16, + 18, + 21, + 23, + 25, + 26, + 27, + 28, + 30, + 31, + 31, + 30, + 29, + 27, + 26, + 23, + 19, + 17, + 13, + 10, + 6, + 0, + -2, + -5, + -10, + -12, + -15, + -19, + -23, + -26, + -29, + -30, + -30, + -32, + -33, + -34, + -35, + -34, + -31, + -29, + -29, + -28, + -28, + -23, + -19, + -17, + -12, + -12, + -10, + -5, + -2, + 3, + 7, + 10, + 13, + 14, + 19, + 22, + 26, + 31, + 34, + 34, + 35, + 36, + 39, + 43, + 45, + 47, + 47, + 48, + 49, + 51, + 48, + 47, + 50, + 45, + 41, + 41, + 38, + 34, + 34, + 30, + 23, + 17, + 11, + 7, + 4, + -4, + -9, + -15, + -23, + -28, + -32, + -35, + -39, + -45, + -46, + -49, + -53, + -52, + -53, + -55, + -56, + -56, + -55, + -54, + -53, + -53, + -51, + -47, + -44, + -42, + -40, + -37, + -33, + -28, + -25, + -23, + -18, + -15, + -8, + -6, + -2, + 3, + 8, + 15, + 18, + 23, + 26, + 27, + 32, + 36, + 36, + 36, + 39, + 38, + 38, + 40, + 39, + 35, + 31, + 29, + 25, + 23, + 19, + 15, + 11, + 7, + 5, + 3, + 1, + -1, + -6, + -8, + -7, + -10, + -9, + -10, + -11, + -10, + -7, + -6, + -8, + -6, + -5, + -4, + 1, + 2, + 4, + 7, + 7, + 9, + 11, + 11, + 9, + 9, + 10, + 11, + 13, + 17, + 15, + 15, + 15, + 17, + 19, + 17, + 17, + 17, + 15, + 15, + 13, + 11, + 12, + 8, + 7, + 5, + 3, + 0, + -4, + -4, + -6, + -9, + -12, + -14, + -15, + -15, + -16, + -20, + -19, + -20, + -20, + -20, + -18, + -18, + -21, + -22, + -21, + -21, + -23, + -20, + -20, + -23, + -24, + -23, + -25, + -25, + -25, + -25, + -26, + -24, + -23, + -23, + -23, + -23, + -22, + -19, + -18, + -15, + -14, + -10, + -8, + -4, + -1, + 1, + 3, + 6, + 8, + 9, + 14, + 19, + 22, + 24, + 26, + 29, + 32, + 31, + 34, + 39, + 42, + 42, + 46, + 49, + 50, + 50, + 52, + 53, + 52, + 49, + 49, + 48, + 48, + 46, + 45, + 40, + 34, + 30, + 25, + 21, + 17, + 13, + 10, + 6, + 2, + -4, + -9, + -12, + -15, + -18, + -21, + -26, + -28, + -31, + -32, + -33, + -35, + -35, + -38, + -37, + -36, + -34, + -35, + -35, + -33, + -33, + -34, + -30, + -26, + -27, + -25, + -23, + -22, + -18, + -15, + -16, + -12, + -9, + -9, + -6, + -1, + 2, + 3, + 5, + 8, + 7, + 9, + 12, + 15, + 17, + 18, + 18, + 19, + 18, + 20, + 19, + 18, + 21, + 20, + 19, + 18, + 16, + 15, + 15, + 15, + 14, + 12, + 9, + 9, + 10, + 8, + 6, + 4, + 2, + 1, + -1, + -3, + -1, + -3, + -2, + -4, + -5, + -5, + -8, + -8, + -10, + -10, + -8, + -8, + -8, + -7, + -8, + -8, + -8, + -9, + -11, + -12, + -11, + -9, + -7, + -8, + -8, + -8, + -10, + -8, + -7, + -8, + -7, + -6, + -7, + -5, + -3, + -3, + -3, + -3, + -2, + 0, + 3, + 3, + 5, + 7, + 10, + 11, + 10, + 10, + 12, + 13, + 16, + 16, + 16, + 17, + 15, + 16, + 17, + 16, + 14, + 16, + 13, + 11, + 11, + 9, + 9, + 6, + 4, + 4, + 3, + 0, + -2, + -4, + -7, + -7, + -7, + -13, + -15, + -13, + -14, + -16, + -15, + -15, + -17, + -16, + -16, + -18, + -19, + -19, + -20, + -19, + -16, + -15, + -13, + -12, + -10, + -7, + -6, + -4, + -4, + -2, + 0, + 2, + 6, + 8, + 10, + 12, + 14, + 15, + 14, + 13, + 13, + 13, + 15, + 15, + 17, + 17, + 17, + 18, + 17, + 16, + 15, + 15, + 14, + 11, + 9, + 8, + 8, + 9, + 8, + 5, + 5, + 3, + -1, + -1, + -4, + -5, + -7, + -8, + -8, + -8, + -9, + -10, + -8, + -11, + -12, + -12, + -12, + -12, + -13, + -11, + -11, + -9, + -8, + -7, + -8, + -7, + -6, + -7, + -6, + -5, + -4, + -4, + -2, + -2, + -3, + -2, + -2, + -3, + 0, + -1, + -3, + 1, + 1, + 2, + 4, + 3, + 5, + 6, + 3, + 3, + 4, + 3, + 3, + 4, + 5, + 4, + 6, + 7, + 7, + 7, + 6, + 3, + 3, + 5, + 3, + 3, + 6, + 6, + 7, + 6, + 4, + 5, + 2, + 1, + 1, + 0, + 0, + 2, + 1, + 1, + 1, + -1, + -2, + -3, + -5, + -4, + -5, + -4, + -4, + -6, + -4, + -4, + -4, + -5, + -6, + -5, + -6, + -5, + -4, + -5, + -4, + -3, + -4, + 0, + 2, + 2, + 2, + 2, + 2, + 2, + 3, + 3, + 5, + 6, + 6, + 5, + 6, + 7, + 6, + 8, + 6, + 5, + 5, + 5, + 6, + 6, + 6, + 5, + 5, + 2, + 2, + 1, + 2, + 0, + -1, + -1, + -1, + -1, + 0, + -1, + -4, + -6, + -8, + -8, + -9, + -8, + -7, + -6, + -5, + -5, + -6, + -3, + -4, + -5, + -4, + -7, + -6, + -4, + -2, + -1, + -1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 1, + 3, + 4, + 4, + 6, + 6, + 6, + 6, + 4, + 4, + 4, + 4, + 3, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + -2, + -2, + -3, + -3, + -3, + -3, + -5, + -4, + -3, + -5, + -5, + -3, + -5, + -4, + -4, + -2, + -2, + -2, + -1, + -3, + -2, + -2, + -1, + -3, + -2, + -1, + -2, + -2, + -2, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 1, + 2, + 3, + 3, + 3, + 4, + 5, + 4, + 3, + 4, + 5, + 5, + 7, + 7, + 6, + 9, + 8, + 6, + 7, + 8, + 6, + 5, + 7, + 8, + 8, + 8, + 7, + 6, + 5, + 4, + 4, + 4, + 5, + 4, + 2, + 1, + 2, + 1, + 0, + -2, + -3, + -2, + -4, + -6, + -6, + -7, + -7, + -8, + -9, + -9, + -9, + -9, + -9, + -9, + -9, + -10, + -10, + -10, + -8, + -7, + -8, + -6, + -5, + -4, + -3, + -5, + -2, + -2, + -2, + -1, + -1, + 0, + 1, + 1, + 2, + 3, + 2, + 4, + 3, + 3, + 5, + 3, + 3, + 5, + 4, + 5, + 6, + 5, + 4, + 5, + 3, + 2, + 2, + 3, + 4, + 4, + 4, + 4, + 4, + 3, + 4, + 4, + 4, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 2, + 1, + 1, + 2, + 1, + 1, + 2, + 1, + 1, + 1, + -1, + 0, + 1, + 0, + -1, + 1, + -1, + -1, + -1, + -2, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -2, + -1, + 0, + -1, + -1, + 1, + 1, + 2, + 0, + -1, + 0, + -1, + -1, + 0, + 0, + 1, + 2, + 2, + 2, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + -1, + -2, + -1, + -3, + -4, + -4, + -4, + -4, + -4, + -4, + -4, + -3, + -3, + -5, + -6, + -4, + -2, + -2, + -1, + -1, + -1, + -2, + 1, + -1, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 1, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 6, + 6, + 5, + 5, + 5, + 6, + 6, + 5, + 3, + 6, + 5, + 4, + 5, + 3, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 0, + -1, + 0, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -3, + -3, + -3, + -3, + -4, + -4, + -5, + -6, + -6, + -6, + -6, + -6, + -6, + -5, + -5, + -6, + -5, + -4, + -4, + -4, + -4, + -2, + -2, + -2, + -1, + -2, + 0, + 1, + 0, + 1, + 3, + 4, + 4, + 4, + 4, + 4, + 4, + 5, + 4, + 4, + 4, + 5, + 7, + 5, + 4, + 4, + 4, + 4, + 3, + 2, + 2, + 2, + 2, + 2, + 0, + 1, + 1, + 0, + 1, + 1, + -1, + 0, + -1, + -2, + -1, + -3, + -4, + -4, + -3, + -5, + -5, + -5, + -5, + -5, + -5, + -4, + -3, + -3, + -2, + -3, + -2, + -2, + -5, + -3, + -3, + -3, + -2, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 3, + 3, + 4, + 4, + 4, + 4, + 5, + 5, + 2, + 3, + 4, + 3, + 5, + 4, + 3, + 4, + 3, + 3, + 5, + 5, + 3, + 4, + 2, + 1, + 1, + 3, + 4, + 3, + 1, + 3, + 2, + 1, + 2, + 1, + 0, + 1, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + -1, + 0, + 0, + -1, + -1, + -2, + -1, + -1, + -2, + 0, + -1, + -2, + -1, + -1, + -2, + -2, + -1, + -3, + -3, + -3, + -3, + -3, + -4, + -3, + -5, + -6, + -4, + -4, + -5, + -4, + -3, + -5, + -6, + -4, + -5, + -6, + -4, + -3, + -5, + -4, + -3, + -4, + -3, + -2, + -2, + -2, + 0, + 0, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 3, + 3, + 3, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + -2, + -1, + 1, + 0, + -1, + -2, + -2, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 0, + 0, + 2, + 1, + 0, + 1, + 1, + 1, + 1, + 3, + 3, + 3, + 4, + 3, + 3, + 4, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -3, + -3, + -3, + -5, + -4, + -5, + -5, + -5, + -5, + -7, + -7, + -7, + -8, + -7, + -8, + -7, + -8, + -8, + -7, + -8, + -8, + -8, + -8, + -7, + -6, + -6, + -6, + -7, + -6, + -6, + -5, + -5, + -3, + -2, + -2, + -1, + 0, + -1, + 0, + 1, + 2, + 2, + 3, + 3, + 3, + 6, + 7, + 7, + 7, + 8, + 9, + 8, + 10, + 10, + 9, + 10, + 11, + 9, + 10, + 12, + 11, + 10, + 9, + 9, + 9, + 9, + 10, + 9, + 6, + 6, + 5, + 5, + 6, + 3, + 1, + 1, + 0, + 1, + 0, + 0, + 1, + -1, + -2, + -2, + -1, + -3, + -3, + -2, + -4, + -4, + -3, + -2, + -4, + -4, + -4, + -5, + -3, + -3, + -5, + -3, + -3, + -5, + -4, + -2, + -2, + -3, + -3, + -1, + 0, + -1, + 0, + 0, + 0, + -2, + -1, + 0, + -1, + -2, + -2, + -2, + -2, + -1, + -3, + -2, + -3, + -4, + -3, + -3, + -3, + -3, + -3, + -3, + -3, + -2, + -4, + -6, + -5, + -3, + -2, + -4, + -3, + -2, + -4, + -4, + -4, + -3, + -4, + -5, + -4, + -5, + -3, + -2, + -5, + -2, + -4, + -4, + -3, + -2, + -1, + -1, + -1, + 0, + 2, + 2, + 1, + 1, + 3, + 3, + 3, + 3, + 4, + 4, + 5, + 6, + 5, + 5, + 6, + 7, + 7, + 7, + 8, + 8, + 7, + 9, + 9, + 9, + 9, + 10, + 9, + 9, + 9, + 9, + 9, + 9, + 8, + 7, + 9, + 9, + 6, + 7, + 5, + 2, + 3, + 2, + 1, + 1, + 0, + -2, + -2, + -2, + -3, + -3, + -2, + -2, + -4, + -5, + -4, + -4, + -4, + -4, + -5, + -4, + -4, + -5, + -4, + -5, + -4, + -5, + -6, + -4, + -4, + -5, + -5, + -5, + -5, + -6, + -4, + -4, + -4, + -3, + -2, + -3, + -3, + -2, + -2, + -1, + -2, + -3, + -1, + 0, + -1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + -1, + 1, + 1, + 1, + 0, + -2, + -2, + -3, + -3, + -4, + -4, + -6, + -7, + -5, + -4, + -5, + -5, + -4, + -6, + -8, + -7, + -6, + -5, + -5, + -5, + -4, + -4, + -5, + -4, + -3, + -3, + 0, + 0, + -2, + -1, + 0, + 0, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 4, + 5, + 5, + 5, + 6, + 7, + 7, + 9, + 10, + 10, + 10, + 12, + 12, + 13, + 14, + 14, + 14, + 15, + 15, + 15, + 15, + 15, + 15, + 14, + 15, + 15, + 12, + 13, + 13, + 12, + 10, + 11, + 11, + 11, + 10, + 8, + 6, + 5, + 7, + 6, + 6, + 4, + 3, + 4, + 5, + 3, + 2, + 2, + 1, + 1, + 2, + 3, + 1, + 0, + 0, + 1, + 0, + -2, + -1, + -2, + -3, + -3, + -3, + -3, + -4, + -6, + -8, + -9, + -9, + -10, + -12, + -14, + -15, + -18, + -21, + -21, + -21, + -21, + -22, + -24, + -26, + -26, + -27, + -27, + -28, + -26, + -25, + -26, + -28, + -27, + -24, + -23, + -23, + -24, + -21, + -17, + -17, + -15, + -12, + -12, + -12, + -12, + -9, + -7, + -6, + -5, + -3, + -3, + -2, + 0, + 0, + 1, + 3, + 7, + 6, + 4, + 6, + 7, + 8, + 11, + 10, + 10, + 13, + 15, + 14, + 13, + 18, + 20, + 18, + 19, + 21, + 23, + 24, + 23, + 22, + 24, + 26, + 26, + 26, + 27, + 25, + 23, + 25, + 27, + 28, + 28, + 28, + 23, + 19, + 23, + 24, + 20, + 20, + 21, + 15, + 13, + 15, + 16, + 14, + 11, + 8, + 7, + 8, + 11, + 11, + 6, + 4, + 8, + 7, + 6, + 7, + 6, + 4, + 7, + 13, + 12, + 7, + 8, + 8, + 4, + 1, + 1, + 1, + 2, + -4, + -12, + -18, + -24, + -25, + -25, + -32, + -41, + -55, + -59, + -61, + -75, + -87, + -96, + -109, + -122, + -133, + -141, + -148, + -157, + -168, + -180, + -191, + -198, + -202, + -207, + -206, + -207, + -211, + -211, + -208, + -203, + -189, + -171, + -153, + -132, + -114, + -96, + -75, + -54, + -30, + -5, + 19, + 43, + 61, + 77, + 93, + 106, + 123, + 143, + 161, + 182, + 198, + 202, + 201, + 209, + 229, + 242, + 240, + 235, + 239, + 249, + 258, + 255, + 242, + 233, + 245, + 268, + 278, + 256, + 223, + 223, + 253, + 263, + 235, + 198, + 178, + 188, + 215, + 230, + 200, + 143, + 113, + 128, + 158, + 158, + 128, + 99, + 90, + 82, + 70, + 56, + 32, + 7, + 14, + 46, + 36, + -23, + -71, + -76, + -54, + -36, + -39, + -74, + -118, + -134, + -122, + -101, + -104, + -129, + -164, + -174, + -129, + -86, + -109, + -184, + -219, + -191, + -147, + -141, + -183, + -249, + -290, + -269, + -236, + -266, + -346, + -394, + -366, + -325, + -353, + -431, + -472, + -406, + -313, + -316, + -398, + -449, + -401, + -287, + -194, + -164, + -193, + -245, + -212, + -55, + 75, + 67, + 26, + 67, + 165, + 237, + 269, + 293, + 319, + 333, + 368, + 414, + 432, + 463, + 488, + 448, + 404, + 391, + 377, + 361, + 365, + 376, + 308, + 197, + 150, + 129, + 73, + 53, + 91, + 43, + -107, + -165, + -54, + 1, + -148, + -312, + -273, + -125, + -62, + -128, + -258, + -294, + -141, + 70, + 57, + -217, + -378, + -145, + 198, + 289, + 169, + -47, + -219, + -101, + 264, + 458, + 217, + -163, + -199, + 13, + 121, + 101, + -51, + -293, + -319, + -62, + 24, + -274, + -474, + -296, + -170, + -336, + -422, + -285, + -248, + -302, + -130, + 98, + -11, + -257, + -146, + 184, + 278, + 264, + 331, + 192, + -35, + 235, + 805, + 830, + 315, + 82, + 322, + 503, + 522, + 619, + 557, + 242, + 163, + 399, + 507, + 489, + 618, + 602, + 156, + -164, + 112, + 476, + 406, + 94, + -154, + -242, + -132, + 56, + 5, + -325, + -566, + -527, + -478, + -624, + -692, + -561, + -551, + -744, + -836, + -671, + -520, + -626, + -736, + -647, + -581, + -639, + -687, + -702, + -739, + -665, + -383, + -236, + -414, + -513, + -321, + -114, + -43, + 32, + 65, + -98, + -236, + 34, + 608, + 924, + 680, + 218, + 56, + 329, + 847, + 1214, + 1006, + 341, + 11, + 340, + 667, + 553, + 353, + 355, + 415, + 416, + 364, + 257, + 108, + 6, + 113, + 293, + 233, + 46, + 4, + 25, + -10, + -12, + 55, + 40, + -65, + -56, + -26, + -101, + -61, + 143, + 229, + 78, + -161, + -210, + 103, + 424, + 377, + 86, + -274, + -491, + -328, + -37, + 60, + 128, + 188, + -105, + -625, + -823, + -464, + 138, + 389, + 111, + -343, + -526, + -306, + 13, + 205, + 250, + -35, + -554, + -764, + -498, + -42, + 167, + -210, + -639, + -448, + -101, + -110, + -171, + -74, + -39, + 47, + 424, + 616, + 324, + 98, + 367, + 853, + 942, + 416, + -184, + -130, + 339, + 472, + 369, + 239, + -165, + -418, + 101, + 742, + 659, + 325, + 365, + 476, + 233, + -14, + 270, + 785, + 719, + -29, + -533, + -220, + 237, + 305, + 179, + -190, + -644, + -610, + -380, + -526, + -601, + -237, + 48, + -36, + -124, + -49, + -6, + 23, + 117, + 55, + -199, + -428, + -512, + -338, + -238, + -424, + -323, + -135, + -464, + -657, + -189, + 100, + -379, + -964, + -893, + -346, + -64, + -322, + -650, + -480, + 32, + 238, + 201, + 386, + 616, + 611, + 400, + 195, + 357, + 842, + 1051, + 832, + 712, + 829, + 1070, + 1307, + 1081, + 551, + 363, + 544, + 623, + 239, + -374, + -609, + -230, + 375, + 486, + -52, + -446, + -270, + 181, + 645, + 601, + -135, + -654, + -256, + 567, + 840, + 380, + -54, + 18, + 334, + 386, + 21, + -214, + 83, + 243, + -316, + -937, + -1074, + -1006, + -896, + -674, + -424, + -331, + -354, + -380, + -481, + -392, + 80, + 358, + 171, + -170, + -624, + -796, + -130, + 706, + 803, + 381, + 152, + 367, + 620, + 685, + 655, + 347, + 36, + 180, + 417, + 412, + 358, + 288, + 189, + 150, + 16, + -240, + -428, + -428, + -266, + -335, + -819, + -1150, + -946, + -587, + -437, + -580, + -961, + -1218, + -1065, + -704, + -431, + -350, + -315, + -214, + -162, + -81, + 26, + -8, + -52, + -117, + -226, + -40, + 285, + 241, + -2, + -69, + 57, + 207, + 81, + -144, + -69, + 65, + 84, + 49, + -168, + -248, + 126, + 502, + 472, + 192, + 120, + 442, + 667, + 551, + 512, + 634, + 814, + 1014, + 1098, + 1156, + 1112, + 974, + 1144, + 1330, + 1099, + 825, + 847, + 877, + 555, + 2, + -243, + -102, + -196, + -471, + -377, + -235, + -439, + -622, + -547, + -470, + -495, + -431, + -197, + -21, + 21, + -9, + -246, + -438, + -238, + -31, + 0, + 96, + 137, + -25, + -211, + -181, + -149, + -350, + -368, + -33, + 21, + -308, + -323, + 32, + 379, + 605, + 531, + 85, + -374, + -367, + 9, + 277, + 147, + -356, + -698, + -494, + -140, + -126, + -354, + -549, + -673, + -642, + -428, + -269, + -273, + -246, + -216, + -349, + -323, + -16, + 32, + -387, + -742, + -662, + -434, + -223, + 41, + 140, + -58, + -227, + -80, + 93, + 20, + -166, + -360, + -536, + -555, + -305, + -33, + -23, + -86, + -75, + -9, + 82, + -1, + -156, + 24, + 532, + 916, + 956, + 835, + 901, + 1127, + 1279, + 1417, + 1435, + 1144, + 822, + 862, + 1214, + 1352, + 1001, + 611, + 539, + 532, + 369, + 189, + 170, + 308, + 465, + 430, + 232, + 64, + 14, + 51, + -37, + -244, + -321, + -276, + -144, + 57, + 77, + -215, + -467, + -335, + -186, + -245, + -133, + -81, + -588, + -1130, + -959, + -520, + -631, + -1122, + -1270, + -971, + -873, + -1118, + -1157, + -1078, + -1296, + -1365, + -1010, + -873, + -1138, + -1061, + -379, + 89, + 51, + 177, + 372, + 185, + -14, + 63, + 197, + 125, + -123, + -60, + 243, + 195, + 88, + 201, + 115, + -63, + -12, + -79, + -492, + -751, + -489, + 49, + 163, + -293, + -424, + -52, + 229, + 302, + 212, + 217, + 315, + 70, + -207, + -210, + -173, + 129, + 619, + 556, + 213, + 181, + 170, + 112, + 167, + 322, + 451, + 206, + -136, + 58, + 426, + 526, + 524, + 394, + 387, + 568, + 481, + 297, + 164, + 8, + 263, + 664, + 777, + 943, + 989, + 934, + 1283, + 1495, + 1153, + 861, + 738, + 582, + 614, + 692, + 655, + 629, + 432, + 127, + -119, + -338, + -313, + -138, + -204, + -561, + -994, + -1168, + -948, + -700, + -658, + -788, + -1053, + -1027, + -684, + -566, + -528, + -355, + -335, + -323, + -28, + 206, + 87, + 56, + 387, + 585, + 296, + 24, + 261, + 492, + 248, + -132, + -469, + -674, + -502, + -235, + -255, + -517, + -847, + -1038, + -965, + -707, + -630, + -767, + -639, + -298, + -193, + -290, + -310, + -118, + 74, + -77, + -337, + -324, + -120, + 187, + 323, + -72, + -552, + -454, + -14, + 29, + -427, + -803, + -735, + -586, + -762, + -918, + -783, + -649, + -723, + -857, + -786, + -626, + -591, + -417, + -83, + 167, + 262, + 49, + -161, + 157, + 842, + 1298, + 1356, + 1206, + 1041, + 1194, + 1461, + 1323, + 1070, + 1221, + 1687, + 2051, + 2002, + 1673, + 1464, + 1550, + 1851, + 1907, + 1531, + 1327, + 1399, + 1342, + 1287, + 1264, + 1152, + 1030, + 878, + 716, + 601, + 454, + 264, + 264, + 352, + 151, + -193, + -296, + -161, + -93, + -215, + -423, + -617, + -668, + -547, + -416, + -464, + -807, + -1175, + -1174, + -1045, + -1076, + -1023, + -829, + -710, + -745, + -1069, + -1443, + -1417, + -1099, + -939, + -1165, + -1307, + -1056, + -843, + -638, + -304, + -190, + -334, + -578, + -770, + -705, + -675, + -947, + -957, + -565, + -437, + -617, + -843, + -1015, + -813, + -489, + -584, + -904, + -1054, + -797, + -229, + -26, + -208, + -66, + 398, + 710, + 644, + 390, + 413, + 726, + 992, + 1204, + 1337, + 1234, + 1104, + 1038, + 1001, + 1043, + 982, + 847, + 885, + 1024, + 1098, + 1138, + 1108, + 1038, + 966, + 885, + 882, + 878, + 929, + 1005, + 944, + 1008, + 1284, + 1415, + 1289, + 1007, + 760, + 812, + 947, + 806, + 455, + 111, + -72, + -290, + -611, + -626, + -559, + -765, + -1034, + -1375, + -1632, + -1565, + -1588, + -1728, + -1585, + -1477, + -1547, + -1533, + -1371, + -1103, + -995, + -1090, + -1102, + -947, + -686, + -403, + -295, + -250, + -107, + -86, + -171, + -150, + 12, + 234, + 283, + 185, + 300, + 461, + 393, + 382, + 434, + 378, + 306, + 202, + 195, + 253, + -8, + -307, + -105, + 264, + 342, + 212, + 34, + -57, + 78, + 435, + 571, + 180, + -165, + -51, + 339, + 705, + 683, + 464, + 658, + 958, + 825, + 579, + 465, + 390, + 241, + 61, + 202, + 429, + 128, + -122, + 241, + 406, + 39, + -167, + -60, + 15, + -31, + -68, + 146, + 402, + 344, + 227, + 208, + 87, + -25, + -31, + -66, + -169, + -249, + -87, + 75, + -181, + -438, + -249, + 49, + 87, + -40, + -16, + 53, + -86, + -74, + 98, + 78, + 110, + 169, + -84, + -323, + -251, + -102, + -172, + -513, + -750, + -675, + -568, + -587, + -583, + -523, + -450, + -302, + -245, + -356, + -480, + -590, + -495, + -183, + -105, + -191, + -215, + -308, + -206, + 39, + 4, + -77, + -21, + 74, + 186, + 218, + 356, + 611, + 489, + 83, + 13, + 246, + 371, + 348, + 240, + 61, + -66, + -107, + -170, + -205, + -74, + 200, + 277, + 45, + -11, + 180, + 263, + 100, + -74, + 102, + 246, + 6, + -154, + -162, + -197, + -128, + -189, + -227, + -49, + -238, + -490, + -333, + -188, + 1, + 215, + 150, + 144, + 128, + -33, + 187, + 532, + 676, + 911, + 773, + 283, + 351, + 673, + 620, + 349, + 105, + 205, + 425, + 325, + 295, + 372, + 340, + 511, + 628, + 394, + 224, + 187, + 91, + -174, + -556, + -482, + -37, + -9, + -226, + -382, + -568, + -466, + -208, + -241, + -426, + -656, + -814, + -788, + -902, + -1065, + -946, + -860, + -896, + -831, + -744, + -672, + -685, + -743, + -723, + -783, + -813, + -570, + -341, + -239, + -57, + 137, + 348, + 576, + 593, + 454, + 429, + 503, + 449, + 238, + 173, + 350, + 423, + 419, + 530, + 501, + 272, + 156, + 207, + 295, + 404, + 568, + 676, + 419, + 30, + 113, + 463, + 550, + 473, + 349, + 126, + 33, + 144, + 207, + 193, + 267, + 304, + 81, + -252, + -401, + -368, + -347, + -404, + -452, + -408, + -272, + -40, + 234, + 281, + 48, + -72, + -18, + 54, + 208, + 309, + 285, + 245, + 164, + 38, + -20, + 148, + 430, + 563, + 655, + 679, + 453, + 300, + 319, + 219, + 25, + -15, + 54, + -117, + -444, + -431, + -135, + -147, + -468, + -667, + -722, + -593, + -301, + -217, + -428, + -642, + -598, + -400, + -422, + -602, + -628, + -554, + -509, + -501, + -541, + -488, + -250, + -129, + -284, + -441, + -358, + -161, + -82, + 4, + 134, + 157, + 290, + 516, + 582, + 702, + 859, + 871, + 858, + 759, + 615, + 616, + 754, + 839, + 725, + 464, + 259, + 187, + 127, + 150, + 280, + 238, + 92, + 78, + 5, + -86, + 6, + 67, + -14, + -92, + -143, + -211, + -89, + 213, + 300, + 107, + -91, + -154, + -153, + -238, + -355, + -314, + -227, + -168, + -92, + -142, + -219, + -156, + -47, + 53, + -15, + -195, + -161, + -186, + -382, + -395, + -297, + -238, + -240, + -390, + -502, + -336, + -97, + -29, + -116, + -290, + -289, + -67, + 74, + 112, + 119, + 182, + 358, + 382, + 315, + 341, + 290, + 218, + 190, + 101, + -51, + -168, + -132, + -41, + -39, + -15, + 104, + 186, + 151, + 68, + 89, + 154, + 67, + 10, + 143, + 120, + -185, + -382, + -365, + -263, + -145, + -111, + -159, + -190, + -53, + 151, + 177, + 179, + 384, + 553, + 502, + 490, + 572, + 600, + 573, + 442, + 119, + -212, + -260, + -166, + -318, + -506, + -413, + -279, + -285, + -354, + -390, + -278, + -142, + -85, + -18, + -19, + -121, + -143, + -32, + 88, + 118, + 42, + -96, + -187, + -167, + -113, + -172, + -270, + -256, + -178, + -192, + -249, + -128, + 103, + 132, + -47, + -147, + -104, + -56, + -9, + 45, + 35, + 109, + 315, + 381, + 326, + 336, + 457, + 667, + 786, + 675, + 489, + 460, + 569, + 595, + 470, + 303, + 272, + 448, + 620, + 545, + 226, + -92, + -128, + 91, + 172, + -98, + -385, + -378, + -264, + -284, + -362, + -314, + -148, + -72, + -198, + -350, + -353, + -344, + -389, + -353, + -292, + -327, + -413, + -473, + -519, + -588, + -577, + -546, + -737, + -989, + -1030, + -997, + -1010, + -861, + -683, + -731, + -690, + -419, + -197, + -47, + 112, + 167, + 74, + 41, + 176, + 309, + 438, + 671, + 781, + 793, + 868, + 904, + 991, + 1099, + 987, + 812, + 816, + 869, + 766, + 605, + 633, + 728, + 592, + 424, + 460, + 405, + 170, + 75, + 30, + -105, + -58, + 63, + -58, + -242, + -359, + -415, + -255, + -44, + -127, + -266, + -191, + -187, + -296, + -273, + -260, + -341, + -345, + -324, + -384, + -467, + -421, + -233, + -125, + -227, + -341, + -256, + -168, + -217, + -249, + -302, + -447, + -425, + -274, + -289, + -299, + -229, + -275, + -272, + -103, + -57, + -117, + -106, + -162, + -256, + -184, + -31, + 51, + 69, + 31, + -19, + 72, + 256, + 318, + 331, + 254, + 28, + -7, + 121, + 48, + -64, + 58, + 183, + 152, + 161, + 201, + 167, + 190, + 287, + 278, + 157, + 56, + 103, + 332, + 460, + 299, + 166, + 238, + 308, + 374, + 508, + 509, + 373, + 275, + 270, + 298, + 229, + 185, + 192, + 23, + -160, + -80, + 67, + 31, + -170, + -378, + -384, + -330, + -500, + -648, + -615, + -686, + -716, + -510, + -510, + -771, + -752, + -475, + -434, + -556, + -480, + -403, + -515, + -464, + -255, + -177, + -105, + 29, + 95, + 152, + 210, + 190, + 180, + 279, + 408, + 325, + 225, + 462, + 607, + 537, + 759, + 1022, + 973, + 945, + 964, + 846, + 818, + 952, + 907, + 584, + 313, + 302, + 428, + 533, + 479, + 260, + 178, + 262, + 185, + 18, + -77, + -263, + -370, + -208, + -240, + -589, + -739, + -572, + -444, + -405, + -357, + -475, + -738, + -771, + -542, + -441, + -529, + -651, + -803, + -823, + -556, + -285, + -227, + -233, + -202, + -168, + -110, + -78, + -220, + -302, + -56, + 129, + -60, + -149, + 54, + 130, + 169, + 324, + 231, + 24, + 89, + 269, + 320, + 262, + 231, + 225, + 138, + 67, + 153, + 310, + 399, + 269, + -21, + -197, + -183, + -59, + 144, + 234, + -13, + -274, + -168, + 32, + -37, + -277, + -417, + -441, + -416, + -324, + -312, + -467, + -540, + -373, + -166, + -161, + -297, + -365, + -341, + -246, + -69, + 81, + 99, + -3, + 11, + 305, + 540, + 449, + 394, + 586, + 667, + 606, + 685, + 665, + 425, + 410, + 585, + 509, + 360, + 424, + 538, + 583, + 482, + 250, + 159, + 310, + 423, + 217, + -131, + -280, + -204, + -51, + -12, + -204, + -338, + -232, + -143, + -201, + -306, + -374, + -336, + -229, + -257, + -453, + -576, + -497, + -379, + -326, + -302, + -372, + -504, + -453, + -229, + -133, + -226, + -328, + -326, + -261, + -151, + -6, + 97, + 143, + 164, + 143, + 138, + 267, + 433, + 500, + 470, + 297, + 143, + 279, + 504, + 556, + 475, + 333, + 233, + 225, + 228, + 198, + 128, + 24, + -17, + 4, + -55, + -187, + -251, + -213, + -119, + -94, + -214, + -357, + -349, + -246, + -195, + -183, + -261, + -440, + -533, + -476, + -341, + -213, + -170, + -220, + -299, + -220, + -8, + 51, + -11, + 19, + 172, + 292, + 189, + 9, + -6, + 102, + 238, + 384, + 477, + 448, + 353, + 304, + 354, + 473, + 543, + 400, + 229, + 275, + 380, + 425, + 415, + 371, + 398, + 460, + 377, + 202, + 154, + 199, + 110, + -123, + -365, + -524, + -524, + -360, + -134, + -47, + -182, + -348, + -453, + -542, + -503, + -376, + -398, + -521, + -595, + -621, + -560, + -439, + -284, + -115, + -80, + -123, + -57, + 28, + -15, + -60, + -9, + 47, + 119, + 203, + 288, + 435, + 571, + 635, + 706, + 750, + 627, + 436, + 345, + 330, + 398, + 460, + 368, + 213, + 127, + 140, + 215, + 202, + 58, + -99, + -244, + -387, + -470, + -527, + -637, + -754, + -791, + -768, + -742, + -739, + -735, + -704, + -649, + -552, + -479, + -491, + -494, + -454, + -433, + -422, + -398, + -315, + -115, + 75, + 175, + 244, + 307, + 360, + 398, + 460, + 532, + 529, + 446, + 422, + 497, + 541, + 504, + 541, + 702, + 803, + 744, + 645, + 621, + 727, + 877, + 873, + 734, + 593, + 513, + 523, + 516, + 412, + 336, + 334, + 274, + 199, + 163, + 123, + 125, + 117, + 107, + 140, + 72, + -73, + -114, + -68, + -15, + 13, + -122, + -338, + -367, + -325, + -386, + -497, + -608, + -634, + -546, + -477, + -427, + -377, + -412, + -464, + -436, + -343, + -276, + -327, + -390, + -313, + -149, + -17, + 2, + -93, + -146, + -104, + -76, + -87, + -131, + -224, + -280, + -194, + -46, + 12, + -76, + -189, + -151, + 18, + 160, + 200, + 99, + -81, + -149, + -95, + -31, + -6, + -45, + -93, + -97, + -71, + 0, + 73, + 34, + -82, + -129, + -102, + -84, + -96, + -107, + -69, + -5, + 6, + 18, + 48, + 35, + 27, + 32, + -4, + -71, + -30, + 119, + 205, + 266, + 352, + 325, + 237, + 282, + 352, + 358, + 342, + 265, + 203, + 200, + 159, + 120, + 159, + 195, + 185, + 133, + 37, + 20, + 152, + 312, + 363, + 316, + 255, + 251, + 259, + 211, + 160, + 86, + -4, + -30, + -79, + -154, + -213, + -271, + -243, + -146, + -147, + -211, + -283, + -319, + -219, + -157, + -207, + -237, + -252, + -245, + -136, + 0, + 42, + -22, + -108, + -82, + 34, + 130, + 179, + 152, + 98, + 105, + 110, + 116, + 180, + 175, + 66, + -9, + -9, + 36, + 82, + 75, + 12, + -39, + -14, + 23, + 1, + 12, + 31, + -61, + -155, + -184, + -158, + -86, + -60, + -67, + -63, + -84, + -100, + -81, + -115, + -171, + -157, + -150, + -179, + -191, + -209, + -245, + -217, + -128, + -54, + -42, + -73, + -100, + -88, + -10, + 104, + 199, + 249, + 227, + 201, + 204, + 151, + 83, + 75, + 87, + 84, + 67, + 34, + 18, + 44, + 110, + 218, + 275, + 232, + 190, + 209, + 263, + 294, + 256, + 174, + 108, + 37, + -54, + -110, + -129, + -179, + -293, + -360, + -339, + -282, + -190, + -135, + -188, + -239, + -234, + -227, + -182, + -127, + -89, + -51, + -73, + -136, + -151, + -85, + 0, + 72, + 129, + 122, + 65, + 44, + 103, + 202, + 272, + 252, + 170, + 148, + 167, + 152, + 130, + 127, + 79, + 14, + 70, + 157, + 142, + 109, + 70, + -25, + -57, + -6, + 46, + 98, + 135, + 135, + 82, + 16, + 10, + 68, + 87, + -20, + -120, + -116, + -98, + -102, + -129, + -204, + -271, + -282, + -252, + -216, + -215, + -221, + -156, + -70, + -66, + -120, + -156, + -146, + -126, + -84, + -15, + -21, + -76, + -8, + 131, + 146, + 86, + 42, + 12, + 44, + 110, + 169, + 171, + 91, + 68, + 173, + 262, + 248, + 160, + 36, + -90, + -109, + -24, + -12, + -57, + -64, + -78, + -89, + -75, + -87, + -101, + -82, + -72, + -76, + -81, + -63, + -34, + -4, + 61, + 87, + 46, + 23, + -1, + -8, + 40, + 63, + 46, + 45, + 39, + 14, + -11, + -25, + -16, + 36, + 78, + 85, + 110, + 120, + 132, + 189, + 228, + 217, + 154, + 89, + 57, + 14, + -14, + -6, + 0, + 13, + 8, + -50, + -68, + -60, + -107, + -140, + -126, + -122, + -151, + -147, + -118, + -105, + -85, + -83, + -100, + -139, + -195, + -194, + -168, + -183, + -173, + -148, + -166, + -168, + -123, + -59, + -11, + 20, + 64, + 98, + 80, + 58, + 83, + 111, + 143, + 176, + 171, + 152, + 146, + 165, + 174, + 143, + 93, + 30, + 5, + 21, + 42, + 35, + -37, + -94, + -61, + -12, + -5, + -27, + -58, + -85, + -81, + -11, + 79, + 65, + -14, + -17, + 15, + -4, + -2, + 39, + 20, + -29, + -19, + 3, + -11, + -39, + -62, + -43, + -34, + -60, + -77, + -119, + -163, + -128, + -5, + 87, + 73, + 51, + 116, + 189, + 217, + 240, + 234, + 177, + 192, + 295, + 344, + 313, + 263, + 236, + 240, + 230, + 179, + 99, + 19, + -25, + -16, + -9, + -35, + -66, + -53, + -16, + -40, + -70, + -81, + -102, + -86, + -87, + -156, + -225, + -228, + -145, + -52, + -22, + -57, + -171, + -255, + -247, + -208, + -165, + -187, + -242, + -275, + -261, + -168, + -75, + -13, + 8, + -62, + -125, + -136, + -133, + -81, + -11, + -17, + -80, + -115, + -103, + -27, + 71, + 134, + 137, + 44, + -48, + -24, + 69, + 156, + 194, + 175, + 112, + 55, + 54, + 101, + 148, + 157, + 142, + 100, + 44, + 27, + 63, + 106, + 107, + 89, + 67, + 37, + 17, + 30, + 63, + 69, + 61, + 21, + -37, + -55, + -72, + -53, + -26, + -53, + -77, + -87, + -109, + -119, + -80, + -36, + -29, + -38, + -48, + -57, + -65, + -16, + 52, + 83, + 83, + 24, + -27, + -14, + 9, + 27, + 52, + 50, + 45, + 90, + 132, + 117, + 75, + 16, + -1, + 60, + 95, + 55, + 25, + 26, + 20, + 61, + 119, + 89, + 1, + -61, + -68, + -46, + -36, + -40, + -39, + -49, + -58, + -16, + 30, + 13, + -12, + 18, + 35, + 6, + 3, + 30, + 22, + 25, + 52, + 32, + 12, + 9, + -5, + -16, + -25, + -33, + -38, + -44, + -76, + -118, + -118, + -96, + -54, + -3, + 9, + -31, + -82, + -84, + -35, + 18, + 25, + -26, + -72, + -48, + 8, + 25, + 8, + -20, + -66, + -105, + -102, + -80, + -73, + -79, + -80, + -70, + -59, + -55, + -82, + -113, + -85, + -51, + -59, + -57, + -38, + -13, + -7, + -18, + -6, + 20, + 51, + 55, + 18, + -8, + -7, + 24, + 78, + 119, + 137, + 135, + 139, + 153, + 144, + 155, + 179, + 166, + 128, + 56, + 8, + 38, + 85, + 94, + 72, + 20, + -32, + -9, + 25, + 17, + -15, + -84, + -123, + -106, + -82, + -62, + -60, + -43, + -4, + -12, + -45, + -68, + -108, + -100, + -47, + -49, + -64, + -50, + -9, + 37, + 59, + 68, + 62, + 53, + 49, + 25, + 13, + 32, + 40, + 60, + 109, + 82, + 18, + 10, + -1, + 21, + 102, + 111, + 40, + -10, + -9, + 20, + 31, + 0, + -51, + -108, + -135, + -89, + -21, + 1, + -54, + -125, + -129, + -113, + -144, + -205, + -227, + -167, + -118, + -114, + -100, + -71, + 5, + 34, + -51, + -119, + -120, + -72, + 10, + 56, + 51, + 58, + 65, + 98, + 135, + 84, + 20, + -3, + -1, + 57, + 135, + 137, + 90, + 88, + 107, + 102, + 45, + -4, + 9, + 48, + 95, + 99, + 65, + 42, + 44, + 78, + 80, + 29, + 11, + 39, + 27, + 0, + 7, + 19, + 10, + -45, + -99, + -86, + -77, + -74, + -57, + -74, + -84, + -92, + -134, + -114, + -65, + -73, + -76, + -96, + -105, + -50, + -31, + -17, + 17, + 9, + 18, + 62, + 75, + 55, + 63, + 76, + 61, + 61, + 80, + 103, + 107, + 110, + 131, + 134, + 120, + 94, + 66, + 70, + 78, + 59, + 52, + 57, + 53, + 72, + 76, + 31, + -18, + -53, + -57, + -35, + -17, + -9, + -27, + -34, + -7, + -17, + -26, + -13, + -60, + -86, + -53, + -42, + -36, + -36, + -46, + -13, + 19, + -16, + -47, + -15, + 11, + -9, + -18, + -26, + -24, + 14, + 8, + -53, + -54, + 15, + 43, + 15, + -9, + -5, + 5, + -12, + -40, + -57, + -74, + -94, + -105, + -91, + -20, + 30, + -10, + -50, + -58, + -52, + -42, + -47, + -54, + -61, + -83, + -64, + -30, + -3, + 31, + 9, + -35, + -43, + -31, + 6, + 50, + 54, + 55, + 67, + 53, + 43, + 30, + 27, + 62, + 37, + -26, + -52, + -54, + -29, + 3, + -12, + -23, + 11, + 26, + 23, + 31, + 57, + 66, + 46, + 32, + 35, + 83, + 124, + 111, + 124, + 157, + 143, + 101, + 80, + 60, + 27, + 11, + 21, + 22, + 9, + -4, + -26, + -41, + -35, + -50, + -103, + -138, + -116, + -90, + -89, + -90, + -79, + -74, + -58, + -18, + -12, + -29, + -36, + -17, + 22, + 30, + -1, + -8, + 8, + 10, + 19, + 31, + 36, + 38, + 41, + 28, + -7, + -14, + -6, + -20, + -30, + -11, + -2, + -9, + 0, + 25, + 56, + 78, + 68, + 40, + 34, + 47, + 50, + 40, + 37, + 26, + 28, + 53, + 61, + 57, + 25, + -35, + -75, + -65, + -48, + -65, + -81, + -67, + -53, + -41, + 3, + 19, + -3, + -9, + -2, + -1, + -24, + -36, + -23, + -26, + -29, + -9, + 0, + -15, + -17, + -9, + 12, + 50, + 45, + 14, + 19, + 37, + 24, + 9, + 16, + 13, + -16, + -19, + 3, + -3, + -12, + -10, + -23, + -43, + -47, + -38, + -46, + -44, + -7, + 3, + -19, + -13, + -26, + -52, + -29, + -19, + -32, + 0, + 11, + -26, + -24, + -20, + -41, + -30, + -24, + -53, + -67, + -26, + 23, + 20, + 9, + 6, + -8, + 3, + 16, + 7, + 3, + -5, + 2, + 33, + 53, + 72, + 94, + 86, + 69, + 96, + 118, + 95, + 91, + 78, + 32, + 26, + 48, + 48, + 37, + 21, + 7, + -6, + -8, + 8, + 1, + -17, + -2, + 18, + 1, + -28, + -51, + -84, + -93, + -74, + -46, + -18, + -19, + -31, + -10, + 10, + 10, + 7, + -5, + -30, + -39, + -28, + -9, + 10, + 17, + 11, + 14, + 20, + -1, + 2, + 18, + 7, + 15, + 40, + 40, + 32, + 27, + 23, + 31, + 43, + 33, + 7, + -3, + 18, + 51, + 53, + 31, + 21, + 14, + 16, + 14, + 4, + 11, + 16, + 1, + -24, + -38, + -33, + -27, + -50, + -74, + -70, + -60, + -54, + -44, + -22, + -22, + -43, + -33, + -16, + -35, + -36, + -18, + -27, + -42, + -46, + -36, + -17, + -15, + -22, + -21, + -20, + -2, + 15, + 12, + 22, + 27, + 22, + 41, + 57, + 60, + 63, + 54, + 56, + 65, + 62, + 68, + 58, + 34, + 53, + 70, + 58, + 60, + 51, + 33, + 41, + 39, + 16, + -3, + -16, + -18, + -15, + -18, + -32, + -76, + -85, + -62, + -82, + -87, + -68, + -84, + -75, + -40, + -48, + -55, + -45, + -42, + -24, + -14, + -1, + 27, + 23, + -1, + -2, + 12, + 15, + 32, + 55, + 52, + 55, + 82, + 81, + 58, + 62, + 59, + 37, + 24, + 20, + 17, + 18, + 19, + 15, + 14, + 5, + -18, + -27, + -20, + -19, + -34, + -39, + -29, + -30, + -27, + -27, + -48, + -52, + -54, + -77, + -48, + -18, + -36, + -34, + -13, + -21, + -38, + -28, + -15, + -7, + -6, + -20, + -18, + 2, + 4, + -11, + -5, + 7, + 1, + 1, + 12, + -2, + -17, + 7, + 15, + 2, + 15, + 34, + 48, + 78, + 94, + 82, + 66, + 66, + 64, + 47, + 44, + 57, + 64, + 74, + 65, + 34, + 26, + 31, + 32, + 33, + 18, + 5, + -1, + -18, + -22, + -31, + -54, + -37, + -32, + -74, + -89, + -77, + -73, + -65, + -72, + -75, + -39, + -21, + -31, + -31, + -24, + -19, + -8, + -4, + 7, + 26, + 22, + 15, + 13, + 11, + 28, + 47, + 42, + 35, + 28, + 5, + 18, + 55, + 55, + 45, + 44, + 18, + 9, + 18, + -2, + -5, + 6, + -15, + -16, + -12, + -20, + -4, + 4, + -15, + -18, + -10, + -5, + -2, + -16, + -24, + -14, + -7, + -14, + -33, + -33, + -20, + -17, + -17, + -18, + -30, + -37, + -35, + -34, + -13, + -3, + -28, + -28, + -10, + -21, + -17, + -4, + -12, + -16, + -20, + -27, + -16, + -8, + -4, + 14, + 24, + 11, + 17, + 30, + 27, + 14, + 7, + 28, + 30, + 22, + 45, + 47, + 23, + 31, + 23, + -5, + 10, + 17, + -5, + 2, + 15, + 9, + 20, + 29, + 11, + -9, + -8, + 8, + 10, + -1, + -14, + -30, + -30, + -8, + -9, + -20, + -17, + -17, + -12, + 1, + 6, + -7, + -18, + -6, + 10, + -6, + -7, + 29, + 35, + 21, + 16, + 9, + 25, + 44, + 26, + 21, + 34, + 28, + 40, + 41, + 9, + -2, + 1, + 12, + 34, + 18, + -12, + -10, + -16, + -29, + -24, + -25, + -20, + -17, + -35, + -29, + -12, + -29, + -39, + -32, + -30, + -17, + -12, + -28, + -20, + -5, + -4, + 7, + 14, + 10, + 3, + -3, + 0, + 19, + 27, + 4, + -21, + -18, + -7, + -4, + 0, + 1, + -6, + -17, + -30, + -24, + -11, + -9, + 0, + -1, + 0, + -3, + -12, + 1, + 15, + -2, + 3, + 16, + -3, + -8, + 7, + 3, + 13, + 32, + 23, + 10, + -6, + -11, + 8, + 4, + -12, + -9, + 3, + 12, + -2, + -31, + -36, + -33, + -37, + -17, + -5, + -20, + -14, + 4, + 5, + 4, + 6, + 17, + 31, + 27, + 23, + 16, + -1, + -4, + 15, + 24, + 21, + 18, + 7, + -7, + -14, + 18, + 41, + 25, + 14, + 13, + 2, + 5, + 12, + 8, + 15, + 10, + 2, + 13, + 10, + 3, + 5, + -1, + 0, + 11, + 10, + 6, + 2, + 7, + 10, + -4, + -3, + 2, + -13, + -4, + 14, + -4, + -17, + -11, + -4, + 8, + 3, + -8, + -1, + -7, + -20, + -4, + 23, + 23, + 8, + 5, + 24, + 21, + -5, + -2, + 7, + -9, + -15, + -8, + -6, + 6, + 2, + -26, + -19, + 1, + -19, + -31, + -27, + -34, + -41, + -47, + -39, + -12, + -12, + -29, + -32, + -41, + -36, + -26, + -36, + -35, + -33, + -29, + -1, + 5, + -13, + -21, + -21, + -3, + 12, + 1, + -7, + -1, + 2, + 12, + 9, + -1, + 15, + 21, + 18, + 25, + 4, + -13, + 5, + 12, + 16, + 33, + 33, + 19, + 21, + 26, + 30, + 30, + 24, + 23, + 19, + 22, + 34, + 39, + 28, + 15, + 14, + 24, + 24, + 18, + 12, + 10, + 4, + 8, + 28, + 29, + 2, + -7, + 6, + 8, + 10, + 2, + -13, + -8, + -2, + 0, + 12, + 13, + -1, + 3, + 21, + 26, + 24, + 17, + 11, + 15, + 19, + 19, + 19, + 11, + 1, + 3, + 3, + 0, + -5, + -11, + -16, + -26, + -18, + 3, + -5, + -17, + 2, + 10, + 6, + 6, + -8, + -11, + 4, + -3, + -17, + -10, + -17, + -37, + -31, + -17, + -26, + -37, + -42, + -53, + -49, + -34, + -40, + -39, + -21, + -17, + -23, + -23, + -25, + -30, + -24, + -13, + -10, + -10, + 1, + 1, + -7, + 7, + 19, + 11, + 4, + -3, + -8, + 1, + 6, + 7, + 25, + 22, + -5, + 3, + 20, + 7, + -1, + 14, + 17, + 18, + 20, + 12, + 25, + 41, + 23, + 19, + 37, + 39, + 21, + 17, + 23, + 17, + 6, + 9, + 15, + 4, + -15, + -8, + 8, + 7, + 1, + -12, + -18, + -14, + -15, + -10, + 0, + -3, + 3, + 13, + -8, + -21, + -8, + -26, + -29, + -1, + -9, + -24, + -19, + -22, + -24, + -18, + -25, + -27, + -28, + -34, + -26, + -9, + -14, + -14, + -8, + -8, + -5, + 4, + 4, + -10, + -12, + -7, + -8, + -10, + -15, + -19, + -10, + -5, + -9, + -9, + -19, + -33, + -27, + -14, + -15, + -14, + -16, + -25, + -10, + 5, + -7, + -11, + 2, + 3, + 7, + 17, + 28, + 33, + 32, + 33, + 39, + 49, + 57, + 63, + 62, + 64, + 67, + 59, + 55, + 67, + 71, + 58, + 53, + 53, + 44, + 38, + 44, + 51, + 51, + 45, + 35, + 34, + 46, + 55, + 48, + 36, + 21, + 3, + -5, + 2, + 7, + 0, + -17, + -30, + -34, + -48, + -62, + -64, + -66, + -66, + -62, + -79, + -90, + -85, + -88, + -88, + -85, + -88, + -103, + -112, + -112, + -102, + -99, + -102, + -103, + -110, + -100, + -80, + -60, + -57, + -68, + -59, + -45, + -35, + -6, + 9, + -3, + 2, + 32, + 45, + 48, + 51, + 40, + 51, + 78, + 85, + 83, + 87, + 94, + 101, + 104, + 105, + 100, + 86, + 82, + 96, + 102, + 96, + 85, + 68, + 63, + 65, + 55, + 50, + 46, + 28, + 32, + 43, + 33, + 30, + 27, + 8, + 18, + 36, + 27, + 20, + 13, + -14, + -19, + 8, + 12, + 0, + -1, + -12, + -24, + -20, + -27, + -39, + -39, + -39, + -44, + -38, + -32, + -42, + -38, + -33, + -43, + -55, + -57, + -60, + -61, + -56, + -57, + -55, + -43, + -46, + -58, + -55, + -50, + -50, + -51, + -48, + -46, + -44, + -36, + -26, + -20, + -13, + -11, + -8, + 1, + 5, + 0, + 8, + 21, + 31, + 42, + 39, + 43, + 56, + 48, + 37, + 45, + 45, + 47, + 52, + 46, + 40, + 26, + 18, + 28, + 30, + 22, + 14, + 0, + -3, + 8, + 0, + -7, + 0, + -10, + -13, + -9, + -13, + -13, + -18, + -33, + -32, + -26, + -37, + -41, + -32, + -26, + -30, + -34, + -31, + -38, + -40, + -24, + -25, + -29, + -15, + -18, + -23, + -4, + 2, + -7, + 0, + 5, + 10, + 22, + 23, + 25, + 31, + 33, + 37, + 38, + 39, + 43, + 46, + 41, + 44, + 46, + 37, + 35, + 46, + 63, + 67, + 52, + 38, + 30, + 35, + 41, + 41, + 41, + 29, + 15, + 16, + 4, + -4, + 3, + -12, + -18, + -13, + -27, + -39, + -47, + -55, + -44, + -43, + -53, + -45, + -36, + -37, + -37, + -38, + -40, + -49, + -57, + -41, + -24, + -28, + -31, + -26, + -20, + -15, + -21, + -23, + -18, + -19, + -14, + -10, + -11, + 1, + -6, + -26, + -14, + -1, + -7, + -10, + -11, + -9, + 0, + -4, + -9, + 3, + 8, + 0, + -2, + 1, + 16, + 20, + 7, + 9, + 10, + 8, + 18, + 12, + 11, + 17, + -6, + -19, + 0, + 0, + -10, + -6, + -12, + -14, + -11, + -9, + -2, + -10, + -19, + -9, + -11, + -4, + 18, + 7, + -3, + 9, + 17, + 23, + 28, + 25, + 19, + 19, + 24, + 33, + 37, + 30, + 28, + 35, + 44, + 43, + 33, + 31, + 30, + 26, + 33, + 39, + 35, + 31, + 27, + 19, + 23, + 24, + 19, + 13, + 0, + 0, + 2, + -7, + -9, + -10, + -13, + -6, + -6, + -23, + -28, + -15, + -9, + -20, + -34, + -30, + -15, + -12, + -11, + -3, + -4, + -4, + 6, + 15, + 9, + -11, + -20, + 3, + 26, + 23, + 1, + -16, + -3, + 12, + 2, + -22, + -36, + -35, + -28, + -20, + -13, + -19, + -38, + -43, + -29, + -11, + -5, + -15, + -37, + -40, + -9, + 12, + -1, + -23, + -30, + -16, + 12, + 21, + -1, + -25, + -21, + 4, + 34, + 55, + 34, + -12, + -11, + 47, + 99, + 107, + 58, + 0, + 8, + 78, + 148, + 151, + 56, + -40, + -2, + 142, + 215, + 99, + -67, + -64, + 76, + 153, + 99, + -21, + -107, + -92, + -1, + 106, + 107, + -123, + -395, + -334, + 60, + 274, + -69, + -597, + -626, + -126, + 238, + 18, + -447, + -577, + -312, + -34, + 20, + -89, + -242, + -332, + -222, + 74, + 262, + 64, + -285, + -232, + 259, + 563, + 294, + -138, + -130, + 312, + 642, + 515, + 189, + 57, + 187, + 415, + 538, + 467, + 277, + 109, + 134, + 334, + 441, + 299, + 59, + -7, + 128, + 228, + 146, + -20, + -99, + -34, + 60, + 24, + -108, + -188, + -147, + -57, + -48, + -142, + -224, + -210, + -144, + -122, + -175, + -212, + -176, + -150, + -199, + -256, + -210, + -100, + -79, + -195, + -298, + -248, + -107, + -48, + -110, + -192, + -224, + -189, + -112, + -40, + -31, + -124, + -238, + -193, + -3, + 87, + -53, + -221, + -165, + 48, + 132, + -2, + -150, + -109, + 61, + 147, + 83, + -20, + -60, + -13, + 85, + 157, + 130, + 17, + -68, + -10, + 147, + 217, + 116, + -20, + -21, + 103, + 200, + 158, + 52, + 35, + 105, + 155, + 132, + 81, + 74, + 110, + 114, + 74, + 48, + 68, + 100, + 77, + 27, + 30, + 48, + 19, + -15, + 7, + 63, + 53, + -56, + -123, + -41, + 81, + 75, + -61, + -154, + -84, + 45, + 68, + -24, + -105, + -76, + 22, + 53, + -13, + -63, + -21, + 54, + 59, + -1, + -34, + 16, + 80, + 81, + 48, + 37, + 61, + 89, + 88, + 101, + 134, + 132, + 100, + 83, + 125, + 188, + 173, + 101, + 95, + 172, + 214, + 149, + 68, + 94, + 181, + 177, + 103, + 83, + 132, + 165, + 122, + 83, + 140, + 191, + 153, + 92, + 106, + 198, + 226, + 138, + 85, + 146, + 215, + 187, + 110, + 77, + 115, + 146, + 115, + 91, + 96, + 78, + 27, + -3, + 42, + 102, + 71, + -23, + -46, + 30, + 95, + 63, + -18, + -25, + 77, + 174, + 138, + 13, + -25, + 96, + 218, + 181, + 34, + -70, + -45, + 17, + 2, + -67, + -174, + -346, + -516, + -553, + -446, + -455, + -789, + -1213, + -1308, + -1046, + -878, + -1179, + -1691, + -1839, + -1528, + -1219, + -1292, + -1623, + -1772, + -1538, + -1147, + -921, + -951, + -1038, + -929, + -549, + -95, + 155, + 127, + 97, + 387, + 931, + 1339, + 1380, + 1234, + 1276, + 1661, + 2102, + 2223, + 2027, + 1848, + 1942, + 2198, + 2295, + 2119, + 1856, + 1725, + 1745, + 1752, + 1601, + 1335, + 1102, + 993, + 952, + 830, + 570, + 286, + 139, + 133, + 85, + -135, + -436, + -638, + -645, + -571, + -620, + -835, + -1064, + -1151, + -1069, + -951, + -964, + -1109, + -1209, + -1162, + -1044, + -961, + -944, + -977, + -1001, + -912, + -687, + -517, + -623, + -887, + -897, + -469, + 10, + -35, + -590, + -934, + -545, + 184, + 427, + -53, + -619, + -563, + 40, + 489, + 339, + -128, + -306, + -6, + 403, + 497, + 232, + -55, + 0, + 388, + 704, + 584, + 145, + -76, + 260, + 816, + 942, + 485, + 2, + 65, + 575, + 923, + 744, + 290, + 76, + 276, + 596, + 662, + 419, + 134, + 92, + 280, + 434, + 344, + 88, + -66, + 8, + 151, + 126, + -81, + -239, + -176, + -29, + -74, + -351, + -574, + -487, + -208, + -132, + -426, + -780, + -797, + -577, + -595, + -978, + -1169, + -667, + -36, + -548, + -2285, + -3281, + -1756, + 927, + 1236, + -1911, + -5006, + -4073, + -66, + 2017, + -295, + -3701, + -3797, + -892, + 975, + -165, + -1978, + -1636, + 374, + 1482, + 679, + -567, + -591, + 706, + 2337, + 3224, + 2743, + 1269, + 287, + 1221, + 3597, + 5083, + 4106, + 1858, + 972, + 2334, + 4096, + 4167, + 2806, + 1916, + 2383, + 3045, + 2508, + 1220, + 820, + 1784, + 2669, + 1981, + 204, + -876, + -470, + 510, + 803, + 170, + -787, + -1568, + -1893, + -1598, + -1027, + -992, + -1803, + -2610, + -2484, + -1905, + -2113, + -3113, + -3399, + -2267, + -1261, + -2007, + -3637, + -3909, + -2340, + -893, + -1158, + -2272, + -2486, + -1639, + -915, + -777, + -596, + -91, + 196, + 85, + 210, + 875, + 1373, + 1247, + 1219, + 1958, + 2718, + 2328, + 1196, + 1008, + 2350, + 3677, + 3269, + 1503, + 366, + 922, + 2264, + 2810, + 1996, + 608, + -168, + 75, + 680, + 811, + 395, + -56, + -318, + -607, + -966, + -1108, + -925, + -613, + -368, + -369, + -919, + -1926, + -2460, + -1685, + -300, + 155, + -611, + -1524, + -2204, + -3227, + -3859, + -2037, + 1622, + 2382, + -2583, + -8448, + -7544, + -84, + 4814, + 915, + -6423, + -7558, + -1746, + 2515, + -59, + -4587, + -3858, + 1260, + 3625, + 187, + -4148, + -3500, + 1542, + 5467, + 4780, + 1256, + -1127, + -403, + 2481, + 5332, + 6346, + 5014, + 2536, + 1216, + 2467, + 5039, + 6238, + 5070, + 3381, + 3269, + 4173, + 3905, + 2248, + 1586, + 3299, + 5240, + 4362, + 1004, + -1382, + -489, + 2113, + 3168, + 1620, + -742, + -1824, + -1435, + -897, + -1058, + -1500, + -1545, + -1398, + -1965, + -3266, + -4136, + -3756, + -2609, + -1804, + -1986, + -3087, + -4599, + -5296, + -4051, + -1731, + -781, + -2228, + -4092, + -3977, + -2325, + -1353, + -1568, + -1490, + -428, + 178, + -672, + -1650, + -1058, + 749, + 2039, + 2079, + 1540, + 897, + 310, + 572, + 2266, + 4265, + 4265, + 1869, + -231, + 559, + 3332, + 4752, + 3229, + 768, + 101, + 1364, + 2463, + 1984, + 819, + 411, + 723, + 675, + -162, + -923, + -743, + -32, + 185, + -516, + -1653, + -2359, + -2103, + -986, + 42, + -205, + -1702, + -2870, + -2337, + -809, + -221, + -982, + -1544, + -946, + -598, + -2117, + -4291, + -4100, + -857, + 1948, + 338, + -4799, + -7972, + -5403, + 173, + 2371, + -1063, + -5533, + -5578, + -1777, + 605, + -985, + -3249, + -2213, + 1184, + 2691, + 560, + -2356, + -2288, + 1233, + 5244, + 6441, + 4004, + 370, + -663, + 2555, + 7404, + 9282, + 6573, + 2612, + 1836, + 4662, + 7467, + 7393, + 5421, + 4262, + 4741, + 5362, + 4705, + 3163, + 2397, + 3337, + 4887, + 4810, + 2254, + -749, + -1316, + 772, + 2706, + 2016, + -573, + -2552, + -2746, + -2012, + -1647, + -1978, + -2579, + -3105, + -3473, + -3911, + -4484, + -4891, + -4795, + -4163, + -3543, + -3538, + -4275, + -5356, + -5743, + -4637, + -2614, + -1301, + -1825, + -3341, + -4011, + -2937, + -751, + 1007, + 1245, + 235, + -639, + -61, + 1626, + 2864, + 2967, + 2734, + 3013, + 3329, + 2914, + 2312, + 2666, + 3839, + 4308, + 3162, + 1453, + 768, + 1255, + 1887, + 2006, + 1715, + 1031, + -297, + -1660, + -1690, + -277, + 813, + -30, + -2137, + -3370, + -2854, + -1553, + -593, + -413, + -1146, + -2567, + -3440, + -2369, + -205, + 379, + -1258, + -2315, + -812, + 262, + -3205, + -8576, + -7894, + 738, + 7492, + 1951, + -11595, + -17098, + -6934, + 7139, + 8065, + -4575, + -14199, + -8946, + 3606, + 7504, + -547, + -8242, + -5113, + 4406, + 8113, + 2134, + -5040, + -4089, + 4157, + 10934, + 10158, + 4167, + -565, + -192, + 4428, + 9765, + 12201, + 9861, + 4512, + 1225, + 3451, + 8483, + 10133, + 6497, + 2574, + 3333, + 6806, + 6986, + 2487, + -1214, + 623, + 5416, + 6647, + 2204, + -3289, + -4556, + -1565, + 1544, + 1525, + -1236, + -4293, + -5695, + -5174, + -3995, + -3403, + -3449, + -3750, + -4505, + -6014, + -7296, + -6523, + -3849, + -2096, + -3288, + -5722, + -6004, + -3581, + -1497, + -1960, + -3330, + -2800, + -434, + 964, + -111, + -1739, + -1136, + 1736, + 4151, + 3736, + 1274, + -451, + 469, + 3386, + 5833, + 5898, + 3646, + 1085, + 272, + 1743, + 4061, + 5108, + 3837, + 1490, + 246, + 967, + 1866, + 859, + -1069, + -974, + 1542, + 2835, + 47, + -4285, + -5068, + -1567, + 1781, + 1223, + -1997, + -4227, + -3747, + -1720, + 41, + 245, + -1228, + -2972, + -2673, + 22, + 1980, + -930, + -7721, + -11271, + -5725, + 4974, + 8484, + -2007, + -16979, + -19255, + -4670, + 11057, + 9690, + -6417, + -17537, + -10841, + 4262, + 9292, + 206, + -9128, + -6224, + 4828, + 10018, + 3699, + -5183, + -5121, + 4702, + 14279, + 14466, + 5778, + -2633, + -2185, + 7036, + 16118, + 16305, + 8081, + 390, + 499, + 6580, + 11150, + 10036, + 5704, + 2902, + 3378, + 4664, + 3786, + 863, + -796, + 1216, + 4609, + 4493, + -338, + -5670, + -6486, + -2751, + 884, + 571, + -3095, + -6446, + -6997, + -5770, + -5041, + -5016, + -4216, + -2579, + -2468, + -5088, + -8129, + -7964, + -4228, + -323, + 497, + -1556, + -3653, + -3615, + -1718, + 464, + 1808, + 2386, + 2832, + 3085, + 2905, + 2676, + 3473, + 5501, + 7094, + 6442, + 3929, + 1663, + 1436, + 3254, + 5807, + 7100, + 5044, + -34, + -4091, + -2992, + 2149, + 5333, + 2562, + -3067, + -5877, + -4480, + -2080, + -1793, + -3026, + -3838, + -3735, + -3663, + -4472, + -5756, + -5753, + -3576, + -640, + -274, + -3965, + -7787, + -6757, + -717, + 4380, + 3595, + -1553, + -5936, + -8603, + -10223, + -8952, + -922, + 9700, + 9355, + -7788, + -25795, + -22413, + 2268, + 20887, + 12133, + -11291, + -20129, + -5899, + 10236, + 8585, + -3645, + -6300, + 4667, + 14216, + 9346, + -3593, + -8558, + 715, + 15085, + 21179, + 14887, + 3733, + -2703, + -675, + 7170, + 15131, + 18360, + 13959, + 4205, + -2825, + -656, + 7594, + 11845, + 7182, + 319, + -439, + 3255, + 3213, + -3299, + -8972, + -6318, + 2300, + 7190, + 2254, + -9247, + -17334, + -15064, + -4452, + 5160, + 5127, + -4268, + -14501, + -17256, + -11145, + -1830, + 3786, + 2984, + -2498, + -8101, + -9587, + -5703, + 622, + 4570, + 4035, + 1442, + 729, + 2493, + 3534, + 2433, + 2239, + 5944, + 11438, + 12371, + 6496, + -211, + -156, + 7092, + 13566, + 11979, + 3928, + -2545, + -2226, + 2713, + 6150, + 5117, + 1270, + -1851, + -2859, + -2376, + -1909, + -2364, + -3401, + -4183, + -3897, + -2875, + -3205, + -5503, + -7822, + -7501, + -3934, + -942, + -1572, + -4262, + -5939, + -4671, + -2353, + -1387, + -1159, + -1270, + -1328, + -606, + 474, + 1044, + -2647, + -11603, + -17081, + -10374, + 5922, + 14849, + 2056, + -22033, + -31238, + -14612, + 11094, + 17910, + 1778, + -15538, + -15417, + -2045, + 6690, + 2855, + -2559, + 473, + 8823, + 11423, + 3782, + -4649, + -2775, + 9111, + 20847, + 21610, + 11572, + 962, + -1465, + 5731, + 15559, + 20008, + 16950, + 9230, + 2204, + 114, + 3088, + 8130, + 10523, + 7643, + 2045, + -2107, + -2945, + -2538, + -3593, + -5210, + -4403, + -857, + 1328, + -2497, + -11667, + -18881, + -16866, + -6286, + 3400, + 2835, + -7811, + -18322, + -19279, + -10025, + 1525, + 6930, + 3766, + -4647, + -11401, + -9904, + -322, + 10100, + 12428, + 5874, + -274, + 926, + 6762, + 9360, + 6778, + 5904, + 10509, + 15077, + 12681, + 3846, + -1653, + 2460, + 11036, + 14737, + 8967, + -1021, + -6168, + -3899, + 2328, + 6041, + 3404, + -2878, + -7672, + -6869, + -1918, + 801, + -2188, + -7419, + -8083, + -2687, + 1898, + -692, + -8121, + -11198, + -5642, + 2830, + 5915, + 1120, + -5666, + -8314, + -5770, + 118, + 4614, + 4713, + 1482, + -2544, + -3331, + -3779, + -8931, + -13840, + -10273, + 3355, + 13432, + 2906, + -20058, + -30890, + -17080, + 7759, + 16047, + 2886, + -12525, + -15117, + -5998, + 1614, + 2294, + 2684, + 4610, + 6236, + 5486, + 2514, + 1346, + 1962, + 4564, + 11022, + 17438, + 18182, + 10179, + -796, + -3019, + 5456, + 15942, + 18468, + 11176, + 2796, + -143, + 1670, + 3922, + 3836, + 3337, + 3330, + 1623, + -2609, + -7177, + -7654, + -4250, + -2210, + -3491, + -5312, + -4380, + -3103, + -6738, + -13209, + -14278, + -6529, + 3346, + 4931, + -2861, + -11176, + -12097, + -5552, + 2679, + 7102, + 6050, + 1301, + -3350, + -3378, + 1785, + 7413, + 9059, + 7013, + 5043, + 5331, + 5197, + 3143, + 1862, + 3790, + 8037, + 10159, + 7236, + 1450, + -3393, + -3980, + 598, + 6251, + 7410, + 1502, + -7144, + -10260, + -5116, + 2386, + 4197, + -894, + -6255, + -6026, + -1493, + 873, + -1639, + -4426, + -2720, + 2252, + 4206, + 158, + -4631, + -4466, + 537, + 4709, + 4528, + 1691, + -828, + -1394, + -455, + 756, + 2662, + 3101, + 1730, + -3579, + -12987, + -18531, + -12998, + 1944, + 11963, + 1503, + -19826, + -29919, + -18138, + 2254, + 7644, + -1829, + -9260, + -6516, + 134, + -793, + -5234, + -2336, + 6264, + 12828, + 11829, + 6589, + 3429, + 2592, + 4795, + 11433, + 19490, + 21681, + 13136, + 379, + -4138, + 3585, + 14812, + 17633, + 10124, + 623, + -2287, + 696, + 2273, + -926, + -5000, + -4391, + -386, + 139, + -4657, + -11003, + -13946, + -11930, + -7460, + -1932, + 1277, + -2311, + -10543, + -16920, + -14512, + -4039, + 4987, + 7518, + 3175, + -4213, + -7535, + -4747, + 3590, + 12231, + 13419, + 8429, + 2377, + 1080, + 5563, + 8497, + 7304, + 5331, + 5656, + 8235, + 6997, + 998, + -3131, + -1857, + 3017, + 5883, + 3744, + -408, + -4503, + -6489, + -4796, + -374, + 3254, + 1651, + -2830, + -5206, + -3690, + -681, + -969, + -2819, + -2616, + 19, + 3379, + 2359, + -2476, + -6413, + -6111, + -463, + 4664, + 4106, + -565, + -4801, + -4960, + -1242, + 2479, + 3706, + 2168, + -1104, + -3048, + -1563, + 1217, + 2013, + -5714, + -17921, + -21743, + -10839, + 7751, + 13091, + -4648, + -26509, + -29653, + -9872, + 10100, + 9523, + -4335, + -12121, + -5509, + 4923, + 6380, + 1839, + -508, + 3312, + 10704, + 14545, + 12317, + 5508, + -243, + 2421, + 11485, + 19096, + 18306, + 8626, + -1357, + -5542, + -1695, + 7815, + 13549, + 10229, + -23, + -8373, + -7496, + -2775, + -1016, + -2900, + -4868, + -4103, + -4535, + -6851, + -8099, + -8137, + -6414, + -4023, + -1790, + -45, + -1513, + -4791, + -6160, + -4105, + 1060, + 5970, + 7099, + 3934, + -996, + -2213, + 1973, + 6975, + 7927, + 4726, + 2474, + 3951, + 5221, + 2642, + -2359, + -3579, + 1362, + 6614, + 6282, + 116, + -5643, + -5733, + -1884, + 2107, + 3418, + 2566, + 684, + -2319, + -3803, + -2133, + 1512, + 2943, + 475, + -1004, + 753, + 3095, + 1652, + -3074, + -4562, + -932, + 3815, + 4486, + -22, + -4199, + -4666, + -2201, + 284, + 316, + -914, + -2297, + -2441, + -1538, + -435, + 909, + 626, + -1222, + -1534, + -429, + 1711, + 2386, + -1786, + -10676, + -18200, + -16272, + -3805, + 9505, + 8238, + -9397, + -24577, + -22256, + -4907, + 8659, + 5940, + -3701, + -6764, + 40, + 6190, + 4239, + 208, + 238, + 7081, + 14458, + 15143, + 10726, + 3479, + -706, + 1700, + 9131, + 17577, + 17708, + 7959, + -5009, + -11508, + -5347, + 5635, + 10789, + 6499, + -3121, + -9303, + -9814, + -6625, + -3333, + -3193, + -4349, + -5615, + -6188, + -5123, + -4441, + -4550, + -4074, + -2769, + -61, + 2441, + 2881, + 1395, + -578, + -341, + 2509, + 6034, + 8202, + 6377, + 2696, + 1272, + 2589, + 4787, + 4611, + 2378, + 2124, + 3911, + 4872, + 2049, + -3374, + -5770, + -2705, + 3179, + 5905, + 2589, + -2792, + -5419, + -3176, + 1056, + 2875, + 2483, + 1205, + 605, + 856, + 1012, + 892, + 105, + -411, + 707, + 2924, + 4184, + 1755, + -2553, + -4857, + -3556, + 401, + 2466, + 945, + -2315, + -5556, + -5549, + -2241, + 534, + 601, + -1774, + -3034, + -1962, + -886, + -448, + -720, + -467, + 864, + 760, + -22, + -2546, + -10211, + -17121, + -15877, + -4803, + 7993, + 7254, + -6563, + -18374, + -17755, + -6143, + 3291, + 4322, + 1822, + 416, + 2788, + 5190, + 4256, + 2627, + 2590, + 6398, + 12709, + 15757, + 12829, + 5542, + -667, + 167, + 7241, + 14346, + 14826, + 6392, + -3516, + -7434, + -4607, + 1054, + 2988, + 847, + -1549, + -2641, + -3046, + -5363, + -8256, + -9130, + -6906, + -1460, + 2260, + 1568, + -2911, + -8580, + -9418, + -3675, + 5021, + 10127, + 7909, + 1478, + -4015, + -3331, + 2450, + 7291, + 7632, + 2567, + -2022, + -899, + 3418, + 5544, + 1349, + -4117, + -3409, + 1758, + 6000, + 3526, + -3975, + -7331, + -3931, + 2747, + 7037, + 4962, + -21, + -2902, + -2008, + 1306, + 4461, + 6364, + 5956, + 3623, + 1734, + 793, + 44, + -893, + -1041, + 1633, + 5264, + 4870, + -943, + -7404, + -8611, + -4974, + -1192, + 185, + -1334, + -3672, + -4910, + -5132, + -4387, + -3532, + -3233, + -2430, + -469, + 1245, + 892, + -969, + -2441, + -2140, + 320, + 4999, + 5954, + -4638, + -20056, + -24424, + -8954, + 13558, + 16089, + -3145, + -20665, + -19447, + -4802, + 4488, + 3733, + 943, + 683, + 3109, + 6219, + 9247, + 7736, + 782, + -1410, + 8024, + 20877, + 20174, + 4723, + -7148, + -2758, + 11240, + 17896, + 11462, + 414, + -6134, + -4913, + 113, + 2818, + 98, + -5900, + -8369, + -4446, + 924, + 1657, + -3389, + -10569, + -13223, + -7690, + 2339, + 7741, + 1634, + -9014, + -10982, + -1172, + 9642, + 9098, + 1310, + -2795, + -1040, + 2790, + 3808, + 3559, + 3064, + -527, + -3160, + -1391, + 3120, + 5224, + -144, + -6714, + -6416, + -719, + 5630, + 7253, + 2735, + -2973, + -4325, + 679, + 7146, + 8220, + 4055, + -42, + 814, + 5288, + 7658, + 6592, + 3051, + -746, + -541, + 3401, + 6030, + 1953, + -6340, + -8619, + -2689, + 4076, + 3217, + -4875, + -9612, + -7826, + -4293, + -2441, + -4080, + -5740, + -5529, + -3656, + -506, + -1035, + -5787, + -9518, + -7034, + 2323, + 9287, + 6495, + -1853, + -6110, + -3281, + -1708, + -8958, + -19544, + -18870, + -2771, + 13029, + 10762, + -7491, + -21837, + -18923, + -4183, + 8733, + 12580, + 9779, + 4597, + 738, + 1460, + 6302, + 9711, + 8375, + 8143, + 12512, + 15808, + 11272, + 389, + -5554, + 161, + 11080, + 15851, + 10426, + 692, + -6372, + -6808, + -2525, + 652, + 827, + -219, + -349, + -622, + -3328, + -7883, + -11020, + -8961, + -3240, + 1884, + 4155, + 1995, + -3530, + -7816, + -6444, + -218, + 6086, + 9279, + 7901, + 3113, + -2352, + -5757, + -3836, + 2022, + 4572, + 894, + -3519, + -3311, + -534, + -618, + -3716, + -5515, + -3290, + 1495, + 4374, + 4455, + 2961, + -645, + -3247, + -656, + 5273, + 9838, + 9751, + 5755, + 1863, + 158, + 1457, + 4585, + 6390, + 5379, + 2894, + 2284, + 1867, + -2279, + -7051, + -6578, + 70, + 4745, + 1660, + -4524, + -8007, + -7088, + -5690, + -5467, + -4178, + -2679, + -2218, + -3422, + -4167, + -4313, + -6105, + -6633, + -4202, + 864, + 5119, + 4084, + -163, + -5331, + -8699, + -8710, + -7313, + -4649, + -2471, + -1419, + -1136, + -3199, + -6428, + -8048, + -4902, + 1089, + 4681, + 5723, + 5535, + 5146, + 4006, + 2052, + 2314, + 5274, + 8680, + 9907, + 8776, + 6722, + 2548, + -2403, + -3303, + 1224, + 7406, + 9468, + 5089, + -1197, + -4384, + -3570, + -298, + 1776, + 2005, + 2041, + 1326, + 971, + -180, + -2334, + -1170, + 1913, + 4281, + 4732, + 2874, + 1174, + -1341, + -3384, + -2503, + 368, + 4031, + 3270, + -986, + -3519, + -5360, + -6004, + -5576, + -3603, + 208, + 708, + -2137, + -4940, + -5349, + -3588, + -2796, + -1399, + 1017, + 3144, + 4196, + 2483, + 828, + 338, + 919, + 3842, + 6202, + 7189, + 7499, + 6330, + 4847, + 3252, + 2136, + 3698, + 5845, + 5566, + 3019, + 267, + -55, + -1091, + -4220, + -5041, + -3430, + -280, + 171, + -4649, + -8723, + -9280, + -5975, + -3192, + -3974, + -3912, + -4053, + -3748, + -3570, + -5871, + -5499, + -3552, + -1691, + 320, + 341, + 748, + -313, + -3436, + -4687, + -3681, + 21, + 2550, + 643, + -2123, + -3254, + -2226, + -1044, + -1617, + -1510, + 183, + 1250, + 726, + -1662, + -3388, + -1759, + 933, + 3817, + 5242, + 3025, + 248, + -1339, + -514, + 2022, + 3410, + 3970, + 3324, + 2632, + 2603, + 2240, + 2166, + 1271, + 487, + 1076, + 2039, + 3296, + 3836, + 3610, + 2913, + 2718, + 4213, + 5555, + 6023, + 4769, + 2442, + 2067, + 2173, + 1623, + 1201, + 348, + 52, + -124, + -1528, + -2834, + -3604, + -3463, + -2357, + -2564, + -3775, + -3801, + -1929, + -465, + -2109, + -3743, + -2657, + 200, + 2580, + 954, + -1304, + -95, + 1549, + 2303, + 1795, + 1633, + 3356, + 3699, + 2361, + 792, + 1148, + 4045, + 4820, + 3851, + 3197, + 2449, + 2704, + 1722, + -652, + -1154, + -393, + 113, + -1010, + -3328, + -4342, + -3939, + -3345, + -3697, + -5115, + -5610, + -4202, + -3639, + -5088, + -5351, + -3216, + -862, + -414, + -1839, + -3996, + -4831, + -2467, + 147, + 1055, + 1288, + -247, + -2225, + -2233, + -1562, + -1278, + -936, + -961, + -935, + -367, + -323, + -459, + -1940, + -3974, + -2262, + -13, + 2, + -401, + -1825, + -2308, + -1124, + 448, + 2154, + 2434, + 1300, + -812, + -1337, + 1325, + 3374, + 3466, + 2500, + 2156, + 3439, + 3549, + 2068, + 1392, + 1986, + 3025, + 3944, + 3898, + 3259, + 4467, + 6347, + 5356, + 2893, + 1690, + 2072, + 4136, + 5313, + 2776, + -236, + -1063, + -794, + 524, + 802, + -1377, + -2879, + -2167, + -1439, + -1595, + -1539, + -1666, + -2495, + -2375, + -1253, + -515, + -187, + -1409, + -2847, + -511, + 2411, + 1761, + 492, + -18, + 607, + 2350, + 3288, + 3505, + 2741, + 1099, + 699, + 2017, + 3214, + 3333, + 1567, + 33, + 1260, + 1925, + 808, + -377, + -2558, + -3781, + -1677, + 164, + -580, + -1727, + -2619, + -3421, + -3586, + -3957, + -4562, + -3646, + -2285, + -3437, + -5293, + -4792, + -4128, + -4012, + -2920, + -2249, + -2439, + -3737, + -5607, + -4427, + -1259, + 71, + 609, + 555, + -1039, + -3354, + -5388, + -3760, + 415, + 2513, + 2513, + 819, + -1436, + -2780, + -2740, + -501, + 2727, + 3936, + 1491, + -965, + -766, + -484, + -223, + 361, + 695, + 1771, + 1130, + -1839, + -1764, + 797, + -31, + -2549, + -1790, + 2108, + 4043, + 887, + -154, + 2411, + 2605, + 2012, + 1977, + 3923, + 6630, + 4176, + 107, + -311, + 1731, + 1910, + 1011, + 3119, + 3219, + 998, + -1282, + -2832, + -1645, + -685, + 945, + 2574, + 2543, + -267, + -5015, + -3819, + -342, + 1228, + 2055, + -619, + -1233, + 2069, + 2896, + 1095, + 62, + 1365, + 3366, + 4584, + 4956, + 3323, + -19, + -50, + 4024, + 5222, + 3695, + 3118, + 1933, + 1256, + 1443, + 128, + -119, + 2043, + 2477, + 1823, + 1324, + 30, + -1363, + -3023, + -3074, + -188, + 621, + -1775, + -2806, + -2961, + -2753, + -4359, + -5350, + -1220, + -116, + -4157, + -4811, + -2793, + -1040, + -1957, + -2862, + -1901, + -3192, + -3720, + -2357, + -1727, + -387, + -2131, + -5011, + -3650, + -454, + 596, + -1298, + -3716, + -3122, + 496, + 136, + -2415, + -1675, + -811, + -837, + 140, + -1243, + -187, + -1431, + -5320, + -2121, + 100, + -467, + 2465, + 681, + -2093, + 1224, + 1632, + 1428, + 1776, + 648, + 2480, + 3622, + 876, + 259, + 1403, + 2139, + 3117, + 497, + -763, + -170, + 279, + 1769, + 342, + -871, + -25, + -1549, + -2290, + 290, + 1042, + -796, + -4291, + -3895, + 159, + 1264, + -540, + -2328, + -702, + 1972, + 852, + -2274, + -798, + 1126, + -579, + -480, + 3481, + 3833, + 1004, + 901, + 1536, + 1809, + 3103, + 2521, + 3183, + 5220, + 1800, + -266, + 4663, + 4230, + -790, + 159, + 2274, + 5114, + 4304, + -1998, + 344, + 4921, + -343, + -2048, + 1180, + 2112, + 3109, + -10, + -1818, + 552, + -1360, + -2889, + -1302, + -1918, + -37, + 1406, + -1762, + -3054, + -1446, + -2073, + -4292, + -3214, + 1163, + 2333, + -712, + -2583, + -2058, + -1034, + -600, + -3796, + -2395, + 2137, + -1122, + -1927, + 702, + -2196, + -4374, + -3257, + -1558, + -256, + -728, + -395, + -176, + -1529, + -2772, + -1121, + -340, + -1147, + -250, + -4079, + -473, + 4241, + -2818, + -3523, + 3255, + 2355, + -2550, + -1082, + 1197, + 2213, + -94, + -237, + 3123, + 1314, + -1075, + 977, + 1081, + 2045, + 2966, + -1328, + -1069, + -741, + -524, + -380, + -2766, + -986, + 926, + -3281, + -1554, + 2554, + -3620, + -6394, + -1680, + -321, + 2889, + 243, + -1567, + 2276, + -1294, + -525, + 2010, + -4883, + -1495, + 6778, + 2085, + -873, + 2496, + 418, + -1156, + -1179, + 1604, + 6173, + 1190, + -2381, + 5788, + 2431, + -4941, + -242, + 1248, + 1023, + 4426, + 3399, + 2726, + 1388, + -922, + 595, + 392, + 1414, + 6260, + 2673, + -973, + 2237, + 1776, + -2393, + -757, + 4158, + 2842, + -2327, + 505, + 1230, + -3623, + -917, + 336, + -1400, + -1018, + 1771, + 2696, + -570, + -2435, + 886, + 2309, + -2865, + -1328, + 2077, + -1967, + -3486, + -411, + 961, + -1661, + -1979, + 1179, + -493, + -2597, + 1995, + 284, + -3300, + -2213, + 184, + 312, + -1665, + -641, + -1325, + -1276, + 90, + 69, + 476, + -778, + -1099, + 853, + 1515, + 1630, + 1188, + -877, + -1751, + 702, + 2983, + -201, + 664, + 4018, + -352, + -1864, + 875, + 2367, + 813, + -2463, + -702, + 886, + -2204, + -2216, + 399, + -1729, + -2408, + 1412, + -2757, + -3530, + 449, + -2554, + -3910, + 906, + 697, + -1696, + 566, + -1360, + -1991, + 81, + -1756, + -159, + 1180, + -667, + -584, + -359, + 183, + 1943, + -412, + -1747, + 1659, + 1961, + 280, + 294, + 222, + 2000, + 2076, + 829, + -43, + -880, + 3353, + 3615, + 1279, + 1746, + -1031, + 1301, + 3477, + -777, + 2567, + 1215, + -2344, + 3556, + 561, + -2166, + 1119, + 2377, + -391, + -1825, + -2359, + 49, + 1764, + 391, + -291, + 325, + 1223, + 1443, + -624, + -2828, + 1381, + 2438, + 28, + -652, + -166, + 581, + -2039, + -374, + -20, + -2459, + -1149, + 1505, + 2008, + -1798, + -3848, + -1796, + -2208, + -2224, + -878, + 728, + -154, + -534, + 1061, + 538, + -1465, + 73, + 1147, + 82, + -119, + 3800, + 4797, + -873, + 784, + 1458, + -148, + 3180, + 1319, + 908, + 4951, + 584, + -57, + 2394, + -967, + 586, + 405, + -1601, + 3566, + -285, + -3949, + -1301, + -1953, + -1223, + -1831, + -3477, + -779, + -389, + -3169, + -1828, + -1496, + -1451, + -556, + -3327, + -209, + 534, + -4908, + 131, + -386, + -5232, + 1373, + 2129, + -1740, + -1957, + -1102, + 76, + 396, + -1426, + -179, + 1357, + -3276, + -1420, + 3819, + -44, + 56, + 2777, + -1202, + 1908, + 1410, + 2031, + 3495, + -2197, + -163, + 1565, + 239, + 2803, + 480, + -1636, + 1180, + 616, + 1206, + 1166, + -1579, + 1572, + 814, + -774, + 2310, + 740, + -2606, + 1234, + -603, + -362, + 1562, + -2134, + 652, + -777, + -2353, + 5464, + 377, + -2490, + 1012, + 157, + 680, + -1389, + -1898, + 1135, + -1, + -1730, + 1800, + -1466, + -1687, + -1469, + -3250, + -1081, + 1381, + -81, + -204, + -26, + 353, + 1941, + 174, + 104, + 2009, + 1032, + -871, + 3280, + 3398, + -651, + -154, + 3309, + 1964, + 448, + 812, + -17, + 887, + 2405, + 3295, + -54, + -2396, + 1410, + 1380, + -1156, + 296, + -1706, + -1729, + 401, + -970, + -878, + -723, + -2285, + 1259, + 1320, + -1960, + -1039, + -211, + -661, + -763, + -1599, + -43, + 308, + -1841, + 72, + -2075, + -3010, + -497, + 506, + -377, + 247, + 1932, + -1788, + -2419, + 257, + 208, + -2176, + 488, + 2827, + -1720, + -1649, + -619, + 520, + 1103, + -1231, + -1327, + 2162, + 1535, + -383, + 315, + -1488, + -235, + 1761, + -27, + -232, + 515, + 127, + -2239, + 654, + 2871, + -379, + -1274, + 2445, + 874, + -2444, + 514, + -206, + -1289, + 1314, + 1869, + 1316, + 1878, + -1454, + -982, + 476, + 359, + 2084, + -708, + 405, + -246, + -1071, + 1757, + -866, + -2331, + 783, + 501, + -853, + 896, + 36, + -2468, + -1138, + 1445, + -613, + -687, + 1999, + -449, + -731, + 1478, + 384, + -45, + 96, + 1530, + 1919, + 186, + -94, + 1347, + -329, + -348, + 1631, + 574, + 1062, + 735, + -1652, + 675, + 244, + 1241, + 1137, + -2469, + 621, + 45, + -612, + 1308, + -2015, + -208, + 2392, + -1646, + -67, + 77, + -1558, + 113, + 1263, + -236, + -971, + -333, + -733, + -555, + 2024, + -135, + -3817, + -398, + 1696, + -1179, + -1473, + 1175, + -166, + 618, + 1132, + -2504, + -575, + 146, + -688, + 1323, + 150, + -2021, + 15, + 1673, + 347, + -1535, + -106, + 235, + -32, + 1167, + -471, + -503, + -1260, + 416, + -13, + -1082, + 1036, + -790, + -1676, + 487, + 985, + 77, + 57, + -1175, + 1146, + 2023, + -1706, + -404, + 3249, + -739, + -979, + 3044, + -514, + -168, + 2201, + -2863, + 1009, + 1833, + -2309, + 1565, + 476, + -1698, + 1667, + -496, + -2193, + 1686, + 532, + 336, + -1095, + -1655, + 578, + -909, + -1263, + 2569, + -2833, + -1808, + 2860, + -822, + 27, + 1098, + -1371, + 1585, + -284, + -1074, + 2944, + -764, + -2871, + 2484, + 1179, + -1213, + -670, + -1226, + 1112, + 1837, + -299, + -388, + -51, + 1, + 992, + -723, + -361, + 1723, + -1115, + -2012, + 1261, + -9, + -127, + -510, + -1550, + 1448, + 957, + -1930, + 171, + 776, + -2104, + 14, + 764, + -599, + -745, + -438, + -371, + -659, + 1075, + 282, + -3116, + 684, + 3747, + 22, + -2139, + 816, + 1413, + -333, + 458, + 906, + 483, + -1084, + 797, + 1039, + -467, + -377, + 1386, + -1182, + 610, + 1787, + -1354, + -2800, + 2638, + 424, + -2372, + 1153, + -51, + -689, + 290, + -2199, + 818, + 3755, + -2674, + -1689, + 3497, + -507, + -1978, + 1729, + 1413, + 215, + -76, + 53, + 759, + 371, + -1529, + 1005, + -770, + -685, + 1754, + -908, + -653, + 1047, + -1066, + -784, + -199, + -526, + 86, + -1750, + -916, + 1839, + 580, + -1884, + 319, + 226, + -977, + 212, + 202, + -741, + -1013, + 2057, + 69, + -2961, + 974, + 1964, + -512, + -224, + 1554, + -79, + -1142, + 1853, + -71, + 1009, + 1174, + -718, + 2040, + -158, + -1508, + 1042, + 0, + -1219, + 1212, + 448, + -208, + -47, + -779, + -867, + 1924, + -254, + -1085, + -221, + -1283, + 1543, + -584, + -951, + 225, + -1089, + -464, + -853, + -615, + 1576, + -2313, + -1214, + 950, + -2548, + -314, + 1201, + -1527, + 952, + 764, + -1915, + 528, + 169, + -1676, + 1742, + 425, + -2346, + 932, + 290, + 109, + 492, + -379, + 932, + 70, + 582, + 135, + 769, + 1665, + -1751, + 576, + 1013, + 366, + 2339, + 71, + 637, + 1500, + 576, + 111, + 494, + 765, + 1170, + 1421, + -5, + -892, + 2054, + -640, + 160, + 1426, + -651, + 348, + -841, + -558, + 1563, + 277, + -408, + -1468, + 482, + -1538, + -2255, + 968, + -1307, + -454, + 1306, + -3085, + -1680, + 2624, + -2191, + -1719, + 1891, + -3826, + -1441, + 2736, + -3694, + -266, + 1897, + -4468, + 841, + 2828, + -4060, + -318, + 2305, + -1662, + 528, + 3056, + -2429, + -156, + 2045, + -753, + 475, + 419, + -597, + 1100, + 1845, + 504, + 1067, + -402, + -824, + 1807, + 1192, + 459, + 200, + 1728, + 50, + -497, + 678, + -355, + 938, + 1239, + -1223, + 360, + 1251, + -95, + 981, + 1029, + -1940, + 260, + 1627, + -2387, + 3426, + 519, + -3141, + 1822, + -506, + -1471, + 1101, + -2137, + 1069, + 885, + -2618, + 1673, + -463, + -1558, + 1439, + -386, + -1923, + 1538, + -1313, + -1735, + 540, + -1433, + -915, + 494, + -839, + -1527, + -1143, + 480, + -1081, + 27, + 1732, + -1285, + -1833, + 1952, + -667, + -1626, + 1819, + -1293, + -1323, + 2139, + -376, + -1392, + 1277, + -1172, + -240, + 2907, + -1875, + -238, + 2573, + -1068, + -471, + 2065, + -686, + -1315, + 2575, + 233, + -1005, + 1135, + 706, + 534, + 278, + -182, + 1091, + -21, + -222, + 1413, + -371, + -54, + 1108, + -103, + 382, + -70, + 787, + 894, + -108, + 1308, + 1113, + -1412, + 574, + 1140, + -2032, + 500, + 569, + -1251, + 951, + -50, + -1398, + 772, + -474, + -1536, + 1297, + 251, + -2321, + 109, + -703, + -425, + 40, + -1354, + -773, + -225, + -1743, + -1839, + 1244, + 261, + -3082, + -424, + 1162, + -937, + 123, + -322, + -407, + -561, + -331, + 1369, + -1142, + -1050, + 1024, + 1116, + -213, + -752, + 1521, + -383, + -415, + 1011, + 947, + -713, + 743, + 1945, + -237, + 881, + 600, + -757, + 885, + -835, + 756, + 2454, + -1985, + 699, + 1572, + -1652, + 673, + 232, + -42, + 1975, + -736, + -270, + 1660, + -704, + -96, + 1264, + -428, + 278, + 774, + -954, + -1325, + 756, + 1275, + -594, + -353, + 204, + -1130, + -782, + -432, + -979, + 268, + 378, + 20, + -870, + 405, + -357, + -1661, + 637, + 473, + 293, + -314, + -895, + 3, + -175, + -1016, + -643, + 204, + -588, + -1007, + -131, + 401, + -849, + -476, + 271, + 320, + -198, + 533, + -25, + -1994, + 1421, + 525, + -1611, + 1261, + 507, + -488, + 1093, + 361, + -1814, + 2230, + 312, + -196, + 3242, + -803, + -962, + 1714, + -1479, + 1426, + 1612, + -1953, + 1376, + -581, + -669, + 1370, + -1251, + 426, + 1274, + -470, + 1757, + 807, + -589, + 1275, + 126, + -871, + 1025, + -1331, + 287, + 1258, + -1813, + 146, + -839, + -1471, + 828, + -402, + -281, + 1704, + -1341, + -231, + 939, + -1035, + -472, + -197, + -764, + -380, + -816, + -266, + 382, + -497, + -1708, + -591, + 1119, + -1941, + 178, + 969, + -1656, + 685, + 1004, + -1114, + -127, + -1473, + -678, + 1610, + -1253, + 277, + 1807, + -1642, + -461, + 2033, + -1449, + 392, + 98, + -157, + 1525, + -860, + 2455, + 413, + -2159, + 2457, + 475, + -374, + 1532, + -981, + 843, + 973, + 324, + 1168, + 225, + -407, + 1487, + 681, + -680, + 1098, + 117, + 245, + 1238, + -223, + 1076, + -428, + -466, + 2593, + -663, + -1225, + 1303, + -933, + -561, + 1190, + -1071, + -1229, + 406, + -284, + -13, + 198, + -1494, + -637, + 352, + -1960, + 420, + 49, + -1472, + -761, + -234, + -2213, + -1750, + -521, + -1554, + -813, + 662, + -633, + -1388, + -15, + -947, + -391, + -152, + -894, + 631, + -461, + -885, + 633, + -51, + -1063, + 218, + 1149, + -61, + -274, + 988, + -140, + 7, + 1774, + 1558, + -623, + 755, + 1352, + -511, + 1106, + 744, + 17, + 2640, + -91, + 697, + 1547, + -1757, + 1832, + 1859, + -206, + 1505, + 575, + -444, + 556, + 250, + 1786, + 792, + -125, + -266, + 407, + 501, + 798, + -536, + -1214, + 58, + 6, + 354, + -685, + 613, + 99, + -2022, + -116, + -236, + -182, + 263, + -824, + -1187, + -142, + -138, + -1228, + -1008, + 786, + -1421, + -1127, + -269, + -2278, + 841, + 222, + -2423, + 678, + -1153, + -2082, + 574, + -570, + -729, + 180, + -777, + 212, + 270, + -274, + 1077, + -493, + 118, + 804, + -1260, + 349, + 799, + 545, + 481, + 971, + 1099, + 1146, + -273, + 34, + 1728, + 1128, + 411, + 758, + 308, + -808, + 950, + 1490, + 209, + -265, + 1154, + -11, + -460, + 2644, + -122, + -728, + 2033, + -1100, + -305, + 1774, + -208, + -1567, + -57, + -140, + -670, + -454, + -1390, + -80, + 978, + -438, + -731, + -684, + 344, + -458, + -199, + -126, + -1663, + -883, + 642, + -1517, + -1144, + -375, + -422, + -452, + -1815, + -791, + 763, + -1502, + -205, + 684, + -1641, + 448, + 1399, + -2160, + 804, + 1088, + -2214, + 1030, + 1585, + -1093, + -11, + 1718, + -360, + -81, + 1294, + 398, + 218, + 1225, + 644, + 505, + 2090, + -385, + 526, + 2111, + -303, + -316, + 1550, + 1323, + -459, + 881, + 1874, + -1256, + 1429, + 2485, + -1003, + -552, + 14, + 432, + 952, + 471, + -633, + 408, + -358, + 140, + 554, + -1260, + -404, + 245, + -2572, + 954, + 1005, + -1621, + -82, + -175, + -957, + 112, + 106, + -1117, + -819, + -62, + -785, + 71, + 93, + -1296, + -1680, + 242, + -956, + -2696, + 302, + -204, + -1404, + 254, + -558, + -201, + -630, + 16, + -436, + -1647, + 1649, + -1096, + -1267, + 2273, + -1270, + 20, + 1749, + -2509, + 780, + 942, + -1859, + 2762, + 304, + -300, + 2617, + -947, + 861, + 2601, + -1153, + 754, + 1629, + -681, + 686, + 1443, + -235, + 1900, + 5, + -565, + 1559, + 285, + -170, + 757, + 480, + 547, + 752, + -427, + 50, + 839, + -95, + -791, + -1698, + -291, + -62, + -1730, + 524, + 1008, + -2176, + -369, + 165, + -749, + -972, + -287, + 889, + -1218, + -1712, + 833, + -855, + -995, + -14, + -793, + -1815, + 605, + -607, + -1890, + 769, + -781, + 230, + 1155, + -2000, + 876, + 1835, + -1617, + 9, + 1058, + -1232, + 859, + 1486, + -1301, + 1595, + 501, + -951, + 2935, + -921, + -634, + 2826, + -793, + 655, + 2660, + -232, + 235, + 1879, + 481, + -51, + 804, + 987, + -360, + -331, + 2099, + -302, + -149, + 1966, + -1233, + -12, + 1330, + -2265, + 1256, + -116, + -1394, + 2937, + -995, + -1572, + 2964, + -2257, + -2587, + 1820, + -2132, + -1609, + 778, + -1596, + -486, + 560, + -1749, + 274, + -706, + -1714, + 1304, + -360, + -2657, + 1833, + -750, + -1729, + 433, + -1461, + -794, + -1545, + -892, + 385, + -891, + -374, + 1261, + -589, + 235, + 815, + -773, + -669, + 636, + -471, + 136, + 871, + -392, + 782, + 677, + -472, + 1130, + 1029, + -1262, + 1070, + 2171, + 575, + 675, + 600, + 2104, + 1077, + -182, + 2621, + -604, + -30, + 3302, + -1331, + 599, + 742, + 291, + 1329, + -551, + 1043, + 1729, + -1754, + 1220, + 1113, + -2174, + 1281, + 743, + -2027, + 851, + -205, + -1576, + 214, + -1629, + -605, + -394, + -1508, + -254, + -63, + -489, + -847, + -26, + -997, + -1065, + -120, + -376, + -1283, + -1393, + 83, + -212, + -1610, + 419, + -1120, + -590, + 395, + -1210, + -21, + -273, + -622, + 899, + -196, + -1059, + 1130, + 616, + -529, + -166, + 794, + 22, + -216, + 862, + 664, + -390, + 980, + 228, + 789, + 182, + 402, + 2149, + -1133, + 799, + 2637, + -799, + 176, + 1306, + 905, + -93, + 677, + 338, + 121, + 483, + 297, + 339, + 347, + 249, + 731, + 40, + 66, + 112, + -889, + -128, + 582, + -1191, + -67, + -1364, + -233, + 488, + -1734, + -634, + 1517, + -1657, + -1015, + 594, + -1422, + 1396, + -1357, + -1617, + 1254, + -1596, + -941, + 789, + -1860, + -77, + 245, + -327, + 569, + -723, + 104, + 905, + -543, + -918, + 1387, + -42, + -440, + 619, + 68, + 45, + 1364, + -880, + 19, + 1491, + -561, + 1174, + 1403, + -1411, + 1351, + 1222, + -612, + 864, + 877, + -658, + 382, + 864, + -552, + 1286, + 309, + -105, + 1083, + -170, + -289, + 1049, + -248, + -537, + 625, + -48, + 337, + -385, + 532, + -315, + -1398, + 588, + -628, + -1192, + 649, + -806, + -170, + 541, + -2267, + 1052, + 274, + -1970, + 833, + 253, + -1345, + -290, + -120, + -959, + -94, + -189, + -1397, + -136, + -155, + -654, + 207, + -706, + 617, + 415, + -1962, + 1169, + 670, + -1132, + 319, + 297, + -589, + 100, + 510, + -620, + 610, + -153, + -15, + 1327, + -99, + 229, + 281, + 169, + 1015, + -106, + 1197, + 577, + -698, + 577, + 931, + -964, + 1605, + 505, + -1713, + 2369, + 115, + -1585, + 1839, + 664, + -1411, + 867, + 620, + 329, + 491, + -1119, + 420, + 266, + -1708, + 499, + -69, + -1037, + 795, + -321, + -959, + 32, + 235, + -1748, + 295, + -249, + -230, + 485, + -1185, + -97, + 489, + -2036, + 711, + 405, + -2800, + 593, + 434, + -1038, + 536, + 347, + -570, + 705, + -806, + -290, + 818, + -999, + 53, + 1585, + -756, + -657, + 1180, + 115, + -364, + 217, + -226, + 1033, + 347, + -20, + 611, + 658, + 590, + -128, + -451, + 1676, + -660, + -21, + 805, + -880, + 1481, + 412, + -1534, + 1522, + 221, + -132, + 662, + -407, + 613, + 1132, + -551, + -187, + 1184, + -577, + -444, + 953, + -1034, + -472, + 461, + -865, + -99, + 637, + -572, + 300, + 450, + -591, + 137, + 404, + -972, + 306, + -524, + -1167, + 433, + 124, + -1326, + -368, + -305, + -917, + 452, + -626, + -695, + 656, + 258, + -1401, + 270, + 446, + -1045, + 636, + -357, + -1072, + 913, + 512, + -1732, + 489, + 952, + -747, + 58, + 673, + -453, + 1125, + -488, + 46, + 1723, + -1244, + 417, + 1803, + -1215, + 623, + 659, + -560, + 676, + -9, + 92, + 701, + 1100, + -623, + 142, + 283, + -512, + 547, + 576, + -525, + -155, + 1143, + -1286, + -329, + 1959, + -1302, + -459, + 1188, + -1199, + 1020, + -118, + -1303, + 956, + -905, + -647, + 595, + -356, + -1354, + -74, + 750, + -791, + -335, + 56, + -862, + -36, + 276, + -279, + 46, + -485, + -181, + 196, + -584, + -238, + 259, + -314, + -77, + 383, + 509, + -386, + -180, + 859, + -542, + 955, + 372, + -362, + 1458, + 113, + -106, + 1495, + -534, + 63, + 1295, + -505, + 846, + 983, + -1097, + 1764, + 320, + -185, + 1061, + -525, + 115, + 217, + -328, + 326, + 312, + 374, + 179, + -683, + 485, + -1286, + 147, + -583, + -979, + 888, + -504, + -1235, + 715, + -1050, + -1111, + 848, + -828, + -1043, + -115, + -327, + 22, + -451, + -1008, + 98, + -262, + -545, + -363, + -48, + -257, + -731, + 878, + 96, + -1186, + 426, + 359, + -1101, + 1074, + -267, + 521, + -375, + -166, + 1398, + -994, + 780, + 550, + 124, + -298, + 581, + 236, + 305, + -111, + 396, + 741, + -10, + 662, + 155, + 271, + 563, + 65, + -318, + 812, + -483, + 843, + 75, + -714, + 1152, + -26, + -190, + -97, + 533, + -111, + -564, + 724, + -24, + -820, + 835, + -473, + -632, + 154, + -104, + -932, + 919, + -606, + -619, + 496, + -310, + -271, + -360, + 120, + -630, + 126, + 65, + -931, + 548, + -207, + -455, + 410, + -282, + -931, + 944, + -354, + 69, + 412, + -661, + 1068, + -969, + -443, + 1894, + -1281, + -442, + 2003, + -1640, + 713, + 852, + -1344, + 1338, + -457, + 243, + 498, + -697, + -129, + 993, + -388, + -76, + 1039, + -768, + 492, + -104, + -58, + 951, + -854, + 181, + 1093, + -1111, + 491, + 544, + -1061, + 118, + 586, + -477, + -411, + 392, + 233, + 91, + -908, + 532, + 218, + -1176, + 670, + -74, + -674, + 696, + -801, + 194, + 592, + -1790, + 762, + -564, + -791, + 595, + -145, + -727, + 228, + 434, + -246, + -232, + -169, + 281, + -324, + 289, + -120, + -270, + -49, + 282, + 250, + -56, + -405, + 507, + 27, + -1060, + 1329, + -203, + -204, + 1677, + -767, + -313, + 1272, + -968, + 717, + 183, + -1652, + 2157, + -75, + -1906, + 2590, + -428, + -1614, + 2564, + -1511, + -240, + 1421, + -1911, + 1420, + 396, + -1397, + 1691, + -694, + -1500, + 1942, + -823, + -784, + 841, + -635, + 759, + -447, + 351, + 44, + -946, + 227, + 441, + -564, + 155, + -719, + 182, + 509, + -320, + -300, + 205, + -662, + 726, + 469, + -1240, + 191, + 664, + -269, + -152, + -18, + 214, + -149, + -257, + 347, + 76, + -79, + -384, + 874, + -387, + -269, + 892, + -783, + 537, + 46, + 27, + 251, + -332, + 133, + 377, + -522, + 232, + 626, + -362, + -499, + 1112, + -342, + -522, + 362, + -187, + 547, + -384, + -155, + 517, + -551, + 227, + 651, + -825, + -88, + 579, + -758, + -40, + 456, + -774, + 542, + -164, + -482, + 968, + -1000, + -394, + 1094, + -885, + 431, + 74, + -348, + 403, + -959, + 831, + -465, + -330, + 762, + -717, + -645, + 1342, + -499, + -416, + 944, + -417, + -438, + 737, + -368, + -42, + 740, + -1234, + 689, + 29, + -106, + 619, + -824, + -10, + 1047, + -824, + 146, + -59, + 210, + 163, + -43, + 522, + -352, + 213, + 460, + -1049, + 599, + 308, + -843, + 632, + 223, + -504, + 296, + 530, + -931, + 751, + -176, + -524, + 379, + 236, + -626, + 66, + 662, + -575, + 191, + -175, + -619, + 660, + -424, + -217, + 704, + -498, + 200, + 62, + -543, + 280, + 91, + -378, + 54, + 168, + -554, + 670, + -215, + -1097, + 1805, + -1015, + -617, + 1642, + -1560, + 727, + 61, + 7, + -48, + -659, + 1308, + -752, + -613, + 914, + 160, + -469, + 164, + -167, + 274, + 326, + -667, + 497, + 333, + -757, + 1252, + -481, + -1257, + 2019, + -949, + -719, + 1676, + -1078, + 250, + 323, + -1100, + 1550, + 145, + -1697, + 972, + 522, + -966, + 374, + -365, + 846, + -276, + -756, + 629, + -278, + 302, + -151, + -243, + -363, + 841, + -7, + -1092, + 476, + 45, + 201, + -378, + -456, + 1113, + -926, + 97, + 178, + -240, + 326, + -597, + 472, + -10, + -190, + 394, + -501, + -259, + 307, + 133, + 240, + -433, + -192, + 472, + -190, + 12, + 398, + -191, + -605, + 1295, + -576, + -154, + 474, + -661, + 866, + -968, + 172, + 887, + -736, + 36, + 259, + -201, + 265, + 460, + -859, + 622, + 102, + -690, + 776, + -80, + -745, + 919, + 140, + -750, + 224, + 134, + -236, + -196, + 456, + 409, + -1069, + 600, + 239, + -306, + -383, + 541, + -213, + -323, + -121, + 700, + -735, + 179, + 222, + -613, + 653, + -711, + -81, + 592, + -694, + 117, + 703, + -772, + -264, + 644, + -117, + -422, + 276, + 64, + -355, + -430, + 800, + -74, + -619, + 1207, + -1057, + 4, + 960, + -1219, + 977, + -78, + -1186, + 1536, + 267, + -1388, + 1144, + -90, + -1052, + 1889, + -1255, + -387, + 1815, + -1763, + 1037, + 421, + -1003, + 767, + -24, + -277, + -54, + 759, + -285, + -1015, + 1422, + -581, + -121, + 547, + -687, + 288, + 440, + -626, + -623, + 1261, + -248, + -1133, + 1204, + -714, + 382, + 219, + -851, + 240, + -161, + 672, + -261, + -855, + 1043, + -599, + 111, + -362, + 225, + 641, + -913, + -122, + 1075, + -1165, + 432, + 131, + -803, + 978, + 33, + -1291, + 992, + 224, + -1054, + 789, + -121, + -215, + 262, + -11, + 89, + -174, + 365, + -240, + 114, + 406, + -813, + 291, + 233, + 158, + -377, + 194, + 216, + -477, + 635, + -228, + -512, + 599, + 23, + -273, + 71, + 258, + 10, + -155, + -198, + 354, + 61, + -749, + 768, + -19, + -709, + 596, + 97, + -276, + 164, + 69, + -144, + -20, + 529, + -897, + 188, + 480, + -703, + 836, + -874, + 259, + 917, + -1044, + -7, + 566, + -97, + -439, + 256, + -466, + 998, + -360, + -1134, + 1619, + -762, + -752, + 1446, + -707, + -177, + 652, + -899, + 579, + 253, + -410, + 146, + -262, + 275, + 353, + -610, + 52, + 671, + -862, + 419, + -140, + 273, + 247, + -1062, + 1005, + -175, + -497, + 772, + -431, + -101, + 450, + -598, + 266, + 428, + -842, + 477, + -11, + -554, + 642, + 17, + -787, + 544, + 445, + -625, + -205, + 796, + -222, + -733, + 764, + -572, + 423, + 166, + -994, + 931, + -228, + -303, + 362, + -214, + 104, + 448, + -1091, + 722, + 570, + -1311, + 773, + 259, + -648, + 477, + 193, + -682, + 302, + 459, + -464, + -383, + 1120, + -561, + -564, + 1083, + -372, + -354, + 864, + -586, + -200, + 502, + -331, + 27, + 446, + -657, + 281, + 571, + -888, + 502, + 251, + -423, + 116, + 277, + -263, + 118, + -170, + 168, + 367, + -723, + 202, + 438, + -793, + 451, + -30, + -292, + 202, + 38, + -188, + -66, + 221, + -90, + -105, + 7, + 346, + -578, + 337, + 247, + -371, + -14, + 22, + 36, + 151, + -322, + -244, + 692, + -556, + -5, + 550, + -560, + 200, + 161, + -347, + 191, + 258, + -520, + 441, + -212, + -215, + 584, + -428, + -251, + 213, + 90, + -187, + 109, + 138, + -211, + -17, + 191, + 111, + -259, + 161, + -141, + 232, + -175, + 0, + 154, + -369, + 539, + -171, + -438, + 484, + 43, + -375, + -37, + 249, + 196, + -328, + -106, + 541, + -531, + 103, + 240, + -191, + 186, + -363, + 40, + 585, + -573, + 258, + 170, + -593, + 515, + -261, + -86, + 407, + -339, + 164, + -214, + -34, + 464, + -377, + -206, + 336, + -230, + 239, + -85, + -69, + 322, + -503, + 322, + 142, + -748, + 867, + -160, + -753, + 836, + -249, + -362, + 750, + -374, + -222, + 448, + -82, + -246, + 399, + 13, + -429, + 441, + -47, + -127, + -29, + 337, + -502, + 318, + 132, + -457, + 498, + -145, + -91, + 98, + 208, + -179, + 54, + 62, + -260, + 237, + 96, + -161, + 32, + -150, + 93, + 21, + -31, + 74, + 75, + -322, + 164, + 168, + -191, + 119, + -121, + -66, + -195, + 296, + -128, + -251, + 381, + -56, + -338, + 281, + -29, + -472, + 664, + -301, + -275, + 423, + -285, + -77, + 258, + -82, + -139, + 160, + -54, + -26, + 27, + 75, + -49, + -196, + 305, + -131, + -187, + 262, + -37, + -206, + 65, + 269, + -240, + -144, + 261, + 54, + -338, + 355, + 3, + -503, + 535, + -253, + -210, + 433, + -290, + -33, + 381, + -546, + 173, + 252, + -364, + 271, + -329, + 166, + 266, + -564, + 507, + -32, + -648, + 861, + -400, + -357, + 819, + -519, + -74, + 392, + -423, + 426, + -306, + -93, + 691, + -991, + 537, + 467, + -992, + 614, + 426, + -823, + 491, + 182, + -371, + 174, + 84, + -64, + 98, + -96, + 23, + 182, + -69, + -211, + 226, + 18, + -134, + 334, + -514, + 352, + 378, + -623, + 363, + 266, + -592, + 493, + -46, + -369, + 594, + -440, + -10, + 295, + -368, + 326, + -192, + -140, + 306, + -305, + 140, + 198, + -396, + 202, + 154, + -341, + 208, + -8, + -169, + -76, + 106, + 20, + -347, + 233, + 30, + -193, + 117, + -9, + -165, + 182, + -4, + -195, + 96, + 131, + -188, + -106, + 166, + -71, + -99, + 57, + 4, + -31, + -131, + 101, + 63, + -199, + 225, + -25, + -281, + 342, + -247, + -170, + 516, + -289, + -263, + 422, + -158, + -148, + 363, + -192, + -138, + 122, + 62, + -105, + 7, + 194, + -53, + -224, + 83, + 173, + -182, + 20, + 178, + -274, + 182, + 74, + -109, + -5, + 319, + -303, + -72, + 428, + -371, + 50, + 271, + -204, + 17, + 161, + -256, + 169, + 93, + -169, + 94, + -89, + 139, + 80, + -199, + 325, + -67, + -83, + 202, + -154, + 16, + 202, + -325, + 162, + 61, + -93, + 201, + -278, + 236, + 108, + -477, + 594, + -145, + -370, + 647, + -261, + -356, + 669, + -369, + -181, + 420, + -266, + -154, + 159, + -25, + 53, + -40, + -22, + 68, + -203, + 144, + -2, + -173, + 88, + -3, + -62, + 2, + 75, + 55, + -95, + -130, + 219, + -142, + -191, + 164, + -170, + 44, + 0, + -246, + 249, + -27, + -413, + 461, + 27, + -490, + 292, + 19, + -145, + 13, + 99, + 91, + -466, + 209, + 295, + -773, + 465, + 210, + -680, + 410, + 163, + -358, + 399, + -201, + 87, + 23, + -212, + 270, + -230, + 86, + 159, + -353, + 381, + -73, + -456, + 726, + -353, + -357, + 754, + -367, + -344, + 657, + -59, + -417, + 432, + 35, + -309, + 153, + 97, + -69, + 89, + -101, + 63, + 107, + -127, + 106, + 112, + -26, + -236, + 376, + 43, + -479, + 544, + -57, + -407, + 447, + -148, + -103, + 195, + -198, + 80, + 156, + -228, + 35, + 145, + -77, + -55, + 130, + -33, + -190, + 123, + 41, + -170, + 74, + 114, + -241, + 67, + 192, + -195, + -76, + 186, + -136, + -133, + 213, + -105, + -110, + 144, + -51, + -126, + 154, + -59, + -124, + 147, + -49, + -132, + 82, + 26, + -130, + 63, + 68, + -211, + 97, + 131, + -224, + 59, + 184, + -250, + 59, + 205, + -225, + -67, + 163, + -135, + -24, + 74, + -22, + -4, + -81, + 21, + 71, + -137, + 71, + 47, + -120, + 71, + 34, + -65, + 138, + -6, + -116, + 112, + -47, + -39, + 20, + -75, + 64, + -7, + 2, + 35, + 52, + -61, + -29, + 81, + -61, + -30, + 195, + -91, + -136, + 261, + -11, + -186, + 162, + -86, + -35, + 152, + -106, + -32, + 126, + -4, + 49, + 33, + -9, + -11, + 46, + 111, + -132, + -3, + 204, + -175, + -10, + 281, + -146, + -94, + 226, + -126, + -36, + 58, + -14, + 61, + -172, + 48, + 193, + -221, + 83, + 149, + -279, + 195, + 130, + -357, + 226, + 102, + -260, + 191, + 16, + -223, + 124, + 14, + -144, + 90, + -31, + -81, + -66, + 54, + 103, + -181, + 29, + 174, + -281, + 92, + 81, + -226, + 139, + -133, + -41, + 167, + -147, + 44, + 27, + -132, + 107, + -34, + -122, + 105, + -54, + 17, + 52, + -131, + 138, + 33, + -206, + 158, + 43, + -80, + 24, + 10, + -27, + 33, + 43, + -71, + 15, + 71, + -42, + 14, + 18, + 0, + -3, + -14, + -14, + 58, + 46, + -99, + 122, + 105, + -202, + 125, + 119, + -238, + 112, + 133, + -242, + 113, + 129, + -301, + 52, + 161, + -177, + 82, + 73, + -139, + 46, + 122, + -119, + 22, + 155, + -230, + 23, + 242, + -211, + -12, + 182, + -184, + -57, + 190, + -34, + -101, + 58, + -20, + 6, + 103, + -61, + -78, + 12, + 18, + 12, + 86, + -71, + -27, + 43, + -24, + 8, + 39, + -109, + 21, + -4, + -44, + 66, + 13, + -59, + 61, + -39, + 35, + 113, + -179, + 19, + 171, + -158, + 14, + 112, + -133, + 26, + 9, + -43, + -9, + 6, + 41, + -77, + 22, + 80, + -61, + -63, + 65, + -32, + -32, + 125, + -105, + -11, + 114, + -120, + 42, + 42, + -92, + 45, + -56, + -25, + 131, + -83, + -24, + 97, + -51, + -5, + 67, + -69, + 7, + 41, + -27, + 8, + 3, + -10, + 8, + -3, + -87, + -28, + 122, + -33, + -58, + 124, + -53, + -50, + 67, + -115, + -17, + 111, + -112, + -30, + 101, + -24, + -13, + 41, + 3, + 45, + -13, + -34, + 23, + 23, + -19, + 13, + -49, + -49, + 68, + -68, + -32, + 91, + -58, + -18, + 73, + -19, + -27, + 17, + -33, + -35, + 99, + -38, + -99, + 78, + -31, + -62, + 95, + -71, + -124, + 184, + -15, + -146, + 160, + -27, + -109, + 140, + -25, + -63, + 84, + -34, + -18, + 58, + -68, + -16, + 22, + -87, + 86, + 23, + -130, + 61, + 62, + -132, + 51, + 168, + -139, + 35, + 133, + -121, + 50, + 102, + -120, + 40, + 126, + -87, + -40, + 119, + -14, + -59, + 78, + 11, + -68, + 41, + 24, + -25, + 55, + -2, + 15, + 21, + -73, + 56, + 88, + -74, + -41, + 4, + -10, + -4, + 5, + 7, + -39, + -3, + -4, + -39, + 94, + 52, + -135, + 42, + 90, + -86, + 12, + 21, + -55, + -70, + -37, + 55, + -63, + -35, + 50, + -100, + 21, + 84, + -151, + 24, + 87, + -94, + 51, + 2, + -58, + 104, + -61, + -70, + 60, + -25, + -42, + -31, + 55, + 35, + -129, + 47, + 69, + -65, + 77, + 2, + -60, + 110, + -32, + -69, + 84, + -54, + -26, + 98, + -28, + -7, + 49, + -49, + -19, + 119, + -11, + -157, + 20, + 106, + 29, + -8, + -38, + -30, + 72, + 30, + -3, + 1, + -32, + -11, + -9, + 52, + 46, + -144, + -38, + 86, + -31, + -9, + -42, + -75, + 142, + 34, + -64, + 79, + -109, + -55, + 195, + -69, + -80, + 48, + -49, + 62, + 25, + -111, + -42, + 52, + 19, + -41, + 1, + -16, + -33, + 44, + 30, + -21, + 17, + -2, + -30, + 111, + 34, + -111, + 83, + 55, + -119, + 66, + 62, + -89, + 63, + -39, + -143, + 168, + 21, + -158, + 158, + 32, + -132, + 134, + -3, + -77, + 88, + -45, + -18, + 117, + -51, + -71, + 10, + 30, + 35, + -27, + -63, + 13, + 34, + 23, + -23, + 19, + -4, + -92, + 34, + 74, + -69, + -15, + 20, + -36, + 56, + -36, + -96, + 69, + -34, + -122, + 32, + 31, + -51, + -3, + -21, + 4, + 43, + -44, + 6, + 81, + -39, + -35, + 26, + -38, + -24, + 29, + -16, + -47, + -6, + 19, + -7, + -9, + 41, + 32, + 13, + -2, + -21, + 3, + 24, + 49, + -3, + -66, + 14, + 95, + -7, + -52, + 80, + 68, + -72, + -14, + 39, + 2, + 24, + -6, + -53, + 86, + 21, + -78, + 67, + 28, + -34, + 16, + -23, + -1, + 70, + -3, + -58, + 45, + 33, + -94, + -34, + 62, + 41, + -11, + -27, + 27, + 46, + 14, + -33, + -12, + 44, + -16, + -59, + 6, + 45, + -3, + -42, + 2, + 13, + 19, + -1, + -71, + 3, + 42, + -36, + 6, + 17, + 26, + 5, + -46, + 6, + -68, + -75, + 86, + -20, + -90, + 80, + 4, + -86, + 5, + 2, + -33, + -15, + -2, + -8, + -18, + 15, + -7, + -25, + 27, + -28, + -88, + 39, + -2, + -85, + 58, + 40, + -45, + 3, + 17, + 0, + 11, + -4, + -3, + 84, + 22, + -113, + 8, + 94, + 10, + 9, + 28, + 6, + -3, + 5, + -2, + 23, + 23, + -1, + -40, + 20, + 48, + -40, + -21, + 72, + 7, + -40, + -1, + 27, + 16, + 30, + 31, + -16, + 11, + 9, + -71, + -7, + 62, + 21, + -61, + -19, + 78, + -2, + -22, + 67, + -42, + -12, + 75, + -79, + 47, + 86, + -124, + -42, + 21, + 4, + 23, + -32, + -7, + 19, + 1, + -13, + -46, + 2, + 32, + -43, + -7, + 86, + -16, + -22, + 46, + -61, + -35, + 11, + -64, + -38, + 17, + -12, + -27, + 20, + 41, + 6, + -58, + -61, + 58, + -51, + -77, + 36, + -25, + 19, + 93, + -76, + 1, + 72, + -92, + 15, + 40, + -56, + 65, + 13, + -29, + 82, + -9, + -21, + 24, + -83, + -5, + 4, + -63, + 77, + 80, + -58, + -6, + -19, + -43, + 100, + 5, + -36, + 63, + 33, + -26, + -48, + 26, + -18, + -75, + 34, + 24, + -45, + -1, + 6, + -35, + -24, + -23, + -22, + 47, + -15, + -46, + 31, + -40, + -41, + 74, + -32, + -73, + 59, + -51, + -26, + 143, + -29, + -42, + 93, + -44, + -21, + 56, + -7, + 55, + 51, + -61, + 74, + 111, + -71, + 35, + 124, + -123, + -3, + 62, + -79, + 100, + 49, + -122, + 143, + 79, + -137, + 72, + 30, + -82, + 75, + -10, + -48, + 35, + -23, + -25, + 34, + 0, + -54, + -6, + 34, + -46, + -59, + -7, + -72, + -6, + 70, + -41, + -39, + 23, + -33, + 11, + 104, + -44, + -30, + 54, + -69, + -20, + 62, + -75, + 1, + 45, + -69, + 1, + 40, + -59, + -15, + 18, + -16, + 38, + -1, + -52, + 8, + 14, + -32, + 11, + -15, + -58, + 18, + -22, + -44, + 69, + 40, + -50, + -21, + 1, + -35, + -3, + -5, + -20, + 40, + 36, + -41, + -36, + -43, + -11, + 48, + -34, + -40, + 51, + -10, + -9, + 30, + 10, + 12, + 51, + 51, + -8, + -16, + 32, + -6, + 31, + 24, + -38, + 43, + 18, + -15, + 53, + -10, + -55, + 9, + 8, + -28, + 21, + 10, + -26, + 21, + 10, + -9, + 5, + -29, + -13, + 38, + -1, + -11, + 49, + 0, + -41, + 10, + 23, + -25, + -35, + -2, + -32, + -10, + 58, + -6, + -18, + 16, + -9, + 4, + 11, + 17, + 21, + 21, + 12, + -2, + 49, + -16, + -128, + 21, + 75, + -32, + 22, + 34, + -59, + 48, + 75, + -69, + -11, + -2, + -65, + 39, + 57, + -54, + -79, + -11, + -20, + -13, + 38, + 4, + -9, + -22, + -22, + 33, + -7, + -52, + 10, + -10, + -19, + 54, + 47, + -21, + -35, + -6, + -4, + 11, + 8, + -28, + 1, + 8, + -4, + 30, + 1, + -22, + 26, + -7, + -24, + 56, + 25, + -45, + 13, + 24, + -32, + 13, + 22, + -46, + -2, + 15, + -39, + 28, + 32, + -69, + 0, + 27, + -69, + 0, + 39, + -40, + 28, + 55, + -27, + -13, + 0, + -14, + 37, + 25, + -25, + 34, + -3, + -69, + 26, + 39, + -41, + -6, + 29, + -7, + 5, + 66, + 41, + -27, + -17, + 6, + -14, + -21, + 0, + 29, + -9, + -26, + 32, + -5, + -34, + 60, + 15, + -60, + 20, + 13, + 11, + 43, + -48, + -15, + 88, + -13, + -55, + 26, + -32, + -46, + 35, + 14, + -37, + -11, + 12, + -20, + 11, + 9, + -64, + -16, + 17, + 5, + 38, + 7, + -30, + -9, + -49, + -11, + 52, + -15, + -38, + -27, + -12, + 36, + 53, + 1, + -37, + -17, + -12, + 0, + 31, + 1, + 13, + 40, + -15, + 2, + 47, + -15, + -17, + 28, + -2, + -4, + 25, + -6, + -12, + 2, + -17, + -9, + 5, + -15, + 17, + 21, + -28, + 0, + 15, + -43, + -63, + -6, + -14, + -8, + 37, + -34, + -40, + 30, + -12, + -14, + 37, + -13, + -16, + 26, + -15, + -2, + 13, + -37, + -13, + 32, + 13, + -8, + -2, + -12, + -8, + 9, + 9, + -3, + 4, + 13, + 34, + -2, + -22, + 40, + 19, + 29, + 25, + -48, + -17, + 23, + 17, + 7, + 3, + 0, + 12, + 37, + -1, + -25, + 30, + 41, + -7, + 7, + 29, + -31, + -31, + -23, + -27, + 5, + 2, + -18, + -2, + 22, + 9, + -6, + 5, + -7, + -24, + 9, + 0, + -28, + 19, + 61, + -11, + -45, + 21, + -28, + -65, + 28, + 33, + -44, + -27, + -6, + -26, + -8, + 4, + 5, + 9, + -10, + -46, + -20, + 20, + -7, + -7, + -33, + -26, + 50, + 9, + -65, + -22, + -3, + -20, + 15, + 21, + 20, + 24, + -16, + -27, + -13, + 14, + 21, + -38, + -48, + 9, + 35, + 28, + 21, + 3, + -31, + -8, + 57, + 32, + -35, + -22, + 20, + 14, + 12, + 28, + 39, + 0, + -18, + 44, + -2, + -17, + 53, + 0, + -27, + 33, + 43, + 5, + -10, + 25, + 47, + -3, + -4, + 36, + 15, + -12, + -3, + 29, + 41, + 23, + 23, + -8, + -32, + 15, + 37, + 0, + 3, + 22, + 31, + 1, + -20, + 27, + 2, + -50, + 0, + 33, + 16, + -16, + -17, + 18, + -26, + -34, + 31, + -27, + -84, + -33, + 4, + -5, + -22, + -17, + -28, + -66, + -24, + 8, + -16, + -25, + -51, + -13, + 45, + -11, + -49, + -26, + -49, + -38, + 21, + 10, + -52, + -58, + -19, + -4, + 9, + -31, + -29, + 55, + 2, + -45, + 29, + 10, + -22, + 49, + 33, + -27, + -19, + -5, + 30, + 47, + 11, + -11, + -2, + 8, + 5, + 17, + 8, + 3, + 57, + 63, + 28, + 24, + 11, + 2, + 14, + 22, + 7, + 7, + 2, + 23, + 33, + -2, + -8, + 14, + 7, + 20, + 57, + 32, + -5, + 12, + 23, + 10, + 17, + 26, + -18, + -72, + -6, + 74, + 61, + 13, + -17, + -21, + -7, + 29, + 45, + 5, + -52, + -49, + 1, + 10, + 35, + 40, + -46, + -66, + 7, + 31, + -27, + -44, + -12, + -41, + -22, + 32, + -12, + -32, + -3, + -17, + -22, + -22, + -31, + -30, + -23, + -13, + 3, + 0, + -21, + -19, + -7, + -17, + -9, + 18, + -40, + -64, + 1, + 4, + -4, + 8, + -17, + -28, + -1, + 9, + -7, + -9, + 27, + 6, + -63, + -32, + 52, + 25, + -46, + -23, + -6, + -11, + 35, + 29, + -50, + -44, + 17, + -6, + -12, + 53, + 28, + -17, + -9, + 28, + 34, + -20, + -18, + 22, + 43, + 28, + -6, + 8, + 14, + 19, + 28, + 14, + 27, + 26, + 12, + 76, + 66, + -18, + -2, + 18, + -12, + -1, + -2, + -1, + 51, + 30, + -18, + 5, + 14, + -12, + 2, + 13, + -25, + -9, + 32, + 7, + -5, + 15, + -12, + -33, + -18, + -13, + 6, + 0, + -25, + -12, + 1, + -17, + 0, + 13, + -24, + -27, + 4, + 35, + 14, + -22, + 5, + 13, + -18, + -30, + -10, + -7, + -7, + 31, + 23, + -27, + -26, + 9, + 47, + 6, + -50, + -11, + 19, + 1, + 11, + 12, + -19, + -43, + -18, + 10, + -6, + -3, + 12, + 2, + -12, + -16, + 10, + 9, + -25, + -21, + -10, + -13, + 0, + 8, + -1, + -9, + 10, + 4, + -34, + 14, + 46, + 5, + 18, + 24, + -15, + -7, + 20, + -1, + -13, + 7, + 11, + 14, + 11, + -2, + 8, + 27, + 10, + -1, + 13, + -2, + -7, + 48, + 44, + -15, + -16, + -6, + 3, + 7, + -35, + -25, + 8, + -31, + -16, + 30, + 36, + 22, + -13, + -21, + -10, + 8, + 2, + -58, + -37, + 32, + 25, + -1, + -25, + -21, + 3, + 3, + -6, + -11, + -3, + 2, + 4, + 34, + 22, + -25, + -19, + 0, + -6, + -10, + -8, + -35, + -32, + 8, + -3, + -20, + -11, + -6, + 3, + 8, + -8, + 3, + 25, + 23, + -7, + -35, + -15, + 8, + -20, + -6, + 15, + -44, + -29, + 19, + -5, + -1, + 18, + 28, + 6, + -21, + 9, + 11, + -20, + -10, + 18, + 22, + 6, + -2, + 12, + 6, + 23, + 34, + -20, + -19, + 1, + -10, + 34, + 41, + 13, + 6, + 3, + 22, + 11, + -4, + 4, + -12, + -8, + 17, + 18, + 12, + -1, + 5, + 9, + -6, + -2, + 4, + 1, + 3, + 2, + -6, + -32, + -25, + 9, + 18, + 27, + -4, + -54, + -29, + 2, + -3, + -18, + -38, + -28, + -10, + 9, + 20, + 5, + -9, + -15, + -3, + 2, + -14, + -15, + -6, + 5, + 10, + 6, + 3, + -11, + -9, + -5, + -20, + -13, + 8, + 3, + -14, + 6, + 20, + -15, + -21, + 9, + 19, + 21, + 12, + -4, + -21, + -17, + 16, + 27, + -4, + -28, + -2, + 26, + 9, + -12, + -16, + -28, + -28, + -4, + 4, + -15, + -9, + 3, + -10, + -16, + 2, + 17, + -10, + -26, + 3, + 16, + 26, + 17, + -12, + -9, + 2, + -2, + -5, + -11, + 5, + 28, + 1, + -14, + 13, + 14, + 5, + 18, + 6, + -17, + -5, + 7, + 2, + -3, + 11, + 10, + -1, + 50, + 36, + -28, + 21, + 39, + -9, + -6, + 2, + 10, + 36, + 20, + -2, + -3, + -11, + -10, + -6, + -5, + -4, + -8, + 2, + 17, + 1, + -13, + 11, + -13, + -36, + 11, + 14, + -19, + -6, + 3, + 0, + 20, + -5, + -24, + 12, + 7, + -11, + 2, + -15, + -28, + -1, + 6, + -14, + -31, + -39, + -19, + 19, + 37, + 3, + -32, + -27, + -6, + 13, + 31, + 15, + -41, + -41, + 25, + 35, + -3, + -16, + -25, + -19, + -10, + -3, + 19, + 10, + -4, + 7, + -4, + -19, + -12, + -13, + -9, + 6, + 2, + -12, + -6, + 12, + 6, + -1, + -5, + -19, + -7, + 7, + 40, + 56, + -3, + -13, + 21, + 24, + 7, + -11, + -9, + -3, + 24, + 28, + -10, + 1, + 12, + 21, + 24, + -16, + -15, + 4, + -7, + -2, + 19, + 13, + -11, + -7, + -8, + 15, + 41, + 5, + -16, + -18, + -11, + 26, + 26, + -5, + -12, + -14, + -6, + 10, + 8, + -8, + -16, + -16, + -3, + 10, + 1, + -3, + -3, + -2, + -15, + -18, + 6, + -4, + -4, + 21, + 4, + -2, + 15, + 13, + 0, + -2, + 12, + 7, + -15, + -9, + 1, + -2, + 2, + -1, + -9, + -15, + -17, + -14, + -10, + 1, + -4, + -16, + -17, + -1, + 18, + 8, + 1, + 22, + 11, + -19, + -10, + 4, + -23, + -29, + 0, + -2, + -14, + -6, + 13, + 7, + -23, + -13, + 10, + 9, + 11, + 10, + 4, + -4, + -4, + 1, + 6, + 14, + 9, + 2, + 0, + 2, + 6, + 4, + -9, + -18, + -8, + 8, + 18, + 8, + 13, + 9, + -27, + -22, + -10, + -24, + -9, + 17, + 11, + 2, + 9, + 3, + -13, + -10, + -1, + -7, + -1, + 10, + -4, + 1, + 16, + 12, + -6, + -14, + -2, + -5, + -1, + 0, + -1, + 6, + -9, + -3, + 12, + 4, + 1, + -2, + 2, + 17, + 24, + 22, + 9, + 8, + 21, + 14, + -2, + -2, + 4, + -1, + -7, + -7, + -6, + -1, + -6, + 17, + 30, + -7, + -10, + -3, + -19, + -18, + 2, + 21, + 4, + -20, + -6, + -1, + -18, + -14, + -6, + -7, + -1, + 6, + 10, + 8, + -5, + 0, + 10, + -22, + -40, + -22, + 4, + 34, + 16, + -19, + -16, + -12, + -17, + -16, + -17, + -29, + -28, + -4, + 10, + 16, + 22, + 13, + 4, + -1, + -5, + 16, + 15, + -11, + -6, + 9, + 3, + -14, + -22, + -19, + -12, + 5, + -5, + -15, + 3, + 9, + 27, + 17, + -4, + 8, + -2, + 1, + 16, + 11, + 9, + 9, + 8, + -14, + -16, + 7, + -5, + -15, + -11, + -5, + 19, + 25, + 25, + 43, + 21, + -9, + -9, + -19, + -10, + 14, + -11, + -19, + 8, + 3, + 1, + 11, + -1, + -24, + -20, + -1, + 2, + 7, + 24, + 22, + 11, + 8, + 6, + -2, + -11, + -3, + -2, + -4, + 0, + -7, + 0, + 6, + -1, + -16, + -35, + -8, + 8, + -11, + -6, + 6, + 18, + 16, + 7, + 12, + 5, + -2, + -3, + -10, + -21, + -27, + -10, + -3, + -3, + 8, + 0, + -9, + -10, + -3, + 0, + -5, + 6, + 9, + 19, + 23, + 8, + -5, + -19, + -16, + -5, + -6, + -27, + -22, + 1, + 6, + 8, + 2, + -9, + -13, + -15, + -18, + -13, + 4, + 25, + 29, + 26, + -2, + -22, + 1, + 8, + 1, + -6, + -6, + -7, + -20, + 0, + 13, + -14, + -24, + -24, + -21, + 2, + 14, + 16, + 23, + 15, + 10, + 10, + 5, + 0, + -26, + -32, + 3, + 19, + 5, + -8, + -7, + -8, + -3, + 17, + 27, + -7, + -28, + 10, + 32, + 10, + 1, + 10, + 3, + -4, + 22, + 24, + -31, + -40, + 0, + 6, + 5, + 17, + 17, + 1, + 10, + 30, + 8, + -12, + -6, + 9, + 6, + -12, + -5, + 1, + -4, + 6, + 11, + 0, + -9, + -4, + -3, + -4, + -3, + 2, + 0, + -2, + -9, + -27, + -23, + 2, + 13, + -6, + -9, + -3, + -12, + -2, + 10, + 6, + -7, + -19, + -31, + -13, + 16, + 11, + -3, + -13, + -15, + 0, + 7, + -3, + -7, + -1, + -4, + 7, + 15, + 0, + -12, + -8, + -1, + -7, + -12, + -21, + -17, + 5, + 30, + 25, + -6, + -6, + 0, + -12, + -8, + 2, + 13, + 11, + 1, + 5, + 4, + 4, + 10, + -1, + -20, + -12, + -4, + 3, + 15, + 11, + -7, + -24, + -4, + 8, + -2, + -14, + -25, + -17, + 7, + 21, + 14, + 1, + 0, + 12, + 17, + 13, + 6, + 1, + 6, + 14, + 11, + -10, + -21, + -12, + -4, + 3, + -2, + -21, + -24, + -2, + 12, + 14, + 17, + 4, + -2, + 11, + 11, + 11, + 1, + -34, + -32, + -5, + 10, + 7, + -11, + -12, + 6, + 7, + -4, + -10, + -15, + -5, + 17, + 21, + 0, + -15, + -15, + -1, + 5, + -18, + -18, + -10, + -9, + 24, + 27, + -9, + -14, + 0, + 9, + 25, + 22, + 1, + -7, + -2, + 16, + 13, + -14, + -10, + 7, + 0, + 2, + 15, + 2, + -9, + 5, + 10, + -5, + -3, + 10, + 3, + 0, + 15, + 15, + -1, + -3, + 8, + 6, + -7, + -7, + 2, + 0, + -4, + 5, + -8, + -37, + -28, + -1, + 8, + 6, + 10, + -1, + -12, + 12, + 28, + 8, + -17, + -16, + -15, + -17, + 1, + 6, + -4, + -8, + -4, + -15, + -15, + 6, + -9, + -15, + 10, + 9, + -13, + -8, + 5, + -2, + -10, + 5, + 12, + -27, + -33, + 9, + 8, + -16, + -3, + 16, + -3, + -7, + 22, + 22, + 10, + 5, + -11, + -16, + -4, + 9, + 12, + 6, + -3, + 2, + 2, + -1, + 4, + -7, + -8, + 1, + 8, + 19, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h new file mode 100644 index 00000000..10ae971f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_1000ms_sample_data.h @@ -0,0 +1,29 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was created from the PCM data in a WAV file held in v2 of the +// Speech Commands test dataset, at the path: +// speech_commands_test_set_v0.02/yes/f2e59fea_nohash_1.wav +// This should contain all 16,000 samples from the one-second file. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_YES_1000MS_SAMPLE_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_YES_1000MS_SAMPLE_DATA_H_ + +#include + +extern const int g_yes_1000ms_sample_data_size; +extern const int16_t g_yes_1000ms_sample_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_YES_1000MS_SAMPLE_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.cc new file mode 100644 index 00000000..048ecb8f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.cc @@ -0,0 +1,502 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// See the header for documentation on the meaning of this data. + +#include "tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h" + +const int g_yes_30ms_sample_data_size = 480; +const int16_t g_yes_30ms_sample_data[480] = { + -876, + -470, + 510, + 803, + 170, + -787, + -1568, + -1893, + -1598, + -1027, + -992, + -1803, + -2610, + -2484, + -1905, + -2113, + -3113, + -3399, + -2267, + -1261, + -2007, + -3637, + -3909, + -2340, + -893, + -1158, + -2272, + -2486, + -1639, + -915, + -777, + -596, + -91, + 196, + 85, + 210, + 875, + 1373, + 1247, + 1219, + 1958, + 2718, + 2328, + 1196, + 1008, + 2350, + 3677, + 3269, + 1503, + 366, + 922, + 2264, + 2810, + 1996, + 608, + -168, + 75, + 680, + 811, + 395, + -56, + -318, + -607, + -966, + -1108, + -925, + -613, + -368, + -369, + -919, + -1926, + -2460, + -1685, + -300, + 155, + -611, + -1524, + -2204, + -3227, + -3859, + -2037, + 1622, + 2382, + -2583, + -8448, + -7544, + -84, + 4814, + 915, + -6423, + -7558, + -1746, + 2515, + -59, + -4587, + -3858, + 1260, + 3625, + 187, + -4148, + -3500, + 1542, + 5467, + 4780, + 1256, + -1127, + -403, + 2481, + 5332, + 6346, + 5014, + 2536, + 1216, + 2467, + 5039, + 6238, + 5070, + 3381, + 3269, + 4173, + 3905, + 2248, + 1586, + 3299, + 5240, + 4362, + 1004, + -1382, + -489, + 2113, + 3168, + 1620, + -742, + -1824, + -1435, + -897, + -1058, + -1500, + -1545, + -1398, + -1965, + -3266, + -4136, + -3756, + -2609, + -1804, + -1986, + -3087, + -4599, + -5296, + -4051, + -1731, + -781, + -2228, + -4092, + -3977, + -2325, + -1353, + -1568, + -1490, + -428, + 178, + -672, + -1650, + -1058, + 749, + 2039, + 2079, + 1540, + 897, + 310, + 572, + 2266, + 4265, + 4265, + 1869, + -231, + 559, + 3332, + 4752, + 3229, + 768, + 101, + 1364, + 2463, + 1984, + 819, + 411, + 723, + 675, + -162, + -923, + -743, + -32, + 185, + -516, + -1653, + -2359, + -2103, + -986, + 42, + -205, + -1702, + -2870, + -2337, + -809, + -221, + -982, + -1544, + -946, + -598, + -2117, + -4291, + -4100, + -857, + 1948, + 338, + -4799, + -7972, + -5403, + 173, + 2371, + -1063, + -5533, + -5578, + -1777, + 605, + -985, + -3249, + -2213, + 1184, + 2691, + 560, + -2356, + -2288, + 1233, + 5244, + 6441, + 4004, + 370, + -663, + 2555, + 7404, + 9282, + 6573, + 2612, + 1836, + 4662, + 7467, + 7393, + 5421, + 4262, + 4741, + 5362, + 4705, + 3163, + 2397, + 3337, + 4887, + 4810, + 2254, + -749, + -1316, + 772, + 2706, + 2016, + -573, + -2552, + -2746, + -2012, + -1647, + -1978, + -2579, + -3105, + -3473, + -3911, + -4484, + -4891, + -4795, + -4163, + -3543, + -3538, + -4275, + -5356, + -5743, + -4637, + -2614, + -1301, + -1825, + -3341, + -4011, + -2937, + -751, + 1007, + 1245, + 235, + -639, + -61, + 1626, + 2864, + 2967, + 2734, + 3013, + 3329, + 2914, + 2312, + 2666, + 3839, + 4308, + 3162, + 1453, + 768, + 1255, + 1887, + 2006, + 1715, + 1031, + -297, + -1660, + -1690, + -277, + 813, + -30, + -2137, + -3370, + -2854, + -1553, + -593, + -413, + -1146, + -2567, + -3440, + -2369, + -205, + 379, + -1258, + -2315, + -812, + 262, + -3205, + -8576, + -7894, + 738, + 7492, + 1951, + -11595, + -17098, + -6934, + 7139, + 8065, + -4575, + -14199, + -8946, + 3606, + 7504, + -547, + -8242, + -5113, + 4406, + 8113, + 2134, + -5040, + -4089, + 4157, + 10934, + 10158, + 4167, + -565, + -192, + 4428, + 9765, + 12201, + 9861, + 4512, + 1225, + 3451, + 8483, + 10133, + 6497, + 2574, + 3333, + 6806, + 6986, + 2487, + -1214, + 623, + 5416, + 6647, + 2204, + -3289, + -4556, + -1565, + 1544, + 1525, + -1236, + -4293, + -5695, + -5174, + -3995, + -3403, + -3449, + -3750, + -4505, + -6014, + -7296, + -6523, + -3849, + -2096, + -3288, + -5722, + -6004, + -3581, + -1497, + -1960, + -3330, + -2800, + -434, + 964, + -111, + -1739, + -1136, + 1736, + 4151, + 3736, + 1274, + -451, + 469, + 3386, + 5833, + 5898, + 3646, + 1085, + 272, + 1743, + 4061, + 5108, + 3837, + 1490, + 246, + 967, + 1866, + 859, + -1069, + -974, + 1542, + 2835, + 47, + -4285, + -5068, + -1567, + 1781, + 1223, + -1997, + -4227, + -3747, + -1720, + 41, + 245, + -1228, + -2972, + -2673, + 22, + 1980, + -930, + -7721, + -11271, + -5725, + 4974, + 8484, + -2007, + -16979, + -19255, + -4670, + 11057, + 9690, + -6417, + -17537, + -10841, + 4262, + 9292, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h new file mode 100644 index 00000000..caa555c0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/micro_speech/yes_30ms_sample_data.h @@ -0,0 +1,32 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was created from the PCM data in a WAV file held in v2 of the +// Speech Commands test dataset, at the path: +// speech_commands_test_set_v0.02/yes/f2e59fea_nohash_1.wav +// The data was extracted starting at an offset of 8,000, which corresponds to +// the 26th spectrogram slice. It's designed to be used to test the +// preprocessing pipeline, to ensure that the expected spectrogram slice is +// produced given this input. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_YES_30MS_SAMPLE_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_YES_30MS_SAMPLE_DATA_H_ + +#include + +extern const int g_yes_30ms_sample_data_size; +extern const int16_t g_yes_30ms_sample_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_MICRO_SPEECH_YES_30MS_SAMPLE_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/README.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/README.md new file mode 100644 index 00000000..7729f35d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/README.md @@ -0,0 +1,64 @@ +The aim of this application is to provide a quick way to test different +networks. + +It contains one testcase and a default network model (network_model.h), default +input data (input_data.h) and default expected output data +(expected_output_data.h). The header files were created using the `xxd` command. + +The default model is a single int8 DepthwiseConv2D operator, with an input shape +of {1, 8, 8, 16}, {1, 2, 2, 16} and {16} and an output shape of {1, 4, 4, 16}. + +When building the FVP target for Ethos-U (CO_PROCESSOR=ethos_u) the person +detect int8 model is used instead. The downloaded model is optimized for Ethos-U +with Ethos-U Vela. For more info see the following readmes: +tensorflow/lite/micro/kernels/ethos_u/README.md +tensorflow/lite/micro/cortex_m_corstone_300/README.md +tensorflow/lite/micro/examples/person_detection/README.md The following Vela +configuration has been used, which is compatible with the FVP build target +(TARGET=cortex_m_corstone_300). + +``` +vela --accelerator-config=ethos-u55-256 +``` + +In order to use another model, input data, or expected output data, simply +specify the path to the new header files when running make as seen below. + +The variables in the specified header files (array and array length) need to +have the same name and type as the ones in the default header files. The include +guards also needs to be the same. When swapping out the network model, it is +likely that the memory allocated by the interpreter needs to be increased to fit +the new model. This is done by using the `ARENA_SIZE` option when running +`make`. + +``` +make -f tensorflow/lite/micro/tools/make/Makefile network_tester_test \ + NETWORK_MODEL=path/to/network_model.h \ + INPUT_DATA=path/to/input_data.h \ + OUTPUT_DATA=path/to/expected_output_data.h \ + ARENA_SIZE= \ + NUM_BYTES_TO_PRINT= \ + COMPARE_OUTPUT_DATA=no +``` + +`NETWORK_MODEL`: The path to the network model header. \ +`INPUT_DATA`: The path to the input data. \ +`OUTPUT_DATA`: The path to the expected output data. \ +`ARENA_SIZE`: The size of the memory to be allocated (in bytes) by the +interpreter. \ +`NUM_BYTES_TO_PRINT`: The number of bytes of the output data to print. \ +If set to 0, all bytes of the output are printed. \ +`COMPARE_OUTPUT_DATA`: If set to "no" the output data is not compared to the +expected output data. This could be useful e.g. if the execution time needs to +be minimized, or there is no expected output data. If omitted, the output data +is compared to the expected output. `NUM_INFERENCES`: Define how many inferences +that are made. Defaults to 1. \ + +The output is printed in JSON format using printf: `num_of_outputs: 1 +output_begin [ { "dims": [4,1,2,2,1], "data_address": "0x000000", +"data":"0x06,0x08,0x0e,0x10" }] output_end` + +If there are multiple output tensors, the output will look like this: +`num_of_outputs: 2 output_begin [ { "dims": [4,1,2,2,1], "data_address": +"0x000000", "data":"0x06,0x08,0x0e,0x10" }, { "dims": [4,1,2,2,1], +"data_address": "0x111111", "data":"0x06,0x08,0x0e,0x10" }] output_end` diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/expected_output_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/expected_output_data.h new file mode 100644 index 00000000..7e913945 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/expected_output_data.h @@ -0,0 +1,48 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_EXPECTED_OUTPUT_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_EXPECTED_OUTPUT_DATA_H_ + +#ifdef ETHOS_U +static unsigned char expected_output_data[] = { 143, 113 }; +#else +static unsigned char expected_output_data[] = { + 0x07, 0xf3, 0x16, 0xf3, 0x3a, 0x1f, 0xb1, 0x45, 0xce, 0x12, 0xc2, 0xbb, + 0xf5, 0x47, 0x45, 0x91, 0x13, 0x21, 0xc7, 0x07, 0xa2, 0x2c, 0xf2, 0xf7, + 0xd1, 0xe1, 0x08, 0xf5, 0x0a, 0x58, 0x40, 0xb0, 0xd9, 0xf1, 0x37, 0x1e, + 0xf1, 0x0d, 0xea, 0x05, 0xf9, 0xee, 0xfa, 0xca, 0x37, 0xb9, 0xc4, 0xd8, + 0x15, 0xe3, 0xd7, 0xd3, 0x36, 0x14, 0xb7, 0xed, 0x43, 0xfa, 0x29, 0xbe, + 0xff, 0xdb, 0x38, 0xc7, 0x00, 0xf1, 0x06, 0xbe, 0x31, 0x5b, 0xe9, 0x02, + 0xf0, 0x07, 0x13, 0x25, 0xe1, 0xf0, 0x0e, 0x12, 0x17, 0xd2, 0x51, 0x48, + 0x2a, 0x24, 0xf2, 0x0a, 0x3d, 0x05, 0x0b, 0x67, 0xc3, 0xea, 0x0a, 0xbf, + 0x22, 0x40, 0x20, 0x18, 0x54, 0xd3, 0x31, 0xef, 0xe7, 0x04, 0x3c, 0xf6, + 0xcf, 0xe2, 0x79, 0xed, 0xec, 0xff, 0xfa, 0xcf, 0xc2, 0x42, 0x1f, 0x0d, + 0xf8, 0xc2, 0x36, 0x1d, 0x09, 0x01, 0xd2, 0x09, 0xda, 0xdf, 0xe8, 0x1f, + 0x06, 0xdf, 0xf7, 0x3c, 0x4d, 0xe5, 0xb4, 0xc1, 0xfa, 0x03, 0x22, 0xbc, + 0x08, 0xea, 0x72, 0x3a, 0xc8, 0x0b, 0xe6, 0x1c, 0x00, 0xef, 0xf1, 0x34, + 0x01, 0xbe, 0xf7, 0x92, 0xe6, 0xc1, 0xe3, 0x25, 0xe5, 0x4c, 0xf1, 0xbb, + 0x6f, 0x07, 0x63, 0x80, 0x2a, 0xae, 0x46, 0xf1, 0x3c, 0x01, 0xe8, 0xda, + 0xed, 0x15, 0xfc, 0x56, 0x18, 0x16, 0x16, 0xc1, 0xf5, 0xef, 0x64, 0x03, + 0xa5, 0x0c, 0x15, 0x25, 0xe0, 0x51, 0x23, 0xec, 0x31, 0xfe, 0xe9, 0xd9, + 0x0c, 0x09, 0x42, 0xd8, 0xbc, 0x15, 0xe1, 0x21, 0xe4, 0x09, 0x4f, 0xb5, + 0xd6, 0x0c, 0x04, 0x20, 0xdf, 0x99, 0x2e, 0xe8, 0x06, 0xad, 0xf5, 0x04, + 0xf7, 0x1b, 0x5b, 0x63, 0xaa, 0xf3, 0xf0, 0xfc, 0x05, 0x35, 0xf1, 0x1d, + 0x40, 0x2d, 0xf6, 0xfa, 0xdd, 0x07, 0xfe, 0x32, 0x6d, 0x1b, 0x01, 0x31, + 0x39, 0xcb, 0x22, 0xf8 +}; +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_EXPECTED_OUTPUT_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/input_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/input_data.h new file mode 100644 index 00000000..9ae193b8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/input_data.h @@ -0,0 +1,109 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_INPUT_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_INPUT_DATA_H_ + +static const int input_data_len = 1024; +static const unsigned char input_data[] = { + 0x2c, 0x8a, 0xff, 0x0c, 0xaf, 0x2a, 0x44, 0x17, 0xf5, 0x26, 0x96, 0x37, + 0x40, 0x4c, 0xa1, 0x58, 0xc3, 0x33, 0xce, 0x1a, 0x7b, 0xd2, 0x22, 0x5b, + 0x43, 0xf6, 0xfd, 0x0b, 0xe7, 0xfd, 0x65, 0x58, 0x89, 0x24, 0xf4, 0xec, + 0x53, 0x5e, 0x21, 0x1f, 0x95, 0xd1, 0xd9, 0x25, 0x72, 0x56, 0xe6, 0xe2, + 0xa4, 0x37, 0x85, 0xf0, 0xd7, 0xba, 0xab, 0xcc, 0xc6, 0xbc, 0xcb, 0x64, + 0x58, 0x3d, 0x04, 0x8e, 0xd8, 0x1a, 0x32, 0x76, 0x0c, 0x4d, 0x4c, 0xc5, + 0xba, 0xb9, 0xa9, 0xe2, 0x41, 0xc2, 0xc8, 0xfa, 0x66, 0xfd, 0x2e, 0x4a, + 0xa7, 0xca, 0x6a, 0x4f, 0xd7, 0x28, 0xe5, 0x07, 0x2e, 0x48, 0x5f, 0xfa, + 0xd8, 0xde, 0xeb, 0x11, 0xd1, 0x0b, 0x0d, 0xe4, 0x25, 0x66, 0x73, 0x6c, + 0x99, 0xc2, 0x89, 0x56, 0xcd, 0xeb, 0xaf, 0x92, 0xc8, 0x18, 0xdf, 0xd6, + 0x89, 0x9b, 0xce, 0x96, 0x14, 0x17, 0x6e, 0x25, 0xf3, 0x88, 0xad, 0x85, + 0x50, 0x93, 0xc5, 0xde, 0x73, 0x12, 0xa6, 0x55, 0x45, 0x9e, 0x88, 0x75, + 0x7e, 0xc7, 0xb5, 0x47, 0xcf, 0x87, 0x6e, 0xa3, 0x2f, 0x9d, 0x39, 0x5e, + 0x40, 0x89, 0x3e, 0x5e, 0xd2, 0x3b, 0x06, 0x7a, 0xe3, 0xe0, 0xbe, 0xf9, + 0x58, 0x27, 0x15, 0x4c, 0x31, 0xfc, 0x88, 0x4d, 0x73, 0x02, 0xa3, 0xf6, + 0x9d, 0x83, 0xbe, 0x05, 0x13, 0x42, 0x50, 0x47, 0x13, 0x8c, 0x4b, 0x2d, + 0x0e, 0xbb, 0xc7, 0x9e, 0x27, 0xe1, 0xfb, 0x38, 0xa0, 0x5d, 0x51, 0x23, + 0x41, 0xbf, 0x7f, 0x14, 0x89, 0x4d, 0x32, 0xa4, 0x39, 0xca, 0x11, 0x09, + 0xff, 0x52, 0x55, 0x71, 0xa0, 0x22, 0xb4, 0x42, 0x9f, 0x5a, 0x17, 0x05, + 0x4a, 0x42, 0x9c, 0x9b, 0x74, 0xc8, 0xa7, 0xea, 0x17, 0x60, 0xbd, 0xf9, + 0x23, 0x6a, 0x39, 0xc3, 0x7e, 0xf9, 0x33, 0xaf, 0x4b, 0xad, 0xb4, 0x46, + 0xf2, 0x2b, 0x26, 0x3c, 0x37, 0xc4, 0x46, 0xf4, 0x9c, 0x58, 0xef, 0xb7, + 0xa2, 0x63, 0x04, 0x11, 0x00, 0x28, 0x1d, 0xa2, 0x00, 0xe8, 0x4f, 0x84, + 0x24, 0x67, 0x7a, 0xd2, 0xb5, 0xdc, 0x9d, 0x1e, 0x05, 0x97, 0xd1, 0xa6, + 0xa6, 0xce, 0x32, 0x1c, 0x68, 0x8d, 0x6a, 0xb8, 0x74, 0xe2, 0x6f, 0x1d, + 0x91, 0x71, 0x70, 0xe2, 0xcf, 0xf9, 0x19, 0x71, 0x04, 0x31, 0x90, 0x67, + 0xe9, 0x46, 0x0b, 0x2e, 0xaa, 0x6c, 0xaf, 0xf3, 0x3a, 0x35, 0x88, 0xdc, + 0x9f, 0x3a, 0x71, 0x1c, 0xf8, 0xd3, 0x61, 0xef, 0x81, 0xd1, 0x80, 0x67, + 0xc1, 0x75, 0x17, 0x32, 0x67, 0xef, 0xea, 0x99, 0x29, 0x6f, 0xea, 0x8f, + 0xb9, 0xe8, 0xc5, 0x78, 0xa3, 0xb9, 0x31, 0x2a, 0xe6, 0xaf, 0xb4, 0x27, + 0xf7, 0x6c, 0x2e, 0x2b, 0x8b, 0x3b, 0x40, 0xab, 0x2e, 0x21, 0x5b, 0xb5, + 0xd2, 0x5c, 0x2f, 0xdb, 0xdb, 0xd0, 0x81, 0xa1, 0x00, 0x77, 0xac, 0x40, + 0x0e, 0x69, 0x3f, 0xd0, 0xe3, 0x4a, 0x1a, 0x1b, 0xb5, 0xa6, 0x9c, 0xdd, + 0x0c, 0xcb, 0xb6, 0xd3, 0xf9, 0xea, 0x78, 0x11, 0x2a, 0xbf, 0x56, 0x89, + 0xd4, 0xb0, 0xc8, 0xf0, 0x4b, 0x48, 0xdf, 0x22, 0xc4, 0x91, 0x86, 0x7d, + 0x86, 0x33, 0xfd, 0x75, 0x44, 0x1b, 0x9f, 0x9a, 0xaf, 0xc4, 0x9d, 0x27, + 0xff, 0x72, 0xf8, 0xb5, 0x74, 0xb7, 0x13, 0x22, 0x03, 0x14, 0xcb, 0xa9, + 0x4c, 0x73, 0x4b, 0x7e, 0xe4, 0x9b, 0xb2, 0x27, 0x34, 0xa4, 0x74, 0x14, + 0x68, 0x37, 0x57, 0xc0, 0xce, 0x8f, 0x94, 0xea, 0x0f, 0xa4, 0xe0, 0xf7, + 0x14, 0x46, 0x05, 0xf9, 0x63, 0x2c, 0x12, 0xbe, 0x3a, 0xdb, 0x1e, 0x1f, + 0x97, 0xbb, 0x32, 0xa8, 0x4f, 0x2a, 0x07, 0xd6, 0x0d, 0x0b, 0xc1, 0x9c, + 0xf5, 0x11, 0x3c, 0x2c, 0xd5, 0xb7, 0x85, 0x28, 0xb0, 0xa2, 0xb4, 0xd1, + 0xb1, 0x75, 0xdf, 0xa3, 0xc5, 0x26, 0xc1, 0x47, 0x29, 0xb8, 0xd3, 0xb2, + 0x23, 0x96, 0x97, 0x73, 0x40, 0x45, 0xe4, 0xde, 0xdf, 0xdc, 0x1b, 0x29, + 0x45, 0x1c, 0xac, 0x52, 0xde, 0xee, 0xf9, 0x83, 0x80, 0x21, 0x5b, 0x98, + 0xf1, 0x57, 0xf2, 0x1f, 0x32, 0x0e, 0x03, 0x56, 0xa4, 0x75, 0xf4, 0x2c, + 0x22, 0x67, 0x19, 0x98, 0xb0, 0xe3, 0x51, 0x78, 0xdd, 0xbf, 0x79, 0x79, + 0x03, 0xc9, 0x51, 0x60, 0xe2, 0x06, 0x79, 0xf7, 0xaa, 0x3e, 0xf6, 0x02, + 0x4d, 0x83, 0x8d, 0x7a, 0xf0, 0xd1, 0xc3, 0x8e, 0x67, 0xa7, 0x57, 0x1a, + 0x15, 0xab, 0xff, 0xf3, 0x49, 0xe0, 0xc0, 0x3d, 0xff, 0x69, 0x9d, 0x85, + 0x80, 0xb6, 0x88, 0x8a, 0x0a, 0x77, 0x93, 0xf1, 0xf2, 0x89, 0xe6, 0xc8, + 0xab, 0xb2, 0x46, 0x7a, 0x3a, 0xb3, 0x45, 0x9e, 0xff, 0x0d, 0x84, 0xdc, + 0x97, 0x58, 0x4f, 0xcb, 0x3b, 0x56, 0x9b, 0xfb, 0x02, 0x70, 0xe4, 0x9e, + 0xf9, 0x99, 0xcc, 0x30, 0xe2, 0xd8, 0xe7, 0xd1, 0xbe, 0x5e, 0xe6, 0x61, + 0x23, 0xa3, 0x8d, 0xea, 0x5e, 0xfa, 0x91, 0x6b, 0xfb, 0x78, 0xeb, 0x90, + 0x43, 0x27, 0x01, 0xb7, 0xd2, 0x5a, 0xc5, 0x31, 0x2e, 0xb7, 0x30, 0x10, + 0x63, 0x4a, 0x8c, 0x11, 0x14, 0xdc, 0xf7, 0x5d, 0x51, 0x10, 0x70, 0xc3, + 0xb2, 0x4a, 0xcb, 0x02, 0x1b, 0x15, 0x73, 0x05, 0x8e, 0xdb, 0x2e, 0x6a, + 0xa9, 0xfc, 0x8c, 0x98, 0xba, 0x7c, 0x50, 0x6b, 0x41, 0xba, 0xf1, 0x13, + 0xa4, 0x5c, 0xc6, 0x95, 0x8a, 0xdb, 0x66, 0x6d, 0xd6, 0x10, 0x98, 0xc7, + 0xab, 0x3c, 0x0d, 0xd1, 0xe8, 0xb3, 0xe5, 0x82, 0x8b, 0xe8, 0x5b, 0x2a, + 0x82, 0x3b, 0x23, 0x57, 0xb3, 0x01, 0x3d, 0xa1, 0xd0, 0xb4, 0x2d, 0x25, + 0xa0, 0xb8, 0xe1, 0x37, 0x36, 0x94, 0xe5, 0x57, 0x00, 0x04, 0x96, 0xca, + 0xa6, 0xdb, 0x45, 0xc3, 0x93, 0x21, 0x65, 0xae, 0x2e, 0x14, 0x57, 0xe5, + 0xaa, 0x36, 0xa5, 0x16, 0xf3, 0x35, 0x05, 0x0d, 0x38, 0x44, 0xa5, 0x85, + 0x3c, 0x09, 0xb9, 0xaa, 0x68, 0xe9, 0xb5, 0x54, 0xcd, 0x3e, 0x2b, 0xde, + 0x9e, 0x39, 0xb3, 0x81, 0x98, 0xb5, 0xfd, 0xa5, 0xfd, 0xe2, 0x05, 0x2d, + 0x82, 0x03, 0x52, 0x11, 0x83, 0xbe, 0x9f, 0xc5, 0xde, 0xa0, 0xa8, 0x34, + 0x62, 0x2c, 0xb5, 0x3c, 0xeb, 0x17, 0x59, 0xc9, 0x8d, 0x7d, 0xd1, 0x76, + 0xf0, 0x77, 0x6b, 0xee, 0xa8, 0xc9, 0x2e, 0xbf, 0xc8, 0xb5, 0x10, 0x41, + 0x93, 0x8c, 0xff, 0x13, 0xdf, 0x32, 0xe6, 0xe5, 0xc8, 0x8f, 0x10, 0x17, + 0x1a, 0x45, 0xe2, 0x65, 0x42, 0x99, 0xff, 0x12, 0x78, 0xd4, 0x10, 0x23, + 0x34, 0x60, 0x9b, 0xb9, 0xc3, 0x69, 0xbc, 0x64, 0x6c, 0xdb, 0x67, 0x73, + 0xbd, 0x9f, 0x98, 0x2e, 0x8e, 0x4f, 0xf6, 0xf2, 0xe0, 0x1f, 0x7e, 0xf2, + 0x84, 0xbd, 0x2e, 0x58, 0x43, 0x1f, 0x03, 0x7a, 0x6d, 0x92, 0x91, 0x33, + 0x0b, 0xe8, 0x3f, 0x9d, 0x7c, 0x53, 0xa4, 0xcc, 0xd6, 0x2a, 0xdb, 0x44, + 0x4d, 0x8d, 0xd5, 0x50, 0xf9, 0x8b, 0xed, 0xe9, 0xed, 0xe6, 0x01, 0xe5, + 0xcb, 0x13, 0x69, 0x2c, 0x38, 0x7a, 0x0f, 0x61, 0x90, 0x26, 0x72, 0xbf, + 0x18, 0xcc, 0x4e, 0x14, 0x1d, 0x93, 0xaf, 0xd0, 0x15, 0xe8, 0x39, 0x61, + 0xee, 0x04, 0xa5, 0x77, 0x99, 0x40, 0xc9, 0x31, 0x50, 0x25, 0x25, 0x16, + 0x3c, 0xc3, 0x2a, 0x39, 0xf9, 0x87, 0x60, 0x28, 0xf6, 0x4b, 0xd6, 0x00, + 0xf5, 0xb4, 0x00, 0x08, 0x3d, 0x65, 0x41, 0x74, 0xd3, 0xb6, 0x84, 0xbb, + 0x21, 0x0a, 0x5c, 0x24, 0xe8, 0xa7, 0x96, 0xe5, 0x20, 0x43, 0x01, 0xec, + 0x64, 0xbc, 0xea, 0x1e, 0x7b, 0x15, 0xbc, 0x1b, 0x7b, 0x6a, 0x10, 0xf9, + 0xf9, 0x58, 0x69, 0x84, 0xc6, 0x15, 0xda, 0xf8, 0x55, 0x81, 0xb4, 0xcd, + 0x9f, 0x29, 0xd0, 0x37 +}; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_INPUT_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_model.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_model.h new file mode 100644 index 00000000..d6315bd8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_model.h @@ -0,0 +1,167 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_NETWORK_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_NETWORK_MODEL_H_ + +const unsigned char network_model[] = { + 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x12, 0x00, + 0x1c, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, + 0x34, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, + 0x06, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x92, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xff, 0xff, 0xff, + 0xb2, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x0d, 0x52, 0x1b, 0x0f, 0xec, 0x2f, 0xee, 0x7f, 0x7f, 0xc4, 0x68, 0x08, + 0x19, 0x7f, 0x81, 0x81, 0x81, 0x7f, 0x49, 0x7f, 0x7c, 0x5f, 0xf5, 0x5b, + 0x97, 0x48, 0x81, 0x7f, 0x08, 0xe7, 0xba, 0x54, 0xf4, 0x1a, 0x81, 0x28, + 0x1d, 0x25, 0x7f, 0x3b, 0xda, 0xe0, 0x46, 0x82, 0x3e, 0x33, 0xaa, 0x8e, + 0xcf, 0xcc, 0x13, 0xeb, 0x7f, 0x81, 0xad, 0x92, 0x2a, 0x81, 0xf4, 0xb7, + 0x81, 0x8c, 0x2e, 0x91, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x4d, 0x4c, 0x49, 0x52, + 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x04, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xbc, 0x03, 0x00, 0x00, + 0x78, 0x02, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x62, 0xfc, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x70, 0x00, 0x00, 0x00, + 0x54, 0xfc, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xb6, 0xdb, 0x56, 0x3c, 0x01, 0x00, 0x00, 0x00, + 0x36, 0x14, 0xda, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x7d, 0xf5, 0xd1, 0xbf, + 0x2a, 0x00, 0x00, 0x00, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x62, 0x6c, + 0x65, 0x30, 0x2f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x77, 0x69, 0x73, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x64, 0x65, 0x70, 0x74, + 0x68, 0x77, 0x69, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xfa, 0xfc, 0xff, 0xff, + 0x28, 0x00, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, + 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, + 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x95, 0xf7, 0x3b, + 0x6f, 0xa4, 0xab, 0x3b, 0xd3, 0x51, 0xf8, 0x3b, 0x1b, 0xf0, 0xbe, 0x3b, + 0x2b, 0x04, 0xfc, 0x3b, 0x7f, 0x5b, 0xcd, 0x3b, 0xed, 0xfc, 0xe4, 0x3b, + 0xcf, 0x2a, 0xca, 0x3b, 0xbc, 0x43, 0xef, 0x3b, 0x5d, 0x9e, 0x7e, 0x3b, + 0x7b, 0x0a, 0xb8, 0x3b, 0x92, 0x76, 0xe5, 0x3b, 0x81, 0xfb, 0xaf, 0x3b, + 0x0b, 0x9f, 0xdb, 0x3b, 0xe1, 0x5b, 0xdd, 0x3b, 0xe6, 0x0d, 0xd5, 0x3b, + 0x10, 0x00, 0x00, 0x00, 0xab, 0xf0, 0xc7, 0x3d, 0x26, 0x4d, 0x2a, 0x3f, + 0x90, 0x6a, 0x0e, 0x3f, 0x3b, 0x72, 0x3d, 0x3f, 0x23, 0x0c, 0x7a, 0x3f, + 0x50, 0x2b, 0x19, 0x3f, 0xf3, 0x32, 0x63, 0x3f, 0x79, 0x96, 0x48, 0x3f, + 0x35, 0x65, 0x6d, 0x3f, 0x75, 0x47, 0x8f, 0x3e, 0xfc, 0x5c, 0x15, 0x3f, + 0xa5, 0xab, 0x63, 0x3f, 0xe5, 0xc4, 0xaa, 0x3e, 0xcd, 0xe7, 0x59, 0x3f, + 0xdd, 0x14, 0xa0, 0x3e, 0x5c, 0x68, 0x0c, 0x3f, 0x10, 0x00, 0x00, 0x00, + 0xef, 0xa5, 0x75, 0xbf, 0x67, 0x8f, 0x8b, 0xbe, 0x2f, 0x61, 0x76, 0xbf, + 0xfb, 0x7c, 0xfb, 0xbd, 0xdf, 0x5a, 0x1c, 0xbe, 0xc8, 0xc0, 0x4b, 0xbf, + 0x1b, 0x0e, 0x15, 0xbf, 0xd7, 0x68, 0x2d, 0xbf, 0x89, 0x71, 0x43, 0xbf, + 0x20, 0xa1, 0xfc, 0xbe, 0x66, 0x9a, 0x36, 0xbf, 0x21, 0x2a, 0x61, 0xbf, + 0x8a, 0x9b, 0x2e, 0xbf, 0xe9, 0x7c, 0x47, 0xbf, 0x29, 0xa1, 0x5b, 0xbf, + 0xca, 0x63, 0x53, 0xbf, 0x26, 0x00, 0x00, 0x00, 0x73, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x62, 0x6c, 0x65, 0x30, 0x2f, 0x64, 0x65, 0x70, 0x74, 0x68, + 0x77, 0x69, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x77, 0x69, 0x73, 0x65, 0x32, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xce, 0xfe, 0xff, 0xff, + 0x20, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x14, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0xba, 0x5e, 0x78, 0x38, 0x38, 0x30, 0x2c, 0x38, + 0x0e, 0x1c, 0x79, 0x38, 0x9b, 0x8b, 0x3f, 0x38, 0x68, 0xd1, 0x7c, 0x38, + 0xbd, 0x02, 0x4e, 0x38, 0x69, 0xb7, 0x65, 0x38, 0x74, 0xcf, 0x4a, 0x38, + 0x97, 0x06, 0x70, 0x38, 0xb9, 0x6d, 0xff, 0x37, 0x5d, 0xa0, 0x38, 0x38, + 0x71, 0x31, 0x66, 0x38, 0xd3, 0x8a, 0x30, 0x38, 0xe7, 0x51, 0x5c, 0x38, + 0x27, 0x10, 0x5e, 0x38, 0x68, 0xbb, 0x55, 0x38, 0x26, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x30, 0x2f, 0x64, + 0x65, 0x70, 0x74, 0x68, 0x77, 0x69, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x76, 0x32, 0x64, 0x2f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x77, 0x69, 0x73, + 0x65, 0x31, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, 0x13, 0x00, 0x0c, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x68, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x68, 0x00, 0x3c, + 0x01, 0x00, 0x00, 0x00, 0xe9, 0xe6, 0x7f, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x70, 0xb8, 0x7f, 0xbf, 0x16, 0x00, 0x00, 0x00, 0x64, 0x61, 0x74, 0x61, + 0x30, 0x2f, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd8, 0xff, 0xff, 0xff, + 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x0c, 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, + 0x0c, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04 +}; +const unsigned int network_model_len = 1720; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_NETWORK_TESTER_NETWORK_MODEL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_tester_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_tester_test.cc new file mode 100644 index 00000000..4ba799ec --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/network_tester/network_tester_test.cc @@ -0,0 +1,155 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/examples/network_tester/expected_output_data.h" +#include "tensorflow/lite/micro/examples/network_tester/input_data.h" +#include "tensorflow/lite/micro/examples/network_tester/network_model.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/schema/schema_generated.h" + +#ifdef ETHOS_U +#include "tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h" +#include "tensorflow/lite/micro/examples/person_detection/person_image_data.h" +#endif + +#ifndef TENSOR_ARENA_SIZE +#ifdef ETHOS_U +#define TENSOR_ARENA_SIZE (136 * 1024) +#else +#define TENSOR_ARENA_SIZE (3 * 1024) +#endif +#endif + +#ifndef NUM_INFERENCES +#define NUM_INFERENCES 1 +#endif + +uint8_t tensor_arena[TENSOR_ARENA_SIZE]; + +#ifdef NUM_BYTES_TO_PRINT +inline void print_output_data(TfLiteTensor *output) +{ + int num_bytes_to_print = + ((output->bytes < NUM_BYTES_TO_PRINT) || NUM_BYTES_TO_PRINT == 0) ? output->bytes : NUM_BYTES_TO_PRINT; + + int dims_size = output->dims->size; + printf("{\n"); + printf("\"dims\": [%d,", dims_size); + for (int i = 0; i < output->dims->size - 1; ++i) { + printf("%d,", output->dims->data[i]); + } + printf("%d],\n", output->dims->data[dims_size - 1]); + + printf("\"data_address\": \"%p\",\n", output->data.raw); + printf("\"data\":\""); + for (int i = 0; i < num_bytes_to_print - 1; ++i) { + if (i % 16 == 0 && i != 0) { + printf("\n"); + } + printf("0x%02x,", output->data.uint8[i]); + } + printf("0x%02x\"\n", output->data.uint8[num_bytes_to_print - 1]); + printf("}"); +} +#endif + +template +void check_output_elem(TfLiteTensor *output, const T *expected_output, + const int index) +{ + TF_LITE_MICRO_EXPECT_EQ(tflite::GetTensorData(output)[index], + expected_output[index]); +} + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestInvoke) +{ + tflite::MicroErrorReporter micro_error_reporter; + +#ifdef ETHOS_U + const tflite::Model *model = ::tflite::GetModel(g_person_detect_model_data); +#else + const tflite::Model *model = ::tflite::GetModel(network_model); +#endif + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.\n", + model->version(), TFLITE_SCHEMA_VERSION); + return kTfLiteError; + } + + tflite::AllOpsResolver resolver; + + tflite::MicroInterpreter interpreter( + model, resolver, tensor_arena, TENSOR_ARENA_SIZE, µ_error_reporter); + + TfLiteStatus allocate_status = interpreter.AllocateTensors(); + if (allocate_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Tensor allocation failed\n"); + return kTfLiteError; + } + + for (int n = 0; n < NUM_INFERENCES; n++) { + for (size_t i = 0; i < interpreter.inputs_size(); ++i) { + TfLiteTensor *input = interpreter.input(i); +#ifdef ETHOS_U + memcpy(input->data.int8, g_person_data, input->bytes); +#else + memcpy(input->data.data, &input_data[i], input->bytes); +#endif + } + TfLiteStatus invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + return kTfLiteError; + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + +#ifdef NUM_BYTES_TO_PRINT + // Print all of the output data, or the first NUM_BYTES_TO_PRINT bytes, + // whichever comes first as well as the output shape. + printf("num_of_outputs: %d\n", interpreter.outputs_size()); + printf("output_begin\n"); + printf("[\n"); + for (int i = 0; i < interpreter.outputs_size(); i++) { + TfLiteTensor *output = interpreter.output(i); + print_output_data(output); + if (i != interpreter.outputs_size() - 1) { + printf(",\n"); + } + } + printf("]\n"); + printf("output_end\n"); +#endif + +#ifndef NO_COMPARE_OUTPUT_DATA + for (size_t i = 0; i < interpreter.outputs_size(); i++) { + TfLiteTensor *output = interpreter.output(i); + for (int j = 0; j < tflite::ElementCount(*(output->dims)); ++j) { + check_output_elem(output, &expected_output_data[i], j); + } + } +#endif + } + TF_LITE_REPORT_ERROR(µ_error_reporter, "Ran successfully\n"); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/README.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/README.md new file mode 100644 index 00000000..c52d8c1a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/README.md @@ -0,0 +1,646 @@ +# Person detection example + +This example shows how you can use Tensorflow Lite to run a 250 kilobyte neural +network to recognize people in images captured by a camera. It is designed to +run on systems with small amounts of memory such as microcontrollers and DSPs. +This uses the experimental int8 quantized version of the person detection model. + +## Table of contents + +- [Getting started](#getting-started) +- [Running on ARC EM SDP](#running-on-arc-em-sdp) +- [Running on Arduino](#running-on-arduino) +- [Running on ESP32](#running-on-esp32) +- [Running on HIMAX WE1 EVB](#running-on-himax-we1-evb) +- [Running on SparkFun Edge](#running-on-sparkfun-edge) +- [Run the tests on a development machine](#run-the-tests-on-a-development-machine) +- [Debugging image capture](#debugging-image-capture) +- [Training your own model](#training-your-own-model) + +## Running on ARC EM SDP + +The following instructions will help you to build and deploy this example to +[ARC EM SDP](https://www.synopsys.com/dw/ipdir.php?ds=arc-em-software-development-platform) +board. General information and instructions on using the board with TensorFlow +Lite Micro can be found in the common +[ARC targets description](/tensorflow/lite/micro/tools/make/targets/arc/README.md). + +This example uses asymmetric int8 quantization and can therefore leverage +optimized int8 kernels from the embARC MLI library + +The ARC EM SDP board contains a rich set of extension interfaces. You can choose +any compatible camera and modify +[image_provider.cc](/tensorflow/lite/micro/examples/person_detection/image_provider.cc) +file accordingly to use input from your specific camera. By default, results of +running this example are printed to the console. If you would like to instead +implement some target-specific actions, you need to modify +[detection_responder.cc](/tensorflow/lite/micro/examples/person_detection/detection_responder.cc) +accordingly. + +The reference implementations of these files are used by default on the EM SDP. + +### Initial setup + +Follow the instructions on the +[ARC EM SDP Initial Setup](/tensorflow/lite/micro/tools/make/targets/arc/README.md#ARC-EM-Software-Development-Platform-ARC-EM-SDP) +to get and install all required tools for work with ARC EM SDP. + +### Generate Example Project + +The example project for ARC EM SDP platform can be generated with the following +command: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile \ +TARGET=arc_emsdp ARC_TAGS=reduce_codesize \ +OPTIMIZED_KERNEL_DIR=arc_mli \ +generate_person_detection_int8_make_project +``` + +Note that `ARC_TAGS=reduce_codesize` applies example specific changes of code to +reduce total size of application. It can be omitted. + +### Build and Run Example + +For more detailed information on building and running examples see the +appropriate sections of general descriptions of the +[ARC EM SDP usage with TFLM](/tensorflow/lite/micro/tools/make/targets/arc/README.md#ARC-EM-Software-Development-Platform-ARC-EM-SDP). +In the directory with generated project you can also find a +*README_ARC_EMSDP.md* file with instructions and options on building and +running. Here we only briefly mention main steps which are typically enough to +get it started. + +1. You need to + [connect the board](/tensorflow/lite/micro/tools/make/targets/arc/README.md#connect-the-board) + and open an serial connection. + +2. Go to the generated example project director + + ``` + cd tensorflow/lite/micro/tools/make/gen/arc_emsdp_arc/prj/person_detection_int8/make + ``` + +3. Build the example using + + ``` + make app + ``` + +4. To generate artefacts for self-boot of example from the board use + + ``` + make flash + ``` + +5. To run application from the board using microSD card: + + * Copy the content of the created /bin folder into the root of microSD + card. Note that the card must be formatted as FAT32 with default cluster + size (but less than 32 Kbytes) + * Plug in the microSD card into the J11 connector. + * Push the RST button. If a red LED is lit beside RST button, push the CFG + button. + * Type or copy next commands one-by-another into serial terminal: `setenv + loadaddr 0x10800000 setenv bootfile app.elf setenv bootdelay 1 setenv + bootcmd fatload mmc 0 \$\{loadaddr\} \$\{bootfile\} \&\& bootelf + saveenv` + * Push the RST button. + +6. If you have the MetaWare Debugger installed in your environment: + + * To run application from the console using it type `make run`. + * To stop the execution type `Ctrl+C` in the console several times. + +In both cases (step 5 and 6) you will see the application output in the serial +terminal. + +## Running on Arduino + +The following instructions will help you build and deploy this sample +to [Arduino](https://www.arduino.cc/) devices. + +The sample has been tested with the following device: + +- [Arduino Nano 33 BLE Sense](https://store.arduino.cc/usa/nano-33-ble-sense-with-headers) + +You will also need the following camera module: + +- [Arducam Mini 2MP Plus](https://www.amazon.com/Arducam-Module-Megapixels-Arduino-Mega2560/dp/B012UXNDOY) + +### Hardware + +Connect the Arducam pins as follows: + +|Arducam pin name|Arduino pin name| +|----------------|----------------| +|CS|D7 (unlabelled, immediately to the right of D6)| +|MOSI|D11| +|MISO|D12| +|SCK|D13| +|GND|GND (either pin marked GND is fine)| +|VCC|3.3 V| +|SDA|A4| +|SCL|A5| + +### Install the Arduino_TensorFlowLite library + +Download the current nightly build of the library: +[person_detection.zip](https://storage.googleapis.com/download.tensorflow.org/data/tf_lite_micro_person_data_int8_grayscale_2020_01_13.zip) + +This example application is included as part of the official TensorFlow Lite +Arduino library. To install it, open the Arduino library manager in +`Tools -> Manage Libraries...` and search for `Arduino_TensorFlowLite`. + +### Install other libraries + +In addition to the TensorFlow library, you'll also need to install two +libraries: + +* The Arducam library, so our code can interface with the hardware +* The JPEGDecoder library, so we can decode JPEG-encoded images + +The Arducam Arduino library is available from GitHub at +[https://github.com/ArduCAM/Arduino](https://github.com/ArduCAM/Arduino). +To install it, download or clone the repository. Next, copy its `ArduCAM` +subdirectory into your `Arduino/libraries` directory. To find this directory on +your machine, check the *Sketchbook location* in the Arduino IDE's +*Preferences* window. + +After downloading the library, you'll need to edit one of its files to make sure +it is configured for the Arducam Mini 2MP Plus. To do so, open the following +file: + +``` +Arduino/libraries/ArduCAM/memorysaver.h +``` + +You'll see a bunch of `#define` statements listed. Make sure that they are all +commented out, except for `#define OV2640_MINI_2MP_PLUS`, as so: + +``` +//Step 1: select the hardware platform, only one at a time +//#define OV2640_MINI_2MP +//#define OV3640_MINI_3MP +//#define OV5642_MINI_5MP +//#define OV5642_MINI_5MP_BIT_ROTATION_FIXED +#define OV2640_MINI_2MP_PLUS +//#define OV5642_MINI_5MP_PLUS +//#define OV5640_MINI_5MP_PLUS +``` + +Once you save the file, we're done configuring the Arducam library. + +Our next step is to install the JPEGDecoder library. We can do this from within +the Arduino IDE. First, go to the *Manage Libraries...* option in the *Tools* +menu and search for `JPEGDecoder`. You should install version _1.8.0_ of the +library. + +Once the library has installed, we'll need to configure it to disable some +optional components that are not compatible with the Arduino Nano 33 BLE Sense. +Open the following file: + +``` +Arduino/libraries/JPEGDecoder/src/User_Config.h +``` + +Make sure that both `#define LOAD_SD_LIBRARY` and `#define LOAD_SDFAT_LIBRARY` +are commented out, as shown in this excerpt from the file: + +```c++ +// Comment out the next #defines if you are not using an SD Card to store the JPEGs +// Commenting out the line is NOT essential but will save some FLASH space if +// SD Card access is not needed. Note: use of SdFat is currently untested! + +//#define LOAD_SD_LIBRARY // Default SD Card library +//#define LOAD_SDFAT_LIBRARY // Use SdFat library instead, so SD Card SPI can be bit bashed +``` + +Once you've saved the file, you are done installing libraries. + +### Load and run the example + +Go to `File -> Examples`. You should see an +example near the bottom of the list named `TensorFlowLite`. Select +it and click `person_detection` to load the example. Connect your device, then +build and upload the example. + +To test the camera, start by pointing the device's camera at something that is +definitely not a person, or just covering it up. The next time the blue LED +flashes, the device will capture a frame from the camera and begin to run +inference. The vision model we are using for person detection is relatively +large, but with cmsis-nn optimizations it only takes around 800ms to run the +model. + +After a moment, the inference result will be translated into another LED being +lit. Since you pointed the camera at something that isn't a person, the red LED +should light up. + +Now, try pointing the device's camera at yourself! The next time the blue LED +flashes, the device will capture another image and begin to run inference. After +a brief puase, the green LED should light up! + +Remember, image data is captured as a snapshot before each inference, whenever +the blue LED flashes. Whatever the camera is pointed at during that moment is +what will be fed into the model. It doesn't matter where the camera is pointed +until the next time an image is captured, when the blue LED will flash again. + +If you're getting seemingly incorrect results, make sure you are in an +environment with good lighting. You should also make sure that the camera is +oriented correctly, with the pins pointing downwards, so that the images it +captures are the right way up—the model was not trained to recognize upside-down +people! In addition, it's good to remember that this is a tiny model, which +trades accuracy for small size. It works very well, but it isn't accurate 100% +of the time. + +We can also see the results of inference via the Arduino Serial Monitor. To do +this, open the *Serial Monitor* from the *Tools* menu. You'll see a detailed +log of what is happening while our application runs. It's also interesting to +check the *Show timestamp* box, so you can see how long each part of the process +takes: + +``` +14:17:50.714 -> Starting capture +14:17:50.714 -> Image captured +14:17:50.784 -> Reading 3080 bytes from ArduCAM +14:17:50.887 -> Finished reading +14:17:50.887 -> Decoding JPEG and converting to greyscale +14:17:51.074 -> Image decoded and processed +14:18:09.710 -> Person score: 246 No person score: 66 +``` + +From the log, we can see that it took around 170 ms to capture and read the +image data from the camera module, 180 ms to decode the JPEG and convert it to +greyscale, and 18.6 seconds to run inference. + +## Running on ESP32 + +The following instructions will help you build and deploy this sample to +[ESP32](https://www.espressif.com/en/products/hardware/esp32/overview) devices +using the [ESP IDF](https://github.com/espressif/esp-idf). + +The sample has been tested on ESP-IDF version 4.0 with the following devices: - +[ESP32-DevKitC](http://esp-idf.readthedocs.io/en/latest/get-started/get-started-devkitc.html) - +[ESP-EYE](https://github.com/espressif/esp-who/blob/master/docs/en/get-started/ESP-EYE_Getting_Started_Guide.md) + +ESP-EYE is a board which has a built-in camera which can be used to run this +example , if you want to use other esp boards you will have to connect camera +externally and write your own +[image_provider.cc](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/person_detection/esp/image_provider.cc). +and +[app_camera_esp.c](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/person_detection/esp/app_camera_esp.c). +You can also write you own +[detection_responder.cc](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/person_detection/detection_responder.cc). + +### Install the ESP IDF + +Follow the instructions of the +[ESP-IDF get started guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) +to setup the toolchain and the ESP-IDF itself. + +The next steps assume that the +[IDF environment variables are set](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html#step-4-set-up-the-environment-variables) : + +* The `IDF_PATH` environment variable is set +* `idf.py` and Xtensa-esp32 tools (e.g. `xtensa-esp32-elf-gcc`) are in `$PATH` +* `esp32-camera` should be downloaded in `components/` dir of example as + explained in `Building the example`(below) + +### Generate the examples + +The example project can be generated with the following command: +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_person_detection_esp_project +``` + +### Building the example + +Go to the example project directory +``` +cd tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32/prj/person_detection/esp-idf +``` + +As the `person_detection` example requires an external component `esp32-camera` +for functioning hence we will have to manually clone it in `components/` +directory of the example with following command. +``` +git clone https://github.com/espressif/esp32-camera.git components/esp32-camera +``` + +Then build with `idf.py` `idf.py build` + +### Load and run the example + +To flash (replace `/dev/ttyUSB0` with the device serial port): +``` +idf.py --port /dev/ttyUSB0 flash +``` + +Monitor the serial output: +``` +idf.py --port /dev/ttyUSB0 monitor +``` + +Use `Ctrl+]` to exit. + +The previous two commands can be combined: +``` +idf.py --port /dev/ttyUSB0 flash monitor +``` + +## Running on HIMAX WE1 EVB + +The following instructions will help you build and deploy this example to +[HIMAX WE1 EVB](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_board_brief) +board. To understand more about using this board, please check +[HIMAX WE1 EVB user guide](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide). + +### Initial Setup + +To use the HIMAX WE1 EVB, please make sure following software are installed: + +#### MetaWare Development Toolkit + +See +[Install the Synopsys DesignWare ARC MetaWare Development Toolkit](/tensorflow/lite/micro/tools/make/targets/arc/README.md#install-the-synopsys-designware-arc-metaware-development-toolkit) +section for instructions on toolchain installation. + +#### Make Tool version + +A `'make'` tool is required for deploying Tensorflow Lite Micro applications on +HIMAX WE1 EVB, See +[Check make tool version](/tensorflow/lite/micro/tools/make/targets/arc/README.md#make-tool) +section for proper environment. + +#### Serial Terminal Emulation Application + +There are 2 main purposes for HIMAX WE1 EVB Debug UART port + +- print application output +- burn application to flash by using xmodem send application binary + +You can use any terminal emulation program (like [PuTTY](https://www.putty.org/) +or [minicom](https://linux.die.net/man/1/minicom)). + +### Generate Example Project + +The example project for HIMAX WE1 EVB platform can be generated with the +following command: + +Download related third party data + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=himax_we1_evb third_party_downloads +``` + +Generate person detection project + +``` +make -f tensorflow/lite/micro/tools/make/Makefile generate_person_detection_int8_make_project TARGET=himax_we1_evb +``` + +### Build and Burn Example + +Following the Steps to run person detection example at HIMAX WE1 EVB platform. + +1. Go to the generated example project directory. + + ``` + cd tensorflow/lite/micro/tools/make/gen/himax_we1_evb_arc/prj/person_detection_int8/make + ``` + +2. Build the example using + + ``` + make app + ``` + +3. After example build finish, copy ELF file and map file to image generate + tool directory. \ + image generate tool directory located at + `'tensorflow/lite/micro/tools/make/downloads/himax_we1_sdk/image_gen_linux_v3/'` + + ``` + cp person_detection_int8.elf himax_we1_evb.map ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + +4. Go to flash image generate tool directory. + + ``` + cd ../../../../../downloads/himax_we1_sdk/image_gen_linux_v3/ + ``` + + make sure this tool directory is in $PATH. You can permanently set it to + PATH by + + ``` + export PATH=$PATH:$(pwd) + ``` + +5. run image generate tool, generate flash image file. + + * Before running image generate tool, by typing `sudo chmod +x image_gen` + and `sudo chmod +x sign_tool` to make sure it is executable. + + ``` + image_gen -e person_detection_int8.elf -m himax_we1_evb.map -o out.img + ``` + +6. Download flash image file to HIMAX WE1 EVB by UART: + + * more detail about download image through UART can be found at + [HIMAX WE1 EVB update Flash image](https://github.com/HimaxWiseEyePlus/bsp_tflu/tree/master/HIMAX_WE1_EVB_user_guide#flash-image-update) + +After these steps, press reset button on the HIMAX WE1 EVB, you will see +application output in the serial terminal. + +## Running on SparkFun Edge + +The following instructions will help you build and deploy this sample on the +[SparkFun Edge development board](https://sparkfun.com/products/15170). This +sample requires the Sparkfun Himax camera for the Sparkfun Edge board. It is +not available for purchase yet. + +If you're new to using this board, we recommend walking through the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab to get an understanding of the workflow. + +### Compile the binary + +The following command will download the required dependencies and then compile a +binary for the SparkFun Edge: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge person_detection_int8_bin +``` + +The binary will be created in the following location: + +``` +tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/person_detection_int8.bin +``` + +### Sign the binary + +The binary must be signed with cryptographic keys to be deployed to the device. +We'll now run some commands that will sign our binary so it can be flashed to +the SparkFun Edge. The scripts we are using come from the Ambiq SDK, which is +downloaded when the `Makefile` is run. + +Enter the following command to set up some dummy cryptographic keys we can use +for development: + +``` +cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/tools/apollo3_scripts/keys_info0.py \ +tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/tools/apollo3_scripts/keys_info.py +``` + +Next, run the following command to create a signed binary: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/tools/apollo3_scripts/create_cust_image_blob.py \ +--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/person_detection_int8.bin \ +--load-address 0xC000 \ +--magic-num 0xCB \ +-o main_nonsecure_ota \ +--version 0x0 +``` + +This will create the file `main_nonsecure_ota.bin`. We'll now run another +command to create a final version of the file that can be used to flash our +device with the bootloader script we will use in the next step: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \ +--load-address 0x20000 \ +--bin main_nonsecure_ota.bin \ +-i 6 \ +-o main_nonsecure_wire \ +--options 0x1 +``` + +You should now have a file called `main_nonsecure_wire.bin` in the directory +where you ran the commands. This is the file we'll be flashing to the device. + +### Flash the binary + +Next, attach the board to your computer via a USB-to-serial adapter. + +**Note:** If you're using the [SparkFun Serial Basic Breakout](https://www.sparkfun.com/products/15096), +you should [install the latest drivers](https://learn.sparkfun.com/tutorials/sparkfun-serial-basic-ch340c-hookup-guide#drivers-if-you-need-them) +before you continue. + +Once connected, assign the USB device name to an environment variable: + +``` +export DEVICENAME=put your device name here +``` + +Set another variable with the baud rate: + +``` +export BAUD_RATE=921600 +``` + +Now, hold the button marked `14` on the device. While still holding the button, +hit the button marked `RST`. Continue holding the button marked `14` while +running the following command: + +``` +python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.0.0/tools/apollo3_scripts/uart_wired_update.py \ +-b ${BAUD_RATE} ${DEVICENAME} \ +-r 1 \ +-f main_nonsecure_wire.bin \ +-i 6 +``` + +You should see a long stream of output as the binary is flashed to the device. +Once you see the following lines, flashing is complete: + +``` +Sending Reset Command. +Done. +``` + +If you don't see these lines, flashing may have failed. Try running through the +steps in [Flash the binary](#flash-the-binary) again (you can skip over setting +the environment variables). If you continue to run into problems, follow the +[AI on a microcontroller with TensorFlow Lite and SparkFun Edge](https://codelabs.developers.google.com/codelabs/sparkfun-tensorflow) +codelab, which includes more comprehensive instructions for the flashing +process. + +The binary should now be deployed to the device. Hit the button marked `RST` to +reboot the board. You should see the device's four LEDs flashing in sequence. + +Debug information is logged by the board while the program is running. To view +it, establish a serial connection to the board using a baud rate of `115200`. +On OSX and Linux, the following command should work: + +``` +screen ${DEVICENAME} 115200 +``` + +To stop viewing the debug output with `screen`, hit `Ctrl+A`, immediately +followed by the `K` key, then hit the `Y` key. + +## Run the tests on a development machine + +To compile and test this example on a desktop Linux or MacOS machine, download +[the TensorFlow source code](https://github.com/tensorflow/tensorflow), `cd` +into the source directory from a terminal, and then run the following command: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile +``` + +This will take a few minutes, and downloads frameworks the code uses like +[CMSIS](https://developer.arm.com/embedded/cmsis) and +[flatbuffers](https://google.github.io/flatbuffers/). Once that process has +finished, run: + +``` +make -f tensorflow/lite/micro/tools/make/Makefile test_person_detection_test_int8 +``` + +You should see a series of files get compiled, followed by some logging output +from a test, which should conclude with `~~~ALL TESTS PASSED~~~`. If you see +this, it means that a small program has been built and run that loads a trained +TensorFlow model, runs some example images through it, and got the expected +outputs. This particular test runs images with a and without a person in them, +and checks that the network correctly identifies them. + +To understand how TensorFlow Lite does this, you can look at the `TestInvoke()` +function in +[person_detection_test.cc](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/person_detection/person_detection_test.cc). +It's a fairly small amount of code, creating an interpreter, getting a handle to +a model that's been compiled into the program, and then invoking the interpreter +with the model and sample inputs. + +## Debugging image capture +When the sample is running, check the LEDs to determine whether the inference is +running correctly. If the red light is stuck on, it means there was an error +communicating with the camera. This is likely due to an incorrectly connected +or broken camera. + +During inference, the blue LED will toggle every time inference is complete. The +orange LED indicates that no person was found, and the green LED indicates a +person was found. The red LED should never turn on, since it indicates an error. + +In order to view the captured image, set the DUMP_IMAGE define in main.cc.  This +causes the board to log raw image info to the console. After the board has been +flashed and reset, dump the log to a text file: + + +``` +screen -L -Logfile ${DEVICENAME} 115200 +``` + +Next, run the raw to bitmap converter to view captured images: + +``` +python3 raw_to_bitmap.py -r GRAY -i +``` + +## Training your own model + +You can train your own model with some easy-to-use scripts. See +[training_a_model.md](training_a_model.md) for instructions. diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.cc new file mode 100644 index 00000000..560551aa --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.cc @@ -0,0 +1,26 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/detection_responder.h" + +// This dummy implementation writes person and no person scores to the error +// console. Real applications will want to take some custom action instead, and +// should implement their own versions of this function. +void RespondToDetection(tflite::ErrorReporter *error_reporter, + int8_t person_score, int8_t no_person_score) +{ + TF_LITE_REPORT_ERROR(error_reporter, "person score:%d no person score %d", + person_score, no_person_score); +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.h new file mode 100644 index 00000000..acadf963 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder.h @@ -0,0 +1,34 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Provides an interface to take an action based on the output from the person +// detection model. + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_DETECTION_RESPONDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_DETECTION_RESPONDER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// Called every time the results of a person detection run are available. The +// `person_score` has the numerical confidence that the captured image contains +// a person, and `no_person_score` has the numerical confidence that the image +// does not contain a person. Typically if person_score > no person score, the +// image is considered to contain a person. This threshold may be adjusted for +// particular applications. +void RespondToDetection(tflite::ErrorReporter *error_reporter, + int8_t person_score, int8_t no_person_score); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_DETECTION_RESPONDER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder_test.cc new file mode 100644 index 00000000..06826868 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/detection_responder_test.cc @@ -0,0 +1,33 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/detection_responder.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestCallability) +{ + tflite::MicroErrorReporter micro_error_reporter; + + // This will have external side-effects (like printing to the debug console + // or lighting an LED) that are hard to observe, so the most we can do is + // make sure the call doesn't crash. + RespondToDetection(µ_error_reporter, -100, 100); + RespondToDetection(µ_error_reporter, 100, 50); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.cc new file mode 100644 index 00000000..8ad57919 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.cc @@ -0,0 +1,27 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/image_provider.h" + +#include "tensorflow/lite/micro/examples/person_detection/model_settings.h" + +TfLiteStatus GetImage(tflite::ErrorReporter *error_reporter, int image_width, + int image_height, int channels, int8_t *image_data) +{ + for (int i = 0; i < image_width * image_height * channels; ++i) { + image_data[i] = 0; + } + return kTfLiteOk; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.h new file mode 100644 index 00000000..bf35d81d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider.h @@ -0,0 +1,39 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_IMAGE_PROVIDER_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_IMAGE_PROVIDER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" + +// This is an abstraction around an image source like a camera, and is +// expected to return 8-bit sample data. The assumption is that this will be +// called in a low duty-cycle fashion in a low-power application. In these +// cases, the imaging sensor need not be run in a streaming mode, but rather can +// be idled in a relatively low-power mode between calls to GetImage(). The +// assumption is that the overhead and time of bringing the low-power sensor out +// of this standby mode is commensurate with the expected duty cycle of the +// application. The underlying sensor may actually be put into a streaming +// configuration, but the image buffer provided to GetImage should not be +// overwritten by the driver code until the next call to GetImage(); +// +// The reference implementation can have no platform-specific dependencies, so +// it just returns a static image. For real applications, you should +// ensure there's a specialized implementation that accesses hardware APIs. +TfLiteStatus GetImage(tflite::ErrorReporter *error_reporter, int image_width, + int image_height, int channels, int8_t *image_data); + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_IMAGE_PROVIDER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider_test.cc new file mode 100644 index 00000000..1f17c06a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/image_provider_test.cc @@ -0,0 +1,44 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/image_provider.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/person_detection/model_settings.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestImageProvider) +{ + tflite::MicroErrorReporter micro_error_reporter; + + int8_t image_data[kMaxImageSize]; + TfLiteStatus get_status = GetImage(µ_error_reporter, kNumCols, kNumRows, + kNumChannels, image_data); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, get_status); + TF_LITE_MICRO_EXPECT_NE(image_data, nullptr); + + // Make sure we can read all of the returned memory locations. + uint32_t total = 0; + for (int i = 0; i < kMaxImageSize; ++i) { + total += image_data[i]; + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main.cc new file mode 100644 index 00000000..4536d4c6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main.cc @@ -0,0 +1,28 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/main_functions.h" + +// This is the default main used on systems that have the standard C entry +// point. Other devices (for example FreeRTOS or ESP32) that have different +// requirements for entry code (like an app_main function) should specialize +// this main.cc file in a target-specific subfolder. +int main(int argc, char *argv[]) +{ + setup(); + while (true) { + loop(); + } +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.cc new file mode 100644 index 00000000..edd28e0d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.cc @@ -0,0 +1,121 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/main_functions.h" + +#include "tensorflow/lite/micro/examples/person_detection/detection_responder.h" +#include "tensorflow/lite/micro/examples/person_detection/image_provider.h" +#include "tensorflow/lite/micro/examples/person_detection/model_settings.h" +#include "tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/system_setup.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Globals, used for compatibility with Arduino-style sketches. +namespace { +tflite::ErrorReporter *error_reporter = nullptr; +const tflite::Model *model = nullptr; +tflite::MicroInterpreter *interpreter = nullptr; +TfLiteTensor *input = nullptr; + +// In order to use optimized tensorflow lite kernels, a signed int8_t quantized +// model is preferred over the legacy unsigned model format. This means that +// throughout this project, input images must be converted from unisgned to +// signed format. The easiest and quickest way to convert from unsigned to +// signed 8-bit integers is to subtract 128 from the unsigned value to get a +// signed value. + +// An area of memory to use for input, output, and intermediate arrays. +constexpr int kTensorArenaSize = 136 * 1024; +static uint8_t tensor_arena[kTensorArenaSize]; +} // namespace + +// The name of this function is important for Arduino compatibility. +void setup() +{ + tflite::InitializeTarget(); + + // Set up logging. Google style is to avoid globals or statics because of + // lifetime uncertainty, but since this has a trivial destructor it's okay. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroErrorReporter micro_error_reporter; + error_reporter = µ_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + model = tflite::GetModel(g_person_detect_model_data); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.", + model->version(), TFLITE_SCHEMA_VERSION); + return; + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + // An easier approach is to just use the AllOpsResolver, but this will + // incur some penalty in code space for op implementations that are not + // needed by this graph. + // + // tflite::AllOpsResolver resolver; + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroMutableOpResolver<5> micro_op_resolver; + micro_op_resolver.AddAveragePool2D(); + micro_op_resolver.AddConv2D(); + micro_op_resolver.AddDepthwiseConv2D(); + micro_op_resolver.AddReshape(); + micro_op_resolver.AddSoftmax(); + + // Build an interpreter to run the model with. + // NOLINTNEXTLINE(runtime-global-variables) + static tflite::MicroInterpreter static_interpreter( + model, micro_op_resolver, tensor_arena, kTensorArenaSize, error_reporter); + interpreter = &static_interpreter; + + // Allocate memory from the tensor_arena for the model's tensors. + TfLiteStatus allocate_status = interpreter->AllocateTensors(); + if (allocate_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter, "AllocateTensors() failed"); + return; + } + + // Get information about the memory area to use for the model's input. + input = interpreter->input(0); +} + +// The name of this function is important for Arduino compatibility. +void loop() +{ + // Get image from provider. + if (kTfLiteOk != GetImage(error_reporter, kNumCols, kNumRows, kNumChannels, + input->data.int8)) { + TF_LITE_REPORT_ERROR(error_reporter, "Image capture failed."); + } + + // Run the model on this input and make sure it succeeds. + if (kTfLiteOk != interpreter->Invoke()) { + TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed."); + } + + TfLiteTensor *output = interpreter->output(0); + + // Process the inference results. + int8_t person_score = output->data.uint8[kPersonIndex]; + int8_t no_person_score = output->data.uint8[kNotAPersonIndex]; + RespondToDetection(error_reporter, person_score, no_person_score); +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.h new file mode 100644 index 00000000..d21130b4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/main_functions.h @@ -0,0 +1,37 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MAIN_FUNCTIONS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MAIN_FUNCTIONS_H_ + +// Expose a C friendly interface for main functions. +#ifdef __cplusplus +extern "C" { +#endif + +// Initializes all data needed for the example. The name is important, and needs +// to be setup() for Arduino compatibility. +void setup(); + +// Runs one iteration of data gathering and inference. This should be called +// repeatedly from the application code. The name needs to be loop() for Arduino +// compatibility. +void loop(); + +#ifdef __cplusplus +} +#endif + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MAIN_FUNCTIONS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.cc new file mode 100644 index 00000000..3b47c63b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.cc @@ -0,0 +1,21 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/examples/person_detection/model_settings.h" + +const char *kCategoryLabels[kCategoryCount] = { + "notperson", + "person", +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.h new file mode 100644 index 00000000..d790afab --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/model_settings.h @@ -0,0 +1,35 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MODEL_SETTINGS_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MODEL_SETTINGS_H_ + +// Keeping these as constant expressions allow us to allocate fixed-sized arrays +// on the stack for our working memory. + +// All of these values are derived from the values used during model training, +// if you change your model you'll need to update these constants. +constexpr int kNumCols = 96; +constexpr int kNumRows = 96; +constexpr int kNumChannels = 1; + +constexpr int kMaxImageSize = kNumCols * kNumRows * kNumChannels; + +constexpr int kCategoryCount = 2; +constexpr int kPersonIndex = 1; +constexpr int kNotAPersonIndex = 0; +extern const char *kCategoryLabels[kCategoryCount]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_MODEL_SETTINGS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/no_person_image_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/no_person_image_data.h new file mode 100644 index 00000000..f2fc9149 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/no_person_image_data.h @@ -0,0 +1,30 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was created from a sample image from without a person in it. +// Convert original image to simpler format: +// convert -resize 96x96\! noperson.PNG noperson.bmp3 +// Skip the 54 byte bmp3 header and add the reset of the bytes to a C array: +// xxd -s 54 -i /tmp/noperson.bmp3 > /tmp/noperson.cc + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_NO_PERSON_IMAGE_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_NO_PERSON_IMAGE_DATA_H_ + +#include + +extern const int g_no_person_data_size; +extern const uint8_t g_no_person_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_NO_PERSON_IMAGE_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h new file mode 100644 index 00000000..ab2b03a2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h @@ -0,0 +1,27 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This is a standard TensorFlow Lite model file that has been converted into a +// C data array, so it can be easily compiled into a binary for devices that +// don't have a file system. It was created using the command: +// xxd -i person_detect.tflite > person_detect_model_data.cc + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_PERSON_DETECT_MODEL_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_PERSON_DETECT_MODEL_DATA_H_ + +extern const unsigned char g_person_detect_model_data[]; +extern const int g_person_detect_model_data_len; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_PERSON_DETECT_MODEL_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_binary_test.sh b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_binary_test.sh new file mode 100644 index 00000000..00d985d1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_binary_test.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +# +# Bash unit tests for the example binary. + +set -e + +OUTPUT_LOG_FILE=${TEST_TMPDIR}/output_log.txt + +# Needed for copybara compatibility. +SCRIPT_BASE_DIR=/org_"tensor"flow +${TEST_SRCDIR}${SCRIPT_BASE_DIR}/tensorflow/lite/micro/examples/person_detection/person_detection 2>&1 | head > ${OUTPUT_LOG_FILE} + +if ! grep -q 'person score' ${OUTPUT_LOG_FILE}; then + echo "ERROR: Expected logs not found in output '${OUTPUT_LOG_FILE}'" + exit 1 +fi + +echo +echo "SUCCESS: person_detection_binary_test PASSED" diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_test.cc new file mode 100644 index 00000000..b32130e4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_detection_test.cc @@ -0,0 +1,135 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/examples/person_detection/model_settings.h" +#include "tensorflow/lite/micro/examples/person_detection/no_person_image_data.h" +#include "tensorflow/lite/micro/examples/person_detection/person_detect_model_data.h" +#include "tensorflow/lite/micro/examples/person_detection/person_image_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Create an area of memory to use for input, output, and intermediate arrays. +constexpr int tensor_arena_size = 136 * 1024; +uint8_t tensor_arena[tensor_arena_size]; + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestInvoke) +{ + // Set up logging. + tflite::MicroErrorReporter micro_error_reporter; + + // Map the model into a usable data structure. This doesn't involve any + // copying or parsing, it's a very lightweight operation. + const tflite::Model *model = ::tflite::GetModel(g_person_detect_model_data); + if (model->version() != TFLITE_SCHEMA_VERSION) { + TF_LITE_REPORT_ERROR(µ_error_reporter, + "Model provided is schema version %d not equal " + "to supported version %d.\n", + model->version(), TFLITE_SCHEMA_VERSION); + } + + // Pull in only the operation implementations we need. + // This relies on a complete list of all the ops needed by this graph. + // An easier approach is to just use the AllOpsResolver, but this will + // incur some penalty in code space for op implementations that are not + // needed by this graph. + tflite::MicroMutableOpResolver<5> micro_op_resolver; + micro_op_resolver.AddAveragePool2D(); + micro_op_resolver.AddConv2D(); + micro_op_resolver.AddDepthwiseConv2D(); + micro_op_resolver.AddReshape(); + micro_op_resolver.AddSoftmax(); + + // Build an interpreter to run the model with. + tflite::MicroInterpreter interpreter(model, micro_op_resolver, tensor_arena, + tensor_arena_size, + µ_error_reporter); + interpreter.AllocateTensors(); + + // Get information about the memory area to use for the model's input. + TfLiteTensor *input = interpreter.input(0); + + // Make sure the input has the properties we expect. + TF_LITE_MICRO_EXPECT_NE(nullptr, input); + TF_LITE_MICRO_EXPECT_EQ(4, input->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(kNumRows, input->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kNumCols, input->dims->data[2]); + TF_LITE_MICRO_EXPECT_EQ(kNumChannels, input->dims->data[3]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, input->type); + + // Copy an image with a person into the memory area used for the input. + TFLITE_DCHECK_EQ(input->bytes, static_cast(g_person_data_size)); + memcpy(input->data.int8, g_person_data, input->bytes); + + // Run the model on this input and make sure it succeeds. + TfLiteStatus invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Get the output from the model, and make sure it's the expected size and + // type. + TfLiteTensor *output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(kCategoryCount, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, output->type); + + // Make sure that the expected "Person" score is higher than the other class. + int8_t person_score = output->data.int8[kPersonIndex]; + int8_t no_person_score = output->data.int8[kNotAPersonIndex]; + TF_LITE_REPORT_ERROR(µ_error_reporter, + "person data. person score: %d, no person score: %d\n", + person_score, no_person_score); + TF_LITE_MICRO_EXPECT_GT(person_score, no_person_score); + + // TODO(b/161461076): Update model to make this work on real negative inputs. + memset(input->data.int8, 0, input->bytes); + + // Run the model on this "No Person" input. + invoke_status = interpreter.Invoke(); + if (invoke_status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(µ_error_reporter, "Invoke failed\n"); + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status); + + // Get the output from the model, and make sure it's the expected size and + // type. + output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(kCategoryCount, output->dims->data[1]); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, output->type); + + // Make sure that the expected "No Person" score is higher. + person_score = output->data.int8[kPersonIndex]; + no_person_score = output->data.int8[kNotAPersonIndex]; + TF_LITE_REPORT_ERROR( + µ_error_reporter, + "no person data. person score: %d, no person score: %d\n", person_score, + no_person_score); + TF_LITE_MICRO_EXPECT_GT(no_person_score, person_score); + + TF_LITE_REPORT_ERROR(µ_error_reporter, "Ran successfully\n"); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_image_data.h b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_image_data.h new file mode 100644 index 00000000..d1313252 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/person_image_data.h @@ -0,0 +1,30 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This data was created from a sample image from with a person in it. +// Convert original image to simpler format: +// convert -resize 96x96\! person.PNG person.bmp3 +// Skip the 54 byte bmp3 header and add the reset of the bytes to a C array: +// xxd -s 54 -i /tmp/person.bmp3 > /tmp/person.cc + +#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_PERSON_IMAGE_DATA_H_ +#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_PERSON_IMAGE_DATA_H_ + +#include + +extern const int g_person_data_size; +extern const uint8_t g_person_data[]; + +#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_PERSON_IMAGE_DATA_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/training_a_model.md b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/training_a_model.md new file mode 100644 index 00000000..81ac39bb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/training_a_model.md @@ -0,0 +1,455 @@ +## Training a model + +The following document will walk you through the process of training your own +250 KB embedded vision model using scripts that are easy to run. You can use +either the [Visual Wake Words dataset](https://arxiv.org/abs/1906.05721) for +person detection, or choose one of the [80 +categories from the MSCOCO dataset](http://cocodataset.org/#explore). + +This model will take several days to train on a powerful machine with GPUs. We +recommend using a [Google Cloud Deep +Learning VM](https://cloud.google.com/deep-learning-vm/). + +### Training framework choice + +Keras is the recommended interface for building models in TensorFlow, but when +the person detector model was being created it didn't yet support all the +features we needed. For that reason, we'll be showing you how to train a model +using tf.slim, an older interface. It is still widely used but deprecated, so +future versions of TensorFlow may not support this approach. We hope to publish +Keras instructions in the future. + +The model definitions for Slim are part of the +[TensorFlow models repository](https://github.com/tensorflow/models), so to get +started you'll need to download it from GitHub using a command like this: + +``` +! cd ~ +! git clone https://github.com/tensorflow/models.git +``` + +The following guide is going to assume that you've done this from your home +directory, so the model repository code is at ~/models, and that all commands +are run from the home directory too unless otherwise noted. You can place the +repository somewhere else, but you'll need to update all references to it. + +To use Slim, you'll need to make sure its modules can be found by Python, and +install one dependency. Here's how to do this in an iPython notebook: + +``` +! pip install contextlib2 +import os +new_python_path = (os.environ.get("PYTHONPATH") or '') + ":models/research/slim" +%env PYTHONPATH=$new_python_path +``` + +Updating `PYTHONPATH` through an `EXPORT` statement like this only works for the +current Jupyter session, so if you're using bash directly, you should add it to +a persistent startup script, running something like this: + +``` +echo 'export PYTHONPATH=$PYTHONPATH:models/research/slim' >> ~/.bashrc +source ~/.bashrc +``` + +If you see import errors running the slim scripts, you should make sure the +`PYTHONPATH` is set up correctly, and that contextlib2 has been installed. You +can find more general information on tf.slim in the +[repository's +README](https://github.com/tensorflow/models/tree/master/research/slim). + +### Building the dataset + +In order to train a person detector model, we need a large collection of images +that are labeled depending on whether or not they have people in them. The +ImageNet one-thousand class data that's widely used for training image +classifiers doesn't include labels for people, but luckily the +[COCO dataset](http://cocodataset.org/#home) does. You can also download this +data without manually registering too, and Slim provides a convenient script to +grab it automatically: + +``` +! chmod +x models/research/slim/datasets/download_mscoco.sh +! bash models/research/slim/datasets/download_mscoco.sh coco +``` + +This is a large download, about 40GB, so it will take a while and you'll need +to make sure you have at least 100GB free on your drive to allow space for +unpacking and further processing. The argument to the script is the path that +the data will be downloaded to. If you change this, you'll also need to update +the commands below that use it. + +The dataset is designed to be used for training models for localization, so the +images aren't labeled with the "contains a person", "doesn't contain a person" +categories that we want to train for. Instead each image comes with a list of +bounding boxes for all of the objects it contains. "Person" is one of these +object categories, so to get to the classification labels we want, we have to +look for images with bounding boxes for people. To make sure that they aren't +too tiny to be recognizable we also need to exclude very small bounding boxes. +Slim contains a script to convert the bounding box into labels: + +``` +! python models/research/slim/datasets/build_visualwakewords_data.py +--logtostderr \ +--train_image_dir=coco/raw-data/train2014 \ +--val_image_dir=coco/raw-data/val2014 \ +--train_annotations_file=coco/raw-data/annotations/instances_train2014.json \ +--val_annotations_file=coco/raw-data/annotations/instances_val2014.json \ +--output_dir=coco/processed \ +--small_object_area_threshold=0.005 \ +--foreground_class_of_interest='person' +``` + +Don't be surprised if this takes up to twenty minutes to complete. When it's +done, you'll have a set of TFRecords in `coco/processed` holding the labeled +image information. This data was created by Aakanksha Chowdhery and is known as +the [Visual Wake Words dataset](https://arxiv.org/abs/1906.05721). It's designed +to be useful for benchmarking and testing embedded computer vision, since it +represents a very common task that we need to accomplish with tight resource +constraints. We're hoping to see it drive even better models for this and +similar tasks. + +### Training the model + +One of the nice things about using tf.slim to handle the training is that the +parameters you commonly need to modify are available as command line arguments, +so we can just call the standard `train_image_classifier.py` script to train +our model. You can use this command to build the model we use in the example: + +``` +! python models/research/slim/train_image_classifier.py \ + --train_dir=vww_96_grayscale \ + --dataset_name=visualwakewords \ + --dataset_split_name=train \ + --dataset_dir=coco/processed \ + --model_name=mobilenet_v1_025 \ + --preprocessing_name=mobilenet_v1 \ + --train_image_size=96 \ + --input_grayscale=True \ + --save_summaries_secs=300 \ + --learning_rate=0.045 \ + --label_smoothing=0.1 \ + --learning_rate_decay_factor=0.98 \ + --num_epochs_per_decay=2.5 \ + --moving_average_decay=0.9999 \ + --batch_size=96 \ + --max_number_of_steps=1000000 +``` + +This will take a couple of days on a single-GPU v100 instance to complete all +one-million steps, but you should be able to get a fairly accurate model after +a few hours if you want to experiment early. + +- The checkpoints and summaries will the saved in the folder given in the + `--train_dir` argument, so that's where you'll have to look for the results. +- The `--dataset_dir` parameter should match the one where you saved the + TFRecords from the Visual Wake Words build script. +- The architecture we'll be using is defined by the `--model_name` argument. + The 'mobilenet_v1' prefix tells the script to use the first version of + MobileNet. We did experiment with later versions, but these used more RAM + for their intermediate activation buffers, so for now we kept with the + original. The '025' is the depth multiplier to use, which mostly affects the + number of weight parameters, this low setting ensures the model fits within + 250KB of Flash. +- `--preprocessing_name` controls how input images are modified before they're + fed into the model. The 'mobilenet_v1' version shrinks the width and height + of the images to the size given in `--train_image_size` (in our case 96 + pixels since we want to reduce the compute requirements). It also scales the + pixel values from 0 to 255 integers into -1.0 to +1.0 floating point numbers + (though we'll be quantizing those after training). +- The + [HM01B0](https://himax.com.tw/products/cmos-image-sensor/image-sensors/hm01b0/) + camera we're using on the SparkFun Edge board is monochrome, so to get the + best results we have to train our model on black and white images too, so we + pass in the `--input_grayscale` flag to enable that preprocessing. +- The `--learning_rate`, `--label_smoothing`, `--learning_rate_decay_factor`, + `--num_epochs_per_decay`, `--moving_average_decay` and `--batch_size` are + all parameters that control how weights are updated during the training + process. Training deep networks is still a bit of a dark art, so these exact + values we found through experimentation for this particular model. You can + try tweaking them to speed up training or gain a small boost in accuracy, + but we can't give much guidance for how to make those changes, and it's easy + to get combinations where the training accuracy never converges. +- The `--max_number_of_steps` defines how long the training should continue. + There's no good way to figure out this threshold in advance, you have to + experiment to tell when the accuracy of the model is no longer improving to + tell when to cut it off. In our case we default to a million steps, since + with this particular model we know that's a good point to stop. + +Once you start the script, you should see output that looks something like this: + +``` +INFO:tensorflow:global step 4670: loss = 0.7112 (0.251 sec/step) +I0928 00:16:21.774756 140518023943616 learning.py:507] global step 4670: loss = +0.7112 (0.251 sec/step) +INFO:tensorflow:global step 4680: loss = 0.6596 (0.227 sec/step) +I0928 00:16:24.365901 140518023943616 learning.py:507] global step 4680: loss = +0.6596 (0.227 sec/step) +``` + +Don't worry about the line duplication, this is just a side-effect of the way +TensorFlow log printing interacts with Python. Each line has two key bits of +information about the training process. The global step is a count of how far +through the training we are. Since we've set the limit as a million steps, in +this case we're nearly five percent complete. The steps per second estimate is +also useful, since you can use it to estimate a rough duration for the whole +training process. In this case, we're completing about four steps a second, so +a million steps will take about 70 hours, or three days. The other crucial +piece of information is the loss. This is a measure of how close the +partially-trained model's predictions are to the correct values, and lower +values are better. This will show a lot of variation but should on average +decrease during training if the model is learning. Because it's so noisy, the +amounts will bounce around a lot over short time periods, but if things are +working well you should see a noticeable drop if you wait an hour or so and +check back. This kind of variation is a lot easier to see in a graph, which is +one of the main reasons to try TensorBoard. + +### TensorBoard + +TensorBoard is a web application that lets you view data visualizations from +TensorFlow training sessions, and it's included by default in most cloud +instances. If you're using Google Cloud's AI Platform, you can start up a new +TensorBoard session by open the command palette from the left tabs on the +notebook interface, and scrolling down to select "Create a new tensorboard". +You'll be prompted for the location of the summary logs, enter the path you +used for `--train_dir` in the training script, in our example +'vww_96_grayscale'. One common error to watch out for is adding a slash to the +end of the path, which will cause tensorboard to fail to find the directory. If +you're starting tensorboard from the command line in a different environment +you'll have to pass in this path as the `--logdir` argument to the tensorboard +command line tool, and point your browser to http://localhost:6006 (or the +address of the machine you're running it on). + +It may take a little while for the graphs to have anything useful in them, since +the script only saves summaries every five minutes. The most important graph is +called 'clone_loss', and this shows the progression of the same loss value +that's displayed on the logging output. It fluctuates a lot, but the +overall trend is downwards over time. If you don't see this sort of progression +after a few hours of training, it's a good sign that your model isn't +converging to a good solution, and you may need to debug what's going wrong +either with your dataset or the training parameters. + +Tensorboard defaults to the 'Scalars' tab when it opens, but the other section +that can be useful during training is 'Images'. This shows a +random selection of the pictures the model is currently being trained on, +including any distortions and other preprocessing. This information isn't as +essential as the loss graphs, but it can be useful to ensure the dataset is what +you expect, and it is interesting to see the examples updating as training +progresses. + +### Evaluating the model + +The loss function correlates with how well your model is training, but it isn't +a direct, understandable metric. What we really care about is how many people +our model detects correctly, but to get calculate this we need to run a +separate script. You don't need to wait until the model is fully trained, you +can check the accuracy of any checkpoints in the `--train_dir` folder. + +``` +! python models/research/slim/eval_image_classifier.py \ + --alsologtostderr \ + --checkpoint_path=vww_96_grayscale/model.ckpt-698580 \ + --dataset_dir=coco/processed/ \ + --dataset_name=visualwakewords \ + --dataset_split_name=val \ + --model_name=mobilenet_v1_025 \ + --preprocessing_name=mobilenet_v1 \ + --input_grayscale=True \ + --train_image_size=96 +``` + +You'll need to make sure that `--checkpoint_path` is pointing to a valid set of +checkpoint data. Checkpoints are stored in three separate files, so the value +should be their common prefix. For example if you have a checkpoint file called +'model.ckpt-5179.data-00000-of-00001', the prefix would be 'model.ckpt-5179'. +The script should produce output that looks something like this: + +``` +INFO:tensorflow:Evaluation [406/406] +I0929 22:52:59.936022 140225887045056 evaluation.py:167] Evaluation [406/406] +eval/Accuracy[0.717438412]eval/Recall_5[1] +``` + +The important number here is the accuracy. It shows the proportion of the +images that were classified correctly, which is 72% in this case, after +converting to a percentage. If you follow the example script, you should expect +a fully-trained model to achieve an accuracy of around 84% after one million +steps, and show a loss of around 0.4. + +### Exporting the model to TensorFlow Lite + +When the model has trained to an accuracy you're happy with, you'll need to +convert the results from the TensorFlow training environment into a form you +can run on an embedded device. As we've seen in previous chapters, this can be +a complex process, and tf.slim adds a few of its own wrinkles too. + +#### Exporting to a GraphDef protobuf file + +Slim generates the architecture from the model_name every time one of its +scripts is run, so for a model to be used outside of Slim it needs to be saved +in a common format. We're going to use the GraphDef protobuf serialization +format, since that's understood by both Slim and the rest of TensorFlow. + +``` +! python models/research/slim/export_inference_graph.py \ + --alsologtostderr \ + --dataset_name=visualwakewords \ + --model_name=mobilenet_v1_025 \ + --image_size=96 \ + --input_grayscale=True \ + --output_file=vww_96_grayscale_graph.pb +``` + +If this succeeds, you should have a new 'vww_96_grayscale_graph.pb' file in +your home folder. This contains the layout of the operations in the model, but +doesn't yet have any of the weight data. + +#### Freezing the weights + +The process of storing the trained weights together with the operation graph is +known as freezing. This converts all of the variables in the graph to +constants, after loading their values from a checkpoint file. The command below +uses a checkpoint from the millionth training step, but you can supply any +valid checkpoint path. The graph freezing script is stored inside the main +tensorflow repository, so we have to download this from GitHub before running +this command. + +``` +! git clone https://github.com/tensorflow/tensorflow +! python tensorflow/tensorflow/python/tools/freeze_graph.py \ +--input_graph=vww_96_grayscale_graph.pb \ +--input_checkpoint=vww_96_grayscale/model.ckpt-1000000 \ +--input_binary=true --output_graph=vww_96_grayscale_frozen.pb \ +--output_node_names=MobilenetV1/Predictions/Reshape_1 +``` + +After this, you should see a file called 'vww_96_grayscale_frozen.pb'. + +#### Quantizing and converting to TensorFlow Lite + +Quantization is a tricky and involved process, and it's still very much an +active area of research, so taking the float graph that we've trained so far +and converting it down to eight bit takes quite a bit of code. You can find +more of an explanation of what quantization is and how it works in the chapter +on latency optimization, but here we'll show you how to use it with the model +we've trained. The majority of the code is preparing example images to feed +into the trained network, so that the ranges of the activation layers in +typical use can be measured. We rely on the TFLiteConverter class to handle the +quantization and conversion into the TensorFlow Lite flatbuffer file that we +need for the inference engine. + +``` +import tensorflow as tf +import io +import PIL +import numpy as np + +def representative_dataset_gen(): + + record_iterator = +tf.python_io.tf_record_iterator(path='coco/processed/val.record-00000-of-00010') + + count = 0 + for string_record in record_iterator: + example = tf.train.Example() + example.ParseFromString(string_record) + image_stream = +io.BytesIO(example.features.feature['image/encoded'].bytes_list.value[0]) + image = PIL.Image.open(image_stream) + image = image.resize((96, 96)) + image = image.convert('L') + array = np.array(image) + array = np.expand_dims(array, axis=2) + array = np.expand_dims(array, axis=0) + array = ((array / 127.5) - 1.0).astype(np.float32) + yield([array]) + count += 1 + if count > 300: + break + +converter = +tf.lite.TFLiteConverter.from_frozen_graph('vww_96_grayscale_frozen.pb', +['input'], ['MobilenetV1/Predictions/Reshape_1']) +converter.optimizations = [tf.lite.Optimize.DEFAULT] +converter.representative_dataset = representative_dataset_gen +converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] +converter.inference_input_type = tf.int8 +converter.inference_output_type = tf.int8 + +tflite_quant_model = converter.convert() +open("vww_96_grayscale_quantized.tflite", "wb").write(tflite_quant_model) +``` + +#### Converting into a C source file + +The converter writes out a file, but most embedded devices don't have a file +system. To access the serialized data from our program, we have to compile it +into the executable and store it in Flash. The easiest way to do that is to +convert the file into a C data array. + +``` +# Install xxd if it is not available +!apt-get -qq install xxd +# Save the file as a C source file +!xxd -i vww_96_grayscale_quantized.tflite > person_detect_model_data.cc +``` + +You can now replace the existing person_detect_model_data.cc file with the +version you've trained, and be able to run your own model on embedded devices. + +### Training for other categories + +There are over 60 different object types in the MS-COCO dataset, so an easy way +to customize your model would be to choose one of those instead of 'person' +when you build the training dataset. Here's an example that looks for cars: + +``` +! python models/research/slim/datasets/build_visualwakewords_data.py +--logtostderr \ +--train_image_dir=coco/raw-data/train2014 \ +--val_image_dir=coco/raw-data/val2014 \ +--train_annotations_file=coco/raw-data/annotations/instances_train2014.json \ +--val_annotations_file=coco/raw-data/annotations/instances_val2014.json \ +--output_dir=coco/processed_cars \ +--small_object_area_threshold=0.005 \ +--foreground_class_of_interest='car' +``` + +You should be able to follow the same steps you did for the person detector, +but substitute the new 'coco/processed_cars' path wherever 'coco/processed' +used to be. + +If the kind of object you're interested in isn't present in MS-COCO, you may be +able to use transfer learning to help you train on a custom dataset you've +gathered, even if it's much smaller. We don't have an example of this +yet, but we hope to share one soon. + +### Understanding the architecture + +[MobileNets](https://arxiv.org/abs/1704.04861) are a family of architectures +designed to provide good accuracy for as few weight parameters and arithmetic +operations as possible. There are now multiple versions, but in our case we're +using the original v1 since it required the smallest amount of RAM at runtime. +The core concept behind the architecture is depthwise separable convolution. +This is a variant of classical two-dimensional convolutions that works in a +much more efficient way, without sacrificing very much accuracy. Regular +convolution calculates an output value based on applying a filter of a +particular size across all channels of the input. This means the number of +calculations involved in each output is width of the filter multiplied by +height, multiplied by the number of input channels. Depthwise convolution +breaks this large calculation into separate parts. First each input channel is +filtered by one or more rectangular filters to produce intermediate values. +These values are then combined using pointwise convolutions. This dramatically +reduces the number of calculations needed, and in practice produces similar +results to regular convolution. + +MobileNet v1 is a stack of 14 of these depthwise separable convolution layers +with an average pool, then a fully-connected layer followed by a softmax at the +end. We've specified a 'width multiplier' of 0.25, which has the effect of +reducing the number of computations down to around 60 million per inference, by +shrinking the number of channels in each activation layer by 75% compared to +the standard model. In essence it's very similar to a normal convolutional +neural network in operation, with each layer learning patterns in the input. +Earlier layers act more like edge recognition filters, spotting low-level +structure in the image, and later layers synthesize that information into more +abstract patterns that help with the final object classification. diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap.py new file mode 100644 index 00000000..4ebb8490 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap.py @@ -0,0 +1,200 @@ +# Copyright 2019 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Convert raw bytes to a bitmap. + +Converts a raw image dumped to a file into a bitmap. The file must contain +complete bitmap images in 324 x 244 resolution, formatted as follows: + ++++ frame +++ + <16 one-byte values separated by spaces> +--- frame --- + +For example, the first line might look like: +0x00000000 C5 C3 CE D1 D9 DA D6 E3 E2 EB E9 EB DB E4 F5 FF + +The bitmaps are automatically saved to the same directory as the log file, and +are displayed by the script. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import argparse +import os +import os.path +import re + +import numpy as np + +_DICT_RESOLUTIONS = { + 'QVGA': (324, 244, 1), + 'GRAY': (96, 96, 1), + 'RGB': (96, 96, 3), +} + +_VERSION = 0 +_SUBVERSION = 1 + + +def check_file_existence(x): + if not os.path.isfile(x): + # Argparse uses the ArgumentTypeError to give a rejection message like: + # error: argument input: x does not exist + raise argparse.ArgumentTypeError('{0} does not exist'.format(x)) + return x + + +def show_and_save_bitmaps(input_file, bitmap_list, channels): + """Display and save a list of bitmaps. + + Args: + input_file: input file name + bitmap_list: list of numpy arrays to represent bitmap images + channels: color channel count + """ + try: + from PIL import Image # pylint: disable=g-import-not-at-top + except ImportError: + raise NotImplementedError('Image display and save not implemented.') + + for idx, bitmap in enumerate(bitmap_list): + path = os.path.dirname(os.path.abspath(input_file)) + basename = os.path.split(os.path.splitext(input_file)[0])[-1] + outputfile = os.path.join(path, basename + '_' + str(idx) + '.bmp') + + if channels == 3: + img = Image.fromarray(bitmap, 'RGB') + else: + img = Image.fromarray(bitmap, 'L') + + img.save(outputfile) + img.show() + + +def reshape_bitmaps(frame_list, width, height, channels): + """Reshape flat integer arrays. + + Args: + frame_list: list of 1-D arrays to represent raw image data + width: image width in pixels + height: image height in pixels + channels: color channel count + + Returns: + list of numpy arrays to represent bitmap images + """ + + bitmap_list = [] + for frame in frame_list: + shape = (height, width, channels) if channels > 1 else (height, width) + bitmap = np.reshape(frame, shape) + bitmap = np.flip(bitmap, 0) + bitmap_list.append(bitmap) + return bitmap_list + + +def parse_file(inputfile, width, height, channels): + """Convert log file to array of pixels. + + Args: + inputfile: log file to parse + width: image width in pixels + height: image height in pixels + channels: color channel count + + Returns: + list 1-D arrays to represent raw image data. + """ + + data = None + bytes_written = 0 + frame_start = False + frame_stop = False + frame_list = list() + + # collect all pixel data into an int array + for line in inputfile: + if line == '+++ frame +++\n': + frame_start = True + data = np.zeros(height * width * channels, dtype=np.uint8) + bytes_written = 0 + continue + elif line == '--- frame ---\n': + frame_stop = True + + if frame_start and not frame_stop: + linelist = re.findall(r"[\w']+", line) + + if len(linelist) != 17: + # drop this frame + frame_start = False + continue + + for item in linelist[1:]: + data[bytes_written] = int(item, base=16) + bytes_written += 1 + + elif frame_start and frame_stop: + if bytes_written == height * width * channels: + frame_list.append(data) + frame_start = False + frame_stop = False + + return frame_list + + +def main(): + parser = argparse.ArgumentParser( + description='This program converts raw data from HM01B0 to a bmp file.') + + parser.add_argument( + '-i', + '--input', + dest='inputfile', + required=True, + help='input file', + metavar='FILE', + type=check_file_existence) + + parser.add_argument( + '-r', + '--resolution', + dest='resolution', + required=False, + help='Resolution', + choices=['QVGA', 'RGB', 'GRAY'], + default='QVGA', + ) + + parser.add_argument( + '-v', + '--version', + help='Program version', + action='version', + version='%(prog)s {ver}'.format(ver='v%d.%d' % (_VERSION, _SUBVERSION))) + + args = parser.parse_args() + + (width, height, + channels) = _DICT_RESOLUTIONS.get(args.resolution, + ('Resolution not supported', 0, 0, 0)) + frame_list = parse_file(open(args.inputfile), width, height, channels) + bitmap_list = reshape_bitmaps(frame_list, width, height, channels) + show_and_save_bitmaps(args.inputfile, bitmap_list, channels) + + +if __name__ == '__main__': + main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap_test.py b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap_test.py new file mode 100644 index 00000000..ade895d6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/examples/person_detection/utils/raw_to_bitmap_test.py @@ -0,0 +1,120 @@ +# Copyright 2018 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Tests for raw to bitmap converter utility.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import io + +import numpy as np + +from tensorflow.lite.micro.examples.person_detection.utils.raw_to_bitmap import parse_file +from tensorflow.lite.micro.examples.person_detection.utils.raw_to_bitmap import reshape_bitmaps +from tensorflow.python.platform import googletest + +_RGB_RAW = u""" ++++ frame +++ +0x0000 0x00 0x00 0x00 0x01 0x01 0x01 0x02 0x02 0x02 0x03 0x03 0x03 0x04 0x04 0x04 0x05 +0x0010 0x05 0x05 0x06 0x06 0x06 0x07 0x07 0x07 0x08 0x08 0x08 0x09 0x09 0x09 0x0a 0x0a +0x0020 0x0a 0x0b 0x0b 0x0b 0x0c 0x0c 0x0c 0x0d 0x0d 0x0d 0x0e 0x0e 0x0e 0x0f 0x0f 0x0f +--- frame --- +""" + +_RGB_FLAT = np.array([[ + 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, + 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, + 15, 15, 15 +]]) + +_RGB_RESHAPED = np.array([[[[12, 12, 12], [13, 13, 13], [14, 14, 14], + [15, 15, 15]], + [[8, 8, 8], [9, 9, 9], [10, 10, 10], [11, 11, 11]], + [[4, 4, 4], [5, 5, 5], [6, 6, 6], [7, 7, 7]], + [[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]]]) + +_GRAYSCALE_RAW = u""" ++++ frame +++ +0x0000 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f +--- frame --- +""" + +_GRAYSCALE_FLAT = np.array( + [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]]) + +_GRAYSCALE_RESHAPED = np.array([[[12, 13, 14, 15], [8, 9, 10, 11], [4, 5, 6, 7], + [0, 1, 2, 3]]]) + +_GRAYSCALE_RAW_MULTI = u""" ++++ frame +++ +0x0000 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f +--- frame --- ++++ frame +++ +0x0000 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f +--- frame --- ++++ frame +++ +0x0000 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f +--- frame --- ++++ frame +++ +0x0000 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e 0x3f +--- frame --- +""" + +_GRAYSCALE_FLAT_MULTI = [ + np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]), + np.array([16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]), + np.array([32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]), + np.array([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]) +] + +_GRAYSCALE_RESHAPED_MULTI = [ + np.array([[12, 13, 14, 15], [8, 9, 10, 11], [4, 5, 6, 7], [0, 1, 2, 3]]), + np.array([[28, 29, 30, 31], [24, 25, 26, 27], [20, 21, 22, 23], + [16, 17, 18, 19]]), + np.array([[44, 45, 46, 47], [40, 41, 42, 43], [36, 37, 38, 39], + [32, 33, 34, 35]]), + np.array([[60, 61, 62, 63], [56, 57, 58, 59], [52, 53, 54, 55], + [48, 49, 50, 51]]) +] + + +class RawToBitmapTest(googletest.TestCase): + + def test_parse_rgb(self): + frame_list = parse_file(io.StringIO(_RGB_RAW), 4, 4, 3) + self.assertTrue(np.array_equal(_RGB_FLAT, frame_list)) + + def test_parse_grayscale(self): + frame_list = parse_file(io.StringIO(_GRAYSCALE_RAW), 4, 4, 1) + self.assertTrue(np.array_equal(_GRAYSCALE_FLAT, frame_list)) + + def test_reshape_rgb(self): + reshaped = reshape_bitmaps(_RGB_FLAT, 4, 4, 3) + self.assertTrue(np.array_equal(_RGB_RESHAPED, reshaped)) + + def test_reshape_grayscale(self): + reshaped = reshape_bitmaps(_GRAYSCALE_FLAT, 4, 4, 1) + self.assertTrue(np.array_equal(_GRAYSCALE_RESHAPED, reshaped)) + + def test_multiple_grayscale(self): + frame_list = parse_file(io.StringIO(_GRAYSCALE_RAW_MULTI), 4, 4, 1) + self.assertTrue(np.array_equal(_GRAYSCALE_FLAT_MULTI, frame_list)) + reshaped = reshape_bitmaps(frame_list, 4, 4, 1) + self.assertTrue(np.array_equal(_GRAYSCALE_RESHAPED_MULTI, reshaped)) + + +if __name__ == '__main__': + googletest.main() diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/README.md b/components/TensorFlowLite/tensorflow/lite/micro/kernels/README.md new file mode 100644 index 00000000..fa18bcfe --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/README.md @@ -0,0 +1,5 @@ +# Info + +* [Porting Ops from Lite to Micro](../docs/porting_reference_ops.md) explains, + step-by-step, the code changes necessary to port an op from lite to micro, + and the process of submitting them for review and acceptance by the project. diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/activation_utils.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/activation_utils.h new file mode 100644 index 00000000..3d356471 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/activation_utils.h @@ -0,0 +1,57 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_ACTIVATION_UTILS_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_ACTIVATION_UTILS_H_ + +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/max.h" +#include "tensorflow/lite/kernels/internal/min.h" + +namespace tflite { +namespace ops { +namespace micro { +// Returns the floating point value for a fused activation: +inline float ActivationValFloat(TfLiteFusedActivation act, float a) +{ + switch (act) { + case kTfLiteActNone: + return a; + case kTfLiteActRelu: + return TfLiteMax(0.0f, a); + case kTfLiteActReluN1To1: + return TfLiteMax(-1.0f, TfLiteMin(a, 1.0f)); + case kTfLiteActRelu6: + return TfLiteMax(0.0f, TfLiteMin(a, 6.0f)); + case kTfLiteActTanh: + return std::tanh(a); + case kTfLiteActSignBit: + return std::signbit(a); + case kTfLiteActSigmoid: + return 1.0f / (1.0f + std::exp(-a)); + } + return 0.0f; // To indicate an unsupported activation (i.e. when a new fused + // activation is added to the enum and not handled here). +} + +} // namespace micro +} // namespace ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_ACTIVATION_UTILS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/activations.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/activations.cc new file mode 100644 index 00000000..1690ea2c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/activations.cc @@ -0,0 +1,298 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace activations { +namespace { + +struct ReluOpData { + ReluParams params; +}; + +struct Relu6OpData { + int8_t six_int8; + int8_t zero_int8; + uint8_t six_uint8; + uint8_t zero_uint8; +}; + +} // namespace + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +template +inline void ReluQuantized(const ReluOpData &data, + const RuntimeShape &input_shape, + const RuntimeShape &output_shape, const T *input_data, + T *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const int32_t val = static_cast(input_data[i]); + int32_t clamped = + data.params.output_offset + + MultiplyByQuantizedMultiplier(val - data.params.input_offset, + data.params.output_multiplier, + data.params.output_shift); + clamped = std::max(data.params.quantized_activation_min, clamped); + clamped = std::min(data.params.quantized_activation_max, clamped); + output_data[i] = static_cast(clamped); + } +} + +template +inline void CalculateReluOpData(const TfLiteTensor *input, TfLiteTensor *output, + ReluOpData *data) +{ + float act_min = 0.0; + float act_max = std::numeric_limits::infinity(); + double real_multiplier = + static_cast(input->params.scale / output->params.scale); + + const RuntimeShape input_shape = GetTensorShape(input); + const RuntimeShape output_shape = GetTensorShape(output); + + QuantizeMultiplier(real_multiplier, &data->params.output_multiplier, + &data->params.output_shift); + + data->params.quantized_activation_min = std::max( + static_cast(std::numeric_limits::min()), + output->params.zero_point + + static_cast(roundf(act_min / output->params.scale))); + data->params.quantized_activation_max = + act_max == std::numeric_limits::infinity() ? static_cast(std::numeric_limits::max()) : std::min(static_cast(std::numeric_limits::max()), output->params.zero_point + static_cast(roundf(act_max / output->params.scale))); + data->params.input_offset = input->params.zero_point; + data->params.output_offset = output->params.zero_point; +} + +inline void ReluFloat(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const float val = input_data[i]; + const float lower = 0.0f; + const float clamped = val < lower ? lower : val; + output_data[i] = clamped; + } +} + +inline void Relu6Float(const RuntimeShape &input_shape, const float *input_data, + const RuntimeShape &output_shape, float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const float val = input_data[i]; + const float upper = 6.0f; + const float lower = 0.0f; + const float clamped = val > upper ? upper : val < lower ? lower : + val; + output_data[i] = clamped; + } +} + +template +inline void Relu6Quantized(Q lower, Q upper, const RuntimeShape &input_shape, + const Q *input_data, + const RuntimeShape &output_shape, Q *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) { + const Q val = input_data[i]; + const Q clamped = val > upper ? upper : val < lower ? lower : + val; + output_data[i] = clamped; + } +} + +void *ReluInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(ReluOpData)); +} + +TfLiteStatus ReluPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + ReluOpData *data = static_cast(node->user_data); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + if (input->type == kTfLiteInt8) { + CalculateReluOpData(input, output, data); + } else if (input->type == kTfLiteUInt8) { + CalculateReluOpData(input, output, data); + } + + return kTfLiteOk; +} + +TfLiteStatus ReluEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const ReluOpData &data = *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (input->type) { + case kTfLiteFloat32: { + ReluFloat(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + + return kTfLiteOk; + } + case kTfLiteInt8: { + ReluQuantized(data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + case kTfLiteUInt8: { + ReluQuantized(data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + default: { + TF_LITE_KERNEL_LOG(context, "Only float32 is supported currently, got %s", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + } +} + +void *Relu6Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(Relu6OpData)); +} + +TfLiteStatus Relu6Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + Relu6OpData *data = static_cast(node->user_data); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + + if (input->type == kTfLiteInt8) { + data->six_int8 = FloatToQuantizedType(6.0f, input->params.scale, + input->params.zero_point); + data->zero_int8 = input->params.zero_point; + } else if (input->type == kTfLiteUInt8) { + data->six_uint8 = FloatToQuantizedType(6.0f, input->params.scale, + input->params.zero_point); + data->zero_uint8 = input->params.zero_point; + } + + return kTfLiteOk; +} + +TfLiteStatus Relu6Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const Relu6OpData &data = *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (input->type) { + case kTfLiteFloat32: { + Relu6Float(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + + return kTfLiteOk; + } + case kTfLiteInt8: { + Relu6Quantized(data.zero_int8, data.six_int8, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + case kTfLiteUInt8: { + Relu6Quantized(data.zero_uint8, data.six_uint8, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + default: { + TF_LITE_KERNEL_LOG(context, "Only float32 is supported currently, got %s", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + } +} + +} // namespace activations + +TfLiteRegistration Register_RELU() +{ + return { /*init=*/activations::ReluInit, + /*free=*/nullptr, + /*prepare=*/activations::ReluPrepare, + /*invoke=*/activations::ReluEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_RELU6() +{ + return { /*init=*/activations::Relu6Init, + /*free=*/nullptr, + /*prepare=*/activations::Relu6Prepare, + /*invoke=*/activations::Relu6Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/activations_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/activations_test.cc new file mode 100644 index 00000000..1a4cd893 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/activations_test.cc @@ -0,0 +1,407 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestReluFloat(int *input_dims_data, const float *input_data, + int *output_dims_data, const float *golden, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_RELU(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], 1e-5f); + } +} + +void TestRelu6Float(int *input_dims_data, const float *input_data, + int *output_dims_data, const float *golden, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_RELU6(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], 1e-5f); + } +} + +void TestReluUint8(int *input_dims_data, const float *input_data, + uint8_t *input_data_quantized, const float input_scale, + const int input_zero_point, const float *golden, + uint8_t *golden_quantized, int *output_dims_data, + const float output_scale, const int output_zero_point, + uint8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_data_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_RELU(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + Quantize(golden, golden_quantized, output_elements_count, output_scale, + output_zero_point); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden_quantized[i], output_data[i]); + } +} + +void TestRelu6Uint8(int *input_dims_data, const float *input_data, + uint8_t *input_data_quantized, const float input_scale, + const int input_zero_point, const float *golden, + uint8_t *golden_quantized, int *output_dims_data, + const float output_scale, const int output_zero_point, + uint8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_data_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_RELU6(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + Quantize(golden, golden_quantized, output_elements_count, output_scale, + output_zero_point); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden_quantized[i], output_data[i]); + } +} + +void TestReluInt8(int *input_dims_data, const float *input_data, + int8_t *input_data_quantized, const float input_scale, + const int input_zero_point, const float *golden, + int8_t *golden_quantized, int *output_dims_data, + const float output_scale, const int output_zero_point, + int8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_data_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_RELU(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + Quantize(golden, golden_quantized, output_elements_count, output_scale, + output_zero_point); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden_quantized[i], output_data[i]); + } +} + +void TestRelu6Int8(int *input_dims_data, const float *input_data, + int8_t *input_data_quantized, const float input_scale, + const int input_zero_point, const float *golden, + int8_t *golden_quantized, int *output_dims_data, + const float output_scale, const int output_zero_point, + int8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_data_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_RELU6(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + Quantize(golden, golden_quantized, output_elements_count, output_scale, + output_zero_point); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden_quantized[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleReluTestFloat) +{ + const int output_elements_count = 10; + int input_shape[] = { 2, 1, 5 }; + const float input_data[] = { + 1.0, + 2.0, + 3.0, + 4.0, + 5.0, + -1.0, + -2.0, + -3.0, + -4.0, + -5.0, + }; + const float golden[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 0, 0, 0, 0, 0 }; + int output_shape[] = { 2, 1, 5 }; + float output_data[output_elements_count]; + tflite::testing::TestReluFloat(input_shape, input_data, output_shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleRelu6TestFloat) +{ + const int output_elements_count = 10; + float output_data[output_elements_count]; + int input_shape[] = { 2, 1, 5 }; + const float input_data[] = { 4.0, 5.0, 6.0, 7.0, 8.0, + -4.0, -5.0, -6.0, -7.0, -8.0 }; + int output_shape[] = { 2, 1, 5 }; + const float golden[] = { + 4.0, + 5.0, + 6.0, + 6.0, + 6.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + }; + + tflite::testing::TestRelu6Float(input_shape, input_data, output_shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleReluTestUint8) +{ + const int elements_count = 10; + + int input_shape[] = { 2, 1, 5 }; + const float input_data[] = { 1, 2, 3, 4, 5, -1, -2, -3, -4, -5 }; + uint8_t input_quantized[elements_count]; + int output_shape[] = { 2, 1, 5 }; + const float golden[] = { 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 }; + uint8_t golden_quantized[elements_count]; + uint8_t output_data[elements_count]; + + const float input_scale = 0.5f; + const int input_zero_point = 127; + const float output_scale = 0.5f; + const int output_zero_point = 127; + + tflite::testing::TestReluUint8(input_shape, input_data, input_quantized, + input_scale, input_zero_point, golden, + golden_quantized, output_shape, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(SimpleRelu6TestUint8) +{ + const int elements_count = 10; + + int input_shape[] = { 2, 1, 5 }; + const float input_data[] = { 4, 5, 6, 7, 8, -1, -2, -3, -4, -5 }; + uint8_t input_quantized[elements_count]; + int output_shape[] = { 2, 1, 5 }; + const float golden[] = { 4, 5, 6, 6, 6, 0, 0, 0, 0, 0 }; + uint8_t golden_quantized[elements_count]; + uint8_t output_data[elements_count]; + + const float input_scale = 0.5f; + const int input_zero_point = 127; + const float output_scale = 0.5f; + const int output_zero_point = 127; + + tflite::testing::TestRelu6Uint8(input_shape, input_data, input_quantized, + input_scale, input_zero_point, golden, + golden_quantized, output_shape, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(SimpleReluTestInt8) +{ + const int elements_count = 10; + + int input_shape[] = { 2, 1, 5 }; + const float input_data[] = { 1, 2, 3, 4, 5, -1, -2, -3, -4, -5 }; + int8_t input_quantized[elements_count]; + int output_shape[] = { 2, 1, 5 }; + const float golden[] = { 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 }; + int8_t golden_quantized[elements_count]; + int8_t output_data[elements_count]; + + const float input_scale = 0.5f; + const int input_zero_point = 0; + const float output_scale = 0.5f; + const int output_zero_point = 0; + + tflite::testing::TestReluInt8(input_shape, input_data, input_quantized, + input_scale, input_zero_point, golden, + golden_quantized, output_shape, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(SimpleRelu6TestInt8) +{ + const int elements_count = 10; + + int input_shape[] = { 2, 1, 5 }; + const float input_data[] = { 4, 5, 6, 7, 8, -1, -2, -3, -4, -5 }; + int8_t input_quantized[elements_count]; + int output_shape[] = { 2, 1, 5 }; + const float golden[] = { 4, 5, 6, 6, 6, 0, 0, 0, 0, 0 }; + int8_t golden_quantized[elements_count]; + int8_t output_data[elements_count]; + + const float input_scale = 0.5f; + const int input_zero_point = 127; + const float output_scale = 0.5f; + const int output_zero_point = 127; + + tflite::testing::TestRelu6Int8(input_shape, input_data, input_quantized, + input_scale, input_zero_point, golden, + golden_quantized, output_shape, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/add.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add.cc new file mode 100644 index 00000000..afa2635c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add.cc @@ -0,0 +1,247 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/add.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/add.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/memory_helpers.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace add { + +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +struct OpData { + bool requires_broadcast; + + // These fields are used in both the general 8-bit -> 8bit quantized path, + // and the special 16-bit -> 16bit quantized path + int input1_shift; + int input2_shift; + int32_t output_activation_min; + int32_t output_activation_max; + + // These fields are used only in the general 8-bit -> 8bit quantized path + int32_t input1_multiplier; + int32_t input2_multiplier; + int32_t output_multiplier; + int output_shift; + int left_shift; + int32_t input1_offset; + int32_t input2_offset; + int32_t output_offset; + + // Used only for float evals: + float output_activation_min_f32; + float output_activation_max_f32; +}; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteAddParams *params, + const TfLiteTensor *input1, + const TfLiteTensor *input2, TfLiteTensor *output, + OpData *data) +{ + data->requires_broadcast = !HaveSameShapes(input1, input2); + + if (output->type == kTfLiteInt8) { + // 8bit -> 8bit general quantized path, with general rescalings + data->input1_offset = -input1->params.zero_point; + data->input2_offset = -input2->params.zero_point; + data->output_offset = output->params.zero_point; + data->left_shift = 20; + const double twice_max_input_scale = + 2 * static_cast( + std::max(input1->params.scale, input2->params.scale)); + const double real_input1_multiplier = + static_cast(input1->params.scale) / twice_max_input_scale; + const double real_input2_multiplier = + static_cast(input2->params.scale) / twice_max_input_scale; + const double real_output_multiplier = + twice_max_input_scale / + ((1 << data->left_shift) * static_cast(output->params.scale)); + + QuantizeMultiplierSmallerThanOneExp( + real_input1_multiplier, &data->input1_multiplier, &data->input1_shift); + + QuantizeMultiplierSmallerThanOneExp( + real_input2_multiplier, &data->input2_multiplier, &data->input2_shift); + + QuantizeMultiplierSmallerThanOneExp( + real_output_multiplier, &data->output_multiplier, &data->output_shift); + + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, params->activation, output, &data->output_activation_min, + &data->output_activation_max)); + } else if (output->type == kTfLiteFloat32) { + CalculateActivationRange(params->activation, + &data->output_activation_min_f32, + &data->output_activation_max_f32); + } + + return kTfLiteOk; +} + +void EvalAdd(TfLiteContext *context, TfLiteNode *node, TfLiteAddParams *params, + const OpData *data, const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, TfLiteEvalTensor *output) +{ + tflite::ArithmeticParams op_params; + SetActivationParams(data->output_activation_min_f32, + data->output_activation_max_f32, &op_params); + if (data->requires_broadcast) { + reference_ops::BroadcastAdd4DSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_ops::Add(op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } +} + +TfLiteStatus EvalAddQuantized(TfLiteContext *context, TfLiteNode *node, + TfLiteAddParams *params, const OpData *data, + const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, + TfLiteEvalTensor *output) +{ + tflite::ArithmeticParams op_params; + op_params.left_shift = data->left_shift; + op_params.input1_offset = data->input1_offset; + op_params.input1_multiplier = data->input1_multiplier; + op_params.input1_shift = data->input1_shift; + op_params.input2_offset = data->input2_offset; + op_params.input2_multiplier = data->input2_multiplier; + op_params.input2_shift = data->input2_shift; + op_params.output_offset = data->output_offset; + op_params.output_multiplier = data->output_multiplier; + op_params.output_shift = data->output_shift; + SetActivationParams(data->output_activation_min, data->output_activation_max, + &op_params); + bool need_broadcast = reference_ops::ProcessBroadcastShapes( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorShape(input2), &op_params); + + if (need_broadcast) { + reference_integer_ops::BroadcastAdd4DSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_integer_ops::Add(op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + const TfLiteTensor *input1 = GetInput(context, node, kInputTensor1); + TF_LITE_ENSURE(context, input1 != nullptr); + const TfLiteTensor *input2 = GetInput(context, node, kInputTensor2); + TF_LITE_ENSURE(context, input2 != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + OpData *data = static_cast(node->user_data); + auto *params = reinterpret_cast(node->builtin_data); + + TF_LITE_ENSURE_STATUS( + CalculateOpData(context, params, input1, input2, output, data)); + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = reinterpret_cast(node->builtin_data); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + if (output->type == kTfLiteFloat32) { + EvalAdd(context, node, params, data, input1, input2, output); + } else if (output->type == kTfLiteInt8) { + TF_LITE_ENSURE_OK(context, EvalAddQuantized(context, node, params, data, + input1, input2, output)); + } else { + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(output->type), output->type); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace add + +TfLiteRegistration Register_ADD() +{ + return { /*init=*/add::Init, + /*free=*/nullptr, + /*prepare=*/add::Prepare, + /*invoke=*/add::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n.cc new file mode 100644 index 00000000..7431f37c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n.cc @@ -0,0 +1,222 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/add_n.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor0 = 0; +constexpr int kOutputTensor = 0; + +constexpr int kAddNIntegerShift = 20; + +// only used with INT8 tensors +struct OpData { + int32_t output_activation_min; + int32_t output_activation_max; + int32_t input_offset; + int32_t output_offset; + int32_t input_multiplier; + int32_t output_multiplier; + int input_shift; + int output_shift; + int left_shift; + int scratch_index; +}; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + int num_inputs = NumInputs(node); + TF_LITE_ENSURE(context, num_inputs >= 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input_tensor_first; + TF_LITE_ENSURE_OK( + context, GetInputSafe(context, node, kInputTensor0, &input_tensor_first)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + // Check that all tensors have the same shape and type. + TF_LITE_ENSURE_TYPES_EQ(context, output->type, input_tensor_first->type); + for (int i = kInputTensor0 + 1; i < num_inputs; ++i) { + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, i, &input)); + TF_LITE_ENSURE(context, HaveSameShapes(input_tensor_first, input)); + TF_LITE_ENSURE_TYPES_EQ(context, input_tensor_first->type, input->type); + + // Check that all INT8 input tensors have the same zero-point and scale. + if (input_tensor_first->type == kTfLiteInt8) { + TF_LITE_ENSURE(context, input_tensor_first->params.zero_point == + input->params.zero_point); + TF_LITE_ENSURE(context, + input_tensor_first->params.scale == input->params.scale); + } + } + + if (output->type == kTfLiteFloat32) { + // Allocate scratch buffer space for pointer to each tensor's data + // and store the scratch buffer index in the node's user_data + int scratch_index; + size_t scratch_size = sizeof(float *) * num_inputs; + TF_LITE_ENSURE_OK(context, context->RequestScratchBufferInArena( + context, scratch_size, &scratch_index)); + node->user_data = + reinterpret_castuser_data)>(scratch_index); + } else if (output->type == kTfLiteInt8) { + node->user_data = + context->AllocatePersistentBuffer(context, sizeof(OpData)); + OpData *data = static_cast(node->user_data); + + // Allocate scratch buffer space for pointer to each tensor's data + // and store the scratch buffer index in OpData + size_t scratch_size = sizeof(int8_t *) * num_inputs; + TF_LITE_ENSURE_OK( + context, context->RequestScratchBufferInArena(context, scratch_size, + &data->scratch_index)); + + // 8bit -> 8bit general quantized path, with general rescalings + data->input_offset = -input_tensor_first->params.zero_point; + data->output_offset = output->params.zero_point; + data->left_shift = kAddNIntegerShift; + const double twice_max_input_scale = + 2 * static_cast(input_tensor_first->params.scale); + const double real_input_multiplier = + static_cast(input_tensor_first->params.scale) / + twice_max_input_scale; + const double real_output_multiplier = + twice_max_input_scale / + ((1 << data->left_shift) * static_cast(output->params.scale)); + + QuantizeMultiplierSmallerThanOneExp( + real_input_multiplier, &data->input_multiplier, &data->input_shift); + + QuantizeMultiplierSmallerThanOneExp( + real_output_multiplier, &data->output_multiplier, &data->output_shift); + + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, kTfLiteActNone, output, &data->output_activation_min, + &data->output_activation_max)); + } else { + TF_LITE_KERNEL_LOG(context, "ADD_N only supports FLOAT32 and INT8, got %s.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +template +inline const T **CopyInputsToScratchBuffer(TfLiteContext *context, + TfLiteNode *node, + const int scratch_index) +{ + int num_inputs = NumInputs(node); + void *scratch_buffer = context->GetScratchBuffer(context, scratch_index); + const T **all_inputs = static_cast(scratch_buffer); + for (int i = 0; i < num_inputs; i++) { + const TfLiteEvalTensor *next_input = + tflite::micro::GetEvalInput(context, node, kInputTensor0 + i); + all_inputs[i] = tflite::micro::GetTensorData(next_input); + } + + return all_inputs; +} + +template +void EvalAddN(TfLiteContext *context, TfLiteNode *node, + TfLiteEvalTensor *output) +{ + int num_inputs = NumInputs(node); + + int scratch_index = + static_cast(reinterpret_cast(node->user_data)); + const T **all_inputs = + CopyInputsToScratchBuffer(context, node, scratch_index); + + reference_ops::AddN(tflite::micro::GetTensorShape(output), num_inputs, + all_inputs, tflite::micro::GetTensorData(output)); +} + +template +void EvalAddNQuantized(TfLiteContext *context, TfLiteNode *node, + TfLiteEvalTensor *output) +{ + int num_inputs = NumInputs(node); + + OpData *data = static_cast(node->user_data); + const T **all_inputs = + CopyInputsToScratchBuffer(context, node, data->scratch_index); + + ArithmeticParams params; + params.left_shift = data->left_shift; + params.input1_offset = data->input_offset; + params.input1_multiplier = data->input_multiplier; + params.input1_shift = data->input_shift; + params.output_offset = data->output_offset; + params.output_multiplier = data->output_multiplier; + params.output_shift = data->output_shift; + SetActivationParams(data->output_activation_min, data->output_activation_max, + ¶ms); + + reference_ops::AddN(params, tflite::micro::GetTensorShape(output), num_inputs, + all_inputs, tflite::micro::GetTensorData(output)); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + if (output->type == kTfLiteFloat32) { + EvalAddN(context, node, output); + } else if (output->type == kTfLiteInt8) { + EvalAddNQuantized(context, node, output); + } else { + TF_LITE_KERNEL_LOG(context, "ADD_N only supports FLOAT32 and INT8, got %s.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_ADD_N() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n_test.cc new file mode 100644 index 00000000..dc5f4efc --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_n_test.cc @@ -0,0 +1,175 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int kMaxInputTensors = 3; +constexpr int kMaxOutputTensors = 1; + +void ExecuteAddN(TfLiteTensor *tensors, int tensors_count) +{ + int input_array_data[kMaxInputTensors + kMaxOutputTensors] = { tensors_count - + 1 }; + for (int i = 1; i < tensors_count; i++) { + input_array_data[i] = i - 1; + } + TfLiteIntArray *inputs_array = IntArrayFromInts(input_array_data); + int kOutputArrayData[] = { 1, tensors_count - 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + const TfLiteRegistration registration = tflite::Register_ADD_N(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestAddN(int *input_dims_data, const T *const *input_data, + int input_data_count, int *expected_dims, const T *expected_data, + T *output_data) +{ + TF_LITE_MICRO_EXPECT_LE(input_data_count, kMaxInputTensors); + + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[kMaxInputTensors + kMaxOutputTensors] = {}; + for (int i = 0; i < input_data_count; i++) { + tensors[i] = CreateTensor(input_data[i], input_dims); + } + tensors[input_data_count] = CreateTensor(output_data, output_dims); + + ExecuteAddN(tensors, input_data_count + 1); + + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_data[i], output_data[i]); + } +} + +// min/max are used to compute scale, zero-point, compare tolerance +template +struct TestQuantParams { + float data_min; // input and output data minimum value + float data_max; // input and output data maximum value + T input_data[kNumInputs][kOutputSize]; // quantized input storage + T output_data[kOutputSize]; // quantized output storage +}; + +// for quantized Add, the error shouldn't exceed step +template +float GetTolerance(float min, float max) +{ + float kQuantizedStep = + 2.0f * (max - min) / + (std::numeric_limits::max() - std::numeric_limits::min()); + return kQuantizedStep; +} + +template +void TestAddNQuantized(TestQuantParams *params, + int *input_dims_data, const float *const *input_data, + int *expected_dims, const float *expected_data, + float *output_data) +{ + TF_LITE_MICRO_EXPECT_LE(kNumInputs, kMaxInputTensors); + + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + + const float scale = ScaleFromMinMax(params->data_min, params->data_max); + const int zero_point = + ZeroPointFromMinMax(params->data_min, params->data_max); + + TfLiteTensor tensors[kMaxInputTensors + kMaxOutputTensors] = {}; + for (int i = 0; i < kNumInputs; i++) { + tensors[i] = CreateQuantizedTensor(input_data[i], params->input_data[i], + input_dims, scale, zero_point); + } + tensors[kNumInputs] = CreateQuantizedTensor(params->output_data, output_dims, + scale, zero_point); + + ExecuteAddN(tensors, kNumInputs + 1); + + Dequantize(params->output_data, kOutputSize, scale, zero_point, output_data); + const float kTolerance = GetTolerance(params->data_min, params->data_max); + for (int i = 0; i < kOutputSize; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatAddNOpAddMultipleTensors) +{ + int kDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kInput1[] = { -2.0, 0.2, 0.7, 0.8 }; + constexpr float kInput2[] = { 0.1, 0.2, 0.3, 0.5 }; + constexpr float kInput3[] = { 0.5, 0.1, 0.1, 0.2 }; + constexpr float kExpect[] = { -1.4, 0.5, 1.1, 1.5 }; + const float *kInputs[tflite::testing::kMaxInputTensors] = { + kInput1, + kInput2, + kInput3, + }; + constexpr int kInputCount = std::extent::value; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestAddN(kDims, kInputs, kInputCount, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(Int8AddNOpAddMultipleTensors) +{ + int kDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kInput1[] = { -2.0, 0.2, 0.7, 0.8 }; + constexpr float kInput2[] = { 0.1, 0.2, 0.3, 0.5 }; + constexpr float kInput3[] = { 0.5, 0.1, 0.1, 0.2 }; + constexpr float kExpect[] = { -1.4, 0.5, 1.1, 1.5 }; + const float *kInputs[tflite::testing::kMaxInputTensors] = { + kInput1, + kInput2, + kInput3, + }; + constexpr int kInputCount = std::extent::value; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -3.0; + params.data_max = 3.0; + + tflite::testing::TestAddNQuantized( + ¶ms, kDims, kInputs, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_test.cc new file mode 100644 index 00000000..2cf18bb2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/add_test.cc @@ -0,0 +1,378 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// Shapes and values for mixed broadcast tests. +const int broadcast_output_dims_count = 36; +const int broadcast_num_shapes = 4; + +int broadcast_input1_shape[] = { 4, 2, 3, 1, 2 }; +const float broadcast_input1_values[] = { -0.3, 2.3, 0.9, 0.5, 0.8, -1.1, + 1.2, 2.8, -1.6, 0.0, 0.7, -2.2 }; +const float broadcast_input2_values[] = { 0.2, 0.3, -0.4, 0.5, 1.0, 0.9 }; +const float + broadcast_goldens[broadcast_num_shapes][broadcast_output_dims_count] = { + { -0.1, 2.6, -0.7, 2.8, 0.7, 3.2, 1.1, 0.8, 0.5, 1.0, 1.9, 1.4, + 1.0, -0.8, 0.4, -0.6, 1.8, -0.2, 1.4, 3.1, 0.8, 3.3, 2.2, 3.7, + -1.4, 0.3, -2.0, 0.5, -0.6, 0.9, 0.9, -1.9, 0.3, -1.7, 1.7, -1.3 }, + { -0.1, 2.6, 0.5, 1.0, 1.8, -0.2, 1.4, 3.1, -2.0, 0.5, 1.7, -1.3 }, + { -0.1, 2.5, 0.0, 2.6, -0.7, 1.9, 1.1, 0.7, 1.2, 0.8, 0.5, 0.1, + 1.0, -0.9, 1.1, -0.8, 0.4, -1.5, 1.7, 3.3, 2.2, 3.8, 2.1, 3.7, + -1.1, 0.5, -0.6, 1.0, -0.7, 0.9, 1.2, -1.7, 1.7, -1.2, 1.6, -1.3 }, + { -0.1, 2.5, 1.2, 0.8, 0.4, -1.5, 1.7, 3.3, -0.6, 1.0, 1.6, -1.3 }, + }; + +const int broadcast_max_shape_size = 5; +int broadcast_input2_shapes[broadcast_num_shapes][broadcast_max_shape_size] = { + { 4, 1, 1, 3, 2 }, + { 4, 1, 3, 1, 2 }, + { 4, 2, 1, 3, 1 }, + { 4, 2, 3, 1, 1 }, +}; +int broadcast_output_shapes[broadcast_num_shapes][broadcast_max_shape_size] = { + { 4, 2, 3, 3, 2 }, + { 4, 2, 3, 1, 2 }, + { 4, 2, 3, 3, 2 }, + { 4, 2, 3, 1, 2 }, +}; + +template +void ValidateAddGoldens(TfLiteTensor *tensors, int tensors_size, + const T *golden, T *output, int output_size, + TfLiteFusedActivation activation, + float tolerance = 1e-5) +{ + TfLiteAddParams builtin_data; + builtin_data.activation = activation; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_ADD(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, &builtin_data); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_size; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output[i], tolerance); + } +} + +void TestAddFloat(int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + int *output_dims_data, const float *expected_output, + TfLiteFusedActivation activation, float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateAddGoldens(tensors, tensors_size, expected_output, output_data, + ElementCount(*output_dims), activation); +} + +template +void TestAddQuantized(int *input1_dims_data, const float *input1_data, + T *input1_quantized, float input1_scale, + int input1_zero_point, int *input2_dims_data, + const float *input2_data, T *input2_quantized, + float input2_scale, int input2_zero_point, + int *output_dims_data, const float *golden, + T *golden_quantized, float output_scale, + int output_zero_point, TfLiteFusedActivation activation, + T *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input1_data, input1_quantized, + input1_dims, input1_scale, + input1_zero_point), + tflite::testing::CreateQuantizedTensor(input2_data, input2_quantized, + input2_dims, input2_scale, + input2_zero_point), + tflite::testing::CreateQuantizedTensor(output_data, output_dims, + output_scale, output_zero_point), + }; + tflite::Quantize(golden, golden_quantized, ElementCount(*output_dims), + output_scale, output_zero_point); + + ValidateAddGoldens(tensors, tensors_size, golden_quantized, output_data, + ElementCount(*output_dims), activation); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatAddNoActivation) +{ + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8 }; + const float input2_values[] = { 0.1, 0.2, 0.3, 0.5 }; + const float golden_values[] = { -1.9, 0.4, 1.0, 1.3 }; + float output_data[output_dims_count]; + tflite::testing::TestAddFloat(inout_shape, input1_values, inout_shape, + input2_values, inout_shape, golden_values, + kTfLiteActNone, output_data); +} + +TF_LITE_MICRO_TEST(FloatAddActivationRelu1) +{ + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8 }; + const float input2_values[] = { 0.1, 0.2, 0.3, 0.5 }; + const float golden_values[] = { -1.0, 0.4, 1.0, 1.0 }; + + float output_data[output_dims_count]; + tflite::testing::TestAddFloat(inout_shape, input1_values, inout_shape, + input2_values, inout_shape, golden_values, + kTfLiteActReluN1To1, output_data); +} + +TF_LITE_MICRO_TEST(FloatAddVariousInputShapes) +{ + const int output_dims_count = 6; + float output_data[output_dims_count]; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + const float input2_values[] = { 0.1, 0.2, 0.3, 0.5, 1.1, 0.1 }; + const float expected_output[] = { -1.9, 0.4, 1.0, 1.3, 2.2, 2.1 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestAddFloat(test_shapes[i], input1_values, test_shapes[i], + input2_values, test_shapes[i], + expected_output, kTfLiteActNone, output_data); + } +} + +TF_LITE_MICRO_TEST(FloatAddWithScalarBroadcast) +{ + const int output_dims_count = 6; + float output_data[output_dims_count]; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + int input2_shape[] = { 0 }; + const float input2_values[] = { 0.1 }; + const float expected_output[] = { -1.9, 0.3, 0.8, 0.9, 1.2, 2.1 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestAddFloat(test_shapes[i], input1_values, input2_shape, + input2_values, test_shapes[i], + expected_output, kTfLiteActNone, output_data); + } +} + +TF_LITE_MICRO_TEST(QuantizedAddNoActivationInt8) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { -10, 4, 13 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { 1.01, 1.99, 2.99, 4.02 }; + const float golden_values[] = { -1, 1, 3, 5 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + tflite::testing::TestAddQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActNone, output); +} + +TF_LITE_MICRO_TEST(QuantizedAddActivationRelu1Int8) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { -10, 4, 13 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { 1.01, 1.99, 2.99, 4.02 }; + const float golden_values[] = { -1, 1, 1, 1 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + tflite::testing::TestAddQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActReluN1To1, output); +} + +TF_LITE_MICRO_TEST(QuantizedAddVariousInputShapesInt8) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { -9, 5, 14 }; + const int output_dims_count = 6; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + const float input2_values[] = { 0.1, 0.2, 0.3, 0.5, 1.1, 0.1 }; + const float golden_values[] = { -1.9, 0.4, 1.0, 1.3, 2.2, 2.1 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; i++) { + tflite::testing::TestAddQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], test_shapes[i], input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden_values, + golden_quantized, scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastFloat) +{ + float output_float[tflite::testing::broadcast_output_dims_count]; + + for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) { + tflite::testing::TestAddFloat(tflite::testing::broadcast_input1_shape, + tflite::testing::broadcast_input1_values, + tflite::testing::broadcast_input2_shapes[i], + tflite::testing::broadcast_input2_values, + tflite::testing::broadcast_output_shapes[i], + tflite::testing::broadcast_goldens[i], + kTfLiteActNone, output_float); + } +} + +TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastInt8) +{ + const int output_dims_count = 6; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + int input2_shape[] = { 0 }; + const float input2_values[] = { 0.1 }; + const float golden[] = { -1.9, 0.3, 0.8, 0.9, 1.2, 2.1 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float scales[] = { 0.1, 0.05, 0.05 }; + const int zero_points[] = { -8, 4, 12 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestAddQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], input2_shape, input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden, golden_quantized, + scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedAddWithMixedBroadcastInt8) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { -10, -5, 7 }; + int8_t input1_quantized[tflite::testing::broadcast_output_dims_count]; + int8_t input2_quantized[tflite::testing::broadcast_output_dims_count]; + int8_t golden_quantized[tflite::testing::broadcast_output_dims_count]; + int8_t output[tflite::testing::broadcast_output_dims_count]; + + for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) { + tflite::testing::TestAddQuantized( + tflite::testing::broadcast_input1_shape, + tflite::testing::broadcast_input1_values, input1_quantized, scales[0], + zero_points[0], tflite::testing::broadcast_input2_shapes[i], + tflite::testing::broadcast_input2_values, input2_quantized, scales[1], + zero_points[1], tflite::testing::broadcast_output_shapes[i], + tflite::testing::broadcast_goldens[i], golden_quantized, scales[2], + zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max.cc new file mode 100644 index 00000000..4594fc08 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max.cc @@ -0,0 +1,139 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/arg_min_max.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace arg_min_max { + +constexpr int kInputTensor = 0; +constexpr int kAxis = 1; +constexpr int kOutputTensor = 0; + +template +inline void ArgMinMaxHelper(const RuntimeShape &input1_shape, + const T1 *input1_data, const T3 *input2_data, + const RuntimeShape &output_shape, T2 *output_data, + bool is_arg_max) +{ + if (is_arg_max) { + reference_ops::ArgMinMax(input1_shape, input1_data, input2_data, + output_shape, output_data, micro::Greater()); + } else { + reference_ops::ArgMinMax(input1_shape, input1_data, input2_data, + output_shape, output_data, micro::Less()); + } +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node, bool is_arg_max) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *axis = + tflite::micro::GetEvalInput(context, node, kAxis); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + +#define TF_LITE_ARG_MIN_MAX(data_type, axis_type, output_type) \ + ArgMinMaxHelper(tflite::micro::GetTensorShape(input), \ + tflite::micro::GetTensorData(input), \ + tflite::micro::GetTensorData(axis), \ + tflite::micro::GetTensorShape(output), \ + tflite::micro::GetTensorData(output), \ + is_arg_max) + if (axis->type == kTfLiteInt32) { + if (output->type == kTfLiteInt32) { + switch (input->type) { + case kTfLiteFloat32: + TF_LITE_ARG_MIN_MAX(float, int32_t, int32_t); + break; + case kTfLiteUInt8: + TF_LITE_ARG_MIN_MAX(uint8_t, int32_t, int32_t); + break; + case kTfLiteInt8: + TF_LITE_ARG_MIN_MAX(int8_t, int32_t, int32_t); + break; + default: + TF_LITE_KERNEL_LOG(context, + "Only float32, uint8_t and int8_t are " + "supported currently, got %s.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + } else { + TF_LITE_KERNEL_LOG(context, + "Only int32_t are supported currently, got %s.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else { + TF_LITE_KERNEL_LOG(context, "Only int32_t are supported currently, got %s.", + TfLiteTypeGetName(axis->type)); + return kTfLiteError; + } + +#undef TF_LITE_ARG_MIN_MAX + + return kTfLiteOk; +} + +TfLiteStatus ArgMinEval(TfLiteContext *context, TfLiteNode *node) +{ + return Eval(context, node, false); +} + +TfLiteStatus ArgMaxEval(TfLiteContext *context, TfLiteNode *node) +{ + return Eval(context, node, true); +} + +} // namespace arg_min_max + +TfLiteRegistration Register_ARG_MAX() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/arg_min_max::ArgMaxEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_ARG_MIN() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/arg_min_max::ArgMinEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max_test.cc new file mode 100644 index 00000000..99f06a54 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/arg_min_max_test.cc @@ -0,0 +1,276 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void ValidateArgMinMaxGoldens(TfLiteTensor *tensors, int tensors_size, + const int32_t *golden, int32_t *output, + int output_size, bool using_min) +{ + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = using_min ? ops::micro::Register_ARG_MIN() : ops::micro::Register_ARG_MAX(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden[i], output[i]); + } +} + +void TestArgMinMaxFloat(int *input_dims_data, const float *input_values, + int *axis_dims_data, const int32_t *axis_values, + int *output_dims_data, int32_t *output, + const int32_t *goldens, bool using_min) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_values, input_dims), + CreateTensor(axis_values, axis_dims), + CreateTensor(output, output_dims), + }; + + ValidateArgMinMaxGoldens(tensors, tensors_size, goldens, output, + output_dims_count, using_min); +} + +template +void TestArgMinMaxQuantized(int *input_dims_data, const float *input_values, + T *input_quantized, float input_scale, + int input_zero_point, int *axis_dims_data, + const int32_t *axis_values, int *output_dims_data, + int32_t *output, const int32_t *goldens, + bool using_min) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_values, input_quantized, input_dims, + input_scale, input_zero_point), + CreateTensor(axis_values, axis_dims), + CreateTensor(output, output_dims), + }; + + ValidateArgMinMaxGoldens(tensors, tensors_size, goldens, output, + output_dims_count, using_min); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(GetMaxArgFloat) +{ + int32_t output_data[1]; + int input_dims[] = { 4, 1, 1, 1, 4 }; + const float input_values[] = { 0.1, 0.9, 0.7, 0.3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 1 }; + const int32_t goldens[] = { 1 }; + + tflite::testing::TestArgMinMaxFloat(input_dims, input_values, axis_dims, + axis_values, output_dims, output_data, + goldens, false); +} + +TF_LITE_MICRO_TEST(GetMinArgFloat) +{ + int32_t output_data[1]; + int input_dims[] = { 4, 1, 1, 1, 4 }; + const float input_values[] = { 0.1, 0.9, 0.7, 0.3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 1 }; + const int32_t goldens[] = { 0 }; + + tflite::testing::TestArgMinMaxFloat(input_dims, input_values, axis_dims, + axis_values, output_dims, output_data, + goldens, true); +} + +TF_LITE_MICRO_TEST(GetMaxArgUInt8) +{ + int32_t output_data[1]; + const int input_size = 4; + int input_dims[] = { 4, 1, 1, 1, input_size }; + const float input_values[] = { 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 1 }; + const int32_t goldens[] = { 1 }; + + float input_scale = 0.5; + int input_zero_point = 124; + uint8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, false); +} + +TF_LITE_MICRO_TEST(GetMinArgUInt8) +{ + int32_t output_data[1]; + const int input_size = 4; + int input_dims[] = { 4, 1, 1, 1, input_size }; + const float input_values[] = { 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 1 }; + const int32_t goldens[] = { 0 }; + + float input_scale = 0.5; + int input_zero_point = 124; + uint8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, true); +} + +TF_LITE_MICRO_TEST(GetMaxArgInt8) +{ + int32_t output_data[1]; + const int input_size = 4; + int input_dims[] = { 4, 1, 1, 1, input_size }; + const float input_values[] = { 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 1 }; + const int32_t goldens[] = { 1 }; + + float input_scale = 0.5; + int input_zero_point = -9; + int8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, false); +} + +TF_LITE_MICRO_TEST(GetMinArgInt8) +{ + int32_t output_data[1]; + const int input_size = 4; + int input_dims[] = { 4, 1, 1, 1, input_size }; + const float input_values[] = { 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 1 }; + const int32_t goldens[] = { 0 }; + + float input_scale = 0.5; + int input_zero_point = -9; + int8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, true); +} + +TF_LITE_MICRO_TEST(GetMaxArgMulDimensions) +{ + int32_t output_data[2]; + const int input_size = 8; + int input_dims[] = { 4, 1, 1, 2, 4 }; + const float input_values[] = { 1, 2, 7, 8, 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 2 }; + const int32_t goldens[] = { 3, 1 }; + + float input_scale = 0.5; + int input_zero_point = -9; + int8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, false); +} + +TF_LITE_MICRO_TEST(GetMinArgMulDimensions) +{ + int32_t output_data[2]; + const int input_size = 8; + int input_dims[] = { 4, 1, 1, 2, 4 }; + const float input_values[] = { 1, 2, 7, 8, 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { 3 }; + int output_dims[] = { 3, 1, 1, 2 }; + const int32_t goldens[] = { 0, 0 }; + + float input_scale = 0.5; + int input_zero_point = -9; + int8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, true); +} + +TF_LITE_MICRO_TEST(GetMaxArgNegativeAxis) +{ + const int input_size = 8; + const int output_size = 4; + int input_dims[] = { 4, 1, 1, 2, 4 }; + const float input_values[] = { 1, 2, 7, 8, 1, 9, 7, 3 }; + int axis_dims[] = { 3, 1, 1, 1 }; + const int32_t axis_values[] = { -2 }; + int output_dims[] = { 3, 1, 1, 4 }; + const int32_t goldens[] = { 0, 1, 0, 0 }; + + float input_scale = 0.5; + int input_zero_point = -9; + int32_t output_data[output_size]; + int8_t input_quantized[input_size]; + + tflite::testing::TestArgMinMaxQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + axis_dims, axis_values, output_dims, output_data, goldens, false); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd.cc new file mode 100644 index 00000000..f2b62f3f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd.cc @@ -0,0 +1,114 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/batch_to_space_nd.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { + +namespace { + +constexpr int kInputTensor = 0; +constexpr int kBlockShapeTensor = 1; +constexpr int kCropsTensor = 2; +constexpr int kOutputTensor = 0; + +// Currently, only 3D NHC and 4D NHWC input/output op_context are supported. +// In case of 3D input, it will be extended to 3D NHWC by adding W=1. +// The 4D array need to have exactly 2 spatial dimensions. +// TODO(b/149952582): Support arbitrary dimension in SpaceToBatchND. +const int kInputOutputMinDimensionNum = 3; +const int kInputOutputMaxDimensionNum = 4; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 3); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, input != nullptr && output != nullptr); + + TF_LITE_ENSURE(context, NumDimensions(input) >= kInputOutputMinDimensionNum); + TF_LITE_ENSURE(context, NumDimensions(output) >= kInputOutputMinDimensionNum); + TF_LITE_ENSURE(context, NumDimensions(input) <= kInputOutputMaxDimensionNum); + TF_LITE_ENSURE(context, NumDimensions(output) <= kInputOutputMaxDimensionNum); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *block_shape = + tflite::micro::GetEvalInput(context, node, kBlockShapeTensor); + const TfLiteEvalTensor *crops = + tflite::micro::GetEvalInput(context, node, kCropsTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: + reference_ops::BatchToSpaceND( + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(block_shape), + tflite::micro::GetTensorData(block_shape), + tflite::micro::GetTensorShape(crops), + tflite::micro::GetTensorData(crops), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt8: + reference_ops::BatchToSpaceND( + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(block_shape), + tflite::micro::GetTensorData(block_shape), + tflite::micro::GetTensorShape(crops), + tflite::micro::GetTensorData(crops), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace. + +TfLiteRegistration Register_BATCH_TO_SPACE_ND() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd_test.cc new file mode 100644 index 00000000..dae45378 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/batch_to_space_nd_test.cc @@ -0,0 +1,160 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int kBasicInputOutputSize = 16; +int basic_input_dims[] = { 4, 4, 2, 2, 1 }; +const float basic_input[kBasicInputOutputSize] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 +}; +int basic_block_shape_dims[] = { 1, 2 }; +const int32_t basic_block_shape[] = { 2, 2 }; +int basic_crops_dims[] = { 1, 4 }; +const int32_t basic_crops[] = { 0, 0, 0, 0 }; +int basic_output_dims[] = { 4, 1, 4, 4, 1 }; +const float basic_golden[kBasicInputOutputSize] = { 1, 5, 2, 6, 9, 13, 10, 14, + 3, 7, 4, 8, 11, 15, 12, 16 }; + +template +TfLiteStatus ValidateBatchToSpaceNdGoldens(TfLiteTensor *tensors, + int tensors_size, const T *golden, + T *output, int output_size) +{ + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_BATCH_TO_SPACE_ND(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_ENSURE_STATUS(runner.InitAndPrepare()); + TF_LITE_ENSURE_STATUS(runner.Invoke()); + + for (int i = 0; i < output_size; ++i) { + // TODO(b/158102673): workaround for not having fatal test assertions. + TF_LITE_MICRO_EXPECT_EQ(golden[i], output[i]); + if (golden[i] != output[i]) { + return kTfLiteError; + } + } + return kTfLiteOk; +} + +TfLiteStatus TestBatchToSpaceNdFloat( + int *input_dims_data, const float *input_data, int *block_shape_dims_data, + const int32_t *block_shape_data, int *crops_dims_data, + const int32_t *crops_data, int *output_dims_data, const float *golden, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *block_shape_dims = IntArrayFromInts(block_shape_dims_data); + TfLiteIntArray *crops_dims = IntArrayFromInts(crops_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(block_shape_data, block_shape_dims), + CreateTensor(crops_data, crops_dims), + CreateTensor(output_data, output_dims), + }; + + return ValidateBatchToSpaceNdGoldens(tensors, tensors_size, golden, + output_data, ElementCount(*output_dims)); +} + +template +TfLiteStatus TestBatchToSpaceNdQuantized( + int *input_dims_data, const float *input_data, T *input_quantized, + float input_scale, int input_zero_point, int *block_shape_dims_data, + const int32_t *block_shape_data, int *crops_dims_data, + const int32_t *crops_data, int *output_dims_data, const float *golden, + T *golden_quantized, float output_scale, int output_zero_point, + T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *block_shape_dims = IntArrayFromInts(block_shape_dims_data); + TfLiteIntArray *crops_dims = IntArrayFromInts(crops_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input_data, input_quantized, + input_dims, input_scale, + input_zero_point), + tflite::testing::CreateTensor(block_shape_data, block_shape_dims), + tflite::testing::CreateTensor(crops_data, crops_dims), + tflite::testing::CreateQuantizedTensor(output_data, output_dims, + output_scale, output_zero_point), + }; + tflite::Quantize(golden, golden_quantized, ElementCount(*output_dims), + output_scale, output_zero_point); + + return ValidateBatchToSpaceNdGoldens(tensors, tensors_size, golden_quantized, + output_data, ElementCount(*output_dims)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(BatchToSpaceBasicFloat) +{ + float output[tflite::testing::kBasicInputOutputSize]; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestBatchToSpaceNdFloat( + tflite::testing::basic_input_dims, tflite::testing::basic_input, + tflite::testing::basic_block_shape_dims, + tflite::testing::basic_block_shape, tflite::testing::basic_crops_dims, + tflite::testing::basic_crops, tflite::testing::basic_output_dims, + tflite::testing::basic_golden, output)); +} + +TF_LITE_MICRO_TEST(BatchToSpaceBasicInt8) +{ + int8_t output[tflite::testing::kBasicInputOutputSize]; + int8_t input_quantized[tflite::testing::kBasicInputOutputSize]; + int8_t golden_quantized[tflite::testing::kBasicInputOutputSize]; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestBatchToSpaceNdQuantized( + tflite::testing::basic_input_dims, tflite::testing::basic_input, + input_quantized, 1.0f, 0, tflite::testing::basic_block_shape_dims, + tflite::testing::basic_block_shape, tflite::testing::basic_crops_dims, + tflite::testing::basic_crops, tflite::testing::basic_output_dims, + tflite::testing::basic_golden, golden_quantized, 1.0f, 0, output)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/cast.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cast.cc new file mode 100644 index 00000000..d6851b0c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cast.cc @@ -0,0 +1,101 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + return kTfLiteOk; +} + +template +void copyCast(const FromT *in, ToT *out, int num_elements) +{ + std::transform(in, in + num_elements, out, + [](FromT a) { return static_cast(a); }); +} + +template +TfLiteStatus copyToTensor(TfLiteContext *context, const FromT *in, + TfLiteEvalTensor *out, int num_elements) +{ + switch (out->type) { + case kTfLiteInt8: + copyCast(in, out->data.int8, num_elements); + break; + case kTfLiteFloat32: + copyCast(in, tflite::micro::GetTensorData(out), num_elements); + break; + default: + // Unsupported type. + TF_LITE_KERNEL_LOG(context, "Output type %s (%d) not supported.", + TfLiteTypeGetName(out->type), out->type); + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + int num_elements = MatchingFlatSize(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorShape(output)); + + switch (input->type) { + case kTfLiteInt8: + return copyToTensor(context, input->data.int8, output, num_elements); + case kTfLiteFloat32: + return copyToTensor(context, tflite::micro::GetTensorData(input), + output, num_elements); + default: + // Unsupported type. + TF_LITE_KERNEL_LOG(context, "Input type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + } + return kTfLiteOk; +} +} // namespace + +TfLiteRegistration Register_CAST() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/cast_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cast_test.cc new file mode 100644 index 00000000..e99c6411 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cast_test.cc @@ -0,0 +1,121 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestCastFloatToInt8(int *input_dims_data, const float *input_data, + const int8_t *expected_output_data, + int8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(input_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_CAST(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +void TestCastInt8ToFloat(int *input_dims_data, const int8_t *input_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(input_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_CAST(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(CastFloatToInt8) +{ + int8_t output_data[6]; + int input_dims[] = { 2, 3, 2 }; + + // TODO(b/178391195): Test negative and out-of-range numbers. + const float input_values[] = { 100.f, 1.0f, 0.f, 0.4f, 1.999f, 1.1f }; + const int8_t golden[] = { 100, 1, 0, 0, 1, 1 }; + tflite::testing::TestCastFloatToInt8(input_dims, input_values, golden, + output_data); +} + +TF_LITE_MICRO_TEST(CastInt8ToFloat) +{ + float output_data[6]; + int input_dims[] = { 2, 3, 2 }; + const int8_t input_values[] = { 123, 0, 1, 2, 3, 4 }; + const float golden[] = { 123.f, 0.f, 1.f, 2.f, 3.f, 4.f }; + tflite::testing::TestCastInt8ToFloat(input_dims, input_values, golden, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil.cc new file mode 100644 index 00000000..68fa16ad --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil.cc @@ -0,0 +1,79 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/ceil.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace ceil { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteFloat32); + TF_LITE_ENSURE_TYPES_EQ(context, output->type, input->type); + TF_LITE_ENSURE_EQ(context, output->bytes, input->bytes); + TF_LITE_ENSURE_EQ(context, output->dims->size, input->dims->size); + for (int i = 0; i < output->dims->size; ++i) { + TF_LITE_ENSURE_EQ(context, output->dims->data[i], input->dims->data[i]); + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + reference_ops::Ceil(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + + return kTfLiteOk; +} +} // namespace ceil + +TfLiteRegistration Register_CEIL() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ceil::Prepare, + /*invoke=*/ceil::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil_test.cc new file mode 100644 index 00000000..9c7f292b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ceil_test.cc @@ -0,0 +1,94 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestCeil(int *input_dims_data, const float *input_data, + const float *expected_output_data, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(input_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = ops::micro::Register_CEIL(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SingleDim) +{ + float output_data[2]; + int input_dims[] = { 1, 2 }; + const float input_values[] = { 8.5, 0.0 }; + const float golden[] = { 9, 0 }; + tflite::testing::TestCeil(input_dims, input_values, golden, output_data); +} + +TF_LITE_MICRO_TEST(MultiDims) +{ + float output_data[10]; + int input_dims[] = { 4, 2, 1, 1, 5 }; + const float input_values[] = { + 0.0001, + 8.0001, + 0.9999, + 9.9999, + 0.5, + -0.0001, + -8.0001, + -0.9999, + -9.9999, + -0.5, + }; + const float golden[] = { 1, 9, 1, 10, 1, 0, -8, 0, -9, 0 }; + tflite::testing::TestCeil(input_dims, input_values, golden, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer.cc new file mode 100644 index 00000000..fe14781b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer.cc @@ -0,0 +1,198 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +/* + * The circular buffer custom operator is used to implement strided streaming + * convolutions on TFLite Micro. Each time this operator is invoked, it checks + * whether or not to run, based on a predetermined stride in time. If the op + * runs, it inserts the input into the end of the output buffer and shifts the + * output values towards the start of the buffer. It discards the oldest value + * in the output buffer. + * + * Input: [, , , ] + * + * After shifting: + * Output: [, , , ] + * + * We make some assumptions in this custom operator: + * - Input shape must be [1, 1, 1, depth] + * - Output shape must be [1, num_slots, 1, depth] + * - Input and output types must match. + * - Input and output quantization params must be identical. + */ +namespace tflite { +namespace ops { +namespace micro { +namespace circular_buffer { + +namespace { + +// The CircularBuffer op has one input and one output tensor. +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +// TODO(b/149795762): Add this to TfLiteStatus enum. +constexpr TfLiteStatus kTfLiteAbort = static_cast(-9); + +// These fields control the stride period of a strided streaming model. This op +// returns kTfLiteAbort until cycles_until_run-- is zero. At this time, +// cycles_until_run is reset to cycles_max. +struct OpData { + int cycles_until_run; + int cycles_max; +}; + +} // namespace + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + OpData *op_data = static_cast( + context->AllocatePersistentBuffer(context, sizeof(OpData))); + + if (buffer != nullptr && length > 0) { + const uint8_t *buffer_t = reinterpret_cast(buffer); + const flexbuffers::Map &m = + tflite::micro::FlexbuffersWrapperGetRootAsMap(buffer_t, length); + op_data->cycles_max = + tflite::micro::FlexbuffersWrapperAsInt32(m, "cycles_max"); + } else { + op_data->cycles_max = 0; + } + + return op_data; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + OpData *op_data = static_cast(node->user_data); + + TF_LITE_ENSURE(context, input != nullptr); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_EQ(context, input->dims->data[0], output->dims->data[0]); + TF_LITE_ENSURE_EQ(context, 1, input->dims->data[1]); + TF_LITE_ENSURE_EQ(context, input->dims->data[2], output->dims->data[2]); + TF_LITE_ENSURE_EQ(context, output->dims->data[3], input->dims->data[3]); + + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + // The circular buffer custom operator currently only supports int8. + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteInt8); + + if (op_data->cycles_max <= 0) { + // The last circular buffer layer simply accumulates outputs, and does not + // run periodically. + // TODO(b/150001379): Move this special case logic to the tflite flatbuffer. + static int cb_prepare_count = 0; + cb_prepare_count++; + // These checks specifically work for the only two streaming models + // supported on TFLM. They use the shape of the output tensor along with the + // layer number to determine if the circular buffer period should be 1 or 2. + + // These models are outlined int the following documents: + // https://docs.google.com/document/d/1lc_G2ZFhjiKFo02UHjBaljye1xsL0EkfybkaVELEE3Q/edit?usp=sharing + // https://docs.google.com/document/d/1pGc42PuWyrk-Jy1-9qeqtggvsmHr1ifz8Lmqfpr2rKA/edit?usp=sharing + if (output->dims->data[1] == 5 || output->dims->data[1] == 13 || + output->dims->data[1] == 25 || + (cb_prepare_count == 5 && output->dims->data[2] == 2 && + output->dims->data[3] == 96)) { + op_data->cycles_max = 1; + cb_prepare_count = 0; + } else { + op_data->cycles_max = 2; + } + } + op_data->cycles_until_run = op_data->cycles_max; + node->user_data = op_data; + + return kTfLiteOk; +} + +// Shifts buffer over by the output depth, and write new input to end of buffer. +// num_slots is the number of samples stored in the output buffer. +// depth is the size of each sample. +void EvalInt8(const int8_t *input, int num_slots, int depth, int8_t *output) +{ + memmove(output, &output[depth], (num_slots - 1) * depth); + memcpy(&output[(num_slots - 1) * depth], input, depth); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = reinterpret_cast(node->user_data); + + int num_slots = output->dims->data[1]; + int depth = output->dims->data[2] * output->dims->data[3]; + + if (input->type == kTfLiteInt8) { + EvalInt8(tflite::micro::GetTensorData(input), num_slots, depth, + tflite::micro::GetTensorData(output)); + } else { + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + + if (--data->cycles_until_run != 0) { + // Signal the interpreter to end current run if the delay before op invoke + // has not been reached. + // TODO(b/149795762): Add kTfLiteAbort to TfLiteStatus enum. + return static_cast(kTfLiteAbort); + } + + data->cycles_until_run = data->cycles_max; + + return kTfLiteOk; +} + +} // namespace circular_buffer + +TfLiteRegistration *Register_CIRCULAR_BUFFER() +{ + static TfLiteRegistration r = { /*init=*/circular_buffer::Init, + /*free=*/nullptr, + /*prepare=*/circular_buffer::Prepare, + /*invoke=*/circular_buffer::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; + return &r; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.cc new file mode 100644 index 00000000..915f9fb0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.cc @@ -0,0 +1,44 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This file is generated. See: +// third_party/tensorflow/lite/micro/kernels/test_data_generation/README.md + +#include "tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.h" + +const int g_gen_data_size_circular_buffer_config = 21; +const unsigned char g_gen_data_circular_buffer_config[] = { + 0x63, + 0x79, + 0x63, + 0x6c, + 0x65, + 0x73, + 0x5f, + 0x6d, + 0x61, + 0x78, + 0x00, + 0x01, + 0x0c, + 0x01, + 0x01, + 0x01, + 0x01, + 0x04, + 0x02, + 0x24, + 0x01, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.h new file mode 100644 index 00000000..2fbf4fe9 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.h @@ -0,0 +1,22 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_FLEXBUFFERS_GENERATED_DATA_H +#define TENSORFLOW_LITE_MICRO_KERNELS_FLEXBUFFERS_GENERATED_DATA_H + +extern const int g_gen_data_size_circular_buffer_config; +extern const unsigned char g_gen_data_circular_buffer_config[]; + +#endif diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_test.cc new file mode 100644 index 00000000..b9b769a4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/circular_buffer_test.cc @@ -0,0 +1,250 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/circular_buffer_flexbuffers_generated_data.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/kernels/micro_ops.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int kRunPeriod = 2; + +// TODO(b/149795762): Add this to TfLiteStatus enum. +constexpr TfLiteStatus kTfLiteAbort = static_cast(-9); + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(OutputTensorLength4) +{ + constexpr int depth = 3; + constexpr int num_slots = 4; + int8_t input_data[depth]; + int8_t output_data[depth * num_slots]; + + memset(output_data, 0, sizeof(output_data)); + + // There are four input dimensions - [1, 1, 1, depth]. + int input_dims[] = { 4, 1, 1, 1, depth }; + // There are four output dimensions - [1, num_slots, 1, depth]. + int output_dims[] = { 4, 1, num_slots, 1, depth }; + + TfLiteIntArray *input_tensor_dims = + tflite::testing::IntArrayFromInts(input_dims); + TfLiteIntArray *output_tensor_dims = + tflite::testing::IntArrayFromInts(output_dims); + + const int output_dims_count = tflite::ElementCount(*output_tensor_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input_data, input_tensor_dims, 1, + 0), + tflite::testing::CreateQuantizedTensor(output_data, output_tensor_dims, 1, + 0), + }; + + // There is one input - tensor 0. + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = + tflite::testing::IntArrayFromInts(inputs_array_data); + // There is one output - tensor 1. + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = + tflite::testing::IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration *registration = + tflite::ops::micro::Register_CIRCULAR_BUFFER(); + tflite::micro::KernelRunner runner = tflite::micro::KernelRunner( + *registration, tensors, tensors_size, inputs_array, outputs_array, + /*builtin_data=*/nullptr); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + + const int8_t goldens[5][16] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 }, + { 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6 }, + { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, + { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } }; + + // Expect the circular buffer to run every other invoke for 4xN output. + for (int i = 0; i < 5; i++) { + for (int j = 0; j < depth; j++) { + input_data[j] = i * depth + j + 1; + } + TfLiteStatus status = runner.Invoke(); + + for (int j = 0; j < output_dims_count; ++j) { + TF_LITE_MICRO_EXPECT_EQ(goldens[i][j], output_data[j]); + } + + // Every kRunPeriod iterations, the circular buffer should return kTfLiteOk. + if (i % tflite::testing::kRunPeriod == tflite::testing::kRunPeriod - 1) { + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, status); + } else { + TF_LITE_MICRO_EXPECT_EQ(tflite::testing::kTfLiteAbort, status); + } + } +} + +TF_LITE_MICRO_TEST(OutputTensorOnEveryIterationLength4) +{ + constexpr int depth = 3; + constexpr int num_slots = 4; + int8_t input_data[depth]; + int8_t output_data[depth * num_slots]; + + memset(output_data, 0, sizeof(output_data)); + + // There are four input dimensions - [1, 1, 1, depth]. + int input_dims[] = { 4, 1, 1, 1, depth }; + // There are four output dimensions - [1, num_slots, 1, depth]. + int output_dims[] = { 4, 1, num_slots, 1, depth }; + + TfLiteIntArray *input_tensor_dims = + tflite::testing::IntArrayFromInts(input_dims); + TfLiteIntArray *output_tensor_dims = + tflite::testing::IntArrayFromInts(output_dims); + + const int output_dims_count = tflite::ElementCount(*output_tensor_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input_data, input_tensor_dims, 1, + 0), + tflite::testing::CreateQuantizedTensor(output_data, output_tensor_dims, 1, + 0), + }; + + // There is one input - tensor 0. + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = + tflite::testing::IntArrayFromInts(inputs_array_data); + // There is one output - tensor 1. + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = + tflite::testing::IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration *registration = + tflite::ops::micro::Register_CIRCULAR_BUFFER(); + tflite::micro::KernelRunner runner = tflite::micro::KernelRunner( + *registration, tensors, tensors_size, inputs_array, outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, runner.InitAndPrepare(reinterpret_cast( + g_gen_data_circular_buffer_config), + g_gen_data_size_circular_buffer_config)); + + const int8_t goldens[5][16] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 }, + { 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6 }, + { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, + { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } }; + + // Expect the circular buffer to run every other invoke for 4xN output. + for (int i = 0; i < 5; i++) { + for (int j = 0; j < depth; j++) { + input_data[j] = i * depth + j + 1; + } + TfLiteStatus status = runner.Invoke(); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, status); + + for (int j = 0; j < output_dims_count; ++j) { + TF_LITE_MICRO_EXPECT_EQ(goldens[i][j], output_data[j]); + } + } +} + +TF_LITE_MICRO_TEST(OutputTensorLength5) +{ + constexpr int depth = 4; + constexpr int num_slots = 5; + int8_t input_data[depth]; + int8_t output_data[depth * num_slots]; + + memset(output_data, 0, sizeof(output_data)); + int input_dims[] = { 4, 1, 1, 1, depth }; + int output_dims[] = { 4, 1, num_slots, 1, depth }; + TfLiteIntArray *input_tensor_dims = + tflite::testing::IntArrayFromInts(input_dims); + TfLiteIntArray *output_tensor_dims = + tflite::testing::IntArrayFromInts(output_dims); + + const int output_dims_count = tflite::ElementCount(*output_tensor_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input_data, input_tensor_dims, 1, + 0), + tflite::testing::CreateQuantizedTensor(output_data, output_tensor_dims, 1, + 0), + }; + + // There is one input - tensor 0. + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = + tflite::testing::IntArrayFromInts(inputs_array_data); + // There is one output - tensor 1. + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = + tflite::testing::IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration *registration = + tflite::ops::micro::Register_CIRCULAR_BUFFER(); + tflite::micro::KernelRunner runner = tflite::micro::KernelRunner( + *registration, tensors, tensors_size, inputs_array, outputs_array, + /*builtin_data=*/nullptr); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + + const int8_t goldens[6][20] = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, + { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 }, + { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 } + }; + + // Expect circular buffer to run every cycle for 5xN output. + for (int i = 0; i < 6; i++) { + for (int j = 0; j < depth; j++) { + input_data[j] = i * depth + j + 1; + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int j = 0; j < output_dims_count; ++j) { + TF_LITE_MICRO_EXPECT_EQ(goldens[i][j], output_data[j]); + } + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons.cc new file mode 100644 index 00000000..0ee9e28c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons.cc @@ -0,0 +1,706 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/comparisons.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace comparisons { +namespace { + +struct OpData { + ComparisonParams params; +}; + +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus EqualEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + RuntimeShape input1_shape = tflite::micro::GetTensorShape(input1); + RuntimeShape input2_shape = tflite::micro::GetTensorShape(input2); + RuntimeShape output_shape = tflite::micro::GetTensorShape(output); + bool *output_data = tflite::micro::GetTensorData(output); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + switch (input1->type) { + case kTfLiteBool: + requires_broadcast ? reference_ops::Broadcast4DSlowEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::EqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteFloat32: + requires_broadcast ? reference_ops::Broadcast4DSlowEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::EqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt32: + requires_broadcast ? reference_ops::Broadcast4DSlowEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::EqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt64: + requires_broadcast ? reference_ops::Broadcast4DSlowEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::EqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteUInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::EqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::EqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +// TODO(renjieliu): Refactor the logic to avoid duplications. +TfLiteStatus NotEqualEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + RuntimeShape input1_shape = tflite::micro::GetTensorShape(input1); + RuntimeShape input2_shape = tflite::micro::GetTensorShape(input2); + RuntimeShape output_shape = tflite::micro::GetTensorShape(output); + bool *output_data = tflite::micro::GetTensorData(output); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + switch (input1->type) { + case kTfLiteBool: + requires_broadcast ? reference_ops::Broadcast4DSlowNotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::NotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteFloat32: + requires_broadcast ? reference_ops::Broadcast4DSlowNotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::NotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt32: + requires_broadcast ? reference_ops::Broadcast4DSlowNotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::NotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt64: + requires_broadcast ? reference_ops::Broadcast4DSlowNotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::NotEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteUInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowNotEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::NotEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowNotEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::NotEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus GreaterEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + RuntimeShape input1_shape = tflite::micro::GetTensorShape(input1); + RuntimeShape input2_shape = tflite::micro::GetTensorShape(input2); + RuntimeShape output_shape = tflite::micro::GetTensorShape(output); + bool *output_data = tflite::micro::GetTensorData(output); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + switch (input1->type) { + case kTfLiteFloat32: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt32: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt64: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteUInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus GreaterEqualEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + RuntimeShape input1_shape = tflite::micro::GetTensorShape(input1); + RuntimeShape input2_shape = tflite::micro::GetTensorShape(input2); + RuntimeShape output_shape = tflite::micro::GetTensorShape(output); + bool *output_data = tflite::micro::GetTensorData(output); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + switch (input1->type) { + case kTfLiteFloat32: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt32: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt64: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteUInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowGreaterEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::GreaterEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus LessEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + RuntimeShape input1_shape = tflite::micro::GetTensorShape(input1); + RuntimeShape input2_shape = tflite::micro::GetTensorShape(input2); + RuntimeShape output_shape = tflite::micro::GetTensorShape(output); + bool *output_data = tflite::micro::GetTensorData(output); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + switch (input1->type) { + case kTfLiteFloat32: + requires_broadcast ? reference_ops::Broadcast4DSlowLessNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt32: + requires_broadcast ? reference_ops::Broadcast4DSlowLessNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt64: + requires_broadcast ? reference_ops::Broadcast4DSlowLessNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteUInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowLessWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowLessWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus LessEqualEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + RuntimeShape input1_shape = tflite::micro::GetTensorShape(input1); + RuntimeShape input2_shape = tflite::micro::GetTensorShape(input2); + RuntimeShape output_shape = tflite::micro::GetTensorShape(output); + bool *output_data = tflite::micro::GetTensorData(output); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + switch (input1->type) { + case kTfLiteFloat32: + requires_broadcast ? reference_ops::Broadcast4DSlowLessEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt32: + requires_broadcast ? reference_ops::Broadcast4DSlowLessEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt64: + requires_broadcast ? reference_ops::Broadcast4DSlowLessEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessEqualNoScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteUInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowLessEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + case kTfLiteInt8: + requires_broadcast ? reference_ops::Broadcast4DSlowLessEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data) : + reference_ops::LessEqualWithScaling( + data->params, input1_shape, + tflite::micro::GetTensorData(input1), input2_shape, + tflite::micro::GetTensorData(input2), output_shape, + output_data); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + const TfLiteTensor *input1 = GetInput(context, node, kInputTensor1); + TF_LITE_ENSURE(context, input1 != nullptr); + const TfLiteTensor *input2 = GetInput(context, node, kInputTensor2); + TF_LITE_ENSURE(context, input2 != nullptr); + + if (input1->type == kTfLiteUInt8 || input1->type == kTfLiteInt8) { + auto input1_offset = -input1->params.zero_point; + auto input2_offset = -input2->params.zero_point; + const int kLeftShift = 8; + + int32_t input1_multiplier; + int input1_shift; + QuantizeMultiplierSmallerThanOneExp( + static_cast(input1->params.scale), &input1_multiplier, + &input1_shift); + int32_t input2_multiplier; + int input2_shift; + QuantizeMultiplierSmallerThanOneExp( + static_cast(input2->params.scale), &input2_multiplier, + &input2_shift); + + data->params.left_shift = kLeftShift; + data->params.input1_offset = input1_offset; + data->params.input1_multiplier = input1_multiplier; + data->params.input1_shift = input1_shift; + data->params.input2_offset = input2_offset; + data->params.input2_multiplier = input2_multiplier; + data->params.input2_shift = input2_shift; + } + + return kTfLiteOk; +} + +} // namespace comparisons + +TfLiteRegistration Register_EQUAL() +{ + return { /*init=*/comparisons::Init, + /*free=*/nullptr, + /*prepare=*/comparisons::Prepare, + /*invoke=*/comparisons::EqualEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_NOT_EQUAL() +{ + return { /*init=*/comparisons::Init, + /*free=*/nullptr, + /*prepare=*/comparisons::Prepare, + /*invoke=*/comparisons::NotEqualEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_GREATER() +{ + return { /*init=*/comparisons::Init, + /*free=*/nullptr, + /*prepare=*/comparisons::Prepare, + /*invoke=*/comparisons::GreaterEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_GREATER_EQUAL() +{ + return { /*init=*/comparisons::Init, + /*free=*/nullptr, + /*prepare=*/comparisons::Prepare, + /*invoke=*/comparisons::GreaterEqualEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_LESS() +{ + return { /*init=*/comparisons::Init, + /*free=*/nullptr, + /*prepare=*/comparisons::Prepare, + /*invoke=*/comparisons::LessEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_LESS_EQUAL() +{ + return { /*init=*/comparisons::Init, + /*free=*/nullptr, + /*prepare=*/comparisons::Prepare, + /*invoke=*/comparisons::LessEqualEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons_test.cc new file mode 100644 index 00000000..5ec73210 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/comparisons_test.cc @@ -0,0 +1,1172 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int inputs_size = 2; +constexpr int outputs_size = 1; +constexpr int tensors_size = inputs_size + outputs_size; + +void TestComparison(const TfLiteRegistration ®istration, + TfLiteTensor *tensors, bool *expected_output_data, + bool *output_data) +{ + const int output_dims_count = ElementCount(*tensors[inputs_size].dims); + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +void TestComparisonFloat(const TfLiteRegistration ®istration, + int *input1_dims_data, float *input1_data, + int *input2_dims_data, float *input2_data, + bool *expected_output_data, int *output_dims_data, + bool *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + TestComparison(registration, tensors, expected_output_data, output_data); +} + +void TestComparisonBool(const TfLiteRegistration ®istration, + int *input1_dims_data, bool *input1_data, + int *input2_dims_data, bool *input2_data, + bool *expected_output_data, int *output_dims_data, + bool *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + TestComparison(registration, tensors, expected_output_data, output_data); +} + +void TestComparisonInt(const TfLiteRegistration ®istration, + int *input1_dims_data, int32_t *input1_data, + int *input2_dims_data, int32_t *input2_data, + bool *expected_output_data, int *output_dims_data, + bool *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + TestComparison(registration, tensors, expected_output_data, output_data); +} + +void TestComparisonQuantizedUInt8(const TfLiteRegistration ®istration, + int *input1_dims_data, float *input1_data, + uint8_t *input1_quantized, float input1_scale, + int input1_zero_point, int *input2_dims_data, + float *input2_data, uint8_t *input2_quantized, + float input2_scale, int input2_zero_point, + bool *expected_output_data, + int *output_dims_data, bool *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input1_data, input1_quantized, input1_dims, + input1_scale, input1_zero_point), + CreateQuantizedTensor(input2_data, input2_quantized, input2_dims, + input2_scale, input2_zero_point), + CreateTensor(output_data, output_dims), + }; + + TestComparison(registration, tensors, expected_output_data, output_data); +} + +void TestComparisonQuantizedInt8(const TfLiteRegistration ®istration, + int *input1_dims_data, float *input1_data, + int8_t *input1_quantized, float input1_scale, + int input1_zero_point, int *input2_dims_data, + float *input2_data, int8_t *input2_quantized, + float input2_scale, int input2_zero_point, + bool *expected_output_data, + int *output_dims_data, bool *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input1_data, input1_quantized, input1_dims, + input1_scale, input1_zero_point), + CreateQuantizedTensor(input2_data, input2_quantized, input2_dims, + input2_scale, input2_zero_point), + CreateTensor(output_data, output_dims), + }; + + TestComparison(registration, tensors, expected_output_data, output_data); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(EqualBool) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + bool input1_data[] = { true, false, true, false }; + bool input2_data[] = { true, true, false, false }; + + bool expected_data[] = { true, false, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonBool( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualFloat) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + float input1_data[] = { 0.1, 0.9, 0.7, 0.3 }; + float input2_data[] = { 0.1, 0.2, 0.6, 0.5 }; + + bool expected_data[] = { true, false, false, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonFloat( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualInt) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { false, false, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualBroadcast) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 1 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 7 }; + + bool expected_data[] = { false, false, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualBroadcastTwoD) +{ + int input1_dim[] = { 4, 1, 1, 2, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3, 2, 4, 2, 8 }; + int32_t input2_data[] = { 7, 1, 2, 4 }; + + bool expected_data[] = { false, false, false, false, + false, false, true, false }; + int expected_dim[] = { 4, 1, 1, 2, 4 }; + + bool output_data[8]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualBool) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + bool input1_data[] = { true, false, true, false }; + bool input2_data[] = { true, true, false, false }; + + bool expected_data[] = { false, true, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonBool( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualFloat) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + float input1_data[] = { 0.1, 0.9, 0.7, 0.3 }; + float input2_data[] = { 0.1, 0.2, 0.6, 0.5 }; + + bool expected_data[] = { false, true, true, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonFloat( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualInt) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { true, true, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualBroadcast) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 1 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 7 }; + + bool expected_data[] = { true, true, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualBroadcastTwoD) +{ + int input1_dim[] = { 4, 1, 1, 2, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3, 2, 4, 2, 8 }; + int32_t input2_data[] = { 7, 1, 2, 4 }; + + bool expected_data[] = { true, true, true, true, true, true, false, true }; + int expected_dim[] = { 4, 1, 1, 2, 4 }; + + bool output_data[8]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterFloat) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + float input1_data[] = { 0.1, 0.9, 0.7, 0.3 }; + float input2_data[] = { 0.1, 0.2, 0.6, 0.5 }; + + bool expected_data[] = { false, true, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonFloat( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterInt) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { false, true, false, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterBroadcast) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 1 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 7 }; + + bool expected_data[] = { false, true, false, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterBroadcastTwoD) +{ + int input1_dim[] = { 4, 1, 1, 2, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3, 2, 4, 2, 8 }; + int32_t input2_data[] = { 7, 1, 2, 4 }; + + bool expected_data[] = { false, true, true, false, false, true, false, true }; + int expected_dim[] = { 4, 1, 1, 2, 4 }; + + bool output_data[8]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterEqualFloat) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + float input1_data[] = { 0.1, 0.9, 0.7, 0.3 }; + float input2_data[] = { 0.1, 0.2, 0.6, 0.5 }; + + bool expected_data[] = { true, true, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonFloat( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterEqualInt) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { false, true, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterEqualBroadcast) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 1 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 7 }; + + bool expected_data[] = { false, true, true, false }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterEqualBroadcastTwoD) +{ + int input1_dim[] = { 4, 1, 1, 2, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3, 2, 4, 2, 8 }; + int32_t input2_data[] = { 7, 1, 2, 4 }; + + bool expected_data[] = { false, true, true, false, false, true, true, true }; + int expected_dim[] = { 4, 1, 1, 2, 4 }; + + bool output_data[8]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessFloat) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + float input1_data[] = { 0.1, 0.9, 0.7, 0.3 }; + float input2_data[] = { 0.1, 0.2, 0.6, 0.5 }; + + bool expected_data[] = { false, false, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonFloat( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessInt) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 1, 2, 6, 5 }; + + bool expected_data[] = { true, false, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessBroadcast) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 1 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 7 }; + + bool expected_data[] = { true, false, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessBroadcastTwoD) +{ + int input1_dim[] = { 4, 1, 1, 2, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3, 2, 4, 6, 8 }; + int32_t input2_data[] = { 7, 1, 2, 4 }; + + bool expected_data[] = { true, false, false, true, true, false, false, false }; + int expected_dim[] = { 4, 1, 1, 2, 4 }; + + bool output_data[8]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, input2_dim, + input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessEqualFloat) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + float input1_data[] = { 0.1, 0.9, 0.7, 0.3 }; + float input2_data[] = { 0.1, 0.2, 0.6, 0.5 }; + + bool expected_data[] = { true, false, false, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonFloat( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessEqualInt) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { true, false, true, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessEqualBroadcast) +{ + int input1_dim[] = { 4, 1, 1, 1, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 1 }; + + int32_t input1_data[] = { -1, 9, 7, 3 }; + int32_t input2_data[] = { 7 }; + + bool expected_data[] = { true, false, true, true }; + int expected_dim[] = { 4, 1, 1, 1, 4 }; + + bool output_data[4]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessEqualBroadcastTwoD) +{ + int input1_dim[] = { 4, 1, 1, 2, 4 }; + int input2_dim[] = { 4, 1, 1, 1, 4 }; + + int32_t input1_data[] = { -1, 9, 7, 3, 2, 4, 2, 8 }; + int32_t input2_data[] = { 7, 1, 2, 4 }; + + bool expected_data[] = { true, false, false, true, true, false, true, false }; + int expected_dim[] = { 4, 1, 1, 2, 4 }; + + bool output_data[8]; + tflite::testing::TestComparisonInt( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input2_dim, input2_data, expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualQuantizedUInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + float input1_data[] = { 1, 9, 7, 3 }; + float input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { true, false, true, false }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + const float input2_scale = 0.25; + const int input2_zero_point = 125; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input2_scale, input2_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualQuantizedInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + + float input1_data[] = { 1, -9, 7, 3 }; + float input2_data[] = { -1, 2, 7, 5 }; + + bool expected_data[] = { false, false, true, false }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = -5; + const float input2_scale = 0.25; + const int input2_zero_point = 5; + int8_t input1_quantized[4]; + int8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input2_scale, input2_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualQuantizedUInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + float input1_data[] = { 1, 9, 7, 3 }; + float input2_data[] = { 1, 2, 7, 0 }; + + bool expected_data[] = { false, true, false, true }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + const float input2_scale = 0.25; + const int input2_zero_point = 125; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input2_scale, input2_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(NotEqualQuantizedInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + + float input1_data[] = { 1, -9, 7, 3 }; + float input2_data[] = { 1, 2, 7, 5 }; + + bool expected_data[] = { false, true, false, true }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = -5; + const float input2_scale = 0.25; + const int input2_zero_point = 5; + int8_t input1_quantized[4]; + int8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input2_scale, input2_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterQuantizedUInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + float input1_data[] = { 1, 9, 7, 3 }; + float input2_data[] = { 1, 2, 6, 5 }; + + bool expected_data[] = { false, true, true, false }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + const float input2_scale = 0.25; + const int input2_zero_point = 125; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input2_scale, input2_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterQuantizedUInt8SmallRange) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + float input1_data[] = { 1, 0.5, 0.35, 0.1 }; + float input2_data[] = { 1.01, 0.25, 0.3, 0.4 }; + + bool expected_data[] = { false, true, true, false }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + const float input2_scale = 0.25; + const int input2_zero_point = 125; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input2_scale, input2_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(GreaterUInt8EqualQuantized) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + + float input1_data[] = { 1, 9, 7, 3 }; + float input2_data[] = { 1, 2, 6, 5 }; + + bool expected_data[] = { true, true, true, false }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessQuantizedUInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + + float input1_data[] = { 1, 9, 7, 3 }; + float input2_data[] = { 1, 2, 6, 5 }; + + bool expected_data[] = { false, false, false, true }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(LessEqualQuantizedUInt8) +{ + int input1_dim[] = { 4, 1, 2, 2, 1 }; + int input2_dim[] = { 4, 1, 2, 2, 1 }; + + float input1_data[] = { 1, 9, 7, 3 }; + float input2_data[] = { 1, 2, 6, 5 }; + + bool expected_data[] = { true, false, false, true }; + int expected_dim[] = { 4, 1, 2, 2, 1 }; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[4]; + uint8_t input2_quantized[4]; + + bool output_data[4]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); +} + +TF_LITE_MICRO_TEST(EqualQuantizedUInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, 2, 7, 8, 11, 20, 2 }; + float input2_data[] = { 2 }; + + bool expected_data[] = { false, true, false, false, false, false }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[6]; + uint8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(NotEqualQuantizedUInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, 2, 7, 8, 11, 20 }; + float input2_data[] = { 2 }; + + bool expected_data[] = { true, false, true, true, true, true }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[6]; + uint8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(NotEqualQuantizedInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, -2, -71, 8, 11, 20 }; + float input2_data[] = { 8 }; + + bool expected_data[] = { true, true, true, false, true, true }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = -9; + int8_t input1_quantized[6]; + int8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_NOT_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(GreaterQuantizedUInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, 2, 7, 8, 11, 20 }; + float input2_data[] = { 2 }; + + bool expected_data[] = { true, false, true, true, true, true }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[6]; + uint8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(GreaterQuantizedInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, -2, -71, 8, 11, 20 }; + float input2_data[] = { 8 }; + + bool expected_data[] = { true, false, false, false, true, true }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = -9; + int8_t input1_quantized[6]; + int8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_GREATER(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(GreaterEqualQuantizedUInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, 2, 7, 8, 11, 20 }; + float input2_data[] = { 2 }; + + bool expected_data[] = { true, true, true, true, true, true }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[6]; + uint8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(GreaterEqualQuantizedInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, -2, -71, 8, 11, 20 }; + float input2_data[] = { 8 }; + + bool expected_data[] = { true, false, false, true, true, true }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = -9; + int8_t input1_quantized[6]; + int8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_GREATER_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(LessQuantizedUInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, 2, -1, 8, 11, 20 }; + float input2_data[] = { 2 }; + + bool expected_data[] = { false, false, true, false, false, false }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[6]; + uint8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(LessQuantizedInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, -2, -71, 8, 11, 20 }; + float input2_data[] = { 8 }; + + bool expected_data[] = { false, true, true, false, false, false }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = -9; + int8_t input1_quantized[6]; + int8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_LESS(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(LessEqualQuantizedUInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, 2, -1, 8, 11, 20 }; + float input2_data[] = { 2 }; + + bool expected_data[] = { false, true, true, false, false, false }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = 128; + uint8_t input1_quantized[6]; + uint8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedUInt8( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TEST(LessEqualQuantizedInt8WithBroadcast) +{ + const int num_shapes = 4; + const int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, { 2, 2, 3 }, { 3, 2, 1, 3 }, { 4, 1, 3, 1, 2 } + }; + + for (int i = 0; i < num_shapes; ++i) { + int *input1_dim = test_shapes[i]; + int input2_dim[] = { 1, 1 }; + float input1_data[] = { 20, -2, -71, 8, 11, 20 }; + float input2_data[] = { 8 }; + + bool expected_data[] = { false, true, true, true, false, false }; + int *expected_dim = input1_dim; + + const float input1_scale = 0.5; + const int input1_zero_point = -9; + int8_t input1_quantized[6]; + int8_t input2_quantized[6]; + + bool output_data[6]; + tflite::testing::TestComparisonQuantizedInt8( + tflite::ops::micro::Register_LESS_EQUAL(), input1_dim, input1_data, + input1_quantized, input1_scale, input1_zero_point, input2_dim, + input2_data, input2_quantized, input1_scale, input1_zero_point, + expected_data, expected_dim, output_data); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation.cc new file mode 100644 index 00000000..d3d2c9c2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation.cc @@ -0,0 +1,290 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/concatenation.h" + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/portable_tensor.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace concatenation { + +constexpr int kMaxInputNum = 10; // Maximum number of input tensors +constexpr int kOutputTensor = 0; + +struct OpData { + ConcatenationParams params; +}; + +// Handles negative axis index, coerces to positive index value. +inline int CalculatePositiveAxis(int axis, const TfLiteTensor *output_tensor) +{ + if (axis >= 0) { + return axis; + } else { + return NumDimensions(output_tensor) + axis; + } +} + +// The following functions are helpers to get tensor data in the format that the +// reference op implementation expects. They provide the same functionality as +// class VectorOfTensors and class VectorOfQuantizedTensors in TFLite. + +// Gets shapes from a list of tensors. +inline void GetAllInputTensorShapes(const TfLiteContext *context, + const TfLiteNode *node, + RuntimeShape all_shapes[kMaxInputNum]) +{ + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(node != nullptr); + for (int i = 0; i < node->inputs->size; ++i) { + const TfLiteEvalTensor *t = tflite::micro::GetEvalInput(context, node, i); + RuntimeShape shape = tflite::micro::GetTensorShape(t); + all_shapes[i].ReplaceWith(shape.DimensionsCount(), shape.DimsData()); + } +} + +// Get shape pointers from a list of shapes. +inline void GetShapesPointers(const RuntimeShape *shapes, size_t num, + const RuntimeShape *pointers[]) +{ + for (size_t i = 0; i < num; ++i) { + pointers[i] = &shapes[i]; + } +} + +// Gets data pointers from a list of tensors. +template +inline void GetAllInputTensorData(const TfLiteContext *context, + const TfLiteNode *node, + T *all_data[kMaxInputNum]) +{ + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(node != nullptr); + for (int i = 0; i < node->inputs->size; ++i) { + const TfLiteEvalTensor *t = tflite::micro::GetEvalInput(context, node, i); + all_data[i] = tflite::micro::GetTensorData(t); + } +} + +template +void EvalUnquantized(TfLiteContext *context, TfLiteNode *node) +{ + // Collect the shapes and data pointer of input tensors + RuntimeShape inputs_shape[kMaxInputNum]; + const RuntimeShape *inputs_shape_ptr[kMaxInputNum]; + const data_type *inputs_data[kMaxInputNum]; + GetAllInputTensorShapes(context, node, inputs_shape); + GetShapesPointers(inputs_shape, node->inputs->size, inputs_shape_ptr); + GetAllInputTensorData(context, node, inputs_data); + + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + reference_ops::Concatenation(data->params, inputs_shape_ptr, inputs_data, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +void EvalQuantizedUInt8(TfLiteContext *context, TfLiteNode *node) +{ + // Collect the shapes and data pointer of input tensors + RuntimeShape inputs_shape[kMaxInputNum]; + const RuntimeShape *inputs_shape_ptr[kMaxInputNum]; + const uint8_t *inputs_data[kMaxInputNum]; + GetAllInputTensorShapes(context, node, inputs_shape); + GetShapesPointers(inputs_shape, node->inputs->size, inputs_shape_ptr); + GetAllInputTensorData(context, node, inputs_data); + + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + reference_ops::ConcatenationWithScaling( + data->params, inputs_shape_ptr, inputs_data, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + // This function only checks the types. Additional shape validations are + // performed in the reference implementation called during Eval(). + const TfLiteConcatenationParams *params = + reinterpret_cast(node->builtin_data); + + const TfLiteTensor *input_tensor = GetInput(context, node, 0); + TF_LITE_ENSURE(context, input_tensor != nullptr); + TfLiteType input_type = input_tensor->type; + const TfLiteTensor *output_tensor = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output_tensor != nullptr); + TfLiteType output_type = output_tensor->type; + + // Check activation and input type + TF_LITE_ENSURE_EQ(context, params->activation, kTfLiteActNone); + TF_LITE_ENSURE(context, + input_type == kTfLiteFloat32 || input_type == kTfLiteUInt8 || + input_type == kTfLiteInt8 || input_type == kTfLiteInt16 || + input_type == kTfLiteInt32 || input_type == kTfLiteInt64); + + // Output type must match input type + TF_LITE_ENSURE_EQ(context, output_type, input_type); + + // This implementation does not support large number of input tensors + const int num_inputs = NumInputs(node); + TF_LITE_ENSURE(context, num_inputs <= kMaxInputNum); + + // Shapes with dimensions >4 are not yet supported with static allocation. + for (int i = 0; i < num_inputs; ++i) { + const TfLiteTensor *input = GetInput(context, node, i); + TF_LITE_ENSURE(context, input != nullptr); + int num_dimensions = NumDimensions(input); + + if (num_dimensions > 4) { + TF_LITE_KERNEL_LOG( + context, + "Op Concatenation does not currently support num dimensions >4 " + "Tensor has %d dimensions.", + num_dimensions); + return kTfLiteError; + } + } + + // Calculate OpData. + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + switch (output_type) { // Already know in/outtypes are same. + case kTfLiteFloat32: + case kTfLiteInt16: + case kTfLiteInt32: + case kTfLiteInt64: { + data->params.axis = CalculatePositiveAxis(params->axis, output); + data->params.inputs_count = node->inputs->size; + break; + } + case kTfLiteUInt8: + case kTfLiteInt8: { + data->params.axis = CalculatePositiveAxis(params->axis, output); + data->params.inputs_count = node->inputs->size; + + float *input_scales = + reinterpret_cast(context->AllocatePersistentBuffer( + context, node->inputs->size * sizeof(float))); + + int32_t *input_zero_points = + reinterpret_cast(context->AllocatePersistentBuffer( + context, node->inputs->size * sizeof(int32_t))); + + // Allocate persistent scale and zeropoint buffers. + // Store input scale and zero point values in OpParams: + for (int i = 0; i < node->inputs->size; ++i) { + const TfLiteTensor *t = GetInput(context, node, i); + TF_LITE_ENSURE(context, t != nullptr); + input_scales[i] = t->params.scale; + input_zero_points[i] = t->params.zero_point; + } + + data->params.input_scale = input_scales; + data->params.input_zeropoint = input_zero_points; + data->params.output_zeropoint = output->params.zero_point; + data->params.output_scale = output->params.scale; + break; + } + default: + TF_LITE_KERNEL_LOG( + context, "Op Concatenation does not currently support Type '%s'.", + TfLiteTypeGetName(output_type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *output_tensor = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output_tensor != nullptr); + TfLiteType output_type = output_tensor->type; + + switch (output_type) { // Already know in/outtypes are same. + case kTfLiteFloat32: + EvalUnquantized(context, node); + break; + case kTfLiteInt32: + EvalUnquantized(context, node); + break; + case kTfLiteUInt8: + EvalQuantizedUInt8(context, node); + break; + case kTfLiteInt8: + EvalUnquantized(context, node); + break; + case kTfLiteInt64: + EvalUnquantized(context, node); + break; + case kTfLiteInt16: + EvalUnquantized(context, node); + break; + + default: + TF_LITE_KERNEL_LOG( + context, "Op Concatenation does not currently support Type '%s'.", + TfLiteTypeGetName(output_type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace concatenation + +TfLiteRegistration Register_CONCATENATION() +{ + return { /*init=*/concatenation::Init, + /*free=*/nullptr, + /*prepare=*/concatenation::Prepare, + /*invoke=*/concatenation::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation_test.cc new file mode 100644 index 00000000..545a2214 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/concatenation_test.cc @@ -0,0 +1,266 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestConcatenateTwoInputs(int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + int axis, int *output_dims_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int input_size = 2; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims) }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + TfLiteConcatenationParams builtin_data = { + .axis = axis, + .activation = kTfLiteActNone // Only activation supported in this impl + }; + + const TfLiteRegistration registration = + tflite::ops::micro::Register_CONCATENATION(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + const int output_dims_count = ElementCount(*output_dims); + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +template +void TestConcatenateQuantizedTwoInputs( + int *input1_dims_data, const T *input1_data, int *input2_dims_data, + const T *input2_data, const float input_scale, const int input_zero_point, + int axis, int *output_dims_data, const T *expected_output_data, + const float output_scale, const int output_zero_point, T *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int input_size = 2; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input1_data, input1_dims, input_scale, + input_zero_point), + CreateQuantizedTensor(input2_data, input2_dims, input_scale, + input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + TfLiteConcatenationParams builtin_data = { + .axis = axis, + .activation = kTfLiteActNone // Only activation supported in this impl + }; + + const TfLiteRegistration registration = + tflite::ops::micro::Register_CONCATENATION(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + const int output_dims_count = ElementCount(*output_dims); + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TwoInputsAllAxesCombinations) +{ + // Concatenate the same two input tensors along all possible axes. + + int input_shape[] = { 2, 2, 3 }; + const float input1_value[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + const float input2_value[] = { 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f }; + + // expected output when concatenating on axis 0 + int output_shape_axis0[] = { 2, 4, 3 }; + const float output_value_axis0[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f }; + + // expected output when concatenating on axis 1 + int output_shape_axis1[] = { 2, 2, 6 }; + const float output_value_axis1[] = { 1.0f, 2.0f, 3.0f, 7.0f, 8.0f, 9.0f, + 4.0f, 5.0f, 6.0f, 10.0f, 11.0f, 12.0f }; + + float output_data[12]; + + // Axis = 0 + tflite::testing::TestConcatenateTwoInputs( + input_shape, input1_value, input_shape, input2_value, /* axis */ 0, + output_shape_axis0, output_value_axis0, output_data); + + // Axis = -2 (equivalent to axis = 0) + tflite::testing::TestConcatenateTwoInputs( + input_shape, input1_value, input_shape, input2_value, /* axis */ -2, + output_shape_axis0, output_value_axis0, output_data); + + // Axis = 1 + tflite::testing::TestConcatenateTwoInputs( + input_shape, input1_value, input_shape, input2_value, /* axis */ 1, + output_shape_axis1, output_value_axis1, output_data); + + // Axis = -1 (equivalent to axis = 1) + tflite::testing::TestConcatenateTwoInputs( + input_shape, input1_value, input_shape, input2_value, /* axis */ -1, + output_shape_axis1, output_value_axis1, output_data); +} + +TF_LITE_MICRO_TEST(TwoInputsQuantizedUint8) +{ + const int axis = 2; + int input_shape[] = { 3, 2, 1, 2 }; + int output_shape[] = { 3, 2, 1, 4 }; + + const float input_scale = 0.1f; + const int input_zero_point = 127; + const float output_scale = 0.1f; + const int output_zero_point = 127; + + const uint8_t input1_values[] = { 137, 157, 167, 197 }; + + const uint8_t input2_values[] = { 138, 158, 168, 198 }; + + const uint8_t output_value[] = { + 137, + 157, + 138, + 158, + 167, + 197, + 168, + 198, + }; + + uint8_t output_data[8]; + tflite::testing::TestConcatenateQuantizedTwoInputs( + input_shape, input1_values, input_shape, input2_values, input_scale, + input_zero_point, axis, output_shape, output_value, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(TwoInputsQuantizedInt8) +{ + const int axis = 2; + int input_shape[] = { 3, 2, 1, 2 }; + int output_shape[] = { 3, 2, 1, 4 }; + + const float input_scale = 0.1f; + const int input_zero_point = 0; + const float output_scale = 0.1f; + const int output_zero_point = 0; + + const int8_t input1_values[] = { 1, 2, 3, 4 }; + + const int8_t input2_values[] = { 5, 6, 7, 8 }; + + const int8_t output_value[] = { 1, 2, 5, 6, 3, 4, 7, 8 }; + + int8_t output_data[8]; + tflite::testing::TestConcatenateQuantizedTwoInputs( + input_shape, input1_values, input_shape, input2_values, input_scale, + input_zero_point, axis, output_shape, output_value, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(TwoInputsQuantizedInt16) +{ + const int axis = 2; + int input_shape[] = { 3, 2, 1, 2 }; + int output_shape[] = { 3, 2, 1, 4 }; + + const float input_scale = 0.1f; + const int input_zero_point = 0; + const float output_scale = 0.1f; + const int output_zero_point = 0; + + const int16_t input1_values[] = { 1, 2, 3, 4 }; + + const int16_t input2_values[] = { 5, 6, 7, 8 }; + + const int16_t output_value[] = { 1, 2, 5, 6, 3, 4, 7, 8 }; + + int16_t output_data[8]; + tflite::testing::TestConcatenateQuantizedTwoInputs( + input_shape, input1_values, input_shape, input2_values, input_scale, + input_zero_point, axis, output_shape, output_value, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(ThreeDimensionalTwoInputsDifferentShapes) +{ + const int axis = 1; + + int input1_shape[] = { 3, 2, 1, 2 }; + int input2_shape[] = { 3, 2, 3, 2 }; + int output_shape[] = { 3, 2, 4, 2 }; + + const float input1_values[] = { 1.0f, 3.0f, 4.0f, 7.0f }; + const float input2_values[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, + 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f }; + const float output_values[] = { 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 4.0f, 7.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f }; + + float output_data[16]; + tflite::testing::TestConcatenateTwoInputs( + input1_shape, input1_values, input2_shape, input2_values, axis, + output_shape, output_values, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.cc new file mode 100644 index 00000000..447e4e74 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.cc @@ -0,0 +1,124 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/conv.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/conv.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/conv.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpDataConv)); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kConvInputTensor); + const TfLiteEvalTensor *filter = + tflite::micro::GetEvalInput(context, node, kConvWeightsTensor); + const TfLiteEvalTensor *bias = + (NumInputs(node) == 3) ? tflite::micro::GetEvalInput(context, node, kConvBiasTensor) : nullptr; + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kConvOutputTensor); + + TFLITE_DCHECK(node->builtin_data != nullptr); + const auto ¶ms = + *(reinterpret_cast(node->builtin_data)); + TFLITE_DCHECK(node->user_data != nullptr); + const auto &data = *(static_cast(node->user_data)); + + TF_LITE_ENSURE_EQ(context, input->type, output->type); + TF_LITE_ENSURE_MSG( + context, + input->type == filter->type || + (input->type == kTfLiteInt16 && filter->type == kTfLiteInt8), + "Hybrid models are not supported on TFLite Micro."); + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: { + tflite::reference_ops::Conv( + ConvParamsFloat(params, data), tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), + tflite::micro::GetTensorShape(nullptr), nullptr); + break; + } + case kTfLiteInt16: { + reference_integer_ops::ConvPerChannel( + ConvParamsQuantized(params, data), data.per_channel_output_multiplier, + data.per_channel_output_shift, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + } + case kTfLiteInt8: { + reference_integer_ops::ConvPerChannel( + ConvParamsQuantized(params, data), data.per_channel_output_multiplier, + data.per_channel_output_shift, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + } + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_CONV_2D() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/ConvPrepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.h new file mode 100644 index 00000000..d667bbb4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv.h @@ -0,0 +1,92 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_CONV_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_CONV_H_ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +struct OpDataConv { + TfLitePaddingValues padding; + + // Cached tensor zero point values for quantized operations. + int32_t input_zero_point; + int32_t filter_zero_point; + int32_t output_zero_point; + + // The scaling factor from input to output (aka the 'real multiplier') can + // be represented as a fixed point multiplier plus a left shift. + int32_t output_multiplier; + int output_shift; + + // Per channel output multiplier and shift. + int32_t *per_channel_output_multiplier; + int32_t *per_channel_output_shift; + + // The range of the fused activation layer. For example for kNone and + // uint8_t these would be 0 and 255. + int32_t output_activation_min; + int32_t output_activation_max; +}; + +extern const int kConvInputTensor; +extern const int kConvWeightsTensor; +extern const int kConvBiasTensor; +extern const int kConvOutputTensor; +extern const int kConvQuantizedDimension; + +// Returns a ConvParams struct with all the parameters needed for a +// float computation. +ConvParams ConvParamsFloat(const TfLiteConvParams ¶ms, + const OpDataConv &data); + +// Returns a ConvParams struct with all the parameters needed for a +// quantized computation. +ConvParams ConvParamsQuantized(const TfLiteConvParams ¶ms, + const OpDataConv &data); + +TfLiteStatus CalculateOpDataConv(TfLiteContext *context, TfLiteNode *node, + const TfLiteConvParams ¶ms, int width, + int height, int filter_width, + int filter_height, int out_width, + int out_height, const TfLiteType data_type, + OpDataConv *data); + +TfLiteStatus ConvPrepare(TfLiteContext *context, TfLiteNode *node); + +// This is the most generic TfLiteRegistration. The actual supported types may +// still be target dependent. The only requirement is that every implementation +// (reference or optimized) must define this function. +TfLiteRegistration Register_CONV_2D(); + +#if defined(XTENSA) +// Returns a TfLiteRegistration struct for kernel variant that only supports +// int8 inputs and outputs. +TfLiteRegistration Register_CONV_2D_INT8REF(); +#else +inline TfLiteRegistration Register_CONV_2D_INT8REF() +{ + return Register_CONV_2D(); +} +#endif + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_common.cc new file mode 100644 index 00000000..e53ae45e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_common.cc @@ -0,0 +1,185 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/conv.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/conv.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/conv.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { + +const int kConvInputTensor = 0; +const int kConvWeightsTensor = 1; +const int kConvBiasTensor = 2; +const int kConvOutputTensor = 0; + +// Conv is quantized along dimension 0: +// https://www.tensorflow.org/lite/performance/quantization_spec +const int kConvQuantizedDimension = 0; + +// Returns a ConvParams struct with all the parameters needed for a +// float computation. +ConvParams ConvParamsFloat(const TfLiteConvParams ¶ms, + const OpDataConv &data) +{ + ConvParams op_params; + CalculateActivationRange(params.activation, &op_params.float_activation_min, + &op_params.float_activation_max); + op_params.padding_type = tflite::micro::RuntimePaddingType(params.padding); + op_params.padding_values.width = data.padding.width; + op_params.padding_values.height = data.padding.height; + op_params.stride_width = params.stride_width; + op_params.stride_height = params.stride_height; + op_params.dilation_width_factor = params.dilation_width_factor; + op_params.dilation_height_factor = params.dilation_height_factor; + return op_params; +} + +// Returns a ConvParams struct with all the parameters needed for a +// quantized computation. +ConvParams ConvParamsQuantized(const TfLiteConvParams ¶ms, + const OpDataConv &data) +{ + ConvParams op_params; + op_params.input_offset = -data.input_zero_point; + op_params.weights_offset = -data.filter_zero_point; + op_params.output_offset = data.output_zero_point; + op_params.output_multiplier = data.output_multiplier; + op_params.output_shift = -data.output_shift; + op_params.padding_type = tflite::micro::RuntimePaddingType(params.padding); + op_params.padding_values.height = data.padding.height; + op_params.padding_values.width = data.padding.width; + op_params.stride_height = params.stride_height; + op_params.stride_width = params.stride_width; + op_params.dilation_height_factor = params.dilation_height_factor; + op_params.dilation_width_factor = params.dilation_width_factor; + op_params.quantized_activation_min = data.output_activation_min; + op_params.quantized_activation_max = data.output_activation_max; + return op_params; +} + +TfLiteStatus CalculateOpDataConv(TfLiteContext *context, TfLiteNode *node, + const TfLiteConvParams ¶ms, int width, + int height, int filter_width, + int filter_height, int out_width, + int out_height, const TfLiteType data_type, + OpDataConv *data) +{ + bool has_bias = node->inputs->size == 3; + // Check number of inputs/outputs + TF_LITE_ENSURE(context, has_bias || node->inputs->size == 2); + TF_LITE_ENSURE_EQ(context, node->outputs->size, 1); + + // Matching GetWindowedOutputSize in TensorFlow. + auto padding = params.padding; + data->padding = ComputePaddingHeightWidth( + params.stride_height, params.stride_width, params.dilation_height_factor, + params.dilation_width_factor, height, width, filter_height, filter_width, + padding, &out_height, &out_width); + + const TfLiteTensor *input = GetInput(context, node, kConvInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = GetInput(context, node, kConvWeightsTensor); + TF_LITE_ENSURE(context, filter != nullptr); + const TfLiteTensor *bias = + GetOptionalInputTensor(context, node, kConvBiasTensor); + TfLiteTensor *output = GetOutput(context, node, kConvOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + // Note that quantized inference requires that all tensors have their + // parameters set. This is usually done during quantized training. + if (data_type != kTfLiteFloat32) { + int output_channels = filter->dims->data[kConvQuantizedDimension]; + + TF_LITE_ENSURE_STATUS(tflite::PopulateConvolutionQuantizationParams( + context, input, filter, bias, output, params.activation, + &data->output_multiplier, &data->output_shift, + &data->output_activation_min, &data->output_activation_max, + data->per_channel_output_multiplier, data->per_channel_output_shift, + output_channels)); + } + + data->input_zero_point = input->params.zero_point; + data->filter_zero_point = filter->params.zero_point; + data->output_zero_point = output->params.zero_point; + + return kTfLiteOk; +} + +TfLiteStatus ConvPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + OpDataConv *data = static_cast(node->user_data); + const auto ¶ms = + *(static_cast(node->builtin_data)); + + TfLiteTensor *output = GetOutput(context, node, kConvOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + const TfLiteTensor *input = GetInput(context, node, kConvInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = GetInput(context, node, kConvWeightsTensor); + TF_LITE_ENSURE(context, filter != nullptr); + + const int input_width = input->dims->data[2]; + const int input_height = input->dims->data[1]; + const int filter_width = filter->dims->data[2]; + const int filter_height = filter->dims->data[1]; + const int output_width = output->dims->data[2]; + const int output_height = output->dims->data[1]; + + // Dynamically allocate per-channel quantization parameters. + const int num_channels = filter->dims->data[kConvQuantizedDimension]; + data->per_channel_output_multiplier = + static_cast(context->AllocatePersistentBuffer( + context, num_channels * sizeof(int32_t))); + data->per_channel_output_shift = + static_cast(context->AllocatePersistentBuffer( + context, num_channels * sizeof(int32_t))); + + // All per-channel quantized tensors need valid zero point and scale arrays. + if (input->type == kTfLiteInt8 || input->type == kTfLiteInt16) { + TF_LITE_ENSURE_EQ(context, filter->quantization.type, + kTfLiteAffineQuantization); + + const auto *affine_quantization = + static_cast(filter->quantization.params); + TFLITE_DCHECK(affine_quantization != nullptr); + TFLITE_DCHECK(affine_quantization->scale != nullptr); + TFLITE_DCHECK(affine_quantization->zero_point != nullptr); + + TF_LITE_ENSURE(context, + affine_quantization->scale->size == 1 || + affine_quantization->scale->size == + filter->dims->data[kConvQuantizedDimension]); + TF_LITE_ENSURE_EQ(context, affine_quantization->scale->size, + affine_quantization->zero_point->size); + } + + TF_LITE_ENSURE_STATUS(CalculateOpDataConv( + context, node, params, input_width, input_height, filter_width, + filter_height, output_width, output_height, input->type, data)); + + return kTfLiteOk; +} +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.cc new file mode 100644 index 00000000..22db3c07 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.cc @@ -0,0 +1,820 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/conv_test.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// Common inputs and outputs. +constexpr int kInputElements = 16; +static int kInputShape[] = { 4, 2, 2, 4, 1 }; +static const float kInputData[kInputElements] = { 1, 1, 1, 1, 2, 2, 2, 2, + 1, 2, 3, 4, 1, 2, 3, 4 }; + +constexpr int kFilterElements = 12; +static int kFilterShape[] = { 4, 3, 2, 2, 1 }; +static const float kFilterData[kFilterElements] = { 1, 2, 3, 4, -1, 1, + -1, 1, -1, -1, 1, 1 }; + +constexpr int kBiasElements = 3; +static int kBiasShape[] = { 1, 3 }; +static const float kBiasData[kBiasElements] = { 1, 2, 3 }; + +constexpr int kOutputElements = 12; +static int kOutputShape[] = { 4, 2, 1, 2, 3 }; +static const float kGoldenData[kOutputElements] = { 18, 2, 5, 18, 2, 5, + 17, 4, 3, 37, 4, 3 }; + +static TfLiteConvParams common_conv_params = { + kTfLitePaddingValid, // padding + 2, // stride_width + 2, // stride_height + kTfLiteActNone, // activation + 1, // dilation_width_factor + 1, // dilation_height_factor +}; + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +#if !defined(XTENSA) // TODO(b/170321206): xtensa kernels are less general than \ + // reference kernels and we ifdef out test cases that are \ + // currently known to fail. +TF_LITE_MICRO_TEST(SimpleTestFloat) +{ + float output_data[tflite::testing::kOutputElements]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvFloat( + tflite::testing::kInputShape, tflite::testing::kInputData, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + tflite::testing::kBiasShape, tflite::testing::kBiasData, + tflite::testing::kOutputShape, tflite::testing::kGoldenData, + &tflite::testing::common_conv_params, tflite::Register_CONV_2D(), + output_data)); +} + +TF_LITE_MICRO_TEST(InputAndFilterSameWidthHeight) +{ + const int output_dims_count = 2; + float output_data[output_dims_count]; + + int kFilterShape[] = { 4, 1, 2, 4, 1 }; + const float filter_values[] = { 1, 2, 3, 4, -1, -1, 1, 1 }; + int kBiasShape[] = { 1, 1 }; + const float bias_values[] = { 0 }; + int kOutputShape[] = { 4, 2, 1, 1, 1 }; + const float expected_output[] = { 10, 34 }; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvFloat( + tflite::testing::kInputShape, tflite::testing::kInputData, + kFilterShape, filter_values, kBiasShape, bias_values, kOutputShape, + expected_output, &tflite::testing::common_conv_params, + tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(InputOutputDifferentTypeIsError) +{ + using tflite::testing::CreateQuantizedTensor; + using tflite::testing::CreateTensor; + using tflite::testing::IntArrayFromInts; + + TfLiteIntArray *input_dims = IntArrayFromInts(tflite::testing::kInputShape); + TfLiteIntArray *filter_dims = IntArrayFromInts(tflite::testing::kFilterShape); + TfLiteIntArray *bias_dims = IntArrayFromInts(tflite::testing::kBiasShape); + TfLiteIntArray *output_dims = IntArrayFromInts(tflite::testing::kOutputShape); + const int output_dims_count = tflite::ElementCount(*output_dims); + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + + int8_t output_data[tflite::testing::kOutputElements]; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(tflite::testing::kInputData, input_dims), + CreateTensor(tflite::testing::kFilterData, filter_dims), + CreateTensor(tflite::testing::kBiasData, bias_dims), + CreateQuantizedTensor(output_data, output_dims, /*scale=*/0.0f, + /*zero_point=*/0), + }; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, + tflite::testing::InvokeConv(tensors, tensors_size, output_dims_count, + &tflite::testing::common_conv_params, + tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(HybridModeIsError) +{ + using tflite::testing::CreateQuantizedTensor; + using tflite::testing::CreateTensor; + using tflite::testing::IntArrayFromInts; + + TfLiteIntArray *input_dims = IntArrayFromInts(tflite::testing::kInputShape); + TfLiteIntArray *filter_dims = IntArrayFromInts(tflite::testing::kFilterShape); + TfLiteIntArray *bias_dims = IntArrayFromInts(tflite::testing::kBiasShape); + TfLiteIntArray *output_dims = IntArrayFromInts(tflite::testing::kOutputShape); + const int output_dims_count = tflite::ElementCount(*output_dims); + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + + int8_t filter_data[tflite::testing::kFilterElements] = {}; + float output_data[tflite::testing::kOutputElements]; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(tflite::testing::kInputData, input_dims), + CreateQuantizedTensor(filter_data, filter_dims, + /*scale=*/0.0f, + /*zero_point=*/0), + CreateTensor(tflite::testing::kBiasData, bias_dims), + CreateTensor(output_data, output_dims), + }; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, + tflite::testing::InvokeConv(tensors, tensors_size, output_dims_count, + &tflite::testing::common_conv_params, + tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantizedPerChannel) +{ + const int output_dims_count = 12; + int8_t output_data[output_dims_count]; + + const float input_scale = 0.5f; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int8_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + int32_t bias_quantized[tflite::testing::kBiasElements]; + int8_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvQuantizedPerChannel( + tflite::testing::kInputShape, tflite::testing::kInputData, + input_quantized, input_scale, input_zero_point, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + filter_quantized, tflite::testing::kBiasShape, + tflite::testing::kBiasData, bias_quantized, scales, zero_points, + tflite::testing::kOutputShape, tflite::testing::kGoldenData, + golden_quantized, output_scale, output_zero_point, + &tflite::testing::common_conv_params, tflite::Register_CONV_2D(), + output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantized16x8PerChannel) +{ + const int output_dims_count = 12; + int16_t output_data[output_dims_count]; + + const float input_scale = 0.5f; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int16_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + std::int64_t bias_quantized[tflite::testing::kBiasElements]; + int16_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvQuantizedPerChannel( + tflite::testing::kInputShape, tflite::testing::kInputData, + input_quantized, input_scale, input_zero_point, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + filter_quantized, tflite::testing::kBiasShape, + tflite::testing::kBiasData, bias_quantized, scales, zero_points, + tflite::testing::kOutputShape, tflite::testing::kGoldenData, + golden_quantized, output_scale, output_zero_point, + &tflite::testing::common_conv_params, tflite::Register_CONV_2D(), + output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestDilatedQuantizedPerChannel) +{ + const int output_dims_count = 24; + int8_t output_data[output_dims_count]; + + const float input_scale = 0.5f; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + const int input_elements = 48; + int input_shape[] = { 4, 2, 4, 6, 1 }; + const float input_data[] = { + // b = 0 + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, + // b = 1 + 1, 2, 3, 4, 5, 6, 2, 6, 2, 4, 4, 2, 3, 2, 6, 5, 1, 4, 1, 2, 1, 4, 6, 3 + }; + const int output_elements = 24; + int output_shape[] = { 4, 2, 2, 2, 3 }; + const float golden_data[] = { 25, 2, 7, 25, 2, 7, 10, 2, -3, 10, 2, -3, + 39, 7, 6, 50, 3, 4, 14, 4, -5, 15, 0, -7 }; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + int32_t bias_quantized[tflite::testing::kBiasElements]; + int8_t golden_quantized[output_elements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TfLiteConvParams conv_params{ tflite::testing::common_conv_params }; + conv_params.dilation_width_factor = 3; + conv_params.dilation_height_factor = 2; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvQuantizedPerChannel( + input_shape, input_data, input_quantized, input_scale, + input_zero_point, tflite::testing::kFilterShape, + tflite::testing::kFilterData, filter_quantized, + tflite::testing::kBiasShape, tflite::testing::kBiasData, + bias_quantized, scales, zero_points, output_shape, golden_data, + golden_quantized, output_scale, output_zero_point, &conv_params, + tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantizedPerChannelRelu6) +{ + const int output_dims_count = 12; + int8_t output_data[output_dims_count]; + + const float bias_values[] = { 1, 2, -3 }; + const float golden_data[] = { 6, 2, 0, 6, 2, 0, 6, 4, 0, 6, 4, 0 }; + + const float input_scale = 0.023529f; + const float output_scale = 0.023529f; + const int input_zero_point = -128; + const int output_zero_point = -128; + + int8_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + int32_t bias_quantized[tflite::testing::kBiasElements]; + int8_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvQuantizedPerChannel( + tflite::testing::kInputShape, tflite::testing::kInputData, + input_quantized, input_scale, input_zero_point, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + filter_quantized, tflite::testing::kBiasShape, bias_values, + bias_quantized, scales, zero_points, tflite::testing::kOutputShape, + golden_data, golden_quantized, output_scale, output_zero_point, + &tflite::testing::common_conv_params, tflite::Register_CONV_2D(), + output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantized16x8PerChannelRelu6) +{ + const int output_dims_count = 12; + int16_t output_data[output_dims_count]; + + const float bias_values[] = { 1, 2, -3 }; + const float golden_data[] = { 6, 2, 0, 6, 2, 0, 6, 4, 0, 6, 4, 0 }; + + const float input_scale = 0.023529f; + const float output_scale = 0.023529f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int16_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + std::int64_t bias_quantized[tflite::testing::kBiasElements]; + int16_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TfLiteConvParams conv_params{ tflite::testing::common_conv_params }; + conv_params.activation = kTfLiteActRelu6; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestConvQuantizedPerChannel( + tflite::testing::kInputShape, tflite::testing::kInputData, + input_quantized, input_scale, input_zero_point, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + filter_quantized, tflite::testing::kBiasShape, bias_values, + bias_quantized, scales, zero_points, tflite::testing::kOutputShape, + golden_data, golden_quantized, output_scale, output_zero_point, + &conv_params, tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(Kernel1x1QuantizedPerChannel) +{ + // conv params: + // padding, stride_, activation, dilation_ + TfLiteConvParams conv_params = { kTfLitePaddingValid, 1, 1, + kTfLiteActNone, 1, 1 }; + + int input_shape[] = { 4, 1, 2, 2, 4 }; // [len,N,H,W,C] + constexpr int input_elements = + 1 * 2 * 2 * + 4; // input_shape[1] * input_shape[2] * input_shape[3] * input_shape[4]; + constexpr float input_data[input_elements] = { 1, 1, 1, 1, 2, 2, 2, 2, + 1, 2, 3, 4, 1, 2, 3, 4 }; + + int filter_shape[] = { 4, 3, 1, 1, 4 }; + constexpr int filter_elements = + 3 * 1 * 1 * 4; // filter_shape[1] * filter_shape[2] * + // filter_shape[3] * filter_shape[4]; + const float filter_data[filter_elements] = { 1, 2, 3, 4, -1, 1, + -1, 1, -1, -1, 1, 1 }; + + constexpr int bias_elements = 3; // filter_shape[1]; + int bias_shape[] = { 1, bias_elements }; + constexpr float bias_data[bias_elements] = { 1, 2, 3 }; + + int output_shape[] = { 4, 1, 2, 2, bias_elements }; + constexpr int output_elements = 4 * 3; + int8_t output_data[output_elements]; + + const float golden_data[output_elements] = { 11, 2, 3, 21, 2, 3, + 31, 4, 7, 31, 4, 7 }; + + const float input_scale = 0.5f; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + int zero_points[bias_elements + 1]; + float scales[bias_elements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::testing::TestConvQuantizedPerChannel( + input_shape, input_data, input_quantized, input_scale, + input_zero_point, filter_shape, filter_data, + filter_quantized, bias_shape, bias_data, bias_quantized, + scales, zero_points, output_shape, golden_data, + golden_quantized, output_scale, output_zero_point, + &conv_params, tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(Kernel1x1QuantizedPerChannelRelu6) +{ + // conv params: + // padding, stride_, activation, dilation_ + TfLiteConvParams conv_params = { kTfLitePaddingValid, 1, 1, + kTfLiteActRelu6, 1, 1 }; + + int input_shape[] = { 4, 1, 2, 2, 4 }; // [len,N,H,W,C] + constexpr int input_elements = + 1 * 2 * 2 * + 4; // input_shape[1] * input_shape[2] * input_shape[3] * input_shape[4]; + constexpr float input_data[input_elements] = { 1, 1, 1, 1, 2, 2, 2, 2, + 1, 2, 3, 4, 1, 2, 3, 4 }; + + int filter_shape[] = { 4, 3, 1, 1, 4 }; + constexpr int filter_elements = + 3 * 1 * 1 * 4; // filter_shape[1] * filter_shape[2] * + // filter_shape[3] * filter_shape[4]; + const float filter_data[filter_elements] = { 1, 2, 3, 4, -1, 1, + -1, 1, -1, -1, 1, 1 }; + + constexpr int bias_elements = 3; // filter_shape[1]; + int bias_shape[] = { 1, bias_elements }; + constexpr float bias_data[bias_elements] = { 1, 2, -3 }; + + int output_shape[] = { 4, 1, 2, 2, bias_elements }; + constexpr int output_elements = 4 * 3; + int8_t output_data[output_elements]; + + const float golden_data[output_elements] = { 6, 2, 0, 6, 2, 0, + 6, 4, 1, 6, 4, 1 }; + + const float input_scale = 0.023529f; + const float output_scale = 0.023529f; + const int input_zero_point = -128; + const int output_zero_point = -128; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + int zero_points[bias_elements + 1]; + float scales[bias_elements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::testing::TestConvQuantizedPerChannel( + input_shape, input_data, input_quantized, input_scale, + input_zero_point, filter_shape, filter_data, + filter_quantized, bias_shape, bias_data, bias_quantized, + scales, zero_points, output_shape, golden_data, + golden_quantized, output_scale, output_zero_point, + &conv_params, tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(Kernel1x1Quantized16x8PerChannelRelu6) +{ + // conv params: + // padding, stride_, activation, dilation_ + TfLiteConvParams conv_params = { kTfLitePaddingValid, 1, 1, + kTfLiteActRelu6, 1, 1 }; + + int input_shape[] = { 4, 1, 2, 2, 4 }; // [len,N,H,W,C] + const int input_elements = 1 * 2 * 2 * 4; + const float input_data[input_elements] = { 1, 1, 1, 1, 2, 2, 2, 2, + 1, 2, 3, 4, 1, 2, 3, 4 }; + + int filter_shape[] = { 4, 3, 1, 1, 4 }; + const int filter_elements = 3 * 1 * 1 * 4; + const float filter_data[filter_elements] = { 1, 2, 3, 4, -1, 1, + -1, 1, -1, -1, 1, 1 }; + + const int bias_elements = 3; + int bias_shape[] = { 1, bias_elements }; + const float bias_data[bias_elements] = { 1, 2, -3 }; + + int output_shape[] = { 4, 1, 2, 2, bias_elements }; + const int output_elements = 4 * 3; + int16_t output_data[output_elements]; + + const float golden_data[output_elements] = { 6, 2, 0, 6, 2, 0, + 6, 4, 1, 6, 4, 1 }; + + const float input_scale = 0.023529f; + const float output_scale = 0.023529f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int16_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + std::int64_t bias_quantized[bias_elements]; + int16_t golden_quantized[output_elements]; + int zero_points[bias_elements + 1]; + float scales[bias_elements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::testing::TestConvQuantizedPerChannel( + input_shape, input_data, input_quantized, input_scale, + input_zero_point, filter_shape, filter_data, + filter_quantized, bias_shape, bias_data, bias_quantized, + scales, zero_points, output_shape, golden_data, + golden_quantized, output_scale, output_zero_point, + &conv_params, tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(BroadcastPerLayerQuantizationToPerChannelShouldMatchGolden) +{ + const int output_dims_count = 12; + int8_t output_data[output_dims_count]; + + const float input_scale = 1.0f; + const float filter_scale = 1.0f; + const float output_scale = 1.0f; + + int8_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + int32_t bias_quantized[tflite::testing::kBiasElements]; + int8_t golden_quantized[tflite::testing::kOutputElements]; + + TfLiteIntArray *input_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kInputShape); + TfLiteIntArray *filter_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kFilterShape); + TfLiteIntArray *bias_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kBiasShape); + TfLiteIntArray *output_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kOutputShape); + + // Create per-layer quantized int8_t input tensor. + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + tflite::testing::kInputData, input_quantized, input_dims, input_scale, 0); + int input_zero_points[2] = { 1, 0 }; + float input_scales[2] = { 1, input_scale }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + // Create per-layer quantized int8_t filter tensor. + TfLiteTensor filter_tensor = tflite::testing::CreateQuantizedTensor( + tflite::testing::kFilterData, filter_quantized, filter_dims, filter_scale, + 0); + int filter_zero_points[2] = { 1, 0 }; + float filter_scales[2] = { 1, filter_scale }; + TfLiteAffineQuantization filter_quant = { + tflite::testing::FloatArrayFromFloats(filter_scales), + tflite::testing::IntArrayFromInts(filter_zero_points), 0 + }; + filter_tensor.quantization = { kTfLiteAffineQuantization, &filter_quant }; + + // Create per-layer quantized int32_t bias tensor. + tflite::SymmetricQuantize(tflite::testing::kBiasData, bias_quantized, + tflite::testing::kBiasElements, + input_scale * output_scale); + TfLiteTensor bias_tensor = + tflite::testing::CreateTensor(bias_quantized, bias_dims); + + int bias_zero_points[2] = { 1, 0 }; + float bias_scales[2] = { 1, input_scale * filter_scale }; + TfLiteAffineQuantization bias_quant = { + tflite::testing::FloatArrayFromFloats(bias_scales), + tflite::testing::IntArrayFromInts(bias_zero_points), 0 + }; + bias_tensor.quantization = { kTfLiteAffineQuantization, &bias_quant }; + + // Create per-layer quantized int8_t output tensor. + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_data, output_dims, output_scale, 0 /* quantized dimension */); + int output_zero_points[2] = { 1, 0 }; + float output_scales[2] = { 1, output_scale }; + TfLiteAffineQuantization output_quant = { + tflite::testing::FloatArrayFromFloats(output_scales), + tflite::testing::IntArrayFromInts(output_zero_points), 0 + }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + tflite::Quantize(tflite::testing::kGoldenData, golden_quantized, + output_dims_count, output_scale, 0); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::testing::ValidateConvGoldens( + tensors, tensors_size, golden_quantized, output_dims_count, + &tflite::testing::common_conv_params, + tflite::Register_CONV_2D(), output_data)); +} + +#endif // !defined(XTENSA) + +TF_LITE_MICRO_TEST(FilterDimsNotMatchingAffineQuantization) +{ + const int output_dims_count = 12; + int8_t output_data[output_dims_count]; + + const float input_scale = 0.5f; + const float output_scale = 1.0f; + + int8_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + int32_t bias_quantized[tflite::testing::kBiasElements]; + int8_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TfLiteIntArray *input_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kInputShape); + TfLiteIntArray *filter_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kFilterShape); + TfLiteIntArray *bias_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kBiasShape); + TfLiteIntArray *output_dims = + tflite::testing::IntArrayFromInts(tflite::testing::kOutputShape); + + int filter_zero_points[5]; + float filter_scales[5]; + TfLiteAffineQuantization filter_quant; + TfLiteAffineQuantization bias_quant; + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + tflite::testing::kInputData, input_quantized, input_dims, input_scale, 0); + TfLiteTensor filter_tensor = + tflite::testing::CreateSymmetricPerChannelQuantizedTensor( + tflite::testing::kFilterData, filter_quantized, filter_dims, + filter_scales, filter_zero_points, &filter_quant, + 0 /* quantized dimension */); + TfLiteTensor bias_tensor = + tflite::testing::CreatePerChannelQuantizedBiasTensor( + tflite::testing::kBiasData, bias_quantized, bias_dims, input_scale, + &filter_scales[1], scales, zero_points, &bias_quant, 0); + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_data, output_dims, output_scale, 0 /* quantized dimension */); + + float input_scales[] = { 1, input_scale }; + int input_zero_points[] = { 1, 128 }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + tflite::Quantize(tflite::testing::kGoldenData, golden_quantized, + output_dims_count, output_scale, 0); + + // Set filter quant to mismatched dimension. + TfLiteAffineQuantization *quant = reinterpret_cast( + filter_tensor.quantization.params); + + // Choose arbitrary incorrect scale and zero point sizes which are neither 1 + // (for broadcast case) nor the quantized dimension size. + quant->scale->size = 2; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, tflite::testing::ValidateConvGoldens( + tensors, tensors_size, golden_quantized, + output_dims_count, &tflite::testing::common_conv_params, + tflite::Register_CONV_2D(), output_data)); + + // Set scale back to correct dimension, and make zero point array too short. + quant->scale->size = tflite::testing::kFilterShape[0]; + quant->zero_point->size = 2; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, tflite::testing::ValidateConvGoldens( + tensors, tensors_size, golden_quantized, + output_dims_count, &tflite::testing::common_conv_params, + tflite::Register_CONV_2D(), output_data)); +} + +TF_LITE_MICRO_TEST(Int8Input32x1Filter32x32ShouldMatchGolden) +{ + constexpr int kSampleSize = 32; + constexpr int kNumFilters = 32; + int input_shape[] = { 4, 1, 1, 1, kSampleSize }; + int filter_shape[] = { 4, kNumFilters, 1, 1, kSampleSize }; + int bias_shape[] = { 1, kSampleSize }; + int output_shape[] = { 4, 1, 1, 1, kSampleSize }; + float filter_values[kNumFilters * kSampleSize]; + float input_values[kSampleSize]; + float bias_values[kSampleSize]; + + // Generated these outputs using the floating point reference conv kernel. + // TODO(b/149942509): Do this comparison automatically on random inputs. + float expected_output[kSampleSize] = { + 5168.000000, 3377.000000, 306.000000, -4045.000000, -4556.000000, + -1227.000000, 822.000000, 1591.000000, 5176.000000, 3385.000000, + 314.000000, -4037.000000, -4548.000000, -1219.000000, 830.000000, + 1599.000000, 5184.000000, 3393.000000, 322.000000, -4029.000000, + -4540.000000, -1211.000000, 838.000000, 1607.000000, 5192.000000, + 3401.000000, 330.000000, -4021.000000, -4532.000000, -1203.000000, + 846.000000, 1615.000000 + }; + + for (int i = 0; i < kSampleSize; i++) { + bias_values[i] = i; + // Generate inputs from -16 to 15. + input_values[i] = i - 16; + } + + // Generate samples of varying values between -128 and 127. + for (int i = 0; i < kNumFilters * kSampleSize; i++) { + filter_values[i] = (i * 25) % 256 - 128; + } + + TfLiteConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_height_factor = 1; + conv_params.dilation_width_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + conv_params.padding = kTfLitePaddingValid; + + TfLiteIntArray *input_dims = tflite::testing::IntArrayFromInts(input_shape); + TfLiteIntArray *filter_dims = tflite::testing::IntArrayFromInts(filter_shape); + TfLiteIntArray *bias_dims = tflite::testing::IntArrayFromInts(bias_shape); + TfLiteIntArray *output_dims = tflite::testing::IntArrayFromInts(output_shape); + const int output_dims_count = tflite::ElementCount(*output_dims); + + // Quantization Parameters. All scales except output are 1.0, and all zero + // points are 0. This direct-maps the values to floating point and makes it + // easy to reson about them. + int input_zero_point = 0; + float input_scale = 1.0f; + int filter_zero_point = 0; + float filter_scale = 1.0f; + int output_zero_point = 0; + // Output scale of 50 is needed to accomodate a float range of [-6400, 6350] + float output_scale = 50.0f; + + // Create per-tensor quantized int8_t input tensor. + int8_t input_quantized[kSampleSize]; + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + input_values, input_quantized, input_dims, input_scale, input_zero_point); + // Set zero point and scale arrays with a single element for each. + int input_zero_points[] = { 1, input_zero_point }; + float input_scales[] = { 1, input_scale }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + // Create per-tensor quantized int8_t filter tensor. + int8_t filter_quantized[kNumFilters * kSampleSize]; + TfLiteTensor filter_tensor = tflite::testing::CreateQuantizedTensor( + filter_values, filter_quantized, filter_dims, filter_scale, + filter_zero_point); + // Set zero point and scale arrays with a single element for each. + int filter_zero_points[] = { 1, filter_zero_point }; + float filter_scales[] = { 1, filter_scale }; + TfLiteAffineQuantization filter_quant = { + tflite::testing::FloatArrayFromFloats(filter_scales), + tflite::testing::IntArrayFromInts(filter_zero_points), 0 + }; + filter_tensor.quantization = { kTfLiteAffineQuantization, &filter_quant }; + + // Create per-tensor quantized int32_t bias tensor. + int32_t bias_quantized[kSampleSize]; + tflite::SymmetricQuantize(bias_values, bias_quantized, kSampleSize, + input_scale * output_scale); + TfLiteTensor bias_tensor = + tflite::testing::CreateTensor(bias_quantized, bias_dims); + + // There is a single zero point of 0, and a single scale of + // input_scale * filter_scale. + int bias_zero_points[] = { 1, 0 }; + float bias_scales[] = { 1, input_scale * filter_scale }; + TfLiteAffineQuantization bias_quant = { + tflite::testing::FloatArrayFromFloats(bias_scales), + tflite::testing::IntArrayFromInts(bias_zero_points), 0 + }; + bias_tensor.quantization = { kTfLiteAffineQuantization, &bias_quant }; + + // Create per-tensor quantized int8_t output tensor. + int8_t output_quantized[kSampleSize]; + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_quantized, output_dims, output_scale, output_zero_point); + // Set zero point and scale arrays with a single element for each. + int output_zero_points[] = { 1, output_zero_point }; + float output_scales[] = { 1, output_scale }; + TfLiteAffineQuantization output_quant = { + tflite::testing::FloatArrayFromFloats(output_scales), + tflite::testing::IntArrayFromInts(output_zero_points), 0 + }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + // The 3 inputs include the input, filter and bias tensors. + constexpr int kInputsSize = 3; + constexpr int kOutputsSize = 1; + constexpr int kTensorsSize = kInputsSize + kOutputsSize; + TfLiteTensor tensors[kTensorsSize] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + int8_t golden_quantized[kSampleSize]; + tflite::Quantize(expected_output, golden_quantized, output_dims_count, + output_scale, output_zero_point); + + // Rounding errors due to quantization should not exceed 1. + constexpr int kQuantizationTolerance = 1; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::testing::ValidateConvGoldens( + tensors, kTensorsSize, golden_quantized, output_dims_count, + &conv_params, tflite::Register_CONV_2D(), output_quantized, + kQuantizationTolerance)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.h new file mode 100644 index 00000000..4ca53a04 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test.h @@ -0,0 +1,102 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_CONV_TEST_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_CONV_TEST_H_ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/kernels/micro_ops.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +TfLiteStatus InvokeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, TfLiteConvParams *conv_params, + TfLiteRegistration registration, float *output_data); + +TfLiteStatus InvokeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, TfLiteConvParams *conv_params, + TfLiteRegistration registration, int8_t *output_data); + +TfLiteStatus InvokeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, TfLiteConvParams *conv_params, + TfLiteRegistration registration, uint8_t *output_data); + +TfLiteStatus ValidateConvGoldens(TfLiteTensor *tensors, int tensors_size, + const float *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + float *output_data, float tolerance = 1e-5); + +TfLiteStatus ValidateConvGoldens(TfLiteTensor *tensors, int tensors_size, + const int8_t *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + int8_t *output_data, float tolerance = 1e-5); + +TfLiteStatus ValidateConvGoldens(TfLiteTensor *tensors, int tensors_size, + const uint8_t *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + uint8_t *output_data, float tolerance = 1e-5); + +TfLiteStatus TestConvFloat(int *input_dims_data, const float *input_data, + int *filter_dims_data, const float *filter_data, + int *bias_dims_data, const float *bias_data, + int *output_dims_data, + const float *expected_output_data, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, float *output_data); + +TfLiteStatus TestConvQuantizedPerLayer( + int *input_dims_data, const float *input_data, uint8_t *input_quantized, + float input_scale, int *filter_dims_data, const float *filter_data, + uint8_t *filter_quantized, float filter_scale, int *bias_dims_data, + const float *bias_data, int32_t *bias_quantized, int *output_dims_data, + const float *expected_output_data, uint8_t *expected_output_quantized, + float output_scale, TfLiteConvParams *conv_params, + TfLiteRegistration registration, uint8_t *output_data); + +TfLiteStatus TestConvQuantizedPerChannel( + int *input_dims_data, const float *input_data, int8_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_data_quantized, + int *bias_dims_data, const float *bias_data, int32_t *bias_data_quantized, + float *bias_scales, int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, int8_t *expected_output_data_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + TfLiteRegistration registration, int8_t *output_data); + +TfLiteStatus TestConvQuantizedPerChannel( + int *input_dims_data, const float *input_data, int16_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_data_quantized, + int *bias_dims_data, const float *bias_data, + std::int64_t *bias_data_quantized, float *bias_scales, + int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, int16_t *expected_output_data_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + TfLiteRegistration registration, int16_t *output_data); + +} // namespace testing +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_CONV_TEST_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test_common.cc new file mode 100644 index 00000000..6fe6ee6d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/conv_test_common.cc @@ -0,0 +1,234 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/conv_test.h" + +namespace tflite { +namespace testing { + +template +TfLiteStatus InvokeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, TfLiteConvParams *conv_params, + TfLiteRegistration registration, T *output_data) +{ + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, conv_params); + + const char *init_data = reinterpret_cast(conv_params); + TfLiteStatus status = runner.InitAndPrepare(init_data); + if (status != kTfLiteOk) { + return status; + } + return runner.Invoke(); +} + +template +TfLiteStatus ValidateConvGoldens(TfLiteTensor *tensors, int tensors_size, + const T *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + T *output_data, float tolerance) +{ + TfLiteStatus status = InvokeConv(tensors, tensors_size, output_length, + conv_params, registration, output_data); + if (status != kTfLiteOk) { + return status; + } + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], + tolerance); + } + return kTfLiteOk; +} + +TfLiteStatus InvokeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, TfLiteConvParams *conv_params, + TfLiteRegistration registration, float *output_data) +{ + return InvokeConv(tensors, tensors_size, output_length, conv_params, + registration, output_data); +} + +TfLiteStatus InvokeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, TfLiteConvParams *conv_params, + TfLiteRegistration registration, int8_t *output_data) +{ + return InvokeConv(tensors, tensors_size, output_length, conv_params, + registration, output_data); +} + +TfLiteStatus ValidateConvGoldens(TfLiteTensor *tensors, int tensors_size, + const float *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + float *output_data, float tolerance) +{ + return ValidateConvGoldens(tensors, tensors_size, expected_output_data, + output_length, conv_params, registration, + output_data, tolerance); +} + +TfLiteStatus ValidateConvGoldens(TfLiteTensor *tensors, int tensors_size, + const int8_t *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + int8_t *output_data, float tolerance) +{ + return ValidateConvGoldens( + tensors, tensors_size, expected_output_data, output_length, conv_params, + registration, output_data, tolerance); +} + +TfLiteStatus TestConvFloat(int *input_dims_data, const float *input_data, + int *filter_dims_data, const float *filter_data, + int *bias_dims_data, const float *bias_data, + int *output_dims_data, + const float *expected_output_data, + TfLiteConvParams *conv_params, + TfLiteRegistration registration, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(filter_data, filter_dims), + CreateTensor(bias_data, bias_dims), + CreateTensor(output_data, output_dims), + }; + + return ValidateConvGoldens(tensors, tensors_size, expected_output_data, + output_dims_count, conv_params, registration, + output_data); +} + +template +TfLiteStatus TestConvQuantizedPerChannel( + int *input_dims_data, const float *input_data, T *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_data_quantized, + int *bias_dims_data, const float *bias_data, BiasT *bias_data_quantized, + float *bias_scales, int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, T *expected_output_data_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + TfLiteRegistration registration, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + int filter_zero_points[5]; + float filter_scales[5]; + TfLiteAffineQuantization filter_quant; + TfLiteAffineQuantization bias_quant; + TfLiteTensor input_tensor = CreateQuantizedTensor( + input_data, input_quantized, input_dims, input_scale, input_zero_point); + TfLiteTensor filter_tensor = CreateSymmetricPerChannelQuantizedTensor( + filter_data, filter_data_quantized, filter_dims, filter_scales, + filter_zero_points, &filter_quant, 0 /* quantized dimension */); + TfLiteTensor bias_tensor = CreatePerChannelQuantizedBiasTensor( + bias_data, bias_data_quantized, bias_dims, input_scale, &filter_scales[1], + bias_scales, bias_zero_points, &bias_quant, 0 /* quantized dimension */); + TfLiteTensor output_tensor = CreateQuantizedTensor( + output_data, output_dims, output_scale, output_zero_point); + + float input_scales[] = { 1, input_scale }; + int input_zero_points[] = { 1, input_zero_point }; + TfLiteAffineQuantization input_quant = { FloatArrayFromFloats(input_scales), + IntArrayFromInts(input_zero_points), + 0 }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + float output_scales[] = { 1, output_scale }; + int output_zero_points[] = { 1, output_zero_point }; + TfLiteAffineQuantization output_quant = { FloatArrayFromFloats(output_scales), + IntArrayFromInts(output_zero_points), + 0 }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + tflite::Quantize(expected_output_data, expected_output_data_quantized, + output_dims_count, output_scale, output_zero_point); + return ValidateConvGoldens( + tensors, tensors_size, expected_output_data_quantized, output_dims_count, + conv_params, registration, output_data, 1.0 /* tolerance */); +} + +TfLiteStatus TestConvQuantizedPerChannel( + int *input_dims_data, const float *input_data, int8_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_data_quantized, + int *bias_dims_data, const float *bias_data, int32_t *bias_data_quantized, + float *bias_scales, int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, int8_t *expected_output_data_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + TfLiteRegistration registration, int8_t *output_data) +{ + return TestConvQuantizedPerChannel( + input_dims_data, input_data, input_quantized, input_scale, + input_zero_point, filter_dims_data, filter_data, filter_data_quantized, + bias_dims_data, bias_data, bias_data_quantized, bias_scales, + bias_zero_points, output_dims_data, expected_output_data, + expected_output_data_quantized, output_scale, output_zero_point, + conv_params, registration, output_data); +} + +TfLiteStatus TestConvQuantizedPerChannel( + int *input_dims_data, const float *input_data, int16_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_data_quantized, + int *bias_dims_data, const float *bias_data, + std::int64_t *bias_data_quantized, float *bias_scales, + int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, int16_t *expected_output_data_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + TfLiteRegistration registration, int16_t *output_data) +{ + return TestConvQuantizedPerChannel( + input_dims_data, input_data, input_quantized, input_scale, + input_zero_point, filter_dims_data, filter_data, filter_data_quantized, + bias_dims_data, bias_data, bias_data_quantized, bias_scales, + bias_zero_points, output_dims_data, expected_output_data, + expected_output_data_quantized, output_scale, output_zero_point, + conv_params, registration, output_data); +} + +} // namespace testing +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum.cc new file mode 100644 index 00000000..8113fe4a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum.cc @@ -0,0 +1,178 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/cumsum.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kAxisTensor = 1; +constexpr int kOutputTensor = 0; + +constexpr int kCumSumIntegerShift = 20; + +// only used with INT8 tensors +struct OpData { + int32_t output_activation_min; + int32_t output_activation_max; + int32_t input_offset; + int32_t output_offset; + int32_t input_multiplier; + int32_t output_multiplier; + int input_shift; + int output_shift; + int left_shift; +}; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + const TfLiteTensor *axis = GetInput(context, node, kAxisTensor); + + TF_LITE_ENSURE(context, + input->type == kTfLiteFloat32 || input->type == kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, axis->type, kTfLiteInt32); + + TF_LITE_ENSURE_EQ(context, NumElements(axis), 1); + + TF_LITE_ENSURE(context, NumDimensions(input) >= 1); + + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + + TF_LITE_ENSURE_EQ(context, input->type, output->type); + TF_LITE_ENSURE(context, HaveSameShapes(input, output)); + + if (output->type == kTfLiteInt8) { + node->user_data = + context->AllocatePersistentBuffer(context, sizeof(OpData)); + OpData *data = static_cast(node->user_data); + + // 8bit -> 8bit general quantized path, with general rescalings + data->input_offset = -input->params.zero_point; + data->output_offset = output->params.zero_point; + data->left_shift = kCumSumIntegerShift; + const double twice_max_input_scale = + 2 * static_cast(input->params.scale); + const double real_input_multiplier = + static_cast(input->params.scale) / twice_max_input_scale; + const double real_output_multiplier = + twice_max_input_scale / + ((1 << data->left_shift) * static_cast(output->params.scale)); + + QuantizeMultiplierSmallerThanOneExp( + real_input_multiplier, &data->input_multiplier, &data->input_shift); + + QuantizeMultiplierSmallerThanOneExp( + real_output_multiplier, &data->output_multiplier, &data->output_shift); + + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, kTfLiteActNone, output, &data->output_activation_min, + &data->output_activation_max)); + } + + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *axis_tensor = + tflite::micro::GetEvalInput(context, node, kAxisTensor); + + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + auto *cs_params = static_cast(node->builtin_data); + auto input_shape = tflite::micro::GetTensorShape(input); + + int32_t axis = *tflite::micro::GetTensorData(axis_tensor); + if (axis < 0) + axis += input_shape.DimensionsCount(); + + if (axis < 0 || axis >= input_shape.DimensionsCount()) { + TF_LITE_KERNEL_LOG(context, "CUMSUM Invalid axis: %d", axis); + return kTfLiteError; + } + + switch (input->type) { + case kTfLiteFloat32: { + reference_ops::CumSum(tflite::micro::GetTensorData(input), + input_shape, axis, cs_params->exclusive, + cs_params->reverse, + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + + case kTfLiteInt8: { + auto *data = static_cast(node->user_data); + ArithmeticParams params; + params.left_shift = data->left_shift; + params.input1_offset = data->input_offset; + params.input1_multiplier = data->input_multiplier; + params.input1_shift = data->input_shift; + params.output_offset = data->output_offset; + params.output_multiplier = data->output_multiplier; + params.output_shift = data->output_shift; + SetActivationParams(data->output_activation_min, + data->output_activation_max, ¶ms); + reference_ops::CumSum(params, tflite::micro::GetTensorData(input), + input_shape, axis, cs_params->exclusive, + cs_params->reverse, + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + + default: { + TF_LITE_KERNEL_LOG(context, + "CUMSUM only supports FLOAT32 and INT8, got %s.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } + + return kTfLiteError; +} + +} // namespace + +TfLiteRegistration Register_CUMSUM() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum_test.cc new file mode 100644 index 00000000..7c5da303 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/cumsum_test.cc @@ -0,0 +1,366 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +struct CumSumTestParams { + bool exclusive = false; + bool reverse = false; + int32_t axis = std::numeric_limits::max(); +}; + +void ExecuteCumSumTest(CumSumTestParams &test_params, TfLiteTensor *tensors, + int tensors_count) +{ + int kInputArrayData[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + TfLiteCumsumParams params; + params.exclusive = test_params.exclusive; + params.reverse = test_params.reverse; + + const TfLiteRegistration registration = tflite::Register_CUMSUM(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, static_cast(¶ms)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestCumSum(CumSumTestParams &test_params, int *input_dims_data, + const T *input_data, int *expected_dims, const T *expected_data, + T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + int axis_dims_data[] = { 1, 1 }; + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + const int32_t axis_data[] = { test_params.axis }; + + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(axis_data, axis_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + ExecuteCumSumTest(test_params, tensors, tensors_count); + + constexpr float kTolerance = 1e-5; + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } +} + +// min/max are used to compute scale, zero-point, compare tolerance +template +struct TestQuantParams { + float data_min; // input and output data minimum value + float data_max; // input and output data maximum value + T input_data[kOutputSize]; // quantized input storage + T output_data[kOutputSize]; // quantized output storage +}; + +// for quantized int, the error shouldn't exceed step +template +float GetTolerance(float min, float max) +{ + float kQuantizedStep = + 2.0f * (max - min) / + (std::numeric_limits::max() - std::numeric_limits::min()); + return kQuantizedStep; +} + +template +void TestCumSumQuantized(CumSumTestParams &test_params, + TestQuantParams *params, + int *input_dims_data, const float *input_data, + int *expected_dims, const float *expected_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + + int axis_dims_data[] = { 1, 1 }; + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + const int32_t axis_data[] = { test_params.axis }; + + const float scale = ScaleFromMinMax(params->data_min, params->data_max); + const int zero_point = + ZeroPointFromMinMax(params->data_min, params->data_max); + + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, params->input_data, input_dims, scale, + zero_point), + CreateTensor(axis_data, axis_dims), + CreateQuantizedTensor(params->output_data, output_dims, scale, + zero_point), + }; + + constexpr int tensors_count = std::extent::value; + ExecuteCumSumTest(test_params, tensors, tensors_count); + + Dequantize(params->output_data, kOutputSize, scale, zero_point, output_data); + const float kTolerance = GetTolerance(params->data_min, params->data_max); + for (int i = 0; i < kOutputSize; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleTest) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 1, 3, 6, 10, 5, 11, 18, 26 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 1; + + tflite::testing::TestCumSum(test_params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleAxis0Test) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 1, 2, 3, 4, 6, 8, 10, 12 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 0; + + tflite::testing::TestCumSum(test_params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimple1DTest) +{ + int kDims[] = { 1, 8 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 1, 3, 6, 10, 15, 21, 28, 36 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 0; + + tflite::testing::TestCumSum(test_params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleReverseTest) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 10, 9, 7, 4, 26, 21, 15, 8 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 1; + test_params.reverse = true; + + tflite::testing::TestCumSum(test_params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleExclusiveTest) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 0, 1, 3, 6, 0, 5, 11, 18 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 1; + test_params.exclusive = true; + + tflite::testing::TestCumSum(test_params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleReverseExclusiveTest) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 9, 7, 4, 0, 21, 15, 8, 0 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = -1; + test_params.exclusive = true; + test_params.reverse = true; + + tflite::testing::TestCumSum(test_params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleTestInt8) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 1, 3, 6, 10, 5, 11, 18, 26 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 1; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -26.0f; + params.data_max = 26.0f; + + tflite::testing::TestCumSumQuantized( + test_params, ¶ms, kDims, kInput, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleAxis0TestInt8) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 1, 2, 3, 4, 6, 8, 10, 12 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 0; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -12.0f; + params.data_max = 12.0f; + + tflite::testing::TestCumSumQuantized( + test_params, ¶ms, kDims, kInput, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimple1DTestInt8) +{ + int kDims[] = { 1, 8 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 1, 3, 6, 10, 15, 21, 28, 36 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 0; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -36.0f; + params.data_max = 36.0f; + + tflite::testing::TestCumSumQuantized( + test_params, ¶ms, kDims, kInput, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleReverseTestInt8) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 10, 9, 7, 4, 26, 21, 15, 8 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 1; + test_params.reverse = true; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -26.0f; + params.data_max = 26.0f; + + tflite::testing::TestCumSumQuantized( + test_params, ¶ms, kDims, kInput, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleExclusiveTestInt8) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 0, 1, 3, 6, 0, 5, 11, 18 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = 1; + test_params.exclusive = true; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -18.0f; + params.data_max = 18.0f; + + tflite::testing::TestCumSumQuantized( + test_params, ¶ms, kDims, kInput, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TEST(CumSumOpTestSimpleReverseExclusiveTestInt8) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr float kExpect[] = { 9, 7, 4, 0, 21, 15, 8, 0 }; + + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::CumSumTestParams test_params; + test_params.axis = -1; + test_params.exclusive = true; + test_params.reverse = true; + + tflite::testing::TestQuantParams params = {}; + params.data_min = -21.0f; + params.data_max = 21.0f; + + tflite::testing::TestCumSumQuantized( + test_params, ¶ms, kDims, kInput, kDims, kExpect, output_data); +} +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space.cc new file mode 100644 index 00000000..c2c98284 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space.cc @@ -0,0 +1,147 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/depth_to_space.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +// input/output tensor shape rank associations +constexpr int kBatchRank = 0; +constexpr int kHeightRank = 1; +constexpr int kWidthRank = 2; +constexpr int kDepthRank = 3; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = + reinterpret_cast(node->builtin_data); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + TF_LITE_ENSURE_EQ(context, NumDimensions(input), 4); + + auto data_type = output->type; + TF_LITE_ENSURE(context, + data_type == kTfLiteFloat32 || data_type == kTfLiteInt8); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + const int block_size = params->block_size; + TF_LITE_ENSURE(context, block_size > 0); + const int input_height = input->dims->data[kHeightRank]; + const int input_width = input->dims->data[kWidthRank]; + const int input_channels = input->dims->data[kDepthRank]; + int output_height = input_height * block_size; + int output_width = input_width * block_size; + int output_channels = input_channels / block_size / block_size; + + TF_LITE_ENSURE_EQ(context, input_height, output_height / block_size); + TF_LITE_ENSURE_EQ(context, input_width, output_width / block_size); + TF_LITE_ENSURE_EQ(context, input_channels, + output_channels * block_size * block_size); + + // We must update the output tensor dimensions. + // The dims storage is expected to be the same area in memory + // for both TfLiteTensor and TfLiteEvalTensor. This is important + // because TfLiteTensor in the MicroInterpreter is a temporary + // allocation. For the KernelRunner interpreter, TfLiteEvalTensor + // is a temporary allocation. We must therefore relocate the dims + // from the FlatBuffer to the persistant storage arena. + TfLiteEvalTensor *output_eval = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + TF_LITE_ENSURE_OK(context, tflite::micro::CreateWritableTensorDimsWithCopy( + context, output, output_eval)); + output->dims->data[kBatchRank] = input->dims->data[kBatchRank]; + output->dims->data[kHeightRank] = output_height; + output->dims->data[kWidthRank] = output_width; + output->dims->data[kDepthRank] = output_channels; + + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = + reinterpret_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + tflite::DepthToSpaceParams op_params; + op_params.block_size = static_cast(params->block_size); + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: + reference_ops::DepthToSpace(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt8: + reference_ops::DepthToSpace(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG( + context, "DEPTH_TO_SPACE only supports FLOAT32 and INT8, got %s.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_DEPTH_TO_SPACE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space_test.cc new file mode 100644 index 00000000..d35cca3b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depth_to_space_test.cc @@ -0,0 +1,321 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int kOutputDimsCount = 4; + +struct DepthToSpaceTestParams { + int block_size; + // output_dims_data is a TfLiteIntArray + int output_dims_data[kOutputDimsCount + 1] = { kOutputDimsCount, 0, 0, 0, 0 }; +}; + +void ExecuteDepthToSpaceTest(const DepthToSpaceTestParams ¶ms, + TfLiteTensor *tensors, int tensors_count) +{ + int kInputArrayData[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + TfLiteDepthToSpaceParams op_params = {}; + op_params.block_size = params.block_size; + + const TfLiteRegistration registration = tflite::Register_DEPTH_TO_SPACE(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, static_cast(&op_params)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestDepthToSpace(DepthToSpaceTestParams ¶ms, int *input_dims_data, + const T *input_data, int *expected_dims_data, + const T *expected_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *expected_dims = IntArrayFromInts(expected_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(params.output_dims_data); + const int expected_count = ElementCount(*expected_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + ExecuteDepthToSpaceTest(params, tensors, tensors_count); + + constexpr float kTolerance = 1e-5; + for (int i = 0; i < expected_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } + for (int i = 0; i < expected_dims->size; i++) { + // output dims will have been relocated during prepare phase, + // so use the tensor dims pointer. + TF_LITE_MICRO_EXPECT_EQ(expected_dims->data[i], tensors[1].dims->data[i]); + } +} + +// min/max are used to compute scale, zero-point, compare tolerance +template +struct TestQuantParams { + float data_min; // input and output data minimum value + float data_max; // input and output data maximum value + T input_data[kOutputSize]; // quantized input storage + T output_data[kOutputSize]; // quantized output storage +}; + +// for quantized, the error shouldn't exceed step +template +float GetTolerance(float min, float max) +{ + float kQuantizedStep = + 2.0f * (max - min) / + (std::numeric_limits::max() - std::numeric_limits::min()); + return kQuantizedStep; +} + +template +void TestDepthToSpaceQuantized(DepthToSpaceTestParams ¶ms, + TestQuantParams *quant_params, + int *input_dims_data, const float *input_data, + int *expected_dims_data, + const float *expected_data, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *expected_dims = IntArrayFromInts(expected_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(params.output_dims_data); + + const float scale = + ScaleFromMinMax(quant_params->data_min, quant_params->data_max); + const int zero_point = + ZeroPointFromMinMax(quant_params->data_min, quant_params->data_max); + + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, quant_params->input_data, input_dims, + scale, zero_point), + CreateQuantizedTensor(quant_params->output_data, output_dims, scale, + zero_point), + }; + constexpr int kTensorsCount = std::extent::value; + + ExecuteDepthToSpaceTest(params, tensors, kTensorsCount); + + Dequantize(quant_params->output_data, kOutputSize, scale, zero_point, + output_data); + const float kTolerance = + GetTolerance(quant_params->data_min, quant_params->data_max); + for (int i = 0; i < kOutputSize; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } + for (int i = 0; i < expected_dims->size; i++) { + // output dims will have been relocated during prepare phase, + // so use the tensor dims pointer. + TF_LITE_MICRO_EXPECT_EQ(expected_dims->data[i], tensors[1].dims->data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelFloat32_1114_2) +{ + int kInputDims[] = { 4, 1, 1, 1, 4 }; + constexpr float kInput[] = { 1.4, 2.3, 3.2, 4.1 }; + int kExpectDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kExpect[] = { 1.4, 2.3, 3.2, 4.1 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + + tflite::testing::TestDepthToSpace(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelFloat32_1124_2) +{ + int kInputDims[] = { 4, 1, 1, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int kExpectDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kExpect[] = { 1, 2, 5, 6, 3, 4, 7, 8 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + + tflite::testing::TestDepthToSpace(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelFloat32_1214_2) +{ + int kInputDims[] = { 4, 1, 2, 1, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int kExpectDims[] = { 4, 1, 4, 2, 1 }; + constexpr float kExpect[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + + tflite::testing::TestDepthToSpace(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelFloat32_1224_2) +{ + int kInputDims[] = { 4, 1, 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int kExpectDims[] = { 4, 1, 4, 4, 1 }; + constexpr float kExpect[] = { 1, 2, 5, 6, 3, 4, 7, 8, + 9, 10, 13, 14, 11, 12, 15, 16 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + + tflite::testing::TestDepthToSpace(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelFloat32_1111_1) +{ + int kInputDims[] = { 4, 1, 1, 1, 1 }; + constexpr float kInput[] = { 4 }; + int kExpectDims[] = { 4, 1, 1, 1, 1 }; + constexpr float kExpect[] = { 4 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 1; + + tflite::testing::TestDepthToSpace(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelInt8_1114_2) +{ + int kInputDims[] = { 4, 1, 1, 1, 4 }; + constexpr float kInput[] = { 1.4, 2.3, 3.2, 4.1 }; + int kExpectDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kExpect[] = { 1.4, 2.3, 3.2, 4.1 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + tflite::testing::TestQuantParams quant_params = {}; + quant_params.data_min = 0.0; + quant_params.data_max = 5.0; + + tflite::testing::TestDepthToSpaceQuantized( + params, &quant_params, kInputDims, kInput, kExpectDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelInt8_1124_2) +{ + int kInputDims[] = { 4, 1, 1, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int kExpectDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kExpect[] = { 1, 2, 5, 6, 3, 4, 7, 8 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + tflite::testing::TestQuantParams quant_params = {}; + quant_params.data_min = 0.0; + quant_params.data_max = 9.0; + + tflite::testing::TestDepthToSpaceQuantized( + params, &quant_params, kInputDims, kInput, kExpectDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelInt8_1214_2) +{ + int kInputDims[] = { 4, 1, 2, 1, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int kExpectDims[] = { 4, 1, 4, 2, 1 }; + constexpr float kExpect[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + tflite::testing::TestQuantParams quant_params = {}; + quant_params.data_min = 0.0; + quant_params.data_max = 9.0; + + tflite::testing::TestDepthToSpaceQuantized( + params, &quant_params, kInputDims, kInput, kExpectDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelInt8_1224_2) +{ + int kInputDims[] = { 4, 1, 2, 2, 4 }; + constexpr float kInput[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int kExpectDims[] = { 4, 1, 4, 4, 1 }; + constexpr float kExpect[] = { 1, 2, 5, 6, 3, 4, 7, 8, + 9, 10, 13, 14, 11, 12, 15, 16 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 2; + tflite::testing::TestQuantParams quant_params = {}; + quant_params.data_min = 0.0; + quant_params.data_max = 17.0; + + tflite::testing::TestDepthToSpaceQuantized( + params, &quant_params, kInputDims, kInput, kExpectDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(DepthToSpaceOpModelInt8_1111_1) +{ + int kInputDims[] = { 4, 1, 1, 1, 1 }; + constexpr float kInput[] = { 4 }; + int kExpectDims[] = { 4, 1, 1, 1, 1 }; + constexpr float kExpect[] = { 4 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::DepthToSpaceTestParams params; + params.block_size = 1; + tflite::testing::TestQuantParams quant_params = {}; + quant_params.data_min = 3.0; + quant_params.data_max = 5.0; + + tflite::testing::TestDepthToSpaceQuantized( + params, &quant_params, kInputDims, kInput, kExpectDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.cc new file mode 100644 index 00000000..84079027 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.cc @@ -0,0 +1,106 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/depthwise_conv.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpDataConv)); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + auto ¶ms = + *(reinterpret_cast(node->builtin_data)); + const OpDataConv &data = *(static_cast(node->user_data)); + + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kDepthwiseConvOutputTensor); + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kDepthwiseConvInputTensor); + const TfLiteEvalTensor *filter = + tflite::micro::GetEvalInput(context, node, kDepthwiseConvWeightsTensor); + const TfLiteEvalTensor *bias = + (NumInputs(node) == 3) ? tflite::micro::GetEvalInput(context, node, kDepthwiseConvBiasTensor) : nullptr; + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: { + tflite::reference_ops::DepthwiseConv( + DepthwiseConvParamsFloat(params, data), + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + } + case kTfLiteInt8: { + reference_integer_ops::DepthwiseConvPerChannel( + DepthwiseConvParamsQuantized(params, data), + data.per_channel_output_multiplier, data.per_channel_output_shift, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + } + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_DEPTHWISE_CONV_2D() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/DepthwiseConvPrepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.h new file mode 100644 index 00000000..01c43d35 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv.h @@ -0,0 +1,53 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_DEPTHWISE_CONV_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_DEPTHWISE_CONV_H_ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/micro/kernels/conv.h" + +namespace tflite { +extern const int kDepthwiseConvInputTensor; +extern const int kDepthwiseConvWeightsTensor; +extern const int kDepthwiseConvBiasTensor; +extern const int kDepthwiseConvOutputTensor; +extern const int kDepthwiseConvQuantizedDimension; + +// Returns a DepthwiseParams struct with all the parameters needed for a +// float computation. +DepthwiseParams DepthwiseConvParamsFloat( + const TfLiteDepthwiseConvParams ¶ms, const OpDataConv &data); + +// Returns a DepthwiseParams struct with all the parameters needed for a +// quantized computation. +DepthwiseParams DepthwiseConvParamsQuantized( + const TfLiteDepthwiseConvParams ¶ms, const OpDataConv &data); + +TfLiteStatus CalculateOpDataDepthwiseConv( + TfLiteContext *context, TfLiteNode *node, + const TfLiteDepthwiseConvParams ¶ms, int width, int height, + int filter_width, int filter_height, int out_width, int out_height, + const TfLiteType data_type, OpDataConv *data); + +TfLiteStatus DepthwiseConvPrepare(TfLiteContext *context, TfLiteNode *node); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_DEPTHWISE_CONV_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_common.cc new file mode 100644 index 00000000..3901939d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_common.cc @@ -0,0 +1,190 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/depthwise_conv.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { + +const int kDepthwiseConvInputTensor = 0; +const int kDepthwiseConvWeightsTensor = 1; +const int kDepthwiseConvBiasTensor = 2; +const int kDepthwiseConvOutputTensor = 0; + +// DepthwiseConv is quantized along dimension 3: +// https://www.tensorflow.org/lite/performance/quantization_spec +const int kDepthwiseConvQuantizedDimension = 3; + +// Returns a DepthwiseParams struct with all the parameters needed for a +// float computation. +DepthwiseParams DepthwiseConvParamsFloat( + const TfLiteDepthwiseConvParams ¶ms, const OpDataConv &data) +{ + DepthwiseParams op_params; + CalculateActivationRange(params.activation, &op_params.float_activation_min, + &op_params.float_activation_max); + op_params.padding_type = tflite::micro::RuntimePaddingType(params.padding); + op_params.padding_values.width = data.padding.width; + op_params.padding_values.height = data.padding.height; + op_params.stride_width = params.stride_width; + op_params.stride_height = params.stride_height; + op_params.dilation_width_factor = params.dilation_width_factor; + op_params.dilation_height_factor = params.dilation_height_factor; + op_params.depth_multiplier = params.depth_multiplier; + return op_params; +} + +// Returns a DepthwiseParams struct with all the parameters needed for a +// quantized computation. +DepthwiseParams DepthwiseConvParamsQuantized( + const TfLiteDepthwiseConvParams ¶ms, const OpDataConv &data) +{ + DepthwiseParams op_params; + op_params.input_offset = -data.input_zero_point; + op_params.weights_offset = -data.filter_zero_point; + op_params.output_offset = data.output_zero_point; + op_params.output_multiplier = data.output_multiplier; + op_params.output_shift = -data.output_shift; + op_params.padding_type = tflite::micro::RuntimePaddingType(params.padding); + op_params.padding_values.height = data.padding.height; + op_params.padding_values.width = data.padding.width; + op_params.stride_height = params.stride_height; + op_params.stride_width = params.stride_width; + op_params.dilation_height_factor = params.dilation_height_factor; + op_params.dilation_width_factor = params.dilation_width_factor; + op_params.depth_multiplier = params.depth_multiplier; + op_params.quantized_activation_min = data.output_activation_min; + op_params.quantized_activation_max = data.output_activation_max; + return op_params; +} + +TfLiteStatus CalculateOpDataDepthwiseConv( + TfLiteContext *context, TfLiteNode *node, + const TfLiteDepthwiseConvParams ¶ms, int width, int height, + int filter_width, int filter_height, int out_width, int out_height, + const TfLiteType data_type, OpDataConv *data) +{ + bool has_bias = node->inputs->size == 3; + // Check number of inputs/outputs + TF_LITE_ENSURE(context, has_bias || node->inputs->size == 2); + TF_LITE_ENSURE_EQ(context, node->outputs->size, 1); + + // Matching GetWindowedOutputSize in TensorFlow. + auto padding = params.padding; + data->padding = ComputePaddingHeightWidth( + params.stride_height, params.stride_width, params.dilation_height_factor, + params.dilation_width_factor, height, width, filter_height, filter_width, + padding, &out_height, &out_width); + + const TfLiteTensor *input = GetInput(context, node, kConvInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = GetInput(context, node, kConvWeightsTensor); + TF_LITE_ENSURE(context, filter != nullptr); + const TfLiteTensor *bias = + GetOptionalInputTensor(context, node, kConvBiasTensor); + TfLiteTensor *output = GetOutput(context, node, kConvOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + // Note that quantized inference requires that all tensors have their + // parameters set. This is usually done during quantized training. + if (data_type != kTfLiteFloat32) { + int output_channels = filter->dims->data[kDepthwiseConvQuantizedDimension]; + + TF_LITE_ENSURE_STATUS(tflite::PopulateConvolutionQuantizationParams( + context, input, filter, bias, output, params.activation, + &data->output_multiplier, &data->output_shift, + &data->output_activation_min, &data->output_activation_max, + data->per_channel_output_multiplier, data->per_channel_output_shift, + output_channels)); + } + + data->input_zero_point = input->params.zero_point; + data->filter_zero_point = filter->params.zero_point; + data->output_zero_point = output->params.zero_point; + + return kTfLiteOk; +} + +TfLiteStatus DepthwiseConvPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + OpDataConv *data = static_cast(node->user_data); + const auto ¶ms = + *(static_cast(node->builtin_data)); + + TfLiteTensor *output = GetOutput(context, node, kDepthwiseConvOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + const TfLiteTensor *input = + GetInput(context, node, kDepthwiseConvInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = + GetInput(context, node, kDepthwiseConvWeightsTensor); + TF_LITE_ENSURE(context, filter != nullptr); + + const int input_width = input->dims->data[2]; + const int input_height = input->dims->data[1]; + const int filter_width = filter->dims->data[2]; + const int filter_height = filter->dims->data[1]; + const int output_width = output->dims->data[2]; + const int output_height = output->dims->data[1]; + + // Dynamically allocate per-channel quantization parameters. + const int num_channels = filter->dims->data[kDepthwiseConvQuantizedDimension]; + data->per_channel_output_multiplier = + static_cast(context->AllocatePersistentBuffer( + context, num_channels * sizeof(int32_t))); + data->per_channel_output_shift = + static_cast(context->AllocatePersistentBuffer( + context, num_channels * sizeof(int32_t))); + + // All per-channel quantized tensors need valid zero point and scale arrays. + if (input->type == kTfLiteInt8) { + TF_LITE_ENSURE_EQ(context, filter->quantization.type, + kTfLiteAffineQuantization); + + const auto *affine_quantization = + static_cast(filter->quantization.params); + TFLITE_DCHECK(affine_quantization != nullptr); + TFLITE_DCHECK(affine_quantization->scale != nullptr); + TFLITE_DCHECK(affine_quantization->zero_point != nullptr); + + TF_LITE_ENSURE( + context, affine_quantization->scale->size == 1 || + affine_quantization->scale->size == + filter->dims->data[kDepthwiseConvQuantizedDimension]); + + TF_LITE_ENSURE_EQ(context, affine_quantization->scale->size, + affine_quantization->zero_point->size); + } + + TF_LITE_ENSURE_STATUS(CalculateOpDataDepthwiseConv( + context, node, params, input_width, input_height, filter_width, + filter_height, output_width, output_height, input->type, data)); + + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_test.cc new file mode 100644 index 00000000..ff7eb2de --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/depthwise_conv_test.cc @@ -0,0 +1,1004 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +#if !defined(XTENSA) // Needed to avoid build errors from unused variables. +constexpr int kMaxFilterChannels = 64; +constexpr int kMaxBiasChannels = 64; +#endif // !defined(XTENSA) + +// Index of the output tensor in context->tensors, specific to +// DepthwiseConv. +constexpr int kOutputTensorIndex = 3; + +// Creates a DepthwiseConv opeerator, calls it with the provided input tensors +// and some defaults parameters, and compares the output with +// expected_output_data. +// +// The tensors parameter contains both the input tensors as well as a +// preallocated output tensor into which the output is stored. +template +TfLiteStatus ValidateDepthwiseConvGoldens( + const T *expected_output_data, int output_length, + TfLiteDepthwiseConvParams *conv_params, float tolerance, int tensors_size, + TfLiteTensor *tensors) +{ + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_DEPTHWISE_CONV_2D(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(conv_params)); + + int input_depth = tensors[0].dims->data[3]; + int output_depth = tensors[1].dims->data[3]; + int depth_mul = output_depth / input_depth; + + conv_params->padding = kTfLitePaddingValid; + conv_params->depth_multiplier = depth_mul; + + const char *init_data = reinterpret_cast(conv_params); + + // TODO(b/154240825): Use a test macro here which fails and returns. + TfLiteStatus status = runner.InitAndPrepare(init_data); + if (status != kTfLiteOk) { + return status; + } + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + const T *output_data = tflite::GetTensorData(&tensors[kOutputTensorIndex]); + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], + tolerance); + } + return kTfLiteOk; +} + +#if !defined(XTENSA) // Needed to avoid build errors from unsused functions. +void TestDepthwiseConvFloat(int *input_dims_data, const float *input_data, + int *filter_dims_data, const float *filter_data, + int *bias_dims_data, const float *bias_data, + const float *expected_output_data, + int *output_dims_data, + TfLiteDepthwiseConvParams *conv_params, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(filter_data, filter_dims), + CreateTensor(bias_data, bias_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateDepthwiseConvGoldens(expected_output_data, output_dims_count, + conv_params, 1e-5, tensors_size, tensors); +} + +void TestDepthwiseConvQuantizedPerChannel( + int *input_dims_data, const float *input_data, int8_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_data_quantized, + int *bias_dims_data, const float *bias_data, int32_t *bias_data_quantized, + int *output_dims_data, const float *expected_output_data, + int8_t *expected_output_data_quantized, int8_t *output_data, + float output_scale, int output_zero_point, + TfLiteDepthwiseConvParams *conv_params) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + int filter_zero_points[kMaxFilterChannels]; + float filter_scales[kMaxFilterChannels]; + int bias_zero_points[kMaxBiasChannels]; + float bias_scales[kMaxBiasChannels]; + TfLiteAffineQuantization filter_quant; + TfLiteAffineQuantization bias_quant; + TfLiteTensor input_tensor = CreateQuantizedTensor( + input_data, input_quantized, input_dims, input_scale, input_zero_point); + TfLiteTensor filter_tensor = CreateSymmetricPerChannelQuantizedTensor( + filter_data, filter_data_quantized, filter_dims, filter_scales, + filter_zero_points, &filter_quant, 3 /* quantized dimension */ + ); + TfLiteTensor bias_tensor = CreatePerChannelQuantizedBiasTensor( + bias_data, bias_data_quantized, bias_dims, input_scale, &filter_scales[1], + bias_scales, bias_zero_points, &bias_quant, 3 /* quantized dimension */ + ); + TfLiteTensor output_tensor = CreateQuantizedTensor( + output_data, output_dims, output_scale, input_zero_point); + + // TODO(njeff): Affine Quantization Params should be set on tensor creation. + float input_scales[] = { 1, input_scale }; + int input_zero_points[] = { 1, input_zero_point }; + TfLiteAffineQuantization input_quant = { FloatArrayFromFloats(input_scales), + IntArrayFromInts(input_zero_points), + 0 }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + float output_scales[] = { 1, output_scale }; + int output_zero_points[] = { 1, output_zero_point }; + TfLiteAffineQuantization output_quant = { FloatArrayFromFloats(output_scales), + IntArrayFromInts(output_zero_points), + 0 }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + Quantize(expected_output_data, expected_output_data_quantized, + output_dims_count, output_scale, output_zero_point); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, ValidateDepthwiseConvGoldens(expected_output_data_quantized, + output_dims_count, conv_params, + 1.0, tensors_size, tensors)); +} + +#endif // !defined(XTENSA) + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +#if !defined(XTENSA) // TODO(b/170322965): xtensa kernels are less general than \ + // reference kernels and we ifdef out test cases that are \ + // currently known to fail. +TF_LITE_MICRO_TEST(SimpleTest) +{ + int input_shape[] = { 4, 1, 3, 2, 2 }; + const float input_values[] = { 1, 2, 7, 8, 3, 4, 9, 10, 5, 6, 11, 12 }; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_values[] = { 1, 2, 3, 4, -9, 10, -11, 12, + 5, 6, 7, 8, 13, -14, 15, -16 }; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const float bias_values[] = { 1, 2, 3, 4 }; + const float golden[] = { + 71, + -34, + 99, + -20, + 91, + -26, + 127, + -4, + }; + int output_shape[] = { 4, 1, 2, 1, 4 }; + const int output_dims_count = 8; + float output_data[output_dims_count]; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvFloat( + input_shape, input_values, filter_shape, filter_values, bias_shape, + bias_values, golden, output_shape, &conv_params, output_data); +} + +TF_LITE_MICRO_TEST(SimpleTestRelu) +{ + int input_shape[] = { 4, 1, 3, 2, 2 }; + const float input_values[] = { 1, 2, 7, 8, 3, 4, 9, 10, 5, 6, 11, 12 }; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_values[] = { 1, 2, 3, 4, -9, 10, -11, 12, + 5, 6, 7, 8, 13, -14, 15, -16 }; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const float bias_values[] = { 1, 2, 3, 4 }; + int output_shape[] = { 4, 1, 2, 1, 4 }; + const int output_dims_count = 8; + const float golden_relu[] = { 71, 0, 99, 0, 91, 0, 127, 0 }; + float output_data[output_dims_count]; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActRelu; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvFloat( + input_shape, input_values, filter_shape, filter_values, bias_shape, + bias_values, golden_relu, output_shape, &conv_params, output_data); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantizedPerChannel) +{ + const int input_elements = 12; + int input_shape[] = { 4, 1, 3, 2, 2 }; + const float input_values[] = { 1, 2, 7, 8, 3, 4, 9, 10, 5, 6, 11, 12 }; + const int filter_elements = 16; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_values[] = { 1, 2, 3, 4, -9, 10, -11, 12, + 5, 6, 7, 8, 13, -14, 15, -16 }; + const int bias_elements = 4; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const int output_elements = 8; + const float bias_values[] = { 1, 2, 3, 4 }; + const float golden[] = { + 71, + -34, + 99, + -20, + 91, + -26, + 127, + -4, + }; + int output_shape[] = { 4, 1, 2, 1, 4 }; + const int output_dims_count = 8; + int8_t output_data[output_dims_count]; + + const float input_scale = 0.5; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvQuantizedPerChannel( + input_shape, input_values, input_quantized, input_scale, input_zero_point, + filter_shape, filter_values, filter_quantized, bias_shape, bias_values, + bias_quantized, output_shape, golden, golden_quantized, output_data, + output_scale, output_zero_point, &conv_params); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantizedPerChannelDepthMultiplier1) +{ + const int input_elements = 12; + int input_shape[] = { 4, 1, 3, 2, 2 }; + const float input_values[] = { 1, 2, 7, 8, 3, 4, 9, 10, 5, 6, 11, 12 }; + const int filter_elements = 8; + int filter_shape[] = { 4, 1, 2, 2, 2 }; + const float filter_values[] = { 1, 2, 3, 4, -9, 10, -11, 12 }; + const int bias_elements = 2; + int bias_shape[] = { 4, 1, 1, 1, 2 }; + const int output_elements = 4; + const float bias_values[] = { 1, 2 }; + const float golden[] = { + -103, + 127, + -128, + 127, + }; + int output_shape[] = { 4, 1, 2, 1, 2 }; + const int output_dims_count = 4; + int8_t output_data[output_dims_count]; + + const float input_scale = 1.0f; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvQuantizedPerChannel( + input_shape, input_values, input_quantized, input_scale, input_zero_point, + filter_shape, filter_values, filter_quantized, bias_shape, bias_values, + bias_quantized, output_shape, golden, golden_quantized, output_data, + output_scale, output_zero_point, &conv_params); +} + +TF_LITE_MICRO_TEST(TestQuantizedPerChannelDepthMultiplier1Relu6) +{ + const int input_elements = 24; + int input_shape[] = { 4, 1, 3, 2, 4 }; + const float input_values[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + const int filter_elements = 16; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_values[] = { 0, 1, 8, -2, -1, 2, -10, 0, + -1, 3, -18, 0, 0, 4, 20, -3 }; + const int bias_elements = 4; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const int output_elements = 8; + const float bias_values[] = { 1, 2, 3, 4 }; + const float golden[] = { + 0, + 6, + 3, + 0, + 0, + 6, + 3, + 0, + }; + int output_shape[] = { 4, 1, 2, 1, 4 }; + int8_t output_data[output_elements]; + + const float input_scale = 0.023529f; + const float output_scale = 0.023529f; + const int input_zero_point = -128; + const int output_zero_point = -128; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActRelu6; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvQuantizedPerChannel( + input_shape, input_values, input_quantized, input_scale, input_zero_point, + filter_shape, filter_values, filter_quantized, bias_shape, bias_values, + bias_quantized, output_shape, golden, golden_quantized, output_data, + output_scale, output_zero_point, &conv_params); +} + +TF_LITE_MICRO_TEST(SimpleTestDilatedQuantizedPerChannel) +{ + const int input_elements = 48; + int input_shape[] = { 4, 1, 4, 6, 2 }; + const float input_values[] = { 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, // h = 0 + 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, // h = 1 + 1, 2, 3, 4, 5, 6, 2, 6, 2, 4, 4, 2, // h = 2 + 3, 2, 6, 5, 1, 4, 1, 2, 1, 4, 6, 3 }; // h = 3 + const int filter_elements = 16; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_values[] = { 1, 2, 3, 4, -9, 10, -11, 12, + 5, 6, 7, 8, 13, -14, 15, -16 }; + const int bias_elements = 4; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const int output_elements = 24; + const float bias_values[] = { 1, 2, 3, 4 }; + const float golden[] = { + 15, 2, 88, -48, 25, 14, 72, 0, 61, -2, 56, 48, // h = 0 + -4, 52, 12, 48, 11, 70, 63, 40, 51, -30, 41, 48 // h = 1 + }; + int output_shape[] = { 4, 1, 2, 3, 4 }; + int8_t output_data[output_elements]; + + const float input_scale = 0.5; + const float output_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 3; + conv_params.dilation_height_factor = 2; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvQuantizedPerChannel( + input_shape, input_values, input_quantized, input_scale, input_zero_point, + filter_shape, filter_values, filter_quantized, bias_shape, bias_values, + bias_quantized, output_shape, golden, golden_quantized, output_data, + output_scale, output_zero_point, &conv_params); +} + +TF_LITE_MICRO_TEST(TestQuantizedPerChannelCompareWithFloat) +{ + int input_dims[] = { 4, 1, 2, 3, 2 }; + const float input_data[] = { 3, 2, 1, -1, -2, -3, 4, 3, 2, -2, -3, -4 }; + int filter_dims[] = { 4, 1, 2, 2, 4 }; + const float filter_data[] = { 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 5, 6, 3, 4, 1, 2 }; + int bias_dims[] = { 4, 1, 1, 1, 4 }; + const float bias_data[] = { 3, -2, 4, 6 }; + int output_dims[] = { 4, 1, 1, 2, 4 }; + const float golden[] = { 43, 48, 18, 22, 3, -4, -28, -36 }; + + const int input_size = 12; + const int filter_size = 16; + const int output_size = 8; + const int bias_size = 4; + int8_t input_quantized[input_size]; + int8_t filter_quantized[filter_size]; + int32_t bias_quantized[bias_size]; + int8_t golden_quantized[output_size]; + int8_t output_data[output_size]; + float output_float[output_size]; + + const float input_scale = 0.5; + const float output_scale = 1.0; + const int input_zero_point = 0; + const int output_zero_point = 0; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + tflite::testing::TestDepthwiseConvQuantizedPerChannel( + input_dims, input_data, input_quantized, input_scale, input_zero_point, + filter_dims, filter_data, filter_quantized, bias_dims, bias_data, + bias_quantized, output_dims, golden, golden_quantized, output_data, + output_scale, output_zero_point, &conv_params); + + tflite::testing::TestDepthwiseConvFloat( + input_dims, input_data, filter_dims, filter_data, bias_dims, bias_data, + golden, output_dims, &conv_params, output_float); +} + +TF_LITE_MICRO_TEST(PerChannelBroadcastQuantizationParams) +{ + const float input_scale = 1.0f; + const float filter_scale = 1.0f; + const float output_scale = 1.0f; + + const int input_elements = 12; + int input_shape[] = { 4, 1, 3, 2, 2 }; + const float input_values[] = { 1, 2, 7, 8, 3, 4, 9, 10, 5, 6, 11, 12 }; + const int filter_elements = 16; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_values[] = { 1, 2, 3, 4, -9, 10, -11, 12, + 5, 6, 7, 8, 13, -14, 15, -16 }; + const int bias_elements = 4; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const int output_elements = 8; + const float bias_values[] = { 1, 2, 3, 4 }; + const float golden[] = { + 71, + -34, + 99, + -20, + 91, + -26, + 127, + -4, + }; + int output_shape[] = { 4, 1, 2, 1, 4 }; + const int output_dims_count = 8; + int8_t output_data[output_dims_count]; + + int8_t input_quantized[input_elements]; + int8_t filter_quantized[filter_elements]; + int32_t bias_quantized[bias_elements]; + int8_t golden_quantized[output_elements]; + + TfLiteIntArray *input_dims = tflite::testing::IntArrayFromInts(input_shape); + TfLiteIntArray *filter_dims = tflite::testing::IntArrayFromInts(filter_shape); + TfLiteIntArray *bias_dims = tflite::testing::IntArrayFromInts(bias_shape); + TfLiteIntArray *output_dims = tflite::testing::IntArrayFromInts(output_shape); + + // Create per-layer quantized int8_t input tensor. + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + input_values, input_quantized, input_dims, input_scale, 0); + int input_zero_points[2] = { 1, 0 }; + float input_scales[2] = { 1, input_scale }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + // Create per-layer quantized int8_t filter tensor. + TfLiteTensor filter_tensor = tflite::testing::CreateQuantizedTensor( + filter_values, filter_quantized, filter_dims, filter_scale, 0); + int filter_zero_points[2] = { 1, 0 }; + float filter_scales[2] = { 1, filter_scale }; + TfLiteAffineQuantization filter_quant = { + tflite::testing::FloatArrayFromFloats(filter_scales), + tflite::testing::IntArrayFromInts(filter_zero_points), 0 + }; + filter_tensor.quantization = { kTfLiteAffineQuantization, &filter_quant }; + + // Create per-layer quantized int32_t bias tensor. + tflite::SymmetricQuantize(bias_values, bias_quantized, bias_elements, + input_scale * output_scale); + TfLiteTensor bias_tensor = + tflite::testing::CreateTensor(bias_quantized, bias_dims); + + int bias_zero_points[2] = { 1, 0 }; + float bias_scales[2] = { 1, input_scale * filter_scale }; + TfLiteAffineQuantization bias_quant = { + tflite::testing::FloatArrayFromFloats(bias_scales), + tflite::testing::IntArrayFromInts(bias_zero_points), 0 + }; + bias_tensor.quantization = { kTfLiteAffineQuantization, &bias_quant }; + + // Create per-layer quantized int8_t output tensor. + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_data, output_dims, output_scale, 0); + int output_zero_points[2] = { 1, 0 }; + float output_scales[2] = { 1, output_scale }; + TfLiteAffineQuantization output_quant = { + tflite::testing::FloatArrayFromFloats(output_scales), + tflite::testing::IntArrayFromInts(output_zero_points), 0 + }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + tflite::Quantize(golden, golden_quantized, output_dims_count, output_scale, + 0); + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::testing::ValidateDepthwiseConvGoldens( + golden_quantized, output_dims_count, &conv_params, 1e-5, + tensors_size, tensors)); +} + +#endif // !defined(XTENSA) + +TF_LITE_MICRO_TEST(FilterDimsNotMatchingAffineQuantization) +{ + int input_shape[] = { 4, 1, 2, 3, 2 }; + const float input_data[] = { 3, 2, 1, -1, -2, -3, 4, 3, 2, -2, -3, -4 }; + int filter_shape[] = { 4, 1, 2, 2, 4 }; + const float filter_data[] = { 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 5, 6, 3, 4, 1, 2 }; + int bias_shape[] = { 4, 1, 1, 1, 4 }; + const float bias_data[] = { 3, -2, 4, 6 }; + int output_shape[] = { 4, 1, 1, 2, 4 }; + + const int input_size = 12; + const int filter_size = 16; + const int output_size = 8; + const int bias_size = 4; + int8_t input_quantized[input_size]; + int8_t filter_quantized[filter_size]; + int32_t bias_quantized[bias_size]; + int8_t golden_quantized[output_size]; + int zero_points[bias_size + 1]; + float scales[bias_size + 1]; + int8_t output_data[output_size]; + + const float input_scale = 0.5; + const float output_scale = 1.0; + const int input_zero_point = 0; + const int output_zero_point = 0; + + TfLiteIntArray *input_dims = tflite::testing::IntArrayFromInts(input_shape); + TfLiteIntArray *filter_dims = tflite::testing::IntArrayFromInts(filter_shape); + TfLiteIntArray *bias_dims = tflite::testing::IntArrayFromInts(bias_shape); + TfLiteIntArray *output_dims = tflite::testing::IntArrayFromInts(output_shape); + + int filter_zero_points[5]; + float filter_scales[5]; + TfLiteAffineQuantization filter_quant; + TfLiteAffineQuantization bias_quant; + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + input_data, input_quantized, input_dims, input_scale, input_zero_point); + TfLiteTensor filter_tensor = + tflite::testing::CreateSymmetricPerChannelQuantizedTensor( + filter_data, filter_quantized, filter_dims, filter_scales, + filter_zero_points, &filter_quant, 0 /* quantized dimension */); + TfLiteTensor bias_tensor = + tflite::testing::CreatePerChannelQuantizedBiasTensor( + bias_data, bias_quantized, bias_dims, input_scale, &filter_scales[1], + scales, zero_points, &bias_quant, 0); + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_data, output_dims, output_scale, output_zero_point); + + float input_scales[] = { 1, input_scale }; + int input_zero_points[] = { 1, input_zero_point }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + + // Set filter quant to mismatched dimension. + TfLiteAffineQuantization *quant = reinterpret_cast( + filter_tensor.quantization.params); + quant->scale->size = 2; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, + tflite::testing::ValidateDepthwiseConvGoldens( + golden_quantized, output_size, &conv_params, 1e-5, + tensors_size, tensors)); + + // Set scale back to correct dimension, and make zero point array too short. + quant->scale->size = filter_shape[0]; + quant->zero_point->size = 2; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, + tflite::testing::ValidateDepthwiseConvGoldens( + golden_quantized, output_size, &conv_params, 1e-5, + tensors_size, tensors)); +} + +TF_LITE_MICRO_TEST(Int8Input32x4Filter32x4ShouldMatchGolden) +{ + const int input_elements = 32 * 4; + const int filter_elements = 32 * 4; + const int bias_elements = 32; + const int output_elements = 32; + int input_shape[] = { 4, 1, 4, 1, 32 }; + int filter_shape[] = { 4, 1, 4, 1, 32 }; + int bias_shape[] = { 1, 32 }; + int output_shape[] = { 4, 1, 1, 1, 32 }; + const float input_values[] = { + 11.0589, 10.8824, 11.1766, 11.5295, 10.8236, 9.5295, 9.5295, 10.0001, + 11.2354, 10.8824, 9.1765, 9.0589, 9.6471, 8.9412, 7.9412, 9.0001, + 9.3530, 7.5295, 9.2354, 9.5883, 7.5883, 8.1765, 7.5883, 9.2942, + 9.1177, 8.5883, 8.2354, 8.6471, 8.0589, 8.0001, 7.4118, 7.3530, + 11.0001, 11.1177, 11.0589, 11.2354, 10.5883, 9.2942, 9.2942, 10.1177, + 11.2354, 10.8824, 8.9412, 8.8236, 9.2354, 8.8824, 7.0001, 9.1177, + 9.5883, 8.2354, 9.1765, 9.5295, 7.4118, 8.5883, 8.1177, 9.1765, + 9.0001, 9.0589, 8.9412, 8.2942, 7.8824, 8.4118, 7.2942, 7.2354, + 10.4118, 10.8824, 11.1177, 11.0001, 10.0001, 9.7060, 9.7648, 10.1766, + 11.1766, 10.6471, 8.6471, 8.5295, 9.5295, 9.0001, 7.0001, 9.4118, + 9.8236, 8.0001, 9.2354, 9.5883, 7.5295, 9.0001, 8.5295, 9.0589, + 8.9412, 9.1177, 8.9412, 8.0001, 8.0589, 8.8824, 7.0589, 7.3530, + 11.3530, 11.0589, 10.7060, 10.7648, 9.9413, 9.1177, 9.1177, 9.7648, + 10.7060, 10.2354, 8.5883, 8.8236, 9.7648, 9.2942, 7.5295, 9.2354, + 9.7060, 8.1177, 9.2942, 9.5883, 7.7648, 9.6471, 9.1177, 9.4707, + 9.3530, 8.8236, 8.5295, 8.0589, 8.6471, 9.5883, 7.4118, 7.5883 + }; + const float filter_values[] = { + -0.1617, -0.1948, 0.1419, -0.2311, -0.0891, 0.1551, 0.0033, 0.3037, + -0.1683, 0.1353, 0.1518, -0.1683, -0.1386, 0.1452, 0.1816, 0.1716, + -0.1948, 0.2080, 0.2245, -0.1981, -0.2410, 0.1849, 0.1981, 0.1584, + 0.2509, 0.1783, -0.2146, -0.1518, 0.2080, -0.2872, 0.2014, 0.2476, + -0.4126, -0.0561, -0.3235, -0.0594, -0.0957, 0.2014, -0.1056, 0.1386, + -0.2542, -0.1617, 0.1287, -0.1816, -0.0363, 0.1419, -0.0594, 0.2344, + -0.0099, 0.4192, 0.1287, -0.2311, -0.2212, -0.0528, -0.2080, 0.1816, + -0.1452, 0.1221, 0.1254, -0.1056, -0.0759, 0.1221, 0.1023, 0.1485, + 0.2707, 0.1716, -0.1882, -0.1783, 0.1650, -0.2740, 0.1915, 0.2080, + -0.2971, -0.2575, -0.3169, 0.0198, -0.0231, 0.2410, -0.0429, 0.0660, + -0.1816, 0.1981, 0.2014, -0.1386, -0.1915, 0.1716, 0.1320, 0.1419, + 0.1320, 0.1353, -0.1386, -0.1716, 0.1320, -0.1650, 0.1386, 0.0825, + -0.1419, -0.1023, 0.1783, 0.0462, 0.2047, -0.2179, -0.1518, -0.1551, + 0.1518, 0.3334, 0.3103, -0.2047, -0.2047, -0.0957, -0.1650, 0.1221, + 0.0990, 0.1353, -0.1617, -0.1485, 0.1650, -0.1816, 0.1518, 0.1254, + -0.0363, -0.1254, 0.1386, 0.0429, 0.2113, -0.2839, -0.1056, -0.2278 + }; + const float bias_values[] = { + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000 + }; + const float golden[] = { + -5.1194, -2.0075, -2.1751, -4.7958, 1.7073, -1.2963, -0.4641, 5.0416, + -6.4424, 0.3836, 2.4684, -4.7643, -3.8913, 3.8382, -0.5164, 5.4304, + -2.7400, 7.7016, 3.6115, -6.8545, -3.6290, 0.8509, 2.3247, 5.6117, + 1.8215, 2.7645, -0.7032, -3.2156, 3.9689, -5.4583, 2.4346, 1.7731 + }; + + // Quantization Parameters. All scales except output are 1.0, and all zero + // points are 0. This direct-maps the values to floating point and makes it + // easy to reson about them. + const float input_scale = 0.058824; + const float filter_scale = 0.003301; + const float output_scale = 0.092596; + const int input_zero_point = -128; + const int output_zero_point = 0; + + TfLiteIntArray *input_dims = tflite::testing::IntArrayFromInts(input_shape); + TfLiteIntArray *filter_dims = tflite::testing::IntArrayFromInts(filter_shape); + TfLiteIntArray *bias_dims = tflite::testing::IntArrayFromInts(bias_shape); + TfLiteIntArray *output_dims = tflite::testing::IntArrayFromInts(output_shape); + + // Create per-tensor quantized int8_t input tensor. + int8_t input_quantized[input_elements]; + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + input_values, input_quantized, input_dims, input_scale, input_zero_point); + + // Set zero point and scale arrays with a single element for each. + int input_zero_points[] = { 1, input_zero_point }; + float input_scales[] = { 1, input_scale }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + // Create per-tensor quantized int8_t filter tensor. + int8_t filter_quantized[filter_elements]; + TfLiteTensor filter_tensor = tflite::testing::CreateQuantizedTensor( + filter_values, filter_quantized, filter_dims, filter_scale, 0); + + // Set zero point and scale arrays with a single element for each. + int filter_zero_points[] = { 1, 0 }; + float filter_scales[] = { 1, filter_scale }; + TfLiteAffineQuantization filter_quant = { + tflite::testing::FloatArrayFromFloats(filter_scales), + tflite::testing::IntArrayFromInts(filter_zero_points), 0 + }; + filter_tensor.quantization = { kTfLiteAffineQuantization, &filter_quant }; + + // Create per-tensor quantized int32_t bias tensor. + int32_t bias_quantized[bias_elements]; + // See https://www.tensorflow.org/lite/performance/quantization_spec for a + // detailed explanation of why bias scale is input_scale * filter_scale. + tflite::SymmetricQuantize(bias_values, bias_quantized, bias_elements, + input_scale * output_scale); + TfLiteTensor bias_tensor = + tflite::testing::CreateTensor(bias_quantized, bias_dims); + + // Set zero point and scale arrays with a single element for each. + int bias_zero_points[] = { 1, 0 }; + float bias_scales[] = { 1, input_scale * filter_scale }; + TfLiteAffineQuantization bias_quant = { + tflite::testing::FloatArrayFromFloats(bias_scales), + tflite::testing::IntArrayFromInts(bias_zero_points), 0 + }; + bias_tensor.quantization = { kTfLiteAffineQuantization, &bias_quant }; + + // Create per-tensor quantized int8_t output tensor. + int8_t output_quantized[output_elements]; + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_quantized, output_dims, output_scale, output_zero_point); + + // Set zero point and scale arrays with a single element for each. + int output_zero_points[] = { 1, output_zero_point }; + float output_scales[] = { 1, output_scale }; + TfLiteAffineQuantization output_quant = { + tflite::testing::FloatArrayFromFloats(output_scales), + tflite::testing::IntArrayFromInts(output_zero_points), 0 + }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + // The 3 inputs include the input, filter and bias tensors. + constexpr int kInputsSize = 3; + constexpr int kOutputsSize = 1; + constexpr int kTensorsSize = kInputsSize + kOutputsSize; + TfLiteTensor tensors[kTensorsSize] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + int8_t golden_quantized[output_elements]; + tflite::Quantize(golden, golden_quantized, output_elements, output_scale, 0); + + // Errors due to quantization should not exceed 1. + constexpr int kQuantizationTolerance = 1; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 1; + conv_params.stride_width = 1; + tflite::testing::ValidateDepthwiseConvGoldens( + golden_quantized, output_elements, &conv_params, kQuantizationTolerance, + kTensorsSize, tensors); +} + +#if !defined(HIFIMINI) +// TODO(b/184087246): Remove this ifdef once the hifimini implementation is +// updated to be more general. +TF_LITE_MICRO_TEST(Int8Input32x1Filter32x1ShouldMatchGolden) +{ + const int input_elements = 32 * 1; + const int filter_elements = 32 * 1; + const int bias_elements = 32; + const int output_elements = 32; + int input_shape[] = { 4, 1, 1, 1, 32 }; + int filter_shape[] = { 4, 1, 1, 1, 32 }; + int bias_shape[] = { 1, 32 }; + int output_shape[] = { 4, 1, 1, 1, 32 }; + const float input_values[] = { + 11.0589, 10.8824, 11.1766, 11.5295, 10.8236, 9.5295, 9.5295, 10.0001, + 11.2354, 10.8824, 9.1765, 9.0589, 9.6471, 8.9412, 7.9412, 9.0001, + 9.3530, 7.5295, 9.2354, 9.5883, 7.5883, 8.1765, 7.5883, 9.2942, + 9.3530, 8.8236, 8.5295, 8.0589, 8.6471, 9.5883, 7.4118, 7.5883 + }; + const float filter_values[] = { + -0.1419, -0.1023, 0.1783, 0.0462, 0.2047, -0.2179, -0.1518, -0.1551, + 0.1518, 0.3334, 0.3103, -0.2047, -0.2047, -0.0957, -0.1650, 0.1221, + 0.0990, 0.1353, -0.1617, -0.1485, 0.1650, -0.1816, 0.1518, 0.1254, + -0.0363, -0.1254, 0.1386, 0.0429, 0.2113, -0.2839, -0.1056, -0.2278 + }; + const float bias_values[] = { + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000 + }; + const float golden[] = { + -1.5741, -1.1112, 2.0371, 0.5556, 2.2223, -2.0371, -1.4815, -1.5741, + 1.6667, 3.6112, 2.8705, -1.8519, -1.9445, -0.8334, -1.2963, 1.1112, + 0.9260, 1.0186, -1.4815, -1.3889, 1.2963, -1.4815, 1.1112, 1.2037, + -0.3704, -1.1112, 1.2037, 0.3704, 1.8519, -2.6853, -0.7408, -1.7593 + }; + + // Quantization Parameters. All scales except output are 1.0, and all zero + // points are 0. This direct-maps the values to floating point and makes it + // easy to reson about them. + const float input_scale = 0.058824; + const float filter_scale = 0.003301; + const float output_scale = 0.092596; + const int input_zero_point = -128; + const int output_zero_point = 0; + + TfLiteIntArray *input_dims = tflite::testing::IntArrayFromInts(input_shape); + TfLiteIntArray *filter_dims = tflite::testing::IntArrayFromInts(filter_shape); + TfLiteIntArray *bias_dims = tflite::testing::IntArrayFromInts(bias_shape); + TfLiteIntArray *output_dims = tflite::testing::IntArrayFromInts(output_shape); + + // Create per-tensor quantized int8_t input tensor. + int8_t input_quantized[input_elements]; + TfLiteTensor input_tensor = tflite::testing::CreateQuantizedTensor( + input_values, input_quantized, input_dims, input_scale, input_zero_point); + + // Set zero point and scale arrays with a single element for each. + int input_zero_points[] = { 1, input_zero_point }; + float input_scales[] = { 1, input_scale }; + TfLiteAffineQuantization input_quant = { + tflite::testing::FloatArrayFromFloats(input_scales), + tflite::testing::IntArrayFromInts(input_zero_points), 0 + }; + input_tensor.quantization = { kTfLiteAffineQuantization, &input_quant }; + + // Create per-tensor quantized int8_t filter tensor. + int8_t filter_quantized[filter_elements]; + TfLiteTensor filter_tensor = tflite::testing::CreateQuantizedTensor( + filter_values, filter_quantized, filter_dims, filter_scale, 0); + + // Set zero point and scale arrays with a single element for each. + int filter_zero_points[] = { 1, 0 }; + float filter_scales[] = { 1, filter_scale }; + TfLiteAffineQuantization filter_quant = { + tflite::testing::FloatArrayFromFloats(filter_scales), + tflite::testing::IntArrayFromInts(filter_zero_points), 0 + }; + filter_tensor.quantization = { kTfLiteAffineQuantization, &filter_quant }; + + // Create per-tensor quantized int32_t bias tensor. + int32_t bias_quantized[bias_elements]; + // See https://www.tensorflow.org/lite/performance/quantization_spec for a + // detailed explanation of why bias scale is input_scale * filter_scale. + tflite::SymmetricQuantize(bias_values, bias_quantized, bias_elements, + input_scale * output_scale); + TfLiteTensor bias_tensor = + tflite::testing::CreateTensor(bias_quantized, bias_dims); + + // Set zero point and scale arrays with a single element for each. + int bias_zero_points[] = { 1, 0 }; + float bias_scales[] = { 1, input_scale * filter_scale }; + TfLiteAffineQuantization bias_quant = { + tflite::testing::FloatArrayFromFloats(bias_scales), + tflite::testing::IntArrayFromInts(bias_zero_points), 0 + }; + bias_tensor.quantization = { kTfLiteAffineQuantization, &bias_quant }; + + // Create per-tensor quantized int8_t output tensor. + int8_t output_quantized[output_elements]; + TfLiteTensor output_tensor = tflite::testing::CreateQuantizedTensor( + output_quantized, output_dims, output_scale, output_zero_point); + + // Set zero point and scale arrays with a single element for each. + int output_zero_points[] = { 1, output_zero_point }; + float output_scales[] = { 1, output_scale }; + TfLiteAffineQuantization output_quant = { + tflite::testing::FloatArrayFromFloats(output_scales), + tflite::testing::IntArrayFromInts(output_zero_points), 0 + }; + output_tensor.quantization = { kTfLiteAffineQuantization, &output_quant }; + + // The 3 inputs include the input, filter and bias tensors. + constexpr int kInputsSize = 3; + constexpr int kOutputsSize = 1; + constexpr int kTensorsSize = kInputsSize + kOutputsSize; + TfLiteTensor tensors[kTensorsSize] = { + input_tensor, + filter_tensor, + bias_tensor, + output_tensor, + }; + + int8_t golden_quantized[output_elements]; + tflite::Quantize(golden, golden_quantized, output_elements, output_scale, 0); + + // Errors due to quantization should not exceed 1. + constexpr int kQuantizationTolerance = 1; + + TfLiteDepthwiseConvParams conv_params; + conv_params.activation = kTfLiteActNone; + conv_params.dilation_width_factor = 1; + conv_params.dilation_height_factor = 1; + conv_params.stride_height = 2; + conv_params.stride_width = 2; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::testing::ValidateDepthwiseConvGoldens( + golden_quantized, output_elements, &conv_params, + kQuantizationTolerance, kTensorsSize, tensors)); +} +#endif // !defined(HIFIMINI) + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize.cc new file mode 100644 index 00000000..14cb268e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize.cc @@ -0,0 +1,143 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/dequantize.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/quantize.h" +#include "tensorflow/lite/kernels/internal/reference/requantize.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace dequantize { + +struct OpData { + tflite::DequantizationParams quantization_params; + // The scaling factor from input to output (aka the 'real multiplier') can + // be represented as a fixed point multiplier plus a left shift. + int32_t output_multiplier; + int output_shift; + int32_t output_zero_point; +}; + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + // TODO(b/140515557): Add cached dequant to improve hybrid model performance. + const TfLiteTensor *input = GetInput(context, node, 0); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, 0); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE(context, input->type == kTfLiteUInt8 || + input->type == kTfLiteInt8 || + input->type == kTfLiteInt16); + TF_LITE_ENSURE(context, output->type == kTfLiteFloat32); + + if (output->type == kTfLiteInt32) { + const double effective_output_scale = + static_cast(input->params.scale) / + static_cast(output->params.scale); + QuantizeMultiplier(effective_output_scale, &data->output_multiplier, + &data->output_shift); + } + + data->quantization_params.zero_point = input->params.zero_point; + data->quantization_params.scale = static_cast(input->params.scale); + data->output_zero_point = output->params.zero_point; + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + + if (output->type == kTfLiteFloat32) { + switch (input->type) { + case kTfLiteUInt8: + reference_ops::Dequantize(data->quantization_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt8: + reference_ops::Dequantize(data->quantization_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt16: + reference_ops::Dequantize(data->quantization_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else { + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace dequantize + +TfLiteRegistration Register_DEQUANTIZE() +{ + return { /*init=*/dequantize::Init, + /*free=*/nullptr, + /*prepare=*/dequantize::Prepare, + /*invoke=*/dequantize::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize_test.cc new file mode 100644 index 00000000..e0e7a75f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/dequantize_test.cc @@ -0,0 +1,148 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void ValidateDequantizeGoldens(TfLiteTensor *tensors, int tensors_size, + const T *expected_output_data, T *output_data, + int output_length, float tolerance = 1e-5) +{ + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_DEQUANTIZE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 0.001f); + } +} + +template +void TestDequantizeToFloat(int *input_dims_data, const float *input_data, + T *input_data_quantized, float scale, int zero_point, + int *output_dims_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_length = ElementCount(*output_dims); + + // 1 input, 1 output. + const int tensors_size = 2; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_data_quantized, input_dims, scale, + zero_point), + CreateTensor(output_data, output_dims), + }; + + ValidateDequantizeGoldens(tensors, tensors_size, expected_output_data, + output_data, output_length); +} + +template +void TestDequantizeToInt32(int *input_dims_data, const float *input_data, + T *input_data_quantized, float input_scale, + int input_zero_point, int *output_dims_data, + const int32_t *expected_output_data, + float output_scale, int output_zero_point, + int32_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_length = ElementCount(*output_dims); + + // 1 input, 1 output. + const int tensors_size = 2; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_data_quantized, input_dims, + input_scale, input_zero_point), + CreateTensor(output_data, output_dims), + }; + + tensors[1].params.scale = output_scale; + tensors[1].params.zero_point = output_zero_point; + + ValidateDequantizeGoldens(tensors, tensors_size, expected_output_data, + output_data, output_length); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(DequantizeOpTestUint8) +{ + const int length = 10; + int dims[] = { 2, 5, 2 }; + const float values[] = { -63.5, -63, -62.5, -62, -61.5, + 62, 62.5, 63, 63.5, 64 }; + const float scale = 0.5; + const int zero_point = 127; + uint8_t input_quantized[length]; + float output[length]; + tflite::testing::TestDequantizeToFloat(dims, values, input_quantized, scale, + zero_point, dims, values, output); +} + +TF_LITE_MICRO_TEST(DequantizeOpTestInt8) +{ + const int length = 10; + int dims[] = { 2, 5, 2 }; + const float values[] = { -63.5, -63, -62.5, -62, -61.5, + 62, 62.5, 63, 63.5, 64 }; + const float scale = 0.5; + const int zero_point = -1; + int8_t input_quantized[length]; + float output[length]; + tflite::testing::TestDequantizeToFloat(dims, values, input_quantized, scale, + zero_point, dims, values, output); +} + +TF_LITE_MICRO_TEST(DequantizeOpTestInt16) +{ + const int length = 10; + int dims[] = { 2, 5, 2 }; + const float values[] = { -63.5, -63, -62.5, -62, -61.5, + 62, 62.5, 63, 63.5, 64 }; + const float scale = 0.5; + const int zero_point = -1; + int16_t input_quantized[length]; + float output[length]; + tflite::testing::TestDequantizeToFloat(dims, values, input_quantized, scale, + zero_point, dims, values, output); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess.cc new file mode 100644 index 00000000..d522b385 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess.cc @@ -0,0 +1,835 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +/** + * This version of detection_postprocess is specific to TFLite Micro. It + * contains the following differences between the TFLite version: + * + * 1.) Temporaries (temporary tensors) - Micro use instead scratch buffer API. + * 2.) Output dimensions - the TFLite version does not support undefined out + * dimensions. So model must have static out dimensions. + */ + +// Input tensors +constexpr int kInputTensorBoxEncodings = 0; +constexpr int kInputTensorClassPredictions = 1; +constexpr int kInputTensorAnchors = 2; + +// Output tensors +constexpr int kOutputTensorDetectionBoxes = 0; +constexpr int kOutputTensorDetectionClasses = 1; +constexpr int kOutputTensorDetectionScores = 2; +constexpr int kOutputTensorNumDetections = 3; + +constexpr int kNumCoordBox = 4; +constexpr int kBatchSize = 1; + +constexpr int kNumDetectionsPerClass = 100; + +// Object Detection model produces axis-aligned boxes in two formats: +// BoxCorner represents the lower left corner (xmin, ymin) and +// the upper right corner (xmax, ymax). +// CenterSize represents the center (xcenter, ycenter), height and width. +// BoxCornerEncoding and CenterSizeEncoding are related as follows: +// ycenter = y / y_scale * anchor.h + anchor.y; +// xcenter = x / x_scale * anchor.w + anchor.x; +// half_h = 0.5*exp(h/ h_scale)) * anchor.h; +// half_w = 0.5*exp(w / w_scale)) * anchor.w; +// ymin = ycenter - half_h +// ymax = ycenter + half_h +// xmin = xcenter - half_w +// xmax = xcenter + half_w +struct BoxCornerEncoding { + float ymin; + float xmin; + float ymax; + float xmax; +}; + +struct CenterSizeEncoding { + float y; + float x; + float h; + float w; +}; +// We make sure that the memory allocations are contiguous with static_assert. +static_assert(sizeof(BoxCornerEncoding) == sizeof(float) * kNumCoordBox, + "Size of BoxCornerEncoding is 4 float values"); +static_assert(sizeof(CenterSizeEncoding) == sizeof(float) * kNumCoordBox, + "Size of CenterSizeEncoding is 4 float values"); + +struct OpData { + int max_detections; + int max_classes_per_detection; // Fast Non-Max-Suppression + int detections_per_class; // Regular Non-Max-Suppression + float non_max_suppression_score_threshold; + float intersection_over_union_threshold; + int num_classes; + bool use_regular_non_max_suppression; + CenterSizeEncoding scale_values; + + // Scratch buffers indexes + int active_candidate_idx; + int decoded_boxes_idx; + int scores_idx; + int score_buffer_idx; + int keep_scores_idx; + int scores_after_regular_non_max_suppression_idx; + int sorted_values_idx; + int keep_indices_idx; + int sorted_indices_idx; + int buffer_idx; + int selected_idx; + + // Cached tensor scale and zero point values for quantized operations + TfLiteQuantizationParams input_box_encodings; + TfLiteQuantizationParams input_class_predictions; + TfLiteQuantizationParams input_anchors; +}; + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + OpData *op_data = nullptr; + + const uint8_t *buffer_t = reinterpret_cast(buffer); + + op_data = reinterpret_cast( + context->AllocatePersistentBuffer(context, sizeof(OpData))); + + const flexbuffers::Map &m = + micro::FlexbuffersWrapperGetRootAsMap(buffer_t, length); + + op_data->max_detections = + micro::FlexbuffersWrapperAsInt32(m, "max_detections"); + op_data->max_classes_per_detection = + micro::FlexbuffersWrapperAsInt32(m, "max_classes_per_detection"); + if (micro::FlexbuffersWrapperIsNull(m, "detections_per_class")) + op_data->detections_per_class = kNumDetectionsPerClass; + else + op_data->detections_per_class = + micro::FlexbuffersWrapperAsInt32(m, "detections_per_class"); + if (micro::FlexbuffersWrapperIsNull(m, "use_regular_nms")) + op_data->use_regular_non_max_suppression = false; + else + op_data->use_regular_non_max_suppression = + micro::FlexbuffersWrapperAsBool(m, "use_regular_nms"); + + op_data->non_max_suppression_score_threshold = + micro::FlexbuffersWrapperAsFloat(m, "nms_score_threshold"); + + op_data->intersection_over_union_threshold = + micro::FlexbuffersWrapperAsFloat(m, "nms_iou_threshold"); + op_data->num_classes = micro::FlexbuffersWrapperAsInt32(m, "num_classes"); + op_data->scale_values.y = micro::FlexbuffersWrapperAsFloat(m, "y_scale"); + op_data->scale_values.x = micro::FlexbuffersWrapperAsFloat(m, "x_scale"); + op_data->scale_values.h = micro::FlexbuffersWrapperAsFloat(m, "h_scale"); + op_data->scale_values.w = micro::FlexbuffersWrapperAsFloat(m, "w_scale"); + + return op_data; +} + +void Free(TfLiteContext *context, void *buffer) +{ +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + auto *op_data = static_cast(node->user_data); + + // Inputs: box_encodings, scores, anchors + TF_LITE_ENSURE_EQ(context, NumInputs(node), 3); + const TfLiteTensor *input_box_encodings = + GetInput(context, node, kInputTensorBoxEncodings); + const TfLiteTensor *input_class_predictions = + GetInput(context, node, kInputTensorClassPredictions); + const TfLiteTensor *input_anchors = + GetInput(context, node, kInputTensorAnchors); + TF_LITE_ENSURE_EQ(context, NumDimensions(input_box_encodings), 3); + TF_LITE_ENSURE_EQ(context, NumDimensions(input_class_predictions), 3); + TF_LITE_ENSURE_EQ(context, NumDimensions(input_anchors), 2); + + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 4); + const int num_boxes = input_box_encodings->dims->data[1]; + const int num_classes = op_data->num_classes; + + op_data->input_box_encodings.scale = input_box_encodings->params.scale; + op_data->input_box_encodings.zero_point = + input_box_encodings->params.zero_point; + op_data->input_class_predictions.scale = + input_class_predictions->params.scale; + op_data->input_class_predictions.zero_point = + input_class_predictions->params.zero_point; + op_data->input_anchors.scale = input_anchors->params.scale; + op_data->input_anchors.zero_point = input_anchors->params.zero_point; + + // Scratch tensors + context->RequestScratchBufferInArena(context, num_boxes, + &op_data->active_candidate_idx); + context->RequestScratchBufferInArena(context, + num_boxes * kNumCoordBox * sizeof(float), + &op_data->decoded_boxes_idx); + context->RequestScratchBufferInArena( + context, + input_class_predictions->dims->data[1] * + input_class_predictions->dims->data[2] * sizeof(float), + &op_data->scores_idx); + + // Additional buffers + context->RequestScratchBufferInArena(context, num_boxes * sizeof(float), + &op_data->score_buffer_idx); + context->RequestScratchBufferInArena(context, num_boxes * sizeof(float), + &op_data->keep_scores_idx); + context->RequestScratchBufferInArena( + context, op_data->max_detections * num_boxes * sizeof(float), + &op_data->scores_after_regular_non_max_suppression_idx); + context->RequestScratchBufferInArena( + context, op_data->max_detections * num_boxes * sizeof(float), + &op_data->sorted_values_idx); + context->RequestScratchBufferInArena(context, num_boxes * sizeof(int), + &op_data->keep_indices_idx); + context->RequestScratchBufferInArena( + context, op_data->max_detections * num_boxes * sizeof(int), + &op_data->sorted_indices_idx); + int buffer_size = std::max(num_classes, op_data->max_detections); + context->RequestScratchBufferInArena( + context, buffer_size * num_boxes * sizeof(int), &op_data->buffer_idx); + buffer_size = std::min(num_boxes, op_data->max_detections); + context->RequestScratchBufferInArena( + context, buffer_size * num_boxes * sizeof(int), &op_data->selected_idx); + + // Outputs: detection_boxes, detection_scores, detection_classes, + // num_detections + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 4); + + return kTfLiteOk; +} + +class Dequantizer { +public: + Dequantizer(int zero_point, float scale) + : zero_point_(zero_point), scale_(scale) + { + } + float operator()(uint8_t x) + { + return (static_cast(x) - zero_point_) * scale_; + } + +private: + int zero_point_; + float scale_; +}; + +void DequantizeBoxEncodings(const TfLiteEvalTensor *input_box_encodings, + int idx, float quant_zero_point, float quant_scale, + int length_box_encoding, + CenterSizeEncoding *box_centersize) +{ + const uint8_t *boxes = + tflite::micro::GetTensorData(input_box_encodings) + + length_box_encoding * idx; + Dequantizer dequantize(quant_zero_point, quant_scale); + // See definition of the KeyPointBoxCoder at + // https://github.com/tensorflow/models/blob/master/research/object_detection/box_coders/keypoint_box_coder.py + // The first four elements are the box coordinates, which is the same as the + // FastRnnBoxCoder at + // https://github.com/tensorflow/models/blob/master/research/object_detection/box_coders/faster_rcnn_box_coder.py + box_centersize->y = dequantize(boxes[0]); + box_centersize->x = dequantize(boxes[1]); + box_centersize->h = dequantize(boxes[2]); + box_centersize->w = dequantize(boxes[3]); +} + +template +T ReInterpretTensor(const TfLiteEvalTensor *tensor) +{ + const float *tensor_base = tflite::micro::GetTensorData(tensor); + return reinterpret_cast(tensor_base); +} + +template +T ReInterpretTensor(TfLiteEvalTensor *tensor) +{ + float *tensor_base = tflite::micro::GetTensorData(tensor); + return reinterpret_cast(tensor_base); +} + +TfLiteStatus DecodeCenterSizeBoxes(TfLiteContext *context, TfLiteNode *node, + OpData *op_data) +{ + // Parse input tensor boxencodings + const TfLiteEvalTensor *input_box_encodings = + tflite::micro::GetEvalInput(context, node, kInputTensorBoxEncodings); + TF_LITE_ENSURE_EQ(context, input_box_encodings->dims->data[0], kBatchSize); + const int num_boxes = input_box_encodings->dims->data[1]; + TF_LITE_ENSURE(context, input_box_encodings->dims->data[2] >= kNumCoordBox); + const TfLiteEvalTensor *input_anchors = + tflite::micro::GetEvalInput(context, node, kInputTensorAnchors); + + // Decode the boxes to get (ymin, xmin, ymax, xmax) based on the anchors + CenterSizeEncoding box_centersize; + CenterSizeEncoding scale_values = op_data->scale_values; + CenterSizeEncoding anchor; + for (int idx = 0; idx < num_boxes; ++idx) { + switch (input_box_encodings->type) { + // Quantized + case kTfLiteUInt8: + DequantizeBoxEncodings( + input_box_encodings, idx, + static_cast(op_data->input_box_encodings.zero_point), + static_cast(op_data->input_box_encodings.scale), + input_box_encodings->dims->data[2], &box_centersize); + DequantizeBoxEncodings( + input_anchors, idx, + static_cast(op_data->input_anchors.zero_point), + static_cast(op_data->input_anchors.scale), kNumCoordBox, + &anchor); + break; + // Float + case kTfLiteFloat32: { + // Please see DequantizeBoxEncodings function for the support detail. + const int box_encoding_idx = idx * input_box_encodings->dims->data[2]; + const float *boxes = &(tflite::micro::GetTensorData( + input_box_encodings)[box_encoding_idx]); + box_centersize = *reinterpret_cast(boxes); + anchor = + ReInterpretTensor(input_anchors)[idx]; + break; + } + default: + // Unsupported type. + return kTfLiteError; + } + + float ycenter = static_cast(static_cast(box_centersize.y) / + static_cast(scale_values.y) * + static_cast(anchor.h) + + static_cast(anchor.y)); + + float xcenter = static_cast(static_cast(box_centersize.x) / + static_cast(scale_values.x) * + static_cast(anchor.w) + + static_cast(anchor.x)); + + float half_h = + static_cast(0.5 * + (std::exp(static_cast(box_centersize.h) / + static_cast(scale_values.h))) * + static_cast(anchor.h)); + float half_w = + static_cast(0.5 * + (std::exp(static_cast(box_centersize.w) / + static_cast(scale_values.w))) * + static_cast(anchor.w)); + + float *decoded_boxes = reinterpret_cast( + context->GetScratchBuffer(context, op_data->decoded_boxes_idx)); + auto &box = reinterpret_cast(decoded_boxes)[idx]; + box.ymin = ycenter - half_h; + box.xmin = xcenter - half_w; + box.ymax = ycenter + half_h; + box.xmax = xcenter + half_w; + } + return kTfLiteOk; +} + +void DecreasingPartialArgSort(const float *values, int num_values, + int num_to_sort, int *indices) +{ + std::iota(indices, indices + num_values, 0); + std::partial_sort( + indices, indices + num_to_sort, indices + num_values, + [&values](const int i, const int j) { return values[i] > values[j]; }); +} + +int SelectDetectionsAboveScoreThreshold(const float *values, int size, + const float threshold, + float *keep_values, int *keep_indices) +{ + int counter = 0; + for (int i = 0; i < size; i++) { + if (values[i] >= threshold) { + keep_values[counter] = values[i]; + keep_indices[counter] = i; + counter++; + } + } + return counter; +} + +bool ValidateBoxes(const float *decoded_boxes, const int num_boxes) +{ + for (int i = 0; i < num_boxes; ++i) { + // ymax>=ymin, xmax>=xmin + auto &box = reinterpret_cast(decoded_boxes)[i]; + if (box.ymin >= box.ymax || box.xmin >= box.xmax) { + return false; + } + } + return true; +} + +float ComputeIntersectionOverUnion(const float *decoded_boxes, const int i, + const int j) +{ + auto &box_i = reinterpret_cast(decoded_boxes)[i]; + auto &box_j = reinterpret_cast(decoded_boxes)[j]; + const float area_i = (box_i.ymax - box_i.ymin) * (box_i.xmax - box_i.xmin); + const float area_j = (box_j.ymax - box_j.ymin) * (box_j.xmax - box_j.xmin); + if (area_i <= 0 || area_j <= 0) + return 0.0; + const float intersection_ymin = std::max(box_i.ymin, box_j.ymin); + const float intersection_xmin = std::max(box_i.xmin, box_j.xmin); + const float intersection_ymax = std::min(box_i.ymax, box_j.ymax); + const float intersection_xmax = std::min(box_i.xmax, box_j.xmax); + const float intersection_area = + std::max(intersection_ymax - intersection_ymin, 0.0) * + std::max(intersection_xmax - intersection_xmin, 0.0); + return intersection_area / (area_i + area_j - intersection_area); +} + +// NonMaxSuppressionSingleClass() prunes out the box locations with high overlap +// before selecting the highest scoring boxes (max_detections in number) +// It assumes all boxes are good in beginning and sorts based on the scores. +// If lower-scoring box has too much overlap with a higher-scoring box, +// we get rid of the lower-scoring box. +// Complexity is O(N^2) pairwise comparison between boxes +TfLiteStatus NonMaxSuppressionSingleClassHelper( + TfLiteContext *context, TfLiteNode *node, OpData *op_data, + const float *scores, int *selected, int *selected_size, + int max_detections) +{ + const TfLiteEvalTensor *input_box_encodings = + tflite::micro::GetEvalInput(context, node, kInputTensorBoxEncodings); + const int num_boxes = input_box_encodings->dims->data[1]; + const float non_max_suppression_score_threshold = + op_data->non_max_suppression_score_threshold; + const float intersection_over_union_threshold = + op_data->intersection_over_union_threshold; + // Maximum detections should be positive. + TF_LITE_ENSURE(context, (max_detections >= 0)); + // intersection_over_union_threshold should be positive + // and should be less than 1. + TF_LITE_ENSURE(context, (intersection_over_union_threshold > 0.0f) && + (intersection_over_union_threshold <= 1.0f)); + // Validate boxes + float *decoded_boxes = reinterpret_cast( + context->GetScratchBuffer(context, op_data->decoded_boxes_idx)); + + TF_LITE_ENSURE(context, ValidateBoxes(decoded_boxes, num_boxes)); + + // threshold scores + int *keep_indices = reinterpret_cast( + context->GetScratchBuffer(context, op_data->keep_indices_idx)); + float *keep_scores = reinterpret_cast( + context->GetScratchBuffer(context, op_data->keep_scores_idx)); + int num_scores_kept = SelectDetectionsAboveScoreThreshold( + scores, num_boxes, non_max_suppression_score_threshold, keep_scores, + keep_indices); + int *sorted_indices = reinterpret_cast( + context->GetScratchBuffer(context, op_data->sorted_indices_idx)); + + DecreasingPartialArgSort(keep_scores, num_scores_kept, num_scores_kept, + sorted_indices); + + const int num_boxes_kept = num_scores_kept; + const int output_size = std::min(num_boxes_kept, max_detections); + *selected_size = 0; + + int num_active_candidate = num_boxes_kept; + uint8_t *active_box_candidate = reinterpret_cast( + context->GetScratchBuffer(context, op_data->active_candidate_idx)); + + for (int row = 0; row < num_boxes_kept; row++) { + active_box_candidate[row] = 1; + } + for (int i = 0; i < num_boxes_kept; ++i) { + if (num_active_candidate == 0 || *selected_size >= output_size) + break; + if (active_box_candidate[i] == 1) { + selected[(*selected_size)++] = keep_indices[sorted_indices[i]]; + active_box_candidate[i] = 0; + num_active_candidate--; + } else { + continue; + } + for (int j = i + 1; j < num_boxes_kept; ++j) { + if (active_box_candidate[j] == 1) { + float intersection_over_union = ComputeIntersectionOverUnion( + decoded_boxes, keep_indices[sorted_indices[i]], + keep_indices[sorted_indices[j]]); + + if (intersection_over_union > intersection_over_union_threshold) { + active_box_candidate[j] = 0; + num_active_candidate--; + } + } + } + } + + return kTfLiteOk; +} + +// This function implements a regular version of Non Maximal Suppression (NMS) +// for multiple classes where +// 1) we do NMS separately for each class across all anchors and +// 2) keep only the highest anchor scores across all classes +// 3) The worst runtime of the regular NMS is O(K*N^2) +// where N is the number of anchors and K the number of +// classes. +TfLiteStatus NonMaxSuppressionMultiClassRegularHelper(TfLiteContext *context, + TfLiteNode *node, + OpData *op_data, + const float *scores) +{ + const TfLiteEvalTensor *input_box_encodings = + tflite::micro::GetEvalInput(context, node, kInputTensorBoxEncodings); + const TfLiteEvalTensor *input_class_predictions = + tflite::micro::GetEvalInput(context, node, kInputTensorClassPredictions); + TfLiteEvalTensor *detection_boxes = + tflite::micro::GetEvalOutput(context, node, kOutputTensorDetectionBoxes); + TfLiteEvalTensor *detection_classes = tflite::micro::GetEvalOutput( + context, node, kOutputTensorDetectionClasses); + TfLiteEvalTensor *detection_scores = + tflite::micro::GetEvalOutput(context, node, kOutputTensorDetectionScores); + TfLiteEvalTensor *num_detections = + tflite::micro::GetEvalOutput(context, node, kOutputTensorNumDetections); + + const int num_boxes = input_box_encodings->dims->data[1]; + const int num_classes = op_data->num_classes; + const int num_detections_per_class = op_data->detections_per_class; + const int max_detections = op_data->max_detections; + const int num_classes_with_background = + input_class_predictions->dims->data[2]; + // The row index offset is 1 if background class is included and 0 otherwise. + int label_offset = num_classes_with_background - num_classes; + TF_LITE_ENSURE(context, num_detections_per_class > 0); + + // For each class, perform non-max suppression. + float *class_scores = reinterpret_cast( + context->GetScratchBuffer(context, op_data->score_buffer_idx)); + int *box_indices_after_regular_non_max_suppression = reinterpret_cast( + context->GetScratchBuffer(context, op_data->buffer_idx)); + float *scores_after_regular_non_max_suppression = + reinterpret_cast(context->GetScratchBuffer( + context, op_data->scores_after_regular_non_max_suppression_idx)); + + int size_of_sorted_indices = 0; + int *sorted_indices = reinterpret_cast( + context->GetScratchBuffer(context, op_data->sorted_indices_idx)); + float *sorted_values = reinterpret_cast( + context->GetScratchBuffer(context, op_data->sorted_values_idx)); + + for (int col = 0; col < num_classes; col++) { + for (int row = 0; row < num_boxes; row++) { + // Get scores of boxes corresponding to all anchors for single class + class_scores[row] = + *(scores + row * num_classes_with_background + col + label_offset); + } + // Perform non-maximal suppression on single class + int selected_size = 0; + int *selected = reinterpret_cast( + context->GetScratchBuffer(context, op_data->selected_idx)); + TF_LITE_ENSURE_STATUS(NonMaxSuppressionSingleClassHelper( + context, node, op_data, class_scores, selected, &selected_size, + num_detections_per_class)); + // Add selected indices from non-max suppression of boxes in this class + int output_index = size_of_sorted_indices; + for (int i = 0; i < selected_size; i++) { + int selected_index = selected[i]; + + box_indices_after_regular_non_max_suppression[output_index] = + (selected_index * num_classes_with_background + col + label_offset); + scores_after_regular_non_max_suppression[output_index] = + class_scores[selected_index]; + output_index++; + } + // Sort the max scores among the selected indices + // Get the indices for top scores + int num_indices_to_sort = std::min(output_index, max_detections); + DecreasingPartialArgSort(scores_after_regular_non_max_suppression, + output_index, num_indices_to_sort, sorted_indices); + + // Copy values to temporary vectors + for (int row = 0; row < num_indices_to_sort; row++) { + int temp = sorted_indices[row]; + sorted_indices[row] = box_indices_after_regular_non_max_suppression[temp]; + sorted_values[row] = scores_after_regular_non_max_suppression[temp]; + } + // Copy scores and indices from temporary vectors + for (int row = 0; row < num_indices_to_sort; row++) { + box_indices_after_regular_non_max_suppression[row] = sorted_indices[row]; + scores_after_regular_non_max_suppression[row] = sorted_values[row]; + } + size_of_sorted_indices = num_indices_to_sort; + } + + // Allocate output tensors + for (int output_box_index = 0; output_box_index < max_detections; + output_box_index++) { + if (output_box_index < size_of_sorted_indices) { + const int anchor_index = floor( + box_indices_after_regular_non_max_suppression[output_box_index] / + num_classes_with_background); + const int class_index = + box_indices_after_regular_non_max_suppression[output_box_index] - + anchor_index * num_classes_with_background - label_offset; + const float selected_score = + scores_after_regular_non_max_suppression[output_box_index]; + // detection_boxes + float *decoded_boxes = reinterpret_cast( + context->GetScratchBuffer(context, op_data->decoded_boxes_idx)); + ReInterpretTensor(detection_boxes)[output_box_index] = + reinterpret_cast(decoded_boxes)[anchor_index]; + // detection_classes + tflite::micro::GetTensorData(detection_classes)[output_box_index] = + class_index; + // detection_scores + tflite::micro::GetTensorData(detection_scores)[output_box_index] = + selected_score; + } else { + ReInterpretTensor( + detection_boxes)[output_box_index] = { 0.0f, 0.0f, 0.0f, 0.0f }; + // detection_classes + tflite::micro::GetTensorData(detection_classes)[output_box_index] = + 0.0f; + // detection_scores + tflite::micro::GetTensorData(detection_scores)[output_box_index] = + 0.0f; + } + } + tflite::micro::GetTensorData(num_detections)[0] = + size_of_sorted_indices; + + return kTfLiteOk; +} + +// This function implements a fast version of Non Maximal Suppression for +// multiple classes where +// 1) we keep the top-k scores for each anchor and +// 2) during NMS, each anchor only uses the highest class score for sorting. +// 3) Compared to standard NMS, the worst runtime of this version is O(N^2) +// instead of O(KN^2) where N is the number of anchors and K the number of +// classes. +TfLiteStatus NonMaxSuppressionMultiClassFastHelper(TfLiteContext *context, + TfLiteNode *node, + OpData *op_data, + const float *scores) +{ + const TfLiteEvalTensor *input_box_encodings = + tflite::micro::GetEvalInput(context, node, kInputTensorBoxEncodings); + const TfLiteEvalTensor *input_class_predictions = + tflite::micro::GetEvalInput(context, node, kInputTensorClassPredictions); + TfLiteEvalTensor *detection_boxes = + tflite::micro::GetEvalOutput(context, node, kOutputTensorDetectionBoxes); + + TfLiteEvalTensor *detection_classes = tflite::micro::GetEvalOutput( + context, node, kOutputTensorDetectionClasses); + TfLiteEvalTensor *detection_scores = + tflite::micro::GetEvalOutput(context, node, kOutputTensorDetectionScores); + TfLiteEvalTensor *num_detections = + tflite::micro::GetEvalOutput(context, node, kOutputTensorNumDetections); + + const int num_boxes = input_box_encodings->dims->data[1]; + const int num_classes = op_data->num_classes; + const int max_categories_per_anchor = op_data->max_classes_per_detection; + const int num_classes_with_background = + input_class_predictions->dims->data[2]; + + // The row index offset is 1 if background class is included and 0 otherwise. + int label_offset = num_classes_with_background - num_classes; + TF_LITE_ENSURE(context, (max_categories_per_anchor > 0)); + const int num_categories_per_anchor = + std::min(max_categories_per_anchor, num_classes); + float *max_scores = reinterpret_cast( + context->GetScratchBuffer(context, op_data->score_buffer_idx)); + int *sorted_class_indices = reinterpret_cast( + context->GetScratchBuffer(context, op_data->buffer_idx)); + + for (int row = 0; row < num_boxes; row++) { + const float *box_scores = + scores + row * num_classes_with_background + label_offset; + int *class_indices = sorted_class_indices + row * num_classes; + DecreasingPartialArgSort(box_scores, num_classes, num_categories_per_anchor, + class_indices); + max_scores[row] = box_scores[class_indices[0]]; + } + + // Perform non-maximal suppression on max scores + int selected_size = 0; + int *selected = reinterpret_cast( + context->GetScratchBuffer(context, op_data->selected_idx)); + TF_LITE_ENSURE_STATUS(NonMaxSuppressionSingleClassHelper( + context, node, op_data, max_scores, selected, &selected_size, + op_data->max_detections)); + + // Allocate output tensors + int output_box_index = 0; + + for (int i = 0; i < selected_size; i++) { + int selected_index = selected[i]; + + const float *box_scores = + scores + selected_index * num_classes_with_background + label_offset; + const int *class_indices = + sorted_class_indices + selected_index * num_classes; + + for (int col = 0; col < num_categories_per_anchor; ++col) { + int box_offset = num_categories_per_anchor * output_box_index + col; + + // detection_boxes + float *decoded_boxes = reinterpret_cast( + context->GetScratchBuffer(context, op_data->decoded_boxes_idx)); + ReInterpretTensor(detection_boxes)[box_offset] = + reinterpret_cast(decoded_boxes)[selected_index]; + + // detection_classes + tflite::micro::GetTensorData(detection_classes)[box_offset] = + class_indices[col]; + + // detection_scores + tflite::micro::GetTensorData(detection_scores)[box_offset] = + box_scores[class_indices[col]]; + + output_box_index++; + } + } + + tflite::micro::GetTensorData(num_detections)[0] = output_box_index; + return kTfLiteOk; +} + +void DequantizeClassPredictions(const TfLiteEvalTensor *input_class_predictions, + const int num_boxes, + const int num_classes_with_background, + float *scores, OpData *op_data) +{ + float quant_zero_point = + static_cast(op_data->input_class_predictions.zero_point); + float quant_scale = + static_cast(op_data->input_class_predictions.scale); + Dequantizer dequantize(quant_zero_point, quant_scale); + const uint8_t *scores_quant = + tflite::micro::GetTensorData(input_class_predictions); + for (int idx = 0; idx < num_boxes * num_classes_with_background; ++idx) { + scores[idx] = dequantize(scores_quant[idx]); + } +} + +TfLiteStatus NonMaxSuppressionMultiClass(TfLiteContext *context, + TfLiteNode *node, OpData *op_data) +{ + // Get the input tensors + const TfLiteEvalTensor *input_box_encodings = + tflite::micro::GetEvalInput(context, node, kInputTensorBoxEncodings); + const TfLiteEvalTensor *input_class_predictions = + tflite::micro::GetEvalInput(context, node, kInputTensorClassPredictions); + const int num_boxes = input_box_encodings->dims->data[1]; + const int num_classes = op_data->num_classes; + + TF_LITE_ENSURE_EQ(context, input_class_predictions->dims->data[0], + kBatchSize); + TF_LITE_ENSURE_EQ(context, input_class_predictions->dims->data[1], num_boxes); + const int num_classes_with_background = + input_class_predictions->dims->data[2]; + + TF_LITE_ENSURE(context, (num_classes_with_background - num_classes <= 1)); + TF_LITE_ENSURE(context, (num_classes_with_background >= num_classes)); + + const float *scores; + switch (input_class_predictions->type) { + case kTfLiteUInt8: { + float *temporary_scores = reinterpret_cast( + context->GetScratchBuffer(context, op_data->scores_idx)); + DequantizeClassPredictions(input_class_predictions, num_boxes, + num_classes_with_background, temporary_scores, + op_data); + scores = temporary_scores; + } break; + case kTfLiteFloat32: + scores = tflite::micro::GetTensorData(input_class_predictions); + break; + default: + // Unsupported type. + return kTfLiteError; + } + + if (op_data->use_regular_non_max_suppression) { + TF_LITE_ENSURE_STATUS(NonMaxSuppressionMultiClassRegularHelper( + context, node, op_data, scores)); + } else { + TF_LITE_ENSURE_STATUS( + NonMaxSuppressionMultiClassFastHelper(context, node, op_data, scores)); + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE(context, (kBatchSize == 1)); + auto *op_data = static_cast(node->user_data); + + // These two functions correspond to two blocks in the Object Detection model. + // In future, we would like to break the custom op in two blocks, which is + // currently not feasible because we would like to input quantized inputs + // and do all calculations in float. Mixed quantized/float calculations are + // currently not supported in TFLite. + + // This fills in temporary decoded_boxes + // by transforming input_box_encodings and input_anchors from + // CenterSizeEncodings to BoxCornerEncoding + TF_LITE_ENSURE_STATUS(DecodeCenterSizeBoxes(context, node, op_data)); + + // This fills in the output tensors + // by choosing effective set of decoded boxes + // based on Non Maximal Suppression, i.e. selecting + // highest scoring non-overlapping boxes. + TF_LITE_ENSURE_STATUS(NonMaxSuppressionMultiClass(context, node, op_data)); + + return kTfLiteOk; +} +} // namespace + +TfLiteRegistration *Register_DETECTION_POSTPROCESS() +{ + static TfLiteRegistration r = { /*init=*/Init, + /*free=*/Free, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; + return &r; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.cc new file mode 100644 index 00000000..9f05f66c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.cc @@ -0,0 +1,510 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// This file is generated. See: +// tensorflow/lite/micro/kernels/detection_postprocess_test/README.md + +#include "tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.h" + +const int g_gen_data_size_none_regular_nms = 242; +const unsigned char g_gen_data_none_regular_nms[] = { + 0x6d, + 0x61, + 0x78, + 0x5f, + 0x64, + 0x65, + 0x74, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x73, + 0x00, + 0x6d, + 0x61, + 0x78, + 0x5f, + 0x63, + 0x6c, + 0x61, + 0x73, + 0x73, + 0x65, + 0x73, + 0x5f, + 0x70, + 0x65, + 0x72, + 0x5f, + 0x64, + 0x65, + 0x74, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x00, + 0x64, + 0x65, + 0x74, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x73, + 0x5f, + 0x70, + 0x65, + 0x72, + 0x5f, + 0x63, + 0x6c, + 0x61, + 0x73, + 0x73, + 0x00, + 0x75, + 0x73, + 0x65, + 0x5f, + 0x72, + 0x65, + 0x67, + 0x75, + 0x6c, + 0x61, + 0x72, + 0x5f, + 0x6e, + 0x6d, + 0x73, + 0x00, + 0x6e, + 0x6d, + 0x73, + 0x5f, + 0x73, + 0x63, + 0x6f, + 0x72, + 0x65, + 0x5f, + 0x74, + 0x68, + 0x72, + 0x65, + 0x73, + 0x68, + 0x6f, + 0x6c, + 0x64, + 0x00, + 0x6e, + 0x6d, + 0x73, + 0x5f, + 0x69, + 0x6f, + 0x75, + 0x5f, + 0x74, + 0x68, + 0x72, + 0x65, + 0x73, + 0x68, + 0x6f, + 0x6c, + 0x64, + 0x00, + 0x6e, + 0x75, + 0x6d, + 0x5f, + 0x63, + 0x6c, + 0x61, + 0x73, + 0x73, + 0x65, + 0x73, + 0x00, + 0x79, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x78, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x68, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x77, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x0b, + 0x78, + 0x12, + 0x94, + 0xa4, + 0x43, + 0x58, + 0x33, + 0x6a, + 0x11, + 0x22, + 0x2b, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x40, + 0x01, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x40, + 0x00, + 0x00, + 0x20, + 0x41, + 0x00, + 0x00, + 0x20, + 0x41, + 0x06, + 0x0e, + 0x06, + 0x06, + 0x0e, + 0x0e, + 0x06, + 0x6a, + 0x0e, + 0x0e, + 0x0e, + 0x37, + 0x26, + 0x01, +}; +const int g_gen_data_size_regular_nms = 242; +const unsigned char g_gen_data_regular_nms[] = { + 0x6d, + 0x61, + 0x78, + 0x5f, + 0x64, + 0x65, + 0x74, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x73, + 0x00, + 0x6d, + 0x61, + 0x78, + 0x5f, + 0x63, + 0x6c, + 0x61, + 0x73, + 0x73, + 0x65, + 0x73, + 0x5f, + 0x70, + 0x65, + 0x72, + 0x5f, + 0x64, + 0x65, + 0x74, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x00, + 0x64, + 0x65, + 0x74, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x73, + 0x5f, + 0x70, + 0x65, + 0x72, + 0x5f, + 0x63, + 0x6c, + 0x61, + 0x73, + 0x73, + 0x00, + 0x75, + 0x73, + 0x65, + 0x5f, + 0x72, + 0x65, + 0x67, + 0x75, + 0x6c, + 0x61, + 0x72, + 0x5f, + 0x6e, + 0x6d, + 0x73, + 0x00, + 0x6e, + 0x6d, + 0x73, + 0x5f, + 0x73, + 0x63, + 0x6f, + 0x72, + 0x65, + 0x5f, + 0x74, + 0x68, + 0x72, + 0x65, + 0x73, + 0x68, + 0x6f, + 0x6c, + 0x64, + 0x00, + 0x6e, + 0x6d, + 0x73, + 0x5f, + 0x69, + 0x6f, + 0x75, + 0x5f, + 0x74, + 0x68, + 0x72, + 0x65, + 0x73, + 0x68, + 0x6f, + 0x6c, + 0x64, + 0x00, + 0x6e, + 0x75, + 0x6d, + 0x5f, + 0x63, + 0x6c, + 0x61, + 0x73, + 0x73, + 0x65, + 0x73, + 0x00, + 0x79, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x78, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x68, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x77, + 0x5f, + 0x73, + 0x63, + 0x61, + 0x6c, + 0x65, + 0x00, + 0x0b, + 0x78, + 0x12, + 0x94, + 0xa4, + 0x43, + 0x58, + 0x33, + 0x6a, + 0x11, + 0x22, + 0x2b, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x0b, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x40, + 0x01, + 0x00, + 0x00, + 0x00, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xa0, + 0x40, + 0x00, + 0x00, + 0x20, + 0x41, + 0x00, + 0x00, + 0x20, + 0x41, + 0x06, + 0x0e, + 0x06, + 0x06, + 0x0e, + 0x0e, + 0x06, + 0x6a, + 0x0e, + 0x0e, + 0x0e, + 0x37, + 0x26, + 0x01, +}; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.h new file mode 100644 index 00000000..f5b9eae0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.h @@ -0,0 +1,25 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_FLEXBUFFERS_GENERATED_DATA_H +#define TENSORFLOW_LITE_MICRO_KERNELS_FLEXBUFFERS_GENERATED_DATA_H + +extern const int g_gen_data_size_none_regular_nms; +extern const unsigned char g_gen_data_none_regular_nms[]; + +extern const int g_gen_data_size_regular_nms; +extern const unsigned char g_gen_data_regular_nms[]; + +#endif diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_test.cc new file mode 100644 index 00000000..97eef858 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/detection_postprocess_test.cc @@ -0,0 +1,472 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "flatbuffers/flexbuffers.h" +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +// See: tensorflow/lite/micro/kernels/detection_postprocess_test/README.md +#include "tensorflow/lite/micro/kernels/detection_postprocess_flexbuffers_generated_data.h" + +namespace tflite { +namespace testing { +namespace { + +// Common inputs and outputs. + +int kInputShape1[] = { 3, 1, 6, 4 }; +int kInputShape2[] = { 3, 1, 6, 3 }; +int kInputShape3[] = { 2, 6, 4 }; +int kOutputShape1[] = { 3, 1, 3, 4 }; +int kOutputShape2[] = { 2, 1, 3 }; +int kOutputShape3[] = { 2, 1, 3 }; +int kOutputShape4[] = { 1, 1 }; + +// six boxes in center-size encoding +constexpr float kInputData1[] = { + 0.0, 0.0, 0.0, 0.0, // box #1 + 0.0, 1.0, 0.0, 0.0, // box #2 + 0.0, -1.0, 0.0, 0.0, // box #3 + 0.0, 0.0, 0.0, 0.0, // box #4 + 0.0, 1.0, 0.0, 0.0, // box #5 + 0.0, 0.0, 0.0, 0.0 // box #6 +}; + +// class scores - two classes with background +constexpr float kInputData2[] = { 0., .9, .8, 0., .75, .72, 0., .6, .5, + 0., .93, .95, 0., .5, .4, 0., .3, .2 }; + +// six anchors in center-size encoding +constexpr float kInputData3[] = { + 0.5, 0.5, 1.0, 1.0, // anchor #1 + 0.5, 0.5, 1.0, 1.0, // anchor #2 + 0.5, 0.5, 1.0, 1.0, // anchor #3 + 0.5, 10.5, 1.0, 1.0, // anchor #4 + 0.5, 10.5, 1.0, 1.0, // anchor #5 + 0.5, 100.5, 1.0, 1.0 // anchor #6 +}; +// Same boxes in box-corner encoding: +// { 0.0, 0.0, 1.0, 1.0, +// 0.0, 0.1, 1.0, 1.1, +// 0.0, -0.1, 1.0, 0.9, +// 0.0, 10.0, 1.0, 11.0, +// 0.0, 10.1, 1.0, 11.1, +// 0.0, 100.0, 1.0, 101.0} + +constexpr float kGolden1[] = { 0.0, 10.0, 1.0, 11.0, 0.0, 0.0, + 1.0, 1.0, 0.0, 100.0, 1.0, 101.0 }; +constexpr float kGolden2[] = { 1, 0, 0 }; +constexpr float kGolden3[] = { 0.95, 0.9, 0.3 }; +constexpr float kGolden4[] = { 3.0 }; + +void TestDetectionPostprocess( + int *input_dims_data1, const float *input_data1, int *input_dims_data2, + const float *input_data2, int *input_dims_data3, const float *input_data3, + int *output_dims_data1, float *output_data1, int *output_dims_data2, + float *output_data2, int *output_dims_data3, float *output_data3, + int *output_dims_data4, float *output_data4, const float *golden1, + const float *golden2, const float *golden3, const float *golden4, + const float tolerance, bool use_regular_nms, + uint8_t *input_data_quantized1 = nullptr, + uint8_t *input_data_quantized2 = nullptr, + uint8_t *input_data_quantized3 = nullptr, const float input_min1 = 0, + const float input_max1 = 0, const float input_min2 = 0, + const float input_max2 = 0, const float input_min3 = 0, + const float input_max3 = 0) +{ + TfLiteIntArray *input_dims1 = IntArrayFromInts(input_dims_data1); + TfLiteIntArray *input_dims2 = IntArrayFromInts(input_dims_data2); + TfLiteIntArray *input_dims3 = IntArrayFromInts(input_dims_data3); + TfLiteIntArray *output_dims1 = IntArrayFromInts(output_dims_data1); + TfLiteIntArray *output_dims2 = IntArrayFromInts(output_dims_data2); + TfLiteIntArray *output_dims3 = IntArrayFromInts(output_dims_data3); + TfLiteIntArray *output_dims4 = IntArrayFromInts(output_dims_data4); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 4; + constexpr int tensors_size = inputs_size + outputs_size; + + TfLiteTensor tensors[tensors_size]; + if (input_min1 != 0 || input_max1 != 0 || input_min2 != 0 || + input_max2 != 0 || input_min3 != 0 || input_max3 != 0) { + const float input_scale1 = ScaleFromMinMax(input_min1, input_max1); + const int input_zero_point1 = + ZeroPointFromMinMax(input_min1, input_max1); + const float input_scale2 = ScaleFromMinMax(input_min2, input_max2); + const int input_zero_point2 = + ZeroPointFromMinMax(input_min2, input_max2); + const float input_scale3 = ScaleFromMinMax(input_min3, input_max3); + const int input_zero_point3 = + ZeroPointFromMinMax(input_min3, input_max3); + + tensors[0] = + CreateQuantizedTensor(input_data1, input_data_quantized1, input_dims1, + input_scale1, input_zero_point1); + tensors[1] = + CreateQuantizedTensor(input_data2, input_data_quantized2, input_dims2, + input_scale2, input_zero_point2); + tensors[2] = + CreateQuantizedTensor(input_data3, input_data_quantized3, input_dims3, + input_scale3, input_zero_point3); + } else { + tensors[0] = CreateTensor(input_data1, input_dims1); + tensors[1] = CreateTensor(input_data2, input_dims2); + tensors[2] = CreateTensor(input_data3, input_dims3); + } + tensors[3] = CreateTensor(output_data1, output_dims1); + tensors[4] = CreateTensor(output_data2, output_dims2); + tensors[5] = CreateTensor(output_data3, output_dims3); + tensors[6] = CreateTensor(output_data4, output_dims4); + + ::tflite::AllOpsResolver resolver; + const TfLiteRegistration *registration = + resolver.FindOp("TFLite_Detection_PostProcess"); + TF_LITE_MICRO_EXPECT_NE(nullptr, registration); + + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 4, 3, 4, 5, 6 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(*registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + // Using generated data as input to operator. + int data_size = 0; + const unsigned char *init_data = nullptr; + if (use_regular_nms) { + init_data = g_gen_data_regular_nms; + data_size = g_gen_data_size_regular_nms; + } else { + init_data = g_gen_data_none_regular_nms; + data_size = g_gen_data_size_none_regular_nms; + } + + // TfLite uses a char* for the raw bytes whereas flexbuffers use an unsigned + // char*. This small discrepancy results in compiler warnings unless we + // reinterpret_cast right before passing in the flexbuffer bytes to the + // KernelRunner. + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, runner.InitAndPrepare(reinterpret_cast(init_data), + data_size)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + int output_elements_count1 = ElementCount(*tensors[3].dims); + int output_elements_count2 = ElementCount(*tensors[4].dims); + int output_elements_count3 = ElementCount(*tensors[5].dims); + int output_elements_count4 = ElementCount(*tensors[6].dims); + + for (int i = 0; i < output_elements_count1; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden1[i], output_data1[i], tolerance); + } + for (int i = 0; i < output_elements_count2; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden2[i], output_data2[i], tolerance); + } + for (int i = 0; i < output_elements_count3; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden3[i], output_data3[i], tolerance); + } + for (int i = 0; i < output_elements_count4; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden4[i], output_data4[i], tolerance); + } +} +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(DetectionPostprocessFloatFastNMS) +{ + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + + tflite::testing::TestDetectionPostprocess( + tflite::testing::kInputShape1, tflite::testing::kInputData1, + tflite::testing::kInputShape2, tflite::testing::kInputData2, + tflite::testing::kInputShape3, tflite::testing::kInputData3, + tflite::testing::kOutputShape1, output_data1, + tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, tflite::testing::kGolden1, + tflite::testing::kGolden2, tflite::testing::kGolden3, + tflite::testing::kGolden4, + /* tolerance */ 0, /* Use regular NMS: */ false); +} + +TF_LITE_MICRO_TEST(DetectionPostprocessQuantizedFastNMS) +{ + int kInputShape1[] = { 3, 1, 6, 4 }; + int kInputShape2[] = { 3, 1, 6, 3 }; + int kInputShape3[] = { 2, 6, 4 }; + int kOutputShape1[] = { 3, 1, 3, 4 }; + int kOutputShape2[] = { 2, 1, 3 }; + int kOutputShape3[] = { 2, 1, 3 }; + int kOutputShape4[] = { 1, 1 }; + + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + constexpr int kInputElements1 = + 1 * 6 * + 4; // tflite::testing::kInputShape1[1] * tflite::testing::kInputShape1[2] + // * tflite::testing::kInputShape1[3]; + constexpr int kInputElements2 = + 1 * 6 * + 3; // tflite::testing::kInputShape2[1] * tflite::testing::kInputShape2[2] + // * tflite::testing::kInputShape2[3]; + constexpr int kInputElements3 = 6 * 4; // tflite::testing::kInputShape3[1] * + // tflite::testing::kInputShape3[2]; + + uint8_t input_data_quantized1[kInputElements1]; + uint8_t input_data_quantized2[kInputElements2]; + uint8_t input_data_quantized3[kInputElements3]; + + tflite::testing::TestDetectionPostprocess( + kInputShape1, tflite::testing::kInputData1, kInputShape2, + tflite::testing::kInputData2, kInputShape3, tflite::testing::kInputData3, + kOutputShape1, output_data1, kOutputShape2, output_data2, kOutputShape3, + output_data3, kOutputShape4, output_data4, tflite::testing::kGolden1, + tflite::testing::kGolden2, tflite::testing::kGolden3, + tflite::testing::kGolden4, + /* tolerance */ 3e-1, /* Use regular NMS: */ false, input_data_quantized1, + input_data_quantized2, input_data_quantized3, + /* input1 min/max*/ -1.0, 1.0, /* input2 min/max */ 0.0, 1.0, + /* input3 min/max */ 0.0, 100.5); +} + +TF_LITE_MICRO_TEST(DetectionPostprocessFloatRegularNMS) +{ + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + const float kGolden1[] = { 0.0, 10.0, 1.0, 11.0, 0.0, 10.0, + 1.0, 11.0, 0.0, 0.0, 0.0, 0.0 }; + const float kGolden3[] = { 0.95, 0.9, 0.0 }; + const float kGolden4[] = { 2.0 }; + + tflite::testing::TestDetectionPostprocess( + tflite::testing::kInputShape1, tflite::testing::kInputData1, + tflite::testing::kInputShape2, tflite::testing::kInputData2, + tflite::testing::kInputShape3, tflite::testing::kInputData3, + tflite::testing::kOutputShape1, output_data1, + tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, kGolden1, + tflite::testing::kGolden2, kGolden3, kGolden4, + /* tolerance */ 1e-1, /* Use regular NMS: */ true); +} + +TF_LITE_MICRO_TEST(DetectionPostprocessQuantizedRegularNMS) +{ + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + + constexpr int kInputElements1 = + 1 * 6 * + 4; // tflite::testing::kInputShape1[1] * tflite::testing::kInputShape1[2] + // * tflite::testing::kInputShape1[3]; + constexpr int kInputElements2 = + 1 * 6 * + 3; // tflite::testing::kInputShape2[1] * tflite::testing::kInputShape2[2] + // * tflite::testing::kInputShape2[3]; + constexpr int kInputElements3 = + 6 * 4; // tflite::testing::kInputShape3[1] * + // tflite::testing::kInputShape3[2]; + + uint8_t input_data_quantized1[kInputElements1]; + uint8_t input_data_quantized2[kInputElements2]; + uint8_t input_data_quantized3[kInputElements3]; + + const float kGolden1[] = { 0.0, 10.0, 1.0, 11.0, 0.0, 10.0, + 1.0, 11.0, 0.0, 0.0, 0.0, 0.0 }; + const float kGolden3[] = { 0.95, 0.9, 0.0 }; + const float kGolden4[] = { 2.0 }; + + tflite::testing::TestDetectionPostprocess( + tflite::testing::kInputShape1, tflite::testing::kInputData1, + tflite::testing::kInputShape2, tflite::testing::kInputData2, + tflite::testing::kInputShape3, tflite::testing::kInputData3, + tflite::testing::kOutputShape1, output_data1, + tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, kGolden1, + tflite::testing::kGolden2, kGolden3, kGolden4, + /* tolerance */ 3e-1, /* Use regular NMS: */ true, input_data_quantized1, + input_data_quantized2, input_data_quantized3, + /* input1 min/max*/ -1.0, 1.0, /* input2 min/max */ 0.0, 1.0, + /* input3 min/max */ 0.0, 100.5); +} + +TF_LITE_MICRO_TEST( + DetectionPostprocessFloatFastNMSwithNoBackgroundClassAndKeypoints) +{ + int kInputShape1[] = { 3, 1, 6, 5 }; + int kInputShape2[] = { 3, 1, 6, 2 }; + + // six boxes in center-size encoding + const float kInputData1[] = { + 0.0, 0.0, 0.0, 0.0, 1.0, // box #1 + 0.0, 1.0, 0.0, 0.0, 1.0, // box #2 + 0.0, -1.0, 0.0, 0.0, 1.0, // box #3 + 0.0, 0.0, 0.0, 0.0, 1.0, // box #4 + 0.0, 1.0, 0.0, 0.0, 1.0, // box #5 + 0.0, 0.0, 0.0, 0.0, 1.0, // box #6 + }; + + // class scores - two classes without background + const float kInputData2[] = { .9, .8, .75, .72, .6, .5, + .93, .95, .5, .4, .3, .2 }; + + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + + tflite::testing::TestDetectionPostprocess( + kInputShape1, kInputData1, kInputShape2, kInputData2, + tflite::testing::kInputShape3, tflite::testing::kInputData3, + tflite::testing::kOutputShape1, output_data1, + tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, tflite::testing::kGolden1, + tflite::testing::kGolden2, tflite::testing::kGolden3, + tflite::testing::kGolden4, + /* tolerance */ 0, /* Use regular NMS: */ false); +} + +TF_LITE_MICRO_TEST( + DetectionPostprocessFloatRegularNMSwithNoBackgroundClassAndKeypoints) +{ + int kInputShape2[] = { 3, 1, 6, 2 }; + + // class scores - two classes without background + const float kInputData2[] = { .9, .8, .75, .72, .6, .5, + .93, .95, .5, .4, .3, .2 }; + + const float kGolden1[] = { 0.0, 10.0, 1.0, 11.0, 0.0, 10.0, + 1.0, 11.0, 0.0, 0.0, 0.0, 0.0 }; + const float kGolden3[] = { 0.95, 0.9, 0.0 }; + const float kGolden4[] = { 2.0 }; + + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + + tflite::testing::TestDetectionPostprocess( + tflite::testing::kInputShape1, tflite::testing::kInputData1, kInputShape2, + kInputData2, tflite::testing::kInputShape3, tflite::testing::kInputData3, + tflite::testing::kOutputShape1, output_data1, + tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, kGolden1, + tflite::testing::kGolden2, kGolden3, kGolden4, + /* tolerance */ 1e-1, /* Use regular NMS: */ true); +} + +TF_LITE_MICRO_TEST( + DetectionPostprocessFloatFastNMSWithBackgroundClassAndKeypoints) +{ + int kInputShape1[] = { 3, 1, 6, 5 }; + + // six boxes in center-size encoding + const float kInputData1[] = { + 0.0, 0.0, 0.0, 0.0, 1.0, // box #1 + 0.0, 1.0, 0.0, 0.0, 1.0, // box #2 + 0.0, -1.0, 0.0, 0.0, 1.0, // box #3 + 0.0, 0.0, 0.0, 0.0, 1.0, // box #4 + 0.0, 1.0, 0.0, 0.0, 1.0, // box #5 + 0.0, 0.0, 0.0, 0.0, 1.0, // box #6 + }; + + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + + tflite::testing::TestDetectionPostprocess( + kInputShape1, kInputData1, tflite::testing::kInputShape2, + tflite::testing::kInputData2, tflite::testing::kInputShape3, + tflite::testing::kInputData3, tflite::testing::kOutputShape1, + output_data1, tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, tflite::testing::kGolden1, + tflite::testing::kGolden2, tflite::testing::kGolden3, + tflite::testing::kGolden4, + /* tolerance */ 0, /* Use regular NMS: */ false); +} + +TF_LITE_MICRO_TEST( + DetectionPostprocessQuantizedFastNMSwithNoBackgroundClassAndKeypoints) +{ + int kInputShape1[] = { 3, 1, 6, 5 }; + int kInputShape2[] = { 3, 1, 6, 2 }; + + // six boxes in center-size encoding + const float kInputData1[] = { + 0.0, 0.0, 0.0, 0.0, 1.0, // box #1 + 0.0, 1.0, 0.0, 0.0, 1.0, // box #2 + 0.0, -1.0, 0.0, 0.0, 1.0, // box #3 + 0.0, 0.0, 0.0, 0.0, 1.0, // box #4 + 0.0, 1.0, 0.0, 0.0, 1.0, // box #5 + 0.0, 0.0, 0.0, 0.0, 1.0, // box #6 + }; + + // class scores - two classes without background + const float kInputData2[] = { .9, .8, .75, .72, .6, .5, + .93, .95, .5, .4, .3, .2 }; + + constexpr int kInputElements1 = + 1 * 6 * 5; // kInputShape1[1] * kInputShape1[2] * kInputShape1[3]; + constexpr int kInputElements2 = + 1 * 6 * 2; // kInputShape2[1] * kInputShape2[2] * kInputShape2[3]; + constexpr int kInputElements3 = 6 * 4; // tflite::testing::kInputShape3[1] * + // tflite::testing::kInputShape3[2]; + + uint8_t input_data_quantized1[kInputElements1]; + uint8_t input_data_quantized2[kInputElements2]; + uint8_t input_data_quantized3[kInputElements3]; + + float output_data1[12]; + float output_data2[3]; + float output_data3[3]; + float output_data4[1]; + + tflite::testing::TestDetectionPostprocess( + kInputShape1, kInputData1, kInputShape2, kInputData2, + tflite::testing::kInputShape3, tflite::testing::kInputData3, + tflite::testing::kOutputShape1, output_data1, + tflite::testing::kOutputShape2, output_data2, + tflite::testing::kOutputShape3, output_data3, + tflite::testing::kOutputShape4, output_data4, tflite::testing::kGolden1, + tflite::testing::kGolden2, tflite::testing::kGolden3, + tflite::testing::kGolden4, + /* tolerance */ 3e-1, /* Use regular NMS: */ false, input_data_quantized1, + input_data_quantized2, input_data_quantized3, + /* input1 min/max*/ -1.0, 1.0, /* input2 min/max */ 0.0, 1.0, + /* input3 min/max */ 0.0, 100.5); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise.cc new file mode 100644 index 00000000..4b704efa --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise.cc @@ -0,0 +1,236 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace elementwise { +namespace { + +bool IsNumericSupportedType(const TfLiteType type) +{ + return type == kTfLiteFloat32; +} + +bool IsLogicalSupportedType(const TfLiteType type) +{ + return type == kTfLiteBool; +} + +typedef bool (*IsSupportedType)(TfLiteType); +template +TfLiteStatus GenericPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input = GetInput(context, node, 0); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, 0); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + if (!IsSupportedType(input->type)) { + TF_LITE_KERNEL_LOG(context, "Input data type %s (%d) is not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +template +inline TfLiteStatus EvalImpl(TfLiteContext *context, TfLiteNode *node, + T func(T), TfLiteType expected_type) +{ + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, expected_type); + const size_t num_elements = ElementCount(*input->dims); + const T *in_data = tflite::micro::GetTensorData(input); + T *out_data = tflite::micro::GetTensorData(output); + for (size_t i = 0; i < num_elements; ++i) { + out_data[i] = func(in_data[i]); + } + return kTfLiteOk; +} + +inline TfLiteStatus EvalNumeric(TfLiteContext *context, TfLiteNode *node, + float float_func(float)) +{ + return EvalImpl(context, node, float_func, kTfLiteFloat32); +} + +inline TfLiteStatus EvalLogical(TfLiteContext *context, TfLiteNode *node, + bool bool_func(bool)) +{ + return EvalImpl(context, node, bool_func, kTfLiteBool); +} + +TfLiteStatus AbsEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, std::abs); +} + +TfLiteStatus SinEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, std::sin); +} + +TfLiteStatus CosEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, std::cos); +} + +TfLiteStatus LogEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, std::log); +} + +TfLiteStatus SqrtEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, std::sqrt); +} + +TfLiteStatus RsqrtEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, [](float f) { return 1.f / std::sqrt(f); }); +} + +TfLiteStatus SquareEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalNumeric(context, node, [](float f) { return f * f; }); +} + +TfLiteStatus LogicalNotEval(TfLiteContext *context, TfLiteNode *node) +{ + return EvalLogical(context, node, [](bool v) { return !v; }); +} + +} // namespace +} // namespace elementwise + +TfLiteRegistration Register_ABS() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::AbsEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_SIN() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::SinEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_COS() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::CosEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_LOG() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::LogEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_SQRT() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::SqrtEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_RSQRT() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::RsqrtEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_SQUARE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::SquareEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_LOGICAL_NOT() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/ + elementwise::GenericPrepare, + /*invoke=*/elementwise::LogicalNotEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise_test.cc new file mode 100644 index 00000000..9f92d324 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elementwise_test.cc @@ -0,0 +1,202 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/debug_log.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { + +void TestElementwiseFloat(const TfLiteRegistration ®istration, + int *input_dims_data, const float *input_data, + int *output_dims_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 1; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims) }; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output_dims_count; ++i) { + output_data[i] = 23; + } + + static int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + static int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +void TestElementwiseBool(const TfLiteRegistration ®istration, + int *input_dims_data, const bool *input_data, + int *output_dims_data, + const bool *expected_output_data, bool *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 1; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims) }; + + // Place false in the uninitialized output buffer. + for (int i = 0; i < output_dims_count; ++i) { + output_data[i] = false; + } + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(Abs) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 0.01, -0.01, 10, -10 }; + const float golden[] = { 0.01, 0.01, 10, 10 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_ABS(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Sin) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 0, 3.1415926, -3.1415926, 1 }; + const float golden[] = { 0, 0, 0, 0.84147 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_SIN(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Cos) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 0, 3.1415926, -3.1415926, 1 }; + const float golden[] = { 1, -1, -1, 0.54030 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_COS(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Log) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 1, 2.7182818, 0.5, 2 }; + const float golden[] = { 0, 1, -0.6931472, 0.6931472 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_LOG(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Sqrt) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 0, 1, 2, 4 }; + const float golden[] = { 0, 1, 1.41421, 2 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_SQRT(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Rsqrt) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 1, 2, 4, 9 }; + const float golden[] = { 1, 0.7071, 0.5, 0.33333 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_RSQRT(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Square) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const float input[] = { 1, 2, 0.5, -3.0 }; + const float golden[] = { 1, 4.0, 0.25, 9.0 }; + float output_data[output_dims_count]; + tflite::testing::TestElementwiseFloat(tflite::ops::micro::Register_SQUARE(), + shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(LogicalNot) +{ + constexpr int output_dims_count = 4; + int shape[] = { 2, 2, 2 }; + const bool input[] = { true, false, false, true }; + const bool golden[] = { false, true, true, false }; + bool output_data[output_dims_count]; + tflite::testing::TestElementwiseBool( + tflite::ops::micro::Register_LOGICAL_NOT(), shape, input, shape, golden, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/elu.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elu.cc new file mode 100644 index 00000000..f468d30e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elu.cc @@ -0,0 +1,159 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/elu.h" + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/cppmath.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +// Input/output tensor index. +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +// OLD-TODO(b/142762739): We should figure out a multi-threading plan for most +// of the activation ops below. + +struct OpData { + int8_t table[256]; +}; + +using TransformFunc = float (*)(float); + +template +void PopulateLookupTable(const TfLiteTensor *input, const TfLiteTensor *output, + const TransformFunc transform, OpData *data) +{ + if (sizeof(T) != 1) + TF_LITE_FATAL("Lookup table valid only for 8bit"); + + const float inverse_scale = 1 / output->params.scale; + int32_t maxval = std::numeric_limits::max(); + int32_t minval = std::numeric_limits::min(); + for (int32_t val = minval; val <= maxval; ++val) { + const float dequantized = + input->params.scale * (val - input->params.zero_point); + const float transformed = transform(dequantized); + const float rescaled = TfLiteRound(transformed * inverse_scale); + const int32_t quantized = + static_cast(rescaled + output->params.zero_point); + data->table[static_cast(static_cast(val))] = + static_cast(std::max(std::min(maxval, quantized), minval)); + } +} + +// OLD-TODO(b/143696793): move this to optimized_ops. +void EvalUsingLookupTable(const OpData *data, const TfLiteEvalTensor *input, + TfLiteEvalTensor *output) +{ + const int size = MatchingFlatSize(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorShape(output)); + int8_t *output_data = tflite::micro::GetTensorData(output); + const int8_t *input_data = tflite::micro::GetTensorData(input); + + for (int i = 0; i < size; ++i) { + output_data[i] = data->table[static_cast(input_data[i])]; + } +} + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + // Use LUT to handle quantized elu path. + if (input->type == kTfLiteInt8) { + OpData *data = static_cast(node->user_data); + TransformFunc transform = [](float value) { + return value < 0.0f ? std::exp(value) - 1.0f : value; + }; + PopulateLookupTable(input, output, transform, data); + } + + return kTfLiteOk; +} + +void *EluInit(TfLiteContext *context, const char *buffer, size_t length) +{ + // This is a builtin op, so we don't use the contents in 'buffer', if any. + // Instead, we allocate a new object to carry information from Prepare() to + // Eval(). + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus EluPrepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +TfLiteStatus EluEval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + switch (input->type) { + case kTfLiteFloat32: { + reference_ops::Elu(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + case kTfLiteInt8: { + const OpData *data = static_cast(node->user_data); + EvalUsingLookupTable(data, input, output); + return kTfLiteOk; + } + default: + TF_LITE_KERNEL_LOG( + context, "ELU only supports float32 and int8 currently, got %s.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } +} + +} // namespace + +TfLiteRegistration Register_ELU() +{ + return { /*init=*/EluInit, + /*free=*/nullptr, + /*prepare=*/EluPrepare, + /*invoke=*/EluEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/elu_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elu_test.cc new file mode 100644 index 00000000..0dd10d9a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/elu_test.cc @@ -0,0 +1,174 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// min/max are used to compute scale, zero-point +template +struct TestEluParams { + // quantization parameters + float data_min; // input and output data minimum value + float data_max; // input and output data maximum value + T *input_data; // quantized input storage + T *output_data; // quantized output storage + float tolerance; // output vs expected value tolerance +}; + +// Our fixed-point math function implementations have roughly 12 bits of +// accuracy, when specialized to 16-bit fixed-point arithmetic. +// That is purely an implementation compromise, it would have been possible +// to get closer to 16 bits of accuracy but that would be more expensive, +// and not needed for our purposes as ultimately the output is either +// immediately down-quantized to 8 bits, or will typically be at the output +// of the surrounding LSTM cell. +// So we can require roughly 2^-12 accuracy when the output is 16-bit, and +// we can more or less expect the full 2^-8 accuracy when the output is 8-bit. +// +// However, the representable output interval is often [-1, 1] (it has to be +// for tanh, and even for logistic, when we implement it in fixed-point, we +// typically have to do so on such a symmetric interval, e.g. ARM NEON only +// has signed fixed-point arithmetic (SQRDMULH)). As the width of [-1, 1] +// is 2, our representable values are often diluted by a factor of 2, whence +// the factor of 2 below. +constexpr float kQuantizedTolerance = 2 * (1. / 256); + +void ExecuteEluTest(TfLiteTensor *tensors, int tensors_count) +{ + int kInputArrayData[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + const TfLiteRegistration registration = tflite::Register_ELU(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestElu(int *input_dims_data, const T *input_data, int *expected_dims, + const T *expected_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + ExecuteEluTest(tensors, tensors_count); + + constexpr float kTolerance = 1e-5; + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } +} + +template +void TestEluQuantized(const TestEluParams ¶ms, int *input_dims_data, + const float *input_data, int *expected_dims, + const float *expected_data, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + const float scale = ScaleFromMinMax(params.data_min, params.data_max); + const int zero_point = + ZeroPointFromMinMax(params.data_min, params.data_max); + + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, params.input_data, input_dims, scale, + zero_point), + CreateQuantizedTensor(params.output_data, output_dims, scale, zero_point), + }; + constexpr int kTensorsCount = std::extent::value; + + ExecuteEluTest(tensors, kTensorsCount); + + Dequantize(params.output_data, output_count, scale, zero_point, output_data); + const float kTolerance = params.tolerance; + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatActivationsOpTestElu) +{ + int kDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + 0, -6, 2, -4, // + 3, -2, 10, -0.1, // + }; + constexpr float kExpect[] = { + 0.0, -0.997521, 2.0, -0.981684, // + 3.0, -0.864665, 10.0, -0.0951626, // + }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestElu(kDims, kInput, kDims, kExpect, output_data); +} + +TF_LITE_MICRO_TEST(QuantizedActivationsOpTestEluInt8) +{ + int kDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + 0, -6, 2, -4, // + 3, -2, 6, -0.1, // + }; + constexpr float kExpect[] = { + 0, -1.0, 2.0, -1, // + 3.0, -0.875, 6.0, -0.125, // + }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + // setup quantization storage and parameters + int8_t q_output_data[kOutputCount]; + int8_t q_input_data[kOutputCount]; + constexpr float kMin = -1; + constexpr float kMax = 127.f / 128.f; + tflite::testing::TestEluParams params = {}; + params.data_min = 8 * kMin; + params.data_max = 8 * kMax; + params.input_data = q_input_data; + params.output_data = q_output_data; + params.tolerance = tflite::testing::kQuantizedTolerance; + + tflite::testing::TestEluQuantized(params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.cc new file mode 100644 index 00000000..af16221f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.cc @@ -0,0 +1,33 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// +// This is a stub file for non-Ethos platforms +// +#include "tensorflow/lite/c/common.h" + +namespace tflite { + +TfLiteRegistration *Register_ETHOSU() +{ + return nullptr; +} + +const char *GetString_ETHOSU() +{ + return ""; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.h new file mode 100644 index 00000000..c9678419 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/ethosu.h @@ -0,0 +1,27 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_ETHOSU_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_ETHOSU_H_ + +#include "tensorflow/lite/c/common.h" + +namespace tflite { +TfLiteRegistration *Register_ETHOSU(); + +const char *GetString_ETHOSU(); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_ETHOSU_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/exp.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/exp.cc new file mode 100644 index 00000000..38311625 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/exp.cc @@ -0,0 +1,81 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/exp.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteFloat32); + TF_LITE_ENSURE_TYPES_EQ(context, output->type, input->type); + TF_LITE_ENSURE_EQ(context, output->bytes, input->bytes); + TF_LITE_ENSURE_EQ(context, output->dims->size, input->dims->size); + for (int i = 0; i < output->dims->size; ++i) { + TF_LITE_ENSURE_EQ(context, output->dims->data[i], input->dims->data[i]); + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + int flat_size = MatchingFlatSize(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorShape(output)); + + if (input->type == kTfLiteFloat32) { + reference_ops::Exp(tflite::micro::GetTensorData(input), + static_cast(flat_size), + tflite::micro::GetTensorData(output)); + } else { + TF_LITE_KERNEL_LOG(context, "Type %s (%d) currently not supported by Exp.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} +} // namespace + +TfLiteRegistration Register_EXP() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/exp_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/exp_test.cc new file mode 100644 index 00000000..2b2803c5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/exp_test.cc @@ -0,0 +1,79 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestExp(int *input_dims_data, const float *input_data, + const float *expected_output_data, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(input_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_EXP(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SingleDim) +{ + constexpr int kInputSize = 7; + float output_data[kInputSize]; + int input_dims[] = { 2, 1, kInputSize }; + const float input_values[kInputSize] = { 0.0f, 1.0f, -1.0f, 100.0f, + -100.0f, 0.01f, -0.01f }; + float golden[kInputSize]; + for (int i = 0; i < kInputSize; ++i) { + golden[i] = std::exp(input_values[i]); + } + + tflite::testing::TestExp(input_dims, input_values, golden, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims.cc new file mode 100644 index 00000000..a533744a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims.cc @@ -0,0 +1,158 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kAxisTensor = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus ExpandTensorDim(TfLiteContext *context, + const TfLiteEvalTensor *input, int32_t axis, + TfLiteEvalTensor *output) +{ + const TfLiteIntArray *input_dims = input->dims; + TfLiteIntArray *output_dims = output->dims; + if (axis < 0) { + axis = input_dims->size + 1 + axis; + } + TF_LITE_ENSURE(context, (axis <= input_dims->size)); + + output_dims->size = input_dims->size + 1; + for (int i = 0; i < output_dims->size; ++i) { + if (i < axis) { + output_dims->data[i] = input_dims->data[i]; + } else if (i == axis) { + output_dims->data[i] = 1; + } else { + output_dims->data[i] = input_dims->data[i - 1]; + } + } + return kTfLiteOk; +} + +TfLiteStatus GetAxisValueFromTensor(TfLiteContext *context, + const TfLiteEvalTensor *axis, + int32_t *axis_value) +{ + const int axis_dims = (tflite::micro::GetTensorShape(axis)).DimensionsCount(); + if (axis_dims > 1) { + TF_LITE_KERNEL_LOG(context, "Axis has only one element for Expand_Dims.", + axis_dims); + return kTfLiteError; + } + + if (kTfLiteInt32 == (axis->type)) { + const int32_t *axis_ptr = tflite::micro::GetTensorData(axis); + *axis_value = axis_ptr[0]; + return kTfLiteOk; + } else { + TF_LITE_KERNEL_LOG(context, + "Axis type %s (%d) not supported by Expand_Dims.", + TfLiteTypeGetName(axis->type), axis->type); + return kTfLiteError; + } +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + const TfLiteTensor *axis; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kAxisTensor, &axis)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + output->type = input->type; + if (IsDynamicTensor(axis)) { + TF_LITE_KERNEL_LOG(context, + "DynamicTensor is not yet supported by Expand_Dims."); + return kTfLiteError; + } + return kTfLiteOk; +} + +template +void memCopyN(T *out, const T *in, const int num_elements) +{ + for (int i = 0; i < num_elements; ++i) { + out[i] = in[i]; + } +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *axis = + tflite::micro::GetEvalInput(context, node, kAxisTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + const int flat_size = ElementCount(*input->dims); + const int input_dims = input->dims->size; + + int32_t axis_value; + TF_LITE_ENSURE_OK(context, + GetAxisValueFromTensor(context, axis, &axis_value)); + if ((axis_value > static_cast(input_dims)) || + (axis_value < static_cast(-(input_dims + 1)))) { + TF_LITE_KERNEL_LOG(context, "Invalid Expand_Dims axis value (%d).", + axis_value); + return kTfLiteError; + } + ExpandTensorDim(context, input, axis_value, output); + + switch (input->type) { + case kTfLiteFloat32: { + memCopyN(tflite::micro::GetTensorData(output), + tflite::micro::GetTensorData(input), flat_size); + } break; + case kTfLiteInt8: { + memCopyN(tflite::micro::GetTensorData(output), + tflite::micro::GetTensorData(input), flat_size); + } break; + default: + TF_LITE_KERNEL_LOG( + context, + "Expand_Dims only currently supports int8 and float32, got %d.", + input->type); + return kTfLiteError; + } + return kTfLiteOk; +} +} // namespace + +TfLiteRegistration Register_EXPAND_DIMS() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims_test.cc new file mode 100644 index 00000000..f2fdf12f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/expand_dims_test.cc @@ -0,0 +1,183 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void TestExpandDims(int *input_dims, const T *input_data, int *axis_dims, + const int32_t *axis_data, int *expected_output_dims, + int *output_dims, const T *expected_output_data, + T *output_data) +{ + TfLiteIntArray *in_dims = IntArrayFromInts(input_dims); + TfLiteIntArray *ax_dims = IntArrayFromInts(axis_dims); + TfLiteIntArray *out_dims = IntArrayFromInts(output_dims); + const int in_dims_size = in_dims->size; + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, in_dims), + CreateTensor(axis_data, ax_dims), + CreateTensor(output_data, out_dims, true), + }; + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_EXPAND_DIMS(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + // The output tensor's data and shape have been updated by the kernel. + TfLiteTensor *actual_out_tensor = &tensors[2]; + TfLiteIntArray *actual_out_dims = actual_out_tensor->dims; + const int actual_out_dims_size = actual_out_dims->size; + const int output_size = ElementCount(*actual_out_dims); + TF_LITE_MICRO_EXPECT_EQ(actual_out_dims_size, (in_dims_size + 1)); + for (int i = 0; i < actual_out_dims_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_dims[i], actual_out_dims->data[i]); + } + for (int i = 0; i < output_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(ExpandDimsPositiveAxisTest0) +{ + int8_t output_data[4]; + int input_dims[] = { 2, 2, 2 }; + const int8_t input_data[] = { -1, 1, -2, 2 }; + const int8_t golden_data[] = { -1, 1, -2, 2 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { 0 }; + int golden_dims[] = { 1, 2, 2 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TEST(ExpandDimsPositiveAxisTest1) +{ + float output_data[4]; + int input_dims[] = { 2, 2, 2 }; + const float input_data[] = { -1.1, 1.2, -2.1, 2.2 }; + const float golden_data[] = { -1.1, 1.2, -2.1, 2.2 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { 1 }; + int golden_dims[] = { 2, 1, 2 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TEST(ExpandDimsPositiveAxisTest2) +{ + int8_t output_data[4]; + int input_dims[] = { 2, 2, 2 }; + const int8_t input_data[] = { -1, 1, -2, 2 }; + const int8_t golden_data[] = { -1, 1, -2, 2 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { 2 }; + int golden_dims[] = { 2, 2, 1 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TEST(ExpandDimsNegativeAxisTest4) +{ + int8_t output_data[6]; + int input_dims[] = { 3, 3, 1, 2 }; + const int8_t input_data[] = { -1, 1, 2, -2, 0, 3 }; + const int8_t golden_data[] = { -1, 1, 2, -2, 0, 3 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { -4 }; + int golden_dims[] = { 1, 3, 1, 2 }; + int output_dims[] = { 4, 0, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TEST(ExpandDimsNegativeAxisTest3) +{ + float output_data[6]; + int input_dims[] = { 3, 3, 1, 2 }; + const float input_data[] = { 0.1, -0.8, -1.2, -0.5, 0.9, 1.3 }; + const float golden_data[] = { 0.1, -0.8, -1.2, -0.5, 0.9, 1.3 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { -3 }; + int golden_dims[] = { 3, 1, 1, 2 }; + int output_dims[] = { 4, 0, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TEST(ExpandDimsNegativeAxisTest2) +{ + int8_t output_data[6]; + int input_dims[] = { 3, 1, 2, 3 }; + const int8_t input_data[] = { -1, 1, 2, -2, 0, 3 }; + const int8_t golden_data[] = { -1, 1, 2, -2, 0, 3 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { -2 }; + int golden_dims[] = { 1, 2, 1, 3 }; + int output_dims[] = { 4, 0, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TEST(ExpandDimsNegativeAxisTest1) +{ + float output_data[6]; + int input_dims[] = { 3, 1, 3, 2 }; + const float input_data[] = { 0.1, -0.8, -1.2, -0.5, 0.9, 1.3 }; + const float golden_data[] = { 0.1, -0.8, -1.2, -0.5, 0.9, 1.3 }; + int axis_dims[] = { 1, 1 }; + const int32_t axis_data[] = { -1 }; + int golden_dims[] = { 1, 3, 2, 1 }; + int output_dims[] = { 4, 0, 0, 0, 0 }; + tflite::testing::TestExpandDims(input_dims, input_data, axis_dims, + axis_data, golden_dims, output_dims, + golden_data, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/fill.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fill.cc new file mode 100644 index 00000000..e6baa74f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fill.cc @@ -0,0 +1,137 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/fill.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { + +namespace { + +template +TfLiteStatus EnsureEqImpl(TfLiteContext *context, const TfLiteIntArray *array, + const TfLiteTensor *tensor) +{ + for (int i = 0; i < array->size; ++i) { + TF_LITE_ENSURE_EQ(context, array->data[i], GetTensorData(tensor)[i]); + } + return kTfLiteOk; +} + +// Ensure the equality of an int array and a tensor, which must be +// one-dimensional and of an integer type. +TfLiteStatus EnsureEq(TfLiteContext *context, const TfLiteIntArray *array, + const TfLiteTensor *tensor) +{ + TF_LITE_ENSURE_EQ(context, NumDimensions(tensor), 1); + const auto tensor_len = tensor->dims->data[0]; + TF_LITE_ENSURE_EQ(context, array->size, tensor_len); + + switch (tensor->type) { + case kTfLiteInt8: + return EnsureEqImpl(context, array, tensor); + case kTfLiteUInt8: + return EnsureEqImpl(context, array, tensor); + case kTfLiteInt16: + return EnsureEqImpl(context, array, tensor); + case kTfLiteInt32: + return EnsureEqImpl(context, array, tensor); + case kTfLiteInt64: + return EnsureEqImpl(context, array, tensor); + default: + TF_LITE_KERNEL_LOG(context, + "cannot compare int array to tensor of type %d.", + tensor->type); + return kTfLiteError; + } +} + +constexpr int kDimsTensor = 0; +constexpr int kValueTensor = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + // Ensure inputs and outputs exist. + const TfLiteTensor *dims; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kDimsTensor, &dims)); + const TfLiteTensor *value; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kValueTensor, &value)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + // The value tensor must be a scalar. + TF_LITE_ENSURE_EQ(context, NumDimensions(value), 0); + + // The value type and output type must match. + TF_LITE_ENSURE_EQ(context, value->type, output->type); + + // The dims tensor must match the output tensor shape. As a byproduct, + // ensures the dims tensor is of an integer type. + TF_LITE_ENSURE_OK(context, EnsureEq(context, output->dims, dims)); + + return kTfLiteOk; +} + +template +void FillImpl(const TfLiteEvalTensor *value, TfLiteEvalTensor *output) +{ + reference_ops::Fill( + micro::GetTensorShape(value), micro::GetTensorData(value), + micro::GetTensorShape(output), micro::GetTensorData(output)); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *value = + micro::GetEvalInput(context, node, kValueTensor); + TfLiteEvalTensor *output = micro::GetEvalOutput(context, node, kOutputTensor); + + switch (value->type) { + case kTfLiteFloat32: + FillImpl(value, output); + break; + default: + TF_LITE_KERNEL_LOG( + context, "Fill only currently supports float32 for input 1, got %d.", + TfLiteTypeGetName(value->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_FILL() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/fill_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fill_test.cc new file mode 100644 index 00000000..8cba1a0b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fill_test.cc @@ -0,0 +1,133 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +template +void TestFill(int *dims_shape, DimsType *dims_data, int *value_shape, + ValueType *value_data, int *output_shape, + OutputType *output_data) +{ + using tflite::testing::CreateTensor; + using tflite::testing::IntArrayFromInts; + + TfLiteTensor tensors[] = { + CreateTensor(dims_data, IntArrayFromInts(dims_shape)), + CreateTensor(value_data, IntArrayFromInts(value_shape)), + CreateTensor(output_data, IntArrayFromInts(output_shape)) + }; + constexpr int dims_index = 0; + constexpr int value_index = 1; + constexpr int output_index = 2; + int inputs[] = { 2, dims_index, value_index }; + int outputs[] = { 1, output_index }; + const auto registration = tflite::Register_FILL(); + tflite::micro::KernelRunner runner{ registration, + tensors, + sizeof(tensors) / sizeof(TfLiteTensor), + IntArrayFromInts(inputs), + IntArrayFromInts(outputs), + /*builtin_data=*/nullptr }; + + TF_LITE_MICRO_EXPECT_EQ(runner.InitAndPrepare(), kTfLiteOk); + TF_LITE_MICRO_EXPECT_EQ(runner.Invoke(), kTfLiteOk); + + // The output shape must match the shape requested via dims. + const auto output_rank = output_shape[0]; + const auto requested_rank = dims_shape[1]; // yes, 1 + if (output_rank == requested_rank) { + for (int i = 0; i < requested_rank; ++i) { + TF_LITE_MICRO_EXPECT_EQ(output_shape[i + 1], dims_data[i]); + } + } else { + TF_LITE_MICRO_FAIL("output shape does not match shape requested via dims"); + } + + // The output type matches the value type. + TF_LITE_MICRO_EXPECT_EQ(tensors[output_index].type, + tensors[value_index].type); + + // The output elements contain the fill value. + const auto elements = tflite::ElementCount(*IntArrayFromInts(output_shape)); + for (int i = 0; i < elements; ++i) { + TF_LITE_MICRO_EXPECT_EQ(output_data[i], value_data[0]); + } +} + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FillFloatInt64Dims) +{ + constexpr int kDim1 = 2; + constexpr int kDim2 = 2; + constexpr int kDim3 = 2; + + int dims_shape[] = { 1, 3 }; + int64_t dims_data[] = { kDim1, kDim2, kDim3 }; + + int value_shape[] = { 0 }; + float value_data[] = { 4.0 }; + + int output_shape[] = { 3, kDim1, kDim2, kDim3 }; + float output_data[kDim1 * kDim2 * kDim3]; + + TestFill(dims_shape, dims_data, value_shape, value_data, output_shape, + output_data); +} + +TF_LITE_MICRO_TEST(FillFloatInt32Dims) +{ + constexpr int kDim1 = 2; + constexpr int kDim2 = 2; + constexpr int kDim3 = 2; + + int dims_shape[] = { 1, 3 }; + int32_t dims_data[] = { kDim1, kDim2, kDim3 }; + + int value_shape[] = { 0 }; + float value_data[] = { 4.0 }; + + int output_shape[] = { 3, kDim1, kDim2, kDim3 }; + float output_data[kDim1 * kDim2 * kDim3]; + + TestFill(dims_shape, dims_data, value_shape, value_data, output_shape, + output_data); +} + +TF_LITE_MICRO_TEST(FillScalar) +{ + int dims_shape[] = { 1, 0 }; + int64_t dims_data[] = { 0 }; + + int value_shape[] = { 0 }; + float value_data[] = { 4.0 }; + + int output_shape[] = { 0 }; + float output_data[] = { 0 }; + + TestFill(dims_shape, dims_data, value_shape, value_data, output_shape, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor.cc new file mode 100644 index 00000000..1a386721 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor.cc @@ -0,0 +1,59 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/floor.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace floor { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteFloat32); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + reference_ops::Floor(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; +} +} // namespace floor + +TfLiteRegistration Register_FLOOR() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/floor::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div.cc new file mode 100644 index 00000000..5e86c737 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div.cc @@ -0,0 +1,136 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/floor_div.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/reference/binary_function.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +// Input/output tensor index. +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input1; + TF_LITE_ENSURE_OK(context, + GetInputSafe(context, node, kInputTensor1, &input1)); + const TfLiteTensor *input2; + TF_LITE_ENSURE_OK(context, + GetInputSafe(context, node, kInputTensor2, &input2)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + TF_LITE_ENSURE_TYPES_EQ(context, input1->type, input2->type); + TF_LITE_ENSURE_TYPES_EQ(context, input1->type, output->type); + + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + return nullptr; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +template +TfLiteStatus EvalFloorDiv(TfLiteContext *context, + const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, + TfLiteEvalTensor *output) +{ + const T *denominator_data = tflite::micro::GetTensorData(input2); + + // Validate the denominator. + for (int i = 0; i < tflite::ElementCount(*input2->dims); ++i) { + if (std::equal_to()(denominator_data[i], 0)) { + TF_LITE_KERNEL_LOG(context, "Division by 0"); + return kTfLiteError; + } + } + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + + if (requires_broadcast) { + reference_ops::BroadcastBinaryFunction4DSlow( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), denominator_data, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), reference_ops::FloorDiv); + } else { + reference_ops::BinaryFunction( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), denominator_data, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), reference_ops::FloorDiv); + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (input1->type) { + case kTfLiteFloat32: { + return EvalFloorDiv(context, input1, input2, output); + } + default: { + TF_LITE_KERNEL_LOG(context, "Type '%s' is not supported by FLOOR_DIV.", + TfLiteTypeGetName(input1->type)); + return kTfLiteError; + } + } +} + +} // namespace + +TfLiteRegistration Register_FLOOR_DIV() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div_test.cc new file mode 100644 index 00000000..98456110 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_div_test.cc @@ -0,0 +1,113 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void ExecuteFloorDivTest(TfLiteTensor *tensors, int tensors_count) +{ + int kInputArrayData[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + const TfLiteRegistration registration = tflite::Register_FLOOR_DIV(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestFloorDiv(int *input1_dims_data, const T *input1_data, + int *input2_dims_data, const T *input2_data, + int *expected_dims, const T *expected_data, T *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + + ExecuteFloorDivTest(tensors, tensors_count); + + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloorDivTestSimpleFloat) +{ + int kDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kInput1[] = { 10.05, 9.09, 11.9, 3.01 }; + constexpr float kInput2[] = { 2.05, 2.03, 3.03, 4.03 }; + constexpr float kExpect[] = { 4.0, 4.0, 3.0, 0.0 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestFloorDiv(kDims, kInput1, kDims, kInput2, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(FloorDivTestNegativeValueFloat) +{ + int kDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kInput1[] = { 10.03, -9.9, -11.0, 7.0 }; + constexpr float kInput2[] = { 2.0, 2.3, -3.0, -4.1 }; + constexpr float kExpect[] = { 5.0, -5.0, 3.0, -2.0 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestFloorDiv(kDims, kInput1, kDims, kInput2, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(FloorDivTestBroadcastFloat) +{ + int kDims1[] = { 4, 1, 2, 2, 1 }; + int kDims2[] = { 1, 1 }; + constexpr float kInput1[] = { 10.03, -9.9, -11.0, 7.0 }; + constexpr float kInput2[] = { -3.3 }; + constexpr float kExpect[] = { -4.0, 2.0, 3.0, -3.0 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestFloorDiv(kDims1, kInput1, kDims2, kInput2, kDims1, + kExpect, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod.cc new file mode 100644 index 00000000..9a20075f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod.cc @@ -0,0 +1,134 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/floor_mod.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/reference/binary_function.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +// OLD-TODO(b/117523611): We should factor out a binary_op and put binary ops +// there. +namespace tflite { +namespace { + +// Input/output tensor index. +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +// OLD-TODO(b/117912880): Support quantization. + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input1; + TF_LITE_ENSURE_OK(context, + GetInputSafe(context, node, kInputTensor1, &input1)); + const TfLiteTensor *input2; + TF_LITE_ENSURE_OK(context, + GetInputSafe(context, node, kInputTensor2, &input2)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + TF_LITE_ENSURE_TYPES_EQ(context, input1->type, input2->type); + TF_LITE_ENSURE_TYPES_EQ(context, input1->type, output->type); + + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + return nullptr; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +template +TfLiteStatus EvalFloorMod(TfLiteContext *context, bool requires_broadcast, + const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, + TfLiteEvalTensor *output) +{ + const T *denominator_data = tflite::micro::GetTensorData(input2); + + if (requires_broadcast) { + reference_ops::BroadcastBinaryFunction4DSlow( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), denominator_data, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), reference_ops::FloorMod); + } else { + reference_ops::BinaryFunction( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), denominator_data, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), reference_ops::FloorMod); + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + bool requires_broadcast = !tflite::micro::HaveSameShapes(input1, input2); + + switch (input1->type) { + case kTfLiteFloat32: { + return EvalFloorMod(context, requires_broadcast, input1, input2, + output); + } + default: { + TF_LITE_KERNEL_LOG(context, "Type '%s' is not supported by FLOOR_MOD.", + TfLiteTypeGetName(input1->type)); + return kTfLiteError; + } + } +} + +} // namespace + +TfLiteRegistration Register_FLOOR_MOD() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod_test.cc new file mode 100644 index 00000000..6edd5f9f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_mod_test.cc @@ -0,0 +1,113 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void ExecuteFloorModTest(TfLiteTensor *tensors, int tensors_count) +{ + int kInputArrayData[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + const TfLiteRegistration registration = tflite::Register_FLOOR_MOD(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestFloorMod(int *input1_dims_data, const T *input1_data, + int *input2_dims_data, const T *input2_data, + int *expected_dims, const T *expected_data, T *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + + ExecuteFloorModTest(tensors, tensors_count); + + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloorModFloatSimple) +{ + int kDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kInput1[] = { 10, 9, 11, 3 }; + constexpr float kInput2[] = { 2, 2, 3, 4 }; + constexpr float kExpect[] = { 0, 1, 2, 3 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestFloorMod(kDims, kInput1, kDims, kInput2, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(FloorModFloatNegativeValue) +{ + int kDims[] = { 4, 1, 2, 2, 1 }; + constexpr float kInput1[] = { 10, -9, -11, 7 }; + constexpr float kInput2[] = { 2, 2, -3, -4 }; + constexpr float kExpect[] = { 0, 1, -2, -1 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestFloorMod(kDims, kInput1, kDims, kInput2, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(FloorModFloatBroadcast) +{ + int kDims1[] = { 4, 1, 2, 2, 1 }; + int kDims2[] = { 1, 1 }; + constexpr float kInput1[] = { 10, -9, -11, 7 }; + constexpr float kInput2[] = { -3 }; + constexpr float kExpect[] = { -2, 0, -2, -2 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + tflite::testing::TestFloorMod(kDims1, kInput1, kDims2, kInput2, kDims1, + kExpect, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_test.cc new file mode 100644 index 00000000..0987fa2f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/floor_test.cc @@ -0,0 +1,85 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestFloor(int *input_dims_data, const float *input_data, + const float *expected_output_data, int *output_dims_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_FLOOR(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloorOpSingleDimFloat32) +{ + int dims[] = { 1, 2 }; + const float input[] = { 8.5f, 0.0f }; + const float golden[] = { 8, 0 }; + float output_data[2]; + tflite::testing::TestFloor(dims, input, golden, dims, output_data); +} + +TF_LITE_MICRO_TEST(FloorOpMultiDimFloat32) +{ + int dims[] = { 4, 2, 1, 1, 5 }; + const float input[] = { 0.0001f, 8.0001f, 0.9999f, 9.9999f, 0.5f, + -0.0001f, -8.0001f, -0.9999f, -9.9999f, -0.5f }; + const float golden[] = { 0.0f, 8.0f, 0.0f, 9.0f, 0.0f, + -1.0f, -9.0f, -1.0f, -10.0f, -1.0f }; + float output_data[10]; + tflite::testing::TestFloor(dims, input, golden, dims, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.cc new file mode 100644 index 00000000..ea45af8b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.cc @@ -0,0 +1,138 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/fully_connected.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/fully_connected.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, + sizeof(OpDataFullyConnected)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + auto *data = static_cast(node->user_data); + const auto params = + static_cast(node->builtin_data); + + const TfLiteTensor *input = + GetInput(context, node, kFullyConnectedInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = + GetInput(context, node, kFullyConnectedWeightsTensor); + TF_LITE_ENSURE(context, filter != nullptr); + const TfLiteTensor *bias = + GetOptionalInputTensor(context, node, kFullyConnectedBiasTensor); + TfLiteTensor *output = GetOutput(context, node, kFullyConnectedOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + TF_LITE_ENSURE_MSG(context, input->type == filter->type, + "Hybrid models are not supported on TFLite Micro."); + + return CalculateOpDataFullyConnected(context, params->activation, input->type, + input, filter, bias, output, data); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + const auto *params = + static_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kFullyConnectedInputTensor); + const TfLiteEvalTensor *filter = + tflite::micro::GetEvalInput(context, node, kFullyConnectedWeightsTensor); + const TfLiteEvalTensor *bias = + tflite::micro::GetEvalInput(context, node, kFullyConnectedBiasTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kFullyConnectedOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const auto &data = + *(static_cast(node->user_data)); + + // Checks in Prepare ensure input, output and filter types are all the same. + switch (input->type) { + case kTfLiteFloat32: { + tflite::reference_ops::FullyConnected( + FullyConnectedParamsFloat(params->activation), + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + } + + case kTfLiteInt8: { + tflite::reference_integer_ops::FullyConnected( + FullyConnectedParamsQuantized(data), + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + } + + default: { + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_FULLY_CONNECTED() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.h new file mode 100644 index 00000000..4f66709b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected.h @@ -0,0 +1,91 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_FULLY_CONNECTED_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_FULLY_CONNECTED_H_ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +struct OpDataFullyConnected { + // The scaling factor from input to output (aka the 'real multiplier') can + // be represented as a fixed point multiplier plus a left shift. + int32_t output_multiplier; + int output_shift; + // The range of the fused activation layer. For example for kNone and + // uint8_t these would be 0 and 255. + int32_t output_activation_min; + int32_t output_activation_max; + // The index of the temporary tensor where the quantized inputs are cached. + int input_quantized_index; + // Cached zero point values of tensors. + int32_t input_zero_point; + int32_t filter_zero_point; + int32_t output_zero_point; +}; + +extern const int kFullyConnectedInputTensor; +extern const int kFullyConnectedWeightsTensor; +extern const int kFullyConnectedBiasTensor; +extern const int kFullyConnectedOutputTensor; + +// Returns a FullyConnectedParams struct with all the parameters needed for a +// float computation. +FullyConnectedParams FullyConnectedParamsFloat( + TfLiteFusedActivation activation); + +// Returns a FullyConnectedParams struct with all the parameters needed for a +// quantized computation. +FullyConnectedParams FullyConnectedParamsQuantized( + const OpDataFullyConnected &op_data); + +TfLiteStatus CalculateOpDataFullyConnected( + TfLiteContext *context, TfLiteFusedActivation activation, + TfLiteType data_type, const TfLiteTensor *input, const TfLiteTensor *filter, + const TfLiteTensor *bias, TfLiteTensor *output, OpDataFullyConnected *data); + +// This is the most generic TfLiteRegistration. The actual supported types may +// still be target dependent. The only requirement is that every implementation +// (reference or optimized) must define this function. +TfLiteRegistration Register_FULLY_CONNECTED(); + +#if defined(CMSIS_NN) || defined(ARDUINO) +// The Arduino is a special case where we use the CMSIS kernels, but because of +// the current approach to building for Arduino, we do not support -DCMSIS_NN as +// part of the build. As a result, we use defined(ARDUINO) as proxy for the +// CMSIS kernels for this one special case. + +// Returns a TfLiteRegistration struct for cmsis_nn kernel variant that only +// supports int8. +TfLiteRegistration Register_FULLY_CONNECTED_INT8(); + +#else +// Note that while this block gets used for both reference and optimized kernels +// that do not have any specialized implementations, the only goal here is to +// define fallback implementation that allow reference kernels to still be used +// from applications that call a more specific kernel variant. + +inline TfLiteRegistration Register_FULLY_CONNECTED_INT8() +{ + return Register_FULLY_CONNECTED(); +} + +#endif +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_FULLY_CONNECTED_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_common.cc new file mode 100644 index 00000000..e6ed5ace --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_common.cc @@ -0,0 +1,86 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/fully_connected.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/fully_connected.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { + +const int kFullyConnectedInputTensor = 0; +const int kFullyConnectedWeightsTensor = 1; +const int kFullyConnectedBiasTensor = 2; +const int kFullyConnectedOutputTensor = 0; + +FullyConnectedParams FullyConnectedParamsQuantized( + const OpDataFullyConnected &op_data) +{ + FullyConnectedParams op_params; + op_params.input_offset = -op_data.input_zero_point; + op_params.weights_offset = -op_data.filter_zero_point; + op_params.output_offset = op_data.output_zero_point; + op_params.output_multiplier = op_data.output_multiplier; + op_params.output_shift = op_data.output_shift; + op_params.quantized_activation_min = op_data.output_activation_min; + op_params.quantized_activation_max = op_data.output_activation_max; + return op_params; +} + +FullyConnectedParams FullyConnectedParamsFloat( + TfLiteFusedActivation activation) +{ + FullyConnectedParams op_params; + CalculateActivationRange(activation, &op_params.float_activation_min, + &op_params.float_activation_max); + return op_params; +} + +TfLiteStatus CalculateOpDataFullyConnected( + TfLiteContext *context, TfLiteFusedActivation activation, + TfLiteType data_type, const TfLiteTensor *input, const TfLiteTensor *filter, + const TfLiteTensor *bias, TfLiteTensor *output, + OpDataFullyConnected *data) +{ + if (data_type != kTfLiteFloat32) { + double real_multiplier = 0.0; + TF_LITE_ENSURE_STATUS(GetQuantizedConvolutionMultipler( + context, input, filter, bias, output, &real_multiplier)); + QuantizeMultiplier(real_multiplier, &data->output_multiplier, + &data->output_shift); + + data->input_zero_point = input->params.zero_point; + // Filter weights will always be symmetric quantized since we only support + // int8 quantization. See + // https://github.com/tensorflow/tensorflow/issues/44912 for additional + // context. + TFLITE_DCHECK(filter->params.zero_point == 0); + data->filter_zero_point = filter->params.zero_point; + data->output_zero_point = output->params.zero_point; + + return CalculateActivationRangeQuantized(context, activation, output, + &data->output_activation_min, + &data->output_activation_max); + } + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_test.cc new file mode 100644 index 00000000..e1aa5a19 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/fully_connected_test.cc @@ -0,0 +1,541 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// Simple test data for 2x2x10 input 2x3x10 weights. +const int simple_input_size = 20; +int simple_input_dims[] = { 2, 2, 10 }; +const float simple_input_data[] = { + 1, 2, 3, 4, 5, 6, 7, 8, -9, -10, // b = 0 + 1, 2, 3, 4, 5, 6, 7, -8, 9, -10, // b = 1 +}; +const int simple_weights_size = 30; +int simple_weights_dims[] = { 2, 3, 10 }; +const float simple_weights_data[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // u = 0 + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // u = 1 + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // u = 2 +}; +int simple_bias_dims[] = { 1, 3 }; +const float simple_bias_data[] = { 1, 2, 3 }; +const float simple_golden[] = { + 24, + 25, + 26, + 58, + 59, + 60, +}; +const int simple_output_size = 6; +int simple_output_dims[] = { 2, 2, 3 }; + +// Test data for 2x2x10 input 2x3x10 weights with negative outputs to test relu. +const int relu_input_size = 20; +int relu_input_dims[] = { 2, 2, 10 }; +const float relu_input_data[] = { + 1, 2, 3, 4, 5, 6, 7, 8, -9, -10, // b = 0 + 1, 2, 3, 4, 5, 6, 7, -8, 9, -10, // b = 1 +}; +const int relu_weights_size = 30; +int relu_weights_dims[] = { 2, 3, 10 }; +const float relu_weights_data[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // u = 0 + -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, // u = 1 + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // u = 2 +}; +int relu_bias_dims[] = { 1, 3 }; +const float relu_bias_data[] = { 1, -2, 3 }; +const float relu_golden[] = { + 24, + 0, + 26, + 58, + 0, + 60, +}; +const int relu_output_size = 6; +int relu_output_dims[] = { 2, 2, 3 }; + +// Input and filter similar to real model. Input shape is 1x64 and output is +// 1x16. +const int representative_64x16_input_size = 64; +int representative_64x16_input_dims[] = { 2, 1, 64 }; +const float representative_64x16_input_data[] = { + 0.0000, 0.1543, 0.0000, 0.0000, 1.8520, 0.0000, 4.7844, 1.1832, + 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.5948, 0.0000, + 1.5948, 1.9549, 0.0000, 1.2347, 0.0000, 1.5948, 1.5948, 0.5145, + 0.0000, 0.0000, 0.0000, 0.0000, 2.6237, 0.0000, 0.0000, 0.0000, + 1.3890, 5.3503, 2.3665, 2.9838, 0.0000, 1.2861, 0.0000, 3.0867, + 0.9775, 0.0000, 5.9676, 0.0000, 0.0000, 1.4405, 0.5145, 2.5723, + 3.1896, 4.4757, 0.0000, 0.0000, 0.0000, 0.0000, 4.1671, 0.0000, + 2.8295, 3.0353, 0.0000, 2.7780, 0.0000, 0.0000, 0.0000, 0.0000 +}; +const int representative_64x16_weights_size = 64 * 16; +int representative_64x16_weights_dims[] = { 2, 16, 64 }; +const float representative_64x16_weights_data[] = { + -0.1075, 0.1245, 0.1811, -0.1302, -0.1868, 0.0679, 0.1245, 0.2321, + -0.1981, -0.2094, 0.1358, -0.1698, 0.0113, 0.0566, 0.1358, -0.2490, + 0.0000, -0.1189, -0.0170, -0.0396, -0.3113, 0.1641, -0.4188, 0.0566, + -0.4471, 0.4754, -0.0396, 0.0113, -0.0340, 0.0170, 0.0170, 0.1811, + -0.0792, 0.4981, 0.2490, -0.1924, 0.0792, 0.1868, -0.1075, -0.3962, + 0.1358, 0.2547, -0.1245, -0.0962, -0.0283, 0.4132, -0.0057, -0.5150, + 0.1019, 0.1585, -0.0962, -0.2207, -0.2377, 0.2830, 0.4471, 0.0170, + 0.0566, 0.2038, 0.1019, -0.0226, 0.2830, 0.1415, 0.0283, -0.0792, + 0.4301, 0.3226, -0.1132, 0.4981, -0.3849, -0.2943, -0.2547, -0.2264, + 0.0453, -0.0170, 0.0396, 0.1415, 0.3000, 0.2547, 0.0962, 0.2151, + -0.1585, -0.1302, -0.0057, -0.2773, 0.0283, -0.0906, 0.1302, -0.1075, + -0.0566, 0.1755, 0.2773, 0.0283, 0.0566, 0.1528, -0.0736, -0.2830, + 0.0792, 0.0962, -0.2321, -0.0113, 0.2660, -0.2887, -0.0566, 0.0057, + -0.2547, -0.0679, -0.2321, 0.0340, 0.1868, 0.2490, 0.2264, -0.3509, + 0.1585, -0.0849, -0.0623, 0.1132, 0.3396, -0.2490, 0.1528, 0.0679, + 0.1755, 0.4754, -0.0057, -0.2151, -0.1415, -0.1302, -0.2717, 0.1641, + 0.5037, -0.2321, 0.0170, -0.1755, -0.1075, -0.0226, 0.2038, -0.0340, + -0.5150, -0.3113, 0.1472, -0.0226, 0.1528, 0.1189, -0.1472, 0.0396, + -0.3000, -0.1924, -0.0283, 0.0283, 0.1641, 0.0736, 0.1472, -0.1755, + -0.1132, 0.0113, -0.1868, -0.2604, -0.3283, -0.0509, 0.0283, -0.0679, + 0.0623, 0.0792, -0.0283, -0.0962, 0.0396, 0.1641, 0.4584, 0.3226, + 0.0226, -0.1811, 0.2377, -0.1019, 0.2321, 0.1811, -0.1924, -0.0057, + 0.0736, 0.0113, 0.2547, -0.2264, -0.0170, -0.0396, 0.1245, -0.1415, + 0.1755, 0.3679, -0.2377, -0.0396, -0.1585, -0.3000, -0.1641, -0.1302, + -0.0396, -0.1698, 0.1189, 0.2434, 0.1132, -0.1245, -0.1415, 0.0453, + 0.1868, -0.0906, -0.1189, -0.0509, 0.0057, -0.1189, -0.0057, 0.0170, + -0.1924, 0.2207, 0.0792, -0.4641, -0.2660, 0.2943, 0.1358, -0.0340, + -0.3339, -0.1189, 0.0906, -0.4358, 0.0453, -0.1755, 0.1415, 0.0340, + 0.1924, -0.0057, 0.2321, -0.2094, -0.1132, 0.0000, 0.1924, -0.3000, + 0.0340, -0.3396, -0.0906, -0.0340, 0.1641, -0.0226, -0.1472, -0.1019, + 0.2377, -0.0962, -0.3396, -0.5433, 0.0906, 0.2151, -0.0679, 0.1755, + 0.1528, 0.0283, -0.4188, -0.0340, -0.0057, -0.0679, 0.0509, 0.1472, + -0.3849, -0.0113, 0.3962, 0.0849, 0.1472, 0.0340, -0.1358, 0.1641, + -0.2038, 0.2151, -0.1189, -0.3679, 0.0906, -0.0679, 0.5716, -0.0057, + -0.0736, 0.0113, 0.2830, -0.2887, 0.0396, 0.0849, -0.0736, -0.0736, + -0.3679, 0.2264, 0.0113, -0.1641, 0.0396, -0.1132, -0.0623, 0.3113, + 0.5999, -0.1415, 0.1472, -0.2038, -0.1132, -0.2377, 0.0566, 0.1755, + -0.0057, -0.0453, 0.0226, 0.1132, 0.1698, 0.0340, -0.0226, 0.0226, + 0.4415, -0.3792, 0.0792, 0.3736, -0.5999, -0.3056, -0.1924, -0.1132, + -0.0962, 0.0283, 0.0000, -0.3339, -0.3226, 0.3679, -0.0453, -0.1641, + 0.0170, 0.1302, -0.0170, -0.0509, 0.1755, -0.0283, -0.1302, -0.2887, + -0.0679, 0.0340, 0.4641, 0.2321, 0.7188, 0.3339, -0.1075, 0.4754, + -0.0226, 0.3226, -0.1528, -0.0849, 0.0509, -0.1981, 0.0113, 0.2321, + 0.2773, -0.1019, 0.4075, 0.0396, 0.0792, 0.1132, -0.0906, -0.4188, + 0.1924, -0.3679, -0.6396, 0.1358, 0.4981, 0.4132, -0.0283, 0.3849, + -0.3509, -0.0566, -0.0962, 0.3113, -0.1811, 0.4019, 0.0453, -0.0057, + -0.1868, -0.2490, -0.0792, -0.3622, 0.1924, -0.0453, -0.1528, -0.1811, + 0.5943, -0.1302, 0.3170, -0.0170, 0.0509, -0.1528, -0.1755, 0.5547, + 0.2490, -0.0906, 0.0000, 0.1698, 0.0000, 0.0340, -0.1132, -0.0509, + -0.1755, -0.2943, 0.1472, 0.0849, 0.0000, 0.1528, -0.0566, 0.1528, + -0.5264, -0.5320, -0.0736, 0.0566, 0.2604, -0.4075, 0.0962, -0.3453, + -0.1415, 0.0057, 0.3905, 0.2830, 0.3679, 0.5320, -0.2660, 0.0340, + 0.0736, 0.0057, 0.2207, 0.4471, 0.0849, 0.3000, -0.0057, -0.0623, + 0.1415, -0.0566, 0.5264, -0.0340, 0.0226, -0.0623, -0.0113, -0.5037, + -0.4471, 0.0170, -0.0396, -0.1358, -0.1698, 0.1924, 0.0057, -0.1585, + 0.0849, -0.1698, 0.0057, -0.1245, -0.0170, -0.1755, -0.0792, 0.5264, + 0.1358, 0.2434, 0.1585, -0.4188, -0.1472, -0.1358, -0.0849, -0.1189, + 0.5037, 0.0736, -0.0453, -0.2434, 0.1868, -0.0679, 0.1415, -0.2717, + 0.2604, 0.0057, -0.1528, -0.1811, 0.0226, -0.1641, 0.3170, -0.1981, + 0.1245, 0.0226, 0.0566, 0.2830, -0.1755, 0.0396, -0.2094, 0.1924, + 0.1698, 0.0283, 0.1641, 0.0849, 0.0000, -0.1698, -0.1415, -0.3000, + 0.4471, 0.3056, -0.0283, -0.4245, -0.0453, 0.0226, 0.0000, -0.1075, + -0.1528, -0.3226, 0.2773, -0.2264, -0.1811, 0.1755, -0.3566, -0.4188, + 0.1755, -0.0057, 0.2038, 0.1075, 0.3679, -0.0792, 0.2207, -0.0453, + 0.3736, 0.2943, -0.0113, -0.0623, 0.2264, 0.0113, -0.0396, -0.2207, + 0.0453, -0.2830, -0.1302, 0.0623, -0.1924, -0.1811, -0.2717, 0.2830, + 0.2094, 0.0170, -0.3170, -0.0283, -0.1189, -0.0509, -0.0566, -0.3622, + 0.1132, -0.0906, 0.1132, 0.4019, -0.4698, -0.1019, -0.1075, -0.2094, + -0.2207, -0.0509, 0.0057, 0.1019, -0.0509, 0.2264, -0.5716, 0.0226, + -0.4019, 0.1641, -0.3000, 0.3849, 0.1245, 0.0679, 0.3056, 0.2377, + 0.0679, -0.0170, -0.5377, -0.0170, 0.0057, 0.1358, -0.1132, -0.2038, + 0.0679, 0.1075, -0.2773, 0.5943, 0.0623, -0.1472, 0.3566, 0.0396, + -0.2377, 0.2604, 0.0849, 0.1358, -0.3792, -0.0340, -0.1415, 0.3566, + -0.3736, 0.1245, 0.0566, 0.3396, 0.0736, 0.4019, -0.1528, 0.1075, + 0.0792, -0.2547, 0.0453, -0.1755, 0.1868, -0.2547, 0.1075, 0.0623, + 0.1698, -0.0170, 0.1585, -0.0736, -0.4358, -0.0113, -0.6792, -0.0849, + -0.0396, -0.6056, 0.1358, 0.1189, 0.2547, 0.1528, 0.2887, 0.0453, + -0.1075, -0.3283, -0.0453, -0.0509, 0.2038, 0.2547, 0.0849, -0.0566, + -0.1698, 0.0509, -0.0113, -0.1585, 0.1924, -0.0792, -0.1868, 0.0509, + -0.1698, -0.0849, -0.0170, 0.0453, 0.3170, 0.0906, -0.5943, -0.1245, + 0.1585, -0.1755, -0.2151, 0.0906, 0.1924, 0.3170, -0.2490, -0.5660, + -0.0283, 0.0962, -0.1358, 0.1585, 0.0057, -0.2604, 0.1189, -0.0170, + 0.3509, 0.0623, 0.0679, -0.1302, -0.0792, 0.0906, -0.0792, 0.0849, + -0.1924, 0.2604, -0.1245, -0.3679, 0.0340, 0.0113, -0.1698, 0.2490, + 0.0283, 0.1019, -0.3736, 0.1019, -0.2207, -0.0340, 0.3170, 0.1755, + 0.0962, 0.3226, -0.0113, -0.1189, -0.2321, -0.0226, -0.2434, -0.0170, + -0.1585, -0.0283, -0.1132, 0.0679, -0.4188, -0.0453, 0.1528, -0.1302, + -0.3792, 0.1415, -0.1358, -0.1811, 0.1302, 0.1415, 0.5207, 0.0509, + -0.1358, -0.0396, -0.2434, 0.0396, 0.0792, -0.2264, -0.1415, 0.0906, + 0.1245, 0.0170, 0.0623, -0.1415, 0.2773, -0.3566, -0.0396, 0.2887, + 0.4188, 0.1698, -0.2547, 0.1132, -0.0453, -0.0113, -0.1358, 0.1075, + 0.0566, 0.1075, 0.2604, -0.0849, -0.2490, 0.1415, 0.0509, -0.2151, + 0.0340, 0.1698, 0.0509, -0.0906, 0.0566, -0.1075, -0.2151, 0.2038, + -0.1924, -0.0113, 0.2830, 0.1358, -0.1189, 0.0113, -0.5603, -0.2830, + -0.2943, 0.0453, -0.0396, 0.1358, 0.0566, 0.2038, -0.3283, -0.0509, + 0.0509, 0.1641, 0.2094, -0.2038, -0.1868, -0.1585, -0.2207, -0.1302, + 0.0396, -0.1019, -0.0679, 0.1075, -0.4584, -0.2207, 0.2434, -0.0113, + 0.0849, 0.1755, -0.3056, 0.1585, -0.2547, 0.0453, 0.0906, -0.1358, + -0.0679, -0.0509, 0.0679, -0.3509, 0.0057, 0.0453, 0.4132, -0.1981, + 0.2264, -0.0736, 0.1075, 0.0679, -0.0906, -0.3113, 0.0509, 0.0849, + 0.2604, 0.0623, -0.3113, 0.3849, 0.0000, 0.6396, -0.2038, -0.1019, + 0.1245, -0.0453, 0.1641, 0.1075, -0.1075, -0.2660, -0.4528, -0.0566, + -0.0170, 0.0453, 0.0340, 0.1189, -0.2434, -0.0283, -0.1811, 0.2547, + 0.0000, -0.0226, 0.4471, 0.1019, -0.1472, 0.0849, 0.1075, 0.1075, + 0.0283, -0.2773, 0.4415, -0.1811, 0.2717, 0.3170, 0.0509, 0.0623, + -0.0962, 0.1585, -0.0792, -0.1811, -0.0792, -0.3283, 0.0962, -0.1698, + -0.0736, 0.0453, 0.0962, -0.3566, -0.4584, 0.3396, -0.4811, 0.3056, + -0.1755, 0.2490, -0.1698, -0.2377, -0.3339, -0.0453, 0.1811, 0.0736, + 0.0340, -0.0962, -0.0113, -0.3056, -0.3339, 0.2038, 0.2038, -0.1924, + 0.2547, -0.4471, -0.0849, -0.2038, 0.3566, -0.4811, 0.3453, 0.0849, + 0.1189, 0.3170, -0.1358, 0.2717, 0.0113, -0.4754, -0.1924, 0.4245, + -0.2773, 0.3453, 0.2264, 0.2943, 0.5320, 0.2773, -0.2264, -0.1019, + -0.1132, -0.3962, 0.3679, 0.0509, -0.0623, -0.0906, -0.5603, -0.1641, + -0.3170, -0.2377, 0.1415, -0.0509, 0.0792, 0.0170, -0.0226, -0.0057, + -0.1358, -0.4245, 0.3905, 0.3113, 0.0340, -0.1189, 0.2887, -0.2943, + -0.3056, 0.2434, 0.1019, -0.0170, 0.3849, 0.1528, -0.0736, -0.0170, + 0.0792, 0.1755, 0.0509, 0.3509, 0.1472, 0.1528, 0.1472, 0.0057, + 0.0113, -0.0113, -0.3283, -0.3962, -0.0792, -0.1245, -0.0283, -0.1868, + 0.4019, 0.2943, -0.0906, -0.2321, 0.6056, 0.1189, 0.0340, -0.2207, + -0.0453, 0.3339, 0.2377, -0.1641, 0.3736, 0.2151, -0.2547, 0.0453, + 0.1924, -0.1019, -0.0340, -0.2207, 0.3962, -0.4471, -0.2547, -0.2151, + -0.3736, 0.0283, 0.1189, 0.0283, 0.0736, 0.0396, 0.1019, 0.0283, + 0.0170, 0.2321, 0.3509, -0.0226, -0.0226, 0.0736, 0.0283, 0.1641, + -0.0906, 0.1811, 0.0226, 0.5716, -0.0396, -0.0509, -0.1641, -0.0509, + 0.4132, -0.2604, 0.1019, -0.0283, -0.0340, 0.0453, 0.1472, -0.0057, + 0.2717, -0.2094, 0.3396, 0.0340, 0.1245, 0.2547, -0.5886, 0.2717, + -0.0906, 0.1641, 0.0962, -0.0792, -0.0113, 0.2264, -0.0736, 0.3170, + 0.0623, 0.0679, 0.0623, -0.0792, -0.2207, 0.1924, 0.1245, -0.2773 +}; +int representative_64x16_bias_dims[] = { 1, 16 }; +const float representative_64x16_bias_data[] = { + -0.0084, 0.0006, 0.0000, 0.0000, -0.0087, -0.0006, -0.0003, -0.0003, + 0.0006, -0.0003, -0.0003, -0.0003, -0.0253, 0.0012, 0.0000, 0.0000 +}; +const float representative_64x16_golden[] = { + 3.8624, -2.9580, 4.3043, -1.2844, -1.5769, -2.7998, -0.1011, -3.4029, + -1.0557, -7.1931, -1.4852, -0.4163, 1.7186, -0.6965, 0.3580, 2.7378 +}; +const int representative_64x16_output_size = 16; +int representative_64x16_output_dims[] = { 2, 1, 16 }; + +template +TfLiteStatus ValidateFullyConnectedGoldens( + TfLiteTensor *tensors, const int tensors_size, + const TfLiteFusedActivation activation, const float tolerance, + const int output_len, const T *golden, T *output_data) +{ + TfLiteFullyConnectedParams builtin_data = { + activation, kTfLiteFullyConnectedWeightsFormatDefault, false, false + }; + + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_FULLY_CONNECTED(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TfLiteStatus status = runner.InitAndPrepare(); + if (status != kTfLiteOk) { + return status; + } + + status = runner.Invoke(); + if (status != kTfLiteOk) { + return status; + } + + for (int i = 0; i < output_len; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], tolerance); + } + return kTfLiteOk; +} + +#if !defined(XTENSA) // Needed to avoid build error from unused functions. +TfLiteStatus TestFullyConnectedFloat( + int *input_dims_data, const float *input_data, int *weights_dims_data, + const float *weights_data, int *bias_dims_data, const float *bias_data, + const float *golden, int *output_dims_data, + TfLiteFusedActivation activation, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *weights_dims = IntArrayFromInts(weights_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(weights_data, weights_dims), + CreateTensor(bias_data, bias_dims), + CreateTensor(output_data, output_dims), + }; + + return ValidateFullyConnectedGoldens(tensors, tensors_size, activation, 1e-4f, + output_dims_count, golden, output_data); +} +#endif + +template +TfLiteStatus TestFullyConnectedQuantized( + int *input_dims_data, const float *input_data, T *input_quantized, + const float input_scale, const int input_zero_point, int *weights_dims_data, + const float *weights_data, T *weights_quantized, const float weights_scale, + const int weights_zero_point, int *bias_dims_data, const float *bias_data, + int32_t *bias_quantized, const float *golden, T *golden_quantized, + int *output_dims_data, const float output_scale, + const int output_zero_point, TfLiteFusedActivation activation, + T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *weights_dims = IntArrayFromInts(weights_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(weights_data, weights_quantized, weights_dims, + weights_scale, weights_zero_point), + CreateQuantizedBiasTensor(bias_data, bias_quantized, bias_dims, + input_scale, weights_scale), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + Quantize(golden, golden_quantized, output_dims_count, output_scale, + output_zero_point); + + return ValidateFullyConnectedGoldens(tensors, tensors_size, activation, 0.0f, + output_dims_count, golden_quantized, + output_data); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +#if !defined(XTENSA) && !defined(CEVA_BX1) && !defined(CEVA_SP500) +// TODO(b/170503075): xtensa kernels are less general +// than reference kernels and we ifdef out test cases that are currently known +// to fail. + +// CEVA's fully connected implementation assumes weights_zero_point=0 as +// described in TFLite's quantization specification. tests which use a different +// zero point will so ifdefed out. +// See tflite quantization spec: +// https://www.tensorflow.org/lite/performance/quantization_spec +TF_LITE_MICRO_TEST(SimpleTest) +{ + float output_data[tflite::testing::simple_output_size]; + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedFloat( + tflite::testing::simple_input_dims, + tflite::testing::simple_input_data, + tflite::testing::simple_weights_dims, + tflite::testing::simple_weights_data, + tflite::testing::simple_bias_dims, tflite::testing::simple_bias_data, + tflite::testing::simple_golden, tflite::testing::simple_output_dims, + kTfLiteActNone, output_data), + kTfLiteOk); +} + +#endif + +TF_LITE_MICRO_TEST(SimpleTestQuantizedInt8) +{ + const float input_scale = 1.0f; + const int input_zero_point = -1; + const float weights_scale = 1.0f; + const int weights_zero_point = 0; + const float output_scale = 0.5f; + const int output_zero_point = -1; + + int8_t input_quantized[tflite::testing::simple_input_size]; + int8_t weights_quantized[tflite::testing::simple_weights_size]; + int32_t bias_quantized[tflite::testing::simple_output_size]; + int8_t golden_quantized[tflite::testing::simple_output_size]; + int8_t output_data[tflite::testing::simple_output_size]; + + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedQuantized( + tflite::testing::simple_input_dims, + tflite::testing::simple_input_data, input_quantized, input_scale, + input_zero_point, tflite::testing::simple_weights_dims, + tflite::testing::simple_weights_data, weights_quantized, + weights_scale, weights_zero_point, tflite::testing::simple_bias_dims, + tflite::testing::simple_bias_data, bias_quantized, + tflite::testing::simple_golden, golden_quantized, + tflite::testing::simple_output_dims, output_scale, output_zero_point, + kTfLiteActNone, output_data), + kTfLiteOk); +} + +TF_LITE_MICRO_TEST(SimpleTest4DInputQuantizedInt8) +{ + const float input_scale = 1.0f; + const int input_zero_point = -1; + const float weights_scale = 1.0f; + const int weights_zero_point = 0; + + const float output_scale = 0.5f; + const int output_zero_point = -1; + + int input_dims_4d[] = { 4, 1, 1, 2, 10 }; + + int8_t input_quantized[tflite::testing::simple_input_size]; + int8_t weights_quantized[tflite::testing::simple_weights_size]; + int32_t bias_quantized[tflite::testing::simple_output_size]; + int8_t golden_quantized[tflite::testing::simple_output_size]; + int8_t output_data[tflite::testing::simple_output_size]; + + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedQuantized( + input_dims_4d, tflite::testing::simple_input_data, input_quantized, + input_scale, input_zero_point, tflite::testing::simple_weights_dims, + tflite::testing::simple_weights_data, weights_quantized, + weights_scale, weights_zero_point, tflite::testing::simple_bias_dims, + tflite::testing::simple_bias_data, bias_quantized, + tflite::testing::simple_golden, golden_quantized, + tflite::testing::simple_output_dims, output_scale, output_zero_point, + kTfLiteActNone, output_data), + kTfLiteOk); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantizedInt8Relu) +{ + const float input_scale = 1.0f; + const int input_zero_point = -1; + const float weights_scale = 1.0f; + const int weights_zero_point = 0; + + const float output_scale = 0.5f; + const int output_zero_point = -128; + + int8_t input_quantized[tflite::testing::relu_input_size]; + int8_t weights_quantized[tflite::testing::relu_weights_size]; + int32_t bias_quantized[tflite::testing::relu_output_size]; + int8_t golden_quantized[tflite::testing::relu_output_size]; + int8_t output_data[tflite::testing::relu_output_size]; + + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedQuantized( + tflite::testing::relu_input_dims, tflite::testing::relu_input_data, + input_quantized, input_scale, input_zero_point, + tflite::testing::relu_weights_dims, + tflite::testing::relu_weights_data, weights_quantized, weights_scale, + weights_zero_point, tflite::testing::relu_bias_dims, + tflite::testing::relu_bias_data, bias_quantized, + tflite::testing::relu_golden, golden_quantized, + tflite::testing::relu_output_dims, output_scale, output_zero_point, + kTfLiteActRelu, output_data), + kTfLiteOk); +} + +#if !defined(XTENSA) // TODO(b/170503075): xtensa kernels are less general than \ + // reference kernels and we ifdef out test cases that are \ + // currently known to fail. +TF_LITE_MICRO_TEST(SimpleTest4DInput) +{ + int input_dims_4d[] = { 4, 1, 1, 2, 10 }; + + float output_data[tflite::testing::simple_output_size]; + + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedFloat( + input_dims_4d, tflite::testing::simple_input_data, + tflite::testing::simple_weights_dims, + tflite::testing::simple_weights_data, + tflite::testing::simple_bias_dims, tflite::testing::simple_bias_data, + tflite::testing::simple_golden, tflite::testing::simple_output_dims, + kTfLiteActNone, output_data), + kTfLiteOk); +} + +TF_LITE_MICRO_TEST(Representative1x64Input1x16Output) +{ + float output_data[tflite::testing::representative_64x16_output_size]; + + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedFloat( + tflite::testing::representative_64x16_input_dims, + tflite::testing::representative_64x16_input_data, + tflite::testing::representative_64x16_weights_dims, + tflite::testing::representative_64x16_weights_data, + tflite::testing::representative_64x16_bias_dims, + tflite::testing::representative_64x16_bias_data, + tflite::testing::representative_64x16_golden, + tflite::testing::representative_64x16_output_dims, kTfLiteActNone, + output_data), + kTfLiteOk); +} + +#endif + +TF_LITE_MICRO_TEST(Representative1x64Input1x16OutputQuantizedInt8) +{ + const float input_scale = 0.051445; + const int input_zero_point = -128; + const float weights_scale = 0.005660; + const int weights_zero_point = 0; + + const float output_scale = 0.069785; + const int output_zero_point = -9; + + int8_t input_quantized[tflite::testing::representative_64x16_input_size]; + int8_t weights_quantized[tflite::testing::representative_64x16_weights_size]; + int32_t bias_quantized[tflite::testing::representative_64x16_output_size]; + int8_t golden_quantized[tflite::testing::representative_64x16_output_size]; + int8_t output_data[tflite::testing::representative_64x16_output_size]; + + TF_LITE_MICRO_EXPECT_EQ( + tflite::testing::TestFullyConnectedQuantized( + tflite::testing::representative_64x16_input_dims, + tflite::testing::representative_64x16_input_data, input_quantized, + input_scale, input_zero_point, + tflite::testing::representative_64x16_weights_dims, + tflite::testing::representative_64x16_weights_data, weights_quantized, + weights_scale, weights_zero_point, + tflite::testing::representative_64x16_bias_dims, + tflite::testing::representative_64x16_bias_data, bias_quantized, + tflite::testing::representative_64x16_golden, golden_quantized, + tflite::testing::representative_64x16_output_dims, output_scale, + output_zero_point, kTfLiteActNone, output_data), + kTfLiteOk); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather.cc new file mode 100644 index 00000000..faa14bcd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather.cc @@ -0,0 +1,226 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kInputPositions = 1; +constexpr int kOutputTensor = 0; + +template +TfLiteStatus Gather(const TfLiteGatherParams *params, + const TfLiteEvalTensor *input, + const TfLiteEvalTensor *coords, TfLiteEvalTensor *output) +{ + const InputT *input_data = tflite::micro::GetTensorData(input); + const CoordsT *coords_data = tflite::micro::GetTensorData(coords); + InputT *output_data = tflite::micro::GetTensorData(output); + const TfLiteIntArray *input_dims = input->dims; + const int input_dims_size = input_dims->size; + int axis = params->axis; + if (axis < 0) { + axis += input_dims_size; + } + TFLITE_DCHECK_GE(axis, 0); + TFLITE_DCHECK_LT(axis, input_dims_size); + + int batch_dims = params->batch_dims; + // batch_dims should be in range: [-rank(coords), rank(coords)]. + // Negative batch_dims is added with rank of coords. + const TfLiteIntArray *coords_dims = coords->dims; + const int coords_dims_size = coords_dims->size; + if (batch_dims < 0) { + batch_dims += coords_dims_size; + } + TFLITE_DCHECK_GE(batch_dims, 0); + TFLITE_DCHECK_LT(batch_dims, input_dims_size); + TFLITE_DCHECK_LE(batch_dims, coords_dims_size); + TFLITE_DCHECK_GE(axis, batch_dims); + for (int i = 0; i < batch_dims; ++i) { + TFLITE_DCHECK_EQ(input_dims->data[i], coords_dims->data[i]); + } + + const int axis_size = input_dims->data[axis]; + + int batch_size = 1; + for (int i = 0; i < batch_dims; ++i) { + batch_size *= input_dims->data[i]; + } + int outer_size = 1; + for (int i = batch_dims; i < axis; ++i) { + outer_size *= input_dims->data[i]; + } + int inner_size = 1; + for (int i = axis + 1; i < input_dims_size; ++i) { + inner_size *= input_dims->data[i]; + } + int coord_size = 1; + for (int i = batch_dims; i < coords_dims_size; ++i) { + coord_size *= coords_dims->data[i]; + } + + for (int batch = 0; batch < batch_size; ++batch) { + for (int outer = 0; outer < outer_size; ++outer) { + for (int coord = 0; coord < coord_size; ++coord) { + TFLITE_DCHECK_GE(coords_data[coord], 0); + TFLITE_DCHECK_LT(coords_data[coord], axis_size); + std::memcpy(output_data + + (((batch * outer_size) + outer) * coord_size + coord) * + inner_size, + input_data + (((batch * outer_size) + outer) * axis_size + + coords_data[batch * coord_size + coord]) * + inner_size, + sizeof(InputT) * inner_size); + } + } + } + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const auto *params = + reinterpret_cast(node->builtin_data); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + const TfLiteTensor *coords; + TF_LITE_ENSURE_OK(context, + GetInputSafe(context, node, kInputPositions, &coords)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + switch (coords->type) { + case kTfLiteInt32: + break; + default: + TF_LITE_KERNEL_LOG(context, + "Positions of type '%s' are not supported by gather.", + TfLiteTypeGetName(coords->type)); + return kTfLiteError; + break; + } + + // Assign to output the input type. + output->type = input->type; + + // Check conditions for different types. + switch (input->type) { + case kTfLiteFloat32: + case kTfLiteInt8: + break; + default: + TF_LITE_KERNEL_LOG(context, "Type '%s' is not supported by gather.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + break; + } + + int axis = params->axis; + if (axis < 0) { + axis += NumDimensions(input); + } + TF_LITE_ENSURE(context, 0 <= axis && axis < NumDimensions(input)); + + int batch_dims = params->batch_dims; + // batch_dims should be in range: [-rank(coords), rank(coords)]. + // Negative batch_dims is added with rank of coords. + if (batch_dims < 0) { + batch_dims += NumDimensions(coords); + } + TF_LITE_ENSURE(context, batch_dims <= axis); + TF_LITE_ENSURE(context, 0 <= batch_dims && batch_dims < NumDimensions(input)); + TF_LITE_ENSURE(context, batch_dims <= NumDimensions(coords)); + for (int i = 0; i < batch_dims; ++i) { + TF_LITE_ENSURE_EQ(context, input->dims->data[i], coords->dims->data[i]); + } + + // GATHER updates the output tensor dimensions, but TfLiteTensor in the + // MicroInterpreter is a temporary allocation. We must therefore relocate the + // dims from the FlatBuffer to the persistant storage arena. + TfLiteEvalTensor *output_eval = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + TF_LITE_ENSURE_OK(context, tflite::micro::CreateWritableTensorDimsWithCopy( + context, output, output_eval)); + + TfLiteIntArray *output_shape = output->dims; + output_shape->size = + NumDimensions(input) + NumDimensions(coords) - 1 - batch_dims; + int output_index = 0; + for (int i = 0; i < axis; ++i) { + output_shape->data[output_index++] = input->dims->data[i]; + } + for (int i = batch_dims; i < coords->dims->size; ++i) { + output_shape->data[output_index++] = coords->dims->data[i]; + } + for (int i = axis + 1; i < input->dims->size; ++i) { + output_shape->data[output_index++] = input->dims->data[i]; + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const auto *params = + reinterpret_cast(node->builtin_data); + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *coords = + tflite::micro::GetEvalInput(context, node, kInputPositions); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + if (coords->type == kTfLiteInt32) { + switch (input->type) { + case kTfLiteFloat32: + return Gather(params, input, coords, output); + break; + case kTfLiteInt8: + return Gather(params, input, coords, output); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type '%s' is not supported by gather.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + break; + } + } + return kTfLiteOk; +} +} // namespace + +TfLiteRegistration Register_GATHER() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd.cc new file mode 100644 index 00000000..1b64786c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd.cc @@ -0,0 +1,206 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +constexpr int kParams = 0; +constexpr int kIndices = 1; +constexpr int kOutputTensor = 0; +constexpr int MAX_INDICES_ND = 5; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *params; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kParams, ¶ms)); + const TfLiteTensor *indices; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kIndices, &indices)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + switch (params->type) { + case kTfLiteFloat32: + case kTfLiteInt8: + break; + default: + TF_LITE_KERNEL_LOG(context, + "Params of type '%s' are not supported by gather_nd.", + TfLiteTypeGetName(params->type)); + return kTfLiteError; + break; + } + switch (indices->type) { + case kTfLiteInt32: + break; + default: + TF_LITE_KERNEL_LOG(context, + "Indices of type '%s' are not supported by gather_nd.", + TfLiteTypeGetName(indices->type)); + return kTfLiteError; + } + + const int params_rank = NumDimensions(params); + const int indices_rank = NumDimensions(indices); + const int indices_nd = SizeOfDimension(indices, indices_rank - 1); + if (params_rank < 1) { + TF_LITE_KERNEL_LOG(context, "Params must be at least a vector."); + return kTfLiteError; + } + if (indices_rank < 1) { + TF_LITE_KERNEL_LOG(context, "Indices must be at least a vector."); + return kTfLiteError; + } + if (indices_nd > params_rank) { + TF_LITE_KERNEL_LOG( + context, "Index innermost dimension length must be <= params rank."); + return kTfLiteError; + } + if (indices_nd > MAX_INDICES_ND) { + TF_LITE_KERNEL_LOG(context, + "Index innermost dimension length must not exceed %d.", + MAX_INDICES_ND); + return kTfLiteError; + } + + // Assign to output the input type. + output->type = params->type; + + // TFLM gather_nd does not create the output tensor, but it needs to ensure + // that the output shape is correct. The result shape is + // indices.shape[:-1] + params.shape[indices.shape[-1]:] + TfLiteIntArray *output_shape = output->dims; + int output_index = 0; + for (int i = 0; i < indices_rank - 1; ++i) { + output_shape->data[output_index++] = indices->dims->data[i]; + } + for (int i = indices_nd; i < params_rank; ++i) { + output_shape->data[output_index++] = params->dims->data[i]; + } + output_shape->size = output_index; + return kTfLiteOk; +} + +template +TfLiteStatus GatherNd(const TfLiteEvalTensor *params, + const TfLiteEvalTensor *indices, + TfLiteEvalTensor *output) +{ + const int indices_dims = indices->dims->size; + const int indices_nd = indices->dims->data[indices_dims - 1]; + const int params_dims = params->dims->size; + const IndicesT *index_data = tflite::micro::GetTensorData(indices); + const ParamsT *param_data = tflite::micro::GetTensorData(params); + ParamsT *output_data = tflite::micro::GetTensorData(output); + + int n_slices = 1; + for (int i = 0; i < indices_dims - 1; ++i) { + n_slices *= indices->dims->data[i]; + } + + // If indices[-1] == params.rank, fetch single elements. + // If indices[-1] < params.rank, fetch slices. + int slice_size = 1; + for (int i = indices_nd; i < params_dims; ++i) { + slice_size *= params->dims->data[i]; + } + + int remain_flat_size = ElementCount(*params->dims); + + // Number of elements per dimension + int dims_to_count[MAX_INDICES_ND]; + for (int i = 0; i < indices_nd; ++i) { + dims_to_count[i] = remain_flat_size / params->dims->data[i]; + remain_flat_size = dims_to_count[i]; + } + + for (int i = 0; i < n_slices; ++i) { + int from_pos = 0; + for (int j = 0; j < indices_nd; ++j) { + int offset = i * indices_nd + j; + IndicesT index = index_data[offset]; + from_pos += index * dims_to_count[j]; + } + std::memcpy(output_data + i * slice_size, param_data + from_pos, + sizeof(ParamsT) * slice_size); + } + return kTfLiteOk; +} + +template +TfLiteStatus EvalGatherNd(TfLiteContext *context, + const TfLiteEvalTensor *params, + const TfLiteEvalTensor *indices, + TfLiteEvalTensor *output) +{ + switch (params->type) { + case kTfLiteFloat32: + return GatherNd(params, indices, output); + break; + case kTfLiteInt8: + return GatherNd(params, indices, output); + break; + default: + TF_LITE_KERNEL_LOG(context, + "Params type '%s' are not supported by gather_nd.", + TfLiteTypeGetName(params->type)); + return kTfLiteError; + } +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *params = + tflite::micro::GetEvalInput(context, node, kParams); + const TfLiteEvalTensor *indices = + tflite::micro::GetEvalInput(context, node, kIndices); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (indices->type) { + case kTfLiteInt32: + return EvalGatherNd(context, params, indices, output); + break; + default: + TF_LITE_KERNEL_LOG(context, + "Indices of type '%s' are not supported by gather_nd.", + TfLiteTypeGetName(indices->type)); + return kTfLiteError; + } +} +} // namespace + +TfLiteRegistration Register_GATHER_ND() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd_test.cc new file mode 100644 index 00000000..1255bfba --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_nd_test.cc @@ -0,0 +1,316 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void TestGatherNd(int *param_dims, const ParamType *param_data, int *index_dims, + const IndexType *index_data, int *output_dims, + ParamType *output_data, + const ParamType *expected_output_data) +{ + TfLiteIntArray *pdims = IntArrayFromInts(param_dims); + TfLiteIntArray *idims = IntArrayFromInts(index_dims); + TfLiteIntArray *odims = IntArrayFromInts(output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(param_data, pdims), + CreateTensor(index_data, idims), + CreateTensor(output_data, odims), + }; + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_GATHER_ND(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + // The output tensor's data and shape have been updated by the kernel. + TfLiteTensor *actual_output_tensor = &tensors[2]; + TfLiteIntArray *actual_output_dims = actual_output_tensor->dims; + const int output_size = ElementCount(*actual_output_dims); + for (int i = 0; i < output_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(GatherNd_ElementIndexingIntoMatrix) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int index_dims[] = { 2, 2, 2 }; + const int32_t index_data[] = { 0, 0, 1, 1 }; + const float input_data[] = { 1.1, 1.2, 2.1, 2.2 }; + const float golden_data[] = { 1.1, 2.2 }; + float output_data[2]; + int output_dims[] = { 1, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_SliceIndexingIntoMatrix) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int index_dims[] = { 2, 2, 1 }; + const int32_t index_data[] = { 1, 0 }; + const float input_data[] = { 1.1, 1.2, 2.1, 2.2 }; + const float golden_data[] = { 2.1, 2.2, 1.1, 1.2 }; + float output_data[4]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_BatchedIndexingIntoMatrix1) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int index_dims[] = { 3, 2, 1, 1 }; + const int32_t index_data[] = { 1, 0 }; + const float input_data[] = { 1.1, 1.2, 2.1, 2.2 }; + const float golden_data[] = { 2.1, 2.2, 1.1, 1.2 }; + float output_data[4]; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_BatchedIndexingIntoMatrix2) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int index_dims[] = { 3, 2, 1, 2 }; + const int32_t index_data[] = { 0, 0, 1, 1 }; + const float input_data[] = { 1.1, 1.2, 2.1, 2.2 }; + const float golden_data[] = { 1.1, 2.2 }; + float output_data[2]; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_DuplicateIndexingIntoMatrix) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int index_dims[] = { 2, 2, 2 }; + const int32_t index_data[] = { 0, 0, 0, 0 }; + const float input_data[] = { 1.1, 1.2, 2.1, 2.2 }; + const float golden_data[] = { 1.1, 1.1 }; + float output_data[2]; + int output_dims[] = { 1, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_ElementIndexingIntoRank3Tensor) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 3, 1, 2, 3 }; + const int32_t index_data[] = { 0, 0, 1, 1, 1, 0 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { -1.2, -4.1 }; + float output_data[2]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_SliceIndexingIntoRank3Tensor) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 2, 2, 1 }; + const int32_t index_data[] = { 0, 2 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + float output_data[12]; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_BatchedIndexingIntoRank3Tensor1) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 3, 2, 1, 3 }; + const int32_t index_data[] = { 0, 0, 1, 1, 1, 0 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { -1.2, -4.1 }; + float output_data[2]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_BatchedIndexingIntoRank3Tensor2) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 3, 3, 1, 1 }; + const int32_t index_data[] = { 1, 2, 0 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3, + 1.1, -1.2, 1.3, -2.1, 2.2, 2.3 }; + float output_data[18]; + int output_dims[] = { 4, 0, 0, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_BatchedIndexingIntoRank3Tensor3) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 3, 2, 2, 2 }; + const int32_t index_data[] = { 0, 1, 1, 0, 0, 0, 2, 1 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { -2.1, 2.2, 2.3, 3.1, 3.2, -3.3, + 1.1, -1.2, 1.3, 6.1, -6.2, 6.3 }; + float output_data[12]; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_BatchedIndexingIntoRank3Tensor4) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 3, 2, 2, 3 }; + const int32_t index_data[] = { 0, 0, 1, 1, 0, 1, 1, 1, 2, 2, 1, 2 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { -1.2, 3.2, 4.3, 6.3 }; + float output_data[4]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_DuplicateIndexingIntoRank3Tensor) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 2, 2, 2 }; + const int32_t index_data[] = { 0, 1, 0, 1 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { -2.1, 2.2, 2.3, -2.1, 2.2, 2.3 }; + float output_data[6]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_Float32Int32) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 2, 2, 2 }; + const int32_t index_data[] = { 0, 1, 1, 0 }; + const float input_data[] = { 1.1, -1.2, 1.3, -2.1, 2.2, 2.3, // + 3.1, 3.2, -3.3, -4.1, -4.2, 4.3, // + 5.1, -5.2, 5.3, 6.1, -6.2, 6.3 }; + const float golden_data[] = { -2.1, 2.2, 2.3, 3.1, 3.2, -3.3 }; + float output_data[6]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TEST(GatherNd_Int8Int32) +{ + // For input_dims[], index_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 3, 2, 3 }; + int index_dims[] = { 2, 2, 2 }; + const int32_t index_data[] = { 0, 1, 1, 0 }; + const int8_t input_data[] = { 1, -1, 1, -2, 2, 2, // + 3, 3, -3, -4, -4, 4, // + 5, -5, 5, 6, -6, 6 }; + const int8_t golden_data[] = { -2, 2, 2, 3, 3, -3 }; + int8_t output_data[6]; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGatherNd( + input_dims, input_data, index_dims, index_data, output_dims, output_data, + golden_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_test.cc new file mode 100644 index 00000000..9ca3fa05 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/gather_test.cc @@ -0,0 +1,486 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void TestGather(int *input_dims, const InType *input_data, int *positions_dims, + const PosType *positions_data, int *output_dims, + InType *output_data, const int *expected_output_dims, + const InType *expected_output_data, const int axis = 0, + const int batch_dims = 0) +{ + TfLiteIntArray *in_dims = IntArrayFromInts(input_dims); + TfLiteIntArray *pos_dims = IntArrayFromInts(positions_dims); + TfLiteIntArray *out_dims = IntArrayFromInts(output_dims); + TfLiteGatherParams params = { axis, batch_dims }; + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, in_dims), + CreateTensor(positions_data, pos_dims), + CreateTensor(output_data, out_dims, true), + }; + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_GATHER(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, ¶ms); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + // The output tensor's data and shape have been updated by the kernel. + TfLiteTensor *actual_output_tensor = &tensors[2]; + TfLiteIntArray *actual_output_dims = actual_output_tensor->dims; + const int actual_output_dims_size = actual_output_dims->size; + const int output_size = ElementCount(*actual_output_dims); + for (int i = 0; i < output_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } + + // Compare output tensor's shape if expected_output_dims[] is provided. + for (int i = 0; i < actual_output_dims_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_dims[i], + actual_output_dims->data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +// For all test functions below, dims[0] is the dimension count. +TF_LITE_MICRO_TEST(GatherOp_Shuffle) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 1, 0 }; + const float input_data[] = { -2.0, 0.2, 0.7, 0.8 }; + const float golden_data[] = { 0.7, 0.8, -2, 0.2 }; + float output_data[4]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Test0DIndex) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int positions_dims[] = { 0 }; + const int32_t positions_data[] = { 1 }; + const float input_data[] = { -2.0, 0.2, 0.7, 0.8 }; + const float golden_data[] = { 0.7, 0.8 }; + float output_data[2]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2 }; + int output_dims[] = { 1, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Test0DIndexWith0DResult) +{ + // 0D tensor is special case in current TFLite. Test it once to make sure + // existing workarounds are fine with it. + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 1, 3 }; + int positions_dims[] = { 0 }; + const int32_t positions_data[] = { 1 }; + const float input_data[] = { 1.0, 2.0, 3.0 }; + const float golden_data[] = { 2.0 }; + float output_data[1]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 0 }; + int output_dims[] = { 1, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Test1DInput1DIndex) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 1, 3 }; + int positions_dims[] = { 1, 1 }; + const int32_t positions_data[] = { 1 }; + const float input_data[] = { 1.0, 3.0, 5.0 }; + const float golden_data[] = { 3.0 }; + float output_data[1]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1 }; + int output_dims[] = { 1, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Test2DIndexWith2DResult) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 1, 3 }; + int positions_dims[] = { 2, 1, 2 }; + const int32_t positions_data[] = { 1, 0 }; + const float input_data[] = { 1.0, 2.0, 3.0 }; + const float golden_data[] = { 2.0, 1.0 }; + float output_data[2]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1, 2 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Duplicate) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 3, 1, 2, 2 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 0, 0 }; + const float input_data[] = { -2.0, 0.2, 0.7, 0.8 }; + const float golden_data[] = { -2, 0.2, 0.7, 0.8, -2, 0.2, 0.7, 0.8 }; + float output_data[8]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2, 2 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Slice) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 4, 1 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 1, 3 }; + const float input_data[] = { -2.0, 0.2, 0.7, 0.8 }; + const float golden_data[] = { 0.2, 0.8 }; + float output_data[2]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 1 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Axis1) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 1; + int input_dims[] = { 3, 1, 2, 3 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 1, 0 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6 }; + const float golden_data[] = { 4, 5, 6, 1, 2, 3 }; + float output_data[6]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1, 2, 3 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis); +} + +TF_LITE_MICRO_TEST(GatherOp_Axis1_0DIndex) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 1; + int input_dims[] = { 3, 1, 3, 2 }; + int positions_dims[] = { 0 }; + const int32_t positions_data[] = { 1 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6 }; + const float golden_data[] = { 3, 4 }; + float output_data[2]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1, 2 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis); +} + +TF_LITE_MICRO_TEST(GatherOp_Axis1Slice) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 1; + int input_dims[] = { 3, 1, 4, 2 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 3, 1 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const float golden_data[] = { 7, 8, 3, 4 }; + float output_data[4]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1, 2, 2 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis); +} + +TF_LITE_MICRO_TEST(GatherOp_LastAxis) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = -1; + int input_dims[] = { 3, 1, 2, 3 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 2, 0 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6 }; + const float golden_data[] = { 3, 1, 6, 4 }; + float output_data[4]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1, 2, 2 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis); +} + +TF_LITE_MICRO_TEST(GatherOp_LastAxis0DIndex) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = -1; + int input_dims[] = { 3, 1, 2, 3 }; + int positions_dims[] = { 0 }; + const int32_t positions_data[] = { 2 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6 }; + const float golden_data[] = { 3, 6 }; + float output_data[2]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 1, 2 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis); +} + +TF_LITE_MICRO_TEST(GatherOp_Float32Int32) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 1, 0 }; + const float input_data[] = { 13.3, -13.4, -1.4, 1.5 }; + const float golden_data[] = { -1.4, 1.5, 13.3, -13.4 }; + float output_data[4]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_Int8Int32) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + int input_dims[] = { 2, 2, 2 }; + int positions_dims[] = { 1, 2 }; + const int32_t positions_data[] = { 1, 0 }; + const int8_t input_data[] = { -13, -120, 14, 15 }; + const int8_t golden_data[] = { 14, 15, -13, -120 }; + int8_t output_data[4]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2 }; + int output_dims[] = { 2, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data); +} + +TF_LITE_MICRO_TEST(GatherOp_BatchDims2) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 2; + const int batch_dims = 2; + int input_dims[] = { 4, 2, 2, 3, 5 }; + int positions_dims[] = { 3, 2, 2, 2 }; + const int32_t positions_data[] = { 1, 0, 0, 1, 1, 0, 0, 1 }; + const float input_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 }; + const float golden_data[] = { 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 35, 36, 37, 38, 39, 30, 31, 32, 33, 34, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54 }; + float output_data[40]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2, 2, 5 }; + int output_dims[] = { 4, 0, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis, batch_dims); +} + +TF_LITE_MICRO_TEST(GatherOp_BatchDims1) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 2; + const int batch_dims = 1; + int input_dims[] = { 4, 2, 2, 3, 5 }; + int positions_dims[] = { 3, 2, 2, 2 }; + const int32_t positions_data[] = { 1, 0, 0, 1, 1, 0, 0, 1 }; + const int8_t input_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 }; + const int8_t golden_data[] = { + 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 20, 21, 22, 23, 24, 15, 16, 17, 18, 19, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 35, 36, 37, 38, 39, 30, 31, 32, + 33, 34, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 50, 51, 52, 53, + 54, 45, 46, 47, 48, 49, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54 + }; + int8_t output_data[80]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2, 2, 2, 5 }; + int output_dims[] = { 5, 0, 0, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis, batch_dims); +} + +TF_LITE_MICRO_TEST(GatherOp_NegativeBatchDims) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 2; + const int batch_dims = -2; + int input_dims[] = { 4, 2, 2, 3, 5 }; + int positions_dims[] = { 3, 2, 2, 2 }; + const int32_t positions_data[] = { 1, 0, 0, 1, 1, 0, 0, 1 }; + const int8_t input_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 }; + const int8_t golden_data[] = { + 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 20, 21, 22, 23, 24, 15, 16, 17, 18, 19, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 35, 36, 37, 38, 39, 30, 31, 32, + 33, 34, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 50, 51, 52, 53, + 54, 45, 46, 47, 48, 49, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54 + }; + int8_t output_data[80]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2, 2, 2, 5 }; + int output_dims[] = { 5, 0, 0, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis, batch_dims); +} + +TF_LITE_MICRO_TEST(GatherOp_BatchDimsEqualIndiceDims) +{ + // For input_dims[], positions_dims[], or output_dims[], element 0 is the + // number of dimensions in that array, not the actual dimension data. + const int axis = 3; + const int batch_dims = 3; + int input_dims[] = { 4, 2, 2, 2, 5 }; + int positions_dims[] = { 3, 2, 2, 2 }; + const int32_t positions_data[] = { 1, 0, 0, 1, 1, 0, 0, 1 }; + const int8_t input_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 }; + const int8_t golden_data[] = { 1, 5, 10, 16, 21, 25, 30, 36 }; + int8_t output_data[8]; + + // The kernel under test will fill output_dims[1] onward, to be compared + // against golden_dims[0] onward. + const int golden_dims[] = { 2, 2, 2 }; + int output_dims[] = { 3, 0, 0, 0 }; + tflite::testing::TestGather( + input_dims, input_data, positions_dims, positions_data, output_dims, + output_data, golden_dims, golden_data, axis, batch_dims); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish.cc new file mode 100644 index 00000000..c7b9c1e0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish.cc @@ -0,0 +1,146 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/hard_swish.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace hard_swish { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +void *HardSwishInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(HardSwishParams)); +} + +TfLiteStatus HardSwishPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + if (input->type == kTfLiteUInt8 || input->type == kTfLiteInt8) { + HardSwishParams *params = static_cast(node->user_data); + + params->input_zero_point = input->params.zero_point; + params->output_zero_point = output->params.zero_point; + + const float input_scale = input->params.scale; + const float hires_input_scale = (1.0f / 128.0f) * input_scale; + const float reluish_scale = 3.0f / 32768.0f; + const float output_scale = output->params.scale; + + const double output_multiplier = + static_cast(hires_input_scale / output_scale); + int32_t output_multiplier_fixedpoint_int32; + QuantizeMultiplier(output_multiplier, &output_multiplier_fixedpoint_int32, + ¶ms->output_multiplier_exponent); + DownScaleInt32ToInt16Multiplier( + output_multiplier_fixedpoint_int32, + ¶ms->output_multiplier_fixedpoint_int16); + + TF_LITE_ENSURE(context, params->output_multiplier_exponent <= 0); + + const double reluish_multiplier = + static_cast(hires_input_scale / reluish_scale); + int32_t reluish_multiplier_fixedpoint_int32; + QuantizeMultiplier(reluish_multiplier, &reluish_multiplier_fixedpoint_int32, + ¶ms->reluish_multiplier_exponent); + DownScaleInt32ToInt16Multiplier( + reluish_multiplier_fixedpoint_int32, + ¶ms->reluish_multiplier_fixedpoint_int16); + } + + return kTfLiteOk; +} + +TfLiteStatus HardSwishEval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + HardSwishParams *params = static_cast(node->user_data); + + switch (input->type) { + case kTfLiteFloat32: { + tflite::reference_ops::HardSwish( + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } break; + case kTfLiteUInt8: { + tflite::reference_ops::HardSwish( + *params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } break; + case kTfLiteInt8: { + tflite::reference_ops::HardSwish( + *params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } break; + default: { + TF_LITE_KERNEL_LOG( + context, + "Only float32/int8_t/uint8_t are supported currently, got %s", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + } + return kTfLiteOk; +} + +} // namespace hard_swish + +TfLiteRegistration Register_HARD_SWISH() +{ + return { /*init=*/hard_swish::HardSwishInit, + /*free=*/nullptr, + /*prepare=*/hard_swish::HardSwishPrepare, + /*invoke=*/hard_swish::HardSwishEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish_test.cc new file mode 100644 index 00000000..b1ad474e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/hard_swish_test.cc @@ -0,0 +1,353 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void GenerateUniformRandomVector(int size, float min, float max, + std::minstd_rand *random_engine, + float *result) +{ + // Never use std::uniform_*_distribution in tests, it's + // implementation-defined. Likewise, don't use std::default_random_engine, + // implementation-defined. Implementation-defined is bad because it means that + // any toolchain update or new platform may run into test failures. + // std::minstd_rand is a standard instantiation of + // std::linear_congruential_engine, the cheapest generator in c++11 stdlib, + // it's good enough here. + for (int i = 0; i < size; i++) { + // We don't care whether the `max` value may ever be produced exactly. + // It may actually be thanks to rounding, as std::minstd_rand::modulus + // is 2^31 - 1 is greater than the inverse float epsilon. + float random_value_scaled_0_1 = + (*random_engine)() * + (1.0f / static_cast(std::minstd_rand::modulus)); + result[i] = min + (max - min) * random_value_scaled_0_1; + } +} + +void EvalTestReferenceHardSwish(int size, float *input, float *result) +{ + for (int i = 0; i < size; i++) { + const float in = input[i]; + result[i] = in * std::min(6.0f, std::max(0.0f, in + 3)) * (1.0f / 6.0f); + } +} + +template +void TestHardSwishQuantized(int size, const T *output_data, + T *input_data_quantized, float *dequantized_output, + float input_min, float input_max, float output_min, + float output_max, std::minstd_rand *random_engine, + float *float_input_values, + float *float_ref_output_values) +{ + int input_dims_data[] = { 2, 1, size }; + int output_dims_data[] = { 2, 1, size }; + const float input_scale = ScaleFromMinMax(input_min, input_max); + const int input_zero_point = ZeroPointFromMinMax(input_min, input_max); + const float output_scale = ScaleFromMinMax(output_min, output_max); + const int output_zero_point = ZeroPointFromMinMax(output_min, output_max); + + // The numerical error for any 8bit quantized function is at least one half + // times the quantization step: 0.5 * (kOutMax - kOutMin) / 256. + // To that we add again the quantization step (kOutMax - kOutMin) / 256 + // to allow for an off-by-one rounding error. + const float kTolerance = + std::max(input_max - input_min, output_max - output_min) * (1.5f / 256.f); + + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + TF_LITE_MICRO_EXPECT_EQ(output_elements_count, size); + + GenerateUniformRandomVector(size, input_min, input_max, random_engine, + float_input_values); + EvalTestReferenceHardSwish(size, float_input_values, float_ref_output_values); + for (int i = 0; i < size; i++) { + float val = float_ref_output_values[i]; + float_ref_output_values[i] = + std::min(output_max, std::max(output_min, val)); + } + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(float_input_values, input_data_quantized, + input_dims, input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_HARD_SWISH(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + Dequantize(output_data, output_elements_count, output_scale, + output_zero_point, dequantized_output); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(float_ref_output_values[i], dequantized_output[i], + kTolerance); + } +} + +template +void TestHardSwishQuantizedBias(const int size, const T *output_data, + T *input_data_quantized, + float *dequantized_output, float input_min, + float input_max, float output_min, + float output_max, float tolerated_bias, + float *float_input_values, + float *float_ref_output_values) +{ + const float input_scale = ScaleFromMinMax(input_min, input_max); + const float output_scale = ScaleFromMinMax(output_min, output_max); + + const int input_zero_point = ZeroPointFromMinMax(input_min, input_max); + const int output_zero_point = ZeroPointFromMinMax(output_min, output_max); + + const float max_scale = std::max(output_scale, input_scale); + + // In this bias-focused test case, no need for randomly generated input + // values. + TF_LITE_MICRO_EXPECT_LE(input_min, -3.0f); + TF_LITE_MICRO_EXPECT_GE(input_max, 3.0f); + const int quantized_input_negative_three = + round(std::numeric_limits::min() + (-3.0f - input_min) / input_scale); + const int quantized_input_positive_three = + round(std::numeric_limits::min() + (3.0f - input_min) / input_scale); + + for (int i = quantized_input_negative_three; + i < size && i <= quantized_input_positive_three; i++) { + float_input_values[i] = + input_min + (i - std::numeric_limits::min()) * input_scale; + } + + EvalTestReferenceHardSwish(size, float_input_values, float_ref_output_values); + for (int i = 0; i < size; i++) { + float val = float_ref_output_values[i]; + float_ref_output_values[i] = + std::min(output_max, std::max(output_min, val)); + } + + int input_dims_data[] = { 2, 1, size }; + int output_dims_data[] = { 2, 1, size }; + + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + TF_LITE_MICRO_EXPECT_EQ(output_elements_count, size); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(float_input_values, input_data_quantized, + input_dims, input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_HARD_SWISH(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + Dequantize(output_data, output_elements_count, output_scale, + output_zero_point, dequantized_output); + + float sum_diff = 0; + for (int i = 0; i < size; i++) { + sum_diff += dequantized_output[i] - float_ref_output_values[i]; + } + const float bias = sum_diff / (size * max_scale); + TF_LITE_MICRO_EXPECT_LE(std::abs(bias), tolerated_bias); +} + +void TestHardSwishFloat(const int size, float *output_data, + std::minstd_rand *random_engine, + float *float_input_values, + float *float_ref_output_values) +{ + const float kMin = -10.0f; + const float kMax = 10.0f; + GenerateUniformRandomVector(size, kMin, kMax, random_engine, + float_input_values); + + EvalTestReferenceHardSwish(size, float_input_values, float_ref_output_values); + + int input_dims_data[] = { 1, size }; + int output_dims_data[] = { 1, size }; + + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + TF_LITE_MICRO_EXPECT_EQ(output_elements_count, size); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(float_input_values, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_HARD_SWISH(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(float_ref_output_values[i], output_data[i], + 1e-5f); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleHardSwishTestFloat) +{ + std::minstd_rand random_engine; + constexpr int size = 100; + float output_data[size] = { 0.f }; + float input_values[size] = { 0.f }; + float output_values[size] = { 0.f }; + + tflite::testing::TestHardSwishFloat(size, output_data, &random_engine, + input_values, output_values); +} + +TF_LITE_MICRO_TEST(SimpleHardSwishTestInt8) +{ + std::minstd_rand random_engine; + constexpr int pairs = 4, one_pair = 2; + constexpr int size = 101; + constexpr float minmax_pairs[pairs][one_pair] = { + { 0.f, 1.f }, { -2.f, 1.f }, { -5.f, 10.f }, { -40.f, 60.f } + }; + int8_t output_data[size] = { 0 }; + int8_t input_data_quantized[size] = { 0 }; + float dequantized_output[size] = { 0.f }; + float input_values[size] = { 0.f }; + float output_values[size] = { 0.f }; + + for (int x = 0; x < pairs; x++) { + for (int y = 0; y < pairs; y++) { + float input_min = minmax_pairs[x][0]; + float input_max = minmax_pairs[x][1]; + float output_min = minmax_pairs[y][0]; + float output_max = minmax_pairs[y][1]; + + tflite::testing::TestHardSwishQuantized( + size, output_data, input_data_quantized, dequantized_output, + input_min, input_max, output_min, output_max, &random_engine, + input_values, output_values); + } + } +} + +TF_LITE_MICRO_TEST(SimpleHardSwishTestUint8) +{ + std::minstd_rand random_engine; + constexpr int size = 99; + constexpr int pairs = 4, one_pair = 2; + constexpr float minmax_pairs[pairs][one_pair] = { + { 0.f, 1.f }, { -2.f, 1.f }, { -5.f, 10.f }, { -40.f, 60.f } + }; + uint8_t output_data[size] = { 0 }; + uint8_t input_data_quantized[size] = { 0 }; + float dequantized_output[size] = { 0.f }; + float input_values[size] = { 0.f }; + float output_values[size] = { 0.f }; + + for (int x = 0; x < pairs; x++) { + for (int y = 0; y < pairs; y++) { + float input_min = minmax_pairs[x][0]; + float input_max = minmax_pairs[x][1]; + float output_min = minmax_pairs[y][0]; + float output_max = minmax_pairs[y][1]; + + tflite::testing::TestHardSwishQuantized( + size, output_data, input_data_quantized, dequantized_output, + input_min, input_max, output_min, output_max, &random_engine, + input_values, output_values); + } + } +} + +// See the comment in the reference implementation of quantized HardSwish: +// A numerical issue significantly affecting ImageNet classification accuracy +// with MobileNet v3 is only observable at the scale of HardSwish unit tests +// if we monitor specifically bias. This testcase is extracted from one of the +// HardSwish nodes in that MobileNet v3 that exhibited this issue. +TF_LITE_MICRO_TEST(SimpleHardSwishTestQuantizedBias) +{ + constexpr int size = 43; + uint8_t output_data[size] = { 0 }; + uint8_t input_data_quantized[size] = { 0 }; + float dequantized_output[size] = { 0.f }; + float input_values[size] = { 0.f }; + float output_values[size] = { 0.f }; + + tflite::testing::TestHardSwishQuantizedBias( + size, output_data, input_data_quantized, dequantized_output, -11.654928f, + 25.036512f, -0.3905796f, 24.50887f, 0.035, input_values, output_values); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/if.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/if.cc new file mode 100644 index 00000000..12632436 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/if.cc @@ -0,0 +1,170 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/micro_graph.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { + +namespace { + +struct OpData { + int then_subgraph_index; + int else_subgraph_index; +}; + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + OpData *op_data = reinterpret_cast(node->user_data); + const auto *params = + reinterpret_cast(node->builtin_data); + op_data->then_subgraph_index = params->then_subgraph_index; + op_data->else_subgraph_index = params->else_subgraph_index; + + TF_LITE_ENSURE(context, node->inputs->size > 0); + + // The first input is the condition. + const TfLiteTensor *cond; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 0, &cond)); + TF_LITE_ENSURE_EQ(context, cond->type, kTfLiteBool); + TF_LITE_ENSURE_EQ(context, NumElements(cond), 1); + + // The first input of the node is the condition. The rest of inputs are + // passed to the branch subgraphs. Therefore, the number of subgraph inputs + // will be the number of node inputs - 1. + size_t num_inputs = node->inputs->size - 1; + size_t num_outputs = node->outputs->size; + + // Casting to TfliteIntArray is required since we are re-using + // GetExecutionPlan from TfLiteContext. On TFLM this method returns a + // MicroGraph. + // TODO(b/188226309): Design a cleaner way to get a graph from kernel context. + MicroGraph *graph_info; + context->GetExecutionPlan(context, + reinterpret_cast(&graph_info)); + + TF_LITE_ENSURE(context, + op_data->then_subgraph_index < graph_info->NumSubgraphs()); + TF_LITE_ENSURE(context, + op_data->else_subgraph_index < graph_info->NumSubgraphs()); + + TF_LITE_ENSURE_EQ( + context, num_inputs, + graph_info->NumSubgraphInputs(op_data->then_subgraph_index)); + TF_LITE_ENSURE_EQ( + context, num_outputs, + graph_info->NumSubgraphOutputs(op_data->then_subgraph_index)); + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const OpData *op_data = reinterpret_cast(node->user_data); + + const TfLiteTensor *cond; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 0, &cond)); + bool cond_value = cond->data.b[0]; + + // Casting to TfliteIntArray is required since we are re-using + // GetExecutionPlan from TfLiteContext. On TFLM this method returns a + // MicroGraph. + // TODO(b/188226309): Design a cleaner way to get a graph from kernel context. + MicroGraph *graph_info; + context->GetExecutionPlan(context, + reinterpret_cast(&graph_info)); + + // Currently we copy the input / output between the subgraphs. This isn't + // optimized yet. + int active_branch_subgraph_index = + cond_value ? op_data->then_subgraph_index : op_data->else_subgraph_index; + + for (size_t i = 0; + i < graph_info->NumSubgraphInputs(active_branch_subgraph_index); ++i) { + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, i + 1); + + TfLiteEvalTensor *subgraph_input = + graph_info->GetSubgraphInput(active_branch_subgraph_index, i); + + // These checks must occur in Eval since TfLiteEvalTensors are not available + // during Prepare. + size_t input_bytes; + size_t subgraph_input_bytes; + TF_LITE_ENSURE_OK(context, TfLiteEvalTensorByteLength(input, &input_bytes)); + TF_LITE_ENSURE_OK(context, TfLiteEvalTensorByteLength( + subgraph_input, &subgraph_input_bytes)); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, subgraph_input->type); + TF_LITE_ENSURE_EQ(context, input_bytes, subgraph_input_bytes); + memcpy(subgraph_input->data.raw, input->data.raw, input_bytes); + } + + TF_LITE_ENSURE_OK(context, + graph_info->InvokeSubgraph(active_branch_subgraph_index)); + + for (size_t i = 0; + i < graph_info->NumSubgraphOutputs(active_branch_subgraph_index); ++i) { + const TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, i); + + TfLiteEvalTensor *subgraph_output = + graph_info->GetSubgraphOutput(active_branch_subgraph_index, i); + + // These checks must occur in Eval since TfLiteEvalTensors are not available + // during Prepare. + size_t output_bytes; + size_t subgraph_output_bytes; + TF_LITE_ENSURE_OK(context, + TfLiteEvalTensorByteLength(output, &output_bytes)); + TF_LITE_ENSURE_OK(context, TfLiteEvalTensorByteLength( + subgraph_output, &subgraph_output_bytes)); + TF_LITE_ENSURE_TYPES_EQ(context, output->type, subgraph_output->type); + TF_LITE_ENSURE_EQ(context, output_bytes, subgraph_output_bytes); + memcpy(output->data.raw, subgraph_output->data.raw, output_bytes); + } + return kTfLiteOk; +} + +} // namespace. + +TfLiteRegistration Register_IF() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/if_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/if_test.cc new file mode 100644 index 00000000..54f0e66d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/if_test.cc @@ -0,0 +1,168 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/mock_micro_graph.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestIf(int *input1_dims_data, const bool *input1_data, + int *input2_dims_data, const float *input2_data, + int *output_dims_data, const float *expected_output_data, + const int subgraph1_invoke_count_golden, + const int subgraph2_invoke_count_golden, float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + TfLiteIfParams params; + params.then_subgraph_index = 1; + params.else_subgraph_index = 2; + + const TfLiteRegistration registration = tflite::Register_IF(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, ¶ms); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + TF_LITE_MICRO_EXPECT_EQ(output_dims_count, 2); + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } + + TF_LITE_MICRO_EXPECT_EQ(subgraph1_invoke_count_golden, + runner.GetMockGraph()->get_invoke_count(1)); + TF_LITE_MICRO_EXPECT_EQ(subgraph2_invoke_count_golden, + runner.GetMockGraph()->get_invoke_count(2)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(IfShouldInvokeSubgraphWithMockModelConditionTrue) +{ + int shape[] = { 2, 1, 2 }; + int condition_shape[] = { 1, 1 }; + const bool condition[] = { true }; + const float input[] = { 5.0, 2.0 }; + const float golden[] = { 5.0, 2.0 }; + float output_data[2] = { 0 }; + tflite::testing::TestIf(condition_shape, condition, shape, input, shape, + golden, 1, 0, output_data); +} + +TF_LITE_MICRO_TEST(IfShouldInvokeSubgraphWithMockModelConditionFalse) +{ + int shape[] = { 2, 1, 2 }; + int condition_shape[] = { 1, 1 }; + const bool condition[] = { false }; + const float input[] = { 5.0, 2.0 }; + const float golden[] = { 5.0, 2.0 }; + float output_data[2] = { 0 }; + tflite::testing::TestIf(condition_shape, condition, shape, input, shape, + golden, 0, 1, output_data); +} + +TF_LITE_MICRO_TEST(IfShouldInvokeSubgraphConditionTrue) +{ + constexpr int kArenaSize = 5000; + uint8_t arena[kArenaSize]; + + const tflite::Model *model = + tflite::testing::GetSimpleModelWithSubgraphsAndIf(); + tflite::MicroMutableOpResolver<3> resolver; + tflite::MicroErrorReporter reporter; + resolver.AddIf(); + resolver.AddAdd(); + resolver.AddMul(); + tflite::MicroInterpreter interpreter(model, resolver, arena, kArenaSize, + &reporter); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter.AllocateTensors()); + TfLiteTensor *condition = interpreter.input(0); + TfLiteTensor *input1 = interpreter.input(1); + TfLiteTensor *input2 = interpreter.input(2); + TfLiteTensor *output = interpreter.output(0); + float input1_data[] = { 2.0, 5.0 }; + float input2_data[] = { 3.0, 7.0 }; + memcpy(input1->data.f, input1_data, 2 * sizeof(float)); + memcpy(input2->data.f, input2_data, 2 * sizeof(float)); + condition->data.b[0] = true; + + interpreter.Invoke(); + + TF_LITE_MICRO_EXPECT_EQ(output->data.f[0], 5.0f); + TF_LITE_MICRO_EXPECT_EQ(output->data.f[1], 12.0f); +} + +TF_LITE_MICRO_TEST(IfShouldInvokeSubgraphConditionFalse) +{ + constexpr int kArenaSize = 5000; + uint8_t arena[kArenaSize]; + + const tflite::Model *model = + tflite::testing::GetSimpleModelWithSubgraphsAndIf(); + tflite::MicroMutableOpResolver<3> resolver; + tflite::MicroErrorReporter reporter; + resolver.AddIf(); + resolver.AddAdd(); + resolver.AddMul(); + tflite::MicroInterpreter interpreter(model, resolver, arena, kArenaSize, + &reporter); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter.AllocateTensors()); + TfLiteTensor *condition = interpreter.input(0); + TfLiteTensor *input1 = interpreter.input(1); + TfLiteTensor *input2 = interpreter.input(2); + TfLiteTensor *output = interpreter.output(0); + float input1_data[] = { 2.0, 5.0 }; + float input2_data[] = { 3.0, 7.0 }; + memcpy(input1->data.f, input1_data, 2 * sizeof(float)); + memcpy(input2->data.f, input2_data, 2 * sizeof(float)); + condition->data.b[0] = false; + + interpreter.Invoke(); + + TF_LITE_MICRO_EXPECT_EQ(output->data.f[0], 6.0f); + TF_LITE_MICRO_EXPECT_EQ(output->data.f[1], 35.0f); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.cc new file mode 100644 index 00000000..533f1bc6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.cc @@ -0,0 +1,186 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/kernel_runner.h" + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/simple_memory_allocator.h" +#include "tensorflow/lite/micro/test_helpers.h" + +namespace tflite { +namespace micro { + +namespace { +constexpr size_t kBufferAlignment = 16; +} // namespace + +// TODO(b/161841696): Consider moving away from global arena buffers: +constexpr int KernelRunner::kNumScratchBuffers_; +constexpr int KernelRunner::kKernelRunnerBufferSize_; +uint8_t KernelRunner::kKernelRunnerBuffer_[]; + +KernelRunner::KernelRunner(const TfLiteRegistration ®istration, + TfLiteTensor *tensors, int tensors_size, + TfLiteIntArray *inputs, TfLiteIntArray *outputs, + void *builtin_data) + : allocator_(SimpleMemoryAllocator::Create(GetMicroErrorReporter(), + kKernelRunnerBuffer_, + kKernelRunnerBufferSize_)), + registration_(registration), + tensors_(tensors), + mock_micro_graph_(allocator_) +{ + // Prepare TfLiteContext: + context_.impl_ = static_cast(this); + context_.ReportError = ReportOpError; + context_.recommended_num_threads = 1; + context_.GetTensor = GetTensor; + context_.GetEvalTensor = GetEvalTensor; + context_.AllocatePersistentBuffer = AllocatePersistentBuffer; + context_.RequestScratchBufferInArena = RequestScratchBufferInArena; + context_.GetScratchBuffer = GetScratchBuffer; + context_.GetExecutionPlan = GetGraph; + context_.recommended_num_threads = 0; + + // Prepare TfLiteNode: + node_.inputs = inputs; + node_.outputs = outputs; + node_.builtin_data = builtin_data; +} + +TfLiteStatus KernelRunner::InitAndPrepare(const char *init_data, + size_t length) +{ + if (registration_.init) { + node_.user_data = registration_.init(&context_, init_data, length); + } + if (registration_.prepare) { + TF_LITE_ENSURE_STATUS(registration_.prepare(&context_, &node_)); + } + return kTfLiteOk; +} + +TfLiteStatus KernelRunner::Invoke() +{ + if (registration_.invoke == nullptr) { + MicroPrintf("TfLiteRegistration missing invoke function pointer!"); + return kTfLiteError; + } + return registration_.invoke(&context_, &node_); +} + +TfLiteTensor *KernelRunner::GetTensor(const struct TfLiteContext *context, + int tensor_index) +{ + TFLITE_DCHECK(context != nullptr); + KernelRunner *runner = reinterpret_cast(context->impl_); + TFLITE_DCHECK(runner != nullptr); + + return &runner->tensors_[tensor_index]; +} + +TfLiteEvalTensor *KernelRunner::GetEvalTensor( + const struct TfLiteContext *context, int tensor_index) +{ + TFLITE_DCHECK(context != nullptr); + KernelRunner *runner = reinterpret_cast(context->impl_); + TFLITE_DCHECK(runner != nullptr); + + TfLiteEvalTensor *eval_tensor = + reinterpret_cast(runner->allocator_->AllocateTemp( + sizeof(TfLiteEvalTensor), alignof(TfLiteEvalTensor))); + TFLITE_DCHECK(eval_tensor != nullptr); + + // In unit tests, the TfLiteTensor pointer contains the source of truth for + // buffers and values: + eval_tensor->data = runner->tensors_[tensor_index].data; + eval_tensor->dims = runner->tensors_[tensor_index].dims; + eval_tensor->type = runner->tensors_[tensor_index].type; + return eval_tensor; +} + +void *KernelRunner::AllocatePersistentBuffer(TfLiteContext *context, + size_t bytes) +{ + TFLITE_DCHECK(context != nullptr); + KernelRunner *runner = reinterpret_cast(context->impl_); + TFLITE_DCHECK(runner != nullptr); + + return runner->allocator_->AllocateFromTail(bytes, kBufferAlignment); +} + +TfLiteStatus KernelRunner::RequestScratchBufferInArena(TfLiteContext *context, + size_t bytes, + int *buffer_index) +{ + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(buffer_index != nullptr); + + KernelRunner *runner = reinterpret_cast(context->impl_); + TFLITE_DCHECK(runner != nullptr); + + if (runner->scratch_buffer_count_ == kNumScratchBuffers_) { + MicroPrintf("Exceeded the maximum number of scratch tensors allowed (%d).", + kNumScratchBuffers_); + return kTfLiteError; + } + + // For tests, we allocate scratch buffers from the tail and keep them around + // for the lifetime of model. This means that the arena size in the tests will + // be more than what we would have if the scratch buffers could share memory. + runner->scratch_buffers_[runner->scratch_buffer_count_] = + runner->allocator_->AllocateFromTail(bytes, kBufferAlignment); + TFLITE_DCHECK(runner->scratch_buffers_[runner->scratch_buffer_count_] != + nullptr); + + *buffer_index = runner->scratch_buffer_count_++; + return kTfLiteOk; +} + +void *KernelRunner::GetScratchBuffer(TfLiteContext *context, int buffer_index) +{ + TFLITE_DCHECK(context != nullptr); + KernelRunner *runner = reinterpret_cast(context->impl_); + TFLITE_DCHECK(runner != nullptr); + + TFLITE_DCHECK(runner->scratch_buffer_count_ <= kNumScratchBuffers_); + if (buffer_index >= runner->scratch_buffer_count_) { + return nullptr; + } + return runner->scratch_buffers_[buffer_index]; +} + +void KernelRunner::ReportOpError(struct TfLiteContext *context, + const char *format, ...) +{ + va_list args; + va_start(args, format); + GetMicroErrorReporter()->Report(format, args); + va_end(args); +} + +TfLiteStatus KernelRunner::GetGraph(struct TfLiteContext *context, + TfLiteIntArray **args) +{ + TFLITE_DCHECK(context != nullptr); + KernelRunner *runner = reinterpret_cast(context->impl_); + TFLITE_DCHECK(runner != nullptr); + // TODO(b/188226309): Design a cleaner way to get a graph from kernel context. + *args = reinterpret_cast(runner->GetMockGraph()); + return kTfLiteOk; +} + +} // namespace micro +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.h new file mode 100644 index 00000000..eebcad03 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_runner.h @@ -0,0 +1,94 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_RUNNER_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_RUNNER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/micro/mock_micro_graph.h" +#include "tensorflow/lite/micro/simple_memory_allocator.h" + +namespace tflite { +namespace micro { +// Helper class to perform a simulated kernel (i.e. TfLiteRegistration) +// lifecycle (init, prepare, invoke). All internal allocations are handled by +// this class. Simply pass in the registration, list of required tensors, inputs +// array, outputs array, and any pre-builtin data. Calling Invoke() will +// automatically walk the kernel and outputs will be ready on the TfLiteTensor +// output provided during construction. +class KernelRunner { +public: + KernelRunner(const TfLiteRegistration ®istration, TfLiteTensor *tensors, + int tensors_size, TfLiteIntArray *inputs, + TfLiteIntArray *outputs, void *builtin_data); + + // Calls init and prepare on the kernel (i.e. TfLiteRegistration) struct. Any + // exceptions will be DebugLog'd and returned as a status code. + TfLiteStatus InitAndPrepare(const char *init_data = nullptr, + size_t length = 0); + + // Calls init, prepare, and invoke on a given TfLiteRegistration pointer. + // After successful invoke, results will be available in the output tensor as + // passed into the constructor of this class. + TfLiteStatus Invoke(); + + // Returns a pointer to the internal MockMicroGraph which KernelRunner uses + // to stub out MicroGraph methods and track invocations on each subgraph. + MockMicroGraph *GetMockGraph() + { + return &mock_micro_graph_; + } + +protected: + static TfLiteTensor *GetTensor(const struct TfLiteContext *context, + int tensor_index); + static TfLiteEvalTensor *GetEvalTensor(const struct TfLiteContext *context, + int tensor_index); + static void *AllocatePersistentBuffer(TfLiteContext *context, size_t bytes); + static TfLiteStatus RequestScratchBufferInArena(TfLiteContext *context, + size_t bytes, + int *buffer_index); + static void *GetScratchBuffer(TfLiteContext *context, int buffer_index); + static void ReportOpError(struct TfLiteContext *context, const char *format, + ...); + // This method matches GetExecutionPlan from TfLiteContext since TFLM reuses + // this method to get the MicroGraph from an operator context. + // TODO(b/188226309): Design a cleaner way to get a graph from kernel context. + static TfLiteStatus GetGraph(struct TfLiteContext *context, + TfLiteIntArray **args); + +private: + static constexpr int kNumScratchBuffers_ = 12; + + static constexpr int kKernelRunnerBufferSize_ = 10000; + static uint8_t kKernelRunnerBuffer_[kKernelRunnerBufferSize_]; + + SimpleMemoryAllocator *allocator_ = nullptr; + const TfLiteRegistration ®istration_; + TfLiteTensor *tensors_ = nullptr; + MockMicroGraph mock_micro_graph_; + + TfLiteContext context_ = {}; + TfLiteNode node_ = {}; + + int scratch_buffer_count_ = 0; + uint8_t *scratch_buffers_[kNumScratchBuffers_]; +}; + +} // namespace micro +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_RUNNER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.cc new file mode 100644 index 00000000..f9ad5264 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.cc @@ -0,0 +1,108 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +#include "tensorflow/lite/c/common.h" + +namespace tflite { +namespace micro { + +const flexbuffers::Map FlexbuffersWrapperGetRootAsMap(const uint8_t *buffer, + size_t size) +{ + return flexbuffers::GetRoot(buffer, size).AsMap(); +} + +int32_t FlexbuffersWrapperAsInt32(const flexbuffers::Map &m, const char *key) +{ + return m[key].AsInt32(); +} + +bool FlexbuffersWrapperAsBool(const flexbuffers::Map &m, const char *key) +{ + return m[key].AsBool(); +} + +float FlexbuffersWrapperAsFloat(const flexbuffers::Map &m, const char *key) +{ + return m[key].AsFloat(); +} + +bool FlexbuffersWrapperIsNull(const flexbuffers::Map &m, const char *key) +{ + return m[key].IsNull(); +} + +bool HaveSameShapes(const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2) +{ + TFLITE_DCHECK(input1 != nullptr); + TFLITE_DCHECK(input2 != nullptr); + return TfLiteIntArrayEqual(input1->dims, input2->dims); +} + +const RuntimeShape GetTensorShape(const TfLiteEvalTensor *tensor) +{ + if (tensor == nullptr || tensor->dims == nullptr) { + return RuntimeShape(); + } + TfLiteIntArray *dims = tensor->dims; + const int dims_size = dims->size; + const int32_t *dims_data = reinterpret_cast(dims->data); + return RuntimeShape(dims_size, dims_data); +} + +PaddingType RuntimePaddingType(TfLitePadding padding) +{ + switch (padding) { + case TfLitePadding::kTfLitePaddingSame: + return PaddingType::kSame; + case TfLitePadding::kTfLitePaddingValid: + return PaddingType::kValid; + case TfLitePadding::kTfLitePaddingUnknown: + default: + return PaddingType::kNone; + } +} + +// Relocate tensor dims from FlatBuffer to the persistent storage arena. +// The old dims data is copied to the new storage area. +// The tensor and eval_tensor must be the same tensor. +// Only use during Prepare phase. +TfLiteStatus CreateWritableTensorDimsWithCopy(TfLiteContext *context, + TfLiteTensor *tensor, + TfLiteEvalTensor *eval_tensor) +{ + TF_LITE_ENSURE(context, tensor != nullptr); + TF_LITE_ENSURE(context, eval_tensor != nullptr); + TF_LITE_ENSURE(context, context->AllocatePersistentBuffer != nullptr); + int ranks = tensor->dims->size; + size_t alloc_size = TfLiteIntArrayGetSizeInBytes(ranks); + TfLiteIntArray *new_dims = static_cast( + context->AllocatePersistentBuffer(context, alloc_size)); + TfLiteIntArray *old_dims = tensor->dims; + new_dims->size = ranks; + tensor->dims = new_dims; + eval_tensor->dims = new_dims; + for (int i = 0; i < ranks; i++) { + new_dims->data[i] = old_dims->data[i]; + } + + return kTfLiteOk; +} + +} // namespace micro +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.h new file mode 100644 index 00000000..e4b49472 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/kernel_util.h @@ -0,0 +1,106 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_UTIL_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_UTIL_H_ + +#include + +#define FLATBUFFERS_LOCALE_INDEPENDENT 0 +#include "flatbuffers/flexbuffers.h" +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +namespace micro { +// The Flexbuffer library is inline heavy, which causes code bloat when +// custom ops are used. Wrapping with a function is a portable way to avoid +// this bloat +const flexbuffers::Map FlexbuffersWrapperGetRootAsMap(const uint8_t *buffer, + size_t size); + +int32_t FlexbuffersWrapperAsInt32(const flexbuffers::Map &m, const char *key); + +bool FlexbuffersWrapperAsBool(const flexbuffers::Map &m, const char *key); + +float FlexbuffersWrapperAsFloat(const flexbuffers::Map &m, const char *key); + +bool FlexbuffersWrapperIsNull(const flexbuffers::Map &m, const char *key); + +// Returns a mutable tensor for a given input index. is_variable must be checked +// during prepare when the full TfLiteTensor is available. +inline TfLiteEvalTensor *GetMutableEvalInput(const TfLiteContext *context, + const TfLiteNode *node, + int index) +{ + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(node != nullptr); + return context->GetEvalTensor(context, node->inputs->data[index]); +} + +// Returns the TfLiteEvalTensor struct for a given input index in a node. +inline const TfLiteEvalTensor *GetEvalInput(const TfLiteContext *context, + const TfLiteNode *node, int index) +{ + return GetMutableEvalInput(context, node, index); +} + +// Returns the TfLiteEvalTensor struct for a given output index in a node. +inline TfLiteEvalTensor *GetEvalOutput(const TfLiteContext *context, + const TfLiteNode *node, int index) +{ + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(node != nullptr); + return context->GetEvalTensor(context, node->outputs->data[index]); +} + +// Returns data for a TfLiteEvalTensor struct. +template +T *GetTensorData(TfLiteEvalTensor *tensor) +{ + return tensor != nullptr ? reinterpret_cast(tensor->data.raw) : nullptr; +} + +// Returns const data for a TfLiteEvalTensor struct. +template +const T *GetTensorData(const TfLiteEvalTensor *tensor) +{ + TFLITE_DCHECK(tensor != nullptr); + return reinterpret_cast(tensor->data.raw); +} + +// Returns the shape of a TfLiteEvalTensor struct. +const RuntimeShape GetTensorShape(const TfLiteEvalTensor *tensor); + +// Return true if the given tensors have the same shape. +bool HaveSameShapes(const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2); + +PaddingType RuntimePaddingType(TfLitePadding padding); + +// Relocate tensor dims from FlatBuffer to the persistent storage arena. +// The old dims data is copied to the new storage area. +// The tensor and eval_tensor must be the same tensor. +// Only use during Prepare phase. +TfLiteStatus CreateWritableTensorDimsWithCopy(TfLiteContext *context, + TfLiteTensor *tensor, + TfLiteEvalTensor *eval_tensor); + +} // namespace micro +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_UTIL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d.cc new file mode 100644 index 00000000..e201e081 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d.cc @@ -0,0 +1,150 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/reference/pooling.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +// Input/output tensor index. +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +// required rank for input/output tensor shape +constexpr int kTensorShapeRank = 4; + +// input/output tensor shape rank associations +enum { kBatchRank = 0, + kHeightRank, + kWidthRank, + kChannelRank }; + +TfLiteStatus L2Prepare(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = static_cast(node->builtin_data); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TF_LITE_ENSURE_EQ(context, NumDimensions(input), kTensorShapeRank); + TF_LITE_ENSURE_EQ(context, NumDimensions(output), kTensorShapeRank); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + int batches = SizeOfDimension(input, kBatchRank); + int height = SizeOfDimension(input, kHeightRank); + int width = SizeOfDimension(input, kWidthRank); + int channels_out = SizeOfDimension(input, kChannelRank); + + // Matching GetWindowedOutputSize in TensorFlow. + auto padding = params->padding; + int out_width, out_height; + + params->computed.padding = ComputePaddingHeightWidth( + params->stride_height, params->stride_width, 1, 1, height, width, + params->filter_height, params->filter_width, padding, &out_height, + &out_width); + + // We currently don't have a quantized implementation of L2Pool + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteFloat32); + + // We must update the output tensor dimensions. + // The dims storage is expected to be the same area in memory + // for both TfLiteTensor and TfLiteEvalTensor. This is important + // because TfLiteTensor in the MicroInterpreter is a temporary + // allocation. For the KernelRunner interpreter, TfLiteEvalTensor + // is a temporary allocation. We must therefore relocate the dims + // from the FlatBuffer to the persistant storage arena. + TfLiteEvalTensor *output_eval = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + TF_LITE_ENSURE_OK(context, tflite::micro::CreateWritableTensorDimsWithCopy( + context, output, output_eval)); + output->dims->data[kBatchRank] = batches; + output->dims->data[kHeightRank] = out_height; + output->dims->data[kWidthRank] = out_width; + output->dims->data[kChannelRank] = channels_out; + + return kTfLiteOk; +} + +void L2EvalFloat(const TfLitePoolParams ¶ms, const TfLiteEvalTensor &input, + tflite::PoolParams *op_params, TfLiteEvalTensor *output) +{ + float activation_min, activation_max; + CalculateActivationRange(params.activation, &activation_min, &activation_max); + + op_params->float_activation_min = activation_min; + op_params->float_activation_max = activation_max; + reference_ops::L2Pool(*op_params, tflite::micro::GetTensorShape(&input), + tflite::micro::GetTensorData(&input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +TfLiteStatus L2Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = static_cast(node->builtin_data); + + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + + tflite::PoolParams op_params; + op_params.stride_height = params->stride_height; + op_params.stride_width = params->stride_width; + op_params.filter_height = params->filter_height; + op_params.filter_width = params->filter_width; + op_params.padding_values.height = params->computed.padding.height; + op_params.padding_values.width = params->computed.padding.width; + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: + L2EvalFloat(*params, *input, &op_params, output); + break; + default: + TF_LITE_KERNEL_LOG(context, + "L2_POOL_2D only supports float32 currently, got %s.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_L2_POOL_2D() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/L2Prepare, + /*invoke=*/L2Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d_test.cc new file mode 100644 index 00000000..68215f62 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2_pool_2d_test.cc @@ -0,0 +1,231 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr float kTolerance = 1e-5; + +constexpr int kOutputDimsCount = 4; + +struct L2Pool2DTestParams { + TfLitePadding padding = kTfLitePaddingValid; + int stride_width = 2; + int stride_height = 2; + int filter_width = 2; + int filter_height = 2; + TfLiteFusedActivation activation = kTfLiteActNone; + float compare_tolerance = kTolerance; + // output_dims_data is a TfLiteIntArray + int output_dims_data[kOutputDimsCount + 1] = { kOutputDimsCount, 0, 0, 0, 0 }; +}; + +void ExecuteL2Pool2DTest(const L2Pool2DTestParams ¶ms, + TfLiteTensor *tensors, int tensors_count) +{ + int kInputArrayData[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + TfLitePoolParams op_params = {}; + op_params.activation = params.activation; + op_params.filter_height = params.filter_height; + op_params.filter_width = params.filter_width; + op_params.padding = params.padding; + op_params.stride_height = params.stride_height; + op_params.stride_width = params.stride_width; + + const TfLiteRegistration registration = tflite::Register_L2_POOL_2D(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, static_cast(&op_params)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestL2Pool2D(L2Pool2DTestParams ¶ms, int *input_dims_data, + const T *input_data, int *expected_dims_data, + const T *expected_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *expected_dims = IntArrayFromInts(expected_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(params.output_dims_data); + const int expected_count = ElementCount(*expected_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + ExecuteL2Pool2DTest(params, tensors, tensors_count); + + for (int i = 0; i < expected_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], + params.compare_tolerance); + } + for (int i = 0; i < expected_dims->size; i++) { + // output dims will have been relocated during prepare phase, + // so use the tensor dims pointer. + TF_LITE_MICRO_EXPECT_EQ(expected_dims->data[i], tensors[1].dims->data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2Pool) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 1, 2, 1 }; + constexpr float kExpect[] = { 3.5, 6.5 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2PoolActivationRelu) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + -1, -6, 2, 4, // + -3, -2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 1, 2, 1 }; + constexpr float kExpect[] = { 3.53553, 6.5 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + params.activation = kTfLiteActRelu; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2PoolActivationRelu1) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + -0.1, -0.6, 2, 4, // + -0.3, -0.2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 1, 2, 1 }; + constexpr float kExpect[] = { 0.353553, 1.0 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + params.activation = kTfLiteActReluN1To1; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2PoolActivationRelu6) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + -0.1, -0.6, 2, 4, // + -0.3, -0.2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 1, 2, 1 }; + constexpr float kExpect[] = { 0.353553, 6.0 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + params.activation = kTfLiteActRelu6; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2PoolPaddingSame) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 1, 2, 1 }; + constexpr float kExpect[] = { 3.5, 6.5 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + params.padding = kTfLitePaddingSame; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2PoolPaddingSameStride1) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kExpect[] = { 3.5, 6.0, 6.5, 5.70088, + 2.54951, 7.2111, 8.63134, 7.0 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + params.padding = kTfLitePaddingSame; + params.compare_tolerance = 1e-4; + params.stride_width = 1; + params.stride_height = 1; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TEST(FloatPoolingOpTestL2PoolPaddingValidStride1) +{ + int kInputDims[] = { 4, 1, 2, 4, 1 }; + constexpr float kInput[] = { + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + int kExpectDims[] = { 4, 1, 1, 3, 1 }; + constexpr float kExpect[] = { 3.5, 6.0, 6.5 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::L2Pool2DTestParams params; + params.stride_width = 1; + params.stride_height = 1; + + tflite::testing::TestL2Pool2D(params, kInputDims, kInput, kExpectDims, + kExpect, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm.cc new file mode 100644 index 00000000..8a0cc5a5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm.cc @@ -0,0 +1,163 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/portable_tensor.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h" +#include "tensorflow/lite/kernels/internal/reference/l2normalization.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace l2norm { + +namespace { + +// This file has two implementation of L2Norm. +enum KernelType { + kReference, + kGenericOptimized, +}; + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +} // namespace + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + auto *params = reinterpret_cast(node->builtin_data); + L2NormalizationParams *data = + static_cast(node->user_data); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE(context, NumDimensions(input) <= 4); + + TF_LITE_ENSURE(context, output->type == kTfLiteFloat32 || + output->type == kTfLiteUInt8 || + output->type == kTfLiteInt8); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + if (output->type == kTfLiteUInt8 || output->type == kTfLiteInt8) { + data->input_zero_point = input->params.zero_point; + } else if (output->type == kTfLiteFloat32) { + data->input_zero_point = 0; + } + + // Our implementations don't currently support activations. + TF_LITE_ENSURE_EQ(context, params->activation, kTfLiteActNone); + + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, + sizeof(L2NormalizationParams)); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const L2NormalizationParams &data = + *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + // TODO(b/143912164): instead of hardcode the epsilon here, we should read it + // from tensorflow, i.e., adding a params. + // We don't compute epsilon for quantized kernel: + // + // epsilon_float = (epsilon_quant - zp) * scale + // so + // espsilon_quant = epsilon_float / scale + zp + // We know epsilon_float is just a very small number to avoid division by + // zero error, and scale is > 1, so the integer value of epsilon for quant + // is just dominated by the zero point. + // Also, GetInvSqrtQuantizedMultiplierExp handles the scenario where the sum + // of input value squared is zero case well. + // So we don't even need to do handle the epsilon for quantized kernel case. + const float epsilon = 1e-6f; + if (output->type == kTfLiteFloat32) { + reference_ops::L2Normalization(data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), + epsilon); + } else if (output->type == kTfLiteUInt8) { + reference_ops::L2Normalization( + data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else if (output->type == kTfLiteInt8) { + const auto input_shape = tflite::micro::GetTensorShape(input); + const auto output_shape = tflite::micro::GetTensorShape(output); + const int trailing_dim = input_shape.DimensionsCount() - 1; + const int depth = + MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); + const int outer_size = + MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); + reference_integer_ops::L2Normalization( + data.input_zero_point, outer_size, depth, + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorData(output)); + } else { + TF_LITE_KERNEL_LOG(context, "Output type is %s, requires float.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace l2norm + +TfLiteRegistration Register_L2NORM_REF() +{ + return { /*init=*/l2norm::Init, + /*free=*/nullptr, + /*prepare=*/l2norm::Prepare, + /*invoke=*/l2norm::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_L2_NORMALIZATION() +{ + return Register_L2NORM_REF(); +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm_test.cc new file mode 100644 index 00000000..fea06893 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/l2norm_test.cc @@ -0,0 +1,254 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// used to set the quantization parameters for the int8_t and uint8_t tests +constexpr float kInputMin = -2.0; +constexpr float kInputMax = 2.0; +constexpr float kOutputMin = -1.0; +constexpr float kOutputMax = 127.0 / 128.0; + +TfLiteTensor CreateL2NormTensor(const float *data, TfLiteIntArray *dims, + bool is_input) +{ + return CreateTensor(data, dims); +} + +template +TfLiteTensor CreateL2NormTensor(const T *data, TfLiteIntArray *dims, + bool is_input) +{ + float kInputScale = ScaleFromMinMax(kInputMin, kInputMax); + int kInputZeroPoint = ZeroPointFromMinMax(kInputMin, kInputMax); + float kOutputScale = ScaleFromMinMax(kOutputMin, kOutputMax); + int kOutputZeroPoint = ZeroPointFromMinMax(kOutputMin, kOutputMax); + TfLiteTensor tensor; + if (is_input) { + tensor = CreateQuantizedTensor(data, dims, kInputScale, kInputZeroPoint); + } else { + tensor = CreateQuantizedTensor(data, dims, kOutputScale, kOutputZeroPoint); + } + + tensor.quantization.type = kTfLiteAffineQuantization; + return tensor; +} + +template +void TestL2Normalization(int *input_dims_data, const T *input_data, + const T *expected_output_data, T *output_data) +{ + TfLiteIntArray *dims = IntArrayFromInts(input_dims_data); + + const int output_dims_count = ElementCount(*dims); + + constexpr int tensors_size = 2; + TfLiteTensor tensors[tensors_size] = { + CreateL2NormTensor(input_data, dims, true), + CreateL2NormTensor(output_data, dims, false), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + TfLiteL2NormParams builtin_data = { + .activation = kTfLiteActNone, + }; + + const TfLiteRegistration registration = + ops::micro::Register_L2_NORMALIZATION(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleFloatTest) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const float input_data[data_length] = { -1.1, 0.6, 0.7, 1.2, -0.7, 0.1 }; + const float expected_output_data[data_length] = { -0.55, 0.3, 0.35, + 0.6, -0.35, 0.05 }; + float output_data[data_length]; + + tflite::testing::TestL2Normalization( + input_dims, input_data, expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(ZerosVectorFloatTest) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const float input_data[data_length] = { 0, 0, 0, 0, 0, 0 }; + const float expected_output_data[data_length] = { 0, 0, 0, 0, 0, 0 }; + float output_data[data_length]; + + tflite::testing::TestL2Normalization( + input_dims, input_data, expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(SimpleFloatWithRankLessThanFourTest) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const float input_data[data_length] = { -1.1, 0.6, 0.7, 1.2, -0.7, 0.1 }; + const float expected_output_data[data_length] = { -0.55, 0.3, 0.35, + 0.6, -0.35, 0.05 }; + float output_data[data_length]; + + tflite::testing::TestL2Normalization( + input_dims, input_data, expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(MultipleBatchFloatTest) +{ + int input_dims[] = { 4, 3, 1, 1, 6 }; + constexpr int data_length = 18; + const float input_data[data_length] = { + -1.1, 0.6, 0.7, 1.2, -0.7, 0.1, // batch 1 + -1.1, 0.6, 0.7, 1.2, -0.7, 0.1, // batch 2 + -1.1, 0.6, 0.7, 1.2, -0.7, 0.1, // batch 3 + }; + const float expected_output_data[data_length] = { + -0.55, 0.3, 0.35, 0.6, -0.35, 0.05, // batch 1 + -0.55, 0.3, 0.35, 0.6, -0.35, 0.05, // batch 2 + -0.55, 0.3, 0.35, 0.6, -0.35, 0.05, // batch 3 + }; + float output_data[data_length]; + + tflite::testing::TestL2Normalization( + input_dims, input_data, expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(ZerosVectorUint8Test) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const uint8_t input_data[data_length] = { 127, 127, 127, 127, 127, 127 }; + const uint8_t expected_output[data_length] = { 128, 128, 128, 128, 128, 128 }; + uint8_t output_data[data_length]; + + tflite::testing::TestL2Normalization(input_dims, input_data, + expected_output, output_data); +} + +TF_LITE_MICRO_TEST(SimpleUint8Test) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const uint8_t input_data[data_length] = { 57, 165, 172, 204, 82, 133 }; + const uint8_t expected_output[data_length] = { + 58, + 166, + 173, + 205, + 83, + 134, + }; + uint8_t output_data[data_length]; + + tflite::testing::TestL2Normalization(input_dims, input_data, + expected_output, output_data); +} + +TF_LITE_MICRO_TEST(SimpleInt8Test) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const int8_t input_data[data_length] = { -71, 37, 44, 76, -46, 5 }; + const int8_t expected_output[data_length] = { -70, 38, 45, 77, -45, 6 }; + int8_t output_data[data_length]; + + tflite::testing::TestL2Normalization(input_dims, input_data, + expected_output, output_data); +} + +TF_LITE_MICRO_TEST(ZerosVectorInt8Test) +{ + int input_dims[] = { 4, 1, 1, 1, 6 }; + constexpr int data_length = 6; + const int8_t input_data[data_length] = { -1, -1, -1, -1, -1, -1 }; + const int8_t expected_output[data_length] = { 0, 0, 0, 0, 0, 0 }; + int8_t output_data[data_length]; + + tflite::testing::TestL2Normalization(input_dims, input_data, + expected_output, output_data); +} + +TF_LITE_MICRO_TEST(MultipleBatchUint8Test) +{ + int input_dims[] = { 2, 3, 6 }; + constexpr int data_length = 18; + const uint8_t input_data[data_length] = { + 57, 165, 172, 204, 82, 133, // batch 1 + 57, 165, 172, 204, 82, 133, // batch 2 + 57, 165, 172, 204, 82, 133, // batch 3 + }; + const uint8_t expected_output[data_length] = { + 58, 166, 173, 205, 83, 134, // batch 1 + 58, 166, 173, 205, 83, 134, // batch 2 + 58, 166, 173, 205, 83, 134, // batch 3 + }; + uint8_t output_data[data_length]; + + tflite::testing::TestL2Normalization(input_dims, input_data, + expected_output, output_data); +} + +TF_LITE_MICRO_TEST(MultipleBatchInt8Test) +{ + int input_dims[] = { 2, 3, 6 }; + constexpr int data_length = 18; + const int8_t input_data[data_length] = { + -71, 37, 44, 76, -46, 5, // batch 1 + -71, 37, 44, 76, -46, 5, // batch 2 + -71, 37, 44, 76, -46, 5, // batch 3 + }; + const int8_t expected_output[data_length] = { + -70, 38, 45, 77, -45, 6, // batch 1 + -70, 38, 45, 77, -45, 6, // batch 2 + -70, 38, 45, 77, -45, 6, // batch 3 + }; + int8_t output_data[data_length]; + + tflite::testing::TestL2Normalization(input_dims, input_data, + expected_output, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu.cc new file mode 100644 index 00000000..265245d9 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu.cc @@ -0,0 +1,163 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/leaky_relu.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +// Input/output tensor index. +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +struct LeakyReluOpData { + // quantization parameters + int32_t output_multiplier_alpha; + int32_t output_shift_alpha; + int32_t output_multiplier_identity; + int32_t output_shift_identity; + int32_t input_zero_point; + int32_t output_zero_point; +}; + +template +void QuantizeLeakyRelu(const LeakyReluOpData &data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output) +{ + LeakyReluParams op_params = {}; + + op_params.input_offset = data.input_zero_point; + op_params.output_offset = data.output_zero_point; + op_params.output_multiplier_alpha = data.output_multiplier_alpha; + op_params.output_shift_alpha = data.output_shift_alpha; + op_params.output_multiplier_identity = data.output_multiplier_identity; + op_params.output_shift_identity = data.output_shift_identity; + reference_ops::QuantizeLeakyRelu(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + if (output->type == kTfLiteInt8 || output->type == kTfLiteInt16) { + LeakyReluOpData *data = static_cast(node->user_data); + const auto *params = + static_cast(node->builtin_data); + + data->input_zero_point = input->params.zero_point; + data->output_zero_point = output->params.zero_point; + + int output_shift_alpha; + double alpha_multiplier = static_cast( + input->params.scale * params->alpha / output->params.scale); + QuantizeMultiplier(alpha_multiplier, &data->output_multiplier_alpha, + &output_shift_alpha); + data->output_shift_alpha = static_cast(output_shift_alpha); + + int output_shift_identity; + double identity_multiplier = + static_cast(input->params.scale / output->params.scale); + QuantizeMultiplier(identity_multiplier, &data->output_multiplier_identity, + &output_shift_identity); + data->output_shift_identity = static_cast(output_shift_identity); + } + + return kTfLiteOk; +} + +void *LeakyReluInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(LeakyReluOpData)); +} + +TfLiteStatus LeakyReluPrepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +TfLiteStatus LeakyReluEval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + const LeakyReluOpData &data = *static_cast(node->user_data); + + switch (input->type) { + case kTfLiteFloat32: { + LeakyReluParams op_params = {}; + const auto *params = + static_cast(node->builtin_data); + + op_params.alpha = params->alpha; + reference_ops::LeakyRelu(op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + case kTfLiteInt8: { + QuantizeLeakyRelu(data, input, output); + return kTfLiteOk; + } break; + case kTfLiteInt16: { + QuantizeLeakyRelu(data, input, output); + return kTfLiteOk; + } break; + default: + TF_LITE_KERNEL_LOG( + context, "Only float32, int8 are supported by LEAKY_RELU, got %s.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + + return kTfLiteError; +} + +} // namespace + +TfLiteRegistration Register_LEAKY_RELU() +{ + return { /*init=*/LeakyReluInit, + /*free=*/nullptr, + /*prepare=*/LeakyReluPrepare, + /*invoke=*/LeakyReluEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu_test.cc new file mode 100644 index 00000000..8356a5b7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/leaky_relu_test.cc @@ -0,0 +1,250 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// min/max are used to compute scale, zero-point, compare tolerance +template +struct TestLeakyReluParams { + // general parameters + float alpha; // alpha multiplier + + // quantization parameters + float scale; // quantization scale of input and output + int zero_point; // quantization zero_point of input and output + T *input_data; // quantized input storage + T *output_data; // quantized output storage + float tolerance; // output vs expected value tolerance +}; + +void ExecuteLeakyReluTest(const float alpha, const int tensors_count, + TfLiteTensor *tensors) +{ + TfLiteLeakyReluParams builtin_data = {}; + builtin_data.alpha = alpha; + + int kInputArrayData[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + const TfLiteRegistration registration = tflite::Register_LEAKY_RELU(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, static_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestLeakyRelu(const TestLeakyReluParams ¶ms, int *input_dims_data, + const T *input_data, int *expected_dims, + const T *expected_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int tensors_count = std::extent::value; + ExecuteLeakyReluTest(params.alpha, tensors_count, tensors); + + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_data[i], output_data[i]); + } +} + +template +void TestLeakyReluQuantized(const TestLeakyReluParams ¶ms, + int *input_dims_data, const float *input_data, + int *expected_dims, const float *expected_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, params.input_data, input_dims, + params.scale, params.zero_point), + CreateQuantizedTensor(params.output_data, output_dims, params.scale, + params.zero_point), + }; + constexpr int kTensorsCount = std::extent::value; + ExecuteLeakyReluTest(params.alpha, kTensorsCount, tensors); + + Dequantize(params.output_data, output_count, params.scale, params.zero_point, + output_data); + const float kTolerance = params.tolerance; + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], kTolerance); + } +} + +// Our fixed-point math function implementations have roughly 12 bits of +// accuracy, when specialized to 16-bit fixed-point arithmetic. +// That is purely an implementation compromise, it would have been possible +// to get closer to 16 bits of accuracy but that would be more expensive, +// and not needed for our purposes as ultimately the output is either +// immediately down-quantized to 8 bits, or will typically be at the output +// of the surrounding LSTM cell. +// So we can require roughly 2^-12 accuracy when the output is 16-bit, and +// we can more or less expect the full 2^-8 accuracy when the output is 8-bit. +// +// However, the representable output interval is often [-1, 1] (it has to be +// for tanh, and even for logistic, when we implement it in fixed-point, we +// typically have to do so on such a symmetric interval, e.g. ARM NEON only +// has signed fixed-point arithmetic (SQRDMULH)). As the width of [-1, 1] +// is 2, our representable values are often diluted by a factor of 2, whence +// the factor of 2 below. +const float kQuantizedTolerance = 2 * (1. / 256); + +template +void QuantizedActivationsOpTestLeakyRelu() +{ + int kDims[] = { 2, 5, 5 }; + constexpr float kInput[] = { + -5.0f, -4.6f, -4.2f, -3.8f, -3.4f, // Row 1 + -3.0f, -2.6f, -2.2f, -1.8f, -1.4f, // Row 2 + -1.0f, -0.6f, -0.2f, 0.2f, 0.6f, // Row 3 + 1.0f, 1.4f, 1.8f, 2.2f, 2.6f, // Row 4 + 3.0f, 3.4f, 3.8f, 4.2f, 4.6f, // Row 5 + }; + constexpr float kExpect[] = { + -0.50f, -0.46f, -0.42f, -0.38f, -0.34f, // Row 1 + -0.30f, -0.26f, -0.22f, -0.18f, -0.14f, // Row 2 + -0.10f, -0.06f, -0.02f, 0.20f, 0.60f, // Row 3 + 1.00f, 1.40f, 1.80f, 2.20f, 2.60f, // Row 4 + 3.00f, 3.40f, 3.80f, 4.20f, 4.60f, // Row 5 + }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + // setup quantization storage and parameters + integer_dtype q_output_data[kOutputCount]; + integer_dtype q_input_data[kOutputCount]; + + constexpr float kMin = -1; + constexpr float kMax = + std::numeric_limits::max() / + static_cast(std::numeric_limits::max() + 1); + // Quantize with a symmetric input / output range of {-5, 5}. + constexpr float kDataMin = 5 * kMin; + constexpr float kDataMax = 5 * kMax; + + TestLeakyReluParams params = {}; + params.alpha = 0.1f; + params.scale = ScaleFromMinMax(kDataMin, kDataMax); + params.zero_point = ZeroPointFromMinMax(kDataMin, kDataMax); + params.input_data = q_input_data; + params.output_data = q_output_data; + params.tolerance = kQuantizedTolerance * 5; + + TestLeakyReluQuantized(params, kDims, kInput, kDims, kExpect, output_data); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(QuantizedActivationsOpTestLeakyReluInt8_1) +{ + int kDims[] = { 2, 2, 3 }; + constexpr float kInput[] = { 0.0f, 1.0f, 3.0f, 1.0f, -1.0f, -2.0f }; + constexpr float kExpect[] = { 0.0f, 1.0f, 3.0f, 1.0f, -0.5f, -1.0f }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + // setup quantization storage and parameters + int8_t q_output_data[kOutputCount]; + int8_t q_input_data[kOutputCount]; + + tflite::testing::TestLeakyReluParams params = {}; + params.alpha = 0.5f; + params.scale = 0.1f; + params.zero_point = 0; + params.input_data = q_input_data; + params.output_data = q_output_data; + params.tolerance = tflite::testing::kQuantizedTolerance; + + tflite::testing::TestLeakyReluQuantized(params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(QuantizedActivationsOpTestLeakyReluInt8_2) +{ + tflite::testing::QuantizedActivationsOpTestLeakyRelu(); +} + +TF_LITE_MICRO_TEST(QuantizedActivationsOpTestLeakyReluInt16_1) +{ + int kDims[] = { 2, 2, 3 }; + constexpr float kInput[] = { 0.0f, 1.0f, 3.0f, 1.0f, -1.0f, -2.0f }; + constexpr float kExpect[] = { 0.0f, 1.0f, 3.0f, 1.0f, -0.5f, -1.0f }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + // setup quantization storage and parameters + int16_t q_output_data[kOutputCount]; + int16_t q_input_data[kOutputCount]; + + tflite::testing::TestLeakyReluParams params = {}; + params.alpha = 0.5f; + params.scale = 0.01f; + params.zero_point = 0; + params.input_data = q_input_data; + params.output_data = q_output_data; + params.tolerance = tflite::testing::kQuantizedTolerance; + + tflite::testing::TestLeakyReluQuantized(params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(QuantizedActivationsOpTestLeakyReluInt16_2) +{ + tflite::testing::QuantizedActivationsOpTestLeakyRelu(); +} + +TF_LITE_MICRO_TEST(FloatActivationsOpTestLeakyRelu) +{ + int kDims[] = { 2, 2, 3 }; + constexpr float kInput[] = { 0.0f, 1.0f, 3.0f, 1.0f, -1.0f, -2.0f }; + constexpr float kExpect[] = { 0.0f, 1.0f, 3.0f, 1.0f, -0.5f, -1.0f }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + tflite::testing::TestLeakyReluParams params = {}; + params.alpha = 0.5f; + + tflite::testing::TestLeakyRelu(params, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax.cc new file mode 100644 index 00000000..13c4e9c5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax.cc @@ -0,0 +1,154 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/log_softmax.h" + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +// used only with quantized data +struct LogSoftmaxOpData { + int32_t input_multiplier; + int32_t input_left_shift; + int32_t reverse_scaling_divisor; + int32_t reverse_scaling_right_shift; + int diff_min; + size_t outer_size; // number of tensor elements skipping computation axis + size_t depth; // number of tensor elements on computation axis +}; + +// input/output tensor index +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + TF_LITE_ENSURE(context, HaveSameShapes(input, output)); + + if (input->type == kTfLiteInt8) { + node->user_data = + context->AllocatePersistentBuffer(context, sizeof(LogSoftmaxOpData)); + auto data = static_cast(node->user_data); + + // quantization datum + constexpr int32_t kOutputZeroPoint = 127; + constexpr float kOutputScale = 16.0 / 256; + constexpr double kBeta = 1.0; + constexpr int kScaledDiffIntegerBits = 5; + + TF_LITE_ENSURE(context, output->params.scale == kOutputScale); + TF_LITE_ENSURE(context, output->params.zero_point == kOutputZeroPoint); + + int input_left_shift; + int reverse_scaling_right_shift; + tflite::PreprocessLogSoftmaxScalingExp( + kBeta, static_cast(input->params.scale), kScaledDiffIntegerBits, + &data->input_multiplier, &input_left_shift, + &data->reverse_scaling_divisor, &reverse_scaling_right_shift); + data->input_left_shift = static_cast(input_left_shift); + data->reverse_scaling_right_shift = + static_cast(-reverse_scaling_right_shift); + // diff_min has a negative value, and is used to limit the maximum magnitude + // of the diffs, which are <= 0. + data->diff_min = + -tflite::CalculateInputRadius(kScaledDiffIntegerBits, input_left_shift); + + RuntimeShape input_shape = GetTensorShape(input); + const int trailing_dim = input_shape.DimensionsCount() - 1; + data->outer_size = + static_cast(FlatSizeSkipDim(input_shape, trailing_dim)); + data->depth = static_cast(input_shape.Dims(trailing_dim)); + } + + return kTfLiteOk; +} + +TfLiteStatus LogSoftmaxPrepare(TfLiteContext *context, TfLiteNode *node) +{ + return CalculateOpData(context, node); +} + +TfLiteStatus LogSoftmaxEval(TfLiteContext *context, TfLiteNode *node) +{ + const LogSoftmaxOpData *data = + static_cast(node->user_data); + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + switch (input->type) { + case kTfLiteFloat32: { + SoftmaxParams op_params = {}; + reference_ops::LogSoftmax(op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + case kTfLiteInt8: { + SoftmaxParams op_params = {}; + op_params.input_multiplier = data->input_multiplier; + op_params.input_left_shift = data->input_left_shift; + op_params.reverse_scaling_divisor = data->reverse_scaling_divisor; + op_params.reverse_scaling_right_shift = data->reverse_scaling_right_shift; + op_params.diff_min = data->diff_min; + reference_ops::LogSoftmax(op_params, data->outer_size, data->depth, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + default: + TF_LITE_KERNEL_LOG(context, + "LOG_SOFTMAX only supports float32, int8, got %s.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } +} + +} // namespace + +TfLiteRegistration Register_LOG_SOFTMAX() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/LogSoftmaxPrepare, + /*invoke=*/LogSoftmaxEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax_test.cc new file mode 100644 index 00000000..77927a4b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/log_softmax_test.cc @@ -0,0 +1,270 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void ExecuteLogSoftmaxTest(int tensors_count, TfLiteTensor *tensors) +{ + int kInputArrayData[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(kInputArrayData); + int kOutputArrayData[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(kOutputArrayData); + + const TfLiteRegistration registration = tflite::Register_LOG_SOFTMAX(); + micro::KernelRunner runner(registration, tensors, tensors_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); +} + +template +void TestLogSoftmax(const float tolerance, int *input_dims_data, + const T *input_data, int *expected_dims, + const T *expected_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + constexpr int kTensorsCount = std::extent::value; + ExecuteLogSoftmaxTest(kTensorsCount, tensors); + + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], tolerance); + } +} + +// min/max are used to compute scale, zero-point +template +struct TestLogSoftmaxParams { + // quantization parameters + float data_min; // input and output data minimum value + float data_max; // input and output data maximum value + T *input_data; // quantized input storage + T *output_data; // quantized output storage + float tolerance; // maximum compare difference +}; + +template +void TestLogSoftmaxQuantized(const TestLogSoftmaxParams ¶ms, + int *input_dims_data, const float *input_data, + int *expected_dims, const float *expected_data, + const T *expected_data_quantized, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(expected_dims); + const int output_count = ElementCount(*output_dims); + + constexpr float kOutputScale = 16.0 / 256; + constexpr int kOutputZeroPoint = 127; + const float scale = ScaleFromMinMax(params.data_min, params.data_max); + const int zero_point = + ZeroPointFromMinMax(params.data_min, params.data_max); + + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, params.input_data, input_dims, scale, + zero_point), + CreateQuantizedTensor(params.output_data, output_dims, kOutputScale, + kOutputZeroPoint), + }; + constexpr int kTensorsCount = std::extent::value; + + ExecuteLogSoftmaxTest(kTensorsCount, tensors); + + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_data_quantized[i], params.output_data[i]); + } + Dequantize(params.output_data, output_count, kOutputScale, kOutputZeroPoint, + output_data); + for (int i = 0; i < output_count; i++) { + TF_LITE_MICRO_EXPECT_NEAR(expected_data[i], output_data[i], + params.tolerance); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +// This contains the same test values as the Softmax test, but reference answer +// generated via the following snippet of python: +// logits1 = tf.constant([[0, -6, 2, 4],[3, -2, 10, 1]], dtype=tf.float32) +// logits2 = tf.constant([[0,-6],[2,4],[3,-2],[10,1]], dtype=tf.float32) +// lsm1 = tf.nn.log_softmax(logits1) +// lsm2 = tf.nn.log_softmax(logits2) +// with tf.Session() as sess: +// print('lsm1', sess.run(lsm1)) +// print('lsm2', sess.run(lsm2)) +TF_LITE_MICRO_TEST(FloatActivationsOpTestLogSoftmax) +{ + int kDims1[] = { 2, 2, 4 }; + constexpr float kInput[] = { + 0, + -6, + 2, + 4, + 3, + -2, + 10, + 1, + }; + constexpr float kExpect1[] = { + -4.14297, -10.14297, -2.14297, -.142971, // + -7.00104, -12.00104, -.00104087, -9.00104, // + }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + constexpr float kTolerance = 1e-5; + + tflite::testing::TestLogSoftmax(kTolerance, kDims1, kInput, kDims1, kExpect1, + output_data); + + // Same input, but a different shape. + int kDims2[] = { 2, 4, 2 }; + constexpr float kExpect2[] = { + -.00247565, + -6.00247, + -2.12692, + -.126928, + -.00671534, + -5.00671, + -.000123374, + -9.00012, + }; + + tflite::testing::TestLogSoftmax(kTolerance, kDims2, kInput, kDims2, kExpect2, + output_data); +} + +TF_LITE_MICRO_TEST(LogSoftmaxOpTestSimpleTest) +{ + int kDims[] = { 2, 2, 5 }; + constexpr float kInput[] = { + 1.0, 2.0, 3.0, 4.0, 5.0, // + -1.0, -2.0, -3.0, -4.0, -5.0, // + }; + constexpr float kExpect[] = { + -4.45191431, -3.45191431, -2.45191431, -1.45191443, -0.4519144, // + -0.4519144, -1.45191443, -2.45191431, -3.45191431, -4.45191431 // + }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + constexpr float kTolerance = 1e-6; + + tflite::testing::TestLogSoftmax(kTolerance, kDims, kInput, kDims, kExpect, + output_data); +} + +TF_LITE_MICRO_TEST(QuantizedActivationsOpTestLogSoftmaxInt8) +{ + int kDims[] = { 2, 2, 4 }; + constexpr float kInput[] = { + 0, + -6, + 2, + 4, + 3, + -2, + 10, + 1, + }; + constexpr float kExpect[] = { + -4.14297, + -10.14297, + -2.14297, + -.142971, + -7.00104, + -12.00104, + -.00104087, + -9.00104, + }; + constexpr int8_t kExpectQuantized[] = { + 61, + -36, + 93, + 125, + 15, + -65, + 127, + -16, + }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + // setup quantization storage and parameters + int8_t q_output_data[kOutputCount]; + int8_t q_input_data[kOutputCount]; + constexpr float kMin = -10; + constexpr float kMax = 10; + constexpr float kLogSoftmaxQuantizedTolerance = 0.06355; + tflite::testing::TestLogSoftmaxParams params = {}; + params.data_min = kMin; + params.data_max = kMax; + params.input_data = q_input_data; + params.output_data = q_output_data; + params.tolerance = kLogSoftmaxQuantizedTolerance; + + tflite::testing::TestLogSoftmaxQuantized( + params, kDims, kInput, kDims, kExpect, kExpectQuantized, output_data); +} + +TF_LITE_MICRO_TEST(ExtraTestLogSoftmaxInt8) +{ + int kDims[] = { 2, 3, 1 }; + constexpr float kInput[] = { 0, -1, 1 }; + constexpr float kExpect[] = { 0, 0, 0 }; + constexpr int8_t kExpectQuantized[] = { 127, 127, 127 }; + constexpr int kOutputCount = std::extent::value; + float output_data[kOutputCount]; + + // setup quantization storage and parameters + int8_t q_output_data[kOutputCount]; + int8_t q_input_data[kOutputCount]; + constexpr float kMin = -1; + constexpr float kMax = 1; + constexpr float kLogSoftmaxQuantizedTolerance = 0.06355; + tflite::testing::TestLogSoftmaxParams params = {}; + params.data_min = kMin; + params.data_max = kMax; + params.input_data = q_input_data; + params.output_data = q_output_data; + params.tolerance = kLogSoftmaxQuantizedTolerance; + + tflite::testing::TestLogSoftmaxQuantized( + params, kDims, kInput, kDims, kExpect, kExpectQuantized, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/logical.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logical.cc new file mode 100644 index 00000000..ea670018 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logical.cc @@ -0,0 +1,116 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/reference/binary_function.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace logical { +namespace { + +// Input/output tensor index. +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus LogicalImpl(TfLiteContext *context, TfLiteNode *node, + bool (*func)(bool, bool)) +{ + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + if (tflite::micro::HaveSameShapes(input1, input2)) { + reference_ops::BinaryFunction( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), func); + } else { + reference_ops::BroadcastBinaryFunction4DSlow( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), func); + } + + return kTfLiteOk; +} + +bool LogicalOr(bool x, bool y) +{ + return x || y; +} + +TfLiteStatus LogicalOrEval(TfLiteContext *context, TfLiteNode *node) +{ + return LogicalImpl(context, node, LogicalOr); +} + +bool LogicalAnd(bool x, bool y) +{ + return x && y; +} + +TfLiteStatus LogicalAndEval(TfLiteContext *context, TfLiteNode *node) +{ + return LogicalImpl(context, node, LogicalAnd); +} + +} // namespace +} // namespace logical + +TfLiteRegistration Register_LOGICAL_OR() +{ + // Init, Free, Prepare, Eval are satisfying the Interface required by + // TfLiteRegistration. + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/logical::LogicalOrEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_LOGICAL_AND() +{ + // Init, Free, Prepare, Eval are satisfying the Interface required by + // TfLiteRegistration. + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/logical::LogicalAndEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/logical_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logical_test.cc new file mode 100644 index 00000000..4bf203ed --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logical_test.cc @@ -0,0 +1,121 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestLogicalOp(const TfLiteRegistration ®istration, + int *input1_dims_data, const bool *input1_data, + int *input2_dims_data, const bool *input2_data, + int *output_dims_data, const bool *expected_output_data, + bool *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + TF_LITE_MICRO_EXPECT_EQ(output_dims_count, 4); + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(LogicalOr) +{ + int shape[] = { 4, 1, 1, 1, 4 }; + const bool input1[] = { true, false, false, true }; + const bool input2[] = { true, false, true, false }; + const bool golden[] = { true, false, true, true }; + bool output_data[4]; + tflite::testing::TestLogicalOp(tflite::ops::micro::Register_LOGICAL_OR(), + shape, input1, shape, input2, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(BroadcastLogicalOr) +{ + int input1_shape[] = { 4, 1, 1, 1, 4 }; + const bool input1[] = { true, false, false, true }; + int input2_shape[] = { 4, 1, 1, 1, 1 }; + const bool input2[] = { false }; + const bool golden[] = { true, false, false, true }; + bool output_data[4]; + tflite::testing::TestLogicalOp(tflite::ops::micro::Register_LOGICAL_OR(), + input1_shape, input1, input2_shape, input2, + input1_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(LogicalAnd) +{ + int shape[] = { 4, 1, 1, 1, 4 }; + const bool input1[] = { true, false, false, true }; + const bool input2[] = { true, false, true, false }; + const bool golden[] = { true, false, false, false }; + bool output_data[4]; + tflite::testing::TestLogicalOp(tflite::ops::micro::Register_LOGICAL_AND(), + shape, input1, shape, input2, shape, golden, + output_data); +} + +TF_LITE_MICRO_TEST(BroadcastLogicalAnd) +{ + int input1_shape[] = { 4, 1, 1, 1, 4 }; + const bool input1[] = { true, false, false, true }; + int input2_shape[] = { 4, 1, 1, 1, 1 }; + const bool input2[] = { true }; + const bool golden[] = { true, false, false, true }; + bool output_data[4]; + tflite::testing::TestLogicalOp(tflite::ops::micro::Register_LOGICAL_AND(), + input1_shape, input1, input2_shape, input2, + input1_shape, golden, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic.cc new file mode 100644 index 00000000..8f2396f0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic.cc @@ -0,0 +1,155 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/logistic.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace activations { +namespace { +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +struct OpData { + int32_t input_zero_point; + int32_t input_range_radius; + int32_t input_multiplier; + int input_left_shift; +}; + +TfLiteStatus CalculateArithmeticOpData(TfLiteContext *context, TfLiteNode *node, + OpData *data) +{ + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + if (input->type == kTfLiteInt8) { + TF_LITE_ENSURE_EQ(context, output->params.zero_point, + std::numeric_limits::min()); + + static constexpr int kInputIntegerBits = 4; + const double input_real_multiplier = + static_cast(input->params.scale) * + static_cast(1 << (31 - kInputIntegerBits)); + + data->input_zero_point = input->params.zero_point; + + const double q = std::frexp(input_real_multiplier, &data->input_left_shift); + data->input_multiplier = static_cast(TfLiteRound(q * (1ll << 31))); + + data->input_range_radius = + CalculateInputRadius(kInputIntegerBits, data->input_left_shift, 31); + } + return kTfLiteOk; +} +} // namespace + +void *LogisticInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus LogisticPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + return CalculateArithmeticOpData(context, node, data); +} + +TfLiteStatus LogisticEval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + if (input->type == kTfLiteFloat32) { + switch (output->type) { + case kTfLiteFloat32: { + reference_ops::Logistic(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else if (input->type == kTfLiteInt8) { + switch (output->type) { + case kTfLiteInt8: { + reference_integer_ops::Logistic( + data->input_zero_point, data->input_range_radius, + data->input_multiplier, data->input_left_shift, + NumElements(input->dims), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else { + // TODO(b/141211002): Also support other data types once we have supported + // temporary tensors in TFLM. + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace activations + +TfLiteRegistration Register_LOGISTIC() +{ + return { /*init=*/activations::LogisticInit, + /*free=*/nullptr, + /*prepare=*/activations::LogisticPrepare, + /*invoke=*/activations::LogisticEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic_test.cc new file mode 100644 index 00000000..78be5f2c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/logistic_test.cc @@ -0,0 +1,193 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// The Logistic kernel assumes an output in the range [0, 1.0], leading to these +// quantization parameters. +const float quantized_output_scale = 1.0 / 255.0; +const int quantized_output_zero_point_int8 = -128; + +const int flat_size_basic = 10; +int shape_basic[] = { 2, 2, 5 }; +const float input_data_basic[] = { 1, 2, 3, 4, 5, -1, -2, -3, -4, -5 }; +const float golden_basic[] = { 0.73105858, 0.88079708, 0.95257413, 0.98201379, + 0.99330715, 0.26894142, 0.11920292, 0.04742587, + 0.01798621, 0.00669285 }; + +const int flat_size_wide_range = 10; +int shape_wide_range[] = { 2, 1, 5 }; +const float input_data_wide_range[]{ + 1.0, + 2.0, + 3.0, + 4.0, + 93.0, + -1.0, + -2.0, + -3.0, + -4.0, + -93.0, +}; +const float golden_wide_range[] = { + 0.73105858, + 0.88079708, + 0.95257413, + 0.98201379, + 1.0, + 0.26894142, + 0.11920292, + 0.04742587, + 0.01798621, + 0.0, +}; + +template +void ValidateLogisticGoldens(TfLiteTensor *tensors, const int tensor_count, + T *output_data, const T *golden, + int output_dims_count, float tolerance) +{ + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_LOGISTIC(); + micro::KernelRunner runner(registration, tensors, tensor_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], tolerance); + } +} + +void TestLogisticFloat(int *input_dims_data, const float *input_data, + const float *golden, int *output_dims_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateLogisticGoldens(tensors, tensors_size, output_data, golden, + output_elements_count, 1e-5); +} + +template +void TestLogisticQuantized(int *input_dims_data, const float *input_data, + T *input_quantized, const float input_scale, + const int input_zero_point, const float *golden, + T *golden_quantized, int *output_dims_data, + const float output_scale, + const int output_zero_point, int8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + tflite::Quantize(golden, golden_quantized, output_elements_count, + output_scale, output_zero_point); + ValidateLogisticGoldens(tensors, tensors_size, output_data, golden_quantized, + output_elements_count, 1.0); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(LogisticFloatBasicShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_basic]; + tflite::testing::TestLogisticFloat( + tflite::testing::shape_basic, tflite::testing::input_data_basic, + tflite::testing::golden_basic, tflite::testing::shape_basic, output_data); +} + +TF_LITE_MICRO_TEST(LogisticQuantizedInt8BasicShouldMatchGolden) +{ + const float input_scale = 0.1; + const int input_zero_point = 0; + int8_t input_quantized[tflite::testing::flat_size_basic]; + int8_t golden_quantized[tflite::testing::flat_size_basic]; + int8_t output_data[tflite::testing::flat_size_basic]; + + tflite::testing::TestLogisticQuantized( + tflite::testing::shape_basic, tflite::testing::input_data_basic, + input_quantized, input_scale, input_zero_point, + tflite::testing::golden_basic, golden_quantized, + tflite::testing::shape_basic, tflite::testing::quantized_output_scale, + tflite::testing::quantized_output_zero_point_int8, output_data); +} + +TF_LITE_MICRO_TEST(LogisticFloatWideRangeShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_wide_range]; + tflite::testing::TestLogisticFloat( + tflite::testing::shape_wide_range, tflite::testing::input_data_wide_range, + tflite::testing::golden_wide_range, tflite::testing::shape_wide_range, + output_data); +} + +TF_LITE_MICRO_TEST(LogisticQuantizedInt8WideRangeShouldMatchGolden) +{ + const float input_scale = 1.0; + const int input_zero_point = 0; + int8_t input_quantized[tflite::testing::flat_size_wide_range]; + int8_t golden_quantized[tflite::testing::flat_size_wide_range]; + int8_t output_data[tflite::testing::flat_size_wide_range]; + + tflite::testing::TestLogisticQuantized( + tflite::testing::shape_wide_range, tflite::testing::input_data_wide_range, + input_quantized, input_scale, input_zero_point, + tflite::testing::golden_wide_range, golden_quantized, + tflite::testing::shape_wide_range, + tflite::testing::quantized_output_scale, + tflite::testing::quantized_output_zero_point_int8, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum.cc new file mode 100644 index 00000000..608f6aaf --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum.cc @@ -0,0 +1,155 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/maximum_minimum.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace maximum_minimum { +namespace { + +// This file has a reference implementation of TFMaximum/TFMinimum. +enum KernelType { + kReference, +}; + +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +struct OpContext { + OpContext(TfLiteContext *context, TfLiteNode *node) + { + input1 = tflite::micro::GetEvalInput(context, node, kInputTensor1); + input2 = tflite::micro::GetEvalInput(context, node, kInputTensor2); + output = tflite::micro::GetEvalOutput(context, node, kOutputTensor); + } + const TfLiteEvalTensor *input1; + const TfLiteEvalTensor *input2; + TfLiteEvalTensor *output; +}; + +struct MaximumOp { + template + static data_type op(data_type el1, data_type el2) + { + return el1 > el2 ? el1 : el2; + } +}; + +struct MinimumOp { + template + static data_type op(data_type el1, data_type el2) + { + return el1 < el2 ? el1 : el2; + } +}; + +} // namespace + +template +void TFLiteOperation(TfLiteContext *context, TfLiteNode *node, + const OpContext &op_context) +{ + reference_ops::MaximumMinimumBroadcastSlow( + tflite::micro::GetTensorShape(op_context.input1), + tflite::micro::GetTensorData(op_context.input1), + tflite::micro::GetTensorShape(op_context.input2), + tflite::micro::GetTensorData(op_context.input2), + tflite::micro::GetTensorShape(op_context.output), + tflite::micro::GetTensorData(op_context.output), + op_type::template op); +} + +template +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + OpContext op_context(context, node); + + if (kernel_type == kReference) { + switch (op_context.output->type) { + case kTfLiteFloat32: + TFLiteOperation(context, node, op_context); + break; + case kTfLiteUInt8: + TFLiteOperation(context, node, op_context); + break; + case kTfLiteInt8: + TFLiteOperation(context, node, op_context); + break; + case kTfLiteInt32: + TFLiteOperation(context, node, op_context); + break; + case kTfLiteInt64: + TFLiteOperation(context, node, op_context); + break; + default: + TF_LITE_KERNEL_LOG(context, + "Type %s (%d) is not supported by Maximum/Minimum.", + TfLiteTypeGetName(op_context.output->type), + op_context.output->type); + return kTfLiteError; + } + } else { + TF_LITE_KERNEL_LOG(context, + "Kernel type not supported by Maximum/Minimum."); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace maximum_minimum + +TfLiteRegistration Register_MAXIMUM() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/ + maximum_minimum::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_MINIMUM() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/ + maximum_minimum::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum_test.cc new file mode 100644 index 00000000..f38f92a6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/maximum_minimum_test.cc @@ -0,0 +1,232 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestMaxMinFloat(const TfLiteRegistration ®istration, + int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + const float *expected_output_data, int *output_dims_data, + float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +void TestMaxMinQuantized(const TfLiteRegistration ®istration, + int *input1_dims_data, const uint8_t *input1_data, + float const input1_scale, const int input1_zero_point, + int *input2_dims_data, const uint8_t *input2_data, + const float input2_scale, const int input2_zero_point, + const uint8_t *expected_output_data, + const float output_scale, const int output_zero_point, + int *output_dims_data, uint8_t *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input1_data, input1_dims, input1_scale, + input1_zero_point), + CreateQuantizedTensor(input2_data, input2_dims, input2_scale, + input2_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +void TestMaxMinQuantizedInt32(const TfLiteRegistration ®istration, + int *input1_dims_data, const int32_t *input1_data, + int *input2_dims_data, const int32_t *input2_data, + const int32_t *expected_output_data, + int *output_dims_data, int32_t *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatTest) +{ + int dims[] = { 3, 3, 1, 2 }; + const float data1[] = { 1.0, 0.0, -1.0, 11.0, -2.0, -1.44 }; + const float data2[] = { -1.0, 0.0, 1.0, 12.0, -3.0, -1.43 }; + const float golden_max[] = { 1.0, 0.0, 1.0, 12.0, -2.0, -1.43 }; + const float golden_min[] = { -1.0, 0.0, -1.0, 11.0, -3.0, -1.44 }; + float output_data[6]; + + tflite::testing::TestMaxMinFloat(tflite::ops::micro::Register_MAXIMUM(), dims, + data1, dims, data2, golden_max, dims, + output_data); + + tflite::testing::TestMaxMinFloat(tflite::ops::micro::Register_MINIMUM(), dims, + data1, dims, data2, golden_min, dims, + output_data); +} + +TF_LITE_MICRO_TEST(Uint8Test) +{ + int dims[] = { 3, 3, 1, 2 }; + const uint8_t data1[] = { 1, 0, 2, 11, 2, 23 }; + const uint8_t data2[] = { 0, 0, 1, 12, 255, 1 }; + const uint8_t golden_max[] = { 1, 0, 2, 12, 255, 23 }; + const uint8_t golden_min[] = { 0, 0, 1, 11, 2, 1 }; + + const float input_scale = 1.0; + const int input_zero_point = 0; + const float output_scale = 1.0; + const int output_zero_point = 0; + + uint8_t output_data[6]; + + tflite::testing::TestMaxMinQuantized( + tflite::ops::micro::Register_MAXIMUM(), dims, data1, input_scale, + input_zero_point, dims, data2, input_scale, input_zero_point, golden_max, + output_scale, output_zero_point, dims, output_data); + + tflite::testing::TestMaxMinQuantized( + tflite::ops::micro::Register_MINIMUM(), dims, data1, input_scale, + input_zero_point, dims, data2, input_scale, input_zero_point, golden_min, + output_scale, output_zero_point, dims, output_data); +} + +TF_LITE_MICRO_TEST(FloatWithBroadcastTest) +{ + int dims[] = { 3, 3, 1, 2 }; + int dims_scalar[] = { 1, 2 }; + const float data1[] = { 1.0, 0.0, -1.0, -2.0, -1.44, 11.0 }; + const float data2[] = { 0.5, 2.0 }; + const float golden_max[] = { 1.0, 2.0, 0.5, 2.0, 0.5, 11.0 }; + const float golden_min[] = { 0.5, 0.0, -1.0, -2.0, -1.44, 2.0 }; + float output_data[6]; + + tflite::testing::TestMaxMinFloat(tflite::ops::micro::Register_MAXIMUM(), dims, + data1, dims_scalar, data2, golden_max, dims, + output_data); + + tflite::testing::TestMaxMinFloat(tflite::ops::micro::Register_MINIMUM(), dims, + data1, dims_scalar, data2, golden_min, dims, + output_data); +} + +TF_LITE_MICRO_TEST(Int32WithBroadcastTest) +{ + int dims[] = { 3, 3, 1, 2 }; + int dims_scalar[] = { 1, 1 }; + const int32_t data1[] = { 1, 0, -1, -2, 3, 11 }; + const int32_t data2[] = { 2 }; + const int32_t golden_max[] = { 2, 2, 2, 2, 3, 11 }; + const int32_t golden_min[] = { 1, 0, -1, -2, 2, 2 }; + int32_t output_data[6]; + + tflite::testing::TestMaxMinQuantizedInt32( + tflite::ops::micro::Register_MAXIMUM(), dims, data1, dims_scalar, data2, + golden_max, dims, output_data); + + tflite::testing::TestMaxMinQuantizedInt32( + tflite::ops::micro::Register_MINIMUM(), dims, data1, dims_scalar, data2, + golden_min, dims, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_ops.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_ops.h new file mode 100644 index 00000000..a5c8717c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_ops.h @@ -0,0 +1,121 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_MICRO_OPS_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_MICRO_OPS_H_ + +#include "tensorflow/lite/c/common.h" + +// Forward declaration of all micro op kernel registration methods. These +// registrations are included with the standard `BuiltinOpResolver`. +// +// This header is particularly useful in cases where only a subset of ops are +// needed. In such cases, the client can selectively add only the registrations +// their model requires, using a custom `(Micro)MutableOpResolver`. Selective +// registration in turn allows the linker to strip unused kernels. + +namespace tflite { +// TFLM is incrementally moving towards a flat tflite namespace +// (https://abseil.io/tips/130). Any new ops (or cleanup of existing ops should +// have their Register function declarations in the tflite namespace. + +TfLiteRegistration Register_ADD_N(); +TfLiteRegistration Register_AVERAGE_POOL_2D(); +TfLiteRegistration Register_BATCH_TO_SPACE_ND(); +TfLiteRegistration Register_CAST(); +TfLiteRegistration Register_CUMSUM(); +TfLiteRegistration Register_DEPTH_TO_SPACE(); +TfLiteRegistration Register_DEPTHWISE_CONV_2D(); +TfLiteRegistration Register_DIV(); +TfLiteRegistration Register_ELU(); +TfLiteRegistration Register_EXP(); +TfLiteRegistration Register_EXPAND_DIMS(); +TfLiteRegistration Register_FILL(); +TfLiteRegistration Register_FLOOR_DIV(); +TfLiteRegistration Register_FLOOR_MOD(); +TfLiteRegistration Register_GATHER(); +TfLiteRegistration Register_GATHER_ND(); +TfLiteRegistration Register_IF(); +TfLiteRegistration Register_L2_POOL_2D(); +TfLiteRegistration Register_LEAKY_RELU(); +TfLiteRegistration Register_LOG_SOFTMAX(); +TfLiteRegistration Register_MAX_POOL_2D(); +TfLiteRegistration Register_QUANTIZE(); +TfLiteRegistration Register_RESIZE_BILINEAR(); +TfLiteRegistration Register_SHAPE(); +TfLiteRegistration Register_SPACE_TO_BATCH_ND(); +TfLiteRegistration Register_SPACE_TO_DEPTH(); +TfLiteRegistration Register_SQUEEZE(); +TfLiteRegistration Register_SVDF(); +TfLiteRegistration Register_TRANSPOSE(); +TfLiteRegistration Register_TRANSPOSE_CONV(); +TfLiteRegistration Register_ZEROS_LIKE(); + +namespace ops { +namespace micro { +TfLiteRegistration Register_ABS(); +TfLiteRegistration Register_ADD(); +TfLiteRegistration Register_ARG_MAX(); +TfLiteRegistration Register_ARG_MIN(); +TfLiteRegistration Register_CEIL(); +// TODO(b/160234179): Change custom OPs to also return by value. +TfLiteRegistration *Register_CIRCULAR_BUFFER(); +TfLiteRegistration Register_CONCATENATION(); +TfLiteRegistration Register_COS(); +TfLiteRegistration Register_DEQUANTIZE(); +TfLiteRegistration Register_EQUAL(); +TfLiteRegistration Register_FLOOR(); +TfLiteRegistration Register_GREATER(); +TfLiteRegistration Register_GREATER_EQUAL(); +TfLiteRegistration Register_HARD_SWISH(); +TfLiteRegistration Register_LESS(); +TfLiteRegistration Register_LESS_EQUAL(); +TfLiteRegistration Register_LOG(); +TfLiteRegistration Register_LOGICAL_AND(); +TfLiteRegistration Register_LOGICAL_NOT(); +TfLiteRegistration Register_LOGICAL_OR(); +TfLiteRegistration Register_LOGISTIC(); +TfLiteRegistration Register_MAXIMUM(); +TfLiteRegistration Register_MEAN(); +TfLiteRegistration Register_MINIMUM(); +TfLiteRegistration Register_MUL(); +TfLiteRegistration Register_NEG(); +TfLiteRegistration Register_NOT_EQUAL(); +TfLiteRegistration Register_PACK(); +TfLiteRegistration Register_PAD(); +TfLiteRegistration Register_PADV2(); +TfLiteRegistration Register_PRELU(); +TfLiteRegistration Register_REDUCE_MAX(); +TfLiteRegistration Register_RELU(); +TfLiteRegistration Register_RELU6(); +TfLiteRegistration Register_RESHAPE(); +TfLiteRegistration Register_RESIZE_NEAREST_NEIGHBOR(); +TfLiteRegistration Register_ROUND(); +TfLiteRegistration Register_RSQRT(); +TfLiteRegistration Register_SIN(); +TfLiteRegistration Register_SPLIT(); +TfLiteRegistration Register_SPLIT_V(); +TfLiteRegistration Register_SQRT(); +TfLiteRegistration Register_SQUARE(); +TfLiteRegistration Register_STRIDED_SLICE(); +TfLiteRegistration Register_SUB(); +TfLiteRegistration Register_UNPACK(); +TfLiteRegistration Register_L2_NORMALIZATION(); +TfLiteRegistration Register_TANH(); + +} // namespace micro +} // namespace ops +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_MICRO_OPS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_utils.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_utils.h new file mode 100644 index 00000000..c3cbf9ec --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/micro_utils.h @@ -0,0 +1,41 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_MICRO_UTILS_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_MICRO_UTILS_H_ +namespace tflite { +namespace ops { +namespace micro { +// Same as gtl::Greater but defined here to reduce dependencies and +// binary size for micro environment. +struct Greater { + template + bool operator()(const T &x, const T &y) const + { + return x > y; + } +}; + +struct Less { + template + bool operator()(const T &x, const T &y) const + { + return x < y; + } +}; + +} // namespace micro +} // namespace ops +} // namespace tflite +#endif // TENSORFLOW_LITE_MICRO_KERNELS_MICRO_UTILS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/mul.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/mul.cc new file mode 100644 index 00000000..f59db1c2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/mul.cc @@ -0,0 +1,221 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/mul.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/mul.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/memory_helpers.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace mul { +namespace { + +constexpr int kInput1Tensor = 0; +constexpr int kInput2Tensor = 1; +constexpr int kOutputTensor = 0; + +struct OpData { + int32_t input1_zero_point; + int32_t input2_zero_point; + + int32_t output_activation_min; + int32_t output_activation_max; + int32_t output_zero_point; + int32_t output_multiplier; + int output_shift; + + float output_activation_min_f32; + float output_activation_max_f32; +}; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node, + TfLiteMulParams *params, OpData *data) +{ + const TfLiteTensor *input1 = GetInput(context, node, kInput1Tensor); + TF_LITE_ENSURE(context, input1 != nullptr); + const TfLiteTensor *input2 = GetInput(context, node, kInput2Tensor); + TF_LITE_ENSURE(context, input2 != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + TF_LITE_ENSURE_TYPES_EQ(context, input1->type, input2->type); + + if (output->type == kTfLiteInt8) { + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, params->activation, output, &data->output_activation_min, + &data->output_activation_max)); + + double real_multiplier = static_cast(input1->params.scale) * + static_cast(input2->params.scale) / + static_cast(output->params.scale); + QuantizeMultiplier(real_multiplier, &data->output_multiplier, + &data->output_shift); + + data->input1_zero_point = input1->params.zero_point; + data->input2_zero_point = input2->params.zero_point; + data->output_zero_point = output->params.zero_point; + } else { + CalculateActivationRange(params->activation, + &data->output_activation_min_f32, + &data->output_activation_max_f32); + } + + return kTfLiteOk; +} + +} // namespace + +void EvalQuantized(TfLiteContext *context, TfLiteNode *node, const OpData *data, + const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, TfLiteEvalTensor *output) +{ + tflite::ArithmeticParams op_params = {}; + op_params.quantized_activation_min = data->output_activation_min; + op_params.quantized_activation_max = data->output_activation_max; + op_params.float_activation_max = data->output_activation_max_f32; + op_params.input1_offset = -data->input1_zero_point; + op_params.input2_offset = -data->input2_zero_point; + op_params.output_offset = data->output_zero_point; + op_params.output_multiplier = data->output_multiplier; + op_params.output_shift = data->output_shift; + + bool need_broadcast = reference_ops::ProcessBroadcastShapes( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorShape(input2), &op_params); + + if (need_broadcast) { + reference_integer_ops::BroadcastMul4DSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_integer_ops::Mul(op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } +} + +void EvalFloat(TfLiteContext *context, TfLiteNode *node, + TfLiteMulParams *params, const OpData *data, + const TfLiteEvalTensor *input1, const TfLiteEvalTensor *input2, + TfLiteEvalTensor *output) +{ + tflite::ArithmeticParams op_params = {}; + op_params.float_activation_min = data->output_activation_min_f32; + op_params.float_activation_max = data->output_activation_max_f32; + + bool need_broadcast = reference_ops::ProcessBroadcastShapes( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorShape(input2), &op_params); + + if (need_broadcast) { + reference_ops::BroadcastMul4DSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_ops::Mul(op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + auto *params = reinterpret_cast(node->builtin_data); + + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + return CalculateOpData(context, node, params, data); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + auto *params = reinterpret_cast(node->builtin_data); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInput1Tensor); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInput2Tensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (input1->type) { + case kTfLiteInt8: + EvalQuantized(context, node, data, input1, input2, output); + break; + case kTfLiteFloat32: + EvalFloat(context, node, params, data, input1, input2, output); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input1->type), input1->type); + return kTfLiteError; + } + + return kTfLiteOk; +} +} // namespace mul + +TfLiteRegistration Register_MUL() +{ + return { /*init=*/mul::Init, + /*free=*/nullptr, + /*prepare=*/mul::Prepare, + /*invoke=*/mul::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/mul_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/mul_test.cc new file mode 100644 index 00000000..29213b63 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/mul_test.cc @@ -0,0 +1,212 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +const int flat_size_simple = 4; +const float scale_simple = 0.01; +int dims_simple[] = { 4, 1, 2, 2, 1 }; +const float input1_simple[] = { -0.8, 0.2, 0.9, 0.7 }; +const float input2_simple[] = { 0.6, 0.4, 0.9, 0.8 }; +const float golden_simple[] = { -0.48, 0.08, 0.81, 0.56 }; +const float golden_simple_relu[] = { 0.0, 0.08, 0.81, 0.56 }; + +const int flat_size_broadcast = 6; +const float input_scale_broadcast = 0.05f; +const float output_scale_broadcast = 0.01f; +int dims_broadcast[] = { 4, 1, 3, 1, 2 }; +int dims_scalar_broadcast[] = { 1, 1 }; +const float input1_broadcast[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; +const float input2_broadcast[] = { 0.1 }; +const float golden_broadcast[] = { -0.2, 0.02, 0.07, 0.08, 0.11, 0.2 }; +const float golden_broadcast_relu[] = { 0, 0.02, 0.07, 0.08, 0.11, 0.2 }; + +template +void ValidateMulGoldens(TfLiteTensor *tensors, int tensors_size, + TfLiteFusedActivation activation, const T *golden, + int output_len, float tolerance, T *output) +{ + TfLiteMulParams builtin_data = { + .activation = activation, + }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_MUL(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_len; i++) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output[i], tolerance); + } +} + +void TestMulFloat(int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + int *output_dims_data, const float *golden, + float *output_data, TfLiteFusedActivation activation) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateMulGoldens(tensors, tensors_size, activation, golden, + output_dims_count, 1e-5, output_data); +} + +template +void TestMulQuantized(int *input1_dims_data, const float *input1_data, + T *input1_quantized, int *input2_dims_data, + const float *input2_data, T *input2_quantized, + const float input_scale, const int input_zero_point, + int *output_dims_data, const float *golden, + T *golden_quantized, const float output_scale, + const int output_zero_point, T *output_data, + TfLiteFusedActivation activation) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input1_data, input1_quantized, input1_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(input2_data, input2_quantized, input2_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + Quantize(golden, golden_quantized, output_dims_count, output_scale, + output_zero_point); + + ValidateMulGoldens(tensors, tensors_size, activation, golden_quantized, + output_dims_count, 1.0f, output_data); +} + +} // namespace + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleFloatNoAcativationShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_simple]; + + tflite::testing::TestMulFloat( + tflite::testing::dims_simple, tflite::testing::input1_simple, + tflite::testing::dims_simple, tflite::testing::input2_simple, + tflite::testing::dims_simple, tflite::testing::golden_simple, output_data, + kTfLiteActNone); +} + +TF_LITE_MICRO_TEST(SimpleFloatReluShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_simple]; + + tflite::testing::TestMulFloat( + tflite::testing::dims_simple, tflite::testing::input1_simple, + tflite::testing::dims_simple, tflite::testing::input2_simple, + tflite::testing::dims_simple, tflite::testing::golden_simple_relu, + output_data, kTfLiteActRelu); +} + +TF_LITE_MICRO_TEST(SimpleInt8NoAcativationShouldMatchGolden) +{ + int8_t input1_quantized[tflite::testing::flat_size_simple]; + int8_t input2_quantized[tflite::testing::flat_size_simple]; + int8_t golden_quantized[tflite::testing::flat_size_simple]; + int8_t output_data[tflite::testing::flat_size_simple]; + + tflite::testing::TestMulQuantized( + tflite::testing::dims_simple, tflite::testing::input1_simple, + input1_quantized, tflite::testing::dims_simple, + tflite::testing::input2_simple, input2_quantized, + tflite::testing::scale_simple, 0, tflite::testing::dims_simple, + tflite::testing::golden_simple, golden_quantized, + tflite::testing::scale_simple, 0, output_data, kTfLiteActNone); +} + +TF_LITE_MICRO_TEST(BroadcastFloatNoActivationShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_broadcast]; + + tflite::testing::TestMulFloat( + tflite::testing::dims_broadcast, tflite::testing::input1_broadcast, + tflite::testing::dims_scalar_broadcast, tflite::testing::input2_broadcast, + tflite::testing::dims_broadcast, tflite::testing::golden_broadcast, + output_data, kTfLiteActNone); +} + +TF_LITE_MICRO_TEST(BroadcastFloatReluShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_broadcast]; + + tflite::testing::TestMulFloat( + tflite::testing::dims_broadcast, tflite::testing::input1_broadcast, + tflite::testing::dims_scalar_broadcast, tflite::testing::input2_broadcast, + tflite::testing::dims_broadcast, tflite::testing::golden_broadcast_relu, + output_data, kTfLiteActRelu); +} + +TF_LITE_MICRO_TEST(BroadcastInt8NoAcativationShouldMatchGolden) +{ + int8_t input1_quantized[tflite::testing::flat_size_broadcast]; + int8_t input2_quantized[tflite::testing::flat_size_broadcast]; + int8_t golden_quantized[tflite::testing::flat_size_broadcast]; + int8_t output_data[tflite::testing::flat_size_broadcast]; + + tflite::testing::TestMulQuantized( + tflite::testing::dims_broadcast, tflite::testing::input1_broadcast, + input1_quantized, tflite::testing::dims_scalar_broadcast, + tflite::testing::input2_broadcast, input2_quantized, + tflite::testing::input_scale_broadcast, 0, + tflite::testing::dims_broadcast, tflite::testing::golden_broadcast, + golden_quantized, tflite::testing::output_scale_broadcast, 0, output_data, + kTfLiteActNone); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/neg.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/neg.cc new file mode 100644 index 00000000..5d846a14 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/neg.cc @@ -0,0 +1,68 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/neg.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace neg { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + switch (input->type) { + // TODO(wangtz): handle for kTfLiteInt8 + case kTfLiteFloat32: + reference_ops::Negate(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace neg + +TfLiteRegistration Register_NEG() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/neg::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/neg_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/neg_test.cc new file mode 100644 index 00000000..09f77a94 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/neg_test.cc @@ -0,0 +1,87 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestNegFloat(int *input_dims_data, const float *input_data, + const float *expected_output_data, int *output_dims_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_NEG(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[0], output_data[0]); + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(NegOpSingleFloat) +{ + int dims[] = { 1, 2 }; + const float input_data[] = { 8.5, 0.0 }; + const float golden[] = { -8.5, 0.0 }; + float output_data[2]; + + tflite::testing::TestNegFloat(dims, input_data, golden, dims, output_data); +} + +TF_LITE_MICRO_TEST(NegOpFloat) +{ + int dims[] = { 2, 2, 3 }; + const float input_data[] = { -2.0f, -1.0f, 0.f, 1.0f, 2.0f, 3.0f }; + const float golden[] = { 2.0f, 1.0f, -0.f, -1.0f, -2.0f, -3.0f }; + float output_data[6]; + + tflite::testing::TestNegFloat(dims, input_data, golden, dims, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pack.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pack.cc new file mode 100644 index 00000000..543f4631 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pack.cc @@ -0,0 +1,131 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace pack { +namespace { + +constexpr int kOutputTensor = 0; + +template +TfLiteStatus PackImpl(TfLiteContext *context, TfLiteNode *node, + TfLiteEvalTensor *output, int values_count, int axis) +{ + const TfLiteEvalTensor *input0 = + tflite::micro::GetEvalInput(context, node, 0); + + const int dimensions = output->dims->size; + const TfLiteIntArray *input_dims = input0->dims; + const TfLiteIntArray *output_dims = output->dims; + + if (axis < 0) { + axis += dimensions; + } + + int outer_size = 1; + for (int i = 0; i < axis; ++i) { + outer_size *= output_dims->data[i]; + } + int copy_size = 1; + for (int i = axis + 1; i < dimensions; ++i) { + copy_size *= output_dims->data[i]; + } + int input_size = 1; + for (int i = 0; i < input_dims->size; ++i) { + input_size *= input_dims->data[i]; + } + TFLITE_DCHECK_EQ(input_size, copy_size * outer_size); + + T *output_data = tflite::micro::GetTensorData(output); + + for (int i = 0; i < values_count; ++i) { + const TfLiteEvalTensor *t = tflite::micro::GetEvalInput(context, node, i); + const T *input_data = tflite::micro::GetTensorData(t); + for (int k = 0; k < outer_size; ++k) { + const T *input_ptr = input_data + copy_size * k; + int loc = k * values_count * copy_size + i * copy_size; + T *output_ptr = output_data + loc; + for (int j = 0; j < copy_size; ++j) + output_ptr[j] = input_ptr[j]; + } + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLitePackParams *data = + reinterpret_cast(node->builtin_data); + + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (output->type) { + case kTfLiteFloat32: { + return PackImpl(context, node, output, data->values_count, + data->axis); + } + case kTfLiteUInt8: { + return PackImpl(context, node, output, data->values_count, + data->axis); + } + case kTfLiteInt8: { + return PackImpl(context, node, output, data->values_count, + data->axis); + } + case kTfLiteInt32: { + return PackImpl(context, node, output, data->values_count, + data->axis); + } + case kTfLiteInt64: { + return PackImpl(context, node, output, data->values_count, + data->axis); + } + default: { + TF_LITE_KERNEL_LOG(context, "Type '%s' is not supported by pack.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } + + return kTfLiteOk; +} + +} // namespace +} // namespace pack + +TfLiteRegistration Register_PACK() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/pack::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pack_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pack_test.cc new file mode 100644 index 00000000..42541570 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pack_test.cc @@ -0,0 +1,287 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/debug_log.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { + +template +void ValidatePackGoldens(TfLiteTensor *tensors, int tensors_size, + TfLitePackParams params, TfLiteIntArray *inputs_array, + TfLiteIntArray *outputs_array, const T *golden, + int output_len, float tolerance, T *output) +{ + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output_len; ++i) { + output[i] = 23; + } + + const TfLiteRegistration registration = tflite::ops::micro::Register_PACK(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, reinterpret_cast(¶ms)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_len; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output[i], tolerance); + } +} + +void TestPackTwoInputsFloat(int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + int axis, int *output_dims_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 2; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims) }; + + TfLitePackParams builtin_data = { + .values_count = 2, + .axis = axis, + }; + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + ValidatePackGoldens(tensors, tensors_size, builtin_data, inputs_array, + outputs_array, expected_output_data, output_dims_count, + 1e-5f, output_data); +} + +void TestPackThreeInputsFloat(int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + int *input3_dims_data, const float *input3_data, + int axis, int *output_dims_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *input3_dims = IntArrayFromInts(input3_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 3; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(input3_data, input3_dims), + CreateTensor(output_data, output_dims) }; + + TfLitePackParams builtin_data = { + .values_count = 3, + .axis = axis, + }; + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + ValidatePackGoldens(tensors, tensors_size, builtin_data, inputs_array, + outputs_array, expected_output_data, output_dims_count, + 1e-5f, output_data); +} + +void TestPackTwoInputsQuantized( + int *input1_dims_data, const uint8_t *input1_data, int *input2_dims_data, + const uint8_t *input2_data, int axis, int *output_dims_data, + const uint8_t *expected_output_data, uint8_t *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 2; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { + // CreateQuantizedTensor needs scale/zero_point values as input, but these + // values don't matter as to the functionality of PACK, so just set as 1.0 + // and 128. + CreateQuantizedTensor(input1_data, input1_dims, 1.0, 128), + CreateQuantizedTensor(input2_data, input2_dims, 1.0, 128), + CreateQuantizedTensor(output_data, output_dims, 1.0, 128) + }; + + TfLitePackParams builtin_data = { + .values_count = 2, + .axis = axis, + }; + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + ValidatePackGoldens(tensors, tensors_size, builtin_data, inputs_array, + outputs_array, expected_output_data, output_dims_count, + 1e-5f, output_data); +} + +void TestPackTwoInputsQuantized32( + int *input1_dims_data, const int32_t *input1_data, int *input2_dims_data, + const int32_t *input2_data, int axis, int *output_dims_data, + const int32_t *expected_output_data, int32_t *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 2; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims) }; + + TfLitePackParams builtin_data = { + .values_count = 2, + .axis = axis, + }; + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + ValidatePackGoldens(tensors, tensors_size, builtin_data, inputs_array, + outputs_array, expected_output_data, output_dims_count, + 1e-5f, output_data); +} + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(PackFloatThreeInputs) +{ + int input_shape[] = { 1, 2 }; + int output_shape[] = { 2, 3, 2 }; + const float input1_values[] = { 1, 4 }; + const float input2_values[] = { 2, 5 }; + const float input3_values[] = { 3, 6 }; + const float golden[] = { 1, 4, 2, 5, 3, 6 }; + const int axis = 0; + constexpr int output_dims_count = 6; + float output_data[output_dims_count]; + + tflite::testing::TestPackThreeInputsFloat( + input_shape, input1_values, input_shape, input2_values, input_shape, + input3_values, axis, output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(PackFloatThreeInputsDifferentAxis) +{ + int input_shape[] = { 1, 2 }; + int output_shape[] = { 2, 2, 3 }; + const float input1_values[] = { 1, 4 }; + const float input2_values[] = { 2, 5 }; + const float input3_values[] = { 3, 6 }; + const float golden[] = { 1, 2, 3, 4, 5, 6 }; + const int axis = 1; + constexpr int output_dims_count = 6; + float output_data[output_dims_count]; + + tflite::testing::TestPackThreeInputsFloat( + input_shape, input1_values, input_shape, input2_values, input_shape, + input3_values, axis, output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(PackFloatThreeInputsNegativeAxis) +{ + int input_shape[] = { 1, 2 }; + int output_shape[] = { 2, 2, 3 }; + const float input1_values[] = { 1, 4 }; + const float input2_values[] = { 2, 5 }; + const float input3_values[] = { 3, 6 }; + const float golden[] = { 1, 2, 3, 4, 5, 6 }; + const int axis = -1; + constexpr int output_dims_count = 6; + float output_data[output_dims_count]; + + tflite::testing::TestPackThreeInputsFloat( + input_shape, input1_values, input_shape, input2_values, input_shape, + input3_values, axis, output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(PackFloatMultilDimensions) +{ + int input_shape[] = { 2, 2, 3 }; + int output_shape[] = { 3, 2, 2, 3 }; + const float input1_values[] = { 1, 2, 3, 4, 5, 6 }; + const float input2_values[] = { 7, 8, 9, 10, 11, 12 }; + const float golden[] = { 1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12 }; + const int axis = 1; + constexpr int output_dims_count = 12; + float output_data[output_dims_count]; + + tflite::testing::TestPackTwoInputsFloat(input_shape, input1_values, + input_shape, input2_values, axis, + output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(PackQuantizedMultilDimensions) +{ + int input_shape[] = { 2, 2, 3 }; + int output_shape[] = { 3, 2, 2, 3 }; + const uint8_t input1_values[] = { 1, 2, 3, 4, 5, 6 }; + const uint8_t input2_values[] = { 7, 8, 9, 10, 11, 12 }; + const uint8_t golden[] = { 1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12 }; + const int axis = 1; + constexpr int output_dims_count = 12; + uint8_t output_data[output_dims_count]; + + tflite::testing::TestPackTwoInputsQuantized( + input_shape, input1_values, input_shape, input2_values, axis, + output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(PackQuantized32MultilDimensions) +{ + int input_shape[] = { 2, 2, 3 }; + int output_shape[] = { 3, 2, 2, 3 }; + const int32_t input1_values[] = { 1, 2, 3, 4, 5, 6 }; + const int32_t input2_values[] = { 7, 8, 9, 10, 11, 12 }; + const int32_t golden[] = { 1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12 }; + const int axis = 1; + constexpr int output_dims_count = 12; + int32_t output_data[output_dims_count]; + + tflite::testing::TestPackTwoInputsQuantized32( + input_shape, input1_values, input_shape, input2_values, axis, + output_shape, golden, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pad.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pad.cc new file mode 100644 index 00000000..34a12ea1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pad.cc @@ -0,0 +1,253 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/pad.h" + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/portable_tensor.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace pad { +namespace { + +struct OpData { + PadParams params; + int32_t output_zero_point; +}; + +} // namespace + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + TF_LITE_ENSURE(context, NumInputs(node) == 2 || NumInputs(node) == 3); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, /*index=*/0); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *paddings = GetInput(context, node, /*index=*/1); + TF_LITE_ENSURE(context, paddings != nullptr); + const TfLiteTensor *constant_values = + NumInputs(node) == 3 ? GetInput(context, node, /*index=*/2) : nullptr; + TfLiteTensor *output = GetOutput(context, node, /*index=*/0); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_EQ(context, input->type, output->type); + + // Current implementations rely on the inputs being <= 4D. + TF_LITE_ENSURE(context, NumDimensions(input) <= + reference_ops::PadKernelMaxDimensionCount()); + + if (constant_values != nullptr) { + TF_LITE_ENSURE_EQ(context, input->type, constant_values->type); + // Ensure that constant_values is a scalar. + TF_LITE_ENSURE_EQ(context, NumElements(constant_values), 1); + } + + // There must be a pair of paddings for each output dimension. + TF_LITE_ENSURE_EQ(context, GetTensorShape(paddings).FlatSize(), + output->dims->size * 2); + + // On Micro, outputs must be properly sized by the converter. + // NOTE: This data is only available because the paddings buffer is stored in + // the flatbuffer: + TF_LITE_ENSURE(context, IsConstantTensor(paddings)); + const int32_t *paddings_data = GetTensorData(paddings); + for (int i = 0; i < output->dims->size; i++) { + int output_dim = output->dims->data[i]; + int expected_dim = + input->dims->data[i] + paddings_data[i * 2] + paddings_data[i * 2 + 1]; + TF_LITE_ENSURE_EQ(context, output_dim, expected_dim); + } + + // Calculate OpData: + data->params.resizing_category = ResizingCategory::kGenericResize; + const int paddings_total = GetTensorShape(paddings).FlatSize(); + if (paddings_total == 8 && (paddings_data[0] == 0 && paddings_data[1] == 0) && + (paddings_data[6] == 0 && paddings_data[7] == 0)) { + data->params.resizing_category = ResizingCategory::kImageStyle; + } + + const int num_input_dimensions = NumDimensions(input); + data->params.left_padding_count = num_input_dimensions; + data->params.right_padding_count = num_input_dimensions; + + for (int idx = num_input_dimensions - 1; idx >= 0; --idx) { + data->params.left_padding[idx] = paddings_data[idx * 2]; + data->params.right_padding[idx] = paddings_data[idx * 2 + 1]; + } + + if (input->type == kTfLiteInt8 || input->type == kTfLiteUInt8) { + if (constant_values == nullptr) { + // Quantized Pad requires that 0 is represented in the quantized + // range. + if (input->type == kTfLiteUInt8) { + TF_LITE_ENSURE(context, output->params.zero_point >= + std::numeric_limits::min()); + TF_LITE_ENSURE(context, output->params.zero_point <= + std::numeric_limits::max()); + } else { + TF_LITE_ENSURE(context, output->params.zero_point >= + std::numeric_limits::min()); + TF_LITE_ENSURE(context, output->params.zero_point <= + std::numeric_limits::max()); + } + } else { + // Quantized Pad requires that 'constant_values' is represented in the + // same quantized range as the input and output tensors. + TF_LITE_ENSURE_EQ(context, output->params.zero_point, + constant_values->params.zero_point); + TF_LITE_ENSURE_EQ(context, static_cast(output->params.scale), + static_cast(constant_values->params.scale)); + } + data->output_zero_point = output->params.zero_point; + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const OpData *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, /*index=*/0); + const TfLiteEvalTensor *constant_values = + NumInputs(node) == 3 ? tflite::micro::GetEvalInput(context, node, /*index=*/2) : nullptr; + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, /*index=*/0); + + switch (input->type) { + case kTfLiteFloat32: { + float pad_value = + constant_values == nullptr ? 0.f : *tflite::micro::GetTensorData(constant_values); + if (data->params.resizing_category == ResizingCategory::kImageStyle) { + reference_ops::PadImageStyle( + data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), &pad_value, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_ops::Pad(data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + &pad_value, tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + } break; + case kTfLiteUInt8: { + uint8_t pad_value; + if (constant_values == nullptr) { + pad_value = static_cast(data->output_zero_point); + } else { + pad_value = *tflite::micro::GetTensorData(constant_values); + } + if (data->params.resizing_category == ResizingCategory::kImageStyle) { + reference_ops::PadImageStyle( + data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), &pad_value, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_ops::Pad(data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + &pad_value, tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + } break; + case kTfLiteInt8: { + int8_t pad_value; + if (constant_values == nullptr) { + pad_value = static_cast(data->output_zero_point); + } else { + pad_value = *tflite::micro::GetTensorData(constant_values); + } + if (data->params.resizing_category == ResizingCategory::kImageStyle) { + reference_ops::PadImageStyle( + data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), &pad_value, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + reference_ops::Pad(data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + &pad_value, tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + } break; + case kTfLiteInt32: { + int32_t pad_value = + constant_values == nullptr ? 0 : *tflite::micro::GetTensorData(constant_values); + reference_ops::Pad(data->params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + &pad_value, tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } break; + default: + + TF_LITE_KERNEL_LOG(context, "Type %s not currently supported by Pad.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } +#undef TF_LITE_PAD + return kTfLiteOk; +} + +} // namespace pad + +TfLiteRegistration Register_PAD() +{ + return { /*init=*/pad::Init, + /*free=*/nullptr, + /*prepare=*/pad::Prepare, + /*invoke=*/pad::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +// Also register Pad as PadV2. +TfLiteRegistration Register_PADV2() +{ + return { /*init=*/pad::Init, + /*free=*/nullptr, + /*prepare=*/pad::Prepare, + /*invoke=*/pad::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pad_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pad_test.cc new file mode 100644 index 00000000..3d5afd79 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pad_test.cc @@ -0,0 +1,437 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +TfLiteStatus ValidatePadGoldens(TfLiteTensor *tensors, int tensors_size, + const T *golden, T *output_data, + int output_length) +{ + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_PAD(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + // Prepare should catch dimension mismatches. + TfLiteStatus prepare_status = runner.InitAndPrepare(); + if (prepare_status != kTfLiteOk) { + return prepare_status; + } + + // Eval should catch quantization mismatches. + TfLiteStatus invoke_status = runner.Invoke(); + if (invoke_status != kTfLiteOk) { + return invoke_status; + } + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden[i], output_data[i]); + } + return kTfLiteOk; +} + +template +TfLiteStatus ValidatePadV2Goldens(TfLiteTensor *tensors, int tensors_size, + const T *golden, T *output_data, + int output_length) +{ + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_PADV2(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + // Prepare should catch dimension mismatches. + TfLiteStatus prepare_status = runner.InitAndPrepare(); + if (prepare_status != kTfLiteOk) { + return prepare_status; + } + + // Eval should catch quantization mismatches. + TfLiteStatus invoke_status = runner.Invoke(); + if (invoke_status != kTfLiteOk) { + return invoke_status; + } + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden[i], output_data[i]); + } + return kTfLiteOk; +} + +// output data and golden must be shaped correctly +void TestPadFloat(int *input_dims_data, const float *input_data, + int *pad_dims_data, const int32_t *pad_data, + int *output_dims_data, const float *golden, + float *output_data, + TfLiteStatus expected_status = kTfLiteOk) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *pad_dims = IntArrayFromInts(pad_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input_data, input_dims), + CreateTensor(pad_data, pad_dims), + CreateTensor(output_data, output_dims) }; + + // Pad tensor must be constant. + tensors[1].allocation_type = kTfLiteMmapRo; + + TF_LITE_MICRO_EXPECT_EQ(expected_status, + ValidatePadGoldens(tensors, tensors_size, golden, + output_data, output_dims_count)); +} + +// output data and golden must be shaped correctly +void TestPadV2Float(int *input_dims_data, const float *input_data, + int *pad_dims_data, const int32_t *pad_data, + const float pad_value, int *output_dims_data, + const float *golden, float *output_data, + TfLiteStatus expected_status = kTfLiteOk) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *pad_dims = IntArrayFromInts(pad_dims_data); + int pad_value_dims_data[] = { 1, 1 }; // Only one padding value allowed. + TfLiteIntArray *pad_value_dims = IntArrayFromInts(pad_value_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), CreateTensor(pad_data, pad_dims), + CreateTensor(&pad_value, pad_value_dims), + CreateTensor(output_data, output_dims) + }; + + // Pad tensor must be constant. + tensors[1].allocation_type = kTfLiteMmapRo; + + TF_LITE_MICRO_EXPECT_EQ(expected_status, + ValidatePadV2Goldens(tensors, tensors_size, golden, + output_data, output_dims_count)); +} + +template +void TestPadQuantized(int *input_dims_data, const float *input_data, + T *input_quantized, float input_scale, + int input_zero_point, int *pad_dims_data, + const int32_t *pad_data, int *output_dims_data, + const float *golden, T *golden_quantized, + float output_scale, int output_zero_point, T *output_data, + TfLiteStatus expected_status = kTfLiteOk) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *pad_dims = IntArrayFromInts(pad_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateTensor(pad_data, pad_dims), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + // Pad tensor must be constant. + tensors[1].allocation_type = kTfLiteMmapRo; + + tflite::Quantize(golden, golden_quantized, output_dims_count, output_scale, + output_zero_point); + TF_LITE_MICRO_EXPECT_EQ( + expected_status, + ValidatePadGoldens(tensors, tensors_size, golden_quantized, output_data, + output_dims_count)); +} + +template +void TestPadV2Quantized( + int *input_dims_data, const float *input_data, T *input_quantized, + float input_scale, int input_zero_point, int *pad_dims_data, + const int32_t *pad_data, const float pad_value, const float pad_value_scale, + const int pad_value_zero_point, int *output_dims_data, const float *golden, + T *golden_quantized, float output_scale, int output_zero_point, + T *output_data, TfLiteStatus expected_status = kTfLiteOk) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *pad_dims = IntArrayFromInts(pad_dims_data); + int pad_value_dims_data[] = { 1, 1 }; // Only one padding value allowed. + TfLiteIntArray *pad_value_dims = IntArrayFromInts(pad_value_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + T pad_value_quantized; + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateTensor(pad_data, pad_dims), + CreateQuantizedTensor(&pad_value, &pad_value_quantized, pad_value_dims, + pad_value_scale, pad_value_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + // Pad tensor must be constant. + tensors[1].allocation_type = kTfLiteMmapRo; + tensors[2].params.scale = pad_value_scale; + tensors[3].params.scale = output_scale; + + tflite::Quantize(golden, golden_quantized, output_dims_count, output_scale, + output_zero_point); + TF_LITE_MICRO_EXPECT_EQ( + expected_status, + ValidatePadV2Goldens(tensors, tensors_size, golden_quantized, output_data, + output_dims_count)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(Test2DFloat) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, + 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + float output_data[24]; + + tflite::testing::TestPadFloat(input_dims, input_values, pad_dims, pad_values, + output_dims, golden, output_data); +} + +TF_LITE_MICRO_TEST(Test4DFloat) +{ + int input_dims[] = { 4, 1, 1, 1, 1 }; + const float input_values[] = { 42 }; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + int output_dims[] = { 4, 3, 3, 3, 3 }; + const int kOutputLen = 81; // 3 * 3 * 3 * 3 + float golden[kOutputLen]; + for (int i = 0; i < kOutputLen; i++) { + golden[i] = 0; + } + golden[40] = 42; + float output_data[kOutputLen]; + + tflite::testing::TestPadFloat(input_dims, input_values, pad_dims, pad_values, + output_dims, const_cast(golden), + output_data); +} + +TF_LITE_MICRO_TEST(Test2DFloatV2) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + const float pad_value = 42; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 42, 42, 42, 42, 42, 42, 42, 42, 42, 1, 2, 42, + 42, 3, 4, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; + float output_data[24]; + + tflite::testing::TestPadV2Float(input_dims, input_values, pad_dims, + pad_values, pad_value, output_dims, golden, + output_data); +} + +TF_LITE_MICRO_TEST(Test2DUInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + const float input_scale = 1.0f; + const int input_zero_point = 127; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, + 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const float output_scale = 1.0f; + const int output_zero_point = 127; + uint8_t output_data[24]; + uint8_t input_quantized[4]; + uint8_t golden_quantized[24]; + + tflite::testing::TestPadQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + pad_dims, pad_values, output_dims, golden, golden_quantized, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(Test2DUInt8V2) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + const float input_scale = 1.0f; + const int input_zero_point = 127; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + const float pad_value = 42; + const float pad_value_scale = 1.0; + const float pad_value_zero_point = 127; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 42, 42, 42, 42, 42, 42, 42, 42, 42, 1, 2, 42, + 42, 3, 4, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; + const float output_scale = 1.0f; + const int output_zero_point = 127; + uint8_t output_data[24]; + uint8_t input_quantized[4]; + uint8_t golden_quantized[24]; + + tflite::testing::TestPadV2Quantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + pad_dims, pad_values, pad_value, pad_value_scale, pad_value_zero_point, + output_dims, golden, golden_quantized, output_scale, output_zero_point, + output_data); +} + +TF_LITE_MICRO_TEST(Test2DInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + const float input_scale = 1.0f; + const int input_zero_point = 0; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, + 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const float output_scale = 1.0f; + const int output_zero_point = 0; + int8_t output_data[24]; + int8_t input_quantized[4]; + int8_t golden_quantized[24]; + + tflite::testing::TestPadQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + pad_dims, pad_values, output_dims, golden, golden_quantized, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TEST(Test2DInt8V2) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + const float input_scale = 1.0f; + const int input_zero_point = 0; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + const float pad_value = 42; + const float pad_value_scale = 1.0; + const float pad_value_zero_point = 0; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 42, 42, 42, 42, 42, 42, 42, 42, 42, 1, 2, 42, + 42, 3, 4, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; + const float output_scale = 1.0f; + const int output_zero_point = 0; + int8_t output_data[24]; + int8_t input_quantized[4]; + int8_t golden_quantized[24]; + + tflite::testing::TestPadV2Quantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + pad_dims, pad_values, pad_value, pad_value_scale, pad_value_zero_point, + output_dims, golden, golden_quantized, output_scale, output_zero_point, + output_data); +} + +TF_LITE_MICRO_TEST(Test2DInt8V2ExpectFailurePadValueQuantizationMismatch) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + const float input_scale = 1.0f; + const int input_zero_point = 0; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + const float pad_value = 42; + // Causes failure since this is in a different quantization space than input. + const float pad_value_scale = .5; + const float pad_value_zero_point = 0; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + const float output_scale = 1.0f; + const int output_zero_point = 0; + int8_t output_data[24] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + int8_t input_quantized[4]; + int8_t golden_quantized[24]; + + tflite::testing::TestPadV2Quantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + pad_dims, pad_values, pad_value, pad_value_scale, pad_value_zero_point, + output_dims, golden, golden_quantized, output_scale, output_zero_point, + output_data, kTfLiteError); +} + +TF_LITE_MICRO_TEST(Test2DInt8ExpectFailureQuantizationRangeExcludesZero) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_values[] = { 1, 2, 3, 4 }; + const float input_scale = 1.0f; + const int input_zero_point = 0; + int pad_dims[] = { 2, 4, 2 }; + const int32_t pad_values[] = { 1, 1, 0, 0, 1, 1, 0, 0 }; + int output_dims[] = { 4, 3, 2, 4, 1 }; + const float golden[] = { 42, 42, 42, 42, 42, 42, 42, 42, 42, 1, 2, 42, + 42, 3, 4, 42, 42, 42, 42, 42, 42, 42, 42, 42 }; + // Causes failure since this quantization zero point excludes zero. + const float output_scale = 1.0f; + const int output_zero_point = 129; + int8_t output_data[24]; + int8_t input_quantized[4]; + int8_t golden_quantized[24]; + + tflite::testing::TestPadQuantized( + input_dims, input_values, input_quantized, input_scale, input_zero_point, + pad_dims, pad_values, output_dims, golden, golden_quantized, output_scale, + output_zero_point, output_data, kTfLiteError); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.cc new file mode 100644 index 00000000..219a0a54 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.cc @@ -0,0 +1,117 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/pooling.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/pooling.h" + +namespace tflite { + +namespace { + +TfLiteStatus AverageEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + auto *params = reinterpret_cast(node->builtin_data); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpDataPooling *data = + static_cast(node->user_data); + + const TfLiteEvalTensor *input = + micro::GetEvalInput(context, node, kPoolingInputTensor); + TfLiteEvalTensor *output = + micro::GetEvalOutput(context, node, kPoolingOutputTensor); + + // Inputs and outputs share the same type, guaranteed by the converter. + switch (input->type) { + case kTfLiteFloat32: + AveragePoolingEvalFloat(context, node, params, data, input, output); + break; + case kTfLiteInt8: + AveragePoolingEvalQuantized(context, node, params, data, input, output); + break; + default: + TF_LITE_KERNEL_LOG(context, "Input type %s is not currently supported", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus MaxEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + auto *params = reinterpret_cast(node->builtin_data); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpDataPooling *data = + static_cast(node->user_data); + + const TfLiteEvalTensor *input = + micro::GetEvalInput(context, node, kPoolingInputTensor); + TfLiteEvalTensor *output = + micro::GetEvalOutput(context, node, kPoolingOutputTensor); + + switch (input->type) { + case kTfLiteFloat32: + MaxPoolingEvalFloat(context, node, params, data, input, output); + break; + case kTfLiteInt8: + MaxPoolingEvalQuantized(context, node, params, data, input, output); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s not currently supported.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpDataPooling)); +} + +} // namespace + +TfLiteRegistration Register_AVERAGE_POOL_2D() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/PoolingPrepare, + /*invoke=*/AverageEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_MAX_POOL_2D() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/PoolingPrepare, + /*invoke=*/MaxEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.h new file mode 100644 index 00000000..f106030e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling.h @@ -0,0 +1,70 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_POOLING_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_POOLING_H_ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" + +namespace tflite { +extern const int kPoolingInputTensor; +extern const int kPoolingOutputTensor; + +struct OpDataPooling { + TfLitePaddingValues padding; + int32_t activation_min; + int32_t activation_max; + float activation_min_f32; + float activation_max_f32; +}; + +TfLiteStatus CalculateOpDataPooling(const TfLiteContext *context, + const TfLitePoolParams *params, + const TfLiteTensor *input, + const TfLiteTensor *output, + OpDataPooling *data); + +TfLiteStatus PoolingPrepare(TfLiteContext *context, TfLiteNode *node); + +void AveragePoolingEvalFloat(const TfLiteContext *context, + const TfLiteNode *node, + const TfLitePoolParams *params, + const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output); + +void AveragePoolingEvalQuantized(TfLiteContext *context, const TfLiteNode *node, + const TfLitePoolParams *params, + const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output); + +void MaxPoolingEvalFloat(TfLiteContext *context, TfLiteNode *node, + TfLitePoolParams *params, const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output); + +void MaxPoolingEvalQuantized(TfLiteContext *context, TfLiteNode *node, + TfLitePoolParams *params, + const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_POOLING_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_common.cc new file mode 100644 index 00000000..30f5dd83 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_common.cc @@ -0,0 +1,169 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h" +#include "tensorflow/lite/kernels/internal/reference/pooling.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/pooling.h" + +namespace tflite { + +const int kPoolingInputTensor = 0; +const int kPoolingOutputTensor = 0; + +TfLiteStatus CalculateOpDataPooling(const TfLiteContext *context, + const TfLitePoolParams *params, + const TfLiteTensor *input, + const TfLiteTensor *output, + OpDataPooling *data) +{ + // input: batch, height, width, channel + int height = SizeOfDimension(input, 1); + int width = SizeOfDimension(input, 2); + + int out_height, out_width; + + data->padding = ComputePaddingHeightWidth( + params->stride_height, params->stride_width, + /*dilation_rate_height=*/1, + /*dilation_rate_width=*/1, height, width, params->filter_height, + params->filter_width, params->padding, &out_height, &out_width); + + return kTfLiteOk; +} + +TfLiteStatus PoolingPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + auto *params = reinterpret_cast(node->builtin_data); + + TFLITE_DCHECK(node->user_data != nullptr); + OpDataPooling *data = static_cast(node->user_data); + + const TfLiteTensor *input = GetInput(context, node, kPoolingInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kPoolingOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_STATUS( + CalculateOpDataPooling(context, params, input, output, data)); + + if (input->type == kTfLiteFloat32) { + CalculateActivationRange(params->activation, &data->activation_min_f32, + &data->activation_max_f32); + } else if (input->type == kTfLiteInt8) { + CalculateActivationRangeQuantized(context, params->activation, output, + &data->activation_min, + &data->activation_max); + } + + return kTfLiteOk; +} + +void AveragePoolingEvalFloat(const TfLiteContext *context, + const TfLiteNode *node, + const TfLitePoolParams *params, + const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output) +{ + PoolParams op_params; + op_params.stride_height = params->stride_height; + op_params.stride_width = params->stride_width; + op_params.filter_height = params->filter_height; + op_params.filter_width = params->filter_width; + op_params.padding_values.height = data->padding.height; + op_params.padding_values.width = data->padding.width; + op_params.float_activation_min = data->activation_min_f32; + op_params.float_activation_max = data->activation_max_f32; + reference_ops::AveragePool(op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +void AveragePoolingEvalQuantized(TfLiteContext *context, const TfLiteNode *node, + const TfLitePoolParams *params, + const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output) +{ + TFLITE_DCHECK(input->type == kTfLiteInt8); + + PoolParams op_params; + op_params.stride_height = params->stride_height; + op_params.stride_width = params->stride_width; + op_params.filter_height = params->filter_height; + op_params.filter_width = params->filter_width; + op_params.padding_values.height = data->padding.height; + op_params.padding_values.width = data->padding.width; + op_params.quantized_activation_min = data->activation_min; + op_params.quantized_activation_max = data->activation_max; + + reference_integer_ops::AveragePool( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +void MaxPoolingEvalFloat(TfLiteContext *context, TfLiteNode *node, + TfLitePoolParams *params, const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output) +{ + tflite::PoolParams op_params; + op_params.stride_height = params->stride_height; + op_params.stride_width = params->stride_width; + op_params.filter_height = params->filter_height; + op_params.filter_width = params->filter_width; + op_params.padding_values.height = data->padding.height; + op_params.padding_values.width = data->padding.width; + op_params.float_activation_min = data->activation_min_f32; + op_params.float_activation_max = data->activation_max_f32; + reference_ops::MaxPool(op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +void MaxPoolingEvalQuantized(TfLiteContext *context, TfLiteNode *node, + TfLitePoolParams *params, + const OpDataPooling *data, + const TfLiteEvalTensor *input, + TfLiteEvalTensor *output) +{ + tflite::PoolParams op_params; + op_params.stride_height = params->stride_height; + op_params.stride_width = params->stride_width; + op_params.filter_height = params->filter_height; + op_params.filter_width = params->filter_width; + op_params.padding_values.height = data->padding.height; + op_params.padding_values.width = data->padding.width; + op_params.quantized_activation_min = data->activation_min; + op_params.quantized_activation_max = data->activation_max; + + reference_integer_ops::MaxPool(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_test.cc new file mode 100644 index 00000000..6bf9ccd1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/pooling_test.cc @@ -0,0 +1,526 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void ValidatePoolingGoldens(TfLiteTensor *tensors, int tensors_size, + const TfLiteRegistration registration, + const int filter_height, const int filter_width, + const int stride_height, const int stride_width, + const T *golden, const int output_length, + TfLitePadding padding, + TfLiteFusedActivation activation, T *output_data) +{ + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + TfLitePoolParams builtin_data = { padding, + stride_width, + stride_height, + filter_width, + filter_height, + activation, + {} }; + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], 1e-5f); + } +} + +void TestAveragePoolFloat(int *input_dims_data, const float *input_data, + const int filter_height, const int filter_width, + const int stride_height, const int stride_width, + const float *expected_output_data, + int *output_dims_data, TfLitePadding padding, + TfLiteFusedActivation activation, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + const TfLiteRegistration registration = Register_AVERAGE_POOL_2D(); + + ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height, + filter_width, stride_height, stride_width, + expected_output_data, output_dims_count, padding, + activation, output_data); +} + +template +void TestAveragePoolQuantized( + int *input_dims_data, const T *input_data, const float input_scale, + const int input_zero_point, const int filter_height, const int filter_width, + const int stride_height, const int stride_width, + const T *expected_output_data, int *output_dims_data, + const float output_scale, const int output_zero_point, + TfLitePadding padding, TfLiteFusedActivation activation, T *output_data) +{ + static_assert(sizeof(T) == 1, "Only int8_t/uint8_t data types allowed."); + + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_dims, input_scale, + input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + const TfLiteRegistration registration = Register_AVERAGE_POOL_2D(); + ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height, + filter_width, stride_height, stride_width, + expected_output_data, output_dims_count, padding, + activation, output_data); +} + +void TestMaxPoolFloat(int *input_dims_data, const float *input_data, + int filter_width, int filter_height, int stride_width, + int stride_height, const float *expected_output_data, + int *output_dims_data, TfLitePadding padding, + TfLiteFusedActivation activation, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + const TfLiteRegistration registration = Register_MAX_POOL_2D(); + ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height, + filter_width, stride_height, stride_width, + expected_output_data, output_dims_count, padding, + activation, output_data); +} + +template +void TestMaxPoolQuantized(int *input_dims_data, const T *input_data, + const float input_scale, const int input_zero_point, + const int filter_height, const int filter_width, + const int stride_height, const int stride_width, + const T *expected_output_data, int *output_dims_data, + const float output_scale, const int output_zero_point, + TfLitePadding padding, + TfLiteFusedActivation activation, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_dims, input_scale, + input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + const TfLiteRegistration registration = Register_MAX_POOL_2D(); + ValidatePoolingGoldens(tensors, tensors_size, registration, filter_height, + filter_width, stride_height, stride_width, + expected_output_data, output_dims_count, padding, + activation, output_data); +} + +} // namespace + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleAveragePoolTestFloat) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values[] = { 0, 6, 2, 4, 3, 2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const float golden[] = { 2.75, 5.75 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + float output_data[2]; + tflite::testing::TestAveragePoolFloat( + input_shape, input_values, filter_height, filter_width, stride_height, + stride_width, golden, output_shape, kTfLitePaddingValid, kTfLiteActNone, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2ActNone) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values[] = { 0, -24, 8, 16, 12, 8, -40, 28 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const int8_t golden[] = { -1, 3 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = .25; + const int input_zero_point = 0; + const float output_scale = .25; + const int output_zero_point = 0; + tflite::testing::TestAveragePoolQuantized( + input_shape, input_values, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride1Stride2Relu) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values[] = { 0, -24, 8, 16, 12, 8, -40, 28 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 1; + const int stride_height = 2; + const int8_t golden[] = { 0, 0, 3 }; + int output_shape[] = { 4, 1, 1, 3, 1 }; + int8_t output_data[3]; + + const float input_scale = .25; + const int input_zero_point = 0; + const float output_scale = .25; + const int output_zero_point = 0; + tflite::testing::TestAveragePoolQuantized( + input_shape, input_values, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu, + output_data); +} + +TF_LITE_MICRO_TEST( + SimpleAveragePoolTestInt8PaddingValidStride2Stride1ReluN1To1) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values[] = { 0, -24, 8, 16, 12, 8, -40, 28 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 1; + const int8_t golden[] = { -1, 3 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = .25; + const int input_zero_point = 0; + const float output_scale = .25; + const int output_zero_point = 0; + tflite::testing::TestAveragePoolQuantized( + input_shape, input_values, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActReluN1To1, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingValidStride2Relu6) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values[] = { 12, -24, 32, 16, 12, 8, 40, 28 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const int8_t golden[] = { 2, 24 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = .25; + const int input_zero_point = 0; + const float output_scale = .25; + const int output_zero_point = 0; + tflite::testing::TestAveragePoolQuantized( + input_shape, input_values, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu6, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleAveragePoolTestInt8PaddingSameStride1ActNone) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values[] = { 12, -24, 32, 16, 12, 8, 40, 28 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 1; + const int stride_height = 1; + const int8_t golden[] = { 2, 14, 29, 22, 10, 24, 34, 28 }; + int output_shape[] = { 4, 1, 2, 4, 1 }; + int8_t output_data[8]; + + const float input_scale = .25; + const int input_zero_point = 0; + const float output_scale = .25; + const int output_zero_point = 0; + tflite::testing::TestAveragePoolQuantized( + input_shape, input_values, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone, + output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloat) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values[] = { 0, 6, 2, 4, 3, 2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const float golden[] = { 6, 10 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + float output_data[2]; + tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height, + filter_width, stride_height, stride_width, + golden, output_shape, kTfLitePaddingValid, + kTfLiteActNone, output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatRelu) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values[] = { -1, -6, 2, 4, -3, -2, 10.5, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const float golden[] = { 0, 10.5 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + float output_data[2]; + tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height, + filter_width, stride_height, stride_width, + golden, output_shape, kTfLitePaddingValid, + kTfLiteActRelu, output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatReluN1To1) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values1[] = { -2.75, -6, 0.2, 0.4, -3, -2, -0.3, 0.7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const float golden1[] = { -1.0, 0.7 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + float output_data[2]; + tflite::testing::TestMaxPoolFloat(input_shape, input_values1, filter_height, + filter_width, stride_height, stride_width, + golden1, output_shape, kTfLitePaddingValid, + kTfLiteActReluN1To1, output_data); + + const float input_values2[] = { -2.75, -6, -2, -4, -3, -2, 10, -7 }; + const float golden2[] = { -1.0, 1.0 }; + tflite::testing::TestMaxPoolFloat(input_shape, input_values2, filter_height, + filter_width, stride_height, stride_width, + golden2, output_shape, kTfLitePaddingValid, + kTfLiteActReluN1To1, output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestFloatRelu6) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values1[] = { -1.5, -6, 12, 4, -3, -2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const float golden1[] = { 0, 6 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + float output_data[2]; + tflite::testing::TestMaxPoolFloat(input_shape, input_values1, filter_height, + filter_width, stride_height, stride_width, + golden1, output_shape, kTfLitePaddingValid, + kTfLiteActRelu6, output_data); + + const float input_values2[] = { 0, 4.5, 12, 4, 3, 2, 10, 7 }; + const float golden2[] = { 4.5, 6 }; + tflite::testing::TestMaxPoolFloat(input_shape, input_values2, filter_height, + filter_width, stride_height, stride_width, + golden2, output_shape, kTfLitePaddingValid, + kTfLiteActRelu6, output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestPaddingSameStride1) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values[] = { 0, 6, 2, 4, 3, 2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 1; + const int stride_height = 1; + const float golden[] = { 6, 10, 10, 7, 3, 10, 10, 7 }; + int output_shape[] = { 4, 1, 2, 4, 1 }; + float output_data[8]; + tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height, + filter_width, stride_height, stride_width, + golden, output_shape, kTfLitePaddingSame, + kTfLiteActNone, output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestPaddingValidStride1) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const float input_values[] = { 0, 6, 2, 4, 3, 2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 1; + const int stride_height = 1; + const float golden[] = { 6, 10, 10 }; + int output_shape[] = { 4, 1, 1, 3, 1 }; + float output_data[8]; + tflite::testing::TestMaxPoolFloat(input_shape, input_values, filter_height, + filter_width, stride_height, stride_width, + golden, output_shape, kTfLitePaddingValid, + kTfLiteActNone, output_data); +} + +TF_LITE_MICRO_TEST(SimpleMaxPoolTestInt8ActNone) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values1[] = { 0, 6, 2, 4, 3, 2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const int8_t golden1[] = { 6, 10 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = 1.0; + const int input_zero_point = 0; + const float output_scale = 1.0; + const int output_zero_point = 0; + tflite::testing::TestMaxPoolQuantized( + input_shape, input_values1, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden1, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActNone, + output_data); +} + +TF_LITE_MICRO_TEST(MaxPoolTestInt8ActRelu) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values1[] = { -3, -12, 4, 8, -6, -4, 20, 14 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const int8_t golden1[] = { 0, 20 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = 0.5; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 0; + tflite::testing::TestMaxPoolQuantized( + input_shape, input_values1, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden1, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu, + output_data); +} + +TF_LITE_MICRO_TEST(MaxPoolTestInt8ActReluN1To1) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values1[] = { -2, -6, -2, -4, -3, -2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const int8_t golden1[] = { -1, 1 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = 1.0; + const int input_zero_point = 0; + const float output_scale = 1.0; + const int output_zero_point = 0; + tflite::testing::TestMaxPoolQuantized( + input_shape, input_values1, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden1, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActReluN1To1, + output_data); +} + +TF_LITE_MICRO_TEST(MaxPoolTestInt8ActRelu6) +{ + int input_shape[] = { 4, 1, 2, 4, 1 }; + const int8_t input_values1[] = { 0, -6, 12, 4, -3, -2, 10, 7 }; + const int filter_width = 2; + const int filter_height = 2; + const int stride_width = 2; + const int stride_height = 2; + const int8_t golden1[] = { 0, 6 }; + int output_shape[] = { 4, 1, 1, 2, 1 }; + int8_t output_data[2]; + + const float input_scale = 1.0; + const int input_zero_point = 0; + const float output_scale = 1.0; + const int output_zero_point = 0; + tflite::testing::TestMaxPoolQuantized( + input_shape, input_values1, input_scale, input_zero_point, filter_height, + filter_width, stride_height, stride_width, golden1, output_shape, + output_scale, output_zero_point, kTfLitePaddingValid, kTfLiteActRelu6, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu.cc new file mode 100644 index 00000000..50df2e56 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu.cc @@ -0,0 +1,175 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/prelu.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace activations { +namespace { + +TfLiteStatus CalculatePreluParams(const TfLiteTensor *input, + const TfLiteTensor *alpha, + TfLiteTensor *output, PreluParams *params) +{ + if (output->type == kTfLiteInt8 || output->type == kTfLiteUInt8 || + output->type == kTfLiteInt16) { + double real_multiplier_1 = static_cast(input->params.scale) / + static_cast(output->params.scale); + double real_multiplier_2 = static_cast(input->params.scale) * + static_cast(alpha->params.scale) / + static_cast(output->params.scale); + QuantizeMultiplier(real_multiplier_1, ¶ms->output_multiplier_1, + ¶ms->output_shift_1); + QuantizeMultiplier(real_multiplier_2, ¶ms->output_multiplier_2, + ¶ms->output_shift_2); + + params->input_offset = -input->params.zero_point; + params->alpha_offset = -alpha->params.zero_point; + params->output_offset = output->params.zero_point; + } + + return kTfLiteOk; +} + +} // namespace + +inline void BroadcastPrelu4DSlowFloat( + const RuntimeShape &unextended_input1_shape, const float *input1_data, + const RuntimeShape &unextended_input2_shape, const float *input2_data, + const RuntimeShape &unextended_output_shape, float *output_data) +{ + TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); + TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); + const RuntimeShape output_shape = + RuntimeShape::ExtendedShape(4, unextended_output_shape); + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, + unextended_input2_shape, &desc1, &desc2); + + for (int b = 0; b < output_shape.Dims(0); ++b) { + for (int y = 0; y < output_shape.Dims(1); ++y) { + for (int x = 0; x < output_shape.Dims(2); ++x) { + for (int c = 0; c < output_shape.Dims(3); ++c) { + auto out_idx = Offset(output_shape, b, y, x, c); + auto in1_idx = SubscriptToIndex(desc1, b, y, x, c); + auto in2_idx = SubscriptToIndex(desc2, b, y, x, c); + auto in1_val = input1_data[in1_idx]; + auto in2_val = input2_data[in2_idx]; + output_data[out_idx] = in1_val >= 0.0f ? in1_val : in1_val * in2_val; + } + } + } + } +} + +void *PreluInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(PreluParams)); +} + +TfLiteStatus PreluPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + PreluParams *params = static_cast(node->user_data); + + const TfLiteTensor *input = GetInput(context, node, 0); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *alpha = GetInput(context, node, 1); + TF_LITE_ENSURE(context, alpha != nullptr); + TfLiteTensor *output = GetOutput(context, node, 0); + TF_LITE_ENSURE(context, output != nullptr); + + return CalculatePreluParams(input, alpha, output, params); +} + +TfLiteStatus PreluEval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const PreluParams ¶ms = + *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + const TfLiteEvalTensor *alpha = tflite::micro::GetEvalInput(context, node, 1); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + + switch (input->type) { + case kTfLiteFloat32: { + BroadcastPrelu4DSlowFloat(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(alpha), + tflite::micro::GetTensorData(alpha), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + case kTfLiteUInt8: { + reference_ops::BroadcastPrelu4DSlow( + params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(alpha), + tflite::micro::GetTensorData(alpha), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + case kTfLiteInt8: { + reference_ops::BroadcastPrelu4DSlow( + params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(alpha), + tflite::micro::GetTensorData(alpha), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + default: + TF_LITE_KERNEL_LOG( + context, "Only float32 and uint8_t are supported currently, got %d.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } +} + +} // namespace activations + +TfLiteRegistration Register_PRELU() +{ + return { /*init=*/activations::PreluInit, + /*free=*/nullptr, + /*prepare=*/activations::PreluPrepare, + /*invoke=*/activations::PreluEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu_test.cc new file mode 100644 index 00000000..80c48f68 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/prelu_test.cc @@ -0,0 +1,200 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void ValidatePreluGoldens(TfLiteTensor *tensors, int tensors_size, + const T *golden, const int output_length, + T *output_data) +{ + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_PRELU(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output_data[i], 1e-5f); + } +} + +void TestPreluFloat(int *input_dims_data, const float *input_data, + int *alpha_dims_data, const float *alpha_data, + const float *expected_output_data, int *output_dims_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *alpha_dims = IntArrayFromInts(alpha_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(alpha_data, alpha_dims), + CreateTensor(output_data, output_dims), + }; + + ValidatePreluGoldens(tensors, tensors_size, expected_output_data, + output_dims_count, output_data); +} + +// Template argument T can be either uint8_t or int8_t depending on which type +// of quantization required to be tested. +template +void TestPreluQuantized(int *input_dims_data, const float *input_data, + T *input_quantized, const float input_scale, + const int input_zero_point, int *alpha_dims_data, + const float *alpha_data, T *alpha_quantized, + const float alpha_scale, const int alpha_zero_point, + const float *golden, T *golden_quantized, + const float output_scale, const int output_zero_point, + int *output_dims_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *alpha_dims = IntArrayFromInts(alpha_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(alpha_data, alpha_quantized, alpha_dims, + alpha_scale, alpha_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + Quantize(golden, golden_quantized, output_dims_count, output_scale, + output_zero_point); + + ValidatePreluGoldens(tensors, tensors_size, golden_quantized, + output_dims_count, output_data); +} +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatPreluActivationsOpTest) +{ + int input_shape[] = { 3, 2, 2, 3 }; + const float input_values[] = { + 0.0f, 0.0f, 0.0f, // Row 1, Column 1 + 1.0f, 1.0f, 1.0f, // Row 1, Column 2 + -1.0f, -1.0f, -1.0f, // Row 2, Column 1 + -2.0f, -2.0f, -2.0f, // Row 1, Column 2 + }; + int alpha_shape[] = { 3, 1, 1, 3 }; + const float alpha_values[] = { 0.0f, 1.0f, 2.0f }; + int output_shape[] = { 3, 2, 2, 3 }; + const float golden[] = { + 0.0f, 0.0f, 0.0f, // Row 1, Column 1 + 1.0f, 1.0f, 1.0f, // Row 1, Column 2 + 0.0f, -1.0f, -2.0f, // Row 2, Column 1 + 0.0f, -2.0f, -4.0f, // Row 1, Column 2 + }; + const int output_dims_count = 12; + float output_data[output_dims_count]; + tflite::testing::TestPreluFloat(input_shape, input_values, alpha_shape, + alpha_values, golden, output_shape, + output_data); +} + +TF_LITE_MICRO_TEST(QuantizedUint8PreluActivationsOpTest) +{ + int input_shape[] = { 3, 2, 2, 3 }; + const float input_values[] = { + 0.0f, 0.0f, 0.0f, // Row 1, Column 1 + 0.5f, 0.5f, 0.5f, // Row 1, Column 2 + -1.0f, -1.0f, -1.0f, // Row 2, Column 1 + -0.25f, -0.25f, -0.25f, // Row 1, Column 2 + }; + int alpha_shape[] = { 3, 1, 1, 3 }; + const float alpha_values[] = { 0.0f, 0.5f, -0.5f }; + int output_shape[] = { 3, 2, 2, 3 }; + const float golden[] = { + 0.0f, 0.0f, 0.0f, // Row 1, Column 1 + 0.5f, 0.5f, 0.5f, // Row 1, Column 2 + 0.0f, -0.5f, 0.5f, // Row 2, Column 1 + 0.0f, -0.125f, 0.125f, // Row 1, Column 2 + }; + + const int dims_count = 12; + + uint8_t input_quantized[dims_count]; + uint8_t alpha_quantized[3]; + uint8_t golden_quantized[dims_count]; + float scale = 0.125; + int zero_point = 127; + uint8_t output_data[dims_count]; + + tflite::testing::TestPreluQuantized( + input_shape, input_values, input_quantized, scale, zero_point, + alpha_shape, alpha_values, alpha_quantized, scale, zero_point, golden, + golden_quantized, scale, zero_point, output_shape, output_data); +} + +TF_LITE_MICRO_TEST(QuantizedInt8PreluActivationsOpTest) +{ + int input_shape[] = { 3, 2, 2, 3 }; + const float input_values[] = { + 0.0f, 0.0f, 0.0f, // Row 1, Column 1 + 0.5f, 0.5f, 0.5f, // Row 1, Column 2 + -1.0f, -1.0f, -1.0f, // Row 2, Column 1 + -0.25f, -0.25f, -0.25f, // Row 1, Column 2 + }; + int alpha_shape[] = { 3, 1, 1, 3 }; + const float alpha_values[] = { 0.0f, 0.5f, -0.5f }; + int output_shape[] = { 3, 2, 2, 3 }; + const float golden[] = { + 0.0f, 0.0f, 0.0f, // Row 1, Column 1 + 0.5f, 0.5f, 0.5f, // Row 1, Column 2 + 0.0f, -0.5f, 0.5f, // Row 2, Column 1 + 0.0f, -0.125f, 0.125f, // Row 1, Column 2 + }; + const int dims_count = 12; + int8_t input_quantized[dims_count]; + int8_t alpha_quantized[3]; + int8_t golden_quantized[dims_count]; + float scale = 2.0 / 255.0; + int zero_point = 0; + int8_t output_data[dims_count]; + tflite::testing::TestPreluQuantized( + input_shape, input_values, input_quantized, scale, zero_point, + alpha_shape, alpha_values, alpha_quantized, scale, zero_point, golden, + golden_quantized, scale, zero_point, output_shape, output_data); +} +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantization_util_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantization_util_test.cc new file mode 100644 index 00000000..53bfa888 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantization_util_test.cc @@ -0,0 +1,479 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/quantization_util.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace { + +template +void RunSafeCastTests() +{ + const IntOut imax = std::numeric_limits::max(); + TF_LITE_MICRO_EXPECT_GT(imax, 0); + const IntOut imin = std::numeric_limits::min(); + const bool s = std::numeric_limits::is_signed; + if (s) { + TF_LITE_MICRO_EXPECT_LT(static_cast(imin), 0); + } else { + TF_LITE_MICRO_EXPECT_EQ(static_cast(0), imin); + } + + // Some basic tests. + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(0.0)), + static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-0.0)), + static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(0.99)), + static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(1.0)), + static_cast(1)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(1.01)), + static_cast(1)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(1.99)), + static_cast(1)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(2.0)), + static_cast(2)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(2.01)), + static_cast(2)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-0.99)), + static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-1.0)), + s ? static_cast(-1) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-1.01)), + s ? static_cast(-1) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-1.99)), + s ? static_cast(-1) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-2.0)), + s ? static_cast(-2) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(-2.01)), + s ? static_cast(-2) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(117.9)), + static_cast(117)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(118.0)), + static_cast(118)); + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(118.1)), + static_cast(118)); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(-117.9)), + s ? static_cast(-117) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(-118.0)), + s ? static_cast(-118) : static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(-118.1)), + s ? static_cast(-118) : static_cast(0)); + + // Some edge cases. + TF_LITE_MICRO_EXPECT_EQ(SafeCast(std::numeric_limits::max()), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(std::numeric_limits::lowest()), imin); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(std::numeric_limits::infinity()), imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(-std::numeric_limits::infinity()), imin); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(std::numeric_limits::quiet_NaN()), + static_cast(0)); + + // Some larger numbers. + if (sizeof(IntOut) >= static_cast(4) && + sizeof(FloatIn) > static_cast(4)) { + TF_LITE_MICRO_EXPECT_EQ(SafeCast(static_cast(0x76543210)), + static_cast(0x76543210)); + } + + if (sizeof(FloatIn) > sizeof(IntOut)) { + // Check values near imax. + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) + + static_cast(0.1))), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) + + static_cast(0.99))), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) + + static_cast(1.0))), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) + + static_cast(1.99))), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) + + static_cast(2.0))), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(0.1))), + imax - 1); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(0.99))), + imax - 1); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(1.0))), + imax - 1); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(1.01))), + imax - 2); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(1.99))), + imax - 2); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(2.0))), + imax - 2); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) - + static_cast(2.01))), + imax - 3); + } + + // Check values considerably larger in magnitude than imin and imax + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) * 2)), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) * 20)), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imax) * 100)), + imax); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imin) * 2)), + imin); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imin) * 20)), + imin); + TF_LITE_MICRO_EXPECT_EQ( + SafeCast(static_cast(static_cast(imin) * 100)), + imin); +} + +} // namespace +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(QuantizationUtilTest_SafeCast) +{ + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); + tflite::RunSafeCastTests(); +} + +// Example taken from http://www.tensorflow.org/performance/quantization +// +// Quantized | Float +// --------- | ----- +// 0 | -10.0 +// 255 | 30.0 +// 128 | 10.0 +TF_LITE_MICRO_TEST(QuantizationUtilTest_ChooseQuantizationParams) +{ + tflite::QuantizationParams qp = + tflite::ChooseQuantizationParams(-10.0, 30.0); + TF_LITE_MICRO_EXPECT_NEAR(qp.scale, 0.156863, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(qp.zero_point, 64); +} + +TF_LITE_MICRO_TEST( + QuantizationUtilTest_ChooseQuantizationParamsZeroPointOnMinBoundary) +{ + tflite::QuantizationParams qp = + tflite::ChooseQuantizationParams(0.0, 30.0); + TF_LITE_MICRO_EXPECT_NEAR(qp.scale, 0.117647, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(qp.zero_point, 0); +} + +TF_LITE_MICRO_TEST( + QuantizationUtilTest_ChooseQuantizationParamsEmptyRangeZero) +{ + tflite::QuantizationParams qp = + tflite::ChooseQuantizationParams(0.0, 0.0); + TF_LITE_MICRO_EXPECT_NEAR(qp.scale, 0.0, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(qp.zero_point, 0); +} + +TF_LITE_MICRO_TEST( + QuantizationUtilTest_ChooseQuantizationParamsZeroPointOnMaxBoundary) +{ + tflite::QuantizationParams qp = + tflite::ChooseQuantizationParams(-10.0, 0.0); + TF_LITE_MICRO_EXPECT_NEAR(qp.scale, 0.039216, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(qp.zero_point, 255); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_IntegerFrExp) +{ + int shift; + int64_t result = tflite::IntegerFrExp(0.0, &shift); + TF_LITE_MICRO_EXPECT_EQ(0, result); + TF_LITE_MICRO_EXPECT_EQ(0, shift); + + result = tflite::IntegerFrExp(1.0, &shift); + TF_LITE_MICRO_EXPECT_NEAR(0x40000000, result, 1ll); + TF_LITE_MICRO_EXPECT_EQ(1, shift); + + result = tflite::IntegerFrExp(0.25, &shift); + TF_LITE_MICRO_EXPECT_NEAR(0x40000000, result, 1ll); + TF_LITE_MICRO_EXPECT_EQ(-1, shift); + + result = tflite::IntegerFrExp(-1.0, &shift); + TF_LITE_MICRO_EXPECT_NEAR(-(1 << 30), result, 1ll); + TF_LITE_MICRO_EXPECT_EQ(1, shift); + + result = tflite::IntegerFrExp(123.45, &shift); + TF_LITE_MICRO_EXPECT_NEAR(2071147315, result, 1ll); + TF_LITE_MICRO_EXPECT_EQ(7, shift); + + result = tflite::IntegerFrExp(static_cast(NAN), &shift); + TF_LITE_MICRO_EXPECT_NEAR(0, result, 1); + TF_LITE_MICRO_EXPECT_EQ(0x7fffffff, shift); + + result = tflite::IntegerFrExp(static_cast(INFINITY), &shift); + TF_LITE_MICRO_EXPECT_NEAR(std::numeric_limits::max(), result, 1); + TF_LITE_MICRO_EXPECT_EQ(0x7fffffff, shift); + + result = tflite::IntegerFrExp(-static_cast(INFINITY), &shift); + TF_LITE_MICRO_EXPECT_NEAR(std::numeric_limits::min(), result, 1); + TF_LITE_MICRO_EXPECT_EQ(0x7fffffff, shift); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_IntegerFrExpVersusDouble) +{ + int shift; + int32_t result = tflite::IntegerFrExp(0.0, &shift); + TF_LITE_MICRO_EXPECT_EQ(result, 0); + TF_LITE_MICRO_EXPECT_EQ(shift, 0); + + int double_shift; + double double_result = std::frexp(0.0, &double_shift); + TF_LITE_MICRO_EXPECT_EQ(double_result, 0); + TF_LITE_MICRO_EXPECT_EQ(double_shift, 0); + + result = tflite::IntegerFrExp(1.0, &shift); + TF_LITE_MICRO_EXPECT_NEAR(result, 0x40000000, 1); + TF_LITE_MICRO_EXPECT_EQ(shift, 1); + double_result = std::frexp(1.0, &double_shift); + TF_LITE_MICRO_EXPECT_NEAR(double_result, 0.5, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(double_shift, 1); + + result = tflite::IntegerFrExp(0.25, &shift); + TF_LITE_MICRO_EXPECT_NEAR(result, 0x40000000, 1); + TF_LITE_MICRO_EXPECT_EQ(shift, -1); + double_result = std::frexp(0.25, &double_shift); + TF_LITE_MICRO_EXPECT_NEAR(double_result, 0.5, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(double_shift, -1); + + result = tflite::IntegerFrExp(-1.0, &shift); + TF_LITE_MICRO_EXPECT_NEAR(result, -(1 << 30), 1); + TF_LITE_MICRO_EXPECT_EQ(shift, 1); + double_result = std::frexp(-1.0, &double_shift); + TF_LITE_MICRO_EXPECT_NEAR(double_result, -0.5, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(double_shift, 1); + + result = tflite::IntegerFrExp(123.45, &shift); + TF_LITE_MICRO_EXPECT_NEAR(result, (0.964453 * (1LL << 31)), 1000); + TF_LITE_MICRO_EXPECT_EQ(shift, 7); + double_result = std::frexp(123.45, &double_shift); + TF_LITE_MICRO_EXPECT_NEAR(double_result, 0.964453, 1e-5); + TF_LITE_MICRO_EXPECT_EQ(double_shift, 7); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_DoubleFromFractionAndShift) +{ + double result = tflite::DoubleFromFractionAndShift(0, 0); + TF_LITE_MICRO_EXPECT_EQ(0, result); + + result = tflite::DoubleFromFractionAndShift(0x40000000, 1); + TF_LITE_MICRO_EXPECT_NEAR(1.0, result, 1e-5); + + result = tflite::DoubleFromFractionAndShift(0x40000000, 2); + TF_LITE_MICRO_EXPECT_NEAR(2.0, result, 1e-5); + + int shift; + int64_t fraction = tflite::IntegerFrExp(3.0, &shift); + result = tflite::DoubleFromFractionAndShift(fraction, shift); + TF_LITE_MICRO_EXPECT_NEAR(3.0, result, 1e-5); + + fraction = tflite::IntegerFrExp(123.45, &shift); + result = tflite::DoubleFromFractionAndShift(fraction, shift); + TF_LITE_MICRO_EXPECT_NEAR(123.45, result, 1e-5); + + fraction = tflite::IntegerFrExp(-23.232323, &shift); + result = tflite::DoubleFromFractionAndShift(fraction, shift); + TF_LITE_MICRO_EXPECT_NEAR(-23.232323, result, 1e-5); + + fraction = tflite::IntegerFrExp(static_cast(NAN), &shift); + result = tflite::DoubleFromFractionAndShift(fraction, shift); + TF_LITE_MICRO_EXPECT_TRUE(std::isnan(result)); + + fraction = tflite::IntegerFrExp(static_cast(INFINITY), &shift); + result = tflite::DoubleFromFractionAndShift(fraction, shift); + TF_LITE_MICRO_EXPECT_FALSE(std::isfinite(result)); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_IntegerDoubleMultiply) +{ + TF_LITE_MICRO_EXPECT_NEAR(1.0, tflite::IntegerDoubleMultiply(1.0, 1.0), 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(2.0, tflite::IntegerDoubleMultiply(1.0, 2.0), 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(2.0, tflite::IntegerDoubleMultiply(2.0, 1.0), 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(4.0, tflite::IntegerDoubleMultiply(2.0, 2.0), 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(0.5, tflite::IntegerDoubleMultiply(1.0, 0.5), 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(0.25, tflite::IntegerDoubleMultiply(0.5, 0.5), + 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(-1.0, tflite::IntegerDoubleMultiply(1.0, -1.0), + 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(-1.0, tflite::IntegerDoubleMultiply(-1.0, 1.0), + 1e-5); + TF_LITE_MICRO_EXPECT_NEAR(1.0, tflite::IntegerDoubleMultiply(-1.0, -1.0), + 1e-5); + TF_LITE_MICRO_EXPECT_NEAR( + 15000000.0, tflite::IntegerDoubleMultiply(3000.0, 5000.0), 1e-5); + TF_LITE_MICRO_EXPECT_TRUE(std::isnan( + tflite::IntegerDoubleMultiply(static_cast(NAN), 5000.0))); + TF_LITE_MICRO_EXPECT_TRUE(std::isnan( + tflite::IntegerDoubleMultiply(3000.0, static_cast(NAN)))); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_IntegerDoubleCompare) +{ + TF_LITE_MICRO_EXPECT_EQ(-1, tflite::IntegerDoubleCompare(0.0, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(1, tflite::IntegerDoubleCompare(1.0, 0.0)); + TF_LITE_MICRO_EXPECT_EQ(0, tflite::IntegerDoubleCompare(1.0, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(0, tflite::IntegerDoubleCompare(0.0, 0.0)); + TF_LITE_MICRO_EXPECT_EQ(-1, tflite::IntegerDoubleCompare(-10.0, 10.0)); + TF_LITE_MICRO_EXPECT_EQ(1, tflite::IntegerDoubleCompare(123.45, 10.0)); + TF_LITE_MICRO_EXPECT_EQ( + 1, tflite::IntegerDoubleCompare(static_cast(NAN), + static_cast(INFINITY))); + TF_LITE_MICRO_EXPECT_EQ( + 1, tflite::IntegerDoubleCompare(static_cast(INFINITY), + static_cast(NAN))); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_PreprocessSoftmaxScaling) +{ + auto quantize = [](double beta, double scale, int integer_bits) { + int32_t q; + int s; + tflite::PreprocessSoftmaxScaling(beta, scale, integer_bits, &q, &s); + return std::pair{ q, s }; + }; + + // If beta * scale is greater than fits in the number of integer bits, the + // result is move near the maximum. Otherwise they quantize as expected. + // With 4 integer bits we can represent up to 16.0. + + auto r = quantize(1.0, 16.0, 4); + TF_LITE_MICRO_EXPECT_EQ(r.first, 2147483647); + TF_LITE_MICRO_EXPECT_EQ(r.second, 31); + + r = quantize(1.0, 8.0, 4); + TF_LITE_MICRO_EXPECT_EQ(r.first, 1073741824); + TF_LITE_MICRO_EXPECT_EQ(r.second, 31); + + // But with 5 bits we can go further. + r = quantize(2.0, 16.0, 5); + TF_LITE_MICRO_EXPECT_EQ(r.first, 2147483647); + TF_LITE_MICRO_EXPECT_EQ(r.second, 31); + + r = quantize(2.0, 8.0, 5); + TF_LITE_MICRO_EXPECT_EQ(r.first, 1073741824); + TF_LITE_MICRO_EXPECT_EQ(r.second, 31); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_CalculateInputRadius) +{ + TF_LITE_MICRO_EXPECT_EQ(tflite::CalculateInputRadius(4, 27), 15); + TF_LITE_MICRO_EXPECT_EQ(tflite::CalculateInputRadius(3, 27), 14); + TF_LITE_MICRO_EXPECT_EQ(tflite::CalculateInputRadius(3, 28), 7); + TF_LITE_MICRO_EXPECT_EQ(tflite::CalculateInputRadius(4, 2), 503316480); +} + +TF_LITE_MICRO_TEST(QuantizationUtilTest_QuantizeMultiplierArray) +{ + const double weights[] = { -4, -2, -1, -0.5, -0.25, -0.125, 0, + 0.125, 0.25, 0.5, 1, 2, 4 }; + + const int size = 13; + int32_t effective_scale_significand[size]; + int effective_scale_shift[size]; + tflite::QuantizeMultiplierArray(weights, size, effective_scale_significand, + effective_scale_shift); + const int32_t expected_effective_scale_significand[] = { + -1073741824, // float scale = -4 + -1073741824, // float scale = -2 + -1073741824, // float scale = -1 + -1073741824, // float scale = -0.5 + -1073741824, // float scale = -0.25 + -1073741824, // float scale = -0.125 + 0, // float scale = 0 + 1073741824, // float scale = 0.125 + 1073741824, // float scale = 0.25 + 1073741824, // float scale = 0.5 + 1073741824, // float scale = 1 + 1073741824, // float scale = 2 + 1073741824, // float scale = 4 + }; + + const int expected_effective_scale_shift[] = { + 3, // float scale = -4 + 2, // float scale = -2 + 1, // float scale = -1 + 0, // float scale = -0.5 + -1, // float scale = -0.25 + -2, // float scale = -0.125 + 0, // float scale = 0 + -2, // float scale = 0.125 + -1, // float scale = 0.25 + 0, // float scale = 0.5 + 1, // float scale = 1 + 2, // float scale = 2 + 3, // float scale = 4 + }; + + for (int i = 0; i < size; i++) { + TF_LITE_MICRO_EXPECT_EQ(effective_scale_significand[i], + expected_effective_scale_significand[i]); + TF_LITE_MICRO_EXPECT_EQ(effective_scale_shift[i], + expected_effective_scale_shift[i]); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.cc new file mode 100644 index 00000000..d80e9d71 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.cc @@ -0,0 +1,49 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/quantize.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, + sizeof(OpDataQuantizeReference)); +} + +} // namespace + +TfLiteRegistration Register_QUANTIZE() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/PrepareQuantizeReference, + /*invoke=*/EvalQuantizeReference, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.h new file mode 100644 index 00000000..28c76396 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize.h @@ -0,0 +1,36 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_QUANTIZE_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_QUANTIZE_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +struct OpDataQuantizeReference { + tflite::QuantizationParams quantization_params; + // The scaling factor from input to output (aka the 'real multiplier') can + // be represented as a fixed point multiplier plus a left shift. + int32_t requantize_output_multiplier; + int requantize_output_shift; + + int32_t input_zero_point; +}; + +TfLiteStatus EvalQuantizeReference(TfLiteContext *context, TfLiteNode *node); +TfLiteStatus PrepareQuantizeReference(TfLiteContext *context, TfLiteNode *node); +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_QUANTIZE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_common.cc new file mode 100644 index 00000000..5fc57d81 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_common.cc @@ -0,0 +1,173 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/quantize.h" +#include "tensorflow/lite/kernels/internal/reference/requantize.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/quantize.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { + +TfLiteStatus PrepareQuantizeReference(TfLiteContext *context, + TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + auto *data = static_cast(node->user_data); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, 0); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, 0); + TF_LITE_ENSURE(context, output != nullptr); + + // TODO(b/128934713): Add support for fixed-point per-channel quantization. + // Currently this only support affine per-layer quantization. + TF_LITE_ENSURE_EQ(context, output->quantization.type, + kTfLiteAffineQuantization); + const auto *affine_quantization = + reinterpret_cast(output->quantization.params); + TF_LITE_ENSURE(context, affine_quantization); + TF_LITE_ENSURE(context, affine_quantization->scale); + TF_LITE_ENSURE(context, affine_quantization->scale->size == 1); + + TF_LITE_ENSURE(context, input->type == kTfLiteFloat32 || + input->type == kTfLiteInt16 || + input->type == kTfLiteInt8); + TF_LITE_ENSURE(context, output->type == kTfLiteInt8 || + output->type == kTfLiteInt16 || + output->type == kTfLiteInt32); + + if ((input->type == kTfLiteInt16 && output->type == kTfLiteInt8) || + (input->type == kTfLiteInt8 && output->type == kTfLiteInt8) || + (input->type == kTfLiteInt8 && output->type == kTfLiteInt32) || + (input->type == kTfLiteInt16 && output->type == kTfLiteInt16) || + (input->type == kTfLiteInt16 && output->type == kTfLiteInt32)) { + double effective_scale = static_cast(input->params.scale) / + static_cast(output->params.scale); + + QuantizeMultiplier(effective_scale, &data->requantize_output_multiplier, + &data->requantize_output_shift); + } + + data->quantization_params.zero_point = output->params.zero_point; + data->quantization_params.scale = static_cast(output->params.scale); + + data->input_zero_point = input->params.zero_point; + return kTfLiteOk; +} + +TfLiteStatus EvalQuantizeReference(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + auto *data = static_cast(node->user_data); + + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + + if (input->type == kTfLiteFloat32) { + switch (output->type) { + case kTfLiteInt8: + reference_ops::AffineQuantize( + data->quantization_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt16: + reference_ops::AffineQuantize( + data->quantization_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else if (input->type == kTfLiteInt16) { + size_t size = ElementCount(*input->dims); + switch (output->type) { + case kTfLiteInt8: + reference_ops::Requantize( + tflite::micro::GetTensorData(input), size, + data->requantize_output_multiplier, data->requantize_output_shift, + data->input_zero_point, data->quantization_params.zero_point, + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt16: + reference_ops::Requantize( + tflite::micro::GetTensorData(input), size, + data->requantize_output_multiplier, data->requantize_output_shift, + data->input_zero_point, data->quantization_params.zero_point, + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + case kTfLiteInt32: + reference_ops::Requantize( + tflite::micro::GetTensorData(input), size, + data->requantize_output_multiplier, data->requantize_output_shift, + data->input_zero_point, data->quantization_params.zero_point, + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else if (input->type == kTfLiteInt8) { + // Int8 to Int8 requantization, required if the input and output tensors + // have different scales and/or zero points. + size_t size = ElementCount(*input->dims); + switch (output->type) { + case kTfLiteInt8: + reference_ops::Requantize( + tflite::micro::GetTensorData(input), size, + data->requantize_output_multiplier, data->requantize_output_shift, + data->input_zero_point, data->quantization_params.zero_point, + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt32: + reference_ops::Requantize( + tflite::micro::GetTensorData(input), size, + data->requantize_output_multiplier, data->requantize_output_shift, + data->input_zero_point, data->quantization_params.zero_point, + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + } else { + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_test.cc new file mode 100644 index 00000000..54094a7d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/quantize_test.cc @@ -0,0 +1,307 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void ValidateQuantizeGoldens(TfLiteTensor *tensors, int tensors_size, + const float *golden, T *golden_quantized, + float scale, int zero_point, int output_len, + T *output_data) +{ + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + // Version 1 of quantize supports int8_t and uint8_t quantization. + const TfLiteRegistration registration = Register_QUANTIZE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + // Use reference quantization from test utils to compare against op output. + Quantize(golden, golden_quantized, output_len, scale, zero_point); + for (int i = 0; i < output_len; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden_quantized[i], output_data[i]); + } +} + +#if !defined(XTENSA) +template +void TestQuantizeFloat(int *input_dims_data, const float *input_data, + int *output_dims_data, const float *golden, + T *golden_quantized, const float scale, + const int zero_point, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + TfLiteTensor output_tensor = + CreateQuantizedTensor(output_data, output_dims, scale, zero_point); + + TfLiteAffineQuantization quant; + float scales[] = { 1, scale }; + int zero_points[] = { 1, zero_point }; + quant.scale = FloatArrayFromFloats(scales); + quant.zero_point = IntArrayFromInts(zero_points); + output_tensor.quantization = { kTfLiteAffineQuantization, &quant }; + + // 1 input, 1 output. + constexpr int tensors_size = 2; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + output_tensor, + }; + + ValidateQuantizeGoldens(tensors, tensors_size, golden, golden_quantized, + scale, zero_point, output_dims_count, output_data); +} +#endif // defined(XTENSA) + +template +void TestRequantize(int *input_dims_data, const float *input_data, + InputType *input_quantized, const float input_scale, + const int input_zero_point, int *output_dims_data, + const float *golden, OutputType *golden_quantized, + const float output_scale, const int output_zero_point, + OutputType *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + TfLiteTensor output_tensor = CreateQuantizedTensor( + output_data, output_dims, output_scale, output_zero_point); + + TfLiteAffineQuantization quant; + float scales[] = { 1, output_scale }; + int zero_points[] = { 1, output_zero_point }; + quant.scale = FloatArrayFromFloats(scales); + quant.zero_point = IntArrayFromInts(zero_points); + output_tensor.quantization = { kTfLiteAffineQuantization, &quant }; + + // 1 input, 1 output. + constexpr int tensors_size = 2; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + output_tensor, + }; + + ValidateQuantizeGoldens(tensors, tensors_size, golden, golden_quantized, + output_scale, output_zero_point, output_dims_count, + output_data); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +#if !defined(XTENSA) +TF_LITE_MICRO_TEST(QuantizeOpTestInt16) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -63.5, -63, -62.5, -62, -61.5, + 62, 62.5, 63, 63.5, 64 }; + const float scale = 0.5; + const int zero_point = -1; + int16_t output[length]; + int16_t values_quantized[length]; + tflite::testing::TestQuantizeFloat( + dims, values, dims, values, values_quantized, scale, zero_point, output); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt16NoScale) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -128, -127, -126, -125, -124, + 123, 124, 125, 126, 127 }; + const float scale = 1.0; + const int zero_point = 0; + int16_t output[length]; + int16_t values_quantized[length]; + tflite::testing::TestQuantizeFloat( + dims, values, dims, values, values_quantized, scale, zero_point, output); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt16toInt16) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -64, -62, -60, -58, -56, 54, 56, 58, 60, 62 }; + const float input_scale = 2.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 32; + int16_t output_quantized[length]; + int16_t values_quantized[length]; + int16_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt16toInt16NoZeroPoint) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -32, -31, -30, -29, -28, 27, 28, 29, 30, 31 }; + const float input_scale = 1.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 0; + int16_t output_quantized[length]; + int16_t values_quantized[length]; + int16_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt8toInt8) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -64, -62, -60, -58, -56, 54, 56, 58, 60, 62 }; + const float input_scale = 2.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 32; + int8_t output_quantized[length]; + int8_t values_quantized[length]; + int8_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt8toInt8NoZeroPoint) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -32, -31, -30, -29, -28, 27, 28, 29, 30, 31 }; + const float input_scale = 1.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 0; + int8_t output_quantized[length]; + int8_t values_quantized[length]; + int8_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} +#endif // defined(XTENSA) + +#if !defined(XTENSA) +// TODO(b/155682734): Hifimini optimized quantize requires input scale to be +// smaller then output scale. +TF_LITE_MICRO_TEST(QuantizeOpTestInt16toInt8) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -64, -62, -60, -58, -56, 54, 56, 58, 60, 62 }; + const float input_scale = 2.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 0; + int8_t output_quantized[length]; + int8_t values_quantized[length]; + int16_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} +#endif // defined(XTENSA) + +TF_LITE_MICRO_TEST(QuantizeOpTestInt8toInt32) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -32, -31, -30, -29, -28, 27, 28, 29, 30, 31 }; + const float input_scale = 1.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 0; + int32_t output_quantized[length]; + int32_t values_quantized[length]; + int8_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt16toInt32) +{ + const int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -32, -31, -30, -29, -28, 27, 28, 29, 30, 31 }; + const float input_scale = 1.f; + const int input_zero_point = 0; + const float output_scale = 0.5; + const int output_zero_point = 0; + int32_t output_quantized[length]; + int32_t values_quantized[length]; + int16_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} + +TF_LITE_MICRO_TEST(QuantizeOpTestInt16toInt8) +{ + constexpr int length = 10; + int dims[] = { 2, 2, 5 }; + const float values[] = { -32, -31, -30, -29, -28, 27, 28, 29, 30, 31 }; + // TODO(b/155682734): Input scale must be smaller than output scale for + // xtensa. + const float input_scale = 0.4f; + const int input_zero_point = 0; + const float output_scale = 1.0f; + const int output_zero_point = 0; + int8_t output_quantized[length]; + int8_t values_quantized[length]; + int16_t input_quantized[length]; + tflite::testing::TestRequantize(dims, values, input_quantized, input_scale, + input_zero_point, dims, values, + values_quantized, output_scale, + output_zero_point, output_quantized); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce.cc new file mode 100644 index 00000000..2d61c2f7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce.cc @@ -0,0 +1,351 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/reduce.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/mean.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace reduce { + +constexpr int kMaxNumberOfAxis = 4; +constexpr int kMaxNumberOfReducedAxis = 2; + +struct OpData { + int32_t multiplier; + int shift; + int temp_buffer_idx; + int resolved_axis_idx; + int input_zp; + float input_scale; + int output_zp; + float output_scale; + int num_output_elements; +}; + +void *InitReduce(TfLiteContext *context, const char *buffer, size_t length) +{ + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus PrepareSimple(TfLiteContext *context, TfLiteNode *node) +{ + // Inputs Tensor (dtype depends on quantization): + // [0] = Input + // [1] = Axis + const TfLiteTensor *input = GetInput(context, node, 0); + + // Outputs Tensor (dtype depends on quantization): + // [0] = Output + + // Validate number of inputs and outputs + TF_LITE_ENSURE_EQ(context, node->inputs->size, 2); + TF_LITE_ENSURE_EQ(context, node->outputs->size, 1); + + // Validate axis type + const TfLiteTensor *axis = GetInput(context, node, 1); + TF_LITE_ENSURE(context, axis != nullptr); + TF_LITE_ENSURE_TYPES_EQ(context, axis->type, kTfLiteInt32); + + if (input->type == kTfLiteInt8) { + OpData *data = static_cast(node->user_data); + const TfLiteTensor *output = GetOutput(context, node, 0); + const double real_multiplier = static_cast(input->params.scale) / + static_cast(output->params.scale); + QuantizeMultiplier(real_multiplier, &data->multiplier, &data->shift); + } + + return kTfLiteOk; +} + +TfLiteStatus PrepareMax(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_OK(context, PrepareSimple(context, node)); + + OpData *op_data = static_cast(node->user_data); + const TfLiteTensor *input = GetInput(context, node, 0); + const TfLiteTensor *output = GetOutput(context, node, 0); + const TfLiteTensor *axis = GetInput(context, node, 1); + + op_data->input_scale = input->params.scale; + op_data->output_scale = output->params.scale; + op_data->num_output_elements = NumElements(output); + + context->RequestScratchBufferInArena(context, sizeof(int) * input->dims->size, + &op_data->temp_buffer_idx); + context->RequestScratchBufferInArena( + context, sizeof(int) * static_cast(ElementCount(*axis->dims)), + &op_data->resolved_axis_idx); + + return kTfLiteOk; +} + +TfLiteStatus PrepareMeanOrSum(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input = GetInput(context, node, 0); + OpData *op_data = reinterpret_cast(node->user_data); + const TfLiteTensor *output = GetOutput(context, node, 0); + if (input->type == kTfLiteInt8) { + const double real_multiplier = static_cast(input->params.scale) / + static_cast(output->params.scale); + QuantizeMultiplier(real_multiplier, &op_data->multiplier, &op_data->shift); + } + + int output_size = NumElements(output); + if (input->type == kTfLiteInt8 || input->type == kTfLiteUInt8) { + context->RequestScratchBufferInArena(context, output_size * sizeof(int32_t), + &op_data->temp_buffer_idx); + op_data->input_zp = input->params.zero_point; + op_data->input_scale = input->params.scale; + op_data->output_zp = output->params.zero_point; + op_data->output_scale = output->params.scale; + } + + TF_LITE_ENSURE_OK(context, PrepareSimple(context, node)); + // TODO(b/144955155): Support uint8_t(b/144955155) and int8_t(b/144955018) + return kTfLiteOk; +} + +void ResolveAxis(const int *axis_data, int axis_count, + tflite::MeanParams *op_params) +{ + int i = 0; + for (; i < axis_count; ++i) { + op_params->axis[i] = static_cast(axis_data[i]); + } + for (; i < 4; ++i) { + op_params->axis[i] = 1; + } + op_params->axis_count = axis_count; +} + +TfLiteStatus EvalMean(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + const TfLiteEvalTensor *axis = tflite::micro::GetEvalInput(context, node, 1); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + TfLiteReducerParams *params = + reinterpret_cast(node->builtin_data); + OpData *op_data = reinterpret_cast(node->user_data); + + int num_axis = static_cast(ElementCount(*axis->dims)); + int temp_index[kMaxNumberOfAxis]; + int resolved_axis[kMaxNumberOfReducedAxis]; + + tflite::MeanParams op_params; + ResolveAxis(tflite::micro::GetTensorData(axis), num_axis, &op_params); + + // Special case mean implementation exists for 4D mean across axes 1 and 2. + bool special_case_4d_axes_1_and_2 = + input->dims->size == 4 && op_params.axis_count == 2 && + ((op_params.axis[0] == 1 && op_params.axis[1] == 2) || + (op_params.axis[0] == 2 && op_params.axis[1] == 1)); + + switch (input->type) { + case kTfLiteFloat32: { + // Defer to specialized implementation for 4D Mean across axes 1 & 2. + if (params->keep_dims && special_case_4d_axes_1_and_2) { + reference_ops::Mean(op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + TF_LITE_ENSURE( + context, + reference_ops::Mean( + tflite::micro::GetTensorData(input), input->dims->data, + input->dims->size, tflite::micro::GetTensorData(output), + output->dims->data, output->dims->size, + tflite::micro::GetTensorData(axis), num_axis, + params->keep_dims, temp_index, resolved_axis, + tflite::micro::GetTensorData(output))); + } + } break; + case kTfLiteInt8: { + // Defer to specialized implementation for 4D Mean across axes 1 & 2. + if (params->keep_dims && special_case_4d_axes_1_and_2) { + reference_integer_ops::Mean( + op_params, op_data->multiplier, op_data->shift, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), op_data->input_zp, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), op_data->output_zp); + } else if (op_data->input_zp == op_data->output_zp && + op_data->input_scale == op_data->output_scale) { + int32_t *temp_buffer = static_cast( + context->GetScratchBuffer(context, op_data->temp_buffer_idx)); + TF_LITE_ENSURE( + context, + reference_ops::Mean( + tflite::micro::GetTensorData(input), input->dims->data, + input->dims->size, tflite::micro::GetTensorData(output), + output->dims->data, output->dims->size, + tflite::micro::GetTensorData(axis), num_axis, + params->keep_dims, temp_index, resolved_axis, temp_buffer)); + } else { + int32_t *temp_buffer = static_cast( + context->GetScratchBuffer(context, op_data->temp_buffer_idx)); + TF_LITE_ENSURE( + context, + reference_ops::QuantizedMeanOrSum( + tflite::micro::GetTensorData(input), op_data->input_zp, + op_data->input_scale, input->dims->data, input->dims->size, + tflite::micro::GetTensorData(output), + op_data->output_zp, op_data->output_scale, output->dims->data, + output->dims->size, tflite::micro::GetTensorData(axis), + num_axis, params->keep_dims, temp_index, resolved_axis, + temp_buffer, false)); + } + } break; + case kTfLiteUInt8: { + // Defer to specialized implementation for 4D Mean across axes 1 & 2. + if (params->keep_dims && special_case_4d_axes_1_and_2) { + reference_ops::Mean(op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + op_data->input_zp, op_data->input_scale, + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), + op_data->output_zp, op_data->output_scale); + } else if (op_data->input_zp == op_data->output_zp && + op_data->input_scale == op_data->output_scale) { + uint32_t *temp_buffer = static_cast( + context->GetScratchBuffer(context, op_data->temp_buffer_idx)); + TF_LITE_ENSURE( + context, + reference_ops::Mean(tflite::micro::GetTensorData(input), + input->dims->data, input->dims->size, + tflite::micro::GetTensorData(output), + output->dims->data, output->dims->size, + tflite::micro::GetTensorData(axis), + num_axis, params->keep_dims, temp_index, + resolved_axis, temp_buffer)); + } else { + uint32_t *temp_buffer = static_cast( + context->GetScratchBuffer(context, op_data->temp_buffer_idx)); + TF_LITE_ENSURE( + context, + reference_ops::QuantizedMeanOrSum( + tflite::micro::GetTensorData(input), op_data->input_zp, + op_data->input_scale, input->dims->data, input->dims->size, + tflite::micro::GetTensorData(output), + op_data->output_zp, op_data->output_scale, output->dims->data, + output->dims->size, tflite::micro::GetTensorData(axis), + num_axis, params->keep_dims, temp_index, resolved_axis, + temp_buffer, false)); + } + } break; + default: + TF_LITE_ENSURE_MSG(context, false, + "Currently, only float32, int8 or uint8 input type " + "is supported."); + } + return kTfLiteOk; +} + +TfLiteStatus EvalMax(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + const TfLiteEvalTensor *axis = tflite::micro::GetEvalInput(context, node, 1); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + TfLiteReducerParams *params = + static_cast(node->builtin_data); + OpData *op_data = static_cast(node->user_data); + + // Interpret an axis tensor with null dimensions as a scalar + int num_axis = static_cast(ElementCount(*axis->dims)); + int *temp_buffer = static_cast( + context->GetScratchBuffer(context, op_data->temp_buffer_idx)); + int *resolved_axis = static_cast( + context->GetScratchBuffer(context, op_data->resolved_axis_idx)); + switch (input->type) { + case kTfLiteFloat32: + TF_LITE_ENSURE( + context, + reference_ops::ReduceGeneric( + tflite::micro::GetTensorData(input), input->dims->data, + input->dims->size, tflite::micro::GetTensorData(output), + output->dims->data, output->dims->size, + tflite::micro::GetTensorData(axis), num_axis, + params->keep_dims, temp_buffer, resolved_axis, + std::numeric_limits::lowest(), + [](const float current, const float in) -> float { + return (in > current) ? in : current; + })); + break; + case kTfLiteInt8: + TF_LITE_ENSURE_EQ(context, static_cast(op_data->input_scale), + static_cast(op_data->output_scale)); + TF_LITE_ENSURE_EQ(context, op_data->input_zp, op_data->output_zp); + TF_LITE_ENSURE( + context, + reference_ops::ReduceGeneric( + tflite::micro::GetTensorData(input), input->dims->data, + input->dims->size, tflite::micro::GetTensorData(output), + output->dims->data, output->dims->size, + tflite::micro::GetTensorData(axis), num_axis, + params->keep_dims, temp_buffer, resolved_axis, + std::numeric_limits::lowest(), + [](const int8_t current, const int8_t in) -> int8_t { + return (in > current) ? in : current; + })); + break; + default: + TF_LITE_KERNEL_LOG(context, + "Only float32 and int8 types are supported.\n"); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace reduce + +TfLiteRegistration Register_MEAN() +{ + return { /*init=*/reduce::InitReduce, + /*free=*/nullptr, + /*prepare=*/reduce::PrepareMeanOrSum, + /*invoke=*/reduce::EvalMean, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +TfLiteRegistration Register_REDUCE_MAX() +{ + return { /*init=*/reduce::InitReduce, + /*free=*/nullptr, + /*prepare=*/reduce::PrepareMax, + /*invoke=*/reduce::EvalMax, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce_test.cc new file mode 100644 index 00000000..cc4c5242 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reduce_test.cc @@ -0,0 +1,644 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// Common 2D inputs, outputs and axis. +static const int kInputElements2D = 8; +static int kInputShape2D[] = { 2, 2, 4 }; +static const float kInputData2D[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; + +static int kAxisShape2D[] = { 1, 1 }; +static const int32_t kAxisData2D[] = { 1 }; + +static const int kOutputElements2D = 2; +static int kOutputShape2D[] = { 2, 1, 2 }; +static const float kGoldenData2D[] = { 2.5, 6.5 }; + +// Common 3D inputs, outputs and axis. +static const int kInputElements3D = 8; +static int kInputShape3D[] = { 3, 2, 2, 2 }; +static const float kInputData3D[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 }; + +static int kAxisShape3D[] = { 1, 2 }; +static const int32_t kAxisData3D[] = { 1, 2 }; + +static const int kOutputElements3D = 2; +static int kOutputShape3D[] = { 2, 1, 2 }; +static const float kGoldenData3D[] = { 2.5, 6.5 }; + +// Common 4D inputs, outputs and axis. +static const int kInputElements4D = 24; +static int kInputShape4D[] = { 4, 2, 2, 3, 2 }; +static const float kInputData4D[] = { + 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, + 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0 +}; + +static int kAxisShape4D[] = { 1, 2 }; +static const int32_t kAxisData4D[] = { 1, 2 }; + +static const int kOutputElements4D = 4; +static int kOutputShape4D[] = { 4, 2, 1, 1, 2 }; +static const float kGoldenData4D[] = { 6, 7, 18, 19 }; + +// Axis shape and contents are independent of input / output dimensions. + +template +TfLiteStatus ValidateReduceGoldens(TfLiteTensor *tensors, int tensors_size, + const T *expected_output_data, + T *output_data, int output_length, + const TfLiteRegistration ®istration, + TfLiteReducerParams *params, + float tolerance = 1e-5) +{ + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, params); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], + tolerance); + } + return kTfLiteOk; +} + +void TestMeanFloatInput4D(int *input_dims_data, const float *input_data, + int *axis_dims_data, const int32_t *axis_data, + int *output_dims_data, + const float *expected_output_data, float *output_data, + TfLiteReducerParams *params, float tolerance = 1e-5) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + const TfLiteRegistration registration = tflite::ops::micro::Register_MEAN(); + + constexpr int num_of_inputs = 2; // input and axis + constexpr int num_of_outputs = 1; // output + + constexpr int tensors_size = num_of_inputs + num_of_outputs; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(axis_data, axis_dims), + CreateTensor(output_data, output_dims), + }; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, ValidateReduceGoldens( + tensors, tensors_size, expected_output_data, output_data, + output_dims_count, registration, params, tolerance)); +} + +void TestReduceOpFloat(int *input_dims_data, const float *input_data, + int *axis_dims_data, const int32_t *axis_data, + int *output_dims_data, float *output_data, + const float *expected_output_data, + const TfLiteRegistration ®istration, + TfLiteReducerParams *params, float tolerance = 1e-5) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int num_of_inputs = 2; // input and axis + constexpr int num_of_outputs = 1; // output + + constexpr int tensors_size = num_of_inputs + num_of_outputs; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(axis_data, axis_dims), + CreateTensor(output_data, output_dims), + }; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, ValidateReduceGoldens( + tensors, tensors_size, expected_output_data, output_data, + output_dims_count, registration, params, tolerance)); +} + +template +void TestReduceOpQuantized(int *input_dims_data, const float *input_data, + T *input_data_quant, float input_scale, + int input_zero_point, int *axis_dims_data, + const int32_t *axis_data, int *output_dims_data, + const float *expected_output_data, + T *output_data_quant, T *expected_output_data_quant, + float output_scale, int output_zero_point, + const TfLiteRegistration ®istration, + TfLiteReducerParams *params) +{ + // Convert dimesion arguments to TfLiteArrays + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + // Get number of elements in input and output tensors + const int output_dims_count = ElementCount(*output_dims); + + // Initialize tensors + constexpr int tensors_size = 3; + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, input_data_quant, input_dims, + input_scale, input_zero_point), + CreateTensor(axis_data, axis_dims), + CreateQuantizedTensor(output_data_quant, output_dims, output_scale, + output_zero_point), + }; + + // Quantize expected output + tflite::Quantize(expected_output_data, expected_output_data_quant, + output_dims_count, output_scale, output_zero_point); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + ValidateReduceGoldens(tensors, tensors_size, expected_output_data_quant, + output_data_quant, output_dims_count, registration, + params, 0.01)); +} + +template +void TestMeanOpQuantized(int *input_dims_data, const float *input_data, + T *input_data_quant, float input_scale, + int input_zero_point, int *axis_dims_data, + const int32_t *axis_data, int *output_dims_data, + const float *expected_output_data, + T *output_data_quant, T *expected_output_data_quant, + float output_scale, int output_zero_point, + TfLiteReducerParams *params) +{ + // Convert dimesion arguments to TfLiteArrays + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + // Get number of elements in input and output tensors + const int output_dims_count = ElementCount(*output_dims); + + // Initialize tensors + constexpr int tensors_size = 3; + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_data, input_data_quant, input_dims, + input_scale, input_zero_point), + CreateTensor(axis_data, axis_dims), + CreateQuantizedTensor(output_data_quant, output_dims, output_scale, + output_zero_point), + }; + + // Quantize expected output + tflite::Quantize(expected_output_data, expected_output_data_quant, + output_dims_count, output_scale, output_zero_point); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + ValidateReduceGoldens(tensors, tensors_size, expected_output_data_quant, + output_data_quant, output_dims_count, + tflite::ops::micro::Register_MEAN(), params, 1.0)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(MeanFloat2DKeepDims) +{ + float output_data[tflite::testing::kOutputElements2D]; + + TfLiteReducerParams params = { true }; + + tflite::testing::TestMeanFloatInput4D( + tflite::testing::kInputShape2D, tflite::testing::kInputData2D, + tflite::testing::kAxisShape2D, tflite::testing::kAxisData2D, + tflite::testing::kOutputShape2D, tflite::testing::kGoldenData2D, + output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanInt82DKeepDims) +{ + int8_t expected_output_data_quant[tflite::testing::kOutputElements2D]; + int8_t output_data_quant[tflite::testing::kOutputElements2D]; + int8_t input_data_quant[tflite::testing::kInputElements2D]; + + float input_scale = 0.5f; + int input_zero_point = 0; + float output_scale = 0.5f; + int output_zero_point = 0; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape2D, tflite::testing::kInputData2D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape2D, tflite::testing::kAxisData2D, + tflite::testing::kOutputShape2D, tflite::testing::kGoldenData2D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanUInt82DKeepDims) +{ + uint8_t expected_output_data_quant[tflite::testing::kOutputElements2D]; + uint8_t output_data_quant[tflite::testing::kOutputElements2D]; + uint8_t input_data_quant[tflite::testing::kInputElements2D]; + + float input_scale = 0.5f; + int input_zero_point = 128; + float output_scale = 0.5f; + int output_zero_point = 128; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape2D, tflite::testing::kInputData2D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape2D, tflite::testing::kAxisData2D, + tflite::testing::kOutputShape2D, tflite::testing::kGoldenData2D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanFloat3DKeepDims) +{ + float output_data[tflite::testing::kOutputElements3D]; + + TfLiteReducerParams params = { true }; + + tflite::testing::TestMeanFloatInput4D( + tflite::testing::kInputShape3D, tflite::testing::kInputData3D, + tflite::testing::kAxisShape3D, tflite::testing::kAxisData3D, + tflite::testing::kOutputShape3D, tflite::testing::kGoldenData3D, + output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanInt83DKeepDims) +{ + int8_t expected_output_data_quant[tflite::testing::kOutputElements3D]; + int8_t output_data_quant[tflite::testing::kOutputElements3D]; + int8_t input_data_quant[tflite::testing::kInputElements3D]; + + float input_scale = 0.5f; + int input_zero_point = 0; + float output_scale = 0.5f; + int output_zero_point = 0; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape3D, tflite::testing::kInputData3D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape3D, tflite::testing::kAxisData3D, + tflite::testing::kOutputShape3D, tflite::testing::kGoldenData3D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanUInt83DKeepDims) +{ + uint8_t expected_output_data_quant[tflite::testing::kOutputElements3D]; + uint8_t output_data_quant[tflite::testing::kOutputElements3D]; + uint8_t input_data_quant[tflite::testing::kInputElements3D]; + + float input_scale = 0.5f; + int input_zero_point = 138; + float output_scale = 0.5f; + int output_zero_point = 138; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape3D, tflite::testing::kInputData3D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape3D, tflite::testing::kAxisData3D, + tflite::testing::kOutputShape3D, tflite::testing::kGoldenData3D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanFloat4DKeepDims) +{ + float output_data[tflite::testing::kOutputElements4D]; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanFloatInput4D( + tflite::testing::kInputShape4D, tflite::testing::kInputData4D, + tflite::testing::kAxisShape4D, tflite::testing::kAxisData4D, + tflite::testing::kOutputShape4D, tflite::testing::kGoldenData4D, + output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanInt84DKeepDims) +{ + int8_t expected_output_data_quant[tflite::testing::kOutputElements4D]; + int8_t output_data_quant[tflite::testing::kOutputElements4D]; + int8_t input_data_quant[tflite::testing::kInputElements4D]; + + float input_scale = 0.5f; + int input_zero_point = 0; + float output_scale = 0.5f; + int output_zero_point = 0; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape4D, tflite::testing::kInputData4D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape4D, tflite::testing::kAxisData4D, + tflite::testing::kOutputShape4D, tflite::testing::kGoldenData4D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanUInt84DKeepDims) +{ + uint8_t expected_output_data_quant[tflite::testing::kOutputElements4D]; + uint8_t output_data_quant[tflite::testing::kOutputElements4D]; + uint8_t input_data_quant[tflite::testing::kInputElements4D]; + + float input_scale = 0.5f; + int input_zero_point = 128; + float output_scale = 0.5f; + int output_zero_point = 128; + + TfLiteReducerParams params = { + true // keep_dims + }; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape4D, tflite::testing::kInputData4D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape4D, tflite::testing::kAxisData4D, + tflite::testing::kOutputShape4D, tflite::testing::kGoldenData4D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanFloat4DWithoutKeepDims) +{ + int kOutputShape4D[] = { 2, 2, 2 }; + float output_data[tflite::testing::kOutputElements4D]; + TfLiteReducerParams params = { + false // keep_dims + }; + + tflite::testing::TestMeanFloatInput4D( + tflite::testing::kInputShape4D, tflite::testing::kInputData4D, + tflite::testing::kAxisShape4D, tflite::testing::kAxisData4D, + kOutputShape4D, tflite::testing::kGoldenData4D, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanInt84DWithoutKeepDims) +{ + int8_t expected_output_data_quant[tflite::testing::kOutputElements4D]; + int8_t output_data_quant[tflite::testing::kOutputElements4D]; + int8_t input_data_quant[tflite::testing::kInputElements4D]; + + int kOutputShape4D[] = { 2, 2, 2 }; + TfLiteReducerParams params = { + false // keep_dims + }; + float input_scale = 0.5f; + int input_zero_point = 0; + float output_scale = 0.5f; + int output_zero_point = 0; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape4D, tflite::testing::kInputData4D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape4D, tflite::testing::kAxisData4D, + kOutputShape4D, tflite::testing::kGoldenData4D, output_data_quant, + expected_output_data_quant, output_scale, output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanUInt84DWithoutKeepDims) +{ + uint8_t expected_output_data_quant[tflite::testing::kOutputElements4D]; + uint8_t output_data_quant[tflite::testing::kOutputElements4D]; + uint8_t input_data_quant[tflite::testing::kInputElements4D]; + + int kOutputShape4D[] = { 2, 2, 2 }; + TfLiteReducerParams params = { + false // keep_dims + }; + float input_scale = 0.5f; + int input_zero_point = 128; + float output_scale = 0.5f; + int output_zero_point = 128; + + tflite::testing::TestMeanOpQuantized( + tflite::testing::kInputShape4D, tflite::testing::kInputData4D, + input_data_quant, input_scale, input_zero_point, + tflite::testing::kAxisShape4D, tflite::testing::kAxisData4D, + kOutputShape4D, tflite::testing::kGoldenData4D, output_data_quant, + expected_output_data_quant, output_scale, output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanFloat4DWithoutKeepDimsWithPrecision) +{ + int kInputShape4D[] = { 4, 2, 2, 3, 1 }; + const float kInputData4D[] = { 1.0, 24.0, 13.0, 3.0, 9.0, 17.0, + 11.0, 36.0, 14.0, 19.0, 17.0, 22.0 }; + const int kOutputElements4D = 2; + int kOutputShape4D[] = { 2, 2, 1 }; + const float kGoldenData4D[] = { 11.166667, 19.833334 }; + float output_data[kOutputElements4D]; + TfLiteReducerParams params = { + false // keep_dims + }; + + tflite::testing::TestMeanFloatInput4D( + kInputShape4D, kInputData4D, tflite::testing::kAxisShape4D, + tflite::testing::kAxisData4D, kOutputShape4D, kGoldenData4D, output_data, + ¶ms); +} + +TF_LITE_MICRO_TEST(FloatMaxOpTestNotKeepDims) +{ + int input_shape[] = { 3, 4, 3, 2 }; + const float input_data[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, + 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0 }; + int axis_shape[] = { 1, 4 }; + const int32_t axis_data[] = { 1, 0, -3, -3 }; + int output_shape[] = { 1, 2 }; + const float expected_output_data[] = { 23, 24 }; + float output_data[2]; + + TfLiteReducerParams params = { false }; + + tflite::testing::TestReduceOpFloat( + input_shape, input_data, axis_shape, axis_data, output_shape, output_data, + expected_output_data, tflite::ops::micro::Register_REDUCE_MAX(), ¶ms); +} + +TF_LITE_MICRO_TEST(FloatMaxOpTestKeepDims) +{ + int input_shape[] = { 3, 4, 3, 2 }; + const float input_data[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, + 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0 }; + int axis_shape[] = { 1, 2 }; + const int32_t axis_data[] = { 0, 2 }; + int output_shape[] = { 1, 3 }; + const float expected_output_data[] = { 20, 22, 24 }; + float output_data[3]; + + TfLiteReducerParams params = { true }; + + tflite::testing::TestReduceOpFloat( + input_shape, input_data, axis_shape, axis_data, output_shape, output_data, + expected_output_data, tflite::ops::micro::Register_REDUCE_MAX(), ¶ms); +} + +TF_LITE_MICRO_TEST(Int8MaxOpTestKeepDims) +{ + int input_shape[] = { 3, 1, 3, 2 }; + const float input_data[] = { 0.4, 0.2, 0.3, 0.4, 0.5, 0.6 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + const float expected_output_data[] = { 0.5, 0.6 }; + + float input_scale = 2 / 255.0; + int input_zp = 0; + + TfLiteReducerParams params = { true }; + + int8_t input_data_quant[6]; + int8_t output_data_quant[2]; + int8_t expected_output_data_quant[2]; + + tflite::testing::TestReduceOpQuantized( + input_shape, input_data, input_data_quant, input_scale, input_zp, + axis_shape, axis_data, output_shape, expected_output_data, + output_data_quant, expected_output_data_quant, input_scale, input_zp, + tflite::ops::micro::Register_REDUCE_MAX(), ¶ms); +} + +TF_LITE_MICRO_TEST(Int8MaxOpTestWithoutKeepDims) +{ + int input_shape[] = { 3, 1, 3, 2 }; + const float input_data[] = { 0.4, 0.2, 0.3, 0.4, 0.5, 0.6 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + const float expected_output_data[] = { 0.5, 0.6 }; + + float input_scale = 2 / 255.0; + int input_zp = 0; + float output_scale = 2 / 255.0; + int output_zp = 0; + + TfLiteReducerParams params = { false }; + + int8_t input_data_quant[6]; + int8_t output_data_quant[2]; + int8_t expected_output_data_quant[2]; + + tflite::testing::TestReduceOpQuantized( + input_shape, input_data, input_data_quant, input_scale, input_zp, + axis_shape, axis_data, output_shape, expected_output_data, + output_data_quant, expected_output_data_quant, output_scale, output_zp, + tflite::ops::micro::Register_REDUCE_MAX(), ¶ms); +} + +TF_LITE_MICRO_TEST(MeanInt84DWithoutKeepDimsWithPrecision) +{ + int kInputShape4D[] = { 4, 2, 2, 3, 1 }; + const float kInputData4D[] = { 1.0, 24.0, 13.0, 3.0, 9.0, 17.0, + 11.0, 36.0, 14.0, 19.0, 17.0, 22.0 }; + int kOutputShape4D[] = { 2, 2, 1 }; + const float kGoldenData4D[] = { 11.166667, 19.833334 }; + TfLiteReducerParams params = { + false // keep_dims + }; + float input_scale = 0.5f; + int input_zero_point = 0; + float output_scale = 0.5f; + int output_zero_point = 0; + + int8_t output_data_quant[2]; + int8_t expected_output_data_quant[2]; + int8_t input_data_quant[12]; + + tflite::testing::TestMeanOpQuantized( + kInputShape4D, kInputData4D, input_data_quant, input_scale, + input_zero_point, tflite::testing::kAxisShape4D, + tflite::testing::kAxisData4D, kOutputShape4D, kGoldenData4D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} + +TF_LITE_MICRO_TEST(MeanUInt84DWithoutKeepDimsWithPrecision) +{ + int kInputShape4D[] = { 4, 2, 2, 3, 1 }; + const float kInputData4D[] = { 1.0, 24.0, 13.0, 3.0, 9.0, 17.0, + 11.0, 36.0, 14.0, 19.0, 17.0, 22.0 }; + int kOutputShape4D[] = { 2, 2, 1 }; + const float kGoldenData4D[] = { 11.166667, 19.833334 }; + TfLiteReducerParams params = { + false // keep_dims + }; + + float input_scale = 0.5f; + int input_zero_point = 128; + float output_scale = 0.5f; + int output_zero_point = 128; + + uint8_t output_data_quant[2]; + uint8_t expected_output_data_quant[2]; + uint8_t input_data_quant[12]; + + tflite::testing::TestMeanOpQuantized( + kInputShape4D, kInputData4D, input_data_quant, input_scale, + input_zero_point, tflite::testing::kAxisShape4D, + tflite::testing::kAxisData4D, kOutputShape4D, kGoldenData4D, + output_data_quant, expected_output_data_quant, output_scale, + output_zero_point, ¶ms); +} +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape.cc new file mode 100644 index 00000000..656bd45f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape.cc @@ -0,0 +1,122 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace reshape { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus ReshapeOutput(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + // Tensorflow's Reshape allows one of the shape components to have the + // special -1 value, meaning it will be calculated automatically based on the + // input. Here we calculate what that dimension should be so that the number + // of output elements in the same as the number of input elements. + int num_input_elements = NumElements(input); + TfLiteIntArray *output_shape = output->dims; + + if (NumInputs(node) == 1 && // Legacy scalar supported with params. + output_shape->size == 1 && output_shape->data[0] == 0) { + // Legacy tflite models use a shape parameter of [0] to indicate scalars, + // so adjust accordingly. TODO(b/111614235): Allow zero-sized buffers during + // toco conversion. + output_shape->size = 0; + } + + int num_output_elements = 1; + int stretch_dim = -1; + for (int i = 0; i < output_shape->size; ++i) { + int value = output_shape->data[i]; + if (value == -1) { + TF_LITE_ENSURE_EQ(context, stretch_dim, -1); + stretch_dim = i; + } else { + num_output_elements *= value; + } + } + if (stretch_dim != -1) { + output_shape->data[stretch_dim] = num_input_elements / num_output_elements; + num_output_elements *= output_shape->data[stretch_dim]; + } + + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + TF_LITE_ENSURE_EQ(context, num_input_elements, num_output_elements); + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE(context, NumInputs(node) == 1 || NumInputs(node) == 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + TF_LITE_ENSURE_EQ(context, ReshapeOutput(context, node), kTfLiteOk); + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + // TODO(b/162522304): storing input bytes in OpData increases some models + // significantly, possibly due to alignment issues. + size_t input_bytes; + TF_LITE_ENSURE_STATUS(TfLiteTypeSizeOf(input->type, &input_bytes)); + input_bytes *= ElementCount(*input->dims); + + // Do nothing for in-place reshape. + if (input->data.raw != output->data.raw) { + // Otherwise perform reshape with copy. + for (size_t i = 0; i < input_bytes; ++i) { + output->data.raw[i] = input->data.raw[i]; + } + } + return kTfLiteOk; +} + +} // namespace reshape + +TfLiteRegistration Register_RESHAPE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/reshape::Prepare, + /*invoke=*/reshape::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape_test.cc new file mode 100644 index 00000000..b0fc2532 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/reshape_test.cc @@ -0,0 +1,388 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// TODO(b/162356196): Cleanup this unit test more. + +template +void ValidateReshapeGoldens(TfLiteTensor *tensors, int tensors_size, + TfLiteIntArray *inputs_array, + TfLiteIntArray *outputs_array, + const T *expected_output, + const size_t expected_output_len, + int *expected_dims, const size_t expected_dims_len, + bool expect_failure) +{ + const TfLiteRegistration registration = + tflite::ops::micro::Register_RESHAPE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + if (expect_failure) { + TF_LITE_MICRO_EXPECT_NE(kTfLiteOk, runner.InitAndPrepare()); + return; + } + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + TfLiteTensor *output_tensor = &tensors[outputs_array->data[0]]; + const T *output_data = GetTensorData(output_tensor); + for (size_t i = 0; i < expected_output_len; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output[i], output_data[i], 1e-5f); + } + TF_LITE_MICRO_EXPECT_EQ(expected_dims_len, + static_cast(output_tensor->dims->size)); + for (size_t i = 0; i < expected_dims_len; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_dims[i], output_tensor->dims->data[i]); + } +} +template +void TestReshapeWithShape(TfLiteTensor *input_tensor, + TfLiteTensor *shape_tensor, + TfLiteTensor *output_tensor, const T *expected_output, + const size_t expected_output_len, int *expected_dims, + const size_t expected_dims_len, bool expect_failure) +{ + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size]; + tensors[0] = *input_tensor; + tensors[1] = *shape_tensor; + tensors[2] = *output_tensor; + + int inputs_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_data); + int outputs_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_data); + + ValidateReshapeGoldens(tensors, tensors_size, inputs_array, outputs_array, + expected_output, expected_output_len, expected_dims, + expected_dims_len, expect_failure); +} + +// If expected output is empty, the test is expected to fail. +template +void TestReshapeWithoutShape(TfLiteTensor *input_tensor, + TfLiteTensor *output_tensor, + const T *expected_output, + const size_t expected_output_len, + int *expected_dims, const size_t expected_dims_len, + bool expect_failure) +{ + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size]; + tensors[0] = *input_tensor; + tensors[1] = *output_tensor; + + int inputs_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_data); + int outputs_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_data); + + ValidateReshapeGoldens(tensors, tensors_size, inputs_array, outputs_array, + expected_output, expected_output_len, expected_dims, + expected_dims_len, expect_failure); +} + +void TestReshape(int *input_dims_data, const float *input_data, + int *shape_dims_data, const int32_t *shape_data, + int *output_dims_data, float *output_data, + const float *expected_output, const size_t expected_output_len, + int *expected_dims, const size_t expected_dims_len, + bool expect_failure = false) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *shape_dims = IntArrayFromInts(shape_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + TfLiteTensor input_tensor = CreateTensor(input_data, input_dims); + TfLiteTensor shape_tensor = CreateTensor(shape_data, shape_dims); + TfLiteTensor output_tensor = CreateTensor(output_data, output_dims); + + TestReshapeWithShape(&input_tensor, &shape_tensor, &output_tensor, + expected_output, expected_output_len, expected_dims, + expected_dims_len, expect_failure); +} + +template +void TestReshapeQuantized(int *input_dims_data, const T *input_data, + int *shape_dims_data, const int32_t *shape_data, + int *output_dims_data, T *output_data, + const T *expected_output, + const size_t expected_output_len, int *expected_dims, + const size_t expected_dims_len, + bool expect_failure = false) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *shape_dims = IntArrayFromInts(shape_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + TfLiteTensor input_tensor = CreateQuantizedTensor( + input_data, input_dims, /*scale=*/1.f, /*zero_point=*/0); + TfLiteTensor shape_tensor = CreateTensor(shape_data, shape_dims); + TfLiteTensor output_tensor = CreateQuantizedTensor( + output_data, output_dims, /*scale=*/1.f, /*zero_point=*/0); + + TestReshapeWithShape(&input_tensor, &shape_tensor, &output_tensor, + expected_output, expected_output_len, expected_dims, + expected_dims_len, expect_failure); +} +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(ReshapeWithMismatchedDimensionsShouldFail) +{ + float output_data[32]; + int input_dims[] = { 4, 1, 2, 4, 1 }; + const float input_data[] = { 3 }; + int shape_dims[] = { 1, 2 }; + const int32_t shape_int32[] = { 2, 1 }; + int output_dims[] = { 2, 2, 1 }; + const int golden_output_len = 0; + const float golden_output[] = {}; + const int golden_dims_len = 0; + int golden_dims[] = {}; + tflite::testing::TestReshape( + input_dims, input_data, shape_dims, shape_int32, output_dims, output_data, + golden_output, golden_output_len, golden_dims, golden_dims_len, true); +} + +TF_LITE_MICRO_TEST(ReshapeWithTooManyDimensionsShouldFail) +{ + float output_data[32]; + int input_dims[] = { 9, 1, 1, 2, 1, 1, 1, 1, 1, 1 }; + const float input[] = { 3, 2 }; + int shape_dims[] = { 1, 9 }; + const int32_t shape_int32[] = { 1, 1, 1, 1, 1, 1, 1, 1, 2 }; + int output_dims[] = { 9, 1, 1, 1, 1, 1, 1, 1, 1, 2 }; + const int golden_output_len = 2; + const float golden_output[] = { 3, 2 }; + const int golden_dims_len = 9; + int golden_dims[] = { 1, 1, 1, 1, 1, 1, 1, 1, 2 }; + tflite::testing::TestReshape( + input_dims, input, shape_dims, shape_int32, output_dims, output_data, + golden_output, golden_output_len, golden_dims, golden_dims_len, false); +} + +TF_LITE_MICRO_TEST(ReshapeWithTooManySpecialDimensionsShouldFail) +{ + float output_data[32]; + int input_dims[] = { 4, 1, 2, 4, 11 }; + const float input[] = { 3 }; + int shape_dims[] = { 1, 4 }; + const int32_t shape_int32[] = { -1, -1, 2, 4 }; + int output_dims[] = { 4, -1, -1, 2, 4 }; + const int golden_output_len = 2; + const float golden_output[] = {}; + const int golden_dims_len = 9; + int golden_dims[] = {}; + tflite::testing::TestReshape( + input_dims, input, shape_dims, shape_int32, output_dims, output_data, + golden_output, golden_output_len, golden_dims, golden_dims_len, true); +} + +// Create the model with a 2x2 shape. Processing still works because the new +// shape ends up being hardcoded as a flat vector. +TF_LITE_MICRO_TEST(ReshapeWithInvalidShapeShouldFail) +{ + int input_dims_data[] = { 3, 1, 2, 2 }; + TfLiteIntArray *input_dims = + tflite::testing::IntArrayFromInts(input_dims_data); + const float input_data[] = { 3.0f }; + auto input_tensor = tflite::testing::CreateTensor(input_data, input_dims); + float output_data[4]; + int output_dims_data[6] = { 2, 2, 1, 2, 2, 1 }; + TfLiteIntArray *output_dims = + tflite::testing::IntArrayFromInts(output_dims_data); + auto output_tensor = tflite::testing::CreateTensor(output_data, output_dims); + const int expected_output[] = {}; + const int expected_output_len = 0; + int expected_dims[] = {}; + const int expected_dims_len = 0; + tflite::testing::TestReshapeWithoutShape( + &input_tensor, &output_tensor, expected_output, expected_output_len, + expected_dims, expected_dims_len, true); +} + +TF_LITE_MICRO_TEST(ReshapeWithRegularShapesShouldSucceed) +{ + float output_data_float[32]; + int8_t output_data_int8[32]; + uint8_t output_data_uint8[32]; + int16_t output_data_int16[32]; + int input_dims[] = { 4, 1, 2, 4, 1 }; + const float input_float[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int8_t input_int8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const uint8_t input_uint8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int16_t input_int16[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int shape_dims[] = { 1, 3 }; + const int32_t shape_int32[] = { 2, 2, 2 }; + int output_dims[] = { 3, 2, 2, 2 }; + const int golden_output_len = 8; + const float golden_output_float[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int8_t golden_output_int8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const uint8_t golden_output_uint8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int16_t golden_output_int16[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int golden_dims_len = 3; + int golden_dims[] = { 2, 2, 2 }; + tflite::testing::TestReshape(input_dims, input_float, shape_dims, shape_int32, + output_dims, output_data_float, + golden_output_float, golden_output_len, + golden_dims, golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_int8, shape_dims, shape_int32, output_dims, + output_data_int8, golden_output_int8, golden_output_len, golden_dims, + golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_uint8, shape_dims, shape_int32, output_dims, + output_data_uint8, golden_output_uint8, golden_output_len, golden_dims, + golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_int16, shape_dims, shape_int32, output_dims, + output_data_int16, golden_output_int16, golden_output_len, golden_dims, + golden_dims_len, false); +} + +// Stretch is not supported with TF Micro +TF_LITE_MICRO_TEST(ReshapeWithStretchDimensionShouldSucceed) +{ + float output_data_float[32]; + int8_t output_data_int8[32]; + uint8_t output_data_uint8[32]; + int16_t output_data_int16[32]; + int input_dims[] = { 4, 1, 2, 4, 1 }; + const float input_float[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int8_t input_int8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const uint8_t input_uint8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int16_t input_int16[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int shape_dims[] = { 1, 3 }; + const int32_t shape_int32[] = { 2, 1, -1 }; + int output_dims[] = { 3, 2, 1, -1 }; + const int golden_output_len = 8; + const float golden_output_float[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int8_t golden_output_int8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const uint8_t golden_output_uint8[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int16_t golden_output_int16[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + const int golden_dims_len = 3; + int golden_dims[] = { 2, 1, 4 }; + tflite::testing::TestReshape(input_dims, input_float, shape_dims, shape_int32, + output_dims, output_data_float, + golden_output_float, golden_output_len, + golden_dims, golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_int8, shape_dims, shape_int32, output_dims, + output_data_int8, golden_output_int8, golden_output_len, golden_dims, + golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_uint8, shape_dims, shape_int32, output_dims, + output_data_uint8, golden_output_uint8, golden_output_len, golden_dims, + golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_int16, shape_dims, shape_int32, output_dims, + output_data_int16, golden_output_int16, golden_output_len, golden_dims, + golden_dims_len, false); +} + +// Empty shape indicates scalar output. +TF_LITE_MICRO_TEST(ReshapeWithScalarOutputShouldSucceed) +{ + float output_data_float[4]; + int8_t output_data_int8[4]; + uint8_t output_data_uint8[4]; + int input_dims[] = { 1, 1 }; + const float input_float[] = { 3 }; + const int8_t input_int8[] = { 3 }; + const uint8_t input_uint8[] = { 3 }; + int shape_dims[] = { 0 }; + const int32_t shape_int32[] = {}; + int output_dims[] = { 0 }; + const int golden_output_len = 1; + const float golden_output_float[] = { 3 }; + const int8_t golden_output_int8[] = { 3 }; + const uint8_t golden_output_uint8[] = { 3 }; + const int golden_dims_len = 0; + int golden_dims[] = {}; + tflite::testing::TestReshape(input_dims, input_float, shape_dims, shape_int32, + output_dims, output_data_float, + golden_output_float, golden_output_len, + golden_dims, golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_int8, shape_dims, shape_int32, output_dims, + output_data_int8, golden_output_int8, golden_output_len, golden_dims, + golden_dims_len, false); + tflite::testing::TestReshapeQuantized( + input_dims, input_uint8, shape_dims, shape_int32, output_dims, + output_data_uint8, golden_output_uint8, golden_output_len, golden_dims, + golden_dims_len, false); +} + +// Some old models specify '[0]' as the new shape, indicating that both input +// and output are scalars. +TF_LITE_MICRO_TEST(ReshapeWithLegacyScalarOutputShouldSucceed) +{ + using tflite::testing::CreateTensor; + using tflite::testing::IntArrayFromInts; + + int input_dims_data[] = { 1, 1 }; + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + const float input_data[] = { 3.0f }; + auto input_tensor = CreateTensor(input_data, input_dims); + + float output_data[1]; + int output_dims_data[2] = { 1, 0 }; + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + auto output_tensor = CreateTensor(output_data, output_dims); + + int shape_dims_data[] = { 1, 0 }; + TfLiteIntArray *shape_dims = IntArrayFromInts(shape_dims_data); + + const int32_t shape_data[] = { 0 }; + auto shape_tensor = tflite::testing::CreateTensor(shape_data, shape_dims); + const float expected_output_with_shape[] = {}; + const int expected_output_with_shape_len = 0; + const float expected_output_no_shape[] = { 3 }; + const int expected_output_no_shape_len = 1; + int expected_dims[] = {}; + const int expected_dims_len = 0; + tflite::testing::TestReshapeWithShape( + &input_tensor, &shape_tensor, &output_tensor, expected_output_with_shape, + expected_output_with_shape_len, expected_dims, expected_dims_len, true); + + tflite::testing::TestReshapeWithoutShape( + &input_tensor, &output_tensor, expected_output_no_shape, + expected_output_no_shape_len, expected_dims, expected_dims_len, false); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear.cc new file mode 100644 index 00000000..7e5aadd8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear.cc @@ -0,0 +1,119 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/resize_bilinear.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kSizeTensor = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + const TfLiteTensor *size = GetInput(context, node, kSizeTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + + TF_LITE_ENSURE_EQ(context, NumDimensions(input), 4); + TF_LITE_ENSURE_EQ(context, NumDimensions(size), 1); + + TF_LITE_ENSURE_EQ(context, size->type, kTfLiteInt32); + output->type = input->type; + + TF_LITE_ENSURE_MSG(context, IsConstantTensor(size), + "Non constant size tensor not supported"); + + // Ensure params are valid. + auto *params = + reinterpret_cast(node->builtin_data); + if (params->half_pixel_centers && params->align_corners) { + TF_LITE_KERNEL_LOG( + context, "If half_pixel_centers is True, align_corners must be False."); + return kTfLiteError; + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = + reinterpret_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *size = + tflite::micro::GetEvalInput(context, node, kSizeTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + if (output->type == kTfLiteFloat32) { + tflite::ResizeBilinearParams op_params; + op_params.align_corners = params->align_corners; + op_params.half_pixel_centers = params->half_pixel_centers; + reference_ops::ResizeBilinear(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(size), + tflite::micro::GetTensorData(size), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else if (output->type == kTfLiteInt8) { + tflite::ResizeBilinearParams op_params; + op_params.align_corners = params->align_corners; + op_params.half_pixel_centers = params->half_pixel_centers; + reference_ops::ResizeBilinearInteger( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(size), + tflite::micro::GetTensorData(size), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + TF_LITE_KERNEL_LOG(context, "Output type is %d, requires float or int8.", + output->type); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_RESIZE_BILINEAR() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear_test.cc new file mode 100644 index 00000000..97eeaa11 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_bilinear_test.cc @@ -0,0 +1,344 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +TfLiteTensor TestCreateTensor(const float *data, TfLiteIntArray *dims) +{ + return CreateTensor(data, dims); +} + +TfLiteTensor TestCreateTensor(const int8_t *data, TfLiteIntArray *dims) +{ + return CreateQuantizedTensor(data, dims, -128, 127); +} + +template +TfLiteStatus ValidateGoldens(TfLiteTensor *tensors, int tensors_size, + const T *expected_output_data, T *output_data, + int output_length, + TfLiteResizeBilinearParams *params, + float tolerance = 1e-5) +{ + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_RESIZE_BILINEAR(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, params); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], + tolerance); + } + + return kTfLiteOk; +} + +template +void TestResizeBilinear(int *input_dims_data, const T *input_data, + const int32_t *expected_size_data, + const T *expected_output_data, int *output_dims_data, + T *output_data, TfLiteResizeBilinearParams *params, + float tolerance = 1e-5) +{ + int expected_size_dims_data[] = { 1, 2 }; + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *expected_size_dims = + IntArrayFromInts(expected_size_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + const int output_dims_count = ElementCount(*output_dims); + + // Hack to pass ConstantTensor check in prepare + TfLiteTensor t = CreateTensor(expected_size_data, expected_size_dims); + t.allocation_type = kTfLiteMmapRo; + + constexpr int tensors_size = 3; + TfLiteTensor tensors[tensors_size]{ + TestCreateTensor(input_data, input_dims), + t, + TestCreateTensor(output_data, output_dims), + }; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + ValidateGoldens(tensors, tensors_size, expected_output_data, output_data, + output_dims_count, params, tolerance)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(HorizontalResize) +{ + int input_dims[] = { 4, 1, 1, 2, 1 }; + const float input_data[] = { 3, 6 }; + const int32_t expected_size_data[] = { 1, 3 }; + const float expected_output_data[] = { 3, 5, 6 }; + int output_dims[] = { 4, 1, 1, 3, 1 }; + float output_data[3]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear(input_dims, input_data, + expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(HorizontalResizeInt8) +{ + int input_dims[] = { 4, 1, 1, 2, 1 }; + const int8_t input_data[] = { 3, 6 }; + const int32_t expected_size_data[] = { 1, 3 }; + const int8_t expected_output_data[] = { 3, 5, 6 }; + int output_dims[] = { 4, 1, 1, 3, 1 }; + int8_t output_data[3]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(VerticalResize) +{ + int input_dims[] = { 4, 1, 2, 1, 1 }; + const float input_data[] = { 3, 9 }; + const int32_t expected_size_data[] = { 3, 1 }; + const float expected_output_data[] = { 3, 7, 9 }; + int output_dims[] = { 4, 1, 3, 1, 1 }; + float output_data[3]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear(input_dims, input_data, + expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(VerticalResizeInt8) +{ + int input_dims[] = { 4, 1, 2, 1, 1 }; + const int8_t input_data[] = { 3, 9 }; + const int32_t expected_size_data[] = { 3, 1 }; + const int8_t expected_output_data[] = { 3, 7, 9 }; + int output_dims[] = { 4, 1, 3, 1, 1 }; + int8_t output_data[3]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(TwoDimensionalResize) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_data[] = { + 3, 6, // + 9, 12, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const float expected_output_data[] = { + 3, 5, 6, // + 7, 9, 10, // + 9, 11, 12 // + }; + + int output_dims[] = { 4, 1, 3, 3, 1 }; + float output_data[9]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear(input_dims, input_data, + expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(TwoDimensionalResizeInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const int8_t input_data[] = { + 3, 6, // + 9, 12, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const int8_t expected_output_data[] = { + 3, 5, 6, // + 7, 9, 10, // + 9, 11, 12, // + }; + int output_dims[] = { 4, 1, 3, 3, 1 }; + int8_t output_data[9]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(TwoDimensionalResizeWithTwoBatches) +{ + int input_dims[] = { 4, 2, 2, 2, 1 }; + const float input_data[] = { + 3, 6, // + 9, 12, // + 4, 10, // + 10, 16 // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const float expected_output_data[] = { + 3, 5, 6, // + 7, 9, 10, // + 9, 11, 12, // + 4, 8, 10, // + 8, 12, 14, // + 10, 14, 16, // + }; + int output_dims[] = { 4, 2, 3, 3, 1 }; + float output_data[18]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear(input_dims, input_data, + expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(TwoDimensionalResizeWithTwoBatchesInt8) +{ + int input_dims[] = { 4, 2, 2, 2, 1 }; + const int8_t input_data[] = { + 3, 6, // + 9, 12, // + 4, 10, // + 12, 16 // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const int8_t expected_output_data[] = { + 3, 5, 6, // + 7, 9, 10, // + 9, 11, 12, // + 4, 8, 10, // + 9, 12, 13, // + 12, 14, 16, // + }; + int output_dims[] = { 4, 2, 3, 3, 1 }; + int8_t output_data[18]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data, ¶ms, /*tolerance=*/1); +} + +TF_LITE_MICRO_TEST(ThreeDimensionalResize) +{ + int input_dims[] = { 4, 1, 2, 2, 2 }; + const float input_data[] = { + 3, 4, 6, 10, // + 9, 10, 12, 16, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const float expected_output_data[] = { + 3, 4, 5, 8, 6, 10, // + 7, 8, 9, 12, 10, 14, // + 9, 10, 11, 14, 12, 16, // + }; + int output_dims[] = { 4, 1, 3, 3, 2 }; + float output_data[18]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear(input_dims, input_data, + expected_size_data, expected_output_data, + output_dims, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(ThreeDimensionalResizeInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 2 }; + const int8_t input_data[] = { + 3, 4, 6, 10, // + 10, 12, 14, 16, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const int8_t expected_output_data[] = { + 3, 4, 5, 8, 6, 10, // + 7, 9, 10, 12, 11, 13, // + 10, 12, 12, 14, 14, 16, // + }; + int output_dims[] = { 4, 1, 3, 3, 2 }; + int8_t output_data[18]; + + TfLiteResizeBilinearParams params = { + false, /*align_corners*/ + false /*half pixel centers*/ + }; + + tflite::testing::TestResizeBilinear( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data, ¶ms, /*tolerance=*/1); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor.cc new file mode 100644 index 00000000..19e055a2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor.cc @@ -0,0 +1,124 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace resize_nearest_neighbor { + +constexpr int kInputTensor = 0; +constexpr int kSizeTensor = 1; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + const TfLiteTensor *size = GetInput(context, node, kSizeTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + + // Our current implementations rely on the input being 4D, + // and the size being 1D tensor with exactly 2 elements. + TF_LITE_ENSURE_EQ(context, NumDimensions(input), 4); + TF_LITE_ENSURE_EQ(context, NumDimensions(size), 1); + TF_LITE_ENSURE_EQ(context, size->type, kTfLiteInt32); + TF_LITE_ENSURE_EQ(context, size->dims->data[0], 2); + + output->type = input->type; + + if (!IsConstantTensor(size)) { + TF_LITE_KERNEL_LOG(context, "Dynamic tensors are unsupported in tfmicro."); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = + reinterpret_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *size = + tflite::micro::GetEvalInput(context, node, kSizeTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + tflite::ResizeNearestNeighborParams op_params; + op_params.align_corners = params->align_corners; + op_params.half_pixel_centers = false; + + if (output->type == kTfLiteFloat32) { + reference_ops::ResizeNearestNeighbor( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(size), + tflite::micro::GetTensorData(size), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else if (output->type == kTfLiteUInt8) { + reference_ops::ResizeNearestNeighbor( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(size), + tflite::micro::GetTensorData(size), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else if (output->type == kTfLiteInt8) { + reference_ops::ResizeNearestNeighbor( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(size), + tflite::micro::GetTensorData(size), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + TF_LITE_KERNEL_LOG(context, + "Output type is %d, requires float, uint8_t or int8_t.", + output->type); + return kTfLiteError; + } + + return kTfLiteOk; +} +} // namespace resize_nearest_neighbor + +TfLiteRegistration Register_RESIZE_NEAREST_NEIGHBOR() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/resize_nearest_neighbor::Prepare, + /*invoke=*/resize_nearest_neighbor::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor_test.cc new file mode 100644 index 00000000..d8d6bae7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/resize_nearest_neighbor_test.cc @@ -0,0 +1,374 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +using uint8_t = std::uint8_t; +using int32_t = std::int32_t; + +TfLiteTensor TestCreateTensor(const float *data, TfLiteIntArray *dims) +{ + return CreateTensor(data, dims); +} + +TfLiteTensor TestCreateTensor(const uint8_t *data, TfLiteIntArray *dims) +{ + return CreateQuantizedTensor(data, dims, 0, 255); +} + +TfLiteTensor TestCreateTensor(const int8_t *data, TfLiteIntArray *dims) +{ + return CreateQuantizedTensor(data, dims, -128, 127); +} + +// Input data expects a 4-D tensor of [batch, height, width, channels] +// Output data should match input datas batch and channels +// Expected sizes should be a 1-D tensor with 2 elements: new_height & new_width +template +void TestResizeNearestNeighbor(int *input_dims_data, const T *input_data, + const int32_t *expected_size_data, + const T *expected_output_data, + int *output_dims_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + + int expected_size_dims_data[] = { 1, 2 }; + TfLiteIntArray *expected_size_dims = + IntArrayFromInts(expected_size_dims_data); + + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + const int output_dims_count = ElementCount(*output_dims); + + constexpr int tensors_size = 3; + TfLiteTensor tensors[tensors_size] = { + TestCreateTensor(input_data, input_dims), + CreateTensor(expected_size_data, expected_size_dims), + TestCreateTensor(output_data, output_dims), + }; + + tensors[1].allocation_type = kTfLiteMmapRo; + + TfLiteResizeNearestNeighborParams builtin_data = { false, false }; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_RESIZE_NEAREST_NEIGHBOR(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, &builtin_data); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + // compare results + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(HorizontalResize) +{ + int input_dims[] = { 4, 1, 1, 2, 1 }; + const float input_data[] = { 3, 6 }; + const int32_t expected_size_data[] = { 1, 3 }; + const float expected_output_data[] = { 3, 3, 6 }; + int output_dims[] = { 4, 1, 1, 3, 1 }; + float output_data[3]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(HorizontalResizeUInt8) +{ + int input_dims[] = { 4, 1, 1, 2, 1 }; + const uint8_t input_data[] = { 3, 6 }; + const int32_t expected_size_data[] = { 1, 3 }; + const uint8_t expected_output_data[] = { 3, 3, 6 }; + int output_dims[] = { 4, 1, 1, 3, 1 }; + uint8_t output_data[3]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(HorizontalResizeInt8) +{ + int input_dims[] = { 4, 1, 1, 2, 1 }; + const int8_t input_data[] = { -3, 6 }; + const int32_t expected_size_data[] = { 1, 3 }; + const int8_t expected_output_data[] = { -3, -3, 6 }; + int output_dims[] = { 4, 1, 1, 3, 1 }; + int8_t output_data[3]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(VerticalResize) +{ + int input_dims[] = { 4, 1, 2, 1, 1 }; + const float input_data[] = { 3, 9 }; + const int32_t expected_size_data[] = { 3, 1 }; + const float expected_output_data[] = { 3, 3, 9 }; + int output_dims[] = { 4, 1, 3, 1, 1 }; + float output_data[3]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(VerticalResizeUInt8) +{ + int input_dims[] = { 4, 1, 2, 1, 1 }; + const uint8_t input_data[] = { 3, 9 }; + const int32_t expected_size_data[] = { 3, 1 }; + const uint8_t expected_output_data[] = { 3, 3, 9 }; + int output_dims[] = { 4, 1, 3, 1, 1 }; + uint8_t output_data[3]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(VerticalResizeInt8) +{ + int input_dims[] = { 4, 1, 2, 1, 1 }; + const int8_t input_data[] = { 3, -9 }; + const int32_t expected_size_data[] = { 3, 1 }; + const int8_t expected_output_data[] = { 3, 3, -9 }; + int output_dims[] = { 4, 1, 3, 1, 1 }; + int8_t output_data[3]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(TwoDimensionalResize) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const float input_data[] = { + 3, 6, // + 9, 12, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const float expected_output_data[] = { + 3, 3, 6, // + 3, 3, 6, // + 9, 9, 12 // + }; + + int output_dims[] = { 4, 1, 3, 3, 1 }; + float output_data[9]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(TwoDimensionalResizeUInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const uint8_t input_data[] = { + 3, 6, // + 9, 12 // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const uint8_t expected_output_data[] = { + 3, 3, 6, // + 3, 3, 6, // + 9, 9, 12 // + }; + int output_dims[] = { 4, 1, 3, 3, 1 }; + uint8_t output_data[9]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(TwoDimensionalResizeInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 1 }; + const int8_t input_data[] = { + 3, -6, // + 9, 12, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const int8_t expected_output_data[] = { + 3, 3, -6, // + 3, 3, -6, // + 9, 9, 12, // + }; + int output_dims[] = { 4, 1, 3, 3, 1 }; + int8_t output_data[9]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(TwoDimensionalResizeWithTwoBatches) +{ + int input_dims[] = { 4, 2, 2, 2, 1 }; + const float input_data[] = { + 3, 6, // + 9, 12, // + 4, 10, // + 10, 16 // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const float expected_output_data[] = { + 3, 3, 6, // + 3, 3, 6, // + 9, 9, 12, // + 4, 4, 10, // + 4, 4, 10, // + 10, 10, 16, // + }; + int output_dims[] = { 4, 2, 3, 3, 1 }; + float output_data[18]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(TwoDimensionalResizeWithTwoBatchesUInt8) +{ + int input_dims[] = { 4, 2, 2, 2, 1 }; + const uint8_t input_data[] = { + 3, 6, // + 9, 12, // + 4, 10, // + 10, 16 // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const uint8_t expected_output_data[] = { + 3, 3, 6, // + 3, 3, 6, // + 9, 9, 12, // + 4, 4, 10, // + 4, 4, 10, // + 10, 10, 16, // + }; + int output_dims[] = { 4, 2, 3, 3, 1 }; + uint8_t output_data[18]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(TwoDimensionalResizeWithTwoBatchesInt8) +{ + int input_dims[] = { 4, 2, 2, 2, 1 }; + const int8_t input_data[] = { + 3, 6, // + 9, -12, // + -4, 10, // + 10, 16 // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const int8_t expected_output_data[] = { + 3, 3, 6, // + 3, 3, 6, // + 9, 9, -12, // + -4, -4, 10, // + -4, -4, 10, // + 10, 10, 16, // + }; + int output_dims[] = { 4, 2, 3, 3, 1 }; + int8_t output_data[18]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(ThreeDimensionalResize) +{ + int input_dims[] = { 4, 1, 2, 2, 2 }; + const float input_data[] = { + 3, 4, 6, 10, // + 9, 10, 12, 16, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const float expected_output_data[] = { + 3, 4, 3, 4, 6, 10, // + 3, 4, 3, 4, 6, 10, // + 9, 10, 9, 10, 12, 16, // + }; + int output_dims[] = { 4, 1, 3, 3, 2 }; + float output_data[18]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(ThreeDimensionalResizeUInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 2 }; + const uint8_t input_data[] = { + 3, 4, 6, 10, // + 10, 12, 14, 16, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const uint8_t expected_output_data[] = { + 3, 4, 3, 4, 6, 10, // + 3, 4, 3, 4, 6, 10, // + 10, 12, 10, 12, 14, 16, // + }; + int output_dims[] = { 4, 1, 3, 3, 2 }; + uint8_t output_data[18]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} +TF_LITE_MICRO_TEST(ThreeDimensionalResizeInt8) +{ + int input_dims[] = { 4, 1, 2, 2, 2 }; + const int8_t input_data[] = { + 3, 4, -6, 10, // + 10, 12, -14, 16, // + }; + const int32_t expected_size_data[] = { 3, 3 }; + const int8_t expected_output_data[] = { + 3, 4, 3, 4, -6, 10, // + 3, 4, 3, 4, -6, 10, // + 10, 12, 10, 12, -14, 16, // + }; + int output_dims[] = { 4, 1, 3, 3, 2 }; + int8_t output_data[18]; + + tflite::testing::TestResizeNearestNeighbor( + input_dims, input_data, expected_size_data, expected_output_data, + output_dims, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/round.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/round.cc new file mode 100644 index 00000000..c3235543 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/round.cc @@ -0,0 +1,79 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/round.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace round { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteFloat32); + TF_LITE_ENSURE_TYPES_EQ(context, output->type, input->type); + TF_LITE_ENSURE_EQ(context, output->bytes, input->bytes); + TF_LITE_ENSURE_EQ(context, output->dims->size, input->dims->size); + for (int i = 0; i < output->dims->size; ++i) { + TF_LITE_ENSURE_EQ(context, output->dims->data[i], input->dims->data[i]); + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + reference_ops::Round(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + + return kTfLiteOk; +} +} // namespace round + +TfLiteRegistration Register_ROUND() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/round::Prepare, + /*invoke=*/round::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/round_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/round_test.cc new file mode 100644 index 00000000..ec527c0b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/round_test.cc @@ -0,0 +1,83 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void TestRound(int *input_dims_data, const float *input_data, + const float *expected_output_data, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(input_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_ROUND(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SingleDim) +{ + int input_dims[] = { 1, 6 }; + const float input_data[] = { 8.5, 0.0, 3.5, 4.2, -3.5, -4.5 }; + const float golden[] = { 8, 0, 4, 4, -4, -4 }; + float output_data[6]; + tflite::testing::TestRound(input_dims, input_data, golden, output_data); +} + +TF_LITE_MICRO_TEST(MultiDims) +{ + int input_dims[] = { 4, 2, 1, 1, 6 }; + const float input_data[] = { 0.0001, 8.0001, 0.9999, 9.9999, 0.5, -0.0001, + -8.0001, -0.9999, -9.9999, -0.5, -2.5, 1.5 }; + const float golden[] = { 0, 8, 1, 10, 0, 0, -8, -1, -10, -0, -2, 2 }; + float output_data[12]; + tflite::testing::TestRound(input_dims, input_data, golden, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/shape.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/shape.cc new file mode 100644 index 00000000..c2ce038b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/shape.cc @@ -0,0 +1,77 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { + +namespace { +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +void ExtractShape(const TfLiteEvalTensor *input, int32_t *output_data) +{ + for (int i = 0; i < input->dims->size; ++i) { + output_data[i] = input->dims->data[i]; + } +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + if (output->type != kTfLiteInt32) { + TF_LITE_KERNEL_LOG(context, "Output type %s (%d) not supported.", + TfLiteTypeGetName(output->type), output->type); + return kTfLiteError; + } else { + ExtractShape(input, tflite::micro::GetTensorData(output)); + } + + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_SHAPE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/shape_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/shape_test.cc new file mode 100644 index 00000000..d5887bec --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/shape_test.cc @@ -0,0 +1,146 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +void ValidateShape(TfLiteTensor *tensors, const int tensor_count, + int32_t *output_data, const int32_t *expected_output, + int output_dims_count) +{ + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::Register_SHAPE(); + micro::KernelRunner runner(registration, tensors, tensor_count, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output[i], output_data[i]); + } +} + +void TestShape(int *input_dims_data, const float *input_data, + int *output_dims_data, const int32_t *expected_output_data, + int32_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims, true), + }; + + ValidateShape(tensors, tensors_size, output_data, expected_output_data, + output_dims_count); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestShape0) +{ + int input_shape[] = { 1, 5 }; + float input_values[] = { 1, 3, 1, 3, 5 }; + int output_dims[] = { 1, 1 }; // this is actually input_shapes shape + int32_t expected_output_data[] = { 5 }; + int32_t output_data[1]; + + tflite::testing::TestShape(input_shape, input_values, output_dims, + expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(TestShape1) +{ + int input_shape[] = { 2, 4, 3 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int output_dims[] = { 2, 1, 1 }; + int32_t expected_output_data[] = { 4, 3 }; + int32_t output_data[2]; + + tflite::testing::TestShape(input_shape, input_values, output_dims, + expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(TestShape2) +{ + int input_shape[] = { 2, 12, 1 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int output_dims[] = { 2, 1, 1 }; + int32_t expected_output_data[] = { 12, 1 }; + int32_t output_data[2]; + + tflite::testing::TestShape(input_shape, input_values, output_dims, + expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(TestShape3) +{ + int input_shape[] = { 2, 2, 6 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int output_dims[] = { 2, 1, 1 }; + int32_t expected_output_data[] = { 2, 6 }; + int32_t output_data[2]; + + tflite::testing::TestShape(input_shape, input_values, output_dims, + expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(TestShape4) +{ + int input_shape[] = { 2, 2, 2, 3 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int output_dims[] = { 3, 1, 1, 1 }; + int32_t expected_output_data[] = { 2, 2, 3 }; + int32_t output_data[3]; + + tflite::testing::TestShape(input_shape, input_values, output_dims, + expected_output_data, output_data); +} + +TF_LITE_MICRO_TEST(TestShape5) +{ + int input_shape[] = { 1, 1 }; + float input_values[] = { 1 }; + int output_dims[] = { 1, 1 }; + int32_t expected_output_data[] = { 1 }; + int32_t output_data[1]; + + tflite::testing::TestShape(input_shape, input_values, output_dims, + expected_output_data, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.cc new file mode 100644 index 00000000..a7b76862 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.cc @@ -0,0 +1,99 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/softmax.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/softmax.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +void SoftmaxQuantized(const TfLiteEvalTensor *input, TfLiteEvalTensor *output, + const SoftmaxParams &op_data) +{ + if (input->type == kTfLiteInt8) { + if (output->type == kTfLiteInt16) { + tflite::reference_ops::Softmax( + op_data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + tflite::reference_ops::Softmax( + op_data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + } else { + tflite::reference_ops::SoftmaxInt16( + op_data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } +} + +TfLiteStatus SoftmaxEval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + TfLiteEvalTensor *output = tflite::micro::GetEvalOutput(context, node, 0); + + TFLITE_DCHECK(node->user_data != nullptr); + SoftmaxParams op_data = *static_cast(node->user_data); + + switch (input->type) { + case kTfLiteFloat32: { + tflite::reference_ops::Softmax( + op_data, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } + case kTfLiteInt8: + case kTfLiteInt16: { + SoftmaxQuantized(input, output, op_data); + return kTfLiteOk; + } + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } +} +} // namespace + +TfLiteRegistration Register_SOFTMAX() +{ + return { /*init=*/SoftmaxInit, + /*free=*/nullptr, + /*prepare=*/SoftmaxPrepare, + /*invoke=*/SoftmaxEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.h new file mode 100644 index 00000000..d2954b76 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax.h @@ -0,0 +1,45 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_SOFTMAX_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_SOFTMAX_H_ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" + +namespace tflite { +void *SoftmaxInit(TfLiteContext *context, const char *buffer, size_t length); + +TfLiteStatus SoftmaxPrepare(TfLiteContext *context, TfLiteNode *node); + +// This is the most generic TfLiteRegistration. The actual supported types may +// still be target dependent. The only requirement is that every implementation +// (reference or optimized) must define this function. +TfLiteRegistration Register_SOFTMAX(); + +#if defined(XTENSA) +// Returns a TfLiteRegistration struct for kernel variant that only supports +// int8 input and int16 output. +TfLiteRegistration Register_SOFTMAX_INT8_INT16(); +#else +inline TfLiteRegistration Register_SOFTMAX_INT8_INT16() +{ + return Register_SOFTMAX(); +} +#endif + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_SOFTMAX_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_common.cc new file mode 100644 index 00000000..65370d60 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_common.cc @@ -0,0 +1,143 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/softmax.h" + +namespace tflite { + +namespace { +// Softmax parameter data that persists in user_data +const int kInt16LUTArraySize = 513; + +TfLiteStatus CalculateSoftmaxParams(TfLiteContext *context, + const TfLiteTensor *input, + TfLiteTensor *output, + const TfLiteSoftmaxParams *params, + SoftmaxParams *op_data) +{ + if (input->type == kTfLiteInt8 || input->type == kTfLiteInt16) { + if (input->type == kTfLiteInt16) { + TF_LITE_ENSURE_EQ(context, output->params.zero_point, 0); + TF_LITE_ENSURE_NEAR(context, output->params.scale, 1.f / 32768, + (0.001f * 1.f / 32768)); + } else { // input->type == kTfLiteInt8 + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteInt8); + if (output->type == kTfLiteInt16) { + TF_LITE_ENSURE_EQ(context, output->params.zero_point, -32768); + TF_LITE_ENSURE_NEAR(context, output->params.scale, 1.f / 65536, + (0.001f * 1.f / 65536)); + } else { // output->type == kTfLiteint8 + TF_LITE_ENSURE_TYPES_EQ(context, output->type, kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, output->params.zero_point, -128); + TF_LITE_ENSURE(context, output->params.scale == 1.f / 256); + } + } + + static const int kScaledDiffIntegerBits = 5; + + // Calculate input_multiplier and input_left_shift + if (input->type == kTfLiteInt16) { + int input_left_shift; + double input_scale_beta_rescale = + static_cast(input->params.scale) * + static_cast(params->beta) / + (10.0 / 65535.0); // scale the input_diff such that [-65535, 0] + // correspond to [-10.0, 0.0] + QuantizeMultiplier(input_scale_beta_rescale, &op_data->input_multiplier, + &input_left_shift); + op_data->input_left_shift = input_left_shift; + } else { + int input_left_shift; + tflite::PreprocessSoftmaxScaling( + static_cast(params->beta), + static_cast(input->params.scale), kScaledDiffIntegerBits, + &op_data->input_multiplier, &input_left_shift); + op_data->input_left_shift = input_left_shift; + op_data->diff_min = + -1.0 * tflite::CalculateInputRadius(kScaledDiffIntegerBits, + op_data->input_left_shift); + } + } else { + TF_LITE_ENSURE_TYPES_EQ(context, input->type, kTfLiteFloat32); + TF_LITE_ENSURE_TYPES_EQ(context, output->type, kTfLiteFloat32); + op_data->beta = static_cast(params->beta); + } + return kTfLiteOk; +} + +} // namespace + +void *SoftmaxInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(SoftmaxParams)); +} + +TfLiteStatus SoftmaxPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input = GetInput(context, node, 0); + TF_LITE_ENSURE(context, input != nullptr); + TF_LITE_ENSURE(context, NumDimensions(input) >= 1); + TfLiteTensor *output = GetOutput(context, node, 0); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE(context, node->user_data != nullptr); + SoftmaxParams *op_data = static_cast(node->user_data); + // Only allocate LUTs for KTfLiteInt16 data type + if (input->type == kTfLiteInt16) { + void *raw_exp_lut = context->AllocatePersistentBuffer( + context, sizeof(int16_t) * kInt16LUTArraySize); + TF_LITE_ENSURE(context, raw_exp_lut != nullptr); + op_data->exp_lut = reinterpret_cast(raw_exp_lut); + void *one_over_one_plus_x_lut = context->AllocatePersistentBuffer( + context, sizeof(int16_t) * kInt16LUTArraySize); + TF_LITE_ENSURE(context, one_over_one_plus_x_lut != nullptr); + op_data->one_over_one_plus_x_lut = + reinterpret_cast(one_over_one_plus_x_lut); + } + + if (output->type == kTfLiteInt16) { + TF_LITE_ENSURE(context, + input->type == kTfLiteInt8 || input->type == kTfLiteInt16); + } else { + TF_LITE_ENSURE_EQ(context, input->type, output->type); + } + + // Populate LUT if required + if (input->type == kTfLiteInt16) { + TF_LITE_ENSURE_EQ(context, output->params.zero_point, 0); + // exp LUT only used on negative values + // we consider exp(-10.0) is insignificant to accumulation + gen_lut([](float value) { return std::exp(value); }, -10.0f, 0.0f, + op_data->exp_lut, kInt16LUTArraySize); + gen_lut([](float value) { return 1.0f / (1.0f + value); }, 0.0f, 1.0f, + op_data->one_over_one_plus_x_lut, kInt16LUTArraySize); + op_data->zero_point = output->params.zero_point; + op_data->scale = output->params.scale; + } + + auto *params = static_cast(node->builtin_data); + return CalculateSoftmaxParams(context, input, output, params, op_data); +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_test.cc new file mode 100644 index 00000000..1fb1adbc --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/softmax_test.cc @@ -0,0 +1,509 @@ +/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// The Softmax kernel assumes an output in the range [0, 1.0], leading to these +// quantization parameters. +const float output_scale_int8 = 1.0f / 256.0f; +const float output_scale_int16 = 1.0f / 32768.0f; +const int output_zero_point_int8 = -128; +const int output_zero_point_int16 = 0; + +// Empirical tolerance in quantization space +const float tolerance_int16 = 7.0; + +// 1-dimensional test data. +const int flat_size_1d = 5; +int shape_1d[] = { 1, 5 }; +const float input_data_1d[] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; +const float golden_1d[] = { 0.011656231, 0.031684921, 0.086128544, 0.234121657, + 0.636408647 }; + +// 2-dimensional test data. +const int flat_size_2d = 10; +int shape_2d[] = { 2, 2, 5 }; +const float input_data_2d[] = { 1.0, 2.0, 3.0, 4.0, 5.0, + -1.0, -2.0, -3.0, -4.0, -5.0 }; +const float golden_2d[] = { 0.011656231, 0.031684921, 0.086128544, 0.234121657, + 0.636408647, 0.636408647, 0.234121657, 0.086128544, + 0.031684921, 0.011656231 }; + +// 3-dimensional test data. +const int flat_size_3d = 60; +int shape_3d[] = { 3, 3, 4, 5 }; +const float input_data_3d[] = { + // c = 0 + // h = 0 + 3.00, 6.00, -5.00, 4.00, -9.00, + // h = 1 + -10.00, -10.00, -8.00, 2.00, 2.00, + // h = 2 + 8.00, -5.00, -8.00, 5.00, -6.00, + // h = 3 + -8.00, 6.00, 1.00, -10.00, -8.00, + + // c = 1 + // h = 0 + 7.00, 6.00, -10.00, -4.00, -5.00, + // h = 1 + 2.00, 7.00, 9.00, -9.00, 7.00, + // h = 2 + -4.00, -2.00, 8.00, 2.00, 2.00, + // h = 3 + 3.00, 6.00, 6.00, 2.00, 4.00, + + // c = 2 + // h = 0 + 9.00, 7.00, -7.00, 0.00, 4.00, + // h = 1 + -3.00, 8.00, 8.00, -3.00, -4.00, + // h = 2 + -9.00, -9.00, 4.00, -8.00, -1.00, + // h = 3 + -10.00, -2.00, 6.00, -7.00, 0.00 +}; + +float golden_3d[] = { + // c = 0 + // h = 0 + 0.042009463, 0.843782625, 0.000014093, 0.114193561, 0.000000258, + // h = 1 + 0.000003072, 0.000003072, 0.000022699, 0.499985578, 0.499985578, + // h = 2 + 0.952571219, 0.000002153, 0.000000107, 0.047425728, 0.000000792, + // h = 3 + 0.000000826, 0.993305397, 0.006692839, 0.000000112, 0.000000826, + + // c = 1 + // h = 0 + 0.731046347, 0.268936922, 0.000000030, 0.000012210, 0.000004492, + // h = 1 + 0.000717124, 0.106430599, 0.786421666, 0.000000012, 0.106430599, + // h = 2 + 0.000006114, 0.000045174, 0.995015917, 0.002466398, 0.002466398, + // h = 3 + 0.022595176, 0.453836234, 0.453836234, 0.008312301, 0.061420055, + + // c = 2 + // h = 0 + 0.875505904, 0.118486839, 0.000000099, 0.000108046, 0.005899112, + // h = 1 + 0.000008351, 0.499990113, 0.499990113, 0.000008351, 0.000003072, + // h = 2 + 0.000002245, 0.000002245, 0.993296627, 0.000006103, 0.006692780, + // h = 3 + 0.000000112, 0.000334520, 0.997191323, 0.000002254, 0.002471790 +}; + +// 4-dimensional test data. +const int flat_size_4d = 120; +int shape_4d[] = { 4, 2, 3, 4, 5 }; +const float input_data_4d[] = { + // n = 0 + // c = 0 + // h = 0 + 3.00, 6.00, -5.00, 4.00, -9.00, + // h = 1 + -10.00, -10.00, -8.00, 2.00, 2.00, + // h = 2 + 8.00, -5.00, -8.00, 5.00, -6.00, + // h = 3 + -8.00, 6.00, 1.00, -10.00, -8.00, + + // c = 1 + // h = 0 + 7.00, 6.00, -10.00, -4.00, -5.00, + // h = 1 + 2.00, 7.00, 9.00, -9.00, 7.00, + // h = 2 + -4.00, -2.00, 8.00, 2.00, 2.00, + // h = 3 + 3.00, 6.00, 6.00, 2.00, 4.00, + + // c = 2 + // h = 0 + 9.00, 7.00, -7.00, 0.00, 4.00, + // h = 1 + -3.00, 8.00, 8.00, -3.00, -4.00, + // h = 2 + -9.00, -9.00, 4.00, -8.00, -1.00, + // h = 3 + -10.00, -2.00, 6.00, -7.00, 0.00, + + // n = 1 + // c = 0 + // h = 0 + -9.00, -8.00, 6.00, -1.00, -5.00, + // h = 1 + -10.00, -5.00, -10.00, 7.00, -2.00, + // h = 2 + -5.00, -4.00, 1.00, 2.00, 2.00, + // h = 3 + -2.00, -2.00, 1.00, 1.00, -4.00, + + // c = 1 + // h = 0 + -8.00, -3.00, 1.00, 1.00, -1.00, + // h = 1 + -2.00, 6.00, -1.00, -5.00, 6.00, + // h = 2 + -7.00, 8.00, 9.00, 0.00, 9.00, + // h = 3 + -9.00, -5.00, -2.00, 0.00, 8.00, + + // c = 2 + // h = 0 + 4.00, 2.00, -3.00, 5.00, 8.00, + // h = 1 + -1.00, 1.00, -4.00, -9.00, 7.00, + // h = 2 + 3.00, -8.00, 0.00, 9.00, -4.00, + // h = 3 + 8.00, -1.00, 9.00, -9.00, 1.00 +}; + +const float golden_4d[] = { + // n = 0 + // c = 0 + // h = 0 + 0.042009463, 0.843782625, 0.000014093, 0.114193561, 0.000000258, + // h = 1 + 0.000003072, 0.000003072, 0.000022699, 0.499985578, 0.499985578, + // h = 2 + 0.952571219, 0.000002153, 0.000000107, 0.047425728, 0.000000792, + // h = 3 + 0.000000826, 0.993305397, 0.006692839, 0.000000112, 0.000000826, + + // c = 1 + // h = 0 + 0.731046347, 0.268936922, 0.000000030, 0.000012210, 0.000004492, + // h = 1 + 0.000717124, 0.106430599, 0.786421666, 0.000000012, 0.106430599, + // h = 2 + 0.000006114, 0.000045174, 0.995015917, 0.002466398, 0.002466398, + // h = 3 + 0.022595176, 0.453836234, 0.453836234, 0.008312301, 0.061420055, + + // c = 2 + // h = 0 + 0.875505904, 0.118486839, 0.000000099, 0.000108046, 0.005899112, + // h = 1 + 0.000008351, 0.499990113, 0.499990113, 0.000008351, 0.000003072, + // h = 2 + 0.000002245, 0.000002245, 0.993296627, 0.000006103, 0.006692780, + // h = 3 + 0.000000112, 0.000334520, 0.997191323, 0.000002254, 0.002471790, + + // n = 1 + // c = 0 + // h = 0 + 0.000000306, 0.000000831, 0.999071142, 0.000911035, 0.000016686, + // h = 1 + 0.000000041, 0.000006143, 0.000000041, 0.999870380, 0.000123394, + // h = 2 + 0.000384554, 0.001045327, 0.155140254, 0.421714933, 0.421714933, + // h = 3 + 0.023637081, 0.023637081, 0.474763454, 0.474763454, 0.003198931, + + // c = 1 + // h = 0 + 0.000057299, 0.008503973, 0.464301197, 0.464301197, 0.062836334, + // h = 1 + 0.000167625, 0.499684188, 0.000455653, 0.000008346, 0.499684188, + // h = 2 + 0.000000048, 0.155354299, 0.422296769, 0.000052116, 0.422296769, + // h = 3 + 0.000000041, 0.000002259, 0.000045383, 0.000335334, 0.999616982, + + // c = 2 + // h = 0 + 0.017107856, 0.002315297, 0.000015600, 0.046503973, 0.934057274, + // h = 1 + 0.000334516, 0.002471755, 0.000016655, 0.000000112, 0.997176963, + // h = 2 + 0.002472313, 0.000000041, 0.000123089, 0.997402302, 0.000002254, + // h = 3 + 0.268866557, 0.000033181, 0.730855076, 0.000000011, 0.000245175 +}; + +template +void ValidateSoftmaxGoldens(TfLiteTensor *tensors, const int tensor_count, + T *output_data, const T *expected_output, + int output_dims_count, float tolerance) +{ + TfLiteSoftmaxParams builtin_data = { 1.0f }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_SOFTMAX(); + micro::KernelRunner runner(registration, tensors, tensor_count, inputs_array, + outputs_array, &builtin_data); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output[i], output_data[i], tolerance); + } +} + +void TestSoftmaxFloat(int *input_dims_data, const float *input_data, + int *output_dims_data, const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateSoftmaxGoldens(tensors, tensors_size, output_data, + expected_output_data, output_dims_count, 1e-5); +} + +template +void TestSoftmaxQuantized(int *input_dims_data, const float *input_data, + inputT *input_quantized, float input_scale, + int input_zero_point, int *output_dims_data, + const float *golden, outputT *golden_quantized, + float output_scale, int output_zero_point, + outputT *output_data, float tolerance = 1.0) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point), + }; + + Quantize(golden, golden_quantized, output_dims_count, output_scale, + output_zero_point); + + ValidateSoftmaxGoldens(tensors, tensors_size, output_data, golden_quantized, + output_dims_count, tolerance); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(Softmax1DFloatShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_1d]; + tflite::testing::TestSoftmaxFloat( + tflite::testing ::shape_1d, tflite::testing::input_data_1d, + tflite::testing::shape_1d, tflite::testing::golden_1d, output_data); +} + +TF_LITE_MICRO_TEST(Softmax1DQuantizedInt8ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int8_t input_quantized[tflite::testing::flat_size_1d]; + int8_t golden_quantized[tflite::testing::flat_size_1d]; + int8_t output_data[tflite::testing::flat_size_1d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_1d, tflite::testing::input_data_1d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_1d, + tflite::testing::golden_1d, golden_quantized, + tflite::testing::output_scale_int8, + tflite::testing::output_zero_point_int8, output_data); +} + +TF_LITE_MICRO_TEST(Softmax1DQuantizedInt16ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int16_t input_quantized[tflite::testing::flat_size_1d]; + int16_t golden_quantized[tflite::testing::flat_size_1d]; + int16_t output_data[tflite::testing::flat_size_1d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_1d, tflite::testing::input_data_1d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_1d, + tflite::testing::golden_1d, golden_quantized, + tflite::testing::output_scale_int16, + tflite::testing::output_zero_point_int16, output_data); +} + +TF_LITE_MICRO_TEST(Softmax2DFloatShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_2d]; + tflite::testing::TestSoftmaxFloat( + tflite::testing ::shape_2d, tflite::testing::input_data_2d, + tflite::testing::shape_2d, tflite::testing::golden_2d, output_data); +} + +TF_LITE_MICRO_TEST(Softmax2DQuantizedInt8ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int8_t input_quantized[tflite::testing::flat_size_2d]; + int8_t golden_quantized[tflite::testing::flat_size_2d]; + int8_t output_data[tflite::testing::flat_size_2d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_2d, tflite::testing::input_data_2d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_2d, + tflite::testing::golden_2d, golden_quantized, + tflite::testing::output_scale_int8, + tflite::testing::output_zero_point_int8, output_data); +} + +TF_LITE_MICRO_TEST(Softmax2DQuantizedInt16ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int16_t input_quantized[tflite::testing::flat_size_2d]; + int16_t golden_quantized[tflite::testing::flat_size_2d]; + int16_t output_data[tflite::testing::flat_size_2d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_2d, tflite::testing::input_data_2d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_2d, + tflite::testing::golden_2d, golden_quantized, + tflite::testing::output_scale_int16, + tflite::testing::output_zero_point_int16, output_data); +} + +TF_LITE_MICRO_TEST(Softmax3DFloatShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_3d]; + tflite::testing::TestSoftmaxFloat( + tflite::testing ::shape_3d, tflite::testing::input_data_3d, + tflite::testing::shape_3d, tflite::testing::golden_3d, output_data); +} + +TF_LITE_MICRO_TEST(Softmax3DQuantizedInt8ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int8_t input_quantized[tflite::testing::flat_size_3d]; + int8_t golden_quantized[tflite::testing::flat_size_3d]; + int8_t output_data[tflite::testing::flat_size_3d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_3d, tflite::testing::input_data_3d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_3d, + tflite::testing::golden_3d, golden_quantized, + tflite::testing::output_scale_int8, + tflite::testing::output_zero_point_int8, output_data); +} + +TF_LITE_MICRO_TEST(Softmax3DQuantizedInt16ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int16_t input_quantized[tflite::testing::flat_size_3d]; + int16_t golden_quantized[tflite::testing::flat_size_3d]; + int16_t output_data[tflite::testing::flat_size_3d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_3d, tflite::testing::input_data_3d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_3d, + tflite::testing::golden_3d, golden_quantized, + tflite::testing::output_scale_int16, + tflite::testing::output_zero_point_int16, output_data, + tflite::testing::tolerance_int16); +} + +TF_LITE_MICRO_TEST(Softmax4DFloatShouldMatchGolden) +{ + float output_data[tflite::testing::flat_size_4d]; + tflite::testing::TestSoftmaxFloat( + tflite::testing ::shape_4d, tflite::testing::input_data_4d, + tflite::testing::shape_4d, tflite::testing::golden_4d, output_data); +} + +TF_LITE_MICRO_TEST(Softmax4DQuantizedInt8ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int8_t input_quantized[tflite::testing::flat_size_4d]; + int8_t golden_quantized[tflite::testing::flat_size_4d]; + int8_t output_data[tflite::testing::flat_size_4d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_4d, tflite::testing::input_data_4d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_4d, + tflite::testing::golden_4d, golden_quantized, + tflite::testing::output_scale_int8, + tflite::testing::output_zero_point_int8, output_data); +} + +TF_LITE_MICRO_TEST(Softmax4DQuantizedInt16ShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + + int16_t input_quantized[tflite::testing::flat_size_4d]; + int16_t golden_quantized[tflite::testing::flat_size_4d]; + int16_t output_data[tflite::testing::flat_size_4d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_4d, tflite::testing::input_data_4d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_4d, + tflite::testing::golden_4d, golden_quantized, + tflite::testing::output_scale_int16, + tflite::testing::output_zero_point_int16, output_data, + tflite::testing::tolerance_int16); +} + +TF_LITE_MICRO_TEST(Softmax2DQuantizedInt8InputInt16OutputShouldMatchGolden) +{ + const float input_scale = 0.1f; + const int input_zero_point = 0; + const float output_scale = 1.0f / 65536.0f; + const int output_zero_point = -32768; + + int8_t input_quantized[tflite::testing::flat_size_2d]; + int16_t golden_quantized[tflite::testing::flat_size_2d]; + int16_t output_data[tflite::testing::flat_size_2d]; + tflite::testing::TestSoftmaxQuantized( + tflite::testing::shape_2d, tflite::testing::input_data_2d, + input_quantized, input_scale, input_zero_point, tflite::testing::shape_2d, + tflite::testing::golden_2d, golden_quantized, output_scale, + output_zero_point, output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd.cc new file mode 100644 index 00000000..0ec8a173 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd.cc @@ -0,0 +1,125 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/space_to_batch_nd.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { + +namespace { + +constexpr int kInputTensor = 0; +constexpr int kBlockShapeTensor = 1; +constexpr int kCropsTensor = 2; +constexpr int kOutputTensor = 0; + +// Currently, only 3D NHC and 4D NHWC input/output op_context are supported. +// In case of 3D input, it will be extended to 3D NHWC by adding W=1. +// The 4D array need to have exactly 2 spatial dimensions. +// TODO(b/149952582): Support arbitrary dimension in SpaceToBatchND. +const int kInputOutputMinDimensionNum = 3; +const int kInputOutputMaxDimensionNum = 4; + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(SpaceToBatchParams)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 3); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, input != nullptr && output != nullptr); + + TF_LITE_ENSURE(context, NumDimensions(input) >= kInputOutputMinDimensionNum); + TF_LITE_ENSURE(context, NumDimensions(output) >= kInputOutputMinDimensionNum); + TF_LITE_ENSURE(context, NumDimensions(input) <= kInputOutputMaxDimensionNum); + TF_LITE_ENSURE(context, NumDimensions(output) <= kInputOutputMaxDimensionNum); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const SpaceToBatchParams ¶ms = + *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *block_shape = + tflite::micro::GetEvalInput(context, node, kBlockShapeTensor); + const TfLiteEvalTensor *crops = + tflite::micro::GetEvalInput(context, node, kCropsTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: + reference_ops::SpaceToBatchND( + params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(block_shape), + tflite::micro::GetTensorData(block_shape), + tflite::micro::GetTensorShape(crops), + tflite::micro::GetTensorData(crops), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt8: + reference_ops::SpaceToBatchND( + params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(block_shape), + tflite::micro::GetTensorData(block_shape), + tflite::micro::GetTensorShape(crops), + tflite::micro::GetTensorData(crops), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace. + +TfLiteRegistration Register_SPACE_TO_BATCH_ND() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd_test.cc new file mode 100644 index 00000000..bc639497 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_batch_nd_test.cc @@ -0,0 +1,160 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int kBasicInputOutputSize = 16; +int basic_input_dims[] = { 4, 1, 4, 4, 1 }; +const float basic_input[kBasicInputOutputSize] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 +}; +int basic_block_shape_dims[] = { 1, 2 }; +const int32_t basic_block_shape[] = { 2, 2 }; +int basic_crops_dims[] = { 1, 4 }; +const int32_t basic_crops[] = { 0, 0, 0, 0 }; +int basic_output_dims[] = { 4, 4, 2, 2, 1 }; +const float basic_golden[kBasicInputOutputSize] = { 1, 3, 9, 11, 2, 4, 10, 12, + 5, 7, 13, 15, 6, 8, 14, 16 }; + +template +TfLiteStatus ValidateSpaceToBatchNdGoldens(TfLiteTensor *tensors, + int tensors_size, const T *golden, + T *output, int output_size) +{ + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_SPACE_TO_BATCH_ND(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_ENSURE_STATUS(runner.InitAndPrepare()); + TF_LITE_ENSURE_STATUS(runner.Invoke()); + + for (int i = 0; i < output_size; ++i) { + // TODO(b/158102673): workaround for not having fatal test assertions. + TF_LITE_MICRO_EXPECT_EQ(golden[i], output[i]); + if (golden[i] != output[i]) { + return kTfLiteError; + } + } + return kTfLiteOk; +} + +TfLiteStatus TestSpaceToBatchNdFloat( + int *input_dims_data, const float *input_data, int *block_shape_dims_data, + const int32_t *block_shape_data, int *crops_dims_data, + const int32_t *crops_data, int *output_dims_data, const float *golden, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *block_shape_dims = IntArrayFromInts(block_shape_dims_data); + TfLiteIntArray *crops_dims = IntArrayFromInts(crops_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(block_shape_data, block_shape_dims), + CreateTensor(crops_data, crops_dims), + CreateTensor(output_data, output_dims), + }; + + return ValidateSpaceToBatchNdGoldens(tensors, tensors_size, golden, + output_data, ElementCount(*output_dims)); +} + +template +TfLiteStatus TestSpaceToBatchNdQuantized( + int *input_dims_data, const float *input_data, T *input_quantized, + float input_scale, int input_zero_point, int *block_shape_dims_data, + const int32_t *block_shape_data, int *crops_dims_data, + const int32_t *crops_data, int *output_dims_data, const float *golden, + T *golden_quantized, float output_scale, int output_zero_point, + T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *block_shape_dims = IntArrayFromInts(block_shape_dims_data); + TfLiteIntArray *crops_dims = IntArrayFromInts(crops_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 3; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input_data, input_quantized, + input_dims, input_scale, + input_zero_point), + tflite::testing::CreateTensor(block_shape_data, block_shape_dims), + tflite::testing::CreateTensor(crops_data, crops_dims), + tflite::testing::CreateQuantizedTensor(output_data, output_dims, + output_scale, output_zero_point), + }; + tflite::Quantize(golden, golden_quantized, ElementCount(*output_dims), + output_scale, output_zero_point); + + return ValidateSpaceToBatchNdGoldens(tensors, tensors_size, golden_quantized, + output_data, ElementCount(*output_dims)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SpaceToBatchBasicFloat) +{ + float output[tflite::testing::kBasicInputOutputSize]; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestSpaceToBatchNdFloat( + tflite::testing::basic_input_dims, tflite::testing::basic_input, + tflite::testing::basic_block_shape_dims, + tflite::testing::basic_block_shape, tflite::testing::basic_crops_dims, + tflite::testing::basic_crops, tflite::testing::basic_output_dims, + tflite::testing::basic_golden, output)); +} + +TF_LITE_MICRO_TEST(SpaceToBatchBasicInt8) +{ + int8_t output[tflite::testing::kBasicInputOutputSize]; + int8_t input_quantized[tflite::testing::kBasicInputOutputSize]; + int8_t golden_quantized[tflite::testing::kBasicInputOutputSize]; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestSpaceToBatchNdQuantized( + tflite::testing::basic_input_dims, tflite::testing::basic_input, + input_quantized, 1.0f, 0, tflite::testing::basic_block_shape_dims, + tflite::testing::basic_block_shape, tflite::testing::basic_crops_dims, + tflite::testing::basic_crops, tflite::testing::basic_output_dims, + tflite::testing::basic_golden, golden_quantized, 1.0f, 0, output)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth.cc new file mode 100644 index 00000000..5e114290 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth.cc @@ -0,0 +1,131 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/space_to_depth.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { + +namespace { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; +constexpr int kBatchRank = 0; +constexpr int kHeightRank = 1; +constexpr int kWidthRank = 2; +constexpr int kDepthRank = 3; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = + reinterpret_cast(node->builtin_data); + + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + + TF_LITE_ENSURE_EQ(context, NumDimensions(input), 4); + + auto data_type = output->type; + TF_LITE_ENSURE(context, + data_type == kTfLiteFloat32 || data_type == kTfLiteInt8); + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + const int block_size = params->block_size; + const int input_height = input->dims->data[kHeightRank]; + const int input_width = input->dims->data[kWidthRank]; + int output_height = input_height / block_size; + int output_width = input_width / block_size; + + TF_LITE_ENSURE_EQ(context, input_height, output_height * block_size); + TF_LITE_ENSURE_EQ(context, input_width, output_width * block_size); + + // Relocate dims to the persistent storage arena before changing them, + // otherwise we'd be modifying temporary copies made by the interpreters each + // time they process the layer. + TfLiteEvalTensor *output_eval = + micro::GetEvalOutput(context, node, kOutputTensor); + TF_LITE_ENSURE_OK(context, micro::CreateWritableTensorDimsWithCopy( + context, output, output_eval)); + + output->dims->data[kBatchRank] = input->dims->data[kBatchRank]; + output->dims->data[kHeightRank] = output_height; + output->dims->data[kWidthRank] = output_width; + output->dims->data[kDepthRank] = + input->dims->data[kDepthRank] * block_size * block_size; + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = + reinterpret_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = micro::GetEvalOutput(context, node, kOutputTensor); + + SpaceToDepthParams op_params; + op_params.block_size = params->block_size; + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: + reference_ops::SpaceToDepth(op_params, micro::GetTensorShape(input), + micro::GetTensorData(input), + micro::GetTensorShape(output), + micro::GetTensorData(output)); + break; + case kTfLiteInt8: + reference_ops::SpaceToDepth(op_params, micro::GetTensorShape(input), + micro::GetTensorData(input), + micro::GetTensorShape(output), + micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG( + context, "SPACE_TO_DEPTH only supports FLOAT32 and INT8, got %s.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_SPACE_TO_DEPTH() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth_test.cc new file mode 100644 index 00000000..6740f013 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/space_to_depth_test.cc @@ -0,0 +1,192 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +using tflite::ElementCount; +using tflite::testing::CreateTensor; +using tflite::testing::IntArrayFromInts; + +namespace { + +void ExpectEq(TfLiteIntArray *a, TfLiteIntArray *b) +{ + for (int i = 0; i < a->size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(a->data[i], b->data[i]); + } +} + +template +void ExpectNear(const T a[], const T b[], int size, float tolerance = 1e-5) +{ + for (int i = 0; i < size; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(a[i], b[i], tolerance); + } +} + +template +constexpr int ArrayLength(const T &) +{ + return std::extent::value; +} + +template +struct SpaceToDepthTest { + int *input_dims; + const T *input_data; + int block_size; + int *expect_dims; + const T *expect_data; + T *output_data; +}; + +template +void TestSpaceToDepth(const SpaceToDepthTest &args) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(args.input_dims); + constexpr int kOutputDims = 4; + int output_dims_data[] = { kOutputDims, 0, 0, 0, 0 }; + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + TfLiteTensor tensors[] = { CreateTensor(args.input_data, input_dims), + CreateTensor(args.output_data, output_dims) }; + + const TfLiteRegistration registration = tflite::Register_SPACE_TO_DEPTH(); + constexpr int tensor_count = ArrayLength(tensors); + constexpr int kInputIndex = 0; + int input_indexes_data[] = { 1, kInputIndex }; + TfLiteIntArray *input_indexes = IntArrayFromInts(input_indexes_data); + constexpr int kOutputIndex = 1; + int output_indexes_data[] = { 1, kOutputIndex }; + TfLiteIntArray *output_indexes = IntArrayFromInts(output_indexes_data); + TfLiteSpaceToDepthParams op_params = {}; + op_params.block_size = args.block_size; + + tflite::micro::KernelRunner runner(registration, tensors, tensor_count, + input_indexes, output_indexes, + static_cast(&op_params)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + const TfLiteTensor *output_tensor = &tensors[kOutputIndex]; + TfLiteIntArray *expect_dims = IntArrayFromInts(args.expect_dims); + ExpectEq(output_tensor->dims, expect_dims); + ExpectNear(args.output_data, args.expect_data, ElementCount(*expect_dims)); +} + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SpaceToDepth_Float32_1222) +{ + using value_type = float; + SpaceToDepthTest test; + + int input_dims[] = { 4, 1, 2, 2, 2 }; + test.input_dims = input_dims; + constexpr value_type kInputData[] = { 1.4, 2.3, 3.2, 4.1, 5.4, 6.3, 7.2, 8.1 }; + test.input_data = kInputData; + + test.block_size = 2; + + int expect_dims[] = { 4, 1, 1, 1, 8 }; + test.expect_dims = expect_dims; + test.expect_data = kInputData; + + constexpr int kExpectElements = ArrayLength(kInputData); + value_type output_data[kExpectElements]; + test.output_data = output_data; + + TestSpaceToDepth(test); +} + +TF_LITE_MICRO_TEST(SpaceToDepth_Int8_1221) +{ + using value_type = int8_t; + SpaceToDepthTest test; + + int input_dims[] = { 4, 1, 2, 2, 1 }; + test.input_dims = input_dims; + constexpr value_type kInputData[] = { 1, 2, 3, 4 }; + test.input_data = kInputData; + + test.block_size = 2; + + int expect_dims[] = { 4, 1, 1, 1, 4 }; + test.expect_dims = expect_dims; + test.expect_data = kInputData; + + constexpr int kExpectElements = ArrayLength(kInputData); + value_type output_data[kExpectElements]; + test.output_data = output_data; + + TestSpaceToDepth(test); +} + +TF_LITE_MICRO_TEST(SpaceToDepth_Int8_1223) +{ + using value_type = int8_t; + SpaceToDepthTest test; + + int input_dims[] = { 4, 1, 2, 2, 3 }; + test.input_dims = input_dims; + constexpr value_type kInputData[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + test.input_data = kInputData; + + test.block_size = 2; + + int expect_dims[] = { 4, 1, 1, 1, 12 }; + test.expect_dims = expect_dims; + test.expect_data = kInputData; + + constexpr int kExpectElements = ArrayLength(kInputData); + value_type output_data[kExpectElements]; + test.output_data = output_data; + + TestSpaceToDepth(test); +} + +TF_LITE_MICRO_TEST(SpaceToDepth_Int8_1441) +{ + using value_type = int8_t; + SpaceToDepthTest test; + + int input_dims[] = { 4, 1, 4, 4, 1 }; + test.input_dims = input_dims; + constexpr value_type kInputData[] = { 1, 2, 5, 6, 3, 4, 7, 8, + 9, 10, 13, 14, 11, 12, 15, 16 }; + test.input_data = kInputData; + + test.block_size = 2; + + int expect_dims[] = { 4, 1, 2, 2, 4 }; + test.expect_dims = expect_dims; + constexpr value_type kExpectData[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + test.expect_data = kExpectData; + + constexpr int kExpectElements = ArrayLength(kInputData); + value_type output_data[kExpectElements]; + test.output_data = output_data; + + TestSpaceToDepth(test); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/split.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split.cc new file mode 100644 index 00000000..da5b4b48 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split.cc @@ -0,0 +1,140 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace split { + +template +TfLiteStatus SplitImpl(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input, int axis_value) +{ + const int output_count = NumOutputs(node); + const TfLiteIntArray *input_dims = input->dims; + const TfLiteEvalTensor *output0 = + tflite::micro::GetEvalOutput(context, node, 0); + const TfLiteIntArray *output_dims = output0->dims; + + const int split_dimensions = input_dims->size; + int axis = axis_value < 0 ? axis_value + split_dimensions : axis_value; + + TFLITE_DCHECK_LT(axis, split_dimensions); + TFLITE_DCHECK_EQ(output_dims->size, split_dimensions); + + int64_t split_size = output_dims->data[axis] * output_count; + + TFLITE_DCHECK_EQ(split_size, input_dims->data[axis]); + int64_t outer_size = 1; + for (int i = 0; i < axis; ++i) { + outer_size *= input_dims->data[i]; + } + + int64_t base_inner_size = 1; + for (int i = axis + 1; i < split_dimensions; ++i) { + base_inner_size *= input_dims->data[i]; + } + + const T *input_ptr = tflite::micro::GetTensorData(input); + for (int k = 0; k < outer_size; ++k) { + for (int i = 0; i < output_count; ++i) { + TfLiteEvalTensor *t = tflite::micro::GetEvalOutput(context, node, i); + T *output_data = tflite::micro::GetTensorData(t); + const int copy_size = output_dims->data[axis] * base_inner_size; + T *output_ptr = output_data + k * copy_size; + for (int j = 0; j < copy_size; ++j) + output_ptr[j] = input_ptr[j]; + input_ptr += copy_size; + } + } + + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *axis = GetInput(context, node, 0); + TF_LITE_ENSURE(context, axis != nullptr); + + // Dynamic output tensors are needed if axis tensor is not constant. + // But Micro doesn't support dynamic memory allocation, so we only support + // constant axis tensor for now. + TF_LITE_ENSURE_MSG(context, IsConstantTensor(axis), + "Non constant axis tensor not supported"); + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *axis = tflite::micro::GetEvalInput(context, node, 0); + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 1); + + int axis_value = tflite::micro::GetTensorData(axis)[0]; + if (axis_value < 0) { + axis_value += input->dims->size; + } + + TF_LITE_ENSURE(context, axis_value >= 0); + TF_LITE_ENSURE(context, axis_value < input->dims->size); + + switch (input->type) { + case kTfLiteFloat32: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteUInt8: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteInt8: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteInt16: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteInt32: { + return SplitImpl(context, node, input, axis_value); + } + default: + TF_LITE_KERNEL_LOG(context, "Type %s currently not supported.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } +#undef TF_LITE_SPLIT + + return kTfLiteOk; +} + +} // namespace split + +TfLiteRegistration Register_SPLIT() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/split::Prepare, + /*invoke=*/split::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_test.cc new file mode 100644 index 00000000..79885c01 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_test.cc @@ -0,0 +1,475 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/debug_log.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { + +void TestSplitTwoOutputsFloat(int *input_dims_data, const float *input_data, + int *axis_dims_data, const int32_t *axis_data, + int *output1_dims_data, + const float *expected_output1_data, + int *output2_dims_data, + const float *expected_output2_data, + float *output1_data, float *output2_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + + constexpr int input_size = 1; + constexpr int output_size = 2; + constexpr int axis_size = 1; + constexpr int tensors_size = input_size + output_size + axis_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(axis_data, axis_dims), CreateTensor(input_data, input_dims), + CreateTensor(output1_data, output1_dims), + CreateTensor(output2_data, output2_dims) + }; + + // Currently only support constant axis tensor. + tensors[0].allocation_type = kTfLiteMmapRo; + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 2, 2, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f); + } + + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f); + } +} + +void TestSplitFourOutputsFloat( + int *input_dims_data, const float *input_data, int *axis_dims_data, + const int32_t *axis_data, int *output1_dims_data, + const float *expected_output1_data, int *output2_dims_data, + const float *expected_output2_data, int *output3_dims_data, + const float *expected_output3_data, int *output4_dims_data, + const float *expected_output4_data, float *output1_data, + float *output2_data, float *output3_data, float *output4_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + TfLiteIntArray *output3_dims = IntArrayFromInts(output3_dims_data); + TfLiteIntArray *output4_dims = IntArrayFromInts(output4_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + const int output3_dims_count = ElementCount(*output3_dims); + const int output4_dims_count = ElementCount(*output4_dims); + + constexpr int input_size = 1; + constexpr int output_size = 4; + constexpr int axis_size = 1; + constexpr int tensors_size = input_size + output_size + axis_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(axis_data, axis_dims), + CreateTensor(input_data, input_dims), + CreateTensor(output1_data, output1_dims), + CreateTensor(output2_data, output2_dims), + CreateTensor(output3_data, output1_dims), + CreateTensor(output4_data, output1_dims) + }; + + // Currently only support constant axis tensor. + tensors[0].allocation_type = kTfLiteMmapRo; + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + for (int i = 0; i < output3_dims_count; ++i) { + output3_data[i] = 23; + } + for (int i = 0; i < output4_dims_count; ++i) { + output4_data[i] = 23; + } + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 4, 2, 3, 4, 5 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f); + } + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f); + } + for (int i = 0; i < output3_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output3_data[i], output3_data[i], 1e-5f); + } + for (int i = 0; i < output4_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output4_data[i], output4_data[i], 1e-5f); + } +} + +void TestSplitTwoOutputsQuantized( + int *input_dims_data, const uint8_t *input_data, int *axis_dims_data, + const int32_t *axis_data, int *output1_dims_data, + const uint8_t *expected_output1_data, int *output2_dims_data, + const uint8_t *expected_output2_data, uint8_t *output1_data, + uint8_t *output2_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + + constexpr int input_size = 1; + constexpr int output_size = 2; + constexpr int axis_size = 1; + constexpr int tensors_size = input_size + output_size + axis_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(axis_data, axis_dims), + CreateQuantizedTensor(input_data, input_dims, 0, 10), + CreateQuantizedTensor(output1_data, output1_dims, 0, 10), + CreateQuantizedTensor(output2_data, output2_dims, 0, 10) + }; + + // Currently only support constant axis tensor. + tensors[0].allocation_type = kTfLiteMmapRo; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 2, 2, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]); + } + + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]); + } +} + +void TestSplitTwoOutputsQuantized32( + int *input_dims_data, const int32_t *input_data, int *axis_dims_data, + const int32_t *axis_data, int *output1_dims_data, + const int32_t *expected_output1_data, int *output2_dims_data, + const int32_t *expected_output2_data, int32_t *output1_data, + int32_t *output2_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + + constexpr int input_size = 1; + constexpr int output_size = 2; + constexpr int axis_size = 1; + constexpr int tensors_size = input_size + output_size + axis_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(axis_data, axis_dims), CreateTensor(input_data, input_dims), + CreateTensor(output1_data, output1_dims), + CreateTensor(output2_data, output2_dims) + }; + + // Currently only support constant axis tensor. + tensors[0].allocation_type = kTfLiteMmapRo; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 2, 2, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]); + } + + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]); + } +} + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisZero) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 0 }; + int output1_shape[] = { 4, 1, 2, 2, 2 }; + const float golden1[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int output2_shape[] = { 4, 1, 2, 2, 2 }; + const float golden2[] = { 9, 10, 11, 12, 13, 14, 15, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisOne) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 1 }; + int output1_shape[] = { 4, 2, 1, 2, 2 }; + const float golden1[] = { 1, 2, 3, 4, 9, 10, 11, 12 }; + int output2_shape[] = { 4, 2, 1, 2, 2 }; + const float golden2[] = { 5, 6, 7, 8, 13, 14, 15, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisTwo) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 2 }; + int output1_shape[] = { 4, 2, 2, 1, 2 }; + const float golden1[] = { 1, 2, 5, 6, 9, 10, 13, 14 }; + int output2_shape[] = { 4, 2, 2, 1, 2 }; + const float golden2[] = { 3, 4, 7, 8, 11, 12, 15, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisThree) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 3 }; + int output1_shape[] = { 4, 2, 2, 2, 1 }; + const float golden1[] = { 1, 3, 5, 7, 9, 11, 13, 15 }; + int output2_shape[] = { 4, 2, 2, 2, 1 }; + const float golden2[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalNegativeAxis) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { -4 }; + int output1_shape[] = { 4, 1, 2, 2, 2 }; + const float golden1[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int output2_shape[] = { 4, 1, 2, 2, 2 }; + const float golden2[] = { 9, 10, 11, 12, 13, 14, 15, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(FourSplit) +{ + int input_shape[] = { 1, 4 }; + const float input_data[] = { 1, 2, 3, 4 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 0 }; + int output1_shape[] = { 1, 1 }; + const float golden1[] = { 1 }; + int output2_shape[] = { 1, 1 }; + const float golden2[] = { 2 }; + int output3_shape[] = { 1, 1 }; + const float golden3[] = { 3 }; + int output4_shape[] = { 1, 1 }; + const float golden4[] = { 4 }; + + constexpr int output1_dims_count = 1; + constexpr int output2_dims_count = 1; + constexpr int output3_dims_count = 1; + constexpr int output4_dims_count = 1; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + float output3_data[output3_dims_count]; + float output4_data[output4_dims_count]; + tflite::testing::TestSplitFourOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output3_shape, golden3, output4_shape, golden4, + output1_data, output2_data, output3_data, output4_data); +} + +TF_LITE_MICRO_TEST(TwoSplitOneDimensional) +{ + int input_shape[] = { 1, 2 }; + const float input_data[] = { 1, 2 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 0 }; + int output1_shape[] = { 1, 1 }; + const float golden1[] = { 1 }; + int output2_shape[] = { 1, 1 }; + const float golden2[] = { 2 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsFloat( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const uint8_t input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 1 }; + int output1_shape[] = { 4, 2, 1, 2, 2 }; + const uint8_t golden1[] = { 1, 2, 3, 4, 9, 10, 11, 12 }; + int output2_shape[] = { 4, 2, 1, 2, 2 }; + const uint8_t golden2[] = { 5, 6, 7, 8, 13, 14, 15, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + uint8_t output1_data[output1_dims_count]; + uint8_t output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsQuantized( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized32) +{ + int input_shape[] = { 4, 2, 2, 2, 2 }; + const int32_t input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + const int32_t axis_data[] = { 1 }; + int output1_shape[] = { 4, 2, 1, 2, 2 }; + const int32_t golden1[] = { 1, 2, 3, 4, 9, 10, 11, 12 }; + int output2_shape[] = { 4, 2, 1, 2, 2 }; + const int32_t golden2[] = { 5, 6, 7, 8, 13, 14, 15, 16 }; + + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + int32_t output1_data[output1_dims_count]; + int32_t output2_data[output2_dims_count]; + tflite::testing::TestSplitTwoOutputsQuantized32( + input_shape, input_data, axis_shape, axis_data, output1_shape, golden1, + output2_shape, golden2, output1_data, output2_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v.cc new file mode 100644 index 00000000..7af64426 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v.cc @@ -0,0 +1,140 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace split_v { + +template +TfLiteStatus SplitImpl(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input, int axis_value) +{ + const TfLiteIntArray *input_dims = input->dims; + const TfLiteEvalTensor *output0 = + tflite::micro::GetEvalOutput(context, node, 0); + + const int split_dimensions = input_dims->size; + + TFLITE_DCHECK_LT(axis_value, split_dimensions); + TFLITE_DCHECK_EQ(output0->dims->size, split_dimensions); + + int64_t split_size = 0; + const int output_count = NumOutputs(node); + for (int i = 0; i < output_count; i++) { + split_size += + tflite::micro::GetEvalOutput(context, node, i)->dims->data[axis_value]; + } + TFLITE_DCHECK_EQ(split_size, input_dims->data[axis_value]); + int64_t outer_size = 1; + for (int i = 0; i < axis_value; ++i) { + outer_size *= input_dims->data[i]; + } + + int64_t base_inner_size = 1; + for (int i = axis_value + 1; i < split_dimensions; ++i) { + base_inner_size *= input_dims->data[i]; + } + + const T *input_ptr = tflite::micro::GetTensorData(input); + for (int k = 0; k < outer_size; ++k) { + for (int i = 0; i < output_count; ++i) { + TfLiteEvalTensor *output_tensor = + tflite::micro::GetEvalOutput(context, node, i); + T *output_data = tflite::micro::GetTensorData(output_tensor); + const int copy_size = + output_tensor->dims->data[axis_value] * base_inner_size; + T *output_ptr = output_data + k * copy_size; + for (int j = 0; j < copy_size; ++j) + output_ptr[j] = input_ptr[j]; + input_ptr += copy_size; + } + } + + return kTfLiteOk; +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 3); + + // Dynamic output tensors are needed if axis tensor is not constant. + // But Micro doesn't support dynamic memory allocation, so we only support + // constant axis tensor for now. + const TfLiteTensor *axis = GetInput(context, node, 2); + TF_LITE_ENSURE_MSG(context, IsConstantTensor(axis), + "Non constant axis tensor not supported"); + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = tflite::micro::GetEvalInput(context, node, 0); + const TfLiteEvalTensor *axis = tflite::micro::GetEvalInput(context, node, 2); + + int axis_value = tflite::micro::GetTensorData(axis)[0]; + if (axis_value < 0) { + axis_value += input->dims->size; + } + + TF_LITE_ENSURE(context, axis_value >= 0); + TF_LITE_ENSURE(context, axis_value < input->dims->size); + + switch (input->type) { + case kTfLiteFloat32: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteInt8: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteInt16: { + return SplitImpl(context, node, input, axis_value); + } + case kTfLiteInt32: { + return SplitImpl(context, node, input, axis_value); + } + default: + TF_LITE_KERNEL_LOG(context, "Type %s currently not supported.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace split_v + +TfLiteRegistration Register_SPLIT_V() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/split_v::Prepare, + /*invoke=*/split_v::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v_test.cc new file mode 100644 index 00000000..c9762221 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/split_v_test.cc @@ -0,0 +1,478 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/debug_log.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { + +template +struct OutputTensors { + float *data[N]; + int *dims[N]; + float *expected_output_data[N]; +}; +template +void TestSplitVFloat(int *input_dims_data, const float *input_data, + int *axis_dims_data, const int32_t *axis_data, + int *split_dims_data, const int32_t *split_data, + const OutputTensors &output_tensors) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *axis_dims = IntArrayFromInts(axis_dims_data); + TfLiteIntArray *split_dims = IntArrayFromInts(split_dims_data); + TfLiteIntArray *output_dims[N]; + for (int i = 0; i < N; i++) + output_dims[i] = IntArrayFromInts(output_tensors.dims[i]); + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < N; i++) { + int dim_count = ElementCount(*output_dims[i]); + for (int j = 0; j < dim_count; j++) { + (output_tensors.data[i])[j] = 23; + } + } + constexpr int input_size = 1; + constexpr int axis_size = 1; + constexpr int split_size = 1; + constexpr int output_size = N; + + constexpr int tensors_size = + input_size + output_size + axis_size + split_size; + + // first input tensor is data + // second is size_splits + // third is axis + // then come outputs + + TfLiteTensor tensors[tensors_size]; + tensors[0] = CreateTensor(input_data, input_dims); + tensors[1] = CreateTensor(split_data, split_dims); + tensors[2] = CreateTensor(axis_data, axis_dims); + + // add output tensors + for (int i = 0; i < N; i++) + tensors[3 + i] = CreateTensor(output_tensors.data[i], output_dims[i]); + + tensors[2].allocation_type = kTfLiteMmapRo; + tensors[1].allocation_type = kTfLiteMmapRo; + + int inputs_array_data[] = { 3, 0, 1, 2 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[N + 1]; + outputs_array_data[0] = N; + for (int i = 0; i < N; i++) + outputs_array_data[i + 1] = i + 3; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_SPLIT_V(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < N; i++) { + int dim_count = ElementCount(*output_dims[i]); + for (int j = 0; j < dim_count; j++) { + TF_LITE_MICRO_EXPECT_NEAR((output_tensors.expected_output_data[i])[j], + (output_tensors.data[i])[j], 1e-5f); + } + } +} + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SPLIT_V_ThreeOutputs) +{ + constexpr int output1_dims_count = 3; + constexpr int output2_dims_count = 3; + constexpr int output3_dims_count = 6; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + float output3_data[output3_dims_count]; + int input_shape[] = { 2, 4, 3 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_values[] = { 0 }; + int split_shape[] = { 1, 3 }; + int32_t split_values[] = { 1, 1, 2 }; + int output1_shape[] = { 2, 1, 3 }; + float output1_values[] = { 1, 2, 3 }; + int output2_shape[] = { 2, 1, 3 }; + float output2_values[] = { 4, 5, 6 }; + int output3_shape[] = { 2, 2, 3 }; + float output3_values[] = { 7, 8, 9, 10, 11, 12 }; + + tflite::testing::OutputTensors<3> output_tensors; + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + output_tensors.data[2] = output3_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + output_tensors.dims[2] = output3_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + output_tensors.expected_output_data[2] = output3_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_values, split_shape, split_values, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_V_FourDimensionalFloatAxis0) +{ + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + + int input_shape[] = { 4, 2, 2, 2, 2 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_values[] = { 0 }; + int split_shape[] = { 1, 2 }; + int32_t split_values[] = { 1, 1 }; + int output1_shape[] = { 4, 1, 2, 2, 2 }; + float output1_values[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int output2_shape[] = { 4, 1, 2, 2, 2 }; + float output2_values[] = { 9, 10, 11, 12, 13, 14, 15, 16 }; + + tflite::testing::OutputTensors<2> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_values, split_shape, split_values, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_V_FourDimensionalFloatAxis1) +{ + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + + int input_shape[] = { 4, 2, 2, 2, 2 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_values[] = { 1 }; + int split_shape[] = { 1, 2 }; + int32_t split_values[] = { 1, 1 }; + int output1_shape[] = { 4, 2, 1, 2, 2 }; + float output1_values[] = { 1, 2, 3, 4, 9, 10, 11, 12 }; + int output2_shape[] = { 4, 2, 1, 2, 2 }; + float output2_values[] = { 5, 6, 7, 8, 13, 14, 15, 16 }; + + tflite::testing::OutputTensors<2> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_values, split_shape, split_values, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_VFourDimensionalFloatAxis2) +{ + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + + int input_shape[] = { 4, 2, 2, 2, 2 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_values[] = { 2 }; + int split_shape[] = { 1, 2 }; + int32_t split_values[] = { 1, 1 }; + int output1_shape[] = { 4, 2, 2, 1, 2 }; + float output1_values[] = { 1, 2, 5, 6, 9, 10, 13, 14 }; + int output2_shape[] = { 4, 2, 2, 1, 2 }; + float output2_values[] = { 3, 4, 7, 8, 11, 12, 15, 16 }; + + tflite::testing::OutputTensors<2> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_values, split_shape, split_values, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_V_FourDimensionalFloatAxis3) +{ + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + int input_shape[] = { 4, 2, 2, 2, 2 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_values[] = { 3 }; + int split_shape[] = { 1, 2 }; + int32_t split_values[] = { 1, 1 }; + int output1_shape[] = { 4, 2, 2, 2, 1 }; + float output1_values[] = { 1, 3, 5, 7, 9, 11, 13, 15 }; + int output2_shape[] = { 4, 2, 2, 2, 1 }; + float output2_values[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; + + tflite::testing::OutputTensors<2> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_values, split_shape, split_values, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_V_FourDimensionalFloatNegativeAxis) +{ + constexpr int output1_dims_count = 8; + constexpr int output2_dims_count = 8; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + + int input_shape[] = { 4, 2, 2, 2, 2 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_values[] = { -4 }; + int split_shape[] = { 1, 2 }; + int32_t split_values[] = { 1, 1 }; + int output1_shape[] = { 4, 1, 2, 2, 2 }; + float output1_values[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int output2_shape[] = { 4, 1, 2, 2, 2 }; + float output2_values[] = { 9, 10, 11, 12, 13, 14, 15, 16 }; + + tflite::testing::OutputTensors<2> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_values, split_shape, split_values, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_V_OneDimensionalFloatAxis0) +{ + constexpr int output1_dims_count = 1; + constexpr int output2_dims_count = 1; + constexpr int output3_dims_count = 1; + constexpr int output4_dims_count = 1; + constexpr int output5_dims_count = 1; + constexpr int output6_dims_count = 1; + constexpr int output7_dims_count = 1; + constexpr int output8_dims_count = 1; + + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + float output3_data[output3_dims_count]; + float output4_data[output4_dims_count]; + float output5_data[output5_dims_count]; + float output6_data[output6_dims_count]; + float output7_data[output7_dims_count]; + float output8_data[output8_dims_count]; + int input_shape[] = { 1, 8 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_value[] = { 0 }; + int split_size_shape[] = { 1, 8 }; + int32_t split[] = { 1, 1, 1, 1, 1, 1, 1, 1 }; + int output1_shape[] = { 1, 1 }; + float output1_values[] = { 1 }; + int output2_shape[] = { 1, 1 }; + float output2_values[] = { 2 }; + + int output3_shape[] = { 1, 1 }; + float output3_values[] = { 3 }; + int output4_shape[] = { 1, 1 }; + float output4_values[] = { 4 }; + + int output5_shape[] = { 1, 1 }; + float output5_values[] = { 5 }; + int output6_shape[] = { 1, 1 }; + float output6_values[] = { 6 }; + + int output7_shape[] = { 1, 1 }; + float output7_values[] = { 7 }; + int output8_shape[] = { 1, 1 }; + float output8_values[] = { 8 }; + + tflite::testing::OutputTensors<8> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + output_tensors.data[2] = output3_data; + output_tensors.data[3] = output4_data; + output_tensors.data[4] = output5_data; + output_tensors.data[5] = output6_data; + output_tensors.data[6] = output7_data; + output_tensors.data[7] = output8_data; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + output_tensors.dims[2] = output3_shape; + output_tensors.dims[3] = output4_shape; + output_tensors.dims[4] = output5_shape; + output_tensors.dims[5] = output6_shape; + output_tensors.dims[6] = output7_shape; + output_tensors.dims[7] = output8_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + output_tensors.expected_output_data[2] = output3_values; + output_tensors.expected_output_data[3] = output4_values; + output_tensors.expected_output_data[4] = output5_values; + output_tensors.expected_output_data[5] = output6_values; + output_tensors.expected_output_data[6] = output7_values; + output_tensors.expected_output_data[7] = output8_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_value, split_size_shape, split, + output_tensors); +} + +TF_LITE_MICRO_TEST(SPLIT_V_OneDimensionalFloatTest2) +{ + constexpr int output1_dims_count = 1; + constexpr int output2_dims_count = 1; + constexpr int output3_dims_count = 1; + constexpr int output4_dims_count = 1; + constexpr int output5_dims_count = 1; + constexpr int output6_dims_count = 1; + constexpr int output7_dims_count = 2; + + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + float output3_data[output3_dims_count]; + float output4_data[output4_dims_count]; + float output5_data[output5_dims_count]; + float output6_data[output6_dims_count]; + float output7_data[output7_dims_count]; + + int input_shape[] = { 1, 8 }; + float input_values[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + int axis_shape[] = { 1, 1 }; + int32_t axis_value[] = { 0 }; + int split_size_shape[] = { 1, 8 }; + int32_t split[] = { 1, 1, 1, 1, 1, 1, 2, -1 }; + int output1_shape[] = { 1, 1 }; + float output1_values[] = { 1 }; + int output2_shape[] = { 1, 1 }; + float output2_values[] = { 2 }; + + int output3_shape[] = { 1, 1 }; + float output3_values[] = { 3 }; + int output4_shape[] = { 1, 1 }; + float output4_values[] = { 4 }; + + int output5_shape[] = { 1, 1 }; + float output5_values[] = { 5 }; + int output6_shape[] = { 1, 1 }; + float output6_values[] = { 6 }; + + int output7_shape[] = { 1, 2 }; + float output7_values[] = { 7, 8 }; + int output8_shape[] = { 1, 0 }; + float output8_values[1] = {}; + + tflite::testing::OutputTensors<8> output_tensors; + + output_tensors.data[0] = output1_data; + output_tensors.data[1] = output2_data; + output_tensors.data[2] = output3_data; + output_tensors.data[3] = output4_data; + output_tensors.data[4] = output5_data; + output_tensors.data[5] = output6_data; + output_tensors.data[6] = output7_data; + output_tensors.data[7] = NULL; + + output_tensors.dims[0] = output1_shape; + output_tensors.dims[1] = output2_shape; + output_tensors.dims[2] = output3_shape; + output_tensors.dims[3] = output4_shape; + output_tensors.dims[4] = output5_shape; + output_tensors.dims[5] = output6_shape; + output_tensors.dims[6] = output7_shape; + output_tensors.dims[7] = output8_shape; + + output_tensors.expected_output_data[0] = output1_values; + output_tensors.expected_output_data[1] = output2_values; + output_tensors.expected_output_data[2] = output3_values; + output_tensors.expected_output_data[3] = output4_values; + output_tensors.expected_output_data[4] = output5_values; + output_tensors.expected_output_data[5] = output6_values; + output_tensors.expected_output_data[6] = output7_values; + output_tensors.expected_output_data[7] = output8_values; + + tflite::testing::TestSplitVFloat(input_shape, input_values, axis_shape, + axis_value, split_size_shape, split, + output_tensors); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze.cc new file mode 100644 index 00000000..eeee6e9f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze.cc @@ -0,0 +1,115 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/memory_helpers.h" + +namespace tflite { +namespace { + +struct SqueezeContext { + SqueezeContext(TfLiteContext *context, TfLiteNode *node) + : params(reinterpret_cast(node->builtin_data)), + input(GetInput(context, node, 0)), + output(GetOutput(context, node, 0)) + { + } + TfLiteSqueezeParams *params; + const TfLiteTensor *const input; + TfLiteTensor *output; +}; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + SqueezeContext op_context(context, node); + const int input_num_dims = NumDimensions(op_context.input); + const int num_squeeze_dims = op_context.params->num_squeeze_dims; + + // Determines number of dimensions of output tensor after squeeze. + const TfLiteIntArray *input_dims = op_context.input->dims; + const TfLiteIntArray *output_dims = op_context.output->dims; + const int *squeeze_dims = op_context.params->squeeze_dims; + + constexpr int max_squeeze_dims = 8; + TF_LITE_ENSURE(context, input_num_dims <= max_squeeze_dims); + bool should_squeeze[max_squeeze_dims] = {}; + + if (num_squeeze_dims == 0) { + for (int idx = 0; idx < input_num_dims; ++idx) { + if (input_dims->data[idx] == 1) { + should_squeeze[idx] = true; + } + } + } else { + for (int idx = 0; idx < num_squeeze_dims; ++idx) { + int current = squeeze_dims[idx] < 0 ? squeeze_dims[idx] + input_num_dims : squeeze_dims[idx]; + TF_LITE_ENSURE(context, current >= 0 && current < input_num_dims && + input_dims->data[current] == 1); + should_squeeze[current] = true; + } + } + + // Ensure output dimensions are big enough. + for (int in_idx = 0, out_idx = 0; in_idx < input_num_dims; ++in_idx) { + if (!should_squeeze[in_idx]) { + TFLITE_CHECK_GE(output_dims->data[out_idx++], input_dims->data[in_idx]); + } + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + SqueezeContext op_context(context, node); + + if (op_context.input->type == kTfLiteString) { + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(op_context.input->type), + op_context.input->type); + return kTfLiteError; + } + + TF_LITE_ENSURE_EQ(context, op_context.input->bytes, op_context.output->bytes); + memcpy(op_context.output->data.raw, op_context.input->data.raw, + op_context.input->bytes); + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_SQUEEZE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze_test.cc new file mode 100644 index 00000000..67504d05 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/squeeze_test.cc @@ -0,0 +1,131 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +int input_dims_data_common[] = { 3, 1, 24, 1 }; +int output_dims_data_common[] = { 1, 24 }; +const int input_data_common[] = { 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24 }; +const int golden_common[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; +const int expected_output_size_common = 24; + +void TestSqueezeOp(int *input_dims_data, const int *input_data, + int *output_dims_data, int *output_data, const int *golden, + int expected_output_size, + TfLiteSqueezeParams *squeeze_params) +{ + TfLiteIntArray *input_dims1 = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims1 = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + + TfLiteTensor tensors[tensors_size]; + tensors[0] = CreateTensor(input_data, input_dims1); + tensors[1] = CreateTensor(output_data, output_dims1); + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_SQUEEZE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(squeeze_params)); + + const char *init_data = reinterpret_cast(squeeze_params); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare(init_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < expected_output_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(golden[i], output_data[i]); + } +} +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SqueezeAll) +{ + int output_data[24]; + TfLiteSqueezeParams squeeze_params = { {}, 0 }; + + tflite::testing::TestSqueezeOp(tflite::testing::input_dims_data_common, + tflite::testing::input_data_common, + tflite::testing::output_dims_data_common, + output_data, tflite::testing::golden_common, + tflite::testing::expected_output_size_common, + &squeeze_params); +} + +TF_LITE_MICRO_TEST(SqueezeSelectedAxis) +{ + int output_data[24]; + TfLiteSqueezeParams squeeze_params = { { 2 }, 1 }; + int output_dims_data_common[] = { 2, 1, 24 }; + + tflite::testing::TestSqueezeOp( + tflite::testing::input_dims_data_common, + tflite::testing::input_data_common, output_dims_data_common, output_data, + tflite::testing::golden_common, + tflite::testing::expected_output_size_common, &squeeze_params); +} + +TF_LITE_MICRO_TEST(SqueezeNegativeAxis) +{ + int output_data[24]; + TfLiteSqueezeParams squeeze_params = { { -1, 0 }, 2 }; + + tflite::testing::TestSqueezeOp(tflite::testing::input_dims_data_common, + tflite::testing::input_data_common, + tflite::testing::output_dims_data_common, + output_data, tflite::testing::golden_common, + tflite::testing::expected_output_size_common, + &squeeze_params); +} + +TF_LITE_MICRO_TEST(SqueezeAllDims) +{ + int input_dims_data[] = { 7, 1, 1, 1, 1, 1, 1, 1 }; + int output_dims_data[] = { 1, 1 }; + const int input_data[] = { 3 }; + const int golden[] = { 3 }; + const int expected_output_size = 1; + + int output_data[24]; + TfLiteSqueezeParams squeeze_params = { {}, 0 }; + + tflite::testing::TestSqueezeOp(input_dims_data, input_data, output_dims_data, + output_data, golden, expected_output_size, + &squeeze_params); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice.cc new file mode 100644 index 00000000..497a8147 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice.cc @@ -0,0 +1,206 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/strided_slice.h" + +#include +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace strided_slice { + +constexpr int kInputTensor = 0; +constexpr int kBeginTensor = 1; +constexpr int kEndTensor = 2; +constexpr int kStridesTensor = 3; +constexpr int kOutputTensor = 0; + +struct StridedSliceContext { + StridedSliceContext(TfLiteContext *context, TfLiteNode *node) + { + params = reinterpret_cast(node->builtin_data); + input = GetInput(context, node, kInputTensor); + begin = GetInput(context, node, kBeginTensor); + end = GetInput(context, node, kEndTensor); + strides = GetInput(context, node, kStridesTensor); + output = GetOutput(context, node, kOutputTensor); + dims = NumDimensions(input); + } + const TfLiteStridedSliceParams *params; + const TfLiteTensor *input; + const TfLiteTensor *begin; + const TfLiteTensor *end; + const TfLiteTensor *strides; + TfLiteTensor *output; + int dims; +}; + +// This Op only supports 1-4D cases and since we use the reference 4D +// implementation, the 1-3D tensors are mapped to 4D. +const int kMaxDim = 4; + +tflite::StridedSliceParams BuildStridedSliceParams( + StridedSliceContext *op_context) +{ + tflite::StridedSliceParams op_params; + op_params.start_indices_count = op_context->dims; + op_params.stop_indices_count = op_context->dims; + op_params.strides_count = op_context->dims; + + for (int i = 0; i < op_context->dims; ++i) { + op_params.start_indices[i] = GetTensorData(op_context->begin)[i]; + op_params.stop_indices[i] = GetTensorData(op_context->end)[i]; + op_params.strides[i] = GetTensorData(op_context->strides)[i]; + } + + op_params.begin_mask = op_context->params->begin_mask; + op_params.ellipsis_mask = 0; + op_params.end_mask = op_context->params->end_mask; + op_params.new_axis_mask = 0; + op_params.shrink_axis_mask = op_context->params->shrink_axis_mask; + return op_params; +} + +// Processes the indexing tensors (begin, end and strides) to resize the +// output tensor. This function is callable from both Prepare() and Eval() as +// long as the caller ensures the indexing tensors are present. +TfLiteStatus CheckOutputSize(TfLiteContext *context, + StridedSliceContext *op_context) +{ + using ::tflite::strided_slice::StartForAxis; + using ::tflite::strided_slice::StopForAxis; + TfLiteIntArray *output_shape = op_context->output->dims; + int shape_size = 0; + auto op_params = BuildStridedSliceParams(op_context); + auto input_shape = GetTensorShape(op_context->input); + for (int idx = 0; idx < op_context->dims; ++idx) { + int32_t stride = GetTensorData(op_context->strides)[idx]; + TF_LITE_ENSURE_MSG(context, stride != 0, "stride value has to be non-zero"); + int32_t begin = StartForAxis(op_params, input_shape, idx); + int32_t end = StopForAxis(op_params, input_shape, idx, begin); + + // When shrinking an axis, the end position does not matter (and can be + // incorrect when negative indexing is used, see Issue #19260). Always use + // begin + 1 to generate a length 1 slice, since begin has + // already been adjusted for negative indices by StartForAxis. + const bool shrink_axis = op_context->params->shrink_axis_mask & (1 << idx); + if (shrink_axis) { + end = begin + 1; + } + + // This is valid for both positive and negative strides + int32_t dim_shape = std::ceil((end - begin) / static_cast(stride)); + dim_shape = dim_shape < 0 ? 0 : dim_shape; + if (!shrink_axis) { + TF_LITE_ENSURE_EQ(context, output_shape->data[shape_size], dim_shape); + shape_size++; + } + } + TF_LITE_ENSURE_EQ(context, output_shape->size, shape_size); + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(StridedSliceParams)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + StridedSliceParams *op_params = + static_cast(node->user_data); + TF_LITE_ENSURE_EQ(context, NumInputs(node), 4); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + StridedSliceContext op_context(context, node); + TF_LITE_ENSURE_MSG(context, op_context.dims <= kMaxDim, + "input dim should not exceed 4"); + auto params = BuildStridedSliceParams(&op_context); + memcpy(op_params, ¶ms, sizeof(StridedSliceParams)); + return CheckOutputSize(context, &op_context); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + const StridedSliceParams &op_params = + *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + switch (output->type) { + case kTfLiteFloat32: + reference_ops::StridedSlice(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteUInt8: + reference_ops::StridedSlice( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt8: + reference_ops::StridedSlice(op_params, + tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + case kTfLiteInt16: + reference_ops::StridedSlice( + op_params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + break; + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} +} // namespace strided_slice + +TfLiteRegistration Register_STRIDED_SLICE() +{ + return { /*init=*/strided_slice::Init, + /*free=*/nullptr, + /*prepare=*/strided_slice::Prepare, + /*invoke=*/strided_slice::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice_test.cc new file mode 100644 index 00000000..897ec78c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/strided_slice_test.cc @@ -0,0 +1,1144 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void ValidateStridedSliceGoldens(TfLiteTensor *tensors, int tensors_size, + const T *golden, T *output, int output_len, + TfLiteStridedSliceParams *params, + const bool expect_prepare_err, int num_invoke, + float tolerance = 1e-5) +{ + int inputs_array_data[] = { 4, 0, 1, 2, 3 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 4 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = + tflite::ops::micro::Register_STRIDED_SLICE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, reinterpret_cast(params)); + if (expect_prepare_err) { + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, runner.InitAndPrepare()); + return; + } else { + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + } + + for (int i = 0; i < num_invoke; i++) { + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + } + + for (int i = 0; i < output_len; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output[i], 1e-5f); + } +} + +void TestStridedSliceFloat(int *input_shape, int *begin_shape, int *end_shape, + int *strides_shape, + TfLiteStridedSliceParams *builtin_data, + float *input_data, const int32_t *begin_data, + const int32_t *end_data, const int32_t *strides_data, + int *output_shape, float *output_data, + const float *expected_output, + bool expect_prepare_err, int num_invoke = 1) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_shape); + TfLiteIntArray *begin_dims = IntArrayFromInts(begin_shape); + TfLiteIntArray *end_dims = IntArrayFromInts(end_shape); + TfLiteIntArray *strides_dims = IntArrayFromInts(strides_shape); + TfLiteIntArray *output_dims = IntArrayFromInts(output_shape); + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(begin_data, begin_dims), + CreateTensor(end_data, end_dims), + CreateTensor(strides_data, strides_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateStridedSliceGoldens(tensors, tensors_size, expected_output, + output_data, ElementCount(*output_dims), + builtin_data, expect_prepare_err, num_invoke, + 1.0); +} + +template +void TestStridedSliceQuantized(int *input_shape, int *begin_shape, + int *end_shape, int *strides_shape, + TfLiteStridedSliceParams *builtin_data, + const T *input_data, const int32_t *begin_data, + const int32_t *end_data, + const int32_t *strides_data, int *output_shape, + T *output_data, const T *expected_output, + bool expect_prepare_err, int num_invoke = 1) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_shape); + TfLiteIntArray *begin_dims = IntArrayFromInts(begin_shape); + TfLiteIntArray *end_dims = IntArrayFromInts(end_shape); + TfLiteIntArray *strides_dims = IntArrayFromInts(strides_shape); + TfLiteIntArray *output_dims = IntArrayFromInts(output_shape); + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + int zero_point = + std::numeric_limits::max() + std::numeric_limits::min() / 2; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_dims, 1.0, zero_point), + CreateTensor(begin_data, begin_dims), + CreateTensor(end_data, end_dims), + CreateTensor(strides_data, strides_dims), + CreateQuantizedTensor(output_data, output_dims, 1.0, zero_point), + }; + + ValidateStridedSliceGoldens(tensors, tensors_size, expected_output, + output_data, ElementCount(*output_dims), + builtin_data, expect_prepare_err, num_invoke, + 1.0); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(UnsupportedInputSize) +{ + int input_shape[] = { 5, 2, 2, 2, 2, 2 }; + int begin_shape[] = { 1, 5 }; + int end_shape[] = { 1, 5 }; + int strides_shape[] = { 1, 5 }; + int output_shape[] = { 0 }; + float input_data[] = {}; + int32_t begin_data[] = {}; + int32_t end_data[] = {}; + int32_t strides_data[] = {}; + float golden[] = {}; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, true); +} + +TF_LITE_MICRO_TEST(In1D) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 1 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 2, 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_EmptyOutput) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 0 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 10 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 1 }; + float golden[] = {}; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_NegativeBegin) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { -3 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 2, 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_OutOfRangeBegin) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { -5 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 1, 2, 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_NegativeEnd) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 1 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 1 }; + int32_t end_data[] = { -2 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 2 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_OutOfRangeEnd) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { -3 }; + int32_t end_data[] = { 5 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 2, 3, 4 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_BeginMask) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 1 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 1, 2, 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = { 1, 0, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_NegativeBeginNegativeStride) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 1 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { -2 }; + int32_t end_data[] = { -3 }; + int32_t strides_data[] = { -1 }; + float golden[] = { 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_OutOfRangeBeginNegativeStride) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 1 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 5 }; + int32_t end_data[] = { 2 }; + int32_t strides_data[] = { -1 }; + float golden[] = { 4 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_NegativeEndNegativeStride) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 2 }; + int32_t end_data[] = { -4 }; + int32_t strides_data[] = { -1 }; + float golden[] = { 3, 2 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_OutOfRangeEndNegativeStride) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { -3 }; + int32_t end_data[] = { -5 }; + int32_t strides_data[] = { -1 }; + float golden[] = { 2, 1 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_EndMask) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 1 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 2, 3, 4 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = { 0, 1, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_NegStride) +{ + int input_shape[] = { 1, 3 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3 }; + int32_t begin_data[] = { -1 }; + int32_t end_data[] = { -4 }; + int32_t strides_data[] = { -1 }; + float golden[] = { 3, 2, 1 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_EvenLenStride2) +{ + int input_shape[] = { 1, 2 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 1 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 0 }; + int32_t end_data[] = { 4 }; + int32_t strides_data[] = { 2 }; + float golden[] = { 1 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_OddLenStride2) +{ + int input_shape[] = { 1, 3 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4 }; + int32_t begin_data[] = { 0 }; + int32_t end_data[] = { 3 }; + int32_t strides_data[] = { 2 }; + float golden[] = { 1, 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_Identity) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 2, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 0, 0 }; + int32_t end_data[] = { 2, 3 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 1, 2, 3, 4, 5, 6 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 1, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, 0 }; + int32_t end_data[] = { 2, 2 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 4, 5 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_Stride2) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 1, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 0, 0 }; + int32_t end_data[] = { 2, 3 }; + int32_t strides_data[] = { 2, 2 }; + float golden[] = { 1, 3 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_NegStride) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 1, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, -1 }; + int32_t end_data[] = { 2, -4 }; + int32_t strides_data[] = { 2, -1 }; + float golden[] = { 6, 5, 4 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_BeginMask) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 2, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, 0 }; + int32_t end_data[] = { 2, 2 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 1, 2, 4, 5 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = { 1, 0, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_EndMask) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 1, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, 0 }; + int32_t end_data[] = { 2, 2 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 4, 5, 6 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = { 0, 2, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_NegStrideBeginMask) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 1, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, -2 }; + int32_t end_data[] = { 2, -4 }; + int32_t strides_data[] = { 1, -1 }; + float golden[] = { 6, 5, 4 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = { 2, 0, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_NegStrideEndMask) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 1, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, -2 }; + int32_t end_data[] = { 2, -3 }; + int32_t strides_data[] = { 1, -1 }; + float golden[] = { 5, 4 }; + float output_data[8]; + + TfLiteStridedSliceParams builtin_data = { 0, 2, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_Identity) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 3, 2, 3, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_NegStride) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 3, 2, 3, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_Strided2) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 3, 1, 2, 1 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 3, 2 }; + int32_t strides_data[] = { 2, 2, 2 }; + float golden[] = { 1, 5 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_ShrinkAxisMask1) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 3, 2, 3, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = {}; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_ShrinkAxisMask1_NegativeSlice) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 0 }; + float input_data[] = { 0, 1, 2, 3 }; + int32_t begin_data[] = { -1 }; + int32_t end_data[] = { 0 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_ShrinkAxis3_NegativeSlice) +{ + int input_shape[] = { 2, 4, 1 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 0 }; + float input_data[] = { 0, 1, 2, 3 }; + int32_t begin_data[] = { -2, -1 }; + int32_t end_data[] = { -1, 0 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 2 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 3 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_ShrinkAxis2_BeginEndAxis1_NegativeSlice) +{ + int input_shape[] = { 2, 4, 1 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 1, 4 }; + float input_data[] = { 0, 1, 2, 3 }; + int32_t begin_data[] = { 0, -1 }; + int32_t end_data[] = { 0, 0 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 0, 1, 2, 3 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = { 1, 1, 0, 0, 2 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In1D_BeginMaskShrinkAxisMask1) +{ + int input_shape[] = { 1, 4 }; + int begin_shape[] = { 1, 1 }; + int end_shape[] = { 1, 1 }; + int strides_shape[] = { 1, 1 }; + int output_shape[] = { 0 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 1 }; + int32_t end_data[] = { 1 }; + int32_t strides_data[] = { 1 }; + float golden[] = { 1 }; + float output_data[4]; + + TfLiteStridedSliceParams builtin_data = { 1, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_ShrinkAxisMask1) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 0, 0 }; + int32_t end_data[] = { 1, 3 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 1, 2, 3 }; + float output_data[6]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_ShrinkAxisMask2) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 0, 0 }; + int32_t end_data[] = { 2, 1 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 1, 4 }; + float output_data[6]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 2 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In2D_ShrinkAxisMask3) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 0 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 0, 0 }; + int32_t end_data[] = { 1, 1 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 1 }; + float output_data[6]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 3 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis1) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 2, 3, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 2, 3, 4, 5, 6 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis2) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 2, 2, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 1, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 2, 7, 8 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 2 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis3) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 1, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 2 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 3 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis4) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 2, 2, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 3, 5, 7, 9, 11 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 4 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis5) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 1, 3 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 3, 1 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 3, 5 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 5 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis6) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 1, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 2, 1, 1 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1, 7 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 6 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis7) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 0 }; + float input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 1, 1 }; + int32_t strides_data[] = { 1, 1, 1 }; + float golden[] = { 1 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 7 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +// This tests catches a very subtle bug that was fixed by cl/188403234. +TF_LITE_MICRO_TEST(RunTwice) +{ + int input_shape[] = { 2, 2, 3 }; + int begin_shape[] = { 1, 2 }; + int end_shape[] = { 1, 2 }; + int strides_shape[] = { 1, 2 }; + int output_shape[] = { 2, 2, 2 }; + float input_data[] = { 1, 2, 3, 4, 5, 6 }; + int32_t begin_data[] = { 1, 0 }; + int32_t end_data[] = { 2, 2 }; + int32_t strides_data[] = { 1, 1 }; + float golden[] = { 1, 2, 4, 5 }; + float output_data[16]; + + TfLiteStridedSliceParams builtin_data = { 1, 0, 0, 0, 0 }; + + tflite::testing::TestStridedSliceFloat( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false, 2); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis1Uint8) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 2, 3, 2 }; + uint8_t input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + uint8_t golden[] = { 1, 2, 3, 4, 5, 6 }; + uint8_t output_data[12]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceQuantized( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis1int8) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 2, 3, 2 }; + int8_t input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + int8_t golden[] = { 1, 2, 3, 4, 5, 6 }; + int8_t output_data[12]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceQuantized( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TEST(In3D_IdentityShrinkAxis1int16) +{ + int input_shape[] = { 3, 2, 3, 2 }; + int begin_shape[] = { 1, 3 }; + int end_shape[] = { 1, 3 }; + int strides_shape[] = { 1, 3 }; + int output_shape[] = { 2, 3, 2 }; + int16_t input_data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; + int32_t begin_data[] = { 0, 0, 0 }; + int32_t end_data[] = { 1, 3, 2 }; + int32_t strides_data[] = { 1, 1, 1 }; + int16_t golden[] = { 1, 2, 3, 4, 5, 6 }; + int16_t output_data[12]; + + TfLiteStridedSliceParams builtin_data = { 0, 0, 0, 0, 1 }; + + tflite::testing::TestStridedSliceQuantized( + input_shape, begin_shape, end_shape, strides_shape, &builtin_data, + input_data, begin_data, end_data, strides_data, output_shape, output_data, + golden, false); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/sub.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/sub.cc new file mode 100644 index 00000000..772ff79b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/sub.cc @@ -0,0 +1,299 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/sub.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/add.h" +#include "tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace sub { + +constexpr int kInputTensor1 = 0; +constexpr int kInputTensor2 = 1; +constexpr int kOutputTensor = 0; + +struct OpData { + bool requires_broadcast; + + // These fields are used in both the general 8-bit -> 8bit quantized path, + // and the special 16-bit -> 16bit quantized path + int input1_shift; + int input2_shift; + int32_t output_activation_min; + int32_t output_activation_max; + + // These fields are used only in the general 8-bit -> 8bit quantized path + int32_t input1_multiplier; + int32_t input2_multiplier; + int32_t output_multiplier; + int output_shift; + int left_shift; + int32_t input1_offset; + int32_t input2_offset; + int32_t output_offset; +}; + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteSubParams *params, + const TfLiteTensor *input1, + const TfLiteTensor *input2, TfLiteTensor *output, + OpData *data) +{ + data->requires_broadcast = !HaveSameShapes(input1, input2); + + if (output->type == kTfLiteUInt8 || output->type == kTfLiteInt8 || + output->type == kTfLiteInt16) { + // 8bit -> 8bit general quantized path, with general rescalings + data->input1_offset = -input1->params.zero_point; + data->input2_offset = -input2->params.zero_point; + data->output_offset = output->params.zero_point; + + // The shift is set to 15 in case of 16-bit and 20 in case of 8-bit, + // accordingly. In case of 16-bit we have 65535 << 15 which is less than 1 + // << 31, therefore the addition will still fit in a 32 bit accumulator. + data->left_shift = output->type == kTfLiteInt16 ? 15 : 20; + const float twice_max_input_scale = + 2 * std::max(input1->params.scale, input2->params.scale); + const double real_input1_multiplier = + static_cast(input1->params.scale / twice_max_input_scale); + const double real_input2_multiplier = + static_cast(input2->params.scale / twice_max_input_scale); + const double real_output_multiplier = + static_cast(twice_max_input_scale / + ((1 << data->left_shift) * output->params.scale)); + + QuantizeMultiplierSmallerThanOneExp( + real_input1_multiplier, &data->input1_multiplier, &data->input1_shift); + + QuantizeMultiplierSmallerThanOneExp( + real_input2_multiplier, &data->input2_multiplier, &data->input2_shift); + + // Use add kernel for 16-bit sub, since it supports output requantization. + // This matches behavior in TFLite. + data->input2_multiplier *= (output->type == kTfLiteInt16) ? -1 : 1; + QuantizeMultiplierSmallerThanOneExp( + real_output_multiplier, &data->output_multiplier, &data->output_shift); + + TF_LITE_ENSURE_STATUS(CalculateActivationRangeQuantized( + context, params->activation, output, &data->output_activation_min, + &data->output_activation_max)); + } + + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + OpData *data = static_cast(node->user_data); + auto *params = reinterpret_cast(node->builtin_data); + + const TfLiteTensor *input1 = GetInput(context, node, kInputTensor1); + TF_LITE_ENSURE(context, input1 != nullptr); + const TfLiteTensor *input2 = GetInput(context, node, kInputTensor2); + TF_LITE_ENSURE(context, input2 != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_STATUS( + CalculateOpData(context, params, input1, input2, output, data)); + return kTfLiteOk; +} + +void EvalSub(TfLiteContext *context, TfLiteNode *node, TfLiteSubParams *params, + const OpData *data, const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, TfLiteEvalTensor *output) +{ + float output_activation_min, output_activation_max; + CalculateActivationRange(params->activation, &output_activation_min, + &output_activation_max); + tflite::ArithmeticParams op_params; + SetActivationParams(output_activation_min, output_activation_max, &op_params); + if (data->requires_broadcast) { + tflite::reference_ops::BroadcastSubSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + tflite::reference_ops::SubWithActivation( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } +} + +TfLiteStatus EvalSubQuantized(TfLiteContext *context, TfLiteNode *node, + TfLiteSubParams *params, const OpData *data, + const TfLiteEvalTensor *input1, + const TfLiteEvalTensor *input2, + TfLiteEvalTensor *output) +{ + tflite::ArithmeticParams op_params; + op_params.left_shift = data->left_shift; + op_params.input1_offset = data->input1_offset; + op_params.input1_multiplier = data->input1_multiplier; + op_params.input1_shift = data->input1_shift; + op_params.input2_offset = data->input2_offset; + op_params.input2_multiplier = data->input2_multiplier; + op_params.input2_shift = data->input2_shift; + op_params.output_offset = data->output_offset; + op_params.output_multiplier = data->output_multiplier; + op_params.output_shift = data->output_shift; + SetActivationParams(data->output_activation_min, data->output_activation_max, + &op_params); + bool need_broadcast = reference_ops::ProcessBroadcastShapes( + tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorShape(input2), &op_params); + + switch (output->type) { + case kTfLiteInt8: { + if (need_broadcast) { + tflite::reference_ops::BroadcastSubSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + tflite::reference_ops::Sub( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + break; + } + case kTfLiteInt16: { + if (need_broadcast) { + tflite::reference_ops::BroadcastAdd4DSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + tflite::reference_ops::Add( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), false); + } + break; + } + case kTfLiteUInt8: { + if (need_broadcast) { + tflite::reference_ops::BroadcastSubSlow( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } else { + tflite::reference_ops::Sub( + op_params, tflite::micro::GetTensorShape(input1), + tflite::micro::GetTensorData(input1), + tflite::micro::GetTensorShape(input2), + tflite::micro::GetTensorData(input2), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + } + break; + } + default: + TF_LITE_KERNEL_LOG(context, "Quantized type %s not currently supported.", + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = reinterpret_cast(node->builtin_data); + + const TfLiteEvalTensor *input1 = + tflite::micro::GetEvalInput(context, node, kInputTensor1); + const TfLiteEvalTensor *input2 = + tflite::micro::GetEvalInput(context, node, kInputTensor2); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData &data = *(static_cast(node->user_data)); + + if (output->type == kTfLiteFloat32) { + EvalSub(context, node, params, &data, input1, input2, output); + } else if (output->type == kTfLiteUInt8 || output->type == kTfLiteInt8 || + output->type == kTfLiteInt16) { + TF_LITE_ENSURE_OK(context, EvalSubQuantized(context, node, params, &data, + input1, input2, output)); + } else { + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(output->type), output->type); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace sub + +TfLiteRegistration Register_SUB() +{ + return { /*init=*/sub::Init, + /*free=*/nullptr, + /*prepare=*/sub::Prepare, + /*invoke=*/sub::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/sub_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/sub_test.cc new file mode 100644 index 00000000..617f65f8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/sub_test.cc @@ -0,0 +1,620 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// Shapes and values for mixed broadcast tests. +const int broadcast_output_dims_count = 36; +const int broadcast_num_shapes = 4; + +int broadcast_input1_shape[] = { 4, 2, 3, 1, 2 }; +const float broadcast_input1_values[] = { -0.3, 2.3, 0.9, 0.5, 0.8, -1.1, + 1.2, 2.8, -1.6, 0.0, 0.7, -2.2 }; +const float broadcast_input2_values[] = { -0.2, -0.3, 0.4, -0.5, -1.0, -0.9 }; +const float + broadcast_goldens[broadcast_num_shapes][broadcast_output_dims_count] = { + { -0.1, 2.6, -0.7, 2.8, 0.7, 3.2, 1.1, 0.8, 0.5, 1.0, 1.9, 1.4, + 1.0, -0.8, 0.4, -0.6, 1.8, -0.2, 1.4, 3.1, 0.8, 3.3, 2.2, 3.7, + -1.4, 0.3, -2.0, 0.5, -0.6, 0.9, 0.9, -1.9, 0.3, -1.7, 1.7, -1.3 }, + { -0.1, 2.6, 0.5, 1.0, 1.8, -0.2, 1.4, 3.1, -2.0, 0.5, 1.7, -1.3 }, + { -0.1, 2.5, 0.0, 2.6, -0.7, 1.9, 1.1, 0.7, 1.2, 0.8, 0.5, 0.1, + 1.0, -0.9, 1.1, -0.8, 0.4, -1.5, 1.7, 3.3, 2.2, 3.8, 2.1, 3.7, + -1.1, 0.5, -0.6, 1.0, -0.7, 0.9, 1.2, -1.7, 1.7, -1.2, 1.6, -1.3 }, + { -0.1, 2.5, 1.2, 0.8, 0.4, -1.5, 1.7, 3.3, -0.6, 1.0, 1.6, -1.3 }, + }; + +const int broadcast_max_shape_size = 5; +int broadcast_input2_shapes[broadcast_num_shapes][broadcast_max_shape_size] = { + { 4, 1, 1, 3, 2 }, + { 4, 1, 3, 1, 2 }, + { 4, 2, 1, 3, 1 }, + { 4, 2, 3, 1, 1 }, +}; +int broadcast_output_shapes[broadcast_num_shapes][broadcast_max_shape_size] = { + { 4, 2, 3, 3, 2 }, + { 4, 2, 3, 1, 2 }, + { 4, 2, 3, 3, 2 }, + { 4, 2, 3, 1, 2 }, +}; + +template +void ValidateSubGoldens(TfLiteTensor *tensors, int tensors_size, + const T *golden, T *output, int output_size, + TfLiteFusedActivation activation, + float tolerance = 1e-5) +{ + TfLiteSubParams builtin_data; + builtin_data.activation = activation; + + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_SUB(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, &builtin_data); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_size; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(golden[i], output[i], tolerance); + } +} + +void TestSubFloat(int *input1_dims_data, const float *input1_data, + int *input2_dims_data, const float *input2_data, + int *output_dims_data, const float *expected_output, + TfLiteFusedActivation activation, float *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input1_data, input1_dims), + CreateTensor(input2_data, input2_dims), + CreateTensor(output_data, output_dims), + }; + + ValidateSubGoldens(tensors, tensors_size, expected_output, output_data, + ElementCount(*output_dims), activation); +} + +template +void TestSubQuantized(int *input1_dims_data, const float *input1_data, + T *input1_quantized, float input1_scale, + int input1_zero_point, int *input2_dims_data, + const float *input2_data, T *input2_quantized, + float input2_scale, int input2_zero_point, + int *output_dims_data, const float *golden, + T *golden_quantized, float output_scale, + int output_zero_point, TfLiteFusedActivation activation, + T *output_data) +{ + TfLiteIntArray *input1_dims = IntArrayFromInts(input1_dims_data); + TfLiteIntArray *input2_dims = IntArrayFromInts(input2_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + tflite::testing::CreateQuantizedTensor(input1_data, input1_quantized, + input1_dims, input1_scale, + input1_zero_point), + tflite::testing::CreateQuantizedTensor(input2_data, input2_quantized, + input2_dims, input2_scale, + input2_zero_point), + tflite::testing::CreateQuantizedTensor(output_data, output_dims, + output_scale, output_zero_point), + }; + tflite::Quantize(golden, golden_quantized, ElementCount(*output_dims), + output_scale, output_zero_point); + + ValidateSubGoldens(tensors, tensors_size, golden_quantized, output_data, + ElementCount(*output_dims), activation); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatSubNoActivation) +{ + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8 }; + const float input2_values[] = { 0.1, 0.2, 0.3, 0.5 }; + const float golden_values[] = { -2.1, 0.0, 0.4, 0.3 }; + float output_data[output_dims_count]; + tflite::testing::TestSubFloat(inout_shape, input1_values, inout_shape, + input2_values, inout_shape, golden_values, + kTfLiteActNone, output_data); +} + +TF_LITE_MICRO_TEST(FloatSubActivationRelu1) +{ + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.0, 0.2, 2.0, 0.8 }; + const float input2_values[] = { 2.0, 0.2, 0.3, 0.5 }; + const float golden_values[] = { -1.0, 0.0, 1.0, 0.3 }; + + float output_data[output_dims_count]; + tflite::testing::TestSubFloat(inout_shape, input1_values, inout_shape, + input2_values, inout_shape, golden_values, + kTfLiteActReluN1To1, output_data); +} + +TF_LITE_MICRO_TEST(FloatSubVariousInputShapes) +{ + const int output_dims_count = 6; + float output_data[output_dims_count]; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + const float input2_values[] = { 0.1, 0.2, 0.3, 0.5, 1.1, 0.1 }; + const float expected_output[] = { -2.1, 0.0, 0.4, 0.3, 0.0, 1.9 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestSubFloat(test_shapes[i], input1_values, test_shapes[i], + input2_values, test_shapes[i], + expected_output, kTfLiteActNone, output_data); + } +} + +TF_LITE_MICRO_TEST(FloatSubWithScalarBroadcast) +{ + const int output_dims_count = 6; + float output_data[output_dims_count]; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + int input2_shape[] = { 0 }; + const float input2_values[] = { 0.1 }; + const float expected_output[] = { -2.1, 0.1, 0.6, 0.7, 1.0, 1.9 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestSubFloat(test_shapes[i], input1_values, input2_shape, + input2_values, test_shapes[i], + expected_output, kTfLiteActNone, output_data); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubNoActivationUint8) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { 125, 129, 135 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { -1.01, -1.99, -2.99, -4.02 }; + const float golden_values[] = { -1, 1, 3, 5 }; + + uint8_t input1_quantized[output_dims_count]; + uint8_t input2_quantized[output_dims_count]; + uint8_t golden_quantized[output_dims_count]; + uint8_t output[output_dims_count]; + + tflite::testing::TestSubQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActNone, output); +} + +TF_LITE_MICRO_TEST(QuantizedSubNoActivationInt8) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { -10, 4, 13 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { -1.01, -1.99, -2.99, -4.02 }; + const float golden_values[] = { -1, 1, 3, 5 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + tflite::testing::TestSubQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActNone, output); +} + +TF_LITE_MICRO_TEST(QuantizedSubActivationRelu1Uint8) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { 125, 129, 135 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { -1.01, -1.99, -2.99, -4.02 }; + const float golden_values[] = { -1, 1, 1, 1 }; + + uint8_t input1_quantized[output_dims_count]; + uint8_t input2_quantized[output_dims_count]; + uint8_t golden_quantized[output_dims_count]; + uint8_t output[output_dims_count]; + + tflite::testing::TestSubQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActReluN1To1, output); +} + +TF_LITE_MICRO_TEST(QuantizedSubActivationRelu1Int8) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { -10, 4, 13 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { -1.01, -1.99, -2.99, -4.02 }; + const float golden_values[] = { -1, 1, 1, 1 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + tflite::testing::TestSubQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActReluN1To1, output); +} + +TF_LITE_MICRO_TEST(QuantizedSubActivationRelu1Int16) +{ + const float scales[] = { 0.25, 0.5, 1.0 }; + const int zero_points[] = { 0, 0, 0 }; + const int output_dims_count = 4; + int inout_shape[] = { 4, 1, 2, 2, 1 }; + const float input1_values[] = { -2.01, -1.01, -0.01, 0.98 }; + const float input2_values[] = { -1.01, -1.99, -2.99, -4.02 }; + const float golden_values[] = { -1, 1, 1, 1 }; + + int16_t input1_quantized[output_dims_count]; + int16_t input2_quantized[output_dims_count]; + int16_t golden_quantized[output_dims_count]; + int16_t output[output_dims_count]; + + tflite::testing::TestSubQuantized( + inout_shape, input1_values, input1_quantized, scales[0], zero_points[0], + inout_shape, input2_values, input2_quantized, scales[1], zero_points[1], + inout_shape, golden_values, golden_quantized, scales[2], zero_points[2], + kTfLiteActReluN1To1, output); +} + +TF_LITE_MICRO_TEST(QuantizedSubVariousInputShapesUint8) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { 120, 130, 139 }; + const int output_dims_count = 6; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + const float input2_values[] = { -0.1, -0.2, -0.3, -0.5, -1.1, -0.1 }; + const float golden_values[] = { -1.9, 0.4, 1.0, 1.3, 2.2, 2.1 }; + + uint8_t input1_quantized[output_dims_count]; + uint8_t input2_quantized[output_dims_count]; + uint8_t golden_quantized[output_dims_count]; + uint8_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; i++) { + tflite::testing::TestSubQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], test_shapes[i], input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden_values, + golden_quantized, scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubVariousInputShapesInt8) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { -9, 5, 14 }; + const int output_dims_count = 6; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + const float input2_values[] = { -0.1, -0.2, -0.3, -0.5, -1.1, -0.1 }; + const float golden_values[] = { -1.9, 0.4, 1.0, 1.3, 2.2, 2.1 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; i++) { + tflite::testing::TestSubQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], test_shapes[i], input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden_values, + golden_quantized, scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubVariousInputShapesInt16) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { 0, 0, 0 }; + const int output_dims_count = 6; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + const float input2_values[] = { -0.1, -0.2, -0.3, -0.5, -1.1, -0.1 }; + const float golden_values[] = { -1.9, 0.4, 1.0, 1.3, 2.2, 2.1 }; + + int16_t input1_quantized[output_dims_count]; + int16_t input2_quantized[output_dims_count]; + int16_t golden_quantized[output_dims_count]; + int16_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; i++) { + tflite::testing::TestSubQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], test_shapes[i], input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden_values, + golden_quantized, scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubWithScalarBroadcastUint8) +{ + const int output_dims_count = 6; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + int input2_shape[] = { 0 }; + const float input2_values[] = { -0.1 }; + const float golden[] = { -1.9, 0.3, 0.8, 0.9, 1.2, 2.1 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float scales[] = { 0.1, 0.1, 0.1 }; + const int zero_points[] = { 120, 131, 139 }; + + uint8_t input1_quantized[output_dims_count]; + uint8_t input2_quantized[output_dims_count]; + uint8_t golden_quantized[output_dims_count]; + uint8_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestSubQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], input2_shape, input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden, golden_quantized, + scales[2], zero_points[2], kTfLiteActNone, output); + } +} +TF_LITE_MICRO_TEST(QuantizedSubWithScalarBroadcastFloat) +{ + float output_float[tflite::testing::broadcast_output_dims_count]; + + for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) { + tflite::testing::TestSubFloat(tflite::testing::broadcast_input1_shape, + tflite::testing::broadcast_input1_values, + tflite::testing::broadcast_input2_shapes[i], + tflite::testing::broadcast_input2_values, + tflite::testing::broadcast_output_shapes[i], + tflite::testing::broadcast_goldens[i], + kTfLiteActNone, output_float); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubWithScalarBroadcastInt8) +{ + const int output_dims_count = 6; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + int input2_shape[] = { 0 }; + const float input2_values[] = { -0.1 }; + const float golden[] = { -1.9, 0.3, 0.8, 0.9, 1.2, 2.1 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float scales[] = { 0.1, 0.05, 0.05 }; + const int zero_points[] = { -8, 4, 12 }; + + int8_t input1_quantized[output_dims_count]; + int8_t input2_quantized[output_dims_count]; + int8_t golden_quantized[output_dims_count]; + int8_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestSubQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], input2_shape, input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden, golden_quantized, + scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubWithScalarBroadcastInt16) +{ + const int output_dims_count = 6; + + const float input1_values[] = { -2.0, 0.2, 0.7, 0.8, 1.1, 2.0 }; + int input2_shape[] = { 0 }; + const float input2_values[] = { -0.1 }; + const float golden[] = { -1.9, 0.3, 0.8, 0.9, 1.2, 2.1 }; + + constexpr int num_shapes = 4; + constexpr int max_shape_size = 5; + int test_shapes[num_shapes][max_shape_size] = { + { 1, 6 }, + { 2, 2, 3 }, + { 3, 2, 1, 3 }, + { 4, 1, 3, 1, 2 }, + }; + + const float scales[] = { 0.1, 0.05, 0.05 }; + const int zero_points[] = { 0, 0, 0 }; + + int16_t input1_quantized[output_dims_count]; + int16_t input2_quantized[output_dims_count]; + int16_t golden_quantized[output_dims_count]; + int16_t output[output_dims_count]; + + for (int i = 0; i < num_shapes; ++i) { + tflite::testing::TestSubQuantized( + test_shapes[i], input1_values, input1_quantized, scales[0], + zero_points[0], input2_shape, input2_values, input2_quantized, + scales[1], zero_points[1], test_shapes[i], golden, golden_quantized, + scales[2], zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubWithMixedBroadcastUint8) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { 127, 131, 139 }; + uint8_t input1_quantized[tflite::testing::broadcast_output_dims_count]; + uint8_t input2_quantized[tflite::testing::broadcast_output_dims_count]; + uint8_t golden_quantized[tflite::testing::broadcast_output_dims_count]; + uint8_t output[tflite::testing::broadcast_output_dims_count]; + + for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) { + tflite::testing::TestSubQuantized( + tflite::testing::broadcast_input1_shape, + tflite::testing::broadcast_input1_values, input1_quantized, scales[0], + zero_points[0], tflite::testing::broadcast_input2_shapes[i], + tflite::testing::broadcast_input2_values, input2_quantized, scales[1], + zero_points[1], tflite::testing::broadcast_output_shapes[i], + tflite::testing::broadcast_goldens[i], golden_quantized, scales[2], + zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubWithMixedBroadcastInt8) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { -10, -5, 7 }; + int8_t input1_quantized[tflite::testing::broadcast_output_dims_count]; + int8_t input2_quantized[tflite::testing::broadcast_output_dims_count]; + int8_t golden_quantized[tflite::testing::broadcast_output_dims_count]; + int8_t output[tflite::testing::broadcast_output_dims_count]; + + for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) { + tflite::testing::TestSubQuantized( + tflite::testing::broadcast_input1_shape, + tflite::testing::broadcast_input1_values, input1_quantized, scales[0], + zero_points[0], tflite::testing::broadcast_input2_shapes[i], + tflite::testing::broadcast_input2_values, input2_quantized, scales[1], + zero_points[1], tflite::testing::broadcast_output_shapes[i], + tflite::testing::broadcast_goldens[i], golden_quantized, scales[2], + zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TEST(QuantizedSubWithMixedBroadcastInt16) +{ + const float scales[] = { 0.1, 0.05, 0.1 }; + const int zero_points[] = { 0, 0, 0 }; + int16_t input1_quantized[tflite::testing::broadcast_output_dims_count]; + int16_t input2_quantized[tflite::testing::broadcast_output_dims_count]; + int16_t golden_quantized[tflite::testing::broadcast_output_dims_count]; + int16_t output[tflite::testing::broadcast_output_dims_count]; + + for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) { + tflite::testing::TestSubQuantized( + tflite::testing::broadcast_input1_shape, + tflite::testing::broadcast_input1_values, input1_quantized, scales[0], + zero_points[0], tflite::testing::broadcast_input2_shapes[i], + tflite::testing::broadcast_input2_values, input2_quantized, scales[1], + zero_points[1], tflite::testing::broadcast_output_shapes[i], + tflite::testing::broadcast_goldens[i], golden_quantized, scales[2], + zero_points[2], kTfLiteActNone, output); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.cc new file mode 100644 index 00000000..46a849f1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.cc @@ -0,0 +1,98 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/kernels/svdf.h" + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/activation_utils.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace { + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + auto *params = reinterpret_cast(node->builtin_data); + TFLITE_DCHECK(node->user_data != nullptr); + const OpData &data = *(static_cast(node->user_data)); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kSvdfInputTensor); + const TfLiteEvalTensor *weights_feature = + tflite::micro::GetEvalInput(context, node, kSvdfWeightsFeatureTensor); + const TfLiteEvalTensor *weights_time = + tflite::micro::GetEvalInput(context, node, kSvdfWeightsTimeTensor); + const TfLiteEvalTensor *bias = + (NumInputs(node) == 5) ? tflite::micro::GetEvalInput(context, node, kSvdfBiasTensor) : nullptr; + TfLiteEvalTensor *activation_state = tflite::micro::GetMutableEvalInput( + context, node, kSvdfInputActivationStateTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kSvdfOutputTensor); + + switch (weights_feature->type) { + case kTfLiteFloat32: { + EvalFloatSvdfReference( + context, node, input, weights_feature, weights_time, bias, params, + data.scratch_tensor_index, activation_state, output); + return kTfLiteOk; + break; + } + + case kTfLiteInt8: { + EvalIntegerSvdfReference(context, node, input, weights_feature, + weights_time, bias, params, activation_state, + output, data); + return kTfLiteOk; + break; + } + + default: + TF_LITE_KERNEL_LOG(context, "Type %s not currently supported.", + TfLiteTypeGetName(weights_feature->type)); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_SVDF() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/PrepareSvdf, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.h b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.h new file mode 100644 index 00000000..87477a4c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf.h @@ -0,0 +1,70 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_KERNELS_SVDF_H_ +#define TENSORFLOW_LITE_MICRO_KERNELS_SVDF_H_ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" + +namespace tflite { +struct OpData { + int32_t effective_scale_1_a; + int32_t effective_scale_2_a; + // b versions of each scale are kept at int since the numbers are just the + // shift value - typically between [-32, 32]. + int effective_scale_1_b; + int effective_scale_2_b; + int scratch_tensor_index; + int scratch_output_tensor_index; + + // Cached tensor zero point values for quantized operations. + int input_zero_point; + int output_zero_point; +}; + +// Input tensors. +extern const int kSvdfInputTensor; +extern const int kSvdfWeightsFeatureTensor; +extern const int kSvdfWeightsTimeTensor; +extern const int kSvdfBiasTensor; +// This is a variable tensor, and will be modified by this op. +extern const int kSvdfInputActivationStateTensor; + +// Output tensor. +extern const int kSvdfOutputTensor; + +// TensorflowLite Micro-specific reference implementation for Integer SVDF. +void EvalIntegerSvdfReference(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input_tensor, + const TfLiteEvalTensor *weights_feature_tensor, + const TfLiteEvalTensor *weights_time_tensor, + const TfLiteEvalTensor *bias_tensor, + const TfLiteSVDFParams *params, + TfLiteEvalTensor *activation_state_tensor, + TfLiteEvalTensor *output_tensor, + const OpData &data); + +void EvalFloatSvdfReference( + TfLiteContext *context, TfLiteNode *node, const TfLiteEvalTensor *input, + const TfLiteEvalTensor *weights_feature, + const TfLiteEvalTensor *weights_time, const TfLiteEvalTensor *bias, + const TfLiteSVDFParams *params, int scratch_tensor_index, + TfLiteEvalTensor *activation_state, TfLiteEvalTensor *output); + +TfLiteStatus PrepareSvdf(TfLiteContext *context, TfLiteNode *node); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_KERNELS_SVDF_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_common.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_common.cc new file mode 100644 index 00000000..5ce9970c --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_common.cc @@ -0,0 +1,473 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/activation_utils.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/svdf.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { + +/** + * This version of SVDF is specific to TFLite Micro. It contains the following + * differences between the TFLite version: + * + * 1.) Scratch tensor allocation - scratch tensors must be known ahead of time + * for the Micro interpreter. + * 2.) Output dimensions - the TFLite version determines output size and runtime + * and resizes the output tensor. Micro runtime does not support tensor + * resizing. + */ + +const int kSvdfInputTensor = 0; +const int kSvdfWeightsFeatureTensor = 1; +const int kSvdfWeightsTimeTensor = 2; +const int kSvdfBiasTensor = 3; +const int kSvdfInputActivationStateTensor = + 4; // This is a variable tensor, and will be modified by this op. +const int kSvdfOutputTensor = 0; + +void EvalIntegerSvdfReference(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input_tensor, + const TfLiteEvalTensor *weights_feature_tensor, + const TfLiteEvalTensor *weights_time_tensor, + const TfLiteEvalTensor *bias_tensor, + const TfLiteSVDFParams *params, + TfLiteEvalTensor *activation_state_tensor, + TfLiteEvalTensor *output_tensor, + const OpData &data) +{ + const int n_rank = params->rank; + const int n_batch = input_tensor->dims->data[0]; + const int n_input = input_tensor->dims->data[1]; + const int n_filter = weights_feature_tensor->dims->data[0]; + const int n_unit = n_filter / n_rank; + const int n_memory = weights_time_tensor->dims->data[1]; + + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(context->GetScratchBuffer != nullptr); + + int32_t *scratch_tensor = static_cast( + context->GetScratchBuffer(context, data.scratch_tensor_index)); + int32_t *scratch_output_tensor = static_cast( + context->GetScratchBuffer(context, data.scratch_output_tensor_index)); + + // Shift states. + int16_t *const state_ptr = + tflite::micro::GetTensorData(activation_state_tensor); + + // Left shift the activation_state. + { + int16_t *new_state_start = state_ptr; + const int16_t *old_state_start = state_ptr + 1; + const int16_t *old_state_end = state_ptr + n_batch * n_filter * n_memory; + while (old_state_start != old_state_end) { + *new_state_start++ = *old_state_start++; + } + } + + // Note: no need to clear the latest activation, matmul is not accumulative. + + // Feature matmul. + { + int16_t *state = + tflite::micro::GetTensorData(activation_state_tensor); + const int8_t *input = tflite::micro::GetTensorData(input_tensor); + const int8_t *weight_feature = + tflite::micro::GetTensorData(weights_feature_tensor); + const int32_t output_max = std::numeric_limits::max(); + const int32_t output_min = std::numeric_limits::min(); + int16_t *result_in_batch = state + (n_memory - 1); + for (int b = 0; b < n_batch; b++) { + const int8_t *matrix_ptr = weight_feature; + for (int r = 0; r < n_filter; r++) { + int32_t dot_prod = 0; + const int8_t *vector_in_batch = input + b * n_input; + for (int c = 0; c < n_input; c++) { + dot_prod += + *matrix_ptr++ * (*vector_in_batch++ - data.input_zero_point); + } + dot_prod = MultiplyByQuantizedMultiplier( + dot_prod, data.effective_scale_1_a, data.effective_scale_1_b); + dot_prod = std::min(std::max(output_min, dot_prod), output_max); + // This assumes state is symmetrically quantized. Otherwise last bit of + // state should be initialized to its zero point and accumulate the + // dot_prod. + // Equivalent as the following: + // result_in_batch = zero point, which happens to be zero. + // result_in_batch += dot_prod_56. + *result_in_batch = dot_prod; + result_in_batch += n_memory; + } + } + } + + // Time. + { + for (int b = 0; b < n_batch; ++b) { + int32_t *scratch_ptr_batch = scratch_tensor + b * n_filter; + + // Perform batched vector dot product: + const int16_t *vector1_ptr = + tflite::micro::GetTensorData(weights_time_tensor); + const int16_t *vector2_ptr = + tflite::micro::GetTensorData(activation_state_tensor) + + b * n_memory * n_filter; + + for (int i = 0; i < n_filter; i++) { + *scratch_ptr_batch = 0; + for (int j = 0; j < n_memory; j++) { + *scratch_ptr_batch += *vector1_ptr++ * *vector2_ptr++; + } + scratch_ptr_batch++; + } + } + } + + // Reduce, add bias, rescale, activation. + { + // Add bias. + if (bias_tensor) { + // Vector batch assign: + const int32_t *bias_data = + tflite::micro::GetTensorData(bias_tensor); + for (int i = 0; i < n_batch; ++i) { + int32_t *output_ptr = scratch_output_tensor + i * n_unit; + const int32_t *bias_ptr = bias_data; + for (int j = 0; j < n_unit; ++j) { + *output_ptr++ = *bias_ptr++; + } + } + } else { + int32_t *output_ptr = scratch_output_tensor; + for (int i = 0; i < n_batch * n_unit; ++i) { + *output_ptr++ = 0; + } + } + + // Reduce. + for (int b = 0; b < n_batch; ++b) { + int32_t *output_temp_ptr = scratch_output_tensor + b * n_unit; + int32_t *scratch_ptr_batch = scratch_tensor + b * n_filter; + + // Reduction sum vector + for (int i = 0; i < n_unit; ++i) { + for (int j = 0; j < n_rank; ++j) { + output_temp_ptr[i] += *scratch_ptr_batch++; + } + } + } + + // Rescale. + const int32_t output_max = std::numeric_limits::max(); + const int32_t output_min = std::numeric_limits::min(); + for (int i = 0; i < n_batch * n_unit; ++i) { + int32_t x1 = scratch_output_tensor[i]; + int32_t x2 = MultiplyByQuantizedMultiplier(x1, data.effective_scale_2_a, + data.effective_scale_2_b); + int32_t x3 = x2 + data.output_zero_point; + int32_t x4 = std::min(std::max(output_min, x3), output_max); + tflite::micro::GetTensorData(output_tensor)[i] = + static_cast(x4); + } + } +} +static inline void ApplyTimeWeightsBiasAndActivation( + int batch_size, int memory_size, int num_filters, int num_units, int rank, + const float *const __restrict__ weights_time_ptr, + const float *const __restrict__ bias_ptr, TfLiteFusedActivation activation, + float *const __restrict__ state_ptr, float *const __restrict__ scratch_ptr, + float *const __restrict__ output_ptr) +{ + // Compute matmul(activation_state, weights_time). + for (int b = 0; b < batch_size; ++b) { + // Perform batched vector dot product: + float *scratch_ptr_batch = scratch_ptr + b * num_filters; + const float *vector1_ptr = weights_time_ptr; + const float *vector2_ptr = state_ptr + b * memory_size * num_filters; + for (int i = 0; i < num_filters; ++i) { + *scratch_ptr_batch = 0.f; + for (int j = 0; j < memory_size; ++j) { + *scratch_ptr_batch += *vector1_ptr++ * *vector2_ptr++; + } + scratch_ptr_batch++; + } + } + + // Initialize output with bias if provided. + if (bias_ptr) { + // VectorBatchVectorAssign + for (int i = 0; i < batch_size; ++i) { + float *output_data = output_ptr + i * num_units; + const float *bias_data = bias_ptr; + for (int j = 0; j < num_units; ++j) { + *output_data++ = *bias_data++; + } + } + } else { + float *output_data = output_ptr; + for (int i = 0; i < batch_size * num_units; ++i) { + *output_data++ = 0.0f; + } + } + + // Reduction sum. + for (int b = 0; b < batch_size; ++b) { + float *output_ptr_batch = output_ptr + b * num_units; + float *scratch_ptr_batch = scratch_ptr + b * num_filters; + + // Reduction sum vector + for (int i = 0; i < num_units; ++i) { + for (int j = 0; j < rank; j++) { + output_ptr_batch[i] += *scratch_ptr_batch++; + } + } + } + + // Apply activation. + for (int b = 0; b < batch_size; ++b) { + float *output_ptr_batch = output_ptr + b * num_units; + for (int i = 0; i < num_units; ++i) { + *output_ptr_batch = + tflite::ops::micro::ActivationValFloat(activation, *output_ptr_batch); + ++output_ptr_batch; + } + } +} + +void EvalFloatSvdfReference( + TfLiteContext *context, TfLiteNode *node, const TfLiteEvalTensor *input, + const TfLiteEvalTensor *weights_feature, + const TfLiteEvalTensor *weights_time, const TfLiteEvalTensor *bias, + const TfLiteSVDFParams *params, int scratch_tensor_index, + TfLiteEvalTensor *activation_state, TfLiteEvalTensor *output) +{ + const int rank = params->rank; + const int batch_size = input->dims->data[0]; + const int input_size = input->dims->data[1]; + const int num_filters = weights_feature->dims->data[0]; + const int num_units = num_filters / rank; + const int memory_size = weights_time->dims->data[1]; + + const float *weights_feature_ptr = + tflite::micro::GetTensorData(weights_feature); + const float *weights_time_ptr = + tflite::micro::GetTensorData(weights_time); + const float *bias_ptr = tflite::micro::GetTensorData(bias); + const float *input_ptr = tflite::micro::GetTensorData(input); + + float *state_ptr = tflite::micro::GetTensorData(activation_state); + + TFLITE_DCHECK(context != nullptr); + TFLITE_DCHECK(context->GetScratchBuffer != nullptr); + + float *scratch_ptr = static_cast( + context->GetScratchBuffer(context, scratch_tensor_index)); + + float *output_ptr = tflite::micro::GetTensorData(output); + + // Left shift the activation_state. + { + float *new_state_start = state_ptr; + const float *old_state_start = state_ptr + 1; + const float *old_state_end = + state_ptr + batch_size * num_filters * memory_size; + while (old_state_start != old_state_end) { + *new_state_start++ = *old_state_start++; + } + } + + // Note: no need to clear the latest activation, matmul is not accumulative. + + // Compute conv1d(inputs, weights_feature). + // The activation_state's rightmost column is used to save current cycle + // activation. This is achieved by starting at state_ptr[memory_size - 1] and + // having the stride equal to memory_size. + + // Perform batched matrix vector multiply operation: + { + const float *matrix = weights_feature_ptr; + const float *vector = input_ptr; + float *result = &state_ptr[memory_size - 1]; + float *result_in_batch = result; + for (int i = 0; i < batch_size; ++i) { + const float *matrix_ptr = matrix; + for (int j = 0; j < num_filters; ++j) { + float dot_prod = 0.0f; + const float *vector_in_batch = vector + i * input_size; + for (int k = 0; k < input_size; ++k) { + dot_prod += *matrix_ptr++ * *vector_in_batch++; + } + *result_in_batch = dot_prod; + result_in_batch += memory_size; + } + } + } + + ApplyTimeWeightsBiasAndActivation( + batch_size, memory_size, num_filters, num_units, rank, weights_time_ptr, + bias_ptr, params->activation, state_ptr, scratch_ptr, output_ptr); +} + +TfLiteStatus PrepareSvdf(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->builtin_data != nullptr); + + const auto *params = static_cast(node->builtin_data); + + // Validate Tensor Inputs (dtype depends on quantization): + // [0] = Input, {2, batch_size, input_size} + // [1] = Weights Feature, {2, num_filters, input_size} + // [2] = Weights Time, {2, num_filters, memory_size} + // [3] = Bias (optional), {1, num_units} + // [4] = Activation State (variable), + // {2, batch_size, memory_size * num_filters} + const TfLiteTensor *input = GetInput(context, node, kSvdfInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *weights_feature = + GetInput(context, node, kSvdfWeightsFeatureTensor); + TF_LITE_ENSURE(context, weights_feature != nullptr); + const TfLiteTensor *weights_time = + GetInput(context, node, kSvdfWeightsTimeTensor); + TF_LITE_ENSURE(context, weights_time != nullptr); + const TfLiteTensor *bias = + GetOptionalInputTensor(context, node, kSvdfBiasTensor); + const TfLiteTensor *activation_state = + GetInput(context, node, kSvdfInputActivationStateTensor); + TF_LITE_ENSURE(context, activation_state != nullptr); + + // Define input constants based on input tensor definition above: + const int rank = params->rank; + const int input_size = input->dims->data[1]; + const int batch_size = input->dims->data[0]; + const int num_filters = weights_feature->dims->data[0]; + TF_LITE_ENSURE_EQ(context, num_filters % rank, 0); + const int num_units = num_filters / rank; + const int memory_size = weights_time->dims->data[1]; + + // Validate Input Tensor: + TF_LITE_ENSURE(context, + input->type == kTfLiteFloat32 || input->type == kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, NumDimensions(input), 2); + + // Validate Tensor Output: + // [0] = float/int8_t, {2, batch_size, num_units} + TF_LITE_ENSURE_EQ(context, node->outputs->size, 1); + TfLiteTensor *output = GetOutput(context, node, kSvdfOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + TF_LITE_ENSURE_EQ(context, NumDimensions(output), 2); + TF_LITE_ENSURE_EQ(context, output->dims->data[0], batch_size); + TF_LITE_ENSURE_EQ(context, output->dims->data[1], num_units); + + // Validate Weights Feature Input Tensor: + TF_LITE_ENSURE_EQ(context, NumDimensions(weights_feature), 2); + TF_LITE_ENSURE_EQ(context, weights_feature->dims->data[1], input_size); + + // Validate Weights Time Input Tensor: + TF_LITE_ENSURE_EQ(context, NumDimensions(weights_time), 2); + TF_LITE_ENSURE_EQ(context, weights_time->dims->data[0], num_filters); + TF_LITE_ENSURE_EQ(context, weights_time->dims->data[1], memory_size); + + // Validate Optional Bias Input Tensor: + if (bias != nullptr) { + TF_LITE_ENSURE_EQ(context, bias->dims->data[0], num_units); + } + + // Validate Activation State Input Tensor: + TF_LITE_ENSURE_EQ(context, NumDimensions(activation_state), 2); + TF_LITE_ENSURE_EQ(context, activation_state->dims->data[0], batch_size); + TF_LITE_ENSURE_EQ(context, activation_state->dims->data[1], + memory_size * num_filters); + // Since is_variable is not part of TFLiteEvalTensor, check is_variable here. + TF_LITE_ENSURE_EQ(context, activation_state->is_variable, true); + + TF_LITE_ENSURE_EQ(context, node->inputs->size, 5); + + TFLITE_DCHECK(node->user_data != nullptr); + OpData *data = static_cast(node->user_data); + + if (input->type == kTfLiteInt8) { + TF_LITE_ENSURE_EQ(context, weights_feature->type, kTfLiteInt8); + TF_LITE_ENSURE_EQ(context, weights_time->type, kTfLiteInt16); + TF_LITE_ENSURE_EQ(context, activation_state->type, kTfLiteInt16); + if (bias != nullptr) { + TF_LITE_ENSURE_EQ(context, bias->type, kTfLiteInt32); + } + + TF_LITE_ENSURE_TYPES_EQ(context, output->type, kTfLiteInt8); + + const double effective_scale_1 = static_cast( + input->params.scale * weights_feature->params.scale / + activation_state->params.scale); + const double effective_scale_2 = + static_cast(activation_state->params.scale * + weights_time->params.scale / output->params.scale); + + // TODO(b/162018098): Use TF_LITE_ENSURE_NEAR when it is ready. + TF_LITE_ENSURE( + context, + std::abs(static_cast(bias->params.scale) - + static_cast(activation_state->params.scale * + weights_time->params.scale)) < 1e-5); + + QuantizeMultiplier(effective_scale_1, &(data->effective_scale_1_a), + &(data->effective_scale_1_b)); + QuantizeMultiplier(effective_scale_2, &(data->effective_scale_2_a), + &(data->effective_scale_2_b)); + + data->input_zero_point = input->params.zero_point; + data->output_zero_point = output->params.zero_point; + + TFLITE_DCHECK(context->RequestScratchBufferInArena != nullptr); + + const TfLiteStatus scratch_status = context->RequestScratchBufferInArena( + context, batch_size * num_filters * sizeof(int32_t), + &(data->scratch_tensor_index)); + TF_LITE_ENSURE_OK(context, scratch_status); + + const TfLiteStatus scratch_output_status = + context->RequestScratchBufferInArena( + context, batch_size * num_units * sizeof(int32_t), + &(data->scratch_output_tensor_index)); + TF_LITE_ENSURE_OK(context, scratch_output_status); + } else { + TF_LITE_ENSURE_EQ(context, weights_feature->type, kTfLiteFloat32); + TF_LITE_ENSURE_EQ(context, weights_time->type, kTfLiteFloat32); + TF_LITE_ENSURE_EQ(context, activation_state->type, kTfLiteFloat32); + if (bias != nullptr) { + TF_LITE_ENSURE_EQ(context, bias->type, kTfLiteFloat32); + } + TF_LITE_ENSURE_TYPES_EQ(context, output->type, kTfLiteFloat32); + + TFLITE_DCHECK(context->RequestScratchBufferInArena != nullptr); + const TfLiteStatus scratch_status = context->RequestScratchBufferInArena( + context, batch_size * num_filters * sizeof(float), + &(data->scratch_tensor_index)); + TF_LITE_ENSURE_OK(context, scratch_status); + } + + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_test.cc new file mode 100644 index 00000000..e8adeb31 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/svdf_test.cc @@ -0,0 +1,989 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +namespace tflite { +namespace testing { +namespace { + +// naming as follows: _xx + +// 10 inputs each with shape {2, 2}. +const float input_data_2x2x10[] = { + 0.12609188, + -0.46347019, + 0.35867718, + 0.36897406, + + 0.14278367, + -1.64410412, + -0.57290924, + 0.12729003, + + 0.49837467, + 0.19278903, + 0.17660543, + 0.52949083, + + -0.11186574, + 0.13164264, + -0.72674477, + -0.5683046, + + -0.68892461, + 0.37783599, + -0.63690937, + 0.44483393, + + -0.81299269, + -0.86831826, + -0.95760226, + 1.82078898, + + -1.45006323, + -0.82251364, + -1.65087092, + -1.89238167, + + 0.03966608, + -0.24936394, + 2.06740379, + -1.51439476, + + 0.11771342, + -0.23761693, + 0.31088525, + -1.55601168, + + -0.89477462, + 1.67204106, + -0.6230064, + 0.29819036, +}; + +// Feature filter of shape {8, 2}. +const float feature_weights_data_2x2x10[] = { + -0.31930989, 0.0079667, 0.39296314, 0.37613347, 0.12416199, 0.15785322, + 0.27901134, 0.3905206, 0.21931258, -0.36137494, -0.10640851, 0.31053296, + -0.36118156, -0.0976817, -0.36916667, 0.22197971 +}; + +// Time filter of shape {8, 10}. +const float time_weights_data_2x2x10[] = { + -0.31930989, 0.37613347, 0.27901134, -0.36137494, -0.36118156, + 0.22197971, 0.27557442, -0.06634006, 0.0079667, 0.12416199, + + 0.3905206, -0.10640851, -0.0976817, 0.15294972, 0.39635518, + -0.02702999, 0.39296314, 0.15785322, 0.21931258, 0.31053296, + + -0.36916667, 0.38031587, -0.21580373, 0.27072677, 0.23622236, + 0.34936687, 0.18174365, 0.35907319, -0.17493086, 0.324846, + + -0.10781813, 0.27201805, 0.14324132, -0.23681851, -0.27115166, + -0.01580888, -0.14943552, 0.15465137, 0.09784451, -0.0337657, + + -0.14884081, 0.19931212, -0.36002168, 0.34663299, -0.11405486, + 0.12672701, 0.39463779, -0.07886535, -0.06384811, 0.08249187, + + -0.26816407, -0.19905911, 0.29211238, 0.31264046, -0.28664589, + 0.05698794, 0.11613581, 0.14078894, 0.02187902, -0.21781836, + + -0.15567942, 0.08693647, -0.38256618, 0.36580828, -0.22922277, + -0.0226903, 0.12878349, -0.28122205, -0.10850525, -0.11955214, + + 0.27179423, -0.04710215, 0.31069002, 0.22672787, 0.09580326, + 0.08682203, 0.1258215, 0.1851041, 0.29228821, 0.12366763 +}; + +// Activation state with shape {2, 80}. These initial values must be copied into +// a mutable activation state tensor. + +const float initial_activation_state_data_2x2x10[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +// Bias with shape {8} +const float bias_data_2x2x10[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + +// 10 outputs each of shape {2, 4} +const float golden_output_2x2x10[] = { + -0.044205, -0.013757, 0.050369, -0.018447, + 0.073010, 0.025142, -0.021154, 0.013551, + + -0.209613, -0.062421, 0.150209, -0.108334, + 0.028256, -0.006950, -0.030885, 0.009603, + + -0.076800, -0.037075, -0.087198, -0.155183, + 0.091069, 0.098446, -0.016083, 0.106475, + + -0.082123, -0.162238, -0.084434, -0.141074, + -0.029340, -0.090685, 0.053302, -0.030604, + + -0.201440, 0.088424, 0.139877, 0.012416, + -0.113212, 0.103893, -0.100842, 0.122780, + + -0.166632, -0.116705, 0.175298, -0.047163, + 0.313077, -0.166485, -0.285860, 0.129069, + + -0.625911, 0.046134, 0.138081, -0.129581, + -0.521455, -0.061579, 0.230289, 0.114963, + + -0.216693, -0.161643, -0.179177, -0.052599, + -0.213239, 0.029502, 0.260858, 0.275045, + + -0.213689, -0.323608, -0.285635, -0.317687, + -0.324092, -0.317972, -0.208450, -0.462504, + + -0.255126, -0.218576, -0.041528, 0.179421, + -0.440583, 0.072127, -0.284136, 0.241570 +}; + +// Simulated real-world inputs, weights and expected outputs. + +// Input of shape {1x16} +const float input_data_16x1x1[] = { + -0.488494, + 2.023762, + -2.233117, + -0.488494, + 3.559030, + 9.490748, + -3.210106, + -1.953977, + -0.279140, + 0.907204, + 1.674838, + 0.000000, + -0.279140, + -0.628064, + -0.069785, + -0.628064, +}; + +// Feature filter of shape {64, 16}. +const float feature_weights_data_16x1x1[] = { + 0.173588, 0.173588, -0.024798, 0.193426, -0.099193, 0.044637, 0.183507, + 0.183507, 0.044637, 0.198386, -0.069435, 0.084314, 0.312458, 0.024798, + 0.173588, -0.049596, -0.352135, -0.550521, -0.009919, -0.099193, -0.074395, + -0.128951, 0.193426, 0.357095, -0.317418, -0.119032, -0.218225, -0.004960, + -0.386853, -0.133911, 0.252942, -0.019839, -0.024798, -0.054556, -0.069435, + -0.128951, 0.029758, -0.099193, -0.312458, -0.029758, 0.064475, 0.183507, + 0.114072, -0.178547, -0.247982, -0.119032, 0.243023, -0.119032, -0.034718, + -0.178547, 0.019839, 0.128951, -0.223184, -0.009919, -0.213265, 0.168628, + -0.143830, -0.322377, -0.218225, -0.193426, -0.252942, -0.049596, 0.064475, + -0.267821, -0.580279, -0.099193, 0.213265, 0.119032, -0.119032, -0.178547, + 0.610037, 0.109112, 0.049596, -0.014879, -0.049596, -0.193426, 0.039677, + -0.148789, -0.114072, -0.158709, -0.158709, 0.094233, 0.099193, -0.114072, + 0.104153, -0.123991, 0.198386, -0.173588, 0.089274, -0.247982, -0.054556, + 0.123991, 0.183507, 0.114072, 0.188467, 0.302539, 0.044637, 0.039677, + -0.099193, 0.168628, -0.024798, -0.054556, -0.109112, 0.014879, -0.009919, + 0.069435, -0.396772, -0.287660, -0.079354, -0.104153, 0.054556, 0.089274, + -0.099193, 0.114072, 0.034718, 0.119032, 0.282700, -0.119032, -0.505884, + -0.233104, -0.114072, -0.257902, -0.233104, -0.178547, 0.153749, 0.128951, + 0.143830, -0.188467, -0.183507, 0.104153, -0.024798, 0.193426, -0.287660, + 0.168628, -0.009919, 0.119032, -0.024798, -0.099193, -0.203346, 0.099193, + 0.084314, -0.168628, 0.123991, -0.148789, 0.114072, -0.029758, 0.228144, + -0.238063, 0.089274, -0.064475, 0.307498, -0.188467, -0.004960, -0.252942, + -0.173588, -0.158709, -0.044637, -0.009919, 0.312458, -0.262861, 0.059516, + 0.158709, 0.069435, -0.282700, 0.074395, -0.322377, -0.183507, -0.123991, + -0.233104, 0.009919, 0.252942, -0.243023, 0.555481, -0.099193, -0.119032, + -0.441409, 0.148789, 0.084314, -0.168628, -0.183507, 0.188467, 0.024798, + -0.302539, 0.223184, 0.143830, -0.193426, -0.054556, -0.218225, -0.297579, + 0.104153, 0.272781, -0.034718, 0.114072, -0.059516, 0.044637, 0.342216, + 0.421570, 0.138870, -0.024798, -0.039677, -0.163668, -0.034718, 0.396772, + -0.128951, -0.044637, -0.173588, 0.302539, 0.079354, 0.049596, 0.133911, + -0.029758, -0.312458, -0.029758, 0.079354, 0.128951, 0.252942, 0.213265, + 0.014879, 0.287660, 0.178547, 0.297579, 0.352135, 0.401732, 0.024798, + -0.277740, -0.411651, -0.069435, 0.342216, -0.158709, -0.104153, -0.009919, + 0.223184, 0.228144, -0.019839, 0.059516, -0.104153, -0.510844, 0.029758, + -0.406691, 0.089274, 0.421570, 0.163668, -0.143830, -0.019839, -0.039677, + 0.104153, -0.044637, -0.128951, 0.203346, 0.079354, -0.069435, 0.094233, + -0.138870, 0.466207, -0.163668, 0.049596, 0.029758, 0.267821, 0.029758, + -0.049596, 0.009919, 0.004960, -0.099193, 0.094233, -0.262861, 0.089274, + -0.302539, 0.332297, -0.307498, -0.014879, 0.168628, -0.094233, -0.272781, + 0.034718, -0.133911, -0.228144, 0.094233, 0.257902, -0.228144, 0.153749, + -0.054556, -0.252942, 0.054556, 0.218225, -0.054556, 0.302539, 0.282700, + 0.054556, -0.044637, -0.133911, 0.233104, -0.049596, 0.411651, 0.044637, + -0.297579, -0.029758, -0.114072, 0.114072, -0.580279, 0.079354, -0.024798, + -0.347175, -0.128951, -0.099193, 0.238063, -0.104153, -0.009919, 0.158709, + -0.034718, 0.123991, -0.163668, 0.059516, 0.342216, 0.009919, 0.064475, + -0.307498, -0.520763, -0.238063, 0.163668, 0.362054, 0.034718, -0.178547, + -0.104153, -0.257902, 0.322377, 0.054556, 0.148789, -0.178547, 0.084314, + 0.004960, 0.257902, 0.029758, 0.079354, -0.223184, -0.193426, 0.282700, + 0.000000, -0.019839, -0.114072, 0.491005, -0.193426, -0.029758, -0.243023, + 0.009919, 0.089274, -0.277740, -0.089274, 0.104153, 0.337256, 0.138870, + -0.307498, -0.054556, 0.352135, 0.133911, -0.044637, 0.133911, -0.089274, + -0.357095, -0.272781, 0.069435, 0.059516, -0.109112, 0.148789, -0.044637, + -0.019839, -0.153749, 0.123991, -0.223184, 0.322377, 0.074395, -0.312458, + 0.024798, -0.223184, 0.109112, -0.138870, 0.218225, -0.074395, -0.406691, + 0.009919, -0.198386, -0.009919, 0.416611, 0.178547, 0.148789, 0.133911, + -0.004960, 0.069435, -0.054556, -0.044637, 0.297579, 0.059516, -0.456288, + -0.148789, -0.004960, 0.054556, 0.094233, -0.104153, 0.198386, -0.302539, + 0.133911, 0.411651, 0.054556, 0.525723, -0.089274, 0.079354, 0.238063, + 0.079354, -0.039677, 0.039677, 0.029758, 0.332297, -0.014879, -0.367014, + -0.143830, -0.123991, -0.064475, 0.014879, 0.173588, -0.168628, 0.386853, + 0.009919, 0.173588, 0.163668, 0.123991, 0.163668, 0.198386, 0.203346, + -0.401732, -0.009919, 0.272781, -0.173588, 0.044637, 0.238063, 0.133911, + 0.049596, 0.208305, -0.024798, 0.049596, -0.049596, 0.034718, -0.446368, + 0.466207, -0.089274, -0.099193, -0.128951, -0.228144, 0.014879, -0.252942, + 0.074395, -0.223184, -0.168628, -0.292619, 0.178547, 0.153749, -0.014879, + 0.054556, 0.000000, 0.193426, 0.158709, 0.178547, -0.327337, -0.138870, + -0.114072, 0.168628, 0.297579, -0.109112, -0.029758, -0.029758, -0.416611, + 0.059516, 0.000000, -0.168628, -0.322377, 0.238063, -0.128951, -0.029758, + 0.500925, 0.292619, 0.123991, -0.099193, 0.074395, 0.317418, -0.148789, + 0.064475, -0.104153, -0.044637, -0.094233, 0.188467, -0.044637, 0.213265, + -0.233104, -0.049596, 0.004960, -0.198386, 0.287660, -0.148789, -0.257902, + 0.004960, -0.218225, -0.044637, -0.386853, -0.243023, -0.163668, 0.094233, + 0.029758, -0.019839, -0.009919, -0.143830, -0.158709, 0.158709, -0.243023, + -0.039677, -0.297579, 0.069435, 0.049596, 0.302539, 0.059516, 0.074395, + -0.019839, 0.352135, -0.019839, -0.138870, -0.178547, -0.243023, 0.233104, + 0.252942, -0.228144, -0.049596, 0.173588, 0.173588, -0.074395, -0.034718, + -0.292619, 0.362054, 0.183507, 0.243023, -0.203346, -0.044637, 0.054556, + 0.059516, -0.158709, -0.158709, 0.000000, 0.327337, 0.119032, 0.034718, + -0.044637, -0.089274, 0.089274, -0.233104, 0.000000, -0.317418, 0.371974, + 0.213265, 0.307498, -0.178547, -0.367014, 0.039677, -0.059516, 0.168628, + -0.014879, 0.143830, 0.123991, -0.084314, -0.332297, -0.416611, 0.183507, + 0.109112, -0.039677, 0.014879, 0.292619, -0.213265, -0.054556, 0.004960, + 0.123991, 0.119032, 0.000000, -0.332297, -0.312458, -0.198386, -0.213265, + 0.119032, 0.322377, 0.168628, 0.104153, -0.262861, 0.327337, -0.049596, + -0.228144, -0.074395, 0.168628, 0.123991, 0.396772, 0.044637, 0.322377, + 0.193426, 0.267821, -0.178547, 0.297579, 0.148789, -0.218225, -0.138870, + 0.044637, 0.049596, 0.133911, 0.064475, 0.069435, 0.064475, -0.158709, + -0.044637, -0.173588, 0.267821, 0.327337, 0.079354, -0.228144, 0.029758, + 0.014879, 0.198386, -0.109112, -0.133911, 0.431490, 0.099193, 0.421570, + 0.233104, -0.054556, 0.054556, -0.317418, -0.133911, -0.123991, -0.287660, + 0.342216, -0.049596, -0.153749, 0.228144, -0.213265, 0.262861, 0.406691, + -0.084314, -0.004960, 0.193426, 0.188467, -0.099193, -0.223184, 0.163668, + -0.257902, -0.153749, 0.441409, 0.099193, 0.128951, -0.089274, -0.208305, + -0.009919, -0.004960, -0.109112, 0.024798, -0.119032, 0.019839, 0.391812, + -0.024798, 0.198386, 0.327337, -0.505884, -0.099193, 0.510844, -0.148789, + 0.094233, -0.153749, -0.039677, 0.352135, 0.272781, -0.228144, -0.287660, + -0.272781, 0.148789, 0.277740, 0.074395, 0.109112, -0.064475, 0.044637, + 0.074395, -0.292619, 0.153749, -0.064475, -0.114072, 0.198386, -0.039677, + -0.128951, -0.004960, 0.257902, -0.228144, -0.094233, 0.064475, 0.014879, + 0.188467, -0.416611, 0.099193, 0.362054, -0.208305, 0.198386, -0.079354, + 0.009919, 0.119032, 0.332297, 0.243023, -0.168628, 0.158709, 0.039677, + 0.143830, 0.277740, -0.168628, 0.009919, 0.099193, -0.004960, -0.257902, + -0.297579, 0.208305, -0.104153, 0.119032, 0.247982, 0.381893, -0.223184, + -0.367014, -0.327337, -0.168628, -0.094233, 0.208305, -0.019839, 0.183507, + 0.084314, 0.133911, 0.109112, -0.148789, -0.183507, -0.411651, -0.024798, + -0.114072, -0.029758, -0.009919, 0.173588, -0.059516, -0.049596, 0.039677, + 0.317418, 0.138870, -0.247982, -0.084314, 0.158709, 0.054556, -0.084314, + -0.049596, 0.074395, 0.019839, -0.282700, -0.119032, -0.262861, 0.163668, + -0.069435, -0.064475, -0.059516, 0.094233, 0.123991, -0.079354, -0.272781, + -0.267821, 0.233104, 0.114072, -0.218225, 0.540602, 0.089274, 0.262861, + 0.079354, 0.267821, -0.119032, -0.109112, -0.128951, 0.128951, -0.044637, + -0.272781, 0.277740, 0.297579, -0.054556, -0.084314, -0.049596, 0.123991, + 0.059516, 0.238063, -0.168628, -0.009919, 0.163668, -0.307498, 0.109112, + -0.064475, 0.218225, -0.168628, -0.004960, -0.168628, 0.119032, 0.094233, + -0.183507, -0.089274, -0.292619, -0.094233, 0.064475, -0.183507, -0.168628, + 0.089274, 0.074395, -0.367014, -0.024798, -0.069435, 0.119032, -0.302539, + -0.376933, -0.123991, -0.009919, -0.069435, -0.208305, -0.119032, 0.014879, + -0.183507, -0.238063, 0.163668, -0.332297, -0.148789, -0.391812, -0.024798, + -0.133911, -0.059516, -0.123991, 0.123991, -0.292619, -0.044637, 0.059516, + -0.069435, 0.049596, -0.069435, 0.034718, 0.158709, -0.347175, -0.044637, + 0.352135, -0.347175, -0.282700, -0.054556, 0.307498, 0.029758, 0.357095, + -0.148789, 0.208305, -0.317418, 0.009919, 0.004960, -0.243023, 0.049596, + -0.099193, 0.213265, -0.342216, 0.158709, 0.123991, -0.332297, 0.386853, + -0.262861, -0.208305, 0.123991, -0.044637, 0.148789, 0.084314, -0.297579, + -0.307498, -0.163668, 0.337256, -0.014879, 0.074395, 0.178547, -0.004960, + -0.257902, -0.019839, -0.228144, -0.034718, -0.277740, -0.158709, -0.119032, + -0.153749, 0.629876, 0.277740, 0.178547, -0.267821, -0.004960, 0.247982, + 0.084314, -0.094233, 0.000000, -0.039677, 0.332297, 0.178547, 0.009919, + -0.213265, -0.208305, -0.044637, 0.019839, 0.218225, -0.297579, 0.014879, + -0.247982, -0.004960, -0.128951, 0.421570, -0.059516, 0.362054, -0.203346, + -0.143830, -0.099193, -0.024798, 0.094233, -0.123991, 0.163668, 0.109112, + -0.104153, -0.233104, 0.009919, -0.218225, 0.376933, 0.104153, -0.059516, + 0.049596, -0.054556, 0.019839, -0.044637, -0.019839, 0.371974, -0.019839, + 0.104153, 0.168628, -0.024798, -0.272781, -0.158709, 0.223184, 0.044637, + 0.039677, -0.168628, -0.287660, -0.109112, 0.094233, -0.089274, -0.148789, + 0.178547, -0.039677, -0.089274, -0.049596, -0.024798, 0.064475, -0.158709, + 0.089274, 0.029758, -0.247982, 0.362054, 0.024798, -0.004960, -0.099193, + 0.173588, -0.059516, 0.188467, -0.629876, 0.094233, 0.371974, 0.069435, + 0.252942, -0.357095, -0.272781, -0.367014, 0.014879, -0.049596, -0.262861, + 0.009919, -0.094233, -0.094233, 0.059516, 0.223184, 0.133911, 0.411651, + -0.044637, -0.044637, 0.109112, 0.228144, 0.386853, -0.233104, 0.069435, + 0.228144, -0.302539, 0.029758, 0.089274, 0.044637, -0.238063, -0.138870, + -0.158709, -0.019839, 0.049596, 0.039677, 0.000000, -0.069435, 0.109112, + -0.213265, -0.188467, -0.262861, -0.267821, -0.094233, 0.133911, 0.391812, + 0.123991, -0.317418, 0.233104, -0.029758, -0.099193, -0.193426, 0.074395, + -0.009919, 0.252942, 0.322377, -0.530683, 0.208305, 0.252942, 0.203346, + -0.069435, -0.262861 +}; + +// Time filter of shape {64, 8}. +const float time_weights_data_16x1x1[] = { + -0.052026, 0.043107, 0.053512, 0.013378, 0.011892, -0.182834, -0.108511, + 0.153105, 0.050539, -0.173915, 0.145672, 0.208103, -0.221481, 0.108511, + -0.496475, 0.181347, -0.016351, -0.132294, -0.234859, -0.243778, 0.028243, + -0.228914, -0.130808, -0.167969, -0.041621, -0.306209, -0.193239, -0.028243, + -0.057972, -0.057972, -0.497962, 0.054999, 0.181347, 0.047566, -0.099592, + -0.111484, -0.130808, -0.071350, 0.380532, 0.010405, 0.041621, 0.052026, + 0.022297, 0.081755, 0.098106, 0.099592, -0.584176, -0.023783, 0.062431, + -0.090674, -0.279453, -0.486070, -0.273507, 0.004459, -0.062431, 0.095133, + 0.056485, 0.022297, -0.105538, -0.184320, 0.358235, 0.254183, 0.049053, + 0.084728, 0.218508, 0.078782, -0.136754, -0.017837, -0.124862, -0.118916, + -0.001486, 0.043107, 0.254183, 0.087701, 0.261616, 0.309182, -0.404315, + -0.040134, -0.046080, -0.052026, -0.034188, -0.475665, -0.025270, -0.049053, + -0.046080, -0.062431, 0.020810, 0.040134, -0.135267, -0.169456, -0.050539, + -0.576743, 0.034188, 0.075809, 0.101079, 0.136754, 0.083241, 0.077296, + -0.050539, 0.761064, -0.335938, -0.080268, 0.025270, 0.257156, 0.227427, + 0.252697, 0.065404, 0.115943, 0.222968, -0.026756, -0.054999, 0.107025, + -0.093646, 0.041621, -0.092160, -0.474178, -0.016351, 0.004459, 0.049053, + 0.019324, 0.019324, 0.074323, 0.038648, -0.613905, 0.182834, 0.075809, + 0.028243, 0.019324, 0.010405, -0.011892, 0.001486, -0.492016, -0.224454, + -0.474178, -0.147159, 0.002973, 0.102565, 0.136754, -0.267561, -0.001486, + -0.095133, -0.040134, 0.066890, 0.074323, 0.104052, 0.532150, 0.090674, + 0.072836, -0.053512, -0.004459, 0.020810, 0.046080, 0.062431, 0.477151, + 0.133781, -0.029729, -0.026756, 0.031215, 0.156077, 0.096619, 0.251210, + 0.352289, 0.657012, 0.047566, -0.014865, -0.072836, -0.016351, 0.008919, + -0.053512, 0.016351, 0.300263, 0.047566, 0.020810, 0.169456, 0.001486, + 0.007432, 0.111484, 0.044594, -0.188779, -0.096619, 0.074323, -0.040134, + 0.160537, 0.138240, 0.184320, 0.377559, -0.092160, -0.049053, 0.056485, + -0.032702, 0.001486, -0.083241, -0.472692, -0.114457, -0.117430, -0.075809, + 0.026756, 0.163510, 0.172428, 0.127835, -0.199185, -0.218508, -0.057972, + -0.132294, -0.162023, -0.019324, -0.245265, -0.395396, -0.254183, 0.084728, + 0.248238, 0.191752, 0.221481, 0.173915, 0.173915, -0.208103, -0.077296, + 0.384991, -0.313641, -0.313641, -0.147159, -0.090674, 0.035675, 0.059458, + -0.010405, 0.019324, 0.087701, 0.016351, 0.037161, 0.469719, -0.074323, + 0.092160, 0.026756, 0.090674, 0.098106, 0.004459, -0.034188, 0.492016, + -0.367154, -0.093646, -0.063917, 0.041621, 0.017837, 0.026756, -0.062431, + -0.350803, 0.425125, 0.002973, 0.083241, 0.075809, 0.016351, 0.047566, + -0.185807, -0.107025, -0.098106, -0.144186, 0.255670, 0.020810, 0.105538, + 0.029729, 0.129321, 0.156077, 0.141213, 0.334452, 0.147159, -0.066890, + 0.035675, 0.115943, 0.240805, 0.328506, 0.162023, -0.237832, 0.218508, + 0.233373, 0.214049, 0.099592, 0.026756, -0.322560, -0.236346, -0.166483, + 0.225941, 0.109997, -0.147159, 0.147159, -0.266075, 0.111484, 0.078782, + -0.120403, 0.022297, -0.075809, -0.148645, -0.251210, -0.176888, -0.044594, + -0.023783, 0.016351, 0.026756, -0.013378, -0.069863, -0.112970, 0.013378, + 0.086214, 0.014865, 0.352289, -0.240805, -0.135267, -0.114457, -0.472692, + 0.334452, 0.095133, 0.047566, 0.130808, -0.068377, -0.007432, -0.130808, + -0.121889, -0.053512, -0.245265, -0.371613, -0.083241, 0.000000, -0.028243, + 0.029729, -0.093646, -0.004459, -0.038648, -0.108511, -0.475665, -0.169456, + -0.047566, -0.010405, -0.114457, -0.353776, -0.034188, -0.044594, 0.041621, + -0.047566, -0.107025, 0.004459, 0.053512, 0.047566, -0.358235, -0.193239, + 0.040134, -0.096619, -0.054999, 0.099592, 0.032702, 0.205130, -0.170942, + -0.237832, -0.405801, -0.126348, -0.072836, -0.203644, -0.169456, -0.093646, + -0.074323, 0.078782, 0.607959, -0.437017, -0.164996, -0.166483, 0.043107, + -0.016351, 0.258643, 0.065404, -0.057972, 0.017837, 0.080268, 0.050539, + -0.013378, -0.215536, -0.524718, 0.260129, 0.040134, -0.002973, -0.046080, + 0.020810, 0.025270, 0.145672, 0.515799, 0.233373, 0.011892, 0.139727, + 0.126348, 0.065404, -0.007432, -0.008919, 0.035675, 0.083241, 0.040134, + -0.005946, 0.503907, -0.490529, -0.181347, -0.092160, -0.038648, 0.019324, + 0.133781, -0.011892, 0.041621, 0.062431, -0.062431, -0.040134, -0.092160, + -0.111484, -0.133781, -0.130808, -0.484583, -0.248238, 0.037161, -0.092160, + -0.056485, -0.041621, 0.112970, 0.248238, 0.438503, 0.258643, -0.013378, + 0.004459, 0.043107, 0.040134, 0.017837, 0.101079, 0.264589, 0.212563, + 0.014865, 0.285399, 0.153105, 0.170942, 0.358235, 0.334452, 0.086214, + 0.132294, 0.098106, -0.001486, 0.107025, 0.200671, -0.026756, 0.344857, + 0.227427, -0.041621, 0.098106, 0.063917, -0.093646, 0.130808, 0.285399, + -0.319587, 0.035675, -0.017837, -0.319587, 0.016351, -0.098106, -0.017837, + 0.083241, 0.074323, -0.054999, 0.276480, 0.316614, -0.099592, -0.059458, + 0.156077, -0.043107, 0.035675, 0.056485, -0.022297, 0.017837, -0.001486, + 0.340398, 0.492016, 0.004459, 0.057972, -0.150132, -0.206617, -0.257156, + -0.248238, -0.080268, -0.164996, 0.352289, -0.054999, -0.056485, 0.010405, + -0.049053, -0.041621, -0.099592, 0.013378, -0.089187, 0.057972, -0.413234, + 0.217022, 0.013378, -0.080268, -0.035675, 0.035675, 0.007432, 0.002973, + -0.469719, 0.141213, 0.136754, 0.153105, 0.130808, -0.104052, -0.508367, + -0.291345, -0.072836, -0.019324, -0.252697, -0.214049, -0.214049, 0.130808, + 0.484583 +}; + +// Bias of shape {64} +const float bias_data_16x1x1[] = { + -0.245395, -0.083545, -0.262522, -0.407912, -0.560898, -0.364789, -0.037964, + -0.378594, 0.178152, 0.400380, -0.301349, -0.240913, -0.159454, -0.158757, + -0.073665, 0.455906, -0.061232, 0.318907, -0.226993, -0.344644, 0.140316, + 0.559608, 0.109774, 0.437391, 0.113849, -0.162068, 0.039572, 0.569472, + 0.460205, 0.113459, 0.370469, 0.176811, 0.203063, -0.296975, -0.271655, + 0.059862, -0.159912, -0.077310, -0.338314, -0.195477, -0.256762, 0.233834, + 0.083172, 0.029040, -0.236288, -0.267054, -0.166627, 0.188319, -0.271391, + -0.222920, 0.106463, 0.263614, 0.384986, -0.125957, -0.095890, 0.363686, + -0.036990, -0.358884, -0.178254, 0.305596, 0.390088, -0.189437, 0.613409, + 0.399639 +}; + +// Activation state with shape {64, 8}. These initial values must be copied into +// a mutable activation state tensor. +const float initial_activation_state_data_16x1x1[] = { + -0.582275, -0.586623, -1.262373, -1.277279, -1.542175, -1.271999, -1.429757, + -1.184425, -0.462094, -1.443421, 0.230736, -0.494701, -0.354955, -2.534061, + -4.277471, -4.218467, 0.403711, -0.248748, -0.330111, -0.467683, 0.549047, + 0.733511, -0.230115, 0.793136, -1.126353, -0.984123, -0.081984, -0.222351, + 0.692830, 0.517060, 1.367958, 2.118860, -0.116766, -0.826365, -2.402700, + -2.313884, -2.898954, -2.076005, -2.405185, -2.755481, 0.329490, 0.085400, + -1.485966, -2.034702, -2.161405, -1.269515, -1.151818, -1.823841, 0.561469, + 1.109273, 1.693411, -0.082605, -0.069252, -1.225107, -1.330693, -1.411435, + 0.253406, -0.357439, -1.593415, -0.879779, -1.111136, 1.821357, 2.471952, + 1.236908, -4.014127, -2.810448, -2.944604, -1.930980, -1.566398, -0.838166, + -0.319242, 0.749349, 1.156476, 0.658670, 1.997437, 2.080663, 2.912618, + 2.677224, 2.642442, 2.796163, -0.272349, -0.473273, 3.120063, 2.747097, + 3.595510, 1.874150, 2.049919, 2.093396, -1.049959, 0.277939, -1.255541, + -1.052443, -1.810177, -0.883505, -0.538178, 0.524203, -1.017662, -0.269244, + 0.039129, -0.227941, -0.114592, -2.018243, -2.548968, -0.706804, 0.890959, + 0.102480, 0.349986, 0.405885, 1.287216, 0.756181, 0.319242, -0.641590, + -3.841774, -2.716042, -4.342065, -3.826557, -2.924729, -1.643724, -1.237839, + -0.597492, -1.954892, -1.215169, -1.528201, -1.018904, -0.863941, -0.293467, + 0.039439, 0.672023, 1.408019, 1.362679, 1.467644, 1.006171, 0.310236, + -0.249990, -1.048406, -0.752144, -1.831605, -1.058033, -1.096541, -0.293467, + 0.051551, 0.232600, 0.088816, 2.570395, 0.704009, 2.465120, 3.010751, + 2.139357, 0.630410, 1.006171, 1.545281, 1.486898, -1.162998, -2.344317, + -4.593918, -3.522842, -2.872247, -1.416714, -0.642521, -0.230115, 0.315205, + -0.368930, -0.162726, 0.396879, 0.505570, 0.534451, 0.554947, 1.270447, + 0.388805, 0.531967, -1.243119, -0.671713, -1.214859, -0.238189, 0.016459, + -1.164550, 0.609603, 3.293348, 2.600208, 1.454290, -1.034121, -1.760179, + -1.192500, -0.613951, 3.449553, 2.912618, 1.917937, 1.435968, 0.879158, + 1.118279, 0.102791, -0.502465, -0.239121, -0.092853, 1.786265, 1.943091, + 2.547104, 2.630641, 2.585302, 2.965411, -0.945615, -2.538720, -2.474126, + -1.088156, 0.056209, 0.864873, 0.170490, 0.457435, 0.545941, 0.752765, + 1.569503, 1.129459, 0.662086, -0.527929, -0.810838, -1.662978, 1.285042, + 1.653040, 4.130893, 2.961995, 4.147041, 3.256393, 3.881524, 2.522571, + -0.875431, -1.112378, 2.105817, 2.180970, 3.121926, 1.577577, 1.639376, + 2.906407, -0.142230, 0.421101, 2.212335, 2.311399, 3.993321, 3.651719, + 4.206666, 4.678387, -1.304917, -1.130701, -2.543067, -2.500212, -2.197118, + -1.197158, -0.949652, -0.282908, 0.320795, -1.543728, 1.290322, 1.788128, + 3.957297, 3.205774, 2.892432, 2.297114, 0.138814, -0.139435, 0.936920, + 0.344707, 0.723263, -1.772290, -3.138385, -2.287177, -2.405806, -1.859864, + -4.572801, -3.410424, -3.855748, -2.239663, -2.269786, -1.582857, 4.238342, + 3.858543, 2.499901, 1.087535, 0.290051, -0.026086, -0.880400, -2.602692, + -1.404292, 0.253096, -0.665502, -1.443421, -0.925119, -0.096580, 1.115484, + 1.846200, -1.604284, -1.244671, -0.464888, 0.326385, 0.168006, -0.262723, + -0.744691, 0.953379, -0.407127, -0.349986, -1.154302, 0.831023, 1.590931, + 2.538720, 2.063583, 3.697680, -0.752455, -1.293117, -1.330693, -1.869802, + -0.592523, 0.631652, 1.198089, -0.481347, 3.738983, 4.153252, 2.782499, + 2.244321, 0.709289, 1.650245, 1.700865, 0.385078, 2.192460, 2.610456, + 4.009780, 3.492719, 2.574743, 2.116687, 1.856138, 1.205853, 2.722563, + 4.075305, 5.415935, 3.009198, 2.715421, 1.571056, 0.897170, -2.430339, + 0.749970, 0.425760, -0.302783, 0.817359, 1.031636, 1.913589, 2.686229, + 1.631923, -1.459259, -1.793097, -1.187531, -1.553355, -0.844998, -1.296843, + -1.805519, -0.486627, 0.909591, 2.082837, -1.473855, -2.456735, -3.851401, + -2.760139, -3.060438, -2.605487, -2.138735, -2.441519, -1.333177, -1.353984, + -0.245642, -0.588486, 0.033850, 2.084700, 0.076084, 0.690035, 0.747797, + 0.594697, -1.016109, -1.348083, -1.201195, -1.088466, 2.045571, 2.460772, + 0.717984, 0.041613, -0.721711, 1.134738, 2.322269, 1.112378, -0.307441, + -0.581033, -0.868599, -0.018633, 0.856488, 0.919839, 0.303094, -0.433213, + 0.811148, -0.508986, -1.060828, -1.227591, -1.566087, -1.117968, -1.385038, + -2.011101, -0.490353, -1.849616, -0.594697, -1.055859, 1.110205, 0.622646, + 0.145957, 0.359303, 1.012072, 0.774814, -0.400295, -1.484103, -2.007374, + -1.441247, -0.997787, -0.581033, -0.545941, -0.306510, 0.693451, 0.087264, + -0.227320, -1.211753, -1.532859, -1.688753, 0.065215, 0.134777, 0.608051, + -0.393152, -0.214588, -0.635689, -1.499320, 0.069562, -1.555839, -2.633126, + -2.966032, -1.550870, -0.101549, 0.874189, 0.436318, 0.299367, 2.289972, + 2.339659, 2.602071, 1.564535, 0.019254, -0.583207, -1.295912, -2.424749, + -1.221070, -1.175109, -0.577306, -0.102791, 1.877876, 2.568222, 2.173827, + 3.131243, 2.637784, 2.088737, 3.679047, 3.218506, 2.483442, 1.650556, + 1.363611, -0.027328, 1.486898, -0.721711, -3.684327, -3.006093, -3.777491, + -2.327548, -2.737470, -4.549510, -0.060867, 0.127635, 0.680408, 0.581344, + 0.320174, -0.403090, -0.838166, 0.293777, -0.995613, -0.165521, -0.419859, + 1.110515, 1.203679, 1.749931, 2.467294, 4.276539, 0.031055, -0.967664, + 1.167035, 1.865144, 3.221923, 3.248630, 4.121266, 4.187723, 0.749039, + -1.571056, 0.785994, 1.568572, 3.759479, 3.588678, 4.116608, 3.864444, + -0.290051, -0.271107, 0.375140, 0.537556, 0.536314, 0.095959, 0.054656, + 0.088816 +}; + +// One output with shape {1, 64} +const float golden_output_16x1x1[] = { + -0.087914, 1.145864, -0.418088, -1.556392, -0.925298, 0.205252, 0.289119, + 1.331180, -0.218010, 0.963057, -2.225886, 1.248478, 1.448983, 0.355467, + 1.682174, 0.803739, 0.449738, 0.543566, 1.916269, -2.975136, 0.222774, + 0.241589, -0.104216, 1.561748, 0.936818, -0.089907, -0.520117, -0.870353, + 1.606074, 0.895770, 0.521297, -0.369994, -0.889351, -2.809309, 2.404628, + 1.069754, -0.195456, -1.105652, 1.272715, -1.233177, 1.271416, -1.691805, + -1.058125, -0.716227, 0.052540, 1.262483, 0.540555, 1.735760, -0.539197, + -0.014367, -0.243002, 1.072254, 0.528985, -0.731151, -1.262649, 2.338702, + -0.603093, 0.970736, -3.567897, 0.035085, -0.201711, -0.550400, 1.545573, + -1.805005 +}; + +// One output with shape {1, 64} +const float golden_output_relu_16x1x1[] = { + 0.000000, 1.145864, 0.000000, 0.000000, 0.000000, 0.205252, 0.289119, + 1.331180, 0.000000, 0.963057, 0.000000, 1.248478, 1.448983, 0.355467, + 1.682174, 0.803739, 0.449738, 0.543566, 1.916269, 0.000000, 0.222774, + 0.241589, 0.000000, 1.561748, 0.936818, 0.000000, 0.000000, 0.000000, + 1.606074, 0.895770, 0.521297, 0.000000, 0.000000, 0.000000, 2.404628, + 1.069754, 0.000000, 0.000000, 1.272715, 0.000000, 1.271416, 0.000000, + 0.000000, 0.000000, 0.052540, 1.262483, 0.540555, 1.735760, 0.000000, + 0.000000, 0.000000, 1.072254, 0.528985, 0.000000, 0.000000, 2.338702, + 0.000000, 0.970736, 0.000000, 0.035085, 0.000000, 0.000000, 1.545573, + 0.000000 +}; + +template +void ValidateSVDFGoldens(const int batch_size, const int num_units, + const int input_size, const int rank, + TfLiteTensor *tensors, const int tensor_count, + TfLiteFusedActivation activaiton, + const T *input_sequences_data, + const int input_sequences_len, T *output_data, + const T *expected_output, float tolerance = 1e-5f) +{ + TfLiteSVDFParams params; + params.rank = rank; + params.activation = activaiton; + + int inputs_array_data[] = { 5, 0, 1, 2, 3, 4 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + + int outputs_array_data[] = { 1, 5 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_SVDF(); + micro::KernelRunner runner(registration, tensors, tensor_count, inputs_array, + outputs_array, ¶ms); + + TfLiteStatus init_and_prepare_status = runner.InitAndPrepare(); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, init_and_prepare_status); + + // Abort early to make it clear init and prepare failed. + if (init_and_prepare_status != kTfLiteOk) { + return; + } + + int num_inputs = input_sequences_len / (input_size * batch_size); + + for (int i = 0; i < num_inputs; ++i) { + const T *input_batch_start = + input_sequences_data + i * input_size * batch_size; + + memcpy(tensors[0].data.raw, input_batch_start, tensors[0].bytes); + TfLiteStatus status = runner.Invoke(); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, status); + + // Only validate outputs when invoke has succeeded. + if (status == kTfLiteOk) { + int output_idx = 0; + int golden_idx = i * batch_size * num_units; + for (int j = golden_idx; j < golden_idx + batch_size * num_units; ++j) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output[j], output_data[output_idx], + tolerance); + output_idx++; + } + } + } +} + +#if !defined(XTENSA) // Needed to avoid build errors from unused functions. +void TestSVDF(const int batch_size, const int num_units, const int input_size, + const int memory_size, const int rank, + TfLiteFusedActivation activation, float *input_data, + const float *feature_weights_data, const float *time_weights_data, + float *activation_state_data, const float *bias_data, + float *scratch_data, float *output_data, + const float *input_sequences_data, int input_sequences_len, + const float *expected_output, float tolerance = 1e-5f) +{ + const int num_filters = num_units * rank; + + int input_dims_arg[] = { 2, batch_size, input_size }; + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_arg); + + int feature_weights_dims_args[] = { 2, num_filters, input_size }; + TfLiteIntArray *feature_weights_dims = + IntArrayFromInts(feature_weights_dims_args); + + int time_weights_dims_args[] = { 2, num_filters, memory_size }; + TfLiteIntArray *time_weights_dims = IntArrayFromInts(time_weights_dims_args); + + int activation_state_dims_args[] = { 2, batch_size, memory_size * num_filters }; + TfLiteIntArray *activation_state_dims = + IntArrayFromInts(activation_state_dims_args); + + int bias_dims_args[] = { 1, num_units }; + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_args); + + int output_dims_args[] = { 2, batch_size, num_units }; + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_args); + + const int tensor_count = 6; // 5 inputs, 1 output + TfLiteTensor tensors[] = { + CreateTensor(input_data, input_dims), + CreateTensor(feature_weights_data, feature_weights_dims), + CreateTensor(time_weights_data, time_weights_dims), + CreateTensor(bias_data, bias_dims), + CreateTensor(activation_state_data, activation_state_dims, + /*is_variable=*/true), + CreateTensor(output_data, output_dims), + }; + + ValidateSVDFGoldens(batch_size, num_units, input_size, rank, tensors, + tensor_count, activation, input_sequences_data, + input_sequences_len, output_data, expected_output, + tolerance); +} +#endif + +// The pattern to this method's arguemnts is: +// +// for each tensor in +// {input, feature weights, time weights, bias, activation state, output}: +// +inline void TestIntegerSVDF( + const int batch_size, const int num_units, const int input_size, + const int memory_size, const int rank, TfLiteFusedActivation activation, + int8_t *input_quantized, float input_scale, int input_zero_point, + const float *feature_weights_data, int8_t *feature_weights_quantized, + const float feature_weights_scale, const float *time_weights_data, + int16_t *time_weights_quantized, float time_weights_scale, + const float *bias_data, int32_t *bias_quantized, + const float *initial_activation_state_data, + int16_t *activation_state_quantized, float activation_state_scale, + int8_t *output_data, float output_scale, int output_zero_point, + const float *input_sequences_data, int8_t *input_sequences_quantized, + const int input_sequences_len, const float *golden_output, + int8_t *golden_output_quantized, int golden_output_len) +{ + const int num_filters = num_units * rank; + + int input_dims_arg[] = { 2, batch_size, input_size }; + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_arg); + + int feature_weights_dims_args[] = { 2, num_filters, input_size }; + TfLiteIntArray *feature_weights_dims = + IntArrayFromInts(feature_weights_dims_args); + + int time_weights_dims_args[] = { 2, num_filters, memory_size }; + TfLiteIntArray *time_weights_dims = IntArrayFromInts(time_weights_dims_args); + + int bias_dims_data[] = { 1, num_units }; + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + + int activation_state_dims_args[] = { 2, batch_size, memory_size * num_filters }; + TfLiteIntArray *activation_state_dims = + IntArrayFromInts(activation_state_dims_args); + + int output_dims_args[] = { 2, batch_size, num_units }; + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_args); + + const int tensor_count = 6; // 5 inputs, 1 output + + TfLiteTensor tensors[] = { + CreateQuantizedTensor(input_quantized, input_dims, input_scale, + input_zero_point), + CreateQuantizedTensor(feature_weights_data, feature_weights_quantized, + feature_weights_dims, feature_weights_scale, 0), + CreateQuantizedTensor(time_weights_data, time_weights_quantized, + time_weights_dims, time_weights_scale, 0), + CreateQuantizedBiasTensor(bias_data, bias_quantized, bias_dims, + time_weights_scale, activation_state_scale), + CreateQuantizedTensor(initial_activation_state_data, + activation_state_quantized, activation_state_dims, + activation_state_scale, 0, + /*is_variable=*/true), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + tflite::Quantize(golden_output, golden_output_quantized, golden_output_len, + output_scale, output_zero_point); + tflite::Quantize(input_sequences_data, input_sequences_quantized, + input_sequences_len, input_scale, input_zero_point); + + ValidateSVDFGoldens(batch_size, num_units, input_size, rank, tensors, + tensor_count, activation, input_sequences_quantized, + input_sequences_len, output_data, golden_output_quantized, + /*tolerance*/ 1); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +#if !defined(XTENSA) // TODO(b/170332589): xtensa kernels are less general than \ + // reference kernels and we ifdef out test cases that are \ + // currently known to fail. +TF_LITE_MICRO_TEST(SvdfFloat2x2Input2x4OutputShouldMatchGolden) +{ + constexpr int batch_size = 2; + constexpr int num_units = 4; + constexpr int input_size = 2; + constexpr int memory_size = 10; + constexpr int rank = 2; + constexpr int num_filters = num_units * rank; + + const int input_size_dims_count = batch_size * input_size; + float input_data[input_size_dims_count]; + + const int activation_state_dims_count = + batch_size * memory_size * num_filters; + float activation_state_data[activation_state_dims_count]; + + memcpy(activation_state_data, + tflite::testing::initial_activation_state_data_2x2x10, + sizeof(tflite::testing::initial_activation_state_data_2x2x10)); + + const int scratch_dims_count = batch_size * num_filters; + float scratch_data[scratch_dims_count]; + + const int output_dims_count = batch_size * num_units; + float output_data[output_dims_count]; + + tflite::testing::TestSVDF( + batch_size, num_units, input_size, memory_size, rank, kTfLiteActNone, + input_data, tflite::testing::feature_weights_data_2x2x10, + tflite::testing::time_weights_data_2x2x10, activation_state_data, + tflite::testing::bias_data_2x2x10, scratch_data, output_data, + tflite::testing::input_data_2x2x10, + sizeof(tflite::testing::input_data_2x2x10) / sizeof(float), + tflite::testing::golden_output_2x2x10); +} +#endif + +TF_LITE_MICRO_TEST(SvdfQuantized2x2Input2x4OutputShouldMatchGolden) +{ + constexpr int batch_size = 2; + constexpr int num_units = 4; + constexpr int input_size = 2; + constexpr int memory_size = 10; + constexpr int rank = 2; + constexpr int num_filters = num_units * rank; + + const int input_size_dims_count = batch_size * input_size; + + const int activation_state_dims_count = + batch_size * memory_size * num_filters; + + const int output_dims_count = batch_size * num_units; + int8_t output_data[output_dims_count]; + + float input_scale = 2.5f / INT8_MAX; // Range is [-2.5, 2.5] + float feature_weights_scale = 1.f / INT8_MAX; // Range is [-1, 1] + float time_weights_scale = 1.f / INT16_MAX; // Range is [-1, 1] + float activation_state_scale = 16.f / INT16_MAX; // Range is [-16, 16] + float output_scale = 1.f / INT8_MAX; // Range is [-1, 1] + + int input_zero_point = 0; + int output_zero_point = 0; + + int8_t input_quantized[input_size_dims_count]; + int8_t input_sequences_quantized[sizeof(tflite::testing::input_data_2x2x10) / + sizeof(float)]; + int8_t feature_weights_quantized + [sizeof(tflite::testing::feature_weights_data_2x2x10) / sizeof(float)]; + int16_t + time_weights_quantized[sizeof(tflite::testing::time_weights_data_2x2x10) / + sizeof(float)]; + int16_t activation_state_quantized[activation_state_dims_count]; + int32_t + bias_quantized[sizeof(tflite::testing::bias_data_2x2x10) / sizeof(float)]; + int8_t golden_quantized[sizeof(tflite::testing::golden_output_2x2x10) / + sizeof(float)]; + + tflite::testing::TestIntegerSVDF( + batch_size, num_units, input_size, memory_size, rank, kTfLiteActRelu, + input_quantized, input_scale, input_zero_point, + tflite::testing::feature_weights_data_2x2x10, feature_weights_quantized, + feature_weights_scale, tflite::testing::time_weights_data_2x2x10, + time_weights_quantized, time_weights_scale, + tflite::testing::bias_data_2x2x10, bias_quantized, + tflite::testing::initial_activation_state_data_2x2x10, + activation_state_quantized, activation_state_scale, output_data, + output_scale, output_zero_point, tflite::testing::input_data_2x2x10, + input_sequences_quantized, + sizeof(tflite::testing::input_data_2x2x10) / sizeof(float), + tflite::testing::golden_output_2x2x10, golden_quantized, + sizeof(tflite::testing::golden_output_2x2x10) / sizeof(float)); +} + +#if !defined(XTENSA) // TODO(b/170332589): xtensa kernels are less general than \ + // reference kernels and we ifdef out test cases that are \ + // currently known to fail. +TF_LITE_MICRO_TEST(SvdfFloat1x16Input64x1OutputShouldMatchGolden) +{ + constexpr int batch_size = 1; + constexpr int num_units = 64; + constexpr int input_size = 16; + constexpr int memory_size = 8; + constexpr int rank = 1; + constexpr int num_filters = num_units * rank; + constexpr int activation_state_dims_count = + batch_size * memory_size * num_filters; + constexpr int output_dims_count = batch_size * num_units; + constexpr int input_dims_count = batch_size * input_size; + + float input_data[input_dims_count]; + float output_data[output_dims_count]; + float scratch_buffer[batch_size * num_filters]; + float activation_state_data_mutable[activation_state_dims_count]; + + // Initialize activation state to starting values. + memcpy(activation_state_data_mutable, + tflite::testing::initial_activation_state_data_16x1x1, + sizeof(tflite::testing::initial_activation_state_data_16x1x1)); + + tflite::testing::TestSVDF( + batch_size, num_units, input_size, memory_size, rank, kTfLiteActNone, + input_data, tflite::testing::feature_weights_data_16x1x1, + tflite::testing::time_weights_data_16x1x1, activation_state_data_mutable, + tflite::testing::bias_data_16x1x1, scratch_buffer, output_data, + tflite::testing::input_data_16x1x1, input_size, + tflite::testing::golden_output_16x1x1); +} + +TF_LITE_MICRO_TEST(SvdfFloat1x16Input64x1OutputReluShouldMatchGolden) +{ + constexpr int batch_size = 1; + constexpr int num_units = 64; + constexpr int input_size = 16; + constexpr int memory_size = 8; + constexpr int rank = 1; + constexpr int num_filters = num_units * rank; + constexpr int activation_state_dims_count = + batch_size * memory_size * num_filters; + constexpr int output_dims_count = batch_size * num_units; + constexpr int input_dims_count = batch_size * input_size; + + float input_data[input_dims_count]; + float output_data[output_dims_count]; + float scratch_buffer[batch_size * num_filters]; + float activation_state_data_mutable[activation_state_dims_count]; + + // Initialize activation state to starting values. + memcpy(activation_state_data_mutable, + tflite::testing::initial_activation_state_data_16x1x1, + sizeof(tflite::testing::initial_activation_state_data_16x1x1)); + + tflite::testing::TestSVDF( + batch_size, num_units, input_size, memory_size, rank, kTfLiteActRelu, + input_data, tflite::testing::feature_weights_data_16x1x1, + tflite::testing::time_weights_data_16x1x1, activation_state_data_mutable, + tflite::testing::bias_data_16x1x1, scratch_buffer, output_data, + tflite::testing::input_data_16x1x1, input_size, + tflite::testing::golden_output_relu_16x1x1); +} +#endif + +TF_LITE_MICRO_TEST(SvdfQuantized1x16Input64x1OutputShouldMatchGolden) +{ + constexpr int batch_size = 1; + constexpr int num_units = 64; + constexpr int input_size = 16; + constexpr int memory_size = 8; + constexpr int rank = 1; + constexpr int num_filters = num_units * rank; + constexpr int activation_state_dims_count = + batch_size * memory_size * num_filters; + constexpr int output_dims_count = batch_size * num_units; + constexpr int input_dims_count = batch_size * input_size; + + int8_t output_data[output_dims_count]; + + float input_scale = 0.10075444; + float feature_weights_scale = 0.00649388; + float time_weights_scale = 0.001571355; + float activation_state_scale = 0.00045896982; + float output_scale = 0.051445257; + + int input_zero_point = 2; + int output_zero_point = 0; + + int8_t input_quantized[input_dims_count]; + int8_t input_sequences_quantized[sizeof(tflite::testing::input_data_16x1x1) / + sizeof(float)]; + int8_t feature_weights_quantized + [sizeof(tflite::testing::feature_weights_data_16x1x1) / sizeof(float)]; + int16_t + time_weights_quantized[sizeof(tflite::testing::time_weights_data_16x1x1) / + sizeof(float)]; + int16_t activation_state_quantized[activation_state_dims_count]; + int32_t + bias_quantized[sizeof(tflite::testing::bias_data_16x1x1) / sizeof(float)]; + int8_t golden_quantized[sizeof(tflite::testing::golden_output_16x1x1) / + sizeof(float)]; + + tflite::testing::TestIntegerSVDF( + batch_size, num_units, input_size, memory_size, rank, kTfLiteActNone, + input_quantized, input_scale, input_zero_point, + tflite::testing::feature_weights_data_16x1x1, feature_weights_quantized, + feature_weights_scale, tflite::testing::time_weights_data_16x1x1, + time_weights_quantized, time_weights_scale, + tflite::testing::bias_data_16x1x1, bias_quantized, + tflite::testing::initial_activation_state_data_16x1x1, + activation_state_quantized, activation_state_scale, output_data, + output_scale, output_zero_point, tflite::testing::input_data_16x1x1, + input_sequences_quantized, + sizeof(tflite::testing::input_data_16x1x1) / sizeof(float), + tflite::testing::golden_output_16x1x1, golden_quantized, + sizeof(tflite::testing::golden_output_16x1x1) / sizeof(float)); +} + +TF_LITE_MICRO_TEST(SvdfQuantized1x16Input64x1OutputReluShouldMatchGolden) +{ + constexpr int batch_size = 1; + constexpr int num_units = 64; + constexpr int input_size = 16; + constexpr int memory_size = 8; + constexpr int rank = 1; + constexpr int num_filters = num_units * rank; + constexpr int activation_state_dims_count = + batch_size * memory_size * num_filters; + constexpr int output_dims_count = batch_size * num_units; + constexpr int input_dims_count = batch_size * input_size; + + int8_t output_data[output_dims_count]; + + float input_scale = 0.10075444; + float feature_weights_scale = 0.00649388; + float time_weights_scale = 0.001571355; + float activation_state_scale = 0.00045896982; + float output_scale = 0.051445257; + + int input_zero_point = 2; + int output_zero_point = -128; + + int8_t input_quantized[input_dims_count]; + int8_t input_sequences_quantized[sizeof(tflite::testing::input_data_16x1x1) / + sizeof(float)]; + int8_t feature_weights_quantized + [sizeof(tflite::testing::feature_weights_data_16x1x1) / sizeof(float)]; + int16_t + time_weights_quantized[sizeof(tflite::testing::time_weights_data_16x1x1) / + sizeof(float)]; + int16_t activation_state_quantized[activation_state_dims_count]; + int32_t + bias_quantized[sizeof(tflite::testing::bias_data_16x1x1) / sizeof(float)]; + int8_t golden_quantized[sizeof(tflite::testing::golden_output_relu_16x1x1) / + sizeof(float)]; + + tflite::testing::TestIntegerSVDF( + batch_size, num_units, input_size, memory_size, rank, kTfLiteActRelu, + input_quantized, input_scale, input_zero_point, + tflite::testing::feature_weights_data_16x1x1, feature_weights_quantized, + feature_weights_scale, tflite::testing::time_weights_data_16x1x1, + time_weights_quantized, time_weights_scale, + tflite::testing::bias_data_16x1x1, bias_quantized, + tflite::testing::initial_activation_state_data_16x1x1, + activation_state_quantized, activation_state_scale, output_data, + output_scale, output_zero_point, tflite::testing::input_data_16x1x1, + input_sequences_quantized, + sizeof(tflite::testing::input_data_16x1x1) / sizeof(float), + tflite::testing::golden_output_relu_16x1x1, golden_quantized, + sizeof(tflite::testing::golden_output_relu_16x1x1) / sizeof(float)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh.cc new file mode 100644 index 00000000..96b76206 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh.cc @@ -0,0 +1,163 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/tanh.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" +#include "tensorflow/lite/micro/micro_utils.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace activations { +namespace { +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +struct OpData { + int32_t input_zero_point; + int32_t input_range_radius; + int32_t input_multiplier; + int input_left_shift; +}; + +void *TanhInit(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus CalculateArithmeticOpData(TfLiteContext *context, TfLiteNode *node, + OpData *data) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + + TF_LITE_ENSURE_TYPES_EQ(context, input->type, output->type); + + if (input->type == kTfLiteUInt8 || input->type == kTfLiteInt8) { + static constexpr int kInputIntegerBits = 4; + const double input_real_multiplier = + static_cast(input->params.scale) * + static_cast(1 << (31 - kInputIntegerBits)); + + const double q = std::frexp(input_real_multiplier, &data->input_left_shift); + data->input_multiplier = static_cast(TfLiteRound(q * (1ll << 31))); + + data->input_range_radius = + CalculateInputRadius(kInputIntegerBits, data->input_left_shift, 31); + } + return kTfLiteOk; +} + +TfLiteStatus TanhPrepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + + OpData *data = static_cast(node->user_data); + + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + data->input_zero_point = input->params.zero_point; + return CalculateArithmeticOpData(context, node, data); +} + +} // namespace + +TfLiteStatus TanhEval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData &data = *(static_cast(node->user_data)); + + switch (input->type) { + case kTfLiteFloat32: { + reference_ops::Tanh(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + case kTfLiteInt16: { + TanhParams params; + params.input_left_shift = data.input_left_shift; + reference_ops::Tanh(params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + case kTfLiteUInt8: { + TanhParams params; + params.input_zero_point = data.input_zero_point; + params.input_range_radius = data.input_range_radius; + params.input_multiplier = data.input_multiplier; + params.input_left_shift = data.input_left_shift; + reference_ops::Tanh(params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + + return kTfLiteOk; + } break; + case kTfLiteInt8: { + reference_integer_ops::Tanh( + data.input_zero_point, data.input_range_radius, data.input_multiplier, + data.input_left_shift, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output)); + return kTfLiteOk; + } break; + default: + TF_LITE_KERNEL_LOG(context, "Input %s, output %s not supported.", + TfLiteTypeGetName(input->type), + TfLiteTypeGetName(output->type)); + return kTfLiteError; + } +} + +} // namespace activations + +TfLiteRegistration Register_TANH() +{ + return { /*init=*/activations::TanhInit, + /*free=*/nullptr, + /*prepare=*/activations::TanhPrepare, + /*invoke=*/activations::TanhEval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh_test.cc new file mode 100644 index 00000000..23772385 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/tanh_test.cc @@ -0,0 +1,230 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int tanh_vec_size = 90; + +const float tanh_input_vec_fp[tanh_vec_size] = { + -8.0000000000, -7.8181818182, -7.6363636364, -7.4545454545, -7.2727272727, + -7.0909090909, -6.9090909091, -6.7272727273, -6.5454545455, -6.3636363636, + -6.1818181818, -6.0000000000, -5.8181818182, -5.6363636364, -5.4545454545, + -5.2727272727, -5.0909090909, -4.9090909091, -4.7272727273, -4.5454545455, + -4.3636363636, -4.1818181818, -4.0000000000, -3.8181818182, -3.6363636364, + -3.4545454545, -3.2727272727, -3.0909090909, -2.9090909091, -2.7272727273, + -2.5454545455, -2.3636363636, -2.1818181818, -2.0000000000, -1.8181818182, + -1.6363636364, -1.4545454545, -1.2727272727, -1.0909090909, -0.9090909091, + -0.7272727273, -0.5454545455, -0.3636363636, -0.1818181818, 0.0000000000, + 0.1818181818, 0.3636363636, 0.5454545455, 0.7272727273, 0.9090909091, + 1.0909090909, 1.2727272727, 1.4545454545, 1.6363636364, 1.8181818182, + 2.0000000000, 2.1818181818, 2.3636363636, 2.5454545455, 2.7272727273, + 2.9090909091, 3.0909090909, 3.2727272727, 3.4545454545, 3.6363636364, + 3.8181818182, 4.0000000000, 4.1818181818, 4.3636363636, 4.5454545455, + 4.7272727273, 4.9090909091, 5.0909090909, 5.2727272727, 5.4545454545, + 5.6363636364, 5.8181818182, 6.0000000000, 6.1818181818, 6.3636363636, + 6.5454545455, 6.7272727273, 6.9090909091, 7.0909090909, 7.2727272727, + 7.4545454545, 7.6363636364, 7.8181818182, 8.0000000000 +}; + +const float tanh_output_vec_fp[tanh_vec_size] = { + -0.9999997749, -0.9999996762, -0.9999995342, -0.9999993300, -0.9999990361, + -0.9999986134, -0.9999980053, -0.9999971306, -0.9999958722, -0.9999940619, + -0.9999914578, -0.9999877117, -0.9999823226, -0.9999745703, -0.9999634183, + -0.9999473758, -0.9999242982, -0.9998911009, -0.9998433469, -0.9997746542, + -0.9996758446, -0.9995337191, -0.9993292997, -0.9990353053, -0.9986125310, + -0.9980046622, -0.9971308601, -0.9958751909, -0.9940716137, -0.9914827859, + -0.9877703933, -0.9824541388, -0.9748561217, -0.9640275801, -0.9486568273, + -0.9269625051, -0.8965880154, -0.8545351057, -0.7972097087, -0.7206956332, + -0.6213939966, -0.4971057414, -0.3484130125, -0.1798408185, 0.0000000000, + 0.1798408185, 0.3484130125, 0.4971057414, 0.6213939966, 0.7206956332, + 0.7972097087, 0.8545351057, 0.8965880154, 0.9269625051, 0.9486568273, + 0.9640275801, 0.9748561217, 0.9824541388, 0.9877703933, 0.9914827859, + 0.9940716137, 0.9958751909, 0.9971308601, 0.9980046622, 0.9986125310, + 0.9990353053, 0.9993292997, 0.9995337191, 0.9996758446, 0.9997746542, + 0.9998433469, 0.9998911009, 0.9999242982, 0.9999473758, 0.9999634183, + 0.9999745703, 0.9999823226, 0.9999877117, 0.9999914578, 0.9999940619, + 0.9999958722, 0.9999971306, 0.9999980053, 0.9999986134, 0.9999990361, + 0.9999993300, 0.9999995342, 0.9999996762, 0.9999997749 +}; + +void TestTanhFloat(int input_dims_data[], const float *input_data, + const float *expected_output_data, int output_dims_data[], + float *output_data, const float tolerance) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_TANH(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], + tolerance); + } +} + +template +void TestTanhQuantized(int input_dims_data[], const float *input_data, + T *input_quantized, float input_scale, + int input_zero_point, const float *expected_output_data, + T *expected_output_quantized, int output_dims_data[], + float output_scale, int output_zero_point, + T *output_quantized, const int tolerance) +{ + static_assert(sizeof(T) == 1, "Valid only for 8bit data types"); + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_elements_count = ElementCount(*output_dims); + + tflite::Quantize(expected_output_data, expected_output_quantized, + output_elements_count, output_scale, output_zero_point); + + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedTensor(output_quantized, output_dims, output_scale, + output_zero_point) + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_TANH(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_elements_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_quantized[i], output_quantized[i], + tolerance); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleTestTanhFloat) +{ + using tflite::testing::tanh_input_vec_fp; + using tflite::testing::tanh_output_vec_fp; + using tflite::testing::tanh_vec_size; + + int input_shape[] = { 2, 1, tanh_vec_size }; + int output_shape[] = { 2, 1, tanh_vec_size }; + + float output_data[tanh_vec_size]; + tflite::testing::TestTanhFloat( // + input_shape, // Input shape. + tanh_input_vec_fp, // Input data + tanh_output_vec_fp, // Expected results. + output_shape, // Output shape. + output_data, 1e-7 /* tolerance */); +} + +TF_LITE_MICRO_TEST(SimpleTestTanhUInt8) +{ + using tflite::testing::tanh_input_vec_fp; + using tflite::testing::tanh_output_vec_fp; + using tflite::testing::tanh_vec_size; + + const float input_scale = 16 / 256.f; + const int input_zero_point = 128; + const float output_scale = 1.99999955f / 256.f; + const int output_zero_point = 128; + + int input_shape[] = { 2, 1, tanh_vec_size }; + int output_shape[] = { 2, 1, tanh_vec_size }; + + uint8_t input_quantized[tanh_vec_size]; + uint8_t expected_output_quantized[tanh_vec_size]; + uint8_t output_quantized[tanh_vec_size]; + tflite::testing::TestTanhQuantized( // + input_shape, // Input shape. + tanh_input_vec_fp, input_quantized, // Input data. + input_scale, input_zero_point, // Input quantized info. + tanh_output_vec_fp, expected_output_quantized, // Expected results. + output_shape, // Output shape. + output_scale, output_zero_point, // Output quantized info. + output_quantized, // Operation results + 2 // Tolerance. + ); +} + +TF_LITE_MICRO_TEST(SimpleTestTanhUInt8) +{ + using tflite::testing::tanh_input_vec_fp; + using tflite::testing::tanh_output_vec_fp; + using tflite::testing::tanh_vec_size; + + const float input_scale = 16 / 256.f; + const int input_zero_point = 0; + const float output_scale = 1.99999955f / 256.f; + const int output_zero_point = 0; + + int input_shape[] = { 2, 1, tanh_vec_size }; + int output_shape[] = { 2, 1, tanh_vec_size }; + + int8_t input_quantized[tanh_vec_size]; + int8_t expected_output_quantized[tanh_vec_size]; + int8_t output_quantized[tanh_vec_size]; + tflite::testing::TestTanhQuantized( // + input_shape, // Input shape. + tanh_input_vec_fp, input_quantized, // Input data. + input_scale, input_zero_point, // Input quantized info. + tanh_output_vec_fp, expected_output_quantized, // Expected results. + output_shape, // Output shape. + output_scale, output_zero_point, // Output quantized info. + output_quantized, // Operation results + 2 // Tolerance. + ); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose.cc new file mode 100644 index 00000000..6891abcf --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose.cc @@ -0,0 +1,116 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/kernels/internal/reference/transpose.h" + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/internal/types.h" +#include "tensorflow/lite/kernels/kernel_util.h" + +namespace tflite { +namespace { + +struct TransposeContext { + TransposeContext(TfLiteContext *context, TfLiteNode *node) + { + input = GetInput(context, node, 0); + perm = GetInput(context, node, 1); + output = GetOutput(context, node, 0); + } + const TfLiteTensor *input; + const TfLiteTensor *perm; + TfLiteTensor *output; +}; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 2); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + + TransposeContext op_context(context, node); + + // Ensure validity of input tensor. + TF_LITE_ENSURE_MSG(context, NumDimensions(op_context.input) <= 5, + "Transpose op only supports 1D-5D input arrays."); + TF_LITE_ENSURE_TYPES_EQ(context, op_context.input->type, + op_context.output->type); + + int dims = NumDimensions(op_context.input); + const int32_t *perm_data = GetTensorData(op_context.perm); + + // Ensure validity of the permutations tensor as a 1D tensor. + TF_LITE_ENSURE_EQ(context, NumDimensions(op_context.perm), 1); + TF_LITE_ENSURE_EQ(context, op_context.perm->dims->data[0], dims); + for (int idx = 0; idx < dims; ++idx) { + TF_LITE_ENSURE_MSG(context, (perm_data[idx] >= 0 && perm_data[idx] < dims), + "Transpose op permutations array is out of bounds."); + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TransposeContext op_context(context, node); + + const int32_t *perm_data = GetTensorData(op_context.perm); + const int size = op_context.perm->dims->data[0]; + TransposeParams params; + params.perm_count = size; + for (int i = 0; i < size; ++i) { + params.perm[i] = perm_data[i]; + } + + // Transpose kernel only does rearranging values not numeric evaluations + // on each cell. It's safe to implement per size of scalar type and this + // trick keeps the total code size in a reasonable range. + switch (op_context.input->type) { + case kTfLiteFloat32: + reference_ops::Transpose(params, GetTensorShape(op_context.input), + GetTensorData(op_context.input), + GetTensorShape(op_context.output), + GetTensorData(op_context.output)); + break; + case kTfLiteInt8: + reference_ops::Transpose(params, GetTensorShape(op_context.input), + GetTensorData(op_context.input), + GetTensorShape(op_context.output), + GetTensorData(op_context.output)); + break; + default: + TF_LITE_KERNEL_LOG(context, + "Type %s is currently not supported by Transpose. " + "Only float32 and int8 is supported", + TfLiteTypeGetName(op_context.input->type)); + return kTfLiteError; + } + + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_TRANSPOSE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv.cc new file mode 100644 index 00000000..fdecabd6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv.cc @@ -0,0 +1,300 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/transpose_conv.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/common.h" +#include "tensorflow/lite/kernels/internal/quantization_util.h" +#include "tensorflow/lite/kernels/internal/reference/integer_ops/transpose_conv.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/kernels/padding.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +// For the TfLite transpose_conv implementation, input tensor 0 corresponds to +// the OutputShapeTensor. However, since TFLM does not support dynamic tensors, +// the TFLM implementation ignores input tensor 0 and the only inputs we care +// about are kFilterTensor, kInputTensor and kBiasTensor. +constexpr int kFilterTensor = 1; +constexpr int kInputTensor = 2; +constexpr int kBiasTensor = 3; +constexpr int kOutputTensor = 0; + +// Conv is quantized along dimension 0: +// https://www.tensorflow.org/lite/performance/quantization_spec +constexpr int kConvQuantizedDimension = 0; + +struct OpData { + ConvParams params; + + // A scratch buffer is required for quantized implementations. + int scratch_buffer_index; + + // Multiplier and shift arrays are required for the int8 implementation. + int32_t *per_channel_output_multiplier; + int32_t *per_channel_output_shift; +}; + +inline PaddingType RuntimePaddingType(TfLitePadding padding) +{ + switch (padding) { + case TfLitePadding::kTfLitePaddingSame: + return PaddingType::kSame; + case TfLitePadding::kTfLitePaddingValid: + return PaddingType::kValid; + case TfLitePadding::kTfLitePaddingUnknown: + default: + return PaddingType::kNone; + } +} + +TfLiteStatus CalculateOpData(TfLiteContext *context, TfLiteNode *node, + const TfLiteConvParams *params, int width, + int height, int filter_width, int filter_height, + int out_width, int out_height, + const TfLiteType data_type, OpData *data) +{ + bool has_bias = node->inputs->size == 4; + // Check number of inputs/outputs + TF_LITE_ENSURE(context, has_bias || node->inputs->size == 3); + TF_LITE_ENSURE_EQ(context, node->outputs->size, 1); + + // Matching GetWindowedOutputSize in TensorFlow. + auto padding = params->padding; + TfLitePaddingValues padding_values = ComputePaddingHeightWidth( + params->stride_height, params->stride_width, + params->dilation_height_factor, params->dilation_width_factor, height, + width, filter_height, filter_width, padding, &out_height, &out_width); + + data->params.padding_type = RuntimePaddingType(padding); + data->params.padding_values.width = padding_values.width; + data->params.padding_values.height = padding_values.height; + + // Note that quantized inference requires that all tensors have their + // parameters set. This is usually done during quantized training. + if (data_type != kTfLiteFloat32) { + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = GetInput(context, node, kFilterTensor); + TF_LITE_ENSURE(context, filter != nullptr); + const TfLiteTensor *bias = + GetOptionalInputTensor(context, node, kBiasTensor); + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + int output_channels = filter->dims->data[kConvQuantizedDimension]; + + TF_LITE_ENSURE_STATUS(tflite::PopulateConvolutionQuantizationParams( + context, input, filter, bias, output, params->activation, + &data->params.output_multiplier, &data->params.output_shift, + &data->params.quantized_activation_min, + &data->params.quantized_activation_max, + data->per_channel_output_multiplier, data->per_channel_output_shift, + output_channels)); + } + return kTfLiteOk; +} + +void *Init(TfLiteContext *context, const char *buffer, size_t length) +{ + TFLITE_DCHECK(context->AllocatePersistentBuffer != nullptr); + return context->AllocatePersistentBuffer(context, sizeof(OpData)); +} + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TFLITE_DCHECK(node->user_data != nullptr); + TFLITE_DCHECK(node->builtin_data != nullptr); + + OpData *data = static_cast(node->user_data); + const auto params = static_cast(node->builtin_data); + + TfLiteTensor *output = GetOutput(context, node, kOutputTensor); + TF_LITE_ENSURE(context, output != nullptr); + const TfLiteTensor *input = GetInput(context, node, kInputTensor); + TF_LITE_ENSURE(context, input != nullptr); + const TfLiteTensor *filter = GetInput(context, node, kFilterTensor); + TF_LITE_ENSURE(context, filter != nullptr); + + int input_width = input->dims->data[2]; + int input_height = input->dims->data[1]; + int filter_width = filter->dims->data[2]; + int filter_height = filter->dims->data[1]; + int output_width = output->dims->data[2]; + int output_height = output->dims->data[1]; + + // Dynamically allocate per-channel quantization parameters. + const int num_channels = filter->dims->data[kConvQuantizedDimension]; + data->per_channel_output_multiplier = + static_cast(context->AllocatePersistentBuffer( + context, num_channels * sizeof(int32_t))); + data->per_channel_output_shift = + static_cast(context->AllocatePersistentBuffer( + context, num_channels * sizeof(int32_t))); + + // Quantized kernels use an int32 scratch buffer. + if (input->type == kTfLiteUInt8 || input->type == kTfLiteInt8) { + TFLITE_DCHECK(context->RequestScratchBufferInArena != nullptr); + TFLITE_DCHECK(context->RequestScratchBufferInArena( + context, + GetTensorShape(output).FlatSize() * sizeof(int32_t), + &(data->scratch_buffer_index)) == kTfLiteOk); + } + + // Quantized 16x8 kernels use an int64 scratch buffer. + if (input->type == kTfLiteInt16) { + TFLITE_DCHECK(context->RequestScratchBufferInArena != nullptr); + TFLITE_DCHECK(context->RequestScratchBufferInArena( + context, + GetTensorShape(output).FlatSize() * sizeof(std::int64_t), + &(data->scratch_buffer_index)) == kTfLiteOk); + } + + // All per-channel quantized tensors need valid zero point and scale arrays. + if (input->type == kTfLiteInt8 || input->type == kTfLiteInt16) { + TF_LITE_ENSURE_EQ(context, filter->quantization.type, + kTfLiteAffineQuantization); + + const auto *affine_quantization = + static_cast(filter->quantization.params); + TF_LITE_ENSURE(context, affine_quantization); + TF_LITE_ENSURE(context, affine_quantization->scale); + TF_LITE_ENSURE(context, affine_quantization->zero_point); + + TF_LITE_ENSURE(context, + affine_quantization->scale->size == 1 || + affine_quantization->scale->size == + filter->dims->data[kConvQuantizedDimension]); + TF_LITE_ENSURE_EQ(context, affine_quantization->scale->size, + affine_quantization->zero_point->size); + } + + TF_LITE_ENSURE_STATUS(CalculateOpData( + context, node, params, input_width, input_height, filter_width, + filter_height, output_width, output_height, input->type, data)); + + // Offsets (zero points) + data->params.input_offset = -input->params.zero_point; + data->params.weights_offset = -filter->params.zero_point; + data->params.output_offset = output->params.zero_point; + + // Stride + dilation + data->params.stride_width = params->stride_width; + data->params.stride_height = params->stride_height; + data->params.dilation_width_factor = params->dilation_width_factor; + data->params.dilation_height_factor = params->dilation_height_factor; + + float output_activation_min, output_activation_max; + CalculateActivationRange(params->activation, &output_activation_min, + &output_activation_max); + data->params.float_activation_min = output_activation_min; + data->params.float_activation_max = output_activation_max; + return kTfLiteOk; +} // namespace conv + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + const TfLiteEvalTensor *filter = + tflite::micro::GetEvalInput(context, node, kFilterTensor); + const TfLiteEvalTensor *bias = + (NumInputs(node) == 4) ? tflite::micro::GetEvalInput(context, node, kBiasTensor) : nullptr; + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + + TFLITE_DCHECK(node->user_data != nullptr); + const OpData &data = *(static_cast(node->user_data)); + + TF_LITE_ENSURE_EQ(context, input->type, output->type); + TF_LITE_ENSURE_MSG( + context, + input->type == filter->type || + (input->type == kTfLiteInt16 && filter->type == kTfLiteInt8), + "Hybrid models are not supported on TFLite Micro."); + + switch (input->type) { // Already know in/out types are same. + case kTfLiteFloat32: { + reference_ops::TransposeConv( + data.params, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), + tflite::micro::GetTensorShape(nullptr), nullptr); + break; + } + case kTfLiteInt8: { + int32_t *scratch_buffer = static_cast( + context->GetScratchBuffer(context, data.scratch_buffer_index)); + reference_integer_ops::TransposeConv( + data.params, data.per_channel_output_multiplier, + data.per_channel_output_shift, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), + tflite::micro::GetTensorShape(nullptr), nullptr, scratch_buffer); + break; + } + case kTfLiteInt16: { + std::int64_t *scratch_buffer = static_cast( + context->GetScratchBuffer(context, data.scratch_buffer_index)); + reference_integer_ops::TransposeConv( + data.params, data.per_channel_output_multiplier, + data.per_channel_output_shift, tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorData(input), + tflite::micro::GetTensorShape(filter), + tflite::micro::GetTensorData(filter), + tflite::micro::GetTensorShape(bias), + tflite::micro::GetTensorData(bias), + tflite::micro::GetTensorShape(output), + tflite::micro::GetTensorData(output), + tflite::micro::GetTensorShape(nullptr), nullptr, scratch_buffer); + break; + } + default: + TF_LITE_KERNEL_LOG(context, "Type %s (%d) not supported.", + TfLiteTypeGetName(input->type), input->type); + return kTfLiteError; + } + return kTfLiteOk; +} + +} // namespace + +TfLiteRegistration Register_TRANSPOSE_CONV() +{ + return { /*init=*/Init, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv_test.cc new file mode 100644 index 00000000..956d8885 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_conv_test.cc @@ -0,0 +1,386 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/kernels/conv_test.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +// Common inputs and outputs. +constexpr int kInputElements = 32; +static int kInputShape[] = { 4, 1, 4, 4, 2 }; +static const float kInputData[kInputElements] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 +}; + +constexpr int kFilterElements = 18; +static int kFilterShape[] = { 4, 1, 3, 3, 2 }; +static const float kFilterData[kFilterElements] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 +}; + +constexpr int kBiasElements = 1; +static int kBiasShape[] = { 4, 1, 1, 1, 1 }; +static const float kBiasData[kBiasElements] = { 0 }; + +constexpr int kOutputElements = 16; +static int kOutputShape[] = { 4, 1, 4, 4, 1 }; +static const float kGoldenData[kOutputElements] = { + 184, 412, 568, 528, 678, 1347, 1689, 1434, + 1494, 2715, 3057, 2442, 1968, 3352, 3652, 2760 +}; + +// Transpose conv uses TfLiteConvParams. +static TfLiteConvParams common_conv_params = { kTfLitePaddingSame, // padding + 1, // stride_width + 1, // stride_height + kTfLiteActNone, + 1, + 1 }; + +template +TfLiteStatus InvokeTransposeConv(TfLiteTensor *tensors, int tensors_size, + int output_length, + TfLiteConvParams *conv_params, + T *output_data) +{ + int inputs_array_data[] = { 4, 0, 1, 2, 3 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 4 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::Register_TRANSPOSE_CONV(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, conv_params); + + const char *init_data = reinterpret_cast(conv_params); + TfLiteStatus status = runner.InitAndPrepare(init_data); + if (status != kTfLiteOk) { + return status; + } + return runner.Invoke(); +} + +template +TfLiteStatus ValidateTransposeConvGoldens(TfLiteTensor *tensors, + int tensors_size, + const T *expected_output_data, + int output_length, + TfLiteConvParams *conv_params, + T *output_data, float tolerance) +{ + TfLiteStatus status = InvokeTransposeConv( + tensors, tensors_size, output_length, conv_params, output_data); + if (status != kTfLiteOk) { + return status; + } + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], + tolerance); + } + return kTfLiteOk; +} + +TfLiteStatus TestTransposeConvFloat( + int *input_dims_data, const float *input_data, int *filter_dims_data, + const float *filter_data, int *bias_dims_data, const float *bias_data, + int *output_dims_data, const float *expected_output_data, + TfLiteConvParams *conv_params, float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + int output_shape_dims_data[] = { 1, 0 }; + int32_t *output_shape = nullptr; + TfLiteIntArray *output_shape_dims = IntArrayFromInts(output_shape_dims_data); + + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(output_shape, output_shape_dims), + CreateTensor(filter_data, filter_dims), + CreateTensor(input_data, input_dims), + CreateTensor(bias_data, bias_dims), + CreateTensor(output_data, output_dims), + }; + + return ValidateTransposeConvGoldens(tensors, tensors_size, + expected_output_data, output_dims_count, + conv_params, output_data, 0.001f); +} + +TfLiteStatus TestTransposeConvQuantized( + int *input_dims_data, const float *input_data, int8_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_quantized, float filter_scale, + int *bias_dims_data, const float *bias_data, int32_t *bias_quantized, + float *bias_scales, int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, int8_t *expected_output_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + int8_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + int filter_zero_points[5]; + float filter_scales[5]; + TfLiteAffineQuantization filter_quant; + TfLiteTensor filter_tensor = CreateSymmetricPerChannelQuantizedTensor( + filter_data, filter_quantized, filter_dims, filter_scales, + filter_zero_points, &filter_quant, 0 /* quantized dimension */); + tflite::Quantize(expected_output_data, expected_output_quantized, + output_dims_count, output_scale, 0); + + int output_shape_dims_data[] = { 1, 0 }; + int32_t *output_shape = nullptr; + TfLiteIntArray *output_shape_dims = IntArrayFromInts(output_shape_dims_data); + + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(output_shape, output_shape_dims), filter_tensor, + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedBiasTensor(bias_data, bias_quantized, bias_dims, + input_scale, filter_scale), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + return ValidateTransposeConvGoldens( + tensors, tensors_size, expected_output_quantized, output_dims_count, + conv_params, output_data, 1.0f); +} + +TfLiteStatus TestTransposeConvQuantized( + int *input_dims_data, const float *input_data, int16_t *input_quantized, + float input_scale, int input_zero_point, int *filter_dims_data, + const float *filter_data, int8_t *filter_quantized, float filter_scale, + int *bias_dims_data, const float *bias_data, std::int64_t *bias_quantized, + float *bias_scales, int *bias_zero_points, int *output_dims_data, + const float *expected_output_data, int16_t *expected_output_quantized, + float output_scale, int output_zero_point, TfLiteConvParams *conv_params, + int16_t *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *filter_dims = IntArrayFromInts(filter_dims_data); + TfLiteIntArray *bias_dims = IntArrayFromInts(bias_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + int filter_zero_points[5]; + float filter_scales[5]; + TfLiteAffineQuantization filter_quant; + TfLiteTensor filter_tensor = CreateSymmetricPerChannelQuantizedTensor( + filter_data, filter_quantized, filter_dims, filter_scales, + filter_zero_points, &filter_quant, 0 /* quantized dimension */); + tflite::Quantize(expected_output_data, expected_output_quantized, + output_dims_count, output_scale, 0); + + int output_shape_dims_data[] = { 1, 0 }; + int32_t *output_shape = nullptr; + TfLiteIntArray *output_shape_dims = IntArrayFromInts(output_shape_dims_data); + + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(output_shape, output_shape_dims), filter_tensor, + CreateQuantizedTensor(input_data, input_quantized, input_dims, + input_scale, input_zero_point), + CreateQuantizedBiasTensor(bias_data, bias_quantized, bias_dims, + input_scale, filter_scale), + CreateQuantizedTensor(output_data, output_dims, output_scale, + output_zero_point) + }; + + // Tolerance is slightly looser for 8x16 compared with float, since quant + // error is more pronounced on the finer-grained 16-bit output. + return ValidateTransposeConvGoldens( + tensors, tensors_size, expected_output_quantized, output_dims_count, + conv_params, output_data, 4.0f); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(SimpleTestFloat) +{ + float output_data[tflite::testing::kOutputElements]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestTransposeConvFloat( + tflite::testing::kInputShape, tflite::testing::kInputData, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + tflite::testing::kBiasShape, tflite::testing::kBiasData, + tflite::testing::kOutputShape, tflite::testing::kGoldenData, + &tflite::testing::common_conv_params, output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantizedPerChannel) +{ + int8_t output_data[tflite::testing::kOutputElements]; + + const float input_scale = 0.5f; + const float output_scale = 30.0f; + const float filter_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int8_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + int32_t bias_quantized[tflite::testing::kBiasElements]; + int8_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestTransposeConvQuantized( + tflite::testing::kInputShape, tflite::testing::kInputData, + input_quantized, input_scale, input_zero_point, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + filter_quantized, filter_scale, tflite::testing::kBiasShape, + tflite::testing::kBiasData, bias_quantized, scales, zero_points, + tflite::testing::kOutputShape, tflite::testing::kGoldenData, + golden_quantized, output_scale, output_zero_point, + &tflite::testing::common_conv_params, output_data)); +} + +TF_LITE_MICRO_TEST(SimpleTestQuantized16x8PerChannel) +{ + int16_t output_data[tflite::testing::kOutputElements]; + + const float input_scale = 1.0f; + const float output_scale = 1.0f; + const float filter_scale = 1.0f; + const int input_zero_point = 0; + const int output_zero_point = 0; + + int16_t input_quantized[tflite::testing::kInputElements]; + int8_t filter_quantized[tflite::testing::kFilterElements]; + std::int64_t bias_quantized[tflite::testing::kBiasElements]; + int16_t golden_quantized[tflite::testing::kOutputElements]; + int zero_points[tflite::testing::kBiasElements + 1]; + float scales[tflite::testing::kBiasElements + 1]; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::testing::TestTransposeConvQuantized( + tflite::testing::kInputShape, tflite::testing::kInputData, + input_quantized, input_scale, input_zero_point, + tflite::testing::kFilterShape, tflite::testing::kFilterData, + filter_quantized, filter_scale, tflite::testing::kBiasShape, + tflite::testing::kBiasData, bias_quantized, scales, zero_points, + tflite::testing::kOutputShape, tflite::testing::kGoldenData, + golden_quantized, output_scale, output_zero_point, + &tflite::testing::common_conv_params, output_data)); +} + +TF_LITE_MICRO_TEST(InputOutputDifferentTypeIsError) +{ + using tflite::testing::CreateQuantizedTensor; + using tflite::testing::CreateTensor; + using tflite::testing::IntArrayFromInts; + + TfLiteIntArray *input_dims = IntArrayFromInts(tflite::testing::kInputShape); + TfLiteIntArray *filter_dims = IntArrayFromInts(tflite::testing::kFilterShape); + TfLiteIntArray *bias_dims = IntArrayFromInts(tflite::testing::kBiasShape); + TfLiteIntArray *output_dims = IntArrayFromInts(tflite::testing::kOutputShape); + const int output_dims_count = tflite::ElementCount(*output_dims); + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + + int8_t output_data[tflite::testing::kOutputElements]; + + int output_shape_dims_data[] = { 1, 0 }; + int32_t *output_shape = nullptr; + TfLiteIntArray *output_shape_dims = IntArrayFromInts(output_shape_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateTensor(output_shape, output_shape_dims), + CreateTensor(tflite::testing::kInputData, input_dims), + CreateTensor(tflite::testing::kFilterData, filter_dims), + CreateTensor(tflite::testing::kBiasData, bias_dims), + CreateQuantizedTensor(output_data, output_dims, /*scale=*/1.0f, + /*zero_point=*/0), + }; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, tflite::testing::InvokeTransposeConv( + tensors, tensors_size, output_dims_count, + &tflite::testing::common_conv_params, output_data)); +} + +TF_LITE_MICRO_TEST(HybridModeIsError) +{ + using tflite::testing::CreateQuantizedTensor; + using tflite::testing::CreateTensor; + using tflite::testing::IntArrayFromInts; + + TfLiteIntArray *input_dims = IntArrayFromInts(tflite::testing::kInputShape); + TfLiteIntArray *filter_dims = IntArrayFromInts(tflite::testing::kFilterShape); + TfLiteIntArray *bias_dims = IntArrayFromInts(tflite::testing::kBiasShape); + TfLiteIntArray *output_dims = IntArrayFromInts(tflite::testing::kOutputShape); + const int output_dims_count = tflite::ElementCount(*output_dims); + + constexpr int inputs_size = 4; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + + int8_t filter_data[tflite::testing::kFilterElements] = {}; + float output_data[tflite::testing::kOutputElements]; + + int output_shape_dims_data[] = { 1, 0 }; + int32_t *output_shape = nullptr; + TfLiteIntArray *output_shape_dims = IntArrayFromInts(output_shape_dims_data); + + TfLiteTensor tensors[tensors_size] = { + CreateTensor(output_shape, output_shape_dims), + CreateTensor(tflite::testing::kInputData, input_dims), + CreateQuantizedTensor(filter_data, filter_dims, + /*scale=*/1.0f, + /*zero_point=*/0), + CreateTensor(tflite::testing::kBiasData, bias_dims), + CreateTensor(output_data, output_dims), + }; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, tflite::testing::InvokeTransposeConv( + tensors, tensors_size, output_dims_count, + &tflite::testing::common_conv_params, output_data)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_test.cc new file mode 100644 index 00000000..d1fef68d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/transpose_test.cc @@ -0,0 +1,650 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/kernels/internal/reference/transpose.h" + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/portable_tensor.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void RunTestPermutation(int num_dims, const int32_t *shape, + const int32_t *perms, T *input, T *input_transposed) +{ + // Count elements and allocate output. + int count = 1; + for (int i = 0; i < num_dims; i++) { + count *= shape[i]; + } + + // Create the dummy data + for (int i = 0; i < count; i++) { + input[i] = i; + } + + // Make input and output shapes. + const RuntimeShape input_shape = RuntimeShape(num_dims, shape); + RuntimeShape output_shape(num_dims); + + for (int i = 0; i < num_dims; i++) { + output_shape.SetDim(i, shape[perms[i]]); + } + + TransposeParams params; + params.perm_count = num_dims; + for (int i = 0; i < num_dims; ++i) { + params.perm[i] = perms[i]; + } + + reference_ops::Transpose(params, input_shape, input, output_shape, + input_transposed); +} + +template +TfLiteStatus InvokeTranspose(TfLiteTensor *tensors, int tensors_size, + T *output_data, int output_length, + TransposeParams *params) +{ + int inputs_array_data[] = { 2, 0, 1 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 2 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_TRANSPOSE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, reinterpret_cast(params)); + + const char *init_data = reinterpret_cast(params); + TfLiteStatus status = runner.InitAndPrepare(init_data); + if (status != kTfLiteOk) { + return status; + } + return runner.Invoke(); +} + +template +TfLiteStatus ValidateTranspose(TfLiteTensor *tensors, int tensors_size, + const T *expected_output_data, T *output_data, + int output_length, + tflite::TransposeParams *params, + float tolerance = 1e-5) +{ + TfLiteStatus status = InvokeTranspose(tensors, tensors_size, output_data, + output_length, params); + if (status != kTfLiteOk) { + return status; + } + + for (int i = 0; i < output_length; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } + return kTfLiteOk; +} + +template +void TestTranspose(int *input_dims_data, T *input_data, int *output_dims_data, + const T *expected_output_data, T *output_data, + TransposeParams *params) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int input_size = ElementCount(*input_dims); + for (int i = 0; i < input_size; i++) { + input_data[i] = i; + } + + for (int i = 0; i < input_dims->size; i++) { + output_dims->data[i] = input_dims->data[params->perm[i]]; + } + + int perm_dims_data[] = { 1, params->perm_count }; + TfLiteIntArray *perm_dims = IntArrayFromInts(perm_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 2; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(params->perm, perm_dims), + CreateTensor(output_data, output_dims), + }; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, ValidateTranspose(tensors, tensors_size, expected_output_data, + output_data, output_dims_count, params)); +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(1D) +{ + int input_dims_data[] = { 1, 3 }; + int output_dims_data[] = { 1, 3 }; + + int8_t input_data[3]; + int8_t output_data[3]; + const int8_t expected_output_data[] = { 0, 1, 2 }; + + tflite::TransposeParams params = { 1, { 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(2DPerm1) +{ + int input_dims_data[] = { 2, 3, 2 }; + int output_dims_data[] = { 2, 3, 2 }; + + int8_t input_data[6]; + int8_t output_data[6]; + const int8_t expected_output_data[] = { 0, 2, 4, 1, 3, 5 }; + + tflite::TransposeParams params = { 2, { 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(2D4x4KernelLeftOverRightSide) +{ + int input_dims_data[] = { 2, 4, 6 }; + int output_dims_data[] = { 2, 4, 6 }; + + int8_t input_data[24]; + int8_t output_data[24]; + const int8_t expected_output_data[] = { 0, 6, 12, 18, 1, 7, 13, 19, + 2, 8, 14, 20, 3, 9, 15, 21, + 4, 10, 16, 22, 5, 11, 17, 23 }; + + tflite::TransposeParams params = { 2, { 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(2D4x4KernelLeftOverBottomSide) +{ + int input_dims_data[] = { 2, 6, 4 }; + int output_dims_data[] = { 2, 4, 6 }; + + int8_t input_data[24]; + int8_t output_data[24]; + const int8_t expected_output_data[] = { 0, 4, 8, 12, 16, 20, 1, 5, + 9, 13, 17, 21, 2, 6, 10, 14, + 18, 22, 3, 7, 11, 15, 19, 23 }; + + tflite::TransposeParams params = { 2, { 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3D) +{ + int input_dims_data[] = { 3, 2, 3, 4 }; + int output_dims_data[] = { 3, 2, 3, 4 }; + + int8_t input_data[24]; + int8_t output_data[24]; + const int8_t expected_output_data[] = { 0, 4, 8, 12, 16, 20, 1, 5, + 9, 13, 17, 21, 2, 6, 10, 14, + 18, 22, 3, 7, 11, 15, 19, 23 }; + + tflite::TransposeParams params = { 3, { 2, 0, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(1DNotShrinked) +{ + int input_dims_data[] = { 1, 1 }; + int output_dims_data[] = { 1, 1 }; + + float input_data[1]; + float output_data[1]; + const float expected_output_data[] = { 0 }; + + tflite::TransposeParams params = { 1, { 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(2DShrinkedOneTime) +{ + int input_dims_data[] = { 2, 2, 1 }; + int output_dims_data[] = { 2, 2, 1 }; + + float input_data[2]; + float output_data[2]; + const float expected_output_data[] = { 0, 1 }; + + tflite::TransposeParams params = { 2, { 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(2DShrinkedTwoTimes) +{ + int input_dims_data[] = { 2, 1, 1 }; + int output_dims_data[] = { 2, 1, 1 }; + + float input_data[1]; + float output_data[1]; + const float expected_output_data[] = { 0 }; + + tflite::TransposeParams params = { 2, { 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3DShrinkedOneTime) +{ + int input_dims_data[] = { 3, 2, 1, 3 }; + int output_dims_data[] = { 3, 2, 1, 3 }; + + float input_data[6]; + float output_data[6]; + const float expected_output_data[] = { 0, 1, 2, 3, 4, 5 }; + + tflite::TransposeParams params = { 3, { 0, 2, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3DShrinkedTwoTimes) +{ + int input_dims_data[] = { 3, 1, 1, 3 }; + int output_dims_data[] = { 3, 1, 1, 3 }; + + float input_data[3]; + float output_data[3]; + const float expected_output_data[] = { 0, 1, 2 }; + + tflite::TransposeParams params = { 3, { 1, 2, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3DShrinkedAll) +{ + int input_dims_data[] = { 3, 1, 1, 1 }; + int output_dims_data[] = { 3, 1, 1, 1 }; + + float input_data[1]; + float output_data[1]; + const float expected_output_data[] = { 0 }; + + tflite::TransposeParams params = { 3, { 1, 2, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DShrinkedOneTimes) +{ + int input_dims_data[] = { 4, 2, 2, 3, 1 }; + int output_dims_data[] = { 4, 2, 2, 3, 1 }; + + float input_data[12]; + float output_data[12]; + const float expected_output_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + tflite::TransposeParams params = { 4, { 3, 0, 1, 2 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DShrinkedTwoTimes) +{ + int input_dims_data[] = { 4, 2, 1, 3, 1 }; + int output_dims_data[] = { 4, 2, 1, 3, 1 }; + + float input_data[6]; + float output_data[6]; + const float expected_output_data[] = { 0, 1, 2, 3, 4, 5 }; + + tflite::TransposeParams params = { 4, { 0, 3, 1, 2 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DShrinkedThreeTimes) +{ + int input_dims_data[] = { 4, 2, 1, 1, 1 }; + int output_dims_data[] = { 4, 2, 1, 1, 1 }; + + float input_data[2]; + float output_data[2]; + const float expected_output_data[] = { 0, 1 }; + + tflite::TransposeParams params = { 4, { 3, 2, 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DShrinkedFourTimes) +{ + int input_dims_data[] = { 4, 1, 1, 1, 1 }; + int output_dims_data[] = { 4, 1, 1, 1, 1 }; + + float input_data[1]; + float output_data[1]; + const float expected_output_data[] = { 0 }; + + tflite::TransposeParams params = { 4, { 2, 3, 1, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3DFlatten) +{ + int input_dims_data[] = { 3, 2, 2, 3 }; + int output_dims_data[] = { 3, 2, 2, 3 }; + + float input_data[12]; + float output_data[12]; + const float expected_output_data[] = { 0, 3, 1, 4, 2, 5, 6, 9, 7, 10, 8, 11 }; + + tflite::TransposeParams params = { 3, { 0, 2, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DFlatten) +{ + int input_dims_data[] = { 4, 2, 2, 2, 2 }; + int output_dims_data[] = { 4, 2, 2, 2, 2 }; + + float input_data[16]; + float output_data[16]; + const float expected_output_data[] = { 0, 2, 1, 3, 4, 6, 5, 7, + 8, 10, 9, 11, 12, 14, 13, 15 }; + + tflite::TransposeParams params = { 4, { 0, 1, 3, 2 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DFlattenTwo) +{ + int input_dims_data[] = { 4, 2, 2, 2, 2 }; + int output_dims_data[] = { 4, 2, 2, 2, 2 }; + + float input_data[16]; + float output_data[16]; + const float expected_output_data[] = { 0, 4, 1, 5, 2, 6, 3, 7, + 8, 12, 9, 13, 10, 14, 11, 15 }; + + tflite::TransposeParams params = { 4, { 0, 2, 3, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3DDividedIntoTwo2DsOne) +{ + float input_data[24]; + float expected_output_data[24]; + int32_t shape[] = { 2, 3, 4 }; + int32_t perms[] = { 1, 2, 0 }; + tflite::testing::RunTestPermutation(3, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 3, 2, 3, 4 }; + int output_dims_data[] = { 3, 2, 3, 4 }; + + float output_data[24]; + + tflite::TransposeParams params = { 3, { 1, 2, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(3DDividedIntoTwo2DsTwo) +{ + float input_data[24]; + float expected_output_data[24]; + int32_t shape[] = { 2, 3, 4 }; + int32_t perms[] = { 2, 0, 1 }; + tflite::testing::RunTestPermutation(3, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 3, 2, 3, 4 }; + int output_dims_data[] = { 3, 2, 3, 4 }; + + float output_data[24]; + + tflite::TransposeParams params = { 3, { 2, 0, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DDividedIntoTwo2DsOne) +{ + int32_t shape[] = { 2, 3, 4, 2 }; + int32_t perms[] = { 1, 2, 3, 0 }; + float input_data[48]; + float expected_output_data[48]; + tflite::testing::RunTestPermutation(4, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 4, 2, 3, 4, 2 }; + int output_dims_data[] = { 4, 2, 3, 4, 2 }; + + float output_data[48]; + + tflite::TransposeParams params = { 4, { 1, 2, 3, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} +TF_LITE_MICRO_TEST(4DDividedIntoTwo2DsTwo) +{ + int32_t shape[] = { 2, 3, 4, 2 }; + int32_t perms[] = { 2, 3, 0, 1 }; + float input_data[48]; + float expected_output_data[48]; + tflite::testing::RunTestPermutation(4, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 4, 2, 3, 4, 2 }; + int output_dims_data[] = { 4, 2, 3, 4, 2 }; + + float output_data[48]; + + tflite::TransposeParams params = { 4, { 2, 3, 0, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(4DDividedIntoTwo2DsThree) +{ + int32_t shape[] = { 2, 3, 4, 2 }; + int32_t perms[] = { 3, 0, 1, 2 }; + float input_data[48]; + float expected_output_data[48]; + tflite::testing::RunTestPermutation(4, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 4, 2, 3, 4, 2 }; + int output_dims_data[] = { 4, 2, 3, 4, 2 }; + + float output_data[48]; + + tflite::TransposeParams params = { 4, { 3, 0, 1, 2 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(5DDividedIntoTwo2DsOne) +{ + int32_t shape[] = { 2, 3, 2, 2, 2 }; + int32_t perms[] = { 1, 4, 2, 3, 0 }; + float input_data[48]; + float expected_output_data[48]; + tflite::testing::RunTestPermutation(5, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 5, 2, 3, 2, 2, 2 }; + int output_dims_data[] = { 5, 2, 3, 2, 2, 2 }; + + float output_data[48]; + + tflite::TransposeParams params = { 5, { 1, 4, 2, 3, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(5DDividedIntoTwo2DsTwo) +{ + int32_t shape[] = { 2, 3, 2, 2, 2 }; + int32_t perms[] = { 2, 3, 0, 4, 1 }; + float input_data[48]; + float expected_output_data[48]; + tflite::testing::RunTestPermutation(5, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 5, 2, 3, 2, 2, 2 }; + int output_dims_data[] = { 5, 2, 3, 2, 2, 2 }; + + float output_data[48]; + + tflite::TransposeParams params = { 5, { 2, 3, 0, 4, 1 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(5DDividedIntoTwo2DsThree) +{ + int32_t shape[] = { 2, 3, 2, 2, 2 }; + int32_t perms[] = { 3, 0, 4, 1, 2 }; + float input_data[48]; + float expected_output_data[48]; + tflite::testing::RunTestPermutation(5, shape, perms, input_data, + expected_output_data); + int input_dims_data[] = { 5, 2, 3, 2, 2, 2 }; + int output_dims_data[] = { 5, 2, 3, 2, 2, 2 }; + + float output_data[48]; + + tflite::TransposeParams params = { 5, { 3, 0, 4, 1, 2 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(SimpleTestNoReorder) +{ + int input_dims_data[] = { 4, 1, 2, 3, 1 }; + int output_dims_data[] = { 4, 1, 2, 3, 1 }; + + float input_data[6]; + float output_data[6]; + const float expected_output_data[] = { 0, 1, 2, 3, 4, 5 }; + + tflite::TransposeParams params = { 4, { 0, 1, 2, 3 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(SimpleTestWithReorder) +{ + int input_dims_data[] = { 4, 1, 2, 3, 1 }; + int output_dims_data[] = { 4, 1, 2, 3, 1 }; + + float input_data[6]; + float output_data[6]; + const float expected_output_data[] = { 0, 3, 1, 4, 2, 5 }; + + tflite::TransposeParams params = { 4, { 2, 1, 3, 0 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(ComplexTestWithReorder) +{ + int input_dims_data[] = { 4, 2, 3, 4, 5 }; + int output_dims_data[] = { 4, 2, 3, 4, 5 }; + + float input_data[120]; + float output_data[120]; + const float expected_output_data[] = { + 0, 1, 2, 3, 4, 20, 21, 22, 23, 24, 40, 41, 42, 43, 44, + 60, 61, 62, 63, 64, 80, 81, 82, 83, 84, 100, 101, 102, 103, 104, + 5, 6, 7, 8, 9, 25, 26, 27, 28, 29, 45, 46, 47, 48, 49, + 65, 66, 67, 68, 69, 85, 86, 87, 88, 89, 105, 106, 107, 108, 109, + 10, 11, 12, 13, 14, 30, 31, 32, 33, 34, 50, 51, 52, 53, 54, + 70, 71, 72, 73, 74, 90, 91, 92, 93, 94, 110, 111, 112, 113, 114, + 15, 16, 17, 18, 19, 35, 36, 37, 38, 39, 55, 56, 57, 58, 59, + 75, 76, 77, 78, 79, 95, 96, 97, 98, 99, 115, 116, 117, 118, 119 + }; + + tflite::TransposeParams params = { 4, { 2, 0, 1, 3 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TEST(Complex5DTestWithReorder) +{ + int input_dims_data[] = { 5, 2, 3, 2, 2, 5 }; + int output_dims_data[] = { 5, 2, 3, 2, 2, 5 }; + + float input_data[120]; + float output_data[120]; + const float expected_output_data[] = { + 0, 5, 1, 6, 2, 7, 3, 8, 4, 9, 20, 25, 21, 26, 22, + 27, 23, 28, 24, 29, 40, 45, 41, 46, 42, 47, 43, 48, 44, 49, + 60, 65, 61, 66, 62, 67, 63, 68, 64, 69, 80, 85, 81, 86, 82, + 87, 83, 88, 84, 89, 100, 105, 101, 106, 102, 107, 103, 108, 104, 109, + 10, 15, 11, 16, 12, 17, 13, 18, 14, 19, 30, 35, 31, 36, 32, + 37, 33, 38, 34, 39, 50, 55, 51, 56, 52, 57, 53, 58, 54, 59, + 70, 75, 71, 76, 72, 77, 73, 78, 74, 79, 90, 95, 91, 96, 92, + 97, 93, 98, 94, 99, 110, 115, 111, 116, 112, 117, 113, 118, 114, 119 + }; + + tflite::TransposeParams params = { 5, { 2, 0, 1, 4, 3 } }; + + tflite::testing::TestTranspose(input_dims_data, input_data, output_dims_data, + expected_output_data, output_data, ¶ms); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack.cc new file mode 100644 index 00000000..f2ad11d8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack.cc @@ -0,0 +1,125 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace ops { +namespace micro { +namespace unpack { +namespace { + +constexpr int kInputTensor = 0; + +template +TfLiteStatus UnpackImpl(TfLiteContext *context, TfLiteNode *node, + const TfLiteEvalTensor *input, int output_count, + int axis) +{ + const TfLiteEvalTensor *output0 = + tflite::micro::GetEvalOutput(context, node, 0); + const TfLiteIntArray *input_dims = input->dims; + const TfLiteIntArray *output_dims = output0->dims; + const int dimensions = input_dims->size; + + if (axis < 0) { + axis += input->dims->size; + } + + TFLITE_DCHECK_LT(axis, dimensions); + + int outer_size = 1; + for (int i = 0; i < axis; ++i) { + outer_size *= input_dims->data[i]; + } + int copy_size = 1; + for (int i = axis + 1; i < dimensions; ++i) { + copy_size *= input_dims->data[i]; + } + int output_size = 1; + for (int i = 0; i < output_dims->size; ++i) { + output_size *= output_dims->data[i]; + } + TFLITE_DCHECK_EQ(output_size, copy_size * outer_size); + + const T *input_data = tflite::micro::GetTensorData(input); + + for (int i = 0; i < output_count; ++i) { + TfLiteEvalTensor *t = tflite::micro::GetEvalOutput(context, node, i); + T *output_data = tflite::micro::GetTensorData(t); + for (int k = 0; k < outer_size; ++k) { + T *output_ptr = output_data + copy_size * k; + int loc = k * output_count * copy_size + i * copy_size; + const T *input_ptr = input_data + loc; + for (int j = 0; j < copy_size; ++j) + output_ptr[j] = input_ptr[j]; + } + } + + return kTfLiteOk; +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + TfLiteUnpackParams *data = + reinterpret_cast(node->builtin_data); + + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + + switch (input->type) { + case kTfLiteFloat32: { + return UnpackImpl(context, node, input, data->num, data->axis); + } + case kTfLiteInt32: { + return UnpackImpl(context, node, input, data->num, data->axis); + } + case kTfLiteUInt8: { + return UnpackImpl(context, node, input, data->num, data->axis); + } + case kTfLiteInt8: { + return UnpackImpl(context, node, input, data->num, data->axis); + } + default: { + TF_LITE_KERNEL_LOG(context, "Type '%s' is not supported by unpack.", + TfLiteTypeGetName(input->type)); + return kTfLiteError; + } + } + + return kTfLiteOk; +} +} // namespace +} // namespace unpack + +TfLiteRegistration Register_UNPACK() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/nullptr, + /*invoke=*/unpack::Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace micro +} // namespace ops +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack_test.cc new file mode 100644 index 00000000..c03577b6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/unpack_test.cc @@ -0,0 +1,384 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/debug_log.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { + +void TestUnpackThreeOutputsFloat( + int *input_dims_data, const float *input_data, int axis, + int *output1_dims_data, const float *expected_output1_data, + int *output2_dims_data, const float *expected_output2_data, + int *output3_dims_data, const float *expected_output3_data, + float *output1_data, float *output2_data, float *output3_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + TfLiteIntArray *output3_dims = IntArrayFromInts(output3_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + const int output3_dims_count = ElementCount(*output3_dims); + + constexpr int input_size = 1; + constexpr int output_size = 3; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output1_data, output1_dims), + CreateTensor(output2_data, output2_dims), + CreateTensor(output3_data, output3_dims) + }; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + + for (int i = 0; i < output3_dims_count; ++i) { + output3_data[i] = 23; + } + + TfLiteUnpackParams builtin_data = { + .num = 3, + .axis = axis, + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 3, 1, 2, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_UNPACK(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f); + } + + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f); + } + + for (int i = 0; i < output3_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output3_data[i], output3_data[i], 1e-5f); + } +} + +void TestUnpackOneOutputFloat(int *input_dims_data, const float *input_data, + int axis, int *output_dims_data, + const float *expected_output_data, + float *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(output_dims_data); + const int output_dims_count = ElementCount(*output_dims); + + constexpr int input_size = 1; + constexpr int output_size = 1; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims) }; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output_dims_count; ++i) { + output_data[i] = 23; + } + + TfLiteUnpackParams builtin_data = { + .num = 1, + .axis = axis, + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_UNPACK(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_NEAR(expected_output_data[i], output_data[i], 1e-5f); + } +} + +void TestUnpackThreeOutputsQuantized( + int *input_dims_data, const uint8_t *input_data, int axis, + int *output1_dims_data, const uint8_t *expected_output1_data, + int *output2_dims_data, const uint8_t *expected_output2_data, + int *output3_dims_data, const uint8_t *expected_output3_data, + uint8_t *output1_data, uint8_t *output2_data, uint8_t *output3_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + TfLiteIntArray *output3_dims = IntArrayFromInts(output3_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + const int output3_dims_count = ElementCount(*output3_dims); + + constexpr int input_size = 1; + constexpr int output_size = 3; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { + // CreateQuantizedTensor needs min/max values as input, but these values + // don't matter as to the functionality of UNPACK, so just set as 0 + // and 10. + CreateQuantizedTensor(input_data, input_dims, 0, 10), + CreateQuantizedTensor(output1_data, output1_dims, 0, 10), + CreateQuantizedTensor(output2_data, output2_dims, 0, 10), + CreateQuantizedTensor(output3_data, output3_dims, 0, 10) + }; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + + for (int i = 0; i < output3_dims_count; ++i) { + output3_data[i] = 23; + } + + TfLiteUnpackParams builtin_data = { + .num = 3, + .axis = axis, + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 3, 1, 2, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_UNPACK(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]); + } + + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]); + } + + for (int i = 0; i < output3_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output3_data[i], output3_data[i]); + } +} + +void TestUnpackThreeOutputsQuantized32( + int *input_dims_data, const int32_t *input_data, int axis, + int *output1_dims_data, const int32_t *expected_output1_data, + int *output2_dims_data, const int32_t *expected_output2_data, + int *output3_dims_data, const int32_t *expected_output3_data, + int32_t *output1_data, int32_t *output2_data, int32_t *output3_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output1_dims = IntArrayFromInts(output1_dims_data); + TfLiteIntArray *output2_dims = IntArrayFromInts(output2_dims_data); + TfLiteIntArray *output3_dims = IntArrayFromInts(output3_dims_data); + const int output1_dims_count = ElementCount(*output1_dims); + const int output2_dims_count = ElementCount(*output2_dims); + const int output3_dims_count = ElementCount(*output3_dims); + + constexpr int input_size = 1; + constexpr int output_size = 3; + constexpr int tensors_size = input_size + output_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output1_data, output1_dims), + CreateTensor(output2_data, output2_dims), + CreateTensor(output3_data, output3_dims) + }; + + // Place a unique value in the uninitialized output buffer. + for (int i = 0; i < output1_dims_count; ++i) { + output1_data[i] = 23; + } + + for (int i = 0; i < output2_dims_count; ++i) { + output2_data[i] = 23; + } + + for (int i = 0; i < output3_dims_count; ++i) { + output3_data[i] = 23; + } + + TfLiteUnpackParams builtin_data = { + .num = 3, + .axis = axis, + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 3, 1, 2, 3 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = tflite::ops::micro::Register_UNPACK(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + reinterpret_cast(&builtin_data)); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output1_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]); + } + + for (int i = 0; i < output2_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]); + } + + for (int i = 0; i < output3_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output3_data[i], output3_data[i]); + } +} + +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(UnpackFloatThreeOutputs) +{ + int input_shape[] = { 2, 3, 2 }; + const float input_values[] = { 1, 2, 3, 4, 5, 6 }; + int output1_shape[] = { 1, 2 }; + const float output1_golden[] = { 1, 2 }; + int output2_shape[] = { 1, 2 }; + const float output2_golden[] = { 3, 4 }; + int output3_shape[] = { 1, 2 }; + const float output3_golden[] = { 5, 6 }; + constexpr int output1_dims_count = 2; + constexpr int output2_dims_count = 2; + constexpr int output3_dims_count = 2; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + float output3_data[output3_dims_count]; + tflite::testing::TestUnpackThreeOutputsFloat( + input_shape, input_values, 0, output1_shape, output1_golden, + output2_shape, output2_golden, output3_shape, output3_golden, + output1_data, output2_data, output3_data); +} + +TF_LITE_MICRO_TEST(UnpackFloatThreeOutputsNegativeAxisTwo) +{ + int input_shape[] = { 2, 3, 2 }; + const float input_values[] = { 1, 2, 3, 4, 5, 6 }; + int output1_shape[] = { 1, 2 }; + const float output1_golden[] = { 1, 2 }; + int output2_shape[] = { 1, 2 }; + const float output2_golden[] = { 3, 4 }; + int output3_shape[] = { 1, 2 }; + const float output3_golden[] = { 5, 6 }; + constexpr int output1_dims_count = 2; + constexpr int output2_dims_count = 2; + constexpr int output3_dims_count = 2; + float output1_data[output1_dims_count]; + float output2_data[output2_dims_count]; + float output3_data[output3_dims_count]; + tflite::testing::TestUnpackThreeOutputsFloat( + input_shape, input_values, -2, output1_shape, output1_golden, + output2_shape, output2_golden, output3_shape, output3_golden, + output1_data, output2_data, output3_data); +} + +TF_LITE_MICRO_TEST(UnpackFloatOneOutput) +{ + int input_shape[] = { 2, 1, 6 }; + const float input_values[] = { 1, 2, 3, 4, 5, 6 }; + int output_shape[] = { 1, 6 }; + const float golden[] = { 1, 2, 3, 4, 5, 6 }; + constexpr int output_dims_count = 6; + float output_data[output_dims_count]; + tflite::testing::TestUnpackOneOutputFloat(input_shape, input_values, 0, + output_shape, golden, output_data); +} + +TF_LITE_MICRO_TEST(UnpackQuantizedThreeOutputs) +{ + int input_shape[] = { 2, 3, 2 }; + const uint8_t input_values[] = { 1, 2, 3, 4, 5, 6 }; + int output1_shape[] = { 1, 2 }; + const uint8_t output1_golden[] = { 1, 2 }; + int output2_shape[] = { 1, 2 }; + const uint8_t output2_golden[] = { 3, 4 }; + int output3_shape[] = { 1, 2 }; + const uint8_t output3_golden[] = { 5, 6 }; + constexpr int output1_dims_count = 2; + constexpr int output2_dims_count = 2; + constexpr int output3_dims_count = 2; + uint8_t output1_data[output1_dims_count]; + uint8_t output2_data[output2_dims_count]; + uint8_t output3_data[output3_dims_count]; + tflite::testing::TestUnpackThreeOutputsQuantized( + input_shape, input_values, 0, output1_shape, output1_golden, + output2_shape, output2_golden, output3_shape, output3_golden, + output1_data, output2_data, output3_data); +} + +TF_LITE_MICRO_TEST(UnpackQuantized32ThreeOutputs) +{ + int input_shape[] = { 2, 3, 2 }; + const int32_t input_values[] = { 1, 2, 3, 4, 5, 6 }; + int output1_shape[] = { 1, 2 }; + const int32_t output1_golden[] = { 1, 2 }; + int output2_shape[] = { 1, 2 }; + const int32_t output2_golden[] = { 3, 4 }; + int output3_shape[] = { 1, 2 }; + const int32_t output3_golden[] = { 5, 6 }; + constexpr int output1_dims_count = 2; + constexpr int output2_dims_count = 2; + constexpr int output3_dims_count = 2; + int32_t output1_data[output1_dims_count]; + int32_t output2_data[output2_dims_count]; + int32_t output3_data[output3_dims_count]; + tflite::testing::TestUnpackThreeOutputsQuantized32( + input_shape, input_values, 0, output1_shape, output1_golden, + output2_shape, output2_golden, output3_shape, output3_golden, + output1_data, output2_data, output3_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like.cc new file mode 100644 index 00000000..fef5da01 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like.cc @@ -0,0 +1,93 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/kernels/kernel_util.h" + +namespace tflite { +namespace { + +constexpr int kInputTensor = 0; +constexpr int kOutputTensor = 0; + +TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node) +{ + TF_LITE_ENSURE_EQ(context, NumInputs(node), 1); + TF_LITE_ENSURE_EQ(context, NumOutputs(node), 1); + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kOutputTensor, &output)); + output->type = input->type; + + return kTfLiteOk; +} + +template +void resetZeros(T *out, const int num_elements) +{ + for (int i = 0; i < num_elements; ++i) { + out[i] = static_cast(0); + } +} + +TfLiteStatus Eval(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteEvalTensor *input = + tflite::micro::GetEvalInput(context, node, kInputTensor); + TfLiteEvalTensor *output = + tflite::micro::GetEvalOutput(context, node, kOutputTensor); + int flat_size = MatchingFlatSize(tflite::micro::GetTensorShape(input), + tflite::micro::GetTensorShape(output)); + switch (input->type) { + case kTfLiteInt64: + resetZeros(tflite::micro::GetTensorData(output), flat_size); + break; + case kTfLiteInt32: + resetZeros(tflite::micro::GetTensorData(output), flat_size); + break; + case kTfLiteInt8: + resetZeros(tflite::micro::GetTensorData(output), flat_size); + break; + case kTfLiteFloat32: + resetZeros(tflite::micro::GetTensorData(output), flat_size); + break; + default: + TF_LITE_KERNEL_LOG(context, + "ZerosLike only currently supports int64, int32, " + "and float32, got %d.", + input->type); + return kTfLiteError; + } + return kTfLiteOk; +} +} // namespace + +TfLiteRegistration Register_ZEROS_LIKE() +{ + return { /*init=*/nullptr, + /*free=*/nullptr, + /*prepare=*/Prepare, + /*invoke=*/Eval, + /*profiling_string=*/nullptr, + /*builtin_code=*/0, + /*custom_name=*/nullptr, + /*version=*/0 }; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like_test.cc new file mode 100644 index 00000000..88d190c5 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/kernels/zeros_like_test.cc @@ -0,0 +1,106 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/c/builtin_op_data.h" +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/kernels/kernel_runner.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace testing { +namespace { + +template +void TestZerosLike(int *input_dims_data, const T *input_data, + const T *expected_output_data, T *output_data) +{ + TfLiteIntArray *input_dims = IntArrayFromInts(input_dims_data); + TfLiteIntArray *output_dims = IntArrayFromInts(input_dims_data); + const int output_dims_count = ElementCount(*output_dims); + constexpr int inputs_size = 1; + constexpr int outputs_size = 1; + constexpr int tensors_size = inputs_size + outputs_size; + TfLiteTensor tensors[tensors_size] = { + CreateTensor(input_data, input_dims), + CreateTensor(output_data, output_dims), + }; + + int inputs_array_data[] = { 1, 0 }; + TfLiteIntArray *inputs_array = IntArrayFromInts(inputs_array_data); + int outputs_array_data[] = { 1, 1 }; + TfLiteIntArray *outputs_array = IntArrayFromInts(outputs_array_data); + + const TfLiteRegistration registration = Register_ZEROS_LIKE(); + micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array, + outputs_array, + /*builtin_data=*/nullptr); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke()); + + for (int i = 0; i < output_dims_count; ++i) { + TF_LITE_MICRO_EXPECT_EQ(expected_output_data[i], output_data[i]); + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestZerosLikeFloat) +{ + float output_data[6]; + int input_dims[] = { 2, 2, 3 }; + const float input_values[] = { -2.0, -1.0, 0.0, 1.0, 2.0, 3.0 }; + const float golden[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + tflite::testing::TestZerosLike(input_dims, input_values, golden, + output_data); +} + +TF_LITE_MICRO_TEST(TestZerosLikeInt8) +{ + int8_t output_data[6]; + int input_dims[] = { 3, 1, 2, 3 }; + const int8_t input_values[] = { -2, -1, 0, 1, 2, 3 }; + const int8_t golden[] = { 0, 0, 0, 0, 0, 0 }; + tflite::testing::TestZerosLike(input_dims, input_values, golden, + output_data); +} + +TF_LITE_MICRO_TEST(TestZerosLikeInt32) +{ + int32_t output_data[4]; + int input_dims[] = { 4, 1, 2, 2, 1 }; + const int32_t input_values[] = { -2, -1, 0, 3 }; + const int32_t golden[] = { 0, 0, 0, 0 }; + tflite::testing::TestZerosLike(input_dims, input_values, golden, + output_data); +} + +TF_LITE_MICRO_TEST(TestZerosLikeInt64) +{ + int64_t output_data[4]; + int input_dims[] = { 4, 1, 2, 2, 1 }; + const int64_t input_values[] = { -2, -1, 0, 3 }; + const int64_t golden[] = { 0, 0, 0, 0 }; + tflite::testing::TestZerosLike(input_dims, input_values, golden, + output_data); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_arena_threshold_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_arena_threshold_test.cc new file mode 100644 index 00000000..1cc8e820 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_arena_threshold_test.cc @@ -0,0 +1,255 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/recording_micro_allocator.h" +#include "tensorflow/lite/micro/recording_micro_interpreter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/micro/testing/test_conv_model.h" + +/** + * Tests to ensure arena memory allocation does not regress by more than 3%. + */ + +namespace { + +// Ensure memory doesn't expand more that 3%: +constexpr float kAllocationThreshold = 0.03; + +// TODO(b/160617245): Record persistent allocations to provide a more accurate +// number here. +constexpr float kAllocationTailMiscCeiling = 2 * 1024; + +const bool kIs64BitSystem = (sizeof(void *) == 8); + +constexpr int kKeywordModelTensorArenaSize = 22 * 1024; +uint8_t keyword_model_tensor_arena[kKeywordModelTensorArenaSize]; + +constexpr int kKeywordModelTensorCount = 54; +constexpr int kKeywordModelNodeAndRegistrationCount = 15; + +// NOTE: These values are measured on x86-64: +// TODO(b/158651472): Consider auditing these values on non-64 bit systems. +// +// Run this test with '--copt=-DTF_LITE_STATIC_MEMORY' to get optimized memory +// runtime values: +#ifdef TF_LITE_STATIC_MEMORY +constexpr int kKeywordModelTotalSize = 14416; +constexpr int kKeywordModelTailSize = 13744; +constexpr int kKeywordModelPersistentTfLiteTensorDataSize = 128; +constexpr int kKeywordModelPersistentBufferDataSize = 564; +#else +constexpr int kKeywordModelTotalSize = 14992; +constexpr int kKeywordModelTailSize = 14320; +constexpr int kKeywordModelPersistentTfLiteTensorDataSize = 224; +constexpr int kKeywordModelPersistentBufferDataSize = 564; +#endif +constexpr int kKeywordModelHeadSize = 672; +constexpr int kKeywordModelTfLiteTensorVariableBufferDataSize = 10240; +constexpr int kKeywordModelPersistentTfLiteTensorQuantizationData = 64; +constexpr int kKeywordModelOpRuntimeDataSize = 148; + +constexpr int kTestConvModelArenaSize = 12 * 1024; +uint8_t test_conv_tensor_arena[kTestConvModelArenaSize]; + +constexpr int kTestConvModelTensorCount = 15; +constexpr int kTestConvModelNodeAndRegistrationCount = 7; + +// NOTE: These values are measured on x86-64: +// TODO(b/158651472): Consider auditing these values on non-64 bit systems. +#ifdef TF_LITE_STATIC_MEMORY +constexpr int kTestConvModelTotalSize = 9792; +constexpr int kTestConvModelTailSize = 2048; +constexpr int kTestConvModelPersistentTfLiteTensorDataSize = 128; +constexpr int kTestConvModelPersistentBufferDataSize = 680; +#else +constexpr int kTestConvModelTotalSize = 10112; +constexpr int kTestConvModelTailSize = 2368; +constexpr int kTestConvModelPersistentTfLiteTensorDataSize = 224; +constexpr int kTestConvModelPersistentBufferDataSize = 680; +#endif +constexpr int kTestConvModelHeadSize = 7744; +constexpr int kTestConvModelOpRuntimeDataSize = 136; +constexpr int kTestConvModelPersistentTfLiteTensorQuantizationData = 0; + +struct ModelAllocationThresholds { + size_t tensor_count = 0; + size_t node_and_registration_count = 0; + size_t total_alloc_size = 0; + size_t head_alloc_size = 0; + size_t tail_alloc_size = 0; + size_t tensor_variable_buffer_data_size = 0; + size_t persistent_tflite_tensor_data_size = 0; + size_t persistent_tflite_tensor_quantization_data_size = 0; + size_t op_runtime_data_size = 0; + size_t persistent_buffer_data = 0; +}; + +void EnsureAllocatedSizeThreshold(const char *allocation_type, size_t actual, + size_t expected) +{ + // TODO(b/158651472): Better auditing of non-64 bit systems: + if (kIs64BitSystem) { + // 64-bit systems should check floor and ceiling to catch memory savings: + TF_LITE_MICRO_EXPECT_NEAR(actual, expected, + expected * kAllocationThreshold); + if (actual != expected) { + TF_LITE_REPORT_ERROR(tflite::GetMicroErrorReporter(), + "%s threshold failed: %d != %d", allocation_type, + actual, expected); + } + } else { + // Non-64 bit systems should just expect allocation does not exceed the + // ceiling: + TF_LITE_MICRO_EXPECT_LE(actual, expected + expected * kAllocationThreshold); + } +} + +void ValidateModelAllocationThresholds( + const tflite::RecordingMicroAllocator &allocator, + const ModelAllocationThresholds &thresholds) +{ + allocator.PrintAllocations(); + + EnsureAllocatedSizeThreshold( + "Total", allocator.GetSimpleMemoryAllocator()->GetUsedBytes(), + thresholds.total_alloc_size); + EnsureAllocatedSizeThreshold( + "Head", allocator.GetSimpleMemoryAllocator()->GetHeadUsedBytes(), + thresholds.head_alloc_size); + EnsureAllocatedSizeThreshold( + "Tail", allocator.GetSimpleMemoryAllocator()->GetTailUsedBytes(), + thresholds.tail_alloc_size); + EnsureAllocatedSizeThreshold( + "TfLiteEvalTensor", + allocator + .GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteEvalTensorData) + .used_bytes, + sizeof(TfLiteEvalTensor) * thresholds.tensor_count); + EnsureAllocatedSizeThreshold( + "VariableBufferData", + allocator + .GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteTensorVariableBufferData) + .used_bytes, + thresholds.tensor_variable_buffer_data_size); + EnsureAllocatedSizeThreshold( + "PersistentTfLiteTensor", + allocator + .GetRecordedAllocation( + tflite::RecordedAllocationType::kPersistentTfLiteTensorData) + .used_bytes, + thresholds.persistent_tflite_tensor_data_size); + EnsureAllocatedSizeThreshold( + "PersistentTfliteTensorQuantizationData", + allocator + .GetRecordedAllocation(tflite::RecordedAllocationType:: + kPersistentTfLiteTensorQuantizationData) + .used_bytes, + thresholds.persistent_tflite_tensor_quantization_data_size); + EnsureAllocatedSizeThreshold( + "PersistentBufferData", + allocator + .GetRecordedAllocation( + tflite::RecordedAllocationType::kPersistentBufferData) + .used_bytes, + thresholds.persistent_buffer_data); + EnsureAllocatedSizeThreshold( + "NodeAndRegistration", + allocator + .GetRecordedAllocation( + tflite::RecordedAllocationType::kNodeAndRegistrationArray) + .used_bytes, + sizeof(tflite::NodeAndRegistration) * + thresholds.node_and_registration_count); + + // Ensure tail allocation recording is not missing any large chunks: + size_t tail_est_length = sizeof(TfLiteEvalTensor) * thresholds.tensor_count + + thresholds.tensor_variable_buffer_data_size + + sizeof(tflite::NodeAndRegistration) * + thresholds.node_and_registration_count + + thresholds.op_runtime_data_size; + TF_LITE_MICRO_EXPECT_LE(thresholds.tail_alloc_size - tail_est_length, + kAllocationTailMiscCeiling); +} + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestKeywordModelMemoryThreshold) +{ + tflite::AllOpsResolver all_ops_resolver; + tflite::RecordingMicroInterpreter interpreter( + tflite::GetModel(g_keyword_scrambled_model_data), all_ops_resolver, + keyword_model_tensor_arena, kKeywordModelTensorArenaSize, + tflite::GetMicroErrorReporter()); + + interpreter.AllocateTensors(); + + ModelAllocationThresholds thresholds; + thresholds.tensor_count = kKeywordModelTensorCount; + thresholds.node_and_registration_count = + kKeywordModelNodeAndRegistrationCount; + thresholds.total_alloc_size = kKeywordModelTotalSize; + thresholds.head_alloc_size = kKeywordModelHeadSize; + thresholds.tail_alloc_size = kKeywordModelTailSize; + thresholds.tensor_variable_buffer_data_size = + kKeywordModelTfLiteTensorVariableBufferDataSize; + thresholds.op_runtime_data_size = kKeywordModelOpRuntimeDataSize; + thresholds.persistent_buffer_data = kKeywordModelPersistentBufferDataSize; + thresholds.persistent_tflite_tensor_data_size = + kKeywordModelPersistentTfLiteTensorDataSize; + thresholds.persistent_tflite_tensor_quantization_data_size = + kKeywordModelPersistentTfLiteTensorQuantizationData; + + ValidateModelAllocationThresholds(interpreter.GetMicroAllocator(), + thresholds); +} + +TF_LITE_MICRO_TEST(TestConvModelMemoryThreshold) +{ + tflite::AllOpsResolver all_ops_resolver; + tflite::RecordingMicroInterpreter interpreter( + tflite::GetModel(kTestConvModelData), all_ops_resolver, + test_conv_tensor_arena, kTestConvModelArenaSize, + tflite::GetMicroErrorReporter()); + + interpreter.AllocateTensors(); + + ModelAllocationThresholds thresholds; + thresholds.tensor_count = kTestConvModelTensorCount; + thresholds.node_and_registration_count = + kTestConvModelNodeAndRegistrationCount; + thresholds.total_alloc_size = kTestConvModelTotalSize; + thresholds.head_alloc_size = kTestConvModelHeadSize; + thresholds.tail_alloc_size = kTestConvModelTailSize; + thresholds.op_runtime_data_size = kTestConvModelOpRuntimeDataSize; + thresholds.persistent_buffer_data = kTestConvModelPersistentBufferDataSize; + thresholds.persistent_tflite_tensor_data_size = + kTestConvModelPersistentTfLiteTensorDataSize; + thresholds.persistent_tflite_tensor_quantization_data_size = + kTestConvModelPersistentTfLiteTensorQuantizationData; + + ValidateModelAllocationThresholds(interpreter.GetMicroAllocator(), + thresholds); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.cc new file mode 100644 index 00000000..15ba6370 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.cc @@ -0,0 +1,174 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/memory_helpers.h" + +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { + +uint8_t *AlignPointerUp(uint8_t *data, size_t alignment) +{ + std::uintptr_t data_as_uintptr_t = reinterpret_cast(data); + uint8_t *aligned_result = reinterpret_cast( + ((data_as_uintptr_t + (alignment - 1)) / alignment) * alignment); + return aligned_result; +} + +uint8_t *AlignPointerDown(uint8_t *data, size_t alignment) +{ + std::uintptr_t data_as_uintptr_t = reinterpret_cast(data); + uint8_t *aligned_result = + reinterpret_cast((data_as_uintptr_t / alignment) * alignment); + return aligned_result; +} + +size_t AlignSizeUp(size_t size, size_t alignment) +{ + size_t aligned_size = (((size + (alignment - 1)) / alignment) * alignment); + return aligned_size; +} + +TfLiteStatus TfLiteTypeSizeOf(TfLiteType type, size_t *size) +{ + switch (type) { + case kTfLiteFloat16: + *size = sizeof(int16_t); + break; + case kTfLiteFloat32: + *size = sizeof(float); + break; + case kTfLiteFloat64: + *size = sizeof(double); + break; + case kTfLiteInt16: + *size = sizeof(int16_t); + break; + case kTfLiteInt32: + *size = sizeof(int32_t); + break; + case kTfLiteUInt32: + *size = sizeof(uint32_t); + break; + case kTfLiteUInt8: + *size = sizeof(uint8_t); + break; + case kTfLiteInt8: + *size = sizeof(int8_t); + break; + case kTfLiteInt64: + *size = sizeof(int64_t); + break; + case kTfLiteUInt64: + *size = sizeof(uint64_t); + break; + case kTfLiteBool: + *size = sizeof(bool); + break; + case kTfLiteComplex64: + *size = sizeof(float) * 2; + break; + case kTfLiteComplex128: + *size = sizeof(double) * 2; + break; + default: + return kTfLiteError; + } + return kTfLiteOk; +} + +TfLiteStatus BytesRequiredForTensor(const tflite::Tensor &flatbuffer_tensor, + size_t *bytes, size_t *type_size, + ErrorReporter *error_reporter) +{ + int element_count = 1; + // If flatbuffer_tensor.shape == nullptr, then flatbuffer_tensor is a scalar + // so has 1 element. + if (flatbuffer_tensor.shape() != nullptr) { + for (size_t n = 0; n < flatbuffer_tensor.shape()->Length(); ++n) { + element_count *= flatbuffer_tensor.shape()->Get(n); + } + } + + TfLiteType tf_lite_type; + TF_LITE_ENSURE_STATUS(ConvertTensorType(flatbuffer_tensor.type(), + &tf_lite_type, error_reporter)); + TF_LITE_ENSURE_STATUS(TfLiteTypeSizeOf(tf_lite_type, type_size)); + *bytes = element_count * (*type_size); + return kTfLiteOk; +} + +TfLiteStatus TfLiteEvalTensorByteLength(const TfLiteEvalTensor *eval_tensor, + size_t *out_bytes) +{ + TFLITE_DCHECK(out_bytes != nullptr); + + int element_count = 1; + // If eval_tensor->dims == nullptr, then tensor is a scalar so has 1 element. + if (eval_tensor->dims != nullptr) { + for (int n = 0; n < eval_tensor->dims->size; ++n) { + element_count *= eval_tensor->dims->data[n]; + } + } + size_t type_size; + TF_LITE_ENSURE_STATUS(TfLiteTypeSizeOf(eval_tensor->type, &type_size)); + *out_bytes = element_count * type_size; + return kTfLiteOk; +} + +TfLiteStatus AllocateOutputDimensionsFromInput(TfLiteContext *context, + const TfLiteTensor *input1, + const TfLiteTensor *input2, + TfLiteTensor *output) +{ + const TfLiteTensor *input = nullptr; + + TF_LITE_ENSURE(context, input1->dims != nullptr); + TF_LITE_ENSURE(context, input2->dims != nullptr); + TF_LITE_ENSURE(context, output->dims->size == 0); + + input = input1->dims->size > input2->dims->size ? input1 : input2; + TF_LITE_ENSURE(context, output->type == input->type); + + size_t size = 0; + TfLiteTypeSizeOf(input->type, &size); + const int dimensions_count = tflite::GetTensorShape(input).DimensionsCount(); + for (int i = 0; i < dimensions_count; i++) { + size *= input->dims->data[i]; + } + + output->bytes = size; + + output->dims = + reinterpret_cast(context->AllocatePersistentBuffer( + context, TfLiteIntArrayGetSizeInBytes(size))); + + output->dims->size = input->dims->size; + for (int i = 0; i < dimensions_count; i++) { + output->dims->data[i] = input->dims->data[i]; + } + + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.h b/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.h new file mode 100644 index 00000000..1ce9ca31 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers.h @@ -0,0 +1,58 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MEMORY_HELPERS_H_ +#define TENSORFLOW_LITE_MICRO_MEMORY_HELPERS_H_ + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +// Returns the next pointer address aligned to the given alignment. +uint8_t *AlignPointerUp(uint8_t *data, size_t alignment); + +// Returns the previous pointer address aligned to the given alignment. +uint8_t *AlignPointerDown(uint8_t *data, size_t alignment); + +// Returns an increased size that's a multiple of alignment. +size_t AlignSizeUp(size_t size, size_t alignment); + +// Returns size in bytes for a given TfLiteType. +TfLiteStatus TfLiteTypeSizeOf(TfLiteType type, size_t *size); + +// How many bytes are needed to hold a tensor's contents. +TfLiteStatus BytesRequiredForTensor(const tflite::Tensor &flatbuffer_tensor, + size_t *bytes, size_t *type_size, + ErrorReporter *error_reporter); + +// How many bytes are used in a TfLiteEvalTensor instance. The byte length is +// returned in out_bytes. +TfLiteStatus TfLiteEvalTensorByteLength(const TfLiteEvalTensor *eval_tensor, + size_t *out_bytes); + +// Deduce output dimensions from input and allocate given size. +// Useful for operators with two inputs where the largest input should equal the +// output dimension. +TfLiteStatus AllocateOutputDimensionsFromInput(TfLiteContext *context, + const TfLiteTensor *input1, + const TfLiteTensor *input2, + TfLiteTensor *output); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MEMORY_HELPERS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers_test.cc new file mode 100644 index 00000000..48080916 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_helpers_test.cc @@ -0,0 +1,240 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/memory_helpers.h" + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace { + +// This just needs to be big enough to handle the array of 5 ints allocated +// in TestAllocateOutputDimensionsFromInput below. +const int kGlobalPersistentBufferLength = 100; +char global_persistent_buffer[kGlobalPersistentBufferLength]; + +// Only need to handle a single allocation at a time for output dimensions +// in TestAllocateOutputDimensionsFromInput. +void *FakeAllocatePersistentBuffer(TfLiteContext *context, size_t bytes) +{ + return reinterpret_cast(global_persistent_buffer); +} + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestAlignPointerUp) +{ + uint8_t *input0 = reinterpret_cast(0); + + uint8_t *input0_aligned1 = tflite::AlignPointerUp(input0, 1); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned1); + + uint8_t *input0_aligned2 = tflite::AlignPointerUp(input0, 2); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned2); + + uint8_t *input0_aligned3 = tflite::AlignPointerUp(input0, 3); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned3); + + uint8_t *input0_aligned16 = tflite::AlignPointerUp(input0, 16); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned16); + + uint8_t *input23 = reinterpret_cast(23); + + uint8_t *input23_aligned1 = tflite::AlignPointerUp(input23, 1); + TF_LITE_MICRO_EXPECT(input23 == input23_aligned1); + + uint8_t *input23_aligned2 = tflite::AlignPointerUp(input23, 2); + uint8_t *expected23_aligned2 = reinterpret_cast(24); + TF_LITE_MICRO_EXPECT(expected23_aligned2 == input23_aligned2); + + uint8_t *input23_aligned3 = tflite::AlignPointerUp(input23, 3); + uint8_t *expected23_aligned3 = reinterpret_cast(24); + TF_LITE_MICRO_EXPECT(expected23_aligned3 == input23_aligned3); + + uint8_t *input23_aligned16 = tflite::AlignPointerUp(input23, 16); + uint8_t *expected23_aligned16 = reinterpret_cast(32); + TF_LITE_MICRO_EXPECT(expected23_aligned16 == input23_aligned16); +} + +TF_LITE_MICRO_TEST(TestAlignPointerDown) +{ + uint8_t *input0 = reinterpret_cast(0); + + uint8_t *input0_aligned1 = tflite::AlignPointerDown(input0, 1); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned1); + + uint8_t *input0_aligned2 = tflite::AlignPointerDown(input0, 2); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned2); + + uint8_t *input0_aligned3 = tflite::AlignPointerDown(input0, 3); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned3); + + uint8_t *input0_aligned16 = tflite::AlignPointerDown(input0, 16); + TF_LITE_MICRO_EXPECT(input0 == input0_aligned16); + + uint8_t *input23 = reinterpret_cast(23); + + uint8_t *input23_aligned1 = tflite::AlignPointerDown(input23, 1); + TF_LITE_MICRO_EXPECT(input23 == input23_aligned1); + + uint8_t *input23_aligned2 = tflite::AlignPointerDown(input23, 2); + uint8_t *expected23_aligned2 = reinterpret_cast(22); + TF_LITE_MICRO_EXPECT(expected23_aligned2 == input23_aligned2); + + uint8_t *input23_aligned3 = tflite::AlignPointerDown(input23, 3); + uint8_t *expected23_aligned3 = reinterpret_cast(21); + TF_LITE_MICRO_EXPECT(expected23_aligned3 == input23_aligned3); + + uint8_t *input23_aligned16 = tflite::AlignPointerDown(input23, 16); + uint8_t *expected23_aligned16 = reinterpret_cast(16); + TF_LITE_MICRO_EXPECT(expected23_aligned16 == input23_aligned16); +} + +TF_LITE_MICRO_TEST(TestAlignSizeUp) +{ + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), tflite::AlignSizeUp(1, 1)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(2), tflite::AlignSizeUp(1, 2)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(3), tflite::AlignSizeUp(1, 3)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(16), tflite::AlignSizeUp(1, 16)); + + TF_LITE_MICRO_EXPECT_EQ(static_cast(23), tflite::AlignSizeUp(23, 1)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(24), tflite::AlignSizeUp(23, 2)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(24), tflite::AlignSizeUp(23, 3)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(32), tflite::AlignSizeUp(23, 16)); +} + +TF_LITE_MICRO_TEST(TestTypeSizeOf) +{ + size_t size; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteFloat16, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(int16_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteFloat32, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(float), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteFloat64, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(double), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteInt16, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(int16_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteInt32, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(int32_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteUInt32, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(uint32_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteUInt8, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(uint8_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteInt8, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(int8_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteInt64, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(int64_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteUInt64, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(uint64_t), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteBool, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(bool), size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteComplex64, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(float) * 2, size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + tflite::TfLiteTypeSizeOf(kTfLiteComplex128, &size)); + TF_LITE_MICRO_EXPECT_EQ(sizeof(double) * 2, size); + + TF_LITE_MICRO_EXPECT_NE( + kTfLiteOk, tflite::TfLiteTypeSizeOf(static_cast(-1), &size)); +} + +TF_LITE_MICRO_TEST(TestBytesRequiredForTensor) +{ + const tflite::Tensor *tensor100 = + tflite::testing::Create1dFlatbufferTensor(100); + size_t bytes; + size_t type_size; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, tflite::BytesRequiredForTensor( + *tensor100, &bytes, &type_size, + tflite::GetMicroErrorReporter())); + TF_LITE_MICRO_EXPECT_EQ(static_cast(400), bytes); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), type_size); + + const tflite::Tensor *tensor200 = + tflite::testing::Create1dFlatbufferTensor(200); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, tflite::BytesRequiredForTensor( + *tensor200, &bytes, &type_size, + tflite::GetMicroErrorReporter())); + TF_LITE_MICRO_EXPECT_EQ(static_cast(800), bytes); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), type_size); +} + +TF_LITE_MICRO_TEST(TestAllocateOutputDimensionsFromInput) +{ + constexpr int kDimsLen = 4; + int input1_dims[] = { 1, 1 }; + int input2_dims[] = { kDimsLen, 5, 5, 5, 5 }; + int output_dims[] = { 0, 0, 0, 0, 0 }; + TfLiteTensor input_tensor1 = tflite::testing::CreateTensor( + nullptr, tflite::testing::IntArrayFromInts(input1_dims)); + TfLiteTensor input_tensor2 = tflite::testing::CreateTensor( + nullptr, tflite::testing::IntArrayFromInts(input2_dims)); + TfLiteTensor output_tensor = tflite::testing::CreateTensor( + nullptr, tflite::testing::IntArrayFromInts(output_dims)); + TfLiteContext context; + // Only need to allocate space for output_tensor.dims. Use a simple + // fake allocator. + context.AllocatePersistentBuffer = FakeAllocatePersistentBuffer; + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::AllocateOutputDimensionsFromInput( + &context, &input_tensor1, &input_tensor2, &output_tensor)); + + TF_LITE_MICRO_EXPECT_EQ(output_tensor.bytes, input_tensor2.bytes); + for (int i = 0; i < kDimsLen; i++) { + TF_LITE_MICRO_EXPECT_EQ(input_tensor2.dims->data[i], + output_tensor.dims->data[i]); + // Reset output dims for next iteration. + output_tensor.dims->data[i] = 0; + } + // Output tensor size must be 0 to allocate output dimensions from input. + output_tensor.dims->size = 0; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::AllocateOutputDimensionsFromInput( + &context, &input_tensor2, &input_tensor1, &output_tensor)); + for (int i = 0; i < kDimsLen; i++) { + TF_LITE_MICRO_EXPECT_EQ(input_tensor2.dims->data[i], + output_tensor.dims->data[i]); + } + TF_LITE_MICRO_EXPECT_EQ(output_tensor.bytes, input_tensor2.bytes); +} +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.cc new file mode 100644 index 00000000..6531c51d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.cc @@ -0,0 +1,462 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/memory_planner/greedy_memory_planner.h" + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_string.h" + +namespace tflite { + +namespace { + +// Returns a character representing a numbered buffer +// for GreedyMemoryPlanner::PrintMemoryPlan() +char GetOrdinalCharacter(int i) +{ + if (i < 10) { + return '0' + i; + } else if (i < 36) { + return 'a' + (i - 10); + } else if (i < 62) { + return 'A' + (i - 36); + } + return '*'; +} + +} // namespace + +// Simple stable in-place sort function. Not time-efficient for large arrays. +// Would normally be in an anonymous namespace to keep it private, but we want +// to be able to test it externally. +void ReverseSortInPlace(int *values, int *ids, int size) +{ + bool any_swapped; + do { + any_swapped = false; + for (int i = 1; i < size; ++i) { + if (values[i - 1] < values[i]) { + const int value_temp = values[i - 1]; + values[i - 1] = values[i]; + values[i] = value_temp; + const int id_temp = ids[i - 1]; + ids[i - 1] = ids[i]; + ids[i] = id_temp; + any_swapped = true; + } + } + } while (any_swapped); +} + +GreedyMemoryPlanner::GreedyMemoryPlanner(unsigned char *scratch_buffer, + int scratch_buffer_size) + : buffer_count_(0), need_to_calculate_offsets_(true) +{ + // Allocate the arrays we need within the scratch buffer arena. + max_buffer_count_ = scratch_buffer_size / per_buffer_size(); + + unsigned char *next_free = scratch_buffer; + requirements_ = reinterpret_cast(next_free); + next_free += sizeof(BufferRequirements) * max_buffer_count_; + + buffer_sizes_sorted_ = reinterpret_cast(next_free); + next_free += sizeof(int) * max_buffer_count_; + + buffer_ids_sorted_ = reinterpret_cast(next_free); + next_free += sizeof(int) * max_buffer_count_; + + buffers_sorted_by_offset_ = reinterpret_cast(next_free); + next_free += sizeof(ListEntry) * max_buffer_count_; + + buffer_offsets_ = reinterpret_cast(next_free); +} + +GreedyMemoryPlanner::~GreedyMemoryPlanner() +{ + // We don't own the scratch buffer, so don't deallocate anything. +} + +TfLiteStatus GreedyMemoryPlanner::AddBuffer( + tflite::ErrorReporter *error_reporter, int size, int first_time_used, + int last_time_used) +{ + if (buffer_count_ >= max_buffer_count_) { + TF_LITE_REPORT_ERROR(error_reporter, "Too many buffers (max is %d)", + max_buffer_count_); + return kTfLiteError; + } + BufferRequirements *current = &requirements_[buffer_count_]; + current->size = size; + current->first_time_used = first_time_used; + current->last_time_used = last_time_used; + current->offline_offset = kOnlinePlannedBuffer; + ++buffer_count_; + need_to_calculate_offsets_ = true; + return kTfLiteOk; +} + +TfLiteStatus GreedyMemoryPlanner::AddBuffer( + tflite::ErrorReporter *error_reporter, int size, int first_time_used, + int last_time_used, int offline_offset) +{ + BufferRequirements *current = &requirements_[buffer_count_]; + if (AddBuffer(error_reporter, size, first_time_used, last_time_used) != + kTfLiteOk) { + return kTfLiteError; + } + current->offline_offset = offline_offset; + return kTfLiteOk; +} + +bool GreedyMemoryPlanner::DoesEntryOverlapInTime( + const GreedyMemoryPlanner::ListEntry *entry, const int first_time_used, + const int last_time_used) const +{ + const BufferRequirements *entry_requirements = + &requirements_[entry->requirements_index]; + if (entry_requirements->first_time_used > last_time_used) { + return false; + } + if (first_time_used > entry_requirements->last_time_used) { + return false; + } + return true; +} + +GreedyMemoryPlanner::ListEntry * +GreedyMemoryPlanner::NextSimultaneouslyActiveBuffer( + const GreedyMemoryPlanner::ListEntry *start, const int first_time_used, + const int last_time_used) +{ + ListEntry *result = nullptr; + ListEntry *candidate_next_entry; + if (start == nullptr) { + candidate_next_entry = &buffers_sorted_by_offset_[first_entry_index_]; + } else { + if (start->next_entry_index == -1) { + return nullptr; + } + candidate_next_entry = &buffers_sorted_by_offset_[start->next_entry_index]; + } + do { + if (DoesEntryOverlapInTime(candidate_next_entry, first_time_used, + last_time_used)) { + result = candidate_next_entry; + break; + } + if (candidate_next_entry->next_entry_index == -1) { + break; + } + candidate_next_entry = + &buffers_sorted_by_offset_[candidate_next_entry->next_entry_index]; + } while (true); + return result; +} + +void GreedyMemoryPlanner::CalculateOffsetsIfNeeded() +{ + if (!need_to_calculate_offsets_ || (buffer_count_ == 0)) { + return; + } + need_to_calculate_offsets_ = false; + + // Start off by ordering the buffers in descending order of size. + // This helps find a more compact layout. Intuitively, you can think + // about putting the large buffers in place first, and then the + // smaller buffers can fit in the gaps, rather than fragmenting the + // gaps with small buffers at the beginning. Add offline planned offsets + // first in the list, since they have a predetermined offset. + int idx_from_tail = buffer_count_; + int idx_from_head = 0; + for (int i = 0; i < buffer_count_; ++i) { + if (requirements_[i].offline_offset == kOnlinePlannedBuffer) { + idx_from_tail--; + buffer_sizes_sorted_[idx_from_tail] = requirements_[i].size; + buffer_ids_sorted_[idx_from_tail] = i; + buffer_offsets_[i] = -1; + } else { + buffer_sizes_sorted_[idx_from_head] = requirements_[i].size; + buffer_ids_sorted_[idx_from_head] = i; + buffer_offsets_[i] = requirements_[i].offline_offset; + idx_from_head++; + } + } + + // This sorting algorithm is naive, and may end up taking a very long time + // with hundreds of buffers. Do not sort the offline planned offsets. + ReverseSortInPlace(&buffer_sizes_sorted_[idx_from_head], + &buffer_ids_sorted_[idx_from_head], + buffer_count_ - idx_from_head); + + // Initialize the first entry to the first buffer in + // buffer_ids_sorted_. + // - If there are no offline planned offsets, the largest buffer will be + // first, and the buffers will be handled in size order. + // - If offline offsets are present, these will be handled first in order + // for the greedy algorithm to utilized gaps in the offline plan. + first_entry_index_ = 0; + next_free_entry_ = 1; + ListEntry *first_entry = &buffers_sorted_by_offset_[first_entry_index_]; + first_entry->next_entry_index = -1; // to mark the entry as end of list + int buffer_id = buffer_ids_sorted_[0]; + first_entry->requirements_index = buffer_id; + if (requirements_[buffer_id].offline_offset == kOnlinePlannedBuffer) { + buffer_offsets_[buffer_id] = 0; + } + first_entry->offset = buffer_offsets_[buffer_id]; + + // Work through the rest of the buffers to find a good gap to place each one. + for (int i = 1; i < buffer_count_; ++i) { + // The id is the order the buffer was originally added by the client. + buffer_id = buffer_ids_sorted_[i]; + // Look at what size and time range the buffer needs to be active. + BufferRequirements *wanted_requirements = &requirements_[buffer_id]; + const int wanted_size = wanted_requirements->size; + const int wanted_first_time_used = wanted_requirements->first_time_used; + const int wanted_last_time_used = wanted_requirements->last_time_used; + + // Find the first buffer that's active in our time range. All placed + // buffers are stored in the order of their starting position in the arena + // so that it's easy to find the next buffer in memory, and so the gap. + // The candidate_entry variable holds the buffer that we're considering + // placing the current buffer after. + + int candidate_offset = 0; + // Loop through the offset-ordered list of buffers, looking for gaps. + if (wanted_requirements->offline_offset == kOnlinePlannedBuffer) { + ListEntry *prior_entry = nullptr; + while (true) { + // Find out what the next active buffer is. + ListEntry *next_entry = NextSimultaneouslyActiveBuffer( + prior_entry, wanted_first_time_used, wanted_last_time_used); + + if (prior_entry) { + BufferRequirements *candidate_requirements = + &requirements_[prior_entry->requirements_index]; + const int prior_entry_offset = + prior_entry->offset + candidate_requirements->size; + if (prior_entry_offset > candidate_offset) { + candidate_offset = prior_entry_offset; + } + } + if (next_entry == nullptr) { + // We're at the end of the list, so we can always append the buffer + // here. + break; + } + // Find out how much space there is between us and the next buffer. + const int gap = next_entry->offset - candidate_offset; + if (gap >= wanted_size) { + // This entry has a big enough gap between it and the next, so + // use it! + break; + } + // The gap wasn't big enough, so move on to another candidate. + prior_entry = next_entry; + } + } else { + // Offline planned offset are to be considered constant + candidate_offset = wanted_requirements->offline_offset; + } + // At this point, we've either found a gap (possibly at the end of the + // list) and want to place the buffer there, or there are no other active + // buffers in this time range and so we can put it at offset zero. + // Record the buffer's offset in our plan. + buffer_offsets_[buffer_id] = candidate_offset; + // Add the newly-placed buffer to our offset-ordered list, so that + // subsequent passes can fit in their buffers around it. + ListEntry *new_entry = &buffers_sorted_by_offset_[next_free_entry_]; + new_entry->offset = candidate_offset; + new_entry->requirements_index = buffer_id; + const int new_entry_index = next_free_entry_; + ++next_free_entry_; + + if (first_entry->offset > candidate_offset) { + // The new entry offset is smaller than the first entry offset => + // replace the first entry + first_entry = new_entry; + first_entry->next_entry_index = first_entry_index_; + first_entry_index_ = new_entry_index; + } else { + ListEntry *current_entry = first_entry; + // Make sure that we insert the buffer at the correct place in the + // buffer-offset-ordered list + while (true) { + const int next_entry_index = current_entry->next_entry_index; + if (next_entry_index == -1) { + // We're at the end of the list, so just add the new entry here. + current_entry->next_entry_index = new_entry_index; + new_entry->next_entry_index = -1; + break; + } + // not at the end of the list -> take a look at next entry + ListEntry *next_entry = &buffers_sorted_by_offset_[next_entry_index]; + if (next_entry->offset > candidate_offset) { + // We're at the right spot to do an insertion and retain the sorting + // order, so place the new entry here. + new_entry->next_entry_index = current_entry->next_entry_index; + current_entry->next_entry_index = new_entry_index; + break; + } + current_entry = next_entry; + } + } + } +} + +size_t GreedyMemoryPlanner::GetMaximumMemorySize() +{ + CalculateOffsetsIfNeeded(); + if (buffer_count_ == 0) { + return 0; + } + ListEntry *entry = &buffers_sorted_by_offset_[first_entry_index_]; + size_t max_size = 0; + while (entry) { + BufferRequirements *requirements = + &requirements_[entry->requirements_index]; + const size_t current_size = entry->offset + requirements->size; + if (current_size > max_size) { + max_size = current_size; + } + if (entry->next_entry_index == -1) { + break; + } + entry = &buffers_sorted_by_offset_[entry->next_entry_index]; + } + return max_size; +} + +void GreedyMemoryPlanner::PrintMemoryPlan() +{ + CalculateOffsetsIfNeeded(); + + for (int i = 0; i < buffer_count_; ++i) { + MicroPrintf("%c (id=%d): size=%d, offset=%d, first_used=%d last_used=%d", + GetOrdinalCharacter(i), i, requirements_[i].size, + buffer_offsets_[i], requirements_[i].first_time_used, + requirements_[i].last_time_used); + } + + constexpr int kLineWidth = 80; + int max_size = kLineWidth; + int max_time = 0; + for (int i = 0; i < buffer_count_; ++i) { + BufferRequirements *requirements = &requirements_[i]; + const int offset = buffer_offsets_[i]; + const int last_time_used = requirements->last_time_used; + const int size = offset + requirements->size; + if (size > max_size) { + max_size = size; + } + if (last_time_used > max_time) { + max_time = last_time_used; + } + } + + char line[kLineWidth + 1]; + for (int t = 0; t <= max_time; ++t) { + for (int c = 0; c < kLineWidth; ++c) { + line[c] = '.'; + } + int memory_use = 0; + for (int i = 0; i < buffer_count_; ++i) { + BufferRequirements *requirements = &requirements_[i]; + if ((t < requirements->first_time_used) || + (t > requirements->last_time_used)) { + continue; + } + const int offset = buffer_offsets_[i]; + if (offset == -1) { + continue; + } + const int size = requirements->size; + memory_use += size; + const int line_start = (offset * kLineWidth) / max_size; + const int line_end = ((offset + size) * kLineWidth) / max_size; + for (int n = line_start; n < line_end; ++n) { + if (line[n] == '.') { + line[n] = GetOrdinalCharacter(i); + } else { + line[n] = '!'; + } + } + } + line[kLineWidth] = 0; + + MicroPrintf("%s%d: %s (%dk)", t < 10 ? " " : "", t, (const char *)line, + (memory_use + 1023) / 1024); + } +} + +int GreedyMemoryPlanner::GetBufferCount() +{ + return buffer_count_; +} + +TfLiteStatus GreedyMemoryPlanner::GetOffsetForBuffer( + tflite::ErrorReporter *error_reporter, int buffer_index, int *offset) +{ + CalculateOffsetsIfNeeded(); + if ((buffer_index < 0) || (buffer_index >= buffer_count_)) { + TF_LITE_REPORT_ERROR(error_reporter, + "buffer index %d is outside range 0 to %d", + buffer_index, buffer_count_); + return kTfLiteError; + } + *offset = buffer_offsets_[buffer_index]; + return kTfLiteOk; +} + +bool GreedyMemoryPlanner::DoAnyBuffersOverlap(ErrorReporter *error_reporter) +{ + CalculateOffsetsIfNeeded(); + bool were_overlaps_found = false; + for (int i = 0; i < buffer_count_; ++i) { + BufferRequirements *a_requirements = &requirements_[i]; + const int a_start_offset = buffer_offsets_[i]; + const int a_first_time_used = a_requirements->first_time_used; + const int a_last_time_used = a_requirements->last_time_used; + const int a_end_offset = a_start_offset + a_requirements->size; + for (int j = 0; j < buffer_count_; ++j) { + if (i == j) { + continue; + } + BufferRequirements *b_requirements = &requirements_[j]; + const int b_start_offset = buffer_offsets_[j]; + const int b_first_time_used = b_requirements->first_time_used; + const int b_last_time_used = b_requirements->last_time_used; + const int b_end_offset = b_start_offset + b_requirements->size; + if ((a_first_time_used > b_last_time_used) || + (b_first_time_used > a_last_time_used)) { + // Buffers don't overlap in time. + continue; + } + if ((a_start_offset >= b_end_offset) || + (b_start_offset >= a_end_offset)) { + // No overlap in memory. + continue; + } + were_overlaps_found = true; + TF_LITE_REPORT_ERROR( + error_reporter, "Overlap: %d (%d=>%d, %d->%d) vs %d (%d=>%d, %d->%d)", + i, a_first_time_used, a_last_time_used, a_start_offset, a_end_offset, + j, b_first_time_used, b_last_time_used, b_start_offset, b_end_offset); + } + } + return were_overlaps_found; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h new file mode 100644 index 00000000..f5c764a0 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h @@ -0,0 +1,163 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_GREEDY_MEMORY_PLANNER_H_ +#define TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_GREEDY_MEMORY_PLANNER_H_ + +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/memory_planner/memory_planner.h" + +namespace tflite { +constexpr int kOnlinePlannedBuffer = -1; + +// A memory planner that uses a greedy algorithm to arrange buffers in memory +// to minimize the overall arena size needed. +// +// The algorithm works like this: +// - The client enters the buffer information through AddBuffer(). +// - When a function like GetOffsetForBuffer() is called, the +// CalculateOffsetsIfNeeded() method is invoked. +// - If an up to date plan is not already present, one will be calculated. +// - The buffers are sorted in descending order of size. +// - The largest buffer is placed at offset zero. +// - The rest of the buffers are looped through in descending size order. +// - The other buffers that need to be in memory at the same time are found. +// - The first gap between simultaneously active buffers that the current +// buffer fits into will be used. +// - If no large-enough gap is found, the current buffer is placed after the +// last buffer that's simultaneously active. +// - This continues until all buffers are placed, and the offsets stored. +// +// This is not guaranteed to produce the best placement, since that's an +// NP-Complete problem, but in practice it should produce one that's decent. +class GreedyMemoryPlanner : public MemoryPlanner { +public: + // You need to pass in an area of memory to be used for planning. This memory + // needs to have a lifetime as long as the planner, but isn't owned by this + // object, so management should be handled by the client. This is so it can be + // stack or globally allocated if necessary on devices without dynamic memory + // allocation. How many buffers can be planned for will depend on the size of + // this scratch memory, so you should enlarge it if you see an error when + // calling AddBuffer(). The memory can be reused once you're done with the + // planner, as long as you copy the calculated offsets to another location. + // Each buffer requires about 36 bytes of scratch. + GreedyMemoryPlanner(unsigned char *scratch_buffer, int scratch_buffer_size); + ~GreedyMemoryPlanner() override; + + // Record details of a buffer we want to place. + TfLiteStatus AddBuffer(ErrorReporter *error_reporter, int size, + int first_time_used, int last_time_used) override; + + // Record details of an offline planned buffer offset we want to place. + // offline_offset is the buffer offset from the start of the arena. + TfLiteStatus AddBuffer(ErrorReporter *error_reporter, int size, + int first_time_used, int last_time_used, + int offline_offset); + + // Returns the high-water mark of used memory. This is the minimum size of a + // memory arena you'd need to allocate to hold these buffers. + size_t GetMaximumMemorySize() override; + + // How many buffers have been recorded. + int GetBufferCount() override; + + // Where a given buffer should be placed in the memory arena. + // This information is stored in the memory arena itself, so once the arena + // is used for inference, it will be overwritten. + TfLiteStatus GetOffsetForBuffer(ErrorReporter *error_reporter, + int buffer_index, int *offset) override; + + // Prints an ascii-art diagram of the buffer layout plan. + void PrintMemoryPlan(); + + // Debug method to check whether any buffer allocations are overlapping. This + // is an O(N^2) complexity operation, so only use for testing. + bool DoAnyBuffersOverlap(ErrorReporter *error_reporter); + + // Used to store a list of buffers ordered by their offset. + struct ListEntry { + int offset; + int requirements_index; + int next_entry_index; + }; + + // Number of bytes required in order to plan a buffer. + static size_t per_buffer_size() + { + const int per_buffer_size = + sizeof(BufferRequirements) + // requirements_ + sizeof(int) + // buffer_sizes_sorted_ + sizeof(int) + // buffer_ids_sorted_ + sizeof(ListEntry) + // buffers_sorted_by_offset_ + sizeof(int); // buffer_offsets_; + return per_buffer_size; + } + +private: + // Whether a buffer is active in a given time range. + bool DoesEntryOverlapInTime(const ListEntry *entry, const int first_time_used, + const int last_time_used) const; + + // Walks the list to return the next buffer that is active in a given time + // range, or a null pointer if there are none. + ListEntry *NextSimultaneouslyActiveBuffer(const ListEntry *start, + const int first_time_used, + const int last_time_used); + + // If there isn't an up to date plan, calculate a new one. + void CalculateOffsetsIfNeeded(); + + // How many buffers we can plan for, based on the arena size we're given in + // the constructor. + int max_buffer_count_; + + // The number of buffers added so far. + int buffer_count_; + + // Records the client-provided information about each buffer. + struct BufferRequirements { + int size; + int offline_offset; + int first_time_used; + int last_time_used; + }; + + // Working arrays used during the layout algorithm. + BufferRequirements *requirements_; + // buffer_sizes_sorted_ and buffer_ids_sorted_ are sorted according to: + // { + // offline planned buffers, + // online planned buffers sorted by size + // } + int *buffer_sizes_sorted_; + int *buffer_ids_sorted_; + ListEntry *buffers_sorted_by_offset_; + int next_free_entry_; // Index of the next free entry of + // buffers_sorted_by_offset_ + int first_entry_index_; // Index of the first entry (smallest offset) of + // buffers_sorted_by_offset_ + + // Stores the outcome of the plan, the location of each buffer in the arena. + int *buffer_offsets_; + + // Whether buffers have been added since the last plan was calculated. + bool need_to_calculate_offsets_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_GREEDY_MEMORY_PLANNER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner_test.cc new file mode 100644 index 00000000..1ab73416 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/greedy_memory_planner_test.cc @@ -0,0 +1,283 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/memory_planner/greedy_memory_planner.h" + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +// We don't declare this in the header since it's not a public interface, but we +// need to call it to test it, so declare it here instead. +void ReverseSortInPlace(int *values, int *ids, int size); +} // namespace tflite + +namespace { +constexpr int kScratchBufferSize = 4096; +unsigned char g_scratch_buffer[kScratchBufferSize]; +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestReverseSortInPlace) +{ + tflite::MicroErrorReporter micro_error_reporter; + + constexpr int a_size = 10; + int a_values[a_size] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; + int a_ids[a_size] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + const int a_expected_values[a_size] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; + const int a_expected_ids[a_size] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + tflite::ReverseSortInPlace(a_values, a_ids, a_size); + for (int i = 0; i < a_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(a_expected_values[i], a_values[i]); + TF_LITE_MICRO_EXPECT_EQ(a_expected_ids[i], a_ids[i]); + } + + constexpr int b_size = 10; + int b_values[b_size] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + int b_ids[b_size] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + const int b_expected_values[b_size] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; + const int b_expected_ids[b_size] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + tflite::ReverseSortInPlace(b_values, b_ids, b_size); + for (int i = 0; i < b_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(b_expected_values[i], b_values[i]); + TF_LITE_MICRO_EXPECT_EQ(b_expected_ids[i], b_ids[i]); + } + + constexpr int c_size = 100; + int c_values[c_size] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + }; + int c_ids[c_size] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 + }; + const int c_expected_values[c_size] = { + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + const int c_expected_ids[c_size] = { + 9, 19, 29, 39, 49, 59, 69, 79, 89, 99, 8, 18, 28, 38, 48, 58, 68, + 78, 88, 98, 7, 17, 27, 37, 47, 57, 67, 77, 87, 97, 6, 16, 26, 36, + 46, 56, 66, 76, 86, 96, 5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 4, + 14, 24, 34, 44, 54, 64, 74, 84, 94, 3, 13, 23, 33, 43, 53, 63, 73, + 83, 93, 2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 1, 11, 21, 31, 41, + 51, 61, 71, 81, 91, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 + }; + tflite::ReverseSortInPlace(c_values, c_ids, c_size); + for (int i = 0; i < c_size; ++i) { + TF_LITE_MICRO_EXPECT_EQ(c_expected_values[i], c_values[i]); + TF_LITE_MICRO_EXPECT_EQ(c_expected_ids[i], c_ids[i]); + } +} + +TF_LITE_MICRO_TEST(TestGreedyBasics) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::GreedyMemoryPlanner planner(g_scratch_buffer, kScratchBufferSize); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 10, 0, 1)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 20, 2, 3)); + + TF_LITE_MICRO_EXPECT_EQ(false, + planner.DoAnyBuffersOverlap(µ_error_reporter)); + + TF_LITE_MICRO_EXPECT_EQ(static_cast(20), + planner.GetMaximumMemorySize()); + + int offset = -1; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 0, &offset)); + TF_LITE_MICRO_EXPECT_EQ(0, offset); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 1, &offset)); + TF_LITE_MICRO_EXPECT_EQ(0, offset); +} + +TF_LITE_MICRO_TEST(TestGreedyMedium) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::GreedyMemoryPlanner planner(g_scratch_buffer, kScratchBufferSize); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 10, 0, 1)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 20, 1, 2)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 30, 2, 3)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 40, 3, 4)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 50, 0, 1)); + + int offset = -1; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 0, &offset)); + TF_LITE_MICRO_EXPECT_EQ(50, offset); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 1, &offset)); + TF_LITE_MICRO_EXPECT_EQ(70, offset); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 2, &offset)); + TF_LITE_MICRO_EXPECT_EQ(40, offset); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 3, &offset)); + TF_LITE_MICRO_EXPECT_EQ(0, offset); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 4, &offset)); + TF_LITE_MICRO_EXPECT_EQ(0, offset); + + planner.PrintMemoryPlan(); + + TF_LITE_MICRO_EXPECT_EQ(false, + planner.DoAnyBuffersOverlap(µ_error_reporter)); + + TF_LITE_MICRO_EXPECT_EQ(static_cast(90), + planner.GetMaximumMemorySize()); +} + +TF_LITE_MICRO_TEST(TestPersonDetectionModel) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::GreedyMemoryPlanner planner(g_scratch_buffer, kScratchBufferSize); + // These buffer sizes and time ranges are taken from the 250KB MobileNet model + // used in the person detection example. + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 9216, 0, 29)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 3, 28, 29)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 256, 27, 28)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 26, 27)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 25, 26)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 24, 25)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 1152, 23, 24)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 22, 23)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 21, 22)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 20, 21)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 19, 20)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 18, 19)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 17, 18)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 16, 17)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 15, 16)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 14, 15)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 13, 14)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 12, 13)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 11, 12)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 9216, 10, 11)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 9216, 9, 10)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 9216, 8, 9)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 4608, 7, 8)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 6, 7)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 5, 6)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 4, 5)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 9216, 3, 4)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 36864, 2, 3)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 1, 2)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 0, 1)); + + planner.PrintMemoryPlan(); + + TF_LITE_MICRO_EXPECT_EQ(false, + planner.DoAnyBuffersOverlap(µ_error_reporter)); + + // The sum of all the buffers is 241,027 bytes, so we at least expect the plan + // to come up with something smaller than this. + TF_LITE_MICRO_EXPECT_GT(static_cast(241027), + planner.GetMaximumMemorySize()); +} + +TF_LITE_MICRO_TEST(TestOverlapCase) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::GreedyMemoryPlanner planner(g_scratch_buffer, kScratchBufferSize); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 100, 0, 1)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 50, 2, 3)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 20, 1, 2)); + + planner.PrintMemoryPlan(); + + TF_LITE_MICRO_EXPECT_EQ(false, + planner.DoAnyBuffersOverlap(µ_error_reporter)); + + TF_LITE_MICRO_EXPECT_EQ(static_cast(120), + planner.GetMaximumMemorySize()); +} + +TF_LITE_MICRO_TEST(TestSmallScratch) +{ + tflite::MicroErrorReporter micro_error_reporter; + + constexpr int scratch_buffer_size = 40; + unsigned char scratch_buffer[scratch_buffer_size]; + tflite::GreedyMemoryPlanner planner(scratch_buffer, scratch_buffer_size); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 100, 0, 1)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, + planner.AddBuffer(µ_error_reporter, 50, 2, 3)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.cc new file mode 100644 index 00000000..16a7ddab --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.cc @@ -0,0 +1,66 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/memory_planner/linear_memory_planner.h" + +namespace tflite { + +LinearMemoryPlanner::LinearMemoryPlanner() + : current_buffer_count_(0), next_free_offset_(0) +{ +} +LinearMemoryPlanner::~LinearMemoryPlanner() +{ +} + +TfLiteStatus LinearMemoryPlanner::AddBuffer( + tflite::ErrorReporter *error_reporter, int size, int first_time_used, + int last_time_used) +{ + if (current_buffer_count_ >= kMaxBufferCount) { + TF_LITE_REPORT_ERROR(error_reporter, "Too many buffers (max is %d)", + kMaxBufferCount); + return kTfLiteError; + } + buffer_offsets_[current_buffer_count_] = next_free_offset_; + next_free_offset_ += size; + ++current_buffer_count_; + return kTfLiteOk; +} + +size_t LinearMemoryPlanner::GetMaximumMemorySize() +{ + return next_free_offset_; +} + +int LinearMemoryPlanner::GetBufferCount() +{ + return current_buffer_count_; +} + +TfLiteStatus LinearMemoryPlanner::GetOffsetForBuffer( + tflite::ErrorReporter *error_reporter, int buffer_index, int *offset) +{ + if ((buffer_index < 0) || (buffer_index >= current_buffer_count_)) { + TF_LITE_REPORT_ERROR(error_reporter, + "buffer index %d is outside range 0 to %d", + buffer_index, current_buffer_count_); + return kTfLiteError; + } + *offset = buffer_offsets_[buffer_index]; + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.h b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.h new file mode 100644 index 00000000..8973d97e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner.h @@ -0,0 +1,49 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_LINEAR_MEMORY_PLANNER_H_ +#define TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_LINEAR_MEMORY_PLANNER_H_ + +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/memory_planner/memory_planner.h" + +namespace tflite { +// The simplest possible memory planner that just lays out all buffers at +// increasing offsets without trying to reuse memory. +class LinearMemoryPlanner : public MemoryPlanner { +public: + LinearMemoryPlanner(); + ~LinearMemoryPlanner() override; + + TfLiteStatus AddBuffer(tflite::ErrorReporter *error_reporter, int size, + int first_time_used, int last_time_used) override; + + size_t GetMaximumMemorySize() override; + int GetBufferCount() override; + TfLiteStatus GetOffsetForBuffer(tflite::ErrorReporter *error_reporter, + int buffer_index, int *offset) override; + +private: + static constexpr int kMaxBufferCount = 1024; + size_t buffer_offsets_[kMaxBufferCount]; + int current_buffer_count_; + size_t next_free_offset_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_LINEAR_MEMORY_PLANNER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner_test.cc new file mode 100644 index 00000000..92d5642e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/linear_memory_planner_test.cc @@ -0,0 +1,127 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/memory_planner/linear_memory_planner.h" + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestBasics) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::LinearMemoryPlanner planner; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 10, 0, 1)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 20, 1, 2)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(30), + planner.GetMaximumMemorySize()); + + int offset = -1; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 0, &offset)); + TF_LITE_MICRO_EXPECT_EQ(0, offset); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.GetOffsetForBuffer(µ_error_reporter, 1, &offset)); + TF_LITE_MICRO_EXPECT_EQ(10, offset); +} + +TF_LITE_MICRO_TEST(TestErrorHandling) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::LinearMemoryPlanner planner; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 10, 0, 1)); + + int offset = -1; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, planner.GetOffsetForBuffer( + µ_error_reporter, 1, &offset)); +} + +TF_LITE_MICRO_TEST(TestPersonDetectionModel) +{ + tflite::MicroErrorReporter micro_error_reporter; + + tflite::LinearMemoryPlanner planner; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 9216, 0, 29)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 3, 28, 29)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 256, 27, 28)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 26, 27)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 25, 26)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 24, 25)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 1152, 23, 24)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 22, 23)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 21, 22)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 20, 21)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 19, 20)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 18, 19)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 17, 18)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 16, 17)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 15, 16)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 14, 15)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 13, 14)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 4608, 12, 13)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 2304, 11, 12)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 9216, 10, 11)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 9216, 9, 10)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 9216, 8, 9)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 4608, 7, 8)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 6, 7)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 5, 6)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 4, 5)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + planner.AddBuffer(µ_error_reporter, 9216, 3, 4)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 36864, 2, 3)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 1, 2)); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, planner.AddBuffer(µ_error_reporter, 18432, 0, 1)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(241027), + planner.GetMaximumMemorySize()); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/memory_planner.h b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/memory_planner.h new file mode 100644 index 00000000..c0f2b51e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/memory_planner/memory_planner.h @@ -0,0 +1,74 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_MEMORY_PLANNER_H_ +#define TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_MEMORY_PLANNER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" + +namespace tflite { +// Interface class for planning the layout of memory buffers during the +// execution of a graph. +// It's designed to be used by a client that iterates in any order through the +// buffers it wants to lay out, and then calls the getter functions for +// information about the calculated layout. For example: +// +// SomeMemoryPlanner planner; +// planner.AddBuffer(reporter, 100, 0, 1); // Buffer 0 +// planner.AddBuffer(reporter, 50, 2, 3); // Buffer 1 +// planner.AddBuffer(reporter, 50, 2, 3); // Buffer 2 +// +// int offset0; +// TF_EXPECT_OK(planner.GetOffsetForBuffer(reporter, 0, &offset0)); +// int offset1; +// TF_EXPECT_OK(planner.GetOffsetForBuffer(reporter, 1, &offset1)); +// int offset2; +// TF_EXPECT_OK(planner.GetOffsetForBuffer(reporter, 2, &offset2)); +// const int arena_size_needed = planner.GetMaximumMemorySize(); +// +// The goal is for applications to be able to experiment with different layout +// strategies without changing their client code, by swapping out classes that +// implement this interface.= +class MemoryPlanner { +public: + MemoryPlanner() + { + } + virtual ~MemoryPlanner() + { + } + + // Pass information about a buffer's size and lifetime to the layout + // algorithm. The order this is called implicitly assigns an index to the + // result, so the buffer information that's passed into the N-th call of + // this method will be used as the buffer_index argument to + // GetOffsetForBuffer(). + virtual TfLiteStatus AddBuffer(tflite::ErrorReporter *error_reporter, + int size, int first_time_used, + int last_time_used) = 0; + + // The largest contiguous block of memory that's needed to hold the layout. + virtual size_t GetMaximumMemorySize() = 0; + // How many buffers have been added to the planner. + virtual int GetBufferCount() = 0; + // Calculated layout offset for the N-th buffer added to the planner. + virtual TfLiteStatus GetOffsetForBuffer(tflite::ErrorReporter *error_reporter, + int buffer_index, int *offset) = 0; +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_MEMORY_PLANNER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.cc new file mode 100644 index 00000000..d89f80d2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.cc @@ -0,0 +1,1115 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_allocator.h" + +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" +#include "tensorflow/lite/core/api/op_resolver.h" +#include "tensorflow/lite/core/api/tensor_utils.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/memory_planner/greedy_memory_planner.h" +#include "tensorflow/lite/micro/memory_planner/memory_planner.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/simple_memory_allocator.h" +#include "tensorflow/lite/schema/schema_generated.h" +#include "tensorflow/lite/schema/schema_utils.h" + +namespace tflite { + +namespace { + +// Maximum number of scratch buffer requests per operator. Operator kernels that +// request more than this value will receive an exception. +constexpr size_t kMaxScratchBuffersPerOp = 12; + +// Sentinel value used as a placeholder to mark a ScratchBufferRequest request +// needs a node id assignment. +constexpr int kUnassignedScratchBufferRequestIndex = -1; + +// Used to hold information used during allocation calculations. +struct AllocationInfo { + size_t bytes; + void **output_ptr; + int first_created; + int last_used; + int32_t offline_offset; + bool needs_allocating; +}; + +// We align tensor buffers to 16-byte boundaries, since this is a common +// requirement for SIMD extensions. +constexpr int kBufferAlignment = 16; +constexpr char kOfflineMemAllocMetadata[] = "OfflineMemoryAllocation"; +const TfLiteIntArray kZeroLengthIntArray = {}; + +class MicroBuiltinDataAllocator : public BuiltinDataAllocator { +public: + explicit MicroBuiltinDataAllocator(SimpleMemoryAllocator *memory_allocator) + : memory_allocator_(memory_allocator) + { + } + + void *Allocate(size_t size, size_t alignment_hint) override + { + return memory_allocator_->AllocateFromTail(size, alignment_hint); + } + void Deallocate(void *data) override + { + // Do not deallocate, builtin data needs to be available for the life time + // of the model. + } + +private: + SimpleMemoryAllocator *memory_allocator_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +#if !defined(__clang__) +// Helper function to check flatbuffer metadata correctness. This function is +// not called by default. Hence it's not linked in to the final binary code. +TfLiteStatus CheckOfflinePlannedOffsets(const Model *model, + ErrorReporter *error_reporter) +{ + // Suppress compile warning for unused function + (void)CheckOfflinePlannedOffsets; + + if (model->metadata()) { + for (size_t i = 0; i < model->metadata()->size(); ++i) { + auto metadata = model->metadata()->Get(i); + if (strncmp(metadata->name()->c_str(), kOfflineMemAllocMetadata, + strlen(kOfflineMemAllocMetadata)) == 0) { + auto *subgraphs = model->subgraphs(); + const SubGraph *subgraph = (*subgraphs)[0]; + const flatbuffers::Vector > *tensors = + subgraph->tensors(); + const flatbuffers::Vector > *buffers = + model->buffers(); + int nbr_tflite_tensors = tensors->size(); + auto *buffer = (*buffers)[metadata->buffer()]; + auto *array = buffer->data(); + const uint32_t *metadata_buffer = (uint32_t *)array->data(); + int version = metadata_buffer[0]; + int subgraph_idx = metadata_buffer[1]; + const int nbr_offline_offsets = metadata_buffer[2]; +#ifndef TF_LITE_STRIP_ERROR_STRINGS + int *offline_planner_offsets = (int *)&metadata_buffer[3]; +#endif + + TF_LITE_REPORT_ERROR(error_reporter, "==== Model metadata info: ====="); + TF_LITE_REPORT_ERROR(error_reporter, + "Offline planner metadata found, version %d, " + "subgraph %d, nbr offline offsets %d", + version, subgraph_idx, nbr_offline_offsets); + for (int j = 0; j < nbr_offline_offsets; ++j) { + TF_LITE_REPORT_ERROR( + error_reporter, + "Offline planner tensor index %d, offline offset: %d", j, + offline_planner_offsets[j]); + } + + if (version != 1) { + TF_LITE_REPORT_ERROR(error_reporter, "Version not supported! (%d)\n", + version); + return kTfLiteError; + } + if (subgraph_idx != 0) { + TF_LITE_REPORT_ERROR(error_reporter, + "Only 1 subgraph supported! Subgraph idx (%d)\n", + subgraph_idx); + return kTfLiteError; + } + if (nbr_tflite_tensors != nbr_offline_offsets) { + TF_LITE_REPORT_ERROR(error_reporter, + "Nbr of offline buffer offsets (%d) in metadata " + "not equal nbr tensors (%d)\n", + nbr_offline_offsets, nbr_tflite_tensors); + return kTfLiteError; + } + } + } + } + return kTfLiteOk; +} +#endif + +// A helper class to construct AllocationInfo array. This array contains the +// lifetime of tensors / scratch_buffer and will be used to calculate the memory +// plan. Methods need to be called in order from `Init`, `Add*`, to `Finish`. +class AllocationInfoBuilder { +public: + AllocationInfoBuilder(AllocationInfo *info, size_t tensor_count, + size_t scratch_buffer_count, ErrorReporter *reporter) + : info_(info), + tensor_count_(tensor_count), + buffer_count_(scratch_buffer_count), + reporter_(reporter) + { + } + + // Check if model contains offline planned buffer offsets. + // - If there's no metadata available, offline_planner_offsets is not set + // - If there's metadata available, offline_planner_offsets will point to the + // first offset in the metadata buffer list. + TfLiteStatus GetOfflinePlannedOffsets( + const Model *model, const int32_t **offline_planner_offsets); + + // Add allocaiton information for the tensors. + TfLiteStatus AddTensors(const SubGraph *subgraph, + const int32_t *offline_offsets, + TfLiteEvalTensor *eval_tensors); + + // Add allocation information for the scratch buffers. + TfLiteStatus AddScratchBuffers( + internal::ScratchBufferRequest *scratch_buffer_requests, + ScratchBufferHandle *scratch_buffer_handles); + + // Returns a pointer to the built AllocationInfo array. + const AllocationInfo *Finish() const + { + return info_; + } + +private: + AllocationInfo *info_ = nullptr; + size_t tensor_count_ = 0; + size_t buffer_count_ = 0; + ErrorReporter *reporter_ = nullptr; +}; + +TfLiteStatus AllocationInfoBuilder::AddTensors(const SubGraph *subgraph, + const int32_t *offline_offsets, + TfLiteEvalTensor *eval_tensors) +{ + TFLITE_DCHECK(eval_tensors != nullptr); + + // Set up allocation info for all tensors. + for (size_t i = 0; i < tensor_count_; ++i) { + AllocationInfo *current = &info_[i]; + current->output_ptr = &(eval_tensors[i].data.data); + + TF_LITE_ENSURE_STATUS( + TfLiteEvalTensorByteLength(&eval_tensors[i], ¤t->bytes)); + + current->first_created = -1; + current->last_used = -1; + current->needs_allocating = (eval_tensors[i].data.data == nullptr) && + (!subgraph->tensors()->Get(i)->is_variable()); + if (offline_offsets) { + current->offline_offset = offline_offsets[i]; + } else { + current->offline_offset = kOnlinePlannedBuffer; + } + } + + for (size_t i = 0; i < subgraph->inputs()->size(); ++i) { + const int tensor_index = subgraph->inputs()->Get(i); + AllocationInfo *current = &info_[tensor_index]; + current->first_created = 0; + } + + // Mark all outputs as persistent to the end of the invocation. + for (size_t i = 0; i < subgraph->outputs()->size(); ++i) { + const int tensor_index = subgraph->outputs()->Get(i); + AllocationInfo *current = &info_[tensor_index]; + current->last_used = subgraph->operators()->size() - 1; + } + + // Figure out when the first and last use of each tensor is. + for (int i = (subgraph->operators()->size() - 1); i >= 0; --i) { + const auto *op = subgraph->operators()->Get(i); + for (size_t n = 0; n < op->inputs()->size(); ++n) { + const int tensor_index = op->inputs()->Get(n); + AllocationInfo *current = &info_[tensor_index]; + if (((current->last_used == -1) || (current->last_used < i))) { + current->last_used = i; + } + } + for (size_t n = 0; n < op->outputs()->size(); ++n) { + const int tensor_index = op->outputs()->Get(n); + AllocationInfo *current = &info_[tensor_index]; + if ((current->first_created == -1) || (current->first_created > i)) { + current->first_created = i; + } + } + } + return kTfLiteOk; +} + +// Get offline tensors allocation plan. See +// micro/docs/memory_management.md for more info. +TfLiteStatus AllocationInfoBuilder::GetOfflinePlannedOffsets( + const Model *model, const int32_t **offline_planner_offsets) +{ + if (model->metadata()) { + for (size_t i = 0; i < model->metadata()->size(); ++i) { + auto metadata = model->metadata()->Get(i); + if (strncmp(metadata->name()->c_str(), kOfflineMemAllocMetadata, + strlen(kOfflineMemAllocMetadata)) == 0) { + const flatbuffers::Vector > *buffers = + model->buffers(); + auto *buffer = (*buffers)[metadata->buffer()]; + auto *array = buffer->data(); + const uint32_t *metadata_buffer = + reinterpret_cast(array->data()); + const size_t nbr_tensors = static_cast(metadata_buffer[2]); + *offline_planner_offsets = + reinterpret_cast(&metadata_buffer[3]); + + if (tensor_count_ != nbr_tensors) { + TF_LITE_REPORT_ERROR(reporter_, + "Nbr of offline buffer offsets (%d) in metadata " + "not equal nbr tensors (%d)\n", + nbr_tensors, tensor_count_); + return kTfLiteError; + } + } + } + } + return kTfLiteOk; +} + +TfLiteStatus AllocationInfoBuilder::AddScratchBuffers( + internal::ScratchBufferRequest *scratch_buffer_requests, + ScratchBufferHandle *scratch_buffer_handles) +{ + // Set up allocation info for buffers. + for (size_t i = tensor_count_; i < tensor_count_ + buffer_count_; ++i) { + internal::ScratchBufferRequest *current_request = + &(scratch_buffer_requests[i - tensor_count_]); + ScratchBufferHandle *current_handle = + &(scratch_buffer_handles[i - tensor_count_]); + + AllocationInfo *current = &info_[i]; + current->output_ptr = reinterpret_cast(¤t_handle->data); + current->bytes = current_request->bytes; + current->first_created = current_request->node_idx; + current->last_used = current_request->node_idx; + current->offline_offset = kOnlinePlannedBuffer; + current->needs_allocating = true; + } + return kTfLiteOk; +} + +TfLiteStatus CreatePlan(ErrorReporter *error_reporter, + GreedyMemoryPlanner *planner, + const AllocationInfo *allocation_info, + size_t allocation_info_size) +{ + // Add the tensors to our allocation plan. + for (size_t i = 0; i < allocation_info_size; ++i) { + const AllocationInfo *current = &allocation_info[i]; + if (current->needs_allocating) { + size_t aligned_bytes_required = + AlignSizeUp(current->bytes, kBufferAlignment); + if (current->offline_offset == kOnlinePlannedBuffer) { + TF_LITE_ENSURE_STATUS( + planner->AddBuffer(error_reporter, aligned_bytes_required, + current->first_created, current->last_used)); + } else { + TF_LITE_ENSURE_STATUS(planner->AddBuffer( + error_reporter, aligned_bytes_required, current->first_created, + current->last_used, current->offline_offset)); + } + } + } + return kTfLiteOk; +} + +TfLiteStatus CommitPlan(ErrorReporter *error_reporter, MemoryPlanner *planner, + uint8_t *starting_point, + const AllocationInfo *allocation_info, + size_t allocation_info_size) +{ + // Figure out the actual memory addresses for each buffer, based on the plan. + int planner_index = 0; + for (size_t i = 0; i < allocation_info_size; ++i) { + const AllocationInfo *current = &allocation_info[i]; + if (current->needs_allocating) { + int offset = -1; + TF_LITE_ENSURE_STATUS( + planner->GetOffsetForBuffer(error_reporter, planner_index, &offset)); + *current->output_ptr = reinterpret_cast(starting_point + offset); + ++planner_index; + } + } + return kTfLiteOk; +} +} // namespace + +namespace internal { + +// Handles architecture safe mapping of flatbuffer vectors to a TfLite*Array +// struct. Matching types are required (e.g. float and TfLiteFloatArray). +// Big-endian systems will always allocate dimension array data in the tail +// (persistent) section. +template +TfLiteStatus FlatBufferVectorToTfLiteTypeArray( + SimpleMemoryAllocator *allocator, ErrorReporter *error_reporter, + const flatbuffers::Vector *flatbuffer_array, + kTfLiteArrayType **result) +{ + TFLITE_DCHECK(error_reporter != nullptr); + TFLITE_DCHECK(flatbuffer_array != nullptr); + // TODO(b/159668691): Consider adding type assertion or breaking this function + // into multiple functions for each type. std::is_same is c++11 and has a + // special updated constructor in c++17 that requires a string argument. + if (FLATBUFFERS_LITTLEENDIAN) { + // On little-endian machines, TfLite*Array happens to have the same memory + // layout as flatbuffers:Vector, so we can + // reinterpret_cast the flatbuffer vector and avoid a copy and malloc. + *result = const_cast( + reinterpret_cast(flatbuffer_array)); + } else { + // Big-endian architecture can not use the same memory layout as + // flatbuffers::Vector. Allocate from the tail and + // copy values from the flatbuffer into the newly allocated chunk. + kTfLiteArrayType *array = + reinterpret_cast(allocator->AllocateFromTail( + TfLiteIntArrayGetSizeInBytes(flatbuffer_array->Length()), + alignof(kTfLiteArrayType))); + if (array == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter, + "Failed to allocate %d bytes of memory to copy an array.", + TfLiteIntArrayGetSizeInBytes(flatbuffer_array->Length())); + return kTfLiteError; + } + array->size = flatbuffer_array->Length(); + for (int i = 0; i < array->size; ++i) { + array->data[i] = flatbuffer_array->Get(i); + } + *result = array; + } + return kTfLiteOk; +} + +// Returns a pointer to any buffer associated with the flatbuffer tensor. Can +// return nullptr if no buffer is found. +void *GetFlatbufferTensorBuffer( + const tflite::Tensor &flatbuffer_tensor, + const flatbuffers::Vector > *buffers) +{ + // We need to figure out where the actual contents of this tensor are stored + // in memory. We'll check to see if there's a serialized buffer (pretty much + // the same as a constant op in TensorFlow) associated with this tensor first, + // and if there is update the runtime structure to point to its location in + // memory. + // First see if there's any buffer information in the serialized tensor. + // TODO(b/170379532): Add better unit tests to validate flatbuffer values. + void *out_buffer = nullptr; + if (auto *buffer = (*buffers)[flatbuffer_tensor.buffer()]) { + // If we've found a buffer, does it have any data? + if (auto *array = buffer->data()) { + // If it has any data, is the data size larger than zero? + if (array->size()) { + // We've found a buffer with valid data, so update the runtime tensor + // data structure to point to it. + out_buffer = const_cast(static_cast(array->data())); + } + } + // TODO(petewarden): It's not clear in what circumstances we could have a + // buffer in the serialized tensor, but it doesn't have any data in it. Is + // that a validly-generated file, and if so what does it mean, or is it an + // error condition? It would be good to tighten up the specification to make + // it less ambiguous. + } + return out_buffer; +} + +TfLiteStatus InitializeTfLiteTensorFromFlatbuffer( + SimpleMemoryAllocator *allocator, bool allocate_temp, + const tflite::Tensor &flatbuffer_tensor, + const flatbuffers::Vector > *buffers, + ErrorReporter *error_reporter, TfLiteTensor *result) +{ + TFLITE_DCHECK(result != nullptr); + + *result = {}; + // Make sure the serialized type is one we know how to deal with, and convert + // it from a flatbuffer enum into a constant used by the kernel C API. + TF_LITE_ENSURE_STATUS(ConvertTensorType(flatbuffer_tensor.type(), + &result->type, error_reporter)); + // Make sure we remember if the serialized tensor is designated as a variable. + result->is_variable = flatbuffer_tensor.is_variable(); + + result->data.data = GetFlatbufferTensorBuffer(flatbuffer_tensor, buffers); + + // TODO(petewarden): Some of these paths aren't getting enough testing + // coverage, so we should figure out some tests that exercise them. + if (result->data.data == nullptr) { + // The tensor contents haven't been set from a serialized buffer, so + // make a note that they will be allocated from memory. The actual + // allocation won't happen until later. + result->allocation_type = kTfLiteArenaRw; + } else { + // We set the data from a serialized buffer, so record tha. + result->allocation_type = kTfLiteMmapRo; + } + + // Figure out what the size in bytes of the buffer is and store it. + size_t type_size; + TF_LITE_ENSURE_STATUS(BytesRequiredForTensor( + flatbuffer_tensor, &result->bytes, &type_size, error_reporter)); + + if (flatbuffer_tensor.shape() == nullptr) { + // flatbuffer_tensor.shape() can return a nullptr in the case of a scalar + // tensor. + result->dims = const_cast(&kZeroLengthIntArray); + } else { + // TFLM doesn't allow reshaping the tensor which requires dynamic memory + // allocation so it is safe to drop the const qualifier. In the future, if + // we really want to update the tensor shape, we can always pass in a new + // TfLiteIntArray - especially we have to do so if the dimension is + TF_LITE_ENSURE_STATUS(FlatBufferVectorToTfLiteTypeArray( + allocator, error_reporter, flatbuffer_tensor.shape(), &(result->dims))); + } + + // Copy the quantization information from the serialized data. + const auto *src_quantization = flatbuffer_tensor.quantization(); + if (src_quantization && src_quantization->scale() && + (src_quantization->scale()->size() > 0) && + src_quantization->zero_point() && + (src_quantization->zero_point()->size() > 0)) { + // Always populate the TfLiteTensor.params field, even if there are + // per-channel quantization parameters. + result->params.scale = src_quantization->scale()->Get(0); + // Note that the zero_point field in the FlatBuffers schema is a 64-bit + // integer, but the zero_point field in the TfLiteQuantizationParams struct + // is a 32-bit integer. + result->params.zero_point = + static_cast(src_quantization->zero_point()->Get(0)); + + // Populate per-channel quantization params. + int channels = src_quantization->scale()->size(); + TfLiteAffineQuantization *quantization = + allocate_temp ? reinterpret_cast( + allocator->AllocateTemp(sizeof(TfLiteAffineQuantization), + alignof(TfLiteAffineQuantization))) : + reinterpret_cast( + allocator->AllocateFromTail( + sizeof(TfLiteAffineQuantization), + alignof(TfLiteAffineQuantization))); + if (quantization == nullptr) { + TF_LITE_REPORT_ERROR(error_reporter, + "Unable to allocate TfLiteAffineQuantization.\n"); + return kTfLiteError; + } + + // TODO(b/153688719): Reduce tail allocation by using a global zero-point + // buffer. This value can not be reused from the flatbuffer since the + // zero_point is stored as a int64_t. + quantization->zero_point = + allocate_temp ? reinterpret_cast(allocator->AllocateTemp( + TfLiteIntArrayGetSizeInBytes(channels), + alignof(TfLiteIntArray))) : + reinterpret_cast(allocator->AllocateFromTail( + TfLiteIntArrayGetSizeInBytes(channels), + alignof(TfLiteIntArray))); + if (quantization->zero_point == nullptr) { + TF_LITE_REPORT_ERROR(error_reporter, + "Unable to allocate quantization->zero_point.\n"); + return kTfLiteError; + } + + TF_LITE_ENSURE_STATUS(FlatBufferVectorToTfLiteTypeArray( + allocator, error_reporter, src_quantization->scale(), + &quantization->scale)); + + quantization->zero_point->size = channels; + int *zero_point_data = quantization->zero_point->data; + for (int i = 0; i < channels; i++) { + zero_point_data[i] = src_quantization->zero_point()->Get(i); + } + // TODO(rocky): Need to add a micro_allocator test case that fails when + // this is not copied: + quantization->quantized_dimension = src_quantization->quantized_dimension(); + + result->quantization = { kTfLiteAffineQuantization, quantization }; + } + return kTfLiteOk; +} + +TfLiteStatus InitializeTfLiteEvalTensorFromFlatbuffer( + SimpleMemoryAllocator *allocator, const tflite::Tensor &flatbuffer_tensor, + const flatbuffers::Vector > *buffers, + ErrorReporter *error_reporter, TfLiteEvalTensor *result) +{ + *result = {}; + // Make sure the serialized type is one we know how to deal with, and convert + // it from a flatbuffer enum into a constant used by the kernel C API. + TF_LITE_ENSURE_STATUS(ConvertTensorType(flatbuffer_tensor.type(), + &result->type, error_reporter)); + + result->data.data = GetFlatbufferTensorBuffer(flatbuffer_tensor, buffers); + + if (flatbuffer_tensor.shape() == nullptr) { + // flatbuffer_tensor.shape() can return a nullptr in the case of a scalar + // tensor. + result->dims = const_cast(&kZeroLengthIntArray); + } else { + TF_LITE_ENSURE_STATUS(FlatBufferVectorToTfLiteTypeArray( + allocator, error_reporter, flatbuffer_tensor.shape(), &(result->dims))); + } + return kTfLiteOk; +} + +} // namespace internal + +MicroAllocator::MicroAllocator(SimpleMemoryAllocator *memory_allocator, + ErrorReporter *error_reporter) + : memory_allocator_(memory_allocator), + error_reporter_(error_reporter), + model_is_allocating_(false) +{ +} + +MicroAllocator::~MicroAllocator() +{ +} + +MicroAllocator *MicroAllocator::Create(uint8_t *tensor_arena, size_t arena_size, + ErrorReporter *error_reporter) +{ + uint8_t *aligned_arena = AlignPointerUp(tensor_arena, kBufferAlignment); + size_t aligned_arena_size = tensor_arena + arena_size - aligned_arena; + return Create(SimpleMemoryAllocator::Create(error_reporter, aligned_arena, + aligned_arena_size), + error_reporter); +} + +MicroAllocator *MicroAllocator::Create(SimpleMemoryAllocator *memory_allocator, + ErrorReporter *error_reporter) +{ + TFLITE_DCHECK(memory_allocator != nullptr); + TFLITE_DCHECK(error_reporter != nullptr); + + uint8_t *allocator_buffer = memory_allocator->AllocateFromTail( + sizeof(MicroAllocator), alignof(MicroAllocator)); + MicroAllocator *allocator = + new (allocator_buffer) MicroAllocator(memory_allocator, error_reporter); + return allocator; +} + +SubgraphAllocations *MicroAllocator::StartModelAllocation(const Model *model) +{ + TFLITE_DCHECK(model != nullptr); + + if (model_is_allocating_) { + TF_LITE_REPORT_ERROR(error_reporter_, + "MicroAllocator: Model allocation started before " + "finishing previously allocated model"); + return nullptr; + } + + model_is_allocating_ = true; + + uint8_t *data_allocator_buffer = memory_allocator_->AllocateFromTail( + sizeof(MicroBuiltinDataAllocator), alignof(MicroBuiltinDataAllocator)); + builtin_data_allocator_ = + new (data_allocator_buffer) MicroBuiltinDataAllocator(memory_allocator_); + + if (InitScratchBufferData() != kTfLiteOk) { + return nullptr; + } + + // Allocate struct to store eval tensors, nodes and registrations. + SubgraphAllocations *output = reinterpret_cast( + memory_allocator_->AllocateFromTail( + sizeof(SubgraphAllocations) * model->subgraphs()->size(), + alignof(SubgraphAllocations))); + if (output == nullptr) { + MicroPrintf("Failed to allocate memory for model metadata."); + return nullptr; + } + + if (AllocateTfLiteEvalTensors(model, output) != kTfLiteOk || + AllocateNodeAndRegistrations(model, output) != kTfLiteOk) { + return nullptr; + } + return output; +} + +TfLiteStatus MicroAllocator::FinishModelAllocation( + const Model *model, SubgraphAllocations *subgraph_allocations, + ScratchBufferHandle **scratch_buffer_handles) +{ + if (!model_is_allocating_) { + TF_LITE_REPORT_ERROR(error_reporter_, + "MicroAllocator: Model allocation finished before " + "starting allocating model"); + return kTfLiteError; + } + + // TODO(b/187993197): Track scratch buffers for each subgraph. + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + const SubGraph *subgraph = model->subgraphs()->Get(subgraph_idx); + TFLITE_DCHECK(subgraph != nullptr); + + TF_LITE_ENSURE_STATUS(AllocateScratchBufferHandles( + scratch_buffer_handles, scratch_buffer_request_count_)); + TF_LITE_ENSURE_STATUS(CommitStaticMemoryPlan( + model, subgraph_allocations[subgraph_idx].tensors, + *scratch_buffer_handles, subgraph_idx)); + TF_LITE_ENSURE_STATUS(AllocateVariables( + subgraph, subgraph_allocations[subgraph_idx].tensors)); + } + model_is_allocating_ = false; + return kTfLiteOk; +} + +void *MicroAllocator::AllocatePersistentBuffer(size_t bytes) +{ + return memory_allocator_->AllocateFromTail(bytes, kBufferAlignment); +} + +TfLiteStatus MicroAllocator::RequestScratchBufferInArena(size_t bytes, + int subgraph_idx, + int *buffer_idx) +{ + // All scratch buffer requests are stored in the head section of the arena + // when a model is in the prepare phase. First align a scratch buffer request + // pointer to the start of the head: + internal::ScratchBufferRequest *requests = GetScratchBufferRequests(); + + // Count the number of requested scratch buffers for the current node: + size_t current_node_request_count = 0; + for (size_t i = 0; i < scratch_buffer_request_count_; ++i) { + if (requests[i].node_idx == kUnassignedScratchBufferRequestIndex) { + ++current_node_request_count; + } + } + + // First, ensure that the per-kernel request has not exceeded the limit: + if (current_node_request_count >= kMaxScratchBuffersPerOp) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Scratch buffer request exeeds limit per operator (%d)", + kMaxScratchBuffersPerOp); + return kTfLiteError; + } + + // Initialize and assign values for the request at the current index: + internal::ScratchBufferRequest *current_request = + &requests[scratch_buffer_request_count_]; + *current_request = {}; + // Assign -1 as a sentinel value that will be updated when the node finishes + // allocating: + current_request->bytes = bytes; + current_request->node_idx = kUnassignedScratchBufferRequestIndex; + + // Assign the current request index to the out-param: + *buffer_idx = scratch_buffer_request_count_; + + // Bump the request count to prepare for the next request: + ++scratch_buffer_request_count_; + return kTfLiteOk; +} + +TfLiteStatus MicroAllocator::FinishPrepareNodeAllocations(int node_id) +{ + // When a node has finished preparing, all temp allocations performed by the + // kernel should be cleaned up: + ResetTempAllocations(); + + // Find and update any new scratch buffer requests for the current node: + internal::ScratchBufferRequest *requests = GetScratchBufferRequests(); + + for (size_t i = 0; i < scratch_buffer_request_count_; ++i) { + // A request with a node_idx of -1 is a sentinel value used to indicate this + // was a new request for the current node. The allocator finally knows the + // node index at this point. Assign the value and update the list of new + // requests so the head section can be adjusted to allow for the next kernel + // to allocate at most kMaxScratchBuffersPerOp requests: + if (requests[i].node_idx == kUnassignedScratchBufferRequestIndex) { + requests[i].node_idx = node_id; + } + } + + // Ensure that the head is re-adjusted to allow for another at-most + // kMaxScratchBuffersPerOp scratch buffer requests in the next operator: + TF_LITE_ENSURE_STATUS(memory_allocator_->SetHeadBufferSize( + sizeof(internal::ScratchBufferRequest) * + (scratch_buffer_request_count_ + kMaxScratchBuffersPerOp), + alignof(internal::ScratchBufferRequest))); + + return kTfLiteOk; +} + +size_t MicroAllocator::used_bytes() const +{ + return memory_allocator_->GetUsedBytes(); +} + +TfLiteStatus MicroAllocator::AllocateNodeAndRegistrations( + const Model *model, SubgraphAllocations *subgraph_allocations) +{ + TFLITE_DCHECK(subgraph_allocations != nullptr); + + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + const SubGraph *subgraph = model->subgraphs()->Get(subgraph_idx); + TFLITE_DCHECK(subgraph != nullptr); + + // Initialize NodeAndRegistrations for the subgraph. + NodeAndRegistration *output = reinterpret_cast( + memory_allocator_->AllocateFromTail( + sizeof(NodeAndRegistration) * subgraph->operators()->size(), + alignof(NodeAndRegistration))); + if (output == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to allocate memory for node_and_registrations."); + return kTfLiteError; + } + subgraph_allocations[subgraph_idx].node_and_registrations = output; + } + return kTfLiteOk; +} +TfLiteTensor *MicroAllocator::AllocatePersistentTfLiteTensor( + const Model *model, const SubgraphAllocations *subgraph_allocations, + int tensor_index, int subgraph_index) +{ + const SubGraph *subgraph = model->subgraphs()->Get(subgraph_index); + TFLITE_DCHECK(subgraph != nullptr); + + // This value is allocated from persistent arena space. It is guaranteed to be + // around for the lifetime of the application. + TfLiteTensor *tensor = AllocatePersistentTfLiteTensorInternal(); + + // Populate any fields from the flatbuffer, since this TfLiteTensor struct is + // allocated in the persistent section of the arena, ensure that additional + // allocations also take place in that section of the arena. + if (PopulateTfLiteTensorFromFlatbuffer( + model, tensor, tensor_index, subgraph_index, + /*allocate_temp=*/false) != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed to populate a persistent TfLiteTensor struct " + "from flatbuffer data!"); + return nullptr; + } + + if (subgraph_allocations != nullptr) { + // Tensor buffers that are allocated at runtime (e.g. non-weight buffers) + // and not located in the flatbuffer are stored on the pre-allocated list of + // TfLiteEvalTensors structs. These structs are the source of truth, simply + // point the corresponding buffer to the new TfLiteTensor data value. + tensor->data.data = + subgraph_allocations[subgraph_index].tensors[tensor_index].data.data; + // TfLiteEvalTensor structs must also be the source of truth for the + // TfLiteTensor dims. + tensor->dims = + subgraph_allocations[subgraph_index].tensors[tensor_index].dims; + } + return tensor; +} + +TfLiteTensor *MicroAllocator::AllocateTempTfLiteTensor( + const Model *model, const SubgraphAllocations *subgraph_allocations, + int tensor_index, int subgraph_index) +{ + const SubGraph *subgraph = model->subgraphs()->Get(subgraph_index); + TFLITE_DCHECK(subgraph != nullptr); + + // This value is allocated from temporary arena space. It is guaranteed to be + // around for at least the scope of the calling function. Since this struct + // allocation takes place in temp space, no need to own or cleanup. + TfLiteTensor *tensor = + reinterpret_cast(memory_allocator_->AllocateTemp( + sizeof(TfLiteTensor), alignof(TfLiteTensor))); + + // Populate any fields from the flatbuffer, since this TfLiteTensor struct is + // allocated in the temp section of the arena, ensure that additional + // allocations also take place in that section of the arena. + if (PopulateTfLiteTensorFromFlatbuffer(model, tensor, tensor_index, + subgraph_index, + /*allocate_temp=*/true) != kTfLiteOk) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to populate a temp TfLiteTensor struct from flatbuffer data!"); + return nullptr; + } + + if (subgraph_allocations != nullptr) { + // Tensor buffers that are allocated at runtime (e.g. non-weight buffers) + // and not located in the flatbuffer are stored on the pre-allocated list of + // TfLiteEvalTensors structs. These structs are the source of truth, simply + // point the corresponding buffer to the new TfLiteTensor data value. + tensor->data.data = + subgraph_allocations[subgraph_index].tensors[tensor_index].data.data; + // TfLiteEvalTensor structs must also be the source of truth for the + // TfLiteTensor dims. + tensor->dims = + subgraph_allocations[subgraph_index].tensors[tensor_index].dims; + } + return tensor; +} + +void MicroAllocator::ResetTempAllocations() +{ + memory_allocator_->ResetTempAllocations(); +} + +TfLiteStatus MicroAllocator::AllocateTfLiteEvalTensors( + const Model *model, SubgraphAllocations *subgraph_allocations) +{ + TFLITE_DCHECK(subgraph_allocations != nullptr); + + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + const SubGraph *subgraph = model->subgraphs()->Get(subgraph_idx); + TFLITE_DCHECK(subgraph != nullptr); + + size_t alloc_count = subgraph->tensors()->size(); + TfLiteEvalTensor *tensors = + reinterpret_cast(memory_allocator_->AllocateFromTail( + sizeof(TfLiteEvalTensor) * alloc_count, alignof(TfLiteEvalTensor))); + if (tensors == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to allocate memory for context->eval_tensors, " + "%d bytes required", + sizeof(TfLiteEvalTensor) * alloc_count); + return kTfLiteError; + } + + for (size_t i = 0; i < alloc_count; ++i) { + TfLiteStatus status = internal::InitializeTfLiteEvalTensorFromFlatbuffer( + memory_allocator_, *subgraph->tensors()->Get(i), model->buffers(), + error_reporter_, &tensors[i]); + if (status != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter_, "Failed to initialize tensor %d", + i); + return kTfLiteError; + } + } + subgraph_allocations[subgraph_idx].tensors = tensors; + } + return kTfLiteOk; +} +TfLiteStatus MicroAllocator::AllocateVariables(const SubGraph *subgraph, + TfLiteEvalTensor *eval_tensors) +{ + for (size_t i = 0; i < subgraph->tensors()->size(); ++i) { + auto *tensor = subgraph->tensors()->Get(i); + if (tensor->is_variable()) { + size_t buffer_size; + TF_LITE_ENSURE_STATUS( + TfLiteEvalTensorByteLength(&eval_tensors[i], &buffer_size)); + + eval_tensors[i].data.data = + memory_allocator_->AllocateFromTail(buffer_size, kBufferAlignment); + + if (eval_tensors[i].data.data == nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed to allocate variable tensor of size %d", + buffer_size); + return kTfLiteError; + } + } + } + return kTfLiteOk; +} + +TfLiteTensor *MicroAllocator::AllocatePersistentTfLiteTensorInternal() +{ + return reinterpret_cast(memory_allocator_->AllocateFromTail( + sizeof(TfLiteTensor), alignof(TfLiteTensor))); +} + +TfLiteStatus MicroAllocator::PopulateTfLiteTensorFromFlatbuffer( + const Model *model, TfLiteTensor *tensor, int tensor_index, + int subgraph_idx, bool allocate_temp) +{ + // TODO(b/162311891): This method serves as a stub to ensure quantized + // allocations in the tail can be recorded. Once the interpreter has APIs for + // accessing buffers on TfLiteEvalTensor this method can be dropped. + return internal::InitializeTfLiteTensorFromFlatbuffer( + memory_allocator_, allocate_temp, + *model->subgraphs()->Get(subgraph_idx)->tensors()->Get(tensor_index), + model->buffers(), error_reporter_, tensor); +} + +ErrorReporter *MicroAllocator::error_reporter() const +{ + return error_reporter_; +} + +TfLiteStatus MicroAllocator::CommitStaticMemoryPlan( + const Model *model, TfLiteEvalTensor *eval_tensors, + ScratchBufferHandle *scratch_buffer_handles, int subgraph_idx) +{ + size_t head_usage = 0; + // Create static memory plan + // 1. Calculate AllocationInfo to know the lifetime of each tensor/buffer. + // 2. Add them into the planner (such as the GreedyMemoryPlanner). + // 3. Static memory planning using the planner. + // 4. Set tensor/buffer pointers based on the offsets from the previous step. + // + // Note that AllocationInfo is only needed for creating the plan. It will be + // allocated from the temp section and cleaned up at the bottom of this + // function. + + const SubGraph *subgraph = model->subgraphs()->Get(subgraph_idx); + size_t allocation_info_count = + subgraph->tensors()->size() + scratch_buffer_request_count_; + size_t bytes = sizeof(AllocationInfo) * allocation_info_count; + + // Allocate an array of AllocationInfo structs from the temp section. This + // struct will be used by AllocationInfoBuilder to find buffer usage. + AllocationInfo *allocation_info = reinterpret_cast( + memory_allocator_->AllocateTemp(bytes, alignof(AllocationInfo))); + if (allocation_info == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to allocate memory for allocation_info, %d bytes required", + bytes); + return kTfLiteError; + } + + // Use the AllocationInfoBuilder class to help determine where buffers are + // used in the subgraph. + AllocationInfoBuilder builder(allocation_info, subgraph->tensors()->size(), + scratch_buffer_request_count_, error_reporter_); + + const int32_t *offline_planner_offsets = nullptr; + TF_LITE_ENSURE_STATUS( + builder.GetOfflinePlannedOffsets(model, &offline_planner_offsets)); + TF_LITE_ENSURE_STATUS( + builder.AddTensors(subgraph, offline_planner_offsets, eval_tensors)); + + internal::ScratchBufferRequest *scratch_buffer_requests = + GetScratchBufferRequests(); + + TF_LITE_ENSURE_STATUS(builder.AddScratchBuffers(scratch_buffer_requests, + scratch_buffer_handles)); + + // Remaining arena size that memory planner can use for calculating offsets. + size_t remaining_arena_size = + memory_allocator_->GetAvailableMemory(kBufferAlignment); + uint8_t *planner_arena = + memory_allocator_->AllocateTemp(remaining_arena_size, kBufferAlignment); + TF_LITE_ENSURE(error_reporter_, planner_arena != nullptr); + GreedyMemoryPlanner planner(planner_arena, remaining_arena_size); + TF_LITE_ENSURE_STATUS(CreatePlan(error_reporter_, &planner, allocation_info, + allocation_info_count)); + + // Reset all temp allocations used above: + memory_allocator_->ResetTempAllocations(); + + size_t actual_available_arena_size = + memory_allocator_->GetAvailableMemory(kBufferAlignment); + + // Make sure we have enough arena size. + if (planner.GetMaximumMemorySize() > actual_available_arena_size) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Arena size is too small for all buffers. Needed %u but only " + "%u was available.", + planner.GetMaximumMemorySize(), actual_available_arena_size); + return kTfLiteError; + } + // Commit the plan. + TF_LITE_ENSURE_STATUS(CommitPlan(error_reporter_, &planner, + memory_allocator_->GetHeadBuffer(), + allocation_info, allocation_info_count)); +#ifdef TF_LITE_SHOW_MEMORY_USE + planner.PrintMemoryPlan(); +#endif + head_usage = planner.GetMaximumMemorySize(); + + // The head is used to store memory plans for one model at a time during the + // model preparation stage, and is re-purposed to store scratch buffer handles + // during model invocation. The head must be as large as the greater of the + // largest model memory plan's size and the total space required for all + // scratch buffer handles. + if (max_head_buffer_usage_ < head_usage) { + max_head_buffer_usage_ = head_usage; + } + + // The head is used for storing scratch buffer allocations before finalizing a + // memory plan in this function. Ensure that the head is set to the largest + // memory plan sent through the allocator: + TF_LITE_ENSURE_STATUS(memory_allocator_->SetHeadBufferSize( + max_head_buffer_usage_, kBufferAlignment)); + return kTfLiteOk; +} + +TfLiteStatus MicroAllocator::AllocateScratchBufferHandles( + ScratchBufferHandle **scratch_buffer_handles, size_t handle_count) +{ + TFLITE_DCHECK(scratch_buffer_handles != nullptr); + + if (scratch_buffer_request_count_ == 0) { + // No scratch buffer requests were requested during model allocation. + return kTfLiteOk; + } + + // Allocate a consecutive block of memory store the scratch buffer handles. + // This alignment ensures quick lookup during inference time for the model: + *scratch_buffer_handles = reinterpret_cast( + memory_allocator_->AllocateFromTail( + sizeof(ScratchBufferHandle) * handle_count, + alignof(ScratchBufferHandle))); + + return kTfLiteOk; +} + +TfLiteStatus MicroAllocator::InitScratchBufferData() +{ + // A model is preparing to allocate resources, ensure that scratch buffer + // request counter is cleared: + scratch_buffer_request_count_ = 0; + + // All requests will be stored in the head section. Each kernel is allowed at + // most kMaxScratchBuffersPerOp requests. Adjust the head to reserve at most + // that many requests to begin: + TF_LITE_ENSURE_STATUS(memory_allocator_->SetHeadBufferSize( + sizeof(internal::ScratchBufferRequest) * kMaxScratchBuffersPerOp, + alignof(internal::ScratchBufferRequest))); + + return kTfLiteOk; +} + +internal::ScratchBufferRequest *MicroAllocator::GetScratchBufferRequests() +{ + return reinterpret_cast( + AlignPointerUp(memory_allocator_->GetHeadBuffer(), + alignof(internal::ScratchBufferRequest))); +} + +TfLiteStatus MicroAllocator::FlatBufferVectorToTfLiteTypeArray( + const flatbuffers::Vector *flatbuffer_array, + TfLiteIntArray **result) +{ + return internal::FlatBufferVectorToTfLiteTypeArray( + memory_allocator_, error_reporter_, flatbuffer_array, result); +} + +BuiltinDataAllocator *MicroAllocator::GetBuiltinDataAllocator() +{ + return builtin_data_allocator_; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.h new file mode 100644 index 00000000..aa8ec1e1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator.h @@ -0,0 +1,288 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_ALLOCATOR_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_ALLOCATOR_H_ + +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/simple_memory_allocator.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +namespace internal { +// Sets up all of the data structure members for a TfLiteTensor based on the +// contents of a serialized tensor in the flatbuffer. +// TODO(b/162311891): Drop this method when the interpreter has an API for +// returning buffers on TfLiteEvalTensor. +TfLiteStatus InitializeTfLiteTensorFromFlatbuffer( + SimpleMemoryAllocator *allocator, bool allocate_temp, + const tflite::Tensor &flatbuffer_tensor, + const flatbuffers::Vector > *buffers, + ErrorReporter *error_reporter, TfLiteTensor *result); + +// Holds placeholder information for a scratch buffer request from a kernel. +// This struct is only used during the model prepare stage. Each request from a +// kernel is stored in the head section. During the prepare stage, the head +// section will at least hold kMaxScratchBuffersPerOp number of requests plus +// any requests from previous kernel requests. +// +// When the memory plan is finalized, these structs are no longer used in favor +// of a sequential, array of ScratchBufferHandle allocations in the tail +// section. These allocations are indexed by the request API defined in the +// TfLiteContext struct. +typedef struct { + // Number of bytes required by the buffer. The actual allocated size might be + // greater than `bytes` due to buffer alignment. + size_t bytes; + // Node where the buffer is allocated for. This provides useful information to + // determine the lifetime of the buffer. In AllocationInfo, this buffer will + // have `before` = node_idx and `after` = node_idx. + int node_idx; +} ScratchBufferRequest; + +} // namespace internal + +typedef struct { + TfLiteNode node; + const TfLiteRegistration *registration; +} NodeAndRegistration; + +// Holds a pointer to a buffer for a scratch buffer requested by a kernel during +// the model prepare stage. This struct is allocated in-place and allows for +// quick pointer-indexed lookup for speed during model inference. +typedef struct { + // Pointer to location of the scratch buffer: + uint8_t *data; +} ScratchBufferHandle; + +// Stores all per-subgraph allocations. This includes the node and registration +// array, tensor list and scratch buffer handles for each subgraph. +typedef struct { + NodeAndRegistration *node_and_registrations; + TfLiteEvalTensor *tensors; +} SubgraphAllocations; + +// Allocator responsible for allocating memory for all intermediate tensors +// necessary to invoke a model. +// +// The lifetime of the model, tensor arena and error reporter must be at +// least as long as that of the allocator object, since the allocator needs +// them to be accessible during its entire lifetime. +// +// The MicroAllocator simply plans out additional allocations that are required +// to standup a model for inference in TF Micro. This class currently relies on +// an additional allocator - SimpleMemoryAllocator - for all allocations from an +// arena. These allocations are divided into head (non-persistent) and tail +// (persistent) regions: +// +// Memory layout to help understand how it works +// This information could change in the future version. +// ************** .memory_allocator->GetBuffer() +// Tensors/Scratch buffers (head) +// ************** .head_watermark +// unused memory +// ************** .memory_allocator->GetBuffer() + ->GetMaxBufferSize() +// - ->GetDataSize() +// persistent area (tail) +// ************** .memory_allocator->GetBuffer() + ->GetMaxBufferSize() +class MicroAllocator { +public: + // Creates a MicroAllocator instance from a given tensor arena. This arena + // will be managed by the created instance. + // Note: Please use __declspec(align(16)) to make sure tensor_arena is 16 + // bytes aligned, otherwise some head room will be wasted. + // TODO(b/157615197): Cleanup constructor + factory usage. + static MicroAllocator *Create(uint8_t *tensor_arena, size_t arena_size, + ErrorReporter *error_reporter); + + // Creates a MicroAllocator instance using the provided SimpleMemoryAllocator + // intance. This allocator instance will use the SimpleMemoryAllocator + // instance to manage allocations internally. + static MicroAllocator *Create(SimpleMemoryAllocator *memory_allocator, + ErrorReporter *error_reporter); + + // Allocates internal resources required for model inference for each subgraph + // from the arena. + // + // This method will run through the flatbuffer data supplied in the model to + // properly allocate tensor, node, and op registration data. This method is + // expected to be followed with a call to FinishModelAllocation() Returns a + // pointer to an array of SubgraphAllocations (also stored in the tail of the + // arena) where each index corresponds to a different subgraph in the model. + // Return value is nullptr if the allocations failed. + SubgraphAllocations *StartModelAllocation(const Model *model); + + // Finish allocating internal resources required for model inference. + // + // -Plan the memory for activation tensors and scratch buffers. + // -Update eval tensors for each subgraph based on planned offsets. + // -Allocate scratch buffer handles array and update based on planned offsets. + // + // This method should be called after assigning model resources + // in StartModelAllocation(). The subgraph_allocations pointer should be the + // value passed into this class during StartModelAllocation(). Scratch buffer + // handles are stored in the out-param `scratch_buffer_handles` array which is + // allocated in this method. This value will be used in `GetScratchBuffer` + // call to retrieve scratch buffers. + TfLiteStatus FinishModelAllocation( + const Model *model, SubgraphAllocations *subgraph_allocations, + ScratchBufferHandle **scratch_buffer_handles); + + // Allocates a TfLiteTensor struct and populates the returned value with + // properties from the model flatbuffer. This struct is allocated from + // persistent arena memory is only guaranteed for the lifetime of the + // application. The eval_tensors pointer should be the value passed into this + // class during StartModelAllocation() and contains the source-of-truth for + // buffers. + virtual TfLiteTensor *AllocatePersistentTfLiteTensor( + const Model *model, const SubgraphAllocations *subgraph_allocations, + int tensor_index, int subgraph_index); + + // Allocates a TfLiteTensor struct and populates the returned value with + // properties from the model flatbuffer. This struct is allocated from + // temporary arena memory is only guaranteed until a call is made to + // ResetTempAllocations(). Subgraph_allocaitons contains the array of + // TfLiteEvalTensors. If the newly allocated temp at the specified subgraph + // and tensor index is already present int the TfLiteEvalTensor array, its + // data buffer will be re-used. + virtual TfLiteTensor *AllocateTempTfLiteTensor( + const Model *model, const SubgraphAllocations *subgraph_allocations, + int tensor_index, int subgraph_index); + + // Resets all temporary allocations. This method should be called after a + // chain of temp allocations (e.g. chain of TfLiteTensor objects via + // AllocateTfLiteTensor()). + virtual void ResetTempAllocations(); + + // Allocates persistent buffer which has the same life time as the allocator. + // The memory is immediately available and is allocated from the tail of the + // arena. + virtual void *AllocatePersistentBuffer(size_t bytes); + + // Register a scratch buffer of size `bytes` for Node with `node_id`. + // This method only requests a buffer with a given size to be used after a + // model has finished allocation via FinishModelAllocation(). All requested + // buffers will be accessible by the out-param in that method. + TfLiteStatus RequestScratchBufferInArena(size_t bytes, int subgraph_idx, + int *buffer_idx); + + // Finish allocating a specific NodeAndRegistration prepare block (kernel + // entry for a model) with a given node ID. This call ensures that any scratch + // buffer requests and temporary allocations are handled and ready for the + // next node prepare block. + TfLiteStatus FinishPrepareNodeAllocations(int node_id); + + // Returns the arena usage in bytes, only available after + // `FinishModelAllocation`. Otherwise, it will return 0. + size_t used_bytes() const; + + // Converts a flatbuffer int32_t array to a TfLiteIntArray, accounting for + // endiannes. + TfLiteStatus FlatBufferVectorToTfLiteTypeArray( + const flatbuffers::Vector *flatbuffer_array, + TfLiteIntArray **result); + + BuiltinDataAllocator *GetBuiltinDataAllocator(); + +protected: + MicroAllocator(SimpleMemoryAllocator *memory_allocator, + ErrorReporter *error_reporter); + virtual ~MicroAllocator(); + + // Allocates an array in the arena to hold pointers to the node and + // registration pointers required to represent the inference graph of the + // model. + virtual TfLiteStatus AllocateNodeAndRegistrations( + const Model *model, SubgraphAllocations *subgraph_allocations); + + // Allocates the list of persistent TfLiteEvalTensors that are used for the + // "eval" phase of model inference. These structs will be the source of truth + // for all tensor buffers. + virtual TfLiteStatus AllocateTfLiteEvalTensors( + const Model *model, SubgraphAllocations *subgraph_allocations); + // Allocates persistent tensor buffers for variable tensors in the subgraph. + virtual TfLiteStatus AllocateVariables(const SubGraph *subgraph, + TfLiteEvalTensor *eval_tensors); + + // Allocate and return a persistent TfLiteTensor. + // TODO(b/162311891): Drop this method when the interpreter has an API for + // accessing TfLiteEvalTensor structs. + virtual TfLiteTensor *AllocatePersistentTfLiteTensorInternal(); + + // Populates a TfLiteTensor struct with data from the model flatbuffer. Any + // quantization data is allocated from either the tail (persistent) or temp + // sections of the arena based on the allocation flag. + virtual TfLiteStatus PopulateTfLiteTensorFromFlatbuffer(const Model *model, + TfLiteTensor *tensor, + int tensor_index, + int subgraph_idx, + bool allocate_temp); + + ErrorReporter *error_reporter() const; + +private: + // Commits a memory plan for all non-persistent buffer allocations in the + // 'head' section of the memory arena. The eval_tensors pointer is the list of + // pre-allocated TfLiteEvalTensor structs that will point to the buffers that + // will be allocated into the head section in this function call. The + // scratch_buffer_handles pointer is the array of pre-allocated + // ScratchBufferHandle structs that will point to allocated buffers also in + // the head section. + virtual TfLiteStatus CommitStaticMemoryPlan( + const Model *model, TfLiteEvalTensor *eval_tensors, + ScratchBufferHandle *scratch_buffer_handles, int subgraph_idx); + + // Allocates an array of ScratchBufferHandle structs in the tail section for a + // given number of handles. + virtual TfLiteStatus AllocateScratchBufferHandles( + ScratchBufferHandle **scratch_buffer_handles, size_t handle_count); + + // Clears all internal scratch buffer request counts and resets the head to + // prepare for kernels to request scratch buffer data when a model is + // preparing. + TfLiteStatus InitScratchBufferData(); + + // Returns the pointer for the array of ScratchBufferRequest allocations in + // the head section. + internal::ScratchBufferRequest *GetScratchBufferRequests(); + + // A simple memory allocator that always allocate from the arena tail or head. + SimpleMemoryAllocator *memory_allocator_; + + // Allocator used to allocate persistent builtin data. + BuiltinDataAllocator *builtin_data_allocator_; + + ErrorReporter *error_reporter_; + bool model_is_allocating_; + + // Holds the number of ScratchBufferRequest instances stored in the head + // section when a model is allocating. + size_t scratch_buffer_request_count_ = 0; + + // Holds the byte length of the memory plan with the largest head usage. Used + // to ensure that multi-tenant allocations can share the head for buffers. + size_t max_head_buffer_usage_ = 0; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite +#endif // TENSORFLOW_LITE_MICRO_MICRO_ALLOCATOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator_test.cc new file mode 100644 index 00000000..4b90b93a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_allocator_test.cc @@ -0,0 +1,933 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_allocator.h" + +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/simple_memory_allocator.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/micro/testing/test_conv_model.h" + +namespace tflite { +namespace testing { +namespace { + +constexpr int kExpectedAlignment = 4; +constexpr int t0 = 0; +constexpr int t1 = 1; +constexpr int t2 = 2; +constexpr int t3 = 3; +constexpr int t4 = 4; +constexpr int t5 = 5; + +void VerifyMockTfLiteTensor(TfLiteTensor *tensor, bool is_variable = false) +{ + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, tensor->type); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(is_variable, tensor->is_variable); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), tensor->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, tensor->data.raw); + TF_LITE_MICRO_EXPECT_EQ(static_cast(0), + (reinterpret_cast(tensor->data.raw) % + kExpectedAlignment)); +} + +void VerifyMockWeightTfLiteTensor(TfLiteTensor *tensor) +{ + TF_LITE_MICRO_EXPECT_EQ(kTfLiteUInt8, tensor->type); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), tensor->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, tensor->data.raw); +} + +void VerifyMockTfLiteEvalTensor(TfLiteEvalTensor *tensor) +{ + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, tensor->type); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->data[0]); + size_t buffer_size; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::TfLiteEvalTensorByteLength(tensor, &buffer_size)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), buffer_size); + TF_LITE_MICRO_EXPECT_NE(nullptr, tensor->data.raw); + TF_LITE_MICRO_EXPECT_EQ(static_cast(0), + (reinterpret_cast(tensor->data.raw) % + kExpectedAlignment)); +} + +void VerifyMockWeightTfLiteEvalTensor(TfLiteEvalTensor *tensor) +{ + TF_LITE_MICRO_EXPECT_EQ(kTfLiteUInt8, tensor->type); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, tensor->dims->data[0]); + size_t buffer_size; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::TfLiteEvalTensorByteLength(tensor, &buffer_size)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), buffer_size); + TF_LITE_MICRO_EXPECT_NE(nullptr, tensor->data.raw); +} + +void VerifyMockTensor(const Model *model, MicroAllocator *allocator, + SubgraphAllocations *subgraph_allocations, int tensor_idx, + bool is_variable = false) +{ + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + VerifyMockTfLiteTensor( + allocator->AllocatePersistentTfLiteTensor(model, subgraph_allocations, + tensor_idx, subgraph_idx), + is_variable); + VerifyMockTfLiteEvalTensor( + &subgraph_allocations[subgraph_idx].tensors[tensor_idx]); + } +} + +void VerifyMockWeightTensor(const Model *model, MicroAllocator *allocator, + SubgraphAllocations *subgraph_allocations, + int tensor_idx) +{ + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + VerifyMockWeightTfLiteTensor(allocator->AllocatePersistentTfLiteTensor( + model, subgraph_allocations, tensor_idx, subgraph_idx)); + VerifyMockWeightTfLiteEvalTensor( + &subgraph_allocations[subgraph_idx].tensors[tensor_idx]); + } +} + +void EnsureUniqueVariableTensorBuffer(const Model *model, + TfLiteEvalTensor *eval_tensors, + const int variable_tensor_idx) +{ + for (size_t i = 0; i < GetModelTensorCount(model); i++) { + if (i != static_cast(variable_tensor_idx)) { + TF_LITE_MICRO_EXPECT_NE(eval_tensors[variable_tensor_idx].data.raw, + eval_tensors[i].data.raw); + } + } +} + +void VerifyRegistrationAndNodeAllocation( + SubgraphAllocations *subgraph_allocations, size_t count, + int num_subgraphs) +{ + for (int subgraph_idx = 0; subgraph_idx < num_subgraphs; subgraph_idx++) { + for (size_t i = 0; i < count; i++) { + TF_LITE_MICRO_EXPECT_NE(nullptr, &subgraph_allocations[subgraph_idx] + .node_and_registrations[i] + .registration); + } + } +} + +} // namespace +} // namespace testing +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestInitializeRuntimeTensor) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator *simple_allocator = + tflite::SimpleMemoryAllocator::Create(tflite::GetMicroErrorReporter(), + arena, arena_size); + + const tflite::Tensor *tensor = tflite::testing::Create1dFlatbufferTensor(100); + const flatbuffers::Vector > *buffers = + tflite::testing::CreateFlatbufferBuffers(); + + TfLiteTensor allocated_tensor; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::internal::InitializeTfLiteTensorFromFlatbuffer( + simple_allocator, /*allocate_temp=*/false, *tensor, buffers, + tflite::GetMicroErrorReporter(), &allocated_tensor)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, allocated_tensor.type); + TF_LITE_MICRO_EXPECT_EQ(1, allocated_tensor.dims->size); + TF_LITE_MICRO_EXPECT_EQ(100, allocated_tensor.dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(400), allocated_tensor.bytes); + TF_LITE_MICRO_EXPECT(nullptr == allocated_tensor.data.i32); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteArenaRw, allocated_tensor.allocation_type); + + simple_allocator->~SimpleMemoryAllocator(); +} + +// TODO(b/162311891): Drop this test when InitializeTfLiteTensorFromFlatbuffer() +// always allocates from temp (interpreter returns buffers from +// TfLiteEvalTensor): +TF_LITE_MICRO_TEST(TestInitializeTempRuntimeTensor) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator *simple_allocator = + tflite::SimpleMemoryAllocator::Create(tflite::GetMicroErrorReporter(), + arena, arena_size); + + const tflite::Tensor *tensor = tflite::testing::Create1dFlatbufferTensor(100); + const flatbuffers::Vector > *buffers = + tflite::testing::CreateFlatbufferBuffers(); + + TfLiteTensor allocated_temp_tensor; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::internal::InitializeTfLiteTensorFromFlatbuffer( + simple_allocator, /*allocate_temp=*/true, *tensor, buffers, + tflite::GetMicroErrorReporter(), &allocated_temp_tensor)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, allocated_temp_tensor.type); + TF_LITE_MICRO_EXPECT_EQ(1, allocated_temp_tensor.dims->size); + TF_LITE_MICRO_EXPECT_EQ(100, allocated_temp_tensor.dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(400), + allocated_temp_tensor.bytes); + TF_LITE_MICRO_EXPECT(nullptr == allocated_temp_tensor.data.i32); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteArenaRw, + allocated_temp_tensor.allocation_type); + + simple_allocator->~SimpleMemoryAllocator(); +} + +TF_LITE_MICRO_TEST(TestInitializeQuantizedTensor) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator *simple_allocator = + tflite::SimpleMemoryAllocator::Create(tflite::GetMicroErrorReporter(), + arena, arena_size); + + const tflite::Tensor *tensor = + tflite::testing::CreateQuantizedFlatbufferTensor(100); + const flatbuffers::Vector > *buffers = + tflite::testing::CreateFlatbufferBuffers(); + + TfLiteTensor allocated_tensor; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::internal::InitializeTfLiteTensorFromFlatbuffer( + simple_allocator, /*allocate_temp=*/false, *tensor, buffers, + tflite::GetMicroErrorReporter(), &allocated_tensor)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, allocated_tensor.type); + TF_LITE_MICRO_EXPECT_EQ(1, allocated_tensor.dims->size); + TF_LITE_MICRO_EXPECT_EQ(100, allocated_tensor.dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(400), allocated_tensor.bytes); + TF_LITE_MICRO_EXPECT(nullptr == allocated_tensor.data.i32); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteArenaRw, allocated_tensor.allocation_type); + + simple_allocator->~SimpleMemoryAllocator(); +} + +TF_LITE_MICRO_TEST(TestMissingQuantization) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator *simple_allocator = + tflite::SimpleMemoryAllocator::Create(tflite::GetMicroErrorReporter(), + arena, arena_size); + + const tflite::Tensor *tensor = + tflite::testing::CreateMissingQuantizationFlatbufferTensor(100); + const flatbuffers::Vector > *buffers = + tflite::testing::CreateFlatbufferBuffers(); + + TfLiteTensor allocated_tensor; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, + tflite::internal::InitializeTfLiteTensorFromFlatbuffer( + simple_allocator, /*allocate_temp=*/false, *tensor, buffers, + tflite::GetMicroErrorReporter(), &allocated_tensor)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, allocated_tensor.type); + TF_LITE_MICRO_EXPECT_EQ(1, allocated_tensor.dims->size); + TF_LITE_MICRO_EXPECT_EQ(100, allocated_tensor.dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(400), allocated_tensor.bytes); + TF_LITE_MICRO_EXPECT(nullptr == allocated_tensor.data.i32); +} + +TF_LITE_MICRO_TEST(TestFailsWhenModelStartsTwice) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT(nullptr != allocator); + TF_LITE_MICRO_EXPECT_NE(nullptr, allocator->StartModelAllocation(model)); + TF_LITE_MICRO_EXPECT(nullptr == allocator->StartModelAllocation(model)); +} + +TF_LITE_MICRO_TEST(TestFailsWithWrongSequence) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + tflite::SubgraphAllocations *subgraph_allocations = nullptr; + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(nullptr, allocator); + + // We can't finish allocation before it ever got started. + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteError, allocator->FinishModelAllocation( + model, subgraph_allocations, &scratch_buffer_handles)); + + // Start twice is not allowed. + TF_LITE_MICRO_EXPECT(nullptr != allocator->StartModelAllocation(model)); + TF_LITE_MICRO_EXPECT(nullptr == allocator->StartModelAllocation(model)); +} + +TF_LITE_MICRO_TEST(TestMockModelAllocation) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT(nullptr != allocator); + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + size_t model_tensor_size = tflite::testing::GetModelTensorCount(model); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), model_tensor_size); + + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 0); + tflite::testing::VerifyMockWeightTensor(model, allocator, + subgraph_allocations, 1); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 2); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 3); + + TfLiteEvalTensor *eval_tensors = subgraph_allocations[0].tensors; + TF_LITE_MICRO_EXPECT_NE(eval_tensors[1].data.raw, eval_tensors[0].data.raw); + TF_LITE_MICRO_EXPECT_NE(eval_tensors[2].data.raw, eval_tensors[0].data.raw); + TF_LITE_MICRO_EXPECT_NE(eval_tensors[1].data.raw, eval_tensors[2].data.raw); + TF_LITE_MICRO_EXPECT_NE(eval_tensors[3].data.raw, eval_tensors[0].data.raw); + TF_LITE_MICRO_EXPECT_NE(eval_tensors[3].data.raw, eval_tensors[1].data.raw); + TF_LITE_MICRO_EXPECT_NE(eval_tensors[3].data.raw, eval_tensors[2].data.raw); + TF_LITE_MICRO_EXPECT_LE(allocator->used_bytes(), 856 + 100); + + // SimpleMockModel has 2 operators: + tflite::testing::VerifyRegistrationAndNodeAllocation(subgraph_allocations, + /*count=*/2, + /*num_subgraphs=*/1); +} + +TF_LITE_MICRO_TEST(TestMultiTenantAllocation) +{ + // The `OpResolver` is shared among different models in this test for + // simplicity but in practice you could have different `OpResolver`. + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + // Create a shared allocator. + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(nullptr, allocator); + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + + // Allocate for model 1. We use ComplexMockModel here to cover the code path + // allocatig variables. + const tflite::Model *model1 = tflite::testing::GetComplexMockModel(); + tflite::SubgraphAllocations *subgraph_allocations1 = + allocator->StartModelAllocation(model1); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations1); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model1, subgraph_allocations1, + &scratch_buffer_handles)); + const size_t single_model_used_bytes = allocator->used_bytes(); + + // Allocate for model 2. + const tflite::Model *model2 = tflite::testing::GetComplexMockModel(); + tflite::SubgraphAllocations *subgraph_allocations2 = + allocator->StartModelAllocation(model2); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations2); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model2, subgraph_allocations2, + &scratch_buffer_handles)); + + // Allocation for two instances of the same model takes less memory as `head` + // of the arena is reused. + TF_LITE_MICRO_EXPECT_LE(allocator->used_bytes(), 2 * single_model_used_bytes); +} + +TF_LITE_MICRO_TEST(TestAllocationForModelsWithBranches) +{ + const tflite::Model *model = tflite::testing::GetSimpleModelWithBranch(); + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(nullptr, allocator); + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + // Check test_helpers.cc BuildSimpleModelWithBranch for model structure. + // t0 is the first tensor, so place it in offset 0. + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + // bytes = 2 * 2 * 3 * sizeof(float32) = 48, same for other tensors. + size_t buffer_size; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::TfLiteEvalTensorByteLength( + &subgraph_allocations[0].tensors[0], &buffer_size)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(48), buffer_size); + // t1 can't reuse any memory, as n0 requires both t0 and t1. + TF_LITE_MICRO_EXPECT_EQ( + 96, subgraph_allocations[0].tensors[1].data.uint8 - start); + // t2 can't reuse any memory, as n1 requires both t0 and t2. Also n2 requires + // both t1 and t2. + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[2].data.uint8 - start); + // t3 reuses the same memory from t0 as t0 is not an input to any node. + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[3].data.uint8 - start); + + // SimpleModelWithBranch has 3 operators: + tflite::testing::VerifyRegistrationAndNodeAllocation(subgraph_allocations, + /*count=*/3, + /*num_subgraphs=*/1); +} + +TF_LITE_MICRO_TEST(TestAllocationForComplexModelAllocation) +{ + const tflite::Model *model = tflite::testing::GetComplexMockModel(); + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + constexpr size_t arena_size = 2048; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT(nullptr != allocator); + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + size_t model_tensor_size = tflite::testing::GetModelTensorCount(model); + TF_LITE_MICRO_EXPECT_EQ(static_cast(10), model_tensor_size); + + // NOTE: Tensor indexes match the values in GetComplexMockModel(). + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 0); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 1, + /*is_variable=*/true); + tflite::testing::VerifyMockWeightTensor(model, allocator, + subgraph_allocations, 2); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 3); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 4, + /*is_variable=*/true); + tflite::testing::VerifyMockWeightTensor(model, allocator, + subgraph_allocations, 5); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 6); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 7, + /*is_variable=*/true); + tflite::testing::VerifyMockWeightTensor(model, allocator, + subgraph_allocations, 8); + tflite::testing::VerifyMockTensor(model, allocator, subgraph_allocations, 9); + + // // Ensure that variable tensors have unique address + tflite::testing::EnsureUniqueVariableTensorBuffer( + model, subgraph_allocations[0].tensors, 1); + tflite::testing::EnsureUniqueVariableTensorBuffer( + model, subgraph_allocations[0].tensors, 4); + tflite::testing::EnsureUniqueVariableTensorBuffer( + model, subgraph_allocations[0].tensors, 7); + + // ComplexMockModel has 3 operators: + tflite::testing::VerifyRegistrationAndNodeAllocation(subgraph_allocations, + /*count=*/3, + /*num_subgraphs=*/1); +} + +TF_LITE_MICRO_TEST(OfflinePlannerBranchesAllOnline) +{ + int version = 1; + int subgraph = 0; + constexpr int number_tensors = 4; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + const int32_t metadata_buffer[tflite::testing::kOfflinePlannerHeaderSize + + number_tensors] = { version, subgraph, + number_tensors, // header + // memory offsets: + -1, -1, -1, -1 }; + + // The structure is identical to the one in + // TestAllocationForModelsWithBranches + int number_connections = 3; + tflite::testing::NodeConnection node_list[3] = { { + { 0 }, // input + { 1 } // output + }, + { + { 0 }, // input + { 2 } // output + }, + { + { 1, 2 }, // input1, input2 + { 3 } // output + } }; + + const tflite::Model *model = tflite::testing::GetModelWithOfflinePlanning( + number_tensors, metadata_buffer, node_list, number_connections); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + // Since all of the tensors are online planned and the model structure is + // identical to that in TestAllocationForModelsWithBranches, + // the offsets be should identical to that test. + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + + size_t buffer_size; + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, tflite::TfLiteEvalTensorByteLength( + &subgraph_allocations[0].tensors[0], &buffer_size)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(48), buffer_size); + TF_LITE_MICRO_EXPECT_EQ( + 96, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[2].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[3].data.uint8 - start); +} + +TF_LITE_MICRO_TEST(OfflinePlannerBasic) +{ + constexpr int number_tensors = 4; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + const int32_t metadata_buffer[tflite::testing::kOfflinePlannerHeaderSize + + number_tensors] = { 1, 0, number_tensors, + /*t0=*/0, + /*t1=*/48, + /*t2=*/0, + /*t3=*/48 }; + constexpr int number_connections = 3; + tflite::testing::NodeConnection node_list[number_connections] = { + { /*input=*/{ tflite::testing::t0 }, + /*output=*/{ tflite::testing::t1 } }, + { /*input=*/{ tflite::testing::t1 }, + /*output=*/{ tflite::testing::t2 } }, + { /*input=*/{ tflite::testing::t2 }, + /*output=*/{ tflite::testing::t3 } } + }; + + const tflite::Model *model = tflite::testing::GetModelWithOfflinePlanning( + number_tensors, metadata_buffer, node_list, number_connections); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[2].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[3].data.uint8 - start); +} + +TF_LITE_MICRO_TEST(OfflinePlannerOverlappingAllocation) +{ + constexpr int number_tensors = 4; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + const int32_t metadata_buffer[tflite::testing::kOfflinePlannerHeaderSize + + number_tensors] = { /*version=*/1, + /*subgraph=*/0, + number_tensors, + /*t0=*/0, + /*t1=*/0, + /*t2=*/48, + /*t3=*/-1 }; + + int number_connections = 2; + tflite::testing::NodeConnection node_list[2] = { + { /*input, scratch=*/{ tflite::testing::t0, tflite::testing::t1 }, + /*output=*/{ tflite::testing::t2 } }, + { /*input=*/{ tflite::testing::t2 }, + /*output=*/{ tflite::testing::t3 } }, + }; + + const tflite::Model *model = tflite::testing::GetModelWithOfflinePlanning( + number_tensors, metadata_buffer, node_list, number_connections); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[2].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[3].data.uint8 - start); + // TF_LITE_MICRO_EXPECT_EQ(static_cast(48), context.tensors[0].bytes); +} + +TF_LITE_MICRO_TEST(OfflinePlannerOfflineOnline) +{ + constexpr int number_tensors = 5; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + const int32_t metadata_buffer[tflite::testing::kOfflinePlannerHeaderSize + + number_tensors] = { /*version=*/1, + /*subgraph=*/0, + number_tensors, + /*t0=*/0, + /*t1=*/48, + /*t2=*/-1, + /*t3=*/0, + /*t4=*/-1 }; + + constexpr int number_connections = 2; + tflite::testing::NodeConnection node_list[number_connections] = { + { + /*input, scratch=*/{ tflite::testing::t0, tflite::testing::t1 }, + /*output=*/{ tflite::testing::t2 }, + }, + { + /*input=*/{ tflite::testing::t2 }, + /*output1, output2=*/{ tflite::testing::t3, tflite::testing::t4 }, + }, + }; + + const tflite::Model *model = tflite::testing::GetModelWithOfflinePlanning( + number_tensors, metadata_buffer, node_list, number_connections); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 96, subgraph_allocations[0].tensors[2].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[4].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[3].data.uint8 - start); +} + +TF_LITE_MICRO_TEST(TestAllocatePersistentTfLiteTensor) +{ + const tflite::Model *model = tflite::GetModel(kTestConvModelData); + constexpr size_t arena_size = 1024 * 12; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(allocator, nullptr); + + TfLiteTensor *tensor1 = allocator->AllocatePersistentTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/1, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT_NE(tensor1, nullptr); + TF_LITE_MICRO_EXPECT_NE(tensor1->quantization.params, nullptr); + TF_LITE_MICRO_EXPECT_FALSE(tensor1->is_variable); + + TfLiteTensor *tensor2 = allocator->AllocatePersistentTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/2, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT_NE(tensor2, nullptr); + TF_LITE_MICRO_EXPECT_NE(tensor2->quantization.params, nullptr); + TF_LITE_MICRO_EXPECT_FALSE(tensor2->is_variable); + + // The address of tensor1 should be higher than the address of tensor2 since + // persistent allocations take place in the tail which grows downward. + TF_LITE_MICRO_EXPECT_GT(tensor1, tensor2); +} + +TF_LITE_MICRO_TEST(TestAllocateSingleTempTfLiteTensor) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(allocator, nullptr); + + TfLiteTensor *tensor1 = allocator->AllocateTempTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/1, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT_NE(tensor1, nullptr); +} + +TF_LITE_MICRO_TEST(TestAllocateChainOfTfLiteTensor) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(allocator, nullptr); + + TfLiteTensor *tensor1 = allocator->AllocateTempTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/1, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT_NE(tensor1, nullptr); + + TfLiteTensor *tensor2 = allocator->AllocateTempTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/2, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT_NE(tensor2, nullptr); + + // The address of tensor2 should be higher than the address of tensor1 + // (chained allocations): + TF_LITE_MICRO_EXPECT_GT(tensor2, tensor1); +} + +TF_LITE_MICRO_TEST(TestAllocateTfLiteTensorWithReset) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT(allocator != nullptr); + + TfLiteTensor *tensor1 = allocator->AllocateTempTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/1, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT(tensor1 != nullptr); + + allocator->ResetTempAllocations(); + + TfLiteTensor *tensor2 = allocator->AllocateTempTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, /*tensor_index=*/2, + /*subgraph_index=*/0); + TF_LITE_MICRO_EXPECT(tensor2 != nullptr); + + // The address of tensor2 should be equal than the address of tensor1 since + // allocations were not chained: + TF_LITE_MICRO_EXPECT(tensor2 == tensor1); +} + +TF_LITE_MICRO_TEST(TestOperatorInputsNotInSubgraphInputs) +{ + constexpr int number_tensors = 5; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + const int32_t metadata_buffer[tflite::testing::kOfflinePlannerHeaderSize + + number_tensors] = { /*version=*/1, + /*subgraph=*/0, + number_tensors, + /*t0=*/0, + /*t1=*/0, + /*t2=*/0, + /*t3=*/48, + /*t4=*/-1 }; + + constexpr int number_connections = 2; + tflite::testing::NodeConnection node_list[number_connections] = { + { // t0: input (actual input part of subgraph inputs as + // well as operator inputs) + // t1: scratch1 (only in operator inputs) + // t2: scratch2 (only in operator inputs) + { tflite::testing::t0, tflite::testing::t1, tflite::testing::t2 }, + /*t3: output=*/{ tflite::testing::t3 } }, + { /*t3: input=*/{ tflite::testing::t3 }, + /*t4: output=*/{ tflite::testing::t4 } }, + }; + + const tflite::Model *model = tflite::testing::GetModelWithOfflinePlanning( + number_tensors, metadata_buffer, node_list, number_connections, + /*Only first tensor (t0) is in subgraph input list=*/1); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[2].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[3].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[4].data.uint8 - start); +} + +TF_LITE_MICRO_TEST(TestTypicalFirstOpAndSecondOpWithScratchTensors) +{ + constexpr int number_tensors = 6; + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + const int32_t metadata_buffer[tflite::testing::kOfflinePlannerHeaderSize + + number_tensors] = { /*version=*/1, + /*subgraph=*/0, + number_tensors, + /*t0=*/0, + /*t1=*/0, + /*t2=*/0, + /*t3=*/0, + /*t4=*/48, + /*t5=*/-1 }; + + constexpr int number_connections = 3; + tflite::testing::NodeConnection node_list[number_connections] = { + { /*t0: input (subgraph and operator input)=*/{ tflite::testing::t0 }, + /*t1: output=*/{ tflite::testing::t1 } }, + { // t1: input + // t2: scratch1 (only in operator inputs) + // t3: scratch2 (only in operator inputs) + { tflite::testing::t1, tflite::testing::t2, tflite::testing::t3 }, + + /*t4: output=*/{ tflite::testing::t4 } }, + { /*t4: input=*/{ tflite::testing::t4 }, + /*t5: output=*/{ tflite::testing::t5 } }, + }; + + const tflite::Model *model = tflite::testing::GetModelWithOfflinePlanning( + number_tensors, metadata_buffer, node_list, number_connections, + /*Only first tensor (t0) is in subgraph input list=*/1); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + uint8_t *start = subgraph_allocations[0].tensors[0].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[0].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[2].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[3].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 48, subgraph_allocations[0].tensors[4].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[5].data.uint8 - start); +} + +TF_LITE_MICRO_TEST(TestModelWithUnusedTensors) +{ + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + const tflite::Model *model = tflite::testing::GetModelWithUnusedInputs(); + + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + constexpr size_t arena_size = 4096; + uint8_t arena[arena_size]; + tflite::MicroAllocator *allocator = tflite::MicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + + tflite::SubgraphAllocations *subgraph_allocations = + allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles)); + + // Unused input tensor should not occupy any space. + uint8_t *start = subgraph_allocations[0].tensors[2].data.uint8; + TF_LITE_MICRO_EXPECT_EQ( + 64, subgraph_allocations[0].tensors[0].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[1].data.uint8 - start); + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[2].data.uint8 - start); + // Unused tensor should not occupy any space. + TF_LITE_MICRO_EXPECT_EQ( + 0, subgraph_allocations[0].tensors[3].data.uint8 - start); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.cc new file mode 100644 index 00000000..eb1820f2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.cc @@ -0,0 +1,72 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_error_reporter.h" + +#include +#include +#include + +#if !defined(TF_LITE_STRIP_ERROR_STRINGS) +#include "tensorflow/lite/micro/debug_log.h" +#include "tensorflow/lite/micro/micro_string.h" +#endif + +namespace { +uint8_t micro_error_reporter_buffer[sizeof(tflite::MicroErrorReporter)]; +tflite::MicroErrorReporter *error_reporter_ = nullptr; + +void Log(const char *format, va_list args) +{ +#if !defined(TF_LITE_STRIP_ERROR_STRINGS) + // Only pulling in the implementation of this function for builds where we + // expect to make use of it to be extra cautious about not increasing the code + // size. + static constexpr int kMaxLogLen = 256; + char log_buffer[kMaxLogLen]; + MicroVsnprintf(log_buffer, kMaxLogLen, format, args); + DebugLog(log_buffer); + DebugLog("\r\n"); +#endif +} + +} // namespace + +#if !defined(TF_LITE_STRIP_ERROR_STRINGS) +void MicroPrintf(const char *format, ...) +{ + va_list args; + va_start(args, format); + Log(format, args); + va_end(args); +} +#endif + +namespace tflite { +ErrorReporter *GetMicroErrorReporter() +{ + if (error_reporter_ == nullptr) { + error_reporter_ = new (micro_error_reporter_buffer) MicroErrorReporter(); + } + return error_reporter_; +} + +int MicroErrorReporter::Report(const char *format, va_list args) +{ + Log(format, args); + return 0; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.h new file mode 100644 index 00000000..d30394bd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter.h @@ -0,0 +1,50 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_ERROR_REPORTER_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_ERROR_REPORTER_H_ + +#include + +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/micro/compatibility.h" + +#if !defined(TF_LITE_STRIP_ERROR_STRINGS) +// This function can be used independent of the MicroErrorReporter to get +// printf-like functionalitys and are common to all target platforms. +void MicroPrintf(const char *format, ...); +#else +// We use a #define to ensure that the strings are completely stripped, to +// prevent an unnecessary increase in the binary size. +#define MicroPrintf(format, ...) +#endif + +namespace tflite { +// Get a pointer to a singleton global error reporter. +ErrorReporter *GetMicroErrorReporter(); + +class MicroErrorReporter : public ErrorReporter { +public: + ~MicroErrorReporter() override + { + } + int Report(const char *format, va_list args) override; + +private: + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_ERROR_REPORTER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter_test.cc new file mode 100644 index 00000000..d21101cb --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_error_reporter_test.cc @@ -0,0 +1,29 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_error_reporter.h" + +int main(int argc, char **argv) +{ +#ifndef TF_LITE_STRIP_ERROR_STRINGS + tflite::MicroErrorReporter micro_error_reporter; + tflite::ErrorReporter *error_reporter = µ_error_reporter; + TF_LITE_REPORT_ERROR(error_reporter, "Number: %d", 42); + TF_LITE_REPORT_ERROR(error_reporter, "Badly-formed format string %"); + TF_LITE_REPORT_ERROR(error_reporter, + "Another % badly-formed %% format string"); + TF_LITE_REPORT_ERROR(error_reporter, "~~~%s~~~", "ALL TESTS PASSED"); +#endif // !defined(TF_LITE_STRIP_ERROR_STRINGS) +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_graph.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_graph.cc new file mode 100644 index 00000000..1a310fb4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_graph.cc @@ -0,0 +1,264 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_graph.h" + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +namespace { + +#ifndef TF_LITE_STRIP_ERROR_STRINGS +const char *OpNameFromRegistration(const TfLiteRegistration *registration) +{ + if (registration->builtin_code == BuiltinOperator_CUSTOM) { + return registration->custom_name; + } else { + return EnumNameBuiltinOperator(BuiltinOperator(registration->builtin_code)); + } +} +#endif // !defined(TF_LITE_STRIP_ERROR_STRINGS) + +} // namespace + +MicroGraph::MicroGraph(TfLiteContext *context, const Model *model, + MicroAllocator *allocator) + : context_(context), + model_(model), + allocator_(allocator), + current_subgraph_index_(0) +{ + if (model != nullptr) { + subgraphs_ = model->subgraphs(); + } +} + +MicroGraph::~MicroGraph() +{ +} + +TfLiteStatus MicroGraph::InitSubgraphs() +{ + int previous_subgraph_idx = current_subgraph_index_; + + for (size_t subgraph_idx = 0; subgraph_idx < subgraphs_->size(); + subgraph_idx++) { + current_subgraph_index_ = subgraph_idx; + + const SubGraph *subgraph = (*subgraphs_)[subgraph_idx]; + for (size_t i = 0; i < subgraph->operators()->size(); ++i) { + TfLiteNode *node = + &(subgraph_allocations_[subgraph_idx].node_and_registrations[i].node); + const TfLiteRegistration *registration = + subgraph_allocations_[subgraph_idx] + .node_and_registrations[i] + .registration; + size_t init_data_size; + const char *init_data; + if (registration->builtin_code == BuiltinOperator_CUSTOM) { + init_data = reinterpret_cast(node->custom_initial_data); + init_data_size = node->custom_initial_data_size; + } else { + init_data = reinterpret_cast(node->builtin_data); + init_data_size = 0; + } + if (registration->init) { + node->user_data = + registration->init(context_, init_data, init_data_size); + } + } + } + current_subgraph_index_ = previous_subgraph_idx; + + return kTfLiteOk; +} + +TfLiteStatus MicroGraph::PrepareSubgraphs() +{ + int previous_subgraph_idx = current_subgraph_index_; + + for (size_t subgraph_idx = 0; subgraph_idx < subgraphs_->size(); + subgraph_idx++) { + current_subgraph_index_ = subgraph_idx; + + const SubGraph *subgraph = (*subgraphs_)[subgraph_idx]; + for (size_t i = 0; i < subgraph->operators()->size(); ++i) { + TfLiteNode *node = + &(subgraph_allocations_[subgraph_idx].node_and_registrations[i].node); + const TfLiteRegistration *registration = + subgraph_allocations_[subgraph_idx] + .node_and_registrations[i] + .registration; + if (registration->prepare != nullptr) { + TfLiteStatus prepare_status = registration->prepare(context_, node); + if (prepare_status != kTfLiteOk) { + MicroPrintf("Node %s (number %df) failed to prepare with status %d", + OpNameFromRegistration(registration), i, prepare_status); + return kTfLiteError; + } + } + allocator_->FinishPrepareNodeAllocations(/*node_id=*/i); + } + } + current_subgraph_index_ = previous_subgraph_idx; + + return kTfLiteOk; +} + +TfLiteStatus MicroGraph::FreeSubgraphs() +{ + int previous_subgraph_idx = current_subgraph_index_; + + for (size_t subgraph_idx = 0; subgraph_idx < subgraphs_->size(); + subgraph_idx++) { + current_subgraph_index_ = subgraph_idx; + const SubGraph *subgraph = (*subgraphs_)[subgraph_idx]; + for (size_t i = 0; i < subgraph->operators()->size(); ++i) { + TfLiteNode *node = + &(subgraph_allocations_[subgraph_idx].node_and_registrations[i].node); + const TfLiteRegistration *registration = + subgraph_allocations_[subgraph_idx] + .node_and_registrations[i] + .registration; + // registration is allocated outside the interpreter, so double check to + // make sure it's not nullptr; + if (registration != nullptr && registration->free != nullptr) { + registration->free(context_, node->user_data); + } + } + } + current_subgraph_index_ = previous_subgraph_idx; + + return kTfLiteOk; +} + +TfLiteStatus MicroGraph::InvokeSubgraph(int subgraph_idx) +{ + int previous_subgraph_idx = current_subgraph_index_; + current_subgraph_index_ = subgraph_idx; + + if (static_cast(subgraph_idx) >= subgraphs_->size()) { + MicroPrintf("Accessing subgraph %d but only %d subgraphs found", + subgraph_idx, subgraphs_->size()); + return kTfLiteError; + } + const SubGraph *subgraph = (*subgraphs_)[subgraph_idx]; + + for (size_t i = 0; i < subgraph->operators()->size(); ++i) { + TfLiteNode *node = + &(subgraph_allocations_[subgraph_idx].node_and_registrations[i].node); + const TfLiteRegistration *registration = subgraph_allocations_[subgraph_idx] + .node_and_registrations[i] + .registration; + +// This ifdef is needed (even though ScopedMicroProfiler itself is a no-op with +// -DTF_LITE_STRIP_ERROR_STRINGS) because the function OpNameFromRegistration is +// only defined for builds with the error strings. +#if !defined(TF_LITE_STRIP_ERROR_STRINGS) + ScopedMicroProfiler scoped_profiler( + OpNameFromRegistration(registration), + reinterpret_cast(context_->profiler)); +#endif + + TFLITE_DCHECK(registration->invoke); + TfLiteStatus invoke_status = registration->invoke(context_, node); + + // All TfLiteTensor structs used in the kernel are allocated from temp + // memory in the allocator. This creates a chain of allocations in the + // temp section. The call below resets the chain of allocations to + // prepare for the next call. + allocator_->ResetTempAllocations(); + + if (invoke_status == kTfLiteError) { + MicroPrintf("Node %s (number %d) failed to invoke with status %d", + OpNameFromRegistration(registration), i, invoke_status); + return kTfLiteError; + } else if (invoke_status != kTfLiteOk) { + return invoke_status; + } + } + current_subgraph_index_ = previous_subgraph_idx; + return kTfLiteOk; +} + +TfLiteStatus MicroGraph::ResetVariableTensors() +{ + for (size_t subgraph_idx = 0; subgraph_idx < subgraphs_->size(); + subgraph_idx++) { + const SubGraph *subgraph = (*subgraphs_)[subgraph_idx]; + for (size_t i = 0; i < subgraph->tensors()->size(); ++i) { + auto *tensor = subgraph->tensors()->Get(i); + if (tensor->is_variable()) { + size_t buffer_size; + TF_LITE_ENSURE_STATUS(TfLiteEvalTensorByteLength( + &subgraph_allocations_[subgraph_idx].tensors[i], &buffer_size)); + + int value = 0; + if (tensor->type() == tflite::TensorType_INT8) { + value = tensor->quantization()->zero_point()->Get(0); + } + memset(subgraph_allocations_[subgraph_idx].tensors[i].data.raw, value, + buffer_size); + } + } + } + + return kTfLiteOk; +} + +int MicroGraph::NumSubgraphs() +{ + return model_->subgraphs()->size(); +} + +void MicroGraph::SetSubgraphAllocations( + SubgraphAllocations *subgraph_allocations) +{ + subgraph_allocations_ = subgraph_allocations; +} + +size_t MicroGraph::NumSubgraphInputs(int subgraph_idx) +{ + return model_->subgraphs()->Get(subgraph_idx)->inputs()->size(); +} + +TfLiteEvalTensor *MicroGraph::GetSubgraphInput(int subgraph_idx, + int input_idx) +{ + int tensor_idx = + model_->subgraphs()->Get(subgraph_idx)->inputs()->Get(input_idx); + return &subgraph_allocations_[subgraph_idx].tensors[tensor_idx]; +} + +size_t MicroGraph::NumSubgraphOutputs(int subgraph_idx) +{ + return model_->subgraphs()->Get(subgraph_idx)->outputs()->size(); +} + +TfLiteEvalTensor *MicroGraph::GetSubgraphOutput(int subgraph_idx, + int output_idx) +{ + int tensor_idx = + model_->subgraphs()->Get(subgraph_idx)->outputs()->Get(output_idx); + return &subgraph_allocations_[subgraph_idx].tensors[tensor_idx]; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_graph.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_graph.h new file mode 100644 index 00000000..23e1dc7e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_graph.h @@ -0,0 +1,102 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MICRO_GRAPH_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_GRAPH_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +// Abstracts the details of interacting with the tflite::Model. +// +// Provides methods to access, initialize, prepare, invoke and free any +// subgraph in the tflite::Graph. +class MicroGraph { +public: + // The lifetime of the context, model, and allocator must be at least as long + // as that of the graph object, since the this class may need to access them + // at any time. + MicroGraph(TfLiteContext *context, const Model *model, + MicroAllocator *allocator); + virtual ~MicroGraph(); + + // Sets up builtin data and calls TfLiteRegistration->Init for every operator + // in every subgraph in the model. + virtual TfLiteStatus InitSubgraphs(); + + // Calls TfLiteRegistration->Prepare for every operator in every subgraph in + // the model. + virtual TfLiteStatus PrepareSubgraphs(); + + // Calls TfLiteRegistration->Free for every operator in every subgraph in the + // model. + virtual TfLiteStatus FreeSubgraphs(); + + // Calls TfLiteRegistration->Invoke for every operator in a single subgraph in + // the model. + virtual TfLiteStatus InvokeSubgraph(int subgraph_idx); + + // Zeros out all variable tensors in all subgraphs in the model. + virtual TfLiteStatus ResetVariableTensors(); + + // Number of tensor inputs to a specified subgraph in the model. + virtual size_t NumSubgraphInputs(int subgraph_idx); + + // Get the specified input tensor of a specified subgraph in the model. + virtual TfLiteEvalTensor *GetSubgraphInput(int subgraph_idx, int input_idx); + + // Number of tensor outputs to a specified subgraph in the model. + virtual size_t NumSubgraphOutputs(int subgraph_idx); + + // Get the specified output tensor of a specified subgraph in the model. + virtual TfLiteEvalTensor *GetSubgraphOutput(int subgraph_idx, int output_idx); + + // Number of subgraphs in the model. + virtual int NumSubgraphs(); + + // Hook to pass in subgraph allocations tracked within the interpreter, + // allowing MicroGraph to init / prepare / invoke subgraphs in the model. + void SetSubgraphAllocations(SubgraphAllocations *subgraph_allocations); + + // Get the current subgraph index. Within an on operator, this is guaranteed + // to be the subgraph of that operator. + int GetCurrentSubgraphIndex() + { + return current_subgraph_index_; + } + + // Gets the list of alloctions for each subgraph. This is the source of truth + // for all per-subgraph allocation data. + SubgraphAllocations *GetAllocations() + { + return subgraph_allocations_; + } + +private: + TfLiteContext *context_; + const Model *model_; + MicroAllocator *allocator_; + SubgraphAllocations *subgraph_allocations_ = nullptr; + int current_subgraph_index_; + const flatbuffers::Vector > *subgraphs_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_GRAPH_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.cc new file mode 100644 index 00000000..f8aa45a4 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.cc @@ -0,0 +1,390 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/micro/micro_interpreter.h" + +#include +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/core/api/tensor_utils.h" +#include "tensorflow/lite/micro/memory_helpers.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_op_resolver.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/schema/schema_generated.h" +#include "tensorflow/lite/schema/schema_utils.h" + +namespace tflite { + +MicroInterpreter::MicroInterpreter(const Model *model, + const MicroOpResolver &op_resolver, + uint8_t *tensor_arena, + size_t tensor_arena_size, + ErrorReporter *error_reporter, + MicroProfiler *profiler) + : model_(model), + op_resolver_(op_resolver), + error_reporter_(error_reporter), + allocator_(*MicroAllocator::Create(tensor_arena, tensor_arena_size, + error_reporter)), + + graph_(&context_, model, &allocator_), + tensors_allocated_(false), + initialization_status_(kTfLiteError), + input_tensors_(nullptr), + output_tensors_(nullptr) +{ + Init(profiler); +} + +MicroInterpreter::MicroInterpreter(const Model *model, + const MicroOpResolver &op_resolver, + MicroAllocator *allocator, + ErrorReporter *error_reporter, + MicroProfiler *profiler) + : model_(model), + op_resolver_(op_resolver), + error_reporter_(error_reporter), + allocator_(*allocator), + graph_(&context_, model, allocator), + tensors_allocated_(false), + initialization_status_(kTfLiteError), + input_tensors_(nullptr), + output_tensors_(nullptr) +{ + Init(profiler); +} + +MicroInterpreter::~MicroInterpreter() +{ + if (graph_.GetAllocations() != nullptr) { + graph_.FreeSubgraphs(); + } +} + +void MicroInterpreter::Init(MicroProfiler *profiler) +{ + context_.impl_ = static_cast(this); + context_.ReportError = ReportOpError; + context_.GetTensor = GetTensor; + context_.ReportError = ReportOpError; + context_.GetTensor = GetTensor; + context_.GetEvalTensor = GetEvalTensor; + context_.profiler = profiler; + + initialization_status_ = kTfLiteOk; +} + +TfLiteStatus MicroInterpreter::PrepareNodeAndRegistrationDataFromFlatbuffer() +{ + for (int subgraph_idx = 0; subgraph_idx < graph_.NumSubgraphs(); + subgraph_idx++) { + const SubGraph *subgraph = model_->subgraphs()->Get(subgraph_idx); + TFLITE_DCHECK(subgraph != nullptr); + + auto *opcodes = model_->operator_codes(); + BuiltinDataAllocator *builtin_data_allocator = + allocator_.GetBuiltinDataAllocator(); + for (size_t i = 0; i < subgraph->operators()->size(); ++i) { + const auto *op = subgraph->operators()->Get(i); + const size_t index = op->opcode_index(); + if (index >= opcodes->size()) { + MicroPrintf("Missing registration for opcode_index %d\n", index); + return kTfLiteError; + } + const auto *opcode = opcodes->Get(index); + TfLiteStatus status = + GetRegistrationFromOpCode(opcode, op_resolver_, error_reporter_, + &(graph_.GetAllocations()[subgraph_idx] + .node_and_registrations[i] + .registration)); + if (status != kTfLiteOk) { + MicroPrintf("Failed to get registration from op code %s\n ", + EnumNameBuiltinOperator(GetBuiltinCode(opcode))); + return status; + } + const auto *registration = graph_.GetAllocations()[subgraph_idx] + .node_and_registrations[i] + .registration; + if (registration == nullptr) { + MicroPrintf("Skipping op for opcode_index %d\n", index); + return kTfLiteError; + } + BuiltinOperator op_type = + static_cast(registration->builtin_code); + + const char *custom_data = nullptr; + size_t custom_data_size = 0; + unsigned char *builtin_data = nullptr; + + if (op_type == BuiltinOperator_CUSTOM) { + // Custom Ops may or may not have a non-null custom_options field. + if (op->custom_options() != nullptr) { + custom_data = + reinterpret_cast(op->custom_options()->data()); + custom_data_size = op->custom_options()->size(); + } + } else { + if (op->custom_options() != nullptr) { + MicroPrintf( + "Unsupported behavior: found builtin operator %s with custom " + "options.\n", + EnumNameBuiltinOperator(op_type)); + return kTfLiteError; + } + + MicroOpResolver::BuiltinParseFunction parser = + op_resolver_.GetOpDataParser(op_type); + if (parser == nullptr) { + MicroPrintf("Did not find a parser for %s", + EnumNameBuiltinOperator(op_type)); + + return kTfLiteError; + } + TF_LITE_ENSURE_STATUS(parser(op, error_reporter_, + builtin_data_allocator, + (void **)(&builtin_data))); + } + + TfLiteIntArray *inputs_array; + TF_LITE_ENSURE_STATUS(allocator_.FlatBufferVectorToTfLiteTypeArray( + op->inputs(), &inputs_array)); + + TfLiteIntArray *outputs_array; + TF_LITE_ENSURE_STATUS(allocator_.FlatBufferVectorToTfLiteTypeArray( + op->outputs(), &outputs_array)); + + TfLiteNode *node = &( + graph_.GetAllocations()[subgraph_idx].node_and_registrations[i].node); + *node = {}; + node->inputs = inputs_array; + node->outputs = outputs_array; + node->builtin_data = reinterpret_cast(builtin_data); + node->custom_initial_data = custom_data; + node->custom_initial_data_size = custom_data_size; + } + } + return kTfLiteOk; +} + +TfLiteStatus MicroInterpreter::AllocateTensors() +{ + SubgraphAllocations *allocations = allocator_.StartModelAllocation(model_); + + if (allocations == nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed starting model allocation.\n"); + initialization_status_ = kTfLiteError; + return kTfLiteError; + } + + graph_.SetSubgraphAllocations(allocations); + + TF_LITE_ENSURE_STATUS(PrepareNodeAndRegistrationDataFromFlatbuffer()); + + // Only allow AllocatePersistentBuffer in Init stage. + context_.AllocatePersistentBuffer = AllocatePersistentBuffer; + context_.RequestScratchBufferInArena = nullptr; + context_.GetScratchBuffer = nullptr; + context_.GetExecutionPlan = GetGraph; + graph_.InitSubgraphs(); + + // Both AllocatePersistentBuffer and RequestScratchBufferInArena is + // available in Prepare stage. + context_.RequestScratchBufferInArena = RequestScratchBufferInArena; + graph_.PrepareSubgraphs(); + + // Prepare is done, we're ready for Invoke. Memory allocation is no longer + // allowed. Kernels can only fetch scratch buffers via GetScratchBuffer. + context_.AllocatePersistentBuffer = nullptr; + context_.RequestScratchBufferInArena = nullptr; + context_.GetScratchBuffer = GetScratchBuffer; + + TF_LITE_ENSURE_OK(&context_, allocator_.FinishModelAllocation( + model_, graph_.GetAllocations(), + &scratch_buffer_handles_)); + + // TODO(b/162311891): Drop these allocations when the interpreter supports + // handling buffers from TfLiteEvalTensor. + input_tensors_ = + reinterpret_cast(allocator_.AllocatePersistentBuffer( + sizeof(TfLiteTensor *) * inputs_size())); + if (input_tensors_ == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to allocate memory for context->input_tensors_, " + "%d bytes required", + sizeof(TfLiteTensor *) * inputs_size()); + return kTfLiteError; + } + + for (size_t i = 0; i < inputs_size(); ++i) { + input_tensors_[i] = allocator_.AllocatePersistentTfLiteTensor( + model_, graph_.GetAllocations(), inputs().Get(i), 0); + if (input_tensors_[i] == nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed to initialize input tensor %d", i); + return kTfLiteError; + } + } + + // TODO(b/162311891): Drop these allocations when the interpreter supports + // handling buffers from TfLiteEvalTensor. + output_tensors_ = + reinterpret_cast(allocator_.AllocatePersistentBuffer( + sizeof(TfLiteTensor *) * outputs_size())); + if (output_tensors_ == nullptr) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to allocate memory for context->output_tensors_, " + "%d bytes required", + sizeof(TfLiteTensor *) * outputs_size()); + return kTfLiteError; + } + + for (size_t i = 0; i < outputs_size(); ++i) { + output_tensors_[i] = allocator_.AllocatePersistentTfLiteTensor( + model_, graph_.GetAllocations(), outputs().Get(i), 0); + if (output_tensors_[i] == nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed to initialize output tensor %d", i); + return kTfLiteError; + } + } + + TF_LITE_ENSURE_STATUS(ResetVariableTensors()); + + tensors_allocated_ = true; + return kTfLiteOk; +} + +TfLiteStatus MicroInterpreter::Invoke() +{ + if (initialization_status_ != kTfLiteOk) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Invoke() called after initialization failed\n"); + return kTfLiteError; + } + + // Ensure tensors are allocated before the interpreter is invoked to avoid + // difficult to debug segfaults. + if (!tensors_allocated_) { + TF_LITE_ENSURE_OK(&context_, AllocateTensors()); + } + return graph_.InvokeSubgraph(0); +} + +TfLiteTensor *MicroInterpreter::input(size_t index) +{ + const size_t length = inputs_size(); + if (index >= length) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Input index %d out of range (length is %d)", index, + length); + return nullptr; + } + return input_tensors_[index]; +} + +TfLiteTensor *MicroInterpreter::output(size_t index) +{ + const size_t length = outputs_size(); + if (index >= length) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Output index %d out of range (length is %d)", index, + length); + return nullptr; + } + return output_tensors_[index]; +} + +TfLiteStatus MicroInterpreter::ResetVariableTensors() +{ + return graph_.ResetVariableTensors(); +} + +void *MicroInterpreter::AllocatePersistentBuffer(TfLiteContext *ctx, + size_t bytes) +{ + return reinterpret_cast(ctx->impl_) + ->allocator_.AllocatePersistentBuffer(bytes); +} + +TfLiteStatus MicroInterpreter::RequestScratchBufferInArena(TfLiteContext *ctx, + size_t bytes, + int *buffer_idx) +{ + MicroInterpreter *interpreter = + reinterpret_cast(ctx->impl_); + return interpreter->allocator_.RequestScratchBufferInArena( + bytes, interpreter->graph_.GetCurrentSubgraphIndex(), buffer_idx); +} + +void *MicroInterpreter::GetScratchBuffer(TfLiteContext *ctx, int buffer_idx) +{ + MicroInterpreter *interpreter = + reinterpret_cast(ctx->impl_); + ScratchBufferHandle *handle = + interpreter->scratch_buffer_handles_ + buffer_idx; + return handle->data; +} + +void MicroInterpreter::ReportOpError(struct TfLiteContext *context, + const char *format, ...) +{ +#ifndef TF_LITE_STRIP_ERROR_STRINGS + MicroInterpreter *interpreter = + static_cast(context->impl_); + va_list args; + va_start(args, format); + TF_LITE_REPORT_ERROR(interpreter->error_reporter_, format, args); + va_end(args); +#endif +} + +TfLiteTensor *MicroInterpreter::GetTensor(const struct TfLiteContext *context, + int tensor_idx) +{ + MicroInterpreter *interpreter = + static_cast(context->impl_); + return interpreter->allocator_.AllocateTempTfLiteTensor( + interpreter->model_, interpreter->graph_.GetAllocations(), tensor_idx, + interpreter->get_subgraph_index()); +} + +TfLiteEvalTensor *MicroInterpreter::GetEvalTensor( + const struct TfLiteContext *context, int tensor_idx) +{ + MicroInterpreter *interpreter = + reinterpret_cast(context->impl_); + return &interpreter->graph_ + .GetAllocations()[interpreter->get_subgraph_index()] + .tensors[tensor_idx]; +} + +TfLiteStatus MicroInterpreter::GetGraph(struct TfLiteContext *context, + TfLiteIntArray **args) +{ + MicroInterpreter *interpreter = + reinterpret_cast(context->impl_); + *args = reinterpret_cast(&interpreter->graph_); + return kTfLiteOk; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.h new file mode 100644 index 00000000..381c561a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter.h @@ -0,0 +1,205 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_INTERPRETER_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_INTERPRETER_H_ + +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/micro/micro_graph.h" +#include "tensorflow/lite/micro/micro_op_resolver.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/portable_type_to_tflitetype.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// Copied from tensorflow/lite/version.h to avoid a dependency chain into +// tensorflow/core. +#define TFLITE_SCHEMA_VERSION (3) + +namespace tflite { +class MicroInterpreter { +public: + // The lifetime of the model, op resolver, tensor arena, error reporter and + // profiler must be at least as long as that of the interpreter object, since + // the interpreter may need to access them at any time. This means that you + // should usually create them with the same scope as each other, for example + // having them all allocated on the stack as local variables through a + // top-level function. The interpreter doesn't do any deallocation of any of + // the pointed-to objects, ownership remains with the caller. + MicroInterpreter(const Model *model, const MicroOpResolver &op_resolver, + uint8_t *tensor_arena, size_t tensor_arena_size, + ErrorReporter *error_reporter, + MicroProfiler *profiler = nullptr); + + // Create an interpreter instance using an existing MicroAllocator instance. + // This constructor should be used when creating an allocator that needs to + // have allocation handled in more than one interpreter or for recording + // allocations inside the interpreter. The lifetime of the allocator must be + // as long as that of the interpreter object. + MicroInterpreter(const Model *model, const MicroOpResolver &op_resolver, + MicroAllocator *allocator, ErrorReporter *error_reporter, + MicroProfiler *profiler = nullptr); + + ~MicroInterpreter(); + + // Runs through the model and allocates all necessary input, output and + // intermediate tensors. + TfLiteStatus AllocateTensors(); + + // In order to support partial graph runs for strided models, this can return + // values other than kTfLiteOk and kTfLiteError. + // TODO(b/149795762): Add this to the TfLiteStatus enum. + TfLiteStatus Invoke(); + + TfLiteTensor *input(size_t index); + size_t inputs_size() const + { + return model_->subgraphs()->Get(0)->inputs()->size(); + } + const flatbuffers::Vector &inputs() const + { + return *model_->subgraphs()->Get(0)->inputs(); + } + TfLiteTensor *input_tensor(size_t index) + { + return input(index); + } + template + T *typed_input_tensor(int tensor_index) + { + if (TfLiteTensor *tensor_ptr = input_tensor(tensor_index)) { + if (tensor_ptr->type == typeToTfLiteType()) { + return GetTensorData(tensor_ptr); + } + } + return nullptr; + } + + TfLiteTensor *output(size_t index); + size_t outputs_size() const + { + return model_->subgraphs()->Get(0)->outputs()->size(); + } + const flatbuffers::Vector &outputs() const + { + return *model_->subgraphs()->Get(0)->outputs(); + } + TfLiteTensor *output_tensor(size_t index) + { + return output(index); + } + template + T *typed_output_tensor(int tensor_index) + { + if (TfLiteTensor *tensor_ptr = output_tensor(tensor_index)) { + if (tensor_ptr->type == typeToTfLiteType()) { + return GetTensorData(tensor_ptr); + } + } + return nullptr; + } + + // Reset all variable tensors to the default value. + TfLiteStatus ResetVariableTensors(); + + TfLiteStatus initialization_status() const + { + return initialization_status_; + } + + size_t operators_size() const + { + return model_->subgraphs()->Get(0)->operators()->size(); + } + + // Populates node and registration pointers representing the inference graph + // of the model from values inside the flatbuffer (loaded from the TfLiteModel + // instance). Persistent data (e.g. operator data) is allocated from the + // arena. + TfLiteStatus PrepareNodeAndRegistrationDataFromFlatbuffer(); + + // For debugging only. + // Returns the actual used arena in bytes. This method gives the optimal arena + // size. It's only available after `AllocateTensors` has been called. + // Note that normally `tensor_arena` requires 16 bytes alignment to fully + // utilize the space. If it's not the case, the optimial arena size would be + // arena_used_bytes() + 16. + size_t arena_used_bytes() const + { + return allocator_.used_bytes(); + } + +protected: + const MicroAllocator &allocator() const + { + return allocator_; + } + const TfLiteContext &context() const + { + return context_; + } + +private: + // TODO(b/158263161): Consider switching to Create() function to enable better + // error reporting during initialization. + void Init(MicroProfiler *profiler); + + // Gets the current subgraph index used from within context methods. + int get_subgraph_index() + { + return graph_.GetCurrentSubgraphIndex(); + } + + // Static functions that are bound to the TfLiteContext instance: + static void *AllocatePersistentBuffer(TfLiteContext *ctx, size_t bytes); + static TfLiteStatus RequestScratchBufferInArena(TfLiteContext *ctx, + size_t bytes, + int *buffer_idx); + static void *GetScratchBuffer(TfLiteContext *ctx, int buffer_idx); + static void ReportOpError(struct TfLiteContext *context, const char *format, + ...); + static TfLiteTensor *GetTensor(const struct TfLiteContext *context, + int tensor_idx); + static TfLiteEvalTensor *GetEvalTensor(const struct TfLiteContext *context, + int tensor_idx); + static TfLiteStatus GetGraph(struct TfLiteContext *context, + TfLiteIntArray **args); + + const Model *model_; + const MicroOpResolver &op_resolver_; + ErrorReporter *error_reporter_; + TfLiteContext context_ = {}; + MicroAllocator &allocator_; + MicroGraph graph_; + bool tensors_allocated_; + + TfLiteStatus initialization_status_; + + ScratchBufferHandle *scratch_buffer_handles_ = nullptr; + + // TODO(b/162311891): Clean these pointers up when this class supports buffers + // from TfLiteEvalTensor. + TfLiteTensor **input_tensors_; + TfLiteTensor **output_tensors_; +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_INTERPRETER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter_test.cc new file mode 100644 index 00000000..0b5cf8ba --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_interpreter_test.cc @@ -0,0 +1,499 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_interpreter.h" + +#include + +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_profiler.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/micro/recording_micro_allocator.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace { + +class MockProfiler : public MicroProfiler { +public: + MockProfiler() + : event_starts_(0), event_ends_(0) + { + } + + uint32_t BeginEvent(const char *tag) override + { + event_starts_++; + return 0; + } + + void EndEvent(uint32_t event_handle) override + { + event_ends_++; + } + + int event_starts() + { + return event_starts_; + } + int event_ends() + { + return event_ends_; + } + +private: + int event_starts_; + int event_ends_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestInterpreter) +{ + const tflite::Model *model = tflite::testing::GetSimpleMockModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 2000; + uint8_t allocator_buffer[allocator_buffer_size]; + + // Create a new scope so that we can test the destructor. + { + tflite::MicroInterpreter interpreter(model, op_resolver, allocator_buffer, + allocator_buffer_size, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk); + TF_LITE_MICRO_EXPECT_LE(interpreter.arena_used_bytes(), 928 + 100); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), interpreter.inputs_size()); + TF_LITE_MICRO_EXPECT_EQ(static_cast(2), interpreter.outputs_size()); + + TfLiteTensor *input = interpreter.input(0); + TF_LITE_MICRO_EXPECT_NE(nullptr, input); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, input->type); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), input->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, input->data.i32); + input->data.i32[0] = 21; + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter.Invoke()); + + TfLiteTensor *output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_NE(nullptr, output); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, output->type); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), output->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, output->data.i32); + TF_LITE_MICRO_EXPECT_EQ(42, output->data.i32[0]); + + output = interpreter.output(1); + TF_LITE_MICRO_EXPECT_NE(nullptr, output); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, output->type); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), output->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, output->data.i32); + TF_LITE_MICRO_EXPECT_EQ(42, output->data.i32[0]); + } + + TF_LITE_MICRO_EXPECT_EQ(tflite::testing::MockCustom::freed_, true); +} + +TF_LITE_MICRO_TEST(TestMultiTenantInterpreter) +{ + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + constexpr size_t arena_size = 8192; + uint8_t arena[arena_size]; + + size_t simple_model_head_usage = 0, complex_model_head_usage = 0; + + // Get simple_model_head_usage. + { + tflite::RecordingMicroAllocator *allocator = + tflite::RecordingMicroAllocator::Create( + arena, arena_size, tflite::GetMicroErrorReporter()); + const tflite::Model *model0 = tflite::testing::GetSimpleMockModel(); + tflite::MicroInterpreter interpreter0(model0, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter0.AllocateTensors()); + simple_model_head_usage = + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes(); + + TfLiteTensor *input = interpreter0.input(0); + TfLiteTensor *output = interpreter0.output(0); + input->data.i32[0] = 21; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter0.Invoke()); + TF_LITE_MICRO_EXPECT_EQ(42, output->data.i32[0]); + } + + // Shared allocator for various models. + tflite::RecordingMicroAllocator *allocator = + tflite::RecordingMicroAllocator::Create(arena, arena_size, + tflite::GetMicroErrorReporter()); + + // Get complex_model_head_usage. No head space reuse since it's the first + // model allocated in the `allocator`. + const tflite::Model *model1 = tflite::testing::GetComplexMockModel(); + tflite::MicroInterpreter interpreter1(model1, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter1.AllocateTensors()); + TfLiteTensor *input1 = interpreter1.input(0); + TfLiteTensor *output1 = interpreter1.output(0); + complex_model_head_usage = + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes(); + + // Allocate simple model from the same `allocator`. Some head space will + // be reused thanks to multi-tenant TFLM support. Also makes sure that + // the output is correct. + const tflite::Model *model2 = tflite::testing::GetSimpleMockModel(); + tflite::MicroInterpreter interpreter2(model2, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter2.AllocateTensors()); + TfLiteTensor *input2 = interpreter2.input(0); + TfLiteTensor *output2 = interpreter2.output(0); + // Verify that 1 + 1 < 2. + size_t multi_tenant_head_usage = + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes(); + TF_LITE_MICRO_EXPECT_LE(multi_tenant_head_usage, + complex_model_head_usage + simple_model_head_usage); + + // Now we have model1 and model2 sharing the same `allocator`. + // Let's make sure that they can produce correct results. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, input1->type); + input1->data.i32[0] = 10; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter1.Invoke()); + // Output tensor for the first model. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, output1->type); + TF_LITE_MICRO_EXPECT_EQ(10, output1->data.i32[0]); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, input2->type); + input2->data.i32[0] = 21; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter2.Invoke()); + // Output for the second model. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, output2->type); + TF_LITE_MICRO_EXPECT_EQ(42, output2->data.i32[0]); + + // Allocate another complex model from the `allocator` will not increase + // head space usage. + const tflite::Model *model3 = tflite::testing::GetComplexMockModel(); + tflite::MicroInterpreter interpreter3(model3, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter3.AllocateTensors()); + TfLiteTensor *input3 = interpreter3.input(0); + TfLiteTensor *output3 = interpreter3.output(0); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, input3->type); + input3->data.i32[0] = 10; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter3.Invoke()); + // Output tensor for the third model. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, output3->type); + TF_LITE_MICRO_EXPECT_EQ(10, output3->data.i32[0]); + // No increase on the head usage as we're reusing the space. + TF_LITE_MICRO_EXPECT_EQ( + multi_tenant_head_usage, + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes()); +} + +TF_LITE_MICRO_TEST(TestKernelMemoryPlanning) +{ + const tflite::Model *model = tflite::testing::GetSimpleStatefulModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 4096; + uint8_t allocator_buffer[allocator_buffer_size]; + + tflite::RecordingMicroAllocator *allocator = + tflite::RecordingMicroAllocator::Create(allocator_buffer, + allocator_buffer_size, + tflite::GetMicroErrorReporter()); + + // Make sure kernel memory planning works in multi-tenant context. + for (int i = 0; i < 3; i++) { + tflite::MicroInterpreter interpreter(model, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), interpreter.inputs_size()); + TF_LITE_MICRO_EXPECT_EQ(static_cast(2), interpreter.outputs_size()); + + TfLiteTensor *input = interpreter.input(0); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->size); + TF_LITE_MICRO_EXPECT_EQ(3, input->dims->data[0]); + input->data.uint8[0] = 2; + input->data.uint8[1] = 3; + input->data.uint8[2] = 1; + + uint8_t expected_median = 2; + + { + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter.Invoke()); + TfLiteTensor *median = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(expected_median, median->data.uint8[0]); + TfLiteTensor *invoke_count = interpreter.output(1); + TF_LITE_MICRO_EXPECT_EQ(1, invoke_count->data.i32[0]); + } + + { + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter.Invoke()); + TfLiteTensor *median = interpreter.output(0); + TF_LITE_MICRO_EXPECT_EQ(expected_median, median->data.uint8[0]); + TfLiteTensor *invoke_count = interpreter.output(1); + TF_LITE_MICRO_EXPECT_EQ(2, invoke_count->data.i32[0]); + } + } +} + +// The interpreter initialization requires multiple steps and this test case +// ensures that simply creating and destructing an interpreter object is ok. +// b/147830765 has one example of a change that caused trouble for this simple +// case. +TF_LITE_MICRO_TEST(TestIncompleteInitialization) +{ + const tflite::Model *model = tflite::testing::GetComplexMockModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 2048; + uint8_t allocator_buffer[allocator_buffer_size]; + + tflite::MicroInterpreter interpreter(model, op_resolver, allocator_buffer, + allocator_buffer_size, + tflite::GetMicroErrorReporter()); +} + +// Test that an interpreter with a supplied profiler correctly calls the +// profiler each time an operator is invoked. +TF_LITE_MICRO_TEST(InterpreterWithProfilerShouldProfileOps) +{ + const tflite::Model *model = tflite::testing::GetComplexMockModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 2048; + uint8_t allocator_buffer[allocator_buffer_size]; + tflite::MockProfiler profiler; + tflite::MicroInterpreter interpreter( + model, op_resolver, allocator_buffer, allocator_buffer_size, + tflite::GetMicroErrorReporter(), &profiler); + + TF_LITE_MICRO_EXPECT_EQ(profiler.event_starts(), 0); + TF_LITE_MICRO_EXPECT_EQ(profiler.event_ends(), 0); + TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk); + TF_LITE_MICRO_EXPECT_EQ(interpreter.Invoke(), kTfLiteOk); +#ifndef TF_LITE_STRIP_ERROR_STRINGS + TF_LITE_MICRO_EXPECT_EQ(profiler.event_starts(), 3); + TF_LITE_MICRO_EXPECT_EQ(profiler.event_ends(), 3); +#else + TF_LITE_MICRO_EXPECT_EQ(profiler.event_starts(), 0); + TF_LITE_MICRO_EXPECT_EQ(profiler.event_ends(), 0); +#endif +} + +TF_LITE_MICRO_TEST(TestIncompleteInitializationAllocationsWithSmallArena) +{ + const tflite::Model *model = tflite::testing::GetComplexMockModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 528; + uint8_t allocator_buffer[allocator_buffer_size]; + + tflite::RecordingMicroAllocator *allocator = + tflite::RecordingMicroAllocator::Create(allocator_buffer, + allocator_buffer_size, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(nullptr, allocator); + + tflite::MicroInterpreter interpreter(model, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + + // Interpreter fails because arena is too small: + TF_LITE_MICRO_EXPECT_EQ(interpreter.Invoke(), kTfLiteError); + + TF_LITE_MICRO_EXPECT_EQ( + static_cast(192), + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes()); + + // Ensure allocations are zero (ignore tail since some internal structs are + // initialized with this space): + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator + ->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteEvalTensorData) + .used_bytes); + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator + ->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteTensorVariableBufferData) + .used_bytes); + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator->GetRecordedAllocation(tflite::RecordedAllocationType::kOpData) + .used_bytes); +} + +TF_LITE_MICRO_TEST(TestInterpreterDoesNotAllocateUntilInvoke) +{ + const tflite::Model *model = tflite::testing::GetComplexMockModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 1024 * 10; + uint8_t allocator_buffer[allocator_buffer_size]; + + tflite::RecordingMicroAllocator *allocator = + tflite::RecordingMicroAllocator::Create(allocator_buffer, + allocator_buffer_size, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(nullptr, allocator); + + tflite::MicroInterpreter interpreter(model, op_resolver, allocator, + tflite::GetMicroErrorReporter()); + + // Ensure allocations are zero (ignore tail since some internal structs are + // initialized with this space): + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes()); + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator + ->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteTensorVariableBufferData) + .used_bytes); + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator + ->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteEvalTensorData) + .used_bytes); + TF_LITE_MICRO_EXPECT_EQ( + static_cast(0), + allocator->GetRecordedAllocation(tflite::RecordedAllocationType::kOpData) + .used_bytes); + + TF_LITE_MICRO_EXPECT_EQ(interpreter.Invoke(), kTfLiteOk); + allocator->PrintAllocations(); + + // Allocation sizes vary based on platform - check that allocations are now + // non-zero: + TF_LITE_MICRO_EXPECT_GT( + allocator->GetSimpleMemoryAllocator()->GetHeadUsedBytes(), + static_cast(0)); + TF_LITE_MICRO_EXPECT_GT( + allocator + ->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteEvalTensorData) + .used_bytes, + 0); + + TF_LITE_MICRO_EXPECT_GT( + allocator + ->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteTensorVariableBufferData) + .used_bytes, + static_cast(0)); + + // TODO(b/160160549): This check is mostly meaningless right now because the + // operator creation in our mock models is inconsistent. Revisit what + // this check should be once the mock models are properly created. + TF_LITE_MICRO_EXPECT_EQ( + allocator->GetRecordedAllocation(tflite::RecordedAllocationType::kOpData) + .used_bytes, + static_cast(0)); +} + +TF_LITE_MICRO_TEST(TestInterpreterMultipleInputs) +{ + const tflite::Model *model = tflite::testing::GetSimpleMultipleInputsModel(); + TF_LITE_MICRO_EXPECT_NE(nullptr, model); + + tflite::AllOpsResolver op_resolver = tflite::testing::GetOpResolver(); + + constexpr size_t allocator_buffer_size = 2000; + uint8_t allocator_buffer[allocator_buffer_size]; + + // Create a new scope so that we can test the destructor. + { + tflite::MicroInterpreter interpreter(model, op_resolver, allocator_buffer, + allocator_buffer_size, + tflite::GetMicroErrorReporter()); + + TF_LITE_MICRO_EXPECT_EQ(interpreter.AllocateTensors(), kTfLiteOk); + TF_LITE_MICRO_EXPECT_LE(interpreter.arena_used_bytes(), 928 + 100); + + TF_LITE_MICRO_EXPECT_EQ(static_cast(3), interpreter.inputs_size()); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), interpreter.outputs_size()); + + TfLiteTensor *input = interpreter.input(0); + TF_LITE_MICRO_EXPECT_NE(nullptr, input); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, input->type); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), input->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, input->data.i32); + input->data.i32[0] = 21; + + TfLiteTensor *input1 = interpreter.input(1); + TF_LITE_MICRO_EXPECT_NE(nullptr, input1); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt8, input1->type); + TF_LITE_MICRO_EXPECT_EQ(1, input1->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, input1->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), input1->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, input1->data.i32); + input1->data.i32[0] = 21; + + TfLiteTensor *input2 = interpreter.input(2); + TF_LITE_MICRO_EXPECT_NE(nullptr, input2); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, input2->type); + TF_LITE_MICRO_EXPECT_EQ(1, input2->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, input2->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), input2->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, input2->data.i32); + input2->data.i32[0] = 24; + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, interpreter.Invoke()); + + TfLiteTensor *output = interpreter.output(0); + TF_LITE_MICRO_EXPECT_NE(nullptr, output); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteInt32, output->type); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->size); + TF_LITE_MICRO_EXPECT_EQ(1, output->dims->data[0]); + TF_LITE_MICRO_EXPECT_EQ(static_cast(4), output->bytes); + TF_LITE_MICRO_EXPECT_NE(nullptr, output->data.i32); + TF_LITE_MICRO_EXPECT_EQ(66, output->data.i32[0]); + } + + TF_LITE_MICRO_EXPECT_EQ(tflite::testing::MultipleInputs::freed_, true); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver.h new file mode 100644 index 00000000..b24cf022 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver.h @@ -0,0 +1,691 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_MUTABLE_OP_RESOLVER_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_MUTABLE_OP_RESOLVER_H_ + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/op_macros.h" +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/kernels/conv.h" +#include "tensorflow/lite/micro/kernels/ethosu.h" +#include "tensorflow/lite/micro/kernels/fully_connected.h" +#include "tensorflow/lite/micro/kernels/micro_ops.h" +#include "tensorflow/lite/micro/kernels/softmax.h" +#include "tensorflow/lite/micro/micro_op_resolver.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +TfLiteRegistration *Register_DETECTION_POSTPROCESS(); + +template +class MicroMutableOpResolver : public MicroOpResolver { +public: + TF_LITE_REMOVE_VIRTUAL_DELETE + + explicit MicroMutableOpResolver(ErrorReporter *error_reporter = nullptr) + : error_reporter_(error_reporter) + { + } + + const TfLiteRegistration *FindOp(tflite::BuiltinOperator op) const override + { + if (op == BuiltinOperator_CUSTOM) + return nullptr; + + for (unsigned int i = 0; i < registrations_len_; ++i) { + const TfLiteRegistration ®istration = registrations_[i]; + if (registration.builtin_code == op) { + return ®istration; + } + } + return nullptr; + } + + const TfLiteRegistration *FindOp(const char *op) const override + { + for (unsigned int i = 0; i < registrations_len_; ++i) { + const TfLiteRegistration ®istration = registrations_[i]; + if ((registration.builtin_code == BuiltinOperator_CUSTOM) && + (strcmp(registration.custom_name, op) == 0)) { + return ®istration; + } + } + return nullptr; + } + + MicroOpResolver::BuiltinParseFunction GetOpDataParser( + BuiltinOperator op) const override + { + TFLITE_DCHECK(num_buitin_ops_ <= tOpCount); + for (unsigned int i = 0; i < num_buitin_ops_; ++i) { + if (builtin_codes_[i] == op) + return builtin_parsers_[i]; + } + return nullptr; + } + + // Registers a Custom Operator with the MicroOpResolver. + // + // Only the first call for a given name will be successful. i.e. if this + // function is called again for a previously added Custom Operator, the + // MicroOpResolver will be unchanged and this function will return + // kTfLiteError. + TfLiteStatus AddCustom(const char *name, TfLiteRegistration *registration) + { + if (registrations_len_ >= tOpCount) { + if (error_reporter_) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Couldn't register custom op '%s', resolver size is too small (%d)", + name, tOpCount); + } + return kTfLiteError; + } + + if (FindOp(name) != nullptr) { + if (error_reporter_ != nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Calling AddCustom for the same op more than once " + "is not supported (Op: %s).", + name); + } + return kTfLiteError; + } + + TfLiteRegistration *new_registration = ®istrations_[registrations_len_]; + registrations_len_ += 1; + + *new_registration = *registration; + new_registration->builtin_code = BuiltinOperator_CUSTOM; + new_registration->custom_name = name; + return kTfLiteOk; + } + + // The Add* functions below add the various Builtin operators to the + // MicroMutableOpResolver object. + + TfLiteStatus AddAbs() + { + return AddBuiltin(BuiltinOperator_ABS, tflite::ops::micro::Register_ABS(), + ParseAbs); + } + + TfLiteStatus AddAdd() + { + return AddBuiltin(BuiltinOperator_ADD, tflite::ops::micro::Register_ADD(), + ParseAdd); + } + + TfLiteStatus AddAddN() + { + return AddBuiltin(BuiltinOperator_ADD_N, tflite::Register_ADD_N(), + ParseAddN); + } + + TfLiteStatus AddArgMax() + { + return AddBuiltin(BuiltinOperator_ARG_MAX, + tflite::ops::micro::Register_ARG_MAX(), ParseArgMax); + } + + TfLiteStatus AddArgMin() + { + return AddBuiltin(BuiltinOperator_ARG_MIN, + tflite::ops::micro::Register_ARG_MIN(), ParseArgMin); + } + + TfLiteStatus AddAveragePool2D() + { + return AddBuiltin(BuiltinOperator_AVERAGE_POOL_2D, + tflite::Register_AVERAGE_POOL_2D(), ParsePool); + } + + TfLiteStatus AddBatchToSpaceNd() + { + return AddBuiltin(BuiltinOperator_BATCH_TO_SPACE_ND, + Register_BATCH_TO_SPACE_ND(), ParseBatchToSpaceNd); + } + + TfLiteStatus AddCast() + { + return AddBuiltin(BuiltinOperator_CAST, Register_CAST(), ParseCast); + } + + TfLiteStatus AddCeil() + { + return AddBuiltin(BuiltinOperator_CEIL, tflite::ops::micro::Register_CEIL(), + ParseCeil); + } + + TfLiteStatus AddCircularBuffer() + { + return AddCustom("CIRCULAR_BUFFER", + tflite::ops::micro::Register_CIRCULAR_BUFFER()); + } + + TfLiteStatus AddConcatenation() + { + return AddBuiltin(BuiltinOperator_CONCATENATION, + tflite::ops::micro::Register_CONCATENATION(), + ParseConcatenation); + } + + TfLiteStatus AddConv2D( + const TfLiteRegistration ®istration = Register_CONV_2D()) + { + return AddBuiltin(BuiltinOperator_CONV_2D, registration, ParseConv2D); + } + + TfLiteStatus AddCos() + { + return AddBuiltin(BuiltinOperator_COS, tflite::ops::micro::Register_COS(), + ParseCos); + } + + TfLiteStatus AddCumSum() + { + return AddBuiltin(BuiltinOperator_CUMSUM, tflite::Register_CUMSUM(), + ParseCumsum); + } + + TfLiteStatus AddDepthToSpace() + { + return AddBuiltin(BuiltinOperator_DEPTH_TO_SPACE, + tflite::Register_DEPTH_TO_SPACE(), ParseDepthToSpace); + } + + TfLiteStatus AddDepthwiseConv2D() + { + return AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, + Register_DEPTHWISE_CONV_2D(), ParseDepthwiseConv2D); + } + + TfLiteStatus AddDequantize() + { + return AddBuiltin(BuiltinOperator_DEQUANTIZE, + tflite::ops::micro::Register_DEQUANTIZE(), + ParseDequantize); + } + + TfLiteStatus AddDetectionPostprocess() + { + return AddCustom("TFLite_Detection_PostProcess", + tflite::Register_DETECTION_POSTPROCESS()); + } + + TfLiteStatus AddElu() + { + return AddBuiltin(BuiltinOperator_ELU, tflite::Register_ELU(), ParseElu); + } + + TfLiteStatus AddEqual() + { + return AddBuiltin(BuiltinOperator_EQUAL, + tflite::ops::micro::Register_EQUAL(), ParseEqual); + } + + TfLiteStatus AddEthosU() + { + TfLiteRegistration *registration = tflite::Register_ETHOSU(); + if (registration) { + return AddCustom(tflite::GetString_ETHOSU(), registration); + } + return kTfLiteOk; + } + + TfLiteStatus AddExp() + { + return AddBuiltin(BuiltinOperator_EXP, Register_EXP(), ParseExp); + } + + TfLiteStatus AddExpandDims() + { + return AddBuiltin(BuiltinOperator_EXPAND_DIMS, Register_EXPAND_DIMS(), + ParseExpandDims); + } + + TfLiteStatus AddFill() + { + return AddBuiltin(BuiltinOperator_FILL, tflite::Register_FILL(), ParseFill); + } + + TfLiteStatus AddFloor() + { + return AddBuiltin(BuiltinOperator_FLOOR, + tflite::ops::micro::Register_FLOOR(), ParseFloor); + } + + TfLiteStatus AddFloorDiv() + { + return AddBuiltin(BuiltinOperator_FLOOR_DIV, tflite::Register_FLOOR_DIV(), + ParseFloorDiv); + } + + TfLiteStatus AddFloorMod() + { + return AddBuiltin(BuiltinOperator_FLOOR_MOD, tflite::Register_FLOOR_MOD(), + ParseFloorMod); + } + + TfLiteStatus AddFullyConnected( + const TfLiteRegistration ®istration = Register_FULLY_CONNECTED()) + { + return AddBuiltin(BuiltinOperator_FULLY_CONNECTED, registration, + ParseFullyConnected); + } + + TfLiteStatus AddGather() + { + return AddBuiltin(BuiltinOperator_GATHER, tflite::Register_GATHER(), + ParseGather); + } + + TfLiteStatus AddGatherNd() + { + return AddBuiltin(BuiltinOperator_GATHER_ND, tflite::Register_GATHER_ND(), + ParseGatherNd); + } + + TfLiteStatus AddGreater() + { + return AddBuiltin(BuiltinOperator_GREATER, + tflite::ops::micro::Register_GREATER(), ParseGreater); + } + + TfLiteStatus AddGreaterEqual() + { + return AddBuiltin(BuiltinOperator_GREATER_EQUAL, + tflite::ops::micro::Register_GREATER_EQUAL(), + ParseGreaterEqual); + } + + TfLiteStatus AddHardSwish() + { + return AddBuiltin(BuiltinOperator_HARD_SWISH, + tflite::ops::micro::Register_HARD_SWISH(), + ParseHardSwish); + } + + TfLiteStatus AddIf() + { + return AddBuiltin(BuiltinOperator_IF, tflite::Register_IF(), ParseIf); + } + + TfLiteStatus AddL2Normalization() + { + return AddBuiltin(BuiltinOperator_L2_NORMALIZATION, + tflite::ops::micro::Register_L2_NORMALIZATION(), + ParseL2Normalization); + } + + TfLiteStatus AddL2Pool2D() + { + return AddBuiltin(BuiltinOperator_L2_POOL_2D, tflite::Register_L2_POOL_2D(), + ParsePool); + } + + TfLiteStatus AddLeakyRelu() + { + return AddBuiltin(BuiltinOperator_LEAKY_RELU, tflite::Register_LEAKY_RELU(), + ParseLeakyRelu); + } + + TfLiteStatus AddLess() + { + return AddBuiltin(BuiltinOperator_LESS, tflite::ops::micro::Register_LESS(), + ParseLess); + } + + TfLiteStatus AddLessEqual() + { + return AddBuiltin(BuiltinOperator_LESS_EQUAL, + tflite::ops::micro::Register_LESS_EQUAL(), + ParseLessEqual); + } + + TfLiteStatus AddLog() + { + return AddBuiltin(BuiltinOperator_LOG, tflite::ops::micro::Register_LOG(), + ParseLog); + } + + TfLiteStatus AddLogicalAnd() + { + return AddBuiltin(BuiltinOperator_LOGICAL_AND, + tflite::ops::micro::Register_LOGICAL_AND(), + ParseLogicalAnd); + } + + TfLiteStatus AddLogicalNot() + { + return AddBuiltin(BuiltinOperator_LOGICAL_NOT, + tflite::ops::micro::Register_LOGICAL_NOT(), + ParseLogicalNot); + } + + TfLiteStatus AddLogicalOr() + { + return AddBuiltin(BuiltinOperator_LOGICAL_OR, + tflite::ops::micro::Register_LOGICAL_OR(), + ParseLogicalOr); + } + + TfLiteStatus AddLogistic() + { + return AddBuiltin(BuiltinOperator_LOGISTIC, + tflite::ops::micro::Register_LOGISTIC(), ParseLogistic); + } + + TfLiteStatus AddMaximum() + { + return AddBuiltin(BuiltinOperator_MAXIMUM, + tflite::ops::micro::Register_MAXIMUM(), ParseMaximum); + } + + TfLiteStatus AddMaxPool2D() + { + return AddBuiltin(BuiltinOperator_MAX_POOL_2D, + tflite::Register_MAX_POOL_2D(), ParsePool); + } + + TfLiteStatus AddMean() + { + return AddBuiltin(BuiltinOperator_MEAN, tflite::ops::micro::Register_MEAN(), + ParseReducer); + } + + TfLiteStatus AddMinimum() + { + return AddBuiltin(BuiltinOperator_MINIMUM, + tflite::ops::micro::Register_MINIMUM(), ParseMinimum); + } + + TfLiteStatus AddMul() + { + return AddBuiltin(BuiltinOperator_MUL, tflite::ops::micro::Register_MUL(), + ParseMul); + } + + TfLiteStatus AddNeg() + { + return AddBuiltin(BuiltinOperator_NEG, tflite::ops::micro::Register_NEG(), + ParseNeg); + } + + TfLiteStatus AddNotEqual() + { + return AddBuiltin(BuiltinOperator_NOT_EQUAL, + tflite::ops::micro::Register_NOT_EQUAL(), ParseNotEqual); + } + + TfLiteStatus AddPack() + { + return AddBuiltin(BuiltinOperator_PACK, tflite::ops::micro::Register_PACK(), + ParsePack); + } + + TfLiteStatus AddPad() + { + return AddBuiltin(BuiltinOperator_PAD, tflite::ops::micro::Register_PAD(), + ParsePad); + } + + TfLiteStatus AddPadV2() + { + return AddBuiltin(BuiltinOperator_PADV2, + tflite::ops::micro::Register_PADV2(), ParsePadV2); + } + + TfLiteStatus AddPrelu() + { + return AddBuiltin(BuiltinOperator_PRELU, + tflite::ops::micro::Register_PRELU(), ParsePrelu); + } + + TfLiteStatus AddQuantize() + { + return AddBuiltin(BuiltinOperator_QUANTIZE, Register_QUANTIZE(), + ParseQuantize); + } + + TfLiteStatus AddReduceMax() + { + return AddBuiltin(BuiltinOperator_REDUCE_MAX, + tflite::ops::micro::Register_REDUCE_MAX(), ParseReducer); + } + + TfLiteStatus AddRelu() + { + return AddBuiltin(BuiltinOperator_RELU, tflite::ops::micro::Register_RELU(), + ParseRelu); + } + + TfLiteStatus AddRelu6() + { + return AddBuiltin(BuiltinOperator_RELU6, + tflite::ops::micro::Register_RELU6(), ParseRelu6); + } + + TfLiteStatus AddReshape() + { + return AddBuiltin(BuiltinOperator_RESHAPE, + tflite::ops::micro::Register_RESHAPE(), ParseReshape); + } + + TfLiteStatus AddResizeBilinear() + { + return AddBuiltin(BuiltinOperator_RESIZE_BILINEAR, + Register_RESIZE_BILINEAR(), ParseResizeBilinear); + } + + TfLiteStatus AddResizeNearestNeighbor() + { + return AddBuiltin(BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, + tflite::ops::micro::Register_RESIZE_NEAREST_NEIGHBOR(), + ParseResizeNearestNeighbor); + } + + TfLiteStatus AddRound() + { + return AddBuiltin(BuiltinOperator_ROUND, + tflite::ops::micro::Register_ROUND(), ParseRound); + } + + TfLiteStatus AddRsqrt() + { + return AddBuiltin(BuiltinOperator_RSQRT, + tflite::ops::micro::Register_RSQRT(), ParseRsqrt); + } + + TfLiteStatus AddShape() + { + return AddBuiltin(BuiltinOperator_SHAPE, Register_SHAPE(), ParseShape); + } + + TfLiteStatus AddSin() + { + return AddBuiltin(BuiltinOperator_SIN, tflite::ops::micro::Register_SIN(), + ParseSin); + } + + TfLiteStatus AddSoftmax( + const TfLiteRegistration ®istration = Register_SOFTMAX()) + { + return AddBuiltin(BuiltinOperator_SOFTMAX, registration, ParseSoftmax); + } + + TfLiteStatus AddSpaceToBatchNd() + { + return AddBuiltin(BuiltinOperator_SPACE_TO_BATCH_ND, + Register_SPACE_TO_BATCH_ND(), ParseSpaceToBatchNd); + } + + TfLiteStatus AddSpaceToDepth() + { + return AddBuiltin(BuiltinOperator_SPACE_TO_DEPTH, Register_SPACE_TO_DEPTH(), + ParseSpaceToDepth); + } + + TfLiteStatus AddSplit() + { + return AddBuiltin(BuiltinOperator_SPLIT, + tflite::ops::micro::Register_SPLIT(), ParseSplit); + } + + TfLiteStatus AddSplitV() + { + return AddBuiltin(BuiltinOperator_SPLIT_V, + tflite::ops::micro::Register_SPLIT_V(), ParseSplitV); + } + + TfLiteStatus AddSqueeze() + { + return AddBuiltin(BuiltinOperator_SQUEEZE, Register_SQUEEZE(), + ParseSqueeze); + } + + TfLiteStatus AddSqrt() + { + return AddBuiltin(BuiltinOperator_SQRT, tflite::ops::micro::Register_SQRT(), + ParseSqrt); + } + + TfLiteStatus AddSquare() + { + return AddBuiltin(BuiltinOperator_SQUARE, + tflite::ops::micro::Register_SQUARE(), ParseSquare); + } + + TfLiteStatus AddStridedSlice() + { + return AddBuiltin(BuiltinOperator_STRIDED_SLICE, + tflite::ops::micro::Register_STRIDED_SLICE(), + ParseStridedSlice); + } + + TfLiteStatus AddSub() + { + return AddBuiltin(BuiltinOperator_SUB, tflite::ops::micro::Register_SUB(), + ParseSub); + } + + TfLiteStatus AddSvdf() + { + return AddBuiltin(BuiltinOperator_SVDF, Register_SVDF(), ParseSvdf); + } + + TfLiteStatus AddTanh() + { + return AddBuiltin(BuiltinOperator_TANH, tflite::ops::micro::Register_TANH(), + ParseTanh); + } + + TfLiteStatus AddTransposeConv() + { + return AddBuiltin(BuiltinOperator_TRANSPOSE_CONV, + tflite::Register_TRANSPOSE_CONV(), ParseTransposeConv); + } + + TfLiteStatus AddTranspose() + { + return AddBuiltin(BuiltinOperator_TRANSPOSE, Register_TRANSPOSE(), + ParseTranspose); + } + + TfLiteStatus AddUnpack() + { + return AddBuiltin(BuiltinOperator_UNPACK, + tflite::ops::micro::Register_UNPACK(), ParseUnpack); + } + + TfLiteStatus AddZerosLike() + { + return AddBuiltin(BuiltinOperator_ZEROS_LIKE, Register_ZEROS_LIKE(), + ParseZerosLike); + } + + unsigned int GetRegistrationLength() + { + return registrations_len_; + } + +private: + TfLiteStatus AddBuiltin(tflite::BuiltinOperator op, + const TfLiteRegistration ®istration, + MicroOpResolver::BuiltinParseFunction parser) + { + if (op == BuiltinOperator_CUSTOM) { + if (error_reporter_ != nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Invalid parameter BuiltinOperator_CUSTOM to the " + "AddBuiltin function."); + } + return kTfLiteError; + } + + if (FindOp(op) != nullptr) { + if (error_reporter_ != nullptr) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Calling AddBuiltin with the same op more than " + "once is not supported (Op: #%d).", + op); + } + return kTfLiteError; + } + + if (registrations_len_ >= tOpCount) { + if (error_reporter_) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Couldn't register builtin op #%d, resolver size " + "is too small (%d).", + op, tOpCount); + } + return kTfLiteError; + } + + registrations_[registrations_len_] = registration; + // Strictly speaking, the builtin_code is not necessary for TFLM but filling + // it in regardless. + registrations_[registrations_len_].builtin_code = op; + registrations_len_++; + + builtin_codes_[num_buitin_ops_] = op; + builtin_parsers_[num_buitin_ops_] = parser; + num_buitin_ops_++; + + return kTfLiteOk; + } + + TfLiteRegistration registrations_[tOpCount]; + unsigned int registrations_len_ = 0; + + // Arrays (and counter) to store the builtin codes and their corresponding + // parse functions as these are registered with the Op Resolver. + BuiltinOperator builtin_codes_[tOpCount]; + MicroOpResolver::BuiltinParseFunction builtin_parsers_[tOpCount]; + unsigned int num_buitin_ops_ = 0; + + ErrorReporter *error_reporter_; +}; + +}; // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_MUTABLE_OP_RESOLVER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver_test.cc new file mode 100644 index 00000000..8988a607 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_mutable_op_resolver_test.cc @@ -0,0 +1,148 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" + +#include "tensorflow/lite/micro/micro_op_resolver.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +namespace tflite { +namespace { +void *MockInit(TfLiteContext *context, const char *buffer, size_t length) +{ + // Do nothing. + return nullptr; +} + +void MockFree(TfLiteContext *context, void *buffer) +{ + // Do nothing. +} + +TfLiteStatus MockPrepare(TfLiteContext *context, TfLiteNode *node) +{ + return kTfLiteOk; +} + +TfLiteStatus MockInvoke(TfLiteContext *context, TfLiteNode *node) +{ + return kTfLiteOk; +} + +class MockErrorReporter : public ErrorReporter { +public: + MockErrorReporter() + : has_been_called_(false) + { + } + int Report(const char *format, va_list args) override + { + has_been_called_ = true; + return 0; + }; + + bool HasBeenCalled() + { + return has_been_called_; + } + + void ResetState() + { + has_been_called_ = false; + } + +private: + bool has_been_called_; + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace +} // namespace tflite + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestOperations) +{ + using tflite::BuiltinOperator_CONV_2D; + using tflite::BuiltinOperator_RELU; + using tflite::MicroMutableOpResolver; + using tflite::OpResolver; + + static TfLiteRegistration r = {}; + r.init = tflite::MockInit; + r.free = tflite::MockFree; + r.prepare = tflite::MockPrepare; + r.invoke = tflite::MockInvoke; + + MicroMutableOpResolver<1> micro_op_resolver; + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + micro_op_resolver.AddCustom("mock_custom", &r)); + + // Only one AddCustom per operator should return kTfLiteOk. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, + micro_op_resolver.AddCustom("mock_custom", &r)); + + tflite::MicroOpResolver *resolver = µ_op_resolver; + + TF_LITE_MICRO_EXPECT_EQ(static_cast(1), + micro_op_resolver.GetRegistrationLength()); + + const TfLiteRegistration *registration = + resolver->FindOp(BuiltinOperator_RELU); + TF_LITE_MICRO_EXPECT(nullptr == registration); + + registration = resolver->FindOp("mock_custom"); + TF_LITE_MICRO_EXPECT(nullptr != registration); + TF_LITE_MICRO_EXPECT(nullptr == registration->init(nullptr, nullptr, 0)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, registration->prepare(nullptr, nullptr)); + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, registration->invoke(nullptr, nullptr)); + + registration = resolver->FindOp("nonexistent_custom"); + TF_LITE_MICRO_EXPECT(nullptr == registration); +} + +TF_LITE_MICRO_TEST(TestErrorReporting) +{ + using tflite::BuiltinOperator_CONV_2D; + using tflite::BuiltinOperator_RELU; + using tflite::MicroMutableOpResolver; + + static TfLiteRegistration r = {}; + r.init = tflite::MockInit; + r.free = tflite::MockFree; + r.prepare = tflite::MockPrepare; + r.invoke = tflite::MockInvoke; + + tflite::MockErrorReporter mock_reporter; + MicroMutableOpResolver<1> micro_op_resolver(&mock_reporter); + TF_LITE_MICRO_EXPECT_EQ(false, mock_reporter.HasBeenCalled()); + mock_reporter.ResetState(); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, + micro_op_resolver.AddCustom("mock_custom_0", &r)); + TF_LITE_MICRO_EXPECT_EQ(false, mock_reporter.HasBeenCalled()); + mock_reporter.ResetState(); + + // Attempting to Add more operators than the class template parameter for + // MicroMutableOpResolver should result in errors. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, micro_op_resolver.AddRelu()); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, + micro_op_resolver.AddCustom("mock_custom_1", &r)); + TF_LITE_MICRO_EXPECT_EQ(true, mock_reporter.HasBeenCalled()); + mock_reporter.ResetState(); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_op_resolver.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_op_resolver.h new file mode 100644 index 00000000..988c9bb2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_op_resolver.h @@ -0,0 +1,76 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_OP_RESOLVER_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_OP_RESOLVER_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/core/api/flatbuffer_conversions.h" +#include "tensorflow/lite/core/api/op_resolver.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +// This is an interface for the OpResolver for TFLiteMicro. The differences from +// the TFLite OpResolver base class are to: +// * explicitly remove support for Op versions +// * allow for finer grained registration of the Builtin Ops to reduce code +// size for TFLiteMicro. +// +// We need an interface class instead of directly using MicroMutableOpResolver +// because MicroMutableOpResolver is a class template with the number of +// registered Ops as the template parameter. +class MicroOpResolver : public OpResolver { +public: + typedef TfLiteStatus (*BuiltinParseFunction)(const Operator *op, + ErrorReporter *error_reporter, + BuiltinDataAllocator *allocator, + void **builtin_data); + + // Returns the Op registration struct corresponding to the enum code from the + // flatbuffer schema. Returns nullptr if the op is not found or if op == + // BuiltinOperator_CUSTOM. + virtual const TfLiteRegistration *FindOp(BuiltinOperator op) const = 0; + + // Returns the Op registration struct corresponding to the custom operator by + // name. + virtual const TfLiteRegistration *FindOp(const char *op) const = 0; + + // This implementation exists for compatibility with the OpResolver base class + // and disregards the version parameter. + const TfLiteRegistration *FindOp(BuiltinOperator op, + int version) const final + { + return FindOp(op); + } + + // This implementation exists for compatibility with the OpResolver base class + // and disregards the version parameter. + const TfLiteRegistration *FindOp(const char *op, int version) const final + { + return FindOp(op); + } + + // Returns the operator specific parsing function for the OpData for a + // BuiltinOperator (if registered), else nullptr. + virtual BuiltinParseFunction GetOpDataParser(BuiltinOperator op) const = 0; + + ~MicroOpResolver() override + { + } +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_OP_RESOLVER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.cc new file mode 100644 index 00000000..005f7af6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.cc @@ -0,0 +1,62 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/micro/micro_profiler.h" + +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/micro_time.h" + +namespace tflite { + +uint32_t MicroProfiler::BeginEvent(const char *tag) +{ + if (num_events_ == kMaxEvents) { + num_events_ = 0; + } + + tags_[num_events_] = tag; + start_ticks_[num_events_] = GetCurrentTimeTicks(); + end_ticks_[num_events_] = start_ticks_[num_events_] - 1; + return num_events_++; +} + +void MicroProfiler::EndEvent(uint32_t event_handle) +{ + TFLITE_DCHECK(event_handle < kMaxEvents); + end_ticks_[event_handle] = GetCurrentTimeTicks(); +} + +int32_t MicroProfiler::GetTotalTicks() const +{ + int32_t ticks = 0; + for (int i = 0; i < num_events_; ++i) { + ticks += end_ticks_[i] - start_ticks_[i]; + } + return ticks; +} + +void MicroProfiler::Log() const +{ +#if !defined(TF_LITE_STRIP_ERROR_STRINGS) + for (int i = 0; i < num_events_; ++i) { + int32_t ticks = end_ticks_[i] - start_ticks_[i]; + MicroPrintf("%s took %d ticks (%d ms).", tags_[i], ticks, TicksToMs(ticks)); + } +#endif +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.h new file mode 100644 index 00000000..63c9222e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_profiler.h @@ -0,0 +1,124 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MICRO_PROFILER_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_PROFILER_H_ + +#include + +#include "tensorflow/lite/micro/compatibility.h" + +namespace tflite { +// MicroProfiler creates a common way to gain fine-grained insight into runtime +// performance. Bottleck operators can be identified along with slow code +// sections. This can be used in conjunction with running the relevant micro +// benchmark to evaluate end-to-end performance. +class MicroProfiler { +public: + MicroProfiler() = default; + virtual ~MicroProfiler() = default; + + // Marks the start of a new event and returns an event handle that can be used + // to mark the end of the event via EndEvent. The lifetime of the tag + // parameter must exceed that of the MicroProfiler. + virtual uint32_t BeginEvent(const char *tag); + + // Marks the end of an event associated with event_handle. It is the + // responsibility of the caller to ensure than EndEvent is called once and + // only once per event_handle. + // + // If EndEvent is called more than once for the same event_handle, the last + // call will be used as the end of event marker.If EndEvent is called 0 times + // for a particular event_handle, the duration of that event will be 0 ticks. + virtual void EndEvent(uint32_t event_handle); + + // Clears all the events that have been currently profiled. + void ClearEvents() + { + num_events_ = 0; + } + + // Returns the sum of the ticks taken across all the events. This number + // is only meaningful if all of the events are disjoint (the end time of + // event[i] <= start time of event[i+1]). + int32_t GetTotalTicks() const; + + // Prints the profiling information of each of the events. + void Log() const; + +private: + // Maximum number of events that this class can keep track of. If we call + // AddEvent more than kMaxEvents number of times, then the oldest event's + // profiling information will be overwritten. + static constexpr int kMaxEvents = 50; + + const char *tags_[kMaxEvents]; + int32_t start_ticks_[kMaxEvents]; + int32_t end_ticks_[kMaxEvents]; + int num_events_ = 0; + + TF_LITE_REMOVE_VIRTUAL_DELETE; +}; + +#if defined(TF_LITE_STRIP_ERROR_STRINGS) +// For release builds, the ScopedMicroProfiler is a noop. +// +// This is done because the ScipedProfiler is used as part of the +// MicroInterpreter and we want to ensure zero overhead for the release builds. +class ScopedMicroProfiler { +public: + explicit ScopedMicroProfiler(const char *tag, MicroProfiler *profiler) + { + } +}; + +#else + +// This class can be used to add events to a MicroProfiler object that span the +// lifetime of the ScopedMicroProfiler object. +// Usage example: +// +// MicroProfiler profiler(); +// ... +// { +// ScopedMicroProfiler scoped_profiler("custom_tag", profiler); +// work_to_profile(); +// } +class ScopedMicroProfiler { +public: + explicit ScopedMicroProfiler(const char *tag, MicroProfiler *profiler) + : profiler_(profiler) + { + if (profiler_ != nullptr) { + event_handle_ = profiler_->BeginEvent(tag); + } + } + + ~ScopedMicroProfiler() + { + if (profiler_ != nullptr) { + profiler_->EndEvent(event_handle_); + } + } + +private: + uint32_t event_handle_ = 0; + MicroProfiler *profiler_ = nullptr; +}; +#endif // !defined(NDEBUG) + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_PROFILER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_string.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_string.cc new file mode 100644 index 00000000..59410a09 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_string.cc @@ -0,0 +1,330 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Implements debug logging for numbers by converting them into strings and then +// calling the main DebugLog(char*) function. These are separated into a +// different file so that platforms can just implement the string output version +// of DebugLog() and then get the numerical variations without requiring any +// more code. + +#include "tensorflow/lite/micro/micro_string.h" + +#include +#include +#include + +namespace { + +// Int formats can need up to 10 bytes for the value plus a single byte for the +// sign. +constexpr int kMaxIntCharsNeeded = 10 + 1; +// Hex formats can need up to 8 bytes for the value plus two bytes for the "0x". +constexpr int kMaxHexCharsNeeded = 8 + 2; + +// Float formats can need up to 7 bytes for the fraction plus 3 bytes for "x2^" +// plus 3 bytes for the exponent and a single sign bit. +constexpr float kMaxFloatCharsNeeded = 7 + 3 + 3 + 1; + +// All input buffers to the number conversion functions must be this long. +const int kFastToBufferSize = 48; + +// Reverses a zero-terminated string in-place. +char *ReverseStringInPlace(char *start, char *end) +{ + char *p1 = start; + char *p2 = end - 1; + while (p1 < p2) { + char tmp = *p1; + *p1++ = *p2; + *p2-- = tmp; + } + return start; +} + +// Appends a string to a string, in-place. You need to pass in the maximum +// string length as the second argument. +char *StrCatStr(char *main, int main_max_length, const char *to_append) +{ + char *current = main; + while (*current != 0) { + ++current; + } + char *current_end = main + (main_max_length - 1); + while ((*to_append != 0) && (current < current_end)) { + *current = *to_append; + ++current; + ++to_append; + } + *current = 0; + return current; +} + +// Populates the provided buffer with an ASCII representation of the number. +char *FastUInt32ToBufferLeft(uint32_t i, char *buffer, int base) +{ + char *start = buffer; + do { + int32_t digit = i % base; + char character; + if (digit < 10) { + character = '0' + digit; + } else { + character = 'a' + (digit - 10); + } + *buffer++ = character; + i /= base; + } while (i > 0); + *buffer = 0; + ReverseStringInPlace(start, buffer); + return buffer; +} + +// Populates the provided buffer with an ASCII representation of the number. +char *FastInt32ToBufferLeft(int32_t i, char *buffer) +{ + uint32_t u = i; + if (i < 0) { + *buffer++ = '-'; + u = -u; + } + return FastUInt32ToBufferLeft(u, buffer, 10); +} + +// Converts a number to a string and appends it to another. +char *StrCatInt32(char *main, int main_max_length, int32_t number) +{ + char number_string[kFastToBufferSize]; + FastInt32ToBufferLeft(number, number_string); + return StrCatStr(main, main_max_length, number_string); +} + +// Converts a number to a string and appends it to another. +char *StrCatUInt32(char *main, int main_max_length, uint32_t number, int base) +{ + char number_string[kFastToBufferSize]; + FastUInt32ToBufferLeft(number, number_string, base); + return StrCatStr(main, main_max_length, number_string); +} + +// Populates the provided buffer with ASCII representation of the float number. +// Avoids the use of any floating point instructions (since these aren't +// supported on many microcontrollers) and as a consequence prints values with +// power-of-two exponents. +char *FastFloatToBufferLeft(float f, char *buffer) +{ + char *current = buffer; + char *current_end = buffer + (kFastToBufferSize - 1); + // Access the bit fields of the floating point value to avoid requiring any + // float instructions. These constants are derived from IEEE 754. + const uint32_t sign_mask = 0x80000000; + const uint32_t exponent_mask = 0x7f800000; + const int32_t exponent_shift = 23; + const int32_t exponent_bias = 127; + const uint32_t fraction_mask = 0x007fffff; + uint32_t u; + memcpy(&u, &f, sizeof(int32_t)); + const int32_t exponent = + ((u & exponent_mask) >> exponent_shift) - exponent_bias; + const uint32_t fraction = (u & fraction_mask); + // Expect ~0x2B1B9D3 for fraction. + if (u & sign_mask) { + *current = '-'; + current += 1; + } + *current = 0; + // These are special cases for infinities and not-a-numbers. + if (exponent == 128) { + if (fraction == 0) { + current = StrCatStr(current, (current_end - current), "Inf"); + return current; + } else { + current = StrCatStr(current, (current_end - current), "NaN"); + return current; + } + } + // 0x007fffff (8388607) represents 0.99... for the fraction, so to print the + // correct decimal digits we need to scale our value before passing it to the + // conversion function. This scale should be 10000000/8388608 = 1.1920928955. + // We can approximate this using multiply-adds and right-shifts using the + // values in this array. The 1. portion of the number string is printed out + // in a fixed way before the fraction, below. + const int32_t scale_shifts_size = 13; + const int8_t scale_shifts[13] = { 3, 4, 8, 11, 13, 14, 17, + 18, 19, 20, 21, 22, 23 }; + uint32_t scaled_fraction = fraction; + for (int i = 0; i < scale_shifts_size; ++i) { + scaled_fraction += (fraction >> scale_shifts[i]); + } + *current = '1'; + current += 1; + *current = '.'; + current += 1; + *current = 0; + + // Prepend leading zeros to fill in all 7 bytes of the fraction. Truncate + // zeros off the end of the fraction. Every fractional value takes 7 bytes. + // For example, 2500 would be written into the buffer as 0002500 since it + // represents .00025. + constexpr int kMaxFractionalDigits = 7; + + // Abort early if there is not enough space in the buffer. + if (current_end - current <= kMaxFractionalDigits) { + return current; + } + + // Pre-fill buffer with zeros to ensure zero-truncation works properly. + for (int i = 1; i < kMaxFractionalDigits; i++) { + *(current + i) = '0'; + } + + // Track how large the fraction is to add leading zeros. + char *previous = current; + current = StrCatUInt32(current, (current_end - current), scaled_fraction, 10); + int fraction_digits = current - previous; + int leading_zeros = kMaxFractionalDigits - fraction_digits; + + // Overwrite the null terminator from StrCatUInt32 to ensure zero-trunctaion + // works properly. + *current = '0'; + + // Shift fraction values and prepend zeros if necessary. + if (leading_zeros != 0) { + for (int i = 0; i < fraction_digits; i++) { + current--; + *(current + leading_zeros) = *current; + *current = '0'; + } + current += kMaxFractionalDigits; + } + + // Truncate trailing zeros for cleaner logs. Ensure we leave at least one + // fractional character for the case when scaled_fraction is 0. + while (*(current - 1) == '0' && (current - 1) > previous) { + current--; + } + *current = 0; + current = StrCatStr(current, (current_end - current), "*2^"); + current = StrCatInt32(current, (current_end - current), exponent); + return current; +} + +int FormatInt32(char *output, int32_t i) +{ + return static_cast(FastInt32ToBufferLeft(i, output) - output); +} + +int FormatUInt32(char *output, uint32_t i) +{ + return static_cast(FastUInt32ToBufferLeft(i, output, 10) - output); +} + +int FormatHex(char *output, uint32_t i) +{ + return static_cast(FastUInt32ToBufferLeft(i, output, 16) - output); +} + +int FormatFloat(char *output, float i) +{ + return static_cast(FastFloatToBufferLeft(i, output) - output); +} + +} // namespace + +extern "C" int MicroVsnprintf(char *output, int len, const char *format, + va_list args) +{ + int output_index = 0; + const char *current = format; + // One extra character must be left for the null terminator. + const int usable_length = len - 1; + while (*current != '\0' && output_index < usable_length) { + if (*current == '%') { + current++; + switch (*current) { + case 'd': + // Cut off log message if format could exceed log buffer length. + if (usable_length - output_index < kMaxIntCharsNeeded) { + output[output_index++] = '\0'; + return output_index; + } + output_index += + FormatInt32(&output[output_index], va_arg(args, int32_t)); + current++; + break; + case 'u': + if (usable_length - output_index < kMaxIntCharsNeeded) { + output[output_index++] = '\0'; + return output_index; + } + output_index += + FormatUInt32(&output[output_index], va_arg(args, uint32_t)); + current++; + break; + case 'x': + if (usable_length - output_index < kMaxHexCharsNeeded) { + output[output_index++] = '\0'; + return output_index; + } + output[output_index++] = '0'; + output[output_index++] = 'x'; + output_index += + FormatHex(&output[output_index], va_arg(args, uint32_t)); + current++; + break; + case 'f': + if (usable_length - output_index < kMaxFloatCharsNeeded) { + output[output_index++] = '\0'; + return output_index; + } + output_index += + FormatFloat(&output[output_index], va_arg(args, double)); + current++; + break; + case '%': + output[output_index++] = *current++; + break; + case 'c': + if (usable_length - output_index < 1) { + output[output_index++] = '\0'; + return output_index; + } + output[output_index++] = va_arg(args, int32_t); + current++; + break; + case 's': + char *string = va_arg(args, char *); + int string_idx = 0; + while (string_idx + output_index < usable_length && + string[string_idx] != '\0') { + output[output_index++] = string[string_idx++]; + } + current++; + } + } else { + output[output_index++] = *current++; + } + } + output[output_index++] = '\0'; + return output_index; +} + +extern "C" int MicroSnprintf(char *output, int len, const char *format, ...) +{ + va_list args; + va_start(args, format); + int bytes_written = MicroVsnprintf(output, len, format, args); + va_end(args); + return bytes_written; +} diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_string.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_string.h new file mode 100644 index 00000000..0fd29d34 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_string.h @@ -0,0 +1,33 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_STRING_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_STRING_H_ + +#include + +// Implements simple string formatting for numeric types. Returns the number of +// bytes written to output. +extern "C" { +// Functionally equivalent to vsnprintf, trimmed down for TFLite Micro. +// MicroSnprintf() is implemented using MicroVsnprintf(). +int MicroVsnprintf(char *output, int len, const char *format, va_list args); +// Functionally equavalent to snprintf, trimmed down for TFLite Micro. +// For example, MicroSnprintf(buffer, 10, "int %d", 10) will put the string +// "int 10" in the buffer. +// Floating point values are logged in exponent notation (1.XXX*2^N). +int MicroSnprintf(char *output, int len, const char *format, ...); +} + +#endif // TENSORFLOW_LITE_MICRO_MICRO_STRING_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_string_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_string_test.cc new file mode 100644 index 00000000..9c570811 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_string_test.cc @@ -0,0 +1,176 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_string.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FormatPositiveIntShouldMatchExpected) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "Int: 55"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Int: %d", 55); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FormatNegativeIntShouldMatchExpected) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "Int: -55"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Int: %d", -55); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FormatUnsignedIntShouldMatchExpected) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "UInt: 12345"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "UInt: %u", 12345); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FormatHexShouldMatchExpected) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "Hex: 0x12345"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Hex: %x", 0x12345); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FormatFloatShouldMatchExpected) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "Float: 1.0*2^4"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Float: %f", 16.); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FormatCharShouldMatchExpected) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "Chars: @,Z"; + int bytes_written = + MicroSnprintf(buffer, kBufferLen, "Chars: %c,%c", 64, 'Z'); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(BadlyFormattedStringShouldProduceReasonableString) +{ + const int kBufferLen = 32; + char buffer[kBufferLen]; + const char golden[] = "Test Badly % formated % string"; + int bytes_written = + MicroSnprintf(buffer, kBufferLen, "Test Badly %% formated %% string%"); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(IntFormatOverrunShouldTruncate) +{ + const int kBufferLen = 8; + char buffer[kBufferLen]; + const char golden[] = "Int: "; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Int: %d", 12345); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(UnsignedIntFormatOverrunShouldTruncate) +{ + const int kBufferLen = 8; + char buffer[kBufferLen]; + const char golden[] = "UInt: "; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "UInt: %u", 12345); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(HexFormatOverrunShouldTruncate) +{ + const int kBufferLen = 8; + char buffer[kBufferLen]; + const char golden[] = "Hex: "; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Hex: %x", 0x12345); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FloatFormatOverrunShouldTruncate) +{ + const int kBufferLen = 12; + char buffer[kBufferLen]; + const char golden[] = "Float: "; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Float: %x", 12345.); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FloatFormatShouldPrintFractionCorrectly) +{ + const int kBufferLen = 24; + char buffer[kBufferLen]; + const char golden[] = "Float: 1.0625*2^0"; + // Add small offset to float value to account for float rounding error. + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Float: %f", 1.0625001); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(FloatFormatShouldPrintFractionCorrectlyNoLeadingZeros) +{ + const int kBufferLen = 24; + char buffer[kBufferLen]; + const char golden[] = "Float: 1.6332993*2^-1"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "Float: %f", 0.816650); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(StringFormatOverrunShouldTruncate) +{ + const int kBufferLen = 10; + char buffer[kBufferLen]; + const char golden[] = "String: h"; + int bytes_written = + MicroSnprintf(buffer, kBufferLen, "String: %s", "hello world"); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TEST(StringFormatWithExactOutputSizeOverrunShouldTruncate) +{ + const int kBufferLen = 10; + char buffer[kBufferLen]; + const char golden[] = "format st"; + int bytes_written = MicroSnprintf(buffer, kBufferLen, "format str"); + TF_LITE_MICRO_EXPECT_EQ(static_cast(sizeof(golden)), bytes_written); + TF_LITE_MICRO_EXPECT_STRING_EQ(golden, buffer); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_time.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_time.cc new file mode 100644 index 00000000..e44824b7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_time.cc @@ -0,0 +1,71 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// Reference implementation of timer functions. Platforms are not required to +// implement these timer methods, but they are required to enable profiling. + +// On platforms that have a POSIX stack or C library, it can be written using +// methods from or clock() from . + +// To add an equivalent function for your own platform, create your own +// implementation file, and place it in a subfolder with named after the OS +// you're targeting. For example, see the Cortex M bare metal version in +// tensorflow/lite/micro/bluepill/micro_time.cc or the mbed one on +// tensorflow/lite/micro/mbed/micro_time.cc. + +#include "tensorflow/lite/micro/micro_time.h" + +#if defined(TF_LITE_USE_CTIME) +#include +#endif + +namespace tflite { + +#if !defined(TF_LITE_USE_CTIME) + +// Reference implementation of the ticks_per_second() function that's required +// for a platform to support Tensorflow Lite for Microcontrollers profiling. +// This returns 0 by default because timing is an optional feature that builds +// without errors on platforms that do not need it. +int32_t ticks_per_second() +{ + return 0; +} + +// Reference implementation of the GetCurrentTimeTicks() function that's +// required for a platform to support Tensorflow Lite for Microcontrollers +// profiling. This returns 0 by default because timing is an optional feature +// that builds without errors on platforms that do not need it. +int32_t GetCurrentTimeTicks() +{ + return 0; +} + +#else // defined(TF_LITE_USE_CTIME) + +// For platforms that support ctime, we implment the micro_time interface in +// this central location. +int32_t ticks_per_second() +{ + return CLOCKS_PER_SEC; +} + +int32_t GetCurrentTimeTicks() +{ + return clock(); +} +#endif + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_time.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_time.h new file mode 100644 index 00000000..a02d8b02 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_time.h @@ -0,0 +1,36 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_MICRO_TIME_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_TIME_H_ + +#include + +namespace tflite { +// These functions should be implemented by each target platform, and provide an +// accurate tick count along with how many ticks there are per second. +int32_t ticks_per_second(); + +// Return time in ticks. The meaning of a tick varies per platform. +int32_t GetCurrentTimeTicks(); + +inline int32_t TicksToMs(int32_t ticks) +{ + return static_cast(1000.0f * static_cast(ticks) / + static_cast(ticks_per_second())); +} + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_TIME_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_time_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_time_test.cc new file mode 100644 index 00000000..f450cf5e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_time_test.cc @@ -0,0 +1,49 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_time.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestBasicTimerFunctionality) +{ + int32_t ticks_per_second = tflite::ticks_per_second(); + + // Retry enough times to guarantee a tick advance, while not taking too long + // to complete. With 1e6 retries, assuming each loop takes tens of cycles, + // this will retry for less than 10 seconds on a 10MHz platform. + constexpr int kMaxRetries = 1e6; + int start_time = tflite::GetCurrentTimeTicks(); + + if (ticks_per_second != 0) { + for (int i = 0; i < kMaxRetries; i++) { + if (tflite::GetCurrentTimeTicks() - start_time > 0) { + break; + } + } + } + + // Ensure the timer is increasing. This works for the overflow case too, since + // (MIN_INT + x) - (MAX_INT - y) == x + y + 1. For example, + // 0x80000001(min int + 1) - 0x7FFFFFFE(max int - 1) = 0x00000003 == 3. + // GetTicksPerSecond() == 0 means the timer is not implemented on this + // platform. + TF_LITE_MICRO_EXPECT(ticks_per_second == 0 || + tflite::GetCurrentTimeTicks() - start_time > 0); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_utils.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_utils.cc new file mode 100644 index 00000000..6334b165 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_utils.cc @@ -0,0 +1,82 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_utils.h" + +#include +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/op_macros.h" + +namespace tflite { + +int ElementCount(const TfLiteIntArray &dims) +{ + int result = 1; + for (int i = 0; i < dims.size; ++i) { + result *= dims.data[i]; + } + return result; +} + +void SignedSymmetricPerChannelQuantize(const float *values, + TfLiteIntArray *dims, + int quantized_dimension, + int8_t *quantized_values, + float *scaling_factors) +{ + int input_size = ElementCount(*dims); + int channel_count = dims->data[quantized_dimension]; + int per_channel_size = input_size / channel_count; + + int stride; + int channel_stride; + if (quantized_dimension == 0) { + stride = 1; + channel_stride = per_channel_size; + } else if (quantized_dimension == 3) { + stride = channel_count; + channel_stride = 1; + } else { + TF_LITE_FATAL("quantized dimension must be 0 or 3"); + } + + // Calculate scales for each channel. + for (int channel = 0; channel < channel_count; channel++) { + float min = 0; + float max = 0; + + for (int i = 0; i < per_channel_size; i++) { + int idx = channel * channel_stride + i * stride; + min = fminf(min, values[idx]); + max = fmaxf(max, values[idx]); + } + scaling_factors[channel] = + fmaxf(fabs(min), fabs(max)) / std::numeric_limits::max(); + for (int i = 0; i < per_channel_size; i++) { + int idx = channel * channel_stride + i * stride; + const int32_t quantized_value = + static_cast(roundf(values[idx] / scaling_factors[channel])); + // Clamp: just in case some odd numeric offset. + quantized_values[idx] = + fminf(std::numeric_limits::max(), + fmaxf(std::numeric_limits::min() + 1, quantized_value)); + } + } +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_utils.h b/components/TensorFlowLite/tensorflow/lite/micro/micro_utils.h new file mode 100644 index 00000000..16b92542 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_utils.h @@ -0,0 +1,143 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MICRO_UTILS_H_ +#define TENSORFLOW_LITE_MICRO_MICRO_UTILS_H_ + +#include +#include +#include +#include + +#include "tensorflow/lite/c/common.h" + +namespace tflite { +// Returns number of elements in the shape array. + +int ElementCount(const TfLiteIntArray &dims); + +// Converts a float value into a quantized value. Note that large values (close +// to max int and min int) may see significant error due to a lack of floating +// point granularity for large values. +template +T FloatToQuantizedType(const float value, const float scale, int zero_point) +{ + int32_t result = round(value / scale) + zero_point; + result = + std::max(static_cast(std::numeric_limits::min()), result); + result = + std::min(static_cast(std::numeric_limits::max()), result); + return result; +} + +template +T FloatToSymmetricQuantizedType(const float value, const float scale) +{ + // 64-bit values are required since 8x16 conv accumulates to int64, meaning + // an int64 bias is required. + std::int64_t result = round(value / scale); + result = std::max( + static_cast(std::numeric_limits::min() + 1), result); + result = std::min(static_cast(std::numeric_limits::max()), + result); + return result; +} + +// Helper methods to quantize arrays of floats to the desired format. +// +// There are several key flavors of quantization in TfLite: +// asymmetric symmetric per channel +// int8_t | X | X | X | +// uint8_t | X | X | | +// int16_t | X | | | +// int32_t | | X | X | +// +// The per-op quantization spec can be found here: +// https://www.tensorflow.org/lite/performance/quantization_spec +template +void Quantize(const float *input, T *output, int num_elements, float scale, + int zero_point) +{ + for (int i = 0; i < num_elements; i++) { + output[i] = FloatToQuantizedType(input[i], scale, zero_point); + } +} + +template +void SymmetricQuantize(const float *input, T *output, int num_elements, + float scale) +{ + for (int i = 0; i < num_elements; i++) { + output[i] = FloatToSymmetricQuantizedType(input[i], scale); + } +} + +template +void SymmetricPerChannelQuantize(const float *input, T *output, + int num_elements, int num_channels, + float *scales) +{ + int elements_per_channel = num_elements / num_channels; + for (int i = 0; i < num_channels; i++) { + for (int j = 0; j < elements_per_channel; j++) { + output[i * elements_per_channel + j] = FloatToSymmetricQuantizedType( + input[i * elements_per_channel + j], scales[i]); + } + } +} + +void SignedSymmetricPerChannelQuantize(const float *values, + TfLiteIntArray *dims, + int quantized_dimension, + int8_t *quantized_values, + float *scaling_factor); + +// Quantizes inputs based on the values provided, choosing the smallest range +// which includes all input values. +template +void SymmetricQuantizeCalculateScales(const float *values, TfLiteIntArray *dims, + T *output, float *scale) +{ + int input_size = ElementCount(*dims); + + float min = 0; + float max = 0; + for (int i = 0; i < input_size; i++) { + min = fminf(min, values[i]); + max = fmaxf(max, values[i]); + } + *scale = fmaxf(std::abs(min), std::abs(max)) / std::numeric_limits::max(); + for (int i = 0; i < input_size; i++) { + const int32_t quantized_value = + static_cast(roundf(values[i] / *scale)); + // Clamp: just in case some odd numeric offset. + quantized_value = fminf(std::numeric_limits::max(), quantized_value); + quantized_value = fmaxf(std::numeric_limits::min() + 1, quantized_value); + output[i] = quantized_value; + } +} + +template +void Dequantize(const T *values, const int size, const float scale, + int zero_point, float *dequantized_values) +{ + for (int i = 0; i < size; ++i) { + dequantized_values[i] = (values[i] - zero_point) * scale; + } +} + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MICRO_UTILS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/micro_utils_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/micro_utils_test.cc new file mode 100644 index 00000000..397795b3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/micro_utils_test.cc @@ -0,0 +1,127 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/micro_utils.h" + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(FloatToAsymmetricQuantizedUInt8Test) +{ + using tflite::FloatToQuantizedType; + // [0, 127.5] -> zero_point=0, scale=0.5 + TF_LITE_MICRO_EXPECT_EQ(0, FloatToQuantizedType(0, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(254, FloatToQuantizedType(127, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(255, FloatToQuantizedType(127.5, 0.5, 0)); + // [-10, 245] -> zero_point=10, scale=1.0 + TF_LITE_MICRO_EXPECT_EQ(0, FloatToQuantizedType(-10, 1.0, 10)); + TF_LITE_MICRO_EXPECT_EQ(1, FloatToQuantizedType(-9, 1.0, 10)); + TF_LITE_MICRO_EXPECT_EQ(128, FloatToQuantizedType(118, 1.0, 10)); + TF_LITE_MICRO_EXPECT_EQ(253, FloatToQuantizedType(243, 1.0, 10)); + TF_LITE_MICRO_EXPECT_EQ(254, FloatToQuantizedType(244, 1.0, 10)); + TF_LITE_MICRO_EXPECT_EQ(255, FloatToQuantizedType(245, 1.0, 10)); +} + +TF_LITE_MICRO_TEST(FloatToAsymmetricQuantizedInt8Test) +{ + using tflite::FloatToQuantizedType; + // [-64, 63.5] -> zero_point=0, scale=0.5 + TF_LITE_MICRO_EXPECT_EQ(2, FloatToQuantizedType(1, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(4, FloatToQuantizedType(2, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(6, FloatToQuantizedType(3, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(-10, FloatToQuantizedType(-5, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(-128, FloatToQuantizedType(-64, 0.5, 0)); + TF_LITE_MICRO_EXPECT_EQ(127, FloatToQuantizedType(63.5, 0.5, 0)); + // [-127, 128] -> zero_point=-1, scale=1.0 + TF_LITE_MICRO_EXPECT_EQ(0, FloatToQuantizedType(1, 1.0, -1)); + TF_LITE_MICRO_EXPECT_EQ(-1, FloatToQuantizedType(0, 1.0, -1)); + TF_LITE_MICRO_EXPECT_EQ(126, FloatToQuantizedType(127, 1.0, -1)); + TF_LITE_MICRO_EXPECT_EQ(127, FloatToQuantizedType(128, 1.0, -1)); + TF_LITE_MICRO_EXPECT_EQ(-127, FloatToQuantizedType(-126, 1.0, -1)); + TF_LITE_MICRO_EXPECT_EQ(-128, FloatToQuantizedType(-127, 1.0, -1)); +} + +TF_LITE_MICRO_TEST(FloatToSymmetricQuantizedInt8Test) +{ + using tflite::FloatToSymmetricQuantizedType; + // [-64, 63.5] -> zero_point=0, scale=0.5 + TF_LITE_MICRO_EXPECT_EQ(2, FloatToSymmetricQuantizedType(1, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(4, FloatToSymmetricQuantizedType(2, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(6, FloatToSymmetricQuantizedType(3, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(-10, FloatToSymmetricQuantizedType(-5, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(-127, + FloatToSymmetricQuantizedType(-64, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(127, + FloatToSymmetricQuantizedType(63.5, 0.5)); + // [-127, 128] -> zero_point=-1, scale=1.0 + TF_LITE_MICRO_EXPECT_EQ(1, FloatToSymmetricQuantizedType(1, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(0, FloatToSymmetricQuantizedType(0, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(127, FloatToSymmetricQuantizedType(127, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(127, FloatToSymmetricQuantizedType(128, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(-126, + FloatToSymmetricQuantizedType(-126, 1.0)); + TF_LITE_MICRO_EXPECT_EQ(-127, + FloatToSymmetricQuantizedType(-127, 1.0)); +} + +TF_LITE_MICRO_TEST(FloatToAsymmetricQuantizedInt32Test) +{ + using tflite::FloatToSymmetricQuantizedType; + TF_LITE_MICRO_EXPECT_EQ(0, FloatToSymmetricQuantizedType(0, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(2, FloatToSymmetricQuantizedType(1, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(-2, FloatToSymmetricQuantizedType(-1, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(-100, + FloatToSymmetricQuantizedType(-50, 0.5)); + TF_LITE_MICRO_EXPECT_EQ(100, FloatToSymmetricQuantizedType(50, 0.5)); +} + +TF_LITE_MICRO_TEST(AsymmetricQuantizeInt8) +{ + float values[] = { -10.3, -3.1, -2.1, -1.9, -0.9, 0.1, 0.9, 1.85, 2.9, 4.1 }; + int8_t goldens[] = { -20, -5, -3, -3, -1, 1, 3, 5, 7, 9 }; + constexpr int length = sizeof(values) / sizeof(float); + int8_t quantized[length]; + tflite::Quantize(values, quantized, length, 0.5, 1); + for (int i = 0; i < length; i++) { + TF_LITE_MICRO_EXPECT_EQ(quantized[i], goldens[i]); + } +} + +TF_LITE_MICRO_TEST(AsymmetricQuantizeUInt8) +{ + float values[] = { -10.3, -3.1, -2.1, -1.9, -0.9, 0.1, 0.9, 1.85, 2.9, 4.1 }; + uint8_t goldens[] = { 106, 121, 123, 123, 125, 127, 129, 131, 133, 135 }; + constexpr int length = sizeof(values) / sizeof(float); + uint8_t quantized[length]; + tflite::Quantize(values, quantized, length, 0.5, 127); + for (int i = 0; i < length; i++) { + TF_LITE_MICRO_EXPECT_EQ(quantized[i], goldens[i]); + } +} + +TF_LITE_MICRO_TEST(SymmetricQuantizeInt32) +{ + float values[] = { -10.3, -3.1, -2.1, -1.9, -0.9, 0.1, 0.9, 1.85, 2.9, 4.1 }; + int32_t goldens[] = { -21, -6, -4, -4, -2, 0, 2, 4, 6, 8 }; + constexpr int length = sizeof(values) / sizeof(float); + int32_t quantized[length]; + tflite::SymmetricQuantize(values, quantized, length, 0.5); + for (int i = 0; i < length; i++) { + TF_LITE_MICRO_EXPECT_EQ(quantized[i], goldens[i]); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.cc b/components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.cc new file mode 100644 index 00000000..58d17ad9 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.cc @@ -0,0 +1,82 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/mock_micro_graph.h" + +#include "tensorflow/lite/micro/test_helpers.h" + +namespace tflite { + +MockMicroGraph::MockMicroGraph(SimpleMemoryAllocator *allocator) + : MicroGraph(nullptr, nullptr, nullptr), + allocator_(allocator), + init_count_(0), + prepare_count_(0), + free_count_(0) +{ + memset(invoke_counts_, 0, sizeof(invoke_counts_)); + mock_tensor_ = + reinterpret_cast(allocator_->AllocateFromTail( + sizeof(TfLiteEvalTensor), alignof(TfLiteEvalTensor))); + int *dims_array = reinterpret_cast( + allocator_->AllocateFromTail(3 * sizeof(int), alignof(int))); + float *data_array = reinterpret_cast( + allocator_->AllocateFromTail(2 * sizeof(float), alignof(float))); + int dims[] = { 2, 1, 2 }; + memcpy(dims_array, dims, 3 * sizeof(int)); + mock_tensor_->dims = testing::IntArrayFromInts(dims_array); + mock_tensor_->data.f = data_array; + mock_tensor_->type = kTfLiteFloat32; +} + +TfLiteStatus MockMicroGraph::InvokeSubgraph(int subgraph_idx) +{ + invoke_counts_[subgraph_idx]++; + return kTfLiteOk; +} + +TfLiteStatus MockMicroGraph::ResetVariableTensors() +{ + return kTfLiteOk; +} + +size_t MockMicroGraph::NumSubgraphInputs(int subgraph_idx) +{ + return 1; +} + +TfLiteEvalTensor *MockMicroGraph::GetSubgraphInput(int subgraph_idx, + int tensor_idx) +{ + return mock_tensor_; +} + +size_t MockMicroGraph::NumSubgraphOutputs(int subgraph_idx) +{ + return 1; +} + +TfLiteEvalTensor *MockMicroGraph::GetSubgraphOutput(int subgraph_idx, + int tensor_idx) +{ + return mock_tensor_; +} + +int MockMicroGraph::NumSubgraphs() +{ + return kMaxSubgraphs; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.h b/components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.h new file mode 100644 index 00000000..1c6366a7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/mock_micro_graph.h @@ -0,0 +1,69 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_MOCK_MICRO_GRAPH_H_ +#define TENSORFLOW_LITE_MICRO_MOCK_MICRO_GRAPH_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/micro/micro_graph.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +// MockMicroGraph stubs out all MicroGraph methods used during invoke. A count +// of the number of calls to invoke for each subgraph is maintained for +// validation of control flow operators. +class MockMicroGraph : public MicroGraph { +public: + explicit MockMicroGraph(SimpleMemoryAllocator *allocator); + TfLiteStatus InvokeSubgraph(int subgraph_idx) override; + TfLiteStatus ResetVariableTensors() override; + size_t NumSubgraphInputs(int subgraph_idx) override; + TfLiteEvalTensor *GetSubgraphInput(int subgraph_idx, int tensor_idx) override; + size_t NumSubgraphOutputs(int subgraph_idx) override; + TfLiteEvalTensor *GetSubgraphOutput(int subgraph_idx, + int tensor_idx) override; + int NumSubgraphs() override; + int get_init_count() const + { + return init_count_; + } + int get_prepare_count() const + { + return prepare_count_; + } + int get_free_count() const + { + return free_count_; + } + int get_invoke_count(int subgraph_idx) const + { + return invoke_counts_[subgraph_idx]; + } + +private: + static constexpr int kMaxSubgraphs = 10; + SimpleMemoryAllocator *allocator_; + TfLiteEvalTensor *mock_tensor_; + int init_count_; + int prepare_count_; + int free_count_; + int invoke_counts_[kMaxSubgraphs]; + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_MOCK_MICRO_GRAPH_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.cc new file mode 100644 index 00000000..f03227d2 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.cc @@ -0,0 +1,4 @@ +#include "person_detect_model_data.h" + +alignas(16) const unsigned char g_person_detect_model_data[] = {0x1c,0x00,0x00,0x00,0x54,0x46,0x4c,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x84,0x95,0x04,0x00,0xec,0x5b,0x03,0x00,0xd4,0x5b,0x03,0x00,0x04,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0xc4,0x5b,0x03,0x00,0xac,0x5b,0x03,0x00,0x94,0x5b,0x03,0x00,0x84,0x59,0x03,0x00,0x74,0x55,0x03,0x00,0x64,0x55,0x02,0x00,0x54,0x51,0x02,0x00,0x44,0x48,0x02,0x00,0x34,0x44,0x02,0x00,0x24,0x42,0x02,0x00,0x94,0x3d,0x02,0x00,0x84,0x3b,0x02,0x00,0x74,0xfb,0x01,0x00,0xe4,0xf6,0x01,0x00,0xd4,0xb6,0x01,0x00,0xc4,0xb4,0x01,0x00,0xb4,0x74,0x01,0x00,0xa4,0x72,0x01,0x00,0x94,0x70,0x01,0x00,0x84,0x6e,0x01,0x00,0x74,0x2e,0x01,0x00,0x64,0xee,0x00,0x00,0x54,0xec,0x00,0x00,0xc4,0xe7,0x00,0x00,0xb4,0xe5,0x00,0x00,0xa4,0xc5,0x00,0x00,0x94,0xc4,0x00,0x00,0x44,0xc2,0x00,0x00,0x34,0xb2,0x00,0x00,0x24,0xb1,0x00,0x00,0x14,0xa9,0x00,0x00,0x84,0xa8,0x00,0x00,0x54,0xa7,0x00,0x00,0x44,0xa3,0x00,0x00,0xb4,0xa2,0x00,0x00,0x84,0xa1,0x00,0x00,0x34,0xa1,0x00,0x00,0x2c,0xa1,0x00,0x00,0x24,0xa1,0x00,0x00,0x1c,0xa1,0x00,0x00,0x14,0xa1,0x00,0x00,0x0c,0xa1,0x00,0x00,0x04,0xa1,0x00,0x00,0xfc,0xa0,0x00,0x00,0xf4,0xa0,0x00,0x00,0xec,0xa0,0x00,0x00,0xe4,0xa0,0x00,0x00,0xdc,0xa0,0x00,0x00,0x8c,0xa0,0x00,0x00,0x84,0xa0,0x00,0x00,0x7c,0xa0,0x00,0x00,0x74,0xa0,0x00,0x00,0x6c,0xa0,0x00,0x00,0x64,0xa0,0x00,0x00,0x5c,0xa0,0x00,0x00,0x4c,0x9e,0x00,0x00,0x1c,0x9e,0x00,0x00,0x14,0x9e,0x00,0x00,0x74,0x9d,0x00,0x00,0xe4,0x9c,0x00,0x00,0x8c,0x9c,0x00,0x00,0x7c,0x9a,0x00,0x00,0xec,0x99,0x00,0x00,0x5c,0x99,0x00,0x00,0x54,0x99,0x00,0x00,0x4c,0x99,0x00,0x00,0x44,0x99,0x00,0x00,0x3c,0x99,0x00,0x00,0xe4,0x98,0x00,0x00,0xd4,0x18,0x00,0x00,0xc4,0x16,0x00,0x00,0x34,0x12,0x00,0x00,0xa4,0x0d,0x00,0x00,0x9c,0x0d,0x00,0x00,0x94,0x0d,0x00,0x00,0x8c,0x0d,0x00,0x00,0x7c,0x0c,0x00,0x00,0x2c,0x0a,0x00,0x00,0x1c,0x08,0x00,0x00,0x14,0x08,0x00,0x00,0x84,0x03,0x00,0x00,0x7c,0x03,0x00,0x00,0x4c,0x03,0x00,0x00,0x3c,0x01,0x00,0x00,0x2c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0xfc,0xfb,0xff,0x80,0xfc,0xfb,0xff,0x84,0xfc,0xfb,0xff,0x88,0xfc,0xfb,0xff,0x8c,0xfc,0xfb,0xff,0xba,0xa4,0xfc,0xff,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x37,0x0f,0x00,0x00,0x5d,0xe6,0xff,0xff,0x75,0xdd,0xff,0xff,0xee,0xf7,0xff,0xff,0xa4,0xfa,0xff,0xff,0xc7,0xf5,0xff,0xff,0x0a,0x0c,0x00,0x00,0xdb,0x16,0x00,0x00,0x06,0x09,0x00,0x00,0x81,0x1b,0x00,0x00,0xc1,0x29,0x00,0x00,0xd2,0x18,0x00,0x00,0xd0,0xf6,0xff,0xff,0x93,0x5c,0x00,0x00,0xf3,0xb9,0xff,0xff,0x0a,0x28,0x00,0x00,0xed,0xe9,0xff,0xff,0x86,0xc9,0xff,0xff,0x28,0x27,0x00,0x00,0x77,0x04,0x00,0x00,0x7a,0xd0,0xff,0xff,0xad,0x58,0x00,0x00,0x1c,0x4b,0x00,0x00,0xb0,0x9b,0xff,0xff,0xb5,0xce,0xff,0xff,0xfc,0x12,0x00,0x00,0x3e,0xfd,0xff,0xff,0x4b,0xf5,0xff,0xff,0xae,0xcb,0xff,0xff,0xc3,0x39,0x00,0x00,0x56,0xd1,0xff,0xff,0x3d,0x19,0x00,0x00,0x4b,0x18,0x00,0x00,0x36,0x01,0x00,0x00,0xc6,0x6a,0x00,0x00,0xca,0xb0,0xff,0xff,0xb4,0x08,0x00,0x00,0x3b,0x4b,0x00,0x00,0xc9,0xbe,0xff,0xff,0xd4,0x12,0x00,0x00,0xe2,0xf4,0xff,0xff,0x36,0xff,0xff,0xff,0xd0,0xef,0xff,0xff,0x08,0xcc,0xff,0xff,0xa7,0xd3,0xff,0xff,0x9c,0x08,0x00,0x00,0x03,0x1b,0x00,0x00,0xaf,0xa2,0xff,0xff,0x71,0x13,0x00,0x00,0x0c,0x7b,0x00,0x00,0xf2,0x03,0x00,0x00,0x83,0x00,0x00,0x00,0x1e,0x29,0x00,0x00,0x0c,0x04,0x00,0x00,0x92,0x59,0x00,0x00,0x27,0xd4,0xff,0xff,0x30,0x0c,0x00,0x00,0xfa,0xfb,0xff,0xff,0x17,0xca,0xff,0xff,0x92,0xd3,0xff,0xff,0x6c,0x11,0x00,0x00,0xc9,0xff,0xff,0xff,0x78,0x00,0x00,0x00,0x4f,0x43,0x00,0x00,0xc6,0xa5,0xfc,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x6e,0xcc,0xff,0xff,0x69,0x36,0x00,0x00,0xfb,0xee,0xff,0xff,0x24,0x4c,0x00,0x00,0xb3,0x07,0x00,0x00,0x96,0x3f,0x00,0x00,0xe1,0xd2,0xff,0xff,0xf7,0xfd,0xff,0xff,0x01,0x4f,0x00,0x00,0x9b,0xea,0xff,0xff,0xcc,0xe4,0xff,0xff,0xb2,0x00,0x00,0x00,0x52,0xed,0xff,0xff,0xef,0xad,0xff,0xff,0xef,0x34,0x00,0x00,0x37,0x0c,0x00,0x00,0xea,0x47,0x00,0x00,0xf8,0xed,0xff,0xff,0xa0,0xef,0xff,0xff,0xea,0x43,0x00,0x00,0x17,0xed,0xff,0xff,0xab,0xfd,0xff,0xff,0x0b,0xf8,0xff,0xff,0x37,0x26,0x00,0x00,0x33,0xea,0xff,0xff,0x0e,0x1e,0x00,0x00,0xc4,0x09,0x00,0x00,0x6f,0x1f,0x00,0x00,0xfc,0x69,0xff,0xff,0x9c,0xd9,0xff,0xff,0xc1,0xf0,0xff,0xff,0x89,0x19,0x00,0x00,0x9c,0x29,0x00,0x00,0x10,0xb7,0xff,0xff,0x2f,0xd9,0xff,0xff,0x23,0xe9,0xff,0xff,0xaf,0x57,0x00,0x00,0x05,0x48,0x00,0x00,0x30,0xf7,0xff,0xff,0x1c,0x12,0x00,0x00,0xa7,0xcc,0xff,0xff,0xd0,0xc6,0xff,0xff,0x9d,0xea,0xff,0xff,0x9a,0xfc,0xff,0xff,0xc1,0xcc,0xff,0xff,0x63,0xcf,0xff,0xff,0xa8,0x11,0x00,0x00,0x1d,0xfd,0xff,0xff,0xfc,0xfa,0xff,0xff,0x14,0xe9,0xff,0xff,0xb5,0x37,0x00,0x00,0x46,0x21,0x00,0x00,0x3e,0x02,0x00,0x00,0x77,0xd2,0xff,0xff,0x0e,0xe5,0xff,0xff,0xde,0x24,0x00,0x00,0xe9,0x28,0x00,0x00,0xdc,0x6d,0xff,0xff,0x59,0xb6,0xff,0xff,0xb8,0x0d,0x00,0x00,0x89,0xf5,0xff,0xff,0xf5,0x25,0x00,0x00,0xd6,0x1e,0x00,0x00,0x03,0x32,0x00,0x00,0x2f,0x1f,0x00,0x00,0xe1,0xfa,0xff,0xff,0x59,0xd8,0xff,0xff,0x85,0x3e,0x00,0x00,0xae,0xea,0xff,0xff,0x72,0x3e,0x00,0x00,0x87,0xfd,0xff,0xff,0x27,0x57,0x00,0x00,0x0b,0xf2,0xff,0xff,0xc2,0x1c,0x00,0x00,0xd9,0x20,0x00,0x00,0xf9,0x2e,0x00,0x00,0x84,0xfd,0xff,0xff,0x6b,0x22,0x00,0x00,0x2b,0x94,0xff,0xff,0xdf,0xfd,0xff,0xff,0x80,0xee,0xff,0xff,0x4d,0xe6,0xff,0xff,0x71,0xd4,0xff,0xff,0xd6,0xd8,0xff,0xff,0xdc,0x4d,0x00,0x00,0xfc,0xb8,0xff,0xff,0xa6,0x45,0x00,0x00,0xa5,0xf1,0xff,0xff,0x63,0x31,0x00,0x00,0x3c,0xd8,0xff,0xff,0x12,0x29,0x00,0x00,0x34,0xdb,0xff,0xff,0xae,0x57,0x00,0x00,0x6c,0xc9,0xff,0xff,0x1b,0x2f,0x00,0x00,0x44,0x28,0x00,0x00,0x34,0xf3,0xff,0xff,0xdd,0x1c,0x00,0x00,0x01,0x10,0x00,0x00,0xaa,0x02,0x00,0x00,0x23,0x41,0x00,0x00,0x97,0x0e,0x00,0x00,0xcf,0x1b,0x00,0x00,0x50,0x17,0x00,0x00,0x67,0x8b,0xff,0xff,0x22,0x0b,0x00,0x00,0x56,0xd1,0xff,0xff,0xfe,0xe8,0xff,0xff,0x8d,0x31,0x00,0x00,0xc9,0xd1,0xff,0xff,0x98,0x10,0x00,0x00,0x9c,0x44,0x00,0x00,0x0f,0x0b,0x00,0x00,0xd4,0x3e,0x00,0x00,0x64,0x19,0x00,0x00,0x0c,0xe8,0xff,0xff,0xcc,0x04,0x00,0x00,0xcc,0xb7,0xff,0xff,0xea,0x3d,0x00,0x00,0x30,0x19,0x00,0x00,0x70,0x06,0x00,0x00,0x14,0x2f,0x00,0x00,0xcb,0xd4,0xff,0xff,0xd2,0xee,0xff,0xff,0x4e,0x26,0x00,0x00,0xd4,0x23,0x00,0x00,0xa0,0x55,0x00,0x00,0x2e,0x15,0x00,0x00,0xd2,0xa7,0xfc,0xff,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xbe,0x0e,0x00,0x00,0x95,0xff,0xff,0xff,0x56,0xb6,0xfe,0xff,0xac,0xc9,0xff,0xff,0xd9,0x50,0x00,0x00,0xfa,0xff,0xff,0xff,0xdf,0x2c,0x00,0x00,0x9a,0xcb,0xfd,0xff,0xd4,0xff,0xfb,0xff,0x02,0xa8,0xfc,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x5e,0xac,0x7e,0x7f,0xdc,0xf2,0xcc,0x39,0x8c,0x81,0x5e,0xa5,0xa7,0x7f,0xbd,0x37,0x45,0x1b,0xf3,0x74,0x7f,0x1e,0xc4,0xfb,0x00,0xbe,0xfc,0xfa,0x03,0x22,0x7f,0x59,0x38,0xac,0x75,0xeb,0x56,0xa8,0x9e,0x00,0x9a,0x99,0xf4,0xa2,0x5f,0x08,0x7f,0x44,0xc9,0x01,0x36,0x0d,0xde,0xc2,0xbf,0xa4,0x01,0x7f,0xf8,0x1a,0xd2,0xec,0x01,0x41,0x41,0x0f,0x0c,0xd8,0x05,0xd6,0x4f,0x81,0x37,0x2e,0x63,0x7f,0x2e,0x1c,0xd1,0xab,0xbe,0x52,0xb3,0x7f,0x7f,0x14,0xa3,0xe0,0xad,0x7f,0xc1,0x69,0xc3,0xc7,0xf7,0x71,0xc6,0xaf,0x81,0x25,0x7f,0x75,0x18,0xc4,0xcf,0xdd,0x4f,0x1d,0x9b,0x04,0xa4,0xe9,0x81,0xb0,0x31,0x89,0x4f,0x1f,0x14,0x4d,0x78,0x24,0x81,0x7f,0xfb,0x81,0xf5,0xe8,0x4f,0xc5,0x7f,0x10,0x26,0x50,0xce,0xe5,0xf4,0x00,0x0c,0xac,0xd6,0x4f,0x50,0x42,0x7f,0x0d,0xe7,0x35,0x3c,0xfd,0x4b,0xf1,0xae,0x18,0xfb,0xc9,0x1f,0xe3,0x52,0x3d,0x7f,0xe8,0x44,0x7f,0x3a,0xd7,0xe1,0x3d,0x8b,0xba,0xc4,0x57,0x3b,0x1d,0x1b,0x26,0x8e,0x45,0x3b,0xcd,0x4d,0xcc,0x14,0xb0,0x2e,0x60,0xed,0xf8,0xb0,0xfe,0xf9,0x30,0xfc,0x22,0x7c,0xc0,0x15,0x70,0x70,0x20,0x7f,0x9c,0x4d,0x06,0x11,0xc8,0xb5,0xc7,0xc1,0x2a,0xb8,0x51,0x1b,0x4e,0xbd,0x9d,0x5e,0x30,0xd3,0x47,0xc5,0x49,0xe9,0x20,0xc7,0x2c,0xf0,0x59,0xdf,0x47,0x2e,0xd5,0x9e,0x9e,0xa7,0xd1,0x81,0xf9,0xd7,0x15,0x9c,0xa6,0x6d,0xfe,0x7f,0x79,0x7f,0xd7,0x7f,0x4f,0xdf,0x7a,0x00,0xbf,0x7f,0xd6,0x48,0x93,0x3d,0x5a,0x7f,0xca,0x81,0x42,0xbc,0xb6,0x67,0xb7,0xae,0x40,0xc0,0x7f,0x2f,0x12,0x3a,0x7f,0x22,0x43,0x42,0xec,0xc1,0x21,0x07,0xf0,0x18,0xc9,0x11,0x30,0x21,0xef,0x26,0x44,0xdd,0xc0,0xaf,0x9d,0xa9,0x20,0xb5,0x00,0xbd,0x0d,0x54,0x45,0x7f,0x0d,0x3b,0x03,0x1a,0xaa,0x21,0xc4,0xec,0x63,0xf9,0x09,0x08,0x0b,0x20,0x2e,0xd4,0x56,0x73,0x13,0xed,0x76,0x81,0xd7,0x4d,0xfb,0x14,0xf4,0xf7,0x23,0xc4,0x99,0xbc,0x1c,0x14,0x6a,0x05,0xe0,0x8a,0x5c,0x8a,0xf7,0xb1,0x30,0xf4,0xf3,0x08,0x0b,0xfb,0x7f,0xaf,0x39,0x78,0x77,0x25,0xda,0xbd,0x9e,0xcf,0x26,0xf3,0x1e,0xd8,0x08,0x5c,0xcc,0x77,0xaa,0x07,0xfa,0x08,0x14,0xce,0x11,0xa1,0x71,0xa8,0x8c,0x5a,0xf2,0xd5,0x9f,0x60,0x54,0xd5,0x21,0xbe,0x7f,0xa4,0xa3,0x7f,0x74,0x81,0x5c,0x81,0xd4,0x15,0x13,0x7f,0x68,0x19,0x7f,0xda,0x68,0xf9,0x20,0x64,0x1e,0xcd,0xe3,0x03,0x16,0x4f,0xbe,0x45,0xe8,0xfd,0x8d,0xd9,0xf3,0xd1,0xa0,0x90,0x81,0xfc,0x81,0x2c,0x68,0xca,0x21,0x0a,0x17,0xff,0x81,0xe5,0x81,0x39,0x04,0x00,0xc6,0xb3,0x7f,0x2a,0xd7,0x1b,0xd8,0x35,0xa4,0x7f,0x47,0x5c,0xf7,0x76,0x67,0x24,0xef,0x4e,0x41,0xab,0xcc,0xd2,0x7f,0x81,0x4f,0x35,0x7f,0xb8,0x99,0xf9,0x25,0x98,0x7f,0x81,0x6f,0xf5,0x7f,0xd5,0xc3,0xc9,0xd7,0x59,0x92,0x2b,0xcd,0x99,0x94,0x7f,0x1e,0xb1,0x40,0xcc,0x15,0x8d,0x77,0x63,0xba,0x24,0x2b,0x28,0x46,0xd1,0x7f,0xa2,0xc3,0xd2,0xa1,0x3b,0x05,0x26,0xd1,0x1c,0x19,0xe1,0x04,0x9a,0x15,0x81,0xb9,0x41,0x05,0x9f,0xe8,0x49,0x18,0x1b,0x05,0x30,0x71,0xe4,0x17,0x7f,0x7f,0x02,0x6f,0x64,0xee,0x30,0xcd,0x04,0x27,0x4b,0xeb,0x7f,0x7f,0xf4,0xca,0xc5,0x7f,0xb9,0x08,0x84,0x3c,0x43,0x8b,0x6f,0x6b,0x1c,0x42,0x28,0x81,0xeb,0xae,0xcf,0x9f,0x04,0x00,0x7f,0xf8,0xc1,0x0c,0xd8,0x1e,0x49,0x9a,0x50,0xaf,0xed,0x26,0xb0,0x49,0x45,0x21,0xe4,0xf8,0x7f,0x7f,0xd7,0xd1,0xa9,0x41,0x38,0xc6,0x38,0x7f,0xfd,0xf8,0x7f,0x12,0xa8,0xfb,0xae,0x7f,0x07,0x65,0x81,0x59,0x94,0xff,0xaf,0xc0,0x7f,0xdf,0xa3,0x17,0x05,0x7f,0x03,0xe9,0xb5,0x6c,0xd5,0x35,0x15,0xf7,0x56,0x7f,0x54,0xe8,0x3b,0x34,0x06,0xd6,0x81,0x20,0x18,0x25,0x7f,0xc6,0x4f,0x5a,0xd2,0x1b,0xf4,0x56,0xb4,0xa3,0xee,0x19,0x89,0x5c,0x58,0x25,0x11,0x27,0x6e,0x1a,0x0f,0x36,0x33,0xee,0x03,0x7f,0x28,0xbc,0x42,0x01,0xdd,0x3f,0x38,0x05,0x69,0xc8,0xfa,0xe0,0xd3,0xd1,0xbb,0x55,0x81,0x70,0xc9,0xab,0x1a,0x7f,0x6c,0x51,0x09,0x00,0xf5,0x9e,0x57,0xab,0x2a,0x08,0xcf,0xb5,0xe5,0x3b,0x13,0x7f,0x04,0x7f,0x7f,0x61,0xfa,0x7f,0xb7,0x31,0x2d,0x48,0x3f,0xf0,0xf1,0x37,0xde,0x9a,0xc1,0xf0,0x5f,0x30,0x2e,0xd9,0xb9,0x53,0xe4,0x02,0x07,0x09,0xad,0x3d,0x01,0x3c,0x31,0x12,0xdf,0x6d,0x2f,0xd4,0x54,0x9b,0x81,0x81,0xcd,0x28,0xa8,0x01,0x81,0x7f,0x03,0x5a,0x12,0x8e,0x1e,0x3f,0x0d,0x7f,0x99,0x2a,0xa1,0xe8,0xac,0xae,0x74,0xf2,0xb8,0xb9,0x31,0xf0,0xe9,0x76,0xfd,0x15,0xc4,0x8f,0x28,0x7f,0x0a,0xfa,0xaf,0xd5,0x02,0x56,0x28,0x6b,0xeb,0x6d,0x0f,0x03,0x7f,0x1a,0x7f,0x7f,0x06,0xb7,0xd0,0xc7,0xa0,0xbd,0xd2,0xfa,0x58,0x7f,0x89,0xbe,0x81,0x81,0xeb,0x82,0x90,0x8b,0xf9,0xe3,0xca,0xca,0x42,0x6a,0x50,0xd8,0x56,0x45,0x79,0xe5,0x0f,0x7f,0xea,0xdb,0x7f,0x2b,0x7f,0xf9,0x9b,0xb0,0x29,0x5e,0xfa,0x59,0xff,0x7f,0x7f,0xe3,0x7a,0x04,0xb1,0x95,0xe0,0x60,0xd8,0xff,0xe9,0x47,0x8f,0x5b,0xa2,0x01,0x81,0x53,0xed,0x51,0x34,0x57,0x0d,0xcd,0x9b,0x2e,0x09,0xa9,0x13,0xa4,0xa1,0xa6,0x40,0x16,0xdc,0x61,0xa0,0xee,0xb5,0x76,0x8b,0xbc,0xeb,0xda,0x00,0x31,0x0c,0x2f,0xe3,0x8d,0x9e,0x93,0x16,0x5f,0x86,0x81,0x02,0xa7,0xba,0x6a,0xb8,0xc7,0xc9,0x87,0xa6,0xfd,0xe0,0x73,0xf0,0xb1,0x26,0x2c,0xef,0x71,0xe7,0x3f,0x09,0x6b,0x1b,0xad,0x53,0x1e,0x25,0xfc,0x1d,0x99,0x1d,0xcf,0xbc,0x15,0x7f,0x65,0xdc,0x1b,0xd2,0x6e,0xe0,0x1e,0x81,0xad,0x0c,0xdf,0xe0,0x81,0xf7,0x43,0x7f,0xab,0x7e,0xfc,0x3a,0xde,0xfd,0x10,0xba,0xdd,0x5c,0x6b,0x5c,0xd3,0x2e,0x77,0xfb,0x5a,0xd1,0x6e,0x3c,0x3a,0x4b,0xe4,0x0f,0x4d,0xb0,0xf3,0x81,0x11,0x2c,0xbc,0xc4,0x51,0xaa,0x7f,0x40,0x49,0xbe,0xf9,0x10,0x64,0x7f,0x0a,0x9f,0x2b,0xcb,0x49,0xd0,0x81,0x38,0x89,0xdb,0x9a,0xf7,0x3b,0xe8,0x24,0x9c,0x21,0x8d,0x60,0xcf,0xd2,0xdd,0x10,0x1e,0xc0,0xf5,0x79,0xad,0x8e,0xbe,0xce,0x36,0x61,0xae,0xc2,0x1a,0x32,0xf2,0x7f,0xd1,0xef,0x8b,0xca,0x08,0xef,0x20,0x2c,0x4c,0xc0,0xf6,0x7f,0x76,0x56,0xdf,0x44,0xcf,0xec,0x5d,0xe0,0x0b,0xad,0x7f,0x7f,0xe8,0x81,0x42,0x81,0x2f,0xfa,0x0c,0x32,0x81,0xc8,0xca,0x3b,0xfd,0x3f,0xa9,0x1c,0x0d,0x16,0xf7,0xda,0x7f,0x67,0x21,0xe6,0x7f,0x77,0x7f,0xb1,0xd1,0x69,0x81,0x54,0x5a,0xef,0x34,0xde,0xc1,0x7f,0xd3,0x52,0xdf,0x66,0xec,0x41,0x21,0xe0,0x04,0xf6,0x81,0x81,0xfd,0x48,0x10,0xf9,0xbf,0xb0,0x81,0x60,0xc0,0xdc,0xa3,0xc3,0xec,0x6d,0x0c,0x1d,0x05,0x08,0xbd,0x7f,0x0b,0x8f,0x06,0x81,0xea,0xcf,0xac,0x11,0xc6,0x7f,0xe9,0x1c,0xd7,0x7f,0x81,0x81,0xd7,0xdc,0xf2,0x38,0x13,0x6a,0x9f,0xad,0xb5,0x83,0x02,0x7f,0x64,0x04,0xfc,0xff,0x92,0xac,0xfc,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x7f,0xf0,0xff,0xff,0x8a,0xf8,0xff,0xff,0x87,0xf6,0xff,0xff,0x8e,0xff,0xff,0xff,0x68,0x11,0x00,0x00,0x24,0xea,0xff,0xff,0x95,0x27,0x00,0x00,0x20,0x00,0x00,0x00,0x58,0xe5,0xff,0xff,0x96,0xef,0xff,0xff,0xe7,0xf7,0xff,0xff,0x63,0x00,0x00,0x00,0x4f,0xf8,0xff,0xff,0xac,0xff,0xff,0xff,0x5d,0x25,0x00,0x00,0x5a,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0xe0,0x07,0x00,0x00,0x1b,0x03,0x00,0x00,0x9a,0xfd,0xff,0xff,0xf8,0x04,0x00,0x00,0xe0,0xfc,0xff,0xff,0xa2,0xfd,0xff,0xff,0xf5,0xee,0xff,0xff,0x02,0xfb,0xff,0xff,0x19,0x20,0x00,0x00,0xd6,0x26,0x00,0x00,0xc9,0xfc,0xff,0xff,0x8e,0x22,0x00,0x00,0x21,0xff,0xff,0xff,0xbf,0x31,0x00,0x00,0x6b,0x27,0x00,0x00,0xce,0xe7,0xff,0xff,0x52,0xfd,0xff,0xff,0xfc,0xfc,0xff,0xff,0x0f,0xfc,0xff,0xff,0x8e,0x20,0x00,0x00,0xd8,0x04,0x00,0x00,0x2f,0xfc,0xff,0xff,0xc2,0x29,0x00,0x00,0x34,0xf3,0xff,0xff,0xfd,0xec,0xff,0xff,0x52,0xf9,0xff,0xff,0x66,0xeb,0xff,0xff,0x90,0x21,0x00,0x00,0xef,0x39,0x00,0x00,0xb4,0x03,0x00,0x00,0xe5,0x01,0x00,0x00,0x37,0xfb,0xff,0xff,0xf5,0xf8,0xff,0xff,0xac,0xf9,0xff,0xff,0x05,0xf5,0xff,0xff,0x74,0xff,0xff,0xff,0xd7,0xf8,0xff,0xff,0x3a,0x1e,0x00,0x00,0x43,0x2e,0x00,0x00,0xf0,0xf2,0xff,0xff,0x1f,0xfd,0xff,0xff,0x4d,0x1c,0x00,0x00,0xe9,0xff,0xff,0xff,0xb6,0xfc,0xff,0xff,0x45,0x2c,0x00,0x00,0xf4,0x08,0x00,0x00,0xbe,0xff,0xff,0xff,0x92,0x29,0x00,0x00,0xf6,0x32,0x00,0x00,0x01,0xf7,0xff,0xff,0xe3,0xf6,0xff,0xff,0xf2,0xfd,0xff,0xff,0xf0,0xff,0xff,0xff,0x1a,0xf4,0xff,0xff,0x22,0x00,0x00,0x00,0x32,0xeb,0xff,0xff,0xed,0x22,0x00,0x00,0x3c,0xfc,0xff,0xff,0x95,0x00,0x00,0x00,0xcb,0x0b,0x00,0x00,0xc6,0x32,0x00,0x00,0xf8,0xf8,0xff,0xff,0x28,0x27,0x00,0x00,0x1b,0x05,0x00,0x00,0xfb,0xfe,0xff,0xff,0x05,0xf9,0xff,0xff,0xb3,0x27,0x00,0x00,0xb7,0x2d,0x00,0x00,0x78,0x0e,0x00,0x00,0x0e,0xf7,0xff,0xff,0xe2,0xf3,0xff,0xff,0xc4,0xfe,0xff,0xff,0x35,0xff,0xff,0xff,0x1b,0xf6,0xff,0xff,0xa4,0xfd,0xff,0xff,0x1d,0xfd,0xff,0xff,0xe7,0x28,0x00,0x00,0x1e,0xf6,0xff,0xff,0x80,0xff,0xff,0xff,0x12,0xf8,0xff,0xff,0x04,0xf8,0xff,0xff,0x51,0xf8,0xff,0xff,0xde,0xff,0xff,0xff,0x15,0x07,0x00,0x00,0xa4,0xfa,0xff,0xff,0xb4,0xf8,0xff,0xff,0x8b,0x2d,0x00,0x00,0xd5,0x2f,0x00,0x00,0x47,0xf9,0xff,0xff,0xbb,0xf8,0xff,0xff,0xda,0x39,0x00,0x00,0xa0,0x14,0x00,0x00,0x2c,0xfb,0xff,0xff,0x20,0x01,0x00,0x00,0xf5,0xfc,0xff,0xff,0x4b,0x29,0x00,0x00,0x80,0xfd,0xff,0xff,0x4c,0x22,0x00,0x00,0xd7,0x07,0x00,0x00,0xb3,0x28,0x00,0x00,0x21,0xff,0xff,0xff,0xf3,0xf7,0xff,0xff,0x17,0xfe,0xff,0xff,0xa3,0xf4,0xff,0xff,0x4d,0x38,0x00,0x00,0x2a,0xfd,0xff,0xff,0x3b,0x38,0x00,0x00,0x7a,0xfc,0xff,0xff,0x78,0xfd,0xff,0xff,0x5e,0x01,0x00,0x00,0xb6,0x43,0x00,0x00,0x9e,0xae,0xfc,0xff,0x04,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0x47,0xc3,0xfe,0xec,0xfe,0x7f,0xd6,0x81,0x3d,0x37,0x29,0x0b,0xb8,0x1b,0x0c,0x3a,0x13,0xc8,0xde,0x81,0xd3,0x01,0xf4,0xbc,0x3c,0xf7,0x44,0xac,0x0b,0xf6,0x81,0xc9,0x30,0x13,0xe8,0x31,0x0f,0x2c,0x8d,0xc6,0x7f,0x28,0x0d,0xf9,0xb9,0xa3,0x4d,0x81,0x0b,0xed,0x7f,0xfb,0xe2,0x7f,0xbf,0x91,0x7f,0xc9,0xa9,0x72,0x30,0xfb,0xe1,0x42,0x48,0x81,0x1f,0x3c,0x7f,0x7c,0xac,0x93,0x51,0x7f,0xdd,0x15,0xf1,0x13,0x47,0x7f,0x34,0x90,0x63,0xb4,0xfd,0x89,0x7f,0xb9,0x7f,0x17,0x31,0xb5,0x5f,0xa1,0x3d,0x4c,0x60,0x9c,0x38,0x81,0xe9,0xf7,0x82,0xb6,0xfd,0xcf,0xed,0x39,0x81,0x89,0xba,0x8a,0x19,0x27,0xe8,0xde,0x81,0x44,0x86,0xb3,0x5b,0xa5,0x81,0x37,0x8b,0xd5,0xab,0xac,0x0c,0xc4,0x03,0xfb,0xea,0xb8,0xd5,0xa4,0xe3,0xcd,0xeb,0xea,0xec,0x24,0xce,0x10,0xdc,0xee,0xdb,0xe8,0xe0,0x35,0x08,0xcc,0xea,0xf1,0x3e,0xf8,0xc7,0xf9,0x9a,0xfe,0x4a,0x30,0xf9,0xdd,0x1a,0xec,0x0b,0xd9,0xd0,0xd7,0xf9,0xd0,0xfb,0x9e,0xf0,0xbb,0xdf,0xf5,0x0a,0xdd,0xfd,0xdf,0xd2,0x07,0xe0,0xfe,0x05,0x96,0x42,0xf2,0xec,0xb9,0x3d,0xf1,0x66,0x81,0x18,0x77,0xf4,0x89,0x7f,0xbe,0x7f,0x20,0xf1,0x7f,0xeb,0xf5,0x55,0x81,0x42,0xbb,0xdf,0xba,0x00,0xef,0x47,0x03,0x8b,0x81,0xd6,0xe0,0xac,0xab,0x70,0xa4,0x81,0xb3,0x93,0xa3,0x75,0x7f,0x4c,0x24,0x7f,0x2d,0x9b,0x81,0x7f,0x8a,0x4f,0x02,0x5f,0xa6,0xfd,0x4f,0x8d,0x81,0xe0,0xcf,0xcd,0x7f,0xf6,0x81,0xca,0xc7,0x7f,0x0a,0x6b,0x5d,0x2c,0x28,0x81,0xbe,0xa6,0xdf,0xba,0x7f,0x2c,0x7e,0x7f,0xf4,0x7f,0x94,0x7f,0x93,0x81,0x81,0xb1,0x81,0x4c,0x7f,0x81,0x98,0x7f,0x81,0xc2,0x7f,0x7f,0x81,0x6b,0x82,0xe3,0x81,0x7f,0x22,0x3b,0x7f,0x89,0x7f,0x81,0xab,0xdb,0x1e,0x7f,0x7f,0x1b,0x22,0x65,0x4f,0x81,0x99,0xaa,0x81,0x8b,0x7f,0x81,0xef,0x81,0x81,0x08,0x23,0xf6,0x7d,0xab,0xaf,0xd9,0x83,0xc5,0xfc,0x0a,0xf1,0xea,0x00,0x3e,0xf3,0x07,0xdd,0x16,0x17,0xd4,0x54,0x03,0xfb,0xec,0x05,0xde,0xb3,0x32,0x13,0x9d,0x34,0xfc,0xdc,0x72,0xdb,0x7f,0xc5,0xfc,0x1e,0xf8,0xcd,0xea,0x02,0xa3,0xb8,0xbf,0xb4,0x05,0x0d,0x11,0x7f,0x08,0x13,0xcf,0xf2,0xf7,0xcf,0xef,0xb7,0x0f,0xbe,0xdf,0x2c,0xe1,0x11,0xad,0xb7,0xf7,0xbc,0x58,0x14,0xeb,0x02,0xfe,0x01,0xfa,0x12,0xea,0x07,0xf0,0xd0,0xf8,0xfe,0xe0,0xee,0x0c,0x36,0x16,0xf1,0x17,0xc2,0xea,0xd2,0xfb,0xdc,0xe0,0xef,0x00,0xc5,0xd6,0x32,0x46,0x77,0x01,0xcf,0x2f,0x0f,0xc0,0xd8,0xec,0x8b,0xe7,0xdb,0xaa,0xb9,0x0a,0xe6,0x1d,0x22,0xa5,0x36,0xd8,0xb0,0x30,0x8a,0xf3,0xf3,0x14,0x0e,0x81,0xea,0xf3,0xd0,0xfc,0xb0,0xd1,0xed,0xea,0x21,0x7f,0x61,0x01,0xb2,0x07,0xa0,0x0e,0xfd,0x98,0x08,0xd3,0xe9,0x07,0xf0,0xf2,0xb4,0x33,0xdc,0x96,0xd9,0x10,0xcc,0xd5,0xb5,0x02,0x63,0x56,0x1d,0x2a,0x5a,0xea,0x2d,0xba,0xbd,0x1c,0x0d,0x1f,0x1e,0x3a,0x3f,0x2e,0xe4,0xfc,0xe4,0xb9,0xd2,0xb4,0xd0,0xb2,0xc9,0xd8,0x2b,0xe6,0xf6,0xe7,0x2e,0xef,0xf5,0x28,0xf0,0xfd,0x0b,0xec,0xfd,0x15,0xcd,0xee,0xee,0xf1,0x0f,0xa1,0x0b,0xce,0xea,0xf6,0x07,0xea,0xf8,0xf0,0x22,0xfe,0x0b,0xe0,0x0f,0x01,0xf2,0xed,0x22,0x1b,0x48,0xd7,0xf9,0x05,0xf5,0xd1,0xe1,0xe2,0xf0,0xf2,0xb1,0xf3,0xee,0x0c,0x4d,0xf4,0xe9,0x2d,0x1d,0x0e,0xd2,0x08,0x1e,0x2c,0x11,0x40,0x28,0xea,0xb0,0xfc,0xff,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x8b,0x31,0x00,0x00,0xe5,0x8e,0x00,0x00,0x3e,0x18,0x00,0x00,0xd4,0x04,0x00,0x00,0xda,0x3d,0x00,0x00,0x9d,0xf1,0xff,0xff,0x5e,0x56,0x00,0x00,0xe2,0x3c,0x00,0x00,0xef,0xde,0xff,0xff,0x58,0x35,0x00,0x00,0x4a,0x14,0x00,0x00,0x9f,0xf0,0xff,0xff,0x0e,0x10,0x00,0x00,0x1f,0xdc,0xff,0xff,0xf1,0x08,0x00,0x00,0x47,0x32,0x00,0x00,0x12,0x43,0x00,0x00,0x6d,0x1c,0x00,0x00,0x44,0x7d,0xff,0xff,0x96,0x0b,0x00,0x00,0xd3,0x11,0x00,0x00,0x13,0x1b,0x00,0x00,0xb4,0xa8,0xff,0xff,0x1e,0x1c,0x00,0x00,0x2b,0xd2,0xff,0xff,0x4b,0x8b,0x00,0x00,0x20,0x27,0x00,0x00,0xcd,0xff,0xff,0xff,0x50,0xce,0xff,0xff,0x02,0x39,0x00,0x00,0x08,0x30,0x00,0x00,0x91,0xf1,0xff,0xff,0x61,0x12,0x00,0x00,0xa9,0x50,0x00,0x00,0x28,0x1a,0x00,0x00,0x4a,0x0d,0x00,0x00,0x60,0x3b,0x00,0x00,0x07,0x37,0x00,0x00,0x15,0x63,0x00,0x00,0xac,0x0f,0x00,0x00,0xbe,0x37,0x00,0x00,0xfd,0x2d,0x00,0x00,0x1a,0x3c,0x00,0x00,0x08,0x4b,0x00,0x00,0x05,0x17,0x00,0x00,0x0a,0x70,0x00,0x00,0xde,0xec,0x00,0x00,0x12,0xef,0xff,0xff,0xa8,0xa0,0xff,0xff,0x5d,0x4b,0x00,0x00,0x62,0x1f,0x00,0x00,0x27,0xfe,0xff,0xff,0x8b,0x23,0x00,0x00,0xc5,0xfe,0xff,0xff,0xc4,0x02,0x00,0x00,0xfc,0x6a,0x00,0x00,0x00,0x57,0x00,0x00,0xf9,0x44,0x00,0x00,0x15,0x65,0x00,0x00,0xae,0x0c,0x00,0x00,0x0d,0x6d,0x00,0x00,0x37,0x14,0x00,0x00,0x86,0x39,0x00,0x00,0xfd,0x60,0x00,0x00,0xcc,0x09,0xfc,0xff,0xd0,0x09,0xfc,0xff,0xd4,0x09,0xfc,0xff,0x02,0xb2,0xfc,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x57,0xc3,0x64,0x7f,0x09,0x99,0x87,0xf8,0x13,0x56,0x0d,0xbb,0xe5,0x1d,0xec,0x1c,0x72,0xd5,0x92,0xc5,0xa9,0x79,0x1a,0xb3,0xfc,0x07,0xed,0x44,0x0f,0x7f,0x67,0x4b,0xee,0x81,0xd9,0xd1,0x2f,0x7b,0x81,0x81,0xb8,0xa1,0x81,0x7f,0xc1,0xf0,0xc3,0x7f,0xc8,0xc6,0x63,0x24,0x25,0x26,0x81,0x9d,0x4d,0x81,0x57,0x81,0xba,0x12,0xe7,0x55,0xed,0x95,0x5c,0x22,0xe0,0x14,0x38,0x33,0xf9,0x73,0xf8,0x19,0xaf,0xb6,0x7f,0x76,0xa7,0xd2,0xca,0xb2,0x98,0xad,0x40,0x23,0x56,0xdd,0x59,0xd4,0x23,0x50,0xf4,0xf0,0xcd,0x40,0x56,0xb8,0x81,0xc0,0x94,0xd0,0xca,0xb9,0x2f,0xf3,0xf1,0x0a,0x3a,0x7f,0xbe,0x6e,0x7f,0x73,0xda,0x81,0x58,0x87,0x49,0x9f,0xd5,0x7f,0x09,0x5f,0x1b,0x16,0x3e,0xc1,0xb0,0x26,0xd9,0x0c,0x8c,0x00,0xde,0x25,0x2e,0xe7,0xb7,0x7f,0xd7,0x65,0xef,0x0f,0x81,0x8b,0x9a,0xf4,0x5b,0x0c,0xd1,0xaf,0xdc,0x05,0x10,0xf8,0xbf,0x7d,0xd9,0xc6,0xe2,0xe2,0xe5,0x7f,0xe3,0x0d,0xab,0x99,0x28,0x22,0xce,0x4c,0xdf,0x63,0x0f,0x9d,0x7f,0x7f,0x19,0x31,0xe7,0xd4,0x7f,0xc5,0x29,0x88,0xe5,0x06,0xd2,0x4e,0xc7,0x3b,0x2b,0xf5,0x7f,0xd6,0x2d,0x02,0x8c,0x50,0xdc,0xa3,0xb2,0x99,0x32,0x7f,0x56,0xc7,0x2a,0x36,0xcb,0xfa,0xba,0x40,0x3e,0x05,0x7f,0xdc,0x29,0x2c,0xec,0xfb,0xc9,0x7f,0x08,0x4a,0x04,0xdc,0xa1,0x50,0xdb,0xe7,0xf8,0x91,0xe9,0xfc,0x67,0x3b,0x99,0x32,0x69,0x10,0xeb,0x17,0xa6,0xae,0xf2,0x78,0xf3,0x5d,0x08,0x72,0x35,0x09,0x16,0x83,0xa1,0x41,0x44,0x34,0x55,0x28,0x23,0xd8,0x44,0xb6,0x2b,0x65,0xe3,0xcd,0x7f,0xeb,0xf3,0x25,0xb2,0x81,0x7f,0x15,0xb4,0xae,0x9a,0x1a,0x0d,0xca,0x81,0x1f,0x81,0xb7,0xf8,0xb6,0x78,0x27,0xa7,0xab,0xab,0xae,0xdc,0xfe,0xaa,0x1b,0x34,0xf9,0x38,0x97,0x2c,0x14,0x37,0x3e,0xb8,0x9a,0x4c,0xc0,0x7f,0xdf,0x9d,0xca,0x1d,0x8f,0xdd,0x7f,0x7f,0x1a,0xf2,0xef,0x7f,0x7f,0xca,0x4b,0xea,0xd7,0xb1,0xfd,0x61,0x74,0x1c,0xa6,0x7f,0x1b,0x81,0x7f,0xe4,0x07,0x7f,0xee,0x40,0xbd,0x28,0xf4,0xe2,0x7f,0xcc,0x64,0x2f,0xf3,0x92,0x9b,0x8c,0xf5,0xa0,0xdc,0x0d,0xc2,0x03,0x22,0x4f,0x47,0xbc,0x17,0x1d,0x2e,0xd5,0x3a,0xbd,0xbd,0x22,0x72,0xf8,0x25,0xfe,0x7e,0x7f,0x04,0x10,0xe0,0x7f,0x10,0x46,0xf1,0xad,0x46,0x7f,0x35,0xff,0xde,0xe7,0xcf,0xf5,0x7f,0x55,0xf0,0xbc,0xc2,0xda,0x7b,0x51,0x34,0x0c,0xb0,0x1c,0x0e,0x08,0x26,0x79,0x35,0x8b,0x35,0x0d,0xe2,0x6d,0x14,0x28,0x81,0xa9,0x81,0x41,0x26,0xf1,0x3a,0xa9,0x55,0x81,0x8f,0xcc,0x5f,0x7f,0x7f,0xd2,0x13,0xd9,0xbc,0x00,0x86,0xc6,0x7f,0x25,0xf6,0x9b,0xc2,0x43,0x7f,0xf2,0x1f,0x23,0x37,0x53,0x3f,0x3e,0x1a,0xbb,0x08,0x61,0xdc,0xf9,0x9a,0x22,0xcf,0x9d,0x2d,0x7f,0x35,0xac,0xe8,0xf6,0x9b,0x7f,0x03,0xdc,0xe5,0xfa,0xfe,0x7f,0x96,0xc0,0x81,0xbf,0x39,0xae,0x4b,0x29,0x3d,0x1e,0xf0,0xaf,0xe6,0xc3,0x7f,0x8f,0x22,0xf3,0x92,0x7f,0xaf,0x79,0x83,0x22,0x27,0x20,0x7f,0xb1,0xdb,0x54,0x1b,0x0a,0xd2,0x7f,0x7f,0xd1,0x22,0xff,0x21,0x29,0xf1,0xc6,0x20,0x3d,0x7a,0xc1,0xd2,0xb7,0xca,0x7f,0x14,0x2b,0x7f,0xf7,0xa8,0x4c,0x1f,0x08,0x08,0x5d,0x7f,0xbd,0x31,0x02,0x32,0xf6,0xbf,0xa5,0x90,0x7f,0x11,0x9e,0xf6,0x28,0x2d,0x3d,0xfe,0xda,0x31,0x2f,0x01,0x15,0x0b,0xcc,0x26,0x54,0xb2,0xf5,0xd8,0x9d,0x3b,0xfd,0x81,0xca,0x28,0x69,0xef,0x52,0x41,0xd3,0xec,0x23,0x7f,0x30,0x53,0x81,0x3d,0x23,0xe0,0x7f,0xc2,0xe7,0x54,0x68,0x2a,0xd2,0x11,0x1e,0xcf,0xe0,0xcd,0x38,0x7f,0x7f,0x37,0x7f,0xf1,0x75,0x57,0xf9,0x0c,0xf3,0x17,0xfa,0x6a,0x22,0x11,0x7f,0xe2,0x08,0x36,0x14,0x5f,0xbb,0x0e,0xf7,0x78,0x59,0x33,0x78,0x6c,0xf9,0x64,0x0e,0x02,0xc2,0x02,0x7f,0xe7,0x82,0x1f,0x31,0x2e,0x7f,0x7f,0x69,0x16,0x7f,0x20,0xb3,0x02,0x3c,0xeb,0x5c,0xd3,0x07,0x81,0x54,0x9a,0x20,0xd1,0xa8,0x81,0xdf,0x33,0x09,0xc5,0xf5,0x7c,0xe9,0xf7,0x18,0x13,0x7f,0xf0,0xd8,0xcf,0xc8,0xcf,0xcb,0xf4,0xd1,0x1c,0x35,0xc9,0x26,0xba,0xae,0x3f,0x31,0x45,0xf2,0x26,0xf6,0xca,0x10,0xca,0x94,0x03,0x22,0xd3,0x81,0x29,0x4b,0x73,0x65,0xea,0x26,0x3b,0x42,0x78,0x29,0x0f,0xc6,0x1e,0x5c,0x85,0x39,0x81,0x05,0x7f,0x89,0x28,0x52,0x2c,0xda,0x18,0xdc,0x1a,0x43,0x07,0x29,0x5a,0xee,0xf4,0x14,0x7f,0xed,0xff,0xbf,0xe7,0xa2,0x3e,0x7f,0xb6,0x1a,0xf8,0x2d,0xfc,0x97,0xd9,0x12,0x3f,0x63,0xff,0x2e,0x81,0x2b,0x39,0x43,0xf5,0xfa,0x77,0x44,0x4e,0x12,0x7f,0x3c,0x74,0x15,0xb7,0xd2,0x3a,0x4a,0x72,0xf4,0x04,0x81,0xad,0xd9,0x5a,0xd8,0x7f,0xc2,0x95,0xeb,0x2d,0xde,0x52,0x7f,0xe8,0xa0,0x01,0x0e,0x1c,0x39,0x57,0x01,0x49,0x7f,0xf0,0xfc,0x24,0x24,0xfe,0xe6,0x8b,0xd0,0x02,0xba,0x60,0x10,0x23,0xc0,0xac,0xa5,0xa5,0x2e,0x1d,0x8a,0x7f,0xfb,0xca,0xf9,0xe7,0xec,0x29,0x12,0x94,0xab,0xb6,0x39,0x3f,0xe2,0x7f,0xf4,0x24,0x48,0x51,0x7f,0x6f,0x9c,0x3a,0x33,0xc8,0x03,0xe3,0xb0,0xf5,0xad,0x1d,0x4b,0xec,0xd6,0x01,0xc0,0x7f,0xb0,0x3e,0xe6,0xf0,0xe6,0x97,0x7c,0x8b,0xb7,0x1a,0x81,0x37,0x81,0x29,0x33,0x33,0xc0,0x7f,0x81,0x96,0x81,0xc3,0x92,0x62,0x30,0xba,0xb1,0xc6,0x6f,0xc9,0x32,0xc1,0x7f,0x0e,0xe6,0x25,0xde,0x4c,0xc8,0xff,0x16,0x37,0xd7,0xe8,0xf3,0x7f,0xfc,0x3a,0xf3,0xe2,0x81,0xff,0xd4,0x5f,0xaf,0xea,0xe4,0xe8,0x52,0x60,0x1c,0x9c,0x81,0x30,0x7f,0xaa,0xa5,0xb4,0x54,0x1f,0x5b,0x7f,0x1c,0x0f,0xfc,0xab,0x9e,0xb0,0xc6,0xc9,0x81,0x7f,0x20,0x8d,0xd4,0xa1,0x93,0xb2,0xe9,0xf9,0xe5,0x34,0x5a,0x86,0xaa,0x8a,0x81,0x2d,0x03,0xc6,0xc0,0x26,0x0e,0xd4,0xe3,0x4f,0xf3,0x4c,0x60,0xd2,0x61,0x1c,0x1e,0x7f,0xdc,0xba,0x25,0xcb,0x9a,0x50,0xbd,0x7f,0xaa,0x81,0xc1,0xeb,0xb9,0x52,0xe5,0x1d,0xff,0xdd,0xba,0xdc,0x18,0x5e,0xd1,0x9f,0xac,0x7f,0xe9,0x7f,0xf3,0x7f,0x2d,0x7e,0xed,0xb5,0x15,0xda,0x9d,0x23,0x56,0x6b,0xa2,0xcc,0x2f,0x81,0x36,0xb8,0x07,0x45,0xaf,0x01,0x0d,0x73,0x2f,0x45,0xf3,0x19,0xd8,0x21,0x4f,0x31,0xe4,0x7f,0xdb,0xb9,0xdf,0xa5,0x0c,0x10,0xad,0xa0,0x5c,0xd0,0x6d,0xc1,0xe9,0x20,0xa4,0x7f,0x35,0xfe,0xc3,0x23,0x7e,0x43,0x42,0x13,0x07,0x21,0xcc,0x15,0xac,0x8e,0xca,0xcc,0x47,0x5c,0x7f,0xc7,0x2f,0x81,0x09,0x37,0xda,0xee,0x96,0x4a,0x03,0x93,0xcf,0xc4,0xd7,0xe2,0x7f,0xca,0xba,0x2d,0x1a,0xf6,0x1c,0xec,0xf7,0xc9,0x7f,0x40,0x48,0x7f,0x97,0x74,0x43,0xda,0x74,0x14,0xe1,0x3e,0x96,0x32,0x25,0xd9,0x21,0x7f,0xba,0x53,0xd3,0x76,0xd2,0x14,0xc2,0xa9,0xd5,0x2c,0xa3,0x9d,0x9e,0x45,0x87,0x14,0x0a,0xae,0xdc,0x1a,0x1c,0xe1,0xbb,0xc1,0x83,0x7f,0x7f,0xe6,0xba,0xcd,0x7f,0x4b,0x7f,0xcc,0x49,0xd8,0x36,0x7f,0x8e,0xb6,0xfc,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x81,0xd9,0xb1,0x81,0x51,0x0d,0x56,0x42,0xa4,0x72,0xe6,0xd3,0x0e,0x5e,0xae,0x23,0xd1,0x7f,0x4a,0xe6,0x0b,0x0f,0x24,0xb8,0x60,0x38,0xf1,0x3c,0xf2,0xeb,0xed,0xf8,0xe3,0x37,0xd9,0x14,0x40,0x35,0xa9,0x1c,0x98,0x2c,0x7f,0x7f,0xbe,0x27,0x22,0x37,0xe3,0xdd,0x54,0xce,0x9d,0x11,0xf6,0xf4,0x2b,0xf3,0x40,0x6d,0x0b,0xf5,0x7f,0xab,0xac,0x0b,0xaf,0x81,0xf5,0x6e,0xf4,0xd1,0xd0,0x81,0xdb,0x44,0x91,0x99,0x27,0xbc,0x46,0xa7,0xd6,0x20,0x0c,0xa1,0x81,0x2e,0xba,0xda,0xc8,0x2b,0xd6,0xa1,0xdd,0x15,0x12,0xdf,0x26,0x4d,0xe2,0xe8,0xeb,0xe7,0x08,0xd4,0xb5,0xd2,0xa0,0x7f,0xb0,0x4b,0xe0,0x95,0xb9,0xc3,0xb6,0xcf,0xc3,0xc5,0xad,0xeb,0x12,0xd4,0x2f,0x0a,0xb1,0x5e,0x5d,0x7f,0x1e,0xbb,0x49,0xc0,0x10,0x7f,0xea,0x8a,0xa7,0x4b,0x47,0x7f,0x40,0x7f,0xa5,0x46,0xf6,0xda,0x27,0x2f,0x3a,0xdc,0xb6,0x7f,0x59,0x6e,0xf0,0x1b,0x2b,0x76,0x1b,0x72,0x8f,0x77,0x7f,0xf3,0xeb,0x06,0xb2,0xdc,0x22,0x38,0x40,0x5e,0x59,0x1e,0x49,0x6d,0xe0,0xe8,0x09,0x7f,0x34,0x7f,0x7f,0x3f,0x52,0x34,0x7f,0x99,0x39,0xf0,0xd0,0x2b,0xb6,0x96,0x87,0x62,0xd9,0x91,0x93,0x8a,0x3d,0x0a,0x8b,0xf9,0x97,0x7f,0x7f,0xb0,0x04,0x72,0x4d,0xb1,0x22,0x7f,0xae,0x34,0xf1,0x3a,0xd1,0x81,0xac,0xa0,0x27,0x7f,0x26,0x7f,0xa1,0xc0,0xa7,0x7f,0x81,0xc8,0x81,0x18,0xad,0xdc,0x9d,0x0c,0x51,0xd5,0xb4,0xf0,0xb0,0xdf,0x16,0xf0,0x87,0x92,0xf3,0x1a,0x7f,0x8c,0x83,0x55,0x7c,0x43,0xe8,0x9d,0x07,0xf3,0x7f,0x24,0x81,0xbb,0x19,0x20,0x2a,0x1a,0xa2,0x61,0xcb,0xa2,0x24,0xde,0xc2,0x39,0x16,0xa4,0xa6,0x57,0xfe,0x61,0xd6,0x46,0xf0,0xec,0x7f,0x24,0xcf,0xe1,0x4c,0xe6,0x0f,0xfb,0xeb,0xc2,0x60,0x7c,0x53,0x55,0xcd,0x7f,0xd9,0x06,0xe5,0xd4,0xde,0x1b,0x0e,0x38,0x35,0x22,0x27,0x17,0x19,0x29,0x59,0xe0,0xce,0xf3,0x81,0x9f,0xd6,0x74,0xf2,0x65,0xe4,0x9a,0x7f,0xd5,0xd1,0xc3,0xb8,0xe2,0x50,0x9e,0x4b,0x35,0xfb,0xab,0x46,0x0b,0xd1,0xdc,0xdb,0x22,0xc6,0xbf,0xce,0xe7,0x08,0x51,0xfa,0xcf,0x9a,0x99,0xad,0x30,0x9c,0xa9,0x8b,0xef,0x9e,0xec,0x98,0x7f,0x7f,0xd5,0x7f,0x35,0xb1,0xdb,0x22,0xba,0xe9,0xc2,0xf2,0xdf,0x89,0x24,0xe7,0x23,0xfb,0xdd,0x23,0xd3,0x12,0x94,0x2a,0x13,0xd8,0x8f,0x81,0xc8,0x3d,0xca,0xbc,0x55,0xd4,0x71,0xe2,0xc3,0x01,0x34,0xb2,0xf4,0x5c,0xa8,0x13,0xe8,0x7c,0x97,0xe9,0xeb,0x9c,0x7f,0xb1,0x32,0x2b,0x7f,0xcb,0x1b,0xb0,0x7f,0x24,0x33,0x49,0x7f,0x34,0xe3,0x13,0xb8,0x61,0xb8,0x7f,0x3a,0x37,0xd1,0x27,0x65,0xeb,0x0f,0x0c,0xc7,0x5e,0x6b,0xc6,0x22,0x03,0x8a,0xf3,0x81,0xc6,0xeb,0x14,0xd7,0x14,0xf7,0xb3,0xd3,0x51,0x0e,0x41,0x92,0x03,0x7f,0x45,0xd8,0x8d,0xe6,0x18,0x07,0x00,0x69,0xd1,0x98,0xa1,0x8d,0x23,0xd1,0xe7,0x2e,0xe3,0x72,0xe0,0xf2,0xdf,0x93,0x21,0xf6,0xf6,0x2d,0x81,0xf7,0xe2,0xfd,0xa8,0x14,0xad,0xa6,0x94,0x99,0xcc,0xcd,0x7f,0xfe,0x35,0x89,0x8e,0x2b,0x4c,0x2e,0xdf,0xb3,0x36,0x81,0xbc,0x32,0xa4,0x81,0xa6,0x7f,0x47,0x43,0x8e,0x68,0x7f,0x26,0x7f,0xbb,0x7f,0x7f,0xa1,0xcb,0x0f,0x17,0x7f,0x77,0x4f,0x57,0xb2,0xef,0x0a,0x28,0xb6,0x2f,0x19,0xf7,0x89,0x23,0xbd,0xdc,0x10,0x26,0x7f,0x3e,0x7f,0x07,0x7f,0x47,0x9b,0x81,0x68,0x1f,0x7f,0x10,0x2f,0x7f,0x7f,0xfc,0x58,0x81,0xfa,0x7f,0xb6,0x7f,0xcb,0x8e,0x40,0xcb,0x67,0xd9,0x7f,0x9d,0xfe,0xbf,0xd8,0xa6,0x7f,0x3e,0x5f,0xd2,0xaf,0x00,0x7f,0x81,0xd6,0x18,0x07,0x52,0x2b,0x79,0xeb,0xaf,0xcd,0xb0,0x4d,0x4b,0x4a,0x6d,0xe6,0x7f,0xaf,0x5e,0x9c,0xc6,0x46,0x38,0x18,0xd2,0xc0,0xff,0x4a,0xf3,0xb7,0xe1,0xe5,0x81,0x7f,0xb4,0xbb,0x7f,0x7f,0x7f,0xdc,0x81,0xdb,0x4f,0x3b,0x09,0x02,0xc1,0x19,0xfb,0xff,0x23,0xdc,0xa5,0x00,0x52,0x7f,0xfe,0x9d,0x4d,0xe9,0xed,0xe5,0xd5,0x05,0x37,0xd5,0xeb,0xdd,0xe9,0x22,0x7f,0x04,0x7f,0xc5,0x7f,0x68,0x5c,0x81,0xc8,0x27,0x29,0x8f,0xe8,0x81,0xa3,0x03,0x35,0x40,0x61,0x26,0x0a,0x4d,0xcd,0xf6,0xac,0x07,0x0d,0xf8,0x72,0x03,0x17,0x34,0x14,0x01,0xb7,0x3c,0xa9,0xd4,0x0b,0xcd,0xb3,0xfa,0x86,0x40,0x7f,0x16,0x8b,0x4f,0x98,0x42,0xc0,0x37,0x03,0xc4,0xc4,0x94,0x43,0x02,0xd2,0x23,0xf9,0xf3,0xde,0xd1,0x7f,0xe8,0x8b,0x81,0x81,0x05,0x0a,0x5b,0x0c,0x81,0x43,0xf7,0x3c,0x9a,0xcc,0x5b,0xfd,0xf6,0xc7,0x98,0x0b,0x0e,0xf0,0x58,0x77,0x81,0x98,0xff,0xa0,0xb4,0x2d,0x7a,0xdd,0xaf,0xa5,0x78,0x2e,0x7d,0xc6,0x7f,0xb3,0x22,0x43,0xc3,0x09,0xb6,0x8b,0xe9,0xe9,0x37,0x5d,0x81,0xcc,0xde,0x94,0xcb,0x9c,0x1f,0xd8,0xac,0x81,0x6e,0xb3,0xb5,0xc7,0x4e,0xb3,0x40,0x0e,0xf2,0xe9,0x82,0x16,0xe8,0x4b,0x81,0x7f,0xdc,0x40,0xd4,0xfb,0x7c,0xbe,0xeb,0xec,0x48,0xe8,0x7f,0xaa,0x3b,0x2c,0x1d,0xbd,0xc5,0xc1,0xc4,0x7f,0xec,0xfe,0xda,0x33,0x81,0x0f,0x8c,0xe7,0x07,0x13,0xb6,0xf6,0x33,0x3b,0x36,0x81,0xc5,0x81,0xf9,0xf7,0xcf,0xb8,0x07,0x1b,0x25,0x8c,0xeb,0x0a,0x61,0x24,0xe7,0xe5,0x64,0xd8,0x8c,0xb5,0x89,0xad,0x14,0xa5,0xa7,0x5f,0x9f,0xec,0x9d,0xdb,0x1f,0xeb,0x38,0x12,0x50,0x04,0x05,0x7f,0xd5,0x0d,0xdf,0xaf,0x07,0xaa,0x88,0xe9,0x22,0x03,0x42,0xbb,0x81,0xb6,0x5f,0xb5,0x74,0x92,0x7f,0x4b,0x89,0xe2,0x95,0x9e,0x85,0xfd,0x11,0x32,0xb3,0x58,0x2e,0xe0,0xc8,0xa2,0x1a,0x6f,0x81,0x97,0x7f,0x97,0xc6,0x28,0x41,0x5a,0x7f,0xdc,0xec,0x98,0xba,0x7f,0x00,0x1b,0xa0,0x6e,0xc7,0xc6,0xd2,0x1c,0x33,0xcf,0x3b,0xe3,0x5b,0x68,0x04,0xb6,0x39,0x4d,0x3d,0xb0,0x8c,0x51,0x26,0x5e,0xd6,0x9d,0xeb,0x1a,0x05,0xf7,0xbe,0xc8,0x7f,0x67,0x7f,0xc1,0x70,0x3d,0xf9,0xb8,0x6e,0xbc,0x37,0xd4,0xf9,0xe2,0x7f,0x23,0x33,0xe7,0x9a,0xf9,0x7f,0x7f,0x7f,0x61,0x7f,0xa7,0xc2,0xcc,0x81,0x01,0x7f,0xd7,0xa5,0x6a,0x81,0xca,0x88,0x81,0x4d,0x59,0x75,0xb6,0xc3,0xfd,0x0c,0x17,0xcc,0x7f,0xab,0xb6,0x01,0x89,0x09,0x22,0x70,0xf5,0xc1,0xba,0xf8,0xfb,0xd6,0xfc,0x65,0x8c,0x32,0x63,0xfd,0xf1,0xce,0x15,0xbe,0x13,0x25,0x73,0xa2,0xbf,0xe6,0xbe,0xbb,0x81,0x2c,0x53,0xe7,0xa1,0x48,0x8d,0xeb,0xf5,0x7f,0x05,0x13,0x2f,0x23,0x02,0xbd,0xf1,0xff,0xf5,0xec,0x4c,0xd4,0xe9,0xca,0xd4,0x30,0xf1,0xb0,0xe9,0x29,0x7f,0x42,0x02,0x30,0x5b,0x61,0xa1,0xed,0x32,0x31,0x33,0x0d,0x00,0xda,0xae,0x91,0x1f,0x8e,0x01,0x2e,0x46,0x55,0x36,0x1c,0x17,0x1e,0xe2,0x7f,0xa1,0x0f,0xff,0x6d,0x81,0x19,0x28,0xf6,0xb1,0xe9,0x0b,0xb0,0x4c,0xb7,0xa9,0x3b,0xe7,0x84,0x98,0xc7,0x26,0xda,0xa6,0x95,0x27,0xb7,0x07,0x20,0xde,0x4a,0x7f,0x7f,0xcc,0xf6,0x01,0x32,0xea,0x31,0x74,0x93,0x9e,0xf0,0x81,0x81,0xee,0xf6,0xfe,0xae,0xd6,0x55,0x81,0x1a,0xbb,0xfc,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xcc,0x1b,0x00,0x00,0x82,0x1f,0x00,0x00,0xeb,0x2d,0x00,0x00,0x9a,0x2d,0x00,0x00,0xff,0x26,0x00,0x00,0x2f,0x35,0x00,0x00,0x95,0xd4,0xff,0xff,0xef,0x14,0x00,0x00,0xf3,0x2f,0x00,0x00,0xad,0xe7,0xff,0xff,0x14,0xd3,0xff,0xff,0xcf,0x0b,0x00,0x00,0xb5,0x19,0x00,0x00,0x22,0x01,0x00,0x00,0x2c,0x18,0x00,0x00,0xe6,0xea,0xff,0xff,0xbf,0x0a,0x00,0x00,0x03,0x0e,0x00,0x00,0x15,0xcc,0xff,0xff,0xf9,0xf0,0xff,0xff,0xfc,0xea,0xff,0xff,0x04,0xe3,0xff,0xff,0x68,0x9d,0xff,0xff,0x8a,0xdd,0xff,0xff,0x7f,0x15,0x00,0x00,0x14,0xee,0xff,0xff,0x7e,0x12,0x00,0x00,0x87,0x00,0x00,0x00,0xe3,0x42,0x00,0x00,0xb2,0xee,0xff,0xff,0x2a,0xed,0xff,0xff,0x67,0x1a,0x00,0x00,0xbf,0xff,0xff,0xff,0xdd,0x3a,0x00,0x00,0xff,0xc9,0xff,0xff,0x0a,0xf7,0xff,0xff,0x89,0xdb,0xff,0xff,0x97,0xf0,0xff,0xff,0x30,0x16,0x00,0x00,0x15,0xfd,0xff,0xff,0x52,0x18,0x00,0x00,0xbb,0xf5,0xff,0xff,0xf4,0xff,0xff,0xff,0xb8,0x23,0x00,0x00,0x58,0x2d,0x00,0x00,0xc3,0xfe,0xff,0xff,0xe7,0x34,0x00,0x00,0x8d,0xcf,0xff,0xff,0x3c,0x34,0x00,0x00,0x21,0x52,0x00,0x00,0x98,0x26,0x00,0x00,0xc3,0xef,0xff,0xff,0x40,0xf3,0xff,0xff,0xd8,0x1f,0x00,0x00,0x7f,0xff,0xff,0xff,0x6e,0xf8,0xff,0xff,0x67,0x13,0x00,0x00,0x53,0x17,0x00,0x00,0xcd,0xb2,0xff,0xff,0xaf,0xe6,0xff,0xff,0x6a,0x1d,0x00,0x00,0xda,0x27,0x00,0x00,0xf1,0x1c,0x00,0x00,0x99,0x15,0x00,0x00,0x40,0x08,0x00,0x00,0x75,0xd8,0xff,0xff,0x19,0xdf,0xff,0xff,0x49,0xfa,0xff,0xff,0xc0,0x26,0x00,0x00,0x61,0x26,0x00,0x00,0xa6,0x41,0x00,0x00,0x1b,0xf3,0xff,0xff,0x64,0x05,0x00,0x00,0x38,0x17,0x00,0x00,0x80,0x3e,0x00,0x00,0x7e,0xe7,0xff,0xff,0xd2,0xd5,0xff,0xff,0xd6,0xcd,0xff,0xff,0xe7,0xde,0xff,0xff,0xad,0xf9,0xff,0xff,0xc2,0xe6,0xff,0xff,0xaf,0xe5,0xff,0xff,0x35,0x43,0x00,0x00,0xc1,0x02,0x00,0x00,0xcf,0xfe,0xff,0xff,0x29,0x1d,0x00,0x00,0x7c,0xef,0xff,0xff,0x37,0x0e,0x00,0x00,0x81,0x13,0x00,0x00,0x15,0x31,0x00,0x00,0xb6,0x26,0x00,0x00,0x2b,0x21,0x00,0x00,0x1b,0xf9,0xff,0xff,0x1d,0x03,0x00,0x00,0x71,0xfd,0xff,0xff,0xf0,0x1e,0x00,0x00,0x33,0x21,0x00,0x00,0x03,0xfd,0xff,0xff,0x1f,0xe7,0xff,0xff,0x92,0xea,0xff,0xff,0x33,0x08,0x00,0x00,0x3e,0xe2,0xff,0xff,0x7e,0xe2,0xff,0xff,0xc3,0x12,0x00,0x00,0x3b,0xda,0xff,0xff,0x81,0xf0,0xff,0xff,0x5f,0x28,0x00,0x00,0x6f,0x2c,0x00,0x00,0x8e,0xf4,0xff,0xff,0xe4,0xd7,0xff,0xff,0xa7,0x23,0x00,0x00,0xe5,0xe8,0xff,0xff,0xc9,0xee,0xff,0xff,0xdf,0x15,0x00,0x00,0x10,0x2e,0x00,0x00,0xf9,0x14,0x00,0x00,0x99,0xc5,0xff,0xff,0x47,0x17,0x00,0x00,0x25,0x1e,0x00,0x00,0x31,0x40,0x00,0x00,0x01,0xfd,0xff,0xff,0x9e,0x0c,0x00,0x00,0x50,0x20,0x00,0x00,0xba,0x50,0x00,0x00,0x3e,0xf3,0xff,0xff,0x5b,0xfe,0xff,0xff,0x16,0xe2,0xff,0xff,0x45,0xfc,0xff,0xff,0x26,0xbd,0xfc,0xff,0x04,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x2f,0xf6,0xb9,0xd7,0x23,0xf5,0x3b,0xe2,0x24,0xbf,0x2c,0xf9,0x38,0x0f,0x25,0xc9,0x00,0x27,0xe0,0xd5,0x10,0x9f,0xf4,0x11,0xd1,0x25,0xf0,0x28,0x73,0xc2,0x11,0xd8,0xfc,0x1f,0x3b,0x1a,0xed,0x16,0xf3,0xcc,0x01,0xdd,0xce,0x45,0x1d,0xd9,0x3a,0x3c,0xfc,0xa9,0x3c,0x31,0xe4,0xb8,0xc3,0x7f,0xfd,0x63,0x00,0x12,0xdf,0xfd,0x56,0xe6,0x38,0xf7,0x0d,0x27,0xee,0xef,0x1a,0xe2,0xc2,0xf7,0x06,0x01,0xe1,0xa3,0x6a,0x00,0xc4,0x02,0x24,0x34,0xfc,0xeb,0xd5,0x10,0xcf,0xc8,0x10,0xeb,0x49,0xf9,0x04,0x14,0xf7,0xc7,0xff,0x23,0x4b,0x3c,0x4f,0x0c,0x21,0x22,0xb5,0xf6,0xd4,0xd4,0xde,0x02,0xe6,0x39,0x16,0xfe,0x73,0xb6,0x04,0x16,0x12,0xee,0xf4,0x66,0xe3,0x00,0x0c,0xd6,0xbf,0x2e,0xd9,0x02,0xd9,0xc6,0x35,0x25,0xdb,0x3e,0x04,0xc1,0x17,0xe5,0x40,0x9c,0x0e,0xf6,0xc8,0xa8,0x00,0x54,0x4a,0x2d,0xd2,0xb7,0xb5,0xfe,0xe2,0x4c,0x30,0x34,0xfe,0xfc,0x05,0x32,0x46,0x19,0xca,0xe6,0x77,0x17,0x81,0x62,0xf0,0xc7,0x04,0x4a,0x51,0x18,0x0f,0x07,0xa3,0x1b,0xe3,0xc0,0x63,0x03,0x01,0x33,0x14,0x17,0x35,0x2e,0x78,0x2f,0x03,0xdd,0xf6,0x53,0x1c,0x11,0x59,0x23,0x14,0xdc,0xd7,0x04,0xcb,0x3c,0x46,0x0c,0x2c,0xa5,0xf5,0xf1,0xef,0xd8,0x4a,0xcd,0x3f,0xb5,0x37,0x46,0xef,0x56,0x07,0x39,0x19,0xe7,0x64,0xf1,0x37,0x28,0xe5,0x24,0x18,0x36,0xe3,0xc9,0x64,0x4c,0x25,0x76,0xd8,0x00,0xfd,0x83,0xfd,0x4c,0x0c,0x3a,0xe9,0xc3,0x17,0x6c,0xeb,0xe0,0x48,0x36,0x07,0xd7,0xe2,0x15,0xd5,0xf9,0xff,0x05,0x0a,0xee,0xae,0x15,0x09,0x34,0xb7,0x0f,0xc5,0xbb,0xf9,0xca,0xbe,0x13,0xa9,0xa8,0xd5,0x60,0x81,0xfb,0x0c,0x33,0xf4,0xd9,0xf8,0x31,0xff,0x23,0x13,0x13,0xda,0x95,0xfa,0xe7,0x4c,0xc5,0xe7,0x5e,0xf3,0xc6,0x1f,0x3e,0xbd,0x32,0xe7,0xe6,0x35,0xd5,0x02,0x42,0x3d,0x05,0x08,0xde,0xc0,0x2d,0x31,0x94,0xf4,0x2c,0x05,0xd2,0xf3,0xd2,0xf9,0xc5,0x13,0x63,0x22,0x1e,0xfa,0xea,0x12,0xc4,0xb4,0x22,0xdf,0xf0,0xf9,0x0d,0xfb,0x35,0xdd,0xe9,0xe4,0xdb,0x46,0xe1,0x91,0x1b,0x2b,0x10,0xc4,0xc6,0x16,0xff,0xfe,0xe2,0x12,0xfa,0xbf,0x18,0x0d,0xe0,0xf1,0xc6,0x1a,0x49,0x14,0xf2,0x04,0xf3,0xe1,0x1a,0xbd,0x0e,0x5b,0xa7,0x41,0x2a,0xed,0xf0,0x00,0x35,0xe8,0x1c,0xe5,0x2a,0x35,0x0b,0x73,0x23,0xe6,0x00,0x0d,0xf8,0x09,0x1e,0xe4,0x26,0x0e,0x2b,0xc3,0x3e,0x08,0x17,0x15,0xb7,0xd5,0xfe,0xb7,0xd1,0x1a,0x0e,0xbd,0x56,0x13,0xcd,0x2b,0x19,0x06,0xca,0xd2,0x31,0xcf,0x0c,0x3a,0x0b,0x19,0x44,0xe3,0x10,0xe1,0x15,0x18,0x00,0x0c,0x1c,0x0d,0xe9,0x05,0xdb,0x3e,0x40,0xeb,0xb1,0x08,0x72,0xe5,0x31,0x56,0xd7,0xde,0xfb,0x31,0x00,0x55,0x10,0xc3,0x12,0xfa,0xf1,0x15,0x7b,0xef,0xdd,0x04,0x20,0xc7,0x15,0x13,0xf9,0x35,0x0b,0xe8,0x2a,0xff,0xf8,0x7f,0xdd,0x47,0xf7,0xd1,0x19,0x02,0xfb,0x02,0x55,0xd5,0x15,0xe5,0x43,0x21,0xbf,0x0b,0xd8,0x14,0x28,0x0a,0xd9,0x12,0x36,0x40,0xf4,0xfc,0x22,0xf2,0x25,0x7f,0x06,0x23,0x01,0x39,0xfb,0xeb,0xfb,0xff,0xdd,0x1f,0xee,0xcd,0xd0,0x10,0x07,0xed,0x17,0x3e,0x09,0xdf,0x1a,0xfa,0x07,0x36,0xd5,0x31,0xdf,0xf3,0x06,0xe7,0x00,0x1b,0x10,0x13,0x01,0xee,0xf5,0xdc,0xe9,0xe6,0x24,0x13,0x03,0x00,0x07,0xde,0xe7,0xdc,0x02,0x32,0xeb,0xf7,0xcf,0x06,0xc1,0xde,0xba,0xf4,0x07,0x2a,0x06,0xf2,0xeb,0xce,0x1e,0xe7,0xcf,0xfa,0x01,0xce,0xdb,0x08,0x24,0x42,0xe2,0x1b,0x0e,0xd8,0xe8,0xde,0xeb,0xa9,0xe9,0xe5,0x1b,0x33,0xe7,0xe7,0xde,0x30,0x33,0x6f,0xfd,0xc5,0x1c,0xe7,0x0a,0xf3,0xdb,0xf0,0x11,0xf4,0x07,0x30,0xe8,0x00,0x04,0xc8,0x13,0x3e,0x0a,0x52,0x2a,0xba,0x31,0x13,0xee,0x1e,0x07,0x1e,0x10,0xe8,0xe6,0xf8,0xe6,0xd5,0x2a,0x06,0x0b,0xc5,0xdb,0xff,0x45,0xf8,0x0d,0x25,0x26,0x1b,0xe4,0xc6,0x1c,0xe5,0x07,0xfc,0x12,0x70,0xfe,0xd3,0x1c,0x00,0xc5,0xcf,0xbd,0x11,0x01,0x1e,0xe7,0xe5,0x25,0x06,0x02,0xfc,0xbc,0x01,0x4b,0xc3,0xe8,0xf1,0xa9,0x54,0x1d,0x03,0x32,0xaf,0xd1,0x0e,0xdd,0xf6,0x37,0xe9,0x81,0x0b,0x41,0x29,0x92,0x0a,0x56,0x0d,0xd2,0xe0,0x08,0xfb,0xf6,0xa3,0xf3,0x1f,0xe6,0xd9,0xcb,0x28,0x4d,0x34,0x43,0x75,0xdd,0x1f,0x47,0xf8,0xea,0xfd,0xd7,0x0e,0xf8,0xd8,0x09,0xf8,0x3c,0x03,0xee,0x1c,0xe1,0x2b,0xdd,0x06,0xdc,0x07,0xc9,0xc4,0xc1,0xe0,0xca,0x2c,0xe3,0x30,0xfc,0x2e,0xe6,0xf3,0xff,0x0f,0x78,0x18,0x60,0x15,0x06,0xf5,0xbf,0x01,0x00,0xf0,0x39,0x01,0xfd,0xcb,0x03,0xff,0xbb,0xca,0x09,0xe9,0xe7,0x81,0xf5,0x28,0xb2,0x4d,0x05,0xc4,0xe0,0x27,0x14,0x02,0x0e,0x30,0xf4,0xee,0x13,0xd4,0x58,0x0f,0x07,0x16,0x13,0x48,0x05,0x17,0xc1,0x13,0xf0,0xdf,0x00,0xcd,0xe6,0xf3,0x0c,0x05,0x00,0x2c,0x0d,0xfe,0x0a,0x25,0x03,0xf8,0x09,0xf9,0x2d,0x08,0xf8,0x00,0xf4,0x20,0x0c,0xf3,0x34,0x16,0x0e,0xee,0xe7,0x0a,0xce,0xeb,0x0d,0xe6,0xff,0x52,0xe3,0xdb,0xff,0x17,0x9d,0x32,0xd5,0xe2,0x0e,0xd3,0xec,0x2a,0x4d,0xf8,0xe7,0x47,0x12,0x1e,0x20,0x01,0xfe,0x01,0xdf,0x1a,0xf4,0xfe,0xea,0xfa,0xbd,0x24,0x3c,0x0a,0x2b,0xef,0xe8,0x31,0x1c,0xe8,0xf9,0xec,0xf6,0x07,0xf1,0x1e,0xdb,0x0c,0x35,0x0f,0x0b,0xf6,0x01,0x76,0x22,0x1a,0xc8,0x07,0x0f,0x07,0xd7,0x12,0x1f,0x1f,0x04,0xef,0xfa,0xf7,0x22,0x1d,0x3e,0x1b,0x98,0x0e,0x0b,0xf8,0x0e,0x1a,0x06,0xff,0xf8,0xbf,0x3f,0x0f,0xd3,0x49,0xff,0xdf,0x7f,0xd8,0xcd,0xe7,0x1d,0xd8,0x26,0x2a,0xdb,0xed,0x14,0x5f,0xe3,0xdd,0x20,0xe8,0x0d,0xfe,0x45,0xfc,0x39,0xf8,0x07,0xda,0xfc,0xff,0xd9,0xf0,0x38,0x1b,0xed,0x08,0xf6,0x05,0xfc,0x23,0xeb,0xfc,0x31,0x19,0xe3,0x5c,0x42,0x11,0xa9,0x58,0xcd,0x1e,0x20,0x16,0xc5,0x23,0xe6,0xf3,0x06,0xfd,0xea,0x0a,0x07,0x29,0xe9,0xee,0xc4,0x1d,0x0f,0x30,0x3f,0xc9,0x0f,0x18,0xd6,0x3d,0x06,0x0c,0x10,0xbf,0xdd,0xfa,0xf6,0xdd,0x1f,0x1a,0x0f,0xd4,0xe0,0x2a,0x26,0x19,0x36,0x0e,0xec,0x07,0xf5,0x33,0x28,0xc3,0xae,0x1e,0xe5,0xeb,0x29,0xfb,0x11,0xeb,0x34,0x06,0x06,0x1e,0x7f,0x11,0xfb,0xe6,0xf8,0x0d,0x0f,0x34,0x30,0x10,0xc0,0x0f,0xf0,0x22,0x65,0x29,0xed,0x1c,0xbd,0x21,0x15,0x09,0xde,0x1c,0x20,0xdc,0xff,0x12,0x22,0x0b,0x38,0x34,0xf4,0xc6,0x37,0xff,0x18,0x49,0x11,0x08,0xc9,0x24,0x12,0x11,0x51,0x09,0x25,0xfd,0xff,0xd6,0xff,0xde,0x1b,0x2d,0xcc,0xef,0xd6,0xef,0xfb,0x18,0x30,0x05,0x35,0xf3,0xe7,0x2e,0xfd,0x08,0xee,0x22,0xda,0x0e,0x1e,0x5c,0x2a,0xda,0x09,0x04,0x07,0x2f,0xdb,0xfd,0x31,0xf6,0x04,0x24,0x02,0xea,0x1b,0xed,0x4f,0xfd,0xd3,0x1a,0xf6,0xd4,0x04,0x0c,0x38,0x0d,0xdf,0xdb,0x26,0x04,0x26,0xdb,0x4c,0x22,0x1b,0xfc,0xda,0x19,0x09,0x28,0x17,0x1f,0x58,0xe5,0xe1,0xda,0x7f,0xdc,0x04,0x16,0x1d,0x5b,0x0b,0x0f,0xea,0xdd,0xe1,0xbc,0xfa,0x0e,0x1c,0xf8,0x11,0x1c,0xcb,0x2c,0xad,0x3c,0x23,0x06,0x2d,0x42,0xbc,0xfe,0xf9,0x06,0x5e,0xee,0xe2,0xe6,0xce,0x12,0x24,0xec,0x53,0xd7,0x17,0xd7,0xdb,0xe0,0x04,0x43,0xeb,0x1a,0xff,0x65,0xd0,0x00,0x3c,0x58,0xe3,0xc6,0xbe,0x24,0xc9,0xde,0xe3,0xfa,0x1a,0x38,0xe8,0x0f,0xd8,0x33,0xf7,0x3f,0x32,0x19,0xbe,0x11,0xf0,0x19,0x0e,0x15,0xed,0x23,0xc8,0x08,0xc9,0xec,0x0b,0x1a,0xd1,0xb9,0x15,0xdf,0x23,0x1e,0x11,0xf1,0xf7,0x35,0x23,0x28,0xff,0xcf,0xf6,0x2d,0xc8,0xeb,0x2b,0xd9,0x45,0xcf,0x14,0x33,0x69,0x0d,0x16,0xcb,0x25,0x33,0x40,0x20,0xbd,0x26,0x19,0x2d,0x2a,0x0e,0x20,0xc7,0xd4,0xda,0x03,0xd0,0xfe,0x13,0xfa,0xb9,0xf2,0x29,0x1d,0x25,0x04,0xe8,0xd0,0xf4,0x21,0x1b,0x20,0x03,0x60,0xfc,0x10,0xee,0x6a,0xf8,0xfd,0x2a,0xe8,0xf8,0xef,0xf6,0xbe,0x28,0xf9,0xec,0xff,0xd3,0x0e,0xca,0xf6,0x00,0xe2,0xda,0x5a,0xe1,0x08,0x15,0x65,0xe9,0xfc,0x19,0x19,0x20,0xf2,0xf6,0xdf,0xf6,0x2a,0x10,0xfa,0x0f,0xee,0x08,0xef,0x1e,0xf5,0xd5,0xec,0x00,0xf6,0x2b,0xcc,0xea,0xb5,0x77,0x81,0xfc,0xc1,0xdb,0xe2,0xfd,0xcf,0x66,0x53,0xc2,0x1b,0xe0,0x02,0x1b,0x02,0xe2,0x01,0xee,0x09,0x08,0xc6,0xfc,0x0a,0x16,0xe6,0xe9,0x11,0x05,0x34,0x0a,0xfe,0x11,0x17,0x1f,0xd9,0xd6,0xf9,0x04,0x21,0xd8,0x1a,0x1f,0xfd,0x13,0xf6,0x21,0x07,0xeb,0x06,0xeb,0xc8,0xa4,0x2a,0xae,0x4d,0xb9,0x3f,0x60,0x9e,0x19,0xe7,0x11,0x73,0xff,0xec,0x3c,0xe4,0x33,0x4f,0x02,0xd1,0xf5,0xd0,0xe9,0x97,0xb2,0xa3,0x46,0xf9,0x02,0xe1,0x2a,0xd0,0x16,0xe3,0x08,0xf3,0xf1,0x32,0xfe,0xd4,0xf3,0x3a,0xc8,0x20,0x85,0xd2,0x19,0x73,0x40,0x5e,0xcc,0xdd,0x07,0xa5,0xba,0xcf,0x60,0xfe,0xe7,0x1e,0x01,0xf5,0xd1,0x1c,0x3a,0xd0,0x18,0x19,0xbe,0x1a,0x2b,0x7f,0x4c,0xef,0x2f,0x8b,0x39,0xf2,0x30,0xb5,0x59,0xf1,0x6f,0x02,0xcc,0xd4,0xdf,0x2e,0x05,0xd5,0x47,0xd9,0xec,0xea,0xaf,0xd2,0x20,0x5b,0x49,0xd7,0x30,0xc3,0xad,0xba,0x05,0x0b,0xd9,0xf4,0x3d,0x72,0xec,0x30,0xb5,0x48,0x2e,0xc7,0xe7,0xde,0xe2,0xc4,0x50,0xdc,0x43,0xf4,0xe4,0x2f,0x14,0x47,0xca,0x04,0x33,0x16,0xf3,0xae,0x0a,0x66,0x23,0x35,0x21,0x37,0xd8,0x10,0x12,0xf5,0x7f,0x08,0x58,0x6b,0x3d,0xb0,0xd7,0x08,0x18,0xf4,0x00,0x41,0x29,0x89,0x07,0xfd,0xe3,0x1d,0x15,0xee,0x09,0x0e,0x18,0x07,0x21,0x01,0xd2,0x23,0x3f,0x30,0xc5,0x1e,0x51,0x31,0xbe,0xd7,0x5c,0x1c,0x11,0x50,0xcb,0xd6,0x3c,0xfc,0xbd,0x1a,0x5d,0xe9,0xde,0x2d,0xed,0xae,0x09,0x44,0x4a,0x7b,0x5f,0x05,0x22,0x4c,0x4f,0x04,0x36,0xf8,0x07,0x17,0xaf,0xea,0x3d,0xd3,0x3c,0xee,0x21,0xe4,0x30,0x59,0xf3,0xce,0x3f,0x03,0x1e,0xc4,0x05,0x35,0xd0,0x12,0x17,0xfa,0x22,0xfa,0xf0,0x24,0x24,0xe3,0xe9,0xf9,0x2d,0x6a,0xf6,0x2e,0xe4,0x3b,0x25,0xc5,0xf6,0x3a,0xc6,0xf2,0x29,0xca,0x2c,0x7c,0xf9,0xeb,0x00,0xde,0xd7,0x27,0xd3,0x22,0x21,0x73,0x38,0xec,0x05,0xfb,0xdb,0xfa,0xf9,0x3a,0xa1,0xf0,0xdb,0x7f,0xec,0xe7,0x12,0x1a,0x3a,0xfb,0xc7,0x10,0x0e,0x11,0x09,0xf5,0xdf,0xf7,0xe5,0xe9,0x1b,0x38,0x12,0x1e,0xf3,0xfa,0xde,0x17,0x04,0x06,0xe3,0x1e,0x03,0xe7,0xa9,0xca,0xb2,0xdb,0x0a,0xde,0x24,0x11,0x02,0x19,0xd3,0xf7,0xef,0xdc,0x03,0xfb,0xe5,0x22,0x39,0x13,0x3a,0x04,0xe7,0xf3,0x41,0xed,0xf2,0xc1,0x52,0x03,0xd4,0xe9,0xf9,0xbb,0xc0,0xee,0x0f,0xf0,0xe1,0xd4,0xc4,0x0e,0x0d,0x2b,0x41,0xc4,0xea,0xf6,0x3e,0xe6,0xfc,0xdf,0x35,0x15,0x08,0x1d,0x01,0xd1,0xe3,0xf7,0xf6,0xea,0x1a,0x1b,0xfd,0x1b,0x08,0x00,0xcb,0x05,0x12,0xfb,0x43,0xe1,0xff,0x22,0x0a,0x02,0x08,0xf7,0xea,0x13,0xf3,0x1a,0xd8,0xe4,0x25,0xed,0x0d,0x0f,0xf6,0x00,0x0f,0x12,0xe1,0xdd,0x0c,0xd3,0x0b,0x03,0xef,0x1d,0xdb,0xe9,0x16,0xe4,0x3c,0x25,0x02,0xbe,0x44,0xe5,0x11,0x39,0x5b,0x0c,0xda,0x1f,0x11,0xee,0x2c,0x2d,0xea,0x1b,0x00,0x16,0x1c,0x0e,0x07,0x00,0xe5,0x15,0x1b,0xfb,0x16,0x13,0xf3,0x1a,0x0e,0x0b,0x2d,0x15,0xf4,0xed,0xfb,0x22,0x1f,0x0a,0x21,0xfa,0x03,0xcc,0x21,0x0a,0x03,0xf5,0x42,0xf0,0xee,0xfe,0xf1,0x0a,0x7f,0xdb,0x03,0x14,0x30,0x2d,0x1b,0xf7,0x02,0x11,0x1f,0x0b,0x01,0x14,0x3f,0xf1,0x04,0x08,0x21,0xf7,0x03,0xe7,0xf1,0x18,0xf3,0x11,0x02,0x41,0xee,0x2b,0xf3,0xf1,0x29,0x10,0xe2,0x17,0x04,0xed,0x2d,0x02,0xfb,0xc9,0x09,0xf9,0xec,0x0f,0x16,0xdf,0xf4,0x0e,0x1a,0x07,0x28,0x14,0x2b,0xf5,0x09,0xe5,0xfa,0x0d,0x31,0x35,0x4f,0x11,0xfd,0x10,0xf5,0x7f,0xf8,0xee,0x36,0xf8,0x0f,0xe0,0xfc,0xf8,0x29,0xe4,0x0d,0x02,0x10,0x18,0xeb,0x08,0x11,0xe6,0xfe,0x0c,0x0e,0x01,0x0f,0xf6,0xf0,0xf3,0xed,0xfa,0xe6,0x0e,0x0f,0xe7,0xfd,0xf4,0x05,0xfa,0x05,0xf5,0xe2,0xed,0xfe,0x10,0xf2,0x0a,0x00,0xc4,0x42,0xec,0xef,0xfa,0x1d,0xd4,0x1f,0xe6,0xfd,0x1d,0xe9,0xf0,0x00,0x0a,0x02,0x12,0xec,0x05,0xfb,0x03,0xf6,0xf8,0xea,0x1e,0x2a,0x17,0x15,0xf5,0x02,0xfa,0x1c,0xe8,0x19,0xf9,0x23,0xdc,0xea,0x00,0x2e,0x29,0xee,0xe8,0xf8,0x27,0xf4,0xf6,0x01,0xbe,0xe0,0x0c,0x21,0x0f,0x65,0x24,0xf6,0xda,0xf3,0x14,0x39,0xfa,0x09,0xe3,0xe2,0x1e,0xdc,0x75,0xcf,0x2e,0x31,0xeb,0xf2,0xe0,0x24,0x55,0xeb,0xb4,0xe7,0x7f,0xc0,0x25,0xea,0xe5,0xf9,0x23,0xed,0x47,0xf7,0x01,0xd3,0x48,0xe1,0x2d,0xe3,0xe0,0xa2,0xf6,0x3b,0xee,0xc8,0x18,0x08,0x06,0x28,0x2d,0x26,0xc9,0x06,0xfd,0x9a,0x11,0x1d,0xe1,0x10,0xd9,0xdf,0x1a,0x0d,0xf8,0xe6,0x04,0x23,0x26,0xe4,0xee,0x0a,0x4b,0xeb,0x3c,0xbf,0xfe,0xe7,0x4a,0xf7,0xec,0xe7,0x28,0x2f,0xfa,0x09,0xef,0x06,0xdf,0x11,0x40,0xdb,0xfe,0x18,0xee,0xdf,0x34,0x00,0x09,0x15,0xf5,0x57,0xe8,0x4d,0xeb,0xd5,0x15,0x39,0x45,0x28,0x14,0x16,0x13,0xd8,0xca,0xea,0x27,0xe0,0x21,0x1d,0xd3,0xf8,0x26,0x02,0x38,0xff,0x43,0xd6,0x10,0x42,0xb5,0xec,0xfb,0xca,0x37,0xe3,0x10,0x23,0x2b,0xf6,0x28,0x47,0x4c,0xe0,0xc9,0x16,0x28,0xf2,0xeb,0x28,0x7d,0x7f,0xe3,0xf2,0xf3,0x04,0xe5,0xf6,0x19,0x35,0xe1,0x31,0x4e,0x00,0xdc,0x36,0xd6,0xa5,0x27,0x4f,0xe7,0x2a,0x1c,0x1e,0x05,0xfb,0x33,0x11,0x04,0x30,0xe4,0xf4,0xe6,0x1e,0xd6,0xd7,0x12,0x0b,0x19,0x4b,0xe5,0xda,0x4c,0x26,0x20,0x24,0xe9,0x0d,0xdf,0xe1,0x23,0x33,0x36,0x16,0xd0,0xbe,0x4b,0x6a,0x48,0x49,0xf1,0x49,0xfa,0xf5,0x33,0x21,0x30,0xe3,0xef,0xef,0xe4,0x45,0xfe,0xd7,0x01,0x2f,0x00,0x10,0xcf,0xfe,0x15,0x36,0x15,0xe6,0xec,0x00,0x28,0x13,0x13,0xe4,0x3b,0xd0,0xdb,0xdd,0x19,0x0c,0xfc,0x0a,0x59,0x26,0xcb,0xc8,0xf1,0x0a,0x19,0x34,0x06,0x40,0x1e,0x4a,0x0a,0x12,0x07,0xce,0xb9,0xb5,0xc8,0xee,0x3d,0x3b,0x0f,0x35,0xc7,0xf6,0xda,0xf2,0x19,0x4b,0xed,0xf1,0x1c,0x92,0xd6,0xbc,0xda,0x22,0x52,0xf2,0x57,0xe0,0xea,0x0d,0xde,0xff,0xe2,0x54,0xef,0xcb,0xf1,0xae,0xee,0xff,0xc0,0xae,0xe9,0x6d,0xd1,0xf0,0x35,0xd8,0xfc,0x0d,0x60,0xe9,0x3a,0xec,0xd0,0x2a,0x1f,0x19,0x48,0x33,0xea,0xb7,0xde,0xbd,0x48,0x8e,0x13,0xff,0x0a,0x18,0x17,0xea,0xfc,0xda,0xbc,0x7f,0xf1,0x2e,0xdf,0xfd,0xe7,0x26,0xce,0x1d,0x02,0x2a,0xf9,0xd3,0x13,0xfc,0xe6,0xd9,0xb3,0xf5,0x03,0xfb,0xd1,0x34,0xcc,0xcf,0xe8,0x45,0xd1,0x0a,0xdc,0x0f,0xfa,0x9d,0xe7,0xc2,0x06,0xe6,0x58,0x35,0xd0,0x24,0xef,0x04,0xea,0x4b,0x3c,0x16,0x09,0xaf,0x24,0x0d,0x23,0x25,0x1a,0xf4,0x2a,0x39,0xcf,0xd3,0x0f,0xaf,0xe0,0x1b,0x39,0x08,0x08,0xb7,0x38,0xb1,0xfb,0x01,0xd1,0x35,0x00,0x17,0xe8,0xdc,0xc7,0x11,0xd4,0xff,0x4a,0xa9,0x54,0xd5,0xdd,0x31,0xfd,0x23,0xf9,0xf3,0xb2,0xbb,0x23,0xe0,0xef,0xfd,0x02,0x5a,0xd4,0xf6,0x19,0xdd,0xe0,0x0f,0xaf,0xe0,0x0f,0xb5,0x1c,0x16,0xcc,0xda,0x10,0x78,0xcc,0x40,0x0d,0xd1,0xe6,0xf8,0x51,0xef,0x1f,0x47,0x54,0xef,0x45,0xcd,0xdd,0x06,0x36,0x48,0xf9,0xd3,0xc5,0x9d,0xbb,0xc7,0xbd,0xf2,0xae,0x1f,0x43,0x39,0xf8,0xf2,0x0a,0xea,0xd1,0x04,0x0b,0xfe,0xb8,0xb3,0x7f,0x0f,0x16,0x1d,0x5a,0x00,0x12,0xef,0x01,0x55,0x2a,0x23,0xe4,0xec,0xf1,0xb9,0x5c,0x08,0x05,0xf8,0x19,0x1b,0xc1,0x11,0x1a,0xe7,0xe4,0xc4,0x02,0xeb,0xcc,0xea,0x0e,0xe9,0xb3,0x0c,0xf4,0xdb,0x58,0xdc,0x1d,0xbf,0x03,0x19,0x30,0x10,0xea,0xf4,0xf2,0xe8,0x5f,0xf3,0xe9,0x13,0x11,0xd2,0x28,0x34,0xeb,0x2a,0x04,0xe0,0x1f,0xd8,0xc6,0x7f,0xef,0x2b,0xe7,0xca,0x0a,0xee,0x31,0x31,0xd1,0x94,0xf5,0x11,0xd6,0x57,0xf8,0x33,0x12,0x23,0x0e,0x1c,0x07,0x01,0xeb,0x16,0xfb,0x08,0xf9,0x1c,0xe6,0x0c,0x14,0xdc,0xe5,0xd9,0xfe,0xcc,0xf8,0xfa,0xfd,0x28,0x01,0xc6,0x50,0xec,0x22,0x61,0xe2,0xed,0x1d,0x63,0x17,0xac,0x05,0x5b,0xbf,0xc1,0xe4,0xf2,0xf9,0xcf,0xf1,0xfc,0x68,0x0e,0x31,0x30,0x01,0xe9,0x1f,0x05,0xfc,0x0a,0x17,0xc3,0x54,0xbb,0x06,0x5b,0xec,0xc3,0x0d,0x15,0x38,0x16,0xbd,0xce,0xda,0xff,0x30,0xc9,0xfa,0xfb,0x00,0xf8,0xe2,0x4e,0xee,0x01,0x0f,0x1c,0x1c,0x1a,0x49,0x3b,0xdc,0x2a,0xc9,0xcd,0xef,0xeb,0x20,0x1e,0xd3,0xe7,0xe1,0x3a,0x19,0xe0,0x05,0x04,0xf2,0x09,0xf9,0x5d,0x11,0x5a,0x18,0x14,0xe6,0xcf,0x01,0xfb,0xfd,0x27,0x5d,0xfd,0x27,0xf8,0x10,0x07,0x0a,0x09,0xf2,0x29,0x08,0xda,0x11,0xf8,0xd2,0x16,0x26,0xe3,0xfe,0x2a,0x7a,0xe1,0x07,0x54,0x27,0xf2,0xce,0x38,0x0f,0x0d,0x38,0xe4,0xce,0x4a,0x3d,0xee,0x10,0x3a,0xf8,0x1d,0x1b,0x2c,0xea,0x05,0x2e,0xef,0x01,0x0a,0xec,0xda,0xee,0x6c,0xed,0xfd,0x16,0xf2,0x2a,0xe7,0xce,0x05,0x39,0xf1,0xf3,0x44,0x7f,0x04,0xeb,0x0b,0xfc,0x14,0x1d,0x0a,0x15,0x21,0x0c,0x34,0x16,0x15,0xf8,0x34,0x0e,0xda,0xbf,0xe7,0x01,0x04,0xe2,0x0e,0xdd,0x34,0x07,0x03,0x03,0x09,0xa6,0x44,0x1f,0xc8,0xfe,0x06,0x49,0x22,0x29,0xe2,0x32,0xeb,0xd7,0xf0,0xe3,0x2c,0x46,0xf2,0xba,0xd3,0x1c,0xc9,0xe1,0x47,0x01,0xe6,0x09,0x7f,0xa5,0xd4,0x48,0xff,0x7a,0xf3,0x33,0xfb,0x2b,0xfc,0x4a,0xef,0xf0,0x05,0xd0,0x27,0x15,0x2a,0x0f,0xe9,0xf9,0xed,0xff,0xfc,0xc7,0xcb,0x25,0xdb,0xe3,0x63,0x16,0xe4,0xab,0x73,0xd7,0x32,0xff,0x10,0xf7,0xfd,0xcb,0x26,0xda,0xeb,0xfe,0xf0,0x26,0xee,0x1c,0x08,0xbc,0x48,0x28,0x10,0x1f,0x06,0xf8,0xfc,0xe9,0x3f,0x17,0x14,0xd5,0xfd,0xd2,0xe3,0x3f,0x14,0x30,0x27,0xcc,0xda,0xe1,0x03,0xfe,0x07,0x20,0x12,0xd3,0x07,0x1d,0xfb,0x0c,0xc5,0xda,0xf9,0xa8,0xcd,0xce,0xef,0x35,0xef,0xc8,0x0a,0x47,0xc4,0xc9,0x09,0x06,0x4d,0x09,0xf3,0x11,0xdf,0xea,0x0d,0x0a,0x0c,0xc2,0xd0,0xcd,0xec,0xe7,0xf6,0x3c,0x04,0xd9,0x04,0xea,0xe4,0x09,0x20,0x3b,0xdb,0xd6,0x4e,0x9f,0xb1,0x23,0xca,0x81,0x13,0xc0,0x21,0xab,0x10,0x3a,0x8d,0xfb,0xd4,0x07,0xe1,0x15,0x26,0x4f,0xe1,0x06,0xce,0x34,0x1f,0x0d,0x53,0x0e,0x23,0x00,0xf0,0xb5,0x09,0x44,0xfb,0xf8,0xef,0xde,0xc8,0x08,0xea,0x56,0xf4,0x47,0x40,0x19,0x4f,0xe2,0x96,0x27,0xff,0x03,0xb2,0xf3,0xc4,0xdf,0xdd,0x06,0xfc,0xf7,0xf7,0x40,0xaf,0xc4,0x10,0x2b,0xfa,0xdd,0xf3,0xe4,0xc7,0x20,0xa3,0xfb,0xe2,0x0a,0xc3,0x11,0xd7,0xf5,0xff,0x38,0xf2,0x0d,0xdc,0x55,0x2b,0x2e,0x34,0xf8,0x46,0xc8,0xca,0x20,0x0c,0x15,0xdf,0x30,0x31,0x0f,0x25,0x51,0xf3,0xde,0xdc,0xea,0xcf,0xa0,0x9a,0xd0,0x28,0xfc,0xee,0xf4,0x26,0x0d,0x09,0x09,0x27,0xef,0x13,0xbf,0x1a,0x0d,0xd4,0xfe,0x18,0xd2,0x04,0x4d,0xde,0x21,0x10,0x08,0xcf,0xfc,0x0b,0x12,0x29,0xd9,0xf4,0xd6,0xeb,0x3b,0x1e,0xf3,0xf0,0x5a,0xd3,0x10,0x2c,0x04,0xfe,0x20,0x44,0x05,0x12,0x6f,0xfd,0x08,0x5b,0x1f,0xf5,0xc2,0x0c,0x3d,0x2c,0xfc,0xf6,0x0a,0x7f,0x2a,0xe7,0x62,0x3e,0xf1,0x0c,0xec,0x03,0x18,0x12,0xc2,0xf8,0x1d,0x12,0x02,0x04,0xd2,0x44,0x38,0xd9,0x17,0x09,0xb6,0x46,0x1d,0x17,0x6a,0xf1,0xe6,0xd5,0x2d,0x0e,0xd3,0xfe,0xee,0xe9,0x1c,0x11,0x3e,0xb8,0x1a,0x29,0x01,0xcd,0xb6,0xfb,0x1c,0x05,0xe6,0xfd,0xdd,0xd0,0xea,0x1e,0xec,0xfb,0xeb,0x00,0xe1,0x0d,0x19,0xbd,0xfa,0xf8,0x34,0x7f,0x0b,0xf8,0xf3,0x01,0x1f,0xdf,0xdf,0xec,0x02,0x00,0xf6,0xef,0x1f,0xe0,0xe1,0x00,0xec,0x44,0x17,0xda,0xd6,0xf3,0xe9,0x08,0xda,0x3c,0x1a,0xbc,0x1e,0x06,0x05,0xe1,0x06,0xde,0xe2,0x23,0xd4,0x28,0xef,0x18,0x08,0x0b,0xdc,0xd1,0xf4,0x11,0xe9,0xe9,0xf8,0xf0,0xca,0x19,0xeb,0x07,0x0e,0x1e,0xe6,0x51,0x13,0xe2,0x18,0xfb,0x24,0x27,0x30,0x13,0x04,0xf3,0xe4,0xd9,0x08,0x07,0x13,0x2e,0xca,0x4c,0x1d,0xd8,0x09,0xcc,0xbf,0x02,0xf2,0xe6,0xf6,0x40,0xd7,0x05,0xd0,0xec,0xe0,0xd7,0xd2,0x02,0x19,0x29,0x32,0xfd,0xeb,0x1c,0x03,0x3d,0xf1,0xde,0x1e,0x1f,0x0b,0xdc,0x1f,0xea,0xf3,0x44,0x2c,0x45,0xf8,0xf8,0xed,0xde,0xc6,0x0e,0xdf,0x17,0x04,0x05,0x52,0xa5,0xe7,0xd3,0x62,0xcd,0x28,0x2e,0x2e,0xab,0x12,0x7f,0x00,0x1d,0xab,0xcc,0xfa,0xde,0x1f,0x5e,0x55,0x0f,0xdd,0x37,0x4a,0xf1,0x30,0x29,0x18,0xda,0x09,0x23,0xdc,0x25,0xdf,0x61,0x09,0x21,0x4c,0xa0,0x2c,0xbd,0x16,0xef,0x1f,0xe2,0xff,0x51,0x44,0x08,0x19,0xe6,0xb7,0xd4,0x29,0x2c,0xf8,0x21,0xdd,0x2e,0x08,0x03,0x4a,0xde,0x05,0x92,0xe8,0xe7,0xe6,0x73,0x07,0x3a,0xa3,0x02,0xcf,0xea,0x0f,0x3c,0x12,0xd4,0x00,0x40,0x07,0xfe,0x3f,0xd4,0xbc,0x21,0xe8,0xbc,0xd3,0x5f,0xf3,0x45,0x1a,0x29,0x07,0xff,0x1d,0xb4,0x2d,0xfa,0xfa,0x27,0xc9,0xc0,0x11,0x42,0xcf,0xb4,0xcb,0xf7,0xce,0x0f,0x00,0x11,0x54,0xc4,0xd8,0xc6,0x04,0x10,0x23,0x33,0xd5,0xf9,0xe4,0xc5,0x19,0x22,0xe6,0xe3,0x0f,0x2b,0x05,0x40,0x23,0x18,0x28,0xc2,0x49,0x10,0xb1,0xfd,0xd9,0xf3,0x29,0x14,0x21,0xdb,0xf7,0x1d,0x1c,0x2f,0x37,0xe4,0x12,0xd2,0x15,0xe4,0xfc,0x02,0x3d,0xad,0xbc,0xbd,0xd9,0xeb,0x3b,0xdb,0xd0,0x35,0xf4,0xf7,0x11,0xee,0x32,0x3d,0x59,0x2d,0x1c,0xe7,0x05,0xdb,0x15,0x18,0x1f,0xd2,0xe0,0x0c,0x5a,0xca,0x08,0xda,0x20,0xbe,0xf3,0xf3,0xb5,0x56,0x08,0x07,0xfd,0x65,0x16,0xe9,0x12,0x2b,0x07,0xbc,0xdd,0xf1,0xdb,0xdf,0xea,0xde,0x4c,0xfc,0xc5,0xfb,0xbc,0xf8,0x08,0x07,0xde,0xea,0x2c,0x20,0x2a,0x0a,0x2c,0x0f,0x0e,0xc3,0x01,0x24,0xcf,0x81,0xc2,0x48,0xb6,0xf3,0xba,0xda,0xe0,0xd2,0xea,0x0b,0xdf,0x4a,0x42,0x1b,0xd0,0xd6,0xd4,0x2d,0x1f,0xd7,0x8f,0xcc,0x41,0xda,0xfc,0xe1,0x36,0x15,0xfe,0x4e,0xaa,0x08,0xe5,0x0d,0x8f,0x11,0xc3,0xed,0xfb,0xec,0x37,0xa9,0x65,0xc2,0x0d,0xe4,0x1a,0x1c,0x45,0x03,0x08,0xf4,0xf7,0xbb,0x23,0xe4,0xeb,0x0e,0xed,0x29,0xfd,0xff,0xe9,0xd5,0xe8,0xb5,0x0b,0x0a,0xdb,0xb1,0x3b,0x2d,0xf5,0x42,0xc1,0x12,0x84,0x10,0xe9,0xe9,0xe7,0x3c,0xa3,0xd0,0xe2,0x11,0xbc,0x94,0x4d,0xba,0x00,0x0e,0x53,0xe8,0xef,0xf0,0xd9,0xf9,0xcf,0xf3,0xed,0x5e,0xe4,0xf1,0x14,0x2a,0xfd,0x0d,0xea,0xee,0x1a,0xcb,0xea,0x2b,0xa8,0x48,0x3e,0xf0,0x0c,0x18,0xec,0x1e,0xaa,0x16,0xb9,0x75,0x61,0x7f,0xcb,0xfd,0x40,0x14,0x3b,0x41,0xd5,0xf7,0x2b,0x27,0x00,0x10,0x3b,0x0a,0xb9,0x31,0x03,0x1f,0xf5,0x55,0x12,0x13,0x4b,0x04,0x0c,0x25,0x07,0xf5,0x96,0x1f,0x5f,0xe4,0x43,0x11,0x32,0xe1,0xe7,0x39,0xfb,0x1b,0x0c,0x36,0xfe,0x0b,0x08,0xff,0x3e,0x03,0x1e,0xe7,0x0a,0xf0,0xe1,0x34,0x18,0x0e,0xe1,0x02,0xe5,0xbf,0xe3,0x13,0x05,0x0e,0xeb,0x7f,0x06,0xce,0x0c,0x14,0xcd,0x09,0x2f,0xde,0x1c,0x00,0x09,0x4b,0x17,0x45,0xe8,0x32,0x28,0xf5,0xc4,0x17,0xeb,0xe1,0xda,0xdf,0x03,0x18,0x0a,0x07,0x24,0x21,0x0d,0xd4,0x11,0xdb,0x0b,0xf4,0xba,0x10,0xd0,0xf6,0xd4,0x0f,0xec,0x1f,0x0b,0x27,0xe4,0x4f,0xee,0x4e,0x3b,0x32,0x11,0xe0,0xe8,0xb8,0x11,0xdd,0x22,0x27,0x1d,0xeb,0xef,0xec,0xe8,0x21,0xee,0xff,0xd6,0xb9,0xf6,0x08,0xc9,0x30,0xef,0x06,0xb6,0x9b,0xe3,0x05,0x21,0xfd,0x01,0x4f,0xe6,0xe5,0xf2,0x1d,0xbd,0xfe,0xa4,0x41,0x1f,0xdf,0xd3,0xdd,0xb7,0x1c,0xd8,0xfc,0xdd,0xee,0xfb,0xd5,0xc8,0xb8,0x96,0xdd,0xb8,0x11,0x02,0xe7,0xee,0xbb,0xd6,0x19,0xda,0xde,0x07,0x19,0x16,0x27,0x0e,0xfd,0x17,0xa9,0xc4,0xd2,0xec,0xd2,0x04,0xa0,0xe2,0x08,0xb1,0x08,0xab,0xd5,0x0a,0xf4,0xe5,0xea,0xcf,0x06,0x1f,0x8f,0xd4,0x0b,0x02,0xf5,0x47,0xca,0x05,0xf3,0xf2,0x10,0x1c,0xfb,0xea,0x1c,0xfc,0x02,0x08,0xc5,0x81,0xa1,0xc3,0x59,0xb2,0x59,0xfe,0x29,0xd2,0xbf,0x1f,0xce,0xb2,0x08,0x27,0xf1,0x0a,0x11,0xc4,0x13,0xa3,0x19,0xfe,0xee,0xe5,0xe5,0x0f,0xec,0x28,0xe3,0x1d,0xc0,0xeb,0xf6,0xe1,0x31,0x0c,0xd3,0xea,0xf6,0xf6,0xdc,0x12,0x48,0xd4,0xdf,0xf1,0x6b,0xdf,0xd6,0xfb,0x04,0x4d,0xec,0x09,0x1c,0xa7,0xf0,0x6d,0x09,0xdd,0x1f,0x1b,0xe1,0xe2,0xf2,0xf6,0xe2,0xef,0xeb,0xfc,0xd6,0xfb,0x2d,0xe8,0x19,0x0e,0x0d,0x07,0x35,0xdd,0xab,0x29,0x49,0x25,0xdd,0xee,0xed,0x1a,0x3c,0xe0,0x22,0x11,0xde,0x20,0x0d,0x2f,0xcc,0x45,0x12,0xf2,0xd3,0x40,0xde,0xb8,0xe5,0x13,0x17,0xd5,0xf3,0xd9,0xe7,0xe7,0xeb,0x03,0x03,0x32,0xf6,0xd1,0xf6,0xe8,0x22,0xd7,0x1d,0x06,0x2b,0x2a,0x28,0x33,0xe1,0xdf,0x21,0x2c,0x10,0xd0,0xcf,0x7f,0xc9,0x31,0x35,0x21,0x1b,0x01,0x17,0x3b,0x09,0xce,0x2f,0xc3,0x1a,0xbb,0xf6,0xed,0x33,0x0f,0xec,0xfa,0xf4,0x42,0xe3,0xf9,0x17,0x0b,0x21,0xdd,0x57,0x06,0xff,0x2b,0xec,0xce,0x0b,0x1a,0x00,0x1d,0xd3,0xdb,0x03,0x12,0x2f,0x0f,0xf2,0x0b,0xbe,0xd7,0xd7,0xbd,0x33,0xda,0x1a,0xf5,0xbb,0x02,0x66,0xfd,0xf6,0x53,0x3d,0x16,0xcf,0xfb,0x02,0x4e,0xf9,0x51,0x0b,0xfa,0xa4,0x1b,0xfe,0xe6,0x9a,0x4f,0x1f,0xf8,0x0e,0xd9,0x7f,0xbd,0xfb,0xd9,0x05,0xbd,0x36,0x20,0x12,0xc6,0xec,0xd4,0x14,0xc7,0x5e,0xae,0xe1,0x31,0xf4,0x37,0x1d,0xca,0x13,0x0e,0xbb,0xda,0x19,0x27,0xf2,0x01,0xf4,0x02,0x41,0xeb,0x0d,0x02,0x11,0x0c,0xf9,0xcd,0x13,0x08,0x19,0xf2,0x01,0x5a,0x34,0x06,0xcf,0xff,0xa1,0xf9,0xd6,0x21,0xea,0x25,0xd6,0x0e,0xd0,0x11,0x08,0xc2,0xfb,0xc6,0xf4,0x74,0x7f,0x17,0x3a,0x0e,0xf9,0x0b,0xcd,0xe0,0xe3,0x17,0xf4,0xfa,0x2d,0xe0,0xec,0xd7,0x06,0xe6,0xff,0xf8,0xd6,0xdd,0xfe,0xea,0xfb,0xff,0xda,0xfc,0x2b,0x63,0xeb,0xec,0xce,0x61,0xf9,0xdc,0xf9,0xfc,0xe8,0x01,0xe0,0x73,0x29,0x08,0x75,0xf0,0x12,0x6f,0x38,0x07,0x22,0x07,0x20,0xdc,0xe2,0x2e,0xea,0xe2,0x01,0x2e,0xde,0xff,0x29,0x13,0x11,0x27,0xec,0x08,0xfc,0x21,0x2a,0x1d,0x5d,0xe0,0x78,0x35,0x07,0xc8,0x2f,0xd9,0xf6,0xfb,0x0b,0x3a,0xf8,0xf8,0xe1,0xfa,0xce,0xef,0x40,0xcf,0x3c,0xeb,0x67,0x2e,0xff,0x01,0x1d,0xdf,0xfe,0xfd,0x07,0x0b,0xfe,0x27,0x0d,0x70,0x08,0xfd,0xf3,0xf7,0xfa,0xc7,0xde,0x0e,0x53,0xfc,0x12,0x0f,0xe3,0xe6,0x01,0xe6,0x12,0xb3,0xad,0x25,0x4c,0xc2,0x20,0x1a,0x28,0xba,0x12,0x31,0x44,0x1a,0x41,0x3a,0x13,0x06,0xeb,0xfd,0xf4,0x37,0x78,0x0e,0x31,0x4b,0x02,0xf7,0x08,0x2e,0x3e,0xed,0x03,0xd3,0x0f,0xcf,0x3a,0xeb,0xfb,0x96,0xe9,0xdb,0x0f,0x53,0x00,0x2f,0xec,0xda,0x0d,0x52,0xf6,0x6f,0xd7,0x3c,0x14,0xa5,0xe9,0x81,0xcd,0x36,0x18,0xee,0xcb,0xda,0xd6,0xf1,0xec,0x17,0x27,0xeb,0xff,0x21,0x1c,0x0b,0x7c,0x34,0x1c,0xe7,0x03,0x0f,0x00,0xe9,0x00,0x19,0x3e,0x01,0xa2,0xc3,0x74,0xe8,0x31,0xed,0xf1,0x09,0xeb,0xdd,0xe5,0x42,0x52,0xff,0xf4,0xdf,0xf0,0xf3,0x62,0x01,0xfc,0x12,0x2c,0xde,0xf8,0xe2,0x19,0x1c,0x1d,0x15,0x34,0x1d,0xf1,0xf0,0x09,0x1c,0xd8,0x1e,0xee,0xfa,0x30,0xdf,0xec,0x0c,0x03,0x1f,0x28,0x20,0x0a,0x09,0xff,0xf3,0x43,0x68,0xe7,0x21,0xe8,0xfd,0x7f,0xc0,0xd2,0xf0,0x1f,0xf9,0x1b,0x04,0x25,0x3b,0x4a,0xfc,0xb2,0x2c,0xf0,0xcb,0x42,0xf7,0xc6,0x31,0x21,0x35,0x2b,0x0a,0xfa,0xd3,0xe6,0x35,0xd2,0x0f,0xdc,0x97,0x02,0xc5,0x19,0x51,0xd5,0xdb,0xd9,0xbe,0xcc,0xd8,0xdd,0xc8,0x3b,0xe6,0x0b,0xee,0xf1,0x28,0xc7,0xdd,0xec,0x11,0xf2,0x0d,0xa5,0xd9,0x03,0x1f,0xbc,0xe1,0x19,0x3d,0xf7,0x00,0x60,0xf4,0xe9,0x22,0x13,0xd2,0x02,0x1a,0xf3,0xfe,0xea,0xb3,0xc5,0x06,0xf7,0xb8,0x45,0xc5,0x27,0x00,0x0d,0xfb,0x03,0x3d,0xd2,0xf4,0x22,0xcd,0x23,0xf7,0x29,0x06,0x9d,0x26,0xfd,0x0f,0x1a,0x30,0x14,0x3e,0xcc,0xee,0xe2,0xba,0x0d,0x07,0x02,0x68,0x30,0xf8,0x24,0xe7,0x06,0xdd,0xed,0xf2,0xf2,0x7f,0x0f,0x1c,0xec,0x3a,0xfa,0x01,0x18,0x03,0x1e,0xf4,0x01,0xde,0xfd,0xe1,0xf4,0x08,0x0a,0x09,0xf9,0x19,0x23,0xff,0x2e,0x00,0xf3,0xee,0xf3,0xf9,0x03,0xe4,0x23,0xfe,0x29,0x0c,0x12,0xec,0x21,0x04,0x03,0x0c,0x20,0x08,0x23,0x1e,0x40,0xee,0x1e,0x14,0x08,0x08,0x03,0x0a,0xfe,0xdf,0x00,0x19,0xff,0xf3,0x04,0x0a,0xf2,0x01,0x1e,0x19,0x0a,0x23,0x09,0x21,0xee,0xff,0x00,0x01,0x03,0xfa,0x1a,0xfd,0xf3,0x0c,0xee,0x14,0x08,0x0e,0x03,0x15,0xf3,0xfe,0xe9,0x01,0xd7,0x03,0x03,0xf0,0x2c,0x3a,0x03,0x03,0x04,0x0b,0xe4,0x05,0xeb,0x34,0xff,0x00,0x25,0x21,0xdb,0xd4,0x0b,0xd8,0x06,0xec,0xfe,0x05,0x04,0x04,0x1c,0xf2,0xd9,0xfb,0x09,0xc1,0xaa,0x13,0x1c,0x54,0x8d,0xcb,0xd9,0xc4,0x1e,0xc4,0x21,0x1f,0xd4,0xd7,0x00,0x1a,0xef,0xfc,0x0f,0x4e,0x02,0x10,0xe8,0xcf,0xb2,0xdd,0x21,0x2f,0xf4,0xbe,0xe3,0xfb,0xea,0xdf,0x98,0x03,0xf0,0x7f,0x7c,0x57,0x15,0xfb,0x0e,0xda,0xd0,0x5a,0x20,0xf6,0x3a,0xfb,0x4a,0xec,0xf5,0xee,0x0c,0xf8,0xeb,0xc8,0xed,0x03,0xee,0x27,0x28,0x08,0xe9,0xfd,0x6b,0xcf,0xf3,0x48,0x06,0xba,0xc5,0x9d,0xf3,0xc6,0x19,0xd7,0xa5,0x27,0x40,0x27,0x2b,0x16,0x2c,0xc5,0x11,0xe6,0x23,0x13,0xf7,0xe9,0x21,0x77,0xab,0xcd,0xed,0x44,0xfa,0xeb,0xca,0x04,0xf3,0xdb,0xb4,0xd2,0xd5,0xe0,0xf4,0xd4,0xfa,0xa4,0x1c,0xd7,0xd1,0x88,0xd2,0x14,0xcf,0x10,0x0c,0x05,0x3d,0x26,0x0b,0x1e,0xd9,0xcf,0x0e,0xca,0x01,0x36,0xfe,0x22,0xd5,0x37,0xd6,0xd0,0xbf,0x19,0xc9,0xc9,0xde,0x08,0xb8,0x07,0xf6,0x2e,0xdd,0x10,0x2e,0xf8,0x0e,0xcb,0x93,0xbb,0xbf,0x2a,0x1d,0x50,0x01,0x0a,0xdc,0x2c,0xed,0x08,0xcc,0x87,0x5d,0x1d,0xee,0xed,0xd0,0xfb,0x7f,0xd5,0x47,0x24,0xa5,0xd3,0xe7,0x02,0x25,0xd3,0x17,0xe2,0xf5,0xf5,0xe6,0xf3,0x40,0xca,0x18,0xda,0x4c,0x01,0xdf,0x67,0xf2,0xdf,0x18,0x39,0xf6,0x12,0xa3,0x21,0xcd,0x21,0x62,0x55,0x07,0x7b,0xde,0xea,0x08,0xe3,0xce,0x00,0xfe,0xf6,0xc4,0x4f,0xf3,0x39,0xff,0xea,0x31,0x7e,0x24,0xf3,0xc2,0x47,0xaf,0x10,0x09,0x34,0xd0,0xc9,0xf0,0x4e,0xf1,0x06,0x1d,0x58,0x07,0x4b,0x01,0x0b,0xd1,0x25,0xe8,0x0a,0x40,0xc4,0x2f,0xfd,0xf9,0xe5,0xcf,0xea,0x09,0x00,0x1e,0x07,0xdd,0x50,0x0c,0xfa,0xd8,0x64,0xe7,0xdd,0x0d,0x1b,0x06,0xcb,0x7f,0xf4,0x18,0x11,0x15,0xe8,0xdf,0xeb,0x03,0xe0,0x30,0x0d,0x00,0xba,0xe9,0xe1,0xb5,0x05,0xfb,0xce,0xea,0x3d,0xc7,0xd0,0xd7,0x26,0xde,0xcc,0xfb,0x32,0xed,0xdb,0xec,0x16,0x0e,0x4e,0x27,0xfe,0x1a,0x25,0x15,0x24,0xde,0x0c,0x20,0xe3,0x38,0xde,0x0d,0xf2,0x22,0xd9,0x2d,0x47,0xb7,0x08,0xf7,0xcc,0x12,0x13,0xd6,0x3a,0x1b,0xc4,0xaa,0x06,0xf7,0xf2,0xf0,0x14,0xeb,0x0a,0xfe,0x2b,0xf1,0x0a,0x07,0x1c,0xf1,0xf4,0x36,0xba,0xe2,0x5c,0x1a,0x36,0xd7,0xf8,0xfd,0x35,0xf2,0xf1,0x2f,0x08,0x07,0xde,0x00,0x39,0x08,0xe0,0xe5,0x1b,0xc8,0xe9,0x40,0xc1,0xe8,0x17,0x18,0x07,0x28,0xd0,0xc5,0xd7,0xf0,0xc3,0x0a,0xb7,0xe3,0x49,0x2c,0x15,0xdb,0xd8,0xed,0x11,0xc4,0x96,0xf5,0x19,0x22,0x23,0x05,0xd7,0xfa,0x5e,0xd6,0xcc,0xb0,0xf5,0xd4,0xc0,0xff,0x06,0x5c,0xef,0x0d,0xe2,0x29,0x0b,0xc1,0xe1,0x0d,0x2d,0xe6,0x04,0xd3,0xd8,0xc0,0x2c,0x0b,0x43,0x15,0x09,0x1b,0xd5,0x29,0xde,0xf4,0x0f,0x01,0xf1,0x04,0xfb,0x05,0x0f,0xad,0x26,0xe7,0xf1,0x34,0x08,0xfc,0xf8,0x1c,0xcb,0xf9,0x3d,0x04,0xf0,0xf1,0xd4,0x02,0x42,0x3b,0x31,0x39,0x1d,0xe3,0x30,0xfc,0x1f,0xd5,0xfd,0x36,0x34,0x00,0x3a,0x0f,0x0c,0xd8,0x53,0x0a,0xef,0x11,0x1c,0x7f,0xaf,0xd0,0xfe,0x06,0x05,0x66,0xd2,0xe3,0xe0,0xe0,0x2b,0xf1,0xe0,0xe1,0x45,0x56,0x12,0xde,0xf8,0x1a,0xfc,0x07,0xcd,0x0e,0x03,0x16,0x70,0x2e,0x30,0x35,0xac,0x8e,0x10,0x14,0xdd,0x35,0x4f,0x16,0xfa,0xeb,0x0c,0xf3,0xe2,0x26,0xbd,0xfc,0xd6,0x2b,0x92,0x4d,0xfa,0xfa,0x03,0xf9,0xd6,0xf2,0x3a,0xcc,0xcc,0xe0,0xe9,0xe7,0x0f,0x04,0xfa,0xd9,0xea,0xe2,0xd9,0x0d,0xf4,0xbb,0xfd,0x17,0xfa,0x29,0xee,0xf1,0x7f,0xc5,0xd0,0x04,0x08,0xeb,0x14,0x18,0xe2,0x01,0xca,0xfc,0xe2,0xfc,0x47,0x4b,0x1c,0x46,0xcc,0x19,0x08,0xb8,0xe4,0xff,0x28,0x3c,0xfc,0x25,0xfe,0xc9,0x03,0xd9,0x27,0xe8,0x0c,0x14,0xda,0xf7,0x20,0xf3,0x0a,0x2e,0x1d,0x28,0xeb,0x1c,0x03,0x18,0xde,0xec,0x42,0x67,0x09,0x16,0x43,0xc6,0xfe,0xeb,0x0e,0x01,0xce,0xe6,0xe5,0x01,0x46,0x05,0xef,0x0c,0xe2,0xe5,0xe1,0x9a,0x27,0xe8,0xdf,0xe6,0x35,0xc1,0x10,0xf7,0xcd,0x2e,0x00,0xda,0xfd,0xd8,0xf8,0xea,0x7f,0xb8,0xdf,0xd9,0xa9,0x2e,0x03,0xfa,0xfb,0xf3,0x20,0x1a,0x64,0xe2,0x2c,0xf7,0xf7,0xf8,0xef,0x65,0xee,0xe3,0xc9,0xf3,0xf4,0xdb,0xf6,0x65,0xe3,0x1d,0xb0,0xc7,0xdf,0x00,0xc7,0xf8,0xde,0x2d,0xe9,0x08,0x3b,0xde,0x38,0x54,0x06,0x22,0x10,0xf3,0x62,0x0e,0x43,0x20,0x22,0xe7,0xd2,0xfa,0x3c,0xe0,0xef,0xe4,0x39,0x42,0x2b,0xe5,0x31,0xf4,0xe9,0xfa,0xcf,0x37,0x0c,0xf7,0x18,0x11,0xc2,0x15,0x3e,0x24,0x25,0x2a,0xef,0xf3,0xe0,0xd4,0x44,0xff,0xf8,0xc4,0x20,0xff,0x0f,0x07,0x68,0xf7,0x1c,0x16,0xa4,0x22,0x0f,0xda,0xf4,0x42,0xea,0xee,0x79,0x4c,0x07,0x1f,0xe1,0xd8,0x03,0xfb,0xf2,0xf7,0x05,0xea,0x40,0xf4,0x1c,0x3d,0x1b,0x11,0x12,0x13,0x20,0x47,0x34,0x40,0x19,0xdf,0xd1,0xe1,0x3e,0x07,0x1e,0x34,0xf3,0x2b,0x0d,0xd8,0x22,0xea,0x11,0x23,0x03,0x19,0xda,0xf6,0xf9,0x38,0xcd,0x06,0x48,0xe6,0x37,0x46,0x1a,0x1b,0x01,0x28,0xf9,0xed,0xfd,0xea,0xf2,0x30,0x01,0xe7,0x0a,0x0a,0x22,0x32,0xe4,0x47,0xdd,0x02,0x23,0x29,0x58,0x22,0x22,0xcf,0xd8,0x55,0x44,0xc2,0x07,0x20,0xe1,0x3c,0xf0,0x79,0x13,0x06,0x04,0xfd,0x01,0xf3,0xf0,0x13,0xf3,0xdb,0x10,0xee,0x29,0xf7,0x2e,0x42,0x1a,0xdb,0xea,0xeb,0x02,0xed,0x02,0xe5,0x51,0x0e,0xf0,0x12,0x7f,0xd8,0x14,0xef,0x45,0xf7,0xe9,0xce,0x23,0x16,0x16,0x43,0x00,0xec,0xf2,0xda,0xcc,0x4b,0xf3,0x3b,0xd5,0xe8,0x32,0xe5,0x39,0xe0,0xc1,0x56,0xdb,0x11,0xf1,0xe8,0x35,0x07,0x1a,0xd6,0x25,0xa4,0x30,0xf2,0xf4,0xc7,0x19,0x69,0x54,0xfc,0xa8,0x23,0xfd,0xee,0x07,0x01,0xd0,0xaf,0x28,0xfd,0xdf,0x20,0x81,0x19,0x36,0x03,0xf2,0x0f,0x0d,0x28,0xce,0xc4,0xc1,0xc6,0x26,0xc9,0xe8,0xa0,0xe4,0x8e,0xd2,0x24,0xda,0xf7,0xfd,0xa3,0xf8,0xfc,0xb0,0x08,0x2b,0x2c,0x0d,0x19,0x17,0x1b,0xa3,0x77,0x76,0xfc,0xdd,0x2e,0x0e,0xf3,0xc0,0x6c,0x1f,0xd5,0x06,0xb9,0xe5,0xd7,0x00,0x03,0xc7,0xbd,0x13,0x3e,0xe0,0x34,0x0a,0x36,0xed,0x2c,0xd0,0xe4,0xa3,0x16,0xdd,0xc0,0x1f,0xfa,0xbc,0xb2,0x14,0xf3,0xea,0xf7,0xd6,0xe9,0xe6,0xf6,0x23,0x2d,0x00,0xb8,0xeb,0x40,0x17,0x12,0x77,0xd1,0xc4,0x01,0x11,0x46,0xd1,0x52,0x36,0x4c,0xef,0x05,0xe0,0x29,0xc1,0x6b,0x14,0x04,0x1d,0x07,0x2a,0x41,0x04,0x15,0x1e,0x25,0x04,0x0d,0x41,0xe0,0xf6,0xfc,0xf5,0xe6,0xe7,0x07,0x37,0x30,0x30,0x27,0x47,0xe7,0xec,0x33,0x00,0x22,0x08,0x02,0x1c,0x26,0x6a,0xf9,0x1c,0xb8,0xc9,0xda,0xe0,0xfc,0xfa,0x1c,0xeb,0x31,0xf3,0xc6,0x22,0x1b,0xf6,0x04,0xd0,0x10,0xe7,0x36,0x0f,0x7f,0x08,0x1d,0x03,0xde,0xc1,0x30,0x30,0x1e,0x08,0xbd,0xcc,0x29,0xe2,0x06,0x21,0xe3,0xd7,0x59,0xe9,0xcd,0xf0,0x17,0x07,0x31,0xc3,0xbb,0xcf,0xfa,0x14,0xe1,0x67,0xea,0x15,0x0b,0x08,0x23,0x37,0x33,0xdb,0x29,0xc0,0x0e,0x1f,0xef,0xfd,0x0c,0x59,0x13,0x1d,0x71,0xfa,0x1b,0x02,0xe3,0xe7,0xde,0xcf,0x54,0xff,0x2b,0xdd,0x33,0x3d,0xd6,0xed,0xb0,0xd8,0xe3,0x0b,0x0c,0xfe,0x3c,0x0a,0x10,0xf7,0xd5,0x48,0x20,0xc4,0xdf,0x04,0xe6,0x12,0x20,0x01,0x38,0xfe,0xd8,0xea,0x57,0xde,0x9a,0x45,0xe4,0x16,0x1f,0x59,0x17,0x23,0xda,0x0c,0xfb,0xe1,0x33,0xe5,0xcd,0xd7,0x17,0xe6,0xe1,0xc5,0xff,0x9a,0xd3,0xc8,0xe6,0xf5,0xdf,0xd5,0xd5,0xfc,0x19,0xe3,0x27,0xb5,0xf5,0xed,0x27,0xff,0xe0,0xd7,0x34,0x0f,0xe2,0xd2,0xfa,0x08,0x00,0x57,0xcf,0xe7,0xf4,0x20,0x09,0x0f,0x7f,0x07,0x42,0xda,0xfc,0xf9,0x0a,0xdf,0xda,0xf7,0x23,0xd3,0x2a,0x04,0x04,0x0b,0xc2,0x0e,0x0d,0xf4,0x13,0x06,0xf4,0x25,0xe6,0xf5,0xed,0xd3,0x0e,0xa7,0xee,0xed,0x1b,0x05,0x3f,0x4c,0x1c,0xd0,0x34,0xb3,0x3a,0xf8,0xf4,0x45,0x3f,0x24,0xc4,0xaa,0xf1,0xc1,0x16,0x0d,0xf0,0x5d,0x2d,0x2d,0xeb,0xfc,0xe8,0xf1,0x18,0x0e,0x22,0x28,0xd1,0xb4,0x3c,0x0b,0xfc,0x18,0x11,0xe0,0xfc,0xe2,0x3e,0x01,0x43,0xdf,0x02,0x72,0x05,0x20,0xec,0xd3,0xc3,0xfa,0x35,0xe5,0xf7,0xf7,0xd9,0xde,0xf2,0xf0,0xc3,0xfb,0xfa,0xb7,0x04,0x01,0xc2,0x55,0xb4,0xfa,0x04,0xf0,0x02,0xa5,0x2d,0xe6,0x37,0xb7,0x16,0xb1,0xca,0x1e,0xc9,0xd0,0x47,0x1b,0x2e,0x52,0x2f,0xbf,0xd7,0x06,0xa3,0xde,0x33,0xef,0xa4,0x01,0x5f,0xd8,0xe9,0xb3,0x3d,0xf8,0x35,0x2e,0xf7,0x13,0x27,0xde,0xd2,0x70,0x1b,0xd0,0x12,0xfb,0xac,0xf0,0xed,0xd9,0xc2,0xe7,0x15,0x05,0xc8,0x0e,0x81,0x08,0x07,0x12,0xbc,0xcb,0x4a,0x00,0xee,0xd5,0xdd,0xd8,0x2b,0x2b,0x0c,0x39,0xc7,0xf7,0xc2,0x30,0xd1,0x1c,0x0c,0x20,0x30,0x0d,0x26,0x3e,0x2a,0x28,0xcf,0x0e,0x01,0x7f,0xe2,0xf5,0xc3,0x28,0x05,0x20,0x08,0xf2,0x10,0x04,0xf7,0xed,0xd8,0x43,0xf3,0xf7,0xd4,0x2b,0x26,0xdd,0xe1,0x51,0xf2,0x3f,0x39,0xaa,0xf6,0x24,0xd6,0x2c,0x15,0xde,0xf4,0xf9,0xf6,0x17,0xdd,0x1d,0xe7,0xf8,0x02,0xd2,0xbd,0xe4,0x13,0x0c,0x42,0x12,0x1e,0x09,0xfb,0x40,0x3c,0x1f,0xe2,0xdc,0x09,0x1c,0x12,0x4d,0x3e,0x16,0x37,0x0a,0x37,0x15,0xf0,0x24,0xd1,0xbb,0xe7,0x07,0xe3,0xd8,0xc9,0x4f,0xc1,0x04,0x05,0xd4,0x1d,0xae,0xc1,0xcc,0x15,0x0d,0x07,0x0e,0x13,0xcf,0x0b,0x07,0x01,0x0e,0xf7,0xc4,0x1a,0x36,0xea,0x15,0xed,0xe3,0x15,0x7f,0x2d,0x2d,0xf6,0x10,0xdd,0xe4,0xdf,0xf8,0xf2,0xe7,0x06,0x5d,0xff,0xc0,0x04,0x06,0xdb,0x2e,0xf5,0xc1,0x52,0xd1,0x04,0xe1,0x28,0xdb,0x15,0x03,0x17,0xda,0x10,0xe6,0x35,0xe6,0xcc,0xea,0x33,0x46,0x04,0xc9,0xd0,0x4c,0xf4,0xfc,0x64,0x30,0xe0,0x48,0xc0,0x17,0xd0,0x1c,0xdb,0xfa,0xe4,0xf4,0x1d,0xe1,0xb4,0x17,0x13,0xe0,0xff,0xf6,0xc2,0x24,0xea,0x61,0x34,0xf7,0xfe,0x1f,0xf3,0xfd,0xb0,0x3a,0xe1,0xeb,0x6c,0x1d,0x17,0xf3,0xec,0x17,0xda,0xf0,0x21,0xf4,0x00,0xe5,0x3d,0xe3,0x16,0x03,0x07,0xd3,0xec,0x11,0x26,0xde,0xe1,0xbb,0xd8,0x04,0x2a,0x24,0x11,0xeb,0x3c,0x25,0x1f,0xf3,0x10,0xed,0x2e,0x3f,0xff,0xa3,0xdf,0x3a,0x49,0xe4,0xdd,0x1f,0xf1,0xc8,0x60,0xec,0xe7,0xe9,0x36,0xe9,0x08,0xf9,0xcf,0xeb,0x03,0x04,0x17,0x38,0xdb,0xe1,0x10,0x11,0xdf,0xfe,0xe9,0x2f,0xe0,0xed,0xfc,0xc0,0xfd,0xff,0xea,0xdd,0xd9,0xdb,0x25,0xf9,0x2a,0x2f,0xe7,0x1f,0x31,0xec,0xef,0x71,0x16,0x54,0xe5,0x03,0x1d,0xf8,0x22,0xf8,0x0e,0x00,0x18,0xf4,0x03,0x05,0x0c,0x02,0x29,0xfb,0xe3,0xe3,0x27,0x1c,0x30,0x15,0x35,0xe6,0x1d,0x42,0xf9,0xe3,0xfe,0xeb,0xec,0x19,0xb7,0xf9,0x02,0x1c,0xd3,0xff,0xf5,0xf3,0x17,0x0a,0xfd,0x08,0x7f,0xf9,0xfd,0x06,0x30,0xdd,0x1e,0xf0,0x0c,0x1e,0x3b,0xff,0xf2,0x2a,0xfe,0x15,0xde,0xcf,0x2c,0xf9,0x0d,0xff,0x02,0x01,0xeb,0xe9,0x19,0xfe,0x39,0x31,0x03,0xe1,0x00,0x15,0xea,0xda,0x00,0xca,0xf7,0x3f,0xfc,0xfe,0x13,0x03,0xf2,0xe5,0x3e,0x14,0x44,0xdf,0x07,0x38,0x05,0xda,0xe0,0x15,0x3b,0x1b,0x02,0xe0,0x06,0x7f,0x46,0x29,0xf3,0x0f,0xeb,0x14,0xf6,0x0f,0x07,0x1a,0xd8,0x09,0xff,0xee,0xd4,0x1e,0x41,0xeb,0xdf,0xdb,0x01,0xae,0x1c,0x35,0xe0,0xea,0xe4,0xcd,0xfe,0x08,0xeb,0xfa,0x2f,0x00,0x09,0x24,0x0b,0x02,0x15,0xed,0x5d,0xe6,0x00,0x11,0xfa,0x34,0x12,0xd6,0xca,0xc3,0xd2,0x31,0xde,0xce,0x29,0x15,0xdc,0xd0,0xfc,0xc8,0x3b,0x0f,0xf9,0xd5,0xe4,0x06,0xc8,0x31,0xfd,0x13,0xf3,0xf6,0x1e,0xf9,0xec,0x39,0xbd,0x77,0xdf,0xde,0xd3,0xb6,0x51,0xf0,0xb0,0x07,0xf0,0xde,0x11,0xb8,0xda,0x24,0xe6,0x23,0xd4,0xec,0x21,0x56,0xb5,0xbc,0x13,0x2c,0x21,0x06,0x03,0x06,0xf8,0x2b,0x14,0x31,0xc5,0x65,0x40,0xbc,0xe9,0x9b,0x18,0xe6,0x0d,0xf8,0xf2,0x07,0xf4,0xea,0x01,0x26,0x46,0xe4,0x1b,0xfb,0x0e,0xd0,0x43,0x40,0xe1,0xe8,0x33,0xc5,0x44,0xe9,0x81,0xf5,0xe3,0xe2,0x08,0x0a,0x40,0x14,0x2c,0xd6,0xd9,0xed,0xee,0x54,0x02,0xcf,0xfe,0x1a,0xcf,0xf5,0x1d,0x26,0xfe,0xca,0x30,0xc5,0xd8,0x33,0x9c,0xed,0x1f,0xf2,0xdf,0xd4,0x63,0xdf,0x20,0xbf,0xf8,0x3c,0x27,0xd1,0xde,0x00,0x32,0xdf,0xc2,0xb4,0x09,0xdd,0x03,0x0f,0x0c,0x08,0x9c,0xd2,0xe0,0x5a,0xf8,0xb3,0xe6,0x15,0x14,0xf0,0x0f,0x29,0x11,0xd8,0x15,0x32,0xda,0x04,0xba,0xe4,0xee,0x44,0xf2,0xae,0x22,0x25,0xe0,0xc2,0xe7,0x54,0xfd,0x2d,0x93,0x30,0x1c,0xf3,0x49,0x37,0xbe,0x1a,0xb9,0x68,0xec,0x06,0x0b,0x33,0xb7,0xc4,0xd0,0x1a,0xf4,0x09,0x13,0x0c,0x27,0xe5,0x07,0xae,0xf4,0x20,0xea,0xf1,0xfc,0xd4,0x03,0x3b,0x35,0xc4,0xdd,0xc4,0xf4,0xea,0x2f,0xfb,0x85,0x66,0x02,0xce,0x1c,0xf1,0xa5,0x2b,0xe6,0xf8,0xd7,0xde,0xd7,0xc6,0x02,0x81,0x22,0x3b,0xd7,0x9c,0x37,0x20,0xe2,0xee,0xfe,0xee,0x21,0x0a,0xe6,0x0e,0x18,0xf7,0x50,0x11,0xe7,0x45,0xa7,0xd6,0x07,0xe8,0x1b,0xe1,0x38,0xac,0x04,0xf6,0xba,0x01,0xec,0xec,0xea,0xfd,0xfc,0x00,0x51,0x32,0xf9,0xa5,0xc8,0xe5,0xd4,0x05,0x31,0x04,0x1e,0xe0,0xf0,0xeb,0x0e,0x55,0xf5,0x3c,0x13,0xe3,0x43,0x1b,0xb0,0x30,0xec,0x58,0xda,0x3f,0x01,0x06,0xc5,0x1e,0x58,0x27,0xcb,0x13,0x22,0x67,0x25,0xf6,0x03,0x0e,0xeb,0xcb,0x10,0x2f,0xdd,0x0a,0x06,0xf8,0x0e,0x01,0x32,0xf2,0xdc,0xf3,0xc2,0x4e,0xfd,0xae,0xc7,0x5a,0x13,0xfb,0xc4,0xd0,0x35,0x41,0x15,0xf6,0xdf,0xef,0x17,0x52,0xc8,0xdc,0xf9,0xc7,0x51,0xf8,0xc2,0xd2,0x45,0x49,0xde,0xe4,0x58,0xad,0x08,0x0d,0x26,0xf4,0xc8,0xd3,0xe6,0xb3,0xf7,0xfa,0x16,0x0f,0xcf,0xdf,0xf5,0x0e,0x0f,0xe4,0x14,0xeb,0x2c,0x81,0xfd,0xef,0xf9,0x4a,0xf9,0xfa,0x01,0x9a,0xe2,0xa3,0x5b,0x14,0x63,0xe2,0xd9,0xe0,0xe8,0xfc,0x00,0xf5,0xdf,0x07,0x65,0xd4,0x14,0x10,0x21,0xd9,0x00,0xa9,0x14,0x2d,0x05,0x13,0xdb,0x05,0x27,0x39,0xe2,0x17,0xcd,0xf3,0xf5,0xeb,0xc2,0xd0,0xe3,0x1d,0xd8,0x06,0xfd,0xc9,0xcb,0x4c,0xf7,0xd6,0xff,0x0c,0x28,0x02,0x08,0xbc,0x31,0xdb,0x37,0xe3,0xf7,0x81,0x2e,0xd1,0xc7,0x00,0x41,0xd2,0xc4,0x13,0x12,0x04,0x0e,0x19,0xee,0xd6,0x3c,0x4d,0xe4,0xe2,0x1f,0x28,0x04,0xd7,0x3d,0xf5,0xcb,0xeb,0xb1,0x1e,0xbb,0x17,0xee,0x36,0x2c,0xf8,0x15,0x09,0xfd,0x33,0xc4,0xc2,0xf2,0xd5,0xf9,0xbe,0x0c,0xbc,0x50,0xb9,0xed,0xc4,0xd6,0xdd,0xed,0x13,0x06,0xfe,0x1d,0x0d,0xf5,0xa3,0x0d,0xd3,0x6b,0xe6,0xff,0x65,0x29,0xb4,0x0e,0xf0,0xec,0xe1,0x1b,0xee,0xe4,0xeb,0xf5,0xec,0x7b,0x24,0x2b,0x26,0x06,0xc8,0x27,0x04,0xfe,0x2d,0x12,0xa1,0xe0,0xe2,0x18,0x43,0x24,0x57,0x1f,0x0a,0x1c,0xfc,0x1b,0xe5,0xdd,0x1d,0xe0,0xf5,0x16,0xe0,0xf0,0xef,0xb0,0x26,0xdd,0x17,0xcf,0xe7,0x0e,0x11,0xf7,0xdf,0x34,0x21,0xfd,0xbc,0xd4,0x07,0x0b,0x10,0x3a,0xbb,0xdb,0xdc,0x31,0x56,0xfb,0xf8,0xff,0x60,0x04,0xb5,0x7f,0xdf,0xfd,0x06,0x2c,0xd8,0xea,0x16,0xbd,0xe1,0x2a,0x0c,0xd4,0xf6,0x44,0x05,0xd4,0x19,0xe1,0xb8,0xe8,0x04,0x06,0xd6,0xcc,0x53,0xdb,0xef,0xfe,0xd1,0xf0,0xe5,0xfa,0xc1,0xc1,0x1a,0xbf,0xea,0x07,0x08,0x52,0x0d,0xb8,0x0d,0x07,0x26,0x4e,0xe0,0x02,0x06,0x08,0xe8,0xfe,0xc3,0xea,0x50,0x21,0x05,0xe5,0x10,0xc3,0x1c,0xfd,0xf9,0x06,0x1e,0xdb,0x49,0x22,0x1c,0x07,0xfd,0xfe,0x14,0xea,0x0e,0xdf,0xfb,0xed,0x12,0xef,0x0b,0x79,0x1c,0x2d,0xc7,0x11,0x06,0x1b,0x0c,0xf6,0x07,0x21,0x0d,0x0f,0xf6,0x39,0xc0,0x1c,0x23,0xfa,0xe3,0x1a,0x1f,0x1c,0x01,0xcc,0xd6,0x3a,0x12,0x3d,0x97,0x1e,0x0d,0x34,0x16,0x39,0x33,0x23,0xe1,0xd4,0x2b,0x11,0xfd,0x1e,0xd2,0x2c,0x9f,0x01,0x65,0x10,0xca,0x1f,0xca,0xfb,0xce,0x06,0xbe,0x29,0x28,0xea,0x7f,0x06,0xa3,0x15,0xdc,0x18,0x1e,0xe4,0x61,0x0c,0x0d,0xeb,0xcf,0xf9,0xb4,0xe1,0x12,0xb3,0xff,0x14,0xe4,0xc2,0xe7,0x02,0xe7,0x03,0x0e,0x34,0x7c,0x46,0x3c,0x3f,0x05,0x06,0x87,0xba,0xdf,0xdb,0x28,0x01,0x1b,0xdf,0xf9,0xf1,0xba,0x0d,0xe3,0xe2,0xc2,0xf3,0x0a,0xf7,0xd2,0x39,0xea,0xb4,0x11,0x3b,0xcb,0x3d,0xe9,0xcd,0xad,0xcd,0xac,0x46,0xf3,0x5c,0x14,0x56,0xd0,0xcb,0xee,0xc3,0x12,0x4c,0x9d,0xfa,0xde,0x03,0x30,0xe7,0xd0,0x00,0x2c,0x2f,0x3d,0xe9,0x15,0x51,0x18,0x17,0xe4,0xf9,0x7f,0x22,0xd7,0xfa,0x1e,0x10,0xfc,0xea,0x64,0x4b,0xff,0x2e,0x12,0xda,0xd0,0xdb,0x0a,0x2c,0x7a,0xf3,0x2d,0x99,0xab,0x23,0x22,0x16,0x45,0xcb,0x1d,0x0b,0xfe,0x0f,0x00,0x1c,0xe2,0xd1,0xf4,0xac,0x73,0xec,0x01,0x27,0xf8,0x50,0x3b,0xd5,0xdb,0xef,0x15,0xfd,0x19,0x14,0xe4,0x49,0xe4,0x2f,0xf2,0x10,0x0f,0x0e,0x01,0x23,0x51,0x1e,0x23,0x46,0x14,0xde,0xf9,0x23,0x2f,0x03,0xf4,0x12,0x18,0x63,0xdb,0xf7,0xf7,0x07,0xb7,0xed,0x2d,0xbd,0xea,0xdb,0xdd,0x2f,0xfe,0xe8,0xff,0xf5,0xf3,0x08,0xe7,0x2d,0x2e,0xe9,0x07,0xdd,0xca,0x1d,0x4b,0xf8,0xd6,0x0e,0x6e,0xce,0xc3,0x17,0x18,0xe7,0xf5,0xde,0xf9,0xcd,0x31,0x78,0xfd,0x1b,0x7c,0x32,0x40,0x43,0x05,0xdd,0x03,0xf6,0xe7,0x0a,0xc9,0x27,0x26,0xe8,0x12,0xd7,0xf2,0xc9,0x07,0xf6,0xe1,0xea,0xf3,0xfd,0xd9,0x05,0xd8,0x2a,0x17,0x18,0xe6,0x1b,0x25,0x11,0x12,0x35,0xe1,0x32,0x06,0xfb,0x12,0x2b,0x3b,0x14,0xed,0xd4,0xe8,0x09,0x02,0x10,0x7f,0xe2,0xf8,0xbd,0xe4,0xe7,0xc3,0xeb,0xff,0x13,0x04,0xf8,0xdd,0x11,0xba,0x27,0xf4,0xc7,0x00,0xd8,0x5b,0x24,0x60,0x44,0xd7,0xfe,0xc8,0xce,0x41,0xe4,0x27,0xd5,0x1b,0x36,0xca,0xe8,0x4f,0xdf,0x22,0x15,0x18,0x2e,0x01,0x06,0x27,0xed,0xe8,0xff,0x29,0x08,0xd3,0x2b,0xfe,0xf1,0xee,0xfc,0xe3,0x15,0xb6,0xe8,0x6d,0x05,0xf3,0x1b,0x4f,0x4f,0x0c,0x0b,0x6c,0x1c,0xda,0xfa,0xd4,0xf9,0x0e,0x11,0xf8,0xf1,0x25,0x32,0xfc,0xfc,0xef,0x13,0xf7,0xf4,0x23,0x40,0xde,0x2b,0x3e,0x19,0xe4,0xf1,0x2d,0xf3,0xf3,0x0e,0x2a,0x3c,0x1e,0x20,0x09,0x12,0x7a,0x1d,0x0d,0x1f,0x15,0x35,0x0e,0xfd,0x1e,0xf0,0xff,0x0e,0xde,0x1f,0x19,0xe5,0x20,0x1d,0xee,0xe5,0x7f,0x0b,0x0e,0xfa,0xea,0xfd,0xe9,0xdf,0x02,0xe1,0xec,0x01,0x12,0x00,0xe7,0x11,0x35,0xf2,0xe2,0xf9,0xfb,0xec,0x08,0xd9,0x0f,0xea,0xf4,0xf0,0xee,0x02,0xf3,0xf1,0x38,0x1d,0x1c,0x37,0xdf,0x0b,0xe2,0x16,0xf9,0xfd,0x09,0xe8,0xed,0xef,0x00,0x0d,0x17,0xf7,0xeb,0x0c,0xf2,0x12,0xf3,0xef,0x39,0xfa,0xd9,0x02,0xdf,0x0a,0xe5,0xf2,0x1c,0xf7,0x0e,0x19,0x05,0x21,0x04,0xf9,0x24,0xd9,0xdf,0xfc,0xfa,0x02,0x34,0x16,0x34,0x21,0xff,0xd7,0xf2,0x1f,0xf1,0xec,0x0d,0xfe,0xfd,0xfe,0x2a,0x2f,0xf7,0x33,0xef,0x4b,0xce,0x36,0xef,0xd4,0xee,0xf5,0x5c,0xee,0x1a,0xd5,0xe9,0xe0,0x51,0xe4,0xcb,0x09,0x43,0xd4,0xfb,0x12,0x27,0xe5,0x17,0x21,0x05,0x7f,0x1e,0x0c,0xfe,0xf0,0xea,0xda,0xe9,0x47,0xfc,0x07,0x0d,0xed,0xdb,0xd2,0xdb,0xfa,0xe5,0x13,0x08,0x09,0xf8,0x15,0x15,0x16,0xe7,0xe7,0x46,0x24,0x18,0xf2,0x2d,0xf8,0xfc,0x11,0x02,0x2c,0x13,0xce,0xe5,0xef,0x1a,0x49,0x21,0xcd,0xe7,0xe9,0xf6,0x17,0x2f,0xfc,0xc3,0x20,0xf0,0x07,0x06,0xf3,0x12,0x0f,0x1c,0xf3,0xd9,0xfc,0xf7,0x0b,0xfd,0xf9,0x00,0x0f,0x1e,0xf4,0xd2,0xdb,0x0d,0xdc,0x07,0xee,0xf6,0xe8,0x22,0xff,0x30,0xd3,0x19,0x27,0x2c,0xfa,0xfa,0x4a,0xf3,0x2a,0xe8,0xd6,0x39,0xe9,0x04,0x0b,0x1b,0x34,0xec,0xf7,0x3d,0xa3,0x08,0x5b,0x26,0xdc,0xc2,0x48,0xdd,0x2f,0x2d,0xf6,0x60,0x02,0x37,0x59,0xa4,0x3a,0x06,0x02,0x36,0xff,0x16,0x1e,0xf2,0x68,0x0b,0x01,0x0e,0xe8,0xea,0x30,0x6a,0x4d,0x37,0x38,0xfb,0xdb,0xf4,0x2a,0x0d,0xfb,0x14,0xef,0xe7,0xce,0x00,0xeb,0x0b,0x05,0xb8,0x10,0xcb,0x2c,0xf5,0xbf,0x2f,0x27,0x65,0x6d,0x0b,0x9f,0x27,0x4b,0xfe,0xe3,0xee,0x24,0xdd,0x6a,0xf1,0xf3,0xd5,0x9d,0x14,0xdc,0xf7,0xfe,0x15,0xca,0xaa,0x52,0xf5,0x16,0xdb,0xdb,0x47,0x10,0x30,0xcb,0x0c,0xf4,0x00,0x0c,0xf4,0xb6,0x7f,0xc8,0xe8,0xe9,0x23,0x37,0x00,0x09,0xf0,0x0b,0xf6,0xe6,0xf3,0x30,0xe7,0x37,0x56,0x45,0xd3,0x10,0xc1,0xfc,0xbb,0x8c,0x32,0x0d,0x11,0xb7,0x6d,0xdd,0x18,0x5b,0x46,0x14,0xc5,0x17,0x2e,0xf3,0x2b,0x02,0x45,0xdb,0x3c,0x03,0xbe,0xf0,0x3a,0x7d,0x37,0xdd,0xb1,0xb5,0x2c,0x06,0x3c,0xb6,0x66,0xaf,0x5d,0x09,0xdb,0xf4,0xfb,0x1f,0xe7,0xe7,0x01,0x21,0xe9,0x34,0xfd,0x3d,0xc6,0xef,0xe7,0x0a,0x3d,0x20,0x54,0xdf,0x0b,0x07,0x34,0x96,0x01,0x65,0x24,0x63,0x28,0x7f,0x4e,0x0b,0x0e,0xcb,0x20,0x46,0xc5,0xa7,0x55,0x02,0xc1,0x18,0x0c,0xda,0xe3,0x3b,0xbd,0x3a,0x22,0x47,0x10,0xe5,0x21,0xdf,0x3b,0xdd,0x0f,0x0e,0x05,0xc6,0x9b,0x06,0x66,0xf0,0x3a,0xd6,0x20,0xba,0xf3,0x0a,0xd1,0xe6,0x40,0xe1,0xe7,0xf4,0x1d,0x05,0xf1,0x2c,0xef,0xd0,0xe1,0x18,0x11,0x1c,0x5e,0x27,0xfd,0xff,0xfb,0xe9,0xfb,0xf1,0x1a,0x40,0x0d,0x1d,0x30,0x3a,0xdd,0xde,0xd2,0x13,0xdf,0x35,0xfe,0xe8,0xeb,0x1c,0x02,0x24,0x10,0x25,0x00,0x0a,0x0d,0x04,0xf7,0xfb,0xfd,0xee,0xc9,0x14,0xd1,0x27,0xd4,0xdd,0x21,0xbd,0xc6,0x53,0xfd,0xf2,0x0d,0xef,0x0a,0xf2,0xe7,0x0a,0x1e,0x1c,0xe5,0xff,0xf5,0xed,0xd9,0xf8,0x1e,0xe2,0xfd,0x04,0xfd,0xe3,0x14,0xe6,0x1a,0x7f,0x05,0x2a,0xf0,0xf8,0xf2,0x07,0xfa,0x11,0xe4,0xf8,0xed,0xe7,0xfe,0xfc,0xf9,0xcf,0x08,0xe2,0xf6,0xea,0xec,0x07,0x13,0x0f,0x25,0x06,0xee,0xdf,0xf2,0x19,0x1e,0xd5,0x18,0x0b,0xe5,0xf5,0x11,0xfc,0x0e,0x19,0xf4,0xf7,0xf5,0xf5,0x0c,0x00,0xf5,0xfe,0xfd,0x04,0xdf,0xf0,0x0f,0x43,0xf2,0xf9,0x0a,0xe1,0x29,0xea,0xdf,0x63,0xf5,0x21,0xc6,0xf2,0xf5,0x2c,0xd1,0x3b,0x2e,0xee,0x12,0xc1,0xe8,0x0b,0x05,0x0a,0x1d,0xbf,0x57,0xb8,0xc4,0xb4,0xcc,0x2c,0x36,0xda,0x2a,0x9e,0x46,0x05,0x18,0xe3,0x0d,0x18,0x03,0x0f,0xe6,0x05,0xe3,0xd9,0xd0,0x2a,0xf6,0x4c,0x45,0xe3,0x25,0xec,0xfa,0x18,0xef,0xfb,0x9f,0x10,0xf5,0xfc,0xd6,0x08,0x1e,0x1b,0xdf,0x5a,0x29,0xf6,0xe8,0xfd,0x3a,0xfd,0x13,0x0d,0xfa,0xa6,0xf4,0x32,0x5a,0xd4,0xfa,0xf9,0xbe,0xa4,0x17,0xae,0xa6,0xe7,0x0c,0xe7,0x02,0x75,0x05,0x13,0xc6,0x48,0x42,0xb6,0xf0,0x10,0xd3,0x81,0xd5,0xd4,0xc7,0x09,0xea,0x02,0x6a,0xd7,0xdd,0xff,0x2f,0x17,0x00,0x34,0xfd,0xfc,0x0b,0xf5,0x1d,0xf0,0x7e,0xf6,0xfc,0xa9,0xf6,0x1e,0x39,0x3e,0x05,0xd6,0xfe,0xf1,0x62,0x56,0xba,0x79,0x58,0x11,0x07,0x05,0x08,0x14,0xd8,0x24,0xe0,0xe6,0x2c,0x5f,0x18,0x26,0x3a,0x24,0x0f,0x4c,0x5e,0x5a,0xb0,0x31,0x32,0x24,0xb8,0x11,0xba,0x12,0x26,0xc2,0x3a,0x11,0x36,0xea,0xfd,0x21,0xca,0xe6,0x14,0x0b,0xe7,0x37,0x4d,0x05,0x00,0xea,0xbb,0xd5,0xfc,0xdb,0x27,0x24,0xbc,0xf5,0xfd,0x12,0xef,0x0b,0x59,0xff,0xdf,0x03,0xf0,0x14,0x9e,0x08,0x1e,0xcf,0xf4,0x10,0xdf,0xd0,0xc2,0x8d,0x29,0x2e,0x1b,0xf1,0xdb,0xee,0x46,0xf3,0x0f,0xfc,0xf4,0xe7,0xe6,0x11,0x9a,0x2c,0xd1,0xf3,0xe3,0xd3,0x29,0x16,0x05,0x00,0xed,0x75,0xbb,0x50,0x4c,0x31,0x2b,0x67,0xd7,0xd8,0xd0,0xe5,0x0e,0x00,0x08,0xea,0x7f,0xb1,0xc8,0x0f,0xfa,0xf0,0x12,0x2b,0xfe,0x7f,0xe1,0x29,0x0a,0x2f,0x18,0xe1,0xf3,0xd3,0x0f,0x12,0x08,0x1d,0xf4,0x10,0x1c,0xfd,0x16,0xc9,0x11,0xa5,0x1f,0xce,0xbd,0x11,0xc4,0xec,0xeb,0x09,0x09,0x24,0xdd,0x72,0xf2,0xf2,0x30,0xea,0x5a,0x17,0x17,0x18,0x61,0xd3,0x21,0xe0,0xe8,0xd0,0x47,0xf1,0x2b,0xb4,0x2d,0xf2,0xf0,0xcf,0xcc,0x34,0xe2,0xf7,0xf8,0xdc,0xc5,0xe7,0xd1,0xed,0x27,0x2c,0xa2,0x0a,0x6c,0x51,0x0f,0x48,0x1b,0x15,0x06,0xc6,0xce,0x0f,0x1b,0xdb,0x1c,0x49,0x07,0xde,0x16,0xfb,0x21,0x29,0xec,0xf1,0x2c,0x4c,0x18,0xef,0xe4,0x01,0xdf,0xfa,0x29,0x1b,0x43,0x12,0xde,0xd0,0x06,0x49,0x42,0x2a,0x21,0x14,0x01,0x19,0xf5,0xf6,0xe1,0x1f,0xc2,0xfa,0xcd,0xe0,0xf1,0x3e,0xe4,0x4f,0x56,0xcb,0xc2,0x0d,0x79,0x2d,0x04,0x32,0xf3,0x0d,0xe2,0xb3,0xf2,0xab,0x29,0x06,0xe8,0x0a,0xdf,0xc3,0x10,0x1d,0x26,0xb1,0x17,0x08,0x13,0xfc,0x03,0x30,0x33,0x2e,0x0a,0x24,0xcf,0x05,0x36,0x00,0xea,0x04,0xcf,0x44,0x21,0x06,0x6e,0xd2,0xd3,0xe2,0xc3,0x2c,0x3c,0x20,0x0e,0x26,0xb2,0xbd,0xf4,0xfa,0xe7,0xc8,0xbe,0x15,0xf1,0xc0,0x3e,0xe4,0x0f,0x6d,0xdf,0x1a,0xe7,0x0a,0x3f,0x22,0x43,0x3d,0xd1,0x02,0x4d,0xf5,0xcb,0x7f,0x32,0x43,0x0e,0xeb,0xd6,0xf1,0xb5,0xf6,0x2b,0x02,0x10,0x14,0xef,0x01,0xf7,0x62,0xec,0x07,0x05,0x62,0xad,0x1c,0xee,0xea,0x2e,0xed,0x1e,0xfa,0x37,0xfc,0x40,0x0c,0xfb,0x26,0xf5,0x0e,0xa6,0x07,0x5a,0x19,0x0e,0xd7,0x42,0xd0,0xe4,0xe3,0x31,0xc0,0x21,0xe4,0x29,0xac,0xdc,0xf8,0xee,0xbe,0xd7,0x37,0xdc,0x47,0xed,0xfe,0x20,0xcc,0xc6,0x7f,0x09,0xed,0x08,0xcb,0x16,0xf7,0xdf,0xd8,0xfa,0x21,0x28,0x3f,0xc1,0x95,0x02,0xcd,0xd9,0xf7,0xa8,0xe6,0xb9,0x01,0xce,0xe2,0x06,0x19,0x14,0x31,0x45,0x23,0xe1,0xd1,0x0b,0xec,0xed,0xeb,0xbe,0xc6,0xba,0xd1,0xf3,0xfe,0x08,0xf6,0x3b,0x1a,0xcc,0xa5,0xc6,0x0e,0x38,0xd1,0x00,0xd5,0xd6,0x0e,0x13,0xd2,0x20,0x4a,0xad,0x1b,0xb9,0x4d,0xe7,0x0d,0xf7,0x13,0x67,0xb4,0xf8,0xf3,0x39,0x48,0xf4,0xf9,0xe2,0xe1,0x22,0x42,0x2f,0x11,0x37,0xc8,0x01,0x17,0xd1,0xc6,0x00,0xc8,0x29,0x00,0x2c,0xa5,0xce,0xd7,0x66,0x2b,0x00,0xb7,0xf8,0x03,0x2f,0x3b,0x16,0xf7,0xf9,0xf8,0x49,0x17,0x19,0xda,0x08,0xf3,0x04,0xf6,0x28,0x15,0x16,0x03,0x0a,0xf3,0x04,0x30,0x51,0x2f,0xfa,0xe0,0xfa,0x31,0x10,0xde,0xea,0xe8,0x1e,0x27,0x6d,0xde,0x11,0x0f,0x2e,0xef,0xd7,0x2a,0x0b,0x5b,0x18,0x3f,0xfb,0xd9,0x49,0x1d,0x10,0xeb,0x0a,0x38,0xfe,0x34,0x27,0x30,0x20,0x07,0xf5,0x29,0x0c,0x18,0x23,0x1d,0xd7,0xec,0x07,0xff,0x05,0xfc,0x10,0xec,0x56,0xfd,0xd8,0xef,0xe8,0x56,0x29,0x4c,0xed,0x11,0xcb,0x04,0xdf,0x1f,0x32,0xec,0xf9,0xe4,0xc8,0x0b,0xf8,0x23,0xed,0x16,0xf1,0x19,0x17,0xe3,0xeb,0x0e,0xf3,0x18,0xd3,0x04,0x19,0xed,0xd3,0x32,0x37,0x0b,0xba,0x7f,0x3d,0x3e,0x3c,0x2d,0x70,0xd6,0x04,0x07,0xfb,0xf5,0xe8,0x24,0x4c,0x60,0x27,0xe2,0xd5,0xe5,0xf5,0xcd,0x15,0xc4,0xd9,0xeb,0x08,0x0f,0xe5,0xc2,0xf1,0x36,0xd3,0x0e,0x2b,0xe0,0xdb,0xed,0xd2,0x4b,0xc7,0x02,0xce,0xfa,0x55,0x0f,0x14,0xf2,0xf7,0x1b,0x51,0xeb,0x31,0x9f,0x3e,0xcb,0xed,0xa2,0xfb,0x16,0xea,0x33,0xf3,0xd2,0xf9,0x4c,0xdf,0x28,0x06,0x47,0xa5,0x1e,0x17,0x30,0xd7,0x07,0x07,0x02,0xf0,0xdf,0x33,0xf4,0x1c,0x2d,0xe3,0xd7,0x06,0xed,0x12,0x01,0xee,0xc4,0xba,0xbf,0xe2,0xc6,0x19,0x04,0x0c,0x47,0xf3,0xf5,0xe0,0x7f,0xd7,0x2a,0x0d,0xee,0xb7,0xe5,0xd3,0xc2,0x1b,0x0b,0x0e,0x05,0xc7,0x30,0x42,0x02,0x5b,0x03,0xd0,0xe0,0xd0,0xf9,0xe5,0xf8,0xe1,0x0f,0x3e,0xfa,0x08,0x0c,0xe6,0x03,0xdd,0x11,0x1e,0x0b,0x11,0x41,0x10,0x15,0xa3,0xfb,0xf3,0xe1,0xc3,0x05,0x23,0xef,0x17,0x17,0x0b,0x12,0x19,0xf3,0x2f,0xda,0xec,0xed,0xf5,0xc7,0xe8,0x4d,0x0b,0x6d,0x07,0xf8,0x00,0x1c,0x2c,0xf7,0x1a,0xff,0xdc,0xf0,0x42,0x00,0xee,0xd0,0xeb,0xfe,0x13,0xee,0x4a,0xf1,0xe0,0x07,0x25,0xda,0xd8,0x12,0xf0,0xff,0xe2,0xdc,0x22,0xb3,0x7f,0x18,0x05,0xec,0xe5,0xe9,0xd8,0xcd,0x13,0xd3,0x0d,0x01,0xd7,0x52,0xfa,0xc0,0xf1,0xf1,0xe3,0xef,0x03,0x19,0x09,0xd9,0xfc,0x0b,0xce,0xdb,0x21,0x2e,0x10,0xf1,0xe8,0xd8,0xf3,0x1a,0x41,0xd2,0x0c,0xeb,0x21,0x39,0x14,0x00,0xfa,0xf2,0x3a,0x0d,0xf9,0x02,0xb3,0x04,0x47,0xfc,0xd5,0x2b,0xe0,0x1a,0xd2,0x25,0xf9,0xcc,0x1f,0x07,0xe5,0x28,0xe4,0xfb,0x06,0x0e,0x03,0x08,0xfb,0xf8,0xed,0x01,0xc5,0xea,0x1f,0x03,0x19,0x00,0x11,0x62,0x23,0x4e,0xff,0x06,0xc2,0x36,0x0f,0xef,0xee,0x24,0x49,0xf4,0xef,0xd3,0x05,0xd2,0x10,0x06,0xdb,0x3e,0x1b,0x03,0x01,0xfe,0x13,0x0c,0x01,0x7a,0x23,0xf5,0x60,0x34,0xc2,0xfa,0xfa,0x0c,0x44,0x02,0x2d,0xe0,0x14,0xe8,0x2d,0xd8,0xee,0xde,0x1e,0x06,0xf4,0xf5,0xef,0xf5,0xee,0xfc,0xf4,0xde,0xb7,0xed,0x2d,0x11,0x0f,0x31,0x02,0xb8,0xb7,0x7f,0xe6,0x2b,0xec,0x44,0x0f,0x01,0xe8,0x12,0xf8,0x0a,0xcb,0x3a,0x04,0x03,0x13,0xeb,0xf2,0x1f,0x35,0xf6,0xfa,0x0f,0x37,0x26,0xd2,0xf3,0x24,0xeb,0x03,0xfa,0x14,0xeb,0x22,0x38,0xe7,0xed,0xd3,0xe0,0xfa,0x07,0x22,0x11,0xdb,0x0c,0xf4,0x22,0xec,0x32,0x06,0xfd,0xe4,0x42,0x01,0xfa,0x25,0x1a,0x0c,0x04,0x19,0x33,0xdf,0x01,0xe3,0xd4,0xe1,0x1b,0x2c,0x18,0xdf,0xbc,0xcc,0x06,0xdf,0x7c,0x12,0x18,0xd6,0xc7,0xee,0xd0,0x0e,0xea,0x06,0xb1,0xda,0x1a,0xf9,0x94,0xe6,0xfe,0x05,0xd0,0xe3,0xcc,0xbb,0xf2,0xca,0xe6,0x27,0xf8,0xd7,0x04,0xe2,0xbc,0x7f,0xe3,0xfe,0x5a,0xea,0xc6,0xc3,0xe4,0xc3,0xf0,0x16,0xe5,0xf2,0x19,0xeb,0x0c,0x06,0xaf,0xf3,0x06,0x16,0xe5,0xf9,0xd2,0x08,0x10,0x0b,0x18,0x03,0xec,0xd7,0x27,0xe0,0xc6,0xea,0x40,0x08,0x3e,0x46,0xa8,0xff,0x4b,0x65,0x70,0xfc,0x3d,0x03,0x04,0x67,0x08,0x19,0xdc,0xe1,0xeb,0x11,0x12,0xf2,0x32,0xf1,0xfb,0xdb,0x0c,0xd2,0x16,0x85,0xcf,0xef,0x2b,0x09,0xdf,0x75,0xce,0x14,0x73,0xeb,0xe8,0x47,0xee,0x2b,0x11,0xab,0x3b,0xef,0x37,0xed,0x10,0x06,0xb2,0xdd,0xa3,0xb6,0x3f,0xfc,0x34,0x5e,0x3d,0xe9,0x43,0xf9,0x03,0x21,0xee,0xd0,0xfb,0xf5,0x23,0x06,0x45,0xfc,0xff,0xc9,0x25,0xa2,0x6d,0xfb,0xdc,0x11,0x25,0x07,0x18,0x58,0x2e,0x1d,0xfa,0x00,0xe2,0x28,0xf8,0xdb,0xc4,0x12,0xeb,0xbf,0xed,0xc8,0xf3,0xdf,0xa9,0xc0,0xf1,0x10,0xce,0x01,0xc5,0x0c,0xd2,0x0f,0xf9,0xb8,0x1f,0x3d,0x52,0x1c,0x4a,0xee,0x12,0xe4,0xef,0xd7,0xe0,0x23,0xd7,0x47,0x05,0xf6,0xc3,0xfd,0xfc,0xf7,0x7f,0xfa,0x1d,0xe6,0x04,0xdd,0x02,0xe2,0x81,0xca,0x0f,0xd0,0x2a,0xca,0xe7,0x21,0xf9,0x1a,0x57,0x1d,0x1b,0xf8,0x2f,0x2d,0xba,0xc8,0xc7,0xf1,0x22,0x20,0x10,0x30,0x3e,0xfd,0x33,0x16,0x13,0xcf,0xe6,0x21,0x1b,0xe3,0xf0,0x07,0x5c,0xfe,0x3a,0x3d,0x20,0xbc,0x44,0xf8,0x09,0xe8,0xf8,0xf5,0x3b,0x12,0xea,0x1c,0xf2,0x13,0x5a,0xf0,0xfb,0x18,0x13,0xc8,0x21,0x31,0xe7,0x4b,0x25,0xb7,0x5b,0x52,0x18,0x2a,0xd9,0x17,0x17,0x29,0x33,0x19,0x0f,0x0c,0xd3,0x27,0xf3,0x27,0xf7,0xe7,0xdb,0x18,0x05,0x04,0x17,0x36,0x28,0xf0,0xe8,0xcc,0xef,0x22,0x44,0xe4,0x4c,0x15,0xfe,0x02,0x4b,0xd9,0x33,0x1f,0xe8,0xd2,0x26,0x29,0x22,0xfe,0x7f,0x0e,0x32,0xfc,0x15,0xf5,0x1c,0x10,0x4b,0x04,0x10,0x3a,0xed,0x24,0x31,0xf6,0x1a,0x15,0x48,0x59,0x0f,0x01,0x08,0xed,0x33,0x0a,0x1f,0x15,0xfd,0xe4,0xde,0xed,0xfe,0x12,0x14,0x0b,0x18,0x09,0x47,0x11,0x0a,0xd9,0x01,0xb6,0xf9,0x10,0x23,0x00,0x70,0x01,0xfc,0xe6,0xec,0xf7,0xad,0x19,0x47,0x3d,0x27,0x06,0xe6,0xf7,0x02,0x1a,0x16,0xd4,0x36,0x03,0xcf,0xe7,0x4a,0x0f,0xd5,0x0d,0x02,0x25,0x96,0x3f,0x0b,0xe6,0xcd,0x2f,0x40,0xce,0x02,0xdf,0xe6,0xc0,0x0e,0x1e,0x3e,0x10,0x39,0xed,0xef,0x32,0xed,0xb3,0xe2,0xfa,0xd0,0xf9,0x0b,0xf8,0xfc,0x07,0x65,0x18,0x0a,0x49,0x38,0x00,0xe8,0x34,0xe4,0x06,0x0d,0xab,0xa7,0xd2,0x14,0xfd,0xdd,0x06,0x10,0x2b,0xd2,0x52,0x7f,0xfc,0xeb,0xdf,0x29,0xc1,0xf0,0xdb,0x05,0xe2,0xdc,0x24,0x0e,0xe3,0x16,0x3d,0xf3,0xee,0x0e,0xf8,0xea,0xd1,0xea,0x26,0x74,0x1a,0x3d,0x1c,0xd4,0xb0,0xf4,0x09,0xf5,0xe7,0x03,0xf6,0xcb,0xe5,0xe6,0xbf,0x1d,0xd1,0xfd,0x08,0xd9,0x3b,0xfb,0xff,0x1a,0x00,0x0a,0x00,0x7a,0x3b,0xf1,0x3a,0x01,0xa7,0xf7,0x08,0x22,0xff,0xf9,0x00,0xe5,0x13,0xf0,0x35,0x07,0x18,0x50,0x81,0x0d,0x45,0x08,0xb0,0x2b,0xdc,0xc0,0x34,0x03,0x04,0x6e,0x38,0x9d,0xf5,0x1a,0x3c,0xf0,0x26,0x36,0x15,0xf2,0x0d,0xd6,0xf9,0x39,0x2d,0x04,0xe9,0xea,0x14,0x15,0xd2,0x3b,0x14,0x69,0xee,0x1b,0xe4,0x23,0x4f,0x1f,0xd6,0x36,0xf1,0xee,0xc7,0x2c,0xda,0xc1,0x03,0xd5,0xb3,0x15,0x19,0x59,0xed,0x51,0x05,0x0b,0xf7,0xf9,0x05,0x08,0xe4,0x14,0x31,0x06,0x22,0x10,0x14,0x44,0xc1,0xdc,0x1a,0xc0,0x0a,0x0a,0x06,0x19,0xfb,0x08,0x08,0x05,0x34,0xfb,0xe8,0xfb,0x06,0x20,0xee,0x3a,0x0f,0x10,0xed,0x2b,0x14,0x00,0xd7,0xfb,0xfb,0xd8,0x04,0xe2,0xfc,0xfb,0xff,0xeb,0xf3,0x13,0x1b,0xfa,0x09,0x18,0xb3,0xf5,0xf0,0x14,0x04,0xff,0xea,0xef,0x03,0xf2,0x1c,0xfa,0xfb,0x23,0xce,0xf6,0xfd,0x18,0xe5,0x25,0xf5,0xee,0x11,0x05,0xf8,0x20,0x04,0x07,0xef,0x02,0x22,0xed,0x04,0x13,0xfb,0x0a,0xee,0x07,0xf4,0x09,0x18,0xf6,0xe9,0x03,0x05,0xfc,0xe5,0xd3,0x04,0x26,0x02,0x13,0x25,0x1e,0xf8,0x0d,0xf9,0x29,0xea,0xeb,0xf2,0x33,0xd2,0xeb,0x0e,0x15,0xee,0x08,0x0f,0x3d,0x1b,0x7f,0x03,0x05,0xee,0x23,0xfa,0xfb,0x17,0x06,0x1f,0x23,0x06,0x0e,0xf5,0x1a,0xfd,0xfe,0x08,0x0c,0xfc,0x17,0x19,0x0f,0xed,0x06,0x07,0xde,0x27,0xec,0x00,0xe8,0x2d,0x12,0x13,0xfd,0x12,0x09,0xf2,0x04,0xd4,0x0c,0xf9,0x19,0xca,0xe8,0x1f,0xe7,0x21,0xe7,0x09,0x05,0xf5,0x1d,0x00,0xfd,0xec,0x01,0xe6,0xf3,0xf6,0x26,0xb6,0xe9,0xec,0xf9,0xee,0xf1,0xe6,0x01,0xda,0xda,0xfd,0xf6,0xdb,0x09,0xf2,0x0a,0x1d,0xef,0xf6,0xdc,0x27,0x00,0x09,0xb8,0xb7,0xf5,0xba,0xdf,0x18,0xfd,0xba,0x0f,0x42,0xdb,0xff,0xf9,0xfc,0x3a,0x57,0x06,0x00,0xfb,0x1d,0x81,0x13,0x50,0x32,0x2c,0x43,0x09,0x02,0x17,0x19,0x0c,0x1d,0x28,0xe9,0xb2,0x32,0xfb,0xf4,0x19,0xfe,0xd5,0xe9,0x20,0xbd,0x07,0xd0,0xbc,0xa9,0x06,0x03,0xc2,0xe2,0xca,0x27,0xdb,0xe5,0x23,0x3d,0x13,0xf6,0xec,0xc6,0x06,0x0e,0x21,0x24,0xef,0xed,0xad,0x35,0xc7,0x1c,0x15,0x12,0x9e,0xb8,0xf0,0xfb,0x07,0xe7,0x07,0x21,0xfd,0x10,0x23,0x15,0x10,0x02,0x28,0xf2,0xb0,0x0d,0xe1,0xa9,0xe7,0xf9,0x60,0x28,0x77,0xb4,0xfe,0xf5,0x16,0xf9,0xed,0xba,0xd2,0x46,0x00,0xfc,0xef,0x71,0xca,0xe9,0x0d,0xf3,0x1f,0xed,0x1a,0x8c,0xcc,0x13,0x2c,0xb4,0x4b,0x0d,0xca,0x3c,0x38,0xf2,0xe3,0x3b,0x05,0xf4,0x1b,0xd6,0xef,0xd5,0x22,0x40,0x0b,0xf2,0xeb,0x24,0xde,0xc9,0x0a,0x22,0xe8,0xf6,0x1a,0x48,0x07,0xfd,0xe0,0x33,0x44,0xd9,0x3e,0x10,0xf8,0x81,0x0f,0xc8,0x09,0xe2,0x1b,0x97,0xe5,0xe1,0x6a,0xea,0xce,0x21,0xed,0xef,0xd7,0x08,0xf5,0x46,0xf5,0x26,0x17,0xd2,0xf2,0x11,0xfd,0xec,0x23,0xfb,0x3b,0xa3,0x51,0x03,0x0a,0x02,0x05,0x02,0xe2,0xd9,0x31,0x77,0x20,0x47,0xe5,0xfa,0x00,0xfa,0x21,0xd8,0x67,0x27,0x2f,0x06,0x5c,0x02,0x03,0x9d,0x3f,0x19,0xd8,0xde,0x04,0x37,0xcb,0x14,0x15,0x33,0x08,0x20,0x29,0x4e,0xc9,0xe5,0xf3,0x5c,0xba,0x1e,0xf9,0xd9,0x00,0xed,0x29,0x27,0xb2,0xe2,0xc1,0x43,0x14,0xf2,0xcf,0x00,0xf6,0x37,0x47,0x28,0x06,0x17,0x03,0x0b,0x22,0x48,0x11,0xb2,0x44,0x1f,0x3e,0xe4,0x9f,0x69,0xf5,0xfb,0xe7,0x3a,0xce,0x0b,0xdc,0xd5,0x2c,0xda,0xbd,0x50,0x1b,0xb1,0x50,0x01,0xc6,0x03,0x01,0x14,0x55,0x27,0x37,0xc7,0x0b,0x2c,0xb1,0xdb,0x0e,0xb9,0x1c,0x25,0x8e,0x00,0xf2,0x10,0xdc,0x1b,0x40,0x03,0x04,0xd6,0xff,0xec,0x26,0x09,0xbd,0xca,0xf2,0xee,0xeb,0x1c,0xe8,0xab,0x81,0x07,0x20,0x15,0x39,0xb8,0x0a,0xe5,0xdb,0xf3,0x03,0xe6,0x06,0x07,0xfc,0xdf,0x30,0x1a,0x32,0x0b,0xd2,0x22,0xe0,0x9d,0xae,0x21,0x33,0xc7,0x7d,0x38,0x13,0xc2,0xdc,0x27,0x09,0xb5,0xfe,0xfe,0x1a,0x29,0x0c,0xe0,0xf7,0x79,0xf9,0x04,0x30,0xec,0x5a,0xb5,0x3a,0x28,0xf0,0xe1,0x2d,0xba,0x1a,0x3d,0xdd,0x50,0x5d,0xb9,0xd7,0x57,0x1e,0x07,0xbc,0x4b,0xdc,0xe3,0xb1,0xf0,0xd9,0xf4,0x1b,0x69,0xe9,0xdf,0xf4,0xe0,0xe1,0xd2,0xcf,0xec,0x01,0xfa,0xde,0x5a,0xdd,0xdf,0x54,0xcb,0xf6,0x81,0x46,0xef,0x39,0x0e,0x1a,0xe3,0x0c,0x2e,0x09,0xe3,0xd7,0x04,0xa0,0xe7,0xe1,0x32,0xfa,0x02,0x00,0x0d,0xef,0xaa,0x20,0xf3,0xfd,0xe5,0xf2,0xe6,0x48,0xc0,0xfc,0xf4,0x34,0xfd,0xd0,0x28,0x12,0xf5,0x32,0x13,0x35,0xf0,0xd3,0xd5,0x0a,0xdb,0x19,0x36,0x4a,0x50,0x58,0xcf,0x37,0x1f,0x3e,0xda,0x32,0xef,0xcb,0x4d,0xce,0xfc,0x2f,0x19,0xf1,0xfe,0xdb,0x1d,0x28,0x1f,0xfb,0x4d,0xdd,0xde,0xc2,0x3a,0x0b,0xf5,0xb3,0xe0,0x68,0x33,0x09,0xd7,0x11,0xeb,0x3e,0xb6,0x39,0x2c,0x1d,0xfe,0xd5,0x30,0xde,0xe1,0xc3,0x0e,0xec,0x1c,0x64,0x32,0xf4,0x41,0x2f,0xee,0xcb,0xfe,0x31,0x2e,0xd1,0x9e,0x89,0xb2,0x2d,0x13,0x17,0x24,0xf9,0xdf,0xec,0x0b,0x3a,0x6f,0x2c,0xd1,0x0f,0xf7,0x00,0xea,0xc7,0xf3,0xe6,0x6c,0x2d,0xb9,0xc6,0x26,0x7f,0x25,0x91,0x07,0xce,0xf1,0xa8,0xed,0x7c,0x09,0xc6,0x01,0x4b,0x0c,0xdc,0xd4,0x69,0x15,0x0b,0xdf,0xf9,0x2b,0x0d,0x62,0x0a,0xc7,0xf6,0x28,0x14,0xaa,0xef,0xb6,0xef,0x26,0xc0,0xa4,0x2b,0xf3,0x15,0xf2,0x37,0x1e,0xdb,0xc3,0x34,0xb6,0x34,0x38,0xf6,0xe5,0xf6,0x26,0xd2,0xe4,0x1b,0x4b,0x3a,0xb5,0x15,0x2b,0xeb,0xb6,0xba,0x31,0xc4,0x36,0xfa,0xdd,0xec,0x60,0xdd,0x7f,0xb5,0x2e,0xe8,0x6c,0xfc,0x23,0x0d,0x07,0xd2,0x14,0x62,0xd2,0x12,0x36,0x03,0x10,0xb7,0xd4,0xe7,0xa9,0x3b,0x25,0xb2,0xce,0xd1,0x9b,0xc0,0xe5,0xdb,0x1d,0x24,0xb3,0x5b,0xec,0x2b,0x1e,0x59,0x35,0x54,0xef,0xef,0x20,0x06,0x70,0x20,0xc7,0xc5,0xb7,0xee,0x3b,0xe5,0x1d,0x46,0xe6,0xde,0xfb,0xf5,0xb5,0x19,0x34,0x07,0xe5,0xfa,0x18,0xfa,0x13,0xa9,0x33,0xb6,0xfa,0x08,0xdd,0x0d,0x22,0x8e,0x57,0xcd,0x07,0xd9,0xec,0x48,0xe0,0xd5,0x04,0xf8,0xc6,0xd2,0xd7,0xf8,0x08,0xf1,0x48,0xac,0x3e,0x1f,0x1d,0xe7,0xc9,0xc5,0xd9,0x38,0x4a,0xc6,0x2d,0x35,0x3e,0x1a,0x1b,0xf6,0x2d,0xd1,0x08,0xe3,0xa9,0xc3,0x2a,0x6a,0x17,0xfd,0xd9,0xdb,0x23,0xda,0xde,0x1d,0x1d,0x06,0xf5,0xaa,0x85,0xf3,0x07,0x30,0xfb,0x04,0xde,0xe3,0x51,0xea,0x0d,0xfc,0x17,0x1e,0x18,0xd0,0xdc,0x28,0x00,0x16,0x1d,0x51,0x81,0xd4,0xc6,0x22,0xe0,0x01,0x02,0x15,0x0f,0x4a,0x1e,0x1e,0xc4,0x10,0x03,0xf8,0x19,0x0d,0xbd,0x16,0x02,0x1b,0xf1,0x4a,0xe5,0x97,0x39,0x15,0xcf,0x25,0xb8,0xfa,0xf0,0x2c,0x19,0x17,0xd4,0x03,0x1c,0x33,0xde,0xf3,0xdc,0xe9,0x0c,0xe3,0xeb,0xd2,0x22,0x98,0x2b,0xf4,0xea,0xd7,0x11,0x15,0xee,0xd8,0xf9,0x0f,0xfd,0xd9,0xfc,0xed,0xed,0x3d,0xe2,0xdf,0xef,0x2e,0x24,0xf8,0x1d,0xd6,0x37,0x52,0xd0,0xa6,0xea,0x25,0x07,0x7f,0x47,0x1c,0xff,0x1f,0x05,0xfa,0x4b,0x1e,0x44,0xee,0x0e,0x0e,0xf5,0xec,0x1d,0x10,0x28,0xe0,0x28,0xe5,0xe5,0x38,0x02,0x1b,0xb0,0x10,0xd8,0x15,0x2b,0x00,0xfb,0xe2,0x26,0x3d,0x35,0xeb,0x13,0x3a,0x13,0x02,0x25,0x39,0x33,0xe7,0x06,0x1f,0xdf,0x06,0x2e,0xf8,0x25,0xe5,0x33,0xd5,0xea,0x17,0x44,0xb5,0xe3,0xe6,0xec,0x67,0xeb,0xcd,0xcf,0x05,0x45,0x15,0xec,0xf8,0x20,0xf9,0x0f,0x55,0xe1,0xc3,0x2b,0xef,0xc0,0x0f,0xf4,0x84,0x0b,0x04,0x09,0xeb,0xcc,0xff,0x40,0xea,0x03,0x5f,0xeb,0xee,0x44,0xfa,0xc3,0xef,0x42,0x09,0xb4,0xde,0xde,0x30,0x46,0x13,0x45,0xf7,0x0a,0x26,0xfc,0xba,0x26,0xfb,0x3e,0x11,0x1e,0xfd,0xc5,0x54,0xc1,0xec,0x37,0x08,0x51,0xf5,0x5c,0xcb,0x1b,0xb6,0x6f,0x02,0x1b,0xdf,0x2e,0xf5,0x1d,0x18,0xe7,0x23,0x0c,0xd0,0xb8,0x04,0xf5,0x0d,0x0a,0x03,0x3d,0x18,0xc2,0x3e,0x2a,0x10,0xf1,0x1c,0x43,0xdb,0x2f,0x18,0x07,0xfd,0x1a,0xf6,0x01,0xf1,0x03,0xda,0x1c,0x69,0x36,0x01,0x05,0x2a,0xf3,0x34,0x0f,0x1f,0x07,0x47,0x40,0xc3,0x55,0x08,0x14,0x44,0x27,0xeb,0x09,0x05,0x22,0x0d,0x5a,0x66,0x2d,0x04,0xa5,0x23,0x13,0xf0,0xe6,0xc0,0x02,0x7f,0x1c,0x54,0x5a,0x51,0xd8,0xdb,0xf3,0x01,0x26,0xe9,0xe6,0xc6,0x18,0x20,0x2a,0x13,0xfe,0x48,0x22,0xf4,0x4b,0x07,0x27,0xec,0xd7,0x0f,0x4c,0xd9,0xff,0xe1,0x58,0xcc,0xbd,0x04,0x57,0x1d,0x58,0x17,0xf2,0xea,0xc8,0x41,0x1b,0x69,0x41,0x3a,0x2c,0x35,0x3a,0xef,0xe2,0xeb,0x07,0xc2,0x46,0xf3,0x06,0x27,0x0d,0xfe,0xc9,0x0b,0x03,0xff,0x02,0x03,0xf1,0xc7,0x10,0xe9,0xc7,0xe1,0x03,0x55,0x7f,0xe1,0xc3,0x1b,0x15,0x05,0xa2,0x06,0xe1,0xf1,0xf4,0xcf,0x40,0x07,0x10,0x44,0x13,0xf1,0x51,0xfd,0x12,0xfd,0x24,0xe2,0xdb,0x06,0x34,0xd2,0x2c,0xd0,0x1b,0xc6,0x1a,0x0f,0xce,0x07,0xf8,0xe3,0x28,0xd8,0x11,0x59,0xf1,0x02,0x19,0x2a,0xec,0xd5,0xff,0x59,0xd3,0x01,0x19,0xf9,0xfa,0x15,0xdc,0x2a,0x27,0xc9,0x00,0xdc,0x1c,0x06,0xfc,0xec,0x37,0x0b,0xcd,0xe8,0xf3,0xf1,0x24,0xcc,0x32,0x04,0x05,0x01,0x0e,0x24,0x03,0xf1,0x4a,0xe9,0x0e,0x2c,0x47,0xee,0x94,0x25,0x03,0xfc,0xde,0xfb,0xbc,0x20,0xd2,0xfb,0x27,0xdb,0xf7,0xfe,0x0b,0x11,0x04,0x2b,0xf4,0x35,0xef,0x39,0x0a,0x0d,0xcf,0x0c,0x06,0x34,0xe1,0x1a,0x01,0x0d,0x7f,0x1d,0x08,0x0a,0x46,0xf8,0xdd,0x1c,0x2c,0xda,0x37,0x08,0x40,0xdd,0x06,0x21,0xc6,0xeb,0x09,0x07,0x26,0x4f,0x34,0x28,0x2e,0x17,0xe2,0x3b,0xed,0xd6,0xbc,0xf1,0x44,0x1b,0xe8,0xe7,0x0e,0xeb,0xe1,0x24,0x12,0x11,0xed,0x32,0xcc,0xec,0x12,0x19,0xfc,0x18,0x01,0x2d,0xe5,0x12,0xb0,0x0d,0xf5,0xe3,0xf7,0x35,0xe6,0xf1,0xf3,0x26,0x02,0xf0,0x02,0x33,0x55,0xe6,0x28,0x3a,0x0b,0xf8,0x0f,0xf9,0x1d,0xce,0xfd,0xe1,0xda,0xfb,0x16,0x04,0x3a,0xc8,0x1b,0x26,0x0d,0x3e,0xd8,0x1c,0x34,0x0c,0xf3,0x0d,0x5d,0xf0,0xfa,0x05,0x13,0xec,0x0f,0x05,0x1c,0xed,0xeb,0x0c,0xef,0xfd,0x10,0x22,0xfb,0xee,0x1e,0x3c,0xfa,0x32,0x32,0x04,0xea,0x18,0xf3,0x08,0x07,0x08,0x2c,0x44,0x40,0x10,0x20,0x13,0x7f,0x1a,0xf6,0x11,0x45,0x16,0xda,0x0f,0x12,0xf4,0x09,0x0c,0xf6,0x12,0xfb,0xed,0x18,0x1d,0x01,0xe5,0x1d,0xe9,0xf9,0xeb,0xfe,0x00,0x00,0x06,0x14,0x11,0xf1,0x05,0x14,0x05,0xfb,0x03,0xf4,0x0e,0xf5,0xf9,0xf7,0xf8,0xfc,0xf0,0x05,0x0a,0xe5,0x1f,0x03,0xf3,0xf9,0x1b,0xe1,0x07,0x28,0x07,0xca,0x09,0xed,0x09,0xf8,0xf8,0xf7,0xfa,0x09,0x1e,0x09,0x21,0xf7,0xfb,0x21,0xf1,0x0c,0xf8,0xf7,0x04,0x0f,0x00,0xe4,0xee,0xfd,0xf0,0xee,0xf2,0x04,0x2b,0x30,0xf3,0x01,0x0a,0xe9,0xfe,0x1d,0x00,0xf5,0x05,0x10,0xda,0x12,0x3a,0x13,0x00,0xf8,0x07,0xfe,0x03,0xd6,0xf6,0x0a,0xfa,0x51,0xfc,0x1c,0xcb,0xfa,0xec,0xe0,0x1c,0x1e,0xe0,0x00,0xfb,0x37,0x5c,0x0b,0xc5,0xf7,0xe5,0x20,0xe5,0x1a,0x56,0x2e,0xf7,0xd0,0x71,0x7f,0xc4,0x38,0x1a,0xd0,0xc6,0x5f,0x2c,0xc5,0x26,0x1b,0x24,0xfd,0xe3,0x00,0x40,0xe3,0x20,0x10,0x25,0xec,0xfc,0x07,0xaf,0xfd,0x20,0x9e,0x0a,0x4a,0xa2,0xc4,0x68,0xdf,0x28,0xf3,0x15,0x0a,0xc3,0x44,0xc3,0xe0,0xce,0xb9,0x2c,0x2a,0xeb,0x1b,0x75,0x56,0x1d,0xf6,0xbd,0x36,0xa9,0x08,0x67,0x1a,0xff,0x1e,0xdd,0x05,0xb3,0xfd,0xc2,0x0c,0xe3,0xe5,0xe3,0xda,0xdc,0xd6,0x13,0x62,0x00,0x31,0xc6,0x0c,0x8e,0xfa,0x5c,0xec,0xd8,0x40,0xbd,0xdc,0xbf,0x0e,0xc8,0x3f,0xc7,0x15,0x10,0x55,0xe2,0xf7,0xc3,0x39,0x42,0x1f,0x08,0x0f,0x40,0xf4,0xd3,0x07,0x15,0xd4,0x5c,0xfe,0xe9,0xda,0x59,0x1f,0xdd,0x35,0x5a,0x9f,0x04,0x32,0xe0,0x13,0xcb,0xe6,0xe6,0xb5,0x1b,0x12,0xcb,0xdc,0xc7,0x1d,0x0f,0xf6,0x48,0xe8,0x16,0xdb,0xfe,0x1a,0xe7,0x0f,0x27,0xf5,0x3c,0xe6,0xd8,0x0f,0x06,0x49,0x09,0xe8,0x21,0xf8,0x17,0x06,0x22,0x14,0x50,0x06,0x67,0xe1,0xc5,0xa6,0xca,0x04,0xf4,0x22,0xf5,0xd9,0xff,0xf3,0x67,0xef,0x48,0xf5,0x57,0xcd,0xb1,0xf7,0x09,0xfb,0x30,0x24,0x10,0x0a,0x3d,0x0f,0x15,0x24,0x35,0x0e,0x10,0xeb,0x48,0xf8,0x1b,0xcd,0x14,0xd2,0x2d,0x01,0xe9,0x51,0x07,0xe4,0x46,0xff,0x2d,0x7f,0xeb,0x18,0x1b,0x4f,0x0e,0x27,0x03,0xdb,0x42,0xc1,0x3c,0x3b,0x05,0xd7,0x29,0x16,0xec,0x5a,0xa4,0x04,0xa0,0x04,0x1d,0x1a,0x08,0x4a,0x3b,0x0d,0xf5,0xf2,0xdd,0xd1,0x34,0xe9,0x18,0xf5,0x0c,0xfe,0x39,0xd4,0x41,0xeb,0x09,0xdb,0x02,0x29,0x35,0xe9,0x07,0xe3,0xfb,0xe3,0xef,0x0d,0xd4,0x33,0xfa,0x1b,0xe1,0x13,0xfc,0xf8,0x0b,0x00,0xff,0xee,0xc8,0xdc,0x31,0x31,0x41,0xe5,0xff,0xef,0x14,0x4f,0xee,0x01,0xe7,0xf9,0xe7,0xf1,0xef,0x16,0xfa,0x00,0x07,0xee,0xf0,0x1d,0xd3,0x1d,0x04,0xf7,0x7f,0xbc,0xf7,0xd6,0xfb,0xd5,0xe7,0x31,0x12,0xf4,0x13,0xe1,0xea,0xfc,0xdf,0x15,0x45,0xcf,0xe3,0x06,0xed,0x07,0xf4,0x04,0x1b,0xe3,0xf3,0x1d,0x11,0xf1,0xf6,0xf6,0xfb,0x24,0x32,0x45,0xf1,0xeb,0xeb,0x19,0x26,0xc0,0x10,0x12,0x04,0x26,0x55,0xe6,0x25,0xe1,0x04,0x0e,0xf1,0x45,0x00,0xda,0xc1,0xbb,0x65,0x0e,0x20,0x18,0xe3,0xde,0xf3,0x1b,0xd1,0x11,0xc8,0xe0,0xed,0x04,0xda,0xfc,0x07,0xe2,0xe2,0xd5,0xeb,0xbb,0xe0,0xfc,0x12,0xf7,0x1d,0x16,0x3d,0xe9,0x10,0x53,0x03,0x02,0xe7,0xd4,0xfc,0x7f,0x39,0x24,0x2f,0x22,0xd8,0x16,0xf1,0xec,0xfe,0x20,0xf4,0xdd,0x0c,0x04,0x07,0x02,0xb8,0x0d,0x03,0x58,0x24,0x21,0xd1,0x28,0x35,0xfd,0x15,0x05,0x08,0xdd,0x10,0x0a,0xdb,0x58,0x06,0x31,0x07,0xfe,0x22,0xd4,0x4b,0xfe,0x04,0xf6,0x06,0x15,0x3f,0x24,0x0b,0x12,0x0e,0x11,0x10,0x05,0xee,0x14,0x06,0xfc,0xda,0x21,0x22,0x48,0xec,0xff,0xb5,0xee,0xc3,0xec,0xbe,0x0f,0xfa,0x23,0x11,0x2f,0x04,0xf0,0x23,0x0c,0x14,0x5e,0xe2,0x02,0xd9,0x2c,0xf4,0xe7,0xdd,0xef,0xf3,0x0f,0x40,0x35,0x26,0x0a,0xe6,0x81,0x23,0x18,0x4d,0x18,0x48,0x0c,0xf7,0xf9,0x2a,0x5c,0x17,0x4d,0xff,0xe7,0xfa,0x47,0xeb,0xda,0x0b,0x09,0xe2,0x22,0x0b,0xfb,0x41,0x20,0xe1,0xee,0x14,0x18,0x1a,0x4b,0x3b,0x1b,0xf0,0x13,0xfb,0xf0,0x10,0x11,0x13,0xee,0xea,0x0e,0x08,0xde,0x0f,0xe9,0xfa,0x0e,0x27,0xfc,0xf5,0x4a,0x36,0x1f,0x5b,0x20,0xf8,0x10,0x4f,0xb4,0x17,0x19,0x26,0xdf,0xf3,0x0c,0x6d,0x24,0x2b,0xf4,0xed,0x0f,0x12,0xe8,0x0e,0x1d,0x12,0xf8,0x08,0xf1,0x12,0x14,0x58,0xd5,0xf4,0x05,0x0a,0xfe,0xfe,0x3a,0x0c,0x2d,0x09,0xbb,0x0f,0x5c,0x05,0x33,0x25,0x3f,0x22,0xe9,0xef,0x0b,0xf3,0xf9,0xf6,0x01,0x01,0xc6,0x2b,0x49,0xac,0x4e,0x05,0x2e,0x09,0x28,0xb4,0x26,0xfe,0x3a,0x28,0xfa,0xf5,0x0e,0x35,0x11,0x6a,0x52,0x12,0x8e,0x02,0x3e,0xec,0x3f,0x31,0x31,0x3a,0x9e,0xe6,0x5c,0x00,0xbb,0x00,0xd7,0xda,0x41,0x19,0xaa,0xd9,0xcd,0xe7,0x08,0xb2,0xe0,0x09,0x25,0x46,0x5d,0x05,0x36,0x20,0xdb,0xf6,0x24,0xe4,0x1f,0x21,0x00,0x26,0x22,0x28,0x52,0x13,0x14,0xe7,0xe0,0x17,0x33,0xe8,0x0c,0x5d,0x33,0xdc,0xb6,0x10,0x0f,0xb0,0xe3,0xae,0xf6,0x39,0xa9,0x52,0x25,0xf8,0xc9,0xf2,0x2f,0xf1,0xe8,0x44,0x2e,0x08,0xda,0x35,0x46,0x0f,0x02,0x7f,0xfe,0xba,0x04,0xe8,0x74,0x00,0xe1,0xe8,0x2f,0xee,0xe2,0x27,0x59,0x3b,0x38,0x33,0x02,0x01,0x0f,0xb6,0x11,0x18,0x05,0x0c,0xfb,0x53,0xeb,0x0f,0x18,0x2b,0xda,0x14,0xe3,0x5a,0x0d,0xff,0xef,0xff,0xf3,0x13,0xdb,0x28,0x08,0xdf,0xe8,0xf2,0xc9,0xfc,0x42,0xd5,0x10,0x09,0xe0,0x4b,0x3b,0xdc,0x13,0xe4,0xd6,0x32,0x45,0x08,0xfb,0x36,0xcb,0x04,0x59,0xf6,0x17,0xd2,0x07,0x46,0x25,0xd6,0xe9,0xdb,0xfc,0xfd,0xe2,0xf3,0xe6,0xde,0xf5,0xae,0x04,0x13,0xda,0x55,0xd9,0x4a,0xde,0x0f,0x07,0x0d,0xa5,0xc6,0xe9,0xd4,0xbb,0xda,0xf3,0x45,0x81,0x18,0xaf,0xfc,0x08,0xfd,0xb0,0xe5,0xcb,0xda,0x01,0x01,0xf8,0x59,0xf0,0x02,0x17,0x39,0x0a,0xdb,0xac,0x06,0x16,0xdc,0xf4,0xf7,0xf8,0x1d,0x10,0xc2,0x0b,0xcc,0x21,0xdb,0xc9,0xde,0x02,0x11,0x57,0x0c,0x31,0xec,0x29,0x40,0x27,0xe3,0xe9,0xed,0x1e,0xc0,0x43,0xcf,0xc0,0x37,0x3c,0xbf,0xfb,0xd4,0x1d,0xef,0xd1,0x64,0xe8,0xf3,0x18,0xf4,0xee,0x05,0xeb,0x03,0xe0,0xfb,0xc2,0xe7,0xab,0x24,0xc5,0xf8,0x7f,0x2a,0x00,0xc4,0xe9,0xf0,0x04,0xfc,0x1c,0xf1,0x05,0xff,0xc7,0x35,0x15,0xcd,0xea,0xfb,0x0a,0xb8,0x6c,0x2c,0x0a,0x10,0xde,0xf3,0xfa,0x9a,0x33,0xda,0x08,0x24,0xda,0x0d,0x18,0x4e,0x11,0xf2,0xfe,0x1c,0xe6,0xd2,0xe3,0xf1,0x3a,0xdc,0x01,0x2f,0xe2,0xf1,0xdb,0xfa,0x28,0xbc,0xef,0x5e,0xed,0x05,0xcf,0xe9,0xf2,0xcb,0xfa,0x3a,0x2f,0xf8,0x28,0xfa,0xdf,0xe9,0xd7,0x29,0x07,0x02,0xf0,0x3a,0xf0,0xd3,0x08,0x15,0x0d,0x2d,0xe4,0x2a,0x30,0xe3,0xc1,0x1d,0x2f,0x17,0x14,0xf9,0x31,0x11,0xff,0xfd,0xc9,0x1b,0x1c,0x0e,0x55,0xf3,0xe2,0x16,0xd7,0xc7,0xd8,0x2f,0xfc,0xe1,0x1f,0x03,0xcc,0x32,0x33,0x30,0xeb,0xe3,0xbf,0x13,0xf9,0x06,0xe7,0x03,0x0e,0xee,0xf9,0x3d,0x51,0x05,0xef,0x22,0xef,0x02,0xf4,0x17,0xdc,0xbb,0xf0,0x0b,0xcd,0x48,0xf2,0xd4,0x32,0x01,0xef,0xd6,0x15,0x12,0x1c,0xff,0x2c,0xf9,0xca,0xd4,0x15,0x08,0xdc,0x03,0x0a,0xf0,0xe1,0x1b,0xf4,0xd4,0xbd,0xed,0xdc,0xff,0xeb,0xce,0x09,0x25,0xef,0x31,0xee,0xee,0x81,0xfd,0xf1,0xfb,0xf7,0x50,0xaf,0xd7,0xcd,0xec,0xe3,0x0a,0x0c,0x0c,0xd7,0x18,0x02,0x18,0xf2,0xe2,0x0d,0x21,0xd1,0x0b,0x00,0x0c,0x14,0x41,0xf3,0x14,0xbc,0x26,0xe4,0x26,0x37,0xfc,0x0a,0xe3,0xd4,0x06,0x2a,0xe3,0x27,0x0a,0xd4,0xf6,0xfd,0xf1,0xe8,0x5b,0xfa,0xd2,0xc6,0x42,0xdd,0x07,0xe8,0xed,0x09,0x32,0x5b,0xf8,0xfb,0x2a,0x0d,0x3f,0xd4,0x16,0xd4,0x23,0x06,0xd3,0x2c,0xbb,0x24,0xd2,0x14,0x09,0xed,0x01,0x5d,0x7f,0xbb,0xfb,0xd5,0x14,0x2d,0xfe,0x13,0xbe,0x0c,0xe5,0x1a,0x05,0x24,0xd9,0xbc,0xef,0x05,0xfc,0x16,0x32,0x31,0x14,0xd6,0x33,0xfc,0xe6,0xe1,0x1c,0xe3,0xef,0xd8,0xa7,0xce,0xd8,0x11,0xca,0xf8,0xf8,0xdd,0x1b,0xf5,0x51,0x08,0x34,0x09,0xfb,0xb7,0x2f,0xbf,0x3e,0xf2,0xda,0x4a,0xdc,0xe2,0x14,0xf5,0x7f,0x37,0x42,0xd3,0x10,0xeb,0xe0,0xf8,0xd8,0x10,0xf4,0xee,0x48,0x32,0x0a,0xcb,0x1b,0xc0,0xf9,0x19,0x01,0x1c,0xd1,0x04,0xe9,0xd6,0xb9,0x5a,0xe8,0x0a,0xe1,0x25,0x21,0x0d,0xc6,0xf8,0xfa,0xcc,0x36,0xe9,0x22,0x69,0x2d,0xec,0x4d,0x36,0xc1,0xee,0xcb,0xe1,0x4b,0xfe,0xd5,0x31,0xe0,0xf9,0x1d,0xf3,0xab,0x2b,0x24,0x4b,0x15,0x66,0xd9,0x29,0x14,0x40,0x6d,0xa1,0xe4,0xca,0x21,0xb7,0x07,0xfb,0xff,0xc0,0x2b,0xf8,0xe9,0xfe,0xe2,0xe8,0xad,0x23,0xc0,0x3e,0x17,0x09,0xbc,0x30,0xcf,0xd0,0xf4,0xd8,0x1c,0x5d,0xf6,0x3c,0x0f,0xd9,0x1c,0x24,0x0d,0xd0,0xc1,0xd4,0xd7,0x00,0xfd,0xe3,0xa1,0xde,0xe1,0x11,0x0d,0x36,0x29,0x48,0x27,0xf6,0x3e,0xf1,0x2b,0x2b,0x21,0xc3,0xe6,0xf8,0x10,0xe3,0xd8,0x02,0xf2,0x45,0x4f,0xd8,0xfc,0xf4,0x6b,0xf7,0xfe,0xac,0x18,0xe8,0x12,0xfd,0x14,0x1f,0x2a,0xd1,0x26,0x56,0xb8,0xae,0x0f,0x36,0xac,0x16,0xd7,0x06,0x0d,0x1d,0x3f,0xfa,0x18,0x40,0x01,0x7f,0xfe,0x35,0xed,0xc8,0xcc,0x04,0x3a,0x2f,0xdd,0x32,0x2c,0xfb,0x17,0xf0,0x0c,0x17,0x0e,0x11,0xd6,0xa7,0x75,0xd0,0xf6,0x23,0xd8,0x46,0x01,0x10,0x06,0xd1,0x38,0xc9,0xb7,0xb0,0xea,0xf8,0xe9,0x10,0x55,0xcd,0x17,0x3c,0x99,0x0e,0x81,0x27,0xd5,0xd3,0x05,0x2f,0x2d,0xab,0xfa,0x41,0xc5,0x7a,0x44,0xe9,0xca,0xd8,0xce,0x0e,0xc1,0x23,0x29,0xdb,0xda,0x32,0x09,0x2a,0xcd,0x2b,0x61,0xf4,0x09,0xf2,0xe8,0x18,0x29,0x03,0x47,0xee,0xe5,0xab,0xd3,0xe6,0x3a,0x23,0xe0,0xb0,0xcd,0x2d,0xce,0xfd,0x25,0x95,0x24,0x46,0x27,0x20,0x49,0x97,0xb6,0xe1,0x2f,0x8c,0xf1,0x11,0x08,0x1a,0xa8,0x0f,0x2d,0x11,0x20,0x3a,0xfd,0x20,0xfd,0x20,0xcc,0x20,0x31,0x5f,0x1b,0x47,0x24,0xd8,0xf1,0xc5,0xb3,0xe5,0x25,0xd5,0x4f,0x42,0x01,0xbd,0x27,0x09,0xac,0x37,0x3f,0xd4,0x50,0xcc,0xb6,0x38,0x1e,0xe6,0x0d,0x19,0x0f,0xd0,0x1d,0x0f,0xf2,0xa3,0xf9,0xe9,0x07,0xf4,0x09,0x0c,0xf6,0xe8,0x48,0x18,0xdd,0x47,0xaa,0x17,0x02,0x00,0x06,0x4b,0xec,0x2e,0xf0,0xe4,0x28,0xea,0x31,0x54,0xa3,0xe9,0xb8,0xee,0x2e,0xa5,0x9f,0x00,0xfa,0xd0,0x06,0x13,0x0f,0x24,0x16,0x19,0x58,0x1e,0x07,0x2e,0x2f,0xef,0xfb,0xcf,0xeb,0x3b,0xa5,0xf4,0xcd,0xb4,0x4e,0x08,0x7f,0x06,0xee,0x2d,0xcc,0x04,0x69,0xe7,0xe2,0x1f,0x00,0xe7,0x00,0xe5,0xdb,0xfb,0x19,0xb8,0x00,0x42,0xd2,0x3d,0xb0,0xd0,0x1a,0x07,0x24,0xe9,0xfc,0x20,0xec,0x1a,0xb8,0x28,0xc5,0x24,0x14,0xc9,0x9e,0x11,0x00,0xdf,0xbd,0x1d,0xea,0x19,0xd5,0xb0,0x52,0xf2,0xf3,0x1d,0xbe,0xe9,0xad,0x3b,0xe2,0xff,0xaa,0xd6,0xf1,0xfe,0x1f,0xda,0xfa,0x0f,0x06,0xb1,0xf8,0x20,0x22,0x67,0x12,0xea,0xda,0xa1,0xc3,0xd6,0x25,0x57,0xcb,0xea,0x1c,0xf4,0xcb,0xb9,0x44,0xf7,0x1f,0x3b,0xe6,0xb9,0x9e,0xd4,0xd3,0x2d,0x4e,0xe6,0x09,0xd8,0x04,0x58,0xf8,0xc3,0x9b,0xe8,0x14,0xec,0x41,0xec,0x01,0xfe,0x03,0x19,0xcd,0xc1,0x90,0x0b,0xef,0xda,0x1d,0xfa,0x3d,0xf5,0x09,0x11,0xaa,0x1d,0xe4,0x10,0x05,0x14,0xff,0x1d,0xe7,0x36,0x69,0xee,0x01,0xfc,0xd9,0x48,0xe0,0x06,0x40,0xfa,0xcb,0xf8,0x65,0x53,0xfb,0x0b,0x7f,0x53,0x2b,0xed,0x89,0x50,0x07,0x03,0x06,0xf3,0x12,0x1c,0xca,0x1f,0x72,0xd0,0xce,0x1e,0x99,0x20,0x10,0xbd,0xf0,0xd1,0x48,0xe1,0x2b,0xb6,0x38,0xd0,0x06,0x05,0xf6,0x04,0x19,0x53,0x1b,0xbf,0xaa,0xd0,0x06,0x26,0xc4,0x57,0x46,0xff,0x0f,0xa3,0xfb,0xf1,0x0c,0x2b,0x33,0xdc,0x10,0x0f,0x0e,0xbd,0x05,0xbf,0x2f,0xe7,0x2b,0x0a,0x00,0x15,0xfc,0xb1,0x22,0x01,0x1e,0x17,0x08,0x53,0xfa,0xcd,0xf4,0x39,0xf7,0xd6,0xe9,0xd4,0x01,0xce,0xcd,0x27,0x48,0x91,0xff,0xd7,0xaf,0xbc,0x32,0xb2,0x26,0xd4,0xf6,0x33,0xc5,0x29,0x0d,0xc3,0x5a,0xfd,0x7c,0x24,0xfc,0xf8,0xc3,0x31,0xba,0xb5,0x3d,0xc7,0xf0,0x3f,0xbf,0x51,0x17,0xd9,0x79,0xce,0x17,0xba,0x29,0xc4,0x94,0x33,0xf9,0xe9,0xcb,0x21,0xf7,0x2e,0x1e,0xab,0xeb,0xc3,0xfa,0x0c,0x0a,0xc6,0x81,0x40,0x00,0xfb,0x0a,0x0c,0x01,0xe3,0x81,0x00,0x7e,0xee,0x48,0x23,0xd7,0xde,0x42,0x5e,0xea,0x11,0xca,0x47,0xe9,0x02,0xf7,0xd2,0x28,0x03,0xf7,0xfa,0x13,0xc1,0x2a,0xdf,0x01,0xe7,0xc8,0x0b,0xf6,0xce,0x42,0x38,0x0c,0x23,0xc8,0xd8,0xed,0x10,0x22,0xea,0xfc,0x28,0xf9,0xc7,0x00,0xd6,0xeb,0x7a,0x31,0x33,0xf2,0xf6,0xf4,0x0c,0x98,0xe9,0xd3,0x2a,0xdf,0x09,0x1a,0xf9,0xf8,0xfd,0xe0,0x1d,0xec,0x41,0x28,0x72,0xf9,0xa4,0xe1,0xbf,0xf1,0xd7,0xde,0xf3,0x05,0x43,0xf2,0xcf,0xc3,0x1a,0xef,0x05,0x20,0xef,0xff,0xeb,0xfb,0x16,0x30,0xc9,0xe4,0xcc,0x1f,0xf4,0xfb,0xc3,0x19,0xf4,0xa5,0x32,0x11,0x07,0x13,0xec,0x23,0x50,0x0d,0x02,0xe1,0xb0,0x5c,0xf8,0x20,0xd2,0x44,0x2e,0xd0,0x19,0xc8,0xf8,0xe1,0x0f,0xed,0xed,0xd3,0x3d,0xe5,0x63,0x4d,0x3a,0x32,0xdb,0x31,0x08,0x3b,0x56,0x2c,0xc2,0x05,0x2f,0xfe,0x16,0xff,0x17,0x10,0xa0,0xb7,0x2a,0x49,0xb2,0xf7,0x0b,0xbf,0x33,0xf8,0xb9,0x46,0xfd,0x1a,0x27,0xd4,0x12,0x12,0xe7,0x25,0x23,0xf1,0x1c,0xda,0x23,0x47,0x22,0xf4,0x13,0xda,0x2d,0xdc,0xf1,0xea,0xda,0x21,0x35,0xfc,0x24,0xf2,0xe3,0x20,0x0d,0x39,0xe8,0x18,0xe8,0x7f,0xde,0xd8,0x11,0x33,0xcb,0x20,0xf4,0x6f,0x4a,0xfe,0x05,0xf9,0x2b,0xff,0x04,0xe2,0x28,0xec,0x32,0xdc,0xf2,0x07,0x09,0x43,0xec,0x11,0xef,0xdf,0x11,0xf0,0xfa,0x10,0xeb,0xdb,0x13,0xc7,0x19,0xea,0xd8,0x06,0x32,0x19,0x14,0x3c,0x28,0x09,0xe4,0x5b,0x41,0x1f,0xfb,0x57,0x61,0x57,0x2d,0x13,0xbd,0x25,0x38,0x1b,0x27,0x2e,0x34,0x11,0xbe,0xda,0x2a,0x2a,0xbe,0x0c,0x02,0x43,0xe5,0x1b,0xf7,0x08,0xd8,0x69,0xd4,0x27,0x19,0x4b,0xc6,0x04,0xc0,0xf2,0xe9,0x3a,0x25,0xda,0xc7,0xf1,0xd3,0xae,0x9e,0xc5,0x2a,0xea,0x07,0xd2,0x04,0xb9,0x05,0x5e,0xda,0x47,0x81,0xf6,0xf8,0x01,0x0a,0x08,0xe8,0x11,0xcb,0xe2,0xd7,0xbe,0x02,0xb5,0x2e,0x15,0xf4,0xce,0xd6,0x26,0xf5,0x28,0x28,0x39,0xcb,0xf1,0x2f,0xac,0xcc,0x91,0xed,0x15,0x0f,0xd3,0xd0,0xed,0xb8,0x05,0x0d,0x47,0xe9,0x18,0x03,0x1e,0xdf,0x18,0xe0,0xcf,0xda,0x5e,0x99,0x29,0xc1,0x3e,0xed,0xf9,0x4b,0x9e,0x06,0xf6,0x68,0x27,0xf2,0xe2,0xca,0xf6,0xc8,0xe6,0xd7,0xe7,0xf7,0xc3,0xdd,0x07,0xf7,0x17,0xdb,0xff,0x05,0x09,0x02,0x01,0xec,0x0d,0x01,0x1d,0xdf,0x18,0xb8,0x15,0xff,0x35,0xcf,0x06,0x5f,0x26,0x1c,0xdf,0x05,0xeb,0x16,0x42,0x4d,0xf8,0x1f,0xcd,0x20,0xc4,0xd5,0x11,0xf6,0xea,0x00,0x23,0x0b,0xee,0x37,0x12,0xe2,0xf2,0x41,0xea,0x04,0x0d,0xd6,0xd1,0xd8,0x18,0xd5,0xf1,0x0f,0xc1,0x01,0x4a,0x29,0xeb,0xd0,0xfe,0x00,0x27,0xf8,0x11,0x6d,0x18,0x5f,0x55,0x47,0x01,0xe3,0xf9,0x09,0xee,0xdd,0xdc,0x2a,0xbc,0xaf,0xd5,0xe1,0xbd,0x12,0xe8,0x0e,0xf7,0xec,0xf7,0xf3,0x20,0x1e,0xc1,0x19,0xfe,0xe3,0x1b,0xff,0xc1,0xdc,0xc3,0xf0,0xf7,0x0b,0x01,0x35,0x7f,0xeb,0x2c,0x3c,0x0c,0x0e,0x43,0xd6,0xf2,0xec,0xf1,0x10,0xc7,0xf1,0x13,0x5a,0x28,0x0b,0x0a,0xf8,0xe7,0x2f,0x02,0x00,0xf5,0x0c,0xeb,0x1b,0xf8,0x11,0xfc,0xfd,0x12,0x06,0x0c,0xdc,0xcf,0xbc,0xeb,0xde,0x41,0x0a,0xd7,0x2a,0xe4,0x1b,0x2d,0x00,0x0f,0x39,0xea,0xf0,0x02,0xe7,0xdc,0x1a,0x2b,0xf1,0xe1,0x3e,0x05,0x17,0x00,0x05,0xe5,0xef,0x32,0x47,0xe1,0x17,0x2e,0x08,0xe3,0x25,0x49,0xfb,0xff,0x04,0xf8,0x2b,0x1e,0x08,0x46,0x3e,0xeb,0x0b,0xeb,0x5b,0x1d,0x65,0x39,0xec,0x07,0xb4,0x15,0xf9,0xf5,0x22,0xfc,0xcd,0x79,0x02,0xed,0xf7,0x26,0xf3,0xce,0xc8,0x21,0x0e,0x1e,0xf1,0x0f,0x10,0x1c,0x1f,0xf0,0x11,0x2f,0xda,0xfc,0xfb,0xf8,0x13,0xd2,0xca,0xf2,0x4b,0xf0,0x07,0x31,0x7f,0x05,0x15,0xe2,0x1f,0x04,0x4f,0x1e,0x1b,0x07,0xd9,0x4c,0x48,0x3d,0xf9,0xfa,0x05,0xea,0xe6,0x14,0x2b,0xff,0xef,0x29,0x04,0xff,0xeb,0x0d,0x04,0xeb,0x16,0x09,0x06,0xd3,0xec,0xfd,0xdc,0x3b,0xd7,0x31,0x10,0x22,0x7f,0x3e,0xc5,0x24,0x10,0x14,0x49,0xfa,0xf0,0xcb,0xcc,0xcb,0x2a,0xe0,0x18,0x18,0xdc,0xf5,0xff,0xed,0xb0,0x50,0xf9,0x1a,0xb7,0xb4,0x18,0xd7,0x0a,0x35,0xfc,0x06,0xc7,0x0f,0x62,0xf6,0xdf,0x06,0xcc,0x23,0xbc,0x45,0x23,0x14,0x2a,0xe7,0x3e,0xe0,0x09,0xf3,0xf0,0x10,0x00,0xf3,0x33,0x3d,0x37,0x1d,0xba,0x1f,0xf8,0xf1,0x38,0x01,0xd3,0x9f,0x19,0xc8,0x1f,0xe0,0xc3,0x12,0xf6,0x20,0x57,0x24,0x18,0x01,0xf0,0x08,0xd0,0xed,0x40,0x0c,0xdd,0x17,0x39,0x2a,0xff,0x85,0xfa,0x22,0xf7,0x09,0xec,0x02,0x0f,0x16,0xb7,0xc0,0xc4,0xbd,0xf0,0xc4,0x07,0xc4,0xea,0x00,0x13,0xff,0xd2,0xf0,0xf4,0x0b,0xe3,0xf6,0xea,0x0f,0x36,0xc2,0xf9,0xa8,0xe1,0xee,0xd9,0x1e,0x0c,0xea,0xd0,0x1f,0xd6,0xf9,0x18,0x46,0xdb,0x22,0xf2,0xf5,0x06,0xda,0x39,0x41,0xfc,0x48,0xe8,0xf9,0xf7,0x48,0x27,0x1e,0x33,0x0e,0xd3,0xc5,0xd3,0x17,0x7f,0x05,0x01,0x2b,0x21,0xef,0xef,0x27,0xf3,0x12,0xfa,0x01,0x06,0x0b,0x26,0x08,0x25,0x12,0xf3,0xf2,0xc5,0x0e,0x07,0xd9,0x07,0x00,0x25,0xeb,0x1e,0x0c,0x18,0x1e,0x03,0xc6,0x29,0x20,0xfc,0x04,0xf0,0xfa,0xfe,0x07,0xf6,0x1a,0x18,0x51,0xf0,0x17,0xb8,0xfc,0x03,0x18,0xe6,0x0f,0x36,0xb9,0xef,0x1f,0x3e,0x34,0x01,0xe2,0x4e,0x0d,0xf4,0x21,0xfb,0x2c,0x0b,0x28,0x53,0xef,0xf7,0x7b,0x25,0xdb,0xc9,0xea,0xe1,0xf2,0x45,0x4a,0xe8,0x0a,0xdc,0x5b,0xb3,0xb8,0x9e,0xb0,0xe3,0xf9,0x5c,0xc4,0x05,0xf4,0xf5,0x09,0x0d,0x24,0xb0,0x42,0x25,0x22,0xca,0x3f,0xd7,0xfb,0x81,0x23,0xd2,0xea,0x26,0xf1,0xfc,0x1c,0x02,0x0e,0x4d,0x06,0xff,0xc8,0x78,0xb6,0xdf,0xb7,0x11,0xf3,0x15,0xf9,0xf9,0xe8,0xec,0x00,0x67,0xea,0xd8,0xc7,0xfe,0xb8,0x08,0xd5,0xed,0x5a,0xd7,0x30,0xe5,0x0c,0x14,0x5f,0xee,0x23,0x2b,0x32,0x6c,0xe8,0x11,0x30,0xc4,0x32,0xdb,0xfe,0xd9,0xd5,0x51,0xd9,0xda,0x1d,0x49,0xdc,0xe1,0x04,0xe1,0x24,0x16,0xbd,0xe6,0x1d,0xf0,0x34,0x20,0x0b,0xfa,0xf2,0xc7,0xcd,0xd2,0x36,0x3e,0xfa,0x58,0xf6,0xd0,0x00,0x0c,0xde,0x06,0x40,0x14,0x96,0x3b,0xe9,0x31,0xe5,0x34,0x0c,0xf8,0xf8,0x63,0x44,0x0d,0x1e,0x4c,0xf8,0x0d,0xfe,0xe2,0xe4,0x07,0x2f,0x09,0x41,0x16,0xd8,0x0d,0x01,0x36,0x17,0xe3,0x28,0xd7,0xf8,0x5b,0xde,0x33,0xf5,0x2e,0xea,0x17,0x07,0x0f,0x27,0xfe,0x31,0xe7,0xea,0x4a,0xfa,0xfa,0x32,0x0c,0x06,0xf4,0x22,0xfd,0x5e,0x3c,0x0f,0x12,0xfb,0x1c,0x23,0x03,0xdf,0xe7,0x1a,0x0f,0xfd,0xff,0xd9,0x20,0xdd,0x30,0x12,0xf7,0xcc,0xc8,0x34,0xfe,0x19,0xf6,0x33,0x0f,0x3d,0x09,0x50,0x53,0xcc,0x03,0x03,0xd2,0x10,0x32,0x00,0xeb,0x02,0xf4,0x25,0xd1,0xf3,0xf1,0x45,0xfe,0xf6,0x04,0xee,0x05,0xfb,0x0c,0xfb,0x3d,0xe8,0xd9,0xff,0x7f,0xdc,0xd9,0xe2,0x42,0x02,0x1a,0x17,0xe8,0xff,0x2e,0x01,0xfb,0x0e,0xfa,0xff,0xf4,0x29,0x2c,0x20,0xf1,0xd8,0xfe,0x05,0xf9,0xf6,0xcf,0x15,0x0f,0x0d,0xd3,0xdc,0x25,0x02,0xfa,0xa1,0xd1,0xb7,0xf6,0x04,0xe6,0x19,0x4d,0x10,0x1d,0xc7,0xe9,0x1d,0x03,0x18,0xf5,0x0a,0x09,0x09,0x02,0x12,0x03,0xc1,0xf6,0x1a,0xe0,0x1b,0x11,0xd4,0xc2,0xf9,0xf5,0x54,0xeb,0x52,0xeb,0x0e,0x19,0x1f,0x06,0xf6,0x19,0xf4,0xf9,0x1d,0x10,0x07,0x18,0xfa,0xe1,0x7f,0x0f,0xf3,0xf9,0x2f,0x10,0xd7,0xf9,0xe7,0x1c,0xed,0x0b,0xd2,0xce,0x24,0x11,0x50,0xf3,0x01,0x36,0xec,0x08,0xf2,0x13,0xc4,0xfb,0xdc,0x30,0xf4,0x0e,0x14,0xfa,0xe6,0x1f,0xf5,0xf4,0x0a,0xe6,0x29,0xea,0x1f,0x36,0xd2,0xd9,0x0a,0xfb,0xe8,0xfd,0x2a,0x20,0xed,0xe1,0x07,0x1b,0xf6,0xe9,0xfc,0x60,0x01,0x14,0xde,0x04,0xb5,0x13,0x00,0x1c,0x29,0x27,0xf9,0x2c,0x12,0x33,0xee,0x26,0xcb,0x18,0x01,0xe6,0xeb,0x27,0xc1,0x24,0x03,0xb9,0x12,0x0a,0xe4,0x3a,0x12,0x48,0xeb,0x22,0xef,0xd6,0xd1,0x0d,0xb7,0x05,0x72,0xfa,0xf4,0xf4,0x28,0xb3,0xce,0xdc,0xf1,0xb9,0x05,0x06,0xd5,0xfe,0xf2,0xaa,0x23,0xff,0x1e,0x18,0xf8,0x25,0xd3,0xf4,0x06,0xf1,0xff,0x17,0x0a,0xef,0xdc,0xef,0x11,0xf3,0xf0,0xae,0x11,0x47,0xf4,0xbc,0xf3,0xe2,0x0b,0xbd,0xbd,0x39,0xbb,0x2b,0x81,0xe6,0x04,0xaa,0xd1,0x1b,0xd2,0x1f,0x36,0xc0,0xd4,0xe0,0x32,0xf7,0xb3,0xba,0x17,0xa5,0x02,0xe9,0x36,0xf0,0xcf,0x2b,0xe3,0x13,0x05,0x30,0x20,0x14,0xe6,0x13,0x1d,0xda,0xfd,0x58,0x14,0x21,0x48,0xc8,0x13,0xe8,0xd4,0xcd,0x0a,0xf3,0xce,0xf2,0xde,0xff,0xe7,0x03,0x01,0x06,0xff,0x14,0xf2,0x1d,0xb2,0xc5,0x02,0xd3,0xf2,0x37,0xc9,0xf7,0xfa,0x36,0x3d,0xd5,0x0c,0xed,0xe0,0xdc,0x13,0x16,0xf1,0x0e,0xd5,0xd3,0x03,0x47,0x2e,0xc1,0x35,0xe4,0xd8,0x1b,0x04,0xce,0x1c,0x4e,0xcd,0xf3,0xf8,0xf5,0x19,0x3f,0xfa,0x00,0xda,0x1b,0xe9,0x36,0xfe,0x1e,0x17,0x30,0xf0,0x0c,0x3f,0x10,0x23,0xe1,0x01,0xbf,0xf3,0x15,0x1c,0x0e,0xf4,0xf2,0x51,0xfe,0xf0,0x46,0x2e,0x17,0xf6,0x23,0x05,0xf8,0xed,0xfe,0xd5,0xf5,0xd9,0xed,0xce,0x33,0x7f,0x03,0x0f,0xfd,0x2b,0x13,0x0c,0xff,0x1b,0xf9,0xf3,0x2d,0x01,0x32,0xfe,0xfe,0xee,0x06,0x1c,0x20,0x22,0xeb,0x24,0xcd,0x37,0x02,0x3d,0x1b,0x20,0x20,0xfa,0xb2,0xf0,0x32,0xb9,0xda,0xf3,0xdd,0xf3,0x19,0xe3,0x0f,0x17,0x17,0xe0,0xe6,0xd5,0x14,0x38,0x24,0xdf,0x05,0xce,0x28,0xc7,0xfa,0x39,0x57,0x34,0x08,0xbc,0x21,0xcd,0xf8,0x1d,0xee,0x21,0x1a,0x21,0x0d,0xea,0x3a,0xda,0x43,0xda,0xf2,0xe6,0xf8,0xd2,0xe1,0x1a,0xd6,0xf6,0xc4,0x21,0x3f,0xd9,0x1f,0x02,0x01,0xe5,0xf1,0x55,0x0f,0xd7,0x24,0x18,0x1c,0xff,0xed,0x0b,0xef,0xe2,0xc8,0x11,0xec,0xd3,0x1a,0x01,0x7f,0x64,0xee,0x29,0xde,0x33,0x2b,0xb1,0x06,0x18,0x21,0xf0,0x01,0x04,0x1c,0xc1,0x07,0x17,0x3f,0x17,0xce,0xe3,0xce,0xf9,0x26,0x06,0xdf,0x21,0xd4,0x0c,0xdd,0x08,0x05,0x2b,0xf9,0x15,0xd0,0xdb,0xde,0xc6,0x00,0xcb,0xd5,0x08,0x1d,0x09,0xc9,0x1f,0xdd,0x1c,0x57,0xc6,0xc9,0xe7,0x3b,0xe7,0xdb,0xf8,0x28,0xfd,0xdd,0xae,0xe6,0xf9,0x0b,0x37,0xe5,0x1a,0x06,0x00,0x04,0xd5,0x18,0xf4,0x1b,0xc7,0xd4,0x06,0xcc,0x14,0x1c,0x13,0xd3,0xc0,0xe4,0xc9,0x5e,0xfb,0xe6,0xbc,0xf2,0x13,0x15,0xf2,0x0f,0xfd,0x00,0xfe,0xc9,0xd7,0xf3,0x3f,0x24,0x2a,0xdb,0xdc,0xd7,0xd7,0x2f,0xf5,0xd8,0xfe,0x12,0x06,0xdb,0xf3,0x08,0x00,0xe0,0xd4,0xf2,0xf9,0xf6,0xbd,0xf9,0x0f,0x13,0xef,0xfb,0xfd,0x47,0x7f,0xdc,0xe6,0x3a,0x05,0xdc,0xe3,0xf1,0x0f,0xe9,0xdc,0x37,0x04,0xd2,0xe5,0x0b,0xe0,0xf9,0xc3,0x19,0xe9,0xe9,0x02,0xdc,0x01,0xd3,0xad,0xea,0xed,0xd8,0x2f,0x1b,0xfa,0x08,0x0b,0x0c,0xff,0xc3,0x0d,0xf2,0xe6,0x22,0x30,0x27,0x10,0x40,0x3e,0xed,0xe3,0xff,0x44,0x14,0x15,0x1d,0xff,0x5e,0xf6,0xf0,0x06,0x00,0x23,0xe7,0xe4,0xcc,0xf1,0xa5,0xd1,0xde,0x18,0x12,0x1f,0x0b,0xf9,0xbd,0xe5,0xfd,0xd3,0xba,0x29,0x01,0xc7,0x22,0x6d,0x39,0x3d,0x06,0xcc,0xd2,0xc6,0xe9,0xfd,0x0e,0xcf,0x08,0x0a,0x0e,0xe3,0xea,0xd3,0xdb,0x18,0xc9,0x3c,0xfc,0x08,0x38,0xf4,0x04,0x14,0xea,0x0d,0x12,0xfd,0x5a,0xed,0x44,0x7f,0x34,0x42,0xb8,0xd2,0xf4,0xc7,0x0d,0xc5,0x01,0x17,0xf4,0xec,0xc9,0x44,0xad,0x6f,0x39,0x1a,0xd6,0xfa,0xfa,0x17,0xd5,0x31,0xf9,0x1a,0xdf,0x25,0x2b,0xea,0xd1,0x08,0xe8,0x13,0xd8,0xef,0x6d,0xcd,0x40,0xd6,0x51,0xe3,0x55,0x19,0x21,0xde,0x1d,0x57,0x21,0x34,0xd8,0x3f,0x46,0x44,0x97,0x1f,0xe7,0x09,0x19,0x35,0x17,0x1d,0x3c,0x5b,0x23,0xbb,0x60,0x13,0xc6,0xeb,0x6b,0x1d,0xe2,0x7f,0x4b,0xd8,0xd2,0xeb,0x1e,0xd1,0x39,0x10,0x27,0x42,0xfa,0x1f,0xdd,0xf1,0xf1,0xd5,0xcf,0x32,0xe2,0xf0,0x31,0xfd,0x3d,0xb8,0x0f,0x32,0x5e,0x2e,0x2e,0x75,0x40,0x08,0x1c,0x48,0x50,0xe2,0xf1,0xe2,0xc2,0x25,0xf5,0x21,0x68,0xfa,0xd3,0x17,0xeb,0xdb,0x0a,0x0a,0x0c,0x27,0xed,0x0e,0xd6,0x40,0x3c,0x39,0x0d,0xb2,0xed,0x18,0xd9,0xf6,0x06,0x4b,0x2b,0xcc,0x05,0xdd,0xd0,0x35,0x23,0x02,0x4f,0x4e,0x05,0xdd,0xe8,0x18,0xf5,0x03,0x07,0xdb,0xe9,0xe8,0x46,0x24,0x27,0x1d,0xfb,0xbe,0xff,0xfb,0xab,0x55,0xd1,0x40,0x06,0xf7,0x09,0x32,0xf0,0x08,0xe6,0xeb,0x53,0xe6,0xf0,0x67,0x0f,0x05,0x11,0xd6,0xe1,0xbf,0xd4,0x24,0xe9,0x25,0xfe,0xed,0xce,0x00,0x16,0x21,0xf8,0x10,0x71,0xcb,0xeb,0xdc,0xf1,0xef,0xfd,0x06,0xe2,0x24,0xd4,0xe9,0xf4,0x23,0x10,0xff,0xf8,0x28,0xf5,0xee,0xf0,0xe2,0xe6,0xe1,0xab,0xcf,0x39,0x2a,0xad,0xe2,0xd9,0xbf,0xf4,0x62,0xa9,0xcf,0x2a,0x24,0x1c,0x0d,0xd7,0x1a,0xd0,0xa2,0xfb,0x14,0x08,0xe0,0xda,0xd7,0xf4,0xd6,0xec,0x16,0xf1,0xf7,0xcd,0x2e,0xf4,0x81,0xd3,0x31,0x89,0x9d,0xae,0x04,0xe6,0x5e,0x17,0xd3,0xf0,0xd2,0x2e,0x19,0x06,0x0e,0xf1,0x13,0x14,0xf4,0xda,0xc4,0xf6,0xa9,0xba,0x3b,0xdf,0xf3,0xbb,0x11,0xee,0xf4,0x20,0xef,0x04,0x1a,0x02,0x06,0x32,0x06,0x0e,0x12,0xba,0x14,0x14,0x39,0xf2,0xcc,0x05,0xf3,0x03,0xd6,0xfc,0x03,0xf2,0x36,0xee,0xfe,0x2f,0x42,0xe1,0x35,0xc8,0x10,0xed,0xe6,0x1b,0xf0,0xcc,0x05,0x77,0xf8,0x13,0x0e,0xc3,0xcc,0x19,0x6c,0x7f,0xd9,0xdd,0xdc,0xf9,0xc8,0xf0,0x08,0xce,0xd1,0x4f,0xee,0x4c,0xf7,0x22,0x22,0xfb,0x0d,0x5d,0xcb,0xfc,0x16,0xf7,0xef,0xfd,0xe4,0xf6,0xe2,0x27,0x9d,0xe0,0xc4,0xec,0xf9,0xe7,0xef,0xf8,0xf2,0x21,0x10,0xf9,0x02,0x34,0x15,0x33,0xe2,0xe9,0xf5,0xa7,0x61,0x27,0xcd,0x16,0x0a,0xcf,0xed,0xb9,0xf0,0xed,0x05,0xf0,0xb1,0xf5,0xb4,0x00,0x1e,0xe9,0xa4,0xd5,0x2c,0x0d,0x3d,0xd3,0xc5,0xd5,0x0f,0xd1,0xea,0xc0,0x01,0xea,0xbb,0xf3,0xee,0xd7,0x0c,0x0e,0xf1,0xa8,0x05,0x17,0xe9,0x17,0xfa,0xfb,0xfb,0x1d,0xdd,0xc3,0x0f,0x02,0xe8,0x1a,0x0c,0xdf,0x48,0x4c,0x41,0xca,0x27,0x12,0xd2,0x93,0xf6,0xd5,0xd7,0xf0,0x4c,0x51,0xeb,0xf3,0x56,0x1b,0xa9,0x39,0x03,0x04,0x7f,0xd8,0x26,0x0e,0x23,0xdc,0x06,0xeb,0xce,0xb8,0x2f,0xe3,0xec,0x37,0x07,0x26,0x23,0x4f,0x32,0x09,0xd4,0x2f,0xff,0xa4,0x7d,0x19,0x32,0x67,0x07,0xe3,0x00,0xab,0xde,0xc9,0xf3,0xe5,0x0f,0xee,0xbe,0x29,0xf1,0xd8,0x1b,0xcb,0x12,0xe2,0xf8,0xe2,0xe8,0x20,0x26,0xda,0x63,0x0c,0xd6,0x28,0xff,0xc1,0x49,0x5f,0x20,0xde,0xed,0xf7,0xee,0x02,0x3c,0x10,0x22,0x06,0x1a,0xe4,0xe9,0x0d,0xf6,0xe8,0xff,0xef,0xe7,0x00,0x2b,0xf3,0x33,0xfb,0x16,0xd8,0x52,0xfe,0x2e,0x07,0x01,0x25,0x06,0x20,0x35,0x25,0x02,0x2e,0x0f,0xfe,0x2f,0xdb,0x45,0x0e,0x43,0x2e,0xe5,0x02,0xe5,0x01,0x1f,0xe7,0x18,0xf4,0x22,0x06,0x1d,0x18,0xf7,0x2d,0xe3,0xbb,0xc9,0x12,0xce,0x10,0x1e,0x67,0xf2,0x9d,0xfa,0x09,0xd3,0xca,0x38,0x56,0xed,0x3f,0x0e,0xb3,0x71,0x34,0xe0,0xbb,0xde,0xd8,0xad,0x20,0x3b,0x23,0x2a,0x01,0xdd,0xc4,0xcd,0xec,0xec,0x01,0x37,0xfe,0x06,0xb6,0xbe,0x3e,0xd9,0xfb,0x09,0xc9,0x58,0x2e,0xf2,0x29,0x7c,0x3d,0xe1,0xa0,0x26,0xdc,0xf5,0x34,0xa1,0x1f,0x19,0xb1,0xe0,0x1f,0x7c,0xfa,0xde,0xf2,0x0d,0x10,0xdb,0x30,0xf5,0x0e,0x9d,0xdf,0xfd,0xed,0x52,0x20,0x06,0x0a,0xe3,0xc9,0x24,0xe9,0x0d,0x52,0xe1,0xdf,0x37,0x48,0xb3,0xa4,0x23,0xac,0x37,0x09,0xd4,0x24,0xfa,0x28,0x7f,0xcb,0x0e,0x17,0x29,0x0c,0xc4,0xcf,0xfa,0xdb,0xb5,0xe9,0xb8,0x0e,0x15,0xb1,0xfd,0xe1,0xd8,0x0b,0xf3,0x20,0xe9,0xff,0xcc,0x1f,0xc4,0xde,0x08,0x22,0x38,0xe0,0x00,0xf4,0x1a,0x36,0xaa,0x34,0x1d,0x29,0xcf,0x2f,0xea,0x05,0x30,0x4e,0x03,0xdf,0x07,0xc9,0xba,0x52,0xf3,0x39,0x1f,0xfa,0xc2,0x47,0xba,0xc5,0xef,0xf9,0xf9,0x2c,0xfd,0xf4,0xf9,0xe2,0x24,0xf8,0x15,0x10,0xf5,0x4d,0xf5,0x08,0x3c,0xe9,0xf9,0xc2,0x0f,0xba,0x3f,0xe3,0x81,0x37,0xf5,0x21,0xb9,0x3d,0x10,0x0a,0xb9,0x08,0x11,0xf8,0x15,0x12,0x4b,0x27,0xe1,0xe4,0xdd,0xe1,0x30,0xd9,0x76,0xfd,0xf2,0x0f,0x09,0xf5,0xef,0x27,0xfc,0x90,0x0a,0xf5,0x12,0xd0,0x39,0xf4,0x0b,0xfa,0x11,0x06,0xfa,0x0b,0x51,0x38,0xe3,0x36,0xdd,0x9c,0xe8,0xff,0x22,0x28,0xaf,0x26,0x11,0xd0,0xc6,0xf1,0x0d,0xeb,0x25,0xce,0xac,0x33,0x0b,0xd3,0x0f,0xc0,0xd8,0xe5,0x47,0xcd,0xb4,0x59,0xa6,0x5b,0xff,0xdb,0xf8,0xed,0xb7,0x24,0x37,0x07,0x96,0xee,0x7f,0xb8,0xe6,0x1e,0xa0,0xc6,0x3f,0xc2,0x48,0x8c,0x33,0x23,0xe3,0xea,0xc5,0xf1,0xf0,0x28,0x07,0x3b,0x2c,0xbc,0x10,0xc3,0x3a,0xf5,0xdf,0x35,0x17,0x92,0x58,0xc3,0xf7,0x50,0xdf,0xc0,0xaf,0x02,0xfd,0x1b,0xed,0x05,0x3c,0xf3,0x08,0x19,0x67,0xd3,0xe9,0x39,0xbf,0xc1,0xc2,0x24,0xe1,0xbc,0xb0,0x17,0xd6,0xe1,0x3d,0x26,0xc6,0x34,0x23,0xcd,0xf5,0xfd,0x0c,0x0f,0x33,0x03,0x09,0xeb,0xb3,0x08,0x12,0xfc,0xfa,0x00,0xe9,0x39,0xc3,0xf3,0xf3,0xfe,0xb7,0x19,0x25,0x17,0xee,0xe4,0xe9,0xdd,0xd4,0xd0,0xd4,0x1c,0xd8,0x22,0x36,0x1e,0x1e,0x7f,0x2e,0x18,0x29,0x2e,0x14,0x41,0xed,0xed,0x3c,0x01,0xd1,0x1b,0x14,0xc5,0x30,0xdb,0xf9,0x22,0xc5,0x14,0x10,0x0f,0x31,0x03,0x3e,0xca,0xe3,0xff,0x1e,0xf7,0xe7,0x2d,0x33,0x24,0x17,0xe6,0x11,0x0f,0xd4,0xd1,0x21,0x0c,0x18,0xfa,0x1a,0x52,0x24,0x18,0x49,0xf6,0x1e,0xf4,0xe7,0x18,0x25,0x38,0xf7,0xf2,0xdd,0x44,0x46,0x62,0x51,0xd5,0x3d,0x12,0x14,0x19,0x1e,0x5a,0x03,0xe5,0x18,0x03,0x11,0x11,0x17,0xe8,0xfa,0x1c,0x3a,0xfc,0x05,0x2a,0xf5,0x06,0xf4,0xd2,0x28,0x1f,0xe8,0xd3,0x16,0x21,0x32,0xfa,0x07,0x54,0xfc,0x00,0xe4,0x53,0x17,0xf1,0xf3,0xf6,0x25,0x17,0x25,0x4c,0xfa,0x1a,0x07,0x0e,0xca,0xe1,0xea,0x08,0xde,0xc8,0xdf,0xc9,0x13,0x0a,0x26,0x02,0x23,0xf9,0x1c,0xff,0xcb,0xa1,0xfc,0x29,0xdd,0x06,0xcf,0x49,0x23,0x5e,0x29,0xfd,0x7a,0xf3,0x03,0x0f,0x1f,0xe1,0xe7,0xb5,0x26,0x31,0xc4,0x2f,0x97,0xbf,0x20,0x1d,0x18,0x23,0xf7,0x09,0x15,0x11,0x81,0x2f,0x3e,0x66,0xf4,0xe9,0xc3,0xfb,0xe9,0x49,0xcb,0xce,0x0a,0xf9,0xa4,0xf3,0xc8,0x44,0x14,0xec,0x21,0x06,0xff,0xa9,0xea,0x16,0xfb,0xd0,0x17,0x14,0xc8,0x36,0x1b,0xbd,0xe3,0x2e,0xe7,0xf4,0x0c,0x2b,0x05,0xa9,0xcf,0x45,0xf0,0x9e,0x13,0x19,0x60,0xbc,0xea,0x1a,0x5a,0xd9,0x41,0x72,0x31,0x02,0x67,0xfd,0x1e,0xdf,0x15,0x2c,0x41,0x0f,0x08,0x14,0x10,0xdb,0xfc,0xda,0x50,0x0f,0x19,0x02,0x08,0xf9,0x31,0x04,0xce,0xb8,0x23,0xc6,0x08,0x07,0x26,0xfd,0xee,0x05,0xf9,0xd2,0xeb,0x1e,0xbd,0x01,0xe4,0xa2,0xcd,0xd4,0xd3,0xe8,0x70,0xec,0x0e,0x06,0xd8,0xd5,0xcb,0x02,0x1f,0xc8,0xfc,0xc1,0x16,0x0e,0x18,0x2e,0x05,0xf2,0xf4,0xec,0xfe,0x3a,0xfb,0x02,0x0b,0xfa,0x36,0x92,0x01,0x20,0xef,0xed,0xec,0x23,0x3b,0x11,0x1f,0xd3,0xfa,0x11,0xa6,0xe2,0x9b,0xda,0x28,0xf0,0x08,0xa9,0x73,0xf4,0xd7,0xd3,0xbf,0xe6,0xef,0x33,0xad,0xc9,0x1f,0x25,0x19,0x3f,0x0d,0x25,0xe2,0xee,0x13,0xf8,0x2f,0xbf,0x04,0x09,0x7f,0xf1,0x2a,0xfa,0xd2,0x2a,0x20,0x04,0x47,0xfe,0x10,0x09,0xae,0x17,0x41,0xd6,0x46,0x2f,0xea,0x16,0x34,0x12,0xea,0x0d,0x4c,0x27,0xf6,0x05,0x87,0x2b,0x01,0x10,0xe8,0x1a,0xdc,0x0d,0xf8,0x03,0xee,0x26,0x44,0x18,0xce,0x14,0xf1,0x35,0x1c,0x11,0xe8,0x31,0xfa,0xdc,0x03,0x05,0x33,0x01,0xd0,0x03,0x21,0xc7,0x26,0x2f,0x1a,0x0e,0x23,0x2b,0xee,0x39,0x1c,0xe9,0xda,0x55,0x10,0x01,0x09,0x13,0x09,0xf6,0x25,0x08,0x0e,0x27,0x19,0xbd,0x06,0x12,0x30,0xee,0xe7,0x38,0x05,0x27,0x20,0x0f,0x41,0xd1,0x08,0x33,0x51,0x51,0x17,0x0f,0x2b,0x3f,0x0b,0xcb,0x01,0xeb,0x28,0x1c,0xde,0xf7,0x4b,0x14,0x01,0x10,0x45,0x0e,0xe6,0x0f,0x00,0xf1,0xf3,0xff,0x13,0x16,0x06,0x29,0xc4,0xdf,0x4d,0x5f,0xe7,0x0e,0xf9,0xff,0xeb,0x19,0x27,0x59,0xe6,0x0c,0x04,0x7f,0x13,0xe0,0x09,0x28,0x23,0x61,0xf6,0xe7,0x16,0xc8,0x36,0x19,0x43,0x02,0xfe,0xb9,0xe2,0x05,0xe8,0xf5,0x26,0x05,0xcd,0x31,0x28,0xfc,0x21,0x18,0xfc,0xd1,0x23,0xe7,0x14,0xc8,0x25,0xea,0xd3,0xf6,0xee,0x24,0x1f,0x0d,0xe8,0xb8,0x01,0x30,0xe1,0xe6,0x0c,0x0a,0x03,0x3d,0x3d,0x15,0x3d,0xf9,0x19,0xff,0xc4,0xf2,0x13,0xea,0xe6,0x3a,0xf9,0x29,0xdb,0x5a,0xe6,0xdc,0x18,0xff,0xe2,0x44,0x15,0x1d,0xf6,0xf6,0x24,0xcf,0xf1,0x08,0xe0,0x54,0x0d,0x1b,0x3a,0xf9,0x04,0xd5,0x35,0xfd,0x3a,0x5b,0xd4,0xf7,0x51,0xe4,0xd8,0x1c,0xf6,0x11,0xdf,0xd9,0x07,0xd1,0xfe,0xff,0x04,0xff,0xfd,0x02,0xff,0x0f,0x7f,0xe9,0xe6,0x1b,0x0c,0x0b,0x35,0xf9,0x12,0x66,0xe8,0x2e,0xe8,0x6a,0x15,0x09,0xfb,0xfc,0xd7,0xec,0xf3,0x05,0x0b,0xfb,0x4a,0x0c,0x32,0xe7,0x10,0xe7,0x01,0xe3,0xca,0x0c,0xd6,0xf1,0xed,0x37,0x13,0xea,0xff,0x01,0xbd,0x1b,0x00,0x15,0xf3,0xf4,0xee,0xff,0x17,0xf7,0x34,0x01,0xff,0x2a,0x0c,0x1f,0x10,0xe0,0xfc,0x16,0xfe,0x06,0xee,0x08,0xe2,0xcd,0x06,0xf2,0xf6,0xe4,0xea,0xeb,0xd6,0xbe,0x1f,0x16,0xe4,0xf0,0xce,0xfd,0x05,0x0b,0x0c,0x03,0xf3,0x03,0x18,0x06,0xf6,0xe2,0x1e,0x00,0x07,0xe5,0x13,0xf7,0xea,0x18,0xf8,0x27,0xcf,0xd3,0xda,0xe4,0x0b,0x20,0xd4,0x03,0x33,0xf5,0x18,0x16,0x7f,0xe2,0xf9,0x18,0xcb,0x2e,0xe4,0x05,0xed,0x19,0xf7,0x15,0x14,0xea,0x34,0xe8,0x19,0xf6,0x09,0x0a,0xfb,0xbd,0xfe,0xeb,0x01,0x03,0x44,0x1a,0x11,0xc7,0xb3,0xf6,0x19,0x35,0xf7,0x07,0xeb,0x20,0x1f,0x12,0xf4,0xf7,0xdf,0x12,0xff,0xda,0x2d,0xfb,0xc2,0xbc,0x2d,0x07,0x33,0xdd,0xfa,0xf8,0x33,0xef,0x10,0x2b,0xe4,0x1b,0xc5,0x65,0xb2,0x4a,0x06,0x0f,0xb7,0x6a,0x56,0x55,0xe2,0xf7,0xbd,0x16,0xdd,0x10,0xf2,0xd3,0xe9,0x55,0x53,0x03,0x7f,0xc0,0xe1,0xf6,0xf8,0x22,0x13,0x06,0x4d,0xdc,0x1a,0xe9,0xfa,0x37,0xf0,0xaa,0xc3,0xe9,0x08,0xd3,0x27,0xcc,0x06,0x1e,0xd9,0xef,0xf3,0x15,0xdc,0x18,0x27,0x32,0xdd,0x03,0xfb,0xed,0x0e,0x19,0xc3,0xd6,0xed,0xca,0xf7,0xb1,0x08,0xf2,0x04,0xf8,0xd4,0x1b,0xe4,0x15,0x5b,0xd0,0xab,0xd1,0x41,0xe4,0x12,0xcb,0xc9,0x0d,0xf4,0xf6,0xc2,0x0f,0xcc,0xdd,0x9e,0x02,0x2b,0xdd,0x1d,0xf6,0xf8,0xec,0xcb,0xea,0xef,0xf3,0x0d,0x2b,0x1b,0x0f,0xfe,0xfd,0xe9,0x55,0x32,0x49,0xca,0x04,0x29,0xe9,0x3f,0xca,0x09,0x59,0x05,0xd7,0xf5,0x14,0xe0,0xfd,0x7f,0x02,0xd6,0x08,0xf0,0xd8,0xfc,0xae,0xea,0xce,0xeb,0x04,0xfa,0x55,0xe0,0x19,0x0b,0xd3,0xc7,0xaf,0x0a,0xf3,0xcc,0xff,0x2e,0x0d,0x16,0x10,0x00,0xe0,0xb5,0xe4,0xae,0xba,0x20,0x02,0xe6,0x19,0xd9,0xfd,0xd6,0xf8,0x02,0x32,0xeb,0xfa,0xc4,0xe4,0xaf,0x17,0xcd,0xfe,0x02,0x1d,0x11,0xd8,0x53,0x28,0x6a,0x44,0x10,0xfa,0xde,0xee,0xef,0x2d,0x30,0xc8,0xa9,0x49,0xdc,0x14,0xf9,0xee,0xff,0xf1,0x3e,0xf5,0xec,0x51,0xf6,0xea,0xde,0xc4,0x28,0xb0,0x33,0x2e,0x4a,0xf3,0x08,0x01,0x36,0x10,0x42,0x01,0x09,0xf7,0xfd,0x73,0xbb,0x33,0xd0,0xbf,0x0e,0x30,0x08,0xf5,0xf6,0x64,0xd4,0x1d,0xc0,0x3b,0x13,0xbb,0x1b,0xe7,0x70,0xec,0x36,0x20,0xb3,0xc1,0x50,0x09,0xb9,0xf9,0x4f,0x72,0x62,0x76,0x1c,0x09,0x22,0x3c,0xf1,0x11,0xb4,0x26,0xe5,0x26,0xff,0xbd,0x09,0xb1,0x06,0xe8,0x31,0x43,0xed,0xf4,0x33,0xae,0xc8,0x40,0x46,0xde,0xa9,0x1e,0x07,0xc2,0x7e,0xe0,0x33,0x5b,0xa9,0xee,0xd7,0xd5,0x12,0xa8,0xb4,0x96,0xbb,0xd7,0xff,0x2d,0xbe,0xae,0xd4,0x82,0xdd,0x14,0xf7,0xd8,0x50,0x00,0x35,0x27,0xbc,0xd6,0xef,0x0f,0x04,0x97,0x1d,0x13,0x09,0xfd,0xf8,0xc4,0xd6,0xee,0x09,0xbc,0x12,0x19,0x16,0xdf,0x9a,0xcd,0x01,0xfc,0x0c,0x9f,0x34,0xbe,0x5a,0xa0,0x1b,0x2a,0xfd,0xd3,0x2b,0x3b,0xb3,0x7f,0x05,0xc6,0xec,0x33,0x00,0xb2,0xf9,0xe6,0x38,0xf9,0xcd,0xe7,0x6c,0x74,0xd7,0xcc,0x76,0x27,0x19,0x0a,0x0f,0x54,0x1f,0xc4,0xb4,0x09,0xbf,0xd0,0x5b,0x54,0x07,0x1a,0x11,0xd9,0x15,0x23,0x17,0xc2,0x1f,0x20,0xdd,0xf3,0xe5,0xdb,0xf2,0xbf,0x06,0xdc,0xbe,0xe4,0xe8,0x3a,0xab,0xbd,0xf4,0x67,0x1b,0x4a,0xc7,0x17,0xd9,0xc2,0x4d,0xa9,0xd6,0xd8,0x03,0xfb,0xf0,0xdf,0xea,0x1e,0xb6,0xdd,0xd3,0xd0,0xa6,0x00,0xca,0x12,0xfe,0x13,0xf8,0x0b,0x17,0xf1,0x31,0xe1,0x46,0xe7,0x09,0xc4,0xec,0xc1,0xc9,0x4a,0xf0,0x0e,0x31,0xcf,0xe1,0x45,0xc0,0x37,0x53,0x1d,0xc5,0x0e,0x32,0xe6,0xff,0x1e,0x81,0x02,0x34,0xba,0xff,0xf9,0x1c,0x30,0xb2,0x40,0x59,0x0c,0x09,0x26,0xa5,0xee,0x0f,0xfc,0x13,0xb5,0x12,0xfb,0x2a,0xdd,0xf7,0x42,0xe4,0xe3,0xd0,0xe8,0xda,0xd3,0xda,0x08,0xe5,0xbf,0x3a,0xdf,0xc2,0x06,0xe7,0xc6,0x2f,0x00,0xe8,0xef,0xec,0xd7,0xf0,0xae,0x4e,0xdd,0x0d,0xe2,0xb2,0xc2,0xdf,0x5c,0x16,0xc0,0x59,0xfc,0xbe,0xdc,0x16,0x64,0xf1,0xef,0x1c,0xf6,0x08,0xc6,0x16,0x7f,0xe4,0x5b,0x0b,0xf9,0xf0,0xeb,0xd5,0xf6,0x2d,0x05,0x19,0xf1,0x10,0xb3,0xe9,0xd2,0xed,0xfd,0x20,0x07,0xe5,0x38,0xf3,0x0b,0x64,0xbf,0xf5,0xf8,0xc5,0x08,0x25,0xeb,0xfb,0x6a,0xc9,0xbb,0xe9,0x30,0xeb,0x39,0xc3,0xff,0x13,0xe8,0x11,0xe5,0x39,0xc1,0x64,0xc9,0x0d,0x32,0x07,0xd1,0xdd,0x00,0x39,0xf0,0x00,0x1f,0x13,0x27,0xe3,0x02,0x4a,0xbe,0x12,0xfc,0xfd,0x15,0xf1,0xe1,0x11,0x26,0x3c,0xe1,0x10,0x4b,0x6a,0xf0,0xc8,0xe8,0x47,0xfa,0x31,0x1c,0xcd,0xd5,0xce,0x59,0xe5,0xf3,0xd5,0x35,0xcf,0xd9,0xe4,0xfd,0xc1,0xd2,0xbf,0x4e,0xe9,0x0f,0xe5,0xcc,0x10,0xe2,0xab,0x17,0xd9,0xfa,0xd4,0x4d,0x19,0x04,0x02,0x03,0xad,0xf5,0x3b,0xd8,0xed,0x4c,0xc4,0xe5,0xd7,0x0b,0xec,0xeb,0x28,0x4b,0xed,0xcf,0x45,0xca,0xc3,0x04,0x1e,0x39,0x25,0xc0,0x39,0xfb,0x21,0x20,0x05,0x1e,0x35,0xfd,0xcc,0x2f,0xdd,0x15,0x44,0xfb,0xf5,0xe5,0xbe,0x0f,0xe1,0x23,0x19,0xdd,0x11,0x20,0xd9,0xe3,0x08,0xfb,0x0f,0x07,0x2a,0x15,0xf2,0x13,0xbd,0x2b,0xf3,0x19,0xf5,0x81,0xe5,0x16,0xd1,0x3d,0xbf,0x09,0x1c,0x16,0xfe,0xd6,0xd8,0x3f,0x2c,0xff,0x16,0xf8,0xfa,0x5a,0xe0,0x05,0xb9,0x00,0xcb,0xb1,0xf1,0x1e,0xcf,0x3b,0xf7,0xb9,0xe6,0xfb,0x0c,0xef,0x24,0x19,0xd3,0xd8,0xbf,0x36,0x5b,0x04,0xf6,0xc8,0xdf,0x19,0x06,0xd5,0x1c,0x08,0x0d,0xe7,0xdd,0xea,0xbf,0xec,0xea,0x70,0xe3,0xcd,0xba,0x26,0xe5,0x08,0x7f,0xd1,0x0d,0x09,0x12,0x0a,0xc1,0xed,0xf8,0xfd,0xf5,0x33,0x01,0x0f,0xde,0xcc,0xf6,0xb5,0x2c,0xea,0xfa,0xe3,0x07,0x0e,0x4e,0x28,0x04,0xd2,0xda,0xfe,0xdf,0x21,0xdd,0xe7,0x4a,0x00,0xcb,0x99,0x10,0x28,0xed,0x0e,0xee,0xef,0x0a,0xeb,0xd9,0x50,0xf8,0xcb,0x3f,0x01,0xfe,0x0c,0xd6,0x00,0x16,0x30,0x0b,0xeb,0xf3,0x20,0x12,0x07,0x50,0x1e,0x05,0xc0,0x20,0xdf,0xdb,0x23,0xce,0xe5,0xeb,0x25,0xdf,0xe9,0xe9,0xcc,0xf3,0x2e,0x1d,0xf1,0x1b,0x04,0x4a,0x41,0x73,0xa9,0x65,0x01,0x2d,0xbb,0xee,0x0f,0xd4,0xb7,0x4c,0xb2,0x34,0xeb,0x05,0xa4,0xc1,0x10,0xd3,0xe2,0x9e,0x90,0x27,0x29,0xf9,0xc5,0x2b,0xee,0xc2,0xe6,0xff,0xe6,0x35,0xfe,0xcf,0x3a,0xe0,0xea,0x37,0xd9,0x06,0xf4,0xbe,0x42,0x42,0xe0,0xe4,0xe7,0x3f,0x35,0x4c,0x0c,0xe4,0xb3,0xaf,0x1f,0xbc,0xcb,0x4d,0x05,0x10,0xf9,0xf4,0x7f,0x1b,0x0e,0x26,0xef,0x16,0x02,0xfb,0x2a,0x12,0x48,0x1d,0x07,0xde,0x95,0xda,0x37,0x3f,0xdd,0x1f,0x2a,0x0e,0xfe,0xd9,0xf6,0xd3,0x00,0x13,0xf2,0xd6,0x43,0x0a,0x0c,0xbf,0xcf,0x3f,0xf5,0xe6,0xfb,0xec,0x01,0xf5,0xd2,0x18,0x1c,0x44,0xcf,0xfd,0x31,0xcc,0x3f,0x12,0x10,0x1e,0x04,0xa2,0x4f,0xcd,0x12,0x10,0xb6,0xc8,0x40,0x1b,0x25,0x17,0xb9,0xff,0xdd,0x0c,0xfc,0xe1,0x1b,0x0f,0xd7,0xd7,0x3b,0xfe,0x02,0xbc,0xda,0xdf,0xaf,0xd7,0xd8,0xe8,0x44,0xd1,0x7b,0xee,0x27,0xca,0xd1,0x10,0xce,0x8f,0x3f,0xcc,0x36,0x0f,0x23,0xf1,0xff,0x0e,0xd3,0xc3,0x1f,0xfe,0x35,0x09,0x64,0xbd,0xf9,0x0c,0x49,0xcc,0x0e,0x26,0x07,0x1e,0xd8,0x10,0xd8,0xef,0x2f,0xda,0x40,0x02,0xa9,0xf9,0xd2,0xf7,0xf8,0xf5,0x1c,0x4f,0x0b,0x0e,0x2b,0x26,0xf3,0x78,0x4b,0x35,0x2d,0xf7,0x3b,0xe1,0x48,0x8c,0x00,0x12,0x01,0x81,0xf9,0xe9,0x2e,0x2d,0xe5,0x40,0x15,0x55,0x12,0xe0,0x17,0x0b,0x28,0xd3,0xab,0xf7,0x04,0xaf,0x67,0x02,0x69,0xef,0x25,0x10,0xfa,0xec,0xcb,0x2a,0x03,0x1b,0xef,0xe7,0x0d,0x04,0x55,0xfc,0x2b,0x20,0xbc,0xaa,0x2e,0xde,0xd5,0x59,0x1e,0x19,0xd8,0x04,0xdd,0xeb,0x54,0x01,0x04,0x4a,0x1c,0xe1,0x15,0x27,0x35,0xdd,0xc1,0xe3,0x2e,0x04,0x2d,0x0e,0xd2,0xfa,0xd0,0x38,0xf0,0xd7,0xaf,0x4c,0xf5,0x08,0x14,0x03,0x2a,0xcf,0x07,0x1a,0x08,0xf9,0xc1,0x13,0xb4,0xde,0x27,0x7f,0xc9,0x34,0x37,0x24,0xe6,0x3c,0xd8,0xaf,0x06,0x0c,0x19,0xbe,0x2a,0xf4,0xbe,0x54,0x17,0xdf,0xfe,0x33,0xda,0x53,0x0e,0x4b,0xe8,0xf0,0xaf,0x1a,0x0b,0x00,0xc8,0xcd,0x56,0x10,0xe6,0x51,0x1b,0x4c,0xe8,0xd6,0x14,0xd8,0x31,0x18,0xd0,0x07,0xde,0xe5,0xea,0x11,0xdb,0xe3,0x5d,0x26,0x5f,0x09,0xc5,0x28,0x31,0x15,0x0e,0x59,0x09,0xf6,0x5a,0xee,0xab,0x26,0x29,0x3b,0x31,0xd7,0x21,0xea,0x1c,0x52,0xe5,0x25,0x18,0xc1,0xe0,0xf0,0x18,0x30,0xf8,0xdb,0xd2,0x34,0x08,0x29,0xff,0xe0,0xec,0x0c,0x44,0xf3,0xde,0xec,0x16,0xbd,0x06,0xf3,0x0f,0x04,0xe4,0x15,0x28,0xf2,0xea,0x3a,0xb9,0x16,0xf7,0x49,0x10,0x01,0xca,0x44,0x14,0xe9,0x2e,0x17,0xea,0x37,0xdb,0x05,0x30,0x06,0x7f,0xfe,0xff,0x24,0xfb,0xeb,0x2c,0x2a,0xe5,0x20,0xf9,0xf4,0xe9,0x09,0xf4,0xdc,0xe0,0x36,0xed,0xef,0xfe,0x08,0xfb,0x58,0xe5,0xee,0x11,0xb6,0x17,0x49,0xfa,0xfd,0x27,0xc5,0x01,0xdb,0xa4,0xef,0x1a,0xe5,0x21,0x39,0x0b,0xf9,0xf1,0x2e,0xf6,0x10,0x2e,0x08,0xf9,0x22,0xd7,0xc4,0x16,0x0f,0xfb,0xf7,0x2c,0x0c,0x09,0xdc,0xdf,0xff,0xe9,0xe2,0xf9,0x09,0x13,0x10,0xc9,0xe5,0x25,0x0a,0xd0,0x26,0xfd,0xff,0xee,0xef,0x0d,0x29,0x10,0xec,0x0d,0xc8,0xfb,0x09,0xed,0xfe,0xe6,0xfc,0x20,0xf4,0xfb,0x09,0xce,0x08,0xf9,0xdc,0xe7,0x6b,0xe1,0xf0,0x02,0x03,0xa8,0x25,0x22,0x13,0x63,0x1f,0x65,0xf3,0xf6,0xff,0x15,0x08,0xdb,0x09,0xed,0x78,0xf4,0x03,0x11,0x12,0xec,0xfe,0xea,0xe8,0xe6,0x09,0x7f,0x39,0xfc,0x00,0x0c,0xf0,0x0f,0x20,0xff,0x05,0x09,0xe4,0x08,0xf2,0x0b,0x02,0xde,0x1a,0x32,0xf3,0x10,0x0f,0xde,0xdb,0xd7,0xf3,0x2a,0xf4,0x29,0x34,0x1d,0xe2,0x2c,0xd4,0xf5,0x14,0x09,0x0f,0x35,0x00,0xba,0x04,0x0c,0x0d,0xe0,0x41,0x01,0xe0,0x55,0x58,0x1d,0xf3,0x4f,0xfb,0xdc,0xfc,0xf5,0x41,0x0f,0x0f,0x2e,0xeb,0x2a,0xff,0x22,0xb9,0xe3,0xe8,0xfa,0xe6,0x26,0xee,0x3a,0x17,0x2b,0xf4,0x21,0x07,0x28,0xb9,0x28,0x81,0xad,0xf8,0xf2,0xc5,0xb2,0x1c,0x36,0x4f,0xe2,0x41,0x2e,0xd3,0xc6,0xf3,0x6a,0xc0,0x02,0x96,0x09,0xd5,0x04,0xb4,0x3f,0xe8,0x17,0x09,0x23,0xff,0xf0,0xf9,0xe0,0x04,0x0e,0x2d,0xc8,0x23,0x56,0xd5,0x15,0x09,0xe0,0xcb,0xc5,0x36,0x4d,0xcb,0xcd,0x0f,0x3f,0xfa,0x69,0x0d,0x5f,0x29,0x27,0xf2,0xae,0x38,0xeb,0x1f,0x34,0xde,0x3e,0x24,0x13,0xf5,0xf0,0x06,0xb5,0xe8,0xf6,0xf4,0x18,0xbd,0x12,0xe9,0x22,0x22,0xf2,0xcf,0x2b,0xe0,0x74,0x06,0xd5,0xc9,0xea,0xe6,0xbf,0xfe,0xec,0xf7,0xf5,0xe6,0xcb,0x03,0xfe,0xfc,0x67,0xfd,0xae,0x2b,0x25,0xd2,0x64,0x0d,0xc3,0x0e,0x4d,0x15,0xf7,0xcc,0xea,0x0b,0x16,0x12,0x1c,0xec,0xa2,0x5f,0x4b,0x3b,0x3c,0xdf,0x32,0xe6,0xd8,0xfe,0x3b,0xdf,0x1d,0x14,0x60,0x5b,0x09,0xd1,0xb2,0xf2,0xbf,0x39,0x2e,0xf4,0xe4,0xf7,0x28,0x22,0xf5,0x01,0xc0,0x40,0xc6,0xe4,0xa3,0x59,0xd0,0x07,0xb9,0xd6,0x09,0x05,0xe8,0xf7,0x7f,0x97,0x18,0x28,0x3c,0xfe,0x32,0x54,0x49,0xec,0xf9,0x3f,0x03,0x0d,0xbf,0x0a,0xe3,0xf9,0xc8,0xe0,0xe9,0xe9,0xd2,0x2d,0xd8,0x9b,0x15,0xeb,0x29,0x78,0x4d,0x20,0xc0,0x07,0x0c,0x2c,0xc5,0xe7,0xf1,0xfc,0x2d,0x2f,0x02,0xff,0xfe,0x39,0x2c,0x0d,0xfa,0x03,0x00,0x1b,0x15,0x49,0x03,0xf6,0x1f,0x17,0xee,0x4b,0x13,0x9e,0xe7,0x04,0xfe,0x1e,0x30,0xf2,0x1c,0xe0,0xf3,0xea,0x63,0xfa,0x2a,0x26,0xec,0xfb,0xec,0xfa,0xcc,0xde,0xb8,0xf4,0x16,0xc1,0x27,0xf0,0xf3,0x12,0x1a,0x4d,0xd2,0x26,0x23,0x1c,0x08,0x43,0x08,0x7f,0xf5,0xc7,0xc6,0xeb,0xd9,0x2b,0x3a,0xe7,0xfe,0x10,0xf6,0xda,0xfa,0x07,0xdf,0x1c,0x15,0x13,0xfe,0x19,0xfe,0x20,0xf0,0xd6,0xf0,0x02,0xfa,0x0f,0x50,0xe9,0xf7,0x1f,0xeb,0xf7,0x4c,0x17,0x23,0x03,0x10,0x32,0x26,0xf8,0xd5,0x1e,0x12,0xf8,0xcd,0xe9,0xef,0xe9,0xe8,0xf7,0x12,0xf6,0xcd,0x01,0x04,0x32,0x1b,0x23,0x00,0x0a,0x44,0xee,0xd7,0x50,0xff,0xf3,0x31,0xe6,0xe4,0xde,0xf8,0xd5,0xe0,0x10,0xfe,0x11,0xfd,0xe9,0xe4,0x53,0x07,0x0d,0xea,0x2f,0xd5,0x09,0xf4,0x01,0x03,0x2d,0xc1,0x12,0x1c,0xf8,0xf7,0xe7,0x1c,0xf7,0xf1,0x10,0x00,0x25,0xb9,0xee,0xf0,0x15,0xec,0xea,0x42,0x18,0xa7,0x09,0x37,0x0c,0xc7,0x0f,0xd6,0xd7,0x08,0x79,0x6e,0xd7,0xf9,0x25,0x0c,0xcb,0x41,0xdb,0xe0,0x73,0x12,0x0a,0xd7,0xd0,0xc9,0x25,0x39,0x0f,0x07,0x21,0xd4,0xc9,0xaf,0x20,0x07,0xfc,0xcc,0xed,0x2f,0xde,0xf0,0x66,0x0f,0x3b,0x1d,0xb0,0xf4,0x89,0x33,0xeb,0x43,0x1e,0xfe,0xd0,0x3c,0x73,0x26,0xe9,0x0e,0x25,0xf0,0x25,0xfa,0xf2,0xd8,0x7d,0xf3,0x1f,0x06,0x03,0xf7,0xc3,0x1c,0xfa,0x47,0x53,0xd4,0x01,0xb1,0xd7,0x30,0x11,0xd6,0xcd,0x39,0x08,0xa0,0xe9,0x3d,0xf5,0xe6,0xa9,0x08,0x3e,0x2b,0x0d,0x30,0x67,0xac,0x4e,0x47,0xfb,0xd5,0xf3,0xdb,0x93,0xff,0x42,0xd9,0xfa,0x2e,0x01,0x1f,0x81,0x1d,0x06,0x51,0xca,0x51,0xe4,0x30,0xe7,0x1d,0xf1,0x13,0x3b,0xda,0x20,0x13,0x3d,0x36,0x30,0xf8,0xe6,0xf2,0x0d,0x1b,0x0b,0x3a,0xf9,0xc9,0x23,0x7f,0x2d,0xbb,0xed,0x04,0xe5,0x06,0x2e,0x19,0x42,0xc6,0x40,0xed,0x0b,0xf9,0x05,0x07,0xf7,0x05,0x08,0x38,0xcb,0xed,0xf0,0xe2,0xfc,0xb1,0x59,0xef,0x20,0x03,0xde,0x21,0xf8,0x3d,0xe8,0x15,0xdd,0x15,0x2a,0xe8,0xd8,0x4a,0x1d,0x10,0x28,0xed,0x0f,0xcc,0x04,0x39,0x40,0xd0,0x04,0xf0,0xee,0x0f,0x04,0x18,0xe7,0xc4,0x16,0x0b,0xe5,0x14,0x62,0x13,0x22,0xec,0x62,0xd0,0xfd,0x1d,0x78,0xf1,0xf7,0xde,0x3d,0xfc,0xd8,0x1f,0xeb,0x51,0x07,0xf8,0x55,0xf2,0x42,0xc7,0xcb,0xd4,0xf1,0x02,0xec,0x28,0xf9,0xc7,0x6d,0xca,0x23,0xee,0xd7,0x0a,0x38,0x0c,0x08,0xe2,0xea,0x08,0xde,0xfc,0x26,0x09,0xea,0x24,0x1d,0xe9,0x26,0x15,0x03,0xf6,0xfe,0xf7,0x01,0x03,0xde,0x04,0xea,0xec,0xe7,0x2f,0xf7,0x37,0x02,0x15,0xc5,0xe7,0xd4,0x30,0x5c,0xae,0xf9,0xef,0xf1,0xb8,0x02,0x1b,0xa5,0x0f,0xe4,0xf8,0xdf,0xfd,0xd4,0x2f,0xba,0x32,0xa7,0xdb,0xf7,0xca,0x11,0xb8,0xd9,0xe8,0x16,0xf2,0xfa,0x08,0xda,0xfd,0xf4,0xb7,0x40,0xbf,0xcb,0x0b,0x34,0xf5,0xcd,0xf7,0x9e,0x16,0x07,0x07,0x0e,0xf0,0xc6,0x27,0x26,0x33,0x01,0xd3,0xc0,0xaf,0xdf,0xe0,0x15,0x04,0x0b,0xbe,0xc0,0xce,0xc6,0x1f,0xdc,0xd3,0x0b,0xfa,0xa9,0x03,0xf4,0x4e,0x0f,0xb7,0xed,0x0a,0xf6,0x71,0x81,0x05,0xe5,0xf0,0x06,0xd9,0x06,0x35,0x1a,0xaf,0x05,0x49,0x08,0xf1,0xe5,0xdf,0xf6,0xb7,0x56,0xfd,0xe4,0x05,0xe3,0xc4,0x30,0xf0,0x2a,0xfc,0x1a,0x8d,0xb1,0x16,0x9b,0x00,0x48,0xe2,0x15,0xf9,0x04,0xe8,0xc8,0x30,0xce,0xe9,0xf3,0x03,0x3f,0xd1,0x99,0x15,0x05,0x77,0x28,0xc7,0xd4,0xc0,0x5a,0xed,0x07,0xdf,0xe3,0xf2,0xf0,0xca,0x74,0x18,0xc6,0x0d,0xd1,0xee,0x93,0x0f,0x2a,0x6a,0xc3,0x02,0x1c,0xff,0xd3,0x0b,0xc0,0xa0,0x35,0x05,0x37,0xf2,0x4a,0x21,0xe3,0xbb,0xb9,0xcd,0x1b,0x1f,0xcb,0x44,0x14,0xc5,0x2d,0x07,0x09,0xfc,0x03,0x10,0xfd,0xe9,0xe4,0x17,0xe7,0xa8,0x87,0xe5,0xee,0x30,0xe9,0x05,0x07,0xca,0x02,0x04,0x25,0x08,0x49,0xcc,0xfd,0xf2,0x51,0xe9,0xdc,0xbf,0x31,0xd2,0xf1,0xf7,0x29,0x4f,0xb4,0x31,0x5b,0xcd,0xf5,0x50,0x20,0x5f,0xe6,0x01,0x13,0x03,0x03,0xd2,0x22,0x7f,0x43,0x8b,0x2a,0xe0,0xed,0xd2,0x1d,0xe2,0xec,0xdb,0x05,0x06,0x66,0xfe,0x27,0x03,0xf4,0xf2,0x09,0x16,0xca,0xfa,0xde,0x05,0xc9,0xef,0x07,0x1f,0x12,0xe8,0x41,0x01,0x0a,0xdd,0xb2,0xf3,0xe7,0x0e,0x16,0xfa,0x0f,0xdf,0x2e,0x31,0xcd,0xf7,0xbb,0x03,0x14,0x1f,0xed,0x36,0x34,0xf4,0xba,0x7f,0xd2,0xba,0x16,0x0b,0x05,0xf2,0x1d,0x36,0xfc,0xff,0xee,0xf5,0x0f,0x1a,0xeb,0x0a,0xfa,0xe7,0x27,0x17,0xf8,0xec,0x27,0x15,0x2d,0xea,0x06,0xd8,0xdb,0xad,0xfb,0xe4,0x14,0xeb,0x08,0x21,0x01,0xd4,0x05,0x0b,0x3f,0xd7,0xc7,0x20,0x0a,0xf7,0xd6,0x0b,0x67,0xc1,0x03,0x05,0x20,0x0a,0xb5,0xe0,0x2d,0xc1,0xf6,0xd2,0xfb,0xf0,0x2e,0xfd,0x0d,0x0d,0x07,0x1e,0xf4,0x07,0x3f,0xfa,0x09,0x27,0x0d,0x17,0xfa,0xfe,0x05,0xfd,0x17,0x0d,0xf9,0x15,0x20,0xe9,0x25,0x03,0xf3,0xdc,0x0a,0x03,0xf5,0x2a,0xef,0x0a,0x05,0x0a,0xdc,0x02,0x1a,0xe9,0x04,0xe1,0xf6,0xf3,0xee,0x03,0x09,0x07,0xce,0x1d,0xed,0x1c,0x01,0x22,0x22,0x03,0x03,0x07,0x17,0x7f,0x16,0x1b,0xf7,0x08,0xe5,0x05,0xf6,0xed,0x1c,0xf7,0x02,0xe9,0xec,0xed,0x27,0xfd,0x00,0xe1,0xf7,0xed,0x07,0x05,0x0d,0x1a,0x24,0x04,0xef,0x21,0x16,0xf9,0x0b,0x05,0xf8,0x25,0xf0,0x01,0xec,0x0f,0xeb,0x06,0x0e,0x03,0xf7,0xee,0xf2,0x04,0x45,0xe7,0x0e,0xee,0x1a,0xf5,0x11,0x14,0x0c,0xfe,0xfa,0x0f,0xf4,0x12,0xf7,0x0a,0xfc,0xf9,0x00,0xff,0xec,0xe8,0x09,0xee,0xf6,0x12,0xea,0xf4,0x01,0x17,0xfd,0xe0,0x15,0x13,0x37,0x5c,0xfb,0xea,0xae,0xe3,0xeb,0xfe,0x95,0xee,0x54,0xf1,0x14,0xe2,0x2f,0xd9,0xf8,0xc5,0xea,0xb0,0xbb,0xac,0x10,0xfc,0xd6,0xfa,0x2b,0xff,0xdd,0xdb,0x28,0x05,0xbd,0xc5,0x48,0x0c,0x08,0x10,0xe5,0xf6,0x7f,0xfe,0x03,0x1d,0xed,0x02,0x02,0x06,0x16,0x34,0x01,0x35,0x9e,0x03,0x12,0xd3,0x3d,0x0d,0x0f,0x3f,0xee,0x30,0x4b,0x1e,0xfa,0x1a,0xe7,0xea,0x05,0x50,0x0b,0x5e,0x78,0xfb,0x2f,0xbf,0x17,0xf7,0xf2,0x50,0xf6,0x24,0x52,0xf3,0xe5,0x76,0x43,0x37,0xec,0x3e,0xea,0xf2,0x2e,0x21,0xef,0x0f,0xcf,0x2c,0x11,0xf1,0x1c,0xf4,0xff,0x1f,0x57,0xe7,0x07,0xbe,0x05,0x70,0xdf,0x22,0xef,0x63,0x41,0x69,0xae,0x07,0x2d,0x4e,0xd6,0x08,0xe8,0xfb,0x29,0x24,0x11,0x16,0xe9,0x20,0x2f,0xf4,0x12,0x24,0xef,0x02,0xf5,0xe6,0x2f,0xef,0x07,0xb4,0xd0,0xf2,0x2f,0xf9,0x28,0x00,0xec,0xa0,0x39,0xd9,0x23,0x06,0x11,0xda,0x1c,0xea,0x07,0x32,0x0d,0x1f,0x0b,0x20,0xee,0x0d,0x76,0x1d,0xb1,0xed,0xde,0x02,0x28,0xeb,0x53,0x11,0xe9,0x26,0xde,0xf5,0x3c,0x1f,0x21,0xb4,0xf3,0xe3,0x06,0xfc,0xe0,0x4b,0xcf,0x2f,0x49,0xfe,0xf9,0x03,0xab,0x1f,0x62,0xa0,0x1e,0x20,0xfb,0x27,0xd4,0xda,0x01,0x2b,0x14,0x0e,0x09,0x45,0xbb,0x33,0x16,0xf8,0x16,0x3e,0xfa,0x15,0x0c,0xfd,0x10,0x21,0x19,0x16,0xed,0x2e,0x5e,0x7f,0x10,0x53,0xca,0x4b,0x22,0x49,0x06,0x32,0xc3,0x2a,0x1f,0x26,0xef,0x37,0x13,0x16,0x16,0xd1,0x40,0x04,0x23,0xe6,0x41,0xe2,0x33,0xcf,0x24,0x03,0x0b,0x18,0xf1,0xfa,0xfa,0xb5,0x32,0x0c,0x1b,0x07,0x28,0xea,0xb8,0x81,0xfa,0x06,0x34,0x16,0x26,0x02,0x1b,0x04,0xfe,0x16,0x18,0xe2,0x0b,0xf4,0xbf,0xfc,0xff,0xdf,0x24,0xc9,0xf4,0xfa,0x0b,0xfb,0xcf,0x02,0x08,0xda,0x0f,0x15,0x03,0xf8,0xdd,0x18,0x02,0xf5,0x1b,0x25,0x0c,0x39,0x1b,0xda,0xef,0xe9,0x0c,0x08,0xec,0xd2,0xf8,0xe5,0xe1,0x1c,0xed,0xe4,0x0d,0xc4,0x10,0xec,0x22,0x23,0x1c,0xbc,0x0d,0xf0,0x05,0xe7,0xf7,0xe3,0x56,0xde,0x1d,0xf6,0x01,0xe8,0xf7,0xf7,0x0e,0x22,0xef,0x02,0x0f,0xe1,0x1e,0xda,0xd7,0xee,0xe6,0x03,0x2b,0xd0,0x17,0xf0,0x2b,0xea,0x04,0x08,0xf7,0xdd,0x14,0x0d,0x1d,0xd0,0x1e,0xdc,0xf2,0xbe,0x20,0xeb,0x1c,0x23,0x0c,0x1c,0x37,0x02,0x04,0x3a,0x05,0x01,0xc3,0x43,0xf9,0xc6,0x10,0x54,0x2c,0xf4,0xd2,0xfc,0x04,0x06,0x11,0xb5,0xe6,0x00,0x10,0xf9,0x0d,0x25,0x17,0x08,0xf7,0x32,0x57,0xbd,0xf1,0x42,0xfc,0xe7,0x00,0xf4,0x17,0x1a,0xe0,0x30,0xf9,0x15,0x2a,0x45,0x24,0x21,0xfa,0xed,0xef,0xe6,0x11,0xf0,0x69,0x39,0x23,0x12,0xc8,0xf8,0x08,0xfd,0xd9,0xf3,0x08,0x01,0x0f,0x22,0xd4,0xf2,0x3a,0xe2,0xec,0xf2,0xf8,0x62,0xe5,0x68,0x23,0x01,0x50,0xef,0xe2,0xd2,0x1d,0xee,0x19,0x0c,0x01,0x01,0x07,0xdd,0xdd,0xfc,0x10,0x06,0x26,0xf5,0xe9,0x0d,0xc6,0x08,0xf1,0x02,0xfe,0x1e,0xf7,0x2f,0xd7,0xee,0xe7,0xff,0x02,0x0c,0x04,0xfa,0x2b,0xd1,0x0b,0xf2,0xfe,0x06,0x19,0xf9,0x02,0x7f,0x0f,0x03,0xf9,0xdd,0xf4,0x4f,0xfc,0x31,0xf0,0x37,0xdd,0x1c,0x5d,0x0e,0x3a,0xe4,0xa5,0xe2,0xfd,0xe4,0xc4,0x7f,0x19,0x26,0xf7,0x20,0xca,0xfa,0x02,0x46,0x5a,0xe2,0x00,0x1b,0xff,0x36,0x2d,0x12,0x0c,0xd1,0xf5,0x32,0xc7,0x01,0xf4,0xd7,0x66,0x14,0xd9,0x08,0xdf,0xf1,0xd8,0xdc,0x01,0x36,0x25,0xff,0x3f,0xf8,0xf5,0xae,0xdc,0x1c,0xd9,0x0a,0x7d,0xde,0xe6,0x1d,0x27,0x1c,0x27,0x02,0xea,0x98,0xdb,0xdb,0x08,0xdd,0xf2,0x10,0xe8,0xfc,0x26,0x11,0x14,0xf7,0x3e,0x07,0x07,0x3c,0x27,0xff,0xfa,0x24,0xe0,0x45,0x05,0x2e,0xce,0x01,0xfd,0x56,0xed,0xe9,0x4e,0x2f,0xfe,0x0d,0xe1,0xe6,0x1b,0x06,0xea,0x3b,0x15,0xea,0xa9,0x00,0x05,0x15,0xde,0x82,0x36,0xdb,0x11,0xbe,0xe1,0x2b,0x09,0x28,0x46,0x5d,0xde,0x36,0x27,0xfc,0x50,0xd0,0x33,0x0d,0x10,0x3b,0xfd,0xe3,0xdf,0x01,0xf6,0xbc,0x48,0x2e,0xfe,0x1b,0x2f,0x20,0xed,0xf8,0xfb,0x8e,0xf5,0xc3,0x2e,0x48,0x68,0xef,0x3b,0x40,0xf1,0xe8,0xaf,0x23,0xeb,0x16,0x37,0x44,0x93,0x12,0x07,0x1c,0x9a,0xfb,0xf5,0xff,0x78,0x15,0x18,0xf9,0x42,0xbc,0xe2,0x07,0x2b,0xc8,0xdd,0xa1,0xbe,0xc4,0x0a,0x1d,0xd6,0xc1,0xe9,0xa4,0xf3,0x15,0x3b,0xe3,0xf7,0x0a,0x1a,0xee,0xd8,0xe3,0x6a,0xf7,0xd2,0xf6,0xdf,0xf3,0xdd,0xd4,0x9d,0x22,0x0b,0xc2,0x16,0x42,0x58,0x23,0xf0,0x03,0xee,0x1d,0x1b,0xf4,0x18,0xea,0x2b,0xc2,0x62,0x2a,0x9a,0xfb,0x2d,0x28,0xcf,0x9f,0xdb,0xfa,0xe9,0xd5,0xcf,0xef,0xda,0x0b,0x9f,0x7f,0xec,0x10,0xca,0x4d,0xc4,0x05,0x09,0x33,0x2b,0x0f,0x08,0x0f,0x27,0x33,0x0e,0xec,0xf3,0x20,0x19,0xdf,0x31,0xda,0x10,0x06,0xf1,0xcc,0x08,0xd9,0x0a,0x01,0x14,0x31,0x0b,0x26,0x14,0x03,0xf6,0xcd,0xd2,0x0e,0x1a,0x39,0x1a,0x2c,0xab,0x1f,0xfb,0x2f,0x37,0x25,0x2c,0xe8,0x07,0xec,0x4d,0xdf,0x1c,0x09,0x0c,0x09,0x06,0xe4,0xf2,0x27,0x05,0x08,0x1a,0xfe,0x06,0x29,0xce,0x5e,0x21,0xe6,0xf9,0xf6,0x00,0x49,0x20,0x14,0xeb,0xe6,0x70,0xd7,0x32,0x77,0xb3,0xef,0x07,0xc4,0x0b,0x12,0x05,0x06,0xc3,0xdd,0x45,0x00,0xcf,0x00,0x22,0x3d,0xd0,0xe1,0xf7,0xde,0xe7,0xe2,0x03,0x7f,0xdf,0x13,0x4b,0x76,0xe7,0x23,0x16,0x5a,0x21,0xf8,0xeb,0xcc,0xdf,0xbc,0x1d,0x0f,0x28,0x25,0x33,0x29,0x1e,0x15,0xf7,0x07,0x19,0x36,0x40,0xbe,0x56,0x25,0x41,0xe4,0xe4,0xd1,0x6f,0xea,0x04,0x32,0x41,0x7f,0x1a,0x3b,0xe3,0x43,0x15,0x02,0x2f,0x3e,0x64,0x63,0xbc,0xff,0xc2,0x0b,0x05,0x31,0x05,0x11,0x38,0x22,0x78,0xff,0xf6,0x38,0xb2,0x19,0x00,0x54,0x10,0x31,0xde,0x49,0x19,0x37,0x2b,0x41,0xe2,0x08,0x1a,0x39,0x0a,0x20,0xd4,0x04,0x35,0x22,0x06,0x21,0x57,0x41,0x66,0xb6,0xfd,0x0e,0x3f,0xd1,0x58,0x1e,0x2d,0x2f,0x68,0x14,0xfd,0x18,0x9e,0xe5,0x36,0xf9,0x15,0xe4,0x22,0x13,0x4b,0xdd,0x3c,0x4f,0xf0,0xfa,0x03,0x03,0x19,0xe5,0x0d,0x05,0x1c,0x58,0xfa,0x2c,0x35,0x07,0x22,0x2f,0x3a,0x22,0xe9,0xf2,0x37,0x11,0x3e,0x23,0x50,0x23,0x1b,0x45,0x1d,0xed,0xce,0x1b,0xef,0x28,0x3e,0xe5,0x34,0x17,0xbf,0x92,0x4f,0xfb,0xd7,0xd0,0x07,0xeb,0xf1,0x2e,0xce,0xf3,0xd2,0xfa,0x14,0x33,0x02,0x07,0xee,0xc7,0xda,0xd8,0xd9,0x0e,0xf3,0xdf,0xfe,0xf1,0x19,0x0d,0x1f,0x0f,0xe1,0x5a,0x74,0x1b,0xd3,0xe1,0xd2,0x24,0x43,0x73,0x33,0xdd,0xd6,0x25,0xce,0xec,0x30,0x05,0x0f,0xe1,0xef,0xd5,0xea,0xbf,0x02,0xe0,0xea,0xf7,0x0c,0x66,0xc9,0x7f,0x51,0xf2,0xc8,0x02,0xec,0x0e,0x73,0x0c,0x02,0x0a,0xec,0xd8,0xd0,0xeb,0xe5,0xe7,0xdc,0x13,0x00,0xf9,0xef,0xc2,0x5e,0xd9,0x17,0x0e,0xf0,0x0a,0x2d,0x13,0xd8,0x01,0x26,0xbb,0x21,0x2d,0xec,0x32,0x08,0x15,0x10,0x1c,0x38,0xd8,0xf7,0x39,0xe3,0x1c,0x2a,0x1c,0x21,0x79,0xd9,0xeb,0x43,0xfa,0x20,0xca,0xec,0x21,0xd2,0xea,0xfa,0x10,0xdd,0x3a,0xf8,0x14,0xd3,0xdd,0xc4,0xda,0xce,0x02,0x16,0x05,0x0c,0x04,0xd8,0x0c,0xf7,0x16,0xe1,0x45,0x17,0xe7,0xb9,0xeb,0xfa,0x11,0x0b,0x15,0x9f,0x49,0xec,0x14,0xe4,0xde,0xc0,0xd3,0x0b,0xb7,0x08,0x12,0xfe,0x26,0x17,0x29,0x48,0xe4,0x0a,0x22,0x51,0x21,0x16,0x12,0xf0,0x0e,0xd6,0xf2,0x32,0x1b,0x0c,0xf4,0x31,0x12,0x4b,0xf0,0x06,0x0e,0x03,0xfe,0x81,0xcb,0x0d,0x1d,0xe9,0x17,0xff,0xf5,0x27,0x05,0x75,0x01,0xf7,0x07,0x15,0xec,0xb4,0xba,0xf4,0xe4,0x04,0x16,0x09,0x47,0x30,0xe9,0xa5,0x43,0x0e,0x93,0x05,0xfa,0xe8,0x09,0xfa,0x53,0xc5,0x11,0x0e,0xf5,0xb4,0xd3,0x4e,0xf8,0x02,0xd7,0x10,0xdd,0xbb,0xa7,0xdd,0x26,0xd1,0xdc,0xfc,0x11,0x3a,0x13,0x27,0x10,0x05,0xaa,0x13,0x00,0xe1,0x25,0xea,0xf7,0xed,0x0a,0xa3,0x0b,0xe8,0xec,0x16,0xfa,0x12,0xf8,0xdc,0xed,0x14,0x23,0xd1,0x0a,0x10,0x03,0xed,0xf5,0x26,0xef,0x08,0x13,0xb9,0xf6,0x7f,0x05,0x25,0xf9,0xe0,0x4a,0x06,0x68,0x18,0xf6,0xef,0xf6,0xf9,0x0c,0xee,0x0d,0xf1,0xe9,0x05,0xb5,0x12,0xe4,0xee,0xde,0x10,0x10,0xfc,0x23,0xea,0x1c,0x3b,0x10,0xf9,0x3c,0x17,0x09,0xf4,0x4b,0xbd,0x12,0xf7,0xf7,0x0b,0xfb,0xdf,0xf9,0xf8,0xfb,0x30,0x1c,0xff,0x19,0x54,0x15,0xf6,0x09,0x27,0x04,0x1e,0xef,0x14,0xe5,0x07,0xfd,0x13,0x40,0xcf,0x67,0xec,0xe4,0x21,0xe1,0x05,0x02,0xfd,0xf9,0x07,0xf9,0xe5,0x20,0xeb,0xf7,0xe1,0x31,0xe2,0x27,0xe0,0xe3,0xf4,0xea,0x0a,0xe7,0xd4,0xc8,0x14,0x1c,0x07,0x1a,0x44,0xed,0xe1,0x1b,0x19,0x19,0x10,0xe3,0xe5,0xe7,0xe7,0xd9,0xe2,0xf9,0x3b,0x0b,0x37,0xf2,0x5f,0xfe,0x2c,0xed,0xf5,0xfa,0xf1,0xf0,0x26,0x13,0xfc,0x20,0xec,0x27,0xd8,0xf7,0xf7,0xd0,0xe5,0xfd,0xe5,0xee,0xe0,0xf8,0xf9,0xfa,0x16,0x2f,0x33,0xf2,0x1d,0x7f,0xc5,0xe7,0xfd,0xdc,0x21,0x03,0xf6,0x0b,0x06,0x1b,0xe5,0x2a,0xda,0x4e,0xe9,0x39,0xd0,0x0f,0x76,0xfe,0x10,0x20,0xcc,0xff,0xf9,0x0f,0x0c,0x14,0x19,0xfb,0x23,0xd1,0xcf,0xed,0xfd,0xf6,0xd9,0xfe,0x12,0x0c,0xd3,0x25,0xf2,0x1a,0x2a,0x10,0xfa,0x23,0xd2,0xe8,0xe4,0x0c,0xff,0x12,0xfb,0x1a,0x0f,0x05,0xf9,0xf9,0x2c,0x14,0x03,0xca,0x39,0x19,0x21,0xef,0x07,0x1b,0x38,0x09,0xe6,0xff,0x38,0xfc,0x4f,0x52,0x17,0x03,0xd4,0xb5,0xfd,0xbd,0x46,0x6a,0xef,0x19,0x04,0x38,0xf4,0x38,0xfb,0x52,0x51,0x00,0xb5,0x22,0x07,0x18,0xe7,0x17,0x20,0xf0,0x03,0xe5,0x05,0x4f,0x2a,0x12,0x35,0x4b,0x21,0x11,0xd7,0x39,0x0d,0xe8,0x01,0x7f,0xe3,0x57,0xe8,0xe4,0xd4,0xe5,0xe9,0xfb,0x21,0xe5,0xf3,0x1a,0xb3,0xde,0xfe,0x11,0xe2,0xd6,0xf5,0x08,0xed,0x43,0x31,0xe8,0x40,0x44,0x1f,0xde,0x0d,0x0b,0x68,0xd7,0xf1,0xb8,0x2a,0xe9,0xdd,0x4d,0x23,0x07,0x33,0x26,0xe0,0x05,0x16,0xec,0xf5,0xc0,0x0b,0xfd,0xff,0xca,0x01,0xfd,0xfe,0xe9,0x18,0xbd,0x08,0xf2,0x1a,0xfe,0x3f,0xd1,0xf6,0xcf,0x1d,0xfc,0xe8,0x2a,0x23,0xa6,0x02,0x3a,0xe9,0xd9,0xd6,0xdc,0x18,0x0a,0x1f,0xbe,0xfd,0xef,0xf6,0x15,0x18,0x15,0xf8,0x0e,0x23,0x2b,0x1d,0xda,0xf0,0x26,0xf9,0xef,0x2c,0x25,0x0c,0xeb,0x13,0x53,0xf5,0x09,0x1a,0x5f,0xbc,0xe9,0x3a,0xca,0xf6,0xfa,0x03,0xd9,0xc1,0x2d,0x03,0xf3,0xfc,0x26,0x2f,0x07,0x22,0x20,0x0e,0xd5,0xed,0xcf,0xfb,0x17,0xfa,0x2c,0xe9,0x5e,0x18,0xba,0x3c,0xd9,0xff,0x21,0x1c,0xff,0x18,0x13,0x1c,0xc7,0xe7,0xa4,0x19,0x1a,0x0b,0x46,0xdf,0x17,0xcf,0xa3,0xd0,0x78,0xca,0xfb,0xc8,0xcc,0x01,0xf8,0xfa,0x41,0x0b,0x38,0xfe,0x34,0xf6,0xb1,0x29,0x1e,0xd5,0x0b,0xff,0xc4,0x01,0x3d,0xf9,0x2b,0xf2,0x04,0x7f,0xde,0xfd,0xf7,0xc2,0x3c,0x34,0x22,0x1b,0x20,0x10,0x35,0x06,0x0b,0x00,0xd0,0xe3,0x0f,0x41,0x59,0xbe,0x20,0x45,0xf9,0xe3,0xe8,0xec,0xee,0xd8,0x1d,0x04,0xeb,0x48,0xf9,0xdc,0xe9,0x08,0xbf,0xe7,0x22,0xe7,0x37,0x0b,0xcd,0xd1,0x05,0xd4,0x28,0x33,0xc3,0xed,0x2c,0x01,0xfe,0x42,0xf5,0xc1,0x4a,0x3a,0x03,0x05,0xd0,0xe5,0xf2,0xfb,0x0a,0xd2,0x30,0x09,0xf8,0xff,0x1f,0x25,0xe5,0xf4,0x10,0x26,0x1b,0x4c,0x07,0x00,0xf2,0xe6,0xe5,0xe4,0x09,0xdf,0x16,0x4d,0xf4,0x35,0x81,0x0e,0x18,0x24,0x06,0xf6,0xe4,0xf6,0xe8,0xee,0x79,0x0b,0x16,0xf7,0xdc,0xe5,0x2d,0x28,0xeb,0x2b,0xfa,0x0a,0x21,0xff,0xf4,0x00,0x1a,0x36,0x1e,0x17,0xda,0xcd,0xed,0xc9,0x43,0xe5,0x08,0x0e,0x33,0xf6,0xdf,0xdb,0x1e,0xc8,0x11,0xe3,0x00,0xfe,0x21,0xf7,0x1b,0xe5,0xd0,0x08,0xe0,0x1a,0x1a,0x2e,0xf7,0xb5,0x16,0x2f,0x28,0x1f,0xdf,0xe3,0xcf,0x34,0xf8,0xe0,0xf7,0x2b,0xeb,0x11,0xd0,0x1c,0xe8,0x03,0x03,0xe5,0x06,0x54,0xbf,0xcf,0xea,0x3a,0xe0,0xff,0xcf,0x2c,0x02,0xd4,0xf4,0xf9,0xcf,0x7f,0xf2,0x0d,0x23,0x2e,0xe0,0xc6,0x38,0xe7,0xe8,0x1c,0xbd,0x30,0xeb,0x10,0x10,0xe8,0x24,0x0b,0xf1,0xfd,0x23,0x07,0x0e,0xe4,0x12,0xcd,0x50,0x33,0xfe,0xf6,0x0a,0x03,0x38,0x00,0xf2,0xec,0x0b,0xe2,0xdd,0xf2,0x38,0xd6,0xdc,0xf8,0x40,0x39,0xe0,0x12,0x03,0x04,0xe6,0x0c,0x00,0xd1,0x1a,0xff,0xd3,0x40,0x05,0x50,0xf7,0x0f,0xfe,0xcc,0xee,0xf0,0x1d,0x16,0x2b,0xec,0xf4,0xf4,0xf8,0x25,0xee,0x09,0xd3,0x2f,0x02,0x07,0xde,0xa7,0xeb,0xd3,0x3a,0xdf,0x2d,0x2f,0xf0,0x49,0xfe,0x0c,0x81,0xf8,0xb3,0xe8,0xfb,0x18,0x24,0xd0,0xc1,0xef,0x44,0x9d,0x0c,0x15,0xc4,0xc0,0xe1,0xd6,0x09,0x1f,0x04,0x0b,0x0e,0x19,0xab,0xac,0x32,0x10,0x11,0xb7,0x02,0xfe,0x70,0x48,0xe7,0xcb,0xd3,0x9f,0x2a,0x28,0x69,0xe6,0x97,0xfe,0xab,0x14,0x3e,0xd6,0x26,0xd1,0x44,0xf3,0x0c,0xf7,0x18,0xec,0xcc,0xe4,0xf3,0xbe,0x26,0x1a,0xa6,0x0a,0xdd,0xa2,0x87,0x07,0x43,0x50,0xd8,0x46,0xa9,0xf7,0x36,0xb1,0xb4,0x23,0x14,0x10,0x4a,0x2a,0xfc,0x35,0xef,0xd5,0x1e,0x36,0x40,0x1c,0xac,0x23,0x37,0x03,0xaa,0xc0,0xb5,0x2b,0x3f,0x54,0x62,0x0a,0xaa,0x92,0xf0,0x1a,0xe9,0x02,0x31,0xdc,0x13,0x2e,0xee,0x15,0x13,0x13,0x07,0x3c,0xcc,0x05,0x37,0x5a,0x02,0x32,0x0f,0x1d,0x3a,0x39,0x0f,0x2c,0x0b,0x3f,0x6e,0x51,0xfc,0x44,0xcc,0xf9,0xed,0x23,0xbf,0x63,0x0d,0xd9,0xdf,0x16,0x43,0x0f,0xbc,0xf8,0xc1,0x29,0x26,0xff,0xb3,0x11,0xdd,0x3d,0x12,0x2d,0x0b,0x7f,0xfb,0x05,0x01,0xd6,0x38,0xea,0xff,0xf6,0x37,0xcd,0x29,0xa9,0xde,0x1a,0xce,0xf7,0x1f,0xfb,0x26,0x17,0x16,0x45,0x22,0xde,0x21,0x0f,0xeb,0xe3,0x05,0x0b,0xee,0x2b,0x37,0x2e,0xd9,0x7c,0xf4,0x18,0x15,0x1a,0xd1,0xf9,0xe1,0x58,0x1f,0x20,0x0f,0x35,0x17,0x0f,0xde,0x52,0x03,0xf9,0xf6,0xfa,0x3a,0x07,0x22,0x52,0xc2,0x21,0x1a,0x1d,0xb0,0xe5,0xfd,0x0a,0x1f,0xc0,0x3e,0x4d,0x53,0x08,0xf8,0xd1,0xf2,0x0d,0xf8,0x18,0x2d,0x21,0xe8,0x56,0xe9,0x06,0x03,0x1d,0x16,0x0e,0x16,0xf4,0x0d,0xe6,0xfc,0x3a,0x0d,0x25,0x19,0x20,0x03,0x29,0x13,0x2a,0xf3,0x4d,0xc3,0xc9,0x10,0x1e,0x15,0xcc,0x56,0x24,0xb7,0xea,0xf8,0x00,0x72,0xe9,0x0a,0x51,0x00,0xc6,0xda,0x18,0x1e,0x15,0xab,0xf7,0xe4,0xa4,0xfb,0x2d,0x4f,0x03,0x9b,0x17,0x04,0x3e,0xc1,0xcc,0xe7,0x0f,0x92,0xfe,0x22,0x07,0x20,0xe7,0xcf,0xe2,0xdf,0xfa,0x18,0xda,0x0e,0xe0,0xe0,0xe6,0xb4,0x2e,0x38,0x35,0x28,0x23,0xd6,0x02,0x1d,0xfc,0xed,0x83,0xe6,0xfd,0x1a,0xad,0xb4,0xf9,0x0a,0x1a,0xcb,0x16,0xd1,0x11,0xc9,0x24,0xef,0x0c,0xfd,0xf5,0x00,0x17,0x02,0x11,0x14,0x28,0x0a,0x91,0xf2,0x2d,0xf2,0xf7,0x3f,0x25,0xee,0xe7,0xd3,0xf8,0xdd,0x25,0x20,0x11,0x7f,0x42,0xb3,0x08,0xe4,0x2f,0xda,0xf7,0xf3,0x92,0x1f,0x1c,0x12,0xae,0xdc,0xc3,0xe1,0x17,0xef,0xf5,0x05,0xcd,0x15,0xf2,0xf5,0x21,0xff,0x26,0xc2,0x1b,0xce,0xfa,0x03,0xea,0x02,0xfc,0xe1,0xca,0xda,0x1a,0x02,0x61,0x20,0xeb,0xc7,0xe2,0x84,0xfc,0x00,0x1b,0xca,0xa8,0xd0,0x29,0xef,0x20,0xcf,0x2b,0xfe,0x40,0x17,0xff,0xf8,0xf1,0x29,0x91,0x07,0xa8,0xfe,0xc0,0xff,0xff,0x07,0xfc,0xd5,0xe2,0x00,0xed,0xd7,0x09,0x29,0xbc,0x07,0x68,0xb1,0xc3,0x81,0x10,0xf1,0x00,0x1d,0xf8,0xd1,0x0d,0xf5,0xe8,0xf1,0xe3,0xd4,0x47,0xf7,0xec,0xe0,0xe7,0xde,0x24,0xf4,0x61,0xe3,0xfe,0xcb,0x26,0xe9,0xb7,0x03,0xd7,0xb5,0xe9,0x2b,0xec,0xef,0x17,0xde,0x29,0xcf,0x08,0xf1,0xe5,0xd0,0xa9,0x00,0x1f,0xee,0x1e,0xe9,0x4f,0x03,0x18,0xe0,0x20,0xfc,0x13,0x6b,0x0a,0x01,0xb8,0xd3,0x13,0xf4,0x09,0x1e,0x33,0x44,0xec,0x02,0xff,0x50,0x5b,0x00,0xc7,0x34,0xea,0xe1,0x1e,0x45,0xde,0xf2,0x29,0xd1,0xe2,0x14,0xd4,0x36,0x61,0x7f,0x12,0x49,0xdd,0xec,0xe9,0xf8,0xc2,0xf9,0xc7,0x05,0x1d,0xf9,0xe2,0x20,0x04,0xf4,0xe2,0xe9,0x2f,0xeb,0x0b,0xef,0x1f,0xc0,0xb8,0xe8,0xdd,0xf9,0xf3,0xb4,0x39,0x41,0x18,0xf8,0xf0,0xf3,0x45,0xd1,0xc8,0xd6,0x3d,0xf3,0xee,0xec,0x00,0x2f,0x03,0xf7,0x1d,0x20,0xf5,0xe8,0xfd,0x24,0xe2,0x17,0xf3,0x07,0xee,0xed,0xd8,0x2b,0x3d,0x18,0x08,0xf5,0x24,0x0e,0xf7,0xed,0x35,0x22,0x0e,0x30,0xf4,0xc6,0xb9,0x21,0xfc,0x09,0x06,0x10,0xed,0xfc,0x38,0x2b,0x21,0x96,0x05,0xdb,0x09,0xbe,0x2e,0xba,0x52,0xfc,0x3d,0xd4,0xd0,0x04,0x27,0xae,0x9d,0x13,0x57,0x34,0x0c,0x11,0xe6,0x3f,0x1f,0xb8,0x2c,0xf8,0x2e,0xe8,0xe6,0x06,0x32,0xe6,0x23,0xc6,0x29,0x11,0xcd,0x06,0xe6,0xf8,0x1a,0x2f,0x0e,0x18,0xc0,0x11,0xeb,0xdb,0xec,0x7f,0xfe,0xe4,0xfe,0xe0,0xf2,0xc8,0x1b,0x19,0x0d,0xe3,0xcb,0xdd,0xc8,0xd9,0xde,0x09,0xb5,0xfc,0x03,0xef,0xe9,0xf0,0x3e,0xfc,0x12,0xe9,0xdf,0xe7,0xe8,0xf9,0xfd,0xea,0xff,0x25,0x03,0xd3,0xd8,0x14,0x28,0x0b,0x31,0x52,0xd9,0xfd,0x0a,0xe0,0xe0,0x02,0xec,0xc5,0x12,0xf0,0x17,0xc8,0x2a,0xf0,0x34,0xd0,0x1e,0xea,0xd5,0x47,0x34,0x29,0xd0,0xeb,0xd4,0x04,0x0c,0x38,0x0d,0xc7,0x10,0xd1,0x1d,0x05,0xdc,0xe8,0xeb,0x0e,0xe6,0x17,0xf3,0x30,0x26,0xee,0xf9,0x50,0x25,0xc7,0x2e,0x11,0xd5,0xbe,0xfa,0xca,0xe5,0xec,0xa8,0x05,0x00,0x01,0xd9,0xb2,0x1e,0x37,0xee,0x81,0x22,0x0a,0xb5,0x26,0x2e,0xbf,0x56,0x26,0xfb,0xe9,0xbf,0xee,0xff,0x21,0x02,0x18,0xfc,0x52,0xe8,0x20,0x28,0xf7,0xfe,0xfe,0xf2,0x0c,0x3f,0xfe,0xf8,0x30,0xfd,0x1f,0xdc,0xfb,0x20,0x77,0x3e,0xca,0x3d,0x2e,0xf7,0xca,0xef,0xfc,0x04,0xec,0xf6,0xf4,0x55,0x11,0xfd,0xef,0x0e,0xed,0xd4,0x01,0x09,0xf6,0xe5,0x01,0x20,0x04,0x1a,0xf2,0xdf,0x00,0x44,0x9e,0xfc,0x0a,0xe6,0xff,0xe8,0xc8,0x28,0x5d,0x26,0x04,0xeb,0xd5,0xf9,0x04,0xf9,0xb4,0xd1,0x14,0x1d,0x38,0xf4,0xf0,0x33,0x2e,0x19,0xd7,0xe8,0x13,0xe7,0x15,0x2f,0x07,0x00,0x10,0x00,0x6f,0x31,0x31,0x13,0x3d,0x28,0xda,0x2d,0xf0,0x14,0x2d,0x13,0x81,0xd6,0xe7,0x2a,0x1e,0x34,0x2b,0x0f,0xc1,0x1c,0xcb,0x21,0xb7,0x2f,0x28,0xe1,0x3f,0x23,0xf6,0x3b,0x20,0xad,0x41,0xe4,0xe4,0x11,0x3c,0x27,0x4c,0x3a,0x26,0x23,0x1f,0xec,0x35,0xe6,0x1f,0xf5,0x3e,0xfa,0x07,0x38,0x28,0x20,0x03,0x14,0x31,0xfa,0x4b,0xf5,0x1a,0x47,0x07,0x32,0xdc,0x3d,0x11,0xd2,0x05,0xf9,0xd8,0x08,0x41,0x33,0x01,0x11,0x2b,0x1c,0x0a,0x0b,0xe7,0x03,0x0a,0xdc,0x39,0x39,0x10,0x24,0xe5,0x34,0xfe,0xf8,0xe9,0xec,0xd9,0xd6,0x07,0x1b,0x30,0x3b,0xf6,0xcc,0x53,0xd1,0xf6,0x09,0x1e,0x20,0xee,0x13,0x14,0xe8,0xa4,0x63,0xc6,0x1f,0x0f,0x0f,0xd0,0xe1,0x5a,0x13,0x0c,0xb3,0x1a,0x21,0x37,0xc3,0x58,0xbf,0x43,0xcc,0x09,0xe9,0xc0,0x63,0xd6,0xe0,0xd9,0x03,0xbd,0x10,0x19,0xe9,0xc1,0x13,0xbc,0xd0,0x51,0x0a,0xa9,0x39,0x0b,0xca,0x3c,0xdf,0xd2,0x12,0xbf,0xcc,0x15,0xe5,0x1d,0x08,0xcb,0xe5,0x0e,0xcb,0x3c,0xf2,0xb1,0x3b,0xcc,0xb2,0x0e,0x12,0x35,0xfa,0xff,0xc8,0x2d,0xed,0xfa,0x3b,0x04,0xfc,0x09,0xfd,0xf4,0xff,0xf6,0xe4,0x02,0xd4,0x00,0x92,0x26,0x17,0xd2,0xe2,0xad,0x27,0xef,0xd9,0x06,0x64,0xfe,0x2d,0x18,0x2e,0xe1,0xb7,0x45,0x30,0x43,0xde,0xdc,0xff,0xaf,0x18,0xdb,0xc9,0xee,0xf2,0xd3,0x3c,0x13,0x06,0x00,0xf7,0x13,0x08,0xdc,0xf9,0xf9,0xfd,0x2a,0xf9,0xdb,0xc5,0x05,0x23,0x1c,0x7f,0x31,0xe3,0xdd,0x51,0xe8,0x05,0xf5,0x51,0xbf,0xa1,0x2a,0x46,0xdf,0x73,0xec,0xdb,0xd6,0xc7,0x1a,0xc8,0xfa,0xcc,0x08,0xbe,0x05,0xe6,0xf8,0x04,0x2e,0x43,0x08,0x0f,0x90,0x12,0xe1,0x25,0xbb,0xdd,0xd8,0x16,0x3e,0xda,0x5f,0x12,0x19,0xe5,0xf0,0xf7,0x2b,0x02,0x1e,0xf4,0xef,0xaf,0x2e,0xcf,0x49,0xc2,0xdc,0xea,0x1f,0xc1,0xee,0x09,0x08,0xf9,0x36,0x2a,0xf0,0x0d,0x2b,0xf0,0x11,0x28,0x28,0x2a,0x36,0xda,0xb5,0x7f,0xe7,0xdd,0x32,0x03,0x06,0xfe,0x07,0xfc,0xf6,0x4a,0xfc,0xe9,0x04,0x0f,0xff,0x0d,0x4f,0x1b,0x07,0xf7,0x1f,0x04,0xcf,0xdc,0x15,0x0b,0x2d,0x47,0x18,0xf6,0xb9,0xb4,0xc4,0xd8,0x0c,0x76,0xe0,0x06,0xa8,0xf5,0xe0,0x17,0x1e,0x07,0xe2,0x5a,0xec,0xd7,0x03,0xdf,0xf5,0x01,0x04,0xeb,0x05,0xea,0xdf,0x42,0xe6,0xe4,0xce,0x09,0xfa,0x38,0x53,0x02,0xda,0x16,0xe7,0x19,0x41,0x14,0xf2,0xf9,0xf6,0x17,0x03,0x2d,0x24,0x20,0x6b,0xf3,0x55,0x23,0xf5,0xe2,0x0e,0x4c,0xe0,0x0f,0xd2,0x7f,0xba,0x1e,0xd3,0x1a,0xd8,0x3b,0x18,0x01,0x0b,0xe6,0xfd,0x20,0xde,0x14,0xe0,0x15,0xf8,0x0c,0xfd,0xd1,0x0c,0x3c,0x04,0x09,0x1f,0xfa,0xc3,0x2e,0x06,0xf2,0xf5,0x0d,0xa2,0x19,0x37,0xe7,0xe3,0xcb,0xfd,0x18,0xdf,0xf9,0x02,0xf0,0x0c,0x2e,0xd7,0xff,0xf5,0x0c,0xfa,0xf5,0x2b,0x17,0xe8,0xb4,0xfd,0xe4,0x25,0x2e,0x0b,0x31,0x27,0x1c,0x03,0x04,0x06,0xdb,0xd1,0xff,0x23,0x15,0x21,0x43,0xab,0x20,0xfb,0x24,0x02,0xf6,0x28,0x03,0xfc,0xcd,0x2f,0xed,0x34,0x21,0x2f,0x3c,0xfa,0xf9,0x1b,0xd3,0xe6,0x13,0x4d,0xe2,0x1d,0x7a,0x01,0xc6,0xd7,0x14,0xdf,0x57,0x4f,0xdc,0xd1,0xaf,0x97,0xc7,0x52,0xa2,0x4d,0x38,0x6f,0xe4,0xe2,0x60,0x4b,0xcb,0xf8,0xd5,0xbd,0x33,0x1d,0xfa,0x6a,0x14,0xf8,0xed,0x1e,0x57,0x5f,0xdb,0xcf,0xc5,0xbf,0xf2,0xe4,0x3c,0xc5,0xf2,0x12,0xee,0x15,0x0e,0x44,0x3c,0xde,0x20,0x23,0x21,0x48,0xd5,0x32,0x5d,0x07,0xf7,0xe3,0x26,0x7f,0xe2,0xe3,0xe7,0xcd,0x27,0x5f,0xe4,0x37,0x49,0x21,0x2c,0xd7,0x39,0xd5,0x39,0x2f,0x00,0xad,0x24,0x2f,0xfb,0xef,0xf7,0x24,0x2f,0xe8,0x02,0x17,0xb8,0xdd,0xf5,0x41,0x8f,0x06,0x34,0x65,0xfe,0xf5,0x8b,0x5b,0x22,0xfa,0x24,0x13,0x0d,0xdf,0xec,0x5f,0xd9,0xca,0x0e,0xd0,0xf1,0x0e,0xeb,0x4b,0xc4,0xcf,0xda,0xce,0xea,0xec,0xd9,0x1c,0xc6,0xc8,0xf3,0x05,0xbd,0x04,0xf9,0xea,0x06,0xd8,0x26,0xaa,0x08,0x31,0xc3,0xe1,0xef,0xec,0xfe,0x55,0x1e,0x15,0x03,0xfe,0x06,0x15,0xf1,0xdd,0x0e,0xe2,0xf3,0x9e,0xb7,0x30,0x2a,0x9c,0x47,0xfb,0xe6,0xdb,0xff,0xcb,0x2e,0xce,0x0a,0xfd,0x05,0xde,0xb3,0xd8,0xe4,0x34,0x34,0xed,0x10,0xb7,0xf3,0x37,0xcf,0xd4,0xb5,0xdc,0xf4,0xe7,0xca,0xff,0xcb,0x2e,0x31,0xff,0x25,0xf7,0x29,0xb9,0xc4,0xf5,0x2f,0x0d,0x16,0x04,0xe0,0x11,0x10,0x17,0x08,0x1e,0xed,0xef,0x0e,0xf0,0x06,0xdf,0xc6,0xcf,0xfa,0xff,0x08,0x2d,0xca,0xe1,0x15,0xc5,0xa9,0xfb,0xea,0xf8,0xa8,0x08,0xf3,0xdd,0xc0,0x7f,0x34,0x20,0x01,0x19,0xde,0xd3,0x96,0x11,0x27,0xea,0xd5,0xfc,0x02,0xcb,0xac,0x16,0xbe,0x62,0xe5,0x3e,0xf6,0xdd,0x1a,0xd5,0x24,0xd8,0x37,0xf9,0xe1,0xcc,0x8e,0xe8,0x4e,0x04,0x1b,0xe3,0xe0,0xdf,0x08,0xe6,0x6c,0x02,0x97,0xf2,0x1c,0x2d,0xed,0xc1,0xc9,0x29,0x1b,0x0f,0xfb,0x15,0xb3,0xf1,0xd4,0xcd,0x7a,0xce,0x01,0xf9,0x56,0x02,0xf6,0x06,0xe4,0x46,0x71,0xf4,0xb4,0x5b,0x14,0x2b,0x34,0x10,0x17,0xd1,0xea,0x1a,0xe9,0xe5,0xbe,0xc0,0xf4,0xb0,0xb1,0x3a,0x8d,0x47,0xc0,0xfb,0x20,0xdf,0xff,0xf0,0xf7,0x15,0x64,0x2a,0xe2,0x42,0x49,0xf2,0xcf,0xfa,0x1f,0x22,0x00,0x2d,0x03,0x2d,0xbb,0xfc,0x7f,0x31,0x15,0xdf,0xd3,0x0b,0xfb,0xf4,0x1e,0x20,0xc4,0xdd,0x0c,0xef,0xe4,0xc4,0xfd,0x14,0x2e,0xe1,0xd0,0xec,0x03,0x01,0xf0,0x31,0x2b,0x13,0xd7,0x1f,0xf7,0x08,0x24,0x35,0xe8,0x18,0x00,0xfc,0x0d,0xf6,0x15,0xf8,0x24,0x1b,0xc0,0xd2,0xf8,0x0e,0xee,0xd1,0xee,0x0d,0xd0,0xfb,0x42,0xfd,0x42,0x39,0x18,0x26,0xbb,0x09,0x02,0x2c,0x2c,0x37,0x01,0x31,0xe5,0xe9,0x16,0xdb,0x1f,0x02,0x31,0x04,0xec,0x3d,0x1a,0xe3,0x21,0xf8,0x0a,0x1b,0xf3,0x7f,0x0e,0x3c,0x3b,0x0f,0x0e,0x15,0x12,0x35,0xee,0x17,0x09,0xf3,0x36,0x2f,0xdd,0x06,0x40,0x0c,0x2f,0x08,0x23,0xe8,0xe1,0x10,0x49,0xeb,0x03,0x03,0xd5,0x10,0x44,0xf0,0x5d,0xf8,0xf3,0x00,0xda,0x4a,0xe4,0x2a,0xf4,0xdb,0x0d,0x49,0xee,0x1b,0x12,0xf4,0xed,0x0d,0x12,0xf9,0xec,0xbe,0x05,0xf4,0x19,0x49,0xf7,0x07,0xb6,0xfa,0xc2,0x06,0xd0,0xa0,0x0d,0x45,0x03,0x8e,0x34,0x40,0xe3,0xc7,0x19,0x17,0xfc,0xa3,0x15,0xea,0xf1,0x9f,0xe4,0xaa,0x11,0xbc,0x30,0xdb,0xad,0x7f,0x41,0xf5,0x34,0x3e,0xec,0xfd,0xf0,0xfe,0xa0,0x13,0x28,0xf6,0xdf,0xc4,0xfd,0xe8,0x2a,0xc0,0xed,0x54,0x93,0x4e,0xfd,0xd4,0xec,0xf3,0x24,0xd1,0x39,0xd3,0xd1,0xe6,0xd5,0xe6,0xd9,0xef,0xb6,0xd3,0x2a,0x04,0xd8,0x33,0xd6,0xc9,0xd3,0xb6,0xdc,0xbb,0x19,0x16,0xfe,0xfa,0xe1,0x09,0x9b,0xb0,0xa0,0x44,0x17,0xfc,0xd1,0xcf,0xd6,0xdb,0x51,0x0e,0xec,0x37,0xc3,0xe0,0x0d,0xbb,0xda,0xfa,0xe2,0xf0,0xcf,0x2c,0xa2,0x25,0xf8,0xc1,0xde,0x42,0x27,0x09,0xd7,0x27,0x9a,0x53,0xf5,0x14,0x43,0x69,0x6f,0x14,0x23,0x0d,0xda,0x4b,0xf4,0xf2,0x0b,0x4c,0x7f,0x19,0x36,0x33,0x1b,0xca,0xe9,0x1e,0x0c,0x04,0x48,0x04,0xdb,0xe1,0xf2,0xf2,0x1f,0xf4,0x24,0xec,0x29,0xf2,0x16,0x0f,0xfb,0xdf,0xb9,0xe1,0x41,0xfa,0x2c,0x0d,0xe7,0xdf,0xd4,0xb9,0xf4,0x37,0x16,0x25,0xf8,0xfd,0xc9,0x29,0x02,0x2a,0xea,0x40,0xf1,0x04,0x1b,0x12,0x02,0x5b,0xbb,0xd4,0x23,0x0c,0xd4,0xe5,0xd0,0x02,0x13,0xec,0x0d,0x0e,0xeb,0x01,0x1c,0x41,0x04,0xfa,0x21,0x1e,0xf3,0x14,0x1b,0xc8,0x15,0xf2,0xe1,0xd8,0xf2,0xfa,0x21,0xe8,0xd5,0x5e,0xfa,0x02,0x00,0xeb,0x13,0xdb,0xa7,0xf3,0x16,0x26,0x18,0xf5,0x29,0x0b,0xd2,0x18,0x1f,0x3c,0x18,0x2f,0x1c,0x0b,0x00,0x25,0xed,0xb2,0xe0,0x47,0x3a,0x05,0x55,0x12,0xe4,0x08,0x7f,0xe7,0xbc,0x53,0xc3,0xab,0x2a,0x37,0x05,0x03,0x1e,0xed,0xdf,0xbf,0x0d,0x2b,0xea,0xd2,0xee,0xde,0x01,0xbb,0x07,0xf6,0x22,0x2e,0x69,0x08,0x30,0xf6,0xe6,0x0e,0xe9,0xc0,0xf5,0xf7,0xf5,0x09,0x0d,0x26,0xf6,0xbf,0xd6,0xa7,0x00,0x07,0x0f,0x32,0xb5,0x17,0x98,0x22,0x1c,0x0b,0x51,0x32,0xf3,0xdb,0x13,0x41,0x94,0x1a,0x0a,0x1e,0x25,0xf5,0x19,0x6f,0x3d,0x00,0x3b,0x19,0x33,0xc7,0xc3,0xff,0xee,0xe8,0x20,0xc6,0xe8,0xf3,0xe2,0xfe,0xf1,0xd9,0xfd,0x37,0x22,0xfc,0xea,0xf4,0xfe,0x75,0xef,0x16,0xef,0x4e,0x2f,0xfe,0xd0,0xca,0x09,0xfa,0xee,0x01,0x1e,0x1b,0xfe,0x13,0x0a,0x12,0x07,0x01,0xf7,0x03,0xee,0x31,0x41,0xa8,0x09,0xef,0x3b,0x13,0x05,0xfc,0x09,0x20,0x30,0x18,0xf3,0x19,0xf9,0x42,0x30,0x74,0xdb,0x07,0xc7,0xb7,0xef,0xde,0xee,0x18,0xd2,0xb3,0xb9,0x01,0x04,0x11,0xff,0xb9,0xc3,0x01,0xd4,0x24,0xd2,0xcc,0x1a,0x4a,0xd2,0xe4,0x2d,0xa8,0xad,0xa9,0xe7,0xaf,0x2d,0xe0,0x69,0x07,0xfc,0xb7,0x40,0xe2,0xe8,0xf3,0xb1,0xfd,0x1c,0xfd,0x51,0x03,0xe1,0xeb,0xf1,0x9f,0xca,0xe1,0x46,0xd6,0xce,0xe5,0x27,0x34,0xdf,0x4a,0xeb,0x09,0x09,0xb3,0xdc,0xf5,0xb2,0xd9,0x44,0x34,0x0c,0xf0,0xf2,0xcf,0xe7,0xc1,0x90,0xbf,0x0a,0x10,0xc0,0x23,0xf7,0x67,0xbd,0xca,0x28,0xd7,0x14,0xc3,0x54,0xea,0xb6,0x7f,0xd3,0xc8,0xd3,0x10,0xe4,0xe5,0x3a,0x43,0x0b,0xdb,0xc8,0xb5,0xec,0x53,0x34,0x26,0xc9,0x1d,0xcc,0xc7,0xf0,0x1c,0x25,0x0a,0x27,0xe1,0x08,0xec,0xd4,0x15,0xb4,0x49,0xe5,0x60,0x6c,0xf9,0xd0,0xa3,0x41,0xea,0x2a,0xf3,0xfa,0x29,0xc0,0x06,0xe3,0xe3,0x39,0x29,0xd8,0x61,0x16,0xf4,0x27,0x42,0x07,0xb8,0x15,0x27,0xd2,0xe9,0xc2,0x7f,0x07,0xe1,0x6d,0x2a,0xec,0x35,0xf3,0x09,0xf3,0x3d,0xf1,0xeb,0x34,0x01,0x07,0xf4,0xfd,0x00,0xd8,0x1f,0x1d,0xfd,0xe5,0x07,0xe5,0xfc,0xfe,0x24,0x3f,0xe3,0x3e,0x19,0x09,0x4a,0xe3,0xe7,0x6d,0xdd,0x17,0xee,0x16,0x38,0x13,0xea,0xb1,0xf5,0xf4,0xd2,0x0d,0x10,0x01,0xdb,0x11,0xfb,0xef,0xd3,0x27,0xe9,0x22,0x31,0xe6,0x47,0x14,0x24,0xc8,0x14,0xd1,0xeb,0x04,0x11,0x0d,0xee,0xf6,0xe2,0x14,0xdf,0xfe,0xdd,0x0a,0xf8,0xf6,0x27,0x75,0xe1,0xa7,0xde,0x5c,0x0f,0xcc,0xd7,0xe9,0xf9,0xcd,0x0d,0x91,0xef,0xf1,0xf2,0x7f,0xd7,0xd4,0x12,0xf5,0x0e,0xd4,0xdb,0x3f,0x4c,0xcd,0x10,0xf9,0x4d,0x05,0xe9,0x3d,0x1b,0x4e,0xdc,0x13,0x33,0x0a,0x16,0xf0,0xeb,0xa6,0xe0,0xdf,0x12,0x08,0xd6,0x12,0x00,0x1b,0x1b,0xf6,0x06,0x38,0xf5,0xd2,0x57,0xf5,0xfa,0x0b,0xf3,0x2f,0x14,0xfe,0x26,0xf2,0xd3,0xe5,0x1e,0xfb,0xdb,0xea,0xbe,0x0b,0x52,0x0f,0x16,0xec,0xef,0x04,0x0f,0x34,0x08,0xfa,0x20,0xc4,0x01,0x41,0x18,0xdf,0xd0,0xd0,0x07,0xf0,0xf0,0x11,0xf6,0xc8,0xee,0x28,0x14,0xc6,0xbf,0xf6,0xf4,0x0f,0x29,0xf5,0x1b,0x09,0x09,0x01,0xe1,0xf4,0xc0,0xe2,0xe2,0x13,0x1a,0xf8,0x07,0x07,0x08,0xf2,0xd0,0xea,0x0d,0x4c,0x01,0xa6,0x48,0x04,0x0a,0x14,0x90,0xfe,0x0f,0x2b,0xa6,0x7f,0x84,0x2d,0x37,0x07,0xb2,0xeb,0x63,0x0b,0xc9,0xa5,0xef,0x35,0x0c,0xe3,0x13,0xf6,0x20,0xe5,0xec,0x09,0x21,0x6b,0xe2,0x02,0xc2,0xd3,0xe5,0x13,0xe6,0x4a,0x19,0x9c,0x24,0x3b,0xba,0xcb,0xda,0x00,0x55,0xee,0x35,0xad,0xf2,0x9a,0x75,0xe8,0xf0,0x03,0x0b,0x17,0xed,0xd5,0x18,0xc9,0xfe,0xe0,0xf6,0xbd,0xe8,0xb8,0x53,0xd8,0xe8,0x1f,0x16,0xd2,0xdd,0x1f,0x50,0x37,0xf7,0x54,0x23,0x17,0xd4,0xd7,0xd7,0xf7,0xd3,0xd9,0x08,0x37,0x21,0xcf,0xf5,0x17,0xe3,0xd9,0xb6,0xe5,0x25,0xd0,0xee,0x27,0xd3,0x46,0x8b,0x12,0x21,0x26,0x74,0xaa,0x10,0x02,0xff,0x46,0x31,0x16,0x30,0xb2,0x0b,0x3e,0xc4,0x30,0x61,0xfe,0xf8,0x4c,0xb8,0xfc,0xee,0x19,0xf0,0xcd,0x1b,0x26,0x35,0x38,0x0c,0xe7,0xf0,0xfd,0xec,0xe5,0x3d,0xf0,0x08,0xd1,0x16,0x16,0x14,0xce,0x08,0xfa,0x25,0xfb,0xe6,0x26,0xd2,0xfa,0xff,0x04,0xf4,0x19,0x0b,0x01,0x07,0x17,0xf4,0x08,0xdc,0xc5,0x08,0xe0,0x4f,0x24,0xe6,0xd5,0x16,0x19,0xf9,0xe8,0xc6,0xc9,0xeb,0x21,0x06,0x2d,0x15,0xf2,0x1a,0xfa,0xff,0x0a,0xf2,0xfa,0xeb,0xa8,0x03,0xbe,0xd8,0xf4,0xf1,0xfa,0x35,0x33,0x46,0xc1,0xf7,0x2b,0xc3,0xcb,0xf6,0xd7,0xf5,0xf5,0x34,0x06,0xde,0x1c,0x2c,0xd7,0xbf,0xe8,0xca,0x22,0xff,0x58,0x14,0xe0,0xd9,0xef,0xd4,0x33,0x13,0xff,0x08,0x19,0xd7,0x81,0x01,0xf8,0xea,0xfb,0x2b,0x05,0x16,0x1b,0x0e,0xd8,0xdf,0x0f,0x1a,0xfe,0x15,0x03,0x2c,0x07,0x1c,0xf4,0xe5,0xe0,0xd9,0x03,0x03,0xff,0xc4,0x2f,0x49,0x12,0xde,0xd7,0xc9,0xf5,0xfb,0xfd,0x23,0x1e,0xf1,0x20,0xd7,0xd1,0x34,0x1e,0x29,0xf3,0x16,0xf7,0x34,0x21,0xd4,0x0c,0xe0,0xf8,0xec,0x2c,0x06,0xd0,0x2d,0x22,0x09,0x33,0x64,0xf2,0x32,0xef,0x1f,0xea,0xfd,0xaf,0xfd,0xf7,0xf0,0x02,0x2e,0xfa,0xcd,0xf0,0xec,0xea,0xf8,0xe7,0x07,0xe7,0xe1,0xde,0xfb,0x04,0xe6,0x00,0x00,0xe9,0x2a,0x51,0xdd,0x2d,0xf9,0xfe,0xdf,0xed,0xf3,0x12,0xba,0x81,0x1f,0x07,0xe2,0xe2,0x08,0xff,0x00,0x20,0xe3,0x28,0xf9,0xee,0xf2,0x01,0xfa,0x3c,0x1a,0x11,0xec,0xff,0x25,0x1e,0x29,0xfb,0x17,0xcb,0xcd,0x40,0xf2,0x03,0xeb,0xdf,0xce,0x07,0x0f,0x2d,0xec,0xe2,0x03,0x17,0x10,0xf8,0x16,0xf3,0xf2,0x0a,0xd4,0xee,0x3f,0xfd,0x1e,0x10,0x46,0xe7,0xe5,0xd5,0xba,0xed,0xff,0xf6,0x58,0x13,0xda,0x35,0xba,0xe2,0x1b,0x25,0xe7,0xf1,0xcc,0xb3,0x1e,0x44,0xed,0x0e,0xcc,0xe7,0xe5,0xeb,0x36,0xcb,0x57,0x0b,0xc7,0x32,0x1d,0x3c,0x18,0xd1,0xfd,0x06,0xdf,0x07,0xcf,0xe0,0x02,0x1d,0xed,0x2e,0xbf,0x0d,0xff,0x07,0xc7,0xf5,0xe6,0xd0,0xf5,0x00,0xf8,0x17,0xfe,0xfd,0xe8,0x3a,0xe7,0x2b,0x18,0x4f,0xf8,0x2e,0xfb,0x2d,0xa1,0x01,0xe9,0x81,0xe2,0xbb,0x00,0xcf,0xf3,0xc8,0xf9,0x57,0xc9,0x16,0xd2,0x22,0xe9,0x06,0xf2,0x14,0x15,0x4a,0xe9,0xf4,0x09,0xef,0x1a,0x97,0x20,0xdf,0xde,0x21,0xfc,0x0a,0xdb,0xd9,0x02,0xe9,0xf5,0xf9,0xf4,0x0f,0x2b,0x25,0x39,0x0a,0x36,0x20,0xf0,0xef,0x27,0xfd,0xeb,0x5d,0x08,0xe1,0xfe,0x46,0xea,0x50,0x11,0x0f,0x23,0xf2,0xd1,0x2d,0x0c,0x32,0xed,0x0b,0xd6,0x25,0xbc,0x7f,0x0e,0xe6,0xfc,0x17,0x47,0xe7,0x13,0x3e,0x15,0x1a,0x13,0xde,0x12,0x1d,0x31,0xee,0xe9,0x36,0xe8,0x24,0xe7,0x15,0x03,0x03,0x48,0x24,0xe3,0xeb,0x08,0x09,0xf9,0x20,0x17,0xe5,0xf7,0xec,0xf7,0x3b,0x17,0xaf,0xfd,0x02,0x77,0x22,0x14,0xe2,0xe8,0x1b,0xf0,0xe4,0x21,0xb1,0xcc,0xfe,0xec,0xac,0xc4,0xc7,0xc9,0x03,0xf8,0xde,0xd9,0xf3,0xc3,0xea,0xed,0xfb,0x0c,0x35,0x22,0x00,0x64,0x3b,0x09,0x0b,0x4e,0x16,0x22,0x06,0xf7,0x6d,0x09,0xab,0xed,0xf6,0x00,0x11,0xb4,0x0c,0xf6,0xf1,0x26,0xb2,0x2b,0x05,0x04,0x01,0xa3,0xd6,0x0c,0x57,0xe5,0x07,0x32,0xf2,0xf1,0x00,0xed,0x24,0xc1,0xed,0x12,0x45,0xce,0x35,0xfd,0xec,0x2f,0xd0,0xed,0xe8,0xe5,0x21,0x0e,0x0d,0x6c,0x68,0xcb,0xdd,0x20,0x23,0x30,0xea,0x20,0x18,0x1a,0xee,0xf1,0xaf,0xef,0xfb,0xe2,0xa3,0xc0,0xee,0xf2,0x7f,0x82,0x28,0x36,0x2e,0xf7,0x12,0x07,0xc3,0xee,0xe2,0x16,0xea,0x2f,0x0a,0xfc,0x0b,0xef,0x11,0xb6,0xcb,0x18,0xdc,0x0c,0x30,0x3c,0x0b,0x39,0x41,0xe3,0xe3,0x08,0xff,0x4c,0xbb,0xaf,0x09,0x6a,0x0a,0xd0,0xe6,0x1a,0x1b,0xea,0x29,0x27,0xdc,0xe2,0xc0,0x1e,0xff,0xcf,0x2c,0x37,0x3b,0x05,0xe8,0xb9,0x33,0xd0,0x00,0xdb,0x20,0xc7,0x41,0xc3,0x0a,0xf0,0x20,0x54,0x01,0x0b,0xd6,0xef,0x07,0x18,0x42,0xcf,0x26,0x5b,0xce,0xf2,0xea,0xfb,0x0a,0x2d,0xf8,0x02,0xe2,0xcd,0xd2,0x36,0x02,0x10,0x27,0x1b,0xca,0x33,0x34,0xdb,0xf5,0x33,0xdd,0x1a,0x0e,0x3c,0xd5,0xd9,0x16,0x15,0x15,0x0c,0xe4,0x15,0x1d,0x21,0x20,0x02,0xf0,0xe2,0x3f,0xd2,0x28,0x16,0xf7,0x3d,0xca,0xca,0x1e,0xc9,0xdf,0x2d,0xe4,0x21,0xe8,0xbe,0x21,0x2d,0x06,0xe5,0xfc,0x11,0xf9,0xfb,0x2c,0xeb,0x39,0x33,0x07,0x06,0x08,0xc0,0xee,0xe9,0xe5,0x81,0xf7,0x04,0x1c,0x39,0xff,0xf2,0x13,0x13,0xf7,0xc6,0x46,0xdc,0xad,0x04,0xf7,0x0b,0x09,0x04,0xde,0x20,0xdc,0x00,0xe3,0x16,0xd4,0xde,0xbf,0xba,0xe5,0x62,0xe7,0xf6,0xde,0xde,0xd9,0x30,0xee,0xf8,0x00,0x01,0xdf,0x05,0xdf,0xef,0x31,0xec,0xda,0x1c,0xf0,0x00,0x1b,0xbf,0xdc,0xc1,0x19,0xe4,0x2e,0xef,0x15,0x03,0xd8,0x1d,0xdd,0x02,0x2b,0x2b,0xf1,0xf8,0x3d,0x1d,0xfe,0x1f,0xce,0x37,0x35,0xd6,0x0f,0xfb,0x20,0xb3,0xe3,0x33,0xf7,0xc9,0xd3,0x0e,0xe8,0x07,0x1a,0xea,0x04,0xf4,0xf7,0x0c,0x13,0x4c,0x04,0xe2,0xd5,0x0e,0xbb,0x1f,0xde,0xfb,0x9e,0x99,0x12,0x8c,0xeb,0x43,0xe3,0xf8,0x09,0xe0,0x1a,0xe1,0xdc,0x16,0x0d,0x15,0x09,0x0b,0xbc,0xf5,0xfe,0x23,0x2f,0xe6,0x27,0xed,0xe1,0x21,0xd5,0x44,0xf1,0xe3,0xed,0xff,0xb1,0xeb,0xf6,0xe0,0x13,0xfe,0x41,0x08,0xf9,0x12,0xfb,0x1a,0xf7,0x3c,0x01,0xdf,0x7f,0x12,0xe2,0x76,0x24,0x19,0xf0,0xd3,0x5e,0xe8,0xeb,0x13,0xda,0x07,0x17,0xe6,0x0a,0x05,0xf6,0x17,0xd5,0xcf,0xe5,0x0e,0xc6,0x3e,0xd9,0x00,0xb1,0x16,0xec,0xce,0x23,0x6e,0xdd,0xdc,0x3c,0xd9,0xd8,0x13,0xde,0xf8,0x19,0xf8,0x63,0xca,0x11,0xa3,0xf3,0x86,0x0c,0x31,0x12,0x16,0x9f,0xe1,0xf0,0xb9,0x04,0xa3,0xea,0x01,0x12,0x19,0x38,0xd1,0x2e,0x44,0x01,0xfa,0xb8,0xcd,0xf1,0x02,0xd8,0x66,0xeb,0x45,0xea,0xca,0xf1,0xb7,0xe9,0xf2,0xe4,0xc5,0x08,0x02,0xf9,0x14,0xfe,0x11,0x33,0x2e,0xe1,0x21,0x34,0x13,0x2a,0xf0,0x24,0xcc,0xb9,0x36,0xd1,0xbf,0xbf,0xcf,0x59,0xc7,0x81,0x13,0xa2,0xfb,0x0d,0xf3,0xdc,0x0d,0xc7,0xf5,0xd8,0xbe,0x05,0xd5,0xe6,0x23,0x76,0xda,0xf3,0x19,0x26,0xfb,0x34,0xd9,0x13,0x40,0x0d,0x9f,0x41,0x7b,0xfb,0x04,0x1b,0xcc,0x32,0x21,0x1c,0x15,0x1b,0xee,0x4e,0xe5,0x0c,0x04,0x46,0xe4,0xfd,0xd8,0xf1,0xf3,0xe8,0x14,0x21,0xed,0xfc,0x0f,0x2e,0xf3,0xf1,0xcc,0xd5,0xfa,0xeb,0xe6,0x25,0x7f,0x0f,0x15,0xf5,0x1a,0x24,0x53,0x1a,0x5b,0xee,0xde,0x00,0x55,0xf4,0xf9,0xe1,0xd9,0x05,0x27,0xd3,0x46,0x22,0x0a,0x05,0x39,0xe0,0x0c,0x2f,0xdb,0xfd,0xfe,0x13,0xcf,0xb3,0xc1,0x0c,0xe3,0x08,0xde,0xe5,0x24,0xe7,0xd3,0x34,0xfa,0x0b,0x10,0x33,0xe3,0xd9,0x01,0x09,0x14,0xed,0x21,0xdc,0xf4,0xc0,0x1f,0x54,0xcc,0x2b,0x15,0xf3,0xf4,0xc1,0x12,0x14,0xfd,0xe0,0xee,0x08,0x0c,0xdc,0xdf,0xe0,0x03,0x04,0x0e,0xe9,0xd7,0xfd,0xfc,0xee,0x00,0xf3,0xfc,0xfb,0xf6,0x07,0xee,0x16,0xf4,0xfa,0xfc,0xff,0xf2,0xda,0x03,0x03,0x05,0xdf,0xfa,0xef,0x66,0x26,0xb2,0x14,0x0a,0x13,0x05,0xff,0x0b,0x3e,0x19,0x1a,0x13,0x0f,0x4a,0x18,0x0d,0x33,0x0e,0x04,0x01,0x42,0x3b,0x35,0x1d,0xeb,0x18,0x16,0x1f,0x0d,0x0b,0x36,0x16,0x21,0x15,0x19,0xcd,0x13,0x23,0xf8,0x14,0x02,0x19,0x3e,0x1e,0x10,0x2a,0x0d,0x41,0xfa,0x0c,0x00,0x07,0x21,0x19,0x2f,0x18,0x04,0x24,0xf4,0x06,0x11,0x1e,0x02,0x25,0x3b,0x16,0x08,0x0c,0xfc,0xd6,0x07,0xe8,0x1e,0xea,0x08,0x10,0xf6,0x10,0x7f,0x1a,0x01,0x1b,0x2f,0xf9,0x26,0xf6,0x13,0xe7,0xe6,0xef,0x33,0xfa,0x22,0xe3,0x19,0xf9,0x14,0x20,0x11,0x24,0xee,0xf9,0xfa,0xeb,0xec,0xf6,0xf8,0x23,0xdc,0x05,0x15,0x0c,0xf3,0xfd,0xde,0x3c,0xfb,0xe0,0xf3,0x2c,0x1e,0x08,0xf7,0x0e,0xe9,0xeb,0x06,0x3c,0x11,0xf3,0x39,0xf7,0xf2,0x16,0xe8,0xdc,0xe5,0x18,0x3b,0xbc,0x07,0x24,0x06,0xed,0xe6,0xcb,0x12,0x06,0xef,0x25,0x1e,0x0b,0x1f,0xb3,0x08,0x50,0x1b,0x14,0x02,0x1e,0x11,0x8b,0x13,0xf2,0x18,0xbe,0xba,0xda,0x20,0x3f,0xdc,0x38,0xe7,0xea,0x2a,0x69,0xd3,0x26,0x07,0x11,0x04,0xd2,0x10,0xdd,0xe8,0x3c,0x0c,0x0c,0xec,0xe7,0x19,0x02,0xbe,0xbc,0xf8,0xed,0xe7,0xfd,0xf4,0xdb,0x33,0x18,0x00,0xda,0xd6,0x7f,0x3c,0x17,0xb1,0xcb,0x67,0x2f,0xc0,0x28,0x48,0xaf,0xe2,0x1e,0xf7,0xe7,0xdd,0x1f,0xdf,0x27,0x09,0x09,0xf8,0xd0,0x3e,0x19,0x32,0x13,0xd5,0xe7,0xdb,0x1b,0x28,0x95,0x17,0xf1,0xcf,0xb5,0x20,0x00,0xf5,0xf6,0xd3,0x3f,0xdc,0xe1,0x0d,0xfb,0x32,0xe0,0x09,0x1e,0xe2,0x31,0xdd,0x02,0x1c,0xc7,0x0b,0xf2,0xdb,0x48,0xf4,0x20,0xf0,0x14,0x3a,0x1b,0xcd,0xd4,0xf5,0xf0,0xc1,0x81,0xef,0xf1,0xd8,0xf3,0xac,0xce,0x01,0xa9,0x39,0x24,0xea,0xe0,0x13,0xf1,0x3d,0xc0,0xe2,0xd8,0xce,0x2d,0x21,0xe9,0xde,0xc0,0x70,0xd3,0xd8,0x03,0xf6,0xc2,0x24,0x04,0xd1,0x07,0x1b,0x06,0xfb,0x06,0xfb,0x15,0xb9,0x1d,0xd4,0xd3,0xce,0x0a,0x0e,0x0b,0x35,0xc5,0x1a,0x11,0xd7,0xf4,0xfd,0xfe,0xe1,0xec,0x2b,0x26,0xac,0x76,0x25,0x40,0xe4,0x03,0xa9,0xb6,0xf6,0xf1,0x07,0x2e,0x1f,0xf2,0xf7,0x28,0x07,0xf2,0x37,0xd6,0xef,0xf2,0x21,0xe8,0xe9,0xed,0x3e,0xfb,0x2b,0x01,0xf2,0x06,0xe3,0xb2,0xed,0x08,0xe1,0xee,0xd8,0x0d,0xe8,0xd9,0x17,0x3c,0xfd,0xd4,0xb2,0x24,0x27,0x18,0x18,0xf6,0xdf,0xf4,0xd9,0xf7,0xfa,0x18,0x66,0x13,0x22,0xf9,0xd8,0xcc,0x3b,0x22,0xc8,0x03,0xe1,0x71,0x4a,0x09,0xf5,0x12,0x03,0x0d,0x26,0x0d,0xea,0xf5,0xcc,0xe4,0xf4,0x22,0xab,0x08,0x1b,0x5d,0xbf,0x6b,0xe4,0xfb,0x21,0xde,0xe2,0x53,0x24,0x33,0x06,0x11,0xc8,0x0c,0x0f,0x12,0x05,0xfd,0xe3,0xf5,0x1e,0xdd,0x41,0x07,0xd0,0xe1,0xcd,0xbf,0x17,0x24,0x2e,0xe8,0x20,0x08,0x01,0xb9,0x4b,0xd1,0x2e,0xf8,0xf5,0x2a,0xf6,0xfd,0x1d,0x10,0xc0,0xd9,0xda,0x1d,0x2d,0x18,0x28,0xfb,0x5d,0x32,0xbc,0xf7,0x41,0x03,0xe6,0xdc,0x3a,0x1d,0x14,0xb2,0x04,0x7f,0xec,0xf1,0x26,0xea,0x2b,0xe4,0xed,0x13,0x0e,0xe0,0x04,0x08,0x0a,0x1a,0xf7,0xf4,0x2c,0xcc,0x27,0x3c,0xe8,0x37,0xbb,0x2f,0x35,0x18,0x32,0x11,0x41,0xa4,0xe4,0xff,0xeb,0xea,0xfc,0xde,0x00,0xda,0xc1,0x4a,0xd4,0xd7,0xc4,0x33,0xcf,0x27,0x20,0xcb,0x34,0x06,0x08,0xca,0xcb,0x47,0xdc,0xea,0x28,0xd0,0xdd,0xe1,0x24,0xd6,0x04,0xbf,0x0a,0x30,0x23,0x00,0xdb,0x14,0xf9,0xf3,0xf3,0x52,0xdd,0xd5,0xc7,0xa9,0x19,0xc8,0xff,0x19,0x20,0xdc,0x43,0xf4,0xd2,0x0b,0xcf,0x20,0xd0,0x22,0x3b,0x17,0x31,0xa6,0x7f,0xe0,0x57,0x08,0x61,0x1a,0x25,0xe7,0x27,0x27,0x20,0x0d,0xc0,0x0e,0xe2,0x2e,0xf0,0x06,0xf1,0x0f,0xe5,0x09,0x11,0xd9,0xdd,0x25,0x96,0x27,0xde,0x03,0x1f,0xff,0x1d,0xfa,0xe6,0x02,0x35,0xf9,0xfa,0x43,0x29,0x33,0xf8,0xf1,0xc1,0x3e,0xe6,0x26,0x2a,0x1b,0xd4,0x1c,0x2d,0x00,0x8f,0xe5,0xdb,0x14,0xfc,0x96,0x41,0xf7,0x04,0x16,0x1a,0xc3,0xfb,0xec,0x4b,0x01,0xa3,0x07,0xe3,0xca,0x15,0xa4,0x2f,0x01,0x25,0x7f,0xee,0xe6,0x21,0x53,0xde,0x35,0x01,0x08,0x13,0x05,0xd2,0x3f,0xd5,0xf8,0x2b,0x18,0xaf,0xe5,0xd0,0xfc,0x66,0xf2,0xd8,0xfc,0x14,0xbf,0x0c,0xe6,0x53,0x17,0x26,0x24,0x46,0x2b,0xe5,0x14,0xf5,0xde,0x1a,0xdf,0xe2,0xf9,0x46,0x22,0x02,0xf2,0xc7,0xa6,0xcb,0xbc,0xf9,0xe9,0x4c,0xc6,0x33,0xe7,0xab,0xd8,0x07,0x09,0x4f,0x0c,0x1e,0xe6,0xd2,0x2c,0xca,0xf1,0x41,0xca,0xf8,0x17,0xf6,0x31,0x34,0x01,0xdd,0x2a,0xed,0xf1,0xb9,0xe1,0xfe,0x26,0x42,0x2d,0x1b,0x3f,0xf7,0x14,0xec,0x08,0xf1,0xea,0x12,0xcc,0xd3,0x24,0xf9,0xc0,0xe0,0xea,0xfb,0x26,0xfb,0x1c,0x20,0x1b,0xc4,0x37,0xfc,0x1e,0x15,0xfb,0x09,0x2d,0x14,0x0d,0x3d,0x1e,0x03,0xf2,0xf2,0xd4,0xf4,0x35,0xf7,0x0f,0xf2,0xe7,0x35,0x21,0xf2,0xc6,0x0a,0x31,0xee,0xf4,0x2d,0x0a,0x14,0x15,0x0a,0x1d,0x01,0x14,0xf6,0xfb,0x2a,0x2e,0x3d,0x30,0x03,0x0c,0x2a,0x2d,0x04,0xf0,0x1e,0x0f,0xee,0x05,0x3e,0xe5,0x4d,0xfe,0xe1,0xea,0x2c,0x47,0xe8,0x4d,0x7f,0xd4,0x2d,0xae,0xe6,0x00,0x0a,0x28,0xf2,0xe9,0x34,0x0b,0xd8,0x59,0x2b,0xfe,0x23,0x14,0x3c,0x01,0x28,0xe2,0xfd,0x0c,0x21,0xef,0x21,0xc3,0x35,0x2e,0x32,0xe5,0x0d,0xf7,0xf2,0x3c,0xfd,0x68,0xc8,0x23,0x19,0x73,0x06,0xe2,0x23,0x24,0x2f,0xf2,0xff,0x1d,0x0b,0x24,0x31,0x1b,0x1a,0x14,0x07,0xe8,0xeb,0x34,0x00,0xf7,0x2b,0xea,0x12,0x35,0x58,0xc8,0xfe,0xf5,0x24,0xfa,0x23,0x15,0x0d,0xde,0xfe,0x52,0xf5,0xfd,0x21,0x32,0x11,0x18,0xd2,0x0b,0x0d,0x3a,0xd2,0xba,0xb1,0x04,0xe7,0x02,0x29,0x64,0xa5,0x2d,0x4e,0x0f,0x99,0xfe,0x0f,0xc2,0x00,0xdd,0xec,0xf6,0xab,0x15,0x0a,0xd1,0xe3,0x4d,0xe5,0xda,0x16,0x0c,0x12,0xe9,0x93,0x29,0xe4,0xf1,0x09,0x55,0xfb,0xe3,0x07,0x10,0xea,0xcf,0x28,0xde,0x00,0x41,0xeb,0x26,0xd4,0xcb,0xfc,0x35,0xe7,0xb8,0xce,0xeb,0xd0,0xf8,0x01,0x00,0x07,0xfe,0xc4,0xea,0x39,0x07,0x21,0x28,0x24,0x0d,0xe9,0xb9,0xfc,0x23,0x0e,0xe2,0x5f,0x11,0x21,0xc7,0xee,0xcd,0x36,0x03,0xf9,0xe7,0xf5,0xee,0xec,0xf9,0x7f,0xcf,0xfc,0xed,0xff,0xea,0x0a,0xd9,0x01,0x28,0xda,0xff,0x0a,0xff,0xdc,0xcf,0x2e,0x03,0x40,0x01,0x1c,0x16,0xdb,0xd8,0xe1,0x1a,0x23,0x1d,0xf0,0xf3,0xe3,0x7f,0x33,0xea,0xed,0xfd,0x05,0x2f,0xe7,0x09,0x09,0xf1,0xe0,0x1c,0xf7,0x27,0xf3,0xb3,0x70,0xd2,0xee,0x1c,0x4b,0xdd,0x3d,0x05,0xd0,0xf1,0xe6,0xe2,0x0c,0x03,0xd3,0xe7,0x09,0x17,0xfd,0x0f,0x22,0x07,0x22,0xbf,0x40,0x0d,0xe7,0x3b,0x39,0x1d,0xf8,0xc5,0xcd,0xb0,0xf6,0x30,0xc2,0x12,0x2d,0xf7,0xd8,0xf9,0xd8,0xdc,0x01,0xee,0xd4,0xd7,0xdc,0xff,0xe8,0x05,0xf2,0xe1,0x0a,0xf4,0x64,0x1f,0xf1,0xf3,0xd4,0x2a,0xda,0x29,0xde,0x04,0x40,0x15,0x0b,0x2a,0xf8,0xea,0x02,0x9a,0xf6,0x22,0x01,0x12,0xc4,0x1d,0x2d,0x41,0x1c,0xcd,0x77,0xaf,0xeb,0xee,0xf0,0x04,0xf5,0x20,0x35,0x12,0xe8,0x7f,0xf6,0x1e,0xc4,0xca,0x1e,0x15,0x4c,0xd1,0xf2,0xea,0x73,0x00,0xe7,0xfd,0x07,0x1b,0xea,0xb2,0xdf,0xf9,0x0d,0xd6,0x3e,0xa3,0xc8,0x0b,0x20,0xe7,0xfa,0xf7,0x0a,0x22,0x69,0xc4,0xc7,0xd2,0x22,0xc0,0xcc,0x29,0xad,0xef,0xe7,0x35,0x27,0x3b,0x1a,0x07,0xd2,0x0d,0xd3,0xc9,0x1d,0x31,0x02,0x0d,0x22,0x31,0x06,0xfd,0x14,0x2c,0x0c,0x20,0x93,0xf0,0xaa,0xe8,0xfb,0x01,0x07,0x2a,0x1c,0x1a,0x06,0xec,0xff,0xe5,0x4a,0x14,0xba,0x08,0xbd,0x79,0xd2,0xf9,0x0a,0x24,0x14,0x12,0xe1,0xa9,0x24,0xc9,0xdc,0xe3,0x27,0x28,0x20,0x18,0x34,0x25,0x27,0xb7,0x93,0x12,0xf7,0x06,0x15,0xf0,0x20,0x30,0x00,0xf2,0x6c,0xd9,0xfd,0x14,0x3c,0x03,0xf6,0x09,0xe3,0xfc,0xe5,0xd3,0x02,0xde,0xc4,0xe3,0xe2,0x2b,0x27,0x38,0xe1,0xe8,0x16,0x26,0xd8,0xd0,0xdf,0xcd,0xc9,0x1e,0xc4,0x33,0xf8,0x58,0xd4,0x2e,0x2e,0xfd,0xd2,0x02,0x41,0xd6,0x09,0xf0,0x0c,0x5e,0xf0,0xf4,0xed,0xea,0xf8,0x41,0x09,0xe6,0xd0,0xfe,0xf4,0xda,0x32,0xda,0x3d,0xe6,0xfc,0x36,0x37,0xea,0x12,0xf7,0x0b,0x33,0x08,0x1b,0x01,0x2a,0xe1,0xda,0xf5,0x1d,0x11,0x11,0xfe,0xff,0xef,0xcf,0x3d,0x7f,0xe3,0xf1,0xdc,0x06,0xe0,0x1d,0xe2,0x09,0x23,0x18,0xf0,0x2e,0x0e,0xfb,0xfd,0x0b,0x29,0xf1,0xf2,0x18,0xf2,0x09,0xf3,0x09,0x20,0x3f,0xd2,0xce,0x29,0x54,0xe3,0x31,0xd2,0x1a,0x1d,0x0b,0x17,0x0e,0xd2,0xe9,0x08,0x39,0x16,0xde,0x09,0x1d,0x22,0x0c,0xd0,0x17,0xf1,0xea,0x19,0x3d,0x60,0x16,0x45,0x23,0x0b,0xc9,0xce,0xdc,0xce,0xf7,0x1b,0xe4,0x15,0xf3,0x02,0x11,0x04,0x5b,0x2a,0x0d,0x52,0x55,0xf4,0xc4,0x26,0x07,0xef,0x2d,0x7a,0x0b,0x31,0x6f,0x15,0xf3,0xf0,0x38,0x28,0xfa,0x26,0xd3,0x08,0xf0,0xe1,0x02,0xe5,0x23,0x0e,0xfc,0xdf,0xfa,0x23,0xff,0x7e,0x04,0x2c,0x08,0xe8,0xe9,0x11,0x51,0x61,0x1e,0x24,0x21,0x57,0xcf,0x29,0xfc,0x1c,0xdb,0x23,0x3f,0x25,0xf5,0x07,0xfd,0xf7,0xeb,0x0e,0xf8,0x0e,0x20,0xe9,0xf6,0x04,0x25,0xe5,0x1a,0xe8,0x23,0x60,0xe6,0x32,0xf0,0xec,0xf8,0xec,0x7f,0x00,0x20,0x6b,0xd7,0xf6,0x6f,0x10,0x05,0x3d,0xec,0xf0,0x24,0x21,0xdb,0xe0,0xcd,0x38,0x15,0x31,0x46,0xd3,0xf4,0x0f,0x12,0x00,0x1e,0x12,0x17,0xdd,0xfa,0x10,0xf0,0xfb,0x28,0xda,0x1b,0xfb,0x27,0x01,0x04,0xe4,0xcc,0xec,0x0b,0x18,0x26,0xe0,0x48,0xe5,0xcd,0x16,0x12,0x0c,0x24,0xea,0x1a,0xee,0x25,0x38,0x1a,0x0e,0x29,0x0c,0x26,0x02,0x28,0xf4,0x06,0x3a,0x11,0xf4,0xfb,0x00,0x08,0x02,0x15,0xe4,0xf0,0xf9,0x0b,0xfc,0x36,0x33,0x0f,0x04,0xf9,0x20,0x19,0x01,0x5a,0x10,0x25,0x43,0x11,0x08,0xe3,0x22,0x2e,0xf2,0x26,0xfc,0xd6,0x34,0x16,0x00,0x2e,0x19,0xdb,0x01,0x21,0xf1,0xdf,0x1d,0x16,0xfa,0x26,0xce,0xe9,0xe3,0xd6,0x22,0x35,0x06,0xf4,0x1d,0x06,0x2c,0xfd,0x1e,0x52,0x0e,0x0f,0x19,0x7f,0xfc,0xe5,0x07,0x20,0xe3,0x22,0x01,0x03,0x1c,0x0a,0x2a,0x0d,0x32,0x26,0x01,0xdd,0xf1,0xb2,0xfb,0x05,0xc6,0xf4,0xc9,0x03,0x0c,0xf5,0xf0,0xdc,0xf2,0xf6,0xef,0x0d,0xb7,0xf0,0x11,0xc2,0x36,0xd2,0x15,0xd9,0xd2,0x7f,0xdf,0xd2,0x1d,0xec,0x18,0x01,0xc3,0x0a,0xfe,0xfc,0xda,0x17,0x37,0xeb,0x56,0xd7,0x0f,0xa8,0xfb,0xb4,0x35,0xde,0x38,0x2a,0xa3,0xf1,0xd7,0xe5,0x2b,0x0b,0x02,0xcd,0x2a,0x42,0xd5,0xf0,0xed,0xfc,0x10,0x2c,0x0f,0x0a,0x18,0xe0,0x45,0x27,0xde,0xfd,0xe6,0xdf,0xf1,0xfd,0xea,0xaf,0x26,0xfe,0x0f,0x09,0x4c,0xbc,0x33,0x0f,0xf6,0x13,0xec,0x2e,0xf3,0xf8,0xe7,0xf9,0xea,0x04,0x42,0x10,0x09,0xdf,0xdf,0xfe,0xfb,0xac,0xe9,0xb3,0xc9,0x18,0xe9,0x07,0xf4,0xdd,0xeb,0x0a,0xf3,0x1f,0xde,0xad,0xf5,0x19,0x60,0x1a,0xdc,0xb6,0xe1,0x14,0xf2,0xba,0x3c,0x0c,0x20,0x0f,0x38,0xe5,0xe5,0xe9,0x34,0xfa,0xbf,0x48,0xa3,0xc3,0x0a,0x28,0x13,0xfe,0x17,0xf6,0x3a,0x59,0x34,0xf1,0x0a,0x1e,0xe8,0x9d,0xf8,0x1c,0xdb,0xdb,0x50,0xc6,0xdd,0x31,0xcc,0xc4,0x0d,0xb1,0xb3,0x48,0x1b,0x35,0xca,0x30,0xce,0xd1,0x81,0x64,0x95,0x4f,0x31,0xd1,0xe5,0xe1,0xf2,0x05,0xda,0xc1,0x20,0xf6,0xa4,0x02,0x12,0xe5,0xa1,0xd0,0xf6,0x2f,0x23,0xdc,0x28,0x35,0x4c,0x28,0xe0,0x05,0x07,0xc7,0x18,0xc3,0x01,0xc4,0xf3,0xdc,0xec,0x2d,0x02,0x12,0x0e,0x18,0xe0,0x08,0xe1,0x0b,0xcf,0x0d,0xe1,0xb5,0x34,0xbb,0xf3,0x07,0x2f,0x11,0xfc,0xfc,0x42,0xf2,0x15,0x3a,0x55,0xf2,0xf2,0xd9,0xfb,0xcc,0xdc,0x35,0x13,0x11,0x0a,0x03,0xe9,0xf7,0xf9,0x5c,0xe3,0xee,0xd4,0x19,0x34,0xec,0x49,0x16,0x29,0x0e,0xd7,0xe0,0xcf,0xef,0x21,0xfc,0xf2,0x11,0x0c,0xf5,0x14,0x1b,0x17,0xbd,0x08,0x2c,0xfa,0xf3,0x41,0xc2,0x00,0xef,0xd7,0x25,0xf6,0x03,0x00,0xd6,0x10,0xfc,0x59,0x08,0xeb,0x32,0xbf,0x1a,0xb9,0x22,0x40,0x2f,0x6a,0x1f,0xff,0x11,0xf8,0xe9,0xf0,0xd9,0xcd,0x00,0xdd,0xe1,0xcd,0x58,0x06,0xd2,0xf2,0xa8,0xf3,0x06,0x21,0x18,0x1a,0x06,0x14,0xe0,0xf5,0x2c,0x1f,0x24,0x0f,0xc5,0xf9,0x05,0x28,0xcd,0x06,0xe0,0xc3,0x22,0x16,0x16,0x0f,0x32,0x2d,0xfe,0x1a,0xf8,0xf7,0x29,0x28,0xd7,0x19,0xeb,0x4b,0xe6,0x07,0x19,0xd9,0xf6,0x05,0x03,0x08,0xc3,0xea,0xfb,0x2d,0xb6,0xe8,0x02,0x31,0xcd,0xdf,0x7f,0xf3,0xfc,0x17,0x04,0x12,0x3c,0xf3,0x6b,0x05,0x02,0xeb,0x4a,0xf8,0x33,0xe8,0x23,0x3b,0x07,0x35,0x4a,0xf3,0x81,0xf7,0x21,0x0e,0x49,0x1b,0x05,0x30,0xb7,0x37,0x21,0xf1,0xee,0x16,0x2b,0x10,0x0c,0x0c,0xdc,0x30,0x02,0xe9,0x29,0xcc,0x2d,0xea,0xfd,0x21,0x02,0x15,0x2a,0x10,0xff,0xf4,0x0b,0x10,0xf8,0x21,0x35,0xfc,0x0c,0xef,0xed,0x18,0xfb,0x02,0x22,0x02,0x2e,0xda,0x35,0x00,0x11,0xe1,0x26,0x09,0x4b,0x12,0x00,0x03,0x13,0x1d,0x2c,0x25,0x36,0xf5,0x0f,0xf6,0xfe,0x05,0x0e,0x31,0x06,0xe4,0x0f,0xe9,0x2a,0x1e,0x09,0x35,0x07,0xfb,0xd1,0xd3,0x04,0x2a,0xfc,0xfc,0x28,0xfd,0x20,0x34,0x27,0x03,0xef,0x1e,0x2b,0x0c,0xfc,0x13,0x2f,0xdc,0xfc,0x0a,0xe0,0x1b,0x6d,0x08,0xfe,0x35,0xd3,0xec,0xd8,0xf2,0xd7,0x07,0x1e,0xd5,0x06,0xf4,0xe8,0xec,0x0e,0xf9,0xdc,0xec,0x0c,0xf8,0xfc,0x64,0x2c,0xd0,0xf8,0x1a,0x2b,0xcf,0xaf,0x1d,0x3c,0x04,0x22,0x0b,0x2a,0xe4,0x3d,0x09,0xf8,0xcf,0xde,0xf9,0xb8,0xae,0xc9,0xea,0xd7,0xd4,0x1a,0xec,0x40,0x20,0xe4,0xdc,0x22,0xda,0x0a,0xe4,0x5b,0xaf,0xd6,0xf2,0x1f,0x1a,0x1a,0x04,0xf0,0xf2,0x0f,0x1f,0xfe,0x22,0x4d,0xea,0xcb,0xec,0xfe,0xef,0x3a,0xf2,0x2c,0x26,0xd5,0xfc,0x7f,0x79,0xd4,0xb3,0xf9,0x0b,0x05,0x32,0xdf,0xd5,0xce,0xbe,0x12,0xe1,0xfc,0xfe,0xf2,0xe8,0x2f,0x24,0xfa,0xf3,0xfd,0x1a,0xc8,0xfe,0xea,0x18,0x09,0x12,0xca,0xe7,0x62,0xf8,0xe6,0xfc,0xf6,0xce,0xe6,0x16,0xf4,0x7b,0x20,0x08,0xf4,0xf3,0xf3,0xdf,0xfa,0xfa,0x22,0x01,0x30,0x42,0x2d,0x0f,0x3c,0xe7,0xdf,0x1b,0xfb,0xe7,0x05,0x2b,0xd2,0xe2,0x07,0xd2,0x0b,0x0d,0x16,0x3f,0x9a,0x14,0x0b,0xf6,0xd4,0xfa,0xfc,0xc8,0x47,0x1f,0xe1,0x7f,0x3e,0xd5,0x02,0xec,0x19,0xf6,0x23,0x13,0x1c,0xf7,0xea,0xe9,0x19,0x1b,0x57,0xe0,0xe8,0x16,0x2e,0x10,0x0a,0x1e,0x24,0x1d,0x1f,0x23,0xe4,0x26,0x20,0x2f,0xf9,0x3f,0xe2,0xe2,0xca,0x2e,0xfe,0xfe,0xfe,0x07,0xbb,0x07,0x0f,0x01,0xf9,0x62,0xf0,0x09,0x19,0xfd,0xee,0x16,0xfa,0x26,0x28,0x01,0x24,0x05,0x10,0x4a,0xeb,0xf2,0xf1,0x02,0x17,0xfc,0xf8,0xfe,0x05,0xe7,0xff,0x31,0x32,0x03,0xfc,0x01,0xfb,0xfb,0x19,0x15,0x21,0x03,0x11,0x57,0x22,0xf5,0xde,0xe3,0xc1,0x35,0x06,0x25,0x37,0x27,0xe9,0x81,0x19,0xfc,0xed,0x16,0xee,0xe4,0xd2,0x5b,0x36,0xbc,0xe1,0xf3,0x42,0x0d,0x10,0xf5,0xf3,0xf6,0x06,0x3a,0xfc,0xe1,0x0e,0xc4,0xfc,0xf9,0x49,0xc0,0x24,0x09,0x0a,0x35,0xfb,0xb7,0x2d,0x20,0xd0,0xc6,0xe0,0xfd,0xc2,0x28,0x04,0x07,0xc3,0xd8,0xfa,0x07,0x32,0x25,0xbd,0x26,0xda,0x13,0x2c,0x1f,0x06,0x2d,0x12,0x07,0x2d,0xea,0x04,0xef,0xc5,0xb2,0xed,0x03,0xaa,0xd7,0x14,0xf0,0xf5,0x0f,0xde,0x00,0x19,0x3a,0xf1,0x1b,0x20,0x16,0xf5,0xc4,0xe5,0xb3,0xd3,0xb0,0xf3,0xec,0x10,0x0f,0xd4,0x14,0x13,0xea,0x19,0xe6,0x0d,0xef,0xe5,0xf1,0x14,0xfd,0x31,0xeb,0xce,0xaa,0xb7,0x0e,0x1f,0x02,0xfc,0x21,0xbd,0xf6,0xf3,0x0a,0xfb,0x1d,0xdb,0xb8,0xef,0xd2,0x28,0xee,0x0f,0x29,0xf1,0x14,0x23,0x0e,0xf7,0x4b,0x2b,0xfa,0x1f,0x0b,0x21,0x01,0x11,0xfc,0x14,0x3a,0x60,0x16,0xe5,0xf4,0x19,0x06,0x14,0x55,0x5d,0xd5,0xf7,0xfe,0x11,0x6a,0xe9,0x2a,0xe8,0x36,0x67,0x04,0x24,0xef,0x13,0x39,0xe7,0xf7,0xf6,0xea,0xf3,0xfc,0xfd,0xe6,0xf9,0xe0,0x53,0x1d,0xf2,0x13,0x25,0x69,0xf0,0x3c,0x10,0x3a,0xf2,0xff,0x40,0x1c,0x17,0x08,0x28,0x3a,0x18,0x00,0x27,0xd6,0xbf,0xff,0xb3,0x23,0xd0,0xd3,0xdb,0x12,0xff,0xf0,0xe8,0x21,0xe7,0xcd,0x33,0xff,0x20,0x06,0x03,0xef,0x25,0x52,0x01,0xcb,0x4a,0x05,0x0f,0xd4,0x09,0xec,0xfc,0x36,0x33,0x05,0xfc,0xcc,0x2e,0xe4,0xe3,0xc5,0x39,0xd1,0x40,0x7f,0x23,0xd3,0xc5,0xdd,0x12,0x3e,0x2b,0xe3,0xef,0x56,0xaa,0xc7,0x24,0x06,0xe6,0xc3,0xed,0xb1,0xb2,0x4a,0x50,0xf1,0x2c,0xd1,0xdf,0xc9,0xf0,0xdf,0xe6,0x02,0x03,0x08,0xe3,0xd0,0x40,0xf0,0xd6,0x2d,0x0c,0xcc,0xde,0x49,0x4a,0xd7,0x1d,0x81,0x39,0xdd,0xb3,0x33,0xdd,0xde,0xc8,0xd6,0xda,0xfe,0xfd,0xcd,0x1b,0x12,0x34,0xfa,0xf6,0x17,0x13,0x0c,0xfe,0xba,0xe4,0x08,0x47,0xee,0xf7,0xf1,0xe0,0x16,0x9e,0x13,0x68,0x39,0xb1,0x07,0xb5,0x0e,0xda,0xc7,0xcb,0x0e,0x11,0xfa,0x6b,0x10,0xf5,0xd9,0xfc,0xcf,0xea,0x08,0xf7,0xe6,0xf7,0x4f,0xde,0x1f,0x19,0x0c,0xb9,0x2a,0xf9,0x1e,0xe4,0xf6,0xc1,0xb8,0xea,0x32,0xd1,0xff,0x14,0xd4,0x67,0x10,0x06,0xe3,0xd8,0x5c,0x1b,0xd5,0x0b,0x65,0xf6,0x3b,0x24,0xd8,0x1b,0xfc,0x0b,0xed,0xde,0x71,0xb2,0x3b,0x46,0x1e,0xfa,0xe3,0x10,0x15,0xf0,0x3e,0xfb,0xb8,0xf4,0x07,0xcd,0x4e,0x5c,0xed,0xc7,0x38,0x02,0x55,0xfd,0xe5,0xae,0xcb,0xd6,0xfb,0xac,0x6f,0xf7,0xcd,0x14,0xea,0x16,0x03,0x25,0x15,0x3e,0xe0,0x20,0x17,0xa8,0xe9,0xf1,0x26,0xe3,0x0d,0x27,0x02,0xb8,0x3d,0x4b,0xd6,0xdc,0x02,0xe0,0xd4,0xfb,0xd2,0x3b,0x51,0xd5,0x28,0xdd,0x1e,0xc5,0xb6,0x72,0xed,0x0b,0x3a,0xba,0x0c,0xd1,0x02,0xdf,0xf1,0x02,0xe1,0xe4,0xe4,0xe4,0xf3,0x26,0xf7,0x40,0x09,0x05,0xe4,0x23,0x19,0xc1,0xf3,0xc4,0x0f,0xc6,0x21,0x0f,0x39,0x4b,0x17,0xce,0x5f,0xfd,0x12,0x0d,0xd2,0x7f,0xf6,0xfd,0x2a,0xe2,0x17,0xc2,0x41,0x0d,0x29,0xed,0x10,0x38,0xf0,0xf8,0xd2,0x15,0x1c,0x39,0x4e,0xed,0x0d,0xaa,0xd5,0xe2,0x17,0x7f,0xa5,0x14,0xde,0x3b,0x69,0x06,0x0a,0xfc,0xff,0x2e,0x12,0x39,0x05,0xee,0x6f,0xee,0x26,0x06,0xbb,0x01,0xf5,0xaa,0x3c,0xe7,0xb9,0x1b,0xe7,0x90,0xd2,0x41,0x37,0x0e,0x38,0xf2,0x2e,0x16,0xdb,0x0f,0x03,0xc2,0x05,0x12,0xe1,0xe0,0x25,0x23,0xd7,0xd6,0xef,0xf8,0xf7,0xf9,0xb6,0x0a,0x2a,0x0c,0x05,0xe9,0xd9,0xdf,0x25,0x08,0x2a,0x24,0x30,0xdb,0x2e,0xf4,0x2a,0x0a,0xd0,0xc5,0x32,0xd8,0xf3,0xef,0x11,0xf1,0x25,0xc8,0x2d,0x02,0x1f,0xca,0x12,0x1f,0x14,0xe9,0x26,0xec,0x0e,0x09,0x06,0x07,0xf3,0x18,0x24,0x1d,0xfc,0x1c,0xf8,0xe5,0xd1,0xde,0xea,0xa5,0x14,0x34,0xd1,0x6a,0x1a,0xbf,0xfe,0xdf,0xe7,0xda,0xf4,0xe9,0x03,0x04,0x81,0x1f,0xdd,0xdb,0xf5,0x19,0xbe,0xdd,0x0a,0x1b,0xfa,0xee,0xde,0xef,0x04,0x16,0x1e,0xe6,0xf2,0xc9,0xaf,0xf6,0xe7,0x43,0xe7,0xfe,0x3b,0x1b,0x0a,0x10,0xce,0x00,0xf8,0xf8,0xc6,0x24,0x21,0xce,0xe0,0x02,0xb6,0xd2,0xe0,0xe6,0xe8,0xfd,0x24,0x21,0x14,0xe5,0xf4,0x07,0xfb,0xd6,0xda,0x10,0xe9,0x0e,0x4c,0x0a,0xee,0x19,0x0d,0x03,0xcf,0xe9,0x0b,0x0d,0xd4,0xd9,0x06,0xc6,0xd1,0x08,0xef,0xc2,0xe6,0x24,0xf0,0x4a,0xfa,0x0d,0x0c,0xf4,0x13,0x38,0xf0,0x27,0x28,0xfb,0xdb,0x34,0xf2,0xc5,0x14,0x0e,0xfd,0x44,0xef,0x17,0xfd,0xf6,0x0b,0xc8,0xe2,0x09,0xf9,0x22,0xde,0xd4,0x10,0x27,0xdc,0x05,0xea,0xc8,0x08,0x01,0xfc,0xfa,0xef,0x23,0x71,0xd6,0xda,0x15,0x08,0xeb,0x22,0xcb,0xf3,0xea,0x4f,0xff,0xf5,0x5d,0xc5,0xfa,0x15,0x5b,0x0b,0x03,0xbe,0xfe,0x38,0xeb,0x04,0xb7,0x2a,0xe9,0x7f,0xe5,0x1d,0xda,0xb0,0x0a,0x20,0xb8,0x51,0x00,0xd7,0xce,0x3a,0xe0,0xab,0xe7,0xd5,0xed,0xd6,0xf4,0xef,0xda,0xbe,0xe6,0xde,0xb9,0xe8,0x6b,0x21,0xd1,0x12,0x2f,0x0e,0xd1,0xc1,0x19,0x15,0xe1,0xc9,0xea,0x40,0xdc,0xcd,0x09,0x0a,0x7f,0xfb,0xed,0xa5,0x00,0xe2,0xe2,0xe5,0x8a,0xb3,0xf8,0x3c,0x17,0xfc,0x25,0xe1,0x10,0x05,0x14,0xf5,0xa2,0x31,0xed,0xff,0x06,0xd0,0x10,0x0f,0xc3,0x20,0x07,0x1c,0x1d,0x36,0x00,0xaf,0x18,0x4e,0xdd,0xd3,0x51,0x1a,0x09,0x06,0x12,0xf1,0xa5,0xc9,0xf6,0xdf,0xfa,0xfc,0xe7,0x11,0x2c,0x03,0xe4,0x1f,0x05,0x27,0x28,0xf6,0x27,0x35,0xf4,0x3d,0x2a,0x1b,0xea,0x25,0x49,0xe5,0xa6,0x0c,0xc2,0xd6,0xe1,0x22,0x0f,0x38,0x59,0xfb,0xda,0xdf,0x28,0xde,0xec,0xf6,0xd0,0x25,0x1d,0x47,0xf9,0xed,0x5f,0xb0,0x5c,0xc0,0xeb,0x18,0x2c,0x10,0x39,0x1f,0x5a,0xe8,0xbf,0x10,0xf3,0xf1,0xf9,0x02,0x1c,0x17,0xf9,0xfa,0xf8,0x37,0xe5,0xfb,0xfd,0xcb,0x77,0xfd,0x52,0x41,0x62,0xac,0xbb,0x2c,0x21,0x3d,0xea,0xd4,0xb8,0x12,0x05,0x03,0xcc,0xf9,0x0a,0xfc,0xc7,0x1e,0xea,0x6b,0xf5,0x0c,0xf9,0xcc,0x0e,0xbf,0xea,0x2a,0x31,0x26,0xe8,0xf9,0x52,0xee,0x0c,0xf0,0x7f,0x28,0x4f,0x14,0x67,0x07,0xb4,0x52,0x05,0xda,0x22,0xf0,0x05,0x0c,0x2b,0x6c,0x19,0x07,0x23,0x2c,0xde,0xed,0x26,0xdc,0x40,0x42,0xbf,0xc2,0x05,0x53,0xe1,0xf5,0x18,0xb0,0xaf,0x30,0x0b,0xf9,0xbe,0x03,0xeb,0xf6,0x01,0xf9,0x09,0x2a,0x11,0xd6,0xae,0x27,0x47,0x12,0xdc,0x40,0xdd,0x04,0x2d,0xe5,0xcb,0xca,0x73,0xa3,0x3a,0x06,0xd7,0xde,0x3b,0xeb,0xed,0x0e,0x40,0xf8,0xdf,0x09,0x19,0xd9,0x52,0xd9,0x25,0xfa,0xd9,0x00,0x29,0xfa,0x0f,0x24,0xdf,0xee,0x7f,0xd2,0x2e,0x34,0x1f,0xf1,0xea,0xb6,0xe7,0xd4,0x1e,0xd6,0xd3,0xd4,0xb9,0xa8,0xea,0xba,0xd6,0xa2,0x31,0x3f,0x10,0xf2,0x23,0x13,0x31,0xda,0x23,0x0b,0x16,0x4c,0xe6,0x04,0x03,0x22,0xf2,0x2f,0x25,0xbb,0xe8,0x15,0xef,0xed,0x07,0x2b,0xb4,0xfa,0xe4,0x23,0x18,0x25,0x03,0x3b,0xb3,0x68,0xf3,0x4e,0xe9,0xed,0xf0,0x4a,0xfb,0x10,0x0a,0x1d,0x20,0xef,0x1f,0x06,0xfa,0xe8,0xf7,0x1e,0xb6,0xd3,0x0e,0x02,0xf9,0x19,0x2c,0x2b,0x1e,0x10,0x62,0xc8,0xc7,0xe8,0xd8,0xb9,0x0a,0xf3,0x10,0x16,0x07,0x1a,0x15,0xf0,0x15,0x24,0x37,0xdb,0xfc,0x1c,0x30,0x07,0x14,0xec,0x26,0xee,0xd4,0xea,0xd8,0xf9,0x0d,0x2c,0x04,0x12,0x33,0xda,0xe0,0xff,0x3f,0x42,0xec,0xe3,0x25,0xd9,0xf1,0x22,0xc9,0xe8,0xf1,0x27,0x7f,0x34,0xa1,0x0d,0x25,0xfd,0xd8,0xce,0xfe,0xcd,0x9e,0xc8,0x36,0xa6,0xc7,0xf3,0xd5,0xc5,0x20,0x36,0xea,0xa7,0x2e,0x27,0x3a,0x33,0xdd,0xa0,0xd4,0xf3,0xff,0xfd,0x16,0x0a,0xf8,0xb2,0x06,0xf5,0xcb,0x2d,0x20,0x03,0x31,0x0a,0xe9,0xde,0x4c,0x17,0xf7,0xe0,0xe8,0xe3,0xb9,0xf2,0xe9,0xd5,0xf0,0xe5,0xdc,0x0c,0xd6,0xb2,0xbc,0x7f,0x44,0x79,0xca,0xc9,0xa6,0x2a,0x36,0xd0,0xc0,0x19,0x4d,0xf0,0xf9,0x04,0x43,0xf9,0xf2,0xd8,0x49,0x55,0xd2,0xeb,0xb5,0xf6,0xda,0x10,0xd7,0xfc,0x41,0xbf,0x1f,0x34,0xf7,0xf3,0x1e,0xfb,0xf8,0xf7,0xf0,0x0c,0xde,0xe7,0x6b,0xe8,0xf4,0xee,0xf0,0xd5,0xfd,0x0d,0x44,0xe5,0xd8,0xf1,0xfe,0x07,0xd1,0xd7,0x15,0x01,0xf1,0x50,0xfc,0x27,0xe5,0x51,0xcc,0x4c,0xd9,0xf1,0x0b,0xcf,0x14,0xf9,0xd7,0xf7,0xe2,0xe7,0x15,0x22,0xf3,0xd2,0xed,0xe1,0x0b,0x1c,0xc9,0x07,0x23,0x0e,0xce,0xf1,0x26,0x0d,0xc8,0x09,0x27,0xef,0x06,0x1c,0xee,0xc4,0xe4,0x4c,0xf2,0x2d,0xf9,0xdc,0x23,0x34,0x06,0xf6,0xf1,0x3e,0x0e,0xea,0xeb,0x54,0x00,0x18,0x12,0x0c,0xe9,0x14,0x0f,0xef,0x09,0x02,0x37,0xd2,0xf3,0xe1,0x2e,0x15,0x08,0xa6,0x0e,0x23,0xe3,0xf7,0x13,0xf7,0xf0,0x21,0x45,0xd2,0xf7,0x03,0x17,0x1a,0x3d,0xe6,0x24,0x42,0xd4,0x09,0x2f,0xfe,0x2a,0xd2,0x11,0x2a,0x2f,0xdb,0xe0,0xbc,0x12,0xe1,0xd7,0x57,0x04,0x11,0x07,0x2d,0x2a,0x37,0xce,0xd8,0x3a,0xf1,0xb9,0x1b,0x13,0xe8,0xba,0xe7,0x7f,0x01,0xe9,0xf6,0xd3,0xb8,0x3b,0xbf,0x12,0x0c,0xdb,0x2f,0xf2,0xdf,0xa3,0x0a,0x5a,0x7c,0x21,0xdf,0x0d,0xca,0x4d,0xdf,0x13,0xd9,0xd0,0x14,0xf8,0x14,0x0c,0xe5,0x24,0xfb,0xaa,0xee,0x8f,0x0e,0xe4,0x06,0x05,0xbf,0x25,0x65,0x33,0xd8,0xf1,0xfd,0x65,0x0e,0xdf,0x26,0xd5,0xf4,0xdd,0x05,0xd4,0x15,0x0e,0x25,0xf3,0xed,0xce,0xdf,0x19,0x20,0x38,0x13,0xda,0x05,0x1a,0x00,0xdb,0x21,0x14,0xff,0xf9,0x16,0x1c,0x04,0xec,0x07,0xe9,0xe5,0x1d,0x14,0xf6,0xff,0x35,0x3b,0x24,0x25,0xea,0xee,0xee,0x2b,0xd1,0x35,0xff,0x15,0x1e,0x0b,0xef,0xfe,0x34,0xf8,0xf6,0xe9,0x0c,0x19,0xe9,0x11,0x20,0xdb,0xaa,0xda,0xee,0x05,0xba,0x19,0xe8,0x22,0xe4,0xd4,0xfa,0x02,0xe8,0xf2,0x5d,0xe8,0xd3,0x12,0xf3,0x0d,0x0a,0x2e,0xe8,0xd3,0xc6,0x64,0xd2,0xd8,0xb5,0xf1,0x07,0xf3,0xd8,0xe7,0xf5,0x08,0x12,0x04,0xe0,0xee,0xf6,0x0c,0xe5,0xea,0x19,0x21,0xbe,0x7f,0x00,0xef,0xbf,0x09,0xcd,0xdf,0x16,0x00,0xd6,0x0d,0xe8,0x2e,0xf1,0xdc,0x17,0x18,0xe4,0xf4,0xf5,0xf3,0x2e,0x2f,0x16,0xe2,0xdd,0x4d,0x27,0xf3,0xba,0xfe,0x2d,0x31,0x03,0xfb,0xc6,0x3c,0x19,0x4b,0xe3,0xbc,0x08,0xeb,0x26,0xd1,0x03,0x3a,0x01,0xf1,0xe6,0xb6,0x37,0x26,0x14,0x3c,0x2a,0x4a,0xe1,0xe2,0x2a,0xf1,0xff,0x34,0xb8,0xf9,0xe6,0xba,0x2a,0xf9,0x0a,0xe4,0x6f,0xf0,0x4b,0xcc,0x1f,0xd2,0xd1,0xc6,0x5e,0xba,0xe9,0xd6,0xc3,0xf7,0xf1,0xf4,0x0c,0xe7,0xc8,0xce,0xe7,0x2b,0xdc,0xfa,0xe9,0xd3,0xf2,0x02,0x2f,0x11,0x2a,0x51,0xba,0x2b,0xec,0x49,0x06,0xfb,0xbf,0xf4,0xe4,0xa0,0xdf,0xab,0x81,0xe9,0x22,0x0b,0x1a,0x78,0x24,0xf2,0x0d,0x0f,0xe4,0xe4,0xea,0xdd,0x1c,0x13,0xd2,0xe2,0x04,0x10,0x22,0x14,0xc6,0xc3,0xe3,0x2c,0xef,0x64,0xbe,0x03,0x02,0x0f,0x01,0x25,0x3e,0xf3,0xf9,0xdd,0x32,0x1e,0x3d,0x1c,0x1e,0x10,0x02,0x3e,0x1d,0x3f,0xa6,0x28,0x68,0x08,0xeb,0xfb,0x56,0xe6,0xdf,0x25,0x46,0xcf,0xa5,0xf4,0xf6,0x15,0x2f,0x1b,0xdc,0x4a,0x10,0x28,0xd9,0xfd,0xd7,0xdb,0x0f,0xe7,0xed,0xff,0xdb,0x14,0x2b,0xe8,0xa2,0x92,0x35,0x46,0xda,0xb7,0x0e,0xf2,0x16,0x51,0x16,0xf2,0xff,0x06,0x1f,0x04,0xf0,0x0c,0xd4,0xfa,0x08,0xbb,0xed,0x06,0xfc,0xd8,0xfc,0x26,0xd9,0x09,0xf6,0xe2,0x7f,0x11,0x73,0xd9,0x09,0x43,0xa9,0xe2,0xb6,0xf4,0xeb,0x5a,0x1a,0xf3,0x12,0xfe,0xf8,0x0f,0x14,0x14,0xe9,0x2e,0xee,0x2c,0xe8,0xff,0x0c,0xb0,0xe0,0x18,0xba,0x1d,0xe9,0x12,0xec,0xeb,0xe2,0xe2,0xe4,0x27,0x1b,0xd1,0xc5,0xe3,0xeb,0x1a,0xf1,0x06,0xe2,0xf6,0xe2,0x30,0xf2,0xdd,0x0b,0xb5,0x6e,0x07,0xdf,0xbc,0x5f,0x0c,0x4f,0xc7,0xbd,0xf1,0xe1,0x18,0xdd,0x67,0x29,0x3a,0xf9,0xce,0x39,0x06,0xba,0xf6,0xdb,0xf7,0x21,0xa4,0xf9,0xd6,0x25,0xdb,0x1c,0xe6,0x03,0xd4,0x00,0x2b,0x02,0x2d,0x02,0xd5,0x43,0xb0,0x8f,0x12,0xf7,0x18,0x15,0x2f,0x25,0x19,0xfe,0x1a,0x27,0xf6,0x04,0x0d,0xd7,0xe1,0xf7,0x3d,0x02,0xde,0x27,0xf6,0x27,0x25,0x1a,0x48,0xf4,0xfb,0xe7,0x52,0xf2,0x24,0x4c,0xea,0x10,0x02,0x48,0x6d,0xea,0xda,0x6c,0xb6,0xb7,0x7f,0x12,0xef,0x38,0xc6,0xf7,0xf4,0xc6,0x1b,0x0b,0x0c,0x05,0x12,0xf1,0xe5,0x18,0x2e,0x96,0xec,0x0f,0xea,0x3a,0x33,0xf6,0xd9,0x77,0xd9,0xf4,0xd2,0x03,0xf6,0x5d,0x05,0xb2,0x25,0x18,0xf4,0xfc,0xdb,0x61,0x12,0x0d,0xd7,0xcd,0xe9,0xdb,0x19,0xf7,0x36,0x02,0x90,0xdc,0xfe,0x21,0x3e,0xfb,0xf2,0x35,0xf4,0xf9,0xf0,0x50,0xe9,0xd2,0xee,0x3c,0xfd,0x4d,0x31,0x59,0x02,0x23,0x45,0x10,0x02,0xc1,0x2b,0xd4,0xfd,0x2d,0x18,0xc9,0x00,0x38,0xda,0xd6,0x02,0x61,0x0e,0xe1,0x1b,0xde,0xcc,0xf7,0xf6,0x82,0x0b,0x34,0x03,0xdf,0xfd,0xbc,0xd4,0xc7,0xe6,0xd0,0xf5,0x1c,0xfa,0xf3,0x1e,0xda,0x30,0x17,0x24,0xa3,0xe6,0xe6,0x4c,0xd3,0xa8,0x7f,0x02,0xf5,0xc9,0x33,0xc6,0x26,0x82,0x0c,0x20,0xf0,0xdb,0x40,0xe9,0x18,0x96,0xb5,0xcb,0x3f,0xfd,0x00,0x67,0xea,0x26,0x53,0xcf,0x0f,0x1f,0x11,0x07,0x08,0xff,0xc7,0xfe,0xec,0x85,0x45,0xe8,0x0f,0xe9,0xf6,0xf6,0x42,0x2b,0x2a,0x55,0xde,0x00,0xf5,0x4f,0x00,0x40,0x0b,0x10,0xf6,0x97,0x14,0xc0,0xe8,0xcc,0xf7,0xf6,0x11,0x27,0x07,0xda,0xf0,0x0f,0xe9,0xf9,0x58,0xc4,0x1a,0xde,0x37,0xa8,0x03,0x13,0xe9,0xcd,0x01,0xd3,0x12,0xff,0x0d,0xc8,0xf1,0x7f,0xf2,0xf4,0x0c,0x31,0x17,0xc9,0xbb,0x1c,0x9f,0xf8,0x10,0x23,0xe5,0xce,0x00,0xf6,0xf1,0xff,0x00,0x00,0xc4,0x22,0x1e,0x0d,0x37,0xf8,0x12,0xfd,0x1f,0xc0,0x0b,0xd6,0xd9,0xf7,0x1d,0x33,0xcf,0xfd,0x37,0x10,0x10,0x1e,0xd7,0xeb,0x10,0x6a,0x1e,0x46,0xf0,0xfe,0xc5,0xe8,0x4a,0xf9,0xe2,0xc4,0xe9,0x08,0xf1,0x35,0xf2,0xec,0xd9,0xfe,0x10,0xf3,0x22,0x13,0xec,0xd1,0xf1,0x21,0x18,0xe0,0x2d,0xee,0x06,0x1b,0x27,0xec,0x00,0xf4,0xf2,0xdb,0xd2,0x03,0xc4,0xf0,0xe6,0xc0,0x74,0xd5,0x0b,0x1e,0x31,0x21,0x04,0x15,0x18,0x30,0xc3,0xe4,0xbc,0xcd,0x39,0x38,0x2e,0xba,0x0b,0x2b,0x11,0x1a,0x30,0x54,0x0b,0x44,0xd2,0xf3,0xfd,0x43,0x48,0xfd,0x02,0xc8,0xd9,0xc6,0xda,0xfb,0x19,0xd1,0xd4,0x0b,0xee,0xd1,0x22,0x2c,0x6f,0x2f,0xde,0x34,0xdc,0x3f,0xf5,0x2a,0xf5,0xed,0xff,0xd8,0xa9,0x08,0xc8,0x1b,0xde,0xca,0xdd,0xfc,0xae,0x78,0x59,0xf7,0xd0,0xf4,0xe9,0x2c,0x81,0x05,0xed,0x1d,0x14,0xdc,0x03,0x5f,0x53,0x04,0x17,0x09,0x12,0x34,0xce,0xe7,0x26,0x32,0x1d,0x10,0xd2,0xd3,0x0d,0x2f,0xec,0xfe,0x38,0x1f,0x1e,0xfd,0x69,0x14,0x45,0xf9,0xef,0xe4,0x14,0xfe,0x09,0xa8,0x27,0xdf,0xce,0xed,0xe6,0x09,0xea,0xb8,0xb4,0xef,0x6c,0x49,0x02,0x17,0x4f,0xb0,0xd7,0x0a,0x2c,0x13,0xeb,0x40,0x77,0x15,0xf4,0x9e,0xad,0xff,0x31,0x1a,0x5f,0xed,0xee,0x34,0xe0,0xfc,0xf2,0x34,0xa0,0x27,0xef,0x07,0x08,0x18,0x0c,0x3f,0xa5,0xe0,0xda,0xfd,0x13,0xd2,0xf3,0xc4,0x25,0xe2,0x0d,0x09,0x15,0xa1,0xef,0xdf,0xf4,0x40,0xde,0x1d,0x5f,0xfe,0x16,0x31,0xf6,0x0f,0x64,0xd8,0xd4,0xda,0xd7,0xce,0x4b,0xd2,0xd5,0xe0,0xdd,0x03,0xd0,0x1f,0x20,0x3d,0x04,0x06,0xeb,0x7f,0x39,0xfe,0x46,0x7a,0x03,0x33,0x01,0x12,0xc2,0xbe,0xd3,0xe2,0xcf,0xef,0x13,0x25,0xf1,0x04,0xd2,0xe9,0xc5,0xd0,0x00,0x33,0x00,0x4e,0x0d,0x59,0xbc,0x07,0xf3,0xea,0xe0,0x56,0x40,0xf9,0x3f,0x14,0x28,0x4a,0xd2,0x15,0x15,0x0c,0x36,0x0c,0x22,0xe4,0x2d,0xff,0x09,0xdd,0x20,0xfd,0x3d,0x7f,0xc0,0x07,0x47,0x1f,0x40,0x0e,0x33,0x0f,0xe9,0x2f,0x01,0xdd,0xdd,0xfb,0xe0,0x47,0xea,0xf7,0xc8,0x1e,0x0d,0x27,0xe8,0xe0,0x0d,0x0a,0x10,0x66,0x08,0x2d,0x2e,0x02,0xee,0x09,0xee,0x14,0x52,0x0e,0xef,0xfd,0xd9,0xf2,0x21,0xea,0xf0,0xe7,0x10,0xeb,0xc8,0x05,0xed,0xfb,0x16,0xbd,0xfa,0xdf,0xe0,0xe2,0xf2,0xa6,0xfe,0x23,0xfb,0xff,0xd2,0xd8,0x07,0x73,0x32,0xc2,0x1e,0x30,0x11,0x0b,0xa1,0x0e,0x04,0x1a,0x27,0x1a,0xd6,0xf5,0x00,0xf7,0xf6,0xed,0x04,0xf3,0x1c,0x3d,0x14,0xe4,0xcd,0x0f,0x9a,0x0e,0x0d,0x15,0xd9,0x06,0xe8,0x07,0xdf,0x0c,0xf4,0x17,0x12,0xe6,0x18,0x1e,0xf0,0xf4,0x2c,0x2f,0xc3,0xed,0x1c,0xef,0x0f,0xca,0x13,0xfd,0x0b,0xfc,0x12,0x2f,0x0a,0x55,0x09,0x25,0x36,0xf9,0xf0,0x02,0xad,0xd4,0x17,0x04,0xda,0x22,0x7f,0x11,0xd7,0x12,0x1d,0xf8,0xfa,0xf5,0x6a,0x3c,0xf7,0xec,0xe5,0x0a,0xd8,0x0d,0xd7,0xea,0x04,0x06,0x19,0x0f,0x40,0x28,0x16,0x07,0xf7,0xde,0xf5,0x1a,0xc7,0xd9,0x23,0xfe,0xc0,0x22,0xf5,0xf8,0xe8,0x12,0xdc,0xdc,0xf9,0xf9,0x1d,0xc8,0x1a,0x11,0x07,0xf4,0x08,0xf6,0xf9,0x10,0xf2,0x12,0x00,0x41,0xf9,0x2e,0xf1,0xd2,0xc3,0xc5,0xf6,0xdc,0x06,0x09,0x16,0xf1,0x22,0x22,0x14,0x11,0xff,0x01,0x02,0x16,0x14,0x12,0xf1,0xdd,0x2e,0xf6,0x1d,0xf0,0xef,0x07,0xe7,0x48,0x0b,0x20,0x1d,0x11,0x3a,0x01,0xd4,0xcb,0xd3,0xf0,0x0b,0x03,0x2e,0xd5,0x42,0x0c,0xeb,0x17,0x09,0x0e,0x07,0xc7,0x01,0x2d,0x02,0x43,0x9e,0xeb,0x1d,0xf5,0xca,0xa5,0x7f,0xbc,0x2d,0xf3,0x35,0xe5,0x33,0x08,0xf8,0xf9,0x42,0xcc,0x10,0x35,0xce,0x54,0x00,0x30,0xef,0x9e,0xf4,0xfd,0xe8,0x49,0xef,0xa3,0x3a,0x2d,0xd4,0xe3,0x13,0xdb,0xe0,0xcf,0x15,0xe7,0xf3,0xd7,0x28,0xe1,0xfb,0x15,0x03,0xf6,0xde,0x3c,0xe5,0xd9,0xbb,0xf4,0xec,0xda,0x0f,0x04,0x3a,0x16,0xf0,0x33,0x07,0xd7,0x09,0xde,0x25,0xf0,0xdd,0x11,0x94,0x1b,0xcf,0xda,0x31,0xa7,0x0a,0xde,0x09,0x21,0x17,0x0a,0x0c,0x19,0xf3,0x2a,0xdb,0xdb,0xec,0x0b,0x2b,0xf2,0xd4,0x2c,0xa8,0xed,0xeb,0x38,0xec,0xd8,0x3a,0x5f,0xcd,0xec,0x1b,0xe6,0x38,0xeb,0x18,0x1e,0x83,0xe6,0xcd,0x00,0x63,0x0b,0x95,0xcc,0xf6,0xd1,0x2d,0xd5,0x35,0xea,0x17,0xf5,0x01,0xe5,0x1c,0x13,0xef,0xe2,0x1d,0x3a,0x0a,0x06,0x08,0xd8,0xf2,0x44,0xf7,0x1e,0x15,0x42,0x16,0xe6,0xe5,0xfc,0xd5,0xe6,0x34,0x10,0x02,0x1f,0x19,0xeb,0xff,0xc4,0xe9,0x01,0xe3,0xda,0xcb,0xea,0x04,0xf7,0xc7,0x24,0xf6,0x19,0x1f,0x55,0xdd,0x3e,0x0d,0x1b,0xf7,0xf1,0xfc,0xe7,0x3a,0x17,0xff,0xeb,0xf3,0x00,0xed,0x0a,0xd0,0xd6,0x0d,0xb2,0xdf,0xf2,0xe2,0x11,0x24,0xd4,0x23,0x08,0x1d,0xb9,0x32,0x2b,0xde,0x29,0x1e,0xff,0x08,0xf5,0x1b,0x00,0x36,0x28,0xe8,0xd5,0xfd,0xce,0x7f,0xe7,0x23,0xf8,0x59,0x23,0x3c,0xea,0xcf,0x2e,0x03,0x95,0xdf,0x16,0xf3,0xb2,0xda,0xda,0x1e,0x3b,0x4b,0x08,0xe5,0xea,0xbe,0xe9,0xe5,0x0e,0x25,0x60,0xf5,0xab,0xbc,0x0f,0x22,0x59,0x0f,0x0b,0x02,0xed,0xdd,0x01,0x57,0x09,0x0d,0xff,0x26,0x1b,0x35,0xd8,0x17,0xfb,0xd2,0x1b,0xc9,0xff,0x0b,0x7f,0xaf,0x07,0x31,0xd9,0xef,0x35,0xbf,0x05,0x29,0xea,0xb6,0xde,0xac,0xe4,0x05,0xe5,0x08,0xfd,0xe8,0xf2,0xb7,0xad,0xb4,0xc7,0xe8,0xea,0x1b,0x02,0x31,0xd8,0x33,0xbb,0xe1,0xbd,0xfd,0x8f,0xd4,0xeb,0x46,0x30,0xd0,0x05,0xbc,0xfb,0x0c,0xf5,0x58,0xba,0xd1,0x53,0x24,0xf0,0xca,0xc8,0xe9,0x46,0x1d,0xf2,0x02,0x0a,0xeb,0xd3,0x19,0x44,0xfa,0x07,0xef,0xe1,0x13,0x33,0xb5,0x0b,0xdc,0x3f,0x2d,0xd0,0x1c,0xfd,0x1c,0xcd,0x15,0x3d,0xd7,0xf9,0x5e,0x12,0x15,0xf8,0xfc,0x0a,0xfc,0x19,0xe0,0xce,0x28,0xfc,0xe7,0xee,0xec,0xc7,0xf5,0xf0,0x49,0x23,0xd8,0x03,0x52,0x66,0x3a,0xe9,0x25,0x3c,0xf9,0x14,0xcb,0xe8,0x20,0xe9,0x8f,0xeb,0xe1,0x3a,0xf1,0xdb,0x14,0x15,0x8c,0x14,0x58,0x3e,0x90,0x20,0x22,0xed,0xef,0x21,0xce,0x25,0x29,0xd2,0x0c,0xe8,0x9a,0xc8,0x39,0x06,0x2e,0xf9,0xea,0xa3,0xca,0xdc,0xd5,0xfa,0x20,0x44,0x27,0x02,0x45,0xdf,0x1d,0x15,0x32,0x1c,0xe5,0x2c,0x3a,0x55,0xe6,0x39,0xfe,0x25,0xf3,0x26,0x08,0xec,0xec,0x00,0xef,0xfe,0xee,0xed,0x26,0x36,0xef,0xb0,0xf5,0x1d,0x18,0x1b,0x1c,0xed,0xf3,0x1c,0xe8,0x01,0x21,0x68,0xd5,0x45,0xc7,0xd7,0x10,0x3d,0xcf,0x09,0x10,0xee,0x4b,0xfd,0x45,0xda,0x19,0xd1,0x78,0x08,0xe9,0xe0,0x2a,0xeb,0xc8,0x7f,0x36,0x22,0x27,0xc2,0xe9,0xf7,0x01,0x0e,0xec,0x37,0xfb,0xd6,0x5b,0x38,0xec,0x1c,0xf8,0x2b,0xce,0x29,0x07,0x32,0xeb,0x0c,0xc4,0xff,0xe4,0xfe,0xce,0xf7,0xf1,0x01,0xe0,0x11,0xdd,0x1e,0xde,0x20,0x1e,0xe6,0x10,0x11,0x0e,0x7f,0x2f,0xc3,0x5d,0x02,0x13,0xf5,0x1e,0x4e,0x45,0xfe,0x20,0x26,0xe3,0x1d,0x02,0xfa,0x1f,0x14,0x3d,0xc6,0xef,0x42,0xf6,0x20,0x10,0x18,0x27,0x0c,0x15,0x3b,0x1c,0x34,0x46,0x11,0xa3,0x2c,0x29,0x06,0x13,0x0e,0xdb,0x16,0x4c,0x28,0x4c,0xd1,0xe3,0x4e,0x1a,0xf1,0xf7,0x10,0xf1,0xf0,0x14,0xf4,0x02,0x1f,0xec,0x41,0x2e,0x26,0xf6,0xea,0x35,0x15,0xf2,0xf2,0xe3,0xc3,0xfc,0x03,0x21,0xe9,0xf4,0xda,0x2e,0xf2,0x11,0xd0,0x33,0x12,0xd7,0x41,0x01,0x14,0x15,0xf0,0x10,0xeb,0x1c,0x05,0x15,0x03,0xf6,0xe2,0xef,0x62,0x26,0x0b,0xeb,0x08,0xff,0x1b,0xed,0xcf,0x15,0xd0,0xd2,0xfa,0xf8,0xe6,0xff,0x19,0x1d,0x01,0xd3,0x18,0xfd,0xfd,0xcd,0x04,0xdb,0xdd,0x14,0x12,0xe4,0x6d,0x7f,0xc8,0xfc,0x1b,0xe5,0x0d,0x18,0x10,0x34,0x38,0xfb,0x02,0x12,0x11,0x12,0x01,0x33,0x0d,0xc3,0x07,0x18,0x0b,0xce,0x0a,0x1f,0x00,0xfa,0x3d,0x40,0x27,0x30,0x19,0xed,0xef,0xfe,0xfc,0xe7,0xde,0xe7,0xff,0xf9,0xcf,0xe2,0xfa,0x28,0x35,0xd5,0x17,0x17,0x17,0x1b,0x1c,0x11,0x07,0x17,0xf2,0xf1,0xfc,0x0f,0x16,0xdb,0x05,0xf4,0xec,0xe6,0xdf,0x47,0xd7,0xe8,0x10,0xd1,0x4c,0x40,0x0b,0xe4,0xe0,0xd9,0xe7,0xff,0x14,0xfa,0xe9,0xdc,0x1a,0xdf,0x17,0x33,0x0c,0x29,0xa9,0x53,0x1c,0xd6,0xc4,0x13,0x74,0xf8,0xf8,0x1d,0xfd,0x2f,0x09,0xb0,0x2d,0x15,0x1a,0xcc,0xcd,0x2c,0xdd,0x19,0x4d,0xeb,0x04,0x89,0xe1,0x28,0xff,0xf6,0xf8,0x1e,0xd9,0x00,0x1f,0xf3,0xfb,0xe3,0x56,0x06,0xfd,0xe3,0xfb,0x0d,0x1e,0xc5,0xdc,0xe6,0x09,0x39,0xdf,0x2f,0x1e,0xb8,0x09,0x36,0xfb,0x43,0x41,0xa4,0xfa,0xd9,0xd7,0x1c,0xda,0x24,0xcf,0x14,0x1a,0xc3,0xce,0xb3,0xc5,0x9a,0x8a,0x04,0xc5,0xdf,0x6c,0xef,0x16,0xe7,0xe9,0xfe,0xd1,0xee,0xd4,0x25,0xf1,0x0b,0xf3,0xe5,0xc2,0xa7,0xdd,0xef,0x44,0x0d,0x0d,0xf5,0xe0,0x11,0x20,0xc8,0xbe,0xf8,0x1a,0xe7,0x49,0x13,0xd0,0xe6,0x03,0x32,0x4c,0x81,0x06,0xea,0xcf,0x17,0x01,0x44,0xd8,0x39,0xf5,0xcd,0x52,0x11,0xfe,0x03,0xd3,0x0a,0xe8,0x18,0xe2,0x08,0x18,0xf8,0x54,0x26,0xea,0xc1,0xf8,0xf5,0xd4,0xe1,0x37,0x66,0x0c,0x1c,0xf4,0x32,0x0d,0x6c,0x12,0xf8,0xe5,0x11,0xd7,0x02,0x5b,0x0a,0xe3,0x23,0x41,0xa5,0x57,0x1b,0x47,0xf3,0xf9,0x58,0xe3,0x3d,0x24,0x15,0x1d,0xfd,0xb3,0xc4,0xfd,0xf4,0xdf,0x16,0xf0,0x38,0xf7,0x18,0x19,0x19,0x63,0x0e,0x36,0x40,0x2d,0x17,0xed,0x30,0x4c,0x04,0xf0,0xb5,0x42,0x16,0x04,0x07,0xfe,0x37,0x70,0x24,0xe6,0xfe,0x7f,0x03,0xd4,0x29,0x41,0x09,0xe0,0x0b,0x31,0xda,0x35,0x02,0xe9,0xee,0x0b,0x02,0xfb,0x01,0xfc,0x12,0x08,0xec,0xdd,0x40,0xea,0xea,0xd4,0x4a,0xf7,0xde,0xf4,0xe6,0x23,0x57,0x0a,0x31,0xe2,0x09,0x07,0x2f,0xe2,0xca,0x50,0x12,0x37,0x19,0x28,0xe2,0x04,0x7f,0x4d,0x3c,0xad,0x28,0xf0,0xea,0xe0,0xac,0x01,0x06,0x37,0x5c,0x08,0xb8,0xe9,0x09,0xd1,0x35,0x16,0xdf,0x22,0xf9,0x10,0x18,0x22,0x1b,0xec,0x00,0xf6,0xd4,0x41,0x16,0x1f,0xf9,0xf9,0x19,0x40,0x45,0x52,0xf9,0x1c,0x17,0xed,0xd9,0x2f,0x1f,0x71,0x61,0xca,0x0c,0xfc,0xf6,0xf8,0x29,0x02,0xd8,0x16,0xfa,0xc5,0x18,0x28,0x14,0x26,0x03,0xcd,0xc0,0x2e,0x1b,0x15,0x31,0xec,0xf5,0xda,0x30,0x0c,0x54,0x5e,0x18,0x30,0x1e,0xeb,0xe4,0x08,0x17,0x29,0x15,0xfc,0xdd,0xd8,0x1b,0x3e,0xc8,0x28,0x31,0x0e,0xe6,0x11,0x06,0x3a,0xa8,0xe6,0x1c,0xe7,0xd9,0x66,0x3d,0x0b,0xda,0x30,0x37,0x0e,0xc6,0x22,0xe6,0x1e,0x28,0xeb,0xe9,0x9a,0x29,0x37,0x19,0xec,0xd4,0xfd,0xe5,0xed,0xfb,0x59,0xde,0x29,0xce,0x25,0xfd,0xe2,0xea,0x13,0xde,0xcd,0xee,0x3d,0x38,0xef,0x1f,0x1b,0x7f,0xee,0xef,0x37,0xca,0x29,0x0a,0xff,0xe5,0xec,0x0c,0xf7,0xdb,0x2a,0x12,0xd2,0x29,0x16,0xbc,0xef,0x19,0xf9,0x34,0xee,0x07,0xec,0xe4,0xee,0x42,0xd6,0xfa,0x17,0xd6,0xdd,0xc7,0x02,0xdc,0xe8,0xcc,0xd8,0xe3,0xd8,0x0a,0x0a,0x20,0x08,0xeb,0x2d,0xfe,0x1f,0xee,0x05,0xe2,0x3a,0xe7,0xe9,0xe4,0xe2,0xfd,0xc3,0xbe,0xec,0xd6,0xdc,0xe1,0xee,0xee,0x17,0x16,0x3e,0xee,0x32,0xf4,0x02,0xf8,0x25,0xdc,0x05,0xf5,0x1b,0xf0,0xfe,0xe7,0x00,0x15,0xd9,0x0d,0x05,0xe6,0xd7,0x1f,0x1d,0x02,0xe5,0xcb,0xeb,0xd8,0x13,0xee,0x46,0xe6,0x10,0xc1,0xee,0x11,0xef,0xec,0xfe,0x1a,0xd6,0x27,0xf9,0xf9,0x07,0x06,0xee,0x30,0x0c,0x3a,0x1b,0x1a,0x31,0x0b,0xf1,0x20,0x10,0x25,0x2b,0x15,0xd3,0xf7,0x1e,0x38,0xe8,0x7f,0x04,0x29,0x18,0x0b,0xe9,0xf7,0xea,0x16,0xe8,0xe9,0x06,0xfa,0xe1,0x0b,0xdd,0xdb,0x02,0x0e,0xfc,0x01,0x50,0xe6,0x01,0xca,0xea,0x08,0x05,0x38,0x05,0xe0,0x0e,0x13,0x1d,0xd2,0x02,0xe8,0x00,0xf8,0xe9,0x13,0x07,0x0e,0x2e,0x10,0x4a,0x0c,0x07,0x41,0x18,0x07,0x34,0x03,0xf1,0x27,0xde,0xff,0xc5,0x16,0xe7,0xd8,0x0b,0xf9,0xd2,0x3a,0x24,0x21,0x15,0xf3,0xed,0xf5,0xf6,0x2d,0xe5,0x4a,0xc9,0xe0,0x0f,0x20,0xf2,0x1a,0x28,0x3c,0x1a,0xf6,0xfa,0x3a,0xe4,0x3f,0x0d,0x05,0xde,0xe9,0x1e,0x17,0x3a,0x21,0xbf,0xbb,0x0b,0xed,0xfc,0x15,0xe8,0xfe,0x81,0x2b,0xd8,0x2e,0x14,0x2f,0xd9,0xeb,0x22,0x0f,0x0a,0xf4,0xf1,0x01,0x17,0x0a,0x20,0xe9,0x29,0xf7,0xea,0xfb,0xf9,0xfb,0xd0,0x48,0xef,0x05,0xce,0xf5,0xf8,0xc7,0x52,0xd5,0x07,0xd3,0xfc,0xf4,0xa8,0x2d,0x14,0xdb,0x3b,0xdd,0xd1,0xfb,0x1e,0xd3,0x09,0xc4,0xce,0x12,0xcd,0xce,0xe2,0x07,0x43,0xfb,0xf2,0xd7,0x1a,0xe8,0x1c,0xf4,0x16,0x1a,0xb7,0xe8,0xec,0xe7,0xe6,0x04,0xfc,0x3c,0x3c,0xf7,0xc3,0xec,0x58,0xe0,0x24,0xdf,0x1a,0x40,0x41,0xfa,0x25,0xf5,0x00,0xc5,0x3f,0xfc,0xd5,0x24,0x1a,0xfc,0xf6,0xd6,0xb2,0x10,0x0c,0xeb,0x02,0x01,0x33,0xd7,0x06,0xe2,0x13,0xff,0x11,0x38,0xc9,0xd7,0xd7,0xeb,0xf4,0x15,0xfa,0xda,0x32,0x3d,0xfd,0xff,0x04,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xb5,0x79,0x9c,0x67,0xe0,0x3a,0x57,0xa7,0x81,0x58,0x81,0x7f,0x5f,0xe6,0xfe,0xb2,0xc5,0xdb,0x8a,0x3c,0xec,0xc7,0xaf,0xa8,0xf2,0x09,0x08,0x2f,0xdd,0x81,0x7b,0xb7,0x0a,0x0e,0x24,0x6b,0x7f,0xa3,0x01,0xdd,0x10,0x04,0x8c,0x26,0xe6,0x4e,0x81,0x81,0x39,0x81,0x04,0x4f,0xf1,0x46,0x28,0xc0,0x6a,0x9c,0x3e,0xb7,0x2e,0x77,0x06,0xfa,0x46,0x1d,0x63,0x4c,0xf2,0xec,0xd1,0x91,0x5c,0x95,0xfc,0xff,0x60,0x95,0xfc,0xff,0x64,0x95,0xfc,0xff,0x68,0x95,0xfc,0xff,0x96,0x3d,0xfd,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xff,0xf9,0xf0,0x0f,0x05,0x06,0x81,0x04,0xff,0x74,0xef,0xfe,0xf9,0x81,0x18,0x16,0x7f,0xeb,0xf7,0x04,0x00,0x12,0xf5,0xf7,0x20,0xec,0x06,0xf4,0x7f,0x5a,0x7a,0xf7,0x07,0xfa,0x2a,0xef,0x60,0x0a,0x7f,0xee,0x81,0x55,0x0a,0xfa,0xfc,0xbb,0x0b,0xfe,0xdf,0x19,0xec,0xfb,0x1f,0x04,0x81,0xef,0x7f,0x3e,0xea,0xf8,0xce,0x31,0x4d,0x11,0xfc,0x81,0x0b,0x00,0xfd,0x15,0xf9,0xf8,0x01,0x0d,0x0f,0x01,0x03,0xe6,0x81,0x03,0x81,0xdb,0x0c,0xfa,0x0a,0x0d,0xc9,0xf8,0x49,0x5a,0x15,0xf1,0xfd,0x60,0x81,0xfd,0x04,0xf1,0x01,0x07,0xa2,0x0b,0x81,0xf9,0xb4,0xc8,0x07,0x02,0xaa,0x17,0x7f,0x02,0x05,0xd9,0xd7,0xf0,0x7f,0x23,0xd8,0x1d,0x0d,0x0a,0x09,0xf1,0xf5,0xea,0x7f,0x00,0x22,0x3e,0xfd,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x1f,0xe2,0xff,0xff,0xff,0x2f,0x00,0x00,0xaf,0xee,0xff,0xff,0xdb,0x16,0x00,0x00,0x44,0xff,0xff,0xff,0x16,0x54,0x00,0x00,0x34,0x17,0x00,0x00,0xd5,0x0c,0x00,0x00,0xf6,0x22,0x00,0x00,0xcd,0x20,0x00,0x00,0xdf,0x8f,0x00,0x00,0x64,0x25,0x00,0x00,0x83,0x1d,0x00,0x00,0x53,0x42,0x00,0x00,0xe6,0x19,0x00,0x00,0x9f,0x0d,0x00,0x00,0x03,0xde,0xff,0xff,0x52,0x23,0x00,0x00,0x71,0x3f,0x00,0x00,0x92,0x19,0x00,0x00,0xb0,0xd9,0xff,0xff,0xa0,0x23,0x00,0x00,0xaf,0x03,0x00,0x00,0x30,0xf9,0xff,0xff,0x2b,0x28,0x00,0x00,0xfc,0x97,0x00,0x00,0xcc,0x09,0x00,0x00,0xb9,0x24,0x00,0x00,0x6b,0xb9,0xff,0xff,0x68,0x56,0x00,0x00,0x43,0x2c,0x00,0x00,0xce,0xef,0xff,0xff,0xae,0x3e,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x03,0x34,0xee,0xd9,0x38,0x14,0x0d,0xc6,0xdc,0x0d,0x1d,0xf3,0x7f,0x3a,0x01,0x13,0x0f,0x3c,0xfd,0x0d,0xe3,0xd9,0xc3,0xaf,0xad,0xfc,0x1a,0xff,0xf2,0x7f,0xe4,0xdc,0x0d,0x74,0x0d,0x0a,0xdb,0xdb,0xd6,0xac,0xe4,0x1f,0xfc,0x43,0xff,0x7f,0xf9,0x04,0xf8,0x48,0xf0,0x85,0x56,0x81,0xbc,0xc9,0xd4,0x04,0x31,0xf8,0x64,0xe4,0x16,0xec,0x40,0xed,0xbe,0xf2,0x0c,0x0b,0x19,0x0c,0x38,0x07,0xc8,0xe4,0x2d,0x81,0xe4,0x77,0xab,0xf6,0x2a,0xe2,0x27,0xe8,0x0a,0xa3,0x49,0xad,0x7f,0x1c,0xf4,0x39,0x17,0xa1,0xa7,0x1b,0x0b,0xef,0x17,0xd9,0xff,0xf1,0x02,0x49,0x2b,0xe3,0xcf,0x2f,0x7f,0xa2,0xff,0xe4,0x0f,0xe8,0xe4,0x01,0x7f,0xa3,0xfa,0xdd,0xff,0xce,0x0d,0xf6,0xea,0x0d,0xaa,0xf6,0xc2,0x32,0x02,0xeb,0x29,0x1b,0x7f,0xe6,0xee,0x0c,0xf3,0xc2,0x25,0x35,0xde,0xfc,0xdc,0xc9,0x7f,0x2b,0xd7,0x17,0x20,0x22,0x2b,0x09,0x59,0xba,0x38,0x35,0x16,0x5d,0x4d,0x3c,0xad,0x95,0x09,0xbd,0x81,0xe2,0x22,0xc8,0x9f,0x33,0xec,0xab,0x70,0x16,0xeb,0x24,0x20,0xce,0x2f,0xc2,0xb8,0xe5,0xf7,0x14,0x1e,0x22,0x81,0x2f,0xda,0x7f,0xc3,0xce,0x5a,0xcc,0x70,0xfa,0x4d,0x06,0xa7,0x8e,0x06,0xbc,0x1d,0x35,0x15,0x0b,0xd6,0xed,0x1f,0xef,0xc2,0xca,0xd1,0xe1,0xf7,0x23,0xff,0x81,0xd2,0x39,0xe3,0xee,0x15,0x06,0xe2,0xf6,0x48,0xc0,0x13,0xeb,0x81,0xbd,0x13,0x37,0xf5,0x38,0x29,0xfc,0x7f,0xf4,0xee,0x0a,0x08,0x1e,0xac,0x1f,0xd0,0x43,0xe4,0xd3,0xf1,0xfd,0x2e,0xe6,0xd4,0x2f,0x2b,0x3e,0x0a,0x5a,0x7f,0x08,0xd4,0xe3,0x18,0x24,0xb1,0x00,0x11,0x85,0xed,0xfc,0x22,0x3c,0x0e,0x19,0xc7,0x78,0xfa,0xbc,0x27,0xfb,0x2f,0x81,0x5f,0x35,0x0c,0x1a,0xe8,0x96,0xbd,0x7f,0x95,0x0e,0x32,0x62,0xe7,0xf6,0xcf,0xb3,0xb3,0xef,0x55,0xf5,0xf2,0xf2,0x24,0xbf,0x55,0x79,0xfe,0xcc,0xf4,0x61,0x58,0x81,0x69,0x81,0x11,0xb0,0x4d,0xee,0x2d,0x7f,0x39,0xdc,0xde,0xf7,0x76,0x52,0xb6,0xdf,0x7f,0x0e,0x68,0x18,0x1d,0xe3,0xc7,0xb9,0x25,0xb6,0x48,0x15,0x2b,0xe8,0xc5,0x0b,0x11,0x03,0xe4,0xc9,0xf5,0x19,0xe1,0x7f,0x05,0x25,0xd7,0x3f,0x08,0x0b,0x00,0xba,0x29,0x7f,0x1f,0xe7,0x18,0xf3,0x04,0x26,0xf1,0x1a,0xe6,0x11,0x19,0xe7,0xfa,0xf0,0xa7,0x0c,0xf6,0x7f,0xc3,0x09,0xec,0xe0,0x14,0xe2,0x23,0xf0,0x97,0x04,0x38,0x10,0x7f,0xd3,0x08,0x5d,0xb5,0x25,0x20,0x46,0x95,0x30,0xa6,0x09,0xde,0x64,0xcc,0xf6,0xa8,0x03,0xfe,0x01,0x10,0xf1,0x38,0xfb,0xeb,0xfc,0x7f,0x06,0x00,0x06,0xf1,0x1a,0x3d,0xf4,0xf1,0xec,0xef,0x7f,0xdf,0x2d,0x99,0x12,0xa9,0x40,0xef,0x94,0xf3,0x0f,0x7f,0xe8,0x29,0x07,0xf8,0xd9,0xca,0x23,0x71,0x36,0x06,0x0b,0x2c,0x1a,0xdb,0xf4,0xec,0x7f,0xe4,0xdf,0x03,0xa3,0xde,0xb6,0xa8,0x08,0x0f,0xda,0xfe,0xc5,0x1a,0xd2,0xe4,0x3a,0xca,0xf3,0xfa,0x81,0xd0,0xd3,0xf2,0x08,0x10,0xda,0x17,0x02,0x1a,0x11,0x81,0x81,0x76,0xf9,0xd7,0xe3,0xda,0xbc,0x51,0x3e,0x65,0xbe,0x37,0x71,0x43,0xca,0xba,0x40,0xfd,0xff,0x04,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x14,0xfd,0x8d,0x2e,0x0c,0x0c,0xff,0x1a,0x0e,0x00,0x85,0xbe,0xff,0x00,0xf9,0xf0,0x11,0xf9,0x81,0x90,0xf7,0x01,0x00,0x01,0xe0,0xf0,0xf2,0x9f,0xe1,0xe9,0x00,0x22,0x81,0x1b,0x0c,0x18,0xfe,0xcb,0x13,0x5e,0xd9,0xeb,0x42,0x3e,0x0a,0xec,0x00,0x7f,0x24,0xf9,0xdf,0xcc,0x81,0xbc,0x01,0x66,0xb4,0x7f,0xfe,0x81,0x1c,0x81,0x7f,0x63,0x25,0x3b,0xc3,0xa5,0x78,0x8f,0x01,0x03,0x0e,0x41,0xfd,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x7a,0xed,0xff,0xff,0xc0,0xef,0xff,0xff,0x49,0x1b,0x00,0x00,0xc7,0x21,0x00,0x00,0x4d,0x74,0x00,0x00,0x26,0x7a,0x00,0x00,0x85,0xc4,0xff,0xff,0x41,0x95,0xff,0xff,0x1b,0xf2,0xff,0xff,0x05,0x33,0x00,0x00,0xcb,0xf5,0xff,0xff,0x4d,0x6c,0x00,0x00,0xb1,0x08,0x00,0x00,0x01,0xd2,0xff,0xff,0x47,0x05,0x00,0x00,0x59,0x3e,0x00,0x00,0x13,0xd9,0xff,0xff,0x62,0x2f,0x00,0x00,0x79,0xcd,0xff,0xff,0x86,0xd7,0xff,0xff,0x99,0x0a,0x00,0x00,0x7f,0x21,0x00,0x00,0x27,0xf4,0xff,0xff,0xc2,0xec,0xff,0xff,0xc1,0xf3,0xff,0xff,0x04,0xff,0xff,0xff,0x0f,0xf5,0xff,0xff,0x51,0xed,0xff,0xff,0x3c,0x2a,0x00,0x00,0xec,0xe8,0xff,0xff,0x24,0xc3,0xff,0xff,0x99,0x32,0x00,0x00,0x9a,0x41,0xfd,0xff,0x04,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x4f,0x2a,0xde,0x21,0xa6,0xcc,0x33,0x25,0x47,0xe7,0x16,0xe6,0xc7,0x59,0xb9,0x94,0x7f,0x3d,0xd7,0x5e,0x81,0x9f,0x61,0x50,0x6a,0xb5,0x40,0xa7,0xa3,0x7f,0xa2,0xac,0x4f,0x1a,0xde,0x32,0xbb,0xe6,0x3d,0x37,0x2e,0xd2,0x37,0x88,0xcc,0x3a,0xda,0xe7,0x4e,0x52,0xbd,0x30,0xa1,0x98,0x3d,0x7f,0x53,0xdb,0x53,0xb1,0xb7,0x3b,0xa0,0xc6,0x69,0x7f,0x81,0x7f,0x83,0x81,0x7f,0x7f,0x7f,0x81,0x7f,0x81,0x81,0x69,0x81,0x81,0x38,0x40,0xc8,0x43,0xb5,0xe8,0x56,0x2f,0x3d,0xd3,0x4b,0xa6,0xb8,0x4f,0xbb,0xc4,0x16,0x20,0xd6,0x01,0xe1,0xe3,0x18,0x63,0x1d,0xf3,0x41,0xdf,0xeb,0x04,0xe9,0x18,0x1d,0x4c,0xa4,0x23,0xc5,0xd1,0x2d,0x58,0x2b,0xeb,0x53,0xc8,0xc9,0x07,0xe0,0xfd,0x13,0x26,0xeb,0x24,0xf9,0x01,0x1c,0x12,0x12,0x00,0x23,0xf0,0xe3,0x0e,0xf8,0xfc,0x0c,0x9a,0xfc,0xff,0x3a,0x42,0xfd,0xff,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x9c,0x79,0x00,0x00,0x1c,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x7c,0xf5,0xff,0xff,0xf1,0x1c,0x00,0x00,0xcc,0x3d,0x00,0x00,0xdb,0x02,0x00,0x00,0xc2,0xff,0xff,0xff,0x66,0x42,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xe7,0xe7,0xff,0xff,0xf6,0xff,0xff,0xff,0x1c,0xf5,0xff,0xff,0x54,0x38,0x00,0x00,0xdf,0xe2,0xff,0xff,0xbe,0x0b,0x00,0x00,0xbe,0x02,0x00,0x00,0xc9,0xed,0xff,0xff,0xa7,0x31,0x00,0x00,0x86,0x2a,0x00,0x00,0x48,0x2b,0x00,0x00,0x9d,0xf3,0xff,0xff,0x00,0xec,0xff,0xff,0x2f,0xe0,0xff,0xff,0x94,0x39,0x00,0x00,0x83,0xd9,0xff,0xff,0x50,0x06,0x00,0x00,0xd1,0xfc,0xff,0xff,0x1f,0xfd,0xff,0xff,0x33,0x2b,0x00,0x00,0xa6,0xf8,0xff,0xff,0x8e,0xde,0xff,0xff,0x78,0x1c,0x00,0x00,0xcc,0x24,0x00,0x00,0xfd,0xed,0xff,0xff,0x55,0x06,0x00,0x00,0xe5,0x00,0x00,0x00,0xb6,0xe8,0xff,0xff,0x06,0xf2,0xff,0xff,0x6b,0xf5,0xff,0xff,0x83,0xfc,0xff,0xff,0x6b,0xf6,0xff,0xff,0x99,0xf9,0xff,0xff,0xdd,0xf0,0xff,0xff,0x68,0x38,0x00,0x00,0x22,0xf1,0xff,0xff,0xe3,0xeb,0xff,0xff,0x2a,0xf3,0xff,0xff,0xc1,0x32,0x00,0x00,0xe5,0xe5,0xff,0xff,0x26,0x26,0x00,0x00,0xfb,0x08,0x00,0x00,0x31,0xf9,0xff,0xff,0x56,0xe6,0xff,0xff,0xd5,0xe0,0xff,0xff,0x40,0xe8,0xff,0xff,0xdf,0xf1,0xff,0xff,0x76,0xf5,0xff,0xff,0x2e,0xe4,0xff,0xff,0xec,0xf1,0xff,0xff,0x19,0xf5,0xff,0xff,0x03,0x2c,0x00,0x00,0xb4,0xec,0xff,0xff,0x57,0xe2,0xff,0xff,0x26,0xe7,0xff,0xff,0xff,0xfa,0xff,0xff,0x2a,0xf9,0xff,0xff,0x91,0xf3,0xff,0xff,0x2a,0xec,0xff,0xff,0xb1,0xe3,0xff,0xff,0xa0,0xf7,0xff,0xff,0x0a,0x28,0x00,0x00,0xfb,0xeb,0xff,0xff,0xa2,0xfb,0xff,0xff,0x62,0x26,0x00,0x00,0x82,0xf0,0xff,0xff,0x5e,0x29,0x00,0x00,0xe7,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0xf7,0xff,0xff,0x40,0xfa,0xff,0xff,0x70,0x0a,0x00,0x00,0xeb,0xf5,0xff,0xff,0x15,0x2b,0x00,0x00,0xf0,0xf2,0xff,0xff,0x6f,0x24,0x00,0x00,0xd8,0x11,0x00,0x00,0x79,0x28,0x00,0x00,0x1e,0xf8,0xff,0xff,0x76,0xf9,0xff,0xff,0x12,0xe8,0xff,0xff,0xa4,0x31,0x00,0x00,0x2a,0xfd,0xff,0xff,0x89,0xea,0xff,0xff,0xfe,0xe3,0xff,0xff,0xf5,0x28,0x00,0x00,0xf9,0x1b,0x00,0x00,0xdd,0xf8,0xff,0xff,0xb1,0x04,0x00,0x00,0xb8,0xf3,0xff,0xff,0x9f,0x03,0x00,0x00,0x92,0xe7,0xff,0xff,0x93,0xfe,0xff,0xff,0xe6,0x2d,0x00,0x00,0xf7,0x30,0x00,0x00,0x6c,0x36,0x00,0x00,0x4a,0x0c,0x00,0x00,0x4c,0xf8,0xff,0xff,0x12,0xed,0xff,0xff,0x67,0xf8,0xff,0xff,0x29,0x33,0x00,0x00,0x08,0xef,0xff,0xff,0x72,0x2b,0x00,0x00,0xed,0xf4,0xff,0xff,0x0b,0x29,0x00,0x00,0xf4,0x2e,0x00,0x00,0x48,0xfe,0xff,0xff,0xd3,0xf2,0xff,0xff,0xde,0xfd,0xff,0xff,0xd9,0x08,0x00,0x00,0x6e,0x25,0x00,0x00,0x9b,0xf6,0xff,0xff,0xf7,0xea,0xff,0xff,0x82,0x0a,0x00,0x00,0x7d,0x0e,0x00,0x00,0x68,0xee,0xff,0xff,0x0c,0x27,0x00,0x00,0xeb,0x2e,0x00,0x00,0xc9,0xfe,0xff,0xff,0xda,0x39,0x00,0x00,0xd4,0x32,0x00,0x00,0x1e,0x03,0x00,0x00,0x1d,0xdf,0xff,0xff,0xe8,0xfb,0xff,0xff,0x89,0x07,0x00,0x00,0xcd,0x28,0x00,0x00,0x22,0x1e,0x00,0x00,0xe5,0xf8,0xff,0xff,0x48,0x9c,0xfc,0xff,0x4c,0x9c,0xfc,0xff,0x50,0x9c,0xfc,0xff,0x54,0x9c,0xfc,0xff,0x58,0x9c,0xfc,0xff,0x5c,0x9c,0xfc,0xff,0x8a,0x44,0xfd,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x32,0x01,0x00,0x00,0x62,0xff,0xff,0xff,0xed,0x4a,0x00,0x00,0x94,0xfe,0xff,0xff,0x5d,0x18,0x00,0x00,0x82,0x2f,0x00,0x00,0xd0,0x00,0x00,0x00,0x1b,0x01,0x00,0x00,0x79,0x01,0x00,0x00,0x7d,0x2c,0x00,0x00,0xc2,0x15,0x00,0x00,0x74,0x36,0x00,0x00,0x1a,0x56,0x00,0x00,0xa2,0x11,0x00,0x00,0x6c,0x1d,0x00,0x00,0x29,0x1e,0x00,0x00,0xac,0x9c,0xfc,0xff,0xb0,0x9c,0xfc,0xff,0xb4,0x9c,0xfc,0xff,0xb8,0x9c,0xfc,0xff,0xbc,0x9c,0xfc,0xff,0xc0,0x9c,0xfc,0xff,0xc4,0x9c,0xfc,0xff,0xc8,0x9c,0xfc,0xff,0xcc,0x9c,0xfc,0xff,0xd0,0x9c,0xfc,0xff,0xd4,0x9c,0xfc,0xff,0x02,0x45,0xfd,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x50,0x27,0x00,0x00,0x6a,0x04,0x00,0x00,0x00,0xcd,0xff,0xff,0xb4,0x89,0xff,0xff,0xcb,0xa4,0xff,0xff,0x2a,0x40,0x00,0x00,0x76,0x19,0x00,0x00,0xd1,0xbd,0xff,0xff,0x57,0x0b,0x00,0x00,0x4e,0x32,0x00,0x00,0x17,0x46,0x00,0x00,0x15,0xed,0xff,0xff,0x10,0x4a,0x00,0x00,0x2c,0x21,0x00,0x00,0xd1,0xd7,0xff,0xff,0x07,0xdc,0xff,0xff,0x4e,0x45,0xfd,0xff,0x04,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x1b,0x31,0x3b,0x4d,0x2e,0xfe,0xe7,0xae,0xcf,0x14,0x7f,0xfc,0xe6,0x08,0x36,0xa9,0x01,0x7a,0xdf,0xf7,0xf8,0x0b,0xed,0x0e,0xfe,0xfc,0xd3,0x81,0xf5,0xbc,0x02,0xf4,0xa4,0x81,0x9a,0xfa,0xcd,0xf0,0x46,0xd4,0xd4,0xcd,0xa8,0x37,0xb3,0xb8,0x2e,0xe1,0x51,0x4e,0xfa,0x1f,0xf2,0xc3,0xd9,0x7f,0x3c,0x0f,0x4e,0xe4,0x7f,0x81,0x81,0xb8,0x16,0x0a,0x06,0xb1,0xbe,0xf5,0x2a,0xd4,0x2f,0x25,0xd5,0xac,0x57,0x29,0xd3,0xa5,0xf0,0x8d,0x19,0x07,0x81,0x1b,0xbe,0x01,0xe1,0xea,0xf6,0xcc,0xe9,0x31,0x2a,0x12,0xf1,0x46,0x7f,0x7f,0x7f,0xe0,0x61,0xbb,0xdd,0x0a,0xe8,0x04,0xb7,0x11,0x0c,0xcd,0x0a,0x7f,0xf6,0x1e,0xfe,0xa6,0xa4,0x01,0x64,0xc9,0x4a,0xa8,0x43,0xba,0xc3,0x7f,0x81,0x63,0xbb,0x00,0xc6,0x81,0x7f,0x9e,0x81,0x81,0xf7,0x7f,0x81,0x81,0x7f,0x1d,0x7f,0xed,0x7f,0x81,0xe3,0x7f,0x9f,0x3c,0x7f,0x81,0x7f,0x49,0x61,0x9f,0xa2,0x00,0x13,0xa9,0x55,0xa7,0xcf,0xfa,0x7e,0x81,0xf9,0x16,0x07,0xac,0xe6,0x42,0xfa,0xf0,0x13,0xa0,0xbb,0x30,0x81,0xf9,0x81,0xe7,0xfc,0xe6,0xc0,0xc1,0x2c,0x78,0xdf,0xca,0x0b,0x97,0x0f,0x1e,0xe8,0x0e,0xc8,0xf6,0xf6,0x14,0x99,0x09,0xd9,0x19,0xd9,0x81,0xce,0x24,0x16,0xf6,0x42,0x40,0xd6,0xd9,0xe4,0x2b,0x06,0x9b,0xea,0xf5,0x19,0x0d,0xfd,0x68,0xc6,0xef,0xed,0xee,0xf7,0x08,0xe4,0x09,0x3b,0x11,0xaa,0xe4,0x08,0xff,0x08,0xb8,0xde,0x58,0xed,0xe2,0x06,0x07,0x15,0x62,0x08,0x83,0xe5,0x14,0xc7,0x26,0x16,0x12,0xc4,0xf2,0xf8,0xf5,0x03,0x17,0xee,0x0c,0x28,0x01,0x1e,0x15,0x17,0xd5,0xc6,0xb6,0x00,0xcf,0xae,0xed,0xdb,0xfc,0xe2,0x2d,0xf9,0xdb,0xe3,0x37,0xe7,0x10,0x7a,0x46,0xfd,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x81,0x1c,0x00,0x00,0x0e,0xfe,0xff,0xff,0x07,0x01,0x00,0x00,0x49,0xf8,0xff,0xff,0xd4,0x08,0x00,0x00,0x93,0x25,0x00,0x00,0x1f,0xe7,0xff,0xff,0xa9,0x1c,0x00,0x00,0xc2,0x3a,0x00,0x00,0xe4,0x1b,0x00,0x00,0x9f,0x06,0x00,0x00,0x37,0xf8,0xff,0xff,0x90,0x5b,0x00,0x00,0x57,0x08,0x00,0x00,0x72,0xfb,0xff,0xff,0xc9,0x7e,0x00,0x00,0x19,0x07,0x00,0x00,0x67,0xff,0xff,0xff,0x74,0xff,0xff,0xff,0x37,0xff,0xff,0xff,0x96,0x30,0x00,0x00,0xb3,0xfc,0xff,0xff,0x52,0x5d,0x00,0x00,0x32,0x03,0x00,0x00,0xdb,0x04,0x00,0x00,0x3f,0x05,0x00,0x00,0xa4,0xfe,0xff,0xff,0xc1,0x36,0x00,0x00,0x1f,0x00,0x00,0x00,0x24,0x1b,0x00,0x00,0x83,0x32,0x00,0x00,0x09,0xfa,0xff,0xff,0x06,0x47,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x13,0xe9,0xd2,0x14,0x97,0x41,0xa4,0xeb,0x07,0x1d,0x32,0xfb,0xf7,0x0a,0xe6,0xfe,0xbd,0x6c,0x2d,0x1c,0xd1,0x3a,0x16,0x2d,0x1e,0xf8,0x7f,0x13,0x1b,0xc3,0x50,0x2b,0xf9,0x17,0xfd,0xe6,0x16,0xea,0xe0,0x98,0xcd,0x32,0xeb,0x3c,0x10,0xf8,0x1b,0xef,0xf1,0x10,0x35,0x00,0x0b,0x13,0x03,0xb3,0xdf,0x05,0x7f,0xdd,0xae,0x3d,0x3b,0xf7,0x62,0xbe,0xf2,0xba,0x28,0x10,0xfb,0x98,0xa5,0x21,0x31,0x27,0xec,0xfd,0xe4,0x1c,0x09,0xe2,0x44,0x0d,0x28,0x28,0xf9,0xd5,0x43,0xe8,0xcc,0x27,0xbe,0x81,0xa7,0xd8,0x1d,0xe1,0x00,0xe9,0x33,0x5a,0x59,0xf8,0x81,0xa4,0x12,0x00,0xa1,0x01,0x26,0x29,0x37,0x27,0xe7,0xfd,0x12,0xcc,0xe1,0xd7,0x01,0x5f,0x1b,0xf5,0x5c,0x1c,0xc2,0xb4,0xe3,0xed,0xee,0x03,0xdc,0xbb,0xdc,0x71,0xb4,0xb9,0xf2,0xf3,0xba,0xc9,0x18,0x25,0xd3,0xe0,0x89,0xdd,0x30,0xc3,0x7f,0xfb,0x3e,0x58,0xca,0x55,0xa7,0xec,0xcc,0xf0,0xfb,0x01,0xf4,0xb8,0xe8,0x09,0x04,0x39,0x02,0x81,0xcc,0xbe,0xc9,0x06,0xd1,0x11,0xbe,0xde,0xe4,0xf7,0x2f,0xf2,0x38,0x04,0xd2,0x52,0xf2,0x07,0x24,0xd5,0xbf,0x06,0x14,0xf7,0x49,0x08,0xd8,0xc9,0xae,0x1b,0x6e,0x40,0xca,0x7f,0x51,0x1f,0xf0,0xf8,0x2b,0x2b,0xff,0xf9,0x0a,0xe4,0x1e,0x14,0xc6,0xf9,0x27,0x42,0x0e,0x38,0x14,0x01,0xde,0xea,0x3b,0x35,0x60,0xf5,0x2d,0xea,0xab,0x4e,0x33,0x73,0x58,0x6f,0x02,0x20,0x7d,0x30,0x1e,0x0d,0xd6,0x1a,0xe9,0x60,0xb7,0x0f,0x11,0x8e,0x26,0x29,0x1f,0x7f,0x16,0xe3,0x23,0x75,0x11,0x81,0xf0,0xc4,0xef,0x13,0x0b,0x43,0xaf,0x20,0x1a,0x01,0x49,0xa6,0xff,0x0f,0x24,0xfe,0x05,0x2f,0x4b,0xbb,0xce,0x4a,0x12,0x50,0x22,0xf4,0xc5,0x08,0x0c,0x1f,0x2a,0x58,0xfa,0xf7,0x30,0x30,0xde,0x4a,0xa8,0xf3,0x21,0x59,0x19,0x1e,0xdb,0x0c,0x17,0x03,0xb5,0x91,0xdc,0xed,0x09,0xbe,0x81,0xfb,0xe6,0xcc,0x2b,0x76,0x55,0xca,0xf0,0xe6,0xef,0xee,0x19,0xc7,0xba,0xb4,0x28,0x20,0xd1,0x7f,0x0a,0xf4,0x10,0xf9,0xe4,0x01,0xfe,0xdb,0x1e,0x36,0x28,0xd4,0x21,0xef,0xdc,0x00,0xe7,0x3e,0x52,0x12,0xa5,0x29,0x09,0xad,0x87,0x81,0x10,0x9f,0x49,0xca,0x1c,0xb0,0xe4,0x23,0xbe,0xde,0x28,0x0e,0x22,0xcf,0xe9,0xaf,0x10,0xf7,0xdf,0x10,0x0a,0xf6,0x04,0xe5,0xfd,0x00,0xe5,0xfe,0x81,0x09,0xc6,0x1f,0x10,0x15,0xcf,0xe7,0x05,0xc2,0xd2,0x09,0x04,0x15,0xf6,0x37,0x65,0x18,0xd5,0x06,0x4a,0xcf,0x1d,0xfe,0x0b,0xe0,0xed,0x02,0x15,0x09,0x03,0xd4,0xd7,0xec,0x53,0xe0,0x03,0x21,0x7f,0xfa,0xf9,0xf8,0xed,0x1a,0x11,0xf6,0xeb,0xfe,0x46,0x2a,0x3a,0xd3,0x5b,0x1b,0x0d,0x08,0x3d,0x14,0x3a,0xdf,0x14,0x16,0xea,0x25,0xf7,0x14,0xfa,0x3a,0xe7,0x05,0x0f,0x0b,0xe1,0xeb,0x13,0x1a,0xf4,0xe1,0x0d,0xe9,0x0f,0xde,0x7f,0xfd,0xfc,0xe9,0x0d,0x0d,0x03,0xf9,0xc0,0x28,0xdd,0x07,0x04,0xe5,0xf9,0x0c,0xe8,0x87,0x07,0x06,0xe7,0xb2,0x10,0x1c,0x81,0xf1,0x12,0xf9,0x12,0xf6,0x11,0x70,0x24,0x2e,0x55,0xda,0xe4,0xe8,0x9e,0x00,0xf1,0x60,0x0f,0x03,0xb9,0xa3,0x2f,0x29,0x34,0xe5,0xf8,0x0f,0x22,0xec,0x31,0xec,0xea,0xf1,0xf5,0xfd,0x05,0x18,0x65,0xda,0x2e,0x14,0x3d,0xcc,0x4e,0x1f,0x1f,0x7f,0xba,0xc6,0xfb,0x22,0x23,0x61,0x48,0x32,0x73,0x81,0xf5,0xfc,0x50,0xdd,0xd7,0x05,0xe4,0x0a,0xa0,0xf5,0xe7,0xce,0x3b,0xce,0xaa,0xc1,0xda,0xd1,0x2d,0x08,0xcb,0xea,0xfd,0x07,0xfd,0x02,0x06,0xf4,0xed,0xfb,0xcc,0x7f,0xf1,0x29,0x01,0x2a,0xd5,0x2b,0x4b,0x01,0x2f,0x01,0xde,0x12,0xf7,0xe6,0x13,0xea,0x06,0x1c,0xe8,0x05,0x0a,0x13,0xf7,0xfa,0x07,0x0a,0xf0,0xf8,0xcf,0x0c,0x57,0x3d,0x29,0x2c,0x06,0x13,0x7f,0xbd,0xe2,0xf8,0x09,0x19,0xf6,0x13,0x44,0x24,0xf5,0xed,0xc4,0x3c,0xa0,0xff,0x22,0x50,0x04,0xf7,0xf5,0xf0,0x03,0x07,0xc1,0x04,0x12,0x07,0x17,0x08,0x09,0xff,0xf3,0xfd,0xeb,0xff,0xf4,0xf9,0xd8,0x7f,0xdb,0xed,0xec,0x3d,0x32,0xf9,0xea,0x0b,0xe4,0xfa,0x28,0xb0,0xb8,0xeb,0x08,0x3d,0xda,0x41,0x34,0xcf,0x27,0xf3,0x21,0x03,0xba,0x17,0xe2,0xc6,0xa2,0xe1,0x4d,0xdd,0xd6,0x81,0x17,0xfd,0xf5,0xf0,0x19,0xe9,0x58,0xd3,0x30,0xfa,0x31,0xe1,0xfe,0x35,0x6e,0xfd,0x6d,0x04,0x9e,0xec,0x58,0x2f,0xa4,0x1d,0x81,0x01,0x0b,0xf1,0x01,0xfb,0xff,0x25,0xed,0xc6,0xe4,0x5c,0xde,0xfb,0xd1,0x40,0xea,0x7f,0x2a,0xe3,0x05,0xd8,0xf4,0x07,0xf9,0x33,0x60,0xdf,0x16,0x02,0x05,0xf0,0xe8,0xe0,0x41,0x14,0x01,0x06,0xda,0x08,0x0c,0x01,0x21,0xef,0xdd,0x00,0x20,0xf4,0x0a,0xed,0xde,0x20,0xf2,0xdf,0xe7,0x0b,0xfd,0x06,0xf9,0x04,0xe5,0xfa,0xf6,0x1d,0x0b,0xfc,0x22,0x7f,0x07,0x71,0x02,0x03,0x18,0x02,0xd6,0x06,0xe4,0x02,0x02,0xfe,0x1f,0xd1,0xf9,0x0f,0xfe,0xf2,0xf2,0x0a,0xe0,0xf9,0x11,0xfa,0x34,0xf5,0xe4,0xbd,0xf8,0x0c,0x7f,0xeb,0xe0,0x2f,0xc5,0x14,0xd2,0xf9,0x11,0x09,0xd8,0x14,0x34,0xf2,0xf3,0xfe,0xe8,0xff,0xea,0xf2,0x3b,0x18,0x0b,0xdd,0x0d,0xfe,0xd0,0x03,0x1c,0xe3,0x7f,0x18,0xcc,0xd5,0x23,0x25,0x20,0xb8,0x0a,0x36,0xef,0x2e,0x2c,0x03,0xf8,0x03,0xff,0xf4,0xd6,0xf2,0x1b,0x7f,0x39,0x1f,0xe1,0x1a,0x03,0x17,0x02,0xd5,0xe2,0xff,0xdb,0xbf,0x1b,0xff,0x09,0xdc,0xf5,0x65,0xf4,0x12,0x02,0xe0,0x3a,0x0c,0xee,0xd2,0xfe,0xf7,0x12,0x1b,0x01,0xb8,0xe0,0xee,0xc6,0x1c,0x07,0x06,0x9d,0xfd,0xcc,0x53,0x1c,0xff,0x1a,0xe4,0x1c,0xf2,0xf1,0x48,0x21,0x1c,0x7f,0x20,0xf0,0xe2,0x9c,0x0b,0x22,0xda,0x13,0x41,0x3d,0x1b,0xfc,0xf5,0xf2,0x19,0x09,0x7f,0x15,0x5a,0xfc,0x20,0x3b,0x63,0x1a,0xf6,0xe2,0x00,0xe8,0xed,0xd0,0xf4,0xbb,0x03,0x41,0x2c,0x32,0x39,0xf8,0x62,0xf7,0xfb,0xda,0x16,0x21,0xfe,0x35,0x2b,0x41,0x13,0xd1,0x0f,0x78,0x50,0xfe,0x04,0x2f,0x1e,0xe1,0x09,0x31,0x0d,0xf2,0xf5,0x0b,0xee,0x08,0xe8,0xf8,0x7f,0x95,0xb5,0x00,0x29,0x04,0x12,0x01,0x20,0x42,0x81,0x19,0x09,0xeb,0xe6,0xe6,0xe1,0x1a,0xca,0xf8,0x01,0xf5,0xc9,0xec,0xa8,0xe7,0xba,0xd2,0x27,0x00,0x3f,0x22,0xba,0x12,0x4b,0xfd,0xff,0x04,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0xb2,0x3b,0xbe,0xc6,0x7f,0xe4,0x20,0x29,0xa7,0x18,0xe5,0xfe,0x3c,0xcf,0x64,0x43,0x27,0xa0,0xd5,0x52,0xbb,0x59,0xc8,0x39,0xcc,0x50,0x68,0x54,0xaa,0x81,0x05,0x15,0xab,0x52,0x9e,0x96,0x1f,0xae,0x36,0x31,0x81,0xd7,0xa7,0xe6,0x64,0x81,0x7f,0x5a,0x5c,0x93,0xaa,0x64,0xb4,0x7f,0xb9,0x5b,0xac,0x67,0x7f,0x52,0x88,0x96,0xb5,0x41,0xf3,0x33,0xe1,0xbf,0xb8,0xc5,0x19,0x0e,0xb8,0xcc,0xcf,0xe2,0x47,0xaf,0x27,0x28,0x33,0xc4,0xc8,0x2a,0xf0,0x36,0xf7,0x2b,0xd4,0x35,0x21,0x07,0xd1,0xe5,0xb1,0x2c,0xca,0x70,0xbc,0xa3,0x6a,0xb9,0x50,0x53,0xaf,0xc1,0xad,0xb4,0x65,0x23,0x60,0x63,0x3d,0x8e,0x9e,0x66,0xba,0x58,0xa4,0x46,0xa6,0x5f,0x73,0x71,0xaf,0xcd,0xaf,0x43,0x81,0x7f,0x81,0x81,0xfe,0x81,0x7f,0x7f,0xa7,0x81,0x81,0x81,0x7f,0x2c,0x7c,0x7f,0x7f,0x81,0x81,0x7f,0x81,0x66,0x81,0x7f,0x81,0x7f,0x7d,0x7f,0x81,0xa4,0x81,0x7f,0xb5,0x37,0xba,0xb4,0xad,0xb3,0x47,0x4a,0xe3,0xb2,0xc5,0xaf,0x3c,0xfe,0x2f,0x2a,0x36,0xc8,0xcf,0x3a,0xc6,0x0f,0xc2,0x41,0xca,0x3d,0x1f,0x21,0xcc,0xc2,0xc1,0x44,0x04,0x45,0xdc,0xd5,0x23,0xc8,0x38,0x49,0xfd,0xc0,0xd2,0xa9,0x47,0x2e,0x11,0x28,0x23,0xd1,0xc6,0x23,0xef,0xf9,0xc9,0x18,0xd6,0x2d,0x1f,0x2f,0xdf,0xf8,0xa8,0x2e,0xab,0x3b,0xbb,0xc5,0xdf,0xbf,0x59,0x63,0xfc,0xaa,0xc6,0x84,0x46,0x59,0x10,0x36,0x39,0xd8,0xc2,0x32,0xcd,0xcc,0xb2,0x32,0xcc,0x31,0x1b,0x46,0xd6,0xd7,0xcb,0x46,0xa7,0x09,0xc8,0xe3,0xd8,0xe8,0x3b,0x23,0x0d,0xd3,0xe3,0xd3,0xfe,0x30,0x0b,0x13,0x16,0x03,0x02,0x13,0xdd,0xd5,0xd6,0x19,0xf0,0x0b,0x04,0x2d,0xed,0xd0,0x08,0x1f,0x3e,0x4c,0xfd,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xac,0x6f,0x00,0x00,0x6b,0x01,0x00,0x00,0xc8,0x6b,0x00,0x00,0x16,0x57,0x00,0x00,0x08,0xef,0xff,0xff,0xb3,0x6a,0x00,0x00,0x5d,0x04,0x00,0x00,0xef,0xfb,0xff,0xff,0x67,0x65,0x00,0x00,0x6a,0xa4,0x00,0x00,0xb1,0x56,0x00,0x00,0x6b,0x6f,0x00,0x00,0xde,0xf9,0xff,0xff,0xa9,0xff,0xff,0xff,0xb7,0xe7,0xff,0xff,0xe4,0xff,0xff,0xff,0xd3,0x00,0x00,0x00,0x87,0x91,0x00,0x00,0x8e,0x43,0x00,0x00,0x32,0xff,0xff,0xff,0xd6,0x42,0x00,0x00,0xe5,0xfd,0xff,0xff,0xf1,0xa7,0x00,0x00,0x03,0x01,0x00,0x00,0xcf,0x2b,0x00,0x00,0x24,0xff,0xff,0xff,0x0e,0x01,0x00,0x00,0x07,0x00,0x00,0x00,0xf8,0x74,0x00,0x00,0x5c,0x6c,0x00,0x00,0xd0,0x3f,0x00,0x00,0xdb,0x03,0x00,0x00,0xca,0x4c,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xf7,0xee,0xf3,0x35,0xfa,0xb2,0xf7,0x5f,0x50,0xfe,0xd6,0xfc,0x11,0x20,0xd5,0x97,0x20,0x00,0xe1,0xf7,0xb7,0x33,0xec,0xf1,0xd1,0x13,0xfb,0x4f,0x7f,0xa5,0xfa,0x8e,0xe5,0xe7,0xfa,0x34,0x03,0xf4,0xee,0x21,0x01,0x95,0x0f,0x8b,0x07,0x03,0xa3,0xc8,0xf1,0xd3,0x0e,0xd7,0x1a,0xeb,0xe4,0x0d,0x28,0xf5,0xa1,0x7f,0x36,0xfb,0x10,0x1d,0x0e,0x7f,0x0b,0xf1,0x39,0x04,0x1e,0xdb,0xb1,0xf6,0xd4,0x13,0xf3,0x35,0xef,0x0d,0x2a,0xb5,0x0e,0xc8,0xf0,0xdf,0x25,0x6e,0xe2,0xf7,0x10,0x3c,0xcf,0x07,0x0f,0xe6,0x45,0xdd,0x17,0xef,0x33,0xcf,0xe1,0x34,0x08,0x34,0xf6,0x0e,0xfa,0xfb,0xfc,0x7f,0xf7,0xe5,0x1a,0xea,0x11,0x1b,0xfb,0x95,0x17,0xfe,0xc7,0xb3,0xde,0x22,0xe7,0xea,0xdc,0x53,0x2a,0x12,0xdb,0x6c,0x16,0xbc,0x01,0x46,0xef,0xdc,0x27,0xf8,0xbe,0x99,0x43,0xe8,0x9a,0xc0,0x93,0xc0,0xfe,0xf6,0xc8,0x7f,0xfd,0x07,0xd8,0xe8,0x20,0x35,0xe5,0xd2,0x71,0xf5,0xdf,0xc7,0xb0,0x1d,0x12,0xde,0xef,0x17,0x01,0x3a,0x11,0x6d,0x04,0x1b,0x68,0x7f,0x1b,0xce,0x1d,0xef,0xe8,0xd5,0xeb,0x35,0xda,0x11,0xb5,0xfb,0xf9,0xe4,0xe3,0x24,0x17,0x02,0x20,0xac,0xf2,0x48,0x11,0xe2,0xfe,0xbe,0xd4,0x81,0x67,0xbd,0x2d,0xea,0xe8,0xec,0xcf,0xf7,0xd9,0x44,0x95,0xea,0x01,0xd2,0x08,0xf5,0x1a,0xb5,0x4d,0xe1,0x15,0xe9,0x01,0xea,0xaa,0xda,0x1f,0xd1,0xf8,0x11,0xbd,0x3b,0x81,0xdb,0xf5,0xfb,0xe0,0xf8,0xe5,0x1e,0xf7,0xf7,0x6d,0x0d,0xf3,0xeb,0x00,0x7d,0x2e,0xf5,0x20,0xe6,0xcb,0xf3,0x09,0x09,0x13,0x1f,0xeb,0xfb,0xc0,0x02,0x27,0x7f,0xff,0x2b,0x26,0x27,0xea,0x30,0x73,0xbd,0xfa,0xc7,0x16,0xb0,0x2c,0xfd,0x20,0xf0,0xce,0x1c,0x16,0xe7,0xf2,0xd9,0x00,0xf9,0x19,0xe4,0xe5,0xf1,0x11,0x3b,0xbd,0xf0,0x2e,0x0c,0x2c,0xe3,0xd5,0x01,0xf3,0xfc,0xef,0x7f,0x08,0x10,0xf3,0xff,0xff,0xf9,0x20,0xff,0x09,0x81,0x51,0x0d,0xc6,0x32,0xf5,0x07,0x12,0xc4,0xe4,0xf4,0x24,0x22,0x06,0x1d,0xe8,0x0b,0xf3,0xf5,0x61,0x00,0x1b,0x4f,0x13,0xd9,0x0f,0x16,0x03,0x4f,0xc6,0x35,0x5b,0x38,0xd7,0x0d,0xf9,0xce,0xd0,0xad,0x1b,0xfb,0xf8,0xd4,0x0f,0xf6,0xfb,0x13,0x23,0x3a,0x52,0x6a,0x09,0x81,0xfe,0x36,0x0d,0xf8,0x29,0xc6,0xec,0xf8,0xf6,0x54,0x31,0x02,0x09,0x5d,0x7f,0x1d,0xed,0xed,0xcf,0xe5,0xb1,0xe4,0x40,0x17,0x90,0xab,0xa0,0xc9,0x13,0xd2,0x3b,0x13,0x0a,0x18,0x55,0xfc,0x6b,0x95,0x2a,0xfb,0xa0,0x16,0x0b,0xa7,0x01,0x09,0x1e,0x0f,0x22,0x61,0x24,0x51,0xdc,0x27,0x38,0xdc,0xd8,0xdf,0xce,0x56,0xe3,0xf1,0x7f,0x66,0xbb,0x31,0xf8,0xba,0xe9,0x02,0xbb,0x45,0x0c,0x23,0x32,0xef,0x0e,0x1a,0xd6,0x00,0xf0,0xd7,0xb9,0xe0,0xd7,0x07,0xd6,0xf9,0x25,0xee,0xe8,0x43,0x35,0xe0,0x7f,0x4f,0xde,0xf0,0xe3,0xda,0x32,0xfe,0xa4,0x23,0x0c,0xf7,0xd2,0x04,0xf4,0x0d,0xe3,0x10,0xef,0xd9,0xe9,0xc3,0xf8,0xe2,0xf5,0xd1,0xf9,0xe7,0x00,0xdb,0x09,0xbd,0x2d,0x16,0x0f,0x05,0xf4,0x7f,0x04,0xe4,0x09,0xf5,0xf8,0xda,0x0f,0xd9,0xef,0x10,0x0c,0x12,0xc4,0xec,0xa7,0x16,0xb6,0x00,0x3f,0x6c,0xf2,0x11,0xab,0x81,0x14,0xc3,0x52,0xa4,0x09,0x93,0x36,0x0b,0xc8,0xa9,0xf4,0xf0,0xe3,0xf4,0x00,0x20,0x11,0xec,0x71,0x15,0x0b,0x28,0x13,0xfd,0xc4,0x11,0x7f,0x0d,0x14,0xad,0x98,0xf5,0xdc,0x43,0x0b,0xb6,0xf4,0xe1,0xe9,0xb8,0xdf,0x82,0xb4,0x17,0xd9,0xd6,0x06,0x28,0xfa,0x1d,0x46,0x98,0x28,0x7f,0x34,0x47,0x34,0x06,0x53,0xfb,0xeb,0x25,0x23,0x51,0xea,0x16,0xc8,0xf9,0xfc,0x14,0xf5,0x57,0x1c,0x46,0x60,0xda,0x0f,0x39,0xc2,0x9a,0xc3,0xa9,0x1d,0xda,0x68,0xe6,0xdc,0xec,0x08,0xc6,0x9a,0x3d,0x07,0x1c,0xd7,0xf0,0xfc,0x7f,0x43,0x54,0x31,0x09,0x6e,0x1d,0xd3,0x5e,0x22,0xb7,0xda,0x46,0x1a,0x55,0x14,0xf4,0x0a,0x3f,0xdf,0xf6,0x24,0xd7,0x00,0x01,0x0a,0x4a,0xed,0x81,0x36,0x27,0x06,0x5f,0xf2,0x01,0xf2,0x0d,0xac,0xf0,0xf2,0x12,0xe2,0xeb,0xcd,0xb4,0xdf,0x36,0xc6,0xd1,0x47,0xe2,0xe3,0xe7,0xf6,0x7f,0x04,0x0d,0xef,0x51,0xe0,0x0c,0xdf,0x14,0xf8,0xad,0xfc,0x17,0xf8,0xbd,0xe1,0x49,0xf1,0x2a,0x07,0xe4,0xf7,0xf3,0x05,0x07,0xe7,0x4c,0x55,0xef,0x10,0x21,0x05,0x1f,0xdf,0xfa,0x72,0xf8,0xd8,0x33,0xf3,0xc4,0x08,0x19,0x59,0xe3,0xfb,0x14,0x33,0xff,0x7f,0xe5,0x1a,0x08,0xd3,0xca,0x3b,0xdd,0x0f,0x22,0xd1,0x28,0x0f,0x06,0xf3,0xd6,0x14,0x12,0x3b,0x24,0x7f,0xab,0xd6,0xf2,0xef,0xd2,0xb9,0x41,0x16,0xfc,0xd8,0xfe,0xfa,0xe0,0x11,0x30,0x4c,0x34,0xff,0xf8,0x1d,0x47,0x7f,0xe0,0xee,0xd6,0x20,0xe0,0xbb,0xee,0x3c,0x15,0xd8,0xcd,0x04,0x17,0x1b,0xbd,0x4c,0x39,0x47,0x50,0xcb,0xe2,0xfa,0xd0,0x28,0xf3,0xb9,0xcb,0xd4,0x1c,0xe8,0x7e,0x60,0xcb,0xc7,0xd3,0xdf,0x3c,0x06,0xff,0xaf,0xcc,0x02,0x4a,0xe4,0x1e,0xd9,0xe2,0x81,0x2e,0xdf,0x24,0xeb,0x50,0xd3,0x00,0xb3,0xd1,0xc5,0x20,0xda,0x18,0x13,0x37,0x7f,0x1e,0x12,0x12,0x14,0xdf,0x03,0xed,0x31,0xc1,0xd4,0x29,0xc1,0xdf,0xeb,0xd1,0xea,0x1b,0x1a,0x01,0xf4,0x08,0x03,0xed,0xf7,0x23,0xea,0x16,0xf8,0xf8,0xfb,0x08,0xc9,0xc7,0xf8,0x12,0x25,0x0b,0x0f,0xf5,0x7f,0x19,0x1f,0xd8,0xaf,0x19,0x06,0x12,0xff,0x21,0xe3,0xfd,0xee,0xf8,0xed,0x00,0xea,0x30,0x11,0xfb,0x41,0x41,0x04,0xf5,0xad,0xe3,0xe4,0x11,0x33,0x05,0xd5,0xfe,0x5a,0x59,0x1a,0x0a,0xdd,0x72,0x20,0xbc,0x07,0xe3,0xf5,0xf6,0xd7,0x2e,0x7f,0x0c,0xba,0xe6,0xb0,0x15,0x32,0x12,0x8e,0xee,0xc4,0x16,0x29,0xf5,0xc7,0x3a,0xd3,0x7f,0xfd,0xea,0x74,0xbd,0xbf,0xe8,0xcf,0x00,0x1c,0xff,0xf9,0xde,0x7d,0xfe,0xfe,0xfa,0xdd,0xee,0xd4,0xa6,0x24,0xc6,0xe9,0x99,0x81,0xfa,0x4d,0xa9,0x4e,0x4f,0xd7,0x30,0xe8,0xe4,0x19,0x00,0x0f,0x2a,0x1e,0x08,0xa3,0x05,0xb9,0x10,0x59,0x54,0xf2,0xdc,0xaf,0xe0,0x17,0x7f,0xba,0xfd,0x13,0xe6,0x2e,0xdd,0xce,0x13,0xed,0xd4,0xef,0x1a,0xe8,0xf4,0x17,0x3a,0x01,0x4c,0xe8,0xf7,0x77,0xc0,0x15,0xbb,0x04,0x51,0x06,0xe6,0xf1,0xee,0xfa,0x18,0x3e,0x24,0xd3,0x07,0xcd,0xd0,0xf1,0xf3,0x21,0xd9,0x0f,0xdf,0x9e,0x16,0xea,0xde,0x31,0x32,0xed,0xf4,0x03,0x1a,0xd2,0x7f,0xdc,0x0b,0xee,0x1c,0x0c,0x0d,0x22,0xdd,0xbc,0x96,0x46,0xde,0xc5,0x4c,0x22,0xbc,0x0e,0x57,0x1c,0x23,0x74,0xf8,0x81,0x87,0x22,0x2a,0x28,0x31,0xc8,0xdb,0x12,0x47,0x13,0xf1,0x35,0x37,0xb7,0xd6,0xb7,0x15,0x01,0xf2,0x0d,0x60,0xdf,0x04,0x06,0x27,0x77,0x04,0x5f,0xf5,0xcd,0xea,0xf3,0xb1,0x56,0xae,0x81,0xef,0xeb,0x12,0x1a,0x74,0x4a,0x25,0x14,0x8e,0x46,0x22,0x13,0xfc,0x23,0xee,0xf1,0x0c,0xd2,0xf0,0xfb,0xf3,0xeb,0xf4,0x09,0xdf,0xcc,0xdf,0xf9,0x2e,0x03,0x7f,0x21,0xf0,0x1f,0xfc,0x9a,0x2f,0xd9,0x03,0xfa,0x0a,0xbf,0x56,0x1b,0x0e,0xfd,0xda,0xf8,0x19,0xb6,0x36,0xdc,0xa4,0xda,0xe2,0xf1,0x33,0xe8,0xa1,0x29,0xe9,0xf8,0xcd,0x1e,0x6a,0x7f,0x0a,0xfe,0xee,0x35,0xed,0x51,0x0a,0xec,0xf2,0xed,0xfc,0xf9,0xe4,0xff,0x19,0x1f,0x12,0xb0,0x24,0xfb,0xe6,0xe4,0x03,0x24,0xbc,0x01,0xf3,0xdd,0xea,0x03,0xd5,0x1a,0x0c,0x10,0xd4,0x4c,0x02,0x7f,0xc3,0x05,0x21,0xdd,0x00,0x1d,0xc9,0x01,0x02,0x14,0xfa,0x21,0x4c,0xeb,0xa4,0xe0,0x20,0x81,0x12,0x45,0x8f,0x11,0xc2,0xf0,0xe9,0x23,0xb2,0x01,0x12,0x45,0xf6,0x09,0x82,0x2b,0xec,0x2e,0x27,0x8d,0x2f,0x93,0xb8,0x3c,0xa5,0x45,0x41,0xdc,0x5f,0x1a,0x1f,0xd3,0x7f,0x66,0xdd,0xfe,0xfa,0x37,0x3e,0xdb,0x04,0xd7,0xfa,0xdf,0xc2,0x99,0x17,0x0a,0xba,0x55,0xdd,0xe2,0x6e,0xc0,0xce,0xd5,0xbf,0x13,0xc3,0xbb,0x4f,0xb3,0xfb,0xb8,0xbc,0x0b,0x42,0x2d,0x53,0x23,0x92,0x0a,0xc3,0xe6,0xb7,0xaf,0xf1,0x25,0x32,0x0e,0x81,0x38,0xf1,0x0c,0xff,0xd0,0x46,0x33,0xc4,0xf7,0xb8,0xb2,0xfb,0x0e,0x0f,0xf2,0xd7,0x5e,0xcc,0x11,0xc0,0x1c,0xeb,0x09,0x7f,0xf8,0xf6,0xf3,0xff,0x2c,0x0d,0xc7,0xf3,0x27,0xd0,0x11,0x2e,0x47,0x4b,0xba,0xd7,0x05,0xe5,0xfd,0x59,0xe5,0x1d,0xdc,0x19,0xd0,0x2d,0xb9,0xa4,0xe1,0xc4,0x97,0x28,0xee,0x0f,0xf1,0x7f,0xdb,0x07,0xf3,0xdf,0xc4,0xcd,0x34,0xfa,0xce,0xb3,0xd8,0x13,0xe4,0xad,0xef,0x7f,0xe6,0x1c,0x44,0xea,0xe2,0x19,0x71,0x93,0xd5,0x5a,0xe2,0x82,0xb5,0xac,0x8d,0x09,0xef,0xbf,0xdd,0xef,0xfd,0xd9,0xe3,0xcf,0xfc,0xe0,0xf1,0x42,0xfa,0x4a,0xe9,0x0c,0xf3,0x14,0x02,0x7f,0x07,0xc0,0xf6,0x06,0xdc,0xd8,0x23,0xef,0xfb,0x15,0xd6,0xe0,0xd6,0xf6,0xdf,0x24,0xed,0xe6,0xd6,0x2a,0x08,0x2e,0xed,0xf9,0x61,0xbd,0xf3,0x03,0x23,0xf6,0x0e,0xb2,0xea,0x81,0xfb,0xcc,0xe1,0xe8,0x9c,0xe4,0xf5,0xfc,0xe3,0xf7,0x20,0xd8,0xe2,0x01,0xa7,0x2f,0x8a,0x15,0xd4,0x3f,0x4c,0x81,0x8c,0x97,0xd7,0xdb,0x3f,0x52,0x84,0xee,0xfa,0xd4,0x04,0x14,0x07,0xca,0xc7,0xec,0xe9,0xce,0xd8,0x3b,0x04,0xee,0x92,0xe9,0x04,0xd2,0x40,0x66,0xcd,0xc8,0xff,0xe5,0xf3,0xad,0xbf,0x46,0xc4,0xf4,0x47,0xf6,0x00,0x58,0x7f,0xd9,0xe8,0x25,0xf2,0x04,0xe4,0xc1,0xc3,0xff,0x10,0xe8,0x55,0x07,0x2b,0xf6,0x13,0x3b,0xf9,0xe9,0xfd,0x21,0xd4,0x1d,0xf8,0x04,0xcd,0xff,0x7f,0x1d,0x14,0x01,0x14,0x1f,0x0c,0x5d,0x17,0xa9,0x49,0x08,0xfa,0x16,0x03,0x50,0x19,0x04,0xdb,0xde,0x31,0x2c,0xe3,0xfd,0x1c,0x18,0x00,0xf2,0x13,0x2f,0xf5,0xef,0xb4,0xde,0xdb,0x81,0x14,0xe9,0xdf,0xeb,0xf2,0xf7,0xe4,0xfe,0xfc,0xec,0xf7,0x04,0xf5,0x27,0xd2,0x7f,0x0d,0x1c,0x2e,0x0d,0xee,0xda,0xfc,0xec,0x12,0xfc,0x22,0xf2,0xf1,0xe1,0xde,0xdf,0x0c,0xe9,0xce,0xf5,0xe6,0xfe,0xe8,0xc2,0x0c,0x15,0xeb,0x07,0x09,0xf5,0xc2,0x1d,0x07,0x21,0x10,0xee,0x29,0xc1,0x00,0x62,0xf3,0xe5,0xd1,0x06,0xf3,0x13,0x7f,0x2a,0x12,0x01,0xe5,0x00,0xf0,0xf5,0x06,0x09,0xc3,0xb9,0xd5,0x03,0x0e,0xf9,0x01,0x39,0x0d,0x10,0x05,0x46,0x7f,0xc6,0xee,0x25,0xe3,0x4d,0xeb,0xfd,0xf4,0x09,0x28,0xb0,0xea,0xb0,0xdf,0xd4,0x03,0x04,0xed,0xdf,0xe0,0x01,0x18,0xdd,0x08,0xfa,0x14,0x08,0xf4,0xff,0x1e,0xc8,0x7f,0x1c,0xdc,0x02,0x1b,0xbd,0x46,0xea,0x10,0x1a,0x2d,0x0b,0x21,0x08,0x1d,0x10,0xaf,0xc3,0x2c,0xd8,0xc2,0x1d,0x03,0xcf,0xe8,0x17,0x20,0x09,0xe5,0x26,0x3d,0x1a,0xdc,0xf4,0xfd,0xcc,0xdc,0xb1,0xc9,0x02,0xff,0x12,0xda,0x36,0xd2,0xcc,0x01,0xfe,0x20,0x7f,0x11,0x21,0x0a,0x6c,0xef,0x1b,0xd9,0x20,0x19,0x18,0x05,0x23,0x0d,0xbe,0x3c,0xf6,0xcc,0xec,0xc4,0xd6,0xd5,0xd0,0x81,0xd2,0xd4,0x37,0xca,0x1d,0xc3,0xd4,0x0e,0x23,0xee,0x4f,0xd4,0x09,0xe1,0x92,0xfc,0xf4,0x0f,0x18,0xfc,0xf4,0x07,0x28,0x3a,0xfd,0xee,0xd9,0xc8,0x02,0xb7,0x05,0x1a,0xd7,0x2c,0xb8,0xd5,0x52,0x1c,0xc7,0x1a,0xe0,0x01,0x81,0xe1,0xd9,0x3c,0xdb,0xde,0x10,0x2d,0xd2,0xed,0x00,0xfe,0xf9,0xec,0xec,0xf6,0xa6,0x01,0x1f,0x11,0x03,0x81,0xde,0x4d,0xe3,0x18,0x34,0xe0,0xe9,0x14,0x0c,0xfa,0xdb,0x0e,0xe1,0x0a,0xf6,0xe2,0xb9,0xb2,0x45,0x5b,0xa8,0x98,0x2a,0x43,0x81,0x54,0x84,0xd9,0x06,0xdf,0x05,0xec,0xc9,0xc6,0xd8,0xd0,0x3f,0x24,0x5e,0xeb,0xf9,0x01,0x0c,0xa4,0xa1,0x12,0xd3,0xd6,0x3f,0x3b,0x01,0x03,0xdd,0xf6,0xc7,0xc0,0xdf,0x01,0xf1,0xfe,0xeb,0x28,0x1d,0xf1,0x07,0x3c,0xc6,0x16,0x5c,0x7f,0xe3,0x1f,0x26,0xf8,0xd6,0x33,0xe7,0x6f,0xe7,0x9a,0xbb,0xe8,0xf6,0x01,0xcc,0xf8,0x03,0xcd,0x1c,0x16,0xda,0xe1,0xed,0x17,0x27,0xc3,0x2b,0x26,0xf8,0x18,0xf6,0x02,0xf5,0xe6,0xfa,0x09,0xf5,0xeb,0x26,0x81,0x27,0xf2,0xe2,0x00,0x0f,0xe6,0xce,0xef,0xf0,0xfb,0x25,0x18,0xe0,0xee,0xf1,0x7f,0x1e,0x11,0xd9,0xd8,0xfa,0x15,0xd3,0x02,0xee,0xfc,0xe8,0x2d,0x06,0x0f,0x4f,0x02,0xe9,0xf6,0x04,0x0d,0xdd,0xed,0x05,0xe3,0xe7,0xca,0x02,0xfa,0xe8,0x22,0x1b,0x55,0xf0,0xc9,0xe2,0x0f,0x0e,0xf1,0xa2,0xc1,0xbd,0xcf,0x16,0xc9,0x7f,0x24,0xfc,0xf1,0xda,0x18,0x10,0x18,0xfa,0x11,0x33,0x03,0xdc,0xe6,0xe1,0x1b,0xa2,0xd5,0x23,0xdb,0xf6,0xdf,0xcf,0x24,0xff,0xdf,0x7f,0x16,0xd3,0xf7,0xf5,0xd0,0xb0,0x05,0x0d,0x0b,0x15,0xb2,0xed,0xd6,0x54,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x2f,0xe7,0xff,0xff,0x82,0x23,0x00,0x00,0xe2,0xff,0xff,0xff,0x05,0xfc,0xff,0xff,0x10,0xfe,0xff,0xff,0xcb,0x05,0x00,0x00,0x3c,0x2d,0x00,0x00,0x97,0x48,0x00,0x00,0xb1,0xfb,0xff,0xff,0x0d,0xfc,0xff,0xff,0xc7,0xfe,0xff,0xff,0x9c,0xfa,0xff,0xff,0x73,0xff,0xff,0xff,0x5d,0xf4,0xff,0xff,0xe8,0xfb,0xff,0xff,0xe8,0xfc,0xff,0xff,0x06,0x00,0x00,0x00,0x68,0x30,0x00,0x00,0x88,0xfc,0xff,0xff,0x88,0x3f,0x00,0x00,0x2f,0x35,0x00,0x00,0x29,0x2b,0x00,0x00,0x37,0xff,0xff,0xff,0xf2,0x27,0x00,0x00,0xae,0xf3,0xff,0xff,0x8c,0xfd,0xff,0xff,0xdf,0x16,0x00,0x00,0x5d,0x42,0x00,0x00,0x87,0xec,0xff,0xff,0xb2,0x29,0x00,0x00,0x7d,0x23,0x00,0x00,0x5e,0xfb,0xff,0xff,0x31,0xfb,0xff,0xff,0x11,0x3d,0x00,0x00,0x69,0x05,0x00,0x00,0xd5,0x41,0x00,0x00,0x35,0xff,0xff,0xff,0xca,0x0c,0x00,0x00,0x93,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x19,0xe9,0xff,0xff,0xc0,0xf7,0xff,0xff,0x11,0x07,0x00,0x00,0x05,0xfe,0xff,0xff,0x3c,0x34,0x00,0x00,0x48,0x3f,0x00,0x00,0x00,0x01,0x00,0x00,0x58,0x4a,0x00,0x00,0xe3,0xf2,0xff,0xff,0x61,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xf2,0xf4,0xff,0xff,0xd6,0xff,0xff,0xff,0x66,0xef,0xff,0xff,0x7b,0x3c,0x00,0x00,0xa2,0x2e,0x00,0x00,0xb3,0x12,0x00,0x00,0x59,0x1f,0x00,0x00,0x3f,0x33,0x00,0x00,0x3c,0xfe,0xff,0xff,0x1c,0x15,0x00,0x00,0x14,0x34,0x00,0x00,0x09,0x26,0x00,0x00,0x64,0x20,0x00,0x00,0xe2,0x55,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0xf3,0x32,0x0b,0x24,0xff,0x39,0x14,0xfe,0x1c,0x2f,0xe1,0x1e,0x0b,0xd4,0xb6,0xcf,0x31,0xf6,0x7f,0xec,0x48,0xd7,0x4a,0xdd,0x34,0x48,0xe2,0xcb,0x26,0x1f,0x01,0xbb,0xe2,0x1a,0x1e,0xd3,0xfd,0xc7,0xa4,0xe3,0x10,0x12,0xdf,0x45,0xf6,0xe0,0x29,0xe0,0x71,0xa6,0x03,0x18,0xb5,0x21,0xac,0xf5,0x12,0x1e,0x0e,0x00,0xf1,0x0b,0x0d,0x25,0x7f,0xe0,0x2d,0x0b,0xc3,0xf7,0xd3,0x48,0x06,0x07,0xda,0x09,0xf3,0xc9,0xba,0x10,0xcf,0x00,0xfc,0x1c,0x13,0x1e,0x08,0x47,0xe2,0xd3,0xee,0x11,0x3a,0xbd,0x10,0x43,0xd7,0x5d,0x11,0x15,0xe7,0x0d,0x17,0xf9,0x17,0x23,0x18,0xf1,0x1e,0xfd,0xe2,0xcc,0xf6,0xf6,0x1c,0x01,0x26,0xec,0xf0,0xec,0xeb,0xe2,0x56,0xf5,0x21,0x00,0xf6,0xc5,0xf3,0x03,0xf2,0x19,0xf4,0x01,0x0f,0x31,0xdc,0xf4,0x01,0xdb,0x3a,0x81,0xd6,0x17,0x79,0xec,0xee,0xfd,0xe7,0xe8,0xfa,0xf5,0x06,0xf7,0x16,0x37,0x04,0xed,0x1f,0x21,0xbd,0x24,0xf3,0x44,0xe6,0x0d,0x09,0x24,0x01,0xdc,0x1a,0x2a,0xe3,0xef,0xee,0x38,0x10,0x25,0xed,0x02,0xe7,0x11,0x08,0xfd,0xf1,0x18,0xf5,0xe3,0x26,0x14,0x2d,0xf0,0xe8,0xfb,0x21,0xff,0x02,0xf0,0xf0,0xfc,0xe4,0x07,0x02,0x1f,0x17,0xfd,0x15,0x29,0xd9,0x1a,0x16,0x09,0x09,0x1f,0x24,0x19,0xe8,0x81,0xed,0xcd,0x29,0x34,0x12,0xfb,0x40,0xd8,0x11,0x07,0xd6,0xf3,0xfa,0x06,0xfe,0x3d,0x2c,0xdc,0x1f,0xee,0xdc,0x12,0x38,0x2f,0x2a,0xee,0x02,0xf5,0x05,0x2e,0x0d,0x20,0xf6,0x0c,0xe2,0x20,0x14,0x00,0xce,0x12,0xf3,0x1f,0xd8,0xc5,0xce,0x34,0xfb,0xe7,0x0d,0x1d,0xa0,0xe5,0x4b,0xf0,0x0c,0x3c,0xdf,0x39,0xfd,0x28,0x04,0x0a,0xff,0x0b,0x43,0xf7,0x40,0xe2,0x17,0x24,0x48,0xc6,0x2f,0xbd,0x01,0xdf,0xe5,0xee,0x12,0x52,0xc7,0xab,0x0b,0x0d,0x2b,0x1a,0xf2,0x03,0xd8,0xe7,0xfe,0x27,0xf4,0x2d,0xfa,0xc7,0x25,0x7f,0xe7,0x01,0x2b,0x9a,0xfb,0x5d,0x32,0xed,0xf9,0xff,0x7f,0xf9,0xf0,0x2d,0xd4,0x07,0xe5,0x06,0x15,0x69,0xf5,0xe1,0xfe,0x98,0x95,0x85,0x75,0xfc,0xe9,0x29,0x7c,0xe6,0x0b,0xd5,0x14,0xfa,0xd4,0x12,0x61,0x39,0xe9,0x10,0x24,0x19,0xcc,0x1c,0xf3,0xee,0xa7,0x59,0xf1,0x49,0xe8,0x15,0xe5,0x0a,0x12,0xca,0x9f,0x0a,0x0f,0x23,0x16,0x24,0xc3,0x00,0x17,0xe4,0xd0,0xc4,0x0f,0x16,0xf7,0xda,0x13,0xdf,0x2e,0xf4,0x1e,0xe7,0xf3,0x12,0xe0,0x27,0xf4,0xe8,0xff,0x1c,0x06,0xf0,0x04,0x03,0xf8,0x7f,0xe7,0x51,0xe3,0xee,0x08,0x20,0xca,0x05,0xd1,0xfd,0xf0,0xfa,0xdb,0xae,0xca,0x2a,0x28,0x0f,0x00,0x92,0x35,0x2c,0xe2,0xfe,0x02,0xb0,0x0d,0x05,0xce,0xe7,0xdb,0x02,0xcf,0xd9,0xf1,0xf9,0x07,0xf4,0xe5,0x1b,0x40,0xed,0xd9,0x21,0xce,0xa6,0xd3,0x22,0xf0,0xf2,0x1a,0x40,0xf7,0x49,0xdf,0x17,0xe3,0x28,0x0a,0x0f,0xfa,0xc6,0xd0,0x97,0x12,0x1d,0xae,0xd4,0x37,0x5e,0xa2,0x03,0x53,0xc6,0xdf,0x9f,0x3e,0xe8,0xb5,0xf4,0x14,0x49,0xf7,0x01,0xe6,0xec,0xc4,0x7f,0x02,0xee,0x44,0x4c,0x2c,0x25,0xe5,0xd2,0x20,0x16,0xeb,0xee,0xe1,0xc3,0x42,0xde,0x09,0x27,0xec,0xf4,0xf2,0xf0,0x22,0x13,0x03,0xfb,0xd5,0xca,0x27,0x28,0xc9,0x29,0xf4,0x06,0xf0,0x11,0xe4,0xed,0x01,0x21,0x06,0xfe,0xe4,0xfa,0x0c,0x1f,0xb6,0xf5,0xda,0x03,0x02,0x00,0x05,0xfc,0xf4,0x7f,0x1e,0xff,0x0b,0xfd,0xe4,0xb8,0xde,0xbc,0xe0,0x4a,0x2e,0x01,0xbf,0x15,0x20,0x10,0x20,0x11,0x20,0x1b,0x28,0xb9,0x0b,0xe9,0xf1,0xcf,0x2c,0x00,0xdc,0x4a,0x3e,0x33,0x0b,0xdf,0xa4,0xe6,0x14,0xf4,0xc4,0xd1,0xd4,0x17,0xec,0x16,0x06,0xda,0xca,0x7f,0x15,0xf9,0xc8,0xba,0x33,0xee,0xae,0xfc,0xe8,0xbb,0xfc,0xe6,0x24,0x12,0xe6,0x05,0xf5,0xfb,0x05,0x0e,0xc5,0x32,0xe8,0x04,0xd1,0x0a,0xf2,0xbc,0x1b,0x14,0x15,0xc5,0xf9,0xce,0xfd,0x38,0xfd,0xeb,0xe6,0x7f,0x23,0x45,0x08,0xeb,0xee,0x3e,0x26,0xf6,0xd9,0xbb,0x0a,0xa6,0x1e,0xd3,0xea,0x08,0xf6,0xcc,0x0c,0xe9,0x39,0xea,0x08,0xe4,0x04,0x13,0xfc,0xf5,0xe8,0xe4,0x05,0xeb,0x91,0xea,0x19,0x3c,0xd0,0xdd,0xe0,0x13,0xfb,0xf0,0xe6,0xc8,0x3e,0xef,0xeb,0x13,0x42,0xc2,0xf0,0xdf,0xe1,0xe0,0x0f,0xf8,0xfa,0xc8,0xc5,0xfb,0x2a,0x14,0xee,0x36,0xdd,0x0d,0x01,0xd2,0xe5,0xb1,0x11,0x09,0x59,0x03,0x16,0xeb,0x81,0x24,0xb4,0xd6,0x27,0x02,0x1d,0x29,0x66,0x0f,0xa9,0x35,0x36,0x99,0x2a,0x33,0xfa,0xce,0xd7,0xe1,0xff,0x06,0xfa,0x2b,0x05,0xe9,0xc4,0xdf,0x19,0xee,0xd1,0xca,0x0a,0x44,0x9e,0x09,0xd4,0x5d,0x26,0x26,0xec,0x6a,0x32,0x00,0xf7,0x59,0xf9,0x37,0xfb,0xc9,0x93,0xe0,0xf6,0x03,0xdd,0x3f,0x17,0xf6,0x10,0xed,0x00,0xcd,0xf6,0x90,0xcb,0x12,0xe3,0x3f,0x01,0x7f,0x20,0xfa,0xfc,0x15,0x02,0x7d,0xce,0xe4,0x04,0x12,0x04,0x13,0xcf,0x1a,0x21,0xdf,0x70,0xef,0xf4,0x12,0xe1,0x01,0x29,0x04,0x37,0xf1,0x42,0xf1,0x9a,0x0d,0x1e,0x14,0x05,0x1d,0x18,0xde,0x03,0x06,0xef,0xed,0xb3,0xdf,0x0d,0xec,0x08,0xb4,0x01,0x12,0x0a,0x48,0xec,0xd7,0x7f,0x04,0x37,0xde,0x4f,0xd7,0xd9,0x21,0xa5,0x19,0x0f,0x0d,0x16,0xde,0xe3,0x3f,0xcd,0x36,0x2f,0x34,0x05,0x4a,0xb7,0x22,0x47,0xf0,0xeb,0x07,0x0a,0x25,0xcc,0x8d,0xd5,0xed,0xc6,0xce,0xf1,0xf9,0x37,0xbc,0xed,0x32,0x08,0xbf,0xe9,0x0e,0x9a,0xe3,0x0e,0xe5,0xe0,0xd4,0xca,0xc8,0xd5,0xb2,0x3c,0xd6,0xe0,0x0f,0x19,0x01,0x02,0xf1,0xfc,0xef,0x22,0xff,0x1f,0xdf,0x05,0x23,0x2a,0xf2,0x00,0x48,0xf9,0x00,0xf4,0x69,0x27,0xef,0x00,0x7f,0x04,0x2e,0x2a,0x2b,0x0d,0x35,0xfa,0xf1,0x0b,0xdd,0x14,0x24,0x17,0x03,0xfe,0x27,0x1f,0x07,0xe9,0x13,0xea,0x5e,0x05,0xd5,0x04,0xf1,0x16,0xf0,0xf9,0xd6,0xe8,0xe0,0x00,0x53,0xec,0xf7,0x22,0xeb,0xfd,0x0a,0xd3,0x05,0xf2,0x43,0x9c,0xdf,0xcc,0x01,0x00,0x14,0xe4,0xfa,0xe3,0x40,0x0b,0xa5,0x05,0xdb,0x11,0x26,0x8b,0x8f,0x1d,0x6d,0x01,0xc9,0xdb,0xc0,0x44,0x19,0x81,0x14,0xd1,0x44,0xfe,0xcf,0x36,0xed,0xde,0x19,0xeb,0xeb,0xf8,0x05,0x3d,0xf7,0xd4,0xcd,0x3e,0x1b,0x65,0x72,0x13,0xd1,0x59,0x1a,0x11,0x28,0x00,0xd9,0xd3,0x12,0x08,0x20,0xd4,0xf2,0x17,0x02,0xf8,0xf1,0x06,0x03,0x36,0xe4,0xc5,0x16,0x7d,0xaf,0x35,0x2e,0x19,0xf2,0x7f,0x0e,0x0e,0xe4,0xf8,0xd9,0xf9,0xf2,0x0f,0xfe,0xc4,0x41,0x08,0x07,0xde,0x42,0xfe,0xdd,0x00,0x04,0xfd,0xe5,0xda,0x04,0xea,0x0b,0x0f,0x48,0xf9,0x07,0x1c,0x0e,0x16,0xfc,0xfb,0x25,0xf0,0xcd,0xfa,0x03,0x22,0xec,0x1b,0xee,0x20,0x13,0xea,0x00,0xfc,0xf8,0x1d,0x08,0x1c,0x7f,0x37,0x2f,0x11,0x03,0x36,0xc8,0xe2,0xe8,0x1b,0x66,0x12,0x0c,0x26,0x91,0x20,0xe6,0xff,0x2b,0x5c,0x02,0xcb,0x06,0x28,0x21,0xfc,0xee,0x17,0x18,0xfd,0xf6,0xde,0x17,0x44,0x61,0xfb,0xf8,0x20,0xc2,0x07,0x1a,0xfe,0xe5,0xd4,0x0b,0x16,0x29,0x04,0xec,0x6b,0x42,0x1a,0x22,0x7f,0x90,0x00,0xca,0x33,0xd1,0xa4,0x09,0xe9,0x59,0xbe,0x01,0x1b,0xf3,0x7d,0x1a,0xd2,0x2b,0x0c,0x04,0x38,0xca,0x26,0x38,0x30,0xc9,0x2a,0x7c,0x12,0xe5,0x02,0x1e,0x03,0xe2,0x07,0xfd,0xca,0xf4,0xd3,0xc2,0x4c,0xeb,0xca,0x47,0x64,0xe7,0x0e,0xfa,0xc2,0xf0,0xfd,0x9f,0x3f,0xca,0x0c,0xa7,0x47,0x05,0xee,0x17,0x0a,0x0f,0xf7,0xcb,0xfc,0x3c,0x58,0x07,0x18,0x36,0xf6,0x24,0xeb,0xf7,0x17,0xfc,0xf4,0xe9,0xfb,0x7f,0x13,0xf2,0xf9,0xee,0x06,0xe6,0xf9,0xe9,0xdb,0xdb,0x3a,0xda,0xd8,0x0e,0x0e,0x44,0xd9,0x10,0x02,0xfc,0xfd,0x2e,0x15,0xc2,0x0e,0x00,0xf1,0xdb,0xfe,0x15,0xfd,0x0a,0x00,0xe7,0x2d,0x04,0x19,0xeb,0xd1,0xee,0x28,0x22,0xe3,0xd9,0xbc,0xe1,0x27,0x05,0xf4,0x25,0x2c,0x0f,0x31,0x45,0x0d,0x00,0x13,0xe6,0x05,0x0c,0xe9,0x16,0xe3,0xde,0xaa,0xfe,0x76,0x1c,0x26,0xdb,0x12,0xf9,0x18,0xa3,0x1d,0x14,0xdb,0x0d,0x03,0xed,0x0c,0x0a,0x4c,0x18,0x2a,0x38,0x52,0x33,0xd3,0xfe,0xff,0xd8,0xfa,0xf2,0x0f,0x06,0xee,0x22,0xee,0x5b,0x22,0x07,0xf8,0x02,0x63,0x08,0xe0,0x4e,0xf6,0xd7,0x81,0x59,0xde,0x08,0x40,0x0d,0xd9,0xf2,0xf0,0x26,0x81,0x4c,0x24,0x34,0xd1,0x10,0xd9,0x13,0x96,0xda,0xdb,0x2e,0x07,0xd4,0xfd,0x36,0xcf,0xcd,0xd1,0xd9,0x06,0xb7,0xf1,0x00,0xeb,0x18,0xd5,0xdf,0xf0,0xd9,0x3d,0xd3,0xaa,0x10,0x47,0xf5,0xfb,0xde,0x59,0xd3,0x0c,0x42,0x1a,0xf1,0x28,0xf7,0x1e,0xb8,0xfc,0xc0,0xf0,0xea,0xe2,0x1e,0xf4,0xd4,0xf2,0x1b,0xd6,0xf5,0xdd,0xcf,0x35,0xd2,0xf8,0x17,0xf3,0xd8,0x3b,0x25,0x11,0x0c,0xb2,0x2f,0x07,0xad,0xff,0x28,0xd2,0x40,0xf2,0x99,0xfe,0xef,0x22,0xd5,0x93,0xca,0x05,0xe8,0xf9,0x0d,0x21,0x0b,0x0a,0xdf,0xde,0xcc,0x04,0x81,0x46,0x25,0x18,0x34,0x0b,0xfe,0xe9,0xec,0xdd,0xef,0xe0,0x3e,0xf8,0xcb,0x1c,0xe8,0xd0,0xab,0xcf,0x29,0xdd,0x00,0x12,0x53,0x03,0x02,0x1e,0x14,0x08,0x0a,0x09,0x75,0x01,0x21,0x21,0x34,0x05,0xce,0x1e,0xf8,0xcf,0x44,0x4c,0x14,0xed,0xe0,0x25,0x26,0x13,0xfb,0xd9,0xf5,0x0e,0xf7,0x47,0x3d,0x27,0x24,0x3e,0x07,0x15,0x27,0x52,0xfe,0xfc,0x0d,0xee,0xd1,0xea,0xca,0xc4,0x4b,0xee,0xfb,0x0f,0x3a,0x37,0xa9,0x0a,0x55,0x57,0xee,0xec,0x7f,0x1e,0x19,0x32,0x97,0xdb,0x1f,0xb2,0x3b,0xe4,0x7f,0x03,0xe7,0xec,0xc4,0xf6,0xfc,0x27,0x51,0x43,0x02,0xd0,0xbb,0x0b,0x2b,0x9a,0xf5,0x44,0xfe,0xb5,0x23,0x35,0xd2,0x47,0xca,0x7b,0xda,0xee,0x0a,0x35,0x65,0xb9,0xb6,0xdc,0x41,0xef,0x1c,0xed,0x13,0x50,0x03,0xe8,0x18,0xef,0xfe,0x04,0x16,0xfc,0x1f,0x00,0xf1,0xbb,0xf8,0x0f,0x59,0xc8,0x09,0xf0,0x5a,0x10,0xbe,0xf5,0x16,0x2c,0xc7,0x4d,0x15,0x2b,0xd6,0xf2,0x28,0x38,0xc9,0x09,0x27,0xff,0x26,0xfa,0xde,0x3c,0x22,0xf2,0x07,0xec,0x0c,0x43,0x1a,0x02,0x1e,0x3c,0x03,0xca,0xe3,0xf2,0xbe,0xdc,0x29,0x0d,0x81,0x27,0x02,0x5b,0x3d,0xd6,0xff,0x46,0x47,0xe8,0x2b,0xc3,0xd7,0xfd,0xee,0x5c,0xe9,0x3a,0x12,0x04,0xfb,0xf1,0x1b,0x39,0xf2,0x20,0xfe,0xd7,0xef,0x0d,0xf9,0x13,0xed,0x06,0xf0,0x31,0xef,0x0e,0x0d,0xdc,0xe8,0x12,0x31,0x02,0xc5,0xe7,0xda,0x14,0x10,0xc5,0xcb,0xf3,0xfb,0xe3,0x26,0xf1,0x03,0xfe,0x14,0xd0,0xef,0xe7,0x7f,0x0e,0x03,0x10,0xd5,0x01,0xf6,0xef,0x02,0x00,0x04,0x36,0xef,0xd4,0x0c,0x16,0x1f,0xfe,0xe7,0xf2,0xef,0x0b,0x07,0xef,0xfa,0xd9,0x49,0x11,0x4c,0xf3,0x4e,0x7f,0xe9,0xb6,0xcc,0xf8,0xe1,0x19,0xc1,0x15,0xbf,0xc4,0x14,0xc0,0x07,0xcb,0xbe,0x70,0xc2,0x3c,0x12,0xdd,0x4f,0x04,0x06,0xe1,0xd2,0x23,0xdb,0x22,0xf9,0xb4,0x00,0x12,0xd1,0xae,0x57,0xf8,0xf4,0x37,0x32,0xea,0xcd,0xd6,0xdd,0xd8,0x1b,0x0b,0xbd,0x41,0x42,0x35,0xda,0xd6,0x10,0x26,0x22,0xf5,0x0c,0xe7,0x02,0x0a,0xfc,0xea,0xfe,0x56,0xf8,0x3b,0xe6,0x16,0xbc,0x0c,0x12,0x08,0x4a,0xf7,0x2e,0xd5,0x4c,0x1c,0xdc,0xeb,0x7f,0xe7,0x1a,0x05,0x0b,0xff,0x0c,0xf8,0xab,0x1b,0xee,0xcd,0x00,0x06,0xd7,0x21,0x1e,0x50,0xf0,0x0f,0x0b,0xb7,0x21,0x12,0xec,0x0e,0x19,0x2e,0xf4,0xd4,0xe0,0x4c,0xfc,0x26,0xeb,0xf0,0x44,0xb0,0x43,0xe3,0xfc,0xf2,0xf9,0x19,0xb7,0xc9,0x39,0xd5,0x1e,0x06,0x07,0xeb,0x02,0xf3,0x1f,0x81,0x05,0xb9,0x30,0xe4,0xf2,0xd3,0x02,0xdf,0x10,0x0e,0xf9,0xf1,0xd6,0x05,0x24,0xe3,0x03,0xfa,0xc7,0x0f,0xed,0xff,0xd0,0xc3,0x05,0x2b,0xfa,0x0b,0xd4,0x19,0x4a,0xe6,0x4c,0x16,0xee,0x14,0xe9,0x0c,0xae,0xe9,0xd8,0xd1,0xdc,0xd4,0x1a,0xdf,0xf5,0xd5,0x0e,0xde,0xf6,0xf7,0xea,0x05,0x18,0xef,0xd5,0x03,0xce,0xf3,0x1b,0xdb,0x2d,0x10,0x21,0x3f,0xf9,0xdd,0xd8,0xe6,0x0e,0x12,0x09,0x07,0xed,0x0f,0x2c,0x1b,0x12,0xee,0x00,0x05,0x7f,0xd6,0x39,0xd5,0x4d,0x38,0x05,0xfe,0x39,0x21,0x05,0xfc,0x48,0x27,0x04,0xfc,0xec,0xf4,0x0c,0xce,0x26,0xf6,0xf8,0xf7,0x2b,0x49,0x18,0x25,0x1e,0xff,0xda,0x2f,0x56,0x0f,0x2a,0x4a,0x24,0xf0,0xe4,0x37,0xe8,0x0a,0xa0,0x21,0xe5,0x93,0xaa,0x08,0x0b,0xa5,0xff,0xf1,0x0f,0xd4,0x64,0xe0,0xd2,0xbd,0xf9,0x44,0x43,0xeb,0xe5,0x0e,0x08,0xdd,0xe1,0x2c,0xee,0x81,0x45,0xe6,0xdf,0xd1,0xa5,0x65,0xe1,0x03,0xeb,0xfc,0xf8,0xe6,0x0a,0xed,0xb5,0x20,0xd5,0xca,0x3a,0x2d,0xf3,0x1a,0xf1,0x3b,0xd9,0x9e,0x0d,0x4a,0xe3,0xa9,0xc8,0x0c,0x85,0x25,0xf0,0x2b,0xb5,0xb7,0xf3,0xad,0x2c,0x45,0x57,0xf8,0x4a,0xa0,0xe3,0x32,0x22,0xfc,0x10,0x03,0x40,0xe2,0xd4,0xea,0x05,0xf2,0x2f,0x34,0x81,0xba,0xbf,0xef,0xe8,0x2b,0x0e,0x3e,0xb0,0x44,0x04,0xa7,0x2f,0x20,0x33,0xfe,0x3c,0x41,0x21,0xbe,0xdc,0xf9,0x10,0x15,0xd8,0x19,0x47,0xad,0x2c,0x0d,0x2b,0xf4,0xfc,0x35,0xbd,0x2d,0x0d,0x36,0x58,0x22,0x07,0xee,0x05,0x7f,0x15,0xc5,0x17,0x0c,0xfd,0xf6,0xe3,0x1d,0x2f,0xcc,0x9a,0x5a,0x0d,0x31,0xc9,0x65,0x0c,0xdc,0x2c,0x3b,0xe4,0xfd,0xe1,0xa4,0xf4,0xfc,0xeb,0xc4,0xcc,0xf3,0x0c,0x32,0x33,0x12,0xf0,0x27,0xaf,0xfa,0xd6,0xdd,0x1b,0xcc,0xcf,0x41,0x32,0xef,0xde,0x18,0x08,0xe9,0xc2,0xaa,0xbc,0xf3,0xaa,0x03,0x2f,0xf3,0xc9,0x81,0xbb,0x91,0x19,0x26,0xfe,0x07,0xfc,0x17,0xcb,0xb3,0x0d,0xd6,0x15,0xa5,0xf0,0xc2,0xbd,0x34,0x1e,0xcf,0xf8,0xdf,0x19,0xdc,0xb4,0xe8,0xde,0x8c,0x10,0xfa,0x05,0x3a,0xe5,0xe5,0x04,0xce,0x0e,0xf2,0xf5,0x2d,0x12,0xf3,0x00,0x8a,0x37,0x15,0xd8,0xa3,0x35,0x0a,0x81,0xbe,0xfd,0xfe,0x2c,0x35,0xdd,0xed,0x32,0xb5,0xed,0x0d,0x14,0xe8,0xd9,0x3c,0x31,0x18,0x09,0xfe,0x3a,0x0b,0x1b,0xfa,0xe5,0x22,0x07,0xcd,0x38,0xc6,0xeb,0x08,0x7f,0x0c,0x5c,0xf5,0x1a,0xe5,0xd2,0xcf,0xdb,0x04,0x5a,0x0e,0xe9,0x35,0x1b,0xd1,0x23,0xe6,0xf8,0xfc,0xeb,0x34,0xdd,0x49,0xd6,0x00,0x47,0xd4,0x11,0x0b,0xfa,0x1d,0x37,0x18,0xe8,0x28,0xeb,0x47,0xb3,0xe4,0x4c,0x28,0xf9,0x28,0x3c,0xea,0xf9,0xf2,0xda,0x1e,0xc4,0xfd,0xc1,0xd8,0xf8,0xfd,0x7f,0xf1,0x2d,0xaf,0xe2,0x08,0xe1,0x33,0x34,0xe8,0x1a,0x3b,0xd5,0xf7,0xbd,0x3b,0x0e,0x31,0x03,0x01,0xbf,0xe1,0x51,0x07,0x08,0x49,0xf8,0x4b,0xa5,0x4b,0x25,0x27,0xfe,0xee,0x07,0xd7,0xb5,0xf3,0xd4,0x51,0xc3,0x34,0xd8,0x29,0xe4,0x1a,0xca,0xbe,0x1d,0x14,0x55,0x0f,0xa0,0xd0,0xd7,0x14,0xa1,0xc4,0x61,0xb4,0xf0,0xbd,0xf3,0xd6,0xf0,0x81,0x43,0x2b,0x20,0xdf,0xfc,0x52,0x2d,0x35,0xec,0xd5,0xe2,0x51,0x4b,0x29,0xfc,0x1c,0xd7,0x36,0x12,0xcc,0x04,0xee,0xd5,0xac,0x30,0xd5,0xe8,0xfb,0x18,0xf1,0xf2,0x1a,0xc2,0x2b,0x18,0xae,0xe0,0x9f,0xcd,0xbb,0xec,0x4d,0x18,0xc3,0x7a,0x3e,0xba,0x20,0xf8,0xe7,0xde,0xd9,0xbd,0xe1,0xc6,0x73,0x5b,0x7e,0xd5,0x1e,0xe9,0xcd,0xcd,0xd4,0xc7,0x00,0x0e,0x6a,0xf7,0x3d,0xff,0x11,0x7f,0x0e,0x18,0xcd,0x0b,0x31,0x3a,0x49,0x0a,0xed,0xdd,0xf5,0x1d,0xbd,0x3f,0x29,0x0b,0x0c,0x07,0xf6,0x46,0x15,0xb6,0xd2,0x40,0x4b,0xc9,0xee,0x67,0x40,0x44,0x56,0x4d,0x0e,0xda,0xfc,0xf3,0xea,0xf6,0xfd,0xff,0x17,0xf9,0xf9,0x05,0xd8,0xf9,0x05,0x07,0xee,0xe0,0x13,0xf3,0xc8,0xf0,0xab,0x0a,0x41,0x3d,0xda,0x9f,0xf5,0x04,0x81,0x14,0x07,0x09,0xff,0x24,0x0b,0x0d,0xee,0xce,0xf3,0x0b,0xfb,0x02,0x2d,0xf0,0x18,0x1e,0xf8,0xfb,0xf4,0xf5,0x3c,0x06,0x15,0xfd,0xfb,0xbe,0x12,0x01,0x06,0x10,0x0c,0x29,0xea,0xf2,0xf6,0xfd,0x1e,0x2a,0x15,0xf7,0xed,0xbd,0xd6,0x34,0xe9,0xfe,0xc4,0x43,0x3a,0xb2,0x4f,0xe7,0xeb,0x3d,0xbc,0x7f,0xe0,0x33,0x0e,0x28,0x27,0xe5,0xf0,0x35,0x19,0xca,0x10,0xdc,0xdc,0xb3,0xf2,0x06,0x0a,0xdf,0x45,0x31,0x15,0xf4,0xb7,0xf7,0x10,0xff,0xff,0xd9,0xe1,0xe1,0xd0,0x0f,0x03,0x03,0xfc,0xfe,0x0e,0xc9,0x17,0x21,0xc9,0xe4,0xf8,0x98,0x08,0xfe,0x20,0x5a,0x1c,0x3b,0xfd,0x00,0xe5,0x27,0x13,0xc0,0x45,0x1f,0xeb,0xfb,0xe2,0x23,0x0d,0xd4,0xeb,0xf4,0x1a,0x1b,0x06,0xe4,0x1a,0x2e,0x4c,0x1d,0xea,0x1e,0xd8,0x8f,0xfa,0x3b,0xdd,0xe4,0x2a,0x0d,0xf9,0x02,0xce,0x07,0x11,0x18,0xeb,0x1b,0x21,0xfd,0x81,0x09,0x02,0xf3,0x0e,0x19,0xf0,0x3d,0xd0,0xc9,0xfb,0x72,0x36,0x24,0x32,0x15,0x04,0x12,0x7f,0x3a,0x0d,0x1a,0x1d,0xe4,0xf0,0x07,0x09,0x0a,0xff,0x59,0x18,0xbf,0xe9,0x2b,0xf2,0xf0,0x29,0x1e,0xf1,0x31,0xc8,0xe2,0x4c,0xf7,0x6c,0xf6,0x51,0x1c,0xec,0x1b,0x3a,0x17,0x08,0xf7,0x43,0xec,0xc4,0xeb,0x20,0x2f,0xe4,0x26,0xf1,0xfe,0xd1,0xfe,0xe4,0x69,0xfb,0x03,0xd4,0xf3,0xbf,0x44,0xed,0x4c,0xec,0x10,0x52,0x0f,0xc6,0xf5,0x24,0x1c,0xe7,0xf3,0xbc,0x19,0x7f,0xe4,0x4c,0x0d,0x11,0xf4,0xeb,0x14,0xbb,0x45,0xe9,0xce,0x0d,0x0f,0xc7,0x1c,0x12,0xf0,0x18,0x06,0x0f,0xc2,0xd6,0xd0,0xb9,0x03,0x15,0xe2,0x18,0x4f,0x4d,0x3b,0x02,0xd4,0xe2,0xfb,0x2c,0xe0,0x1d,0x18,0xc8,0xf6,0x29,0x1c,0xf1,0xea,0x20,0x24,0x8c,0x1e,0x05,0x22,0x2a,0x00,0x11,0xe4,0x00,0x17,0x1d,0xc5,0x0e,0x7f,0xe6,0xd0,0xd4,0xee,0x45,0xd5,0x26,0xd7,0xe4,0xeb,0x47,0xf1,0x6a,0x1c,0x26,0x45,0x42,0xeb,0x06,0x2e,0xfc,0xd5,0xfa,0xcb,0x01,0xf4,0xc2,0xe3,0x0b,0x0a,0xcd,0x49,0x01,0x28,0x19,0xde,0x86,0xd8,0x11,0xfd,0x1c,0x25,0x2a,0x1a,0x05,0x1c,0xf5,0x78,0x34,0x1e,0xe7,0x06,0x1d,0xe7,0xcc,0xde,0xfb,0x02,0xf2,0x7f,0x26,0x08,0xb7,0xd6,0xaa,0x0c,0xe8,0x23,0x28,0xfb,0xef,0x04,0x0b,0xd8,0x02,0xc1,0xf0,0x31,0x2b,0xe6,0x1b,0xfe,0x0c,0x1a,0xbe,0xf9,0x14,0xef,0xe2,0xc8,0xe0,0xf2,0x2a,0x6d,0x0d,0x15,0xc3,0xfe,0x43,0x2c,0x12,0xf4,0x6a,0x10,0x1c,0x28,0xdf,0xf5,0x15,0xb1,0xd7,0x03,0xea,0xf3,0x42,0x9a,0xec,0xcb,0x3e,0xf3,0xc6,0x69,0x10,0xf0,0x14,0xea,0x17,0x00,0x6f,0xe7,0x81,0xe9,0x8b,0x0a,0xd5,0x62,0x4c,0x38,0x57,0x92,0xb6,0xeb,0xe9,0xe4,0x63,0xb3,0xfd,0x00,0x2e,0x3f,0x11,0xee,0xf3,0x05,0xdc,0x88,0x0c,0x2c,0x4c,0xd6,0xf2,0x06,0x1c,0xdc,0x55,0xeb,0xfe,0xb5,0x0d,0xa3,0x07,0x22,0xae,0x3a,0xd2,0x79,0x26,0xf8,0x3f,0x26,0x31,0x2c,0x29,0x45,0xfb,0x34,0xfa,0x6a,0x38,0xbc,0xe0,0x55,0xfe,0xf8,0x21,0xfb,0xe9,0xec,0x0b,0xca,0xd7,0xbb,0xff,0x7f,0xfc,0x1b,0xcf,0xd5,0x33,0x54,0xfc,0x0e,0xd3,0x25,0xfc,0x31,0xc0,0x4d,0xe9,0x09,0x39,0xc9,0xe5,0xf3,0xe3,0x22,0xf9,0xf1,0xb5,0xff,0x7f,0xec,0x46,0x09,0xfb,0xdf,0xc8,0xcf,0x37,0x35,0x56,0x17,0xf2,0xf9,0xee,0xe1,0x04,0xf6,0xf9,0xf0,0xc6,0x1e,0x04,0xd9,0x04,0x31,0x1d,0xc3,0x75,0x58,0x8a,0x31,0x2d,0x10,0xa5,0xd6,0xee,0x29,0x8b,0x39,0xef,0x24,0x39,0x01,0x02,0x44,0x21,0xfa,0xb2,0x8a,0x95,0xe4,0xde,0xdd,0xf4,0xc8,0xf1,0x28,0x23,0x64,0xff,0x3f,0xcf,0x81,0x32,0x01,0x0f,0xc6,0xef,0xc4,0x0e,0x01,0x3a,0x29,0xb0,0xf4,0xf9,0x22,0x16,0xb9,0x00,0xd0,0xf3,0x1e,0x57,0x03,0x10,0xea,0x56,0x22,0xf1,0x3d,0x0a,0x06,0xd2,0x9a,0x67,0x14,0xd6,0x3e,0xd7,0xbf,0xea,0xf0,0xd5,0x32,0xbe,0x24,0x01,0x9e,0x11,0xd0,0x1e,0x8e,0xaa,0xd1,0xfa,0xe8,0xf4,0x1d,0x3b,0x7f,0x14,0xe8,0xe0,0xba,0x06,0xc1,0xf7,0x14,0x98,0x18,0xa5,0x0e,0x48,0x2f,0xf5,0xc3,0xca,0xce,0xf9,0x3f,0x28,0xd5,0x27,0x2e,0x19,0xdd,0x68,0x1e,0x44,0x03,0x07,0xe4,0xe0,0xf5,0x40,0xf7,0x5f,0xfc,0xbf,0x41,0xf7,0x0a,0x9e,0x18,0xda,0xc8,0x19,0xdf,0xfa,0x2f,0xe8,0x07,0xfa,0xf0,0xee,0xfa,0xb9,0x29,0x06,0xb1,0xae,0x08,0x2f,0xec,0xf9,0xfc,0xdf,0xbe,0x7f,0xc3,0x1b,0x0f,0x11,0xd8,0x32,0xfd,0xe8,0xed,0x0d,0xbf,0xef,0xee,0x48,0xf7,0x02,0xf8,0xd9,0xef,0xf2,0x2e,0xee,0x11,0xea,0xfe,0xd8,0xf6,0xc0,0x30,0xb4,0x20,0x12,0x09,0xf9,0xcf,0xe9,0x09,0xca,0xd6,0x4e,0x30,0xf8,0xea,0xeb,0x03,0x81,0xee,0x34,0xf6,0xf8,0xf5,0xda,0x30,0x05,0x04,0xf6,0x11,0x40,0xee,0xfc,0x0a,0xda,0xea,0x13,0x0d,0x1e,0x3e,0x11,0x2a,0x0e,0x09,0x18,0x31,0xd9,0xd1,0x0a,0xe5,0xd1,0x53,0x3a,0xd5,0xd5,0x4c,0x6d,0x03,0xde,0x3a,0xd3,0x21,0x11,0x81,0x15,0x40,0x5b,0xfc,0x15,0xb3,0x14,0x8e,0x47,0x3e,0x8a,0xb0,0x2a,0x57,0x40,0xee,0xc1,0xf4,0x2a,0x0c,0xef,0xc0,0xb6,0x2e,0x74,0x73,0x1e,0xf8,0xe7,0x1d,0x8c,0x6d,0xf6,0xec,0x35,0xc6,0xf2,0xde,0x0a,0xc9,0xcb,0x07,0x15,0xe1,0x1b,0x47,0x0f,0xf0,0xf1,0xf9,0x0d,0x1a,0x41,0x08,0x58,0x29,0xf7,0x0e,0x1f,0x50,0xeb,0xe7,0x19,0x47,0xf3,0x3d,0x0c,0x21,0xfd,0x08,0x09,0xde,0x7f,0x15,0xfd,0xe5,0x29,0x0c,0x15,0x02,0xfa,0xdd,0xeb,0x07,0x26,0x01,0x16,0x3e,0x3d,0xda,0xe0,0xda,0x1c,0xde,0xe1,0x2b,0xe7,0xf8,0x04,0xc3,0x21,0xf7,0x6f,0xd2,0xf7,0xd2,0x55,0xb7,0xe6,0x20,0xf6,0xf8,0xd4,0x3e,0xe7,0x2e,0x3b,0xd7,0xd8,0xb3,0x9e,0xc1,0xde,0x37,0x2f,0xcb,0xb9,0x25,0xb1,0xb7,0xc9,0x0a,0xa2,0x5f,0x17,0x82,0xb1,0xce,0x19,0x36,0x26,0xba,0x0c,0x09,0xea,0xf1,0xea,0xda,0x04,0xf9,0x18,0xee,0xb5,0x9f,0xb4,0xfc,0xc9,0x7f,0x15,0xe8,0x05,0xe4,0x24,0x22,0xf0,0xd7,0xda,0x14,0xde,0x2b,0x0e,0x08,0x9c,0x4a,0x03,0xec,0xea,0xe4,0xd1,0x2f,0xc6,0x4b,0xd1,0x7f,0xf9,0x0e,0xe6,0xd8,0x2f,0xe2,0x7a,0xb0,0x2c,0xdf,0xd2,0xd2,0xe3,0x17,0x21,0xd4,0x35,0x1b,0xf9,0x26,0xfb,0x13,0x4e,0xff,0x01,0x42,0x07,0xea,0xc9,0xe5,0x34,0x30,0x20,0xf6,0xd2,0x13,0x2c,0xcb,0x3d,0xf8,0x42,0xcc,0x1a,0xf3,0xeb,0xe9,0x37,0x1c,0x17,0x41,0x03,0xa7,0x1a,0x31,0x35,0xd2,0xf7,0xdb,0xa2,0x2b,0x09,0xcd,0xdc,0x20,0xfa,0x0f,0xed,0x39,0x11,0x27,0x12,0xeb,0x1b,0x20,0xad,0x19,0xa5,0x0c,0xff,0x64,0xd3,0xc7,0xef,0x1f,0xe5,0x44,0xc1,0xdc,0x10,0x2e,0xa8,0x2e,0xdf,0xc7,0xd2,0xfb,0x26,0xc0,0xe2,0xf2,0x52,0x28,0xea,0xfc,0x8b,0x3c,0x29,0x4b,0x38,0xaa,0x7f,0x0a,0x3f,0x4b,0xf3,0xe0,0xc9,0xe4,0x06,0x16,0xdf,0xaa,0xd1,0xec,0xf2,0x28,0x23,0x00,0x1a,0xeb,0xe3,0xb3,0x3d,0x49,0x2a,0xac,0x1e,0xea,0x29,0xcb,0xbe,0x52,0xe2,0x07,0xd8,0xf1,0x20,0x32,0xc4,0x39,0x12,0x02,0xd5,0xd2,0xf3,0xeb,0xe9,0x13,0x3d,0xec,0x6c,0x13,0xf9,0x10,0x73,0xe0,0xd9,0xe0,0xf7,0x19,0xec,0xfd,0xe7,0x08,0xca,0x37,0xe9,0xfd,0xf5,0x03,0x23,0x05,0x7f,0xd2,0xf1,0x02,0xdd,0xf8,0xc4,0xce,0xd6,0xeb,0xb1,0x1e,0x21,0xfe,0x1a,0xfd,0xd9,0x0d,0x0f,0x7f,0xcc,0x51,0x0a,0xfb,0xf3,0x21,0xdf,0x41,0xf8,0x04,0x18,0x08,0x03,0x05,0x31,0x39,0x1c,0x74,0xf5,0x1a,0x03,0xe6,0x35,0x5c,0x03,0xee,0x55,0xbf,0xff,0x3c,0xe1,0x1f,0x0e,0xf7,0x2c,0xec,0x51,0xbe,0xc2,0xee,0xf3,0x15,0x11,0xeb,0xf1,0x37,0x1d,0x21,0x7f,0x01,0x69,0xe8,0x0f,0x20,0x1e,0x57,0x10,0x54,0xbf,0xf8,0xe4,0x27,0x22,0x0e,0xe2,0xc7,0x42,0x09,0x07,0xe7,0x01,0xbe,0x10,0x41,0xdb,0xdf,0x39,0xc9,0x11,0xde,0xd7,0xf7,0x0c,0x1b,0xd9,0x1b,0xe7,0xde,0xf9,0xf6,0xe8,0x22,0x3d,0xf8,0x15,0xfb,0x79,0xf3,0x1c,0xfc,0x06,0xcb,0x09,0x52,0xfe,0x2d,0x16,0xf7,0x09,0xe5,0x43,0xe0,0x48,0xce,0xed,0x0e,0xc1,0xea,0x32,0xc0,0xe0,0xd7,0xf2,0x77,0x0d,0x76,0x18,0xd6,0xb5,0x2a,0xca,0x61,0xe4,0xe0,0x01,0xd9,0xd1,0xec,0x19,0xc4,0x0d,0x22,0x00,0xac,0x25,0xb8,0xe0,0xea,0x37,0xc5,0x07,0xc5,0xe0,0xe1,0x19,0x7f,0xaf,0x23,0xf5,0xed,0xb7,0x69,0x26,0xf1,0x07,0x32,0xe8,0x2d,0xf1,0x3e,0x0b,0xdc,0xf3,0xff,0x1b,0x10,0xee,0x2f,0x16,0x2b,0xc9,0x37,0xff,0xec,0xcc,0xcb,0xf2,0x23,0xeb,0x06,0x1c,0xc9,0xf1,0x33,0xf2,0x0a,0x06,0xaf,0xf6,0x27,0x09,0x98,0x06,0xeb,0xfa,0x11,0x02,0xf6,0x03,0x24,0x66,0xe1,0x43,0xcf,0xdd,0xf9,0xd2,0x1d,0x49,0xdc,0xf9,0x05,0x7f,0xe6,0x22,0x0e,0xe5,0x10,0xfa,0xcc,0x16,0xda,0x03,0xcd,0x05,0x0a,0xdc,0x0d,0x1e,0x0b,0x00,0x15,0x08,0x24,0xf8,0xfb,0x2e,0xac,0x08,0xed,0xd5,0x4e,0x2b,0xd2,0x20,0x38,0x31,0x2b,0xb9,0xc9,0xf1,0x56,0xd2,0xa7,0xfd,0x95,0x55,0x4d,0xef,0xe4,0xce,0xb3,0xd6,0xd2,0x2b,0x19,0xd2,0xe8,0x29,0x1c,0x05,0xad,0xd8,0x81,0x34,0x2a,0x39,0x6e,0x7a,0x30,0x04,0x05,0xd5,0x2c,0xac,0x0d,0x1b,0xb2,0x06,0x11,0x06,0xc8,0xe5,0x3c,0x29,0x2c,0xc9,0xfb,0x2d,0x97,0x2f,0xc6,0x40,0x25,0x16,0x2c,0x1b,0x1e,0xd1,0x1d,0xdf,0xf8,0x6c,0xd9,0x16,0x4a,0x1c,0x1a,0xea,0xd5,0xcb,0xdd,0x00,0x04,0xf0,0xc0,0x02,0xfe,0xf4,0x2e,0x02,0x46,0xe0,0xdf,0xb2,0x29,0x17,0xd4,0xd7,0x44,0xdf,0xfc,0x07,0xee,0x23,0xff,0x14,0x1f,0xdb,0xb9,0xa1,0x04,0xf1,0x93,0x01,0xd9,0x82,0x7f,0xee,0x65,0xfd,0xff,0x04,0x00,0x00,0x00,0x40,0x02,0x00,0x00,0xd8,0x31,0x7a,0xbf,0x55,0x3c,0x49,0x68,0xb3,0xbd,0x56,0xe8,0xa8,0xeb,0x48,0x81,0xac,0xd2,0xdd,0xbe,0x4c,0x93,0x67,0x4d,0x48,0x95,0x3b,0x17,0x3d,0x7f,0xe3,0x22,0x48,0xe3,0xbd,0x52,0xf6,0x08,0x4e,0xb2,0x48,0x36,0xd1,0x5b,0x67,0xab,0xdd,0xd9,0x44,0xdd,0xe4,0x41,0x29,0xa9,0x1b,0x46,0x81,0x43,0x60,0x4a,0x0f,0x50,0x61,0x7f,0xcf,0x5b,0x7f,0xb6,0x74,0x5b,0x5e,0x7f,0x9b,0x8e,0x46,0xb3,0x91,0xe5,0x7f,0xca,0xb0,0x81,0xc4,0xbb,0x73,0xe7,0x7f,0x69,0x6e,0x81,0x5b,0x32,0x6f,0x7e,0xa6,0x7f,0x68,0x97,0xac,0x61,0xc6,0xd1,0x65,0xae,0x66,0xe8,0x96,0x7f,0x72,0x91,0xb5,0xd9,0x4e,0xb4,0x43,0x4c,0x7f,0xd2,0xe1,0x5d,0x12,0x7f,0x6b,0x65,0x27,0x68,0x74,0xfa,0xf6,0x35,0x1f,0xd8,0x41,0x13,0x2c,0x37,0xf4,0xb7,0x0e,0xc6,0xd9,0x1a,0x4b,0x1a,0xe9,0xaf,0xea,0xd4,0x3b,0x52,0x1b,0x2c,0x2b,0xbd,0x1c,0x2f,0x2e,0x18,0xc1,0x6d,0x3a,0xa3,0xe3,0x27,0xc7,0xca,0x32,0xd3,0x25,0xdc,0xad,0x20,0x17,0xc9,0xd4,0xf8,0x19,0xea,0x6b,0x18,0x40,0x0a,0xd4,0x23,0x59,0x51,0x22,0x2c,0x20,0x20,0x29,0x85,0xaa,0x60,0x73,0x9e,0x4d,0x72,0x5f,0x6a,0x86,0xbe,0x70,0xc0,0xb4,0xa3,0x5c,0xa7,0x81,0x25,0x95,0x81,0x51,0x99,0x26,0x5e,0x7f,0xb7,0x48,0x53,0x46,0x6e,0xbf,0x35,0x6c,0xba,0xa7,0x7d,0xbf,0xc4,0x51,0x8d,0x5e,0x7f,0x97,0x12,0x6e,0x87,0xa1,0x43,0x59,0xa7,0x25,0x59,0xbe,0x9a,0x60,0x63,0xb9,0x0a,0x5d,0x4e,0x46,0x51,0x69,0x2e,0x81,0x7f,0x7d,0x81,0x7f,0x7f,0x7f,0x64,0x81,0x81,0x7f,0x81,0x81,0x81,0x69,0x14,0x81,0x27,0x81,0x91,0x7f,0x78,0x1e,0x7f,0x5e,0x91,0x7f,0x7f,0x7f,0x58,0x81,0x77,0x7f,0x81,0x81,0x7f,0x81,0x9a,0x7f,0x81,0x7f,0x41,0x81,0x63,0x7f,0x81,0x81,0x6a,0x7f,0x81,0x78,0x7f,0x22,0x81,0x5b,0x7f,0x48,0x4c,0x7f,0x7f,0x7f,0x7f,0x7f,0xd3,0xcd,0x40,0x3d,0xc6,0x4c,0x1c,0x3e,0x20,0xbe,0xb5,0x1a,0xad,0xb5,0xda,0x37,0x4d,0xda,0x07,0xc3,0xdd,0x44,0x7f,0x0a,0x3e,0x19,0xb3,0x44,0x45,0x3c,0xff,0xab,0x4f,0x3b,0x91,0xb1,0x32,0xba,0xbc,0x35,0xc8,0x2e,0xab,0xc9,0x46,0x26,0xbb,0xcb,0x3e,0x39,0xd5,0x7f,0x2c,0xf4,0xd5,0x10,0x2f,0x4f,0x43,0x3e,0x43,0x51,0x33,0x1f,0xd4,0xc5,0x59,0x16,0xd0,0x20,0x48,0x18,0x1b,0xc6,0xd8,0x3c,0xc2,0xf8,0xc6,0x41,0xfd,0xc6,0x2b,0xb9,0xc5,0x13,0x95,0xe2,0x22,0x32,0x10,0x1c,0x3f,0x1c,0x09,0xc3,0x12,0x36,0xf2,0xcc,0x4d,0xaa,0x81,0x23,0xbb,0x28,0x51,0xc2,0xbd,0xfe,0xb7,0xa6,0x5c,0x28,0xcd,0x3c,0x24,0xa7,0xdd,0x57,0x25,0xe8,0xbf,0x23,0x1c,0x53,0x18,0x11,0xc7,0xaf,0x57,0x25,0xb5,0x2a,0x35,0x2e,0x02,0xa9,0xb4,0x56,0xaa,0xaf,0xa6,0x2d,0x2e,0xb6,0x43,0xa7,0xd8,0x1f,0x65,0xd6,0x39,0xf5,0xf6,0x36,0x58,0x25,0xe9,0xb1,0x07,0x44,0xb8,0xae,0x4c,0xaa,0xbe,0x3e,0xb4,0x33,0x40,0xdd,0xdb,0xf1,0xc6,0xb0,0x7f,0x39,0xbf,0x59,0x40,0xb8,0x9e,0x7f,0x3e,0x2d,0xe4,0x3e,0x4b,0x61,0x29,0x19,0xc7,0xe3,0x22,0x0b,0xeb,0x12,0x06,0x1a,0x06,0xca,0xec,0x1e,0xea,0xca,0xc7,0xf9,0x30,0xe7,0x20,0xc9,0xfa,0x15,0x28,0x08,0x20,0xcc,0x03,0x23,0x2e,0x13,0xfc,0xe0,0x06,0x16,0xe1,0xce,0x2a,0xe1,0xdf,0x2b,0xf1,0x14,0xc8,0x06,0xf6,0xf2,0xe7,0xde,0x44,0x2b,0xec,0x38,0x15,0xcc,0xda,0x28,0x1d,0x0a,0x07,0x2e,0x26,0x29,0x14,0x05,0x22,0x3a,0x68,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xd5,0x4f,0x00,0x00,0x93,0xfe,0xff,0xff,0x2a,0xf6,0xff,0xff,0x5b,0x51,0x00,0x00,0x78,0xfc,0xff,0xff,0x1e,0x01,0x00,0x00,0x43,0xfe,0xff,0xff,0xd9,0xff,0xff,0xff,0x2b,0x3c,0x00,0x00,0xac,0x31,0x00,0x00,0xa4,0x00,0x00,0x00,0x43,0x57,0x00,0x00,0xdf,0x40,0x00,0x00,0xe9,0x56,0x00,0x00,0x52,0xe8,0xff,0xff,0x43,0x14,0x00,0x00,0xc8,0x57,0x00,0x00,0x09,0x07,0x00,0x00,0x2f,0x59,0x00,0x00,0xd4,0x3f,0x00,0x00,0x9f,0xfe,0xff,0xff,0x3c,0xf5,0xff,0xff,0x2b,0xf0,0xff,0xff,0xac,0xfb,0xff,0xff,0x72,0xea,0xff,0xff,0xeb,0x65,0x00,0x00,0x17,0x00,0x00,0x00,0xc3,0xff,0xff,0xff,0x2a,0x01,0x00,0x00,0x2b,0x0f,0x00,0x00,0x7f,0x53,0x00,0x00,0x43,0x01,0x00,0x00,0x4f,0xee,0xff,0xff,0x26,0x46,0x00,0x00,0x18,0x26,0x00,0x00,0x11,0x02,0x00,0x00,0xb7,0x3c,0x00,0x00,0xea,0x34,0x00,0x00,0xcb,0xfe,0xff,0xff,0x20,0x6c,0x00,0x00,0x7a,0xff,0xff,0xff,0xdb,0xf7,0xff,0xff,0xc3,0x57,0x00,0x00,0xde,0xff,0xff,0xff,0x46,0xfd,0xff,0xff,0xd4,0x40,0x00,0x00,0xbf,0x58,0x00,0x00,0x62,0x00,0x00,0x00,0x55,0xf7,0xff,0xff,0xe7,0x65,0x00,0x00,0x0b,0xe4,0xff,0xff,0x36,0x00,0x00,0x00,0x95,0x08,0x00,0x00,0x4d,0x56,0x00,0x00,0x0c,0xf5,0xff,0xff,0xac,0xff,0xff,0xff,0x58,0xfb,0xff,0xff,0xec,0xf8,0xff,0xff,0x83,0xf0,0xff,0xff,0xa1,0xe1,0xff,0xff,0x43,0xf8,0xff,0xff,0xfa,0xff,0xff,0xff,0x14,0x02,0x00,0x00,0x9f,0x11,0x00,0x00,0x46,0x69,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x35,0x0c,0xc2,0x04,0x56,0x1a,0x14,0x2f,0x49,0xe0,0x11,0x00,0x14,0xdf,0xfb,0x14,0x07,0xed,0x61,0x4f,0x08,0x00,0x29,0xf1,0xd7,0x0d,0x9d,0xb3,0x0a,0x36,0x00,0x81,0x95,0x0e,0x01,0x08,0x18,0xda,0xeb,0x46,0x21,0x46,0xc0,0xe6,0x35,0x28,0x2c,0x00,0x1d,0xe5,0xc1,0xfa,0x3f,0xd3,0x0a,0x12,0x04,0xf0,0xd8,0xe6,0xce,0x42,0xfa,0x0f,0xe3,0x04,0x7f,0x1c,0xea,0xda,0xbb,0xde,0xdb,0xe1,0x41,0x33,0xfd,0x27,0x42,0xd1,0xc6,0xe0,0xe1,0xed,0x25,0x0e,0xf0,0xfb,0x13,0x0c,0x41,0x15,0x4b,0x20,0x16,0xae,0x1a,0xe9,0xee,0xf8,0x17,0xfc,0x24,0xb2,0x0d,0xfd,0x2a,0x12,0xbf,0xf4,0xe6,0x41,0xba,0xe8,0x4d,0x0c,0x61,0xdd,0xff,0xb4,0xe5,0xc5,0x1f,0xeb,0xf8,0xe1,0xaf,0x01,0xf7,0x15,0xee,0xeb,0xec,0x08,0xf5,0xe4,0xfe,0xe1,0xe8,0xf2,0x06,0xd9,0x11,0xfa,0x17,0x03,0xea,0x14,0xef,0x1b,0xeb,0x0b,0xdb,0xd0,0x1b,0x0d,0x7f,0x13,0x16,0xf7,0xcb,0xe0,0x16,0x0d,0xcb,0xd6,0x04,0xdf,0x31,0x24,0xf8,0x16,0x51,0xd1,0xf5,0x13,0x09,0xd7,0xea,0xf4,0x10,0x09,0x12,0x21,0x0d,0xf7,0xcd,0xe8,0xd6,0x23,0x1d,0x2b,0xd9,0x01,0x1d,0x11,0xf3,0x7f,0x08,0xf4,0x06,0x0d,0x02,0x09,0xd8,0xf1,0x1b,0x02,0xe7,0x26,0x14,0xe3,0xe3,0xfd,0x03,0xf1,0xf0,0x1a,0x25,0xec,0x07,0xe7,0x1f,0xf4,0xd1,0xb1,0xea,0x12,0x06,0x19,0x30,0xd5,0x1e,0xf5,0xef,0x22,0x09,0xea,0x1f,0xff,0xf4,0xf7,0x01,0xf2,0x1b,0x0c,0x16,0x17,0x0e,0xf7,0xe2,0xd4,0x0e,0xda,0xd4,0x1c,0x01,0x30,0xe8,0x14,0xfb,0x1f,0xc0,0x2f,0x2b,0xf7,0xd4,0x4e,0x81,0x3d,0x9f,0x3d,0x0f,0x5c,0x0a,0xdb,0x28,0xf6,0xd3,0x10,0xd5,0x03,0x07,0x8f,0xba,0x4b,0x12,0xd6,0xed,0xdb,0xfa,0xe6,0xea,0xbf,0x17,0xd0,0xde,0x2a,0x03,0x10,0xeb,0xea,0x35,0xeb,0x1b,0x08,0x0a,0x26,0x23,0xb9,0x3c,0x21,0x0c,0xee,0x00,0x39,0x09,0x22,0x92,0xc8,0xe7,0xfe,0x3d,0xf7,0x13,0xf5,0xf1,0x19,0xfd,0x16,0xeb,0x07,0x0e,0xdc,0x24,0x0f,0xa6,0x1d,0xeb,0xd2,0x39,0x03,0xd4,0xf2,0xdb,0xdf,0x1f,0xd6,0xf6,0xf8,0x0c,0xb0,0xee,0xfc,0xee,0xb3,0xf3,0xd4,0xd4,0xe5,0xeb,0x23,0x19,0xf4,0x02,0xc4,0x64,0xee,0x7f,0x20,0x0e,0xf6,0xfc,0x0d,0xde,0x54,0x13,0x1c,0xf5,0x05,0x07,0xe1,0xf9,0xfe,0x1d,0xeb,0xb1,0x31,0xd3,0x12,0xbc,0x72,0xe3,0xd9,0xbc,0x2b,0x04,0x03,0x69,0x23,0x38,0xf5,0xb1,0x40,0x1b,0x0c,0xa8,0xf9,0xe6,0xc6,0xe6,0x08,0xe4,0x74,0x42,0x1b,0xcb,0xf0,0x26,0xf4,0xed,0x19,0xf8,0x0c,0x12,0x1d,0xbf,0xfa,0x12,0x50,0xeb,0x22,0x2e,0x1e,0x02,0xeb,0x7f,0x91,0xd6,0xe6,0xff,0x15,0x08,0xe2,0xf7,0x0a,0x09,0xfa,0x12,0x19,0x02,0xd3,0xb4,0xd9,0xeb,0xba,0x22,0xe0,0x05,0x25,0xec,0xd9,0xc4,0xe7,0xce,0xea,0xf0,0x03,0x42,0x58,0x3a,0xfb,0xf9,0x12,0x2c,0xdd,0x4d,0x5c,0x2d,0x32,0xde,0xe8,0x01,0xfb,0xcf,0x14,0xd1,0xec,0xe4,0xf7,0x23,0xbc,0xb4,0xd6,0xe7,0xef,0x7f,0xef,0xa2,0xc0,0x2c,0xe4,0x07,0xf7,0x3e,0xc0,0x42,0x3f,0x7b,0xc6,0xd4,0x43,0x15,0x06,0x30,0xf4,0x58,0x16,0x14,0xd0,0x28,0x16,0xd1,0x22,0x0a,0x1a,0xfa,0x08,0xf0,0x2c,0x18,0xee,0xc7,0xf5,0xe1,0xfa,0xfa,0xfb,0xfa,0xbe,0xe9,0x0d,0x15,0xe7,0xc6,0xfc,0xfd,0x09,0xee,0xe3,0xf7,0x2a,0x1a,0x03,0x23,0x19,0x00,0xea,0x13,0xec,0x3f,0x10,0xf6,0x1f,0x48,0x7f,0x10,0x11,0xf4,0x21,0x04,0x0d,0x13,0x04,0xd8,0xf5,0x21,0x2c,0xb6,0x28,0x3a,0xe9,0xeb,0x57,0x2a,0x59,0x28,0x19,0x29,0xb5,0x4c,0xd1,0xf8,0xd5,0xfa,0x01,0xff,0xeb,0x18,0x81,0xfc,0xe2,0xfd,0xea,0xde,0x16,0x1c,0xed,0x5e,0x27,0x07,0xd2,0x2e,0xe4,0x0e,0x24,0xf9,0xc5,0x3b,0xde,0xfc,0x13,0x37,0x9f,0xfc,0xe1,0xee,0x12,0x0f,0x07,0x1a,0xe1,0xe7,0xf8,0x33,0xda,0x23,0xb6,0xcd,0xde,0xdf,0x01,0x65,0xab,0x15,0xf5,0x26,0xff,0xe5,0xbd,0x1d,0x39,0x23,0x11,0xd5,0xb3,0x27,0xed,0x17,0x21,0xd9,0x22,0xd5,0x01,0x3c,0xf8,0xf7,0x2a,0x7f,0xf7,0xdd,0xeb,0x23,0x0f,0x0e,0x45,0xd2,0x25,0x75,0xe2,0xb0,0xe7,0x04,0x14,0x1a,0xe0,0x95,0xec,0xef,0xad,0xde,0x4c,0x03,0x05,0x3a,0xce,0x21,0xdc,0xbc,0x4c,0x9b,0xf2,0x23,0x02,0x15,0x17,0xfd,0xea,0x0e,0x0e,0xc0,0x54,0xfb,0x05,0x02,0xd2,0xdc,0xf3,0x25,0xe1,0x1e,0x22,0xf3,0x04,0x9d,0xe7,0xfd,0x19,0x05,0x37,0x05,0xd4,0xc2,0xc3,0x1a,0x40,0xee,0xe0,0xfb,0xdb,0xe3,0x11,0x4e,0x2c,0x26,0x10,0xdc,0x2e,0xfb,0xed,0x06,0x17,0xeb,0xda,0x11,0xd1,0xef,0x37,0x10,0x7f,0x01,0x12,0x09,0xde,0xe0,0x14,0x04,0x0d,0x21,0xea,0x2e,0xb7,0x1b,0x00,0xeb,0xf0,0xe7,0x2c,0x24,0x79,0x1f,0xf0,0xe0,0xdc,0x18,0xd3,0xdd,0x03,0x1c,0x05,0xd7,0xe9,0x21,0xd4,0xe0,0x43,0x2e,0x0a,0xf3,0x09,0x1a,0x30,0x65,0xe8,0x3c,0x20,0x1d,0x0f,0xf2,0xb7,0xfc,0xd5,0x7f,0xbb,0xff,0xa9,0xe9,0xd4,0x3b,0x36,0x18,0x30,0xd7,0xe2,0xfd,0x01,0x9d,0x39,0x08,0xfb,0xa9,0x32,0xb6,0xff,0xe8,0x2f,0xb9,0x58,0x5c,0x15,0xd3,0xb9,0x02,0x19,0x81,0xe9,0xc3,0x18,0x4e,0xeb,0x57,0xbf,0xb5,0x2a,0xdc,0xc6,0xe6,0xff,0xe6,0xed,0x67,0x30,0xa6,0x5f,0xad,0x09,0xce,0xd8,0x17,0xc7,0x0e,0x06,0xc2,0xff,0x0f,0x1e,0x01,0xb0,0x37,0xff,0xdd,0x29,0xec,0xf2,0x06,0xd4,0x0c,0xe1,0xfb,0xda,0x24,0xfd,0x08,0x5a,0xfd,0x14,0xff,0x0c,0xf4,0xe7,0xa4,0xe4,0x07,0xed,0xed,0xbe,0x2d,0x2f,0xad,0xeb,0x11,0xde,0x0d,0x2d,0x58,0x0d,0xa2,0x01,0xf9,0x06,0xb7,0xd6,0xcf,0x99,0xfd,0x62,0xfb,0x38,0xbe,0x88,0x35,0x39,0xf5,0xf6,0xec,0xff,0xfa,0xfb,0xbd,0x36,0xba,0x0d,0x30,0x50,0x12,0x28,0x22,0x81,0x00,0xd7,0xff,0xfd,0xf1,0xb6,0xf1,0xb1,0xf3,0x38,0xdb,0x30,0x48,0x1b,0x1a,0xd4,0xd8,0x22,0xfb,0x13,0xdd,0xec,0xe6,0xf0,0xf6,0x56,0x08,0xc8,0x0a,0x1e,0x4e,0x1e,0xac,0x07,0x02,0x52,0xf6,0xd6,0x59,0xb5,0x01,0xf0,0x18,0xcf,0xfa,0x1f,0x22,0x7f,0x1b,0xee,0x79,0x00,0x00,0x03,0xe8,0xca,0x14,0xf7,0xf4,0xc5,0xf7,0x2e,0x31,0xd8,0x03,0xe9,0x0c,0xf9,0x1a,0x32,0x7c,0xc5,0xd7,0x1c,0xf7,0x1c,0xa8,0x19,0xbc,0x0f,0x08,0x3b,0x0a,0xa6,0x2a,0x0a,0x0d,0xd0,0xb0,0xf6,0xfc,0x14,0xa7,0xe4,0x1b,0x34,0x1d,0x00,0x06,0x5f,0xb6,0x13,0x38,0xfc,0x16,0xed,0xff,0xb3,0x81,0xf4,0x2e,0x2f,0xc1,0xeb,0x03,0x36,0x2c,0xd6,0xf4,0x64,0x5c,0xe2,0x48,0xb6,0xe3,0x2d,0xf9,0xce,0xe0,0x11,0x1f,0x1f,0xaf,0xe9,0x1b,0x43,0xe3,0x35,0x4c,0xf9,0x68,0xda,0x24,0xfa,0x0b,0x50,0xf9,0xca,0x16,0xdd,0x28,0x0b,0xf6,0x49,0x10,0x0d,0xdb,0x0e,0x0c,0x0c,0xec,0xfb,0xfc,0x0c,0x1e,0xef,0xd7,0xca,0xb8,0xea,0x0b,0x0e,0xc1,0xed,0xf5,0xc6,0xeb,0x04,0x7f,0x01,0xcb,0x17,0xff,0xe1,0x7e,0xfd,0xed,0x19,0x0e,0x17,0x1c,0x09,0x2a,0xe7,0xe9,0x10,0xe5,0xe6,0x25,0xc7,0xe6,0xeb,0xd0,0xe4,0xec,0xdb,0xd7,0xf4,0xfb,0xd2,0x08,0xfa,0xf0,0xe9,0xf6,0xd9,0xf0,0x12,0xea,0x1a,0x11,0x04,0xef,0xed,0x08,0xfe,0x00,0xca,0xe5,0xd5,0x1f,0xef,0x18,0x7f,0x2e,0x13,0x10,0x13,0xf8,0xf5,0xed,0x0c,0xf6,0xd8,0xe7,0x02,0xd0,0x12,0xdd,0xf1,0xda,0xfc,0xe8,0xfa,0xd4,0xeb,0xe8,0xd8,0xe3,0xe2,0x16,0xed,0x2f,0x07,0x22,0xfd,0xfa,0xf3,0xee,0xfb,0xfe,0xed,0x47,0xac,0xe7,0xc6,0x05,0x01,0xcc,0x1e,0x03,0x09,0x1a,0x4a,0xea,0xef,0xe5,0xf4,0xe6,0x19,0x2c,0x36,0x07,0x81,0x34,0xde,0x1e,0xfa,0x2f,0xe7,0xfb,0xeb,0x0d,0x18,0x1c,0xee,0xcf,0xec,0xe6,0x20,0xca,0x12,0xf3,0xea,0x22,0xe7,0xee,0xdb,0x0e,0xec,0xfb,0x0a,0xf1,0x0a,0xdd,0x3b,0xe9,0xf2,0x15,0xf3,0x29,0xfd,0xe7,0x14,0xf8,0xfe,0xe9,0xd7,0x1c,0x7f,0xe6,0xe1,0xfa,0xf3,0x17,0xff,0xf5,0xda,0xe6,0x21,0xe9,0x22,0xd3,0xb4,0x0f,0xff,0x04,0x07,0xff,0xf0,0xe3,0xf1,0x26,0x45,0xf0,0xf9,0xf8,0xe6,0x0c,0x26,0xc4,0xcb,0xd5,0xfe,0xf3,0x0b,0xcd,0xf7,0xea,0xf2,0x04,0x15,0xde,0xf1,0x1b,0xfb,0x26,0x18,0x12,0xff,0xfa,0x10,0x38,0x14,0xf4,0x0b,0xc0,0xe8,0xf8,0x30,0xbd,0x28,0xc0,0x3f,0xde,0xe2,0xec,0x13,0xde,0x32,0xd7,0xf4,0x1c,0xd7,0xf2,0xf7,0xf2,0xdc,0xd5,0xc1,0xef,0xaa,0x3f,0x0b,0x13,0x1b,0xbb,0x19,0xd1,0x04,0xf5,0x7f,0xd3,0x03,0x03,0x3c,0x1b,0x12,0x1e,0x14,0xcd,0x0a,0xd9,0x31,0x3e,0x47,0xf1,0xfe,0x04,0x04,0xe2,0x23,0x00,0xe8,0x41,0x08,0xbf,0xa7,0xf1,0xe7,0x12,0xc9,0x33,0xe3,0x0e,0xeb,0x98,0xaa,0xec,0xf5,0x7f,0x01,0x01,0xdc,0xed,0xee,0x36,0x20,0xfd,0xe4,0xf6,0x05,0xed,0x14,0xe2,0xec,0xe9,0xec,0xf4,0x3b,0xee,0x22,0x00,0x1f,0xe5,0xed,0xe2,0x03,0x08,0xdd,0x00,0x56,0x28,0xdc,0x09,0xc0,0xef,0xdd,0xec,0xf8,0xe2,0xdb,0x10,0xf6,0x05,0xfe,0x18,0xdd,0x1a,0x02,0xf8,0x93,0xbc,0x0e,0x3e,0x0d,0xe4,0xaa,0x03,0xdd,0xe3,0x44,0xe4,0x39,0x07,0xdd,0xe8,0xfc,0x33,0x12,0xfd,0xf4,0x2c,0xda,0xf7,0x02,0xe9,0x1c,0x0c,0x31,0x22,0x1d,0x15,0x30,0xf1,0xc6,0xfc,0xe7,0x7f,0xf3,0x02,0xef,0x1d,0x31,0xf9,0xe2,0xc3,0xf9,0x1f,0x0f,0x22,0x12,0xf5,0x3a,0xe4,0x07,0x0b,0xea,0xdf,0xe3,0x1b,0xe2,0x24,0x04,0x74,0x22,0xb9,0x34,0x18,0xe2,0xcd,0xf4,0x46,0xd4,0xf2,0x1d,0xf7,0xe6,0xea,0x1a,0xfd,0x17,0xfb,0x28,0xee,0xf7,0x03,0xfa,0xea,0x0b,0xde,0xef,0xf1,0xdf,0xf7,0x0e,0xff,0x00,0x0e,0x1f,0x02,0x36,0x1b,0x7f,0x14,0xf3,0x1e,0xf7,0xd7,0x26,0xe5,0xfc,0xfb,0xea,0xce,0xd8,0xe9,0x00,0xc5,0x2e,0xea,0x30,0xe3,0xfc,0xf9,0xfc,0xa2,0xfa,0xcb,0x3f,0xfa,0x0f,0x08,0xa1,0x20,0x05,0x21,0x81,0x2d,0xd4,0x04,0x82,0xc1,0xa9,0xa6,0xbd,0xfe,0xcb,0xf9,0x01,0x18,0x2b,0x17,0x0a,0xc1,0xf2,0x37,0xdc,0xb3,0xf0,0xd2,0x4a,0x37,0xfe,0xa4,0xc1,0xe1,0xc6,0x36,0xed,0x04,0xdf,0x18,0x01,0xc4,0x13,0xfd,0x39,0x1f,0xb5,0xe0,0x44,0x07,0x9f,0xe2,0x81,0x60,0xbe,0xd5,0x15,0xd6,0xb5,0xf0,0x3b,0xbb,0x00,0x06,0x03,0x57,0x08,0x13,0x10,0x1f,0x2d,0x09,0x13,0x17,0xd8,0xac,0xd4,0x0f,0xf8,0x0a,0xdf,0xc0,0x14,0xc3,0xf6,0xcd,0xfb,0x25,0xf2,0x0f,0xf4,0x03,0xf2,0xc0,0xf0,0xeb,0x24,0xf6,0xf8,0x2c,0xdb,0x16,0xf9,0x23,0x15,0x36,0x05,0xbf,0x06,0x58,0xb3,0x05,0x65,0x28,0x7f,0xfa,0xe0,0x1b,0xe2,0xf8,0x35,0x1d,0x62,0x29,0xc8,0x0f,0x06,0x06,0xfa,0x22,0x07,0xb3,0xe0,0x1b,0xcc,0x14,0xe3,0xdd,0xfa,0xf6,0x0a,0xe8,0xe5,0xec,0xfa,0x2a,0x17,0xd2,0x47,0x11,0xf2,0x13,0xe8,0x1d,0x3c,0x7c,0xc6,0xbc,0x0f,0xfb,0xec,0xfd,0x18,0x81,0xc9,0xe9,0x0e,0xee,0x06,0xf3,0x1f,0x25,0xfc,0x11,0x74,0x06,0xe4,0xd7,0x04,0x0b,0x1e,0x0a,0xfc,0x55,0xc9,0xdc,0x12,0xe1,0xfe,0x19,0xd2,0xda,0xd2,0xa2,0xea,0x34,0x20,0x0d,0x42,0x05,0x0a,0xc1,0xb1,0xce,0x11,0xb6,0x02,0x01,0x29,0x1f,0xd8,0x40,0xe3,0x62,0xc7,0x14,0x09,0xd1,0xef,0x11,0x3d,0xed,0xc0,0xc1,0xe9,0xe9,0x13,0x3f,0x23,0x81,0x16,0xd3,0x0c,0xde,0x40,0xf2,0x1e,0x3e,0x13,0xfe,0xd2,0xeb,0xdf,0x10,0xda,0xdb,0x13,0x03,0x11,0xad,0xdf,0xf6,0x06,0x56,0x10,0x10,0xd7,0xfa,0xbe,0xf9,0x12,0xfb,0x31,0xe0,0x0b,0x30,0xd9,0xe9,0x08,0xea,0x0d,0xce,0x0f,0x23,0xf1,0x03,0xf8,0xe8,0xfe,0xdf,0xce,0x29,0xfb,0xec,0xcc,0x2c,0xc0,0xcd,0xec,0x13,0x7f,0xf4,0x18,0xd1,0x0a,0xc1,0xfb,0xfe,0x05,0xe6,0x0f,0x0c,0xfb,0x0f,0x30,0x13,0xe1,0xd4,0xf2,0xea,0xde,0xfe,0x2c,0xf9,0xde,0x18,0x16,0xf9,0xea,0xe1,0x2e,0x1e,0xdc,0xed,0x3c,0x07,0xfa,0x06,0x13,0xfd,0xcf,0x04,0xf3,0x15,0x0d,0x81,0xe5,0x08,0xb8,0xc8,0xf6,0xea,0x14,0xf7,0xef,0xea,0x43,0x19,0xeb,0x3d,0xf9,0x1b,0xb7,0x0b,0x14,0x0e,0xed,0xd5,0xf9,0xb7,0x10,0xe5,0x4b,0xee,0xd2,0x17,0xf2,0x14,0x25,0xfa,0xd8,0x05,0x06,0xd1,0x17,0xf8,0xf7,0xc6,0xc9,0xbc,0xfd,0xe5,0xf9,0xd3,0xd2,0xcb,0xd4,0xce,0x0a,0xc9,0xd3,0xfe,0xb3,0x5e,0x0d,0xf5,0x0c,0xcd,0x1c,0x7f,0xe8,0x9a,0x15,0x63,0x30,0x08,0x3b,0x0a,0x26,0x9e,0x26,0x5c,0x6e,0xe5,0x6a,0xcd,0xdc,0x04,0xf0,0xe9,0xeb,0xf8,0x20,0xbe,0x2e,0xdc,0x11,0x01,0xb0,0xce,0x2f,0x1f,0xe0,0xf6,0xa3,0xf2,0xb4,0xe2,0x1a,0x32,0x16,0xdf,0x42,0xe7,0x07,0xd6,0x38,0xda,0xc7,0xcd,0xeb,0xf5,0xdc,0xff,0xed,0x2d,0x15,0x17,0x17,0x27,0x02,0x03,0x2e,0x04,0xea,0x2e,0xf4,0x7f,0xdd,0x04,0x1c,0x5d,0xce,0xd0,0x00,0x1f,0xf5,0xf2,0x16,0x72,0x07,0xe0,0x11,0x30,0x1d,0xd6,0x0e,0x2d,0x22,0x7d,0x0e,0x00,0xf0,0xff,0xcc,0x5a,0xcb,0x19,0xfc,0xd2,0x9d,0xe3,0xce,0x14,0xfb,0x4b,0x0e,0xd4,0xd9,0xde,0x1b,0xa2,0x00,0xbc,0xcf,0xbf,0x0a,0xfc,0xef,0x3f,0x46,0x40,0x41,0x10,0x1e,0xfe,0x46,0xe7,0xce,0xf8,0xc3,0x54,0x12,0x60,0xd2,0xf3,0xeb,0xc2,0xfb,0x32,0x63,0x42,0xd4,0x41,0xbf,0x41,0x38,0xe5,0x38,0xea,0xdf,0xf8,0x07,0x84,0xb9,0xf3,0xe3,0xcf,0xef,0xcd,0xc6,0x34,0xbd,0x2c,0x97,0xc9,0x81,0x07,0xd0,0x2e,0x10,0x13,0xc3,0xb0,0x07,0x05,0xcb,0xf0,0xf8,0x17,0x19,0x15,0xe9,0xfe,0xe2,0x29,0xfa,0x3d,0xb8,0x01,0xcd,0x2f,0xee,0x04,0xd8,0xf6,0xf8,0x5f,0x98,0xff,0xd8,0xd4,0x54,0x6a,0xe9,0x2c,0x39,0xee,0x10,0x19,0x19,0xf8,0xe8,0xce,0xf7,0xfc,0xb8,0x14,0xd8,0x6c,0x19,0x30,0x2c,0xf5,0xbe,0x24,0xf2,0xfb,0xf2,0xfc,0xe3,0xe2,0xc3,0xc1,0xba,0xaa,0x7f,0x53,0x08,0x47,0xf5,0x2f,0xfe,0x54,0x14,0xba,0x17,0xea,0x1c,0xff,0xb6,0x0e,0xec,0x1c,0xf8,0x32,0xd8,0xce,0x24,0x51,0xe7,0x1b,0x62,0x60,0x00,0xc4,0xd1,0xc5,0xcb,0xca,0xba,0xc0,0x00,0x02,0xfc,0x25,0x9e,0xff,0x3f,0xf6,0x11,0x41,0xf0,0xf4,0x26,0x10,0x0b,0xd2,0xfc,0x00,0x7f,0x5b,0x1d,0xc3,0x36,0xc5,0x3d,0xfe,0x10,0x49,0x48,0xdb,0xc0,0x0f,0xa4,0x42,0x96,0x31,0xbc,0xd2,0x2d,0x2e,0x59,0x24,0xe4,0x0c,0x22,0x4d,0x0b,0xae,0xf6,0xeb,0xc8,0x09,0x02,0xde,0x30,0x08,0xbb,0x3f,0x3e,0xbe,0x0f,0x09,0x1b,0xe8,0x01,0x3a,0x73,0xe9,0x2b,0xe4,0x25,0xec,0x05,0x1a,0x20,0x13,0xe9,0xf8,0xca,0xfb,0x0e,0xe7,0x30,0xe7,0x22,0x1b,0xd6,0xe7,0x5d,0x7f,0xce,0xc2,0xcf,0xc8,0xfd,0xe9,0x6e,0x00,0xe9,0x4b,0x2b,0x91,0xd6,0xf4,0xf4,0x21,0xbd,0xa6,0x2c,0xe6,0xf3,0xea,0x1c,0x0e,0x07,0x69,0xee,0xd7,0xf4,0xf3,0xed,0x14,0xc5,0xf0,0xea,0xf5,0xed,0x0b,0x35,0x22,0xd6,0x0b,0xd6,0xcc,0x1c,0x21,0x37,0x05,0x1c,0xdd,0xd0,0x18,0xe8,0x9d,0x6b,0x12,0x1c,0x13,0x4c,0xdb,0x3a,0xee,0xcb,0x7f,0x07,0xf6,0xe0,0x98,0x01,0x0d,0x31,0xdb,0x1c,0xb9,0x0c,0xe0,0x14,0xd0,0x00,0xe4,0xda,0xe8,0x3b,0xcc,0x04,0xe3,0x0d,0x38,0xf3,0xfe,0xf5,0xe5,0x3f,0xc6,0xcc,0x1c,0x35,0xe2,0xf9,0x14,0x1e,0xb7,0x03,0xd5,0x7f,0x0a,0x25,0x21,0x41,0x32,0x1d,0xed,0x24,0xfc,0x22,0x3a,0x19,0xef,0x11,0xf5,0xf7,0x0e,0x30,0xf6,0xed,0x25,0x1d,0x77,0x00,0xf0,0xe2,0x08,0xf5,0x28,0x7f,0x16,0x3d,0xc9,0x1b,0xf3,0xf0,0xf1,0x16,0x82,0x10,0xcb,0xf2,0x2f,0xef,0xd9,0xdd,0x02,0xfd,0xeb,0x08,0xf7,0x21,0xfd,0xf6,0xf1,0x0f,0xd2,0xd8,0x10,0xf0,0xe1,0xe5,0xd3,0xf1,0x0a,0xfd,0x19,0x58,0xf5,0x27,0xf5,0x32,0xd2,0xe5,0x34,0xeb,0x23,0x5a,0xf8,0x23,0x03,0xda,0x00,0x15,0x15,0x27,0x33,0xf7,0x04,0xe7,0xe5,0x10,0xf1,0x2f,0x06,0x0e,0xcc,0xd9,0x09,0x0d,0xb7,0x26,0x20,0xfb,0x0e,0xc6,0x01,0xf2,0xe2,0xee,0xc6,0x2b,0x9f,0xd2,0x20,0x02,0xed,0xda,0x2f,0xe0,0xf1,0xf8,0x11,0x4e,0xb8,0x1d,0xea,0xf2,0xee,0xf8,0x05,0x23,0xf8,0xdc,0xa0,0x59,0x24,0xe1,0xe9,0xd9,0x0e,0xf8,0xe7,0xe4,0x4e,0x35,0x0c,0x7f,0xdd,0xba,0xe0,0xc6,0xb6,0x44,0x16,0xe1,0x13,0xe3,0x38,0xf8,0xe7,0x16,0xae,0xdc,0xdf,0xcd,0x45,0xde,0xfb,0x3f,0xd3,0x06,0x22,0xeb,0x16,0x06,0xe3,0xf6,0xd0,0x08,0x08,0xf0,0x08,0x1d,0xda,0xba,0xdd,0xf7,0x08,0xf5,0xf4,0x17,0xec,0xef,0x81,0x37,0xbd,0x06,0x2a,0x1f,0xca,0xfc,0xf8,0xef,0x12,0x69,0x09,0xfe,0x06,0x04,0xde,0x0c,0xe4,0x12,0xe4,0x0d,0xec,0xdb,0x88,0xf4,0xf0,0x28,0xeb,0xe0,0x3a,0xa3,0xf1,0xa5,0x15,0x0e,0xea,0xf9,0x0a,0x16,0x15,0x19,0x10,0xad,0x06,0xf1,0x06,0xae,0x08,0x24,0x35,0xe1,0xc4,0x9f,0xd7,0xa2,0xda,0xdd,0x45,0x19,0x39,0x14,0xf3,0x3c,0xf1,0xdb,0x34,0xf2,0x07,0x27,0xc1,0x11,0xdf,0xd9,0xb0,0x1d,0x5c,0xfe,0xe4,0x0b,0xe7,0xf4,0x32,0x1c,0x7f,0x35,0x05,0xef,0xf5,0x03,0xeb,0xa3,0xdd,0x20,0x07,0x11,0x2a,0x13,0xd8,0xd9,0xd3,0xc0,0xe3,0xcc,0xed,0xcd,0xfc,0xcd,0xde,0x31,0xda,0x07,0xe9,0xe9,0xf9,0x25,0x42,0xcb,0x1b,0x43,0xec,0x39,0xd7,0x32,0x17,0xdb,0xf3,0x10,0xf1,0x3c,0xc0,0x07,0xd6,0x1d,0x81,0xfa,0xc3,0x0d,0xfc,0x1c,0xff,0xc8,0x05,0xf0,0xc9,0x1c,0x18,0xe5,0x3b,0xf3,0xe9,0xf6,0xc8,0xdd,0x3b,0xd4,0x46,0xe5,0x0c,0x10,0x03,0x0b,0x1b,0x07,0x44,0x31,0x34,0x03,0xe9,0x44,0xcf,0x22,0xe5,0xb5,0x0e,0x21,0x66,0xd7,0x0c,0xbd,0xae,0xf5,0xe0,0x63,0xef,0x7f,0xec,0xf1,0x21,0xd1,0xbd,0x00,0x32,0xdf,0xe6,0xe0,0xd3,0xfc,0xfa,0x2e,0xe7,0xf4,0xf0,0xaa,0xde,0xf5,0x3a,0xf8,0xd8,0x19,0xfd,0xe6,0xd1,0xee,0xe9,0xf4,0xe5,0xf4,0x42,0x20,0xc3,0x4f,0xd5,0x49,0x3b,0x5c,0xe2,0x0d,0x69,0x2b,0x10,0xea,0x44,0x06,0x7f,0x17,0xe7,0xcc,0xcb,0x21,0x4a,0x45,0xdf,0x6e,0x2c,0xe2,0x18,0xc2,0xd7,0x3b,0xa5,0x5b,0x1f,0x00,0xfc,0x1c,0xa9,0x9c,0x9a,0xee,0xe3,0xc1,0xdd,0xe3,0x4c,0x45,0x92,0xba,0xfe,0x08,0x32,0xb5,0x16,0xf2,0x0c,0x2a,0xce,0xad,0xda,0xa0,0x60,0x12,0xc0,0xec,0x12,0x06,0x1e,0x7f,0x1c,0xf3,0x10,0xdc,0xed,0xcb,0xec,0x0e,0xff,0x08,0xde,0x0f,0xf6,0xf6,0x0b,0xe9,0x11,0x0b,0xf2,0xf7,0xce,0x09,0x06,0xe8,0xe3,0xf1,0x22,0xd7,0xff,0x0b,0x04,0x32,0xe7,0xe8,0xed,0xcf,0x0a,0x3b,0xf5,0xe9,0x28,0x00,0x08,0xda,0x05,0x1c,0xee,0x01,0x0b,0x07,0xf4,0xfd,0xb6,0x14,0x2b,0xd6,0xb2,0x08,0xe8,0x2e,0xff,0x17,0x5a,0x3b,0x09,0x24,0xe0,0xdd,0x55,0x3b,0xde,0x05,0x11,0xbe,0x12,0x02,0xe6,0xde,0x81,0x0b,0x03,0xf2,0xf2,0x5b,0x08,0xce,0xef,0x3b,0xdb,0x73,0x08,0x2c,0x04,0x34,0x0c,0x29,0xf7,0xea,0xf9,0x02,0xe8,0x52,0x02,0x03,0xf0,0x40,0xec,0xe6,0xf8,0xb6,0x48,0xf1,0x22,0x35,0x12,0xd7,0x09,0x0e,0xc0,0xfd,0x3c,0x1b,0x35,0x46,0x6c,0xdc,0x22,0x8d,0x39,0xc0,0x15,0x2b,0x84,0x29,0x38,0x69,0x07,0x08,0x20,0xff,0x2f,0xf4,0x12,0xe4,0xfe,0x33,0xed,0xe9,0xe3,0x04,0xd9,0xe0,0xa1,0xae,0x7f,0x10,0x12,0x38,0xf0,0xb3,0xcd,0x4d,0xd5,0x04,0xdc,0x18,0x23,0x16,0x1d,0x93,0x0e,0xcf,0x07,0x1c,0xa7,0x61,0x02,0x29,0x14,0xdd,0xdc,0x31,0xe8,0xf8,0x0e,0xbc,0xf2,0x3f,0xa7,0xa2,0xe2,0x81,0x0e,0xce,0xf8,0xfb,0x08,0xe3,0x1e,0x13,0xdf,0xde,0xef,0xe5,0xd0,0x1a,0xee,0xf8,0xee,0x17,0xee,0xe5,0x3e,0xf3,0xde,0x03,0x19,0x2b,0x54,0xcb,0x22,0x05,0xf1,0x42,0x22,0x32,0x40,0x39,0xe2,0xe4,0xb9,0x30,0xcb,0x16,0x2d,0x19,0xf8,0x89,0x14,0x0f,0x14,0xe8,0xe0,0x0e,0xc7,0x50,0x1e,0x1e,0xaa,0xf0,0x1a,0x0b,0xc5,0x17,0x91,0xe6,0x4d,0xf5,0xbf,0xd0,0xe7,0xf7,0xe9,0x09,0x19,0xef,0xc6,0x05,0x2d,0xec,0xab,0x16,0x13,0x01,0xfd,0x10,0xfd,0x2c,0xed,0x48,0x12,0x12,0x9e,0x09,0xf1,0xfe,0xd9,0x1e,0xb2,0xe4,0x7f,0x03,0x0f,0x2f,0xd8,0x3e,0x19,0x0e,0xa6,0x11,0x00,0x02,0x1d,0xfb,0xc3,0xb2,0x0b,0xf5,0xfa,0x30,0xdd,0xe4,0x51,0xe3,0xe4,0xe4,0x2a,0x14,0xd8,0x81,0x60,0x03,0x17,0xa9,0xef,0x08,0x03,0xc9,0xeb,0xb6,0xe2,0xa8,0x0d,0x26,0xcc,0x0f,0xf8,0x77,0xf8,0x20,0x0b,0xf9,0x1d,0x3b,0xcd,0x13,0xc3,0x00,0xa9,0x36,0x94,0x07,0x24,0x1e,0x1b,0x11,0x07,0x0f,0xf5,0xba,0xfb,0xf7,0x7d,0xf0,0x0b,0xc2,0x4f,0x10,0x23,0xfc,0x1c,0x1e,0x05,0xdf,0xea,0x10,0xef,0x2f,0xf5,0xdd,0xd2,0x23,0x00,0x40,0x0f,0xd6,0xec,0x1e,0x07,0x05,0xf9,0xe6,0xd4,0xeb,0xfb,0x14,0x48,0x00,0x32,0xf3,0xe4,0xdc,0x12,0xfd,0xcc,0xf4,0x43,0x3f,0x14,0x1b,0xeb,0xd8,0x0d,0x02,0xed,0xe4,0xfb,0x24,0x33,0x1f,0xf1,0xf6,0x3a,0xf9,0x09,0x7f,0xf9,0x2c,0x17,0xe2,0x21,0xf8,0xea,0x03,0x09,0xc7,0x38,0x3b,0xef,0x08,0xfa,0x07,0xa3,0xd2,0xc9,0xa0,0x28,0x57,0xf1,0x16,0x06,0xd7,0x34,0xe5,0xec,0xe7,0x37,0x0d,0xf5,0x56,0x2c,0xcc,0x2b,0xf3,0xf5,0x0e,0xc7,0xde,0x4d,0x0a,0xe0,0x47,0x14,0x17,0x11,0x0f,0x15,0xf6,0x11,0x0f,0x27,0xf9,0x7f,0xe6,0x22,0x29,0x4a,0xfa,0xe8,0xd8,0x0b,0x31,0x02,0xd0,0x0a,0xfb,0x29,0x17,0x09,0xd4,0x3c,0x51,0x51,0x0e,0xcd,0xff,0x0d,0x19,0xf8,0xd4,0x7f,0x0d,0xb9,0xca,0xff,0xe4,0xff,0x28,0xfd,0xd2,0xf7,0x02,0x0f,0xd9,0xde,0xf3,0x2a,0x29,0xd5,0x05,0x3b,0xf1,0x0a,0xd5,0x46,0x20,0xdc,0x48,0xd8,0xe4,0xf5,0x42,0xd2,0x18,0xfd,0x51,0x32,0x39,0xde,0xd7,0x08,0xe1,0xb9,0xe9,0x4d,0xeb,0xf3,0xde,0xf7,0xed,0xc9,0x4b,0x25,0xe5,0xf5,0x13,0xe3,0x0e,0x0f,0xd6,0xe7,0x37,0xd2,0x26,0xf9,0xed,0xf6,0x0c,0x06,0xf8,0xed,0x41,0x11,0xe6,0x33,0xcb,0x01,0xf6,0xea,0x12,0xeb,0x08,0xcd,0xb1,0x00,0x22,0x4d,0x7e,0x10,0x4d,0x45,0x26,0xf4,0x29,0x43,0xe3,0xf1,0x24,0x81,0xd0,0xa5,0xe4,0xed,0xf2,0x1d,0xcc,0xdf,0xfe,0xe5,0x09,0xd8,0xec,0x0d,0x27,0xf2,0xd4,0x0c,0xfe,0x13,0xd4,0x51,0xc4,0xa3,0xf5,0x48,0xc8,0x32,0xa3,0x8f,0x30,0x0b,0x15,0xd4,0xc1,0x02,0xca,0x02,0x2f,0xce,0xbe,0x71,0x0e,0x1b,0xb1,0xf9,0x13,0x4b,0x1a,0x29,0xc6,0xe9,0x40,0xcb,0xfa,0xa8,0x67,0xc8,0xd0,0x81,0xf5,0xf8,0x29,0xd7,0x1c,0xe1,0x3b,0x02,0xfc,0x50,0x16,0xc8,0x09,0x95,0x0f,0x9f,0x64,0xf4,0xf0,0xdf,0xfc,0xf8,0x38,0xa6,0xfe,0x1b,0x0f,0x67,0x21,0x5c,0x19,0xda,0x29,0xea,0x05,0xec,0x32,0x04,0xd7,0x81,0x00,0xd2,0x03,0xe6,0xef,0x0a,0xbe,0x2d,0x24,0xec,0x55,0xf0,0x4a,0x1c,0xd4,0x09,0x06,0x5d,0x37,0x2a,0x31,0xc8,0xf3,0xbc,0x1b,0x05,0xe8,0x05,0x04,0xd1,0xe4,0xd2,0x13,0xf5,0x93,0x0f,0xc5,0x16,0x56,0xfa,0x14,0x0d,0xff,0x10,0x10,0x39,0xf8,0xdf,0xd1,0xbe,0x1c,0xcd,0x32,0x16,0x28,0xc8,0x55,0x0b,0xfe,0x25,0x2a,0xef,0xdc,0x9a,0xd4,0xf7,0x05,0x17,0xe0,0xc1,0x1c,0x0d,0x23,0x13,0x07,0x28,0xf5,0x06,0xc8,0xc2,0xbd,0xf4,0xc7,0xfa,0x2b,0x7f,0x14,0x24,0x4e,0x09,0x5f,0x26,0x08,0x36,0x46,0x24,0xd7,0xc2,0x1f,0xf8,0x11,0x23,0x07,0xbb,0xdb,0x11,0xda,0xc5,0x45,0xde,0x32,0x09,0x32,0xbe,0xc2,0xf2,0xd2,0x5a,0xb6,0xfe,0xe4,0x47,0xa0,0xef,0xf4,0x16,0x33,0xf2,0x23,0x3d,0xea,0xde,0xe2,0x52,0x07,0xb4,0x18,0x31,0xe5,0xff,0x50,0x05,0xe7,0xf8,0xf3,0xe7,0xd4,0x41,0xd0,0x4e,0x44,0x27,0xff,0x2a,0xd4,0x41,0xf3,0xe1,0xc8,0xeb,0xd7,0x31,0x2e,0x20,0xb9,0xe5,0x05,0xf2,0x36,0xe3,0x10,0xb5,0xda,0xff,0x1c,0xb1,0xf0,0x27,0x02,0x7f,0xe1,0xb9,0x3b,0xab,0x25,0x37,0x75,0xa6,0x46,0xe8,0xcf,0xb7,0xf8,0x1c,0x48,0xec,0x06,0x2c,0xf2,0x9b,0x18,0x48,0xcd,0xde,0x0f,0xf2,0xe1,0x5c,0xfa,0xdf,0xf7,0xe9,0x29,0xd0,0x13,0xe5,0xe2,0xe6,0x0e,0xd4,0xf4,0xf8,0x1f,0xc6,0xe3,0x40,0x26,0xed,0x33,0xfa,0xce,0x24,0x7f,0xe4,0xcf,0x0a,0xef,0xe7,0x02,0x28,0x4f,0xd2,0x00,0x2f,0x13,0xfb,0xe7,0x22,0x1b,0x9f,0x65,0xc4,0x0f,0xe8,0x04,0x1c,0x2a,0x36,0xe9,0x6a,0xbc,0x27,0xc4,0xb6,0xd3,0x85,0xe9,0xc3,0x29,0xe3,0x35,0x00,0x79,0x0f,0x06,0xb8,0x0b,0x2b,0x25,0xe4,0xc7,0x1c,0x02,0x47,0xe1,0x5e,0xf9,0x0f,0xd3,0x29,0xdf,0xcb,0x20,0x1d,0xaf,0x2d,0x7f,0x1a,0x18,0x3f,0xf9,0xe8,0x7c,0x04,0x08,0xfc,0xd0,0xb1,0x49,0xf5,0xc5,0x09,0x0f,0x6b,0x18,0xda,0xef,0x2c,0x97,0xc2,0xc6,0xea,0xdf,0xb7,0xc6,0x44,0x23,0xd2,0xf6,0x99,0x2f,0x4e,0x8e,0x1f,0xde,0x3b,0x47,0x33,0xbb,0x16,0x65,0xca,0xac,0x0d,0xf0,0xee,0xe5,0x1b,0xe4,0xfb,0x81,0xa3,0x05,0x03,0xe1,0x11,0x0d,0xfb,0xa6,0x10,0xf0,0xd1,0x2e,0x0d,0x2e,0xe5,0x2b,0xd6,0xd3,0xf9,0xee,0x68,0xe9,0x0a,0xc8,0x6c,0xe3,0xfa,0x00,0x04,0xfc,0x0c,0x01,0xe1,0xff,0xe5,0xf3,0x14,0xfb,0xdf,0x2d,0x28,0xde,0x12,0xcd,0xa8,0xe1,0xff,0x1a,0xff,0x4d,0xc8,0xf3,0x0a,0x05,0x0c,0x4e,0xf2,0x0b,0xea,0xec,0x0c,0xdd,0x4f,0xcd,0x5a,0x0d,0x1f,0x36,0x37,0xea,0xf3,0x7f,0x2e,0x46,0xfa,0xda,0xd4,0xc6,0xf7,0xd9,0xf9,0xf3,0xd5,0xca,0xf4,0x05,0x81,0x25,0xd3,0xf1,0x78,0xcc,0xc8,0xd4,0x04,0x00,0x35,0xd0,0xdc,0xbd,0x17,0xf0,0x16,0x19,0xa5,0xee,0xf3,0xdd,0xf4,0x0b,0xdd,0x0c,0x01,0x03,0xeb,0x16,0x27,0xf7,0xd6,0x0b,0x0e,0x40,0x15,0x20,0xf7,0x14,0x60,0x01,0x09,0x0d,0xed,0x15,0x1c,0xbf,0xe3,0x13,0x0f,0xef,0x16,0xfb,0x10,0x12,0xf4,0xef,0x21,0x1d,0xf7,0x17,0xc4,0x01,0xf2,0xdc,0xcf,0xe6,0x2d,0xd0,0xda,0x14,0x32,0xe9,0xd1,0xed,0x1c,0x39,0x81,0x0f,0xd8,0xef,0x24,0xda,0x18,0x1c,0x11,0xfc,0x02,0x9f,0xed,0x2b,0xfe,0x12,0xfa,0xf6,0x3b,0x15,0x04,0xf0,0x0e,0x1a,0xc3,0x09,0xc2,0x0b,0xcc,0x4f,0x04,0xeb,0x16,0xe6,0x0c,0xc6,0xe3,0x54,0xfc,0xfa,0xf3,0x3a,0xe1,0x2e,0xcf,0x48,0x36,0xf4,0xed,0x10,0xd0,0xc1,0xff,0x09,0x04,0x38,0xfa,0xef,0x0c,0x03,0xd2,0xe0,0x13,0xf3,0xf1,0xda,0xd6,0xec,0xf9,0xe7,0x02,0xfb,0x43,0x49,0x00,0x2f,0x09,0xf5,0xf7,0x81,0xcd,0x98,0x2f,0xff,0xfc,0x08,0xd6,0x05,0x81,0xb4,0x03,0xf1,0x22,0x26,0x3c,0xef,0x0b,0x13,0xf5,0xde,0xf9,0x76,0xf6,0xe6,0xf2,0x3b,0xfd,0xe4,0xd5,0xd6,0xc2,0x15,0x60,0xe1,0x02,0xc3,0x04,0x3b,0xa8,0xd6,0x04,0x2c,0x1b,0x03,0xf0,0x24,0x98,0xd6,0xf9,0x07,0x18,0x29,0x0e,0x17,0x0c,0x0a,0x05,0xec,0xfb,0x0a,0xfd,0xfe,0x00,0x26,0x2e,0x04,0x11,0xe8,0x13,0xf8,0x39,0xf5,0xfa,0xcf,0xe6,0xdf,0xae,0x08,0x36,0xfe,0x0d,0xfb,0xf1,0x07,0x3e,0x18,0xeb,0xfa,0x13,0xf5,0x03,0x0f,0x0d,0xd9,0x06,0x7f,0xe8,0x17,0xf4,0x14,0x89,0xd0,0xa2,0xe1,0xac,0xfc,0xff,0x6b,0x17,0x99,0xfb,0xdb,0xf9,0xe8,0xca,0xe3,0x14,0xf5,0x3b,0x10,0x63,0x57,0xc5,0x0f,0xf1,0xcd,0x1c,0x0e,0x0c,0xd9,0x0a,0x04,0xfb,0xfb,0x4e,0x24,0xed,0x0d,0x12,0x3e,0xd5,0x1e,0xd6,0x81,0x3f,0x08,0xac,0x13,0x3c,0xec,0x35,0xb7,0xe0,0x1d,0x37,0xdc,0x10,0x62,0x1c,0xb2,0xef,0x41,0x2a,0x3c,0x17,0x10,0xe8,0xb9,0x3c,0x72,0xdd,0xdf,0x2c,0xe3,0x1a,0x0b,0x6f,0xc6,0xd6,0xef,0xde,0x3f,0xe8,0xe6,0xb6,0x19,0xd9,0xd4,0xef,0x15,0xcc,0x0a,0x55,0xdd,0xfa,0x24,0xe8,0xce,0x08,0x2e,0xf1,0xbb,0x4e,0xfb,0x1d,0xfd,0xfd,0x06,0xe8,0x18,0x10,0x7f,0xd6,0x31,0xf8,0xc6,0xe9,0xc7,0xf2,0x47,0xe7,0xfd,0xe3,0xc1,0xdd,0x0f,0x3a,0xb7,0xba,0x28,0xe7,0x16,0x8b,0xf9,0x1f,0x9d,0xfa,0x0a,0x28,0xe5,0xca,0xec,0x3d,0x29,0xb6,0x16,0x0a,0xfb,0x17,0xbf,0x02,0x24,0xce,0xde,0x36,0x7f,0x13,0xf0,0x83,0x35,0x25,0xe6,0xfb,0xf1,0xd0,0x05,0x39,0x26,0x02,0xc8,0xd6,0x5f,0xde,0xb9,0x3c,0x13,0xbc,0x2a,0x10,0xd5,0xad,0xf2,0xef,0x0a,0xf6,0x35,0xd2,0xad,0xd5,0x0a,0xf6,0x0c,0xb6,0x7f,0xd4,0x24,0x5a,0x93,0xa6,0xf7,0x11,0x00,0xf1,0x35,0x57,0x17,0xc7,0x3b,0xc9,0xdb,0x1f,0xbd,0xc7,0x81,0xf9,0xb1,0xd2,0x2c,0xec,0x5b,0xf0,0xed,0x83,0x27,0x26,0x7d,0xd5,0x12,0xab,0xd5,0x36,0xdf,0x60,0x44,0x3a,0x47,0xdc,0x25,0x1b,0x48,0xc1,0xec,0x02,0xdd,0x30,0x06,0xfd,0xf4,0x1f,0x2c,0xc1,0xe9,0xfe,0xf8,0x15,0x12,0x16,0x44,0x11,0xa5,0x39,0xb3,0x23,0x0f,0xde,0x1f,0x25,0xeb,0x05,0xfb,0x15,0xe1,0x71,0x3b,0xdc,0xf0,0x32,0xc9,0xf4,0xe1,0xb3,0x02,0x46,0x36,0x07,0x40,0x6b,0x1b,0xd0,0x36,0x1a,0xe3,0xa8,0xc9,0x77,0x03,0xd0,0xe5,0x2a,0x36,0x31,0xc5,0x0e,0xe5,0xf1,0xc7,0xfa,0x7f,0x2e,0xe6,0x0a,0x16,0x32,0xd7,0x17,0x2d,0xd4,0xf3,0xee,0xe1,0xc3,0x29,0x3e,0x04,0xc7,0xe8,0xe8,0xf8,0xee,0xfa,0xf5,0xd0,0xfd,0xfa,0xf7,0xe1,0x93,0x16,0x7f,0xd8,0xcf,0x06,0x1a,0x06,0xdf,0xfc,0x08,0xfe,0x22,0x0a,0xdd,0xdf,0xfe,0x19,0xf5,0x14,0x13,0x5c,0x08,0x2c,0xd3,0x02,0xe2,0x0e,0xec,0x23,0x0a,0x19,0xed,0xcc,0x33,0xe0,0xff,0x50,0xeb,0x3d,0x06,0xe1,0x06,0xad,0xd5,0x10,0x12,0xec,0xcf,0x06,0x12,0x5e,0x1c,0xd5,0x1d,0x0d,0x07,0x12,0xa6,0xb9,0xf4,0xf8,0xf6,0x3f,0xfd,0xdd,0x3a,0x1a,0x12,0xbc,0x1b,0xe6,0xd7,0x0f,0xfb,0x1f,0x27,0x1f,0xd6,0xee,0x27,0xbb,0x42,0xec,0x3a,0x0b,0xc0,0xfd,0x04,0xe0,0xe4,0x22,0x27,0xe8,0x06,0x39,0xdf,0xfb,0x17,0xda,0xfb,0xed,0xea,0xf6,0xcb,0xce,0x7f,0x21,0xdb,0x10,0xf6,0x47,0xba,0xbf,0x08,0xc6,0xdc,0x2c,0xeb,0xdd,0x03,0xdb,0x27,0x22,0x1a,0xe4,0x49,0x23,0xe8,0xf5,0xeb,0x12,0xfd,0x21,0xf3,0xf4,0xe8,0xdd,0xdb,0x3c,0xf2,0x26,0x30,0xfd,0xd5,0xcc,0x00,0x2b,0xb9,0xf0,0x25,0x0f,0xeb,0xe6,0xc9,0x01,0xf4,0x07,0xa1,0x0e,0xfb,0xe7,0x11,0xef,0x0e,0xdf,0x19,0xec,0x26,0x3d,0x18,0xd5,0x81,0x28,0xae,0x29,0xa8,0xf9,0x4d,0x0e,0x0f,0x21,0x0b,0x12,0xdd,0xb1,0xf1,0x0e,0x1e,0x0e,0x81,0xd7,0xbc,0x10,0x0a,0xf6,0xe9,0x05,0xdd,0xe9,0xe6,0xf1,0xfb,0x55,0x04,0xd0,0xfd,0xd3,0xe2,0x21,0xc2,0x19,0x13,0xe1,0x56,0xe1,0x27,0x0e,0xf0,0x09,0xf8,0x13,0x23,0x58,0xf7,0x1d,0x08,0xde,0x08,0xfa,0xfd,0xbf,0x1e,0x51,0x0a,0x10,0xa6,0xfe,0x7f,0x2d,0x4c,0x1c,0xe6,0xa3,0xcf,0xa5,0x30,0xe9,0xc8,0xf5,0x30,0xfd,0x3f,0xad,0xcc,0x12,0xdb,0x33,0xfd,0xe5,0xfc,0x4a,0x1f,0x12,0x9b,0xe8,0xcc,0xcd,0x06,0xd6,0x0a,0x42,0x2e,0x24,0xe4,0xcb,0x58,0xb7,0x15,0x2f,0x01,0x29,0xf9,0xe0,0x0a,0x08,0xeb,0x1c,0xa5,0xf7,0xee,0x9e,0xd5,0x43,0x17,0x78,0xfe,0xf1,0xa8,0xd8,0xdd,0xed,0x47,0xca,0xb2,0xd9,0x02,0x7f,0x08,0x36,0xd5,0xe5,0x45,0x13,0xcf,0x12,0x07,0xe1,0x5e,0x35,0x48,0xb5,0xf8,0x06,0xed,0x63,0x36,0x6d,0x27,0xd1,0xb8,0x21,0xde,0xbd,0xcd,0xc9,0x00,0xd5,0x12,0xf6,0x17,0x2e,0x8f,0x21,0xad,0x0f,0xa8,0xef,0x20,0x2f,0xe2,0x5d,0x16,0x31,0x51,0xcb,0x19,0xdd,0x0b,0x52,0xf9,0xe8,0xae,0xdf,0x4e,0xd7,0xe5,0xd5,0x71,0x68,0x07,0x64,0xd0,0xfc,0x27,0xbe,0x6a,0xce,0x1a,0xef,0xe0,0x04,0x15,0xb1,0x1e,0x48,0x1f,0xfe,0xd2,0x3f,0x22,0xb0,0xb5,0xd8,0x35,0x2d,0x81,0x07,0xa6,0xfd,0x0d,0x1a,0xbb,0xd2,0x17,0xec,0xd7,0xf5,0x12,0x33,0x50,0x58,0xfe,0xc7,0x2b,0x41,0xb3,0x39,0x27,0x05,0xd3,0x27,0xe7,0x30,0xb6,0xb6,0xe8,0xb3,0xe9,0xd9,0x22,0xfb,0xdb,0x05,0x9c,0xe0,0xfd,0x24,0x16,0x1f,0x05,0xfe,0x02,0x11,0xe7,0x09,0x09,0x13,0x19,0xfe,0x7f,0x11,0x32,0xf4,0xc2,0x3f,0x15,0xff,0xfb,0x3e,0x0c,0x13,0xff,0x0d,0xfe,0xbc,0x17,0xe2,0x05,0xc2,0xe7,0x57,0x16,0xed,0x19,0xdd,0xe6,0xfb,0xfb,0x06,0x2c,0xc3,0x3a,0xc1,0xf4,0xc8,0xf4,0xbe,0x11,0xdd,0x1a,0xff,0x02,0xff,0x77,0xb5,0x1e,0xef,0xfd,0xa1,0x4f,0x5e,0x23,0x08,0xb4,0xf8,0xef,0xbd,0x01,0xc9,0xe8,0xe2,0xfd,0x4a,0x1c,0xfe,0x1b,0x06,0x00,0xfb,0x07,0x0f,0x00,0x2d,0x46,0xd3,0xe9,0xda,0xf6,0xea,0x30,0xf4,0x13,0x15,0xce,0xe2,0xd5,0xba,0xfb,0x27,0xf6,0xe8,0x05,0x7f,0x0f,0xd7,0x03,0xed,0xe3,0xa9,0xec,0xea,0xc8,0xce,0x30,0x56,0xc4,0x0a,0x35,0xde,0xd5,0x04,0xd2,0x23,0xee,0x3d,0x27,0xeb,0xb2,0x15,0xf7,0xf8,0x91,0x02,0xfd,0x16,0x14,0xd6,0x22,0x14,0xf6,0xe0,0xf6,0xb4,0x20,0x0e,0x0f,0x38,0x15,0x2e,0xc3,0x24,0xf9,0xba,0x21,0x13,0x29,0xe4,0x1e,0xf0,0xd8,0x23,0xe8,0x23,0x43,0xf5,0xe3,0x19,0xc9,0x45,0xe1,0xe4,0xeb,0xfa,0xd8,0xfd,0xae,0xfd,0x1d,0xf5,0x7f,0xed,0x00,0xd6,0xd9,0x3d,0xc4,0xb9,0x1c,0x56,0xe8,0xbb,0x40,0xde,0xf5,0x50,0xfa,0xf5,0x04,0xe4,0xfe,0xfb,0xfe,0x3b,0x20,0xe0,0xca,0x1f,0xb5,0xf3,0xcf,0xfb,0xe2,0x0e,0xba,0xd9,0x81,0xbe,0xf9,0xcf,0xc7,0xb5,0x4a,0x19,0xf9,0x14,0xf3,0x02,0x17,0xf8,0xfd,0x34,0x07,0xdd,0xff,0xf1,0x0f,0xfa,0x01,0x01,0x24,0x25,0xc3,0xf5,0xd3,0x06,0xd5,0x73,0x07,0xb8,0x23,0x0b,0x0f,0x1d,0xc5,0xef,0x64,0x24,0xde,0xcc,0x36,0xd2,0x7f,0x1c,0x09,0x9a,0xe1,0xf8,0xbe,0xb7,0xe0,0x8e,0x70,0xde,0x2c,0xf8,0x27,0xc3,0xe4,0x27,0xf6,0x7b,0x10,0x02,0x01,0x23,0x52,0xe8,0xfc,0xf5,0x02,0x25,0x0f,0xc4,0xba,0xd3,0x3d,0x15,0xe0,0xd6,0xf8,0x93,0x14,0x0c,0x4d,0x40,0xf2,0x2b,0x19,0xcd,0x47,0x08,0x08,0x18,0x7f,0x0c,0xbb,0x3f,0xfa,0xdf,0xbc,0x18,0x05,0x3f,0x1c,0xc0,0xea,0x0d,0x01,0xcf,0xd7,0x29,0xf6,0x12,0x13,0xec,0x24,0xc9,0xc5,0xf9,0x15,0x1e,0x12,0xe9,0x21,0x2d,0xfc,0x02,0xfd,0xf7,0x07,0x12,0xb1,0xe9,0xc6,0x34,0x2b,0x01,0x0c,0xb2,0xf6,0xfc,0x0a,0x11,0xc6,0xfc,0xf3,0xfd,0xf5,0xc6,0xe6,0x39,0x1c,0xe3,0x81,0xc8,0xd1,0x0a,0xb2,0xf0,0xd4,0xdd,0x01,0xd9,0x0c,0xd8,0xb1,0x13,0x0c,0xcc,0x29,0x41,0x2d,0x18,0x09,0x1c,0xfa,0xdd,0x15,0x65,0xff,0xf5,0x0c,0x4d,0xa9,0x32,0x54,0x6d,0x0f,0xdd,0xf9,0xd4,0xe0,0xe5,0x06,0xca,0x0f,0x38,0xec,0xb8,0x4c,0x6d,0xa4,0x72,0x27,0x5f,0xfb,0x2c,0x28,0x4d,0xfa,0x0d,0xc2,0x16,0xf3,0xf6,0xc8,0x1b,0x11,0xde,0x18,0xee,0x91,0x98,0x1e,0xda,0x0f,0x7f,0xf6,0xd3,0x0d,0xbd,0xd8,0x12,0xaf,0x0c,0x05,0xf9,0x3a,0x30,0x45,0x08,0xd9,0xcf,0xee,0x1f,0x7e,0xe2,0x18,0xbd,0x26,0xde,0xf6,0xfb,0x24,0x1a,0xdd,0x0d,0xe9,0x08,0xe5,0xee,0x08,0xd7,0xd0,0xc6,0x14,0xf6,0x19,0xfc,0xf4,0xed,0x12,0xfc,0x0b,0x02,0x12,0xce,0x1a,0xca,0xd4,0xe4,0xcc,0xdc,0xb7,0xfa,0xa1,0xb0,0xca,0x22,0x26,0x3e,0xe8,0xd7,0x14,0xe9,0xeb,0x16,0xb0,0xf9,0x1e,0x34,0xf8,0xe1,0x0c,0x08,0xd5,0x01,0xf6,0x47,0xda,0x1d,0x9b,0xf4,0x37,0xe0,0xf8,0xbd,0x0f,0x30,0x44,0x18,0x3f,0x13,0xfd,0x0e,0x1e,0x09,0x2e,0x1b,0x5d,0x2b,0x04,0x95,0xc9,0x43,0xfd,0x34,0xfa,0xf8,0xfe,0x7f,0xfa,0xef,0xaa,0x19,0xeb,0xe6,0xc4,0xfd,0xdf,0xde,0x2f,0x43,0xce,0x3f,0xfc,0xf0,0xe0,0xe2,0xcd,0x27,0xfd,0xfb,0x40,0xe5,0x04,0xf0,0xee,0xe0,0x17,0x89,0x0c,0x2f,0x19,0x17,0xc8,0x26,0x0b,0xfa,0xfd,0x7f,0x06,0x0b,0xe4,0x47,0x4c,0x00,0x8e,0xf9,0xe9,0x0a,0x39,0x1a,0xe5,0xea,0x20,0xf2,0x23,0x4c,0x01,0x0c,0x09,0x27,0xe2,0xfc,0x08,0x15,0x19,0x16,0x1e,0xe5,0xf0,0xd0,0xa7,0xf5,0xdd,0x3e,0x04,0xf5,0x3d,0x24,0x15,0x1b,0xbf,0xf4,0x32,0x02,0xed,0xf3,0xd5,0x32,0xfc,0x59,0x81,0xaa,0x3e,0xf6,0x21,0x23,0xf3,0x24,0xcf,0x33,0x97,0xe9,0x0e,0xf5,0xd4,0x03,0xca,0x49,0xf9,0x46,0xc3,0xcb,0xed,0xef,0x19,0xc2,0x00,0xff,0x01,0xb3,0x10,0x20,0x17,0x03,0xf6,0xd0,0xcc,0x12,0xf7,0x26,0x2f,0xd4,0x66,0xea,0x01,0xba,0xd7,0x5f,0x0d,0xff,0x31,0xe9,0x20,0xf6,0x7f,0xe5,0x15,0x26,0xf2,0xef,0x05,0x0f,0xf8,0xd9,0xf7,0x5e,0x34,0xcb,0xae,0x92,0x5d,0xe1,0x0c,0x16,0x3b,0xa1,0x0f,0x04,0xce,0xb8,0x28,0xd8,0x54,0xe1,0x49,0x01,0xed,0x09,0xe0,0x1e,0xf7,0xe2,0x0b,0xf3,0xf3,0xe1,0x27,0xb9,0x39,0x17,0x3e,0xf1,0x02,0x1d,0x0e,0x67,0x19,0xbc,0x17,0xb3,0x0d,0xb4,0xe0,0x36,0xc9,0x1f,0x11,0xe3,0x2f,0xd3,0xdb,0xf4,0x26,0x0b,0x13,0xf1,0x01,0xd5,0x04,0xd0,0xdf,0x26,0xc4,0xb2,0x2b,0x33,0x38,0xde,0x41,0xc2,0xb6,0xf4,0x7f,0x4f,0xf0,0x00,0x04,0xfc,0x00,0xbd,0xed,0xfc,0xdb,0x3b,0xf9,0x16,0xf3,0xff,0x02,0xfb,0xf0,0x1d,0x2f,0x10,0xdf,0x5f,0xd9,0x01,0xfb,0xe5,0x29,0x38,0xde,0x05,0xd9,0xc1,0xf8,0xe9,0x1e,0xa7,0x13,0x01,0xb8,0xeb,0xb5,0x2b,0x29,0xa7,0xad,0xf2,0xdd,0xe5,0x0c,0x1b,0xee,0x58,0xae,0x05,0x62,0xd9,0x12,0xf2,0x0f,0x03,0x27,0x00,0x39,0xac,0xb8,0xef,0xcd,0x02,0x5f,0x11,0x1f,0xfe,0xa6,0x02,0x13,0xde,0x35,0x18,0x04,0xd0,0xeb,0x14,0xdf,0x81,0xed,0xfb,0x8c,0x14,0xfa,0xe9,0x1f,0x01,0x12,0xe7,0xc2,0xd2,0xea,0xf0,0xde,0xf1,0xfd,0x01,0x14,0xd7,0x0d,0x08,0x16,0x1e,0xab,0x3a,0x0e,0xe0,0xf6,0xf5,0x1c,0x50,0x7f,0xea,0x20,0x0c,0xdd,0xc9,0xfc,0xe3,0x0d,0xee,0x15,0xc7,0xde,0x0a,0x0c,0xf9,0x20,0xe8,0xff,0xda,0xf9,0xf0,0x6a,0xf2,0xf7,0x1d,0xf6,0xee,0xf0,0x23,0xe5,0x0c,0xde,0xd6,0x4c,0xe8,0x0e,0x91,0xdf,0xc9,0x7f,0x3c,0xa9,0x3b,0xcb,0x38,0xe2,0x38,0x5a,0xea,0x16,0xec,0x2a,0x5a,0xe1,0x04,0x00,0x13,0xf8,0xce,0x15,0x38,0x1a,0xc8,0x10,0x4c,0x2d,0x0c,0xfa,0xdb,0x59,0x2a,0xee,0x0c,0x9d,0x47,0x13,0x22,0xa1,0x5c,0xdf,0xff,0x97,0xcb,0x3d,0xcc,0x85,0xd0,0x76,0xf2,0x9f,0xe7,0x04,0xd4,0x32,0x14,0x1c,0x0a,0x14,0xe9,0x2b,0x9d,0x66,0xc4,0xd5,0xf0,0xda,0x40,0x4d,0x0a,0xb1,0x51,0xf9,0x29,0x19,0x03,0xb1,0x1b,0x4f,0xcd,0x0c,0xe1,0x1d,0x3c,0x0b,0x96,0x43,0xf6,0xe4,0xe3,0x57,0xa0,0xf8,0xdd,0x2d,0x00,0xa9,0x35,0xdb,0x5a,0x56,0xe2,0xfb,0x0a,0xd6,0x23,0x3b,0xc5,0x06,0xf9,0xe8,0x03,0x01,0x21,0xee,0xe7,0x0b,0x7f,0xf5,0x2f,0x11,0xf7,0x7d,0x0c,0x53,0xb4,0xd4,0xcd,0xe6,0x11,0x2a,0x0d,0xdc,0xc6,0x7f,0x2a,0x1a,0xd6,0xe8,0xba,0xe5,0x03,0x14,0xfc,0x00,0x17,0x0e,0x16,0xed,0x47,0x6e,0xbd,0xd4,0xfd,0x10,0xfe,0xcb,0xd6,0x09,0xeb,0xe8,0xea,0xd9,0xdb,0x25,0x20,0xcf,0x15,0x2e,0x32,0xbf,0x03,0xe2,0xf2,0xe9,0xdb,0x2c,0xd3,0xe1,0xe1,0xf4,0xd9,0xee,0x12,0x18,0xdf,0xd8,0xd8,0x38,0xf0,0x13,0x59,0xc6,0x1a,0xc6,0x0f,0x0a,0xe6,0x04,0x0b,0xc4,0x89,0xb0,0xcb,0x45,0x1a,0xf6,0xfa,0xd7,0x12,0x19,0x27,0xad,0x33,0xb0,0x25,0x41,0x33,0xfc,0x09,0x0f,0x3b,0xc1,0xf2,0x58,0xd3,0xfa,0xcc,0xf8,0x7f,0x0b,0xd1,0xe6,0x94,0x12,0x1d,0x78,0xfe,0xb6,0x3c,0x45,0xe5,0x5a,0x22,0x2d,0x05,0x32,0xd8,0xdc,0xc5,0x18,0x65,0x0f,0xc7,0xdb,0xf3,0xa0,0xdd,0xf9,0x31,0xfe,0xe9,0x08,0xd0,0x25,0xdc,0x07,0x1d,0x1d,0x00,0x24,0x26,0x7f,0xf6,0x10,0xdf,0x3c,0xf9,0x0f,0x13,0x2e,0xe4,0x12,0xf3,0xfe,0x19,0x00,0xf1,0x43,0xea,0x02,0xd8,0x1a,0x08,0x0f,0xdd,0x1c,0xe1,0x14,0xe0,0xe2,0x0f,0x06,0xea,0x05,0xd7,0xce,0xbd,0xe8,0x3b,0xea,0x22,0xcc,0xf0,0x18,0x1a,0xfd,0xed,0xfd,0xee,0x81,0xbe,0xf7,0x13,0xfa,0xfb,0xf5,0xe8,0x02,0xf8,0x1c,0x0f,0x01,0xf2,0x13,0x18,0x42,0x08,0x13,0x22,0x3a,0xc7,0xef,0x07,0x20,0xdb,0xea,0x0a,0x19,0xf9,0x09,0x01,0x13,0xfd,0xe9,0xdb,0xf2,0xfc,0x0a,0xf6,0x04,0xfd,0xdf,0x19,0xca,0xee,0x1c,0x05,0xf2,0xbb,0xe8,0xc1,0xef,0x18,0x16,0xfe,0xef,0x01,0xe1,0xff,0x19,0xe4,0x3e,0x34,0xe6,0x1a,0xe9,0x29,0xe5,0xdf,0x1c,0x2c,0xf5,0x0b,0x13,0x20,0x0a,0x2c,0xd9,0xc7,0xbb,0x0b,0xd6,0x03,0x01,0xc5,0xea,0x57,0xcd,0xe7,0x6b,0x27,0xf6,0x3c,0x29,0xf4,0x30,0xf1,0xd8,0xc1,0x02,0xf7,0x35,0xde,0x7f,0xec,0x1f,0xd0,0xf5,0x15,0xca,0x05,0xdb,0xd0,0xf7,0x16,0xf1,0x0a,0x06,0x25,0x07,0x08,0xff,0x35,0xce,0xd1,0x2c,0xf5,0x0c,0x13,0xf1,0x97,0xe2,0x13,0xd9,0x1b,0xf0,0xf8,0x18,0xe6,0xac,0x24,0xf0,0xa1,0x37,0x0c,0x09,0x02,0x31,0x40,0xf5,0xf9,0xfa,0x0e,0xcd,0x13,0xc8,0x09,0xeb,0xd9,0xe5,0xe0,0x34,0xf9,0x81,0xed,0xd9,0xf3,0xf4,0x1c,0x47,0xf6,0x08,0xda,0xff,0x00,0x19,0xb9,0xf7,0x30,0xe8,0xc6,0xd8,0xda,0x01,0xf5,0x2b,0xb1,0x57,0x09,0xce,0x09,0x3f,0xdb,0xad,0xf5,0xf6,0xf9,0x02,0xdd,0x21,0x3a,0x81,0xdf,0x0d,0x06,0x2f,0xd4,0x34,0xdd,0xf5,0x45,0x02,0xd6,0xf5,0xd8,0xfa,0xe1,0x10,0xcd,0x10,0x2b,0x09,0x02,0xff,0x07,0x00,0xd7,0x0d,0x22,0xe9,0x1c,0xfb,0x1a,0xf3,0x0b,0xed,0xa2,0x1d,0xd9,0xea,0xfb,0x33,0x1d,0xe3,0x12,0x66,0x98,0xee,0x1e,0x97,0x10,0xfb,0xc2,0xef,0x21,0x03,0x57,0xbc,0x06,0x1d,0x15,0xee,0xec,0xf1,0xe0,0xef,0xe7,0x08,0x10,0xf8,0xe7,0x2c,0xfa,0xff,0x03,0x37,0x43,0x14,0x22,0x09,0x01,0xe9,0x18,0xd9,0xf4,0x0a,0x1e,0x13,0xdf,0x08,0x2e,0xfa,0x1e,0x12,0x1d,0xe4,0xc5,0x2a,0x5d,0xed,0xff,0x22,0xe7,0x3b,0x0b,0x3b,0xf8,0x12,0x21,0xf5,0x0f,0x31,0xf0,0x81,0xfd,0xbf,0x0a,0x07,0x3e,0x03,0x25,0x35,0xdf,0xe4,0xd8,0xf0,0xda,0xa5,0xc2,0xc5,0xe8,0xe5,0x15,0x2b,0x0c,0xf1,0x0a,0x22,0xe6,0xe2,0xe5,0x31,0xef,0x17,0x40,0xfa,0x3b,0xf6,0x3e,0xc1,0xd1,0xdf,0x00,0x6e,0x04,0x7f,0xde,0x13,0xf7,0x0e,0x11,0x37,0xed,0xa8,0x23,0x3e,0x13,0xe2,0xec,0xfb,0xf1,0xef,0xee,0x0e,0x0a,0xfd,0x02,0xfd,0x1b,0x8d,0x81,0xf8,0x42,0xf8,0x30,0x0a,0xc8,0xe0,0x35,0xe3,0x20,0x91,0xc1,0x03,0x16,0x12,0xec,0xf5,0xdd,0x10,0x04,0xf4,0x03,0xf6,0x2e,0x29,0xfc,0x0f,0x15,0x3d,0x27,0xe5,0xd1,0xd8,0xdc,0x70,0xde,0x12,0x2e,0x23,0x05,0x09,0xe2,0xb8,0x1b,0x62,0x18,0x4f,0x14,0xfb,0xd4,0x12,0x0c,0x03,0xf3,0xce,0x43,0xef,0xed,0x50,0x3d,0xb5,0x1b,0x09,0x05,0x00,0x81,0xfd,0x13,0x42,0xdc,0xc5,0x34,0x1f,0xf5,0xe5,0xc0,0x47,0x3f,0xb7,0x29,0x25,0xb3,0xed,0x1c,0x34,0xc2,0xdf,0x97,0xfd,0xcd,0xea,0x2c,0x22,0x1d,0xc2,0xd7,0x95,0x88,0x26,0xe0,0xe3,0x31,0x32,0x17,0xe1,0x72,0xcc,0xfc,0x93,0xa9,0xbf,0xca,0xc3,0xcb,0xf6,0x29,0x85,0xfe,0x36,0x15,0x24,0xac,0x10,0x28,0xdf,0x01,0x10,0x05,0x0b,0x0c,0x74,0x2b,0x09,0x5d,0xe9,0xc6,0xb5,0xe7,0x0f,0xd5,0xd9,0x06,0x01,0xfd,0xc5,0x1f,0xc1,0x03,0xc4,0x0b,0xb4,0x59,0x3a,0xe2,0x09,0xdf,0xb6,0xe7,0x81,0xff,0xdb,0xcb,0x4c,0xdf,0x0b,0x28,0x18,0xfb,0xf8,0x13,0xdc,0x02,0xfe,0xee,0xde,0xfe,0xea,0x19,0x36,0xe8,0xe8,0x02,0x0d,0xa4,0xa9,0x27,0x0f,0x01,0xe3,0xd9,0x1f,0x26,0xee,0x17,0xaa,0xf9,0xff,0x47,0xf7,0x23,0xde,0xbe,0xfb,0x11,0xeb,0xc8,0x15,0xce,0xd5,0x0d,0xe6,0xe8,0x15,0x1b,0xe7,0x29,0x59,0xbb,0xc0,0xef,0x3c,0xfb,0x28,0x15,0x03,0x27,0x05,0x7f,0xf6,0xb5,0xcb,0x05,0xae,0xe4,0xb7,0x0f,0x0b,0x5f,0x4c,0xcd,0xd6,0x36,0x27,0x00,0xc5,0xfe,0x13,0xeb,0x07,0x36,0x4a,0xb0,0xdf,0xfb,0xef,0xff,0x03,0x38,0xb3,0xaf,0x0b,0x20,0x0f,0x01,0x02,0xea,0xe9,0x2d,0xc7,0x17,0xd7,0xe3,0xfe,0xe8,0xc2,0x06,0xfc,0x3f,0xf9,0xc2,0xf4,0x1a,0x12,0x17,0xf3,0xe2,0x32,0x07,0xf5,0x2d,0xe3,0xe5,0xdc,0x0a,0x81,0x03,0xf7,0x17,0x09,0xb9,0x08,0x39,0x6d,0x2d,0xe9,0xef,0x22,0xec,0x2f,0x52,0x28,0xf8,0xb8,0xfe,0xe2,0xfc,0xf7,0x07,0x05,0xff,0x08,0x41,0x30,0x0f,0xc8,0x2e,0x05,0xcf,0xdb,0xf2,0x06,0xaf,0xd4,0xb2,0x56,0x30,0xcd,0xf5,0x75,0xc5,0xbc,0x2a,0x3f,0xf9,0xf9,0xf4,0x00,0x6e,0x16,0xec,0xea,0x12,0xfd,0x02,0xf9,0x93,0x16,0xd3,0xf1,0xbc,0x9b,0xe8,0xdb,0x29,0xea,0x2b,0x13,0x07,0xdb,0x4f,0xd4,0x83,0x0e,0xdf,0xfd,0x7f,0xd8,0x1d,0xab,0x08,0xee,0xc8,0xe3,0x28,0xc3,0x25,0x0a,0x48,0x81,0xf1,0x02,0xcd,0xea,0xba,0xd3,0xde,0x02,0xe2,0x0d,0xe8,0x3e,0x03,0x1a,0xec,0x37,0xcd,0x03,0x0f,0xe8,0xc5,0x16,0x34,0xc8,0xf8,0xf9,0x1b,0x92,0x1b,0xfa,0xca,0xe6,0xda,0x52,0x08,0x23,0x3d,0x03,0x30,0x2b,0xfd,0xe8,0x5c,0xe5,0x22,0x0d,0x18,0xdb,0x0e,0x15,0xb8,0x1b,0xe0,0xd5,0xf1,0xda,0x15,0xf4,0xd2,0x25,0xe1,0xde,0xbd,0xcd,0xd1,0x0f,0x1a,0x5d,0x40,0xd7,0xf2,0xe8,0x45,0x2a,0xe8,0x21,0x97,0xe5,0x22,0x32,0xcd,0x16,0xce,0xb9,0x2d,0x12,0x23,0x2c,0x30,0xc7,0x4b,0x33,0x10,0xc1,0xe5,0x02,0xeb,0xdf,0xf3,0xff,0xf1,0x2c,0xff,0xe6,0x09,0x3e,0xc6,0x2c,0x06,0xf7,0x12,0xdb,0xe1,0x04,0xe0,0xda,0xc2,0xd6,0xfc,0x7f,0x30,0xf1,0x34,0x05,0xec,0x25,0xdc,0x2c,0xf3,0x2a,0xf1,0xf4,0xe6,0xf5,0x1f,0xeb,0x07,0xd3,0xf5,0x11,0x19,0x17,0xef,0xc3,0x7f,0xf8,0xd6,0xf5,0xf0,0xd0,0xe4,0x19,0xb8,0xe6,0xbb,0x1b,0x34,0xff,0xf5,0xc6,0xf8,0x35,0x46,0x89,0x52,0xe6,0xf5,0x08,0x05,0x0a,0x41,0x3a,0xe2,0xd8,0xb5,0xdc,0xf2,0xf6,0x44,0xc8,0xca,0x4e,0x13,0xa8,0x2f,0x14,0x26,0xef,0xf1,0x14,0x3a,0xc4,0x19,0xef,0x03,0x01,0x2f,0x03,0x13,0xcf,0xd1,0xbb,0x22,0xe2,0xfc,0x56,0xee,0x3d,0xe9,0x03,0x37,0x4c,0xb5,0xc8,0x22,0x22,0x00,0xe0,0xf7,0x07,0xcd,0xcf,0x14,0x01,0x13,0xcf,0x15,0x1e,0xd4,0xf8,0xdd,0xfc,0x27,0x32,0x2a,0xf0,0xcb,0x2b,0xcc,0xdd,0x13,0x29,0x09,0x7f,0x0f,0x5d,0xd7,0xd5,0x38,0xe0,0x08,0xfb,0x24,0x88,0x81,0xfd,0xdf,0x01,0x00,0x2e,0xd8,0xde,0xe9,0xfa,0x38,0xd4,0x9a,0x4a,0x32,0xfc,0xf7,0xe1,0x10,0xab,0xdd,0xdb,0xd8,0x5f,0x33,0xd9,0x03,0x1f,0x1f,0x25,0x35,0xd7,0xcd,0xea,0x39,0xf1,0xd5,0xc3,0x2a,0xa6,0xf7,0x38,0x06,0xda,0x19,0xfc,0xda,0x1b,0xe1,0x0b,0x9b,0x0b,0x16,0x26,0xa1,0xb2,0x0f,0x02,0x04,0x08,0x0d,0x2a,0x1d,0xbc,0x7f,0xea,0x14,0x01,0x19,0x0b,0x2e,0xd5,0xf7,0xe5,0x1d,0xc8,0x3b,0x25,0xfa,0x5d,0x17,0xf2,0x2e,0xfe,0x12,0xeb,0xca,0xdb,0xe2,0x03,0x2e,0xcd,0xfd,0xfb,0x11,0x1a,0xf2,0x5b,0xff,0x06,0xfe,0xd1,0x36,0xe4,0xf6,0x14,0xe8,0x22,0x2c,0x47,0x21,0x1f,0xd4,0x26,0xda,0x09,0xf4,0x58,0xf3,0xd5,0xf4,0xdb,0x2a,0x36,0x3b,0xe5,0x0a,0xdf,0xd5,0xe8,0xed,0x2e,0x06,0xc6,0xd8,0xf2,0xfb,0xfa,0xf0,0xbb,0x03,0xf2,0x02,0xf7,0xe3,0xaa,0x9f,0x01,0x17,0xf4,0xb7,0xbb,0x55,0xe1,0xba,0xc4,0xf7,0x07,0xb7,0x09,0x08,0xc7,0xf6,0x56,0xde,0x7f,0x09,0xd3,0x5f,0x48,0x1d,0x59,0x4b,0xc4,0x11,0x03,0xe7,0xb1,0xab,0xed,0xed,0x48,0xe1,0x05,0xb6,0x9f,0xde,0x1a,0xac,0xc9,0xeb,0x04,0xb4,0xbd,0xeb,0x03,0xe5,0xc0,0x20,0x1c,0xe9,0x46,0xf6,0x37,0x60,0xb2,0x09,0xc9,0x2d,0x1d,0x79,0x1a,0xe4,0x5d,0xae,0x30,0x41,0x26,0xe9,0x09,0xd5,0x34,0xe7,0x15,0xf3,0x81,0xbf,0x26,0xb5,0x93,0x5b,0xdb,0x1d,0x0c,0xd9,0xf8,0xac,0xeb,0xa9,0x45,0x91,0xa3,0x63,0x01,0x36,0xb0,0xc9,0x33,0x15,0x4e,0xfd,0x21,0xd0,0x9e,0xca,0xea,0x44,0xd9,0x0b,0x41,0xe8,0x1d,0xe9,0xdc,0x28,0x1b,0xe2,0xc5,0x10,0x33,0xc9,0x08,0x1b,0x1f,0x81,0xed,0xd8,0x69,0xd6,0x08,0xbd,0x3b,0x07,0x98,0xf8,0xd6,0x63,0x00,0x1f,0x0a,0xbd,0xf1,0xf7,0x00,0x21,0x36,0x10,0xc1,0x21,0x22,0x10,0x5c,0xd0,0xf8,0xbf,0xd9,0xf2,0x07,0xe3,0xf6,0xca,0xd6,0x04,0x05,0xe3,0xdd,0x4e,0xf8,0xb4,0xef,0x9d,0xfc,0x31,0xd1,0xdc,0xe7,0xd0,0xc9,0x7f,0xea,0xde,0x21,0x28,0x32,0x10,0xff,0xe8,0xc1,0x1c,0x1a,0x0f,0x51,0xae,0xcf,0x0d,0xbe,0x0a,0xf2,0x28,0x02,0xfe,0xfb,0xca,0xb8,0xdb,0x9c,0x0a,0xcc,0xdc,0x9a,0xfb,0x8d,0x8c,0xef,0x0b,0x1f,0x48,0xc8,0x27,0x10,0xaf,0x26,0x1a,0x31,0x88,0xae,0x1f,0x1a,0x07,0x09,0xbb,0xc0,0xd5,0x7f,0x02,0xdd,0xac,0x6b,0x10,0xfc,0x2a,0x2a,0xf2,0x21,0xe2,0xc7,0x9c,0x1d,0x15,0xfd,0xf1,0x37,0xa4,0x41,0xe6,0x1e,0xf5,0x42,0x03,0xf9,0x14,0xee,0xb9,0x44,0x7c,0xfa,0x16,0xf8,0x78,0xff,0x10,0xa1,0xd1,0x40,0x11,0xc6,0xd2,0x08,0x10,0xe3,0xef,0x16,0x26,0xe1,0x1e,0x1c,0x46,0x31,0x0b,0x3a,0x10,0x93,0x0a,0xe6,0x33,0x26,0x10,0xef,0x07,0xf5,0xf1,0x03,0x12,0xc1,0xcc,0x25,0x0a,0x1f,0xe8,0x1b,0xce,0x17,0x28,0x0f,0x0a,0x33,0xd0,0x06,0x2f,0xf2,0x01,0xf2,0xe8,0xdd,0xd8,0xff,0x02,0xfe,0xd2,0x09,0xf3,0x81,0xe5,0xf8,0xf8,0x1e,0x35,0xd4,0xf5,0xf0,0x42,0xed,0xc3,0x04,0x00,0x17,0xef,0x2d,0x1d,0xdf,0xc6,0xfe,0xf4,0xf7,0x46,0x08,0xe2,0xee,0xf1,0xd2,0x04,0xf7,0x24,0xd5,0xdf,0xf6,0xd8,0xeb,0xd6,0x08,0xec,0x0e,0xc8,0x1e,0xe8,0x09,0x05,0xb3,0xf9,0xfe,0xe8,0xe8,0xe5,0xe5,0x39,0x7f,0xa4,0x34,0x45,0xc3,0xcc,0xfc,0xec,0xe5,0xf0,0xf7,0xf2,0x05,0x00,0x29,0x0a,0x09,0x01,0x38,0x02,0xdd,0xdc,0x32,0xe1,0xd3,0xe7,0xf5,0xbc,0xf3,0xf9,0xe5,0x2e,0xeb,0xeb,0xee,0xe9,0x34,0xd5,0x01,0xda,0xe3,0xc3,0xae,0x38,0xbf,0xde,0xeb,0x0a,0x6c,0x23,0x72,0x01,0xfd,0xc5,0x41,0x35,0x18,0x01,0x7f,0x15,0xe5,0xbb,0x3d,0xd6,0xe9,0xd2,0x26,0xc1,0xef,0xf9,0x37,0xbc,0xb8,0x31,0x4d,0x0e,0x42,0xef,0x46,0x0d,0x3f,0x23,0xfd,0xc0,0xd6,0xeb,0x24,0xf3,0x45,0x63,0x15,0xdc,0xe5,0x1a,0xe4,0x17,0xfe,0x15,0x0f,0x03,0xf1,0xee,0xfd,0xec,0x1b,0x3a,0xbc,0xb4,0xfd,0x23,0x25,0x01,0xe5,0x81,0x10,0xf0,0xe9,0x32,0xf4,0x15,0x0e,0xd9,0x23,0xbb,0xfd,0x3d,0x06,0x0e,0x12,0xa4,0x0f,0xcb,0xfd,0x0c,0x0a,0x0c,0xee,0x06,0xa3,0x00,0x08,0x20,0x2e,0x4f,0xee,0x0f,0x41,0x38,0xe6,0xcc,0x16,0x42,0xc0,0xcc,0x20,0x1c,0x0b,0x00,0x1b,0xde,0x47,0xd8,0x08,0xe3,0x37,0xfb,0xfd,0xdb,0xc9,0x08,0xe9,0x06,0xc4,0x10,0xf2,0xe9,0xe0,0xcd,0xda,0x04,0x01,0x1e,0x11,0xd1,0xb9,0xff,0x1c,0xde,0x14,0xdd,0xe7,0x4e,0x01,0xeb,0xb2,0x61,0x2c,0x4b,0x02,0xd9,0x09,0xde,0xc8,0x06,0x22,0x0e,0x03,0xe2,0xf7,0x18,0xf0,0xfe,0xd2,0xf7,0xe2,0x2c,0x1b,0x2e,0xf9,0xf1,0xdc,0x18,0x02,0x81,0xe9,0x06,0xc5,0x22,0x52,0x89,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x78,0xd8,0xff,0xff,0x28,0x26,0x00,0x00,0xc4,0x0d,0x00,0x00,0xd4,0x0e,0x00,0x00,0xf0,0x1a,0x00,0x00,0x24,0x27,0x00,0x00,0x00,0xd6,0xff,0xff,0x08,0x24,0x00,0x00,0xbd,0xd6,0xff,0xff,0x0c,0xf2,0xff,0xff,0xbd,0x01,0x00,0x00,0xb6,0x03,0x00,0x00,0xce,0xe2,0xff,0xff,0x78,0x5d,0x00,0x00,0x93,0x50,0x00,0x00,0xb4,0xd4,0xff,0xff,0x18,0xfb,0xff,0xff,0x2c,0x06,0x00,0x00,0xa4,0x4b,0x00,0x00,0x3e,0x59,0x00,0x00,0x9f,0x3f,0x00,0x00,0x71,0x21,0x00,0x00,0xc5,0x3e,0x00,0x00,0xc6,0xc0,0xff,0xff,0x21,0x18,0x00,0x00,0xd1,0x7a,0x00,0x00,0xe1,0xe7,0xff,0xff,0x83,0x29,0x00,0x00,0xb5,0x26,0x00,0x00,0xf0,0x33,0x00,0x00,0x96,0x5a,0x00,0x00,0x15,0x1d,0x00,0x00,0x21,0xf2,0xff,0xff,0xd9,0x3e,0x00,0x00,0xec,0x04,0x00,0x00,0x8c,0xe4,0xff,0xff,0xa8,0xf6,0xff,0xff,0x16,0x43,0x00,0x00,0xdf,0xd2,0xff,0xff,0xf7,0x06,0x00,0x00,0x3a,0x2d,0x00,0x00,0x3f,0x34,0x00,0x00,0x1d,0x27,0x00,0x00,0x16,0x4e,0x00,0x00,0x28,0x11,0x00,0x00,0x8c,0x03,0x00,0x00,0x1f,0x43,0x00,0x00,0x1c,0xd5,0xff,0xff,0x3a,0x11,0x00,0x00,0x4b,0x3e,0x00,0x00,0x43,0x1d,0x00,0x00,0xcf,0x27,0x00,0x00,0x60,0xc6,0xff,0xff,0xc1,0xcd,0xff,0xff,0x97,0x18,0x00,0x00,0x57,0x22,0x00,0x00,0x05,0x24,0x00,0x00,0x85,0x15,0x00,0x00,0x16,0x10,0x00,0x00,0x50,0xd2,0xff,0xff,0x04,0xff,0xff,0xff,0x9f,0xf9,0xff,0xff,0x9a,0x58,0x00,0x00,0x1c,0xed,0xff,0xff,0x8d,0x21,0x00,0x00,0xd1,0x34,0x00,0x00,0x54,0x5c,0x00,0x00,0x29,0xf5,0xff,0xff,0x91,0x2b,0x00,0x00,0x27,0x0d,0x00,0x00,0x72,0x15,0x00,0x00,0xc2,0x15,0x00,0x00,0xcf,0xce,0xff,0xff,0x34,0x20,0x00,0x00,0xb3,0x07,0x00,0x00,0x02,0x6c,0x00,0x00,0x86,0x41,0x00,0x00,0xf2,0x2e,0x00,0x00,0x32,0xc9,0xff,0xff,0x1d,0xf4,0xff,0xff,0x1d,0xfc,0xff,0xff,0xf9,0x1c,0x00,0x00,0x40,0xfa,0xff,0xff,0x1d,0x59,0x00,0x00,0x26,0x0e,0x00,0x00,0x5b,0x0e,0x00,0x00,0x68,0x08,0x00,0x00,0xed,0x54,0x00,0x00,0x83,0x07,0x00,0x00,0xf2,0x1f,0x00,0x00,0x1b,0x32,0x00,0x00,0xd0,0xf1,0xff,0xff,0x33,0x0f,0x00,0x00,0x37,0x54,0x00,0x00,0x66,0x15,0x00,0x00,0x0d,0xea,0xff,0xff,0x82,0xdc,0xff,0xff,0xd7,0x34,0x00,0x00,0x98,0xf7,0xff,0xff,0x6c,0x13,0x00,0x00,0xfd,0x46,0x00,0x00,0x82,0xe1,0xff,0xff,0xca,0x54,0x00,0x00,0xaf,0x29,0x00,0x00,0x22,0xf5,0xff,0xff,0x89,0x13,0x00,0x00,0x9c,0xf1,0xff,0xff,0xcd,0x8d,0x00,0x00,0x2a,0x41,0x00,0x00,0x86,0x0d,0x00,0x00,0x44,0x2a,0x00,0x00,0x7d,0x3f,0x00,0x00,0x6c,0x25,0x00,0x00,0x7f,0x0e,0x00,0x00,0xbd,0x2b,0x00,0x00,0x3c,0x04,0x00,0x00,0xf2,0x4b,0x00,0x00,0x11,0xee,0xff,0xff,0x0c,0x3c,0x00,0x00,0x42,0x45,0x00,0x00,0x10,0x45,0x00,0x00,0xa7,0x7f,0x00,0x00,0x3b,0xf5,0xff,0xff,0x19,0x2e,0x00,0x00,0xbd,0x41,0x00,0x00,0xd7,0xd8,0xff,0xff,0xbd,0x30,0x00,0x00,0x77,0x55,0x00,0x00,0x5e,0x8b,0xfd,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0xa6,0xde,0xf3,0xa5,0xde,0xdb,0xc4,0xf3,0x2a,0xd5,0xdf,0x81,0x02,0xe1,0xd8,0x0c,0xc8,0x19,0xca,0x11,0xc6,0xd7,0x37,0x7f,0x23,0xd5,0x0a,0x10,0x81,0x15,0xab,0x9c,0xef,0x9b,0x94,0xe8,0xb2,0x3f,0x51,0xe5,0x0c,0x23,0xed,0x32,0xb7,0x81,0x85,0x17,0x03,0x0c,0xb9,0xba,0x81,0xfb,0x0d,0xeb,0x10,0x7f,0x35,0xee,0x00,0xbb,0x08,0xe8,0xe6,0xe3,0xe4,0xd9,0x32,0x7f,0x36,0xe2,0x28,0x48,0xdc,0xe6,0x8c,0xc4,0x49,0xae,0xc9,0xf4,0xf2,0xe8,0xee,0x7f,0xf3,0xa1,0xa6,0xec,0x07,0x56,0x7f,0xf8,0x39,0xb6,0xdf,0x05,0x64,0xdd,0x63,0x18,0xea,0xba,0xea,0x73,0x32,0x99,0x41,0x02,0x09,0xee,0xe2,0x05,0xeb,0xde,0xed,0xfe,0x04,0xcd,0xf8,0x99,0x5a,0xe1,0xcb,0x32,0x33,0xae,0x3b,0x41,0x03,0x3a,0x84,0x42,0x81,0xb6,0x57,0x0e,0xa6,0x4a,0x0d,0xcd,0x34,0x8e,0x7f,0x7f,0x57,0xe8,0x16,0xcb,0x7f,0x35,0xd5,0xb4,0x27,0x5d,0xad,0x8f,0xe4,0xb9,0x35,0xcd,0xc9,0xfb,0x9f,0x7f,0x7f,0xb4,0x69,0xd2,0x62,0x7f,0xb1,0xd6,0xd4,0xd0,0x7f,0x29,0xed,0xd9,0x70,0x03,0xad,0xc7,0x17,0x5a,0x2e,0xe1,0x01,0x24,0xb8,0x17,0xd1,0xf4,0xe5,0x61,0x59,0xed,0xf0,0x11,0x7f,0xe5,0x1d,0xb7,0xf9,0x91,0x43,0xf8,0xe9,0xac,0xf4,0x9c,0xab,0x65,0x23,0x53,0xd4,0xfb,0x4c,0xdc,0x65,0xa5,0x49,0xd6,0x22,0x7f,0x7f,0xd0,0xbb,0xd4,0x0f,0x81,0x81,0x7f,0xe2,0x81,0x26,0xcc,0x7f,0x10,0xc4,0xf9,0x8c,0xff,0xd2,0xd8,0x7f,0xcf,0xd3,0x81,0x7f,0x81,0xcb,0x7f,0x7f,0x81,0x0a,0x18,0xe2,0x17,0x81,0x14,0xb5,0x44,0xe3,0xc4,0xdd,0x4b,0xf0,0xe7,0xd3,0x83,0x39,0x20,0x20,0xf1,0x04,0xf3,0x11,0x2d,0xe8,0x81,0xd5,0xf4,0xa0,0x04,0xb1,0x0a,0x10,0xc4,0x9d,0xfe,0xbc,0x24,0x65,0xe8,0x8a,0x15,0xc9,0xa4,0xbc,0x81,0x81,0xe7,0xcc,0xe1,0xda,0xc3,0x56,0x0c,0x9b,0xd8,0xfa,0xc3,0x03,0xe7,0x07,0x28,0xff,0xf1,0xfd,0xc1,0xf0,0x3a,0xae,0x7c,0xff,0xe0,0x0f,0xd8,0x08,0xdc,0x6e,0xd4,0x26,0xe0,0x7f,0xf7,0x00,0x2e,0xdf,0x00,0xf8,0x48,0xa4,0xf8,0xea,0xbd,0x2b,0xd6,0x11,0xe0,0xe1,0x1a,0x03,0x0d,0xba,0x23,0xe7,0xc3,0xe9,0x5a,0xd0,0xa2,0x2b,0xff,0xe8,0xee,0xdb,0x01,0xe1,0xc1,0xe9,0x13,0xfd,0x53,0x67,0xb2,0xe2,0xe3,0x38,0x5b,0x04,0xb9,0xbb,0x17,0x17,0x81,0xce,0x32,0xe6,0x48,0x19,0x3b,0x35,0xb7,0x0b,0x00,0xa9,0xb2,0xe5,0xcb,0xec,0x7f,0xe1,0xd6,0xd3,0x37,0xe1,0xc0,0xa5,0xbd,0xc6,0x0b,0xbd,0xaa,0x6a,0x7f,0x35,0xe2,0xaf,0xf1,0xea,0xb1,0xf9,0x7f,0x7f,0x4d,0xbc,0xa7,0x29,0x7f,0xd4,0xff,0x20,0x32,0x8b,0x78,0xa7,0xc6,0x17,0xe8,0xa8,0xcf,0xbf,0xbb,0x7f,0x7f,0xc3,0xaa,0x35,0xf2,0x54,0xda,0x7f,0xfb,0x15,0xdc,0xaf,0xff,0x91,0xb2,0x08,0xf1,0xf1,0x1f,0xe3,0xa2,0xbc,0xdc,0x01,0xec,0x07,0xf1,0x33,0x7a,0x28,0xeb,0x7f,0x32,0x0b,0xe4,0xe3,0x7f,0x98,0xc8,0xda,0x90,0xce,0xde,0x3d,0x92,0x85,0xf8,0xe6,0x0d,0xcd,0xcb,0xb7,0xeb,0xb8,0x7f,0x24,0xe8,0xfb,0x92,0x11,0x96,0x47,0xca,0xe0,0xac,0x7f,0x7f,0x4e,0x11,0xdc,0x7f,0xa4,0x81,0x7f,0x7f,0xf2,0x3f,0x7f,0x7f,0x81,0x01,0xdd,0xe3,0x7f,0xd5,0x7f,0xca,0xed,0x4c,0x07,0xaa,0x06,0x7f,0xd2,0x7f,0x81,0x81,0x7f,0x30,0x7f,0xaf,0xca,0xc9,0xfd,0x81,0x7f,0x2c,0x1d,0x7e,0x81,0x95,0x48,0xe3,0x1f,0x58,0x7f,0x7f,0x24,0x7f,0x81,0x81,0x7f,0xdd,0xf1,0x93,0xef,0x8e,0xb0,0xfb,0x81,0x81,0x7f,0x7f,0x7f,0xe9,0x1d,0x7f,0x36,0x81,0x7f,0x7f,0xa6,0x81,0x7f,0x81,0xa2,0x7f,0x22,0x81,0x81,0xa3,0x7f,0x7f,0x6e,0x7f,0x7f,0xe4,0x04,0x81,0xfb,0xff,0x7f,0x02,0x72,0xdb,0x16,0xc2,0xed,0xdf,0x9d,0xb4,0x34,0xaa,0x81,0x7f,0xea,0x7f,0x81,0xcc,0x81,0x7f,0x81,0xfd,0x5c,0xd2,0x7f,0x15,0x55,0xbc,0x04,0xf4,0xe7,0xb3,0x67,0x1e,0x1e,0x6f,0x4c,0x39,0xe6,0x56,0x39,0x1c,0x51,0xf4,0x09,0xe8,0xa8,0x53,0x29,0xc6,0xfa,0x13,0xe3,0xf6,0xbd,0xf6,0x75,0xa9,0x81,0xc9,0xbf,0xf3,0xc1,0x17,0xd3,0x1c,0x2a,0x03,0xd2,0x1c,0xc8,0xd2,0x0f,0x6c,0xa7,0xea,0x33,0xab,0x3a,0xe6,0xe3,0xe4,0xf9,0x26,0x65,0x19,0xb2,0xd0,0x23,0xfe,0x1c,0x11,0xe2,0xee,0xf4,0xcb,0xb0,0xd2,0x0f,0x23,0xc3,0xfd,0x63,0x0e,0x04,0xb7,0x35,0xfe,0x7f,0x84,0x4d,0x05,0x64,0xe2,0xf0,0x26,0xa9,0xbc,0x2f,0xf6,0xe8,0xef,0x1c,0xcd,0xc6,0xc0,0xab,0x8f,0x16,0xec,0xe6,0xe3,0x7f,0x40,0xe9,0x9d,0xb6,0xdb,0xaa,0xad,0x83,0xf8,0x08,0xf3,0xd9,0x7f,0xd4,0xc4,0x19,0x8c,0x0f,0x7f,0xb9,0x92,0x10,0x97,0x7f,0xce,0xd6,0x9d,0x06,0x0c,0xfb,0xd9,0xf2,0x1b,0xe2,0xf0,0xcc,0x34,0x7f,0xd6,0xe1,0x03,0xf2,0xb1,0xf0,0xdf,0x09,0x21,0xf7,0x4e,0xff,0x24,0xfa,0xe1,0xcb,0xf5,0xcc,0xdc,0xc4,0xf7,0xf5,0x4b,0xfb,0x3f,0xef,0xab,0xe4,0xf8,0x08,0xea,0x64,0xfc,0x2d,0x17,0x0c,0x19,0xdd,0xa7,0x35,0x08,0xa6,0x09,0xfa,0xfc,0x02,0xef,0xb2,0x72,0x31,0xc9,0xff,0x1c,0xde,0xa8,0x05,0xfe,0xb5,0xc9,0x0a,0xdd,0xfd,0x17,0x2d,0xfd,0xe4,0xe0,0xe9,0x06,0xf2,0xf8,0x10,0xc2,0xed,0xde,0xc7,0x0d,0x4c,0xf1,0xf3,0x7f,0xd2,0x08,0x23,0x1e,0xdc,0xf6,0xfb,0x5c,0x95,0x2a,0x16,0xe4,0xc9,0xdb,0x7f,0xed,0x55,0xff,0x06,0xdb,0xe3,0xe6,0xda,0xe9,0xb2,0x3d,0xc9,0xef,0x43,0x9d,0xf5,0xdc,0x12,0x06,0xd8,0xc7,0x5f,0xf4,0x7f,0x29,0x43,0x4e,0xd3,0x12,0x4a,0x5a,0x06,0xe9,0x31,0xf3,0x90,0x7f,0xac,0xf8,0xd1,0xce,0xf4,0x7f,0xe1,0x34,0x7f,0xdf,0xa9,0xfc,0x01,0x39,0xc5,0xff,0x52,0x06,0x57,0x7f,0x81,0xb5,0x92,0xae,0xed,0x0a,0x03,0xeb,0xb7,0xbb,0x63,0x0f,0x52,0x7f,0x46,0x46,0xe1,0xd7,0x5f,0xb4,0x10,0xee,0x81,0x52,0x7f,0x81,0xeb,0xc3,0xa3,0xc2,0xfd,0xfc,0x9d,0x00,0x5a,0x0f,0x20,0xae,0xae,0xfa,0xdb,0x2e,0xd2,0xa4,0x0c,0x1d,0x7f,0xb3,0xd5,0xc3,0x0c,0xef,0x7f,0xf2,0xf4,0xd1,0xbb,0xab,0x23,0x7f,0x43,0x0d,0xf8,0xec,0x40,0x7f,0x7f,0xdf,0xf0,0xf3,0x1b,0xd9,0xe3,0x59,0xbc,0xe5,0xc4,0xed,0x0b,0x08,0xc4,0x02,0xf3,0xe3,0x3f,0xbd,0xc8,0xf1,0xbf,0xc5,0xdb,0xdf,0x4d,0xd9,0x05,0xf1,0x29,0x3e,0xe3,0xf7,0xfe,0x19,0x15,0x0c,0xe2,0x02,0x00,0x63,0xda,0xd6,0xf9,0xe7,0x01,0x2a,0x0d,0xe7,0x77,0xee,0xae,0xeb,0xcb,0xf3,0xe0,0xfc,0x2d,0xfb,0xfe,0x04,0x1a,0xc5,0xbd,0xf0,0x46,0xfa,0x93,0x02,0x1d,0xfd,0xfe,0xf4,0xd2,0x0c,0x23,0x01,0x0b,0xc9,0x20,0xf0,0xfe,0xff,0x99,0x7f,0xfb,0xeb,0xea,0xef,0xfe,0xb6,0xf9,0x11,0xca,0xa1,0xd9,0xe6,0xf2,0xc4,0xd9,0xf8,0x12,0xa3,0xfc,0x1c,0x03,0xdf,0x1e,0xc5,0xe3,0xce,0xd6,0xf8,0x23,0xe9,0x02,0x91,0xd2,0xee,0xee,0x3c,0x0b,0xec,0xde,0xd5,0x4d,0x13,0x25,0xf7,0xa1,0xd1,0xca,0xfb,0xd1,0xf6,0x07,0xea,0xd6,0x28,0xf0,0xd6,0x0b,0xca,0xc3,0xfd,0xb4,0xb1,0xf7,0xc8,0xda,0x05,0xf6,0xd0,0xea,0x8f,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xab,0xe6,0xff,0xff,0x26,0x01,0x00,0x00,0xae,0x02,0x00,0x00,0x85,0xe8,0xff,0xff,0xb4,0xeb,0xff,0xff,0xd0,0xf5,0xff,0xff,0x1e,0x0f,0x00,0x00,0x6b,0xeb,0xff,0xff,0x4b,0xe6,0xff,0xff,0xe5,0xe6,0xff,0xff,0x2e,0xf1,0xff,0xff,0x46,0x01,0x00,0x00,0xa6,0x15,0x00,0x00,0x32,0xfe,0xff,0xff,0x8a,0x09,0x00,0x00,0xf4,0xeb,0xff,0xff,0xa7,0xf8,0xff,0xff,0xeb,0xfa,0xff,0xff,0xd0,0x1f,0x00,0x00,0x0c,0x24,0x00,0x00,0x9b,0xfc,0xff,0xff,0x0c,0xff,0xff,0xff,0x77,0xe0,0xff,0xff,0x9a,0xef,0xff,0xff,0x19,0x08,0x00,0x00,0x67,0x22,0x00,0x00,0xe0,0x17,0x00,0x00,0xb6,0xe9,0xff,0xff,0xbc,0xef,0xff,0xff,0x33,0xff,0xff,0xff,0x8b,0xf9,0xff,0xff,0x52,0xdb,0xff,0xff,0x91,0x0c,0x00,0x00,0x14,0xff,0xff,0xff,0x1e,0xf4,0xff,0xff,0xbf,0xfd,0xff,0xff,0xf3,0xe5,0xff,0xff,0x29,0xf1,0xff,0xff,0x15,0x14,0x00,0x00,0x10,0x23,0x00,0x00,0xd7,0x17,0x00,0x00,0xfc,0x29,0x00,0x00,0x12,0x15,0x00,0x00,0x92,0xf9,0xff,0xff,0xbb,0x13,0x00,0x00,0x45,0xe5,0xff,0xff,0x26,0xf6,0xff,0xff,0x32,0xf9,0xff,0xff,0x46,0x0c,0x00,0x00,0x0e,0x2a,0x00,0x00,0x25,0x00,0x00,0x00,0x78,0xf5,0xff,0xff,0xaa,0xf0,0xff,0xff,0x22,0xec,0xff,0xff,0xbe,0x21,0x00,0x00,0x5d,0xf9,0xff,0xff,0xea,0xe7,0xff,0xff,0xb7,0x2f,0x00,0x00,0xce,0xf8,0xff,0xff,0x90,0x2e,0x00,0x00,0xe5,0x26,0x00,0x00,0xe1,0xf2,0xff,0xff,0x33,0xf9,0xff,0xff,0x9f,0x14,0x00,0x00,0x99,0x1e,0x00,0x00,0x9d,0xf9,0xff,0xff,0xef,0xdb,0xff,0xff,0x45,0xf0,0xff,0xff,0x08,0xf4,0xff,0xff,0x3f,0xf2,0xff,0xff,0x12,0xf1,0xff,0xff,0x69,0xf0,0xff,0xff,0xd7,0xeb,0xff,0xff,0xac,0xcf,0xff,0xff,0xca,0xe7,0xff,0xff,0x89,0xf2,0xff,0xff,0xe6,0x26,0x00,0x00,0x6d,0xf1,0xff,0xff,0xee,0xd4,0xff,0xff,0xca,0xfa,0xff,0xff,0x42,0xec,0xff,0xff,0x20,0x22,0x00,0x00,0x71,0x03,0x00,0x00,0xcd,0xeb,0xff,0xff,0x15,0x2a,0x00,0x00,0xe0,0xec,0xff,0xff,0x3f,0xf9,0xff,0xff,0x2c,0xff,0xff,0xff,0x06,0xfa,0xff,0xff,0x72,0xfe,0xff,0xff,0xf7,0xfd,0xff,0xff,0xe9,0xfd,0xff,0xff,0xcb,0xf1,0xff,0xff,0xe7,0xe4,0xff,0xff,0xef,0xfd,0xff,0xff,0x80,0xf6,0xff,0xff,0x1e,0x06,0x00,0x00,0xdb,0xfa,0xff,0xff,0x1c,0xe5,0xff,0xff,0x24,0xf5,0xff,0xff,0xfb,0x1a,0x00,0x00,0xb4,0x1c,0x00,0x00,0x18,0x3a,0x00,0x00,0x02,0xef,0xff,0xff,0x71,0x22,0x00,0x00,0xe1,0xf2,0xff,0xff,0x7f,0xef,0xff,0xff,0xd6,0x02,0x00,0x00,0x16,0xf8,0xff,0xff,0x87,0xf5,0xff,0xff,0x33,0xff,0xff,0xff,0x62,0xfb,0xff,0xff,0x1d,0x22,0x00,0x00,0x5d,0xf4,0xff,0xff,0x09,0x0b,0x00,0x00,0xd5,0xd6,0xff,0xff,0x5a,0xf3,0xff,0xff,0x6c,0xfe,0xff,0xff,0x7c,0xff,0xff,0xff,0x6b,0x25,0x00,0x00,0x0a,0xda,0xff,0xff,0x7d,0xf8,0xff,0xff,0xac,0xf3,0xff,0xff,0x71,0xf9,0xff,0xff,0x39,0xf3,0xff,0xff,0x2d,0xd4,0xff,0xff,0x33,0xfc,0xff,0xff,0xff,0xf2,0xff,0xff,0xf6,0x91,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xba,0xcf,0x85,0xce,0x0c,0x9f,0xff,0xeb,0x0c,0xa5,0xda,0xeb,0x12,0xda,0xf0,0x60,0xf8,0x00,0xf0,0x9f,0xe6,0x09,0xef,0xed,0x02,0xf9,0x4f,0xe9,0x44,0xae,0x5c,0x4d,0xf2,0xe7,0xd9,0x31,0xf8,0xd0,0xd3,0x2d,0x03,0xdc,0x00,0x36,0x0e,0xff,0xfb,0x1a,0x5d,0x7c,0xbe,0xf5,0xd1,0x1e,0x32,0x50,0x2b,0x1c,0x02,0xdf,0x49,0x3c,0x21,0x1a,0xf7,0xfc,0x48,0x03,0xda,0xfd,0x01,0xf7,0x58,0x19,0x22,0x2e,0x0f,0xd8,0xb0,0x3f,0x25,0x06,0x81,0xf7,0xcf,0x22,0x28,0x34,0xc8,0xf4,0xe5,0xff,0xc1,0x32,0xfa,0x0c,0x62,0x20,0x0a,0xf5,0x4c,0xcc,0xcc,0xd5,0xe9,0x05,0x45,0x41,0x17,0x3c,0xe1,0xfe,0x1a,0x25,0x2c,0x03,0xfa,0x21,0xdb,0xdc,0x02,0xec,0xf9,0x14,0x09,0x0d,0x23,0xbe,0xe5,0x00,0x23,0x2b,0x02,0x0c,0xf6,0x1c,0xc5,0xec,0x36,0x5e,0x1e,0x09,0x00,0xff,0xb3,0x43,0xa2,0x04,0x3b,0xf5,0xd3,0xd4,0x39,0x0a,0xdd,0x00,0xf1,0xfe,0x0d,0xd2,0xf5,0xf1,0x24,0xcd,0xe7,0x62,0x03,0x07,0xec,0x04,0xcf,0x16,0xf0,0xbd,0x37,0xf4,0xf5,0xdf,0x81,0x15,0xf7,0xf8,0xbe,0xda,0xd2,0xdd,0xd6,0xd5,0xe2,0xfa,0xf6,0x10,0x21,0xe0,0x30,0xd1,0x18,0xfd,0x0b,0xd7,0xde,0xd9,0xde,0xc3,0x2e,0xf8,0xdd,0xcd,0x13,0x12,0x0b,0x0f,0xed,0x0e,0xe6,0xe4,0xd3,0x32,0x02,0x29,0x1e,0xd8,0xe6,0xca,0xf4,0x07,0x2b,0x1e,0x11,0x0a,0xf9,0xce,0x4c,0xd1,0x1c,0x24,0xea,0x11,0xf1,0x0f,0xc4,0x12,0xf8,0x49,0x06,0x41,0x01,0x1c,0xec,0xe5,0xe5,0x1d,0xfd,0x2c,0xde,0xdb,0x2f,0x10,0x78,0x68,0x04,0x45,0xd0,0xf3,0xfb,0x1e,0x2e,0xf5,0xad,0xd1,0xf3,0xf8,0x05,0x0b,0x19,0xee,0xf7,0xec,0x14,0xee,0xf0,0x17,0x2f,0x16,0xa7,0xe1,0xb8,0x11,0x32,0xf5,0x26,0x1d,0x26,0x18,0xd9,0x03,0xfc,0x05,0x45,0x24,0xe0,0xff,0x0d,0xfe,0xf6,0x19,0xe5,0x07,0x05,0x10,0x0f,0x2b,0x29,0x2b,0x0c,0x12,0xdf,0x56,0x00,0x38,0x14,0xe4,0x0f,0xdc,0x16,0x58,0x09,0x14,0x01,0xf9,0x0f,0xd2,0x25,0x02,0x13,0xfc,0xe7,0x1d,0x27,0xf8,0x0c,0xee,0xae,0xe0,0x07,0x10,0xc3,0x16,0x04,0xd0,0x11,0x13,0xcf,0x7f,0xe4,0x0b,0xda,0x05,0x0f,0xe6,0xdc,0xba,0xe4,0x0f,0xf3,0x16,0xdc,0x0f,0xb2,0x3c,0xee,0xf2,0x21,0x1c,0xf1,0x1a,0x39,0xd6,0xfc,0xfe,0x11,0xf2,0x2c,0x36,0xfc,0x9c,0xfd,0x3a,0x01,0x90,0x36,0xef,0xf4,0xc5,0xfd,0xfd,0xa5,0x35,0x0f,0x36,0x0f,0xba,0xd1,0x17,0xe0,0x4d,0xb6,0xbd,0x1a,0x15,0xf5,0x20,0xd0,0x23,0x1f,0xff,0xe5,0xfd,0xae,0x7f,0x12,0xa0,0xef,0xf6,0xed,0xf2,0x20,0xe4,0x25,0xab,0x23,0xee,0x15,0xe2,0xbf,0x03,0xf2,0xbd,0x1a,0xfe,0xed,0xd3,0x24,0x26,0x22,0xd6,0x11,0xfc,0x19,0x10,0x11,0xfb,0xff,0xdf,0xe6,0x2e,0xee,0xf4,0x1b,0xf2,0xf2,0xf5,0x4d,0xbf,0xfc,0xf2,0xe7,0xd1,0x41,0xe8,0x45,0xf2,0x07,0x0c,0x19,0x01,0xf3,0xe2,0xe9,0xfa,0xe3,0xfd,0xfb,0x3b,0x42,0xc7,0xaa,0xef,0x01,0x27,0xdf,0xec,0xf6,0x1b,0xf7,0x1c,0xd9,0x22,0x0a,0x0a,0xe6,0x4d,0xb6,0x24,0x03,0xd6,0x08,0xb6,0xeb,0xf6,0x48,0x9e,0xbb,0x9a,0x26,0xd4,0x2b,0x9d,0xd0,0xc1,0xe7,0xfc,0x17,0x06,0xab,0x1a,0x5e,0x2e,0x53,0xc5,0x08,0x3e,0x20,0x24,0xe3,0xb6,0xcf,0x2b,0x1a,0x08,0xe9,0xc6,0x19,0x16,0xd4,0xc7,0x51,0x0c,0x01,0xf3,0x4f,0x2d,0x07,0xa5,0x1c,0x26,0x13,0xd4,0xc1,0xe3,0xe0,0xd7,0x06,0xb7,0xef,0xc1,0xfe,0x11,0xfc,0x00,0x0b,0x21,0x62,0x02,0x0a,0x06,0xf6,0x15,0xea,0xe0,0x22,0xcb,0xe4,0x43,0xf9,0xf0,0x11,0x45,0xfc,0xb8,0x9e,0x1d,0xd6,0x0b,0x45,0x15,0x35,0xe2,0x4c,0xd7,0xdd,0x14,0x01,0xe0,0x2b,0x49,0xf4,0xe0,0xbb,0x18,0x10,0xfc,0x72,0x30,0x62,0xcc,0xe9,0x09,0xd3,0xe1,0x30,0x53,0xe7,0x54,0xd1,0x23,0x1b,0xd6,0x09,0x0f,0xd9,0x29,0xef,0xd8,0xaf,0xeb,0xec,0x11,0x68,0x81,0x3f,0xef,0x29,0x2d,0x35,0xc3,0x69,0xd0,0x05,0x05,0x23,0xe7,0x0b,0x2a,0xf7,0x34,0xcc,0x2a,0x0c,0xd7,0xdb,0xdf,0x35,0x12,0xf8,0xd9,0x1a,0x2f,0xa5,0xc2,0x29,0x10,0xe6,0x17,0xf2,0x31,0x36,0x23,0xfa,0x2c,0xcd,0xdc,0xa6,0xa6,0x12,0x49,0xff,0x16,0xc6,0xd8,0xc3,0x0f,0xf4,0xd8,0xfe,0xe3,0xf0,0xdd,0x4c,0xd9,0xe2,0xe0,0x0e,0xfd,0xfa,0xe7,0x3d,0xdf,0xb6,0xf2,0xf5,0x83,0xdb,0xff,0x1c,0x3d,0x21,0x20,0x96,0xc6,0xc8,0x42,0x3a,0x1b,0x3c,0x27,0xcf,0x57,0x0f,0x1c,0xc4,0x3c,0xc7,0xe2,0xda,0xe8,0xc5,0xfb,0xf7,0xd7,0x03,0x08,0xd0,0xfe,0xf4,0xfa,0x11,0xaa,0xe5,0xdd,0xa4,0xdc,0x81,0x19,0x44,0x0e,0xea,0xfc,0xf5,0xd4,0xe3,0x13,0x2c,0x9c,0xef,0x04,0x10,0xa1,0x51,0x41,0xd4,0xec,0x23,0x67,0x22,0x0d,0x0d,0x34,0xca,0xd2,0xb6,0xca,0x3a,0xf9,0xc0,0x16,0xa6,0x22,0xeb,0xc3,0x10,0xd4,0xa1,0x35,0xc4,0x23,0x52,0xe6,0x30,0x30,0xe2,0xc8,0x26,0x21,0x20,0x00,0x66,0x46,0xfe,0x00,0xdd,0xaf,0x4f,0x4a,0xdf,0x16,0x05,0x02,0xe2,0x0b,0xf5,0xf5,0x0c,0xe6,0x45,0xeb,0x46,0x0a,0x3d,0x81,0x2a,0xf6,0xdb,0x38,0xb8,0xe9,0x06,0x1a,0x27,0xf3,0x1d,0x13,0xda,0x25,0x07,0x37,0xa4,0x23,0x0d,0x1f,0xd4,0xf1,0xdc,0x43,0x28,0x4f,0x36,0xa6,0x0b,0x13,0xf4,0xf3,0xe4,0xe8,0xe3,0x01,0x35,0x98,0x2b,0x00,0xc9,0x26,0x20,0xd4,0x5a,0x3b,0x0d,0xfb,0x03,0x28,0xe6,0xfe,0x12,0xe1,0x0c,0xef,0x72,0x1c,0xd6,0xa1,0x51,0xcf,0x1e,0x0c,0xed,0x5c,0xe2,0xd1,0x13,0xf7,0xe4,0xff,0xf2,0xe5,0xf2,0x10,0xf9,0xd2,0xdf,0x1f,0xff,0xee,0x1d,0x51,0x02,0xcc,0xf0,0xe3,0x0f,0xc4,0x45,0x02,0x2e,0x3e,0x13,0x34,0x00,0xf4,0xdc,0x3b,0x13,0x0f,0xe0,0x4e,0x02,0x55,0x17,0xfa,0xf7,0x07,0xcd,0x04,0xf6,0x9f,0x03,0xf4,0xf0,0xe4,0xdf,0xce,0x1c,0x0e,0x14,0x03,0x0c,0xf8,0x0d,0xe4,0xe1,0xea,0x2f,0xd8,0xdf,0x15,0xf1,0xcf,0xfc,0x16,0x3e,0x08,0x0c,0x00,0xfc,0xf0,0xc6,0xd6,0xf1,0x20,0x7f,0x07,0x43,0xce,0x00,0x06,0x12,0x18,0x11,0x11,0x1b,0xdb,0x13,0x1e,0xb5,0x49,0xdf,0xee,0xd4,0x39,0xd7,0x0e,0xfe,0x25,0xe8,0x18,0xc4,0xf2,0xd8,0x07,0x4d,0xe6,0xf6,0xf9,0xf7,0x05,0x31,0xda,0xea,0xfe,0xfd,0x15,0xfc,0x10,0xea,0x0f,0xc8,0x35,0xcb,0xc9,0x27,0xd5,0x33,0x24,0xf9,0x12,0x1b,0xc6,0x81,0x1c,0xfa,0x35,0xee,0xb0,0x01,0xd9,0x06,0x20,0x06,0x0b,0x14,0xb8,0xf6,0x1e,0x17,0xf3,0xf3,0x1c,0xbb,0xcb,0xa7,0xc0,0x35,0x04,0xfa,0x11,0x21,0x7a,0xaa,0xe1,0x12,0x14,0x12,0xd5,0x0c,0x11,0xc2,0x2c,0xfb,0xb6,0x2e,0x3a,0xfb,0xd3,0xed,0xf4,0xd0,0x1d,0x1c,0x04,0xd1,0x1d,0xb7,0xdd,0xd6,0xf1,0xf4,0xf0,0x09,0x0e,0xee,0x39,0x0a,0x16,0xe3,0xcb,0x27,0x1f,0xc8,0xf0,0x21,0x49,0x27,0x48,0xfb,0xe5,0xee,0xff,0x14,0xe6,0xf4,0xc9,0xdb,0x56,0xff,0xda,0xe9,0xee,0x1f,0x1b,0x0b,0xb5,0xe5,0x99,0xdc,0xdf,0xdb,0xdf,0xc1,0x07,0x52,0x18,0xd8,0xfc,0x00,0x0b,0xcd,0xe4,0x0f,0x38,0xf0,0xe5,0x28,0x93,0x26,0x10,0x49,0x16,0xf9,0x18,0x37,0xc8,0x9e,0x25,0xf0,0x16,0xb2,0xf5,0xed,0xdc,0xe4,0x20,0xf7,0x35,0x1b,0x40,0x22,0xd0,0xa4,0xdf,0x03,0xd0,0x39,0xd3,0x5e,0x10,0xb8,0xd8,0x47,0x41,0x1e,0xf3,0xe9,0x29,0xcd,0xee,0x0a,0xab,0x05,0xd3,0xe3,0x07,0xc9,0xd2,0x11,0xf2,0x36,0xef,0x62,0x10,0xd1,0xf2,0xea,0xb6,0x14,0xc8,0x24,0x03,0x1a,0xce,0x7f,0x43,0x39,0x0c,0xd3,0xb0,0x2e,0x1a,0x00,0xf9,0xed,0x00,0xf4,0xd7,0xad,0x03,0x01,0xaf,0x5a,0x16,0x10,0x30,0x16,0x04,0x3c,0x19,0x17,0x10,0xe8,0xdb,0xc9,0xe5,0x3e,0xf4,0x06,0xe2,0x16,0xe5,0x36,0x06,0xdb,0x2f,0xe0,0xf2,0x01,0xee,0xdf,0x08,0x15,0x5e,0x0d,0x5b,0x25,0x1a,0x41,0x09,0xac,0xe7,0x02,0x01,0xc2,0xed,0xf9,0x1b,0x7f,0xd5,0xfe,0x28,0x12,0xed,0xf8,0x2c,0x12,0x04,0x1b,0xf8,0x13,0xd2,0x0b,0xe0,0x04,0xf0,0x02,0xc9,0xc7,0xdb,0xd5,0xfe,0xe0,0xfa,0x13,0xdd,0xfa,0x12,0x1c,0xe2,0xfa,0xfd,0xf2,0x22,0xe5,0x0b,0x2a,0x4f,0xe2,0xfc,0xf3,0xdd,0x1d,0x2c,0x23,0xe1,0x2c,0xd5,0x10,0x05,0xf5,0x15,0x07,0x0f,0x0c,0x1e,0x1e,0xfa,0x17,0xf0,0xfa,0x03,0x22,0x1f,0x11,0x03,0xe8,0xf9,0x14,0x15,0x1d,0xfe,0x16,0xe8,0xd3,0x0d,0x19,0xdd,0x26,0xfa,0xc7,0x2e,0x1e,0x15,0xdc,0xeb,0xf8,0x14,0xfd,0x15,0x18,0xf5,0x2e,0x0b,0x20,0xf1,0x1a,0x1a,0x07,0x0e,0x18,0x2f,0x13,0xfe,0xf2,0xc7,0xd1,0xfe,0x00,0xfd,0x0f,0x1e,0x1c,0x04,0x28,0x12,0xec,0x0c,0xe4,0xe1,0xf6,0xfd,0xd5,0x2e,0x0f,0x13,0x19,0xf6,0x0a,0xd9,0xfa,0x01,0xeb,0xdc,0xef,0x22,0xfc,0x24,0x08,0x0b,0xbe,0xe6,0xcc,0x2c,0x2a,0xec,0x0c,0x3a,0xf5,0xd5,0xf1,0xf1,0x07,0xec,0x0c,0x2b,0xdf,0xdd,0x01,0x0e,0x1e,0x21,0x0c,0xf6,0xb8,0x05,0x20,0xea,0x53,0x1b,0xfb,0xf1,0x16,0xe8,0x06,0x2d,0x0f,0xdc,0x01,0xba,0x0b,0xc8,0x05,0x15,0x0f,0xf2,0x07,0xdb,0x24,0xd2,0x3e,0x30,0x22,0xfd,0xc5,0x02,0xca,0x18,0xf1,0xea,0x11,0x1a,0xef,0x1e,0xdd,0x7f,0xdf,0x08,0x11,0xe1,0xe0,0xd7,0xed,0xcd,0xcf,0xf4,0x0a,0x1b,0xd8,0xdd,0xfe,0xef,0x3f,0xf7,0x34,0xef,0x05,0xdf,0xe7,0xe7,0x21,0x38,0xef,0xfd,0xec,0xe8,0x12,0xd9,0xe0,0xf3,0x2c,0xc3,0xe0,0xeb,0xe6,0x1e,0x1f,0x1b,0xf2,0xbb,0xfb,0xf1,0x44,0xe4,0x0e,0x08,0x08,0xd9,0x3d,0x39,0x16,0x09,0x30,0xd1,0x4f,0x33,0x15,0xdf,0x07,0xf6,0xf0,0x20,0x14,0x39,0x0d,0xc2,0xef,0x81,0xf4,0x13,0x1b,0xee,0xc3,0xba,0xd7,0xe6,0x55,0xfa,0xeb,0xe0,0x3a,0x43,0x03,0x01,0xcc,0x11,0xa8,0x4d,0x33,0xe1,0x00,0x00,0x4a,0x58,0xd6,0xc1,0xdf,0x42,0xf2,0xb9,0x33,0xb7,0xd0,0x20,0x41,0xd8,0x3d,0xe2,0x5e,0x17,0xcd,0xe1,0xd6,0x14,0xee,0x1b,0xff,0xf0,0xd9,0xfc,0xb2,0xdb,0xcf,0xf8,0xba,0x3b,0xfd,0x1c,0xc7,0xd6,0x34,0x29,0xe2,0xe1,0xf8,0xab,0xdc,0x62,0x4f,0x17,0xdf,0xc7,0xef,0xda,0x44,0xfe,0xd3,0x4f,0x45,0xe1,0x3c,0x08,0xec,0xdb,0x3d,0xfc,0x1f,0xc8,0xec,0xb2,0x2b,0x20,0x22,0x1a,0xf7,0xcc,0xfb,0x03,0x15,0x58,0x20,0xf3,0xe4,0x19,0xf1,0xce,0x11,0xbd,0x1c,0x05,0xcd,0x1b,0xc0,0xfe,0x20,0xf4,0xf1,0x18,0x58,0xd5,0x28,0xec,0x29,0x0d,0x2b,0x1f,0xb3,0xf1,0x23,0xfe,0x7f,0x6a,0x47,0x2d,0xdf,0x04,0xf2,0xc3,0x01,0x1e,0x22,0x8e,0x08,0xfb,0x44,0x0f,0x5b,0xf7,0xe0,0x0c,0xf6,0xb6,0x34,0x0b,0x3e,0x0d,0xdd,0x41,0xf5,0xd7,0xf4,0x2b,0x14,0xec,0x0c,0xca,0x37,0x14,0x2f,0xda,0x3d,0x12,0x04,0x12,0x08,0xef,0xfc,0x71,0x21,0x4d,0xf6,0xe0,0xec,0xf3,0xcb,0x2c,0x23,0x11,0x91,0x06,0xf7,0x01,0xd7,0x2c,0x16,0xfe,0x1b,0xc8,0x1b,0x15,0xd6,0x04,0x2d,0x82,0x44,0x0e,0x08,0xff,0x3d,0x06,0x62,0x17,0xb2,0xee,0x4b,0x19,0x26,0x07,0x86,0xc7,0xff,0xf0,0x55,0xd6,0x04,0x4a,0xef,0xe6,0x33,0x15,0xe4,0x03,0x10,0xc1,0xc0,0xf5,0xed,0x1f,0x09,0x1d,0x21,0xaf,0xf9,0xd5,0x02,0x59,0x06,0xcc,0xfd,0xab,0xec,0x27,0x49,0xf1,0x10,0xe8,0xd1,0x1a,0xae,0xf7,0x14,0x2a,0x12,0x1f,0xfc,0xc3,0x3f,0xf3,0x08,0xe2,0xea,0xb3,0xef,0x10,0xed,0x04,0xf8,0x2b,0xce,0xeb,0xf4,0xf9,0x16,0xf0,0xf5,0x29,0x2c,0xcf,0xf3,0x15,0xf6,0x22,0xea,0x0d,0xf7,0xcd,0xf7,0x6e,0x0e,0xb9,0xea,0xd9,0xf0,0x1b,0x01,0xc9,0x0e,0xd5,0xf1,0x1a,0x00,0x1e,0xfb,0x0e,0xe4,0x05,0x4d,0xea,0x81,0xee,0x0e,0xcc,0x01,0x19,0xc6,0xfb,0xe3,0x14,0x34,0xec,0xe5,0x39,0x13,0x09,0x2c,0xc6,0xfe,0xa7,0xe5,0x20,0xd1,0x0c,0x0a,0x0c,0x43,0xe9,0xb0,0xf7,0xf3,0x02,0x60,0x29,0x1c,0xd9,0x28,0x3f,0x0d,0x35,0xc2,0x37,0x1b,0x0b,0x2d,0xe4,0xf4,0xa7,0xde,0xf0,0xbd,0x1d,0x22,0x21,0xc5,0x1f,0xe7,0x4e,0x28,0xcf,0xc2,0xf9,0xc3,0xb8,0xc9,0xec,0xe2,0xf0,0x0a,0x11,0xd0,0xc0,0xb0,0x25,0x0d,0xca,0xbe,0x2a,0xf8,0xd7,0x0f,0xe5,0xf7,0xfa,0xde,0xe5,0xe8,0xf6,0x42,0x2f,0xe3,0xdd,0x2e,0xb1,0xb8,0xcf,0xf6,0x08,0xc6,0x2d,0xd4,0xe0,0xee,0x34,0xd7,0x21,0x12,0xb3,0x48,0x3c,0x12,0xd5,0x04,0xcf,0xdc,0x25,0x05,0x03,0xcf,0x0b,0x30,0x9d,0x1c,0x30,0x23,0x5b,0x36,0x27,0x3d,0xdf,0xe0,0xfd,0xde,0xdb,0xfd,0x41,0x0c,0xdb,0xe5,0x08,0x1b,0xef,0x5c,0x81,0x1d,0x2a,0xcb,0x0e,0x0b,0x35,0x2a,0xcc,0x24,0xe8,0x2c,0x2e,0x18,0x18,0xe8,0x52,0xb7,0x32,0x16,0xd7,0xf6,0x51,0xdb,0xaf,0x39,0xfe,0xec,0xf0,0x8c,0xee,0xd5,0xc5,0x32,0x0e,0xc6,0xc9,0xab,0x06,0x35,0xdb,0x4d,0x33,0x02,0x1d,0x05,0xe9,0x27,0xcd,0x13,0x00,0xcb,0x48,0x0b,0xe1,0x0d,0xb3,0xfc,0xd9,0x10,0x24,0x07,0xf9,0xf3,0x1c,0xb3,0xba,0xf4,0xdf,0xf7,0xf3,0xc9,0x2e,0xd2,0xf6,0xfa,0x2a,0xca,0xec,0xb1,0xfd,0xf8,0xca,0xc8,0xea,0x04,0x38,0x25,0x09,0xb3,0xce,0x27,0x1a,0x4f,0x11,0x1a,0xe3,0x22,0x27,0xfd,0x03,0x41,0xd7,0x05,0xe5,0x9e,0x04,0x0c,0x04,0xf5,0xe3,0xdf,0x55,0xed,0xea,0xd0,0x2b,0x16,0xe2,0xf3,0x29,0xf4,0x44,0x27,0x65,0xda,0x45,0x16,0xd5,0xed,0x04,0xf3,0x13,0xb9,0xc8,0xe6,0xf8,0xbc,0x7f,0xdc,0xea,0xfd,0xed,0x10,0x10,0x29,0x3e,0xea,0xf8,0x9e,0x11,0xd2,0x0d,0x28,0x44,0x30,0x2a,0x49,0x2b,0xba,0xd4,0x18,0x07,0x48,0x12,0x21,0x59,0x36,0xea,0x13,0x58,0xe4,0xc3,0x37,0xdb,0xcb,0x19,0xdf,0x21,0x17,0x50,0x0d,0xcd,0xbf,0x2b,0x0e,0xd2,0x06,0xb9,0xfe,0x3b,0x1d,0xe9,0xd8,0x0d,0x41,0xdd,0xfe,0xeb,0xd5,0x37,0xad,0xf3,0x00,0x21,0x0f,0xcc,0xf0,0xd6,0x5e,0x0b,0xf2,0x09,0x2b,0x39,0xd3,0x1b,0xe3,0xb7,0xed,0xfb,0xe3,0xd7,0x40,0xe3,0x09,0x44,0x0f,0x26,0xf5,0xf9,0x4b,0x98,0xf1,0x09,0x81,0xe8,0xcd,0x34,0xdc,0x19,0x2a,0x5b,0xe8,0xf5,0xfd,0x2c,0xc2,0xd4,0xe1,0x0c,0xda,0xe7,0xfe,0xcd,0x1d,0xf8,0x00,0x08,0xe5,0xf1,0x51,0x10,0x11,0xa9,0xc9,0x28,0x10,0xfd,0x4e,0x0c,0x1e,0x21,0x28,0x0b,0x0e,0xe8,0xcd,0xff,0xe3,0x20,0xbd,0xe6,0x05,0xef,0x31,0xf6,0xe4,0x25,0x0d,0xf0,0xf0,0x1f,0x14,0xe0,0xf5,0x15,0x19,0xeb,0x0a,0x02,0xe9,0xbd,0x24,0x0c,0x0d,0x44,0xe9,0xf7,0xdf,0x42,0xce,0xf6,0x16,0x12,0x02,0xca,0x28,0x0f,0x1c,0x1c,0xf5,0x32,0xfd,0x24,0x43,0xdf,0xe6,0xea,0x1c,0x0a,0x11,0xfe,0xfd,0x12,0x19,0xf5,0xd2,0x47,0xc4,0x1f,0x0c,0xfe,0x07,0xf4,0x0c,0xd3,0xe6,0xd8,0x81,0x6d,0xff,0xf6,0x05,0x29,0xe1,0x04,0xd9,0xf7,0xf7,0xea,0xec,0xf5,0xbd,0x10,0x08,0xf5,0xd1,0x47,0x17,0x36,0xe0,0xf5,0xf2,0xe2,0xd9,0x10,0xd9,0xdb,0xe8,0x47,0xfd,0x30,0x41,0xfc,0xdf,0x10,0xf4,0x27,0x05,0xea,0xed,0xdb,0x1b,0x12,0x0f,0xd3,0x09,0xfe,0xf4,0x08,0xea,0xf4,0x0e,0x4e,0x0f,0xf3,0x53,0x35,0xc1,0xd3,0x06,0x39,0xed,0xc4,0xe4,0xd1,0xfb,0xcc,0x28,0xeb,0xb9,0xfe,0xd2,0xfb,0xf0,0xc5,0xf6,0x48,0xdf,0xb8,0x16,0xf4,0x20,0x04,0x32,0x3e,0xc8,0xe0,0xe5,0x0e,0x18,0x1c,0x30,0x1d,0xf7,0x1f,0x22,0x0f,0xb9,0x3a,0xa8,0x2c,0x55,0x01,0x0c,0xfb,0xb5,0xf1,0xf5,0xe6,0xe5,0x3a,0x7f,0xe0,0xba,0xcc,0xf4,0xfd,0xee,0xde,0x61,0xcd,0xf8,0xb7,0xd6,0xb1,0x10,0x03,0x10,0xe6,0xe4,0xf2,0xe0,0x2d,0x96,0x01,0x0e,0xde,0xc2,0x0d,0x22,0x06,0xd0,0x39,0xe3,0xfc,0x2b,0xb5,0xeb,0xc6,0xc7,0xac,0xe6,0x1f,0xf6,0xf9,0xbb,0x37,0xec,0xe9,0x2d,0xdf,0xb9,0x1a,0xe4,0xd5,0xdb,0xc3,0x07,0x19,0xef,0xf5,0xd2,0x1d,0x03,0xda,0x0e,0x33,0x42,0x30,0x19,0x09,0x3c,0xb6,0x03,0xea,0x1f,0xe7,0xf1,0xd4,0x0f,0xe5,0xe4,0x16,0x05,0xf5,0x05,0x7f,0xf3,0xd2,0x16,0xe7,0x23,0xda,0xd7,0xd0,0xfe,0xeb,0x2d,0xf4,0x47,0x05,0x0c,0xed,0x08,0x00,0x11,0x0d,0xe6,0xb4,0x24,0x13,0x10,0x17,0xf4,0x17,0xf5,0x23,0xd7,0x3d,0x0f,0xef,0xee,0xdf,0xf2,0xde,0x1b,0xfb,0xe3,0x11,0x11,0x1a,0x21,0x5a,0xb5,0x21,0x05,0xd8,0xed,0x36,0xde,0xfb,0xe8,0xe4,0xe8,0x39,0xd1,0x08,0x56,0xc6,0xf3,0x02,0x26,0xde,0x14,0xff,0x38,0x0a,0xea,0x0a,0xc1,0xfa,0xf2,0xd7,0xc8,0x22,0xcf,0xb8,0x28,0x10,0xc6,0xf0,0xec,0xff,0xdb,0x2e,0xf9,0x0d,0x39,0x02,0xf0,0xf9,0xf9,0x15,0x4a,0x02,0xd3,0x11,0xfe,0x15,0xdd,0xc7,0x19,0xe5,0x13,0x08,0x15,0x3c,0x05,0xcd,0x1a,0xf4,0x10,0x07,0xff,0xee,0xed,0x0f,0xfc,0x1b,0x0a,0xba,0xe0,0xf5,0xe2,0xb3,0x0c,0x9f,0x4d,0xfd,0xcd,0x1a,0xd8,0xf9,0xe3,0x34,0xef,0xf3,0xfd,0x40,0x47,0x0e,0x20,0x14,0xec,0x11,0xe8,0x38,0xfb,0x45,0xbf,0xed,0x6a,0xcf,0xd4,0x3c,0x0e,0x40,0x0b,0x2d,0x3d,0x30,0xd8,0x32,0x03,0xe5,0xc5,0x07,0x0f,0x03,0xfb,0x92,0xe6,0xe3,0x3c,0xfd,0x39,0xfd,0x12,0x99,0xdb,0x0e,0x3b,0x31,0x06,0xc0,0xc5,0x02,0x49,0xe3,0x3a,0xcc,0x38,0xef,0xa1,0x1e,0x09,0x01,0xc4,0x3b,0x28,0x41,0xb9,0x12,0xeb,0x10,0x43,0xdf,0x1e,0xb0,0xc8,0x7f,0x18,0x05,0x0e,0x0e,0xfe,0xde,0x34,0xe5,0x29,0xe9,0x06,0x00,0x0b,0x10,0xd6,0xeb,0x1e,0x14,0xe2,0xd9,0xba,0x1e,0xec,0x26,0x09,0xd0,0xc0,0xf7,0x8e,0x09,0xb6,0x44,0x22,0x29,0xf6,0x05,0xc7,0x91,0x09,0xd2,0x81,0x50,0xdd,0x10,0xf2,0x05,0x6b,0x10,0x0b,0x26,0xe1,0x79,0xd5,0x33,0xdc,0x1d,0xc8,0xed,0xc3,0x41,0x8f,0xca,0xde,0x10,0xec,0x01,0xe0,0xe5,0xe7,0x18,0x97,0xe0,0x09,0xfd,0x1b,0x09,0xfa,0x05,0x0f,0xf2,0xbd,0xeb,0x39,0xf5,0xe0,0xd9,0xe7,0xda,0x22,0x21,0x2b,0xf9,0xdb,0xf8,0x19,0x34,0xf2,0x38,0xdd,0xf0,0xfb,0xe5,0x04,0xf5,0xbd,0x59,0x01,0x0f,0x79,0x1c,0xda,0xcd,0x1e,0x30,0x27,0x0d,0x11,0x0a,0x0b,0xf0,0x4d,0xb3,0x5e,0xf5,0x23,0xf6,0xfc,0x2f,0xd7,0x5b,0xc2,0x5f,0x21,0xfd,0xdf,0x06,0x3e,0xef,0x78,0x5b,0x9a,0x3e,0x18,0xf0,0xf2,0xc4,0xf4,0xec,0xff,0x09,0xe7,0x23,0x07,0x22,0x1b,0xe9,0xdf,0x3c,0xe7,0x0b,0x01,0xc1,0x07,0xec,0xa0,0x0b,0xce,0xf9,0x02,0x0a,0x57,0x5d,0xbc,0x18,0xdb,0x24,0x08,0x07,0x37,0xfc,0xd2,0x3d,0xe0,0x12,0x14,0x32,0xe7,0x31,0xf9,0xe1,0x5d,0xf5,0xc7,0x25,0xf8,0xe5,0x0a,0x12,0x0b,0x29,0xfe,0xd5,0x3c,0x32,0xf8,0x02,0xed,0x1a,0x38,0xdb,0xee,0x12,0xdc,0x05,0x1c,0xa6,0xff,0xde,0xf3,0x07,0x06,0x1d,0xb2,0xd9,0x03,0x2b,0xa0,0x10,0x29,0xee,0x27,0x3d,0x2b,0xb4,0xdb,0x2a,0xca,0xf6,0xd4,0x10,0x81,0xff,0xe7,0x20,0xb3,0x04,0xbb,0xe5,0x0c,0xd7,0xbe,0xde,0xa9,0xed,0xe0,0x02,0xed,0x19,0x01,0x0e,0xc9,0xee,0x3f,0x4a,0x63,0xfa,0xfc,0xf8,0x12,0xdf,0xbf,0x12,0x1f,0x26,0xd7,0xfd,0x08,0x2d,0xc6,0x38,0xa5,0xba,0x42,0xed,0xe2,0x04,0x02,0x22,0xd2,0x34,0x25,0x29,0xfd,0x05,0xe4,0xfe,0x9f,0x12,0x36,0xb6,0xf1,0x3e,0x02,0xcf,0x54,0xa5,0x19,0xe6,0x59,0xfa,0xf9,0x1c,0x15,0x02,0xfb,0x3c,0x11,0x38,0xed,0x14,0xf1,0x0a,0x1a,0x14,0x03,0xd0,0x4c,0xcc,0x1a,0x1c,0x1e,0xe8,0xd6,0x2e,0xd7,0xef,0x60,0xd3,0x23,0xfb,0x0d,0xe8,0x35,0x7f,0xf8,0xde,0xf7,0x1b,0xf2,0xc9,0x1a,0xda,0xe1,0xc6,0x33,0xc9,0x37,0xce,0x02,0x43,0x05,0x07,0xeb,0x12,0xf9,0x32,0xea,0xf5,0x18,0x0f,0x51,0xd9,0xd1,0xdd,0xd1,0x02,0x18,0xef,0xc1,0x29,0x51,0xed,0xc2,0x37,0xee,0x45,0x02,0xdc,0xff,0x35,0xc4,0x03,0x0d,0xc8,0xdd,0x27,0xeb,0xb8,0xd4,0xdd,0x2d,0x2e,0xe7,0x26,0xf2,0xce,0xe7,0x04,0x1d,0x2d,0x05,0x0f,0x06,0xfd,0xc0,0xff,0xf5,0x09,0x21,0xec,0xf5,0xfe,0xee,0xf2,0x0e,0xea,0x16,0xec,0x01,0x14,0x2c,0x13,0xfd,0xdf,0x04,0xe0,0x0a,0xe2,0x9d,0xe4,0x54,0xd9,0x06,0x0b,0xda,0x0b,0xc3,0x0e,0x14,0xca,0x13,0xc7,0x46,0xfd,0x28,0xea,0x2d,0x14,0x16,0xd5,0x07,0x0c,0x27,0x27,0x07,0x10,0xde,0x46,0x02,0x0c,0x06,0x1f,0xd0,0x32,0xec,0xf9,0xb0,0xfe,0xcd,0xea,0x18,0x1b,0x09,0xcf,0x3d,0x01,0xee,0x07,0xeb,0xe9,0xe7,0xf5,0x00,0x2c,0x48,0xf8,0xe5,0x25,0xf3,0x0e,0x7f,0x0b,0x05,0xd5,0xcd,0x21,0x0a,0xdd,0xc6,0xef,0xf0,0xf1,0xfc,0xc9,0x29,0xf2,0xf9,0x04,0xee,0xe6,0x19,0xf7,0x1f,0x48,0x01,0xfb,0xc3,0xea,0xb0,0x0a,0x23,0xe5,0xfa,0xbc,0x12,0xfe,0xec,0x0a,0xdb,0x01,0xc1,0xed,0xdd,0xfe,0x08,0xee,0x8a,0x01,0xa4,0x11,0xf1,0x22,0xbc,0x00,0x08,0x16,0x23,0x02,0x7c,0x37,0xf8,0xff,0xfb,0xe9,0xcd,0xee,0x55,0x15,0x38,0x42,0x14,0xac,0xb2,0x5d,0x21,0xe5,0xfc,0x1a,0xd9,0xf9,0xc9,0xd3,0xd0,0x0d,0xe0,0x29,0x4f,0xfd,0xd1,0x4f,0xca,0xc8,0x05,0xed,0xe0,0xfa,0xf5,0x36,0x17,0x19,0xd6,0x4b,0xd5,0x14,0xda,0x51,0xe5,0xd6,0xfa,0x0f,0xd1,0x09,0xe8,0x93,0x24,0x75,0x19,0x2a,0x11,0x2e,0x30,0x0f,0x4d,0xfa,0xb9,0xda,0x94,0xbe,0xa0,0xf4,0xee,0x28,0xe8,0x2c,0x44,0xdd,0xb4,0x7f,0x9e,0xee,0xee,0xfd,0xf0,0x12,0xde,0x28,0x17,0xc4,0x1c,0x27,0x95,0x0f,0x18,0x09,0x33,0x3b,0x0d,0xe4,0xd4,0x14,0x37,0x39,0xc3,0x4f,0xc6,0x0f,0xe8,0x03,0xdb,0x01,0xf9,0xf2,0xe6,0xe3,0xb6,0x07,0xe9,0x8a,0x2b,0x57,0x10,0x2b,0x21,0x0a,0xec,0x06,0xad,0x65,0xcc,0x22,0x1f,0x35,0x01,0x8e,0x13,0x1e,0x19,0xc7,0xfd,0xfa,0x32,0xc9,0xe2,0x4b,0x5f,0x36,0xde,0xb5,0xea,0x4b,0x1d,0xdf,0xf5,0x13,0xe4,0xe1,0xf7,0x98,0xd9,0xef,0xfb,0x13,0x08,0x2b,0x08,0xd3,0xdf,0xfe,0x2d,0x01,0xbf,0xef,0x4d,0xe3,0x11,0x34,0xf4,0x2f,0xcf,0x09,0xbc,0xfa,0x63,0xdb,0x0f,0x3e,0x0f,0xc9,0xdb,0x12,0x0b,0xf3,0x2b,0xf2,0xf8,0xf0,0xbb,0xd2,0xb5,0xe8,0x49,0xef,0x91,0xdf,0x07,0x13,0x48,0xdd,0x46,0xfc,0xf5,0xfa,0xdb,0xdf,0x23,0x7f,0xe5,0x03,0xf2,0x2e,0x0e,0xb2,0xd8,0x10,0x48,0x03,0x03,0xd9,0xe4,0x2b,0xc0,0x17,0xfe,0xa2,0xfb,0xde,0xf7,0x05,0x26,0x5b,0xf7,0x51,0x0e,0xe2,0xcf,0xcc,0x58,0xc1,0x46,0x41,0xfe,0xf6,0x43,0xc8,0x48,0xf6,0x0c,0x1c,0xb3,0xf4,0x45,0xde,0x3b,0x38,0x2a,0x5f,0x90,0x3e,0xb5,0x24,0x73,0x1d,0x17,0x1c,0x0b,0xe7,0x0e,0xdd,0xfa,0x22,0x29,0x3f,0x02,0xf9,0xe2,0xf8,0x59,0xc9,0xe7,0xe8,0x14,0x11,0x7f,0x10,0xf0,0x4c,0xc2,0x39,0x67,0x1e,0x3b,0x29,0xa2,0x14,0xc1,0x45,0xc4,0x5a,0x97,0x3c,0x61,0x13,0x2e,0xb4,0xe8,0x2b,0x26,0x19,0xe9,0xc2,0xcf,0xf7,0xdb,0xee,0xfe,0x61,0xd7,0x34,0xed,0xcc,0xdf,0x4b,0x54,0x02,0x23,0x55,0xff,0xfd,0xc2,0x50,0x28,0x31,0x03,0xac,0x0c,0x44,0xe0,0xdb,0x20,0x16,0x23,0x10,0xd5,0x41,0x0a,0x2c,0x0b,0xe5,0xe7,0x65,0xfe,0xea,0xe9,0x4d,0xad,0x70,0xee,0x19,0xab,0xcb,0x22,0x20,0xc7,0xf7,0xe1,0x2a,0xa5,0xf3,0x20,0xf8,0x19,0x1c,0x0b,0x33,0x50,0x1e,0x3d,0xf3,0xce,0xf3,0x16,0x36,0x19,0xdb,0xf8,0xdf,0x1f,0xe4,0xe0,0x19,0x30,0x0a,0xa1,0xeb,0xba,0x0e,0xf8,0xa4,0xf6,0x22,0xdd,0xb3,0xf8,0xeb,0xbc,0x22,0xfa,0xff,0xe5,0x51,0xef,0xf7,0x08,0xe3,0x7f,0x0a,0x0a,0xd5,0x29,0xf0,0x02,0xc9,0x28,0x30,0xc3,0x19,0xd2,0x23,0x0f,0x6a,0xd3,0xb4,0xf1,0x12,0xd5,0xf3,0x19,0xc8,0xc6,0xcd,0xcd,0xf5,0xf9,0x10,0x36,0xf6,0x26,0x2b,0x50,0xe4,0x9b,0x47,0x43,0xee,0x2f,0x0a,0x19,0xf6,0x15,0xff,0x0b,0x14,0x13,0x37,0x27,0x18,0x23,0xfc,0x13,0x36,0x3a,0xf3,0xf5,0xfe,0xff,0x1f,0xdb,0x01,0x15,0xf2,0x5f,0x0e,0x12,0xd4,0xe9,0x07,0xdf,0x32,0xc5,0xcf,0xf5,0x28,0xf8,0x2e,0x2d,0xf0,0x7f,0xf1,0xf0,0xd9,0x04,0xd2,0x39,0x2d,0xb6,0xcf,0xd9,0x0d,0x08,0x6f,0xfd,0x2d,0xfb,0xd3,0xf8,0x0b,0x02,0xdf,0xf0,0xc7,0x52,0x34,0xf6,0x1f,0xf1,0xcf,0xec,0x48,0x1e,0xfd,0xed,0xe2,0xb4,0x20,0x3e,0xe2,0xfc,0xb4,0xfa,0xea,0x16,0xf4,0xd1,0x04,0xea,0x17,0x51,0x18,0x6e,0x23,0xec,0x06,0xec,0x62,0x04,0x5f,0xe4,0xbd,0x20,0x1a,0xa6,0xea,0x19,0xdf,0xf1,0xbf,0xf9,0xfe,0x8f,0x05,0xf7,0xe9,0xdd,0xfb,0x07,0xec,0x12,0x00,0x1b,0x49,0x14,0x2f,0xd4,0x06,0x15,0x12,0x19,0xeb,0x12,0xdf,0xea,0x44,0x07,0xe1,0x47,0xfe,0x46,0xe0,0x39,0xe5,0xe2,0xcd,0xee,0x24,0xde,0xe9,0xfd,0xb6,0x2c,0xc1,0xed,0xde,0xc9,0x28,0xef,0xdf,0x06,0x01,0xc7,0xf4,0xf3,0x22,0xde,0x14,0x0e,0x00,0x0f,0x0f,0xf2,0xcf,0x55,0xe2,0xf4,0xe5,0x0a,0x05,0xeb,0xd2,0x28,0xdf,0x14,0xc8,0xcd,0xda,0xfb,0xf8,0xed,0xf3,0x05,0xd9,0x7f,0xfd,0x2c,0x20,0xf0,0x10,0x0f,0xc8,0xd8,0x23,0xba,0xdb,0xfb,0x0f,0x04,0xca,0xe8,0x30,0xff,0xea,0x03,0x4f,0x03,0xd3,0xda,0x20,0xf0,0xbe,0xfd,0x26,0xca,0x03,0xc9,0xdf,0x03,0x48,0xf9,0x37,0xf6,0x13,0x01,0x21,0xf3,0x21,0xc7,0xd8,0xff,0xaa,0x36,0x39,0xef,0x36,0x03,0x00,0xe5,0x3b,0xe4,0xf8,0x32,0x3d,0x17,0x10,0xe7,0x28,0x32,0xbb,0x10,0xd0,0xc3,0x1b,0x0a,0xed,0xed,0x11,0x2d,0x01,0xd0,0xf4,0xf7,0x03,0x01,0x12,0xb5,0x0a,0xf5,0x04,0x02,0xf6,0x17,0x15,0xf6,0xaa,0xea,0xb3,0x3a,0x0d,0x19,0x43,0xdf,0xf3,0xdb,0xcd,0x4c,0xd0,0xf8,0x0a,0xeb,0x36,0xd6,0x8e,0x65,0x3c,0xc1,0x0e,0x04,0x1d,0x40,0xdb,0x04,0x27,0x27,0xbb,0x2b,0xc2,0xca,0x0f,0xf8,0x1b,0x27,0xe2,0x12,0x8f,0x15,0xfe,0xbc,0xea,0x4b,0xef,0xe7,0xfe,0xbb,0xc2,0xe6,0x08,0xe3,0xcc,0x38,0x36,0xdb,0x10,0x1a,0x11,0xe1,0x10,0xd3,0xe5,0xc1,0xec,0xd6,0xe8,0x30,0xce,0x2e,0x3b,0xe7,0xb9,0xce,0x01,0x39,0x3a,0x04,0x0c,0x3b,0xbe,0xec,0x2d,0xff,0x07,0x02,0xf4,0x61,0x81,0xf0,0x39,0x0c,0xf3,0xe4,0xca,0xc5,0xea,0x21,0xe5,0x12,0xef,0xe2,0xef,0xeb,0x13,0xde,0x21,0x18,0xf5,0xee,0x02,0x04,0x43,0xf4,0xd7,0xe9,0x25,0xd6,0x4b,0xff,0x4e,0xe1,0xe8,0xd4,0xfd,0xe5,0xfd,0xf0,0xde,0xe7,0x0e,0xe9,0xd3,0xd0,0x2f,0x25,0xe1,0x06,0xfc,0x21,0xd7,0xdf,0x25,0x7f,0x1b,0xee,0x01,0xed,0xf4,0x29,0xf3,0x3e,0x09,0x22,0xd8,0xd9,0x0e,0xc5,0x2e,0xe5,0x16,0x15,0x3d,0xb9,0x0d,0xff,0xc5,0xe0,0xff,0xfe,0x33,0xe3,0x19,0x61,0xe4,0xfb,0xfc,0x32,0xbf,0xea,0x00,0x38,0x45,0x2b,0xc5,0x25,0xec,0xd7,0x0c,0xf0,0x30,0xd0,0xc1,0x02,0x20,0xd9,0xf4,0x23,0x5e,0x21,0x45,0x0f,0x28,0xe6,0x4d,0x02,0x39,0x08,0xf1,0xe4,0xbd,0x16,0xff,0x02,0xfe,0xee,0xe2,0xd3,0xcb,0x35,0x6c,0x65,0xfe,0x03,0x00,0xf3,0xf0,0xb9,0x51,0x0a,0x4d,0x01,0x48,0xd7,0x12,0x17,0x1a,0x0a,0xf2,0x2f,0x07,0xf8,0x02,0xf5,0x47,0xca,0x17,0x09,0xd3,0x57,0xfd,0xe1,0xec,0x05,0xf9,0x03,0xfa,0xdd,0xf4,0x3f,0xb6,0x00,0x1c,0xd9,0x4a,0xea,0x23,0x03,0xf8,0xf5,0x11,0xfc,0x13,0x2f,0x09,0xb3,0x0b,0xeb,0x0d,0x19,0xf3,0x27,0xff,0x03,0xcb,0x18,0x56,0xd9,0x1d,0xec,0xbb,0xe5,0x22,0xf9,0xf6,0x14,0x13,0x7f,0x0c,0x1b,0xb0,0x0e,0x19,0x2c,0x2e,0x03,0x31,0x0c,0xff,0x31,0x11,0x18,0x03,0x28,0xde,0x1b,0xe4,0x1e,0x1b,0xfb,0x10,0xed,0x0f,0xff,0x18,0xd9,0x1a,0xde,0xfa,0xe7,0xb4,0x30,0xbe,0x4f,0x01,0x20,0x1a,0x02,0xfe,0x61,0x0e,0x22,0x1d,0x0e,0x30,0x38,0xc0,0xdd,0x2c,0xf5,0xd1,0x03,0x2f,0x51,0x3f,0xdd,0xdb,0xfc,0x13,0x23,0xc5,0x07,0x02,0xa5,0x20,0x35,0xf9,0x0b,0xdd,0xf9,0x1a,0xfc,0x0e,0xfb,0x23,0x20,0x3f,0x12,0x1c,0xe2,0xff,0xec,0xdf,0xe5,0xdb,0x0a,0x03,0x16,0xc1,0x0e,0xe0,0xf3,0x09,0xfc,0x0a,0xd9,0x03,0x7f,0x06,0x26,0xfe,0xfb,0x06,0xcd,0xe9,0x0f,0x1e,0xfa,0xe8,0x18,0xd5,0xdf,0x1b,0x12,0xe0,0x1c,0xe7,0x16,0x15,0xb4,0x03,0xf5,0xca,0xd4,0x33,0x0a,0xf7,0xfc,0x31,0xb2,0xef,0xf2,0xf1,0xf2,0xfe,0xf3,0xf9,0xfd,0xf6,0xd4,0x05,0x10,0x60,0x48,0x11,0xd8,0xf4,0x23,0x08,0xf4,0xee,0xe4,0xc6,0x22,0x14,0xdc,0xfc,0x06,0xff,0x18,0x0f,0x1c,0xf2,0xdd,0x30,0x35,0x53,0x01,0xd0,0xfa,0xdd,0x1a,0x0d,0x54,0x09,0xcf,0x1e,0xf4,0x0d,0xef,0x02,0x1a,0xf0,0x10,0xef,0x18,0xfc,0x0a,0x1a,0xfc,0x0a,0xec,0x0f,0x2e,0x01,0xfa,0x27,0x19,0xfd,0xef,0x0f,0xef,0x3f,0xf3,0x04,0xf7,0x0b,0x3d,0x2e,0xef,0x02,0xea,0xf8,0xf1,0xb5,0x02,0x3d,0xb7,0x0c,0xc2,0xf2,0x24,0x02,0xc8,0x4d,0xd7,0x16,0xee,0x2c,0x22,0xa4,0x21,0x00,0x0d,0xe4,0xc1,0xff,0x3b,0xf2,0x18,0x10,0x7f,0x27,0xd9,0xfd,0x0b,0x11,0xfa,0xac,0xd7,0x0e,0xd2,0xc8,0xbd,0xf9,0xd4,0x1c,0x4f,0x48,0xe4,0xf1,0x02,0x2c,0xab,0x3c,0x0d,0x97,0xc9,0xc2,0xdb,0xeb,0xf6,0x17,0x36,0xb7,0x09,0xfb,0xea,0xfa,0xad,0xcf,0xf9,0xee,0x2c,0x38,0x64,0xb2,0xb7,0xe7,0xf7,0xe4,0xf6,0x1b,0x0f,0xfb,0x0a,0xf4,0x11,0xc6,0x0c,0xfa,0xa0,0xec,0xf7,0xe6,0xc3,0x21,0xd7,0xe1,0xfe,0x9e,0xc9,0x01,0xef,0x05,0xbc,0xb4,0x2a,0x46,0x42,0xbc,0xd7,0xe9,0xec,0x17,0xfc,0x24,0xff,0x47,0x8f,0x4f,0xfc,0xeb,0xcd,0xdc,0xea,0xec,0x91,0xe6,0xee,0x26,0x9f,0xf3,0x0e,0xe2,0x1e,0x18,0xa9,0x56,0xe2,0x96,0x3a,0x02,0xf9,0xa0,0x21,0x47,0x51,0x28,0xd2,0x0f,0xa6,0x86,0x16,0xf7,0xec,0xea,0xa5,0xcf,0x4b,0x24,0x4f,0xfb,0xc4,0x43,0x47,0xf2,0xd5,0x31,0xa4,0x48,0xc0,0xe5,0xc5,0xe9,0x97,0xa3,0xbf,0xe6,0xed,0x66,0xf1,0xff,0x0e,0x6c,0x42,0x5c,0xef,0xe3,0x25,0x4e,0xd3,0xac,0xc3,0xf7,0x25,0x09,0xd3,0x13,0x02,0xea,0xd6,0x29,0x4e,0xd5,0x23,0x35,0xd0,0xd8,0xe8,0xc5,0x3c,0x81,0xad,0x38,0x02,0xa9,0x98,0xe8,0xcd,0x2e,0xd7,0xd5,0xb7,0x0e,0x48,0x2b,0x5a,0x41,0x57,0x14,0xc4,0x10,0xeb,0x61,0x16,0x1b,0xa3,0xfc,0x33,0xf7,0xeb,0x96,0x24,0xe9,0xdf,0x26,0x05,0x19,0xe3,0xf2,0x08,0x4a,0xdb,0xbc,0x08,0x13,0x0b,0x81,0x09,0xf1,0x04,0x05,0x09,0x1c,0x56,0xe2,0x11,0x0a,0x0f,0xc6,0x54,0xfd,0x15,0xcc,0x20,0xfc,0x18,0xfb,0x0a,0xee,0x39,0x21,0x35,0xd4,0xeb,0x2b,0xe1,0x2b,0x11,0x2e,0xd9,0x26,0xdd,0xc0,0x11,0xf3,0x31,0xe2,0xeb,0xf0,0xf1,0xf9,0xe7,0xfa,0x14,0xd2,0xe7,0xf3,0x1f,0x28,0x46,0xf5,0x36,0xcf,0x14,0xea,0x01,0x10,0xb8,0xcb,0x0b,0x17,0xc6,0xf2,0xf0,0xe2,0xf4,0x31,0xdf,0x2d,0x23,0xf2,0x02,0x12,0x0f,0x44,0x1f,0xfa,0x2f,0x08,0x39,0x22,0xc6,0xe3,0xc5,0x0b,0x13,0x02,0xcf,0xd8,0x09,0x12,0xc9,0xd3,0xec,0x0c,0xe3,0xe7,0x17,0x39,0x10,0x27,0x05,0x1b,0x1b,0x1c,0xe8,0x12,0x13,0x2a,0xde,0xec,0xfb,0xe5,0xfd,0x37,0xe3,0xcb,0x20,0xe1,0x2f,0xc5,0x20,0xc2,0x06,0x29,0x0e,0xdf,0x5b,0xf6,0xfc,0xcf,0x55,0xf3,0x7e,0xca,0x0d,0xfd,0xd3,0xbd,0xd0,0x04,0x09,0x99,0x30,0xd9,0x24,0xc0,0xf1,0xe7,0x4a,0xfc,0x6c,0xf3,0x01,0xd4,0xfa,0x1c,0x5e,0x20,0xea,0xc3,0x06,0xc9,0x0a,0x8a,0x32,0xe2,0x2f,0xf3,0x1f,0x12,0x39,0x12,0x12,0xaa,0x02,0x3f,0x51,0xb5,0x59,0x1f,0x32,0x13,0x1a,0x22,0xc9,0xf0,0xff,0xef,0xb1,0xd9,0xc6,0xdd,0xf2,0xfa,0x2e,0x3a,0x4f,0xd4,0x02,0xc7,0xcf,0xf7,0xcb,0x12,0x8f,0x0a,0x14,0xe5,0x85,0x0d,0xbe,0xd1,0xa3,0x22,0x50,0xa7,0x4d,0xec,0xe0,0x0b,0x24,0xb0,0x31,0x4c,0x17,0xf7,0x00,0x8c,0xe0,0x7f,0x1b,0xe6,0xdd,0xf5,0x36,0x04,0xf7,0x93,0xef,0x38,0x4c,0x03,0x1b,0x5f,0xe9,0x26,0x20,0x14,0xfb,0xf1,0x0a,0xcf,0xfe,0x09,0x05,0xaa,0x34,0x21,0xc4,0xcb,0x09,0xf3,0xdc,0xff,0x7f,0x0f,0xda,0x0e,0x22,0x23,0x2f,0xf7,0x11,0xf9,0x13,0x18,0x2d,0xe0,0x34,0x34,0x19,0xe4,0x0c,0x27,0xbd,0x08,0xe0,0xe8,0xeb,0x19,0xff,0x1e,0x0c,0xe9,0xfc,0x49,0x07,0x0c,0x10,0x15,0xdb,0x20,0x02,0x26,0x07,0x1c,0x25,0x23,0xd0,0x10,0x12,0x46,0xe4,0xc8,0x02,0xdf,0x0e,0x14,0xfb,0xe9,0xf7,0x1a,0x0b,0x0b,0x22,0x02,0xf9,0x0f,0xf9,0x24,0x0a,0x27,0x10,0x0f,0x23,0x1a,0x87,0x01,0xf4,0xde,0x10,0x06,0x04,0x1b,0xe9,0xdd,0xe2,0x0c,0x19,0xc5,0x0a,0x0b,0x19,0xe6,0x20,0x35,0xf3,0x22,0xf7,0xff,0x39,0x1a,0x06,0xed,0x21,0xf7,0xd3,0x09,0x22,0x05,0xe5,0xf0,0x0a,0xf6,0xfe,0x0a,0x13,0x05,0x51,0x19,0x10,0x34,0xfd,0x44,0xf4,0xe3,0xf8,0xf2,0xf4,0x30,0xe9,0xf8,0x19,0xfa,0x0a,0xdb,0x0e,0x0a,0xc9,0xff,0xe7,0xdd,0x28,0xf3,0x05,0x42,0xe6,0xf3,0x18,0xf9,0xe9,0xf4,0x08,0x20,0x1d,0x20,0x39,0xe8,0x11,0x07,0xf7,0xd1,0x3a,0xee,0xdc,0xfa,0x35,0xf3,0x0d,0x17,0x12,0xf9,0x1c,0xfa,0x09,0x06,0x05,0x17,0x27,0x00,0x21,0xcb,0x0c,0xff,0x20,0xc7,0x03,0xf4,0x0a,0x20,0x15,0xe1,0x26,0x02,0xd9,0x12,0x0e,0x41,0xfc,0x24,0x01,0xe9,0x24,0xeb,0x05,0x19,0x1b,0x11,0xd4,0x27,0xe1,0x08,0x07,0xfb,0xe3,0xe1,0x20,0x1e,0xfd,0xe6,0xc1,0x1d,0xda,0xe9,0xd8,0x03,0x08,0xc1,0x19,0x0f,0x33,0xde,0xf3,0x17,0xe9,0x0b,0x0d,0x04,0x7f,0x1d,0xfd,0x05,0x36,0xb6,0xd1,0x22,0x07,0x5e,0x1e,0xeb,0xfc,0x3c,0xd1,0x15,0x0a,0x1b,0x11,0xd7,0x29,0x19,0x3d,0xa9,0x20,0xda,0xc0,0xeb,0xa3,0x20,0xdf,0xe0,0x8f,0xee,0x0e,0xf8,0xf0,0xfb,0x16,0xed,0x43,0x0b,0xb0,0x1c,0x06,0x85,0x26,0xe8,0x23,0xc4,0x65,0x11,0x26,0xf4,0x2d,0xfa,0x11,0xd1,0xc9,0x42,0xdd,0x1f,0xbe,0xae,0x0b,0x03,0x52,0x07,0xc1,0xd7,0x25,0x23,0x07,0x2c,0xd5,0x0b,0x1a,0x14,0x3b,0xd8,0x13,0x31,0x37,0x0d,0x1d,0x25,0xda,0xe8,0x03,0x17,0xf9,0x7f,0x03,0x01,0x30,0x29,0x53,0x56,0xf6,0x18,0x9b,0xde,0xe9,0xc3,0xed,0xe6,0x1a,0x9e,0x37,0xda,0x0f,0xcb,0x2c,0x21,0xd8,0x42,0x16,0x00,0x22,0x36,0x45,0x18,0xbf,0xff,0x0d,0x25,0xff,0xaf,0xf8,0xef,0xdc,0x1c,0x9f,0x05,0xeb,0x26,0xe2,0xdd,0x3c,0x02,0x06,0xfa,0xe9,0xf7,0xa9,0x15,0x07,0xf8,0xf7,0x0c,0xfe,0xe1,0xff,0x24,0x9e,0xd7,0xbe,0xdf,0x0a,0xf6,0xca,0x05,0xf6,0x15,0xe7,0xf2,0x3b,0x0f,0xdb,0x2c,0x27,0x98,0x13,0x74,0xff,0xf7,0x11,0xde,0x40,0x2d,0xeb,0x02,0xe2,0xe7,0xea,0xdf,0x00,0x32,0xea,0xd9,0xfc,0xc6,0xfc,0xf5,0xdd,0x02,0xd7,0xd7,0xe1,0x23,0xe5,0xbf,0xcd,0x64,0x4a,0xe4,0xf3,0x7f,0x1d,0x05,0x96,0x53,0x22,0xe8,0xb6,0xc2,0x18,0x23,0x1a,0x64,0xec,0x03,0xe5,0xcc,0x4e,0x6d,0xf5,0x5f,0xf0,0x86,0x00,0xc0,0xdd,0x28,0x15,0x47,0x1a,0x21,0x00,0xdf,0x0c,0xd2,0xf5,0x0b,0xd8,0xd5,0x37,0x2c,0xf6,0x1a,0x15,0xce,0xe4,0xef,0xf9,0x1f,0x08,0xd1,0x41,0x0f,0xd1,0x44,0xe5,0x25,0x36,0x0e,0x0c,0xf6,0xf6,0xf2,0x2c,0x22,0xb1,0x1d,0x15,0x21,0x5b,0x25,0x11,0x75,0xba,0xd9,0x10,0x1e,0xf7,0x01,0xdd,0xf6,0x7f,0xb7,0xfc,0x12,0x1e,0x02,0xcb,0xeb,0xf0,0x00,0xea,0xbd,0x35,0xbc,0x1f,0x10,0x14,0xd2,0x07,0xdc,0xce,0xc6,0x02,0x01,0x21,0x50,0xc8,0xb7,0xf2,0x23,0xcd,0xce,0x02,0xb8,0x4c,0x01,0xbf,0x2e,0xea,0x1e,0x52,0x3e,0xc5,0xfd,0x37,0x07,0x2b,0x0f,0x14,0xaf,0xfd,0x26,0xdc,0xe4,0xf8,0x1a,0x0b,0xff,0x65,0x02,0x00,0x35,0xaf,0x33,0xd5,0x30,0x62,0x11,0x04,0xe2,0xe3,0xda,0x39,0x3b,0x2e,0x1f,0x47,0x55,0x39,0x0c,0xf8,0x22,0x1e,0x2d,0xce,0x75,0x07,0x02,0x0a,0xfa,0x43,0x58,0x15,0xcb,0xf9,0x3f,0xcb,0xdc,0xe0,0xf0,0x04,0x46,0xbc,0xca,0x0f,0xf9,0x04,0xe7,0x25,0x15,0xb8,0xe1,0xd8,0x14,0x24,0x49,0x0e,0x2c,0xe1,0x98,0x1c,0xdb,0xfe,0x34,0xe8,0xe7,0xea,0x16,0x0f,0x00,0x49,0x7f,0x34,0x41,0xe3,0x0b,0x0e,0x49,0x63,0x45,0xf3,0xe8,0xe1,0xcc,0xcc,0xbd,0x49,0x07,0xcc,0xee,0xf4,0x53,0x02,0x5e,0x23,0x31,0xe0,0xf8,0xfb,0xf5,0xe1,0xeb,0xd7,0xe8,0x02,0x2c,0x30,0xcd,0x27,0x31,0xcb,0xf0,0xe6,0x03,0xf9,0x67,0xee,0xd8,0x36,0xb9,0x02,0x4c,0xdf,0xae,0xd0,0xfc,0xf8,0xc5,0x50,0xde,0x46,0x00,0xf9,0xdd,0xc5,0x68,0x12,0xfc,0xe2,0xff,0xee,0xe4,0xf2,0xec,0xf9,0x77,0xc7,0x7f,0x2a,0x1e,0xf2,0xd0,0x45,0x9b,0x61,0xff,0x33,0xdd,0x20,0xaf,0xed,0x6a,0x03,0x1a,0xe2,0x5a,0x08,0x07,0x50,0xc6,0xd8,0x1f,0x02,0xc5,0xe6,0xe4,0xb3,0xfe,0x0f,0x1f,0xe0,0x02,0xf5,0xd1,0x1e,0xfb,0xa4,0x07,0x1a,0xcb,0x34,0xcf,0xf6,0x16,0x38,0x1b,0x19,0x2e,0x2d,0xe7,0xc5,0xca,0xe3,0x19,0x10,0x03,0xdc,0xd1,0xfd,0x35,0x0e,0x0c,0xb0,0xe2,0x5a,0xdd,0xf3,0x81,0xee,0xe0,0x18,0xea,0xe5,0x42,0x6f,0x07,0xf9,0xa2,0x6e,0xd4,0x36,0x14,0x49,0xd0,0x4f,0x0b,0xe6,0xd6,0xbf,0x0b,0xea,0x13,0x1a,0xc6,0x08,0x1c,0x1d,0xb3,0xfe,0x0a,0xe7,0x23,0xe6,0xd0,0xc7,0xc9,0xe7,0xf3,0x43,0x1b,0x02,0x66,0xee,0x02,0x5b,0xf3,0x31,0x0a,0x5b,0xc6,0xef,0xdb,0xd5,0x35,0xec,0xf8,0x3a,0xb5,0xf9,0x25,0xfc,0x40,0xa3,0x24,0x0f,0xfb,0xd4,0x13,0xf6,0xee,0xb2,0x2f,0xef,0x8b,0xf5,0x28,0x69,0xef,0xc4,0xdb,0x03,0xfe,0xe8,0x00,0x01,0x3e,0x1b,0x2a,0x3f,0x2a,0x11,0x0b,0x03,0xfa,0xdc,0xef,0x1d,0x47,0xd1,0xfe,0x23,0x14,0x0b,0x0e,0x2c,0xd5,0x4d,0x0e,0xcc,0xd0,0xed,0x2e,0x1d,0x0e,0x11,0xfa,0xfb,0xc4,0xea,0x33,0x02,0x36,0x1e,0xd4,0xc5,0x0c,0xdf,0xd8,0x25,0xc3,0xfa,0xcc,0x2c,0x39,0xc0,0xea,0xee,0x06,0xda,0x27,0x31,0x1e,0x19,0xff,0x00,0x0c,0xf5,0x12,0xbe,0x06,0xd1,0x5d,0x13,0xe6,0xcc,0xc9,0xf9,0x6c,0xf7,0xe7,0x57,0xcc,0x03,0xd8,0x3a,0xb4,0x7f,0x1b,0xf7,0xd3,0x1f,0xfe,0xcc,0xeb,0xf6,0x34,0x12,0xd0,0xcd,0x4b,0xd8,0xeb,0x11,0x0d,0xfd,0x21,0xf9,0xd2,0x90,0x25,0x03,0xe8,0x01,0x1a,0x0c,0x22,0x29,0x5e,0xdd,0xf0,0xc4,0x3e,0xe1,0xaf,0x09,0x1c,0x03,0x4a,0x1e,0x27,0x17,0xe9,0x35,0xe4,0xfb,0xe9,0x11,0xc6,0xcf,0x02,0xb8,0x35,0x4d,0x5f,0xe2,0xd9,0x13,0xff,0x5a,0x14,0x15,0x0f,0xd3,0xca,0xdc,0xf9,0x21,0x1d,0x48,0xe4,0x40,0x20,0xda,0xce,0xf0,0x38,0xfe,0xc9,0x08,0xdf,0x13,0x16,0x27,0xfe,0xb1,0xf0,0xde,0xa1,0x1c,0xd9,0x04,0xf2,0xe0,0xf7,0xe9,0xd9,0x30,0x1b,0x01,0xde,0xc4,0xf8,0xe2,0xd2,0x13,0xf5,0x47,0x07,0xec,0x57,0xe7,0xd2,0xf6,0xe3,0xb5,0xfc,0xbc,0x00,0x36,0xef,0x7f,0x27,0x43,0xc8,0xb1,0x3a,0xed,0xd8,0xf0,0x1b,0x2e,0xe4,0x34,0x4c,0xfd,0xf0,0x0e,0x48,0xd9,0x18,0x26,0x2d,0x04,0xbd,0xad,0xd7,0xbf,0x08,0xe4,0x1e,0x0c,0xff,0x6b,0x39,0xe9,0x25,0x25,0xf6,0xf2,0xe2,0x00,0x1f,0xce,0x53,0xf6,0x02,0xf5,0xd2,0x0b,0xf9,0x19,0xfb,0x10,0xfa,0xdc,0xd7,0xfa,0xf9,0x0e,0xf8,0xdc,0x05,0x0a,0x20,0x12,0x12,0xf8,0x1b,0x39,0x36,0x0b,0xc5,0xf9,0x12,0x01,0xb0,0xa3,0xd3,0xcc,0x03,0xef,0x3e,0x10,0x28,0x35,0x14,0x34,0x17,0x10,0xe5,0x59,0x2b,0xfb,0xcb,0xe8,0x06,0xe6,0xf9,0xd8,0xd2,0xf9,0xa0,0xe6,0x99,0x16,0xf5,0x59,0x47,0xbd,0x3c,0xd6,0xda,0x02,0xf9,0x7f,0xe0,0xc6,0xfe,0xe4,0x11,0xc8,0x0b,0x19,0xeb,0x27,0x0a,0x1e,0xdd,0x1a,0x06,0x0c,0x0a,0x10,0xfa,0x36,0x1e,0xbe,0xb8,0x9b,0x16,0x0f,0xcc,0x0c,0x00,0x41,0x1d,0x44,0x1a,0x10,0xf4,0xff,0x51,0xfc,0x23,0x37,0xfd,0xe0,0x20,0x2a,0xe5,0x2b,0x4e,0xf6,0x09,0x3f,0x1f,0xeb,0x0b,0xe5,0xe3,0xcd,0xd5,0xb3,0x15,0x39,0x22,0x95,0xd7,0x32,0xb2,0xcc,0x19,0xe2,0x28,0xd2,0x55,0xd7,0x41,0x81,0x44,0x0c,0xfa,0x22,0xf5,0xd9,0xdd,0xe9,0xd9,0x1b,0x17,0x79,0x96,0x24,0x04,0x16,0x19,0x19,0xd2,0x0b,0xde,0xce,0xbb,0xc9,0xc2,0x05,0x20,0x20,0x0b,0xce,0xe6,0xe4,0x0c,0xdd,0x06,0xd1,0x18,0x0b,0xfe,0xf3,0xe6,0x08,0xf6,0xeb,0x92,0x09,0xd4,0x01,0x14,0x54,0x4c,0x4b,0x0f,0x27,0x21,0x32,0xea,0xb4,0xc3,0x11,0xcc,0xc9,0xf9,0x19,0xd3,0x6a,0x09,0x2b,0xe2,0xf7,0x0f,0x09,0x84,0xc8,0x64,0xb1,0xdb,0xf7,0x51,0x1e,0xe5,0x6a,0xdf,0x1e,0xf4,0xad,0x0f,0xb6,0x00,0xea,0xde,0x12,0x7b,0xab,0xdd,0x39,0x19,0xf2,0x90,0x30,0x1b,0xe4,0x3d,0x39,0x3b,0x3b,0x08,0x0a,0xe6,0xd0,0x47,0x01,0xcf,0xf7,0x04,0xd7,0x22,0x9f,0xb9,0x34,0xdd,0x81,0x33,0x16,0xda,0x18,0x2e,0x2d,0xec,0x1b,0xf3,0xf2,0xfe,0xd4,0x00,0xf9,0xc1,0x4f,0xd7,0xff,0xfe,0xa4,0x1a,0x05,0x19,0xfb,0xfc,0x04,0x15,0xff,0xf9,0xe9,0x12,0xfe,0x02,0x0e,0x0f,0x06,0x2f,0xc1,0xe7,0xbb,0xbe,0xbf,0xd7,0xfa,0xff,0xd9,0xd9,0xf9,0xfa,0xfd,0xf9,0xcd,0x09,0xe4,0xfc,0xf2,0x2a,0x23,0x20,0xf6,0xf2,0xb2,0x55,0xe5,0xeb,0x29,0xf3,0xef,0x17,0x08,0xf9,0x0a,0x20,0xfe,0x05,0x3a,0x43,0x1b,0xe0,0x2b,0x23,0x00,0x16,0xf4,0x2d,0x31,0x00,0x0e,0xf7,0x31,0x39,0x39,0x39,0xef,0x14,0x08,0x32,0x2e,0x37,0xf6,0xf9,0xe3,0xcb,0xef,0xa9,0xcf,0x0f,0xd8,0xea,0x97,0xfa,0xf4,0x14,0x1d,0xd5,0xd9,0xef,0xda,0x38,0xed,0x0d,0xf9,0x2d,0xd7,0xf5,0xd8,0x2b,0xd4,0x08,0xe2,0x32,0xfa,0x4a,0x7f,0x2a,0x3f,0xe1,0x19,0xd9,0xef,0xc0,0x02,0x3a,0x25,0x2b,0xe8,0xc1,0xa6,0x30,0x06,0xc7,0x22,0xf4,0x07,0xea,0x19,0x1c,0x0c,0x16,0xe1,0x30,0x43,0x1e,0xf2,0xfb,0xe2,0xed,0x4d,0x49,0xb9,0xb9,0x9d,0xd2,0x27,0xf7,0xfb,0x20,0xba,0x19,0xdb,0x22,0xe6,0x1f,0x2b,0xf2,0x35,0x2f,0xd2,0x05,0xd3,0x27,0xef,0x12,0xe5,0x1b,0xdd,0x0e,0xdf,0xd6,0xd0,0xf6,0xf8,0xe4,0xc6,0xd0,0x62,0x16,0xd7,0xc9,0x1e,0x17,0xc9,0x04,0x30,0xd7,0x04,0x0e,0x02,0xf1,0x06,0x09,0x01,0x0d,0x3c,0xed,0x05,0x0b,0xaf,0xca,0x04,0x09,0xe1,0x19,0x06,0x36,0x19,0xe0,0xe8,0x06,0xcb,0xc4,0xf2,0x40,0x08,0xba,0x4e,0xfa,0x93,0xd6,0x9d,0x05,0x24,0xa4,0x04,0x50,0x1c,0xe0,0x54,0x23,0xd6,0xbc,0x66,0xc7,0x57,0x71,0xfb,0x59,0x1e,0x59,0x0d,0xec,0xd3,0xe6,0x0a,0x01,0x57,0xb5,0x30,0xe4,0xd8,0x40,0x1a,0x39,0xd8,0x50,0xf3,0xe6,0x12,0x20,0xea,0x4b,0xf9,0x2a,0x0a,0xfc,0x29,0xe1,0xa1,0x4d,0x2b,0x6e,0x19,0x22,0x46,0x1a,0xc4,0xe5,0xf6,0xce,0x43,0xed,0x2e,0xe1,0xe0,0x2a,0x41,0xd4,0xb4,0xef,0xe1,0x13,0x2c,0x36,0xd4,0xef,0xdc,0x46,0x30,0x4a,0x03,0xec,0x2a,0xdc,0xaa,0xc6,0x64,0x4d,0xf9,0xa1,0x15,0xbb,0x1f,0x93,0x01,0x17,0x07,0xf7,0xab,0x81,0x65,0x23,0xf6,0x58,0x0b,0x3e,0x28,0xc7,0x92,0x18,0x32,0x4e,0xec,0xf1,0x20,0xe5,0xb8,0xae,0xff,0x5d,0xd4,0x57,0x59,0x46,0xca,0x15,0x42,0xe5,0x6f,0x02,0x40,0xc2,0xd1,0xe1,0xc7,0xdc,0x00,0x00,0xed,0xaf,0xea,0x2f,0xc7,0xdb,0x37,0xcd,0x1a,0x05,0xd1,0xe9,0xf5,0x0a,0xd1,0x11,0x6a,0x2a,0x30,0x1e,0xc8,0x5c,0xab,0x1e,0x6c,0xd1,0x7a,0x22,0xfb,0xea,0x58,0x08,0x1c,0x7f,0x11,0xe8,0xdc,0xc6,0xb8,0x22,0x98,0x17,0xc0,0xd9,0xb3,0x07,0x02,0x57,0xe0,0xf4,0x1b,0xa9,0xfa,0x39,0xf4,0xef,0x23,0xa9,0x2d,0x4e,0x20,0xb9,0x0b,0xda,0x38,0xbb,0x99,0xf7,0x18,0xd7,0xd4,0x6a,0x1d,0x53,0x89,0x2c,0xa7,0xcb,0xf1,0x04,0xd9,0x65,0xfb,0x64,0x18,0x08,0xfc,0xb5,0x1e,0x1b,0xda,0x15,0xb7,0xe2,0x18,0x2f,0x01,0x22,0xc8,0x20,0x3e,0x5c,0x8e,0x1f,0xea,0xcd,0x4a,0x3b,0xe3,0x74,0x7b,0x04,0x93,0xe1,0x20,0xf1,0x3a,0xe5,0xe8,0xf5,0xa6,0x16,0x60,0xde,0x27,0xe5,0xed,0xf9,0xbb,0x19,0x20,0xc6,0x0f,0x7c,0x23,0xd2,0xe5,0x0f,0x03,0xd9,0xda,0xf2,0xdc,0xde,0xcc,0x26,0x0b,0x27,0xdf,0x19,0x05,0xff,0x49,0xc9,0x10,0x28,0x0b,0xdd,0xdd,0x02,0x01,0xff,0xbe,0xd4,0x34,0x09,0x0a,0xd8,0xe3,0x00,0xc6,0xf6,0x0a,0x1f,0xee,0xd9,0xe5,0x2c,0x43,0xe5,0x14,0xec,0x05,0x9c,0x0a,0xd3,0xfc,0x0a,0xd7,0x26,0x3e,0x24,0xda,0xd0,0xe2,0x4f,0x0c,0xd8,0xb7,0x60,0x9e,0xf8,0xf9,0xe5,0x4a,0xd0,0xd1,0x69,0x00,0x9d,0xb9,0xb9,0x28,0xec,0xd9,0x1c,0x19,0xda,0x71,0xab,0x33,0x7e,0x41,0x05,0xeb,0x03,0x0c,0x5c,0xf7,0x14,0xa1,0xd5,0x7f,0xe6,0xd2,0x2b,0x5f,0xfe,0xc0,0xc7,0xf6,0xe9,0xdc,0xf8,0x18,0xd6,0x62,0xe2,0xd6,0x2d,0xcc,0xd7,0xc3,0x7f,0xf5,0xd1,0x0c,0xee,0x57,0xde,0xbd,0x09,0xff,0xcc,0xb0,0xc6,0xfd,0xad,0xf8,0x4a,0xf8,0xf4,0xe2,0xd4,0x73,0x39,0x45,0xf4,0x17,0x11,0xf4,0x03,0xfd,0x3b,0x02,0xf9,0x15,0xde,0x9b,0xeb,0xe6,0xeb,0xdd,0xe1,0x4a,0x17,0xd7,0x0b,0x2b,0xe3,0x08,0xfc,0x04,0x36,0xfe,0x55,0xa9,0x16,0x0f,0x18,0xfb,0x0a,0xf6,0x07,0x3d,0xec,0x1b,0x19,0xfa,0xbe,0xf3,0x2d,0x36,0x01,0x9a,0x09,0x33,0xc2,0xe8,0xc6,0x28,0xec,0x32,0xac,0xde,0x1c,0xbe,0x29,0xcd,0xde,0x2d,0x2a,0x43,0xe2,0x3f,0xe7,0xc9,0xf1,0xf1,0xcf,0x32,0x00,0x0b,0xea,0x39,0x27,0xeb,0xd8,0xef,0x06,0x32,0xd6,0xcc,0x08,0xe6,0xe1,0xe8,0xc4,0x11,0xe7,0x0c,0x0d,0x1d,0xe0,0x0b,0xe0,0x1f,0x12,0xf3,0x47,0xf5,0xc2,0x22,0xd0,0xea,0x0f,0xbd,0x76,0xdf,0x31,0x1e,0x00,0xca,0x26,0x5c,0xc1,0x1f,0x1b,0x34,0x08,0x22,0x15,0x00,0x41,0x2b,0xb8,0xf6,0x42,0xf9,0x2b,0xee,0xcb,0x03,0x6f,0x1d,0xc2,0xd5,0x0c,0xe0,0x28,0xc1,0x26,0xc1,0x2a,0x4a,0xc9,0x35,0xfe,0x09,0xe2,0xdf,0xff,0xe6,0x2a,0x08,0xde,0x42,0xf1,0x1b,0x2b,0x2a,0x19,0xc0,0x23,0x08,0x10,0xbd,0xe1,0x88,0x16,0xee,0xfa,0x21,0xce,0x40,0xd0,0xc3,0xf2,0x46,0xd5,0x05,0x13,0xed,0x0b,0x00,0x67,0x76,0xa6,0x67,0xfc,0x64,0x10,0x23,0xdf,0xf7,0x11,0x36,0x11,0x0c,0x2e,0xf5,0xd7,0x3c,0xf6,0x49,0xdd,0x58,0x6b,0x11,0x7f,0x29,0x7c,0xbf,0xe3,0x3d,0x27,0xff,0xbb,0x1f,0x00,0xbb,0xff,0xdd,0xdf,0x0b,0x7f,0x0c,0x0d,0x44,0xfe,0x67,0x39,0xec,0xb7,0x53,0x54,0xee,0xcc,0xde,0x39,0xe9,0x14,0xfe,0x69,0x3c,0xc0,0xc0,0x33,0x26,0xf6,0x17,0x11,0xcc,0xcd,0x66,0xdd,0xdf,0x3f,0x15,0xf3,0x02,0x44,0x29,0x1d,0x2c,0xa1,0xd0,0xc6,0x03,0x00,0x0e,0x66,0x39,0x13,0x32,0x68,0xe5,0x30,0x01,0xfd,0x56,0xce,0xfd,0x08,0x01,0x18,0x1b,0x20,0x08,0x11,0x4c,0xb2,0x32,0x01,0xda,0x0a,0x00,0x07,0xbd,0x2c,0xdf,0xe6,0x35,0xc7,0x22,0xbd,0xe7,0x1c,0xec,0xc7,0xe3,0x56,0x18,0xd5,0xfc,0xe4,0xe4,0xde,0x45,0x1f,0x42,0x00,0x22,0xf5,0xf8,0x9a,0x64,0x5c,0x16,0xf2,0xe2,0xe4,0x22,0xf1,0x23,0x0a,0x00,0x31,0x45,0x21,0xb8,0x95,0x1b,0xdb,0x42,0xf3,0x4c,0xa7,0xc8,0x16,0xe2,0xf6,0xfc,0xfa,0xe6,0xf7,0xd2,0xe8,0x0f,0xcd,0xe8,0xff,0x02,0x09,0xec,0xe7,0xf3,0xe7,0xc1,0xbd,0xf6,0xf7,0xe0,0xbd,0x33,0xf1,0xfa,0xc4,0x16,0x3e,0x38,0x1c,0x06,0x11,0xef,0xd5,0x37,0xd5,0x0a,0x29,0xd2,0x06,0x22,0x3d,0x0d,0x08,0x44,0x1e,0x10,0x14,0x0f,0xd4,0x0e,0x28,0xec,0x41,0x0f,0xdc,0xf0,0xec,0x0d,0x08,0xe8,0xb0,0x62,0x0e,0x25,0x00,0x1a,0x00,0x24,0xcc,0xd7,0xfb,0xe6,0x22,0xfe,0xd0,0x1c,0xde,0xf3,0xf5,0xf6,0x14,0xda,0xe3,0xfb,0x06,0xe4,0x0b,0x1d,0x21,0x21,0x22,0x3d,0xe4,0x15,0xf5,0x34,0x29,0xca,0x1a,0xeb,0x0b,0xe2,0x1b,0xeb,0x21,0xd9,0x0a,0x1c,0xf7,0x12,0xfd,0xe8,0xcb,0x15,0xe1,0xd3,0x81,0x02,0x56,0xe8,0xd4,0x06,0xd3,0xf1,0xf7,0x09,0xf2,0xd6,0xb8,0x12,0x43,0x9b,0x0d,0xf3,0x04,0x16,0xca,0xaf,0xf8,0x44,0x23,0x35,0xf8,0xe8,0xea,0x3d,0x00,0x07,0xf7,0xe5,0xed,0xd4,0xf7,0xf8,0x13,0x0f,0x2f,0x0e,0xd8,0x14,0xe7,0x0d,0xd6,0x2f,0x3d,0x37,0xe8,0xec,0xe8,0xb2,0x0e,0xf5,0x24,0xe0,0x07,0x08,0xe8,0x18,0x01,0x10,0x51,0x23,0xde,0xe8,0xf9,0x02,0x12,0x69,0x05,0x96,0xdd,0xda,0xdf,0xe2,0x1e,0xc4,0xd3,0xf1,0xe0,0xd9,0x7f,0x23,0x07,0xf2,0x14,0x16,0x28,0x3d,0x28,0xff,0x01,0x19,0xef,0x32,0xf2,0xd8,0xde,0x30,0xd3,0x08,0x2f,0xf2,0xd6,0x2f,0xdc,0xfa,0xef,0x05,0x18,0xcc,0xf1,0x09,0x43,0x0f,0x38,0xfe,0xe3,0xd5,0xec,0x07,0x11,0x0b,0x1c,0xed,0x07,0x1d,0xdf,0x07,0x4d,0xc9,0x21,0xf7,0xad,0x4f,0x05,0x20,0x0f,0x25,0xe5,0xee,0xf4,0x1b,0xe4,0x27,0x5a,0xd0,0x09,0xe0,0xe5,0xfd,0xb3,0xf8,0x02,0x47,0xad,0xf7,0xd2,0x55,0x28,0x26,0xd5,0x3a,0x12,0xd7,0xd0,0x02,0x00,0x51,0x81,0xec,0xe5,0xc4,0xe4,0xf8,0x2f,0x3c,0xc9,0xf7,0x2b,0xf9,0xed,0x30,0xf1,0x6b,0x06,0x47,0xee,0xbc,0x27,0xc5,0x0e,0x1e,0xf9,0x6c,0x14,0xf6,0xee,0x00,0xd1,0xde,0x27,0xf7,0x17,0xec,0xee,0x17,0xfc,0xe8,0xdf,0xd0,0xf6,0xe6,0x17,0x0d,0x09,0xf5,0xc5,0xce,0xe5,0xd6,0xc5,0xf3,0x53,0xff,0xd4,0x13,0xb4,0x0b,0xd4,0xec,0xd4,0x5d,0x11,0xe6,0xd8,0x1b,0xe8,0xda,0xab,0xa3,0xbb,0x51,0x1d,0xf8,0x1e,0xd2,0x13,0xca,0x01,0xea,0xcc,0xfc,0xe8,0x0d,0xed,0xa6,0x16,0x03,0x2a,0xf2,0xe1,0x19,0x15,0xe9,0x0a,0x0d,0xe7,0x1e,0x20,0x22,0xf7,0xd2,0x5f,0x17,0x41,0x07,0x57,0xdc,0xf0,0xe9,0xfe,0xbb,0xef,0x0e,0x26,0x81,0x25,0x94,0x95,0xff,0x0f,0xe5,0xfe,0xe2,0xef,0xf6,0x02,0xb2,0x10,0xc8,0x4e,0x6f,0xe0,0xec,0xf9,0x5c,0x47,0xe7,0xa6,0x45,0xd7,0xfb,0xfb,0xc9,0xf7,0x1a,0xd3,0x17,0x06,0xfd,0xcd,0xf9,0x02,0xf6,0xed,0xa7,0x15,0xea,0xf2,0x2c,0xf1,0xf4,0x0c,0x20,0xf7,0x38,0xae,0x09,0xf8,0x0c,0x30,0xe7,0x45,0x38,0x09,0x16,0xf2,0x15,0x24,0xa3,0x0c,0x13,0x42,0x0a,0xeb,0xfd,0xf1,0x0f,0xdd,0xdf,0xc7,0xe2,0xb4,0x08,0x46,0x6e,0xd8,0x0a,0xeb,0xf5,0x1e,0xf5,0x38,0x04,0x20,0x19,0xdd,0xf6,0xd5,0xfb,0x8a,0xc8,0x1d,0xd9,0xa5,0xdf,0xf3,0xf5,0xcc,0xc5,0x11,0xba,0xa1,0x10,0x36,0xe4,0xf1,0xe1,0xd2,0x1b,0x28,0x93,0xd2,0x50,0x15,0x6c,0x10,0x2e,0x5a,0x12,0xc4,0xe9,0x2c,0xf6,0xff,0xc4,0x3f,0x10,0xc6,0xd1,0x07,0x0a,0x15,0xf7,0x15,0xf9,0x07,0xb6,0x16,0xd8,0x02,0xe9,0x45,0xd0,0x30,0xbf,0x1f,0x39,0x9f,0xda,0xf2,0x14,0xe9,0xe9,0x1b,0xf8,0x60,0xc7,0xce,0xe9,0xce,0x3d,0x14,0xc0,0xad,0xd2,0xa3,0x2c,0x4d,0xd6,0xf6,0xcc,0xf8,0x11,0x2d,0x28,0x26,0x01,0xdd,0xcd,0x7f,0xc9,0xfe,0xf0,0xf6,0xff,0x0d,0x4a,0xd5,0x1d,0x2a,0x14,0xe4,0xda,0xa3,0xdc,0xe0,0xf8,0xe7,0xd1,0xee,0x2d,0x3a,0x09,0xbe,0x52,0x1b,0xfa,0x45,0xfb,0x2a,0xae,0x1f,0x35,0x1d,0xf7,0x41,0x08,0xe7,0x1d,0x08,0xd9,0x04,0xe0,0xe3,0x1f,0xfb,0xe8,0x22,0xfa,0x03,0xc4,0x28,0xa5,0xee,0x26,0x4c,0x21,0x36,0xea,0x2c,0x28,0xee,0x1a,0x0a,0xd4,0xea,0xdc,0x36,0x1d,0xfe,0xe8,0xf7,0xcd,0xf5,0xbf,0x0b,0xba,0xe6,0xcb,0xd7,0x13,0xee,0xff,0xe8,0xef,0xf3,0x0e,0x0d,0xfd,0xf8,0xd5,0x1a,0x2a,0x05,0xf6,0x1f,0xa4,0xde,0x02,0x36,0xfb,0xbe,0x04,0x23,0xe7,0x24,0xca,0x11,0x50,0x11,0x18,0x65,0x11,0xdb,0xdb,0x5c,0xf6,0xe0,0xd3,0xd3,0x07,0x0d,0x04,0x01,0x31,0x10,0x06,0xf8,0xfa,0xef,0xbd,0x29,0x05,0xea,0xe0,0xef,0x20,0x10,0x51,0xd4,0x43,0x05,0x48,0x2a,0xfd,0x81,0xfa,0x2f,0x23,0xfb,0x0f,0xd0,0x04,0xee,0xbf,0x0a,0xf0,0x16,0xf5,0x18,0xf3,0xee,0xc8,0xdc,0x20,0x12,0x40,0xba,0x1a,0xf3,0xfe,0x3d,0xe2,0xdc,0xdf,0xec,0x00,0xfc,0x08,0x0e,0x0e,0xc4,0x24,0xc4,0x03,0x24,0x3f,0x11,0x60,0xcd,0xd0,0xbf,0xfa,0xda,0xac,0xe9,0x08,0xed,0x0d,0x19,0xd8,0x3b,0xe1,0xfe,0x36,0x32,0x16,0xf3,0x26,0xd7,0x2f,0x12,0x08,0xd9,0xf8,0xf6,0x0a,0x11,0xbe,0xfd,0xfd,0xdd,0xf8,0xc9,0x9b,0x6e,0xfa,0xe8,0x04,0x14,0x36,0x0f,0xcf,0xf7,0xf3,0x42,0x07,0x13,0xcb,0xf8,0xdb,0x1d,0x16,0x1b,0xc7,0xf7,0xbe,0x2b,0xef,0x25,0x03,0xf4,0xcf,0xd7,0xf9,0x06,0x2c,0x22,0x08,0x0a,0x14,0x16,0x1c,0x47,0xbf,0xaf,0x3c,0x26,0x3b,0xe6,0xde,0xfc,0x12,0x1f,0x11,0x01,0xc6,0x1c,0x35,0x51,0x1b,0x22,0xfd,0xfc,0x1a,0xf9,0xf8,0x18,0xc9,0xfb,0x81,0x08,0xd1,0xf2,0xc7,0x2c,0x2b,0x1f,0xc7,0x15,0x0e,0x26,0xf1,0xfc,0xf5,0xe1,0x0e,0xf3,0xfe,0x53,0x01,0x13,0x02,0xdb,0x26,0xf1,0x03,0xfa,0x06,0xf1,0xd3,0x03,0xde,0xe6,0x28,0xb6,0x1d,0xed,0xfa,0xf6,0xfa,0xcc,0xea,0x13,0xe6,0xe5,0x0c,0x2e,0xfb,0xf3,0x0e,0x25,0x49,0x08,0x08,0x08,0x2d,0xc9,0xe8,0x19,0x0b,0xe4,0x27,0xec,0xdd,0x14,0x15,0x1c,0x2a,0xed,0xe0,0x26,0x00,0x45,0x15,0x2a,0x30,0xeb,0x31,0xf0,0x01,0x16,0xcf,0x1d,0xe1,0x16,0x0e,0x1d,0xfb,0xf1,0x3f,0x07,0x1f,0x26,0x13,0xf9,0x81,0xfe,0xef,0xf5,0x1b,0x08,0x02,0xd8,0x42,0xe7,0xbd,0x0f,0x25,0x5a,0x18,0x0d,0x00,0x03,0x14,0xd7,0x3b,0x36,0xe3,0x42,0x17,0xfe,0x11,0xd5,0x02,0x11,0xb5,0x1e,0x14,0x19,0xf8,0x07,0x34,0xc2,0xd7,0xd7,0xe3,0x27,0x12,0xcc,0xd1,0xef,0x13,0xdb,0xf7,0x06,0xf9,0x17,0x0c,0xeb,0x5d,0x3c,0x1b,0x0b,0x3e,0x28,0x01,0x1e,0x20,0xcd,0xf7,0xcf,0xd0,0x39,0xd3,0xd7,0x00,0xea,0xda,0xe8,0x2c,0xf1,0xf8,0x81,0xf8,0xc4,0x1c,0xeb,0x2a,0xbf,0xd9,0xc0,0xed,0xe1,0x01,0x04,0xab,0xdd,0xf3,0x1a,0xe4,0x3b,0xdd,0x05,0x3c,0xf5,0xf9,0x19,0x13,0xae,0xcc,0xcf,0x45,0xd4,0x21,0x0c,0xa7,0xa9,0x46,0xe1,0xcf,0x60,0x28,0xe6,0xf7,0xe9,0x45,0xec,0x10,0xc5,0x43,0xea,0x10,0x08,0x44,0xd9,0xe8,0xe4,0xff,0x34,0x04,0xcb,0xc7,0x05,0x1c,0x1c,0xd5,0x0e,0x0a,0xf3,0x06,0xd4,0xe4,0x50,0x0e,0x2c,0xfe,0x4b,0x91,0x2e,0xe8,0x34,0xf9,0x16,0xe4,0xf2,0xfa,0x4c,0x00,0xbf,0x09,0x08,0xe9,0x04,0xf5,0xb0,0x45,0x1b,0x1a,0xef,0x9e,0x49,0x38,0xf2,0x02,0xb6,0x01,0xb5,0xe2,0xe1,0x0b,0xab,0x33,0x7f,0x0a,0xec,0x04,0xf8,0x01,0x0e,0x35,0x4a,0xd5,0x4f,0xcb,0xd9,0xbe,0xea,0xec,0x0f,0x14,0xb3,0xfb,0x0b,0xfc,0x32,0x1c,0x0b,0xf1,0xe9,0x05,0x05,0xcb,0xe7,0x15,0xd5,0x15,0x0b,0x11,0xf0,0xd6,0xec,0x02,0x0f,0x3f,0xf0,0x29,0x19,0xd2,0xcb,0xb9,0x0b,0x4e,0x34,0x2a,0x18,0x0c,0xca,0xe4,0x00,0x23,0xec,0xfe,0x2e,0xc1,0x48,0x03,0xfd,0xe3,0xef,0x12,0x37,0xff,0xf5,0xdd,0x2a,0x03,0x12,0xec,0xed,0xe4,0x20,0x06,0x33,0xb5,0x49,0x21,0xf7,0xf8,0xe8,0x1a,0x68,0xe9,0xd3,0x5c,0x27,0xc4,0x37,0xf2,0xc7,0xff,0xd1,0x21,0x2c,0x04,0x55,0xf0,0x03,0xc7,0x24,0xe3,0xd3,0xc3,0xcf,0x2f,0x0c,0xe7,0xc1,0xc7,0x0b,0x81,0x39,0x1f,0xfd,0x28,0xf0,0xe0,0x15,0x0c,0xf2,0xfb,0x03,0x3d,0x0b,0xc7,0xea,0xfc,0xe1,0xee,0x3d,0x14,0x30,0xba,0xfc,0x28,0xfd,0x30,0x2c,0xfb,0x16,0xe9,0x3e,0xd1,0xd1,0x05,0xe6,0xc2,0xde,0x09,0xdb,0xee,0xac,0xe7,0xec,0x5f,0x21,0xe1,0x12,0x12,0xf4,0x24,0x14,0x09,0x13,0x03,0xfa,0xf5,0xe1,0xff,0x2d,0xc0,0x09,0x5a,0xcf,0xd2,0x04,0xfc,0x42,0xbd,0xe2,0x09,0xf3,0x02,0xd6,0x2b,0x17,0x21,0xf4,0xa0,0xc9,0xc4,0xf2,0x35,0x01,0xc8,0x5b,0xb5,0xe2,0x47,0x0b,0x16,0xc4,0xa6,0xfe,0xe1,0x05,0xfa,0xce,0xd0,0xf3,0x33,0x23,0x03,0xc9,0xea,0xd2,0x1a,0x04,0x16,0xd6,0xbe,0x41,0xd8,0xe1,0x18,0xae,0xc7,0xed,0x03,0xe7,0xd7,0x0b,0x17,0x0b,0xf2,0x1b,0xb8,0x10,0x19,0xd8,0xb0,0x30,0xcb,0xfa,0xfc,0xef,0xbf,0xfa,0x39,0x30,0x27,0x1e,0x24,0xd9,0x2b,0xf4,0xfe,0x07,0x14,0x1c,0x08,0xec,0xd1,0xdd,0x0f,0xd5,0x10,0xf2,0xec,0x3b,0xc0,0x41,0x0c,0x3b,0xd9,0x9e,0xd4,0x16,0xe4,0x0f,0x25,0x31,0x10,0xe1,0xcd,0xe2,0xf1,0xdf,0xe2,0x67,0xe3,0xbb,0x31,0xea,0x03,0x0d,0x1f,0xd5,0xbd,0xea,0xf3,0xca,0x13,0x03,0x07,0x0d,0x09,0x27,0xd0,0x7f,0xf9,0x5b,0x33,0x00,0xf3,0xff,0xfc,0xf7,0xb8,0x24,0x0f,0xe3,0xde,0xfb,0xf0,0x0e,0x02,0x10,0xf1,0xef,0x18,0xde,0xea,0xff,0xd1,0xe7,0x0b,0x4c,0xaf,0xf6,0xe3,0x11,0x36,0x33,0x42,0x03,0xfa,0xfe,0x41,0x0e,0x4f,0x29,0x1f,0xfa,0x15,0xd6,0x2b,0xd0,0xf8,0x03,0xf0,0xdb,0xc6,0xd7,0xf8,0x0f,0xf5,0x39,0xfc,0x07,0x0c,0xec,0xf4,0xf0,0xfc,0xb3,0x05,0xf9,0xd8,0xe1,0x29,0xdb,0x31,0x03,0xf0,0x00,0x03,0xdb,0x22,0xe0,0xfe,0xed,0xfc,0xe6,0xe9,0xfc,0x0c,0xdf,0x1a,0x2d,0x2f,0x07,0xe3,0xd4,0x06,0x10,0xfe,0xee,0x2a,0x21,0xcc,0xf6,0xf5,0xd4,0xe0,0xf1,0x01,0x02,0xf1,0x25,0xeb,0xd3,0xf6,0x32,0xe8,0xe8,0xf4,0x13,0x1c,0xa7,0xf3,0x1b,0x21,0xfd,0xe4,0x09,0xdd,0x04,0xe9,0x27,0xf2,0xed,0xee,0xea,0xef,0x11,0xda,0xf7,0xf3,0x26,0x81,0xf2,0xe2,0x0d,0x0c,0xde,0x0e,0x10,0x00,0xd3,0xf1,0xe4,0xe7,0x0c,0x23,0x00,0xfa,0x27,0xff,0x33,0xfa,0x17,0x11,0x12,0xf7,0x37,0x3a,0xd6,0xc2,0x0f,0xd5,0x0d,0x0f,0x06,0x28,0xd4,0xfc,0x2a,0x64,0xc5,0xf8,0xf1,0xc8,0xe5,0x2f,0x18,0x05,0x46,0xbe,0x12,0xc1,0x2a,0xbc,0xf8,0x26,0x61,0x2c,0xeb,0x0b,0xf3,0x29,0x38,0x4f,0xfd,0x17,0xd8,0xc2,0x0f,0xff,0xfd,0xe1,0x03,0xed,0xf1,0x20,0xfa,0xdf,0xd7,0xe6,0xca,0x13,0xcf,0xd4,0x09,0x17,0xf6,0xea,0xe3,0x02,0x21,0x27,0x08,0xca,0xe7,0xe9,0x29,0x13,0xe6,0x47,0xdf,0xfe,0xf9,0x16,0x5c,0xd6,0x33,0xce,0x0e,0x3d,0x2e,0xd4,0x01,0x11,0xc9,0xbe,0xe6,0xf2,0xd1,0xe0,0xfd,0x2e,0xe0,0xfc,0x60,0x3e,0x33,0x02,0x52,0x0f,0x0c,0xe9,0x2b,0x7f,0x25,0xff,0x0d,0xf0,0xf2,0xc0,0xf2,0xdc,0xd7,0xf1,0xf0,0xf1,0xc1,0xd9,0x0d,0x38,0x1e,0x16,0xf0,0x0c,0x02,0x0a,0x5a,0xea,0xab,0xfb,0x1e,0x0f,0xec,0xf3,0xba,0x1d,0xed,0xf3,0xe4,0xf3,0xf0,0x1e,0xcb,0x38,0x00,0xae,0xf4,0x56,0x56,0x37,0x08,0xab,0xfe,0x1d,0xef,0x25,0x06,0xdc,0x14,0xef,0x0b,0xc9,0xf8,0xf2,0x02,0xef,0x0a,0x35,0x34,0xe8,0x93,0xe8,0xf7,0xf7,0x69,0xf7,0x05,0x5b,0x0b,0x43,0xf0,0xe4,0x7f,0x16,0xeb,0x15,0xdf,0xa5,0x09,0x4d,0x31,0xea,0xf1,0x13,0xe0,0xe7,0x0f,0xdc,0x2c,0xa2,0xfc,0x0a,0x57,0x4b,0x1e,0x61,0x25,0xd2,0x39,0x0a,0x0e,0xac,0xe5,0x09,0xfe,0x76,0xe4,0xc8,0xd8,0x4d,0xa7,0xfb,0xf6,0xdc,0x04,0xfa,0x19,0x05,0x94,0xc8,0x28,0x1f,0xcc,0xfb,0xad,0x0b,0x22,0xf5,0xdb,0x26,0x13,0x0d,0x0a,0xf4,0x09,0xe1,0x0b,0x17,0x11,0x48,0x1c,0xd1,0xbb,0xe3,0xdc,0x73,0xe7,0xe0,0xed,0x35,0xe0,0x09,0x14,0xdb,0x0d,0xfb,0xb4,0xea,0x09,0xe1,0xf1,0x20,0x00,0x2d,0xd5,0xf9,0xd8,0xe3,0xf6,0xc7,0xa3,0x40,0xcc,0xdf,0x0c,0x13,0x02,0xcf,0xe3,0x27,0x19,0x00,0x2c,0xd3,0x31,0x15,0x00,0xdf,0xc6,0x26,0xde,0x79,0xd6,0x0e,0xff,0x1e,0xf3,0xdc,0x44,0xf2,0x13,0xf2,0x16,0xf8,0x17,0xb7,0xbe,0xeb,0xd6,0x1d,0xaf,0xe2,0xc5,0xa2,0x39,0x24,0xf3,0xf2,0x5b,0xe4,0x00,0x9c,0xd5,0xe9,0x1d,0x04,0xf6,0x2a,0x0d,0x06,0xf7,0x33,0xdd,0x1a,0x16,0xfa,0xae,0xe2,0xf4,0x23,0x7f,0x0b,0x40,0xe7,0x1d,0x0c,0xee,0xf7,0xe5,0xd3,0xfc,0xe0,0xff,0xda,0xd2,0x07,0xf9,0x0b,0x0f,0xde,0xce,0x20,0x0c,0x0a,0x3a,0xfe,0x0d,0x2b,0x62,0xda,0x1a,0xda,0x0b,0x21,0xff,0xe8,0xfe,0xeb,0xf4,0x19,0x20,0x2b,0x0d,0x0a,0x20,0xca,0x0f,0x3b,0xfc,0x0d,0x1b,0x7f,0xe6,0x1c,0xdd,0xb4,0x00,0x18,0x48,0xe5,0x0f,0x1e,0xfa,0x1d,0xec,0xfa,0x1a,0x03,0xea,0x10,0xe4,0xdc,0xd5,0xe2,0xec,0x1f,0xea,0xeb,0xfa,0xf0,0xff,0xe4,0xc6,0x10,0x21,0x06,0xf5,0x1f,0xe2,0x01,0x23,0x11,0x0a,0x0e,0xfe,0xf4,0x0a,0xee,0xd8,0xfb,0x0b,0x11,0xf6,0xfc,0xe2,0xd0,0xb0,0xcf,0x1d,0xd8,0xc2,0x10,0xdd,0xb9,0xca,0xef,0x16,0x08,0xe3,0x27,0xfa,0x44,0x28,0x00,0xe8,0x20,0x2b,0x49,0xed,0x20,0xf5,0xf1,0xd8,0x50,0xdd,0xf8,0x15,0xed,0x07,0x21,0xdb,0xfb,0xf2,0xff,0x00,0xf5,0xf3,0xf2,0x0f,0xe4,0xd8,0x03,0xd8,0x04,0xe4,0x05,0xc9,0x2d,0xd7,0x04,0x1e,0x22,0xea,0x13,0x0f,0xef,0xd2,0xf0,0xfd,0xe1,0xda,0xd6,0x06,0x22,0xf6,0xe9,0x2d,0xd8,0x01,0xf2,0x1f,0x3c,0xe6,0xf0,0xf0,0x14,0xce,0x0e,0xe0,0x14,0xf0,0xf3,0x2c,0x01,0xe7,0x23,0xd1,0x22,0xde,0x7f,0xcb,0xed,0xfc,0x16,0xda,0xca,0x03,0x00,0xf1,0xd9,0xe0,0xf7,0xca,0xd8,0xf6,0xf9,0x01,0x21,0x1d,0xae,0xdd,0x03,0xee,0xfd,0x03,0x09,0x03,0x09,0xd7,0xe0,0x27,0xdf,0x10,0x5a,0x10,0x26,0xe1,0xf7,0xf6,0x2b,0x0d,0xfe,0x20,0xd1,0x01,0x16,0x2e,0xc7,0x0e,0xfc,0x10,0x29,0x18,0xdf,0xfc,0x1a,0xf4,0xe1,0xf4,0xd6,0x24,0xc8,0xcc,0x16,0x3a,0xec,0x14,0x04,0x55,0xfe,0xf1,0x1a,0xf9,0x10,0xf8,0x0d,0x14,0xf5,0x2b,0x15,0x04,0x17,0xfc,0x1d,0xe3,0xe9,0xe0,0xe6,0xf8,0xfe,0xf6,0xc0,0x20,0x09,0x21,0x1e,0xe2,0x0d,0x2a,0x21,0x96,0xcc,0xfc,0xb5,0xf3,0x46,0xc7,0xee,0xe0,0x4a,0xf9,0x2e,0x1f,0x2b,0x07,0x07,0xb9,0xab,0xe0,0x08,0xf7,0x1b,0x08,0x8f,0x20,0x2c,0x1f,0xb3,0xf3,0x18,0xde,0xe5,0x0b,0x19,0xfe,0xe5,0xe7,0x2f,0xcb,0xec,0xac,0xe1,0x18,0x21,0xd4,0x0b,0xa1,0xce,0xcb,0xfd,0x14,0x2e,0x29,0x14,0x4a,0xd9,0x59,0x22,0x05,0x02,0xd8,0x19,0xf0,0xbf,0xf6,0xcd,0xf0,0xe1,0x15,0x26,0xe7,0xf6,0xa2,0x3b,0xdc,0x12,0x58,0x21,0xee,0xf8,0xe2,0xe5,0x09,0xf2,0x1f,0x0a,0xda,0xd6,0x32,0xde,0x28,0x23,0xfb,0xac,0x6f,0x13,0xe5,0xe6,0xf7,0x38,0x27,0xd7,0x02,0xdd,0x17,0xaf,0x2f,0xa8,0xfd,0xed,0x29,0xe9,0x3c,0x7f,0xef,0xfb,0x8f,0xda,0xe5,0x01,0xef,0xfd,0x12,0xed,0xc4,0x13,0xa5,0x45,0xbb,0xf7,0x0f,0xb6,0xfe,0xdd,0x04,0xd2,0x03,0x19,0x1b,0xf6,0x07,0x2c,0x14,0x0a,0x3b,0xf3,0xca,0x79,0x12,0x18,0x56,0xe9,0x3a,0xe2,0x39,0xed,0xff,0x6f,0x1b,0x13,0x37,0x3a,0x13,0xd6,0xb0,0xf9,0x31,0x5d,0xec,0x21,0xf8,0xcf,0xbe,0xf5,0x31,0xe9,0xf6,0xc0,0xf0,0x25,0xe9,0x4c,0xcf,0x0b,0xf3,0x22,0x1c,0x0b,0x05,0x7f,0xf1,0x0c,0x23,0x22,0x64,0xf7,0xc9,0x16,0x14,0x1c,0x1b,0xf6,0xe2,0x0a,0xe2,0xeb,0x3f,0x21,0x22,0x04,0x21,0xf2,0x71,0x10,0xf5,0xef,0x0b,0xd8,0xf0,0xd5,0xe4,0x1f,0x38,0x4f,0x07,0x0a,0x1e,0x2a,0x3c,0xe6,0x1d,0xf2,0x20,0x17,0x09,0xf2,0x27,0x07,0xe0,0x1e,0x8f,0x3e,0x1f,0x22,0x03,0x1a,0x2d,0xe9,0xf4,0xe6,0xe3,0xe6,0xf3,0xf9,0xc3,0x00,0xfa,0x26,0xd6,0xff,0x03,0x2a,0xca,0xd5,0x7f,0xe1,0x01,0x1c,0x10,0xa3,0xdf,0x1e,0x3f,0x24,0xfe,0x0c,0x38,0x21,0x71,0x0b,0xb0,0x08,0xc6,0xb5,0xeb,0x43,0xc0,0xe8,0x1c,0x15,0x0c,0xda,0x2d,0x0a,0xf3,0xf3,0x51,0xb8,0xea,0xf7,0xf8,0x3a,0x6f,0xe8,0x01,0xdc,0xf2,0xea,0xc3,0x1c,0xbc,0xee,0xf7,0xf3,0x34,0x4c,0x21,0x3a,0x01,0xd3,0x05,0xd2,0xd1,0xfe,0xf6,0xe7,0x24,0xd1,0x07,0x44,0x37,0xf7,0x0c,0xf5,0xa8,0x2c,0x22,0x19,0xf4,0xcc,0xdb,0x4b,0x02,0x24,0xee,0xa9,0xbc,0xad,0xf4,0x6e,0xfe,0xe8,0xd7,0xd3,0xf3,0xc2,0x30,0xe3,0x1c,0x15,0xe5,0x08,0xdb,0xf5,0xd8,0x4e,0x0d,0xe2,0xb8,0x0d,0xc5,0xe6,0x19,0x08,0xd0,0x28,0x27,0x34,0x31,0xe5,0x26,0xfe,0x1d,0x3f,0xdb,0xb0,0x19,0xe0,0xfe,0x22,0xd7,0xdf,0x2b,0x0a,0x07,0x09,0x32,0xe6,0xe6,0xee,0x1d,0xea,0xda,0x4e,0x7f,0x59,0x2a,0xd8,0xee,0x06,0x0e,0xed,0x1c,0x30,0xfe,0x2c,0x25,0xf7,0xc5,0xfb,0x48,0xe5,0xd0,0xe4,0xd0,0xe1,0x27,0xfc,0x12,0x14,0xd2,0x0d,0xb9,0x00,0xc0,0xfb,0x1b,0xd5,0x06,0xfb,0x16,0xd3,0xe4,0x28,0x1a,0x2e,0xd4,0x19,0x0e,0xf2,0x10,0xe2,0xfa,0x08,0x23,0xf4,0xfd,0x14,0xd3,0xe1,0xbe,0x1d,0x16,0x39,0x16,0x1c,0x09,0xfb,0xe4,0xe9,0xe3,0xf3,0x1a,0x16,0x05,0xe6,0xd8,0xcb,0x2e,0xd2,0x0c,0xf7,0x44,0xc5,0xe7,0xe7,0x28,0xe4,0x27,0xe7,0x23,0xe5,0xf9,0xfe,0x25,0x1a,0x13,0xc8,0xe2,0x3b,0xf3,0x37,0xe7,0xf6,0xdf,0x4c,0x26,0x36,0xf0,0x17,0x25,0x27,0x08,0x50,0xfc,0x02,0xdc,0x12,0x16,0xf9,0x24,0x81,0x00,0x26,0x14,0xd1,0xef,0x06,0xe1,0xeb,0x09,0x0a,0xd5,0x2b,0x1e,0xd5,0x0c,0xdf,0xfe,0x0d,0x0d,0x30,0xdc,0xfd,0xd8,0xde,0x2f,0x1e,0x12,0x22,0xee,0xf2,0xef,0x47,0xd4,0xd8,0x35,0x70,0xf9,0x1e,0x44,0x10,0xe8,0x42,0xfc,0xeb,0xee,0xb5,0x29,0xf7,0xfb,0xe4,0x28,0x0b,0x2e,0x27,0xda,0x23,0x29,0xed,0x2a,0x19,0xd7,0x37,0xeb,0xf9,0x09,0xfc,0x58,0xef,0xd1,0xfa,0xe9,0xe2,0xf9,0x01,0x14,0xfe,0x1c,0x1d,0x21,0x35,0x28,0x9d,0x4b,0xff,0x43,0xfe,0xe9,0xdf,0x2e,0x29,0x54,0x1a,0xd7,0xbe,0x2f,0xbb,0xbb,0xeb,0x31,0x1c,0x3e,0xf5,0xee,0x16,0x0e,0xef,0xe1,0xac,0xc7,0x0a,0xfc,0x1e,0x37,0xf5,0xca,0x02,0x54,0x2e,0xed,0xd1,0xfb,0xcc,0x4f,0x0e,0xee,0xa3,0xe8,0xdf,0x01,0x14,0xf0,0x00,0x2c,0xfe,0x0a,0x8c,0x38,0x2a,0xa7,0xfc,0xf3,0xdc,0xe4,0x4e,0xc7,0x31,0x3a,0xe4,0xdd,0x0c,0xd4,0xdd,0x59,0xea,0x06,0x06,0x49,0xe7,0x20,0xf3,0x15,0xe1,0xe9,0xb6,0xf8,0xf1,0x35,0xda,0xea,0x12,0x7f,0x20,0xec,0x91,0x2c,0xda,0xf1,0xfb,0x52,0xf2,0x16,0xe4,0x30,0x3e,0x0f,0x0b,0x40,0xfc,0x10,0xf1,0x13,0xd1,0x39,0xf0,0x11,0x22,0x3a,0xf9,0x3c,0xd7,0xd9,0x24,0x00,0x19,0x0a,0xdf,0x3a,0x0b,0xb4,0x2d,0x07,0xbc,0xe0,0x12,0xee,0xe5,0x17,0x32,0xf6,0x16,0x35,0x23,0xcf,0x6d,0x1f,0x0b,0xd5,0x00,0x35,0x05,0x38,0xc7,0x38,0x0a,0x1c,0x03,0x18,0x11,0x00,0xef,0x36,0xd6,0x9b,0xd5,0x08,0x06,0xf2,0xdb,0xf8,0xf1,0x81,0x56,0xf0,0xec,0xe0,0xf1,0xe9,0xcf,0xf3,0x6f,0xff,0x0f,0x0a,0x01,0x4a,0xe4,0x22,0xee,0xf3,0xe1,0x2e,0x05,0xeb,0xd6,0xf9,0xcb,0xe3,0x2e,0xc4,0xc9,0xfe,0x03,0x13,0xd7,0x1d,0xd4,0x34,0x1e,0x13,0xc9,0xf4,0x07,0xd5,0x56,0x2f,0x28,0x07,0xf1,0x16,0x11,0xcf,0x20,0xeb,0x13,0x27,0xe7,0x04,0xe3,0xdf,0x25,0xf1,0xf6,0xd6,0xd4,0xb2,0x50,0x11,0xdb,0x04,0xf4,0x0e,0x3f,0x6f,0x56,0x03,0x3e,0x0c,0x11,0x3f,0x12,0x24,0x39,0xec,0x0d,0x16,0x0f,0x4a,0x34,0x36,0xe0,0xd5,0x02,0xe2,0x23,0x47,0x0a,0x43,0x0c,0xd3,0x0d,0xcb,0x24,0x1f,0xe5,0xfd,0x15,0x2f,0x02,0xf7,0xcc,0xfc,0xe1,0x0e,0x26,0x2c,0xf7,0xd4,0x0b,0x10,0x14,0x36,0x3b,0x30,0x04,0x4b,0x2a,0xe7,0xc7,0xda,0xd4,0x38,0xc8,0xe2,0xae,0xde,0x0f,0x53,0xbb,0xe3,0xd7,0xd7,0xf1,0x15,0x1f,0x21,0x4e,0xdc,0x04,0xe2,0x81,0x06,0x2c,0xd1,0xd1,0x1b,0xff,0x3a,0xc1,0xd9,0x03,0xbf,0xfd,0xdb,0x4a,0x10,0x5d,0xd4,0xf5,0xf1,0xbc,0x13,0x14,0x6e,0xdd,0x19,0xc0,0xf2,0xde,0xfd,0xf3,0x0c,0x20,0xe1,0xc5,0xe4,0x3a,0x22,0x1c,0x09,0xd4,0x0b,0xdb,0xcf,0xd4,0xfc,0xda,0x19,0xc4,0xa7,0x14,0xd0,0xbd,0xd6,0xe4,0x03,0xd4,0x19,0xf3,0x21,0xe1,0x29,0xcd,0xfc,0xf9,0xf4,0xe3,0xe9,0x35,0x03,0xe1,0xb1,0x1a,0xf1,0xf6,0xe3,0x13,0xbc,0x19,0xde,0xe2,0xfa,0xa5,0x0e,0xef,0x2a,0x1c,0x18,0xe4,0xdf,0xeb,0xe8,0x12,0x02,0xea,0xbf,0xfb,0x32,0xf4,0x12,0x11,0x2c,0x17,0x1c,0xf0,0xf5,0xeb,0xe1,0x31,0x25,0xf2,0x05,0x12,0x46,0xdf,0xbc,0x00,0xf5,0xee,0x10,0xe9,0x09,0xf9,0x15,0xeb,0x00,0x1a,0x23,0x07,0xef,0x0b,0x0b,0x08,0xfc,0xfa,0xc7,0x0f,0xf7,0x0b,0x28,0x25,0x15,0x02,0x2b,0xe3,0xf8,0x1a,0x33,0x1e,0x27,0x26,0x34,0xdc,0x24,0xe7,0xc1,0x37,0x21,0xe9,0x11,0x18,0x20,0xd6,0x0e,0xde,0xd8,0x0e,0xf3,0xfe,0x24,0xd0,0xf5,0x4c,0xcd,0xd4,0xfc,0x1d,0x15,0xee,0xf5,0x1e,0x23,0xe0,0x41,0xb8,0xd8,0xd9,0x1c,0x14,0x01,0xcc,0x35,0xca,0x18,0xf1,0x31,0xf8,0xf1,0x13,0x04,0xec,0x18,0x0b,0x1e,0x59,0x01,0xff,0xd3,0xcf,0x29,0x41,0xd7,0xf2,0x2b,0x3a,0x0c,0x18,0xff,0x27,0x53,0x24,0x14,0x24,0xe5,0x10,0x7f,0x03,0x4b,0x0b,0xc4,0x07,0x4f,0xe7,0x29,0x46,0x3d,0x5d,0x0b,0x06,0x0c,0xb1,0xa9,0x23,0xf0,0x1d,0x85,0x09,0x18,0xcd,0x1b,0xc8,0xc3,0xc5,0x51,0x30,0x9c,0xda,0x48,0xed,0xe3,0x20,0x12,0xfa,0x0d,0x15,0xbc,0x02,0xe0,0xc7,0xea,0x28,0x2a,0x7f,0xab,0xed,0xaa,0x50,0x52,0x4e,0xa8,0x3d,0x3d,0x03,0xe5,0xf0,0x02,0x01,0xd9,0xa9,0x42,0x13,0xf1,0xc8,0x4e,0xfd,0x43,0x0f,0x20,0xa7,0xa7,0xbd,0x3c,0xd1,0xe7,0x1b,0xb8,0x01,0xda,0xc8,0xca,0xce,0x5f,0x4a,0xf9,0xdc,0x16,0xc7,0x4e,0xda,0xd8,0x32,0xd7,0xd1,0xd7,0x06,0xb6,0x04,0x07,0xdf,0xe9,0x00,0x21,0xae,0xcd,0x1f,0x54,0x3a,0xfb,0xc0,0x01,0xd5,0xc2,0x06,0x1a,0x0d,0x67,0xbc,0xf6,0x09,0x17,0x34,0xd1,0x09,0xdf,0x27,0xb2,0x87,0x29,0x1c,0xd3,0xe1,0xbc,0xc4,0xa5,0x48,0x24,0xf5,0xfd,0xd5,0x56,0xfa,0x03,0xbf,0x46,0x3b,0x13,0xc7,0x0d,0xbc,0xfd,0xdf,0x00,0x36,0x6e,0x86,0x77,0xe7,0xf8,0xb8,0xbe,0x00,0x44,0x00,0x15,0xdb,0xda,0x19,0xcd,0x07,0xae,0xb3,0xc6,0x1a,0x3a,0x36,0x97,0xcf,0xde,0x6c,0xd7,0xc8,0x20,0xe3,0x08,0xef,0xd6,0x1a,0x25,0x34,0xd2,0x41,0x29,0x23,0xf1,0xea,0xd3,0xcf,0xfa,0x54,0xd1,0x26,0xc6,0x33,0x45,0xdb,0x18,0x38,0x52,0x4f,0xcf,0xdc,0xe9,0xc5,0x3b,0x0f,0x17,0x0f,0xe5,0xf1,0x41,0x43,0xf3,0x25,0x3a,0xf4,0x28,0x1a,0xfe,0x12,0xad,0x25,0x42,0xe4,0x2a,0x22,0x1c,0x7f,0x39,0x83,0x11,0x23,0x0e,0xab,0x08,0x16,0x2a,0xe5,0xf4,0xf3,0x01,0xbc,0x45,0x50,0xb0,0xd7,0xb3,0xdb,0x12,0xd6,0xf6,0xe3,0xec,0xd1,0x08,0xdd,0xce,0xe8,0x11,0x09,0xe3,0x7f,0xf9,0x0d,0xff,0xc8,0xc4,0xf8,0xf1,0x08,0xd9,0xc8,0x53,0x1f,0xc2,0x31,0x6c,0x35,0xf2,0xe9,0x08,0x4a,0x1d,0x8f,0x26,0x43,0xc1,0xe0,0x13,0x36,0xe5,0x03,0x01,0xe4,0x0b,0xc9,0xfd,0xe5,0xf2,0xd5,0xfa,0x2a,0x03,0x29,0xe1,0xb9,0x48,0xbd,0xf2,0xc9,0x48,0x0f,0x30,0xf6,0xef,0x41,0xf9,0xd6,0xe1,0xfe,0x43,0x06,0x03,0xbc,0x04,0x1a,0x85,0xe2,0x2b,0xbf,0x9f,0x1c,0x24,0xf8,0xf8,0x0f,0x30,0x1a,0xe4,0x26,0xb6,0xaf,0x32,0x16,0x0d,0xc6,0xce,0xf3,0x05,0x59,0xd6,0xdd,0xc1,0x08,0xf3,0x40,0x63,0xd9,0x2b,0x2d,0x15,0xe2,0x50,0xc6,0xf4,0x3c,0xfa,0xd8,0xe6,0xf8,0x1a,0x48,0x52,0x02,0xee,0x29,0x20,0x21,0x26,0xfb,0xe1,0xf1,0x0a,0x29,0x14,0xfa,0xa0,0xed,0x4c,0xde,0xe2,0xf0,0x65,0xeb,0xc7,0xca,0x0d,0x05,0xa9,0x11,0xf1,0x02,0x11,0xe0,0x01,0x43,0x16,0xf4,0x45,0x08,0x69,0x01,0xfa,0xdb,0x2a,0xb2,0x07,0x15,0x42,0xd2,0xe9,0xb5,0x53,0x1b,0xf1,0xda,0x18,0x0d,0xea,0xf2,0x42,0xec,0x0b,0x5f,0xf0,0xce,0x0d,0xb4,0x55,0x0c,0xf7,0xc2,0x43,0xe9,0x52,0xb2,0xdc,0xe3,0x04,0x81,0xf4,0x24,0xe4,0x11,0x1a,0xff,0x08,0xe6,0x10,0xf4,0x75,0xd0,0x56,0x2c,0xf4,0xe9,0xfb,0xfc,0x1a,0xcc,0xd7,0x11,0x5e,0x06,0x13,0x5c,0x29,0x04,0xea,0x0e,0x0a,0x02,0xef,0x21,0x02,0x0c,0xe4,0x07,0x81,0xd1,0xe0,0x1a,0x44,0xd3,0xd6,0x24,0x30,0xd1,0xe2,0xff,0xa7,0x30,0xb7,0x28,0xd2,0x2a,0xc3,0x24,0x11,0x03,0x2f,0xe9,0x4b,0xe5,0xee,0x32,0xb8,0xb0,0xe4,0xa0,0xfd,0x34,0xaa,0x3c,0xd2,0x32,0x01,0x08,0xd2,0xd1,0xf7,0xd1,0xed,0x36,0x00,0x1b,0xf5,0xd7,0xb1,0x47,0x1b,0x0a,0x0b,0x39,0x3c,0x31,0x25,0x03,0xe7,0x0b,0xec,0xf3,0x8b,0xed,0xcc,0x62,0xcd,0x05,0xf9,0xd7,0xa8,0x17,0xc1,0xd8,0xa4,0x37,0x5f,0x34,0xe7,0xc5,0xed,0x4d,0xce,0xf8,0xd6,0x1a,0xff,0xab,0xd3,0x0c,0x3d,0xda,0xe6,0x23,0xcc,0x1b,0x36,0xc2,0xf3,0xf4,0xf2,0x5c,0x26,0xeb,0xc8,0x28,0xdf,0x5b,0xc7,0x59,0x1c,0x7f,0xfd,0x07,0x8a,0x09,0xd2,0xf3,0x2b,0xe3,0x47,0xe2,0x61,0xd5,0x33,0x37,0xd9,0xf4,0x5d,0xda,0xf7,0x10,0xfd,0xde,0xef,0xb6,0xcc,0xfb,0xec,0x1a,0x11,0xf1,0xc3,0xe9,0xcf,0xca,0xc7,0xee,0xf1,0xd1,0xf2,0x0b,0xca,0xdc,0xdb,0x0a,0xc7,0x28,0xe5,0x03,0xfc,0x0b,0x07,0x74,0xf1,0xbe,0x1a,0xe5,0x22,0xd7,0xf2,0x1a,0x00,0x12,0x16,0x1b,0x27,0xcd,0xdd,0xe4,0xc6,0x0c,0x26,0x2e,0x02,0x05,0x12,0x49,0x04,0xe6,0x31,0x34,0xce,0x51,0xfe,0xec,0xfe,0xda,0x1f,0x10,0xf6,0xf6,0x42,0x00,0xe7,0x10,0x16,0x07,0x7f,0xb4,0x05,0xd1,0x33,0xfc,0x09,0xe4,0x16,0x1b,0x0a,0xbb,0xa4,0x3d,0x36,0x26,0xde,0x29,0x09,0xce,0xe5,0xfb,0xed,0xfe,0xe4,0xbb,0x0c,0x15,0xe4,0x06,0x40,0xcb,0xf5,0x33,0x10,0xee,0x24,0x1f,0x62,0xef,0xcb,0x08,0xfa,0x1d,0xf4,0x37,0xc2,0x4d,0xe4,0xea,0x2a,0x05,0xf2,0x11,0xda,0x23,0x2d,0xf8,0xea,0x16,0xf0,0x2d,0x99,0xb7,0xe7,0x22,0x04,0xb8,0xe7,0x46,0x29,0x7f,0x28,0x37,0xff,0x0b,0xab,0xe3,0xe8,0xf9,0x10,0x20,0x11,0xe2,0xef,0x45,0xf8,0x5c,0x08,0x51,0x0d,0xb2,0xf3,0x12,0xd7,0xfe,0xca,0xe1,0x1d,0x04,0xcc,0x37,0x52,0xe7,0xe4,0xa8,0xaf,0xdd,0xd1,0xd9,0x06,0xff,0xd2,0x04,0x16,0xe9,0xac,0x0f,0x1c,0x05,0xec,0xef,0x45,0x00,0xfe,0xbf,0x1a,0xc6,0xca,0xc9,0xe7,0x10,0x26,0x0f,0x31,0xda,0xe9,0xdd,0xf2,0x2f,0x09,0xe7,0xf7,0x1d,0xd0,0xcb,0xc8,0xd9,0xd6,0xb7,0xef,0xcc,0x1d,0x86,0xb0,0xa8,0x1f,0xcc,0xc6,0xdf,0xf4,0x1f,0xd2,0xfc,0xfc,0x0f,0xe1,0x29,0xf9,0xa8,0x14,0x0b,0x28,0x49,0x08,0xfa,0xef,0x19,0xe8,0xe8,0x37,0xc2,0x09,0xed,0xe2,0x0b,0x0f,0x18,0x40,0xff,0xd2,0x6c,0x3a,0xd8,0x8a,0x5d,0xf5,0x5f,0xc4,0xb7,0xf4,0x1c,0xf5,0xde,0x23,0x21,0x0c,0xb7,0x27,0xcc,0x81,0xe1,0xd0,0x19,0x6b,0xc8,0x47,0xa8,0xea,0xea,0xdb,0xc5,0xb0,0xf3,0x4e,0xe8,0x27,0x3b,0x3b,0x3a,0xe7,0x98,0x09,0x31,0x14,0x36,0x1c,0x35,0x2f,0xfe,0x1f,0xf1,0xf1,0x4f,0xa6,0x25,0x29,0x34,0xfa,0xb3,0x0d,0x26,0x41,0xf4,0xd2,0xe3,0xc1,0xd8,0x3f,0xdc,0x12,0x13,0xbb,0x98,0x55,0x41,0x64,0xe0,0xc2,0xfe,0x03,0xf2,0x5a,0x27,0x3b,0x3d,0x11,0xfd,0x34,0x40,0x1b,0x13,0xe1,0x23,0xc5,0x2e,0x02,0xe0,0x16,0x21,0x27,0x65,0x0a,0x11,0xb7,0x26,0x18,0xf3,0x45,0xb6,0x07,0xed,0x19,0xc8,0xe6,0x1d,0xc1,0xfd,0x35,0x24,0xfd,0xb6,0x73,0x08,0xfb,0x15,0x1a,0xec,0xf3,0x1c,0x00,0xef,0xf9,0x0c,0x0c,0xd6,0xf4,0xc9,0x24,0xeb,0xf3,0xea,0x0e,0xeb,0xdd,0x14,0x03,0x08,0xe5,0x10,0x00,0xca,0xf3,0xcb,0xfc,0xeb,0x13,0xf1,0xf5,0x02,0x3b,0xec,0xf2,0x28,0xb2,0x0d,0xf6,0x38,0x39,0x2f,0xef,0xd6,0xf1,0xda,0x12,0x1b,0x1b,0xe6,0x16,0xcd,0x14,0x21,0x26,0xf0,0x2b,0xec,0xe1,0xdf,0xef,0xc7,0x23,0x22,0xd1,0xaa,0x1c,0xfd,0xeb,0xff,0x22,0xf4,0x21,0xf4,0x11,0xea,0x1c,0x41,0x0a,0x0e,0xc7,0x05,0xcb,0xe2,0x09,0xb3,0xe3,0xff,0x01,0x32,0x10,0xfc,0xde,0x1d,0xda,0x1d,0x00,0x08,0x1d,0xd9,0xeb,0x19,0x09,0x0d,0x81,0xf8,0x07,0xd8,0xfc,0xcf,0x12,0xc6,0x34,0x1e,0xeb,0x0b,0xfe,0x02,0xfb,0xfb,0xeb,0xe7,0x23,0xcf,0x08,0x25,0xe3,0x2e,0xd4,0xbd,0x06,0xe0,0xb7,0x1c,0xf7,0xcb,0xe7,0xde,0xf3,0xf1,0xfb,0xf2,0x32,0xe9,0x00,0xf4,0xd8,0x20,0xe2,0x2f,0x35,0xe1,0x1d,0xd2,0x06,0xdc,0xf4,0x11,0x35,0x04,0xe0,0xf6,0x07,0x14,0xcc,0xf7,0xdc,0x08,0x1c,0xc1,0xf8,0x0c,0x1f,0x9a,0x07,0x1d,0xf1,0xb5,0xc9,0x04,0x2f,0x24,0xdc,0xe8,0x0c,0x2c,0x11,0x01,0x19,0xf7,0xcf,0xe5,0xeb,0x09,0x72,0x23,0x9f,0x28,0xf4,0xf8,0x08,0xf2,0xeb,0xfb,0x09,0x3b,0x1e,0x3f,0xc6,0xdc,0x21,0x81,0x24,0xec,0xe6,0x0b,0xea,0x01,0xfb,0xd0,0xca,0x06,0x12,0x37,0xed,0x52,0x18,0xff,0xf7,0xf4,0x1e,0x03,0x14,0x16,0x43,0xf9,0x3d,0xe6,0xe9,0x1e,0xe9,0xec,0xfe,0xfa,0x21,0x64,0xf0,0x0f,0x01,0x0c,0x0d,0x38,0x15,0x23,0x3e,0xf3,0x0e,0xdc,0xf5,0xe9,0xe7,0x47,0x00,0xe3,0xdd,0xd6,0xce,0x15,0xf2,0x6f,0x41,0xeb,0x15,0xe6,0x0f,0x3c,0xf1,0x47,0x2f,0x00,0x0d,0xe3,0xb2,0xb0,0xd9,0x13,0xc1,0xc9,0xe5,0x08,0x16,0xd4,0x0c,0xd7,0x65,0x0e,0x42,0xbc,0xf1,0xfb,0x43,0xf4,0x26,0xfd,0xfb,0x2b,0xf6,0xf7,0x25,0x81,0x02,0x03,0x52,0x29,0x0d,0xea,0xf4,0xbd,0x0d,0x3d,0x1e,0x0e,0x66,0xd5,0xd1,0xda,0xc9,0xf1,0xfb,0xce,0x1e,0xee,0xd1,0xe2,0x1d,0xf9,0x23,0xec,0x38,0xf4,0x7b,0x45,0x16,0x4f,0x56,0x06,0x16,0x42,0xeb,0x24,0x04,0xed,0x10,0xc8,0x5a,0x03,0x07,0x19,0xbb,0xe6,0xf1,0xd2,0xcd,0x1b,0x45,0xd2,0x0b,0xcf,0xf4,0x0b,0x05,0xe2,0x0f,0x07,0xfb,0xb8,0xfe,0x3c,0xc0,0xf0,0xf2,0xf7,0xb5,0xfb,0xd4,0xe7,0x3a,0xe4,0xf6,0x03,0x09,0xc8,0x22,0xc6,0xdb,0xc8,0x33,0xf3,0xf9,0xf5,0x0f,0xc5,0x48,0x25,0x23,0x27,0x0b,0x0a,0x0e,0x50,0xee,0x92,0xf8,0x08,0xef,0x11,0xd8,0x00,0xf4,0x01,0x08,0x05,0x3c,0x16,0x37,0xf5,0xcd,0x28,0xb9,0x01,0xdc,0xf9,0x32,0x00,0x11,0x03,0x2e,0xc9,0xf9,0xb8,0x2a,0x23,0xc9,0x07,0x24,0xd0,0x1a,0xed,0xf7,0x0b,0x6e,0xe2,0x1d,0xca,0xf2,0xb9,0x16,0xb6,0xf2,0x20,0xda,0x1a,0xd9,0xd4,0xf6,0x20,0xcc,0xf0,0x7e,0x1c,0xe7,0xe0,0x6c,0xfe,0xfd,0xe5,0xfc,0xd1,0x44,0xed,0x0f,0xf8,0x30,0x0c,0x37,0x05,0x9d,0x11,0xf0,0xee,0xb8,0xe7,0x4d,0xea,0x33,0x81,0xb4,0x44,0x1b,0xfc,0xdc,0xe9,0x31,0x01,0xd7,0xdd,0xfa,0x10,0xdf,0x08,0x7f,0xfd,0x14,0x1f,0xeb,0xf1,0x1d,0x00,0x16,0xe7,0xf8,0xff,0x03,0x20,0xd1,0x1e,0x0c,0x0c,0x02,0xe2,0x00,0xc5,0x18,0xb0,0xf9,0xda,0x03,0xd7,0x2c,0xea,0xe2,0xd7,0x0d,0xfd,0xdd,0xe7,0x16,0xfb,0xee,0x09,0xfa,0xff,0x0e,0x0d,0x02,0xe2,0xf8,0x0a,0xea,0x08,0x04,0xee,0x06,0xcb,0xfc,0x0e,0xf1,0xeb,0x12,0x1d,0xf4,0x0c,0x05,0xd8,0xc6,0xea,0x12,0x2d,0x00,0x19,0x21,0xef,0xfb,0x31,0xf1,0xc2,0x2a,0x06,0x12,0x29,0x0a,0xf1,0xf7,0xf5,0x0f,0x05,0x45,0x32,0x31,0x1f,0x06,0x07,0xff,0x1c,0x06,0xef,0x06,0xe3,0xd7,0xf3,0xd0,0x29,0xdf,0x14,0xef,0xf2,0xde,0x0e,0xf9,0xdb,0xe4,0xfe,0xfa,0x05,0x25,0xfe,0xf3,0x13,0xc0,0x0a,0xf0,0x00,0x1e,0xe2,0x0c,0xc8,0x6a,0xeb,0x0d,0x49,0x1d,0x49,0x32,0x20,0x01,0xd8,0x0e,0xfc,0x64,0xdd,0xd8,0x21,0x08,0xf3,0xfd,0xfa,0x9c,0xaf,0x09,0xd6,0x0e,0xb8,0xeb,0xd1,0x31,0xc8,0x3e,0x04,0xed,0xea,0x38,0x16,0xd1,0x3c,0x42,0x08,0xed,0xe5,0xe0,0xea,0x05,0x59,0x16,0x03,0xf5,0xab,0xd9,0x19,0x49,0x3b,0x32,0xcb,0xfa,0x44,0xdb,0xf1,0x10,0xf4,0xee,0x10,0x1a,0xe5,0xf0,0xef,0xc6,0xee,0x24,0xe7,0x1a,0x1b,0xf8,0xf3,0x17,0xaa,0xd9,0x0f,0x0f,0x54,0xef,0xd0,0x0c,0x7d,0xeb,0xba,0xbc,0x09,0x03,0x0e,0x81,0xd8,0x42,0xc5,0xf5,0x85,0xe7,0x03,0x2b,0xe9,0x34,0xd6,0x32,0x0f,0x2c,0xe8,0xf9,0xe5,0x0a,0xc1,0xde,0x0b,0xfe,0x22,0xe1,0xbe,0xe4,0x15,0x2b,0x28,0x00,0x22,0x1c,0xe0,0x1b,0x09,0x05,0xb6,0x36,0x00,0x0a,0x05,0xfa,0xb5,0x21,0x29,0x1e,0xba,0xd2,0x10,0xf6,0xad,0x08,0x41,0x17,0x0b,0xfd,0x07,0x02,0x10,0x88,0x3c,0xee,0x8a,0x29,0x2b,0xf1,0xe2,0xf5,0x04,0xea,0x29,0xfa,0xe2,0xec,0x00,0x1d,0x11,0xe9,0x25,0x19,0x1c,0xe1,0xf5,0x07,0xef,0x25,0xae,0xbc,0xe2,0x50,0xca,0x05,0xf4,0xf8,0x01,0x43,0x0b,0xe9,0xdd,0xe2,0x04,0x83,0xfb,0xfa,0x17,0xfc,0xe0,0xf0,0x05,0xeb,0xd7,0xe9,0x17,0x05,0x17,0x10,0x1e,0xdd,0x44,0xee,0xcf,0x00,0xcf,0xe6,0xe9,0x02,0xeb,0x38,0xf4,0xc4,0x0e,0x10,0x0b,0x04,0x21,0x81,0xda,0xbc,0x40,0x03,0xc5,0x27,0x0a,0xab,0xd8,0x01,0xc7,0xeb,0xdc,0x1a,0xe6,0x22,0xd6,0x3c,0xfa,0x0d,0xde,0xfb,0xc4,0xe6,0x12,0x26,0xc3,0x40,0xb1,0x59,0x05,0x0f,0x1e,0x00,0xcc,0x9d,0x20,0x46,0xe7,0x38,0xfb,0x1e,0x11,0x1a,0x18,0x71,0xff,0x33,0x1a,0x27,0xe6,0x17,0x19,0xec,0xd9,0xd2,0xf5,0x16,0xf5,0xd0,0x00,0x1a,0x35,0xce,0xdb,0xad,0xf3,0xbb,0x24,0xf3,0x31,0x3b,0xf7,0x21,0xf9,0xd0,0x0b,0xe2,0xcd,0x93,0x09,0x67,0x56,0xd9,0xdf,0xf7,0xee,0xf2,0xce,0xe9,0xea,0x5c,0x32,0xe8,0x54,0xc2,0xce,0x01,0xe9,0x67,0x0d,0x14,0xc9,0x13,0x1d,0xd2,0xd8,0xe9,0xce,0x9c,0x08,0x00,0xdd,0xc6,0xb5,0x13,0x42,0xd5,0x06,0xaf,0x55,0xc6,0xdd,0xf1,0xc6,0xd0,0x2e,0x45,0xfe,0x21,0x55,0xc6,0xf9,0xef,0x06,0x05,0xbd,0xdc,0x81,0x01,0x19,0x2d,0xfb,0x23,0xed,0x37,0xd6,0xe4,0xfa,0xec,0x19,0xcf,0x09,0x13,0xe4,0x02,0xe8,0xd8,0xde,0x0d,0xe5,0xf2,0x05,0xf7,0xe3,0x44,0xd1,0xfd,0x38,0x0f,0x36,0x6b,0xeb,0x28,0x0d,0x14,0xbe,0xf0,0xf2,0xf8,0x0d,0xff,0xc3,0xf8,0xe9,0xf8,0x39,0xc7,0x04,0x0b,0x09,0x38,0x06,0x4a,0xdb,0xa0,0x13,0xee,0x1d,0xf6,0x32,0xeb,0x1e,0xfb,0xc8,0xde,0x1d,0x2a,0xf0,0x05,0xf7,0x20,0x08,0xb3,0xfd,0xf7,0xfb,0xc7,0xac,0x81,0x26,0xee,0x45,0xfb,0xe0,0xe2,0x4f,0x22,0xaf,0x3b,0xe5,0x1b,0xec,0x31,0x04,0xe7,0x06,0xf5,0x18,0xf7,0x34,0xf5,0x4b,0x14,0xc1,0xda,0x0e,0xe4,0x23,0xf7,0x12,0xf9,0x1c,0x0d,0x10,0xd6,0xf5,0xdc,0xff,0x26,0xe4,0x02,0x10,0x36,0x0f,0x12,0x03,0xfd,0xbb,0x03,0x02,0x0b,0x19,0x28,0x04,0xee,0xf6,0xaf,0xdf,0x51,0xb3,0xc9,0xfb,0xdc,0x10,0xe5,0xe0,0x0a,0x07,0xf0,0xe9,0xdc,0x08,0xf2,0xce,0xb8,0xdd,0xad,0x06,0xed,0x07,0xe5,0x37,0xfb,0xf3,0xec,0x4b,0xdd,0xf7,0x39,0xe9,0x62,0xf9,0x17,0x20,0x1f,0xfb,0xf1,0x0a,0x39,0x0d,0x16,0xe7,0x16,0x09,0xff,0xfd,0x39,0xfd,0xc8,0xf4,0x1d,0xe4,0xd0,0x20,0xa4,0xd5,0x41,0xdb,0x06,0xf7,0xf8,0x81,0x25,0x18,0x1a,0x19,0x08,0x20,0xff,0x00,0xad,0xd5,0x55,0xff,0xe1,0xd8,0xe7,0xef,0x39,0xf0,0x01,0xe4,0xf1,0xf7,0xf6,0xda,0x09,0x01,0x06,0xff,0x36,0xed,0xdf,0xe0,0xf1,0xd2,0xdc,0x32,0xcb,0xff,0x25,0xe3,0xe8,0xe6,0x03,0x16,0x2d,0xb4,0xf0,0x01,0x5f,0xd6,0xde,0x26,0xdb,0xdf,0x1f,0xfd,0xe3,0x12,0xca,0xf6,0x1b,0x03,0x11,0xf5,0xb4,0x13,0x01,0xd0,0x07,0xf4,0x0a,0xcf,0x31,0x46,0x04,0x68,0xce,0xf7,0x13,0xe4,0x09,0xf1,0x51,0xd7,0xce,0x13,0xbf,0x51,0xe5,0x1c,0xeb,0xfa,0x14,0x2f,0xc6,0xe3,0x03,0xe8,0x1b,0x3b,0x4f,0x3d,0xe3,0xfa,0x0f,0xf0,0x09,0x7f,0x46,0x3c,0x21,0xdb,0x08,0x45,0x73,0x2c,0x8e,0x3a,0x29,0x09,0xec,0xe1,0xea,0xf9,0xd1,0x49,0xed,0x2c,0x1d,0x25,0x40,0x55,0xf1,0xea,0x13,0xe5,0xe7,0xfe,0x4a,0x46,0x17,0xc7,0xf3,0xbc,0x00,0xe5,0x4c,0xe0,0xff,0x20,0xd7,0x18,0x21,0x3a,0x1f,0xa8,0x4f,0xd9,0x43,0x44,0x39,0x08,0x30,0x59,0x33,0x15,0xbe,0xf1,0x0d,0x11,0xf8,0x0b,0xdb,0xd5,0xb1,0x36,0xe3,0x0b,0x2e,0x22,0x30,0xe6,0x00,0x3c,0xcc,0x04,0xce,0x3c,0x10,0x27,0xf8,0xff,0x29,0x44,0x02,0xa8,0x21,0x23,0x05,0x29,0xd1,0xf5,0x02,0xe4,0x78,0xd4,0xda,0xea,0x12,0x27,0xe4,0xf4,0xfa,0x21,0xf2,0x0e,0x06,0xee,0xde,0x05,0xe4,0xfb,0x45,0xc2,0xb0,0xaa,0x29,0xd5,0x07,0x52,0xe3,0x25,0xe5,0x04,0x21,0x0d,0x91,0xdf,0xfc,0xe2,0x04,0x36,0x58,0x20,0xf7,0x16,0xf6,0x2d,0xbd,0x06,0x0f,0x16,0xda,0x1f,0x01,0xf3,0xf9,0x14,0x04,0x5f,0x49,0x20,0x15,0xbf,0x04,0xf8,0xb8,0x1e,0x29,0x0b,0x1d,0xfb,0xb9,0xd9,0xb8,0xfe,0x20,0xf4,0xfe,0xdc,0x06,0xe2,0x35,0x25,0xd5,0x81,0x19,0xf3,0xb5,0xe0,0x01,0xfa,0xe8,0x45,0xf7,0xe6,0x19,0xef,0x2c,0x45,0xe7,0xf6,0x01,0x12,0x15,0x09,0xf7,0xfa,0xef,0x63,0x06,0x22,0x01,0x0f,0xdb,0xd4,0xee,0xe7,0x10,0xd9,0x05,0x28,0xe7,0xc4,0xdc,0xd5,0xf4,0xe7,0xba,0x03,0xf0,0xeb,0xc7,0xf8,0x24,0xac,0x03,0x56,0x13,0xfc,0xff,0xe9,0x2c,0x13,0xaf,0x13,0x05,0xe6,0x19,0x26,0xef,0x13,0x17,0xf6,0x21,0xb9,0x0e,0x29,0xe6,0xcf,0x2e,0xea,0x1e,0x2c,0x1a,0x1e,0xef,0x0c,0xb7,0x19,0xe9,0x1f,0x2a,0xea,0x2c,0x00,0xc5,0x17,0x24,0x05,0xe3,0x14,0x2b,0x15,0x11,0xf2,0x05,0xf3,0xd1,0x36,0xcf,0x16,0x02,0xf6,0xf2,0x1c,0x3b,0xb8,0x02,0xe3,0xcc,0xe1,0x42,0x41,0xf9,0xfa,0xfe,0xe5,0x0e,0x38,0x47,0xfa,0x12,0xc1,0x0d,0x0e,0x60,0x13,0xf4,0x7f,0x15,0x1c,0x25,0x09,0x0c,0xd1,0x07,0x26,0x28,0xd5,0x1d,0x23,0xd7,0x28,0xcb,0x52,0x10,0x00,0x21,0x1a,0xdd,0xda,0x1a,0xfd,0xc9,0xf2,0xc1,0xf7,0x1c,0x3c,0xeb,0xad,0x28,0xe1,0xcd,0xe0,0x31,0x0b,0x13,0x16,0xb2,0xfa,0xf5,0xfd,0xf8,0x23,0x1f,0xfb,0x00,0x1a,0xae,0xd2,0xba,0x1e,0x1e,0xc4,0xca,0x42,0xf9,0xdf,0xd7,0xd5,0xef,0x45,0x1c,0x29,0xf5,0x00,0xda,0x16,0x36,0xf8,0xf2,0x11,0x7f,0xdd,0x3a,0xf3,0x2f,0x1f,0xe1,0x5c,0xf7,0xd7,0xea,0x00,0x1e,0xf0,0x05,0x11,0xe5,0xee,0xf7,0x0f,0x6c,0x0c,0xcc,0xcb,0x23,0xdc,0x05,0x40,0x1d,0x03,0x0a,0x05,0xfc,0xd5,0xb4,0xc3,0x0e,0xe9,0x37,0x2e,0xe4,0x26,0x4f,0xe6,0x32,0xb0,0xf8,0xda,0x15,0x61,0xfa,0xf4,0xe1,0x59,0xf1,0x0d,0xfe,0x0e,0xc9,0x6f,0x0f,0x14,0xe2,0x0a,0x0a,0xdb,0x0a,0xff,0x5e,0x97,0x2e,0x1e,0x14,0x1a,0xe5,0x3f,0x0b,0xee,0x0a,0xfd,0xe7,0xdc,0x15,0x0a,0x40,0xcd,0x1c,0xcf,0x0b,0x25,0xf9,0xdb,0x03,0xf7,0xea,0x1b,0x0e,0x99,0x62,0xe3,0x41,0xf3,0xd1,0x4f,0x0a,0x05,0x2b,0x13,0xc1,0x9f,0xc3,0xb8,0x2a,0x38,0x01,0x11,0xf5,0x1f,0x06,0x17,0x32,0xd5,0xce,0xba,0x1f,0x1b,0x13,0x0b,0xfb,0xab,0xcf,0x5c,0x26,0xf6,0x22,0xd8,0x31,0x2b,0x2b,0x82,0x2c,0xf9,0x2b,0x61,0xff,0x0b,0xe9,0xf3,0x1c,0xdb,0x3e,0xf6,0xec,0xe4,0x53,0x14,0x31,0xb3,0xf4,0xe3,0x00,0xb8,0xed,0x98,0xe8,0x04,0xd6,0xe2,0xcb,0xd7,0x0c,0x12,0xf3,0x28,0x23,0xc4,0x13,0xdf,0xed,0x54,0x9a,0xf9,0x0f,0xb7,0xc7,0x4a,0x3c,0xfc,0xaf,0xf4,0x0c,0x28,0x1e,0xe6,0x12,0x2c,0x35,0xa1,0x39,0xe0,0x55,0x3a,0xf5,0x81,0xc8,0x2e,0xe7,0x18,0xae,0x1a,0xf0,0x45,0xd9,0xf2,0x15,0xf5,0x0f,0x3c,0x07,0xb1,0x3f,0xd4,0x97,0x45,0xa6,0x19,0x0f,0xde,0xca,0xdd,0xef,0xda,0xfb,0xd5,0xfc,0x39,0xf2,0x7f,0xeb,0x0a,0x3d,0x46,0x41,0xdd,0x98,0x0f,0xe9,0xf0,0xb6,0xef,0x06,0xf1,0x54,0xe9,0x1d,0x2a,0x48,0xee,0x28,0x18,0x2b,0x09,0x2f,0xfe,0x69,0x3e,0xe8,0xf3,0x3d,0xe7,0x31,0xdc,0xe1,0x04,0xfa,0x28,0x08,0x36,0xbf,0x34,0xe3,0x2a,0x30,0xd1,0x43,0xaa,0x63,0x2f,0x1d,0xdb,0x35,0xf6,0x13,0xfe,0xcd,0xbd,0x0e,0xe1,0xe6,0xec,0x7e,0x33,0x4e,0xcc,0x2e,0xfa,0xe3,0xc1,0x18,0x10,0xe1,0xc2,0x4e,0xd8,0x01,0x00,0x27,0x03,0x26,0xcc,0xff,0xee,0xe5,0xf5,0x2f,0x2e,0xda,0xcf,0x1d,0xdd,0xff,0x36,0x11,0x2a,0x28,0x1d,0x14,0xd1,0x0a,0x3e,0xf6,0xb0,0x05,0x35,0x4d,0xf9,0x37,0x5e,0x31,0x14,0x5c,0xdb,0xf5,0x05,0x9b,0xd9,0xf5,0x0f,0x11,0xc5,0xb7,0xa4,0xf0,0xe6,0x1a,0xe4,0xde,0x05,0x19,0xe6,0xcb,0xe7,0x1f,0x37,0xfc,0xe9,0xdd,0x1c,0xb1,0xf0,0x20,0x12,0xdd,0x1f,0xe4,0x06,0x25,0xa7,0x3a,0x43,0x20,0x34,0x14,0xe6,0xd6,0x25,0x70,0x29,0xc9,0x18,0xc1,0x2d,0xf2,0xe0,0x06,0x56,0x0f,0x0e,0x00,0xd4,0x85,0xdd,0x01,0x16,0x43,0x17,0xe3,0x22,0x18,0x19,0xb9,0xef,0xe5,0x35,0xb9,0x37,0x0a,0xdd,0x19,0xd4,0xe1,0x0e,0x05,0xbb,0x13,0xfc,0xff,0x20,0xf9,0xb2,0xa2,0xf8,0xe1,0xc5,0x43,0x2f,0x14,0x09,0xbb,0xf1,0x1a,0xe8,0xa2,0xf1,0xf3,0x09,0x02,0x22,0x24,0x25,0xf4,0xf8,0x35,0xf5,0x13,0x1f,0x81,0xd3,0x1a,0xfa,0xcc,0x24,0xf2,0xf5,0xdc,0xf5,0x0d,0xf7,0x2f,0x01,0x12,0xe9,0xde,0xe0,0xe2,0xe1,0x16,0xca,0x29,0xfb,0xe4,0xde,0xf8,0x2f,0x22,0x38,0xdb,0xed,0xbe,0x15,0xd3,0x12,0x1d,0x3a,0x04,0x1b,0xe8,0xc4,0x00,0x13,0xdc,0xd9,0xfd,0x13,0x0b,0xbd,0xe9,0x17,0xad,0x2f,0x12,0x09,0xd8,0xf3,0xe8,0xa8,0x08,0xf5,0xd8,0x0a,0xe4,0xe5,0xc8,0xc6,0x1b,0x00,0x2c,0xd5,0x14,0x3e,0xdc,0x01,0xff,0x0a,0xeb,0x1e,0x1a,0x02,0x24,0xe4,0xf4,0xfc,0x3c,0x16,0x0d,0xc6,0xf5,0xf2,0xf3,0xca,0x0b,0xc6,0x21,0xe6,0xd8,0x3f,0x05,0x1a,0xfe,0xe9,0xd0,0x5d,0x2d,0xf2,0xea,0xf9,0xe3,0xf9,0xcb,0xd5,0xeb,0x00,0xe7,0x37,0x02,0xcf,0x1b,0xf6,0x18,0xf1,0x30,0xf8,0x2c,0xfc,0xcd,0x81,0x08,0x27,0xff,0x2e,0x02,0xfb,0xe1,0xf9,0x06,0x2e,0xe9,0x26,0x13,0xde,0x02,0x17,0x04,0x03,0x09,0x37,0x7f,0x02,0xdf,0x29,0xd9,0xf3,0xe8,0xe5,0x0f,0x03,0xdc,0x1c,0x2a,0xd3,0xac,0xf0,0x44,0x06,0xf4,0xe1,0xe0,0x17,0x00,0xfd,0xcf,0xfa,0x21,0xfe,0xb3,0xe1,0xe9,0x2e,0x14,0xf9,0xe3,0x02,0xf3,0x02,0x11,0x23,0x29,0x18,0x13,0x02,0xf0,0x12,0xe9,0x13,0xf7,0x0f,0xce,0xcc,0xf5,0x06,0x1a,0x07,0x0f,0xf2,0x15,0xf2,0xe6,0x08,0xf3,0xf2,0xeb,0xf8,0xd6,0x23,0x08,0xe5,0x09,0x2f,0xe3,0xe5,0xfc,0x37,0x00,0x08,0xea,0x05,0x31,0xfa,0xe9,0x35,0xf6,0x1f,0x02,0xfd,0xde,0xcf,0xea,0xd0,0x30,0xea,0x07,0xf3,0x06,0xfe,0x2b,0xc4,0x1c,0xe4,0xd2,0xe6,0x10,0xf9,0xdd,0x11,0xcb,0x15,0xb1,0xfb,0x48,0xf4,0x23,0x02,0x15,0x42,0x1c,0xef,0x38,0xc0,0xe6,0x04,0x17,0x05,0xef,0xe8,0x47,0x24,0xf6,0x2d,0x1b,0xf4,0x55,0x3a,0x37,0xb9,0x10,0xda,0x96,0xd4,0x34,0xba,0xff,0x09,0x02,0xf9,0x1f,0xcc,0xf1,0x40,0xbc,0xeb,0xe0,0x47,0xee,0xef,0xfc,0x3c,0x11,0x7a,0x08,0xd7,0xf5,0xf3,0xd6,0xb6,0xf5,0xf1,0x25,0xe8,0xac,0xfb,0xc2,0xce,0x81,0x74,0xcd,0xf0,0x43,0xb2,0xbd,0xc2,0xff,0x04,0x2e,0x61,0xbf,0xec,0x03,0xf8,0xf7,0xf1,0x9d,0xee,0x1a,0x1f,0xd8,0x4a,0xe1,0xdb,0x4a,0x3c,0xed,0xee,0x23,0x4a,0xcb,0xce,0x16,0x3c,0x3d,0xf1,0x05,0xde,0x50,0x01,0x11,0xcc,0x92,0xf9,0x14,0xd1,0xd6,0x08,0xd9,0x8d,0x9c,0xcd,0x2e,0xc3,0xed,0x04,0x05,0x7a,0x2b,0x02,0x1d,0xa1,0x26,0xd4,0x32,0x26,0x96,0x64,0xe8,0xdb,0x0b,0x2a,0xd5,0x04,0x13,0x2c,0x5e,0xf1,0x06,0x0e,0x9d,0xdd,0xd8,0xe8,0x2f,0x23,0x2f,0xcd,0xc5,0xee,0x30,0xed,0x5e,0xdb,0xf4,0xe9,0x20,0xe3,0x1b,0xe1,0xf4,0xd4,0xed,0x2e,0xd2,0xb7,0x5a,0x0f,0xc9,0xca,0xce,0x9e,0x53,0x2f,0x4b,0x18,0x82,0x00,0xda,0xe3,0xbc,0x1b,0xc6,0xfe,0xde,0x4b,0x32,0xbc,0xef,0xb3,0xf3,0xfc,0x61,0x2f,0xfa,0xa1,0x86,0x5c,0xd0,0xdc,0x02,0x4b,0xeb,0x1f,0x5a,0x24,0x16,0x0f,0xd1,0xd1,0xbf,0xd9,0x8f,0xa8,0x11,0x3b,0xd8,0x32,0xda,0xe6,0x59,0x7f,0x11,0x40,0xe4,0x34,0xf0,0x06,0xd4,0xf4,0xd5,0xc3,0x1e,0x2e,0x1b,0xe9,0xf6,0x12,0xe5,0x0b,0xe4,0x3b,0x14,0xd0,0x45,0x0c,0xdb,0xdb,0xf5,0xfa,0x06,0x1a,0xc8,0xe3,0xe5,0x06,0x14,0x28,0xf6,0xbf,0xc9,0x09,0xb1,0x35,0xd8,0x10,0xf5,0x35,0x09,0x0c,0x18,0xfd,0xfa,0x16,0xfc,0x41,0xd5,0x27,0xc1,0xa4,0x0e,0xdc,0xdc,0x48,0x38,0xff,0x0e,0x4b,0x0a,0xa5,0xee,0x30,0x1b,0x0b,0x01,0x0f,0x53,0xf7,0xd7,0xed,0xec,0xf9,0xd1,0x2a,0x26,0x2d,0xfa,0x35,0x22,0x36,0xed,0xfc,0x14,0x8e,0xef,0xdd,0x0b,0x3b,0x29,0xd6,0xf4,0xd0,0x51,0x00,0xf5,0xc8,0x35,0x09,0xf1,0x11,0xd2,0x5a,0xf9,0x4f,0xdd,0x05,0xc8,0x0b,0xe8,0xf6,0x2a,0x2b,0xfe,0x81,0x07,0x45,0xce,0x16,0x1b,0xe8,0x46,0xef,0x4e,0x0e,0x21,0xfa,0x2b,0xce,0x18,0xfc,0x2e,0x09,0x04,0x5b,0xd6,0x27,0x0f,0xc9,0x21,0x14,0xf3,0xfc,0xe3,0x02,0xf4,0xec,0xff,0xff,0x2c,0x12,0x1c,0x03,0x02,0xdd,0xe5,0x19,0x0a,0x0e,0x2c,0xf5,0x23,0xfa,0xd0,0x08,0x1f,0xe0,0xdb,0x14,0xf9,0xe9,0x00,0x1c,0x16,0xd5,0xf9,0xc5,0xfb,0x26,0x15,0xfe,0x05,0x07,0xd5,0x25,0x1a,0xe4,0xf9,0xf9,0xea,0x0d,0x0b,0x23,0x14,0xf0,0xef,0xdb,0xe8,0x1f,0x2e,0x0f,0x09,0xdd,0x22,0x0e,0x05,0xee,0xfd,0x03,0xc6,0x0b,0x05,0xf1,0xd6,0x04,0xdd,0xe0,0xfb,0xfa,0x01,0x17,0xf0,0xf1,0x1e,0x09,0xfe,0x00,0x11,0x02,0x00,0xc7,0x04,0xd2,0xf5,0xdd,0xfa,0x09,0xdc,0x0f,0xe4,0xe1,0xfa,0xcb,0x27,0xed,0xef,0xfc,0xd4,0xea,0x04,0xd3,0xe8,0x23,0x02,0x08,0xce,0x0a,0x19,0xf7,0xe7,0xf9,0x15,0x2c,0x03,0xf0,0xf5,0x3f,0x0b,0x7f,0x16,0x18,0x21,0xf6,0x38,0xd5,0xfe,0x01,0xeb,0x3b,0xbe,0xdb,0xba,0xa2,0xae,0x01,0x2d,0x6a,0x46,0x29,0x2b,0x29,0x81,0x04,0xff,0x23,0x1b,0xfd,0xab,0x26,0x37,0x3f,0x21,0x20,0x23,0x9d,0xc1,0xc6,0xcf,0x7a,0x49,0xea,0xf4,0xd5,0x2f,0xcc,0x48,0xd7,0x13,0xfd,0x3e,0x0f,0xef,0x50,0xe0,0x11,0xd2,0x37,0x2e,0x3d,0x20,0x55,0xe5,0x3a,0xe4,0x12,0x2a,0x27,0x04,0x57,0x4d,0xf4,0x0f,0x29,0x27,0xf8,0x2c,0xfd,0x69,0x2d,0xfe,0x32,0xfd,0xa6,0xc8,0xe2,0xf6,0x31,0xbf,0x52,0xf8,0xff,0xe1,0xdb,0x50,0xdc,0xea,0xf0,0xdb,0x18,0x93,0xca,0x65,0x8f,0x09,0x10,0x62,0xe5,0x3c,0x4c,0x03,0xe7,0x0d,0xff,0x9c,0x4d,0xe3,0xe1,0xf9,0xce,0x36,0xe7,0x1d,0x9f,0x19,0x13,0x2f,0x4d,0xf5,0xeb,0xe4,0x68,0x10,0x2d,0xe5,0x17,0xe3,0xd0,0xd5,0xec,0x13,0x1b,0x10,0xd6,0x39,0xd4,0x24,0xe3,0xc3,0x14,0xee,0xfd,0xee,0x45,0x0e,0x23,0xf0,0x32,0x03,0xe7,0xdc,0x26,0x3e,0xec,0xbe,0xd9,0x7f,0xda,0x0c,0x23,0x19,0x17,0xf2,0x52,0x37,0xce,0xfd,0xec,0x25,0x19,0xf5,0x01,0xf1,0xf0,0x02,0xe8,0x1b,0xf7,0xe1,0xf2,0x01,0xd5,0xdf,0xe6,0xff,0x0d,0xeb,0xdc,0x18,0xdc,0xf1,0x1f,0xf8,0xe7,0xff,0xf1,0xe0,0xd6,0x2e,0x0e,0x09,0xdc,0x25,0xfc,0x05,0xdb,0x1c,0xdf,0xca,0xf3,0xec,0x27,0x1c,0x3e,0xc2,0xde,0x26,0x37,0xf6,0xfe,0x2f,0x1a,0x0b,0xd9,0xf5,0xca,0xf6,0xca,0x1d,0x10,0x01,0xfc,0x08,0xfd,0xcf,0x03,0x1f,0x1e,0x32,0xa4,0xe6,0xed,0x00,0xd2,0x27,0xd7,0xeb,0x10,0xe6,0x1d,0xe3,0x00,0xcf,0xff,0x16,0xdd,0xcb,0x09,0x12,0xe0,0xf0,0xee,0x08,0xf7,0xc6,0x24,0x44,0x04,0xaf,0x22,0xd7,0x39,0xef,0x2c,0xf8,0x2b,0xd9,0x2b,0xf8,0x0b,0x4d,0xca,0xf8,0xcb,0x19,0x1e,0xfb,0xd7,0xf3,0x1a,0xf8,0x4c,0x23,0xe7,0xf3,0x00,0x1d,0x13,0xe7,0xf5,0x39,0xb3,0x1c,0xe8,0x0b,0x27,0xf0,0xe6,0x06,0x40,0x14,0xd9,0xe4,0xce,0x24,0xd8,0xc2,0x16,0xdb,0xf7,0x29,0xbb,0x38,0xf1,0x01,0xf9,0x2a,0x05,0x07,0xac,0x13,0x0c,0x04,0xe9,0xf6,0x02,0x04,0x0c,0x51,0x07,0xfa,0xe0,0x25,0x2d,0x81,0xe7,0x0a,0x02,0x0c,0xe8,0x59,0xd3,0xf3,0xf4,0xec,0xeb,0x4e,0xef,0xdb,0x04,0xf8,0x0c,0x13,0x20,0xde,0xd4,0x0b,0xe1,0x32,0xd6,0xfa,0x08,0x02,0xe2,0x20,0x2a,0x28,0x3a,0xdd,0xb2,0x61,0x5c,0x21,0x1e,0xf4,0xb4,0x0a,0x30,0xf2,0x15,0xd9,0xd5,0x25,0x06,0xbe,0xca,0x04,0xd4,0xd6,0x26,0x5f,0x02,0xcd,0x37,0x54,0x14,0xd1,0x35,0x08,0x0e,0x53,0x17,0x20,0x35,0x2d,0x16,0x61,0x0f,0xdb,0xfb,0xcd,0xd0,0xee,0x00,0x47,0x1c,0x39,0x14,0x08,0xe7,0x2d,0xcf,0xfb,0x13,0x26,0xf5,0xe6,0xc4,0xce,0x3c,0xe5,0x11,0x07,0x37,0x1b,0xf6,0x3f,0x16,0x60,0x07,0xdf,0x93,0xcf,0xd3,0x9d,0xbd,0xda,0x2d,0x05,0x01,0xa1,0xe7,0xe2,0xcd,0x1a,0x20,0xc5,0xf0,0x08,0xd1,0xc3,0xa7,0xd2,0xbb,0x34,0xf1,0xe3,0x7f,0xe4,0xe7,0x18,0xec,0xf4,0x59,0xd9,0xa3,0x1c,0x0f,0x41,0xde,0xe0,0x09,0xe6,0x4d,0xf2,0x2c,0xc2,0x6a,0x06,0xbe,0xab,0xbe,0x36,0x33,0xd1,0x1a,0xba,0xe1,0xe5,0x29,0x37,0x12,0xb4,0xe2,0xea,0xd5,0xd5,0xfd,0xcf,0xde,0xd0,0xd0,0x09,0xf8,0x19,0x31,0x26,0xcd,0x3d,0xcb,0xfa,0x00,0x13,0x07,0xf4,0x1a,0xeb,0x08,0xde,0x04,0xd9,0x05,0x3d,0x0a,0x0f,0x0f,0x37,0x3f,0xfe,0xe5,0x29,0x16,0x1b,0x15,0xe2,0xee,0xfa,0xf7,0xb4,0x0a,0x12,0x09,0xf1,0xf9,0x6f,0xf0,0xe5,0x0c,0x13,0xe1,0xac,0xd0,0xdd,0xc1,0x3f,0xe8,0xe1,0x17,0x70,0xf8,0xb2,0xf2,0xf5,0xdd,0x45,0xf7,0x1e,0xf1,0x1c,0x05,0xe4,0x1f,0xcb,0x07,0x10,0x3a,0xe3,0xf6,0xfe,0x14,0xed,0x27,0xcb,0xdf,0xd4,0x19,0xe3,0xdd,0x15,0xe6,0x17,0x13,0xfe,0xe7,0x09,0x0f,0xcc,0x48,0x6b,0xfc,0xfd,0x17,0xf7,0x02,0x11,0xea,0x19,0xe9,0xf0,0x81,0xdd,0x06,0xea,0x06,0x03,0xd8,0x46,0x24,0x18,0xb9,0xd7,0x1c,0x0e,0x0d,0x0a,0xe1,0x20,0x26,0x2c,0x12,0x94,0x5f,0x2c,0x22,0xcd,0xe7,0x09,0x1c,0x1b,0xd8,0xea,0x1e,0x00,0x56,0xcf,0x22,0xef,0xe3,0xe5,0x31,0x1a,0xbe,0xd5,0x28,0x2b,0xfe,0x27,0xda,0x17,0x25,0xdf,0x51,0x22,0xdb,0x4d,0x18,0x2a,0x4e,0x3e,0xec,0xaf,0x2f,0x1d,0x46,0xcf,0x1f,0x00,0xe8,0xfc,0xd9,0x04,0x1f,0x57,0x72,0x38,0x05,0x2f,0xf6,0xfc,0xe1,0xf2,0x2a,0x0f,0x32,0xc7,0x15,0xf0,0x0c,0xea,0x19,0x7f,0x37,0x0a,0x2e,0x47,0xcd,0x17,0xee,0x0c,0x24,0xf5,0xb3,0xfd,0xd3,0xd3,0xba,0x11,0xc8,0xf2,0xd4,0xdb,0x2c,0x2f,0xc9,0xd3,0x43,0x0b,0xf8,0xf6,0x0c,0xe7,0x16,0x0a,0x84,0xc7,0xfc,0xbd,0x04,0xe8,0x06,0xf8,0xea,0x16,0xf1,0xc5,0x02,0x05,0xee,0xbf,0xce,0x1a,0xe3,0x82,0x01,0x13,0xeb,0x57,0xed,0x15,0x1e,0xec,0x38,0x4b,0x76,0x10,0x26,0xd4,0xee,0xf7,0x2b,0xe8,0x02,0x1b,0x04,0xbf,0xcc,0x17,0x0a,0x1d,0x13,0x30,0xf6,0x19,0x2b,0x0a,0xc7,0x04,0x47,0x4c,0x04,0xdf,0x26,0xd9,0x00,0xf7,0xe4,0xf5,0x02,0xe6,0xc7,0x09,0x10,0x96,0x04,0xfe,0x0c,0xf3,0xbe,0x15,0xba,0x1c,0x03,0x10,0xda,0xf2,0x81,0xf5,0xff,0x18,0xa7,0x1f,0xff,0x26,0xd6,0x45,0xf3,0x30,0xea,0xe2,0xb1,0xfe,0x36,0x2f,0x31,0xb0,0xfe,0x33,0x69,0x1b,0x0c,0xe0,0x3b,0xbb,0x13,0xfd,0x2d,0x25,0x07,0x0b,0xd1,0xf0,0xc5,0xdf,0x4d,0x63,0x1e,0x1c,0xf8,0xd6,0x15,0xd4,0xf8,0x2c,0xf9,0x4e,0xb4,0x29,0x15,0xd0,0x05,0x38,0x2f,0x12,0xfe,0x1a,0x05,0xee,0xb5,0xf9,0xd6,0xbd,0x31,0xfd,0xe8,0x13,0xc2,0xf4,0xad,0xf4,0x09,0x12,0xfa,0x34,0xf2,0xe5,0x0f,0xe8,0xc0,0x01,0xc8,0x2b,0x01,0xac,0xda,0x10,0x35,0x23,0xf6,0xfe,0x32,0xe5,0x09,0x02,0x1e,0x7f,0xbc,0x21,0x4b,0x33,0xff,0xf7,0xe7,0xe9,0x08,0x10,0xed,0x26,0x32,0x9f,0xbf,0x06,0xf3,0x50,0x21,0x1a,0x1b,0x19,0xf4,0xbf,0xe6,0xf7,0x1c,0x12,0xe6,0xc0,0x47,0xe3,0x13,0x27,0xea,0x0a,0x35,0xf8,0x20,0xcd,0x92,0x0b,0x2c,0xe5,0xde,0x11,0x04,0x03,0x0c,0x42,0xe0,0xce,0xd4,0x20,0xff,0x22,0x1f,0xe8,0xd2,0x03,0xbd,0x31,0x6d,0xf4,0x0f,0x06,0x52,0xcd,0xc3,0xf1,0xc3,0xe2,0x20,0x0d,0x10,0x01,0x15,0xd1,0x1f,0xdc,0x22,0xf3,0x2f,0xe7,0xf7,0x00,0x0b,0x0b,0x12,0x17,0x44,0xf5,0xa2,0xe5,0x14,0xf4,0x0f,0x3b,0xc6,0x31,0xf4,0xcf,0x2b,0x08,0xdf,0xe1,0xa3,0x09,0xfd,0xf4,0xc3,0xf0,0xf0,0x18,0x3c,0xf2,0xb8,0xf5,0xe5,0xe5,0x05,0x3a,0xe6,0x28,0xed,0xe5,0x2d,0x2b,0x17,0xcf,0x0e,0xe4,0xbd,0x27,0x09,0xf8,0x0c,0x15,0xe2,0xe9,0xde,0x24,0x02,0x08,0xe8,0x02,0x04,0x07,0xcd,0xf7,0x9a,0xf3,0x01,0xec,0xcf,0xe1,0xd5,0xf8,0x4f,0x06,0x1f,0x15,0xf5,0x2a,0x0b,0xea,0xfc,0x18,0xd4,0xf9,0x33,0x16,0xf8,0x7f,0x39,0x21,0x00,0x13,0x5f,0xe3,0xd7,0xd6,0xc4,0x30,0xf2,0x08,0xfd,0xba,0xf7,0x22,0x0d,0x1d,0xf3,0x31,0xe7,0xed,0xd1,0x39,0xf5,0x08,0xce,0xfa,0x1b,0x01,0x54,0xfa,0xb3,0xf0,0xc5,0x3d,0xfb,0x01,0x39,0xd9,0x02,0x1e,0x25,0xd1,0xbd,0x0a,0x10,0xd7,0x24,0x1b,0xdd,0xf1,0xf7,0xf8,0xf4,0xea,0x81,0x27,0x11,0x2d,0xfb,0x64,0x2c,0x10,0x16,0x11,0xed,0x0a,0x09,0xc1,0x1b,0x0c,0xf3,0x24,0x0d,0x39,0x1d,0x05,0x18,0xc8,0xde,0x00,0x1d,0xf4,0xf7,0xea,0xf8,0x11,0xcb,0xfe,0x11,0x19,0xed,0xea,0xfc,0x0f,0xf0,0xe3,0xcc,0xe0,0xea,0xa4,0x25,0x10,0x04,0xef,0x15,0xeb,0xc4,0x01,0xfe,0x01,0xd1,0x01,0xfe,0xf9,0x6f,0x09,0x17,0xdc,0xe6,0x2d,0x08,0xcd,0xbe,0x99,0x30,0xe4,0x10,0xb2,0xaa,0x22,0xc5,0x00,0x00,0x06,0xfd,0xe3,0xef,0xc8,0xf0,0xe8,0xb4,0xf0,0xf2,0x05,0xe8,0x11,0xf9,0x13,0x1f,0xf1,0xf7,0xe3,0xe1,0xc6,0xc8,0x00,0xf8,0xf7,0x42,0x15,0x19,0xf7,0xf5,0xea,0xf0,0xbf,0x19,0x05,0x13,0xe0,0xc0,0xdd,0xd7,0xcb,0x13,0xe7,0x1d,0x2e,0xec,0x08,0xfe,0xfc,0x18,0x18,0xdd,0x10,0x0b,0xe3,0x27,0xe6,0xf9,0x11,0x67,0xfc,0x1e,0xd4,0x0b,0xee,0xf2,0x1f,0xfd,0xb2,0x02,0x32,0xcd,0xc8,0xf9,0x0d,0x0c,0xe6,0xfd,0x11,0xe2,0x0b,0xee,0xcd,0x3a,0xf3,0xd8,0x11,0x10,0x05,0x10,0xf4,0xdc,0x0d,0x36,0x0a,0xda,0xf2,0x38,0x2f,0x0c,0x0c,0x05,0x2a,0xe4,0xca,0xfb,0xd9,0xfc,0x05,0xfc,0xe1,0xf7,0xed,0xcb,0x52,0xfe,0x00,0x7f,0xd9,0x39,0x32,0xb1,0x0d,0xc0,0x08,0xfb,0x16,0xb5,0x10,0x0e,0x12,0x31,0xdb,0x43,0xc8,0xca,0xf0,0xd1,0xff,0xf6,0x0f,0xfe,0x5f,0xc2,0x36,0xe7,0x0c,0x1d,0x15,0xeb,0x10,0xf1,0xc7,0x0a,0x2b,0xed,0xd6,0x2c,0xc2,0x02,0xd2,0xfd,0xff,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0xc0,0x32,0xf7,0x38,0xec,0xf3,0xe0,0x99,0xc8,0x0a,0x05,0xb2,0x2f,0x1c,0xc9,0x08,0xe5,0x0b,0x19,0x05,0x12,0x05,0x29,0xcc,0x12,0xef,0xf6,0x37,0xe9,0xc1,0xe6,0xf2,0xef,0x28,0xe8,0xd4,0xf8,0x14,0xc6,0x41,0x23,0x06,0x59,0x26,0x09,0xf3,0xeb,0xdc,0x44,0xfa,0xdc,0xca,0xd0,0x12,0x31,0x37,0xe9,0xf5,0x0d,0x03,0x07,0xb4,0xe7,0xfe,0xf1,0xa4,0x62,0xf5,0x3c,0x36,0xf1,0x27,0x06,0xc6,0x0f,0x2c,0xd8,0xdd,0xf9,0x03,0x4c,0x0b,0xb0,0xa9,0x24,0xfd,0x81,0x31,0x96,0xce,0x63,0xca,0x17,0x58,0x33,0x0d,0x12,0xca,0xc6,0x48,0xae,0xeb,0x49,0xe8,0xe0,0x43,0x08,0x40,0xb6,0xc8,0x8f,0x3d,0x5b,0xcc,0xf6,0x56,0x63,0xf5,0x0a,0x0d,0xd9,0x99,0xe4,0x06,0xde,0x24,0xd3,0x0d,0x21,0x39,0x2f,0x81,0x12,0x41,0xaf,0x0a,0xf2,0xd3,0xcf,0xdb,0x1f,0x04,0xf1,0x04,0x3c,0x1a,0x53,0x31,0x16,0xe9,0x1c,0xe3,0x26,0x32,0xbb,0xf1,0x01,0x01,0x34,0xc2,0x08,0x12,0x1b,0x67,0xfb,0x40,0xde,0xc6,0xdd,0x6b,0xc5,0x0f,0x01,0xb9,0xd6,0xfa,0xf5,0x28,0xe4,0x15,0xe9,0x08,0x35,0x5f,0x29,0xbe,0xf6,0x03,0x02,0xaa,0x3a,0x06,0x09,0xc6,0x2c,0xf5,0xc7,0x09,0x25,0xdf,0xee,0x06,0x3f,0x25,0x08,0x20,0xf0,0xe6,0x9c,0xfc,0xa8,0xdf,0x07,0x48,0xdd,0xad,0xed,0xfa,0x06,0xe5,0xd6,0xb6,0x27,0xb8,0x1c,0x1f,0x40,0x29,0xf5,0x19,0x14,0xe8,0xe5,0x33,0x9a,0x26,0x0e,0x47,0xe2,0xcf,0x0c,0x00,0x39,0xe8,0x2a,0x2b,0x0e,0xe1,0x29,0x66,0xf5,0xf9,0xc3,0xde,0xcf,0x0f,0xde,0xdb,0xd8,0x22,0x10,0x01,0xf2,0xc7,0xca,0x10,0x15,0xcf,0xeb,0x08,0xf0,0xe5,0x23,0x0d,0x20,0x05,0x06,0x31,0xe7,0x03,0xdd,0x4e,0xd5,0xf8,0x4c,0x5e,0x17,0x40,0x7f,0xca,0x46,0xbc,0xb7,0xbe,0x25,0x14,0x1b,0xc6,0x08,0xea,0x22,0x98,0xef,0xe9,0x18,0xd0,0xe1,0x1d,0x3e,0xd8,0x06,0x18,0xd8,0x38,0xe8,0xef,0x36,0xfa,0x06,0xff,0x14,0xe5,0xae,0x33,0x68,0xdc,0x00,0x41,0xe4,0x2e,0x0b,0x26,0x19,0xfb,0xfc,0x27,0x53,0xcd,0xf9,0x97,0xdc,0x21,0x00,0xd3,0x32,0xd0,0x13,0x33,0xee,0x65,0x48,0x13,0x9d,0x00,0x19,0x28,0xb1,0x2a,0xdd,0xd5,0xfa,0x1c,0xd2,0x09,0xd6,0x18,0x28,0xe4,0xf3,0x07,0x0a,0xfa,0x16,0x12,0xfd,0xd2,0xcc,0x15,0xf7,0x1a,0xe9,0xed,0xdd,0xea,0x18,0x03,0xd8,0x12,0x0c,0x15,0xf9,0x00,0x6a,0x41,0xd8,0xf4,0xf8,0x0c,0x1a,0x37,0x1e,0x01,0xf8,0xd8,0xe6,0xf8,0xe2,0xdf,0xb7,0x09,0xe3,0x3a,0x08,0x1b,0xb3,0xeb,0xd0,0x2b,0xd8,0x00,0xf1,0x5e,0x31,0xcb,0xc8,0x7c,0xf9,0x81,0xd4,0x2f,0xfe,0x97,0xcc,0x1c,0x75,0xee,0xed,0x4e,0xf8,0x14,0xde,0x49,0x02,0xe0,0xe3,0x58,0xfd,0xfb,0xdf,0xfb,0x14,0x72,0x19,0x1f,0xe8,0x55,0xd5,0x0a,0x4a,0xd7,0xbb,0x1e,0x11,0xe0,0xcc,0xe6,0xf2,0x27,0xc8,0x15,0xf0,0xf4,0xfd,0xdd,0x42,0x1b,0x2f,0xcb,0x13,0xe5,0xb1,0x09,0x1a,0xcb,0x23,0x02,0xe7,0xe1,0x0b,0xf2,0x02,0xcc,0xeb,0x12,0x20,0x24,0xe3,0xe1,0xb9,0xff,0xbd,0x1a,0x89,0xfc,0x1e,0x38,0xec,0x04,0x1b,0x22,0xf8,0x0e,0xf4,0x41,0x0d,0xf9,0xf5,0xfe,0xe3,0xf4,0xfa,0x10,0x0b,0xec,0xc4,0x24,0x11,0x15,0x05,0x26,0x10,0xf0,0xeb,0x10,0x04,0xd4,0x00,0x29,0xf8,0x14,0x11,0x18,0xf8,0x23,0xe4,0x10,0x7f,0x02,0x13,0x3e,0xf8,0xfb,0x2e,0xd4,0x0d,0xfc,0xdc,0xfb,0x52,0xe2,0x1d,0xfb,0x05,0x07,0xe7,0xed,0x24,0xff,0xf0,0xd9,0xe4,0xf8,0x3b,0x46,0x05,0xec,0xea,0xd7,0x0b,0xec,0x08,0xf1,0x3a,0x22,0xfa,0xe5,0x06,0xfb,0xf8,0x12,0x11,0xee,0x0d,0xee,0xea,0x0b,0xf0,0xed,0x12,0xe6,0xe0,0x05,0xe2,0xf6,0x07,0xe2,0xd9,0x05,0xe6,0xf2,0x3e,0x02,0xce,0x19,0x02,0x31,0xfe,0xda,0xfa,0x3b,0x19,0xf6,0x04,0x07,0x14,0xfc,0x52,0xf6,0xf9,0x2f,0x16,0x0b,0x15,0x04,0x1d,0xf3,0xdf,0x29,0xbf,0xeb,0xf2,0xae,0x12,0xe3,0x2a,0x0a,0xe1,0xcc,0x13,0x34,0x0d,0xf1,0xe2,0x2e,0xcb,0x00,0x1a,0x24,0x0c,0xe0,0x08,0x0a,0xeb,0xed,0x2a,0x0b,0x26,0x07,0x27,0xf3,0xee,0xf2,0x09,0xf3,0x19,0xc8,0x27,0x26,0xef,0xef,0xcb,0x08,0x25,0xf2,0xdb,0xc4,0x05,0xd8,0xf5,0x09,0xde,0x07,0xe2,0xe3,0x11,0xbe,0xce,0xc1,0xa0,0x58,0x0b,0x09,0x35,0xf1,0x81,0xed,0xe2,0x2e,0x07,0x34,0xd0,0xe5,0x20,0x1a,0x01,0x0e,0x41,0xd6,0xea,0x26,0x3c,0xf8,0xd3,0x12,0x1e,0x02,0x4e,0x02,0x01,0xe0,0x0e,0x05,0xfc,0x0c,0x07,0x27,0xd9,0x00,0x08,0x11,0xfe,0xe1,0x11,0xf1,0x16,0xe6,0x04,0x05,0xf3,0x51,0x3e,0xeb,0xfa,0xd5,0x0e,0xd7,0x00,0xfe,0xfa,0xd7,0xe9,0x42,0x03,0xdf,0x04,0xe6,0x16,0xfa,0xb6,0x06,0x06,0xd6,0xf8,0xa2,0xce,0x2c,0xfb,0xb7,0x1c,0xef,0xe4,0x1e,0x33,0xf7,0xa9,0x03,0x60,0x2e,0x5e,0x1d,0x08,0x28,0x44,0xdd,0xf3,0xfd,0xd1,0x0b,0xbd,0xed,0xfc,0x31,0x26,0x20,0x52,0xe7,0x07,0xa3,0x12,0xfe,0x5c,0x01,0xbc,0xd8,0x2f,0xfd,0x0e,0xc9,0xdc,0x28,0xfd,0xf1,0xd0,0x10,0xa2,0xd0,0x0c,0xda,0x0d,0xc9,0xea,0x02,0x14,0xc6,0xed,0xde,0xde,0xc1,0xc9,0xcd,0xe2,0xd1,0xf6,0xd4,0x38,0x08,0x20,0xf3,0xb5,0xf8,0xbb,0x17,0xc0,0x1d,0xd3,0x26,0x3f,0xe0,0xfc,0x9c,0x15,0xec,0x3f,0xdf,0x3b,0xd9,0x1b,0x56,0x9f,0x35,0xfd,0xdc,0x18,0xfc,0x9e,0xe7,0x29,0x01,0x23,0xb7,0xf8,0xf0,0x54,0xe4,0x05,0x00,0x7f,0xd9,0xf7,0x5b,0xdf,0x13,0xbf,0xe5,0xed,0xe6,0xff,0x30,0x16,0x5f,0x2f,0xde,0x5e,0x08,0x28,0xbd,0x1e,0x09,0x53,0xb5,0x32,0xf6,0xd1,0xe2,0x04,0xd7,0x64,0xfb,0xe2,0xf9,0xfc,0x50,0x1a,0x23,0xc1,0x09,0x31,0x15,0x50,0x29,0xf9,0x38,0xe8,0xbe,0x7c,0xbc,0xe8,0x3c,0x2a,0xdb,0x09,0xe2,0xd5,0x3a,0x52,0x3d,0xb6,0xda,0xdd,0x22,0xfc,0xfc,0xec,0xed,0x40,0xd8,0x17,0xae,0xef,0xf6,0xdb,0xe6,0x7f,0xfa,0x16,0x09,0x11,0x04,0xfc,0x22,0xbc,0xde,0x4d,0xf9,0x15,0x52,0xf9,0x0b,0xf4,0x38,0x23,0xfb,0xa7,0x29,0xde,0x2e,0x34,0x0c,0x45,0xff,0x2a,0x05,0xb8,0xed,0xf9,0x22,0x9d,0x02,0x36,0x02,0xd6,0xad,0x17,0xe0,0x2e,0x38,0x7e,0x09,0x1b,0xd4,0x41,0xfd,0xe5,0x0d,0x2c,0xe6,0x0b,0xf7,0x00,0xb3,0x0e,0xff,0xae,0x21,0xad,0xd4,0x28,0xc1,0x16,0x48,0x75,0x01,0xfe,0xe6,0x49,0xf0,0xad,0xcf,0xd6,0x02,0xee,0xdb,0x16,0xa4,0xbc,0x01,0xe2,0x22,0x17,0xf1,0x0e,0xf2,0xdb,0xe1,0xe2,0x44,0xe4,0x19,0xe6,0x2f,0xe2,0xf1,0x2e,0x36,0x06,0xa8,0x2d,0x22,0xef,0xeb,0xd4,0x69,0x35,0xc1,0x09,0xd4,0xc6,0xc3,0xd4,0x7f,0x37,0xdf,0xd5,0xff,0xf1,0x89,0x22,0x49,0xba,0x29,0x28,0x09,0x0e,0x48,0x00,0xec,0xf1,0x08,0xeb,0x32,0xe3,0xf4,0x04,0xff,0x24,0xff,0x70,0xe0,0xea,0x17,0xf2,0x22,0xa5,0x0a,0x2b,0x02,0x06,0x10,0x18,0x0a,0x5d,0xef,0x58,0x0a,0xd2,0xe3,0xa7,0x24,0x5f,0x18,0xd3,0x16,0x08,0x36,0xd9,0xf5,0x0c,0xde,0xbd,0xf5,0x0e,0xe0,0xae,0x21,0x22,0x6e,0x24,0xf9,0xdd,0x09,0x29,0x5b,0x0f,0xdb,0x1a,0xa7,0xd8,0x13,0xfa,0xf1,0x38,0xef,0x1b,0x18,0x37,0x11,0x05,0xf5,0x13,0x21,0x30,0x11,0xcb,0xe5,0xf0,0xdd,0xf3,0x09,0x08,0x34,0xfa,0xee,0xfe,0x0f,0x00,0x7f,0xed,0x1b,0x98,0xce,0xcd,0xc5,0xec,0x23,0xf2,0xe0,0xe0,0xdb,0xea,0xd0,0xf7,0xeb,0x1d,0xd2,0x47,0x24,0xfe,0x13,0xd1,0xfd,0xd3,0x31,0xc4,0xd9,0x28,0x2d,0x1f,0xe8,0x1f,0xfe,0xe2,0x06,0xcf,0xea,0x1b,0xc5,0xed,0xe3,0xc0,0x1f,0xe8,0x04,0xf5,0xde,0xda,0xcc,0x03,0x1b,0xf8,0x15,0x14,0x09,0xf0,0xcb,0xbe,0xfb,0xc8,0xef,0x0e,0xfa,0x1b,0x34,0xe1,0x14,0x0d,0xfd,0x0c,0x07,0xe9,0x52,0xb1,0xec,0xf6,0xe7,0xcc,0xf1,0xb4,0xed,0xdc,0xe7,0xd9,0x2a,0x14,0xec,0xf5,0x0c,0xbf,0xef,0xf8,0xd6,0xb0,0x46,0xda,0xee,0xd9,0x11,0x2b,0x48,0x2b,0xd3,0xc9,0xcd,0x0e,0xa7,0x08,0x05,0xe4,0x30,0x14,0xcc,0xf0,0x61,0x16,0xfb,0x87,0x01,0x1e,0x68,0x0b,0x38,0xe7,0xad,0x0e,0x27,0xe1,0xc8,0x37,0xe3,0x32,0x46,0xf6,0xdd,0x32,0xcd,0xbd,0xfd,0xd4,0xc7,0x0b,0xff,0x19,0xb9,0xf6,0x53,0x1b,0xf1,0xda,0xfb,0xa9,0x17,0xce,0x35,0x27,0x2f,0xa7,0x33,0xf6,0x0c,0x0c,0xec,0xcb,0xd3,0x22,0xe7,0x81,0x2a,0x01,0xd6,0x29,0xf6,0xf9,0x0d,0xfc,0xf5,0xc8,0xf0,0x07,0xf9,0xdd,0x12,0xd4,0x33,0xfc,0x1c,0xfc,0xcc,0xcb,0xa5,0xfa,0x64,0xdd,0x44,0xe2,0xfc,0xf2,0xd4,0x31,0x66,0x05,0x2c,0xe2,0x1f,0xd4,0x49,0xd8,0xf7,0xad,0x4c,0xf2,0xe2,0x06,0x1a,0x00,0x22,0x21,0x10,0xa9,0xec,0xdd,0xe4,0x11,0x09,0xf2,0xf4,0xf3,0xcb,0x26,0x55,0xf9,0xdd,0xd8,0x23,0x2a,0x33,0x2c,0x04,0x17,0xb4,0xb8,0x0e,0xcc,0xf4,0x37,0x2f,0xe5,0x40,0x04,0x07,0xe3,0x0d,0x18,0x17,0x0d,0x18,0x39,0x2d,0xd8,0xf1,0xb5,0xea,0x1a,0xfc,0xd3,0xe2,0x00,0x13,0xf2,0xc5,0xe2,0xe6,0xae,0xd6,0x13,0xdf,0xc0,0xb2,0xd2,0x00,0x39,0x09,0x27,0xfb,0x81,0x01,0xde,0x2b,0xfe,0x33,0x39,0xfb,0xfe,0xfe,0xf1,0x06,0xc3,0xe4,0x00,0xd3,0xc6,0x1f,0x4b,0x0e,0xaf,0x03,0x36,0xe7,0xdd,0xe4,0xfd,0xc8,0xf4,0xcb,0x1a,0xf4,0x0f,0x03,0x2f,0xe5,0xcd,0x30,0xbc,0x2a,0x2a,0xf0,0xfb,0xd7,0x4c,0x30,0xdf,0xcc,0xcb,0xe8,0xe4,0xf9,0x07,0x17,0xf2,0x02,0xc6,0xf2,0x39,0x37,0xfa,0x21,0xe5,0xe6,0x1d,0xfe,0xfc,0x31,0xef,0xd0,0x19,0x28,0x0e,0x4e,0x1d,0x1b,0x46,0xef,0xef,0x40,0xd7,0xf9,0x05,0x15,0x16,0xf4,0x01,0x15,0xa0,0x04,0x06,0xaf,0xc8,0xe0,0x08,0x00,0xd5,0x0d,0x35,0x03,0x15,0xdd,0xdc,0xe6,0x33,0xa0,0xe6,0xdf,0x37,0xc6,0x25,0xdb,0xde,0xff,0xfe,0xfc,0xc1,0x24,0x03,0x5e,0xe5,0xd7,0xc7,0xb2,0xdc,0x9c,0x30,0x12,0xe9,0xef,0xde,0x30,0x11,0xfb,0xff,0xd7,0x26,0xfa,0xd2,0x52,0x25,0xe4,0x24,0x31,0x1c,0xf9,0x14,0xec,0x98,0x1c,0xeb,0x20,0xc5,0xed,0x81,0xed,0x08,0xf7,0x85,0x0b,0xee,0xb2,0xf6,0x1a,0xf1,0x04,0x11,0xcf,0xea,0xe9,0x02,0xf1,0x01,0x29,0x4d,0xc9,0xf6,0x57,0xdf,0xc6,0x3c,0x39,0x1c,0xee,0x04,0xbd,0x43,0xe5,0xc8,0xec,0x03,0xb5,0xd1,0x4a,0x01,0x51,0x02,0xe1,0xb6,0xfb,0x03,0xfa,0xde,0xae,0xa2,0xff,0xda,0x01,0xf5,0xfa,0xf1,0x21,0x55,0x28,0x05,0xf1,0xe7,0x20,0x06,0x15,0x12,0xf3,0xe6,0xf7,0x6b,0x22,0xfb,0xf1,0xef,0x4e,0x64,0x28,0x1f,0x81,0xc2,0xfe,0xbc,0x1c,0xce,0xac,0x14,0x99,0x13,0x0f,0xd6,0x07,0x08,0x1d,0x30,0x2c,0xfd,0x1e,0x0e,0xda,0xcc,0xdc,0xcf,0x0d,0xbf,0xf7,0x25,0xaf,0x3e,0xad,0xe0,0x01,0x26,0x0c,0xae,0x1f,0x04,0xf3,0xbe,0xf4,0xc8,0x4e,0x02,0xcb,0xf7,0xec,0xbb,0x18,0x3a,0x44,0xe1,0xea,0x05,0xf7,0x6f,0x2a,0xa5,0x3c,0xf1,0xfd,0x7c,0x22,0xfa,0xed,0x23,0xce,0x0e,0xd8,0xee,0x29,0x0f,0xfc,0x2d,0x14,0xd4,0xe8,0xed,0xe6,0xfb,0x0d,0xf4,0xf9,0xff,0xfc,0x0a,0xef,0x2e,0x14,0x19,0xe9,0xbe,0x7e,0x30,0x25,0x6f,0x22,0xd2,0x11,0xee,0x10,0xbe,0xec,0xdf,0xa4,0x28,0xe3,0xd0,0xfe,0xe0,0x07,0x1d,0x18,0x91,0x20,0xf4,0xac,0x06,0x0d,0x36,0x3f,0x0b,0x15,0x03,0xb7,0xce,0x14,0xec,0x0f,0xe1,0xe1,0x14,0xaa,0xda,0x0e,0xeb,0x0b,0x06,0xe8,0x2b,0x34,0x0d,0x2c,0x38,0x27,0xb9,0x70,0x1d,0xfe,0x4e,0xf8,0x16,0x3a,0x07,0x4c,0x27,0x10,0x45,0xe2,0xd9,0x4b,0xec,0xab,0xa2,0x02,0xcb,0x5d,0xe2,0x4d,0x5b,0x94,0xf1,0x6c,0x20,0xc9,0x00,0xf6,0x03,0xfa,0xef,0x3a,0x06,0xe9,0x30,0xed,0x11,0xdd,0xdb,0x15,0xc3,0x08,0x4f,0x59,0x8e,0xaf,0x30,0x29,0x81,0xdf,0xe9,0xe6,0xdb,0xf8,0x38,0x40,0x99,0x5d,0xeb,0xc9,0x0a,0x17,0x51,0xc8,0x1b,0xfb,0x0a,0xc1,0xf0,0x28,0xf7,0xa2,0xf0,0xc9,0x34,0xe6,0xc0,0x8a,0xf9,0x06,0x3c,0xe3,0xb9,0xf7,0x09,0xec,0xcd,0x39,0xd8,0x03,0xc3,0xf6,0x0c,0xe1,0x04,0xa2,0x12,0xc3,0xe9,0xd3,0x05,0x7f,0x55,0xd0,0xdb,0x5c,0x15,0xef,0xfc,0x16,0xcf,0xc8,0xd5,0x1f,0xfe,0x5f,0x02,0x51,0x0c,0x22,0xff,0xd7,0x2c,0xeb,0x34,0x19,0x51,0xfc,0xe5,0xed,0x37,0xfd,0xc5,0x1c,0xde,0xd3,0xf0,0xd4,0xf1,0x07,0xee,0x3c,0xf2,0xdc,0xf0,0xe3,0x0f,0x06,0x32,0x6d,0xef,0xc5,0xe4,0xda,0x96,0xfe,0xe1,0x56,0x00,0xda,0xf0,0x2f,0xd4,0xe6,0xe2,0x15,0xee,0xfc,0xec,0x3c,0x25,0xed,0x2e,0xcc,0xd5,0xe9,0x91,0xf8,0xff,0xf1,0x59,0xd8,0x0e,0xe4,0x18,0xd1,0xb6,0x42,0xef,0x06,0x02,0x02,0xce,0xe3,0xf9,0xe9,0xd7,0xe3,0xfb,0xd1,0x2d,0xf3,0x17,0xd5,0x37,0xd5,0x2b,0xf4,0xc7,0x00,0x1a,0x2e,0xff,0xff,0x0e,0xce,0x15,0x00,0x19,0x2f,0x12,0xf9,0x25,0x4a,0xd3,0xd6,0xed,0xa9,0xe0,0xd6,0xff,0x33,0xfb,0x51,0x0b,0xe5,0x4f,0xda,0x39,0x42,0xb4,0x34,0xee,0xd2,0x20,0xf9,0x50,0xd9,0xff,0xf2,0x77,0x12,0xf6,0x66,0x1e,0xe0,0xb9,0xfb,0xb7,0x2a,0xec,0x03,0x24,0xdc,0xed,0xfa,0xf4,0xd2,0xd6,0xd6,0xec,0xfb,0xf9,0x27,0x54,0xd9,0x43,0x0f,0xfb,0xfa,0x01,0xcf,0xf1,0x03,0x0b,0x3b,0xcd,0x56,0x14,0x29,0x00,0xb6,0x01,0x48,0xf9,0xf8,0x02,0xf4,0x44,0x7f,0xf1,0x1c,0xeb,0xac,0x18,0x14,0xd0,0x12,0xef,0x22,0xf1,0x04,0x09,0xf4,0xfa,0xc2,0x54,0xdf,0x31,0xe1,0x0a,0xf3,0xaf,0x18,0x06,0x36,0xd8,0x2d,0x14,0xbe,0xe9,0xe6,0xe4,0xfb,0x0f,0x2c,0x18,0x01,0x33,0xf8,0xeb,0xed,0xb8,0xf0,0x05,0x05,0xd7,0xe3,0xf5,0xf6,0x09,0x13,0x0e,0x02,0xfb,0xff,0xe4,0x08,0x17,0xf9,0x1f,0x13,0xe6,0xf3,0x7f,0x0c,0xae,0xe5,0x07,0xf4,0x27,0x25,0x45,0x08,0xc0,0xa9,0x0f,0x12,0x2b,0xe5,0x6f,0x26,0x28,0xe0,0x1f,0xee,0x39,0xeb,0x32,0x0a,0x12,0x28,0x16,0x05,0xe9,0xe8,0x16,0xe9,0x0a,0xfc,0x22,0xe9,0x06,0x00,0x3d,0x1a,0x2b,0x16,0xaa,0x0f,0xfe,0x01,0x11,0xda,0x2b,0xea,0xf3,0xc7,0x37,0xea,0xd7,0xef,0x2a,0xd1,0x26,0x3b,0xfa,0xbe,0x04,0xc3,0xd5,0xe6,0x65,0x4b,0x0c,0xfc,0x1e,0x32,0x1c,0x47,0xe8,0x19,0x05,0xd9,0x0e,0xe7,0xfc,0xff,0xb6,0xe4,0x1f,0x15,0x3a,0x0d,0xbf,0x07,0xf1,0x74,0xef,0x81,0xe6,0x38,0x23,0xe5,0x24,0xcc,0x11,0x38,0xec,0x3d,0xd1,0x02,0xdc,0xd2,0x0c,0x14,0x17,0xff,0xfc,0xe7,0x13,0xe1,0x0a,0xed,0x28,0x23,0x14,0xe5,0x5d,0xdd,0x02,0x46,0xe0,0xe2,0x2d,0xf6,0xfe,0xc9,0x0a,0xc4,0xe9,0xba,0xb2,0x27,0xc7,0xfc,0x45,0xc4,0x92,0xd0,0xaf,0x0e,0xc3,0x1a,0xfd,0xfa,0x00,0xc8,0xfa,0xb0,0xfb,0x10,0xd9,0x23,0x2a,0xe2,0x2c,0x50,0xf9,0x2a,0xe1,0xf9,0x1a,0xd0,0xe5,0xe2,0xfe,0xe9,0x3e,0x13,0x28,0xee,0xe1,0x29,0xff,0xc2,0x0d,0xe7,0x21,0x47,0xe5,0x51,0x0a,0xdb,0x8c,0xef,0x0e,0x2c,0xf1,0xeb,0x15,0x0e,0xf2,0x0f,0xfa,0xdd,0xaf,0x23,0x33,0xf0,0x10,0x3d,0x16,0x0b,0xff,0x46,0xdb,0xe7,0x12,0xa4,0x17,0x1e,0xbf,0xdc,0x20,0x12,0xea,0x1c,0x19,0x5d,0x71,0x32,0xe2,0xfe,0x01,0x35,0x3b,0xf8,0x8e,0xfe,0x3e,0x4b,0xd2,0xfb,0xcc,0xd9,0xc9,0xf2,0xf5,0x04,0x30,0x22,0xe0,0xf2,0xc0,0x05,0x05,0xd5,0xee,0x40,0xa6,0x91,0x40,0x58,0x20,0xce,0xa8,0xd6,0x61,0xec,0x1b,0xec,0xf3,0x42,0xb1,0xfd,0xd9,0xc3,0x92,0xd6,0xcf,0x1f,0xfc,0xd8,0x59,0x23,0x0b,0xc2,0xf1,0x55,0x05,0xf0,0x27,0x32,0x49,0x62,0x06,0x26,0x0d,0xfc,0xe0,0xcf,0x1f,0xcd,0x81,0xc1,0x05,0xeb,0x15,0xce,0x54,0x10,0xd3,0x57,0xd4,0xf4,0x29,0x10,0xe5,0x2c,0x3f,0xf4,0xa6,0xf5,0xed,0x06,0xf5,0x0d,0xcc,0xff,0x2b,0x0a,0xe5,0xe3,0x0c,0xe2,0x28,0x50,0x22,0x18,0xe0,0x0b,0xbf,0x0d,0x0e,0xec,0xdf,0xf9,0x10,0xf6,0x1c,0x0a,0xf3,0x17,0xe9,0xd2,0x3c,0x1c,0x16,0x06,0xe7,0x38,0xd0,0xed,0x05,0x1c,0xc5,0xf8,0xec,0x10,0xf7,0xc1,0xda,0x1b,0xda,0x0d,0xf5,0xe3,0x15,0xf8,0xea,0xdb,0xd4,0x21,0x07,0x10,0x19,0x45,0x66,0xd1,0x15,0x09,0x1f,0xec,0x19,0xd6,0x18,0x0a,0xe3,0xee,0xf5,0xf9,0xfb,0xdd,0x01,0xec,0x33,0xfe,0xed,0xd3,0xe0,0xf0,0x78,0x07,0xe9,0xf8,0xc9,0x7f,0x2d,0xbe,0xf5,0xf0,0x10,0x23,0x20,0x08,0xea,0xe9,0xb3,0xe7,0x0d,0xea,0x2f,0xef,0x1d,0xfd,0xff,0x01,0x0a,0x1c,0x09,0xd7,0x0f,0xf9,0x00,0xed,0xd0,0xf6,0xd4,0xdc,0x1b,0x0a,0xe9,0x38,0x06,0xed,0x32,0xf8,0xee,0x15,0xe1,0x13,0x1c,0x13,0x0b,0xbb,0x21,0x05,0x0b,0xcb,0xfe,0xf3,0xdb,0xf7,0xf5,0xd7,0x25,0xfb,0xd1,0x07,0x00,0xa8,0x12,0x1f,0x0b,0xd3,0x41,0x17,0xe7,0xfe,0xea,0x14,0xfc,0xf3,0x45,0xf8,0xcd,0x09,0x5b,0xc9,0xdb,0x9e,0xfd,0x2c,0x10,0x04,0x27,0x4c,0x08,0x0a,0xb6,0xe8,0xc1,0xda,0x03,0xaa,0x7f,0xfc,0xde,0xc1,0x2d,0xd9,0x13,0xe6,0x18,0x05,0xe8,0xee,0xfc,0x4c,0xcf,0xe4,0x1d,0xcd,0xbd,0xaf,0x04,0xda,0xf5,0xcc,0xfa,0x1e,0xea,0xdf,0xb7,0x03,0x43,0xfb,0xf7,0x42,0x53,0xac,0x09,0x02,0x41,0x42,0x04,0x05,0x26,0x82,0x98,0xe7,0x2e,0x28,0x16,0x01,0x43,0xe0,0xd4,0x34,0xf2,0xd9,0x20,0x60,0x00,0x15,0x1f,0x27,0xa9,0x33,0xcb,0x08,0x19,0xde,0xaf,0x21,0x24,0x06,0xec,0xfc,0x05,0x1b,0xcf,0xe4,0x3d,0x22,0xec,0xfa,0xd6,0x0b,0xf6,0x15,0xf8,0xf4,0x05,0xec,0xe9,0x32,0xe3,0x19,0x30,0x29,0xf8,0x15,0xf4,0xeb,0xae,0x4d,0x15,0x32,0xf8,0xf9,0xe5,0x19,0x08,0x2f,0xe1,0x31,0xf9,0x17,0xbf,0xee,0x11,0x14,0xb6,0x08,0x08,0xf2,0xd4,0x17,0xfb,0x2e,0x7f,0x09,0xea,0xdf,0xf9,0xff,0x0e,0xef,0xbc,0xe3,0xc4,0x37,0xf9,0xcf,0xca,0x03,0xcf,0x06,0x2c,0xc0,0x16,0xd6,0xc9,0x0e,0xe5,0x3c,0x02,0x5e,0x02,0x19,0x33,0x1c,0x02,0xf0,0xf0,0xf4,0x03,0x0a,0x6b,0x1f,0xf9,0xfa,0x06,0xe6,0x11,0x10,0x0d,0xde,0x22,0x10,0xb5,0x26,0xf7,0xfa,0xfd,0x16,0x7b,0xc1,0xf8,0x1c,0x10,0x0e,0xf4,0xfb,0xf8,0x0b,0xfa,0xf9,0x0a,0x45,0xcb,0xff,0x14,0x42,0xf6,0xec,0xdb,0x54,0x09,0x1b,0x35,0xd1,0x62,0xdf,0xdd,0xb4,0x2a,0x0b,0x41,0x19,0x2c,0xde,0xf1,0xf6,0xd6,0x5f,0xc0,0xd8,0x49,0xeb,0xe6,0x2e,0x0b,0xff,0x57,0x26,0x3e,0x0f,0xfd,0x21,0xe0,0x1e,0xc9,0x93,0x7f,0x18,0xfd,0xe8,0x1c,0x23,0x1f,0x51,0x17,0xc5,0xf1,0x16,0x03,0x24,0xf6,0xfa,0x1d,0xf1,0xea,0xf7,0x38,0x00,0xfc,0xc0,0xe7,0xfb,0x10,0x11,0xe2,0x01,0xe5,0xb7,0xfe,0x23,0xc7,0x0f,0x35,0x0f,0x63,0x05,0x31,0x04,0x0d,0xd9,0x06,0xdc,0x16,0x09,0x36,0x11,0x01,0x00,0x3d,0x15,0x11,0xdf,0xef,0xd1,0xf1,0xf5,0x04,0x28,0xd4,0x14,0xe5,0x0d,0xd7,0x14,0x47,0xfb,0xf8,0xd4,0xf7,0x39,0x05,0x14,0x26,0x19,0x1d,0xff,0x09,0x0e,0x02,0xfd,0xf9,0xc3,0x6f,0xcf,0xf7,0x50,0x00,0x3d,0x1e,0xed,0x11,0xeb,0x31,0x03,0x1e,0xf8,0xc3,0xe9,0x37,0xa6,0x2a,0x81,0xfd,0x11,0x1e,0xa5,0xbd,0xe6,0x06,0xe2,0xb9,0x0f,0x24,0xf2,0x13,0xca,0xb1,0xc8,0x17,0xa2,0xc3,0xe1,0x30,0xe6,0x1c,0x13,0x14,0xf8,0x1e,0x25,0x1f,0xd6,0x3c,0x02,0x04,0x44,0xea,0x22,0x22,0xd2,0xee,0xe8,0xfa,0x56,0x4f,0x6b,0xfb,0xf3,0x09,0x9a,0xdb,0x23,0x02,0xcb,0xc3,0x1d,0xd4,0x1c,0x02,0xfa,0x0a,0xff,0x13,0xe8,0x29,0x04,0x1c,0x48,0xe8,0x35,0x18,0x28,0xfa,0x16,0xed,0xeb,0x05,0xa0,0xca,0x11,0x4a,0xe1,0x25,0xd9,0x04,0x10,0x00,0x15,0x3c,0x1e,0x14,0xc0,0x3a,0x15,0x3e,0x1c,0xf4,0x0e,0x26,0xbe,0x23,0xff,0x07,0x24,0xd6,0xee,0xf1,0xdf,0x2c,0x07,0xe0,0xcd,0xee,0x0e,0xec,0x02,0xdf,0x28,0xff,0xc2,0x20,0x2b,0xcc,0x1e,0xdd,0xfe,0xf3,0x4e,0x07,0x1b,0x1a,0xea,0x44,0x16,0xc7,0xff,0x3c,0xb6,0xf4,0xef,0x58,0xe0,0xdc,0x36,0x15,0xcb,0xfd,0x63,0x08,0x04,0x68,0xd9,0x94,0xb1,0xee,0x49,0xf6,0xb5,0xf1,0x28,0xfc,0x37,0x84,0x07,0x35,0xdd,0x14,0x23,0x06,0xff,0x30,0x22,0x48,0xb8,0x41,0x0f,0x15,0x18,0xef,0xbe,0xa2,0xa5,0x7d,0xec,0xb9,0xf5,0xdd,0x72,0xfc,0x06,0x01,0x1b,0xda,0xc3,0xdb,0x15,0x0b,0x04,0xd1,0x05,0xe9,0xe2,0xd5,0x4a,0xe9,0x56,0x47,0x25,0xd3,0x7b,0x15,0xf5,0xf2,0x32,0x07,0xe9,0x7f,0x57,0xd5,0x29,0xf7,0x45,0x1a,0x17,0x00,0x14,0xae,0xd3,0x0c,0x19,0x10,0x3d,0xdf,0xf7,0x15,0xe2,0x0f,0xf5,0x02,0xe4,0xb3,0xf1,0xe4,0xb1,0xd7,0x2c,0x09,0x38,0x01,0x15,0xfc,0xcb,0x06,0x08,0x08,0xee,0x1b,0xd9,0xb7,0x10,0xfc,0x4f,0xc0,0xe1,0x1a,0x5f,0xad,0x52,0x42,0xe8,0xdf,0xd8,0xcc,0x7f,0x5a,0x3e,0x2e,0x14,0x3d,0xfd,0x38,0xd1,0xd9,0x13,0xfe,0x03,0xf8,0x4c,0xea,0x31,0x1b,0xef,0x16,0x3b,0xfc,0xc0,0xcc,0x67,0xff,0xde,0x1d,0x41,0x52,0xd3,0x26,0x10,0x0a,0x46,0x08,0x34,0x46,0xf1,0x4a,0x07,0x06,0xd8,0xdb,0x3d,0xf4,0xc8,0x65,0xbb,0xee,0xe1,0x18,0xe3,0xf3,0x11,0x4e,0x33,0x4e,0x07,0xfc,0xbd,0x0c,0x28,0xbd,0xfb,0xe2,0xe4,0xc4,0x01,0x24,0x0a,0xec,0xc7,0x09,0xab,0x41,0x06,0x0b,0x57,0xed,0x20,0xad,0x70,0xab,0x47,0xf1,0xb7,0xf8,0xab,0x47,0x19,0x37,0xdf,0x01,0x21,0x01,0x2e,0x2f,0xdb,0x1c,0x1d,0xce,0xd1,0x19,0x21,0xd2,0xfc,0x5c,0x52,0xee,0x1f,0xfe,0x3e,0x1f,0x23,0xd2,0xf2,0x03,0x0e,0xcc,0xfa,0x16,0x06,0x0b,0x07,0x0e,0x06,0x08,0x16,0xdc,0x17,0x01,0xc6,0x01,0x2a,0xb5,0xfe,0x25,0xe9,0x7f,0xe9,0xee,0xde,0xad,0x16,0x0d,0x04,0xbd,0xf2,0x24,0x1d,0x11,0xfe,0xb8,0xfa,0xd0,0xf2,0xdd,0x20,0xe2,0x12,0x12,0x0f,0x31,0x2d,0xc3,0xd3,0x0d,0x23,0x24,0xcb,0x19,0x07,0x20,0x21,0xdf,0x00,0x01,0x3f,0x26,0x1e,0x03,0x10,0xff,0x3a,0xf0,0xb4,0x32,0x11,0xe0,0x01,0x07,0xfe,0xde,0xeb,0xff,0xd0,0x07,0x0f,0xea,0x3a,0x02,0xf0,0x22,0x1c,0xf8,0x0a,0x10,0xea,0xf5,0x3b,0xed,0x0a,0x24,0xfd,0x01,0xd1,0xf5,0x07,0xfd,0x16,0xa7,0x21,0xd1,0xef,0x0d,0x19,0x13,0xd6,0x21,0x5e,0x10,0xe3,0xed,0x07,0x38,0xcf,0x43,0xd8,0x0c,0x0a,0x31,0xdb,0x52,0xc0,0xf9,0xcc,0xfc,0xe5,0xcc,0xd6,0x06,0xfb,0xad,0x24,0x2e,0xdc,0x9b,0xfb,0x35,0xf4,0xf1,0xe6,0x10,0xbe,0xe4,0x13,0xef,0x95,0xc5,0x45,0xdb,0x1e,0x5a,0x24,0xf5,0x0c,0xfa,0xfa,0xdf,0x3b,0xfe,0x41,0x35,0x00,0xd7,0xe8,0xf0,0xf1,0xae,0xc8,0xe7,0x5c,0x7a,0xa8,0x0f,0x34,0x57,0x29,0xe6,0x2a,0x23,0x47,0x25,0x04,0x24,0xc9,0x7f,0xee,0x29,0xfb,0xcd,0x3d,0x2a,0x32,0x2b,0xed,0x2f,0xe2,0x12,0x30,0x23,0xda,0x15,0x13,0xed,0x60,0x2e,0xdf,0x0d,0xef,0xa9,0x08,0xd1,0xe4,0x37,0xc1,0xfa,0x06,0x41,0x3f,0xe2,0x1b,0x59,0xdb,0xa1,0x20,0xae,0xf2,0xdc,0xa3,0xd6,0x0f,0xfa,0xfb,0xe7,0x33,0xff,0xf3,0x56,0x01,0x2a,0xd8,0x48,0x93,0xc1,0xc7,0x00,0xe7,0x37,0x06,0x00,0xf3,0xa3,0x50,0xc0,0xeb,0x23,0xc3,0x1f,0xc6,0xf9,0xfd,0xb8,0xf3,0xe3,0xc7,0xdc,0xe3,0xea,0xdb,0xd4,0xcd,0xb2,0x06,0xd5,0x22,0xd5,0x28,0xee,0x2a,0x7f,0x3f,0xdb,0xf1,0xea,0xf2,0x2a,0xb3,0x10,0x1a,0x19,0x4d,0xe5,0xe5,0xd9,0xb9,0x9e,0x12,0xe6,0x3e,0xd4,0x1c,0xf9,0xd2,0xed,0x32,0x2e,0x3e,0xdc,0x17,0xd5,0xd1,0x08,0x02,0x12,0x2a,0xeb,0xec,0x0c,0x08,0x1f,0x1e,0x03,0xd0,0x23,0x17,0x9c,0x09,0x1d,0xf1,0xd7,0x05,0x27,0x1e,0x04,0xd9,0xf9,0xde,0xe7,0x3a,0x37,0xc8,0x09,0x50,0x14,0x0a,0x05,0x17,0x09,0xb3,0xcc,0x20,0x1b,0x26,0x11,0x5d,0x15,0xf0,0xff,0x0d,0x05,0xc7,0xde,0xe5,0x09,0xde,0x27,0x23,0x0a,0xf3,0xb3,0xff,0x00,0x42,0xd0,0xe6,0x0a,0xee,0xe2,0x42,0xc7,0xd7,0x37,0x4d,0xca,0x03,0x0d,0x12,0xcf,0x0f,0xb7,0x15,0xf4,0xbf,0xea,0x3a,0xf3,0x19,0xf0,0x28,0xe7,0x0e,0x04,0xd4,0xe0,0x05,0x02,0xd6,0xf9,0x36,0xfc,0xe4,0xf4,0x09,0x1d,0xbf,0xcb,0x06,0xe0,0xca,0x00,0xee,0xd6,0xea,0xf4,0xce,0x18,0xfb,0x32,0x1d,0x02,0xf5,0xe3,0xe6,0x16,0x41,0xe5,0x4f,0x38,0x05,0xe4,0xda,0xf8,0x81,0x01,0xaf,0xfc,0x06,0xb4,0x2c,0x0c,0x1a,0xda,0xfc,0xaf,0x26,0xec,0xe6,0xed,0x16,0x02,0xf9,0x29,0x13,0xda,0xbb,0xe1,0x20,0xcf,0x0a,0xfc,0x01,0x36,0xcd,0x47,0x00,0xdb,0xff,0x08,0xf4,0xfc,0x2a,0x52,0xfb,0xf1,0x03,0xd3,0xee,0xd3,0xdf,0xe0,0x07,0x2e,0xe7,0xda,0xfd,0x0a,0x27,0xcf,0x09,0xf0,0xbd,0xec,0xf8,0xea,0x03,0x22,0x3f,0xda,0x07,0xe8,0x28,0xd7,0x12,0x0c,0x03,0x11,0xf3,0x2e,0xd2,0xe3,0xe1,0x4d,0xe6,0x06,0xe8,0xde,0xed,0xc1,0x36,0xe6,0x17,0xd6,0xf4,0xd0,0x04,0xfe,0xfb,0xea,0x02,0x45,0xc8,0xb5,0x54,0xfe,0xde,0xf6,0xf9,0xec,0x0d,0xd7,0xf5,0xc4,0x81,0xc8,0x29,0x11,0xc4,0x1a,0x1c,0x19,0x32,0xd1,0xbe,0x0f,0xfc,0xf6,0x50,0xe5,0x4a,0x31,0x03,0x06,0xee,0x1d,0x54,0x0c,0xf6,0x3a,0xc2,0xe7,0x25,0x2d,0x18,0xf9,0xfe,0x07,0xe5,0x0d,0xc0,0xac,0x4b,0xe7,0xa0,0xad,0x34,0x50,0x45,0xdc,0xe9,0xe3,0x18,0xcc,0xb9,0xfe,0xc2,0xf2,0xf8,0xe7,0x07,0x4c,0xea,0x53,0xfe,0x14,0xed,0x08,0xd2,0x5d,0x31,0x0f,0x15,0x05,0x01,0xc7,0x03,0x0b,0xc6,0xff,0xde,0xf5,0x9c,0xc5,0x19,0x41,0xf9,0xf0,0x0d,0xdd,0xdf,0x24,0x0c,0x90,0x17,0x4e,0xd9,0xce,0xd9,0xc8,0xd7,0x0e,0x09,0x3c,0x0b,0xb7,0xea,0xf2,0x3f,0xc4,0xa8,0xd5,0x02,0xdf,0xda,0xe5,0xf9,0xfe,0x19,0x0c,0xd2,0x07,0x0d,0xb7,0x4b,0x1e,0x10,0x08,0xf5,0x45,0xf3,0x04,0x3c,0xdc,0xe9,0xde,0xec,0xc1,0x05,0x1a,0xd4,0xff,0x10,0xbf,0x3f,0xf7,0x2b,0x17,0xea,0xe6,0xdc,0x16,0x24,0x0d,0x07,0x0e,0x3c,0xf4,0x21,0xcc,0x09,0xcc,0x42,0x26,0xc8,0xcc,0xfd,0x19,0xef,0xef,0x07,0xf6,0xfe,0x0e,0x2f,0x31,0x43,0xfe,0x29,0xc1,0xcf,0x35,0xc1,0x10,0xff,0xce,0x22,0x07,0x0d,0x13,0xee,0x7f,0x13,0x00,0x02,0xef,0x06,0xf0,0xde,0x1a,0x1c,0xe7,0xfa,0xcd,0x17,0x23,0xc3,0xba,0xfe,0xba,0xea,0x21,0x09,0x20,0x00,0x22,0xf7,0x15,0x46,0xbd,0xce,0xc2,0xfb,0x12,0xf2,0xf0,0x52,0xd3,0x0f,0x45,0xde,0xe9,0xe8,0x1f,0x0b,0x02,0x2c,0xe1,0xea,0x54,0x03,0x0f,0x0d,0xd7,0xf3,0x13,0x36,0xfc,0xd2,0xc2,0xe6,0xed,0xa1,0x81,0xdd,0x22,0xd0,0x31,0xa8,0xd2,0xcb,0x39,0x10,0xb7,0xea,0x99,0xb6,0xde,0xe7,0x1c,0x28,0xf7,0x07,0x27,0xe2,0xf3,0x60,0xe9,0x11,0x22,0xfa,0x0f,0xe5,0xd8,0xe4,0x19,0xeb,0x04,0xcd,0x0c,0x8e,0x63,0x07,0xf0,0xe4,0xc6,0xda,0x3e,0x31,0xe0,0x30,0xcf,0xe2,0x04,0xec,0x69,0x4b,0xa9,0x0d,0xc2,0xf3,0xc9,0x25,0xec,0xe4,0x25,0x18,0x64,0xf4,0x2c,0xea,0xe1,0x18,0x33,0x07,0xd9,0x22,0x08,0x0c,0x26,0x03,0x2c,0x0f,0x15,0x0f,0x3b,0xc2,0xe2,0xf6,0x52,0x12,0xcd,0xd3,0xda,0x1d,0x35,0x41,0xd9,0x2d,0xfe,0xe4,0x0b,0x0d,0xa8,0x15,0x03,0xce,0x14,0xbe,0x2c,0x81,0xd7,0xfa,0x2e,0xaa,0x4f,0xe0,0xc9,0x0f,0x0f,0xde,0x17,0x2f,0x37,0x4b,0xf7,0xfc,0x07,0xe8,0x0c,0x06,0x02,0xeb,0xbd,0xb5,0x0c,0x2d,0xd3,0xc4,0xf0,0xd8,0xf4,0xe0,0xcf,0x1c,0xfc,0x3e,0xc6,0xf1,0x43,0x30,0xca,0x0e,0x0d,0xd2,0xdb,0xbe,0x4e,0xce,0xfb,0xe1,0xed,0x0d,0x71,0xe5,0xe7,0x42,0xb9,0x0a,0x42,0x05,0xef,0x27,0xc9,0xe1,0x07,0x24,0xff,0x2f,0xe9,0xf2,0x0e,0xfb,0x2a,0xba,0x3e,0xe8,0x1e,0xcc,0xfd,0xe7,0x0f,0x29,0x1c,0xba,0xda,0xe0,0xea,0xea,0xd6,0x24,0xe2,0x2f,0xb6,0x1d,0x62,0xe9,0x6c,0xea,0x05,0xd8,0xd9,0x26,0x12,0x0a,0x21,0xd7,0xf6,0xe2,0x0a,0xee,0x0a,0xf7,0x0d,0x51,0xdb,0x01,0xcc,0xee,0x05,0xf6,0xf8,0x2c,0x1c,0xea,0xdf,0x28,0xc8,0xa6,0xa5,0x21,0xf9,0xa6,0x49,0x1c,0xb8,0x2f,0x0a,0x81,0xd4,0xeb,0xe3,0x17,0x02,0xd4,0x0d,0x25,0xb0,0x00,0x19,0x56,0x7f,0xff,0xf9,0xe4,0x33,0x2e,0xf3,0x1c,0xe3,0xfa,0xf3,0xf9,0xed,0xe6,0xed,0xfb,0x3b,0x29,0x21,0xdf,0x0f,0xc8,0x1b,0x06,0xd1,0x01,0x01,0xbb,0x0c,0x25,0x55,0x14,0xe0,0x35,0xdb,0xd8,0x29,0x09,0xd8,0x56,0x08,0xfa,0xdd,0xfa,0xeb,0xf4,0xe9,0xe1,0xab,0x08,0xf2,0xfc,0xd3,0xf8,0x0d,0xf0,0xcf,0xe4,0xe3,0xf8,0xf4,0xba,0x22,0x15,0x00,0xe6,0xdf,0xf9,0x1a,0x55,0xff,0xef,0x41,0xc9,0x79,0x19,0xcd,0x29,0xc1,0x16,0xf1,0x27,0x23,0xe5,0xf8,0xf2,0x0b,0x43,0xfa,0xe1,0x10,0xf9,0xed,0x0c,0x27,0x06,0xd9,0xd9,0x0c,0xde,0xf6,0x24,0x0e,0xe7,0x21,0x0b,0xe6,0xfe,0x2f,0xe9,0x0e,0xf9,0x3f,0xf7,0x26,0xdc,0x21,0xe9,0xcc,0xf7,0xda,0xda,0xec,0x20,0x21,0xe3,0xf0,0x3c,0x1e,0xcb,0xf7,0xf6,0x47,0x15,0xa9,0xb9,0xd7,0x1a,0xea,0xe0,0xd7,0xdc,0x30,0xe8,0x22,0x12,0x39,0x0f,0x1b,0xff,0xf6,0x02,0xc5,0x3f,0x27,0xdf,0xcd,0xe0,0x06,0x36,0x00,0xef,0x0f,0xe8,0xe2,0x2e,0x18,0x24,0xe5,0xc6,0x0b,0xdf,0xf6,0x0d,0xde,0xd6,0xc9,0x3f,0xf1,0x26,0x0d,0x10,0xf2,0x06,0xe9,0xd2,0x10,0xe1,0x37,0xd8,0x26,0x21,0x03,0x0b,0x7f,0xfc,0xe6,0x0e,0x20,0x19,0xf0,0x0e,0x07,0x07,0x1f,0x0c,0xcb,0xdd,0x03,0xa2,0xea,0x23,0xd1,0x21,0x07,0xf4,0xd0,0xfd,0xff,0x22,0x23,0x0c,0x28,0xe1,0x03,0x75,0x24,0x41,0xd3,0xef,0x34,0xfc,0x48,0x2a,0xd5,0xd8,0xe0,0xe4,0xda,0xdd,0xf6,0x27,0xc7,0x07,0x13,0x17,0x08,0x27,0x22,0x19,0xf5,0xf9,0x16,0xf8,0xe7,0x20,0xdf,0x10,0x18,0xe1,0xba,0xc5,0xf4,0xee,0x3e,0xe1,0x0d,0xd7,0xfe,0x17,0x01,0x48,0x25,0xd3,0x0d,0xd4,0x39,0x07,0x0d,0xff,0xf5,0xf4,0x37,0xf3,0x0f,0x36,0x10,0xbc,0xea,0xe5,0x22,0xed,0x1a,0x0f,0x18,0xfa,0xdf,0x30,0x04,0x11,0xea,0xba,0xb0,0x7f,0x35,0xe2,0xea,0x20,0xdc,0x10,0x0f,0x01,0xcc,0xc6,0x31,0xc3,0x07,0x28,0x1d,0xfd,0xf0,0x03,0x13,0x1b,0xc1,0xff,0x3c,0xe2,0x01,0xcb,0x25,0x2b,0xe0,0xf7,0x04,0xcf,0xea,0x08,0xfb,0x0d,0xf3,0x3a,0xea,0x11,0x3b,0xe5,0x1d,0x1b,0xdd,0x23,0x0b,0x11,0xe8,0x07,0x01,0x1b,0x87,0xfc,0x23,0xd7,0x10,0xed,0x31,0x0e,0x03,0x01,0x0c,0xfe,0xcf,0xeb,0x13,0xdc,0x22,0x2c,0x09,0xd4,0x2c,0x04,0xff,0xe3,0xec,0x45,0xfb,0xab,0xed,0xfb,0xf1,0x06,0xf0,0x8e,0x13,0x1c,0xb2,0xd6,0x7f,0x0d,0x25,0xc3,0x07,0x6c,0xd3,0x4d,0xe4,0xf7,0xbf,0x5d,0xfb,0xd7,0x14,0xde,0x18,0x1c,0xd6,0x30,0x45,0xb3,0xca,0xde,0x56,0xe9,0x20,0x21,0xf0,0xea,0xeb,0xe7,0xf7,0xf2,0xc0,0xe7,0x15,0xdf,0x48,0x21,0x1a,0xf8,0x2c,0x2c,0xf3,0xd4,0x3e,0x00,0x32,0xdb,0xdc,0xea,0xd1,0xf6,0xe6,0xed,0xef,0x0d,0xde,0x17,0x5d,0x20,0x19,0xa4,0x00,0xf7,0xa6,0x04,0xab,0xf2,0xe6,0xf7,0x59,0xdc,0x1e,0x4e,0x32,0x26,0x38,0x3a,0xe8,0xe7,0x31,0x3e,0xfe,0x36,0x04,0x31,0x3a,0xe4,0xd8,0xea,0xbf,0x21,0x20,0xdb,0x01,0x69,0x9d,0x3f,0xd1,0x4f,0xbe,0x07,0xef,0x20,0xa6,0x24,0xf6,0x04,0xff,0x07,0x11,0xd1,0x0d,0xe0,0xfa,0x0c,0xaf,0xe7,0x00,0x02,0x82,0xe2,0xd1,0xf3,0x22,0xab,0x00,0xae,0xb6,0x19,0x09,0xdc,0xce,0xf4,0x40,0x3e,0x06,0x02,0xac,0xc2,0x40,0x13,0x09,0x1f,0x1f,0x54,0xe3,0xe3,0x0c,0xff,0x0c,0xf6,0xb3,0x19,0xd5,0x00,0x6a,0xd8,0x1e,0xf5,0x1b,0xf0,0x0d,0xfe,0xdf,0x0c,0x20,0x7f,0x50,0x41,0x0a,0xf8,0xed,0xe2,0x1c,0xe5,0x0d,0xed,0xe4,0xbc,0x11,0x4e,0xc4,0xd9,0x11,0xfa,0x16,0xe4,0x1a,0x15,0x45,0x1c,0xdb,0x06,0x03,0xc3,0xcf,0xf5,0xfd,0x7f,0xf2,0xfa,0x03,0x3a,0xe4,0xd2,0x23,0x43,0x37,0x16,0x20,0x0b,0x1e,0xd3,0x2b,0xde,0xce,0xc9,0xe7,0x2d,0xe7,0x18,0xbb,0x09,0x0f,0x18,0x08,0xd1,0x3c,0xff,0x6c,0xc4,0x17,0xa7,0xff,0xb4,0x58,0x28,0x00,0xfe,0xfc,0xc5,0xfa,0x07,0x32,0xb1,0xe3,0x0c,0x31,0xde,0x4d,0xc3,0xf1,0xf0,0xe0,0xe1,0x21,0x1c,0x02,0x0e,0x38,0xe8,0x09,0x21,0xf2,0x36,0x47,0x06,0xd6,0x2d,0x18,0xd2,0x12,0x0d,0x35,0x13,0x2e,0x05,0xcb,0x16,0xfc,0x05,0xd7,0xff,0xd3,0xe9,0xdd,0x01,0x11,0x05,0xff,0x03,0xbf,0x10,0x26,0x1d,0x59,0xd4,0x03,0xca,0xea,0xa5,0x3a,0x2b,0x07,0x09,0x20,0x08,0xd9,0x0a,0x25,0x01,0x00,0x26,0x1a,0xf2,0xfa,0xea,0x1d,0xdc,0xe1,0xf0,0xc1,0x26,0x18,0xf0,0xe1,0x14,0xfd,0xe4,0x10,0x35,0x00,0x48,0xce,0xeb,0xeb,0xe6,0x1f,0xfd,0xe2,0xfa,0x0b,0xd8,0xcd,0x08,0x2b,0x14,0xda,0x2c,0xdb,0xdd,0x05,0xe4,0x40,0xc2,0x04,0xf1,0xe0,0x2a,0x39,0x20,0xe3,0xf2,0x12,0xe5,0xf5,0xf7,0xc2,0xd6,0xb5,0x23,0x0f,0x1a,0xef,0x1b,0x05,0xf6,0xe8,0x07,0xd3,0x1b,0x34,0x92,0x2c,0xec,0xa4,0x09,0xd5,0xcc,0x07,0x41,0x06,0x1d,0x28,0xd0,0x0d,0x65,0x01,0xfc,0xfd,0x1b,0x0f,0x18,0x81,0x2c,0x6a,0xf6,0xfb,0x04,0x63,0xd7,0x24,0xcd,0xa0,0xfc,0xd4,0x01,0xdb,0x20,0x25,0xc8,0xf2,0xea,0xb8,0x04,0xe3,0xe7,0x27,0xce,0x1e,0x30,0x08,0xfe,0x04,0x09,0xdf,0x1a,0x2b,0xe5,0x01,0xe6,0x1d,0x1f,0xfd,0x34,0x1b,0xdd,0xf0,0xb8,0x5e,0xe3,0xe7,0xb6,0xc8,0xe8,0x12,0x14,0xa4,0x44,0xf8,0xf1,0x2c,0xb0,0xf7,0x3e,0x2b,0xf7,0xf7,0xe9,0x59,0xc1,0xda,0xbe,0xca,0xb3,0xf4,0xdb,0xc8,0x8b,0xbb,0xc1,0x48,0xe7,0xab,0xfd,0x9d,0x44,0x34,0xef,0x1c,0x33,0xdd,0x2c,0x0c,0xdf,0x62,0xac,0xe2,0xe2,0xc8,0x39,0x9f,0x38,0x47,0xf8,0x17,0x81,0x26,0x46,0x9f,0xd6,0x51,0xc6,0x11,0xed,0x63,0xc1,0xf3,0xe8,0x14,0xf3,0x14,0x2e,0x23,0x1c,0xec,0x41,0x65,0xf3,0xff,0xc5,0x36,0x20,0x0c,0xd9,0x09,0xe7,0xfb,0xfc,0xe9,0x39,0x8f,0xe1,0xbf,0x40,0x1c,0x19,0x07,0x0c,0x02,0x0f,0xff,0x2f,0xac,0x30,0x45,0x1d,0x35,0xb1,0xd5,0x0d,0xc5,0xe3,0x2e,0x01,0x28,0x14,0x67,0x29,0x10,0x41,0xee,0x01,0x56,0xd0,0xd6,0x48,0x1a,0xd7,0x1d,0xe0,0x07,0x0a,0x16,0xe5,0x01,0xf6,0xe8,0xee,0xf4,0x00,0x20,0x02,0xf7,0x03,0x07,0xdb,0x07,0xc7,0x2d,0x1d,0x03,0xf9,0x03,0x09,0xf5,0xd7,0xf5,0xd6,0xed,0x19,0x21,0xfa,0xec,0xe4,0xef,0xb0,0xcf,0x1c,0xc4,0x09,0x0d,0xbb,0x23,0x26,0x0f,0x0d,0xec,0x2f,0x0c,0xf0,0xc1,0x14,0xbc,0x13,0x45,0x17,0xdc,0xf9,0xeb,0x14,0x05,0xef,0xfe,0xd2,0x45,0x03,0x15,0x09,0xd8,0xda,0x29,0xe6,0x07,0xef,0x12,0xe0,0x01,0x2f,0x7f,0xec,0xfd,0xd1,0x03,0x2f,0xeb,0xff,0xba,0xe0,0x08,0x12,0x0f,0x4f,0x47,0xed,0xc4,0xc4,0xdc,0x2f,0x09,0x2b,0x08,0x1e,0xdd,0x35,0xd8,0x09,0xfa,0xe6,0x1c,0xd8,0xff,0xd0,0x04,0xda,0x1a,0x37,0x1d,0x2a,0xe6,0xc6,0xf7,0x32,0x41,0x1d,0xd5,0x3a,0xde,0x43,0x07,0x3d,0xfb,0x0b,0xd4,0x22,0xc9,0x2f,0xe5,0xd5,0x0f,0x24,0x0b,0xc8,0xe8,0x1f,0x1f,0x57,0x9e,0x2f,0x30,0x88,0xf9,0x2d,0xd7,0xb3,0x1c,0x84,0x2c,0xc3,0x07,0x32,0x3a,0xb6,0xd6,0xca,0x13,0x02,0xcf,0xe1,0xaa,0xd0,0xd9,0xed,0xc7,0xfe,0x09,0x09,0xd0,0x1e,0x6d,0x56,0x37,0xef,0xd9,0xed,0x1a,0xe7,0xbe,0x56,0xf3,0x0a,0x48,0xda,0xf0,0xd3,0x2a,0xe6,0x12,0x7b,0xe0,0xbe,0x25,0x0f,0x1e,0xdb,0x58,0xed,0xec,0x12,0xc4,0xf4,0xc0,0x29,0xee,0x11,0xdc,0xd2,0x19,0x37,0x1e,0xf1,0x4d,0xdd,0xf4,0x88,0xa3,0x32,0xd8,0xab,0xc1,0x0e,0x27,0x6c,0x20,0x36,0x29,0x06,0x08,0x31,0x1d,0x35,0x7f,0xfe,0x24,0x4b,0x17,0xcb,0x19,0x03,0x21,0x05,0x0c,0x34,0x60,0x18,0x02,0xd4,0xf6,0x0e,0xfe,0xdd,0x4f,0x1c,0x83,0xe8,0xbe,0xba,0x48,0x30,0xfa,0xf3,0x0d,0x13,0x47,0x36,0x13,0x34,0x1c,0x3e,0xb4,0x4b,0xa1,0xb9,0xf4,0xf9,0x0a,0xe3,0x2b,0x36,0xa2,0xce,0x32,0x29,0x11,0x10,0x3a,0xa0,0x28,0x6f,0xca,0xfc,0xf0,0xb0,0xdb,0xe9,0x10,0xfb,0xf4,0xef,0x53,0xc2,0xf6,0x45,0x2d,0x14,0xf8,0xdf,0xce,0x17,0xa7,0xf3,0x12,0x81,0x38,0xac,0x10,0xd6,0xf9,0xef,0x43,0x0d,0x0c,0x1c,0xea,0x1d,0x3f,0x1f,0xc2,0xe2,0xf6,0x00,0x1a,0xe9,0x2a,0x02,0x1c,0xec,0xf5,0x04,0xd1,0x18,0x21,0x11,0xe7,0x32,0xb1,0x1d,0x21,0x1c,0xf5,0xdc,0xf8,0xe7,0xe9,0x38,0x5a,0x08,0xf1,0x2d,0xbb,0x08,0xe6,0x08,0x13,0x2e,0x07,0x35,0x34,0xff,0x11,0xfb,0x09,0xf3,0x0d,0x5b,0xef,0x37,0x38,0x0c,0xe5,0x2b,0xcd,0x11,0x4a,0x03,0xf5,0xf6,0x01,0xfc,0x22,0xc2,0x0a,0xd7,0xdb,0xee,0xf9,0xe8,0x07,0xfa,0xdf,0xf9,0xe5,0x36,0x1a,0x07,0xd9,0xe7,0xd4,0xff,0xde,0x02,0x60,0xf8,0xeb,0xe8,0xc7,0x3d,0xf3,0xf8,0x0c,0xc9,0xe8,0x28,0x2e,0x1e,0x15,0xf0,0xec,0x32,0x06,0x39,0x4c,0x0a,0x36,0xc7,0xd8,0xeb,0x52,0xe2,0xda,0xaf,0xfe,0x23,0x0b,0x02,0x43,0x19,0xda,0x09,0xed,0x05,0x0f,0x0d,0x29,0xeb,0xd8,0x40,0x0e,0xd5,0x30,0xf8,0x46,0x0b,0xfe,0x1e,0x03,0xe5,0xef,0x38,0xd5,0x05,0xbd,0x07,0xb0,0xe2,0x4a,0xc5,0x06,0xa3,0xeb,0x7f,0x28,0x02,0xba,0x2c,0x1b,0xeb,0xe8,0xdd,0xfa,0xf8,0x1a,0x03,0x69,0xfe,0x0b,0xcb,0x26,0xf5,0xfb,0x33,0xb2,0xd9,0x18,0xcc,0xe6,0x4d,0xde,0x11,0x0f,0x10,0x0d,0x26,0xa3,0xfc,0x10,0x22,0xd9,0xdb,0x11,0xec,0x06,0x36,0x42,0x14,0x33,0xe8,0x1a,0xe2,0xcd,0xeb,0x1d,0xbc,0xcb,0x37,0xc3,0xf7,0xbb,0x1c,0x0b,0x0c,0x05,0xb7,0xb4,0x6c,0xc0,0x0f,0xf3,0xe7,0xf2,0x05,0xff,0xde,0xde,0xc9,0xe8,0xd2,0xdd,0x1a,0x18,0x36,0x25,0x27,0x24,0x08,0x18,0xed,0x19,0x05,0xdc,0x1f,0x19,0xed,0x16,0xe5,0x3e,0x04,0xef,0x07,0xfa,0xf7,0xcf,0x0f,0x04,0x7f,0xf9,0x1a,0x0d,0x23,0xd7,0x33,0xdc,0xdf,0xd5,0x06,0x05,0xe5,0xb1,0x48,0xe9,0xfa,0x1a,0x1c,0xbe,0x51,0x03,0x15,0xf0,0xfe,0xfd,0xdf,0xb0,0xe5,0x0b,0xf8,0xfb,0x44,0xac,0xf2,0xe0,0x5b,0x07,0x6f,0xdb,0xfd,0x21,0x06,0x24,0xee,0x42,0xe1,0x0f,0xb2,0xb8,0xea,0xb3,0xf7,0xf9,0xf7,0x2f,0xd2,0xab,0x0c,0x0d,0x09,0x21,0x9d,0x59,0xc7,0x07,0xdb,0x15,0xfd,0x21,0xf2,0x49,0xc8,0x12,0xdb,0x70,0xdb,0x09,0x2f,0x6e,0xbe,0xc7,0xb1,0xf2,0xfd,0x1e,0xef,0x0a,0xe8,0xcb,0xeb,0x39,0xf7,0x06,0x9d,0x1b,0x3e,0xb0,0xe5,0xed,0xe5,0xf7,0x13,0x01,0x43,0x7f,0xcd,0xfd,0xf5,0x6a,0x35,0x08,0xdd,0xf8,0xf5,0x1b,0xe6,0xd9,0xd5,0xf5,0xef,0xdc,0x12,0x61,0x41,0x4b,0x09,0x04,0xcb,0x03,0xfd,0xc2,0xe0,0x85,0xea,0xba,0xf7,0xfd,0x6b,0xc0,0x26,0xc8,0x0a,0xce,0xe2,0xfe,0xfe,0xb2,0x59,0x08,0xc9,0x31,0x2d,0xef,0x57,0x06,0xe0,0x48,0x95,0x73,0x29,0x49,0xea,0x77,0x31,0x3b,0x24,0x55,0x34,0x2e,0xc1,0x23,0x26,0xe7,0x1d,0x50,0x1a,0xb7,0xe9,0xbd,0x49,0x20,0x29,0xe3,0x0f,0x7b,0x0f,0xed,0x2c,0x64,0xa7,0xda,0xfa,0xef,0x21,0xbf,0x05,0xff,0x99,0xe1,0x5c,0xcc,0xd8,0xd6,0xea,0xc0,0x34,0x1f,0xad,0xe1,0xe6,0xc9,0xdc,0xbb,0x19,0xec,0x31,0x11,0x04,0xd8,0x50,0xf1,0xdf,0x68,0x06,0xca,0x5d,0x1d,0x68,0xd5,0x2c,0x2f,0xcf,0x91,0xbc,0xc4,0x0f,0xb4,0x5c,0x68,0xd0,0x14,0x46,0x42,0x85,0x21,0x12,0xf5,0x24,0xf6,0xda,0x2b,0xd7,0x69,0xc7,0xd9,0x42,0xe9,0x1e,0x9f,0xfd,0x4f,0x05,0x0f,0xe8,0x0f,0x4e,0x21,0xd2,0xc7,0x87,0x6e,0x64,0x5d,0x3e,0x23,0xd9,0xc7,0x05,0xda,0x0f,0xec,0xfc,0x88,0xb5,0x0c,0xec,0xe2,0xb1,0x09,0xbf,0x21,0x0f,0xfc,0x3d,0xb6,0xf9,0x29,0x05,0x7f,0x28,0xe9,0x03,0xf7,0xf1,0x0f,0xfa,0xcc,0xec,0x01,0xda,0xf1,0xc1,0xe0,0x5d,0x47,0x05,0xfb,0x16,0xe7,0x16,0x20,0x1d,0xdd,0xdd,0x2b,0x5a,0x1b,0x45,0x67,0xfb,0x00,0xe7,0xd9,0x1b,0xed,0xe3,0x17,0x1d,0x59,0x1c,0xd2,0x56,0x7f,0xeb,0xfe,0xcc,0xe9,0xfc,0x1a,0xcc,0x37,0x27,0xec,0x30,0x16,0x41,0xc1,0x29,0x8c,0xe4,0x01,0x36,0xe0,0xfe,0x16,0x1b,0x17,0xb5,0xfb,0xe6,0x8b,0xed,0xf9,0xe6,0x11,0xe5,0x2a,0xec,0xd3,0xf1,0xdd,0x0f,0xc9,0x38,0xc4,0xdf,0xc7,0x0a,0xcb,0x12,0x32,0x59,0x17,0x4b,0x1f,0xe6,0x03,0x1a,0xda,0xe6,0x3d,0x36,0x11,0x14,0xc1,0xa6,0x2e,0xd2,0xf8,0x1e,0x06,0x37,0x16,0xca,0xdd,0x3a,0x25,0xee,0x42,0xb7,0xe3,0xdf,0xfd,0xdf,0x29,0xed,0xa3,0x20,0xc2,0x37,0x95,0x57,0xea,0x0c,0x0e,0x08,0xf3,0xf9,0xf9,0x9a,0x1c,0xb6,0x04,0xdd,0x14,0xea,0x06,0x96,0xeb,0x60,0x26,0xc6,0x7f,0x01,0xe2,0xb4,0x21,0xb9,0x38,0x41,0x1d,0x3b,0x22,0x6e,0xe0,0xc4,0xa3,0x1e,0xd5,0xf5,0xa8,0x46,0xb8,0xf5,0x1f,0x20,0xfa,0x73,0xe5,0x9a,0xcb,0x68,0x06,0x79,0x59,0xf9,0x37,0x2f,0x0b,0xa9,0xbf,0xb9,0x3f,0x0b,0xca,0xaa,0x1f,0x05,0x1e,0x41,0x05,0x08,0x0f,0xfb,0xc5,0x32,0xb4,0xc8,0xf4,0x05,0xf1,0x93,0x0a,0x4c,0x46,0xfe,0xbd,0x3a,0xc2,0xc3,0x4e,0xbe,0xcb,0xd7,0xa9,0xc6,0xe5,0xed,0x95,0xdf,0xfa,0x32,0xf2,0xc6,0xfd,0x95,0xe9,0x45,0x0c,0x13,0x17,0x01,0xcf,0x23,0x23,0xd8,0xc9,0x05,0xac,0x21,0xac,0xc0,0x2e,0xec,0xe7,0x3c,0xf9,0xdc,0xde,0x0f,0xe8,0xf9,0x27,0xbe,0xd7,0x06,0xfe,0xdb,0xa6,0xd4,0xc1,0x0e,0x07,0xd9,0x2b,0xe4,0x07,0xff,0xef,0xe5,0xdd,0xb6,0x4d,0x81,0x06,0xeb,0x48,0xe3,0xea,0xd0,0xee,0x5f,0x3f,0xb8,0x21,0xf1,0xb7,0x0b,0x2c,0x17,0x07,0xcd,0xe7,0xfe,0x34,0x0b,0xfd,0xc8,0x0e,0x66,0x1b,0x4a,0xfa,0xb1,0xfc,0xee,0x5c,0xd1,0xd4,0x1e,0x12,0xb0,0xcb,0x22,0x15,0x03,0x02,0xf3,0x0f,0x91,0x0a,0x03,0x2f,0xbf,0xd4,0x0a,0xc3,0xef,0xa3,0x0b,0xf9,0xf0,0x46,0x06,0xcc,0xfd,0x04,0x11,0xec,0xd6,0x61,0xee,0xd3,0x20,0x60,0xe5,0xff,0xc7,0xfc,0xf4,0x63,0x29,0xd8,0x2f,0xff,0xe9,0xfd,0x15,0xff,0x0c,0x25,0x1a,0x36,0x11,0xd3,0xc5,0xf1,0x47,0xec,0xf4,0xd8,0x11,0x41,0xe5,0xf2,0xa8,0xea,0x1a,0x0e,0xf8,0x2b,0xf9,0x1d,0xc6,0x3f,0x3b,0xb6,0xd5,0x95,0x05,0x0e,0xe2,0xf2,0xb1,0x03,0xf2,0x36,0xb3,0x3b,0x24,0x1a,0x2c,0xe2,0x5c,0x37,0xe4,0xcb,0x01,0x2d,0xe6,0xee,0xe9,0x23,0xe5,0x08,0xa6,0xb4,0xfe,0x90,0xdf,0xf0,0x36,0x21,0xbd,0xb6,0x08,0x07,0x2d,0xe7,0x99,0xff,0x29,0xe9,0xd2,0xe9,0xc5,0x22,0x18,0x4b,0x0a,0x01,0x26,0x06,0x20,0xed,0xde,0xe5,0x0d,0xfd,0xf7,0xb3,0x0a,0x12,0x3e,0xed,0x00,0x0d,0xb6,0x3f,0xff,0x1a,0x17,0x1d,0xee,0x06,0x01,0x04,0x68,0xf2,0xd7,0xc4,0xf1,0x15,0xe6,0x17,0xf2,0x0e,0x2b,0xd8,0x39,0xf5,0xdf,0x18,0x44,0x00,0x23,0xf8,0x35,0x21,0x7f,0x86,0x37,0xdc,0x13,0xdd,0xd1,0x14,0x0a,0x25,0x14,0x28,0x19,0xed,0xd9,0xfd,0xcb,0xe8,0x36,0xf6,0x3a,0x10,0xda,0xe5,0xc6,0x4b,0x94,0x04,0x32,0xa1,0x57,0xbb,0x14,0x21,0x36,0x28,0x0f,0x39,0x93,0xd0,0xd7,0xc8,0x14,0xdc,0x34,0xe9,0x43,0x24,0xfe,0xda,0xaf,0x10,0x19,0xf5,0x1a,0xd9,0xeb,0x23,0x05,0xe4,0x35,0x0d,0x30,0x13,0xc7,0xc1,0x19,0xc3,0x32,0x8a,0x48,0x2c,0xad,0x15,0xf8,0x09,0x52,0x0e,0xe2,0x03,0xea,0x1b,0xa4,0xc4,0xc4,0x5d,0xca,0x17,0x09,0xca,0x1e,0x33,0xab,0x2b,0xe6,0x9d,0xa9,0xb9,0x0e,0x3b,0xfa,0xb3,0x21,0xcd,0x29,0x52,0x32,0x63,0x0c,0xfa,0xd0,0x11,0xfd,0x81,0x15,0x2b,0xd0,0xec,0x09,0xee,0xb3,0x3e,0x06,0x25,0x30,0xe2,0x0e,0x18,0x1c,0xe6,0x01,0xf2,0x66,0xef,0x33,0xca,0x41,0xf1,0x33,0xdd,0xfa,0xf3,0x5c,0xc8,0x7f,0xe3,0x14,0x31,0x3f,0xc9,0xff,0xf7,0xfc,0x20,0xfc,0x0b,0x10,0x20,0xf2,0x36,0xea,0xd1,0xf7,0x2c,0x1b,0xfb,0x25,0x0f,0xfb,0xdf,0x17,0x4e,0xf6,0x5e,0xcb,0xe3,0xcc,0xe1,0xe2,0xb3,0x0b,0xf0,0x36,0xc0,0xd9,0x12,0xe7,0xfd,0xfc,0xf6,0xdc,0x1a,0x0a,0xf1,0x16,0xfb,0x1b,0x0e,0xfd,0x3f,0xf5,0xe3,0xb8,0x23,0xec,0x46,0x1f,0x28,0xf1,0xe1,0xfb,0x10,0xfc,0x09,0xf4,0x23,0x0c,0xf7,0x17,0x2d,0x12,0xc3,0xf9,0xf7,0xe6,0x0d,0x22,0x03,0x3b,0xf9,0x0b,0xeb,0xb9,0x13,0x15,0x2a,0x0f,0xc7,0x1a,0x1b,0xee,0x40,0xe9,0x01,0x06,0xf9,0x45,0x06,0xf4,0x1c,0x0e,0x33,0xcb,0x56,0x0f,0x07,0x15,0xf5,0x46,0x22,0xe8,0x08,0xd5,0x12,0xe4,0xe3,0x13,0x2b,0x19,0x1b,0x73,0x14,0xff,0xd8,0x57,0xe7,0x32,0x1b,0x02,0x3c,0xc9,0x19,0x00,0xc7,0x19,0xff,0x12,0xfc,0x38,0xfe,0xf3,0x11,0xb2,0x30,0xe3,0x07,0x30,0xde,0x42,0x07,0xd2,0xc5,0xe4,0xf4,0xd3,0x0d,0x9b,0xcd,0xcd,0x1e,0x2b,0xf9,0xe4,0x2d,0x1c,0x26,0xe3,0x40,0xd2,0x0f,0xa4,0x26,0x0b,0xeb,0x2a,0xdf,0xf2,0xd7,0x36,0xd0,0xad,0xbe,0x36,0x0e,0x21,0xf7,0x1b,0xc0,0x1c,0x27,0x01,0xe8,0xdc,0x18,0x17,0xe0,0xf5,0x1a,0xf5,0x02,0x02,0xe9,0x20,0x07,0x06,0x81,0xec,0x42,0x18,0x1d,0xd7,0x47,0xaf,0xca,0xea,0xfa,0xbe,0x35,0x2a,0xc7,0x03,0xd5,0xf6,0xe6,0x20,0xb9,0xb4,0xc1,0xec,0x01,0xc6,0xc5,0x00,0xd0,0x01,0xf3,0xd4,0x66,0x08,0x03,0x1f,0xeb,0x00,0x19,0xb1,0x38,0xca,0x0e,0x3c,0x81,0xa9,0xe8,0x35,0xbb,0x07,0xf3,0x3c,0xea,0x2a,0x4a,0xd3,0x0a,0xc7,0xed,0xe4,0x08,0x1e,0xd7,0xe1,0x42,0x29,0xcc,0xda,0x23,0x01,0xbb,0x26,0xbf,0x1c,0xc3,0xef,0xdd,0xd4,0x38,0xff,0x0d,0x47,0x37,0x44,0xd2,0xe6,0x8d,0x47,0x28,0x2a,0xf5,0xd6,0x4d,0xac,0xca,0xe0,0xb9,0x2a,0x2d,0x4f,0xe1,0x29,0xf2,0xe2,0x14,0xf4,0xb8,0x43,0x2e,0x24,0xeb,0x40,0x2f,0xe4,0x21,0xf5,0xd4,0x21,0x3f,0xd4,0x1c,0x29,0x25,0x1a,0x93,0x30,0xab,0x55,0xf3,0xc0,0x14,0xe0,0x7f,0xe7,0x1a,0xe6,0xd5,0xeb,0xe0,0x36,0x0d,0x21,0x2c,0x58,0xc7,0xfa,0x18,0xe4,0x4f,0xb6,0x27,0xd3,0xe3,0xd6,0xff,0xde,0xd2,0xe9,0xdf,0x00,0x39,0x02,0xe7,0x84,0xbb,0x01,0x1b,0xd9,0x04,0xfb,0x24,0x05,0x1d,0xdb,0x20,0x1c,0xea,0x3a,0xf9,0x1e,0xf3,0xe4,0xea,0x35,0x04,0x16,0x28,0x26,0x3f,0x1e,0xf4,0xf2,0x06,0x28,0xfa,0x27,0x01,0x45,0x02,0xea,0xec,0x0e,0x20,0x1f,0xdb,0xed,0xdd,0x10,0x24,0xfe,0x5a,0x0c,0xda,0xf2,0xe8,0xda,0xd0,0xf9,0xa5,0x15,0xdc,0x0a,0xe7,0xd3,0x3e,0xd7,0xfe,0xf5,0x35,0x28,0xe5,0xe3,0x1b,0xfe,0xcd,0x09,0x1c,0xcb,0x4a,0x0e,0xdf,0xdf,0x08,0x18,0x19,0x39,0x28,0x2b,0x12,0x02,0x14,0x08,0x4a,0xcf,0xb3,0xf7,0xf8,0x9c,0x3e,0x05,0xaf,0x6c,0x12,0x03,0xeb,0x7f,0x31,0xad,0x04,0x4d,0x00,0x39,0x31,0x00,0xe6,0xe9,0x38,0xd8,0xbb,0x25,0xfe,0xce,0xd9,0x3b,0xe1,0x0b,0xfb,0xe6,0x06,0xfa,0x2d,0x26,0x3f,0xed,0xac,0xd7,0x0b,0xcc,0xbc,0xf9,0xec,0xc6,0x1f,0x22,0xd9,0x0d,0xef,0xe5,0xf6,0x4d,0x17,0x7f,0x2d,0xbc,0xec,0x01,0xf9,0x6f,0xb6,0xfb,0x11,0xd5,0x0f,0xe5,0xdf,0xe9,0xd7,0xe5,0x23,0xf8,0xdf,0x08,0xfd,0xf3,0xdf,0x50,0xd6,0x2a,0x01,0xe8,0x0b,0xca,0xfc,0xd4,0xe5,0xdf,0xdd,0xfc,0x02,0x42,0xf0,0xde,0x25,0xf3,0xbb,0x01,0xd0,0xdb,0xb6,0x59,0xeb,0xe5,0xdd,0xdf,0x20,0xdb,0xb4,0xe1,0xc3,0xf0,0x1f,0xcf,0x01,0xf3,0x2a,0x53,0xf3,0xb4,0x47,0xf1,0x14,0xd3,0x33,0xcb,0x16,0xcb,0xfc,0x05,0x01,0xfb,0xe8,0xb1,0x18,0x20,0xcf,0xcd,0xde,0x23,0x8f,0x32,0x04,0xfc,0xba,0x3a,0xf5,0x4d,0xef,0xd0,0xdb,0xd4,0xe0,0xf8,0x18,0x28,0x1e,0xd7,0x24,0xe8,0xd6,0x0b,0x5a,0xcd,0x40,0xfe,0xb3,0x16,0xcb,0xde,0x4b,0xe8,0x25,0xe0,0x03,0x2c,0x20,0x22,0xaa,0xda,0xc8,0xf6,0xf2,0xe2,0xe7,0x17,0xb2,0x13,0x6f,0x30,0xd3,0xe1,0x2d,0x0d,0x00,0x5b,0xb1,0x1c,0x03,0xfa,0xa0,0x0d,0xfd,0xb6,0xbf,0xf9,0x55,0x3e,0x22,0xe3,0x8f,0xdb,0x5e,0xb3,0xe5,0x13,0x14,0x2c,0x33,0xf3,0xb6,0xe1,0x8a,0x09,0x16,0x04,0x15,0x00,0x62,0xf8,0x1c,0x36,0x6f,0xd6,0xca,0x02,0xcd,0x87,0x4c,0x85,0x22,0x2f,0xbc,0x0a,0x23,0x41,0x10,0x08,0x50,0xd8,0xa3,0x13,0x0d,0xe1,0x1f,0x02,0xee,0x26,0xe3,0xf4,0x21,0x0f,0xe6,0x13,0x04,0xff,0x45,0x4f,0x89,0xc4,0x7f,0xfd,0x29,0xfc,0x5b,0xc2,0x30,0xe6,0xb2,0xee,0xc0,0x30,0xc8,0xfb,0xf3,0xd8,0xc3,0x74,0x0f,0xf2,0x41,0x1a,0xfe,0x18,0xd2,0xdd,0xbc,0xda,0x3f,0xfd,0xc6,0xb3,0xdf,0x0e,0x27,0xe1,0xfb,0x27,0x0e,0x43,0xaa,0x66,0x16,0x29,0x1a,0x0c,0x0c,0xe7,0x14,0x10,0x22,0x64,0xa9,0x16,0xff,0x11,0x14,0xdd,0x2a,0x42,0x0f,0xf0,0x11,0xbb,0xf3,0xe9,0x4e,0xe2,0x16,0x92,0xe0,0xce,0x11,0xf2,0xf4,0xc6,0xfe,0x7f,0xfc,0xbc,0xf8,0xd1,0xe9,0xe1,0xe6,0xe2,0x13,0x45,0x1e,0xe7,0xc8,0xf8,0x08,0x31,0xae,0x13,0xf4,0xc2,0xfc,0xf5,0x27,0x0c,0x2c,0x63,0x3d,0xda,0x3b,0xcc,0xe4,0xd1,0xf8,0x0c,0xe0,0xe2,0xa5,0xe5,0xf5,0xe5,0xff,0x2f,0xe9,0x28,0xca,0x0e,0xe7,0x24,0xb4,0x3f,0xdb,0x05,0xc6,0x25,0xf2,0x43,0x05,0xc5,0xde,0xd9,0x26,0xd5,0xfe,0xf4,0x1b,0x3c,0x25,0x17,0x23,0xf2,0xe2,0x00,0xe2,0x20,0xba,0xdb,0xff,0xdd,0xc0,0x11,0xfe,0x14,0x03,0x31,0x00,0x0c,0x7f,0xf8,0x0d,0x1c,0x05,0xfe,0x2b,0xbe,0x32,0x04,0xfd,0xad,0x38,0xe9,0x25,0x19,0xca,0xe5,0x19,0xe3,0x69,0xf3,0x45,0xfb,0x42,0x17,0xe1,0xe8,0xf4,0xf6,0xe2,0xe5,0xb1,0xbf,0x14,0xd6,0x2b,0x3b,0x04,0xf1,0xce,0xfb,0xbb,0xcd,0xfb,0xec,0xfc,0xd5,0xf6,0x11,0x5e,0xf0,0x34,0xc0,0x1f,0xbc,0xdb,0x23,0xe9,0x21,0x22,0xe1,0x04,0x35,0xdf,0x0a,0x26,0xed,0x05,0x60,0xe9,0x1f,0xdf,0x47,0x67,0x03,0xf3,0xf7,0x4e,0x27,0xee,0x01,0x01,0xe6,0x37,0x0d,0x0e,0x1e,0xfb,0xf1,0xfb,0xcc,0xb5,0x44,0xf8,0xb5,0xee,0x23,0x31,0x09,0xce,0xfb,0xdc,0x02,0x17,0x01,0x6d,0x26,0xe4,0x31,0x33,0xc8,0x27,0xea,0xfe,0x05,0xfc,0x25,0x08,0x47,0xe8,0x2b,0xdc,0xfb,0xe8,0xf3,0x10,0x31,0x08,0x23,0x22,0x03,0xcb,0x05,0xf9,0x0f,0x0e,0x02,0x09,0xc9,0x00,0x36,0x12,0x05,0xca,0xec,0xbd,0xd8,0xf0,0x25,0x1c,0x0f,0x21,0xdf,0x25,0xdc,0x04,0xd8,0x1c,0x01,0xde,0xe8,0x42,0x04,0xce,0xd0,0xe7,0xc8,0xb2,0x53,0x07,0xfa,0xd5,0x17,0xe0,0xe6,0x02,0xf6,0xd2,0xfc,0x07,0xdf,0x05,0x1f,0xfd,0xe3,0xdb,0xc7,0x22,0x06,0x0a,0xfe,0x30,0x3a,0x02,0xed,0x29,0x2e,0xfb,0x22,0x0d,0xee,0x1b,0xf6,0xc9,0xe9,0xfa,0xc0,0xa6,0xac,0x09,0xcc,0xd2,0x50,0xea,0xdc,0x76,0xf6,0x46,0x32,0xef,0xd7,0x24,0x07,0x7f,0x22,0xda,0xf9,0x15,0x0a,0x4b,0xc8,0xc2,0xc1,0xca,0x1c,0x13,0xf5,0x1d,0x45,0x25,0x2e,0xf0,0xf2,0x30,0x07,0x36,0xce,0x28,0xeb,0x33,0xde,0xe5,0x0b,0x0e,0xe6,0xe4,0xdc,0x30,0xfa,0x8f,0xdf,0xd0,0x58,0xcd,0x5c,0xf4,0xee,0x25,0xdf,0x1a,0x36,0x05,0xcc,0x24,0xfb,0xea,0xb2,0x00,0x53,0x2a,0xde,0xa7,0x20,0xe2,0x1a,0x4b,0xe0,0x56,0x24,0x06,0xc8,0x00,0x09,0x05,0xf1,0xc3,0xa2,0x8e,0xfa,0x6d,0x12,0xf4,0x22,0xe4,0xeb,0x32,0x6b,0x19,0x60,0x0f,0xa0,0xf2,0x88,0xf3,0x99,0xdf,0x0f,0xdc,0xdc,0x20,0xe7,0x41,0x54,0xdb,0xf3,0x27,0xde,0xcc,0x45,0xe0,0xe5,0x21,0xbe,0xcc,0x0c,0xe8,0x35,0x3e,0x3c,0xd2,0x76,0xe7,0xc4,0xed,0x31,0x00,0x4c,0x7f,0xd8,0xb2,0xe6,0x1b,0x29,0x0b,0x2c,0x0b,0x92,0x43,0x1b,0x26,0xfe,0xce,0x1b,0x17,0xb9,0xff,0xf7,0x17,0x16,0x2a,0xc1,0x06,0xc6,0xde,0xd1,0x07,0x08,0x18,0x00,0xf7,0xf9,0x3a,0x14,0x02,0x0f,0x1d,0xc8,0xd4,0x48,0xf7,0xf4,0xe9,0xf6,0x06,0x45,0xf0,0xee,0x00,0x1f,0x27,0x46,0x17,0x41,0x7f,0xfd,0xe5,0x06,0x19,0x05,0xea,0xf4,0x11,0x01,0x15,0xb8,0xe0,0xd6,0xdd,0xeb,0x30,0xcc,0xe8,0x1b,0x01,0x0f,0xf1,0xd7,0x20,0xef,0x04,0x09,0xbf,0x3a,0x21,0x01,0xd2,0xe3,0x18,0x15,0xbe,0x48,0xf3,0x1a,0x10,0xe0,0xe2,0xed,0x48,0x2b,0xe7,0x53,0x64,0xd3,0xe6,0xdb,0xef,0xf5,0xb8,0xfc,0xc2,0x4c,0x23,0x0d,0x12,0x1b,0x04,0x09,0xca,0x2c,0xc3,0x91,0xcb,0x12,0xd3,0x3d,0xc2,0xfc,0xf4,0x1b,0x04,0x10,0xbe,0xf6,0xcb,0xcd,0xd9,0x03,0xe9,0xf4,0xec,0x34,0x05,0xf0,0x0d,0x2b,0x06,0x2d,0xe4,0xf5,0xb9,0xe4,0xc1,0x43,0xd6,0xd5,0x14,0x13,0xe8,0x05,0x2f,0xf6,0x2a,0xed,0xb8,0xc9,0x05,0x0d,0xec,0x4d,0x49,0x42,0xef,0xce,0xcf,0x27,0x3d,0x71,0x02,0x61,0x24,0xe5,0xb6,0xf5,0xeb,0xd3,0x3a,0xca,0x43,0xd8,0x47,0x04,0x2d,0x1f,0x3f,0xc4,0xba,0xb1,0xf3,0x36,0xec,0xeb,0xdd,0x04,0x1c,0xda,0x50,0x34,0x95,0x2a,0x96,0xf9,0x62,0xd9,0x08,0xa2,0xc1,0x03,0x9e,0xa9,0xe0,0xf8,0xd2,0x1c,0xf1,0xbd,0x52,0xa0,0xc9,0xdf,0xfc,0x11,0xdf,0x03,0xfd,0xd2,0x81,0x04,0x03,0x0a,0x8f,0x3b,0x0b,0x93,0xd5,0x22,0x06,0x25,0xc3,0x19,0x5c,0xc9,0xed,0x2e,0x24,0xda,0xd2,0xf5,0xf6,0xfc,0xcb,0x1a,0xa3,0xdd,0x18,0xa0,0x9a,0xce,0xec,0x27,0x04,0xfc,0xf9,0x04,0x50,0x0b,0xcd,0x2f,0xc3,0xba,0xe0,0x1d,0x28,0x37,0x3c,0x6f,0xc8,0x11,0xb0,0xf5,0xb5,0x12,0x6c,0x13,0x35,0x92,0x3b,0x06,0xff,0x06,0xc2,0xa6,0xc1,0xaf,0xfa,0xdf,0xdc,0x2f,0x00,0xc3,0x0b,0xf3,0xf4,0xd4,0xb5,0xd6,0x22,0x1e,0x1d,0xe4,0x30,0xe9,0xff,0x44,0xb9,0xab,0x10,0xff,0xee,0xdf,0x07,0x0a,0xe8,0xdf,0x15,0xbc,0xe1,0x03,0xf3,0x2d,0x24,0xf6,0x51,0xfc,0x81,0xf5,0xf9,0xd7,0x23,0x2a,0xa1,0xd0,0x2c,0x11,0xfd,0xfc,0xf4,0xfd,0xd6,0x30,0x26,0x06,0xe8,0xd3,0xca,0x79,0x19,0xef,0x37,0xfc,0x3d,0xd2,0xc5,0xc8,0x10,0xc2,0xec,0x4c,0xfc,0x37,0x11,0xf8,0x12,0x08,0x13,0xb6,0x13,0x01,0xb4,0x15,0xf7,0xca,0x25,0x29,0xc6,0xab,0xc0,0xe1,0x9f,0x07,0x27,0x3c,0xd1,0x3f,0xd9,0xb1,0xff,0xce,0xee,0xd3,0x0b,0x25,0x02,0x07,0x27,0x0f,0xfb,0x5e,0xf7,0x20,0x27,0x10,0xce,0x3c,0xf9,0x2c,0xc6,0xb6,0xa4,0xd6,0x9a,0x30,0xe4,0x20,0xbe,0x1b,0xa2,0xdb,0x0f,0x88,0xf7,0x0f,0x03,0x43,0xc7,0xfe,0xd0,0xd2,0x11,0xce,0x31,0x25,0xf9,0x2f,0xfc,0xd4,0xe2,0xab,0xc1,0x6d,0x00,0xda,0xb0,0xd9,0xe2,0x57,0x4b,0xe6,0x05,0xfe,0xc0,0x07,0x40,0xf9,0x22,0x66,0xf7,0xe5,0xf7,0x11,0x1b,0x9a,0xfe,0x1e,0x02,0x2c,0x66,0x1e,0xf1,0xd0,0x2e,0xe1,0x11,0x66,0xcd,0xe5,0x2d,0xf7,0x12,0xe8,0xf4,0xd2,0xd6,0x30,0x5a,0x20,0xc4,0x26,0x46,0x27,0x4c,0x0f,0xd3,0xe7,0xee,0x10,0x1d,0xfc,0x81,0xf9,0xce,0x06,0xfd,0x08,0xf9,0xc3,0xe4,0xc4,0x1b,0x01,0x01,0x27,0xba,0xea,0x3f,0x7f,0x74,0x04,0xe9,0xe7,0xe5,0x13,0x2a,0x34,0x0b,0xf4,0x47,0xf1,0xd9,0xdc,0x10,0x3f,0x40,0x2a,0xff,0xbb,0xd8,0x4c,0x08,0x16,0xbe,0xff,0xfd,0xd2,0xfc,0x0e,0xd1,0xbd,0xfd,0x3f,0xd0,0x08,0xdc,0xff,0x14,0x0a,0xe7,0x1b,0xdb,0x08,0xbf,0xf2,0x0e,0xc8,0xfa,0x7c,0x0f,0x13,0xc9,0xe7,0xfd,0x6a,0x20,0xe9,0x59,0x4a,0xfa,0x29,0x30,0x11,0x37,0x08,0xfd,0xda,0x32,0x05,0x04,0x32,0x2e,0x10,0x0e,0xf5,0xd3,0xf8,0xde,0xf1,0xae,0x25,0x1d,0x98,0xe6,0x43,0x14,0x11,0xba,0xd9,0xb6,0x06,0xe3,0xf4,0xfa,0xce,0xe2,0xe5,0xb8,0xaa,0x24,0xfc,0x1a,0xea,0x6b,0xc0,0x8f,0xf5,0xb0,0x2d,0xe0,0xed,0x5b,0x99,0xbe,0x12,0xc2,0xeb,0xf1,0x6e,0x5a,0x20,0x20,0x1d,0xdb,0x25,0xec,0x03,0x18,0x13,0xe2,0xf8,0xfa,0x0d,0x08,0x1a,0x26,0x09,0x46,0xd7,0xdf,0xe9,0xaa,0xe4,0x08,0xf7,0x36,0xe3,0xe6,0xff,0x05,0xfe,0x0f,0xcf,0xe3,0xe1,0xcd,0xf7,0x1a,0x00,0x2f,0x10,0xd5,0x1c,0x02,0xaf,0x21,0xea,0xd3,0x00,0xef,0xe7,0xf7,0xe2,0xed,0xc9,0xf3,0x04,0xdd,0x21,0x38,0xda,0x00,0x20,0xed,0x3c,0xfe,0x3f,0x06,0xd2,0xdd,0xce,0x4e,0xe3,0x05,0x0c,0x05,0xdb,0x29,0x08,0xf2,0xda,0x16,0x23,0xf2,0x18,0x28,0xe8,0x31,0x0c,0x21,0xd6,0xe6,0x04,0xf3,0x07,0x25,0xef,0xf7,0xfb,0x03,0x28,0xf7,0xe0,0xef,0x05,0xe5,0xf6,0x03,0xf9,0x04,0xe6,0xfd,0xf8,0xe9,0x0e,0xe7,0x03,0x0b,0xbe,0x44,0x21,0xcd,0x2a,0x27,0xdf,0x14,0x31,0x7f,0x03,0x63,0x2a,0x31,0x17,0x0b,0xbc,0xf6,0x34,0x25,0x01,0xd0,0xd5,0x13,0x0d,0xf3,0x1b,0xf9,0xfb,0xbc,0x18,0x16,0x07,0xf4,0x2c,0x2c,0x01,0xe5,0xf2,0x06,0x34,0x49,0x27,0xc8,0x1d,0xde,0x57,0xff,0x12,0xbe,0x10,0x07,0xe5,0xf2,0x1d,0xc8,0xce,0x17,0xb7,0x03,0xfb,0x29,0xd2,0xc5,0xa4,0x10,0xd8,0x24,0xde,0xfa,0x0f,0x27,0xcb,0xf8,0x00,0x23,0xfb,0xfb,0xe0,0xdd,0x2f,0xeb,0x47,0x7f,0x0e,0x04,0xc7,0xfe,0x1e,0xc9,0xd4,0x06,0x01,0x04,0x3d,0x2a,0xf2,0xf8,0x36,0xca,0x16,0x28,0x1a,0x13,0x0c,0x3d,0x04,0x3a,0x0e,0x03,0xd9,0x3c,0x2c,0x14,0xd6,0xe9,0x05,0xf2,0xc5,0x05,0xe2,0xd8,0x1a,0x0d,0x04,0xf5,0x17,0xef,0x01,0x39,0xff,0x0e,0x5b,0xd1,0xfd,0xdc,0x13,0xf7,0x0f,0xd2,0x27,0xde,0x11,0xe1,0xdd,0x10,0x29,0x46,0xdb,0x1c,0xef,0x02,0x65,0xd8,0xef,0xd4,0x34,0xa8,0xe7,0x36,0xf7,0x11,0x1d,0xf5,0x06,0xdf,0xde,0xeb,0x07,0x5c,0x7f,0x0d,0xe6,0x1f,0xee,0x05,0x0f,0x20,0xd0,0x1d,0x11,0x29,0x4f,0x14,0xfa,0xfb,0x9e,0xa0,0x4a,0x08,0xff,0x15,0x20,0x64,0x02,0xe5,0xd7,0x1b,0xd2,0x14,0xe1,0x2a,0x50,0x9b,0x21,0x1d,0x17,0x1d,0x28,0x9f,0xdb,0x31,0xd4,0x14,0xfc,0xf8,0xfc,0xd7,0xd9,0x46,0x1c,0x45,0xdb,0xe0,0xa9,0x2d,0x0f,0x43,0x35,0x46,0x0d,0x2d,0xdc,0xef,0xd6,0x01,0xb4,0xf9,0x22,0x20,0x35,0x12,0xf4,0xf4,0x0f,0xbb,0x29,0xe0,0xfc,0xc8,0x08,0xf6,0x48,0xaf,0xf2,0xbc,0xe4,0x1f,0xba,0xc3,0xb5,0xdb,0xde,0xdc,0xea,0x02,0x29,0xf6,0x0f,0x12,0xfe,0x3f,0x36,0xe3,0xeb,0xea,0x0d,0x1d,0x1f,0xdd,0xf0,0xfa,0x15,0x0a,0xfe,0xd8,0x06,0x21,0x0f,0xf5,0x24,0xe0,0xbb,0xf7,0x1a,0xd8,0x02,0x18,0x20,0xef,0xe5,0x02,0x0e,0x06,0xf9,0x12,0xc4,0x07,0x44,0x07,0xdb,0xe0,0xcf,0x09,0xce,0x16,0xec,0xec,0xe0,0xf5,0xec,0x0b,0x1d,0x08,0x3a,0xd8,0x0b,0xd8,0xf9,0x03,0x03,0xed,0x0a,0x19,0xe9,0xe8,0xe1,0xd7,0xe6,0x0a,0x40,0xe1,0xf2,0x2b,0x4c,0xe6,0x06,0xf5,0x07,0x1c,0xda,0xf5,0x27,0xde,0xe3,0xbb,0xe3,0xfe,0xf4,0xfb,0x12,0xe6,0x19,0x7f,0x4a,0xf9,0x1d,0x2b,0xf3,0x19,0x09,0x00,0x12,0xd2,0x0d,0x0d,0xed,0xf5,0xe0,0xed,0x0e,0x05,0x06,0x06,0xe5,0x19,0x23,0x31,0x33,0x03,0x20,0xf5,0xde,0x06,0xfa,0xfc,0xdd,0xdf,0xd6,0x14,0x0e,0xed,0xff,0x2c,0x10,0xef,0x42,0x25,0xd0,0x0f,0x13,0x05,0xc4,0xf1,0x28,0xfd,0x0f,0xf2,0xed,0xd6,0xc7,0x1a,0xf3,0xfd,0xdf,0xd1,0xc9,0xfd,0x11,0x08,0x01,0xee,0x29,0x3e,0x05,0xf8,0xc0,0x23,0x27,0xce,0x1c,0x0b,0x55,0xe5,0xa1,0x09,0x08,0x70,0xef,0x22,0xe6,0x14,0x1f,0xc7,0x28,0xd1,0xf0,0x10,0xd2,0x29,0x16,0x3a,0xed,0x0c,0x29,0x08,0xf6,0x2a,0xd9,0xe8,0xce,0x04,0xf3,0xde,0x20,0x27,0xfd,0x0c,0x08,0x01,0xd9,0xf0,0xe1,0x18,0x4c,0x0b,0xf6,0xd8,0xfa,0x36,0x20,0x0c,0xe1,0xfe,0x00,0x4b,0xfe,0x7f,0x2f,0x0d,0xf6,0x25,0xfb,0x36,0x11,0x12,0x48,0xf1,0x1a,0x26,0xfb,0x20,0x08,0x19,0xe0,0xd5,0xf5,0x04,0xd8,0x06,0x06,0xe6,0xac,0x19,0xed,0xe5,0x21,0x23,0xe1,0xd5,0x29,0x32,0xf7,0x0c,0xc0,0xf0,0x40,0x0c,0xee,0x25,0x17,0xec,0xef,0x26,0xe5,0x16,0xff,0x19,0x00,0x34,0x27,0xfb,0x05,0x2f,0x10,0x7f,0x67,0xf3,0xf6,0xcf,0x42,0x11,0x10,0xb4,0x2d,0xb9,0xfb,0x4d,0xa4,0x12,0x49,0xef,0xc5,0x48,0xf9,0xe8,0x18,0xf9,0x00,0x23,0xb2,0xf6,0xcf,0xd6,0xfe,0x1f,0x22,0x25,0xf0,0xb8,0x34,0x1c,0x0f,0xe2,0x39,0xea,0xf8,0xd2,0x37,0xf7,0xd1,0x1d,0xb0,0x15,0xed,0x95,0xfc,0xd8,0x06,0xdd,0xb9,0x07,0x48,0xd1,0x2c,0xdd,0x27,0x32,0xe2,0x31,0x0a,0xdb,0x0c,0xde,0xd0,0x22,0x1d,0x17,0x37,0xd0,0x04,0x00,0xe6,0x11,0xae,0x47,0x19,0xc6,0xea,0xc1,0x0e,0xdb,0x18,0xd4,0xe1,0x01,0xec,0x53,0x17,0xd8,0xdd,0xff,0xff,0x1a,0xa3,0xdc,0x08,0xf2,0xf0,0xed,0x22,0xee,0xf2,0xb4,0xd7,0x20,0x09,0x0a,0xd1,0xc6,0xe5,0xb3,0xfc,0x15,0x2c,0xd0,0x23,0xc6,0x10,0xfa,0x0e,0xd8,0xd4,0x21,0xf7,0x7f,0x05,0x06,0xc1,0x09,0xbf,0x16,0xeb,0x07,0x0d,0x04,0xed,0xd9,0x2f,0x31,0xec,0xf8,0x31,0x24,0x13,0xdc,0xf4,0x26,0x15,0x0d,0xf2,0x1d,0x4f,0x25,0x09,0x05,0x39,0xf2,0xfb,0xfa,0xc8,0x01,0x15,0xe8,0x12,0x2a,0xf2,0x64,0xbc,0x0a,0x2d,0xe8,0x37,0x29,0x01,0xf0,0x1e,0x4e,0xc8,0xe6,0xec,0xe9,0x0d,0xd1,0x0b,0xfd,0x0a,0xe8,0x06,0x31,0x12,0x1b,0x2d,0xd0,0x06,0xf7,0xf8,0x18,0xfc,0xd9,0xf8,0xf9,0x26,0x23,0x0b,0xf1,0xf1,0x1c,0xbc,0xbe,0x31,0xfa,0xd7,0x15,0x10,0xf1,0xeb,0x09,0xef,0x0d,0x2c,0x08,0xf1,0xd8,0xfa,0xe4,0xb4,0x05,0xac,0xc6,0x95,0xf0,0x3a,0x56,0x06,0x58,0x12,0x81,0x13,0xac,0xf3,0xb0,0x14,0x26,0xdb,0x1d,0x38,0xf7,0x1c,0x5a,0x02,0x0a,0x19,0x0f,0xf6,0x30,0x14,0x69,0x42,0xe0,0xec,0xcf,0xae,0xdd,0xec,0xd7,0x3c,0xc5,0xd2,0x19,0xdc,0xc3,0x09,0x1d,0xf2,0x48,0xee,0x7c,0xe9,0x13,0xe7,0x58,0x43,0x33,0x13,0x0e,0xbc,0xf3,0xd5,0xa0,0x41,0x50,0x1f,0xfe,0xfd,0x28,0xd7,0xde,0xc0,0xe1,0x12,0x18,0x40,0xca,0xf1,0x10,0xed,0xcc,0xf9,0xe2,0x34,0xa3,0x0a,0xe6,0xfd,0x14,0xc6,0x0a,0xcd,0x10,0x25,0xf1,0x0c,0x03,0xda,0xfa,0xa9,0xd4,0xfc,0x2f,0x34,0x15,0xfc,0x13,0x0b,0x05,0xcf,0xe2,0xb2,0xb0,0xf6,0x22,0x00,0xc5,0x26,0xeb,0x09,0x02,0x3c,0x35,0x0b,0x6a,0xe3,0xe9,0xf9,0xca,0x51,0xe8,0xf7,0xe4,0x1b,0x3c,0x16,0xcc,0x02,0xe1,0x1c,0x2c,0x12,0x2d,0x1e,0x58,0x24,0xe6,0xe7,0xd6,0xf5,0x0d,0xe7,0xf9,0xe7,0xfd,0xd5,0xe1,0x15,0x0a,0x3e,0x19,0xc4,0x11,0x27,0x9e,0x12,0x1c,0xd6,0xb6,0x1a,0xf2,0xf1,0x45,0x3f,0x29,0xbf,0xc7,0x21,0xd3,0xa1,0x33,0xf6,0x06,0x3c,0x04,0x95,0x10,0x3d,0x55,0xee,0x24,0xf7,0xe8,0xf3,0x17,0xfa,0x1b,0xbc,0xf2,0x0d,0x30,0x36,0xff,0x1e,0xeb,0xf8,0x21,0xff,0x08,0xc5,0x26,0x00,0xb0,0xf3,0xfe,0xf6,0xeb,0xc5,0xac,0xcf,0xf7,0x3a,0x42,0x1c,0x27,0x18,0xe9,0xf7,0xd6,0xf9,0x2c,0xec,0x29,0x25,0xe3,0xde,0x3b,0xe1,0xf3,0x34,0x05,0x1e,0x7f,0x05,0xf2,0x1c,0x12,0xf1,0x13,0x16,0xbb,0x32,0x68,0xb3,0x2c,0xda,0xf6,0x4a,0xdf,0x06,0x3c,0xca,0xab,0x7c,0xd8,0xe0,0x40,0x18,0xb8,0xfc,0xf2,0x54,0x38,0xfe,0x2f,0x0a,0xbe,0x41,0xbf,0xeb,0x10,0xab,0x32,0xbe,0xe4,0x00,0x2c,0x04,0xf6,0x33,0xcf,0x07,0x38,0x18,0x06,0x88,0xe1,0x27,0x70,0x2f,0x4d,0x2a,0x15,0xf1,0x0a,0xc6,0xca,0x35,0xf4,0xec,0x45,0xd2,0x48,0xb7,0x25,0x48,0xd4,0x85,0xd7,0xe8,0x22,0x59,0x13,0xd7,0x00,0xc7,0xf9,0x12,0x3c,0x51,0x1c,0x5b,0xca,0x06,0x37,0xed,0xaf,0xd7,0x44,0xd7,0xb6,0x1e,0xea,0x01,0x62,0xe8,0x2e,0xd6,0x16,0x4d,0x9c,0x19,0x48,0xf3,0x18,0xfa,0x1d,0x28,0xe4,0xb3,0xcb,0xed,0x7f,0x49,0xfe,0xce,0xd8,0x12,0x31,0x25,0x13,0x04,0x09,0xac,0x1c,0x31,0x0d,0x4b,0xfc,0x12,0xc4,0x0f,0x60,0xc1,0x03,0x04,0x56,0xc8,0x40,0x18,0xfc,0x14,0xc2,0xeb,0xc3,0x98,0xfb,0x17,0xf8,0x22,0xf8,0xf8,0x02,0x27,0x04,0xc0,0x0b,0x33,0x4e,0xf5,0xef,0x47,0x02,0xf7,0xf2,0xe1,0x18,0x36,0x16,0x1e,0x54,0x3b,0xfe,0xd7,0xec,0xc1,0x0d,0x25,0xd2,0xad,0xec,0x2e,0x08,0xfe,0xec,0x00,0xd5,0x36,0x07,0x39,0x07,0xe3,0x04,0xce,0xeb,0x28,0x23,0x37,0xee,0x10,0xf6,0xf2,0x12,0xe8,0x15,0x00,0x36,0xd7,0x14,0x10,0x02,0xff,0xbc,0xea,0xcd,0x1d,0xf1,0xf5,0xe5,0x37,0xf9,0xf0,0x0f,0x32,0x29,0x11,0x06,0x06,0x0a,0xca,0xea,0x15,0x4f,0x16,0x4b,0xff,0xe0,0xef,0xe1,0xfa,0x32,0xd9,0xee,0x7f,0x06,0x17,0xe9,0xf0,0xdc,0x0b,0xde,0x5d,0x0e,0x35,0x2c,0x23,0x29,0x18,0xe6,0x23,0x1c,0xe0,0x2c,0xf4,0x06,0xef,0xec,0x11,0xdd,0x07,0xfc,0x38,0x35,0x40,0x3d,0xf1,0xe4,0xf1,0x05,0xfd,0x18,0x21,0xd0,0x05,0x2c,0xfc,0x26,0xd6,0xdb,0xd5,0x17,0xeb,0x43,0x08,0x2c,0x21,0xfb,0xe4,0xeb,0xea,0xb9,0xf4,0xba,0xe9,0x4a,0xf3,0x30,0x0c,0xe8,0x10,0x5f,0x1a,0x04,0xec,0x2b,0xf5,0x07,0xcf,0xfa,0xd7,0x81,0x09,0xf3,0x06,0xe7,0xfa,0x13,0xf3,0x2a,0xff,0x33,0xf3,0x02,0x1c,0xe7,0x05,0x2d,0x34,0xce,0x10,0x2c,0xfc,0x2b,0x17,0xfd,0x3a,0xdb,0x22,0xf1,0x0a,0xea,0xf2,0x32,0xf1,0xec,0xef,0xf5,0xf6,0x1a,0x14,0x02,0x07,0x0b,0x12,0xc1,0x34,0x38,0xe0,0x19,0x4d,0xf5,0xfa,0xec,0xea,0xd5,0xf3,0x54,0xe6,0x1b,0x08,0x17,0x14,0xd6,0x06,0x00,0xea,0x1b,0x2d,0x27,0xf4,0xf5,0x07,0xdd,0x07,0x1d,0xe9,0xde,0x04,0x61,0xf2,0xf3,0xf4,0xbe,0xba,0xe6,0x12,0x14,0x1e,0x0c,0xdf,0xee,0x0f,0x0b,0xd4,0x14,0x29,0xf1,0xd8,0x11,0x39,0xfd,0x4c,0x2b,0xc6,0x2e,0xe1,0xe9,0x14,0x27,0xc2,0x04,0xf3,0xe0,0xc5,0x16,0xec,0xea,0xfc,0x1a,0x18,0xc7,0xff,0xfc,0xfa,0xef,0xd2,0x01,0x21,0x33,0x00,0x7f,0xe9,0x2b,0x08,0x49,0xe0,0x27,0x2a,0xf4,0xdd,0xfa,0x21,0x1c,0x62,0xd9,0xf5,0xcc,0xf1,0x29,0xe3,0x8e,0xe9,0x19,0x31,0xb2,0x67,0xff,0x37,0x1a,0xf6,0x0c,0xe6,0x0c,0xcb,0x08,0x04,0x10,0xfb,0xfc,0x09,0xde,0x01,0x03,0xee,0xfd,0xd1,0x0d,0x4a,0xcd,0xd0,0x1d,0x2d,0xd4,0x09,0x2a,0x30,0x02,0x1a,0x10,0x0d,0xf9,0x4b,0xdd,0xf3,0x24,0x14,0xe9,0x01,0xef,0x17,0x4c,0x1a,0x26,0xf3,0x06,0xee,0xe3,0x26,0xd5,0x36,0x4a,0x00,0x08,0x02,0xfb,0xad,0x24,0x04,0xf4,0xdb,0x0d,0x2b,0xe1,0xf8,0xe1,0xc7,0x1a,0xd0,0x0d,0xcb,0x1b,0xeb,0x07,0xdb,0xe9,0xd3,0xdc,0xb7,0x41,0xf9,0x0b,0x1e,0x17,0xfc,0x17,0x09,0xc7,0x1b,0x1d,0xd9,0xda,0xf9,0x15,0x04,0xe7,0xc8,0x5a,0xe3,0xec,0xfb,0x4c,0xe8,0xf5,0x49,0x04,0xd5,0x2c,0xb8,0x81,0xde,0xef,0x0c,0x30,0xe8,0xe7,0x02,0x1c,0xfb,0x03,0x20,0x19,0x07,0xef,0x07,0xd7,0x0a,0x3c,0xeb,0x1d,0x1b,0x0c,0xf5,0x05,0xf0,0x2d,0x21,0xce,0xdf,0xf9,0xfb,0x5a,0x14,0xf0,0x2a,0x01,0x4d,0xf0,0xeb,0xf3,0x14,0xca,0x0d,0x34,0xfb,0x22,0xfa,0xe4,0x08,0x16,0xd3,0xf1,0x0b,0x32,0x18,0x15,0xf8,0xe2,0x33,0xe1,0x0c,0x1a,0xfe,0x03,0xfb,0xe6,0xd4,0x16,0xe7,0xca,0x19,0x1b,0x16,0x1a,0xfc,0x1e,0xfa,0xcc,0xc0,0x44,0xd8,0x12,0x30,0xfe,0xfd,0xd6,0xdb,0xfc,0xf5,0xf6,0x2f,0xfe,0xcc,0xd8,0x12,0x16,0xcc,0x81,0x1c,0x9a,0x29,0x20,0x13,0x0e,0x2e,0x00,0xfa,0xfb,0xca,0x1d,0x12,0xfa,0x15,0xdc,0xe7,0xd4,0x03,0xe5,0xf7,0x45,0x00,0xb9,0x22,0xf3,0xde,0x09,0x39,0x0a,0xdb,0x00,0xf8,0xda,0xe9,0x0c,0x15,0x11,0x12,0xc7,0x1a,0xff,0x12,0xdb,0xfb,0xef,0xd7,0xad,0xfc,0xff,0xf6,0xdc,0x01,0xf3,0x0b,0x24,0xf1,0xed,0xd1,0xd6,0x43,0xd3,0xff,0xdd,0x23,0xf2,0x28,0xc9,0x03,0x13,0x0a,0xee,0xdf,0x02,0xcf,0x02,0xda,0x0d,0x29,0xfc,0x21,0xe5,0xe8,0x41,0xef,0xc7,0xd3,0xf4,0xcd,0x0a,0x03,0x06,0xf9,0x26,0xe3,0x28,0x20,0x3f,0xe2,0xd6,0x25,0x44,0x06,0x45,0x67,0x21,0xdd,0x21,0x16,0x0c,0x2c,0xf0,0x1a,0xcc,0xc1,0x10,0x17,0xf6,0x05,0x2f,0xe2,0xe9,0xec,0xf3,0xb5,0xf2,0x20,0x0d,0x11,0xca,0xa0,0xff,0xe4,0xe1,0x97,0x26,0xc8,0xc4,0xe0,0x43,0x21,0xd5,0xc9,0xca,0x00,0x33,0x32,0x26,0x0f,0xef,0xae,0xda,0x3c,0xe0,0x3f,0x1c,0xc3,0x1a,0xf8,0xd5,0x11,0x21,0x58,0xc8,0x08,0x2e,0x23,0x21,0xd7,0x08,0xf2,0x31,0xe6,0xe7,0xef,0xe7,0xca,0xee,0xdd,0xe1,0x47,0x0b,0x1a,0x04,0xfe,0xf2,0xf2,0xc9,0xf5,0x1d,0xe7,0x03,0x11,0x02,0x32,0x14,0xf9,0xe2,0xc5,0xea,0xdc,0x0e,0x45,0xf2,0x2d,0xd6,0xf2,0x04,0x2c,0xe3,0x7f,0x2f,0x29,0x59,0xf8,0x24,0x52,0x46,0xef,0x59,0x73,0x8d,0x15,0xfc,0xcc,0x7e,0xec,0x0e,0xc6,0xe2,0x4f,0x15,0x2c,0xeb,0x3c,0xfa,0x04,0x03,0x5c,0xda,0x15,0x35,0xe4,0xdf,0xbc,0x07,0x1d,0xfd,0xfa,0x51,0x3a,0xf6,0x54,0x09,0x91,0x04,0xe4,0xec,0x27,0x15,0xe1,0xae,0x3c,0x08,0xf0,0xea,0x01,0xe3,0xf5,0x7f,0x35,0x3f,0x04,0xc4,0xdd,0x75,0x28,0x10,0x50,0xf4,0xdc,0xaa,0x42,0xd2,0x9b,0x09,0xf4,0x47,0x57,0xf1,0x3f,0xe6,0xdb,0xec,0x30,0x72,0x90,0x96,0x4f,0xe6,0xd2,0xf4,0x01,0x22,0xea,0x21,0x0c,0xa4,0xfe,0xf6,0x3b,0x6d,0xc0,0xf0,0xf5,0xf0,0xf5,0x00,0x5e,0xce,0x38,0xb3,0x27,0x96,0x97,0xf9,0xec,0xb8,0xc5,0x10,0xf8,0x12,0xc5,0xf3,0x97,0x20,0xe7,0xf3,0xe5,0xb4,0x23,0xe4,0x0d,0x3f,0xa8,0x17,0xcf,0x0d,0x4c,0x18,0xdd,0x10,0xf8,0x81,0x28,0x00,0xeb,0xd8,0xfa,0x36,0x49,0xfa,0x2b,0xdc,0xea,0x24,0xdb,0xb8,0x09,0x20,0x67,0x12,0x0f,0x12,0x07,0x01,0x9b,0xba,0x0d,0xc0,0x6f,0x07,0xec,0xc0,0x20,0x27,0x11,0xe1,0x22,0x1b,0x0f,0x2f,0xe9,0x34,0xc1,0x11,0xbf,0xd6,0xce,0xad,0x02,0x1a,0x2d,0x1f,0xe1,0x06,0x2e,0x06,0xe6,0x02,0x34,0xd2,0xab,0x1b,0x71,0x08,0xec,0xd7,0xd4,0x2b,0xe2,0x26,0xf7,0x01,0xfc,0x30,0x00,0x57,0xea,0xc0,0x0b,0x0a,0xc0,0x1b,0xdd,0x51,0x1d,0xda,0x6d,0xc6,0x29,0xfe,0x04,0x38,0xf4,0x0f,0x1b,0xfc,0xbb,0x51,0xd6,0x2c,0xf4,0x2e,0xa5,0xc7,0xe9,0x23,0xec,0x51,0x12,0xfb,0xcc,0x0c,0xed,0x75,0xac,0xe9,0x31,0x37,0x21,0x5b,0xcc,0xcf,0xde,0xd0,0x6c,0x63,0x0d,0xc9,0x2b,0x4c,0xe8,0xb8,0x27,0xe2,0xa3,0x47,0xef,0x1b,0x26,0xec,0xc6,0xfb,0x64,0x14,0xcd,0xf3,0x08,0x30,0x19,0xbf,0x28,0xe4,0x06,0xd7,0x84,0xd4,0x45,0x8b,0x06,0xe8,0xab,0xdc,0x39,0x17,0x2c,0xd2,0xa8,0x4e,0x10,0xd9,0xb0,0xe4,0x3d,0xb7,0x01,0xce,0xe3,0xd5,0x03,0x10,0xed,0xe5,0x32,0x4c,0xbb,0x1d,0x2f,0xbf,0xba,0x22,0x08,0x2e,0x6f,0x28,0xa5,0xbc,0xfa,0xe8,0xad,0x8f,0x92,0xe3,0xe4,0x29,0x14,0xe4,0xdd,0xd2,0xf6,0xd1,0xd2,0x29,0x06,0xc9,0xe7,0xe8,0x0c,0x6d,0x5d,0x27,0x20,0xc4,0xaf,0x0b,0xeb,0x26,0x91,0xe2,0xf2,0x14,0x0f,0x81,0x21,0x04,0xd0,0x17,0x5e,0x07,0x1b,0x62,0x26,0x15,0x23,0xfb,0xe3,0x2f,0x00,0xe3,0xe4,0xcc,0xf7,0x9f,0x18,0x0b,0x08,0x2b,0xf3,0xd6,0xfc,0xf0,0xf5,0xc2,0xba,0xd6,0xa3,0xb3,0x0f,0x10,0xfb,0x11,0x26,0xde,0x18,0x12,0xfa,0x13,0xfe,0xb6,0xf4,0xf5,0x30,0xd1,0xcf,0xfc,0xfe,0x19,0xd4,0xbf,0x24,0xc1,0xc4,0xdc,0x2f,0xec,0x47,0x49,0xa8,0xe4,0x19,0x11,0xfb,0x9b,0x1f,0xe1,0xd2,0x38,0xe3,0xf1,0x32,0xff,0xd8,0x0a,0x14,0xd6,0x1c,0xb9,0x54,0xdd,0x37,0xce,0xd1,0xfd,0xde,0x09,0xbb,0xe8,0x12,0xfc,0xf2,0x10,0x1e,0xfb,0xe5,0xe5,0x1d,0xd0,0x0a,0xdb,0x81,0xe3,0xe8,0xe8,0x3f,0xa6,0xd9,0xf3,0xf3,0x20,0x2b,0xf8,0x3b,0x19,0x40,0xf1,0xc0,0x1d,0x7d,0x0e,0x55,0x46,0xc1,0xf5,0xe3,0x14,0x62,0xf0,0x13,0xe5,0x05,0xe5,0x0b,0xca,0x10,0xf9,0xe0,0xde,0x45,0xd2,0x28,0x2c,0x3f,0xef,0x47,0xd3,0x1d,0xd6,0xe1,0xb4,0x10,0xff,0x29,0x36,0x5d,0xe8,0x1b,0x02,0xe4,0x0f,0x04,0x0e,0xf5,0xdd,0x09,0x28,0x0c,0x1a,0x26,0x0e,0xe6,0xab,0x81,0xda,0xdc,0x38,0xcc,0xef,0xc6,0xb3,0x12,0x01,0xc4,0xd1,0xe8,0xf2,0xfa,0x38,0x0f,0x53,0x42,0xfd,0xfc,0xc4,0xc0,0x19,0xd9,0x30,0x12,0xf8,0x23,0xad,0xfa,0x19,0xf0,0x27,0x14,0xf3,0xb3,0xdd,0xf9,0xbf,0x42,0xdc,0x1f,0x2c,0x35,0xe6,0xd3,0xc3,0xee,0x0b,0x03,0xe1,0x1b,0xa0,0x07,0x09,0x04,0x8d,0xfe,0x0c,0xda,0x34,0xc0,0xfa,0x25,0x0a,0x2f,0x1e,0xe4,0xf3,0x13,0xe6,0xf1,0xbd,0xd0,0xf8,0x43,0xe2,0x04,0xce,0x33,0x00,0x1e,0xbb,0xb3,0xe5,0xf2,0xe7,0xed,0xea,0x11,0x19,0xfe,0xfc,0x19,0x27,0xd8,0xc0,0x09,0x75,0xfe,0xf2,0xf9,0xcf,0xf8,0xf7,0x03,0xeb,0x10,0x19,0x3f,0x3d,0xe0,0x3d,0x22,0x23,0xef,0x02,0x42,0xe5,0xd6,0x32,0xfa,0x08,0x38,0xe3,0xca,0x5f,0x16,0xc3,0xc4,0x02,0x4c,0xd5,0x08,0xa4,0xfa,0x29,0xf9,0xe6,0x37,0xfe,0xfd,0xdc,0xbd,0x48,0x12,0x3c,0xf4,0xed,0x0d,0x04,0x04,0xe5,0x12,0x04,0xe2,0xc7,0x17,0xdc,0x40,0x2c,0xe5,0xe5,0x31,0x0b,0xd3,0xcb,0x25,0xf0,0xfd,0xff,0x12,0x25,0xda,0x18,0x1c,0x0c,0xf7,0xd3,0x11,0x4c,0xd9,0x05,0xd2,0x08,0xee,0x3f,0x19,0xd3,0xf5,0xd9,0xe4,0x12,0x0f,0x25,0x30,0xeb,0x11,0xe9,0x22,0x12,0x81,0x04,0xd9,0xe1,0x1a,0x22,0x07,0x35,0x01,0xb6,0xdf,0xef,0x06,0x15,0xdb,0x3e,0x0b,0xcb,0x0b,0x01,0x3e,0x0f,0xbc,0xe7,0xf3,0x2f,0x08,0x27,0x3a,0xb6,0xd3,0x4d,0xf8,0xe7,0x2e,0x77,0x8f,0xed,0x21,0x28,0xe9,0xfb,0xee,0x0c,0xd1,0xfc,0xec,0xfa,0xfa,0xf5,0xf1,0x1f,0x1d,0xce,0x04,0x22,0xb6,0x1d,0x1a,0xd5,0x72,0x9f,0x34,0x01,0xc9,0x03,0x08,0xe4,0x39,0xff,0xcf,0x13,0xf6,0xf0,0x35,0xfb,0x79,0xa8,0xe8,0xf3,0xee,0x0b,0xe9,0x15,0x3c,0xf8,0xc0,0x44,0xb8,0xe2,0xec,0x08,0x24,0xbf,0x14,0x2b,0xe5,0xe6,0x22,0xfc,0x12,0x0d,0x1d,0xc8,0xf6,0x0c,0xdb,0x46,0xfe,0xc5,0x8b,0x83,0x0e,0x25,0x32,0x46,0xbe,0x8f,0xd8,0xc4,0xd9,0xf6,0x3d,0x41,0xed,0x20,0xf2,0xd5,0x42,0xe0,0x2e,0x20,0xfe,0x0e,0x2e,0xe3,0xed,0x0b,0x7f,0x24,0x5b,0xdf,0xed,0xfa,0xd1,0xf2,0x69,0x29,0x72,0x13,0xd0,0x60,0xee,0xf9,0xc3,0x2d,0xff,0xf8,0xfd,0x1b,0xf8,0x07,0x3d,0x1b,0xbe,0xe6,0x02,0xd6,0x2f,0x29,0x15,0xe3,0x26,0xc7,0xde,0x30,0x2f,0xf6,0xe9,0x2a,0x8f,0x1c,0x0b,0xd9,0x1c,0x01,0xc8,0x06,0xf3,0x31,0xc0,0x00,0xf4,0x33,0x11,0xe9,0x23,0xdd,0xf2,0xfc,0x11,0xfb,0x4f,0x1f,0xb7,0x19,0xc0,0x19,0xf4,0x22,0x26,0x0a,0x1e,0xd9,0xfb,0x18,0x12,0x12,0xf5,0x10,0x08,0xf9,0x12,0x4e,0x37,0x38,0xeb,0xfd,0xf0,0x24,0xdb,0xc6,0xfc,0xeb,0x1f,0xfd,0xc6,0x10,0xf1,0x36,0xe9,0x16,0xfa,0x4a,0xf1,0x0a,0xf4,0xee,0xe2,0x81,0x33,0x47,0xef,0x0c,0x30,0xcb,0xe4,0x15,0x2d,0x3d,0xf6,0x1e,0x32,0xfd,0x23,0x04,0xbe,0x22,0xfe,0x0e,0x30,0xff,0x57,0x19,0xf3,0xf5,0x12,0xe7,0x21,0x0c,0xd4,0xf9,0x32,0x1f,0x46,0xe1,0x36,0x06,0x4f,0xdc,0x02,0x4a,0xe5,0x29,0xd1,0x41,0xfc,0x2e,0x58,0xdb,0xee,0xfd,0x11,0x34,0xf3,0x0e,0xeb,0x51,0xd6,0xb8,0x12,0xe5,0x1c,0x17,0x3e,0x38,0x0a,0xd6,0xf1,0x28,0x09,0xf1,0x1c,0xee,0xaf,0xb0,0x10,0xc1,0xe9,0x2c,0xc8,0xaa,0xb0,0x52,0xf0,0x4c,0x37,0xd1,0x21,0xff,0x24,0xbf,0x38,0x0a,0xf4,0xa2,0xdc,0x28,0xb7,0xf5,0xf6,0xf0,0xbd,0x09,0xf5,0xe6,0x02,0x08,0xfe,0xa2,0xdb,0x28,0x26,0x26,0xdd,0x15,0x38,0xfd,0xe6,0xdd,0x00,0xdb,0xea,0xc7,0x08,0xa0,0x08,0x30,0x07,0xf6,0xb4,0xf2,0x1f,0xf1,0xcb,0x91,0x4b,0xe4,0x37,0xf1,0x7f,0x2f,0x53,0x03,0xeb,0x65,0x05,0xbe,0xb3,0xdb,0xd3,0x1c,0xcb,0x4a,0xf4,0x23,0xd8,0x1a,0x33,0xc8,0xd5,0xfe,0x21,0x17,0x35,0x3f,0xfb,0xcb,0x06,0xc8,0x07,0xf6,0xde,0xd3,0xdc,0x07,0x02,0x23,0x4f,0x30,0x08,0xe5,0xfb,0x1c,0xf8,0xc6,0xce,0x07,0x1d,0x1f,0x41,0xea,0xf0,0xce,0x44,0xee,0x0c,0xd6,0xc6,0x08,0xe4,0xd8,0x2f,0xf7,0xf7,0xbc,0xad,0xe0,0x32,0xbf,0xed,0x86,0x1b,0xe4,0xfc,0xfc,0x42,0x16,0x2a,0xc6,0xca,0xe8,0xf8,0x42,0xf7,0x0b,0xf5,0xfd,0xf8,0xe2,0xe3,0x20,0xfb,0xee,0x14,0x25,0x12,0x3a,0xe6,0xd9,0x16,0xef,0xbb,0xed,0x3d,0xe9,0xe4,0x1e,0xe5,0x17,0x45,0xa1,0x32,0xe2,0xc0,0x90,0x17,0x29,0x2a,0xe5,0x1f,0x0a,0x36,0x1c,0xd0,0xed,0x2f,0x1b,0xe9,0x18,0x82,0x0b,0x81,0x00,0x15,0x32,0xd6,0xe5,0x2b,0x24,0xf2,0xf1,0xe6,0xc5,0xf9,0x0a,0xec,0x25,0xd6,0xe8,0xdb,0x21,0xff,0xc0,0xee,0xe7,0xee,0x29,0xe2,0x40,0x1b,0x1f,0xf9,0x48,0x10,0xe1,0x0b,0xf9,0xdd,0x20,0xf5,0x28,0xdf,0x02,0xdf,0xdb,0xc5,0x02,0xfd,0x45,0x28,0x38,0x1f,0xf0,0x40,0xc7,0xf0,0xf5,0x16,0x18,0xf7,0xba,0x36,0xe7,0xcf,0xd0,0xf3,0xeb,0xc9,0x14,0x00,0xee,0xfc,0x1c,0xee,0xe4,0x0e,0xdc,0x1d,0xdb,0x35,0xe2,0x05,0x19,0xc0,0x4d,0xe8,0x16,0xd9,0x0c,0xe5,0xe5,0x1e,0x03,0xce,0x19,0x14,0x81,0x1f,0xfb,0x47,0x0b,0x03,0x15,0xe8,0x01,0xf8,0x13,0xfc,0x08,0x02,0x02,0xf5,0x0d,0xf4,0x28,0x04,0xfd,0xfd,0xc2,0x09,0x15,0xf9,0xaa,0x06,0x0a,0x0e,0x00,0x10,0x04,0xb7,0xb2,0xc3,0xee,0xc9,0x30,0x48,0x10,0x5a,0xd2,0xe2,0x08,0xee,0xef,0xdb,0x00,0x06,0x53,0xfe,0x28,0xeb,0xf4,0xb6,0xfe,0x0d,0x25,0xe1,0x17,0x06,0x00,0xfc,0x04,0xdc,0x3a,0x33,0x11,0x41,0x1b,0xee,0x1b,0x06,0xd6,0xdd,0x2a,0x03,0x3e,0xe4,0xe7,0x46,0xf5,0xec,0x2d,0x1b,0xe0,0xe9,0x02,0xed,0xfc,0xd7,0xfe,0xe3,0xf5,0xbd,0x27,0xc5,0x2c,0x07,0x02,0x38,0x27,0xd7,0x37,0xe3,0x32,0x81,0xff,0xf2,0xd8,0x13,0x52,0xc4,0x4e,0x19,0xe6,0x30,0xc2,0xe5,0xc6,0x02,0x9c,0xf7,0xd9,0xee,0x02,0x14,0x98,0xe2,0x18,0xee,0x1a,0xf8,0x30,0xdc,0x0f,0x5e,0x15,0xe9,0x09,0xcf,0xd2,0xee,0xe7,0xdc,0x2b,0x1f,0x62,0x3b,0x00,0x32,0xd7,0x1f,0xcb,0xe2,0x13,0x9b,0x18,0xd4,0xde,0x1a,0xd7,0x69,0x22,0xeb,0xc9,0xaf,0x1e,0x1a,0xff,0xdb,0xcd,0xc7,0xfe,0xe7,0xce,0xea,0xb7,0xf1,0x16,0xe1,0xd8,0xf0,0xdf,0x38,0xe4,0x4c,0xdf,0x18,0xd9,0x3e,0xc3,0xca,0x30,0x27,0x03,0xf6,0xec,0x04,0xc3,0x16,0xb9,0x2f,0x16,0x0d,0x11,0x31,0xec,0xc9,0xf0,0x1d,0x02,0xdf,0xb5,0x4b,0x3a,0xaf,0x22,0xa0,0xe2,0x10,0xf2,0x52,0x54,0xe8,0xb7,0xe7,0x28,0x3f,0xcb,0x06,0xaa,0x1e,0xda,0xd0,0xcd,0x1d,0xf0,0xc8,0x05,0x03,0x26,0x0a,0x11,0xf5,0xed,0xf8,0x5b,0xed,0x9e,0xdd,0xbd,0xf7,0x7e,0xba,0xa1,0x1b,0x81,0xd0,0xe7,0xa1,0xfb,0xed,0xf6,0xf3,0x3c,0xc6,0xc1,0xfd,0x2b,0x28,0x0d,0xd9,0xce,0xf9,0xf4,0x44,0xf0,0x05,0x28,0x06,0x99,0xba,0x9c,0xf4,0x99,0x06,0xf0,0x1f,0xea,0xe0,0xd7,0xd4,0xe6,0x05,0x3f,0xab,0x1d,0x0c,0xaa,0xa2,0xce,0x48,0xd1,0xbb,0xc6,0x1b,0xe0,0xfe,0xd2,0xcf,0xc8,0xff,0xd5,0xf2,0xdd,0x3a,0xac,0x59,0x11,0x06,0xb1,0x3f,0xfb,0xe5,0xbc,0x50,0x35,0x20,0x18,0xea,0x6a,0x26,0xdd,0x38,0xdb,0x36,0xf3,0x1c,0xe3,0x48,0xf8,0x60,0x67,0x1e,0xd9,0xeb,0xe0,0xf2,0xdd,0xce,0x1c,0x3e,0x18,0x0e,0xa6,0xfe,0xdf,0x0c,0xd1,0xcc,0x2c,0xdb,0x0e,0xec,0xc0,0x17,0x2b,0xe5,0xfa,0x41,0x21,0xb0,0xfb,0xc2,0x42,0x24,0x2b,0x2f,0xdb,0xe4,0xc8,0x40,0x3f,0x17,0xb5,0xd2,0xf7,0x15,0x2e,0x18,0xc0,0xa2,0x3f,0x6d,0xe3,0xe1,0xb8,0xc3,0xba,0xfb,0x2c,0x0d,0xea,0x15,0xc7,0x06,0xdf,0xe0,0x55,0xc5,0xbf,0x0a,0xf1,0xe3,0xe3,0xef,0x1d,0x7f,0xef,0xef,0x4a,0xfd,0x1a,0x25,0x04,0xfe,0x03,0xd9,0xf2,0xef,0x12,0x28,0xef,0x36,0xcf,0x21,0x14,0x0d,0x21,0xf6,0xfa,0xfc,0xf3,0xe7,0xed,0xd6,0xdd,0xe2,0xed,0xb8,0xf0,0xe6,0x1d,0x17,0xf3,0x13,0xf0,0xd6,0x00,0xcc,0xe6,0x00,0x09,0xff,0xe5,0xb7,0xd8,0xf8,0x04,0x07,0xe2,0xf6,0xe3,0xf5,0x06,0xfd,0xde,0xfb,0xb8,0x18,0xff,0x02,0xf1,0x6d,0xfe,0x0d,0xfc,0x21,0xbb,0x0b,0xdf,0xe1,0xf8,0xde,0x27,0xe6,0xfa,0x3c,0xbb,0xfe,0x17,0x00,0xdb,0x1d,0xf0,0xd9,0xbe,0x12,0x7f,0xe9,0xd1,0xf7,0xe4,0x08,0xcc,0xe6,0xfb,0xda,0xe6,0xf9,0xf3,0xeb,0xf1,0xec,0xef,0x17,0x11,0xf0,0xfc,0x2d,0xf7,0xf9,0xc6,0xec,0x43,0xf6,0x01,0xfb,0xcc,0xe4,0xdb,0x3c,0x3e,0xff,0x0f,0x15,0xe4,0xfb,0xdd,0xfe,0x02,0xfa,0xe3,0x11,0x24,0x0f,0x0a,0x0f,0xe4,0x05,0xcd,0xa7,0x0d,0x8a,0x33,0xe8,0x2d,0xfc,0x49,0x06,0xb4,0xe7,0xe1,0x1f,0x0c,0xf3,0x3c,0xfc,0xc4,0xf7,0xf8,0x27,0x2c,0xe8,0xcc,0xe7,0xa3,0xb8,0x44,0xdc,0xf8,0x2a,0x54,0x92,0xd7,0x04,0xca,0x81,0xc5,0xdd,0xf7,0xc9,0x63,0x07,0xfc,0x00,0x0a,0x34,0x2b,0x43,0xd8,0xca,0xe0,0xc3,0xb0,0x12,0xfa,0xf9,0xa5,0xd6,0xc4,0xe3,0xff,0xe7,0xf9,0x23,0xbf,0x4c,0xbb,0xc5,0xfe,0x2b,0x43,0xf6,0xbb,0xfe,0x39,0xdc,0x09,0xc1,0x99,0x4f,0xf8,0xe1,0xe6,0x38,0xd8,0x16,0x11,0xf7,0x41,0xd5,0x1c,0x02,0x00,0xa9,0x13,0x02,0xf1,0x3f,0x3a,0x52,0xba,0xa1,0x85,0x8d,0x25,0xc9,0xdf,0xdf,0x01,0x1f,0x38,0xea,0x16,0x26,0x2c,0x12,0x26,0xfd,0x2c,0x13,0xf6,0x1e,0x1f,0x1c,0xdd,0xc9,0x7f,0x03,0xcd,0x04,0x0a,0xf3,0x15,0xe2,0x48,0x0e,0x38,0xd6,0x24,0x11,0x36,0x05,0x32,0x17,0x00,0x24,0xf9,0xd1,0x24,0x2b,0xc2,0xc0,0xf9,0xff,0xcc,0x0b,0x34,0xf0,0x27,0xfb,0xe4,0x2c,0x0a,0xf7,0xf3,0xe1,0xac,0xfd,0xe2,0xf5,0xdc,0xd8,0x05,0xa0,0x0d,0x5d,0x04,0xe5,0xca,0xfd,0x35,0xef,0xd4,0x1f,0x04,0xb9,0x0b,0xd7,0xed,0xd8,0x09,0x05,0xf4,0x0e,0xdd,0xf2,0xd5,0xf9,0x37,0xdf,0x25,0x20,0xdb,0xf5,0x14,0xf1,0x12,0xec,0xcd,0xd9,0xca,0x2c,0x2c,0xe1,0xfa,0x5f,0xb8,0xf5,0x01,0x09,0x26,0x0f,0xd5,0xf1,0x14,0x3c,0xec,0xd3,0xdf,0x41,0x11,0x3a,0xf6,0xce,0x11,0xd7,0x2a,0x4d,0x01,0x0b,0xec,0xfb,0x0a,0x55,0xd7,0x01,0xbc,0x38,0xe4,0xd3,0xf6,0xef,0x34,0xb8,0xf2,0x92,0x2d,0x91,0xb8,0x22,0xf5,0x2b,0xce,0x1a,0xbf,0x70,0x07,0x36,0xe9,0x99,0x1d,0x0a,0x08,0x29,0xce,0xee,0xfc,0x5d,0xb7,0xf2,0xa2,0xd3,0x38,0x2f,0x6a,0x31,0x34,0x41,0xc4,0x0e,0x1d,0x20,0x5d,0x94,0x1a,0xbd,0xb5,0xc6,0xd0,0x43,0xdb,0x3d,0x44,0xf8,0xba,0x0a,0xe5,0x2d,0xf2,0xd8,0x03,0xf7,0x33,0xbe,0x1d,0x4b,0x09,0xd6,0x09,0x1c,0xe9,0x46,0x0c,0x17,0xf5,0xf0,0xc9,0x34,0x56,0xb1,0xba,0x31,0xcf,0x0e,0x22,0x0b,0x47,0x4e,0x1d,0x05,0x38,0x81,0x73,0x2a,0xce,0x01,0x4f,0xe4,0xb0,0x4e,0x94,0xf5,0xac,0xd1,0xe8,0x16,0x10,0x0c,0xf8,0x3b,0xb8,0x12,0xe3,0xf5,0x59,0x64,0x1c,0x38,0xe6,0x10,0xd0,0xcc,0xc9,0x23,0xd6,0xf8,0xf9,0xf8,0xf1,0x19,0x0b,0x0f,0x0f,0x05,0xc7,0xe7,0x0c,0xdd,0x0c,0x0f,0x17,0xf8,0xf8,0xf6,0x09,0xf9,0xd6,0x1b,0x53,0x5b,0xf0,0xde,0xe9,0x1b,0x33,0x05,0x37,0xbd,0x2d,0x24,0xde,0x19,0xac,0x21,0x4c,0x0b,0x1b,0x14,0xd5,0x36,0x23,0xe6,0x20,0x26,0x22,0xf7,0xad,0xe6,0xd1,0xdc,0x97,0xca,0x20,0x3e,0x12,0xb4,0x2d,0x34,0xe7,0x35,0x1c,0x39,0xc1,0xb5,0x08,0xc0,0x21,0x1d,0xec,0x31,0x0a,0x1d,0x17,0xd4,0xe2,0xff,0xf4,0xdf,0x3d,0xf5,0xdf,0x02,0x48,0xe8,0x06,0xd7,0x15,0x17,0xf7,0xee,0x7f,0x24,0x07,0xe2,0x01,0xc9,0x18,0x2e,0xfc,0xfe,0x12,0xda,0xd8,0x07,0x08,0xfb,0xea,0xfa,0x01,0x07,0xe5,0x1b,0x00,0xd9,0xcf,0x32,0xf2,0xef,0xb4,0xeb,0xfd,0xf9,0x33,0xd7,0x07,0xbb,0xf4,0x0f,0xe9,0xf9,0x66,0xf7,0x2c,0x24,0xa3,0xef,0xf8,0x2a,0x1c,0x3e,0x8e,0xf0,0xaa,0xd1,0x05,0x12,0x9e,0x14,0xec,0x47,0x20,0x27,0x56,0xe8,0x36,0xa0,0x81,0xa5,0xa2,0xf7,0x0b,0x1b,0xdc,0xb0,0xb6,0xf6,0xff,0xf4,0x26,0xe7,0xce,0xc3,0x02,0x95,0x5e,0x8f,0xd4,0xb3,0xb9,0xe2,0x28,0xfa,0x00,0x0f,0x1a,0xee,0x2a,0x02,0xcf,0xb9,0xea,0xa8,0x03,0x3a,0xff,0xcf,0x07,0xe5,0x2d,0x3f,0x32,0xc0,0x0f,0xdf,0xd3,0xd5,0x0d,0xe6,0x10,0xe4,0x11,0xbd,0xb0,0x09,0x12,0x00,0xd6,0x37,0x22,0x36,0xd3,0xf6,0x8a,0xeb,0xd9,0x20,0xe2,0xfb,0xde,0x14,0x8c,0xc0,0xd0,0xe8,0x21,0xe9,0xab,0xd6,0x0c,0x1c,0x03,0x4e,0xf7,0x14,0xbf,0x0e,0xab,0x03,0x3f,0x22,0xcf,0x52,0xc6,0x33,0x7f,0xc7,0xd2,0x14,0x10,0x1d,0x0d,0x02,0xae,0xcd,0xc8,0xd8,0xff,0xfc,0xd7,0x1e,0x13,0xe0,0x2d,0xff,0x28,0x1f,0x00,0x22,0x21,0x10,0x0e,0xf9,0xc0,0x1c,0x28,0x26,0x9d,0x20,0x1a,0xd6,0x21,0x2a,0x2d,0x1a,0xe4,0xf3,0xea,0x14,0x0d,0x0c,0x19,0x09,0xcb,0x4f,0x51,0xd0,0x09,0x2f,0xdc,0x8c,0x23,0x12,0xae,0x29,0xe2,0xf6,0x21,0x29,0x32,0x22,0x18,0x23,0xf9,0x47,0xd0,0x44,0x23,0x05,0xe6,0x17,0x04,0x07,0x05,0xf8,0xff,0x49,0x0a,0x1f,0x0b,0xf0,0x54,0x23,0x0a,0x0a,0x05,0x0c,0x01,0x1b,0xde,0xf7,0xde,0xe1,0xd5,0x08,0x4f,0x1b,0xf1,0x22,0x27,0xb5,0x1e,0x14,0xdb,0x23,0xc8,0xfa,0xd9,0xf2,0xf0,0xd6,0x17,0xee,0x38,0xec,0x29,0xe2,0x26,0xcf,0xbc,0xe3,0xf9,0x1b,0xdd,0xcf,0x0b,0xe8,0xea,0xea,0x3d,0xea,0x2c,0xfa,0xc5,0x1c,0xfa,0xe4,0xea,0xfb,0xd4,0x31,0xef,0xe6,0xf9,0xcd,0xd3,0xe4,0xf0,0xc2,0xec,0xe9,0x08,0xbb,0x01,0x4a,0x19,0x1a,0xfc,0x22,0x81,0xee,0x44,0xf6,0x2e,0x2a,0xf3,0x04,0x1a,0xde,0xef,0xf5,0x22,0x03,0xe2,0xf9,0xf9,0x0b,0x0d,0x4f,0xf6,0xd1,0xe2,0xb6,0x2e,0x17,0xf3,0x0b,0xd7,0x47,0xed,0xb8,0xf2,0xfa,0x29,0xee,0x00,0xf9,0x19,0xe2,0xf0,0xf6,0xde,0xe7,0x2d,0x29,0x14,0x0b,0x18,0x37,0xf8,0x05,0x1e,0xeb,0xe6,0x22,0xf7,0x08,0xfb,0x05,0x0a,0x02,0x2f,0xef,0x0e,0x00,0xea,0xfa,0xe2,0x07,0x07,0xee,0xd1,0xfc,0xc9,0xf3,0x19,0x21,0x28,0xe5,0x0c,0xf0,0xe1,0x11,0x3e,0xe6,0x4b,0xd4,0x24,0x1d,0x1a,0xc3,0x94,0x34,0x3c,0x1e,0xfe,0x3e,0xb6,0x43,0x5b,0x33,0xe1,0xdc,0x01,0x2d,0x25,0x30,0x38,0xc6,0xd3,0xa1,0x50,0xcb,0x11,0x0c,0xc3,0xe7,0x2b,0x44,0x07,0x11,0x18,0x14,0x00,0xf2,0xc0,0x57,0xb4,0xae,0xea,0x06,0xed,0xb9,0xf4,0xe5,0xe4,0x36,0x39,0x0c,0xfa,0xba,0x05,0x31,0x2a,0xc8,0x50,0x38,0xde,0xee,0x2d,0x3c,0xfd,0x31,0xd1,0xff,0x33,0xa9,0x2c,0x21,0x6d,0x31,0xdb,0xd3,0x04,0x55,0x1f,0xbe,0x09,0x28,0x90,0x0e,0x79,0xf5,0xdb,0x3a,0xc0,0xd9,0x33,0xb5,0xda,0xd2,0xb2,0x17,0x0a,0xe8,0xf9,0x20,0x24,0x04,0xf8,0x11,0x1f,0x12,0xf5,0x32,0xa9,0xfb,0xe6,0x08,0xf2,0xe7,0x10,0x12,0x42,0x2a,0xd3,0xdb,0x21,0xd0,0x7f,0xab,0x1b,0x1f,0x27,0xd5,0xad,0x27,0x1c,0xed,0x0c,0x31,0xcd,0x10,0x17,0xa7,0x26,0x56,0x16,0xee,0x0f,0x68,0x41,0x1c,0xdd,0x0d,0xdc,0x19,0x3c,0xeb,0x04,0xae,0x35,0xe6,0x2f,0xf8,0x12,0x08,0xff,0xc5,0xd6,0xac,0xf1,0x2f,0xdd,0xb5,0xd5,0xfa,0x37,0x71,0xeb,0xf6,0xa5,0xe8,0xfa,0xda,0x00,0xd9,0xf5,0xc2,0xd0,0x37,0xee,0x1c,0xdd,0x1a,0xdb,0xd9,0x2a,0x0b,0xe3,0xbe,0x10,0xe6,0xdf,0xd2,0x14,0xcf,0x7f,0x4a,0xde,0xc8,0xf9,0xe1,0x32,0xf0,0x9f,0xe2,0xd8,0xf8,0x12,0xc9,0xf4,0x04,0x1b,0x05,0x27,0x2f,0x0d,0x21,0x03,0x20,0x2f,0xf9,0xf5,0xec,0x29,0x07,0xd4,0x2f,0xea,0xc7,0x02,0x04,0xa6,0x16,0xcc,0xc5,0xc5,0xf9,0xe5,0xf8,0xba,0xfd,0x1c,0x2e,0xf6,0x19,0x10,0xf1,0x4c,0x26,0x09,0xf1,0xed,0xc4,0xc4,0x75,0xde,0xfe,0xd7,0x20,0x50,0xf3,0xb1,0xe1,0xea,0x28,0x12,0x05,0xe7,0xe6,0x1c,0xe5,0xd3,0xea,0xf0,0xd8,0x3f,0xef,0x09,0xd5,0xe4,0x1a,0x40,0xf2,0x5f,0xfc,0x30,0xd9,0x82,0xea,0x29,0xc5,0x1b,0xfa,0xaf,0xd2,0xf4,0xd8,0xec,0x53,0xdd,0x2e,0x37,0xef,0xf9,0xe7,0x1d,0xff,0x16,0x38,0x18,0x7f,0xd8,0xe0,0xbc,0xf8,0x9a,0xe0,0xf5,0x2a,0x05,0x22,0x15,0x51,0xef,0xd0,0x70,0x22,0x6b,0x1a,0xcd,0xbb,0x60,0xc2,0xf3,0xd8,0x5f,0x5f,0xdd,0x0c,0xc1,0xe0,0xb9,0x12,0x0b,0xed,0x03,0x2b,0x39,0x1e,0x4e,0x2e,0xfa,0x3e,0x18,0xad,0xca,0x74,0xcc,0xe9,0x1b,0x1e,0xf6,0x13,0xe1,0x14,0x9f,0x46,0xcd,0x05,0x35,0x47,0x57,0xdf,0xf0,0x2c,0x25,0xde,0x28,0xc7,0x11,0xfe,0x19,0xe2,0xfd,0xfe,0xd8,0x5d,0xd5,0xca,0x97,0x59,0x21,0x1e,0x04,0xff,0x09,0x4b,0x17,0xc4,0x1d,0xc9,0xda,0x0a,0xf5,0xd0,0x01,0x30,0xff,0xb8,0x3d,0x20,0x38,0xb9,0x40,0xf9,0x2d,0xf0,0xe2,0xbd,0xcc,0xc4,0x07,0xde,0xf7,0xea,0xfc,0x46,0xd4,0xfb,0x09,0xc6,0xf9,0x43,0x6b,0xdd,0xe2,0xd3,0x18,0xdc,0x0b,0x39,0x93,0x32,0xfd,0x22,0x4c,0x06,0x72,0xfd,0xd0,0x18,0x14,0xeb,0x43,0x22,0x08,0xb6,0x29,0x00,0x32,0x7f,0x13,0x42,0xdc,0xd5,0x0d,0x53,0x10,0x09,0xfa,0x5a,0x0e,0x13,0xff,0xc0,0x18,0x34,0x1f,0x38,0x38,0x27,0xc4,0xf6,0x19,0x40,0xdc,0x30,0xc5,0xd7,0xad,0xf2,0xf5,0x06,0x07,0xdc,0x30,0x01,0x1c,0xe8,0x34,0xb8,0x3c,0xd1,0xdd,0x0c,0xf9,0x04,0xc0,0xb1,0xf5,0x35,0xbb,0x18,0x26,0xd4,0x00,0x30,0xf4,0xde,0xb9,0xba,0x0a,0x13,0xaa,0x0c,0xd6,0xe7,0x42,0x17,0xe3,0x19,0xc8,0x74,0xe8,0x13,0xf8,0x34,0xd2,0x1f,0xee,0xe9,0xef,0xdd,0x03,0xc8,0x4a,0x48,0x0a,0xaf,0xda,0xe1,0xee,0xca,0x75,0xaf,0x31,0xf6,0x0a,0x2a,0x2a,0xfc,0xf1,0x07,0xc4,0x9f,0xf9,0xba,0x1e,0x2d,0x15,0x12,0x5a,0xfe,0x16,0xec,0x0a,0x36,0xe7,0xbf,0xd0,0xe4,0xc5,0x0e,0x18,0xf7,0x0e,0xfe,0x4b,0x10,0xb3,0x35,0xd7,0x0d,0xe4,0x01,0xba,0xe6,0x22,0xd4,0x81,0x05,0x47,0x3f,0x05,0xd7,0xd7,0x12,0xfe,0x09,0x0d,0x1f,0xd8,0xff,0xc2,0xf5,0x1a,0x0f,0xe9,0xec,0x65,0xb3,0xc9,0x06,0xea,0x3b,0xe5,0xf1,0xf4,0xe5,0xd1,0x57,0xc0,0xc4,0x34,0x07,0xb5,0x05,0x07,0x12,0x3a,0xdf,0xe6,0xce,0xc7,0x1c,0x33,0xe4,0x95,0xf7,0x09,0x20,0x40,0x54,0xc0,0xde,0x17,0x4c,0xfa,0xff,0xc0,0x02,0x24,0x3a,0xf5,0xee,0x0d,0x91,0x2c,0x25,0x53,0xcf,0xdb,0x4f,0x4e,0xfa,0xd3,0xff,0xd2,0x2c,0xf0,0x12,0x18,0xf1,0x1e,0xcd,0xee,0xe6,0x03,0xe9,0x01,0xca,0xed,0xdb,0x1d,0x04,0xb1,0x7e,0xe6,0xf9,0xce,0xcd,0xf0,0x01,0xf0,0x3e,0x19,0x05,0x0e,0x3d,0x0a,0xe6,0x2a,0x20,0xd4,0xe0,0x1e,0x26,0x1e,0xbe,0x42,0x24,0xc8,0x31,0x22,0x39,0x23,0xc2,0x6a,0xe7,0x22,0x11,0x37,0x26,0x1e,0x08,0xb9,0x1f,0x01,0xef,0x02,0xef,0xfa,0x1d,0x1b,0x0e,0x1c,0x09,0x22,0xfc,0xdd,0xba,0x7f,0xdb,0x0f,0xe3,0x4f,0x0b,0xd9,0x0d,0xc6,0xee,0x29,0xfe,0x9d,0x10,0xbc,0x02,0xe6,0x17,0x26,0x20,0x39,0xe1,0x1f,0x07,0xdf,0xe8,0x16,0x18,0xdd,0x26,0xe1,0xb2,0x46,0x1d,0x04,0xe3,0xf8,0x0e,0x38,0x1e,0xea,0x0a,0x30,0x2a,0x36,0x31,0x2d,0x16,0xd1,0xd0,0xda,0x03,0x11,0xb7,0xc0,0xf7,0xd9,0xd3,0x2e,0x02,0xd7,0x2b,0xf9,0x94,0xf6,0xee,0xfe,0xdd,0x3f,0x61,0xf5,0x98,0xf7,0x02,0xe9,0x16,0xdb,0x44,0x2d,0x4c,0xf9,0x0c,0x09,0x6b,0x2e,0x27,0xba,0x04,0xf0,0xcb,0x01,0xd3,0xe4,0xbe,0xe6,0x22,0xcc,0x05,0xe0,0xec,0x13,0x0c,0xcd,0xba,0xe8,0x16,0xfd,0x66,0x7f,0xfe,0x49,0xc3,0x39,0xd8,0xce,0xe2,0xfc,0x0a,0x12,0xfd,0xd2,0x01,0xb2,0x11,0xfa,0xf0,0xff,0x06,0x3d,0xde,0xed,0x9b,0x08,0xf8,0xca,0xd1,0xca,0xbe,0xe8,0x08,0x63,0xc2,0xa8,0x1f,0x5b,0x4c,0x11,0xd0,0x31,0x19,0x2d,0xf5,0xab,0xe1,0xef,0xe2,0xfd,0xf5,0x1d,0xe6,0x38,0x07,0x2d,0xf4,0xcb,0x0d,0xc5,0x17,0x02,0x34,0xb0,0x55,0xec,0xca,0xef,0x1e,0xd8,0x17,0x03,0xd6,0xf1,0x49,0x06,0xdc,0xf8,0x2f,0xf6,0x00,0xeb,0x81,0x1e,0xb7,0xe4,0xe4,0xc3,0x22,0x28,0x03,0x08,0xbb,0x56,0x2e,0xf4,0xda,0x00,0xff,0xfc,0x69,0x14,0x09,0x06,0xc9,0x0f,0x3f,0x0f,0xef,0xbd,0xe4,0x58,0xe8,0x1f,0x5f,0x14,0xf5,0xec,0xe7,0xfb,0x1e,0xa7,0xd7,0xfa,0xf2,0x11,0x27,0x00,0xe4,0xed,0x14,0xf2,0x04,0x1d,0xaf,0x53,0x04,0x43,0x2c,0xe5,0xd9,0x1f,0xbe,0x1c,0xc8,0xcf,0xe4,0x04,0xa2,0x1a,0xdf,0xff,0x20,0xfe,0xd9,0xf9,0x11,0xf4,0xeb,0xe4,0xc5,0x95,0x19,0x2f,0x09,0xcc,0xc7,0xda,0x11,0xd9,0x36,0x01,0x67,0xf3,0xde,0xfc,0x2c,0xbe,0x6e,0xfa,0xfa,0x34,0xb5,0xf8,0xb1,0xac,0x15,0xdb,0x12,0xec,0x1a,0xed,0x2d,0x31,0xd2,0xff,0x70,0x12,0x0d,0x0c,0x08,0xa9,0x4d,0xf3,0xf1,0x1f,0x45,0x6c,0xff,0x5b,0xc2,0x8c,0x0b,0xff,0x14,0xce,0x45,0x55,0x0d,0x66,0x66,0x13,0x3d,0x02,0xf1,0x0b,0xe8,0xe5,0x54,0xf2,0xc7,0xd9,0xda,0x01,0xda,0xcc,0xce,0x29,0xd0,0x17,0xdf,0xbd,0xa6,0x0c,0x23,0x19,0x22,0xf6,0xf4,0x1a,0xec,0xcb,0x18,0x57,0xec,0x71,0x18,0x34,0x1c,0x0e,0xf8,0x19,0xe2,0x51,0xa2,0x3e,0x90,0xda,0x0d,0xc8,0x10,0x0a,0x28,0xa7,0x72,0x81,0xbd,0x1f,0x40,0x1f,0x9d,0x26,0x0a,0xdf,0x0e,0x1b,0xde,0xcf,0xe1,0xfe,0xdb,0xea,0x09,0xf9,0x30,0x45,0x1c,0x0d,0x05,0xf1,0xc5,0xd5,0x46,0x04,0x02,0x3b,0xe0,0xd5,0x08,0x1c,0x3b,0x07,0x54,0xec,0x3c,0xf1,0xed,0x7f,0x15,0x1d,0xf6,0x2f,0xd8,0xc2,0xfa,0xd0,0xd2,0x34,0x20,0x3d,0x04,0xe6,0xde,0xf4,0xef,0xe2,0xee,0x0b,0xe7,0xbb,0xcd,0x33,0xf7,0xca,0xfd,0xe9,0x42,0x43,0x25,0x7e,0xdb,0x4e,0x16,0xde,0xfb,0xf3,0x75,0xfd,0x8f,0xff,0x13,0x18,0x2b,0x17,0xdc,0x0d,0xd6,0x0f,0x37,0x73,0xbe,0x14,0xe0,0x26,0x38,0x0f,0x16,0x11,0x02,0xe3,0xed,0x01,0x23,0x10,0x26,0x0d,0xe2,0x20,0xff,0xfb,0xe2,0x3d,0x00,0x13,0x01,0xb4,0xf3,0xc0,0xfb,0x4f,0x56,0xc7,0x0a,0xea,0x22,0xd7,0x15,0x71,0xfb,0x2a,0x4c,0xd9,0xf8,0xd7,0x2c,0x1e,0x06,0xc7,0xe6,0xe5,0xe8,0x24,0x20,0xd6,0xbf,0x1f,0xf3,0x08,0x1e,0xfb,0xcd,0xad,0xf6,0x16,0x6a,0x31,0x3e,0x32,0xa6,0x0a,0xe3,0x90,0x4b,0xf8,0x31,0xcf,0xc3,0x10,0xdf,0xb8,0xfe,0xb5,0x0d,0x9f,0x2a,0x1d,0xf0,0x0e,0xd0,0x5c,0x0c,0x0e,0xd6,0x1a,0xd6,0x2a,0xbc,0xf7,0x44,0x22,0xc4,0xe2,0xe4,0x27,0x9f,0xda,0x13,0x38,0x20,0x17,0x44,0x16,0xb8,0xcd,0x0a,0x0e,0x09,0x53,0xf0,0x2e,0x0b,0xb6,0x7f,0xfc,0x41,0xe6,0xe2,0x34,0xd0,0x0c,0x47,0x19,0x4c,0xa5,0x0a,0x04,0xc5,0x01,0xb7,0xed,0x3d,0x35,0x63,0xe5,0x43,0xce,0x22,0xd1,0x07,0x20,0x6e,0xe7,0x29,0x16,0x0f,0x07,0xf6,0xd7,0xfd,0x24,0xf7,0xd6,0x16,0x52,0xe1,0xe6,0xa1,0xe5,0x13,0xf2,0xb7,0x0e,0xe7,0x05,0xe4,0xe0,0x20,0x0e,0xf4,0xd5,0x1a,0x0e,0xea,0xea,0xfe,0xdc,0x29,0x30,0xd6,0xb7,0xdd,0x38,0xea,0x2e,0x18,0x62,0x30,0xe4,0xe6,0xe5,0xef,0x1e,0xf4,0x03,0x0e,0x09,0xdc,0x4f,0x4c,0x17,0xe2,0x33,0xf4,0xfd,0xe6,0xf2,0x24,0xff,0x22,0x50,0x1d,0xdd,0xfd,0xc5,0x21,0x42,0x11,0xce,0xdf,0x3c,0xc2,0xc6,0xcd,0xea,0xd7,0x14,0x53,0xc5,0x02,0xb8,0x2b,0x0b,0xfc,0x32,0xe7,0xe7,0x28,0xc8,0xd3,0x8b,0x13,0x0a,0x50,0x70,0xf5,0x7d,0x92,0x45,0x29,0xea,0xf8,0xdb,0xdb,0xee,0x17,0x56,0x6b,0x25,0x08,0xd8,0xd7,0xb5,0xff,0xb5,0x05,0x0e,0x25,0x13,0x4f,0x6a,0x81,0x48,0x24,0x37,0x72,0xc2,0x25,0xf8,0x59,0x19,0xf8,0x3c,0xe8,0x02,0xff,0x47,0xef,0x59,0xeb,0xf9,0xe9,0xf9,0x35,0xe2,0xb8,0x10,0xed,0xb9,0xfa,0x2b,0x1b,0x0a,0xf6,0xb7,0xf2,0xb0,0x40,0x1c,0x15,0x07,0xd4,0xe1,0x2a,0x08,0xf0,0x20,0x39,0xd8,0x13,0x2b,0x22,0x2d,0xdf,0xe5,0xf6,0x13,0x14,0x99,0xc4,0xc5,0x17,0x2e,0xeb,0x0e,0xd1,0x1e,0x17,0x14,0xad,0xdf,0xbd,0xf4,0x24,0xef,0xe8,0xfa,0xf6,0x1c,0xec,0xe0,0x15,0x08,0xdc,0xcc,0xf1,0x26,0x07,0xf0,0x34,0xdd,0x21,0x1f,0x8f,0x4c,0xf3,0xec,0x4c,0x2e,0xc5,0x64,0x27,0x37,0x04,0xd8,0xec,0xe2,0xeb,0xa3,0x21,0xfa,0x11,0x07,0x0f,0x1d,0x57,0x40,0x06,0xc3,0xd8,0x38,0xd1,0x08,0x02,0x22,0x18,0x19,0xcd,0xe8,0xf3,0x44,0xe9,0xb5,0xe4,0xfc,0x41,0xd1,0x1a,0xf4,0x48,0xe8,0x0e,0x6e,0x2a,0x7f,0xec,0xe3,0x03,0xe8,0x17,0xf1,0xe6,0x12,0x4f,0xeb,0xe6,0x20,0x2b,0xea,0x97,0xfa,0xda,0xdd,0x1c,0x21,0x1c,0x01,0x11,0x12,0x03,0xaf,0x13,0xd9,0x2f,0x10,0xfc,0xc4,0x31,0x16,0xbf,0xfb,0x30,0x03,0xb4,0xeb,0xd9,0xc6,0x0b,0x50,0x2c,0x54,0xe5,0xbf,0x70,0xba,0x10,0xe6,0xe8,0x23,0x17,0x24,0x46,0x18,0xc9,0x2a,0xb5,0xec,0xf4,0x81,0x85,0x21,0x8e,0x1a,0x79,0xe8,0x22,0xf4,0xf1,0xd1,0xa8,0xf9,0x98,0xba,0xfe,0xcc,0xfb,0xe7,0x33,0x1d,0x3c,0x0a,0xe5,0x10,0x05,0x30,0x17,0xbd,0x59,0xe6,0x49,0xe2,0xd0,0xcf,0xb4,0x35,0x0d,0x6e,0x58,0xe4,0x58,0xac,0xbe,0x07,0x13,0xd3,0xf5,0xf5,0x13,0xfb,0x35,0xc0,0x2d,0xca,0x36,0xa2,0xff,0x40,0x38,0xef,0xf2,0x1c,0x1c,0x05,0x42,0xaf,0x45,0x25,0xca,0x00,0xdf,0x3f,0xb0,0xec,0xd0,0xe4,0x1e,0xec,0x15,0x15,0xf0,0x2b,0xef,0xbc,0xfc,0x14,0xfd,0xe0,0x36,0x05,0xad,0xe2,0xbd,0xdc,0x08,0x0d,0xfd,0xdd,0xdc,0x11,0xf4,0xcc,0x1a,0xef,0xe2,0x07,0x25,0x20,0xd1,0xe8,0xd0,0x45,0x7b,0xdc,0xee,0x01,0xfb,0xfa,0xf6,0x11,0xc9,0xa5,0xda,0xde,0x13,0xfc,0xfe,0xc7,0x49,0x08,0xdb,0x16,0x2d,0xd5,0xe5,0xdc,0xc8,0x0e,0xfd,0xff,0xe3,0x31,0x48,0x9f,0xde,0x46,0xdb,0xf6,0x0d,0x3a,0xf7,0xb5,0x7f,0x02,0xc7,0xa6,0xdf,0x04,0xdc,0x0c,0xcb,0x0b,0xbb,0xf7,0x4f,0xf7,0x46,0x11,0x2a,0x64,0x1e,0x37,0xec,0xd5,0x8c,0xef,0x3a,0x1f,0x1d,0x46,0xdd,0xeb,0xcc,0x1d,0xe7,0x99,0x17,0x10,0x12,0xb8,0x17,0x00,0xcb,0x0f,0x02,0xcb,0x10,0x3e,0x31,0x04,0x51,0x26,0x2d,0xf9,0xfe,0xe0,0xd0,0x18,0xc9,0x71,0x32,0x2a,0x12,0xd1,0xed,0x2b,0x43,0xb1,0xe2,0xf8,0x28,0xc6,0xf7,0xd8,0x04,0x2c,0xc5,0x09,0xf9,0x0c,0xe6,0x0b,0xdc,0x45,0x31,0x31,0xe1,0x15,0x40,0xef,0x0c,0x03,0xf9,0xf5,0xc5,0x15,0x1b,0x05,0x35,0xe8,0xc2,0xf8,0xe6,0x24,0xcf,0x40,0x37,0xfc,0x7f,0xf1,0xdd,0x02,0x0a,0xbb,0xe1,0x1e,0x12,0xd3,0xe3,0x12,0xd5,0xec,0x21,0xf1,0xd2,0x2d,0xc1,0xe3,0xec,0xf5,0xfa,0xf9,0xd0,0x96,0x2e,0xfb,0xcd,0x20,0xd6,0xd2,0xe5,0x05,0x23,0x23,0x2d,0xff,0x13,0x53,0xec,0xc7,0xdb,0x03,0xff,0xf4,0x2c,0x04,0xe6,0xea,0xf2,0xee,0xed,0x5f,0x12,0xe0,0xf4,0x27,0xbb,0xf9,0xff,0x14,0x0e,0xcd,0x00,0x16,0xc5,0xc5,0x4f,0x0a,0xb9,0x15,0xfc,0xca,0x0f,0xf8,0x0f,0xde,0xdc,0xdd,0x23,0x01,0xf8,0xf2,0x2e,0xe0,0xf9,0xf0,0x40,0xe5,0xf5,0x2b,0x1f,0xc1,0x02,0x6b,0xf4,0xf2,0xde,0xcb,0x41,0x1a,0x01,0x52,0xf3,0xe5,0x06,0xc4,0x26,0x21,0xb3,0x19,0xd5,0xed,0x0e,0xe8,0xe7,0xf4,0xef,0x1e,0xdc,0xef,0xe8,0x0d,0xf9,0x06,0xe8,0xe9,0xd2,0xbd,0xff,0x19,0x1c,0x14,0x14,0x00,0xfd,0xdc,0x04,0xe8,0x81,0x35,0x0b,0x05,0xcb,0x00,0xe7,0x14,0xea,0xd6,0x0f,0xe2,0x03,0xbb,0x00,0xc3,0xf7,0x01,0xf9,0x17,0x0c,0x1a,0xe0,0xe0,0xcc,0x63,0xf1,0x22,0x17,0xfa,0xea,0x2e,0xea,0x1b,0xf5,0xde,0x0f,0xc8,0xe9,0xcc,0xe3,0xe7,0xf1,0x18,0x1a,0x01,0xe9,0x15,0xf9,0xe2,0xd2,0x33,0x0d,0xed,0x1e,0x25,0xf8,0xb0,0x13,0x0d,0xf2,0xdf,0xf3,0xcf,0x2e,0x24,0xa0,0xe6,0xd2,0xf7,0xf7,0x1f,0x24,0x02,0x2e,0xde,0x22,0xa4,0x15,0xcf,0xec,0x05,0xc8,0xf9,0x25,0x1d,0x2e,0x0f,0xee,0xc4,0x64,0xaf,0xcc,0x38,0x07,0x26,0xba,0x36,0x95,0xfb,0xbc,0xfb,0xf5,0xb7,0xf2,0xc1,0x33,0xc8,0x44,0xf9,0x08,0xc4,0x0a,0xd7,0x05,0xd7,0x58,0x44,0xdc,0xeb,0xd8,0xca,0xd1,0x18,0x18,0xc3,0x3a,0x3c,0x1c,0x3f,0x0b,0x1c,0xec,0x38,0xf8,0xa7,0xec,0xef,0xc5,0xda,0xf9,0xe1,0x09,0x3c,0x1c,0x43,0xfe,0xc8,0xef,0xe1,0xc1,0x03,0xaf,0x60,0x2a,0x9f,0xf6,0x0e,0xeb,0x1b,0xaf,0x04,0x38,0xe6,0x3e,0xc1,0xb7,0x2a,0x0b,0x04,0xd0,0xce,0x43,0x81,0xf7,0xfc,0x7c,0x10,0xe3,0xf6,0xdc,0xfc,0x22,0xf5,0x0a,0x15,0xdc,0xed,0x06,0xe5,0xf7,0x1d,0x0f,0x20,0x51,0xe5,0xe1,0x0e,0x3b,0xef,0xf4,0xf0,0x2f,0xdc,0xf1,0xe7,0xb6,0xda,0x27,0xf7,0xfc,0xe0,0xfb,0x38,0xfe,0xb5,0x01,0x37,0x32,0xf3,0xfe,0xc9,0xf4,0x18,0xd6,0x39,0xcd,0x1b,0xb1,0x28,0xd0,0x07,0xee,0x11,0x7f,0x18,0xd8,0xe9,0xec,0xd3,0xd7,0xd4,0xdd,0x05,0x1e,0xfd,0xfb,0x54,0x10,0xf8,0x49,0xe4,0x08,0xc2,0x24,0x27,0xb3,0xe1,0xdf,0x47,0x0f,0x3a,0xd4,0x02,0x49,0x17,0x1b,0x04,0xc7,0x9e,0x0a,0x11,0x01,0x2d,0x2d,0x01,0xf6,0xfb,0xfb,0xff,0xd8,0xd6,0x16,0x06,0x42,0xde,0xf4,0xf3,0xd8,0xda,0x2c,0xf7,0xf2,0xf4,0x08,0xc6,0x1e,0x2d,0x30,0x05,0x45,0x13,0xee,0x32,0xe0,0x38,0xfe,0xd6,0xdf,0xd3,0x19,0x1b,0xd6,0xfe,0xe9,0x06,0x18,0x3b,0xf7,0xa2,0x1a,0x19,0x39,0x3c,0x1e,0xec,0xf1,0xfd,0x20,0xec,0xd4,0x52,0xe8,0xc7,0xe9,0x11,0xfe,0xd4,0xb2,0x3e,0xd5,0xc1,0xe3,0xf4,0xff,0xfc,0x5a,0xd2,0x30,0xb9,0x01,0x0b,0x51,0x3c,0xd2,0x49,0x50,0x11,0xeb,0x12,0x2e,0xed,0x0d,0x39,0xf9,0xf1,0xa4,0x58,0x81,0xbd,0x36,0x30,0x01,0xe0,0xf4,0xdb,0xdc,0x0e,0xd4,0x3a,0xfc,0x0c,0x10,0x1e,0x79,0xb4,0xd2,0x25,0x33,0x07,0xfd,0xfc,0x26,0x2b,0x00,0xee,0x12,0xd8,0x37,0x0c,0x3a,0xa4,0xf4,0xcc,0x22,0xf6,0x18,0x06,0xde,0xd8,0xf7,0x22,0xc0,0x24,0x1b,0x2d,0x52,0x00,0xb8,0x46,0xc7,0xdd,0x37,0xbb,0x18,0xe8,0x1c,0x2b,0xc4,0xde,0xcd,0x3f,0xf9,0x5e,0xf5,0x16,0xcd,0x0a,0x0e,0x12,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x37,0x1e,0x00,0x00,0x73,0x14,0x00,0x00,0xee,0x10,0x00,0x00,0xab,0xe6,0xff,0xff,0xb5,0x24,0x00,0x00,0xbc,0x1e,0x00,0x00,0x49,0xf0,0xff,0xff,0xd7,0xfd,0xff,0xff,0x94,0x13,0x00,0x00,0x18,0x06,0x00,0x00,0xf8,0xfe,0xff,0xff,0xe0,0x04,0x00,0x00,0x45,0xfd,0xff,0xff,0x28,0xf7,0xff,0xff,0x4a,0x16,0x00,0x00,0x13,0xe3,0xff,0xff,0x3d,0x06,0x00,0x00,0xc9,0x1a,0x00,0x00,0x2b,0xf5,0xff,0xff,0x5c,0x31,0x00,0x00,0x3d,0x10,0x00,0x00,0xe8,0xef,0xff,0xff,0x88,0x2e,0x00,0x00,0xe6,0x01,0x00,0x00,0x0f,0xfe,0xff,0xff,0x9c,0xec,0xff,0xff,0x7c,0xf9,0xff,0xff,0x49,0x03,0x00,0x00,0x96,0xf4,0xff,0xff,0x87,0xf7,0xff,0xff,0x37,0xdb,0xff,0xff,0x52,0x10,0x00,0x00,0xd3,0xfb,0xff,0xff,0x15,0xf7,0xff,0xff,0xfa,0xe9,0xff,0xff,0x54,0xf6,0xff,0xff,0x16,0x22,0x00,0x00,0xb7,0xf1,0xff,0xff,0x3a,0xfe,0xff,0xff,0x67,0xe4,0xff,0xff,0x84,0xfd,0xff,0xff,0x5c,0x09,0x00,0x00,0x5d,0xfb,0xff,0xff,0x4d,0x1c,0x00,0x00,0x40,0x28,0x00,0x00,0x5a,0xe0,0xff,0xff,0x6f,0xf3,0xff,0xff,0xdd,0xf8,0xff,0xff,0xc4,0x03,0x00,0x00,0x71,0x23,0x00,0x00,0xe8,0x21,0x00,0x00,0xce,0xf2,0xff,0xff,0x42,0xed,0xff,0xff,0xe7,0xf1,0xff,0xff,0xb6,0xf2,0xff,0xff,0x66,0xfd,0xff,0xff,0xc8,0xf0,0xff,0xff,0xba,0xfd,0xff,0xff,0xc6,0xff,0xff,0xff,0x2e,0xfb,0xff,0xff,0x1b,0x1b,0x00,0x00,0x41,0xe0,0xff,0xff,0xfe,0xfd,0xff,0xff,0x61,0xf0,0xff,0xff,0x50,0xf0,0xff,0xff,0x8a,0xea,0xff,0xff,0x04,0xe3,0xff,0xff,0x5b,0xe1,0xff,0xff,0xb5,0xeb,0xff,0xff,0x90,0xf8,0xff,0xff,0x89,0xe8,0xff,0xff,0x83,0xfa,0xff,0xff,0x0e,0xef,0xff,0xff,0x19,0x22,0x00,0x00,0xe8,0xf9,0xff,0xff,0xfc,0xf4,0xff,0xff,0x2f,0xff,0xff,0xff,0x62,0x05,0x00,0x00,0x93,0xf9,0xff,0xff,0x00,0xfc,0xff,0xff,0xcb,0x1a,0x00,0x00,0x2c,0xea,0xff,0xff,0x53,0x17,0x00,0x00,0xbb,0xdc,0xff,0xff,0x77,0x01,0x00,0x00,0x5f,0xf2,0xff,0xff,0x95,0x03,0x00,0x00,0x29,0x04,0x00,0x00,0xfe,0x0f,0x00,0x00,0x4a,0x25,0x00,0x00,0xfc,0xfd,0xff,0xff,0xfd,0x01,0x00,0x00,0x49,0xf4,0xff,0xff,0xba,0xf9,0xff,0xff,0xc2,0xf8,0xff,0xff,0xf9,0x0d,0x00,0x00,0x88,0x06,0x00,0x00,0xbd,0x0d,0x00,0x00,0x79,0xec,0xff,0xff,0x71,0xed,0xff,0xff,0x90,0x15,0x00,0x00,0x56,0xeb,0xff,0xff,0x32,0x2c,0x00,0x00,0xda,0xfd,0xff,0xff,0x87,0xf9,0xff,0xff,0x0d,0x07,0x00,0x00,0xe0,0x12,0x00,0x00,0x24,0x00,0x00,0x00,0x7c,0xfb,0xff,0xff,0xbb,0x04,0x00,0x00,0xdf,0xdf,0xff,0xff,0x98,0xeb,0xff,0xff,0x2d,0xf4,0xff,0xff,0xfc,0x09,0x00,0x00,0xa9,0x17,0x00,0x00,0x5a,0x04,0x00,0x00,0x98,0xef,0xff,0xff,0xb4,0xec,0xff,0xff,0x80,0x02,0x00,0x00,0xc4,0xfe,0xff,0xff,0x04,0x05,0x00,0x00,0xb3,0x09,0x00,0x00,0xc1,0x1e,0x00,0x00,0x19,0x12,0x00,0x00,0x75,0xf7,0xff,0xff,0x02,0x03,0x00,0x00,0x1b,0x0a,0x00,0x00,0x94,0x0b,0x00,0x00,0x1a,0x14,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x9b,0x00,0x00,0x00,0xff,0xf3,0xff,0xff,0x23,0x01,0x00,0x00,0x7a,0xfc,0xff,0xff,0x2a,0xd9,0xff,0xff,0x8c,0x05,0x00,0x00,0xda,0x38,0x00,0x00,0xc8,0xdb,0xff,0xff,0x19,0xe9,0xff,0xff,0xc0,0x3e,0x00,0x00,0x17,0x20,0x00,0x00,0x22,0x24,0x00,0x00,0x66,0x31,0x00,0x00,0x73,0x21,0x00,0x00,0x22,0xe6,0xff,0xff,0xfb,0x3b,0x00,0x00,0xfa,0xe4,0xff,0xff,0x63,0xf2,0xff,0xff,0xef,0x27,0x00,0x00,0x55,0xfe,0xff,0xff,0x92,0x09,0x00,0x00,0xa7,0x24,0x00,0x00,0x6f,0xc0,0xff,0xff,0xe4,0xad,0xff,0xff,0x64,0x13,0x00,0x00,0xe8,0xf3,0xff,0xff,0x64,0xb3,0xff,0xff,0xee,0xea,0xff,0xff,0xe8,0xde,0xff,0xff,0x59,0x2a,0x00,0x00,0xaa,0x3f,0x00,0x00,0xf8,0x12,0x00,0x00,0x25,0x0f,0x00,0x00,0x7b,0x15,0x00,0x00,0xfe,0x0a,0x00,0x00,0x1c,0x24,0x00,0x00,0xa9,0x05,0x00,0x00,0xb3,0xef,0xff,0xff,0x75,0xfc,0xff,0xff,0x5f,0xec,0xff,0xff,0x35,0x06,0x00,0x00,0xe6,0x13,0x00,0x00,0x33,0xf6,0xff,0xff,0x46,0xfe,0xff,0xff,0x60,0xef,0xff,0xff,0x53,0xee,0xff,0xff,0x80,0xf4,0xff,0xff,0xe9,0xf3,0xff,0xff,0xe5,0xdf,0xff,0xff,0x68,0xf8,0xff,0xff,0x0f,0xfc,0xff,0xff,0x01,0x3e,0x00,0x00,0xb2,0x28,0x00,0x00,0x56,0x14,0x00,0x00,0x13,0x09,0x00,0x00,0x32,0xd7,0xff,0xff,0x7c,0x27,0x00,0x00,0x61,0x0d,0x00,0x00,0x26,0xd1,0xff,0xff,0xa2,0x39,0x00,0x00,0x69,0xf4,0xff,0xff,0x60,0xf9,0xff,0xff,0x99,0xe1,0xff,0xff,0xd2,0x02,0x00,0x00,0x33,0xe6,0xff,0xff,0x1f,0x17,0x00,0x00,0x71,0x51,0x00,0x00,0xed,0x41,0x00,0x00,0x9d,0x26,0x00,0x00,0xa0,0xf2,0xff,0xff,0xe1,0xf2,0xff,0xff,0xee,0xe8,0xff,0xff,0x0d,0xe7,0xff,0xff,0xef,0x01,0x00,0x00,0x11,0xd0,0xff,0xff,0xee,0x0e,0x00,0x00,0xdc,0xf4,0xff,0xff,0xa1,0xff,0xff,0xff,0x67,0xdf,0xff,0xff,0x4a,0xd0,0xff,0xff,0xcd,0xd2,0xff,0xff,0x10,0xdd,0xff,0xff,0xcc,0xdd,0xff,0xff,0xd7,0xf8,0xff,0xff,0x61,0x37,0x00,0x00,0xcb,0xed,0xff,0xff,0xb4,0xe5,0xff,0xff,0xc6,0xe4,0xff,0xff,0x32,0x0c,0x00,0x00,0x8c,0x3d,0x00,0x00,0x03,0x3d,0x00,0x00,0x69,0xe8,0xff,0xff,0xd6,0x20,0x00,0x00,0xc0,0xd5,0xff,0xff,0x56,0xe8,0xff,0xff,0x41,0x2f,0x00,0x00,0xbf,0x21,0x00,0x00,0xbb,0x02,0x00,0x00,0x4a,0x71,0x00,0x00,0x73,0x18,0x00,0x00,0x7e,0x3b,0x00,0x00,0xc2,0x6d,0x00,0x00,0x83,0xfc,0xff,0xff,0x65,0xfe,0xff,0xff,0x67,0xfc,0xff,0xff,0xcc,0x8d,0x00,0x00,0xf9,0xd0,0xff,0xff,0x2a,0x14,0x00,0x00,0x33,0xe4,0xff,0xff,0x1b,0x1e,0x00,0x00,0x75,0xf8,0xff,0xff,0xb9,0xc9,0xff,0xff,0x8a,0x34,0x00,0x00,0x78,0xe6,0xff,0xff,0xa9,0x27,0x00,0x00,0xab,0x04,0x00,0x00,0x66,0xe5,0xff,0xff,0x70,0xa2,0xff,0xff,0x23,0xe8,0xff,0xff,0x5f,0xe5,0xff,0xff,0x48,0xe7,0xff,0xff,0x3e,0x08,0x00,0x00,0xa6,0x3d,0x00,0x00,0x0d,0x11,0x00,0x00,0xe5,0x2f,0x00,0x00,0x3c,0x55,0x00,0x00,0xd9,0xf8,0xff,0xff,0xc8,0x00,0x00,0x00,0x26,0x16,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xf1,0xf7,0xff,0xff,0x03,0x2a,0x00,0x00,0xfb,0xd0,0xff,0xff,0xef,0xe6,0xff,0xff,0x63,0x08,0x00,0x00,0x6c,0xe5,0xff,0xff,0x15,0x20,0x00,0x00,0x25,0xf0,0xff,0xff,0x94,0x2a,0x00,0x00,0x2b,0x29,0x00,0x00,0xa3,0xee,0xff,0xff,0xb1,0x01,0x00,0x00,0xa4,0x27,0x00,0x00,0xde,0xdd,0xff,0xff,0x9b,0xfd,0xff,0xff,0x54,0xfb,0xff,0xff,0x8b,0xed,0xff,0xff,0x4d,0xe5,0xff,0xff,0x4b,0xe5,0xff,0xff,0x0f,0xc8,0xff,0xff,0x31,0xf6,0xff,0xff,0xdc,0xdb,0xff,0xff,0x92,0xf7,0xff,0xff,0xdb,0xef,0xff,0xff,0x49,0xfe,0xff,0xff,0x8d,0xf2,0xff,0xff,0x56,0xe5,0xff,0xff,0xa5,0x00,0x00,0x00,0xbb,0xf1,0xff,0xff,0xe3,0x05,0x00,0x00,0x51,0xf5,0xff,0xff,0x0a,0xfb,0xff,0xff,0x6e,0xe7,0xff,0xff,0x42,0x1c,0x00,0x00,0x89,0xeb,0xff,0xff,0x71,0xf0,0xff,0xff,0x53,0xeb,0xff,0xff,0x24,0x05,0x00,0x00,0x0b,0x20,0x00,0x00,0x28,0xfe,0xff,0xff,0xd0,0x2d,0x00,0x00,0x49,0x07,0x00,0x00,0xef,0x24,0x00,0x00,0xf1,0xfb,0xff,0xff,0x44,0x0e,0x00,0x00,0x9c,0x22,0x00,0x00,0x5f,0xe6,0xff,0xff,0x39,0xe5,0xff,0xff,0xc1,0xff,0xff,0xff,0xa8,0xfa,0xff,0xff,0x90,0xe7,0xff,0xff,0xdd,0xf9,0xff,0xff,0x81,0xee,0xff,0xff,0xa5,0x26,0x00,0x00,0xe4,0xeb,0xff,0xff,0xb7,0x23,0x00,0x00,0xcf,0xe4,0xff,0xff,0x39,0xf6,0xff,0xff,0x07,0xfd,0xff,0xff,0x14,0xfe,0xff,0xff,0xf5,0x1e,0x00,0x00,0xde,0xf7,0xff,0xff,0xad,0xef,0xff,0xff,0x2a,0xe7,0xff,0xff,0x5b,0xec,0xff,0xff,0xba,0xfe,0xff,0xff,0x63,0xee,0xff,0xff,0x92,0xff,0xff,0xff,0xd5,0xf8,0xff,0xff,0xda,0xdb,0xff,0xff,0x79,0x05,0x00,0x00,0xed,0xf2,0xff,0xff,0x8c,0xe2,0xff,0xff,0x5c,0xee,0xff,0xff,0x07,0xe5,0xff,0xff,0xee,0x01,0x00,0x00,0xe2,0xe6,0xff,0xff,0xf7,0xed,0xff,0xff,0x8f,0x2a,0x00,0x00,0x2e,0x28,0x00,0x00,0xc1,0x26,0x00,0x00,0x9f,0xe5,0xff,0xff,0x6a,0x03,0x00,0x00,0xc1,0xef,0xff,0xff,0x37,0xf8,0xff,0xff,0x47,0xf0,0xff,0xff,0xfa,0x22,0x00,0x00,0xb5,0xf5,0xff,0xff,0xd0,0xfd,0xff,0xff,0x11,0xef,0xff,0xff,0x1f,0x2e,0x00,0x00,0x65,0xe9,0xff,0xff,0x08,0x1d,0x00,0x00,0x77,0xdb,0xff,0xff,0x36,0xf9,0xff,0xff,0xab,0xe2,0xff,0xff,0xfb,0x16,0x00,0x00,0x53,0xf5,0xff,0xff,0x96,0x2c,0x00,0x00,0x10,0xe1,0xff,0xff,0xb4,0xf8,0xff,0xff,0x20,0x1a,0x00,0x00,0x98,0xe4,0xff,0xff,0x9b,0x27,0x00,0x00,0x23,0x2c,0x00,0x00,0x07,0x2e,0x00,0x00,0xd2,0xfb,0xff,0xff,0x15,0xec,0xff,0xff,0x52,0x20,0x00,0x00,0x9a,0xf0,0xff,0xff,0xcc,0x2c,0x00,0x00,0x58,0xee,0xff,0xff,0x79,0x25,0x00,0x00,0xaf,0xea,0xff,0xff,0x90,0xf4,0xff,0xff,0x4c,0x21,0x00,0x00,0x3d,0xf0,0xff,0xff,0x56,0xf9,0xff,0xff,0x36,0xef,0xff,0xff,0x77,0xea,0xff,0xff,0x77,0xfc,0xff,0xff,0xf0,0xd8,0xff,0xff,0x18,0x29,0x00,0x00,0x9d,0x0c,0x00,0x00,0x0f,0x26,0x00,0x00,0xa1,0x30,0x00,0x00,0x74,0xea,0xff,0xff,0x47,0xf1,0xff,0xff,0x32,0x18,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xdb,0x02,0x20,0x9a,0x25,0x14,0x19,0x7f,0xc5,0x6c,0xfe,0xd7,0x27,0xd0,0x05,0xef,0x21,0xdb,0x5c,0xc6,0x0f,0x08,0xf8,0x01,0x2a,0xff,0xcb,0xf5,0xe1,0x28,0xa5,0x94,0x45,0xfd,0xdd,0xf7,0xd6,0xfb,0x18,0xda,0x0a,0xf8,0xec,0x23,0xe2,0x28,0xd7,0x3a,0x11,0x15,0x15,0x0d,0xe2,0xb6,0x0a,0xf1,0x9f,0xab,0xf4,0xed,0x18,0x0e,0x0f,0xef,0xf1,0xea,0xeb,0x11,0xf5,0xbd,0xfd,0xf0,0x52,0x1f,0xdd,0xe3,0xcd,0xc3,0x10,0xc0,0xdd,0xe6,0x01,0x33,0xfa,0x1b,0x6a,0xb7,0x1a,0xeb,0x43,0x0e,0x32,0x07,0xed,0xe0,0xdd,0x2c,0x2c,0xe9,0xc9,0x17,0xfa,0x1e,0x4b,0x7f,0x28,0xef,0x51,0xed,0x9d,0x57,0x6a,0xe6,0xcb,0x1d,0xba,0x20,0xb6,0x7c,0x1c,0x06,0xf2,0xb2,0xfb,0x2b,0x13,0x1a,0xcd,0x03,0xce,0xda,0xb9,0x27,0x38,0x05,0xe9,0x33,0x2b,0xf9,0x4e,0x32,0xbb,0xe8,0x15,0xae,0x31,0x18,0xce,0x47,0x1e,0xf7,0x3b,0xe2,0x02,0x23,0xcf,0x08,0xf4,0xe4,0xf7,0x23,0xe9,0x2f,0xbb,0xde,0xe9,0xe4,0xf7,0x1b,0x01,0x19,0xf5,0x58,0x42,0x06,0x04,0x12,0x08,0x7f,0x0d,0x2c,0x06,0x0e,0x06,0xee,0xe2,0x20,0xb7,0xe0,0xf4,0x1e,0xf6,0xc9,0x1b,0x10,0xf6,0x64,0xe0,0xcc,0xdc,0x14,0x2d,0x30,0xfd,0xc3,0x21,0x21,0xcd,0xc6,0xf3,0x10,0x12,0xec,0x01,0xdc,0xe9,0xde,0x23,0xe0,0x1a,0x23,0xfa,0x24,0xe7,0x1b,0x0f,0x11,0x0f,0x37,0xdc,0xee,0x11,0x0a,0x16,0x73,0xf1,0xcf,0xd4,0x20,0xf6,0x4d,0x1d,0x0d,0x25,0x09,0x0e,0xc4,0xf6,0xd0,0xe2,0x34,0xe4,0xf1,0xf9,0xe1,0x42,0xf6,0xef,0x0c,0x67,0x35,0xf9,0xe8,0xc7,0x03,0x23,0x1e,0x20,0x3b,0x3e,0xd8,0xf5,0x47,0xcb,0xb1,0xac,0xcf,0xe4,0xfa,0x14,0x07,0x07,0x76,0xc3,0xeb,0x66,0x1f,0x52,0xe5,0xbb,0xc5,0x59,0x1a,0xd8,0xf7,0x02,0xdd,0x2c,0x4d,0x96,0x44,0x00,0x1a,0x2e,0xd8,0x08,0x44,0x1b,0xfd,0xfb,0x39,0xc1,0xf1,0xde,0x4c,0xed,0x56,0x19,0x48,0xc3,0xeb,0xec,0x08,0xb8,0x0d,0x16,0xdf,0xdd,0xce,0x0b,0x59,0xde,0x99,0xe6,0x0c,0xac,0xd0,0x43,0x1d,0xb2,0xd9,0x03,0xd9,0xfc,0xde,0xf7,0xa9,0xf9,0x33,0xf6,0xde,0x1d,0xd8,0x3a,0xe8,0x43,0xaa,0x8f,0xd6,0xb5,0x11,0x4f,0x24,0x15,0xa2,0xb2,0xf6,0xce,0xfa,0xc4,0x0b,0x1c,0x84,0x65,0xf9,0xb1,0x15,0x0c,0xf7,0xc8,0xca,0x81,0xf0,0xe2,0x4c,0xba,0x0e,0x23,0xc0,0x36,0x11,0xe9,0x11,0xf9,0xb4,0xe8,0xe8,0xf5,0x30,0xb6,0x0d,0xc1,0x08,0xb6,0xb3,0x23,0x9e,0xf3,0xe2,0xb0,0x00,0x37,0xf5,0xf9,0x0b,0xb1,0x22,0xc0,0xed,0x01,0x23,0xeb,0xec,0x24,0xee,0xe2,0x1d,0xfb,0xe0,0xf9,0xc5,0x2a,0xf9,0x81,0x19,0xb9,0xf7,0x4b,0x28,0x10,0xe1,0x34,0x02,0x1f,0xd2,0x05,0xf9,0xdf,0xf6,0x27,0x06,0x16,0xfe,0xcf,0xf6,0xff,0xfc,0xce,0xe8,0xe8,0xf4,0xd9,0x13,0xb4,0x1b,0x08,0x0a,0x40,0xf4,0x27,0x0a,0x21,0x1e,0xf4,0xdc,0x17,0x50,0x0f,0xe5,0x36,0xf6,0xe8,0xe0,0x41,0x22,0xe9,0x24,0x2c,0x40,0x18,0xe5,0xfa,0xf2,0x16,0xf6,0x34,0x09,0xfa,0x46,0x01,0xf2,0x9d,0x2b,0x38,0x2e,0x1f,0xd4,0x25,0x17,0xf8,0x05,0x39,0xb2,0xf3,0x2b,0xd6,0xfe,0xc6,0xb4,0xf0,0x0f,0x90,0x45,0xc0,0xa4,0x24,0x44,0x13,0x08,0x14,0x03,0xa6,0xca,0x98,0xa5,0x0f,0x47,0xd4,0xef,0x36,0x0d,0x9a,0x6f,0xbb,0xf7,0x0a,0x1b,0xd6,0xe4,0x07,0x00,0x02,0x27,0xb3,0xff,0x6c,0x1b,0xd9,0x00,0x2e,0xa9,0x7f,0xdc,0x28,0x9c,0x97,0xc2,0xdb,0x30,0xeb,0x1c,0x2d,0x3b,0x09,0x15,0xe9,0x39,0x41,0x63,0xe4,0x9a,0x3f,0x08,0xf0,0x59,0x00,0xf8,0x38,0x17,0xdc,0x24,0x31,0xb7,0x58,0xe9,0x00,0xf7,0xf5,0x2a,0x28,0x01,0xf5,0xf2,0xf4,0x0d,0x49,0xfc,0x12,0xd4,0x64,0xae,0x35,0x34,0xb7,0x2d,0xf8,0x03,0xd2,0x06,0x23,0xcb,0x09,0xd9,0xee,0x54,0xb5,0x0a,0xc4,0x66,0x14,0xc7,0x17,0xd7,0xde,0x23,0xd8,0x11,0x16,0x22,0xfc,0xff,0xce,0x3f,0x10,0xf5,0xf9,0x3e,0x13,0xf8,0xfc,0xdb,0xe3,0x55,0x09,0xec,0xdc,0x11,0x04,0x15,0x13,0x19,0xfc,0x7f,0xef,0x02,0x0a,0xee,0xed,0x28,0xe4,0x13,0x2d,0x08,0x0b,0x21,0xfd,0xe4,0x09,0xc6,0xc1,0x34,0x04,0x04,0x0a,0xe5,0xfa,0xd1,0x22,0x04,0x0f,0x03,0xdc,0xf9,0x2c,0xe1,0xd1,0xfa,0xdc,0xed,0x2a,0x65,0x06,0x2e,0xf9,0x2f,0x02,0x9b,0xeb,0x2f,0xe8,0x02,0xe3,0x0c,0x10,0x10,0xe9,0x02,0xfa,0xfe,0x13,0x12,0xd4,0xcb,0xd4,0xfd,0xe8,0xe1,0xf2,0x25,0x05,0xc8,0xec,0xf7,0xce,0x01,0x3c,0xda,0xfb,0xcf,0xfd,0xf0,0x44,0xf9,0x11,0x0a,0xf3,0x04,0x26,0xf8,0xdf,0xed,0x0e,0xdd,0x1c,0x02,0xc9,0xd8,0xfb,0xdb,0x0d,0xf5,0x10,0xd5,0xf5,0xea,0x3a,0xea,0x03,0xfd,0x17,0xf5,0x04,0x16,0xff,0xf8,0x09,0xe2,0xe9,0x4c,0xf8,0x4f,0xd5,0x27,0xd4,0x4a,0x20,0x40,0x7f,0xeb,0xcf,0xe4,0x26,0xfd,0x18,0x08,0xce,0x0c,0x13,0x08,0xda,0x12,0x24,0xe2,0x25,0x3f,0xeb,0x08,0x24,0xb4,0x1e,0x03,0xf1,0xcc,0x00,0xbe,0xb6,0x0d,0x21,0x10,0x1a,0xf5,0xf7,0x05,0xfa,0x03,0x14,0x00,0xe7,0x3c,0x28,0xe8,0x58,0x1e,0xbf,0x12,0x62,0xcb,0x7a,0xfb,0x1e,0xf5,0x1d,0xf1,0xe7,0xf7,0xd8,0x06,0xcc,0xda,0xfc,0x19,0xc5,0xf6,0xdd,0x10,0xd5,0x24,0xfd,0x26,0xf1,0xbd,0xbf,0x40,0xf6,0x41,0x3e,0x1f,0x51,0xdc,0xbe,0x39,0x19,0x20,0xe0,0xbe,0x04,0x1e,0x08,0xfb,0xf6,0x26,0x0b,0xc2,0xc9,0x13,0x2c,0x34,0x37,0xfe,0xf2,0x1a,0xe6,0xe8,0x29,0x1a,0x18,0x15,0xe7,0x75,0xd2,0xdd,0x13,0xde,0x0b,0xec,0x24,0xd8,0xd9,0xd2,0x06,0x2a,0x10,0xbe,0xc6,0xf9,0x19,0x22,0x57,0xb9,0xef,0x1a,0xd2,0xe7,0xfe,0x07,0x22,0x0c,0x2c,0x26,0x81,0xb0,0xcb,0xf6,0x34,0x15,0x43,0xf2,0x0a,0x42,0xdf,0xdc,0xc8,0xe7,0xd2,0xef,0xf9,0x17,0xee,0x0e,0xe1,0x19,0x0c,0xb0,0x36,0x0e,0x24,0xee,0x37,0x24,0x09,0xf8,0xb4,0x0c,0x38,0xfc,0xf5,0x4c,0xc0,0x27,0xff,0x19,0xf1,0x23,0x0a,0xba,0x4a,0x54,0x46,0xae,0x00,0xcf,0xe4,0xd7,0xd6,0xc6,0x05,0x13,0xbb,0x08,0xed,0xd0,0x05,0x5f,0xcd,0xf2,0xdf,0xff,0xca,0xc1,0xc6,0xfc,0x0f,0x7c,0xd2,0x17,0x40,0x00,0xed,0x98,0xcd,0x23,0xbd,0xf2,0xce,0xf8,0x07,0x35,0x4f,0xed,0x02,0xee,0x14,0x46,0x25,0xe9,0xe7,0x90,0x38,0x24,0xec,0x09,0xa8,0xf5,0x59,0x15,0x28,0xf7,0x05,0xee,0x0e,0x1b,0xe5,0x64,0xfe,0x36,0xd4,0x2f,0x72,0xe8,0x37,0xda,0xd7,0x15,0xc1,0x92,0x19,0x01,0x21,0xa9,0xb1,0xdf,0x46,0x1c,0x2e,0x08,0xd1,0x48,0xe8,0xe3,0x37,0x5d,0x0d,0x3c,0xf6,0xa3,0xeb,0xa5,0xce,0x07,0xf5,0xae,0x1c,0x0f,0x5d,0x5b,0x2d,0xa3,0x24,0x4e,0x50,0x10,0xe1,0x1d,0x2a,0x26,0x18,0x4b,0xdc,0x32,0xcd,0x20,0xf9,0xe0,0xfe,0x9a,0xe3,0xe2,0xb5,0x3f,0xfe,0x35,0xe6,0xa9,0x37,0xb6,0xf0,0x40,0x0a,0xc4,0xd7,0xf0,0x72,0x03,0xe8,0xeb,0x11,0xf3,0xf1,0xcd,0x1c,0xe2,0x29,0x1b,0xe1,0x21,0x1b,0xe4,0x25,0x09,0xc7,0x37,0xbf,0x81,0x33,0x86,0x0d,0xcc,0xe7,0xce,0x32,0xf7,0x11,0x03,0x1c,0xed,0xe8,0xea,0x42,0x96,0x00,0x3f,0x07,0xf2,0xfd,0x19,0x2a,0xc7,0x0a,0x0e,0x62,0xb3,0x1a,0xab,0x0f,0xb2,0x28,0x19,0xf3,0xdb,0x1c,0x26,0xf0,0xf5,0x2a,0x19,0xad,0xcc,0xcf,0x26,0x3a,0x34,0xc1,0xff,0x07,0x1d,0xec,0x21,0xcc,0x1a,0xbf,0x11,0xcb,0x0c,0x2d,0x3a,0x0a,0xcd,0x10,0x4c,0x12,0xfa,0xd0,0xf9,0xe6,0x1b,0xb1,0xe5,0xd8,0x2b,0x13,0xf5,0xe4,0x22,0x21,0x01,0x45,0xf9,0x1d,0xfb,0x25,0xf8,0x35,0x4d,0xca,0x19,0x30,0xcf,0xee,0x02,0xe3,0xf1,0x1b,0x0d,0xe2,0x23,0x3f,0x26,0x34,0x00,0x5a,0x0a,0x7f,0xed,0x39,0x1b,0x09,0xdd,0x0e,0xca,0xbf,0xc1,0x1b,0x54,0x3c,0x38,0xb0,0xf8,0x32,0x24,0x24,0x0a,0xe7,0x25,0x5c,0xca,0x33,0x18,0xdc,0x3c,0xc9,0xfa,0x06,0x47,0x08,0xfc,0x17,0x07,0x10,0xfe,0xbe,0xe1,0xe5,0x31,0x49,0xdb,0xdc,0xab,0x2b,0x04,0xe2,0xe2,0xc6,0x40,0xff,0x02,0xdc,0xe2,0xe8,0x21,0x07,0xf0,0xf7,0xe8,0x32,0xf0,0x46,0x36,0x0a,0xe6,0xd4,0x04,0xd2,0xc1,0x52,0xe1,0x13,0x17,0x0c,0xca,0x2d,0xe3,0x28,0xdc,0xc8,0x06,0xf0,0xb5,0x0c,0xc9,0x47,0x43,0xde,0x2b,0x3f,0x23,0x37,0xb9,0x09,0x1a,0x25,0x57,0x74,0xec,0xbe,0x09,0xe7,0x54,0xd0,0xf1,0x19,0x07,0x3e,0x81,0xca,0x21,0xe4,0x07,0x10,0x1a,0xca,0x2c,0xe9,0xc3,0xce,0x4c,0xf8,0x1b,0x33,0x12,0x26,0x12,0x1b,0x09,0xdd,0xe3,0xef,0x00,0xdc,0xed,0xbb,0xef,0x13,0xf9,0x07,0xf0,0x14,0xf8,0x1a,0xf2,0xf0,0x32,0x13,0xf1,0x16,0x01,0x25,0xef,0x9a,0xc3,0xfa,0x02,0x03,0x0e,0xe4,0xb7,0x11,0x10,0xd3,0xec,0x11,0x3c,0x30,0xe5,0xe3,0x37,0x0a,0xd3,0xf0,0xfb,0xf8,0x20,0x06,0x14,0xfc,0x1d,0x18,0x24,0xfa,0x3e,0x6c,0x0c,0xce,0xe4,0x36,0x38,0xb6,0x1b,0xe4,0xf8,0x23,0xe8,0x00,0xe8,0x06,0x0a,0xcf,0xeb,0xfb,0xde,0xf7,0x44,0xef,0xde,0xee,0x98,0x11,0xfe,0x35,0xef,0xde,0x23,0x07,0xbf,0x35,0x0e,0x02,0xfc,0x7f,0xd5,0x09,0xd7,0x1e,0xf6,0x09,0xcb,0xef,0x09,0x24,0xf0,0xec,0xf3,0xa7,0xea,0x22,0x26,0x1b,0x39,0x13,0x4d,0xf7,0xc4,0xd7,0xe7,0xf4,0x07,0xf6,0xf8,0x08,0xe3,0xd6,0x1c,0x60,0xb3,0xbc,0x0c,0xf5,0xd0,0x05,0x31,0xf0,0x60,0xbf,0x00,0xbc,0xcd,0x4b,0xbc,0xdb,0x0d,0xf4,0xec,0xf2,0x26,0xc9,0x1c,0x25,0xae,0x5f,0x4f,0xf6,0xea,0xd3,0xb9,0x96,0xe6,0x3a,0x2f,0xff,0x05,0x2d,0xa4,0x12,0x56,0x5b,0xec,0xcb,0xd1,0x29,0x9a,0xb9,0x27,0x02,0x22,0x3c,0x0f,0x1f,0xec,0x9f,0xfc,0x97,0xf5,0x0c,0xfb,0x10,0x03,0xf0,0x27,0xb6,0x67,0xe9,0xd9,0xa3,0xbd,0x3a,0xe2,0xe1,0xa0,0xcb,0x40,0x2f,0x3f,0x01,0xf1,0xfe,0x81,0xf8,0x4e,0x8b,0x06,0x09,0x2f,0x46,0x12,0xc5,0x15,0xd0,0x14,0x8f,0x1a,0xea,0x1d,0x14,0x3b,0x0c,0x74,0x1c,0x87,0x31,0xd4,0xd6,0x39,0xac,0xc2,0x32,0x3d,0x04,0xcd,0xd2,0x16,0x6d,0xc3,0x3d,0xf7,0x02,0xe4,0x02,0xd6,0xac,0x2a,0x66,0x02,0xa3,0xb8,0xec,0xe3,0xea,0x4a,0xeb,0xec,0x2c,0xf8,0x42,0xec,0x2b,0xe0,0x2f,0x30,0xfb,0x1d,0xe3,0xed,0x2a,0x5a,0xd7,0x5d,0x12,0x9f,0x06,0xdd,0x09,0xce,0x09,0xc6,0x09,0xf1,0xfd,0xe5,0x1e,0xe4,0xe6,0xab,0x17,0x97,0xe4,0xcb,0xdc,0x32,0xd6,0xc4,0xb6,0x0e,0xfe,0x38,0x2d,0xc1,0x03,0xe1,0x0f,0xf8,0xaf,0xf2,0x02,0xba,0xfc,0x16,0xaf,0xc1,0x26,0x0b,0xe7,0x3e,0x35,0x0a,0x59,0x0e,0x7a,0xc4,0x55,0xf8,0xe2,0xce,0x7c,0xc7,0xb9,0xff,0xcb,0xf1,0xed,0xf5,0x06,0xe3,0xa7,0x81,0xec,0xcb,0x04,0xc0,0x16,0xf6,0x3d,0xcc,0x2d,0xe6,0xe5,0x09,0x12,0x58,0x24,0x21,0x17,0xc7,0xeb,0xe8,0xcb,0x08,0xd8,0x09,0x83,0xdc,0xb5,0x16,0xf5,0xf2,0xc8,0xa6,0x2a,0xe1,0xf7,0x37,0xf0,0x2a,0xe9,0xf5,0x19,0xe8,0x19,0xc8,0x2c,0x13,0xdb,0x57,0x2b,0xd1,0x49,0xff,0x0d,0xff,0x0e,0x15,0xd9,0x14,0x1d,0x05,0x24,0xb6,0x6d,0xed,0x03,0xaf,0x3d,0x2f,0x9b,0xfe,0x00,0xed,0xf8,0xd9,0x3d,0xfc,0x2c,0x1f,0xdc,0xa4,0xcc,0x1e,0xd0,0x32,0x10,0xbb,0x09,0xff,0xea,0x94,0xf3,0x1b,0xf7,0xeb,0xea,0xfa,0x30,0xc8,0xdf,0xdb,0x08,0xea,0x18,0xd1,0x41,0x30,0xf6,0xf5,0xd3,0xdf,0xad,0x1b,0xb0,0x0b,0x14,0xf9,0xf6,0xf3,0x11,0xe7,0xed,0xfb,0x35,0x1c,0xcf,0x1e,0xb9,0xfd,0x4b,0xe4,0xd8,0x23,0x12,0x05,0x0d,0xf5,0x43,0x08,0x11,0xed,0x03,0xde,0xe7,0x34,0xfe,0xc9,0xfa,0xdb,0x2a,0x16,0x28,0x87,0x1f,0x09,0xe2,0x25,0x27,0xdd,0x4d,0x1a,0xff,0xd9,0x4f,0x1e,0x36,0xe3,0xde,0x81,0x4f,0x53,0x43,0xf3,0x3b,0x03,0xeb,0xc4,0xe7,0x21,0x4b,0x02,0x17,0x19,0xff,0x04,0xdb,0xbb,0x0d,0xf0,0xe3,0x74,0xc0,0x15,0xef,0x06,0x0a,0xfb,0xfd,0x0b,0xc9,0xd5,0x28,0x09,0xc9,0x2d,0x19,0x01,0x27,0x2f,0x1d,0x7b,0xde,0xe4,0xd9,0xfa,0x09,0x2d,0xed,0xfd,0xe2,0x3d,0x02,0xde,0xaf,0x02,0xe5,0x2f,0xca,0x66,0xc4,0xcd,0x0d,0x06,0x06,0xa5,0x2b,0xc9,0xe6,0x02,0x1f,0xbc,0x35,0x04,0xf7,0xd8,0x2c,0xec,0x20,0x1c,0x0f,0x13,0x75,0xed,0x1a,0x21,0x23,0x38,0x22,0x12,0x08,0xed,0xc3,0xe7,0xff,0x32,0xa1,0x18,0x46,0xf0,0x4c,0xe8,0x08,0x7a,0xe0,0xe2,0x15,0x81,0xa2,0x0f,0xdb,0xac,0x1f,0xf5,0x14,0x4a,0x24,0x3c,0x05,0xe6,0x5e,0x3f,0x05,0x36,0xef,0xb3,0x0d,0x2d,0xe4,0xb3,0xe7,0x02,0x29,0xf4,0xf1,0x6b,0xe0,0x02,0x3f,0xe3,0x3e,0x33,0x21,0xef,0x4e,0xfd,0xe9,0x4e,0x30,0xe1,0x09,0xa6,0xf5,0xf3,0xc2,0x04,0x9c,0xe2,0xd9,0x0d,0xdf,0x06,0x9c,0xbd,0xf7,0xd6,0x0b,0xf8,0xda,0xf3,0x26,0xf9,0x15,0xeb,0x2c,0xc1,0xa8,0xcf,0xed,0x20,0x92,0x21,0xde,0xd0,0xf4,0xc5,0x28,0x0c,0x0f,0xe1,0x3b,0xf9,0xd7,0xe4,0x04,0xe9,0x84,0x00,0x3a,0xeb,0xea,0x04,0x0d,0xb2,0xd7,0xfb,0x2f,0xf8,0x06,0xeb,0xf2,0xf9,0x06,0xf1,0xc2,0x0e,0xf7,0x00,0x89,0xd3,0x62,0xda,0xed,0x19,0x1a,0xf5,0x07,0x15,0xe6,0xf5,0x7f,0xeb,0x36,0xe2,0x5b,0x16,0xdc,0x0a,0x00,0xcc,0xfd,0xf5,0x01,0xe9,0x02,0xc7,0x25,0x40,0xac,0xd0,0x4a,0xf5,0xeb,0xf8,0xfb,0x8c,0x3d,0x1f,0x0b,0x11,0x2f,0x3d,0x21,0xb2,0xfc,0x36,0xfa,0x2f,0x20,0x0d,0x26,0x1d,0xec,0xca,0x12,0x0d,0x3d,0x11,0x2c,0x9c,0x1c,0x3b,0x25,0x15,0x16,0xd4,0x3b,0xce,0x63,0x7f,0x50,0xe2,0x18,0xdc,0xbd,0xd5,0xe8,0x42,0xdd,0x7c,0xd6,0xce,0x0c,0x16,0xf6,0x05,0xf7,0x19,0xde,0xf8,0xff,0xe8,0xf4,0xef,0xd7,0xee,0xee,0x02,0x6a,0x49,0x57,0xd2,0x09,0xdc,0xb6,0x4d,0x00,0xfd,0x4b,0xf5,0x3d,0x01,0x35,0xf5,0x1e,0x10,0xef,0x35,0x05,0x71,0x23,0x1e,0x03,0xfe,0xd3,0xe2,0x48,0xfa,0x1a,0xc5,0x48,0xda,0x44,0xe2,0xc3,0x08,0xc0,0x16,0xd9,0xaa,0x36,0xdd,0x1b,0xe2,0x40,0xf5,0x09,0x3c,0x88,0x1c,0x3e,0x15,0x1f,0xd2,0x04,0xde,0xfd,0xc9,0xe4,0x29,0x02,0x0d,0xd0,0x1f,0x20,0xff,0x7a,0xd9,0xd2,0x0f,0xed,0x05,0x43,0x38,0x18,0xd1,0xf6,0x0e,0x18,0x0c,0xb4,0xef,0xc0,0xfd,0xdb,0x41,0x33,0xa3,0x2a,0x10,0x57,0x52,0x27,0x54,0x06,0x0b,0xe6,0xf9,0xf6,0xff,0xef,0xa6,0x20,0xbc,0x34,0xda,0xfa,0x20,0xcf,0x1a,0x02,0xd0,0xc4,0xc3,0xdd,0x47,0xe0,0xb6,0xbd,0xe5,0x48,0x1a,0x38,0xa8,0x26,0x14,0x25,0x08,0xdc,0xc8,0xa5,0xbe,0x71,0xc6,0x81,0x13,0xb3,0xee,0xcf,0x19,0xe4,0x07,0x08,0x19,0xae,0xa0,0x92,0xab,0x55,0xc0,0xc6,0xf3,0xbf,0x0d,0xe3,0x6b,0xb3,0xe4,0xfa,0x82,0x58,0x3b,0xd9,0xb7,0xef,0xbb,0x22,0xdb,0x1c,0xc1,0x14,0xec,0x08,0xc7,0x29,0xca,0x71,0x8c,0xcf,0xef,0x69,0xde,0x4a,0x68,0xeb,0x13,0x07,0xf9,0x19,0x0a,0xa4,0x11,0xf8,0x1b,0x28,0x25,0xea,0x68,0xea,0xb8,0xd2,0x12,0xc4,0xff,0x27,0xa4,0xf1,0xf6,0x26,0x4f,0x43,0xf8,0xca,0xf1,0xf9,0xcf,0xe7,0xec,0xe5,0xfd,0xc9,0xdf,0x41,0x04,0xe5,0xef,0xf8,0xa7,0xf0,0x00,0xfd,0x1c,0xd0,0xa7,0xcc,0x05,0xc5,0x03,0x18,0x15,0xf5,0x03,0xc2,0x7f,0xc2,0x25,0xf6,0xcf,0x1a,0xe5,0xf4,0xda,0x2b,0x11,0x09,0x21,0xa8,0x09,0xde,0x54,0xcf,0xc5,0x05,0x48,0xf9,0x06,0x36,0xc5,0xde,0xdb,0xc2,0xd2,0x3e,0x17,0x35,0xee,0x00,0x17,0xe7,0xf8,0xf5,0x1c,0x03,0x48,0x2a,0xff,0x35,0x32,0x16,0xfb,0x1c,0xf8,0xea,0x07,0xdf,0x02,0x47,0x33,0x16,0x02,0x11,0xda,0xef,0x3c,0x04,0x1b,0xd0,0xb7,0x03,0xf9,0x04,0x57,0x45,0xc8,0xae,0xf1,0x1b,0xfd,0x40,0xf3,0x24,0xae,0x11,0xd4,0x1a,0x31,0x16,0x0f,0x2a,0x9d,0xef,0x26,0x0d,0x07,0x10,0xfd,0xc0,0x4e,0xfd,0xe4,0xb0,0x28,0xd3,0xc0,0xdc,0xf1,0xed,0xe9,0x2d,0x04,0xd2,0x13,0x65,0xfa,0xd8,0xe8,0x30,0x7f,0xdd,0xf9,0xfb,0x63,0x11,0xcd,0x1e,0xf1,0xc2,0xc9,0x3e,0x8f,0xf0,0x32,0xd4,0xf4,0xaf,0x03,0xe7,0x71,0x20,0x32,0xe9,0xb6,0xfd,0xed,0x42,0x01,0xb2,0xef,0xc2,0xf8,0xe8,0xe4,0xc9,0x1a,0xc1,0x27,0x6d,0xe9,0x17,0x24,0xd0,0x03,0x24,0xca,0xd8,0xd3,0xf1,0x0a,0x09,0xd9,0xfa,0x0b,0xe1,0x20,0xce,0xe9,0x29,0x3a,0xf7,0xe9,0xe8,0xec,0xfd,0x16,0xf9,0xee,0xf1,0xf4,0xee,0xd3,0xda,0x9f,0xe2,0xbb,0xf4,0x06,0x12,0xf5,0x04,0xf4,0x1a,0xda,0x4c,0x25,0x1a,0xdd,0x0d,0x18,0xc1,0xc4,0x26,0x1a,0xdb,0x13,0xf9,0x21,0xf8,0xf5,0x51,0xd3,0x2f,0xf2,0x4b,0xb7,0xfb,0x2a,0x1e,0x1c,0xdd,0xea,0x00,0xce,0x33,0x2e,0x02,0xde,0x22,0xf0,0xe4,0x0b,0x2c,0xf2,0x7f,0xaa,0x20,0x1b,0x0a,0x2d,0xe4,0xfe,0x36,0xea,0xe8,0x1f,0x1e,0xe2,0x3c,0x0e,0xcc,0xf4,0x05,0x2a,0xd9,0x11,0x03,0xda,0xf9,0xf9,0x24,0x00,0x18,0x10,0x22,0x2d,0xcf,0x16,0x24,0x0f,0x22,0x2a,0x02,0xee,0xe3,0xd6,0xf5,0x5b,0xf5,0x44,0x09,0xc3,0xb4,0xf0,0x36,0xe2,0xb4,0x0a,0xea,0x9b,0xbf,0xea,0x07,0xd5,0x53,0xf4,0x2a,0x06,0x1c,0x1c,0xe5,0xf2,0xdc,0x0b,0x0d,0x5d,0x03,0xf7,0xcb,0xe6,0x16,0xee,0xe1,0x17,0x07,0xb8,0xe5,0xe5,0x01,0xeb,0xe2,0xec,0xd8,0x1a,0xe7,0x47,0xd0,0x11,0x04,0xf7,0x29,0xe1,0xfb,0x0f,0x45,0xc7,0x19,0x36,0xd1,0xc3,0xed,0x2f,0xd3,0xee,0xbc,0x00,0xf0,0xe6,0xc6,0x09,0xe1,0x17,0x01,0x2d,0x10,0xb4,0x39,0x04,0xc0,0xda,0x18,0xde,0xc9,0xbf,0x7f,0x28,0x05,0x0e,0x02,0x35,0xfc,0xf4,0x39,0xfa,0xea,0x22,0x2e,0xee,0x29,0xf8,0x3e,0x18,0xe7,0x36,0xe0,0xf4,0xbd,0x0c,0x33,0x04,0x0e,0xfd,0x39,0x16,0x0f,0x13,0xc8,0xc6,0x13,0xd6,0x21,0x4e,0x0d,0x0c,0x0f,0x35,0x2d,0x2e,0x11,0x3c,0x4c,0x2d,0x9a,0x05,0x10,0x1f,0xf2,0xb7,0xc2,0xca,0xe5,0x02,0xc9,0x19,0xec,0x34,0x02,0xd5,0x4b,0x15,0xe9,0x6e,0xea,0xda,0xed,0x04,0xd7,0x20,0xfa,0xdd,0xde,0x17,0x01,0x13,0x05,0x18,0x25,0xc9,0x43,0x19,0x09,0xbe,0xe6,0xfd,0xda,0xc4,0xf1,0xe8,0xb7,0x21,0x5e,0x2b,0x02,0x34,0x1c,0x0c,0x39,0xb0,0xff,0xe3,0x05,0x00,0x60,0xf0,0x16,0xf8,0x0e,0x2a,0x9f,0x31,0x19,0xc8,0xcd,0xd6,0xd9,0x28,0x23,0xdb,0x4d,0x4e,0xd8,0xeb,0xec,0xc7,0xcf,0x37,0xbc,0x51,0x64,0x79,0xf5,0x38,0xfa,0xeb,0xf8,0xd1,0x5a,0xc9,0x00,0x50,0xe8,0xe9,0x0c,0xec,0x30,0x54,0xdf,0xfb,0x5e,0x17,0xe9,0x6d,0x25,0x53,0xe2,0xba,0xfb,0xb0,0xee,0xda,0xfb,0x33,0xaa,0xcc,0xe9,0xd1,0xeb,0x0a,0xbf,0x10,0xd1,0xdd,0x08,0x14,0x12,0x91,0x3c,0xd3,0x14,0xc2,0xf4,0x69,0xc9,0xeb,0x22,0xfd,0xfd,0xe6,0x19,0x52,0xfa,0xd5,0xe8,0x06,0xe2,0x04,0xce,0x81,0x07,0xa0,0x37,0x24,0x1a,0x03,0xce,0x18,0x21,0x44,0x1d,0x37,0xc1,0xce,0x3e,0x38,0xc7,0xb7,0xe6,0xd5,0x1e,0xa5,0xf1,0x5b,0xdf,0xf0,0x50,0x4e,0xf6,0x0a,0x2d,0x09,0xec,0xf6,0x01,0xab,0xde,0xb5,0x1f,0xfc,0xfc,0x98,0x05,0x32,0xcf,0xd3,0xd0,0xcd,0xc7,0x02,0xc6,0x01,0x17,0x05,0x01,0xe6,0xd9,0x10,0xc5,0x15,0x17,0x72,0x15,0xe8,0xdb,0x41,0x43,0xff,0xcf,0xc9,0xbf,0xce,0xf2,0x08,0x1c,0xd8,0xf9,0xc8,0x2a,0xc3,0xf5,0x26,0xd1,0x0a,0xae,0x55,0x38,0x6c,0xbc,0xd6,0xf7,0x83,0x0b,0x51,0x69,0xed,0x6e,0x50,0xb2,0x28,0xbf,0x5c,0x1d,0x37,0x1c,0x85,0xec,0x18,0xf0,0xba,0x65,0xdd,0x05,0xfd,0x18,0xd8,0x28,0xdc,0x26,0xce,0xce,0xe6,0x7f,0x29,0xbc,0x51,0x2d,0xff,0x04,0xbd,0x01,0xa9,0xea,0x24,0xca,0x0b,0xf7,0xe7,0x19,0x5b,0x1f,0x12,0x0a,0xb5,0xde,0x20,0x30,0x39,0xe4,0xec,0xb2,0x30,0xd3,0xc2,0xc9,0xb0,0x03,0xe6,0x30,0xe0,0xed,0x43,0xd2,0xd8,0xfd,0xfd,0xdd,0x14,0xfc,0xfc,0xf9,0xee,0x16,0x15,0x28,0x07,0x16,0x1e,0x19,0x40,0x19,0x28,0xf9,0x0c,0xeb,0x09,0x1e,0xf5,0xec,0xdd,0x33,0x15,0xf8,0xe9,0x0b,0xd9,0x16,0x02,0x00,0x24,0xdc,0xe8,0xda,0x31,0x08,0xe5,0x0f,0x1d,0xf0,0xf3,0xd9,0xe5,0x0b,0x0a,0x16,0x02,0x0c,0x9b,0xff,0xf5,0xf6,0xe6,0x31,0x06,0xf4,0xf9,0xca,0xe0,0x1e,0xfc,0xec,0x27,0x3e,0xd1,0xd1,0xf0,0xda,0x24,0x1d,0xd7,0x15,0xf5,0xf2,0xfe,0xfd,0xdf,0xf1,0xdc,0xc5,0xec,0xf4,0x02,0xe7,0xea,0x04,0xda,0x1c,0x14,0x0a,0xf9,0x27,0x13,0xee,0xf2,0x12,0x03,0x12,0x05,0x7f,0x0a,0xf4,0xf9,0xe0,0x10,0x09,0x20,0xf3,0x14,0xe5,0x0c,0x17,0x15,0xf5,0xd8,0xf1,0x38,0x0e,0x00,0xf0,0x34,0x06,0x15,0x6c,0x55,0x16,0xfa,0xeb,0xd9,0xb6,0x28,0x2b,0xb9,0x1b,0x32,0xd1,0x50,0x45,0x81,0x05,0x09,0x02,0xb6,0xfb,0xa8,0x19,0x62,0xe4,0xe0,0x0f,0xef,0x4e,0x37,0xd0,0xeb,0xd5,0xb0,0xa6,0x54,0xb7,0xf8,0xe9,0xfd,0x17,0xdd,0x3a,0x0c,0x5a,0xf2,0x44,0x01,0xe6,0xa6,0x9d,0x12,0xb3,0x20,0xec,0xb8,0xbb,0x02,0xdf,0x0b,0x16,0x09,0x02,0x38,0x3f,0x04,0x28,0x49,0x39,0x1c,0x05,0xff,0xe1,0x22,0xcd,0x1d,0x09,0xea,0xca,0xc2,0xf2,0xf8,0x1e,0xf9,0x93,0x13,0xe4,0x46,0x26,0x08,0xac,0xe0,0xcb,0x96,0x09,0x01,0xff,0xae,0x10,0xf8,0x46,0x22,0x2b,0xda,0x1a,0xd7,0xef,0xf2,0xc0,0x33,0xed,0xa4,0x20,0xf8,0xd9,0x08,0xc8,0xec,0x65,0x13,0x1c,0x05,0x1c,0xdc,0x1b,0xe5,0x0b,0x0d,0x02,0x0e,0xca,0x2d,0xff,0x24,0x00,0x15,0xfc,0xea,0x00,0xf4,0xfc,0xfa,0xe0,0x04,0x3c,0xe1,0x0c,0xfa,0x42,0xf9,0xf5,0x25,0xeb,0xb5,0xfa,0x0c,0x32,0x35,0xcf,0xf2,0xcc,0xf5,0x12,0x1f,0x0d,0x1b,0xc6,0x25,0xdb,0xe6,0xfb,0xff,0xcc,0xd9,0xe3,0xe9,0xd4,0xcf,0x3e,0xd5,0x2c,0x1c,0x12,0xfa,0x39,0xde,0xe1,0xd3,0x0d,0xe9,0x7f,0x0b,0xd5,0x0e,0xfc,0xdf,0xcc,0xef,0xf9,0x5a,0xe2,0xfc,0xd9,0xe2,0xce,0xe6,0xf4,0xa5,0x12,0x32,0x13,0xf4,0x29,0x04,0xec,0xfd,0x24,0x1b,0x01,0xd8,0x25,0x18,0x1e,0xec,0xef,0xa7,0x20,0x10,0xe5,0xf7,0x02,0xc0,0xe0,0x33,0x10,0x20,0x2e,0x3e,0xf6,0x0d,0xf3,0x2f,0xe4,0xe3,0x13,0x2f,0xcf,0xd3,0x29,0xf1,0xf6,0x02,0x3b,0xf7,0xf5,0xf8,0xfa,0xea,0x0e,0x46,0x0e,0xfe,0xed,0xe1,0x0a,0x09,0xea,0x11,0x16,0xe3,0xd6,0xfc,0x7f,0xf6,0xce,0x26,0xe7,0xef,0xf4,0xec,0xff,0xf0,0xfe,0x25,0x28,0x28,0xdc,0xd4,0x15,0x04,0xdd,0x40,0xce,0x0e,0xf8,0x03,0x20,0x0a,0xf9,0x01,0x15,0x2d,0xeb,0x08,0x03,0xd9,0xe4,0xc7,0xfb,0x24,0x20,0x14,0xe4,0x13,0xfd,0xd9,0xfb,0xf7,0x20,0xd8,0xdf,0x11,0xe7,0x0e,0xe1,0xf6,0xbe,0xfd,0xe8,0xef,0x0b,0xee,0x02,0x1b,0x11,0x06,0x05,0xf5,0x14,0x23,0xf5,0xf2,0xe9,0x13,0xca,0x2c,0x1c,0xeb,0xc8,0x02,0x04,0xf3,0xcd,0x19,0x25,0xbf,0xe4,0xed,0x07,0x0b,0xea,0x1a,0x09,0xec,0xef,0x1c,0xd7,0x0b,0x0a,0xef,0x22,0x19,0x02,0x1c,0xd2,0xf6,0xd1,0xed,0x4c,0xfb,0xf7,0x28,0x20,0x2e,0x0b,0xea,0x03,0x2b,0x05,0xde,0xed,0x00,0x18,0x73,0x26,0xc4,0x1e,0x0e,0xd5,0xe2,0x05,0x15,0xf8,0x40,0xd7,0xe9,0x45,0xdb,0x01,0xcf,0x06,0xfd,0x09,0xff,0x0a,0x17,0xec,0x81,0xae,0x0e,0xfd,0x04,0x20,0xff,0xe8,0x7e,0x25,0x4d,0xc3,0xe9,0x12,0xfa,0x16,0x12,0x07,0x0d,0x42,0x98,0x00,0x05,0xdd,0x00,0x33,0x0d,0xe0,0xfe,0xe8,0xab,0xa1,0xf4,0x10,0x25,0xd4,0xf3,0x1b,0x03,0x1a,0x07,0xff,0xc8,0xf5,0xf1,0xf5,0x8d,0xea,0xe2,0x12,0xc5,0xe9,0x5f,0x2c,0xd0,0x0c,0xf2,0x23,0x2f,0xf7,0x0f,0x21,0x13,0x1a,0x15,0x5b,0x11,0xf8,0xf3,0xfa,0xf7,0xf8,0x06,0xf2,0x36,0xcc,0x3e,0x2c,0xff,0x12,0x0c,0xf4,0xfa,0xf3,0xfd,0xf6,0xdd,0x06,0x22,0x0a,0xa4,0xdf,0x1f,0x28,0xf8,0x42,0xdf,0xe9,0x36,0x19,0xc6,0x14,0x27,0xc6,0x00,0xeb,0x04,0x0f,0x2e,0x41,0xc0,0xea,0xab,0xf4,0xc9,0x0e,0xf5,0xbb,0x7d,0xdd,0xdf,0x48,0x0e,0x12,0xe3,0x2c,0x4e,0xe6,0xd6,0xfc,0xd8,0x44,0xfe,0x17,0x53,0x0b,0x0b,0xfa,0x2c,0x37,0x38,0xea,0x7f,0x9d,0x21,0x24,0x13,0x9f,0x0b,0xe0,0xff,0xc7,0xbf,0x21,0xe3,0x05,0x1f,0xff,0xeb,0x8e,0x2c,0x30,0xb6,0xe5,0x0c,0xf7,0x3f,0x49,0x07,0x0d,0xd2,0xf1,0xd4,0xfb,0x0d,0x0e,0x06,0x1b,0xb5,0x21,0xcd,0xfa,0xe7,0x00,0x2a,0xea,0x50,0x40,0x10,0x36,0x04,0x40,0xea,0x28,0x08,0xf7,0xfd,0x08,0x18,0xec,0x07,0xdb,0x04,0x2b,0x48,0x45,0xd9,0xc9,0xf3,0xf7,0x03,0xdc,0xc5,0xf1,0x1c,0x37,0xde,0x02,0x13,0xf7,0xa7,0xc1,0xfc,0x07,0x20,0xe0,0xdb,0x00,0x02,0x0b,0xf0,0x08,0x3b,0x11,0x00,0x03,0x01,0x2d,0x39,0x0a,0x3a,0x07,0x33,0xfb,0xd5,0xca,0xd3,0x05,0xfa,0xe9,0x05,0x1e,0xea,0xce,0x20,0x1a,0xca,0xbf,0xed,0xf8,0xfb,0xda,0xfb,0x35,0xef,0x08,0x22,0xc5,0x15,0xe5,0x34,0xcf,0x24,0x0c,0xe5,0x08,0x8f,0xf3,0xec,0xfb,0xdb,0x4b,0xf3,0xa4,0x2b,0xf6,0xde,0xfe,0x07,0xcd,0x26,0x2d,0x62,0xf6,0xd6,0xde,0xf7,0x28,0xe1,0x7f,0x39,0xf1,0xe6,0x08,0x13,0x08,0x37,0xf4,0xf5,0x06,0x09,0xf4,0x4a,0x1e,0xed,0x3b,0xd5,0xf9,0xec,0x0e,0xda,0x17,0xf8,0x39,0xf3,0xff,0xf7,0xf2,0x38,0x1a,0xe2,0x27,0xb6,0x03,0x05,0x0e,0x2d,0x17,0x06,0x28,0x59,0xe1,0xce,0x53,0x19,0x1d,0x5e,0xc6,0x01,0xe4,0x27,0xfb,0xf8,0xeb,0xc9,0xfc,0xfa,0x04,0x02,0xfe,0x13,0xef,0x81,0xf8,0xed,0x60,0xf7,0x0d,0x18,0xb6,0x05,0x24,0x1f,0xfa,0x19,0xd9,0xef,0xcf,0x17,0xc8,0xeb,0xd0,0xf8,0x03,0x08,0x17,0x15,0x17,0xfa,0x09,0xdd,0xc7,0xc8,0x3d,0x1f,0x46,0xda,0xe7,0x38,0xdd,0xf7,0x0c,0xcf,0x02,0xed,0x01,0xc9,0x02,0x0a,0x3f,0xf2,0xff,0x19,0xe2,0x0f,0x12,0x09,0xe1,0xee,0x25,0x1a,0xae,0xed,0xf4,0xe3,0xea,0x43,0x06,0xd7,0x25,0xe1,0x45,0x23,0x45,0xee,0x06,0x02,0x2e,0x38,0x24,0xfb,0xf8,0x30,0x23,0xe3,0xeb,0xf8,0x28,0x11,0xe0,0xf0,0x07,0xf7,0x06,0xf7,0xe1,0xf8,0x00,0x52,0x47,0xeb,0xf8,0x0c,0x0e,0xfe,0xd4,0x17,0xd4,0xfb,0x4b,0xdc,0x1f,0xf4,0x05,0x18,0x0f,0x9f,0x16,0xf2,0xac,0x81,0xaf,0x56,0x57,0x11,0xd1,0x0b,0x01,0x3b,0x0f,0x1b,0xe3,0xe2,0x16,0x0b,0xe0,0xe4,0x0b,0x32,0x05,0xd7,0xe4,0xdd,0x03,0x05,0xf2,0x01,0xfd,0xfe,0x5a,0x1a,0xd2,0x10,0x14,0x25,0x14,0xe7,0xce,0xe4,0x1f,0x40,0x07,0xe0,0xb5,0xd0,0xfb,0x0d,0x22,0x10,0x42,0x05,0xdd,0xaf,0x9b,0x3a,0x07,0xff,0xf4,0x1a,0xff,0x1c,0xc2,0xd1,0x83,0x0c,0xe5,0x14,0xf2,0xb1,0x3a,0x4a,0xee,0x0d,0xeb,0xd4,0xb5,0xcf,0x1e,0xd3,0xdd,0x0d,0xe5,0xfa,0x5c,0x96,0xf6,0xe8,0x40,0xf1,0x16,0x00,0x33,0xd9,0x03,0xd6,0xee,0x2b,0x0c,0x4d,0x78,0xea,0xe0,0xe9,0xdc,0x6d,0x5c,0xfc,0xac,0xf9,0x0b,0x0b,0x8f,0x25,0xaf,0xdf,0xf3,0x3b,0x0c,0xd5,0xcd,0xfe,0x1f,0xa3,0x8d,0xd7,0x2c,0x11,0x03,0x69,0xd8,0xf0,0x03,0x2a,0x13,0x17,0x29,0xfb,0xfa,0xfc,0xee,0xc9,0x12,0xed,0xe3,0x1e,0x7f,0xf2,0x5d,0xe5,0x4f,0xee,0xb7,0xce,0x07,0x0f,0xea,0x04,0xfc,0x08,0x49,0x54,0x06,0x0d,0xf4,0x38,0xef,0x11,0x1c,0x26,0xe8,0x13,0xae,0xf6,0x10,0xfa,0x36,0xfe,0xbb,0x2b,0x26,0xef,0x00,0xfb,0xf8,0xf8,0x12,0x0b,0x02,0xff,0xe3,0x32,0x03,0xef,0x45,0xc6,0xf5,0xff,0xf5,0x0c,0x1c,0xc3,0x01,0xdb,0x05,0xe4,0xf4,0x25,0x13,0x43,0x0c,0x03,0x03,0x0c,0xf2,0x0d,0x24,0xdc,0xcf,0xf1,0x14,0x03,0x0d,0x18,0x16,0xbe,0x42,0x21,0xe9,0x18,0xce,0xc8,0x26,0x12,0x1e,0xcb,0xfe,0xf0,0xf4,0x05,0xb8,0x41,0x02,0xf7,0xe9,0xe1,0xe7,0xf8,0xe9,0x54,0x0e,0xbe,0x4c,0xfe,0xe2,0x0b,0xf0,0xd9,0xdf,0x1d,0x15,0xe2,0xfc,0x5b,0xf3,0xde,0x35,0x3e,0xf9,0x34,0xf7,0xee,0xb3,0x81,0xc1,0xc8,0xef,0x60,0xda,0x34,0xc9,0xf5,0xed,0x18,0xcf,0xcc,0xed,0x0d,0xf0,0x2d,0x34,0xbf,0x0a,0x00,0x11,0x14,0xe4,0x49,0xea,0x52,0x23,0xd7,0x1d,0xd2,0x03,0x25,0x2f,0x2e,0x57,0x1f,0xdf,0xf7,0x03,0xda,0xc4,0xce,0x33,0xe2,0xc8,0xf7,0xcc,0x1c,0x06,0x28,0x22,0x9f,0xe4,0xb1,0x10,0xea,0x1f,0xef,0x12,0xd7,0x05,0xd9,0x28,0x52,0x08,0x06,0x15,0x42,0x1d,0x12,0x2f,0x37,0xee,0xbb,0xe1,0xf1,0xc0,0x1d,0xe6,0xce,0x0e,0xb7,0x1d,0x2f,0xd4,0x2a,0xf5,0xe6,0xd9,0xe2,0x41,0xd1,0xe9,0xa0,0xe5,0xb2,0xc8,0x40,0x85,0xe5,0x6d,0x5d,0x03,0xd8,0xf8,0x01,0xd7,0x12,0xce,0xdf,0x0f,0xbf,0x28,0x1d,0xd1,0xdd,0x18,0xc2,0xcc,0xe9,0xaf,0xf4,0x54,0xee,0xed,0x10,0x14,0xe2,0x2c,0xb9,0x03,0xd5,0xdb,0xe3,0x70,0xdb,0xbc,0x06,0xc1,0xe9,0xf1,0xf4,0xd0,0x21,0x4c,0x04,0xed,0x1d,0xe5,0x1d,0xda,0xf7,0x10,0x14,0xb4,0xea,0x51,0xd8,0xf4,0x48,0x35,0xdf,0xf0,0x04,0x46,0x0b,0xff,0x0d,0x1d,0x36,0xbe,0x19,0xbd,0xfb,0x4b,0xed,0x2d,0xf4,0x0d,0xc1,0xff,0x17,0xed,0x2e,0xdb,0x3c,0xfe,0x07,0x47,0x53,0x2b,0xf5,0xc8,0x2a,0x1c,0x21,0x0c,0x1d,0xcd,0xe7,0xdc,0xf4,0xf6,0xf7,0x2f,0xd1,0xd4,0xf5,0x1b,0x18,0xc4,0x4d,0x17,0xaf,0xd5,0xe0,0xfc,0xab,0xb4,0x17,0x0c,0x5a,0x4f,0xe7,0x08,0x01,0x7f,0x0b,0xcb,0xeb,0xff,0xba,0xf3,0xe3,0xf1,0xed,0xe7,0xfe,0xf6,0x10,0x1c,0x2c,0x4b,0x00,0xab,0xee,0xf8,0x07,0xc9,0x1c,0x2e,0x0d,0xd1,0x18,0x68,0xb9,0xca,0xfa,0xbb,0xf9,0xe7,0x1d,0x44,0xd0,0x01,0xf4,0xfb,0x01,0xf3,0xae,0xb3,0xb8,0x04,0x01,0xf7,0xfc,0x13,0x0c,0x14,0x1c,0x4f,0xef,0xd9,0xfc,0xdb,0x00,0x1a,0xf3,0xbc,0xdd,0x09,0x0a,0xf5,0x0b,0xd8,0xe8,0xbf,0xf0,0xce,0xda,0x10,0x01,0xe6,0x0d,0xe3,0x25,0xfd,0x33,0x41,0xf2,0xff,0xce,0xd8,0x5f,0x29,0x25,0x33,0xe3,0xfd,0xf0,0xe9,0x3f,0xdd,0x20,0x31,0x0e,0x2f,0x25,0xf6,0xf8,0xf1,0xf9,0x44,0xc5,0xd7,0x22,0xf7,0x08,0x81,0xee,0xfc,0x30,0xf7,0xdc,0x17,0xea,0x21,0x19,0xaf,0xf2,0x4d,0xbf,0xd6,0x40,0xe0,0xd4,0x27,0x49,0xc8,0xe4,0x5f,0x33,0xd1,0x20,0xe0,0x09,0xf7,0xcd,0xd4,0x1a,0x1d,0x30,0x3b,0xf1,0x17,0x0f,0x4c,0x50,0xe5,0xe1,0xdd,0xf9,0xd7,0xbf,0x35,0xb9,0xc0,0x0e,0x93,0xfd,0x00,0x67,0xd1,0x0c,0x8d,0xb9,0x2a,0x35,0xd9,0x15,0x29,0x3a,0x2c,0xeb,0x3a,0xf2,0x15,0xee,0x29,0xfe,0xd9,0x22,0xb0,0xd7,0x21,0x16,0x0d,0x2a,0xbd,0x0a,0x0a,0xfc,0xad,0xbd,0xdb,0xef,0xc1,0xe5,0x22,0xc7,0xe1,0x2f,0xd2,0xf8,0x2a,0xfe,0xdb,0x54,0x81,0xc4,0xfd,0x00,0x41,0xf5,0xe5,0x22,0xdf,0xcb,0x09,0xe2,0x2b,0xf6,0x53,0xe5,0x19,0xd8,0x3b,0xb2,0x13,0x0f,0xd0,0xc8,0x1c,0xe0,0x4d,0x0d,0xb9,0x04,0x06,0x99,0xb4,0xe0,0xe8,0xee,0xf0,0xe9,0x4e,0x79,0x19,0x1a,0x02,0x9a,0x18,0xfa,0xf2,0xed,0x11,0xaa,0xd6,0xa9,0xcd,0xc8,0xd1,0x17,0x37,0x18,0x2a,0x18,0x15,0xf9,0xf4,0x3f,0xc5,0x0d,0x04,0x35,0x0e,0xf9,0xef,0x04,0x0b,0xd5,0xf9,0xf4,0x03,0x0a,0xf2,0x2a,0xb5,0xde,0x2d,0xff,0xb5,0xe2,0x4f,0xfa,0xdf,0x11,0x05,0xda,0xf7,0xeb,0xdc,0x2d,0xfc,0xee,0x00,0x1a,0xfd,0xf8,0x0d,0xfd,0x07,0x09,0x1c,0xad,0x22,0xd2,0x12,0xb3,0x02,0x04,0x0b,0x0a,0xc5,0x16,0x36,0xff,0xf1,0x05,0x10,0xe3,0xd8,0xab,0xf3,0xee,0xf0,0x0a,0xf2,0x0c,0x23,0x20,0xfd,0xbc,0x09,0x0e,0x0c,0x43,0x35,0x00,0xef,0x19,0xe9,0xf4,0xd1,0xfb,0xe7,0xab,0x1b,0xe8,0x02,0x08,0x1d,0xc7,0x2e,0x08,0xf2,0x12,0xd8,0x7f,0xd9,0x13,0xe4,0x17,0x03,0xfa,0xff,0x47,0xde,0x38,0xd6,0x16,0x11,0x06,0x0e,0x0c,0x0f,0x2e,0x20,0xdb,0xeb,0x02,0xfa,0xdf,0x01,0x29,0x01,0xf3,0x4d,0xf0,0xdc,0x1c,0xe9,0x3e,0xf3,0x1e,0xc6,0xc1,0xc5,0xbf,0xda,0x3b,0xf8,0x3f,0x24,0x22,0xe7,0xbb,0xc5,0x21,0xfd,0xf3,0x12,0x01,0xd0,0xa4,0x08,0xb7,0x1e,0xe7,0x0b,0xea,0x07,0x05,0xe1,0xf0,0xd2,0x12,0xc6,0xf4,0xe1,0x17,0x2e,0x24,0xb0,0x38,0xf6,0x4e,0xe6,0x03,0xbc,0x17,0x3f,0xe0,0xca,0x33,0x10,0xf7,0x1d,0xf1,0xfb,0x0f,0xc4,0x0e,0x3a,0xfb,0xf0,0xfa,0x25,0xfb,0x10,0x7f,0xf1,0x03,0x41,0xcb,0x29,0xf8,0x14,0x35,0x2f,0x25,0xfa,0x23,0xc8,0xfb,0xc3,0x2c,0xf3,0xf8,0xdd,0xf3,0x1d,0x0a,0xfb,0x0a,0x09,0xd2,0x06,0x18,0x30,0xfb,0x1a,0xfe,0xdf,0xfa,0xe0,0xe4,0x2b,0xfb,0xd8,0x75,0xfa,0xe3,0x1a,0x04,0xb7,0x3a,0xde,0xd1,0xd9,0xe6,0xfd,0xec,0xf5,0xc3,0xf9,0xe8,0xcb,0x2d,0x19,0x47,0x11,0x2b,0x2b,0xf9,0xf1,0xb0,0xa8,0x35,0x28,0x47,0xf4,0xf7,0xe6,0x11,0xde,0xfd,0xf8,0x0e,0xed,0xbb,0x42,0xf7,0x24,0xd3,0x10,0xd2,0x1c,0x09,0xe6,0xf3,0x0c,0xfe,0x1c,0xfd,0x11,0x0d,0x3e,0x0c,0x2d,0x13,0x12,0x05,0x29,0x03,0x00,0xbb,0x15,0x0c,0xd0,0xce,0xca,0xef,0xf8,0x0c,0xfd,0xf2,0x10,0xcb,0xc9,0xfc,0xc6,0x0b,0xf3,0x22,0xd5,0xd0,0x11,0xe4,0x14,0x0b,0xc5,0xbe,0xdc,0xf4,0x0b,0xc6,0xe0,0xe9,0x14,0x98,0x29,0x0f,0xb6,0x05,0xf8,0xfe,0xf0,0x0d,0xf5,0x25,0xe7,0x1e,0xe7,0xd9,0xff,0xe8,0xe3,0xf3,0x05,0x1e,0xe4,0xed,0x31,0x08,0xd7,0x29,0x24,0xdd,0x29,0x25,0x81,0xff,0x01,0xbb,0x36,0x30,0x11,0xc7,0xfd,0x57,0x1a,0x1c,0x4b,0x1b,0x8a,0xfb,0xfa,0xd9,0xef,0x0e,0x23,0xe8,0xf6,0x58,0x2b,0x19,0xa6,0xe4,0x1e,0xca,0x3d,0x0d,0x47,0xec,0xe1,0xcf,0xe3,0x29,0xdd,0xb5,0xf7,0xfe,0x25,0xeb,0x03,0x09,0xfa,0xbb,0xf2,0xcb,0x90,0x2a,0x2c,0x63,0x25,0xf7,0xed,0x46,0x9b,0xea,0x1e,0xfe,0xe9,0x00,0x47,0x24,0xfc,0x05,0xf0,0xe3,0x4b,0xd9,0xeb,0xd3,0x2b,0xe6,0x21,0xf9,0xe1,0xec,0xe6,0x8e,0x16,0xe2,0x08,0xe8,0xf2,0xe5,0xef,0x23,0x2e,0x90,0x1b,0xc7,0x09,0xe5,0x51,0x09,0x26,0xd5,0xd6,0xf9,0xfe,0x81,0x12,0x48,0x08,0xf5,0x04,0xda,0xb4,0x0f,0xdb,0xdb,0x02,0x48,0x12,0x06,0x31,0x29,0xdc,0xad,0xee,0xf2,0x3c,0xa2,0x13,0xbb,0xb1,0x16,0x94,0x0e,0x98,0xee,0xdc,0xca,0xcd,0xfb,0x1f,0x21,0x35,0xdb,0xe1,0x03,0x10,0xc5,0x3d,0xdf,0xe1,0xee,0xea,0xad,0x25,0x10,0xda,0xc7,0x37,0xef,0xcc,0xcb,0xe9,0x51,0x35,0x92,0x9c,0x02,0xec,0x55,0x24,0xf8,0x1d,0x00,0x03,0x00,0x46,0x13,0x20,0x04,0xcf,0x1e,0x28,0xfe,0x29,0xf1,0x3a,0x27,0x18,0x42,0x64,0x81,0xf7,0x1a,0xd2,0x4a,0xbd,0x54,0xe5,0xb9,0xbf,0x11,0xbb,0xb5,0x0b,0xd1,0x1b,0x06,0xef,0x0e,0x1b,0xfd,0x5e,0xe8,0xfe,0x06,0x01,0xeb,0xa7,0xe5,0xc4,0xcb,0xf8,0x02,0xf6,0xbc,0xfb,0x24,0x26,0xc5,0x36,0x2f,0xe2,0xc0,0xe9,0xd3,0xe5,0x6c,0x2e,0x02,0xf0,0xd1,0xda,0xe3,0xdf,0x1a,0x1f,0xcf,0x15,0x09,0xee,0xc8,0x6d,0x09,0xec,0xeb,0x26,0xca,0x0b,0x18,0xb9,0x23,0xea,0x97,0xe9,0x2b,0xda,0xf9,0xf4,0x89,0xcd,0xa5,0xaa,0xe4,0xd0,0xfd,0x1e,0xda,0xf2,0x1a,0xff,0x59,0x11,0x16,0xf8,0xaf,0x05,0xca,0x37,0x32,0xf0,0xe2,0xcb,0x0a,0xca,0xad,0xbe,0xbb,0xb7,0x54,0xc2,0x23,0x06,0xdc,0x0d,0xed,0x0c,0xea,0xbf,0xc4,0xb5,0xd3,0x8d,0x60,0xb6,0x03,0xc8,0x1e,0x54,0xcf,0xec,0xfd,0x0d,0x1e,0x2e,0x04,0x18,0xfc,0x45,0x02,0xd5,0x55,0xd8,0x10,0x46,0x45,0xe6,0xc8,0xd2,0x21,0x23,0x67,0x14,0x4d,0xb8,0xc0,0x4e,0x14,0xf5,0xd2,0xfa,0xfe,0xdf,0x19,0x1b,0x3f,0x17,0xac,0x0a,0x09,0xee,0x0b,0xb9,0xea,0xe1,0xc8,0x6f,0x81,0xda,0xfb,0x42,0xdb,0x25,0xd2,0xe9,0x31,0x45,0xf7,0x15,0x51,0x96,0xe8,0x27,0x0b,0x54,0x2b,0x9c,0x15,0xed,0xc9,0xdf,0xc8,0xc7,0xe9,0xf7,0xf8,0xdd,0x2e,0xd4,0xf3,0x1d,0x4d,0xdf,0xf1,0x04,0xf2,0xce,0x14,0x45,0xf9,0x1a,0xd6,0x01,0xdc,0xf3,0xf5,0xf9,0xed,0xd4,0x02,0x20,0x25,0xe0,0x02,0xf4,0x24,0xb7,0x3a,0xb5,0x38,0xf6,0x13,0xfe,0xc6,0x17,0x27,0xe7,0xdc,0x3d,0xec,0x07,0xe1,0xf9,0x04,0xca,0xfc,0x12,0xff,0xf2,0x05,0x0e,0x00,0xdb,0x22,0xf0,0x15,0x5d,0x1f,0x0f,0xeb,0x64,0x1a,0x7f,0x1e,0x01,0xee,0xb6,0x0f,0x09,0x50,0x15,0x90,0x1d,0x1d,0xff,0x0a,0x03,0xe6,0x12,0x58,0xe6,0x12,0xdc,0x1a,0x4d,0x07,0xe6,0xcd,0xce,0x2d,0xd5,0xe8,0xd9,0x2b,0x04,0x1a,0x28,0xd5,0x2b,0x95,0xa7,0x01,0xd2,0x28,0xa2,0x1b,0xe7,0x25,0xc6,0xe6,0x2d,0x09,0xa9,0x20,0x28,0xac,0x5e,0xea,0xf0,0xe5,0xeb,0x09,0xf6,0xfe,0x27,0xcc,0x12,0xe5,0x05,0x14,0xde,0x14,0xe8,0xe0,0xf2,0x0c,0x20,0x30,0x2e,0xfc,0x0a,0xfc,0xfb,0xdb,0xbd,0xca,0xe5,0x0e,0x26,0x24,0x1d,0xfb,0xcd,0xa2,0x18,0x19,0x09,0xf4,0xa3,0x14,0xc2,0xec,0x9d,0xe5,0x1a,0xdb,0x7c,0xec,0xe3,0xd7,0x00,0xe4,0x22,0x0a,0x02,0xb1,0x0e,0xd1,0x1d,0x10,0x18,0xd0,0x51,0x00,0x2e,0x02,0x28,0xda,0xe0,0xe6,0xc3,0x5c,0xb3,0x26,0xde,0x0b,0xab,0xf5,0x3d,0x97,0xf7,0xd6,0xeb,0xc2,0xf4,0xca,0xd9,0x1e,0x17,0x3f,0xde,0xb7,0xdb,0x46,0x15,0xd1,0x19,0xb4,0xe0,0xe9,0xf6,0xee,0xf8,0xe3,0xdc,0xe3,0xfc,0x4d,0x01,0x10,0xf1,0x17,0x11,0x0a,0xc6,0x9f,0x23,0x7f,0xf7,0x0c,0x25,0xfa,0xe6,0x28,0xff,0x0c,0xd5,0x01,0x5b,0xb7,0x0d,0xe3,0x19,0x31,0x1d,0x0e,0x04,0xd9,0x13,0xd7,0xcf,0xc0,0x1c,0x01,0x06,0xe1,0x56,0x03,0x60,0x61,0xa9,0xf5,0xec,0x16,0x0c,0xe2,0x09,0xfe,0x41,0x1b,0x3d,0x2c,0xcd,0xb6,0x24,0x1c,0xcd,0x4b,0xdf,0x5d,0xe2,0x37,0x3a,0xfd,0x25,0xe3,0xa2,0xcd,0x22,0xff,0x7f,0xb5,0xfd,0xfb,0x00,0xdf,0x30,0xdd,0x4b,0x4e,0x26,0xfe,0xda,0x23,0xe3,0x37,0x19,0xd9,0x1e,0xe0,0x05,0xe2,0xda,0xee,0xd6,0xef,0xf7,0xb7,0x07,0x05,0xfa,0xc9,0x1e,0x00,0xeb,0xf3,0x11,0x12,0xe7,0xda,0x28,0x83,0xd7,0xf5,0x04,0xf8,0xa8,0x14,0x4b,0xe6,0x09,0xfe,0x34,0xb9,0x18,0x49,0xd8,0xcf,0xf3,0xdf,0x0c,0x07,0xef,0x21,0xd3,0xd5,0x66,0xd9,0x08,0xdc,0x0e,0x0c,0x21,0xf2,0xd6,0x0c,0xc5,0xdd,0x13,0xd0,0xff,0x57,0xba,0xe5,0x24,0xc3,0xd0,0x2e,0x07,0xfe,0x5d,0x0f,0x14,0x5b,0xde,0x11,0x4b,0xee,0xf1,0xd5,0xd0,0xf9,0x14,0x05,0x88,0xf9,0x08,0x0d,0xbe,0x0f,0xf0,0x17,0x1c,0x08,0xf4,0x32,0x14,0x93,0xd3,0xda,0x94,0x0f,0xf6,0x38,0x07,0x1e,0x11,0xc1,0xdc,0xdb,0xd7,0xf3,0x31,0xfb,0x22,0x06,0xe2,0x01,0xc1,0xf6,0x10,0x17,0xb9,0x27,0xf8,0xfa,0x0c,0xdc,0xb7,0xe5,0x05,0x28,0x2b,0xce,0xeb,0x3b,0x2c,0xb7,0xfd,0x27,0xf8,0xfe,0x9e,0x31,0xf2,0x81,0x05,0xf3,0xef,0x1e,0x05,0x19,0x07,0xb3,0xd2,0xf9,0xfe,0xa3,0x16,0x07,0xdf,0xf7,0x62,0xec,0x20,0xee,0xe2,0x0f,0xf8,0x12,0xe4,0x06,0xd3,0xd7,0x44,0x17,0x03,0xbb,0x0b,0xee,0xff,0xf0,0xfb,0x26,0xe8,0x39,0xdd,0x0e,0x02,0xe1,0x07,0x27,0x09,0x03,0x28,0x01,0xe3,0xb0,0xf8,0xf5,0x30,0x0c,0x57,0x02,0x01,0xbe,0xb8,0x1b,0x25,0x0b,0x53,0x17,0x1c,0xeb,0x22,0x1a,0xaf,0xdf,0xd3,0x3f,0x07,0x04,0x2c,0xe0,0x15,0x29,0x02,0xc4,0xf8,0xbc,0xaa,0x16,0xf7,0xce,0xfa,0x01,0x53,0x0a,0x15,0xdb,0x27,0xa8,0xfc,0x03,0x08,0xc5,0x22,0xeb,0xf1,0xfe,0x2a,0xf5,0xaa,0x41,0xcb,0x4a,0x22,0xfb,0x38,0xc3,0x2c,0xd4,0xec,0xfc,0x25,0xfe,0xfe,0x32,0xe3,0xd4,0x12,0x06,0xf7,0xec,0x19,0x63,0x3a,0x81,0xf5,0x30,0xfe,0xe9,0xe5,0x04,0xeb,0xd2,0x13,0x3a,0x36,0xeb,0x13,0x18,0x16,0x16,0x0d,0xe4,0xfa,0x1e,0xe3,0xe9,0x10,0xfd,0x22,0x25,0xf2,0xe1,0x1d,0xf9,0x04,0x10,0xc2,0x01,0x0f,0x1a,0x15,0xc0,0x04,0x81,0xe5,0x44,0x02,0xa2,0xe6,0x40,0xf3,0x84,0x21,0xff,0xb4,0x30,0xde,0x4c,0x26,0x12,0x1b,0x4b,0xe7,0x11,0x6f,0xb5,0x6d,0x1e,0xe4,0x06,0xf3,0x12,0x0a,0xf5,0x0a,0xd8,0x17,0x5c,0xcd,0x7d,0xd5,0xc7,0x94,0xf4,0x30,0x31,0x02,0x28,0xd6,0x22,0xf5,0x07,0xc0,0xd6,0x29,0xdb,0x2b,0x4d,0x3b,0xf6,0xf7,0x72,0x46,0xe2,0xec,0xd8,0xc5,0x3f,0xbc,0x30,0xfd,0xdd,0x22,0xaa,0x15,0xf9,0xb3,0xd6,0x3f,0xf2,0x07,0x44,0xf5,0xf7,0x22,0xe5,0x28,0xf4,0xf9,0xc9,0x93,0x40,0x4b,0xf6,0x19,0x54,0xc2,0x18,0xde,0xe1,0xde,0x7e,0x34,0xbe,0x09,0xdf,0x11,0x06,0x1b,0xbc,0xf8,0x2f,0xde,0x50,0xd6,0xa9,0x2b,0x17,0x03,0xab,0x23,0x3d,0x11,0x54,0xd5,0xdd,0xb7,0x08,0x23,0x23,0x16,0xf4,0x13,0xe6,0x39,0xd8,0xf7,0x0e,0x3b,0xf6,0xb0,0xa9,0xfc,0x12,0xa6,0xf0,0xfe,0x3f,0x07,0xfd,0xcf,0xd5,0xbc,0x18,0xef,0x2b,0x43,0x19,0x04,0xb3,0xb2,0xf9,0x05,0xff,0x0f,0x0f,0x01,0xfe,0xeb,0xfa,0x1b,0xd3,0x0b,0x0b,0x02,0xe8,0x1d,0x29,0xdf,0xfb,0xc4,0x25,0xf5,0x02,0x14,0xe2,0x0f,0x46,0x11,0x0c,0x15,0x09,0xf7,0x08,0x0c,0x99,0x17,0xe9,0xd4,0x1a,0x17,0xef,0x02,0x37,0x01,0x01,0xd9,0x81,0x0c,0x40,0x28,0xeb,0x1a,0xf6,0xff,0xdb,0xf5,0xce,0xd2,0x24,0xc9,0x1a,0x17,0x08,0x44,0xee,0x2e,0x4e,0x0d,0x19,0x0d,0xb7,0xfa,0xd0,0xda,0xe2,0xdb,0x12,0x4f,0xe1,0x40,0x2d,0x33,0x03,0xe2,0xd2,0xe1,0xd4,0x2b,0xe3,0xc1,0x00,0x75,0x02,0x30,0x31,0xf9,0x07,0x07,0xe6,0x3d,0x3a,0xc4,0x13,0x0c,0xe1,0x0d,0xc2,0xf7,0xb5,0xf7,0xc1,0xce,0xbb,0x15,0xed,0xa3,0xf4,0x12,0xd9,0x0c,0xeb,0x17,0x8d,0xe5,0x2a,0x87,0x01,0xae,0xe5,0x1a,0xf0,0xf1,0x05,0xff,0x04,0xfd,0x2d,0xee,0x3f,0x04,0x4c,0x2b,0xc2,0xd3,0x03,0xc4,0x20,0x7f,0x2b,0xd5,0x1f,0x04,0xf6,0x02,0x21,0xfc,0xd2,0xd8,0xf6,0xec,0xeb,0x12,0xcd,0xed,0x10,0xd7,0xf7,0x24,0xf4,0x22,0x0b,0xea,0x07,0xf5,0x0d,0x1c,0x28,0x0b,0xbc,0xe0,0xca,0x00,0x39,0x1b,0xf8,0x32,0x08,0xfd,0x18,0xf4,0xeb,0xf0,0xfb,0x0d,0xfd,0xeb,0x11,0x0a,0xd4,0xe7,0xc8,0xd1,0x47,0x23,0xe7,0x1f,0x24,0xaf,0xf7,0xff,0xe0,0xf8,0xef,0x30,0xbe,0xe7,0x05,0x03,0x09,0x37,0xef,0xe0,0x19,0xd3,0x06,0x12,0xa2,0x19,0xf4,0xe0,0xe4,0x24,0xe9,0x4d,0xec,0xfb,0xf8,0xe0,0x19,0xf4,0x61,0xe3,0x65,0x03,0x0d,0x82,0x10,0x14,0x16,0x7f,0xa3,0x08,0x1f,0x29,0x32,0x1f,0x13,0xe0,0x08,0xf1,0x03,0x14,0x20,0xfa,0x1f,0xe8,0xca,0x28,0x07,0xdd,0x01,0xc2,0x16,0xd9,0x0b,0xe8,0x43,0x10,0x01,0x24,0x21,0x31,0x48,0xd3,0x0d,0x07,0xd7,0x42,0xfe,0xe5,0x41,0xd2,0x04,0x02,0x1c,0xb4,0xd8,0xb2,0xde,0xeb,0x51,0x50,0xc5,0xcf,0x00,0xd4,0x01,0x2f,0xc3,0xdf,0xbc,0xfc,0xe2,0xf3,0x26,0xfc,0x40,0x42,0x2d,0xc0,0xbb,0xef,0xe1,0xeb,0x13,0x15,0xa0,0x15,0x5a,0xee,0x09,0xfe,0xe6,0x38,0x0c,0x97,0xe2,0x3b,0xca,0xc2,0xf6,0x2e,0x17,0xf2,0xf6,0x29,0x00,0xe7,0x34,0x58,0x26,0xe2,0x1f,0x21,0x1c,0x14,0x0a,0xe6,0x06,0xe6,0xd0,0xf4,0x05,0x1a,0x1a,0xf0,0xc8,0x25,0x0e,0xf3,0xee,0xb3,0xc7,0xee,0xf7,0xe2,0xf5,0xfe,0xea,0xbb,0x39,0x0d,0xf4,0x1f,0x09,0x29,0xff,0xde,0xd4,0xd1,0x06,0xdd,0xf7,0x10,0xf3,0x3b,0x21,0xd5,0x03,0xf2,0xf9,0x00,0xe0,0xdc,0xec,0x1c,0xf4,0x08,0x34,0x7f,0x17,0xee,0x0c,0xdd,0x2b,0x18,0xb1,0x33,0xe1,0xc9,0xf4,0xe0,0x07,0xef,0xd3,0xd5,0x11,0x3d,0x15,0x0c,0x3c,0x02,0x00,0x25,0xf9,0xf1,0xe2,0xd6,0xf2,0xff,0x50,0x23,0x24,0x0d,0xea,0xf0,0x3f,0x08,0xf7,0xeb,0x38,0xec,0xfe,0xe2,0xce,0xdf,0xf1,0x10,0x14,0x31,0x01,0xea,0xed,0xeb,0x07,0xf1,0x3f,0x0f,0x0b,0x0b,0xea,0x26,0x02,0x19,0x0e,0x1d,0x27,0xbd,0x39,0x03,0x02,0xd4,0xc4,0xe0,0x2a,0x19,0x08,0x04,0x2e,0xde,0x0d,0x2c,0x0e,0x01,0x33,0xdf,0x1e,0xfc,0xeb,0xfb,0x09,0xbf,0xf0,0xf9,0x1a,0xe4,0xd8,0x16,0x01,0xc1,0x98,0xec,0xeb,0xe7,0x37,0x19,0xd3,0x15,0x0b,0x11,0x23,0x02,0x04,0xef,0x1a,0x52,0xfa,0x2a,0x34,0xf9,0x0b,0x14,0xc0,0xf8,0xd9,0xfb,0x24,0xba,0x2c,0x09,0x2a,0xb0,0xef,0x45,0xb4,0x1f,0xff,0x3c,0x0a,0x08,0xfe,0xf7,0x0f,0x32,0xcc,0xbd,0xc1,0xf0,0x0c,0xd0,0x08,0x06,0xfe,0xf6,0xde,0x3c,0x01,0xb9,0x1a,0x35,0x0e,0x26,0x00,0xdc,0xe9,0xcd,0x1d,0xe1,0x11,0x81,0x2d,0x20,0xcd,0x24,0xc5,0xfc,0xe5,0x00,0xed,0xe1,0x3e,0xf4,0x1c,0x0c,0xe0,0xe7,0x12,0x17,0x1d,0xed,0xe9,0x18,0xa9,0xe2,0xe8,0xea,0x44,0x49,0x13,0x13,0xc1,0x12,0xcb,0x2b,0xea,0x1a,0x22,0x35,0x28,0x27,0xd5,0x2d,0xfb,0xfd,0x42,0x5c,0xee,0x68,0x0e,0xeb,0xea,0x2d,0x46,0xee,0x3d,0x7d,0x07,0x02,0xf8,0xe8,0xf1,0xe5,0x02,0x0a,0xe5,0xf4,0x09,0xed,0x6d,0x31,0x89,0xf0,0xea,0xf2,0xce,0x0e,0x18,0x09,0x10,0x41,0xd8,0x12,0x0c,0xd4,0x08,0x2e,0x81,0x33,0x0d,0x54,0xf5,0x25,0xb9,0xc2,0x12,0xf7,0xe1,0x2c,0x0f,0x36,0xea,0x28,0x28,0x10,0x19,0xfc,0x07,0x2a,0xff,0xf5,0x0f,0xed,0x04,0x1c,0x0c,0xf5,0x2d,0xca,0x18,0x14,0x19,0x0d,0x39,0xaf,0x05,0x0f,0xe9,0xf7,0xd6,0xef,0xc8,0x4a,0xe8,0x55,0x03,0xbb,0xff,0xe3,0xda,0xf8,0xe3,0x28,0x8c,0x1a,0x0e,0x15,0x7c,0x04,0x0f,0xfe,0x34,0xe5,0xe9,0xf5,0xfc,0xbd,0xe3,0x24,0x2a,0x44,0xf1,0xb5,0xe5,0x10,0xde,0x0c,0xe6,0xd7,0xe4,0xdc,0x83,0xa2,0xe5,0xc3,0x41,0xeb,0x13,0xc3,0xf4,0x1e,0xff,0x25,0xb9,0x11,0x54,0x53,0xf9,0x36,0xd5,0xf6,0xf8,0xe7,0x1b,0xe0,0x0b,0xeb,0xef,0x27,0x16,0x40,0x0b,0x11,0x4a,0x00,0x2a,0xb8,0x02,0x4a,0x71,0x05,0xaf,0x01,0x30,0x07,0xda,0xe8,0xd4,0xd9,0xbb,0xff,0x36,0xe5,0xe0,0x0c,0xcb,0x4e,0x2d,0xe5,0xd5,0x19,0x0e,0x2f,0x28,0xe2,0x3a,0xbd,0xbd,0xe9,0x13,0xed,0x15,0x17,0xdf,0x03,0x67,0xfb,0x28,0xd3,0x3f,0x1e,0xce,0x59,0xf0,0x56,0x58,0xdc,0x28,0x1a,0xcc,0xb4,0xce,0x36,0xf3,0x31,0xde,0xe5,0xd8,0xf3,0x0c,0x1f,0x54,0xe3,0xf1,0x7f,0x23,0x0a,0x62,0x08,0x34,0xd0,0xf9,0xc2,0x0a,0xf4,0x53,0x0a,0x17,0x20,0xf7,0x05,0xfa,0x78,0xd8,0xc1,0xfd,0x1b,0xf4,0x81,0xa5,0xe4,0x16,0xdc,0xec,0xf1,0xff,0x02,0xf4,0x1e,0xe7,0xc8,0x00,0x13,0x0d,0x26,0x24,0xf0,0xdd,0x22,0xfc,0x2f,0x12,0x08,0xe9,0x04,0x02,0xee,0xf4,0xe2,0x1d,0x24,0xdb,0xfc,0x2e,0xb7,0x15,0xb3,0x1f,0xf6,0x5b,0x14,0xc7,0xbc,0xcb,0x65,0x00,0xd4,0x37,0xde,0x1b,0xe3,0x07,0x33,0xb6,0x25,0x11,0x36,0x48,0x0c,0x1f,0x11,0xfa,0xf9,0xd2,0xdd,0xdc,0x14,0x05,0xff,0x3a,0x3f,0x18,0x4b,0xf3,0xed,0xd0,0xb4,0x01,0xde,0xdc,0xfb,0x07,0x00,0xf6,0x27,0xf7,0xd1,0x38,0x0b,0xf3,0xbb,0x1d,0x1c,0x23,0x0e,0xf9,0xb9,0xa5,0x20,0x0c,0x00,0xcb,0x02,0xfe,0xf7,0xf7,0xfc,0x55,0xd6,0xd7,0x4d,0xeb,0xfc,0xee,0x0c,0x02,0x20,0x05,0xcc,0xfb,0xfa,0xed,0x23,0xd8,0xca,0x08,0xfa,0x81,0xfb,0xc2,0xf2,0x1f,0xa1,0xe1,0x3a,0xe7,0x0e,0xf9,0xfa,0xd2,0xec,0x04,0x37,0x40,0x18,0x46,0x13,0xd4,0x0e,0x24,0xe7,0xfc,0x26,0xe1,0x17,0x33,0x21,0x0f,0xc4,0xef,0xf1,0xde,0xda,0xb9,0x2f,0x11,0x2c,0xd5,0xef,0xec,0x26,0x1a,0xf0,0xd9,0xe9,0xeb,0xf1,0x00,0x05,0xd9,0xdd,0xc6,0xaa,0xdb,0x0b,0x23,0xd8,0x22,0x12,0x04,0x0e,0x0e,0x10,0xfb,0xd6,0xf4,0xd3,0x19,0xe4,0x31,0xcd,0xeb,0xba,0xd9,0xfa,0xe0,0xcb,0x0e,0x1c,0x11,0x0e,0x2f,0xf9,0xe9,0xed,0xc4,0xcb,0xec,0xd9,0x01,0xf3,0x3f,0x1d,0x11,0xfa,0x52,0x14,0x35,0x33,0xee,0x29,0xda,0x18,0x14,0xf3,0xcc,0xe3,0x10,0x81,0xc6,0xd0,0x31,0x47,0xe0,0xe6,0xf1,0x02,0x54,0x02,0x76,0x09,0x05,0x29,0x23,0xd3,0xd4,0xfb,0x1c,0x4f,0xdc,0x45,0xd6,0x1b,0xf4,0x50,0x17,0x63,0x0e,0x40,0x44,0xe0,0xe3,0x09,0x1c,0xeb,0x2b,0x16,0x09,0xc6,0xd8,0x31,0x11,0x06,0x37,0x34,0x3f,0xde,0x27,0x3e,0xd8,0xd1,0xd1,0xb0,0x9d,0x3a,0xed,0x0d,0x23,0x10,0xc6,0x0e,0xc6,0xf9,0x39,0x17,0x65,0x02,0xff,0x14,0xd5,0x02,0xff,0x28,0x2c,0x0a,0x2c,0xf9,0xf1,0x0c,0x1c,0x13,0xe6,0x06,0x00,0x11,0x13,0xf7,0x3a,0xc9,0xc0,0x1b,0xd7,0x10,0x18,0xf5,0x1d,0x78,0xfe,0x1a,0x26,0x19,0xdf,0xf3,0xcd,0x02,0xe2,0xfa,0x26,0x07,0x13,0x07,0x42,0xe8,0x0f,0xe2,0xf7,0xca,0xdd,0x4d,0x49,0x40,0x11,0xc6,0x42,0xb8,0xe8,0x03,0xdd,0x0b,0x14,0x2a,0x2a,0x3e,0x18,0xac,0xb3,0xef,0x1c,0xef,0xfc,0xed,0x0e,0xfb,0xf8,0x14,0x7f,0x39,0x8a,0x03,0xe8,0x5e,0xdb,0xd4,0x5c,0x02,0x02,0x39,0xf6,0xa4,0xc7,0xd4,0x28,0xf3,0xd2,0xf9,0xf8,0xf9,0x9f,0xff,0xb0,0x28,0xdb,0x11,0xe3,0xd1,0xf6,0xd0,0x0f,0x41,0x26,0x11,0xe4,0x1b,0xed,0xac,0x33,0x42,0x14,0x45,0x16,0x0f,0x09,0x3b,0xb3,0x45,0xeb,0xb3,0x3a,0x00,0xe9,0xcc,0x37,0xd4,0x26,0x10,0xf7,0xfd,0xc1,0x0d,0x2d,0xe4,0x01,0xbb,0x1b,0x2e,0x23,0xe5,0xf9,0xec,0xda,0xc7,0x0c,0xee,0xf9,0xd6,0xf9,0xd9,0xf4,0x4a,0x30,0xd6,0xf3,0xe7,0x4c,0x3b,0x4b,0x02,0x05,0x19,0x24,0x0b,0xa8,0x02,0x44,0xff,0x22,0x25,0xb8,0x3b,0x59,0x9c,0x1e,0xc4,0x17,0x20,0xff,0x0e,0xdf,0xd7,0xfb,0x0b,0x0d,0x05,0xf6,0x4e,0x00,0xeb,0x99,0x1a,0x3a,0x26,0xa6,0x23,0x1b,0x0c,0xbb,0x13,0x47,0x27,0xdc,0xe6,0xfc,0x37,0x18,0xbb,0xfa,0xb1,0xdb,0x65,0xfa,0x16,0xb6,0xf7,0x0a,0xd8,0x1d,0xb0,0xf4,0xf4,0xee,0xdf,0xf8,0x2c,0xd2,0x31,0xe0,0xf9,0xdd,0xa5,0xbc,0xb0,0x1c,0x3f,0xdd,0x2f,0xf5,0xc2,0xf6,0xe1,0xf8,0xf2,0xca,0x1b,0xbb,0x94,0xf6,0x92,0xed,0xd9,0xe4,0x3b,0xb0,0xda,0xfe,0xf2,0x20,0x8e,0xf0,0x5b,0xd8,0x0a,0xf3,0x3d,0xab,0x16,0xf7,0xf8,0x21,0x00,0xe9,0x39,0x09,0xc7,0x78,0x3c,0x08,0x1f,0x1f,0x1c,0x4e,0x53,0x81,0xc8,0x13,0x20,0x3b,0xdd,0x22,0x21,0x30,0xaa,0x05,0xd8,0x6f,0xf4,0xe5,0xd3,0xd7,0x28,0x78,0xbc,0xd7,0xea,0xb2,0x15,0x1d,0xbf,0x91,0xef,0xe0,0x2d,0xed,0x0f,0x9a,0xbf,0x38,0xf1,0xef,0xe8,0x17,0xa0,0xff,0x81,0x17,0x63,0xfa,0xb9,0x19,0x42,0x08,0xd4,0x9c,0xfc,0x29,0x23,0x5f,0x00,0x37,0xf8,0x18,0x16,0xb7,0xd7,0xdc,0x30,0xd3,0x34,0xac,0x04,0xe3,0xab,0xd1,0x23,0xe1,0xe4,0x2b,0xf2,0x44,0xc6,0xf0,0x3d,0x20,0xab,0x3d,0xde,0xde,0x40,0xf8,0xe6,0x63,0x4f,0x3d,0x2a,0x03,0xe0,0x14,0x04,0xf7,0x08,0xf1,0xab,0x34,0xe2,0xd8,0x05,0xee,0xea,0xd2,0x1c,0xfa,0xe6,0xf9,0x00,0xbf,0x05,0xe9,0x1b,0x1c,0x2a,0xd9,0xbf,0x1f,0x2d,0x22,0xee,0xe6,0x2e,0xc1,0xfb,0xed,0xc0,0x3a,0xfa,0xe0,0xdc,0x0e,0xb6,0xac,0xe7,0xea,0x11,0x37,0x16,0x47,0xff,0x1c,0xdc,0x70,0x1d,0xce,0xfe,0xce,0xef,0x0f,0xfc,0xdc,0xd5,0x02,0xff,0x13,0xcb,0xc0,0x2a,0xf4,0x2b,0xf4,0x4c,0x28,0xd6,0x0f,0x12,0x28,0xd2,0xf5,0x14,0x0e,0x22,0xd5,0x1f,0xfe,0x28,0xd2,0xdd,0xe3,0xe8,0x0c,0x12,0xec,0xee,0x0c,0xbd,0xdf,0xe4,0xbf,0x81,0x53,0xf7,0xce,0x37,0x1b,0x30,0x04,0xd5,0x1d,0xde,0xf7,0x10,0x05,0x11,0x32,0x03,0xc6,0xfc,0xe8,0xda,0xea,0xd4,0x3e,0x0b,0xfc,0x17,0x34,0xd6,0x56,0x96,0x25,0xf0,0xfc,0x30,0xe0,0xe7,0x16,0xe8,0xcf,0xe7,0xe6,0xfe,0x97,0xe4,0xc1,0x09,0xe9,0x6c,0x0e,0xf8,0xec,0x2a,0x04,0x00,0xe4,0x23,0x3c,0xea,0xb1,0xf8,0xcd,0x25,0xdf,0xcf,0xfb,0x05,0x01,0xf2,0xf2,0xb8,0x0e,0xcf,0xf0,0xec,0xf2,0x19,0xec,0xea,0xda,0xe6,0xef,0xee,0xe0,0x81,0xfc,0xc5,0x46,0xec,0xca,0x00,0xf8,0xe6,0x07,0xd6,0x07,0x3f,0x03,0x01,0x25,0x26,0xf1,0xd0,0xea,0x0a,0x0f,0xeb,0xe4,0xec,0xbc,0xe0,0x46,0xe7,0xf7,0xf1,0x02,0xdf,0xe4,0xdc,0x51,0xd0,0xd7,0xda,0x38,0xf0,0x05,0xf9,0x15,0xf7,0x01,0x1a,0xe9,0xf2,0x07,0x19,0xd7,0xee,0xd6,0x2c,0x24,0xa4,0x33,0xfd,0x22,0x13,0x17,0x59,0xf0,0x07,0x25,0xd8,0xd9,0xdf,0x35,0xd7,0xeb,0x06,0x00,0xde,0xf9,0xe3,0x0f,0x54,0xc6,0x01,0xfc,0x1f,0x2d,0x20,0xcd,0xc1,0xfb,0xc3,0xb1,0xc8,0xf3,0x49,0xd4,0x0a,0xf2,0xfc,0xe1,0xd7,0x19,0xa0,0x4d,0x14,0x33,0x25,0xf3,0x0f,0xa6,0xe8,0x32,0xf2,0xde,0xee,0xd3,0xf7,0x38,0xf7,0x04,0x43,0x0a,0xe5,0x17,0xf2,0x15,0x0d,0x46,0x0a,0x18,0xb3,0xf2,0xe9,0xaf,0x03,0xe0,0x0d,0x42,0xf3,0xef,0x36,0xeb,0xdf,0xe7,0xeb,0xff,0x13,0x30,0xb7,0xeb,0xe9,0xf9,0xe6,0x12,0x11,0x09,0x25,0xef,0xf8,0xf8,0xf4,0x03,0xf2,0xdb,0x10,0x25,0x06,0xe6,0x1f,0x24,0x16,0xd3,0xde,0x0d,0xb1,0xec,0x30,0x06,0xf5,0xd9,0xb6,0x11,0x03,0x11,0xd8,0xc3,0xe1,0x0b,0x04,0x13,0x37,0xec,0xd5,0xda,0xe6,0xed,0xf7,0x16,0x0f,0x40,0x29,0xd5,0x20,0xf9,0x0c,0xe8,0x36,0x3a,0xe6,0x26,0xfe,0xea,0x22,0xd6,0x0a,0xc0,0xee,0x14,0x44,0x38,0x2e,0xe4,0x0c,0xd7,0x27,0xd0,0x53,0xdd,0xb1,0x35,0xf4,0xdf,0xd6,0x7f,0xf1,0xcb,0x33,0xf2,0x0d,0x3c,0xee,0x2e,0x11,0x2a,0x38,0x0d,0xec,0x6d,0xe8,0x2e,0x28,0xa4,0xd7,0x44,0x0e,0x58,0xfd,0xd4,0xfb,0x2e,0x0c,0xf3,0x04,0x4f,0x12,0xf3,0x33,0xf2,0xf6,0xc5,0xd7,0xfe,0xf9,0x2a,0xef,0xd0,0x02,0xb2,0xfd,0x49,0xae,0xd9,0x38,0xf4,0x1d,0xf2,0x42,0x19,0x10,0x43,0xb2,0x15,0x03,0x0c,0xcb,0x0d,0x02,0xde,0x05,0xd4,0x05,0x43,0xcd,0xa7,0xe7,0xfd,0xf5,0x5f,0x81,0x5a,0xd3,0x0e,0x00,0x21,0x00,0xfa,0xbc,0x0a,0xd9,0xdb,0x00,0xc5,0x14,0xef,0xf4,0x1f,0xee,0x4d,0x5f,0xaa,0x19,0xd5,0x04,0x2c,0xde,0xd1,0x21,0xf9,0xee,0x6e,0xc9,0xbb,0x15,0xf0,0x10,0xc4,0x7c,0xe3,0xe3,0x27,0xe0,0x4d,0x16,0x27,0xaf,0x0f,0xbf,0xf1,0x53,0xfb,0xa1,0xde,0x04,0xcc,0x36,0xf3,0x65,0xf3,0x01,0xcd,0xea,0x12,0xe2,0xd6,0xa1,0xa8,0xf1,0x04,0x13,0x41,0xc5,0xdc,0x65,0xc9,0x21,0xfc,0xf9,0xfa,0x18,0xba,0x3b,0xd0,0x81,0xf4,0x30,0x25,0xff,0xe2,0x28,0xff,0xe8,0xd2,0xc2,0x94,0xc2,0xe7,0x1d,0x48,0xdf,0xbe,0xe1,0xce,0xca,0xfa,0x12,0x1e,0xe3,0xd6,0x20,0x44,0xae,0xcc,0xf8,0xec,0xe7,0x22,0x10,0xa4,0x4f,0x21,0x2a,0x0a,0xcf,0x1b,0xb6,0xec,0xe8,0x02,0x0b,0xe6,0x1a,0xe4,0xcb,0xa6,0x13,0xe1,0xbf,0xc7,0x96,0xc0,0xee,0xd8,0x00,0x2c,0x3d,0xda,0xe6,0xc0,0xf7,0x13,0xf8,0x1a,0x30,0xf0,0xe5,0x4d,0x07,0x18,0x22,0xa1,0x04,0xd1,0xbe,0x19,0xff,0xef,0xe0,0xaa,0x5b,0xe0,0xb9,0xf3,0x27,0xc5,0xd0,0x04,0x62,0xee,0xda,0x7b,0x3a,0xf8,0x56,0xbf,0x26,0x04,0x09,0xcb,0x25,0xf9,0xfd,0x68,0x04,0xcf,0x4e,0x40,0x32,0x72,0x18,0x2b,0xf1,0xfd,0x16,0x0a,0xe3,0xa4,0x3b,0x58,0xf3,0xba,0x26,0x41,0xc8,0x5a,0x07,0x6a,0x22,0x4e,0x2e,0xaa,0x37,0x3f,0x31,0x14,0x03,0xf4,0x10,0xef,0x31,0xce,0x1e,0xfe,0xdf,0x18,0xe8,0x18,0x1a,0x1b,0xfb,0xc5,0xd1,0x1f,0xdb,0x1a,0x31,0xdd,0x14,0xb5,0x6c,0x74,0x6d,0xfe,0x32,0xec,0xb0,0x24,0x15,0xfb,0xd3,0xca,0xc4,0x04,0x02,0xf2,0x45,0xcd,0xfc,0x0c,0x27,0xe4,0xf6,0x29,0x18,0xd7,0x35,0xda,0x01,0x1b,0x52,0x13,0x0b,0xef,0xf0,0x9a,0x12,0xbb,0xc5,0xdb,0xda,0xf5,0xd3,0x31,0xcf,0x49,0x23,0x9a,0xe4,0xea,0xd1,0xe5,0x05,0xc9,0xd3,0x0b,0xf2,0x02,0x36,0x13,0xb2,0x18,0x1f,0x33,0xca,0x0a,0xe7,0xfa,0x41,0xe9,0xa3,0xc1,0x7f,0x98,0x1a,0x0f,0x91,0xe6,0xe8,0x1e,0x40,0xd4,0xc4,0xf6,0x27,0xfe,0x0b,0x32,0x1b,0xfe,0x19,0x31,0xfd,0x14,0xc2,0xbe,0xc0,0xc9,0x26,0xe3,0xa3,0xeb,0x73,0x5a,0x44,0xe4,0xe3,0xf2,0x25,0xed,0xee,0x22,0x1f,0x08,0xfb,0x2b,0xf3,0x2a,0xd3,0xbc,0xd2,0xeb,0x1d,0xdc,0x02,0x39,0x04,0x1b,0x1b,0xc2,0xd3,0x14,0xeb,0x1f,0x05,0x43,0x10,0xec,0xcb,0xcb,0x00,0x15,0x24,0xf2,0x00,0x2b,0xda,0xf9,0x02,0xf0,0xfc,0xce,0x13,0xfa,0x11,0xe4,0xea,0xc5,0x61,0xee,0xd4,0x1d,0x08,0x7f,0x1a,0x44,0x12,0xef,0x0a,0xe2,0xed,0x08,0x02,0x21,0x04,0x4f,0x1c,0x21,0x04,0x14,0x10,0xf7,0xdb,0xc8,0x18,0xde,0x0a,0x50,0xac,0x25,0x0e,0xc4,0x26,0xeb,0x28,0x02,0xed,0x17,0x2d,0xf5,0x0c,0xf9,0xe1,0x72,0xe6,0xbc,0x23,0x06,0x01,0xda,0x1a,0x15,0xb4,0x33,0x02,0xe2,0x1c,0xcd,0x0d,0xd6,0x19,0x72,0x17,0xa9,0x0e,0x8e,0xc6,0xfa,0xd5,0x29,0x03,0xd0,0x26,0x7f,0x42,0x18,0xa7,0x2a,0x0c,0x01,0x00,0xfb,0xe1,0x23,0x6e,0x2c,0xeb,0x2f,0x06,0x1b,0xf7,0x16,0x16,0x5b,0xf8,0x2f,0x0c,0x37,0xde,0xfc,0xec,0xff,0x58,0x18,0x01,0xc4,0x9d,0xe5,0xfc,0x05,0x37,0x14,0x12,0xb5,0xc4,0xe8,0xdf,0x21,0x33,0x29,0x2b,0x02,0xa4,0x3c,0xd6,0xfa,0x20,0xf5,0x11,0x03,0x07,0xb7,0xd8,0xd0,0xc0,0xd5,0x0f,0xe3,0xf4,0xeb,0xf0,0xd7,0x0e,0x0b,0x39,0x29,0xdc,0x0a,0xfc,0xf0,0xec,0x4c,0x46,0xf2,0xfd,0x33,0x19,0x13,0x2c,0xe6,0xc3,0xdc,0xfe,0x1e,0x23,0x3a,0x09,0xfe,0xfe,0xce,0x0e,0xad,0x37,0x4b,0xc5,0xec,0xfa,0xc4,0x1b,0x09,0xf7,0x1d,0xef,0xc1,0x11,0x11,0xfc,0xe6,0xc4,0x0b,0x15,0x1d,0x0b,0xc8,0xd2,0xf9,0x08,0xb2,0x21,0xf5,0xf6,0x2d,0x30,0xc4,0x04,0x0a,0xe4,0xc6,0x09,0x0b,0xb0,0xf5,0x06,0x2b,0x09,0xcb,0xc4,0xf1,0xf7,0x41,0x05,0x08,0xee,0x41,0xeb,0x34,0x19,0x28,0x13,0x03,0xc4,0xda,0x1a,0x27,0x04,0xf3,0xda,0xf7,0x02,0xbe,0x00,0x36,0xda,0xb2,0x60,0xf9,0xbf,0x02,0xe2,0xce,0xf3,0xd4,0x11,0x20,0xe3,0xc2,0xac,0x0f,0x02,0xf5,0xef,0x33,0x38,0xe8,0x1c,0x12,0x0e,0x46,0xc0,0xe1,0xf8,0xda,0x20,0x21,0xf2,0x50,0xd7,0x0e,0x20,0x04,0x01,0xfe,0xb8,0x35,0xfb,0x30,0xc5,0xe1,0xe9,0xe2,0xdc,0x81,0x70,0xe7,0x15,0xfc,0x6c,0x05,0xf9,0x1b,0x28,0x29,0x06,0x1b,0xed,0x86,0x07,0x17,0xd7,0x1c,0xff,0xb1,0x18,0xcd,0xc1,0xeb,0x31,0xfe,0xf8,0xda,0xf7,0x02,0x20,0x09,0xd6,0x15,0xd7,0xe4,0x06,0xdb,0x11,0xdb,0xf4,0x11,0x15,0xcc,0x19,0xed,0xe4,0x41,0x2f,0xef,0xfa,0x0c,0xe2,0x07,0x31,0xf1,0x30,0xee,0xf5,0x09,0x10,0xe0,0xcb,0x36,0x20,0x0d,0xe4,0x27,0x3b,0x1c,0x1c,0x3f,0x0f,0xd6,0xef,0xee,0x81,0x30,0x0d,0xd5,0x36,0xf9,0xd8,0x12,0xe5,0x99,0xf9,0xb5,0x00,0x0c,0x3c,0x18,0x36,0x30,0xc0,0x13,0x06,0xd7,0xf6,0x19,0xbf,0xd5,0x05,0xfb,0xbe,0xf5,0x20,0xc8,0x01,0xe5,0xd7,0xf8,0xe7,0xe7,0xf4,0xcc,0xbc,0xb8,0x08,0x1d,0x24,0x2d,0x09,0xf6,0x1f,0xef,0xf0,0xff,0x16,0xef,0x24,0x0f,0xf4,0xed,0xe9,0x11,0x16,0x0e,0xe6,0x27,0x12,0xe1,0x0b,0xdd,0x2c,0x12,0x4e,0xf0,0x01,0x08,0xf5,0x27,0xcc,0xeb,0xfc,0x20,0xf5,0x23,0xff,0x2b,0xaf,0x0a,0x6a,0x57,0xd8,0xd1,0xec,0xe3,0xfc,0x1b,0xd9,0x0e,0xf7,0x05,0x05,0x08,0xbf,0x05,0xc6,0x0b,0xf5,0xdd,0x0b,0x1a,0x00,0x03,0xdf,0xc6,0xf6,0x0a,0xfa,0x05,0x19,0xcf,0xe1,0x36,0xd7,0xb5,0xf9,0xe8,0x14,0x00,0x08,0xe3,0x00,0x32,0xda,0xf6,0x0f,0x01,0xec,0x0a,0x13,0x04,0xe4,0xf3,0x3e,0xed,0x48,0xf3,0xf6,0x03,0x1a,0x10,0x02,0xe7,0xf0,0xf9,0xe1,0xc8,0xe8,0xec,0x36,0x19,0x1f,0x06,0xdd,0xe2,0x05,0xfb,0x1b,0x07,0xec,0xdc,0x00,0xe1,0x2b,0xf7,0x0b,0xf7,0x00,0x03,0x12,0x15,0x24,0x0b,0x00,0x00,0x1d,0xe6,0xd6,0x0f,0x25,0x7f,0xe9,0xd0,0x44,0x14,0xcc,0xe4,0xd8,0xe4,0xd6,0xf2,0x24,0xf3,0xfc,0xc0,0x05,0xf9,0x09,0xe3,0x03,0x46,0xf3,0xd3,0xea,0xe6,0xea,0xe6,0xed,0x02,0xe7,0xf5,0xb4,0x42,0x2e,0xf5,0xe2,0x18,0x36,0xf2,0x20,0x12,0xd7,0xb3,0x02,0x0f,0xfe,0x32,0x08,0xee,0xde,0xcf,0xe7,0xf9,0xbd,0x2a,0x17,0xf1,0x0f,0xdf,0x42,0xe8,0x24,0x0c,0xc7,0xf3,0x20,0xfe,0xec,0x07,0x31,0xd9,0xef,0x1b,0x29,0x0a,0x32,0xfa,0xf8,0x7f,0xd4,0x6f,0x16,0x1b,0xae,0xf6,0x25,0x11,0x04,0xed,0x07,0xbf,0x20,0x06,0xfd,0xe1,0xf7,0xcd,0xec,0x1e,0xeb,0x0a,0xe0,0xc2,0xee,0x17,0x24,0xc9,0xdc,0x17,0x1f,0x08,0xe7,0x1c,0xf3,0x0a,0x22,0x09,0xc3,0xf2,0x10,0x27,0xed,0x07,0x1e,0x36,0x02,0x12,0x0e,0x19,0x12,0x09,0xe9,0xfc,0x20,0xf5,0xf0,0x30,0xfb,0x11,0x45,0x7f,0xe6,0x23,0xb3,0xfe,0xe9,0xff,0x02,0x1a,0x1b,0x39,0x01,0xe7,0xdf,0xd3,0x34,0xce,0xe3,0x17,0xed,0xe4,0x27,0x2b,0xf7,0x25,0xc7,0xf2,0x2a,0xbd,0x28,0xe7,0xfd,0xe4,0x11,0x27,0x25,0x11,0xf5,0x0d,0x21,0xfc,0xec,0x09,0xef,0xdc,0xd0,0x05,0x0b,0xef,0x4e,0x0f,0x21,0x0f,0x42,0xfa,0xd5,0x25,0xd7,0x2f,0x24,0x1d,0x50,0xf6,0x04,0x1f,0x27,0x0a,0x52,0xca,0xfb,0xc1,0x14,0x1c,0x2d,0x3c,0x06,0x0d,0x33,0x1c,0x03,0x02,0xf9,0xfa,0x21,0xeb,0xeb,0xf9,0x06,0xe2,0xf0,0x1a,0xe7,0x01,0xb2,0x15,0x0f,0xb8,0x2a,0x04,0xfb,0x14,0xda,0xe7,0xff,0x5f,0xe1,0xf2,0x0d,0xd8,0xff,0xf7,0xbc,0xe8,0xa4,0x28,0x1b,0xee,0xeb,0x50,0xef,0x06,0x04,0xd0,0xfa,0xcd,0x00,0xc8,0xe7,0x81,0xf0,0xdc,0xee,0xfb,0xc1,0xa8,0xf9,0x38,0x12,0x4c,0x14,0x76,0xe3,0xf8,0xf2,0x50,0xf9,0xe5,0x1c,0xd8,0x39,0xf5,0x76,0x00,0x32,0xca,0x1b,0xfd,0xf9,0x00,0xf8,0x12,0x10,0xed,0x3b,0x0c,0x10,0xe9,0x06,0xee,0xe9,0xfc,0xf0,0x0c,0x13,0x1b,0x06,0x14,0x15,0xc4,0xc1,0xbf,0xfb,0x34,0xfc,0xe4,0x3b,0x02,0xcd,0x35,0x35,0xed,0x33,0x03,0xef,0x04,0x36,0xcc,0xf6,0xf2,0x21,0xe9,0x15,0xe1,0xed,0xdb,0x27,0xf7,0xbc,0xb4,0x20,0xee,0x01,0xac,0x4f,0xc2,0xbd,0xfe,0xc7,0xe5,0x0a,0x08,0xbb,0xf3,0xf8,0x47,0xeb,0xd6,0x19,0xf2,0x65,0x21,0x17,0xb6,0x0a,0x11,0x0f,0xf0,0xf4,0x26,0x19,0xce,0xd2,0x4d,0x2b,0xfa,0x06,0x10,0x06,0xe2,0x37,0x20,0x3f,0xef,0x44,0x4e,0x1a,0x57,0x43,0x81,0xae,0x1e,0x46,0x1f,0x0b,0x3a,0x03,0xae,0x0d,0xeb,0xd8,0xcc,0x25,0xe2,0x32,0xc8,0xe5,0x18,0xcd,0x1a,0x1e,0xe1,0xde,0x20,0x12,0x30,0xcf,0xe5,0xe8,0x16,0x31,0x0e,0x25,0xfe,0x17,0x05,0xe9,0xb7,0xa1,0x2e,0xc2,0x0d,0xb8,0x4a,0xf7,0xdf,0xd8,0xf9,0xcf,0xaa,0x36,0x08,0x2f,0x0c,0xca,0x99,0x02,0xf8,0x04,0x22,0xdd,0x2c,0xcb,0xf6,0x13,0x20,0xef,0x0f,0xe4,0x39,0x32,0x17,0xef,0xc3,0xe6,0x04,0xc3,0xf0,0xde,0xcf,0xdc,0x4d,0xf8,0xbc,0x12,0xd4,0x2b,0xbe,0xf7,0xb5,0x12,0x05,0x02,0xcb,0x2e,0xcc,0x03,0xbd,0x5c,0x11,0xde,0x2a,0xca,0x33,0xfb,0xe9,0xd8,0x11,0x64,0xf6,0xf7,0x2f,0xeb,0x09,0x47,0xf5,0x29,0x05,0xfc,0x27,0xf2,0xe0,0xc3,0x3e,0x09,0xf7,0xec,0xb5,0x11,0xf8,0x0d,0x7f,0xfa,0xc4,0x0c,0xec,0xf0,0xea,0x22,0xe7,0xd5,0xb4,0xf5,0xac,0x14,0xd8,0xfb,0xe0,0xee,0x22,0xc7,0x1c,0xd8,0x02,0xaa,0xd9,0xe2,0x1f,0x1f,0xff,0x25,0x25,0x1a,0x20,0xcd,0xfa,0x01,0xee,0xec,0xbf,0x2e,0x35,0x07,0x25,0x16,0x2d,0x01,0xcd,0x19,0x49,0xe4,0x57,0xff,0xfb,0xf2,0xef,0x09,0x28,0xf5,0xa9,0xd6,0x00,0xcf,0xf3,0xe5,0xc2,0xfc,0xca,0xfd,0x0d,0x18,0xde,0x1d,0xf4,0xd7,0x27,0x02,0x33,0x1e,0xd7,0x0c,0x18,0x41,0x03,0x1b,0xee,0x05,0x26,0x30,0x09,0xd7,0x14,0xbd,0xdf,0x0e,0xff,0xe5,0xfb,0x28,0xf8,0x38,0x17,0x08,0xdd,0xda,0x15,0xce,0x08,0xe6,0xc4,0xdc,0x19,0xe9,0xd8,0xc4,0x03,0xe6,0xcc,0x4b,0x0f,0x1f,0xc0,0xfe,0x15,0xf1,0x04,0xec,0x24,0xf7,0xe8,0x1f,0x3c,0xe9,0x39,0x23,0x81,0xac,0xbf,0x35,0x2c,0x14,0x00,0xd5,0x3b,0xd0,0x09,0x03,0xc3,0xd6,0x01,0x01,0xa9,0xc0,0x07,0x39,0xa9,0x2e,0x0f,0x44,0xfb,0x0a,0x22,0xe2,0xc5,0x21,0x02,0x21,0x08,0x88,0x10,0xbc,0xec,0x9f,0x27,0x0e,0xf8,0xcd,0xc6,0x33,0xf4,0x28,0xc6,0x07,0x0f,0x0c,0x03,0xc8,0xde,0xb4,0xe9,0x30,0x1b,0x37,0xe2,0xcb,0xef,0x03,0xc8,0xdb,0xcc,0x0b,0xf1,0xc4,0x34,0x16,0xb8,0x24,0x40,0x47,0xe2,0x10,0x22,0x0d,0xaf,0x01,0x00,0x18,0x9a,0x08,0xfd,0x12,0xd7,0x0c,0x37,0x93,0xdc,0xcd,0x20,0xf0,0x49,0x14,0x11,0xe3,0x0c,0xb8,0xf0,0x25,0xd3,0x30,0x2d,0x16,0x47,0x1f,0x3e,0xf6,0xc3,0xfa,0xb4,0x41,0x1d,0xd1,0x11,0xff,0xd5,0xf3,0xd6,0x00,0xef,0xcd,0xb5,0x13,0xd4,0xf8,0xbb,0xf0,0x34,0x6f,0xb7,0x1a,0x05,0xde,0xef,0xf0,0x2e,0xd1,0x10,0xf0,0xf2,0xfb,0x04,0x04,0xf3,0xfe,0x2a,0x23,0x1d,0xfa,0x05,0xc8,0xcf,0xb8,0xcd,0xb2,0xf3,0xe1,0xd2,0xc9,0x46,0x26,0x15,0x0b,0xea,0x0d,0x03,0x0e,0xa8,0x00,0xf7,0x34,0x1e,0x14,0xe9,0xed,0x0f,0x06,0x12,0xfb,0xbe,0x9f,0x4d,0xa7,0x14,0xd3,0x2f,0xb5,0xf7,0x4b,0x06,0x2a,0xdb,0x23,0x12,0xaf,0x05,0xeb,0x1c,0xad,0xf4,0xe9,0xfd,0x7f,0xe1,0xd3,0xf7,0x0f,0x31,0x28,0xe0,0xd3,0x2c,0x16,0xee,0xcb,0xfe,0x12,0xf0,0xe8,0xe9,0xfa,0x02,0xc3,0xcc,0xdd,0xe8,0xcc,0xe2,0xec,0xf2,0x00,0x1f,0xf9,0xfc,0xe7,0xe3,0xc6,0xb9,0xdb,0x58,0x19,0x2e,0x04,0x2e,0x31,0x39,0x2c,0xc8,0xd4,0xdd,0x1b,0xf7,0x22,0xad,0xd8,0x13,0x07,0xc2,0x27,0xe6,0x04,0xee,0xd2,0x0f,0xd8,0x16,0x0a,0x1b,0x03,0x09,0xe9,0xe0,0x0d,0xd2,0x04,0x09,0xc8,0x29,0x16,0xe3,0xe9,0x23,0xf5,0x03,0x40,0xda,0x58,0x0e,0x13,0x11,0x01,0x0d,0x1d,0x0a,0x18,0xa1,0x3b,0x7f,0x7f,0x1b,0x3f,0x06,0xd2,0xee,0xf8,0x0f,0x18,0xf3,0xca,0xed,0xe9,0xef,0x03,0x2d,0xe6,0xf6,0x3e,0x07,0xf9,0xe5,0xf5,0x2b,0xee,0xed,0x1c,0xfa,0xfe,0x14,0x1d,0x12,0x2d,0xe8,0xd1,0xe7,0x59,0x9d,0x0f,0x02,0xb8,0xf9,0x10,0x19,0x10,0xc5,0x08,0x5a,0x19,0xe2,0x3c,0xeb,0x19,0x0c,0xc0,0xe3,0x01,0xed,0xed,0xc8,0x08,0xfc,0xee,0x29,0xfc,0x0c,0x1a,0xe3,0x01,0xfe,0xe1,0x53,0x0d,0xd8,0x01,0xe6,0x23,0xfc,0xfc,0xbf,0xfd,0x14,0x4f,0x08,0xf8,0x23,0x05,0xe1,0xd3,0xd6,0xe1,0x56,0xb4,0x01,0xff,0xd6,0xe6,0xdd,0x14,0x0f,0x2a,0xf1,0x00,0xca,0x21,0xdf,0x16,0x0a,0x1f,0xcf,0x2a,0x02,0x56,0xf8,0x19,0x1e,0x10,0xde,0xf9,0x0f,0xdd,0xb2,0x3c,0x25,0x1a,0x30,0xf8,0x12,0xf5,0xbc,0x5e,0x0c,0x1b,0xfe,0x02,0xec,0x58,0x29,0x2e,0xda,0x07,0xc8,0x16,0x1b,0x1a,0x2e,0xd9,0xbb,0x03,0x24,0xf5,0x2c,0x0f,0xcf,0x06,0x7f,0xf8,0xc7,0x14,0xe2,0xd9,0x05,0xe5,0x12,0xf8,0xd6,0x01,0xf0,0xd4,0x0e,0x18,0x1b,0xd0,0x4c,0xe3,0xf5,0xf9,0xf6,0xd5,0xe4,0xe9,0x1a,0xd1,0x0b,0x2d,0xea,0x40,0xf7,0x29,0xfb,0xfa,0x1f,0xf8,0xe0,0xff,0x05,0x62,0xf8,0x08,0x7f,0xaf,0xdb,0xe7,0xe2,0x39,0xd6,0xf7,0xf7,0xff,0xce,0xfc,0x24,0x45,0x0e,0xfd,0x58,0xf7,0xe0,0x25,0xdb,0x1b,0x19,0xb7,0x17,0x1f,0x21,0x11,0xdd,0x29,0x26,0x4a,0x0a,0x3a,0x26,0x07,0x44,0xcc,0xe3,0x22,0x3f,0xb9,0xe3,0xf5,0xcf,0x30,0xec,0x27,0xd7,0x2f,0x25,0x04,0x13,0x07,0x1c,0x05,0x11,0xef,0xd2,0x2c,0xd5,0x66,0xf3,0xea,0xe1,0xff,0xe3,0xd3,0x26,0xc0,0xd6,0x2a,0x40,0x2d,0xeb,0x08,0xed,0x18,0x20,0xf0,0xe1,0x13,0x04,0x12,0x13,0x27,0x03,0x0b,0x04,0x11,0xf4,0xfe,0x08,0xdf,0x2e,0xd3,0x17,0xd1,0xcd,0xe9,0xf0,0x13,0x08,0x22,0x33,0xda,0xd9,0xf9,0xe9,0x17,0xfd,0xe8,0x05,0x8f,0xc6,0xeb,0xf9,0xc8,0x31,0xce,0xa6,0xde,0xb9,0xfb,0xe1,0x1d,0xff,0x0c,0x78,0xff,0xca,0xf2,0xb3,0xfa,0x0f,0x23,0xcb,0x11,0xbb,0x3a,0xe9,0xda,0xe6,0x12,0xee,0xeb,0x01,0xd7,0xf8,0xbb,0xe7,0xea,0x23,0x30,0xff,0xdb,0x0d,0xc2,0x33,0x24,0xcf,0x56,0xe1,0xb0,0xed,0xe4,0xfc,0xdf,0x2b,0x8e,0x03,0x1e,0xeb,0x05,0xc0,0xea,0xbc,0x2b,0xce,0x34,0xd6,0xdd,0xeb,0x08,0xeb,0xd8,0xc3,0x5a,0xc9,0x05,0x26,0xc5,0xd4,0x0f,0x65,0x26,0x36,0xde,0xdf,0xf1,0x37,0x27,0x3e,0xf3,0xac,0xbf,0xfa,0xd6,0x27,0x0a,0xda,0x2d,0xbf,0x24,0xc4,0xe9,0x63,0xd8,0xc0,0x10,0xe6,0x4f,0xfc,0x91,0xb9,0x1b,0xec,0xeb,0x96,0xf3,0xd7,0x5b,0xe8,0x74,0x1b,0xdc,0x07,0x1d,0x20,0xf8,0xef,0xf9,0xe2,0x2d,0x07,0x3f,0x28,0xf5,0x7f,0xdf,0xc7,0x1a,0x18,0x16,0xcc,0xd4,0xf1,0xf4,0x19,0xfc,0x22,0xcf,0xe4,0xd8,0x20,0xf8,0xaa,0x3c,0xde,0x73,0x0c,0x25,0x04,0x30,0x19,0xb3,0x09,0x4c,0x46,0x15,0xfc,0xd6,0xe6,0xcb,0xef,0xd6,0xfd,0x26,0x7f,0x40,0xcd,0xd9,0xfe,0xfd,0x1e,0x19,0xb9,0xe2,0x4d,0xfe,0xf4,0x05,0xcb,0x1f,0xd2,0x0d,0xcc,0xf6,0xaf,0x13,0xf8,0x0b,0x68,0xcc,0xd2,0x6f,0xac,0x04,0x36,0x52,0xf7,0xef,0xce,0x00,0x3c,0xb9,0xd4,0x0f,0xf1,0xe3,0xf3,0x33,0x34,0xef,0x0c,0xce,0x59,0x26,0x1f,0xd9,0xe3,0x21,0x16,0x15,0xf4,0x08,0x24,0x20,0x0a,0x29,0x02,0xe5,0xcb,0xf9,0xe1,0x32,0x01,0xf7,0x05,0x16,0xe7,0x28,0xfd,0x2f,0xce,0xcf,0x15,0xdd,0x55,0xdd,0xf3,0x4b,0x2e,0xf9,0xd4,0x1d,0x2f,0x43,0x19,0x99,0xde,0x81,0xd3,0xcd,0xfa,0x26,0xcd,0xcf,0xcd,0x10,0xe4,0x0d,0x44,0xe9,0x14,0x6f,0xcb,0x46,0xec,0xf8,0x11,0xb7,0xc6,0xf1,0xee,0xb8,0x06,0x83,0xe2,0xf1,0xad,0xec,0x2e,0x4a,0xbe,0x0b,0xf7,0xf9,0x03,0x16,0x0a,0x16,0xc7,0x21,0xe3,0xc0,0xd4,0xf7,0x49,0x17,0xb5,0x76,0x03,0x26,0xc7,0xe0,0x2a,0x1e,0xd2,0x28,0x0f,0xb2,0xf9,0xf6,0xbe,0x60,0x06,0x15,0xcf,0xbc,0x2c,0xef,0x08,0xd7,0x0d,0x02,0xe6,0x39,0xb1,0xc7,0x0b,0x0a,0x40,0x51,0xe7,0xe6,0xcf,0x11,0xa0,0xce,0xf7,0x0f,0xac,0x14,0xdd,0x22,0xe5,0x01,0xd0,0xd6,0x33,0xff,0xa2,0x1c,0x02,0xee,0x24,0x17,0x46,0xf3,0x03,0xf4,0x17,0xf8,0x01,0xee,0x47,0x78,0xf3,0x24,0x95,0x16,0xf0,0x18,0xc1,0x21,0xe9,0x45,0x02,0xf4,0x21,0x03,0x2a,0xe1,0x27,0x43,0xdb,0x2f,0xf4,0x1c,0xf1,0xd3,0x2a,0xde,0x45,0xbd,0x25,0x65,0xea,0x09,0x03,0x0a,0x43,0xec,0x27,0x2b,0xe1,0x9b,0x0e,0xf9,0xe4,0xda,0x05,0xc1,0xe8,0xe4,0x00,0x05,0x0e,0xec,0x02,0xf3,0xd8,0x40,0x33,0x13,0xc7,0x04,0xf7,0x3f,0xf5,0xe8,0x16,0x1e,0xd1,0xec,0x0a,0x15,0x11,0xd1,0x09,0x0e,0xd7,0xf4,0x0b,0xd2,0x28,0xdf,0xc2,0x29,0xe7,0x43,0x31,0xeb,0x52,0x0c,0x20,0xf2,0xe2,0xea,0x00,0xd3,0x02,0x61,0x61,0x0c,0xed,0xe7,0x1d,0x06,0xa3,0xf7,0xf0,0xd8,0xd3,0x41,0xe0,0xe9,0xc0,0xf7,0x07,0x35,0x25,0xf5,0xb9,0x05,0xd5,0xf2,0x12,0x16,0x37,0xdc,0x00,0x1d,0xba,0xc4,0x13,0xe2,0x37,0x10,0x09,0x27,0x7f,0x01,0xb9,0x0b,0xf7,0xf1,0x1f,0xe6,0x13,0xbc,0xf2,0xd4,0x25,0x31,0x30,0xff,0xf3,0xcb,0xc9,0xd4,0xe9,0xe0,0x00,0xcb,0x2d,0xcd,0xdb,0xfc,0xfd,0x05,0xdb,0xe0,0xe6,0x7f,0xf5,0x27,0x19,0xbf,0xce,0xed,0xe5,0x19,0x11,0xd4,0xc0,0x11,0x1b,0x0f,0x00,0xcd,0xe8,0x08,0x15,0x05,0xd0,0x1c,0xe1,0xf6,0x28,0x13,0x1d,0xf7,0xef,0xe9,0xcc,0x13,0x54,0x6e,0x18,0xe0,0xfe,0x08,0xc1,0xc9,0xfd,0xee,0xef,0x03,0x30,0x3b,0xd9,0x01,0xe9,0x11,0xca,0xc1,0xe7,0xfd,0x49,0x16,0x0d,0xb3,0x0d,0xfe,0x3c,0xfd,0xec,0x15,0xd5,0x1c,0x38,0x0e,0x37,0xd9,0x00,0x33,0xda,0xfd,0x19,0xfc,0x21,0xef,0xe4,0x3d,0xfb,0xd3,0xf4,0xfe,0x1f,0x17,0x0b,0x0e,0xd6,0xae,0xd1,0xf7,0x33,0x0a,0xf3,0x1d,0x07,0xd8,0xef,0x27,0xf7,0xe3,0xec,0xeb,0x10,0x37,0x32,0xe2,0x06,0xe9,0xdb,0x02,0xd7,0xd6,0xf3,0xf2,0x0f,0x18,0xf6,0x26,0xda,0x20,0x22,0x1e,0x01,0xff,0xef,0x25,0x23,0x25,0x7f,0x4f,0x18,0xd5,0x1c,0x01,0x0b,0xe7,0xef,0xe4,0xe5,0x0c,0xf0,0xf8,0xe3,0x28,0xbb,0x35,0xea,0xec,0x35,0xf3,0xc8,0xf2,0xc4,0xe7,0x10,0x00,0x10,0x01,0x19,0xf2,0x0e,0xff,0x07,0x0c,0xce,0x40,0x22,0x3d,0x0d,0x07,0xee,0xcb,0x30,0xf8,0x0b,0xd6,0xdb,0x01,0xed,0xed,0xd0,0xea,0x32,0x05,0xe1,0xf2,0x1a,0x1d,0xec,0x33,0xd0,0x2a,0x08,0x20,0xe3,0x30,0x03,0xb1,0x0c,0x04,0x30,0xe7,0xde,0xf8,0xe5,0x1b,0x14,0x05,0xe0,0x08,0x1a,0xee,0xe1,0x10,0x12,0x22,0x19,0x1f,0xfa,0xc3,0x14,0x1b,0x41,0xd5,0x46,0x1b,0xea,0xde,0x31,0x18,0xfc,0x39,0xf6,0xfd,0x02,0x1f,0x5e,0xed,0x47,0x0d,0x81,0xe8,0xc6,0x35,0x04,0x2e,0x10,0x0d,0xb4,0x17,0xf3,0x19,0x0e,0x0c,0x0e,0x14,0x01,0x60,0x45,0xda,0x09,0xd2,0x10,0xe8,0xf7,0x12,0x53,0xf1,0xff,0x4f,0x01,0xe7,0xd2,0x00,0xc2,0xb3,0xed,0x2b,0xf1,0x28,0xc1,0xfe,0x3a,0xf9,0x1b,0x16,0xeb,0x19,0xf9,0xff,0x08,0x43,0x25,0xf3,0x1a,0x34,0xb5,0x33,0xf8,0xea,0x87,0x18,0x18,0xec,0xe8,0x13,0xd1,0x24,0xea,0x00,0xed,0x13,0xf2,0xd0,0x02,0x01,0x18,0x17,0xf9,0x0e,0x23,0x23,0xf2,0x13,0x21,0x1e,0x01,0xe8,0x22,0xd6,0xc9,0xee,0xd9,0x1f,0xfd,0x08,0xc4,0x56,0x2f,0x2d,0x8b,0x15,0x1b,0xef,0xf8,0x0d,0xe2,0x22,0xeb,0x15,0x07,0x55,0xf4,0x24,0xf6,0xd8,0x06,0xd7,0x56,0x2b,0x3a,0xe1,0x0a,0x10,0xa1,0xfd,0x7f,0x22,0xc6,0xf9,0x0c,0xd3,0xdd,0xd6,0x15,0x23,0xfe,0x6d,0xdf,0xe1,0x21,0xe1,0xef,0xed,0xf6,0xcc,0x1b,0xdb,0xf8,0xfa,0xeb,0xf6,0xef,0xe5,0xf4,0x04,0x24,0x30,0x01,0x2d,0xf9,0xfc,0xfc,0xf8,0x06,0x13,0x31,0x2f,0xc8,0xc5,0xe8,0x61,0xf2,0x03,0x00,0xf4,0xcd,0xfb,0xf5,0x01,0xf1,0x0f,0x26,0x06,0xf5,0xe8,0xea,0xc6,0x00,0x0a,0xf5,0xff,0x2e,0x08,0xfa,0xdb,0xb7,0x24,0x12,0x1d,0xf5,0x1c,0xd1,0x3c,0x0b,0xef,0x10,0xea,0x06,0x16,0xe0,0xa8,0xd5,0xdb,0x19,0xfe,0x18,0xe8,0x08,0x1c,0x2b,0x25,0x27,0x0b,0x38,0x22,0xf8,0x17,0xb1,0x5f,0xea,0xe0,0xa0,0x53,0x60,0xe8,0x17,0x12,0x2d,0x10,0x49,0x2b,0xc0,0xf4,0xf0,0xdc,0x08,0xb8,0x0c,0x10,0x16,0x2a,0xf7,0xe7,0xe4,0x06,0xfe,0xc5,0x31,0x03,0xef,0xf6,0x4a,0x1a,0x27,0x4b,0x54,0xd8,0xcc,0x00,0xfa,0xe0,0xf0,0x30,0x0f,0x40,0xdf,0x00,0x33,0xf4,0xd0,0x13,0x15,0xfb,0x29,0xc6,0x48,0x0d,0x13,0x06,0x43,0xcc,0xe7,0x7f,0xe9,0xed,0x0b,0x1c,0x25,0xfe,0xf9,0xf9,0xbd,0xc4,0xea,0x2c,0xdf,0x0d,0xc7,0x20,0x20,0xe1,0xde,0x68,0xf2,0x22,0xcf,0xef,0x13,0xff,0xe8,0x27,0x0a,0x48,0xd4,0x08,0x68,0x1f,0x14,0xff,0x0b,0x1b,0x49,0xc7,0xea,0x04,0xce,0x0d,0xd2,0x99,0xe1,0xd4,0xff,0xf6,0x0c,0x25,0x30,0x03,0x43,0x15,0x35,0xfa,0xe9,0x21,0x05,0x1f,0x27,0x33,0x1b,0xd1,0xdc,0xf2,0x29,0xd0,0xee,0xfa,0xc1,0x06,0x13,0xf0,0x4b,0x05,0x17,0xcf,0xf8,0x08,0x0d,0xf9,0x36,0x11,0xdf,0xfe,0xc7,0xb0,0xda,0xea,0x33,0x5f,0x3c,0x20,0xff,0xff,0x17,0x08,0xd8,0xf5,0x22,0xfa,0xd6,0xe6,0x43,0x17,0xe2,0x91,0xfe,0xf6,0x7a,0xe3,0xf2,0xf1,0x04,0xff,0xda,0xf8,0xee,0x0d,0xc8,0xea,0xc5,0xeb,0x17,0x06,0x11,0xd2,0xfd,0x7f,0x1b,0x0c,0x37,0xe1,0x0d,0x3d,0x3c,0x3c,0x35,0x15,0xe0,0x32,0x03,0x1d,0xe3,0x0e,0x13,0xdd,0xd9,0x14,0x12,0x08,0xc5,0x25,0x1b,0xd3,0xfd,0xe9,0x05,0x22,0x18,0x29,0x0c,0xbc,0xe0,0x01,0xdb,0xdb,0xe8,0x39,0x1b,0x2d,0x1c,0xdf,0xf0,0xfe,0x2c,0xec,0xf5,0x3f,0x0f,0xed,0xf2,0x2f,0xf3,0xf7,0x23,0xff,0x4e,0xd2,0xe6,0x6b,0x0b,0x05,0x11,0xf4,0xfb,0x15,0xe9,0xed,0x16,0x25,0xa5,0xfe,0x47,0x2a,0xd7,0xf6,0x4c,0x0b,0xd7,0xc7,0xd6,0xe6,0xcb,0xcd,0xfb,0xec,0xe7,0x00,0xd4,0xda,0x52,0xe0,0x21,0xbf,0xcf,0x3b,0xe3,0x1e,0xbb,0xab,0x44,0x56,0x7e,0xac,0x26,0x25,0xfc,0xdb,0xec,0x01,0xe9,0xea,0xf9,0x49,0x36,0x03,0x32,0x04,0x18,0xfe,0xc3,0xb2,0xba,0x7f,0xec,0xe6,0xbf,0x34,0x01,0x25,0x0e,0xde,0xe6,0x0e,0x8d,0xcc,0x28,0x0c,0x1a,0x24,0x1f,0xd2,0x1f,0x01,0x0b,0x28,0xd7,0xc9,0x38,0xf3,0xc4,0x5f,0xf3,0xcb,0xea,0xf3,0xcf,0xd0,0xdc,0xe6,0xd5,0x1f,0xc1,0x1d,0xfe,0xfd,0x88,0x1e,0xf1,0x11,0x05,0x1b,0xec,0xb0,0xa4,0xf1,0x1c,0xb8,0x7b,0x29,0x10,0x5d,0x16,0xf5,0xb4,0xb7,0x0a,0x2b,0x1d,0x3c,0xc0,0xfd,0xde,0xe7,0x32,0xc6,0x1a,0xd4,0xc6,0x17,0x02,0x06,0xc4,0xe0,0x35,0xaf,0xd9,0x02,0xbf,0x22,0x59,0xc8,0x14,0xed,0xb6,0xd3,0x5b,0xf3,0xb3,0xd4,0x19,0xfd,0x7f,0xde,0x2d,0xd5,0xfe,0xe5,0x1e,0xf5,0xd5,0xf0,0x36,0x07,0xe1,0x25,0xc9,0x11,0x29,0x8b,0xed,0xbd,0x19,0x14,0x74,0xb3,0xd9,0xf0,0x2d,0x11,0x1e,0xd4,0x30,0xb6,0xe0,0xff,0xc4,0x5d,0xf5,0x30,0xc0,0x96,0x0c,0x03,0x06,0x11,0xe5,0xf3,0xa1,0x03,0xe6,0xe3,0x31,0xb7,0x1b,0x3c,0xec,0xff,0xef,0x21,0x10,0x21,0xdf,0x18,0xf2,0x2e,0xdf,0xbc,0x23,0x73,0x0f,0x05,0xd4,0x26,0x0d,0xf3,0x02,0xc9,0x0d,0x33,0x3e,0xd3,0xda,0x21,0xd8,0xe9,0x24,0x18,0x03,0xd1,0xf1,0xdd,0xec,0xf0,0x15,0x29,0x12,0x18,0x00,0xf4,0x1c,0xc1,0x14,0x47,0xf6,0xba,0x5e,0x0d,0x46,0x17,0x1e,0x15,0x05,0x04,0xd5,0x1e,0x6b,0xea,0x2e,0x21,0xab,0xf7,0xc5,0x4c,0xdb,0x31,0x0a,0x15,0x07,0x4d,0x1a,0xcf,0xf3,0x24,0xbf,0x0e,0x0d,0xdf,0xdb,0x14,0x01,0x01,0x38,0x2d,0x34,0x2f,0x1c,0x09,0xde,0x2c,0x0c,0xc0,0xf0,0x23,0x02,0xb5,0x04,0x3c,0xd7,0x1c,0xfb,0x20,0xc5,0x04,0xdf,0x48,0x15,0x3d,0x12,0xeb,0xe6,0x12,0xd1,0xde,0x39,0x33,0x33,0x05,0xfb,0xdb,0xf3,0x24,0xd4,0x1b,0xd1,0x30,0xe8,0xff,0x0e,0xea,0xfc,0xf9,0xcc,0x4b,0xd8,0x36,0xcd,0x3e,0xdd,0xf9,0x03,0xe2,0xf9,0x0a,0xd2,0xae,0xf0,0x1c,0xe9,0xf0,0x28,0x15,0x28,0xac,0x63,0x33,0x7f,0xc7,0xe9,0xc8,0x15,0x34,0xcd,0xf4,0xbe,0x08,0x23,0x39,0xfc,0x22,0xf2,0x02,0xf9,0x15,0xb2,0x21,0xc6,0x24,0x02,0x93,0xf1,0xc3,0x1d,0x18,0x1e,0xde,0xae,0x01,0xee,0xb6,0x67,0xe1,0x26,0xc2,0x05,0x01,0x06,0x28,0x33,0xfe,0xe2,0xe5,0xd0,0xbc,0x1b,0xcf,0x1b,0xdb,0x3f,0xe4,0x16,0x15,0x2d,0x52,0x5e,0xfb,0x22,0xd2,0x46,0xec,0x15,0xe9,0x2c,0xcd,0x24,0x22,0xed,0xea,0xfa,0xf5,0xc3,0xf5,0xb3,0x81,0x04,0xf3,0x90,0xcc,0x4f,0xcd,0x43,0xe5,0xfd,0x22,0x9b,0x15,0x01,0xc4,0x2a,0x3b,0xe5,0x04,0x09,0xe5,0xaa,0xf8,0xc2,0xcc,0x13,0x11,0x8b,0x39,0xaf,0x0d,0xfc,0xee,0xff,0xfd,0x1c,0xfe,0xd6,0x5f,0xec,0xcf,0xc2,0xc1,0x0f,0x68,0x22,0xf2,0x3c,0xd3,0xba,0x12,0x06,0xfe,0x11,0x7d,0xd1,0xca,0xdd,0xcc,0x15,0x10,0xed,0x05,0xb8,0xad,0xbf,0x16,0x58,0x2b,0xed,0x21,0x1b,0xf4,0x27,0xe7,0x00,0xe0,0x5f,0x12,0xc0,0xc1,0x0f,0x45,0xfa,0xd1,0x44,0xed,0x16,0x22,0x02,0xdc,0xca,0x4a,0xca,0xfb,0xe7,0xd9,0xea,0x2b,0x12,0xbb,0xcf,0x21,0xca,0x1c,0x1d,0x39,0xeb,0xc8,0xab,0x21,0xd5,0xd0,0x03,0xca,0xf6,0xcb,0xe4,0xf0,0x3e,0xd9,0x2d,0x03,0x16,0xfb,0xfe,0x08,0xeb,0x36,0x12,0x16,0x23,0x17,0x1d,0x34,0xe4,0xfa,0x19,0x1a,0xb1,0xfb,0xea,0x2b,0x9a,0xfe,0xfb,0x3d,0x40,0xd1,0x5d,0x5b,0xe4,0x2d,0xac,0xd0,0xc7,0xfd,0xca,0x11,0x7e,0x2c,0x01,0xf9,0xd2,0x2b,0xe4,0x7f,0x20,0xdd,0xfc,0xe6,0x0c,0x8c,0x17,0xff,0xf5,0x50,0x23,0x10,0xc7,0x0f,0x09,0x20,0xb1,0xfe,0xfa,0xf9,0x3e,0x0a,0xf6,0xfa,0x36,0xe2,0xca,0xf5,0x26,0x97,0x3f,0x0a,0xcb,0x17,0xf6,0x05,0xdd,0x41,0x00,0xdc,0xcc,0x28,0xed,0xe7,0xcd,0xf4,0xe9,0xba,0x81,0xcb,0xc1,0xc1,0xfc,0xde,0x18,0x11,0xfc,0xe8,0x02,0xf4,0x05,0x22,0xd0,0x06,0x0f,0xed,0x2c,0x33,0xfc,0xf4,0xf7,0xd3,0xf5,0xb1,0xcf,0x01,0xe3,0xf8,0x05,0xc9,0xe7,0xfb,0x47,0xad,0xfc,0x08,0x0e,0xb2,0x20,0xcb,0x16,0xf9,0x1e,0x22,0xec,0xe4,0x46,0xf9,0xf2,0x5a,0x01,0xc7,0xeb,0xfa,0x25,0xf2,0xf5,0x06,0x26,0xdc,0x09,0x05,0xe1,0xbd,0xdc,0x15,0x08,0xa9,0x10,0x1d,0xf9,0x02,0x28,0xe1,0xf9,0x19,0x0e,0xf0,0xed,0xe1,0xef,0x20,0x44,0x43,0xd1,0xf1,0xfd,0xc0,0x1e,0xda,0x95,0xd4,0xe8,0x49,0xed,0xb3,0xee,0x2f,0xc8,0x03,0xe9,0x0c,0x14,0xde,0xd9,0x2a,0x75,0xe6,0xfd,0x0d,0x2e,0x47,0xd1,0x33,0x16,0x12,0xd0,0x3a,0x7e,0x12,0xc5,0xc4,0xf8,0xa0,0xc1,0x3e,0x1e,0xe6,0x99,0x3d,0x06,0x00,0xf5,0xe8,0xea,0x73,0xe3,0x18,0x07,0x63,0x26,0xf2,0xcf,0xcc,0x0a,0x1d,0xcc,0x35,0x54,0xd6,0x3d,0xcc,0x44,0xd2,0xf2,0x38,0x09,0x07,0xc2,0x7f,0xd3,0xfb,0x31,0xfa,0xdb,0x07,0xf8,0x43,0xab,0x63,0x0f,0xd5,0x01,0xff,0xfb,0xdb,0x08,0xfa,0x1b,0x38,0xf9,0x0f,0x0c,0x40,0xe6,0xa5,0xe0,0xc5,0x4f,0x20,0xe8,0x3c,0x2d,0x21,0xe6,0xd9,0xef,0x0a,0xd1,0xfd,0xc7,0xb6,0x08,0xb9,0x95,0x39,0x60,0x14,0x0f,0xee,0xdd,0x12,0x47,0xe7,0xaf,0xdb,0x10,0xf9,0x5d,0x2b,0x16,0x0f,0xf8,0x29,0xda,0x12,0x00,0x0f,0xdf,0xe0,0x00,0x0e,0xdb,0x0a,0xc1,0x7f,0x07,0xf7,0x47,0xa1,0xf5,0xcc,0xd9,0xf8,0x2b,0xed,0xf8,0x1b,0xa4,0xd2,0xd2,0x6b,0x38,0x26,0x49,0xee,0x2e,0x21,0x0f,0xee,0xfe,0xe9,0x40,0xd5,0xee,0xe8,0xd6,0x3a,0xbc,0xd4,0x1c,0xf9,0x10,0xfa,0xde,0xd3,0x11,0x2a,0x00,0x2c,0x00,0x25,0xe1,0x2d,0xff,0x1a,0xfa,0x23,0xf0,0x26,0xd7,0xfd,0xe7,0x21,0x3e,0x02,0xfa,0x05,0x08,0x63,0x15,0xc4,0xcd,0x1c,0x34,0xd3,0x1d,0xee,0xea,0x05,0xa7,0xed,0xf8,0xed,0xe9,0xd7,0xd7,0x00,0x0f,0xcd,0xdd,0xfc,0xd1,0x09,0xcf,0xfe,0x3c,0x00,0xf5,0xee,0xf3,0x04,0x00,0x44,0xcf,0x24,0xe8,0xf0,0xcc,0xe1,0x08,0x14,0x33,0x18,0xf0,0x0b,0x48,0x64,0xed,0x0c,0x2e,0xe1,0xce,0x27,0xef,0xee,0x41,0xf7,0xba,0xce,0xce,0xfa,0x1d,0xda,0x90,0x11,0xb5,0xfb,0xf7,0xbd,0xfa,0xfb,0x1b,0x2d,0xc1,0xfa,0x4c,0x7f,0x0e,0x9f,0xc0,0xce,0x0f,0xe9,0xcb,0xd1,0x2f,0x28,0x03,0xc9,0xd5,0x39,0x00,0xec,0xfa,0x17,0xef,0xcf,0xd9,0xee,0x1c,0x65,0xf8,0x38,0x02,0xfa,0x2f,0x1c,0x23,0xed,0x3a,0xde,0x0b,0x36,0xf3,0x50,0x04,0x05,0x13,0xe5,0x13,0xec,0xcd,0xc8,0xef,0x09,0xa9,0xfd,0x00,0x0c,0x26,0xe9,0x04,0x98,0x05,0xdf,0x25,0x38,0x2f,0xfb,0x28,0x90,0x11,0x23,0xbf,0xc7,0x0d,0xe2,0xce,0x09,0x21,0x29,0xe8,0xeb,0xc1,0x15,0x40,0xd3,0x08,0x12,0xe2,0x26,0x36,0x15,0xab,0x0b,0x70,0x05,0x3d,0xf9,0xcb,0x52,0xf5,0xfb,0xab,0xdf,0x0b,0x2b,0xd5,0x1a,0xde,0x31,0xaa,0x5e,0x33,0x01,0x29,0x0c,0xad,0x00,0x07,0x3c,0x14,0xd2,0x22,0x07,0xd6,0x01,0xed,0xef,0x26,0x13,0xf8,0xe2,0x28,0xd8,0xe8,0x0f,0xf9,0x34,0xc2,0xbc,0xf3,0xb5,0x29,0xe1,0xd6,0x39,0x24,0x3c,0xff,0x09,0x29,0xc7,0x25,0x10,0x08,0xfe,0x12,0x02,0xf0,0x3e,0xd5,0x29,0x10,0xb4,0xe3,0xda,0xe8,0x4a,0xeb,0x21,0x1a,0xe9,0xfa,0x3b,0xe0,0xd1,0xf2,0xd5,0x00,0xc0,0x22,0x0d,0xe2,0x16,0xe3,0xe0,0xa9,0x03,0x7f,0x02,0x1d,0x1d,0xc7,0x1b,0x0c,0x2d,0xda,0xf3,0xde,0xf8,0x50,0x0e,0xea,0x0a,0xb1,0x15,0x25,0xdf,0xff,0x14,0x03,0xfc,0xa3,0xf7,0xd5,0x3e,0xa1,0xc6,0xe8,0x56,0xf0,0xde,0xd7,0xe5,0xe9,0x1b,0x27,0x17,0x40,0xf9,0xd6,0xde,0x47,0x4a,0xd2,0x1b,0x15,0xe9,0xd4,0x15,0x1b,0xfa,0x0a,0xea,0xe9,0xfb,0xd5,0xd5,0xcf,0xf5,0x36,0xfb,0x3a,0xf6,0xf8,0xf1,0xec,0x05,0xe9,0xf2,0xfa,0x14,0xba,0xec,0xeb,0x7f,0x4a,0xfe,0x16,0x46,0xd4,0x09,0xfe,0xda,0x08,0xf7,0xf1,0x19,0x38,0xf7,0x33,0xdf,0xd7,0x1b,0x15,0x28,0xe7,0x1b,0xed,0xeb,0xed,0x20,0x1a,0xc0,0x4c,0xf7,0x45,0x59,0xdc,0x02,0xcb,0x07,0x42,0xd7,0xd1,0xf8,0xfc,0x27,0xea,0x0d,0xd9,0xd3,0xf1,0xcc,0x36,0x10,0x49,0x29,0x14,0x06,0x14,0xae,0x16,0x35,0xc5,0xf9,0x02,0x16,0xde,0xd7,0x10,0x41,0xbc,0x2a,0xfa,0x1b,0xc7,0x13,0xc9,0x15,0x2e,0xe3,0x0f,0x2b,0xc3,0xc0,0x2a,0xf3,0x0e,0x00,0xd7,0x24,0x0d,0x2f,0xc8,0xc8,0xd4,0x14,0x66,0xc5,0xd0,0xd9,0xe4,0x3e,0x8f,0xb5,0xe2,0x27,0x04,0x3d,0xe4,0xe4,0x58,0x28,0xfa,0xe8,0xc6,0x20,0xf0,0xf3,0xfd,0x12,0x1a,0x09,0xd0,0xe1,0xcb,0xf2,0xce,0xd7,0xa6,0x18,0x6c,0x2e,0x35,0x4c,0x24,0x48,0xe3,0x2b,0xfe,0xde,0x18,0xf6,0xf0,0x14,0x27,0xb9,0xe2,0xc8,0x08,0xd9,0x03,0xf9,0xcd,0x30,0x56,0x1c,0x24,0x0a,0xd9,0xca,0xe2,0xff,0x04,0xcb,0x04,0x19,0x05,0x35,0xcf,0x54,0x17,0x28,0x04,0x00,0x25,0x08,0xe2,0xd3,0x33,0xc8,0xde,0xb4,0x37,0x0d,0xd9,0xf8,0xdf,0x14,0x81,0x52,0x36,0x03,0xdb,0x12,0x1f,0xfe,0x4a,0x0c,0xfd,0xe2,0xec,0xda,0xfd,0x21,0x12,0xf4,0xe5,0xc8,0x0b,0x12,0x41,0xae,0xe6,0xfb,0xee,0x1c,0xef,0x04,0x41,0x11,0xf0,0x11,0xe4,0xdb,0x21,0x1f,0x07,0xcf,0x0c,0x27,0x1e,0x1a,0xde,0xee,0xcf,0x24,0x1b,0x03,0xd9,0xee,0x06,0xd6,0xeb,0xd4,0xaa,0x1a,0xe4,0x0a,0x37,0x07,0x40,0xb7,0xa3,0x15,0xe2,0xc8,0xd4,0x11,0x41,0xff,0x20,0x3f,0x4d,0x31,0xbd,0x14,0xbb,0x09,0xfb,0x3a,0x40,0xd1,0x00,0xed,0xc5,0xe6,0x30,0xdb,0x2f,0xb1,0x17,0xdc,0x21,0x8d,0xf2,0x68,0xd4,0x27,0xe7,0xc8,0xbc,0x08,0xc4,0xf6,0xca,0xd3,0xcc,0x23,0xfc,0x46,0x3c,0x52,0xf6,0x14,0x2f,0xda,0xf2,0x18,0xee,0x42,0xc5,0xff,0x09,0xee,0x1c,0xf4,0xb4,0xf7,0x07,0x45,0xab,0x1a,0xd7,0x9f,0x20,0x01,0xbe,0x0a,0xbe,0xff,0xf6,0x1b,0xef,0x10,0xce,0xfe,0xf4,0x60,0x2d,0xd8,0x14,0x1b,0x26,0x7f,0x4e,0xe2,0xd7,0xfb,0xde,0xd5,0xe6,0x32,0xe8,0x0a,0x32,0xe4,0xf8,0x33,0x2d,0x32,0x1b,0x3a,0xfa,0x56,0x18,0x0e,0xda,0x2e,0xed,0x81,0x08,0xe5,0x32,0xf5,0xfd,0xe4,0xf7,0xde,0x00,0x29,0x05,0x34,0x47,0xc5,0xdc,0xd1,0xe5,0x75,0x24,0xc0,0xda,0xe5,0xde,0x19,0xfe,0x19,0x07,0x61,0xe5,0xf7,0xf9,0x31,0x0f,0x06,0xdf,0x50,0xdf,0x09,0x10,0x19,0xf1,0xde,0x34,0xc1,0x7a,0xfd,0xcb,0xda,0xdf,0xb6,0xa9,0xf4,0x37,0xf2,0x1d,0xaf,0x17,0x16,0x03,0xf2,0xc7,0xd4,0xd1,0x5d,0x08,0xc7,0xb9,0xf7,0x33,0x26,0xf5,0xd3,0xf5,0xce,0xcb,0x17,0x1e,0x0e,0xa2,0xfe,0xf7,0x18,0xfe,0x68,0x31,0x67,0xc4,0x23,0xc7,0x2b,0x9f,0x13,0x34,0xdc,0x30,0xcf,0xea,0xd3,0xfb,0x1a,0xf9,0x62,0x12,0x15,0xdf,0x12,0x2b,0xcb,0x0a,0xee,0x9e,0xc6,0xe6,0x52,0xf6,0x1b,0xb3,0x9c,0x46,0xf3,0x29,0x40,0x18,0xc7,0xb5,0x48,0x22,0xf0,0xae,0xbf,0xda,0xfe,0xbe,0x36,0xef,0x01,0xfd,0xcf,0xc0,0x21,0x52,0xf8,0xf9,0xdc,0x98,0xec,0xf8,0x08,0x54,0x3a,0xf5,0xc2,0xea,0x0d,0x03,0xbc,0xd2,0xa6,0x24,0x7d,0x4b,0x01,0xc9,0x06,0x10,0x0a,0xb6,0xf8,0x12,0x4c,0xf5,0xcc,0xf4,0x3a,0xdf,0xf8,0xbf,0x14,0xdd,0xbb,0xab,0xea,0xe0,0x37,0xa8,0x7b,0x0a,0xea,0x3c,0x8c,0x09,0xf8,0xe8,0xfc,0xf1,0x0d,0x9d,0x25,0x1f,0xf9,0x16,0xb2,0xbb,0x03,0x07,0xed,0xe0,0xff,0xbe,0xab,0xdc,0xdd,0x36,0x56,0xc3,0x32,0xe3,0x2b,0x81,0xfa,0x68,0xda,0xd8,0x55,0x08,0x0a,0x05,0x0a,0x16,0x01,0xf9,0xde,0xa5,0x21,0x38,0xcf,0x8e,0x3d,0xcd,0xe3,0xdd,0xb4,0x21,0x19,0xe7,0x2c,0xa3,0x0c,0xca,0xe4,0xfd,0x3d,0xdd,0xf5,0xe8,0x30,0x06,0x1e,0xab,0xf0,0xef,0xda,0x02,0xe1,0xe7,0xcf,0xeb,0xfc,0x1d,0x16,0x15,0x27,0x06,0xe3,0x13,0xe3,0xee,0x03,0xdd,0x10,0x09,0x1e,0x02,0xf8,0xf7,0xd5,0xe7,0xd7,0x01,0xd9,0xdd,0x05,0x28,0xfb,0x08,0x01,0x07,0xff,0xf7,0xca,0x11,0x30,0x06,0x11,0xf6,0x19,0x00,0x07,0xe0,0xf6,0xf3,0xf7,0x0e,0x19,0xc9,0x08,0xfd,0xe2,0x0a,0x15,0x01,0x1f,0x17,0xf9,0xec,0x46,0xf7,0xe6,0xd5,0xe3,0x33,0x0e,0x0b,0xf1,0xfe,0xe7,0x7f,0xe8,0xee,0xe8,0x1d,0x11,0xdd,0xfd,0x16,0xfc,0xe0,0x07,0xee,0x1f,0x15,0x01,0x42,0xd6,0xe9,0x0a,0xeb,0xea,0xd2,0xe1,0xe1,0x27,0xd4,0x15,0x23,0x19,0x03,0xf2,0xe9,0xfd,0xef,0x03,0x07,0xf2,0x11,0x06,0xf9,0xf3,0x20,0x07,0x02,0x5b,0xf0,0xd6,0x3b,0xf3,0xf0,0xcc,0x1e,0xbf,0xcb,0x21,0x12,0xe9,0x39,0xea,0xcd,0xd6,0x09,0x43,0x41,0x25,0x0f,0x35,0x38,0xf5,0x26,0x3d,0x15,0x02,0x0b,0xd8,0x13,0x1d,0x29,0x0a,0x03,0xf6,0x04,0x36,0x1f,0x66,0x1a,0x41,0x01,0xe2,0x01,0xf5,0x09,0xc9,0xcf,0x1a,0x58,0x4a,0x1d,0xf2,0x69,0xf7,0x01,0x3b,0x32,0xda,0xde,0x19,0xc3,0x11,0x05,0x70,0xb9,0x07,0x2e,0xc0,0xce,0x21,0x2b,0xfb,0x16,0xd3,0xb8,0xdc,0xed,0x3a,0x20,0xd8,0xc6,0x20,0xe6,0xcd,0x26,0x2a,0xd2,0xf9,0xeb,0x2c,0x52,0xa9,0x39,0x11,0x46,0xa1,0x3f,0x2e,0xf6,0x96,0xe6,0xcc,0xca,0xff,0x2f,0x1b,0x81,0x15,0x4f,0x1e,0x7d,0xd4,0x22,0x02,0xf2,0xe3,0xba,0xf5,0xde,0xeb,0x04,0x9c,0xd7,0x29,0xd9,0x43,0xe6,0x7f,0x19,0xec,0x31,0x40,0xeb,0x14,0x04,0xf3,0x0d,0x04,0x18,0x15,0xe5,0xfa,0xfc,0xc7,0xf8,0x2a,0xed,0x0a,0xfa,0x0c,0xf1,0xd5,0x31,0xdd,0xe3,0xf1,0xe2,0xec,0x54,0x00,0xd2,0xf1,0x28,0x14,0x10,0xfb,0xff,0xeb,0x08,0xe1,0x17,0x22,0x28,0xfe,0x0d,0xf7,0x04,0x16,0x06,0x12,0xfe,0xb4,0xf4,0x1e,0xe0,0xf3,0xec,0x1c,0xd2,0x0c,0x09,0x39,0x1b,0xe2,0x2e,0xfb,0xba,0x00,0x28,0xf1,0x10,0x08,0x2c,0xd7,0x05,0x20,0xe7,0xf9,0x07,0x24,0xfd,0xf1,0xe7,0x1c,0x04,0xd5,0xc8,0xec,0x2f,0xfb,0xfc,0x0c,0xe4,0xec,0x2a,0x2a,0xc9,0xf7,0xff,0xe3,0xd3,0xf2,0x08,0xe1,0x35,0xe6,0xe9,0x03,0x04,0x04,0x03,0x0c,0xce,0xd0,0x01,0x2f,0x39,0x13,0x15,0x38,0xfa,0xff,0xf9,0x20,0x3b,0x04,0xbc,0xe3,0xd2,0xfd,0x0e,0x11,0x19,0xe1,0x11,0x0c,0x19,0xfb,0xe7,0xdd,0x3b,0xd4,0xec,0x31,0x5f,0x7f,0x30,0x1c,0xc2,0xd7,0x01,0xcb,0xe5,0xf8,0x14,0xd5,0x42,0xf8,0xf9,0xb8,0xff,0xd7,0x1a,0xf9,0x28,0xf0,0x05,0xe9,0xdf,0x0d,0x0d,0xce,0x08,0xd7,0xe2,0x00,0x49,0x18,0xf4,0xb6,0xe9,0x34,0x22,0xf1,0x10,0x0e,0x1b,0x28,0x09,0x29,0xda,0x23,0x3d,0xf1,0x14,0x12,0xce,0xf8,0x27,0x0b,0x0e,0xf9,0x4b,0x10,0xde,0x1a,0xc3,0xf8,0x3a,0x0d,0xef,0x0d,0xff,0x06,0xb6,0x02,0x20,0x0d,0xee,0xd4,0xcb,0xf5,0x11,0xd2,0xfa,0xd7,0x08,0x5c,0x11,0xf6,0x29,0x0e,0xec,0x06,0xde,0xd0,0xc7,0xe2,0xef,0x54,0xfa,0xec,0xd6,0x1f,0xfd,0xf4,0xb2,0x2a,0x2a,0x15,0xfc,0x1c,0x2e,0x04,0x1a,0xb4,0xd8,0x03,0x00,0x19,0xec,0xb7,0xfd,0x2c,0x93,0x65,0xaa,0xf9,0x1a,0x24,0x37,0x55,0x7c,0xe0,0x52,0x1c,0x0d,0xf8,0x2d,0xef,0xef,0x1b,0xd4,0x21,0x25,0x16,0x48,0xe9,0xef,0xf1,0xe9,0x0a,0x35,0x64,0x35,0xb9,0x03,0xe9,0x0c,0xab,0xef,0x57,0xf2,0xd1,0x23,0x6a,0x46,0xbc,0xf2,0xfa,0xc5,0xf1,0x3b,0x0f,0x22,0xec,0xef,0x1e,0xfc,0xe8,0x94,0xdf,0xf5,0xcb,0x41,0xd4,0xef,0x1d,0x81,0x15,0x40,0x0d,0x32,0xf0,0xa5,0xe2,0x17,0x15,0xd7,0x04,0xfa,0xfb,0x89,0x3e,0x4d,0x4b,0x1c,0x44,0xdf,0x0c,0xdd,0xec,0x10,0xf6,0x2d,0xd4,0xde,0xfd,0x16,0x47,0xe1,0xb1,0x31,0x0a,0x47,0x90,0xed,0xd1,0xd2,0xdb,0xf4,0xde,0xea,0xb2,0xbc,0xdc,0x0f,0xf0,0xa9,0x27,0x16,0x57,0x1d,0x11,0xff,0x43,0xcb,0x22,0x07,0x15,0xf4,0x43,0xc7,0x02,0xc9,0xb2,0xee,0x4f,0xe6,0x56,0xbf,0x02,0xb9,0x20,0xb5,0xde,0x3b,0xa3,0x0f,0xe2,0xfe,0x1c,0xf4,0x33,0x52,0x04,0xb5,0x2e,0x26,0x88,0xc7,0x10,0xfc,0xe5,0x5c,0xe6,0xbc,0xe9,0x1c,0x6b,0xf2,0x03,0xd0,0x18,0xb6,0x18,0x0f,0x00,0xde,0xfc,0x02,0x6c,0xca,0xf1,0xf8,0x4a,0x3f,0xeb,0xaf,0x14,0xbe,0xe1,0xcc,0x50,0x15,0x30,0xeb,0x06,0xc2,0xfb,0xce,0xf9,0x25,0xe4,0x1f,0x1d,0x08,0x0e,0xeb,0xd9,0xad,0x19,0x0e,0x02,0xd9,0x03,0xf2,0xfb,0x14,0xd9,0xe2,0xc6,0x07,0x81,0xe4,0x1f,0xcf,0xe7,0x3c,0xb8,0xda,0x02,0x61,0x0d,0xfe,0x0c,0x41,0xc7,0xed,0xf1,0x2a,0xce,0x08,0x2c,0xe4,0x28,0xe9,0x06,0xa0,0x28,0xcc,0x0f,0x14,0xea,0x15,0x03,0xee,0xb3,0x0a,0xe7,0x04,0x38,0xeb,0xe8,0x28,0x09,0xe7,0x13,0x5b,0x0f,0x8d,0x01,0xd6,0xcd,0xed,0xeb,0xf7,0xf3,0x00,0x0a,0x21,0x4b,0x19,0xb6,0xb0,0x01,0xdc,0xe6,0x43,0xc8,0xce,0x06,0xb8,0x3f,0x31,0xe0,0xea,0xcf,0xf9,0x56,0xec,0xc5,0x81,0x32,0xbd,0xc3,0xf9,0x22,0x53,0x22,0x00,0xf2,0x3b,0xef,0x1a,0x45,0x9e,0x60,0x09,0x42,0xdd,0x2a,0x32,0xf3,0x3b,0xfd,0x2d,0x08,0xde,0x1d,0x41,0xdc,0xd7,0xdd,0xe1,0xf6,0x09,0xc3,0x17,0xd6,0x69,0x48,0xb6,0xfa,0xe4,0x1a,0xfb,0x5b,0xfc,0xba,0x08,0x01,0xec,0xd6,0xe0,0x26,0xd2,0xf5,0x0c,0xf6,0x1c,0xba,0xdb,0xf6,0x21,0xf9,0x0d,0x12,0x33,0xe8,0x04,0xc8,0xc2,0x25,0x0c,0x18,0xf6,0xae,0xd9,0xef,0xb7,0xbf,0x3a,0x20,0x0a,0x0a,0x48,0x05,0x06,0xcb,0x0b,0xb3,0x24,0xe2,0x51,0xce,0x17,0xfd,0xb3,0x2d,0x29,0xf2,0x04,0x09,0x61,0xcc,0xf1,0xb0,0x2e,0x4f,0x19,0x81,0x2f,0xfe,0x3e,0xae,0xca,0x11,0x15,0x79,0xd9,0xb2,0xf2,0xe0,0xed,0x42,0xaf,0xba,0x0a,0xee,0x2c,0xd1,0xee,0xf1,0xbc,0xe8,0xd7,0xd5,0xfd,0x02,0xfd,0x16,0x46,0xcf,0xc5,0xe8,0x37,0x2d,0xf5,0x23,0xe5,0xf1,0xc6,0x17,0x23,0x3b,0x55,0xe6,0x0f,0xeb,0x5f,0x07,0x1f,0x20,0x27,0x18,0xd6,0x01,0xfc,0x58,0x02,0xf1,0xe5,0xe9,0x13,0x23,0x16,0xa9,0xe7,0x16,0xe8,0xc0,0xfd,0x48,0x9a,0xfc,0x15,0xfa,0xde,0xce,0x05,0xb6,0x20,0xb0,0xf2,0x17,0xf8,0xd9,0x0a,0x15,0x34,0x20,0xcb,0x05,0x0d,0x13,0xe4,0xed,0xf2,0xeb,0xd2,0xff,0x21,0x0a,0x24,0x19,0xc5,0xff,0xf5,0xd8,0xfc,0xe4,0xe9,0xdd,0xf0,0x22,0x27,0xf9,0xda,0xe7,0xbc,0x26,0xfd,0xdc,0x0a,0xc7,0xf2,0xf8,0x44,0xd9,0x57,0x2a,0xfd,0x02,0xf9,0xf4,0x28,0x0e,0x29,0x39,0xe4,0x7f,0x62,0xd6,0x14,0xd4,0xda,0x17,0xdd,0x3a,0x1e,0xcd,0xea,0xfe,0xd4,0x00,0xf1,0xf9,0xf2,0x13,0xe6,0xf5,0xe3,0x7e,0xfc,0x18,0xbd,0x10,0x11,0xde,0x0f,0x01,0xd6,0xcc,0xbc,0x1a,0xe7,0xdb,0x0c,0x01,0x08,0x3c,0x07,0xe2,0xfe,0xc9,0xd1,0x04,0xef,0x34,0xfe,0x0b,0x20,0x2c,0x41,0x66,0x03,0xe3,0x24,0xfe,0xfc,0x02,0x44,0xeb,0x08,0xf3,0x62,0xfe,0xfe,0xf5,0x28,0xf8,0x05,0x08,0xfe,0xf4,0x00,0x02,0x37,0xdc,0xe9,0x0c,0xfd,0x81,0x22,0xfa,0xde,0x2e,0x05,0xff,0xfc,0x26,0xf0,0xf2,0xcf,0xf1,0xf0,0xdd,0xd5,0xee,0x0d,0xf3,0xe6,0xe1,0xfd,0x06,0x21,0xdb,0xf9,0x32,0xff,0x2b,0x15,0xfe,0x05,0x19,0x03,0xf3,0x45,0x02,0x0a,0x0f,0x02,0xe5,0xfc,0xd7,0x03,0xf1,0xc9,0x34,0xf2,0x0d,0x38,0xf2,0x06,0x28,0x2e,0xc5,0xc8,0xf1,0x0c,0xd8,0xe1,0x0b,0xd3,0xe7,0xe7,0x0d,0xfb,0xe8,0x40,0xf4,0x14,0x13,0x13,0xd0,0x01,0xff,0x13,0x18,0xf9,0xf9,0x58,0xeb,0xcf,0xd8,0x2b,0xd4,0xcb,0xe7,0x26,0x0b,0xf0,0x0a,0x20,0xf0,0x11,0xed,0xd9,0xe8,0x07,0xd3,0xd0,0xed,0xfd,0x0b,0x33,0xf2,0x03,0x0f,0x0e,0x0a,0x22,0xea,0xf7,0x24,0xe0,0x0f,0x2c,0xc2,0x0e,0x2b,0xb9,0x10,0x16,0xea,0x04,0x0b,0xe4,0xf4,0xcb,0x81,0xf3,0x0b,0x13,0x03,0x13,0x31,0xd5,0xde,0xf9,0x01,0x00,0xf3,0xfd,0xd3,0xfd,0x16,0xcd,0xef,0x34,0xb8,0x31,0x06,0x1a,0x1a,0xdf,0x2c,0x11,0x25,0xfb,0x4a,0x3e,0xf5,0xed,0xed,0x1b,0x25,0xf7,0xfd,0xed,0xf7,0xe5,0xfa,0xea,0xef,0x24,0x12,0x04,0xeb,0x08,0x1e,0xd8,0xd9,0x1e,0xfc,0xf6,0xde,0xe6,0xe1,0x10,0xfe,0x48,0x0f,0x0c,0xfd,0xdd,0x2e,0x1a,0xca,0xfe,0x33,0x0a,0xe2,0x23,0xcf,0xd1,0x15,0xed,0x10,0x2b,0x05,0xd7,0x00,0xf2,0x18,0xce,0xe9,0x0c,0x01,0xf4,0xed,0x31,0x21,0x01,0x09,0x29,0x06,0x09,0x3a,0xdc,0x55,0x10,0xf4,0x14,0xfc,0xa7,0xf8,0xb7,0x33,0xec,0x23,0xd5,0xf6,0xdc,0x09,0xe0,0x2c,0x20,0xd9,0xb6,0x36,0x0a,0x0a,0x33,0xef,0x09,0x1f,0xeb,0xf6,0x0a,0x2d,0xd5,0xe1,0xee,0x17,0xc0,0xd6,0x08,0x44,0xfd,0xd6,0x17,0x31,0x09,0xfc,0x39,0x48,0x3b,0x32,0x0f,0x30,0xd9,0xb1,0x6a,0x03,0x08,0xf7,0x11,0xce,0x2b,0x0e,0x2a,0xe7,0x34,0xf8,0x41,0x50,0xed,0x03,0x25,0x14,0x38,0xcd,0xfe,0xfe,0xeb,0x1a,0x0d,0x07,0x25,0xcf,0x2a,0xe5,0xfb,0xe7,0x60,0xe6,0x05,0xf6,0xed,0xf1,0xec,0x65,0x01,0x43,0xf8,0x33,0x1a,0xef,0xf3,0x16,0xf5,0xf8,0xde,0x19,0x35,0xc8,0xdf,0xfe,0xc5,0x0d,0xa7,0x0f,0x22,0xef,0x02,0x18,0xb5,0x0e,0x18,0x13,0x63,0x16,0x57,0xfc,0xbf,0xc2,0x09,0xea,0xda,0xf4,0xf8,0xce,0x1b,0x56,0xd0,0x1d,0xc3,0x0b,0xab,0x20,0x05,0xf1,0xcc,0xea,0xa6,0xec,0xfa,0xf0,0x26,0x06,0x0b,0x81,0xe5,0x21,0xd7,0x10,0xf3,0xff,0xf3,0xf1,0xed,0x1c,0x09,0x18,0x18,0x0a,0xf9,0xee,0xbd,0x6f,0x11,0xdc,0xac,0xd0,0x24,0xf0,0xe8,0xf1,0x1a,0xc8,0xea,0xd1,0x29,0x23,0xc2,0xf0,0x21,0xb8,0xe7,0xfe,0xec,0x2c,0xdb,0x07,0x13,0xca,0x2a,0xd3,0xe6,0x14,0x20,0xf4,0xe2,0x13,0x02,0x32,0xff,0x0d,0x02,0x0b,0x0f,0x0c,0x0e,0x17,0xf9,0x21,0x1b,0xf2,0x08,0xb5,0xfc,0xf5,0xe6,0xc4,0xf1,0xe9,0x0d,0x0b,0xf7,0xcf,0xc9,0x13,0xf8,0x33,0x0a,0x02,0x24,0xc3,0xf6,0x0d,0xc2,0xdb,0xf8,0x45,0xfe,0x14,0xf3,0xeb,0xe1,0xd3,0x15,0x32,0x0d,0xd0,0xde,0xec,0x19,0x14,0x0b,0xfe,0x0f,0xf5,0xe0,0xea,0x00,0x22,0x17,0xd3,0xd2,0xfb,0xf1,0x17,0x45,0x16,0x19,0x37,0x81,0xea,0x0b,0x3a,0xf1,0x49,0x4c,0xa8,0x0d,0x23,0xe5,0x0c,0xda,0xea,0x12,0xda,0xe3,0xcd,0x7c,0x0d,0x53,0x0c,0xc5,0x93,0x45,0xc9,0x6e,0x4f,0xbb,0xb7,0xf1,0x4c,0xe2,0xd4,0xf6,0xaa,0xe3,0xce,0xe7,0x36,0x98,0xf2,0x2d,0x1e,0x51,0x15,0xd3,0x19,0x5d,0xdf,0xa7,0x0a,0x00,0xea,0xc4,0x0b,0x07,0xe2,0x45,0xe9,0x14,0xd7,0x0b,0x77,0xb9,0x26,0xfb,0xe4,0x4d,0x26,0x16,0x01,0x8d,0x49,0x9e,0xf0,0x00,0x47,0x95,0x01,0x27,0xcd,0xd8,0x84,0x09,0xff,0xcf,0x17,0x81,0x15,0x17,0xcf,0xd2,0x25,0x31,0x09,0xa0,0x8f,0x0e,0x21,0x91,0x00,0x04,0xb2,0x40,0x1b,0xea,0xa6,0x0d,0x41,0x16,0xd5,0xe9,0xff,0x76,0x16,0x09,0x1b,0x02,0x37,0x44,0x48,0xf9,0xef,0xed,0x2e,0xe9,0x2c,0x20,0x17,0xd5,0xbe,0xad,0x4f,0xe4,0xfb,0xee,0xbb,0x04,0x0c,0xda,0x2b,0xe7,0x0c,0x20,0x03,0x2d,0x01,0xff,0xc6,0x2c,0x30,0xb0,0x31,0xe4,0xe4,0xd4,0xf3,0xe0,0xce,0xe7,0x04,0x9d,0x57,0x0e,0xf4,0xe3,0x24,0xf1,0xe4,0xef,0xc4,0xde,0x32,0xea,0xfa,0x0d,0xa7,0xf4,0x15,0xc8,0x11,0xc2,0x58,0x2e,0x8e,0x28,0xf2,0x32,0xc2,0xfa,0x2f,0xfa,0x46,0xf0,0x73,0x09,0x9a,0xca,0x42,0xaf,0xa8,0x18,0xe5,0x0f,0x05,0x0d,0x0c,0xca,0x0e,0xd7,0x27,0x05,0xe9,0xc6,0x19,0x81,0x0e,0xf6,0xfc,0xe7,0x41,0xe7,0xd5,0xe8,0x0a,0x10,0x07,0xd4,0x3e,0x06,0xcd,0xc2,0x01,0x2d,0xcd,0x5a,0xb4,0x36,0x05,0x31,0xd7,0x10,0xca,0x3c,0x17,0x00,0x38,0x20,0xf9,0xe7,0xdd,0xf8,0x18,0xad,0x12,0xa5,0xd4,0xe2,0xbf,0xfa,0x10,0xbd,0x1d,0xb0,0x2e,0x20,0xd9,0x0e,0xee,0xfb,0xa3,0xcd,0xc4,0xec,0xef,0xf2,0xe4,0x9e,0xdb,0xae,0x0d,0xff,0xec,0x17,0xa2,0x09,0x1b,0xfb,0xdf,0x29,0x00,0xf2,0xab,0xe3,0xdf,0xe5,0xe5,0x13,0x73,0x0f,0x14,0xf3,0xba,0xde,0xdc,0xc0,0x14,0x24,0x36,0x2c,0xbe,0xe4,0x11,0xeb,0x0e,0x05,0xd0,0xfe,0x2d,0xc8,0xf1,0x15,0x17,0x05,0x7f,0x17,0xe1,0xee,0xfa,0xf9,0x22,0x02,0xfc,0x2d,0xde,0x37,0x07,0x0d,0xef,0x10,0xdf,0xfc,0xc7,0x42,0xf4,0x1d,0xfe,0xfe,0x04,0xf9,0x04,0x3b,0xd3,0xf6,0x54,0xd0,0xe5,0xef,0x2a,0x13,0xd7,0x0a,0xde,0xf3,0x1c,0x0b,0x07,0xae,0xd7,0xf4,0x12,0xe6,0x18,0xa5,0x16,0xe3,0xc7,0xf7,0xfa,0x23,0x06,0x1a,0x1d,0xf0,0x0a,0x35,0x17,0xef,0xf6,0x2f,0xb1,0xeb,0x3a,0xf6,0x18,0xed,0x22,0xff,0xf0,0xee,0x1c,0xce,0xdd,0xe7,0x1f,0x0a,0x0a,0x23,0x2e,0xf2,0xca,0xff,0xd0,0xf7,0xef,0x43,0xdd,0xf7,0x7f,0xe2,0xfe,0xe7,0xe0,0x07,0xef,0xe1,0xf6,0x10,0xef,0xf2,0x03,0x9d,0xef,0x07,0xf1,0x4f,0xf8,0xfe,0x03,0xf2,0xf8,0xf8,0x02,0xca,0xaa,0x53,0x10,0x1b,0xfc,0x08,0x22,0xcc,0xc1,0xcf,0xff,0x00,0xde,0xea,0x20,0xcb,0xfd,0x12,0xf3,0xee,0xd5,0xd0,0xff,0xf6,0xff,0x0a,0xeb,0xb2,0xe6,0x0e,0xf5,0x62,0x02,0xff,0x12,0xdf,0x13,0x0c,0x0b,0x0a,0xe6,0xdc,0x0b,0x35,0xea,0x0d,0xd5,0x12,0xd8,0xdd,0x07,0xf7,0x23,0xc5,0x26,0xbd,0x25,0xe9,0xee,0x09,0x0d,0xb5,0x13,0xec,0xc5,0xe4,0x03,0x2a,0x06,0x18,0xd0,0xfb,0xe4,0xf4,0x30,0x1f,0x0d,0x00,0xfd,0xef,0xdb,0x0a,0x15,0xe3,0x18,0xfb,0xed,0x02,0x39,0x1b,0x71,0x53,0xbb,0xf3,0x15,0x1d,0xd6,0x3a,0x1d,0x2f,0x03,0xd9,0x1a,0x0a,0xf2,0xe9,0x1d,0x2c,0x4b,0x10,0x25,0xb4,0x36,0xd3,0x04,0xcd,0x05,0x18,0xf0,0xa9,0xe7,0xec,0xdf,0x0f,0xe5,0x17,0x1b,0x4f,0x21,0x1a,0x09,0x11,0xde,0x32,0xf8,0xce,0xfc,0x11,0x00,0x15,0xbb,0xf0,0x03,0xfd,0x3c,0x0a,0xf3,0xe5,0x36,0x1d,0xff,0xe7,0xe9,0x03,0xec,0x32,0x19,0xcb,0xd9,0xc0,0xe5,0x49,0x33,0x1f,0xfa,0xfe,0xc8,0x48,0x2a,0x0f,0xd8,0x1b,0xda,0xfc,0xda,0xfd,0xd8,0x25,0xc5,0x2f,0x01,0xd0,0x19,0x05,0x0a,0xcd,0xff,0xf4,0x19,0xfe,0x0f,0xfa,0xf3,0xe1,0xd6,0x17,0xca,0xe2,0x7f,0x23,0x3e,0x58,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xb0,0xf8,0xff,0xff,0x83,0xe2,0xff,0xff,0xaa,0x36,0x00,0x00,0x77,0x0c,0x00,0x00,0x9a,0xfd,0xff,0xff,0x9c,0x0c,0x00,0x00,0x0e,0xde,0xff,0xff,0xc0,0x1b,0x00,0x00,0x7c,0x04,0x00,0x00,0x2e,0xc5,0xff,0xff,0xbe,0x01,0x00,0x00,0xb1,0x17,0x00,0x00,0xb5,0x0f,0x00,0x00,0xf8,0x48,0x00,0x00,0xc9,0xfc,0xff,0xff,0x57,0xe2,0xff,0xff,0x4b,0x2a,0x00,0x00,0x08,0xc1,0xff,0xff,0xb2,0x25,0x00,0x00,0xb9,0x01,0x00,0x00,0xe9,0x24,0x00,0x00,0xc7,0x00,0x00,0x00,0xeb,0xef,0xff,0xff,0x4f,0x0b,0x00,0x00,0xcd,0x27,0x00,0x00,0x3a,0x07,0x00,0x00,0x77,0x25,0x00,0x00,0x61,0x07,0x00,0x00,0x54,0x1c,0x00,0x00,0x24,0xfd,0xff,0xff,0xd9,0xe1,0xff,0xff,0xe5,0xda,0xff,0xff,0x6e,0xf4,0xff,0xff,0x9f,0x37,0x00,0x00,0x64,0xdf,0xff,0xff,0xbb,0x1c,0x00,0x00,0xb9,0x1d,0x00,0x00,0x8d,0x09,0x00,0x00,0x2f,0x30,0x00,0x00,0x66,0x00,0x00,0x00,0xb2,0xf9,0xff,0xff,0x0a,0x41,0x00,0x00,0x53,0x21,0x00,0x00,0xf0,0x1a,0x00,0x00,0x58,0x43,0x00,0x00,0xe0,0x0d,0x00,0x00,0x09,0x3b,0x00,0x00,0xee,0x06,0x00,0x00,0xfa,0x34,0x00,0x00,0x8f,0xff,0xff,0xff,0xa5,0xef,0xff,0xff,0xb6,0x0f,0x00,0x00,0x21,0x1b,0x00,0x00,0x96,0x05,0x00,0x00,0xed,0xf8,0xff,0xff,0x5f,0x15,0x00,0x00,0xa0,0xc4,0xff,0xff,0xa2,0xe0,0xff,0xff,0x52,0x06,0x00,0x00,0xbc,0x33,0x00,0x00,0x54,0xb9,0xff,0xff,0xd5,0xfd,0xff,0xff,0xe2,0x13,0x00,0x00,0xc4,0x29,0x00,0x00,0x09,0x43,0x00,0x00,0x25,0x26,0x00,0x00,0xd0,0xec,0xff,0xff,0xea,0x15,0x00,0x00,0x01,0x1a,0x00,0x00,0xa2,0x01,0x00,0x00,0xde,0xe7,0xff,0xff,0x91,0xe7,0xff,0xff,0x4a,0x21,0x00,0x00,0xf1,0x25,0x00,0x00,0xbb,0x07,0x00,0x00,0x1e,0x04,0x00,0x00,0x2f,0xe6,0xff,0xff,0x31,0x08,0x00,0x00,0xa6,0x1e,0x00,0x00,0x62,0x1a,0x00,0x00,0xc0,0x17,0x00,0x00,0xa5,0x4d,0x00,0x00,0x6a,0xe4,0xff,0xff,0x4c,0xf2,0xff,0xff,0xad,0x01,0x00,0x00,0x94,0x22,0x00,0x00,0x32,0xe5,0xff,0xff,0xd7,0x3f,0x00,0x00,0x80,0xed,0xff,0xff,0x4f,0x15,0x00,0x00,0x08,0xec,0xff,0xff,0xc1,0xe8,0xff,0xff,0x7d,0xd4,0xff,0xff,0x6e,0xe7,0xff,0xff,0x51,0xd9,0xff,0xff,0x65,0x2b,0x00,0x00,0xc3,0x13,0x00,0x00,0x3e,0xd4,0xff,0xff,0x40,0x3e,0x00,0x00,0xd7,0xe5,0xff,0xff,0x25,0x53,0x00,0x00,0xb2,0xef,0xff,0xff,0x57,0x1f,0x00,0x00,0x0e,0xf3,0xff,0xff,0x71,0x0a,0x00,0x00,0x0e,0xfc,0xff,0xff,0x43,0x00,0x00,0x00,0x60,0x11,0x00,0x00,0x95,0x09,0x00,0x00,0xf8,0x3a,0x00,0x00,0x6b,0x16,0x00,0x00,0xe2,0xf2,0xff,0xff,0x0b,0xf8,0xff,0xff,0x5c,0xf6,0xff,0xff,0xd7,0x09,0x00,0x00,0x94,0x26,0x00,0x00,0xaa,0x27,0x00,0x00,0x40,0x0d,0x00,0x00,0xd7,0xf3,0xff,0xff,0xa1,0x1a,0x00,0x00,0x97,0xfa,0xff,0xff,0xce,0xe1,0xff,0xff,0x5e,0x1c,0x00,0x00,0x36,0x13,0x00,0x00,0xa1,0x37,0x00,0x00,0xfe,0x32,0x00,0x00,0x9a,0x26,0x00,0x00,0x12,0xf1,0xff,0xff,0x4a,0x5a,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x0c,0xb1,0x0a,0x7f,0x0c,0xfe,0xf6,0xff,0x9a,0xd5,0xc9,0x00,0xf8,0xbc,0xe4,0xe0,0x21,0x28,0x06,0xed,0x30,0x1e,0xca,0xcf,0x0f,0x05,0xdb,0xe9,0xea,0xd4,0x0d,0xb5,0x30,0xdd,0xe8,0x4b,0xa3,0xdc,0x1c,0x2b,0xf0,0x3b,0xcf,0x1f,0xda,0x12,0xfd,0xfb,0xd0,0x20,0xcb,0xb3,0x12,0x36,0xd7,0x35,0xde,0x03,0x70,0x03,0x39,0x05,0xe8,0xce,0x30,0xf3,0x3b,0xfd,0x35,0x0b,0x36,0xaa,0xff,0xc6,0x1a,0xfd,0x18,0x01,0xc1,0x2b,0xc1,0xfe,0x0e,0xef,0x13,0xd4,0x04,0x17,0xde,0xd9,0x01,0xfb,0xd7,0xf8,0xff,0x0a,0xf9,0xf8,0x0b,0x23,0xc1,0x34,0x52,0xd7,0x2b,0x8f,0xe4,0x39,0x37,0x39,0xf5,0xe4,0x14,0xed,0xe2,0x20,0xf8,0x0f,0x02,0xba,0x11,0x24,0xf7,0x00,0xc2,0xf2,0xe7,0xf5,0xb3,0xfa,0xfa,0xad,0x42,0x3c,0x0d,0x02,0x20,0x9f,0x21,0xb0,0xfc,0x22,0xf8,0x29,0xf9,0x32,0x1c,0xf7,0xbc,0xff,0xee,0xa8,0xfd,0x31,0x07,0x2b,0x84,0x03,0xf6,0x2e,0xcc,0xd9,0x1e,0x02,0x0b,0x10,0x97,0x49,0xcf,0xcd,0xd1,0x38,0xc5,0xe6,0xed,0xb0,0x2d,0xdb,0x2b,0xfa,0xf8,0xf0,0xf5,0xf5,0x04,0x44,0x4f,0xf1,0x44,0x44,0xd0,0x0f,0x30,0x27,0xaa,0x22,0x89,0x00,0xe5,0x0f,0xcb,0x05,0xef,0x9e,0xe9,0xe5,0xbd,0xe5,0xd5,0xe5,0xd4,0xd1,0xff,0xa6,0xd8,0x3a,0xfb,0x08,0x09,0xe9,0xde,0x27,0x54,0xf2,0xe4,0x73,0xe8,0x0a,0xfe,0x1c,0x61,0x32,0x22,0x16,0xfe,0xaf,0x43,0xcc,0x1f,0x26,0x21,0x50,0x00,0x7f,0x05,0xf0,0xf0,0xf1,0xad,0x20,0xfa,0xe3,0x40,0xdc,0xfc,0x97,0xef,0xc5,0x07,0x1f,0xaf,0xe6,0xf5,0x13,0xf6,0x08,0x1e,0xfe,0xc4,0xc7,0x28,0xde,0xf1,0x11,0xcb,0x0c,0x23,0x1b,0x15,0x05,0xe2,0x00,0x1e,0xfd,0x19,0xfc,0x53,0xe5,0xfe,0xb7,0xab,0x21,0x0a,0x46,0x07,0xcb,0x3a,0x1a,0x51,0xfb,0x01,0xcd,0xe6,0xf7,0xfc,0xc3,0x35,0xcb,0xf7,0xd7,0x21,0xe0,0xfc,0xea,0x25,0x9c,0x24,0xec,0xfc,0x4e,0x1a,0x21,0x28,0xb1,0xfd,0xda,0xde,0x81,0xf7,0xc8,0xe9,0xaa,0x1e,0xd5,0x4d,0xf5,0x36,0x05,0x13,0x03,0x29,0xfe,0x09,0x00,0x05,0xf0,0xfc,0xeb,0xe2,0xb9,0x27,0x19,0xd5,0xca,0xf9,0xf8,0x03,0xee,0x1c,0xd9,0xf5,0xca,0xf0,0xe0,0xfa,0xdb,0x3d,0x1f,0x2b,0x34,0xf9,0xe6,0xd7,0xdc,0xd3,0xfd,0xe9,0xf2,0xdd,0x22,0xcc,0x2d,0xff,0xd5,0xec,0xda,0x46,0xb9,0x5d,0x32,0xda,0xfe,0xc0,0xe1,0x28,0x28,0x0c,0x39,0xec,0x39,0xf7,0x25,0xf2,0x0d,0xf4,0xcf,0x22,0xfa,0x26,0x11,0x00,0xb6,0x81,0x1e,0x11,0xc1,0xd6,0x14,0x1f,0x12,0x4f,0xd0,0xc7,0xef,0xf2,0xd6,0xf6,0xed,0x1b,0xfd,0xda,0xf3,0x26,0x08,0xd4,0x18,0x2c,0xc7,0xf8,0x15,0xbd,0xf6,0x24,0x29,0x0f,0xa5,0x1e,0xcd,0xd9,0xf5,0xa7,0xea,0x02,0xd3,0x82,0xf0,0xfc,0xdf,0xbd,0x45,0x18,0x70,0x99,0x21,0x08,0xc1,0x1e,0xef,0xee,0xe7,0x13,0xbf,0xcd,0xe1,0x30,0xe7,0xcf,0xf3,0x0e,0x58,0xed,0xd2,0xf3,0x10,0xf1,0x07,0xe1,0x06,0xe5,0xf8,0xda,0x2c,0x05,0x03,0xc2,0xea,0xfd,0xc3,0xf4,0xe5,0x5c,0xf1,0x06,0xcc,0x59,0xd7,0x33,0xda,0x58,0xee,0xf6,0xdf,0x23,0xc3,0xde,0xaf,0xf4,0x38,0x2b,0x08,0x43,0xd8,0x0d,0x55,0x22,0x67,0x5b,0x54,0xd2,0xf9,0x6b,0xdf,0x18,0x01,0x0b,0x1f,0x5f,0x01,0xfc,0x18,0x2e,0x15,0x73,0xea,0xec,0x10,0xa3,0x9f,0x19,0xe8,0xfe,0x81,0xff,0xfd,0x2c,0xc1,0xd7,0xc6,0xf9,0x47,0xfa,0x3f,0x03,0xd4,0x11,0x2c,0xbe,0xd9,0xa0,0x1c,0x12,0xfc,0x07,0x03,0x0e,0xea,0x4a,0xe4,0xb9,0xab,0xf6,0xf9,0x1c,0xfe,0x08,0xe7,0xe6,0xe5,0xce,0x22,0xe3,0x9a,0xd8,0xf6,0x25,0xbb,0x95,0x5c,0x09,0xd1,0xe1,0x10,0xf4,0xe0,0xca,0x10,0x19,0xb4,0xfe,0x34,0x3a,0xc7,0x0e,0xc1,0xa2,0x7a,0xdd,0xef,0x39,0xfc,0x13,0xdf,0xad,0xea,0xeb,0xd7,0x45,0x1d,0xd9,0x13,0x6b,0x33,0xb3,0x33,0xcb,0xdb,0x94,0x0a,0x64,0xf7,0xee,0x0b,0x04,0xdb,0x55,0x37,0x2a,0x66,0xeb,0xb6,0x13,0xf2,0xdb,0x2d,0xe9,0x29,0xff,0xe9,0x10,0xe5,0xc1,0xf7,0xb3,0x4b,0xdc,0x24,0x10,0xe2,0xcc,0xc5,0xd2,0xc2,0xd2,0x37,0xe9,0xb5,0x4a,0x0e,0x46,0xda,0x35,0xca,0x40,0xf4,0xcf,0xcb,0x05,0xe1,0xa6,0x1c,0xce,0x89,0xc6,0x4c,0xe6,0x32,0x85,0x0c,0xaa,0x16,0xe6,0xef,0x2d,0xf2,0x05,0xb6,0x5e,0x2a,0x39,0x24,0x96,0x4c,0xbd,0xc8,0xea,0x22,0xb9,0x01,0x2a,0x27,0x12,0xe8,0xf3,0xaa,0x5e,0x24,0x26,0x01,0xe2,0xf5,0x61,0x31,0x9e,0xc4,0x4c,0xb4,0x0f,0xbf,0xd8,0xf2,0xe4,0x10,0x12,0xa1,0x48,0xdd,0xec,0x3b,0xc0,0x9f,0x4a,0xb4,0xf0,0x6c,0x4b,0xae,0x12,0x2b,0xdc,0x02,0x8a,0x6f,0x08,0xb1,0x81,0xb7,0x23,0x42,0xfc,0x4b,0xda,0x64,0xe5,0xff,0xc3,0x32,0x63,0xc0,0xdf,0xb6,0x3d,0xfc,0xfa,0xec,0xea,0x4d,0x28,0xe4,0xdc,0x47,0xcb,0xf6,0xb9,0xfc,0x06,0x2d,0xb2,0xc0,0xdb,0x40,0xcb,0x2d,0x15,0xfb,0xf9,0xfd,0x39,0x19,0x19,0x1c,0xc5,0x05,0x03,0xc1,0x49,0xe4,0x05,0x40,0x2f,0xb8,0x34,0x81,0xf8,0xe6,0xa2,0xbb,0xf4,0xed,0x5d,0x0b,0x1b,0x10,0x1a,0xfa,0x5b,0x01,0xfc,0xf2,0xd6,0xdb,0x37,0x0d,0x4e,0x32,0x36,0xe1,0x2a,0x2a,0x37,0x3e,0xd8,0x1e,0x53,0xe8,0x79,0x1d,0x23,0x15,0x0e,0x42,0x40,0xed,0xca,0x2c,0x03,0xe0,0xbd,0xda,0x33,0xfd,0x46,0x25,0xfd,0x78,0xd0,0xc4,0x29,0xc6,0xe7,0xd8,0x4c,0xd4,0xf7,0x28,0x62,0xcc,0xef,0x0d,0x4f,0xf1,0x12,0xdb,0x12,0xc9,0xc8,0xe8,0xbe,0x7b,0xf3,0xc0,0xe4,0x16,0x16,0x3c,0xd7,0xe9,0x01,0xf5,0x2a,0x19,0x41,0x9a,0x8e,0xc5,0xd8,0xec,0xe4,0x1f,0xff,0xdb,0xf7,0xbd,0x17,0xfa,0xda,0x01,0x06,0x48,0xf6,0x2e,0xcc,0xc9,0xbd,0xf5,0xdf,0x55,0xf7,0x12,0xcf,0xd4,0x78,0xb3,0x11,0x43,0x37,0x68,0x47,0xc6,0xf4,0x1e,0x4d,0xc6,0x3c,0xb9,0xb8,0x21,0x31,0x02,0x25,0xe9,0x18,0xec,0x02,0x81,0x09,0xf6,0xec,0x04,0xff,0xed,0x26,0xa4,0x4f,0x9f,0xba,0x0d,0x4d,0x42,0x3f,0x3a,0x28,0x02,0x48,0x59,0xdb,0xdb,0xf1,0xe7,0x3f,0x41,0xaf,0xba,0x32,0x8c,0xcb,0x2e,0x23,0xca,0x20,0x05,0x53,0x00,0x03,0xc2,0x15,0x1f,0xa6,0xaf,0x21,0xe1,0xc0,0xb0,0xc8,0xde,0xa9,0x43,0xd7,0x33,0x03,0x1f,0x43,0xb1,0x09,0x9e,0x0c,0x14,0x0d,0xbc,0x36,0x10,0x0d,0x13,0xc6,0xe3,0x4f,0x1d,0xd1,0xc8,0xca,0x08,0xee,0xb1,0x07,0x23,0xe7,0x04,0x0d,0x04,0x1a,0x15,0x00,0x3f,0x06,0xf4,0xc9,0xde,0x08,0xd3,0x74,0x10,0x1d,0x2f,0x27,0xa3,0xf4,0xc4,0xff,0xe8,0x02,0x1f,0x0e,0xe7,0xfd,0x23,0x08,0xd9,0xe5,0xb8,0xba,0xf4,0x3e,0xca,0xe9,0xc6,0xe7,0xaf,0x15,0x20,0xed,0x7b,0xd8,0x02,0x06,0xf3,0xa2,0x39,0xf3,0x81,0xeb,0xce,0xef,0xf8,0x22,0x25,0xf5,0xde,0x12,0xf1,0x14,0x47,0xe0,0xf0,0xf6,0xfe,0xba,0xec,0xea,0xe6,0x2e,0x0f,0x10,0x1a,0x58,0xef,0xf9,0x0e,0x0c,0xc2,0xe2,0xd3,0xee,0xfc,0x12,0x1c,0x3d,0xdf,0xd9,0x35,0x1a,0xe6,0x0b,0x21,0xc6,0x0a,0x07,0xeb,0xc5,0xe2,0x33,0xef,0x0b,0xed,0x1b,0x23,0x03,0x1e,0xdb,0x10,0xde,0xc2,0x7f,0x2d,0xe8,0xa9,0x15,0x03,0xe2,0xd0,0x41,0x5c,0x1d,0xdf,0xff,0x0e,0xea,0xe1,0xc6,0xef,0x15,0x09,0x1a,0x21,0x14,0xec,0xfa,0xe9,0xe8,0x1c,0x75,0x1b,0xb6,0x2c,0x11,0x25,0xfd,0x37,0x12,0xc5,0xcd,0x1f,0x1d,0x24,0xd9,0x25,0x1c,0xb0,0xfb,0x03,0xca,0x13,0x13,0x22,0x09,0x08,0x33,0x13,0xfe,0xd7,0x4a,0xfc,0xcc,0xfa,0x04,0xee,0xe8,0xbb,0xc7,0xfa,0xdf,0x13,0xd8,0xed,0x20,0x1b,0xbc,0x09,0xf3,0x1c,0x05,0x3c,0x55,0xef,0x24,0x1a,0x18,0x65,0xe0,0x31,0xcb,0x21,0x41,0x0a,0x18,0xf9,0xed,0xf0,0x20,0xee,0x01,0x28,0xe0,0xc6,0xc7,0xc2,0xf6,0xee,0x07,0x40,0xe7,0xf7,0xfc,0x2a,0xf3,0x15,0x53,0x0e,0x09,0xd9,0x18,0xcf,0x02,0x0f,0x21,0xfe,0xfe,0x04,0xf1,0xc4,0x47,0xd7,0x1f,0xf9,0xfd,0x08,0x41,0xf5,0xe7,0xed,0x1b,0x03,0xc8,0xe0,0xf6,0xf5,0x05,0x23,0x03,0x33,0x2a,0x11,0x2b,0xfe,0x23,0x03,0xf9,0x08,0x20,0xc7,0xfd,0xeb,0xf9,0xf4,0x0b,0x0a,0xfa,0xcb,0x33,0x08,0xf1,0x26,0xdf,0xf8,0x09,0xbc,0x03,0x13,0x4e,0xfc,0x1e,0xf0,0x29,0x0e,0x16,0x31,0x1b,0xfb,0x0b,0x06,0xed,0xcf,0xf3,0xc5,0x16,0x05,0x05,0xec,0xfd,0x1c,0x37,0xd2,0xe2,0x1b,0x03,0x24,0xfa,0x3f,0x1e,0xf9,0xe2,0x1f,0x05,0xcc,0x02,0x7f,0xff,0xfe,0x09,0x4f,0x23,0x00,0x18,0x0a,0x01,0x42,0x05,0xea,0xd1,0xdc,0xfb,0x16,0x3f,0x23,0x00,0xe6,0xf7,0x0a,0x1e,0xdd,0x02,0x18,0xf9,0x14,0xdd,0xf2,0x31,0x19,0xfd,0x2e,0xf7,0xf4,0xe7,0x24,0x9e,0xd1,0x05,0x5c,0xde,0xb1,0x1a,0xe0,0x32,0xb6,0x05,0x0b,0x14,0x46,0xde,0x3a,0xe4,0xfa,0x14,0xe2,0xe2,0xdc,0x32,0x02,0xd1,0x21,0xfd,0x14,0x22,0x13,0x02,0xfd,0x08,0x9a,0x02,0xd1,0x4b,0xf3,0xe4,0x13,0xc1,0xcb,0x09,0x02,0xec,0xbb,0x17,0x25,0x81,0x48,0x27,0xea,0xcd,0x0e,0x18,0xdc,0x17,0x04,0x15,0x38,0x04,0xeb,0xd3,0xe2,0xf6,0xac,0xe8,0xbf,0xb9,0x3f,0xed,0xe4,0xee,0x2c,0x13,0x11,0xee,0xba,0x0f,0x14,0x07,0xc1,0x0f,0xde,0xea,0xe4,0x57,0xfb,0x00,0x27,0x3d,0x31,0x1e,0x3d,0xf0,0x0e,0x0b,0x15,0xdc,0xcc,0xd5,0x27,0x6f,0xf7,0xe6,0xfb,0x32,0x56,0xf8,0xe0,0xcc,0x48,0x06,0x1e,0xfb,0x08,0xf9,0xff,0x1e,0x03,0x1b,0x17,0xa0,0x6a,0xc6,0x63,0x0d,0x62,0xd6,0xd1,0xc9,0xea,0x35,0x41,0xe8,0x0c,0x12,0x32,0xe1,0xe1,0x12,0x70,0xff,0x05,0x35,0x19,0xf1,0xf3,0x07,0xec,0x0e,0xd5,0xe6,0xed,0x6d,0xd5,0xf9,0x32,0xea,0x30,0xb9,0xe5,0x3d,0xe2,0xe3,0xfb,0xd2,0x05,0x23,0xcc,0x9c,0xa5,0xc5,0xe9,0x03,0x1d,0x52,0xe0,0x09,0x0b,0xe4,0xeb,0xd5,0xba,0x12,0x1d,0xdd,0x19,0x25,0xbb,0xba,0x2b,0x4c,0xf8,0xbe,0xe3,0xf3,0x32,0xff,0xb0,0x31,0x0c,0x21,0x0f,0x0e,0x3b,0x0d,0xc1,0x0a,0xc9,0x15,0x91,0x17,0xd4,0x19,0x99,0xea,0xb4,0xdb,0x3c,0x10,0xef,0xaa,0x04,0xf8,0xfe,0x04,0xd3,0xf4,0x36,0xf9,0x7f,0xc4,0xf0,0x29,0xd9,0x0d,0x00,0xc1,0x31,0xf3,0xee,0x23,0x27,0x37,0xe6,0xd1,0xcf,0xe0,0xfb,0xc8,0x2a,0x36,0x17,0xd0,0xcf,0xfa,0xe1,0x34,0x0d,0x1a,0x01,0x2a,0xe4,0xf2,0xf8,0x10,0x49,0xd8,0xff,0x18,0xea,0x2c,0xf4,0xb5,0x37,0x00,0x14,0x13,0xed,0xfe,0xd4,0x9f,0xf6,0xf3,0xd5,0xbc,0x0f,0xe8,0xb5,0x1e,0x1a,0x48,0x10,0x27,0xc7,0xf0,0x26,0xea,0x40,0xf8,0x0c,0x53,0x00,0xdf,0x28,0xdf,0xf3,0xbc,0x19,0xf5,0x1d,0x98,0x33,0xfa,0xeb,0x1c,0xeb,0xbb,0x03,0xf7,0x45,0x11,0x27,0x08,0xfd,0x06,0x0b,0xe3,0xd9,0xf1,0xb0,0xff,0xe5,0xf0,0xed,0x08,0x29,0xc5,0x05,0xf1,0xd5,0x1a,0xd7,0xc8,0xcb,0x7f,0x81,0xea,0xe3,0xef,0xb9,0xef,0x1a,0x10,0xe0,0x2c,0xd0,0x34,0x4d,0xf2,0x08,0x25,0xff,0xb5,0x0d,0xfe,0xd8,0x13,0x50,0x2f,0x2c,0xee,0x68,0xdd,0x3c,0x03,0xf1,0xf5,0x3b,0xe9,0xc4,0xf4,0x33,0x06,0xe1,0xfd,0x21,0xb7,0xf7,0x15,0xf9,0xc0,0xf9,0xd2,0x1a,0xfb,0xbe,0xd5,0x37,0x20,0x02,0xe4,0x2b,0xef,0xe6,0xec,0xad,0xc2,0xf6,0xe7,0x08,0x15,0xe3,0x5f,0xdc,0xff,0xaa,0xfa,0x02,0x1c,0xf8,0xf9,0x12,0x1a,0x42,0xc0,0x00,0x34,0x02,0x02,0x27,0x3c,0xeb,0x11,0x59,0xd4,0xea,0x33,0x1e,0xb7,0x07,0x32,0x01,0xf5,0x28,0x7f,0x09,0x0b,0xde,0xe8,0x46,0x54,0xa0,0xff,0x08,0x15,0x19,0x02,0x12,0xa5,0xd4,0x05,0xbe,0x1f,0x2d,0xae,0xd4,0x2c,0x29,0xe9,0xe3,0x18,0x9e,0x49,0x4a,0xe8,0xe5,0xbc,0x84,0xbe,0x47,0x3f,0xb9,0x25,0xc5,0xbe,0x19,0xeb,0x36,0xf3,0xe2,0x0f,0x10,0x32,0xe9,0x04,0x1a,0xe9,0xe2,0xc2,0xf7,0x22,0x02,0xff,0xfa,0xff,0xcb,0x0b,0xcd,0x08,0xd2,0xf2,0x17,0xf4,0x30,0x30,0x29,0xdd,0xc0,0xfa,0xed,0x04,0xff,0xfd,0x2c,0x02,0xc6,0x09,0x01,0x03,0x3b,0x00,0x0e,0x01,0xe1,0xd8,0x0d,0x2c,0x02,0x0c,0xe4,0xf6,0x2e,0x39,0xe1,0xc3,0x33,0xfa,0xe0,0xd7,0x17,0x00,0x10,0x29,0x2c,0xec,0x43,0xfe,0xc6,0x19,0xe1,0x18,0x51,0xec,0x0e,0x3b,0xda,0xf1,0xb5,0xd7,0xfc,0xb1,0xe7,0x4d,0xcb,0xf8,0xe1,0xb9,0xec,0x09,0xb4,0xd5,0x53,0x23,0xc5,0x2d,0x1b,0xaf,0xd8,0xc8,0xf3,0x14,0x50,0x03,0xf9,0x2d,0x1c,0xe0,0x0a,0xda,0xd7,0xf4,0x29,0x37,0x26,0xec,0xc4,0x07,0x17,0x58,0xef,0x2f,0xfc,0x17,0x23,0xe4,0x55,0x39,0x0c,0x32,0x0d,0xc1,0x0c,0x4a,0x12,0x02,0xf7,0x12,0x25,0x03,0xfa,0x7f,0x21,0x03,0xd2,0x49,0x29,0x07,0xa4,0x24,0x11,0xfb,0xd2,0x01,0x02,0xf7,0x04,0x12,0xe0,0x03,0x14,0x40,0x11,0xea,0x15,0x03,0x43,0xe1,0x23,0xed,0xdb,0xe1,0xe8,0xe9,0x00,0x3e,0xd3,0x6b,0xdc,0xe1,0x05,0x0a,0xe5,0xe8,0xda,0xf4,0xcb,0x00,0x7f,0x45,0xfc,0x37,0x36,0xcd,0x05,0x09,0xc8,0x33,0x56,0x02,0xd9,0xda,0xfe,0x04,0xeb,0x07,0xd4,0xdf,0xd0,0x07,0xe4,0xf7,0x10,0x38,0x14,0xd6,0x1b,0x44,0x22,0xdf,0xef,0x19,0xde,0xf2,0xdb,0x04,0x19,0xd4,0x35,0xf9,0xd6,0xba,0x02,0xe8,0xcc,0xec,0x35,0x0f,0x2e,0xf1,0xf5,0xef,0xdc,0x0b,0xcb,0xe3,0x16,0x05,0xce,0xff,0x07,0xae,0x45,0xe9,0x1e,0x0d,0xc5,0x33,0x27,0xd4,0x21,0x2c,0x05,0xed,0xdd,0xe6,0xf4,0x29,0xc4,0xf0,0xc7,0xca,0x21,0x68,0xf9,0x09,0x01,0xc4,0xf8,0xf5,0x9a,0x22,0x0b,0x2c,0xf1,0x18,0xfa,0x37,0x0b,0x03,0x28,0xcf,0x05,0x20,0x15,0xe8,0x42,0xe7,0xe0,0x02,0x98,0xa1,0x50,0x1b,0x16,0x5a,0x22,0xb6,0x2c,0x61,0xea,0xce,0x96,0x45,0xfd,0xd2,0xfe,0xff,0xbd,0xee,0x54,0xff,0xf6,0x17,0x20,0xf5,0x31,0x22,0xe8,0xbd,0xfa,0xfc,0xb5,0xe1,0xad,0x07,0xe0,0xf2,0xf4,0x1b,0xb0,0x22,0xfd,0x11,0x35,0x38,0xb8,0xb9,0xcf,0x03,0x2d,0x10,0xd8,0x16,0xb7,0x04,0x2a,0x4f,0x06,0x03,0x1c,0x5f,0xfc,0x11,0x23,0xe0,0xe9,0x33,0x73,0x2f,0x40,0x31,0xbe,0x10,0xd8,0xd4,0x1e,0xea,0xd5,0xf4,0x0e,0x3c,0x5d,0xcb,0xd1,0xef,0x92,0xf6,0x2c,0xdc,0x03,0x1c,0xfa,0x7f,0xdd,0xd9,0xc0,0xea,0xe6,0xf4,0xea,0xf9,0xd4,0x01,0xde,0xc4,0xfc,0x01,0x07,0xd7,0xd3,0xef,0xe5,0x1b,0x2f,0x29,0x2a,0xdb,0x3d,0x1a,0xc2,0xf7,0xf2,0x12,0xe2,0x30,0x3f,0x21,0x0d,0xda,0xfa,0x0a,0x55,0xdd,0xfa,0x1f,0xd0,0xfd,0xc3,0xfd,0x35,0xfb,0x2b,0xeb,0xe3,0xf9,0x42,0xed,0x1a,0x12,0x3a,0x19,0xa6,0x4e,0x27,0x13,0x1e,0xe4,0xf8,0x66,0x57,0x70,0x93,0x8a,0xeb,0x03,0xb7,0xfd,0x64,0x1b,0xde,0xfd,0x20,0xd2,0x49,0xc8,0x27,0x12,0x05,0x24,0x21,0x15,0x0e,0x0a,0x1a,0xfb,0x68,0xcb,0xd1,0x0d,0xf3,0xf7,0x7f,0x71,0xc7,0x0b,0xd7,0x35,0xfd,0xd0,0xcb,0x1d,0x19,0xdc,0x1c,0x35,0xe0,0xcd,0xfb,0x13,0x43,0x32,0x4a,0xfa,0x21,0xf8,0x07,0x4e,0x1a,0xf8,0xe7,0xbf,0x06,0xec,0xeb,0x29,0x21,0xd4,0x38,0x1e,0xd7,0x0a,0x81,0xe0,0x00,0x12,0xf7,0x6b,0xd5,0xf9,0x0e,0xee,0x09,0x08,0x12,0xee,0x3d,0x39,0x0b,0xe7,0x12,0x18,0x34,0x19,0x08,0x0b,0xfb,0x33,0xe2,0x39,0x2f,0x01,0xda,0xfc,0xde,0x0a,0xfe,0x1e,0xf9,0xeb,0x2f,0xbc,0xed,0xf3,0xc1,0x05,0x2c,0xea,0xf2,0xfb,0xe0,0xf5,0xf2,0x11,0x22,0xd4,0x67,0x02,0x1e,0x14,0xdc,0x1b,0xf4,0xc2,0xf5,0xcf,0x04,0x44,0x36,0xe7,0xdd,0xc4,0xde,0x10,0xe1,0xf6,0x20,0x2f,0x17,0x11,0xfe,0xfc,0x03,0xd9,0x5b,0x16,0xff,0xdc,0xf6,0xfb,0xdc,0xda,0x0e,0x15,0x14,0xfc,0x3b,0xe3,0xc8,0x6f,0x22,0x9d,0xf3,0xf7,0x28,0x44,0x0b,0x19,0x21,0xf7,0xfe,0x0f,0xe0,0x36,0xd3,0x32,0xe4,0xdf,0x32,0x31,0x07,0xdf,0xd3,0xe1,0x48,0xe6,0xde,0x08,0xda,0xd9,0xf2,0x1c,0x06,0xbe,0xfc,0x19,0xd7,0xe8,0x03,0xf2,0x04,0x2a,0x06,0x1d,0x0b,0x1a,0x21,0x20,0x47,0xfe,0x32,0xc4,0x17,0x13,0x03,0x26,0xc3,0xd6,0xff,0xe2,0x81,0x2b,0xe9,0xfc,0x01,0xf0,0x37,0x11,0x16,0xb9,0x01,0xf5,0x0c,0xdf,0x07,0xd6,0xe8,0x3d,0xf2,0xeb,0xd5,0x09,0xfa,0xc6,0xf0,0xe5,0xfa,0x24,0x0e,0xef,0xdc,0x07,0xfb,0x64,0x54,0xd4,0xf0,0x26,0x5d,0xd0,0xd8,0xe5,0xe7,0x2b,0xe9,0x13,0x1d,0x69,0x4c,0x2f,0x68,0x18,0xd4,0x62,0x31,0x33,0x3e,0xf1,0x42,0x25,0x90,0xd6,0x6b,0xdf,0xef,0xc4,0x0d,0x05,0x04,0x32,0x20,0x17,0x13,0x0f,0xcb,0x09,0x04,0x18,0x1f,0x21,0x51,0xe9,0xdf,0x18,0xa4,0x30,0xfd,0xba,0xb9,0xca,0x5f,0xe7,0xd9,0xc7,0x94,0x30,0x23,0xfb,0x1d,0xd8,0xf7,0xf3,0xb1,0x3e,0xfa,0xf9,0xcb,0x09,0x33,0x34,0xe3,0xf3,0x27,0xf6,0xf5,0xf7,0xd2,0xfa,0xe4,0xdf,0xd7,0x42,0xca,0x11,0x11,0x2e,0x3c,0x12,0x3f,0xcf,0x0e,0xf4,0xd5,0x23,0xf1,0x2c,0x1b,0x14,0xdb,0xf7,0xfe,0xec,0x00,0xc4,0xe4,0x01,0x04,0x1d,0xe9,0x2c,0xde,0x1e,0x28,0xe0,0xe9,0x06,0xf4,0x34,0xf3,0xf5,0xdf,0xb1,0x0d,0x20,0xd5,0x21,0xf3,0x31,0x57,0xfd,0x09,0x17,0x2a,0x21,0xe3,0xf2,0xf8,0x0d,0xcc,0x0d,0x45,0x05,0x05,0x13,0x05,0x25,0x06,0xe5,0x0d,0xd4,0xe7,0x1e,0x2c,0x1f,0x24,0x1f,0xe5,0x0f,0x19,0xe5,0xfd,0x0b,0xd8,0x20,0xd8,0x0a,0x30,0x32,0xde,0x02,0xc0,0xee,0xf5,0x32,0x12,0x7f,0x0d,0x0a,0xc0,0x01,0x05,0xfb,0x05,0x13,0xf9,0xf9,0x72,0x09,0x3e,0x1f,0xf8,0x40,0x28,0x3c,0x1a,0x26,0xde,0xf6,0xc6,0x27,0x28,0xc7,0x28,0x31,0x0b,0x28,0x21,0xe5,0xd0,0x08,0x1e,0x69,0x42,0xf0,0x0b,0x21,0x2f,0xe3,0xf0,0x17,0xd7,0xdb,0xc8,0x02,0x3b,0x4b,0xe5,0xe5,0xe9,0xfc,0x0d,0x0c,0xf1,0xf1,0xd3,0xe5,0xc5,0x3b,0xd8,0x3d,0xfc,0x0f,0x03,0xfa,0x1f,0xf4,0x1a,0x09,0x24,0xf4,0xad,0xeb,0x23,0x6a,0xee,0x59,0x69,0x1d,0xf9,0x3d,0xe3,0x11,0x64,0x4b,0x15,0x1e,0x7f,0x3e,0x14,0x05,0xfc,0x0a,0x0b,0x70,0xf3,0x0f,0x29,0x35,0xec,0x1a,0x5b,0x26,0x20,0x33,0xb8,0x32,0x05,0xf6,0xd2,0xfc,0xcc,0x22,0x89,0x01,0x43,0x0b,0x04,0x41,0x3e,0xf6,0x00,0xea,0x15,0x2a,0xf1,0xf4,0xa8,0x24,0xf1,0xe0,0x21,0xae,0xd7,0xf1,0xe6,0x7f,0x51,0xc4,0x46,0x00,0x27,0x41,0xb9,0xf4,0x20,0xfb,0xdf,0xdc,0x16,0xfa,0xb7,0xf1,0x0c,0x0d,0xe2,0x02,0xe4,0xf8,0x5c,0xfd,0x0b,0x25,0xcb,0xb4,0xed,0xd8,0x98,0x4e,0xf2,0xd1,0x00,0x32,0xd2,0x45,0x1d,0xff,0x9c,0xec,0x65,0x26,0x28,0x16,0x32,0x29,0x2d,0x11,0x2c,0xce,0xef,0x11,0xfe,0xc9,0x1e,0xec,0x58,0xfd,0x2f,0xe8,0xbf,0x38,0x4c,0x1d,0x18,0xde,0xb2,0xd6,0xa0,0xe8,0x2c,0xf1,0x2f,0xe4,0xab,0x61,0x0f,0x36,0xc4,0xc3,0x09,0x0d,0xd6,0xbb,0x03,0xfa,0xfd,0x27,0xcf,0xc1,0x53,0xdf,0x3e,0x02,0x1d,0x1e,0xf5,0x39,0x0e,0x79,0x09,0x13,0xe6,0x47,0xd5,0xe8,0x31,0x5f,0x03,0x1b,0x1a,0x3e,0x04,0xfa,0xf6,0x41,0x12,0xef,0x5a,0x47,0x16,0xed,0xfc,0x18,0x11,0x1d,0xdc,0xd5,0xfd,0xaa,0xc3,0xeb,0x3f,0xe0,0xcf,0xf9,0x41,0xac,0x13,0x1c,0x02,0x24,0x1a,0xfe,0x81,0x3b,0x1a,0x1a,0x2a,0xd4,0x20,0xdf,0xc7,0x37,0xa8,0xe6,0xa4,0xdc,0xb3,0x17,0xe6,0x23,0xd7,0x03,0xdb,0xdd,0x16,0x14,0xf0,0xf1,0x11,0xff,0x4b,0x66,0xf4,0x09,0xe8,0x00,0x12,0xe3,0x12,0xae,0x09,0xbb,0x25,0x02,0xd1,0x20,0x17,0x05,0x33,0x5c,0x34,0xc0,0xb0,0xf4,0x0e,0x11,0xd9,0xcd,0x28,0xbf,0xe2,0xfd,0xa8,0x05,0xe5,0x1e,0x0e,0x0b,0x10,0xfd,0x14,0x2c,0xd8,0xbc,0xcd,0x58,0x4d,0xaa,0xc4,0x04,0x30,0xea,0x01,0x46,0xef,0x60,0x3d,0xe8,0x39,0xbb,0x21,0xee,0x31,0x41,0xa8,0xdc,0x27,0xf8,0xe7,0xf5,0x0a,0xf6,0x3b,0xdd,0xe8,0xf8,0xea,0x2f,0xc8,0xdf,0xe9,0x09,0x2a,0x0f,0xff,0x06,0x0d,0xdf,0x01,0xc4,0xf9,0xdc,0x30,0x0b,0xe0,0xcf,0xf8,0x02,0x0c,0xec,0xd6,0x1b,0x19,0xee,0xfe,0x19,0x0b,0x5d,0xd8,0x53,0x2b,0xb0,0x3f,0x11,0xb5,0xb8,0x2f,0xad,0xe5,0xfd,0x2a,0x00,0xd3,0x45,0x0b,0x00,0xba,0xeb,0xd1,0x36,0xea,0x2f,0x08,0x99,0xed,0x7f,0x1a,0x2e,0xff,0x29,0x04,0x0e,0x1b,0x05,0xba,0xd5,0x27,0xaf,0xf9,0x24,0x5b,0xf6,0x7a,0x42,0x12,0xc3,0x5c,0xf6,0x07,0x21,0x0e,0x38,0x15,0x20,0xe0,0xf4,0xe5,0xde,0xe1,0xc2,0xda,0xe0,0xe7,0xde,0xcb,0xf7,0xfe,0xd3,0x02,0x49,0x21,0x02,0x4b,0x9d,0x07,0x44,0x8f,0x16,0x47,0x2b,0xfe,0x17,0x22,0x4a,0xff,0xd6,0xe7,0x8e,0xf7,0x31,0xff,0x24,0x17,0x2c,0xdb,0xfd,0x4c,0xb6,0x40,0xc5,0xe6,0x0f,0x1f,0xc4,0x3c,0xba,0xf9,0x05,0x03,0xee,0x09,0x09,0x11,0xde,0xfb,0xd8,0x06,0xe1,0x30,0x0a,0xf5,0x20,0xc9,0xd5,0x04,0x13,0xe9,0x00,0xef,0xfb,0x12,0x03,0x09,0x2b,0xbe,0xd8,0x02,0x0d,0xf4,0x23,0xc5,0xfd,0x1d,0xe1,0xef,0x27,0xe4,0x11,0xcc,0x30,0x10,0x36,0xe5,0x20,0x1c,0x06,0x26,0x1d,0xfe,0x15,0xd5,0xe4,0xbf,0x18,0xda,0xd6,0x10,0x14,0xda,0xcb,0xeb,0xea,0x15,0xf3,0x08,0x59,0x25,0xf5,0x19,0x2a,0xf8,0xdb,0x00,0x7f,0x0c,0xf1,0xe1,0x26,0x00,0xfc,0xfb,0x05,0xf8,0xae,0x05,0xf2,0xe5,0xfc,0xf2,0xfb,0xfc,0xf7,0xf6,0xe4,0x17,0x31,0xc3,0xf3,0xf7,0xd0,0x69,0xef,0xfc,0xeb,0x1c,0xd0,0xda,0x1b,0x09,0x38,0xc0,0xfc,0xfb,0x03,0xca,0xcf,0x7f,0x0b,0xfb,0xe1,0xd4,0x1d,0xad,0xd7,0xe5,0x0f,0x12,0x33,0x50,0x01,0x00,0x08,0x14,0x30,0x15,0xd2,0xdb,0xcd,0xe7,0x02,0x2b,0xf9,0xfb,0x04,0xf9,0x08,0xc7,0xca,0xf1,0xec,0xd1,0xf0,0xde,0xe5,0x0c,0xff,0xe9,0x24,0xe7,0xfb,0x4b,0xc8,0xeb,0x2c,0x36,0xe1,0x53,0xfb,0xe9,0xf3,0xc7,0x00,0xe2,0xee,0x61,0xea,0x09,0x30,0xea,0xc3,0xec,0x0e,0x57,0xcd,0xde,0x35,0xe4,0xf2,0xcd,0x0a,0x01,0x56,0x37,0xdc,0xf1,0x26,0x0c,0x34,0xd2,0x45,0x11,0x0e,0xef,0xce,0x03,0xc4,0xfd,0x1e,0x0e,0xf8,0x50,0x07,0x38,0xf3,0x00,0x03,0x34,0x12,0xd9,0x2b,0x0a,0xed,0xdc,0x24,0xef,0xcb,0x3b,0x10,0x1a,0xc9,0xdc,0x28,0x13,0x4b,0xd5,0x03,0xdb,0xf3,0x49,0xff,0xb3,0xb3,0xf9,0x0a,0xc4,0xf0,0xf5,0xf1,0x0d,0xda,0x0d,0xec,0x0b,0x0d,0xdb,0xfa,0xcd,0x14,0x0d,0x0b,0xce,0x1b,0x17,0x01,0xf6,0xf1,0x07,0x09,0xe4,0x1e,0xe5,0xee,0x29,0x10,0xda,0x92,0xf1,0x21,0xec,0xe5,0x27,0xfa,0x14,0x08,0xe8,0x03,0xdc,0xfa,0xee,0x18,0xeb,0xfd,0xf0,0xe5,0xf9,0xea,0xf3,0xb4,0xff,0xde,0xff,0xeb,0xf9,0x39,0x03,0x09,0xf0,0x0e,0xe1,0xfd,0x1c,0x13,0xd5,0xff,0xdf,0x10,0x10,0x2f,0xef,0x08,0x81,0xe7,0xd9,0x33,0xe3,0xf9,0x2a,0xda,0xf7,0xd8,0xe1,0xb5,0xfb,0x10,0xfa,0xd9,0xf1,0xe1,0x05,0x0c,0x14,0xf3,0x0f,0x36,0xfe,0xf8,0x26,0x0d,0x05,0x04,0xbd,0x2a,0xd1,0xf7,0xe1,0x08,0xe4,0xde,0xfd,0xd2,0xe8,0xf1,0x0e,0x0d,0x01,0xe1,0xdc,0x45,0xb3,0x98,0xb8,0xe3,0xf7,0x05,0xc8,0x19,0xf3,0x02,0xe4,0xf2,0x13,0xe6,0xf8,0xf2,0x17,0xc4,0xf0,0xe3,0xdc,0x01,0xd0,0xe4,0x3a,0xcc,0xfb,0x04,0x08,0xd7,0xfc,0xd3,0x08,0x22,0xeb,0x3e,0x55,0xa9,0xcd,0xf4,0x16,0x41,0x17,0x1b,0xd4,0xfd,0xfa,0xd4,0x4d,0x23,0x30,0x42,0x62,0x54,0xd9,0xd6,0x35,0xf7,0x26,0x65,0x09,0x20,0xdb,0x7f,0xfa,0xf7,0xf4,0x19,0xab,0xb5,0x17,0xd4,0x04,0xde,0xbd,0xbb,0x0b,0x2e,0xe8,0x06,0x0b,0xf2,0x0e,0x0a,0x07,0x21,0x16,0xe4,0xda,0x69,0xd8,0x1a,0x63,0x1d,0xe9,0xf3,0xf0,0x09,0xdc,0xbf,0xcf,0xc9,0x1e,0x22,0xdf,0x43,0x39,0x20,0x30,0x42,0x20,0xd2,0xc3,0x1a,0x00,0x1d,0xda,0x2b,0x34,0x1d,0x18,0xda,0x2e,0xfe,0xdc,0x03,0xb6,0xee,0x00,0x2e,0xe7,0x12,0xcd,0xf4,0x4d,0x1f,0x19,0x3d,0xc9,0xfc,0x00,0xfd,0xfe,0xf2,0x22,0xca,0x2f,0xe5,0xff,0x01,0xef,0x2f,0xc3,0xf3,0x36,0x19,0x31,0x15,0xc5,0x07,0x0b,0x21,0x2b,0xae,0xe6,0x63,0xe4,0x03,0xf4,0xe4,0xfe,0xd6,0x2b,0xdc,0x10,0xfa,0x08,0x02,0xd3,0xd9,0xc5,0x37,0xe4,0x18,0xa3,0x45,0xee,0xc1,0xf1,0x20,0x03,0xf8,0x27,0xfc,0x37,0x2e,0x1c,0xb2,0xf7,0xf4,0xad,0x04,0xb5,0xf6,0x11,0x1f,0xe2,0x00,0x20,0x03,0x0d,0x07,0xf7,0x2b,0xf6,0x5d,0xc7,0x0e,0x55,0xf0,0xfc,0x86,0x0a,0x4c,0xdb,0xfc,0x33,0xa3,0xff,0x75,0x26,0x03,0xe0,0xc5,0xca,0x1d,0x22,0x1d,0xed,0xe8,0x96,0x7d,0x05,0x3e,0xdb,0x4b,0x38,0xd3,0x7f,0x26,0xfb,0xfa,0xf8,0xcc,0x0a,0x10,0x40,0x66,0x5b,0x27,0x21,0xc0,0x0a,0x1d,0xeb,0x1c,0x1f,0xb9,0xf8,0x1f,0xf2,0xff,0xc9,0x5c,0xd3,0x58,0xda,0x02,0xe6,0xdf,0xe3,0xf8,0x10,0x10,0x37,0xfa,0x02,0x58,0xec,0xdf,0x28,0xb3,0x40,0xf4,0x26,0xd8,0xf6,0xad,0x06,0xe8,0x0e,0xf4,0xa7,0x19,0x26,0xd3,0xe5,0x2c,0x13,0xa8,0xf6,0xbc,0x81,0xda,0xea,0xd7,0xf9,0xf6,0x60,0x53,0x06,0xd8,0xff,0xcc,0xf0,0x0d,0xe3,0xee,0xc0,0xe8,0xf8,0xed,0x1f,0x2a,0x11,0x26,0xbb,0x44,0x07,0x0a,0xd9,0xe8,0xe6,0x10,0xb8,0x19,0x25,0xd6,0xbe,0x3d,0x1d,0xdd,0xe1,0xfd,0xf3,0xee,0x38,0x0a,0xe0,0x0c,0xeb,0x02,0x04,0x00,0x24,0x0a,0xdf,0x29,0x15,0x0b,0xba,0xf6,0x95,0x46,0xc3,0x04,0x63,0x4e,0xb3,0x12,0xd5,0xd5,0x72,0xe1,0xf6,0xf1,0x16,0x40,0xfd,0xf7,0x4e,0x6d,0xfc,0xbf,0xf2,0xfb,0x18,0x15,0xd1,0x00,0x0e,0x00,0xea,0xfa,0xfd,0x77,0x3b,0xe0,0x7f,0xf7,0x01,0xf8,0x14,0xfc,0x93,0xcd,0xcc,0xe0,0xe5,0xdd,0x03,0xec,0xce,0x1e,0xe0,0x1f,0x18,0xf9,0xd1,0xe5,0xf6,0x4c,0xf1,0xcb,0x03,0x3a,0xcf,0xd7,0xe1,0xce,0xc9,0x0d,0x37,0xae,0x0e,0xd4,0x39,0xea,0xe7,0xf2,0xfa,0x11,0xf5,0xeb,0x17,0xf7,0x3b,0x10,0xd2,0x32,0x02,0xee,0xe5,0xb9,0xf7,0xcb,0xfa,0x14,0xf7,0x0a,0xf3,0x34,0x1f,0xf4,0x3c,0xf8,0x0b,0xcd,0xd3,0x18,0x0f,0x21,0x0c,0xd8,0xdf,0x22,0x09,0xfd,0xdb,0x1b,0xe4,0x19,0x1e,0x11,0xff,0x18,0xbe,0xdf,0x26,0x4b,0xe2,0x11,0x69,0xfe,0x3f,0x26,0x68,0xea,0x04,0xae,0xd4,0x05,0xfd,0xf9,0x0e,0x4e,0xde,0x21,0xf0,0x48,0x0f,0x2f,0xc0,0xc3,0x90,0xf6,0x0f,0x1e,0x64,0x03,0xb7,0x41,0x24,0x7f,0x25,0xcd,0xe6,0x10,0xdf,0xb9,0xb9,0xe3,0xd5,0x90,0xc2,0x19,0xd9,0x0f,0xc5,0xe0,0xd6,0x34,0xb5,0xf2,0xf6,0x6b,0x4e,0x0b,0xe1,0xcb,0x33,0xf3,0x4e,0xf5,0xf5,0xc9,0x7b,0xc4,0xb6,0xc4,0x25,0xc0,0x0b,0xc5,0x40,0xbb,0x12,0x1c,0x9e,0xb5,0x40,0x01,0xc3,0x2f,0xfc,0x3a,0x1a,0xc9,0xe0,0xff,0x9d,0x8e,0x3e,0xd9,0x09,0xc1,0xf7,0x12,0xd0,0xe3,0x0d,0xd9,0xbf,0x35,0x21,0xa1,0x8a,0x46,0xb7,0xed,0xee,0xaa,0xbc,0x02,0x13,0x00,0xda,0x51,0x92,0x59,0x64,0xfc,0xce,0xec,0xd2,0x08,0xda,0x22,0xf2,0x0d,0x65,0x14,0x06,0x0c,0x18,0x4d,0x08,0xb8,0xc5,0x3b,0x90,0x57,0xec,0xdf,0x08,0x32,0xf6,0x3a,0x16,0x59,0xd1,0x44,0xd8,0x03,0x12,0x22,0xe6,0xf3,0x1f,0xf2,0x16,0x71,0xe1,0x0b,0xe8,0xeb,0xdc,0xdb,0xd9,0x2e,0x04,0xe5,0x39,0x29,0x5d,0x11,0x11,0x18,0x2b,0xd5,0xda,0xfc,0x1d,0x2b,0x2c,0xe6,0xf2,0xff,0x0d,0xd4,0xfb,0xfc,0x66,0x07,0xf7,0x2c,0xef,0xf3,0x27,0x13,0x0f,0xeb,0xdd,0x1b,0x9d,0xdb,0xf6,0xbe,0xd2,0x0f,0xa7,0x13,0x41,0x32,0x0b,0x1d,0x3d,0xd7,0xfa,0x1a,0xd7,0xfe,0x01,0x0b,0xe9,0xd6,0x2d,0xfb,0x02,0xed,0x12,0xed,0xcd,0xd6,0x06,0x7f,0x6f,0x01,0x46,0x2f,0xf8,0x24,0x00,0xa9,0x48,0x07,0xff,0x1d,0xe2,0x38,0x17,0xf5,0x3b,0xfc,0x01,0x56,0xbf,0x47,0x03,0x19,0x5c,0x16,0x03,0x44,0xce,0xe5,0x22,0xeb,0xb0,0x2a,0x0f,0xdb,0x01,0xe0,0x0c,0x13,0x18,0xd5,0x16,0x57,0x09,0xf5,0x4c,0x1f,0x3e,0xf3,0xed,0xd5,0xfd,0xee,0xd8,0xf0,0xdd,0xd7,0xf9,0x2e,0x1d,0xe7,0xb3,0x33,0xe1,0x16,0x38,0xff,0x17,0x08,0xab,0xfa,0xd8,0xa7,0xdb,0xfa,0x02,0x05,0xb7,0x59,0xf0,0xde,0xd6,0x12,0xc1,0x08,0x00,0x05,0xd4,0xf0,0xe7,0x21,0xcb,0x0c,0xf1,0x34,0x02,0x0a,0xfb,0x29,0xe4,0xed,0xb9,0xac,0xda,0x10,0x2f,0x2f,0xf5,0x18,0x7f,0xfa,0x6f,0x35,0x15,0x4a,0xf9,0x20,0x0f,0x1e,0x04,0x23,0x0c,0x0b,0x31,0x3e,0x3a,0xfb,0xea,0xfd,0x06,0x05,0xd6,0x0e,0x13,0x3f,0xed,0xf5,0x53,0xcc,0xbc,0x21,0xd1,0xd8,0x0e,0x20,0xc6,0x03,0x0d,0x55,0xef,0xe7,0xe0,0x15,0xd6,0xfb,0x42,0x35,0xeb,0x95,0xa0,0xd5,0x0b,0x07,0x10,0xda,0x28,0x04,0xe9,0xdf,0x2d,0xed,0x0e,0x13,0xc5,0xf8,0x09,0xe7,0x35,0xc5,0xfc,0x12,0x03,0xf9,0xe6,0x15,0x03,0xf0,0x23,0xe8,0xe3,0xed,0xf0,0x10,0xec,0x15,0x28,0xf6,0xf0,0x1d,0x2d,0x2b,0x19,0x06,0xf4,0x03,0x1c,0x3a,0xe0,0x09,0xc6,0xe7,0xea,0x24,0xf0,0x2a,0x5a,0xfb,0xfe,0x13,0x48,0x0b,0x14,0xed,0x18,0xf5,0xeb,0x29,0x24,0xe0,0x08,0x3d,0x09,0xc6,0x81,0xec,0x29,0xfa,0xed,0xe5,0x0a,0xfa,0x11,0xf9,0xa2,0x1d,0xe6,0xf5,0xf4,0x05,0xe9,0x1d,0x54,0xeb,0xcc,0x19,0x52,0xea,0x2e,0xf9,0xf4,0x04,0x05,0x34,0xd2,0x2b,0xd6,0x02,0x1e,0xfc,0x09,0x07,0x2d,0x17,0x3b,0x08,0xc2,0x28,0x14,0xf0,0x21,0xe0,0x20,0xc6,0x40,0xfd,0xfb,0x2a,0x1f,0xf1,0x0b,0x0f,0x0f,0x09,0xf2,0xf3,0xd2,0x5c,0x46,0xdc,0x04,0xc8,0x9b,0xeb,0xf9,0x99,0x33,0xdc,0x3a,0x02,0xe1,0xf1,0xe6,0xcb,0x21,0x0e,0xea,0xa8,0x15,0xe7,0x41,0xe8,0x15,0xf6,0x3f,0x35,0xe2,0xe2,0xe1,0x44,0x38,0x40,0xc1,0xac,0xde,0x1f,0xd5,0xd5,0xfb,0x01,0x4e,0x43,0x2d,0xea,0xe4,0xdb,0xa9,0xbf,0x8b,0x21,0xc2,0x18,0xf0,0x30,0x11,0x2e,0x11,0xfe,0x9d,0xb9,0xc2,0x7f,0xbd,0x12,0x0f,0x19,0x41,0x6f,0xfe,0xf9,0xd4,0x21,0x0a,0x60,0x0b,0x09,0xcb,0xf4,0x09,0xe4,0xee,0x0e,0x35,0x3e,0x08,0x26,0x73,0x15,0x33,0x12,0x1b,0xf0,0xed,0xdf,0x22,0x27,0x0f,0x09,0x06,0xc0,0x52,0xfb,0x22,0x29,0x39,0x2a,0xf6,0xed,0x38,0x22,0xe8,0x24,0x1e,0xe0,0xbe,0xe7,0xec,0x28,0x46,0x0f,0x2e,0xf6,0x0e,0xfb,0xd9,0x53,0xef,0xcf,0x18,0x20,0xdd,0xb6,0xf8,0x3d,0xeb,0xd6,0xdd,0xe4,0xd3,0xd2,0xed,0xdf,0xc3,0xd0,0x02,0x3b,0xf9,0xd7,0xfb,0x0f,0xff,0xf7,0x19,0xcc,0xfe,0xe5,0xe8,0x35,0xda,0xf4,0x06,0xfc,0x1b,0xcd,0xdf,0x13,0xd5,0xee,0xdf,0x32,0xf6,0x2f,0x2c,0xbb,0xfc,0xf0,0x00,0xe5,0xe3,0x1f,0xda,0x10,0xd7,0x3d,0x29,0xec,0xf0,0xf3,0xe9,0x7f,0xe3,0xb8,0xdf,0x40,0x4e,0xd4,0xec,0x1f,0x16,0x30,0xe7,0x17,0x12,0x0c,0xe2,0xd3,0x18,0x04,0x1c,0xc8,0x21,0xd4,0x11,0xf0,0xbd,0xdf,0xe1,0xf5,0xd2,0x14,0x56,0xeb,0x14,0x09,0x04,0xfe,0x14,0xfb,0xac,0xec,0xc1,0x1e,0x2f,0x1e,0xfa,0xdd,0x00,0x68,0xdd,0xee,0xd2,0x31,0x4d,0xfe,0x01,0xf3,0x6e,0xbc,0xbd,0xff,0x0a,0xf2,0xc3,0xeb,0x12,0xcc,0xc2,0x91,0x03,0x0d,0x66,0xe2,0xd6,0xd3,0xc6,0xd1,0xd4,0x3c,0xe0,0xdb,0x4d,0x0f,0xd8,0xa0,0xe3,0xd0,0xbd,0x01,0x0c,0xe6,0xed,0x0f,0x3d,0x16,0x26,0x36,0x0e,0x0c,0x07,0x00,0x68,0x34,0x05,0x14,0xf1,0x87,0xea,0x32,0xbd,0x5b,0xaf,0x42,0x31,0xec,0xd4,0x2f,0x81,0x65,0x25,0x07,0x3e,0x3e,0x30,0x15,0x8e,0xcf,0x9e,0x13,0xf8,0x03,0xc6,0x2a,0x37,0x1a,0xfc,0x13,0x27,0xe2,0x96,0xd2,0x2c,0xe6,0xfd,0x32,0xca,0xc6,0x1a,0x2d,0xa5,0xe0,0x05,0xed,0xfe,0x2c,0x17,0xdb,0x19,0x18,0xf4,0x4e,0x10,0xf9,0x6b,0x15,0x0a,0x30,0x1c,0x3e,0x50,0x86,0xdf,0x29,0x24,0x13,0xe6,0xbe,0x2d,0x24,0x1d,0x04,0xc5,0xd0,0x11,0x1a,0x04,0x04,0xdb,0xf6,0xe8,0x0f,0x15,0xe3,0xc4,0x08,0x2d,0xfb,0xd7,0x17,0x35,0xc2,0x1b,0x23,0xdd,0x0f,0x17,0xf8,0xf0,0x0d,0x1c,0xd1,0x6e,0xc5,0xc6,0x08,0x13,0xd3,0xed,0x56,0x10,0xde,0xf5,0x23,0x01,0x06,0x0b,0x19,0xee,0xff,0x0d,0x5c,0xe3,0x07,0x27,0x0e,0x35,0xdb,0x14,0xe5,0x1f,0x2d,0x23,0xf5,0x32,0xee,0xc9,0xd4,0xe2,0xe9,0x18,0xec,0x3b,0xe6,0xd0,0x04,0x05,0xd9,0xff,0xa8,0xf0,0xcc,0xd2,0xed,0x09,0x00,0xf6,0xeb,0xec,0xbe,0x0d,0x20,0xf7,0x40,0x22,0x0f,0x08,0x30,0xd5,0x28,0xb1,0x1f,0x1b,0x15,0x09,0xf1,0x0b,0xd4,0xd1,0x17,0x81,0x15,0x01,0x2a,0x03,0x3d,0xe0,0xce,0x1a,0x37,0xd6,0xb6,0x14,0xe5,0xe3,0xbe,0x18,0xee,0x27,0xe0,0xff,0xc5,0xf6,0xea,0xcb,0x5a,0xdf,0xf0,0x49,0xc1,0xe9,0xdc,0xab,0x3d,0x0d,0x17,0xf8,0x1c,0xdb,0x02,0xcf,0x24,0xe7,0x16,0xee,0x20,0x06,0x13,0x39,0x30,0x19,0xd0,0xb6,0x25,0x01,0xe8,0x62,0xc8,0x00,0xd5,0x5b,0xf5,0x16,0xec,0x16,0x04,0x55,0x28,0xf3,0xdb,0xde,0xea,0x40,0xe1,0x4c,0x33,0xca,0xdd,0x0d,0x21,0xfc,0x00,0x41,0x23,0xec,0x3d,0xe0,0xdf,0xd2,0x1b,0x4b,0x38,0xfd,0xd2,0xf1,0xc9,0x95,0xfe,0x55,0xea,0xdc,0xfd,0xcc,0x37,0x26,0x24,0x28,0xf3,0x49,0xd4,0xdb,0x25,0xdf,0x11,0x13,0x24,0x19,0x04,0x4e,0x14,0xc7,0x0c,0xfb,0x0c,0x26,0x13,0xf0,0x05,0x16,0x81,0xa2,0x22,0xf5,0xf9,0xe1,0x11,0xc7,0xea,0xf4,0xec,0xf2,0x1d,0x1d,0x33,0x34,0x55,0xaf,0x06,0x2d,0xde,0x90,0xc1,0x4c,0x0a,0x07,0xc5,0xfa,0x6f,0x2c,0xdf,0x40,0x06,0xe6,0xff,0x27,0x18,0xab,0x60,0x7f,0xf0,0x55,0xf7,0x9b,0xdf,0xc7,0xe3,0x19,0xed,0x20,0xa5,0xfe,0xfa,0xdd,0xd7,0x0b,0xe1,0x7c,0x38,0xea,0x00,0x1e,0xea,0xd4,0x12,0xba,0xe7,0xa3,0x23,0xbd,0x5b,0x04,0x24,0x3f,0xe0,0xbc,0x13,0x19,0xf6,0xf4,0xeb,0xeb,0x0d,0x58,0x52,0x2b,0x0d,0x3b,0x1f,0xfa,0xdf,0xfb,0xb2,0xc3,0xe2,0x58,0xb0,0xf4,0xd2,0xdf,0xe5,0xe9,0xf9,0xc5,0xda,0xcf,0x48,0x0c,0xdb,0xe4,0xcf,0xd6,0x2f,0x2d,0xea,0x38,0x34,0x17,0xfd,0x3a,0xe9,0xce,0x1b,0x00,0x29,0x13,0xc4,0xe6,0xef,0xc8,0x1d,0xdd,0x3f,0x0a,0x2a,0xc4,0x05,0x0e,0x43,0xdb,0xea,0xf1,0xe9,0xb1,0x53,0xea,0xa5,0x11,0xf7,0x2a,0x17,0xb4,0x06,0xda,0xcc,0xe9,0x09,0xcc,0xe2,0x81,0x39,0xd4,0xdd,0xf6,0x06,0x06,0x9c,0xd7,0x20,0x60,0xe6,0x2d,0xea,0xc8,0x42,0xd4,0x26,0xf3,0x20,0x18,0xf0,0x37,0x56,0xcc,0xe3,0x50,0xe8,0xef,0x2e,0xe2,0x46,0xdd,0x68,0xe2,0xfe,0x07,0xa6,0x98,0xed,0x4e,0xd6,0xe2,0x9f,0xd3,0x5f,0xc9,0xd5,0x1f,0xc9,0x09,0xd5,0xa8,0x06,0xfe,0xe1,0xe1,0xc2,0x70,0x25,0xf1,0xc4,0x42,0x3c,0x57,0xa9,0xce,0xea,0x17,0x3f,0x00,0xdc,0x1b,0xdc,0xd0,0xf8,0xb7,0xfe,0xd5,0x00,0xcd,0xe7,0xe9,0xcd,0xbf,0x0b,0x46,0x1f,0xe4,0x32,0xde,0xbc,0x19,0x18,0xd7,0x20,0xd2,0xf2,0x39,0x4d,0x30,0x26,0x41,0xec,0xcd,0xc8,0x10,0xeb,0xcf,0xe3,0xdd,0xeb,0x2a,0xfd,0x3c,0x2b,0x8e,0xe5,0xfa,0xc9,0xf0,0x08,0x19,0xb0,0xb9,0xeb,0x1e,0xd0,0xfb,0xf9,0xce,0x12,0x50,0x31,0xcb,0x5b,0xae,0xf5,0xf4,0xec,0x08,0xcd,0x37,0xdf,0x1b,0xfa,0x0d,0xf5,0xf4,0xf8,0xb2,0xff,0xd8,0x3f,0xe6,0xcc,0x0c,0xeb,0xf3,0x28,0xee,0x01,0xf2,0x14,0x81,0x22,0x0d,0xfb,0x00,0xf0,0xe1,0x2b,0xee,0x1a,0xec,0xf5,0x0b,0xe9,0xb6,0x0e,0xdf,0xc6,0x21,0x11,0xfd,0xdf,0xd2,0x15,0xf9,0x17,0xf6,0x2d,0xfd,0xf9,0xda,0x02,0xcf,0x16,0xff,0x0e,0x11,0x20,0x55,0x29,0xdd,0xd1,0x62,0xc9,0xfd,0xb5,0x26,0x1e,0xc1,0x0b,0x22,0xf7,0x19,0x0e,0x11,0x08,0xa6,0x14,0x02,0xe1,0xf8,0xd4,0xc8,0x16,0xd2,0xf2,0xee,0xf2,0xb0,0x05,0xf1,0xf9,0x0c,0xc1,0x09,0x1a,0x0b,0xf2,0x45,0xf3,0x74,0xdb,0x0e,0x0d,0xda,0xf1,0xd2,0x19,0xdf,0xf4,0xd9,0xad,0xf5,0x0b,0x2d,0x1a,0xda,0x17,0xfd,0x0f,0x2f,0x2a,0x1a,0xf0,0xea,0x06,0xc0,0x00,0x2a,0x56,0x0d,0x65,0xad,0x37,0xd8,0xfa,0xde,0xae,0xe8,0x14,0xf2,0xec,0xf2,0x23,0x13,0x2f,0xcd,0xec,0x09,0xf0,0xa5,0xee,0x0a,0xee,0xfa,0xe0,0xb2,0x0f,0xd6,0x2a,0x40,0xff,0x0d,0xe0,0x0a,0xdd,0x1c,0x09,0x62,0x07,0x47,0x08,0xf9,0xec,0xa0,0xbf,0x30,0x04,0x10,0xdd,0x39,0x34,0x7f,0x1a,0x18,0x41,0xc4,0xe5,0xf4,0x34,0x4d,0xf8,0xde,0xfa,0x1d,0x2e,0x19,0xff,0xec,0x1f,0xff,0xea,0xfd,0x0b,0x0a,0x0b,0x2d,0x1d,0xc5,0xd0,0xda,0xe7,0xd4,0x3e,0x3a,0xff,0x14,0x1c,0xc9,0x92,0x21,0x17,0xe4,0xfc,0xd4,0xc1,0x6b,0xe1,0xf4,0xd0,0x08,0xc6,0xdd,0x5d,0xc6,0x61,0x62,0x16,0x2a,0xd8,0xcd,0x21,0x19,0xe0,0xd4,0x1d,0x41,0xde,0xdd,0x10,0x1d,0x08,0x37,0x57,0x06,0x0d,0xe9,0x0f,0x67,0x8e,0x29,0xf8,0xd8,0xba,0xf7,0xb9,0xde,0xfa,0xaa,0x07,0xa1,0x07,0xda,0x02,0x00,0xf6,0x18,0x09,0xe8,0x1b,0x1d,0x07,0x07,0x20,0x54,0xd3,0x00,0xc6,0x4b,0xb4,0x41,0xfb,0xee,0xf7,0xf1,0xdd,0xdf,0xf7,0x0e,0x31,0xc4,0x39,0x0e,0x00,0xcd,0x06,0xd5,0x18,0x1a,0x01,0xf5,0x17,0x81,0x3d,0x3e,0xd9,0x1a,0x3c,0x0b,0xf2,0x45,0x0d,0xa6,0xd2,0x1a,0xb9,0x4e,0x0b,0xcb,0x3c,0xeb,0xfd,0x28,0xdc,0xc6,0x12,0xa4,0xe5,0xe4,0xdd,0xae,0xa7,0xe3,0xd4,0xe3,0x20,0xb9,0xc2,0x01,0x0b,0xd4,0x11,0xe3,0x44,0xdd,0xee,0xcc,0xf0,0xb5,0x1c,0xf9,0x04,0x52,0xc3,0x39,0xf8,0xeb,0x03,0x75,0xf4,0x17,0x32,0x25,0x31,0xc0,0x25,0xf6,0xfc,0x58,0xe8,0xcf,0xe7,0x1e,0xe7,0x23,0x04,0x30,0x12,0x1e,0xec,0xd6,0x11,0x37,0x12,0xdd,0x23,0xc4,0xfe,0x00,0x05,0x02,0xfc,0xbb,0xf4,0xea,0x01,0x1c,0x37,0xe6,0xd5,0x52,0x05,0x13,0x31,0xf7,0xde,0x10,0xe9,0xdd,0xf2,0xef,0xdc,0x01,0x0d,0xc9,0x5f,0x09,0xdd,0x2f,0x15,0xdb,0xe7,0xf9,0x97,0x50,0x0e,0xf0,0x60,0xdd,0x4b,0x54,0xeb,0x02,0x1d,0xf6,0x1a,0x24,0xc4,0xd9,0x0f,0x26,0x91,0x7f,0xdc,0xf8,0xf6,0x3c,0x4f,0x32,0x11,0xf7,0x3d,0x1a,0x26,0xf0,0x0b,0x17,0xfa,0xd5,0xe2,0x04,0x15,0xf3,0xe9,0xff,0xba,0xf9,0x28,0xe9,0xe9,0xe8,0x0a,0xf3,0x1f,0x42,0xdc,0x0b,0x0a,0x08,0x3f,0xf5,0x01,0x30,0x10,0xce,0x93,0xc9,0x11,0x13,0xd9,0xf0,0xc2,0xb7,0xeb,0x0c,0x0a,0xde,0xe3,0x1e,0x75,0xc7,0x3b,0x32,0xf5,0x28,0x1e,0x26,0xf0,0x4e,0xfe,0xa7,0xeb,0xd1,0xf6,0xa6,0xf1,0xdd,0x2c,0x06,0x3c,0x25,0xfc,0x62,0x30,0xa0,0x0c,0xe2,0x94,0xca,0xa4,0x1c,0xd7,0xc4,0x32,0x11,0xc0,0xe3,0xe9,0xce,0xee,0xf7,0x02,0x7f,0xf3,0xd9,0xe1,0xe3,0x46,0x57,0xe7,0xa9,0xaf,0x14,0x0d,0x1a,0x0a,0xc3,0xfc,0xc8,0xfc,0x18,0xc7,0xde,0x17,0x00,0xd7,0x59,0x17,0xe2,0xed,0x3d,0x9e,0x6a,0x1c,0x39,0x18,0x43,0x0b,0x0f,0xd9,0xab,0xed,0x13,0x41,0x11,0xcd,0xe4,0x60,0xeb,0xee,0xb1,0x02,0xe9,0x0a,0x05,0xee,0x29,0xe5,0xfc,0xe3,0xb5,0xd4,0xb2,0x0f,0xd9,0xf7,0xf8,0xf6,0x01,0xf5,0xfd,0xf5,0x0b,0xe9,0xd7,0x10,0x0a,0xca,0xd8,0xd7,0xf4,0xc7,0x12,0xe7,0x34,0xd5,0xf9,0xeb,0xff,0x1b,0x12,0xe7,0xd4,0xc3,0xee,0xec,0x4d,0x22,0xf2,0xe6,0x37,0x1b,0xc5,0x06,0x2d,0x03,0xd2,0xcf,0x0f,0xfe,0x20,0xef,0xe1,0x17,0xf1,0xdf,0x08,0x3b,0xd8,0xd8,0x03,0xfd,0x2e,0xdf,0x4c,0xed,0xb9,0x10,0xe3,0xdc,0x19,0xff,0xdf,0xf5,0x05,0x42,0xb1,0x92,0x87,0xd0,0xf6,0xe7,0xec,0xe7,0xf5,0xd0,0xdb,0xd5,0xe0,0xc9,0xc9,0xf9,0xc1,0x16,0xfd,0x65,0xeb,0x18,0xfc,0xeb,0x01,0x07,0x05,0xe9,0x05,0xdc,0x18,0xee,0xe7,0x3f,0xf9,0x23,0x16,0x06,0x20,0xfd,0x01,0x0d,0x00,0xde,0xfb,0xe4,0x27,0xea,0xca,0xbb,0xe3,0x0a,0xd8,0x27,0x81,0xed,0x14,0x1a,0xfa,0x15,0x8f,0x1d,0xf2,0xed,0xf3,0x65,0xe6,0x1c,0x52,0xd7,0x2b,0xe5,0x10,0xaf,0x30,0x4b,0xd2,0xfd,0x2a,0x22,0x2b,0x34,0xe6,0xeb,0x07,0x37,0xe9,0x1b,0x70,0x06,0xe1,0xe5,0x02,0x02,0xd9,0x03,0x07,0x05,0x19,0xfd,0xf4,0xe0,0xad,0x07,0xf8,0x2f,0x08,0x1c,0x1a,0x1e,0xfb,0xef,0xf4,0xcd,0x00,0x10,0xff,0x1a,0x05,0xb1,0xb8,0xd7,0x08,0x90,0xe7,0xc2,0xf6,0xcb,0x10,0xce,0x9f,0x91,0x0e,0xbc,0x3d,0xbb,0xd8,0xc9,0xe9,0xf7,0xc3,0xf8,0x2f,0x09,0xaa,0x01,0x20,0xe0,0x3b,0x04,0x7f,0x5c,0xd7,0x11,0x38,0x06,0xe7,0x25,0x0f,0x9d,0x2f,0x2c,0xea,0x32,0x3f,0x21,0x1b,0x01,0xb4,0xe3,0xf3,0x6a,0xce,0xf6,0x19,0xbd,0xe7,0x0d,0xec,0xc8,0xba,0x9a,0x1e,0x41,0x18,0x29,0x28,0x03,0xef,0x07,0xe7,0xf4,0xce,0xf5,0xed,0xcb,0x3c,0xdd,0x05,0x02,0xe1,0x00,0xf7,0x14,0x25,0x23,0x06,0xe6,0x33,0x13,0x0c,0xe4,0xc8,0x7f,0xc4,0xf8,0x15,0x18,0x0b,0xe9,0xed,0x36,0x39,0xfe,0xfa,0x0c,0x20,0x47,0xe2,0x00,0x32,0xcc,0xc3,0xf3,0x2d,0xef,0x04,0x05,0xb6,0x03,0xea,0xc4,0xfc,0xf7,0xe4,0xfe,0xfd,0xfd,0x10,0x05,0x0f,0xee,0x0d,0x2b,0x18,0xe2,0xe8,0x17,0xfc,0x24,0xf0,0xec,0x1f,0xd1,0xa1,0x07,0xfb,0x13,0x09,0x00,0x00,0x02,0xfb,0x10,0x0a,0x27,0x04,0xf3,0xf6,0xee,0xf5,0x04,0x46,0x08,0x07,0xf7,0x0d,0x02,0x01,0x20,0x1b,0xfc,0x24,0x28,0xc9,0x02,0x01,0x12,0xe9,0xf8,0x17,0x58,0x0f,0xfa,0x28,0xed,0xfb,0x16,0xc0,0xfe,0xd8,0xfb,0x1e,0x2e,0xeb,0x23,0x7f,0x06,0xfc,0x01,0x25,0x38,0xcd,0x2b,0xed,0xf4,0x1d,0x00,0x28,0xe4,0x62,0x0e,0x03,0x1c,0xc4,0x1e,0xce,0xe2,0x0d,0xeb,0xf3,0x1e,0xfe,0xff,0x7a,0x32,0xdd,0xb6,0xda,0x09,0x3e,0xf1,0xc3,0x1b,0x37,0x0a,0x13,0xe0,0x11,0x22,0xef,0xe6,0xfe,0xdc,0xf1,0x04,0xbb,0xfe,0xe5,0x97,0xc8,0x2a,0x9d,0xcf,0x11,0xea,0xf0,0xfe,0x24,0x08,0xb9,0x07,0xf4,0x18,0x44,0xea,0x36,0x09,0x2a,0xfa,0x42,0x5f,0x9c,0xe1,0xf0,0x06,0x22,0x4d,0xaf,0xfb,0xfb,0x07,0xe5,0xfd,0xf4,0xc8,0xe8,0x0f,0x0b,0x0f,0x52,0x4b,0x26,0xfb,0x0e,0x31,0x2e,0xdf,0xe3,0x31,0x22,0x31,0xcd,0x33,0x19,0x00,0x06,0x01,0xb8,0xee,0x09,0xf7,0x08,0xe1,0xd7,0xfe,0xf8,0xc4,0x38,0xf7,0xfc,0xd4,0xe0,0x04,0x1a,0x1d,0x33,0x12,0x05,0xb7,0xd9,0x65,0xee,0x1c,0x15,0xe8,0x31,0xc9,0xc8,0x1a,0x1a,0xfd,0x23,0x2a,0xe7,0xf4,0xc1,0x39,0xd2,0xaa,0xd2,0xf7,0xe1,0x21,0xe6,0x1f,0xe4,0x32,0x16,0x11,0xbd,0x1b,0x98,0x2d,0x0a,0x24,0x0c,0x6d,0x6a,0xdd,0x00,0x23,0x3c,0xbb,0x58,0xc9,0x0e,0xd6,0xec,0xdc,0xc8,0xa1,0x2d,0xea,0x3a,0xff,0x01,0x99,0xd0,0xc0,0x7f,0xfc,0x89,0x9f,0x2d,0x2e,0xf3,0xb0,0x2a,0x01,0x1a,0xc0,0xde,0x39,0xe2,0xe6,0xda,0xc5,0x51,0x20,0xf9,0x4b,0x05,0xf2,0xe2,0xe1,0x17,0xbb,0x3c,0xff,0xd1,0xd4,0x13,0xed,0x25,0x1c,0xe6,0x02,0x1e,0xf5,0x02,0x21,0x27,0xbb,0x32,0x06,0xa7,0xe5,0xef,0x06,0xbc,0x70,0xff,0x17,0x4c,0x1e,0xd3,0xef,0x17,0xe5,0xf4,0x00,0x6a,0x0d,0x0e,0x0e,0x51,0x03,0xe6,0x24,0xf0,0xfa,0xee,0x38,0x04,0x62,0x12,0x3a,0xde,0x1c,0x11,0x5a,0xdf,0xe0,0x31,0xe6,0xc6,0xe3,0xe8,0x51,0xe4,0xc4,0xf9,0x19,0xf3,0xf1,0x53,0x07,0xdf,0x25,0x2e,0x10,0xda,0x1f,0xb4,0xed,0xfd,0xf6,0xfb,0x0d,0xc1,0x1d,0xdd,0xd9,0x27,0xbe,0xbc,0x39,0xbb,0x11,0xcc,0xe2,0xcf,0x34,0x00,0x34,0x13,0xe8,0x1f,0x11,0x81,0x07,0xb0,0x32,0x01,0x22,0x07,0xc3,0x0a,0x0a,0xfd,0x1c,0x34,0x4b,0xd4,0xfe,0x05,0xab,0x0c,0xcf,0x07,0x14,0xd1,0x29,0xf3,0xf4,0xb6,0xd5,0x54,0xf5,0x07,0x70,0xfb,0xfa,0xe3,0xcc,0x12,0xe6,0xfd,0x34,0xac,0x00,0xf9,0x03,0x48,0x3c,0xce,0xbe,0x12,0xe4,0xc7,0x04,0x1f,0xe3,0x0d,0xd9,0x32,0xf5,0x48,0x04,0x4f,0xf7,0xeb,0x2e,0x34,0x18,0x2e,0xef,0x15,0x02,0x04,0x16,0xbb,0xe3,0xdd,0x16,0x18,0xfa,0xee,0xe0,0xf7,0x28,0x22,0x07,0x0c,0x0f,0x37,0xe5,0xf2,0xdd,0xe3,0xfd,0xfb,0xcc,0x7c,0xf2,0x1d,0xf5,0x2d,0x08,0xd3,0xc0,0xdb,0xeb,0x09,0x0f,0xf3,0x08,0x03,0xed,0x1e,0x02,0x1a,0x42,0xd9,0xf4,0x0c,0xfe,0xf1,0xe7,0xf1,0x15,0x0f,0x11,0xc7,0xf5,0xc4,0x01,0xf4,0x04,0xe0,0x13,0xbf,0xd2,0x0d,0x40,0xec,0x2a,0x21,0xdb,0x5a,0x0d,0x5b,0xb5,0x17,0xf3,0xf3,0x15,0xfd,0xea,0xf7,0xdd,0x10,0x07,0xfd,0x36,0x7f,0xb2,0xf6,0x28,0x19,0xff,0xc0,0x03,0x16,0x17,0xec,0x03,0xec,0xdf,0xc7,0xf8,0xe8,0xc3,0x03,0x2b,0x08,0xef,0x0c,0x18,0x22,0xf7,0x2b,0xe5,0xde,0x9f,0x11,0x20,0x0f,0x32,0xbd,0xfe,0x1d,0x13,0xac,0x3d,0xf7,0xdd,0x54,0x09,0x5a,0x45,0xd1,0x10,0xf6,0x19,0xe1,0x07,0x6d,0xda,0xf8,0xc5,0x17,0x13,0xf7,0xb8,0x03,0x27,0xee,0x1c,0xc9,0xed,0x58,0xdc,0xcb,0x12,0x04,0x00,0xee,0xda,0xfc,0xfd,0xe8,0x00,0xfb,0x06,0x23,0xf6,0x1d,0xf8,0x2b,0xe0,0x1e,0x41,0xe4,0xd1,0x7f,0x06,0x0f,0xf8,0xcb,0x33,0x09,0x32,0xec,0x23,0xfb,0xf0,0x19,0x05,0x17,0xf1,0x2a,0x11,0xba,0xbc,0xd9,0xea,0xf0,0xdf,0x4e,0xff,0x1a,0xf2,0x12,0x1f,0xe9,0xf6,0xd6,0x1b,0xa9,0xfc,0xf3,0xd2,0xc1,0x17,0x17,0xe7,0x0e,0x13,0xf1,0xff,0x21,0xe7,0xf8,0xd8,0xf3,0xbe,0x3d,0xd3,0x9b,0xf7,0x2b,0x2f,0xe4,0xae,0x56,0xd6,0x20,0xd3,0x14,0xcf,0x25,0xd4,0xd8,0x07,0x81,0xee,0x24,0x01,0x1a,0x0c,0xd4,0xc5,0xf9,0x09,0xeb,0xf9,0xd4,0xcd,0xe3,0x07,0x0c,0xd5,0x08,0x03,0xfc,0xea,0x0f,0x10,0x00,0x4e,0xee,0x23,0xda,0xca,0xce,0xff,0x09,0xea,0x26,0xd2,0x2a,0x06,0xd9,0xf5,0x04,0x01,0xdc,0xf9,0xf9,0x6b,0x01,0xeb,0xfe,0x09,0x05,0xef,0xd0,0x30,0xe8,0xf4,0xfa,0xed,0x03,0x29,0xc6,0x00,0xe2,0xd0,0xf5,0xb9,0xf9,0x09,0xb3,0xf5,0xd7,0xeb,0xee,0x24,0x2f,0xf6,0x05,0x05,0xfe,0x09,0xd7,0xcb,0x4a,0xea,0x36,0x17,0xeb,0xd0,0x14,0xee,0x12,0xb8,0xe0,0x0a,0x21,0xe8,0x1c,0x13,0x07,0x08,0xf2,0x39,0xe5,0x0a,0x0e,0x4e,0x3f,0x2d,0x0e,0x11,0xb3,0xdf,0xe7,0xf3,0xe8,0x0a,0xfd,0x19,0x29,0x2c,0x2d,0xef,0x3f,0xf6,0x51,0x2f,0xf8,0x1c,0xea,0x1c,0x6a,0x3a,0x40,0xcf,0x49,0xfc,0x2d,0x11,0xd4,0x42,0x2b,0x1c,0xde,0xfa,0x1b,0x2f,0xee,0x24,0xfd,0x21,0xff,0x0f,0x24,0xe8,0x25,0xb6,0xd8,0xe0,0xef,0xdb,0x25,0xb4,0xc4,0xfc,0xb5,0x34,0x2f,0x58,0xfe,0x3a,0xe4,0x1d,0x7a,0x3e,0xf0,0x33,0x20,0xf2,0x11,0xea,0xd6,0xec,0xd9,0xa0,0x36,0xb9,0x01,0xdc,0x14,0x07,0x32,0xc3,0x50,0x7f,0x14,0x53,0x50,0x11,0xd8,0x62,0xe7,0xfa,0x00,0x4b,0xe6,0x15,0x3b,0x20,0x1d,0x27,0xfc,0x9f,0x01,0x50,0x15,0x0a,0x59,0x60,0x37,0x44,0xd3,0xf6,0x1c,0xfd,0x13,0x02,0x0c,0x3d,0x04,0xc2,0xdd,0x39,0x1e,0x3a,0xbc,0xf9,0xcb,0xf9,0x20,0x0d,0xdd,0xcc,0xfd,0x27,0x0c,0xf2,0xfa,0x30,0x17,0x9a,0xa7,0xf6,0xc5,0x0a,0x3c,0x22,0xca,0xe6,0x17,0x09,0xbc,0x5f,0xc4,0x22,0xb0,0xfe,0x60,0xfb,0x61,0xc6,0x0b,0x10,0xdb,0xed,0x0f,0x4c,0x4d,0xf5,0xf0,0xe2,0x1a,0xfc,0x07,0xe2,0xd5,0x29,0x01,0x4e,0x08,0xba,0xf7,0x05,0xdb,0x13,0x02,0x06,0x0b,0x32,0x57,0xc0,0x23,0x01,0xd8,0x25,0x3c,0x43,0x37,0x09,0x36,0x1d,0x1d,0x69,0x70,0x03,0xb2,0x4e,0xea,0xf9,0xce,0x10,0xe9,0x7f,0xd5,0xe5,0x09,0x4a,0xd4,0x82,0x43,0x21,0x13,0x9d,0x83,0x32,0x11,0xf5,0x2f,0xcc,0xd9,0xfb,0xb6,0x6b,0x09,0x4c,0x65,0x30,0xae,0x02,0x1e,0x06,0xfb,0xc5,0xa6,0xbc,0xbe,0xf1,0x10,0x27,0xd3,0x66,0xc6,0x1b,0x08,0x16,0xd3,0x11,0xe7,0xef,0xf5,0x58,0x1b,0xe6,0xaf,0x18,0xe5,0x3e,0xef,0xd9,0xc6,0x2f,0x46,0xc2,0x09,0x2b,0x08,0x0a,0x08,0x17,0x11,0x1c,0x1d,0x2c,0xf7,0xf8,0x14,0xfc,0x2f,0xff,0xe3,0xf0,0x35,0x4a,0x28,0xe4,0x09,0xf8,0xfd,0xce,0x36,0xbe,0xf3,0xdc,0x9f,0x3c,0xdd,0xe1,0xe7,0x13,0xb2,0xeb,0xe9,0xfd,0xb7,0x1a,0xf7,0x09,0x46,0xf5,0x13,0x0d,0x01,0x13,0x5d,0x22,0xfa,0xe7,0xe4,0x37,0x1d,0x14,0xf5,0xf4,0xff,0xd1,0x1e,0xf0,0xff,0x8c,0xf8,0xcf,0x0e,0xbc,0x24,0x09,0xd8,0xc1,0xfe,0xca,0x04,0xd7,0x09,0xf8,0xc9,0xf0,0xaf,0xd4,0xb6,0xd8,0x2b,0xe0,0xfe,0x0a,0xf0,0xd9,0x00,0x7f,0xf4,0xf0,0x2d,0xbb,0x18,0xdb,0x02,0xed,0xd1,0x0c,0xb6,0xcf,0x0f,0x16,0xe5,0x0a,0xfc,0xd7,0x5e,0x1d,0xc0,0x31,0xe5,0xd0,0x20,0x0e,0x5b,0xee,0x6a,0xf4,0x1c,0xfa,0xeb,0xda,0xff,0x2a,0x26,0x43,0x04,0x20,0xd1,0xfd,0x46,0x00,0xf1,0x30,0x36,0x63,0xe8,0xf1,0xe7,0x4a,0x42,0xf4,0xe8,0xcc,0x4e,0xdc,0xac,0x0c,0xb7,0xb8,0x1f,0xff,0x27,0xbd,0xe1,0x02,0xdb,0x2c,0x1e,0xe8,0xb2,0xea,0xa0,0x16,0x13,0x59,0xf0,0xc2,0x12,0x1a,0x5d,0xea,0xd9,0xf5,0x0f,0xdc,0xdf,0xdb,0xc9,0xff,0xc9,0xd7,0xde,0xdb,0xf6,0xca,0x98,0xed,0xcd,0x57,0xc9,0xc8,0xbf,0x5d,0xfe,0x01,0x99,0xfb,0x6d,0x2a,0xed,0xe1,0xdd,0x2b,0x40,0x19,0xdb,0xd5,0x18,0x04,0xa1,0x4c,0xb6,0x52,0xb5,0x10,0x0e,0x07,0x0f,0xd1,0xfb,0xf6,0x05,0x33,0xc6,0xee,0xe1,0x91,0xd5,0x0e,0xca,0xfd,0xc9,0x1b,0xce,0xff,0xfb,0x25,0xdb,0x7f,0x03,0x3c,0x0f,0xcf,0xfc,0x49,0x2e,0x4e,0xc1,0xeb,0xdf,0x08,0xc1,0x26,0xe7,0xee,0xd0,0xea,0xf6,0xf2,0xc6,0xe4,0x0b,0xef,0x1b,0x01,0xa5,0x09,0x24,0xdf,0xd7,0xe0,0xf7,0xc6,0x36,0x44,0xde,0xcb,0x1a,0xcc,0xe7,0xd0,0xe9,0x7f,0x63,0x0d,0x21,0x08,0x01,0x0f,0x15,0x05,0xcc,0x0a,0xcd,0xee,0xd5,0x0a,0x2b,0xb2,0x49,0xf0,0x16,0x08,0x2d,0xff,0x37,0x05,0x19,0x04,0xcd,0xfc,0x1f,0xe0,0xd0,0xa6,0xf7,0x6b,0xcd,0xf6,0x54,0x26,0xb8,0xb5,0x27,0x0c,0x01,0xe1,0x58,0xdf,0x15,0xf6,0xd2,0x1c,0x21,0xd5,0x16,0x07,0xeb,0xf2,0x43,0xd0,0xbe,0xf3,0xca,0xf5,0x0e,0xdd,0x0b,0x01,0xe2,0xf5,0xf5,0xe4,0xfa,0xf0,0x01,0xe5,0x0c,0xf9,0x16,0xfa,0xe0,0xf4,0x12,0xfb,0x16,0x33,0xe7,0xc5,0x07,0x25,0x12,0xa6,0xcd,0x03,0x08,0xe1,0xe1,0xec,0xf4,0xe0,0x20,0x0c,0x73,0xc2,0x33,0xed,0x00,0xf3,0x2c,0xed,0x1f,0x04,0x24,0x3e,0xdd,0x3c,0x15,0x4d,0x1b,0x0e,0x0a,0xf9,0x35,0x29,0xdd,0x1b,0xbd,0x51,0x32,0x04,0x0d,0xfa,0x38,0x6a,0xd5,0x2c,0x25,0x1c,0x07,0xd4,0xf5,0x0e,0xbf,0x06,0xfc,0x2c,0x0b,0x2a,0x3b,0xf9,0xab,0x24,0x1e,0xf0,0x04,0xe7,0x18,0xd9,0xf1,0x00,0xeb,0x09,0xe1,0xd2,0xfc,0xf1,0xf4,0xf0,0xf3,0x48,0x1b,0x0d,0xd7,0xfa,0xcf,0xff,0xc4,0xf0,0xe0,0xc9,0x81,0x70,0x09,0xbe,0x17,0xad,0x19,0x99,0xea,0xd4,0x02,0x1d,0x1c,0xd4,0xdb,0xf3,0x3c,0xbe,0xc9,0x2a,0x1f,0xe4,0x4a,0xeb,0x06,0x04,0x47,0xfd,0xc7,0xa7,0xca,0xed,0xf0,0xca,0xd0,0xc6,0xf4,0x16,0xc0,0xe4,0xdb,0x0b,0xde,0x0d,0xd2,0xda,0xbd,0xe4,0x09,0x0d,0xa3,0x04,0x91,0x06,0xfa,0x26,0x00,0xfb,0xe1,0xe6,0xe4,0x1f,0xf7,0x04,0xef,0x5a,0x11,0xe2,0x27,0x40,0xe7,0x0d,0xd4,0x3a,0xf9,0xe5,0x2f,0xac,0xf8,0x3a,0xd7,0xe7,0x07,0xda,0xd9,0xec,0xd7,0xfa,0x25,0xc2,0xfd,0xed,0xd9,0x02,0xc4,0x4e,0x2f,0x48,0x0c,0xc5,0x25,0xc2,0xf5,0x3b,0x0a,0x42,0xe2,0x32,0xdd,0xba,0xfc,0xe2,0xda,0x2a,0xd7,0xd0,0x1c,0xc2,0x22,0x6b,0xe0,0xf1,0x06,0x02,0xfe,0xeb,0xdb,0x16,0x17,0x07,0xc5,0x10,0x00,0xeb,0x2f,0x11,0xd4,0xfc,0x0b,0x1f,0xee,0xc1,0xe4,0x7f,0x1e,0xe6,0xc3,0xe6,0x19,0x10,0xd3,0x0e,0xea,0x19,0xef,0x5c,0xf8,0x2a,0x08,0xfe,0x0d,0x2a,0x44,0x10,0xe3,0xf4,0x04,0x4f,0x2e,0xd7,0xcb,0x05,0x45,0xf6,0xf2,0x0f,0x03,0xe7,0x0e,0x0c,0xf6,0x0b,0xf0,0x26,0xe9,0xfd,0xc8,0xad,0x15,0x25,0xc7,0xf6,0x4f,0x13,0xed,0x09,0x14,0xe8,0xc2,0xfc,0xe9,0x0a,0xbf,0x48,0x42,0xf1,0x53,0x37,0xdb,0x36,0xcf,0xdf,0x0e,0x11,0x19,0x02,0xe7,0x09,0x5d,0x0f,0xf5,0x2a,0x22,0xd6,0x27,0xe2,0xf4,0x4e,0x86,0x00,0xbc,0xbc,0xec,0xca,0xfc,0xf4,0xfb,0x24,0xf5,0x2b,0x14,0x0b,0x31,0x51,0xae,0xb8,0x1f,0x13,0xff,0x34,0xee,0xd1,0x0f,0x19,0x1b,0x72,0xfe,0x5f,0x15,0x00,0x0f,0xbe,0x09,0x1b,0xeb,0xf4,0x41,0x21,0x73,0xa9,0xc3,0x17,0xf0,0x27,0xc2,0x06,0x57,0xd5,0xf1,0x34,0x39,0x1b,0x81,0x4a,0x09,0x23,0x9e,0x2b,0xee,0xdb,0x21,0x65,0x03,0x33,0xdd,0x0b,0x06,0x1f,0x6e,0x2b,0x02,0xe8,0x11,0x09,0x16,0xfc,0xf0,0xfe,0xda,0xf2,0xd3,0xfc,0xb3,0xfd,0x07,0xea,0x05,0x3a,0xc6,0x02,0xff,0x5c,0xa1,0x42,0x36,0x1b,0x36,0x04,0xd2,0xfc,0x03,0x2b,0xf4,0x08,0xfc,0xb0,0x14,0x52,0x06,0x13,0x60,0x26,0xde,0xd4,0x06,0xfb,0xcf,0xd4,0xe6,0xf4,0x1f,0x02,0x1c,0xfd,0xf8,0x04,0x33,0xc4,0x07,0xe3,0x56,0x47,0x03,0x36,0x1a,0x7f,0x19,0xb0,0x1c,0x53,0x0c,0xb4,0xfc,0x44,0x14,0x01,0x2e,0x22,0x1a,0xf5,0x11,0xf3,0xd1,0xe6,0xd7,0x37,0xfb,0xc8,0x17,0xe7,0x2d,0x07,0x36,0xe4,0xd4,0x0e,0x19,0x10,0x0e,0x3c,0x1a,0xb8,0x3c,0x37,0x14,0xeb,0xf4,0xda,0xe0,0xed,0x0f,0x04,0x06,0xe8,0xc7,0x27,0xed,0xf5,0xcf,0xc8,0x18,0x4c,0x2c,0xf0,0xb4,0x28,0x3b,0x0e,0xf6,0xd9,0x12,0xdd,0xe6,0xce,0xf5,0xdf,0x01,0xb9,0xef,0x08,0x3c,0x1b,0xe1,0xcc,0x0f,0x18,0xf8,0xf0,0xfd,0xc3,0xf9,0xf4,0xd8,0x07,0xe7,0xdb,0xe8,0xe2,0x2a,0x11,0x0d,0x2c,0x3e,0xe8,0x14,0x3e,0xdf,0x0b,0xef,0x28,0xea,0x24,0xd6,0x1f,0xf3,0xef,0x1c,0x16,0xfd,0xcd,0xd4,0x42,0xc3,0x7f,0x0a,0x07,0x1d,0x09,0x28,0x3e,0x01,0xec,0xf0,0x11,0xd1,0x58,0xf0,0x39,0x43,0x1f,0x1b,0x48,0x05,0xec,0x34,0x0a,0x23,0x08,0x01,0xfd,0x08,0x01,0x41,0xec,0x12,0xed,0xf1,0xed,0xe8,0xc3,0x20,0xf2,0xe1,0x11,0xce,0xd7,0xd8,0xf2,0xcf,0x01,0x0c,0x0c,0x17,0xc9,0x06,0x26,0x27,0x09,0xed,0x0d,0x20,0x04,0xcf,0xb2,0xe4,0xe9,0xda,0x08,0x12,0x5b,0xcd,0xe9,0xef,0x14,0xe2,0x4d,0xcc,0xf0,0x15,0x06,0x10,0xec,0xd8,0x51,0xea,0xce,0x0b,0x35,0xcc,0xdb,0xcf,0xfa,0x0e,0x32,0xe5,0x11,0x16,0x05,0x2e,0xd0,0xf8,0xee,0xf9,0x15,0xf7,0x25,0xf4,0xe3,0x12,0xe6,0xcf,0xdb,0xf8,0x06,0x0f,0xe3,0x36,0xed,0x09,0xf8,0xe4,0x0d,0xe0,0xe2,0x08,0xe3,0xee,0x09,0xe4,0x11,0x1c,0x3b,0xaf,0xee,0x08,0xfe,0xed,0x00,0xf8,0xf9,0xe2,0x4c,0x0a,0x0f,0x0d,0xff,0x07,0xf1,0xfc,0x09,0xf8,0x21,0xf0,0xc6,0x0d,0xf5,0xf8,0xd8,0x35,0x20,0xeb,0x16,0xea,0xfd,0x20,0xd1,0xe0,0xd6,0xde,0xfe,0xe3,0xe1,0x0f,0x81,0xf9,0x29,0xf5,0x60,0xca,0xf8,0x0f,0xff,0x0a,0x0c,0xd9,0xe2,0xc9,0x1e,0xf3,0x06,0xfc,0xff,0xe6,0xd9,0x25,0x1c,0xf0,0x19,0xfa,0xef,0xd3,0xcb,0xdb,0x0b,0x06,0xe1,0xfb,0xec,0xe8,0x00,0x16,0x11,0xf8,0x1d,0xf4,0x06,0x1e,0x09,0xe6,0x18,0xdc,0xe7,0x04,0x0c,0x06,0xd2,0x08,0xec,0xf6,0xd3,0xf2,0xfc,0xf7,0xd3,0xe8,0xfd,0x0a,0xf0,0x07,0x0e,0xc6,0xe2,0x0e,0x13,0xd8,0x04,0x0e,0xf2,0xef,0x01,0x03,0xea,0x22,0xdd,0x03,0x00,0xaa,0x21,0xe2,0x23,0xdf,0x06,0xe0,0xec,0xe6,0x26,0xd6,0xf2,0xeb,0x04,0xf5,0xcd,0xee,0x10,0xfd,0xc9,0x7f,0x15,0x0f,0xfc,0x16,0x26,0x19,0xca,0x10,0x11,0xda,0x1f,0x06,0x0b,0x12,0x1d,0xfa,0xf5,0x04,0xd3,0xfe,0xfd,0x21,0xee,0x1a,0x05,0x12,0x0e,0x0d,0xe4,0xe5,0x10,0xf5,0xd8,0xf2,0x1a,0x0c,0x29,0x0f,0xfe,0xdd,0xda,0xe2,0x02,0xf8,0x01,0xf6,0x04,0xdf,0x2e,0xf2,0xd4,0x40,0xb5,0xf4,0xa3,0xcb,0x09,0x54,0x33,0xea,0xe8,0xb3,0x16,0x1a,0x41,0x06,0x1e,0x39,0x1c,0x09,0xed,0x31,0x26,0x69,0xce,0x19,0xba,0x52,0xea,0xab,0x21,0xd8,0xc9,0xca,0x0b,0x3c,0xd4,0x7f,0xda,0x01,0x51,0x12,0xe7,0x29,0x1c,0x9e,0xea,0xea,0xea,0xe0,0xf4,0xeb,0xf0,0x1e,0xed,0x0e,0xc8,0x0d,0xbb,0xc6,0xcc,0xc7,0xc6,0xc2,0xf3,0xf8,0x2f,0x14,0x90,0xe5,0x9c,0xcf,0xf3,0xb5,0xa2,0x8d,0x09,0xcc,0xe7,0x00,0xed,0x6c,0x83,0xc1,0xc6,0xab,0xf6,0xef,0x04,0x4e,0xe4,0x43,0x12,0xdd,0x1a,0xb0,0x2e,0xc8,0xff,0xe4,0xf5,0xce,0xe7,0x1d,0xd4,0x18,0x0c,0x19,0x18,0x2f,0x9c,0x49,0x13,0x54,0x1b,0x07,0x0f,0xc6,0xb4,0xcf,0xd8,0xed,0x0f,0xeb,0x3b,0xfd,0x49,0xf9,0x60,0x08,0x26,0xec,0xfe,0x05,0xee,0x12,0x76,0xde,0xdf,0x0c,0xe1,0x18,0xfc,0x24,0xeb,0x98,0x20,0x39,0x9f,0xfc,0xd6,0x2e,0x3b,0xee,0xfc,0x0e,0xdd,0xd5,0x1e,0x18,0xb0,0xb3,0xeb,0xb3,0xf4,0xf9,0x28,0x71,0xe2,0x91,0x07,0xe1,0x1a,0xd9,0xc5,0xfb,0x20,0xcb,0x7a,0x27,0xe0,0x26,0x38,0xde,0x65,0xf7,0xba,0xd1,0xe6,0x05,0x0b,0x00,0xff,0x28,0x9c,0xe9,0xff,0x08,0x23,0xca,0xb7,0x3b,0xc8,0x06,0x64,0xc3,0xe0,0xe8,0x33,0xdb,0x6d,0x46,0x81,0xce,0x21,0x0a,0x6e,0x02,0x19,0xee,0xbf,0x2a,0x9b,0xf0,0x2b,0xe9,0x76,0x16,0x69,0xfa,0x05,0xd5,0xf5,0x3d,0x1f,0xc0,0x24,0x1e,0x0d,0x38,0xe5,0x48,0xf9,0xf5,0xf9,0x35,0x21,0x9a,0x5b,0x1d,0x19,0x17,0x18,0xda,0x53,0xe1,0xf5,0x06,0xf5,0x0a,0xf1,0xff,0xf1,0x4c,0xe8,0x02,0xdd,0x0e,0x91,0x56,0xd9,0xdb,0xf5,0xea,0x44,0xfb,0xe0,0x21,0xc9,0xd8,0x27,0xc4,0xc3,0x0d,0xf0,0xd2,0xf3,0xfe,0x8d,0x32,0xfc,0xf5,0x29,0x45,0x40,0x3a,0xf5,0x2f,0x24,0xe6,0x47,0xef,0x35,0x1b,0x07,0x29,0xd9,0xe2,0x14,0xe0,0x01,0x32,0xf7,0xbb,0x20,0xe2,0x6b,0x01,0x7f,0xed,0xe0,0x1c,0xe0,0x18,0xe2,0x4a,0x17,0xb8,0x22,0xa2,0xeb,0x59,0xe9,0x1c,0x1e,0x99,0x3a,0x3b,0x44,0xf8,0xb2,0x23,0xe9,0xc4,0x0d,0xa7,0xe1,0x16,0x0b,0xc8,0xac,0xce,0xb2,0xcd,0x17,0x20,0xd7,0xdc,0x15,0x2b,0xd7,0x9d,0x33,0x8d,0x10,0x43,0x94,0x35,0x14,0xd6,0xf6,0x3c,0x02,0x5e,0xf7,0x4a,0xc0,0xfa,0xf2,0xfe,0xf8,0x28,0x04,0x17,0xb8,0xee,0x19,0xf1,0xb9,0x81,0xcc,0x3a,0xfe,0xe4,0x07,0x51,0x7a,0x84,0x29,0x13,0xb6,0xb7,0xf4,0x0c,0x04,0x93,0xc4,0x33,0xe9,0x38,0xc6,0x09,0x0b,0x01,0xec,0xec,0xfc,0x3a,0xc2,0x4f,0x4a,0xc4,0xcf,0x1d,0xaa,0x27,0xe9,0x0a,0x78,0xee,0x1a,0xfa,0xc2,0x01,0xe7,0xef,0xf8,0x10,0x3c,0x45,0x43,0xe8,0x24,0x10,0xaf,0x60,0x3a,0x52,0x17,0xed,0xce,0xf5,0xe7,0x23,0x3a,0xa3,0xf8,0x4f,0x6e,0x35,0xd6,0x6d,0x23,0xdb,0xaf,0xce,0x4a,0xfd,0xd8,0xb1,0x0f,0xbb,0xa3,0x3b,0xcf,0xbf,0xf6,0xfc,0xd1,0xc6,0x96,0xf5,0x4f,0xea,0x0a,0x0d,0x32,0xbd,0xac,0xe3,0x9a,0x29,0x0b,0xde,0x1a,0x05,0x21,0x4c,0x22,0x2b,0xbc,0x47,0x4e,0xcc,0xe1,0x57,0xe4,0xbf,0x89,0x36,0xd6,0x69,0xf9,0x91,0x14,0xc4,0x17,0x4c,0xf6,0xec,0xe6,0x17,0x02,0xf7,0xde,0x0d,0x0b,0xd9,0x10,0xee,0xcd,0xdc,0xf8,0x04,0xbc,0xf7,0x00,0xff,0xfb,0xd7,0xb7,0xd5,0x21,0xf1,0xad,0xd6,0xec,0x38,0x12,0x7c,0x07,0xec,0xc0,0xf8,0xeb,0xba,0x3f,0xdd,0xfb,0xd5,0x2c,0x0a,0x01,0xe4,0xfe,0xbe,0xf5,0x24,0xba,0xf2,0x1a,0xda,0xe5,0x2e,0xdf,0xdc,0xf0,0x0f,0x56,0x0e,0xf9,0xe4,0x03,0x9c,0xcb,0xca,0xc9,0xeb,0x11,0x15,0x26,0x0d,0x1a,0xc5,0x2f,0x14,0x16,0x04,0xf3,0xfc,0x21,0xc8,0xd7,0x24,0xe5,0xfc,0x81,0xe9,0x1c,0xe9,0xd6,0x13,0xf9,0x50,0xdd,0xe6,0x30,0x0d,0xdf,0xc9,0xe2,0xfd,0x4f,0x00,0x30,0xd6,0xf7,0x0e,0xee,0xd0,0x01,0x12,0x16,0xf3,0x17,0x39,0xa2,0xd6,0x21,0xf4,0x02,0xcf,0xe9,0xe6,0x7f,0xf6,0x2d,0x1b,0x05,0xe3,0x31,0xf8,0x4d,0xfb,0xa2,0xe8,0xef,0x49,0x04,0x0d,0xfd,0xfc,0x34,0x11,0x37,0xfd,0x1c,0x28,0xca,0xf3,0xcd,0x18,0x2d,0xde,0xf9,0xf0,0x19,0x22,0xb8,0xab,0xd2,0x1e,0x2c,0xd0,0x50,0x31,0xfa,0xde,0xf2,0x1d,0xec,0x5b,0xef,0xf2,0x17,0x04,0x2a,0x27,0xd8,0x87,0x15,0xf4,0xe0,0x0a,0xb4,0x1a,0xda,0xe5,0xf2,0x13,0x2f,0x59,0x29,0x02,0x66,0x5e,0x00,0xb4,0x1e,0x10,0xf9,0x9e,0xda,0xb0,0x1b,0xd2,0xe5,0x06,0x0d,0x14,0xff,0x0c,0x30,0x3b,0x24,0x26,0xd5,0xcb,0xcb,0x1f,0xf7,0x30,0xf5,0x36,0xfa,0x10,0xac,0xfb,0x03,0x2d,0x4d,0x2f,0xe3,0xf1,0x1a,0xe4,0xc7,0x1d,0x09,0xd4,0x5a,0x39,0xe5,0xe6,0x4b,0x13,0x23,0xcb,0xf7,0xde,0x14,0x38,0x50,0x2a,0x26,0xe1,0xbc,0xf4,0x16,0xe3,0x08,0x32,0x30,0x75,0x10,0x07,0x1d,0xd9,0x15,0xa5,0xf9,0xc2,0xf1,0xf2,0x10,0x18,0xf5,0x01,0x4c,0xf6,0x6e,0xf1,0x0e,0xdb,0xc8,0xf9,0x3c,0x07,0xe5,0xfb,0xea,0xa4,0x1c,0x10,0x29,0x26,0x27,0x13,0x0a,0x6c,0xec,0x0b,0xc2,0xd2,0x15,0xa3,0xfa,0xcd,0x9a,0x11,0x08,0x23,0xe1,0xed,0x3c,0xf9,0x1f,0x00,0xeb,0x04,0x47,0x2f,0x0f,0x1f,0x7f,0xcf,0xd5,0xe3,0x5e,0x20,0x6e,0x13,0x33,0x1c,0xed,0x7b,0x18,0xc1,0xeb,0xbf,0x38,0x60,0x4c,0xd9,0xf7,0xee,0xf7,0x03,0x49,0xb6,0xee,0xc3,0x3d,0x05,0x73,0xa3,0x1b,0x22,0xfa,0x14,0x25,0xc5,0xf5,0x9a,0x0b,0x00,0xde,0x33,0xff,0x10,0x1b,0x3e,0xff,0x00,0xea,0xdb,0xb4,0x48,0xde,0xe8,0xeb,0x0d,0xe4,0xfc,0x14,0x1c,0x0d,0x4d,0xf4,0x04,0x40,0xae,0x1e,0x5c,0x61,0x66,0xda,0xa7,0xed,0xde,0xfd,0x21,0xa4,0x3f,0xd0,0x04,0x76,0xe9,0xfd,0x60,0xe3,0xa4,0x34,0x00,0x39,0x08,0xce,0xcf,0xd3,0x0a,0xd7,0xd5,0x2d,0x07,0x1c,0xe4,0xf4,0x6a,0xf5,0x38,0xf8,0xf3,0x24,0x4b,0x25,0x17,0x10,0x01,0x16,0x1f,0x17,0x02,0x02,0xf6,0x08,0xd6,0xd0,0x3e,0x3f,0xeb,0x2f,0x4d,0x3f,0x7f,0x90,0xf4,0xe2,0x08,0x23,0x10,0xd6,0xf5,0xc7,0xb4,0x23,0x2e,0xaf,0xff,0xed,0x94,0xb6,0xec,0xea,0xb7,0x49,0x43,0xb6,0x41,0x3b,0x0a,0xe0,0xdb,0x29,0x0b,0x6a,0x9c,0xcb,0x15,0x16,0xe5,0xd6,0x4b,0xb6,0x0b,0x42,0xed,0x06,0x04,0x4b,0xcb,0x52,0x51,0x18,0x41,0x1c,0x0c,0xfb,0x12,0xe9,0xce,0x0f,0xca,0x4d,0x3f,0x2e,0x12,0x0d,0xd2,0x2a,0xf9,0xed,0x3e,0x2d,0xd5,0xb9,0x75,0xe1,0x0a,0x31,0xda,0x39,0x42,0xc0,0xda,0x2a,0x38,0x12,0xdc,0xde,0xc5,0xe1,0x28,0x0c,0x55,0xd4,0xfd,0xf5,0xea,0x38,0xe9,0xfe,0x0c,0x55,0x51,0x2a,0x2f,0x17,0xee,0xf6,0xed,0x07,0xb2,0xf6,0xf4,0x22,0xf9,0x55,0x28,0xf5,0xdf,0xc9,0xd5,0x09,0x2f,0xd6,0xae,0x3b,0xc3,0xf1,0x44,0xd4,0x0b,0xb8,0x46,0x18,0xc5,0xdb,0xf4,0x1e,0xe9,0x4a,0x64,0x00,0x33,0xbc,0x03,0xe6,0x3e,0x2a,0x20,0xf9,0xb8,0x2a,0xec,0xc9,0x11,0xcc,0xea,0x2f,0x1b,0x1d,0xe6,0x1c,0xd9,0xd9,0xd7,0x22,0xd8,0x17,0xd7,0x0c,0x45,0xbb,0xed,0xb8,0x74,0x0d,0x20,0xd1,0x19,0x1d,0xf0,0xf9,0x7f,0x2f,0xee,0x30,0x2c,0xf4,0xf6,0x1a,0x05,0x10,0xfe,0xca,0xff,0xf6,0xdb,0x0c,0xde,0x23,0xcc,0xec,0x08,0x09,0xf4,0xd8,0xda,0xd6,0xf7,0xfd,0x0c,0x3c,0xfe,0xdb,0xdd,0x00,0x20,0xfa,0x32,0xdb,0x11,0xee,0xc7,0xf6,0x0c,0xe9,0xe8,0xf2,0x3d,0x18,0xf3,0x28,0xba,0x08,0xdc,0x04,0xca,0x04,0xbb,0xfe,0x24,0x8f,0xf1,0xc3,0x1c,0x48,0x0b,0x13,0x08,0xd1,0x05,0x5c,0xf2,0xfd,0x0d,0xee,0xf8,0x27,0xc2,0x3d,0xd6,0x1e,0x2c,0x03,0xef,0x55,0xfd,0xef,0xe2,0x18,0x08,0xee,0x04,0x0b,0xdd,0xfe,0x0c,0x5a,0xd3,0xf9,0xec,0x05,0x2e,0x02,0x5a,0x2f,0xf0,0x3c,0xe4,0xee,0x28,0xe1,0x15,0xda,0xbd,0xda,0x22,0x4d,0xe2,0x6e,0xab,0x22,0xec,0xfd,0x12,0xfb,0xec,0x20,0x12,0x81,0xf8,0xe9,0xef,0x11,0x17,0x28,0x45,0x92,0x0a,0xb5,0x10,0x35,0xbe,0xf3,0xdb,0x31,0xea,0xf1,0xeb,0xe4,0x2c,0xfe,0xe1,0x1c,0xf4,0x20,0xd9,0x23,0xfc,0x07,0x2b,0xab,0x13,0x2d,0x2b,0xdf,0x2b,0xf6,0x31,0xe7,0x06,0xef,0x06,0xfb,0x02,0xec,0x18,0x33,0x81,0x23,0x0c,0x01,0xba,0x09,0x3e,0x6a,0x67,0x1b,0xe1,0x0e,0x07,0xfd,0xd9,0xd7,0x04,0xff,0xd2,0x2b,0x08,0x2c,0xad,0xc6,0x10,0x2f,0x11,0xf0,0xde,0x03,0xd6,0x40,0xe7,0x38,0x04,0xfa,0xfb,0xfa,0x40,0x14,0x0f,0xe8,0xea,0xdb,0xf9,0xc7,0x35,0x27,0xe3,0x16,0x45,0x1c,0xe8,0x2c,0x2a,0x36,0xc3,0xf2,0x2e,0xee,0x6f,0x5b,0xe8,0x27,0x27,0xf5,0xa3,0x1b,0x00,0x44,0xec,0xcf,0xd9,0x2b,0x53,0x12,0xeb,0xd8,0xeb,0xbf,0x0e,0x43,0xa8,0x0f,0xd3,0x17,0xcf,0x10,0x2e,0x0d,0xe8,0xff,0xe2,0xf6,0x1a,0xd6,0x08,0x24,0x4a,0xa8,0x0d,0x13,0x28,0x3a,0x1c,0x69,0x25,0x08,0xfc,0x15,0x0a,0x17,0x14,0xe4,0xb7,0xe9,0xdc,0x06,0xd8,0xf9,0x3a,0x02,0xe4,0x16,0x35,0x3f,0xfb,0x11,0x7f,0x0b,0x1e,0x10,0x4b,0x10,0x48,0xe5,0x20,0xe3,0xe4,0x3f,0x28,0xd9,0x0b,0xe4,0xec,0xe3,0x0b,0xbd,0xe3,0xe2,0x77,0x1e,0xdd,0x07,0x30,0x1e,0xd6,0xe9,0x0d,0xeb,0xc4,0xfd,0x14,0xed,0xe1,0x21,0xfc,0xe8,0xcb,0x31,0xd4,0x2b,0xff,0x4e,0xff,0xf3,0xe6,0x32,0xff,0x16,0x10,0xfe,0xce,0xc4,0x04,0xf6,0xe6,0x25,0xa6,0x1a,0x15,0x08,0x1c,0x21,0xd2,0xd2,0xd9,0x1f,0xd3,0x09,0xff,0x1c,0xeb,0xf1,0x08,0xda,0xc6,0xff,0xd7,0x3c,0x38,0x29,0xf2,0x22,0x01,0xf8,0x00,0xec,0xd1,0xe6,0x34,0x1d,0xe9,0xe4,0x03,0xda,0xfe,0x11,0x09,0xf9,0xef,0x38,0x0c,0xe1,0x59,0xc6,0xbe,0xff,0xcf,0x1b,0xe6,0xf5,0xf4,0x2d,0x15,0xe5,0xca,0x32,0x3a,0x09,0xa1,0x0e,0x17,0xd9,0xe4,0x02,0xee,0xeb,0x19,0xcd,0xcd,0xf0,0xe0,0xdc,0x1f,0xec,0xcc,0xd3,0x16,0xfb,0xbf,0xa6,0x0f,0xf0,0x17,0xd6,0xcd,0x18,0xcc,0xca,0x56,0x1e,0xe9,0x1f,0xb8,0x7f,0xc6,0x30,0xe2,0xf3,0xba,0x0b,0xf8,0xcd,0xf8,0x1e,0xc8,0x01,0xeb,0xec,0xe4,0x1a,0x21,0x27,0xab,0xe5,0xe9,0xed,0x0a,0xfd,0xe5,0x1f,0x02,0xee,0xfa,0xef,0x14,0x61,0x39,0xf6,0xf0,0xeb,0x01,0x15,0xee,0x1b,0xf0,0xe2,0xb0,0x0a,0x33,0x58,0xc4,0xd4,0x02,0xe1,0x0e,0xb6,0xce,0x4e,0xd5,0x2b,0x13,0x11,0x0e,0x18,0xce,0xf6,0x49,0x01,0x5a,0xc9,0x27,0x00,0x38,0xfd,0x06,0x2a,0x3b,0xd6,0x29,0xe7,0x34,0xc6,0x0b,0xe4,0xf5,0x5b,0xe3,0x04,0xbb,0xb3,0x2f,0xac,0xd9,0x35,0x53,0x2f,0xb3,0xf6,0x18,0x38,0xb0,0x05,0x12,0x37,0x1d,0x00,0x0b,0xda,0x42,0xd7,0xb3,0xda,0xd9,0x00,0xf7,0xe8,0xdc,0x01,0xd4,0x20,0x18,0xe0,0x6e,0xf5,0x44,0x28,0xdb,0xcd,0xe3,0x2f,0xc3,0x25,0x32,0xef,0x39,0x0c,0x0e,0xf0,0xd4,0x0c,0xe0,0xee,0x12,0x49,0x2b,0xbe,0x1f,0x38,0xe4,0xec,0x8e,0x01,0xf5,0xf2,0xc8,0xad,0xfe,0xe8,0x03,0xd3,0xc9,0x3d,0x18,0x13,0x26,0xd4,0xd5,0x26,0xcf,0xef,0xf8,0xec,0xea,0x5e,0x17,0x32,0xf0,0x0b,0xe1,0x68,0x81,0x31,0xe6,0xc0,0x09,0x06,0xe9,0xf0,0x1b,0xef,0x51,0x4f,0x50,0xfa,0xdb,0xe0,0x0b,0xf5,0xe8,0xd4,0xd8,0x1d,0x06,0x15,0xf0,0x05,0xfd,0xd6,0x01,0xff,0x3b,0xd7,0x07,0xf2,0xa4,0xd4,0x06,0xfa,0x10,0xf9,0xe9,0xf0,0x17,0x28,0xff,0x0b,0x1b,0xe2,0x1f,0xfa,0xf9,0x2b,0x19,0xd1,0xe8,0xe2,0xcd,0x25,0xd6,0xf5,0xcf,0x4a,0xff,0xec,0x09,0x1f,0xee,0xfd,0x1c,0xde,0x7f,0x4d,0x50,0xd1,0xef,0x25,0xe1,0xc5,0xcc,0xae,0x1a,0xc9,0x11,0xf9,0x13,0x1b,0x0f,0xf5,0xef,0x23,0x0f,0x09,0x22,0x18,0x3c,0x2b,0xcc,0xdf,0xf1,0x12,0x17,0xdc,0x39,0xe1,0xf0,0xee,0x1a,0x04,0xf3,0x1a,0x0e,0x14,0xe5,0xf2,0x41,0x1f,0xeb,0x39,0xe7,0xfa,0x0b,0x26,0xc7,0xe9,0xd8,0xde,0xfa,0x17,0x55,0x08,0xe7,0xe4,0xba,0xf5,0xfe,0xf6,0x40,0x10,0x0c,0xda,0x02,0x19,0xe3,0x19,0xe5,0xf0,0xaf,0xe7,0xd1,0x34,0x2b,0xfa,0x07,0xec,0xd4,0xcc,0x15,0xdb,0xf9,0x20,0x1b,0xc8,0x08,0xf0,0xda,0xe0,0xef,0x30,0x19,0xe1,0xfa,0xf1,0x1b,0xe7,0xd1,0x00,0xbc,0xc7,0x1a,0xcd,0xfb,0x1a,0xf5,0x3b,0xde,0xd0,0x81,0xf1,0xe5,0x08,0xe8,0xe6,0xdf,0x03,0x42,0xff,0x41,0x14,0x15,0xde,0xc1,0x01,0xfc,0x93,0xe2,0x02,0xae,0x55,0xfc,0xbf,0xd9,0x0a,0xff,0x3a,0xc5,0xf3,0xf5,0x36,0xeb,0x25,0x01,0xd1,0xeb,0xcc,0xeb,0x29,0x73,0x11,0xd5,0xed,0x1f,0x19,0x07,0xf5,0xe3,0x6e,0xe2,0x0e,0x09,0x02,0x32,0xf7,0x96,0xdd,0x2a,0x34,0x06,0x25,0x4a,0xf6,0xef,0xd7,0x22,0x1f,0xe1,0x15,0x16,0x05,0x69,0xe4,0x10,0x11,0x5a,0x10,0xd5,0xf4,0xce,0xb4,0xd1,0x2f,0xbf,0x0f,0x38,0xfc,0xbe,0xf2,0xb4,0xee,0x99,0xeb,0x10,0xf4,0x25,0xf9,0x05,0x04,0xec,0xff,0x2b,0x4f,0x16,0xc3,0xe7,0xfb,0xed,0xf6,0xe4,0xfd,0xbf,0xf7,0x1b,0x43,0x11,0xd2,0x37,0x49,0xe6,0x11,0xd6,0x10,0xdc,0xed,0x21,0xf2,0xcd,0x14,0x1f,0x04,0x2e,0x02,0xf3,0xf4,0x18,0xe3,0x0b,0x36,0xeb,0xe5,0xec,0xc3,0x17,0xac,0xd1,0xce,0x99,0xdd,0x00,0x0e,0x33,0xe1,0x7c,0xff,0x50,0x19,0x02,0x3c,0xe9,0x0d,0x59,0xf5,0x23,0xd4,0x2a,0x37,0xf3,0x7f,0xb9,0xef,0x0d,0xe0,0x00,0x37,0x0f,0xf7,0x07,0x1e,0x43,0xb6,0x15,0x0e,0xce,0xf8,0x24,0x50,0x00,0x13,0x99,0xe1,0x10,0x17,0x44,0xd7,0x23,0xe2,0x65,0xbe,0xed,0x0e,0x30,0x08,0x59,0xa0,0x48,0xf4,0x06,0xf4,0x9e,0xb8,0xfb,0x09,0xfb,0x18,0x2f,0x1a,0x24,0xdc,0xa5,0xd1,0xda,0xc6,0xb2,0xea,0xd4,0xc8,0x2e,0x3c,0xd5,0xf8,0x1d,0xa2,0xdb,0x29,0xf3,0xb9,0x95,0x04,0x09,0xa0,0x38,0x14,0xba,0xfb,0xfc,0x2a,0xa7,0xb9,0xd0,0x35,0xfb,0x47,0xf4,0xa3,0xb4,0x33,0x9d,0xa5,0x06,0x55,0xbc,0xe3,0x54,0x43,0x18,0xff,0xdd,0xce,0x3f,0xca,0xa4,0x3c,0x1b,0x3a,0x09,0xe9,0xb6,0xd9,0x1b,0xf9,0x31,0x99,0x06,0x23,0x59,0x61,0xef,0xeb,0x33,0xb6,0x8b,0xd7,0x96,0x4e,0xfe,0x23,0x81,0x09,0xf5,0x61,0xb0,0x2d,0x21,0x56,0x54,0xfe,0xf9,0x22,0x32,0x63,0xfa,0xd4,0x59,0x53,0x72,0x26,0xf9,0xfa,0x0a,0xda,0x08,0xfa,0x4d,0x52,0x2e,0xac,0x10,0xc9,0x0a,0x27,0x14,0xff,0xcf,0xf8,0x10,0x18,0x24,0xa9,0x1d,0xe8,0xf1,0x22,0x18,0xde,0xd3,0xd7,0x1b,0xdd,0xf5,0x22,0xae,0x17,0xea,0xf3,0x00,0xf5,0xd4,0x2a,0xe3,0xf7,0x1c,0xf2,0x29,0x1f,0x96,0xc9,0x08,0x19,0x1d,0x40,0xe4,0x90,0x0b,0xff,0x5c,0xe7,0x81,0x08,0xf1,0x09,0xe4,0xf3,0x26,0xe0,0x1d,0xee,0xfa,0x41,0x1e,0x32,0xcd,0xec,0x27,0x2f,0xe1,0x6d,0x0f,0xac,0xcf,0x24,0xd4,0x09,0xde,0xeb,0x05,0x22,0x35,0xb9,0x36,0xd9,0x02,0x02,0x99,0x06,0x0e,0x41,0xd1,0xc6,0xb8,0xb5,0x48,0xed,0x49,0x3b,0xea,0xaa,0xff,0x32,0x20,0xdc,0xf9,0xee,0x4b,0xe8,0xcd,0x07,0xfd,0xa3,0xf7,0x7b,0xea,0x13,0xe4,0x0c,0x0c,0x58,0x45,0xf5,0xf3,0x39,0x2b,0xff,0xab,0xdc,0x16,0x2f,0xf2,0x26,0x49,0xf7,0x37,0x00,0xcc,0xc6,0xd3,0x09,0xe9,0x05,0xea,0x12,0x49,0x11,0xe9,0x17,0x01,0xdd,0x13,0xf3,0x0a,0x84,0xdf,0x0a,0x23,0xc9,0x22,0xef,0xd8,0x12,0xd5,0x28,0x07,0x01,0xb6,0xd9,0xcf,0x0a,0xc6,0xef,0xe3,0x11,0xcb,0xf6,0x1c,0x06,0xe7,0xfd,0xe9,0x08,0xfc,0x58,0xb7,0x25,0x0c,0x6c,0xc0,0x25,0xb6,0xef,0x1c,0x04,0x5c,0x1f,0xef,0xf4,0xd1,0xe1,0x0e,0xf9,0xd1,0xe1,0x2c,0xff,0x45,0xe5,0xf1,0x4b,0x01,0xcb,0x1e,0xfd,0xf0,0x21,0xcd,0x25,0x26,0x12,0xe0,0xfb,0x20,0xd5,0xf1,0xf7,0x19,0x0e,0x18,0x3b,0xde,0xca,0xaf,0x41,0x20,0xbf,0x93,0x81,0x09,0xf9,0xba,0xe6,0xff,0xf1,0xb8,0x09,0x4b,0xf3,0xe7,0xdd,0xe6,0x07,0xfd,0xf4,0xf1,0x60,0x63,0xf6,0x0c,0xd1,0x12,0xf9,0xf6,0x01,0xdf,0xf0,0x81,0xd9,0xfb,0xdd,0x01,0xbf,0x47,0x25,0xdd,0xd8,0x84,0x00,0x1d,0x26,0x0f,0xf4,0x3a,0x26,0xeb,0x18,0x02,0xf6,0xfd,0xf3,0x01,0xf8,0x24,0xb8,0xbf,0xf1,0xdc,0x23,0xfb,0x0b,0xbb,0x09,0x48,0x3b,0xfc,0x0d,0x1b,0x06,0x4d,0xfe,0xa7,0xf6,0x23,0xf8,0xb9,0x4b,0x02,0x75,0xf5,0xf5,0x16,0x06,0x14,0xcc,0xf4,0xfa,0x7d,0x03,0xc3,0x0e,0x01,0x13,0x1a,0xcd,0xed,0x20,0xef,0x25,0xa7,0xf4,0xea,0x11,0x55,0xe6,0x14,0xe1,0x09,0xe1,0xdd,0xfb,0xc5,0x62,0x2a,0xfb,0xfa,0xea,0xfb,0x24,0xac,0xec,0xd8,0xe0,0xf2,0xea,0xda,0xda,0xe2,0x73,0xc8,0x0f,0x96,0xdb,0xe4,0xc7,0xd0,0xf6,0x47,0xd4,0x08,0xbe,0x5b,0xe7,0xfc,0x2e,0x43,0x24,0xbb,0x2d,0xff,0xe7,0x3a,0xf9,0x06,0xf7,0xeb,0xf4,0xf3,0xc3,0xd2,0xe3,0x0c,0xd3,0xe2,0xee,0x0a,0x04,0xef,0xf6,0x30,0x26,0x0f,0xec,0xbb,0xc8,0x0a,0xd0,0x14,0xe1,0xf1,0x27,0x00,0xe9,0xe8,0xdd,0x01,0x20,0xd8,0x47,0x16,0xf0,0xe6,0x0a,0xd6,0x1b,0x34,0xe7,0x26,0x14,0xf6,0xfe,0x2d,0xdc,0xec,0xdf,0xed,0xea,0xea,0x10,0x30,0x0a,0xdb,0xe6,0x35,0x24,0xf7,0xf9,0x44,0xfd,0x1b,0xac,0xc1,0x2e,0xc7,0x15,0xd4,0xd4,0xd4,0x1a,0xeb,0xe7,0x21,0x2f,0xe6,0x0c,0xe8,0x38,0x3e,0xd9,0x05,0x38,0xac,0xf2,0xe0,0xeb,0xd7,0x0b,0xf9,0xfb,0xf7,0x08,0x02,0x24,0x10,0x7f,0xe9,0xe1,0x1c,0x2b,0x0f,0x10,0x05,0xec,0x4e,0xc7,0xf6,0xd4,0xf6,0x1e,0xd8,0x0a,0xdc,0x1b,0xbb,0xc6,0xde,0x1a,0xfe,0x30,0xae,0x1b,0x29,0x53,0x06,0xed,0xd9,0x08,0xf4,0xd2,0x1c,0x19,0x14,0x14,0xc1,0x20,0x11,0x14,0x31,0x00,0x0c,0x26,0xe7,0x1c,0xbf,0x1a,0xe5,0xcf,0xb5,0xe9,0x00,0xec,0x1d,0xc0,0x7f,0x33,0xd1,0xfb,0x1b,0x30,0x02,0xf5,0x25,0x00,0xe9,0xcd,0x4a,0x21,0x16,0xc2,0x49,0xe2,0xfc,0xc4,0x39,0xbc,0x11,0xce,0x4e,0xf2,0xff,0xfe,0x01,0xe9,0x23,0x30,0xfa,0x27,0xd8,0x24,0xeb,0x52,0xd5,0xec,0xce,0x09,0xcf,0xe6,0xe9,0x12,0xe8,0xe0,0x06,0x0a,0x46,0xfe,0x09,0x29,0xcf,0xc1,0x10,0x42,0x27,0xec,0xf8,0x30,0x00,0x21,0x2b,0x02,0xc4,0x21,0xbe,0x2a,0xfc,0xe6,0xf9,0xf3,0xdd,0xf7,0x05,0xd6,0xc8,0xd8,0x23,0x1b,0xeb,0x20,0x11,0x2f,0x11,0xe2,0xf6,0xe7,0xb6,0x26,0xec,0xfb,0x02,0xef,0x01,0xec,0x08,0xed,0xe3,0xc8,0x2c,0x13,0x37,0x14,0x3e,0xd3,0xe0,0x0b,0xdc,0x14,0xee,0xcf,0x2b,0xe4,0xf2,0xf3,0xbc,0xdd,0xfa,0xfa,0xd2,0xf0,0x26,0xb7,0x31,0xd0,0x07,0x0e,0x03,0x4a,0x43,0x0a,0x1a,0xf1,0x25,0xf4,0x4b,0x06,0xef,0x37,0xf0,0x13,0x1c,0xe2,0xe1,0xd7,0x1d,0xe1,0xe6,0xf6,0x44,0xe9,0xd1,0x05,0xf2,0x36,0x2e,0xfd,0x34,0x0a,0xc2,0x43,0xd2,0x15,0xfc,0x20,0x0a,0xd5,0xe7,0xcb,0xf6,0x0f,0xe5,0xf8,0xfd,0x06,0x0a,0xdf,0xe5,0x14,0x1b,0x24,0xb8,0x00,0xc9,0x16,0x0b,0x0b,0xdd,0x03,0x34,0xfa,0x10,0x2b,0x08,0x2a,0x5e,0xdd,0x7f,0xf4,0xe6,0xcf,0xd6,0xfb,0x06,0xe3,0xcb,0x06,0xf3,0x2b,0x15,0xee,0xa3,0xc6,0xee,0x06,0xf2,0x2f,0xef,0x20,0xee,0x0d,0x0f,0x05,0xf5,0xf6,0xe0,0xcf,0xde,0xfc,0x17,0xea,0xec,0xd0,0x17,0xf2,0x1e,0x02,0x1c,0xe8,0x0a,0x47,0xd8,0xdf,0xed,0xfb,0xf1,0xf4,0x0b,0x3b,0x08,0xf0,0x13,0xf3,0xe3,0xcd,0x3f,0xc4,0x15,0x00,0x7a,0x35,0x05,0x0a,0xda,0x09,0xf3,0x06,0xfb,0x1d,0x23,0xf8,0xe1,0xda,0xe6,0xfd,0x4b,0x26,0x20,0x50,0xe5,0xf1,0x30,0xbf,0xfd,0xf3,0x25,0xf3,0xc1,0x0a,0x23,0xb9,0x51,0x11,0xde,0xbf,0x1f,0x0c,0x08,0xf7,0x00,0x1a,0xe2,0x0b,0xe5,0xed,0xea,0x10,0xda,0x0e,0x16,0xfa,0xf7,0xf3,0xfc,0xa2,0xde,0xe8,0x29,0x44,0xa0,0x16,0xcf,0x81,0x34,0xf7,0xea,0xf6,0xe9,0x3f,0x30,0x17,0x1a,0xe9,0x06,0xfc,0xd4,0xd6,0xf8,0x30,0x0c,0x4c,0xe9,0x07,0x02,0xf8,0xe4,0xf5,0xdd,0xea,0xfa,0x1a,0xad,0xbb,0x41,0x60,0x0f,0x31,0x18,0x43,0xdd,0x1f,0x04,0x0a,0x1f,0x06,0xb0,0xd2,0xbd,0x38,0x15,0x1e,0xfe,0xf4,0xc1,0x27,0xeb,0xe8,0x05,0x18,0xea,0x39,0xf1,0xdd,0x44,0xc6,0xda,0x12,0xef,0xe9,0x36,0x0e,0x1b,0x23,0x17,0x07,0xf9,0xfd,0x81,0x28,0x2e,0x26,0xf3,0xae,0xf5,0x19,0x35,0x2c,0x1b,0x05,0xda,0xd2,0x0a,0xe0,0x0b,0xb3,0xf5,0xd6,0xcd,0xf1,0x0f,0xf9,0xf8,0xed,0xb9,0x22,0x23,0xbf,0x19,0x07,0xec,0xd9,0x06,0xce,0xbd,0xfd,0xdf,0xfb,0xdc,0x03,0xb6,0xdd,0xd3,0xb3,0x01,0xe4,0x0f,0x3c,0xa9,0xd8,0xc8,0x8f,0x0c,0x39,0xce,0x22,0x00,0x1e,0xb2,0xf3,0xec,0x1f,0xfb,0x0b,0xf8,0x26,0xfc,0x47,0x34,0x33,0x08,0x16,0xe5,0x0a,0x05,0xd4,0xe5,0xdd,0xe9,0x0d,0xc7,0xdf,0x11,0xf9,0x05,0x21,0x01,0x27,0xf3,0xdb,0xfa,0xd4,0x07,0xc8,0xd9,0xf8,0x05,0xd6,0xdb,0xf0,0xbd,0x21,0xec,0xfd,0x04,0x39,0x4d,0xc9,0x29,0x7f,0xea,0xf1,0xfb,0xd0,0xdb,0x25,0xda,0x19,0xd2,0x0c,0xec,0xa8,0xe2,0xf5,0x13,0xcc,0x05,0x0a,0xa0,0xee,0xe4,0x0a,0x1e,0x06,0x0c,0xf1,0xd0,0xef,0x02,0xde,0x30,0x06,0x03,0x10,0xda,0x31,0x74,0x21,0xd1,0xff,0xe9,0xf6,0xd8,0xf9,0x25,0x56,0xf3,0xe7,0x06,0x25,0x06,0xf3,0xf7,0x03,0xd6,0x08,0xeb,0xf7,0xea,0xf0,0x1d,0x64,0x0b,0xcf,0xf5,0x30,0x48,0xce,0x2e,0xc1,0xe5,0xd9,0xf2,0xdc,0x3c,0x0d,0xf3,0x07,0xfa,0xf3,0xc5,0xc0,0xd9,0x11,0xd3,0x02,0xe6,0x32,0xba,0x43,0x31,0x07,0xfd,0xc1,0xed,0xfe,0xef,0x43,0xd7,0x06,0x52,0xf8,0x2c,0xf1,0x51,0x1a,0xd8,0x23,0x03,0x1e,0x23,0x21,0xb8,0xf7,0x1e,0xf7,0xff,0x04,0x28,0xfc,0xff,0x14,0x6c,0x13,0x1c,0xbb,0xca,0x13,0x47,0x19,0x29,0xff,0xde,0x1d,0xfe,0xee,0xb6,0x18,0xc3,0xf1,0x1a,0xd5,0x11,0xc7,0xd7,0x2c,0xc5,0x27,0x24,0x07,0x19,0x02,0xb3,0xe0,0xfc,0x0a,0x3d,0xc0,0x13,0x04,0x37,0xca,0x1f,0x02,0x32,0xd3,0xdf,0x0b,0xf7,0x1c,0xd1,0x39,0x14,0xe4,0xec,0xf2,0xef,0x02,0x12,0x1a,0xf1,0xce,0x15,0xe5,0xef,0xdd,0x1b,0x15,0x26,0x48,0x1b,0xd1,0x28,0x1e,0x4a,0x38,0xc6,0x81,0xb2,0x42,0x1c,0xa6,0x16,0xd5,0xee,0xc5,0x00,0xd8,0x09,0xda,0x18,0xde,0xdb,0xfa,0xec,0x34,0xd2,0x15,0x34,0x0d,0x61,0x1b,0xc2,0xe0,0xe2,0xef,0xec,0xf4,0x13,0xe7,0x13,0xde,0xf3,0x4d,0xe5,0xdf,0x22,0xde,0x13,0x40,0x06,0x1d,0xe2,0xf6,0xad,0x6f,0xaf,0x23,0x3f,0xda,0xf1,0xfd,0xf8,0xae,0xdd,0xf9,0xc1,0x0a,0xfa,0x42,0x81,0x23,0xf9,0xf8,0x54,0xcb,0xbb,0x21,0xfa,0xbd,0xe8,0xca,0x38,0x51,0xe0,0xdd,0x10,0x69,0xf0,0x2b,0x0d,0x23,0xf3,0x0e,0xd3,0xa8,0xe9,0x22,0xf4,0xec,0x3b,0x6b,0x0e,0xce,0xfb,0x50,0xe1,0x1d,0x60,0x2d,0x2f,0x0d,0x16,0xe2,0x67,0xa3,0x09,0x2b,0xed,0x06,0x02,0x7c,0x29,0xc7,0xc6,0x1a,0xe6,0x4e,0xc6,0x3a,0xdc,0xb9,0x2e,0xaf,0x31,0x51,0x94,0x39,0x12,0xd6,0x2a,0x0d,0xd9,0xd8,0x35,0x3e,0x15,0x26,0x17,0xd8,0x33,0x0e,0x93,0x76,0x01,0x01,0xdf,0x11,0x07,0xda,0xa0,0xa9,0x46,0x36,0x3f,0xe2,0xa4,0xd2,0x0a,0xf9,0xae,0x0f,0xad,0x09,0x20,0xec,0x9c,0x6a,0x6e,0xee,0xba,0x08,0x47,0xd2,0x03,0xf2,0xc0,0x4f,0x34,0xfb,0xa3,0x62,0x5a,0xdf,0xfd,0x1e,0xfe,0xf5,0x6f,0xe6,0x12,0x08,0x30,0x20,0xbd,0xcd,0x0f,0xe6,0xde,0x01,0xad,0x1d,0x62,0xef,0x20,0x4c,0x61,0x10,0xba,0x2b,0x19,0x08,0xcf,0x50,0xf7,0xdc,0xc6,0x4e,0xe5,0xee,0x2b,0xd7,0x03,0x1a,0xf6,0xe8,0xe5,0xbd,0x33,0x1c,0xe4,0xf1,0x95,0xcd,0xce,0x58,0x1b,0x00,0x42,0x7f,0x84,0x6e,0xce,0x0f,0xbd,0x20,0xe9,0x18,0x1b,0x1e,0xfd,0x14,0x32,0x2b,0xfd,0xd3,0x25,0xe2,0x13,0xfb,0x02,0x57,0xfd,0x58,0x20,0xfc,0xf1,0x9d,0xfc,0x02,0xf5,0xf4,0xfc,0xba,0xcd,0x77,0xfe,0x04,0x7a,0xa9,0x01,0x19,0xc0,0xef,0xeb,0xd4,0xe3,0x19,0x22,0x54,0xe5,0xd7,0x06,0xfe,0xb5,0xe7,0xdc,0xa0,0x15,0xc1,0xfc,0x23,0xf5,0xd9,0x29,0x23,0x47,0xfe,0x3c,0x8c,0xe8,0xd6,0xb7,0xff,0x04,0xdb,0xf9,0xe3,0xe7,0x20,0x90,0x10,0xed,0x11,0xde,0xff,0xfc,0xf6,0xf1,0x0c,0xa8,0x6b,0xc3,0x12,0x0f,0x26,0x1e,0x07,0x5b,0x3f,0xc4,0xee,0xf0,0x40,0xdb,0x7f,0xba,0x23,0x5d,0xac,0xcf,0x15,0x42,0x32,0x0f,0x51,0x32,0x06,0xc3,0x23,0xe3,0xfa,0x24,0x2d,0xf8,0x35,0xdf,0x4c,0x34,0xb1,0x88,0x08,0x16,0x2a,0x3d,0x15,0x95,0x3c,0x4e,0xe4,0xdc,0xb4,0x1b,0xdb,0xc0,0x14,0x5e,0xd5,0xe5,0xc8,0xb7,0x0f,0xe4,0xdd,0x40,0x22,0xde,0xfb,0x1d,0x38,0xe5,0xf7,0xd4,0xeb,0xfe,0x0d,0xed,0x63,0x30,0x43,0x5d,0xd5,0xf9,0xe3,0x09,0xf5,0xee,0x13,0x07,0xd0,0x03,0xf3,0xe1,0x48,0x1f,0x41,0x29,0xdf,0x02,0x1b,0x1f,0x0d,0x10,0xf1,0xc2,0x00,0x2a,0x9b,0x08,0xcd,0x30,0x01,0xd9,0x06,0x1b,0x07,0xee,0xf3,0x06,0x2d,0x4a,0xf4,0xfd,0x1b,0x2f,0xc9,0x1b,0xda,0xc8,0x19,0x1b,0xcd,0x19,0xf9,0x00,0x13,0xf5,0xe7,0x09,0x22,0x7f,0x0d,0xed,0x11,0x71,0x01,0x1e,0x02,0x09,0x08,0x27,0xe0,0x4b,0xec,0xe8,0x0a,0x2c,0xe4,0x2c,0x00,0xff,0xf6,0x20,0x14,0xe7,0xcb,0xc5,0xf8,0xf1,0x04,0x26,0x17,0x18,0xff,0x10,0xd1,0x0d,0x2b,0xe8,0x06,0x19,0xcf,0xf3,0xe0,0xc5,0xcd,0x31,0x27,0xe3,0x52,0x0c,0x0f,0xcf,0x0a,0x18,0x20,0xe7,0xf1,0xa9,0xdb,0x13,0xf4,0x02,0x16,0xf2,0xfb,0x36,0xea,0xf9,0x2c,0x1f,0x13,0x3e,0x2a,0x5f,0xb2,0x3e,0xd9,0xee,0xdf,0x1d,0x32,0x2d,0xf4,0x30,0x1b,0xfc,0xf1,0xee,0xca,0xf9,0x20,0xb4,0xfc,0x18,0x3f,0x4b,0xb2,0xa4,0x17,0xeb,0x39,0xc9,0xe1,0xef,0x1a,0x4e,0xea,0x50,0xf5,0x00,0x1f,0x05,0x20,0x70,0x08,0x28,0x08,0xd1,0xc0,0xf1,0xfe,0xc6,0xbc,0xdf,0x1c,0xca,0x75,0x42,0x1f,0x5a,0xda,0x44,0x38,0x0f,0xde,0x81,0x10,0xea,0x39,0xec,0xf5,0x1b,0xfc,0x12,0x2a,0xdf,0xa4,0xee,0xf0,0xed,0xaa,0xf3,0xaf,0xfc,0x03,0x7d,0x17,0xe2,0x01,0xf2,0x07,0xcd,0x14,0x02,0xc5,0xf7,0xaa,0x21,0xe9,0x7e,0xe0,0xdd,0xf6,0xec,0xfa,0x0a,0x52,0x15,0x0a,0xef,0x3a,0x33,0xe1,0xfa,0x4f,0x28,0x7b,0xc6,0x9f,0xe6,0x42,0x18,0x68,0xdf,0x0f,0x5d,0xef,0xda,0x3d,0x0f,0xad,0xb0,0x40,0xee,0xbc,0xcd,0xdf,0x09,0x01,0xdf,0x54,0xe7,0x18,0x00,0xd6,0x26,0xf7,0x41,0xc3,0xa7,0x0f,0x0b,0xc4,0x02,0x13,0x14,0x2a,0xc6,0x5c,0xf6,0x33,0xb5,0x09,0x22,0x66,0xbe,0xdd,0x3e,0xe8,0x7a,0xfc,0xec,0xbd,0xb5,0x23,0x35,0xd7,0x20,0x98,0x2b,0x03,0xe9,0xef,0x0e,0x13,0x0c,0xcf,0xb3,0x26,0x53,0x0f,0xca,0x00,0x2c,0xf6,0x9b,0x30,0xf7,0xfd,0xa8,0x4e,0xb6,0xe1,0x49,0x1b,0x21,0x02,0x29,0xff,0xe9,0xc4,0xc5,0x20,0x73,0x3a,0xd1,0x56,0x00,0xc4,0x30,0xcd,0xc6,0x18,0xe8,0x64,0x6f,0xd5,0x22,0xec,0x17,0x81,0xff,0x06,0xad,0xa8,0xe0,0x04,0xe1,0xfd,0xfc,0x23,0x46,0x20,0xb9,0xe6,0xf5,0x3b,0x0d,0x15,0x2f,0xfd,0x0a,0x43,0xe4,0x26,0x12,0x30,0x07,0x36,0x2d,0x0e,0xca,0xf4,0x22,0xf7,0x01,0x2a,0xf1,0x25,0xdf,0x72,0x27,0x27,0x2d,0x38,0x41,0xb9,0xcb,0xb3,0xff,0x1d,0x09,0x20,0x23,0xdf,0x29,0xfe,0x16,0x20,0xb1,0x31,0xfe,0xf2,0xe6,0xf8,0x1f,0xf4,0xe8,0xe1,0xa7,0xe4,0x30,0x12,0xe1,0xdf,0xf5,0x49,0xf7,0xe8,0xf7,0x09,0xc3,0xf4,0x5b,0xf2,0xb3,0x90,0xb9,0xfe,0x25,0xe6,0xff,0xde,0x91,0xcf,0xe2,0xfa,0x7f,0xeb,0x15,0xcf,0x1d,0xc7,0x08,0x24,0xf2,0xd9,0xe8,0x19,0xf2,0xf5,0x07,0x18,0xfc,0x17,0xfb,0xfc,0x1c,0x1a,0x7b,0xf0,0x1d,0x06,0x10,0x42,0x3b,0xdb,0x09,0xf2,0xbc,0x8c,0x38,0xfa,0xd4,0x5c,0x2e,0xfc,0x23,0x13,0x22,0xfe,0x24,0xeb,0x5a,0xe1,0xe9,0x0e,0x81,0xee,0x63,0xf3,0xf7,0xfe,0xd6,0x29,0xec,0x15,0xe4,0x0e,0xe7,0xe1,0xd0,0xe2,0xf1,0xc8,0x22,0x29,0xf3,0x25,0x39,0x3a,0xfe,0x1c,0xdf,0x05,0x31,0x12,0x13,0xc7,0xea,0xd5,0x1e,0xc8,0xf2,0x14,0xef,0xd0,0x26,0x59,0xb4,0x1d,0xf2,0xeb,0x07,0xfe,0x20,0xf3,0xb6,0x21,0xac,0xd0,0xda,0xe8,0xfa,0x3f,0x10,0xf7,0x04,0x1b,0x40,0x11,0x33,0xeb,0xfe,0x25,0xda,0xbd,0xe9,0x22,0xe0,0x39,0xf0,0xb0,0xf1,0x68,0x15,0x0b,0xe2,0x09,0xc0,0xac,0x06,0xdf,0x13,0xc9,0xcb,0x36,0xe1,0x22,0xde,0x0d,0x25,0x1d,0xf7,0x07,0xcf,0x39,0x47,0x1f,0x7b,0x2f,0xf9,0x4a,0xea,0x1b,0x14,0x11,0xef,0x10,0x27,0x07,0x0a,0xec,0x33,0x07,0x1a,0xed,0x32,0xff,0x28,0xe0,0xe1,0xfe,0xe8,0x11,0xdf,0x28,0xba,0x10,0x20,0xb6,0xfb,0x0a,0xf3,0x00,0xe2,0x0d,0xfb,0xf0,0xda,0xe8,0x15,0xe1,0x2d,0xdb,0x27,0xfe,0xe2,0xfb,0xfb,0xcd,0x0a,0x0d,0xe2,0x1a,0xfd,0xf0,0x42,0x29,0x03,0xe9,0x0d,0xf7,0xf3,0xed,0xf0,0xeb,0x16,0xf0,0xde,0x18,0x0b,0x15,0xed,0x54,0xbc,0x07,0xe1,0xff,0xf9,0x14,0xf9,0xe1,0xf3,0xfe,0xdd,0x00,0xe8,0xe4,0xe0,0xe6,0x0a,0xcc,0x01,0xd0,0xe6,0xd7,0x0b,0xe4,0x02,0x40,0x2d,0xcb,0xe4,0x15,0xd8,0xfb,0xf9,0xf2,0x10,0xd4,0xef,0x18,0xcd,0xcd,0xda,0x7f,0xfe,0x05,0x2b,0xea,0xf7,0xe6,0x0e,0x2d,0xed,0x01,0xd4,0xfa,0xe5,0x02,0x07,0x29,0x03,0xf7,0x1b,0x1a,0x06,0xdf,0x27,0xef,0xec,0xdf,0x26,0x03,0xf5,0xee,0xfc,0xda,0xd2,0xf9,0x0a,0x4a,0xf7,0xcc,0x63,0x39,0x36,0xcb,0x2c,0x05,0xdd,0x36,0xe4,0xbd,0xdc,0xb2,0x0a,0xc5,0xb9,0x17,0x7f,0x02,0xd4,0xf7,0x07,0x19,0x3d,0x0e,0xc6,0xc8,0xcd,0xc9,0x06,0xe3,0xb2,0xac,0xd3,0x25,0xdb,0xfb,0x21,0x33,0xe9,0x30,0x8c,0x21,0xc4,0xbc,0xa1,0x24,0xaa,0xc3,0x06,0xec,0xe3,0x36,0x32,0xa2,0x62,0xf9,0xa2,0x17,0x25,0x0e,0xee,0x06,0x32,0xdb,0xfd,0x00,0x77,0xf4,0xc2,0x1c,0x47,0xee,0x06,0xb0,0x4a,0xaf,0xe8,0x03,0xc2,0x1f,0xc9,0xe7,0xd9,0xea,0xf7,0x00,0xe5,0xc7,0x10,0x39,0x6c,0xd7,0x19,0xf8,0x0d,0x12,0xd1,0x0d,0x2b,0x01,0xfe,0x50,0xc4,0xb5,0xe8,0x06,0x0c,0xe7,0x38,0x77,0xe9,0xec,0x0e,0x0c,0xf0,0xff,0xef,0x02,0x0b,0x05,0xa3,0x27,0xc5,0x2a,0x20,0x14,0xed,0x26,0xbf,0x20,0x04,0xd0,0x19,0x30,0x06,0x2e,0x43,0x1a,0xe5,0xef,0xd5,0xf2,0xe7,0xf4,0xc4,0x24,0xee,0x4b,0xf1,0x2d,0x00,0xe4,0xe9,0x16,0x3c,0x34,0x1a,0x9d,0xf4,0xe1,0xc8,0xf9,0x38,0x0d,0xff,0x26,0x10,0x24,0xf9,0x97,0xa9,0x3c,0x34,0xd8,0xcd,0xf8,0x21,0x0c,0xc9,0xe8,0x07,0xc2,0xfc,0x3c,0xb3,0xe1,0xdc,0x13,0xed,0xa4,0x59,0xe6,0x11,0xfa,0x22,0xd5,0x0c,0x1d,0x27,0x1e,0x25,0xb9,0x03,0xe8,0xfe,0x36,0xf1,0xd9,0x3f,0x1d,0xe5,0x32,0xca,0xf7,0x0d,0x28,0x37,0xe3,0xf2,0xf3,0xef,0xe9,0xf8,0xfa,0x22,0xd9,0x5f,0x06,0x55,0xf8,0xd3,0x05,0x17,0x37,0x72,0xf6,0xb3,0x12,0x2b,0x06,0xd3,0xee,0x17,0x13,0x3b,0x29,0x81,0x87,0xe5,0x40,0x4c,0x06,0xd2,0x3f,0x7f,0x0b,0x4c,0x48,0x3e,0xc6,0xf4,0x36,0xc2,0xde,0x28,0x02,0x2d,0xef,0x08,0x06,0x27,0x48,0x62,0x19,0x3c,0x0f,0xe7,0x10,0x1f,0xd4,0xcb,0x87,0xff,0xd0,0xfb,0xe4,0xfd,0x13,0x21,0xff,0xcb,0x1f,0xe4,0x4e,0x0d,0x18,0xf8,0x6b,0x30,0xeb,0xfe,0x35,0x34,0xd3,0x33,0xe3,0xb8,0x57,0xd8,0xee,0xc0,0xbd,0xa8,0xea,0xfd,0xc5,0x02,0x1b,0xda,0x61,0xf2,0xe5,0xf7,0x15,0x05,0x13,0xda,0xda,0xc0,0x06,0xaf,0x1c,0xd7,0xd0,0x58,0x45,0x2e,0xdd,0xfa,0xd6,0x5b,0xec,0xbd,0x14,0xc5,0x26,0xd7,0x18,0x0c,0x19,0xba,0xf1,0x08,0x13,0x22,0x1c,0xda,0x68,0x44,0x0d,0x30,0x2c,0xf3,0xdc,0x4a,0x19,0x1d,0x2d,0x1c,0x21,0x30,0x00,0xf3,0x1f,0x01,0xed,0xea,0xc2,0x56,0xe7,0xe6,0xce,0xf1,0xfc,0x15,0x19,0x7f,0x9a,0x9c,0xa4,0x47,0xf6,0x08,0xe9,0x8c,0x11,0xaa,0x12,0xcc,0x22,0xea,0xb8,0xe5,0xea,0x16,0x01,0xdf,0x9f,0x96,0xfd,0x46,0x22,0x0e,0xc1,0x11,0x04,0xa9,0xf6,0xc7,0xf0,0x04,0x4e,0xea,0xdb,0x8e,0x39,0x05,0xdb,0xe4,0xf4,0x8d,0xd7,0x15,0x27,0xb0,0x18,0xf3,0xe0,0xd8,0xf1,0x3b,0x1b,0x17,0x5c,0xd4,0x31,0x13,0xc9,0x08,0x00,0xbf,0x2a,0x5e,0x4e,0x03,0x1b,0xe1,0x32,0x20,0xfa,0x38,0x2e,0x26,0x4d,0xe0,0x0c,0x28,0x00,0x54,0x99,0xd7,0x10,0x2f,0x27,0xef,0x0c,0x14,0xd4,0xa5,0x45,0x18,0xf1,0x10,0xec,0x43,0x9f,0xdc,0xe7,0xce,0xbb,0x13,0x32,0xdd,0x29,0x91,0x3f,0xdc,0x02,0x02,0xf8,0xcf,0x2b,0x47,0xa4,0x48,0xdb,0x29,0x2b,0xe8,0xfd,0x08,0x0d,0xf6,0x4a,0x02,0xf4,0x13,0x28,0x17,0xd9,0x2f,0x0b,0x3a,0xd5,0x0e,0xee,0x00,0x0a,0x0e,0x26,0xf8,0xf1,0x1a,0x0a,0x13,0x53,0x01,0xda,0xac,0x50,0xfb,0xe0,0xe0,0x14,0xf8,0x02,0xdd,0xe6,0x10,0x3f,0xc6,0xff,0x33,0x0f,0x32,0xf7,0x2f,0x09,0x69,0xeb,0xd9,0xe3,0x36,0xec,0xeb,0x25,0x11,0xed,0xdc,0x3d,0x0c,0x02,0x41,0xd1,0xe4,0xff,0xc5,0x1a,0xf3,0x08,0x14,0xd9,0x7f,0xee,0x12,0xda,0x2e,0xd4,0xfd,0xe2,0xcf,0xe9,0xc1,0x34,0xcc,0xe1,0x1d,0x15,0x24,0xcf,0x22,0x5b,0xa4,0x09,0x11,0xca,0xd6,0xdf,0xea,0x18,0x0e,0x58,0xce,0x0b,0x1c,0x02,0x08,0xce,0x26,0xca,0x27,0x45,0xce,0x2b,0x13,0xcf,0xea,0xdf,0x5f,0x54,0xcf,0xe5,0x88,0x0d,0x13,0xfb,0xf6,0xcf,0xe3,0xf1,0xfb,0xd1,0x03,0x21,0x41,0xd5,0x09,0x0c,0xd7,0xda,0x0e,0xcb,0xf8,0xe4,0xe8,0x02,0xee,0xbc,0x2b,0x08,0x2c,0xf8,0xdc,0xdb,0xcc,0x2f,0x14,0x19,0x3f,0x14,0x3f,0xe1,0xde,0xfc,0x0c,0xc7,0xea,0x30,0x07,0xfc,0xe4,0x18,0xe9,0xe8,0xdb,0xf4,0xae,0xeb,0xf9,0x3b,0xb2,0xf2,0xe4,0xf9,0x01,0x28,0xd9,0x49,0x03,0xc5,0xdb,0xd5,0x1e,0x1b,0x10,0xfe,0xea,0xef,0x23,0x40,0x45,0x13,0xe3,0x27,0xeb,0x29,0x1e,0xfe,0xf8,0x4f,0x1a,0x2f,0xea,0x0b,0x09,0x1f,0x10,0xda,0xed,0xe7,0xfa,0xee,0x3e,0xee,0xcd,0x10,0xed,0x51,0xe6,0x1b,0x21,0xca,0x1a,0x7f,0xed,0x1b,0xbd,0xfc,0x28,0xf2,0xe2,0x2f,0xec,0xd1,0x2b,0xf8,0xdc,0x6a,0x16,0x35,0x44,0x42,0xf9,0x24,0xf3,0xf1,0xb8,0x39,0xd9,0xeb,0xfe,0x46,0x0b,0xd4,0xf6,0xf8,0x3c,0xf8,0x27,0x22,0x16,0x1b,0x10,0x37,0x28,0xfa,0x02,0x05,0xc5,0xdd,0x27,0xdb,0x46,0xe4,0xb9,0x0d,0xfc,0x0b,0xc8,0xf6,0xeb,0xf9,0x0b,0x16,0xfc,0xf7,0xd6,0xd3,0x00,0xdc,0x11,0xe3,0x35,0xf9,0xf1,0xea,0xde,0x11,0x15,0x5b,0x29,0xeb,0xeb,0xfe,0x0e,0xcf,0xe1,0xe6,0xf7,0xe7,0xf7,0xda,0x0a,0xed,0x16,0x66,0xcc,0xd2,0x24,0xf8,0x35,0x10,0xc9,0xdb,0xe3,0x26,0x1d,0xdc,0xd7,0x1c,0x26,0x58,0x0d,0x0f,0x15,0x41,0x02,0x09,0xc6,0x15,0x1e,0xff,0xf8,0xe2,0x19,0xdd,0xeb,0x12,0x81,0x1b,0xe6,0x41,0xe2,0x1f,0xe5,0xfc,0xa1,0xe8,0xe5,0x06,0x1c,0xd8,0xf7,0x23,0x30,0xd3,0xd1,0x5c,0xa7,0xcb,0x35,0x01,0x07,0x67,0xe0,0x15,0x1b,0x0f,0xf9,0x17,0x4b,0xe9,0xfc,0xf9,0xad,0xe6,0x0d,0x12,0x07,0x23,0xd3,0x0d,0xef,0x0a,0x42,0xff,0xe6,0x17,0xe4,0x19,0xd5,0x24,0x43,0xde,0x4a,0xc7,0xca,0xde,0xeb,0x28,0xbe,0x27,0x10,0xe3,0x0e,0x0c,0xc6,0xaf,0x34,0xc5,0xc5,0xa9,0xdd,0xde,0x10,0xfc,0xdd,0x3a,0x20,0x2e,0x05,0xbb,0xe3,0xfe,0xca,0x10,0x09,0x4e,0x0b,0x7f,0xf5,0xf3,0x08,0x0b,0x27,0xc9,0xdb,0x1d,0xe0,0xd7,0xf4,0xfb,0x0c,0x05,0xf7,0x1f,0xe5,0xce,0xd9,0xda,0x4a,0xd6,0xd6,0x4e,0x88,0x31,0xee,0xfb,0xd5,0x36,0xc7,0x1d,0xee,0xef,0x08,0xdd,0x34,0x34,0x31,0xce,0xf1,0xda,0xdf,0x0e,0xda,0xd6,0x18,0xdf,0xdf,0xfd,0x1b,0xde,0xfc,0xde,0xc0,0x9d,0xfe,0xde,0xf2,0x1c,0x04,0xbf,0x0a,0x05,0x8b,0x11,0xb2,0x1e,0x1d,0xa5,0xea,0x1d,0xe9,0xe4,0x19,0xcc,0x13,0xcb,0x19,0x0f,0xf1,0xb0,0xcf,0xe6,0xec,0x01,0xdb,0x11,0xf4,0x3e,0x33,0x16,0xcc,0x1a,0xf2,0xff,0xa5,0xef,0xce,0x13,0x12,0x18,0x12,0xf0,0xe4,0xf3,0xea,0x06,0xbf,0xc4,0xf9,0x33,0xc1,0x06,0x1f,0xe1,0xd0,0x27,0xef,0xfb,0xfa,0xdb,0x06,0x2b,0xff,0xe2,0xbe,0x17,0xdb,0x1b,0x09,0xf7,0x2d,0x0d,0x4a,0x2c,0x0c,0x33,0xfd,0x03,0x01,0xe1,0xf4,0x4b,0x05,0x0b,0xcf,0x36,0x33,0xed,0x26,0x09,0xe1,0x13,0x09,0x04,0x35,0x17,0xf2,0x35,0xd3,0xfe,0x2b,0xdc,0x56,0x3a,0xdc,0x1c,0xd2,0x2f,0x01,0xe4,0x9f,0x36,0x71,0xd5,0x30,0xe3,0x12,0x44,0x25,0xec,0x81,0xfb,0x4a,0x08,0xe3,0x4a,0x22,0xd4,0x37,0xd4,0x37,0x1f,0x37,0xd1,0x07,0x1d,0xdd,0x06,0xfb,0x10,0x0c,0xd8,0x74,0x07,0xa3,0xe4,0x31,0xe8,0xd0,0xce,0x21,0x1b,0xea,0xb1,0x0b,0x5e,0xef,0x1c,0x3d,0xab,0x42,0xfe,0xf0,0x43,0x02,0xd9,0x3e,0xe1,0x36,0x08,0x89,0x0a,0xeb,0xf9,0xdb,0x3d,0xca,0xfa,0x15,0xed,0x31,0xab,0xef,0x41,0xe8,0x1a,0xb3,0x4d,0x18,0x25,0x39,0x2d,0x3e,0xd9,0xf9,0x69,0xd5,0x30,0x44,0x0c,0x12,0x31,0x19,0x51,0x4b,0x41,0x26,0x09,0x38,0x09,0xcc,0xe1,0xed,0xd2,0xf5,0xe1,0xe5,0x0f,0x0b,0x04,0xe0,0xcc,0xbe,0x3b,0x40,0x18,0xfa,0x10,0xde,0xf8,0x2b,0x81,0xf7,0x16,0x87,0x31,0x47,0x23,0x38,0x12,0x69,0x5b,0xd9,0xff,0xe7,0xf3,0xcb,0x63,0xfb,0x48,0x17,0xfc,0x06,0xf2,0x15,0xde,0x20,0xc8,0x03,0xd8,0xe7,0xfe,0x31,0xd3,0xa7,0x0d,0xf3,0x1c,0xf4,0x7e,0xd6,0x28,0x35,0x13,0x23,0x0b,0x00,0xd9,0x09,0x1d,0xe0,0x81,0xb9,0x45,0xd1,0x05,0xe7,0x32,0xe5,0x5e,0x76,0xd4,0x1a,0x05,0xfb,0xef,0xe5,0xd3,0x04,0xbe,0xea,0xd3,0xd7,0xcd,0x43,0xad,0x0f,0x0e,0xf2,0xed,0x5c,0x0a,0x27,0xe7,0x08,0xa2,0x1f,0x18,0x13,0x12,0x1d,0xcc,0x15,0x12,0xbc,0xf5,0xc1,0x08,0x00,0x07,0xc9,0xd6,0xda,0xf6,0xcf,0x2a,0x14,0xe2,0xf8,0xad,0x37,0xee,0xfc,0xdd,0xdb,0x2b,0x0f,0x07,0xf7,0xdb,0x26,0xf8,0x28,0xf9,0x1d,0xf3,0x30,0xed,0x75,0xff,0xf7,0x29,0xf8,0x16,0x64,0x15,0xe1,0xf9,0x09,0xd9,0xb8,0xd9,0xed,0x47,0xd6,0xdd,0x2c,0x1c,0xca,0xe8,0x94,0x37,0x04,0x20,0x7f,0x3d,0x60,0xfa,0x1a,0xdf,0xc4,0x1e,0xf5,0x02,0xee,0x22,0x2b,0xfe,0x15,0xcf,0x0f,0x51,0xfd,0xf7,0xdc,0xd3,0xf3,0xf0,0xf4,0xd8,0xb6,0xd2,0x01,0xed,0x17,0x1b,0xdf,0xf7,0xc6,0xf0,0xd0,0x06,0xdf,0xd0,0xd1,0x22,0x1c,0x08,0x28,0x08,0x20,0xff,0x64,0x1b,0xa8,0x05,0x44,0xdf,0xe6,0xca,0xed,0x08,0x1f,0xd7,0x21,0xff,0xb5,0x6a,0xa8,0x45,0x15,0x06,0x46,0xa7,0xe2,0x10,0xfa,0x0e,0xfe,0xc2,0x27,0xc3,0x21,0xd2,0xef,0x13,0xa9,0xed,0x05,0xac,0x2d,0xf4,0x16,0xdc,0xae,0x3b,0x15,0xdf,0xdc,0xcc,0x19,0xfa,0xfd,0x21,0xb0,0xe3,0xe3,0x46,0xbd,0xf8,0xae,0xd8,0xed,0x1f,0x5b,0xe4,0xdc,0x26,0xff,0x01,0xdb,0x4f,0x2d,0x4c,0xe1,0xf9,0xcc,0xef,0xbc,0xb1,0x0a,0x20,0x0e,0xef,0x23,0x18,0x26,0xaa,0xea,0xce,0x0b,0xc3,0xb3,0xf9,0xf0,0xe3,0xf4,0xf0,0xf9,0xf2,0x35,0xda,0xe8,0x1b,0xe0,0xbc,0x1e,0xf2,0xbe,0x1a,0x28,0x07,0x10,0xfb,0xca,0xe5,0x19,0xe9,0x1f,0x07,0x1e,0xee,0x58,0xde,0x05,0xfe,0xd2,0xc1,0xfc,0x38,0x2f,0xdb,0x09,0x37,0xea,0xd2,0x23,0x38,0xe3,0xde,0xbe,0x24,0xd3,0x06,0x33,0xda,0xea,0xea,0x1e,0x2a,0x23,0x38,0x1c,0x13,0x10,0x24,0xed,0x7f,0x01,0xb5,0xad,0xe0,0x03,0x04,0xb3,0xf4,0xfe,0xfe,0x1e,0xb9,0xe3,0xd2,0x15,0xfe,0x22,0xf5,0x26,0x71,0xe5,0xa6,0x0f,0x14,0x6f,0xe2,0xca,0xbb,0x10,0x97,0xed,0xea,0x3f,0xcf,0x3b,0xe6,0xbe,0xdf,0x10,0xbc,0xa9,0x15,0xea,0x20,0x09,0x30,0x95,0x2f,0xa0,0x27,0x17,0xb8,0xd6,0x2c,0x25,0x3f,0xec,0xb4,0x76,0xf3,0xf9,0x36,0x45,0x0d,0xc6,0x55,0x39,0x3b,0xe9,0x13,0x20,0xa0,0x36,0xdc,0x07,0x26,0xb2,0xcc,0x81,0x02,0xba,0x24,0xc5,0xf2,0x01,0xdf,0xc9,0x5f,0x26,0x04,0x18,0x2f,0xdb,0x27,0x2c,0x53,0xc1,0x9a,0xe2,0x65,0xcd,0x0b,0xd8,0xbe,0x15,0x41,0x35,0x24,0x36,0xf2,0xb1,0x07,0xfc,0xfb,0x44,0x58,0x3c,0x2a,0x24,0xf4,0xd9,0xe8,0xd1,0xb5,0x28,0xed,0xcf,0xb6,0xc6,0xd4,0x09,0x09,0xdd,0x0e,0xc5,0xeb,0xf5,0x17,0xfe,0xbf,0x25,0xc4,0x15,0x00,0x3c,0xf8,0xe4,0xea,0x16,0xe6,0xf7,0xfd,0xb1,0x19,0xe1,0xf2,0xfd,0xcc,0x33,0x18,0x5e,0x00,0xc1,0xfe,0x51,0x1c,0x5b,0x0e,0xde,0x05,0xe5,0xef,0xee,0xef,0xbe,0x5b,0xf2,0xbb,0xb6,0x0d,0x20,0xef,0xd9,0x1a,0x50,0x04,0x32,0xe8,0xf6,0x04,0xe9,0x12,0xd0,0xf7,0x20,0xe6,0xd9,0xb7,0xe4,0xd6,0xc9,0x4a,0x0e,0x4f,0xbf,0xf1,0x19,0x2e,0x5b,0xbe,0xec,0xac,0x2a,0x19,0xb3,0xef,0x21,0xe0,0x1a,0xf0,0x33,0x16,0x12,0xe1,0xe0,0xeb,0xec,0xd2,0xdf,0xf3,0xb0,0x2e,0x2a,0x53,0xef,0xf5,0x1c,0x2b,0xbd,0x8a,0xea,0x2c,0xd0,0x24,0x27,0xef,0x1e,0xf9,0x81,0xcf,0x00,0x3b,0x0d,0xfe,0x20,0x23,0xf0,0x0e,0x1a,0x2b,0x02,0xdc,0x46,0xcb,0xf4,0x1e,0xfb,0x1e,0xdf,0x6c,0xd3,0xe8,0xfd,0x06,0x53,0x0d,0x2f,0x26,0x11,0x22,0xc0,0xcf,0x7e,0xff,0xc4,0xfe,0x14,0xf9,0x06,0x35,0xed,0xd5,0x3e,0xdf,0xf9,0xe9,0x0d,0xe6,0x36,0xa0,0xe2,0x24,0xc9,0x25,0xab,0xf7,0xec,0x15,0x33,0x98,0xd7,0x22,0xb0,0xdd,0x5d,0x1f,0xda,0x01,0xe5,0x0d,0xe7,0xdf,0xee,0x9c,0x33,0xc4,0xf0,0xfc,0x3d,0x1d,0xea,0x1b,0x2c,0xcf,0x37,0x32,0xdc,0xc2,0x0c,0xc0,0x53,0x0b,0xc8,0xd6,0x2f,0xeb,0xfc,0xb7,0x1e,0x26,0xaf,0x25,0x0e,0x2b,0x05,0x2f,0x05,0x20,0x93,0x0c,0xd1,0xa7,0x0f,0x6e,0xf2,0x01,0xc1,0x32,0xdd,0x00,0xea,0xef,0xcc,0xc7,0xf8,0xec,0xa3,0x25,0x0a,0xb6,0xb1,0x00,0x26,0xa6,0x22,0x34,0x11,0x07,0x1b,0xd1,0xf1,0xba,0x46,0x08,0xe0,0xcf,0x81,0x36,0xd9,0x24,0xf8,0xff,0x54,0x39,0x25,0xf2,0x17,0x3a,0xd5,0x15,0xfd,0xd8,0x12,0x19,0x24,0x08,0x22,0x0a,0x01,0xd7,0x24,0xbb,0x00,0xbf,0x0c,0xcf,0xd8,0xde,0x25,0x2c,0x68,0xf3,0xf5,0xd8,0xab,0x18,0x17,0x46,0x0a,0xd9,0x31,0xaa,0x30,0x68,0xe8,0x08,0xc7,0xf2,0x01,0x90,0xf7,0xca,0x76,0xba,0x53,0xe9,0xef,0x0a,0xb3,0x1f,0xe9,0x27,0x1a,0x7b,0xff,0xef,0x3f,0x08,0xb2,0x24,0x85,0x03,0xbf,0x44,0xdc,0xe2,0x00,0xf7,0xe7,0x9a,0x3d,0xf6,0xbc,0x99,0xff,0x1f,0x3c,0xca,0x8c,0x85,0xef,0x18,0xf3,0xfd,0xbc,0xcd,0x14,0x3c,0x27,0xf8,0x23,0xcc,0xfc,0x81,0xa6,0x28,0x1b,0x48,0xd8,0x16,0xfe,0x0b,0x13,0xbb,0xdb,0xdd,0x04,0xd0,0xda,0x05,0xf9,0x0f,0xd7,0xfe,0xce,0x38,0x33,0x25,0x26,0xfb,0x3f,0x46,0xe4,0xb9,0xe4,0x97,0xb3,0xfa,0x15,0x31,0x00,0x06,0xa0,0x04,0xdf,0xb4,0x1e,0x1c,0x0b,0xd6,0xcc,0xc4,0x10,0xc7,0xf6,0xde,0x07,0x3e,0x87,0xef,0x49,0x13,0xf5,0xfe,0xdf,0x29,0x69,0x0c,0xf9,0x13,0x2d,0x7f,0x33,0xdc,0x36,0xfe,0x03,0xd7,0x09,0x0c,0x2c,0x1c,0x2f,0x73,0x00,0x25,0xff,0xd5,0x52,0xd9,0xe2,0x5e,0xa6,0x00,0x12,0x12,0x0a,0xe5,0x07,0x33,0xbc,0x21,0x00,0xf2,0xe5,0xf4,0x22,0xfd,0x07,0xf7,0x33,0xef,0x52,0x14,0xf3,0xdd,0xd8,0x43,0xf7,0xbe,0xf6,0xf0,0xd9,0x35,0x00,0xe3,0x4b,0xf0,0x0f,0xfa,0xfe,0x2c,0x3e,0xe0,0xf7,0xcf,0x1e,0xf1,0x3b,0xf3,0xd3,0x35,0xbd,0x51,0x15,0xed,0xdd,0x00,0xec,0x24,0x1e,0x3f,0x1e,0xdf,0xed,0xfb,0x58,0x0a,0xf9,0x28,0xeb,0xc6,0xda,0xd9,0x0a,0x01,0xc4,0x1d,0xe4,0xfc,0xcb,0xc6,0xba,0xc7,0xef,0x0e,0xca,0x40,0xe5,0x02,0xce,0x30,0xcd,0x47,0xe3,0x10,0x02,0x16,0x07,0xf2,0x03,0xf1,0xec,0x0a,0x32,0x19,0xf3,0x03,0xe0,0x26,0x1e,0xc8,0x00,0xf4,0x11,0x14,0xd8,0xe4,0x0e,0x0a,0x27,0x16,0x26,0x0b,0x04,0x2f,0x12,0x67,0x10,0xce,0xf5,0xb7,0xf4,0xe1,0xed,0xcf,0xed,0xfa,0x12,0xf0,0x0b,0xf7,0xe9,0x0d,0xe7,0x25,0xdf,0xe9,0xe9,0x3d,0xea,0xe6,0x1e,0x20,0xee,0x15,0x02,0x2f,0x11,0x07,0xb0,0x1a,0xce,0xf0,0x61,0xae,0x0c,0xe5,0xdf,0x06,0x15,0xed,0xe2,0x12,0x27,0xfe,0x03,0xf7,0x0a,0xf8,0x06,0x38,0xfe,0xfd,0x26,0xfa,0xf2,0xf9,0x2d,0xea,0xb2,0x11,0xd7,0x19,0x7f,0xcf,0x17,0x29,0x03,0x35,0xfb,0xe1,0xd1,0xf7,0xdd,0x7c,0xfb,0x16,0x31,0x14,0x16,0xe4,0xcf,0xe4,0xc3,0x4e,0x1e,0x10,0xf5,0x07,0xe7,0xe8,0xf1,0x05,0x21,0xe3,0xb3,0x18,0x07,0x12,0x45,0x04,0xaf,0x0a,0xca,0x16,0x7a,0xf6,0x09,0x04,0xf8,0x09,0x1e,0xe9,0x4b,0xbf,0x14,0xe9,0x0d,0xbc,0x0d,0x23,0x01,0xd1,0xfe,0x1f,0xce,0x4c,0x17,0xc1,0x2e,0xdc,0x07,0x09,0x5a,0x06,0x23,0x03,0x2d,0x18,0x33,0xf5,0xfe,0xc6,0xbe,0x07,0xd4,0x5d,0x0a,0x0a,0x29,0x28,0xf6,0x53,0x19,0xea,0x15,0xcf,0x2b,0xe9,0x28,0xda,0x96,0xf2,0x36,0x7e,0xe7,0xfc,0x42,0xe6,0x81,0x2a,0x4f,0xec,0xe6,0xe2,0x1f,0x96,0xe2,0xc7,0xe1,0xfe,0x19,0xe4,0x04,0x29,0xb7,0x2c,0x2c,0xde,0xa7,0x1d,0x94,0x56,0xe2,0x0d,0xc1,0xe0,0xc5,0x72,0xf6,0x20,0x40,0xd1,0x7c,0xce,0xb8,0x54,0xe4,0x4d,0x0c,0xfb,0xad,0xf0,0x45,0x3f,0x18,0xef,0xf3,0x19,0xfe,0x14,0x92,0x61,0xf8,0x31,0xe5,0x1a,0xd4,0x0a,0xe8,0x19,0xe9,0xd7,0x0e,0x6d,0x00,0x0e,0x32,0x22,0xc5,0xe7,0x07,0x2d,0xfe,0xd0,0x5b,0x35,0xf5,0xc2,0xef,0xd6,0xd0,0xca,0xc1,0x20,0xcd,0x11,0xce,0xee,0xf7,0x7f,0x2b,0x39,0x98,0xfe,0x1b,0xc4,0x28,0xd1,0x1a,0x03,0x0c,0xd8,0x25,0x11,0xf5,0x41,0xfd,0xe6,0x20,0x37,0x0a,0x08,0xe8,0xbb,0xbe,0x96,0xe5,0x0b,0x06,0xf0,0x14,0x25,0x3a,0x61,0xe6,0x63,0x22,0x3c,0xe8,0xd9,0xf6,0xf1,0xa2,0x1e,0xf7,0x19,0x1d,0xfb,0xbf,0x32,0x0f,0xdf,0x11,0x37,0x2f,0xf2,0x6c,0x4a,0xf3,0x1d,0x1f,0xa1,0xde,0x3a,0x3f,0xd4,0xdf,0xea,0xd1,0x03,0xe3,0xb9,0x16,0x44,0xb3,0xd1,0xda,0xfc,0x44,0x42,0xea,0x27,0x58,0xd8,0x08,0xe0,0xea,0x02,0xf9,0x25,0x26,0x56,0x9a,0xfe,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x81,0x60,0xec,0x3a,0xec,0xce,0xe9,0xca,0x06,0xcc,0xe2,0x3f,0xee,0x7f,0x81,0x6d,0xe5,0xaa,0x7f,0x89,0x78,0x19,0xbb,0xcc,0x3e,0x59,0x17,0x4d,0x3b,0xc4,0x54,0xf7,0x98,0xf1,0xe8,0xc3,0xa9,0xcb,0xe8,0xf1,0x51,0xe5,0x50,0xb1,0xcb,0x5f,0x3d,0x7f,0x01,0xb4,0xab,0xe4,0x42,0xf5,0x3e,0x7f,0xfe,0xad,0x60,0x71,0x96,0x47,0xd3,0x08,0xf2,0xf9,0x4d,0x34,0x60,0x7f,0x71,0x7f,0xba,0xc9,0xd9,0xac,0x9c,0x5c,0x31,0x70,0x81,0xfb,0xc7,0x21,0x88,0x57,0x7f,0xf8,0x99,0xa6,0x2f,0xdd,0xf5,0x7f,0x18,0x0d,0x59,0x96,0xb0,0xd1,0xf2,0xad,0xc6,0x5e,0x84,0xb4,0x81,0xd1,0xf3,0xae,0x7f,0x77,0x0b,0xd7,0xbc,0x27,0x04,0xd0,0xcf,0xae,0xd1,0x5a,0xd6,0xfe,0x7f,0x1d,0xc8,0x21,0xb2,0xfa,0xcf,0x04,0xc6,0x32,0xf6,0xd6,0x10,0xcc,0xce,0x60,0x32,0x4b,0x14,0x73,0x81,0xd5,0x33,0x83,0xeb,0x3c,0x85,0xa4,0x7f,0xc9,0xdd,0xcb,0x7f,0x0a,0x52,0xec,0x42,0xcc,0x20,0xd2,0x81,0xd9,0xe4,0x4a,0x7f,0x45,0xf5,0x30,0xc4,0xff,0x35,0x69,0xc2,0xdc,0xc5,0xd0,0x4e,0x31,0x69,0xd8,0x15,0x5f,0x59,0x35,0x31,0x13,0xbf,0xf7,0x33,0x1c,0xd6,0x51,0x7f,0x50,0xf7,0x4c,0x1e,0xed,0x81,0xf5,0xec,0x1e,0x3a,0x21,0x9e,0xf2,0xf7,0x7c,0x36,0xbd,0xe8,0xb8,0x86,0xe1,0xd9,0x7f,0x5e,0x2f,0xb0,0xdc,0x89,0x15,0xd3,0x38,0x81,0xd5,0x8e,0x16,0x18,0x2d,0xc1,0xf7,0x31,0xc5,0x70,0x3c,0xf3,0xae,0x81,0xb7,0xcf,0xcf,0xc3,0x37,0xab,0x7f,0x39,0x97,0x0b,0xde,0xe3,0x81,0x8b,0xb9,0x02,0x0b,0xb0,0xac,0x4d,0xaa,0x01,0x56,0x56,0x36,0x74,0x84,0x94,0x7f,0xd6,0xd8,0x47,0xad,0xbc,0xbf,0xe0,0x81,0x9e,0x2b,0xf0,0xcc,0x42,0xbb,0xdc,0x11,0xbc,0x83,0xd0,0xe5,0xd5,0x04,0xd6,0x5b,0x02,0x51,0xbe,0x87,0xc6,0x31,0x2a,0xe5,0xf6,0xe8,0x81,0x02,0x7f,0x32,0x3d,0xc8,0x7f,0xcd,0x4c,0x7f,0x81,0x25,0x1a,0x0d,0x1a,0x6c,0x7f,0x22,0x48,0x70,0x63,0x58,0x18,0x81,0xcf,0xdc,0x96,0x7d,0xb0,0x74,0xd1,0xdf,0x81,0x46,0x3a,0xe3,0x52,0x28,0x7f,0x81,0xcd,0x56,0xf2,0xd9,0xfb,0x81,0xd8,0x1c,0xad,0xf9,0xcc,0x46,0x95,0xd2,0x92,0xca,0xe3,0xdd,0x6d,0x2e,0x3c,0xfb,0xd0,0xc1,0xde,0x96,0xe5,0x3a,0x7f,0x40,0xaf,0x6b,0xde,0xb4,0xf9,0xfb,0xce,0x1e,0xee,0xc7,0x03,0x30,0x14,0xc5,0xed,0xe6,0x81,0x7f,0x89,0xee,0xb9,0xf9,0xcd,0x1b,0x66,0xb9,0x5a,0x86,0x34,0x4c,0x9f,0xf0,0x54,0x23,0x0c,0x7f,0xf6,0x7f,0x00,0x81,0x5f,0x46,0x0a,0x3b,0xc5,0x19,0x2c,0x12,0x19,0xb4,0x7f,0x81,0x81,0x53,0xdd,0x29,0x3a,0x81,0xf5,0x7f,0x1d,0x09,0x0c,0x2b,0x2d,0x13,0x8f,0xe0,0x12,0x04,0xef,0x4c,0x7f,0x0f,0x04,0x4a,0x35,0xdf,0x7f,0xb4,0xff,0x85,0x38,0xfa,0x40,0x05,0x7f,0x32,0xd5,0x7f,0xc7,0x12,0x81,0x53,0x99,0xc2,0xb6,0xd9,0xea,0x27,0x20,0xe9,0xf4,0xff,0x3c,0x99,0x7d,0x62,0x0b,0x7f,0x81,0x7f,0x34,0xa2,0xd4,0x19,0xcf,0xb0,0x1f,0x7b,0x1e,0xcb,0xd7,0x4c,0x34,0xc0,0xb3,0xb6,0xcf,0x9c,0xf8,0xb0,0x04,0xd7,0x07,0xbf,0x00,0xb0,0x4a,0x7f,0x81,0x81,0x13,0x11,0xd8,0x88,0xba,0x0d,0x81,0xe8,0xc2,0x2c,0x1b,0x36,0x0d,0x24,0x81,0x7f,0xbd,0x78,0x3c,0x04,0x05,0xe0,0x2f,0x08,0x44,0xaf,0x57,0x7f,0x48,0xe5,0xc1,0x03,0x03,0x49,0xf9,0xf2,0xf4,0xad,0xd8,0x02,0x58,0x41,0x81,0xc2,0xaa,0x0b,0x1b,0x01,0x64,0x19,0xee,0x7f,0xf0,0xe7,0xd0,0x19,0xe5,0x2f,0x01,0x25,0x17,0x7f,0xf0,0x06,0xdd,0xc1,0x1d,0x03,0x66,0x39,0x52,0xcc,0x4a,0x81,0xde,0x35,0x45,0x7f,0x44,0xef,0xa4,0x21,0xc0,0xe1,0x18,0xfd,0x7f,0x42,0xf6,0x9e,0x81,0x81,0x5c,0x7f,0xa9,0x6f,0x9e,0x0a,0x73,0xe5,0xdd,0xd1,0xf1,0x38,0x4a,0x1e,0xf0,0xb6,0xde,0xfc,0xf6,0x39,0xe0,0xf8,0x5a,0x9e,0x81,0xaa,0xb5,0xd9,0xe5,0xe2,0xe8,0xd3,0xa4,0x24,0xc7,0xc3,0x7f,0x1a,0xdc,0xeb,0x2e,0x16,0x0a,0x30,0xf0,0xf2,0xab,0xb8,0x66,0x81,0x95,0x17,0x81,0x7f,0xba,0x1a,0xe9,0xdd,0x09,0x2d,0x7f,0x35,0xab,0x04,0x13,0x7f,0xc7,0x45,0x09,0x7f,0x56,0x0c,0x09,0xea,0xc4,0x19,0x7f,0x08,0x0e,0xcf,0xcd,0x33,0x28,0x06,0x3c,0xe6,0x75,0x08,0xd8,0xf1,0xb4,0x2e,0xff,0x7f,0x3d,0x7f,0x6f,0x17,0x0f,0x2a,0x09,0x04,0x1c,0x96,0x33,0x2c,0x7f,0xf6,0x89,0xe9,0x09,0x65,0xa8,0x2c,0x42,0xe4,0xb9,0xd5,0xef,0xed,0x81,0x00,0x45,0xe5,0x7f,0x20,0x13,0x6c,0x4f,0x02,0xbd,0x59,0x8c,0xbc,0xdd,0xe1,0x57,0xe5,0x6e,0x7f,0x7e,0x27,0x3f,0xa7,0x0a,0x9f,0x7f,0x7f,0x51,0x16,0xed,0xba,0x91,0x06,0x69,0xf2,0xc3,0x46,0xb4,0x81,0xd7,0x54,0xa1,0x83,0x20,0x3f,0xef,0x58,0x7f,0xb7,0x37,0xd0,0xf5,0x23,0x50,0xa0,0xb3,0x85,0x4a,0x1f,0xf4,0x89,0x3d,0x7f,0x7f,0x96,0xdb,0x51,0x5f,0xf0,0x7f,0xdf,0x64,0x3a,0x87,0x7f,0x7f,0x25,0x99,0xaa,0xdc,0xda,0xd2,0x67,0xd9,0xab,0x5c,0x82,0xc9,0x20,0xe2,0xfd,0xdf,0xf9,0x09,0xaa,0x81,0xf4,0x89,0x7f,0x14,0xf2,0x0e,0x24,0x6b,0x31,0x23,0xd6,0x00,0xe2,0x4a,0xac,0x31,0x1c,0xfb,0xc4,0x98,0xd0,0xcc,0x66,0x13,0x13,0xcf,0x5a,0x38,0x81,0xfc,0x98,0x08,0xaa,0xc1,0xbe,0x33,0x99,0x4a,0xd7,0x7f,0x3f,0x09,0x2c,0xfc,0xf9,0x11,0xcd,0xa1,0x30,0x81,0xde,0x7d,0x7f,0x7f,0x3b,0xcd,0x4d,0x1e,0x3c,0x39,0x83,0x86,0xad,0xb6,0x7f,0xd8,0x7f,0x7f,0xa5,0xf5,0xb6,0xbf,0x16,0xfc,0xc0,0x18,0x7f,0xad,0x97,0x23,0x81,0xf2,0x5f,0xe8,0x04,0xf9,0x81,0x89,0x8c,0xbd,0xe9,0xb6,0xd9,0xbb,0x3e,0x26,0xd2,0xce,0x15,0x6d,0xe7,0xd7,0x62,0x7f,0x50,0xc3,0x3d,0xd4,0x54,0xc6,0x81,0xe2,0xd0,0x8b,0x5f,0x92,0xd2,0xbc,0xdc,0x93,0x22,0x04,0x7f,0xc8,0xf2,0xa1,0xe6,0x3a,0xba,0xb1,0x6c,0x31,0xea,0xff,0xfb,0x19,0x19,0x23,0xf7,0xfc,0xf5,0x35,0xd1,0x1e,0x4e,0xd9,0x81,0x21,0xb7,0xa0,0xf6,0xf6,0x34,0xfd,0x17,0x34,0x1c,0x00,0xbf,0x43,0x9b,0x07,0x0e,0x0f,0xf2,0xda,0xd1,0x42,0x2a,0xb3,0x32,0x89,0xf3,0x7f,0x7f,0xd7,0x7f,0xab,0x13,0xd5,0xea,0x68,0x54,0xc8,0x7f,0x2d,0x4a,0xde,0x14,0x7f,0xbe,0x84,0xe3,0x0f,0xba,0xee,0xff,0xc0,0x1f,0x81,0x29,0x88,0xc1,0x64,0x31,0xd8,0xdc,0x20,0x9d,0x70,0x14,0xf3,0x49,0xee,0xf1,0xe0,0xb5,0xa0,0xf3,0x94,0x4c,0xb0,0x1c,0xf8,0x3c,0xed,0x1e,0x4e,0xb8,0x99,0xfa,0x4e,0x16,0x18,0x6a,0x08,0x57,0xa6,0x4b,0xe4,0x94,0x9e,0x7f,0x31,0xb9,0x50,0xab,0x11,0x3a,0xd5,0x18,0x81,0xf0,0x50,0xbf,0x46,0xda,0xae,0x3e,0x7f,0x11,0x02,0x26,0x07,0x2a,0xa6,0xb6,0x7f,0xc1,0x7f,0xb6,0x4f,0x7f,0xbe,0x05,0xd6,0x35,0x01,0x2f,0x9f,0x68,0x49,0x7f,0x1e,0x75,0x3c,0xb7,0x6f,0xac,0xfd,0x07,0x48,0x15,0x05,0x6d,0x15,0xd5,0x3d,0x00,0xf3,0xa4,0x10,0xf9,0xa1,0xdf,0x6d,0xaf,0x03,0xa9,0x37,0x7f,0xbb,0x91,0x75,0x5e,0xc1,0x7f,0x3c,0x07,0xb5,0xd2,0x34,0xda,0xe3,0xf1,0xe2,0x9e,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x12,0xd3,0xfd,0xe4,0x0c,0x1f,0x00,0x20,0xd0,0xd2,0xbf,0x02,0x26,0x05,0x27,0xdf,0x04,0x17,0x3b,0xf9,0xde,0xdc,0x14,0x32,0xce,0xc8,0x26,0x11,0x0d,0xd0,0xda,0xfd,0x0e,0x33,0x3c,0x29,0xdf,0xe9,0xea,0x03,0xc2,0xe8,0x1c,0xca,0xdb,0x7f,0xbb,0xeb,0xcb,0x29,0x16,0x1d,0xbb,0x1b,0xeb,0xf4,0x05,0xf2,0x23,0xff,0xc1,0x1b,0xdf,0x58,0x03,0x22,0xa7,0xdf,0x2e,0x06,0x90,0x1d,0xf7,0x04,0x06,0x28,0x2c,0x21,0xff,0xf1,0x12,0x9f,0x06,0x2a,0xce,0xd6,0xdd,0x0e,0xf2,0x1e,0x05,0xfd,0x38,0xdd,0x38,0xff,0x43,0xfb,0xc4,0x1e,0x2f,0xee,0x53,0xcb,0xdd,0xf8,0xf4,0x47,0xbb,0x16,0x3e,0xc4,0xf8,0x0f,0xeb,0xfa,0x0a,0x36,0xcf,0xe7,0xe5,0x0a,0x0e,0xe4,0x9a,0x14,0xcc,0x01,0xf5,0x07,0xd5,0xba,0xe2,0xef,0xfc,0xc5,0xe4,0x17,0x25,0xed,0x11,0xf8,0xf3,0xd7,0xdf,0xe7,0xef,0x42,0xed,0xcc,0xd0,0x05,0xb8,0xf1,0xdc,0x23,0x63,0x2e,0x16,0xf0,0x02,0xd5,0x23,0xfc,0x43,0xf9,0xe4,0x31,0xce,0x0d,0xdd,0x36,0xed,0x02,0xcf,0xd1,0xc6,0x0b,0x29,0x7f,0x33,0xda,0x3c,0xbc,0xed,0xed,0x18,0xb3,0xfc,0x11,0x19,0x55,0x0f,0x16,0xbd,0x2c,0xec,0x25,0xf0,0xe4,0x08,0x35,0x38,0x05,0x2a,0xd1,0xdc,0xd9,0x0c,0xe2,0xda,0xee,0x24,0xd1,0x01,0x02,0x2e,0xd1,0x0f,0x35,0xcf,0xd4,0xe6,0x13,0x19,0xff,0x36,0x02,0x0f,0xe5,0x14,0xe4,0xf6,0xee,0xed,0xdd,0xd4,0xcd,0xc3,0xff,0xfb,0x49,0xe4,0xe2,0xc9,0xf7,0xb6,0xf0,0xed,0x0d,0x23,0xf8,0xdd,0xff,0xd8,0xcf,0x03,0x0a,0x16,0xdc,0xf3,0x0c,0x27,0xfa,0x00,0x0d,0x24,0x0a,0xea,0x2d,0x11,0x1c,0x06,0xef,0x75,0xfb,0x0e,0x10,0xf0,0x29,0xc6,0xff,0xe1,0xfb,0xf0,0xeb,0xee,0x0c,0x35,0x31,0x4e,0x3b,0x16,0x09,0xb2,0x05,0x31,0x28,0xba,0x33,0xd9,0x18,0x3a,0xb7,0xf0,0xe5,0x17,0xd8,0x0d,0x2f,0xf8,0xdc,0xbc,0xdd,0xf4,0x3c,0x20,0xf4,0x12,0x11,0x1d,0x3f,0xee,0x0d,0x16,0x17,0xaf,0xfd,0xd8,0xdd,0x16,0xf8,0x1c,0xc0,0xff,0xe7,0xfa,0xef,0x18,0x03,0x0a,0xdd,0xfe,0x18,0x19,0xed,0xec,0x7f,0xf2,0x06,0xf4,0x30,0x04,0x10,0x0a,0xfb,0x15,0xd6,0x25,0xd2,0xe2,0x02,0xd8,0x16,0x1b,0x47,0x1a,0x0b,0xe9,0xc9,0x27,0xd1,0xc7,0xfc,0x06,0x04,0x25,0xd7,0xe8,0xfa,0x17,0x07,0x4d,0xe8,0x1d,0xe3,0x20,0xfb,0xc4,0xd4,0xbe,0x81,0xd0,0xf0,0x03,0x0a,0x0b,0x5b,0x00,0x3c,0x31,0x43,0x3c,0xfa,0x23,0xcf,0x2b,0xdf,0x3e,0x5a,0xed,0x05,0xab,0x5f,0xcb,0x05,0xfb,0x0b,0xd5,0xed,0xe9,0xca,0x18,0x2e,0x39,0x49,0xca,0x0f,0x44,0xf4,0x9c,0xa9,0x14,0xef,0xd3,0x04,0xed,0xd0,0x13,0xe4,0x05,0x2d,0xb2,0x11,0xff,0xcb,0x06,0xd4,0x15,0xad,0x19,0x43,0x0b,0xf9,0xec,0xd8,0x1f,0xcf,0xd7,0x03,0xe3,0x11,0x29,0x1a,0x24,0x00,0x1a,0xdc,0x2b,0x1d,0x48,0xfb,0xdb,0xe4,0xe9,0xb8,0x0b,0x2c,0x2a,0x1a,0xc4,0x12,0xc2,0xbf,0xeb,0xdb,0x17,0x7c,0xfa,0xe6,0xfe,0xe5,0x0a,0xdc,0x11,0x49,0xe3,0x08,0x21,0xf3,0x39,0xe7,0x50,0x44,0x03,0x11,0xf9,0x51,0xfc,0xff,0x2b,0x2c,0x12,0xf5,0xde,0x15,0x12,0xa7,0x18,0xea,0x12,0xba,0xf2,0x01,0xe1,0x0e,0x2c,0xf3,0xff,0x10,0xbd,0xcc,0x34,0xf0,0x0c,0x0b,0xf3,0x1b,0xf9,0xf9,0xbf,0x7f,0xf0,0x06,0x58,0x4b,0xcb,0xf7,0x0d,0xa3,0x0e,0x06,0xe1,0x17,0x0d,0xe4,0x1d,0x46,0x0f,0xd5,0xdf,0x27,0xfc,0x2e,0xec,0x30,0x09,0xf2,0x10,0xc6,0xd9,0x00,0xde,0x68,0x3e,0x73,0xea,0x12,0xf9,0xc5,0xdf,0x3c,0x4c,0x42,0xe1,0x08,0x22,0x1f,0x11,0x10,0xcc,0x22,0x18,0x02,0x51,0x11,0x03,0xee,0xd6,0xf1,0x31,0x02,0xd8,0x10,0x0e,0xf5,0xd5,0x3f,0x0e,0xea,0xbf,0x1d,0x26,0x3a,0x36,0x0e,0x2d,0x10,0xf8,0x4c,0x5a,0x2c,0x16,0x52,0xe4,0x1a,0x29,0xf7,0x96,0xcc,0x38,0xf2,0xe3,0x13,0x4f,0x13,0xc0,0xfb,0x14,0xe9,0xf3,0x01,0x00,0x25,0xce,0xe7,0xd4,0xde,0xe0,0xe0,0x10,0xd0,0x04,0xfe,0xce,0x10,0xd6,0xf3,0x18,0xaa,0x07,0xe4,0x38,0x15,0xe0,0xd6,0xb8,0xf3,0x12,0xc6,0xf6,0x3b,0xfe,0x6f,0xfe,0xe3,0x13,0xdd,0xcd,0xf8,0x12,0x42,0x15,0xf2,0x4f,0x04,0x14,0xc7,0xf5,0xc8,0xd8,0xec,0xe4,0x0b,0xfa,0xe2,0x21,0x1e,0xdd,0x3b,0xd7,0xf8,0xe8,0x44,0xc2,0x10,0xb0,0xc8,0x01,0xfc,0x1c,0xf0,0xec,0x00,0xd2,0x1f,0xeb,0xe0,0x07,0xeb,0x2d,0x4c,0x33,0x2a,0x21,0x99,0xea,0x17,0xe9,0x2c,0xe2,0xee,0x11,0xd3,0x3a,0x11,0x25,0xd7,0x89,0x25,0x33,0x43,0x0e,0x24,0x21,0x0b,0xe5,0x0f,0x20,0x0e,0xc8,0x39,0xaa,0xd8,0x21,0x81,0xca,0xed,0x22,0x46,0xf5,0x0e,0x20,0x06,0xf1,0x10,0xce,0xec,0xe8,0xd8,0x34,0x01,0x13,0x03,0x19,0x18,0x29,0xde,0xbc,0x0f,0x3c,0xcc,0xf8,0x7f,0xf4,0xd2,0x63,0x00,0xf0,0x27,0xfc,0xd4,0xe6,0x03,0x32,0xf7,0x4b,0xc4,0x0e,0xdc,0x0a,0x05,0xb4,0xec,0xe2,0xce,0x04,0xe4,0x0a,0xb6,0x1b,0x12,0xea,0x40,0x0f,0x56,0x0a,0xe5,0x00,0x30,0x25,0x04,0x34,0x0a,0xe7,0xf3,0xed,0x07,0x1d,0x19,0x18,0xf4,0x11,0xe6,0x01,0xe4,0x3e,0x44,0xd8,0xc3,0x89,0x05,0xdb,0xd0,0x13,0x1a,0xe1,0xd0,0xdf,0x30,0x21,0xd5,0xf5,0xcf,0x24,0xea,0xe7,0x07,0xd5,0x15,0xfc,0x18,0x70,0xea,0x27,0xf8,0x12,0x18,0xe9,0xb6,0xeb,0xeb,0xdb,0x1d,0xe0,0x05,0xc1,0xef,0xdc,0xc3,0x2c,0x1d,0x37,0xeb,0xf4,0x6f,0xd8,0xe9,0x20,0xf5,0xff,0x15,0xbd,0x2a,0x0f,0x02,0xee,0x02,0x1a,0x4b,0xeb,0xd3,0x03,0xd0,0xf0,0xf3,0x1b,0xf3,0x29,0x10,0x06,0x72,0xf6,0xfa,0xec,0xec,0x30,0xed,0xff,0x3e,0xdb,0x1b,0x17,0x32,0xa2,0xee,0x03,0xe8,0x7f,0x1b,0xdf,0x5d,0xea,0xa0,0x20,0x2d,0x15,0x0e,0xdb,0x0f,0xf9,0x0d,0x1b,0xe0,0x55,0xce,0xd9,0xc2,0xa5,0xb6,0xfa,0xf0,0xbb,0xe6,0xea,0x5c,0x31,0x76,0xa8,0xc6,0xd1,0x47,0xfa,0x21,0xdd,0x10,0x0d,0x35,0xd2,0xfe,0xe4,0xe4,0xf4,0xcc,0x3d,0x67,0x0a,0x12,0x4c,0x2b,0xfa,0xc8,0x58,0xe9,0x2e,0xfe,0x2b,0xc7,0x09,0x5f,0x35,0x34,0x21,0x14,0xe7,0x3e,0x19,0x00,0x15,0x6b,0x21,0x0c,0xf8,0x5a,0x27,0x78,0x0b,0x45,0xf8,0x21,0xe1,0x2e,0x2d,0xd5,0x19,0xf8,0xcf,0x5e,0xfd,0xe1,0x36,0x20,0xcd,0xef,0xfa,0x2a,0xcf,0x5d,0x2a,0xda,0xe5,0xe1,0xf5,0xd9,0xe1,0xb5,0x0e,0x03,0xb5,0xe5,0xea,0xbb,0xeb,0x06,0xf9,0xe7,0x16,0x0d,0xfe,0xbe,0x23,0xd5,0x14,0x1d,0xf7,0xd5,0xdf,0xef,0xec,0xd4,0x2d,0xda,0xce,0x3c,0x98,0x24,0x02,0xfe,0xac,0xd4,0x53,0x26,0xcf,0xfa,0xd0,0xeb,0x5c,0xcb,0x19,0xd2,0x21,0xde,0x18,0x4f,0xfd,0x35,0x16,0xd7,0x1e,0x13,0x92,0x1d,0x1f,0x00,0x54,0x24,0x37,0xf0,0xd1,0xe3,0xba,0xd5,0x21,0xd9,0xf6,0xfd,0xb7,0x08,0xb4,0xd5,0x43,0xe3,0x1e,0x05,0x56,0xc5,0x56,0xd8,0x3e,0xef,0xe2,0x08,0xd4,0xc5,0xed,0x13,0x2e,0x25,0xd1,0x20,0xd4,0xe0,0xfd,0xfb,0x81,0xe7,0xf0,0xb2,0xde,0x00,0xe5,0xef,0xec,0xd1,0x08,0xee,0xed,0xe1,0x4e,0xd2,0xd2,0xee,0x25,0x25,0x39,0x8f,0x05,0xfa,0x52,0x0f,0x27,0x01,0x07,0x06,0xc8,0x81,0x11,0x2d,0x17,0xc3,0xe2,0x00,0x34,0x6e,0xf5,0xe3,0x36,0x19,0x2b,0xed,0xe9,0xc5,0x61,0xdb,0x16,0xe3,0xfe,0xfe,0x0f,0x5c,0xe7,0xd4,0xe0,0xdb,0xe9,0x3a,0x04,0xed,0xbe,0xb6,0x28,0x25,0x1a,0x3e,0x27,0xb7,0xc7,0x11,0xb2,0x1d,0xbc,0x1f,0x5a,0x03,0xa7,0xeb,0x4c,0x47,0x38,0x55,0xf8,0x0e,0xff,0xf8,0xc5,0x19,0xca,0xe0,0x34,0xed,0x20,0x17,0xc5,0xc7,0x09,0x18,0xd3,0x95,0xdc,0xb3,0x0f,0xf7,0xf8,0x78,0xc3,0x29,0xeb,0x16,0xf0,0x16,0x09,0xf9,0xe2,0xdf,0xe9,0xa4,0x15,0x39,0x25,0xf1,0xe6,0xf6,0x1a,0xc1,0x12,0xd6,0xd0,0x0c,0xfa,0x00,0xe6,0xe5,0xd6,0xb9,0x29,0x64,0x07,0x10,0xc9,0x0c,0x17,0xfc,0xf9,0x3a,0xe4,0xc1,0x15,0xdb,0x01,0xcd,0x4f,0xc8,0xbf,0xda,0x2a,0x28,0x0c,0x14,0x0a,0xbb,0x15,0xda,0xe8,0x23,0xfa,0x36,0xf4,0xe7,0xd1,0xe1,0x27,0x05,0x5e,0x1c,0x39,0x49,0xf4,0x0d,0x12,0x09,0x37,0xcc,0xc2,0xcc,0xff,0x5e,0xce,0xd1,0x32,0x19,0xf7,0x02,0xde,0x27,0x0d,0xcb,0xf9,0xf1,0x16,0x0d,0xf9,0x16,0xfe,0x7f,0xf7,0x0b,0x7a,0xc7,0xdf,0xbd,0x01,0x0e,0x07,0xe6,0xe7,0x3d,0x10,0x04,0xd3,0xf7,0x08,0xd8,0x29,0x76,0xca,0xea,0xf9,0x0a,0x0a,0x33,0xe9,0x15,0x40,0xce,0xd7,0x28,0x12,0xfe,0xd8,0xba,0xe6,0x05,0x3f,0x43,0x13,0xce,0xf3,0x2a,0x30,0x23,0x70,0x1c,0x11,0xca,0xf1,0x08,0x21,0x1b,0x05,0x9f,0xcc,0xe4,0x24,0xf9,0x0e,0x15,0x04,0xfa,0x0d,0x17,0x17,0x26,0xe5,0xf9,0xbd,0xea,0xf8,0xe2,0x10,0xe1,0xf4,0x39,0xfd,0x05,0x0c,0x10,0x11,0xd2,0x27,0xf2,0xf3,0x01,0x21,0x0c,0xdd,0x24,0x09,0xf2,0xf4,0x02,0x3f,0x51,0xfd,0x1f,0xfc,0x0f,0xf3,0x28,0xf0,0xfc,0xd4,0xcb,0xee,0x50,0xd6,0xff,0x31,0x22,0x06,0x2a,0xd5,0x2b,0x02,0xee,0xd3,0x0f,0xf7,0x0c,0xef,0x7f,0xdb,0x36,0xec,0xcf,0x0e,0xf0,0x1a,0xf5,0x41,0x2f,0x10,0xdd,0x13,0xe5,0xf5,0x06,0x2a,0x02,0x13,0x00,0x1a,0x10,0xea,0x05,0x13,0x12,0x15,0x08,0x1e,0x07,0x2d,0x5e,0x2c,0x14,0x09,0x4c,0xe5,0x31,0xf1,0xff,0x24,0x33,0xb9,0x08,0xfb,0x03,0x28,0xf0,0x08,0x4f,0xde,0x18,0xe2,0xea,0x19,0xf1,0xfc,0x33,0x36,0x2a,0x04,0xf8,0x21,0x3f,0xd7,0x0d,0xdf,0xf4,0x26,0xe0,0xfc,0xf9,0xe4,0xff,0x07,0x00,0xe1,0x12,0xfe,0x55,0xd4,0x51,0x10,0x1a,0x4b,0x0c,0x26,0xf9,0xfe,0x28,0x05,0x20,0xfe,0x0e,0xb8,0xc2,0x18,0xe5,0x19,0x3a,0xce,0xf7,0x06,0x06,0xb3,0xea,0xfc,0xf6,0xf1,0xe9,0xfa,0xf4,0xe7,0xd7,0x1b,0x10,0xd9,0x28,0xc7,0xfe,0xfa,0x20,0x23,0x03,0x0c,0xfc,0xdc,0xf2,0xe0,0xf0,0xf0,0x15,0x3e,0xb7,0xd5,0x04,0xf6,0x7f,0x14,0xdb,0xef,0x56,0xe2,0x07,0x29,0x06,0x0d,0xe7,0x13,0x43,0xef,0xee,0xf6,0x26,0xec,0xfb,0xdf,0xb5,0x08,0x1c,0xde,0x07,0x37,0xe0,0xa4,0x1a,0x17,0xe7,0x20,0xdf,0xce,0x07,0x1e,0x4a,0x00,0xf9,0x0e,0xb7,0x1d,0xf5,0xe8,0xd7,0x3e,0xc0,0xd6,0xf7,0x01,0x25,0x0d,0xec,0x05,0x13,0x0d,0xf4,0xa2,0x14,0x26,0xe8,0x22,0xcd,0x15,0x1d,0xe2,0xf1,0x3e,0xf5,0x05,0xfa,0xc4,0x11,0x30,0x32,0xd7,0xd4,0x04,0x12,0x0d,0x48,0xe3,0xa7,0x07,0xf0,0x87,0x7a,0xe9,0x60,0x5b,0x00,0xcb,0xd4,0xb6,0x9d,0x4a,0x51,0xf4,0xd5,0xc5,0xe2,0x7f,0xf6,0x33,0xc8,0x6b,0x06,0x37,0xdc,0xdf,0x26,0x0a,0x50,0x00,0x1c,0x3f,0xc1,0x0d,0x33,0xd7,0x1f,0x90,0xf9,0xf3,0xe7,0x15,0xac,0xe6,0x11,0x12,0xfe,0x26,0x22,0x22,0x63,0xf8,0xa5,0x4d,0xeb,0xc5,0x54,0x34,0xc2,0xec,0x33,0x33,0x65,0x0d,0x3a,0x4e,0x1a,0x05,0xcf,0x11,0x1c,0xbf,0x46,0x6a,0xe1,0xfc,0x34,0x89,0x42,0x2a,0xea,0xc4,0xdb,0xcc,0x40,0xe7,0xf7,0xf2,0x92,0xdc,0x0d,0x55,0x0e,0x0a,0xfc,0x14,0x06,0xf5,0x1a,0xb6,0x0e,0xd1,0x53,0xdb,0x36,0x12,0x16,0x08,0xd4,0x16,0x0f,0x33,0xef,0xc4,0x4b,0xb1,0x1e,0xf6,0xe5,0x47,0x0a,0xfe,0xc4,0xfd,0x04,0x35,0xfc,0x15,0x2b,0xe2,0x23,0x0c,0x2a,0x17,0x7f,0xc5,0xe2,0xb6,0xb3,0x23,0xf3,0xd0,0xac,0xe5,0xd0,0xc5,0xf7,0xe2,0xf4,0x06,0x1b,0x0d,0x1e,0xe8,0x10,0x0b,0xe8,0x1d,0xe3,0xdd,0xc0,0xe2,0x15,0xc7,0x3f,0xe9,0xf5,0xca,0x0b,0xf1,0x5e,0x4c,0x6e,0xf3,0xce,0xde,0xf9,0xec,0x33,0xe8,0xf3,0x13,0xe1,0x1a,0xf5,0x08,0xf3,0x1b,0x3c,0x1e,0xf0,0xd7,0x18,0xfe,0x2e,0x24,0xff,0x08,0x3f,0xa6,0x36,0x31,0xe0,0x12,0x0d,0xd1,0x49,0xeb,0x6e,0xdb,0x3e,0xea,0x08,0xe0,0xc0,0x19,0xd8,0x04,0xcc,0xd9,0x02,0xff,0x0d,0x31,0x00,0xcb,0x0e,0xed,0x57,0x1d,0xe0,0xdb,0x6a,0xf0,0xf3,0xee,0xbd,0xc2,0x27,0x06,0xe4,0xf0,0x15,0xcb,0x09,0xdf,0x10,0xe4,0xdf,0xbb,0xe2,0x1b,0x1b,0x19,0x14,0xb6,0x1a,0x95,0x50,0xdf,0x32,0xfd,0xd6,0x20,0x1e,0x00,0x20,0x14,0x3f,0x3d,0x38,0x09,0x10,0x31,0x28,0x0f,0xeb,0xfb,0xda,0xd2,0x0c,0xe7,0x31,0xe8,0x0f,0x1e,0xdb,0x30,0x27,0xa2,0x00,0x03,0xfe,0x01,0x08,0xe7,0x89,0xdd,0x9b,0x7f,0x0b,0x01,0xf1,0xea,0xf5,0xdc,0xae,0xf5,0x28,0x02,0x42,0xfb,0x53,0xea,0x25,0x13,0x18,0xfc,0x19,0x10,0x3a,0xe5,0x04,0xe5,0xf4,0x0b,0xf8,0xfa,0xff,0x29,0x3e,0x0b,0x15,0x00,0x26,0xfb,0x2f,0x08,0x2c,0xc9,0x12,0xda,0xe2,0x1f,0xe1,0x2c,0x4f,0x69,0x13,0x07,0xcb,0xd6,0xe6,0x1c,0xf7,0x15,0x04,0x19,0xd8,0x06,0x24,0x03,0x04,0x0b,0xe3,0xf8,0x1b,0xce,0xeb,0x01,0x05,0xf9,0x05,0xff,0xdd,0xe9,0x16,0x1f,0x0b,0x0f,0xed,0xd8,0x32,0x27,0xda,0xe4,0x2a,0xfb,0xd1,0xed,0x07,0xd9,0xfd,0x13,0xe9,0x11,0x0d,0xd3,0xf9,0x11,0xf8,0xfa,0xc4,0xe6,0xe5,0x0c,0xd8,0xed,0x10,0xcf,0xf9,0xd9,0x50,0x0b,0x18,0xf8,0xe2,0xf5,0xe9,0xee,0xea,0xe3,0x10,0x2f,0xd5,0xf4,0xe5,0xdf,0xd3,0xde,0x22,0x09,0xf2,0x02,0xe1,0xfc,0xf2,0xe3,0xb7,0x25,0x05,0x22,0xd0,0x1d,0x10,0x39,0xf4,0xf8,0xd2,0x09,0x20,0x7f,0xe8,0x1a,0x13,0x0c,0x11,0xf6,0x10,0xe9,0xf0,0x17,0x33,0xd2,0xf7,0xde,0x0a,0xe3,0xd6,0xf8,0x12,0x00,0xb4,0x05,0xe0,0x00,0x1a,0xef,0xdc,0xd0,0x11,0xe0,0x41,0xdf,0x06,0x13,0x15,0x1e,0xe8,0xc2,0xc0,0xe7,0x16,0x19,0xed,0x50,0xd5,0xe2,0x04,0xcb,0x17,0x04,0x0c,0xa6,0xa6,0x06,0xee,0x33,0x1a,0x44,0x30,0x12,0xda,0x39,0x15,0x9a,0xea,0x22,0x1a,0xc8,0x21,0xd2,0xcb,0x37,0xcb,0x04,0xe6,0x48,0x03,0x28,0x13,0x0a,0xf4,0xdd,0xea,0xd8,0xed,0x99,0xfa,0xb7,0xce,0xec,0x26,0xfb,0x2e,0x23,0x3e,0xfa,0x9e,0xb7,0xc7,0x3d,0x36,0xdc,0xf3,0x32,0x33,0xe3,0xf3,0xe4,0xfd,0x0e,0xef,0xef,0xc8,0xe1,0xeb,0x52,0x11,0xd7,0xf2,0xd3,0x30,0xec,0x53,0xe4,0xe8,0x7f,0x01,0xf3,0x28,0xdb,0x45,0x2c,0xf7,0x33,0x0b,0x20,0x00,0x5d,0xf6,0x25,0xd4,0x04,0xf7,0x1b,0x1a,0x03,0x14,0xb8,0x10,0xdd,0xe9,0x31,0x3c,0xd5,0x01,0xfb,0xfd,0xd2,0xd7,0x37,0xdf,0x0a,0x40,0x1f,0xe5,0xd8,0xd7,0x9f,0xcd,0xe6,0x1f,0x02,0xf9,0xe2,0x7b,0x2f,0x2f,0x22,0x03,0xf1,0xfc,0x19,0xd5,0x41,0x03,0x4d,0xf7,0xd1,0x19,0x30,0x04,0xae,0x25,0x59,0x7f,0xc4,0x09,0x28,0x31,0x0b,0x24,0xb8,0x6e,0xbd,0xe7,0x33,0xd4,0xfa,0xda,0x1e,0xe3,0xe6,0x2a,0xb5,0x2d,0x1f,0xf8,0xbc,0x48,0x09,0x2e,0xfe,0x4a,0x24,0x13,0xd1,0xde,0x52,0xb8,0x34,0x9f,0x12,0xd2,0xd5,0xf5,0xd6,0x03,0x14,0x1f,0x11,0x15,0x47,0x71,0x13,0x02,0xde,0xdc,0xd9,0x01,0x64,0x51,0x04,0xb0,0x1d,0x22,0x03,0xc7,0xbc,0x24,0xc1,0xca,0x0d,0x04,0x41,0x1c,0x3b,0xcc,0x11,0xdd,0x0b,0xe8,0x34,0x30,0xf9,0xf1,0x30,0xba,0xde,0x94,0x07,0x4a,0x30,0x4d,0x20,0x13,0x04,0xf5,0xda,0xf1,0xe4,0xfe,0x24,0x43,0xf2,0xfc,0x0a,0xd3,0x1b,0x14,0x0f,0xd6,0xf4,0xfa,0xf4,0x15,0xed,0x41,0x37,0xdc,0xe3,0xe6,0xe9,0x0d,0xff,0x11,0xcc,0x1b,0x66,0x44,0x9e,0x27,0x1a,0x33,0xf7,0x18,0xc2,0xdf,0xea,0x28,0x0f,0xf5,0x02,0x06,0x1c,0xe7,0x09,0xf2,0x35,0xf1,0x05,0x1d,0x9d,0x3a,0x03,0x1c,0x41,0xd4,0xfb,0x56,0x12,0x1d,0x15,0xf6,0x09,0x0e,0xe4,0xee,0x05,0x0c,0xb3,0xee,0xc9,0xea,0xe2,0x41,0xe0,0xdb,0x19,0x35,0xf7,0x6b,0x2f,0xdf,0xc2,0xff,0x03,0xeb,0xf2,0x3e,0x19,0xcf,0x32,0xfa,0xb8,0x2f,0x04,0x25,0xca,0x1f,0x09,0x68,0x3e,0x13,0x07,0xdc,0x07,0x01,0xe4,0x1b,0x7f,0x38,0xf5,0xff,0xf8,0xe0,0xf3,0x05,0x04,0xdb,0xdf,0x33,0x31,0x1d,0xf6,0x1e,0xe2,0x0b,0x10,0xf9,0x0a,0x0d,0xaf,0xdb,0xe6,0xde,0x10,0x04,0x11,0xb5,0xd3,0x37,0xd0,0xe7,0x0f,0x16,0xd5,0xd1,0x13,0xd0,0x1e,0x18,0x3b,0xda,0x01,0x35,0x1c,0xe7,0xba,0xfd,0xe3,0x2d,0x8e,0x18,0x3c,0xf1,0x05,0x29,0x05,0x30,0xa6,0xd5,0x09,0xf0,0x7f,0xe2,0xe0,0xdf,0xe6,0xd6,0xef,0x0d,0xb9,0x16,0x3f,0x06,0x0c,0x2a,0xdf,0x2f,0x16,0xeb,0xe8,0xbf,0x6e,0xf2,0xe8,0xc9,0x7c,0x30,0xf4,0xdd,0xef,0xeb,0xd2,0xbb,0x1e,0x01,0x01,0x3c,0xdf,0xe1,0xff,0xc1,0x28,0xde,0x07,0x2b,0x0a,0x14,0xb9,0x13,0xcc,0x23,0xfe,0x57,0xfb,0xbb,0xed,0x05,0x20,0x36,0xc1,0x52,0xf7,0xb6,0x59,0x0e,0xf0,0xe8,0xe1,0xf9,0xee,0xf6,0x30,0x07,0x0a,0x52,0x3d,0xf4,0xe8,0xe0,0x06,0xdb,0xe8,0x0a,0x45,0x18,0x2d,0xd2,0xb4,0xef,0xc7,0xb6,0xe9,0xc8,0x5f,0x0d,0xc9,0x05,0xef,0x4a,0xd9,0xb1,0x32,0x0d,0x44,0x18,0x90,0x0a,0x1f,0xf4,0xe8,0xf2,0x86,0xec,0x66,0x19,0x1e,0x04,0x6f,0xb0,0xda,0x1f,0x07,0x00,0xde,0x41,0xc9,0xeb,0x41,0xeb,0x14,0xa1,0x0a,0xec,0xb1,0x62,0xae,0x0d,0x9b,0xd7,0x14,0xeb,0x0e,0x13,0xff,0x47,0xcc,0xfc,0x49,0xca,0x58,0xc2,0x26,0xb8,0x1d,0x45,0xa7,0xec,0xe5,0x33,0x0f,0x01,0xc7,0x06,0xca,0xf3,0xd3,0x2a,0xfc,0xda,0x0c,0x05,0xc4,0x03,0xda,0x44,0xd1,0xed,0xd8,0x2a,0x0f,0x2e,0x19,0xf1,0x06,0x2f,0xee,0xcd,0xe9,0xda,0x30,0x03,0x19,0x04,0x62,0xf6,0x19,0xdc,0xe5,0x61,0xb4,0xef,0xf6,0x81,0xa6,0xdb,0x59,0xdf,0xf1,0x00,0xdb,0x08,0xf0,0x2c,0xc7,0xef,0xc0,0xe0,0xe5,0x0a,0x01,0x2b,0x2d,0x09,0xff,0x82,0xf4,0xe0,0xf0,0xd0,0xd2,0x59,0x7d,0x20,0xc5,0x34,0xa9,0x3f,0x4b,0xd5,0x02,0xe3,0x1a,0xf0,0xbb,0xe6,0xd9,0xe7,0xfa,0x0f,0x35,0xef,0xd7,0xdb,0x06,0x40,0xf0,0xa9,0xff,0xf0,0x22,0x37,0xfe,0xe7,0x25,0xa3,0x34,0xd4,0x2d,0xdf,0x14,0x90,0x29,0x2a,0x1c,0xc5,0x3f,0xd3,0xdc,0x06,0x0c,0xb6,0x7f,0x69,0x52,0x10,0xca,0x10,0x27,0xc2,0xc1,0xdc,0xc1,0x02,0xe8,0x21,0xff,0xf6,0x15,0x17,0xf7,0xcb,0x1f,0x14,0xa2,0xe3,0xcc,0x5a,0x0e,0x46,0x10,0xcd,0x00,0x12,0xd5,0x0e,0xf4,0xc9,0x28,0xc3,0xb8,0xf0,0x01,0xb4,0xf4,0x1d,0x8a,0x33,0x1a,0xde,0xdb,0x37,0x11,0xf1,0x1a,0x14,0xfd,0x4f,0xd4,0xc2,0x09,0xed,0x3a,0xf8,0xb3,0xc3,0xec,0x34,0x05,0xe0,0x35,0x11,0xd6,0x08,0xe8,0xc4,0x2b,0x22,0xf6,0xf8,0x02,0x24,0x19,0x46,0xde,0xaf,0x34,0xff,0x04,0xe7,0x11,0x16,0xe5,0xbd,0xe5,0x1a,0x1a,0xf9,0xe1,0x16,0x16,0x5d,0xf1,0xbe,0x32,0xd7,0x05,0x01,0xd5,0xee,0xd2,0x39,0xd2,0x1a,0xe3,0xea,0x57,0x6a,0x31,0xa5,0xe4,0xc9,0xf8,0x05,0xa4,0xc8,0x25,0xde,0xaf,0x13,0x7f,0x16,0xb7,0xb2,0xfa,0x32,0xe2,0x4e,0x11,0xa5,0x3b,0x06,0xee,0x42,0xd8,0x3a,0xfd,0xc6,0x1f,0x50,0x11,0xf8,0x30,0xf6,0xeb,0xfd,0xf4,0xfa,0xf7,0x38,0x0b,0x3a,0x34,0x47,0xf8,0x25,0xfc,0xe4,0x19,0x35,0x2e,0xd2,0xcb,0xd5,0xe8,0x24,0xcb,0x05,0x21,0x12,0xf2,0xfb,0x1e,0x34,0xed,0xfe,0xf6,0x39,0xde,0x27,0x0a,0x28,0x1a,0x21,0x0b,0x11,0x00,0xf5,0xf7,0x02,0x35,0x0f,0xe0,0x1f,0xe5,0xd9,0x70,0x2e,0x08,0xd6,0x3a,0x1f,0xda,0x0f,0x0a,0xf0,0xdb,0xe3,0x01,0xe6,0xe2,0xdb,0xec,0xf5,0xf6,0x0a,0x8e,0xd8,0xf7,0xb1,0xef,0x26,0x0a,0x1a,0x19,0xc2,0x09,0xe1,0xe4,0x44,0xdc,0x35,0x19,0x16,0xea,0xb9,0x27,0x05,0x24,0x25,0xda,0xfa,0xe7,0x0e,0x0c,0xfc,0x42,0xa9,0xd8,0x1c,0x23,0x4a,0x4c,0xf8,0x40,0x11,0xf4,0x26,0xf2,0xeb,0xca,0x0b,0xe7,0xfc,0x2a,0xd2,0x08,0xd0,0xf5,0xb8,0xf9,0x61,0x0e,0xf6,0xdc,0xe4,0xdb,0xd5,0xfd,0xb2,0x07,0x0f,0xc0,0x81,0x00,0x22,0xfe,0xdb,0x0c,0xc6,0xff,0x15,0x20,0xfa,0xbc,0xd2,0xc6,0xb9,0xf6,0xf2,0xfa,0x19,0x28,0xef,0x32,0xe3,0xec,0x28,0x1a,0x59,0xc9,0xf8,0x08,0xc6,0x20,0xf3,0x22,0xcd,0xbe,0x20,0x29,0xd4,0x0f,0x30,0x36,0xc2,0x1f,0x0e,0xdc,0x4f,0xf9,0x03,0xd6,0x1c,0x42,0xed,0xee,0x15,0x24,0x33,0xe7,0x61,0x05,0xc8,0x0d,0x3c,0xc8,0x00,0xdd,0xe1,0x15,0x4e,0x22,0xfe,0x2d,0x04,0x00,0x44,0xc3,0xee,0x17,0xf8,0x36,0xee,0x2c,0x3c,0xec,0x7f,0x04,0x18,0xc6,0xc3,0x1f,0xd6,0x1f,0xcb,0xfe,0x26,0xeb,0x09,0x4a,0x33,0x15,0x41,0x27,0x05,0x18,0x5d,0x06,0xf7,0xf9,0x04,0xd5,0xf3,0xff,0x2d,0xea,0xd7,0x5c,0x1c,0xcb,0x1c,0x1d,0x0d,0xd6,0x42,0x15,0x6f,0x6f,0x27,0xdf,0x02,0x1b,0x03,0x21,0x2d,0x43,0x0a,0x14,0xf5,0xe8,0xef,0x49,0x10,0x1e,0x1e,0xf6,0x52,0x33,0xfe,0x21,0x23,0xd3,0xed,0xd6,0x15,0xed,0xdb,0x27,0x02,0xb8,0x30,0x2c,0xf7,0xe4,0xf4,0x35,0xc2,0xbf,0xd7,0xdd,0xf9,0x42,0xfe,0xd7,0x20,0xd8,0x7f,0xf7,0xc2,0x2b,0x28,0xee,0x00,0xce,0x09,0xe3,0x23,0x23,0xc9,0x13,0xf7,0x14,0xe7,0xd4,0xf8,0xf3,0x22,0xf3,0xf4,0x07,0xa1,0xf4,0xbb,0x03,0xb3,0x29,0x17,0x20,0xff,0xe8,0x05,0x56,0x72,0x2a,0x3b,0x3c,0xf6,0x03,0x27,0xb6,0xf5,0x15,0xdc,0x7f,0x56,0x0c,0xd7,0xed,0x76,0xb2,0x15,0x49,0xf5,0x03,0xde,0xd6,0x09,0xc6,0xe2,0x28,0x32,0xe1,0x29,0x53,0xfe,0x34,0xf8,0xe5,0x05,0x29,0x09,0xed,0x51,0x0a,0x33,0xf6,0xf1,0xfa,0x0c,0xf4,0x24,0xad,0x42,0xe0,0xa7,0xfc,0xc9,0xad,0x04,0xeb,0x31,0x22,0xdd,0x14,0xf7,0x0b,0x9e,0x0d,0xd2,0xee,0xdd,0xfb,0x03,0xca,0x0a,0x0c,0xdf,0xd8,0x16,0xf3,0xcb,0x5a,0x38,0xe7,0xd9,0xee,0xd6,0x01,0x0c,0xc4,0x5d,0xfd,0xe7,0xee,0x0a,0xf7,0x25,0x5d,0x0b,0xd9,0x10,0xda,0xd4,0xfb,0xc3,0x06,0x2f,0x1f,0x20,0xe1,0x09,0xf6,0x19,0x0a,0x2c,0xda,0xa2,0xec,0xda,0x21,0x0f,0x25,0xc3,0xf3,0xeb,0x40,0xe5,0x01,0xe9,0x04,0xf8,0x05,0xcf,0xe4,0x51,0x35,0x0c,0xea,0xe3,0xc0,0xdc,0xd6,0xec,0x64,0x38,0x7f,0xd3,0x5f,0xde,0x08,0xe7,0x2e,0xfe,0xec,0xd5,0xeb,0x33,0xe0,0xcf,0x19,0xde,0x36,0xf4,0xe8,0x19,0xdb,0xee,0xf3,0xf4,0x27,0x22,0x12,0xf4,0xd8,0xe3,0xd0,0xe2,0x14,0x3e,0xfa,0xed,0xeb,0x03,0xfb,0x49,0x0a,0x31,0xec,0x22,0xe4,0x8e,0xf7,0xed,0xd5,0xf2,0x09,0xe0,0x0f,0xea,0xa8,0xec,0x3a,0x11,0xd7,0xc9,0x14,0x93,0x17,0xff,0x01,0xeb,0x0e,0x02,0xe8,0x6a,0xe1,0x3d,0x3a,0xb7,0xd2,0xdd,0x18,0x3f,0xf2,0x4a,0xc6,0x08,0x7f,0x56,0xe5,0xe5,0x36,0xe7,0xee,0xe4,0xa1,0x95,0xb0,0x47,0x04,0x19,0xfd,0xdd,0x28,0xd6,0x4a,0xd1,0x04,0xcf,0xbd,0xf1,0x9b,0xfc,0xe5,0x2a,0x2c,0x29,0xfc,0xcd,0x2a,0xb3,0x0a,0xe9,0x0f,0x94,0x6d,0x20,0x2b,0xff,0xc3,0xe9,0x12,0xb3,0xa6,0x5a,0xbf,0xfb,0x14,0x36,0x2a,0x05,0x3b,0x51,0x0f,0xf9,0xc7,0xdd,0xdb,0x30,0x9d,0xbc,0x2f,0x07,0x0b,0x28,0x1a,0xb4,0xbd,0x1c,0x0a,0x5c,0x32,0xe0,0xee,0x1a,0x15,0x22,0x13,0x03,0x1d,0xfb,0x02,0x6c,0xcb,0x01,0x62,0xc2,0x1f,0x4d,0x19,0x3d,0x31,0xf5,0x04,0xee,0xf9,0x45,0x38,0x05,0x08,0xe9,0xdd,0x2a,0xe4,0xc3,0xfc,0x13,0x02,0xe5,0x30,0xf0,0x12,0xe9,0x4a,0xda,0x21,0x29,0x30,0x2e,0xc0,0x36,0x05,0xe0,0xaa,0xda,0x10,0xd2,0x32,0xeb,0xf3,0xf0,0x7f,0x22,0x36,0x08,0xec,0x9b,0xb6,0xdb,0xe1,0xfe,0x07,0xd7,0xf2,0xb3,0x0e,0x1e,0xec,0x25,0x32,0x1d,0x2d,0x11,0x1e,0xe1,0x69,0x35,0x23,0x51,0x00,0xf1,0x64,0xfd,0xba,0x51,0xdb,0xfb,0xcb,0xfa,0x4f,0x01,0x22,0x37,0x3c,0x2d,0x47,0xc9,0xe4,0x0e,0x0a,0xc2,0x6b,0xa4,0x01,0xbd,0xe4,0xd4,0xde,0x60,0x0e,0x00,0xc6,0x39,0x06,0xed,0xf3,0xcf,0xfb,0x3a,0xf4,0xdd,0xf4,0xd5,0x22,0x2f,0x10,0x57,0x25,0x09,0xdc,0x37,0xb7,0x09,0xf5,0x18,0xfe,0x28,0x27,0x10,0x49,0x18,0xde,0x08,0xd3,0x1b,0x1d,0xee,0xc6,0x55,0xde,0xd0,0xf1,0xff,0xeb,0x18,0x79,0xfd,0xbf,0xf3,0x05,0x09,0x1e,0x24,0xec,0xc7,0xe5,0xfe,0x0c,0x25,0x3a,0x7f,0xf9,0x0a,0xd2,0x3a,0xc1,0x01,0x50,0x05,0xe9,0x37,0x20,0xfc,0xe7,0x1b,0xf8,0xeb,0xdc,0x13,0xec,0x1e,0x0f,0xef,0x29,0xe7,0xbf,0x03,0xda,0x02,0xdf,0xea,0x10,0xe9,0xfa,0x77,0xed,0x47,0xe2,0x1d,0x1d,0x0c,0x66,0xe4,0xca,0xc0,0x1d,0x6f,0xfa,0xeb,0x0f,0xb3,0xfb,0xec,0xff,0x04,0xd4,0xe1,0x08,0x34,0xc3,0xe3,0xe2,0x03,0xde,0x0c,0xeb,0xfb,0x1a,0x12,0xe6,0xdc,0x19,0x31,0xfe,0xe0,0x16,0x4d,0x32,0x51,0xe7,0xdf,0x13,0xcf,0x41,0xf9,0x4b,0x28,0xf9,0xea,0xe9,0xbd,0x15,0xcc,0x28,0x18,0xef,0xba,0xdf,0x26,0x2c,0x1b,0xde,0x09,0xeb,0xe9,0x0d,0xb4,0x6e,0xcc,0x43,0x1a,0x2b,0xf1,0xf9,0x3c,0xe5,0x30,0x28,0x05,0xd8,0x3e,0x45,0x17,0xe2,0xde,0x1f,0x2e,0x30,0x34,0xcc,0xb2,0xda,0xd8,0xf7,0xe0,0x0f,0xf4,0x94,0x03,0xc4,0xcf,0x46,0x3f,0x18,0xd8,0x7f,0x29,0x0a,0xa1,0x27,0x48,0xfa,0xe3,0xf4,0xbe,0xcf,0x29,0x0a,0xf5,0xf7,0x39,0x00,0xc7,0x47,0x08,0xeb,0xa8,0xb7,0xc6,0x07,0xf2,0xf3,0x37,0x53,0x4b,0x0c,0x19,0xc4,0xff,0xe3,0x2a,0x18,0x17,0x12,0x9a,0x25,0x06,0x21,0x3e,0xd0,0xb5,0x11,0x0d,0x0b,0x8e,0x51,0xdc,0xed,0x9f,0x13,0xa6,0x25,0x23,0x07,0xf5,0xcc,0xf9,0xf0,0x76,0x08,0xd0,0xe5,0x0d,0xf0,0xf2,0xd7,0xeb,0x74,0xe0,0x29,0xd7,0xdb,0xcb,0xc1,0x2a,0xb6,0x12,0xd7,0x17,0x2e,0x3a,0x38,0xd9,0x34,0xe3,0x11,0x19,0x03,0x05,0x1f,0xd5,0xe4,0x4a,0x24,0xdf,0x16,0xf2,0x21,0x08,0xcd,0x2c,0xdb,0x21,0xbd,0x3a,0xf7,0xf9,0xba,0xfb,0x8a,0x88,0x23,0xd3,0xc6,0xcd,0x34,0xd8,0x0c,0xed,0xc3,0xee,0x1b,0xbe,0xf2,0x40,0xe0,0xc3,0x03,0x1b,0xe9,0x36,0x02,0xf1,0xf5,0xb3,0x31,0x2f,0xf7,0xdf,0xf4,0x6c,0x0d,0x81,0xf8,0x15,0x0e,0x10,0xf7,0x45,0xc4,0xdf,0xb6,0xdf,0x34,0x02,0xe5,0xff,0xfd,0xfe,0x19,0xfa,0x15,0xe7,0x27,0xfb,0x6d,0xcd,0xea,0xa7,0x07,0x85,0x37,0x07,0xd7,0xf5,0x07,0xf5,0xee,0xc8,0x37,0xd1,0xd7,0x03,0xe5,0xe8,0x11,0xf7,0x3c,0xe4,0x29,0x40,0x20,0xd6,0x07,0xaf,0x35,0xb7,0xe6,0xeb,0x2e,0x2d,0x0b,0xfd,0xf2,0xeb,0xe8,0xf0,0x4d,0xf8,0x28,0xf8,0xf1,0xf2,0x0e,0xd8,0x18,0xf7,0xe9,0x0b,0xdb,0x29,0xf7,0xed,0xfb,0x0e,0x5b,0x10,0xd6,0x45,0xf3,0xae,0xd6,0xdc,0x3a,0x3c,0xbc,0xed,0xb7,0xed,0x1e,0xe7,0xe6,0x05,0x1a,0x04,0x20,0xe4,0xdd,0xd8,0xfb,0x00,0xe1,0xfb,0xe4,0xdc,0x04,0xc3,0xf6,0x37,0x14,0x02,0x26,0xe7,0xe3,0xe8,0xbd,0xea,0x23,0xbe,0x0e,0xe6,0x3f,0x1c,0x3a,0x74,0xcf,0x38,0xc2,0xf6,0xc2,0x12,0x41,0xfd,0x35,0x45,0x35,0xf8,0x20,0x0c,0x07,0xad,0xfa,0x10,0x0b,0xd3,0xf3,0xd4,0xdd,0xf4,0x03,0x0b,0xd7,0x2a,0x3a,0x07,0x26,0x14,0xd9,0xb3,0x01,0xdf,0xdb,0xf3,0xdf,0xd6,0xfa,0x3e,0xb8,0xea,0x37,0xe8,0x03,0x1e,0xe0,0x0c,0x3e,0xf9,0xca,0xbe,0x7f,0xfe,0x4a,0x17,0x3d,0x01,0xcc,0xf9,0x4e,0xdb,0xd6,0xd5,0xdc,0xd2,0xfe,0x2b,0x03,0xdb,0xd9,0x40,0xf2,0xf3,0x2a,0xb8,0x0e,0xff,0xc0,0x02,0xad,0xed,0xf2,0xed,0x25,0xf8,0x8f,0xec,0xfa,0x20,0xe6,0xf0,0x0b,0xcd,0x3d,0x03,0x11,0x15,0x18,0x09,0x0a,0x46,0x14,0xff,0xfd,0xb1,0x1f,0x30,0xf7,0x1d,0xf5,0x04,0x23,0x2c,0xf6,0x33,0x4b,0xc1,0x0a,0x33,0xb6,0xc2,0x1c,0xac,0x04,0x45,0xee,0xfc,0xa2,0x16,0xfc,0x00,0x16,0xee,0x16,0xf3,0x26,0xcc,0x05,0xea,0xca,0x34,0xba,0x0f,0x2e,0x16,0xd9,0xcc,0x06,0x0c,0x06,0x29,0x30,0x14,0xfb,0xe3,0xfc,0xfe,0x37,0x52,0xdd,0xfd,0xea,0xc2,0x1e,0xdf,0x2a,0x3b,0x0d,0xf2,0xed,0x1c,0xf2,0x81,0xd9,0xe8,0x25,0x78,0x2e,0x20,0xe8,0xa8,0x12,0x29,0x26,0xf8,0x3c,0xfb,0x3f,0x14,0x75,0xfd,0xb5,0x06,0x65,0x92,0xe5,0x44,0x0a,0xc7,0xba,0x28,0xff,0xde,0x0c,0x20,0x35,0xd1,0x21,0x1a,0x69,0x33,0x50,0x1d,0x27,0xda,0x8d,0x1c,0xea,0x31,0x12,0x57,0x11,0x1f,0xfc,0xa4,0xfd,0xe3,0xea,0x09,0xef,0xce,0x27,0x09,0x4a,0xe7,0xea,0x0c,0xcc,0xef,0x3c,0x56,0xee,0xfa,0x3b,0x1b,0xdb,0x23,0xec,0x23,0xb4,0xc9,0xdd,0xfd,0x56,0xe1,0x44,0xbd,0xb8,0x3f,0xc5,0xc6,0xef,0xe1,0x1e,0xea,0xe7,0xd4,0x0d,0x3b,0x5d,0x73,0x29,0x0b,0xdd,0xfb,0xf0,0x53,0xc7,0xb3,0x21,0x3d,0x81,0xb6,0x11,0xbb,0xb9,0x0d,0x14,0x6a,0x65,0xfe,0x9e,0x0d,0x2a,0x45,0x9d,0x29,0x31,0x04,0xe5,0xf5,0x37,0x40,0x25,0xca,0xfc,0x57,0x1f,0xde,0x37,0x50,0x33,0x1b,0x04,0xfd,0x14,0xef,0x37,0x34,0x3f,0xf3,0xd3,0xc3,0xa8,0xf4,0x1d,0xd7,0x91,0x2d,0xe1,0x02,0xb9,0xf9,0xb9,0xcb,0x2b,0xd3,0x04,0xe0,0x34,0x17,0xec,0x0a,0xda,0xe3,0x14,0xd4,0x25,0x24,0x97,0xfe,0xe4,0x0e,0x35,0xe9,0xb5,0xdd,0x1b,0x2b,0x24,0xc0,0xdf,0x0a,0xd6,0xf6,0xf3,0x12,0xe0,0xe8,0xf8,0xdb,0xdf,0x26,0xdd,0xaf,0x1b,0xf4,0x0c,0x15,0x54,0x0c,0x06,0xea,0x11,0xe1,0x3b,0xbc,0xc0,0x3a,0xf7,0xb6,0x1b,0xc9,0xea,0x6c,0xd3,0xe4,0x06,0xcc,0xfd,0x5e,0x11,0x3d,0xfb,0xea,0x08,0xd5,0xad,0xe3,0x31,0xd5,0xd4,0x17,0x02,0x09,0x24,0xcb,0x04,0xed,0x10,0xf5,0x06,0xcf,0xe1,0x17,0x17,0xc2,0x23,0xeb,0x17,0x1e,0xff,0x81,0xd6,0xe5,0xea,0xea,0xf2,0x05,0x11,0xe5,0xd5,0xe8,0x6d,0x14,0x15,0x12,0xdd,0x99,0x55,0x96,0xb2,0xfc,0xe4,0xb3,0xba,0x22,0xee,0x0b,0xe3,0x32,0xfb,0xe0,0x20,0xfb,0x09,0x39,0xde,0xe6,0xe0,0x09,0xc3,0xf6,0x25,0x18,0x01,0x20,0x38,0x30,0x0a,0x16,0xeb,0x29,0xdc,0x18,0x09,0xf2,0x7e,0xed,0x5e,0xcb,0x1c,0xf9,0xec,0x21,0x2b,0x20,0xe9,0x38,0x42,0x04,0x06,0x21,0xb6,0xf7,0x15,0xda,0xd7,0xd8,0x53,0xb7,0x00,0xc8,0xef,0x28,0x56,0x10,0x13,0x14,0x14,0xe2,0x28,0xc1,0x50,0xb7,0x28,0x42,0xd5,0x48,0xf2,0x2a,0xef,0x0c,0xeb,0x00,0xfd,0xeb,0xe0,0x54,0x4a,0xdb,0xcc,0x0b,0x22,0x35,0x16,0x18,0xf5,0x01,0xfa,0x7f,0xfb,0xa9,0x44,0x2c,0x1e,0xff,0x30,0xb6,0x2c,0x92,0x22,0xcb,0x64,0xf0,0x64,0x11,0x29,0x0a,0xdb,0xfe,0x0f,0xdc,0xf0,0x70,0xcf,0x1e,0x0d,0x00,0x2c,0xe3,0x15,0x1e,0xc0,0xd1,0x6c,0xed,0x14,0x36,0xcb,0xc0,0xe2,0x14,0xc7,0x26,0x0d,0x10,0xc6,0x0d,0xab,0x19,0xfa,0xf4,0x0b,0x01,0xeb,0x40,0x1d,0xee,0x0b,0xeb,0x76,0xeb,0xd8,0xe7,0x03,0x2f,0xca,0x11,0xf1,0x08,0xec,0xc8,0x07,0xf5,0xdc,0x05,0xfd,0x61,0x43,0xcf,0xe9,0xa4,0x0e,0x4c,0xe7,0xe5,0x59,0xc0,0xe0,0xd0,0xd9,0xdc,0xd9,0xee,0x23,0xd0,0x01,0xed,0x14,0xa4,0xd9,0x02,0x0c,0x4c,0x47,0x4b,0x33,0x23,0x2a,0x25,0xd1,0x17,0x16,0xf3,0x10,0x04,0x09,0xde,0x17,0x0e,0xff,0x60,0x11,0xf2,0xd7,0x07,0x05,0xe4,0xe1,0x15,0x7f,0x2c,0x06,0xe6,0x22,0xdb,0x17,0x11,0x03,0x33,0x2c,0xbc,0x15,0xfe,0xcc,0x21,0x23,0x08,0xd9,0xf7,0xfd,0xc3,0x10,0x27,0xf2,0x37,0x4c,0xd0,0xec,0x12,0xeb,0x55,0x07,0xcd,0xf6,0x07,0x3f,0xe8,0x09,0xe6,0x36,0xf3,0xe5,0x19,0x12,0x18,0xdc,0xd7,0xc6,0xe5,0xc5,0x2e,0xc8,0x14,0x07,0xc8,0x01,0x04,0x7f,0x03,0x47,0x2a,0xc2,0xaf,0x6a,0x1b,0xe9,0xe3,0x00,0xfb,0xe3,0x08,0x29,0x3f,0xf7,0xe4,0x27,0x9b,0x2c,0xa4,0xb5,0xe3,0xc9,0xc3,0xd2,0x10,0xe6,0x7f,0x87,0x0e,0xde,0xf3,0xd9,0xde,0xb7,0xd7,0xed,0x41,0xc8,0x1a,0xdf,0xae,0xe8,0xbb,0x11,0xd0,0xfa,0xe9,0x71,0xe3,0x2d,0xa5,0x35,0xf4,0xed,0xf1,0xea,0x13,0x31,0x3b,0x08,0x33,0x39,0x27,0x18,0xb6,0xcb,0xc3,0x18,0xfc,0x1d,0x0a,0x27,0xa2,0x1e,0xa5,0xdb,0xfb,0xcf,0xda,0xa7,0xd2,0xa3,0xe5,0xf6,0xf6,0xdd,0xfb,0x10,0x05,0xf0,0x44,0xe1,0xb1,0x1c,0xec,0xe0,0x16,0x05,0xdb,0x68,0xc9,0x0a,0xf2,0xf2,0x1f,0x21,0x3c,0xd0,0xca,0xe9,0x2a,0xd8,0xe1,0x76,0xb3,0x61,0xef,0xd0,0xf2,0x2d,0xf8,0x4a,0xfd,0xf1,0x01,0xba,0xfd,0x02,0x41,0xba,0x3b,0xe9,0xd4,0xe6,0x53,0x1a,0x04,0xba,0xe6,0x46,0xb5,0xfa,0x1b,0xcc,0x2f,0xeb,0x0f,0xe9,0xdc,0x61,0xbe,0xed,0x20,0x27,0x9e,0xed,0x94,0x34,0x24,0x14,0xaa,0xf9,0xf2,0x1f,0x2a,0x24,0x22,0xe8,0xb5,0x0d,0xbd,0xda,0xef,0xd3,0xca,0x7f,0x56,0xd4,0x02,0x06,0xf3,0xe6,0xe0,0x6c,0xc8,0xa0,0xd8,0xd0,0xef,0x3a,0xbe,0x42,0xd7,0x22,0xfe,0x36,0xe6,0x06,0x1a,0xf3,0x0d,0x1c,0x10,0xe9,0xce,0xde,0x19,0x20,0x0b,0xc8,0xfc,0x0a,0xd4,0xf3,0xe0,0x0a,0xe0,0xe0,0xd2,0x0c,0xf6,0xfc,0xf8,0x22,0xe6,0xee,0x65,0x0a,0x7f,0x35,0x0b,0x2f,0xee,0x08,0xeb,0xf7,0xdd,0xf8,0x1d,0x25,0x21,0xf1,0x07,0xe5,0xf5,0x3c,0x66,0xf6,0x0d,0xe9,0x0e,0xe0,0x17,0xe5,0xf5,0xee,0x0b,0x14,0x06,0xfa,0x00,0x23,0x17,0xd0,0x00,0xe4,0xcc,0x38,0xf2,0xd1,0x12,0xf0,0x12,0xe5,0xed,0x0b,0xe6,0x38,0x42,0x2e,0xb9,0xfd,0x14,0xd3,0x09,0xf4,0xe4,0x1e,0x45,0xd8,0xc4,0xff,0x3d,0xea,0xf7,0x01,0x0d,0xea,0x0c,0xf2,0x06,0x07,0x0c,0xd0,0x05,0xda,0x3b,0xfb,0x19,0x0e,0x70,0xc2,0xfb,0xdc,0x2a,0x22,0x10,0xe6,0xd3,0xf0,0x1d,0x4b,0xb1,0x36,0xf5,0x1f,0xdb,0xf5,0x03,0x15,0xe6,0xe9,0xee,0xf8,0x0f,0x18,0x2e,0x02,0x0e,0x23,0xfe,0x1a,0x33,0x1c,0xa6,0x0f,0xf7,0x67,0x0e,0x0b,0x33,0xc7,0x0a,0x92,0x19,0x1c,0x35,0x17,0xe6,0xf8,0x05,0xd5,0x0b,0x11,0x13,0xfa,0x63,0x15,0xee,0xcd,0xdc,0x2c,0xe5,0xed,0x17,0x14,0xdb,0xcd,0xec,0x09,0x37,0x3b,0x71,0xfe,0xed,0x44,0xc5,0x4a,0xbb,0xaa,0x12,0xec,0x06,0x20,0xde,0x88,0xac,0xfc,0x7d,0x08,0xf8,0x0e,0xb1,0xef,0xd2,0xea,0xf8,0x5e,0xfa,0xd8,0xb1,0x2d,0xf0,0x0f,0x2b,0xfe,0x21,0x0a,0xc2,0xe4,0x0a,0xe2,0xa3,0x2b,0x40,0x3c,0xa7,0xcb,0x28,0x21,0xd4,0xa2,0xd8,0xdd,0x28,0xbc,0xdd,0x2f,0x7f,0x29,0xd4,0x20,0xa9,0x32,0xb9,0x3a,0x2d,0x06,0x12,0x00,0x82,0xfe,0xd2,0x4b,0x5d,0x12,0xf4,0x42,0xae,0xbd,0x62,0xbc,0xfe,0x29,0x04,0x10,0xe9,0xd0,0x00,0x40,0x28,0x3f,0xd9,0x0b,0x01,0x1a,0x10,0x21,0x01,0xe5,0x5f,0x26,0x06,0x26,0x15,0x25,0xbc,0x32,0x19,0x07,0x44,0xba,0x07,0xe7,0xf4,0x06,0x14,0x33,0xf4,0x15,0xf9,0xd2,0xe5,0x27,0x1e,0x15,0x57,0x00,0xfb,0xe3,0x12,0xf1,0x36,0x02,0x38,0x03,0x1b,0xda,0x42,0x0a,0x31,0x66,0x19,0x16,0xc4,0xf1,0x1d,0xf9,0x36,0x52,0xea,0x4d,0x2b,0x20,0xdd,0xfd,0x3a,0x4a,0x7f,0xd5,0xf9,0xc5,0x2e,0x40,0xe9,0x19,0xe7,0x16,0xd0,0xd1,0xf4,0xdb,0xd4,0xe4,0xe0,0x06,0x09,0xee,0xe5,0xe6,0x5d,0xd9,0x49,0xcf,0x25,0xef,0x17,0x13,0xea,0xd5,0xe1,0xe4,0xf2,0x39,0x14,0x22,0xe6,0x37,0xf6,0x08,0x0a,0x17,0x09,0xfc,0x12,0xef,0xf0,0xfe,0xdb,0x0f,0x29,0x2e,0x03,0xeb,0xfa,0x00,0xf9,0x0c,0x3a,0xf2,0xdf,0xe8,0xe4,0xfa,0xfa,0xdd,0x11,0x01,0xe7,0x0a,0x0c,0xde,0x02,0xf8,0xe9,0x25,0x28,0x08,0x0c,0x03,0x0c,0xe2,0xdb,0xe1,0x17,0xfe,0x06,0xdb,0x19,0x19,0x0e,0x21,0x3f,0x12,0x19,0xa7,0x04,0x96,0x01,0x12,0xfe,0xfb,0xd7,0xfc,0xe8,0x2b,0xfc,0x0d,0x00,0xfe,0xf6,0x49,0x02,0xeb,0xf0,0x22,0x5b,0x09,0x7f,0x07,0x02,0xc5,0x24,0xbe,0x13,0x3a,0x02,0x1f,0x32,0x45,0xe9,0xf9,0xee,0xea,0x0a,0x11,0xeb,0xf0,0xeb,0xfc,0xe2,0x0b,0xc4,0xfe,0xf2,0x14,0xe2,0x01,0xf3,0xde,0x1c,0xd3,0x11,0x17,0x25,0xc9,0xfa,0x06,0xdf,0xc6,0xf3,0x0b,0xef,0x18,0x0e,0xf9,0xff,0x0c,0xec,0xff,0xf7,0xed,0xe9,0x02,0xc1,0xd1,0x12,0xdd,0xe3,0x18,0x17,0x07,0x33,0x1b,0xf3,0x06,0x1a,0x0c,0x2d,0xe0,0xe9,0xf2,0xd0,0xf2,0xec,0x1d,0xdf,0x03,0xfc,0x06,0x05,0xea,0x20,0x20,0xd8,0x1d,0xf4,0xff,0x13,0xf2,0x19,0xec,0xf3,0xe2,0xeb,0xd9,0x04,0x2d,0x15,0x13,0x2e,0xfd,0xd0,0xed,0x20,0xfd,0x06,0xf1,0xdd,0x1c,0x4d,0x08,0xf1,0x13,0x01,0xfc,0x1a,0xf4,0x0d,0xff,0xf6,0x14,0x03,0x1c,0x3a,0xf0,0x7f,0xe9,0xff,0xec,0xec,0x2a,0xfa,0x04,0xd9,0x27,0x23,0xd0,0xec,0xff,0x14,0xf8,0x07,0x08,0xe6,0x0c,0x29,0x0e,0x18,0xeb,0xdf,0x0d,0x18,0xe5,0x21,0x01,0x18,0x3a,0xf9,0xf2,0x2a,0x25,0x11,0xd6,0x1f,0x0b,0x29,0x4a,0x03,0xee,0x00,0xf8,0x15,0x07,0x27,0x05,0xff,0x06,0x05,0xe9,0xd9,0x2f,0x0b,0x13,0x06,0xff,0x0b,0x1e,0xed,0x22,0x17,0x0b,0xfd,0xea,0x38,0xd1,0x23,0x08,0x1b,0xce,0xaa,0x34,0x09,0x3a,0xd8,0xe0,0x15,0x10,0xf8,0x29,0xec,0xf3,0xf4,0x23,0x21,0xba,0xf9,0x0d,0x12,0x30,0x03,0xbb,0xfa,0xfb,0xd2,0xd4,0x06,0x16,0x07,0xff,0xfc,0x0d,0xfe,0xd9,0xc8,0xe1,0x46,0xc0,0x13,0xe3,0xe5,0xed,0xf2,0x31,0xae,0x29,0x98,0xfb,0xca,0xdc,0xea,0x08,0xdb,0x2b,0x2d,0xf3,0x16,0x67,0xe0,0xef,0x13,0x40,0xfb,0xe2,0x35,0x62,0x30,0x57,0xa1,0x12,0xf1,0xc1,0xed,0xe5,0xe2,0x1e,0xc3,0xd9,0xf2,0x3f,0x4a,0x05,0xba,0x24,0x81,0xb0,0x18,0x01,0xea,0x04,0x5b,0x36,0xcc,0xab,0xe0,0xe9,0xc8,0xc8,0x50,0xdd,0xde,0x42,0x02,0xd3,0xe3,0xdd,0x10,0xef,0x63,0xf8,0xdd,0xba,0xdf,0xd4,0xe1,0xff,0xfc,0xc6,0x26,0xfa,0xc5,0x39,0x11,0x2d,0x29,0xfd,0xaa,0x2d,0xbd,0xbe,0x04,0xde,0xea,0xe6,0xd1,0xf0,0xfd,0x62,0x0c,0xf7,0x15,0x0e,0xc0,0x33,0xff,0xe9,0x33,0xee,0xdc,0xc8,0xdd,0x11,0x04,0xe3,0x24,0xe7,0x0f,0x27,0xf3,0x07,0x0d,0xc3,0x05,0x15,0xde,0x2e,0xfc,0xf9,0x17,0x41,0x01,0xf5,0x7f,0x38,0xd6,0xff,0xfd,0xef,0x02,0xd1,0xca,0xe4,0xfc,0xfe,0x5b,0xeb,0xfb,0x16,0xda,0xda,0xd3,0x00,0x16,0xcf,0xe3,0x1b,0x52,0x08,0x3f,0x1e,0xe0,0x3c,0xc5,0x1c,0x6a,0xf5,0xf6,0xff,0x0c,0xf6,0x04,0xc6,0xa2,0x1f,0xf1,0xe9,0x25,0x1e,0x0b,0xc6,0x0b,0x1c,0xca,0x00,0xf8,0xb6,0xda,0xe2,0x19,0xd7,0xd1,0x00,0xe7,0x0c,0x1b,0x1a,0xc7,0x04,0xd8,0xee,0xd2,0xdf,0xf0,0x3b,0xff,0xc0,0x6c,0x20,0xed,0x24,0x07,0x0f,0x18,0x3c,0xd9,0x2d,0x29,0x05,0xf3,0xf3,0x06,0xe0,0xde,0x13,0xdc,0xf9,0x38,0xb0,0x22,0x24,0x02,0x56,0x1e,0xf1,0xf1,0x02,0xe0,0xd7,0xf4,0x22,0xdb,0xf3,0xf6,0xc3,0x0d,0xda,0xc8,0xf4,0x21,0xd8,0xf5,0x2f,0x24,0x37,0xfc,0x23,0x28,0xd5,0x16,0x1f,0xb9,0x0b,0xfa,0xd6,0xf9,0xe1,0xdd,0xe1,0xe1,0xf5,0xd3,0xd8,0x39,0x04,0x19,0x2f,0xc1,0x04,0xe3,0xb8,0x10,0xc7,0x36,0x56,0xf1,0xf4,0xea,0xf4,0x60,0x1e,0xe3,0x05,0x40,0xe8,0x98,0xed,0xed,0x01,0x2b,0x0d,0xea,0xc0,0xee,0x7f,0xee,0x03,0x03,0x14,0xa6,0xf7,0x2d,0xdf,0xf9,0xd7,0x29,0x01,0xe8,0x06,0x04,0xeb,0xe0,0x0e,0x1d,0x3e,0x26,0x14,0x9c,0xf3,0xc9,0x02,0xc1,0x13,0x1b,0x03,0x0c,0xfa,0xf7,0xe6,0xf9,0xfc,0xfd,0xc9,0xc8,0x5f,0xc9,0xfb,0xd9,0x10,0xb6,0xd9,0xc4,0xd0,0xcd,0xf6,0x14,0x3e,0xc1,0xff,0xef,0x1c,0x0f,0xe2,0xab,0x03,0xf1,0x02,0xd6,0x2b,0x17,0x16,0xfd,0xdb,0x1b,0xda,0xee,0xc4,0x34,0x2a,0xf2,0xcd,0xfc,0x24,0xdb,0x14,0xbc,0x28,0xc3,0xc0,0xce,0xbd,0x25,0x08,0xe0,0x21,0xf9,0x48,0xeb,0xdd,0x9e,0xe1,0xb7,0x14,0xbd,0xd1,0x17,0x03,0xbc,0xe4,0x2f,0x29,0x05,0x13,0x7f,0x0e,0x04,0xf4,0x18,0x05,0x05,0x3e,0x55,0x3f,0xeb,0x0d,0x17,0xe9,0x44,0xfc,0x84,0xdc,0x1f,0xc0,0x48,0xe3,0x01,0xb5,0xe7,0xfb,0x2b,0xf9,0xdc,0x1f,0xdd,0x15,0x55,0xfa,0xfa,0xc3,0xdd,0x09,0x20,0xe8,0xf3,0x0b,0xda,0xf3,0xf3,0x15,0x1d,0x1d,0x18,0x07,0x20,0x35,0x32,0xf7,0x2b,0x17,0x59,0xc7,0xc2,0xec,0xd6,0xfc,0xfc,0x2f,0xec,0xea,0x37,0xb9,0x0d,0x2e,0xf4,0x55,0xb2,0xd6,0xbb,0x0b,0xca,0x35,0xdc,0x12,0xfe,0x09,0x45,0xec,0xfb,0xe8,0x23,0x0c,0xda,0xe6,0xf8,0x40,0xf9,0x12,0xd0,0x17,0xc8,0xe8,0x7f,0x1e,0xe3,0x21,0x18,0x08,0x16,0xc8,0x3c,0x31,0xdc,0x78,0xc4,0x01,0x52,0xeb,0x69,0x0b,0xf9,0x0b,0xce,0x36,0xcf,0x3b,0xd8,0xe4,0x1d,0xcc,0xea,0x04,0x0d,0x18,0x2f,0x05,0xe5,0x15,0x01,0x10,0x37,0xde,0xe6,0x24,0x03,0xcf,0x11,0xb5,0xeb,0x4c,0x3d,0x17,0xfc,0x18,0x4d,0xb8,0x72,0x32,0xc8,0x04,0x12,0xed,0xe8,0xc0,0x30,0x3c,0x12,0xdb,0x18,0xd9,0xd5,0xd8,0x05,0xbb,0xb9,0x4d,0x04,0xd9,0x37,0xed,0xfa,0xf2,0xf6,0xed,0xbd,0x4e,0x8d,0xf4,0x2d,0x09,0xd8,0x83,0xed,0xad,0xec,0x37,0xe7,0x21,0xdd,0xd3,0x23,0xc7,0x07,0xe8,0xc7,0x18,0xd3,0x5f,0x13,0xe4,0x00,0xdc,0xff,0x02,0x28,0x4a,0x5f,0xf3,0x1a,0x4b,0xe8,0xc5,0x3e,0x17,0x1d,0x42,0x02,0x20,0x01,0x2c,0x1d,0xf7,0x04,0xe3,0x29,0x09,0x45,0x11,0x11,0xe3,0x09,0x2c,0xe0,0x19,0x17,0xd7,0x65,0x0e,0x05,0x14,0x4b,0xc9,0xfa,0xed,0x0b,0xe4,0x13,0xe6,0xce,0xad,0xc3,0xdb,0xf8,0x1f,0x20,0x25,0x01,0xd7,0x47,0xb7,0xfe,0x29,0x0a,0xd5,0x24,0xfe,0x7f,0xbe,0xe1,0xd7,0x05,0xd5,0xae,0x7c,0x5c,0x3c,0xaf,0xd7,0x57,0xb7,0x16,0xaf,0x28,0xdd,0xef,0x23,0x0d,0xc6,0x0b,0x0c,0x22,0x96,0xc8,0x1d,0x9b,0xdd,0xe7,0x01,0xea,0x2d,0x0f,0xc9,0xff,0x45,0x13,0x26,0x29,0x08,0x31,0x98,0xcf,0xd2,0xdc,0x07,0xd4,0xeb,0x0b,0xd1,0x3c,0x74,0xc8,0xe4,0xef,0x0c,0xc4,0xc8,0x11,0xa6,0x64,0xf9,0xf9,0xf5,0x4a,0xc7,0x2c,0x19,0x30,0x27,0x0d,0xff,0x44,0x56,0xc6,0xc7,0xe8,0xf5,0xe8,0xf7,0xf6,0x9e,0x20,0xf9,0x19,0x0b,0x30,0xe3,0x0b,0xb4,0x14,0xd6,0x57,0xef,0xb7,0x06,0xfd,0xf7,0xc7,0x05,0xf9,0xfb,0x00,0x29,0x23,0xbf,0x99,0x26,0x16,0xd6,0x03,0xa5,0x46,0x49,0xd2,0x37,0x7f,0x24,0xe7,0xfc,0xa2,0x38,0x43,0x53,0xd9,0xdb,0xf5,0xe9,0xdb,0x78,0xd2,0xd9,0x4e,0xec,0x0c,0x1b,0xb5,0xc5,0xa7,0xe6,0x2e,0xf4,0x0a,0xf5,0x18,0xa6,0x23,0x0f,0xc0,0xfe,0xf3,0x16,0xd4,0xfa,0x74,0x11,0x16,0xda,0x13,0xc1,0x2a,0xd7,0x0c,0xf8,0x0e,0xe1,0xcb,0x12,0x28,0xb4,0x43,0x0e,0xe0,0x27,0xd0,0xd0,0xc1,0x0c,0x12,0xd7,0xe1,0xc8,0x40,0xf3,0x7d,0xa7,0x14,0xd0,0x38,0xdb,0x1d,0x2b,0xc2,0x3a,0xd1,0xa3,0xbf,0x50,0xea,0xf7,0x32,0xe9,0xfd,0x01,0x1d,0x15,0x06,0x1f,0x9a,0xe4,0xf7,0x32,0x29,0xff,0xc5,0x02,0xb3,0xd8,0x61,0x0a,0x10,0xf8,0xfb,0xf5,0xfe,0xd6,0x06,0x05,0xe4,0xc4,0x0a,0x7f,0x90,0xa0,0x05,0xce,0x2e,0xe3,0xab,0x24,0xe9,0x17,0x10,0xc2,0xf8,0xcc,0x00,0xf5,0x11,0xf0,0x24,0xd5,0xe5,0x08,0x07,0xc8,0xf3,0x00,0x23,0xb0,0x28,0x54,0xd0,0x45,0xe9,0x03,0xdf,0xf3,0xf5,0x21,0xcc,0x14,0xfb,0xfa,0xbc,0x1d,0x04,0xe3,0xf9,0x26,0x03,0x08,0xf8,0xfd,0x2e,0xc9,0xd6,0x0f,0xe2,0x37,0x4a,0x14,0xec,0x1d,0x61,0xb6,0x1c,0xdc,0xbe,0x09,0x04,0x2e,0x02,0xa8,0xe2,0xeb,0x0b,0x64,0x20,0x5a,0xe9,0x16,0xbd,0xf3,0xba,0x19,0x22,0xe5,0x18,0xfc,0xd6,0xa2,0x29,0x2e,0x23,0x1d,0xdd,0x16,0x19,0x01,0xcf,0x5a,0x1e,0xfe,0xe5,0xf5,0x7f,0xee,0xb4,0x1c,0xf6,0xbf,0xe0,0xfb,0xd1,0x01,0xf7,0xef,0xdf,0xd9,0x56,0xe0,0x35,0xc6,0xd2,0xd0,0xc5,0x2d,0xc8,0xf6,0x93,0x6c,0xf9,0xe4,0x0b,0xe6,0xf6,0x9c,0xfd,0x67,0xb7,0xfb,0x2b,0x25,0xff,0xf5,0x1f,0xe2,0x03,0x04,0x03,0xf3,0xb8,0x40,0x6b,0x09,0xee,0x7e,0xeb,0xa1,0x0a,0x38,0xe3,0x0a,0x73,0xfd,0xbc,0xcb,0x4e,0x9f,0xe3,0xd1,0xfe,0x00,0xd9,0xfa,0x0f,0x00,0x36,0x86,0x50,0x33,0x0d,0xfe,0xff,0x17,0xd4,0x70,0xd9,0xc9,0xc6,0x10,0xeb,0x36,0x16,0x15,0xe2,0x41,0xf1,0xe8,0xdb,0xfb,0x00,0xed,0x44,0x51,0x2d,0xf7,0xe8,0xe3,0x27,0x38,0x22,0x16,0xfa,0x30,0xe9,0x4f,0x5c,0xe3,0x30,0x46,0xd2,0xeb,0xd2,0xac,0xc3,0xf4,0xb9,0x02,0xb6,0xd8,0xea,0x4a,0xa3,0xf8,0xbf,0xcb,0xc2,0x1e,0xfa,0xb5,0x35,0xdf,0xf6,0xfb,0xe8,0xf8,0x2d,0x39,0x81,0xd7,0xea,0xc4,0x67,0x9b,0xb2,0x3d,0xe1,0xdb,0xf0,0x12,0xd9,0xea,0xda,0xca,0xa9,0xf5,0xdc,0x0d,0xf9,0x13,0xc7,0xe7,0xc2,0x1d,0xed,0xc0,0x5a,0xcf,0x67,0x26,0xce,0x04,0x16,0x2f,0xdd,0xee,0x3a,0x1c,0xe5,0x25,0x20,0xd1,0xd7,0x14,0x77,0xff,0xea,0xc1,0xca,0xbc,0x06,0x13,0xff,0x21,0xc2,0x03,0xff,0x03,0x03,0x0c,0x60,0x06,0x26,0xc5,0x24,0x3b,0x0b,0x2e,0x14,0xf4,0x06,0x14,0x00,0x12,0xeb,0xe6,0x29,0xe1,0x18,0x16,0x27,0x15,0xde,0x28,0xe6,0xef,0x26,0xd2,0xe9,0xaf,0xf6,0xfd,0x3f,0x2c,0x18,0x0e,0xfe,0xd1,0xc0,0x22,0x0e,0x37,0x00,0xfb,0xf6,0xf1,0xdf,0x0f,0x27,0xfb,0x34,0xf9,0x24,0xdd,0xec,0xf7,0x01,0xff,0x1b,0x3e,0x29,0xc5,0xf4,0x43,0x27,0x3c,0xed,0x17,0x0d,0x04,0x22,0xcc,0xff,0x39,0x08,0x81,0xc8,0x44,0x13,0x0e,0xe7,0x15,0x2d,0xda,0xef,0xed,0x17,0x1e,0xc5,0x01,0x03,0x08,0x0a,0x15,0x1b,0x03,0xfa,0x04,0xed,0xf0,0xd8,0xfc,0xe7,0x24,0x12,0xcb,0x17,0x18,0x10,0x4d,0xe7,0x0a,0x10,0x12,0xf8,0xa0,0x02,0xfb,0x35,0x0f,0xe6,0x17,0x21,0xe1,0x1e,0x02,0x13,0x15,0x0f,0x12,0x0b,0xe6,0x06,0x62,0x40,0xdd,0x72,0xe8,0x00,0xb4,0xef,0x2b,0x02,0xe9,0xd5,0x02,0x99,0x1c,0xc4,0x2b,0xf6,0xf8,0x04,0xeb,0x1b,0xfd,0xe3,0xa1,0x49,0x95,0xe8,0x0a,0x14,0xc8,0xaf,0xb1,0x8f,0xf3,0x1f,0x0b,0xda,0x10,0x9f,0xdc,0x02,0xd8,0xce,0x3d,0xf5,0x02,0x0d,0x1b,0x16,0x17,0x29,0xf2,0xeb,0x3e,0x54,0xba,0x96,0xcf,0xbf,0x2d,0x2d,0x00,0x1c,0xcd,0x2e,0xe3,0xce,0x0c,0x9c,0x3d,0x36,0xa5,0x3b,0xdd,0xb2,0x30,0x07,0xfd,0x39,0x00,0x09,0x03,0x11,0xa0,0xfc,0x66,0xfd,0xe8,0xec,0xf3,0xac,0xb9,0xcf,0x1a,0x98,0xfe,0x9a,0xbc,0x17,0x1e,0xe0,0x0f,0x0d,0x59,0xbd,0xfd,0xeb,0x27,0xec,0xda,0x0e,0x44,0xd4,0x3c,0xb9,0x27,0xbd,0x07,0xd8,0x34,0xa1,0xf5,0x24,0x7f,0x41,0x15,0x17,0x69,0x43,0x08,0x09,0x18,0xe6,0xd0,0xf1,0xf4,0x10,0x06,0xd1,0xda,0xeb,0xcb,0x55,0x24,0xd9,0xe1,0x22,0x09,0xbd,0x11,0xe8,0x00,0xe6,0x3a,0xfd,0x27,0x31,0x03,0x00,0x1a,0x33,0x76,0x5a,0x40,0x7f,0x44,0x33,0x00,0xff,0xc3,0x18,0xca,0x9b,0xfe,0xf5,0x3b,0x02,0xf6,0x1d,0xef,0xe4,0xf9,0x1a,0xc6,0x1f,0x1c,0xff,0x12,0x0c,0xed,0x0e,0xf9,0x05,0x30,0xfe,0x3a,0xd7,0xba,0xbc,0x3c,0x1d,0xe9,0x0d,0x13,0xc8,0x5a,0x3d,0xdd,0xef,0x23,0x07,0xf1,0x12,0x00,0xd5,0x01,0xff,0xde,0xd3,0x06,0x05,0xce,0x26,0x19,0xcc,0xf6,0xf2,0x08,0xe3,0xbb,0xf3,0xe9,0x04,0x08,0x25,0x51,0xe8,0xd3,0x54,0x0f,0x1a,0xf3,0x68,0x1f,0x61,0x1a,0xdf,0xff,0xfa,0x1b,0xb9,0x59,0x33,0xd7,0x03,0x0c,0x35,0x1d,0x14,0xcf,0x81,0x96,0xce,0x91,0xf0,0x20,0xc3,0xe5,0x3e,0xb8,0x05,0x03,0xfd,0x19,0xac,0xee,0xcc,0x60,0x55,0xe8,0x52,0x0a,0x25,0xb8,0x28,0xd4,0xcc,0x00,0xc4,0x29,0x1c,0x26,0xf6,0x1b,0x0e,0xdd,0x0d,0x36,0x0b,0x41,0xe6,0x49,0xec,0x04,0x0d,0xe4,0xea,0xad,0xdf,0xc7,0x06,0x6a,0xf9,0x1d,0xfc,0x31,0xf4,0xfb,0x59,0x00,0x97,0x72,0x00,0xb7,0xc8,0x47,0x48,0xff,0xdc,0xe8,0xf0,0x21,0xee,0x27,0xf6,0x26,0x2b,0xf0,0x3f,0xac,0x40,0x4b,0x11,0x06,0x21,0x0a,0x32,0x12,0x54,0xf5,0x1c,0xe1,0x1c,0x64,0x4e,0x65,0x45,0xfd,0xcf,0xeb,0xff,0xf3,0xe1,0x28,0x25,0x11,0xeb,0xe8,0xbc,0xf3,0x59,0xe1,0xa3,0xc5,0xc0,0xc0,0xea,0x48,0xaf,0xb6,0x0f,0xc7,0x06,0xe6,0x0e,0x32,0xfe,0xf8,0x14,0xde,0x58,0x27,0x49,0x1f,0xe9,0x3b,0x5d,0xde,0x09,0xe8,0x04,0x20,0xec,0xf9,0xc2,0x25,0x62,0x1b,0xbf,0x28,0x23,0x09,0x3d,0x06,0xf9,0x52,0x3b,0xdd,0xf9,0xbd,0x8a,0x4a,0x1b,0xe5,0xfb,0xec,0x0e,0x13,0xdd,0xa7,0xc3,0xeb,0xd4,0x24,0xb7,0xc9,0xc4,0xe5,0xd4,0xc8,0x4d,0x2f,0xf9,0x1e,0x4a,0xf6,0x12,0xf4,0x47,0x1d,0xff,0xf3,0xfb,0xa2,0xda,0xf2,0xfe,0x2c,0xf5,0x0d,0xbb,0x2d,0x07,0x0a,0xcd,0x41,0xd7,0xcd,0xec,0xbf,0x13,0x12,0xf0,0x05,0xf3,0xe7,0x7f,0x06,0x1c,0x0e,0x1c,0xf8,0x55,0xd2,0xd1,0x16,0x36,0xd9,0x1a,0x19,0x39,0x34,0x01,0xe4,0xfa,0xb7,0x2c,0x29,0xf3,0x06,0xe8,0xac,0x12,0xcc,0x05,0x13,0xee,0x14,0x10,0xda,0xf8,0xe4,0xc9,0xed,0x10,0x0a,0xce,0x66,0xbf,0x0a,0x11,0x0a,0xdd,0xf2,0x1c,0x0f,0x26,0xd6,0x2b,0x25,0xef,0x01,0xcc,0x24,0xfa,0x7f,0xe8,0xff,0x1b,0xf4,0x40,0xd1,0xf5,0xf2,0xcf,0xae,0xd3,0x01,0xec,0xda,0x34,0x11,0x0d,0x17,0xe3,0x09,0xe3,0xfb,0xe9,0xe4,0xf1,0xdc,0xaa,0x9c,0x58,0x02,0xcf,0xff,0xfc,0x30,0x3e,0xdc,0xc0,0xf9,0x23,0xee,0xed,0x15,0xcb,0xc6,0xe3,0x30,0x36,0x6f,0xc6,0x27,0xe3,0xf0,0xcc,0xee,0x0a,0xe0,0x32,0xfd,0x39,0x0b,0x16,0x04,0x06,0x58,0x1d,0xd8,0x6b,0xe8,0x20,0x1b,0x08,0x68,0x0b,0xd6,0xe5,0x0a,0xee,0x2f,0x26,0xbf,0xee,0xe8,0xc7,0x23,0xcc,0x54,0x12,0xef,0x06,0x18,0xb7,0x17,0xb5,0x2a,0xd5,0xed,0xe8,0x31,0x39,0x0b,0x07,0xb1,0xf1,0x15,0x18,0x32,0xe1,0xf3,0xda,0x00,0x14,0x1c,0xe4,0xf3,0x19,0x1b,0x0a,0x56,0x09,0x24,0xf8,0x19,0x07,0x14,0x3c,0xd3,0xa6,0xbb,0xe5,0x4e,0xfe,0xb6,0xc1,0x16,0xea,0xcd,0xf6,0xf6,0xf2,0x45,0x23,0xd8,0xe8,0xf4,0xf9,0x41,0x2f,0xd8,0x0c,0x0e,0xb4,0x1c,0xee,0x3c,0xbb,0xd8,0xe9,0x7f,0xe2,0x11,0x0d,0x87,0x4a,0x58,0x19,0x1f,0xf6,0xeb,0xdf,0xc0,0xda,0x30,0xd6,0xe6,0xe6,0x9c,0x41,0x1a,0x19,0x1c,0xbc,0x6d,0x02,0x1b,0x01,0x20,0xb7,0x00,0xdc,0x0d,0xf0,0xfe,0xf9,0x05,0x14,0x06,0x20,0xdc,0xf7,0x04,0xec,0x19,0xf5,0xd6,0xeb,0x25,0xd0,0x49,0xcc,0x15,0x00,0xfe,0xce,0xfe,0xe3,0x0d,0x41,0x1b,0x0c,0x0e,0xec,0xdf,0xdc,0x1b,0xb8,0x0f,0x4a,0xd4,0xee,0x2d,0xcf,0x61,0x14,0xed,0x28,0xe6,0xc1,0x25,0x35,0xc1,0x21,0xe3,0x38,0x0e,0xe1,0xf6,0xe9,0xe9,0x08,0xe8,0xf7,0xd3,0xf0,0x02,0xeb,0x08,0x07,0x32,0xf6,0xd6,0xfd,0x27,0x05,0xf1,0xea,0x2d,0xff,0xeb,0xd0,0xeb,0xec,0xed,0x06,0xfe,0xec,0x3a,0x7f,0x37,0x23,0xee,0x17,0xd4,0x14,0xed,0x48,0x21,0x08,0x12,0x17,0x0b,0x38,0xca,0xdf,0x48,0x2d,0xcb,0x29,0x2e,0xf6,0x33,0xf7,0xe8,0xc6,0xf1,0xc9,0xf5,0x35,0x0e,0xf6,0xbc,0x03,0xf9,0x1a,0xfa,0x3c,0x07,0x13,0x29,0x13,0xe4,0x0f,0x2e,0x49,0xec,0xeb,0x08,0x07,0x0f,0x0e,0xb8,0x2e,0xf1,0xfb,0x06,0xcb,0x4f,0x2d,0xec,0x5a,0x00,0x03,0x17,0xba,0xe3,0xcd,0x01,0x98,0xe3,0x65,0x29,0xb4,0x0b,0x53,0x3a,0xed,0x0f,0x02,0xee,0xd0,0x12,0x39,0xda,0x11,0x09,0xe0,0x1e,0x13,0x08,0x0a,0xf4,0xd5,0x20,0xb8,0x06,0x29,0x3b,0xc3,0xd8,0x3d,0x2e,0x08,0xe5,0x0f,0x02,0xb1,0xf9,0xe2,0xef,0x14,0x4a,0x09,0xe7,0xdf,0x21,0x2b,0x2c,0xd2,0x39,0xef,0xd5,0x05,0xd0,0xff,0xde,0xbb,0x0e,0x1b,0x0f,0xf8,0x01,0x0a,0x4e,0xe8,0xd8,0xfb,0xf6,0xe6,0x01,0x13,0x4b,0x00,0xfa,0xe6,0xd1,0x11,0x18,0x56,0x06,0xf0,0xd6,0xf5,0x6f,0x09,0x04,0xcc,0x01,0xf7,0x2a,0x57,0xfc,0xd3,0x19,0xfd,0x3f,0xc4,0xf2,0xe3,0x03,0xff,0xff,0xc7,0xc9,0xf4,0x0a,0x18,0xf0,0x03,0xfa,0x06,0xdd,0x23,0xc6,0xfe,0xfb,0x2d,0x22,0x0d,0xd7,0x39,0x38,0x11,0xfc,0xc5,0x01,0x0e,0x58,0x81,0xd7,0xe5,0xf7,0x06,0xfc,0xfe,0x13,0x11,0xe1,0x09,0xf1,0xc0,0x39,0x17,0xc3,0xcd,0xf1,0xf2,0x19,0xf2,0xc0,0xf5,0x06,0xe9,0xeb,0x36,0xe5,0x22,0x54,0x08,0xea,0xd5,0x4f,0xd3,0x0b,0x12,0xd2,0x2d,0xf0,0xea,0x44,0xec,0xe1,0xa5,0x1c,0x29,0x0b,0xd4,0xd2,0x0a,0x50,0xed,0x1a,0x0c,0x75,0xfc,0x63,0x13,0x09,0x32,0xd9,0x03,0x0d,0x11,0xb0,0xb5,0x54,0x2d,0xd8,0xff,0xb2,0x0b,0x24,0xf9,0xf4,0xc0,0x18,0xf2,0x19,0xb8,0x26,0x08,0xd1,0xda,0xd9,0xf9,0xc5,0x22,0xef,0xcb,0x00,0x1e,0x06,0x71,0xf2,0x7f,0xa4,0xfc,0xff,0x04,0xd1,0xeb,0x04,0xd8,0x48,0xf5,0x0e,0xd0,0xe9,0x12,0x1a,0x07,0xf0,0xee,0xb3,0x20,0x19,0x8a,0xc8,0xf1,0x2d,0x09,0x2e,0x19,0x3d,0x0b,0x56,0x11,0x54,0x50,0x0b,0x00,0x1e,0x43,0x19,0x1e,0xfa,0x1e,0xff,0xde,0x38,0x19,0xf6,0xee,0x0f,0x13,0xd6,0x04,0x01,0x00,0xf2,0x32,0x03,0x1b,0x29,0x56,0x23,0xd7,0xce,0x44,0x0a,0x09,0x04,0x1d,0x00,0xf9,0xc8,0x3a,0xec,0x36,0x28,0x4f,0x2e,0x03,0xf3,0xe7,0xdb,0xf9,0xdd,0x3e,0xd1,0xd9,0x60,0xaa,0x3d,0xe0,0x16,0xe1,0x01,0xfe,0xb1,0xe4,0x03,0x26,0xb2,0xf3,0x2a,0x7f,0xbc,0x07,0x42,0xa5,0xf4,0x09,0x51,0x31,0x2f,0xbb,0xe6,0x01,0xec,0xf0,0xb2,0x38,0x11,0x65,0x1b,0x1f,0x1d,0xc9,0x36,0xf2,0xed,0xd0,0x06,0x0a,0xdf,0x1d,0x58,0x44,0xe7,0x0a,0x0f,0x20,0x04,0xde,0x35,0x3d,0x04,0x27,0x5d,0xfd,0x44,0x0c,0x03,0x3d,0x2a,0xf9,0xdd,0x0a,0xca,0x06,0xfc,0xc5,0x19,0xd7,0x44,0x47,0x17,0x3d,0x31,0x09,0x16,0x0e,0xfb,0x00,0xdb,0xf4,0x17,0x59,0x08,0xe9,0x30,0xe0,0x28,0x03,0xfe,0x16,0x04,0xd0,0x26,0xed,0x20,0x34,0xbd,0xc6,0x02,0xd9,0xfe,0x09,0xf9,0x36,0x5f,0x24,0xba,0xea,0x2a,0xde,0xd2,0x9d,0x9f,0xf9,0x02,0x9d,0x29,0xb0,0x2c,0xca,0x11,0x15,0x2c,0x04,0xe4,0xc4,0x03,0xba,0x1a,0xdd,0x0f,0x1b,0x7f,0xfb,0x51,0x18,0x10,0x31,0x18,0x4b,0x07,0xe3,0x22,0xb7,0xf5,0xba,0xed,0x3e,0x2d,0x16,0xf7,0xeb,0x48,0xdd,0x1a,0xe0,0xdf,0xee,0x20,0xca,0xf9,0x1b,0x23,0x3e,0xd1,0xcd,0xc7,0xde,0x62,0x44,0xce,0x0d,0xc4,0xee,0x17,0xda,0x03,0x35,0xed,0xd2,0x4c,0xfc,0x5a,0x09,0x33,0x5f,0xdc,0xe6,0xdc,0x45,0xab,0x4b,0x1c,0x0b,0xac,0xf6,0x2f,0xb9,0x4d,0x18,0xd5,0x59,0xb1,0x20,0x58,0xe4,0xc2,0x2c,0x02,0x24,0xfd,0x31,0x04,0xd4,0xcd,0xe0,0x26,0x05,0xe5,0xe3,0xef,0xf2,0xd3,0x22,0x7f,0xdf,0xf2,0xd3,0x02,0x08,0xc0,0xe3,0xd5,0xfc,0xf8,0xf4,0xc4,0x30,0xd5,0x22,0x0c,0xea,0x1c,0xde,0xc4,0xf2,0xdc,0xe5,0x0b,0xbe,0xf9,0x66,0x0c,0x05,0xfa,0xe1,0xdc,0x31,0xdc,0xe6,0x13,0x30,0x1e,0x1b,0xf8,0x01,0x10,0x5f,0x16,0x07,0xcd,0x2a,0x24,0xec,0xc6,0x2d,0x1e,0x00,0xf6,0xdd,0xb9,0xf3,0xf9,0x14,0x35,0xd8,0x53,0x07,0x1c,0xec,0x52,0xc6,0x14,0xe0,0x0e,0x1f,0xe7,0x12,0x05,0xf1,0x2d,0xcf,0xf9,0xef,0xf4,0xeb,0xfd,0xfc,0x0e,0xf7,0xd3,0x1a,0xf0,0xee,0xd6,0xe9,0xf9,0xea,0xc6,0xce,0x16,0xd8,0xe7,0x01,0x2f,0x3d,0x00,0xfe,0xee,0xf7,0xfb,0xd7,0x1d,0xdc,0x4f,0xed,0xf8,0x2d,0x1d,0xd6,0x50,0xd3,0x07,0x36,0x35,0xcb,0xde,0xe0,0x14,0x03,0xfd,0xd4,0xe5,0x5b,0xdc,0xee,0xf9,0xda,0x23,0x34,0x0e,0xee,0xe6,0xdd,0x2c,0xd8,0xec,0xe8,0xd4,0x61,0xf4,0x36,0xfc,0x1f,0x29,0xeb,0x05,0x11,0xe7,0xa6,0x14,0x03,0x08,0x0e,0x02,0xe3,0xd1,0xcd,0x34,0x14,0x05,0xf7,0xd0,0xce,0x32,0x81,0xff,0xc6,0xf7,0x14,0x00,0x5b,0xfb,0xf6,0x43,0x30,0x0e,0x1d,0x14,0x43,0xe1,0xcf,0x05,0x45,0xe9,0xa7,0x0c,0x55,0xe7,0x1c,0x17,0xc7,0x18,0xd9,0x97,0xd0,0xbf,0xe3,0x0f,0xe0,0xc9,0x26,0xe3,0xb5,0xc3,0xe8,0x29,0x27,0xfa,0xb4,0x1d,0xd4,0x35,0xce,0x28,0xf9,0x30,0xc0,0x24,0xf0,0x58,0x08,0xf6,0x28,0xe7,0xe2,0x19,0x0d,0x00,0xd5,0x01,0x26,0xfb,0x7f,0xf7,0xeb,0xc0,0xcc,0xe3,0xc3,0xc9,0xf8,0x2d,0xae,0x17,0x25,0x25,0xbe,0xc9,0x2e,0x3f,0x94,0x39,0xbe,0x01,0xf9,0x1d,0x9a,0xb7,0x03,0xdd,0xdb,0x1a,0xfd,0x32,0x0d,0x0d,0xf2,0x38,0xca,0x42,0x67,0xfc,0x0b,0xa9,0xf4,0xd4,0x35,0xee,0xfa,0x20,0x12,0xea,0x2d,0xcb,0xdd,0xe3,0xec,0xe2,0xf5,0x44,0x18,0xef,0x66,0xdd,0xfa,0xe2,0xaf,0x3e,0xdc,0xbc,0xf2,0x95,0x4a,0xa9,0xed,0x08,0x4f,0x0d,0x3d,0x3b,0x32,0x3b,0xf8,0xda,0x28,0x77,0xff,0x00,0x26,0x46,0x49,0xfc,0xc8,0xf9,0x41,0xd6,0x02,0x3e,0xf3,0xb4,0xee,0x0f,0x3b,0x28,0x2e,0x1e,0x0b,0xc9,0x37,0x20,0xf2,0xed,0x20,0xa1,0x06,0xfa,0xe0,0xc6,0xca,0x1f,0x04,0x23,0x2b,0x0f,0x3d,0xc7,0x20,0xf6,0xd2,0x5e,0xcc,0xf7,0xcf,0x20,0xca,0xe2,0x17,0xba,0x1b,0x13,0x01,0xc3,0xa7,0xe2,0x66,0xe8,0xd6,0xa1,0x1f,0x20,0x98,0x39,0x1f,0x6f,0xeb,0xc1,0x18,0xec,0xc6,0x41,0x13,0x10,0xff,0xe1,0x17,0xe7,0x53,0xc9,0x1a,0xd5,0x03,0x0e,0x20,0x29,0xaf,0x0f,0xfc,0x06,0xe6,0x1a,0xfe,0x47,0xee,0x82,0xa3,0xc9,0xfc,0xaa,0x9d,0xff,0xef,0xd2,0x1c,0xff,0x16,0x17,0x9e,0x44,0x7f,0x9e,0x4c,0xba,0x17,0x4c,0xe0,0x09,0xca,0xa8,0x45,0x27,0xcb,0xdb,0x55,0x16,0xf8,0x13,0xf2,0xd5,0xf8,0xf2,0x43,0x9e,0xa4,0x4e,0xe7,0x05,0x38,0xdd,0x33,0x62,0xf9,0xdf,0xd6,0x88,0xd1,0xf8,0x05,0xcf,0xe8,0x57,0xe8,0x17,0xe1,0xef,0x1d,0x2c,0xc7,0xb0,0xcd,0x2b,0x88,0x0e,0xc5,0xc1,0x07,0xff,0xdc,0x0f,0x07,0x17,0x49,0xd9,0xe5,0x34,0xe1,0xe6,0xef,0xf2,0xcb,0xdd,0x1c,0xf6,0x38,0xfe,0xf4,0xe5,0x14,0x21,0xcc,0x36,0x28,0x07,0x4c,0xfc,0x03,0xbe,0x2f,0xe3,0xf6,0xfb,0xfb,0x1a,0x1c,0x20,0x11,0xe2,0x1b,0xc8,0x01,0xf8,0xc6,0x1a,0x81,0x69,0xd5,0x3d,0xfa,0xe3,0xef,0xb2,0x29,0xe6,0xdd,0x1b,0xf8,0xf6,0x37,0xf6,0x3a,0x5f,0xca,0xdc,0x49,0x0a,0xcf,0xd3,0xd6,0x29,0x6a,0xf6,0xeb,0x00,0x31,0x2e,0x4d,0xf2,0x15,0xec,0xf8,0xf0,0x2f,0xd3,0xf0,0xd6,0x22,0x27,0x24,0xf2,0xe2,0x20,0x12,0x25,0xfb,0x2c,0xec,0xd0,0xdc,0x0f,0x37,0x09,0xfd,0xe6,0xfd,0x25,0xe0,0xfe,0x38,0x09,0xde,0xf8,0xe6,0xed,0xe6,0x0f,0xe4,0x12,0xd2,0xbf,0xef,0x09,0x33,0x1a,0x2d,0xe8,0xdb,0xd5,0xe8,0x2d,0x12,0x01,0x2a,0xe3,0x81,0xf9,0xd0,0x0e,0xd7,0xfc,0x1d,0xea,0x17,0xf1,0x00,0x4b,0xd0,0x0b,0xe4,0x10,0xfa,0x19,0xd2,0xf1,0x11,0xe9,0xcf,0xc6,0x16,0x20,0x1d,0x04,0x15,0x04,0xe5,0xc6,0x14,0x2b,0x03,0xd4,0xc2,0xfd,0xfb,0x10,0xc2,0x0b,0xd3,0xfe,0x2f,0xec,0x16,0xfc,0x32,0xdf,0xfe,0xe1,0x0b,0xf7,0x42,0xfc,0xf7,0xc8,0xc0,0x38,0xed,0xc9,0xd5,0x43,0xf6,0xd6,0xc5,0xcc,0xf8,0xd0,0x20,0xf9,0xe2,0x30,0xf4,0x27,0x20,0x0d,0x5b,0x13,0xe0,0x01,0x18,0xe9,0xff,0xde,0x00,0x44,0xea,0xdd,0x11,0xf8,0x05,0x01,0xfb,0x3c,0x0e,0xe6,0xf2,0xba,0x00,0xfa,0x09,0x0d,0x03,0xcf,0xec,0x3c,0x12,0x05,0xc5,0x07,0xd6,0xf7,0x2c,0xf3,0x2a,0xe9,0x18,0xef,0xe4,0x0e,0xd0,0x8e,0x1c,0xb9,0x2b,0xa7,0x1f,0xe6,0xfc,0xb9,0x54,0xda,0x2b,0xd8,0xd2,0xee,0xfd,0x7f,0x0f,0xfc,0xae,0xc7,0xd8,0xfd,0x0a,0xa7,0xdf,0xc9,0x0d,0xf8,0xe6,0x21,0x01,0x23,0x0b,0x28,0xb5,0x30,0xdf,0x4e,0xc1,0x42,0x37,0xd0,0xd1,0x15,0xfc,0xfd,0x48,0x24,0xd8,0xd3,0x46,0x0f,0x2e,0x37,0xb9,0xde,0xc3,0x9f,0x4b,0x29,0x13,0x04,0xc8,0x0c,0xdc,0x8d,0x47,0x18,0x0d,0x3f,0xb9,0x42,0xfe,0x17,0x40,0xcb,0xd0,0x4a,0x0d,0xcc,0x05,0x0f,0xd5,0x74,0x5f,0x3e,0xba,0xcf,0xe9,0xf9,0x92,0xd7,0xf3,0x13,0x28,0x1a,0xbf,0xf7,0xcd,0xeb,0x32,0x48,0x0f,0xcf,0x2e,0xec,0x4d,0x04,0x3a,0xe1,0xff,0x1f,0x29,0xb4,0xf6,0xe6,0x26,0x0d,0x99,0xae,0xbb,0xed,0xfa,0xbd,0xea,0xd3,0x09,0x57,0x1b,0x0f,0x10,0x00,0xb0,0x38,0xf8,0xfe,0xdf,0xff,0x1a,0xd2,0x66,0xe5,0x22,0x22,0xfe,0xe7,0xe2,0xfb,0x7f,0x10,0xd2,0xf4,0x42,0x59,0x63,0xc7,0x52,0x0b,0x0c,0xf5,0xda,0x04,0xc7,0x09,0xe2,0xfb,0xf0,0xf7,0x23,0x1e,0xb7,0x65,0xf2,0xec,0xf5,0x10,0xd6,0xae,0xff,0x30,0xd0,0x2e,0x14,0xc9,0x30,0xec,0x2f,0xdd,0xea,0xf2,0x39,0x0d,0xf0,0xfd,0x0e,0x08,0x33,0x00,0x05,0xe3,0x01,0x21,0xba,0x1f,0xf3,0xea,0xe1,0x19,0xa8,0xea,0xbf,0xf6,0xb2,0x17,0x39,0x0f,0x25,0x29,0x3f,0x2f,0x12,0x0a,0x3a,0xdd,0x37,0x26,0xed,0x51,0xeb,0xdc,0xdd,0x27,0x02,0xfe,0x38,0x31,0xcc,0xb3,0x17,0x15,0xc9,0xea,0xea,0x19,0x08,0xf7,0x25,0x02,0xdc,0xc6,0xd2,0xe8,0x32,0xe9,0xe8,0x01,0x38,0xc8,0xea,0x30,0xdb,0x1c,0x05,0x21,0xca,0x9d,0x2c,0x1e,0xe2,0xa6,0x5e,0x68,0xb6,0x14,0xee,0xe5,0x05,0x1a,0xf7,0xb0,0x1c,0xd5,0x16,0xcb,0x29,0x23,0xe4,0x03,0x03,0xd9,0xee,0xb8,0xf7,0x4a,0x1d,0xc8,0xd1,0x70,0x14,0x1d,0xf0,0x35,0xb7,0x97,0xfd,0x81,0x28,0xb7,0x46,0xe7,0x10,0x42,0xf5,0x2b,0x17,0xd5,0x2b,0xb7,0xcf,0x60,0xfa,0xe4,0xf3,0xf2,0xd3,0x19,0xc8,0xb5,0xda,0xea,0x4f,0x04,0xd5,0xe0,0x47,0x69,0x4c,0x3c,0xe8,0x40,0x00,0xc2,0x40,0x99,0xf4,0x0a,0x2e,0xe6,0xdb,0x1d,0x00,0x8b,0x0f,0xd8,0xfb,0x1d,0x13,0xf8,0x36,0x2b,0x28,0xfe,0xe6,0xc6,0x78,0xbc,0x12,0xea,0xa2,0xf7,0x26,0x0d,0x15,0x31,0x2e,0x0a,0xd4,0x0f,0xf2,0x64,0x37,0x45,0xa7,0xf1,0x2a,0xdf,0xe8,0x0e,0xd8,0xac,0x33,0x1f,0xe1,0xc3,0x06,0xf5,0x27,0x00,0x27,0xd7,0xc6,0x23,0xbc,0x29,0x31,0xe2,0x29,0xe6,0x3f,0xda,0x35,0xb8,0x18,0x46,0x4b,0x78,0x4b,0x24,0xfd,0xf8,0x2e,0x11,0x50,0xb0,0xe1,0xf8,0x5b,0x0a,0xf5,0x0e,0x18,0xba,0xce,0x1a,0x72,0xc4,0x06,0xf2,0x0c,0x10,0x7e,0xc5,0x28,0x55,0xfe,0x08,0xe8,0x22,0x9d,0x0c,0xcb,0x7f,0xb3,0xe5,0xe6,0xd3,0xa0,0xab,0xc6,0xbd,0xfe,0x1a,0x15,0xf1,0x44,0xfe,0xe8,0x1e,0x13,0xef,0x11,0xc6,0x4d,0x66,0x0d,0xde,0xd5,0x41,0xf5,0x9b,0x7c,0x2c,0x1a,0x51,0x08,0xce,0xdf,0xec,0x4e,0x4b,0x2c,0xfa,0x3c,0x09,0xac,0xea,0xd0,0x2c,0xfc,0x06,0x0f,0x0d,0x3b,0xd1,0x10,0x12,0x5f,0xdb,0x12,0xfe,0x01,0xeb,0xcb,0xe7,0xb3,0x29,0xdd,0xf7,0x14,0x0b,0x02,0x12,0xe1,0xf9,0x05,0x5f,0xfb,0x0a,0xed,0xe9,0xcd,0x04,0x14,0x1a,0xe7,0x40,0x1c,0xab,0xfc,0x48,0xf4,0x0c,0xfc,0xfd,0x00,0x0e,0x27,0x1c,0x2f,0x29,0x09,0x08,0x08,0xf9,0xea,0x2e,0x0b,0x1f,0x06,0xe8,0xe2,0xdd,0xff,0x19,0x21,0x55,0x03,0xed,0x4d,0xcc,0x64,0x09,0x64,0x06,0x57,0x11,0xcb,0x08,0xd1,0x7d,0x28,0x23,0xf9,0x39,0x17,0xed,0x0c,0xda,0xe0,0x08,0xf4,0x06,0xed,0x21,0x06,0xda,0x3d,0x1d,0x01,0x28,0xec,0xc7,0x2a,0x1d,0x1a,0x4d,0x2f,0xb4,0xf8,0x0c,0xe2,0x07,0x02,0xd5,0x0c,0xe3,0x25,0x03,0x31,0x41,0xf8,0xeb,0xed,0xe8,0xd3,0x1c,0xb0,0x12,0x05,0x81,0x26,0x10,0x02,0x3d,0x4a,0xf3,0xdf,0x4e,0xf4,0x16,0x27,0xf3,0xee,0xe1,0xac,0xd4,0xbe,0x1c,0x18,0xe9,0x4d,0xf9,0xd4,0xca,0x3b,0xe7,0xde,0x20,0xf3,0x07,0x0f,0x07,0xe6,0xfe,0xf1,0xc5,0x64,0xe4,0x01,0x06,0x10,0xff,0xe8,0x22,0x1e,0x34,0xee,0x47,0x15,0x25,0xbc,0xee,0x4d,0x2b,0xf6,0xe5,0x17,0xc6,0x37,0x05,0x13,0x84,0x05,0x1e,0x0d,0x0d,0xee,0xcf,0x4e,0x4a,0xdf,0xd7,0xf2,0x06,0xfa,0x90,0xd0,0x72,0xdc,0xcc,0xbc,0x08,0x0a,0xa6,0xb7,0xf0,0xcc,0x13,0xbe,0x5c,0x3e,0x08,0x0e,0x14,0x02,0x30,0xdf,0x3b,0x4a,0x13,0xf0,0x2f,0x27,0x02,0xdf,0x27,0x24,0x23,0xfe,0x10,0x08,0x69,0x3f,0xbb,0xfc,0x6d,0x3d,0x28,0xed,0xed,0xed,0x3a,0xe3,0xda,0x81,0x14,0xd6,0xe3,0xd6,0xc5,0xec,0x37,0x38,0x25,0x1c,0xe7,0x0a,0x1b,0x16,0xe9,0xfa,0xf4,0xe6,0x0b,0x07,0x22,0x12,0x16,0xf4,0x0a,0xd1,0xfe,0x06,0xdd,0xe3,0xfa,0x0e,0x14,0x25,0x05,0xed,0x44,0xf6,0xd1,0xeb,0xfd,0xf5,0x19,0xe9,0xe8,0x1b,0x0d,0xed,0x0b,0x1c,0x33,0xec,0xeb,0xe5,0x08,0x09,0x25,0x09,0xe6,0xf3,0x01,0x38,0x00,0x0d,0x11,0x05,0x17,0x0a,0x08,0x08,0xfb,0x7f,0xe8,0x02,0xff,0x1c,0x4d,0xe8,0xf9,0xd3,0x0f,0x21,0xdb,0xda,0x17,0xca,0xf6,0x1f,0x07,0x00,0x09,0x0d,0xfb,0x34,0x0e,0x01,0xfa,0xd8,0xf5,0x23,0x00,0x48,0x14,0xfd,0x0d,0x20,0x0d,0xf3,0x03,0x01,0x1b,0xf5,0x2f,0xf4,0xe7,0xe9,0xdf,0xb7,0xd3,0x1e,0x41,0x0a,0xe6,0x18,0xe6,0xf7,0xfa,0x0f,0x2b,0x01,0xe5,0xcb,0x27,0xfc,0xf6,0x07,0xe0,0xed,0xe6,0x12,0xe1,0xd9,0xf2,0xec,0x19,0x18,0xf3,0xf9,0x16,0xd3,0x00,0x0b,0x19,0xee,0x23,0x02,0x1e,0xec,0xfe,0xfd,0xee,0x07,0x03,0xe6,0x00,0xd9,0xe4,0x19,0x07,0x02,0xfb,0xf1,0xda,0xbf,0xe6,0xd1,0xf7,0xf5,0xc8,0x14,0x08,0x04,0xed,0x7f,0x01,0xd7,0x48,0x02,0x0a,0x4f,0x05,0xdb,0x0d,0x39,0x1d,0x00,0xf0,0xe6,0x02,0x17,0xd9,0x21,0xf4,0xf1,0x36,0xe8,0xe1,0x07,0xa2,0xfc,0xe3,0xf7,0x05,0x1c,0x19,0xf0,0x19,0x19,0xe6,0xe3,0x03,0x08,0x1e,0xe2,0x26,0x17,0xeb,0x0e,0x17,0x33,0xe3,0x14,0xef,0xf3,0xd6,0xfb,0xe3,0x2a,0xd7,0x0d,0x16,0x0b,0x05,0xf4,0xe7,0xf6,0x28,0xf3,0x05,0xde,0xab,0xf3,0xeb,0xf7,0xd2,0xd0,0x14,0xfb,0xfc,0x0b,0x1b,0x18,0xe8,0x14,0x27,0xfe,0x3b,0x19,0x0a,0xc0,0x18,0xef,0x01,0x2d,0x04,0x10,0x26,0x33,0x3b,0xef,0x20,0xeb,0xfc,0x0e,0xc7,0x1c,0x12,0x22,0xeb,0x23,0xe2,0x4f,0x00,0x32,0xc3,0x0d,0x27,0xb4,0xf5,0xca,0xd1,0xdf,0x2b,0x8e,0xc5,0xe7,0xf2,0x15,0xf7,0x3c,0xac,0xba,0x17,0xec,0xfb,0x0a,0x0a,0xc5,0x3f,0x93,0x3e,0x1c,0xe9,0xf3,0xff,0xd7,0x2e,0xcb,0x04,0x1a,0x1e,0x18,0xfa,0x0d,0x18,0xdd,0xf1,0x55,0x15,0x60,0xb8,0x2e,0xd1,0x11,0x0b,0x64,0x02,0xa6,0x0f,0x12,0x06,0x19,0x08,0xd9,0xec,0xf5,0xee,0x05,0x81,0x5e,0xc6,0x16,0x0b,0x08,0xf0,0xec,0xde,0x12,0xf4,0xe6,0x63,0xff,0x22,0xd8,0xf3,0xfb,0x1c,0xe6,0x2d,0x14,0x0b,0x1c,0x08,0xb7,0xee,0xe9,0x1f,0xe4,0x12,0x19,0x18,0x09,0xcf,0xcc,0xb0,0x21,0xf9,0xda,0x08,0x01,0x38,0xe7,0x37,0xe5,0x04,0xfc,0x30,0x05,0xec,0x58,0x12,0x20,0xfd,0x11,0x0a,0xe7,0x28,0xfb,0x01,0xe7,0xec,0xde,0x49,0x21,0xf4,0xfc,0x19,0x0f,0xa5,0xf2,0xd2,0xec,0xf4,0x47,0xd6,0xc7,0xb6,0x5d,0xf7,0x0e,0xc1,0x36,0xed,0x16,0x25,0xd7,0xe6,0x05,0x14,0x40,0x3d,0x01,0xee,0xdf,0x35,0x5c,0xe2,0x0a,0x3c,0xf5,0xe8,0x0a,0x33,0x09,0x2b,0xc2,0x03,0x3c,0xfe,0xfd,0x39,0xdc,0x03,0x12,0xf6,0x14,0x07,0xf0,0xd8,0x2a,0xe0,0x34,0x0e,0x13,0x0e,0xfc,0x0d,0x39,0x1c,0xe3,0x04,0x25,0xfd,0x1c,0x1d,0xdb,0x25,0xdd,0x4a,0x06,0x0f,0x0e,0x11,0xe4,0x1f,0xd6,0xf0,0x23,0xec,0x10,0xf5,0x87,0xb0,0x36,0xf7,0x19,0x2b,0x1a,0xbc,0x04,0x81,0xdc,0xd0,0xd4,0xd7,0x37,0x09,0xe8,0xc0,0xcc,0x30,0xf9,0x25,0xd4,0x9f,0x09,0x2c,0xf8,0x15,0x71,0x01,0xfe,0x20,0xeb,0x0a,0xd9,0x22,0xe4,0xfc,0x4e,0x15,0xef,0xfe,0x11,0x3b,0xf9,0x1c,0xc8,0xec,0xf2,0x08,0xf3,0xda,0x24,0xdf,0xe4,0x1e,0x56,0xfd,0xc8,0xf9,0x1a,0xec,0xcb,0xbb,0x3e,0xfe,0xdf,0x4e,0x12,0x1d,0x6f,0xac,0x01,0x2e,0x2f,0xe2,0xd3,0xf1,0x05,0xdd,0xc4,0xdc,0xdd,0xf1,0x03,0x0e,0xd0,0xdb,0xbb,0xb6,0x13,0x42,0x2b,0x1b,0x45,0xf5,0x16,0xad,0xc7,0xf6,0x28,0xc5,0xe9,0x45,0x3d,0xbd,0x08,0x03,0x02,0x86,0x26,0x1c,0x2b,0x7f,0xf2,0xcb,0xf9,0xbd,0x60,0x04,0x37,0x37,0xdf,0xd6,0x00,0x09,0x22,0x17,0x01,0x32,0xd0,0xcf,0x3f,0x35,0x7b,0x36,0x1e,0xcb,0x08,0xe9,0x20,0xd9,0x39,0x3c,0x20,0x4d,0xa2,0x1c,0xe4,0xef,0xf7,0xd7,0x05,0xfe,0xc0,0xe8,0x3a,0xff,0x0f,0xf2,0xec,0x0a,0xe6,0x00,0x2f,0xe5,0x19,0xa6,0xf1,0xd4,0xef,0xd5,0x29,0xa5,0x31,0x02,0x9c,0xf9,0x04,0x08,0xac,0xfb,0xf9,0xe1,0xea,0xe8,0xd1,0xe8,0xe0,0x2d,0xb8,0xd7,0xde,0x2f,0xc1,0xf7,0x0e,0x07,0xe8,0x06,0xb1,0x4a,0x42,0xd1,0x9e,0xcf,0x21,0x98,0x7f,0xef,0x23,0x30,0xff,0xee,0xc5,0xc3,0x2d,0x06,0xc4,0x34,0x00,0x41,0xb3,0x07,0x52,0xf7,0x24,0x14,0xee,0xfe,0xde,0xf2,0xae,0x11,0xef,0xe7,0x21,0xde,0x26,0x19,0x1a,0x14,0xfb,0xb5,0x36,0xcc,0x36,0xf8,0x01,0xb9,0xe7,0x07,0xe2,0x61,0x02,0x3e,0x14,0x20,0xd4,0x09,0xf9,0xc8,0xe2,0xf6,0x11,0x1f,0x30,0xd0,0xfb,0xfa,0x31,0x50,0x6b,0xdb,0xf3,0x2d,0xf5,0xf1,0xb1,0x36,0x00,0xf9,0xee,0x01,0x14,0x36,0xe1,0x19,0xea,0xea,0xeb,0x2d,0x25,0x06,0xb4,0x47,0x48,0xcf,0x2f,0x00,0xdc,0x14,0xd3,0x95,0xe1,0x1f,0x1b,0xb6,0xfe,0xc8,0xdf,0xa8,0xc0,0xff,0x06,0xca,0xd4,0x05,0x07,0x07,0xcc,0xa7,0xb2,0xca,0x5a,0x7f,0x22,0x09,0xc1,0xaf,0xaf,0xf9,0xf2,0xcb,0xde,0x04,0x07,0x91,0x95,0x6c,0xd8,0xc7,0xaf,0xba,0x0a,0xe8,0x33,0x35,0x0c,0x06,0xaf,0xf7,0xd6,0x46,0x39,0xeb,0xf2,0x62,0x26,0x02,0xec,0x14,0x17,0xee,0x52,0x5a,0x1e,0xe8,0xe4,0x06,0x18,0x12,0x42,0x0d,0x42,0xdb,0x23,0xca,0x0e,0xfe,0x0a,0xfe,0xd6,0x23,0xf1,0x2c,0x7e,0xee,0xae,0xa2,0x33,0x82,0xc3,0xe3,0x00,0xf0,0xff,0xd7,0xd0,0xd3,0xf1,0xbe,0x4c,0x4f,0xe8,0x48,0x0c,0xa2,0xdd,0x42,0x21,0xc9,0x2b,0x8c,0x11,0xf6,0x1b,0xcf,0x5a,0xd0,0x30,0xd4,0x1d,0x34,0xf0,0xf9,0xcb,0xef,0xb7,0xda,0xf5,0x2a,0xeb,0xce,0x1a,0x8a,0xda,0xff,0x78,0xd3,0x01,0x3c,0xea,0xf4,0xe2,0x34,0x81,0x04,0xa4,0x1c,0x1a,0x12,0xb6,0x62,0xbd,0x11,0xa1,0xf3,0x37,0x51,0xb7,0x2f,0x05,0xd2,0xed,0xac,0x44,0x07,0xdf,0x1c,0x0f,0xf3,0xcf,0xf1,0x2d,0xc1,0xc0,0xd8,0x0b,0x47,0xf9,0x42,0xde,0x1d,0x05,0x02,0xfd,0x02,0x0a,0xae,0x45,0x12,0x0f,0xc8,0x29,0xbb,0xc0,0x07,0xe3,0xd3,0x32,0xeb,0x4f,0xc7,0x58,0x63,0x96,0xe3,0x7b,0xc6,0xff,0xe2,0xf4,0x48,0x53,0xf0,0xda,0x0a,0xd4,0xd4,0x19,0x63,0xf9,0x0f,0x16,0x26,0x1f,0xec,0xff,0x18,0x7f,0x1e,0x0b,0x13,0x31,0xfe,0xf8,0x1a,0xec,0x28,0xe7,0xcc,0xf1,0xe1,0xd3,0xfd,0x0e,0xdd,0xef,0xeb,0xf0,0xae,0x00,0xc9,0x10,0xf1,0xf4,0xc7,0x16,0x51,0xdf,0xe1,0x0e,0xef,0x0e,0x0b,0x1b,0xd4,0xd8,0xdb,0xc4,0x21,0xdf,0xe5,0xea,0x5a,0xe9,0x26,0x4f,0x1e,0x1e,0x13,0x24,0x34,0x3f,0xb9,0xfb,0xf3,0xe8,0x3d,0x40,0x06,0x0b,0x1c,0xf0,0x2b,0x26,0xe7,0x14,0x18,0xff,0x40,0xeb,0x0b,0xd6,0x12,0xc1,0x45,0xda,0xfc,0x0b,0x25,0x14,0x3d,0xe9,0xf8,0x08,0x52,0x15,0xf9,0x01,0xa7,0xe4,0xc3,0xee,0xfa,0xe3,0x10,0x17,0xef,0xea,0x05,0x1b,0x0c,0xec,0x0a,0x39,0xf1,0xdf,0xe3,0xb8,0xdb,0xfb,0x2a,0xd9,0xc8,0x39,0x0b,0x1b,0xe0,0xf4,0x0e,0xf0,0x43,0xb3,0x13,0xcd,0xfd,0xd0,0xdb,0x03,0xe6,0xe4,0xf4,0xf1,0xf8,0x36,0x01,0x0f,0xfe,0x15,0x0f,0xf3,0x0e,0x35,0xfe,0x04,0xd3,0xca,0x00,0xd4,0xd9,0x2e,0x16,0x48,0x33,0x25,0xbc,0x14,0x23,0xf3,0xaa,0xec,0xc6,0xea,0x08,0x7f,0xc1,0x04,0x27,0x0e,0xfb,0x54,0xad,0x08,0xea,0x1a,0xfb,0xe0,0xcc,0xf3,0xd6,0xd6,0x50,0x20,0xe7,0x0a,0xdc,0x24,0x05,0xeb,0xd4,0xbe,0xdf,0xe6,0x12,0x0a,0xfc,0x1d,0xe7,0xca,0x10,0xf9,0x02,0xde,0xe9,0xc1,0xe3,0xd6,0x1f,0x02,0xec,0xda,0x1f,0xd3,0x05,0x21,0xd8,0x22,0xfb,0x11,0x0e,0x32,0x40,0xdc,0x05,0xeb,0xca,0x31,0x26,0xd4,0xf8,0xfa,0xf6,0x0f,0xcd,0xd3,0x1c,0x5f,0xd7,0xda,0xee,0x3a,0x26,0x14,0xe5,0xe0,0xeb,0xfa,0xf6,0x0e,0x17,0x2d,0xca,0xad,0x4d,0x32,0xe2,0xfe,0x3a,0xed,0xda,0x17,0xde,0xba,0xf2,0x2b,0xf0,0x0c,0xe0,0xca,0x0a,0x38,0x04,0x25,0xe9,0x0e,0xd2,0x52,0xd5,0x20,0x2f,0xe5,0x4c,0x1d,0x1f,0x11,0xdc,0x34,0x3c,0x34,0x1f,0xe2,0x24,0x0b,0xf8,0x25,0x35,0xe0,0xf1,0x97,0xf3,0x1a,0xfb,0x02,0x4b,0xeb,0x2c,0x32,0xea,0x3e,0xdd,0x14,0x2c,0xf2,0x12,0x24,0xc7,0xe4,0x47,0x67,0x32,0x81,0x0e,0x03,0x40,0x39,0x4f,0x33,0x15,0x12,0xe2,0x26,0xc7,0xf9,0x09,0xff,0x22,0x3f,0xf3,0x01,0xab,0x15,0xd1,0x31,0xdf,0xd6,0xdf,0x24,0xe4,0x10,0x04,0x5e,0x19,0xe0,0x09,0xfe,0x39,0x10,0x23,0x7e,0x17,0x1e,0xc7,0xa6,0x22,0x0b,0x3f,0x11,0xf3,0x05,0x3c,0x1b,0x40,0x0e,0x44,0xf4,0x0d,0x1c,0x0d,0xdb,0xe0,0xe0,0x30,0x1a,0xf6,0xf4,0x20,0x4d,0x3c,0x01,0xff,0x09,0xd6,0x02,0xe8,0x12,0xe7,0xde,0xc6,0x19,0xe3,0x15,0x1e,0x11,0xda,0xca,0x46,0x07,0xe9,0xba,0x1a,0x1d,0xec,0xd5,0xfc,0x31,0x18,0x0e,0x55,0x04,0xe5,0xd4,0x02,0x0c,0xfe,0xfe,0xc6,0x2c,0xfe,0xa2,0xed,0xe7,0x25,0xe4,0xfe,0xf5,0x55,0x1d,0xe7,0x7f,0xe6,0x00,0xeb,0x00,0xfb,0xde,0xe5,0x0a,0xa8,0x36,0xe7,0x26,0xf4,0xb7,0xf7,0x4d,0x05,0xfc,0xc3,0xfd,0xec,0xfb,0xe4,0xfc,0xfe,0xe4,0xfc,0x20,0xe3,0xd6,0x1b,0xf2,0x46,0xe8,0x3b,0x03,0xe2,0x4b,0xec,0x0e,0x37,0x14,0xf9,0x2e,0xde,0xd6,0x3b,0xdf,0x14,0xd6,0xec,0x3e,0x24,0xeb,0xd3,0xc8,0xd6,0x3c,0xfd,0xf8,0xe9,0xde,0x11,0xed,0x08,0x16,0x08,0xe4,0xd4,0x0f,0xbb,0xe4,0x1e,0x1f,0xe5,0xd9,0xdb,0x31,0x03,0xff,0x0d,0xf8,0x3e,0x0a,0x7f,0x67,0xe0,0xdb,0xf6,0x09,0x01,0x57,0xf5,0xe8,0x04,0x0f,0xed,0x11,0xfe,0xe0,0x24,0x04,0xfb,0xe0,0x28,0xc3,0xe0,0x09,0x03,0x41,0xf3,0xd7,0xde,0x2b,0x21,0xc6,0xe7,0x1c,0x38,0xe3,0xb8,0xed,0x18,0x3b,0x25,0xaf,0xfb,0xe1,0xd0,0xd5,0xf7,0x25,0x16,0xfb,0xbf,0xed,0x29,0xf4,0x1e,0xdc,0xf4,0xb8,0x20,0x32,0xe6,0xe7,0x11,0xec,0xe7,0xff,0x43,0x12,0x01,0xf5,0x92,0x0e,0xef,0x10,0xd3,0x19,0xdf,0xfe,0x32,0xf5,0xf1,0xf7,0x21,0xc6,0x36,0x1a,0xf4,0x1f,0xd6,0xf4,0xf4,0xf4,0xd4,0x01,0x17,0x17,0x07,0xf6,0x1f,0x33,0xf9,0xd2,0x0f,0xe7,0x13,0x15,0x2f,0xd4,0x1c,0xe2,0xf0,0x38,0x1f,0xfd,0x39,0xee,0xe4,0x18,0x14,0xdc,0xc0,0xe1,0xea,0x20,0xbf,0x06,0xda,0x38,0x0c,0xb9,0x15,0x0c,0xf3,0x27,0xde,0xc2,0x18,0xee,0xf6,0x1a,0xdf,0x1b,0xbc,0x3b,0x01,0x6a,0xdf,0xeb,0xd3,0xc7,0x06,0xff,0x58,0xf5,0xbd,0x32,0x0c,0xcc,0xe2,0x2c,0x37,0x9d,0x1e,0x0d,0x91,0x4a,0xc9,0xb6,0x4a,0xc4,0x12,0xbd,0xce,0xed,0x43,0x15,0x22,0x10,0x54,0xe5,0xd2,0x57,0xd3,0xe7,0xb9,0x18,0x2a,0x13,0x43,0xa2,0x39,0xec,0x01,0xb0,0x03,0x56,0x10,0xf8,0xb5,0xfb,0x2a,0xbb,0x58,0xc4,0x18,0x2f,0xd0,0xac,0xfa,0xeb,0x04,0xf4,0x66,0xfb,0x00,0xae,0xb8,0xef,0x52,0x81,0x1d,0xef,0xcc,0x1a,0x16,0x26,0xce,0x20,0x0b,0x3f,0x01,0x2c,0xf5,0xf1,0xf8,0x12,0xec,0xfd,0x55,0xf9,0x90,0xdd,0x35,0xf9,0xf2,0xe2,0x12,0xc9,0x0c,0xe2,0x0c,0xfe,0xd6,0x16,0x41,0xe4,0xea,0xce,0x07,0xff,0xdb,0x37,0xd6,0xd3,0xc7,0xd9,0x0c,0x11,0x06,0x3c,0x4b,0xfc,0x09,0x8f,0xd1,0x19,0x28,0xfa,0x26,0xcc,0xf5,0x1b,0x7f,0x08,0x12,0xde,0xce,0xd0,0xc8,0xc3,0xf8,0x1f,0x27,0xd2,0x09,0x55,0xbc,0x3e,0xc6,0x0e,0xcf,0x43,0x34,0xbf,0xb3,0xe4,0xdd,0x0b,0xa6,0x9a,0x93,0x7b,0x13,0x68,0xff,0x15,0x14,0xfe,0x1c,0x49,0x38,0xaf,0x46,0xd6,0x1c,0x12,0x18,0x34,0x10,0xff,0xc5,0xe8,0x37,0xfe,0xa2,0x00,0x0e,0xfe,0x1d,0x29,0x15,0xd6,0xb3,0x11,0x06,0x24,0x16,0x23,0x97,0xbf,0xf2,0x89,0x09,0xe1,0xf5,0x20,0xc7,0x01,0xfc,0xa3,0x03,0x28,0xf3,0x10,0x30,0x34,0x7f,0xce,0x54,0xdf,0x42,0x29,0xcc,0x0d,0xb7,0x03,0xd3,0xec,0xe2,0xf1,0x03,0xed,0xd4,0x30,0x76,0xe5,0x24,0xe8,0x3e,0xfd,0x65,0x2d,0xe5,0xe8,0xea,0x13,0x0e,0x45,0xf7,0x1d,0xd6,0x34,0x23,0x06,0xb4,0x25,0x26,0x53,0xac,0x18,0xdf,0xf4,0x32,0x1a,0x3f,0xf6,0x07,0x18,0x00,0xf8,0xa5,0x0c,0xfa,0xf3,0x3b,0xd7,0x22,0xb6,0x65,0xe4,0xf9,0x4c,0x06,0xc4,0xf2,0x05,0x45,0xe7,0x3f,0x07,0xf7,0xea,0x4b,0xff,0xb5,0xbd,0x53,0xfa,0xe9,0xc5,0xde,0x6d,0x50,0xc3,0xfb,0xc8,0x06,0x04,0xcc,0x13,0x16,0x14,0xbd,0xce,0x18,0xc4,0xee,0xc0,0xe4,0xe2,0xe5,0xf9,0x17,0xb4,0x25,0x82,0x1e,0x3b,0x15,0x13,0x2e,0xd8,0x00,0x3a,0x18,0xfc,0xe6,0xf7,0xf2,0xf0,0xec,0x1b,0x19,0xf5,0x3e,0x86,0x1e,0x1a,0x31,0xc6,0xf7,0x01,0x00,0xf9,0x3d,0x27,0xfa,0xd5,0x0b,0xef,0x7f,0x06,0x26,0xc3,0xf5,0xad,0xe9,0x2a,0x8b,0x09,0x7f,0x21,0x4f,0x1d,0xf0,0x5e,0x5b,0xe0,0xf7,0x53,0x2a,0x1e,0xd7,0xed,0x09,0x55,0xda,0xed,0xcd,0x25,0x06,0x05,0x57,0xd8,0xc8,0x99,0x01,0xc7,0xd3,0x16,0x20,0x0f,0x20,0x03,0xb3,0xd2,0x28,0x54,0x0b,0x5d,0x25,0xaa,0x83,0xa2,0x71,0x14,0xdc,0x63,0x50,0xee,0xf4,0x33,0x12,0x06,0x0d,0x8e,0xce,0xd3,0xbc,0xf3,0x08,0x07,0xf0,0x0c,0xd3,0x1d,0xba,0x0b,0xd8,0x30,0x37,0xdc,0xc5,0xce,0xfe,0xbc,0xee,0xd0,0xf2,0xec,0x38,0xbf,0xee,0xcb,0x2b,0x78,0xfb,0x1b,0x19,0xd6,0xce,0xdd,0xfe,0x34,0x31,0xf5,0xd2,0xfd,0xc9,0xf4,0x0b,0xff,0xf2,0x52,0xee,0xd4,0xbd,0x91,0xdc,0xf9,0x81,0xf4,0xbd,0xcc,0xea,0xe6,0xe6,0x12,0x45,0xcf,0xef,0xcc,0x0c,0xe2,0x2d,0x32,0xca,0x36,0xdd,0x2c,0x0e,0x18,0x18,0x2b,0x02,0x14,0x19,0x1a,0xf9,0xfe,0x46,0xf3,0xb3,0xd1,0xed,0xe6,0x1e,0xee,0x35,0x3e,0xbb,0x31,0x91,0xdd,0xd3,0x40,0x3a,0x2d,0xb9,0x24,0xb3,0x49,0xe4,0xf2,0xef,0x32,0x27,0xcb,0xd3,0x09,0x12,0x18,0x08,0xc3,0xc0,0x0b,0xd3,0xe0,0x08,0xfa,0x1a,0xfe,0xf0,0x2b,0xc1,0x2b,0x51,0x23,0x04,0xc9,0xed,0xa8,0x10,0xfe,0x11,0x07,0x33,0x12,0xf6,0x09,0x40,0x28,0xf7,0x05,0xe9,0xe5,0xeb,0x49,0x45,0x08,0x43,0x26,0xf9,0xa9,0x77,0x00,0x07,0xaa,0xdd,0xd1,0xe4,0xbe,0xf0,0x17,0xfd,0x47,0xee,0xf4,0x19,0x4e,0xd5,0xb5,0x24,0xfa,0x04,0xfd,0x2b,0x04,0xc2,0x4b,0x25,0xed,0x1f,0xe1,0xfc,0xb6,0xeb,0x30,0xfa,0x03,0xf7,0x33,0x03,0xd6,0x1d,0x10,0x90,0xd2,0xb8,0x04,0x17,0xb6,0x14,0xe0,0x27,0xf4,0x28,0x15,0xd3,0xeb,0x24,0x0b,0x98,0xb7,0xc5,0x63,0xef,0x1d,0x02,0xc1,0x23,0xaf,0x75,0x24,0xca,0x17,0xb6,0xb8,0x34,0xcf,0x2e,0x1b,0xd6,0x47,0xbe,0x45,0xff,0xdb,0xff,0xea,0x45,0xf3,0x27,0xb8,0xff,0xd2,0xdc,0x18,0xb4,0xbe,0xe5,0xe3,0xdf,0xa9,0xd6,0xf6,0xfb,0xc1,0xee,0x09,0x00,0x28,0x8a,0x24,0x00,0xe3,0x81,0xd7,0x1d,0xc1,0xd6,0x23,0xad,0x2c,0xd1,0xa7,0x01,0xe6,0x0b,0xb0,0x07,0x00,0x29,0xfa,0xc5,0xd3,0xd1,0xcb,0xc6,0x28,0xe7,0xb6,0x20,0x2d,0xee,0x00,0x07,0xc3,0xf8,0xf5,0xf2,0xc3,0x28,0x2f,0x1e,0x34,0xe3,0xf0,0xcf,0xe1,0xec,0x2c,0xdb,0x0c,0x17,0xe4,0xfa,0xd0,0xfe,0xed,0x32,0x0c,0xdc,0xdd,0xe8,0x4d,0x10,0xfe,0xe4,0xfd,0xf1,0x03,0xf7,0xdd,0xf6,0xe5,0xe7,0x14,0xc7,0xfe,0x09,0xc4,0x33,0x19,0x15,0x39,0x07,0x2e,0xca,0x06,0xcb,0x7f,0x07,0x07,0xf8,0xf3,0xe8,0xd9,0x29,0xec,0xf6,0xe1,0x06,0xca,0x0b,0xfe,0xce,0x05,0xe6,0x22,0xfb,0xe5,0xd5,0xd1,0xbe,0x03,0x06,0x20,0x24,0x18,0xe8,0x11,0xc7,0xed,0xf0,0x1e,0xfc,0x10,0xcb,0x17,0x00,0x1f,0x20,0x04,0xdd,0xe9,0x0a,0x45,0x35,0x2b,0x08,0xfa,0x4d,0xcb,0xd6,0xd9,0x0d,0xd1,0x1e,0xee,0xda,0x09,0x60,0xfd,0xf1,0x3d,0xf2,0xfa,0x0f,0x27,0x73,0xd7,0x78,0x21,0xeb,0xc7,0xec,0x1f,0x40,0x04,0x52,0xdb,0x13,0xe5,0xf6,0x09,0xef,0xc2,0xef,0x0d,0x45,0xd5,0x06,0x41,0x14,0xee,0xe8,0x0a,0x15,0xf1,0x62,0xe0,0x05,0xe7,0x14,0xff,0x11,0xf1,0xf7,0x7f,0x02,0x41,0xd9,0x12,0xf7,0xe7,0xdb,0x03,0xf0,0xc7,0xc0,0xe2,0x0b,0xf1,0x33,0xf1,0x29,0xe0,0xf1,0xe9,0xc3,0x37,0xd0,0xf1,0x18,0xe7,0xbb,0x0a,0xf5,0xf8,0x27,0x19,0xdd,0x25,0x0f,0x25,0x2d,0xff,0x2b,0xcf,0x02,0x0e,0x00,0x19,0xc8,0xee,0x12,0x15,0xd6,0x09,0xf6,0xcf,0x10,0xfd,0x0f,0xe1,0xba,0xfe,0x09,0x0d,0x2a,0xdf,0x34,0xeb,0xfc,0x3b,0xf4,0x24,0xf9,0xf4,0xfb,0xe7,0xdc,0xeb,0x1c,0xf0,0x5c,0xe6,0x0f,0x0b,0x41,0xce,0xec,0xe1,0xad,0x10,0x19,0x10,0x02,0x28,0x15,0xdc,0x10,0xf8,0xdb,0x3e,0x43,0xec,0x27,0xfd,0x1c,0xc2,0x49,0xee,0xed,0x06,0x09,0xfb,0x3e,0x4d,0xd2,0x25,0x1d,0x01,0x09,0x01,0xfd,0xef,0x3e,0xe1,0xd6,0x05,0x0e,0xfc,0x1c,0xd2,0xd6,0x3f,0xe3,0xff,0xfb,0xf8,0x5a,0xe8,0x2d,0x0a,0x10,0xb0,0x1b,0x70,0xa0,0xbc,0xdc,0xb8,0xb6,0x23,0xde,0x42,0xe7,0x64,0x51,0xe8,0x1b,0xa1,0x07,0x3f,0xc3,0xcd,0x4a,0xdb,0xa0,0xb4,0x2e,0x19,0x35,0x23,0x55,0xf4,0x07,0xf7,0x1c,0xb8,0x07,0x09,0x2d,0x25,0x56,0xe9,0xed,0x0d,0x19,0x25,0xf2,0xfa,0xe4,0x08,0xa0,0xed,0xe8,0x2e,0x07,0xdd,0x47,0x7f,0x12,0xdb,0xd0,0x18,0x37,0x32,0x07,0xe2,0xc6,0xfa,0xf6,0x1e,0x43,0x34,0x0d,0x5e,0xce,0xd7,0xc8,0xc0,0xe2,0xee,0xf9,0x1b,0x4c,0x15,0xfd,0xf7,0x19,0xe7,0x0e,0x19,0xb0,0x0b,0x25,0x81,0xf3,0x04,0xe3,0xe8,0x1a,0xd9,0xdb,0xee,0xee,0x3b,0x10,0xe1,0xce,0x0f,0xca,0xec,0x75,0x48,0x31,0xcd,0xef,0xf9,0xcb,0xee,0x07,0xe5,0x56,0xf3,0x0f,0x3e,0xc9,0x65,0xe5,0x3c,0x0f,0xd5,0xd8,0xf7,0xfc,0xf7,0xea,0xdb,0x09,0xce,0xfb,0xc9,0xb9,0x5d,0xf7,0xdb,0x13,0xd7,0x09,0x1d,0x24,0xec,0xed,0xe4,0x5e,0xdd,0xc7,0x1d,0x0c,0x25,0xe2,0xed,0x18,0xbc,0x1f,0xfe,0x23,0xfe,0xe5,0xf2,0xae,0x17,0xb3,0x23,0x62,0xef,0xd5,0xfc,0xe0,0xe0,0xe0,0xc1,0xfd,0xf6,0x0f,0xd1,0x07,0x08,0x03,0xe2,0xe2,0x05,0x18,0x00,0x2b,0xfe,0x00,0xa6,0xdf,0x30,0x11,0xf5,0x17,0x0b,0xd7,0xf0,0xc3,0x29,0xfc,0xd0,0xe9,0xe9,0x0a,0xce,0x35,0xdb,0x2b,0xee,0xc5,0x0b,0x10,0xa7,0x15,0x18,0x0f,0xb5,0xf4,0x2e,0x0a,0x22,0xe9,0x2c,0x2f,0xcd,0x09,0x63,0xcb,0x06,0xeb,0x28,0xdc,0x40,0x7f,0xeb,0x47,0x25,0xf8,0x06,0x76,0x10,0x24,0x68,0xa0,0x05,0x2a,0x02,0xbf,0xf3,0x09,0x5f,0x2c,0xe4,0xd7,0x01,0xdb,0x1b,0x25,0x1e,0xeb,0xe4,0xcb,0x21,0xe2,0x06,0xcf,0xc3,0x58,0x03,0x61,0x1b,0x4b,0xcf,0x05,0x29,0xe4,0xca,0xe3,0xe3,0xdd,0xfc,0xe3,0xba,0xd8,0x0c,0x0c,0xe4,0xfc,0x0e,0x1a,0xf2,0x16,0x2d,0x14,0x06,0xda,0x52,0xee,0xdc,0xf4,0xf7,0xfe,0x07,0x2c,0xd5,0xd7,0xfd,0x03,0x05,0xc4,0x12,0xeb,0xdd,0x0d,0x0b,0x4a,0xd1,0xf8,0xc4,0x22,0x15,0x02,0xf8,0xf8,0x12,0x13,0xf9,0x17,0xb0,0x06,0xc4,0x1a,0x23,0x3b,0xfd,0xee,0xb7,0x03,0x14,0x3a,0x1b,0x48,0xd6,0x2c,0x36,0x3c,0xb3,0x18,0x09,0x0c,0x08,0x01,0x5a,0xf0,0x21,0xc3,0x2b,0x08,0xce,0xbb,0xec,0x21,0xa5,0x20,0xbd,0xe0,0xe9,0x1d,0x2d,0x06,0x55,0x50,0x14,0x92,0xcd,0x3b,0x76,0xdc,0xfc,0xf0,0x69,0x0a,0x36,0x35,0xc5,0x7b,0x06,0x73,0x0a,0xfb,0x11,0xcb,0xdf,0x47,0xd9,0x0f,0xc1,0x30,0x23,0xc1,0xf8,0x15,0x3d,0x2c,0x05,0x63,0x35,0xfa,0x15,0x0e,0xe4,0xea,0x2c,0xb2,0x19,0xd9,0x81,0xf4,0x33,0x35,0xfc,0xc6,0xec,0x0c,0xcc,0x89,0x5d,0xcd,0x02,0xf5,0x27,0x2b,0xcf,0xb7,0xf0,0xb6,0x03,0x29,0x2b,0x71,0x1c,0xe9,0x11,0x23,0xeb,0x1b,0x40,0xed,0x27,0x6d,0x56,0xdb,0xac,0xf9,0xaf,0x08,0x22,0xf0,0x15,0x13,0x00,0x2d,0x29,0xf2,0xa7,0x16,0xee,0x28,0x3a,0x21,0x17,0xef,0x10,0xfc,0xde,0x12,0x1f,0x32,0xc9,0x09,0x5c,0x0f,0xe9,0xc9,0x0a,0x11,0x29,0x1f,0x1f,0xb0,0xd7,0x34,0xd6,0xe5,0xe9,0xe6,0x48,0x0c,0xe7,0xdd,0x0c,0x12,0xfb,0xdc,0x49,0xec,0xd8,0x00,0xd8,0xe7,0x38,0xff,0xf6,0x47,0xe0,0xfe,0xfc,0x28,0xdf,0x09,0xcf,0x2b,0xdc,0xe7,0xc3,0x2c,0x3b,0xe3,0x21,0x14,0x3b,0xec,0x1a,0x23,0x0a,0x0e,0xd6,0x1a,0x2b,0x23,0xfb,0xff,0xdf,0xe5,0xf2,0x1d,0x16,0x04,0xf2,0x44,0xbf,0xd8,0xe2,0xd5,0x14,0x00,0x23,0x03,0x0f,0x81,0xd1,0xda,0xb4,0xc3,0x08,0xfd,0xf6,0xfc,0xee,0xef,0x10,0x41,0xc5,0x44,0x12,0xff,0xf4,0xf8,0xc1,0xdc,0xf2,0x27,0x0a,0x0c,0x04,0x0b,0xe7,0x0d,0x05,0x20,0x34,0xed,0xe4,0x3e,0xfe,0x01,0xfd,0x08,0xd1,0x04,0xf2,0x22,0xe3,0x1c,0x09,0x26,0xf6,0xe2,0x47,0xee,0xf4,0xc9,0xe8,0xd1,0xf7,0x5d,0xed,0x9d,0x2a,0x34,0xee,0xc9,0xd7,0xcf,0xf6,0xff,0x0d,0x10,0xfb,0xb6,0x0d,0x18,0x29,0xde,0x9d,0xd3,0x35,0xeb,0xe0,0x34,0xe8,0x53,0x02,0x1a,0xd5,0xda,0x10,0xad,0xc4,0x10,0x81,0xe8,0x39,0x43,0x05,0xe7,0xfb,0x0c,0xe1,0xc8,0xe9,0x13,0x28,0x54,0xf9,0xcb,0xcf,0xe3,0x02,0xd9,0x16,0xe7,0xce,0xf3,0x12,0xe2,0x19,0xff,0xcb,0x26,0xc0,0xa8,0xa7,0x3e,0x15,0x03,0xdf,0x41,0xf2,0xf2,0x07,0xbb,0xe1,0xbb,0x00,0xde,0x1c,0xf6,0x06,0xcf,0xdb,0xd8,0xf4,0x21,0x1f,0x30,0xeb,0xc7,0xf1,0xd4,0x25,0x2a,0x0d,0xad,0x03,0x0a,0x02,0x14,0x2c,0x12,0x0a,0x32,0x0b,0x36,0xb4,0xf6,0xf3,0xfa,0x72,0xf9,0xd0,0x32,0xaa,0xd0,0x0b,0xbc,0x2f,0x29,0x3e,0xea,0xf1,0xd8,0xb4,0x64,0x2e,0xc6,0xcb,0x18,0x11,0xe9,0xd8,0xdd,0xe7,0x0c,0x36,0x0c,0x1c,0x16,0xe0,0x17,0x1d,0x0e,0xd3,0x99,0xb9,0xee,0xf7,0xe7,0xe0,0xf2,0xd2,0x68,0xc9,0xe7,0xe6,0x17,0x27,0x37,0xf4,0x7f,0x16,0xea,0x3c,0xc3,0x20,0x15,0xf4,0xf4,0x09,0x3e,0x39,0x23,0xd6,0xdf,0x18,0x35,0xd0,0xd9,0xb9,0x2a,0xd6,0x23,0xe4,0xbb,0xe1,0xd1,0x0e,0xae,0x3f,0xff,0xa7,0x0f,0x26,0x0c,0x04,0x03,0xcb,0xe1,0xff,0xff,0xf8,0xd4,0xe9,0x14,0xd7,0x09,0xee,0x44,0xe3,0xeb,0xee,0xfe,0x0a,0xf5,0xf0,0x20,0xe5,0x4c,0xf1,0x10,0xf1,0xf5,0xce,0x23,0xe0,0xfe,0xe7,0xe5,0x0b,0x0d,0x20,0xe0,0x0e,0xdf,0xf5,0xed,0x7f,0xf7,0xf4,0x33,0x09,0x45,0xf2,0xf3,0x1f,0x0d,0x0f,0x1c,0x32,0x03,0x04,0x69,0xff,0x6e,0x5a,0xf1,0xfc,0x07,0xf5,0x07,0xcd,0xdc,0x0c,0x4e,0x2a,0x2b,0x28,0x21,0x20,0xf3,0x9e,0xe3,0x1d,0x17,0xfe,0x03,0xa3,0x07,0x17,0x14,0xee,0xed,0x34,0x10,0xaa,0x3c,0x23,0xe8,0x02,0x28,0x1c,0xb9,0xad,0xe6,0x4c,0xaa,0xb2,0xfa,0x1c,0xfa,0x23,0x62,0x00,0xf3,0x32,0xd2,0x1f,0xf0,0xaa,0x06,0xf8,0x9f,0x2b,0x2c,0xdc,0xd7,0xdb,0xa9,0xd6,0xef,0x0e,0xe1,0x08,0xfe,0x3d,0x02,0xfa,0xf7,0x0b,0x0f,0xdf,0x4d,0x38,0xf5,0xea,0x07,0xea,0xfa,0x22,0xf0,0xfb,0x22,0xe6,0xd7,0xdc,0xdc,0x65,0x25,0xf5,0xdf,0xc9,0x09,0xe3,0x4d,0x0f,0xee,0xcb,0x00,0xf8,0x5e,0xd2,0xc1,0xfb,0xd9,0x2d,0x17,0x93,0x29,0xf2,0xfe,0xe9,0x8d,0xba,0xd8,0xda,0x39,0x1b,0xec,0xe7,0xdc,0xcb,0xc4,0xe7,0x14,0xdf,0xd5,0xce,0xf2,0x24,0x2f,0x3d,0xc0,0xc9,0x08,0xa8,0xf7,0x2c,0xf2,0xce,0x33,0xcb,0x39,0x2d,0x0c,0xdf,0xaf,0xd2,0xda,0xb9,0x9e,0x25,0xbe,0xa7,0x12,0x8e,0x0b,0xdc,0xe9,0x23,0xdd,0xea,0xb0,0x4c,0xdd,0x1d,0xc3,0x0e,0xd8,0x37,0xf2,0x0a,0x01,0x36,0x00,0x81,0xeb,0x40,0xee,0xb7,0xee,0xf3,0x49,0x35,0xdc,0xbc,0xd3,0xe3,0xf2,0x0c,0x19,0xfd,0xb0,0xb7,0x37,0xe2,0xda,0x32,0x22,0xe4,0xe7,0xc6,0xeb,0x01,0x38,0xc5,0x2a,0x34,0x57,0x52,0x34,0xec,0x09,0xfc,0x0e,0x03,0xcc,0xde,0xb4,0xe9,0x19,0x16,0x38,0x31,0xff,0xf1,0xc2,0xf6,0xbb,0x06,0x22,0x0e,0x3e,0xfc,0xae,0x12,0xf5,0xe9,0xc3,0xed,0x21,0x58,0x74,0x3e,0x00,0xf9,0xc3,0x21,0x29,0xfd,0x0e,0xdb,0x17,0xdb,0xe4,0xe6,0xfc,0xe9,0xfa,0x35,0x11,0xf2,0xdc,0x2e,0x3a,0xf5,0x1e,0xf7,0xd5,0x05,0xe3,0x3c,0xec,0x0a,0xbf,0xc6,0xf2,0x08,0xf0,0x04,0xdf,0x04,0x23,0xf6,0xfb,0xef,0x45,0xaf,0x06,0x35,0xec,0xfd,0x04,0xe4,0xeb,0xf6,0x06,0xe0,0x0e,0x12,0xf2,0xfc,0xda,0x13,0x66,0xe9,0xde,0xfe,0xdd,0x24,0xf5,0xd1,0xed,0xf3,0xc4,0x33,0xcb,0x28,0xe0,0xfb,0x19,0xf2,0xf3,0xed,0xe9,0xdc,0xf8,0x01,0x0a,0xf3,0x01,0xd7,0xf6,0xf6,0x16,0xea,0xcb,0x7f,0xdf,0xee,0xca,0xbd,0x1e,0xe9,0xe3,0xd3,0xf0,0x49,0xd5,0xee,0x0b,0xed,0xf5,0x24,0xd7,0x20,0xf2,0xcc,0x21,0xf2,0x2e,0xd7,0xde,0xe6,0x02,0xcc,0x37,0xd1,0xd5,0x0e,0x32,0x42,0x0c,0xff,0xd8,0x5e,0x46,0xe6,0xe5,0xec,0xfa,0xe3,0xd1,0xdf,0x2d,0x30,0x1f,0xde,0xf9,0xe6,0xef,0xdc,0x09,0xdc,0xe9,0xcf,0x2a,0x03,0xbc,0xd0,0x2e,0x77,0x30,0xe5,0xe7,0x2d,0xc2,0xf5,0xcb,0x0f,0x1e,0x7f,0xf8,0x2d,0x07,0x24,0xf6,0x24,0xc3,0x14,0x76,0x0e,0xee,0x04,0x05,0xf0,0x31,0xed,0xa1,0xe1,0x30,0x13,0x26,0xf4,0xe4,0xa4,0xca,0xbf,0x22,0xd9,0x58,0xd1,0xde,0xd3,0xff,0x2f,0xca,0xf4,0x72,0xe8,0xd3,0xe0,0xfb,0x0a,0xf7,0x26,0x07,0xdb,0x3e,0xe7,0x45,0xf1,0x19,0x09,0xdf,0xcd,0x3d,0x0c,0x25,0x16,0x0e,0xe6,0xd8,0xe4,0x2b,0x06,0x1d,0x37,0x12,0xee,0x0e,0x49,0x0f,0x1d,0x29,0xe2,0x11,0xec,0xb7,0xff,0x3a,0xce,0x07,0xd5,0x14,0xfb,0xfa,0xc2,0x06,0x7f,0x19,0x0d,0x06,0xf7,0x3c,0xcb,0xf0,0x68,0x1a,0xf1,0xdf,0xf3,0x22,0x1e,0xe5,0x0d,0xde,0x1c,0xcd,0xda,0x09,0xe4,0xf9,0xed,0xd5,0xf7,0xe4,0xaa,0xe6,0x99,0xe3,0x1a,0x02,0x16,0xa8,0x22,0xee,0x37,0x03,0xf0,0x3c,0xd7,0xe4,0xbf,0xb1,0xd2,0x1b,0x69,0x51,0xe5,0x16,0xf7,0x03,0xb2,0x9a,0xbe,0x04,0xe6,0xe3,0x1b,0x05,0x0a,0x07,0x08,0x21,0xd5,0xf7,0x0a,0x0e,0x1a,0xda,0x12,0x33,0xf8,0x24,0xf2,0x4d,0x01,0x0c,0x31,0xe6,0xd7,0xcb,0xf9,0x09,0x1a,0xdf,0x02,0xb3,0xd2,0x13,0xe8,0x0e,0x1b,0x42,0xcd,0x00,0x2a,0x34,0x73,0xca,0xc5,0x25,0x07,0x08,0xf6,0x3b,0xcb,0x0e,0xbf,0x07,0xf0,0xc7,0x33,0xf0,0xdc,0x40,0x09,0x5b,0xc3,0x00,0x5f,0xcd,0xf0,0xf3,0x38,0xf9,0x42,0xe1,0x07,0x04,0x36,0x2a,0xd1,0xba,0xfc,0x62,0xd4,0x0f,0xe3,0x7f,0x2e,0xee,0x65,0xd1,0xdb,0xbd,0x35,0x03,0x47,0xfd,0x9c,0x37,0x30,0xce,0x3a,0x18,0xe6,0x35,0xb2,0x11,0x97,0xa7,0xf9,0xe4,0xea,0x3a,0x07,0xf6,0xe7,0x57,0x1a,0xf4,0xe6,0x56,0xdc,0x96,0x30,0x58,0x35,0xe8,0x0e,0x05,0xfa,0x0b,0x36,0x0a,0xaa,0xdc,0x14,0x01,0x06,0x2c,0xe7,0x23,0xda,0x08,0x23,0xbd,0xa4,0x19,0x24,0xfb,0x1f,0x25,0xe2,0x1a,0x1b,0xf6,0x0b,0x23,0xcf,0x30,0xc5,0xfd,0xe9,0x2d,0xdf,0x64,0xe2,0x05,0x50,0x08,0xcc,0xd1,0xbc,0xe0,0x93,0xfe,0x09,0xa5,0x04,0xf4,0xec,0x03,0x28,0xbe,0x38,0x24,0x11,0x0b,0x2d,0xdd,0x1c,0xc9,0x0f,0x40,0xfd,0x03,0x06,0xe8,0x11,0xa0,0x07,0xe1,0x0a,0xf9,0xcc,0xbb,0x43,0x0b,0x32,0xcf,0xbe,0x2c,0xbc,0xb0,0xe8,0x05,0x1b,0x21,0xb5,0xfe,0xd7,0x4a,0xa6,0x08,0x0c,0x0c,0x83,0xea,0x11,0xfe,0x45,0xdb,0xe8,0x22,0xc5,0xfe,0xee,0x11,0x0a,0x13,0xdb,0xf1,0x81,0xf7,0x29,0x1b,0xd1,0xfc,0xd6,0x22,0xb5,0x9b,0x36,0x17,0x1e,0x45,0xa9,0x4f,0x13,0x29,0x04,0xae,0xee,0x0b,0xe4,0x03,0x64,0x20,0xf2,0x1a,0x04,0xf1,0x48,0xd9,0xd0,0x2d,0xf2,0xd7,0x13,0x37,0x1c,0xe0,0xc6,0xd3,0xd7,0x17,0x37,0xba,0xb2,0xa0,0xce,0x2b,0xb1,0xf8,0xd6,0x14,0xf3,0xea,0x23,0xff,0xdb,0x20,0xba,0xdf,0xff,0xd7,0xfd,0x0e,0xe0,0x11,0xec,0xfd,0xcc,0x02,0x2a,0xfb,0x28,0x2e,0xf2,0xe4,0x2c,0x44,0xf1,0x36,0xc6,0xeb,0x19,0xbd,0x30,0x07,0xf3,0xe9,0x15,0xe6,0xef,0xf4,0x01,0x08,0x3a,0x00,0xdf,0x02,0xeb,0xfc,0xf4,0x21,0xa2,0x5d,0x06,0xd1,0x10,0x03,0x12,0xcb,0xf5,0xb2,0x05,0xdf,0xd0,0x1a,0x1b,0x15,0x18,0x05,0xe1,0xf1,0xee,0xf5,0xdc,0xff,0x81,0x1e,0x02,0x25,0xc9,0xe5,0xfd,0xd2,0xf2,0xfb,0xcb,0x13,0x29,0x79,0x1a,0x07,0xb1,0xea,0xed,0xf6,0xdf,0xeb,0xd2,0xdf,0x35,0xea,0xed,0x48,0xb2,0xc3,0xe1,0xb6,0xdb,0x13,0x01,0x16,0x10,0xcd,0xfb,0xeb,0x10,0xe5,0x0e,0x11,0xfa,0x2d,0x0b,0xf4,0xd6,0xf6,0xbf,0x2a,0xda,0x17,0xfd,0xde,0xfd,0xf2,0xce,0xdb,0x36,0xe9,0x1e,0xcc,0x20,0xed,0x15,0x13,0xe1,0x1f,0xec,0xdb,0x21,0xc5,0x1d,0xf3,0xf7,0x09,0x1f,0xd5,0x01,0x25,0xc7,0xfc,0x11,0xc2,0x2f,0xff,0x34,0x10,0x15,0xf3,0x0e,0x33,0x24,0x37,0xea,0x04,0x10,0xff,0x16,0xcf,0x0e,0x07,0x17,0xb5,0xfe,0xb2,0x49,0xe6,0xda,0xff,0x12,0x05,0x1e,0xdc,0xea,0x21,0x0b,0xde,0xe8,0xeb,0x4f,0xe3,0xf7,0xe3,0x1e,0x04,0xdf,0x1d,0x00,0xfa,0xcd,0xe2,0x0d,0xd7,0x1a,0x00,0xf1,0xd8,0xf1,0xf8,0xe2,0xf9,0xdc,0xe5,0xc7,0xfd,0x09,0x0c,0xe7,0x05,0x10,0xc8,0xd6,0x0f,0x11,0xb9,0x45,0xdc,0x09,0xd3,0xfc,0xba,0xe7,0x5c,0xda,0x0e,0xfb,0x24,0xf3,0x6a,0xc1,0x04,0xd4,0x13,0xb9,0x02,0xd9,0xf0,0x16,0xf1,0x18,0x03,0x06,0x20,0x0f,0xe6,0xee,0xef,0xc1,0xe5,0xe2,0x7f,0x28,0xf9,0x06,0xed,0x7e,0xa6,0x2f,0x1d,0xc2,0xf6,0xdd,0x03,0xed,0x05,0x1c,0x1d,0x8c,0xe5,0x0f,0xe2,0x9b,0x1d,0xf3,0x14,0xdf,0x2d,0x22,0x08,0x48,0xed,0xef,0xf2,0x05,0xc2,0xd4,0xd9,0x1a,0x59,0x01,0xeb,0x9c,0xdc,0xe0,0x01,0xce,0x09,0x16,0xd6,0xed,0xe6,0xda,0xbf,0xbe,0x0a,0x03,0xf5,0xd7,0xdd,0x3c,0x22,0x66,0xf2,0x4b,0x2c,0x7f,0x0c,0xa9,0x62,0x8f,0xb3,0x6b,0x2f,0x13,0x0b,0xff,0xbf,0x01,0xa8,0xd2,0xe4,0x8e,0x39,0x59,0xc7,0x4c,0xff,0x1e,0xeb,0x32,0xf9,0x0e,0xf2,0x50,0x56,0x2b,0xe5,0x0c,0x25,0xf8,0xe9,0xf0,0x30,0xf7,0x17,0x47,0xaf,0xfa,0xd8,0x22,0x2b,0xd1,0xca,0x3e,0xda,0x01,0x21,0xf5,0x63,0x0d,0xfa,0xed,0x33,0x7c,0xc8,0xd5,0x49,0x28,0x0d,0xe1,0xe4,0x1c,0x41,0xfb,0x12,0xec,0xae,0x5f,0x1b,0xe8,0x3b,0x05,0xb7,0xe8,0x04,0x1d,0xd1,0xfe,0xbd,0x10,0xe9,0x2b,0xc9,0x35,0x04,0x0e,0x3e,0xe7,0xe8,0xd0,0x76,0xe3,0xec,0xd8,0x43,0xf8,0xbe,0x12,0x0a,0x21,0xd0,0xfc,0x3a,0xd7,0xf5,0xe2,0x4b,0xea,0xda,0x1c,0xce,0x05,0x37,0xff,0x2f,0xda,0x40,0x0f,0x22,0xfa,0xd8,0x01,0xcc,0xd2,0x2c,0xf7,0x1d,0x4e,0x7f,0xdd,0xe6,0x0f,0xcc,0xe2,0xe7,0x12,0xa9,0xda,0xcb,0xe9,0x06,0x0e,0x04,0x3e,0xf7,0xed,0x06,0xc4,0xd3,0xdf,0xcf,0xbe,0xa9,0xd8,0xf2,0x2d,0x21,0x54,0xc1,0x19,0xfa,0x1f,0xfa,0xbb,0xed,0x48,0x29,0x04,0x41,0x0e,0x72,0x06,0x19,0x2a,0x16,0x05,0x25,0xf1,0x35,0x1f,0xfc,0x0e,0x06,0xc1,0x0e,0xf6,0x2b,0xad,0x1e,0xfe,0x26,0xf3,0x81,0x27,0xaf,0x9b,0x08,0xf9,0x38,0xf2,0x9a,0x92,0x21,0xe5,0x3b,0x3b,0x5b,0xa0,0xf8,0x07,0x1e,0x39,0xe7,0x0c,0xbf,0x33,0x41,0xed,0xb0,0x27,0x42,0x02,0x2a,0xf8,0x15,0xd1,0x10,0xbe,0xfd,0x04,0xfc,0xb9,0x4a,0x2f,0x0f,0xfc,0xfe,0xbf,0xae,0x47,0xc9,0x12,0xa2,0xe0,0xea,0x41,0x47,0x59,0xdb,0x21,0x09,0x15,0x1a,0xf1,0x23,0xcb,0xab,0x53,0x35,0x0d,0x8a,0xcf,0x06,0xf1,0x28,0xe3,0xfd,0x2f,0xe8,0x2c,0x0c,0xe8,0x3d,0xed,0x5a,0xe1,0xb1,0x18,0x1b,0x4e,0xf4,0x2e,0xd3,0x0c,0x20,0x23,0x3c,0xd6,0xbc,0x25,0x1c,0x26,0x33,0xe9,0x0f,0xcb,0x2c,0x2b,0x13,0xda,0xb5,0x08,0xeb,0xc2,0xd1,0x1b,0xd5,0x26,0xf0,0x33,0xf6,0xec,0x00,0xf1,0x14,0x23,0x02,0x0d,0xf8,0x26,0x2a,0xef,0xdf,0xc6,0xdd,0xd5,0xeb,0xf3,0x09,0x0d,0x4f,0x06,0x39,0xf5,0xea,0x05,0x3d,0x15,0xb7,0x27,0xa0,0xed,0xdb,0xe7,0x02,0xa3,0x17,0xdf,0xdf,0xc0,0x07,0x13,0xef,0x39,0xd9,0xe5,0x92,0x2f,0xf1,0x3b,0x29,0x7f,0x78,0xdb,0xea,0xf1,0x3d,0x4d,0x5f,0x17,0x52,0xcf,0x1b,0xdc,0x24,0x40,0x0a,0x03,0x21,0xea,0x01,0xd9,0x4c,0xfa,0x08,0x35,0xe5,0xfe,0xf6,0x0f,0x46,0xf5,0x17,0x15,0x24,0xed,0x09,0x15,0x0c,0x23,0xe9,0x3f,0x14,0xf7,0xc0,0xfb,0x13,0x41,0xd5,0xe5,0xd1,0xe2,0xb0,0xee,0x1f,0x20,0xec,0x23,0xf9,0xe9,0x75,0xfb,0x1c,0x5b,0x0e,0x28,0x01,0xea,0xf6,0xe0,0x0f,0xfc,0xe5,0x25,0x47,0xaa,0x1e,0xf2,0x3f,0xf9,0x0f,0x07,0x12,0xd3,0xb2,0xc5,0xd3,0x3d,0xd7,0x07,0x2c,0xc7,0xcb,0x39,0x16,0xf7,0xdf,0x4f,0xc7,0x21,0x22,0x30,0xaa,0xb5,0x18,0xbf,0x2d,0xf3,0x0d,0xf8,0x46,0x10,0x86,0x3d,0xef,0x3c,0x4f,0x29,0xfc,0xe4,0xd3,0x27,0xf7,0x1f,0x26,0x29,0xf1,0xd0,0x29,0xe6,0xf0,0xd1,0x04,0xac,0xdd,0xd9,0xa6,0xfc,0xd0,0xd4,0x09,0x11,0x4a,0x32,0xe2,0xf9,0xeb,0xfc,0xcb,0xf9,0x3b,0xc5,0xd3,0x95,0x50,0x3e,0x16,0x94,0xe7,0xcb,0xcb,0xda,0x3e,0xd5,0x0a,0xc7,0x1d,0x06,0xe0,0x7f,0x31,0x62,0x01,0x1d,0x37,0x4e,0xeb,0x14,0x04,0xf2,0x2a,0x05,0xd9,0x4a,0x34,0xec,0x1f,0x32,0x89,0xf6,0xcd,0x5e,0x1e,0x28,0x1a,0x3e,0xea,0xdd,0x1a,0x49,0xfd,0x25,0x26,0x2d,0xde,0xe5,0xdb,0xd9,0x33,0x42,0xda,0x0b,0x21,0xf3,0xd6,0xe5,0x13,0x1e,0x12,0xcb,0x45,0x12,0x2c,0x1f,0x3b,0xba,0x1c,0x0d,0xfe,0x9e,0xe5,0x3d,0x17,0x47,0x81,0xe8,0xd8,0x28,0xe5,0xf9,0x0e,0xc2,0x2b,0xe2,0xb7,0xf2,0x2c,0x02,0x04,0x51,0xfa,0x07,0xb7,0x25,0x05,0x10,0xb0,0xe3,0xd9,0x0f,0x03,0x0f,0x03,0x15,0xeb,0xea,0xdf,0xe6,0x96,0xfe,0xf0,0x0d,0x19,0xdd,0xea,0xfd,0xf3,0x4a,0xb3,0xc6,0x0e,0x19,0xe7,0xf9,0x0d,0x1c,0x22,0xff,0xd7,0x15,0xce,0x31,0xde,0xd4,0xe1,0xee,0x16,0x04,0x2d,0x01,0xe6,0xd2,0x22,0x1b,0x9c,0xc9,0xdc,0xef,0xf4,0x2d,0x0f,0xaf,0xb0,0x0c,0xde,0xf4,0x2c,0x32,0x19,0x99,0x10,0xe2,0x08,0xbe,0x0a,0xe3,0x13,0x4c,0x08,0x0b,0xeb,0x03,0xfb,0x3d,0xc4,0xcb,0xf5,0xff,0x22,0xd6,0xe8,0x0e,0xd3,0xc0,0x55,0xbc,0x2b,0x3c,0xe4,0x18,0x0e,0xd5,0xe5,0xd0,0xe3,0x2e,0x27,0x18,0x2a,0x02,0x09,0xf2,0xf1,0x12,0x32,0x14,0xbd,0xe9,0x46,0x0b,0xe5,0xf4,0x1b,0xf7,0xde,0xf9,0xf4,0xcd,0xe9,0xbe,0x05,0xc8,0x4c,0xd7,0x0e,0x1c,0xec,0xca,0x23,0xe4,0xf1,0xf0,0xf6,0xfe,0x27,0xcf,0x9f,0xda,0xd6,0x3a,0xfe,0xd3,0xd8,0xf2,0xb3,0x77,0x08,0xba,0xc9,0xbb,0x8e,0x14,0xed,0x1d,0x17,0xe3,0xfd,0xcf,0xef,0x7f,0x1a,0xde,0x0a,0x38,0x15,0xc5,0xef,0xbf,0xf5,0x32,0xd4,0x08,0xcc,0xcb,0x05,0xfc,0x1e,0xf3,0xda,0xdb,0x2c,0x19,0x14,0xf0,0x1a,0x38,0x23,0xa8,0xa2,0x09,0x1f,0x1c,0x22,0xe2,0xe1,0x04,0x53,0x1d,0xf7,0x50,0x0f,0xf3,0x2d,0x1b,0x2e,0xe3,0xfb,0x25,0x17,0xe2,0xef,0x68,0xfe,0xff,0x3d,0xdb,0xed,0xdd,0xe2,0xbe,0x07,0xfd,0x41,0x1c,0x1e,0xed,0xca,0xf0,0x1b,0xe6,0x0b,0xe4,0x1e,0x30,0xf0,0xfd,0x1a,0x5c,0xa1,0xc4,0x16,0x15,0xfa,0x15,0x11,0xe4,0xdb,0x28,0xd5,0xfa,0xf7,0xdd,0xf3,0x9a,0x67,0xc6,0xfc,0xf8,0x0b,0x07,0xaf,0x38,0xaa,0xea,0xf1,0x10,0x49,0x3c,0x19,0x7f,0x33,0xc8,0xeb,0x59,0x12,0xc7,0xe4,0xea,0x24,0x4c,0x07,0x44,0x1a,0x0b,0x00,0x61,0x0f,0x10,0xef,0x20,0xd9,0x69,0x4c,0xc5,0xd1,0xe1,0x1e,0x0a,0xf2,0xe9,0xef,0x4c,0x4a,0xf5,0x35,0x00,0xcd,0xd8,0xe9,0x71,0x53,0x1a,0xff,0xfb,0x22,0x16,0xf0,0x1d,0xdf,0xb1,0xc3,0xef,0xf9,0xe5,0x10,0xde,0x02,0x4f,0xe4,0x12,0xfd,0x0c,0x66,0x28,0xc7,0xf6,0x5d,0x06,0xfe,0xcd,0x99,0x03,0xc8,0xc8,0x06,0xc5,0xcf,0x06,0x4f,0xb1,0x50,0x1b,0xf4,0xbd,0xb1,0x40,0x5f,0x23,0x9e,0x27,0x16,0xd3,0x4e,0x2c,0xe7,0xaf,0xe0,0xf3,0xed,0xc9,0x35,0x0a,0x15,0x2b,0xea,0x81,0x9f,0x08,0x0c,0x25,0x14,0x12,0xb0,0xc3,0x2c,0x5a,0xe9,0x3f,0x70,0xf0,0x00,0xdb,0xd1,0xeb,0xf8,0x08,0x33,0xf6,0xfb,0x51,0xde,0xd6,0xc4,0x46,0x36,0xf0,0x8f,0x0c,0x5a,0x44,0xf6,0x15,0xfa,0xf2,0xf7,0xcb,0x01,0xa2,0xe0,0x3d,0xeb,0x43,0x12,0xf7,0xfd,0xe8,0x64,0x12,0xe5,0xd7,0xcb,0xf1,0x32,0xfb,0x0a,0x81,0x13,0xf8,0xf9,0xc9,0xab,0xec,0x09,0xe6,0xdf,0xf1,0x10,0x0c,0xe8,0xcd,0xf2,0xfe,0x34,0x05,0xf7,0x9d,0xfb,0xeb,0x55,0x06,0xe5,0x1f,0xc0,0xa1,0xb8,0xd0,0x21,0xdd,0x5a,0xd1,0x14,0x09,0xfb,0xfa,0x24,0xf5,0x7f,0x06,0xe1,0x38,0xd2,0x0f,0x14,0x07,0xf4,0x10,0x16,0x20,0x09,0x16,0x2f,0xff,0x2a,0xdf,0xd8,0xea,0x0d,0xe1,0xd2,0xe8,0xda,0xba,0xd8,0x24,0x15,0xc4,0x14,0xc7,0x08,0x00,0x1e,0xc3,0xe0,0xaf,0xf9,0x05,0x0f,0xe9,0x2c,0xc9,0x36,0xff,0xcc,0xf2,0xec,0xdb,0xda,0x2f,0x26,0xe4,0x11,0xeb,0x56,0x1c,0x62,0xd2,0x03,0xd1,0x26,0xc6,0xe0,0xc0,0xef,0xe3,0x30,0xe4,0xc1,0x35,0x1c,0x1d,0xc9,0x0b,0xd2,0xe0,0x14,0x2e,0xf2,0xd9,0x0d,0xd9,0xea,0x33,0xeb,0x09,0x15,0xfb,0x11,0xb0,0xe7,0xe7,0x0c,0xdd,0xca,0x16,0xe1,0xfe,0xd9,0x06,0x04,0x1e,0x06,0xe3,0x0d,0xeb,0x02,0xe7,0x05,0xfd,0xb0,0xee,0xd1,0xf3,0xa5,0xee,0xf1,0xd2,0xf3,0xd6,0x07,0x12,0xf3,0x0a,0xf5,0x0b,0xd9,0x13,0xbd,0x10,0x1a,0x4d,0x04,0xcf,0x02,0x00,0x0e,0x2f,0xfc,0xec,0x2d,0x2c,0x50,0x12,0xdf,0xf0,0x23,0xdc,0xb8,0xf0,0xcf,0xcd,0x06,0x63,0x04,0x42,0x12,0x2b,0x3f,0x29,0x48,0xdd,0xd9,0xcc,0xc6,0xf8,0xb5,0xff,0xeb,0xc6,0x51,0xfd,0x3b,0xf0,0x12,0x8e,0x03,0xea,0x38,0x81,0xea,0x18,0x06,0xcd,0xc3,0xfb,0x08,0xff,0xd5,0x17,0xc5,0xa1,0xfd,0x12,0x08,0xfb,0x3c,0x0a,0x12,0xf9,0xd9,0xe5,0xc8,0x25,0x2e,0xba,0x1f,0xfd,0xf7,0x03,0x41,0xd9,0x9d,0x34,0xde,0x39,0x5c,0x2b,0x05,0x2d,0x00,0x34,0x28,0xe6,0x21,0x38,0xd2,0x09,0x06,0xb9,0x47,0xdf,0x07,0xc7,0x23,0xfc,0x27,0x32,0xf5,0xe0,0x24,0x22,0xee,0xde,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x83,0x0b,0x00,0x00,0xa8,0x27,0x00,0x00,0x47,0xe1,0xff,0xff,0xd6,0xfd,0xff,0xff,0x40,0xca,0xff,0xff,0xd3,0x25,0x00,0x00,0xc2,0xff,0xff,0xff,0xeb,0xc2,0xff,0xff,0xb1,0x52,0x00,0x00,0x51,0x09,0x00,0x00,0x31,0xea,0xff,0xff,0x65,0xc3,0xff,0xff,0x59,0x09,0x00,0x00,0x6a,0xe3,0xff,0xff,0x33,0x02,0x00,0x00,0x7b,0x00,0x00,0x00,0x2f,0x23,0x00,0x00,0x26,0x02,0x00,0x00,0x66,0xd9,0xff,0xff,0x7a,0xd8,0xff,0xff,0x0b,0x15,0x00,0x00,0xfd,0x2e,0x00,0x00,0xd7,0x2c,0x00,0x00,0x87,0xef,0xff,0xff,0x41,0x23,0x00,0x00,0x3a,0x9e,0xff,0xff,0x43,0xfe,0xff,0xff,0x16,0x10,0x00,0x00,0x4c,0x01,0x00,0x00,0x72,0xda,0xff,0xff,0x66,0xfa,0xff,0xff,0x64,0xfe,0xff,0xff,0x34,0x2d,0x00,0x00,0x62,0x0b,0x00,0x00,0xa6,0x08,0x00,0x00,0xf3,0xd2,0xff,0xff,0x7d,0x49,0x00,0x00,0x8a,0xd6,0xff,0xff,0x06,0xf0,0xff,0xff,0x90,0x3d,0x00,0x00,0xfd,0x18,0x00,0x00,0xe3,0xee,0xff,0xff,0x05,0x01,0x00,0x00,0x6e,0xb2,0xff,0xff,0xb3,0x0a,0x00,0x00,0xaa,0xdd,0xff,0xff,0x1c,0x39,0x00,0x00,0xa0,0x10,0x00,0x00,0x90,0x05,0x00,0x00,0x95,0x29,0x00,0x00,0x4f,0xfc,0xff,0xff,0x92,0x0a,0x00,0x00,0xb0,0x0a,0x00,0x00,0x3d,0x2d,0x00,0x00,0x52,0x0c,0x00,0x00,0xdc,0x25,0x00,0x00,0x4a,0xdb,0xff,0xff,0x9c,0x36,0x00,0x00,0xff,0xd2,0xff,0xff,0xa3,0xff,0xff,0xff,0x14,0xf2,0xff,0xff,0x3d,0x0d,0x00,0x00,0x45,0x03,0x00,0x00,0x39,0xe4,0xff,0xff,0xdb,0x02,0x00,0x00,0xf0,0xed,0xff,0xff,0xfb,0xbf,0xff,0xff,0xd1,0xee,0xff,0xff,0x42,0x1d,0x00,0x00,0x27,0x0f,0x00,0x00,0xbc,0x02,0x00,0x00,0xd1,0x39,0x00,0x00,0x96,0xf2,0xff,0xff,0xe6,0x2b,0x00,0x00,0x0a,0x27,0x00,0x00,0x06,0xe2,0xff,0xff,0x10,0x0b,0x00,0x00,0x6e,0xdf,0xff,0xff,0x57,0xde,0xff,0xff,0x74,0xf7,0xff,0xff,0x30,0xf3,0xff,0xff,0xbf,0x13,0x00,0x00,0x3f,0x05,0x00,0x00,0x0c,0xe5,0xff,0xff,0xe7,0xf8,0xff,0xff,0xd3,0x1e,0x00,0x00,0xa7,0x1f,0x00,0x00,0x44,0x21,0x00,0x00,0xf1,0xf6,0xff,0xff,0xe1,0x1a,0x00,0x00,0x60,0xbc,0xff,0xff,0x73,0x09,0x00,0x00,0x71,0x06,0x00,0x00,0x0c,0x0a,0x00,0x00,0x9e,0x31,0x00,0x00,0xac,0xe8,0xff,0xff,0xff,0x06,0x00,0x00,0xff,0x21,0x00,0x00,0xa2,0x5b,0x00,0x00,0x1e,0xfc,0xff,0xff,0x56,0x04,0x00,0x00,0xf1,0xd9,0xff,0xff,0xca,0x27,0x00,0x00,0x21,0xf1,0xff,0xff,0x40,0xd0,0xff,0xff,0xdb,0x06,0x00,0x00,0xec,0x3e,0x00,0x00,0x9e,0x0e,0x00,0x00,0x0b,0xe9,0xff,0xff,0x7e,0x4a,0x00,0x00,0x0a,0x1e,0x00,0x00,0x30,0xfe,0xff,0xff,0x95,0x0b,0x00,0x00,0x06,0xf8,0xff,0xff,0x74,0x43,0x00,0x00,0x71,0x2a,0x00,0x00,0x8a,0x16,0x00,0x00,0x65,0xf5,0xff,0xff,0x23,0x02,0x00,0x00,0xc6,0x01,0x00,0x00,0x4f,0xd5,0xff,0xff,0x5e,0x0a,0x00,0x00,0x88,0x32,0x00,0x00,0x7a,0x18,0x00,0x00,0x51,0xd4,0xff,0xff,0xc7,0x25,0x00,0x00,0xc8,0x2f,0x00,0x00,0x01,0x0b,0x00,0x00,0xfa,0xe0,0xfe,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x7a,0x88,0xba,0x3f,0xcb,0xb5,0x1d,0xad,0x81,0xb9,0xc1,0x77,0x18,0xa7,0xd0,0x76,0xe0,0xc9,0x65,0x02,0x04,0x58,0xcb,0x92,0x70,0x2b,0x7f,0x0d,0x7f,0x0f,0xfd,0xf2,0xe0,0x7f,0xc6,0xe5,0xd2,0x81,0xe6,0xe8,0x7f,0xd1,0xf3,0x34,0xc3,0x2c,0x86,0x8f,0x7f,0xdf,0x81,0xa4,0x7f,0x19,0x0d,0x08,0x1e,0x8b,0xff,0xbf,0x04,0x2c,0x70,0xff,0x7f,0xc1,0xe3,0xe3,0xac,0xd1,0x71,0xf6,0xe3,0xb3,0x8f,0x22,0x5a,0x1b,0x81,0x87,0x3a,0xd1,0x12,0x05,0x1a,0x4e,0x7d,0xba,0x7f,0xfe,0xf9,0x65,0x0e,0xbe,0x90,0xb0,0x91,0xcc,0xb0,0x84,0xbd,0x7f,0x1e,0x81,0xec,0x7f,0x9e,0x6f,0x9e,0x0a,0xe9,0x81,0x3f,0xe3,0x81,0x81,0x34,0x46,0xc9,0xc9,0x06,0x96,0x09,0x27,0xbe,0x2a,0xdb,0x46,0x74,0xef,0xe6,0xe0,0x81,0xa7,0x58,0x06,0xd8,0x7f,0xf5,0x7c,0x4c,0xaa,0xb5,0x18,0x7f,0xea,0x7f,0xf0,0x19,0x7f,0x11,0xed,0xbf,0x7f,0x95,0x77,0x46,0x18,0x62,0xf5,0xe2,0x27,0x9a,0x81,0xf6,0xf1,0x42,0x00,0x5c,0xf9,0xc1,0x7f,0xb7,0x6b,0x81,0x47,0x68,0x23,0xad,0xb4,0x38,0xf8,0xfa,0x37,0x96,0x5f,0x81,0x16,0x74,0x7f,0x47,0x19,0x2b,0xb0,0xa7,0x8f,0xb8,0xd1,0xca,0x69,0x11,0xf8,0x81,0x81,0x2e,0x7f,0xfe,0x81,0x2d,0xdb,0xe0,0xf9,0x1b,0x41,0xeb,0x06,0x24,0x81,0x8d,0x81,0x19,0xab,0x8c,0x33,0xa2,0x81,0xc8,0xd3,0x55,0x29,0x03,0xe4,0xdd,0x26,0x0b,0x52,0x12,0x07,0x5a,0x91,0x67,0x0e,0x99,0xbf,0x7f,0x3c,0x50,0xbe,0x81,0x99,0xac,0x03,0x78,0x0f,0xbc,0xdc,0x81,0x81,0xbc,0x95,0x15,0xc7,0x7f,0xe8,0xc8,0x76,0x19,0xb4,0x6b,0xd6,0x81,0x3f,0xf5,0x1b,0xd0,0xfd,0x42,0x58,0x81,0x16,0x95,0x7e,0xe2,0x7f,0x18,0xd9,0x20,0xe2,0x15,0xde,0xdd,0x2b,0x93,0x8e,0x7f,0xe1,0x2c,0x15,0x1a,0x12,0xc0,0xfc,0xfc,0x20,0x20,0x00,0x24,0x52,0xd6,0x9b,0x8f,0xec,0x11,0x2b,0xaf,0xda,0xd6,0x09,0x2e,0x2d,0xe9,0x22,0x0c,0x81,0xf4,0x1c,0x81,0x4e,0x02,0x9b,0xa4,0x99,0x48,0xe7,0x17,0x52,0x07,0xd3,0xd8,0xc8,0xeb,0x7f,0xfe,0x01,0xff,0xbd,0x1f,0x89,0xb2,0xef,0x8a,0x83,0xe1,0xcd,0x1c,0x19,0x36,0x8d,0xdf,0x9b,0xfb,0x5a,0xf5,0x09,0x97,0x03,0xbd,0x63,0x14,0x16,0xbe,0xc0,0xe8,0x7f,0x8c,0xf0,0x47,0xab,0xf6,0xc4,0x7f,0x2f,0xb1,0xdd,0x75,0xd0,0x7f,0x1e,0x30,0xa4,0x07,0x79,0xb2,0x0b,0xce,0x23,0xb7,0x81,0xb9,0xcc,0xf1,0xea,0x03,0x7e,0x18,0x01,0x36,0x81,0xc4,0xf5,0xe2,0xe5,0x17,0x7f,0xb9,0x2f,0x81,0x41,0xb9,0xdb,0x44,0x22,0x76,0xbc,0x71,0xe7,0x78,0x6a,0x37,0x40,0xf8,0x0d,0x08,0xf7,0xc1,0x84,0x0b,0x63,0x5c,0x27,0x81,0x81,0xdb,0xa3,0xb3,0xe8,0x41,0xbb,0x3a,0x37,0xb5,0xc1,0x81,0xb7,0x7b,0x53,0xe7,0xce,0x77,0x72,0x7f,0x4f,0xd2,0xb9,0x7f,0xeb,0x69,0x7f,0x09,0x5a,0x1b,0xd4,0xca,0xd5,0xce,0x1b,0x18,0xb5,0x1b,0x1e,0x82,0x78,0xf0,0xc1,0xe6,0x18,0x7f,0x22,0x81,0x71,0x06,0x60,0xbf,0x03,0x2f,0x9c,0x17,0x5d,0x52,0xa2,0x03,0x40,0x81,0xa1,0xf8,0xdd,0xe2,0x7f,0x34,0x2e,0x7f,0x20,0x05,0x8d,0x3b,0x7f,0x02,0xbb,0xcd,0x7f,0xfb,0x2f,0x57,0x7f,0x3d,0x07,0xaf,0x42,0x04,0x81,0x04,0xe5,0x38,0x26,0x40,0x0c,0x81,0x21,0xdd,0x33,0xee,0x39,0x3c,0x4c,0xb4,0x1a,0xf8,0xd5,0x81,0xb2,0x63,0xe8,0x25,0x2a,0x1e,0x10,0x2a,0x7f,0xdf,0xe6,0x36,0x38,0x90,0xc6,0x12,0xcf,0x0b,0x35,0x8c,0xd9,0x88,0x81,0x94,0x2f,0x09,0x07,0x43,0xd2,0x81,0x2e,0xc2,0x19,0x8b,0x7f,0x53,0x81,0x71,0x4c,0x2a,0x16,0x31,0x02,0x09,0xfb,0x39,0x40,0x1b,0xe4,0x15,0x81,0xe9,0xcb,0x81,0xb3,0x44,0xdf,0x7f,0x7f,0xfb,0xc7,0x81,0x81,0x31,0xfd,0xdc,0x1b,0xb1,0x47,0x81,0xdb,0x82,0x25,0x7f,0x14,0x21,0x2d,0x01,0xd2,0xd4,0x06,0xa5,0xc4,0xd8,0xb2,0x86,0x2e,0x57,0x2d,0x4e,0x0b,0xb1,0xfe,0x00,0xa3,0x20,0xe1,0x3f,0xef,0xa2,0xfa,0x6f,0xc5,0x2e,0xb2,0xea,0x3a,0x32,0xb7,0xef,0x7f,0x7f,0x39,0xa9,0xdd,0xbb,0x1f,0xa9,0x20,0x24,0x15,0x4e,0x20,0xf1,0xd2,0x0d,0x11,0x47,0x88,0x32,0xc1,0x75,0x1b,0xbb,0xe9,0xe2,0x0d,0x1c,0xe3,0x21,0x7f,0xe5,0x81,0x0f,0xa2,0xaa,0xd1,0xeb,0x12,0xa6,0xc4,0xbe,0x41,0x16,0xc3,0x29,0x1d,0xf7,0x12,0xd8,0x6f,0x89,0x6c,0x30,0xb6,0xea,0x59,0x45,0x09,0x2b,0x17,0xf4,0xd5,0x33,0xd7,0xe7,0xe7,0xe6,0xb4,0xd9,0xff,0xc2,0x7c,0x81,0x81,0x65,0xdb,0x81,0xfa,0xfe,0x46,0xf2,0xc2,0xb9,0xb0,0xfc,0xef,0xc8,0x9f,0xb1,0x16,0xd4,0x6f,0x7f,0x46,0xd7,0xb0,0x9b,0xde,0xc0,0x20,0xd7,0x81,0x0c,0xc9,0x71,0x08,0xf4,0xff,0x21,0xd8,0xc4,0x3f,0xef,0x81,0x8c,0xaf,0xa5,0xd0,0xc4,0xdc,0xfe,0x2f,0xb4,0x81,0x0d,0x06,0x76,0x53,0xeb,0xc9,0x6c,0xa9,0xbf,0xea,0xe6,0x08,0xe5,0x27,0x81,0x7f,0xac,0xf6,0xd0,0xf9,0xd5,0x8c,0xf2,0xd8,0x41,0xe9,0x7f,0xfe,0x7f,0xed,0xb2,0x06,0xe3,0x7b,0xe7,0xba,0xfc,0x7f,0xfc,0xf4,0x9c,0xb9,0xcf,0x4f,0x81,0xe2,0x81,0x9a,0xf7,0x06,0xfe,0x29,0xdf,0xfd,0x78,0x5f,0x1d,0x94,0xd2,0x54,0x49,0x9c,0xb8,0xbc,0xc2,0x21,0x08,0x30,0x1e,0xcc,0x1c,0x88,0xd9,0xf7,0x03,0xd9,0x9d,0x90,0x07,0xc3,0xd9,0x98,0xc7,0xb3,0x81,0xd2,0x0c,0xd3,0xc7,0xab,0x38,0xab,0x51,0x1b,0xfe,0xdc,0x1e,0x7f,0x4f,0x00,0x2c,0x0f,0xe1,0xb9,0xb7,0xe7,0xc2,0xfe,0x0d,0x7f,0xf2,0x7f,0xff,0xbd,0xb0,0x45,0x16,0x16,0xb6,0x03,0xf5,0xd4,0x02,0xf2,0x81,0x04,0xbd,0xe3,0x39,0xae,0x2b,0xff,0x58,0x07,0x39,0x4a,0xa2,0xf0,0xb2,0x2d,0xe7,0x0f,0xc4,0x78,0x43,0xe8,0xae,0xe0,0x88,0xc5,0x11,0x81,0x8e,0x1e,0x06,0xad,0x74,0xe4,0x8a,0x59,0x18,0x6e,0x61,0xff,0x47,0xe9,0x7f,0x7f,0x86,0xda,0xda,0xc1,0x99,0x0b,0xc2,0xa0,0xf8,0x81,0xb4,0x2b,0xff,0x7f,0x38,0x2f,0x7f,0xbc,0xcd,0x4a,0x21,0xc1,0x18,0x84,0xd6,0x7f,0x7f,0x6e,0x7f,0x09,0x7f,0xbc,0xdc,0x3a,0x8e,0xa6,0xd4,0x50,0x5a,0xfd,0x67,0xf0,0x83,0xa1,0x56,0x0c,0x08,0xb5,0x2b,0xb4,0xa8,0x81,0x7f,0x7f,0x10,0xc1,0x1b,0x1d,0xa1,0x16,0xde,0xfd,0x01,0x81,0xad,0x92,0x81,0xf5,0x70,0x51,0x16,0x33,0x09,0x0e,0x1b,0xf7,0x40,0x20,0xf2,0x88,0xde,0xf3,0x7f,0xea,0xc2,0xe6,0xff,0x93,0x43,0x1e,0xb8,0x50,0x06,0x3d,0xa5,0x4d,0x92,0xe3,0xc6,0xf8,0x0e,0x21,0xb3,0xe4,0x65,0xe7,0x81,0xd6,0xb5,0x2a,0x0a,0x24,0x3d,0x7f,0xe5,0xdd,0xe5,0xcf,0x30,0x7f,0xeb,0x56,0x35,0xa5,0x36,0xd0,0x98,0x62,0xec,0xbd,0xe4,0xdd,0x0d,0xe7,0xb9,0x81,0x32,0x87,0xb6,0x3d,0x23,0x62,0xb7,0x08,0x4f,0xba,0xa0,0x27,0x17,0x85,0x78,0xd1,0xf7,0x26,0x58,0xe9,0x1c,0xf8,0x41,0x2c,0xed,0x19,0xd6,0x37,0x0b,0xe4,0x1c,0xf6,0xfb,0xd0,0xb6,0x3a,0x56,0xc1,0xfa,0xac,0x2d,0x85,0x10,0xa9,0x4d,0x58,0xe1,0x5f,0xdf,0x43,0xc4,0x4d,0xcb,0x05,0x84,0x8b,0x0f,0x3c,0xf5,0x11,0xec,0x42,0x1f,0x07,0x86,0xe5,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x6d,0xed,0xff,0xff,0xdb,0x1e,0x00,0x00,0x18,0xfe,0xff,0xff,0x76,0xf4,0xff,0xff,0xae,0x0b,0x00,0x00,0x99,0x20,0x00,0x00,0xc0,0xfa,0xff,0xff,0xb1,0xf6,0xff,0xff,0xed,0x27,0x00,0x00,0xa2,0xf4,0xff,0xff,0xd0,0xf9,0xff,0xff,0x66,0xee,0xff,0xff,0xfc,0xfa,0xff,0xff,0xed,0x18,0x00,0x00,0x3a,0x25,0x00,0x00,0x7f,0xfb,0xff,0xff,0xd1,0xf3,0xff,0xff,0xcf,0x13,0x00,0x00,0x83,0xf0,0xff,0xff,0x7d,0xf0,0xff,0xff,0xd8,0xeb,0xff,0xff,0x9a,0xe8,0xff,0xff,0x66,0x05,0x00,0x00,0xe2,0x15,0x00,0x00,0x28,0x22,0x00,0x00,0xcf,0xf4,0xff,0xff,0xca,0x0a,0x00,0x00,0xb4,0xe9,0xff,0xff,0xf8,0xf3,0xff,0xff,0x63,0xee,0xff,0xff,0x31,0xfd,0xff,0xff,0xd9,0xed,0xff,0xff,0x3f,0x15,0x00,0x00,0x93,0xf1,0xff,0xff,0x87,0x1b,0x00,0x00,0x27,0x12,0x00,0x00,0x04,0x16,0x00,0x00,0xfb,0x1f,0x00,0x00,0x8f,0xe9,0xff,0xff,0x89,0x12,0x00,0x00,0x49,0xde,0xff,0xff,0x40,0xfa,0xff,0xff,0xaa,0xf6,0xff,0xff,0x6a,0xf2,0xff,0xff,0xe6,0xfb,0xff,0xff,0x08,0xf5,0xff,0xff,0x5c,0x23,0x00,0x00,0xdd,0xf9,0xff,0xff,0xd2,0xe6,0xff,0xff,0x41,0xee,0xff,0xff,0x23,0x13,0x00,0x00,0xb0,0x1e,0x00,0x00,0xfb,0xed,0xff,0xff,0x8e,0x00,0x00,0x00,0x5b,0xfe,0xff,0xff,0xe9,0xf1,0xff,0xff,0xed,0x21,0x00,0x00,0x71,0x0e,0x00,0x00,0xab,0x1e,0x00,0x00,0x1a,0x18,0x00,0x00,0x09,0x0f,0x00,0x00,0xc1,0xf1,0xff,0xff,0xe8,0xf4,0xff,0xff,0x88,0x15,0x00,0x00,0xc7,0xe9,0xff,0xff,0xbc,0x09,0x00,0x00,0x67,0x1e,0x00,0x00,0xe3,0x0b,0x00,0x00,0x99,0x1e,0x00,0x00,0xda,0xfc,0xff,0xff,0x18,0xf8,0xff,0xff,0x84,0xe0,0xff,0xff,0x9f,0xf1,0xff,0xff,0xb7,0x2b,0x00,0x00,0xc3,0x15,0x00,0x00,0x48,0xe7,0xff,0xff,0x39,0xdd,0xff,0xff,0x72,0xfe,0xff,0xff,0x52,0x02,0x00,0x00,0xcd,0x24,0x00,0x00,0x7b,0xf6,0xff,0xff,0x4f,0xff,0xff,0xff,0xa7,0xea,0xff,0xff,0x04,0xf1,0xff,0xff,0xd9,0xf1,0xff,0xff,0xb5,0xee,0xff,0xff,0xc0,0xec,0xff,0xff,0x99,0x1b,0x00,0x00,0x8e,0xfd,0xff,0xff,0xb7,0x10,0x00,0x00,0x9d,0x1d,0x00,0x00,0x75,0x09,0x00,0x00,0x62,0x06,0x00,0x00,0xf7,0x15,0x00,0x00,0x17,0xfc,0xff,0xff,0x5a,0x01,0x00,0x00,0xe4,0x1d,0x00,0x00,0xe8,0x14,0x00,0x00,0x56,0x1a,0x00,0x00,0xa1,0x15,0x00,0x00,0x35,0xf8,0xff,0xff,0x02,0xfb,0xff,0xff,0x84,0xf9,0xff,0xff,0xf8,0x1c,0x00,0x00,0x3d,0x12,0x00,0x00,0xa0,0xef,0xff,0xff,0xff,0x11,0x00,0x00,0x81,0xfc,0xff,0xff,0x4e,0x12,0x00,0x00,0x17,0xf6,0xff,0xff,0x27,0xf4,0xff,0xff,0xae,0x09,0x00,0x00,0x51,0xe8,0xff,0xff,0x5d,0xed,0xff,0xff,0x5d,0x14,0x00,0x00,0xb7,0x1a,0x00,0x00,0xdd,0xfd,0xff,0xff,0xf6,0xeb,0xff,0xff,0x0c,0x18,0x00,0x00,0x21,0x1f,0x00,0x00,0xfe,0x10,0x00,0x00,0xdd,0x26,0x00,0x00,0xe9,0x19,0x00,0x00,0x75,0xf6,0xff,0xff,0x11,0xe2,0xff,0xff,0x66,0xe5,0xff,0xff,0x5d,0xf3,0xff,0xff,0x38,0xf3,0xff,0xff,0x92,0xe7,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x83,0xe7,0xff,0xff,0x46,0xa8,0xff,0xff,0x14,0x34,0x00,0x00,0x10,0xc0,0xff,0xff,0x53,0x11,0x00,0x00,0xdd,0x11,0x00,0x00,0xc2,0xfc,0xff,0xff,0xbe,0xe0,0xff,0xff,0x50,0xa6,0xff,0xff,0x1a,0xdd,0xff,0xff,0xfa,0x08,0x00,0x00,0xb3,0xff,0xff,0xff,0x51,0x9b,0xff,0xff,0x87,0x11,0x00,0x00,0x50,0xc7,0xff,0xff,0x3a,0xe3,0xff,0xff,0xa8,0xd9,0xff,0xff,0x4d,0xac,0xff,0xff,0x4d,0x2b,0x00,0x00,0x07,0x05,0x00,0x00,0x9f,0xf2,0xff,0xff,0x4b,0xb8,0xff,0xff,0x71,0xf0,0xff,0xff,0xa4,0x2b,0x00,0x00,0xfc,0xd5,0xff,0xff,0x24,0x0d,0x00,0x00,0xc8,0xd9,0xff,0xff,0x6e,0xff,0xff,0xff,0x1b,0x38,0x00,0x00,0x4e,0xbf,0xff,0xff,0x3e,0x9b,0x00,0x00,0xb4,0xf5,0xff,0xff,0xc7,0xff,0xff,0xff,0x2a,0xd5,0xff,0xff,0x56,0xc7,0xff,0xff,0x6d,0x11,0x00,0x00,0x3c,0xda,0xff,0xff,0x5a,0x32,0x00,0x00,0x0a,0xf8,0xff,0xff,0x47,0x00,0x00,0x00,0x86,0xf1,0xff,0xff,0x1d,0x04,0x00,0x00,0x4a,0xe3,0xff,0xff,0xe1,0xa5,0xff,0xff,0xef,0x3e,0x00,0x00,0x27,0xb7,0xff,0xff,0xf4,0x28,0x00,0x00,0x86,0x27,0x00,0x00,0xb4,0xed,0xff,0xff,0x29,0xf4,0xff,0xff,0x5f,0xe3,0xff,0xff,0x46,0x14,0x00,0x00,0xa7,0x1c,0x00,0x00,0x83,0x1f,0x00,0x00,0xc6,0x24,0x00,0x00,0x63,0x1c,0x00,0x00,0xf9,0xf6,0xff,0xff,0xad,0x0f,0x00,0x00,0x8a,0xbb,0xff,0xff,0xf0,0xe4,0xff,0xff,0xcf,0xce,0xff,0xff,0x15,0xe9,0xff,0xff,0xf4,0xbf,0xff,0xff,0x77,0xbf,0xff,0xff,0x01,0x0e,0x00,0x00,0xf9,0x16,0x00,0x00,0x06,0xd7,0xff,0xff,0x6b,0xe6,0xff,0xff,0x34,0xd2,0xff,0xff,0xb6,0x2d,0x00,0x00,0xf8,0x95,0xff,0xff,0xaa,0x16,0x00,0x00,0xba,0x02,0x00,0x00,0x49,0xe0,0xff,0xff,0x48,0x14,0x00,0x00,0x9d,0x09,0x00,0x00,0x7e,0x89,0xff,0xff,0x6b,0xfb,0xff,0xff,0x66,0xc7,0xff,0xff,0xe1,0xe6,0xff,0xff,0x27,0x2c,0x00,0x00,0x08,0xf3,0xff,0xff,0x31,0x01,0x00,0x00,0x00,0x05,0x00,0x00,0xf6,0xec,0xff,0xff,0x0c,0x25,0x00,0x00,0x1d,0x0c,0x00,0x00,0xd1,0xc1,0xff,0xff,0x73,0x87,0xff,0xff,0x65,0xf8,0xff,0xff,0x79,0xbe,0xff,0xff,0xb1,0xcf,0xff,0xff,0x37,0xf7,0xff,0xff,0xe6,0xc0,0xff,0xff,0x7b,0xef,0xff,0xff,0x52,0xe0,0xff,0xff,0x24,0xa5,0xff,0xff,0x72,0xad,0xff,0xff,0x4e,0x25,0x00,0x00,0x2c,0xfd,0xff,0xff,0x52,0x29,0x00,0x00,0x42,0xf8,0xff,0xff,0xde,0xe4,0xff,0xff,0x79,0x04,0x00,0x00,0xe1,0x1b,0x00,0x00,0x5c,0x10,0x00,0x00,0x2b,0x2a,0x00,0x00,0x45,0x0b,0x00,0x00,0x04,0xc5,0xff,0xff,0x5c,0x39,0x00,0x00,0x50,0xf1,0xff,0xff,0x17,0xb8,0xff,0xff,0xf4,0xf8,0xff,0xff,0x1b,0xe6,0xff,0xff,0xb2,0x0d,0x00,0x00,0xd2,0xae,0xff,0xff,0x4a,0xee,0xff,0xff,0x7d,0x2e,0x00,0x00,0x8d,0xe7,0xff,0xff,0x92,0x03,0x00,0x00,0xd6,0x34,0x00,0x00,0x1c,0xdf,0xff,0xff,0x85,0xab,0xff,0xff,0xbf,0x4b,0x00,0x00,0x9b,0x3e,0x00,0x00,0x09,0xd6,0xff,0xff,0x7a,0x00,0x00,0x00,0x1c,0x18,0x00,0x00,0x76,0x36,0x00,0x00,0x80,0x94,0xff,0xff,0x6b,0xf7,0xff,0xff,0x0c,0x1b,0x00,0x00,0xa6,0x95,0xff,0xff,0x64,0xd4,0xff,0xff,0xc0,0x0f,0x00,0x00,0xea,0x1c,0x00,0x00,0x41,0x01,0x00,0x00,0xba,0x1d,0x00,0x00,0x80,0x2a,0x00,0x00,0x9a,0x13,0x00,0x00,0xf0,0x27,0x00,0x00,0x31,0x0d,0x00,0x00,0x9f,0x13,0x00,0x00,0xde,0xf1,0xff,0xff,0x9b,0xcf,0xff,0xff,0xe5,0xf4,0xff,0xff,0xbc,0xc5,0xff,0xff,0xea,0xf1,0xff,0xff,0x32,0xf6,0xff,0xff,0x12,0xf2,0xff,0xff,0x6e,0xdf,0xff,0xff,0x44,0xd2,0xff,0xff,0xa6,0x54,0x00,0x00,0x6b,0x31,0x00,0x00,0x48,0x09,0x00,0x00,0x77,0xee,0xff,0xff,0xbb,0xbc,0xff,0xff,0x7c,0xb5,0xff,0xff,0x87,0x1c,0x00,0x00,0xba,0xda,0xff,0xff,0x2e,0xe9,0xff,0xff,0xd0,0xff,0xff,0xff,0x8a,0xc1,0xff,0xff,0x23,0x42,0xff,0xff,0xdf,0xe8,0xff,0xff,0x13,0x12,0x00,0x00,0x63,0xe5,0xff,0xff,0xdf,0xe9,0xff,0xff,0xcc,0xc5,0xff,0xff,0xfd,0xe2,0xff,0xff,0x43,0xf5,0xff,0xff,0x30,0xf5,0xff,0xff,0x60,0x1e,0x00,0x00,0x62,0x9f,0xff,0xff,0xcb,0x0b,0x00,0x00,0xd1,0x5c,0x00,0x00,0xe9,0xdf,0xff,0xff,0xec,0x20,0x00,0x00,0x47,0xfb,0xff,0xff,0x94,0x9e,0xff,0xff,0x45,0x0e,0x00,0x00,0x27,0x0b,0x00,0x00,0x26,0xdb,0xff,0xff,0xdf,0xbb,0xff,0xff,0x61,0x51,0x00,0x00,0xd9,0x1d,0x00,0x00,0xa9,0xb5,0xff,0xff,0xb9,0x5a,0x00,0x00,0xea,0xd7,0xff,0xff,0x02,0xfb,0xff,0xff,0x0c,0x48,0x00,0x00,0x29,0xea,0xff,0xff,0x00,0x0a,0x00,0x00,0xf5,0x1a,0x00,0x00,0x14,0x14,0x00,0x00,0x22,0x0b,0x00,0x00,0xbc,0x24,0x00,0x00,0xeb,0xda,0xff,0xff,0xed,0xe8,0xff,0xff,0x13,0x12,0x00,0x00,0xcd,0x0a,0x00,0x00,0x8a,0x28,0x00,0x00,0x62,0x03,0x00,0x00,0xd2,0x8f,0xff,0xff,0x0f,0x08,0x00,0x00,0x4c,0x41,0x00,0x00,0x95,0xd9,0xff,0xff,0xea,0xfc,0xff,0xff,0x6a,0x01,0x00,0x00,0x4b,0x95,0xff,0xff,0x6e,0x0f,0x00,0x00,0x41,0x0f,0x00,0x00,0xea,0xfc,0xff,0xff,0x55,0xe8,0xff,0xff,0xab,0x8a,0xff,0xff,0x77,0xa9,0xff,0xff,0x6e,0x38,0x00,0x00,0xc8,0x1e,0x00,0x00,0x31,0xf0,0xff,0xff,0x41,0x99,0xff,0xff,0x0c,0x0a,0x00,0x00,0x51,0xc6,0xff,0xff,0xdc,0x28,0x00,0x00,0x22,0xad,0xff,0xff,0xee,0x2b,0x00,0x00,0x99,0xf0,0xff,0xff,0x0b,0xf2,0xff,0xff,0xba,0x32,0x00,0x00,0xc4,0x3c,0x00,0x00,0x7c,0xb2,0xff,0xff,0xac,0x07,0x00,0x00,0x6d,0x0d,0x00,0x00,0xef,0x15,0x00,0x00,0xce,0xf9,0xff,0xff,0x2f,0x11,0x00,0x00,0x8f,0x10,0x00,0x00,0xe2,0x05,0x00,0x00,0xda,0xdc,0xff,0xff,0xff,0x06,0x00,0x00,0xc1,0x10,0x00,0x00,0xc0,0xeb,0xff,0xff,0x4b,0xe1,0xff,0xff,0x72,0xec,0xff,0xff,0xeb,0xe4,0xff,0xff,0x34,0x31,0x00,0x00,0xe0,0xf9,0xff,0xff,0x9b,0x23,0x00,0x00,0xa3,0xd8,0xff,0xff,0xb1,0xb6,0xff,0xff,0xa7,0xec,0xff,0xff,0x15,0x23,0x00,0x00,0xd3,0xa3,0xff,0xff,0xa2,0xb1,0xff,0xff,0x3d,0x29,0x00,0x00,0xfb,0xbc,0xff,0xff,0x77,0x29,0x00,0x00,0x9e,0xeb,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x95,0xe3,0x77,0xf4,0x7f,0x81,0x9d,0xe6,0x15,0xa6,0xc2,0xba,0xf5,0xf3,0xe8,0x03,0xf1,0xfb,0x0d,0xf2,0x23,0xfb,0xef,0x4c,0xfd,0xab,0xd0,0x0e,0xcf,0xb8,0x81,0x84,0xf1,0xdf,0xfb,0xdb,0xf8,0xed,0xe9,0x07,0x2a,0xac,0xd3,0xee,0x40,0x81,0xc6,0x20,0xe7,0xe4,0xdd,0x7f,0xf8,0xe1,0x24,0x7f,0xe7,0x4f,0xd3,0x0c,0xbc,0x16,0xc7,0xc7,0xec,0xca,0xa6,0x84,0xae,0xe2,0x1d,0x19,0xb8,0xe5,0xc8,0x89,0xfb,0xca,0xf3,0xf9,0xd6,0xd1,0xdf,0xca,0x2a,0x46,0x81,0x2a,0xf8,0xc2,0x09,0xb0,0xa9,0xf4,0x0b,0xb7,0xfd,0xdf,0x74,0xa9,0xda,0xed,0x19,0xba,0xa3,0x01,0xf1,0x9e,0xec,0x17,0x10,0xf8,0x95,0x09,0x20,0xc7,0xa0,0xb3,0xc9,0x1f,0xd1,0xcf,0xe7,0xf3,0x7f,0xe4,0xcc,0xbc,0x81,0xe9,0xd9,0xc9,0xf3,0x02,0xd3,0x46,0x3c,0x81,0xbc,0xdf,0xee,0xe3,0xdf,0x02,0x23,0xfe,0xf8,0xd4,0x19,0xd4,0xa0,0x7f,0x0a,0x0e,0x26,0xe4,0x16,0x8b,0x81,0xee,0xf8,0xf1,0xe8,0xdb,0xeb,0x90,0xc4,0x2c,0x9b,0xf2,0xe9,0x7f,0x81,0xb4,0xf6,0xaf,0x8a,0x51,0xee,0xee,0x21,0xe1,0xa7,0xfb,0x89,0xd3,0xce,0x25,0xcf,0xa4,0xb1,0xe2,0x6b,0x14,0x56,0x81,0xa5,0x20,0xe2,0xd1,0xe2,0xb6,0x7f,0x35,0xff,0xb6,0xdd,0x37,0xf1,0x06,0x18,0x56,0x02,0xfd,0xdd,0xd1,0x8c,0x93,0xfc,0xee,0xeb,0xf8,0xf1,0xbb,0xa8,0x2c,0xbb,0xdf,0xeb,0xf2,0x13,0xd8,0xe1,0x18,0xfa,0x86,0xd4,0xb5,0x81,0xa2,0xdb,0xd5,0x0a,0xe0,0x15,0x2c,0xca,0xe9,0x05,0xec,0xc6,0xf0,0xa5,0xe2,0x0e,0x0b,0xed,0x2e,0x1e,0xf8,0x35,0xc5,0xb3,0x35,0x33,0x1f,0xe4,0x92,0x2a,0xcc,0xf7,0x8c,0x02,0x23,0x81,0x0b,0x41,0xfa,0x53,0x0a,0xfb,0xe1,0xd0,0xd8,0xf2,0x8d,0xc0,0x5d,0xc2,0xe0,0x81,0x81,0xfd,0x10,0xbc,0x1b,0x81,0xef,0x38,0x09,0xe8,0x47,0x9b,0x35,0x7f,0x84,0xcd,0x60,0xce,0x81,0x12,0xb2,0xa0,0x7f,0xbe,0x74,0x7f,0x81,0x36,0x25,0x25,0xfd,0x92,0x1e,0xf9,0xb9,0x1d,0x12,0xc7,0xf2,0x72,0xfd,0x74,0xe0,0x05,0xf6,0xad,0xd1,0xec,0xe8,0x1c,0x15,0x0c,0x1d,0xf1,0x81,0xe7,0x4a,0x81,0x0d,0x0d,0xbf,0xf5,0x27,0x0b,0x44,0xff,0x19,0x81,0x53,0xb8,0x1e,0xcb,0x39,0xeb,0x81,0x7f,0xfd,0xd0,0xd0,0x81,0x24,0x7f,0xa6,0xf1,0x81,0xcb,0x46,0xc7,0x88,0xe6,0x81,0x09,0xff,0x3c,0x2a,0xb1,0x81,0xf9,0xe2,0x81,0xa4,0x04,0x8f,0xcc,0x7f,0xd0,0x47,0xf2,0x45,0xef,0xd9,0xa9,0xec,0xf1,0xc7,0x68,0xf4,0xd0,0xdf,0xa0,0xe1,0xfd,0x85,0x6a,0xda,0x45,0x97,0x6c,0x7f,0x00,0xb0,0x42,0xf9,0x7f,0xe0,0x16,0xb7,0xb1,0xe7,0x89,0x1e,0x0a,0x81,0x20,0x08,0x81,0xdd,0x32,0x3a,0x9c,0x03,0x7f,0x08,0xfb,0xd2,0x81,0x10,0xfa,0x1c,0xa0,0x9b,0x81,0x3a,0xd7,0xb5,0x43,0x73,0x90,0x36,0x53,0x88,0x15,0x9d,0x9b,0xdf,0xc3,0x7f,0x8e,0x42,0xdf,0x1e,0xf0,0x37,0x81,0x60,0xdc,0x2f,0xc5,0x0e,0x22,0x2e,0x1b,0xa9,0x06,0x01,0xd9,0xbd,0xf7,0x7f,0x7f,0x81,0xef,0x81,0xc8,0x81,0x06,0xb1,0xcb,0x81,0xf7,0x14,0x4b,0x0e,0x11,0xe4,0xdb,0xf4,0x34,0xb9,0x91,0xda,0x0e,0x30,0x7f,0x06,0x37,0x41,0xe4,0x7f,0x7e,0x7f,0xe3,0x81,0xe2,0xb8,0x04,0x25,0x7b,0x00,0x1d,0x74,0xb6,0x0f,0x40,0xbb,0xcb,0xa5,0x81,0xc0,0xef,0x0e,0x28,0x27,0xdb,0x56,0xdd,0x2e,0xd9,0xed,0x4b,0xec,0x20,0x5e,0x32,0x1f,0xc3,0xd6,0xb1,0xe4,0x3f,0xe6,0xff,0x1c,0xd6,0xbc,0x12,0xe8,0x81,0x20,0x11,0x7f,0x42,0x42,0x3f,0x08,0x81,0x97,0xd0,0x7f,0x81,0xeb,0x58,0xda,0x57,0x1d,0x08,0x81,0x38,0x81,0xef,0xe1,0x03,0xa3,0x32,0x14,0x90,0xf8,0x48,0xe3,0x09,0xb1,0xd1,0x10,0x22,0x26,0x89,0xe3,0x15,0xc9,0x08,0x44,0xc1,0x9f,0xde,0x7f,0xec,0x7f,0xdf,0xfe,0xf4,0x21,0x6e,0x05,0xe6,0xf1,0xda,0x7f,0xb4,0x56,0x47,0xe7,0x9d,0x7f,0x91,0x67,0x03,0xc2,0xed,0x01,0xe2,0xee,0x81,0xcc,0xea,0xed,0x8b,0xbb,0xad,0xcf,0x98,0x1d,0xe1,0xfa,0xf4,0x01,0x7f,0x00,0x7f,0x6b,0xc7,0xfb,0x7f,0x97,0x16,0xd8,0x19,0x10,0xf8,0x60,0x4d,0xb2,0x8c,0xe6,0x32,0x2d,0x18,0x25,0xc9,0xa2,0x7d,0x61,0x7f,0x3d,0x0d,0xd8,0xcd,0xe6,0x11,0x0c,0x17,0xd4,0x4d,0xde,0xf9,0x79,0x49,0x7f,0xec,0x81,0xc4,0xb0,0xca,0xfd,0xc2,0x63,0xa0,0xf5,0xbe,0x43,0x12,0x45,0xc6,0x7f,0xb2,0x7f,0xe6,0x94,0x24,0x1c,0xda,0x1b,0x5a,0xa8,0x2d,0x1d,0x35,0xde,0x36,0x4a,0x0f,0x22,0x11,0xc5,0x7e,0xff,0x5c,0xbb,0xd3,0xa8,0xd9,0xb4,0x09,0xdc,0xbf,0xed,0x23,0xdd,0xd1,0xdd,0x0a,0x1c,0x05,0x81,0x91,0xd3,0xd0,0xa3,0x33,0xe4,0x0e,0x0c,0x81,0x15,0x89,0xd7,0x81,0x39,0x0c,0x3f,0xef,0xff,0xcc,0xe8,0x78,0x48,0x5c,0xec,0x2c,0x78,0xed,0x7f,0x7f,0xd2,0xca,0x34,0xfe,0x10,0x9d,0xcd,0x0a,0xb0,0xed,0xa3,0x86,0xe5,0x51,0x81,0xa6,0x0c,0x46,0x35,0x57,0x88,0xed,0x81,0xb8,0xfb,0x13,0xa7,0x2b,0x2e,0x0c,0xae,0x7f,0x81,0x81,0x7f,0x7f,0xed,0x84,0xd9,0x0f,0xb2,0x76,0x00,0xc9,0x19,0xdb,0xf1,0xf1,0xf2,0x41,0x27,0x7f,0x0c,0x15,0xfa,0x36,0x29,0x92,0x1f,0xe5,0x19,0x7f,0x33,0x7f,0x7f,0x81,0x3a,0x55,0x8e,0xa9,0x7f,0x25,0xaa,0xde,0x25,0xa7,0xaa,0x58,0x00,0x20,0x41,0x0d,0x08,0x81,0x1e,0x7f,0xe2,0xb8,0xc9,0x35,0xca,0xb9,0xa6,0x31,0x66,0x25,0xdc,0x54,0xbc,0x63,0x35,0xa7,0xe1,0x0c,0xc6,0xbf,0xee,0xd8,0xb7,0xe2,0x0d,0xf5,0xe5,0x00,0x28,0x72,0x6f,0xd9,0xdb,0xf6,0x54,0xe2,0x8a,0xe8,0x0a,0x70,0x16,0xdc,0x60,0xb8,0xe0,0x25,0x73,0x7f,0x2c,0xe6,0xf3,0xbd,0x7f,0x7f,0x1e,0xcb,0xc5,0xdc,0xdf,0xaa,0x1e,0x69,0x72,0xdb,0x9e,0xc8,0xf2,0xc5,0x1e,0xf0,0x6e,0x5c,0x98,0x03,0x54,0x30,0x41,0x7f,0x7f,0xe8,0xc2,0x81,0x32,0x81,0xcc,0xea,0xf7,0xb6,0x7f,0x04,0x03,0x02,0x83,0x28,0x62,0x22,0xd1,0xbe,0xd9,0xf1,0xfb,0x5c,0x3b,0x81,0x60,0x3e,0x81,0xdd,0xde,0x7f,0xe4,0xa6,0xe0,0x54,0xdc,0x7f,0xd7,0x2b,0x6d,0x1b,0x7f,0x81,0x33,0xad,0x7f,0x9b,0x83,0x7f,0xdc,0x7f,0x4c,0x4b,0x04,0x01,0x49,0xef,0xe5,0xfe,0xbf,0xfc,0xa5,0x2f,0x08,0x5e,0xa2,0xb8,0x7f,0x61,0x7f,0xbd,0x65,0x0f,0x7f,0x3b,0xd9,0x53,0x2d,0xd8,0x7f,0x89,0xdf,0x34,0x3f,0x51,0x0a,0x7f,0xb7,0x68,0xd3,0x2a,0x7f,0x7f,0x38,0xa5,0xf4,0xff,0x7f,0x7f,0xb2,0x7f,0xaa,0xe1,0x81,0xfc,0xe4,0x92,0x7f,0x7f,0x7f,0x0e,0x38,0x71,0xb0,0x7f,0x81,0x98,0xbe,0x7f,0x7f,0x81,0xef,0xee,0x1f,0xf8,0x3f,0x4e,0x14,0x1d,0x31,0x81,0x9c,0xe3,0xa9,0xc2,0x7d,0x6d,0x00,0x28,0x04,0x06,0xc3,0xb8,0xeb,0x53,0x12,0x65,0x81,0xdd,0x7f,0xe9,0xaf,0x75,0xbb,0x2e,0x55,0xf8,0x1d,0xdd,0x7f,0x81,0x2f,0xbe,0x81,0x64,0x0f,0x81,0x7f,0x0f,0x14,0xc1,0x7f,0x6b,0x7f,0xb3,0x15,0x10,0x54,0xf8,0x1d,0x6f,0xce,0xa2,0x81,0x33,0x10,0x79,0x77,0x1a,0x7f,0x10,0x51,0xd2,0xd9,0x38,0xe8,0xfc,0x35,0x09,0x5b,0xc8,0x20,0x7f,0x7f,0x33,0x72,0xd2,0xaf,0x4c,0x7f,0x3f,0x81,0x81,0xa8,0x71,0xd5,0x7f,0x57,0x10,0x43,0xce,0x7f,0xe1,0xf3,0x10,0xf3,0xf9,0xab,0xd9,0xdf,0xa4,0x7f,0x76,0x1a,0xe4,0x7f,0xac,0xb8,0x7f,0x0b,0x7f,0xb0,0x7f,0x81,0x17,0x9f,0xf5,0x9a,0xd4,0x4f,0x66,0xea,0x7f,0x97,0x0f,0x16,0xdf,0x52,0xd3,0x7f,0xf0,0x0f,0x20,0xee,0x00,0x23,0x50,0x2d,0x19,0x48,0xbd,0xf2,0x13,0x81,0xdb,0x81,0x51,0xfe,0x1e,0x17,0x1d,0x28,0x7f,0xd1,0x11,0x3d,0x73,0x90,0xdf,0x7f,0x4a,0x2f,0x35,0x0c,0x97,0x7f,0x7f,0x13,0xad,0xdf,0x86,0x14,0x29,0xbb,0x19,0x7f,0x05,0x23,0x20,0xfb,0xf5,0x10,0x7f,0xa5,0xfe,0xf7,0x1b,0xfd,0x0e,0xbb,0x20,0xac,0x81,0x00,0x14,0x26,0xd0,0x7f,0x7f,0x06,0x16,0xd3,0xfe,0x7f,0xd6,0x6c,0x99,0xba,0x0d,0xf7,0x13,0x39,0x30,0xb7,0x7f,0xaf,0x1a,0x30,0x59,0x78,0x0d,0x7d,0x4a,0x67,0xfc,0x45,0x32,0x40,0xea,0xd5,0xf2,0xf6,0xa0,0x75,0xe0,0x03,0xc8,0x43,0xe7,0x23,0xee,0x4e,0x09,0x39,0x45,0x18,0xc8,0xd9,0x40,0xe7,0xde,0xe3,0x03,0xcf,0xf8,0xcb,0x08,0x37,0xc6,0xc7,0x7f,0x19,0x6c,0x0e,0x7f,0x17,0xc1,0xf8,0x21,0xc3,0xaf,0x7f,0x7f,0xa9,0x7f,0x24,0x81,0x40,0x16,0x1e,0x0e,0x63,0x56,0x08,0xee,0x52,0xb4,0xf3,0xf2,0xb1,0x44,0x07,0xe8,0x4d,0xf7,0x7f,0xe9,0xed,0x7f,0x1b,0xcc,0x09,0x0f,0x7f,0xc7,0x15,0x81,0x1c,0x81,0xa6,0x37,0x22,0x98,0x7f,0x7f,0x56,0xca,0x72,0xf8,0x81,0xab,0x3a,0xf5,0x3b,0x07,0xe5,0xd2,0x2b,0xf6,0xaf,0x23,0x0d,0x89,0x7c,0x7f,0x77,0x7c,0xb7,0xae,0x4b,0x81,0x4e,0xda,0x7f,0x4b,0x42,0xd3,0x05,0x2d,0x25,0xf5,0xdc,0x4c,0x06,0x7f,0x0d,0x5b,0x20,0x7f,0xad,0x84,0x06,0x9b,0xd6,0x6e,0x05,0x58,0x06,0xeb,0xe6,0xa9,0xd2,0x01,0xce,0xcb,0x81,0x7f,0xb7,0x89,0xd3,0x0d,0x36,0x19,0xd7,0x90,0x55,0xb2,0x13,0xd0,0x2a,0x81,0xe9,0xeb,0x78,0x31,0x1b,0xc2,0xf5,0x0f,0x40,0xa1,0x0e,0x81,0xd7,0xeb,0xfd,0xf6,0x3d,0xf8,0xde,0xdd,0x7f,0xb1,0xff,0x7f,0x06,0x81,0x7f,0xd7,0x54,0xfc,0x38,0x3d,0xd4,0x41,0xdb,0xf9,0xce,0x64,0xcf,0xfd,0x6c,0xd9,0x81,0xcd,0xa5,0x0a,0xd0,0xf7,0xf6,0x90,0x60,0x7f,0xfa,0xa6,0x0f,0xf1,0x7f,0xf9,0xc6,0x37,0xd3,0x25,0x0b,0x4a,0x0d,0xae,0x81,0x0f,0x47,0xf5,0x38,0xe7,0x48,0x38,0xae,0x7f,0x0d,0xef,0x1b,0xcd,0xbc,0xfd,0x35,0xfd,0x41,0x20,0xc9,0x81,0x15,0xe6,0xfe,0x08,0x25,0x23,0x14,0x7f,0xb8,0x1c,0xf7,0x6c,0xf2,0xe0,0x1f,0xca,0x97,0xe6,0x0d,0x41,0xfb,0x28,0x57,0x9d,0xa0,0xfe,0x07,0xe3,0x0f,0xeb,0x11,0x69,0x3e,0x0e,0xf1,0xcb,0x1d,0xef,0xd2,0xd3,0x7f,0x52,0x7f,0x56,0x71,0xdc,0x4d,0xf3,0x22,0xf5,0xb0,0x0f,0x2c,0x0a,0x9d,0x65,0x5d,0xff,0x09,0xde,0x7f,0xe1,0xc2,0x48,0xd2,0x02,0x0f,0xfe,0xe7,0xf0,0xfe,0xd4,0x10,0x3d,0xd9,0x0f,0xdf,0x4b,0x97,0x32,0xcf,0xc3,0xc2,0xb2,0xe8,0x27,0xb5,0x7f,0xea,0x05,0xf3,0xee,0x10,0x71,0xa7,0xa9,0x1b,0x7f,0x93,0xc4,0x12,0x95,0xb0,0xe2,0xd1,0x10,0x8e,0xb7,0x7f,0x43,0xc0,0x01,0xba,0xf4,0x2a,0xa5,0xd8,0x4f,0xc1,0xc6,0xf9,0x1a,0xc1,0xc9,0xb6,0x16,0xd9,0x2d,0x7f,0xcb,0xd0,0x52,0xbc,0x3a,0x2a,0xe3,0x23,0xd0,0xcd,0x43,0x04,0xc8,0x2f,0xf7,0x50,0x20,0x53,0x11,0xc9,0xfe,0x04,0xf8,0xd0,0x09,0x81,0xbf,0xaf,0x12,0x53,0x1f,0xda,0x4a,0xf4,0xfa,0x0f,0x0f,0x18,0xd6,0x50,0xc9,0x2b,0x7f,0xfe,0x85,0x58,0x67,0x1b,0x7f,0xfd,0xf1,0x05,0x9f,0x7f,0x29,0x4c,0x2b,0xde,0x4d,0xe4,0x17,0x32,0xd2,0xee,0x7b,0xe8,0x28,0x81,0x24,0x6f,0x16,0x2d,0x21,0xb6,0x11,0xa9,0xd2,0xaf,0xc0,0xed,0xf4,0x05,0x7f,0xaf,0x06,0x2b,0xb9,0xb8,0x38,0xad,0x13,0xf8,0xfb,0xeb,0x81,0x1e,0xca,0x5b,0x4b,0x09,0x39,0x01,0x6d,0xd9,0x32,0xfe,0x81,0xec,0xf8,0x36,0xaf,0xe4,0x7f,0xe8,0xa3,0xc1,0x08,0xad,0x43,0xd7,0xf1,0xf7,0xde,0x40,0x00,0x81,0x46,0xa5,0xac,0x8f,0x1f,0xc9,0x5c,0xe2,0xe6,0xf8,0xf9,0xf9,0x6e,0x1f,0x89,0x52,0x7f,0xb9,0xeb,0xbd,0x0d,0xe7,0x0e,0x0e,0xfc,0xe9,0x95,0x43,0x16,0x2a,0x24,0xed,0x7f,0x25,0xf4,0x09,0x49,0x08,0x30,0x70,0xf0,0x84,0x5b,0x35,0xa8,0x81,0x7e,0x95,0x1d,0xcd,0xbb,0xfd,0xcf,0x24,0xd4,0xe0,0xff,0x57,0x17,0xfc,0xd2,0x0f,0x81,0xbf,0x8c,0xef,0xbe,0x6a,0x7f,0x61,0xcb,0xe6,0x2e,0xf3,0x2a,0xb9,0x22,0xef,0x4d,0x81,0x0a,0xee,0x1e,0x9d,0xc9,0xcb,0x2e,0xe5,0x0c,0xee,0xd7,0xe6,0x13,0x43,0x7c,0x1f,0x00,0x09,0x22,0x28,0x07,0xd4,0x81,0x81,0xd0,0xad,0xf3,0xd9,0xec,0x61,0xa0,0xab,0x1d,0xd6,0x43,0xe3,0xe9,0xd7,0x29,0xd1,0xc2,0xeb,0xf4,0x81,0xdf,0xf9,0x0e,0x81,0x11,0x0d,0xe4,0x81,0xff,0xfb,0xe2,0xd5,0x2a,0x5d,0x5d,0x0c,0xef,0x99,0x1e,0x46,0xd8,0x81,0xb1,0xfb,0x48,0x22,0xd8,0xf3,0xf0,0x00,0xb2,0xb1,0xf3,0xcf,0xe5,0xc8,0x8d,0x26,0xba,0xe9,0xa2,0xba,0xe0,0x43,0xce,0xb4,0xfb,0x7f,0x7f,0x81,0xc1,0x06,0x2f,0x41,0x59,0xe5,0x17,0x00,0x2b,0x46,0xc1,0x7f,0x09,0x5c,0x11,0xe9,0x1e,0x0f,0xab,0xf9,0x2b,0x21,0x59,0x35,0xf5,0x36,0xc8,0x1a,0xb3,0x81,0x81,0xb3,0x81,0x81,0xbe,0xdd,0xce,0xe1,0x25,0x16,0xfd,0x22,0xe6,0x91,0x4f,0x2d,0x05,0xdd,0x9b,0xf0,0xdd,0xf4,0x1b,0x0f,0xe7,0x02,0x41,0x19,0x75,0xce,0xb0,0x97,0x16,0x63,0xe2,0x36,0x9a,0xf4,0xf6,0xb8,0x75,0x16,0x14,0x1e,0xfe,0xcc,0xcb,0xd7,0x42,0x7f,0x20,0xdf,0x1f,0x2a,0x1f,0x81,0x51,0x7f,0xec,0x2e,0xdf,0xf0,0x16,0xb3,0x28,0x75,0x40,0x9f,0x3a,0x58,0x0c,0x2f,0x56,0x81,0xe7,0xe5,0x3e,0xbe,0xdb,0xfc,0x09,0x22,0xf4,0xf1,0x72,0x0c,0xf2,0x8d,0x32,0xc2,0xb8,0xbb,0x9c,0xd8,0xa0,0xf0,0x10,0x16,0xf5,0xd0,0x9b,0x7f,0xda,0x14,0xce,0x13,0xcd,0xed,0xc3,0x5d,0x1e,0xf6,0x13,0xdb,0xf0,0xdb,0xde,0x18,0xfa,0x24,0x5a,0xe8,0x3f,0xee,0xb1,0x0c,0x81,0x41,0xea,0x4a,0x4c,0xe9,0x1c,0xff,0x29,0xf5,0xa7,0xaf,0xbf,0xe7,0xe3,0xbf,0x04,0x23,0xd8,0x23,0xba,0xc8,0xda,0x31,0xac,0x5d,0x7f,0x28,0xcf,0xb8,0x07,0xf2,0xfa,0x91,0x2b,0xd0,0x36,0xb2,0x6c,0x54,0xce,0xf4,0x32,0xc8,0x88,0x07,0xe3,0x07,0x7f,0xc0,0xd6,0x1d,0x40,0x14,0xcf,0xf6,0xec,0x97,0xf7,0xc5,0x0f,0xe1,0x0e,0x81,0xcd,0xbc,0x7f,0x7f,0xdd,0x18,0x52,0xa3,0xe7,0xba,0xf1,0x81,0x21,0x18,0xbb,0xbd,0xf6,0x20,0xed,0x0a,0x06,0x04,0xbb,0x7f,0x15,0xf5,0xa0,0x23,0x2e,0x3d,0xdf,0x1e,0xba,0x4a,0x5e,0x40,0x81,0x10,0x10,0x2d,0x24,0xf4,0x23,0x29,0x85,0x60,0xd0,0x79,0x19,0xc9,0x81,0x4a,0x36,0x3a,0xf3,0x5f,0xaa,0xf7,0xd7,0xb9,0x31,0xca,0xb9,0xee,0xe1,0x55,0xed,0x13,0xc2,0x6d,0x0a,0x0d,0xee,0xe3,0xcd,0x9f,0x12,0xa3,0xd0,0x28,0xc3,0x29,0x27,0xbc,0x81,0xbd,0xd4,0x4c,0xf1,0xe6,0x7f,0xc2,0x34,0xf5,0xda,0xbb,0x05,0xe1,0xaa,0xf4,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x4d,0x01,0x00,0x00,0x79,0xed,0xff,0xff,0xca,0xfe,0xff,0xff,0x59,0xf6,0xff,0xff,0xc4,0x12,0x00,0x00,0xf6,0x08,0x00,0x00,0x87,0xf9,0xff,0xff,0x54,0xf8,0xff,0xff,0x99,0xeb,0xff,0xff,0x08,0xfd,0xff,0xff,0x78,0xf8,0xff,0xff,0xa9,0x0a,0x00,0x00,0xf6,0xf3,0xff,0xff,0xaa,0x06,0x00,0x00,0x1e,0xf9,0xff,0xff,0x54,0xfd,0xff,0xff,0x55,0xf5,0xff,0xff,0x0b,0xed,0xff,0xff,0x00,0x09,0x00,0x00,0xa0,0xfe,0xff,0xff,0x26,0x00,0x00,0x00,0x06,0xfb,0xff,0xff,0x4b,0xf5,0xff,0xff,0xa6,0x0d,0x00,0x00,0x49,0xf8,0xff,0xff,0xef,0x09,0x00,0x00,0x42,0x0b,0x00,0x00,0x1f,0x0a,0x00,0x00,0xb6,0xfc,0xff,0xff,0x5e,0x12,0x00,0x00,0x40,0x10,0x00,0x00,0x5d,0xf5,0xff,0xff,0x5f,0xf4,0xff,0xff,0x81,0xf5,0xff,0xff,0xec,0x07,0x00,0x00,0x86,0x06,0x00,0x00,0x1f,0xfb,0xff,0xff,0x94,0x0d,0x00,0x00,0x0d,0xfe,0xff,0xff,0x7f,0x04,0x00,0x00,0x48,0x04,0x00,0x00,0xdb,0x0d,0x00,0x00,0xad,0xef,0xff,0xff,0xc9,0xf1,0xff,0xff,0x9e,0x0b,0x00,0x00,0x30,0x0c,0x00,0x00,0x0c,0x07,0x00,0x00,0x51,0xfe,0xff,0xff,0x76,0xfe,0xff,0xff,0x12,0xfd,0xff,0xff,0x1c,0xf9,0xff,0xff,0x44,0xf8,0xff,0xff,0xdf,0xf9,0xff,0xff,0x12,0x07,0x00,0x00,0x6c,0x03,0x00,0x00,0xbf,0x07,0x00,0x00,0x15,0x07,0x00,0x00,0x81,0xf9,0xff,0xff,0xd3,0x07,0x00,0x00,0xd5,0xee,0xff,0xff,0xb3,0xfb,0xff,0xff,0x80,0x05,0x00,0x00,0xb4,0xf6,0xff,0xff,0xe6,0xf9,0xff,0xff,0xe5,0x03,0x00,0x00,0xc2,0x07,0x00,0x00,0xbc,0x05,0x00,0x00,0x36,0x06,0x00,0x00,0xc9,0x04,0x00,0x00,0xfb,0xfc,0xff,0xff,0x8e,0xee,0xff,0xff,0x1c,0x0a,0x00,0x00,0x52,0x01,0x00,0x00,0xfa,0xf4,0xff,0xff,0xb5,0x06,0x00,0x00,0x65,0x0d,0x00,0x00,0x82,0xe8,0xff,0xff,0x20,0x03,0x00,0x00,0x2a,0xf7,0xff,0xff,0x60,0xf3,0xff,0xff,0xaf,0x09,0x00,0x00,0xcd,0xfb,0xff,0xff,0x43,0x05,0x00,0x00,0x77,0x04,0x00,0x00,0x70,0x0c,0x00,0x00,0x85,0xf3,0xff,0xff,0x78,0x05,0x00,0x00,0x62,0x06,0x00,0x00,0x8b,0xf8,0xff,0xff,0xd1,0x06,0x00,0x00,0x1b,0x0f,0x00,0x00,0x16,0xfb,0xff,0xff,0x22,0x06,0x00,0x00,0x1b,0xf8,0xff,0xff,0x7a,0x08,0x00,0x00,0xee,0xff,0xff,0xff,0xe4,0xf4,0xff,0xff,0xc0,0xf7,0xff,0xff,0x77,0xff,0xff,0xff,0x5b,0x05,0x00,0x00,0xed,0xf7,0xff,0xff,0x4f,0xfc,0xff,0xff,0x31,0x09,0x00,0x00,0x78,0x03,0x00,0x00,0x5c,0x09,0x00,0x00,0x1d,0x03,0x00,0x00,0x9b,0x0d,0x00,0x00,0xeb,0x12,0x00,0x00,0xdd,0xf8,0xff,0xff,0x4b,0xff,0xff,0xff,0xe7,0xee,0xff,0xff,0xf4,0xf7,0xff,0xff,0x40,0xfe,0xff,0xff,0xc6,0xfa,0xff,0xff,0x2e,0xfa,0xff,0xff,0x1b,0xf1,0xff,0xff,0x72,0x07,0x00,0x00,0xb3,0x09,0x00,0x00,0x77,0xfc,0xff,0xff,0x35,0x08,0x00,0x00,0x47,0x06,0x00,0x00,0x2b,0xf9,0xff,0xff,0x4e,0x0f,0x00,0x00,0x78,0x0a,0x00,0x00,0xf9,0x03,0x00,0x00,0x76,0x0a,0x00,0x00,0xa6,0xfc,0xff,0xff,0xfa,0x03,0x00,0x00,0x0e,0x00,0x00,0x00,0x2c,0xee,0xff,0xff,0x86,0x0b,0x00,0x00,0xba,0x09,0x00,0x00,0x40,0xfb,0xff,0xff,0x11,0xfc,0xff,0xff,0x17,0x06,0x00,0x00,0xf2,0x08,0x00,0x00,0x52,0x0e,0x00,0x00,0xe3,0x18,0x00,0x00,0x92,0x05,0x00,0x00,0x90,0xfb,0xff,0xff,0xc9,0xff,0xff,0xff,0x6c,0xf4,0xff,0xff,0x8e,0xfe,0xff,0xff,0x44,0xf9,0xff,0xff,0xe7,0x05,0x00,0x00,0xb1,0xfc,0xff,0xff,0x7e,0xfb,0xff,0xff,0x3f,0xfe,0xff,0xff,0xbe,0xfa,0xff,0xff,0x00,0x02,0x00,0x00,0xf3,0xfd,0xff,0xff,0x0a,0x0f,0x00,0x00,0xca,0xfc,0xff,0xff,0x10,0x03,0x00,0x00,0x6f,0xfd,0xff,0xff,0x0f,0xf9,0xff,0xff,0x1f,0xf8,0xff,0xff,0x32,0x0a,0x00,0x00,0x70,0x03,0x00,0x00,0x74,0xff,0xff,0xff,0x8d,0x09,0x00,0x00,0x7b,0x0a,0x00,0x00,0x20,0xe9,0xff,0xff,0x2b,0xef,0xff,0xff,0x82,0xfa,0xff,0xff,0xeb,0x12,0x00,0x00,0xd2,0xfc,0xff,0xff,0x88,0x08,0x00,0x00,0xd6,0xfa,0xff,0xff,0x3a,0x08,0x00,0x00,0x8d,0xfe,0xff,0xff,0xbd,0x01,0x00,0x00,0x51,0x09,0x00,0x00,0x98,0x0b,0x00,0x00,0x40,0xfe,0xff,0xff,0x66,0x09,0x00,0x00,0xd4,0xff,0xff,0xff,0x20,0x0c,0x00,0x00,0x9b,0xf8,0xff,0xff,0x6c,0xf8,0xff,0xff,0x6d,0x08,0x00,0x00,0x5c,0x00,0x00,0x00,0xb7,0x0c,0x00,0x00,0x88,0xeb,0xff,0xff,0xe2,0x12,0x00,0x00,0xa7,0x01,0x00,0x00,0xf0,0xfb,0xff,0xff,0xfc,0xfb,0xff,0xff,0x29,0x0e,0x00,0x00,0x89,0xff,0xff,0xff,0xef,0x09,0x00,0x00,0xdb,0xf5,0xff,0xff,0xba,0xec,0xff,0xff,0xc1,0x01,0x00,0x00,0x5a,0x12,0x00,0x00,0xc6,0x04,0x00,0x00,0x26,0x06,0x00,0x00,0x85,0xfb,0xff,0xff,0xf6,0x05,0x00,0x00,0x98,0x0d,0x00,0x00,0x15,0xfe,0xff,0xff,0xc3,0xfc,0xff,0xff,0xa9,0xff,0xff,0xff,0x9d,0xe8,0xff,0xff,0x22,0x03,0x00,0x00,0x77,0xf8,0xff,0xff,0x3b,0xf3,0xff,0xff,0x0c,0x0b,0x00,0x00,0x48,0x07,0x00,0x00,0x20,0xfc,0xff,0xff,0xcd,0xf0,0xff,0xff,0x0b,0x01,0x00,0x00,0xb4,0x04,0x00,0x00,0xb8,0xf3,0xff,0xff,0x65,0xfa,0xff,0xff,0x14,0xfd,0xff,0xff,0x8f,0xf8,0xff,0xff,0x02,0x02,0x00,0x00,0x76,0x0a,0x00,0x00,0xc9,0xeb,0xff,0xff,0x2f,0xf9,0xff,0xff,0xd3,0xf6,0xff,0xff,0xe9,0x0b,0x00,0x00,0x6e,0x06,0x00,0x00,0x04,0x12,0x00,0x00,0x8c,0xfc,0xff,0xff,0xa1,0x09,0x00,0x00,0x8f,0x13,0x00,0x00,0xc1,0xff,0xff,0xff,0x7f,0xfa,0xff,0xff,0x26,0xff,0xff,0xff,0x99,0x05,0x00,0x00,0x81,0xf9,0xff,0xff,0x40,0x00,0x00,0x00,0xf5,0xf9,0xff,0xff,0x6f,0x06,0x00,0x00,0xbf,0xff,0xff,0xff,0x86,0x14,0x00,0x00,0xde,0x09,0x00,0x00,0xed,0x08,0x00,0x00,0xc3,0xf8,0xff,0xff,0x97,0x11,0x00,0x00,0x2c,0x0e,0x00,0x00,0xe1,0x0e,0x00,0x00,0xbe,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1a,0x0b,0x00,0x00,0xef,0xf8,0xff,0xff,0x6b,0xf2,0xff,0xff,0x84,0xfa,0xff,0xff,0xf4,0x03,0x00,0x00,0xa0,0xf2,0xff,0xff,0x09,0xf4,0xff,0xff,0xe5,0x01,0x00,0x00,0xcf,0x07,0x00,0x00,0x03,0x0b,0x00,0x00,0xb6,0xf8,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x26,0xe0,0xe1,0x99,0x03,0x3c,0xd2,0xd9,0xe7,0x1b,0xd9,0xfc,0x13,0xfd,0xc8,0xf4,0xf1,0xd0,0xde,0x12,0x10,0x00,0x1b,0xf6,0xcc,0xb8,0xb2,0x38,0x35,0xf0,0xfa,0x07,0xfe,0xe4,0x1b,0x21,0x2b,0xdd,0xee,0x36,0xe1,0xe5,0xc3,0xfd,0xff,0xfe,0xe7,0xdb,0xeb,0x08,0xc4,0xcf,0xb6,0xe8,0xff,0x1d,0x2c,0xf2,0xe8,0xfd,0x1e,0x51,0x30,0xca,0x11,0x30,0xde,0xb4,0x00,0xf1,0xed,0x25,0xfc,0x8b,0xfd,0x26,0xe2,0xfb,0x9e,0xe3,0xde,0xbb,0x08,0xf7,0xef,0x01,0x0d,0xca,0xde,0x01,0xe6,0x00,0x34,0xfa,0x31,0x0b,0xa5,0xe9,0x02,0x4a,0x28,0xf1,0xaa,0x08,0xdf,0x36,0xce,0xbe,0xf6,0x14,0xf4,0xd9,0x2d,0xbf,0xe0,0x25,0x04,0xeb,0xd0,0xf7,0xca,0xfb,0x12,0x25,0x3b,0x14,0xf2,0xf9,0x08,0xf9,0x00,0xc4,0x3c,0x0f,0x23,0xe8,0xc8,0xec,0x0b,0xd0,0x05,0xbc,0xeb,0xfd,0xb8,0xfb,0x26,0xe7,0xea,0xfb,0x12,0x43,0xf6,0xc2,0x10,0x81,0xcb,0xc3,0x12,0xfe,0x1b,0xfc,0xea,0x12,0x1c,0x04,0xea,0x46,0x12,0x37,0x28,0x12,0x32,0x1a,0xdd,0x23,0xe5,0x01,0xff,0xfa,0x25,0x33,0x03,0x10,0xed,0x0a,0xde,0xff,0x19,0xcf,0xd6,0xdc,0x2c,0xf7,0x09,0x1a,0xf1,0xed,0xde,0xee,0xe8,0x14,0x0e,0x33,0xe8,0xd9,0xa7,0xec,0x45,0x2f,0x06,0xd9,0x19,0xed,0xd0,0x2d,0xcd,0x1d,0xe4,0xc8,0xee,0xc4,0xf2,0xcb,0xff,0xda,0x41,0x4a,0xd5,0xe1,0x15,0xed,0xc4,0x1b,0x11,0xdd,0x24,0x30,0x0a,0x23,0xbe,0xfc,0x23,0xf0,0x56,0xd1,0xdd,0xf4,0xd8,0xd1,0x19,0xd5,0x27,0x2e,0xb0,0xd2,0x23,0xe4,0x30,0x01,0xe8,0xef,0x41,0x23,0x12,0xfd,0xe8,0xd8,0xec,0x4b,0xdd,0x02,0xb9,0xae,0x0f,0xe0,0x14,0xf1,0x18,0x33,0xf8,0xf7,0x43,0xf4,0x27,0xf8,0xed,0x18,0xe0,0x5b,0xc4,0xed,0xde,0x17,0xf0,0x2f,0xc5,0x1a,0xda,0xe6,0xc5,0xfa,0x34,0xe0,0xe6,0xaf,0xc0,0xcf,0x25,0xe4,0xed,0xf4,0xd6,0x18,0x1a,0xbb,0xf4,0xd3,0xa8,0x81,0xef,0xd0,0x27,0x28,0xda,0x45,0xe8,0x4f,0x0e,0xd9,0x20,0x0a,0xdc,0xe0,0x03,0x2a,0xfb,0xd6,0x1a,0x2d,0x42,0xef,0x1e,0x20,0x12,0xda,0x2c,0x02,0xd8,0xb6,0x21,0x56,0xd5,0x9a,0x1d,0x18,0x02,0x1c,0xd3,0xe4,0x07,0x19,0xfe,0xd5,0xfe,0x02,0xf1,0xf2,0x20,0x2f,0x17,0x21,0xc3,0xdf,0x27,0xf6,0x18,0x11,0x9b,0xe4,0x3d,0x03,0xe9,0x31,0x0d,0xce,0x0b,0x0f,0xb0,0xfa,0x08,0xe3,0xf2,0x1e,0x2a,0xff,0x50,0xc1,0x13,0x09,0xf3,0xea,0xe8,0x3f,0x19,0x22,0xc2,0x14,0xfd,0x2c,0x0c,0xb9,0x09,0x30,0x1a,0xf8,0xe7,0xde,0xbc,0x9a,0xfd,0xc0,0x1c,0x22,0xee,0x00,0x30,0xc9,0xf5,0x3d,0xdd,0x32,0x13,0x36,0xc0,0xf1,0x3a,0x16,0x0e,0xd6,0xb1,0x12,0x08,0x03,0x03,0xfa,0xf1,0x24,0xfc,0x1c,0xd5,0x2b,0xd0,0xc2,0xcc,0xe9,0x17,0x30,0x0b,0xb2,0x15,0x6e,0xeb,0xf4,0xf2,0x2a,0xb6,0x2f,0x17,0xd8,0x24,0xf3,0x04,0x04,0xd8,0xc2,0x02,0x2d,0xd9,0xf0,0xe8,0xe0,0x2c,0x06,0x11,0xd4,0xe2,0x1e,0x32,0x2c,0xf1,0xc2,0x10,0xca,0xfa,0xe6,0x35,0xc3,0xee,0x14,0x39,0x29,0x1b,0xf5,0xc8,0x24,0xfa,0x2b,0x08,0x4f,0x37,0xcb,0x1e,0x1a,0xb0,0xf4,0xbd,0xfa,0xe7,0xda,0x06,0x11,0xdd,0xfd,0xee,0xf7,0x04,0xce,0xfe,0x07,0x25,0xd4,0xec,0xf6,0xe7,0x2e,0xec,0x17,0xed,0x1b,0xe7,0xdf,0xf3,0x0d,0xdf,0x16,0x3a,0x6a,0x10,0x1e,0x0f,0x03,0xfa,0xfd,0x09,0xcf,0xde,0xfc,0x08,0xfd,0xf3,0x16,0xe6,0x11,0x04,0x1d,0xf9,0xba,0xf2,0x06,0xfa,0x21,0xae,0x29,0x0f,0xc7,0xed,0x09,0x44,0xfd,0x20,0xe5,0xf5,0x2a,0xcd,0xd6,0xec,0x01,0x27,0xd9,0xff,0x02,0x34,0xde,0x31,0xbc,0xd6,0xfc,0xf5,0xfd,0xe2,0xf4,0xe9,0xbb,0xfc,0x37,0xe9,0x06,0xfc,0xeb,0xdc,0xf5,0xd6,0xe8,0x07,0x23,0x15,0x10,0xe7,0xcb,0xcb,0x2f,0x04,0xe2,0xff,0xf1,0x0d,0x3a,0xfb,0x01,0xf9,0xfe,0x48,0xef,0xf1,0xea,0xc9,0xe4,0xcc,0xd9,0x06,0xdd,0xf1,0xfe,0xdd,0xd0,0x00,0x03,0xce,0xf8,0x25,0xfe,0xf1,0x00,0xd7,0xe7,0x1c,0xce,0x16,0xec,0x26,0xdd,0x23,0xe1,0xf0,0xee,0xd0,0x04,0xb5,0xfc,0xcc,0x49,0xfc,0xf0,0x01,0xff,0xb8,0xfc,0x24,0x16,0xde,0x16,0x14,0x31,0x0a,0xf2,0x1d,0xe4,0x08,0xfd,0xfd,0x00,0xd2,0x1b,0x11,0xf3,0x37,0xee,0x39,0xfc,0xde,0xd6,0x04,0xe4,0xd7,0xc6,0xc8,0x0f,0x25,0x25,0xdb,0x14,0x04,0x1c,0xf1,0xcf,0xab,0x66,0xe4,0x1a,0x03,0xe8,0xed,0x20,0x1a,0x0d,0xfc,0xd3,0xd8,0xc3,0xf3,0x12,0xaa,0x2b,0x0e,0x11,0xea,0xd5,0xfc,0xf0,0xd7,0xe7,0x08,0x33,0xcd,0xec,0xfe,0x10,0xf2,0xf8,0x18,0x17,0x01,0xf8,0xfb,0x33,0xaf,0x21,0xdd,0xef,0x00,0xe7,0x7f,0xf4,0x10,0xf7,0x09,0x13,0xfc,0x06,0x3d,0xbf,0x39,0x9c,0xd6,0xd2,0xf8,0xfa,0xc4,0xdb,0x01,0x2b,0xb8,0xef,0x12,0x15,0xf3,0xd8,0xca,0xe4,0xfc,0xda,0x03,0xaf,0x0b,0xff,0xcf,0xfc,0xca,0xd1,0xcf,0xe5,0x10,0xb0,0xf4,0x26,0xf2,0x04,0x1f,0xcd,0xca,0x02,0x00,0xe4,0xd1,0x2d,0x01,0xe5,0xc1,0xfa,0x82,0xfb,0x0d,0x1e,0x2f,0xfa,0x16,0x02,0xd3,0x12,0xef,0xfc,0x3f,0xfa,0x0c,0x91,0xf5,0x02,0x0f,0xf3,0xb5,0xcc,0xc6,0xc9,0xee,0x24,0xaa,0xc7,0xf8,0xd9,0xc4,0x9d,0xe8,0x0c,0xf1,0x25,0xe6,0x17,0xdf,0xaa,0xf8,0x20,0x02,0xb2,0xca,0xee,0xdf,0x07,0x0d,0x1a,0xda,0xd4,0xa5,0xe5,0xbb,0xb2,0xe0,0x2b,0xe9,0xb1,0x2a,0xdb,0xd1,0xeb,0xf1,0xde,0xe3,0x00,0xbc,0x10,0xd7,0xc1,0x2d,0x9e,0xe8,0xf2,0x09,0xbd,0xe6,0xc0,0xea,0xed,0xde,0x3e,0xf7,0xc2,0xdd,0x24,0xe0,0xf5,0xb1,0x2c,0x1a,0xd7,0x2d,0x2b,0xe6,0xd9,0x0e,0xdc,0x19,0x3e,0x02,0xb9,0xd1,0xec,0xb0,0x03,0x09,0xcc,0x24,0xf0,0xc6,0xf2,0xf5,0x30,0xb5,0x03,0x06,0x1f,0xe2,0xc8,0xb4,0xe8,0xfd,0x38,0xf9,0xfa,0x09,0xf5,0xf4,0xd0,0xec,0xde,0x05,0xed,0xcc,0xf4,0xee,0xde,0xfb,0xd7,0x06,0xba,0x07,0xd3,0xf3,0xeb,0x1a,0x43,0x29,0x04,0x22,0xaa,0xbb,0xea,0xf4,0xbe,0x1d,0xf9,0x11,0xf9,0xeb,0xc4,0x0a,0xa0,0xfd,0xfb,0x16,0xd7,0x12,0x07,0xe8,0x46,0xef,0xed,0x5a,0xd0,0x10,0xd6,0xbc,0x08,0x27,0x08,0x5a,0x00,0xe7,0x1a,0xbb,0x81,0x11,0xd4,0x3f,0xe7,0xfb,0xef,0xce,0xd0,0x21,0xd5,0xfb,0x65,0xf8,0x0f,0x16,0x4f,0xdb,0xf4,0xde,0xfe,0x2c,0xc5,0xf7,0x06,0xd0,0x2d,0xf5,0xe1,0x92,0x27,0x28,0xea,0xfe,0xf3,0x0c,0xc6,0xd9,0xeb,0xd9,0xef,0xf5,0x23,0x00,0x06,0x1b,0x24,0xd1,0xff,0xdf,0x57,0xb7,0x17,0xd8,0x0c,0x12,0x48,0xf0,0xbe,0x18,0x1a,0x58,0xf0,0xc6,0xd3,0xc2,0x1d,0x17,0xfa,0x42,0xdf,0x20,0xe8,0xdb,0xf1,0xdf,0x04,0xcf,0x0b,0xdd,0xe0,0x00,0x5e,0x02,0x68,0xc4,0x0c,0x1b,0x14,0x11,0x35,0xf9,0x4a,0xb3,0xf0,0xb9,0x91,0x1e,0xff,0xe3,0x2f,0x0f,0xf0,0xed,0xd1,0xe9,0x21,0xd5,0x06,0x1f,0xef,0xad,0x18,0xf2,0x99,0xc5,0xea,0xf2,0x71,0xef,0xe5,0x2a,0x2a,0x4e,0x7f,0x40,0x44,0xc9,0x2b,0xde,0x2e,0x0e,0xf3,0x61,0x45,0xd0,0xe7,0x3a,0xac,0x21,0x5a,0xe2,0x0f,0xe5,0x18,0xdf,0xd5,0xd9,0x1e,0xe9,0xe7,0x2d,0x29,0xe5,0xa1,0x06,0x00,0xcc,0x02,0x01,0xc8,0x05,0xd5,0x4f,0xbc,0xee,0xfd,0x5f,0xbf,0x34,0xd1,0x10,0xf1,0xe6,0x64,0xf2,0x1f,0x08,0x3c,0xb6,0x05,0x4d,0x00,0x0c,0xe5,0x0d,0xde,0xf3,0x06,0x7e,0x44,0xc2,0xae,0xe4,0xef,0xd2,0xe9,0xfd,0xff,0x34,0x9a,0xd8,0x28,0x24,0x0a,0xe8,0xe8,0xa2,0xd9,0xed,0x06,0xee,0xd9,0xfc,0xf7,0x0d,0xa6,0xfb,0x2c,0xfd,0xb2,0xcc,0xfc,0xd8,0x13,0xdd,0xde,0xe8,0xe4,0x17,0xee,0x20,0x49,0xd6,0x41,0x30,0xe7,0xfc,0x05,0xdb,0xe0,0x21,0xe4,0xcc,0xcc,0xee,0xcc,0xf2,0xb3,0xed,0x04,0xf8,0xc2,0x72,0x0c,0xea,0x4d,0x31,0x2c,0xb7,0x37,0xdd,0xbe,0xfe,0xe6,0x22,0x20,0xf6,0xea,0x02,0x05,0x65,0xda,0xd1,0xff,0xee,0x34,0x0c,0x92,0x85,0xed,0xde,0x1b,0xd3,0x65,0xe1,0xb2,0x25,0x23,0x02,0xb0,0xbf,0x41,0xb2,0xc7,0xfb,0x10,0x04,0x1b,0xc1,0xe6,0xde,0xaf,0x0d,0x01,0x8f,0xff,0xd8,0xf6,0xa0,0x1d,0xd5,0x03,0xdd,0xc6,0xf8,0x05,0xc6,0x25,0x3f,0x05,0x9f,0xfd,0x1c,0xd0,0x0c,0xc2,0xe0,0x09,0xec,0x1e,0xcf,0x30,0x18,0xdb,0x5a,0x09,0x87,0xda,0xd8,0xc8,0x00,0x47,0x2d,0x09,0x09,0xf0,0x1e,0x0d,0xfa,0xfd,0xc3,0xbd,0xfe,0x4f,0x3b,0x03,0x1e,0xe0,0x8f,0xcb,0x97,0x05,0xbc,0xea,0xec,0x2b,0xfd,0x1b,0xb2,0x04,0x9e,0xe7,0xf3,0x38,0xe7,0x46,0x37,0x24,0x1c,0x44,0xa7,0xeb,0x03,0xd7,0x27,0xed,0x0d,0x14,0xbd,0xbf,0xea,0x11,0x0b,0xd6,0x33,0x2f,0x62,0xdd,0x3e,0xf9,0x3e,0x23,0x10,0xf3,0x30,0xf3,0x3f,0xe2,0xe4,0x14,0xf9,0x3f,0x13,0xd3,0xfe,0xd0,0x27,0x0f,0x81,0xd5,0xf6,0xf9,0xe0,0xec,0x19,0x92,0x50,0x90,0x27,0x48,0xf8,0x13,0xd6,0x90,0x4b,0x07,0x25,0x07,0x08,0xd0,0x23,0xdc,0xfe,0xe9,0xe1,0x12,0x23,0x2f,0x85,0xdd,0xc6,0x32,0x30,0xea,0x28,0x0b,0xd7,0xf5,0xe8,0xa1,0x0f,0xe2,0x18,0x38,0xed,0xda,0x1a,0xe6,0x1f,0xb7,0x06,0xdc,0xe5,0xda,0xbc,0x15,0x83,0x18,0xfa,0xbd,0xc6,0xe7,0xf0,0x53,0xe9,0x07,0x2a,0x38,0xfe,0x16,0xd7,0xe4,0xfa,0x2b,0xfc,0x9b,0x17,0x3b,0x1d,0x13,0xa9,0x16,0xb6,0x57,0xcf,0xff,0x21,0xde,0x45,0x30,0x81,0x0f,0x14,0xe7,0xec,0xf7,0xeb,0xc8,0xb7,0xed,0xda,0xbb,0xa2,0x06,0x03,0xfa,0x59,0xfa,0xf8,0xa5,0xf2,0x06,0xf0,0xd2,0xdb,0x38,0xaf,0xf1,0x29,0x39,0xf9,0xe8,0xfb,0xcf,0x1a,0xe5,0xff,0xab,0xb8,0xf5,0x13,0xba,0xb9,0xe6,0xd6,0xe5,0xeb,0x11,0x9b,0xc4,0x1c,0x36,0x26,0x2c,0x15,0xf7,0x17,0xf9,0xf1,0x0b,0x07,0x9c,0x23,0xfd,0xbd,0xe0,0xb8,0xfb,0x33,0xc9,0x08,0xd7,0xf4,0x29,0xeb,0xf9,0x22,0xe4,0x0f,0xd3,0x4a,0xe3,0x31,0x12,0x3d,0x39,0xfc,0xba,0xe6,0xaf,0xd5,0x1d,0x15,0xe4,0xed,0xfa,0xe1,0xf3,0x65,0xa2,0xc9,0xca,0xf3,0x32,0xc4,0xf8,0xb6,0xf3,0x25,0x2f,0x1e,0xc3,0xc3,0xdb,0x06,0xe0,0x31,0xe7,0x2c,0x3d,0xfd,0xde,0xdd,0x34,0xd1,0x17,0xcf,0x0a,0xc6,0xfe,0x04,0xdd,0x25,0x10,0xde,0x08,0xe9,0x28,0xc8,0xe7,0x25,0x81,0xad,0xe6,0x12,0xfe,0x61,0x19,0xb1,0x05,0x55,0x75,0x29,0xc9,0xe3,0xe7,0xf6,0xc8,0x95,0x01,0x19,0xe1,0x06,0xe2,0x02,0x4a,0x59,0x28,0xe8,0x16,0x19,0x21,0xe8,0xd6,0x89,0x61,0xb7,0xe7,0xcf,0xbb,0xcd,0xe2,0xbe,0x70,0x09,0xf8,0x3b,0xd4,0x15,0xee,0x1a,0x3c,0x15,0x3d,0xff,0xcc,0xb9,0x9e,0x3d,0xcc,0xe9,0x0e,0xf6,0x01,0x94,0xf0,0xf7,0x0c,0xb6,0x14,0x12,0x26,0xe8,0x2c,0xd6,0xce,0xee,0xd7,0x4a,0xae,0x37,0xa9,0x12,0x0c,0x09,0xb0,0x17,0x0b,0xce,0xc6,0x11,0xd6,0x40,0x0e,0x13,0x1e,0x07,0x1a,0xf3,0xdb,0x26,0x12,0xc6,0xf7,0xff,0xf3,0x05,0x2d,0xc9,0xe4,0xf4,0xf8,0x45,0x12,0x03,0x23,0x16,0xc0,0xeb,0x25,0x1a,0xe4,0xf0,0x06,0x07,0x04,0x56,0xaa,0x0f,0x20,0x07,0xba,0x12,0xcb,0x0d,0x1b,0x46,0xd7,0xf1,0x29,0xf6,0xe6,0x3d,0xf5,0xd0,0x2f,0xe6,0x0f,0x96,0xe0,0x0c,0xde,0x34,0xd1,0x1c,0xa5,0xb3,0x03,0x5e,0xd2,0xd5,0xaf,0xf4,0xed,0x25,0xd2,0x0d,0x18,0xdc,0xa4,0x09,0x05,0xcb,0x2e,0x1c,0xe6,0xd0,0xc2,0xba,0x22,0xc6,0xb9,0xf4,0xd2,0x37,0x17,0x4b,0xf7,0x16,0xe8,0xe6,0x0e,0x32,0x5d,0x0c,0x6b,0x3b,0x1d,0x68,0xf7,0xf1,0xd0,0xaa,0x25,0x10,0x0a,0x36,0xe9,0xd0,0x2a,0xf8,0xb5,0x06,0xe6,0x54,0xec,0xe8,0x40,0xfc,0x1d,0xcc,0xd3,0x0b,0x17,0x46,0xc6,0x54,0xf9,0xec,0xee,0x07,0x2f,0xf5,0x2b,0xf7,0x0f,0xeb,0x0d,0xe9,0xe2,0xea,0xdb,0xf0,0xbf,0x24,0xe7,0xd9,0x22,0x11,0xed,0x32,0xff,0xe8,0x3a,0xec,0x0a,0xf6,0xe8,0xc9,0xf1,0xca,0xee,0x1b,0x0d,0xf2,0xf4,0x1a,0x57,0x1a,0x01,0xcc,0xcb,0xb5,0xcc,0x2a,0xcd,0xf1,0xd4,0x24,0x19,0xa6,0xf6,0x2a,0x15,0x3a,0x07,0x28,0xcf,0xdf,0x24,0x20,0x0e,0xe7,0x1e,0xf1,0x00,0x0a,0x4f,0xfb,0x0f,0x19,0x13,0xbd,0xc8,0x1a,0xdb,0x11,0xf8,0x01,0xd1,0x12,0xb8,0x3d,0x31,0x24,0xd9,0xf0,0x2a,0xfb,0xf2,0x32,0xf3,0x07,0x25,0xd6,0x09,0x29,0x2d,0x22,0xe2,0x1a,0x08,0x62,0x1d,0x7f,0x18,0x0e,0x0a,0x40,0x0b,0xd2,0xac,0x31,0x47,0xe9,0xf1,0xf6,0xff,0x25,0x06,0x17,0xce,0xd9,0xc2,0xfe,0xf8,0x26,0x23,0xc0,0xfd,0xca,0xd1,0xbf,0x02,0xe4,0x15,0xf1,0xc7,0xf9,0xeb,0x60,0xdc,0x47,0xe0,0xdf,0xe2,0x16,0xf5,0xe4,0xda,0x42,0x51,0x37,0xf0,0xeb,0xdc,0x27,0xb1,0x1a,0xf8,0xeb,0xb9,0xee,0x33,0xef,0xdd,0x90,0xd3,0x22,0xc8,0xb8,0xe5,0xf5,0x13,0x06,0x07,0xda,0xfa,0x04,0xf0,0xaf,0x35,0xd0,0xd0,0x14,0x08,0x2d,0xf6,0xed,0x27,0x27,0xf8,0xcb,0x23,0xfb,0x07,0x2a,0x27,0x0c,0xfc,0xd9,0xd4,0x1f,0xde,0x0b,0x0d,0x12,0xd1,0x08,0x2b,0xd1,0x11,0x03,0xf3,0x04,0x45,0xff,0xd9,0xef,0x19,0x01,0xec,0x3d,0xf3,0x1a,0xb7,0xd8,0xc2,0xca,0x18,0x27,0x01,0x29,0x09,0xd8,0x14,0xda,0x11,0x2d,0x63,0x40,0xd6,0xd0,0xd4,0xf7,0x1d,0xde,0xe1,0xdc,0xa6,0x24,0x13,0xbb,0xe4,0x27,0x3d,0xf1,0xd4,0x44,0xd6,0x17,0xc4,0xc5,0xf8,0xda,0xc9,0x4f,0xe2,0x13,0x10,0xf8,0xd0,0x23,0xdc,0xf2,0x26,0x61,0x1f,0x02,0xd1,0xe0,0xe6,0xfb,0xfe,0x1d,0xac,0xfb,0xbd,0x0d,0x08,0xe0,0xb6,0x2f,0x11,0xb5,0x04,0x4d,0xc0,0xc9,0xdf,0xd8,0xfe,0xd5,0xbb,0xbf,0x15,0x0f,0xf4,0xf8,0xd5,0xa2,0xda,0xbb,0xd0,0xae,0xb9,0xec,0x07,0xe2,0x23,0x16,0x21,0x0a,0x42,0xae,0xba,0xb1,0xea,0x1b,0x6b,0x31,0xb1,0x0a,0x17,0x3a,0xdc,0xae,0x12,0x03,0xcf,0xd2,0xf6,0xd4,0xdf,0x3a,0xb6,0xf8,0x2d,0xe2,0xa4,0xe3,0xf7,0xfb,0xd7,0x0b,0x9d,0xde,0xd7,0xc9,0x56,0xee,0x98,0x1c,0x08,0xab,0xc2,0x59,0xa3,0x30,0x3f,0x2d,0xd0,0x08,0x1e,0xed,0xdc,0x1e,0xc0,0x64,0xc9,0x4e,0xd7,0xe7,0xeb,0xe2,0xe8,0x20,0xe2,0xcd,0xfc,0x37,0xc9,0x5a,0x1f,0x23,0x14,0x0c,0xee,0xe7,0x06,0xc8,0xc7,0x12,0x9a,0xfa,0xd9,0xff,0xe9,0x3c,0xff,0xff,0x7f,0xc3,0xe8,0xe3,0x01,0xa0,0x19,0x3e,0x16,0xce,0x1b,0xe8,0x27,0x52,0xec,0x49,0xf5,0xe9,0x3c,0xc3,0xab,0x3f,0xfc,0x02,0x05,0xbe,0x49,0x08,0xd7,0x20,0xea,0x0f,0x43,0xd3,0xf6,0x03,0x43,0x2f,0x07,0x0e,0xdb,0xb5,0x1c,0x3e,0x19,0xbe,0xe8,0xe9,0x12,0xed,0xd5,0x08,0x02,0xf6,0xf9,0x01,0xde,0x01,0xcf,0xe6,0x83,0x35,0x9d,0xc9,0xbf,0x8a,0xbe,0xf2,0xf4,0x11,0xd1,0x0e,0xa4,0xdd,0x0d,0xb4,0xd2,0x95,0xf4,0xb4,0x2a,0xa3,0xc9,0xe0,0x25,0xbd,0xf9,0xaf,0xba,0x2f,0xf4,0xeb,0x03,0xf3,0x37,0xd9,0xaf,0xd7,0x0c,0xcb,0x19,0xd1,0x0c,0xeb,0x1e,0x0a,0x2b,0xf1,0x16,0x0f,0x11,0xea,0x00,0x81,0xfe,0xc5,0x31,0xe8,0x8c,0xb9,0x21,0xfe,0xd8,0xfa,0x9e,0xf9,0x23,0x16,0x15,0x1c,0x10,0xe3,0xf2,0x23,0x15,0xe3,0x0e,0xdf,0x47,0x42,0x2e,0x28,0x0d,0xc1,0x28,0x25,0xe6,0xd2,0xe9,0xe9,0xe2,0xf4,0xef,0x38,0x04,0xc6,0x0d,0x25,0xff,0xc7,0x15,0xe2,0x06,0xe5,0x0b,0x99,0xb8,0x2c,0xf6,0x56,0x19,0x14,0x1b,0x05,0x07,0xec,0xed,0xfe,0x4a,0x0b,0x18,0x29,0xeb,0xda,0xd8,0x68,0xe0,0xfe,0xec,0xc1,0x01,0xd8,0xe7,0x48,0x12,0x1f,0x1c,0x33,0x05,0xb5,0x16,0x08,0x90,0xc7,0x3b,0xc8,0xf1,0x16,0x26,0xa2,0xb9,0xc0,0x0b,0xba,0xe4,0xd9,0x0f,0xb3,0x17,0xdc,0xea,0x2c,0xf8,0xe7,0x18,0xec,0x1b,0xaa,0xf3,0x50,0x0a,0x34,0x30,0xca,0xf0,0xfe,0xb3,0x3b,0x22,0xde,0x20,0x14,0x0f,0x41,0xe9,0x29,0xf9,0x2a,0x0b,0x05,0x34,0x00,0xa9,0xff,0x06,0xdf,0x3f,0xed,0x37,0xfe,0x07,0xc9,0x12,0xfd,0x02,0x42,0xbc,0xe7,0xc7,0x03,0xdc,0xe6,0x1d,0xd8,0x34,0x07,0xa0,0xd9,0xf6,0xe6,0xe5,0xb0,0xe7,0xa4,0xfc,0x02,0xed,0xf0,0xaa,0xed,0xff,0x05,0xca,0x3a,0xc7,0x10,0xed,0x1d,0x48,0xe8,0x16,0xe1,0xdc,0x13,0x24,0xfa,0x2a,0x3d,0xdd,0x0a,0xeb,0xe0,0x22,0xe5,0x03,0xe9,0x2a,0x06,0x2e,0x3d,0x07,0xd4,0x05,0x55,0xea,0x38,0x12,0xcd,0xff,0xb7,0x11,0x06,0xb2,0x12,0xb7,0xc6,0x09,0x06,0xc6,0xfe,0xdb,0xe5,0xbc,0xd3,0xcc,0x06,0xe9,0xd1,0xdf,0xda,0x2f,0x2f,0xf8,0x10,0xd8,0xc4,0x04,0xf8,0xe7,0x40,0xcc,0xbe,0xc6,0xe7,0xea,0xd6,0xd3,0xff,0xed,0x01,0xec,0x00,0x05,0x16,0xfe,0xc6,0xe6,0x14,0xea,0xd7,0xcc,0xd4,0xfc,0x4e,0xbf,0xd6,0xce,0x35,0xbc,0x29,0xed,0x12,0xcc,0xf5,0x0f,0xee,0xc4,0xd0,0xaf,0x0b,0x1d,0xfa,0xbb,0xfc,0xde,0x2f,0x11,0xf7,0x36,0xe2,0xdc,0x02,0xfd,0x05,0xfe,0xf4,0x1c,0xd5,0x24,0x28,0xca,0x14,0xf7,0xdf,0x0a,0xe0,0x0f,0x7f,0xbe,0x2e,0xf7,0x0f,0x0d,0xd5,0xf6,0x12,0xdc,0x02,0x16,0x03,0xc8,0xe8,0xfe,0xe1,0xf9,0xc7,0xfa,0xa9,0x1c,0x20,0x18,0xe2,0xde,0x11,0xf6,0xbf,0xd3,0xdc,0x09,0x20,0xe4,0x06,0xdb,0x49,0xd2,0xcf,0xd8,0xf7,0xea,0xee,0xdd,0xf6,0x03,0xc5,0xd8,0xf8,0xd5,0xf1,0xbe,0x0e,0x14,0xfb,0x50,0x28,0x17,0xfa,0x10,0xc9,0xda,0xff,0xdb,0x14,0x03,0xf1,0xd8,0x4e,0x1c,0x00,0xfb,0xef,0xbb,0x0b,0xf9,0xcd,0xf9,0xd9,0xff,0x12,0xf1,0x16,0xea,0xf6,0x5b,0xd7,0xf6,0xe7,0xd1,0x9f,0x97,0x0f,0x59,0xfe,0xb6,0xdc,0x84,0xa7,0x1c,0x19,0x0a,0xba,0xe9,0x05,0xfd,0x30,0xc8,0xc5,0xd1,0x90,0xc1,0xda,0x07,0x09,0x14,0x40,0xf7,0xe3,0xd6,0x32,0xe0,0x0d,0xda,0x59,0xf9,0xf5,0xd1,0xff,0xf9,0xb8,0x88,0xfe,0x34,0xff,0xdd,0xf3,0x14,0x30,0x25,0x1a,0x14,0x23,0x51,0xc3,0xfa,0x0c,0x81,0x29,0x24,0x89,0x18,0x52,0x44,0xa0,0x1a,0xfd,0xf3,0xfa,0x66,0x1a,0x27,0xd1,0xd6,0xa8,0xcf,0xf5,0xbb,0xeb,0xd7,0x1c,0xcb,0x71,0xd1,0x10,0xd9,0x38,0x40,0x24,0x0c,0x2f,0xed,0x22,0x1f,0xd8,0xdb,0x5b,0xf5,0xe2,0x87,0xf1,0x04,0xcb,0xd6,0x05,0x17,0xef,0x4e,0xe0,0x8b,0xa5,0x3a,0xf0,0xfc,0xff,0x62,0x14,0x18,0xcb,0xa1,0x03,0x1a,0x0f,0x2b,0x0a,0x06,0x27,0x23,0x1f,0xf0,0x50,0xd7,0x09,0xb2,0x05,0xeb,0x42,0x16,0x43,0xea,0xb0,0x08,0x0f,0x5a,0x91,0xdc,0xdc,0x54,0xa6,0xc4,0xdc,0xed,0x1d,0xa3,0x33,0xf4,0xff,0xd8,0xef,0x10,0xf3,0x35,0xd0,0x24,0xff,0x25,0xf3,0x07,0xe9,0xf7,0x44,0xf3,0x03,0x20,0x09,0xc4,0x48,0x36,0x69,0x31,0x29,0xb2,0xea,0x0c,0xc5,0xbe,0x09,0x10,0xfd,0xb7,0x93,0x1d,0x1d,0x04,0xf4,0x47,0xea,0x19,0xcf,0xd0,0x1d,0xd3,0x04,0x1c,0xf0,0x66,0x12,0x03,0xad,0xcf,0xc1,0xdf,0xb0,0x08,0xee,0xf6,0xf1,0xef,0xcf,0xfe,0xfb,0xe0,0x06,0x28,0xc8,0x10,0xe5,0xac,0xa3,0xd4,0xce,0x22,0xe6,0xa8,0x1c,0x3b,0x3b,0x14,0xe8,0x0c,0xf4,0xb3,0xee,0x1d,0x92,0x27,0x57,0x04,0x27,0xf3,0x4c,0xdb,0xfa,0xf5,0xc4,0xd5,0xc7,0xdf,0xf5,0xd3,0x14,0xd4,0xd6,0xf3,0x42,0xed,0x15,0xf1,0xee,0xd3,0x5d,0xed,0xc6,0x6b,0x08,0xd3,0xdc,0x88,0xd4,0xe2,0xf6,0xc7,0xfb,0xd9,0xf7,0xc5,0x2d,0xd4,0xec,0xf8,0xd6,0x4a,0xff,0xc6,0x0a,0xf7,0xdc,0xc3,0xcf,0x13,0x0f,0x01,0xe6,0x08,0xfa,0xfd,0x03,0x07,0xf4,0x0d,0xf5,0x37,0xc2,0xc1,0xf4,0xf7,0x2d,0x01,0x2d,0x15,0xfc,0xc5,0x09,0x3b,0xf1,0xac,0x3c,0x05,0xe2,0xd3,0x17,0xfd,0xd5,0xe1,0x2f,0x13,0x17,0x1a,0xec,0xf0,0xfb,0xf0,0xc3,0x2c,0x01,0x5b,0xf5,0x05,0x31,0x53,0xc1,0xc9,0xf4,0x1c,0xef,0xef,0xd1,0x19,0xf7,0x06,0x1d,0x11,0xdb,0x04,0x1d,0xbc,0xd1,0xfb,0x0c,0x09,0x25,0xf8,0x33,0x3c,0x0c,0x27,0xf1,0x12,0xbd,0x1d,0xdf,0x2e,0x7f,0xde,0x17,0x03,0xcf,0xfd,0x06,0xf0,0xe3,0xe7,0xfd,0xc5,0xfa,0x1e,0xd0,0x23,0x32,0x10,0x14,0x2d,0xe7,0x14,0xf6,0x19,0xdb,0x31,0x14,0xe0,0x02,0xdc,0x05,0xf8,0xf3,0x0a,0xe3,0xe5,0xbe,0x17,0xcf,0x3a,0xc8,0xd4,0xc5,0xdf,0x10,0xc1,0xf7,0xf0,0xbd,0xf7,0xf1,0xc3,0xd3,0xb7,0x17,0xe0,0x22,0xe6,0x38,0xcc,0x00,0xba,0xd0,0x23,0xfe,0xe4,0x17,0x1a,0xed,0x28,0xee,0x09,0xee,0x4e,0xc8,0xfa,0x34,0xf5,0x32,0xe9,0x1d,0x14,0x02,0xf7,0x23,0xfb,0xf7,0x0a,0x04,0xf6,0xde,0x8e,0xdb,0xe8,0x4d,0x1c,0xf8,0xf6,0x03,0x53,0xf2,0x11,0xc1,0xd6,0xe3,0x28,0xba,0xde,0xff,0xcc,0xd1,0x68,0xfb,0xd5,0xd9,0xe7,0xf8,0xfe,0xec,0x3e,0xea,0xc5,0x01,0xed,0xe4,0x2d,0xd8,0xd7,0xd5,0xed,0x17,0xe9,0x25,0xfe,0xdf,0xcc,0x01,0xe3,0x0c,0xf9,0xb7,0xb8,0xfc,0xf7,0x89,0x1c,0x13,0xab,0x14,0xc6,0xde,0x1d,0xb0,0x3c,0xb0,0x05,0x04,0x0a,0x18,0x16,0xff,0xda,0xf7,0xe1,0xe6,0x17,0xee,0x4e,0x9d,0x45,0xd0,0xf4,0x3b,0xe9,0x0a,0x14,0xbe,0x04,0x23,0x38,0x0d,0x2a,0xf9,0xe9,0x29,0xee,0xc4,0xf8,0x0c,0xaa,0x13,0xb4,0x4c,0xe2,0xf5,0x26,0xf6,0x0c,0x26,0x06,0xdc,0xf0,0xde,0xf1,0xff,0x1b,0xb3,0xd6,0xf5,0xf2,0x2d,0xdc,0x28,0x45,0x0e,0x18,0xfb,0x27,0xd2,0x39,0x0e,0x9d,0x48,0x2c,0xd0,0x06,0x3c,0x3a,0x5b,0xa6,0xcf,0xea,0x7f,0xcd,0x31,0xe4,0x1a,0x1a,0xf9,0x05,0xaa,0xca,0x11,0xee,0x40,0xaf,0xce,0xc8,0x3b,0x1a,0x4c,0xd8,0x32,0x37,0xc9,0xfb,0x95,0xf6,0x05,0xdc,0xb5,0x1b,0xf2,0x4b,0xf1,0x03,0x0b,0x3b,0x29,0xd0,0x24,0x40,0x2e,0xdd,0xca,0xc5,0xfe,0x07,0x0b,0xe8,0x99,0xc8,0x09,0xd8,0xdd,0x63,0x50,0xf5,0x3e,0x47,0xb9,0xea,0xf0,0xed,0x40,0xfe,0x4d,0x0e,0xce,0xfc,0xed,0xbf,0xde,0xeb,0x01,0x13,0x01,0xcd,0x44,0xdb,0x3e,0xc0,0x07,0xc0,0x39,0x0d,0xfb,0xf2,0x04,0xa8,0xbc,0xf3,0x2d,0xc3,0x3c,0x01,0x41,0x1b,0x1a,0xf0,0x65,0x14,0x0c,0xf5,0x01,0x5e,0x04,0xb4,0xf8,0x3b,0x19,0x13,0x19,0xbe,0xa0,0x12,0xe2,0x0f,0xab,0xcf,0xb0,0xd5,0xf2,0x12,0xf0,0x18,0x1d,0xa0,0x07,0xe1,0xf6,0x08,0x08,0x0a,0x0f,0x57,0x00,0xd9,0x1f,0x88,0xf5,0x1f,0xd7,0x07,0x1e,0xe3,0xe3,0x00,0x12,0xe4,0x08,0xf2,0x11,0x29,0xd3,0x98,0xd0,0xed,0xd9,0xe1,0x24,0x43,0xfa,0xd3,0x0e,0xed,0xc2,0x20,0xaf,0xfc,0xaf,0x1b,0xf9,0xb8,0xbd,0xb2,0xac,0xf1,0x05,0xf6,0xc5,0x2a,0x16,0xa0,0x2d,0xc9,0x20,0xff,0x16,0x22,0x06,0xd5,0xea,0xf9,0xa2,0x1e,0xe8,0xb1,0x1f,0xd8,0xca,0xc7,0xf4,0xa3,0x24,0x0b,0xff,0xdf,0x03,0x10,0xd6,0xf3,0xcf,0xbe,0x25,0x18,0x17,0x41,0x04,0x01,0x41,0x40,0xdf,0xe8,0xb3,0x29,0x0f,0x15,0x64,0xca,0x1b,0x2f,0xf2,0x04,0xe4,0xd3,0x51,0xf2,0x48,0x33,0x06,0x27,0xbc,0x1e,0x26,0x0f,0x10,0xc5,0xd3,0x0a,0xe2,0xc1,0x3b,0xd1,0x9f,0xed,0xc4,0xec,0x45,0xd4,0x08,0x1b,0xf3,0xf9,0xf6,0xa4,0xd0,0xf8,0xdd,0xd7,0x24,0xf2,0xc4,0xf8,0xe0,0xe8,0x1a,0x13,0x3d,0x07,0x34,0x1e,0x98,0x0b,0x1a,0xb8,0xdc,0xf3,0x10,0x79,0xca,0xfe,0x04,0xf7,0x44,0xb0,0x27,0x31,0x23,0xf2,0xed,0x14,0xd2,0xe1,0xf8,0xfe,0xf7,0xf6,0x9e,0xf8,0xe5,0xe4,0x35,0xe4,0x24,0xc7,0x84,0xf4,0xe6,0x3a,0x01,0xcc,0xc5,0xe5,0xd5,0xd9,0x02,0x3f,0x05,0xef,0x42,0xba,0x23,0xdd,0x13,0x37,0x42,0xce,0xff,0xd1,0xfe,0xe8,0x28,0xd5,0xc2,0x14,0xe2,0x17,0xbf,0x10,0x0a,0xe9,0x0f,0xdd,0x7f,0x44,0x58,0xe3,0x28,0xdf,0x49,0x3f,0xe2,0xd4,0x2d,0x2f,0x07,0xc1,0x22,0xf3,0xc2,0x00,0xda,0x99,0xff,0xea,0xb5,0xf4,0x35,0xbe,0xf1,0xf3,0x12,0xf2,0x1e,0x2e,0xfd,0xf0,0xb2,0xcf,0xf7,0xb4,0x3f,0x8a,0xd8,0xd4,0xe8,0xf4,0x14,0xc6,0x08,0xf8,0xf4,0x0b,0xdd,0xf1,0xef,0x07,0x07,0xf5,0x08,0x15,0xe0,0xdd,0x37,0x01,0xf8,0xcd,0xac,0x19,0x2e,0xd5,0x14,0x1f,0xaa,0x15,0x0d,0x29,0x1b,0x28,0xd2,0xe0,0xe6,0x19,0x29,0xd7,0x16,0x1e,0x1c,0x5b,0x40,0x2e,0x18,0x36,0x02,0x07,0x58,0x31,0x81,0xb7,0x20,0xd4,0x01,0xe2,0xaf,0x44,0xfd,0x38,0x98,0x46,0xa7,0x50,0xf4,0xe0,0x31,0xf4,0xd9,0x24,0x26,0x17,0x59,0x30,0xaa,0xc3,0xf5,0xf2,0xf2,0xe6,0x32,0xfe,0x45,0x38,0xa1,0xc8,0xee,0xf2,0xce,0x10,0xc5,0x0f,0xc1,0xcf,0x08,0xd9,0x3b,0x2a,0xb8,0x3b,0x0d,0xff,0x3d,0x08,0x12,0x37,0xed,0xae,0x1d,0x0d,0xd3,0xa8,0x0c,0x19,0xa6,0x1a,0x07,0xe5,0xdc,0xf2,0xd6,0x67,0x1d,0xed,0x44,0xe3,0x1e,0xf5,0xcf,0x06,0xfa,0xff,0xc3,0x26,0xe0,0xe2,0xd2,0xf5,0x01,0x38,0xf8,0x20,0x47,0xc9,0xfe,0x2f,0xb0,0xcc,0xf2,0x22,0x60,0x95,0x0f,0x26,0xa1,0x00,0xdd,0xfc,0xf2,0xff,0xd1,0x0e,0xe5,0x08,0xc6,0xdc,0x1a,0xec,0x35,0xdc,0xe5,0x01,0xba,0xdb,0xf3,0xde,0x07,0x26,0x0b,0xf0,0x02,0x10,0x08,0xe1,0x1b,0x0c,0xac,0xc9,0xfb,0xef,0xd8,0x92,0x07,0x1b,0x38,0xf3,0xdc,0xb6,0xc4,0xe5,0x13,0xc0,0xc4,0x3e,0xd3,0xdd,0xf0,0xdd,0xdc,0x01,0x1a,0xd6,0x15,0x9a,0x19,0x19,0xe7,0x32,0xb3,0x0a,0xe4,0x04,0xc9,0x1b,0x05,0xf9,0xdd,0xd7,0xf0,0x09,0x02,0xb1,0xaf,0xad,0xca,0xfd,0x10,0x90,0x1b,0xc8,0x37,0x05,0xcf,0xb2,0x97,0xec,0xf4,0x38,0xd6,0xeb,0xe2,0xf0,0x0c,0x53,0x1e,0xec,0xbc,0x2d,0x27,0xa9,0xec,0xe1,0xff,0x8a,0xe0,0xf9,0x07,0xcc,0xda,0xd6,0xdf,0x00,0xec,0xef,0x01,0x0d,0x00,0xed,0xe8,0xe6,0xd4,0x12,0x0f,0xfa,0xcb,0xfe,0x31,0xdc,0x30,0xce,0x17,0x02,0xd0,0xf1,0xe2,0xfb,0xff,0xe3,0x14,0xf7,0x0c,0x07,0x1f,0xf4,0xd4,0xd2,0xf4,0x11,0x06,0x1d,0x05,0xd6,0x37,0xeb,0x10,0xd9,0xfa,0xd4,0xfe,0x6d,0x18,0xf8,0xf9,0x23,0xcc,0x35,0xce,0x07,0xeb,0xf2,0xf6,0x1e,0x12,0x06,0x0e,0x07,0x05,0xe9,0x01,0x06,0x36,0xfb,0x4c,0xd9,0x07,0xd7,0x22,0xc9,0xcd,0xff,0x0a,0x07,0xfa,0x3d,0xd4,0x08,0xbd,0xf1,0x01,0x06,0xd8,0xdf,0x07,0x0f,0xeb,0xe7,0x7b,0xf2,0xd7,0xdd,0xf0,0xf3,0x1e,0x15,0x1d,0xf9,0xf1,0xf1,0x1f,0xd1,0xc5,0xe7,0xea,0xcb,0xe9,0xd1,0xed,0xf3,0x14,0x05,0xee,0x1f,0x46,0xf9,0xeb,0x1e,0xc3,0xea,0x03,0x10,0xc2,0xe0,0xbe,0x13,0xe3,0x0e,0xe4,0xdd,0x54,0x12,0x16,0x07,0x1e,0x04,0x2d,0x19,0xf7,0xf2,0x12,0xed,0x1a,0xda,0x21,0xf6,0xfd,0x11,0xeb,0x02,0xfe,0x04,0xef,0xe3,0x07,0xf9,0x33,0xf0,0xe6,0xfc,0x1f,0x0d,0x2f,0x02,0x12,0x2c,0x22,0x00,0x1e,0x01,0x1c,0xf7,0x00,0xdd,0xf3,0x03,0xf3,0x0b,0x02,0xf3,0xc5,0x13,0xd8,0x1f,0xf7,0xe2,0xf5,0x13,0xfe,0xd3,0x22,0xfa,0x16,0x07,0x01,0x05,0x1e,0xf3,0xfd,0xcd,0x14,0x7f,0x25,0xf8,0x50,0xec,0xcc,0xef,0xea,0xda,0xeb,0x1f,0xfa,0xe5,0x12,0xd1,0x0f,0xec,0xc6,0xd8,0x36,0x14,0x16,0x13,0x03,0xf8,0x04,0xf8,0xf6,0xae,0xe3,0xeb,0x05,0xd3,0x01,0xf4,0xf0,0x07,0xf7,0x2a,0xd2,0xf4,0xe7,0xee,0x0a,0xf9,0x38,0x47,0xab,0xc3,0xad,0xd0,0xc9,0xb8,0xc6,0xd7,0xdd,0xfb,0xe3,0x28,0xcf,0xb6,0xfb,0x0d,0x11,0x05,0xd1,0xdb,0xf2,0xe9,0xf1,0x1f,0xf4,0xe4,0xfa,0xe3,0xeb,0xc2,0x87,0xef,0xf8,0x1d,0xec,0x08,0x41,0xaf,0xff,0xee,0x1a,0x13,0x00,0xed,0x2b,0x1f,0x00,0x3a,0xd1,0x12,0x0b,0xfe,0xff,0xf8,0x13,0x77,0x17,0x35,0x90,0xe0,0x0c,0x06,0x62,0x11,0x68,0xad,0x17,0xd2,0x1e,0x06,0xd8,0xe8,0x11,0xf5,0x14,0xf1,0xd0,0xbd,0xcb,0xfd,0x17,0x81,0xeb,0xcd,0xc1,0x01,0xda,0xae,0x15,0xd1,0x58,0xe3,0x5e,0x07,0xa0,0xf1,0xf6,0x05,0x03,0xd9,0xc2,0xe5,0xb7,0xeb,0xfc,0xc1,0xe5,0x0e,0x0e,0xc0,0xd4,0xc1,0x0e,0x1b,0x1d,0xf7,0xe8,0x07,0xca,0xd9,0xf7,0xcb,0x1a,0xea,0xd5,0xec,0x0f,0xe1,0xfb,0xc0,0xd5,0xe7,0xe8,0x2f,0x06,0xc2,0xc8,0x0d,0xd6,0xe9,0xb3,0x11,0x14,0xd4,0x2a,0xb6,0x00,0x11,0xbf,0x1a,0xb4,0xfc,0x37,0xc8,0xc4,0xba,0xab,0x4f,0x24,0xcd,0x17,0x29,0xca,0xc4,0xcf,0x31,0xe7,0xe7,0x24,0xe4,0x19,0xe6,0xdf,0xe1,0xeb,0x2d,0x09,0xfa,0xe4,0xbd,0xea,0x03,0x51,0xff,0x13,0xbd,0xb2,0x1e,0x2b,0xd0,0xcd,0xe9,0x1e,0x0b,0x09,0x1f,0xd0,0x2f,0x0e,0x07,0x1a,0xd5,0x09,0x17,0xbf,0xc6,0x23,0xcf,0x0d,0x21,0x90,0x25,0x0b,0x06,0x12,0xbd,0xaf,0x24,0xd8,0x1c,0x08,0x1f,0x27,0x0f,0xf5,0x1d,0xfa,0xcc,0x30,0x27,0xdf,0xe2,0x35,0x0d,0xce,0xfb,0x0f,0x2f,0xf7,0x9e,0x38,0xec,0xf8,0xde,0xed,0xf7,0xfa,0xf8,0x51,0xdc,0x10,0x07,0xe0,0x16,0xf1,0xc8,0xfa,0x18,0x29,0x14,0xce,0xeb,0xff,0x04,0xde,0xf0,0x03,0x9d,0xf5,0x92,0x2a,0x29,0xe5,0xe0,0x1c,0xf5,0x21,0x67,0x0a,0x23,0xed,0x13,0xd2,0x28,0x23,0xe7,0xbd,0xf9,0xfd,0x10,0x3b,0x14,0xe5,0x0d,0x07,0x31,0x8c,0x13,0xfa,0x49,0x9a,0xf8,0x0e,0x22,0xd3,0xd6,0xe4,0x46,0x01,0x18,0xfe,0x0d,0xd9,0x21,0x14,0x1f,0xde,0x90,0xce,0xfb,0xe9,0xf0,0x18,0xfb,0xdc,0x28,0x02,0xfc,0x0b,0x06,0xf6,0xf1,0x96,0x15,0x45,0xc6,0xd6,0x12,0x3f,0xf6,0xeb,0xd8,0xda,0xf4,0x35,0x18,0xce,0xc3,0xeb,0xa1,0x93,0x34,0xf9,0x14,0x81,0x25,0xdf,0x2a,0xe5,0xd2,0x1c,0x24,0xe4,0x29,0x28,0xe8,0xdc,0x11,0xc3,0xe8,0x10,0xee,0xb8,0xf8,0xd0,0x2d,0xf0,0x4a,0x92,0x2d,0x01,0xf0,0xd0,0xf2,0xce,0x0f,0x18,0xe5,0xbc,0xbc,0x2e,0x48,0xf9,0xeb,0x35,0x95,0x2f,0xef,0xd9,0x1e,0xe3,0x22,0xca,0xd5,0x13,0x31,0xcc,0xa5,0xbf,0xaf,0xf4,0xdb,0x2f,0x50,0x0b,0x2d,0x07,0x3f,0x54,0x1a,0x31,0xf5,0x1a,0xf8,0xdc,0xee,0xe2,0x20,0xcb,0x08,0x01,0xfe,0xae,0xd5,0x30,0xec,0xc2,0xbd,0xd0,0x3f,0xdd,0x29,0x14,0xf2,0x3d,0xf0,0xe2,0x1e,0xfe,0xaa,0x20,0x05,0x09,0xea,0x2a,0xfb,0xee,0xd8,0x07,0xe8,0x3a,0xf0,0x36,0xed,0xda,0x1a,0x17,0x0c,0x90,0x0b,0x07,0x17,0xcc,0xaa,0x57,0xda,0xff,0x37,0x14,0xf6,0x4a,0xd8,0xe8,0x3d,0xef,0x0c,0x87,0x35,0xb3,0x01,0x43,0xfb,0x19,0x02,0xd6,0x4e,0x02,0x37,0x01,0x04,0x23,0xb9,0xcc,0x83,0x4d,0xe6,0xe4,0xf1,0x4d,0xd1,0xf5,0xd1,0xcf,0xe3,0x0f,0xd5,0x05,0x1c,0xd8,0x03,0x2e,0xf3,0xd6,0xfb,0x15,0x09,0xdd,0xc2,0xd6,0x0b,0x24,0xe2,0x1d,0xc1,0xdd,0xfa,0xee,0xc5,0x30,0xda,0x15,0xe3,0xf5,0x28,0x12,0xeb,0xce,0x96,0xd4,0x47,0x1d,0x10,0xc3,0xd6,0x00,0xf5,0xf7,0xd5,0x10,0xe3,0x0d,0xd8,0x08,0xee,0x28,0x0a,0x23,0xa6,0x0f,0xdf,0x11,0x3a,0x1d,0x25,0x17,0x4a,0x43,0xea,0xef,0xfd,0xcb,0xfb,0xce,0x16,0x19,0x03,0xf6,0x47,0xdf,0xd5,0xd1,0x08,0x0a,0xe8,0x06,0x11,0x30,0xdf,0xdb,0x14,0x19,0x1e,0x7f,0xb2,0xe7,0x11,0xe1,0xfc,0xf4,0xf9,0xdd,0x09,0x1e,0xfa,0xf0,0xee,0xd4,0xec,0x0e,0xb4,0xe0,0xea,0x32,0xbc,0xff,0xcb,0x15,0x4d,0x3e,0xd5,0x05,0x12,0x0c,0x37,0x91,0xe3,0x2d,0x10,0xdb,0xe1,0x40,0xf7,0xf2,0xf3,0x11,0x70,0x07,0x10,0xe7,0xcd,0xd1,0x05,0x0e,0x9f,0xc9,0x1d,0xf5,0xf6,0xe6,0xfb,0xe7,0x2a,0xde,0x08,0xff,0xc5,0xd0,0xd4,0x1e,0xe8,0xe1,0xd7,0x9e,0x0a,0xd7,0x5f,0xf5,0xec,0xd7,0xe5,0x2e,0xea,0xd6,0x0f,0xea,0xe7,0xd9,0xf3,0x0f,0xbe,0x1a,0xea,0xdf,0xce,0xe0,0xe3,0xe7,0x12,0x02,0x16,0xff,0x2e,0xe2,0x39,0x56,0xb8,0xdb,0x24,0xfe,0x0f,0x26,0xda,0x33,0xe9,0x19,0xee,0x0f,0x2a,0xe8,0xdf,0x1e,0xff,0xb6,0xed,0x24,0xa7,0x54,0x05,0xfe,0x0f,0xc1,0xfe,0x09,0xc7,0x10,0x1c,0xe5,0xfb,0x24,0xf9,0x1d,0x31,0xe0,0xca,0x16,0xec,0xe9,0x09,0x55,0xc1,0xbf,0xfc,0x05,0xf4,0xf2,0xe1,0xe9,0x01,0xf7,0x47,0x3d,0x1f,0xcc,0x28,0x00,0xc9,0xfc,0xec,0x41,0xce,0x41,0xf7,0xc9,0xd0,0x12,0x0a,0x14,0xff,0x34,0xd9,0xe7,0xe2,0xea,0x1b,0x24,0x0f,0xdc,0x2b,0x0b,0xbb,0xb4,0x02,0x18,0x2c,0xef,0xe6,0x0b,0xfd,0xe1,0xa6,0x21,0x81,0xcd,0x1a,0xfc,0xe1,0x51,0xfb,0xf8,0xbd,0x25,0xcc,0xce,0x48,0xdd,0x27,0xe4,0xfc,0x1a,0xc0,0xd5,0x1b,0x26,0x40,0x24,0xf0,0xcf,0x45,0xe7,0x0d,0xbf,0xae,0xbc,0xa9,0xc1,0xba,0xea,0xdc,0xdc,0xca,0xd3,0x2e,0xae,0x68,0x3a,0x07,0xe6,0x1a,0x10,0xe8,0xd4,0xc0,0xbf,0x70,0xee,0x2a,0x1a,0xd7,0x4c,0xb9,0xdb,0xa5,0x16,0xee,0x01,0x07,0xe9,0x14,0xd0,0xc1,0xff,0xd4,0x11,0x46,0xf5,0xe7,0x06,0x9c,0xb3,0x85,0xcd,0x14,0xc3,0xf2,0xca,0x35,0xaa,0xd5,0x66,0xcf,0xe6,0xf1,0xc7,0xf2,0x13,0x28,0xf3,0x04,0x27,0x13,0xff,0xef,0x24,0x10,0xaa,0x62,0x0a,0x9b,0x11,0x23,0x04,0xca,0xdc,0xf0,0xf3,0xd0,0x0c,0x1f,0xd0,0x47,0x03,0xd6,0xd3,0x9b,0x33,0x1f,0x1a,0xcf,0xa9,0x06,0xe9,0x3e,0xf8,0xf4,0xf9,0x38,0x20,0xff,0x30,0xdd,0xc5,0xcb,0xfe,0x22,0xe4,0xfa,0x13,0x07,0x2b,0xfa,0x38,0x38,0x32,0xb8,0x0e,0x33,0x12,0x06,0x83,0x02,0x15,0x16,0xb3,0xbe,0xa6,0xd4,0x11,0x11,0x42,0xce,0x06,0xad,0x13,0xec,0xf3,0xd6,0xf3,0xf6,0xe0,0xb5,0xc2,0xcf,0xeb,0xc0,0x2b,0xde,0xcd,0xff,0xda,0xfd,0xed,0x01,0xc6,0xd1,0x02,0x83,0xef,0xeb,0xdb,0x00,0xe2,0xa6,0x1e,0xb9,0xd1,0xe6,0xe4,0xd2,0xa5,0xea,0xf6,0xc5,0x07,0x26,0x09,0xfb,0xef,0xbc,0xb8,0xcf,0x19,0xc1,0x37,0xf9,0xb6,0xd2,0xa6,0x24,0xdf,0xcf,0xfc,0xac,0xf6,0xd5,0x2d,0x09,0x1a,0x1b,0x10,0xed,0x09,0xf4,0xee,0xfc,0xb0,0x1b,0xe4,0x28,0xed,0xec,0xcb,0xc7,0xf0,0xd7,0x4b,0xda,0x02,0x1e,0x31,0x03,0xb7,0xe7,0xe6,0xcf,0xf1,0x13,0xf9,0x9c,0x0d,0x20,0xe1,0x6c,0xf6,0xe8,0x53,0x6e,0x03,0xf9,0x04,0x17,0x1d,0x01,0xe7,0xee,0xcb,0xc1,0x09,0x0c,0x19,0xf1,0x21,0xe3,0xdd,0x1f,0xea,0xef,0x15,0xdb,0x1b,0xf4,0x38,0x3d,0x04,0x3e,0x21,0xf4,0xff,0xe3,0xe1,0xed,0x4b,0x07,0xfc,0x00,0xfe,0x22,0x2f,0x07,0x32,0xea,0xd9,0xcb,0xf7,0xfd,0xf7,0xb0,0x09,0xed,0xe1,0xfc,0x2b,0x35,0xf2,0x08,0xfd,0x0c,0x4b,0x07,0xd1,0x39,0xdf,0xf0,0x2b,0xd3,0x06,0xd0,0xd6,0xde,0xef,0x08,0x0f,0x18,0xa1,0xed,0xe9,0xff,0xf5,0xf4,0xd0,0xba,0x57,0xc5,0xe9,0xd1,0xe9,0x22,0x14,0xfd,0x04,0xec,0x0f,0xfb,0xe9,0xdd,0xd2,0xc4,0xe2,0xde,0xfd,0x0d,0xf8,0x6f,0xf9,0xf8,0x02,0xd6,0xb6,0xf1,0xeb,0xe5,0xf9,0x0b,0xe7,0x48,0x11,0x02,0x3d,0xf4,0x2c,0xf4,0xf8,0x49,0xf3,0xf1,0x06,0xf6,0x3b,0xe1,0xd3,0xdb,0xc5,0xb3,0xee,0x54,0x33,0x04,0xdf,0x4f,0x5e,0xfe,0x49,0xf0,0x17,0xa7,0xe8,0x0b,0xe3,0x3c,0xed,0x25,0x03,0xfc,0x17,0x09,0xf0,0xe3,0x12,0xf5,0xe1,0xd7,0x1a,0x1d,0xfe,0x11,0xf2,0x11,0x06,0xca,0x13,0xdb,0xed,0xe7,0x22,0x24,0x1d,0xed,0xdb,0x11,0x13,0xfe,0x15,0x0c,0xf8,0xc6,0xf5,0x16,0x99,0xe5,0xf3,0x09,0x22,0x42,0x3d,0x0c,0x7f,0xe2,0xfc,0x14,0xda,0xeb,0x01,0xf4,0x0c,0x0d,0x03,0x22,0x04,0x04,0xed,0xef,0xda,0x1c,0xd4,0xe2,0xd9,0xf2,0x24,0xde,0x11,0xef,0x11,0xf9,0xf4,0xff,0xd3,0xee,0x0e,0xe5,0x08,0x0e,0xe3,0x17,0x05,0xfd,0xde,0xf9,0xfc,0x09,0xe5,0x21,0xce,0xe2,0x26,0xfa,0x23,0xec,0x04,0x02,0x09,0x41,0x20,0x0e,0x1e,0xf2,0xf0,0x12,0x08,0x08,0x04,0x00,0xf8,0xe0,0x0b,0xe3,0xf5,0x15,0xfa,0xf9,0x1d,0x1e,0x02,0xf6,0x44,0xe6,0xe3,0xce,0xf6,0xd4,0xc8,0xf5,0x27,0x29,0xfd,0x3f,0x08,0x0b,0xe4,0x17,0xf9,0x11,0xd5,0xee,0x2f,0x13,0xce,0xd2,0x34,0x00,0xed,0xe0,0xf5,0xf8,0x38,0x0a,0x15,0xf6,0xde,0xfd,0x0d,0xe5,0xe0,0xe4,0x0f,0xe1,0xe7,0xd8,0xfd,0xf6,0x15,0x0f,0xf9,0x00,0x49,0x06,0xd2,0x04,0xc8,0xed,0xfc,0x18,0xf1,0xef,0xf6,0x2a,0xe7,0x04,0xeb,0xe5,0x51,0x20,0x1c,0x08,0xed,0xfb,0xfd,0x33,0xf8,0xfb,0xf9,0x15,0xfa,0xf6,0xf6,0x04,0xdf,0x1d,0xfd,0xf0,0x19,0xf0,0xfa,0x0f,0x0e,0x1b,0x22,0x12,0xeb,0x02,0xf5,0xde,0x12,0x07,0x07,0x24,0x38,0xf6,0xef,0xe5,0x21,0xe8,0xe6,0xce,0xe1,0xf8,0x00,0x24,0xe5,0xe5,0xdf,0x0d,0xf6,0xfc,0x19,0xfb,0x15,0xe8,0xf9,0xfa,0x32,0x04,0x0e,0x02,0x06,0x07,0xf6,0xfc,0xef,0x01,0x1f,0x7f,0x1f,0xe8,0xfd,0x0e,0xe6,0x0c,0xf9,0xe0,0xe4,0xef,0xe7,0xeb,0xed,0xf4,0x08,0xe8,0xda,0xd1,0x16,0x11,0x04,0x00,0x16,0xf6,0x19,0xf9,0xf0,0xc6,0xf0,0xff,0xff,0xf1,0x17,0xf1,0xf6,0xde,0xf5,0x10,0xbc,0xe7,0xdc,0x21,0x09,0xec,0xc0,0xea,0x93,0xaf,0xc2,0x0a,0x9c,0xdf,0xe9,0x15,0x93,0xbc,0x1f,0x94,0xaf,0x0c,0xe2,0x4d,0xe1,0x1a,0x0d,0xd9,0xd2,0xf8,0xd1,0xe5,0xf1,0x1c,0xc5,0xc3,0x96,0xc2,0x05,0xbe,0x1f,0xee,0xee,0x02,0xac,0xd3,0x3c,0x10,0xe0,0x51,0x08,0xdd,0x19,0x3e,0xde,0xd5,0xb6,0xf2,0xf3,0xf1,0xf1,0x92,0x1c,0x12,0x59,0x63,0x3e,0x34,0xc6,0xc6,0xaf,0x24,0xf8,0x23,0x45,0x22,0x30,0xde,0x2b,0xeb,0xea,0xe5,0x13,0x0d,0xbd,0xac,0xb4,0xc3,0x4a,0x58,0xd7,0x6c,0xd3,0xcd,0x0a,0xb8,0xe7,0x33,0xd8,0xce,0xfa,0xc1,0x05,0xe8,0x3d,0xf4,0xa1,0x14,0xe0,0xf3,0xb4,0xf8,0x12,0xf3,0xa3,0x26,0x50,0xd4,0xf5,0xb4,0xed,0x09,0xda,0xfc,0xbc,0xd0,0xa8,0x0a,0x11,0xe6,0xed,0xfb,0xf7,0x30,0xab,0x00,0x81,0x33,0x16,0x47,0xee,0x01,0x0d,0x14,0x14,0x17,0xe7,0xc0,0xd0,0xc8,0x1c,0x2c,0x15,0xab,0x4b,0xb3,0xdf,0xd5,0x6d,0xe1,0xb7,0xa5,0x56,0xfa,0x2a,0xb3,0x06,0xae,0x33,0xf5,0xde,0xe1,0x03,0x25,0x13,0xb8,0xda,0xcf,0xfe,0x4c,0x85,0x97,0x1d,0xd1,0xd6,0xba,0xd2,0x11,0xe2,0x20,0xe2,0xb1,0xf9,0x15,0x08,0xfa,0x27,0xfc,0x9e,0xc0,0xb6,0x3a,0xdf,0x60,0xcd,0x16,0xec,0x3c,0xb4,0xda,0xd3,0x64,0xca,0xf7,0x3d,0x10,0x9a,0x46,0xdd,0x52,0x38,0xda,0xe0,0xd6,0xc7,0xeb,0xf6,0x11,0x1a,0x57,0x37,0x1e,0x4e,0xf9,0xdd,0xea,0xc1,0x25,0xd9,0xf1,0x04,0x12,0x30,0xed,0x08,0x01,0x0f,0xa7,0x00,0xe3,0x93,0x5a,0x10,0xca,0xd3,0xca,0x0f,0x1f,0xc8,0xe9,0x1b,0x95,0xd3,0xe3,0x04,0xed,0x06,0xf7,0x03,0x22,0x06,0x0e,0xda,0xee,0xed,0x49,0xca,0xe0,0xa3,0xf4,0xfb,0xe2,0x35,0xa2,0x11,0xca,0x14,0xf2,0xec,0x23,0x31,0xba,0x01,0x10,0x0e,0x66,0x15,0x0f,0x18,0x20,0xe0,0x20,0x07,0x0e,0xb4,0xf3,0x1f,0xd4,0x12,0xb1,0x2f,0xaa,0xed,0xf9,0x2c,0xdb,0x1f,0x26,0xe4,0x48,0xf2,0x0c,0x3b,0xd1,0x20,0xb8,0x15,0xc5,0xda,0x11,0xf4,0xfd,0x04,0xef,0x2f,0x26,0x25,0xd7,0xfe,0xd6,0x02,0xd4,0xdd,0xd5,0x37,0x08,0x07,0xb6,0x01,0x16,0xe7,0x16,0x10,0x1c,0xf2,0xbb,0xfc,0x77,0x01,0xc2,0x31,0xe8,0xdb,0xfb,0xd8,0xe0,0x50,0x1e,0x47,0xe4,0x02,0x1c,0x15,0x10,0xba,0xf0,0xcc,0x22,0xc3,0xb8,0xd0,0xd3,0x0e,0x00,0xb7,0x13,0x7b,0xf8,0xf7,0xfe,0xf4,0x0d,0xd1,0x25,0xec,0xd2,0xbc,0x2c,0xe5,0x43,0x22,0x09,0x0e,0xce,0xe1,0xfe,0x08,0xf3,0x0c,0x09,0x22,0x03,0xce,0x0e,0xd9,0x2e,0x2c,0xfb,0xf4,0x16,0xe9,0xfa,0xd5,0xeb,0xe6,0x22,0x38,0x02,0x59,0x23,0xd9,0x17,0xf9,0xe1,0x2d,0x2b,0xef,0x37,0x01,0xe8,0x07,0xf3,0x17,0x21,0x07,0x93,0xe7,0xe4,0xff,0x0c,0xeb,0xf6,0x96,0x11,0x0c,0x49,0xf7,0xed,0xfd,0xeb,0xd9,0xbc,0x24,0xeb,0xe3,0xb1,0xf7,0x67,0xd0,0xfa,0x25,0xc1,0x28,0x5b,0x7f,0xd1,0xfa,0xd8,0xc7,0xe9,0x42,0xb6,0xde,0x23,0xe6,0xe5,0x24,0xe2,0x11,0xe7,0xda,0x09,0x3b,0xed,0x00,0x38,0xe6,0xc3,0xdc,0xe3,0xd9,0xb5,0xfd,0x06,0x03,0xde,0x04,0x0e,0xf2,0x1d,0xe6,0xfc,0x98,0xfc,0xd8,0x36,0x16,0x00,0x13,0xd8,0xf0,0x10,0x23,0x3a,0xf4,0xe9,0x02,0xdc,0xf8,0x13,0xba,0x1c,0xd7,0x19,0x2e,0x13,0x09,0x11,0xeb,0xce,0xd0,0xf5,0x9e,0xf3,0xfc,0x3d,0x2b,0xf5,0xdf,0xf8,0xcf,0xd4,0xf9,0xea,0xc8,0x39,0x0d,0xf8,0x00,0x4a,0x13,0xbe,0x29,0x1b,0xb0,0x14,0x0e,0xfd,0xfc,0xd9,0x03,0xa4,0xed,0xf3,0x03,0x01,0xda,0x13,0xf2,0xd4,0xf8,0x1b,0x32,0x18,0xe1,0x3d,0xc7,0xdd,0xd3,0x2f,0x07,0xa9,0xe8,0x19,0xd4,0xf5,0xfd,0xf2,0xe1,0xbc,0x0b,0xa7,0x06,0xd7,0x0a,0xe9,0x20,0xfc,0x0f,0x04,0xfb,0xbd,0xdb,0xf5,0x05,0x03,0x51,0x62,0xee,0xe4,0x23,0xfb,0xf6,0x03,0xfb,0x4a,0x2a,0xde,0xe2,0xb3,0xfc,0xcf,0xfa,0xfc,0xc3,0xea,0xf9,0xf5,0xfc,0xf1,0xf1,0x21,0x38,0x08,0xbd,0xf6,0x55,0x09,0xd2,0xf7,0xde,0xe7,0x1e,0xf7,0x56,0x15,0xda,0x81,0x30,0xef,0x9f,0xe8,0xdf,0xbc,0x03,0x08,0x08,0xfb,0x10,0xdd,0xf9,0x27,0xd5,0xc0,0xbc,0xda,0x04,0xff,0x2a,0x2b,0xe4,0x20,0xd4,0x4e,0xf3,0xf2,0x53,0xf7,0xde,0xea,0x01,0xe9,0xe9,0x08,0xee,0xd0,0x11,0x17,0x23,0xcf,0xf8,0xd2,0x00,0xdb,0xe1,0xf7,0x06,0x0c,0xf1,0xdf,0xe7,0xfc,0xb6,0xe3,0xef,0xe0,0x41,0xd9,0x13,0xcc,0xda,0xe9,0xf8,0x1f,0xdc,0x03,0xf3,0xb3,0xe9,0xb8,0xca,0xe0,0x1c,0xaf,0x1b,0x21,0x23,0x1b,0xf0,0xfa,0x06,0xec,0x0f,0x12,0x18,0xd4,0xfe,0xf8,0x29,0xdc,0xed,0xf8,0xf7,0xdc,0x32,0x07,0x22,0xe8,0xf3,0xc4,0xef,0xe9,0x34,0xfe,0xe8,0x4d,0x0b,0xf7,0x14,0xda,0xef,0xb3,0x11,0x24,0xf0,0xa9,0xba,0xf9,0xf6,0x0a,0xd5,0x13,0xf4,0x2a,0x2c,0x1c,0x05,0xe7,0x30,0xd6,0x3f,0xe2,0xe6,0x78,0x4d,0xd0,0xd9,0x2b,0x1a,0xd7,0x14,0x17,0xe9,0x81,0x13,0x2e,0xf9,0xcb,0xd2,0xe6,0x0b,0xb2,0x0a,0xc8,0xb1,0xf2,0xb2,0xd8,0xe6,0xf8,0x0f,0xad,0xcb,0xc6,0xc6,0xad,0x56,0x3b,0x27,0xdc,0xd6,0x39,0xf5,0xf8,0x34,0x1d,0xdd,0x3b,0xd4,0xeb,0x15,0xbe,0xf4,0x1b,0x08,0xf0,0xe6,0xc7,0x29,0x1e,0x18,0xc0,0x10,0xac,0xf2,0xae,0x24,0xeb,0xfc,0xfd,0x06,0xfa,0xe1,0x08,0xae,0x26,0xd4,0xf9,0x41,0xd4,0xcd,0xff,0x64,0xff,0xce,0xdd,0xe4,0xeb,0xde,0xf5,0x4c,0x28,0x02,0xe2,0x7a,0x0d,0xa5,0x35,0x46,0xa5,0xfa,0x07,0x11,0x07,0x54,0x0c,0x05,0x00,0x11,0x01,0xfa,0x0b,0x09,0xa1,0x16,0xfc,0xa9,0xf4,0x01,0x35,0xee,0x05,0x3d,0xec,0x0e,0x0c,0xf6,0x1b,0x3a,0x1c,0x17,0x58,0xf2,0x1a,0x16,0xea,0x08,0x20,0xfa,0x3c,0xef,0x0d,0x0b,0xf9,0x0a,0xef,0x87,0xff,0xeb,0x07,0xfd,0x24,0x0b,0xc2,0xfd,0x1d,0xc0,0x0f,0xe7,0x5d,0x08,0x00,0xc9,0x1a,0xea,0xe8,0xda,0xca,0xe5,0x24,0x3b,0x18,0xf8,0xa4,0xd0,0x15,0x0c,0xeb,0x11,0xfc,0xfc,0x11,0xf2,0x28,0x0c,0xd6,0x40,0x2b,0xf8,0x0d,0x66,0x1c,0x0a,0xf1,0xf7,0x29,0xf6,0x05,0x32,0xd2,0xec,0x07,0xff,0xa3,0x1b,0x36,0x5b,0xd3,0x36,0xd1,0x07,0xdd,0xde,0x29,0x1e,0x22,0x18,0xb5,0xd7,0xd9,0x08,0xe8,0x15,0x90,0xc3,0x18,0x11,0xcc,0x1f,0x29,0xd5,0xf7,0xbd,0x22,0xcc,0xbd,0xc2,0x0e,0x09,0x47,0xcd,0xa6,0xc6,0xbf,0xd2,0x1d,0xee,0x36,0xf7,0xd4,0xc2,0x0d,0x1b,0x1f,0x05,0xfe,0x0e,0xb9,0xe3,0x1b,0x34,0x44,0xe1,0xeb,0xbc,0x3c,0xec,0x25,0x1b,0xb4,0x26,0xc3,0xdf,0x27,0x1d,0xed,0xfc,0xf9,0x31,0x2c,0xee,0x09,0xea,0xef,0x02,0xeb,0x0e,0xe2,0xc0,0x09,0xf0,0x0f,0xff,0xf1,0x50,0x11,0xf7,0x54,0xe9,0xc5,0x34,0xbf,0x21,0x01,0xc5,0x99,0x14,0xe1,0x0a,0xeb,0x03,0xbb,0xe7,0xd1,0xf7,0xe7,0x03,0xd9,0xff,0x9e,0x33,0x17,0x05,0x1a,0x30,0xfd,0x3f,0x0d,0xdf,0xe6,0x18,0x15,0x21,0xcb,0x0f,0x06,0xcf,0x9f,0x5b,0x0f,0x13,0xf9,0xcf,0x67,0x45,0x0d,0xf8,0xc0,0xd6,0x02,0x19,0x03,0xa6,0xbc,0xfe,0xe7,0xea,0x03,0xb7,0xba,0x63,0x16,0xcb,0x06,0x50,0x1a,0x09,0x1a,0x0d,0x0d,0xf0,0xc5,0xce,0xfd,0x9f,0xbb,0x12,0xfb,0x08,0xfe,0x11,0x08,0xe5,0x7f,0x5c,0x1e,0x29,0x20,0x05,0x21,0xfb,0xcd,0xe8,0x2e,0x24,0xe7,0x1b,0x32,0xd1,0x05,0xeb,0xce,0xdc,0x0e,0xfb,0xec,0xf0,0x15,0xc2,0xe6,0xdc,0xe0,0x33,0x2a,0xd1,0x37,0x0b,0x4a,0x01,0xb8,0xb0,0xe6,0xd6,0xf5,0x05,0x0c,0x11,0xcd,0xcc,0xd1,0xb0,0xfa,0x14,0x2e,0x2e,0x02,0xe4,0x01,0xd0,0xf7,0xca,0x60,0xa9,0xe4,0x1f,0xe3,0x4f,0x2c,0xfe,0xfc,0xbb,0xe6,0xcb,0x00,0xf4,0xe6,0xdd,0x21,0xf0,0xcb,0xa5,0x10,0x3f,0xe3,0xf8,0xaa,0x26,0x06,0xd1,0xee,0xda,0xfd,0x3b,0xf4,0xb9,0xe0,0xf4,0xbd,0xf0,0xe5,0xdd,0xb2,0xf9,0xfb,0xce,0xfa,0x2a,0xe3,0x13,0xd3,0x07,0xe1,0xcb,0xf8,0xd9,0xed,0xff,0xb0,0xc4,0xc6,0x1e,0xdf,0xe5,0x14,0xbf,0xe0,0xe4,0xf6,0x04,0xbd,0xd4,0x1f,0xc9,0xd0,0xdd,0xf3,0xe9,0x32,0x23,0x20,0xd3,0x15,0x25,0x11,0xa9,0x2a,0xcb,0x29,0xde,0xfe,0x03,0xe2,0x1c,0x24,0xbe,0xfb,0x2f,0x26,0x06,0xb9,0x28,0x3a,0xd8,0x3b,0x1c,0xe7,0x05,0x06,0xf9,0xd7,0x0c,0xf9,0xe5,0x17,0xf7,0x36,0x48,0xfc,0x12,0xe9,0x9e,0x09,0xb8,0x01,0xf5,0x1f,0xd4,0x3b,0x12,0x00,0xd1,0x09,0xeb,0x32,0xfb,0xb0,0x3c,0x81,0x17,0x4c,0x15,0xfd,0x0c,0x2e,0xcd,0x1f,0x0f,0x48,0x20,0x48,0xda,0xd0,0xeb,0xe6,0x1a,0xf6,0xb2,0xfd,0xc3,0xd4,0x01,0x2c,0xe2,0xeb,0xbc,0x3c,0xc7,0xee,0x0d,0x21,0xbb,0x0d,0xf6,0xda,0x0a,0xc5,0x0d,0x21,0x10,0xeb,0xdc,0x06,0xf0,0xd8,0xc5,0x1a,0x1a,0xc5,0x1f,0xf4,0xe3,0x24,0x9c,0xb1,0xcb,0xc3,0xe4,0xcd,0xe4,0xe7,0x2c,0x23,0x30,0xcb,0xba,0xc1,0xf6,0xab,0x0b,0xdc,0xaf,0xd1,0x13,0x1f,0x2c,0x22,0x22,0xb9,0xfd,0x0b,0x10,0x22,0x42,0xf9,0x22,0x02,0xcf,0xea,0xe1,0x35,0x6a,0x05,0xd9,0xb7,0xfa,0xb2,0xff,0xf0,0xd2,0xcf,0x12,0xe9,0xf8,0x59,0xd7,0xcc,0xbf,0xc2,0x82,0xc8,0xd7,0xe7,0xa6,0x3a,0x22,0xc4,0x0e,0x23,0xf1,0xd6,0x29,0xf4,0xda,0xd6,0xfe,0x08,0x00,0x17,0x06,0x2a,0x17,0xca,0xe2,0x37,0xde,0x10,0x19,0xe4,0x38,0x06,0x07,0xce,0xfc,0x1b,0x43,0xe0,0xcf,0xb9,0xa3,0x20,0x4d,0xd8,0x4a,0xcc,0x19,0xe2,0xb7,0x18,0xce,0xd5,0xeb,0xda,0x11,0x9c,0xdc,0xe9,0x29,0xca,0xa6,0xf5,0x14,0xe1,0x1d,0x1c,0xcb,0xe3,0x59,0xf8,0xcc,0x4f,0xd1,0x4b,0x16,0xad,0x14,0xaf,0x95,0xcf,0x39,0xfc,0x1e,0xb2,0x1f,0xeb,0xfb,0x3d,0xff,0xf8,0xfd,0xec,0x8b,0x40,0x2b,0x10,0xbf,0xf6,0xf5,0xcc,0x2f,0xca,0x2a,0xf8,0x9b,0x1a,0xf5,0xce,0x1e,0xf6,0x25,0xc5,0x25,0xe7,0x84,0xda,0xc3,0x1b,0xb5,0xd6,0x29,0x36,0x23,0xaf,0x00,0x30,0xe6,0xa3,0xd4,0xbb,0xc6,0xb5,0xd3,0x14,0x14,0x18,0x1f,0x30,0x16,0x37,0xcf,0xd9,0xe6,0xf8,0xda,0xa2,0x39,0x14,0x09,0x33,0x08,0xeb,0xac,0xcd,0x04,0xcd,0x49,0x89,0xf9,0xc1,0xc2,0xc6,0x37,0xdf,0xdd,0x01,0xbf,0x27,0xec,0x1f,0xe4,0x05,0xed,0xe7,0xec,0x0d,0x03,0x4e,0x2d,0xc3,0xe6,0xf4,0x07,0xeb,0x23,0xc8,0xa5,0xfc,0xc4,0x09,0xda,0xf0,0x3e,0xbb,0xf9,0x06,0x05,0xd6,0x1c,0xd0,0x20,0xf3,0x34,0x00,0xab,0xff,0xfe,0xdb,0xdb,0xd1,0xd5,0xe7,0xed,0xf5,0xec,0xf2,0x2b,0x32,0xa4,0xf3,0x4c,0x21,0xca,0x2c,0xb5,0xe7,0xd4,0xc3,0xfa,0x56,0x52,0x0c,0x0b,0xd0,0xd1,0xf5,0x14,0xf7,0xc3,0xdd,0x20,0x05,0xac,0x13,0x56,0x08,0xc2,0xd1,0xe1,0x11,0x00,0xfa,0xe8,0x84,0xff,0x06,0xf8,0x09,0xf8,0xf3,0xc1,0xde,0xef,0xec,0x26,0xf2,0xfe,0x24,0xf2,0x0c,0xd5,0xd7,0x05,0x01,0xce,0x2d,0x0c,0x03,0x23,0xf7,0xeb,0x01,0x08,0x32,0x81,0xcb,0xc2,0xd0,0x2b,0xda,0xf1,0x63,0x03,0xde,0xf4,0x20,0xcc,0xe2,0x28,0xdf,0x6d,0xf9,0xb6,0x19,0x9d,0xfc,0xf6,0xe4,0xc5,0xdb,0x06,0xa6,0x08,0xf0,0x48,0xf4,0xfd,0x20,0xf7,0x08,0xb2,0xc2,0x00,0xe8,0xec,0xbe,0xad,0xf2,0x4e,0xf4,0xf8,0xe0,0x17,0xd8,0xa7,0x0f,0x01,0x00,0xe8,0xe7,0x0e,0xe9,0xff,0x2e,0x17,0xa4,0x15,0xdd,0xfe,0x25,0xf1,0x1b,0xe0,0xf9,0xb7,0xdd,0x11,0xd5,0xb8,0xe5,0xfb,0x0a,0xb1,0xe2,0x48,0x3d,0xa4,0x1e,0xc9,0x48,0xbb,0xe0,0xd7,0x28,0xe5,0x00,0xca,0x24,0x2c,0xe1,0xb2,0x49,0x17,0xe3,0xc7,0x05,0xf1,0xcd,0x5e,0xf5,0xf1,0xc2,0xf2,0x2a,0xd6,0x03,0xd9,0x2b,0xf8,0xe0,0xbb,0x04,0xc5,0xd8,0x1f,0x0a,0xf8,0x34,0x46,0x19,0x14,0xc4,0xde,0xfb,0xeb,0xe7,0x4b,0xe7,0xd9,0x07,0xc3,0x1f,0xe7,0xe2,0xe8,0x7b,0x07,0x0d,0xf2,0x20,0xfc,0x24,0xe8,0xde,0xfe,0xe5,0xf1,0xe9,0xdb,0xcd,0xbc,0x00,0x03,0xfd,0xf5,0xb2,0xe6,0xe6,0xf5,0x02,0x93,0xc8,0x2f,0x0d,0xfb,0x25,0xe7,0xc2,0x24,0x40,0xce,0x95,0xd3,0xeb,0xc8,0x03,0x0f,0x5d,0xdf,0xd8,0xf3,0xa6,0x59,0x08,0xde,0xd2,0xfc,0xc9,0xe5,0x07,0x09,0xe1,0xff,0xf0,0x0f,0xf0,0xc6,0xe1,0xb9,0xe3,0x1a,0x01,0xde,0x3d,0x96,0xc3,0x57,0xb8,0xc1,0xa8,0x14,0x51,0x16,0x0e,0xfc,0x17,0xd8,0xd0,0x27,0x02,0x17,0x36,0xd0,0x95,0xc8,0xc4,0xe7,0x06,0x2a,0x14,0xfc,0x36,0xfa,0x3c,0x21,0x59,0xd7,0x10,0x0b,0x1e,0xde,0x22,0x19,0xc9,0xd5,0xf2,0xe5,0xd6,0xeb,0x06,0xdd,0xf1,0xfc,0x06,0xdb,0x81,0xeb,0xd5,0xdc,0x12,0xd4,0xee,0xfd,0x96,0xc9,0x4e,0xef,0xf2,0x9e,0x20,0xe6,0xbd,0x04,0xdc,0xe3,0x0b,0x3c,0xa8,0x37,0xd7,0xe9,0xc8,0x48,0xb9,0xf7,0xd5,0x32,0x02,0x15,0xad,0x30,0xc2,0xbf,0x51,0xe8,0x40,0x1c,0xf2,0x47,0xe9,0xbd,0xb0,0xc9,0xfc,0x36,0x00,0x06,0x1d,0xe7,0xcb,0xdb,0x1c,0x2a,0xfd,0xb3,0x1e,0x0c,0x92,0xef,0xe8,0x1a,0x22,0x05,0xdb,0x0c,0x06,0xf3,0x22,0xe8,0x3c,0xfc,0x4d,0x02,0x2b,0x17,0x09,0xde,0xe8,0x41,0x01,0x2a,0xb9,0x0e,0xc4,0xc5,0xdf,0x0c,0xcc,0xaf,0xd9,0xb6,0xf3,0x4f,0xe0,0xf0,0xd0,0xef,0xc5,0x15,0xb3,0x2e,0xd9,0xd7,0x54,0x08,0x49,0xff,0x2a,0x0d,0xe7,0xd2,0xfd,0xe0,0x0b,0xbd,0xea,0xbc,0x13,0xde,0xad,0x14,0x2a,0xa6,0x81,0x32,0x29,0x25,0xed,0x49,0xa3,0x04,0x0e,0x06,0x1d,0x08,0x22,0x24,0x01,0xd0,0xb5,0xe7,0xe3,0x2e,0xf4,0x1f,0x25,0x03,0xc7,0xe3,0x2e,0x00,0x36,0xf8,0xf5,0x28,0xdb,0x40,0xda,0x0b,0x2e,0xe8,0xfb,0xf9,0xca,0x45,0xcf,0xc9,0x0e,0xea,0xf1,0x25,0xd7,0x1d,0xe2,0x0a,0xf3,0xfe,0x3c,0xe7,0x00,0xf4,0x17,0x35,0xe4,0x2d,0xf8,0x45,0x10,0xe2,0xfd,0xe6,0x0a,0xaf,0x05,0x35,0xc6,0xdc,0xf7,0xb4,0x97,0x0b,0x26,0x01,0xfb,0xb5,0xfc,0xbf,0xc2,0x29,0xe0,0x16,0x54,0xbf,0x1a,0xeb,0x26,0xd2,0xf6,0xb2,0xed,0x31,0x4b,0x35,0xd1,0x0e,0xc5,0xeb,0xf8,0x09,0x04,0x62,0x1c,0x07,0xec,0xf5,0xd3,0xbc,0xdd,0x17,0xed,0x92,0xe9,0xe5,0x23,0xf0,0xe9,0xa0,0xe0,0x53,0x33,0xc8,0xe6,0x9e,0x01,0xf7,0xfb,0xd4,0x10,0x35,0xc3,0xf9,0xf1,0xf4,0xf1,0xeb,0x2f,0xbe,0x1d,0x14,0xd5,0xd6,0x13,0x1d,0xe6,0x2e,0xe1,0x3c,0xe4,0x12,0xe0,0xc7,0x27,0xec,0xfb,0xda,0xdc,0xe7,0xf8,0x11,0x1b,0xe7,0xea,0xef,0x0c,0xee,0xf4,0x05,0x20,0x81,0xb3,0x36,0x12,0xf5,0xe3,0x00,0x1d,0xb5,0x15,0xd0,0x04,0x1b,0xf8,0xe6,0xf7,0x32,0x0f,0x27,0xf9,0xfe,0x1b,0xe8,0x21,0xda,0x29,0xf3,0x0d,0x45,0xc8,0xee,0xf9,0x02,0xfc,0x04,0x1c,0xe2,0xf8,0xfe,0xf3,0xfe,0xfb,0xc0,0xd8,0xd6,0xd1,0x12,0x13,0xfb,0x19,0x26,0x1b,0x00,0x31,0xb1,0xd4,0x17,0x36,0x1f,0x0c,0x18,0xe0,0xf6,0xdb,0xd0,0x04,0x14,0x0c,0x1c,0x0e,0x0c,0x17,0xe9,0x02,0xe7,0x47,0x26,0xc7,0xd4,0x1a,0x0e,0xff,0x52,0xf6,0xb2,0xcb,0x22,0xf7,0x22,0xea,0xd7,0xec,0xdf,0xca,0xe0,0xbb,0xc1,0xf1,0xd8,0x0d,0x39,0x01,0x13,0xeb,0xd8,0xd0,0xf1,0xf0,0x3f,0x17,0xee,0x07,0xf5,0xb8,0x27,0xe9,0xef,0x06,0xce,0x2b,0xf3,0xe4,0x3b,0x04,0x3a,0xc7,0x08,0xc4,0x14,0xc0,0x47,0x0d,0x00,0x24,0x43,0xd0,0xaa,0xa4,0xb0,0xe9,0x1f,0x2d,0x1a,0xda,0xf1,0xd9,0x13,0xd1,0xa9,0x4c,0x0d,0xcf,0x0c,0x3b,0xfa,0xef,0x0f,0x32,0x31,0xfa,0x27,0xe7,0xed,0x56,0xd7,0x05,0x23,0xe1,0x2a,0x2b,0xeb,0xf3,0x02,0x0d,0x1d,0xc9,0xde,0x06,0x26,0xfa,0x13,0xf6,0xed,0xec,0x1e,0xea,0x4a,0x2f,0xf0,0xda,0x45,0xf6,0x1c,0xc4,0x25,0x18,0xed,0xfc,0x44,0xbd,0x1d,0xe0,0xff,0x00,0xde,0x33,0x31,0xe6,0x11,0xe0,0xcd,0x37,0xde,0xe0,0xf9,0xfe,0x01,0xfe,0xed,0x12,0xf1,0xf3,0xe0,0xa8,0xeb,0xc8,0xe2,0xf5,0x0a,0x22,0x1f,0x12,0xdd,0x1b,0xd8,0xcd,0xa4,0xde,0xe2,0x18,0xf3,0x5a,0xb7,0xde,0xb1,0x00,0xd4,0xf4,0x1f,0xe5,0xc7,0x2a,0xf8,0x22,0x36,0xb9,0x0c,0xf4,0x1f,0xfa,0xf5,0xbc,0xb4,0x1b,0xe6,0x41,0xdc,0x32,0x04,0x11,0xf5,0xe7,0xcc,0x1d,0x72,0x50,0xd3,0x16,0x24,0x8f,0x29,0xf3,0xf9,0xcc,0xdc,0xdd,0x4e,0xff,0xe1,0xc9,0xe0,0x41,0x22,0x4d,0xee,0xc9,0xc0,0x14,0x23,0xf9,0xe6,0xf9,0x08,0x10,0xdb,0x0a,0x37,0x02,0x3a,0xd0,0x04,0xff,0xa4,0xcf,0xda,0x18,0x1d,0xe5,0xe9,0xfb,0x22,0xf8,0x44,0x83,0xd7,0xfd,0xf0,0xf9,0xc6,0x09,0xdb,0xee,0x11,0xe2,0x3d,0xfc,0xdf,0xd0,0x1c,0xe0,0xf5,0x13,0x25,0xcb,0x07,0x13,0xcf,0xff,0xc5,0x35,0x2a,0xf7,0xe9,0xff,0x0d,0x4d,0x12,0xf9,0x1f,0x10,0x16,0x00,0x1d,0xde,0x15,0x15,0xa3,0x03,0xd5,0xfc,0x21,0x01,0xdb,0xbf,0xbf,0x09,0xe0,0xfc,0x00,0x10,0xd2,0xc8,0xae,0x08,0x22,0xf2,0x51,0x05,0x24,0xfa,0xe4,0x10,0xb5,0xcb,0x3f,0xfc,0xf9,0x01,0xf1,0x64,0xdd,0xf3,0x20,0xe8,0xa5,0xf1,0x28,0x44,0xed,0x28,0x28,0xa6,0xe0,0xff,0x41,0xf1,0x19,0x0d,0xfb,0x0a,0xe7,0x15,0x2c,0x2b,0x32,0x0f,0x4f,0x08,0xf0,0xd0,0x2b,0xea,0xb0,0xfc,0xec,0xd9,0x43,0x7e,0xce,0x0c,0xfa,0x0b,0x44,0xc2,0xc5,0x18,0xca,0xe2,0x01,0xea,0xa7,0x36,0xbd,0x24,0xc8,0xcd,0xea,0x1f,0xd0,0x14,0xc0,0xd3,0xdc,0x2b,0xc9,0xee,0xdd,0xee,0xfd,0xb9,0x0d,0x26,0x18,0x25,0xf7,0x2f,0xf8,0xf1,0x0e,0x16,0xbd,0xeb,0xd2,0x32,0xc8,0x10,0xee,0xa8,0x07,0x1e,0x7f,0xbc,0xf8,0x0b,0x0a,0x24,0x13,0xd4,0x1f,0x02,0xee,0xd8,0x1a,0x00,0xdb,0xc3,0xe3,0xf8,0x09,0x13,0xdf,0x08,0xb4,0x01,0x2b,0xc5,0x0e,0x04,0xdc,0xe4,0x05,0x14,0xc2,0x0e,0xf1,0xda,0x0c,0xcf,0x3e,0x2d,0x0b,0xf0,0x0f,0xea,0xb3,0xb6,0xed,0x1c,0xe6,0xe3,0x43,0xf0,0x1b,0xc2,0xd3,0xfe,0xb2,0x30,0x0d,0xe9,0x3c,0x11,0xd9,0x20,0xf7,0xf8,0x1a,0xf9,0x16,0xbf,0xfb,0xc9,0x20,0x1b,0xc1,0xd5,0x92,0x0e,0x07,0x04,0x4c,0xbe,0xe9,0xc4,0x05,0xfc,0x0d,0xea,0x6a,0xd6,0xea,0xcc,0x11,0xf9,0xd8,0x1f,0xe9,0x37,0xcb,0xb5,0xf8,0x69,0xfd,0xcb,0x7f,0xe7,0x20,0xff,0x00,0xe1,0x1a,0x11,0xe3,0xc6,0xf2,0x02,0x20,0xd4,0xe3,0xeb,0xfe,0xcd,0xd1,0x03,0xdc,0xfb,0x05,0xd9,0xe7,0x0c,0x3f,0xe7,0x22,0x09,0xbb,0xe3,0xfd,0xe3,0xd7,0xda,0xaa,0x1e,0xdc,0xc4,0xd0,0xc9,0x64,0xca,0x3f,0xe8,0x18,0xe2,0x38,0x28,0xf1,0x06,0x0f,0x18,0xd3,0xf3,0xff,0xe1,0xbe,0x41,0x02,0x1e,0x38,0x15,0xa3,0x19,0xe4,0x2c,0x10,0x31,0xe6,0xf9,0xd6,0xcb,0xf2,0xde,0x03,0x2a,0x39,0xf4,0xcf,0x05,0xf8,0x51,0xe2,0xdc,0xd8,0xd3,0xe5,0x01,0xdc,0x0f,0xc3,0xfb,0xb8,0x11,0xfc,0x10,0x04,0xd0,0xfa,0xea,0x30,0xa8,0x13,0xd9,0x2d,0x00,0xe0,0xff,0x3a,0xf8,0x39,0x7d,0x2a,0x92,0x16,0xdc,0xe3,0x1e,0xe1,0xde,0xf1,0x0b,0xc8,0xdf,0xc7,0xf1,0xdd,0xa4,0xe6,0xe0,0xee,0x02,0x0e,0xfe,0xcf,0xb8,0xe5,0xde,0x1f,0x91,0xf6,0xd9,0xf2,0xe0,0xcb,0xfe,0xf5,0x01,0xf3,0x43,0x99,0x1b,0xd1,0xbd,0x35,0xe4,0xd0,0x87,0xa8,0xb8,0x59,0xf0,0xa9,0xd0,0x88,0x2e,0x37,0xb5,0x02,0x42,0xbb,0x57,0x5e,0x07,0xd3,0x19,0x4e,0x1e,0xe9,0x20,0xf9,0xb5,0x27,0xd6,0xfe,0xf6,0x4b,0xf7,0xf1,0xba,0x43,0xe2,0x2f,0x09,0x91,0xf6,0x14,0xb5,0x19,0xa5,0xe3,0xda,0xf4,0x26,0xe0,0xdb,0x1e,0xbd,0x12,0xbb,0x16,0xec,0xc7,0xa5,0xd1,0xea,0xcf,0x46,0xb1,0xc9,0xde,0xdf,0xd3,0x07,0x31,0x4c,0xdf,0x2a,0xe0,0x3b,0xbd,0x1b,0xec,0x35,0x94,0xe1,0x20,0xa8,0x1b,0x00,0xd0,0x1e,0x29,0xe8,0xe7,0x35,0x0a,0x29,0x47,0xbe,0x14,0x48,0xbc,0x26,0xdb,0xdf,0xec,0x03,0x5f,0x0a,0x28,0xf8,0x4b,0xe7,0x8e,0xfe,0x91,0xc5,0x9f,0x49,0xed,0xbc,0x41,0x20,0x9d,0xc9,0xcd,0xf2,0xf7,0x34,0x0e,0xda,0x2a,0x98,0xe0,0x81,0x9e,0x5c,0x29,0xd0,0xcb,0x3b,0xef,0x5c,0x1c,0xbc,0xef,0x03,0xfe,0x42,0x3f,0xc2,0xd6,0xea,0xd1,0x8a,0xe3,0x04,0xc0,0x15,0x38,0x0d,0xfa,0xb9,0xb4,0x1a,0xd1,0x47,0xa0,0x20,0x40,0xf1,0xd0,0xbb,0x06,0x19,0x2a,0x48,0xd3,0x27,0xf0,0xf2,0x1e,0x0f,0x19,0x09,0x3c,0xe2,0xc2,0xba,0x31,0xf3,0xf6,0x30,0xb5,0xd6,0xe4,0x30,0x50,0x14,0x13,0x5a,0x0e,0x44,0xfe,0xd5,0xf2,0xb6,0xde,0x28,0x55,0x10,0xfd,0x0e,0xc0,0xf4,0xfd,0x2a,0x11,0xae,0xbe,0x05,0xd3,0x33,0xc2,0xcd,0xc5,0xc3,0xad,0x26,0xea,0x29,0x6d,0x17,0xed,0x4d,0xe7,0xed,0xdc,0xcf,0xc8,0x49,0xfb,0xe5,0x07,0x20,0xbf,0x28,0xd9,0xef,0xca,0xe9,0xc4,0x8f,0xd7,0xc3,0xde,0xb5,0xf3,0xeb,0x99,0xac,0xf4,0xf3,0xe4,0xfd,0xfc,0x15,0xf6,0x09,0xc4,0xf0,0xf5,0xd0,0xf8,0xf7,0xb1,0xf9,0x0a,0xf8,0x2e,0xe6,0xf9,0xfb,0x15,0x15,0x0c,0x1b,0xf7,0xe8,0x08,0xd5,0x1b,0xfd,0xeb,0xfb,0xf4,0xe0,0xeb,0x10,0x00,0xf5,0xcf,0x1e,0xfb,0xd8,0x5a,0xf1,0x08,0xe0,0xd9,0x95,0xd4,0x47,0x0d,0x06,0x18,0xde,0x03,0xfd,0xfb,0xd3,0xed,0xe7,0x0c,0xeb,0x2c,0xe4,0x2f,0xfd,0xf0,0xf0,0xf9,0x08,0xdf,0xec,0x38,0xff,0xe9,0xc7,0xe0,0xc8,0xd1,0xcc,0x14,0x0e,0x03,0x78,0xd6,0xfc,0xf9,0xf1,0xed,0xf7,0xda,0x07,0x04,0x07,0xf0,0xee,0x26,0xef,0xd1,0xff,0x23,0x13,0xdf,0xfa,0x18,0xf4,0xe2,0xe5,0x17,0xfe,0xc6,0x25,0xf6,0xd2,0xe4,0xd0,0x19,0xf1,0x11,0xfe,0x02,0x09,0x3b,0x04,0xf1,0x13,0xbe,0xb8,0xf2,0xfb,0xf8,0x24,0x12,0x1b,0xfb,0x10,0xe1,0xf2,0x60,0xfd,0xed,0x30,0x2b,0x27,0x08,0x20,0xae,0xf7,0x06,0x13,0xee,0x00,0xfe,0x11,0x06,0x1b,0xe0,0xfb,0x0e,0x1a,0xc4,0xdf,0x1a,0xff,0xfd,0x15,0xfe,0xf3,0xfe,0x0b,0xea,0xfa,0x0e,0x0e,0x27,0xff,0x03,0xf4,0x22,0xff,0x02,0xf0,0xf9,0xf5,0xf4,0x39,0xf2,0xd4,0x07,0x00,0xf1,0xff,0xe8,0xf4,0xea,0x15,0x18,0xe1,0x25,0x05,0x2b,0xd3,0x05,0xf6,0x01,0xff,0x34,0x05,0x0e,0x7f,0x1d,0x02,0xee,0x0e,0xf8,0x16,0xdc,0xc7,0x12,0xbc,0xda,0xda,0x16,0x02,0xdd,0xd8,0xc7,0x10,0xe2,0x34,0x03,0xfc,0xfe,0xf1,0x15,0xe7,0xca,0xe0,0x10,0x07,0x02,0x16,0xfa,0xf9,0x05,0xb5,0xed,0xc8,0xc5,0xe5,0xe4,0x14,0xf9,0x0b,0x30,0xee,0xf5,0xbf,0x17,0xe2,0x19,0xc7,0xa5,0xc7,0xd5,0x3d,0xbe,0x1b,0xaa,0xc8,0x44,0x09,0xdb,0xf2,0x31,0xec,0xca,0x11,0xfb,0x5d,0xfe,0x0d,0x58,0x3c,0xb8,0xe9,0x3f,0xde,0xbb,0xeb,0x28,0xd5,0xff,0xce,0x06,0xb4,0xbb,0x81,0xdf,0x5e,0xff,0xe6,0xed,0x5f,0xae,0xe1,0x0a,0x23,0xcd,0x37,0x40,0x32,0x44,0x47,0xc2,0x9e,0x18,0xdb,0x49,0x4f,0x21,0xd3,0x10,0xd1,0x08,0xec,0xe8,0xa6,0x39,0x9e,0xad,0x23,0x37,0x88,0x16,0xc7,0x3e,0xa6,0xf4,0x10,0xe6,0xbc,0xf3,0x1d,0xc7,0x13,0x34,0xaa,0xc6,0xec,0xd4,0xb6,0x27,0xfa,0xf0,0x8e,0xe4,0xdb,0x0d,0x30,0xd3,0x3f,0xe3,0xef,0x2c,0xd6,0xa9,0xca,0xaa,0x27,0x55,0x21,0x1e,0xb4,0xf0,0xf0,0x00,0x08,0x0a,0xff,0xef,0xd7,0x36,0xd5,0xe2,0xee,0xca,0xf1,0x42,0xe6,0xfd,0x37,0xe8,0xde,0xe8,0xdf,0x21,0x17,0x4c,0x21,0xee,0x12,0xca,0x12,0xab,0xde,0xf4,0xe2,0xbd,0x8b,0x12,0xf2,0x21,0x28,0xd5,0x55,0xdb,0x41,0xad,0x48,0x33,0x21,0x4a,0x20,0xfb,0xf4,0x31,0x38,0x1c,0x08,0x5d,0x43,0x98,0xa6,0x3f,0xc6,0xe5,0xf9,0x3e,0x07,0xef,0x2e,0xed,0x1d,0x0d,0xe9,0xf1,0x26,0x16,0x12,0x10,0x01,0x3b,0x32,0xdf,0xc9,0x69,0x98,0x33,0x25,0x81,0xe2,0x02,0xff,0xc7,0x1f,0xe6,0x03,0xe1,0xc8,0x2d,0xe6,0x38,0xec,0x12,0x56,0x16,0xea,0x54,0xf4,0xd0,0x03,0x1e,0xf6,0xe8,0xe3,0x11,0xed,0x14,0xcb,0xf7,0xb8,0xcf,0xfb,0xa9,0xe9,0x00,0xdd,0xdd,0xfc,0xb6,0xae,0x0a,0x12,0xcd,0x06,0xa2,0xb9,0x0a,0x04,0xb1,0x4b,0xd5,0xe9,0x39,0x23,0x6e,0xa5,0xc3,0xd5,0xf4,0xb3,0xf1,0x08,0x16,0x64,0x3f,0xde,0xe2,0xba,0x09,0xe6,0xee,0xce,0xf5,0xab,0xd9,0x35,0xcc,0x0e,0xfe,0xe4,0x21,0x21,0x39,0x04,0x26,0x44,0xa5,0x2d,0x39,0xe0,0xfb,0x25,0x09,0x09,0xb7,0xf6,0xde,0x14,0x04,0x4a,0xcc,0x38,0xfc,0x12,0x36,0x93,0x36,0xd3,0xea,0xfe,0xf8,0xa2,0xd0,0x1e,0x03,0xc5,0xba,0xe8,0xf5,0x28,0xe8,0x18,0x2f,0xfe,0xf0,0xdc,0x4d,0x3b,0xdf,0x31,0x07,0x0e,0xd0,0xfd,0x24,0x1a,0xd9,0x26,0xcc,0x4a,0xd2,0xbf,0xdb,0xfc,0xe4,0x34,0x12,0xf4,0x26,0x59,0x15,0xce,0x3b,0xbe,0xe3,0xdf,0xf5,0x03,0xbc,0x20,0x73,0xfe,0xc9,0xe0,0x08,0xeb,0xc0,0x31,0xd1,0xab,0x08,0xd9,0xa5,0xda,0x3d,0xfc,0x39,0x28,0xdd,0xff,0xc0,0xd8,0x6c,0xf5,0xff,0x2d,0xd7,0x9e,0x1e,0xbc,0x1f,0xc6,0xf0,0x28,0xf2,0xad,0x25,0xbf,0x8a,0x37,0x34,0xf0,0x56,0xf2,0x4f,0x0d,0x30,0x0e,0x1d,0x17,0xf2,0xaa,0xea,0x18,0x29,0x06,0x06,0xf2,0x26,0x64,0x1c,0x01,0xcc,0x0d,0x0d,0x09,0x02,0xa4,0x08,0xdd,0x02,0xd2,0x36,0xe6,0x8c,0x2f,0x0d,0xdb,0xfe,0x3d,0x10,0x20,0x07,0xd6,0x0e,0x47,0x34,0x05,0xd3,0x8f,0x1d,0x12,0x29,0xcf,0xf8,0x1e,0xbd,0x50,0x4d,0xbf,0xdc,0xef,0xf2,0xeb,0x21,0x1c,0x08,0x02,0x0f,0xb3,0xce,0xcb,0xd8,0x04,0x2f,0x02,0x02,0xe4,0xa2,0xfa,0xed,0xca,0x81,0x08,0xd6,0xfb,0xd1,0x4f,0xd9,0x21,0x4b,0xe6,0x2d,0xeb,0xe0,0xb1,0x34,0xfb,0x2f,0x46,0xdd,0x39,0xed,0xd5,0xfb,0xe0,0x11,0xe9,0x0e,0xc2,0x39,0x22,0xce,0xd5,0xdd,0x28,0x99,0xe2,0xc0,0x99,0xea,0x0b,0x4a,0x0a,0x20,0xc2,0xb5,0xed,0xb2,0x52,0xba,0xe5,0xf9,0x1f,0xcd,0xc2,0xca,0xd5,0x18,0xd1,0xe7,0x44,0x25,0xaa,0xde,0x3c,0x8e,0xc6,0xf0,0x1a,0xe5,0x02,0xfd,0xf7,0x1a,0xf6,0x5f,0xc8,0xd8,0xf9,0x1d,0x06,0x8d,0xbd,0x5c,0xc7,0xb4,0xc6,0x25,0xd4,0x5a,0x34,0x11,0x9f,0x87,0xdd,0x1a,0x9b,0xe8,0x24,0xdf,0x1d,0x2d,0xce,0xf8,0x40,0x3a,0x16,0xd5,0xf8,0xcb,0xe6,0x09,0xf6,0xce,0x2f,0x06,0xd2,0x1b,0x25,0xaa,0xeb,0xd6,0xbc,0xf5,0x05,0x57,0x05,0x07,0xf8,0xbb,0x0a,0xab,0xe1,0x4a,0xb9,0xf4,0xc0,0xea,0xe0,0xc3,0xee,0x2c,0xe7,0xf9,0xdd,0x03,0xdd,0x58,0xf0,0xf0,0xd3,0xda,0x54,0x09,0xe0,0xc4,0xdc,0xc7,0xc7,0x3a,0x0a,0xb0,0xc6,0x06,0xe7,0x1b,0x00,0xc2,0x25,0xc5,0x0f,0xe9,0x2f,0xe0,0x16,0x17,0x16,0x14,0x25,0xd2,0x12,0xef,0x27,0x19,0xc5,0x0a,0xe7,0x10,0x08,0x96,0x41,0xfe,0x06,0x16,0x0c,0x20,0x3b,0xb2,0x0b,0xd9,0xe7,0xe5,0x09,0xf8,0xb8,0xec,0xe4,0x59,0xbf,0x2d,0x0c,0x49,0xff,0x58,0xca,0x00,0x05,0x2a,0x36,0xa7,0xf1,0x07,0xa0,0xb6,0x17,0x19,0xc6,0x1f,0x3b,0xe8,0x12,0x46,0xf9,0x29,0xeb,0x47,0x81,0x07,0x1a,0xfc,0x44,0x5f,0xe1,0xf0,0xba,0x40,0xeb,0x42,0xfa,0x1b,0xe8,0xe7,0xee,0xe9,0xf8,0x38,0xf9,0x4b,0x11,0x0e,0x03,0x26,0x06,0x19,0x0e,0xdc,0xc3,0x10,0x12,0x01,0xf1,0x3e,0xcd,0x06,0xdf,0xf3,0xb4,0x15,0x00,0x13,0xbf,0x56,0x9a,0xdb,0xf8,0xd8,0x37,0xcf,0xf5,0x22,0xd0,0x21,0x3f,0xd8,0x31,0xdd,0xfd,0xf7,0xe5,0x0a,0xc3,0xdd,0xe9,0xe9,0x1f,0x10,0x3f,0x81,0xfb,0x27,0xb4,0xa3,0xd7,0xf1,0xfc,0x12,0x61,0xff,0xfb,0x37,0x08,0xd7,0x32,0xf8,0xa0,0xfe,0x0d,0xeb,0xff,0xef,0xec,0xdf,0xc0,0x1a,0x3c,0xd1,0xe3,0xf4,0x3c,0xbe,0x1c,0xf2,0xed,0x0f,0xf2,0x36,0xd7,0x1d,0xfd,0x12,0x0a,0xf1,0x06,0xf9,0xb8,0xa5,0xf8,0xf5,0xbd,0x36,0x99,0xc6,0xf4,0x0b,0x56,0x17,0x61,0x21,0xa4,0xc0,0x43,0xe9,0x01,0xe6,0xcf,0xb2,0xe4,0x14,0x03,0xde,0xcc,0xf5,0x03,0xd5,0xa6,0x10,0xc0,0xe0,0xfa,0x19,0xbd,0xe2,0x29,0xd2,0xfa,0x4c,0x19,0xc4,0x3f,0x1d,0xf2,0x2a,0xde,0xd5,0x37,0xde,0xc8,0xbc,0x22,0x5c,0xf2,0x15,0xd2,0xde,0x32,0x24,0xbe,0xc9,0x23,0xe7,0x90,0x34,0x1b,0xf4,0xa4,0x45,0xe6,0x11,0x09,0xe7,0x22,0xf5,0x53,0x4e,0xc9,0xe3,0x26,0xe4,0x49,0x3a,0xd2,0x26,0xc1,0xff,0xd8,0x23,0x23,0x30,0xc4,0x04,0xc8,0xa0,0x3b,0x9b,0xfb,0x4a,0xdf,0x17,0x11,0xa9,0x08,0x0d,0x21,0x63,0x0e,0x3e,0x53,0x28,0xdc,0x1d,0x06,0xc6,0xb1,0xd3,0x22,0xf8,0x2c,0x03,0xcb,0x28,0xf7,0x0b,0x00,0xff,0xba,0xfb,0xf3,0x0e,0x2e,0xaa,0xe1,0x29,0x2c,0xd6,0xfc,0xc9,0xd9,0x23,0x27,0x04,0xeb,0x45,0x26,0xfc,0x11,0x81,0x3c,0x2b,0xf4,0x54,0xf9,0xd4,0x20,0x1c,0xf3,0xcd,0x0a,0x24,0xda,0x11,0xfb,0xfa,0xec,0xc3,0x69,0x17,0xff,0xcb,0xec,0x2b,0xde,0x3b,0x2a,0x2c,0x32,0xe5,0xa7,0x01,0xdf,0xe8,0xfe,0x2a,0x3f,0x50,0xe3,0xf1,0xfd,0x1b,0xb6,0xc8,0xd5,0x07,0x07,0xf9,0xeb,0x44,0xb8,0xf2,0x3a,0xe0,0x0e,0xb9,0xee,0xe2,0x08,0xdc,0xd3,0xd7,0xdd,0xf1,0xea,0xc9,0x24,0xe0,0x37,0xb8,0x39,0x3d,0x28,0x2d,0xcf,0xe9,0xad,0xbf,0x0b,0xf8,0xf0,0x20,0x0c,0xe5,0xa8,0xae,0x14,0x0c,0xe0,0x2e,0x24,0x18,0xa5,0x5f,0xca,0x24,0x12,0xdf,0x09,0xf2,0x1e,0xde,0xcc,0xe8,0xfc,0xe0,0xdf,0xa5,0xad,0xdd,0x3a,0x14,0x07,0x25,0x2c,0xf5,0x41,0xcd,0xdf,0x20,0x1e,0x04,0xe0,0x53,0x4d,0xf2,0x82,0xde,0xfc,0xca,0xf4,0xd8,0x3c,0x36,0xd6,0xb3,0x1e,0xff,0x07,0x2a,0xdc,0xb3,0xe3,0x17,0x13,0xdf,0x25,0xa7,0xd5,0x16,0x23,0x1b,0x1c,0x53,0xa1,0xb7,0x05,0x81,0xec,0xf7,0x5d,0xa0,0x5b,0x04,0x3e,0xbd,0x2d,0xaa,0xd3,0x00,0xa5,0x11,0x2e,0xe1,0x0a,0x83,0x27,0x37,0xb5,0xce,0x0d,0xd4,0x49,0xfe,0x3f,0xeb,0x17,0xfc,0x2e,0x0b,0x03,0xfd,0xc0,0x91,0xf1,0x51,0xc6,0xfb,0xd5,0xf6,0x02,0x05,0xd0,0x08,0xee,0x3a,0x05,0xaa,0x42,0xbb,0x09,0x22,0x13,0xd6,0xd0,0x57,0x2e,0x02,0x4a,0xc0,0xef,0x1b,0xdd,0xf1,0xe8,0x15,0x18,0xe6,0x35,0x17,0xad,0xf5,0x05,0x14,0x03,0x02,0x4a,0xda,0x09,0xea,0xfc,0x46,0x86,0xe8,0xcd,0xc9,0x1a,0x42,0xbb,0xca,0xd6,0xaf,0x34,0x3f,0xc3,0xd4,0xeb,0x1b,0x2e,0xdf,0x08,0x4c,0x03,0xed,0xd5,0xd5,0xe7,0x00,0x13,0x1c,0x04,0xe0,0x23,0x27,0xaf,0x36,0x86,0xa3,0xa3,0xed,0x2a,0x22,0x4a,0x07,0x15,0xe5,0xb4,0xef,0xe1,0x4c,0x26,0xfb,0x15,0x7d,0xdb,0xde,0x12,0x11,0xe8,0xbf,0xf3,0xa7,0x56,0xfb,0xbc,0x32,0xd0,0x05,0xfe,0xfd,0xca,0xef,0x0a,0x0f,0xc3,0xf7,0xfd,0xf8,0x13,0x16,0x1b,0x0d,0xc9,0xc0,0xeb,0xbb,0x43,0xd1,0xef,0x48,0xe9,0xd5,0xeb,0xee,0xd8,0x24,0x2c,0xfe,0x01,0x19,0xd7,0x05,0xe8,0x2c,0xcb,0x01,0x1b,0xf7,0xe1,0x0a,0xea,0x4f,0x27,0xdc,0xca,0x1d,0x41,0xdb,0x01,0x5d,0xd5,0xda,0x14,0xfd,0xf5,0xe0,0xdf,0x13,0x08,0x38,0x4b,0xef,0xd3,0xc7,0x14,0x00,0x24,0xe4,0xb3,0x38,0x3e,0xe7,0x11,0x1e,0x20,0x13,0x15,0xd7,0x06,0xf1,0xb7,0xfc,0xda,0xd8,0x02,0x09,0xc7,0xfa,0xc2,0xfe,0x1b,0xfd,0xe3,0xba,0x15,0xf6,0x02,0x08,0x03,0x7f,0x01,0xf7,0x1c,0xc2,0x05,0xe8,0xfe,0xf9,0x0e,0xd1,0x50,0xe4,0xe1,0x02,0xc8,0x3d,0xec,0x56,0x0b,0x16,0x09,0x19,0x19,0x33,0x10,0x0f,0xee,0xcb,0xe9,0xd5,0x07,0xe3,0x3b,0xef,0x05,0x1f,0x2f,0x19,0x44,0x2d,0xee,0x25,0x06,0x0e,0x00,0x11,0x1a,0x46,0x07,0x26,0x1b,0x1f,0xbe,0xf2,0x25,0xcb,0xe2,0xee,0xeb,0xe2,0x08,0x0b,0x17,0xfc,0xe5,0xc6,0xfe,0xd3,0x1b,0xc2,0x19,0x19,0x14,0x3a,0x10,0x35,0x1a,0x7a,0xfe,0x1d,0xfe,0xfb,0x09,0x0f,0xca,0x25,0x49,0x2c,0xb0,0xf9,0xd3,0xcb,0xdb,0x19,0x4e,0xd5,0xed,0xe0,0xec,0x4a,0xfe,0xee,0xcf,0xec,0x03,0xf6,0x2b,0xcc,0x18,0x1a,0xe6,0xf2,0x09,0xdc,0xcf,0xe2,0x07,0x01,0xf6,0xe7,0x00,0xdb,0xb4,0xc0,0x19,0xdf,0x07,0x59,0xd0,0x43,0xea,0xc8,0xd2,0x81,0xf3,0xec,0x08,0xed,0x0f,0xd9,0xe4,0xf5,0xd7,0xcd,0x3d,0x0d,0xe6,0x60,0xf6,0xd7,0x60,0xf6,0x04,0x0b,0xfb,0xfb,0x17,0xf5,0xec,0xef,0xe6,0x10,0xe0,0xc2,0x00,0x2a,0xd4,0xfe,0x11,0x20,0xd9,0xe8,0xf5,0x0c,0xde,0x22,0x05,0x36,0xb1,0xd5,0x0e,0xcd,0x1d,0xda,0x02,0xfc,0x03,0xdd,0x51,0xdd,0x0a,0xf9,0xe9,0x0e,0xf9,0xf3,0xcd,0xcc,0xf4,0x24,0x1a,0x08,0xf2,0x23,0xeb,0xed,0xce,0xff,0xdf,0x0f,0xf3,0xc4,0xeb,0x12,0xef,0x1b,0x47,0xca,0xc6,0xd0,0x01,0xfd,0x32,0xea,0x1e,0xfc,0xba,0xdd,0x14,0x0f,0xe3,0xef,0xe8,0xca,0x19,0xfb,0xdd,0x12,0x15,0xf6,0x02,0x1f,0x20,0x0e,0xe5,0x0e,0x03,0xf7,0xe9,0x06,0xf4,0xde,0x22,0xee,0x50,0x50,0x14,0xef,0x16,0xd7,0xce,0x15,0xf3,0xfe,0x2d,0xe2,0xf8,0xdf,0x1d,0xfa,0x0a,0x5d,0xf1,0x0c,0x1f,0x3e,0xfe,0x4b,0x00,0xc0,0xbf,0x02,0x04,0x10,0x1f,0x37,0xd9,0x2a,0x08,0xe4,0xfb,0x27,0x1b,0xe9,0xdc,0xde,0x33,0xf7,0x10,0xd9,0xf0,0xff,0x50,0x27,0xf1,0x1e,0x24,0x40,0xd2,0x06,0x17,0x11,0x17,0xf3,0xdf,0x11,0xe6,0x18,0x29,0xff,0xe3,0xd2,0xd6,0xcd,0xf4,0x0a,0xf1,0x0d,0x6d,0x08,0x11,0xfc,0x07,0xd6,0xc8,0x25,0xbe,0x04,0x02,0x1c,0xf5,0x01,0x2f,0x0a,0x0e,0xd9,0xf4,0xdf,0x1d,0xe6,0xd2,0x02,0xda,0x2c,0xc4,0x00,0xed,0x21,0xeb,0xcf,0x2a,0xf4,0xb5,0xfc,0xb4,0xc9,0x03,0xeb,0xf4,0xdd,0x04,0xf4,0x07,0xdd,0x10,0xf8,0xea,0xdd,0xf5,0x06,0xad,0xce,0xd6,0xf7,0x1a,0x21,0xdc,0x3d,0xd7,0x29,0xf8,0xed,0x1b,0x0d,0xc7,0x08,0xcf,0xc4,0x2a,0xe3,0x2c,0xec,0x27,0x1f,0xbe,0x28,0xd8,0xe0,0xab,0xb5,0xf0,0xd1,0xd0,0xeb,0x41,0xeb,0x11,0x06,0xd8,0xb9,0xd4,0x37,0xce,0x09,0x1b,0x07,0xf0,0x0b,0xde,0xe4,0xf4,0x04,0xd9,0x2d,0x1d,0xf0,0xf9,0x03,0xf1,0xb5,0xe2,0xd1,0xf2,0x38,0xf0,0x04,0xc8,0xb4,0xf8,0x18,0xc7,0x56,0xfe,0x0a,0xe3,0x16,0xfd,0x26,0xfd,0xeb,0xdf,0x09,0xf5,0xdc,0x15,0x04,0xd6,0xd1,0x22,0x18,0x81,0x0c,0xdd,0xb7,0x05,0xda,0xec,0x25,0xed,0x12,0x18,0x56,0xc9,0xab,0xd2,0x06,0xe2,0xeb,0xe5,0xb3,0xc6,0xec,0xf3,0x22,0xaa,0xfb,0x09,0x10,0xe8,0xd9,0xfe,0xdc,0x03,0x45,0xed,0x18,0x0f,0xab,0xfd,0xdf,0xeb,0xe1,0x19,0xb3,0xd1,0xfc,0xd5,0x3f,0x1a,0x04,0x9e,0xfc,0x1c,0x28,0xb4,0xd7,0xf4,0xe2,0xcc,0xf3,0x48,0x24,0xcb,0x41,0xf1,0x02,0xf1,0xbf,0x07,0xf3,0x5c,0xff,0xcb,0xd0,0xe8,0xc6,0x65,0xf3,0xb2,0x27,0x2a,0xe7,0xc4,0xd0,0x0d,0x93,0x06,0xdc,0xe7,0x0d,0x30,0x34,0xf8,0x03,0x23,0xf5,0x07,0xc1,0xfa,0x2f,0xe8,0x05,0x10,0xd0,0x36,0x31,0xe6,0xfa,0x9a,0x99,0xd7,0x01,0x0b,0x23,0xee,0xea,0x1f,0x02,0xd3,0x40,0xb5,0xb6,0x9f,0xfb,0xd8,0x11,0xce,0x01,0xf9,0xe4,0xf3,0xcb,0xb2,0xfb,0xd6,0xf0,0x1b,0x25,0xe4,0x14,0xea,0xa6,0x2b,0xee,0xe5,0x08,0xff,0x54,0x13,0xc7,0xd9,0xda,0x31,0xeb,0x18,0x0a,0x01,0xca,0x0d,0x57,0x2d,0x05,0x02,0xe8,0x06,0xfc,0xee,0x22,0xcc,0xfd,0x5e,0x18,0xfe,0xf8,0xef,0x3a,0x9d,0x09,0x1e,0xd5,0xa7,0xce,0x4d,0x0e,0xf7,0xd0,0xfc,0xd0,0xcf,0xb5,0xf6,0x3d,0x15,0x18,0xe1,0x9a,0xe1,0xdc,0x09,0x15,0x21,0x4e,0xf5,0x50,0x30,0xce,0xc2,0x11,0xe2,0xe1,0x2e,0xe1,0x2d,0xd7,0x11,0xd4,0xf3,0x3f,0x17,0xa1,0xc1,0xce,0xf4,0x47,0xdc,0x4e,0xf6,0xf3,0x30,0x61,0xd6,0xc4,0x11,0xe2,0xe7,0x9e,0x07,0xee,0xda,0x4c,0x41,0xb8,0x22,0x47,0xa9,0xea,0x10,0xc4,0x59,0x91,0xed,0x8e,0x38,0xe5,0x5a,0x22,0xe6,0x3b,0x7f,0x34,0xeb,0xbf,0x08,0xb4,0x05,0x46,0xa8,0xe8,0xc5,0x1d,0x23,0xed,0xcc,0x4f,0xf0,0x11,0x20,0x20,0x33,0xeb,0xf6,0x77,0xf6,0x0d,0xa0,0xfa,0x8d,0x49,0xcc,0x15,0x09,0x0a,0x35,0xdc,0xb3,0x4e,0xdc,0x31,0x0b,0xd6,0xb0,0x0c,0xff,0x64,0xf9,0xc8,0xe8,0x3c,0xea,0x46,0x11,0x26,0xf6,0x9a,0x1f,0xe5,0x36,0x32,0xf5,0x0f,0x4f,0xdb,0x0d,0xd2,0x0e,0xff,0x2b,0xda,0xca,0xa8,0x26,0xeb,0xdd,0x05,0x1b,0xa0,0x07,0x8a,0x38,0x27,0x3a,0x18,0x01,0xbe,0xbe,0x3e,0xd9,0x01,0xc6,0x44,0xb4,0xdf,0x1f,0x16,0xb9,0x21,0xfb,0xd8,0xf2,0xa3,0xd5,0xf5,0xf2,0x06,0xc5,0xc5,0xf7,0x3f,0xd3,0x41,0xf8,0xd1,0xf9,0xe0,0xbf,0x0e,0xdb,0x94,0xe5,0x05,0x03,0xfe,0xd2,0x3b,0xf0,0x01,0xcc,0x04,0x98,0x15,0x09,0xae,0xa4,0x22,0x2b,0xab,0x03,0x21,0x2c,0x30,0x38,0x44,0xee,0x12,0xf9,0xfe,0x15,0xb1,0x49,0x5d,0x01,0x9c,0x31,0x91,0x3d,0xeb,0x1d,0xa9,0xe0,0xe7,0xcf,0xde,0x26,0xcf,0xef,0x14,0x0f,0xbc,0x0d,0xe9,0x96,0xe0,0xec,0xe8,0xc7,0x1c,0x06,0xe1,0xc2,0xe0,0xff,0xdc,0xfc,0xf3,0xe2,0xe2,0x01,0x21,0xd3,0x3b,0xf3,0x18,0x19,0xff,0xe4,0xcf,0xbf,0xe9,0xd0,0x39,0xe2,0x12,0xe6,0xf2,0xf3,0xf9,0xe8,0xe2,0xf5,0xf6,0x29,0x9b,0xa9,0x74,0xb8,0xef,0xb4,0xef,0xc4,0xfe,0x35,0x27,0x0a,0x05,0xf9,0x03,0x15,0x15,0xd9,0x12,0x29,0xf6,0xeb,0x2d,0x0c,0x16,0xf7,0xee,0xc2,0xb9,0x1d,0xd5,0xef,0x46,0xf1,0x0f,0xe0,0x07,0xcf,0xc6,0x1d,0xec,0x07,0x11,0x26,0xf4,0xde,0xc1,0xf0,0xea,0x1a,0xda,0xe5,0x3b,0x34,0xd4,0xd6,0x0a,0xf9,0xc6,0xe0,0x0b,0xdf,0x1b,0xb4,0xfa,0xf0,0xf7,0x0a,0x0e,0xcc,0xcd,0x01,0xd6,0x9f,0xbf,0xdc,0xe0,0xee,0xe8,0xf7,0xd9,0x50,0x25,0x13,0xfb,0xe9,0xb0,0xe5,0xfb,0x4a,0xd3,0x02,0xad,0x34,0xc4,0xf8,0xf9,0xe3,0x5f,0xfa,0x01,0xf0,0xff,0xf7,0x0e,0xf2,0xca,0xe6,0xfb,0x0f,0x08,0xf2,0xfb,0x11,0xe2,0x15,0xcc,0xd5,0x19,0x08,0xad,0xeb,0x1a,0xe5,0x14,0xd4,0xf0,0xf3,0x0a,0x1f,0x1a,0xf0,0xf7,0x17,0x19,0xda,0x1e,0xf4,0x20,0x07,0xdb,0xe0,0xb4,0xef,0x3c,0x03,0xe2,0xf0,0xca,0x44,0xfa,0xea,0xf2,0xec,0xef,0xfa,0x14,0xc5,0x3e,0x1b,0x2f,0xfc,0x07,0xe3,0x05,0x24,0xf3,0xec,0x10,0x7f,0xfe,0xed,0x28,0xee,0x98,0x1e,0xe1,0xb4,0xee,0x0d,0xbe,0x04,0x3a,0xcf,0xdb,0xa5,0xda,0xd9,0xed,0x2a,0x31,0x00,0xfe,0xfb,0xf9,0xe7,0xfa,0xa4,0xc6,0xe2,0x02,0xea,0xfc,0xeb,0x14,0xed,0x11,0x28,0xd6,0xd7,0xed,0xef,0xf1,0xef,0xc9,0xe4,0xf6,0xe5,0x47,0x21,0x0e,0xcf,0xa0,0x40,0xce,0xe1,0x3c,0xe9,0xd9,0xbd,0x13,0x14,0x01,0xe0,0xc7,0xef,0x39,0xf1,0x06,0x09,0x32,0x30,0x95,0x10,0xf4,0x45,0xd0,0x1c,0xe1,0xaa,0x2f,0x18,0xeb,0xc9,0xf3,0xa4,0x1f,0xd4,0xda,0x0e,0xd0,0x3a,0xfc,0xf6,0xa3,0x20,0xe2,0xfa,0x09,0x5b,0x17,0x26,0x25,0x08,0xf7,0xed,0x2d,0x18,0xc9,0xfb,0xc0,0xe0,0x09,0xdb,0x02,0x0f,0xf1,0xdd,0xbd,0xba,0xd8,0xbd,0x12,0xca,0xbb,0xcf,0xf5,0x3a,0x34,0xf9,0xfe,0xd7,0x10,0xfa,0x0c,0xfa,0xe5,0x23,0x04,0xf7,0xf1,0x0f,0xde,0xcf,0x90,0x31,0x05,0x4b,0xfa,0xe6,0xef,0xf4,0xd9,0x01,0x03,0x39,0x02,0xa8,0xe7,0xf5,0x13,0x36,0xd9,0xff,0x90,0xbe,0xf0,0x02,0x45,0xb4,0xc2,0x22,0x28,0x9f,0xed,0xf5,0x13,0x15,0xfd,0x18,0xeb,0x3b,0x22,0x00,0xfa,0xdd,0xe4,0xcc,0xd1,0x25,0x28,0xf2,0xb8,0xde,0x16,0x25,0x0f,0x0e,0xe5,0xcd,0xf1,0x1e,0x29,0xe1,0xfb,0x2b,0xb6,0xe4,0x02,0x00,0xe3,0x29,0xe1,0xda,0x4d,0xf2,0xf7,0x03,0xc3,0xed,0xc8,0x28,0xf8,0xdd,0xfe,0x45,0xf2,0xb0,0xe7,0x31,0xd0,0xf7,0xf5,0xdd,0x2e,0x18,0xc7,0x03,0xeb,0xbb,0xd4,0xb9,0x2c,0xd6,0xef,0xea,0x29,0xf2,0xfb,0x0f,0xa6,0xcd,0x32,0xe9,0xf5,0xed,0x2c,0xe3,0xe6,0x10,0xb0,0xd0,0x49,0xef,0xfb,0xab,0xeb,0xf7,0xfd,0x31,0xef,0xdf,0xec,0x08,0xd9,0x35,0x81,0xc6,0x24,0xf0,0x5a,0xb0,0x30,0x3d,0xe9,0xbc,0xdc,0xd8,0x1b,0xf2,0xcc,0x1c,0xaf,0x98,0x09,0xac,0x38,0xda,0x05,0x0a,0x3b,0xcf,0x28,0xff,0x35,0xdc,0x07,0x20,0x27,0x57,0xe3,0xc4,0x08,0x16,0x0d,0x30,0x81,0xab,0x15,0xe1,0x10,0x27,0xa8,0xd1,0xcd,0x42,0x0a,0xf0,0xed,0x0d,0x08,0xc7,0x30,0xe3,0x38,0x0b,0x24,0xe6,0x26,0x30,0x59,0x1b,0xac,0xf4,0xc6,0xb0,0xdd,0x52,0x15,0xb3,0x2f,0x8b,0x0a,0xb8,0xc2,0x53,0x1f,0xae,0x05,0xf7,0x45,0x9e,0xb9,0xb4,0x2d,0xe0,0x10,0xe3,0x07,0x1e,0xef,0xd1,0x39,0x9b,0x34,0xe6,0x17,0x5c,0xec,0xc4,0xe4,0xf8,0x42,0xf9,0xdd,0x2a,0x10,0xb8,0xa4,0x24,0xf8,0x00,0x53,0xd0,0x0e,0xdc,0x9b,0x26,0x7d,0xfa,0x1f,0x3d,0xe7,0xeb,0xc5,0xf1,0xc3,0x0d,0xeb,0xc6,0x27,0x11,0x4b,0xd0,0x13,0xf3,0xc5,0x05,0x35,0x2f,0x06,0xcc,0xb9,0x2a,0xc4,0x24,0xef,0x39,0xf7,0xa9,0xcf,0xdf,0xb0,0xfd,0xa3,0x16,0x23,0x16,0x00,0xe5,0xbd,0xc8,0xed,0xdf,0x84,0x03,0xc2,0x03,0x27,0xee,0xf5,0xf0,0xde,0x2a,0x16,0x01,0xba,0xd6,0xe0,0x08,0xf6,0x10,0xd0,0x13,0xeb,0x31,0x17,0x2b,0xc1,0x20,0xfa,0xeb,0xf1,0x21,0x11,0xe4,0xc4,0xf8,0xfd,0xf3,0x46,0x25,0x17,0xfd,0xe0,0xfb,0x00,0xd9,0xdb,0xa4,0xdc,0x02,0xae,0xfa,0xe0,0xd8,0xe2,0xf0,0x11,0xf2,0x1d,0x2f,0x44,0x0d,0x28,0x14,0xb4,0x06,0xe0,0xe2,0x36,0x41,0xf0,0xc9,0xf5,0xd5,0x47,0x54,0xda,0xdd,0x8a,0x04,0xed,0xae,0x08,0x64,0xba,0x60,0xfc,0x11,0xe2,0x05,0x01,0x6b,0x07,0xf5,0xc9,0x14,0xd5,0xfd,0x18,0xf0,0x2f,0x06,0xf9,0x19,0xf2,0x2c,0x52,0xa9,0x76,0xe0,0xd4,0xae,0xc2,0xdb,0xd4,0xef,0xb9,0xee,0x44,0x1c,0x13,0xf2,0xdc,0xfb,0xfc,0xb2,0xed,0xed,0xf4,0x0a,0xbd,0xee,0xfa,0xdd,0xf6,0xec,0xfb,0xda,0xb2,0xf9,0x0e,0xf1,0x2c,0x1d,0x08,0xde,0xcd,0xf0,0x0d,0x0a,0xfe,0xbc,0xdd,0xfa,0x30,0x18,0xd7,0x08,0xcc,0xd3,0xf7,0x03,0x09,0x15,0x00,0xfe,0x0e,0xd0,0xed,0x35,0x0c,0xb6,0xf3,0xbb,0x3d,0xec,0xf5,0x23,0xfe,0x26,0x5c,0xed,0x06,0xd1,0xaf,0xe7,0x21,0x37,0xde,0xd9,0x28,0x7f,0x0d,0x17,0x16,0x13,0xa0,0xfc,0xf2,0xd5,0x26,0xbb,0xdc,0x19,0x1d,0x3f,0x43,0xd7,0xed,0xfa,0xcd,0x0f,0x94,0x22,0xfd,0x1c,0xfd,0xe2,0xf6,0xde,0x03,0x04,0x20,0xcd,0xc7,0x9d,0x29,0x0b,0xf5,0xec,0xfc,0x48,0xfb,0x70,0xef,0xbc,0xd8,0x13,0xc8,0x48,0xfc,0xdf,0x31,0xeb,0x42,0xcd,0xee,0xcf,0x28,0x1f,0xf7,0xaa,0x0f,0xd6,0xd9,0xd0,0xfa,0xda,0xb7,0xfc,0x01,0xbb,0x22,0xe5,0xe2,0x1e,0xf0,0x00,0x0d,0x06,0xc9,0xd7,0xea,0xef,0x20,0x02,0xbd,0x0e,0xec,0x19,0xed,0x12,0xff,0xdb,0x00,0x40,0xed,0xec,0xb7,0xd5,0xd5,0x02,0xd2,0xdc,0x17,0xcb,0x0c,0xed,0xe7,0x01,0x0c,0xe0,0xd5,0xf0,0x23,0xdb,0xe0,0xfc,0x0f,0xf6,0x25,0x21,0xfd,0xf3,0x45,0x05,0x19,0x10,0x12,0xcb,0xf6,0x2d,0x99,0xdf,0x36,0xfd,0xb5,0xee,0xe3,0xdf,0x41,0xf3,0x03,0xea,0xd0,0x03,0xdb,0x20,0x1f,0x30,0xf8,0x3b,0x15,0x08,0xc0,0xe1,0xff,0xf2,0xf0,0x0b,0xf0,0x19,0x71,0x0d,0xe8,0xcb,0xd2,0xf1,0x27,0xed,0xeb,0x12,0xd6,0xfd,0x5a,0xf4,0x37,0x17,0xd6,0xb9,0x23,0xdc,0x02,0xad,0x0d,0xf7,0xcb,0xc4,0xb8,0x3e,0x15,0xf8,0xec,0xfd,0x06,0xd1,0xa0,0xe0,0x4c,0x34,0xef,0xb7,0xef,0xdc,0x27,0xbd,0x01,0xc3,0x3e,0xf1,0xda,0xd7,0xa1,0xde,0xfe,0x39,0xee,0xaa,0x09,0xdd,0xf4,0xc8,0x00,0xaa,0xc7,0xc3,0x19,0x08,0x33,0xf0,0xe5,0x24,0x3b,0x14,0xf1,0xc2,0xcc,0xcd,0xea,0xe0,0x44,0xdd,0xca,0xbd,0xf3,0xd1,0x01,0xfe,0x45,0x26,0x0c,0xe3,0x10,0x2d,0x0e,0x24,0xd0,0xd7,0x32,0xcf,0x25,0xf3,0x2b,0xe1,0x04,0xfe,0xf7,0x2b,0xdb,0x02,0x37,0x11,0xce,0xcb,0x39,0x12,0xbc,0xf1,0x0d,0x1e,0xf8,0x04,0x49,0x00,0xd7,0xe3,0xd6,0xf8,0xe5,0xf2,0x38,0x16,0x11,0xde,0xd4,0xee,0x29,0xee,0x14,0x1a,0xfc,0x1f,0xc2,0xfc,0x51,0xaf,0xe2,0x1f,0xbf,0xf5,0xdf,0x23,0xcd,0xc7,0x05,0xce,0xd3,0xf8,0x0e,0xfa,0x56,0xef,0xcf,0x4d,0xfb,0xa6,0xd2,0x08,0xe2,0xe6,0xde,0x2c,0xe8,0xc7,0x27,0xa8,0xf1,0xd2,0xe6,0x15,0x0d,0xf9,0xfc,0xd8,0x49,0x2c,0x2a,0xd5,0x0d,0xf6,0x13,0x1c,0x14,0xe3,0x15,0x0a,0x06,0xf1,0x2e,0x08,0xfd,0x2b,0xf2,0x81,0x02,0xcd,0x3e,0xd5,0xe3,0xb0,0xd3,0x22,0x13,0x09,0xd5,0xc8,0x25,0xe0,0x20,0x21,0xde,0xf8,0xf1,0xc1,0x0b,0xf8,0xbd,0xd7,0x0b,0x2e,0xeb,0xe5,0xeb,0xa5,0xee,0x01,0x17,0xe7,0xe7,0xbd,0xcf,0xdd,0xff,0x19,0xea,0xec,0xe7,0xf3,0x35,0xd0,0x11,0xb8,0xae,0x19,0xef,0x4e,0xd7,0xaf,0xde,0xf9,0xa7,0x14,0xf3,0xed,0xe8,0x14,0xeb,0xd1,0xad,0xce,0xff,0xd3,0xff,0x2d,0x56,0xbe,0xee,0xba,0xc1,0xae,0x44,0xe9,0xe5,0xc0,0x21,0xf2,0xc6,0xf7,0xce,0x02,0xfb,0xa6,0x47,0x1f,0x30,0x05,0x03,0xf6,0xd9,0xdf,0xc0,0xdb,0x11,0xf3,0xa8,0xd9,0x12,0xcc,0x93,0xe3,0x37,0xff,0xd1,0xe0,0xeb,0xdf,0xdb,0x11,0xcf,0xdf,0x36,0xe9,0xb7,0x00,0xf7,0x1b,0xad,0xd6,0xe6,0x24,0x31,0x19,0x06,0x03,0xcd,0xe7,0x01,0x19,0xf6,0xf9,0xf9,0x2b,0xfc,0xed,0x18,0xb6,0x5a,0xe3,0x0c,0xd8,0x07,0x32,0x15,0x1b,0xf5,0xc1,0xe0,0x37,0xcd,0x25,0xd2,0xcb,0x43,0x4d,0xd6,0x0f,0x17,0xcc,0xe4,0x1f,0xcd,0x9a,0x3e,0x1b,0x0a,0x30,0xed,0xcd,0x2a,0x44,0xc7,0xfa,0xf9,0x0f,0xd0,0xe3,0xf5,0x8b,0xf6,0xa7,0xc4,0x9f,0xdf,0xe4,0x12,0x22,0xd2,0x26,0x12,0xfa,0x19,0xdc,0xb9,0x1b,0x2b,0x09,0x09,0x57,0x93,0x95,0x02,0xea,0xef,0x16,0xf3,0x3e,0x04,0xf1,0xe3,0xf2,0x32,0xc4,0x43,0x29,0xd1,0x33,0xfa,0xcd,0x05,0x4d,0x24,0xe0,0xd1,0x1e,0x28,0x14,0x50,0xfb,0x1e,0x0e,0xe7,0x09,0xc4,0x0c,0xed,0x08,0x09,0xbc,0xf7,0xe4,0x00,0xf4,0xeb,0x0e,0x08,0xf2,0xfd,0x05,0x07,0x19,0xba,0x3e,0xcc,0xcb,0x40,0xea,0x01,0xf4,0xb8,0xee,0x21,0xa5,0xf6,0x25,0xf8,0xe0,0xeb,0xe9,0x34,0xf3,0x0f,0xb2,0x1e,0xca,0xf1,0xb1,0xd4,0xed,0x04,0x1c,0xff,0xe0,0x2f,0xa0,0xe4,0x03,0xa0,0xf3,0xd8,0xf3,0xfe,0x23,0xcf,0xe7,0x1a,0x07,0x0a,0xdb,0x81,0x75,0x3f,0xf1,0x3f,0x00,0x0d,0x0e,0xaf,0xf7,0x2e,0xfc,0x01,0x01,0xe5,0x30,0x21,0xfd,0xd3,0xd8,0xf0,0xfc,0x27,0x00,0x04,0xfc,0x3b,0xef,0x10,0xe8,0x16,0xfd,0x15,0xef,0x07,0x03,0x06,0x18,0xe2,0xd4,0xf1,0x2d,0x0f,0xe1,0xd6,0xc2,0xeb,0xf7,0xae,0xcd,0xfa,0xf1,0x11,0xed,0x00,0xf3,0xd2,0xe0,0xf8,0xbe,0x00,0x15,0x23,0x03,0x1d,0xbb,0xeb,0x03,0x05,0x12,0x26,0x0e,0xdc,0xef,0xce,0xe4,0xe3,0x06,0xef,0x35,0x3c,0x11,0xeb,0xfc,0x0c,0xf9,0xde,0xec,0x3f,0xf2,0x1a,0xc1,0xed,0x06,0x2d,0xef,0xc8,0xe2,0xf3,0xb4,0xf6,0x23,0x03,0xdd,0xd0,0x28,0x10,0xca,0xed,0xe9,0x1d,0x0a,0xed,0xd9,0xfe,0xd7,0xe6,0x21,0x02,0xca,0xda,0xe2,0xed,0x07,0x3a,0xf5,0xd3,0xe7,0xd9,0xed,0xcf,0xca,0x0b,0x07,0xee,0xfe,0xe6,0xf2,0xff,0xfb,0x08,0x0b,0xe9,0xf2,0xf5,0xda,0x02,0xce,0x33,0xf4,0xd1,0xd7,0xe1,0x1b,0x43,0xfb,0xfd,0xb3,0xec,0x19,0xe5,0xe1,0xfc,0x02,0xf4,0x1a,0xbb,0x28,0x06,0xcc,0x41,0x22,0xd2,0xf5,0xf4,0x0a,0x02,0x7f,0x16,0xb8,0xbd,0xe6,0xea,0xf0,0x0e,0xf5,0xf8,0x01,0xc0,0x15,0xd1,0xfb,0xd3,0xed,0x13,0xce,0xd2,0xe8,0x07,0xf6,0x00,0x2c,0xe3,0x09,0xf6,0xf4,0x09,0x11,0x1e,0x0d,0x09,0x35,0xf5,0x18,0x13,0xd2,0xc0,0xd4,0x0e,0xf1,0x00,0x17,0x2d,0xce,0xf2,0x37,0x33,0xfe,0x0f,0x99,0xe5,0xe9,0x10,0xd6,0x05,0xf9,0xd5,0xd8,0xc6,0xce,0x07,0xd1,0xbc,0x15,0xf9,0x0c,0x1c,0x2a,0xf1,0x3d,0xb9,0x12,0x76,0xba,0xf4,0xe8,0x27,0x19,0x1d,0xf4,0x15,0x37,0x10,0x06,0xf3,0xc3,0x06,0xfb,0x39,0xdb,0xee,0x11,0xeb,0x18,0xf9,0xe4,0xe7,0x55,0xec,0xff,0xd4,0x14,0xe4,0xd3,0xfa,0xea,0xdf,0x0d,0xbd,0xe4,0xf2,0x3b,0x00,0x06,0xc7,0x33,0xbc,0xde,0xf8,0xe6,0x01,0xe6,0xd7,0xd7,0xd8,0x3c,0xd7,0xf8,0xd0,0xd5,0xe7,0xf3,0xfe,0x16,0xfc,0xfa,0xf4,0x02,0xd3,0xfd,0x37,0x04,0xc2,0x0d,0xde,0xed,0x11,0x24,0x0d,0x1c,0xf7,0x01,0xfd,0xed,0xda,0xd6,0x3a,0xb1,0xda,0x04,0xf9,0xeb,0xd8,0xf0,0xe5,0x00,0xe4,0x0a,0x3b,0x05,0xdc,0xc9,0x40,0xae,0xdf,0x12,0x04,0x52,0xf8,0x3c,0x29,0xfe,0xe3,0x28,0xff,0x03,0x10,0xe4,0x0e,0x14,0xec,0x0c,0xd0,0xc5,0x09,0xfe,0xb9,0xf8,0xf6,0x19,0xdf,0x29,0x0d,0xf4,0x31,0xf0,0xfa,0x32,0x0e,0xd0,0xd4,0xf6,0xfb,0xf3,0x2a,0x08,0xfe,0xc4,0x0e,0x32,0xc7,0xd4,0xf3,0x0a,0xdc,0xf6,0xec,0x10,0x7f,0xfa,0x11,0xd2,0xe0,0x3f,0x1b,0xb4,0x2b,0x01,0xd5,0xeb,0xe1,0xef,0x0c,0xc1,0xd0,0xd3,0xfe,0xe8,0xee,0x29,0x11,0x05,0xe0,0x17,0xc7,0xf0,0xe3,0xe9,0xd6,0x05,0xeb,0xeb,0xa2,0xdc,0xfd,0x04,0x18,0x03,0xe8,0xd1,0x3a,0xd0,0x08,0xea,0x11,0x1b,0x1e,0x1c,0x23,0xf2,0xf5,0x00,0xf2,0x1d,0xf0,0x01,0xf5,0xf0,0xe2,0xfe,0xfc,0xf7,0x0b,0x03,0xf3,0x28,0x04,0xfc,0xb4,0xf6,0xf5,0x1f,0xe3,0xd9,0x23,0x11,0xb0,0xe3,0xe8,0xe0,0xe3,0x0e,0x23,0xf0,0x07,0x08,0xc8,0x0b,0x1c,0xe1,0xd8,0x0f,0x1d,0xf1,0xf0,0x24,0xdb,0x4d,0x06,0x1e,0x1e,0xd5,0x0d,0x01,0x0b,0x03,0xff,0xc7,0xf9,0x25,0x04,0xd5,0x20,0x0c,0x0c,0xee,0x26,0xfc,0x23,0x11,0xfc,0xd3,0x06,0x3c,0xc4,0xaf,0xed,0xd5,0xfc,0xe7,0x2e,0xea,0xf1,0xf9,0xfb,0x03,0x30,0xfb,0xe4,0xf7,0xe3,0x0e,0xfd,0xe0,0xf9,0x07,0xf7,0xcc,0xfc,0xe3,0xe6,0xd4,0xe8,0x1c,0xff,0xb3,0x28,0xf5,0xe6,0xfc,0x08,0xd8,0xe2,0x0c,0x0c,0x4c,0x10,0x19,0x0a,0xc7,0x12,0x14,0x04,0x22,0x0d,0xdb,0xe0,0xe5,0x26,0xe5,0x0e,0x1b,0xed,0x16,0xc3,0xd1,0x7f,0x07,0xc1,0x02,0x0c,0x13,0x2d,0x11,0xcc,0x15,0xf3,0x02,0xed,0xc4,0x10,0xce,0xc8,0x1a,0xeb,0xf7,0x19,0x25,0xe5,0x12,0x20,0xfe,0x22,0xfa,0xb5,0xd6,0xed,0x1b,0x0b,0xd7,0xfb,0xb1,0xdc,0xff,0xef,0x40,0x2f,0xf9,0xf0,0xd1,0xd7,0xe6,0xe9,0xf6,0xe1,0xeb,0xe2,0xea,0xf0,0xe0,0xce,0xbf,0x0d,0xdd,0xd2,0x07,0x09,0xd0,0xa1,0x18,0x11,0xdf,0x0f,0xcc,0x2f,0xe1,0x3e,0xf2,0xfe,0xbd,0x05,0x00,0xbc,0xba,0xb9,0xf4,0x03,0xd4,0xc6,0x01,0xfa,0xfb,0x27,0xfd,0xef,0x25,0xe2,0x03,0xf7,0x30,0x06,0xc4,0x94,0xf7,0xe2,0x0c,0xeb,0xd9,0xf5,0x14,0xc6,0x0b,0xff,0x0b,0x2b,0xf3,0x11,0x24,0xe5,0xd8,0xf6,0x04,0x2d,0x19,0x1a,0x0e,0x18,0xcd,0xf8,0x11,0x0f,0x08,0x2e,0xdb,0xe1,0x3d,0x05,0xbd,0xde,0x13,0xf4,0xd4,0x0e,0xd6,0xe1,0xcd,0xfd,0xde,0x3a,0xd0,0x34,0xf2,0xe1,0xd8,0x34,0xc4,0xdd,0x11,0xd2,0xff,0xda,0xf6,0xec,0xd1,0xbd,0xe4,0xdd,0xfc,0x22,0x13,0x1f,0x38,0xd0,0x24,0x0f,0xfe,0x1a,0xdf,0xde,0x2b,0x35,0xe8,0x34,0x1e,0x13,0xf2,0xfb,0xac,0xf1,0xe6,0x3d,0xe7,0x20,0xf6,0x14,0x0f,0xe8,0xfe,0x26,0x21,0xf2,0xc9,0x20,0xc4,0x2f,0xc4,0x33,0xc9,0xed,0xfa,0xcf,0x10,0xe1,0xd0,0xa9,0xcd,0xe1,0xfb,0xf3,0xfc,0x4e,0xcc,0x2f,0x19,0x10,0x84,0x18,0xdf,0x44,0x19,0xf7,0xb5,0xc7,0xdb,0xca,0xef,0x0d,0x08,0xf7,0x81,0xb1,0xef,0xd4,0x3c,0xab,0xc6,0xbc,0xef,0xfd,0x0c,0x1e,0xd6,0x0a,0xfa,0x4f,0x09,0xec,0x39,0x2c,0x25,0xe0,0xca,0xf2,0xff,0xd1,0xf8,0xf7,0x2e,0xfd,0x13,0x14,0x09,0xef,0x04,0x01,0xa9,0x39,0x1b,0xd1,0x14,0xdb,0xc2,0x08,0x01,0x40,0xd3,0xff,0x2b,0x09,0xb2,0xeb,0x03,0x01,0x0c,0x2b,0x25,0xf3,0xe1,0xe5,0xe2,0x71,0xf0,0xfc,0x0d,0x04,0xe7,0xaf,0x11,0xb7,0x16,0xf0,0xf1,0x40,0xaf,0xe5,0xf0,0x0d,0xf7,0xd3,0xff,0x2b,0xa6,0x2c,0xc8,0x1b,0xff,0xb5,0x03,0xe1,0x10,0xd2,0xf8,0x00,0x15,0xe0,0xfd,0xed,0x5a,0xeb,0x16,0xed,0x0b,0xc2,0xf6,0x03,0x0a,0xf1,0xd5,0x01,0x24,0x0e,0xbe,0xfa,0xf1,0x01,0x02,0x28,0x19,0xee,0x1d,0x15,0x0e,0xf2,0x12,0xa8,0x01,0xee,0xff,0x34,0x11,0xf0,0x2f,0x27,0xee,0xf6,0xeb,0xfb,0x09,0xcb,0x21,0x1c,0x2b,0x29,0x10,0x1e,0x06,0x07,0x20,0x3c,0xfa,0xd9,0xb6,0x04,0x42,0x30,0xdd,0x2d,0xe8,0xf6,0xcd,0xfb,0x0a,0x1d,0xf2,0x5f,0xe6,0x05,0x2c,0x0d,0xdc,0x28,0xec,0xe6,0x08,0xf9,0x28,0xca,0x1b,0x0e,0xdd,0x12,0xc1,0xdf,0x06,0xe8,0xeb,0x3e,0x25,0xea,0xf7,0xbd,0xf5,0xdb,0xdf,0xdc,0x4a,0x27,0xff,0xff,0x08,0x19,0x90,0x1c,0xe5,0x3d,0xe6,0xf8,0xf8,0xcc,0x0e,0xd7,0xf3,0x1e,0xd7,0xae,0xd1,0x14,0xd2,0xfa,0xa2,0xe6,0x25,0x41,0x39,0xff,0x17,0xef,0x0e,0x19,0xac,0x11,0xd1,0x08,0x08,0xc5,0xf3,0x27,0xbb,0xfd,0xe9,0xd5,0x8e,0xdf,0x15,0xcf,0xe0,0xd9,0xfd,0x10,0xe6,0x28,0xee,0x1a,0xe9,0xed,0x81,0xca,0x0d,0xba,0x0a,0xc4,0xd5,0xe4,0xe9,0xd0,0xdc,0xf7,0xa9,0xe7,0xbc,0x40,0x0b,0x09,0xe4,0xf6,0xb2,0x12,0xf0,0x69,0x44,0x06,0xef,0x11,0x16,0x54,0x2f,0xe8,0xb4,0x9d,0x25,0xdb,0x0e,0x0f,0xee,0x17,0x18,0x14,0xbc,0xfc,0x0b,0x27,0xd5,0xef,0xbb,0x19,0xd9,0x01,0x07,0xf4,0x13,0x45,0xb3,0x0d,0x0b,0xb2,0xbb,0x25,0x0a,0x25,0x00,0xe2,0x13,0xfb,0xff,0xb8,0xe4,0xf5,0xdd,0xbb,0xff,0x3a,0xcb,0xd6,0xf5,0x09,0x41,0x10,0xd5,0xef,0xca,0xf2,0x31,0x90,0x0e,0x28,0xed,0x00,0xd8,0x3f,0xc5,0xe5,0xf8,0x42,0x3a,0x30,0x2a,0xee,0xff,0xd0,0x2f,0x0d,0xb1,0xe2,0x07,0xe3,0x3a,0xdb,0xa2,0xe7,0x3d,0xf5,0xcf,0xf7,0xec,0x08,0x3d,0x29,0x0d,0x04,0xe8,0x8a,0xe8,0xd4,0x40,0xdc,0xf6,0xeb,0xc9,0xd0,0xdf,0xeb,0xec,0xf9,0xff,0xcb,0x43,0xef,0xe3,0x25,0x03,0x19,0x01,0x01,0xd3,0x21,0x36,0x1f,0x2d,0x08,0x2d,0xce,0xff,0xf3,0xe3,0x08,0xeb,0xf1,0x02,0x35,0x19,0x62,0x26,0xd6,0xd3,0x18,0x37,0xd9,0xc5,0x36,0x32,0xf1,0xb8,0x59,0xe3,0x48,0xf7,0xdf,0xd6,0xea,0xd4,0x30,0xfb,0x33,0x5f,0xbc,0xc1,0xf6,0xe5,0xb5,0x31,0x02,0x1f,0x24,0xee,0xe8,0xe5,0x6a,0x9b,0x02,0xdd,0x2f,0xf5,0x21,0x2d,0x1e,0xc9,0x2c,0x15,0x08,0xc5,0xbe,0xd5,0x2d,0xfc,0xe3,0x8b,0x13,0xd0,0xee,0x0d,0x1e,0x66,0xec,0x10,0xe8,0x1e,0x2e,0xeb,0xdd,0x45,0xca,0xc1,0xfe,0xcc,0xfe,0xb7,0xbd,0xc9,0xc3,0x1f,0xc2,0xb1,0x14,0xae,0x31,0xe1,0xd1,0x30,0x07,0xf3,0xa8,0x3e,0x93,0x45,0x2c,0xed,0x8f,0xd1,0xb8,0xd0,0x1a,0x27,0xc4,0xa3,0xdd,0x0d,0x7f,0x2b,0x07,0xde,0xf9,0x3b,0x2f,0xc2,0xfd,0xa0,0xcb,0xbb,0x3a,0xf7,0xe7,0xe0,0x03,0x04,0x06,0xbc,0xbc,0xbf,0x11,0x05,0xda,0xd6,0x4e,0xb7,0x35,0xd2,0x68,0x1b,0x39,0xe1,0xd0,0x0d,0x11,0x26,0xcf,0xeb,0xef,0xc7,0xfd,0x19,0xdf,0xca,0x43,0xd1,0xa5,0x2c,0x55,0x0b,0x17,0x31,0xd7,0xc9,0xe7,0xf3,0xe2,0xfe,0xc4,0xdd,0x5c,0xd5,0xfe,0xc6,0xce,0x5a,0x06,0xbc,0xa7,0x55,0xf4,0xbf,0xf0,0x44,0x29,0xe6,0x2c,0xd2,0xa4,0x27,0xbb,0x24,0xc4,0xd1,0xd9,0xaa,0xb7,0xbc,0xaf,0xe1,0x30,0xa9,0x9b,0x13,0xf1,0x54,0x45,0x21,0xe8,0x0d,0xf0,0xf3,0xc5,0x56,0x01,0xf4,0xee,0xfa,0x11,0x0d,0x1b,0xb8,0xe2,0xc1,0xf7,0xc7,0xb0,0xd0,0x23,0xfa,0xec,0xe2,0xfb,0x23,0xd3,0x02,0x44,0x2f,0x4b,0x95,0x0c,0x03,0x41,0xed,0x35,0x14,0xfb,0x45,0xd4,0xf0,0xf0,0xf2,0x13,0xc5,0x25,0xb4,0xdb,0x1b,0xc2,0xda,0xf0,0x18,0xd7,0xdc,0xcb,0xac,0xe2,0xc8,0xfe,0xff,0x14,0xee,0xb4,0x12,0xf0,0xd8,0xd3,0xc6,0xd2,0xbd,0x9f,0xbb,0x6b,0xe9,0x39,0xbf,0x14,0xe5,0xed,0x0d,0xcd,0xfb,0xee,0x57,0x94,0xbf,0x0f,0x0a,0xcf,0x00,0xf1,0xdb,0x0e,0x2b,0x05,0xc0,0xeb,0x07,0xe6,0x5e,0x56,0x11,0xd9,0x29,0x1a,0x17,0x0f,0x3a,0x04,0xb4,0x22,0x06,0xf9,0x0c,0xe8,0x33,0xe1,0x8c,0x30,0xf4,0xcf,0x50,0x32,0xa6,0xb1,0x2c,0xb1,0x0a,0xc0,0x2f,0xe4,0x08,0xbf,0xea,0xff,0xda,0xf5,0x81,0xc7,0x0f,0xeb,0xe2,0x53,0x56,0xd8,0xb2,0xe0,0xdf,0x2d,0x20,0xf2,0xec,0xf0,0x22,0xe6,0x3d,0x0d,0x2c,0x34,0x05,0x0c,0x1b,0xe7,0x35,0x25,0x41,0x3e,0xeb,0x08,0x21,0xc5,0x22,0xd8,0x1a,0xc0,0xce,0x9e,0x05,0xc4,0xf4,0xa5,0x23,0x40,0x0f,0xce,0xc4,0xf2,0x49,0x01,0xd8,0x07,0x27,0x36,0xcf,0x15,0xf7,0x02,0xbf,0x96,0xe5,0xd7,0x17,0x59,0x49,0x1f,0x97,0xe7,0xdb,0xd3,0xea,0xdb,0xf7,0x0a,0x09,0x0e,0xa9,0xc6,0x0c,0xb9,0xcc,0x31,0xd1,0xd5,0xc9,0x01,0x6d,0x2d,0xc6,0xed,0xc3,0xa5,0xca,0xdc,0xdd,0x97,0xc1,0xf8,0x28,0xc5,0x06,0x1b,0x3b,0xdd,0xc0,0xf3,0xc4,0x2e,0xf7,0xf1,0xeb,0x20,0xe8,0xfe,0xb6,0x6b,0xcf,0x2c,0x03,0xb4,0xdb,0x54,0x05,0xe3,0xae,0x1b,0x32,0xc8,0x0d,0xa1,0x15,0xdf,0x32,0x29,0x17,0xfc,0xf5,0x0b,0x18,0x2a,0x1f,0x13,0xbe,0x09,0xf5,0xb8,0xac,0xf2,0x55,0xd9,0xbd,0xca,0x27,0x4d,0xdd,0xc3,0x1c,0xdb,0x09,0xe9,0xd4,0x0a,0xae,0xf3,0x61,0x19,0xb7,0xff,0x00,0xec,0xfe,0xf7,0xbe,0xf8,0x61,0xda,0xf8,0x27,0x2c,0xd4,0xfc,0xf5,0x42,0xde,0xdc,0x47,0x65,0x40,0xbc,0xf6,0xdb,0xf3,0xc6,0xa4,0x00,0xea,0x21,0x00,0x15,0x48,0x09,0xbf,0x2f,0xec,0xd9,0xb9,0xde,0x9e,0x28,0xe1,0xec,0x5d,0xea,0x27,0x35,0xc3,0x46,0xfd,0xef,0x1d,0xf2,0x9c,0xd4,0xf0,0x04,0xe1,0xcf,0xb5,0xd8,0xf9,0xef,0xed,0xf8,0x21,0xdc,0x17,0xd8,0x20,0xf0,0xeb,0xbc,0x06,0x0d,0xe6,0xe6,0xc2,0x0c,0x03,0xc8,0xf6,0xcb,0xc3,0xf8,0xfd,0x14,0x17,0xf3,0x11,0x13,0xfe,0xea,0xf8,0xd9,0xcd,0xfa,0x22,0xf6,0x03,0x25,0x02,0x14,0x20,0x02,0xfe,0xad,0xe2,0x3c,0x07,0xfb,0x40,0x13,0xef,0xea,0x08,0x1a,0x1f,0x36,0xe6,0xe0,0xde,0xf9,0xfa,0xcd,0x04,0xce,0x1c,0xe3,0xf3,0x1d,0x31,0xdf,0x15,0xe7,0xfd,0xcd,0x03,0xf2,0xfb,0xa8,0xf4,0x0b,0x26,0xff,0x23,0xb5,0x9d,0xee,0xf6,0xeb,0x23,0xcd,0xe8,0xeb,0xfe,0x1b,0xde,0x00,0xe0,0x28,0x00,0xca,0x22,0xdf,0xfa,0x05,0xe5,0x3e,0xf9,0xfc,0x2b,0xe4,0xf5,0xee,0xed,0xdf,0xb5,0xd2,0x00,0xe0,0xd6,0x03,0xfb,0xe0,0xe1,0xf7,0xc2,0xc2,0x1b,0xcd,0xcd,0xb8,0x07,0xe6,0x00,0xf1,0x02,0xd2,0xea,0x3b,0x04,0x08,0xba,0xe2,0xc1,0xb9,0xc0,0xf8,0x19,0x65,0x2c,0xd9,0xf2,0xfe,0xd2,0xdd,0xd4,0x17,0x2e,0x2c,0x0a,0x59,0x4c,0x14,0xf3,0xd7,0x40,0xc7,0x36,0x3c,0x01,0xdd,0x24,0xf6,0x1d,0xdd,0x31,0xf9,0xdb,0xd7,0xfa,0xd9,0xf9,0xf7,0xbb,0x25,0x1a,0xea,0x21,0xe4,0xf3,0xfb,0xef,0x81,0xf6,0x55,0xd7,0xf4,0x4d,0xf2,0x09,0x1e,0x36,0xfa,0xec,0xdc,0xdd,0xe6,0xe1,0x11,0xca,0x18,0xe0,0xff,0xf0,0xd0,0xe1,0x12,0xaa,0xba,0x22,0x34,0x0c,0x05,0x1a,0x00,0xd2,0xec,0x2b,0x37,0xe8,0xdd,0x0b,0x1f,0xb9,0xdd,0xd3,0x08,0x22,0xd7,0x4e,0xeb,0x14,0x26,0x0e,0xfc,0xdc,0xe7,0x2b,0xf2,0x3c,0x12,0xdd,0xf9,0xe9,0xf7,0xdb,0xff,0xee,0xda,0xe5,0x15,0xe7,0xe4,0xdf,0x0f,0x0a,0x1b,0xf2,0x04,0x04,0xfa,0x0d,0xeb,0xe7,0xd2,0x31,0xfa,0xf1,0xca,0x15,0xf7,0xf8,0xf2,0xf4,0x19,0x10,0x38,0xef,0x14,0xf4,0xe6,0x10,0x04,0xeb,0x10,0xdc,0xfb,0x07,0xf1,0x0f,0xd7,0xf4,0xeb,0xfd,0x02,0x7f,0x26,0xe8,0xf3,0xcf,0x21,0x0d,0xf9,0xeb,0xe4,0xd5,0x14,0xda,0xe0,0xe9,0xf8,0xcf,0x04,0xd1,0xc8,0xe4,0xe5,0x29,0x5c,0xcc,0x19,0xf9,0xe0,0x0d,0x09,0x04,0x2e,0x0b,0x04,0xfd,0xda,0x09,0xf0,0xcd,0x1f,0xd7,0xdb,0x05,0x1d,0xe0,0x0f,0x02,0x04,0xf7,0xee,0xde,0xd5,0x0f,0x05,0xeb,0xe1,0xed,0x13,0xdc,0x10,0xe9,0x14,0xd1,0xf8,0xfe,0xed,0xf3,0xec,0xfb,0xfd,0xd6,0x19,0x21,0x04,0xfc,0xe2,0xf2,0xeb,0xd0,0xf9,0x23,0x02,0x38,0x05,0x0d,0xfe,0xf6,0xde,0xca,0xc3,0x28,0x0a,0xfa,0xed,0x07,0xdb,0xf3,0x12,0x30,0x2a,0xf9,0xe1,0xe6,0x09,0xd5,0xff,0x30,0x09,0x3e,0xfa,0xfe,0x2d,0xf0,0xf8,0xfd,0xda,0x27,0xfd,0xf1,0xc7,0xff,0xd6,0xe9,0x02,0xf2,0xfc,0xfa,0x08,0xde,0xd4,0x00,0xe4,0xc7,0x2d,0xf4,0x16,0x05,0x01,0xf9,0xd4,0x01,0x07,0xcd,0xf0,0x32,0xde,0xc8,0xfe,0x08,0x16,0xe2,0x1e,0xfd,0xf6,0xeb,0x00,0x13,0x31,0xfa,0x08,0x14,0xb7,0x13,0xff,0x1b,0xcf,0x16,0x0d,0xe6,0x08,0xf7,0xf6,0xc8,0x24,0xdf,0xf0,0x0a,0x01,0xfc,0xf3,0x04,0xdc,0xc0,0xc3,0xe8,0x14,0x23,0xd2,0xe4,0xe7,0x08,0xc6,0xfe,0xe8,0x0d,0xea,0x07,0x03,0xdb,0x03,0xf4,0xf9,0xb8,0x1d,0xea,0x35,0xc7,0x41,0x27,0xcf,0xea,0xf3,0xd4,0xd5,0x22,0xd4,0xe5,0x07,0xb6,0xe7,0xe6,0xe9,0xd7,0x04,0xbd,0xf7,0xed,0xf9,0xcf,0x00,0xc9,0x18,0x3b,0xf5,0xd5,0x43,0xea,0x37,0x02,0xe4,0xf8,0xd2,0x17,0x07,0xfe,0x0d,0xe4,0x0e,0xa1,0xff,0x3b,0xf9,0xf3,0xdd,0x2f,0x1e,0x7f,0x00,0xdd,0xf1,0xb5,0x17,0xd3,0x5b,0xdd,0xc9,0xe5,0x33,0x0b,0xe2,0x31,0xa1,0x09,0xf5,0xb7,0xf7,0xd5,0x9f,0x4a,0x3e,0xd0,0xd4,0xe6,0xb9,0xef,0xed,0xd0,0x61,0xf2,0x34,0x2f,0x0a,0xff,0x19,0xf1,0x36,0xc0,0xf0,0xce,0x6c,0x08,0xb9,0xce,0xd8,0xbb,0x63,0xe2,0x20,0x3f,0x24,0xcb,0xdb,0xd2,0xf9,0x0a,0xea,0xdf,0x2d,0xca,0x13,0x14,0xb0,0xea,0xff,0x22,0xcf,0x06,0x07,0xf7,0xef,0x32,0xf3,0x0b,0x0d,0xa1,0x98,0xfb,0xd9,0x29,0xec,0x40,0x01,0x20,0xc8,0xfe,0xf1,0x2b,0x07,0xff,0x06,0xe6,0x05,0xce,0x1d,0x56,0xe1,0xe1,0x00,0x13,0xe0,0xfd,0x0e,0xff,0xfc,0x51,0x0b,0x25,0x01,0xef,0x39,0x34,0x38,0xe6,0xf3,0xdc,0xf3,0x42,0xe3,0x13,0x04,0x07,0xef,0xd1,0xea,0xfe,0xe1,0xd0,0xd8,0xf4,0x2f,0xee,0xef,0xeb,0x14,0xfe,0xf2,0x0d,0xb1,0x17,0x00,0x24,0xad,0xb8,0xb8,0x0f,0xd9,0x09,0xf6,0xbf,0x19,0xf4,0x0e,0xf4,0x2a,0x1a,0xfe,0x22,0xf5,0xfa,0x3b,0x22,0xb9,0x67,0x10,0x10,0xc4,0x0b,0x00,0xcf,0x45,0xdd,0xbc,0x4c,0xf2,0x43,0xb9,0x07,0xe2,0xc9,0xf9,0x0b,0xf0,0xee,0xd4,0xe0,0xe7,0x2b,0xe2,0xc6,0xd8,0xeb,0xc7,0x1d,0xd9,0xf9,0x00,0x15,0xfe,0xdf,0x06,0xd8,0x04,0x05,0xeb,0x1c,0xdb,0xcf,0x35,0xe2,0x0a,0xf4,0xf7,0x09,0x13,0xfd,0xfe,0xe0,0xe9,0xf8,0xfd,0xc0,0xdd,0xf4,0x1a,0xff,0xf1,0xcf,0x15,0x34,0xf5,0xea,0x14,0x11,0x04,0xf9,0xeb,0x0d,0xe2,0xc8,0x0c,0x09,0x04,0xc5,0xe4,0xfd,0x0b,0x15,0x2f,0xf5,0x11,0x18,0x08,0x7f,0x01,0x05,0xfc,0xf9,0xf9,0x0d,0x0b,0xe1,0xd0,0xef,0x14,0x23,0xf6,0x0d,0xba,0xe8,0x0f,0xd8,0xe3,0x09,0xd9,0x06,0x3d,0x08,0x05,0xfa,0xf7,0x02,0xf5,0xd1,0x4e,0xf1,0x14,0xfd,0xc8,0xec,0xe5,0xf3,0x15,0xd2,0xd8,0xda,0x08,0xeb,0xe9,0xdf,0xdf,0xec,0xf2,0x09,0x04,0x07,0x1f,0xec,0x0c,0xcf,0x10,0x06,0xf7,0xfb,0xe8,0xcb,0xff,0x15,0xc3,0xf4,0xe6,0xf3,0xf5,0xef,0xea,0x0c,0x19,0xe9,0x1f,0xed,0xc9,0xef,0xde,0xec,0x07,0x27,0xd5,0x08,0xec,0xec,0xe8,0xcc,0xe0,0xfc,0xca,0xf4,0xc4,0xf2,0xdd,0x13,0x20,0x20,0x2a,0xf4,0xea,0xfb,0xe8,0x19,0x16,0xfc,0xe2,0x1d,0xea,0xfb,0x35,0x14,0x14,0xbe,0x0a,0x2c,0x0f,0xe1,0xe5,0xf8,0xcd,0xf4,0x03,0xff,0xeb,0x09,0x09,0xbd,0xdf,0xf9,0xea,0xf2,0x0b,0x06,0xf1,0xf8,0xec,0xf7,0xf3,0xe5,0xf3,0xf6,0xf8,0x25,0xe9,0xe9,0xc7,0x1a,0x05,0x05,0x0e,0x0c,0x05,0xec,0x19,0xfa,0x28,0xe2,0x06,0x13,0xe1,0x18,0xe9,0x06,0xf9,0xfe,0x09,0x06,0x00,0xe9,0xef,0xf1,0xf8,0xf5,0xed,0x2c,0x15,0xef,0xdd,0x08,0xcd,0xd0,0xdf,0xfc,0xf5,0xf9,0xdc,0xdc,0xdb,0xff,0xe0,0x2e,0xed,0x02,0xfb,0xfd,0xeb,0xf5,0xe3,0x2d,0xc6,0xd6,0x1b,0xe9,0xfb,0x16,0x09,0x0b,0xc1,0xea,0xe6,0x09,0xff,0xf5,0xfc,0x34,0xf6,0x1c,0xfd,0x0a,0x02,0x04,0x12,0xf5,0x12,0xe0,0xf5,0xc2,0xf2,0xf0,0x0d,0x0f,0xf7,0xe8,0xec,0x2e,0x34,0xe2,0xe1,0x18,0xfd,0xba,0x08,0x14,0xf2,0xea,0x15,0x1d,0xda,0x0c,0x1a,0xfe,0xe6,0x0b,0x01,0x32,0x25,0x22,0xec,0xca,0x11,0xed,0x22,0xde,0xf9,0xf8,0x0f,0xd1,0x03,0xfc,0x04,0xf5,0x0d,0xb3,0xe6,0x2e,0xe9,0xf0,0x22,0x15,0x52,0x14,0xf0,0xe6,0x27,0xfb,0x19,0xe9,0x28,0xe6,0xff,0xba,0xf5,0x07,0x04,0xbd,0x07,0xe1,0x05,0xea,0x08,0xec,0xda,0xb9,0x32,0xe7,0xec,0x0e,0x05,0xad,0xef,0xf0,0xe7,0xe9,0x27,0xd6,0xe4,0x26,0x05,0x07,0xc4,0xd5,0xf7,0xfd,0xcb,0xf4,0x21,0xe6,0x0c,0x25,0x0b,0xcc,0x1f,0xc1,0x2d,0x04,0x1e,0x49,0x1f,0x3c,0x19,0x00,0xe5,0xaa,0xcf,0xd5,0xc9,0x03,0xd6,0xcf,0xe4,0xf0,0x05,0x2f,0x07,0xf1,0xc5,0x2a,0x25,0xfd,0x30,0x42,0xf2,0x01,0xfd,0xe1,0x0c,0xf7,0x1e,0x7f,0x04,0x16,0xc3,0xde,0xd8,0x00,0xc9,0xe0,0x35,0xfc,0xf0,0x06,0x31,0xec,0x0d,0xd6,0xe0,0xd1,0x2c,0xcd,0xc8,0xf9,0xf9,0xfd,0xe9,0xf4,0x0d,0xc5,0xe2,0x29,0xce,0xdf,0xe4,0xf3,0x07,0x1c,0x0b,0xf6,0x13,0xe3,0x06,0x00,0x36,0x09,0xd7,0xce,0xdc,0x19,0xff,0x14,0xe2,0x09,0xdd,0x09,0xf6,0xc6,0xf7,0x9f,0x0b,0xeb,0xd4,0x0a,0x22,0x28,0xd8,0xcc,0xcf,0xdc,0xd6,0xc1,0x02,0xf8,0xdd,0x0c,0xef,0x40,0xd9,0xd1,0xc9,0x07,0xee,0xea,0xda,0xac,0xeb,0x37,0xe1,0xd7,0x07,0xc3,0x1f,0xfe,0x12,0xe6,0xe1,0xf7,0x1d,0xb7,0x29,0x18,0xd1,0x3f,0x00,0xb6,0x1a,0xd5,0xf4,0x0d,0xeb,0xab,0xe4,0xe1,0x14,0xf1,0xdd,0xcb,0xf2,0x0e,0x03,0xe6,0xd5,0x21,0x4e,0xe0,0xcc,0x07,0x20,0xce,0x12,0xb1,0xe5,0xd8,0x13,0xb8,0x0c,0xeb,0xda,0xfb,0x0a,0xd5,0xe8,0x66,0x28,0xfb,0xee,0x94,0x35,0xc4,0x24,0xc8,0x29,0x12,0x0c,0xf3,0xee,0x28,0x96,0x03,0x22,0xf2,0xf2,0xe3,0x95,0xf2,0x7f,0xf6,0xeb,0x03,0x29,0xe9,0xd7,0xe4,0x33,0xeb,0x49,0xfd,0xdc,0xc5,0x1b,0xf0,0x2c,0x87,0xf4,0x04,0x10,0xe9,0xf5,0xc8,0xef,0x06,0x13,0xfe,0x26,0xf0,0x32,0x11,0xf0,0x05,0x21,0xfc,0xe8,0xcf,0xf8,0x9c,0x31,0xf4,0xc6,0xf0,0x13,0x0e,0xe8,0xe0,0x2e,0x32,0xfe,0xf6,0x17,0xce,0xe9,0xcd,0x06,0x06,0xcf,0x33,0x09,0x1d,0x07,0xd9,0xcb,0xcc,0xd9,0x4d,0xf5,0xd1,0xba,0xe7,0xc2,0xe1,0x03,0x20,0x0a,0x0e,0xc4,0x00,0xb1,0x5a,0xf0,0x3e,0xcf,0x26,0x0a,0x33,0x0e,0xee,0xfe,0xbb,0xe0,0x21,0xd9,0xa1,0xb4,0x58,0xc8,0xd4,0xff,0xed,0xaf,0x1a,0x0f,0xca,0xd2,0xfd,0x09,0xc4,0x1b,0x97,0xdf,0xf3,0x32,0xe3,0xc2,0xf1,0x1d,0xf1,0xc3,0xf4,0x9d,0x00,0xeb,0x0b,0x0f,0x03,0x17,0xc4,0x09,0xe5,0x14,0xfb,0x1a,0xc8,0xfe,0x11,0xb6,0x21,0xeb,0x19,0xb6,0x0c,0xfd,0xca,0xc8,0xde,0x00,0xa4,0xc4,0xe6,0xeb,0x03,0x0b,0x10,0xe5,0xf6,0xc6,0xd0,0xb9,0xd2,0xd0,0x23,0xb3,0xa0,0xdf,0x32,0xd7,0x17,0x95,0xe2,0x01,0x06,0xa7,0xec,0xa0,0x33,0x0f,0xca,0xfc,0xc1,0xd9,0xa2,0x14,0xf4,0xc9,0xff,0x21,0x03,0x84,0xf7,0xfd,0x2d,0xc4,0x08,0xce,0xa9,0xf7,0x35,0xcc,0x24,0x44,0xe4,0xbf,0xbb,0xe6,0x22,0x0a,0xf3,0xe2,0xdb,0x1d,0xea,0xd9,0xac,0xff,0x25,0xfb,0x3c,0x05,0xe8,0xb0,0xf0,0x01,0x05,0x01,0x31,0x1f,0x34,0xab,0xde,0x8d,0x18,0xe8,0xb9,0xe2,0x01,0x24,0x06,0xde,0xef,0xf4,0xa2,0xc0,0xec,0x2d,0xf4,0xa5,0xda,0x0a,0x37,0x0f,0x18,0x18,0xbc,0xe5,0xed,0x0b,0xf5,0xed,0xf3,0x28,0x11,0x3e,0x2f,0x99,0xd0,0x00,0xb7,0x18,0xb9,0x3b,0x31,0x16,0xf2,0xb3,0x5f,0xf9,0x06,0x18,0xd3,0xfb,0x81,0xae,0xcf,0xe0,0xe5,0xe4,0xee,0x09,0x24,0xac,0xf9,0xcf,0xa3,0x53,0xe2,0x1d,0x4e,0xb9,0xc1,0xcb,0x41,0xdf,0x09,0x22,0xf1,0xe7,0xe6,0x20,0xdb,0x49,0xbf,0x00,0xee,0xd5,0xd2,0xdf,0x2a,0xe9,0x3b,0xd1,0xdf,0xf8,0xdb,0x05,0x31,0xef,0xd4,0x0d,0x03,0x2f,0x1f,0xd4,0xa2,0xfc,0xf2,0x2b,0x0d,0x22,0x1b,0x07,0xf0,0x3f,0xf5,0x13,0x07,0x01,0xd4,0x41,0xd0,0xc4,0xfa,0x1d,0x26,0xe8,0xa7,0x0c,0x0e,0xc6,0x0b,0x3a,0x55,0x13,0x2f,0x10,0x60,0xf7,0x11,0xcf,0x12,0xf2,0x0d,0x2c,0xf9,0xd8,0x15,0x21,0xf5,0x00,0x0e,0xd1,0xcc,0xfb,0xaa,0xe6,0xd3,0x33,0x5b,0x24,0xfc,0xc2,0xcc,0x31,0xda,0x40,0x57,0xf2,0xfb,0xf6,0xdd,0x27,0x32,0xc9,0x44,0xdc,0xd4,0xe3,0xed,0xc3,0x32,0xd2,0xd2,0x42,0x10,0x27,0x0a,0xd7,0x10,0x37,0xe4,0x3b,0x44,0xd1,0xd6,0xe3,0xdd,0xf8,0xcf,0x0f,0x02,0xed,0xca,0xb0,0xf4,0xd8,0xd4,0xf8,0x11,0x0c,0xfc,0x19,0xd2,0xe7,0xdc,0xed,0x14,0xfc,0xda,0xb0,0xc6,0x03,0xce,0xb3,0x26,0x0e,0x21,0xfa,0xe4,0xeb,0x07,0xb6,0x2d,0xa3,0xcc,0x33,0x14,0xe1,0x12,0xb9,0xfb,0xe9,0x27,0xbb,0x3d,0x06,0xbe,0xe3,0x03,0xf8,0xe1,0xf5,0x2d,0x07,0x56,0x1b,0x05,0x1d,0xc8,0x01,0xfc,0xcf,0xf6,0xb4,0x24,0xea,0x0d,0xd6,0xfe,0xf0,0xf0,0xef,0xd2,0xe4,0xe2,0x1c,0x06,0xfd,0xd1,0x24,0xf5,0x81,0x09,0xee,0xd9,0x33,0x03,0xeb,0x13,0xe7,0x22,0xe9,0x21,0xbf,0xee,0x1c,0xe3,0xd8,0x0d,0xe0,0xcb,0xac,0xbf,0xe2,0xfc,0xba,0x2f,0x35,0x17,0xf2,0xce,0x11,0xd8,0xed,0xf6,0xd6,0x0e,0xfb,0xe8,0xe8,0xf6,0xb8,0xe4,0xfd,0xf0,0xe2,0xf5,0xc7,0x14,0xe3,0x03,0xc0,0xe4,0x11,0xef,0xf2,0xe1,0xf6,0xe6,0xef,0xed,0x22,0x18,0xe0,0xf5,0x34,0x1b,0x1b,0xb7,0x0c,0xfe,0x2d,0x0e,0xad,0xc8,0xd6,0xc9,0x0c,0x06,0xe6,0xf3,0x14,0xc6,0xf9,0xc0,0x1b,0xd3,0x23,0x22,0xe9,0x15,0xf1,0xff,0xee,0x18,0x14,0xcb,0xe6,0xd6,0xea,0x08,0xf0,0x39,0xe7,0x06,0x2e,0x13,0x0f,0x0c,0xd4,0xc9,0xe5,0xdf,0x0f,0x0e,0xf4,0x0c,0xf5,0xff,0x1e,0x27,0xf0,0x0a,0xa0,0xfe,0xd7,0x29,0xd4,0xea,0x18,0xfb,0x00,0xb8,0xb0,0xf6,0x93,0x0c,0xde,0x25,0x08,0x0d,0xe9,0xdd,0x30,0xc3,0xff,0x1c,0xae,0xdc,0xee,0x1c,0x03,0x15,0xea,0x1d,0xf1,0x15,0x1e,0xf5,0x9c,0x12,0xec,0x12,0xd9,0xea,0x13,0xfe,0xea,0x20,0xf9,0x0b,0x6e,0x08,0xe7,0x11,0xc1,0x0d,0xdd,0x1a,0x1a,0xd7,0x2a,0xfe,0xe0,0x2e,0xdb,0xdf,0xea,0xfc,0xe6,0xb0,0xdf,0xbb,0x07,0xeb,0xac,0x09,0xf1,0x3c,0x07,0xe2,0xcd,0x0c,0xed,0x02,0xee,0x01,0x93,0x44,0xda,0x06,0xe3,0x12,0x05,0xf1,0x49,0x1a,0xe0,0xfd,0x02,0xd8,0xed,0xfe,0x36,0xda,0xd0,0x15,0x24,0x01,0x0b,0x07,0x44,0x23,0x31,0xef,0x46,0x24,0x9e,0xe4,0xd1,0xf9,0xb6,0x34,0x3f,0xf3,0xe7,0xe9,0x9d,0xf3,0xd7,0xcf,0xf0,0x36,0xe4,0x1c,0x0b,0xc9,0xe4,0x04,0x28,0xf3,0x22,0xf7,0xe3,0xe1,0x15,0xef,0xab,0x0d,0xbd,0x99,0xb1,0xdc,0xc6,0xd1,0x16,0xf8,0x41,0x13,0x2a,0x2e,0xce,0xe0,0x32,0x34,0x04,0xdf,0xff,0x1f,0xba,0xe6,0xfc,0xc5,0x22,0x08,0xe8,0xff,0xf4,0xcf,0x04,0x16,0xe8,0x32,0xe5,0x34,0xe7,0xcc,0xd4,0xdf,0x1c,0xf4,0xf5,0xf4,0x0f,0x36,0xb1,0xd5,0xd5,0xcd,0xfa,0xec,0x12,0xef,0xa2,0xfc,0xdd,0xd6,0xf3,0x06,0xd0,0xaf,0xd2,0xfc,0xf4,0x21,0x08,0xd3,0x3c,0xbb,0xfe,0x3c,0x3b,0xf6,0xfc,0xc7,0x0a,0xe2,0xbf,0xcb,0x03,0xf9,0x29,0x9f,0xf6,0xfc,0x3e,0x00,0x10,0x44,0x29,0x2f,0xc8,0xf5,0xc2,0x2f,0xe5,0x0c,0x20,0xff,0x14,0xe4,0xff,0xc3,0x07,0xf1,0xda,0x2b,0x02,0xb9,0xe9,0xfe,0xd8,0x01,0x96,0x19,0x02,0x06,0xc9,0xd4,0xe8,0xfc,0x17,0xb7,0xd7,0x22,0x18,0x0a,0x1b,0x47,0xff,0x23,0x0a,0x2c,0x14,0x0f,0x32,0xea,0x0c,0xa1,0x1d,0xf5,0xff,0xf3,0x11,0x2d,0xf5,0x2f,0x29,0xcf,0x11,0x20,0x81,0xd2,0x81,0x13,0xad,0xd2,0xf8,0x60,0x1f,0x12,0xbc,0xe3,0xad,0x2c,0x22,0x9e,0xfd,0xc5,0x12,0xc0,0xd5,0x03,0xea,0xc8,0xc5,0xe7,0xd6,0xdf,0x33,0x06,0x3f,0x28,0x21,0xfb,0xce,0x2f,0xcf,0xc3,0xc8,0xe7,0xd1,0xef,0xc6,0xff,0xdb,0x38,0xeb,0x02,0x1c,0x01,0x12,0x1a,0x0e,0x25,0xe8,0xf0,0xfb,0x97,0xf6,0xb5,0xc0,0xf4,0xff,0xfd,0xe2,0xf3,0xd2,0xbe,0xfe,0x49,0xe8,0x2c,0xf3,0xe4,0x16,0xd7,0x02,0x0f,0x46,0x1f,0xf4,0x01,0xc4,0x0d,0xd5,0xed,0xec,0xe3,0xc7,0xec,0xb8,0xe9,0x70,0xd5,0x10,0x1c,0x15,0xcf,0x21,0xb1,0x45,0xf6,0xe9,0xd2,0xf8,0xa8,0xfd,0xec,0x16,0x81,0xd6,0xe4,0xfd,0xf2,0x1b,0x01,0x0d,0xf6,0xb9,0x12,0x00,0x33,0x29,0xac,0xd6,0xcd,0x11,0xfb,0xfc,0xe7,0xd8,0xf1,0x40,0x29,0x38,0xee,0x12,0x34,0xe3,0xd7,0x28,0xf0,0xf1,0x06,0x23,0xd4,0xe0,0xbe,0x13,0x10,0xf4,0x29,0xd8,0xe9,0xe3,0xe6,0xf6,0xe2,0x17,0x29,0x06,0xc4,0x1a,0x45,0xd4,0x15,0x17,0x63,0x3d,0xff,0xcd,0x16,0x17,0x2b,0x14,0x39,0x09,0xd5,0xf4,0xfb,0xff,0xeb,0xed,0xd1,0xd1,0x07,0xf9,0xdc,0xac,0xef,0x00,0xd4,0xc9,0x11,0x22,0xf0,0xe3,0x00,0xe1,0x19,0xd7,0xf3,0x67,0xa5,0xc7,0xd4,0x0a,0x10,0x06,0xe4,0x87,0xe5,0xe6,0x1b,0xda,0xe3,0xe5,0xe1,0xe7,0xcf,0xf9,0x03,0xf3,0x1a,0xc5,0xfc,0x23,0x1f,0x05,0x15,0xca,0xd3,0xcb,0x62,0xb0,0x5f,0x17,0xd5,0x1f,0xc6,0xfe,0xcc,0x31,0xd2,0x0b,0x20,0x01,0xe2,0xf7,0x25,0xc9,0xad,0xfa,0xb7,0xd7,0x5d,0xfe,0xc1,0x04,0xe6,0xea,0xda,0xad,0x1b,0xf4,0xe7,0xdc,0xfb,0x1a,0xf3,0x2e,0x1e,0x23,0x1c,0xea,0xeb,0xe6,0xce,0xef,0xf1,0xfa,0xc9,0x21,0x27,0xf0,0xfe,0x08,0xe3,0xc7,0xfd,0x20,0x2c,0x1b,0x07,0xc3,0xe0,0xce,0xe6,0x04,0xd4,0xef,0xf4,0xb1,0x46,0xf7,0x06,0xd3,0x34,0x0b,0x49,0xcd,0xea,0xea,0x1e,0xd5,0x1b,0xc9,0x02,0xe7,0x01,0xed,0x2b,0xdd,0x06,0xb6,0xe2,0x0a,0x2f,0x0c,0x25,0x20,0xda,0x24,0xf2,0xfc,0x01,0x17,0xf5,0xf4,0x3c,0xfd,0x18,0xd6,0xe2,0x34,0xf4,0xdf,0xf0,0x31,0xea,0xf7,0x20,0xf4,0x81,0x0d,0xe9,0x12,0xf5,0xb4,0xd8,0xaf,0xbc,0xd2,0x12,0x1e,0xf0,0xa6,0xd0,0xea,0x01,0x1b,0xf1,0x3a,0xd7,0xf8,0x3e,0x93,0xee,0xbd,0x1e,0xcb,0x14,0xf4,0x03,0xeb,0x00,0xb8,0xee,0x04,0xe5,0x2d,0xb8,0x0c,0xaf,0x26,0xdc,0x31,0xb6,0xf4,0x1f,0x31,0xa7,0xeb,0x22,0xf6,0xfc,0xfc,0xc0,0x24,0xec,0xf6,0xe6,0x1e,0xb4,0xef,0x18,0xe7,0xf1,0xfb,0xcf,0xdf,0xcd,0x0b,0xee,0x26,0x10,0xd1,0x11,0xf3,0x0f,0x1c,0x42,0xed,0x34,0xf8,0xf7,0xff,0xdc,0xf4,0x2e,0x23,0x18,0xf4,0xc1,0x18,0x19,0xfc,0xbb,0xad,0x10,0x02,0xfd,0xe8,0x09,0xf2,0x2b,0x07,0x2d,0xd8,0x23,0x2e,0x31,0x0a,0x1a,0x1f,0x10,0x20,0x10,0xa5,0xf8,0xdd,0x32,0xf0,0xda,0xb7,0x20,0x13,0x0e,0xfc,0xfb,0xc6,0x00,0x0d,0xc9,0xbf,0x95,0xe5,0x03,0xd4,0xf3,0xf2,0xf2,0x3c,0xf5,0x99,0xbc,0x0b,0xf1,0x1a,0xd2,0x1d,0xba,0xbb,0xdf,0xf6,0xbd,0x2e,0x29,0x20,0x01,0x0b,0xeb,0xa8,0xed,0x40,0xe6,0x23,0xc6,0x0c,0x3a,0xf8,0xff,0xf4,0xed,0x05,0xea,0x0e,0xfb,0xbf,0xeb,0xd7,0xf0,0x09,0xea,0x26,0x11,0xd9,0xfc,0xc0,0x14,0xfc,0xff,0xf9,0xd8,0x03,0xb8,0xf1,0xf4,0xf2,0xfc,0xd3,0xd0,0xf7,0xed,0xf1,0x28,0xfc,0x22,0x07,0x36,0xef,0x07,0x04,0x0b,0xec,0x01,0xee,0x25,0xe5,0xf0,0x1f,0x01,0xea,0x10,0x1d,0x0e,0xde,0xed,0x24,0x11,0x06,0xd7,0xdd,0x01,0xc2,0x48,0x28,0x4f,0xe3,0x3c,0xd7,0xe4,0xe1,0xcd,0xf9,0xf4,0xe9,0xc2,0xf5,0x07,0xef,0x05,0x1d,0x0e,0xdf,0x04,0xd9,0xf0,0x17,0x01,0xeb,0xe8,0xd0,0x2f,0x2c,0x52,0xf9,0xc3,0xfe,0xf7,0xf5,0x3a,0xb5,0xed,0xd1,0x0a,0xec,0xfa,0xd4,0xfd,0x35,0x14,0xf3,0xba,0xe5,0xff,0x29,0xe8,0x45,0xf7,0x09,0xe5,0xcf,0xd9,0xd7,0x01,0xf2,0xf6,0xf6,0x1d,0xd2,0xfe,0xeb,0xdd,0xdb,0x1b,0x2b,0xe4,0xd9,0x43,0xed,0xd6,0x0f,0xc2,0x1d,0x21,0xc1,0xd5,0x0d,0x28,0x27,0xee,0xce,0xbb,0xe4,0x36,0xe8,0xd1,0xe3,0xf4,0x7f,0xd4,0xf5,0x0a,0xf9,0xc0,0xef,0xe3,0xff,0xe5,0x11,0xf3,0x3f,0x2b,0x03,0xe3,0xcd,0x2a,0xe9,0xfb,0xfe,0xfb,0xeb,0x34,0xdf,0x2f,0xe7,0xd3,0xe7,0xe9,0x16,0x1f,0xd6,0xc2,0xeb,0x0b,0x1f,0x02,0xf8,0xea,0xfa,0xd9,0xf6,0xf4,0xf3,0xaa,0x10,0xc6,0xd2,0x25,0xf4,0x02,0x31,0xf5,0x04,0xcd,0xd9,0xf2,0xed,0xf5,0x19,0x30,0x13,0x11,0x14,0xed,0x1c,0x1d,0xf7,0xbc,0xcc,0x24,0x3b,0x0d,0xd4,0xf6,0xf5,0xe4,0xe0,0xf5,0x0c,0xe0,0xcf,0xf4,0x0d,0xb7,0xe2,0x00,0xfd,0x10,0x13,0x43,0x22,0x2d,0x36,0x0f,0x06,0x08,0xca,0xd9,0xf0,0x2e,0x04,0xbd,0xe5,0xbd,0x0e,0xde,0x02,0xee,0xdc,0xc6,0x0e,0xe5,0xcd,0xff,0xf6,0x13,0x0f,0xf8,0xf0,0xf5,0xf0,0xea,0x27,0xa5,0xe1,0xf9,0x0c,0xd7,0x07,0xab,0xe0,0x36,0x12,0xdb,0x32,0xf6,0x16,0xf6,0x10,0xfd,0x12,0xd1,0xfb,0xf4,0xf9,0xdb,0xe4,0xcf,0x02,0x09,0x3b,0xe7,0x15,0xfe,0x19,0x7f,0x29,0xfa,0xfd,0xcd,0x13,0xea,0x0b,0xdf,0x17,0xfa,0x18,0x03,0xeb,0xed,0x01,0xc6,0x15,0xd0,0xb5,0x16,0xbe,0x1c,0x1a,0x0f,0x0b,0x07,0xe8,0x19,0x07,0x12,0x3d,0xf0,0xf1,0xf2,0xb5,0xc3,0xe3,0xfa,0xff,0xd8,0xd3,0xb4,0x00,0xc5,0xd3,0xea,0xc4,0xd5,0xfd,0xe3,0x44,0x0d,0x1e,0xee,0xf7,0xbc,0xdd,0xe5,0xde,0xda,0x12,0xd3,0xc9,0x05,0xc3,0xed,0xd5,0xf5,0xbf,0xc8,0x01,0x0a,0x00,0x25,0x28,0x03,0xc6,0x00,0xe4,0xd3,0xf2,0xfd,0xf3,0x0c,0xfb,0x0f,0x17,0xb0,0xdc,0x02,0xb7,0xef,0xd3,0xf7,0xce,0xf6,0x27,0x23,0x0d,0x11,0xcc,0xfb,0xf9,0xf2,0x22,0xd8,0xc4,0x33,0xf0,0x14,0x42,0x05,0xe4,0xed,0xf7,0x1e,0xbe,0xc2,0xea,0x11,0xeb,0xdf,0x0c,0xf9,0xc6,0x07,0x13,0xb1,0xd6,0xf9,0xb8,0xd1,0xf5,0xd2,0xcf,0x02,0xba,0x10,0x02,0xe4,0x16,0xeb,0xd0,0x3f,0xda,0xec,0xe1,0x1a,0x39,0x1a,0x06,0x2e,0x17,0xdb,0x09,0xf8,0xe9,0xf7,0x18,0x12,0xb1,0x0a,0xf2,0xef,0xfd,0xe6,0x24,0xfd,0x1b,0xe1,0x07,0xb9,0xf8,0xf2,0xcb,0x49,0xec,0xe2,0x04,0x1d,0xd1,0xd5,0xe8,0x09,0xec,0xe0,0xb8,0xc8,0xfc,0xf4,0xf5,0x08,0xe9,0xfb,0xf5,0x13,0xad,0x14,0xdb,0x01,0x09,0xbe,0x10,0xe8,0x19,0xfc,0xec,0x1e,0xbe,0xb1,0x2d,0xbb,0x01,0xf8,0x0a,0x4c,0x1e,0x17,0xec,0xf0,0xc8,0x1f,0x18,0x9b,0xe9,0xf1,0x0c,0xf2,0xca,0xa2,0xd0,0xef,0xee,0xcb,0xee,0x09,0xff,0xce,0xf0,0xff,0x1e,0xd0,0x0b,0xd2,0xe4,0xa4,0xd8,0xfc,0xd8,0xe3,0x36,0xfc,0x12,0x2d,0x22,0x74,0x14,0xed,0xdb,0xbc,0x08,0xd3,0x2a,0xd0,0x96,0x17,0xf2,0x26,0xfd,0x05,0xd3,0xd7,0x56,0xbc,0xdc,0x14,0xe4,0xf7,0x6c,0x05,0x21,0x30,0x25,0x11,0x00,0xb5,0x50,0xcb,0x05,0xea,0xf1,0x27,0x32,0xf7,0x22,0xc5,0xd5,0xcd,0xf0,0xed,0x37,0xc3,0x1b,0xe7,0x48,0xee,0xc9,0xf3,0xf4,0xdb,0xc7,0xbc,0xfe,0xdd,0xe9,0x87,0x01,0xf6,0x1d,0xf0,0xba,0xe4,0xf6,0xcd,0x21,0xf6,0xbf,0x1f,0xf4,0x0b,0xe4,0xc1,0xe7,0xdd,0x45,0x03,0x06,0x09,0x04,0x1e,0x1a,0x0a,0x19,0xcc,0x93,0x06,0xc6,0x1c,0xbe,0xef,0xa5,0x19,0x2e,0x41,0x3a,0xf2,0xcb,0xf3,0xc5,0x17,0x36,0x4d,0xbf,0xdc,0x02,0x04,0xfb,0xe5,0x36,0xf9,0xdd,0x0a,0x9b,0xa5,0xb4,0x57,0xce,0xea,0xfe,0xd4,0x4c,0xd3,0xce,0x0d,0xdb,0xf7,0xf0,0x97,0x3a,0xbc,0xe0,0xab,0xe8,0x1d,0xe1,0xfa,0xea,0xec,0xe0,0x1d,0xa9,0xe8,0xcd,0xc8,0x11,0x01,0x0d,0x28,0x0f,0xbc,0x20,0xec,0x13,0x01,0xfd,0x44,0xd3,0x24,0xe6,0x26,0xb3,0x04,0x23,0x11,0x0b,0xca,0x04,0xc4,0x08,0x02,0xe7,0x7f,0x25,0x26,0xf1,0xc7,0xe2,0xf1,0x0c,0xe6,0xac,0x38,0xbe,0xd0,0xda,0xe7,0xbd,0x13,0xc4,0x03,0x14,0x12,0x9c,0xc5,0xdf,0xea,0xfe,0xdc,0xcc,0xc2,0x96,0x2a,0xe3,0x28,0xbe,0xba,0x38,0xc1,0x95,0x2e,0x1f,0xda,0xaf,0x08,0x39,0xa8,0x51,0x11,0xe6,0x28,0x16,0x32,0xe9,0x2b,0xeb,0xdd,0x17,0x39,0xd1,0x3e,0x07,0x3c,0x05,0xbe,0xfe,0x32,0xb0,0x0f,0xda,0xee,0x26,0xd4,0x14,0xeb,0xf6,0x06,0x2f,0x19,0xdd,0xe7,0xbe,0x2a,0xd3,0xcb,0xff,0x35,0xf0,0xb4,0x23,0x05,0xd5,0xaa,0x2a,0x16,0xfe,0xd1,0xd7,0x29,0xa9,0x17,0xfa,0x2b,0x02,0xbf,0x3a,0xaa,0xe4,0x0d,0xed,0xdc,0xcc,0xee,0x2b,0xd3,0xcf,0xd4,0xfe,0xcc,0xe4,0x10,0xbb,0x30,0xc2,0xe9,0xd3,0x2e,0xaf,0x10,0xf5,0xef,0x30,0xf3,0x01,0xfb,0xa9,0xe8,0x05,0x50,0x10,0xe2,0xe2,0x30,0x19,0xed,0x67,0xea,0x1f,0x3b,0x5b,0x10,0xf8,0x04,0x57,0x0e,0x01,0x81,0xd6,0x2e,0xe4,0xe8,0x9a,0xfc,0xa1,0xe1,0x3f,0xc7,0xfe,0x2d,0x50,0x40,0x2a,0x54,0xcf,0xd6,0xac,0xec,0x12,0xfc,0x23,0x0b,0xb0,0xee,0xee,0x07,0x17,0xee,0xd3,0xdb,0xf3,0x04,0xbf,0xef,0xf9,0xc2,0x2b,0x0b,0x0f,0x4e,0x44,0x97,0x35,0x26,0x03,0xe2,0x03,0x33,0xd1,0xd7,0x2f,0x2b,0x06,0x1a,0xf5,0xe7,0xe7,0xf0,0xfe,0xfb,0x1b,0xcf,0x44,0xd0,0x16,0x9f,0xb7,0xd2,0xd1,0xe4,0xa8,0xf0,0xe8,0xed,0xd6,0xb5,0xb0,0xb8,0x96,0xd8,0xc8,0x02,0x9d,0xeb,0x27,0x08,0xf1,0xeb,0xe9,0xbf,0xbf,0x2e,0xe8,0xae,0xc7,0xd6,0xbe,0xd8,0xd5,0xf8,0x27,0xb1,0xdf,0xd3,0xfb,0xca,0x20,0xee,0xf6,0xa2,0xe6,0xf3,0x4b,0xd9,0xb9,0x23,0x47,0x19,0x50,0xc3,0xd7,0xbe,0x28,0xf1,0xf7,0xf9,0xd9,0x0c,0xc2,0xe2,0x21,0xd3,0xf2,0xde,0x0b,0xad,0xbd,0x17,0xd8,0xfa,0xb8,0xe5,0x25,0xd2,0xe5,0xb1,0xe7,0x24,0xbd,0x4b,0xa7,0x08,0x25,0x11,0xbc,0xce,0x0e,0xb8,0xcf,0xda,0x05,0xff,0xd1,0x48,0xd8,0xca,0xf2,0x9c,0xfe,0x14,0x16,0xcb,0x0e,0x2c,0xf3,0xcc,0x57,0xb2,0xf9,0xf5,0xd0,0x1a,0xc7,0x1c,0x0c,0x34,0x05,0x0a,0xd9,0xbe,0x44,0x05,0x23,0x35,0xeb,0x00,0xa4,0x07,0xb5,0xd1,0xda,0x2b,0x1c,0x16,0x27,0xec,0xf9,0xcf,0x33,0xa7,0x1b,0xee,0xbc,0x14,0x25,0xcb,0xa0,0xfe,0xf0,0xe4,0xa3,0xed,0xf7,0xfd,0x05,0x2e,0xe6,0xe6,0xb4,0x40,0xb2,0xc5,0xc6,0xde,0xad,0xfd,0xac,0xd6,0xe5,0xce,0xbc,0xee,0x39,0x4f,0x10,0xda,0x3c,0xae,0xea,0x12,0x21,0xca,0x1d,0x97,0xfc,0xc9,0xe7,0xe9,0xf3,0x7d,0xec,0x11,0x59,0x53,0x06,0x2b,0x4c,0xbc,0x06,0xf3,0x09,0xd9,0xd5,0xbd,0x0e,0xf0,0x02,0x21,0xda,0x17,0x13,0xb9,0xfa,0xfe,0x20,0x01,0xf9,0xf3,0x08,0xbf,0xaf,0x16,0xf6,0x2d,0x4e,0xfb,0x1b,0x47,0xea,0x13,0x35,0x03,0x11,0x03,0xe5,0x15,0xf7,0xfe,0xc6,0xe2,0x2f,0xd5,0x04,0xcb,0x1e,0x3a,0x0e,0x23,0xe2,0x48,0xf6,0x1f,0xe0,0xfd,0xc6,0x48,0xd1,0x45,0xf4,0x2b,0x35,0x41,0xc9,0x51,0xf6,0xbd,0xb4,0xf9,0xda,0xae,0x20,0xeb,0xbe,0xe0,0x81,0x28,0xaf,0x0f,0xd6,0x16,0xf6,0xf9,0xc8,0xf5,0xfc,0xe9,0xb6,0xe2,0xdd,0xfa,0x15,0xdc,0xcc,0xe2,0xc1,0xd5,0x2c,0xde,0x1d,0xb2,0xe6,0xf7,0xf7,0xf2,0xfe,0xff,0xa6,0xb1,0x0d,0x08,0xf8,0xb8,0x03,0xcc,0x0f,0x10,0x17,0x1b,0xcd,0xec,0x46,0xd9,0xe5,0xed,0xd6,0xf2,0xe2,0xf4,0xe4,0xdf,0xda,0xe8,0xee,0xb9,0xe3,0xf9,0x2c,0xe7,0x2d,0xf9,0xec,0x14,0xe2,0xd5,0xeb,0x17,0x50,0x11,0xee,0xfb,0x25,0xc0,0xf2,0xfe,0x1f,0xe2,0xf1,0xc7,0xf3,0x02,0xeb,0xd2,0xfe,0x14,0x2b,0x56,0x20,0x29,0x29,0xca,0xf2,0xb3,0x5e,0xf3,0xcb,0xdc,0xf5,0x4f,0xf2,0x4b,0xe3,0xd1,0xe5,0xbe,0xce,0xef,0x0a,0x34,0x5a,0xd7,0x00,0x08,0xeb,0xe0,0x07,0xf6,0x30,0xe8,0x11,0xe1,0xc7,0x07,0xf1,0xf6,0xb4,0x81,0xe1,0xeb,0x1d,0xde,0xdd,0xdc,0xf5,0xfa,0xaa,0x09,0xdf,0x09,0x30,0xc3,0xdc,0xe3,0xee,0xf2,0xfe,0x17,0xe7,0xbf,0x3b,0xfb,0xe3,0xff,0xda,0xf8,0x15,0x94,0x0e,0xf5,0x02,0xed,0x02,0xee,0xf2,0xc6,0xcc,0xfd,0xfc,0x2d,0xf9,0x51,0x46,0xc6,0xcc,0xce,0xc7,0x23,0xa1,0x06,0xb9,0xfe,0xee,0x13,0x4e,0x49,0x01,0xea,0xc5,0x3c,0xc4,0x25,0xf0,0x5e,0xf6,0x18,0x12,0x34,0xe7,0xf2,0x0b,0xc9,0xdc,0x33,0xb5,0xc1,0xb2,0x26,0xdc,0x15,0xd6,0xf9,0xe3,0x42,0xe7,0xe6,0x12,0xf7,0xef,0xcb,0x39,0xdb,0xb5,0xf7,0x18,0xfb,0x0a,0xae,0xda,0xfc,0xdd,0x04,0xc3,0xff,0x10,0xdb,0x02,0x06,0x11,0x04,0x1a,0xfe,0x13,0x07,0x57,0x07,0x25,0xb6,0xc2,0xe5,0xf1,0x5a,0xa1,0x35,0x2a,0xde,0x2e,0xd6,0xe9,0xc4,0x03,0xdf,0xc2,0x1a,0x2f,0x23,0xc8,0xa8,0xf6,0xd6,0xb6,0xa1,0x09,0x1c,0xa9,0xb7,0xe3,0xed,0xf8,0x03,0xb1,0x40,0x02,0xe7,0xc1,0x9c,0xc5,0xda,0xf5,0xed,0xe4,0x04,0x36,0xf0,0xe0,0xd5,0x07,0xf3,0x08,0x5c,0xa4,0x07,0x37,0xc8,0xcd,0x12,0x1c,0x3c,0xf9,0xed,0xe5,0x0d,0xea,0x15,0xdc,0x15,0xf6,0xf2,0x37,0x15,0x1a,0x27,0xd1,0x2a,0xfa,0xe2,0xba,0x22,0xd6,0x19,0xd0,0xd0,0x0e,0x08,0x0e,0x02,0x30,0x04,0xee,0xff,0x33,0xc2,0xdd,0xea,0xca,0xe9,0xdf,0x06,0xca,0xe5,0xfb,0x39,0x0e,0xb8,0xc2,0x02,0x0c,0x05,0xe7,0x37,0xd8,0x1b,0xe6,0x07,0x02,0xff,0x03,0x09,0xec,0xf3,0x01,0xdb,0xde,0xf4,0x50,0xee,0x21,0xf4,0xdc,0x9f,0xf1,0xf7,0xf4,0xc6,0xd2,0xf1,0x30,0x42,0xed,0x25,0x2f,0xf5,0x08,0x27,0xc1,0xdb,0x22,0x23,0xd6,0x27,0xeb,0x0f,0xf1,0x28,0x06,0x20,0x21,0x55,0xf9,0xed,0x20,0xbb,0xf4,0x29,0x16,0xea,0xfc,0xed,0x0f,0x0d,0xce,0xfa,0xf3,0x38,0x09,0xca,0x56,0x7f,0xf4,0x26,0x27,0xef,0x04,0xf6,0xf5,0xe3,0xea,0x16,0xf5,0x00,0x35,0x16,0xc9,0xff,0x36,0xfe,0xbe,0xfc,0x37,0xef,0xd5,0xf8,0x0a,0x20,0x1a,0xfa,0xd6,0x01,0x3e,0x3f,0xc8,0x16,0x27,0xdc,0xc9,0xdd,0xb1,0x38,0x17,0x0f,0xde,0xf7,0xc0,0xfe,0x09,0xcb,0xf3,0x13,0x21,0x19,0x46,0xf5,0x1b,0xf4,0x2b,0xe7,0xb6,0x0f,0xec,0x59,0xec,0xfa,0x12,0x1d,0x09,0xee,0xee,0x25,0xef,0x07,0xf1,0xfa,0xcf,0xfc,0x32,0x2a,0xf6,0xf7,0xe4,0xf6,0xac,0xff,0x27,0x03,0xc8,0xf2,0xb3,0xc7,0xdf,0xe5,0xec,0xde,0x2c,0x03,0xf8,0xda,0x00,0xde,0x23,0xfb,0xf8,0xb7,0x04,0xdc,0xfa,0xe3,0xe9,0x29,0x16,0x1c,0x05,0xd2,0xbe,0xcb,0x10,0xd4,0x41,0x2f,0xdf,0xc5,0x2d,0xfc,0x29,0x1d,0xa5,0x21,0x2b,0xde,0x12,0x10,0xbd,0x0d,0xf9,0xb9,0x0d,0xf2,0x2c,0xf1,0x50,0x36,0x36,0xe9,0xb0,0x48,0x23,0xef,0xfe,0x1c,0xf3,0xe5,0x0e,0x46,0x0d,0x12,0xfd,0xe1,0x0d,0xef,0x32,0x1d,0xe7,0x00,0x23,0x0c,0xca,0x25,0x24,0x00,0xf5,0xad,0xcb,0x0b,0x09,0x1e,0xd0,0xfb,0xd3,0xdc,0xee,0xed,0x36,0xe3,0xdb,0x02,0x6f,0xda,0xc7,0xd0,0xd2,0xd8,0xa1,0xc1,0x04,0x5d,0xbd,0x0d,0x35,0xf5,0x09,0x59,0xad,0xe0,0x00,0xe7,0xa3,0x13,0xa0,0xfc,0x27,0xf1,0x10,0x06,0xd1,0x22,0x21,0x43,0x0e,0xd8,0xbc,0x1d,0xad,0x05,0xc2,0xe7,0x23,0xed,0xfd,0x0c,0x0c,0x08,0xf9,0x2f,0x3b,0x10,0xf1,0xd3,0x10,0xfa,0xe0,0xe4,0xb0,0xc4,0xf1,0xd5,0xd5,0x2f,0x14,0xca,0xf3,0xea,0xd9,0xde,0xe6,0x01,0xec,0xee,0x0b,0x1f,0x28,0x81,0xfe,0x02,0xc0,0xcc,0xce,0xb1,0xfd,0x04,0xdd,0x18,0xfa,0x26,0xe3,0xe9,0xca,0xdc,0xc6,0xef,0xf6,0x12,0x08,0xf0,0x5f,0xe6,0xfd,0xf8,0x15,0x2e,0x0b,0xcb,0x1b,0x14,0x43,0x17,0x58,0xee,0xb7,0x5d,0xd6,0x15,0x05,0xa4,0x10,0xe1,0xd6,0x12,0x24,0x2c,0x33,0x29,0xce,0xf4,0x01,0xb1,0x48,0xf2,0x29,0x14,0xc3,0x1f,0xf2,0xd1,0xd4,0x46,0xd3,0x16,0xef,0xfe,0xed,0xe5,0x1d,0x07,0x2f,0x29,0xf0,0x17,0x18,0xd0,0x18,0xdd,0x53,0xcb,0x0b,0xd4,0x09,0x54,0x08,0xf4,0x30,0xd8,0x3f,0x44,0x2c,0xf2,0x08,0x2c,0x15,0xe7,0xe0,0xdd,0xe8,0xcc,0xce,0xea,0x2c,0x06,0xd3,0x25,0x09,0x2e,0xb9,0xa7,0xe9,0xcf,0x11,0xc5,0xe9,0x17,0xc0,0x01,0xe2,0xe8,0xe4,0xef,0xee,0xd5,0x55,0x20,0xf6,0x17,0xad,0x15,0xdc,0x81,0xed,0xcc,0xe2,0x20,0x1c,0xd0,0xe6,0x22,0x02,0x95,0xf4,0xd7,0xd6,0x38,0x2f,0x0f,0xc5,0xa9,0x0b,0xd6,0xef,0x02,0xde,0x98,0xaa,0x29,0x4c,0x2a,0x3c,0xca,0x5f,0x39,0x06,0x2e,0xc6,0xde,0xf0,0x0d,0x9d,0xe1,0x16,0xe7,0x1e,0xdc,0xd3,0xf9,0x09,0xb4,0x31,0x9a,0x87,0xfe,0xb5,0xc2,0xeb,0x0f,0xe7,0xf6,0x47,0x23,0x12,0xc0,0xc9,0x23,0x17,0xec,0xd6,0xb1,0xca,0xee,0x2c,0xed,0xf2,0xc9,0xf4,0x1b,0xc7,0xcb,0xd4,0xff,0xe8,0x08,0xfc,0xe9,0x62,0xe2,0xe6,0x0e,0xf2,0xbc,0xe2,0xc1,0xd9,0x16,0x12,0x43,0xb9,0xee,0xc0,0xef,0xfc,0x37,0xf5,0xf0,0xca,0xe9,0x63,0x18,0xe9,0x12,0xcd,0x0b,0xdc,0xf1,0xc3,0x05,0x25,0x31,0x10,0x99,0xcb,0x24,0xff,0x4a,0x0d,0x2b,0x02,0xf9,0x3e,0x03,0x0b,0x62,0xdb,0xf5,0xd8,0xf1,0xd1,0xf8,0xe2,0xdb,0xf4,0x21,0xe6,0xac,0x18,0xdf,0x21,0xf4,0x1b,0xcd,0xa9,0x10,0x6e,0xe9,0xfb,0x17,0xd2,0xf4,0x0d,0xf8,0xf9,0x30,0x0a,0x96,0x00,0xf9,0xbf,0xcf,0xf4,0x3f,0xf5,0xec,0x1d,0x16,0xa9,0x0c,0xe2,0xb5,0xf3,0x1f,0x3f,0xf5,0x11,0xf3,0x17,0x04,0x0c,0xd2,0x9d,0xb4,0xdd,0xec,0xc4,0x37,0x13,0x06,0x0c,0xba,0x2a,0x15,0xf7,0xd4,0xd0,0xe6,0x10,0x19,0xfa,0x6d,0x49,0xd8,0xde,0xcd,0x00,0xf9,0xbf,0xf6,0xd5,0x16,0xb5,0xbd,0xde,0x21,0xcb,0x43,0xf7,0x1e,0xdf,0x2f,0x0f,0x23,0xa7,0x55,0xe7,0xf5,0xe4,0xe0,0x0e,0xba,0x41,0xdb,0xfc,0xe8,0x05,0xcc,0x0f,0xb6,0xf5,0xe3,0xad,0xeb,0xf3,0xba,0x19,0xfe,0xe2,0xf8,0xaa,0xd1,0xfd,0x9f,0xb3,0x1f,0xbb,0xdf,0xd2,0x0b,0x00,0x2f,0xd6,0x03,0xf4,0xf1,0x14,0xf6,0x47,0xfa,0xca,0xff,0x08,0xe2,0xdc,0x49,0x44,0x37,0x2d,0xfd,0xdc,0xf8,0xe3,0x00,0xd3,0x78,0xee,0xf5,0xe9,0x07,0xda,0xd4,0x34,0xca,0xdc,0x2a,0x04,0xe2,0x08,0x2e,0x0c,0xbb,0x0c,0xdf,0x8b,0xf6,0xe1,0xf8,0xfa,0xdb,0xe2,0xfa,0xc4,0x09,0x17,0xf5,0xed,0xcd,0x1b,0xda,0x0b,0x2c,0x0c,0xee,0xf4,0x09,0xc9,0xc9,0xd8,0xe3,0x34,0x49,0xef,0x04,0xc7,0xfc,0xf4,0x01,0xe0,0xc6,0x27,0xdf,0xf2,0xe6,0xf8,0x58,0xd8,0xf1,0xb7,0x14,0xbd,0x07,0xfd,0xd1,0x8d,0xdc,0x25,0x06,0xd5,0xf1,0xbb,0xcd,0x20,0xb1,0xd7,0xec,0x9d,0x09,0xdd,0x07,0xf5,0xfe,0x35,0xea,0x6b,0x3f,0xce,0xca,0xf3,0xd1,0xe4,0x19,0x03,0x0f,0x0e,0xda,0xdf,0xe2,0x18,0xd2,0x2f,0x49,0xe1,0xe3,0xa7,0xf4,0x11,0x03,0xf1,0xe2,0x25,0xf5,0x03,0xf3,0xe2,0xfe,0xf9,0x01,0xed,0xe6,0x2b,0x02,0xc0,0xe4,0xe0,0x21,0xda,0xb7,0xe0,0x18,0xe2,0x01,0xfe,0x0b,0xe9,0x3d,0x8f,0xaf,0xf9,0x0d,0xdc,0xf6,0xff,0xc5,0xc7,0xe7,0xe0,0x15,0xba,0xd2,0x16,0xe4,0x02,0x1e,0xf5,0x0c,0x56,0xe0,0x27,0x4b,0xc0,0x13,0x05,0x08,0x2e,0x02,0x06,0x19,0xff,0x21,0x2b,0xf6,0xfe,0x38,0xff,0x7f,0xda,0xc2,0x43,0x07,0xdf,0xdb,0xb6,0x03,0x0a,0xd3,0x1e,0xe6,0xeb,0xe6,0xdf,0xd7,0x05,0xda,0xe2,0x2e,0xf9,0xe6,0x24,0x28,0xfa,0xfd,0x09,0x0a,0xfb,0xe3,0x18,0x0f,0xcf,0x15,0x13,0xe5,0xf2,0x00,0xef,0xee,0xd6,0x0b,0xd7,0xf1,0xfc,0xf5,0x1c,0xcf,0x10,0xfa,0x2c,0xcf,0x35,0x0a,0xe6,0xf8,0xe7,0x0f,0xd6,0xd6,0x39,0xe4,0xfb,0x04,0x1c,0x1f,0xc3,0x1f,0x23,0x07,0xee,0x1e,0x21,0x20,0xec,0xf9,0xfb,0x0d,0xf5,0xef,0xdf,0x26,0x07,0x00,0xc8,0x26,0x2e,0x00,0x0e,0xb5,0xe3,0x4a,0xdb,0xfd,0xb0,0x2a,0x0b,0xe7,0x23,0xee,0xf9,0xe5,0xfe,0x0c,0xd3,0xc1,0xf5,0xe7,0xf7,0x00,0xf1,0xde,0x1d,0xec,0x05,0xd0,0x0c,0xde,0x28,0x04,0x26,0xee,0xe4,0xfd,0xfb,0x0e,0xe4,0xfd,0x14,0x0d,0x0d,0x27,0x29,0xfa,0xfd,0xda,0x0b,0xe2,0x12,0x04,0x28,0xeb,0xee,0xf7,0xbf,0xfa,0xc2,0x1c,0xf8,0xd8,0xc5,0xfd,0xe8,0x12,0xef,0xfe,0xe9,0x0a,0x11,0x1b,0xf2,0xe2,0xc4,0xaa,0xd5,0xce,0x23,0xf2,0xe4,0x1f,0xcf,0x07,0x06,0x17,0x28,0xd6,0x24,0x1b,0xc5,0x07,0x05,0xf2,0x52,0x41,0xe6,0x7f,0xfb,0xd9,0xec,0xfb,0x1b,0xe5,0xf3,0x02,0xdc,0x1b,0x16,0x16,0x03,0xf5,0x12,0x0c,0xee,0xef,0x05,0x0f,0xed,0x21,0xc2,0xfb,0x31,0x04,0xe4,0xfb,0xe7,0xbd,0x37,0xff,0x07,0x21,0xd8,0x0d,0x39,0x0a,0xf3,0x02,0xe7,0x0c,0x13,0xd0,0x0e,0x1f,0x15,0xff,0x06,0xfc,0x22,0xfa,0x1d,0x08,0xc5,0xeb,0xfa,0xe1,0xd3,0xfa,0xf2,0xf2,0xd7,0x2b,0xf8,0x13,0xe6,0xfe,0xd2,0xfc,0xe9,0x11,0x4e,0x14,0xe8,0x36,0xed,0xdb,0x12,0x14,0x23,0x0f,0xb5,0xdf,0x3f,0x0c,0xee,0xf3,0xcb,0xcb,0xec,0x2f,0xad,0x18,0xeb,0xc3,0xfd,0x64,0x08,0x20,0x2c,0x27,0xfb,0xcf,0xd3,0xfe,0x49,0xeb,0xcc,0xe9,0xc6,0x27,0xfc,0xac,0xe0,0xe0,0xb7,0x4c,0xd0,0xdd,0xfa,0x43,0xee,0xa0,0xa1,0xb5,0x0c,0xd5,0xd7,0xa6,0x06,0xe8,0xf4,0xce,0x1e,0xd5,0xfb,0xc5,0x0f,0xb3,0xc2,0x1a,0x08,0xb8,0xff,0x44,0x23,0x0c,0x14,0xe9,0x2d,0xe7,0x97,0xd7,0x2b,0xe7,0xac,0xdc,0xcb,0x94,0xee,0x0b,0x1e,0x00,0x50,0x26,0x17,0xf1,0x2c,0x38,0xda,0x0a,0x6f,0xd8,0xc9,0x10,0x26,0xe3,0x0d,0x19,0x1a,0xf1,0x15,0xe6,0xf9,0xdd,0xee,0xab,0x20,0xee,0xfc,0xde,0xdd,0x16,0x23,0x1f,0x9f,0x25,0x2e,0xe6,0x21,0x0d,0xc9,0xfa,0xcf,0xe3,0x01,0xcf,0x24,0x71,0xa5,0xf5,0x2e,0xdf,0x35,0x17,0x30,0xe3,0xeb,0x1e,0x29,0x16,0xfb,0x23,0xe5,0x20,0xf8,0x1e,0xf4,0xb1,0xe9,0xbc,0x08,0x20,0x00,0x17,0xcf,0x03,0x20,0xde,0xbb,0xd4,0xf4,0xc3,0xe7,0x2b,0xe1,0xb0,0x38,0x01,0xdf,0x9d,0x73,0x16,0x17,0xc2,0xe8,0x47,0x15,0xfb,0xc7,0x07,0xfb,0x49,0xd3,0x09,0xbb,0xaa,0x38,0x29,0xef,0xe6,0xc9,0xbf,0x0c,0x4b,0xe0,0x09,0x52,0x15,0x0a,0x94,0x89,0xa6,0xd5,0xe4,0xf6,0x18,0x04,0xe1,0x2a,0xda,0xe6,0xb4,0xd1,0x0b,0x59,0xf7,0xb6,0xc2,0x91,0xec,0xaf,0xbb,0x3b,0xcb,0x22,0xfc,0xf8,0x18,0xc4,0xbd,0x12,0x81,0xc0,0xcd,0xdf,0x09,0xaa,0x0d,0x50,0xe7,0xe3,0x10,0x28,0x25,0x9f,0xd7,0xbc,0xac,0x02,0x3b,0x00,0xcd,0x21,0xee,0xf3,0xdc,0x16,0x10,0xbb,0x25,0xae,0xe1,0x22,0xca,0xfa,0x95,0xf1,0xd6,0x38,0xd7,0x9e,0xd8,0xc9,0xe8,0xd9,0x10,0xd9,0xdb,0xd7,0xeb,0xa2,0x59,0x39,0xd7,0x08,0xd7,0xf1,0x9e,0xef,0x0c,0xc6,0xda,0x17,0xef,0xd9,0xec,0xc0,0x03,0x09,0x1e,0xea,0xef,0x63,0xfb,0xdd,0x89,0xdf,0xaa,0xf6,0xec,0x0a,0x2e,0x31,0xee,0x2e,0x90,0xe8,0x17,0xd5,0x52,0xde,0x29,0xac,0x0b,0xfa,0xf1,0xff,0xb3,0xb0,0x01,0xdf,0x0f,0x53,0xa4,0xea,0xd0,0xe0,0xb0,0xc7,0x22,0xf4,0x1b,0x7f,0xbd,0xe5,0xe4,0x93,0x16,0xca,0xf8,0xb6,0xee,0x01,0x04,0x07,0xf7,0x07,0xfc,0xe4,0xd1,0x00,0xf8,0xc2,0xca,0xfa,0x33,0x03,0xec,0xd3,0xd6,0x03,0x0c,0xce,0x0a,0x15,0xb8,0xf1,0x05,0xe9,0x32,0x95,0xf0,0x0c,0xd8,0x10,0x00,0xcd,0xe0,0xbe,0xf9,0x11,0xac,0xba,0xfc,0x75,0xe7,0x27,0xa8,0x36,0xbb,0xf4,0x35,0x32,0xfc,0xb4,0xdc,0x0b,0x1c,0x50,0x0e,0xad,0xd4,0xc1,0xc7,0xde,0x05,0xdc,0x41,0x0e,0xae,0xfa,0x09,0xf0,0x96,0xe0,0xc1,0xd7,0xc6,0x00,0x9d,0x05,0xff,0xec,0x14,0xce,0xe4,0x09,0x17,0x02,0x04,0xeb,0x58,0xee,0x0c,0x15,0x19,0xd7,0xb1,0xcd,0xea,0x89,0x8a,0x12,0xf5,0x3c,0x02,0x5b,0xf8,0xca,0x06,0xa6,0xc5,0xec,0x11,0xcd,0x30,0xe0,0x04,0x1e,0xf9,0xc4,0xe1,0xae,0xbe,0x12,0x1c,0x03,0xfc,0xf0,0xa2,0x3a,0xae,0x0c,0x6e,0x0a,0xe1,0xe5,0xeb,0xba,0x31,0xbe,0x42,0x27,0xd5,0x00,0xaa,0xcc,0x28,0xcd,0x05,0x09,0xd3,0xd0,0xf4,0x07,0xbe,0x14,0xf3,0x10,0xf2,0x18,0x35,0x1f,0x42,0xe0,0xf1,0xeb,0xd2,0x24,0xfc,0x01,0xc7,0x47,0x9e,0x04,0x17,0x03,0xf4,0xab,0xe6,0x96,0x78,0xbb,0xbd,0x16,0xb3,0x03,0xca,0xda,0x07,0x09,0xc9,0x13,0xf7,0x00,0x14,0xb8,0xc7,0xee,0x02,0x1f,0x1e,0xc6,0x88,0xe2,0x3c,0xd9,0xf9,0xb5,0xfe,0x9e,0x04,0xe4,0x01,0xf4,0x46,0x55,0x0d,0xe3,0x22,0x45,0xf7,0xb7,0xae,0x0b,0x49,0xe7,0x43,0x24,0x49,0x3a,0xd8,0xd7,0x49,0x11,0x06,0x15,0x12,0xec,0x02,0x4e,0x61,0x45,0xf9,0xe9,0x1a,0x0f,0x0b,0x98,0xf8,0x4f,0x22,0x2d,0x1b,0xc7,0xf4,0x21,0xa2,0xe0,0x7f,0xda,0xdc,0xa3,0x2b,0x33,0xf9,0x10,0x1d,0xe4,0xc4,0xd6,0xb1,0xd7,0x05,0xd7,0xa4,0x1e,0x42,0xcc,0xf2,0xc6,0xd4,0xf3,0xc2,0x39,0x91,0x21,0xf9,0xd4,0x24,0xe1,0x16,0xc4,0xf3,0xd4,0xbc,0xfe,0x15,0x11,0x99,0xee,0xd1,0x0c,0x17,0xe0,0x29,0xe0,0x2e,0x5f,0x4f,0x27,0xe7,0x06,0x36,0xcd,0x41,0xe4,0x97,0x18,0x31,0xf7,0x23,0x0a,0x05,0xfd,0x9e,0x17,0x27,0x15,0x03,0x0d,0x19,0x1a,0xe6,0xf1,0x0e,0x2b,0xce,0xda,0xc7,0xc2,0xf8,0xdc,0xc0,0xaa,0x35,0xb9,0xba,0xe4,0xc2,0x16,0x1c,0x38,0xc2,0xc1,0x09,0x23,0xf5,0x0a,0x0d,0xf3,0x0b,0x05,0x49,0xdf,0x05,0x0b,0x22,0x1d,0x3f,0xdd,0x39,0x61,0xc8,0xc5,0x70,0x18,0xdb,0x26,0x24,0x8f,0xbb,0x5e,0x47,0x19,0x0e,0xbf,0xe0,0x1d,0xc8,0xdf,0x1f,0xaf,0x40,0x3d,0x42,0x46,0xfb,0xb2,0xfb,0xe5,0x90,0x26,0xe0,0x19,0x3b,0x13,0x32,0x15,0x54,0x15,0xe5,0xa6,0x9d,0xd3,0xab,0xc2,0xf8,0xb4,0x25,0x10,0x3a,0xce,0x23,0xf4,0xa1,0xcf,0xff,0x0f,0xf8,0x10,0xd8,0x72,0x0e,0xe5,0xde,0xd6,0x0a,0x32,0xb8,0x11,0xec,0x9f,0x19,0x12,0x07,0xc1,0x2a,0xf6,0x33,0xc8,0xfc,0x0f,0xf6,0xf8,0x19,0x13,0x12,0xfa,0x01,0xce,0x26,0xdb,0x11,0x1e,0xbe,0xe5,0xd6,0xdb,0xfb,0xf8,0x2b,0x2a,0x32,0x34,0xf4,0xc5,0x43,0x18,0x06,0xcb,0xd5,0x13,0xe1,0x1b,0xff,0x2d,0x17,0x0c,0xee,0xc0,0xe0,0x9c,0xbe,0x1d,0x0c,0xff,0x25,0x52,0xed,0xf3,0x3d,0xec,0xd3,0x35,0xe2,0x0f,0xcb,0x52,0x0f,0x1b,0xd5,0xee,0x12,0x41,0xdf,0xf7,0x1d,0xdc,0xd9,0xd5,0xf8,0xfa,0xfc,0xe2,0x26,0xf8,0xd1,0x3b,0xd1,0xf0,0x18,0xe9,0x2f,0x37,0x07,0xd8,0xe2,0xd9,0x99,0xdc,0xf1,0xec,0xfc,0xe3,0x1b,0xb5,0x0c,0x2c,0x34,0xfb,0x38,0x26,0xe6,0xa7,0xd8,0xbd,0xd9,0xe8,0xe6,0x21,0x08,0xfd,0x18,0x44,0xf1,0x0a,0xae,0xfd,0xd6,0x45,0x0b,0xcf,0x12,0xf8,0xdd,0xf1,0x28,0xd5,0x0c,0xec,0x19,0x3d,0xe7,0xec,0xf2,0xf6,0xb0,0x53,0x1a,0xe4,0x20,0x21,0x35,0xf0,0xd6,0xcb,0x15,0xdc,0xd7,0xff,0xf9,0xe1,0x9e,0xf6,0xbd,0x08,0xfe,0xdb,0xed,0xd9,0x10,0x37,0xf1,0xbf,0xf6,0x9a,0xf0,0xeb,0x3a,0xf8,0x04,0xc5,0xe2,0xb9,0x05,0x2f,0x29,0x11,0x1f,0x15,0xe8,0x19,0x0f,0xd2,0x18,0xde,0x7f,0x03,0x0d,0xf8,0xdb,0xe7,0xe1,0xe6,0xd8,0x08,0xcc,0xd9,0x29,0xef,0xb4,0x03,0x48,0x29,0x00,0x05,0x0c,0xf0,0x26,0xfa,0xfd,0xcf,0x0f,0x19,0xeb,0xb6,0xdd,0xd6,0x27,0x53,0x13,0xfa,0x0a,0xf4,0xf8,0x0b,0x5f,0xfb,0xcc,0xe7,0xb3,0x21,0xf9,0x68,0x08,0x63,0xb5,0x2d,0xd1,0xea,0x22,0xdd,0x1b,0x03,0xe3,0xcf,0xa6,0xe9,0xd7,0x1e,0x0a,0x1e,0x3f,0xb8,0x08,0xca,0xdb,0x14,0x06,0x3b,0x64,0x27,0x21,0xcd,0xb9,0xf1,0x1f,0xc4,0x08,0x05,0xcf,0xce,0xbb,0xf8,0x8d,0xb9,0xec,0x5b,0x56,0x6f,0x0b,0xe0,0xcd,0x21,0xb8,0xe0,0x10,0xf8,0xc7,0x39,0xea,0x56,0xde,0x36,0xb3,0xf7,0xeb,0xde,0xde,0x1d,0xf2,0x39,0xd1,0xb7,0xf6,0xaa,0x50,0x01,0xc8,0x20,0xcf,0xd5,0x98,0xca,0x08,0xa1,0xf0,0x1a,0xc5,0x1b,0xdc,0xde,0x10,0xce,0x09,0x05,0xba,0xa8,0xf2,0xdf,0xd9,0xed,0xc2,0x1d,0x17,0xf3,0xff,0xca,0x56,0x5c,0xf9,0x14,0x95,0xdc,0x14,0x02,0x5f,0x01,0xc3,0xf4,0x42,0xb1,0x44,0xc4,0x9b,0xb2,0xfd,0xff,0x01,0x2c,0x01,0xbc,0xb7,0xa1,0xd1,0xee,0x16,0x2b,0xe6,0x50,0xef,0xc8,0x3b,0xaa,0xbb,0x15,0xfd,0xde,0xfc,0xe0,0xee,0x0a,0xed,0xf2,0x44,0x06,0xab,0x11,0xee,0xe8,0x05,0xdb,0xeb,0x27,0xf9,0xa9,0xd3,0x08,0xf7,0x60,0x3b,0xf8,0xe2,0xe4,0x07,0xf4,0xf7,0x08,0xf4,0x0c,0x49,0x1f,0xb9,0xef,0xd0,0xc4,0x6f,0x05,0xc1,0xbc,0x0f,0xc0,0xbe,0x33,0x3f,0x81,0xbf,0xcf,0xe3,0x34,0xd1,0xfb,0x2f,0xe9,0x28,0xe0,0xf9,0xba,0x2c,0x18,0xe3,0x23,0xfc,0xf2,0xa8,0x16,0x90,0x29,0xcd,0x66,0x0d,0xd8,0x21,0xeb,0xb5,0xed,0x1b,0xad,0xfa,0x33,0x1b,0x3b,0x9c,0xbd,0x0e,0x9f,0x11,0x06,0xd0,0xd8,0xa2,0x0d,0xb3,0x92,0xc8,0x08,0x22,0xc4,0x0a,0xf9,0x12,0xe6,0x25,0xd3,0x2b,0xeb,0xea,0xfa,0xbe,0x09,0xf6,0x30,0x0f,0xf3,0x05,0x18,0x04,0xee,0xef,0xee,0xbc,0xf1,0xc4,0xe0,0x0c,0xf5,0xfe,0xf5,0xee,0xed,0x05,0xcd,0x3e,0xd5,0xd3,0x15,0xf1,0xd7,0x18,0xb1,0x0b,0xe8,0xff,0xc4,0x37,0x10,0xd7,0xba,0xf2,0x0d,0xbb,0xe8,0x03,0x36,0x2e,0x0d,0xf0,0xf3,0x05,0xd8,0xd1,0xf0,0x0f,0xe4,0x03,0xc8,0xf3,0x06,0xe8,0xf3,0x06,0xf8,0x0a,0xdf,0xc8,0xf9,0xfb,0xd3,0xd6,0xfa,0xf0,0xd4,0x16,0xcd,0xf8,0x2d,0xfd,0xe0,0xfa,0xab,0x14,0xe6,0x1e,0xd6,0x12,0x32,0xef,0x04,0xf9,0xd7,0xec,0xce,0xf7,0xc8,0xfa,0x01,0x1e,0x0b,0x0e,0xfc,0xd5,0xe5,0xf4,0xd5,0x0e,0x06,0xf4,0xeb,0xe2,0xb8,0xe4,0xee,0x0c,0xd4,0xfe,0xd0,0xff,0xe8,0x10,0x13,0xc4,0xad,0xed,0xf7,0xea,0xfc,0xf2,0xf8,0xfa,0xf4,0xd7,0xf4,0xea,0xed,0x22,0x2c,0xf8,0xe9,0xe5,0x2e,0xda,0x7f,0x03,0xf3,0xef,0xf3,0xc2,0xe4,0x39,0xf3,0x07,0x11,0xc4,0xe0,0xdd,0x11,0xe3,0xf7,0xe7,0xf0,0x1d,0xf7,0x11,0xfb,0x07,0x1a,0x11,0x05,0x07,0xf3,0xd5,0xdc,0x2c,0xfe,0xe6,0x23,0xcb,0x15,0x09,0xc0,0xc2,0xdb,0xe7,0x1c,0xea,0xe0,0x34,0xfc,0x11,0x04,0xfd,0xf2,0x0e,0xaa,0xce,0x10,0x19,0xe6,0xff,0xd4,0xe1,0xca,0xdc,0xcf,0x2c,0xbc,0x0d,0xfe,0xf6,0xf1,0x05,0xfe,0xed,0x35,0xd6,0x13,0x48,0xdd,0x27,0x0b,0xdc,0xfd,0x0a,0x23,0x26,0xfa,0xfb,0x13,0xe9,0xd2,0x18,0xe4,0x4f,0xbb,0xcc,0x21,0xe6,0xf3,0x22,0x01,0x04,0x37,0x04,0x09,0x51,0xc9,0xb5,0xe3,0x0b,0x30,0xf2,0x13,0xf4,0xe8,0x13,0x01,0xc4,0xfe,0xfc,0x43,0x52,0xcf,0x20,0xde,0xfd,0xc4,0xc4,0xf6,0xb3,0x3a,0xd9,0xd7,0xea,0xf0,0xef,0xed,0x0b,0x1c,0xcf,0x7f,0x43,0x30,0x25,0x3e,0xce,0x11,0xf7,0xda,0xce,0xf5,0x0d,0x15,0x10,0x0e,0x1f,0xfe,0x45,0xd3,0x26,0xfb,0x1f,0xfc,0x29,0x31,0xf3,0x17,0xf9,0xe4,0xce,0x37,0x15,0x07,0xf0,0xe2,0x2e,0x0a,0x4f,0xc7,0x51,0xcf,0xe9,0xc3,0xe2,0xea,0x12,0xea,0x27,0xb1,0xe6,0x30,0xe6,0xd8,0x09,0xd9,0xf5,0x07,0x13,0xf7,0xf8,0xfc,0xc7,0x19,0xf8,0xe6,0xd2,0x00,0xe0,0x33,0x09,0x05,0x13,0xfa,0x00,0xfc,0x06,0xad,0xcc,0xf8,0x38,0x05,0x05,0x35,0xed,0x1a,0x1c,0xea,0x15,0xec,0xec,0x04,0xee,0xca,0x17,0xe9,0xf6,0x3f,0xf6,0xde,0xd5,0x25,0x1a,0x0c,0x1a,0xea,0xd7,0xd7,0xdd,0x23,0xf8,0xaf,0x07,0xfa,0xbb,0x29,0x35,0xd5,0x02,0xd0,0x02,0xff,0xd2,0x14,0xc5,0x4d,0x1e,0xe7,0xe0,0x1d,0xc0,0xfd,0xd3,0xcd,0x4d,0x23,0xca,0x49,0x07,0xff,0x6f,0x06,0x39,0xdf,0x17,0x1d,0xc5,0x04,0xf1,0xee,0xe4,0xee,0xfd,0x05,0xe9,0x19,0x26,0x17,0x13,0xc5,0xf9,0x2c,0x06,0x26,0xea,0x0c,0xea,0x13,0xb3,0xb2,0xdb,0x0e,0x09,0x19,0xf7,0xff,0x0a,0xe9,0x30,0xdf,0x20,0xca,0xd9,0xf8,0x02,0x0d,0xd1,0xec,0xf0,0x11,0xf3,0xf8,0xd6,0xe6,0xf6,0xd4,0x08,0x0a,0xfa,0xdb,0x00,0x59,0xdf,0xef,0x0a,0xf8,0x00,0xee,0xea,0xfe,0xc0,0xed,0x01,0xd9,0x1e,0x0e,0x41,0x20,0x23,0x18,0xfb,0x1f,0xf1,0x11,0xf4,0xf2,0x34,0xed,0xdf,0xf4,0xe0,0xfc,0xde,0xff,0x26,0xd6,0xc3,0x14,0xdf,0xfa,0xcc,0xda,0xdd,0x12,0xee,0x03,0x02,0xd0,0xdb,0x2d,0xdb,0xda,0xf3,0xf8,0xd4,0x27,0xbc,0xdf,0x06,0xf6,0xff,0x1b,0x00,0xd2,0x06,0x10,0xfd,0xfd,0xeb,0xff,0xe9,0xe5,0xdd,0x03,0xdc,0x06,0x3f,0x45,0xfe,0x08,0x20,0x24,0x2f,0x1e,0xf3,0xf3,0xc2,0x20,0xd0,0xfc,0xed,0xbf,0x03,0xfb,0xee,0x04,0x18,0xd9,0xd2,0x1b,0xe2,0xdd,0xfe,0xdb,0x21,0x2a,0xe6,0xf7,0x07,0xd4,0x04,0xe3,0x27,0x27,0xdc,0x03,0xc8,0xed,0xe0,0x1b,0xf7,0x34,0xc8,0xe5,0xc3,0x1d,0xfb,0x08,0xeb,0xd5,0xe6,0x21,0x11,0x21,0xed,0x2a,0xc7,0xd8,0xe1,0xfe,0x0a,0xe5,0xb9,0x10,0xff,0x23,0x1b,0xb1,0xf4,0xe3,0xf2,0x11,0xe7,0xd4,0x0d,0xfe,0x00,0x21,0xd6,0xdd,0x03,0xe5,0xf0,0x11,0xf7,0xed,0xe1,0xfc,0x0c,0x09,0xa9,0xdf,0xed,0xdc,0xf2,0xb8,0xfc,0xf2,0x06,0x3a,0x32,0x1f,0xfb,0xac,0xe0,0xec,0x01,0x2f,0xdd,0xcd,0x0e,0xcc,0x16,0x2f,0x20,0x2e,0x03,0xf4,0x1f,0xdf,0xbf,0xd8,0x14,0x0a,0x0b,0xe4,0xf8,0xec,0xd7,0xe2,0xe0,0xe6,0xfa,0xf6,0xcd,0xf9,0xd5,0xcc,0xe2,0xfd,0x16,0xf9,0xea,0x0c,0xc6,0xcc,0x26,0xd3,0xec,0xea,0xed,0x08,0xe2,0xee,0xe4,0x00,0xe2,0xfa,0xe1,0x0e,0x0d,0xfe,0x29,0xc9,0x1d,0x1d,0x0d,0xfb,0x26,0xfd,0x0e,0x22,0xf4,0xe8,0xc3,0x5d,0xe4,0xff,0x7f,0x2f,0x20,0xee,0xc8,0xe7,0xf7,0xcc,0x0b,0xe3,0x0f,0xa5,0xd0,0xcd,0x08,0xe6,0xff,0xc7,0x01,0x12,0xe8,0xe2,0xd6,0xf2,0xfc,0xf2,0x06,0xf1,0xa2,0xfa,0xc7,0xd5,0xdd,0xc9,0xcb,0xe5,0xe5,0xd2,0xfb,0xf0,0x00,0xe0,0xfc,0x04,0xf4,0xd6,0x40,0x1a,0xa2,0xee,0xe7,0x15,0xd4,0x16,0xdd,0xf8,0x00,0xd0,0xe2,0x3c,0xec,0xe4,0xe3,0xde,0xf4,0x04,0xc3,0xd7,0x11,0x28,0xed,0xd2,0xa6,0xe1,0x21,0xe7,0xf3,0x3a,0x07,0x1e,0x72,0x38,0x09,0xea,0xf0,0xf4,0x08,0xf2,0xd4,0x01,0xcf,0x1a,0xd1,0xfb,0x3e,0xc6,0xf1,0x30,0xe4,0xeb,0x38,0xb3,0xf7,0x18,0xd7,0xe6,0xf6,0x19,0xfe,0x04,0xc5,0x2f,0xf6,0xf2,0xe5,0xe4,0xca,0x08,0xfd,0x5f,0xbf,0x09,0xb3,0xfc,0xea,0xcf,0xc7,0xe0,0xac,0x2f,0x1c,0x36,0x20,0xf6,0xb2,0xc2,0xa2,0x0d,0x05,0xdf,0xc3,0x1f,0xc9,0xf3,0xfa,0xb7,0x3b,0x05,0x19,0xb1,0xf2,0xe6,0xf5,0x07,0x1d,0xeb,0xc0,0xa6,0xb5,0xea,0xd9,0xf7,0xf0,0xf9,0x05,0xf6,0xff,0x2d,0xf2,0xc9,0x02,0xd3,0x03,0xbb,0xb2,0xe2,0xe0,0x38,0x40,0xcd,0xf7,0xda,0x20,0xd4,0x26,0x0d,0x32,0xb4,0x13,0xbb,0x19,0x6f,0xf6,0xe7,0xbf,0xe1,0x19,0xaf,0x14,0xc5,0x3c,0xfd,0xdd,0xf7,0xef,0xcc,0x08,0xce,0xd4,0xf5,0x04,0xc2,0xc9,0x02,0xaa,0xc3,0xb3,0xc6,0x19,0xfe,0x0f,0x28,0xe4,0x81,0x13,0x17,0xf8,0xbd,0x14,0x08,0x2d,0xfb,0x3d,0xf7,0x07,0x0f,0x12,0xe5,0xda,0xcb,0x41,0xda,0x2b,0xf4,0x19,0xcd,0x2d,0x38,0x10,0x19,0x2a,0x16,0xd1,0xdd,0xda,0xd7,0x23,0x13,0x0c,0xe6,0xda,0x93,0xe3,0xc2,0xcd,0xe1,0xe4,0xe8,0xe8,0x07,0xf6,0x19,0x0c,0xd1,0x14,0x09,0xd8,0xc4,0x20,0x0d,0xc6,0x0b,0xcf,0x00,0x00,0xfc,0xea,0xde,0xaa,0x0f,0x0d,0x19,0x95,0xe7,0x44,0xb3,0x2c,0xcc,0x38,0x39,0xdc,0xc1,0xe0,0x1f,0xd7,0xd0,0x07,0xbc,0x30,0x3f,0x0a,0xde,0xea,0xe7,0xf1,0xc2,0xf2,0x1c,0xb2,0xee,0xee,0xb0,0xea,0xdc,0xcf,0x95,0x17,0xe8,0x4f,0xce,0x49,0xb9,0xdd,0x0f,0xe9,0x02,0x32,0xa9,0xf0,0xe8,0x19,0x32,0x10,0xfa,0x09,0xbd,0xd4,0x01,0x1d,0xf8,0x23,0xec,0xde,0xae,0xe8,0xd3,0x14,0xe4,0x31,0xfd,0x56,0xeb,0xb9,0x03,0x06,0xeb,0x32,0xd8,0xe5,0x1f,0x35,0x53,0xfe,0xda,0x0c,0xb1,0xdb,0xc1,0xcd,0x53,0xe6,0x16,0xfb,0xf3,0xd7,0xde,0x01,0xc8,0xef,0x23,0x2e,0xda,0xdf,0xc0,0xc9,0xe4,0xf0,0xe1,0xcb,0xe7,0x7f,0xf5,0xe8,0xe2,0x14,0x17,0x2f,0xe1,0xda,0xcb,0xa2,0x2d,0x0b,0xfb,0xee,0x10,0x20,0xf6,0x0f,0x15,0xfd,0x11,0xd4,0x50,0xec,0xfb,0xf7,0xd8,0xb3,0xe6,0xe2,0xbe,0x3a,0x32,0xf1,0xf2,0x36,0xc3,0xaa,0x27,0xf9,0x31,0x41,0xf6,0xd7,0x0d,0x07,0xc8,0xee,0xfc,0x13,0x00,0xeb,0x1c,0xe5,0x08,0x1f,0x17,0xf7,0xf1,0xee,0xe2,0x1a,0xf9,0xcc,0xec,0x95,0x26,0xee,0x03,0xf1,0xbf,0x0e,0x1c,0x46,0xf6,0x16,0x1c,0xf6,0xd4,0x1a,0xfa,0xef,0x0d,0x44,0xe4,0x3e,0x6d,0x3f,0x1c,0x43,0xd8,0xfd,0x3a,0xcb,0xe8,0x06,0xfc,0xf6,0x07,0x3f,0xfa,0xef,0xc1,0xb7,0xfd,0x0b,0x3c,0x0f,0xe1,0x0b,0xe1,0xef,0x9b,0xd3,0x95,0x1d,0xf3,0xf5,0xf1,0xff,0x16,0x02,0xf4,0x15,0xf5,0xa6,0xd5,0xf6,0x03,0x1c,0x3a,0xfd,0xe0,0x05,0xff,0x0e,0xda,0xce,0xc0,0xdd,0xcd,0xe2,0xdf,0xba,0x14,0xc7,0xf9,0xf8,0x12,0xfd,0xe3,0x31,0xe5,0x8e,0xfb,0x07,0xf0,0xf9,0xf3,0xd5,0xd5,0x08,0xa6,0x01,0x11,0x33,0x23,0x24,0x45,0x4e,0x3a,0x0d,0x20,0xd7,0x1e,0x39,0x19,0xd7,0xfd,0xa0,0xc6,0xe5,0xe7,0xd3,0xba,0x11,0xfc,0x2a,0xfe,0x19,0xf0,0xcb,0xce,0xe1,0xdd,0x35,0x0c,0x3c,0xf2,0xf9,0x07,0x17,0xc1,0xf9,0xd5,0x06,0x11,0x87,0xf1,0x0d,0x0d,0xee,0xf1,0xdb,0xa5,0x12,0xe6,0xd2,0x29,0x37,0xd9,0xe4,0xcb,0x38,0xc4,0x2a,0x14,0xbf,0xc2,0x2b,0x0e,0xe6,0xda,0xd7,0xce,0xf6,0xf7,0x39,0x1d,0xfb,0x01,0xfe,0xe9,0xb2,0xde,0x99,0xfb,0x38,0x24,0xbc,0xe9,0xd6,0xc8,0x1f,0xbb,0x55,0xfc,0xe2,0xdc,0x33,0xde,0x01,0x08,0x0e,0x19,0xe9,0x20,0x33,0xfb,0x9b,0xdd,0x0c,0xbb,0xf2,0xc6,0x1d,0xbc,0x16,0x1a,0xd9,0xc6,0x81,0x35,0xfd,0xe8,0x1e,0x25,0xbb,0x27,0xd0,0x16,0xe4,0xd9,0x39,0xad,0xa0,0xd3,0xe1,0x20,0xfa,0x01,0xee,0x08,0xdb,0xdc,0x6a,0x2f,0xc1,0x43,0xf0,0x01,0x07,0xb1,0xc6,0xa7,0x32,0x02,0xcf,0x20,0x06,0x48,0x28,0x11,0xc4,0xec,0x6b,0xd0,0x14,0xee,0x6a,0x26,0xd7,0xf2,0x46,0xff,0x29,0xa5,0xdf,0xe1,0xdc,0xd6,0x11,0xd8,0x08,0xe9,0xf2,0x0e,0xdc,0x89,0xdf,0xe6,0x14,0xec,0x3a,0x10,0x3e,0xed,0xe2,0x20,0x3e,0x13,0xf9,0xba,0xfe,0xd7,0xca,0xf2,0x44,0x1f,0x04,0x14,0xc1,0xfb,0x0b,0xf2,0x66,0xc8,0xf8,0x45,0x0b,0x36,0x1b,0xd1,0x28,0x1c,0x00,0x0b,0x14,0xb5,0xfa,0xd3,0xf6,0x2a,0xd4,0xcc,0xc9,0xaf,0xd8,0xca,0x06,0x26,0x02,0xd1,0xde,0xc5,0x02,0xc0,0xf0,0x1d,0x32,0x31,0xd4,0x2f,0xf9,0xf3,0xe2,0x1f,0x97,0xb8,0x1d,0xc4,0x2d,0xfe,0xbe,0xfa,0xce,0xd8,0x15,0xea,0xbd,0xda,0x56,0xd7,0x09,0xca,0x23,0x14,0xbf,0x5c,0x52,0x1b,0x3b,0xe4,0x19,0xf1,0xec,0x15,0xfb,0xa7,0xb7,0xe2,0xdf,0xd8,0xe8,0x23,0x2a,0x1d,0x04,0x1b,0x20,0xf0,0xf3,0x83,0x2e,0xdb,0xf6,0x99,0xfd,0x33,0x09,0xf1,0x3b,0xfd,0x20,0xd7,0x96,0x04,0x01,0x2b,0xd1,0x0b,0x32,0x4b,0x29,0x20,0xfa,0x0e,0xcd,0xdd,0x4c,0xae,0x00,0xaf,0x0b,0xf5,0xe5,0x03,0xdb,0x99,0xc5,0xe6,0xf5,0x81,0xe7,0x0b,0x11,0xc2,0x1f,0xf6,0xfb,0x2f,0x47,0x40,0xff,0x1f,0xfe,0xdc,0xc6,0xc5,0xed,0x04,0x1e,0x27,0x12,0xc3,0x2f,0x1d,0x23,0xfe,0xed,0x41,0x3f,0xfb,0x09,0xf8,0xf1,0xf4,0xff,0xc7,0xc5,0x1b,0xdb,0x01,0x8c,0x0e,0xf2,0x36,0xf3,0xfc,0xcd,0xd2,0xfb,0x0a,0x15,0x46,0x25,0x03,0xfe,0xeb,0xca,0xba,0x11,0x19,0xec,0xba,0x04,0xba,0x25,0xef,0x1c,0xfb,0x09,0x0e,0x22,0x1e,0xda,0x01,0xf9,0x36,0xec,0x24,0xbd,0xed,0x10,0xee,0x19,0xb7,0xa8,0xf2,0xe0,0x9a,0x12,0xdb,0xb9,0xf9,0xbd,0xc8,0x10,0x24,0x06,0x8f,0xeb,0x0c,0x19,0xd9,0x0a,0x8f,0xd7,0xc1,0x0a,0xd9,0x43,0x0d,0xb6,0x03,0xe5,0x09,0x2e,0xfd,0xdc,0xd1,0xf9,0xa1,0xd7,0x10,0xc0,0xf8,0x0f,0xe2,0x15,0x30,0x15,0x25,0xed,0xf7,0x1e,0x2a,0xb3,0xdb,0x48,0x21,0x01,0xf0,0x04,0xc1,0x05,0xfd,0x20,0xd4,0xe4,0x04,0xc3,0x01,0xde,0xe2,0xe0,0x03,0xef,0xd2,0x22,0x0d,0x29,0xfb,0xca,0xf1,0xe5,0x11,0x07,0xe3,0xe3,0xe9,0x3a,0xad,0x06,0x13,0xfc,0xca,0x39,0xd0,0xf2,0xf4,0x0f,0x0f,0x1d,0xd4,0xf5,0xd4,0x1c,0xc5,0x2f,0x0f,0xdd,0x01,0x0b,0xc7,0xfd,0xfe,0x20,0x24,0x24,0x2d,0xe8,0x13,0x1f,0x1a,0xfa,0xfc,0x11,0xe9,0x25,0x07,0x05,0xf9,0xea,0x11,0xd4,0xac,0x17,0x07,0x26,0x04,0xf9,0xc0,0xe1,0xf9,0x00,0xc3,0x04,0xc1,0xfb,0x25,0xe3,0xf6,0x1b,0xf0,0x12,0xf1,0xf8,0xd0,0xf1,0x1b,0xe2,0x08,0x32,0xf1,0x15,0xf2,0xb8,0xe4,0xe3,0x12,0xef,0xd2,0xd9,0xdc,0xf4,0xbe,0x1d,0x08,0x19,0x13,0xdc,0xd0,0x20,0xf5,0xdc,0xd9,0x29,0xeb,0xee,0xc8,0x1b,0xb3,0x0b,0x0c,0xda,0xd8,0x20,0xfa,0xc8,0xeb,0x0e,0x1d,0xe8,0xd8,0xd0,0x20,0x2b,0xf4,0x31,0x19,0x22,0xce,0x1d,0x23,0xed,0xe7,0x1a,0xcb,0xd6,0xe0,0xea,0x09,0x0b,0xbd,0xf3,0x09,0xd0,0x07,0xd5,0x16,0xf1,0xfa,0xfa,0x09,0xce,0xf0,0x1b,0xe9,0x43,0xf8,0xe5,0xfd,0x05,0xdd,0x31,0xfa,0x0d,0x16,0x08,0xfa,0xd0,0x06,0x49,0xcd,0xf3,0xd1,0x06,0xf4,0xf5,0xf2,0x25,0xef,0x03,0x32,0x45,0x96,0x22,0x24,0x08,0xe8,0x37,0xb6,0x06,0x1f,0xda,0xf3,0xd8,0xc9,0x0d,0xd5,0xcb,0xac,0xdd,0x01,0x09,0x09,0x12,0x19,0xba,0xfa,0x09,0xd8,0x11,0x04,0x16,0xec,0x25,0xf0,0xe2,0x30,0x04,0xeb,0x0b,0xfc,0xd8,0xec,0x05,0x10,0xf4,0x01,0x0f,0x08,0x06,0xfd,0xf6,0x7f,0x10,0xf2,0xf8,0xd9,0x0e,0x04,0x1b,0x1c,0xfa,0x1e,0xc6,0xf0,0xa6,0x0f,0x2d,0xdb,0xc3,0x5c,0xb3,0xf0,0xcd,0x31,0x68,0x04,0xee,0x1b,0xe0,0x01,0xfc,0x16,0xe6,0xf7,0xf8,0x2d,0xaa,0xfa,0xe2,0x07,0x02,0xc3,0xdf,0xd1,0xe6,0x23,0xe4,0x01,0x00,0x36,0xa5,0x03,0xdc,0xd2,0xc5,0xda,0xe0,0xca,0xf3,0xba,0xee,0xf9,0xec,0x41,0x55,0x38,0x00,0x01,0x9b,0x17,0xbd,0x41,0x08,0xde,0xbc,0x26,0x31,0xef,0xf9,0xda,0x0b,0x32,0xcf,0xd9,0x08,0xd6,0x0e,0x56,0x21,0x2d,0x28,0xec,0x01,0x0a,0xc1,0x71,0xf6,0x23,0xf7,0xe3,0x04,0xe2,0xf7,0x23,0x81,0xd4,0x0b,0xf5,0x0e,0x33,0xae,0xed,0x0e,0xe5,0xfd,0x2d,0x2f,0x26,0xb3,0xe8,0xd0,0xf6,0xd2,0xf9,0xc8,0xe5,0xec,0x12,0xd3,0xe9,0x09,0xf0,0x16,0x02,0x9f,0xee,0x05,0xe2,0x08,0x03,0xbe,0xce,0xc6,0x61,0x0b,0x0e,0x0e,0x07,0x13,0x2b,0x13,0xdf,0xe8,0x9d,0x07,0xb8,0x0d,0x9b,0xec,0xbe,0xd4,0x51,0x21,0x15,0xb9,0xec,0x08,0xa3,0xfc,0x54,0x2b,0xed,0xed,0x0f,0xec,0x13,0xfe,0x03,0xe9,0xdb,0x3a,0xaf,0xad,0xde,0x42,0xfb,0xff,0xe6,0x07,0x48,0xf8,0xeb,0xdb,0xd1,0x20,0xe8,0xaf,0x3e,0xad,0xe4,0xed,0xe8,0xf1,0xea,0xf8,0x06,0xfe,0xb4,0x2b,0xb9,0xe6,0x06,0xf8,0xd6,0xd7,0xf7,0xf4,0xf0,0x11,0x0a,0xf5,0x1c,0xe4,0xd4,0xde,0x9a,0x1e,0xf5,0x30,0xca,0x26,0xec,0xd1,0x07,0x05,0xdf,0xb8,0x0f,0xd5,0xc2,0x1d,0x26,0xe2,0xc9,0xbc,0xc9,0x89,0xe3,0xb5,0xfb,0x16,0x98,0xdb,0xc8,0xd1,0xf0,0x06,0x97,0x27,0x0d,0x0b,0x1d,0xfb,0xfd,0x1f,0x11,0x44,0xd7,0xce,0x00,0x39,0xe4,0xf3,0x15,0x13,0xf8,0x1c,0xd7,0x0b,0xf0,0xf2,0x25,0x0b,0xe6,0x07,0xf1,0xe6,0xf3,0x02,0x00,0x25,0xe5,0xfd,0x23,0x14,0xd3,0x0a,0xe5,0x05,0x13,0x43,0xe3,0xee,0xe2,0xe6,0xf5,0xf9,0xfd,0x24,0xd2,0x20,0x29,0xde,0x0b,0xfa,0x10,0xd8,0xe4,0xfa,0xd3,0x05,0xf3,0x24,0xdc,0x02,0xe8,0xe8,0xf0,0xf0,0x2c,0xdb,0xd9,0x1c,0xf2,0xfc,0xf0,0x08,0x17,0xf4,0xe0,0xeb,0x0f,0xe9,0xff,0x0a,0xfb,0xf7,0xe7,0x05,0x0e,0x10,0x05,0x2c,0x06,0xd9,0x08,0x02,0x0c,0x35,0x08,0x17,0xf6,0xf8,0x08,0x17,0xdf,0xef,0xfb,0x0d,0xb6,0xc1,0x01,0x35,0xf5,0xd2,0xfe,0xe2,0x1c,0xfb,0xe1,0xe7,0x16,0x0b,0x0b,0xeb,0x1a,0x15,0xd0,0x00,0xdd,0x24,0xf4,0xf8,0xed,0x29,0xf5,0x19,0x09,0x0e,0xe8,0xef,0x1d,0xf1,0xdd,0xe3,0xd1,0x6b,0xf1,0xf4,0x09,0xf5,0x1d,0x57,0xd9,0x7f,0x04,0x15,0xf9,0x0a,0xdb,0xd4,0xea,0xc7,0xf6,0x07,0x06,0xde,0xfe,0xed,0x12,0xf2,0x6f,0x14,0xf6,0xca,0x05,0xdf,0x1e,0x17,0x07,0xe7,0xf8,0xd6,0xf3,0xed,0x11,0xd2,0x22,0x1a,0x1f,0xf2,0xf3,0xe2,0x0f,0x11,0xea,0xfa,0x6f,0xeb,0xec,0xf5,0xee,0x02,0xd7,0xfe,0xc7,0x19,0xf1,0x0e,0x03,0x05,0xfc,0xd7,0xc6,0xf5,0x07,0x44,0xf7,0x02,0x0e,0xfc,0x17,0xe2,0xf0,0x1b,0xf9,0xf5,0xe6,0xf8,0xea,0xf2,0x0d,0x19,0x04,0x1a,0xed,0x0f,0xe8,0xdc,0xd9,0xfc,0x0c,0xf6,0xf7,0x19,0x5d,0xf0,0x1d,0x4e,0x1f,0x18,0xe4,0xd5,0x14,0xf9,0xf7,0xf1,0xab,0x6b,0xd7,0x0c,0xfe,0xfa,0xc0,0x9d,0xca,0x07,0xd8,0x1f,0xf3,0xfa,0x09,0xba,0xdd,0x09,0x1e,0x18,0x0d,0xf4,0x30,0x39,0xef,0xf6,0xf8,0xd6,0x2b,0xd5,0xf6,0xb8,0xdb,0x0e,0xd2,0xf6,0x4a,0xf9,0x19,0x06,0xf1,0xaa,0xee,0xc6,0xdc,0x21,0x13,0x5b,0x3d,0x23,0xc4,0x30,0x1f,0x3d,0x41,0x06,0xea,0xe2,0x17,0x20,0xd6,0xef,0x81,0x13,0x1d,0x1b,0x01,0xce,0xf7,0xf1,0x43,0x2d,0x00,0xe6,0x1d,0xc3,0xed,0x07,0xd3,0x0b,0x2d,0xef,0xed,0x1b,0xe7,0x30,0xc8,0xd3,0xf2,0x08,0x03,0xb7,0xec,0xdc,0x1c,0xb0,0xcc,0x56,0x22,0x48,0xaa,0x07,0xe5,0xe2,0x0a,0x07,0xf8,0xbe,0x3c,0xe1,0x25,0xc4,0x34,0xef,0xa6,0x1e,0xfd,0xba,0xaf,0x05,0xda,0x3b,0xef,0xba,0x02,0xd8,0x14,0x31,0x15,0x00,0x08,0xba,0xf6,0xe7,0xff,0x32,0x31,0xd4,0x1b,0xf0,0x08,0x1f,0x9c,0xf9,0x1c,0xde,0xdf,0x0d,0xe0,0xe8,0x47,0xd8,0x22,0x04,0x09,0xec,0xfc,0x0b,0x14,0xc8,0xed,0xe8,0xd2,0xb2,0xa9,0x15,0xea,0xf0,0x13,0xfd,0xff,0xf0,0xda,0xf9,0xf2,0x0f,0x10,0xfc,0x11,0xf5,0x16,0x3f,0x01,0x01,0x19,0x22,0x38,0x02,0xbb,0xf6,0x13,0x4a,0x23,0x17,0x11,0x40,0xd2,0xcb,0x19,0x0b,0xfb,0xf0,0xef,0x30,0x1d,0x1b,0xca,0xde,0x22,0xeb,0x02,0x17,0xc0,0xb0,0x21,0x07,0x2f,0x00,0xe5,0xb2,0xed,0x83,0x20,0xdb,0x41,0x04,0x0a,0xee,0xc8,0xe7,0x09,0xf8,0xf4,0x10,0x30,0xda,0x0a,0x14,0xfa,0xbf,0xf9,0xce,0x15,0xf1,0xfc,0xbd,0x1e,0x17,0xf4,0xe0,0xe6,0xcd,0xfd,0x29,0x25,0x02,0xcd,0xc7,0xb6,0xe5,0x06,0x01,0xd6,0x1c,0xfd,0xfa,0x18,0xfd,0xc8,0xc3,0x17,0xe2,0x1f,0xc8,0xe7,0x36,0xc4,0xef,0xf2,0xd4,0xd2,0x14,0x21,0x06,0x07,0xfc,0x06,0x04,0xf0,0xc5,0x11,0xc6,0x19,0x09,0x30,0xf9,0x12,0xfe,0xf4,0xfd,0xf7,0xf5,0x13,0x1c,0xfe,0xd4,0xd8,0x08,0x28,0x23,0xf5,0x05,0x13,0xfb,0x01,0x6a,0x1c,0xe0,0xea,0xfb,0x23,0xf9,0x0a,0x04,0x3d,0xf2,0x19,0x0a,0xcf,0x0b,0x00,0xd5,0x12,0xdd,0x12,0x2c,0xe1,0x18,0x29,0x02,0x1b,0x08,0x08,0xee,0xda,0xd6,0x1c,0xf6,0x1d,0xb8,0xaa,0xd9,0xf3,0x0e,0xf6,0xef,0xd1,0xf6,0xf4,0xb5,0xfd,0xd9,0xdd,0xf8,0x38,0x0b,0xeb,0xe5,0xfe,0x00,0xf9,0xcb,0xec,0x0c,0xf0,0xf2,0x0f,0xf9,0xcd,0xd1,0x31,0xd0,0xcc,0xe7,0x2a,0xd4,0xee,0xf4,0xaa,0xe9,0x06,0xe7,0xea,0xee,0xe8,0xff,0xf3,0xe3,0xf8,0x10,0xc8,0xed,0x01,0xd0,0xee,0x02,0xe7,0x03,0xc1,0xe4,0xd3,0xba,0x1c,0x25,0x49,0xe4,0xf1,0xdf,0xf6,0xbd,0x49,0x0b,0xbb,0x03,0xe9,0xfb,0x4b,0x1b,0xf4,0x7f,0xe0,0x27,0xd2,0x04,0x0d,0x08,0xcc,0xbf,0xf9,0xed,0xee,0xed,0x54,0xc1,0xf3,0x04,0xb5,0xce,0xe7,0xc5,0xf6,0xea,0xcd,0x09,0x0f,0xfe,0x37,0xdd,0x0e,0x0b,0xf8,0x09,0xbf,0xf8,0xcc,0xe7,0xf8,0x43,0xfe,0x0d,0xfb,0xe7,0xdf,0xf5,0x3a,0xc6,0x29,0x29,0xfc,0x31,0xf3,0xf0,0x10,0xd9,0xd8,0x05,0xcb,0x02,0xee,0x08,0x1d,0x53,0x06,0x1c,0xe3,0xe4,0xed,0xd8,0xcf,0xeb,0x3b,0xeb,0x3b,0x0b,0xdb,0x46,0xc8,0x05,0x2a,0xe5,0x04,0x0f,0x99,0x43,0xba,0x3a,0xfd,0xf5,0xd5,0xee,0x44,0x30,0xe8,0x18,0xf6,0xe3,0xf1,0xf6,0x25,0xe3,0x0e,0x43,0x35,0xfd,0xc0,0x0c,0xf8,0x59,0xe3,0x00,0xf7,0x11,0xcd,0x1b,0xd1,0xef,0x34,0xd4,0x93,0x07,0x2f,0xf0,0xe6,0xda,0xc7,0xf4,0xc7,0xd2,0xeb,0x15,0xef,0xf1,0xe1,0x5e,0xce,0x29,0x12,0x3f,0xde,0xef,0x2a,0x19,0x25,0xe6,0xf8,0x07,0x0a,0x54,0x3f,0xf4,0xf3,0xcf,0xeb,0xed,0xd3,0x1d,0xc7,0xcf,0x24,0xe6,0xdb,0x17,0x0d,0x56,0xd4,0xc6,0xeb,0x23,0xaf,0xb2,0x19,0xea,0x3e,0x31,0xe7,0x17,0x05,0xcb,0xcf,0x5d,0x05,0x05,0x32,0xfc,0xeb,0xd2,0x0c,0xd5,0xf6,0x15,0xda,0xd4,0x15,0xd9,0xba,0xcd,0x07,0xd1,0xf7,0x30,0xe0,0x12,0x1c,0xd5,0xcf,0xc1,0x2a,0xe1,0x00,0x9f,0xb1,0x10,0xf2,0xf6,0x27,0x03,0x7f,0x10,0x1f,0x2e,0x0b,0xea,0x22,0xd4,0xc9,0xa9,0xdb,0x0b,0x13,0xad,0xa9,0xe8,0x30,0x15,0xda,0xf3,0xe8,0xd0,0x19,0xfc,0x03,0xf1,0xe2,0xbb,0x08,0xd0,0x3b,0x27,0x22,0xd9,0x0d,0x4e,0xee,0xe6,0x16,0x1e,0x14,0xb4,0xe9,0xde,0xf9,0x27,0x01,0x0e,0xf2,0xf2,0xf1,0xe6,0x00,0xc4,0xd9,0xe8,0x33,0xf0,0x34,0x10,0xd0,0x02,0xf1,0xeb,0x28,0x26,0xff,0x49,0xe5,0x01,0x37,0x4e,0x29,0xf8,0xc1,0xe3,0x22,0xb9,0x1f,0x02,0xfd,0x0e,0xb7,0xd6,0xc7,0xf9,0xcd,0xcd,0x1a,0x17,0xe6,0xee,0x05,0xd1,0xe5,0xed,0xf9,0xe1,0x32,0x27,0xe6,0xf0,0xd0,0x31,0xe1,0xea,0xd4,0x30,0x06,0x43,0xec,0xf6,0xf3,0x22,0xf2,0xf6,0xd0,0xda,0xfd,0x0f,0xad,0x01,0xda,0x0a,0xc3,0x10,0xf8,0x9f,0xfe,0xe4,0xf4,0xb0,0x2f,0x13,0xd7,0x8b,0x13,0xf6,0xce,0xd9,0x05,0x9e,0x13,0xfb,0x12,0xfe,0x9b,0xf2,0xf5,0xbc,0x18,0xf5,0x10,0xd1,0x18,0xd8,0x0a,0x49,0xea,0xd2,0x0d,0x02,0xfd,0xf7,0xe1,0x19,0xee,0xb4,0x14,0xe1,0xf5,0xb3,0xcc,0xe2,0xf2,0x15,0x52,0xdd,0xd9,0x10,0x22,0x41,0x44,0x01,0x21,0xb8,0x1c,0xdc,0xd9,0xd9,0x0e,0x0f,0x30,0xd1,0xd2,0xe8,0xc4,0xdf,0xed,0xec,0xc6,0x36,0xdb,0xfb,0x0f,0x10,0x2e,0xbd,0xb5,0x22,0x23,0xf8,0x22,0x0d,0xde,0xc7,0xe6,0xed,0xfb,0xe1,0x4a,0x9a,0x24,0xd0,0xf6,0xe6,0x30,0xdc,0xce,0xca,0xe5,0xfb,0xe9,0xfc,0x24,0xd1,0x0b,0xe2,0xce,0x07,0xdb,0xae,0x34,0x08,0xd3,0x2c,0xb5,0xfc,0xfa,0xf4,0x05,0xfe,0x15,0x2b,0xfb,0xe8,0x2f,0x30,0xa3,0x04,0xad,0x0c,0xe7,0xe3,0x04,0xea,0x41,0x3c,0xfc,0xe0,0x9e,0xb8,0xf8,0x54,0xdd,0xed,0xfd,0xcb,0x2b,0x4b,0xf8,0x00,0xc6,0xe7,0xff,0x24,0x1f,0xee,0xc2,0x53,0xf0,0x0a,0xf7,0xcd,0x27,0x1e,0x06,0xe4,0x12,0xcc,0xb4,0x2e,0x08,0xfd,0xfa,0x1a,0xf1,0x03,0xeb,0xbe,0x0b,0xc1,0xea,0x81,0x29,0xe9,0xb9,0xc0,0xde,0x23,0xf7,0xdd,0xe8,0xd2,0xdc,0x1c,0xec,0xd1,0x04,0xe0,0x1f,0xf7,0x0c,0x26,0xe5,0x01,0xe6,0xe9,0x08,0xce,0x1f,0xee,0xbd,0x06,0x13,0x08,0xf0,0xf7,0xf3,0x26,0x1f,0x12,0x14,0xbe,0x44,0xfe,0xdc,0x55,0x47,0x24,0x0d,0xd7,0xdb,0xc0,0xd0,0x1f,0x28,0x03,0x92,0xde,0xe7,0x15,0xf4,0x32,0xaf,0x3a,0x2c,0x13,0xd1,0x18,0x24,0xb8,0x5a,0x47,0x33,0x01,0xca,0x19,0xeb,0x05,0xda,0xb7,0x81,0xf4,0xde,0xde,0x06,0x3d,0x90,0xeb,0x1a,0xe7,0xde,0xe2,0xd0,0x0f,0x0a,0x08,0xeb,0x21,0xad,0x06,0x0e,0xae,0x00,0x18,0x1e,0x2f,0x4b,0xc0,0xda,0xf3,0x42,0x27,0x41,0x36,0x55,0xce,0x1a,0xce,0xc7,0x12,0x4f,0xc9,0x22,0xae,0x17,0x2d,0x09,0xea,0xc5,0xb0,0xd4,0xe8,0x17,0x2e,0xdd,0x34,0x40,0xdb,0x06,0xea,0x13,0xa4,0x27,0xf1,0x02,0x34,0xdb,0x14,0xfe,0xfd,0x26,0x3c,0x15,0xc6,0x12,0xa2,0xb5,0x03,0x2a,0xf0,0xd8,0xc1,0xf6,0xfa,0x26,0xaa,0xc9,0xdd,0x21,0x39,0x55,0x32,0x2c,0xcb,0x20,0xcc,0x02,0x25,0xa9,0xed,0x05,0x50,0xc6,0x48,0x37,0x14,0xbf,0xa6,0x39,0x1f,0x44,0xed,0x2d,0x0d,0xde,0x1f,0x37,0x99,0x99,0x09,0x15,0xeb,0x12,0xe2,0xfe,0xdc,0x91,0xc7,0xe4,0x05,0xd9,0xf0,0xf1,0xe7,0xe3,0x1d,0x14,0x10,0xca,0xcc,0xaf,0xe1,0x04,0x43,0xdc,0xe2,0xfc,0x31,0xd3,0xe3,0x21,0x13,0xd9,0xd9,0xa0,0x46,0x16,0x21,0x24,0x10,0x1e,0xe2,0x06,0x19,0xeb,0xdc,0xde,0xc6,0x2e,0xba,0xfc,0x2b,0xce,0x16,0xd2,0x10,0xe2,0xb8,0xde,0x20,0xc3,0xf5,0x29,0xb5,0xea,0x08,0xf5,0xd9,0xb2,0xca,0x1c,0x15,0xf0,0x4c,0xd5,0xc1,0x01,0x08,0xf8,0xe5,0xab,0x19,0xc5,0xc8,0xa9,0xeb,0xfd,0xeb,0x11,0x04,0xd2,0xa0,0x25,0x18,0xbb,0xb3,0x26,0xef,0x01,0xd6,0x4a,0xfd,0x0c,0x33,0x26,0x12,0x12,0xdb,0xf2,0x03,0xfa,0xc4,0x33,0x3f,0x0b,0x12,0xe6,0xa1,0x57,0x3a,0x39,0x06,0xff,0x3d,0xfa,0x1f,0xd1,0x05,0x1f,0x00,0x0e,0xf7,0xf5,0x14,0x17,0xf1,0xc9,0xe4,0xff,0x05,0xec,0xd3,0xb1,0xdc,0x12,0xe0,0xfa,0xe4,0xf3,0x2f,0xec,0xfd,0xfe,0xde,0xe0,0xe7,0xf0,0x01,0x17,0xf3,0x07,0x12,0xb1,0xee,0xd4,0x12,0x05,0xd6,0x3f,0xdd,0xbd,0xbb,0xfb,0xd7,0x00,0x24,0x0b,0x36,0xed,0xee,0x20,0x4d,0xf2,0xf1,0xeb,0x26,0xf0,0xe9,0xac,0xd7,0xe7,0x2d,0x2a,0xe7,0xcf,0xf3,0xc3,0xd0,0x1c,0xe4,0xec,0xff,0x06,0xd3,0xc4,0x1e,0xee,0xfb,0x08,0xb9,0xde,0xd6,0xfe,0x18,0x28,0x00,0xd5,0xc6,0xe0,0xd4,0x32,0x3d,0xd9,0x0f,0xf9,0xe9,0xfd,0xe7,0xe5,0xf2,0xe7,0xf7,0xd9,0x2d,0xcd,0x0f,0x07,0x21,0xdb,0xce,0xcf,0xc5,0x05,0xe1,0xcd,0x19,0xb6,0xf1,0xed,0x12,0xf6,0x0e,0xff,0xd8,0xa4,0x1d,0x42,0xf0,0xb1,0xce,0x02,0xef,0xf7,0xba,0x0f,0x01,0xd2,0x02,0x31,0xd7,0xf1,0xd8,0x00,0xfc,0x45,0x1a,0xc2,0xb8,0x08,0xec,0x07,0x0e,0xb7,0x0f,0xc6,0xd6,0x3a,0xad,0xeb,0xca,0xda,0x0e,0x2b,0xc1,0x02,0xfc,0xef,0x3f,0x31,0xe8,0x04,0x15,0xef,0xff,0x25,0x00,0x04,0x01,0xc9,0xdd,0xff,0xe4,0x0c,0xd8,0xbc,0xd9,0xe0,0xc4,0xe8,0x1e,0xd9,0x34,0x0d,0x25,0xe5,0x3b,0xc9,0x02,0x1d,0xf9,0xce,0x17,0xf6,0x06,0x04,0xe1,0xea,0x0d,0xcf,0xd2,0x15,0xf4,0xd2,0x34,0x09,0xe0,0x7f,0xa7,0x22,0x58,0xdb,0xef,0xfd,0xf0,0x3a,0x3b,0xf5,0x52,0x30,0x18,0xff,0xfa,0xa1,0x06,0xdc,0x7b,0x0a,0x08,0x1d,0xef,0x13,0xfe,0xdf,0x18,0x67,0x1c,0xdd,0xe9,0xd9,0xf1,0xb0,0xdd,0x09,0x14,0x09,0xe0,0x03,0x12,0xf5,0xd6,0x37,0xe3,0x06,0xe0,0xde,0x4a,0xcd,0x0e,0xee,0xf1,0x1f,0xfc,0xf3,0xf0,0xd2,0xf2,0xfb,0xfc,0xd6,0xe7,0x34,0x0b,0xfc,0xf1,0xd0,0x09,0xda,0xef,0x27,0xac,0xb8,0x57,0xdf,0x00,0xb1,0xf4,0xca,0xe3,0x7e,0x1d,0x07,0x09,0x1d,0xcd,0x45,0xcb,0xfa,0xf1,0xd3,0xd7,0xc8,0xef,0xdc,0xf2,0xe5,0x01,0x06,0xf2,0x12,0xf5,0xda,0x32,0xbb,0x15,0xb5,0x04,0xb4,0xca,0xf2,0x0b,0x0c,0x24,0x62,0xdf,0xe5,0x95,0x16,0x04,0x46,0xe1,0x00,0xee,0x4d,0xcc,0xdc,0x4e,0xda,0xcd,0xc9,0xe9,0x0b,0x51,0x0e,0x30,0xfa,0xf5,0xe2,0x0f,0xb8,0xa7,0xba,0xe5,0xee,0xd0,0xd7,0xc3,0xd0,0xf6,0x36,0x00,0x25,0x48,0x1b,0xc6,0xe6,0xb0,0xba,0xfb,0x2e,0xe9,0xf2,0xc6,0x30,0xc2,0xef,0xf4,0xde,0x75,0x0c,0x06,0x2f,0x1c,0x2f,0x18,0x03,0xe6,0xfa,0x0b,0xf5,0x13,0xda,0x51,0xf7,0xf0,0x16,0xe9,0xe3,0xee,0xe3,0xc0,0xce,0x11,0x13,0x39,0xf5,0xf0,0xd8,0x02,0x35,0x11,0xe1,0x04,0x1c,0x24,0xda,0xf5,0xf8,0x10,0xd4,0xd6,0xf3,0xe1,0x09,0xf7,0xff,0xdd,0x02,0xe1,0xdb,0xf3,0x0b,0x15,0x1d,0xea,0x2f,0x08,0xb0,0x38,0x0f,0xfe,0xd3,0x19,0xde,0x27,0x02,0x09,0xd9,0xe8,0x7f,0xfd,0x04,0xfd,0xeb,0xc6,0xff,0xf7,0xe0,0xc9,0x1d,0xa1,0x0c,0x17,0xd9,0xdd,0xa3,0xdb,0xe1,0x10,0x28,0xed,0x07,0xe5,0x06,0xf0,0xf9,0xd8,0xb9,0xc3,0xfc,0x25,0xf0,0xfc,0xfe,0xe5,0x03,0x0f,0xf3,0xd9,0xb5,0xe5,0xeb,0xf3,0xdc,0x2d,0xd2,0xc8,0xcf,0xef,0xdd,0xe5,0xf8,0x0a,0x1f,0xfc,0xd0,0x11,0xdc,0xcb,0x31,0x01,0xdf,0xfb,0xee,0x2a,0xe1,0xf5,0x37,0xdd,0x0d,0xcd,0x10,0xcc,0xf8,0x01,0xff,0xdd,0xfc,0xd6,0x20,0x43,0xd2,0xec,0x11,0xf8,0x03,0xdc,0x15,0xfc,0xf2,0xca,0xf9,0x07,0x08,0xe0,0xfd,0x23,0x2b,0x22,0xe1,0xcb,0xe6,0x10,0x03,0x46,0x24,0x00,0xf9,0xdf,0xfe,0x27,0x0b,0x1e,0xc0,0x0e,0x15,0x06,0xd3,0x11,0xd2,0xd0,0x0d,0xda,0xda,0x29,0xc3,0x0f,0x5c,0x13,0x03,0xf7,0xd3,0x14,0xf7,0xf6,0x12,0x11,0x13,0x05,0xda,0xf3,0xe6,0xf0,0xde,0xc3,0xcd,0xd4,0xfc,0xe5,0xda,0xe2,0xe2,0xe5,0x1e,0xfc,0xfc,0xf3,0x08,0xe4,0xf2,0xec,0x07,0x01,0xff,0xec,0xf5,0x0a,0x00,0xe5,0xe9,0xe6,0xf6,0xfc,0xef,0xe2,0xde,0xdd,0xee,0xfe,0x06,0xf0,0xc2,0xe4,0x04,0xf6,0xe2,0x0f,0xef,0x09,0xf0,0x0b,0xe4,0xde,0xde,0x13,0xe9,0xd8,0xd2,0xf8,0xf6,0xef,0x12,0x24,0x7f,0xf7,0xc4,0xf7,0xd5,0x1b,0x02,0x43,0x07,0x04,0x11,0x05,0xf9,0x17,0x1a,0x4a,0x01,0x2d,0xc1,0xbf,0xdb,0xf7,0xf4,0x05,0x18,0x27,0xda,0x22,0x07,0xec,0xe5,0x0c,0x04,0xb4,0x01,0xba,0xf4,0xe8,0x26,0xf6,0xee,0xfa,0x0e,0xf9,0xf6,0xfc,0xf8,0xe0,0xd1,0x0c,0x08,0xd8,0xfa,0x06,0x17,0xd8,0x1b,0xf9,0x41,0xec,0x1f,0xd8,0x04,0xe9,0x00,0x35,0xf8,0x0f,0x15,0xc8,0xf9,0xd4,0xfa,0xdd,0x15,0xdd,0x0f,0x33,0x06,0x19,0xdc,0xfd,0xd3,0xb3,0xca,0xbc,0xfc,0x01,0xb4,0xed,0xc6,0x2f,0xd8,0x37,0xe7,0xe8,0xf8,0xeb,0xe5,0xde,0xd4,0xe6,0xde,0xc3,0xd8,0xf4,0xf0,0x0c,0xc0,0x1c,0xe8,0xc0,0x0d,0x16,0x03,0xf0,0xd6,0x19,0x0c,0xf6,0x38,0x3b,0x1c,0x0c,0xfb,0xa6,0xee,0xdb,0x10,0xa1,0x0b,0x17,0xe6,0x19,0x15,0xb9,0xfa,0x03,0xc5,0xf6,0xe5,0xe0,0xdb,0x4e,0x05,0x2e,0xf9,0xda,0xf9,0x1f,0x26,0xf6,0xcd,0x28,0x33,0xee,0x17,0xb9,0xe4,0x29,0x08,0x16,0xe5,0x09,0xca,0x18,0xf5,0xfe,0x00,0xfb,0xe2,0xef,0x0f,0x06,0x19,0xed,0xf2,0xf1,0xa6,0x10,0x57,0xf1,0xdc,0xe2,0x43,0x2b,0x24,0xf0,0xe7,0x06,0x11,0x23,0xc8,0x21,0x0f,0xf7,0xd7,0xf4,0xd5,0xca,0xf5,0xff,0xf0,0xf0,0xd2,0xd9,0x13,0x0c,0x15,0x06,0xdb,0x09,0xd1,0x00,0x37,0x08,0x0d,0xce,0x16,0xc4,0xd5,0xe4,0xd9,0xe9,0x04,0xaf,0xc5,0xde,0xe4,0x26,0xdd,0x39,0x08,0xd6,0xc9,0x09,0x1a,0xe5,0xc4,0x3c,0xfc,0x2a,0x1b,0xee,0x0b,0x0b,0x9c,0x2d,0xcf,0xad,0xc5,0x1e,0xb5,0xfa,0x05,0xe6,0x7f,0xf2,0xfa,0x08,0xd9,0x0e,0x03,0x3c,0xdf,0xbb,0x16,0xe1,0x42,0xfa,0x11,0x95,0xb9,0x3d,0xbd,0xe4,0xd2,0x01,0xfe,0xbc,0xed,0x0b,0xd3,0x04,0xc1,0xd4,0xf7,0x2d,0xe4,0x08,0xbe,0xe5,0x05,0xea,0xee,0xe5,0x1a,0xf0,0x59,0x03,0xc8,0xd6,0x18,0xe2,0xe9,0x07,0x18,0x1a,0x20,0x24,0xfc,0x06,0x1a,0xfe,0x03,0xa1,0xc7,0xd5,0xe3,0x08,0x06,0xf2,0xcc,0xb1,0xef,0xdf,0x1e,0xe3,0x1e,0xbb,0xc5,0xf1,0x14,0xe2,0xe2,0x0e,0x1a,0x00,0xb9,0x09,0xfe,0xac,0x13,0x0e,0xcc,0xc6,0xf5,0x34,0xea,0x2f,0x5c,0x19,0xeb,0x33,0xbd,0x9d,0x12,0x9a,0x19,0xa4,0xd7,0xd3,0xea,0xd2,0x1a,0xde,0x16,0x1d,0x18,0xf0,0x98,0x40,0xe9,0x00,0xd8,0xe0,0x13,0x03,0x08,0xe2,0xf3,0xcd,0x1c,0xe8,0xcd,0x38,0xfb,0x34,0x18,0xf4,0x12,0x13,0xfc,0xc3,0xf6,0x0b,0xfe,0xd4,0xee,0x10,0xf8,0xd6,0x6f,0x21,0x05,0xff,0x07,0xd6,0xe0,0x90,0xf7,0x2a,0x2b,0xa2,0xef,0xdf,0x0a,0x06,0x1b,0x2a,0x08,0x4a,0xc4,0x11,0xfa,0xf4,0xae,0x01,0xb5,0xf5,0xf9,0x26,0x54,0x0d,0x43,0x55,0xc5,0xe9,0xff,0xe1,0xc1,0xf3,0x22,0x2b,0xc4,0x15,0xe8,0x57,0xee,0xfa,0xeb,0xfc,0xda,0xd8,0xc1,0x0d,0xf0,0x1b,0xfc,0x0d,0xd9,0x2c,0x3d,0x12,0x1c,0x1c,0xd2,0x3d,0xfa,0xf6,0x1b,0xf0,0x0f,0x40,0x9b,0xa7,0xf9,0xb2,0xe1,0xf8,0xf2,0xf4,0x14,0xd6,0xe7,0x0f,0xc9,0x00,0xe2,0x08,0xdb,0x7f,0xb8,0xe5,0xe4,0xab,0x24,0xfb,0xee,0xf5,0xe3,0x36,0x2a,0xad,0xfc,0xf9,0xbe,0xe3,0x01,0xd3,0xdb,0xe1,0x60,0x0a,0xbf,0x0a,0xc0,0xac,0xe0,0xd0,0x41,0xd6,0x0b,0xdc,0x3e,0x09,0xf7,0xc5,0xe1,0xe6,0xff,0xe3,0x22,0xca,0xdf,0x24,0xfa,0x60,0xe1,0xb6,0x97,0xeb,0xe2,0x2a,0x39,0x21,0xc6,0xdf,0x3c,0x1f,0x3b,0x16,0xf9,0x1f,0x9a,0xda,0xda,0xbf,0x4e,0xd7,0x03,0x1f,0xdd,0xeb,0x03,0x33,0x19,0xed,0xfd,0xe5,0xcb,0x14,0xde,0xf5,0x17,0x00,0x59,0xc3,0xd7,0xe7,0xf0,0xb1,0xce,0x42,0x35,0xe5,0xc0,0xf1,0x58,0xf3,0xd5,0xe7,0x13,0xd6,0x0c,0x24,0x05,0xcb,0x00,0xb6,0xec,0xff,0x1e,0x39,0xf1,0x1a,0xb9,0xf8,0x01,0xff,0xe2,0x68,0xde,0x28,0xcf,0xcc,0xe7,0xd6,0x0d,0xa9,0x20,0xf1,0xe3,0xeb,0xec,0xf0,0xd2,0x13,0xf8,0x08,0x0c,0xf2,0xe5,0x1e,0xc6,0x06,0x1f,0xc0,0xfd,0xac,0xfa,0xb6,0xf9,0xff,0xd1,0xf0,0xe8,0xbc,0xed,0x23,0xa5,0xd9,0x0b,0xfe,0xf8,0xac,0x5c,0xca,0xd9,0xe0,0xcf,0x81,0xf5,0xfb,0x26,0x0b,0x09,0x10,0x2d,0x9b,0x20,0x01,0xfb,0x0c,0x09,0x0d,0xd0,0x0c,0x24,0x11,0x10,0xb5,0x07,0xd3,0xe4,0x17,0x16,0xd6,0xdc,0xfe,0xcb,0xb6,0xc8,0xf8,0xde,0xe8,0x3c,0xd9,0x47,0xfd,0xa0,0x22,0xd5,0xde,0xea,0xc2,0xea,0xe7,0x43,0xde,0x09,0xab,0xd6,0xcd,0x1c,0xf9,0xc0,0xcc,0x03,0xfe,0x31,0x18,0x22,0xe5,0xdc,0xfb,0xd8,0xbb,0xfa,0x9d,0x06,0x32,0x09,0x0d,0xaa,0x1a,0x01,0xbe,0xd0,0xcf,0xea,0x0e,0x16,0x21,0x13,0xef,0xd4,0xdc,0x49,0x0e,0xef,0xd1,0x1e,0x13,0x42,0x2f,0x28,0xc9,0xbe,0xe5,0x11,0x3d,0xf5,0xf0,0xca,0x16,0x1c,0xd8,0x18,0xfd,0xd2,0x19,0xe3,0xea,0xbf,0xdd,0xcb,0x87,0xff,0x1e,0xb7,0xe6,0x25,0xcc,0xe5,0xf9,0xe5,0xe9,0xac,0xfa,0x50,0xfa,0xea,0x04,0x06,0xa1,0xc9,0x07,0x0b,0xf3,0xde,0xa0,0xdd,0xe8,0x90,0x96,0x0b,0xeb,0x0d,0x21,0x07,0x2f,0x99,0xeb,0x9b,0x0a,0x0d,0xe4,0xf8,0x4e,0xe2,0xdf,0x15,0xe0,0xe4,0xd7,0xc3,0xf5,0xd9,0x1e,0xd3,0x07,0xfe,0xd7,0xf5,0xcf,0x29,0x34,0x20,0x20,0xd9,0xcd,0x14,0xfe,0xe5,0x2f,0x1b,0x08,0x3f,0x9d,0xc4,0x03,0x04,0x09,0xf5,0xcb,0xd2,0xfa,0xfa,0xcf,0x01,0xc5,0x07,0x06,0x03,0xfa,0xdd,0xc0,0xda,0xf1,0xc6,0xef,0xf1,0x14,0xf6,0xcd,0x48,0x9d,0xb3,0xb4,0xac,0xff,0xe6,0xed,0x04,0xf3,0xf8,0xdd,0xe7,0x08,0xe3,0x37,0xf5,0xd9,0xfe,0x08,0xd8,0x01,0xf1,0xc6,0xd8,0xd4,0x38,0x15,0x1b,0xe1,0x9c,0x04,0xe6,0xe1,0xfd,0x03,0xcd,0x86,0x0e,0x0c,0xe4,0x81,0x04,0xf4,0xfc,0xd7,0x26,0x37,0x0a,0xae,0x0e,0xe5,0x33,0xfa,0xd8,0xeb,0x01,0xc0,0x50,0xf8,0xf5,0x24,0x1e,0x28,0x06,0xc3,0x13,0xf8,0xae,0x03,0xfb,0xce,0xbc,0x2c,0x17,0x0a,0xf3,0xcf,0xee,0x1a,0xb0,0x1f,0xba,0xbc,0xee,0xae,0x00,0x05,0xbe,0xd6,0xf5,0x12,0xe8,0xb5,0x2c,0xd4,0xf2,0x20,0x2a,0xfd,0x1b,0x30,0xf7,0xaf,0xc2,0xde,0xcb,0x30,0x20,0xdc,0x0f,0xfe,0xeb,0x1e,0xca,0xc7,0xf3,0x22,0xce,0xeb,0xf1,0x14,0xfb,0xe5,0xfe,0xd4,0xcd,0xd5,0xfb,0xea,0xc6,0xd8,0xde,0xe3,0x33,0x29,0x61,0x32,0x1e,0xfb,0x2d,0xcb,0xc5,0xef,0x06,0xe9,0xeb,0x0d,0x20,0x38,0xfb,0xdc,0xdd,0xbd,0xe7,0xd3,0xec,0xcb,0x5a,0xe0,0x4e,0x2f,0x22,0xc6,0x06,0xca,0xe3,0x09,0x2c,0x3d,0x17,0x08,0xef,0xe6,0xed,0xd1,0x33,0x1f,0x28,0xd6,0xb9,0x88,0xe9,0x1b,0xe5,0xe1,0xd3,0x6e,0x0c,0x09,0xb9,0x1e,0xcc,0xf1,0x40,0xce,0x33,0x0e,0xff,0x2a,0x18,0x13,0xf0,0xe5,0xa6,0xd9,0xe1,0x2b,0x11,0xec,0x1b,0x23,0x0a,0x18,0xdf,0x13,0xfc,0x41,0xcc,0x00,0xc6,0xf4,0x25,0xf3,0x21,0x36,0x04,0x51,0xfe,0xbb,0xf4,0xf7,0x05,0x46,0x0b,0xea,0x3d,0xf6,0xaf,0x03,0x4b,0xe8,0x13,0xf7,0x14,0x10,0xf8,0x08,0xd0,0xb7,0x05,0xcd,0x13,0xda,0x9f,0xe8,0x14,0xc8,0x02,0x09,0xc1,0x2e,0xa6,0x07,0x13,0xfd,0xdd,0xde,0x43,0x17,0x45,0xe4,0xe5,0xed,0x1b,0xfe,0xf1,0xed,0xf8,0x15,0x4d,0x0d,0x0e,0x37,0x1d,0x09,0xfc,0xc5,0xb8,0xe9,0xf0,0xef,0xf7,0x0a,0x19,0x22,0x14,0x11,0x44,0xd7,0xe3,0x03,0xe6,0x26,0x00,0xb2,0x0a,0xe2,0xec,0xe4,0x3e,0x24,0xe4,0x30,0xbe,0x12,0xf4,0x02,0xfd,0x1b,0x05,0xda,0xde,0x02,0xe1,0x33,0xfb,0x0f,0xe0,0x03,0x18,0xed,0xe6,0xe1,0x10,0x2d,0xc9,0x19,0xee,0x13,0x3b,0xef,0xda,0xe7,0xb5,0xc1,0xdb,0xee,0xfa,0x03,0x2c,0x57,0xec,0x02,0x18,0xf3,0xf2,0xfe,0x2d,0xeb,0x02,0xf7,0x1f,0xeb,0xef,0x43,0xe7,0x2c,0x00,0xa3,0x2f,0xf9,0xd2,0xec,0xc6,0xbe,0x11,0xc9,0xce,0xf2,0xf2,0xe5,0xf8,0x24,0x09,0x25,0x02,0x30,0x68,0x2f,0x1c,0x1e,0x10,0xf9,0x10,0xe5,0xdf,0xc2,0xdf,0xf3,0x2d,0xf5,0xbf,0xdd,0x1d,0x02,0x06,0x03,0xd1,0x20,0x2f,0x2b,0xeb,0xda,0x20,0xe0,0x40,0x17,0xe7,0x47,0x0a,0xf5,0xe0,0x1f,0x00,0x13,0x23,0x0c,0x06,0x46,0xc7,0xf7,0x22,0x2b,0xfa,0xe5,0x15,0xf8,0xe5,0xe8,0x43,0x29,0x07,0x0d,0xe5,0xee,0x04,0xfc,0xd2,0xae,0x7f,0xd0,0x07,0xe5,0xfb,0xf5,0xe4,0x1b,0xfd,0xd6,0xc3,0xd2,0xe4,0xb9,0xdc,0xe1,0xf4,0x25,0xf2,0xf1,0xcd,0xee,0x16,0x14,0x01,0x33,0x33,0x04,0xf5,0xd0,0xfc,0xf0,0x1e,0x10,0xfc,0xda,0x30,0xe7,0x06,0xc5,0xdc,0xdd,0xf2,0x18,0xe4,0x6d,0xe7,0x19,0xe7,0x04,0xf7,0x1f,0xde,0x0d,0xd5,0x0b,0xc8,0xbf,0x00,0x0e,0xcb,0xff,0xd4,0x18,0x9e,0xcb,0xf1,0xf7,0xed,0xfc,0x2f,0x56,0xcb,0xec,0x4f,0x1b,0x2b,0xcc,0xee,0xdc,0x24,0xdb,0x1d,0xbe,0x32,0xfc,0x3d,0x61,0xf4,0xcc,0x05,0xe6,0xf7,0xc7,0xfc,0xd4,0xf4,0x91,0xec,0xeb,0x1f,0xdd,0xfa,0x37,0x0b,0xba,0xd9,0x20,0xca,0x41,0x5a,0x31,0x02,0xf4,0x14,0xae,0x45,0x0d,0xf0,0x1c,0xb2,0x03,0xff,0x17,0xe6,0x17,0xd8,0xc2,0xe9,0xc3,0xc0,0x78,0xcb,0x0a,0x40,0xe9,0x43,0xbb,0xe2,0xe0,0x15,0x2e,0xd6,0x21,0xb0,0xc6,0xe0,0xba,0x20,0x02,0xe2,0x00,0xcf,0xce,0xef,0x1d,0x35,0x10,0xf7,0xd9,0xd6,0xed,0xe6,0x2a,0x1e,0xe8,0x1f,0x0c,0x19,0xc5,0x0e,0xe9,0x0f,0xe0,0x22,0xb9,0xc9,0x03,0xf2,0xe5,0xde,0xb8,0xd0,0xfb,0xf9,0xcf,0x16,0xf5,0xf7,0xe0,0xe3,0x17,0xf1,0xe2,0x50,0x15,0x3c,0xec,0xfb,0xdb,0xe7,0x2d,0xbc,0xe6,0xbf,0x19,0xed,0xe7,0x61,0xb8,0x71,0xd1,0x08,0x03,0xdb,0x05,0x40,0x4c,0x01,0xf1,0x09,0xef,0x3a,0x02,0x2a,0x37,0xc0,0x55,0xd1,0x8c,0x14,0x09,0xfd,0xea,0x22,0xee,0x0b,0x23,0xec,0xa9,0x81,0xff,0xd3,0xf2,0xe3,0xcd,0xc2,0x09,0x13,0xdb,0xbb,0x0f,0x16,0x04,0xa7,0x15,0x4e,0xe9,0x16,0xd2,0xe4,0xd2,0xe2,0xe2,0x2c,0xbc,0x1b,0xf6,0xfc,0xd9,0x60,0x86,0x1c,0x29,0xc4,0x40,0xe6,0xf1,0x25,0xc9,0x44,0x20,0x2e,0xd4,0x05,0xc8,0x0b,0x30,0x1e,0xda,0xe7,0xdc,0xeb,0xe3,0xef,0xa9,0xe0,0x2f,0xbc,0xb7,0xaf,0x50,0xd6,0x59,0xf5,0xf0,0x0c,0x11,0xbb,0xf8,0xd1,0x1c,0x0b,0xee,0x28,0xa3,0x28,0x21,0xc1,0xb9,0xc0,0xe0,0xed,0xaa,0xf0,0xf9,0xca,0xc7,0x0f,0x07,0xc4,0x04,0x36,0xdf,0xeb,0xf4,0xf6,0xde,0xf9,0x2a,0x18,0xed,0xf0,0x07,0xed,0x25,0xdf,0x0f,0xf5,0x81,0xd1,0x13,0x19,0x15,0xdc,0xfe,0xf7,0xfe,0x30,0x1d,0xdb,0x1f,0x17,0x3a,0xeb,0xf6,0xd0,0x37,0x0c,0xed,0xd9,0xb3,0x26,0xfb,0xd5,0xfb,0xb5,0x07,0xe9,0xea,0xe0,0xe1,0xc8,0xe0,0xd9,0xe4,0xcf,0xe2,0xda,0xe0,0x04,0xbe,0xac,0x1a,0x02,0xd6,0x04,0xe0,0x18,0xd7,0xff,0x27,0x0b,0x24,0x98,0x2c,0xfc,0xd1,0xd5,0x48,0xfb,0x0b,0x02,0xec,0xd8,0xfa,0xe3,0x9c,0xf4,0xfd,0xcf,0x5b,0x11,0xf2,0xdc,0x03,0xd7,0xf9,0xa7,0x0d,0xf7,0xb8,0xc3,0x0f,0xe7,0x28,0xa5,0xee,0xf1,0x10,0x43,0xde,0x04,0xe9,0x10,0x02,0x00,0xc7,0x2a,0x3d,0xe4,0xac,0xdb,0x0a,0xdb,0xd8,0xee,0x21,0x2c,0x0e,0x21,0x2e,0xdd,0x30,0x1b,0xde,0x11,0xe7,0x46,0xfc,0x0f,0x2e,0xe8,0x31,0x59,0x09,0xe3,0xaa,0x50,0xd5,0xd2,0x1a,0xfd,0xfe,0x29,0xc4,0xdc,0xc7,0xf5,0xdb,0xa6,0xdd,0x25,0xee,0xf9,0xb3,0x12,0xf9,0xf4,0x31,0x13,0x03,0x20,0xff,0xca,0x01,0xbe,0xef,0xca,0xb9,0xc9,0xd4,0x04,0xb9,0xd8,0x25,0xb0,0xf5,0xbb,0xa4,0xd9,0xc3,0xfd,0xa6,0x16,0x2f,0xeb,0xe2,0x01,0x1f,0x06,0xf7,0xe5,0xbf,0xcc,0xbf,0xf4,0x0e,0xf4,0x25,0x45,0x1a,0xf8,0x06,0xd0,0x18,0xea,0x03,0xd3,0x32,0xf8,0xe5,0x24,0x3e,0x23,0xdb,0xf2,0xea,0xd1,0x04,0x1b,0x18,0xe5,0x06,0x5f,0xab,0x34,0xb9,0x42,0xe8,0xfc,0x20,0x20,0x1e,0x16,0xed,0x34,0xdc,0x27,0x08,0x0f,0xf3,0xf2,0xf6,0xdd,0xd9,0x15,0xd1,0xd4,0xb5,0x00,0xc4,0xc9,0xdb,0xc9,0xd1,0xfe,0xdd,0xa8,0xe5,0x2c,0xcd,0xce,0x22,0xdd,0xf6,0xe4,0x21,0xda,0x28,0x0c,0x93,0xef,0xf5,0x4a,0x31,0x9e,0xca,0x2b,0x13,0x02,0xef,0xeb,0xca,0x07,0xc8,0xe7,0x5f,0xfd,0x7d,0xef,0x20,0x45,0x20,0xc6,0x15,0x8c,0xd7,0xf8,0xcf,0x13,0xd2,0x0d,0x28,0x46,0x58,0xeb,0x34,0x59,0x11,0xb7,0xc8,0xe4,0x47,0x45,0xf1,0xf7,0x34,0x07,0xd3,0x0f,0x75,0xdb,0x34,0xfb,0xd2,0xb7,0x23,0xe2,0xf8,0x40,0xd6,0x11,0x03,0xd0,0xe5,0xac,0xb5,0xde,0x36,0x15,0xf1,0xd2,0x36,0xea,0xcd,0x45,0x59,0xf6,0x1e,0xca,0x0e,0xf2,0x2c,0x25,0xde,0xd7,0x66,0x33,0x23,0xd5,0x9b,0x1c,0xd4,0xab,0x13,0xea,0x03,0xb2,0x59,0x01,0x19,0x08,0x16,0x64,0xd3,0x33,0xd5,0x95,0xd5,0x3c,0xca,0xdc,0xe8,0x19,0x08,0xcb,0xe1,0x81,0xdb,0xe2,0xde,0x19,0x12,0xd6,0x1f,0xcf,0x14,0xfb,0xd8,0x30,0xf8,0x0d,0x3d,0xdb,0xbb,0x14,0xdc,0x0e,0xbe,0xf0,0xe7,0x12,0x4d,0xd2,0x20,0xb5,0x4c,0xb1,0xd6,0x4b,0x95,0xe1,0x0a,0xa9,0x06,0x15,0xf7,0x8b,0xb8,0x06,0xce,0xc9,0xe1,0xdf,0x8d,0x0b,0xd4,0xcc,0xf8,0xa2,0xdb,0x96,0xfe,0x45,0x11,0x28,0xed,0x1e,0x94,0x07,0x21,0xe5,0x2d,0x2e,0xc2,0x0a,0xf2,0xf9,0x0c,0xe6,0xe1,0x12,0xd5,0xd6,0x4c,0xe1,0x30,0x04,0xda,0xfb,0x34,0x11,0x3d,0xf7,0x02,0xb2,0x62,0x13,0xdf,0xf5,0x03,0xea,0x02,0x89,0xc5,0x16,0x1e,0x12,0xd4,0xe4,0x20,0xd9,0xf1,0xa7,0x02,0x51,0xcd,0xd9,0xc9,0x97,0x07,0xe2,0xab,0xc5,0x53,0x45,0xe5,0xdf,0xb2,0xbc,0xc9,0xf5,0x3f,0xae,0xc4,0x1f,0xb8,0x27,0x05,0xb6,0xc4,0xf8,0x26,0xd1,0x01,0x0e,0xc4,0xfd,0xa2,0x05,0x9e,0xbf,0x33,0x21,0xfa,0xe9,0x09,0x07,0x9c,0xf1,0x20,0xe2,0x2e,0xcb,0xd8,0x85,0x1e,0xea,0x34,0xf6,0xcf,0xd2,0x38,0xf7,0xd8,0x2b,0xea,0xe9,0x02,0xc3,0xc4,0x93,0x09,0xa4,0xf6,0x1c,0xe2,0xe7,0xea,0xbd,0x2f,0xfa,0x16,0xca,0xcb,0xe0,0xc7,0xf2,0x22,0x43,0xbe,0x00,0xb9,0xf5,0xf5,0xf8,0x05,0x7d,0x20,0x19,0xed,0xc6,0x03,0xf2,0x32,0x18,0xc0,0x1c,0x93,0x1c,0x0f,0x04,0x27,0x81,0xdc,0xcf,0xbb,0x00,0xda,0xbb,0xe6,0xac,0xe9,0x36,0x05,0x12,0xfd,0x1e,0xf1,0xb4,0xa2,0x33,0x10,0xbf,0x1f,0xe8,0x18,0xc9,0x29,0x07,0x0b,0x2e,0xfa,0xa7,0x02,0xd8,0xca,0xf3,0xf0,0xe3,0x1e,0xfd,0xd8,0xf0,0xe5,0x04,0x9b,0xec,0x11,0xe5,0xfa,0x0e,0x93,0xe6,0xdb,0x06,0xe8,0xf1,0xe3,0x36,0xd8,0xe5,0x0b,0x02,0xb4,0xeb,0x06,0xdb,0x0e,0xf0,0xd9,0xb6,0xb9,0xcc,0xbe,0x09,0x42,0x13,0xfd,0x3e,0x08,0xf2,0xf1,0x8f,0xb2,0xe7,0xd1,0xa4,0xd8,0x35,0xf5,0xef,0xf7,0xc9,0xef,0x95,0xc2,0x03,0xf0,0xce,0x2b,0x20,0xed,0x2d,0xfe,0xe5,0x4f,0xb2,0xd0,0xd9,0xdc,0x06,0xe7,0x0c,0x22,0x08,0xf0,0x2d,0xf4,0xbd,0x23,0x24,0x4b,0xec,0xe0,0xde,0xeb,0xf2,0x24,0xcd,0xf8,0x23,0xfa,0x13,0xf8,0xeb,0x49,0x06,0xed,0xca,0xde,0xb3,0x65,0x3c,0xe1,0x27,0xf7,0x32,0xd0,0x21,0x8b,0x20,0xec,0xf4,0x2e,0xf3,0xf6,0x02,0xc4,0x23,0x06,0x2d,0x3a,0xdc,0x1e,0xcd,0x0c,0xeb,0xa6,0xf9,0xe1,0x12,0x2a,0x37,0x57,0x0b,0xdc,0xa2,0xc4,0x01,0xbc,0x4b,0x45,0x3d,0x4f,0x0a,0x5b,0x26,0x40,0x33,0x3a,0x95,0xa6,0xda,0x5f,0xd6,0xd9,0xe3,0xe5,0x37,0xbe,0xe4,0x00,0xe5,0xba,0x07,0x53,0x1d,0x27,0x1d,0x0b,0x38,0xcf,0xc4,0xf5,0x21,0x4e,0xf2,0x52,0xdf,0xf2,0xc2,0xf1,0x14,0x17,0xba,0xb3,0x95,0x00,0xee,0xd2,0xd6,0x1f,0x18,0x03,0x88,0x25,0xdb,0xf5,0x13,0x00,0x2e,0x04,0xb3,0x1e,0xee,0xd1,0x12,0x17,0xd8,0x2d,0xbf,0xfe,0x37,0xf1,0xe5,0x1b,0xeb,0xe4,0xe4,0x59,0xf7,0x7b,0x0d,0xd9,0x9a,0x18,0x22,0xdb,0xb8,0xf1,0xe4,0x32,0xd8,0xdd,0xc0,0xf5,0xef,0xc6,0x44,0xca,0x02,0x4a,0xf0,0x11,0x0e,0x90,0xf8,0xf5,0x08,0xfe,0xad,0xd5,0x17,0xe6,0xd0,0x8b,0x65,0xf9,0xde,0xfc,0x32,0x0f,0xc1,0xd0,0xb6,0xd6,0x21,0x12,0x13,0xcc,0xeb,0x10,0x2a,0x4e,0xd6,0x4c,0x18,0xbc,0xe3,0x2a,0x06,0xbe,0xe8,0xbb,0x0c,0xfe,0xef,0xc0,0xf4,0xc0,0xdc,0x36,0x14,0x35,0x10,0x7f,0xf2,0x13,0x15,0xe1,0x33,0x26,0xd7,0xf2,0x30,0xfd,0xe0,0x61,0xd5,0xc0,0xea,0x35,0xb9,0x9d,0x3f,0x15,0x14,0xe7,0xd6,0xc1,0x08,0xc2,0xd7,0xeb,0xd5,0xe1,0x2a,0xfe,0xab,0xf8,0xee,0xf8,0x06,0x24,0xe8,0x27,0x0c,0x26,0x08,0x0f,0xaf,0x04,0xbe,0xf3,0xe2,0xdd,0xdd,0x58,0xc8,0x33,0xf1,0xeb,0x1a,0xbc,0x4c,0xd9,0xc7,0xf7,0xd0,0xfb,0xc6,0xcf,0x2d,0xf9,0xe4,0xe9,0xe2,0x40,0xf3,0x3e,0xe6,0xe5,0x19,0xda,0x1c,0x05,0x00,0xf7,0xba,0x08,0xf7,0xd4,0xd4,0x5b,0xf1,0x25,0xca,0x0a,0xd5,0x00,0xe6,0xe9,0x13,0x00,0xa5,0x38,0xf8,0xe1,0x1c,0xe0,0x02,0x42,0x6a,0xce,0x08,0xe2,0x30,0x33,0xf9,0xdd,0xe2,0xcf,0xf0,0x51,0x22,0x0e,0x29,0x62,0xb8,0xcb,0x14,0xd1,0x98,0xff,0xd0,0xb7,0xc0,0xdc,0x0b,0xfb,0x52,0x47,0xf8,0x05,0xe3,0xd5,0x19,0x14,0xf1,0xeb,0x04,0x2f,0xc7,0x58,0xc6,0xc3,0xb7,0xeb,0xa0,0x22,0xd2,0xe7,0xb0,0xe7,0x0f,0xfb,0xbb,0x15,0x29,0xc9,0xd5,0x00,0xf0,0x16,0xeb,0xfe,0x37,0xdd,0xf1,0xc8,0xee,0xdb,0xfc,0xe0,0xbe,0xfa,0x05,0xf3,0xf8,0xe0,0x13,0xf6,0xd6,0x19,0x30,0xd0,0xe9,0x33,0xd3,0xe3,0xb9,0xc4,0x45,0xf5,0xa5,0x55,0xfe,0xca,0x02,0xc2,0x10,0xd4,0x15,0x1e,0xe0,0xe6,0x07,0xed,0x73,0x06,0xf5,0x1d,0xda,0x81,0xd9,0xfb,0xfe,0xf9,0x16,0x28,0xde,0x10,0xf0,0xce,0xf8,0x2e,0xe2,0x34,0x2d,0x1c,0x0a,0xf4,0x29,0x1d,0xe6,0x98,0xc6,0xb8,0x38,0x14,0x11,0xe7,0xf9,0x01,0x2a,0xee,0x5e,0xf9,0xfd,0xf7,0xc8,0xfe,0xf0,0xbf,0x2f,0x9d,0xc0,0x1b,0xd7,0x1f,0xd1,0xd7,0xa3,0xa9,0x14,0xdd,0xe7,0xe4,0x03,0x28,0x52,0x34,0x1f,0xbc,0xdd,0xfb,0x26,0xc3,0xef,0x22,0x4f,0x24,0xb3,0xaf,0x04,0x01,0x04,0x08,0x22,0xce,0xf0,0x24,0x3d,0xc0,0xa1,0x06,0x01,0x16,0x18,0x5a,0xdb,0x42,0x10,0xc9,0xf3,0xf5,0xfb,0xfc,0x00,0x0c,0xff,0x05,0xf0,0x1e,0xdd,0xd4,0x53,0xca,0x09,0xf7,0x1c,0xb1,0x18,0xbc,0x13,0x1b,0x02,0x14,0x52,0x24,0xf7,0x36,0xb4,0x15,0xde,0x1d,0xfe,0xf7,0x40,0xe9,0xd4,0x25,0x47,0x13,0x39,0x46,0x37,0xb0,0xfc,0x34,0xf1,0x0d,0x04,0x1e,0x77,0xcd,0x34,0xbe,0x03,0xf1,0x1a,0x1f,0xc3,0xdc,0x96,0xf2,0x21,0xef,0x9f,0xe6,0xf9,0xfd,0x26,0xf8,0x07,0xc9,0xf2,0xe3,0xbe,0xb7,0x27,0xb8,0x39,0xfc,0x50,0x16,0xe6,0xd8,0xf2,0xcc,0xb0,0x48,0x26,0xcc,0xf7,0xd5,0x4f,0xe4,0xc5,0x03,0x1b,0xfa,0xa1,0xd6,0x09,0x1e,0x0e,0xfd,0xb4,0x1a,0xce,0xce,0x0a,0x37,0x12,0xce,0xd9,0xd2,0xfc,0x30,0xaf,0x05,0x19,0x1c,0x46,0xdc,0xc9,0x3c,0x13,0xed,0x05,0xe6,0x08,0x7f,0x56,0xc7,0xeb,0x98,0x05,0x3e,0xf8,0xe9,0x32,0xfd,0xb8,0x31,0xd7,0xe9,0x18,0x1f,0x2f,0xf3,0xc5,0xe7,0x07,0xc7,0x2e,0x8a,0x12,0xd9,0x2e,0xf7,0x14,0x36,0xe5,0x10,0x37,0xd0,0x0b,0xe0,0xb6,0xfc,0xd7,0x07,0xad,0xe6,0x05,0xf0,0xcc,0x1f,0xe7,0x4d,0xef,0x17,0xe0,0xee,0xef,0xe9,0xa6,0x13,0xc9,0xaf,0xf6,0x21,0xce,0x2e,0x30,0x1a,0xba,0xfb,0x57,0x01,0x8c,0xe0,0x13,0x09,0x20,0xe1,0x3b,0xfb,0xec,0xf7,0x27,0xe8,0x16,0xc1,0xe7,0x0f,0xb2,0xd8,0x16,0x0f,0x3d,0xe6,0x49,0xe4,0x0c,0x3a,0x0e,0xcf,0x34,0xf4,0x2c,0xf8,0xdd,0x08,0xd5,0xf6,0xf0,0xdc,0xfa,0xe5,0x17,0xce,0x4f,0xb6,0xdc,0x36,0xde,0x20,0x32,0xe4,0xc0,0x0d,0x39,0xf6,0xf3,0x0d,0x14,0xf9,0x0b,0x2d,0x5d,0x42,0xd1,0x45,0x14,0xc7,0x0c,0xae,0xeb,0xbb,0x32,0x0b,0x04,0xf5,0x9c,0xf2,0xef,0xc0,0x4b,0xf1,0xb3,0x2e,0x13,0x35,0xf4,0xf3,0x12,0xfc,0xcd,0xed,0xf4,0xac,0xd1,0x04,0xe9,0xa9,0x07,0xda,0x50,0xc7,0xd4,0x1e,0xe8,0xeb,0x1e,0x08,0x4c,0xe7,0x57,0xec,0xff,0x04,0xd6,0x15,0xcc,0x56,0x00,0x0b,0xeb,0xe5,0x50,0x09,0x16,0xf2,0xd9,0xdc,0xf0,0xee,0x37,0x26,0x06,0x0c,0x20,0xec,0x1c,0x0f,0x3c,0xdc,0xe6,0x25,0xdb,0x04,0x0d,0x1c,0x43,0xf3,0x23,0x1b,0x3a,0x11,0x25,0x02,0xa6,0x07,0x06,0xfb,0xc9,0xed,0x59,0x05,0x1c,0x03,0xde,0x03,0x45,0x0d,0xd0,0x01,0x33,0x22,0x0c,0xfb,0xc2,0xf1,0xd8,0xc3,0xf0,0x4b,0xc3,0x05,0x20,0x41,0xcf,0xde,0xd7,0x17,0x12,0x34,0xff,0xfb,0xe2,0x10,0xeb,0xdb,0xcd,0x07,0xdb,0xed,0xd9,0x1e,0x4a,0x2b,0xf4,0xab,0xfd,0x31,0x04,0xed,0x02,0x1c,0xc5,0x7e,0xde,0xb9,0x16,0xb1,0x05,0x0a,0xf2,0xc6,0x20,0x1b,0x14,0xce,0x4d,0xe7,0xf2,0x1b,0xe0,0xf8,0x03,0x15,0x07,0x19,0x14,0xfb,0xeb,0xb9,0xbc,0x25,0x0c,0xd1,0xfc,0xe4,0x34,0xd0,0x81,0x0c,0xe7,0x07,0x04,0xd3,0x34,0xe2,0xc1,0xdc,0xd7,0xd6,0xe3,0x34,0x9d,0xd9,0xbc,0x26,0xb0,0xbb,0x25,0xdd,0xe6,0xdb,0xf2,0xe7,0x00,0x23,0x06,0x4c,0xd9,0x04,0xc9,0x3b,0x19,0x0c,0x06,0x23,0x1e,0xf7,0xe8,0xf1,0x32,0x34,0xe3,0xd2,0xe5,0xf5,0x24,0xf3,0x31,0x18,0xef,0xf4,0x10,0x0d,0xc3,0xed,0x0d,0x3d,0x0d,0xfb,0xc0,0xda,0x2a,0xde,0xee,0x2d,0x15,0xfc,0x03,0xef,0x01,0xe0,0x2c,0xee,0xe4,0x4b,0x35,0xcb,0x2d,0x1f,0xb8,0xdd,0xc8,0xdc,0x24,0xdd,0x16,0x02,0xd0,0xe1,0xd1,0xbf,0xea,0x35,0xe6,0x8d,0x1b,0xef,0x5e,0x0e,0xd0,0xe0,0x16,0x66,0x18,0x81,0xce,0x2c,0x30,0xbd,0xc9,0x1a,0x44,0x0c,0xfd,0xdc,0x04,0xc4,0xfa,0xfd,0x1b,0x2f,0x04,0xee,0x0c,0x0d,0x04,0xd4,0x21,0x2b,0xd7,0xb5,0x33,0x11,0xc7,0xe2,0xb2,0x03,0xf7,0x00,0x05,0xd8,0x5f,0xb2,0x27,0x81,0xdb,0xa8,0xe5,0xdf,0x32,0xf3,0xb8,0x13,0xf7,0xf2,0xf3,0x0f,0x24,0xb3,0x1e,0x2e,0xc0,0xdc,0xdf,0xff,0x36,0x89,0x3e,0x30,0xf5,0xe2,0x21,0xf0,0x2b,0x19,0x10,0xfa,0x05,0x3a,0x06,0xff,0x1c,0xb4,0xff,0xcd,0xd9,0xe6,0xf1,0x37,0x04,0x19,0xfe,0xf2,0xfa,0xfb,0x5a,0x9d,0xd3,0x1e,0xa7,0xb0,0x27,0xb0,0xd9,0x47,0x3b,0xfb,0xf6,0xcc,0xf8,0xd5,0xdc,0xd9,0xc2,0xee,0xc0,0x0d,0xf7,0xd9,0xc7,0x1f,0xd5,0xee,0xfd,0xe4,0xea,0x01,0xef,0x23,0xfa,0xee,0xcf,0xee,0xab,0xbb,0x1a,0x21,0xdf,0x3f,0x06,0xd3,0xd8,0xf8,0x2f,0x99,0xad,0x06,0xb8,0xd7,0x0b,0x23,0x19,0x1a,0xc5,0x28,0xa5,0x54,0x4a,0x14,0x53,0x9a,0xd2,0x12,0xda,0x13,0x3b,0xf2,0x2d,0x0c,0xca,0x13,0xe7,0xd2,0x07,0xe8,0xde,0xb1,0x43,0xcd,0x37,0xd6,0xfe,0xe9,0xf7,0xc0,0x56,0xfe,0xc6,0xdd,0xf9,0x0b,0xd8,0x12,0xe6,0x02,0x2b,0x8c,0x41,0xb1,0xd6,0xaf,0xf9,0x26,0xd5,0xc9,0xff,0xd8,0x37,0xcc,0xf4,0x03,0x22,0x40,0x08,0xcb,0xcd,0xb1,0xb6,0x1c,0xe4,0xe1,0xaf,0xf8,0xf8,0xc2,0xd5,0xec,0x29,0xf1,0xe3,0x27,0xef,0xf9,0xc7,0x08,0x1f,0xf0,0xb3,0x0a,0x28,0x4a,0xea,0xb9,0x08,0x13,0xff,0x03,0x52,0x1c,0xfb,0x0a,0xec,0x02,0x05,0xcb,0x0c,0xe0,0x08,0xf2,0xf3,0xd6,0xe1,0x2e,0xf8,0xc6,0x0a,0xf7,0xc3,0x4a,0x2f,0xdd,0x0a,0xef,0x1b,0xfd,0x10,0xd7,0xd1,0xcb,0x11,0xfa,0x41,0xc4,0xdc,0xf3,0xfb,0x3a,0xee,0xde,0x12,0x22,0xef,0x04,0x24,0xb7,0xd5,0xe1,0x07,0x10,0x1f,0xb2,0xc4,0xd5,0xc0,0x30,0xdf,0xe9,0x28,0x14,0xe1,0x02,0x24,0x27,0x08,0x25,0x2f,0x23,0x05,0x24,0x00,0x26,0xac,0xb8,0x02,0xd5,0x3d,0xf0,0x35,0xd8,0xe9,0xeb,0x6d,0xe1,0xee,0xf5,0xfa,0x4c,0x27,0x0d,0x1d,0xf2,0xfb,0xd6,0x17,0xf1,0x1d,0xc9,0x1a,0x08,0x30,0x29,0x17,0xda,0x18,0x28,0xea,0x12,0xf2,0xf7,0x10,0x3f,0xe2,0xe2,0xe7,0xfc,0xcf,0x1d,0x1a,0x07,0xe3,0x0e,0xd8,0x1a,0xde,0x11,0xf9,0x0d,0xa7,0x1e,0x37,0x04,0x4e,0xcb,0xe9,0x28,0xee,0xc5,0xd4,0xe9,0xe6,0x16,0x16,0x0e,0xe8,0x51,0x07,0xe6,0xf5,0x00,0xbd,0xce,0xc7,0xb8,0xed,0x0b,0xe2,0x0e,0xc0,0x1a,0xfc,0xc4,0xc1,0x0f,0xe9,0x0d,0xcc,0xd3,0x28,0x0c,0x7f,0xb2,0x00,0x22,0xcb,0xe1,0x26,0xdb,0x14,0xec,0x11,0x27,0x06,0xb4,0xff,0xbf,0x0b,0x27,0xcb,0xf5,0xf8,0x02,0x23,0x06,0xc7,0xcb,0xfa,0xef,0x9a,0x03,0x13,0xce,0x04,0x09,0x13,0xe5,0x24,0x2a,0x32,0x10,0xb8,0xeb,0xff,0xe2,0x24,0x14,0xfb,0xa5,0xfe,0x26,0xc7,0x9c,0xe2,0x6e,0xd6,0xe5,0xd1,0x1d,0xee,0xd1,0xf2,0x02,0xa7,0x81,0x7b,0xe1,0x13,0x20,0x1d,0xc7,0x2f,0xcf,0x9a,0x4f,0xb3,0x53,0xc7,0xcb,0x05,0x77,0xc2,0xa3,0x67,0x98,0x32,0xc4,0xe4,0x19,0xf6,0x46,0x39,0x8d,0xc1,0x26,0x37,0xc2,0xf2,0x53,0xc6,0x1f,0x74,0xf2,0x0f,0xc0,0x5e,0xf5,0xcd,0x49,0x01,0x13,0xfa,0xd3,0xe4,0xce,0xd8,0xea,0x1e,0x21,0xd2,0xf9,0x07,0xaa,0x16,0x2d,0x25,0xe7,0x47,0x0e,0x0f,0x24,0xb3,0xd6,0xc4,0x4b,0x61,0xc4,0xf4,0xda,0x06,0xca,0xc8,0x15,0x3d,0x40,0xfd,0x1b,0xdc,0x9b,0x20,0x07,0xfc,0x37,0xc9,0xc0,0xa2,0x95,0xad,0x41,0x36,0xd9,0xac,0xfe,0x13,0xe5,0x45,0x2b,0x1e,0xec,0x4c,0x33,0xdd,0xf3,0xd7,0x1f,0xde,0xf2,0x2e,0xf1,0x12,0xc3,0xdf,0xcf,0x01,0xda,0xbd,0xc5,0x1a,0x29,0x1b,0x33,0xec,0xc3,0xd7,0xbe,0x52,0xe3,0x25,0x35,0x16,0x0a,0x3f,0xae,0x31,0xd1,0xef,0xc5,0xb7,0xfa,0x2e,0x15,0xbf,0x3c,0xb7,0x10,0xba,0xdc,0x4a,0x52,0x68,0x15,0x50,0x53,0x2d,0x95,0x04,0x0a,0x1f,0x67,0x2d,0xbd,0x28,0xc6,0xe9,0x1d,0xf1,0xf8,0xf2,0xfd,0x2c,0xec,0xbf,0x2d,0xd4,0xde,0xdb,0x5f,0xdf,0xff,0xea,0x15,0xe6,0xd6,0x15,0x07,0xf3,0xed,0xf1,0xe4,0xf0,0x37,0xd7,0x90,0xb8,0xd3,0x4a,0xd6,0x14,0x3b,0xea,0xf9,0x32,0x07,0xe0,0x15,0x10,0x2a,0x16,0xbb,0x10,0xc8,0x08,0xca,0x11,0xfb,0xb2,0x17,0xf1,0x13,0x18,0xfe,0xc9,0xe5,0xa5,0x2b,0x05,0x07,0xef,0x07,0x13,0xcd,0x4e,0xdc,0x32,0xef,0x1f,0x24,0x0d,0x37,0xfc,0xf2,0xbe,0xea,0xfa,0x27,0xa7,0xd4,0xe9,0xc8,0x01,0x0c,0xf0,0xc9,0xeb,0xcf,0x51,0x26,0xd9,0x0f,0xfc,0xcf,0xf2,0x16,0x0a,0x0c,0x1a,0xe9,0xef,0x48,0xf0,0x56,0xf0,0xd8,0xb2,0xfa,0xa6,0x2c,0xb9,0xb1,0x15,0x00,0xd3,0xf7,0xf8,0x27,0xe3,0xfd,0x1d,0xff,0xb6,0x40,0xef,0x2a,0xca,0xdd,0x02,0x98,0x12,0x34,0x1a,0x30,0xcb,0xf9,0x3a,0xd8,0x30,0xfb,0x97,0x2d,0xb0,0x1a,0xa4,0xc1,0xcc,0x0c,0xf0,0x1b,0x3e,0xf1,0x05,0xff,0xdb,0x11,0xac,0xcd,0xad,0x05,0x0c,0x0b,0xf5,0x12,0x15,0xf9,0x32,0xf0,0xbc,0xa9,0x32,0x0d,0xe9,0xfc,0xcc,0xeb,0x36,0x7a,0xf6,0xc4,0xff,0xff,0x24,0xb2,0xcc,0x47,0xd5,0x04,0xe1,0x7f,0x21,0xea,0x16,0xe2,0x3e,0x22,0xcb,0xf4,0xc9,0x32,0x36,0xf4,0xe8,0x54,0x34,0x22,0x3f,0x26,0xe2,0xc4,0xf8,0xcd,0x29,0xdc,0x0f,0xc8,0xec,0xc5,0x29,0x66,0xe1,0xf5,0x54,0xd0,0x00,0x2a,0xe2,0x99,0xc6,0x11,0xf8,0x28,0xf5,0xdc,0x2f,0x06,0x06,0x1c,0x12,0xd8,0x3e,0xba,0xd9,0x2f,0x4c,0xb6,0x0d,0x00,0x25,0x38,0x31,0xe2,0xdc,0xd9,0x3d,0x65,0x00,0x40,0x2f,0xd2,0x5d,0xb4,0xd7,0x45,0x2b,0x51,0x39,0x03,0xf6,0x2a,0x06,0x98,0x07,0xf5,0x0f,0xf5,0x69,0x31,0x2a,0x06,0x01,0x38,0xc3,0xe0,0xf9,0x07,0xfa,0xd7,0x15,0x10,0x20,0xf2,0xf0,0xc8,0x02,0xf2,0x59,0xd7,0xcb,0x10,0xf9,0x2a,0x1a,0x09,0xfc,0xce,0x2c,0xe9,0xc3,0xd4,0xe0,0xb6,0x02,0xe4,0xdb,0x29,0xff,0xc0,0x3e,0xc2,0xfd,0xf4,0xeb,0xfa,0xf9,0x11,0x3b,0x06,0xb6,0x2c,0x1d,0xa9,0x0c,0xe0,0x25,0x00,0xf0,0xef,0x29,0xdd,0xe1,0xdc,0x17,0xda,0xf9,0xe9,0x3d,0xff,0x0a,0xbe,0xe4,0x1e,0x03,0xd8,0x3e,0x21,0xb8,0x01,0x41,0x0c,0xb8,0xe7,0x42,0x82,0x28,0x2a,0xd4,0xe4,0xee,0xe1,0xd4,0x3e,0xc5,0xd5,0xca,0x41,0x34,0xdb,0x20,0x05,0x1b,0x3b,0x20,0xd4,0x1d,0xa4,0xe4,0x00,0xac,0x67,0xc5,0xe4,0x35,0x36,0x04,0x37,0x13,0xf0,0xcc,0xbb,0xd5,0xe2,0x42,0xac,0x16,0xfd,0xca,0xfe,0xc8,0x42,0x38,0x29,0x3a,0xb5,0xbc,0xd6,0x9a,0x34,0x08,0xd7,0x9a,0x36,0x2e,0x0e,0x33,0xb8,0xfc,0xda,0x94,0x06,0xb7,0xaa,0x33,0xf2,0xec,0x9d,0x10,0xb7,0x29,0xc4,0x73,0x26,0x4c,0x09,0x79,0x01,0xfd,0x34,0xe3,0xdd,0xe5,0x9f,0xd2,0x1d,0x25,0xa3,0xfe,0xf7,0xf2,0x16,0xf4,0x33,0x23,0xf3,0xca,0x0d,0x20,0xe5,0x37,0xf2,0xe6,0x38,0x39,0xf4,0xf7,0xf2,0x53,0xfe,0xd5,0xe9,0x33,0x17,0xdb,0x06,0xf4,0xe9,0xec,0xca,0x83,0xb4,0xf8,0x15,0x4f,0x7a,0xea,0x0f,0xfc,0xe5,0x95,0x36,0x37,0xe1,0xf4,0x51,0xde,0x0d,0x04,0x27,0x3e,0x32,0x10,0xf2,0xf1,0xa1,0xa8,0x1f,0xe4,0x15,0xee,0xd7,0x2b,0xd0,0xdd,0xd9,0xdc,0x08,0xe6,0xc2,0xe8,0xae,0xe9,0xd0,0x04,0xc3,0xeb,0x32,0x8f,0x02,0xa4,0x2f,0x97,0xed,0xd0,0x00,0xc1,0xdd,0x00,0xf5,0x1e,0x34,0xed,0x22,0xfd,0x0e,0xe2,0x48,0x81,0x15,0x42,0x3e,0xe0,0x59,0xe6,0xf7,0x5f,0xe5,0xcf,0xaf,0x3f,0xfb,0xfc,0x17,0x34,0x1d,0xe4,0x06,0xb6,0xe9,0x20,0xeb,0xbc,0xe5,0xdb,0xbd,0xc4,0x3f,0xce,0xe6,0x88,0x20,0xd3,0xf3,0xcf,0x1c,0xba,0xe9,0x13,0xd3,0xc3,0xfd,0xf1,0xdd,0x53,0xe6,0x43,0xf7,0xaa,0xdd,0xde,0xf9,0xfb,0xe6,0xd9,0xc3,0x16,0xb1,0xdd,0xe3,0x11,0x36,0xf4,0xf9,0xb7,0xbd,0xaa,0x2f,0xa0,0xd8,0xfc,0x1e,0xb7,0x47,0x00,0x32,0x10,0x16,0xf4,0x6e,0x16,0xce,0xde,0x00,0xea,0xdf,0x25,0x32,0xfa,0x2e,0x57,0x2b,0x0d,0xb2,0xde,0xf6,0xd6,0x4b,0xe4,0x22,0xe5,0x11,0xd8,0xdd,0xcc,0xd3,0xc2,0xc7,0x30,0xc8,0x22,0xac,0xe5,0xd5,0xf8,0xf7,0xf9,0x24,0xab,0x24,0xdc,0x15,0xf2,0xb3,0x02,0x19,0xfa,0x31,0xc5,0xd1,0xf3,0xea,0xd6,0xca,0x05,0xe8,0xdf,0xe4,0x09,0x1a,0xd4,0xe4,0x7f,0x49,0xb3,0xdf,0xaa,0xf2,0x07,0xdb,0x16,0x21,0x21,0x1e,0xfb,0xd9,0xda,0x0b,0x15,0xab,0x1d,0xf7,0x33,0x37,0xe3,0x07,0xd3,0xe6,0xb3,0xf1,0x19,0xfe,0xf0,0xd3,0xba,0xff,0xe1,0xfd,0xcc,0x26,0xdd,0x3c,0x31,0xef,0xd8,0xbe,0x36,0xf3,0xd5,0xd5,0xe8,0xf5,0x09,0x28,0x43,0x1b,0x10,0xbd,0x9a,0xdb,0x2c,0xdf,0xc5,0xe0,0xc7,0x1f,0xda,0x00,0xd1,0x0b,0xba,0xfd,0x0c,0x2f,0xc0,0xf5,0xf1,0x09,0xef,0x06,0x1c,0xee,0xfa,0xf9,0xf5,0xea,0x9a,0xec,0x30,0xf6,0x0c,0xbe,0xe4,0x06,0xed,0x62,0xa9,0xd2,0xc8,0xf0,0xfb,0x4a,0xf9,0xee,0x4d,0xca,0xd0,0xdf,0x04,0xf5,0x06,0x17,0x3e,0x69,0x0b,0x3d,0x46,0x9f,0xef,0x05,0xb3,0xe6,0xc9,0xaa,0x19,0xd9,0x1d,0xc8,0x0d,0x0e,0xd0,0x56,0x2a,0xef,0x3b,0x6a,0x45,0xad,0x9b,0x0d,0xcb,0x39,0xd5,0x2b,0xf2,0xe9,0x20,0xfc,0x19,0xd9,0xb7,0xd6,0xf0,0xd4,0x0a,0xfc,0x14,0x11,0xfe,0xdb,0x02,0x0b,0x11,0x01,0xea,0xa8,0x15,0xc9,0x9f,0xf0,0xdf,0xdf,0xdb,0x06,0xee,0xda,0xe1,0xf9,0xc2,0x13,0xff,0x1b,0x27,0xe8,0xf7,0xe2,0xf2,0xc0,0x13,0xb3,0xf7,0xd5,0xdb,0x41,0xf4,0xd6,0xe5,0xf9,0xa2,0xf3,0x1a,0x61,0xd6,0x18,0xf2,0xf7,0x05,0xec,0xdf,0xe1,0x44,0xe6,0x1d,0x2e,0xdf,0x1a,0x42,0xf3,0xe0,0x11,0x02,0xf0,0xec,0x55,0xef,0x01,0xe9,0xcd,0xfc,0x0a,0x28,0x32,0x38,0x28,0x4e,0x57,0x13,0xd5,0xf2,0xd2,0xda,0x00,0xe6,0x28,0x03,0xf3,0xbd,0x4c,0x54,0xd6,0x01,0xf9,0x2e,0x54,0xde,0x25,0x05,0xe3,0xbc,0x0e,0xa7,0xa6,0xd2,0xf2,0xc8,0x0a,0xcc,0xf1,0xd8,0x0f,0x07,0xf2,0xf6,0x4b,0xf5,0xb6,0x08,0xd4,0xf9,0x23,0xd4,0xc6,0x11,0xd3,0x78,0x06,0x3a,0x03,0xfc,0x25,0xee,0x2b,0xd0,0x27,0x37,0x04,0x4c,0xc7,0xe2,0xe9,0xc3,0xd3,0xd4,0xf0,0xed,0xe4,0x12,0x45,0xdb,0x01,0xf1,0xf7,0xd3,0x43,0x04,0x3c,0x1c,0xfd,0x40,0x10,0x84,0x4e,0xe4,0x1b,0x03,0x15,0xae,0xde,0x05,0xfb,0x00,0x26,0xd5,0xc3,0x20,0x32,0x21,0xf1,0xd9,0xb2,0x23,0xf8,0xf8,0xf7,0xe7,0x2b,0xf4,0xc8,0xfe,0x78,0x22,0x72,0xdc,0xf0,0x2d,0x1d,0xc1,0x22,0x10,0x60,0x45,0x45,0xc1,0x60,0xcc,0x81,0x16,0xd3,0xc6,0xcd,0xfe,0xc7,0xcd,0x07,0xe8,0xbf,0xfb,0xfb,0xd5,0x0b,0x1f,0xeb,0x1c,0x24,0xef,0x19,0xde,0xc6,0xbf,0x00,0xc9,0x08,0x11,0xed,0xf0,0xf8,0xf3,0xd3,0x2f,0xe9,0xe8,0xc0,0xdf,0xf4,0x30,0xe6,0x1d,0xff,0xe6,0xed,0x2d,0xb2,0xb9,0xfd,0xd0,0x95,0x2b,0xd2,0x38,0x1f,0xc2,0x0f,0x14,0xb8,0x09,0x07,0xff,0x02,0xe7,0xe2,0xcc,0x29,0x12,0xf1,0x09,0x01,0xc4,0x01,0xb7,0xd6,0xc5,0xdf,0xd8,0xff,0x12,0x14,0x1f,0xb9,0x1b,0x1b,0x53,0xc4,0x02,0xee,0xd9,0xcf,0xeb,0xc2,0xd9,0x0a,0x35,0x09,0xf2,0x0e,0x04,0x65,0xee,0xad,0x10,0x05,0x2c,0x14,0x19,0xf3,0x12,0xb7,0x1e,0x24,0xe7,0xc9,0x24,0xec,0xf7,0x24,0x07,0x2d,0xce,0x3c,0xf0,0xef,0x1b,0xe6,0x05,0xb0,0xf7,0xe9,0x13,0xdb,0xea,0xdb,0xff,0x06,0xd8,0x25,0x2c,0xc5,0x03,0xe0,0xec,0xef,0x02,0x04,0xdd,0xd7,0x02,0xd3,0xed,0x0b,0x1e,0x01,0xe7,0xdf,0xcb,0xf9,0xba,0x02,0xde,0x3b,0x14,0xee,0x28,0x2f,0xf6,0x1b,0x0b,0x20,0x30,0xfe,0xf8,0xed,0x1b,0x04,0x02,0xef,0xc3,0xf5,0x06,0xe3,0xe8,0xe8,0x24,0x19,0x1a,0xc7,0x0c,0x83,0xe1,0x7f,0xe3,0xc4,0xf0,0x00,0xfc,0xff,0xfa,0x0a,0xf9,0xf7,0x12,0x09,0x2f,0xf1,0xef,0x6b,0xd0,0x1c,0x3a,0x02,0xc1,0xde,0x05,0x23,0xe8,0xf2,0xc9,0xf2,0xf0,0x30,0xf8,0x02,0xae,0xac,0xcc,0xc9,0x20,0x02,0x14,0xec,0xd9,0xb3,0xf7,0xcb,0x03,0x09,0xd3,0x13,0x93,0xe0,0xa5,0xf1,0xe2,0xe1,0xe1,0x02,0xd0,0xeb,0x05,0x1e,0xdb,0xc0,0xf7,0x3f,0x2e,0xbc,0xfb,0x33,0xf7,0x1f,0x48,0x11,0x18,0x2a,0x31,0x3a,0x01,0x2f,0xd6,0xce,0x05,0xfd,0xc2,0x40,0xf5,0xef,0x06,0x9d,0x1a,0xe2,0xae,0xe4,0x0a,0xb7,0xd3,0x07,0x33,0x01,0x16,0x0d,0xeb,0xe7,0xfc,0x09,0xda,0xd9,0xc5,0x01,0xfa,0xce,0xf3,0xe2,0xd5,0xe7,0xc1,0xdc,0x1f,0x1d,0xc3,0xfa,0xc0,0xe8,0xf4,0xe3,0xba,0xe5,0xe5,0x06,0x06,0x3b,0xff,0x18,0xac,0xdc,0x25,0xd5,0xe3,0x32,0xc3,0xb8,0x13,0x28,0xed,0x1f,0xc9,0xf2,0xe7,0x0a,0xfa,0xbc,0x66,0xfa,0xf6,0xeb,0xfa,0xca,0xe0,0x17,0x1d,0xf7,0x11,0xfc,0xf6,0xd4,0x08,0xde,0xe6,0x38,0x0d,0x25,0xa9,0xd9,0xe0,0x2f,0x0b,0xd0,0x08,0xd6,0xfa,0x1f,0x3e,0xcf,0xed,0xfd,0xaf,0xb7,0xc0,0xf6,0xf3,0x0f,0x44,0x8b,0xd8,0xf3,0xc8,0xf4,0x1e,0xf2,0xe3,0x97,0xac,0x0c,0x15,0xee,0x16,0xed,0xef,0xe5,0x15,0xdb,0x4c,0xad,0xdc,0x20,0xbe,0xcb,0xf2,0xb7,0x00,0x1f,0xd7,0xc2,0x0e,0xb1,0x2a,0x24,0xdb,0x2f,0xd6,0x09,0xe7,0xe5,0xf5,0x36,0x2d,0xc0,0xea,0x38,0x28,0x15,0x0a,0xb5,0x26,0x05,0x05,0x8b,0xef,0xf8,0x1d,0xfb,0xdb,0xef,0x08,0xec,0x29,0xe5,0x0c,0x56,0xbf,0xf7,0xfd,0x08,0xf6,0x50,0xed,0x00,0x0b,0xc9,0xe0,0x0f,0xf2,0xdc,0xef,0x1c,0xb0,0xe6,0xc6,0x00,0x1e,0xbf,0x44,0xe4,0xed,0x07,0x09,0xfa,0x01,0xfd,0xf6,0x25,0xe1,0xdf,0x72,0xbb,0xfb,0xb5,0xe9,0xb8,0xbb,0xb6,0x7f,0xdd,0xe6,0x0a,0xda,0x72,0xd2,0x18,0xc4,0xc2,0x03,0x12,0x09,0xee,0x16,0x8b,0x15,0x11,0x16,0xfe,0xe7,0xef,0x26,0x32,0xdd,0x08,0xf9,0x08,0x2a,0xb3,0xd9,0x5f,0xe4,0x0f,0xe6,0xbc,0x41,0x1b,0x02,0xd9,0xf0,0x00,0x45,0xed,0xe6,0x16,0xc5,0x12,0x20,0xf9,0x08,0x19,0x2b,0xd1,0x02,0xda,0xf6,0x1a,0xff,0x08,0x03,0xdb,0xed,0xf9,0xc9,0x1b,0xe3,0x13,0x17,0x13,0x3b,0x2d,0x1d,0xe5,0xfb,0xfd,0xef,0x28,0x06,0xc8,0xc2,0xd3,0xcc,0xaa,0xd6,0xf8,0xf8,0x37,0xf0,0xf5,0xd9,0xf4,0xf7,0x10,0xc7,0xd4,0xef,0x02,0xe7,0xf6,0xda,0xf8,0xeb,0x21,0xc3,0x37,0x02,0xbf,0x03,0xc7,0xd9,0xd7,0x0a,0xfd,0x30,0x2b,0x0d,0x28,0x18,0x03,0xd0,0xcb,0xbb,0x36,0xe4,0xed,0xba,0x2d,0xf8,0x14,0x13,0xaa,0xbf,0x22,0xe8,0xea,0x11,0x12,0xe6,0xcc,0x0b,0xef,0x9b,0x15,0xbd,0xfa,0xd5,0xf2,0xef,0xd9,0xef,0x1a,0xec,0x31,0xc2,0xd0,0xd8,0xf1,0xcf,0x2f,0xdf,0xf8,0xdc,0xbc,0xb8,0xde,0xe2,0xfa,0x3c,0xf7,0xc5,0xcd,0xfc,0x0b,0x14,0x1e,0xff,0x01,0xfe,0xfc,0xe0,0xdf,0x07,0x0a,0xda,0xf4,0xea,0x0e,0xfd,0x3e,0xf0,0xce,0x9d,0xe5,0xdf,0x23,0xc7,0xf5,0xec,0x0e,0xec,0xea,0x19,0x31,0xb2,0x2d,0xfe,0xd6,0xe9,0x0a,0x00,0xe5,0x7f,0x15,0xc3,0xd7,0xc7,0xb9,0x03,0xf5,0xd6,0x30,0xfe,0xd1,0x07,0xb8,0x4e,0xc6,0xf3,0xfe,0xd6,0xf8,0x0f,0x2f,0xf2,0xf0,0x2b,0x07,0xe5,0xe1,0xd5,0xf7,0xf0,0x1b,0xd7,0x21,0x42,0xc0,0x40,0x13,0xb3,0xd1,0xd9,0x43,0x0e,0x04,0xfd,0x32,0xd6,0x18,0x09,0x11,0xda,0x21,0x94,0xe3,0xf5,0x16,0xb2,0xe0,0xf9,0x93,0xf9,0xcd,0xfb,0x0d,0xc9,0xef,0xfa,0x04,0x2c,0x06,0x07,0xdd,0x42,0xcc,0x15,0x11,0xca,0x18,0x2e,0xf2,0x4d,0x19,0x1b,0x44,0x33,0x30,0xf8,0x03,0xd9,0x2f,0xdb,0x37,0xdb,0x06,0x16,0x0b,0xcc,0x09,0xba,0xd4,0x6e,0xee,0xe8,0x05,0xcc,0x21,0xe8,0xec,0xd8,0xc5,0xf6,0xb0,0x18,0xb1,0x24,0xfa,0x22,0xc4,0x02,0x3a,0x2a,0x26,0xa3,0xf8,0x26,0xb7,0x07,0xee,0x03,0x0d,0x10,0xe2,0x38,0x02,0xf9,0xdf,0x2e,0x3c,0xae,0x37,0x19,0xd8,0x00,0x20,0xd3,0xdb,0xe0,0x38,0x04,0x4b,0x01,0x3a,0x60,0xe7,0xe2,0xd7,0xc4,0xf5,0xb8,0x35,0x25,0xc9,0x57,0xf3,0x3b,0x3b,0xd4,0x23,0xd3,0x0d,0x09,0x00,0xec,0x00,0x63,0xec,0x2e,0x21,0x1e,0x81,0xed,0xd2,0xc5,0x12,0xf9,0x2f,0xf6,0x04,0xd6,0xf5,0x29,0x0b,0xcc,0x09,0x90,0x32,0xc8,0x27,0xf6,0xd7,0xe6,0xe2,0xee,0x1c,0x2f,0x0e,0xfe,0x03,0xbf,0xbb,0x1d,0x27,0x6c,0x25,0x10,0x27,0xee,0x59,0xc5,0xd1,0xd1,0x2a,0x50,0xd0,0xe6,0xd9,0x33,0xd1,0xed,0x1c,0xe2,0xea,0x57,0x14,0xe3,0xe8,0x08,0x00,0x52,0xe8,0x06,0xdf,0xb6,0xee,0xe0,0x3d,0x04,0xdc,0xf2,0x0a,0x0a,0xd8,0xb9,0xfd,0x9a,0xe3,0x0a,0x19,0x0f,0x1b,0xf5,0xd2,0xc6,0x13,0xff,0xee,0xb7,0x25,0x0e,0x46,0xfc,0xe4,0xe5,0xdc,0xf2,0xd2,0x51,0x2a,0xf8,0xf3,0xc8,0xc2,0xe8,0xe4,0x53,0x43,0x15,0x30,0xd6,0x43,0xf7,0xd4,0x24,0xfa,0x18,0xe1,0x23,0xc3,0xb5,0x2e,0x65,0x4c,0x2a,0x01,0xf1,0xce,0xd0,0x92,0xab,0xbf,0xc5,0x30,0xe2,0xa8,0xe7,0x0d,0x26,0xba,0x09,0x0a,0x4c,0x03,0xf9,0xab,0x1c,0x05,0x33,0x0f,0x90,0x32,0x0d,0xe1,0x10,0xa1,0x47,0xbf,0x0b,0xc5,0xe0,0x22,0xd2,0xe7,0xd3,0xf1,0xdc,0x02,0x25,0x13,0xc9,0xf5,0x89,0xb2,0x87,0x06,0xce,0xed,0xa9,0xd8,0x45,0x21,0x20,0xd2,0xec,0xfe,0xcf,0x2d,0xa7,0xfb,0x1a,0x25,0xb8,0xe0,0x08,0xbb,0xed,0x0d,0x1d,0xf4,0x91,0xb7,0x55,0xe8,0xe6,0x1a,0xf9,0x36,0xb0,0xba,0xe0,0x3b,0xd2,0x3b,0xfd,0x03,0xce,0x51,0x29,0xf5,0xd7,0x30,0x32,0x19,0xa2,0xee,0xf7,0x5e,0x39,0x25,0xda,0xd7,0x26,0x1e,0xf0,0x0b,0xf5,0xdb,0xd9,0x16,0xbf,0x3d,0xf9,0xc4,0xaa,0xdc,0x1f,0x35,0x06,0x09,0xca,0xad,0xf1,0xdf,0xd6,0x27,0x13,0xa2,0xe3,0x0c,0xe1,0x3c,0x1f,0xd3,0x27,0xcb,0xf7,0x36,0xef,0x02,0xdb,0x0d,0x07,0x1b,0xcb,0xf1,0xd6,0x0c,0x34,0xe3,0xd4,0x02,0xf6,0x21,0xcd,0xcb,0xfd,0xc5,0x04,0xda,0x13,0xa0,0xa9,0x13,0xca,0x1c,0x23,0x23,0x27,0xe5,0x5a,0xd1,0xef,0x43,0x04,0xd3,0xe6,0x45,0xf3,0x44,0xbb,0x00,0xf1,0x39,0xcc,0xba,0xf8,0x1d,0x06,0x30,0xf6,0xd0,0xb2,0x0c,0xdc,0xdf,0x1d,0xd0,0x45,0xb2,0xde,0xe0,0x00,0xd5,0x7f,0xfe,0xe5,0x1e,0x58,0x2e,0x01,0xf1,0x1d,0xd5,0xeb,0xc6,0x09,0x0f,0x14,0xd5,0x12,0xe8,0xb8,0xda,0x1b,0xd5,0x1f,0xe7,0x39,0xda,0xd3,0x18,0xf6,0xfb,0x1f,0x11,0xfe,0xff,0x67,0xdc,0xe0,0x41,0xf4,0xe8,0xe8,0xf2,0xed,0x27,0xdc,0xa9,0xf1,0xc3,0x9a,0xb5,0xd7,0xe3,0xf5,0xfb,0x28,0xb9,0xf5,0xd7,0x12,0x25,0xd7,0xe5,0xf6,0x4c,0x29,0xfd,0xdc,0xc3,0xe6,0x3c,0x12,0x09,0xe9,0xfe,0xf8,0x05,0x4f,0xbb,0x25,0x02,0xd8,0xb3,0xd6,0xbe,0x1e,0xd6,0xdb,0xf2,0xe7,0x23,0x04,0x13,0xe7,0x09,0x3a,0xfa,0xa8,0x1e,0xf9,0x0b,0x2e,0xdb,0xc1,0xe0,0x06,0xb5,0xc3,0x01,0xf7,0x34,0xe6,0xb9,0x01,0xf1,0x02,0xe2,0x13,0xc7,0x05,0x08,0x02,0x4c,0x54,0x1d,0xf6,0x04,0x25,0x29,0xb1,0xe6,0xe9,0xd9,0x06,0x26,0xe9,0xed,0xfc,0xdf,0x2a,0xb2,0x0a,0xc9,0x1c,0x2a,0xf9,0x17,0xf3,0x08,0xe9,0xff,0xe8,0xba,0x17,0x08,0x09,0xea,0x1f,0x07,0xf3,0x13,0xea,0xe4,0xd7,0x29,0xf3,0xe8,0xce,0xf6,0x16,0xda,0xfb,0x07,0xb7,0x08,0xd3,0xe4,0x36,0xc7,0xc4,0x34,0x23,0x36,0x00,0xe8,0xf4,0xbd,0xfa,0xf7,0x98,0xdd,0xe9,0xf9,0x2b,0xb2,0x37,0xfe,0xcd,0x0b,0x0f,0xe8,0x03,0xb2,0xdb,0x15,0xb7,0xf7,0xc6,0xeb,0xf9,0xc5,0xf3,0xe2,0x23,0x35,0xb9,0xb6,0xcc,0xfd,0xb0,0x18,0xb9,0x1e,0xf2,0xf2,0xeb,0xe8,0x33,0xde,0x02,0xe1,0x1e,0xce,0x30,0xfb,0x7f,0xec,0xfd,0xb4,0x0b,0x15,0x1a,0x59,0xe6,0xe1,0xe3,0x25,0x01,0x07,0x3c,0x15,0xae,0xf5,0xe9,0x35,0x19,0xe8,0xfe,0x06,0x0f,0x27,0x0e,0xdc,0x17,0x1c,0x37,0xaa,0x3c,0xe7,0x37,0x07,0x18,0xc3,0xc8,0xf1,0x53,0xcc,0xdc,0xb3,0xe0,0xe2,0x2d,0xe9,0xe4,0xdd,0xf7,0x13,0x27,0xc9,0x52,0x03,0x0a,0x9f,0x06,0x2e,0x40,0xf0,0x03,0x22,0x46,0xf3,0x0d,0xb4,0xfb,0xf7,0xd1,0xbd,0xd8,0x11,0xf8,0xc5,0xcd,0xfa,0xf8,0xc6,0xbe,0xb5,0xc9,0x27,0xbb,0xb6,0xfe,0x0b,0x95,0xd1,0xbf,0xb2,0xc4,0x0b,0xc8,0x3d,0x15,0x2d,0x04,0x2e,0xe9,0xfd,0xd3,0xc1,0xfa,0xe6,0x17,0x03,0xc8,0xc0,0xeb,0x14,0xb3,0x13,0x19,0xda,0x1e,0x09,0xa8,0xd0,0xf3,0xc9,0x23,0xbf,0x3f,0xf2,0xac,0x26,0xfc,0x17,0xbd,0xf9,0xf8,0x32,0xe6,0x4b,0xd9,0xc4,0x58,0xff,0xe5,0xe0,0xec,0x19,0xe7,0xff,0xf1,0x0f,0x99,0xe8,0x1c,0xe9,0x1c,0x4d,0x27,0xe7,0xbd,0xdb,0x0b,0x49,0x3b,0xf6,0x11,0x1a,0x20,0xe2,0x0a,0xc8,0xc1,0xcf,0xe7,0x0a,0x20,0xc9,0x9e,0xe3,0xe3,0x55,0xcc,0x00,0x15,0xfb,0x4d,0xc4,0x1c,0xfe,0x93,0xaa,0xe3,0x0e,0xce,0xdc,0x1a,0x57,0x16,0x2c,0x15,0x45,0xd0,0x17,0x17,0xe8,0xe6,0x4b,0xc4,0x36,0xf7,0x51,0x0a,0x32,0x07,0x28,0xcb,0xba,0xe2,0xea,0x09,0x08,0xe1,0x1d,0x41,0xb9,0x14,0x7b,0xc1,0xd4,0x06,0xfd,0x07,0x3c,0x11,0x4a,0xf1,0xe2,0x29,0xf9,0xf1,0xb7,0xe3,0x1e,0xf9,0x03,0xce,0x18,0x27,0xf9,0xd9,0x05,0x07,0x6c,0xfc,0xbe,0x17,0xcf,0xfd,0xf1,0xd3,0xf4,0xf7,0xc9,0xdf,0xaa,0x3d,0xfb,0x25,0x04,0x2b,0xe5,0xf9,0x1e,0xfe,0xfa,0x53,0xeb,0xca,0xfb,0xf3,0xfd,0xc8,0x2d,0xb8,0x16,0x11,0x56,0x0c,0xe0,0xfb,0xd2,0x26,0x14,0x33,0x5d,0x13,0xfd,0x35,0x29,0xaa,0x39,0xed,0x14,0x27,0xd3,0xf1,0x17,0x11,0x39,0xeb,0x1d,0xdc,0x37,0x0c,0xe0,0xeb,0x04,0x0a,0xb2,0x06,0x25,0x32,0xfe,0x24,0xe2,0xf3,0xd2,0xeb,0xf6,0x01,0x3a,0xe2,0xed,0x5b,0xbf,0x0f,0x2b,0xde,0x00,0x7f,0x56,0x0b,0xc4,0xcb,0x1a,0x21,0x1f,0xd8,0xc0,0x25,0xde,0xce,0x1e,0xe0,0xd0,0x45,0xf6,0x1c,0x14,0x32,0x1e,0x3a,0x2d,0xcf,0xdc,0xa6,0xab,0xb4,0x3b,0xe0,0xef,0xaf,0x0e,0xce,0x0b,0xc9,0x28,0x2b,0xc7,0x0a,0x2a,0xde,0xc4,0xc7,0xba,0x81,0x29,0xf2,0x19,0xd9,0xdf,0x36,0xee,0xb1,0xf7,0xbf,0xc7,0x01,0xe8,0x2a,0x92,0xf3,0x10,0xe8,0x0a,0x0a,0xea,0xb5,0xe5,0xc9,0x38,0x34,0xde,0xe6,0x12,0xcb,0xeb,0x14,0xc9,0x3d,0xc6,0xb6,0xc0,0xca,0xd9,0x4e,0xc3,0xb0,0x41,0xca,0x0c,0xaa,0xd2,0xc8,0xec,0xe0,0xea,0xd4,0x1c,0xf4,0x3c,0xff,0x0a,0xe5,0x2f,0x3e,0xce,0xdd,0x1a,0x08,0x24,0xfc,0x1b,0x2f,0xac,0x00,0x10,0xfe,0x3b,0xed,0xee,0xe4,0x18,0xde,0xde,0x25,0x33,0x5d,0xf8,0x3f,0xec,0xfd,0xdd,0x0a,0xeb,0x07,0xdd,0xe9,0x2a,0x3a,0x02,0xe1,0x09,0x00,0xbe,0x1f,0xdd,0x0f,0x33,0x49,0x13,0xf5,0xec,0xbd,0x11,0xb5,0xf0,0xd5,0x03,0xca,0xde,0xd6,0x73,0xf9,0x09,0xdb,0xf0,0x28,0x4b,0xfe,0xf1,0xf1,0xfc,0xa9,0x07,0xf3,0x06,0x25,0xc6,0x60,0xca,0x29,0xfe,0x05,0xf2,0xd1,0xe7,0x00,0x2c,0x31,0xf7,0x0c,0x30,0xe3,0x0d,0xe2,0x07,0xdf,0xae,0xd9,0xc1,0xf3,0x1a,0xf2,0xd4,0x0e,0xc3,0x16,0xf2,0x44,0x22,0x00,0xe5,0x24,0xef,0xa2,0x62,0x13,0x07,0x44,0xdf,0xb3,0x03,0xfa,0x23,0xfe,0xf6,0xd8,0xaa,0xf1,0x12,0x18,0xee,0x1f,0xd8,0x5a,0x14,0x3a,0x38,0xe2,0xf5,0x22,0xc9,0xc5,0x6c,0x15,0x76,0xea,0xf6,0x52,0xe6,0x12,0x3a,0x06,0x27,0x7b,0x09,0xde,0x68,0xf0,0xef,0xe4,0xc7,0xc3,0xd1,0x2e,0xdb,0xeb,0x47,0xb8,0xcc,0xf3,0x0a,0xeb,0x19,0x0e,0x27,0xed,0x19,0xde,0x21,0xdc,0xf3,0xcd,0xe2,0xf9,0x02,0xe8,0x27,0xfe,0x06,0x03,0xd2,0x37,0xa2,0xde,0xdc,0xda,0x5c,0xc7,0xbd,0xf4,0x06,0x05,0xf5,0xf0,0x06,0xab,0x08,0xda,0x3f,0xf8,0x17,0x37,0xfd,0x25,0xe2,0x3c,0xf6,0x22,0x16,0x11,0xce,0xf8,0xdb,0xc2,0x1d,0x16,0x0e,0xe5,0xd9,0x00,0x32,0xca,0x3a,0xa5,0x0c,0x06,0x02,0xb2,0x2d,0xdb,0x0d,0xde,0x24,0xf5,0x59,0x0e,0xaf,0xe2,0xf3,0xfa,0xb3,0xd8,0x03,0x3d,0x1a,0x1a,0x16,0xea,0xf5,0xe5,0xfe,0xda,0x3a,0xf7,0x15,0xe1,0xfe,0xf4,0x0f,0xde,0xbb,0xf5,0xef,0xfe,0xdb,0x32,0xe0,0xd7,0xfa,0x3f,0xf9,0xf9,0xf7,0xf5,0xe0,0x14,0x35,0xc8,0xe1,0xcf,0x15,0x0e,0x3a,0xed,0x13,0x3b,0xeb,0xc2,0x34,0xec,0xa9,0x9d,0x01,0x9f,0x0b,0xaa,0x3d,0x1a,0x13,0x0f,0xea,0x31,0x02,0xde,0x0b,0x1c,0x37,0xf9,0xf5,0xbd,0xf4,0x04,0xe5,0x08,0xf5,0xcd,0xe7,0xe3,0x10,0x0e,0x13,0x27,0x07,0x14,0xd9,0xad,0xd5,0xbf,0xc5,0x2b,0x1f,0xf9,0x24,0x08,0x34,0x03,0x14,0x02,0x91,0x13,0x0c,0x55,0x1d,0xeb,0x09,0x16,0xe6,0xf2,0x23,0xd3,0x3b,0xcd,0xeb,0xeb,0xc8,0xf2,0xc0,0xf9,0xb6,0xe9,0xfd,0xe3,0x1e,0x18,0x33,0x1f,0xf6,0xe9,0xc0,0xf3,0xf7,0xee,0x29,0xdc,0x94,0x5e,0xf4,0xeb,0xf6,0xf8,0xd0,0xde,0x00,0x17,0xfd,0x0b,0x56,0xfe,0x01,0xae,0x2c,0xf9,0x0d,0xa4,0xcf,0x07,0x2a,0x0e,0x19,0x20,0x81,0x08,0xc5,0xdf,0x21,0xde,0xe6,0xe0,0x24,0xd9,0x21,0x1b,0xc6,0x28,0x0e,0x00,0x13,0x0b,0xf6,0x2b,0x13,0x13,0xad,0x2e,0x63,0xfc,0xfe,0x09,0x18,0xaf,0x3b,0xdb,0x0a,0xd9,0xdc,0x0f,0x19,0xc1,0xe4,0x02,0x23,0x74,0x05,0xdd,0xf5,0x43,0x08,0xdd,0xf4,0xeb,0x01,0x09,0xfb,0xc3,0x2f,0xc1,0xc9,0x35,0x18,0x28,0xf3,0xe4,0xd1,0x1c,0xfe,0xed,0xae,0xbf,0xd5,0xf5,0x34,0x23,0xcf,0x08,0x14,0x3b,0xd5,0xa0,0x3c,0xec,0xc8,0xf1,0x3a,0xbd,0xe4,0xfd,0x1d,0xed,0x27,0x13,0xb1,0x0c,0xdd,0xd5,0xdf,0x00,0xe9,0xec,0xcb,0xf7,0x3c,0x44,0x06,0xea,0xa6,0xe2,0x0a,0x08,0xd2,0x01,0xe1,0xf6,0xc9,0x1a,0x43,0xdb,0x45,0xb9,0x2c,0x1a,0xe4,0x1c,0xe1,0xfe,0xe8,0xd2,0x03,0xb6,0xbc,0x43,0x16,0xfe,0xad,0xf0,0xdc,0xf7,0xfe,0x0b,0x33,0xc9,0xaa,0xb9,0x15,0xfb,0xda,0x99,0x2a,0xea,0x02,0x3c,0x2a,0x62,0x03,0x08,0x1a,0x20,0xdd,0x2c,0xde,0x05,0x39,0xb3,0xc8,0xba,0xc9,0x03,0x07,0xd8,0x00,0x06,0xc5,0x3c,0x16,0xf4,0xb5,0xf0,0xc5,0xe2,0xe7,0xfe,0x05,0x0c,0x0b,0x1f,0xd6,0xdb,0xd1,0xf7,0xe5,0xfb,0xb1,0xcc,0x1a,0xcf,0xa7,0x34,0xfa,0xc1,0x30,0xa1,0xe2,0x16,0xdf,0xed,0x2a,0x1a,0x9f,0x0e,0xf7,0x0d,0xd9,0xf6,0x02,0x0f,0xb1,0xe8,0xb1,0x10,0x14,0xee,0x04,0xec,0x9c,0xb2,0xa5,0xd1,0xde,0x11,0x1a,0x46,0xfb,0xa3,0x4c,0x10,0xef,0x16,0xeb,0x06,0x14,0x19,0x48,0x1c,0xe5,0xf9,0xe1,0x14,0x04,0x20,0xbf,0xc0,0xa2,0x07,0xd0,0x01,0xd9,0xf8,0x93,0xe3,0xe7,0xd9,0x1b,0xa3,0xf9,0xc0,0xc0,0xc7,0xe2,0xd1,0xff,0x4c,0xee,0xfc,0x31,0xef,0x3a,0xef,0xd5,0xd7,0xce,0xf3,0xe5,0xba,0xe8,0x15,0x15,0x7f,0xf8,0x07,0x38,0x17,0x10,0x3d,0x0f,0x1b,0xe3,0xd3,0xcc,0xc5,0x41,0x3f,0x35,0xed,0xd1,0xe2,0xc6,0x1d,0xcf,0xdf,0xd4,0xbf,0xf9,0xe7,0x10,0x0b,0x07,0xce,0x19,0xca,0xfb,0xee,0xfb,0xf8,0xc8,0x10,0xcf,0xfa,0xba,0xd1,0xe7,0xd7,0xdb,0xce,0xcd,0x03,0xff,0xd2,0x33,0xed,0x25,0x06,0x30,0xf0,0x01,0xe8,0x25,0x10,0x00,0x15,0x2c,0xe8,0x0e,0xdd,0x03,0x0e,0xd6,0xc7,0xd7,0x16,0xf5,0x34,0x54,0x12,0xc1,0xfe,0x4c,0xe8,0x08,0x19,0x01,0xf9,0x9e,0x0a,0xb7,0xbc,0x02,0xcc,0xed,0x15,0xea,0xc7,0x32,0x33,0x1c,0xf9,0xbf,0xbb,0x20,0x1e,0x08,0xe7,0xea,0x22,0x02,0xfc,0x0a,0xc1,0xd0,0xec,0x07,0x0c,0x38,0xed,0xfe,0xd3,0xe5,0x13,0xb9,0xd5,0xeb,0xd2,0xf8,0xdc,0x1f,0xbf,0xf3,0xf9,0x18,0x13,0x09,0xe6,0xea,0x14,0x81,0xfc,0xea,0xcf,0xfc,0xdd,0x08,0xcd,0x1f,0x05,0xb6,0xce,0x23,0x23,0xce,0xc6,0x0e,0xb6,0xf3,0xdf,0xe9,0x16,0x18,0xcc,0x13,0x19,0x19,0xef,0x19,0x2a,0xfb,0xcc,0x18,0xb9,0xca,0xd9,0xe2,0x56,0xc9,0xc5,0x0b,0x12,0xcf,0x12,0xfc,0x21,0x5b,0xb9,0x0e,0x13,0x19,0xeb,0x01,0x0f,0x47,0x25,0xed,0xe1,0x12,0xf9,0xfe,0xf6,0x27,0xe9,0x05,0xb8,0xae,0xec,0x2d,0x00,0xf7,0xde,0xf2,0xe7,0xfe,0x04,0xc7,0xda,0x1e,0xef,0x32,0x9c,0xe2,0x15,0xbe,0xcc,0x26,0xe0,0x02,0xfd,0x0c,0xe9,0xf5,0xf9,0xfe,0xf8,0xe4,0xf1,0xd7,0x02,0xcf,0x28,0x20,0x12,0xde,0x39,0xfa,0xda,0x06,0xed,0xc8,0xeb,0x03,0x27,0x1a,0x1b,0xf8,0xf6,0xd6,0xb2,0xfc,0xd8,0xb5,0xf3,0xeb,0xf6,0x00,0x18,0x45,0x13,0xfd,0x62,0xfb,0xd0,0xf0,0xa6,0x35,0xdc,0x75,0xac,0x9c,0xe9,0xd5,0xea,0xbe,0xbe,0xf8,0x1a,0x05,0x85,0x0a,0x1e,0x01,0xda,0xd3,0x81,0xe1,0xcc,0xd4,0xdf,0xd1,0xfb,0x13,0xd6,0xde,0x1f,0xa0,0xd6,0x1e,0xe9,0x3d,0xd4,0x13,0xce,0x41,0x2f,0x40,0xdd,0x03,0x61,0xa5,0x34,0xc8,0x16,0xdb,0xc6,0xbe,0xaf,0xe3,0x52,0x6e,0xdb,0xec,0x49,0xe0,0xfb,0x24,0xf9,0x24,0xe8,0x29,0xc6,0xb9,0x03,0x26,0x2c,0xda,0x01,0xe9,0xa7,0xde,0x05,0xbf,0xa8,0x1f,0xbd,0xb3,0x84,0xe2,0x1f,0x29,0x12,0xcd,0xe7,0x1f,0x05,0x4f,0x1a,0x2a,0xe2,0x92,0xc0,0xfc,0x1e,0xf7,0xbd,0xa7,0xe0,0xc1,0xe2,0xc9,0x88,0x19,0xcf,0xc5,0xfa,0x12,0xad,0xd8,0x0e,0x20,0x98,0x9e,0x04,0x17,0xc1,0xf6,0x02,0x60,0xf2,0xdc,0x09,0x42,0x29,0x26,0x0a,0x8a,0xec,0xe9,0x12,0x03,0xb2,0xb4,0xf6,0x10,0xf3,0x87,0x12,0xfd,0xda,0xde,0xf2,0xdd,0xa8,0x44,0x5d,0xff,0x69,0x40,0xc0,0x86,0x0b,0x4a,0x5d,0xef,0x04,0x14,0xf9,0x9b,0x11,0xa1,0xde,0x3d,0xe7,0x5a,0xf9,0xbb,0xce,0xf9,0xa2,0xf8,0x2c,0x05,0xd4,0xf7,0x1d,0xdf,0xdf,0xda,0x34,0xd8,0xf5,0xcb,0x0a,0xe0,0xe0,0xc6,0xdf,0xe4,0xd1,0xd8,0xf8,0x28,0xea,0x01,0xfc,0x4b,0xcb,0x46,0xc1,0xf7,0x1f,0xe7,0xe9,0x21,0x09,0xd5,0x18,0xdf,0xe1,0xfc,0xdb,0xfd,0x3e,0xa1,0xa8,0xed,0x2f,0x4e,0x4a,0xba,0xe1,0x50,0xff,0x56,0xcb,0xcd,0x10,0xe4,0xe5,0x77,0x68,0xfa,0xd6,0xb3,0xd2,0xba,0xcb,0x55,0x15,0xf4,0x26,0x0c,0x28,0x3b,0xdc,0xe7,0x2b,0xe1,0x06,0xe9,0x83,0x24,0xf6,0x0f,0x11,0x18,0xf0,0x04,0xf7,0x15,0xd7,0xe4,0xdf,0x15,0xf5,0x81,0xcd,0x02,0x45,0x0a,0xfc,0xb1,0xf3,0xd4,0x0b,0xc4,0xdf,0x09,0xca,0x05,0xc7,0xe9,0x0f,0xf7,0xeb,0xda,0x7c,0x12,0xf6,0xc8,0x04,0xdf,0xd3,0x8d,0x23,0x64,0x22,0xff,0x45,0x23,0xf1,0xfa,0xf0,0x15,0xa7,0xf2,0xba,0xe4,0xbb,0x2f,0x85,0x96,0xef,0x07,0xa8,0x9c,0xf2,0x4a,0xe0,0xd3,0xdb,0xe6,0x8d,0xc0,0xb8,0xd2,0xf0,0x09,0xbf,0x3b,0xeb,0x12,0x56,0xa5,0x9f,0x46,0xef,0xd6,0x26,0x1f,0xf4,0xd8,0xb5,0x24,0xdf,0xa7,0x02,0xc6,0x01,0x4c,0x3b,0xef,0xdf,0x07,0xad,0x19,0x42,0x0a,0x02,0xb1,0xce,0x56,0xec,0x0b,0xd7,0x4f,0xb6,0xbd,0x06,0xf9,0xb4,0x21,0x4e,0xfd,0x04,0xd5,0x46,0x38,0x91,0x11,0xbe,0x3d,0x08,0xc8,0xee,0x2f,0xfd,0x1a,0xac,0xcd,0xfe,0x29,0x0f,0xda,0xf8,0x96,0x21,0xfd,0xd9,0x33,0x19,0xc1,0x57,0xf8,0x10,0xd3,0xe9,0xdc,0xfc,0x0c,0xf0,0xcd,0x19,0xc6,0xd7,0x1c,0x01,0xe9,0x4b,0xba,0xf6,0xb2,0xe7,0xf4,0xbc,0xfc,0x14,0xf3,0xc9,0x06,0xf8,0x26,0x26,0x04,0xe9,0x52,0xdc,0x18,0x11,0xd4,0x52,0xf6,0xf6,0xf0,0x51,0xde,0xde,0x1e,0xdd,0xf5,0x40,0xb0,0x00,0x03,0xea,0x17,0xe3,0x09,0xfd,0x0b,0xf0,0x3e,0xa3,0xba,0x12,0x3f,0x15,0xf0,0xef,0x17,0xb0,0x1f,0xf3,0xa9,0x5f,0xe0,0x57,0x06,0x03,0x12,0xa0,0x15,0x1b,0xe3,0xf0,0xdb,0x57,0x0b,0x44,0x48,0xd8,0x05,0xd6,0xfb,0x4e,0xdf,0x09,0xbf,0xde,0x27,0x05,0x21,0xe0,0xd5,0xcf,0x24,0x08,0xe4,0xc1,0xfc,0xf2,0x33,0xe1,0xec,0x15,0x09,0x03,0xf4,0x05,0xf0,0x11,0xf8,0x9b,0xea,0xcc,0xfb,0xa7,0xf9,0x07,0xdf,0xe3,0xa2,0x00,0x0c,0xc1,0x1e,0x18,0xd4,0xea,0x02,0x3f,0xef,0x17,0x03,0x24,0x1d,0x44,0x15,0xc3,0xe0,0x03,0x08,0x10,0xf8,0x09,0x16,0x21,0x14,0x29,0x02,0xc8,0x09,0x17,0x33,0xfe,0x62,0x25,0xfc,0xfb,0xc3,0x48,0x5d,0x1d,0xeb,0x00,0x1c,0xd0,0x18,0xa5,0x18,0xd3,0x2e,0x1e,0xc0,0xee,0x12,0xee,0x57,0xf6,0xf2,0x0e,0xe1,0x07,0xb0,0xea,0xe9,0x2a,0x11,0x3d,0xf0,0xf3,0xd4,0xe8,0x08,0xd2,0xf2,0xe9,0x00,0x0b,0xf4,0xa2,0xbe,0xf9,0xbf,0x5d,0x3c,0xb9,0xe1,0xc6,0xf5,0x00,0xd5,0x13,0x05,0x05,0x10,0xff,0xe4,0x1d,0xb4,0xfa,0xd6,0xe9,0xec,0x0a,0xf8,0x01,0xec,0xe4,0xec,0x3c,0xd0,0xcd,0xf5,0xc0,0xcc,0xda,0xcf,0xf5,0x3f,0xe0,0xe4,0xc0,0x08,0x27,0x53,0xdf,0x08,0xa9,0x24,0x0c,0xb7,0x2c,0x21,0x7f,0xd0,0xe2,0x28,0xe9,0xbc,0x1b,0xca,0xec,0x1f,0x00,0x0e,0x17,0xfe,0x1b,0x05,0xf0,0x5d,0xf1,0x0e,0x24,0x09,0xe8,0xf6,0x13,0x05,0xc3,0x2a,0x09,0xc5,0xe5,0x26,0xeb,0xdc,0xfa,0x05,0x09,0xe8,0xf3,0xca,0xf2,0x01,0xed,0xdf,0xb6,0x04,0xdd,0xe3,0xb2,0xf2,0xbf,0xfa,0x4a,0x28,0x01,0x0e,0xb4,0x01,0x13,0xc6,0x3a,0x05,0xe8,0xf4,0x02,0x0d,0x16,0x08,0xea,0xdd,0xfe,0x13,0xe1,0xfd,0x38,0xef,0x00,0xdb,0x1a,0x1f,0xe9,0xe5,0xcf,0xe4,0xf4,0xfa,0x32,0xc5,0x04,0x1c,0x0b,0x50,0xeb,0xff,0x2c,0xe6,0xde,0xf7,0xfa,0xa5,0xb8,0xc4,0xc9,0xe8,0x06,0x02,0xfb,0xb5,0xfb,0xee,0x1a,0x13,0xf7,0xd2,0xea,0x2c,0xec,0xe4,0x07,0xf4,0x2c,0xc1,0x2b,0x04,0x13,0x24,0x06,0xdd,0xfe,0x8f,0xe1,0x43,0xb9,0xdf,0xbd,0x47,0xac,0x2e,0xe2,0x16,0xe2,0xfb,0xc1,0x48,0x08,0xf2,0x61,0xd4,0xf0,0xe4,0x4b,0x0a,0xd2,0xe1,0x3a,0x24,0x2f,0xa9,0xea,0xfc,0xcd,0x32,0xf7,0x03,0x1a,0x6a,0xbb,0x28,0xea,0xa3,0xe4,0xb8,0xbf,0x1b,0xce,0xfe,0xd1,0xc3,0x21,0x0d,0x9e,0xf3,0xdb,0xdc,0x1b,0xf6,0xdf,0xc2,0xbf,0x12,0x30,0x63,0xc4,0xe6,0xf8,0x05,0xcc,0x16,0xf7,0x0a,0xe4,0xca,0xea,0xea,0x0a,0xe8,0x2e,0x1c,0xc1,0xfc,0xac,0x20,0x02,0xfb,0x42,0x0b,0xf7,0xe2,0xf9,0xe1,0xe5,0xcb,0xb4,0xb3,0x02,0x17,0xd2,0xd9,0xca,0xe9,0xbe,0xfa,0x17,0xd3,0xda,0x48,0xfa,0xd1,0x07,0xbd,0x10,0x19,0xa5,0xe8,0x0b,0x3c,0x3a,0x0f,0xf0,0xe4,0xe2,0x0e,0x9e,0xc5,0xd5,0xba,0x77,0xd6,0xc4,0x4d,0x06,0xd2,0xf1,0x03,0x5b,0xce,0x00,0x35,0x2a,0x08,0xf1,0x87,0xbb,0x3a,0xb3,0x08,0x0c,0xa5,0xcf,0x2a,0xe4,0x4c,0x04,0x41,0xd7,0xd7,0xd2,0x13,0xee,0xe6,0x9d,0xdc,0x09,0xf1,0xec,0xd8,0x34,0xfe,0x56,0x07,0xaf,0xd6,0x37,0xd9,0xdf,0x4c,0xb6,0x16,0x1a,0xa6,0x07,0xc7,0x9d,0xe6,0x07,0xf8,0x31,0xee,0x3a,0xd1,0x38,0xb7,0xac,0xc2,0x19,0xeb,0xba,0x05,0x54,0xe1,0xbe,0xf1,0x3a,0xc1,0xfb,0xe8,0x5b,0xd2,0xa6,0x30,0xd9,0x81,0xa0,0x07,0x1b,0x00,0x01,0x6e,0xcc,0x24,0x0f,0xf4,0x16,0x0b,0xd4,0xd1,0x3c,0xcc,0xb5,0xd6,0xa9,0x2c,0xf3,0xea,0xe3,0xfd,0xf9,0x81,0x21,0x4d,0x3e,0xd5,0xfe,0xb7,0x0f,0xc1,0x1c,0x1d,0x16,0xf7,0x03,0xf9,0xfe,0xd6,0xf3,0x11,0xab,0xd3,0xfb,0x58,0xf3,0xae,0xcc,0xde,0xfb,0xc4,0xb8,0x0b,0x05,0xde,0x30,0x1f,0xc9,0x83,0x0d,0xd7,0xec,0x03,0x18,0x15,0xf6,0x0e,0x4a,0xcc,0x14,0x31,0xac,0x25,0x2a,0x1e,0xb5,0xd8,0x6d,0xd2,0x1c,0xec,0xdb,0xc8,0xc7,0xec,0x1d,0xbe,0xf1,0x10,0xeb,0x0b,0xc6,0xca,0xed,0xe4,0xdc,0xbc,0x09,0x58,0xe2,0xed,0xc8,0xdb,0xd2,0xec,0xf6,0x15,0xeb,0xda,0xd4,0x2e,0xf0,0xc7,0xdb,0xff,0x3b,0xb3,0x60,0x15,0xdb,0xff,0x06,0x05,0x1d,0x00,0xae,0xe6,0xcb,0x09,0x50,0x1e,0xec,0x36,0x08,0xcc,0xa3,0xf3,0x54,0x06,0x54,0xeb,0xc4,0xf0,0x43,0xc1,0xfd,0xe5,0xf0,0xd5,0xdb,0xe4,0xe3,0xfd,0x44,0x1c,0x0f,0xf0,0xe0,0x03,0x2a,0x65,0xe3,0xc8,0xe9,0xfd,0xef,0xdb,0x42,0x05,0x06,0xe2,0xd1,0xa9,0xdc,0x10,0x9d,0x38,0x0d,0x1f,0xc0,0x0d,0xf1,0xd7,0x31,0xc9,0x21,0x87,0xf7,0xed,0xf7,0xa1,0x08,0xf3,0xbf,0xcf,0x2a,0xd6,0xe9,0xfd,0x03,0xf9,0xdc,0x22,0x00,0xff,0x15,0xeb,0x09,0xfb,0x2a,0x29,0xf7,0x09,0xfa,0xb5,0xf0,0x13,0xe6,0xf8,0x46,0x07,0x29,0x8d,0xfd,0xfe,0x0a,0x1b,0x18,0xf3,0xa4,0xec,0xc3,0x26,0xa0,0xe4,0xd8,0x0a,0xd8,0xf0,0x96,0x86,0x2d,0xc9,0x02,0x21,0xf4,0x2e,0x40,0x1f,0x0e,0x3e,0xd7,0x51,0x3f,0x0d,0xc9,0x9c,0xb7,0x27,0xd8,0x23,0x02,0xc7,0x0f,0xd5,0x90,0x38,0xc9,0x1e,0x02,0xaa,0x3c,0xbe,0x88,0x29,0xdd,0x39,0xe7,0x98,0x09,0xd9,0x84,0x38,0xe9,0x4b,0xb3,0xbb,0x2e,0x29,0xfd,0x1a,0x1f,0x08,0xe4,0x3d,0x1e,0xfb,0xc2,0x32,0x13,0x4b,0x40,0xdd,0xfc,0xe4,0xff,0xf7,0x28,0xde,0xbb,0xf3,0x09,0xe5,0x06,0xc9,0x34,0xe5,0x93,0xde,0xd8,0x2e,0xb4,0xfe,0xc6,0x41,0xa6,0xdc,0xfc,0x0c,0x2d,0x33,0xd4,0x62,0xe7,0xc8,0xcc,0x4a,0x28,0xc7,0x31,0x93,0x1b,0x4c,0x33,0x2d,0x3f,0xc1,0x58,0xe2,0xcc,0xef,0xf1,0xf9,0xce,0x09,0x24,0xb9,0x09,0xd9,0x23,0xef,0xfc,0xd1,0x15,0x41,0xfd,0x21,0xe6,0x49,0xbd,0xd0,0xd8,0xcc,0x2c,0xd1,0xfe,0xb8,0xca,0xd4,0xec,0xdb,0x14,0xd5,0x61,0xfa,0xbc,0x27,0xf8,0x91,0xa3,0x3f,0x23,0x48,0xcd,0x1d,0xf3,0x2c,0xfc,0xaa,0xb0,0xf0,0x0b,0xd9,0xe5,0x0c,0xb8,0x0f,0xdb,0x95,0xf6,0xef,0x1e,0xda,0xe5,0xf4,0x6f,0x42,0xf2,0x35,0xba,0x11,0xc9,0x0b,0xf2,0xb7,0x16,0xbd,0xa0,0x24,0x36,0xe5,0x3d,0xe7,0xfb,0xa0,0xd6,0x05,0xb7,0xd8,0x16,0xf2,0x1d,0xac,0x81,0x04,0xb5,0xdd,0xe9,0x21,0x99,0x3c,0x16,0xf6,0x1a,0xa6,0xb8,0x4c,0xd1,0x24,0xd9,0xeb,0xe8,0x03,0xc1,0xe4,0xe4,0xab,0x92,0xf5,0x11,0xd6,0x45,0x35,0xf4,0x05,0xe5,0xe5,0xe2,0xc4,0x5a,0xf9,0xf3,0xe7,0xd6,0xd0,0x0a,0xb0,0x23,0xdf,0x3d,0xea,0x29,0xde,0x0d,0xb3,0x12,0x0a,0xee,0xb1,0x36,0x3a,0xb6,0x07,0x1b,0xf4,0xc1,0x08,0x2f,0xc7,0x03,0xf6,0xf1,0xf8,0x16,0x36,0xe1,0x1a,0x02,0x08,0xfd,0xe9,0x9b,0xd2,0xb8,0xfc,0x32,0xb2,0xe2,0x37,0xd9,0xaf,0x05,0xfb,0x52,0x1c,0x09,0x03,0xe1,0x2e,0xd7,0x2c,0x22,0xf6,0x04,0x03,0x11,0x26,0xd9,0x1e,0xb1,0xe4,0xa7,0x33,0xf2,0x1a,0x10,0xf8,0xe1,0x29,0x0b,0xe2,0x1b,0xf8,0x1c,0xd3,0xc9,0x17,0xec,0x00,0x61,0xbf,0x01,0x3c,0x9c,0x06,0x54,0x10,0xd4,0xe9,0xa2,0x3f,0xba,0xd3,0xe5,0xaa,0x05,0x03,0x50,0x07,0x38,0x17,0xf9,0x44,0x03,0xc5,0xfd,0xc3,0xb4,0xdc,0xf5,0x0c,0x07,0xf5,0xcd,0x31,0x44,0x62,0x08,0xbe,0xa5,0x34,0x2a,0xe7,0xfa,0x07,0xca,0xd8,0xad,0xce,0x00,0xee,0xdb,0x1f,0xb7,0x38,0xde,0xc2,0x3c,0xf3,0xeb,0xb7,0x99,0xb2,0x1b,0x0f,0xd8,0x14,0x17,0x15,0x46,0x19,0x29,0x25,0xae,0x3a,0xce,0x41,0x43,0xdb,0xd7,0x1a,0x1b,0x91,0x17,0xa4,0x0b,0xeb,0x0d,0xde,0xe8,0xde,0x81,0xfd,0xf2,0x14,0xc3,0xa7,0x0b,0xc9,0xe9,0x30,0xbb,0x23,0xef,0xf0,0xe4,0x12,0xc9,0xcf,0xfb,0x1b,0xcb,0xe9,0xad,0xf5,0x56,0x03,0x4d,0xdb,0xe6,0x15,0x07,0x5f,0x34,0xfa,0xcb,0xf5,0x2d,0xd9,0xc9,0x19,0xfe,0x23,0xfa,0xda,0xdd,0xd3,0xac,0xca,0x31,0xd6,0x08,0x1d,0xef,0xfe,0x18,0xef,0xfd,0xee,0xe9,0x32,0x4f,0xee,0x02,0xf1,0xf3,0xb3,0x61,0x0b,0xe7,0xbe,0xe6,0xa2,0xc3,0xdd,0x09,0xe6,0x01,0xaf,0xc0,0x2b,0xca,0xf1,0x3a,0x2d,0x2e,0x31,0x0c,0xd1,0x88,0xdf,0xb5,0xf1,0x17,0x23,0xf2,0x3b,0x08,0x60,0xee,0xd5,0xfe,0x12,0x18,0xdc,0x02,0x02,0xa9,0xdd,0xde,0xca,0xed,0xd3,0x11,0x14,0x0f,0x46,0xfe,0x02,0xc3,0x1c,0x18,0xcd,0xdc,0xdd,0x58,0xd7,0xee,0x43,0x1d,0xce,0xd9,0x09,0xf5,0x09,0xe4,0x58,0x13,0xd2,0x08,0xe1,0xda,0xee,0x36,0xa1,0xf3,0x00,0x43,0xa5,0x06,0xf9,0x0b,0xf3,0xda,0x8e,0xd5,0xe8,0xd7,0xd2,0x2b,0x21,0x00,0xc0,0x17,0xd1,0x09,0xd3,0xda,0xfc,0xba,0x15,0x08,0xee,0xd8,0xd6,0xc4,0xab,0x43,0x03,0xfa,0x10,0x22,0xe4,0xf5,0xe6,0x18,0x18,0x3a,0xd2,0xf4,0x08,0xfa,0xd4,0x0d,0xdc,0xd9,0x23,0xa7,0xe9,0x3c,0xff,0x1d,0xf2,0xef,0x39,0x07,0x17,0xc2,0x30,0x2f,0xf3,0xca,0x55,0x15,0xff,0xff,0x99,0x2d,0xe0,0x44,0x0d,0x6e,0xc6,0xf1,0x20,0x0f,0xc1,0xf1,0x0a,0xf5,0xec,0x11,0x24,0xf8,0xe8,0x02,0xd2,0xe6,0x12,0x1e,0xff,0xc9,0x17,0xcf,0xd7,0x07,0xd8,0x0d,0x04,0x0d,0x2a,0xfe,0x09,0x3b,0xcd,0x56,0x26,0xcd,0x03,0x2a,0x0f,0xdc,0x3c,0x01,0xaa,0xd8,0x3f,0x37,0x01,0xde,0xf3,0xe8,0xdd,0xf8,0xe3,0x01,0x39,0xe9,0xbc,0x16,0xfa,0xe1,0xd3,0xf4,0xd1,0x15,0x22,0x17,0xdd,0x0f,0xef,0xd4,0xd2,0x15,0x81,0xd2,0x19,0xe6,0xd6,0x1d,0x06,0x08,0xb7,0xe2,0xde,0xed,0xe0,0x0e,0xed,0x09,0x38,0xcb,0xef,0xea,0x2f,0xd9,0xdf,0xfb,0x05,0xe3,0x11,0xce,0xe7,0xf4,0x15,0x45,0xf5,0xf4,0x09,0x16,0xcc,0x44,0xce,0x1b,0xe5,0x0e,0xfa,0xc1,0x2d,0x44,0xed,0xe6,0x27,0xfe,0x00,0x23,0xdb,0x1a,0xc1,0x2d,0xad,0xbe,0x2b,0x22,0xe7,0x07,0xe1,0xd8,0xf6,0xe7,0x53,0xbb,0xd1,0x85,0xe7,0xdd,0x32,0xe2,0xf3,0xe0,0x05,0x09,0xfa,0xd7,0xf4,0x15,0x3b,0xea,0x16,0x0f,0xe8,0xd4,0x44,0xf8,0xb0,0xe4,0xe9,0xe4,0xe1,0xb7,0x52,0xb5,0x65,0x03,0x11,0xab,0xbe,0x3f,0xc8,0x21,0xf7,0x09,0x0f,0x31,0xf4,0x47,0xfc,0xfb,0xdb,0x81,0x2a,0x37,0xd4,0xc4,0x08,0xb7,0xff,0xfc,0x27,0x1c,0xf0,0x00,0x07,0x16,0x07,0xaf,0xe4,0xda,0x26,0xcc,0xf1,0xd8,0x37,0x35,0x18,0x36,0x0c,0x0b,0x4e,0xfc,0xd7,0x97,0x15,0xed,0xdf,0xf1,0x00,0xe7,0x2b,0xde,0xf3,0xb5,0xc6,0x33,0xd5,0xf2,0x0e,0x1f,0xf0,0xcd,0xbf,0x40,0xbe,0x07,0xd4,0x8c,0xd4,0xbe,0x92,0xdb,0x3e,0x1b,0xfb,0xd4,0x1a,0xe1,0x0d,0x0d,0x1b,0xe6,0x9f,0xd9,0xc0,0xb9,0x09,0xd8,0xa6,0xdd,0xfd,0xf8,0x0d,0x01,0x3d,0xb7,0xe6,0xe1,0xca,0xe0,0x01,0xe4,0xa9,0x0f,0x18,0x1d,0xc2,0xf0,0x08,0x16,0x11,0x06,0x14,0xb4,0x9a,0xb5,0xc1,0x90,0xc7,0x00,0xfc,0x0b,0xd5,0x95,0xe6,0x24,0xf3,0xfb,0x01,0xac,0xc0,0x13,0xe2,0xff,0xd0,0xd2,0x1a,0x1c,0xb5,0x4d,0x3b,0xeb,0x1f,0xf0,0xf8,0xb5,0xcb,0xff,0xd9,0x19,0xd4,0xf6,0x16,0x14,0xdb,0xfe,0x26,0xdb,0x97,0x44,0x21,0x3a,0xec,0xda,0xe3,0x08,0xa7,0x4e,0xd7,0xf2,0x34,0xcb,0x40,0xd0,0x75,0x1b,0xf4,0x2b,0x26,0xf3,0x2c,0xc8,0xe5,0xd6,0x71,0x1d,0xf3,0xb9,0x64,0xc1,0xee,0x25,0x27,0xc0,0x0c,0x19,0xf1,0x11,0x61,0x01,0xea,0x0c,0xf7,0xa1,0x1a,0x18,0xe4,0xc7,0xf5,0x23,0xf5,0x3a,0xfe,0x87,0xfb,0x9f,0x09,0xd2,0x24,0x24,0x27,0xf5,0xa1,0x17,0x36,0x0c,0xe9,0xf0,0x28,0xec,0xe2,0xe1,0xb5,0xcb,0x07,0xf7,0xe0,0x15,0x1c,0xea,0xde,0x00,0x0a,0x20,0xe8,0xe8,0x42,0xde,0xea,0x01,0xff,0xf1,0x31,0x2c,0x2f,0x11,0xe7,0xf1,0xfd,0xd4,0xed,0x03,0xf1,0xdd,0xf6,0xcf,0xca,0x01,0x40,0xf4,0xff,0xe4,0xe0,0x0b,0x3d,0xe8,0x2c,0xca,0xf4,0xe0,0xf6,0x55,0xef,0x27,0xff,0xd2,0xd6,0x5f,0x07,0xe4,0xfa,0xf1,0x32,0xf4,0x36,0xca,0xea,0x26,0x1a,0x13,0x26,0x19,0xde,0x10,0x13,0xe2,0xc0,0x00,0xc2,0xd2,0x03,0x02,0x3e,0xed,0x02,0x54,0xcd,0x10,0x06,0x18,0xd4,0x60,0x05,0x2f,0x07,0xd7,0xd7,0x14,0x28,0xf8,0xf5,0xec,0xd3,0x03,0xe5,0xf9,0x4f,0x04,0x17,0xec,0x55,0x00,0x13,0x04,0xea,0x27,0xf4,0xb2,0x07,0xf2,0xd7,0x32,0xfa,0x31,0x48,0x09,0xfa,0x40,0xca,0xff,0xf9,0x44,0xf6,0x26,0x11,0x11,0xd5,0x20,0xd1,0xcf,0x7f,0x39,0x25,0x2c,0x2c,0xc4,0x1c,0x20,0xd9,0xa5,0x11,0x0b,0xcb,0xfa,0xed,0xd9,0xe5,0x13,0xd0,0xcf,0x26,0xe4,0xf7,0xd7,0x16,0x51,0xc4,0xea,0xec,0x0a,0xfe,0x1a,0x11,0x15,0x18,0x27,0x6a,0xf1,0x29,0xed,0xfd,0xe2,0xe3,0xe6,0x16,0x1b,0x17,0x2a,0x13,0x16,0x01,0xd9,0xd2,0x07,0xe4,0x04,0xd6,0x4a,0xfd,0x24,0x09,0xde,0x33,0xb7,0xfe,0xc1,0x02,0xdc,0x25,0xf1,0xe0,0x5d,0x19,0xf6,0xee,0xe6,0xc8,0x31,0xe1,0xe5,0xed,0x00,0xf9,0xf2,0xf8,0xc7,0x02,0x02,0xc1,0xd9,0xdd,0x37,0xc9,0xbe,0xe8,0xf9,0x2b,0xe3,0xdf,0x14,0xa8,0x31,0xc8,0xcf,0xfd,0xec,0x2a,0xf6,0xb3,0x96,0xdb,0xc9,0xd5,0x01,0xee,0xec,0x02,0x3a,0x03,0xb3,0x56,0x21,0xcf,0xd3,0x28,0x2d,0xb4,0xd0,0x0b,0xd6,0xf1,0xac,0xf8,0xdb,0x12,0x40,0x19,0x9e,0xfa,0x27,0xe5,0x1d,0xf5,0xeb,0xea,0xbe,0xb9,0xc6,0xde,0xd7,0xf9,0xd9,0xe4,0x35,0xca,0xce,0x2a,0x56,0xbe,0x0d,0x06,0xff,0xcc,0xe7,0xba,0x17,0x22,0xea,0xc2,0x3d,0x15,0xe4,0x2c,0x0b,0x0c,0xf4,0xf8,0x56,0x43,0x4c,0xfd,0xf4,0xb6,0xd5,0xf9,0xd5,0x05,0x1c,0xdf,0xfe,0x00,0x35,0xec,0xe6,0xa9,0x06,0x17,0xdc,0xcf,0x06,0xf1,0x42,0x25,0xd2,0xc6,0x1a,0xfc,0xe6,0xf0,0xd5,0xdd,0xde,0xf2,0xd3,0xfe,0x06,0x81,0x23,0x20,0x3a,0x1f,0x24,0xe7,0x17,0x09,0x21,0xff,0xb7,0xeb,0xb4,0xc7,0xf0,0xb0,0xb3,0xfa,0x0c,0xc3,0x22,0xf4,0x1b,0xdd,0xd3,0x17,0x3b,0x33,0xa2,0xd1,0x18,0x1f,0x2a,0xce,0x0d,0xbe,0xc4,0x0f,0x3f,0xff,0xe9,0xdc,0xaf,0x01,0xec,0xeb,0xf1,0xc8,0xc1,0x22,0xc8,0x2d,0xa7,0xc6,0xbe,0x44,0xd5,0xea,0x1a,0x1d,0x0d,0x1e,0x0f,0x21,0x03,0x45,0xd5,0x39,0xfa,0x0e,0xf4,0xdf,0xf9,0x0d,0xdf,0x17,0x23,0x8a,0x14,0x20,0xcc,0x08,0x09,0xe1,0x25,0xe3,0xb9,0x1e,0xf4,0x1e,0xcf,0xe2,0xef,0xca,0xf0,0x2d,0x1c,0x00,0xf9,0xdd,0x88,0x1f,0x0c,0xdd,0x2e,0x03,0xd2,0x05,0x0a,0xe4,0x35,0x0a,0x2b,0xbb,0xb6,0x09,0xbc,0xe5,0xfd,0xeb,0xd3,0xe6,0xdc,0x08,0xd8,0x39,0x1d,0xf0,0x3b,0xe1,0x04,0xfa,0x0a,0xf5,0xe4,0x13,0xd6,0x2e,0x08,0x05,0x18,0xa6,0xd3,0xd9,0x3f,0x31,0xb7,0x08,0x8e,0x10,0x21,0xda,0x1d,0xe8,0xe7,0xf2,0x1a,0x06,0xba,0xd7,0x09,0x01,0xcd,0xf7,0xb1,0xe6,0x01,0xfe,0xf6,0xe8,0xe0,0xc5,0xd5,0xdc,0xbc,0xff,0xb1,0x1e,0x2c,0xd5,0xf6,0xed,0x42,0xb0,0x07,0x08,0x1c,0xe9,0x30,0xf3,0xde,0xcf,0x16,0x2d,0xf1,0x28,0xe1,0xd2,0x20,0x1c,0xe8,0xfb,0x17,0xe1,0x23,0xe5,0xd1,0xfc,0xee,0x0e,0x20,0x0e,0x15,0x11,0xc7,0x1a,0x00,0x17,0xc6,0x24,0xd6,0x05,0x1f,0x08,0xfc,0x08,0xef,0xf7,0xf4,0xc6,0xd1,0xe1,0x29,0xe6,0xed,0x0b,0xb6,0x19,0xf5,0xea,0x2a,0x25,0xfc,0xa5,0xd9,0x1f,0x3f,0x30,0x00,0x01,0x29,0xdb,0x06,0xf3,0x24,0xa9,0x21,0x1f,0x16,0x13,0x03,0x1d,0x2c,0x04,0xea,0xf7,0xe3,0xee,0x43,0x20,0x40,0xfc,0x38,0xcd,0x5c,0xfb,0x36,0xd6,0xd5,0x30,0xbd,0xeb,0xe3,0x0a,0xd4,0xec,0xef,0xfb,0xd2,0xf5,0x08,0xe8,0x0a,0xfb,0xe1,0x32,0x81,0x2f,0xc8,0x38,0xf4,0x1a,0xd2,0xac,0xd2,0x02,0x1c,0xd1,0xef,0xf9,0xad,0xe8,0xee,0xf3,0x13,0xff,0x16,0xa1,0xa7,0xd4,0xf2,0xee,0x21,0x00,0x19,0x30,0x40,0xd8,0x0f,0x19,0x16,0x4d,0x3a,0x1c,0xb3,0xea,0x00,0xff,0x88,0xfd,0xfe,0xc6,0x38,0x02,0xe9,0x06,0xfe,0x2a,0x3a,0x11,0x10,0xf4,0x11,0xef,0xf7,0xea,0xf9,0x28,0xd1,0x17,0xdb,0xbe,0x07,0x46,0xe6,0x94,0x02,0xe8,0x12,0x06,0x09,0x06,0xf5,0xbd,0xb4,0xda,0xd2,0x32,0xd9,0x2a,0xa1,0x3a,0x3c,0xe1,0xe2,0x26,0x2a,0x12,0xc2,0xeb,0x01,0xbe,0xf6,0x1f,0x5d,0x36,0xff,0x04,0x09,0xcb,0x19,0x23,0x10,0xfc,0xc8,0xce,0x10,0x18,0x0c,0x08,0xc7,0xe6,0x0f,0xe5,0xd1,0xf0,0xda,0xd5,0xe0,0xc2,0x24,0xda,0xe2,0x0a,0xf9,0xec,0x4d,0x8c,0xdf,0xde,0xfe,0x1a,0xf0,0xc1,0xc3,0xcd,0x2b,0xe9,0x0e,0xc9,0xa6,0x35,0xee,0x2c,0xe2,0x4d,0xfd,0x1e,0xfc,0xf7,0xc9,0x4d,0x27,0xaf,0xde,0xd3,0xb2,0xd9,0xfb,0xef,0x27,0xfd,0x0f,0x1a,0xef,0x96,0xc4,0x23,0xf1,0xdc,0x0c,0x07,0x0f,0xeb,0x34,0xf7,0x2a,0x17,0xf5,0xdf,0x09,0x9f,0xdb,0xf2,0xb5,0xe4,0xf0,0x1e,0x3e,0xe4,0x4b,0x15,0x0b,0xb3,0x11,0xdb,0xf4,0xef,0x50,0x1f,0x3f,0x24,0x46,0xda,0xdf,0x0b,0x30,0x82,0xf8,0xbd,0xff,0xdb,0xdd,0x15,0xe8,0x3f,0xba,0x3c,0xc9,0x3e,0x19,0xb7,0xcc,0xee,0xf3,0xf2,0xb9,0x36,0x25,0x1e,0x2c,0x0c,0xbf,0x07,0xf1,0xc7,0x12,0xfb,0xda,0x49,0x2d,0xb1,0xbf,0xe7,0xce,0x0e,0xf9,0x2f,0xe4,0x09,0x1c,0xe3,0xd2,0x47,0xc7,0xf0,0xe3,0x3a,0xab,0xd1,0xf2,0xf3,0xf2,0xb5,0x21,0xe5,0xe0,0xde,0x13,0xfc,0xb6,0x04,0xf0,0xd5,0x99,0xe3,0xfb,0xbb,0x04,0xe3,0xfa,0xc8,0xf2,0x15,0xdd,0xc8,0xb1,0x28,0x0b,0xad,0x1d,0x21,0xe9,0x23,0xd4,0xd0,0xe8,0xc0,0xc8,0xe5,0x12,0x11,0x14,0xda,0x09,0xf8,0xcc,0x0f,0xe2,0x22,0xcc,0xfd,0x03,0xb1,0x9e,0xde,0xbc,0x3a,0x14,0x2d,0xe1,0xe5,0xc6,0xd9,0x9b,0xec,0x05,0xa3,0x20,0x30,0xc1,0xfc,0x26,0xe3,0x3f,0x1e,0xff,0xe3,0x0d,0x50,0x01,0x9e,0xd6,0xff,0xae,0x18,0x01,0x2b,0x49,0x0b,0x5d,0x0b,0xf0,0xed,0x06,0x2f,0x4c,0x3d,0x0d,0xd2,0xd4,0x7f,0xfc,0xf1,0x49,0x10,0xe1,0xf6,0xf4,0x92,0x2e,0xdf,0xed,0x1a,0x01,0x17,0x08,0xe2,0xee,0x49,0x10,0x8f,0x0b,0xde,0x2c,0xe8,0x1b,0x07,0xbf,0xce,0xc3,0xee,0xfa,0x2b,0xe7,0xd4,0x25,0x05,0xd0,0x1d,0xbd,0xb1,0xbd,0xfa,0x0d,0xd8,0xff,0xe2,0x14,0xfc,0xf8,0x16,0xca,0xf9,0x33,0xef,0x17,0xd3,0x2a,0xed,0xa4,0x50,0xda,0x3b,0x51,0xe0,0x5f,0xf8,0x03,0x35,0xb8,0xdc,0xc5,0xe4,0x1c,0x10,0x9e,0xe2,0xe2,0xba,0xd7,0xdb,0x42,0xb5,0xe3,0xd4,0xf1,0x07,0xeb,0xfe,0xe7,0xfa,0xa1,0xfa,0x38,0x1a,0xc8,0xe9,0x41,0xed,0xe6,0x9a,0xac,0xf1,0x26,0xff,0x25,0xc5,0xf4,0xe8,0xb6,0xfe,0x4e,0xff,0x24,0xda,0x21,0xfb,0xa5,0x22,0xf2,0xbc,0xd2,0xef,0x02,0xfd,0xf1,0xb2,0xf0,0x6a,0xbd,0x10,0xe5,0x53,0xe6,0x3a,0x18,0x8b,0xfb,0x0e,0x32,0x24,0xe9,0x7f,0x0e,0xd2,0x1f,0x32,0xc6,0xf0,0xb3,0xa1,0xf7,0x14,0x3f,0x13,0xdf,0xb5,0xe9,0xb8,0xc8,0xe6,0xe4,0x09,0xf6,0x2d,0x29,0xf3,0x67,0x10,0x0e,0xdd,0x27,0x1e,0x0d,0xc3,0xd7,0x0b,0x38,0x55,0xc8,0xee,0xb1,0xce,0xf7,0xd0,0xe2,0xf4,0xc2,0xee,0xd2,0xe1,0xf0,0x39,0x91,0x4a,0xfa,0x9c,0xfe,0x33,0xcc,0x15,0xba,0xe4,0x9d,0x00,0x1e,0xe6,0xe8,0x74,0x25,0x50,0xdd,0xd3,0x58,0xf8,0xed,0xf2,0xda,0x67,0xc5,0xf9,0x30,0x21,0xf7,0xfa,0xdf,0x75,0x1d,0xf3,0xf9,0xb1,0xb3,0xc8,0x52,0x2c,0x95,0xdb,0xfd,0xe0,0xb7,0xde,0x52,0xf1,0x50,0xf3,0xf9,0xe1,0xec,0x1d,0x12,0xe4,0xbd,0x23,0x0b,0xf0,0xbb,0x49,0x38,0xd0,0xcc,0x20,0xff,0x14,0xf9,0xe3,0xd8,0xcb,0xf8,0xf7,0xf9,0xe9,0xe4,0xdb,0xd0,0xcc,0xea,0x3c,0x1c,0xf2,0xbc,0x26,0xf6,0x06,0xe3,0x00,0x0c,0xf4,0xff,0xfb,0x15,0xf8,0x01,0x2c,0x05,0xbb,0xc6,0x07,0xc6,0xf5,0x3b,0x2d,0x1a,0xf2,0x2f,0xcd,0xc9,0xfa,0xf3,0x03,0x35,0xe8,0x19,0xde,0xcc,0xef,0x31,0xf1,0xee,0x2e,0x5e,0xc9,0x05,0x7b,0x1c,0xb9,0xbc,0x09,0x4a,0x30,0x08,0x01,0xea,0xd6,0xe7,0xb6,0xcb,0x0a,0xd8,0xe0,0x0c,0x11,0x09,0x0c,0x22,0xe1,0xe9,0x13,0xc4,0x01,0x18,0xe3,0xd0,0xf3,0x28,0x0b,0xc1,0xc2,0xd4,0xff,0xf0,0x16,0x5f,0x33,0x16,0xcb,0xd4,0xb7,0xde,0xd2,0x16,0xde,0xf2,0xfe,0xb4,0xdf,0xb2,0x1b,0xb6,0x9e,0xf7,0xfe,0xbf,0xaf,0x21,0xae,0x2a,0x23,0xdb,0xe7,0xe9,0x1b,0xcd,0x1d,0x17,0xae,0xdb,0x32,0x42,0xb9,0xc8,0xf2,0x0a,0xfc,0xe1,0xb2,0xd7,0xd6,0xe5,0xeb,0x4b,0xd0,0x45,0xcb,0xa7,0x12,0xd0,0x31,0xe4,0x8b,0x03,0x38,0x00,0xbd,0x28,0xea,0xf4,0xf3,0x2c,0xfa,0xad,0x27,0xf4,0xdd,0x63,0xdc,0xf3,0xd7,0xd1,0x7f,0xfa,0x34,0x1b,0x23,0xbc,0xf7,0xe0,0x20,0x26,0x24,0xd2,0xa3,0x16,0xe7,0xf0,0xd2,0xf9,0xa7,0xbe,0xd7,0xec,0x12,0x07,0x13,0x00,0x0f,0xdc,0x50,0x10,0xf3,0xad,0x38,0x93,0x13,0xf5,0x01,0xb5,0xbd,0xe4,0xd3,0x0a,0xe2,0x28,0x3e,0x2d,0x20,0x1c,0xea,0xd8,0xb6,0x53,0xe6,0xca,0x0b,0xf1,0x0e,0xa9,0x1e,0x07,0x2f,0x4f,0xf1,0xe0,0xc3,0xc6,0xce,0x01,0x09,0xd0,0x0d,0x18,0x25,0x30,0x17,0x9d,0x33,0x60,0xfa,0x07,0x40,0xd6,0x0a,0x0a,0x21,0xfe,0xb5,0x0d,0x12,0xe5,0xe2,0xce,0xdf,0x01,0xdf,0xd0,0x0c,0x27,0x22,0x28,0x21,0x2c,0xf2,0x51,0x2d,0x1b,0xc3,0x2c,0xb5,0x07,0xd1,0xd4,0x30,0xee,0xd9,0x24,0xf5,0x13,0xe2,0xc9,0x14,0x10,0x19,0xbc,0x00,0xfd,0xd1,0xe4,0xd8,0x13,0xb3,0xdc,0xef,0xcd,0xe1,0x40,0x1c,0xd7,0xdf,0x17,0x1c,0xf5,0xe4,0xf0,0xcc,0xe8,0xd4,0x11,0xdd,0xbb,0x34,0xf3,0x38,0x09,0x3f,0x1a,0xef,0xf8,0xee,0xd2,0x35,0xe9,0x22,0xd1,0xd0,0x36,0x07,0xfe,0x1b,0xfe,0xd1,0x06,0xee,0xd8,0x9c,0xee,0xe9,0x24,0x27,0x09,0xd1,0x02,0xcc,0x34,0xf7,0x7f,0x2f,0x02,0x09,0xc1,0xea,0xd3,0x1c,0x3c,0xe8,0xe6,0x09,0xda,0xf9,0xda,0xe1,0xf3,0x38,0x20,0xb9,0x0d,0x14,0xeb,0xef,0xfd,0xb3,0xe6,0x07,0x1a,0xff,0xf0,0x1a,0x2f,0xc3,0x12,0x31,0xf0,0xed,0x3c,0xd1,0x03,0x2b,0xb3,0x18,0xc0,0x9b,0xed,0x23,0x1d,0xd9,0xc2,0x07,0xf9,0x28,0x15,0x08,0x1a,0xc5,0x04,0xc6,0x19,0xe5,0x0c,0x4c,0x05,0x09,0xda,0xff,0x02,0x2f,0xe9,0x0a,0xdf,0xa0,0x03,0x21,0x31,0x11,0xff,0x07,0x4d,0xd7,0x07,0x46,0xdc,0xcf,0x08,0xe9,0xf8,0xef,0xa3,0x38,0x02,0x28,0x1b,0x27,0x95,0xe5,0x1d,0x99,0x94,0xc4,0x23,0xeb,0x0e,0xb9,0xaf,0xcd,0x39,0xfe,0xfb,0xeb,0x01,0x2e,0xea,0xd9,0xf6,0xf3,0x0a,0x19,0xc4,0x21,0x2e,0xe4,0x03,0xdf,0xfc,0xec,0xe9,0xc3,0x02,0x2b,0x4b,0x0b,0xca,0x0a,0x4a,0xbe,0x14,0x0a,0xe9,0x37,0xa3,0xbb,0xb6,0x3a,0xd7,0x27,0xb0,0x05,0xfe,0xff,0xe4,0x0f,0x8f,0xf8,0x19,0x9e,0xcc,0xe9,0x46,0xf8,0xb9,0xf7,0xc5,0xab,0xfa,0x09,0x60,0x24,0xc8,0x15,0xa0,0x25,0x07,0xc6,0xd3,0xda,0xf1,0x3a,0x2b,0xd7,0xe4,0x18,0xee,0x54,0x1a,0x03,0x16,0x18,0xb6,0xfb,0xd9,0x3f,0x00,0x09,0x28,0xe3,0xdf,0xc9,0x2c,0x85,0xf3,0xf6,0x16,0xdc,0xee,0x0d,0xfa,0x2f,0xf4,0xde,0x1d,0xd9,0xd9,0x36,0x23,0xd5,0xec,0x0f,0x05,0x00,0x30,0x3a,0xdc,0x20,0xcd,0xb6,0x45,0x99,0xca,0x0c,0x4a,0x31,0x12,0xd8,0xfa,0xfd,0x17,0x82,0xbd,0x06,0xe3,0x25,0xbc,0x37,0xdc,0xdf,0xc2,0xcb,0x34,0xe4,0xf9,0xb7,0xf4,0x0d,0x9b,0xe3,0xd2,0x81,0xd9,0x46,0xce,0xae,0xb0,0x68,0xe0,0x06,0xec,0xfd,0x0e,0x37,0x0a,0x24,0x18,0x0d,0x13,0xa7,0xdb,0x02,0x86,0xb0,0x25,0xed,0xcf,0x01,0xf5,0xd2,0xd5,0xf1,0xf1,0xf6,0xc6,0xd9,0xda,0xc8,0x11,0x28,0x22,0xae,0xf9,0x07,0xe1,0xdb,0xfc,0x0b,0x88,0xd0,0x02,0xca,0xe7,0xfc,0xd1,0xb1,0x10,0x03,0x48,0x08,0xfd,0x44,0x35,0x0b,0xd7,0x23,0xf6,0x19,0xfe,0x01,0xf3,0x2e,0xd5,0x30,0x45,0x3e,0x48,0xb6,0x19,0x09,0xf7,0x07,0x14,0x20,0xfd,0xd6,0xd9,0x23,0x0f,0x11,0x02,0x3f,0xc6,0xec,0x24,0x07,0xe2,0xd9,0xeb,0xfd,0xf9,0xd4,0x12,0x14,0x1d,0x29,0x1e,0x29,0x0b,0xad,0x1e,0x2d,0x0a,0xd6,0xd7,0xfb,0x33,0x30,0xd0,0xc7,0xf3,0x3f,0xf4,0xf0,0xe1,0x46,0x16,0x55,0xf9,0x3e,0xc9,0x19,0x1c,0xec,0xf2,0xeb,0x9a,0xc4,0xf1,0x05,0xce,0xe6,0xea,0xf5,0xd0,0x08,0x25,0x22,0xdf,0xf7,0xcd,0xb2,0x02,0xfc,0xce,0xc8,0xd1,0xa6,0x33,0x02,0x07,0x21,0xf2,0xb1,0xd8,0xef,0xe0,0xc2,0xd6,0xf7,0xfd,0xce,0xc4,0x08,0xce,0x2d,0x0e,0x98,0xff,0xcb,0xf3,0xda,0x40,0x15,0xf3,0x10,0xf7,0xe1,0xc4,0xe0,0xc8,0x10,0xf3,0xfc,0x27,0xc2,0x1a,0xc3,0x18,0xdf,0xce,0xa5,0xd0,0x42,0x24,0xd5,0x0f,0xe6,0xf8,0xf8,0xf1,0x15,0xf1,0xbb,0x1b,0xc1,0x05,0xfb,0x41,0xba,0xf0,0xce,0x01,0x43,0xe6,0xf2,0x2d,0xea,0xba,0xde,0xd4,0x09,0x04,0xfc,0xff,0xdd,0xcd,0x21,0x09,0xfd,0x2b,0xfa,0xf5,0xf7,0x2b,0xfe,0x13,0xd6,0x07,0x86,0x33,0xe8,0x13,0x0f,0x03,0xcf,0xa3,0xc1,0x0d,0x08,0x2b,0xd6,0xe0,0xce,0x0a,0xf5,0xf3,0x04,0xdf,0xb0,0xe9,0xf4,0x13,0xfb,0xa8,0xd9,0xd9,0xfe,0x0f,0xbe,0xc9,0x25,0x35,0x03,0xcf,0xe3,0xe0,0xf0,0x56,0x0e,0xf1,0x2b,0x1e,0xf0,0x07,0xf0,0x15,0x9e,0xc6,0xf2,0xfc,0x1e,0xa6,0xb1,0xed,0x2a,0x25,0x22,0x32,0x13,0xbf,0xc3,0x0d,0x18,0xd3,0xf6,0x02,0x02,0xe3,0x22,0x76,0xfd,0xdd,0xdd,0xed,0xde,0xe4,0xd9,0xa0,0x26,0xdb,0xbd,0xf1,0x1a,0xae,0xf7,0xd3,0xc0,0xf1,0xc7,0xf3,0xc9,0xfe,0x31,0x84,0xb1,0xc5,0x46,0xf4,0xfc,0x49,0xf5,0xcf,0x16,0xe8,0xef,0xe1,0x0a,0xfd,0xcd,0xd1,0xff,0xf3,0xf1,0xf7,0xf5,0xec,0xc5,0x11,0xd7,0xd4,0x15,0x13,0xae,0xe5,0xe7,0x34,0xdb,0x0f,0x1b,0x23,0x9b,0xc9,0xbf,0xdd,0x7f,0xfa,0x00,0x04,0xbc,0xa6,0xcb,0xf2,0x0e,0xbc,0xec,0x96,0xeb,0xf9,0xe8,0xe0,0x1d,0x97,0xfa,0xf0,0xfc,0xf3,0x19,0xd1,0x1c,0x1b,0xd9,0xf0,0xb2,0x1f,0xd0,0x1e,0x2b,0xfc,0x00,0xe1,0x0d,0x19,0xf1,0xf9,0x08,0xeb,0xcd,0xca,0xed,0xbf,0xdb,0x08,0x2f,0x0e,0xeb,0x9f,0xc9,0xc4,0x1c,0x0b,0xce,0xbf,0x28,0x09,0x0d,0x3e,0x29,0xc5,0x18,0x30,0xf1,0x4b,0xed,0xff,0xe2,0xec,0xf0,0x09,0xd4,0x6c,0x39,0xcd,0x21,0xd3,0x5b,0x0f,0x0c,0xd1,0xf2,0x2d,0xe3,0x0d,0xdd,0x07,0xb1,0x33,0xe5,0xb9,0x1b,0xc7,0x04,0x10,0xf4,0xc2,0x4d,0x16,0x98,0xe1,0x1c,0xe4,0x31,0xfb,0xe0,0x00,0x07,0x43,0x0e,0xe2,0xde,0xd4,0xb1,0x14,0xec,0x7f,0xdc,0xf2,0xee,0xc4,0xd4,0x53,0x19,0xe3,0xfb,0xf1,0xdb,0xb4,0x06,0xb9,0xc3,0x16,0x06,0xfb,0x00,0xd0,0xc9,0xee,0x04,0x50,0x42,0xaa,0xbd,0xbb,0xe1,0xde,0x1c,0xfc,0xe2,0xcf,0xb4,0x0f,0xeb,0xff,0x88,0x4f,0x0f,0x9c,0xd3,0xe2,0xd7,0xdb,0x18,0x1d,0xfc,0xef,0xca,0x31,0xfc,0x1b,0x1b,0xa6,0xdd,0xfd,0xfc,0x0b,0x4a,0x0f,0x1c,0xda,0x8d,0x3b,0x1b,0xe7,0x0d,0xde,0xd1,0x15,0x11,0xcf,0x0b,0x29,0x19,0x03,0x31,0xf0,0x5a,0xf0,0xc4,0xdd,0x3e,0x25,0xfd,0xd3,0xdc,0xe8,0xda,0xb8,0xc7,0xff,0xe6,0xf2,0xc7,0x07,0xd5,0x1f,0xfa,0xc4,0x36,0xb4,0x2f,0xe1,0xd5,0xfb,0x15,0x1b,0x08,0xee,0xda,0xd2,0xec,0xbc,0x0f,0x1a,0xc3,0xeb,0xec,0xfa,0x0f,0xc9,0x3c,0x5b,0x00,0x33,0xfd,0x01,0x1d,0xcc,0xe2,0x3b,0x43,0xcd,0x56,0x39,0x09,0x0e,0xc3,0xd1,0xfd,0xbb,0x30,0xdb,0x53,0x1a,0xb4,0x2f,0x11,0xfc,0x13,0x2f,0xeb,0xc8,0xd3,0x26,0xf7,0x24,0x1f,0xd0,0xe5,0xdc,0x36,0xec,0xd1,0x2f,0xc8,0x28,0xe4,0xd1,0x52,0x24,0x24,0xe5,0xf2,0x0b,0xc4,0xf5,0xcf,0x38,0xdc,0x2a,0x26,0xe6,0xdc,0xc0,0xec,0xd8,0xda,0xf7,0xd1,0xf7,0xfb,0x06,0xf7,0xd7,0x19,0x2b,0xf4,0xff,0xf8,0x19,0xd2,0xe4,0xba,0x1b,0xd7,0x1b,0x22,0xfc,0x53,0xef,0xee,0x21,0x9d,0xe3,0xf0,0x14,0xe7,0xa4,0x0e,0x0a,0xd5,0x23,0x1a,0x2b,0xe5,0x1a,0x14,0x0b,0xf1,0xe7,0xe6,0xdd,0x09,0x0f,0x03,0xeb,0x09,0x18,0x19,0x31,0xae,0xf0,0x29,0x09,0x0a,0xe2,0xe5,0xe3,0xcc,0xfb,0x02,0x03,0xa9,0xee,0x18,0xf0,0xfe,0xca,0xed,0xd2,0xfb,0xf4,0xe2,0xf7,0x05,0x07,0xdc,0xf0,0xf1,0xe5,0x11,0x26,0xc3,0xaf,0x0f,0xf6,0x0f,0x25,0xc2,0xd8,0x10,0x11,0x1f,0x19,0x05,0xfa,0xfb,0xd2,0xe9,0xf8,0xcc,0xb5,0xf3,0xdb,0xc8,0x4a,0xe7,0xf7,0x1b,0x1a,0x2c,0xfa,0xcd,0x00,0x23,0x33,0xce,0xb3,0x13,0xa8,0x01,0xc5,0x0d,0x32,0xee,0xe2,0xef,0x25,0xcd,0xe8,0xf3,0x18,0xe0,0xf0,0x2a,0xde,0x7f,0x4a,0xac,0x1a,0x04,0x17,0x01,0xe8,0xdb,0xdc,0x2a,0xf0,0xe4,0x11,0x01,0x2c,0x09,0x16,0x0f,0xda,0x40,0xd8,0x1d,0x12,0x0c,0x10,0x3a,0xe6,0xef,0x22,0xd6,0xad,0xda,0x53,0x0b,0x20,0x26,0x15,0xb9,0x1b,0xe0,0x37,0x09,0xd2,0xf3,0xf9,0xd7,0xc4,0x16,0xcf,0xdc,0x16,0xec,0x1c,0x23,0xc5,0xe9,0xe5,0xca,0x20,0xb9,0x10,0xe7,0x10,0x51,0x0f,0xdd,0x4f,0x21,0x16,0x28,0xc1,0xb8,0xe3,0x06,0xe0,0x12,0x0a,0xb5,0x0c,0x39,0x27,0xe2,0x02,0x00,0xbb,0x4b,0x0b,0xaa,0xc7,0xf6,0x47,0x2d,0xdf,0x0d,0xfd,0xf8,0xba,0xf0,0xe9,0x08,0xdd,0x00,0xe4,0xf2,0xf6,0xec,0x04,0xc0,0x36,0x19,0xd0,0x03,0xf9,0xaf,0xbc,0xf0,0xda,0x21,0xe7,0xc9,0xba,0x4f,0xa7,0xcc,0xf8,0x2f,0xe5,0x71,0xe8,0x0a,0x38,0xc5,0x15,0xdb,0x0f,0x10,0xff,0x30,0x02,0xe3,0x35,0x0e,0xf5,0x24,0xfa,0x32,0xc9,0x49,0xf0,0xf7,0x1a,0xf5,0x0a,0xd3,0xb4,0xe9,0x0a,0xcc,0x0e,0xc0,0xd7,0xf4,0x0e,0x35,0x1b,0xcd,0xf0,0xc6,0x01,0x26,0xba,0x10,0xe3,0x4b,0x39,0x2e,0xbe,0xfc,0xd3,0xfb,0xf0,0x10,0x3a,0xbf,0x09,0xc3,0xb3,0xd0,0xcb,0xf6,0x42,0x06,0x0a,0xea,0xca,0x1c,0x19,0x35,0x2c,0xdf,0xed,0x0e,0x09,0xfe,0x08,0x03,0xde,0xbb,0xe3,0xe6,0xc6,0x2e,0xff,0xe2,0xe7,0x0c,0x1f,0xce,0xf2,0x05,0xbc,0xdc,0xfe,0xed,0x1b,0x24,0xa3,0xe9,0xd6,0x0f,0x20,0x7f,0x01,0xed,0x03,0x3e,0xd9,0xdd,0x0a,0xf8,0x3e,0xe6,0xd5,0xf6,0xfc,0xe4,0xc9,0xf3,0xdd,0xba,0x04,0x1a,0x04,0x30,0x26,0xe1,0xda,0x49,0xe1,0xab,0xfa,0x22,0xe6,0xc6,0x0e,0xe3,0xd8,0x1a,0x1b,0xd4,0xd7,0xfa,0x20,0xee,0xf5,0xf9,0x16,0x0b,0xdd,0xd2,0x12,0xff,0x51,0xec,0xf7,0xdd,0xb1,0xec,0xe2,0xfe,0xfb,0xd3,0x38,0xd2,0xfc,0xb7,0xee,0x0d,0xf0,0xe7,0xed,0xce,0x1b,0x2e,0x2a,0x24,0xe3,0xeb,0x30,0x03,0x0e,0xd0,0x04,0xdd,0x3b,0xdf,0x49,0x1d,0xe5,0x05,0xeb,0x07,0xcb,0x24,0x23,0xc2,0xed,0xf4,0xeb,0xc6,0xb7,0x5c,0xf0,0xe7,0x69,0xf7,0x05,0x16,0xc1,0xdb,0xfa,0x2b,0xe1,0x19,0xe2,0xa7,0x0a,0xb7,0xf0,0x40,0xd2,0xc1,0xb8,0x2f,0xc3,0xeb,0xcd,0xf9,0xe2,0xfd,0x0f,0x0a,0xe3,0x18,0x19,0xa5,0x0d,0xed,0xf0,0xcc,0xe8,0xed,0xf3,0x2a,0x09,0xb1,0xf7,0xd9,0x3d,0xf6,0x42,0xff,0x31,0xdf,0x09,0xd0,0x1b,0xb8,0xd6,0xeb,0x48,0xfd,0x00,0xb7,0x05,0xf7,0x12,0x01,0x1a,0x05,0xcc,0xf3,0xe6,0xeb,0xcf,0x1f,0xc5,0x23,0x00,0x33,0xbd,0xf7,0xd9,0xb7,0x18,0xec,0xa7,0xee,0xf4,0xb4,0xf2,0x01,0xc7,0x1e,0x1b,0xf2,0xc7,0x0a,0x07,0x17,0x1c,0xbf,0xc8,0x32,0x1a,0x1c,0xe7,0x96,0xf6,0xfd,0x34,0x0e,0xf8,0xf2,0x10,0x14,0xdb,0x02,0x2c,0xed,0xef,0x18,0xe4,0x16,0xdd,0xd9,0xea,0xf2,0x1c,0x24,0x13,0x07,0x17,0xe1,0x1d,0xe9,0xd2,0xbe,0xe6,0xfe,0x30,0x3e,0x1a,0x2f,0x0a,0x06,0xdb,0x01,0xe0,0x16,0xb3,0x1a,0x1f,0xd4,0x05,0xea,0xfd,0xcb,0x13,0x08,0xb8,0x2a,0xb6,0xf8,0xeb,0x29,0x22,0x3b,0x2e,0xf2,0xe7,0x10,0xea,0xd3,0xf2,0xf5,0x14,0x17,0x03,0x29,0x17,0xe5,0xfb,0xf1,0xc7,0xd3,0xb9,0x10,0x06,0xcf,0x96,0xeb,0x13,0x02,0xd7,0x42,0xfd,0xb8,0xf0,0xf3,0xf9,0x07,0xc3,0xe9,0xf4,0x1a,0xd5,0xf0,0xbf,0x24,0xd6,0x17,0xe4,0xd6,0x0e,0x0d,0xe8,0x0e,0x0a,0x44,0xef,0xad,0x0f,0xeb,0x3b,0xd2,0x33,0x32,0xc8,0xf5,0x2c,0x47,0xcb,0x1c,0x2a,0xee,0x31,0x81,0xd0,0xe2,0xdb,0x10,0xdb,0x31,0xfd,0xe6,0x16,0xc6,0x40,0xdb,0x26,0xf4,0xfe,0x2e,0xe8,0xc0,0xf7,0x1a,0xbb,0xd5,0x0f,0x35,0xfd,0xf8,0xee,0xbc,0x06,0xd0,0x0e,0xd5,0xc6,0xf9,0xbe,0xf5,0xbe,0xc8,0xf0,0x11,0xfc,0xe6,0x01,0xf9,0xe7,0x1e,0x27,0xdb,0xdb,0xdd,0x10,0x1c,0xee,0x0f,0x06,0xdc,0x2b,0x1d,0xfc,0x35,0xf8,0x43,0x07,0x05,0xc2,0x17,0x36,0xe8,0x12,0x13,0x08,0xfd,0xf0,0xb3,0xcf,0x4f,0xe5,0xea,0x2e,0xfd,0xfa,0xe7,0x26,0x1f,0xee,0xe7,0x2f,0xe0,0x0c,0x1c,0x29,0x11,0x16,0x25,0xe4,0x1e,0x14,0x00,0xfe,0xd5,0xf7,0xe3,0xe7,0x13,0xc0,0xf5,0xc0,0x24,0x0a,0xed,0xf9,0xe0,0xc6,0xe5,0x10,0x0e,0xe6,0xda,0x16,0x1b,0x11,0xf9,0xf5,0xf1,0xd2,0xe8,0xd3,0x02,0xd6,0xde,0x07,0x1f,0x07,0xdc,0xc8,0x00,0x07,0xe9,0x40,0x16,0xef,0xfa,0xfa,0xe3,0x0d,0xef,0xdc,0x2e,0x03,0xf5,0xc9,0xc5,0xda,0xbb,0xea,0xb0,0xd3,0xfd,0x0e,0x02,0x05,0xf2,0xdf,0x18,0x94,0xe5,0xf1,0xea,0x0a,0x08,0x3e,0xdf,0xe5,0xd2,0x1a,0xb9,0xea,0xe4,0x25,0x33,0x24,0x2c,0x05,0x14,0x7f,0xef,0xef,0x2d,0xf1,0xe5,0x15,0xdf,0xf7,0xa0,0x2f,0xf4,0xfb,0x10,0x0d,0xd4,0x00,0x07,0xde,0x33,0xed,0x14,0xff,0xfa,0xe2,0x51,0xea,0xa5,0x2c,0x16,0x0c,0x1d,0x01,0xcf,0xdd,0xf6,0xef,0x1f,0x12,0x5a,0x19,0xc4,0xee,0x07,0xdf,0xc3,0x6a,0xed,0xdf,0x49,0x30,0x2d,0x08,0x02,0x0b,0xf1,0xdd,0xfc,0x15,0xd0,0xbd,0x03,0x1c,0xef,0xdd,0xe7,0xba,0x47,0x45,0xb9,0xbe,0xd6,0x2e,0xcc,0xab,0xbc,0x06,0xe8,0x07,0xdf,0x0f,0xd9,0x07,0x06,0x1a,0xb2,0xe2,0x25,0xfd,0xfa,0x0d,0x16,0x04,0xfa,0x2b,0xda,0x1a,0x0e,0xb7,0xc5,0xef,0xbd,0xe0,0x85,0xdb,0x03,0xf3,0xd5,0xf7,0x91,0xc6,0xad,0x0e,0xc6,0xed,0xea,0x0f,0xfb,0xd1,0xaf,0x03,0x24,0x26,0x3e,0xe2,0x55,0xe7,0xd2,0xe7,0xbb,0x01,0xc2,0x42,0x23,0xe0,0x24,0x11,0xb8,0x55,0xf8,0x9d,0xf4,0xe4,0x2d,0x04,0x8b,0x29,0xca,0xff,0x1c,0xfe,0xd3,0x3f,0x30,0x07,0x4b,0xfe,0x2e,0xb9,0xff,0x2a,0x59,0x4e,0xed,0xcb,0x01,0xcc,0x09,0x2e,0x42,0x1c,0xaf,0x46,0xc9,0xee,0x9f,0xc6,0xbb,0xeb,0xbd,0x11,0x3e,0xef,0xef,0x36,0xa7,0xde,0xc4,0xc8,0xee,0x8d,0xbc,0x3b,0xdd,0x49,0xe1,0xb5,0xc0,0xe2,0xe3,0x29,0xd1,0xfe,0x1a,0x03,0x95,0xe6,0xe6,0xca,0xfd,0xe6,0x1b,0xf1,0x14,0x12,0xed,0xf0,0x00,0xc6,0x2f,0x02,0xb7,0x26,0xf7,0x9d,0x27,0x91,0xf7,0x54,0x38,0xba,0xea,0xf8,0xfc,0xd9,0xab,0x37,0x07,0x8e,0xf2,0x31,0x0c,0x1e,0xd6,0x0a,0x09,0xef,0x81,0x1c,0xbc,0x08,0x13,0xe6,0xf8,0xb2,0xdd,0x11,0x51,0xe4,0x50,0xcc,0xa9,0x35,0xf8,0x3c,0x97,0xd4,0xce,0xea,0xf6,0xe2,0xd4,0x58,0xf4,0xb6,0x42,0xe5,0x33,0x4a,0xfc,0xdd,0x35,0x2a,0xa3,0x28,0xe9,0x5a,0xa5,0xe0,0xf2,0xe5,0x06,0x23,0x2e,0x59,0xdc,0x3a,0xec,0x26,0x2f,0x32,0xc9,0xec,0xc4,0x08,0x0c,0xcd,0xe6,0x5d,0x39,0x95,0xd7,0xc7,0x34,0x29,0xcb,0xf3,0xe6,0xfc,0x0c,0xf2,0xd6,0xd8,0x3f,0x2b,0x1e,0x15,0xf4,0x0c,0x51,0x05,0x2b,0x26,0xd3,0x08,0x28,0x07,0xf5,0xff,0x24,0x42,0x0a,0xb4,0x1e,0xab,0x2a,0x18,0x53,0x94,0xd3,0xf6,0xfa,0x59,0x47,0xbb,0xd7,0xd5,0xbb,0x53,0xfd,0xf3,0xd7,0xf8,0xe0,0x09,0x37,0x03,0xc4,0x41,0x5b,0xc4,0xdf,0xef,0xbf,0x35,0xbf,0x29,0xb8,0xec,0xac,0xf9,0x9c,0xc6,0x29,0xf4,0xb1,0xd4,0x14,0x79,0x56,0xdf,0xf2,0x2e,0xfe,0x6c,0xc2,0xdc,0xc7,0x2e,0x08,0xca,0xbf,0x02,0xc3,0x2f,0xdf,0x1f,0xf1,0xa6,0xfb,0xf7,0x25,0x04,0x72,0xe5,0x00,0x1c,0xe0,0x32,0xd1,0x6b,0xe4,0xb7,0xbe,0x06,0x52,0xc4,0x5a,0x4c,0x15,0x15,0xd5,0xe0,0x35,0x8c,0x30,0xcd,0xc5,0xfb,0xdb,0xd0,0x2e,0xc6,0x23,0x32,0x06,0xd5,0xbc,0xad,0x13,0xc6,0x41,0x29,0xe2,0x29,0xe3,0x25,0x00,0x24,0x01,0x3a,0xe9,0xdf,0xd8,0x16,0x37,0xcf,0xff,0x03,0xe9,0x06,0x20,0xe2,0x3c,0xd1,0xcc,0x26,0xe8,0xc2,0xd6,0x0d,0x35,0x08,0xae,0x13,0x47,0x1b,0xe6,0x46,0x49,0x34,0x36,0x9a,0xf9,0x56,0xdb,0xc1,0x36,0x3a,0xd6,0xcd,0xca,0xad,0xb7,0xa3,0x2c,0xa3,0xe2,0x0a,0xe8,0xf4,0x38,0x47,0xca,0xf7,0x0e,0xb1,0x15,0x2a,0xe8,0xe5,0x65,0x3a,0x01,0x54,0x4a,0x2d,0xfc,0x33,0x23,0x07,0x81,0xc3,0xa2,0xda,0x05,0x08,0x02,0x57,0x0d,0xe4,0xd4,0xc8,0xce,0x2b,0xc2,0x38,0x04,0xd4,0xdf,0xbb,0x07,0x0b,0xce,0xb6,0xf5,0x01,0xd6,0x4a,0x01,0x41,0x4b,0xd3,0xf4,0x3d,0x3f,0x0d,0x1c,0xeb,0xe6,0x68,0x07,0x04,0x19,0x9b,0xbb,0xfb,0xfc,0xd0,0x03,0x01,0xbd,0xf3,0xa3,0xcf,0xc5,0x2c,0x15,0xf3,0x6c,0x34,0xfa,0xed,0x17,0x0f,0x1b,0xe7,0xe1,0x11,0x34,0xad,0xfd,0x90,0x00,0x12,0x50,0x06,0xf0,0xa3,0x12,0xbf,0xbe,0x00,0x20,0x49,0xed,0xe7,0xde,0x07,0xd0,0x12,0x1b,0xba,0xab,0x26,0x34,0xaa,0x27,0xb2,0x37,0x02,0xf8,0x07,0x07,0xf3,0x02,0xf8,0xd5,0x27,0xdb,0x2b,0xc8,0x2a,0xd4,0x36,0x0d,0xd6,0xe5,0x37,0xec,0x6b,0x2a,0x0f,0xb4,0x58,0xdc,0xc7,0x30,0xea,0xc5,0x06,0xcb,0x22,0x16,0xd2,0xf7,0x14,0xff,0xe5,0x3b,0x01,0xee,0x2e,0xcf,0x06,0xcd,0x7f,0x11,0xf8,0xc6,0x04,0x3e,0xd8,0x22,0xd0,0x02,0xe1,0xa0,0xcf,0x2f,0xbb,0x3f,0x2c,0xe8,0x34,0x17,0xbc,0x21,0xf6,0xc7,0x49,0xf2,0x0d,0xb5,0xed,0xbb,0xce,0x00,0xbf,0xb1,0xfb,0xc5,0x53,0x06,0x13,0xb2,0xfb,0x06,0xd7,0xee,0x5a,0x0f,0xeb,0xa8,0xe7,0xfd,0x0f,0x16,0xf1,0xe1,0x37,0x9f,0x38,0xed,0xf0,0xd3,0x24,0x2f,0xaa,0xef,0xf8,0x01,0xfe,0x47,0xfb,0x27,0x0a,0xdf,0xa2,0xf7,0xd2,0x20,0xac,0x2e,0x0e,0xea,0xc7,0xfb,0xcf,0x43,0xed,0x93,0xc5,0x00,0x22,0x2d,0x57,0x61,0x02,0xfc,0xda,0x23,0xec,0xf1,0x13,0x44,0xef,0x2b,0xeb,0x12,0x73,0xcd,0xe4,0x00,0xe9,0x5d,0xe6,0xcb,0xc5,0xd6,0xec,0xe4,0x20,0xec,0xb0,0x52,0xb4,0xb7,0xd1,0xd1,0xc8,0xb7,0x14,0xd9,0xba,0xfe,0xbc,0x14,0x1c,0xe1,0xa5,0xf1,0xb1,0xe0,0xd8,0xe7,0xbe,0xfc,0xf2,0xcf,0x09,0x27,0xdd,0x02,0xe4,0x12,0x4d,0xcd,0x21,0x12,0xac,0xe8,0x06,0xee,0xce,0x46,0xdc,0xde,0x0f,0xf4,0xf2,0xf1,0xba,0xd1,0xe6,0x36,0xda,0x3c,0xfb,0xdb,0xc9,0x00,0xdd,0xfe,0xc3,0xe7,0xa6,0xc5,0xba,0x22,0xee,0xe3,0xa6,0x43,0x00,0xdd,0xd8,0xe4,0x24,0x13,0xfc,0x0d,0x09,0xde,0xcd,0xca,0xfe,0xff,0x07,0xe7,0xd6,0xaa,0x06,0xdd,0xd9,0x34,0xcc,0x1a,0x45,0xd9,0xe9,0xec,0xef,0xfb,0xdd,0xee,0xf6,0x1d,0x08,0xfc,0xdd,0xd4,0x25,0xaa,0x0c,0xee,0x03,0xaf,0x02,0x52,0xcf,0x01,0xb8,0xed,0xb6,0x17,0x4a,0x1e,0x25,0x13,0xba,0xc9,0xfa,0xec,0x0c,0x16,0xcf,0xcc,0xe4,0x02,0xf8,0xf0,0x45,0xea,0x04,0xee,0xeb,0x09,0x3b,0x35,0xc5,0x06,0xc0,0x0b,0xd1,0xd2,0xf7,0x28,0x10,0x14,0x2c,0xe6,0x19,0xd1,0xf6,0xec,0x17,0xd3,0xda,0x44,0x47,0x00,0xdc,0x15,0x0e,0xf5,0xdd,0xdd,0xed,0x55,0xa2,0x06,0xf5,0xff,0x07,0x3f,0xc8,0xbb,0xf7,0xe9,0xe9,0xcd,0xba,0x04,0xd7,0x00,0x25,0x15,0x23,0x77,0x06,0xbd,0x50,0xc3,0xd9,0xcf,0x30,0xe2,0xaf,0xc0,0x2b,0xbd,0x17,0x05,0xe9,0x51,0xfe,0x08,0x26,0x25,0xdf,0xe7,0xfc,0xb6,0x02,0xd8,0x0c,0xd3,0xe1,0xf5,0x20,0xd7,0x40,0x11,0x02,0x14,0xe9,0xe2,0xbe,0xe6,0x1e,0x14,0xdc,0xfa,0x03,0x27,0xcb,0xf9,0x21,0x08,0x17,0x1b,0x04,0x26,0xf4,0xf1,0xd6,0xc2,0xca,0xfa,0xfe,0x2d,0xf7,0xdd,0xd9,0xe4,0x3a,0x00,0x35,0x0f,0xfc,0xf4,0x18,0x08,0xdf,0x1d,0x10,0x48,0xb3,0xdf,0x1e,0x0d,0x00,0x19,0xb3,0x3f,0x7f,0x1f,0xc2,0x1c,0xc9,0xd4,0x36,0xf1,0xd1,0xeb,0x03,0xe6,0x18,0x18,0xe7,0xe2,0xe6,0xf8,0xdd,0x0a,0x23,0xf0,0xc5,0x1c,0xf0,0x10,0xcd,0xf0,0x9f,0xc2,0xd8,0x1d,0xe4,0x20,0xfa,0x1f,0xf2,0xcc,0x0a,0xc7,0x00,0xf5,0x07,0x19,0x1a,0x64,0xdb,0xe7,0xf3,0xc1,0x14,0xe5,0xd3,0xe7,0x17,0xf4,0xbb,0x17,0xcd,0x2d,0x1d,0x27,0xb0,0x16,0xe3,0xf7,0xe2,0xfa,0x42,0x20,0x24,0xe6,0xdb,0xd9,0x12,0x0d,0xee,0xe6,0xff,0x28,0x07,0x44,0xfc,0xd5,0xff,0x05,0xe5,0xd4,0xfb,0xc1,0xd3,0xf8,0x2c,0x0a,0x22,0x0e,0xe5,0x1d,0x09,0x25,0xf7,0x20,0x26,0x2f,0x24,0xda,0x1e,0xff,0xb1,0x10,0x47,0x46,0xe1,0x25,0xd3,0xf6,0xfe,0x2c,0xc8,0x45,0x20,0xd1,0x13,0xdf,0xf9,0x04,0xd2,0x2a,0xfb,0xf1,0x15,0xf4,0xd5,0xdb,0x08,0x03,0xff,0x1a,0x1a,0x0c,0xf7,0xd5,0xf6,0xfd,0xe1,0xaa,0xfc,0x45,0x4a,0x14,0xea,0xfc,0x07,0xf2,0x28,0xfa,0x24,0x1e,0xc3,0xda,0x3d,0xf6,0x01,0xfd,0x1f,0x04,0xe3,0x2a,0xda,0xfc,0xfb,0xdd,0xe1,0xf6,0xda,0xe5,0x14,0xf8,0xf1,0x2e,0x08,0x1f,0xfc,0xf8,0xff,0xe5,0xf5,0x35,0xf2,0x16,0xf4,0xfb,0xe3,0xf9,0xfb,0xf8,0xf9,0xe3,0xdc,0xfc,0xf6,0x13,0x11,0x11,0x7f,0xfc,0x16,0xee,0xe8,0x21,0x06,0x4c,0xec,0x10,0xf8,0xff,0xfd,0xff,0x27,0xb0,0x17,0x5d,0xdd,0xe5,0xc0,0xf1,0xed,0x38,0xd8,0x04,0xf7,0x03,0xd6,0x09,0xe9,0x0d,0x41,0xea,0x01,0xea,0xf4,0x21,0x26,0xe2,0x1a,0x00,0x05,0xf3,0xe3,0xc2,0x0c,0xef,0x0c,0xf6,0xd3,0xce,0x06,0x08,0x0b,0xd2,0x01,0xf1,0xf5,0xfe,0x38,0x06,0x2d,0x16,0x0c,0xf9,0x05,0xd4,0x08,0xc8,0x24,0xe1,0x2a,0xdd,0x0c,0x23,0x1c,0x38,0x04,0xce,0x0e,0x11,0x16,0xf1,0xf3,0xd7,0xdf,0x0e,0xb8,0xd9,0xdb,0x2d,0x1e,0x07,0xdf,0x06,0xf8,0xf7,0x8a,0xbe,0xe2,0xf6,0xfd,0x09,0xf2,0x01,0xc0,0xee,0xc7,0x1b,0xf3,0x03,0xfa,0x97,0xbc,0xd7,0xe4,0xb7,0x0a,0x0f,0xd4,0xc2,0x45,0x01,0x07,0x11,0xd5,0x03,0xde,0xfa,0xdd,0xe2,0xd6,0xae,0x41,0xc1,0x22,0x0e,0x2b,0x81,0xa2,0xf9,0xfa,0xed,0x3a,0xce,0xe7,0x21,0x01,0xf6,0x17,0xec,0x17,0x5e,0xb2,0x0e,0xe7,0x33,0xf7,0xec,0x05,0x27,0x08,0x0d,0x0e,0xf6,0xdb,0x82,0x00,0xd4,0xe3,0xed,0xf5,0xe8,0x01,0xba,0xe6,0xe2,0xed,0x17,0x3e,0x1a,0xc9,0x46,0xe6,0xf1,0x07,0xe9,0x04,0x05,0x20,0xf7,0x3a,0xf0,0xad,0xd4,0xfe,0x39,0xd7,0xf1,0xdc,0x60,0xd8,0xe4,0xdf,0x3e,0x01,0xbc,0xfa,0x3f,0xba,0x58,0x0b,0x42,0x42,0xe6,0x06,0x0d,0xf6,0x08,0x0b,0xd3,0x25,0xbe,0x1d,0x3e,0xcc,0xcd,0xc2,0xfe,0xfd,0xeb,0xf4,0xff,0xf7,0xd6,0xf1,0xf6,0xc5,0x08,0x39,0xb5,0x04,0xae,0xff,0x59,0x32,0x31,0xc6,0xc1,0xd2,0xd6,0xa2,0xa3,0xf7,0x17,0xde,0x1e,0x51,0xca,0x99,0xa1,0xd7,0x2b,0x1e,0x14,0xba,0xf5,0x08,0xca,0x1a,0x0e,0x36,0x07,0x11,0xa4,0x07,0xb8,0xd5,0x27,0x3a,0x9e,0xfa,0xd4,0x0e,0xec,0xf6,0x01,0x23,0x02,0xf6,0x2f,0xe5,0x3a,0xbd,0x26,0xf5,0xd9,0x2e,0xdc,0xc8,0xe6,0xd0,0xc4,0x07,0xfe,0x14,0xc2,0xeb,0x1b,0xbf,0xc1,0xc5,0x4f,0x27,0xeb,0xcb,0xed,0xfb,0x35,0x11,0x07,0x4d,0xbc,0x38,0x14,0x2b,0x1e,0xff,0xfe,0xdf,0xb2,0xfb,0xf9,0x1d,0xed,0xe8,0xec,0x0d,0x10,0xfe,0xe0,0x29,0xe5,0xe1,0x1d,0x8c,0x20,0x41,0xe8,0xdd,0xd5,0xed,0x0f,0xd9,0x62,0xd9,0x5e,0x63,0x8b,0x0c,0x08,0x04,0xf1,0x31,0xbd,0x2e,0xf0,0x95,0x3e,0xe6,0xfd,0x04,0x21,0xe9,0x0e,0x30,0xe1,0x0f,0x47,0x43,0xed,0xbc,0xd4,0x95,0x99,0x81,0x78,0x1f,0x04,0x08,0xc6,0x0e,0x09,0xe2,0x31,0xec,0x1a,0xc9,0x2c,0xf9,0x17,0x2f,0xd8,0xd9,0xa0,0xff,0x32,0x00,0x26,0xf5,0xce,0x25,0xe3,0xe5,0xbd,0x0d,0x74,0xaf,0xb5,0xfd,0x67,0xc7,0xc8,0x4c,0xa4,0xfa,0xf6,0xd2,0x03,0xf0,0xc5,0xf2,0x2d,0x2a,0xb3,0xd4,0x26,0xcd,0x21,0x32,0xe0,0xfc,0xb7,0x96,0x13,0xfb,0x1f,0xdf,0xb2,0xd4,0x0c,0xf6,0x33,0x26,0xf7,0xd7,0xf0,0x02,0xc2,0x52,0x90,0xe5,0x16,0xc0,0x0e,0x09,0x5f,0x1b,0x38,0x2b,0xd9,0xba,0xe4,0xdc,0xcb,0x26,0xdc,0xfb,0xdb,0xef,0x27,0xce,0x01,0xaf,0xbd,0x05,0xf6,0xd9,0xcf,0xea,0x14,0xe6,0xf9,0x48,0xc2,0x40,0xff,0xf8,0xc0,0x24,0x51,0xda,0x23,0xc6,0xe5,0xe9,0xdc,0x07,0xa0,0xdf,0xa0,0x13,0xca,0x23,0x5b,0xcb,0xf5,0x0a,0x04,0x45,0xbe,0x29,0xf5,0x21,0xb8,0x20,0x21,0xfc,0x14,0x2b,0xf7,0xee,0x1c,0xe6,0x06,0x2e,0x29,0x07,0xf4,0xf3,0xd1,0xe0,0x21,0x28,0xea,0xe9,0x1d,0xd3,0xc0,0xed,0xe1,0x99,0x42,0x2a,0x23,0x92,0x2e,0xe1,0x04,0xef,0xec,0x9e,0x1b,0xd7,0xb8,0x10,0xe6,0xed,0x09,0xdd,0xe5,0x16,0xf4,0x10,0xf5,0xd2,0x2b,0x21,0xae,0xf2,0x42,0x2a,0x41,0x42,0xfb,0xfb,0x0a,0xff,0xbe,0xfc,0x1f,0x29,0xdb,0x4e,0x1d,0x08,0xed,0x01,0x17,0xa3,0xd3,0xd8,0x0d,0xe8,0xf8,0x78,0xdb,0xff,0x09,0x31,0xe5,0x05,0xec,0x09,0xc7,0xc6,0xeb,0xd1,0x05,0x10,0xef,0x16,0xbb,0xe1,0xc3,0xbe,0x06,0xb4,0xd9,0x02,0xa0,0xe5,0xfe,0x05,0x0e,0xc7,0xcc,0x41,0x29,0x25,0xfe,0xf1,0x24,0xe7,0xa9,0x44,0x00,0x12,0x00,0xb7,0x25,0xbf,0x1d,0x0f,0x10,0x4d,0x8d,0xe8,0xfb,0x0f,0xb0,0x1f,0xfe,0x3a,0xef,0x16,0x11,0xcc,0x03,0xdb,0xfe,0x5b,0xff,0x03,0xb0,0xed,0xba,0xf7,0xc6,0x2e,0x1e,0x1a,0xe4,0x27,0xe3,0xe2,0x0f,0x0c,0xb9,0xa3,0x01,0xd3,0xfb,0x31,0xc9,0xfd,0xcc,0xbe,0xed,0x0f,0xe9,0xe6,0x10,0xd3,0x01,0x00,0x19,0xcb,0xfd,0xac,0xf9,0xdb,0xd0,0x9e,0x3a,0xde,0x12,0xcf,0x0b,0xb2,0x0a,0x15,0xf2,0xfc,0x39,0x19,0xe5,0xf0,0xf9,0xcb,0x4b,0xd5,0x02,0x29,0xce,0xec,0xfc,0x20,0x1f,0x13,0xe8,0xea,0x41,0xdb,0x45,0x4e,0xe2,0xb3,0xf2,0xd4,0xad,0x0a,0xfe,0xe5,0x06,0x1a,0x20,0xce,0xc0,0x49,0xf9,0xfe,0xdc,0xcf,0xca,0x00,0xce,0x40,0x43,0x1f,0xb9,0x30,0xd7,0xce,0xa4,0x0b,0x0a,0x23,0x12,0x03,0x16,0xce,0xdd,0x10,0xb1,0x2f,0xdc,0x06,0xd8,0x1d,0xe4,0x15,0xfd,0xc8,0xe4,0x09,0xff,0x13,0xd3,0x05,0x40,0xe7,0x1c,0x39,0xde,0xe5,0x50,0xf1,0xea,0xfe,0x0f,0xc4,0x35,0x7f,0xc6,0x26,0x25,0xb1,0x01,0xf3,0x20,0xbe,0x44,0xa8,0x1b,0xef,0x0f,0xc1,0x00,0xf0,0x2d,0x02,0xfe,0x3b,0x27,0x03,0x08,0xfa,0x38,0x01,0xd3,0xfa,0xea,0x32,0xfa,0xe3,0x33,0x0a,0x0b,0x59,0x13,0xb3,0x17,0xf6,0x23,0xe8,0x3c,0x1b,0xd6,0xfe,0x1e,0x00,0x05,0xca,0x12,0xdd,0x1e,0xe0,0xfd,0xc8,0x12,0xde,0xc5,0x09,0xb3,0xfc,0xc4,0x24,0xbe,0xc0,0xfd,0xed,0x13,0xec,0x0f,0xa3,0xbb,0xe6,0xeb,0xd0,0xf1,0xe8,0x26,0x99,0x01,0xca,0xd7,0xe6,0xc8,0xc4,0xce,0x3b,0xee,0xf8,0x1b,0x9a,0x26,0xb1,0x1a,0xf5,0xe5,0x3e,0x28,0xe8,0x10,0xf0,0x2a,0xe0,0xfa,0x3e,0x2a,0xd7,0xde,0x1d,0x1b,0x26,0x0b,0xcc,0x4c,0xef,0x0c,0xe6,0xc1,0xdf,0x06,0xf6,0x87,0xbe,0xd3,0xc3,0x28,0x2f,0x06,0xb9,0x5a,0xff,0xa4,0xe3,0x06,0x2d,0x0f,0x20,0x9e,0xb0,0xbe,0x1e,0x20,0xdb,0xd3,0xda,0x86,0xd4,0xe8,0xed,0x17,0xef,0xc9,0xda,0xbc,0xbe,0x06,0xb1,0x24,0xf1,0x21,0x01,0xf3,0xf0,0x1c,0x06,0x19,0x18,0xef,0xfc,0x9e,0x0a,0xd0,0xdc,0x78,0x00,0xfb,0xe4,0x05,0xbc,0x4a,0x2c,0xff,0x81,0xf2,0x32,0x19,0x05,0xa6,0x33,0xf6,0xda,0xbe,0xfd,0xe8,0xdd,0x01,0x0f,0xcb,0xdc,0x48,0x52,0x09,0x7f,0xf6,0xa2,0x02,0xf7,0x23,0x03,0x4b,0xf0,0x44,0x27,0xaa,0x01,0xfb,0xf5,0xec,0xfa,0xea,0xd6,0xb1,0xc4,0xde,0xe0,0x15,0xf7,0x0b,0x05,0xf0,0xd7,0x09,0xef,0xd1,0x03,0xf5,0x26,0xd6,0x18,0xf1,0xec,0xd7,0xea,0xed,0xf0,0x18,0x2b,0x07,0xf5,0xe6,0xf3,0x21,0xe8,0x31,0xeb,0xcd,0xc8,0xe7,0x17,0x2b,0xff,0xd1,0xed,0xd5,0xc2,0x19,0xe8,0xff,0xc2,0x24,0xf6,0x2f,0xf9,0xcb,0x78,0x01,0xdd,0xdc,0xec,0x10,0x07,0xec,0x0f,0x3f,0xfd,0x19,0xd3,0xc7,0xf3,0xad,0xae,0x3c,0xb8,0x0a,0xe5,0xf7,0xf2,0x03,0x08,0x00,0xc9,0x04,0x4d,0x29,0xe2,0x27,0x0d,0x08,0xd4,0xf6,0x10,0xc5,0xf8,0xa3,0xcf,0x9d,0x46,0x0a,0x25,0x0a,0xd2,0xec,0xd0,0x18,0x13,0xf5,0xb7,0x0b,0xfd,0x2a,0x00,0x37,0x30,0xc0,0xf6,0x12,0xf3,0xb1,0x2c,0x14,0x09,0x30,0xd9,0xd9,0xc4,0xf5,0x01,0xc1,0x2e,0x2e,0x04,0xc6,0xf0,0xab,0xda,0xce,0xd8,0x1e,0xea,0x3c,0x1a,0xd5,0xe0,0x01,0xc1,0x1f,0xe8,0x04,0x12,0xe8,0x10,0xc6,0x03,0xe1,0xda,0xb6,0xe8,0xcb,0x8e,0x43,0xfb,0xf3,0x36,0xd5,0xd0,0x53,0xeb,0xfa,0xee,0xd3,0x39,0xd5,0xf7,0xa6,0xba,0x37,0xd6,0x10,0x06,0xbe,0xbb,0xc8,0xb4,0x15,0x02,0xe4,0x1c,0xe7,0xd9,0x01,0x2a,0x0c,0x16,0x1c,0x01,0x11,0xca,0xd6,0xf8,0x4a,0xc1,0xf5,0x04,0x09,0xc3,0xf0,0x14,0xca,0xda,0xf7,0xf6,0x17,0xfd,0xde,0x33,0x39,0xd8,0x98,0x0a,0xe9,0x2f,0xf6,0xe0,0x13,0xd0,0xfb,0x01,0xff,0xd9,0xea,0xe6,0xf9,0x05,0x37,0xf5,0x4c,0x06,0xf7,0x22,0x06,0xd9,0x22,0x18,0x46,0xfb,0xe5,0xfb,0xde,0xfc,0xc2,0xee,0x11,0xec,0xce,0x0b,0x2a,0x09,0x08,0x3b,0xd1,0xe7,0x1f,0x09,0xe2,0xfd,0x0a,0x15,0xc7,0xff,0xca,0x17,0xab,0xde,0xdb,0xfb,0xf6,0x29,0xd7,0x21,0xea,0xc2,0x08,0x0f,0xed,0x1b,0xf1,0x0b,0xfa,0x07,0xde,0xfc,0xe1,0x2c,0x35,0xf1,0xe2,0xc9,0xf6,0xd7,0x1d,0xad,0xea,0x48,0xfe,0xe1,0x05,0x14,0xf1,0x0e,0x1c,0x0e,0xb0,0x3b,0xf3,0x2a,0x03,0xef,0x22,0x3e,0x0c,0xdf,0xba,0x32,0xca,0xfe,0xdf,0x21,0x3d,0x3e,0x04,0x09,0x43,0xf0,0x3b,0xc6,0x4c,0x81,0x28,0xfe,0x09,0x3e,0x1e,0xe6,0x21,0xb3,0x2b,0xac,0x1a,0x09,0xe3,0x09,0xe5,0xf7,0xd8,0xfb,0xe4,0xd3,0xde,0x15,0x09,0xe5,0xb5,0xc8,0xe8,0x20,0xb2,0xe4,0xf6,0xeb,0x23,0xff,0xd4,0xcb,0xdc,0xeb,0x1b,0x8f,0xf8,0xf2,0x29,0x41,0x06,0xc8,0xe5,0xcc,0xff,0x07,0xf9,0x33,0xbe,0xce,0xf2,0x09,0x9a,0xd7,0x08,0x2a,0x40,0x1c,0xef,0x0c,0xc8,0xf3,0xdb,0xe9,0x2a,0xd4,0x1b,0xb1,0xd2,0x3b,0x33,0xea,0xfd,0xf5,0x0c,0xd5,0xe2,0x1c,0x04,0xef,0xde,0x0c,0xf5,0xad,0x1f,0xb0,0xf9,0xfc,0xe4,0xcf,0x0e,0xaf,0xe4,0xe3,0x16,0xbe,0xe7,0xf1,0xf8,0xc8,0x1f,0xd8,0xe9,0xbd,0xb4,0xb9,0xe3,0xbe,0x17,0x17,0x28,0xef,0x03,0xd9,0xc5,0xf6,0xf0,0xff,0x1b,0xf2,0xc3,0xcc,0xd8,0xe6,0x19,0xaa,0x06,0xf0,0x16,0xce,0x0f,0xd8,0x18,0xe9,0x13,0xfa,0xf9,0xb2,0xb0,0x24,0x05,0xe5,0xcd,0x2d,0xee,0xd1,0x13,0x0d,0xe8,0xd2,0xee,0xdf,0xf6,0x65,0xf9,0xc5,0xa1,0xe8,0xce,0xdd,0xec,0xdd,0x1b,0x15,0x9b,0x03,0xcf,0x33,0xce,0x1e,0xe2,0x00,0xe6,0x03,0xe0,0xe5,0x18,0x1d,0x01,0x09,0xe4,0xdb,0xeb,0x2c,0x2b,0xca,0xc1,0xe1,0xdb,0x01,0xfa,0xde,0xc8,0xe5,0x06,0xd7,0xda,0xd7,0x1e,0xce,0x37,0x03,0x13,0xe3,0xe6,0x81,0xe8,0x01,0x19,0xdb,0x0f,0xe8,0xfe,0xe5,0xe6,0xd6,0x07,0x85,0xf8,0x0c,0x1f,0xd7,0x25,0x0b,0xdd,0x37,0xd3,0x17,0x56,0xd3,0x03,0x0a,0x03,0xe8,0x13,0xbb,0xff,0xdc,0x14,0x0e,0xe5,0xae,0x41,0x16,0x6c,0x09,0xc6,0xf8,0xf8,0x0d,0xd8,0xba,0xdd,0xf7,0xfd,0x18,0x44,0x8c,0x3d,0xe3,0x31,0xd7,0x1a,0xef,0x4e,0x42,0xc5,0x1e,0xcd,0xe0,0xfa,0x03,0x2d,0x4b,0x0b,0xfe,0x2f,0xea,0x03,0xfa,0x0d,0xe9,0x1c,0xe6,0x0b,0x19,0xe2,0xf1,0x15,0xe2,0x00,0x33,0xba,0x33,0xc4,0xd5,0xc2,0x1b,0xd2,0xee,0xed,0x1e,0x13,0xf9,0xf1,0xed,0xee,0x05,0x13,0x10,0x15,0x5f,0xcd,0xe0,0xdb,0xd4,0x28,0xf9,0x1e,0xcc,0xea,0x23,0x17,0xcc,0x1f,0xd7,0x2e,0xa8,0x46,0xec,0xd0,0xda,0x12,0xe2,0xf1,0x09,0x2f,0xe6,0x2f,0xd9,0xc4,0xf0,0xd8,0x11,0xbc,0x0f,0xf5,0x34,0x1d,0x96,0x10,0x01,0xc4,0xe9,0x38,0xe1,0x2c,0xf8,0xcc,0x0b,0x33,0xc6,0xe5,0xf1,0x23,0x2f,0x06,0xdf,0xb1,0xb8,0x13,0x09,0x11,0xce,0xc9,0x4b,0x18,0xce,0x35,0xfc,0x3a,0x12,0xc3,0x0d,0x53,0xc8,0x0c,0xd2,0x2d,0xfd,0xa1,0xc3,0xed,0x35,0x14,0x0a,0xfe,0xf3,0xdc,0xb8,0xcc,0x1d,0x01,0x0e,0x3a,0xe5,0xd1,0x12,0x81,0xdf,0x09,0xbd,0x0c,0xf0,0x19,0x06,0xe2,0x11,0xad,0x07,0xf1,0x0e,0xc3,0x2b,0x15,0x1a,0x31,0xf1,0x13,0xec,0x10,0x07,0xde,0x25,0x1e,0x1a,0xe5,0xd2,0x25,0xf4,0x04,0x26,0x20,0x19,0xff,0x1a,0x35,0x26,0xeb,0x00,0x00,0x49,0xca,0xee,0xd0,0xf0,0xde,0x27,0x12,0x0b,0x0b,0xf7,0x12,0x13,0x05,0xf3,0x03,0x05,0x3d,0x12,0xfe,0xff,0xd4,0xfa,0xf1,0x3f,0xfb,0x17,0x2e,0x12,0xfb,0x1a,0xe7,0x41,0xc9,0x01,0xe1,0xb8,0x1d,0x29,0x37,0xdd,0xe9,0xda,0xa9,0x38,0xbf,0xef,0xdb,0xe7,0xcd,0xe5,0x21,0x1d,0xc5,0x08,0x33,0xc3,0xed,0x19,0x0c,0x09,0xf4,0xcb,0xef,0xf2,0x2c,0x11,0xfc,0xe0,0x36,0xdf,0x29,0x3f,0xe5,0x3b,0xc7,0xb6,0xc8,0xf9,0x1c,0xd5,0xfe,0xed,0xdb,0xdb,0xa4,0xe1,0xea,0x0b,0xf8,0x1a,0x4e,0x19,0xc7,0xec,0x4e,0xa6,0x8f,0xe1,0xf8,0xff,0xe0,0xe2,0xd6,0xdb,0x04,0x2e,0x42,0x15,0x16,0xe0,0xc3,0xf3,0x08,0xd0,0xfe,0x11,0x20,0x52,0xe5,0x1e,0xe4,0xd0,0xf8,0xf2,0x17,0xc6,0x35,0xaf,0xcf,0x1b,0xfa,0xc7,0xc7,0xff,0x13,0x00,0x2a,0x4a,0xd0,0x3a,0xd7,0x38,0xd0,0xc4,0x65,0xd6,0x17,0x2c,0xe2,0xfd,0xfd,0xf4,0x3b,0xe0,0xf2,0xba,0x04,0xe5,0x21,0xad,0x4f,0x03,0xf5,0x1f,0xa6,0xb8,0xe6,0xd0,0x37,0xf5,0xe4,0xd0,0xf5,0xfe,0x03,0x11,0x4c,0xea,0xf5,0x1c,0xc0,0xd2,0xd9,0x1c,0x13,0xd2,0xf3,0x05,0x12,0xfa,0x18,0xd7,0xcd,0xbf,0xda,0xc6,0xb4,0x1d,0xfe,0x37,0x12,0x8f,0xbc,0x5b,0xe7,0xc8,0x20,0xfc,0xcf,0xfb,0xfe,0x32,0x1d,0x5e,0x15,0xea,0xbe,0xc8,0xd3,0x81,0xc4,0x04,0xea,0xdd,0xca,0x32,0x1d,0x37,0xb8,0x00,0x25,0xe3,0x0d,0xf5,0x3b,0x16,0x04,0x0a,0x06,0x28,0xb1,0x07,0x18,0xcd,0x4c,0xf2,0xf6,0x07,0xc4,0x19,0x22,0xe0,0x28,0xd2,0x2d,0xf4,0x1a,0x0c,0xf4,0x44,0x04,0x2b,0x42,0x03,0x15,0xb2,0x96,0x27,0x17,0x0b,0x21,0xe8,0xab,0x41,0xd9,0x15,0xd4,0xdf,0xf9,0x30,0x10,0xb7,0xe0,0xe0,0x09,0x35,0x00,0x19,0xf7,0xb7,0xcb,0x05,0x1b,0x0e,0xf2,0xd0,0xde,0x2f,0x0e,0x19,0xd1,0x17,0x1d,0xe0,0xeb,0xf6,0xc0,0x6a,0x10,0xf8,0xd2,0x02,0x04,0xdb,0xe0,0x07,0x37,0xe7,0x1d,0x02,0x07,0xec,0xcf,0xe7,0xf5,0xef,0xbc,0xf4,0x3f,0xa6,0x12,0xff,0x1b,0x08,0xb5,0xf5,0xd3,0xbe,0xf6,0xda,0xd5,0xda,0x01,0xef,0xcf,0x1a,0x3e,0xe6,0xb7,0xdc,0xfe,0xdf,0xd4,0xee,0x16,0x21,0xcb,0x19,0x27,0x27,0xe0,0xf1,0x06,0x2c,0x20,0xcc,0x9d,0xb4,0x09,0xf5,0x1e,0xd2,0x09,0x13,0xfa,0xca,0x56,0xe5,0xd6,0xde,0xfe,0x12,0xe5,0x3c,0xe4,0xed,0xfa,0xfb,0x21,0xdc,0x1a,0x06,0xf7,0x3f,0xa3,0xfa,0x62,0xe4,0xed,0x29,0x11,0x35,0x0f,0x78,0xd0,0xf6,0xf2,0x51,0x2e,0xbb,0xa3,0xc6,0x81,0xec,0x13,0x4a,0xcf,0xe7,0x2a,0xfa,0xe6,0x16,0xcb,0xf2,0x95,0x04,0xde,0xd3,0x37,0xcf,0x9b,0x14,0xf1,0xfd,0xfc,0x12,0x16,0x16,0xed,0x22,0xd3,0xd5,0xba,0xd7,0xec,0xe1,0xdf,0x2b,0xd2,0xc2,0x08,0xd7,0xdd,0xab,0xd7,0xe4,0x0a,0xf4,0xc5,0xb2,0x19,0xdf,0xe9,0x24,0xc2,0xc2,0xfd,0xcb,0xbd,0xe7,0xaf,0x8d,0xad,0x19,0x27,0x04,0xe0,0xea,0x2f,0xf4,0xe8,0x40,0x2e,0xde,0x2c,0xcd,0xfa,0x53,0x23,0xdf,0x5f,0xdd,0xe1,0xb5,0xea,0x01,0x1f,0xac,0xff,0xfe,0x27,0xdb,0x1d,0xc3,0x90,0xf1,0xe3,0xaa,0x01,0x04,0xe5,0x07,0xb7,0xbf,0xc4,0xc9,0x11,0xc9,0xb5,0xe0,0x1e,0xdf,0x14,0x03,0x1a,0xcc,0x28,0x02,0xee,0x1b,0x13,0xed,0xef,0x58,0xa8,0x09,0x10,0x15,0xed,0x00,0x66,0x06,0xeb,0xe9,0xe5,0xed,0xfe,0x28,0xd9,0xaa,0xe9,0x99,0x46,0x17,0xd1,0xe6,0x0a,0xdf,0xdc,0xbe,0x32,0xb5,0xfa,0xf6,0xf2,0xd0,0xf7,0xca,0x03,0xe6,0xfc,0x07,0xcf,0xef,0x93,0xe5,0x05,0xf1,0xe1,0xdc,0x10,0x15,0x25,0x18,0x17,0xba,0xb1,0xeb,0x9d,0xdc,0x04,0xbe,0x27,0x2d,0xf2,0x15,0xdb,0x25,0xe6,0xe4,0xe9,0x1e,0x27,0xe9,0xff,0x26,0x39,0xca,0x12,0xa0,0xd3,0xcc,0xfc,0x1c,0x9d,0xc0,0xd0,0xfc,0xe0,0xd2,0x11,0x23,0xf6,0x3b,0xfe,0xfc,0x3a,0x25,0x48,0xd5,0xdf,0xc5,0x29,0x0e,0xfd,0x5b,0xe1,0x09,0x4d,0x19,0x31,0xc9,0xb1,0xfd,0x12,0x32,0xb5,0x00,0xf4,0x43,0x2c,0xfb,0x1b,0xeb,0xd8,0xe8,0x11,0xb6,0x2b,0xff,0xef,0x26,0xcd,0x5c,0xf6,0xe9,0xf0,0xf3,0xfd,0xea,0x00,0xc3,0xce,0x1f,0x44,0xcf,0xe0,0xd2,0x12,0xc1,0x16,0xdd,0xe7,0x9e,0x3a,0x10,0x05,0xfe,0x0d,0x04,0xaf,0xdc,0xc1,0xc5,0xd2,0xdc,0xa0,0xd9,0x00,0x01,0x71,0xe2,0x15,0x1c,0xd3,0x11,0xcb,0x0b,0xd5,0x86,0x14,0xa7,0x0c,0xe3,0x3b,0xb9,0xb5,0xd7,0x34,0xdf,0x37,0xf3,0xf6,0xf2,0xe1,0x38,0x35,0x01,0x00,0xe9,0xad,0xe8,0x07,0x2a,0x96,0x23,0x2e,0xff,0xe0,0xd9,0x26,0xeb,0xe2,0x58,0xcb,0xe7,0x01,0xc8,0x13,0x1f,0xca,0xe5,0xde,0xfc,0x0a,0xe4,0x04,0xd2,0xef,0x20,0xd7,0x03,0x0a,0xff,0x27,0x19,0xf0,0xc6,0x01,0x19,0xfa,0xbb,0xde,0x13,0xf0,0xfd,0x03,0x9c,0x07,0xdd,0xc3,0x27,0xe1,0xb6,0xb4,0xe7,0xde,0xe4,0x81,0x07,0xef,0x12,0xe3,0x19,0x27,0x17,0xca,0xbb,0x08,0xc7,0xd6,0x20,0x99,0xf1,0xe6,0x1f,0xcd,0x03,0x05,0x43,0x17,0xcc,0x08,0xec,0xc3,0x23,0x28,0x15,0x07,0xd7,0x21,0xf2,0xfc,0x02,0xf2,0xc3,0xe7,0x20,0x1c,0xde,0xa1,0x0b,0xcb,0x1c,0xed,0x8b,0xcb,0xd6,0x23,0x18,0xe6,0xfe,0xde,0x2a,0xfd,0xca,0x2b,0x28,0xf4,0xf9,0xd2,0xc1,0xe1,0x14,0xc8,0x17,0x01,0xe4,0xdf,0x28,0x25,0x0c,0xfe,0xf8,0x15,0x39,0xfe,0xd4,0xeb,0x1d,0xf0,0xeb,0x16,0x92,0x45,0xf6,0xbc,0x35,0x0c,0xff,0x29,0x41,0xf4,0xe4,0x46,0x2a,0x0a,0xfe,0xc6,0xe7,0xe6,0xa9,0x0e,0x0a,0x01,0x12,0x4f,0x21,0xe6,0x14,0xab,0x09,0xe0,0xd5,0xba,0xfc,0xf4,0x02,0xf4,0x2b,0x39,0xef,0x1c,0xb6,0xed,0xe6,0x0c,0x03,0xda,0xd4,0xe9,0xf7,0x48,0xf2,0xe5,0x2f,0xc5,0xad,0x31,0xcc,0xfd,0xb3,0xf2,0xc4,0x39,0xee,0x0a,0xfe,0xe9,0x1e,0xec,0x14,0x14,0xe3,0xfb,0x02,0xfc,0xf1,0xf9,0xb5,0xd0,0xc4,0x08,0xe1,0xf4,0x15,0xec,0xc1,0xd8,0x0d,0xff,0x2f,0xf9,0x18,0xc1,0xcc,0x5d,0xa1,0xf2,0x29,0xf7,0xf7,0x30,0xe3,0x21,0xe1,0x11,0x1e,0x89,0xf2,0xfd,0xdc,0x27,0xd1,0x17,0xee,0xcd,0x7d,0x12,0xc2,0x14,0xb5,0xdf,0x1f,0xcd,0x42,0xcc,0x0f,0xd2,0x13,0x63,0x13,0x40,0xef,0x16,0x12,0x04,0x4e,0xc5,0xd4,0x0c,0x14,0x1e,0xda,0xa1,0x48,0xcc,0xfd,0x1a,0xac,0x18,0xe6,0xfc,0x3b,0x31,0x0f,0x7f,0xf8,0xf4,0x87,0x14,0xb8,0xe1,0x14,0xec,0xa9,0x31,0x20,0x45,0x06,0xed,0xf0,0xda,0xe5,0xe4,0xcc,0xdb,0xff,0xe7,0xd3,0x12,0xf6,0xe7,0x06,0x16,0xf2,0xb6,0xdf,0x0b,0x2b,0x15,0xe5,0xca,0x0f,0x1d,0xd2,0x41,0x07,0xea,0xd8,0x16,0x0a,0xaf,0xad,0xee,0x02,0x01,0x04,0x60,0xe9,0x31,0x5d,0x04,0x0e,0xcb,0xc3,0xaa,0x0b,0xda,0xbe,0x16,0x12,0xed,0xf5,0x1d,0xd4,0xd6,0x29,0x21,0xfa,0x99,0x16,0x06,0xaa,0x15,0xd4,0x1c,0x10,0xec,0xe9,0xe7,0x14,0xe9,0xf0,0x34,0xbe,0xf5,0x53,0xf5,0x08,0xe4,0xd2,0xe3,0x1b,0xec,0xf7,0xb4,0xf2,0x0b,0x15,0xcb,0xaf,0xe8,0xc3,0xe1,0x1d,0x24,0xe9,0x23,0xfc,0xce,0xd0,0xd1,0xac,0x20,0x0a,0x09,0xda,0xd3,0xf3,0x25,0x12,0xee,0xd1,0xc6,0x11,0xac,0xf2,0x1c,0xe6,0xec,0xf4,0x1a,0xc0,0xb3,0x08,0x0a,0x2b,0x30,0x63,0xdb,0xfa,0xd3,0x19,0xdd,0xf6,0x58,0xcf,0xe9,0x25,0xee,0xe5,0xcd,0x11,0x08,0xe3,0xdc,0xec,0x43,0xdc,0x04,0xfd,0x11,0xbd,0x16,0xda,0xea,0xf8,0xdc,0xee,0xe9,0xe3,0x42,0xb7,0x32,0xc9,0xc1,0x4b,0xff,0x16,0x1c,0x1d,0x99,0xbd,0x5c,0x30,0xd3,0x0f,0xe4,0x74,0xc7,0x02,0x0f,0xc7,0x2d,0xec,0x2a,0xe2,0x0d,0x1d,0xec,0x0e,0xe8,0xdb,0x22,0xc9,0xb3,0xd1,0xfe,0xe2,0xe9,0x20,0xda,0xd4,0x19,0x21,0xa4,0xf1,0xe1,0x39,0x2f,0x05,0x23,0xe4,0xf4,0x01,0x12,0x00,0xec,0x25,0x1e,0xa8,0xf6,0xf8,0xff,0x0e,0xd5,0xc0,0xcb,0xc1,0x33,0x22,0xc4,0x1f,0x0e,0x05,0xed,0xe1,0x01,0xe0,0x11,0xeb,0x0a,0xe0,0x32,0xd0,0x70,0xaf,0x1b,0xf1,0x07,0x10,0xf6,0x02,0xed,0x3e,0xd6,0xa9,0x11,0xee,0x1e,0xe0,0xd1,0xbc,0xe8,0x01,0xe2,0x1c,0x3e,0xa3,0xd6,0x8a,0x0d,0xdd,0xe1,0x30,0xed,0x04,0x15,0xff,0x24,0xff,0x1b,0x81,0xcd,0xd5,0x19,0xe1,0x14,0x33,0x29,0xdb,0xdc,0x38,0xce,0xf7,0xd6,0xd9,0x23,0xbb,0x01,0xd4,0xfc,0xda,0x48,0xde,0xd8,0x37,0xd4,0x2b,0xcd,0x36,0xe9,0x14,0xf7,0xfc,0xcc,0xe4,0x25,0xe8,0xf3,0x22,0x3b,0x0a,0xc5,0xce,0xfb,0xef,0x1c,0x06,0x19,0x19,0x0d,0xfd,0xe0,0xf4,0xed,0x01,0xef,0x30,0xfe,0xed,0xe5,0xfa,0xe8,0x1b,0x0d,0x2f,0x04,0xcd,0xda,0xca,0xd8,0xed,0x1a,0x1a,0x0f,0x00,0x04,0xef,0x7f,0xff,0xd3,0xf8,0xf4,0x14,0xf0,0x1f,0xec,0xcf,0xff,0xe9,0x03,0xa9,0x17,0x98,0x24,0x46,0xcf,0xed,0x14,0xc9,0x00,0xd0,0xd5,0x36,0xec,0x3d,0xd0,0xff,0xdd,0x0d,0x30,0x01,0xd8,0xd2,0xbe,0xee,0xe6,0x0a,0xe7,0xfb,0x17,0x1a,0xe4,0xe6,0x03,0xb3,0x25,0x10,0x27,0xe3,0x11,0xd1,0xc3,0xc8,0xda,0xe5,0xf0,0x0c,0xf1,0x13,0xb3,0xeb,0xd5,0xce,0xb0,0x18,0x16,0xe5,0xf1,0xfa,0xcf,0xd0,0xd1,0xe4,0xd5,0xeb,0xea,0x14,0x09,0x29,0xbf,0x30,0xd5,0xd7,0x2a,0x1a,0xed,0x1e,0xe7,0x19,0x31,0x2f,0xce,0xbe,0xd9,0xeb,0xf9,0xd1,0x0e,0xe5,0xdf,0xfb,0xc7,0x02,0xea,0xf6,0x29,0x11,0xdd,0x03,0xdf,0x21,0x12,0xf6,0xe9,0xf3,0xfb,0x16,0x2d,0xdd,0xf8,0xdf,0xe8,0xd3,0xfe,0x24,0xd1,0xf7,0xbf,0xe5,0xff,0x1f,0x27,0xe1,0x00,0xff,0xd5,0xb0,0x1b,0x17,0xdc,0xef,0x1f,0xd2,0xf4,0x0c,0xf0,0xaf,0xda,0xf4,0x0e,0x22,0x1f,0x05,0xe5,0x19,0x19,0x22,0x00,0x13,0xde,0x1c,0xe8,0x41,0x17,0xee,0x48,0xe4,0xf3,0xf1,0xad,0x1a,0x1a,0xeb,0x41,0x35,0x14,0x0f,0xd6,0xe6,0xde,0xd2,0x39,0xc9,0xf7,0x0b,0xe4,0xf0,0x00,0xd7,0x09,0xf1,0xff,0xca,0xfa,0xfb,0x19,0x0e,0xf1,0x09,0x24,0xce,0xe4,0x1c,0x10,0xfb,0xf7,0xf0,0xf2,0x2b,0xd7,0xfc,0xe8,0xe4,0x07,0xfe,0xdc,0xe8,0x19,0xef,0xed,0xff,0x0d,0xe1,0xf7,0xd6,0xf9,0xed,0x1b,0x17,0x0d,0xf6,0xeb,0xf5,0x0d,0x0b,0xe1,0x0f,0xf8,0xfc,0xf7,0xf7,0xef,0xdf,0x12,0x1b,0x03,0x06,0xf8,0x03,0xf0,0xe0,0xf2,0xe7,0x3b,0xc8,0x05,0xef,0x0c,0xf8,0x15,0xe0,0x2e,0xe1,0xb6,0xfa,0xf0,0x20,0x08,0xe2,0xe5,0x02,0xe3,0x0a,0x00,0x18,0xd1,0x14,0xe5,0x00,0x17,0x13,0xfa,0x1b,0xee,0x19,0xfd,0xd9,0xf5,0xcc,0x03,0xe6,0x0b,0xe2,0x16,0x1a,0x15,0xea,0x0f,0xdd,0xd3,0xf0,0xf4,0x00,0xc5,0x04,0x0b,0x0e,0xde,0xdc,0x1e,0xe8,0xe9,0x43,0x00,0x11,0x0b,0x25,0xe0,0xfc,0x1f,0xd7,0x7f,0xf7,0x06,0x15,0x0c,0x24,0x41,0xf1,0x1c,0xf1,0xfb,0xe5,0xcc,0xcf,0xf7,0xd7,0xe6,0x05,0xee,0xee,0x2e,0x1b,0x1b,0x0a,0x28,0x20,0x0d,0x06,0xf5,0x0a,0x13,0xed,0x00,0x23,0xc6,0xd9,0xf8,0x1d,0xe1,0x11,0xcc,0xe9,0xe3,0xfe,0x18,0x0a,0xdf,0xfb,0xdc,0x02,0xed,0xe8,0x00,0x19,0x23,0xda,0x14,0x0c,0xe9,0x3e,0xf1,0x1c,0x05,0x1c,0xdd,0xf3,0x19,0x11,0x05,0x02,0x04,0xf0,0x02,0xf7,0xf9,0xf4,0x03,0x00,0xe2,0xf7,0x16,0x07,0x37,0xdd,0x09,0xfe,0x1e,0x27,0xef,0x14,0xfa,0xdf,0xf0,0xd4,0xe5,0x08,0xeb,0x26,0x33,0x36,0xe7,0x18,0xfa,0xfc,0x10,0x13,0x0c,0xf5,0xe5,0xfb,0xfe,0x1b,0xc4,0xe8,0x04,0xd1,0x0e,0x33,0xee,0x15,0x0b,0x12,0xf3,0xe8,0xd1,0x00,0x01,0xe6,0xd8,0xd7,0x01,0xe5,0x13,0xfe,0xf7,0x0f,0xee,0x18,0x06,0x07,0xe8,0xdf,0x12,0x17,0xd3,0xff,0xfe,0xe7,0x15,0x13,0xd1,0xa8,0xd0,0xf2,0x0a,0xce,0xfe,0xfb,0xf9,0xd8,0xcd,0xf2,0xf1,0x25,0x0e,0x1d,0xc9,0xeb,0x2b,0xf9,0xf5,0xf2,0xf7,0x32,0xf9,0x2b,0xef,0x2b,0x04,0xf7,0x21,0x11,0x1e,0xf5,0x3c,0xfc,0xc9,0xb8,0x3b,0x03,0xb9,0xb2,0xec,0xe8,0xe9,0x04,0x18,0xdf,0xde,0xc2,0x26,0x0e,0x0e,0xf7,0xd8,0x40,0x0d,0xf1,0x4e,0xf2,0xe9,0xef,0xf1,0x13,0x1d,0xf9,0xe0,0x1a,0x10,0x18,0x12,0xdd,0x35,0x35,0xf9,0x02,0xde,0xd2,0x2a,0xf9,0xdf,0x01,0xd5,0xf3,0xf5,0x05,0x08,0xe5,0x9e,0x19,0x0a,0x0c,0x44,0xeb,0x32,0xf1,0x06,0x51,0xd6,0xdd,0xea,0xf1,0xd5,0xd8,0xed,0xfe,0x7f,0xd2,0x07,0x03,0xd6,0x14,0x13,0xd7,0x0c,0xdd,0xe0,0xff,0xaf,0x1a,0xfc,0xd5,0xca,0xd0,0xe7,0xf3,0xf6,0xeb,0xea,0x10,0xf0,0xfe,0x10,0xfb,0xe9,0x1a,0xf8,0xde,0x0b,0xf9,0xb3,0xc6,0xf4,0xe8,0x10,0x1c,0xd5,0xee,0xcf,0x09,0x01,0xfc,0xe9,0xf0,0xcd,0x20,0xe5,0x04,0x0c,0x04,0x11,0xec,0xc2,0x10,0x1f,0x17,0xd1,0xd6,0x08,0x22,0xf3,0xf0,0x34,0x1e,0x13,0xfd,0xdd,0x18,0xfb,0x1f,0xe0,0x06,0x0c,0xf3,0x05,0x03,0xf3,0x0e,0x17,0xfe,0xde,0x02,0xea,0x0e,0xf0,0x22,0xdc,0xef,0xc5,0xeb,0xf9,0x0a,0xf1,0x05,0xe9,0x18,0x12,0xf2,0xf7,0xea,0x12,0x2a,0x33,0xe0,0xfd,0xf1,0x08,0x24,0xf7,0xe5,0xde,0xe1,0x11,0x35,0x16,0x16,0x13,0xf9,0x1b,0xda,0xbb,0xfd,0xfe,0xdf,0x0f,0x0a,0x40,0xf8,0xed,0xea,0xbb,0xbe,0xec,0x05,0xd7,0x0f,0x1b,0x24,0xd5,0x2b,0xf2,0x1b,0xe4,0xdc,0x5e,0xeb,0xdb,0x48,0x3e,0x0d,0xad,0x26,0xdc,0xf2,0xc6,0xb5,0x22,0xa5,0xc5,0x2d,0xc9,0xcb,0xe9,0x2e,0x1f,0xba,0x81,0xc7,0xcd,0xbb,0x0c,0xe5,0xd6,0xdd,0xf5,0xe7,0x17,0x05,0x0d,0xf6,0xd8,0xf1,0xc0,0xff,0xfc,0xf2,0xe5,0xeb,0xda,0x03,0x0a,0xfb,0x48,0xf9,0xa7,0xf5,0xe7,0xe8,0x31,0xd6,0xd2,0x2c,0xba,0x4c,0x19,0xb7,0x4d,0x08,0x0e,0x1c,0xce,0xd6,0xa6,0xbe,0xc2,0x07,0xed,0x32,0xd7,0xfc,0xc9,0xa6,0x40,0x1c,0x05,0xdb,0x40,0xd7,0x0a,0x2a,0xaf,0x04,0xf8,0xff,0x22,0x27,0xa1,0xd8,0xeb,0xe4,0xf0,0x04,0xa8,0xb2,0x3d,0xe3,0x12,0xe0,0xb5,0x2c,0x0d,0xe9,0x30,0xb4,0x26,0x1d,0xcc,0x0c,0xf8,0xe2,0x04,0xa9,0xee,0xc3,0xb6,0xe7,0xfa,0x3d,0xb4,0xe7,0xcb,0x35,0x02,0xde,0x34,0x3c,0xea,0xe6,0x0a,0xcc,0xfa,0x00,0x44,0x03,0xf6,0xf2,0xfb,0xec,0xce,0x1a,0x45,0x35,0xc4,0xd4,0x26,0xdf,0xfe,0xeb,0x20,0xe8,0xfb,0xd5,0xc4,0x3a,0xf4,0xfc,0x09,0xe8,0x3d,0xe7,0xd4,0x22,0xc2,0xde,0x16,0xf8,0x38,0xf8,0x1d,0x36,0x31,0x35,0xfc,0xc6,0xfa,0xda,0x0e,0xcf,0xe8,0xe4,0xb9,0xed,0xfa,0x37,0x18,0x05,0xbb,0xd8,0xee,0x14,0x0b,0xe5,0xec,0xcc,0xc9,0xf6,0xd6,0x08,0xfc,0x09,0x2a,0x08,0xfd,0xcd,0xa2,0x13,0x36,0x32,0x31,0xf5,0x0a,0xef,0xfb,0x09,0x17,0x03,0xd8,0x2a,0x05,0xe7,0x2a,0xdd,0xef,0xe8,0xab,0x0d,0xd4,0xcb,0x29,0x0d,0xf9,0xbf,0x85,0xfb,0x2a,0xf8,0x44,0xdb,0xa1,0x24,0xe2,0xfe,0xe0,0x3a,0x09,0xf0,0x08,0xa1,0xf9,0x2c,0x10,0xdc,0xf0,0xec,0xe8,0xf8,0x54,0x01,0x1e,0xb0,0x44,0xf9,0x0a,0x3a,0x29,0xea,0xe3,0xee,0x5f,0x22,0x5b,0xfe,0xdd,0x89,0x0c,0xb2,0xda,0x96,0x99,0xf4,0xec,0x05,0xc8,0xf9,0xdf,0xf8,0xd0,0x0e,0xca,0x9d,0x38,0x0b,0x20,0x35,0xf5,0xf9,0x2b,0xcb,0xef,0x26,0xe3,0xea,0x45,0x23,0xa2,0xb7,0xe1,0x1c,0x1d,0xe1,0xda,0x33,0xc6,0x09,0x1b,0x4c,0xc7,0xd1,0xb7,0xf3,0xa5,0x36,0x5a,0xef,0x05,0xfb,0x9f,0xbf,0x5f,0x17,0x84,0xde,0xf7,0xf3,0x4f,0xc6,0x31,0x25,0x27,0xe3,0x04,0xe3,0x15,0xa5,0xeb,0xbe,0xe7,0x0b,0x3d,0xcc,0xe3,0x18,0xb5,0x21,0x5f,0x09,0xf8,0xd2,0xc6,0xc4,0x29,0x18,0xc2,0x3c,0x32,0x26,0xe6,0x18,0x36,0xf5,0x31,0xcd,0xe0,0x21,0x6b,0xef,0x5c,0xca,0xfd,0xca,0x28,0xc4,0x01,0xf7,0x40,0xe1,0xe7,0xee,0xdd,0x11,0xc6,0x08,0x8d,0xbe,0xb8,0x57,0x3b,0xc2,0xf9,0xe1,0xec,0x3d,0x32,0xa9,0xc1,0x2f,0x3c,0x10,0xc5,0x0b,0x0d,0x0c,0x08,0xbe,0xda,0xf1,0xff,0xcd,0x00,0x44,0x03,0x59,0xae,0x0d,0x18,0xdf,0xf3,0x7f,0xf1,0x02,0x5d,0x05,0xf9,0xea,0xfa,0x91,0x1e,0x0d,0xf9,0xf3,0x33,0x46,0xfc,0xfc,0x5a,0xcc,0x42,0x39,0xe7,0xc3,0xb9,0xec,0xce,0x9a,0x38,0xb5,0xea,0xc2,0xc8,0x24,0x2c,0xcc,0x14,0xac,0xe2,0xc8,0x33,0xb5,0xf2,0xa0,0xee,0xdd,0x2a,0x97,0xef,0x22,0xda,0x5d,0x2d,0x4e,0x07,0xdb,0xc6,0xb9,0xe9,0xa7,0x00,0xf4,0xc4,0xd4,0xb6,0xef,0xdd,0xe8,0xef,0xee,0x9d,0xeb,0xde,0xec,0xc9,0xe7,0xf7,0xcb,0xb8,0xc2,0x0f,0xfc,0xec,0xfa,0xda,0x89,0x05,0x3e,0xc0,0x29,0xf7,0x14,0xe2,0xf1,0xda,0xd3,0xe5,0xdd,0x0a,0xf6,0x16,0x03,0xeb,0xed,0x39,0x34,0xb8,0xe7,0xf2,0x1f,0xb9,0xed,0xb5,0xe4,0x18,0x35,0xf8,0x1b,0xd6,0x20,0x48,0x2f,0x06,0xaa,0xd7,0x1d,0xd8,0x06,0x09,0xca,0xdf,0x1d,0x28,0x07,0x11,0xf5,0x0c,0xf5,0x8a,0xe9,0x19,0xc6,0xcd,0xf6,0xc1,0xe9,0x0a,0xfd,0x38,0xe2,0xde,0x08,0xd1,0xd2,0xe7,0x10,0xfd,0x16,0xdf,0x50,0x81,0x1f,0xd4,0x03,0xbe,0x50,0x12,0xd1,0xe4,0xdd,0xe3,0x1a,0x1a,0xe0,0xd1,0xdb,0xe1,0xbe,0x05,0xf5,0x9c,0x10,0x02,0x0c,0x1a,0xd4,0x27,0xf3,0xd2,0x32,0x88,0x0e,0x23,0x14,0x58,0xfa,0xf8,0xf3,0xe2,0x32,0xe1,0xdd,0xe5,0x00,0xb8,0x24,0xee,0x39,0xab,0xf8,0xd4,0xf4,0x57,0xd8,0xc5,0xf7,0x49,0x2f,0x4a,0xe5,0xf7,0xea,0xfa,0xec,0x39,0x27,0xc6,0xc8,0x1f,0xeb,0xd5,0x53,0xf7,0x60,0xe4,0xe3,0x39,0xbc,0xd1,0xab,0x1f,0x1e,0x0d,0xd7,0x1c,0x51,0xc6,0xc3,0x21,0xc2,0xd0,0x14,0xbd,0xc8,0xb0,0xc4,0x0e,0xeb,0x4b,0x0b,0xf0,0xe7,0xee,0xe9,0x63,0xda,0xe8,0x2a,0xf8,0xd6,0xde,0x19,0x22,0xe0,0xb8,0xfd,0xee,0xd4,0xfb,0xda,0x47,0xc7,0x50,0x14,0xe2,0xd7,0x18,0x05,0xd4,0xfd,0x9f,0x06,0xee,0xf1,0xe1,0xce,0x40,0x2f,0xff,0x0c,0x19,0xf1,0x29,0xbb,0xc6,0xd7,0xee,0xb4,0xe9,0xc1,0xe2,0xfd,0x08,0xb4,0x32,0xdd,0x16,0xe1,0x21,0x97,0xd0,0xf6,0x03,0xe0,0xbc,0xd7,0x96,0x48,0xe0,0xfb,0xd8,0xe4,0xe2,0x06,0xd6,0x11,0xe7,0xd5,0x92,0x32,0xfc,0xef,0xd4,0xe6,0x42,0x19,0xce,0x09,0x16,0xcb,0xae,0x0a,0xe2,0x33,0x0d,0xa2,0x33,0x00,0xe0,0x0e,0xd0,0x4c,0x15,0xe7,0x3f,0xdb,0x1a,0x33,0x38,0xc8,0xfb,0xc1,0xfa,0x04,0x17,0x27,0x3f,0x12,0xb4,0x18,0xf4,0x05,0xe8,0x0b,0x1c,0xa8,0xe7,0xde,0x04,0xb8,0xf0,0x00,0xc5,0x10,0xd7,0xd3,0xb8,0x28,0x37,0xf7,0x2f,0xde,0x05,0xa7,0xe8,0xa9,0x15,0xf2,0x06,0xb7,0xf3,0xc3,0xc1,0x21,0x0e,0x0b,0x2a,0xeb,0x05,0xfe,0x11,0xd0,0xf5,0x00,0xc7,0x30,0xe4,0x15,0x2c,0x00,0x0f,0x95,0xd8,0x1e,0xe8,0x26,0x13,0xd8,0xcf,0xde,0xcc,0x3e,0xcd,0x9d,0x15,0x4d,0x54,0x3f,0xac,0xed,0x3f,0xce,0xb0,0x21,0x47,0xdd,0x31,0x81,0xf0,0x1e,0x07,0xc9,0x29,0x04,0xd3,0x3f,0xff,0xef,0xb1,0x1a,0x05,0xfb,0x32,0xf2,0xfe,0xe2,0x1b,0x08,0xaf,0xb6,0xa9,0xeb,0xba,0x16,0x41,0xbc,0xaf,0xdb,0xdf,0x16,0x1c,0x32,0x2d,0x19,0xd4,0xc4,0x4c,0xb9,0xba,0xdf,0x30,0xc1,0x93,0xce,0x03,0xac,0xdb,0xef,0xff,0xf1,0x4a,0x49,0xca,0xfc,0xeb,0xbd,0x09,0x20,0x2f,0x06,0x3f,0xfd,0x3b,0x1c,0x29,0xf4,0x11,0x16,0x0b,0xd8,0xef,0x32,0x08,0xfa,0x4d,0xe1,0x3a,0xbc,0x50,0xeb,0x38,0x07,0xf2,0x13,0xbb,0xd2,0xac,0x4f,0x5f,0x09,0x26,0xfa,0xee,0xea,0x3c,0xda,0x0f,0x54,0xe7,0x07,0x09,0xed,0xda,0x33,0x20,0x2c,0x33,0xcd,0xf4,0x3f,0xbe,0xf3,0xbe,0xa8,0xc1,0xbb,0x12,0xfe,0x00,0x02,0xc0,0x25,0x0a,0xda,0xa8,0xdc,0x24,0x0a,0xc7,0xef,0xd1,0xf2,0xed,0xc1,0x0d,0xe2,0x8d,0x02,0xeb,0x07,0xf7,0xde,0xf1,0xcd,0x20,0x26,0x1e,0xd2,0xf9,0xa7,0xb7,0xef,0x01,0xce,0xb8,0xaf,0xbc,0xd8,0xf5,0x4d,0xe3,0xd0,0xa3,0xc6,0x1e,0x02,0xd4,0x00,0x10,0xde,0xd5,0xed,0xfe,0xdb,0xd5,0xfa,0x0d,0x23,0x54,0xf9,0xfe,0xd0,0xdb,0xa8,0x1f,0x0a,0xa1,0x04,0xef,0x4e,0x03,0x19,0xf2,0xec,0xbd,0x20,0xbb,0xe6,0xf7,0x1b,0xbe,0xe9,0x14,0xf9,0xdc,0xf2,0xe5,0xf7,0xf1,0xe8,0xb8,0xe9,0xe3,0xee,0xf4,0x28,0x0b,0x9f,0xe3,0xff,0x22,0xd2,0x98,0x81,0x16,0xed,0xf3,0x9f,0x15,0xfd,0x11,0x1a,0xda,0xea,0xb5,0xf2,0x9d,0x08,0x37,0xb9,0x22,0xbc,0x11,0x21,0xee,0x1a,0x2c,0xca,0x01,0xdd,0xfe,0xd8,0xf6,0xa5,0x05,0xc7,0x9b,0xf7,0xe2,0xa9,0xd6,0x11,0xc0,0xf7,0x11,0xfa,0x1e,0xde,0xc9,0x27,0x13,0xf4,0xee,0x1c,0xbd,0x06,0xf5,0xde,0x27,0xbf,0x11,0xcf,0xc7,0x53,0x1c,0x17,0xe1,0xf4,0xfa,0x35,0xce,0xe0,0x06,0xeb,0x27,0xed,0xc1,0xdc,0x18,0xf4,0xa7,0xde,0x12,0xd9,0x09,0xe0,0x28,0xcf,0xdc,0x11,0x12,0x03,0x2f,0x30,0xcf,0xfa,0x11,0xc7,0xe5,0x40,0x07,0xeb,0x37,0xde,0xc0,0x26,0x10,0xca,0x3d,0xe3,0xe8,0xe9,0xf1,0x04,0xe2,0xe9,0x09,0x30,0x20,0x15,0x11,0xc7,0xed,0xe0,0x06,0x1c,0xdf,0x1d,0xea,0xd7,0x18,0x01,0xd8,0x99,0xf3,0x05,0x19,0x0e,0x1b,0x3e,0xbf,0x29,0x6e,0xcc,0x0b,0x2a,0xf6,0xa3,0xee,0x8f,0x18,0xbb,0xfe,0xb0,0xce,0x28,0xbf,0x1e,0x01,0x0e,0xeb,0x24,0xef,0xfb,0xb4,0x11,0x67,0xd6,0xec,0xa1,0x01,0x90,0x41,0x4f,0xc0,0x0a,0x1f,0xab,0xe4,0xf2,0xdc,0xec,0x09,0x12,0x97,0x04,0x22,0xf2,0x2d,0x20,0x15,0x9f,0xc4,0x15,0x2f,0xf5,0x11,0xfe,0x1e,0x05,0x4e,0x08,0x0c,0x19,0x38,0xf1,0xce,0x1c,0x20,0xc2,0xb7,0xd2,0xdc,0xf6,0x13,0xfb,0xaa,0xde,0x24,0x2b,0x04,0xb0,0xc4,0x23,0x9b,0xb3,0xe6,0x8d,0xc3,0xd6,0xd7,0x37,0x2a,0xd2,0x37,0xda,0x81,0xea,0x25,0x2b,0xce,0x08,0x07,0xf0,0x3a,0xe3,0x1e,0xa9,0xe7,0xf1,0xed,0x1a,0xa8,0x21,0xe2,0xe9,0xd4,0xc2,0xd5,0x15,0x45,0xdf,0x38,0xcf,0x3b,0x1f,0xe4,0x24,0x43,0xe4,0x07,0xcc,0xca,0xfe,0xe8,0x10,0x30,0xc0,0xc0,0x31,0x9c,0xf9,0xdf,0xd5,0xd2,0x07,0x2f,0xfc,0xff,0x0e,0xe0,0x06,0x20,0xb3,0x19,0xf9,0x20,0xae,0xe3,0xfa,0xd5,0x0b,0x25,0x2d,0xc6,0xe9,0x06,0x36,0xce,0xf6,0x17,0xf5,0xde,0x25,0xee,0x25,0xd1,0xe4,0xe1,0x33,0xfa,0xeb,0x05,0x55,0xce,0x0c,0xf8,0xb5,0xeb,0x00,0x65,0x0b,0x0b,0x32,0xab,0x02,0xab,0x0f,0xfb,0xd6,0xf3,0xba,0xd8,0xf7,0x25,0xb2,0x46,0x3b,0xff,0xc6,0xbd,0x0b,0x16,0xce,0xf2,0xed,0xb2,0xf4,0xf3,0xf9,0xe8,0xe9,0xb5,0xe1,0x9d,0xff,0xf0,0xed,0xd2,0x18,0xfd,0xeb,0xc7,0xf6,0x3f,0x0c,0xdc,0xe8,0x0d,0x2b,0xd0,0x64,0x15,0x10,0xcf,0x05,0xdc,0xe0,0xcf,0xda,0xdd,0x24,0xd2,0x40,0x07,0xb1,0x41,0x02,0xe4,0xca,0x07,0x23,0x2f,0xbf,0xf0,0xcb,0xc0,0x00,0xba,0xee,0xe2,0xc7,0x14,0xca,0x3f,0xf5,0xba,0xdd,0xf2,0xfc,0x28,0xa4,0x09,0xbc,0xe5,0x2c,0x22,0x57,0x25,0x40,0x20,0xab,0xdf,0x01,0x2d,0x08,0xa4,0xde,0x1a,0x0f,0xe9,0xc3,0x1a,0x41,0xc1,0xe4,0xb9,0xeb,0x0d,0xd7,0xb6,0x04,0x08,0x47,0xed,0x0d,0x32,0x2a,0x25,0xe3,0x10,0xe2,0xb9,0xb3,0xd2,0x0d,0x3a,0x2c,0xe4,0xef,0x39,0x9c,0xcb,0xbe,0xf1,0x23,0x60,0x02,0x4a,0xd1,0xbe,0xd9,0xa9,0x2a,0x1e,0x0f,0xb4,0x02,0x03,0xdf,0xd2,0x23,0xa7,0xcf,0x1e,0x32,0x16,0x09,0xfe,0x1d,0xe6,0x19,0xd7,0xb9,0xd1,0xc4,0x51,0xbc,0x13,0x16,0xf4,0x4e,0xf0,0xcb,0xff,0xeb,0xdd,0x03,0xf4,0x12,0x25,0x40,0xde,0x47,0xf7,0xe1,0xdf,0x45,0xf6,0x26,0xa7,0xeb,0xe6,0xee,0x0a,0xed,0xed,0xfb,0x32,0xc4,0x45,0x33,0xd2,0x26,0xeb,0x1e,0x09,0x2a,0xde,0x3f,0xcc,0x44,0xe5,0x27,0xb6,0x50,0xb2,0x03,0xf4,0x16,0xc7,0xc2,0xdc,0xd3,0x05,0x35,0x14,0x4e,0xd6,0xd5,0x4f,0x0d,0xcd,0x1b,0xfe,0x68,0xe5,0xce,0x0c,0x1b,0xe4,0xea,0xc0,0xfd,0xcb,0x79,0x0a,0x9b,0x40,0xe2,0xfd,0xa4,0xbc,0xc3,0x21,0x51,0x48,0xa2,0x06,0x91,0x00,0xe1,0xfa,0x37,0x09,0xdc,0x3d,0x00,0xcd,0x7f,0xf7,0x43,0x1c,0xe4,0x1c,0xfc,0x4a,0x21,0xb2,0xdb,0x04,0x21,0xcf,0x00,0xa6,0xe4,0x29,0x17,0x2a,0xde,0x22,0x47,0xf1,0x17,0xe5,0x03,0xd3,0xc5,0xce,0xfc,0xd9,0xe8,0xd8,0xf1,0xc2,0x2f,0x08,0x47,0xf3,0xc4,0x04,0xea,0xd3,0xb4,0x33,0xe2,0xee,0xc5,0xe5,0x19,0xf2,0xff,0xc1,0xfb,0xd7,0x1e,0xe7,0xd2,0x03,0xd8,0xd9,0xea,0xb0,0xfa,0x1f,0x43,0xe8,0xe1,0x2e,0x15,0x24,0xe5,0xc4,0x1b,0xd9,0x0d,0x1b,0xe3,0xeb,0x0c,0xcc,0xe1,0x46,0xfc,0xde,0x0e,0x0a,0x0b,0xd2,0x10,0xda,0x0f,0xec,0x0a,0xf9,0xe1,0xdf,0x14,0xea,0x22,0x45,0xf0,0x22,0x15,0xc6,0x04,0xfd,0x0c,0x2e,0x01,0xdc,0x05,0xba,0xf3,0xe3,0x04,0x1c,0xde,0xf7,0xd8,0x13,0xfa,0xd6,0xec,0x1b,0x15,0xfa,0xcf,0xe6,0xdd,0x22,0x03,0xf4,0xd7,0x1f,0xf3,0xe2,0xfe,0x02,0x2e,0xf7,0xdb,0xf6,0xf9,0xfb,0x17,0xed,0x1a,0xf0,0xed,0xc6,0xf7,0x18,0xad,0x29,0xfb,0x04,0xf0,0x35,0x0b,0xd0,0x0d,0x02,0x17,0x09,0xf6,0xfd,0x0d,0xac,0xdf,0x18,0xd5,0xcf,0xd9,0xce,0x3d,0xf8,0xeb,0xff,0x12,0xb1,0x15,0x01,0xf9,0x1a,0x10,0xeb,0xf5,0x1f,0x05,0x0e,0xfd,0xfd,0x12,0x09,0x27,0xcd,0x11,0x0d,0x35,0xa3,0xda,0xc4,0xde,0xee,0x03,0xf7,0x1b,0x26,0x0d,0x18,0x2c,0x06,0xb9,0xef,0x2b,0xe6,0x0a,0xee,0x0c,0xed,0x79,0xe3,0x16,0x47,0xf1,0xfe,0xde,0xf2,0xe5,0x05,0xd4,0xde,0xec,0x44,0xc9,0xd1,0x2f,0x07,0xf6,0x17,0x1b,0xd9,0xdd,0xed,0x3a,0x35,0x2a,0x3e,0x08,0x08,0xaa,0xef,0xeb,0xa6,0x7f,0xf1,0x57,0x26,0x29,0xe0,0x0e,0x33,0xcf,0x29,0xdf,0xd8,0xed,0x18,0xf2,0x07,0x08,0x28,0xd4,0xde,0xd7,0xd4,0x0b,0xc2,0xcf,0xf3,0x2e,0x0b,0xb3,0x95,0x1f,0x1f,0x23,0x02,0x0c,0x19,0xf5,0xe6,0xfd,0xb9,0x12,0xe6,0x13,0x13,0x35,0x38,0x20,0x1a,0xe6,0xf4,0x32,0x50,0xc3,0x04,0xb5,0xdf,0xe1,0xf4,0xf5,0xdb,0x42,0xfb,0xeb,0xf2,0xb8,0x20,0xe7,0x25,0x06,0xee,0x33,0x12,0xdd,0x01,0xef,0x0f,0x1f,0xf2,0xcc,0xf9,0x10,0xe7,0xc3,0x9e,0xe1,0x19,0x2a,0xf5,0x0c,0xde,0xc8,0xda,0xf4,0xb0,0xec,0x09,0x1a,0x02,0xab,0x5e,0xce,0x0e,0x2d,0xfb,0xee,0x1b,0xf2,0x3d,0x51,0xde,0xbf,0x24,0xe0,0x3a,0xa9,0x27,0xaa,0xce,0xb3,0xf7,0xcd,0xf8,0xa7,0xf6,0xf3,0xe1,0x1e,0x3a,0x36,0xc2,0xb4,0xfb,0x41,0x51,0x0e,0x17,0x27,0x00,0x14,0xf0,0xe2,0xc9,0xcc,0xf6,0xcd,0xf0,0xcb,0x2f,0xb6,0x06,0x29,0xe6,0xba,0xf5,0xed,0xe1,0xdb,0x49,0xfa,0xfd,0xfe,0x03,0xff,0x07,0xf9,0x33,0xc7,0xfd,0x1c,0x4c,0x93,0x0b,0xeb,0xbd,0xda,0xf3,0x1a,0xfb,0x3d,0x13,0x2d,0x3a,0x2e,0x3b,0xc7,0x9b,0x1b,0xe5,0xec,0x0c,0x11,0xdf,0xee,0xef,0xce,0x20,0x18,0x3e,0xe9,0xf9,0x22,0x15,0x04,0xfe,0x09,0x00,0x10,0xfe,0xf1,0x2e,0xf6,0xbe,0x3c,0xb7,0xd6,0xe2,0x08,0x24,0x36,0xf3,0x05,0x17,0x47,0xdd,0xf9,0xf0,0xff,0xf3,0x4a,0xea,0xee,0xe1,0x03,0x26,0x95,0xc4,0x3c,0x44,0x2c,0xd3,0xeb,0xb8,0x67,0x0d,0x25,0x3d,0xbc,0x19,0x3e,0xfa,0xdb,0xd8,0x7f,0x25,0xa0,0x28,0x13,0x34,0xef,0xd3,0x23,0xec,0xbf,0xc4,0x09,0xcf,0x3f,0xca,0x02,0xf4,0xc1,0xde,0xb7,0xfd,0xb9,0x0e,0xfd,0xf8,0x09,0xdd,0xfb,0xb3,0xe8,0x2d,0x29,0x27,0xf3,0xf6,0xfc,0xec,0x13,0x08,0xfe,0xf1,0x17,0x06,0xc5,0x11,0xf5,0xf2,0x1d,0x25,0xe0,0xd6,0x01,0x00,0x1b,0xbc,0x05,0x2f,0xbf,0x16,0x16,0x2e,0xc6,0xfa,0xb4,0x5a,0x43,0xaa,0xdd,0xf2,0xf2,0xd6,0xa1,0xef,0x0d,0xcc,0xca,0xe0,0x57,0xec,0x9d,0xd2,0x3c,0xd4,0xf2,0xc6,0xfc,0xbe,0xb2,0x11,0xbc,0xdc,0xef,0x3b,0xe1,0x23,0xc6,0x0c,0xd9,0x15,0x05,0xf1,0x54,0x34,0xf9,0xaa,0xf3,0xf4,0x98,0xda,0x21,0x22,0xdd,0xf7,0x17,0x11,0x4b,0xed,0x05,0xf0,0xf4,0x41,0xd1,0xa8,0x0f,0x08,0x1b,0x16,0x04,0x9c,0xff,0x18,0xf1,0xbe,0x3d,0x0b,0xcd,0xbf,0xa7,0xe2,0x2c,0xec,0x0d,0xf5,0xc9,0xf3,0x00,0x07,0x0b,0xd1,0x9f,0x42,0x21,0xcf,0xed,0xfa,0xf7,0x14,0x0a,0xcf,0xc6,0x31,0x0e,0xd1,0xd0,0x4d,0xbb,0xe9,0xe0,0x3d,0xd4,0xcb,0x21,0xfa,0xd9,0x2f,0xb4,0xd3,0xe5,0x14,0x03,0xa4,0xda,0x17,0x18,0x3a,0xf1,0xfc,0xb6,0x2b,0x21,0xde,0x1b,0xaf,0xf0,0xe3,0xd0,0xdb,0xf2,0x15,0xce,0x24,0x19,0xc4,0xf7,0x0d,0x11,0xf7,0xff,0xfa,0xc8,0xa5,0x19,0xde,0xe8,0xd6,0x05,0x0a,0x1d,0x12,0xfd,0xed,0xc5,0x2a,0xc1,0xc6,0xbc,0xc8,0x04,0x81,0x4c,0x2a,0xe9,0xac,0xfa,0x25,0x40,0xeb,0xf2,0xf4,0xce,0x1a,0xd1,0xcb,0xee,0xe0,0xc3,0x1e,0xd5,0xca,0x0d,0xf6,0x3b,0x3b,0xf5,0x1f,0xe2,0x2e,0x35,0x3a,0x3c,0xb7,0xd6,0x0a,0xd3,0xe4,0x47,0x13,0x38,0x09,0xde,0xd3,0x0b,0x05,0xe7,0xe7,0x25,0x17,0x27,0x19,0x17,0xce,0xf3,0x22,0xbd,0xec,0xee,0xca,0x5a,0xf8,0xeb,0x22,0xeb,0xe3,0x34,0xf9,0x18,0xcc,0xbd,0x0b,0x01,0xfa,0x15,0xce,0x08,0x39,0xaf,0xe9,0x2a,0x22,0x3d,0xe7,0xd4,0x23,0xdc,0xdd,0x12,0xdc,0x28,0xbd,0xde,0x09,0xdd,0xee,0x52,0xff,0x21,0xc0,0xcb,0xd7,0x34,0xfa,0xee,0xf3,0x2e,0x0a,0x1e,0x0a,0xd5,0x2b,0xcd,0xe6,0x16,0x34,0x04,0xf2,0x36,0xed,0x1b,0xce,0xd2,0x42,0x04,0xd9,0xe2,0x71,0xd2,0x00,0xf0,0xfb,0xd7,0x2a,0x40,0x11,0xe0,0x1e,0xfe,0x01,0x09,0x34,0xb8,0x26,0xc1,0xfc,0x9d,0x00,0xf0,0xeb,0x11,0x04,0xd9,0x9b,0x21,0xf3,0x02,0xd6,0x06,0xeb,0x3c,0xea,0xbb,0xfc,0xde,0x12,0x0a,0x0c,0x62,0xde,0xe3,0xe2,0xda,0x19,0xfc,0xe0,0xe7,0x40,0xe1,0xd2,0x8d,0xa4,0xf4,0xe3,0x02,0xe0,0xd1,0x39,0xd0,0x1d,0xed,0xca,0xe0,0x11,0x87,0xe2,0xd1,0xd9,0xb5,0xea,0xa3,0x35,0xfe,0x12,0xef,0x09,0x37,0x33,0xeb,0xf5,0xf7,0xe2,0xcc,0xf5,0x2b,0xc1,0xfa,0xd2,0xe6,0x02,0xf7,0xc8,0xe9,0x7f,0xc4,0x5f,0x2c,0x0e,0xfc,0x2f,0xea,0xad,0x1c,0xdd,0xf8,0xd1,0xfa,0x09,0xb0,0xae,0xd9,0xc6,0xde,0x04,0xfc,0xe4,0x0d,0xef,0xce,0x1b,0x11,0x21,0xfa,0xca,0x4b,0x1e,0x10,0xf1,0x1d,0x3c,0xbf,0xd1,0xe5,0xd6,0x0d,0x18,0xdc,0x13,0x10,0xee,0x4f,0x0b,0x07,0xf3,0x08,0xde,0x30,0xd4,0x3a,0x4c,0x19,0xac,0xfb,0xe1,0x2b,0x23,0xde,0x1d,0x1d,0x27,0x12,0xe4,0x0e,0xe8,0x61,0xcb,0xa1,0x03,0xe6,0x97,0x44,0xab,0x07,0xb4,0xef,0xda,0xdc,0x0a,0xe7,0xec,0xd8,0x1e,0xb6,0x2f,0xdf,0x13,0xcd,0x37,0x03,0x0c,0x1e,0xde,0x9a,0x0e,0x11,0x2b,0xf5,0xdd,0xe0,0xd2,0x1d,0xbd,0x01,0x0e,0xfd,0xdc,0xf5,0x0a,0xca,0x33,0xe1,0x0b,0xf1,0xf8,0x2e,0xa5,0x1d,0xe7,0x4c,0x01,0x33,0x18,0x2a,0xc9,0xe8,0x04,0xd8,0x1f,0xde,0x00,0x44,0xbd,0xd9,0xc7,0x11,0xf0,0xd6,0x32,0xcf,0x13,0x9a,0xdd,0xd9,0xc7,0xf4,0xf2,0xbb,0xc5,0xf0,0x01,0x00,0x81,0xe7,0x27,0xf4,0x10,0x08,0x6a,0xee,0xb7,0x13,0x58,0x5f,0xd8,0x16,0xff,0x43,0xe9,0x31,0x13,0x51,0xfc,0xed,0x01,0x35,0xb7,0x02,0x00,0xf8,0xf1,0x0f,0x2a,0xf7,0xe7,0xc8,0xa8,0xeb,0xa8,0x2c,0x21,0xf4,0x2d,0x15,0x41,0x14,0x28,0x18,0xf4,0x0f,0x21,0xfe,0xd7,0x27,0x43,0xf2,0xa3,0xe5,0x52,0xf4,0xfd,0xc4,0x59,0x0a,0xbf,0xe2,0xcd,0x39,0x15,0x08,0x10,0x09,0x97,0x97,0x23,0x40,0x28,0x4a,0x0e,0xed,0x1d,0x32,0xf4,0xc6,0xe6,0xae,0xf1,0x45,0x4b,0xd0,0xfe,0x33,0x35,0x1c,0xda,0xaf,0x17,0x03,0x37,0x2c,0x02,0x1c,0xda,0x27,0xf2,0x36,0xed,0x2a,0x2a,0x14,0xcf,0xee,0x0d,0xd7,0x06,0xe2,0x05,0x52,0xee,0x14,0xe1,0xf3,0xad,0xea,0xe3,0xe7,0xfd,0xf1,0xea,0xeb,0xc4,0x1a,0xff,0x0e,0xdc,0xce,0xf2,0xfd,0xaf,0xb1,0xb1,0xaf,0x2e,0xb9,0x14,0x31,0x31,0xbd,0xcb,0xda,0xc1,0x37,0xfd,0x64,0xe2,0xba,0xfb,0x27,0xef,0x15,0xd0,0x1d,0xee,0x0f,0xc3,0xea,0x30,0x31,0xfb,0xd5,0x12,0x0c,0xf2,0x3a,0x89,0x30,0x91,0xc2,0xda,0xc1,0x0b,0xe1,0x31,0x4c,0x30,0xde,0xe8,0x0a,0x11,0x0d,0xeb,0xef,0x00,0x05,0xd9,0xbf,0x08,0x39,0x36,0xed,0xbe,0xc9,0x1e,0xf0,0x3b,0x44,0xfa,0xa4,0x8f,0xc7,0xd1,0xd5,0x0c,0xe0,0x14,0xcf,0x24,0xcb,0x1b,0xf7,0xd9,0xdf,0x10,0xfa,0xa9,0xa7,0x03,0xfd,0xd4,0x0b,0xca,0xd5,0xe4,0xb6,0x23,0xca,0xed,0x04,0xf1,0x38,0xf9,0x01,0xac,0x4c,0x0e,0xd7,0xcf,0xad,0xe4,0x20,0x0a,0xf8,0xfc,0x2f,0xcc,0xff,0xdd,0xe1,0x81,0x04,0xac,0xd6,0xe6,0xbd,0x2e,0x47,0xf1,0x1f,0x3a,0xd0,0x0f,0xb9,0x17,0xac,0x04,0xcb,0x20,0x32,0x88,0x20,0x00,0x34,0xe4,0xdc,0xc6,0x37,0x0c,0x22,0x02,0x1e,0xd6,0xe0,0x02,0x06,0xa2,0xe9,0xec,0xe5,0x03,0xee,0xe6,0xca,0x01,0xd1,0xb8,0x0d,0x26,0x2a,0x12,0xbc,0xdb,0xf3,0xcb,0xc2,0x21,0xcf,0x3c,0xfc,0x04,0xc9,0xc5,0x13,0xcd,0x04,0x2a,0xe8,0xee,0xaf,0xec,0x1b,0xf9,0xc1,0x05,0x33,0x1f,0x1f,0x24,0xdb,0xb4,0xea,0x12,0x54,0xf7,0xee,0x24,0xe3,0xe0,0x09,0xbe,0xd5,0x15,0xdc,0x2d,0xea,0x36,0x1e,0xda,0xdf,0x21,0x07,0xbd,0x31,0xeb,0xc3,0xe6,0xb1,0xd9,0x24,0xdc,0x19,0x0c,0xa8,0xff,0x0a,0x13,0xf0,0xbe,0xea,0xde,0xba,0xea,0x19,0x2c,0xe0,0xdb,0x48,0x10,0xfc,0x05,0x1a,0x0f,0xb9,0x2c,0x0d,0xd3,0xb5,0xea,0xd3,0x04,0xdd,0xdc,0x1e,0xd8,0x19,0xa7,0x0b,0xde,0x1a,0xdd,0x2d,0xdc,0xe8,0x10,0xf7,0x19,0xfb,0xf6,0xdb,0xca,0xd4,0x19,0xe1,0x2b,0xd3,0xd9,0xe6,0xc7,0xf3,0xec,0xfa,0x15,0x06,0xc2,0xf9,0x0a,0xb0,0xf0,0x16,0xdd,0xf6,0xd7,0x0c,0x26,0xfc,0x31,0x05,0x36,0xff,0x35,0x07,0x07,0x2d,0xef,0x02,0xfb,0xa0,0xf2,0xea,0x0b,0x20,0x32,0x13,0x0f,0x27,0xb3,0xf3,0xbb,0xe7,0x14,0xdc,0x0b,0x02,0x1d,0xe2,0xf7,0xea,0xff,0xf6,0x0f,0xde,0xed,0xf3,0x21,0x0b,0xee,0x18,0xf3,0x33,0xf7,0x25,0xf0,0xf8,0xd3,0xc5,0xe0,0xeb,0xc9,0xea,0xe2,0x08,0x10,0xcd,0xfc,0xf1,0x0e,0x02,0x15,0xcd,0xf9,0x18,0x14,0x08,0x1f,0x01,0xfe,0xcb,0xf8,0xed,0xef,0x05,0x07,0xf7,0xdd,0x07,0x17,0xd0,0x16,0x20,0x22,0x06,0x0d,0x05,0x7f,0xfd,0xdc,0xf4,0x18,0x16,0x0c,0xd8,0x14,0x05,0x01,0x17,0xc5,0xcf,0xf1,0xd9,0x02,0xed,0x04,0x0d,0x22,0x1e,0xf6,0xbb,0xfd,0xed,0x0a,0xf8,0xde,0xde,0xd8,0x34,0xf4,0xfc,0xf9,0xcc,0xcf,0xf2,0xea,0x41,0x47,0xd9,0xd6,0xe9,0xf5,0xe9,0xc9,0x07,0x09,0xfc,0xf6,0xd6,0x0a,0xeb,0xed,0xf7,0xf2,0xfc,0xed,0xf6,0xfd,0xe3,0xf2,0x25,0x0d,0xd9,0xd7,0xf3,0x14,0xe5,0x4d,0x0a,0xeb,0xf8,0xeb,0x19,0xd2,0xbb,0xe7,0xcb,0xfa,0xf4,0xd7,0xf4,0x17,0xb7,0x0e,0xe8,0xf0,0x13,0xda,0xf3,0x0c,0x0e,0x0b,0xe5,0xea,0xf9,0x0c,0x58,0x03,0xfb,0x0b,0xf6,0xeb,0x0d,0xf9,0xde,0x29,0xda,0x18,0xfc,0xdb,0xdb,0xc8,0x0c,0x37,0x1f,0xf9,0x14,0x13,0xdf,0x12,0x22,0xff,0x17,0xe9,0xe1,0xf6,0x0d,0x0a,0xe5,0xef,0xd3,0xd6,0xf2,0xd6,0xfb,0xf7,0xe1,0x07,0xff,0x42,0xdc,0x2d,0xb0,0x07,0xfb,0xf3,0x12,0x05,0x0f,0xdf,0x0e,0xdc,0xf2,0x00,0xc8,0xdf,0x02,0x0e,0x08,0x22,0x18,0x13,0x2b,0xd9,0x00,0x0b,0xc2,0x12,0xdf,0xfe,0x4a,0x3c,0xcc,0x47,0x12,0x20,0xde,0x1a,0xca,0xed,0xed,0x30,0x0c,0x04,0x38,0x0f,0xeb,0x19,0xb5,0x20,0x22,0x07,0xec,0x09,0xd4,0xb4,0xf3,0x11,0xf6,0xbb,0xd9,0x05,0xf4,0x0a,0xed,0x33,0xc1,0xe8,0x43,0xd4,0x07,0xfc,0xdc,0x2e,0x0f,0x1d,0x2e,0xd2,0xe5,0xff,0x1a,0xc1,0xea,0x26,0x29,0xb8,0x17,0xbe,0x08,0xdc,0xe9,0xd7,0xeb,0xe1,0x31,0xdf,0xef,0x01,0xd8,0xa1,0x3b,0x20,0x06,0x9b,0xf5,0xfd,0xee,0x2e,0xd7,0xec,0x18,0x25,0x32,0x7f,0x0b,0x08,0xeb,0xa0,0x0d,0xfd,0x33,0xfb,0xce,0xdf,0x0a,0xf9,0x00,0x18,0xd8,0xe7,0x25,0xd8,0xd5,0x09,0xeb,0x17,0x74,0x10,0xed,0x00,0x12,0x0c,0xdf,0xb9,0x4b,0x08,0x16,0xe1,0xf3,0xdf,0x1e,0x05,0xf9,0xd4,0xc7,0xcf,0xd9,0xe1,0xc5,0xbb,0xe0,0xce,0xf5,0x1d,0xe5,0x11,0x06,0xe1,0x07,0xf6,0x26,0xcd,0x03,0xc7,0x15,0xd9,0x23,0xe8,0xd0,0x05,0xf9,0xf3,0xc9,0xe1,0xe0,0x05,0xe6,0x11,0xf3,0xde,0xe2,0xfa,0xc4,0xfb,0x05,0x13,0x01,0x1c,0xe9,0x08,0xd8,0xdd,0xb9,0x19,0xb5,0xea,0xa8,0x03,0xde,0xf2,0x09,0x45,0x39,0x0f,0xf1,0xda,0xe2,0x13,0x37,0x16,0xe2,0x3f,0xf7,0xdf,0x32,0xe9,0x07,0x4c,0xeb,0x40,0xac,0xe5,0xb0,0xfe,0xc2,0xe0,0xf4,0xd7,0xc1,0x23,0xf5,0xdf,0xe7,0x0f,0xff,0xe3,0x34,0xbf,0xd1,0xdc,0xfe,0x0c,0xd1,0xf0,0xea,0xd6,0xbd,0xf8,0xc3,0xcc,0xc5,0xf0,0xf3,0xdb,0x03,0x17,0x1d,0x0d,0x28,0xe8,0x16,0xd3,0x16,0xcc,0xf5,0x17,0xec,0x36,0xe4,0x2e,0x07,0xdc,0xe2,0xd3,0x0a,0xd7,0x0a,0x1f,0xc0,0x19,0x16,0xeb,0xd4,0xd9,0xfe,0xd9,0xd9,0xb6,0xf9,0xf6,0xdd,0xd1,0xe4,0x25,0xc0,0xf9,0xda,0x10,0xe5,0x25,0x15,0xb5,0x1d,0x9c,0x10,0x05,0xd1,0xd2,0x8d,0xee,0xde,0xa7,0xb7,0x49,0xe9,0x26,0x9c,0x03,0xec,0x22,0xf9,0xe3,0x30,0x04,0x29,0x10,0xcd,0xe2,0xce,0xf6,0x18,0xfd,0xe5,0x21,0x0b,0x19,0xf7,0x19,0xe7,0xd1,0xf2,0xfc,0xf8,0x10,0xbf,0xdb,0x0f,0xd7,0x4b,0x0c,0x30,0x1a,0x49,0xf7,0xd0,0xc8,0x14,0x2b,0x13,0xa6,0xe6,0xf0,0xcf,0x09,0x22,0x30,0xf5,0x41,0xc9,0x06,0xf7,0x1f,0xe9,0xf0,0x04,0x0d,0xde,0xed,0x10,0x1b,0xc2,0x29,0xc0,0xd3,0x2a,0xcf,0xfb,0xc8,0x17,0xf9,0xa6,0x11,0x06,0xf5,0x0d,0xd3,0xd1,0xf9,0xc0,0xa7,0xe3,0xff,0xec,0x15,0xe0,0xed,0xba,0xcf,0xfe,0xf9,0xea,0x01,0x43,0x01,0x08,0xfd,0x2a,0xc0,0x42,0x15,0xc7,0xfb,0xfa,0xf7,0xcd,0x24,0xff,0xf4,0xc3,0xde,0xef,0xe5,0x03,0x06,0x15,0xeb,0xf5,0x27,0xe3,0xd7,0x09,0x10,0x07,0xe9,0x1f,0xdf,0xdb,0x24,0x1f,0xeb,0xcb,0xf8,0xc3,0xda,0x1f,0x19,0x0c,0xe2,0x6a,0xce,0xfa,0xf9,0xb8,0x18,0xf7,0xf7,0xe6,0xd0,0x1d,0xac,0x2a,0xfd,0xf7,0x0c,0xf2,0x18,0xb3,0xc5,0x33,0xd9,0x43,0xfb,0xf0,0x46,0xc7,0xb7,0x0a,0xde,0xf8,0x08,0xed,0x15,0xd9,0xd3,0x15,0x24,0x34,0x0a,0x36,0x03,0xb4,0xce,0x87,0xc0,0x7f,0xc1,0xec,0xf6,0xec,0x16,0x14,0x01,0x23,0x00,0xe3,0xcd,0x94,0xee,0xe3,0xec,0xf9,0x08,0xf6,0x0e,0xf3,0xec,0x0f,0xba,0xb5,0x07,0x08,0xfb,0xd1,0xc8,0x0d,0xb5,0xe7,0xfb,0x13,0xb6,0xfb,0x10,0xf7,0xbb,0xdb,0xdb,0xe2,0x09,0x29,0x4e,0x36,0x2a,0xe4,0xe1,0x27,0xde,0xe8,0xdb,0x01,0x15,0x03,0xf1,0x20,0xef,0xc2,0xd8,0xca,0xac,0x0c,0x34,0x2d,0xc9,0xb3,0xf2,0xc4,0x21,0xf3,0x04,0x81,0xa7,0xea,0x45,0xd3,0x3b,0x09,0x28,0xf4,0xad,0xf1,0xfc,0x13,0xed,0xaa,0xba,0x10,0xea,0x37,0x22,0x24,0xd3,0xe1,0x0d,0xfa,0x09,0xec,0x29,0x13,0x10,0x03,0x28,0xfa,0x28,0xda,0xdb,0xde,0x6c,0x60,0xc2,0x0a,0xf0,0x37,0x5f,0x01,0x00,0xf8,0xbe,0xbf,0xc6,0x41,0x01,0xcd,0xfd,0x3e,0x0d,0xfe,0x05,0xef,0xed,0x23,0x09,0xee,0x45,0xf2,0xbe,0x34,0x2d,0x03,0x6f,0xb7,0xd3,0xf2,0xf6,0x01,0xbe,0x11,0x0f,0xcb,0x38,0x09,0x0c,0xd9,0xc3,0x1d,0xe3,0xfc,0xa9,0xb3,0x2a,0xe5,0xa6,0xb2,0x2a,0xff,0xf3,0x26,0x09,0xed,0xb8,0x0d,0xa8,0x13,0xe5,0xba,0x4d,0x2d,0x38,0xf7,0xbe,0xc3,0x28,0x3a,0x27,0xdf,0xe3,0xca,0xb2,0x0d,0x05,0xbb,0xd9,0xda,0xfe,0xb6,0xbc,0xaa,0xff,0x1c,0xf1,0xf3,0x00,0x03,0x1b,0x13,0x16,0xe4,0x1a,0xf5,0xd7,0x2b,0xf4,0x28,0x35,0xfe,0xdb,0xcd,0xc6,0xf7,0xde,0xf8,0xd3,0xfc,0x07,0x17,0x00,0xdf,0x03,0x03,0x17,0xe3,0xb0,0x22,0x00,0xd2,0xc9,0x30,0x18,0x04,0xf2,0x0e,0x0e,0x06,0xc8,0xe9,0xd7,0xe4,0x3b,0x06,0x02,0xf6,0x1f,0x02,0xfd,0x07,0x11,0xc0,0x49,0xd8,0xd6,0xbb,0x22,0xaf,0x51,0xeb,0x05,0xaf,0xe0,0xeb,0x07,0x14,0x36,0x2d,0xaf,0xf8,0xf7,0x1b,0xec,0xf0,0x23,0xf4,0xed,0xdb,0xf4,0x0b,0x5d,0x0d,0xb5,0xcd,0x09,0xfb,0xf9,0xde,0x03,0xe3,0xf7,0x4a,0x5f,0xb3,0xda,0x13,0xfd,0xbb,0xee,0xe6,0x19,0xe7,0x56,0x9d,0x30,0xd9,0x2e,0x2b,0xb6,0xf5,0xca,0x30,0x8a,0xc4,0xf8,0xfd,0xc8,0xf5,0x20,0xf5,0x35,0x14,0xfa,0x08,0x06,0xd7,0xc3,0xfb,0xff,0xd3,0xd6,0xb8,0x31,0x0c,0x46,0x29,0xe6,0x07,0xe5,0x0d,0x25,0xaa,0xf4,0xa7,0x3a,0xe9,0xd1,0x39,0xcc,0x48,0xfc,0x92,0x27,0xa8,0x3a,0x32,0xe9,0x09,0xc4,0x16,0x18,0xea,0xea,0xb6,0xa8,0x2b,0x1f,0xea,0x01,0x0d,0xb8,0xe1,0x15,0x59,0xb0,0x2d,0xc3,0xfd,0x66,0xdc,0x05,0x1e,0xd1,0xcf,0x26,0xdc,0x00,0x42,0x29,0x16,0x19,0xc7,0x27,0xe9,0x89,0xc5,0x12,0x49,0xcc,0x21,0xfd,0xef,0xac,0x4f,0xeb,0x07,0xf5,0x22,0x1a,0x8a,0x28,0xac,0x26,0xa4,0x2b,0x55,0xf3,0x15,0xa8,0xf6,0x18,0x3d,0x33,0x10,0x0c,0xea,0x12,0xca,0xc9,0xec,0xa4,0xb9,0xfb,0xce,0x31,0x35,0xf0,0x02,0x19,0x32,0x95,0x09,0xbb,0xc4,0x2c,0xf8,0x1c,0xd9,0x0a,0xcf,0x8c,0xf2,0x15,0x8d,0xcb,0xa3,0x08,0x28,0xdd,0x1b,0x08,0xd7,0xb1,0x48,0x07,0x0b,0xe5,0xe8,0xf0,0x40,0x0e,0x07,0xec,0xde,0xc6,0xce,0xb4,0xe6,0x15,0x21,0x0b,0xa7,0xf6,0xf0,0xf1,0x11,0x36,0xda,0x94,0x0f,0xeb,0x1e,0x54,0xd9,0x9d,0xc2,0x0f,0x22,0xce,0x00,0xe5,0x5a,0x18,0xb8,0x01,0x4c,0xc6,0xf8,0xe5,0x99,0x28,0x04,0xf4,0xf4,0x16,0x25,0xdd,0x0d,0x3e,0xb0,0x01,0xfe,0xb6,0xfe,0xe7,0x04,0xbd,0x26,0xb5,0x4b,0xb0,0xe9,0xf0,0xfe,0x03,0x3d,0xe6,0xf3,0x1e,0x6e,0x13,0x4d,0x4c,0xc5,0xb5,0x81,0xa0,0xec,0xc0,0xcf,0x0b,0x01,0x1a,0xcc,0x1d,0xac,0x2d,0xd1,0x15,0x05,0x0a,0xff,0x2b,0xf0,0xb9,0xf6,0xbf,0x45,0x00,0xb5,0x43,0x1a,0xd5,0xe0,0x0e,0x10,0xe5,0xc9,0xed,0xde,0x2e,0xd0,0xe8,0x2f,0x08,0xd4,0xdf,0xc7,0xf8,0xf6,0xb3,0x22,0xf9,0xec,0xe6,0x14,0xd8,0x14,0xee,0xc1,0x00,0x12,0xe4,0x12,0x00,0xec,0xe1,0xac,0xcb,0x0c,0xd2,0xe9,0x11,0x2e,0xd7,0x18,0xd1,0x2b,0x3a,0x32,0xee,0x08,0x00,0xb2,0x8a,0x15,0xe6,0xab,0xf8,0xfd,0x93,0xe3,0xf6,0xeb,0xd8,0x1f,0xd7,0x29,0xfe,0x40,0x57,0xec,0xa2,0xe2,0x0d,0x0e,0xe9,0xf7,0x1f,0x92,0xdd,0xaf,0xec,0x13,0x10,0xc9,0xe6,0x24,0xcf,0xeb,0x0a,0xfa,0x25,0xbc,0xe0,0x8a,0x18,0x89,0x05,0xbd,0x20,0x13,0xf3,0x06,0x19,0xc4,0xdd,0xd3,0x2d,0xd1,0xd3,0x33,0x07,0xf5,0x26,0x2a,0x16,0x05,0xeb,0x48,0x3f,0x34,0xe7,0xff,0xfa,0x81,0xdb,0xe9,0xf3,0xc0,0x25,0x0c,0xb5,0xe8,0x00,0x47,0xf6,0x42,0xf8,0xd7,0xd1,0xf7,0xf8,0x20,0x07,0x17,0xf9,0x1b,0x9e,0xf2,0x3a,0xdc,0x0e,0x29,0xb0,0x1a,0x04,0x99,0x43,0x0a,0x07,0xff,0x52,0x02,0x14,0x04,0xac,0xe7,0xcf,0x04,0x07,0xf3,0xf4,0x26,0x07,0xe4,0x47,0xd6,0xd7,0x01,0xd1,0x17,0x18,0x37,0xfc,0xfc,0xd5,0xf3,0x08,0xfc,0x37,0x28,0xce,0xfd,0x24,0xde,0xf0,0xe3,0x1f,0xa0,0xf0,0x07,0xfb,0xdc,0xfd,0xd4,0xf1,0x2e,0xe5,0x1c,0xd8,0x19,0xe1,0xe5,0x5f,0xe5,0xc9,0xf2,0x25,0xc1,0x34,0x42,0xc4,0xf1,0xf7,0xe6,0xf5,0xcb,0xf3,0x2d,0x00,0xe6,0xda,0xff,0xac,0x37,0xfa,0xd7,0xc0,0xf0,0x2a,0xd6,0xc3,0xdf,0xc3,0x30,0xed,0xb0,0xff,0xe5,0xf9,0x07,0xf3,0xd8,0x1c,0x41,0x17,0xda,0xf8,0x03,0xf0,0x0c,0xce,0x14,0x08,0x06,0xf4,0x11,0xde,0x14,0xfc,0x19,0x28,0xd8,0x04,0x4b,0x27,0x21,0xb7,0xee,0xdf,0x02,0xf7,0x16,0xf1,0xd5,0x12,0xea,0xf3,0x1f,0x0a,0xd0,0x39,0x53,0xf6,0xef,0xed,0x1a,0x1e,0xea,0xd0,0x1f,0xd7,0xf9,0xfd,0x1b,0xf4,0xfb,0x08,0xd5,0x1c,0x25,0x33,0xd9,0xf7,0x16,0x07,0xf5,0x01,0x29,0x3e,0x1a,0x10,0x05,0xde,0x14,0xe2,0xe2,0x1f,0x03,0x0b,0xe9,0xed,0x0d,0xfd,0xf1,0x09,0x05,0x06,0xd7,0xcb,0xb7,0x00,0xdc,0xff,0xde,0x04,0xc1,0x2e,0x13,0xf0,0x09,0x19,0x0c,0x2a,0x1b,0xf2,0x26,0xbc,0xe5,0x31,0xc5,0x00,0xb8,0xfa,0x2b,0xf1,0xfb,0xda,0xfd,0xc5,0x22,0x12,0x03,0xf9,0x20,0xd2,0xf2,0x3b,0xad,0x16,0xe4,0xed,0xee,0x24,0xfb,0x0d,0xe9,0x04,0x0f,0xd4,0xfa,0xf0,0xe9,0xe9,0xf7,0xf9,0xfd,0xdf,0x7f,0x0c,0x0b,0x0a,0xdf,0xdc,0x01,0xfa,0xef,0xf6,0x08,0xd7,0x42,0x10,0xf6,0x6a,0x12,0xf9,0xef,0xf3,0x0f,0x01,0xe5,0xe8,0x0a,0x08,0xd8,0xb0,0x23,0xd9,0xdd,0x03,0xee,0xf1,0xed,0xe1,0x24,0x52,0xf3,0x7d,0x20,0xe8,0x9e,0xe7,0x07,0xed,0x73,0xe9,0x1e,0x0a,0x08,0xe1,0xf3,0x17,0xe1,0x07,0xf9,0xdd,0xff,0x17,0x0e,0xd6,0xf4,0xfd,0xf9,0xed,0xbb,0xd0,0xf7,0xcd,0xea,0xdb,0xe9,0x19,0xcf,0xbd,0x35,0x13,0x07,0x27,0x2b,0x03,0xca,0x0c,0xfb,0xc7,0x01,0x07,0x02,0x24,0x27,0x1e,0x22,0x38,0xf2,0x1c,0x2b,0xa3,0xc8,0x14,0xfe,0xfa,0x01,0xec,0xde,0xff,0xeb,0xda,0xca,0xdd,0x25,0xd1,0xb0,0xf7,0x14,0xd1,0x94,0xba,0x3d,0xb9,0x1c,0xcc,0xbe,0x2d,0xfb,0x2f,0x08,0xff,0xee,0xaf,0x97,0xfd,0xa5,0x10,0x48,0x25,0x37,0xd8,0x2d,0xff,0xc9,0xff,0xf1,0x4c,0xf1,0x8f,0xf0,0xcb,0xc3,0x81,0xf9,0x1e,0x49,0x33,0x13,0x14,0xf1,0xa2,0x5e,0xf7,0x3a,0xf9,0xdc,0xe9,0x0e,0x49,0x6f,0xed,0xd0,0xe4,0x0a,0xb5,0xde,0xd6,0xd4,0xe7,0xc4,0xf4,0xee,0x08,0xee,0x05,0xe8,0xb7,0x5c,0x9e,0x3b,0xbe,0xcd,0x31,0xdf,0x42,0x1a,0xfb,0xed,0xe5,0xda,0xf6,0xab,0xc9,0xe3,0xbc,0x13,0xf3,0xc8,0xed,0x28,0x2a,0xc4,0xeb,0xe3,0xc4,0xf4,0x2a,0x22,0x0b,0x13,0xd5,0xcc,0xf5,0xb1,0x33,0x10,0xee,0xb5,0xc4,0xdd,0x02,0xcf,0x1e,0xc4,0xc7,0xe7,0x15,0xa1,0x37,0xcf,0x01,0x94,0xa6,0xdc,0x28,0xec,0x02,0x3e,0x09,0x0c,0xae,0x0a,0x40,0x03,0x32,0xd2,0x8f,0xcb,0x99,0xc8,0x3d,0xe7,0xec,0x36,0xb6,0xf0,0xf8,0xcc,0xae,0x0e,0xec,0x0b,0xed,0x32,0xe3,0x0a,0xb7,0xc8,0xba,0x45,0x30,0x03,0xc5,0x1c,0xf9,0x42,0xbf,0x44,0x50,0x28,0x0a,0xd4,0x9f,0xb0,0xe6,0x17,0x04,0x06,0x06,0x32,0xc8,0x14,0x46,0xe2,0x25,0xee,0x95,0xeb,0xe2,0xe0,0x06,0xf1,0x09,0xf6,0xdf,0x12,0x1d,0xd8,0xbd,0x16,0x35,0xc3,0x3f,0x10,0x12,0xc5,0xe0,0xeb,0x11,0xfc,0x20,0xb1,0xc6,0xb6,0xdd,0xfd,0x34,0x11,0x11,0x22,0x1b,0xe8,0xdc,0x0d,0xdc,0x45,0xe4,0xbb,0x1e,0xfe,0xeb,0xed,0xfb,0x3a,0x1a,0x25,0xa9,0xfb,0x66,0xc6,0xec,0xba,0xcb,0xc9,0x28,0x08,0xc5,0x21,0xb8,0x2f,0x06,0xb7,0x16,0xd5,0xb3,0xce,0xad,0xc5,0xa9,0xbe,0x9e,0x9b,0x0c,0x39,0x20,0xe8,0xcf,0xc8,0xd9,0xf0,0x26,0xb6,0xc9,0xf3,0xf2,0xdc,0xec,0xca,0x1f,0xf2,0x13,0xaa,0x32,0x11,0xf7,0xd1,0xb6,0x10,0xa5,0xf4,0xf6,0x3e,0x0c,0xed,0xd6,0xe8,0x92,0xf9,0xfa,0x1d,0x56,0xbe,0xf1,0xc6,0x12,0xe9,0xf1,0x21,0xcd,0x07,0xa3,0xe0,0xd5,0x07,0xe9,0xfd,0xc5,0x2d,0xfb,0xa3,0xe5,0xdd,0xd0,0x15,0xdc,0x10,0x0f,0x81,0x13,0xcb,0x31,0xa5,0x1d,0xee,0xbc,0xb7,0xeb,0xd1,0xb4,0xcd,0xcc,0x9d,0xe8,0xf3,0xf5,0x2a,0x30,0xe7,0xdc,0xe2,0xcc,0xef,0x10,0x11,0xba,0x08,0xd6,0xd2,0xd1,0x9d,0x1f,0x1f,0xdc,0xe1,0xf4,0xb0,0x0d,0xf1,0x99,0x9c,0x24,0xfb,0x0a,0xdc,0xee,0xa9,0xd5,0xd8,0xcd,0xf4,0x19,0xef,0x1e,0x2d,0x17,0xed,0xe7,0xf1,0x36,0x55,0x22,0xba,0xa3,0xe1,0xc3,0xda,0xfc,0xbb,0x07,0xe3,0xa1,0xed,0xc3,0xfb,0xe2,0xe6,0xff,0xa0,0xef,0x02,0xb2,0xd9,0xee,0x60,0x15,0x39,0x15,0xec,0xfc,0xfd,0x2e,0xf4,0xa9,0x10,0xf0,0x18,0x17,0xa3,0xce,0xe1,0xdf,0xc0,0xaa,0x2c,0x52,0xb3,0xf4,0xeb,0x44,0x8e,0x17,0xa8,0xed,0xef,0x06,0xd6,0xe8,0x3f,0xd0,0xf2,0xb4,0xc9,0xe2,0xab,0x03,0x25,0x39,0x07,0x35,0xe0,0xa3,0xdf,0xba,0x04,0x59,0xb2,0xc4,0x9a,0x06,0x14,0xde,0xf2,0x4d,0xf3,0x43,0x01,0xcc,0xaa,0x3a,0x11,0x43,0xa9,0xb0,0x35,0x26,0xfc,0xf6,0x92,0x0b,0x2a,0x19,0xde,0x0d,0xd2,0xea,0xf0,0xfd,0x09,0xd2,0x6c,0xb6,0xb9,0x09,0x9b,0xee,0x15,0xdf,0x81,0x37,0x1a,0xf8,0x44,0x16,0xf3,0x35,0xc9,0xdf,0xe9,0x1a,0x17,0x1a,0x2c,0x27,0xa9,0x27,0x10,0x03,0xd1,0x2f,0x1c,0x99,0xe1,0x03,0x08,0xcb,0xbc,0xef,0x05,0xf9,0xac,0x9a,0x19,0xac,0x36,0x99,0x3c,0xf9,0xbc,0xec,0xd2,0x09,0x45,0xc0,0x09,0x59,0xbf,0xf9,0xcc,0xde,0xd4,0x27,0x3f,0xd0,0xe5,0x15,0xcb,0xca,0x00,0xd3,0xed,0x16,0x2f,0x28,0xe8,0x50,0xbf,0x94,0xc9,0xb9,0xc0,0x92,0x8a,0xdb,0x3e,0xbe,0xf3,0x07,0xf7,0x16,0x96,0x09,0x29,0xe8,0xca,0x54,0x26,0xf4,0x08,0x18,0x2c,0x08,0x01,0xef,0xcf,0x5b,0x41,0x18,0x22,0x3a,0xf8,0xc2,0xc7,0x0d,0x07,0x17,0x1d,0x57,0x9d,0xfb,0xb3,0xdf,0x8d,0xfb,0x01,0xf7,0xf6,0xb9,0x31,0xf3,0xf6,0x1f,0x42,0x04,0x93,0xb8,0xd5,0xfe,0x9e,0x02,0xc4,0x4d,0x47,0x27,0xc5,0xfa,0x5a,0x2b,0xa8,0x9e,0x18,0xf0,0xe1,0x20,0x03,0x9c,0x1d,0xb4,0xa8,0x2a,0xce,0xac,0xe2,0xdf,0x05,0xc3,0x52,0xec,0x46,0xe0,0xc7,0x5e,0xd4,0x16,0xd7,0x61,0xdc,0x0d,0x0b,0x2b,0xf9,0xa1,0xa1,0x2a,0x21,0x03,0x13,0xc9,0x05,0x3c,0xfa,0xd1,0x05,0x35,0x11,0x4f,0xf1,0x1c,0xf1,0xee,0x10,0xe0,0xd9,0xa9,0xda,0x0d,0xa3,0x08,0x07,0x1a,0x3b,0x50,0xd6,0x8c,0x51,0x30,0xe3,0xf8,0x32,0xc9,0xfc,0x02,0xbe,0x1d,0x4e,0xd0,0x5b,0x05,0xf5,0xfd,0x0a,0xfd,0xec,0xdc,0x37,0xe4,0x1f,0xda,0x3a,0x32,0xbd,0xa6,0xd1,0x02,0xe8,0x82,0xd9,0xfd,0xe7,0x56,0x02,0x1b,0xbf,0x7c,0xc5,0xba,0xfb,0xde,0x1c,0x1e,0x03,0x36,0x58,0x21,0x86,0xef,0x31,0xf4,0xdb,0xef,0xb1,0xcc,0xec,0xd9,0xde,0xf6,0x21,0x00,0x31,0xd7,0xf4,0x89,0x0a,0xe7,0x23,0xea,0xc3,0x26,0xbf,0x06,0xfa,0x01,0x96,0xe2,0x19,0xba,0x3a,0x23,0xb4,0xc1,0x19,0xb6,0xb1,0x00,0x45,0x5a,0x4a,0xe5,0xf0,0x93,0xe0,0xd8,0xff,0x30,0xd6,0x17,0x01,0xe0,0xe0,0xd7,0x24,0xab,0x89,0xa9,0xbc,0xf5,0x11,0x07,0xca,0xd2,0xb1,0xb0,0xbd,0x52,0x21,0xd2,0xfb,0xa0,0xd2,0xce,0xd3,0x09,0xdf,0xc9,0x9b,0x10,0xde,0x3a,0x23,0xcd,0xf4,0xcd,0xe6,0x11,0xce,0xd8,0x1a,0xa2,0x19,0x18,0xb9,0x0c,0xc3,0xe9,0xf8,0x18,0xf3,0xd8,0xe4,0xce,0xb4,0x12,0xd9,0x3c,0xb1,0xc6,0xef,0x02,0xe9,0x74,0x15,0xe3,0xda,0x35,0xc8,0x2e,0xea,0xad,0xae,0xe9,0xc5,0xd6,0xda,0xee,0xb9,0x04,0x39,0xc2,0x1a,0x25,0x15,0xf1,0x57,0x31,0x9e,0x84,0xee,0xb3,0x81,0x31,0xf2,0xf4,0xdc,0x28,0xf6,0xd3,0xe9,0xf8,0x15,0xf7,0xcb,0x06,0x87,0xe6,0xb7,0xd5,0x64,0xeb,0xfd,0xbf,0xb1,0xd4,0xdb,0x46,0x1c,0xe6,0x38,0xc6,0x52,0x2e,0xe1,0xdb,0x92,0xef,0xe9,0xea,0xe7,0xe0,0xcb,0x4b,0x3d,0x4c,0xa0,0xc0,0xa1,0x16,0x31,0xe4,0xc6,0xef,0x00,0xa6,0xce,0x1f,0xf0,0x18,0x9b,0xd4,0xf7,0xf5,0xf6,0x49,0xae,0xd7,0x3d,0xa3,0x46,0x5c,0x3e,0x6f,0x9d,0xd0,0x24,0x5b,0xc3,0x9d,0xec,0xf6,0x08,0x86,0xc5,0xee,0xc2,0x0a,0xf7,0xf6,0xdf,0xfd,0xdd,0xfb,0x14,0xb5,0x22,0xbd,0xf6,0xd3,0xe9,0xc3,0xe8,0x10,0x04,0x0d,0x11,0xf2,0x1c,0xde,0x17,0xe0,0x23,0x08,0xdf,0xf7,0x07,0xe0,0xee,0x21,0xda,0x2b,0x0b,0xe2,0xee,0x08,0xfc,0x28,0xd0,0x2b,0xfd,0x07,0x28,0x03,0x07,0xeb,0xf7,0x05,0x0f,0x15,0x21,0xf9,0xcb,0x46,0xcf,0x17,0xd4,0xe5,0xcb,0xfa,0x30,0x1c,0xf0,0x01,0x02,0xd0,0x20,0xd7,0xe2,0x31,0xe5,0xeb,0x2b,0xf2,0xf8,0x27,0x21,0x1d,0xf5,0x1c,0x0e,0x13,0x08,0x30,0xcc,0xe6,0xcf,0x16,0xbd,0xd3,0xef,0xfe,0x03,0xe7,0x7f,0xdc,0xf3,0xd9,0x1d,0xd2,0x2f,0xf9,0xde,0x17,0x26,0xd2,0xed,0x7e,0xff,0xcf,0xd7,0xf2,0x2b,0x38,0x02,0x34,0x14,0x18,0xbc,0x3d,0xda,0xe2,0xee,0xda,0xf8,0xfd,0xbf,0xed,0x0d,0xf9,0x19,0xe5,0x01,0x3a,0x10,0xbd,0xda,0xfe,0xf2,0x0e,0x0d,0xce,0xf9,0xc9,0x1e,0xcf,0xd4,0xfd,0xee,0x65,0xf8,0x01,0x40,0x15,0xe7,0x52,0xe7,0xe8,0xe3,0xef,0x18,0x13,0xd1,0xf1,0xd2,0xec,0x18,0xe9,0x03,0x0d,0x23,0xf8,0xf8,0xe1,0x3e,0x12,0xbb,0xe5,0xf9,0x0b,0x38,0x2c,0xf1,0xf7,0x09,0x27,0xe7,0x22,0x01,0xe2,0xc7,0xf9,0xe0,0xec,0xfb,0xf5,0x02,0x02,0xe2,0xd1,0x00,0xf7,0x22,0xf0,0x05,0x00,0x3c,0x2a,0xdb,0x43,0x07,0x48,0x05,0x0b,0xd8,0x37,0x0d,0x1c,0xbe,0x3f,0x55,0xf5,0x05,0x31,0xc5,0xca,0x03,0x02,0xcf,0xf0,0x15,0x01,0x20,0x26,0x0e,0x00,0xd0,0xc1,0xcd,0xf2,0x09,0xf8,0xfa,0x15,0xf4,0x0b,0xd3,0xed,0xd7,0xd9,0x0f,0xf5,0xde,0xfb,0xe7,0xeb,0x1d,0x27,0x30,0x03,0xd2,0xd9,0xf7,0x00,0x11,0x20,0xf4,0x26,0xa6,0x2d,0xc0,0xed,0xf5,0xb9,0x06,0x19,0x04,0xc1,0xfd,0xce,0x23,0xcd,0x27,0x13,0xaf,0xd2,0xda,0xe9,0xdc,0x17,0x1b,0x10,0x38,0x24,0xcf,0x42,0xcf,0xf6,0x0d,0x22,0xf7,0x0a,0xfa,0xc1,0x1d,0xbf,0x20,0xaa,0xe1,0x1b,0xc9,0xd9,0xbf,0xe0,0xc0,0xbb,0x37,0x2a,0xcf,0xf4,0x0a,0x33,0xe5,0x0d,0xe7,0x13,0x11,0x1a,0xf3,0x13,0xe8,0xfc,0x4a,0xe8,0x07,0xf8,0x3c,0xbc,0x04,0x73,0xc6,0xb6,0x17,0xf8,0x95,0xba,0x02,0x63,0x3f,0xf3,0x48,0x0f,0xcc,0x23,0x53,0xf4,0xe0,0xaf,0x0d,0x2a,0x3b,0xd8,0xd9,0x7f,0x29,0xdd,0xe2,0x28,0x36,0xea,0x1d,0xd3,0xfc,0xf9,0xf1,0x11,0xea,0xba,0x13,0x4b,0xef,0xd1,0x85,0xe5,0x09,0x29,0x04,0x04,0x1f,0x41,0xe6,0xf3,0xf1,0xc8,0xd0,0xfd,0xce,0x1e,0xda,0xfd,0x09,0xcf,0xea,0xf4,0xea,0x16,0xf5,0xf9,0xe4,0x18,0x1a,0x02,0x26,0xef,0x14,0xf8,0xd0,0xec,0xc7,0xd5,0xb9,0x08,0x28,0x5f,0xed,0x13,0x2e,0x92,0xc1,0xd9,0xbf,0x02,0x01,0xf0,0xe7,0xfc,0xab,0x2b,0xef,0xfb,0x03,0xfd,0xbe,0xe8,0xff,0xe3,0x1c,0xe0,0xe2,0xdc,0x09,0xf0,0x60,0xe1,0xcc,0x1a,0x43,0x0e,0xe8,0xc6,0x1f,0xf5,0x06,0x28,0xc6,0x2c,0x46,0x5a,0x0d,0xeb,0x24,0xfc,0xcc,0x0a,0xd6,0x19,0x25,0x4a,0xd4,0x1c,0xf9,0xf3,0xfa,0x02,0xd6,0x0c,0xe5,0x2d,0xf8,0x22,0xf9,0xd4,0xdb,0xe3,0x06,0xd6,0x2b,0xf3,0xc8,0x65,0x22,0x09,0xc2,0xb5,0xd2,0x35,0xa1,0xfd,0x19,0x33,0xe0,0x56,0xbd,0x29,0xe1,0xe3,0xb2,0xdb,0x25,0xff,0xe6,0xbc,0xc5,0xdc,0xc8,0xf1,0xf1,0x19,0xea,0xc5,0xcd,0xa8,0xdc,0xe2,0xeb,0x0e,0x44,0x2c,0xbe,0xe9,0x11,0xf7,0xba,0x0a,0x45,0xe9,0xe6,0x0a,0x1c,0xac,0x10,0xec,0x23,0x05,0xd9,0xd1,0x13,0x3b,0xfe,0xe5,0xe3,0x05,0xfe,0xeb,0xb3,0xff,0xd0,0x16,0xf9,0xf6,0x2c,0x00,0xfe,0xf3,0x07,0xca,0x47,0x0a,0xda,0xc1,0xcd,0x30,0xf4,0xf9,0xfc,0x00,0xa0,0x26,0x13,0xda,0xcb,0x17,0xb2,0xee,0x9a,0xc4,0xd3,0x09,0x45,0xc4,0xab,0xb2,0x11,0xf0,0xee,0x04,0xfe,0x21,0xf2,0x17,0x36,0x15,0xf3,0x22,0x0a,0xe1,0x0c,0xea,0xc0,0xf0,0xd7,0x29,0xee,0xef,0x18,0x0a,0x92,0x2e,0xff,0x0d,0xf8,0x14,0xc1,0x20,0x99,0xc0,0xd9,0xe8,0x04,0xb2,0xd4,0x2e,0x04,0xcb,0x09,0x02,0x1f,0xdf,0xc7,0xf2,0x1b,0x2d,0x56,0x16,0xf5,0x07,0xf1,0x2f,0xea,0xf3,0xf7,0x13,0xb7,0x1d,0x23,0xdc,0x38,0xcb,0xe5,0xfb,0x2a,0x30,0x32,0x35,0xe4,0x20,0x10,0xa7,0x21,0x0d,0x02,0xf1,0x0c,0xd2,0x22,0x0e,0x02,0x43,0xea,0xed,0xd1,0xec,0x7f,0x00,0xcd,0x08,0xef,0x30,0x04,0xcd,0xdb,0xd5,0x20,0x07,0xdb,0x00,0xdf,0x2e,0xe6,0xfb,0xc3,0xf7,0xa6,0xf4,0x25,0x24,0x17,0x08,0x50,0x32,0xe7,0xfc,0x15,0x2b,0xf8,0x05,0xc5,0xb0,0xd6,0xf0,0xfe,0x0d,0xcb,0xc2,0xda,0xef,0xb8,0x29,0x15,0x43,0xc5,0x21,0x20,0x07,0x04,0xbe,0xc4,0x29,0xc0,0xd6,0xac,0xd6,0xdc,0x03,0xe0,0xcc,0xc0,0xf7,0xd0,0x19,0xc2,0xd4,0xc6,0x2d,0xee,0xda,0xd6,0xa4,0xeb,0xa2,0xf3,0x11,0xa3,0xf9,0xc4,0x3c,0x3c,0x0f,0xc8,0xcf,0xe0,0x18,0xe0,0x33,0xe5,0xc8,0xea,0xf0,0x16,0xff,0xd7,0x0c,0x1d,0x11,0xf6,0x12,0x13,0xf4,0xf6,0xac,0xf8,0xe7,0x01,0xd7,0xf3,0xfd,0xdb,0xf8,0xf5,0xde,0xd9,0xd0,0xfb,0xfc,0xf1,0x2e,0x02,0x2c,0xeb,0xc7,0x0c,0x0e,0xfc,0xda,0x26,0xd5,0xf0,0xd4,0x14,0xb9,0x0d,0xe6,0x2a,0x03,0xfa,0x06,0xd8,0x7f,0xff,0xc7,0x12,0x21,0xdc,0x27,0xe5,0xeb,0x3e,0xcb,0x16,0xd8,0xd7,0x33,0xec,0x1a,0xf6,0xec,0xf3,0x29,0xd9,0xd2,0xea,0x16,0xc0,0x26,0xf1,0xdf,0x0c,0xdd,0x41,0xf2,0xc8,0xcd,0x09,0xd6,0x0f,0xfb,0x36,0x1b,0xeb,0x02,0x2f,0xb7,0x1a,0xdb,0xdc,0x2b,0xfe,0xdb,0xe8,0xd1,0xca,0x16,0xff,0x18,0xf4,0xf5,0xd1,0xdc,0xf8,0xed,0xda,0x34,0x02,0xe9,0x15,0x1c,0xc3,0x16,0x2c,0x0f,0xbd,0x13,0x06,0xfa,0xe2,0xda,0xa4,0xed,0x18,0xe4,0xf6,0xfb,0xd6,0x18,0x16,0x02,0xf9,0xcb,0xca,0xf9,0xfe,0xf7,0xe9,0xd3,0xe7,0x3a,0xe8,0xda,0xf6,0xf5,0xe9,0xdd,0x32,0xe0,0xee,0x2b,0x1f,0xea,0xff,0x1e,0xdb,0xda,0x09,0x15,0x2d,0x0f,0x0b,0xfe,0xf8,0x1d,0x07,0x05,0xf6,0x1b,0xef,0xbf,0x22,0x11,0xd7,0xee,0xed,0x0f,0xb6,0xdc,0xfb,0x33,0xea,0x02,0xe3,0x16,0xc6,0x24,0x02,0xfa,0x12,0xfd,0xc1,0xf7,0x1a,0xf6,0xfb,0xd3,0x09,0x25,0xd9,0x2f,0xe8,0xf9,0x0a,0xf0,0xf6,0x31,0x3d,0x22,0x31,0xef,0xdd,0x12,0x09,0x02,0xf5,0xfd,0xde,0x11,0x23,0x2c,0x0d,0xb9,0x06,0xf8,0xe9,0x1b,0xe5,0x04,0x1b,0xe7,0x0f,0xe4,0x06,0xf9,0x2e,0x19,0xd6,0x20,0x1c,0xb9,0xf7,0xc0,0x08,0xe2,0xdb,0xf6,0x00,0xed,0xf9,0x34,0xec,0xe7,0xc5,0x2c,0x0d,0x1d,0xb8,0xdc,0x19,0xd3,0x30,0x08,0x3a,0xf4,0x12,0xd3,0x12,0x03,0xdc,0xb1,0x06,0x18,0x3a,0x1f,0xc5,0xea,0x19,0xf1,0xea,0xfe,0xef,0xd1,0xcf,0x22,0xe8,0x24,0x28,0xc9,0x40,0x02,0x1e,0x0f,0xcb,0x0c,0x28,0x35,0xca,0xad,0xe5,0x35,0x0d,0x1b,0xe6,0x0c,0x11,0xe0,0x28,0x35,0x13,0x09,0xdd,0x05,0x3e,0xf9,0x0c,0xd9,0xdc,0x0a,0xb2,0x11,0xc7,0xf7,0x28,0xd4,0xdc,0xed,0xd3,0x18,0xed,0x14,0x39,0x0c,0x1f,0xfc,0xf0,0x1d,0xf5,0xa4,0x3a,0x37,0x3e,0x26,0xd4,0x28,0xe6,0xdf,0x5f,0x15,0x11,0xf5,0x20,0x0d,0xf1,0x01,0x05,0x03,0x19,0x1e,0x06,0x48,0xef,0xe4,0x21,0xde,0xfe,0xdc,0xe4,0xc2,0x0d,0xd7,0xe1,0x0c,0xca,0x13,0x2d,0x0d,0xf1,0xed,0xba,0xe6,0xae,0xf5,0x29,0x00,0xcc,0xfa,0x07,0x46,0x15,0xd8,0xd0,0xd9,0xec,0xe4,0xca,0xde,0xf9,0xd1,0xef,0xc9,0xe2,0x0e,0xd2,0xfe,0x04,0x1a,0x18,0xf3,0x2e,0xfa,0x15,0x67,0xfd,0xc3,0xf4,0xc7,0xec,0xdd,0x19,0x0c,0xd9,0xfd,0xd6,0xd8,0x45,0xe3,0xe1,0xed,0xe6,0xf7,0xd9,0xda,0xea,0x1c,0x41,0x13,0x25,0x0e,0x02,0xfa,0xc3,0xde,0x68,0x00,0xfa,0x01,0x1e,0xc5,0xf9,0x14,0x11,0xda,0xf5,0xec,0xf9,0xc8,0xf7,0xf4,0xd4,0x18,0xf3,0xd8,0xe8,0x0e,0x0e,0x02,0xea,0x07,0x3d,0xb8,0x2f,0xd5,0xfd,0xe3,0xf4,0x66,0x28,0xfa,0x20,0x03,0x1f,0xf1,0xd4,0xcc,0xd4,0x13,0xd5,0x7f,0x0a,0xee,0x02,0x18,0x2c,0x00,0xea,0x3e,0x18,0x09,0xf6,0x06,0x46,0xfe,0xed,0xb6,0xff,0xec,0xe5,0xc6,0x26,0x07,0x1f,0xff,0xfe,0x04,0x21,0x0a,0x01,0xe7,0xc5,0xf5,0x2d,0xe8,0x1a,0x1e,0xe6,0xd7,0xfa,0xe5,0xee,0x01,0x1e,0xbd,0x15,0x08,0x4d,0xdd,0x01,0x0d,0x17,0xbf,0x0b,0xe5,0x1a,0xbb,0xc3,0xb7,0xd6,0x0e,0xf1,0xed,0x15,0x39,0x21,0x2b,0x27,0x0e,0x04,0xd5,0xe0,0xf8,0xeb,0xb0,0xd5,0xde,0x10,0x08,0xcb,0xf7,0x15,0xe5,0x1c,0xa3,0xdb,0x31,0xcb,0xdb,0x4e,0x30,0xea,0x18,0x41,0xdc,0x09,0xcf,0x0e,0xf9,0x04,0xc4,0xc8,0xe1,0x08,0x46,0x05,0xd3,0xec,0xb9,0xd8,0x00,0x58,0xeb,0x3a,0xb3,0xc8,0xf1,0x0d,0x08,0x1f,0x06,0xdb,0xf6,0xf8,0xcd,0x24,0xd9,0x1a,0x18,0x0a,0xe5,0xe4,0x2d,0x13,0xee,0x18,0xaf,0xba,0xd1,0x0c,0xea,0x0f,0x17,0xec,0xbc,0x7e,0x2e,0x08,0xc5,0xe4,0xeb,0xd9,0xf4,0xc8,0xea,0xca,0xc8,0xe6,0x33,0x81,0x13,0x06,0xf5,0xf0,0xf9,0x3c,0xe8,0xd3,0xde,0xc6,0x00,0x2e,0xf2,0xe4,0x27,0xe0,0xb9,0xf3,0xff,0x2d,0xd7,0xf5,0x1a,0xcb,0xe9,0xf8,0x43,0x03,0x05,0x08,0xce,0xfd,0xf7,0xd0,0x0c,0xfb,0xe5,0xd4,0xaa,0x19,0xd2,0xd7,0x11,0xed,0xce,0xf3,0xe6,0xe0,0xf7,0xc7,0xde,0xb2,0x0e,0xc4,0x08,0x38,0xf3,0xe7,0xe8,0xf8,0xef,0xec,0x0a,0x41,0x00,0x01,0xec,0xec,0xe3,0x03,0x31,0xaa,0x1d,0x1c,0xff,0x2d,0xb8,0x3c,0xb1,0xdf,0xfb,0xd1,0x28,0xf1,0xe3,0xf4,0xe4,0x2e,0xcf,0xe2,0xba,0x11,0x26,0xbf,0x01,0xb1,0xd2,0xc2,0x0e,0x88,0xed,0x14,0x0a,0xdf,0x48,0xba,0x16,0xbc,0xe2,0x18,0xb9,0xf5,0xe2,0xd2,0x06,0x14,0xec,0x8c,0xdf,0x1b,0x13,0xd7,0xcf,0xf7,0xd9,0xc2,0xd3,0xdb,0xff,0xf2,0x46,0xe1,0xe3,0xcd,0xa2,0xf0,0xef,0x24,0xf8,0x14,0xe0,0x12,0x07,0xbd,0xf8,0x16,0xf6,0x0f,0xa7,0x0c,0xb7,0xab,0xe3,0xd8,0x9c,0xed,0x08,0x20,0x16,0x1b,0x27,0x19,0xb7,0x02,0xda,0xd1,0xf6,0xb3,0x25,0xaa,0xe2,0x13,0x1d,0xfe,0xf1,0xc0,0xdc,0xc6,0xf9,0x17,0xd4,0xf8,0xe4,0xfb,0xdb,0xa6,0xed,0xf6,0x03,0x2f,0xd5,0xe1,0xb3,0xb3,0x13,0xec,0x06,0xde,0xee,0x06,0xbe,0x1f,0x08,0x1a,0x23,0x04,0xd1,0xb8,0x07,0xb8,0xe3,0x13,0x0f,0x18,0x05,0xc0,0xd5,0xf8,0x35,0xa4,0x22,0xe3,0xf2,0x0d,0x0f,0xd4,0xfc,0xb2,0xd6,0xdc,0xeb,0xd1,0x1e,0x30,0xb9,0xcf,0xff,0x0f,0xe6,0x0a,0xc7,0xea,0x0a,0x37,0x8f,0x21,0x1e,0xaf,0x29,0x1d,0xe6,0xda,0x26,0x14,0x1d,0x66,0xe9,0xab,0xcc,0xed,0xa5,0xd6,0x2c,0xff,0xf6,0x04,0xcc,0xda,0xf3,0x1f,0xdc,0x00,0x35,0xce,0xde,0xb5,0x15,0xf3,0xbb,0x01,0xce,0xea,0xcd,0xdc,0xff,0x00,0x09,0xc2,0x04,0xee,0xcb,0x37,0xf0,0xf5,0xaa,0xac,0xef,0xc8,0xbe,0x10,0xfe,0xdd,0x37,0x1f,0x23,0xdf,0xee,0x98,0xf6,0x0b,0x02,0xeb,0xff,0xea,0x10,0xcd,0xf6,0xc6,0x18,0xc7,0xd2,0x33,0x35,0xff,0x22,0x03,0x9b,0x51,0xc3,0x00,0x76,0xc6,0xf6,0xbe,0xd2,0x27,0xf4,0xf8,0x28,0x09,0x22,0x16,0xea,0xb1,0x02,0xe6,0x7f,0x2e,0xe4,0xfa,0x0e,0x07,0xf1,0xc0,0xe0,0xec,0xff,0xef,0xd8,0x17,0x9f,0xd0,0xdf,0xf8,0xef,0xec,0xd1,0x10,0xf4,0xfd,0xf6,0x13,0xd4,0xe3,0x66,0xea,0xfe,0x3b,0xfe,0xfc,0x19,0x20,0x22,0x08,0xc4,0xf9,0x0b,0xdc,0x02,0xd6,0xe9,0x29,0x19,0xdc,0xe5,0xf4,0x58,0xef,0x24,0xd3,0xdf,0xb7,0x36,0xf5,0x22,0xc4,0xde,0xce,0xd7,0x39,0x20,0x06,0x08,0xf4,0xc7,0x30,0xfa,0xe6,0xe6,0xc7,0x08,0xfb,0x22,0xb9,0x0d,0x1b,0x1a,0x17,0xe4,0x18,0xcd,0xe0,0x11,0xe6,0x1d,0xf5,0xcc,0xc0,0xea,0xd8,0x32,0xf0,0xe7,0x5a,0xf5,0xc9,0xff,0xee,0xca,0x32,0xec,0xf8,0x2c,0x0c,0xd3,0xd7,0x30,0x0c,0xe5,0xd7,0xf5,0x18,0xe6,0xe7,0x27,0x0a,0x10,0xcb,0x0c,0xe7,0xef,0x15,0xe5,0xea,0xff,0x13,0xeb,0xd3,0x14,0x14,0x01,0x0f,0x0f,0x07,0xe1,0xfc,0x93,0xcc,0x0c,0x32,0xea,0x1c,0x06,0x16,0xd7,0xec,0x13,0xe3,0x7f,0x27,0xe9,0x32,0x0f,0xfa,0x51,0x1b,0xba,0xfb,0x2d,0x03,0x16,0xfd,0x05,0xd8,0x10,0x0d,0xbc,0x0f,0x18,0x01,0xe1,0xea,0xe5,0x2a,0xe9,0xe2,0xec,0xf8,0xf6,0x57,0xf2,0xf2,0x05,0x06,0xf6,0xde,0x1c,0xe6,0x03,0xfa,0xec,0xcb,0x0e,0x19,0x1a,0x23,0x01,0xda,0xfe,0xe4,0xbf,0x14,0x00,0xf3,0x0c,0x42,0x11,0x00,0x0a,0x2f,0xf3,0xbf,0x09,0xd8,0x19,0xf6,0xe4,0xe2,0x15,0x55,0xdd,0xeb,0xcc,0x14,0xd3,0x22,0xee,0xd7,0xf6,0x05,0xed,0x05,0x02,0xea,0x02,0xc3,0xe8,0xee,0x07,0x0c,0x10,0xda,0xfb,0xe9,0x05,0xf0,0xd0,0xe7,0xd2,0x05,0xfc,0xdc,0xf0,0xec,0xff,0xe9,0xec,0xc0,0xc8,0xe1,0xf0,0xf9,0xe0,0xfd,0x1e,0xd6,0xbe,0xf4,0xfa,0xdd,0xc6,0x1d,0xfe,0xff,0x06,0xda,0x0b,0xf9,0xdf,0xf2,0xfb,0xf3,0xfe,0xe7,0x09,0x00,0x1a,0x23,0xfd,0xe3,0x33,0xfd,0xf9,0x10,0x01,0x1b,0xdf,0xf0,0xcb,0x09,0x16,0x13,0xd4,0x0b,0xd1,0xec,0xeb,0xef,0x13,0x12,0xbe,0x20,0xd2,0xf0,0xce,0xfe,0xf1,0xd3,0x0e,0x2c,0xd4,0x0e,0xf5,0x25,0xd3,0xf6,0xeb,0xee,0xc9,0x14,0xea,0xd7,0xe1,0xea,0x09,0x3b,0xfc,0xca,0x17,0xd3,0xf1,0x20,0xaf,0xf1,0x1c,0xbf,0xe1,0xe5,0x04,0xc2,0xf5,0x1a,0xe9,0xf0,0xd9,0xf5,0x11,0xfd,0xe5,0xf2,0x16,0x07,0x12,0x33,0xb6,0x31,0xc7,0xef,0xdb,0x0a,0x18,0xc5,0xfd,0xea,0xf7,0x11,0x07,0xe8,0xfb,0xf4,0xfd,0x07,0xd5,0x0f,0xbe,0x12,0x19,0xfd,0xf9,0xd7,0xd0,0x05,0x26,0xd1,0xf5,0xe4,0xe0,0xf2,0x1a,0xf6,0xdb,0xe5,0xd9,0x2c,0x14,0x1a,0x2f,0xed,0xd2,0x2a,0x2e,0x13,0xf9,0xe1,0xa3,0xf8,0xe3,0xe6,0xdf,0xcc,0xe5,0x0d,0x03,0xd9,0xf2,0xf3,0x1c,0x2e,0xf5,0x1c,0x21,0xd5,0xe2,0x21,0xdb,0x0b,0x02,0xef,0x03,0xff,0xf2,0xde,0xdc,0xe5,0xd7,0x02,0xe1,0xf1,0x04,0xf5,0x05,0xd5,0xf1,0x09,0xe4,0xcf,0xfc,0xf8,0x05,0xd0,0xdc,0x15,0xea,0x28,0x2b,0x1c,0x0c,0xe5,0xee,0xb8,0xf3,0x11,0xf1,0xf7,0xe7,0x03,0xc0,0x0a,0xd5,0x1f,0xcf,0x18,0xf1,0xea,0x02,0xd1,0xe8,0xd6,0xfe,0xfd,0xee,0x02,0x31,0x0f,0xc3,0xeb,0x08,0xcf,0xfd,0xd1,0xf0,0x0a,0x1c,0x15,0xf6,0xae,0xc3,0x07,0x49,0xe6,0xe0,0x03,0xde,0xbc,0xf7,0xd6,0xf4,0x81,0x3f,0xee,0xd5,0x96,0xe3,0x14,0x74,0xf7,0x02,0x04,0xf3,0xda,0x1b,0x3c,0x27,0x10,0xf0,0x4a,0xc6,0x98,0x51,0xfa,0x0f,0x27,0x11,0xb0,0xa0,0x07,0xef,0x4f,0xef,0x1c,0xdf,0xde,0xcf,0xf2,0x43,0xd7,0xe9,0x92,0x0e,0xe5,0xf7,0xe3,0x93,0xbb,0xd7,0xe8,0xda,0x10,0x15,0x09,0xf3,0xdb,0x05,0xe3,0xe2,0xd3,0x63,0x89,0x01,0xc9,0x3b,0x24,0xcc,0x47,0x06,0x06,0x2c,0x0c,0xe4,0xe2,0x8f,0x04,0x05,0x1e,0xc2,0xdd,0xf8,0x60,0x0b,0x06,0x23,0x30,0xed,0x2d,0x26,0x1f,0x0d,0xca,0x33,0x35,0x2f,0xed,0x4a,0x07,0xef,0x09,0xd3,0x9e,0xc6,0x35,0xd9,0xde,0x00,0x13,0x58,0x0b,0xfb,0xe3,0x0b,0x08,0x06,0xd1,0x33,0xea,0xaf,0xe6,0xd5,0x67,0xe3,0xb9,0xf7,0x1f,0x0e,0xf2,0xbf,0x58,0x06,0xff,0xa3,0xc6,0xf4,0x42,0xc8,0xfd,0x28,0x1d,0x09,0x22,0x21,0xe8,0xd7,0xf2,0x0c,0x8b,0xa0,0x0b,0x00,0xbf,0xe4,0xce,0xf6,0x65,0xf3,0xfc,0x25,0x18,0xf4,0x02,0xd4,0x10,0x02,0x34,0xd3,0xf6,0xbb,0x1e,0x02,0x0c,0x1f,0x16,0x9a,0x5c,0xc0,0xd1,0xd0,0x04,0xf9,0xfc,0x9d,0xa5,0xf2,0x08,0x3e,0xc8,0xce,0x0e,0x0f,0xcb,0xc8,0xfa,0x3e,0xe2,0xbe,0x0f,0x51,0xdb,0x3b,0x07,0xf4,0xdf,0x25,0x1b,0x15,0x1b,0x07,0xf0,0x28,0x07,0x81,0xef,0xfe,0xe5,0xa1,0x29,0xc6,0xdc,0x0a,0xf2,0x00,0xb1,0xd8,0x15,0x04,0x50,0x45,0x1b,0xf9,0xf4,0xe8,0x07,0xc3,0xce,0x3c,0xde,0x47,0x10,0x01,0x2f,0x23,0xf7,0xd4,0xd4,0xd8,0xfe,0x45,0xea,0x23,0x1b,0x10,0xd2,0x24,0xdc,0x0c,0x00,0x25,0xfb,0xa3,0xe4,0xf6,0xcf,0x5e,0xfd,0x13,0xd1,0xf4,0xe7,0xe6,0xc1,0xb9,0xc4,0xc6,0x1c,0x8e,0x09,0x3a,0xda,0x03,0xf4,0xe5,0x35,0xfc,0x08,0xee,0x81,0xf1,0x20,0x11,0xf2,0xcd,0xb2,0x2a,0x28,0x31,0x25,0xb4,0xf6,0x21,0xd2,0xf9,0xa5,0xf7,0xb8,0xf2,0x12,0x02,0x29,0x3b,0x08,0xc4,0xbb,0xe3,0xce,0x16,0xc9,0x20,0xd7,0x47,0x0c,0xa6,0x10,0x18,0xfb,0x4f,0xc0,0xc1,0x17,0xd8,0xb9,0xf4,0xd9,0xcf,0x07,0x2a,0x2e,0x10,0xfc,0x22,0x4f,0x94,0x2b,0x15,0x1b,0xbe,0xb0,0xa6,0x37,0xf1,0x19,0xdb,0xe3,0xe4,0xfc,0x26,0xee,0xe0,0x2b,0xdd,0xba,0x1e,0x06,0x05,0xbe,0xe6,0xc5,0x1f,0xd0,0xce,0xb5,0xd0,0xfd,0xbf,0x9d,0xcd,0x1f,0xe8,0x5f,0xd7,0xb1,0xf6,0x0d,0xb5,0x4c,0x0b,0xd2,0xf5,0x1f,0x04,0xe6,0x12,0xcf,0xbb,0xe6,0xf3,0xcb,0x3d,0x24,0xc1,0xe6,0x97,0xa3,0xf4,0x3b,0xd3,0x13,0x34,0xbc,0x23,0x2b,0x19,0xb2,0x45,0xc4,0xb7,0xe7,0x3b,0xf0,0xf0,0x02,0xab,0xc8,0x95,0x32,0x14,0x0a,0x4e,0xba,0x4b,0x2a,0x9c,0xf4,0xe1,0xfe,0xe9,0x2d,0xe9,0x3c,0xed,0x03,0xf8,0x11,0xf5,0xed,0x0b,0x1a,0x16,0x06,0x25,0xb1,0xb5,0xdc,0x3e,0xea,0x38,0x40,0xa5,0xfe,0xd6,0x48,0x0f,0x9e,0xd1,0xc4,0x3b,0x0b,0xb1,0xe6,0x1b,0x0a,0xc0,0xdd,0x0e,0xaa,0x66,0x02,0x11,0xfb,0xff,0x0a,0xc2,0xb3,0xf6,0xfa,0xe7,0x67,0x0a,0x08,0x22,0xf5,0x41,0x0d,0xc3,0xda,0x0b,0x14,0x3c,0xf2,0xcc,0xf6,0x33,0xe7,0x50,0xfa,0xa4,0x2a,0x16,0x27,0x2a,0x9c,0x33,0xd2,0xbf,0xcf,0x02,0xf6,0xba,0xf5,0xcf,0x1e,0xf0,0xd7,0xb0,0xe2,0x81,0xf9,0x02,0xb9,0x02,0xe5,0xe9,0xf7,0xd2,0xf2,0xe2,0x06,0xfc,0xe0,0x03,0x0a,0x30,0xd9,0xef,0x24,0xc4,0xf0,0xbc,0xf9,0xdb,0x0c,0xd5,0x09,0x03,0x43,0xbc,0x4e,0xf7,0x08,0x00,0x15,0xec,0x19,0xc9,0xe6,0xc0,0xd4,0x03,0x00,0xe0,0xd0,0xa1,0x16,0xeb,0x0f,0x2e,0xfe,0x02,0x04,0xcf,0x07,0xda,0x32,0x0d,0xf8,0xbe,0x1a,0x34,0x15,0x35,0xea,0xe9,0xff,0xdd,0xe5,0x2a,0xc9,0xfe,0x19,0xf8,0xbe,0xd2,0x25,0xea,0xe2,0xf5,0x26,0xe0,0xb6,0xfb,0xe4,0xd0,0x22,0x37,0x22,0x8f,0x11,0xe6,0xe1,0x1a,0x0a,0xbf,0xd8,0xe3,0xd1,0xee,0xd8,0x32,0x4a,0xb1,0xce,0xec,0xde,0xee,0xcc,0x25,0x07,0xf4,0x33,0x02,0xf9,0x33,0x23,0xd0,0xf6,0xd1,0x08,0xdd,0xe4,0xd9,0xbe,0xe1,0x2d,0xc3,0xed,0x03,0xbc,0x3b,0xc3,0xd0,0x44,0x08,0x14,0xcb,0xca,0xa6,0xb1,0xe9,0xa6,0xf5,0x41,0x39,0xf4,0x01,0xed,0x4f,0x1d,0xed,0xc5,0x40,0x2c,0x29,0xd1,0x45,0x0a,0xe1,0x32,0x50,0xf5,0x31,0x10,0x05,0xdd,0xfc,0xbc,0x20,0x2c,0x0e,0xdb,0xf7,0xfc,0xf6,0xa9,0xcb,0xff,0xf1,0xc8,0xd6,0xec,0xb1,0xd8,0xbb,0x3d,0xf9,0xec,0x03,0xe1,0x12,0xbb,0xeb,0x1d,0x1e,0xea,0xed,0xf1,0x0e,0x11,0xe5,0x05,0xf1,0xf7,0x13,0x29,0xcb,0x0e,0xc0,0xec,0xf7,0x09,0x01,0xb4,0x00,0x3e,0xc2,0x23,0xeb,0x1f,0xbe,0xaf,0x0f,0xbe,0x09,0xc2,0xf5,0xe6,0x9e,0x04,0xbe,0xd1,0xea,0xd6,0x28,0xaa,0x06,0xd8,0x03,0xe8,0xf6,0xc6,0x24,0x10,0xe0,0xe1,0x17,0xdd,0xe0,0x0c,0x0a,0xf9,0xf8,0xd3,0x4a,0x13,0xd1,0x0b,0x24,0x17,0xd3,0x04,0xd9,0x10,0x37,0xc2,0x67,0xf6,0xf4,0xeb,0x0c,0x1d,0x24,0x12,0x1f,0x09,0x42,0xff,0x32,0xe7,0xca,0x2a,0x04,0x40,0x30,0xe8,0xfb,0xc2,0xfc,0xe7,0x0b,0xf8,0x2c,0xed,0x0a,0x13,0x4e,0xc5,0x2d,0x30,0xe7,0x26,0xcb,0x09,0x53,0xfc,0xf2,0xd4,0xd7,0x0a,0xee,0x05,0x12,0x25,0xff,0x0d,0xd3,0xd9,0x17,0x0f,0xf8,0x1f,0x26,0x06,0x02,0x0f,0x20,0x09,0x33,0x10,0x12,0x09,0xfd,0xf6,0xde,0x7f,0x12,0xf4,0x0f,0xc0,0x05,0xce,0x0e,0x05,0xf7,0xd9,0x14,0xe3,0x07,0xa0,0x2e,0x23,0x43,0xfd,0xf8,0xdb,0xfd,0xec,0xdb,0xaf,0xe6,0x23,0x0b,0xd6,0x09,0xe3,0x14,0x13,0x07,0xe5,0xd3,0x43,0x13,0x18,0xff,0xec,0x00,0xe9,0xf8,0xc7,0xeb,0xe2,0xfd,0x09,0x35,0x22,0x36,0x18,0xf0,0x1b,0x0c,0x02,0xf3,0xa8,0xdb,0xe1,0xfd,0x06,0xdf,0x12,0xc3,0xf1,0xf0,0xbe,0x0c,0x2b,0x3b,0x38,0x33,0x5f,0x7c,0xf6,0x08,0xf8,0xee,0xb7,0x03,0x26,0x5e,0xf6,0xfa,0xd8,0x18,0x07,0x03,0xfe,0x1e,0xee,0x38,0xb0,0x0c,0x2c,0xc6,0x22,0xe0,0x05,0x11,0x01,0xff,0x03,0x0f,0x08,0x19,0xfa,0x03,0xb2,0xd7,0x40,0x2c,0x0c,0x0b,0x24,0x08,0xb3,0x36,0xd4,0xbe,0xeb,0xe2,0x1e,0xfc,0xf7,0xe6,0x08,0xfa,0xed,0xcf,0x09,0xb3,0x30,0xf4,0xfb,0x16,0xf7,0x1c,0xfd,0x2a,0xd5,0xff,0xf5,0xf7,0xee,0x25,0x04,0x08,0x05,0xdc,0xe3,0xef,0xc4,0x1a,0x02,0xd2,0xf6,0x4c,0xb3,0xf7,0xc8,0xf3,0x36,0xff,0xe7,0x33,0xd2,0xf9,0xf6,0x0c,0x88,0x09,0xb3,0xe2,0xc7,0xe7,0xf8,0x27,0xda,0xbc,0xf1,0xac,0xf9,0x0f,0xc5,0xba,0xe3,0xb1,0x04,0xfb,0xfc,0x40,0x2e,0xde,0xb6,0xdc,0xbb,0x25,0x2b,0x0f,0x1c,0x21,0xf3,0x31,0x15,0xf2,0x25,0xf1,0xe0,0xc5,0x22,0xc3,0xed,0xdc,0x4d,0xdb,0xf3,0xd3,0x55,0x38,0xf3,0xd7,0xac,0xf3,0x04,0xa4,0x3c,0xd2,0xee,0xe1,0xd7,0xfc,0xde,0xdb,0xe8,0xd6,0x0a,0xb3,0x65,0x0d,0x2e,0xca,0xfe,0xe9,0xca,0xc4,0x81,0x16,0x47,0xb6,0x5d,0xcf,0xac,0x39,0xff,0x38,0xdb,0x49,0xcd,0xe0,0x34,0x07,0x4e,0xc1,0x0c,0x1f,0xb6,0xaa,0x1e,0x2d,0x0e,0x29,0xed,0x30,0xdc,0xba,0xc7,0xf4,0x2f,0x6e,0xbe,0x31,0xf8,0xdd,0xb8,0x05,0xfc,0xee,0xe8,0xda,0x0b,0xb7,0xf7,0x02,0x0f,0x85,0x9f,0x3d,0xd2,0x3d,0xff,0xd1,0xc0,0x27,0xe5,0x0f,0xff,0xfc,0xcf,0x10,0x4b,0xf5,0xf5,0x08,0x2b,0xeb,0xe5,0xd9,0xd2,0xc4,0xd4,0xf0,0xd8,0xfc,0xac,0xe6,0xe6,0xc7,0x15,0xf1,0xfc,0xc3,0x09,0x15,0xc9,0xe2,0x00,0x44,0x41,0xbf,0x49,0x21,0x17,0xdb,0x83,0xa3,0xc2,0xfb,0x26,0x1a,0xf4,0x26,0x20,0xd1,0xa7,0x1f,0xe6,0x06,0x99,0x07,0x16,0x4d,0xb1,0x3e,0xc7,0x2b,0x30,0xdc,0xed,0xed,0xf7,0xd9,0xe8,0x1c,0xdf,0x17,0xaf,0xfb,0xdf,0xfb,0xe0,0x18,0xe3,0x39,0x15,0xf9,0x3d,0xaf,0x3e,0x10,0xb6,0x3b,0xf3,0xee,0xcf,0xfa,0xe4,0xd2,0xf4,0x02,0xf4,0x15,0x24,0xf2,0xea,0xfb,0x12,0x4e,0xe3,0xfd,0xff,0x26,0x13,0x38,0xe9,0xe0,0x06,0x26,0xf2,0xff,0xde,0xef,0xe4,0x3d,0xe6,0xe6,0xd3,0xf1,0x05,0xcd,0xc8,0xe4,0xc2,0xe0,0x00,0xea,0xe2,0x11,0xfc,0xd7,0xe7,0xcd,0xe8,0xb5,0xc6,0x06,0xf3,0xbc,0xda,0xd6,0xce,0x05,0xfa,0xf0,0xe1,0xfd,0xe6,0x35,0x49,0xfc,0x00,0xf8,0xed,0x1e,0x24,0x81,0x2d,0x11,0xe6,0xfe,0xdc,0xba,0xb8,0xf7,0x26,0x04,0x12,0x1e,0x24,0x6f,0x0b,0xf9,0xcd,0xd4,0x0c,0xce,0x15,0xc6,0xe8,0xb3,0x05,0x0f,0xac,0x2a,0xbd,0xf5,0x2f,0xdf,0xd3,0x00,0xed,0xd2,0x12,0xed,0x19,0x36,0x1a,0xf3,0xe6,0x02,0x21,0x10,0xfe,0xdb,0xa6,0xdc,0xd2,0x10,0x6b,0xd7,0xde,0xce,0xfd,0xc2,0x12,0xd2,0xfd,0xe4,0xd0,0xe2,0xfb,0x11,0xdc,0xc0,0xda,0xd4,0xf8,0x0e,0x05,0xdd,0xf9,0xee,0x2e,0x22,0xe6,0xc2,0xd9,0x0b,0xf6,0xe0,0x21,0xf9,0xdf,0x32,0x0c,0x14,0xbc,0xc3,0x17,0xf2,0xe0,0xe9,0xf4,0xf7,0x0c,0xdd,0x3b,0xbc,0xdb,0x1b,0xdf,0xfb,0xd9,0x06,0xcb,0xde,0x1a,0x35,0x21,0x16,0xe7,0xd7,0x19,0xfb,0x2b,0xc1,0xd2,0x0f,0x2c,0x02,0x22,0x09,0xf0,0xcd,0xd8,0x1f,0xaf,0xf2,0xd1,0x04,0x05,0xbc,0xd2,0xea,0x30,0xeb,0xee,0xe8,0xef,0xd7,0xce,0xbe,0xff,0xbe,0xa8,0xbc,0xdc,0xfd,0xea,0x07,0x00,0xe2,0xee,0x27,0xe6,0xe7,0x01,0xf8,0x07,0xf3,0x07,0x01,0xf7,0xec,0xe8,0xf9,0xee,0xfe,0x14,0x01,0xdd,0x2d,0x31,0x25,0xf1,0xfe,0x22,0xf7,0xcf,0x09,0xcf,0xfe,0xfb,0xdd,0xcc,0x3d,0x2f,0xed,0xf1,0xe5,0xaa,0xed,0xe2,0xea,0xca,0x00,0xf8,0xf6,0xe7,0xf6,0x0c,0x0b,0xd0,0x18,0x01,0x1f,0xb3,0x1f,0xf0,0x07,0xad,0xf1,0xca,0xc4,0xec,0xf5,0x36,0xa4,0x15,0xd1,0xf5,0xae,0xcb,0x21,0x81,0xfd,0xcc,0xd0,0x00,0xbf,0xe2,0x0c,0x27,0x64,0x22,0x49,0x21,0xbd,0xfd,0xdb,0xd9,0xa7,0x04,0x04,0xe3,0x30,0xf4,0xfb,0x2b,0xc6,0xef,0xfe,0x1c,0xe4,0xdd,0x01,0x43,0xef,0x4b,0x72,0x5c,0x33,0x37,0xe5,0xe4,0x01,0xea,0xb0,0x0b,0x43,0xde,0x06,0xe4,0x30,0x5c,0xea,0xcd,0xe5,0x1e,0x13,0xe9,0x0a,0x2e,0xcf,0xd9,0x35,0x13,0xb7,0xf3,0x1f,0xeb,0xc5,0x1c,0x09,0x13,0x02,0x20,0x13,0x9e,0x20,0xe2,0xba,0x0d,0xf8,0xdf,0x45,0xeb,0x1c,0xf6,0x03,0xec,0xe5,0x5e,0xbb,0x2a,0xd3,0xc1,0xce,0xb5,0xe7,0xff,0xfc,0xf6,0x1c,0xb6,0x11,0xa6,0xe6,0x1b,0xfa,0x32,0x24,0xee,0xca,0xdd,0xe6,0x17,0x9a,0xef,0xea,0xd8,0x47,0xf0,0x14,0x37,0xd5,0xff,0x8a,0xe8,0x03,0xf6,0x8e,0x14,0xec,0xc4,0x3e,0xfc,0xd4,0x11,0xd9,0x96,0x9f,0x11,0xf3,0x14,0xa6,0xdd,0x1a,0xfd,0xa8,0xcf,0xdd,0x18,0xf4,0xd0,0x5c,0xf3,0x25,0x02,0x2b,0x3a,0x44,0xe0,0xce,0xf1,0x09,0xbe,0xe2,0x1f,0xa3,0x11,0xf9,0xe7,0x45,0xcd,0xeb,0xda,0xe0,0xd0,0xd6,0x3c,0xf9,0x63,0xc2,0x46,0x30,0xd3,0xf9,0xfa,0xec,0x97,0x3f,0x36,0x1b,0xe7,0x0f,0xed,0x0d,0xe3,0x18,0x42,0xcb,0x0d,0x37,0x13,0x13,0x49,0xd2,0x01,0xcf,0xd6,0x27,0xfc,0x0e,0xec,0xb7,0x1a,0xc6,0xf3,0x15,0x60,0x08,0xf9,0xe8,0x3b,0xc3,0x34,0xfc,0x02,0xa8,0xcf,0x26,0x37,0xed,0xee,0xfc,0xce,0x15,0x63,0xb6,0x3e,0x09,0xfb,0xec,0xfd,0x00,0xc1,0xf3,0x08,0x9e,0xe7,0xcc,0xcf,0xed,0xf4,0xd5,0xf8,0x11,0xdd,0x12,0xe8,0xfc,0xeb,0x05,0x03,0x12,0xf8,0x12,0xf8,0xdb,0x0c,0xda,0x1a,0xe8,0x23,0xd9,0x16,0x21,0xde,0xe0,0x33,0x00,0xd5,0x0d,0xeb,0xfd,0xfd,0xd2,0x23,0xf9,0xda,0xcd,0xd8,0x1e,0xdf,0x13,0x51,0xe8,0xf1,0x0b,0x1e,0x1e,0xf7,0x19,0xff,0xd8,0xde,0xdb,0x1b,0xe5,0xf4,0xce,0x0a,0xfc,0x0b,0x00,0xdd,0xf0,0xde,0xcd,0xbb,0xec,0xc4,0xe0,0x25,0xe0,0x13,0xef,0xef,0xd6,0xe4,0xeb,0x0d,0x0c,0x15,0xeb,0x0b,0xd8,0x20,0x12,0x03,0x81,0x01,0x07,0x18,0xfb,0xb5,0xb6,0xaf,0xb7,0xd8,0x0f,0x00,0x17,0xde,0xd1,0x24,0x16,0xfc,0xfa,0x0e,0xed,0xea,0xe3,0x09,0x06,0xd1,0xe3,0x38,0x11,0x03,0xe6,0xcd,0x0a,0x0d,0xd9,0xeb,0xbb,0xe4,0xd5,0xb5,0x14,0x0d,0x09,0xf3,0x22,0x04,0x03,0xe3,0x03,0xce,0xdf,0x1a,0xc7,0xdf,0xdd,0x1c,0x1e,0x0b,0x01,0xf4,0x0d,0xff,0x18,0xf3,0x1a,0xff,0x53,0xff,0x19,0xfb,0x2f,0xf4,0xca,0xea,0x40,0x1b,0xf3,0x09,0xf9,0xbc,0x01,0xec,0xe7,0xdf,0x01,0xb4,0x2c,0xf4,0xd6,0xf8,0x05,0xca,0xf9,0xe3,0xef,0xdc,0xfe,0xf4,0xf3,0xee,0xfc,0x05,0x2f,0xbf,0xd4,0x0e,0xed,0x0e,0xfb,0xe5,0xf0,0xe3,0xe3,0x05,0x0b,0xec,0xde,0x13,0xd6,0xd3,0xe1,0xf6,0xd4,0xee,0x22,0x27,0x14,0xf3,0x1b,0xec,0xd0,0xfd,0xc9,0xe9,0x03,0xee,0x13,0x0c,0x2d,0xeb,0x03,0x9d,0x1a,0xed,0x39,0xf7,0xde,0xaa,0xd2,0xfc,0x4f,0xd4,0xf6,0xba,0xf9,0xe9,0xd3,0xea,0x17,0x93,0x2d,0xfe,0xf9,0x00,0x00,0x08,0xb7,0xfb,0x8d,0x2c,0x40,0xc1,0x42,0x1f,0xbb,0xd3,0x41,0xfb,0x13,0xe6,0xa8,0x53,0x05,0x24,0x1b,0x1a,0xf7,0x0c,0x2d,0xab,0x23,0xeb,0xee,0x42,0x26,0xb0,0x05,0x1a,0xf0,0xa8,0xf2,0x38,0xd0,0xff,0xef,0x21,0x41,0x1f,0x2a,0x2a,0xeb,0xfe,0x23,0x0a,0x43,0xff,0x29,0xe1,0xad,0xcd,0xf8,0x14,0xcc,0xd3,0xc2,0xf5,0xfa,0xb1,0x18,0xa3,0xe6,0x49,0x15,0x0d,0xf9,0xd1,0xf1,0x10,0x14,0xea,0xc7,0x55,0xf4,0x22,0xcf,0x07,0xc4,0xee,0x27,0xc0,0x22,0x1c,0xf9,0xf7,0xda,0x0f,0xd6,0x27,0x35,0x10,0xe7,0x01,0x33,0xb5,0xf5,0x31,0xd5,0xef,0xcd,0xe3,0x1a,0xa8,0x13,0x23,0x3f,0xbb,0xe0,0xf7,0xda,0xe9,0xf8,0xf6,0x00,0x15,0x09,0xba,0x27,0xf4,0x81,0xe1,0x17,0x06,0x0a,0x3f,0xde,0xcd,0x07,0xd7,0xdc,0xc5,0x44,0xe3,0xb8,0xd9,0xfc,0xf1,0xc5,0xc8,0xec,0xdb,0x1a,0xc6,0xf7,0x31,0xde,0xe3,0xe6,0xc7,0x9a,0x32,0xb3,0xb4,0x2a,0xdc,0xe1,0xe5,0x15,0xd8,0xe2,0xfd,0x46,0xfd,0xe0,0x0b,0x0d,0x24,0x0f,0x0d,0xfb,0xc2,0xfe,0xa2,0xd2,0x0d,0xea,0x09,0x3e,0xd6,0xf5,0x21,0xb0,0x31,0xd3,0x23,0x06,0x20,0x06,0xdc,0x35,0x23,0x29,0xf3,0xa9,0xa8,0xe8,0xc8,0x00,0xfa,0xf5,0x0b,0xd8,0x1b,0x01,0xd5,0xec,0xe3,0xa4,0xc7,0xb6,0xdd,0x14,0x3c,0xde,0xde,0x14,0xe1,0x30,0xd1,0x1b,0xd8,0x3c,0x13,0xaf,0xbc,0xe7,0xd4,0x0b,0x01,0x08,0xd5,0x2d,0x27,0xfc,0xcd,0xef,0x04,0xfb,0xcf,0xf3,0x16,0x40,0x4a,0xac,0x06,0xce,0x18,0xfe,0x13,0xc2,0xce,0x28,0xef,0xc3,0xf0,0x1f,0xd6,0x05,0xd7,0x04,0xf5,0x0c,0xe1,0xe9,0xca,0x06,0x18,0xc4,0x11,0x08,0x3b,0x18,0xf6,0xd7,0xdd,0x0a,0xa7,0xb7,0xfa,0xf4,0x41,0x11,0x28,0x33,0x17,0x9f,0x2e,0x17,0xde,0x06,0x0d,0xa9,0x30,0xdd,0x24,0xe5,0xe2,0xe2,0x1e,0xd6,0x20,0x2c,0x0a,0xf8,0xd9,0xd7,0x14,0xda,0xff,0xd6,0x19,0xf0,0x13,0x36,0x2b,0xfc,0xb6,0xc4,0x2b,0xbf,0xf4,0xe0,0xa2,0x05,0x8b,0x3c,0xf6,0xeb,0xe3,0xdc,0x24,0xba,0xe3,0x3a,0x1f,0x07,0xf8,0x34,0x14,0xd2,0xdd,0x47,0x3d,0xad,0xc9,0x06,0x14,0x16,0xf3,0xe8,0xcb,0xe9,0xec,0xe1,0xec,0x0c,0x14,0xd1,0xd2,0x0c,0xfa,0xeb,0xd4,0xfc,0xdf,0x43,0x2a,0xdc,0x02,0xe1,0xc2,0x0a,0xe2,0xfa,0xec,0x3a,0xf7,0x0b,0xbd,0x1d,0x18,0x26,0xe8,0x08,0x1f,0xda,0xdd,0x0b,0xf3,0x13,0x15,0xd2,0x1a,0x81,0xe7,0x07,0xfe,0xb2,0xb3,0x39,0x0a,0xda,0xee,0xd6,0xf3,0xf6,0xde,0xb5,0x22,0xe4,0x1b,0xe9,0x2d,0x07,0x02,0x20,0x1f,0xdd,0xe9,0xde,0x21,0xfa,0xee,0xda,0x39,0xf8,0xdc,0xf9,0x01,0xfe,0x13,0x12,0x0f,0x22,0xd1,0xfa,0xf4,0xfa,0xca,0xf8,0x18,0xfb,0x28,0x11,0x0a,0x15,0xe4,0xce,0x0e,0x23,0x08,0x04,0x09,0xd6,0x07,0x06,0x01,0x27,0xdd,0xf6,0xef,0xbf,0x44,0xd2,0xf1,0xd9,0x0a,0xde,0x11,0x42,0x16,0xf7,0xf0,0xe3,0x0d,0x00,0x08,0xbe,0xca,0x2b,0xf3,0x50,0xe6,0xd4,0x1d,0x1a,0xf3,0x10,0x2e,0xf8,0xc1,0x20,0xc4,0xf4,0xa7,0xe8,0xbb,0x03,0xf1,0x08,0xc2,0x35,0xde,0xd5,0xe1,0x6b,0x1e,0xbf,0x1d,0xb3,0xc3,0x2e,0x3c,0x81,0x22,0x1e,0xb4,0x15,0xc1,0xeb,0xc7,0xc5,0xfb,0xc7,0xaa,0xb5,0x20,0xf4,0xb1,0x2e,0xbe,0xfa,0x27,0xe2,0x28,0xef,0x5c,0xd9,0xf6,0xf6,0x41,0xd1,0xd0,0x20,0x26,0x41,0x03,0xd4,0x11,0xbf,0xfe,0x49,0x01,0xc8,0xc1,0xd8,0x35,0xaf,0xac,0x17,0xdf,0xbf,0xcd,0x00,0xba,0xbc,0xb2,0xec,0xb8,0xc1,0x4e,0xc9,0xe6,0xf1,0xb3,0xb3,0xd9,0x04,0xf1,0xdf,0x52,0x24,0xf2,0x24,0x00,0xe6,0xf3,0xe4,0xc5,0xa1,0xac,0xb7,0x31,0xc2,0x3c,0xf0,0xfd,0x27,0xee,0xc9,0xe6,0xc3,0xad,0xd8,0xb7,0x37,0x06,0x96,0xfb,0x53,0xc5,0x1e,0x0f,0x13,0xbd,0x9f,0xed,0xf5,0x49,0x33,0x13,0xca,0x52,0x58,0x39,0x16,0x02,0xd0,0x2a,0x11,0x0f,0xd0,0x21,0xbe,0xe5,0xe0,0x03,0x03,0xe5,0x37,0xed,0xda,0x16,0x5a,0xd9,0xfe,0xfe,0xd0,0x0a,0xec,0x0f,0xff,0xf8,0x22,0xe9,0xf5,0xf7,0xe3,0xfd,0x09,0xef,0xc8,0x03,0xfa,0x01,0x2e,0xf7,0x1b,0x1c,0xfd,0xec,0xe7,0xcd,0xec,0x0e,0x46,0xe6,0xf9,0xc6,0xb0,0x15,0x50,0xdf,0xf0,0xe4,0x12,0x01,0xe2,0xc8,0x0b,0x12,0x0e,0x10,0x0b,0x21,0x2b,0xee,0x14,0xd3,0x12,0xe3,0xc7,0xaf,0xf0,0xe8,0xa4,0xc4,0xeb,0x99,0x15,0x32,0x2c,0xd3,0xe5,0xb4,0xaf,0x28,0xce,0xd1,0xec,0xb7,0xd9,0x4e,0xe4,0xed,0x5e,0xc2,0x2e,0xd6,0xdc,0xf6,0xe1,0x30,0xd1,0xf6,0xf0,0xc0,0x00,0xd1,0x03,0xde,0xeb,0x15,0xef,0xde,0xc7,0xfc,0xd7,0x35,0xef,0xbd,0xce,0xda,0xc0,0xf7,0x1c,0x0c,0xde,0xe7,0xbe,0x09,0xeb,0xbe,0x12,0xc9,0x05,0xe7,0xe5,0x0b,0x1a,0x23,0x18,0xf4,0x0c,0x09,0xf7,0x1f,0xc0,0x2f,0xfb,0x16,0xbf,0x05,0xe8,0xe1,0xf9,0xea,0x24,0xe9,0x11,0x3b,0xfa,0xeb,0xcf,0xe6,0xdc,0xd6,0x1c,0x1f,0x03,0xb8,0x0d,0x0e,0x01,0x37,0x08,0x0a,0x45,0x2b,0xf3,0xe4,0xf9,0x1a,0x0e,0x0d,0xf6,0x1b,0xe8,0xc5,0x03,0x14,0x30,0xe3,0x45,0xbd,0x0a,0xf8,0xb5,0xee,0x12,0xe2,0x17,0x21,0x32,0x24,0x32,0x2e,0x35,0xf0,0xe5,0x12,0xd2,0xe9,0x11,0x1e,0x06,0xf9,0x21,0x16,0x36,0x12,0x0e,0x05,0xe1,0xb1,0x2e,0xe9,0xe9,0xe1,0x01,0x03,0xe1,0xfc,0xf6,0x29,0x2d,0x12,0x03,0xfb,0x37,0x0e,0x06,0x30,0xbd,0x03,0x40,0xd9,0x00,0xe7,0x09,0xfd,0xef,0xe6,0xec,0x2a,0xf8,0xfa,0xfe,0x09,0xfd,0x29,0xd1,0xe5,0x4a,0xc9,0xfc,0xdd,0xfe,0x2f,0x0e,0xdd,0x21,0xda,0x11,0xee,0xc7,0xfd,0xfe,0xcf,0x02,0xe3,0x0b,0xed,0xf0,0x6f,0xf3,0xf5,0x11,0xf5,0xbd,0xf0,0xeb,0x08,0x00,0x08,0xe8,0x25,0xfb,0x08,0x26,0x17,0x06,0xe6,0xd7,0x12,0xf6,0xc3,0x05,0xf9,0x1d,0xc8,0xc5,0xdb,0xe5,0xc0,0x18,0x27,0x10,0xfc,0xd7,0x3a,0x1f,0x21,0xf7,0x01,0x0c,0xcd,0xed,0x2e,0xd3,0xef,0xda,0xd9,0x0a,0xe8,0xf6,0x07,0x00,0x11,0x12,0x01,0xf2,0xe7,0xf5,0x0e,0xeb,0x0a,0x0f,0x2f,0xd4,0xcb,0x00,0xf4,0xeb,0xea,0xec,0xf1,0x24,0x0d,0xdd,0x1b,0x00,0xff,0x11,0x08,0x0d,0xcd,0x06,0xf3,0xc7,0xde,0xf4,0x02,0x23,0x0e,0x7f,0xf3,0x32,0x11,0x12,0x02,0x2d,0xd9,0x48,0xce,0xe2,0xc9,0x14,0xe5,0xd7,0x28,0x20,0x1a,0xc1,0x36,0xe7,0x30,0x38,0xec,0x0d,0x4c,0x3a,0x24,0xd2,0xb1,0x3d,0x19,0xbb,0xd3,0xca,0xdb,0x03,0xe3,0xd7,0x0e,0xe0,0xc3,0xb5,0xe3,0x3e,0xe0,0x0f,0xd2,0xec,0xb8,0xae,0x2c,0xf4,0xec,0xcd,0x14,0xee,0xe2,0x52,0xdf,0x64,0xf3,0xef,0x1e,0xb3,0x9c,0x08,0x02,0xf2,0x1c,0xd6,0x20,0x17,0x2b,0x20,0xdc,0xed,0xfc,0xf7,0xc4,0x21,0xd2,0x47,0x2a,0x0b,0x00,0x09,0x3d,0x3e,0xf3,0x32,0xc6,0x0b,0xc0,0xf9,0x1c,0x00,0x14,0xfb,0xfe,0x46,0x1f,0xcd,0xdf,0x40,0xe5,0x0d,0xdd,0x24,0xd8,0xf7,0xf3,0xf4,0x1e,0x0c,0xd4,0x2c,0x07,0x92,0xd9,0x1a,0xda,0x42,0xd2,0x33,0x0c,0xe6,0xed,0xf6,0xe1,0xca,0x27,0x11,0xe2,0xf4,0x81,0x26,0x08,0xf4,0x40,0xcb,0xb6,0xf1,0xf7,0x22,0xd2,0xce,0xda,0xe7,0xd3,0xf3,0xdd,0x43,0x36,0xff,0x20,0x10,0x18,0x06,0xbf,0x07,0x1c,0x0e,0x07,0x03,0x2a,0xf0,0xec,0xc8,0xf8,0xb7,0xe3,0xe2,0x14,0xde,0xaf,0xda,0x3f,0x0f,0xfb,0x11,0x2a,0xbd,0xe7,0x12,0x04,0xf5,0x24,0x17,0xf3,0x05,0x22,0x3c,0x1b,0xe2,0xfb,0xb4,0x38,0x04,0x0a,0x1c,0x09,0xf0,0x34,0xf7,0xf5,0x10,0x32,0xe9,0xbc,0x36,0xc7,0xef,0x1b,0xff,0x29,0xf6,0xfc,0xfa,0xd8,0x0c,0xae,0x9a,0x1b,0x06,0x03,0xbf,0x09,0x3a,0xde,0x16,0x1f,0xca,0x0b,0xd6,0x21,0xcb,0xb2,0xc4,0x1e,0x05,0xc8,0xc7,0xdf,0xfb,0x0c,0xc7,0xef,0x11,0xe3,0xdc,0xe4,0x0b,0xe1,0xf6,0xe2,0xce,0xad,0xea,0x1c,0xf2,0xe8,0xe8,0xde,0xf2,0xe8,0xd7,0xfe,0xfc,0x23,0xc6,0x47,0x06,0xdd,0xde,0x64,0x0e,0xda,0xfe,0xd5,0x21,0x19,0x06,0xf7,0xe9,0xe6,0xf9,0x1e,0xbc,0xea,0x11,0xe1,0x0b,0xd0,0x20,0x12,0x39,0xf1,0x08,0xed,0xcb,0x38,0x0c,0xe3,0xe5,0xbf,0x39,0x00,0xdd,0xcc,0xa3,0x0f,0xf4,0x29,0x1f,0xd4,0x3d,0x25,0xe3,0x62,0xf2,0xc1,0x02,0x97,0x2a,0xfd,0xe1,0xc8,0xea,0x36,0x0f,0xf4,0xc1,0xfb,0x26,0xd4,0x2d,0xe2,0x09,0xe0,0xfa,0xae,0xff,0xf7,0x31,0x08,0x1b,0x5e,0x0b,0xe1,0xd1,0x2b,0xd2,0xfa,0xec,0xbc,0xed,0x44,0xd7,0xcf,0x7f,0xd8,0xca,0xe9,0x0f,0x53,0x44,0x3c,0x15,0x24,0x07,0xd1,0x1e,0x9f,0xd1,0xca,0xe6,0xec,0xba,0xea,0xbc,0xc7,0xef,0x0c,0xf9,0xe8,0x1f,0xf4,0xf7,0x47,0xbb,0xa3,0xe9,0xd4,0xda,0xde,0xe0,0x01,0xd8,0x1c,0x0b,0x21,0x26,0xe0,0x32,0x26,0x4f,0xe4,0x4e,0xf8,0x01,0xed,0xef,0xfa,0xf9,0x27,0x1c,0xe2,0xfb,0xd4,0xfd,0xf7,0x01,0xdd,0x95,0x02,0xea,0xf1,0x2e,0x37,0x16,0x0b,0x4a,0x17,0x4b,0xcb,0x21,0x2e,0x26,0x16,0x0a,0x14,0x1b,0xf9,0x13,0xb9,0xee,0x3a,0x46,0xfe,0x16,0xf1,0xa4,0x45,0xf1,0x24,0xf4,0x11,0x1e,0x2f,0x03,0xe9,0x34,0x52,0xfa,0xb4,0x10,0xec,0x47,0x2a,0xd4,0xd9,0x08,0x70,0x36,0xd7,0x22,0xd1,0xaa,0xf0,0x00,0xbd,0xdd,0xee,0xb1,0x05,0x1a,0x00,0xd0,0xbb,0xbc,0xf5,0x07,0xe6,0xfc,0x2a,0xeb,0xe0,0x01,0xa0,0xfd,0xda,0xde,0xf4,0xff,0xeb,0xe1,0x14,0x1c,0xf3,0xf0,0x02,0xe4,0xe5,0xef,0xe6,0x06,0x05,0x17,0x0f,0x20,0xc9,0x01,0xd6,0x1e,0xf0,0xc9,0xb3,0x2d,0x00,0x03,0xb6,0xd5,0x17,0x0a,0xa5,0x13,0xfd,0x44,0x17,0xbc,0xec,0xd8,0xf2,0xe4,0x05,0x2b,0xe8,0xcf,0xea,0x2f,0xf2,0xde,0xf4,0x0a,0xe6,0x00,0x04,0xde,0xf2,0x9e,0xd3,0x12,0x09,0xf6,0x16,0x11,0x38,0xd5,0x30,0xf0,0x3d,0x0d,0xef,0x45,0xd8,0x1c,0xe7,0x07,0xc8,0x13,0xed,0x17,0xe9,0x16,0x47,0x22,0xf6,0x81,0x45,0x07,0xf8,0xab,0x2f,0xd8,0xb9,0xfd,0xfb,0xeb,0xcb,0xcb,0xf9,0x3a,0x2c,0xe6,0x0c,0x93,0xec,0x1d,0x12,0x06,0xd9,0x15,0xf6,0x16,0x91,0xf7,0xd0,0xdf,0x2b,0x1a,0x30,0xef,0xc5,0x05,0x28,0xbb,0xc5,0x9d,0xfd,0xce,0xe4,0x13,0xc7,0x0e,0xd5,0xcb,0xeb,0xd1,0xdb,0x3f,0x25,0x02,0x01,0xa2,0x47,0xe0,0xf6,0x3d,0xd3,0x1a,0x30,0x1a,0x25,0xdf,0xc6,0x0d,0xfd,0x2d,0xde,0xdb,0xd4,0x43,0xc5,0x35,0xee,0xf4,0x13,0xd0,0xe2,0xb8,0x05,0x2f,0xe4,0xaa,0x17,0x36,0xe3,0x4e,0x2e,0x09,0x01,0xef,0x06,0xb2,0xeb,0x04,0x2e,0x12,0x02,0x16,0xf0,0x0f,0xda,0x14,0xfa,0xd2,0xba,0xe9,0x02,0x2e,0x17,0xeb,0xcb,0x8d,0x06,0xd3,0xa7,0x17,0x15,0x1a,0x0f,0xcf,0x23,0x3d,0xff,0x33,0xd4,0x21,0xfe,0xbe,0xf8,0xf0,0xd0,0xbf,0xab,0x11,0xe0,0x18,0xb1,0x41,0xb5,0x26,0x1e,0xff,0x07,0x37,0xec,0xbc,0x96,0x19,0x0c,0x1b,0xf0,0x48,0x2f,0xc6,0xd2,0xd8,0xbc,0xf9,0x11,0xbb,0xff,0xe7,0xe7,0x1f,0x3d,0x24,0xff,0x16,0x54,0x0c,0xdf,0x1b,0xd3,0xba,0xf6,0x43,0x01,0xd8,0x4f,0x23,0x02,0x00,0x41,0xab,0xdb,0xbe,0x12,0xf7,0xfe,0xcc,0xdb,0xaf,0x2c,0xf3,0x10,0xea,0x96,0x18,0x00,0xf4,0xf0,0x06,0xbc,0x00,0xac,0xe3,0x3d,0xa3,0xbb,0xba,0xf5,0xd5,0x19,0xe6,0xa6,0xff,0x56,0xf8,0x07,0x26,0xeb,0x11,0xed,0xb1,0xcb,0xc9,0x07,0x27,0x69,0xaa,0xef,0x06,0x4b,0xf1,0xe6,0xe4,0x21,0xa4,0xe1,0xda,0xe7,0xe2,0xb9,0x30,0x0c,0x0a,0x44,0x2c,0xdc,0xf3,0xe8,0xe3,0xe0,0x1a,0xcb,0xa4,0xfd,0x07,0xdf,0xd8,0x11,0xe1,0x08,0x2b,0xcc,0x15,0x13,0xd0,0xc0,0xf3,0x22,0x59,0xd2,0x33,0xf5,0x1d,0xd9,0xfc,0xd6,0x30,0x1a,0xf5,0xd5,0x19,0x1c,0x11,0xd7,0x20,0x3f,0xd9,0xdb,0x18,0xf7,0xae,0xfd,0x15,0x54,0x06,0x27,0xc8,0xe6,0xa4,0xc4,0x3f,0x03,0x4f,0xda,0xaf,0xd1,0xad,0xf7,0x31,0x37,0x1b,0xa6,0xe6,0x32,0x2e,0x04,0x15,0x1a,0x0f,0xb8,0xc0,0x37,0xbc,0x81,0x09,0xe5,0x1b,0x51,0x94,0x10,0x19,0x1b,0xf5,0xea,0xc5,0xee,0x00,0xe5,0xcd,0x01,0xfe,0x11,0x9b,0xa2,0x05,0xd7,0xab,0xe7,0xfd,0xb6,0xd9,0xec,0xe3,0x3d,0xbb,0x1f,0x10,0x1e,0xe7,0xdd,0xeb,0x4d,0x21,0xd2,0x35,0x9d,0x53,0x41,0x23,0x1c,0xe5,0xc6,0xf7,0x15,0xd4,0x3d,0x1a,0x0d,0xec,0xba,0x23,0xfc,0x02,0x38,0xa1,0x04,0xf5,0x99,0xff,0x49,0xbc,0xab,0xba,0xad,0xe3,0xb7,0x19,0xcf,0xf7,0x0e,0x25,0x68,0x13,0xbe,0xcb,0xd7,0x1b,0xd5,0x29,0xfe,0x0c,0x42,0x1d,0x61,0x0b,0xfa,0x08,0xf0,0xde,0xff,0xf3,0xbd,0x29,0x9d,0xb1,0xf6,0x50,0x07,0x55,0xf8,0x1e,0xe2,0xfe,0x19,0xfc,0xc5,0xde,0xdc,0x0d,0xfb,0x17,0x13,0xf6,0xf3,0xf4,0xfe,0xe8,0x0e,0xc7,0xee,0xb8,0xd1,0x5a,0xd4,0x1a,0xbe,0xe9,0x1e,0xb2,0x15,0xa6,0xc0,0x06,0xd4,0x0f,0xcd,0xec,0x0d,0xd9,0x03,0xd9,0xc9,0xd2,0x05,0xdf,0x23,0xd2,0xbe,0x66,0xec,0xf7,0xbf,0x02,0xd8,0xdc,0x60,0xf3,0x27,0x28,0xe5,0xf7,0xfa,0xca,0xbe,0x2f,0x0d,0xcc,0xd8,0x0a,0xff,0x18,0x11,0xfa,0x01,0xe9,0x2e,0xd6,0x03,0x4b,0xe4,0x20,0x0c,0xe3,0xca,0xb2,0x12,0x34,0x13,0x42,0x49,0x0e,0xd3,0xc5,0xee,0xfe,0x16,0x09,0x03,0x39,0x1d,0xcf,0xcc,0xff,0x0b,0xb9,0xf8,0x10,0xf4,0x34,0xd7,0xe5,0x05,0x06,0xd7,0x02,0xd0,0xe7,0xe0,0xb6,0xc2,0xbc,0xca,0xd3,0xcd,0x1a,0xdc,0xeb,0x28,0x2c,0x1a,0x07,0x16,0x86,0xd9,0x01,0x02,0xeb,0xc1,0xcc,0x58,0xd1,0x17,0x06,0xe0,0x6d,0xdd,0x05,0x19,0x2e,0x04,0x0d,0x3d,0xe6,0xd9,0xfe,0x02,0x0f,0xf0,0x10,0xfb,0xff,0x13,0xc1,0xe7,0xe8,0x01,0xc0,0xfa,0x01,0xed,0x34,0x16,0xf2,0xe1,0xea,0x03,0x14,0xe4,0xed,0x25,0x12,0x11,0xee,0x01,0x18,0x0d,0xdd,0xfe,0xb7,0x1c,0x04,0x14,0xfc,0x00,0xcd,0x24,0x08,0x0e,0xfc,0x0b,0xdc,0x23,0xf9,0xba,0x5b,0x31,0x28,0xc0,0x1b,0xdd,0x31,0x20,0x09,0xea,0xf5,0x7e,0xca,0xcb,0x0d,0xb8,0xf5,0x09,0xf8,0xad,0xec,0x0f,0xd3,0xfd,0x0d,0xe7,0xc7,0x82,0xe6,0xd9,0x03,0x05,0x26,0xe0,0xe0,0xde,0xfd,0xde,0x05,0x81,0xea,0xd9,0xfc,0x0e,0xeb,0xcd,0x12,0xf4,0xc1,0x0a,0xdd,0xdc,0xea,0xef,0xdb,0xe2,0x07,0xe8,0xe4,0xaa,0xd4,0x2b,0xb1,0xce,0x04,0xfd,0xf3,0xe7,0xd6,0x4e,0x83,0xd1,0x89,0xa6,0x2f,0x00,0x06,0xc9,0x36,0x1f,0x35,0x28,0xee,0xdf,0x1a,0x11,0x2e,0xb4,0xc7,0x23,0x37,0xf9,0x2f,0x0d,0xdb,0xe8,0x11,0x3a,0xc2,0x91,0x48,0x34,0x38,0x13,0x07,0xe8,0xa5,0xcf,0x27,0x52,0x8d,0x0a,0x04,0x3a,0x17,0x3d,0x5c,0xf6,0xff,0xe0,0xd9,0x4c,0x20,0x05,0xb0,0xe9,0xc6,0x2b,0x0c,0xd7,0x1d,0xec,0xb5,0x7a,0xd0,0xa0,0xd4,0x49,0x34,0x3d,0x1b,0x6e,0x5f,0x63,0xff,0xe3,0x11,0xa6,0xff,0x3e,0x99,0xcb,0xff,0x88,0xa1,0x3b,0xe1,0xca,0xa6,0x2c,0x3f,0x3d,0xf3,0xb4,0xb5,0x32,0x53,0xb2,0xf2,0x2a,0x39,0x11,0xdc,0x32,0xdd,0x5c,0x60,0x10,0xfe,0xdb,0x01,0x18,0xbf,0x94,0x34,0xb2,0xaf,0xa2,0xf4,0x05,0x2e,0x19,0x09,0xc8,0x3f,0x01,0xfa,0xfa,0xe1,0x17,0x0f,0x3c,0xc6,0xe6,0xf5,0xb7,0xf8,0xe7,0xed,0x0d,0xf5,0xec,0x1c,0x27,0xf6,0x19,0xec,0xd3,0xc5,0xc6,0x9a,0x11,0x03,0x58,0x08,0x09,0x54,0xd9,0x36,0xb7,0x26,0xe7,0x41,0xf9,0xfe,0xf9,0x20,0x3e,0x33,0xb1,0x01,0xd2,0x0f,0xf8,0x36,0x27,0xbd,0xe8,0x06,0x3b,0x24,0xf8,0xf1,0xa7,0x52,0x2b,0x25,0xe7,0x49,0x2b,0x01,0xcf,0xd9,0x1b,0x1b,0xa1,0xf1,0x41,0x24,0xcc,0xcf,0xaf,0x4d,0xcc,0x58,0x04,0xd3,0xbf,0xde,0x13,0xca,0x41,0x06,0xfb,0x33,0xd7,0xd3,0xdc,0xe2,0x00,0x12,0xbb,0xbd,0xd9,0x5a,0xf0,0xcf,0xf6,0x12,0x28,0x02,0x13,0xd3,0x9e,0xff,0xf4,0x7f,0x0c,0xf1,0xb5,0x09,0xd4,0x10,0x8c,0xff,0x12,0x23,0x4a,0x9f,0xae,0xed,0x17,0xec,0xd4,0xf2,0xd5,0xa6,0x2b,0xe8,0xcb,0xde,0x4d,0xec,0xf9,0xae,0xaf,0x0f,0xa6,0xcf,0x08,0x96,0xd1,0xb9,0xa5,0x1b,0x1f,0xf2,0xe6,0x36,0xf5,0x97,0xfc,0x19,0x34,0xe0,0xeb,0x02,0x40,0xde,0xf5,0x2d,0xb7,0xce,0xae,0xb9,0x1a,0x05,0x5d,0x64,0xdb,0xf2,0x67,0x27,0xf6,0x1f,0xa5,0xb9,0xe4,0xf3,0xc6,0x6b,0x8d,0x12,0xf6,0x48,0xed,0xf4,0xfe,0xc7,0x32,0xe4,0x96,0x27,0xde,0xcc,0x44,0x16,0xe7,0xeb,0xef,0xbb,0x23,0x4f,0x36,0x0b,0xf4,0xbb,0xcb,0x05,0xdf,0x0f,0x24,0xc1,0x3c,0xc8,0xb4,0xb9,0xcf,0xf5,0x36,0xa9,0x05,0x51,0x29,0xef,0xc9,0x15,0xdc,0x99,0xe0,0xbf,0xf1,0x21,0x3f,0xfb,0xe0,0xfe,0x3e,0x31,0xf2,0xef,0xcd,0xc7,0xa6,0xc3,0xfa,0xce,0x2d,0xae,0xcd,0xe9,0xce,0x15,0x1b,0x2b,0x29,0xbc,0xf1,0xfa,0xe6,0x0b,0x3e,0xc8,0x27,0x2c,0xe7,0xc0,0xe1,0x2c,0x5b,0x59,0x0f,0xca,0xca,0x23,0x9b,0xc2,0x34,0x6c,0x12,0x0c,0xc1,0xe7,0xf4,0x27,0x0c,0x02,0xbb,0xf8,0x06,0xda,0xe5,0xd3,0xe6,0xb5,0x4a,0x2e,0x18,0xf9,0xea,0x20,0x22,0x33,0xdd,0xec,0xdc,0xd2,0x04,0xd7,0xed,0xf0,0xbb,0x9e,0xbc,0x0d,0xea,0xe5,0xc9,0xcd,0xec,0x1e,0x99,0xa0,0xe0,0xfd,0x1b,0xa4,0x3a,0xfe,0xd7,0xea,0xa6,0x3c,0x8f,0x1b,0x18,0x42,0xf8,0xf8,0x05,0x25,0x52,0x2b,0x06,0xe8,0x69,0xf5,0xc4,0xd8,0x0e,0x05,0x03,0xf6,0x58,0x40,0xd6,0x46,0x02,0x5d,0x81,0xdb,0x99,0xf2,0xd2,0xd7,0xd1,0x0b,0x0d,0xc5,0xc6,0x05,0x0b,0x52,0xfe,0xb9,0x1d,0x28,0xbe,0x33,0x36,0xff,0xf5,0xab,0x53,0xed,0x62,0xfd,0xb1,0x54,0x26,0xf5,0x32,0xd0,0xba,0x02,0xfa,0x96,0x37,0x03,0xcf,0x19,0xa7,0x16,0x3c,0xe3,0x8e,0x8f,0xe4,0xf4,0xba,0xaf,0x95,0xed,0x29,0xbb,0xb7,0x3d,0x29,0xfa,0xba,0x0a,0xf8,0x24,0x02,0x43,0xb6,0x38,0xd9,0x22,0x0c,0x23,0x45,0xf4,0x0b,0x04,0x3d,0x13,0xfb,0x42,0x59,0xd7,0xd4,0x59,0x0c,0xe4,0x49,0x34,0xae,0x35,0x28,0xb7,0xb7,0x43,0xd8,0x1a,0x83,0x38,0x35,0xf9,0x48,0x3d,0xc7,0x54,0x66,0x0c,0xc9,0xb5,0xae,0xe9,0xb9,0xe7,0x2c,0x3e,0xdf,0xef,0xde,0x93,0xa7,0xf7,0xdb,0x44,0xad,0xfa,0x04,0xfc,0x1d,0x18,0x24,0x1f,0xb9,0x01,0xb2,0xe8,0xe2,0x9c,0xd3,0xb0,0xe2,0x03,0x35,0xe4,0x3d,0xe5,0x1e,0x2c,0xad,0x2e,0x1e,0xba,0xb1,0x0d,0xa6,0xe9,0x0e,0xe9,0x06,0x85,0xfa,0x11,0x32,0xeb,0x18,0x47,0xdf,0x98,0x29,0x22,0xcb,0x05,0xdb,0xe4,0x1f,0xf5,0x3c,0x6c,0xf2,0x14,0x18,0x1b,0x5a,0xe8,0xd8,0xc9,0xf6,0xeb,0x1b,0xc3,0x07,0xd6,0xac,0xb9,0x11,0xc4,0x20,0xd4,0x1a,0x28,0xc2,0x25,0x53,0x37,0x10,0xdf,0x08,0xf3,0x1a,0xcd,0x01,0x38,0x50,0x47,0xe0,0x17,0xc8,0xd5,0xef,0x9c,0x3c,0xf4,0x17,0x8d,0xb8,0x04,0xa8,0xea,0x29,0xf5,0x5c,0xe2,0x20,0xf2,0x23,0x7f,0x36,0x13,0xb1,0xe9,0x32,0x05,0xca,0xf4,0x02,0xfe,0x11,0x0d,0xf1,0x31,0x9c,0xdb,0x13,0x4d,0x1a,0x01,0xf2,0x18,0xf9,0xbe,0xcf,0x61,0xf2,0x3f,0x3f,0x29,0x0d,0x28,0x15,0x92,0x0e,0xea,0xe4,0x18,0xd5,0x15,0xc7,0x8d,0x07,0x3e,0xb4,0xc5,0xdb,0x03,0x00,0xc9,0xbd,0x0b,0xaf,0xde,0xf7,0x0c,0xdd,0x09,0x0a,0xb6,0xf6,0x1c,0xc8,0x11,0x1e,0xf9,0xd4,0xbd,0xfe,0xe7,0x27,0xe4,0xe4,0xf0,0xde,0x2a,0xcd,0xdd,0x0d,0xd7,0x10,0xd3,0x0c,0x0b,0xe6,0x1b,0xce,0xf0,0x0a,0x2a,0xe7,0x7a,0xeb,0xea,0x18,0xe7,0x0f,0xcd,0xec,0xba,0x14,0xb7,0xe4,0x23,0x0b,0x1c,0x40,0x85,0xdd,0x9a,0xe6,0xd8,0xbc,0x0c,0xed,0x20,0xff,0xfd,0x9f,0x37,0x09,0x41,0x39,0xed,0xab,0x1e,0x0f,0xfb,0xe8,0x33,0xc7,0xc8,0x04,0xd0,0x00,0x04,0xff,0xfd,0x07,0x16,0x11,0xdd,0x05,0x0d,0xe3,0xca,0xe1,0x06,0x09,0xda,0x28,0x06,0xfe,0xeb,0x31,0x51,0xc6,0xf4,0x0e,0xfa,0xce,0x07,0xfe,0xe0,0x30,0x42,0xea,0x18,0xf4,0xe2,0xd1,0xf2,0xce,0x39,0xa3,0xc2,0x0f,0x9e,0x37,0xb0,0x81,0xe8,0x1e,0x04,0xce,0x1e,0xc3,0x45,0x11,0x54,0x08,0xcf,0xe3,0xf7,0xb3,0x44,0x1c,0xc3,0xf2,0x23,0x11,0xfb,0x26,0x0c,0xf4,0x00,0xef,0xf3,0x00,0xb9,0xf4,0xed,0x17,0xd7,0x1c,0xd1,0xe7,0xed,0xbf,0x3f,0xe3,0xca,0x23,0x15,0x0d,0x08,0xa7,0xf8,0x33,0xf3,0x41,0x0a,0xbc,0x05,0xd9,0x35,0xd8,0xba,0xda,0xea,0xfe,0xd3,0x0c,0x1a,0xd8,0xb9,0x24,0xfc,0x0c,0x11,0x0d,0x24,0xdb,0x13,0x4b,0x0d,0xc3,0xd9,0xf3,0xc9,0x11,0xeb,0x10,0xd2,0xdb,0xe1,0xc7,0x63,0x16,0x08,0x0a,0xd0,0xf3,0x06,0xb6,0x22,0xf2,0x05,0xa3,0xdb,0xfc,0xfb,0x08,0xff,0xd3,0xf8,0xc8,0x0f,0x20,0xc2,0xed,0xec,0x1c,0xdf,0x29,0xdf,0x12,0xdf,0xd6,0xec,0x56,0xc7,0xf3,0x11,0xae,0xf6,0xf6,0x1a,0xd5,0xcd,0xdd,0x04,0xdb,0x0d,0xde,0xd5,0xf7,0x4c,0xd7,0xec,0x0b,0x25,0xf9,0x11,0xfa,0x1d,0xf7,0x3e,0xfb,0xc5,0xdd,0x23,0xb2,0x26,0xc6,0xe6,0x14,0xd0,0x1d,0x25,0x14,0x2f,0x21,0xc0,0x26,0xe6,0xce,0x1a,0xd6,0xf8,0x00,0x02,0x08,0x0d,0xee,0x17,0xff,0xbf,0xeb,0x3b,0xf5,0x1c,0xe0,0xe6,0x2d,0x05,0xb6,0xe2,0xef,0x3a,0xfa,0x29,0x70,0xda,0xc2,0xc1,0xd5,0x0a,0x43,0x15,0xfe,0xeb,0x0c,0xc5,0xca,0x2d,0xf8,0x05,0xf3,0xf2,0xfb,0x3d,0xf9,0x35,0x03,0xee,0xb6,0x23,0xd5,0xbb,0xb8,0xfc,0xfc,0xbd,0xcd,0x10,0xb4,0x0c,0xfe,0x1b,0xf8,0x12,0x12,0xad,0xfc,0xa1,0xbd,0x16,0x39,0xee,0xd5,0xd2,0xf7,0xef,0xd9,0xd3,0xfd,0x38,0xf5,0xde,0x0f,0x4c,0xfd,0x38,0x38,0xdb,0x1a,0x2d,0xce,0xff,0xed,0x20,0xe9,0x1f,0x23,0xd3,0xf8,0x0c,0x02,0xb8,0xc2,0xe6,0x30,0x2c,0x0d,0xe3,0x01,0x0c,0x23,0x3a,0xe4,0x07,0x17,0x31,0xe5,0x17,0xe8,0x04,0xe2,0x9d,0xd2,0xe7,0x27,0xf0,0x11,0xdd,0xe5,0xda,0xc4,0xe9,0x17,0xf1,0x05,0x17,0x16,0x32,0xb1,0x2c,0x1e,0x18,0xbf,0xf6,0xe4,0x22,0x08,0xdc,0x01,0x1f,0x7f,0x02,0xf2,0x07,0xd0,0xd7,0x24,0x06,0xff,0xf2,0x37,0x97,0xe5,0x0c,0x0b,0xf3,0xcb,0xd3,0xf3,0xdb,0x1c,0x08,0xe6,0xfd,0xda,0x11,0xda,0x18,0xe3,0xd8,0xfb,0xfa,0x13,0x09,0x13,0xfb,0xe4,0x12,0x0a,0xe0,0xf7,0xd3,0xd3,0x23,0xb8,0x10,0xa3,0xe6,0xc0,0xe6,0xde,0xed,0xdf,0x05,0xca,0x16,0xd2,0xe1,0xfe,0xd2,0x30,0xd7,0x1b,0xb6,0x1a,0x2a,0xf5,0xdc,0x41,0xd7,0x8a,0x17,0x2b,0xd9,0xec,0xba,0x1d,0xa5,0x06,0x9b,0x2c,0x21,0x18,0x9b,0x1d,0x1c,0xc0,0xe3,0xce,0x27,0x16,0xa4,0x4a,0xe3,0x97,0x9b,0x0b,0xf8,0x16,0x3b,0x26,0x0a,0xe6,0xf5,0x3d,0x73,0x2d,0xfe,0x00,0xc7,0x41,0xe6,0xf7,0x08,0x03,0x07,0x28,0x0d,0xb5,0xa9,0xb0,0xac,0x3b,0xac,0xd0,0x32,0xc8,0xf9,0x29,0xf2,0x07,0xd3,0xc4,0xf3,0xf3,0xfc,0x20,0xea,0x12,0xae,0x84,0xb1,0x38,0xe0,0x66,0xb4,0xc5,0xc0,0xf7,0xc8,0xb1,0x2b,0xb5,0xb6,0xf2,0x09,0x04,0x2d,0xdd,0x81,0xc4,0x13,0xda,0xf4,0x06,0xd5,0x24,0x1a,0x20,0x07,0xd6,0xea,0xc0,0xc2,0x06,0xbb,0xb1,0xee,0xdf,0xff,0x23,0xcf,0xb4,0xb2,0xfe,0xf5,0x13,0x1b,0xea,0x23,0xc5,0x05,0x18,0xa3,0x00,0x13,0xe7,0x33,0x03,0xff,0xa7,0xf4,0x16,0x37,0x68,0x06,0xa3,0xec,0x0f,0x1c,0x53,0x28,0xbc,0xd2,0x0f,0x28,0x01,0xe1,0xdf,0x7f,0xb6,0x26,0xaf,0x09,0xff,0xe6,0xcc,0xa6,0xef,0xfb,0x23,0xc4,0x4d,0x16,0xc0,0x27,0xdf,0x93,0x15,0xab,0x9d,0xcc,0xcb,0x1d,0xb4,0xe3,0xfc,0xf1,0xdd,0x10,0xce,0x9e,0x12,0xf5,0xdc,0x38,0xf2,0x20,0x4d,0xac,0xea,0xe0,0x24,0xaf,0x31,0xe6,0xb1,0x25,0xc7,0x1d,0xf8,0x04,0xf9,0x2c,0xf9,0xbd,0xc8,0xc0,0x53,0x4c,0xdf,0x60,0x05,0xf3,0xf3,0x15,0xd4,0x12,0xbc,0xdc,0x35,0x00,0x08,0xee,0xb4,0x20,0xc2,0x43,0xe6,0x11,0xf9,0x24,0xcc,0xdd,0x1c,0x19,0xef,0x9e,0x04,0xfe,0xf6,0xc1,0xd1,0xf3,0xf9,0xe3,0xf8,0x19,0x39,0xea,0x38,0x07,0x28,0x1a,0x20,0xca,0xcf,0xe8,0xc2,0xb4,0xe3,0x33,0xc8,0xdd,0xfb,0x0a,0x10,0x33,0x0c,0xc8,0x51,0xd7,0x11,0xcd,0xc7,0x0a,0xf7,0x3f,0x26,0x03,0xf3,0xec,0x10,0x16,0xce,0xee,0xf0,0x03,0x1f,0xee,0xe7,0x0e,0x43,0xe9,0xfb,0xfe,0xef,0xc0,0xc7,0x04,0x06,0x11,0x18,0xc4,0xbd,0x09,0x06,0xf4,0x11,0xdd,0xde,0x32,0x95,0xa5,0x07,0x11,0xe1,0x03,0x39,0xea,0x27,0xef,0xcf,0x00,0xc8,0xf0,0x12,0xf1,0xf1,0xe1,0x2f,0xbd,0x59,0x13,0xc2,0x0a,0x24,0xa8,0x36,0x08,0x3a,0xde,0xbb,0xea,0x24,0x46,0xfc,0xd5,0x12,0xdb,0xdd,0xe6,0x21,0xea,0x00,0xac,0x25,0x07,0xfc,0x0f,0xec,0xbe,0xf0,0x22,0xec,0x0a,0x3b,0x1c,0x30,0x02,0x2f,0x4d,0x19,0xf6,0xe8,0x25,0x24,0xe7,0xc0,0x1c,0xa5,0x27,0x96,0x1f,0xd7,0xf9,0x2d,0x16,0x41,0x22,0xe5,0xdd,0xf0,0xec,0x27,0x09,0x20,0xf6,0x14,0x38,0xdf,0xc5,0xf7,0x19,0x25,0x14,0xd7,0x28,0xbf,0xd5,0xcb,0x05,0x50,0xff,0xed,0x13,0xfe,0xb7,0xc9,0xbc,0x25,0xd1,0xeb,0xd1,0x55,0xba,0xef,0x15,0x51,0x03,0xe7,0xea,0xb7,0x09,0xe9,0x22,0x37,0xe2,0x39,0xd2,0xe8,0xe7,0x15,0xac,0x2f,0xfa,0x01,0xdb,0x49,0xe4,0xea,0xda,0xc9,0xce,0xfb,0xe1,0x10,0xe9,0x14,0xc3,0x13,0xd4,0x46,0xaa,0x65,0xe7,0xb5,0xf1,0xef,0xfa,0x37,0x10,0x02,0xba,0xee,0xd4,0xed,0x33,0x81,0xcd,0xb6,0x47,0x0c,0x10,0xd2,0x54,0xe7,0x0e,0xe0,0xe4,0xf5,0x02,0x00,0x0f,0xd7,0xb5,0x14,0xff,0xef,0xdf,0xfd,0x03,0xe9,0x3d,0xe1,0xd3,0x7f,0xfc,0xeb,0xf8,0x9a,0xe3,0xf0,0x2a,0xef,0xf2,0xfe,0x43,0xde,0xec,0xfb,0xd2,0xff,0xe4,0x1c,0x04,0xe6,0x0a,0x16,0xec,0xc7,0x9d,0xfc,0x0e,0x2c,0xcd,0xc3,0xed,0xf1,0x15,0xf5,0x05,0xef,0x27,0x21,0xef,0xda,0xfc,0x1d,0x26,0x28,0x15,0xff,0x0d,0xdf,0x1e,0x06,0xe2,0xba,0x28,0xec,0x04,0xee,0x04,0x21,0xff,0x01,0x1d,0x15,0xd3,0x26,0xf5,0xdf,0x37,0x06,0xf2,0x1a,0xe7,0x45,0xf9,0xfa,0x2a,0x25,0xd8,0x12,0xd3,0x07,0x1c,0xe1,0xfb,0x00,0xee,0xdd,0x27,0x1f,0xd9,0xed,0x14,0xf5,0x1a,0xcd,0x3c,0xfa,0x1b,0x00,0xe2,0xf4,0xe2,0x10,0xdd,0x17,0xd3,0x15,0xcd,0x3d,0x5c,0xc4,0x04,0x03,0xde,0xed,0xef,0xeb,0xe4,0xf7,0x15,0xbf,0xe8,0xee,0xec,0x05,0x0a,0xe1,0x24,0x26,0xde,0x09,0xfb,0x2a,0xf0,0x29,0xde,0x09,0xea,0xf5,0xdc,0xf0,0xfd,0xfd,0xbd,0xfa,0xe1,0x30,0xc5,0x08,0xc6,0xf5,0xca,0xfd,0xea,0xd4,0xde,0xe7,0xe7,0x0a,0xdf,0xf1,0xe4,0xe9,0x01,0x04,0xf9,0xd8,0x3c,0xe6,0xe3,0xeb,0xe4,0x22,0xec,0xdf,0x15,0x24,0x07,0x23,0xff,0x18,0xf7,0x0a,0xb7,0xe5,0x28,0xe6,0x0f,0x0b,0x06,0xf8,0xdc,0x00,0x20,0xf4,0xcb,0x06,0xf6,0xfe,0xfb,0xd3,0xc2,0x0b,0x47,0x05,0x0c,0x22,0x07,0x06,0xec,0x1f,0xe1,0xfc,0x08,0xdf,0xb6,0xf1,0x0b,0x05,0xf6,0x38,0x00,0xeb,0x07,0xcd,0x19,0x29,0xda,0xed,0xfa,0xfe,0x39,0xa8,0xc1,0x19,0xd9,0xdf,0x23,0xec,0x2a,0xfc,0x0a,0x00,0xc1,0x26,0xb7,0xfe,0xbd,0xf6,0x48,0x0a,0xd6,0xe3,0xd5,0xe0,0x1a,0xf3,0x0e,0x00,0x19,0x22,0xf8,0xcf,0x22,0x04,0xbf,0xeb,0x08,0xee,0xbb,0xfd,0xf6,0xd9,0x30,0x26,0xd0,0xe7,0x01,0x07,0xee,0x1f,0x07,0xf8,0xb1,0x41,0x00,0x17,0xb9,0xd2,0xeb,0xce,0x0b,0xea,0xe5,0xf0,0xd7,0x1d,0x10,0xe8,0x23,0x02,0xdb,0x25,0x06,0xdf,0xe0,0xf9,0xec,0xf1,0xe1,0xee,0xfd,0xea,0xde,0xfe,0x03,0xd1,0xe5,0xd9,0xfb,0xed,0x01,0xe2,0x1a,0x02,0x1a,0x31,0xc8,0x1b,0x3c,0xf5,0xe2,0xfd,0x0d,0x31,0xec,0x30,0xb9,0x3f,0xc8,0xe7,0x0a,0x0f,0xee,0xea,0xfd,0xfd,0x04,0x01,0x05,0x27,0xff,0xee,0x00,0xef,0xd1,0xc1,0xde,0x11,0xf2,0xe0,0x0a,0xbe,0xed,0x20,0x09,0x08,0xed,0xd4,0xc7,0x08,0x05,0xcc,0x00,0xcf,0xd3,0x0d,0x07,0x24,0xc8,0x0e,0xe8,0x4e,0x41,0xf1,0xdf,0xd8,0xc5,0x30,0xfc,0x12,0xf4,0xfd,0xdd,0x23,0x34,0xf1,0x18,0xef,0x20,0x01,0x01,0x10,0x04,0x03,0x14,0xf8,0x0b,0xcf,0xfd,0x35,0xff,0xf3,0x0c,0x0a,0xc0,0xb9,0xf9,0x2d,0x0f,0xe0,0x24,0xef,0x26,0xae,0xde,0xdc,0xf4,0x1a,0xe3,0x25,0xfb,0xd5,0x1b,0x22,0xf7,0x17,0x1c,0xb8,0x40,0xb7,0xf0,0xe1,0x09,0x1c,0xc3,0xdf,0xd1,0xc9,0xd6,0xf2,0xf6,0x07,0xd6,0x0c,0xd7,0xbb,0xe5,0xbd,0xd6,0xdf,0xf9,0x04,0x17,0xe2,0xda,0x1a,0x45,0x1c,0xd6,0xe7,0x0c,0xdd,0x14,0x1a,0xcf,0x0f,0xd1,0xe3,0xef,0xd8,0x27,0x16,0xe3,0xd1,0xc9,0x0e,0xf9,0xfb,0xd9,0x81,0x13,0xeb,0x01,0xe5,0x26,0xee,0x7f,0xcf,0xc3,0xe0,0xc1,0x20,0xd6,0x01,0xdf,0x27,0xfb,0xe9,0x10,0xb8,0xfa,0xda,0x15,0xb8,0xe7,0xc9,0xeb,0xbf,0x03,0xea,0xed,0x11,0xe5,0x0f,0xc5,0xee,0xe6,0xa5,0x03,0x0a,0x0e,0x11,0x24,0xdd,0x11,0xdc,0x1c,0xe1,0xc5,0x19,0xf0,0xd7,0xdb,0xdc,0xc4,0xec,0x10,0x60,0x3d,0x25,0x06,0xf2,0xee,0x05,0x23,0xf3,0xf4,0xfb,0xfb,0xb8,0xfb,0x02,0xd3,0x16,0xae,0xca,0xfe,0xa2,0xfd,0x16,0xd2,0xbe,0xec,0xe6,0xb0,0xb9,0xe5,0x03,0x07,0x14,0xa9,0x25,0xee,0xc6,0x1e,0xf5,0xb1,0xc5,0xdb,0xfb,0xd5,0x49,0xda,0x2e,0xf1,0xe7,0x08,0xe0,0xe4,0xc2,0xbf,0xdd,0x0a,0xd5,0xf1,0xe3,0xc1,0x01,0x42,0xdc,0xe4,0xfd,0xfa,0xd6,0xd7,0xcb,0x37,0xc3,0xf1,0xd8,0x07,0xbc,0x21,0xf8,0xc8,0xc7,0xf2,0x38,0xe6,0xc4,0xc3,0x0a,0xff,0xb9,0xf4,0xc5,0xda,0xc4,0xf9,0x3d,0x00,0x0d,0x1c,0x06,0xfa,0x35,0x2e,0xe8,0xec,0x05,0x04,0x15,0x26,0xc0,0xde,0x23,0xda,0x23,0xd7,0x12,0xa9,0xf5,0x36,0xfb,0xc1,0xe6,0xaa,0xf4,0xfb,0x1b,0xd3,0x1b,0xea,0xd0,0xc7,0x03,0xd4,0x30,0x0c,0x0d,0xed,0x16,0xf5,0xd2,0xc2,0xf8,0xe7,0xd1,0xa7,0xef,0x07,0xe4,0xf5,0x25,0x2e,0xd1,0x58,0xef,0x15,0xfe,0x1d,0xe7,0x14,0xfe,0x05,0xda,0xfc,0x1a,0x09,0x95,0xca,0xe8,0x0d,0xce,0x06,0x1a,0x13,0x1c,0x05,0x0c,0x28,0x02,0x39,0xe6,0xc0,0xe1,0x02,0xbf,0x36,0x30,0xf9,0x1c,0xc5,0xa8,0xff,0xd0,0x2d,0xff,0xf1,0x0e,0xf1,0x05,0xfb,0xd4,0xf4,0x24,0x09,0xec,0x18,0xf2,0xfa,0xe8,0x11,0xbb,0x41,0xce,0xbb,0xd5,0xf1,0x01,0x34,0x16,0xc3,0xec,0xfb,0xbd,0x61,0xd6,0x20,0xdb,0xd9,0xf9,0xb1,0xff,0x03,0x4a,0x14,0x31,0xe8,0xe5,0x14,0xd0,0xe6,0xb3,0x8c,0x5e,0xc3,0x0e,0xc4,0xfd,0x98,0xf8,0xfe,0x42,0xa4,0x1e,0x16,0xee,0x15,0xc9,0xee,0xe6,0x31,0x1e,0xea,0x53,0x2e,0x81,0x1b,0xb6,0xe6,0x14,0x28,0xe4,0x4f,0x1f,0x28,0x11,0xd6,0xd5,0x5e,0x39,0x07,0x1d,0xdc,0xb5,0xea,0xfe,0x2b,0x35,0x54,0xc3,0xba,0x32,0xec,0xe9,0xc3,0x29,0x13,0xcc,0xc4,0xf8,0x37,0xbf,0x85,0xb4,0xcd,0x23,0xf4,0xa4,0xeb,0xdc,0x20,0x48,0x0b,0xce,0x03,0x0d,0xf7,0xdb,0x93,0x0d,0xfd,0xaf,0x1c,0x32,0x24,0x07,0x0e,0xb5,0x3e,0x2a,0xdc,0x43,0xe9,0xe7,0x1a,0x1b,0xe4,0x28,0x12,0xf3,0x28,0xd1,0xc6,0xfa,0x18,0xe8,0x21,0xef,0x88,0xea,0xe8,0xe2,0x9b,0xca,0xdb,0x57,0x0d,0x07,0x94,0xf2,0x2e,0x9e,0xda,0xb6,0x2c,0x2d,0xf6,0xfa,0xba,0x3f,0xd9,0x6c,0x23,0x06,0x2d,0xff,0xfe,0x27,0x11,0x1f,0x13,0x1a,0xd2,0x1f,0x99,0xd9,0xb0,0xe7,0xe4,0xb2,0x2c,0xb0,0xce,0xcf,0x4a,0x41,0xbf,0xb8,0xd5,0x93,0xed,0x55,0xbe,0x05,0xed,0xf1,0x2b,0x27,0x49,0xcf,0x05,0x07,0xd6,0x21,0x1b,0xf3,0xcc,0x0c,0xa9,0x26,0x32,0xd0,0x1d,0xc6,0x18,0x0c,0x15,0x08,0xba,0x19,0xb9,0xe7,0xe4,0x42,0x35,0x11,0xe2,0xea,0x05,0xe9,0x10,0xb0,0xd3,0xe8,0x25,0x28,0xbf,0xc5,0xe9,0x09,0xd5,0xed,0x0d,0x98,0x22,0xf0,0x50,0x0a,0x26,0x33,0x0e,0xff,0xca,0xe0,0x17,0xd6,0xe9,0xf0,0x1e,0x02,0x1d,0xd1,0xfd,0xe3,0x1c,0xfe,0xe2,0x42,0xb2,0x2f,0x48,0x07,0xec,0xb1,0xb7,0x00,0x88,0x23,0xd5,0x21,0xa2,0x18,0xd8,0x81,0xef,0x0b,0xf8,0x01,0x25,0x14,0x3d,0xc3,0x00,0x03,0x0f,0x42,0xa1,0x3a,0xc3,0x3b,0xb8,0x4e,0xdb,0xf4,0xf4,0xfe,0xea,0x1b,0x23,0xc1,0x23,0x1a,0x3b,0xcc,0x22,0x1d,0x0c,0x8c,0xdd,0xf5,0xca,0xed,0xf8,0xef,0xf3,0x1c,0x2a,0xd3,0xc0,0xc9,0xdc,0xeb,0x11,0xeb,0xe7,0xc5,0xcb,0x02,0xff,0xfe,0xb9,0xe3,0xf3,0x22,0x4f,0x10,0xfb,0x37,0x0e,0x2d,0x1f,0xc7,0x1e,0xce,0x1d,0xfd,0x12,0x86,0x39,0xcd,0xc5,0x33,0xce,0xc3,0x45,0x11,0x24,0x9f,0x1b,0xd0,0x24,0xf6,0x22,0xb7,0x30,0xc7,0xb8,0x2a,0xef,0x02,0x3d,0x5c,0x15,0x60,0xf2,0xc6,0xe3,0xd5,0x05,0xc2,0x0e,0xe2,0xb2,0xc6,0x2e,0xf4,0xef,0x0f,0x98,0xc4,0xce,0x1f,0xe6,0xd2,0xaa,0xf2,0x46,0xc6,0xe5,0x62,0x3f,0xcc,0x4f,0xe9,0xdf,0x16,0xed,0x53,0xb6,0xf3,0xde,0xc3,0x89,0x32,0xc7,0xe5,0x04,0x09,0x2c,0x07,0xc0,0xe0,0x4a,0x31,0x41,0xdc,0xb2,0xbe,0xc4,0x3f,0xf1,0x09,0xb0,0x0f,0x42,0x0c,0x15,0x26,0xd6,0xad,0x29,0xcc,0x98,0xb1,0xe9,0xd6,0xf7,0xa8,0xe4,0xe4,0x0a,0xd2,0x1c,0xdf,0xbe,0xa9,0xeb,0x09,0xdf,0x2e,0x13,0x31,0x0a,0x37,0xad,0x3c,0xcb,0xf3,0x37,0xe9,0xe8,0x3d,0xae,0x14,0xf2,0xef,0xe6,0x18,0x00,0xc6,0xc3,0xe3,0xf3,0xcd,0xb0,0xee,0x28,0x19,0x4b,0xb1,0xd4,0x2b,0x0a,0xe5,0x05,0x05,0xee,0xfb,0xfa,0x23,0xeb,0x01,0xf1,0xe5,0x1c,0xe5,0xd1,0xb9,0xeb,0x18,0xe1,0x02,0xe6,0x24,0x24,0xd6,0xf3,0x0b,0x27,0xfa,0xe6,0xce,0xfe,0xe9,0xf3,0xe3,0x06,0x0d,0x0d,0xf4,0x3f,0xf6,0xdc,0x27,0xd2,0xf7,0xd8,0x01,0xe9,0x05,0x15,0xf6,0x17,0xfd,0x1d,0x08,0xcd,0xf5,0xfb,0x06,0x0d,0x08,0xe0,0x37,0x20,0x0b,0x16,0xfc,0x29,0x09,0xdc,0x16,0xdc,0x14,0x1a,0x51,0xc2,0x58,0x05,0x16,0xf9,0x11,0xee,0x14,0xd7,0x22,0x19,0xd3,0xfc,0xf3,0x00,0x44,0xe5,0xff,0xea,0xe5,0x13,0xd3,0xee,0xe9,0x0e,0xf6,0xdc,0x49,0xe1,0xf9,0x12,0xe3,0xcb,0x04,0xe0,0xe1,0x15,0xe9,0xeb,0x08,0x01,0x02,0xda,0x04,0xf5,0x13,0xfd,0xec,0x1c,0xdb,0x16,0xed,0xf8,0xcc,0x0f,0xd2,0x3d,0x0e,0xd6,0x1d,0x1b,0x13,0x19,0x13,0x03,0xf3,0x1c,0x24,0x25,0x4d,0xc2,0xc8,0x00,0xbf,0x27,0x18,0x15,0x28,0x02,0x1a,0x06,0xe9,0xde,0x0e,0x2a,0xfe,0x03,0x10,0x36,0xe4,0xd6,0xec,0x0f,0x0e,0xf7,0xd1,0xe5,0x12,0xf5,0xcf,0x46,0x12,0xd2,0xd6,0x10,0x01,0x7f,0x0b,0xd1,0x22,0xd6,0xf7,0xe4,0xdf,0xe6,0xf4,0xda,0xd5,0xf3,0x2f,0xe2,0x18,0x09,0xd2,0xdb,0xe2,0x1c,0xf5,0xd7,0x1c,0xed,0xe2,0xff,0xb5,0x38,0xd7,0xf6,0xbc,0x2b,0x06,0xc5,0xea,0x14,0xf3,0xb7,0xfa,0xfe,0x20,0x12,0xe8,0x27,0xd1,0xf4,0xdc,0xf3,0xf1,0xfb,0x37,0x29,0xfc,0x0d,0xc5,0xfc,0xcd,0x1d,0xff,0xc4,0xd4,0xc5,0x25,0xf9,0x16,0x0a,0x18,0xfc,0x08,0x03,0xd9,0xf3,0xe1,0xfc,0xea,0x06,0x19,0xe5,0x05,0xfe,0x01,0xe6,0xfc,0x1f,0x24,0xd9,0x10,0xfc,0xfc,0xe5,0xd8,0x30,0x10,0xcc,0x04,0xd7,0xe5,0xad,0x0a,0xf4,0xfc,0x21,0xb5,0x16,0x03,0x30,0x1f,0x3f,0xfa,0xe1,0x3b,0xf2,0xc1,0xe1,0xe1,0x0c,0x15,0xe7,0xee,0x19,0xfd,0x38,0xef,0xfc,0xf4,0xf0,0x0e,0xf8,0x2d,0xdb,0xc9,0xeb,0x18,0x48,0x1d,0x14,0xd6,0x2e,0xd9,0x27,0xaf,0x2a,0xe6,0xe1,0xe8,0x07,0x2d,0xff,0xe7,0xd8,0xcf,0xc6,0x09,0x29,0xd9,0x0d,0xd2,0xe3,0x3f,0xbe,0x09,0xf5,0x0d,0x02,0xea,0x14,0xfc,0xe9,0x01,0xb3,0x04,0x1d,0xf1,0xfc,0xe0,0x36,0x39,0xff,0xa9,0xfc,0xdb,0x04,0x09,0x23,0xf0,0x28,0xca,0xd6,0xed,0x08,0xf0,0x97,0xf3,0xec,0xf4,0x50,0x0e,0x56,0xff,0xe5,0x20,0xf7,0xcb,0xf0,0x13,0xf4,0xfa,0x0f,0x23,0x7f,0x0f,0x04,0xe0,0x2e,0xff,0xd5,0xbd,0x09,0xe6,0x11,0x27,0xfc,0xb6,0xfd,0xa8,0xd8,0xe8,0xf1,0x08,0xc1,0xdb,0x1a,0x00,0xf1,0x2c,0xc1,0xf5,0xad,0x10,0x05,0xe9,0x07,0xed,0xca,0xdb,0xd8,0x13,0xd9,0x0c,0x09,0xe2,0xe6,0xd4,0x25,0x17,0xff,0x17,0xf0,0x50,0xfb,0x04,0x18,0xdd,0xef,0x21,0xd0,0xfc,0xe9,0xe3,0xfe,0xc1,0xf0,0x24,0xfd,0x0f,0x05,0x08,0xef,0xf7,0x1c,0xd4,0xce,0xff,0xb1,0xdf,0x16,0x05,0xf0,0xd8,0xe3,0xf6,0xe9,0x1a,0x1a,0xf8,0xfd,0xe5,0xc1,0x1d,0x03,0x0a,0xd0,0xf6,0xf6,0x16,0x27,0xe8,0x04,0x3c,0xd3,0xba,0xc8,0x35,0x29,0x14,0x17,0x03,0xeb,0xca,0x44,0xee,0xe4,0xb4,0x0e,0x16,0x16,0x0b,0xfc,0xd5,0x04,0xea,0x19,0xdd,0xe5,0x11,0x23,0x18,0x36,0xe9,0xb7,0xfd,0x2f,0x1e,0x8c,0xbf,0x4b,0x17,0xba,0xe8,0xef,0x0f,0xaf,0xc8,0x11,0xdf,0x13,0x98,0x29,0x20,0x12,0x4c,0xe9,0x9c,0x28,0x18,0xc9,0x24,0xf5,0xf5,0xe3,0x9b,0x21,0x19,0xe1,0xd0,0xb5,0xf7,0x41,0x0a,0xef,0x88,0xd0,0xe5,0xc1,0xf0,0xfc,0xca,0xc6,0x06,0xf0,0xea,0x21,0xf2,0x1e,0xd5,0xc3,0xf6,0xfb,0x09,0x01,0x9a,0x13,0x04,0xb0,0xbb,0x0b,0x18,0x05,0xa0,0x01,0xcc,0xe3,0x45,0x81,0xae,0x28,0x98,0xe3,0x8a,0x1c,0x6b,0xe6,0xca,0xf9,0x1d,0xe7,0x08,0x1a,0xcd,0xda,0x58,0x4c,0x0f,0xa9,0xf1,0x16,0x08,0xa6,0x47,0x05,0xd5,0x17,0xfc,0x39,0x31,0xe1,0x5f,0x12,0x5f,0x00,0xf0,0xac,0xe5,0x29,0xbc,0xec,0xf2,0x11,0x07,0x33,0x0e,0x19,0x1e,0xbb,0x29,0xfc,0xc4,0xb3,0x41,0x59,0x15,0xe4,0x64,0x57,0xf0,0xb7,0xeb,0xef,0x00,0xad,0xc7,0x19,0xdb,0xed,0x15,0xdc,0xfa,0xeb,0xde,0x26,0xd2,0x0c,0x8b,0xf0,0x3b,0x04,0xed,0xee,0x1d,0xe9,0xe6,0x23,0xe3,0x34,0x34,0x07,0x4f,0x3e,0x08,0xa5,0xa9,0x3f,0xe6,0x0a,0xeb,0xd6,0xd6,0xf0,0xe4,0x09,0x97,0xec,0x41,0xd5,0x04,0xe0,0xf3,0x04,0xfe,0x10,0xc9,0x07,0x86,0xfc,0x55,0xc4,0xe6,0xf9,0x1a,0x57,0x4e,0xd5,0xd5,0xd6,0xe8,0x07,0x1a,0xe4,0x01,0xb0,0xe2,0x83,0xff,0xee,0xb2,0xf4,0x2f,0xc0,0x17,0x52,0x39,0x0b,0x0a,0x08,0x24,0xe5,0xfc,0x20,0x35,0x81,0x2c,0x4d,0x3a,0x33,0x2c,0x15,0x14,0x93,0xb8,0x29,0xff,0x08,0x50,0xd8,0xc2,0xb6,0xd6,0x3b,0xc6,0x13,0xe4,0x12,0xfb,0xcf,0x29,0x33,0x11,0x10,0xf2,0x1f,0x1a,0xe6,0xb2,0x0c,0x0e,0x1f,0x0a,0x1a,0x14,0xde,0x03,0xec,0xed,0x28,0xe4,0xbe,0x0d,0xaf,0x1a,0x10,0xe5,0xe7,0x03,0xfd,0xb7,0xe6,0xd5,0xff,0x0a,0x15,0x06,0xca,0xe3,0x07,0xe9,0xc3,0xae,0xe5,0x11,0x31,0x1a,0xfd,0x38,0x09,0xe4,0x02,0xe3,0xec,0xd6,0x1f,0xae,0xed,0xe3,0x00,0xc9,0xfe,0xd1,0xf5,0x00,0xf7,0xf1,0x04,0x14,0x05,0xed,0x3a,0xfd,0xf1,0xea,0xec,0x31,0x41,0x1f,0x21,0xf7,0xbc,0x3e,0xea,0x39,0x01,0x05,0x09,0x0e,0xd9,0x22,0xfb,0xef,0x04,0x42,0x22,0x02,0xc5,0xc7,0x1a,0x1a,0x0a,0xed,0xfd,0x14,0xf7,0xf2,0x0d,0xf4,0xc3,0x1f,0x27,0xe7,0xd9,0xdd,0x04,0x20,0x02,0x7f,0xb3,0xc0,0xcf,0xe2,0xd1,0x0c,0x07,0xe0,0x6d,0x12,0x28,0xf5,0x1c,0x18,0x1f,0xf6,0xfe,0xb9,0xf2,0xfa,0xda,0xa9,0xeb,0xd9,0xe3,0x1d,0x08,0xd0,0xcc,0x1c,0xd7,0x30,0xea,0x09,0xed,0xe5,0x04,0x1d,0x14,0xdb,0x1c,0x1d,0xf8,0xfd,0xe0,0x14,0x05,0xcd,0xd4,0xdb,0xbc,0x02,0xf2,0xf2,0x00,0xd5,0xf4,0x07,0x29,0xe4,0xfc,0x01,0x35,0xd8,0xd3,0xd4,0xeb,0x3e,0xee,0xd5,0x0a,0xd1,0x0c,0x0a,0x10,0x2c,0xf1,0x0d,0xeb,0xdc,0xff,0xe9,0xd2,0x02,0x14,0xf0,0xae,0x22,0x06,0xd6,0xf4,0x30,0xc5,0xd4,0xcc,0x19,0x05,0x18,0xe0,0xc6,0x15,0x0e,0xea,0xf9,0x11,0x3b,0xe8,0x60,0x15,0xfe,0xec,0xfb,0x24,0xe1,0xf8,0x1a,0x14,0x12,0xea,0x23,0xce,0xe0,0xe3,0x0e,0x32,0x51,0x05,0x26,0x06,0x06,0x4c,0xde,0xeb,0xf0,0xdf,0xf1,0x02,0x1f,0x3a,0x1b,0x3d,0xd7,0xcc,0x0c,0xd4,0xe3,0xef,0x08,0xed,0xaa,0x15,0xb3,0x19,0xe6,0xbb,0x2b,0x1d,0xde,0x2d,0x01,0xbd,0xe5,0xfa,0x10,0xba,0x1a,0xec,0xe9,0xb5,0x17,0x1f,0xd5,0x19,0xd8,0x3a,0x1c,0xe0,0xb8,0x07,0xe4,0x14,0x38,0xeb,0x06,0xfe,0xc5,0xee,0xf8,0xa6,0x08,0xff,0xf2,0x00,0xd4,0xe2,0x2c,0xfe,0x28,0x2a,0x17,0xa0,0x05,0xe9,0xf9,0xb6,0x15,0xef,0x06,0x27,0xfa,0x17,0xda,0xe1,0x18,0xd0,0xb8,0x58,0xaf,0xf6,0xdd,0xf6,0x2f,0x05,0x0f,0xe1,0x38,0xfd,0x06,0xd2,0x05,0xb4,0x00,0xd6,0x02,0x01,0x27,0x8b,0x06,0xdb,0xfa,0x10,0x4c,0xe8,0x02,0xa1,0x16,0xf8,0xe8,0xdd,0xf4,0xa5,0xcd,0xab,0xf8,0xf7,0x09,0xc2,0x18,0x2f,0x10,0xd6,0xd3,0x40,0xea,0x33,0xd2,0xec,0x08,0xf4,0x01,0x03,0xe3,0x1f,0xc5,0xe5,0x7f,0xd7,0xe1,0x16,0x0c,0x0d,0xb1,0xf3,0x3e,0xed,0xc9,0xd8,0xf9,0x72,0x08,0x9a,0xea,0xf9,0x2f,0x4d,0xd7,0xc5,0x0a,0xe2,0xe2,0xb8,0x54,0xd2,0xe0,0x16,0x0b,0xeb,0x13,0xe0,0x2a,0xbe,0xce,0x33,0x8c,0xfc,0xdc,0x60,0xdf,0xe0,0xed,0xe5,0x2b,0xd9,0xbd,0xd3,0x2a,0x26,0xb1,0xab,0x12,0x9a,0xc0,0xd3,0xb0,0x12,0xd4,0x17,0xc6,0xed,0xa6,0xe5,0x06,0x09,0x2a,0xf5,0xa9,0xfc,0xe1,0x5b,0xd2,0xfa,0xed,0x23,0x1f,0xed,0xb1,0x11,0xec,0x0c,0x01,0x01,0xcb,0x25,0xd8,0x13,0x15,0xf2,0x1c,0xee,0xd4,0xd8,0xf6,0xfe,0x3d,0xde,0x01,0xca,0xc7,0xe7,0x9a,0xd4,0x15,0x0d,0xf9,0x17,0xd7,0xfa,0xe6,0xc0,0xcc,0x36,0x23,0xeb,0xf8,0xe5,0xd2,0x1c,0xd8,0xdf,0xb2,0xeb,0xf4,0xea,0x1e,0xfb,0xdd,0xfc,0xf2,0x1f,0xe0,0xfb,0xd0,0x26,0xef,0xa5,0xeb,0xd2,0xfb,0x07,0x19,0xfd,0xee,0x16,0x06,0xd2,0xee,0x0f,0x21,0xea,0x04,0x20,0x4b,0xf0,0x17,0x0f,0x19,0xfe,0x3d,0xdf,0xdd,0xd5,0xe7,0x14,0x00,0x06,0x02,0x11,0x0d,0x0e,0x02,0xf6,0xe7,0x4a,0xf0,0xff,0xff,0xb2,0x28,0x22,0x1b,0xd0,0x25,0xd7,0x03,0xf9,0xfb,0x0c,0x05,0xdf,0x14,0x1a,0x17,0x34,0xef,0x0c,0x22,0xf5,0x0d,0xf5,0x0e,0x09,0xdd,0xfc,0x42,0xf7,0x07,0xfb,0xdf,0xe0,0xd7,0x08,0xcd,0xf6,0xcb,0xe1,0xdc,0x18,0xf0,0xee,0x07,0x1d,0x26,0xd6,0x10,0xf3,0xf0,0xd8,0xf5,0xf1,0xc8,0x23,0xf4,0xc1,0xd4,0xed,0x07,0xcf,0x4c,0x1b,0x21,0x34,0xf3,0xe3,0xf4,0x22,0xeb,0xfd,0x01,0xcb,0xfc,0xd0,0xeb,0x0a,0x07,0x20,0x00,0x1a,0xcc,0x23,0x31,0xfa,0xe6,0xc3,0xf0,0x08,0x15,0xdf,0xed,0xf3,0xf4,0xf6,0x17,0xf9,0x16,0xd6,0xd2,0x11,0x31,0xdb,0xfe,0x1d,0x13,0xdf,0x09,0x1f,0x00,0x7f,0x20,0xe1,0xff,0xdd,0xba,0xfd,0xe7,0xe4,0xf2,0x00,0xda,0xdf,0x1e,0xbd,0x04,0xd1,0xfd,0xd1,0x05,0xf0,0xfa,0xd3,0xd2,0xec,0xcb,0x28,0xf4,0xf9,0xf1,0x08,0xbb,0xea,0x0d,0x0f,0x27,0x10,0xce,0x23,0xe1,0xec,0x38,0x1a,0x17,0xcc,0x12,0x17,0xe2,0xf4,0x33,0xdf,0xcf,0x37,0x1a,0x0b,0xda,0x12,0xcb,0xf4,0xe4,0x9a,0x06,0xf7,0x28,0x00,0x0b,0xc4,0x12,0xfd,0xe0,0xf9,0xdc,0xce,0xda,0x12,0x04,0x24,0xfb,0x18,0x14,0x20,0xff,0x13,0xf2,0x16,0xdb,0xfc,0xf2,0x02,0x2b,0x00,0xe4,0xef,0x22,0xf5,0xe7,0x13,0xf6,0xe5,0x19,0xdf,0x14,0x1e,0xd5,0xf3,0xf4,0xcc,0xe0,0x01,0xf4,0xe6,0xeb,0x1f,0x06,0xed,0xcf,0xcd,0x36,0xf1,0x03,0x24,0x0d,0xf4,0x2f,0xda,0xf5,0xee,0xfc,0xe1,0xe0,0xff,0xf5,0xd7,0xd6,0xdd,0x17,0x17,0xde,0xf8,0x02,0xce,0x1a,0x7f,0x15,0xda,0x03,0xd1,0xf4,0xe4,0x35,0xf9,0xf1,0xf1,0x04,0xf3,0xbe,0x10,0xf3,0xfd,0x0c,0xd5,0xdb,0x15,0x0e,0xfa,0xd5,0x0b,0x13,0xf8,0x00,0xef,0xf5,0xfc,0x2a,0x05,0xf9,0xfe,0xdf,0xd9,0x14,0x00,0x4b,0x1b,0x01,0xd0,0xf0,0xf7,0x07,0xfe,0xe5,0x04,0x0d,0xec,0xf2,0xf1,0xd9,0xf7,0x02,0xcb,0xf7,0x1a,0xe5,0xe3,0xdf,0xca,0xf2,0xf8,0xf6,0xe2,0xe4,0x22,0xfd,0xf8,0xe5,0xe6,0xed,0xfe,0x00,0xf0,0xc0,0x00,0xc7,0x1d,0xe3,0xd6,0xfe,0xf1,0xef,0xda,0x12,0xf6,0x08,0x00,0xf0,0xe3,0xdb,0x06,0xf3,0xf7,0x14,0x3b,0x0c,0xfa,0x00,0xff,0xd6,0xe8,0x4b,0xd7,0xec,0x33,0x04,0x0d,0x40,0xe7,0x00,0xfb,0x00,0x05,0xee,0x1f,0x38,0x21,0xb8,0xf3,0x1b,0xfa,0x13,0xe2,0xd8,0xe1,0x0b,0xfc,0xe8,0xea,0x00,0xe1,0xf7,0x0d,0xe0,0x22,0xd3,0xee,0xf2,0xce,0xee,0x32,0xf5,0xfe,0xcd,0x10,0x01,0x15,0xea,0x2b,0xef,0x1c,0xd9,0xfa,0x0e,0x22,0x13,0xf1,0xf8,0xfb,0xff,0x2a,0xfd,0x03,0x2e,0x19,0xca,0x05,0xfc,0x13,0x1f,0x16,0xea,0x0b,0x2c,0xfd,0xdf,0x11,0xf5,0xc7,0x12,0x06,0xd3,0x07,0x2b,0x13,0xf2,0x05,0xf4,0x0a,0x0a,0x18,0x03,0xf9,0xeb,0xdb,0x0f,0xd2,0xff,0xd5,0xda,0xf6,0xd5,0xda,0xf4,0xc7,0xf7,0xb9,0xf0,0x10,0xca,0x45,0xf1,0xf8,0x1e,0xe3,0xbd,0xe8,0x0f,0x10,0x2b,0xd3,0x0a,0x18,0xe1,0x25,0xbd,0x23,0xd8,0xd1,0x11,0x20,0xef,0xee,0x0d,0x11,0xdb,0x1e,0xfb,0x52,0x15,0xdb,0xf5,0x10,0xd2,0xf2,0x02,0x2b,0xf3,0xf2,0x46,0x07,0x00,0xbe,0x10,0xf2,0xef,0x15,0xe8,0x07,0x05,0x25,0x10,0x33,0x32,0xd7,0xb5,0xe8,0x24,0xf5,0xf4,0xf1,0xdd,0x08,0xc4,0x0b,0xd0,0x20,0xdb,0xcf,0xf8,0x0c,0x30,0x07,0xbd,0x06,0x04,0x15,0x1f,0xd8,0x2e,0xf6,0xb7,0xe4,0xec,0xef,0xb1,0x0b,0xec,0xf5,0xcc,0xf3,0x43,0x2c,0x07,0xdc,0x42,0x24,0xe7,0xff,0xdc,0xed,0x12,0xc2,0xb6,0x21,0xda,0xf7,0xf2,0xe7,0x00,0xd9,0xf2,0x1b,0x25,0x07,0x2a,0x37,0xd4,0xe1,0xf1,0xeb,0xc4,0x1d,0x0e,0xd2,0xd3,0xe7,0x26,0x1c,0xe9,0x33,0xdb,0xa6,0x32,0x02,0x07,0xe8,0xf9,0xf8,0x0f,0xde,0xe0,0x27,0x14,0x20,0x10,0xe0,0xf3,0xe2,0x06,0xcd,0x24,0xc0,0xf2,0x10,0x4b,0x7f,0xe0,0xad,0xef,0x01,0xb3,0xc6,0xf7,0x17,0xdd,0x52,0xd8,0xdb,0x4c,0xfc,0x2b,0x0d,0xbc,0xf9,0xe2,0x00,0x18,0xbb,0x04,0x30,0x0e,0x1a,0xdb,0x17,0xd1,0xd8,0x01,0xf1,0xf6,0xfa,0x23,0x20,0xfe,0xdd,0x0d,0xef,0xce,0x09,0xdc,0xda,0xe4,0x5c,0xc6,0x11,0x03,0xdc,0xf6,0x2b,0x40,0xf3,0x0b,0x1d,0x19,0xa7,0x05,0xc5,0x09,0xc8,0xed,0x28,0x07,0xe8,0x0c,0x0a,0x24,0x13,0xec,0xb4,0x09,0xfd,0xec,0x25,0x1a,0xe2,0xe1,0xfe,0x26,0xa1,0xcd,0x15,0xe6,0x1d,0xdf,0xeb,0x9e,0xe7,0x0f,0x05,0x9c,0x33,0x36,0xcb,0x39,0xd2,0x0e,0x4c,0xa6,0xe5,0xbd,0xd1,0x07,0xc9,0xef,0xaa,0xdd,0xec,0x02,0x09,0xe5,0xed,0xf7,0xd3,0xfb,0xd1,0xa8,0xb0,0xdb,0xf3,0xed,0x0a,0x81,0x49,0x00,0xb3,0xc6,0xc3,0xd5,0xfa,0xfc,0xe1,0xbd,0x48,0xd9,0xfd,0xc3,0x09,0xe4,0x24,0x26,0xd9,0xd4,0xfc,0x03,0x51,0x2f,0x07,0xe5,0x9d,0x02,0xc5,0xd1,0x07,0xf8,0x31,0xea,0xf6,0xeb,0x05,0x01,0x0c,0x21,0xa9,0xea,0xf1,0xb1,0xfb,0x60,0xf4,0x0b,0x40,0xb0,0x4f,0x33,0xba,0xcf,0x13,0x03,0xea,0xd5,0x3d,0xd0,0x3d,0x06,0x99,0xf2,0x04,0xf1,0xe2,0x94,0xee,0xf2,0xa5,0xac,0x33,0x19,0xcc,0x84,0x30,0xd4,0xa8,0x34,0x81,0x26,0x0a,0xb8,0xde,0xfa,0x32,0x02,0xd8,0xfb,0x39,0x49,0xd7,0x0e,0x24,0xda,0xda,0xed,0x3d,0x93,0xbe,0x0b,0xdb,0x39,0xd9,0xfb,0xe3,0x27,0xe3,0xba,0xe9,0x36,0xf3,0xea,0xde,0xb9,0x20,0x21,0x84,0xf9,0x2c,0x0a,0xff,0xed,0x27,0xef,0x1a,0x08,0xe1,0xe0,0xfb,0xe1,0x0a,0x13,0xe2,0x20,0xfa,0xae,0xf9,0xe1,0xf4,0x96,0x30,0x11,0xb3,0xdf,0x49,0x42,0xd9,0xbc,0xbc,0xcf,0xf4,0xe3,0xff,0x02,0x57,0x17,0xf6,0xc5,0x35,0xe4,0xf1,0x03,0xc1,0xd4,0x26,0xa5,0x05,0xcd,0x31,0xab,0xf8,0x14,0x18,0xa6,0xe4,0x3b,0x94,0xf5,0xe7,0xc3,0xb1,0x0e,0xc6,0xd4,0xd2,0x33,0x02,0x60,0xf0,0xe2,0xc8,0x08,0x20,0x93,0xe8,0xc0,0x20,0xfd,0x46,0xcc,0x3d,0x0b,0xf9,0xe6,0xae,0xf5,0xff,0xff,0xd6,0xdd,0x10,0xd0,0xd3,0x01,0xe0,0x11,0xf9,0x09,0x0e,0xc3,0xbe,0x0f,0xea,0xde,0xc9,0x02,0x02,0x0b,0xeb,0xfa,0xed,0xf6,0x15,0x04,0x14,0xf7,0x11,0x10,0xde,0x2b,0x0f,0xe0,0xc8,0xed,0xec,0x2b,0x24,0x10,0xd1,0xf0,0xfd,0xeb,0xef,0x06,0xcc,0x15,0xf5,0xf3,0xf0,0x27,0xe4,0xf9,0xc0,0x04,0xcd,0x01,0xf6,0x10,0x20,0xea,0x81,0x15,0xdd,0xef,0xd3,0x11,0xe5,0xbd,0x0e,0xd5,0x2d,0x1e,0x1d,0x0b,0x0d,0x13,0xf1,0xe9,0x05,0x00,0x0b,0xe7,0x01,0xdf,0xfc,0x01,0xe6,0xe7,0xee,0x11,0x14,0xc4,0xf2,0xde,0xfd,0xe1,0x12,0x0a,0x12,0xf1,0xe5,0xe4,0x17,0xee,0x12,0x14,0x0c,0x02,0xf9,0xf8,0x35,0x07,0x0a,0x03,0x04,0x10,0x0d,0x07,0xd7,0x03,0x0f,0x0d,0x2c,0x0a,0xdf,0x0e,0xd5,0xf7,0xc9,0x14,0xd7,0xd5,0x14,0xea,0x00,0xee,0x12,0xf4,0x2e,0x08,0x15,0xf5,0x18,0x18,0xdd,0x25,0x12,0xea,0xe8,0xf2,0xad,0x1c,0x12,0xe6,0x01,0xeb,0xf0,0xfa,0xee,0x1a,0x22,0xed,0x22,0x29,0xfe,0x0e,0x23,0xd2,0xfd,0x15,0x07,0xfc,0xf1,0x3c,0xde,0xd6,0x09,0xbb,0xcf,0xef,0xc1,0x1e,0x19,0x09,0x1d,0xfd,0xf3,0xec,0x14,0xf1,0xe8,0xf9,0x22,0xf7,0xe5,0x0a,0x02,0x13,0xee,0x26,0x03,0x0f,0xef,0xdb,0xe9,0x46,0xed,0x0c,0xf0,0xfb,0xd4,0xdb,0xfd,0xe3,0x13,0x14,0xc9,0x07,0xea,0xea,0xda,0xcc,0x08,0x2e,0xdc,0xde,0xe6,0x21,0xc5,0xf1,0x0c,0x38,0xde,0xf3,0x0e,0x01,0xc3,0xe9,0xfd,0x0b,0xf7,0x39,0xe2,0x17,0xdf,0x0e,0x1b,0xda,0x08,0xeb,0xdf,0x0b,0x03,0xd0,0x35,0x43,0xa9,0x00,0xb6,0xba,0x9e,0xa9,0xa4,0xe3,0x01,0x1a,0xdf,0x12,0x10,0xba,0xb0,0xd2,0xf7,0x69,0xfa,0xfe,0xdc,0xb0,0x00,0x01,0x05,0xe5,0x3d,0xaa,0xe7,0xa4,0xf0,0xc5,0xeb,0xa0,0xc0,0xa6,0xc9,0xbf,0x17,0x74,0xe7,0x08,0x11,0x1c,0x1f,0x2b,0xed,0x39,0x01,0x00,0x9b,0xfb,0xd8,0xfa,0x21,0xc9,0x14,0x2e,0x0e,0x17,0x9a,0x08,0xd3,0xfc,0x00,0xcf,0xff,0xc5,0xba,0xf6,0x1a,0xfd,0x2f,0xd8,0x36,0x4d,0xcd,0xf6,0x11,0x06,0x65,0xe2,0x1b,0xc3,0x0f,0xc7,0xdd,0xde,0xd2,0xcf,0xeb,0xcc,0xfb,0xb7,0x56,0xc6,0x12,0xdd,0xec,0xdc,0xfb,0x04,0x20,0xc0,0xcc,0x17,0xd3,0xf4,0xe4,0x0d,0x21,0xde,0xc5,0xb5,0x0d,0x3e,0x1d,0x06,0xe9,0x23,0xfa,0xc0,0xd2,0xf2,0x69,0xff,0x05,0xda,0x11,0xe5,0xb9,0x21,0xd5,0x97,0x25,0xe4,0x0e,0xfc,0x05,0x1c,0xc0,0xef,0xed,0xa8,0xf9,0xe5,0xed,0x44,0x0d,0x26,0xff,0x29,0x1c,0x41,0xc3,0xd1,0xff,0xe3,0xe7,0x9a,0xc9,0x34,0x29,0x5e,0xbd,0xdc,0xc4,0xf2,0xe4,0xeb,0xf9,0x7f,0x3b,0xf1,0x63,0x19,0xdd,0xea,0xda,0x34,0xe5,0xf0,0xf9,0xc2,0x1d,0xcc,0x1f,0xd8,0xd0,0x40,0xfe,0x26,0xd2,0xad,0x32,0xb3,0xdc,0xa5,0xe1,0x14,0x11,0x76,0x5f,0xe7,0x13,0xde,0xdf,0x2e,0x32,0x05,0xe3,0x27,0xf5,0xfc,0xee,0x1a,0x3d,0xb4,0x1f,0xd4,0xf2,0xd9,0x2e,0xe1,0x00,0x1e,0x05,0x2c,0xd4,0xc4,0x09,0x25,0xea,0xa1,0xc8,0x29,0xd5,0x1f,0xcb,0x0f,0x2e,0xf1,0xee,0xe5,0x3b,0xed,0xd7,0x22,0xfe,0xdb,0x32,0xd7,0xd6,0xff,0x09,0x02,0x18,0xf2,0x01,0x05,0x01,0xe2,0xd4,0xdb,0xf4,0x10,0xaf,0xfc,0xe8,0x22,0xe0,0x0f,0xe0,0xff,0x36,0x04,0xf5,0xd2,0xd1,0xa9,0x12,0xde,0x0e,0x0d,0xe2,0xfe,0xdf,0xf5,0xf5,0xd3,0x1a,0x13,0x0a,0x2f,0x03,0xeb,0xe2,0xdb,0x11,0xfd,0xf7,0xd8,0x0f,0x02,0xbf,0xc8,0x1e,0xe2,0x0e,0x05,0xd1,0x23,0x02,0x22,0x11,0xff,0x92,0x27,0x2b,0xd3,0x07,0xb1,0xfd,0xd1,0xd1,0x32,0xeb,0x2c,0xfe,0xd2,0xea,0xf7,0xe1,0x21,0x0e,0xde,0x0a,0x02,0xf9,0xc4,0x0c,0xfc,0x0a,0x20,0x01,0xbf,0xc9,0xee,0x09,0xd3,0x05,0xff,0xcb,0xf4,0x15,0xe8,0x1b,0x0a,0xd3,0xf0,0xef,0xb1,0x33,0xba,0x4f,0xd8,0xfa,0x06,0xcd,0x13,0x00,0xe5,0x31,0xd6,0x25,0xec,0xfe,0xb0,0xd6,0xf5,0x11,0x1a,0xd9,0x03,0xe6,0x0c,0x4c,0xf4,0xe9,0xf4,0xd6,0xbb,0xfa,0xf8,0xde,0x9f,0x1a,0xb7,0xef,0xe2,0x17,0x0d,0x0f,0x2c,0xf0,0x07,0xbc,0x36,0xf9,0x32,0x04,0xfe,0x07,0xe3,0xe9,0xc0,0xf7,0xde,0x2d,0xe0,0xed,0x18,0xd6,0x38,0xf6,0xe3,0xdd,0xe0,0xfc,0xc1,0x7f,0x13,0xe0,0x25,0x2e,0x13,0xed,0xde,0xe5,0xe5,0x17,0xe3,0xc9,0x3c,0xde,0x0c,0xf2,0xa5,0xda,0xdd,0x3c,0xec,0xdb,0x0c,0x27,0xed,0xef,0xd2,0x36,0xd1,0xf5,0xc2,0xab,0x0c,0x0a,0xc2,0x28,0xdc,0xcf,0x10,0xc6,0xd9,0xca,0xe6,0xdf,0x16,0x10,0xe4,0xfe,0x1e,0xe5,0x4f,0x02,0x15,0xfe,0x00,0xd7,0x0e,0x07,0xef,0xd4,0xef,0xf1,0xf2,0x21,0x2f,0xc6,0xfc,0x39,0x16,0x32,0x9a,0xcd,0x07,0x1e,0x04,0x23,0xf5,0xfa,0x12,0x34,0x21,0xfa,0x05,0x30,0x24,0x33,0xf2,0xf9,0xfd,0xd5,0xff,0x46,0xd2,0x18,0x1a,0xc3,0x32,0x15,0xdc,0x03,0xd7,0x32,0xf2,0xe7,0xd7,0x16,0xf0,0xf0,0x03,0xe9,0xdd,0x25,0xf4,0xf8,0xfa,0x13,0xe3,0x41,0x1b,0xc4,0xe1,0x18,0x14,0xe9,0xe7,0xe2,0xff,0x2d,0xf6,0xea,0xd4,0xdc,0x23,0xea,0xea,0x29,0x14,0x0e,0xec,0x0b,0xec,0x00,0xf7,0x08,0xdc,0x1a,0xef,0xe4,0xf2,0x20,0xcb,0xc3,0xf6,0x3d,0x14,0xe2,0xc5,0xf7,0xf7,0xd2,0xe6,0x0b,0x1a,0xf9,0x26,0x20,0x1f,0x0f,0xd4,0xf3,0x0e,0xd6,0x4d,0x01,0x07,0x1a,0xf1,0xe1,0xe0,0x1e,0xea,0xea,0x1d,0xfe,0xed,0x1e,0xf0,0x00,0x00,0xff,0x0d,0xb3,0x02,0x4b,0x0a,0xf3,0x1c,0x38,0xfb,0xee,0x5d,0x0c,0xe6,0xdf,0x02,0xed,0x1f,0xfe,0xea,0x7f,0xe5,0xf7,0x01,0x02,0x22,0x60,0xdd,0xee,0xcf,0x11,0xfc,0xee,0xf1,0x14,0xc7,0xe4,0xf8,0x3b,0x09,0xe6,0xf7,0xdc,0xf9,0x27,0x06,0x10,0x25,0xf8,0xe6,0x12,0xe5,0xe1,0x1b,0xd3,0xd3,0xea,0x04,0x12,0x02,0xe1,0xe4,0xf3,0x4a,0x13,0xf1,0xb4,0x0c,0xf7,0x53,0xd0,0xcd,0xe5,0x2c,0x09,0x06,0xdf,0xf1,0x0d,0x1f,0xfc,0xdd,0xdf,0x07,0x1f,0x41,0x23,0xff,0x1f,0x22,0x15,0x06,0x0f,0x02,0xd7,0x11,0x1f,0xea,0x24,0xef,0xe9,0x0a,0x0d,0x1c,0xd9,0xeb,0xe1,0x2b,0x00,0x08,0xd9,0xd1,0xfa,0xdc,0x06,0x14,0x0b,0x03,0x40,0x3c,0xdc,0xf4,0xc3,0xeb,0xfa,0xeb,0x07,0xd8,0x18,0x09,0xfa,0x6d,0xe2,0xff,0x06,0xfa,0x16,0xec,0xd4,0xf8,0xdc,0xd7,0x30,0x08,0xe1,0x37,0x08,0xca,0xe1,0xc7,0x0a,0xd0,0x10,0xed,0x10,0x09,0xd4,0xed,0x4e,0xea,0x1b,0x2b,0xd3,0x14,0xe0,0xfd,0x0a,0x12,0xeb,0xd1,0xe8,0x2f,0xc6,0xd8,0xfe,0xec,0xf6,0xca,0xfa,0xc1,0xfd,0xc9,0x22,0xdb,0xdb,0xe4,0x09,0x22,0xfb,0xb7,0xb5,0xdd,0xf9,0x03,0xda,0x1f,0x00,0x24,0xf5,0xd6,0x05,0x0e,0x07,0x16,0x01,0x3e,0xbe,0x44,0x18,0x00,0xe0,0xdb,0x4e,0x0b,0xe6,0xf2,0xd9,0xd1,0x1e,0x00,0x95,0x0e,0xd4,0xf3,0xd9,0x10,0xf9,0xf8,0x0f,0x51,0xa0,0xb9,0x4f,0xc9,0xd9,0x05,0xf5,0xde,0xc4,0x27,0x37,0x26,0x06,0xef,0xf0,0x13,0xd2,0xc9,0x35,0xe0,0x19,0x00,0xf8,0x81,0xf0,0xf1,0xf5,0xd6,0x33,0xf4,0x19,0x0e,0xf9,0xc5,0x25,0xe8,0x0f,0x0e,0xee,0xd0,0x92,0xe2,0xf5,0x01,0xf0,0x01,0x10,0x0c,0x0a,0xeb,0xd1,0xc0,0x04,0x25,0x22,0xc9,0xbd,0xf8,0xff,0x17,0xe9,0x2d,0x1c,0xcd,0xd5,0x2d,0xae,0x0d,0x05,0xf6,0x1b,0x0f,0xf7,0xeb,0xf9,0xe6,0xe2,0x1d,0x0c,0xc3,0x0f,0x1f,0xb7,0xf7,0xcb,0x22,0x26,0xfe,0x16,0x30,0xbe,0x18,0xbd,0x24,0x2c,0xe0,0x00,0xdf,0xa5,0xe1,0x28,0x1a,0x09,0xf0,0xef,0xc9,0x13,0x3c,0x06,0xd6,0x4c,0xe1,0x04,0xfc,0x12,0xf0,0xda,0xcd,0x15,0x0a,0x67,0xf1,0x1e,0xe9,0xf7,0x0c,0x20,0xf4,0x3f,0x11,0xfd,0x38,0x07,0x0b,0xf0,0xde,0xff,0x21,0x15,0x14,0x02,0x15,0xcd,0x70,0xba,0x08,0xdd,0xf5,0xe5,0xd9,0xe7,0x4b,0x61,0x0e,0x15,0x0a,0xe7,0x34,0xe6,0xd0,0xc0,0xf4,0x28,0x2e,0x22,0xfd,0x07,0xf8,0xfe,0xed,0x24,0x33,0x03,0x05,0xd3,0xd8,0xd7,0xd8,0x3a,0x1e,0xfd,0x58,0x16,0x9e,0xc8,0x1f,0xb8,0xc0,0xfa,0x1f,0x33,0x0c,0xf5,0xb7,0x17,0x25,0x30,0x21,0xb6,0xdd,0x0f,0x42,0x0f,0xdb,0x22,0xc1,0x91,0xd3,0x5c,0x16,0xc6,0xdf,0x01,0x15,0x0e,0x42,0xed,0x1c,0x01,0x7a,0xbe,0x28,0x32,0x1a,0x04,0xda,0xff,0xc1,0x1e,0xc2,0x0c,0x3a,0xdd,0xe7,0x38,0xc3,0x9a,0x0a,0x02,0xf0,0xfd,0xf9,0xce,0xbb,0x8e,0x27,0xdf,0x23,0x38,0x1e,0xf5,0x06,0xfc,0xdb,0x43,0xfe,0xdf,0x35,0x03,0xf4,0x14,0x1c,0xc8,0xe1,0xf0,0xf1,0xe0,0xc3,0xdd,0xba,0xc9,0xf3,0x0e,0xda,0x07,0xfc,0x2c,0xf7,0x2c,0x1c,0xeb,0x4e,0xfd,0xef,0xb4,0x0a,0xd2,0x07,0xb7,0xe3,0xcf,0x0a,0x07,0xf9,0x18,0xa4,0xeb,0x30,0xaf,0xf0,0x0b,0xfc,0x3e,0xf2,0x24,0x0b,0xac,0xb8,0xfe,0xdc,0xd9,0x05,0xd5,0x16,0x33,0xe2,0xf3,0x15,0xca,0xd5,0xc7,0x10,0x0d,0xd4,0x16,0x19,0xab,0x3e,0xc0,0xa5,0xd3,0xac,0xed,0x20,0xf1,0xbf,0x05,0xf3,0xc7,0x44,0x38,0x33,0x4f,0xdd,0xd4,0x61,0xff,0x39,0xdd,0x0d,0x15,0xfc,0x58,0x13,0xe7,0xc9,0xfb,0x1c,0x0a,0xcc,0x74,0x99,0xec,0x00,0xec,0x01,0xe0,0xfb,0xfb,0xe5,0xce,0x24,0xb5,0x42,0x46,0x02,0xe5,0xf9,0x13,0x1b,0xd3,0x00,0x0a,0xe9,0xbd,0xfe,0x00,0x32,0x1c,0xc1,0x2a,0x0d,0x0c,0x07,0xbb,0xe1,0xdd,0x17,0xd3,0x06,0x02,0x24,0xc8,0xbc,0xd5,0x45,0xbe,0x81,0x53,0xdf,0x13,0x11,0x43,0x01,0x00,0xc8,0xcb,0xb1,0xea,0x1b,0xcd,0x24,0x1b,0xd9,0xd0,0x25,0xfe,0xeb,0xc7,0x07,0xe3,0xf9,0x9e,0xda,0x26,0x04,0xca,0x05,0xfc,0x12,0x10,0xdd,0x1d,0x26,0xe1,0xd8,0x74,0xe5,0x92,0x7f,0x06,0x08,0x0c,0xc5,0xfd,0xee,0xfc,0xe1,0xf7,0xba,0x2f,0x25,0xf7,0xe6,0xd9,0xe9,0xee,0x00,0x58,0xea,0x2a,0xec,0xab,0xdc,0xb5,0x29,0x25,0xfa,0xe5,0x06,0x25,0xff,0x24,0x0e,0x06,0xf8,0x16,0x77,0xbb,0xf5,0xe6,0xcb,0xf0,0xdf,0x07,0xea,0x07,0xd1,0x2e,0x15,0xdf,0xfd,0x16,0xed,0x33,0x14,0xfe,0xe4,0xc2,0xe4,0x10,0x07,0x24,0xd8,0xe7,0x2d,0x09,0x1e,0xdc,0xf8,0xc0,0x42,0x17,0x0e,0x3a,0x09,0xde,0xc9,0xf0,0xf0,0xd3,0x00,0x1e,0xb5,0xb6,0xdb,0x3d,0x06,0x0c,0xe7,0x43,0x23,0x06,0x19,0xe4,0x0c,0xf8,0x2a,0xd2,0x28,0xe6,0xf1,0x31,0xff,0x16,0xf9,0xb1,0x20,0x4e,0xe1,0x17,0xfc,0xe8,0x2b,0xfd,0xeb,0xf3,0xf1,0xea,0xd2,0x16,0x1d,0x0b,0x6c,0x1a,0xed,0x03,0x23,0x11,0xe8,0xe8,0x15,0x09,0x25,0xd3,0x0e,0xfa,0xe1,0xfa,0xf3,0x12,0x04,0x10,0xca,0x07,0x03,0xce,0xfb,0xd5,0x16,0x06,0x08,0xd2,0xea,0xc3,0xf8,0x0d,0xf7,0xea,0xe6,0x04,0xc5,0x09,0xd8,0x1c,0xbb,0x1c,0x0f,0x14,0xc9,0xf0,0xef,0xd2,0x1b,0x07,0x17,0x31,0x56,0xee,0x38,0xf6,0x10,0xfb,0x9f,0x11,0xec,0xf5,0x1b,0xf7,0x27,0x0e,0x09,0x32,0xf7,0xc1,0xf8,0x07,0xf7,0xf3,0xa3,0xec,0xc5,0x71,0xe1,0x04,0xeb,0x3e,0xf5,0x03,0x1a,0xe1,0xec,0x1a,0xb9,0xf6,0x24,0x21,0xd6,0xd7,0x47,0xb9,0xe1,0xef,0xed,0x15,0x10,0xe0,0xf0,0xb4,0x06,0x36,0x8f,0xed,0x16,0xc6,0x14,0xc2,0xf8,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x15,0x1a,0x00,0x00,0xf7,0xf1,0xff,0xff,0xaa,0x0e,0x00,0x00,0xcc,0x66,0x00,0x00,0x67,0xed,0xff,0xff,0x7e,0x1d,0x00,0x00,0x14,0x05,0x00,0x00,0xd9,0xd3,0xff,0xff,0xe0,0x30,0x00,0x00,0x3b,0x29,0x00,0x00,0x40,0x3e,0x00,0x00,0x99,0xfa,0xff,0xff,0x83,0x1b,0x00,0x00,0x78,0xe4,0xff,0xff,0xf8,0x23,0x00,0x00,0x0e,0x25,0x00,0x00,0x33,0x06,0x00,0x00,0xfe,0x32,0x00,0x00,0x27,0xe5,0xff,0xff,0xba,0x0d,0x00,0x00,0xc4,0x51,0x00,0x00,0x07,0xf0,0xff,0xff,0x40,0xf2,0xff,0xff,0x2a,0x57,0x00,0x00,0xd1,0x01,0x00,0x00,0x11,0x0e,0x00,0x00,0x80,0xff,0xff,0xff,0x51,0x29,0x00,0x00,0x53,0x29,0x00,0x00,0xcf,0x38,0x00,0x00,0x78,0x5f,0x00,0x00,0x90,0x13,0x00,0x00,0xee,0x08,0x00,0x00,0xec,0xec,0xff,0xff,0x2c,0x3d,0x00,0x00,0x53,0x34,0x00,0x00,0xd2,0x08,0x00,0x00,0x24,0x00,0x00,0x00,0xa9,0xe5,0xff,0xff,0x91,0x0c,0x00,0x00,0xc7,0x02,0x00,0x00,0xdc,0x12,0x00,0x00,0x67,0xd1,0xff,0xff,0x8b,0xfc,0xff,0xff,0x6e,0x13,0x00,0x00,0x3e,0xe7,0xff,0xff,0x34,0x53,0x00,0x00,0x05,0x3a,0x00,0x00,0x5c,0x1a,0x00,0x00,0xdd,0x16,0x00,0x00,0x31,0x52,0x00,0x00,0xa0,0x0a,0x00,0x00,0x4a,0x15,0x00,0x00,0x26,0x2f,0x00,0x00,0xcb,0x12,0x00,0x00,0xd0,0x1a,0x00,0x00,0xda,0x19,0x00,0x00,0x2e,0x57,0x00,0x00,0x3d,0x04,0x00,0x00,0x9d,0x28,0x00,0x00,0x94,0x09,0x00,0x00,0x7f,0xfa,0xff,0xff,0x11,0x22,0x00,0x00,0x06,0x0a,0x00,0x00,0xce,0x4b,0x00,0x00,0xff,0x16,0x00,0x00,0xf2,0x41,0x00,0x00,0xca,0x1c,0x00,0x00,0x57,0x28,0x00,0x00,0x6d,0x27,0x00,0x00,0x4a,0x0a,0x00,0x00,0xbf,0x50,0x00,0x00,0x55,0x3d,0x00,0x00,0x59,0x57,0x00,0x00,0x44,0x4c,0x00,0x00,0x32,0x22,0x00,0x00,0x88,0x02,0x00,0x00,0x73,0xde,0xff,0xff,0xbe,0x37,0x00,0x00,0xca,0x18,0x00,0x00,0x3c,0xfb,0xff,0xff,0x0b,0x42,0x00,0x00,0x68,0x72,0x00,0x00,0xff,0xe9,0xff,0xff,0x03,0x0d,0x00,0x00,0x40,0x22,0x00,0x00,0x79,0x2e,0x00,0x00,0x3f,0xe5,0xff,0xff,0x63,0x33,0x00,0x00,0x2c,0x5f,0x00,0x00,0x94,0x2e,0x00,0x00,0x71,0x01,0x00,0x00,0x4e,0x38,0x00,0x00,0xe3,0x00,0x00,0x00,0x9e,0x2e,0x00,0x00,0xc4,0xdd,0xff,0xff,0x1b,0x0c,0x00,0x00,0x23,0x28,0x00,0x00,0xee,0x1c,0x00,0x00,0x8b,0x2e,0x00,0x00,0xff,0xf7,0xff,0xff,0xab,0x0b,0x00,0x00,0x96,0x3a,0x00,0x00,0xdf,0x2b,0x00,0x00,0xc2,0x4e,0x00,0x00,0x6f,0x09,0x00,0x00,0xc3,0x6a,0x00,0x00,0x61,0x19,0x00,0x00,0x2c,0xdc,0xff,0xff,0xfb,0x25,0x00,0x00,0x67,0x66,0x00,0x00,0x65,0xf6,0xff,0xff,0xf5,0x6e,0x00,0x00,0xb6,0x17,0x00,0x00,0xc3,0x08,0x00,0x00,0x81,0xf3,0xff,0xff,0x6b,0xe9,0xff,0xff,0x36,0x38,0x00,0x00,0xbb,0x0e,0x00,0x00,0x35,0xcf,0xff,0xff,0xdb,0xd7,0xff,0xff,0xcd,0xfb,0xff,0xff,0x2f,0x11,0x00,0x00,0xfd,0xfe,0xff,0xff,0x5d,0x13,0x00,0x00,0x45,0x1c,0x00,0x00,0xd6,0x22,0x00,0x00,0xb2,0x0a,0x00,0x00,0x82,0x17,0x00,0x00,0x9a,0x52,0x00,0x00,0xe0,0xe2,0xff,0xff,0x20,0x02,0x00,0x00,0x25,0xfd,0xff,0xff,0xb1,0x2f,0x00,0x00,0xa0,0x3b,0x00,0x00,0xae,0x26,0x00,0x00,0xb5,0x3e,0x00,0x00,0xb9,0xfb,0xff,0xff,0x2c,0x40,0x00,0x00,0x64,0x39,0x00,0x00,0xeb,0x46,0x00,0x00,0x2a,0x1c,0x00,0x00,0xd9,0x0a,0x00,0x00,0xf0,0x40,0x00,0x00,0x55,0xda,0xff,0xff,0xa7,0x1e,0x00,0x00,0xa3,0xf6,0xff,0xff,0x68,0x31,0x00,0x00,0x23,0x29,0x00,0x00,0x0f,0x25,0x00,0x00,0x55,0xfd,0xff,0xff,0x83,0x1c,0x00,0x00,0xc6,0x87,0x00,0x00,0x65,0xf8,0xff,0xff,0x13,0xfe,0xff,0xff,0x56,0x13,0x00,0x00,0xfc,0x17,0x00,0x00,0x4e,0x10,0x00,0x00,0xfd,0x15,0x00,0x00,0x93,0xd1,0xff,0xff,0x13,0x12,0x00,0x00,0x9d,0x14,0x00,0x00,0xf3,0xde,0xff,0xff,0x83,0x37,0x00,0x00,0x9f,0xf9,0xff,0xff,0xbb,0xed,0xff,0xff,0x05,0x2e,0x00,0x00,0xa8,0x02,0x00,0x00,0x23,0x5c,0x00,0x00,0xb8,0xf8,0xff,0xff,0xd8,0x08,0x00,0x00,0x05,0x44,0x00,0x00,0xc2,0x5b,0x00,0x00,0xe8,0x0a,0x00,0x00,0xe8,0x47,0x00,0x00,0x1e,0x1b,0x00,0x00,0xcd,0xff,0xff,0xff,0x0e,0x1c,0x00,0x00,0x4c,0x40,0x00,0x00,0x5b,0x28,0x00,0x00,0x17,0x3a,0x00,0x00,0x1b,0x01,0x00,0x00,0x53,0x77,0x00,0x00,0xf4,0x42,0x00,0x00,0xe8,0x02,0x00,0x00,0x5e,0xed,0xff,0xff,0x78,0x17,0x00,0x00,0x32,0x26,0x00,0x00,0x50,0x1a,0x00,0x00,0x91,0xfb,0xff,0xff,0xb9,0x4f,0x00,0x00,0xd8,0x05,0x00,0x00,0x64,0x38,0x00,0x00,0x17,0x2f,0x00,0x00,0x81,0x1e,0x00,0x00,0xf4,0x17,0x00,0x00,0x27,0x26,0x00,0x00,0xea,0xed,0xff,0xff,0x1a,0x3b,0x00,0x00,0x87,0x7b,0x00,0x00,0xcd,0x22,0x00,0x00,0xb0,0x53,0x00,0x00,0x7a,0xda,0xff,0xff,0x7f,0x0c,0x00,0x00,0x01,0x43,0x00,0x00,0x2e,0x07,0x00,0x00,0x89,0xf3,0xff,0xff,0xdf,0x2b,0x00,0x00,0xb1,0x61,0x00,0x00,0xe0,0x1c,0x00,0x00,0x95,0x4d,0x00,0x00,0x02,0x01,0x00,0x00,0x9e,0x40,0x00,0x00,0x44,0x4a,0x00,0x00,0xa2,0xcb,0xff,0xff,0x9d,0x16,0x00,0x00,0xca,0x47,0x00,0x00,0x33,0x0e,0x00,0x00,0x2e,0x50,0x00,0x00,0xf9,0x28,0x00,0x00,0x40,0x17,0x00,0x00,0x03,0x57,0x00,0x00,0xfe,0xe3,0xff,0xff,0xa8,0x2f,0x00,0x00,0xe9,0x00,0x00,0x00,0xa6,0x07,0x00,0x00,0x78,0x10,0x00,0x00,0xd3,0x45,0x00,0x00,0xd3,0xce,0xff,0xff,0x0f,0x2d,0x00,0x00,0x83,0xf4,0xff,0xff,0xba,0x2a,0x00,0x00,0xec,0x15,0x00,0x00,0x94,0x5d,0x00,0x00,0x83,0x0e,0x00,0x00,0xe6,0x1c,0x00,0x00,0x98,0x39,0x00,0x00,0x9c,0x3a,0x00,0x00,0x7e,0x05,0x00,0x00,0x17,0x46,0x00,0x00,0xa8,0xf9,0xff,0xff,0x40,0x0d,0x00,0x00,0x40,0x12,0x00,0x00,0x1a,0x07,0x00,0x00,0x32,0x23,0x00,0x00,0x3f,0x0c,0x00,0x00,0xd5,0x08,0x00,0x00,0x3c,0x01,0x00,0x00,0xe3,0x75,0x00,0x00,0xa3,0x1f,0x00,0x00,0xa1,0x27,0x00,0x00,0xd0,0x23,0x00,0x00,0xeb,0xdc,0xff,0xff,0x99,0x05,0x00,0x00,0x27,0x0e,0x00,0x00,0xd7,0xf2,0xff,0xff,0xce,0xfc,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xf1,0x25,0xba,0xa3,0xe0,0xeb,0xbd,0x28,0xce,0x20,0xc9,0xfb,0x37,0x28,0x43,0xea,0x70,0xa9,0xe0,0x2c,0xe1,0x9e,0x5f,0xc9,0x52,0xd2,0x28,0x21,0xcb,0xef,0xc2,0x08,0x13,0xc5,0x29,0xfa,0x40,0xfa,0x0d,0xfd,0xdb,0x16,0x50,0x43,0xb5,0xf1,0x5d,0xdc,0x2d,0x42,0x0d,0xd9,0x94,0x22,0xae,0x1f,0x31,0x13,0xcc,0xcf,0xc2,0xa6,0x81,0xc5,0xaa,0x17,0xaf,0xef,0xd4,0x0c,0xab,0xb2,0xa8,0x12,0x36,0xa5,0x3c,0xd4,0xbf,0xbb,0xca,0x0f,0xaf,0x14,0xb6,0xdb,0xb0,0xcb,0xb1,0x8b,0x31,0xd0,0x19,0xcd,0xab,0x47,0x16,0xb8,0x29,0xa8,0xfa,0x82,0x59,0xa5,0xad,0xb2,0xa6,0xde,0xbf,0xbd,0x17,0xcf,0xb9,0x1a,0xcd,0x17,0xc4,0xe2,0xd0,0xe2,0x2f,0xc8,0xbf,0x3e,0xd4,0xbe,0xae,0xe6,0x03,0x1b,0x2e,0x47,0xa0,0xe2,0xb4,0xc4,0x28,0xb1,0xb7,0xe4,0x18,0x00,0xcb,0x18,0x3a,0xea,0x01,0x22,0xe1,0xb8,0xd9,0xfd,0xbb,0xd3,0xd5,0xc7,0xde,0xc1,0xf8,0xab,0xab,0x44,0xb7,0x08,0xd9,0xd2,0xc9,0xfe,0xa4,0x1a,0xd8,0xc5,0x22,0x9a,0x48,0xd6,0x30,0x38,0x1e,0x38,0xb8,0xeb,0x1f,0x10,0xd8,0xbe,0x15,0xde,0x24,0x0d,0x14,0xa7,0x97,0xab,0x26,0xeb,0xe7,0x9b,0xd4,0xb2,0xf3,0xc8,0x5d,0x33,0x0f,0xce,0xc5,0xce,0xaa,0x50,0xbc,0x1e,0x11,0xbe,0xde,0xe2,0xc6,0xee,0xba,0xf4,0xe9,0x0e,0x97,0x30,0x3f,0x01,0xd8,0x5c,0x0f,0xec,0x22,0xe0,0x3e,0xbb,0xd8,0x39,0xc1,0xb3,0x02,0x15,0xd0,0x17,0xf9,0x32,0xc6,0xcf,0xb2,0xbc,0x20,0xbb,0xd3,0xc7,0x2c,0xb9,0xd7,0x2f,0x1c,0xe4,0x4d,0x65,0x2e,0x08,0x32,0xd8,0x38,0xe1,0x52,0x19,0xc4,0xf2,0xb8,0x16,0x91,0x5a,0x27,0xca,0x20,0x74,0xa5,0x22,0xb3,0x2e,0xdd,0xe5,0x2c,0x14,0x42,0xf7,0xe5,0x40,0xc0,0xf9,0xb8,0x07,0xee,0x0f,0x1e,0xed,0xa3,0xc8,0x3b,0x0d,0xa4,0x0f,0xe8,0xb8,0xfd,0x16,0x64,0xd9,0x46,0xe3,0xce,0xe9,0x2d,0x48,0x34,0x4f,0x78,0x3a,0x56,0xe2,0x55,0x0d,0x40,0xf9,0x4e,0x5f,0x68,0xea,0xb9,0x63,0xc9,0x30,0x50,0x57,0x30,0xfb,0x4d,0xf6,0x55,0x2c,0x56,0x35,0x5e,0x78,0xd3,0x37,0xe9,0x3f,0x64,0xb0,0xe5,0x49,0xdb,0x55,0x10,0x7f,0x9a,0x61,0x47,0x4e,0x52,0x27,0x44,0x45,0xdf,0x2e,0x46,0xe4,0x53,0xe4,0x2c,0x28,0x2f,0x2b,0xd6,0x3e,0x37,0xbb,0x28,0x43,0x59,0x18,0xe8,0xd4,0xe8,0xd0,0x5f,0x0a,0x47,0x43,0xe5,0x4f,0x62,0x22,0xf4,0x00,0x32,0xee,0xb8,0x27,0xfd,0xde,0x3f,0x3b,0x43,0x05,0x4b,0x38,0x3c,0x31,0x29,0x40,0x10,0x3c,0x65,0x9d,0x38,0xe0,0x23,0x1e,0x38,0xfe,0x52,0xed,0x31,0x44,0xd8,0x6c,0xb0,0x33,0xd4,0xd4,0xf7,0xca,0x4f,0x10,0xd6,0xf2,0x2c,0x3d,0xee,0x1f,0xe7,0x00,0xf0,0x58,0x6d,0x5d,0xc1,0x1b,0x0d,0x6a,0x27,0x55,0x05,0x43,0xa8,0xdd,0xe8,0x2a,0x46,0x44,0x53,0xb4,0x29,0xcc,0xdb,0x46,0x26,0x27,0x52,0x0e,0x45,0xfd,0x17,0xe1,0x6b,0xe1,0xb5,0x01,0x2b,0x99,0xf9,0x23,0xe7,0x34,0xcb,0x39,0x2d,0xc2,0x43,0x5a,0x0e,0xeb,0x3b,0xe4,0x19,0xd4,0x4c,0x30,0x6b,0x3e,0xdc,0x46,0x39,0x38,0xce,0x47,0x2c,0xc6,0xda,0xfe,0xff,0xff,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x8b,0x3f,0x00,0x00,0x49,0xbd,0xff,0xff,0xee,0xfe,0xff,0xff,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xd8,0x56,0xff,0xff,0x0f,0x00,0x00,0x00,0x54,0x4f,0x43,0x4f,0x20,0x43,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x2e,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x78,0x54,0xff,0xff,0xf0,0x08,0x00,0x00,0xe4,0x08,0x00,0x00,0xd8,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x78,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0xc0,0x07,0x00,0x00,0x78,0x07,0x00,0x00,0x34,0x07,0x00,0x00,0xec,0x06,0x00,0x00,0xa8,0x06,0x00,0x00,0x60,0x06,0x00,0x00,0x1c,0x06,0x00,0x00,0xd4,0x05,0x00,0x00,0x90,0x05,0x00,0x00,0x48,0x05,0x00,0x00,0x04,0x05,0x00,0x00,0xbc,0x04,0x00,0x00,0x78,0x04,0x00,0x00,0x30,0x04,0x00,0x00,0xec,0x03,0x00,0x00,0xa4,0x03,0x00,0x00,0x60,0x03,0x00,0x00,0x18,0x03,0x00,0x00,0xd4,0x02,0x00,0x00,0x8c,0x02,0x00,0x00,0x48,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0xbc,0x01,0x00,0x00,0x74,0x01,0x00,0x00,0x30,0x01,0x00,0x00,0xe0,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x66,0xf8,0xff,0xff,0x00,0x00,0x00,0x09,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xce,0xff,0xff,0xff,0x00,0x00,0x80,0x3f,0x01,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x42,0xf8,0xff,0xff,0x00,0x00,0x00,0x11,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x8a,0xf8,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x16,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x07,0x00,0x10,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x3c,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x07,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x82,0xf9,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd0,0xf9,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0xc2,0xf9,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5e,0xf9,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x06,0xfa,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xfa,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x46,0xfa,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe2,0xf9,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x8a,0xfa,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd8,0xfa,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0xca,0xfa,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x66,0xfa,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x0e,0xfb,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0xfb,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x4e,0xfb,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xea,0xfa,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x92,0xfb,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe0,0xfb,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0xd2,0xfb,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6e,0xfb,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x16,0xfc,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x56,0xfc,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf2,0xfb,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x9a,0xfc,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe8,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0xda,0xfc,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x76,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x1e,0xfd,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0xfd,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x5e,0xfd,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfa,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0xa2,0xfd,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf0,0xfd,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0xe2,0xfd,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7e,0xfd,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x26,0xfe,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x74,0xfe,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x66,0xfe,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0xfe,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xaa,0xfe,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0xea,0xfe,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x86,0xfe,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x2e,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0xff,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x6e,0xff,0xff,0xff,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0a,0xff,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xb2,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x07,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x07,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xaa,0xff,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x1a,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x07,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x07,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0xb4,0x2f,0x01,0x00,0x1c,0x29,0x01,0x00,0x88,0x22,0x01,0x00,0x04,0x1c,0x01,0x00,0x8c,0x15,0x01,0x00,0x04,0x0f,0x01,0x00,0x8c,0x02,0x01,0x00,0x04,0xf6,0x00,0x00,0x8c,0xe9,0x00,0x00,0xa4,0xe8,0x00,0x00,0x6c,0xe7,0x00,0x00,0x24,0xe6,0x00,0x00,0x2c,0xe4,0x00,0x00,0x24,0xe2,0x00,0x00,0x2c,0xe0,0x00,0x00,0x24,0xde,0x00,0x00,0xac,0xda,0x00,0x00,0x24,0xd7,0x00,0x00,0xac,0xd3,0x00,0x00,0x24,0xd0,0x00,0x00,0xac,0xc9,0x00,0x00,0x24,0xc3,0x00,0x00,0xac,0xbc,0x00,0x00,0x24,0xb6,0x00,0x00,0xac,0xaf,0x00,0x00,0x24,0xa9,0x00,0x00,0xac,0xa2,0x00,0x00,0x0c,0xa2,0x00,0x00,0x74,0xa1,0x00,0x00,0xf0,0xa0,0x00,0x00,0x5c,0xa0,0x00,0x00,0xd0,0x9f,0x00,0x00,0x78,0x9f,0x00,0x00,0xa4,0x9e,0x00,0x00,0x0c,0x9e,0x00,0x00,0x68,0x9d,0x00,0x00,0xe8,0x96,0x00,0x00,0x70,0x90,0x00,0x00,0xcc,0x8f,0x00,0x00,0x28,0x8f,0x00,0x00,0xa8,0x88,0x00,0x00,0x30,0x82,0x00,0x00,0x8c,0x81,0x00,0x00,0xe8,0x80,0x00,0x00,0x68,0x7a,0x00,0x00,0xf0,0x6d,0x00,0x00,0x4c,0x6d,0x00,0x00,0xa8,0x6c,0x00,0x00,0x28,0x60,0x00,0x00,0xb0,0x53,0x00,0x00,0x0c,0x53,0x00,0x00,0x68,0x52,0x00,0x00,0x88,0x51,0x00,0x00,0x50,0x50,0x00,0x00,0xac,0x4f,0x00,0x00,0x08,0x4f,0x00,0x00,0xc8,0x4d,0x00,0x00,0xd0,0x4b,0x00,0x00,0x2c,0x4b,0x00,0x00,0x88,0x4a,0x00,0x00,0x88,0x48,0x00,0x00,0x90,0x46,0x00,0x00,0xec,0x45,0x00,0x00,0x48,0x45,0x00,0x00,0x48,0x43,0x00,0x00,0xd0,0x3f,0x00,0x00,0x2c,0x3f,0x00,0x00,0x88,0x3e,0x00,0x00,0x08,0x3b,0x00,0x00,0x90,0x37,0x00,0x00,0xec,0x36,0x00,0x00,0x48,0x36,0x00,0x00,0xc8,0x32,0x00,0x00,0x50,0x2c,0x00,0x00,0xac,0x2b,0x00,0x00,0x08,0x2b,0x00,0x00,0x88,0x24,0x00,0x00,0x10,0x1e,0x00,0x00,0x6c,0x1d,0x00,0x00,0xc8,0x1c,0x00,0x00,0x48,0x16,0x00,0x00,0xd0,0x0f,0x00,0x00,0x2c,0x0f,0x00,0x00,0x88,0x0e,0x00,0x00,0x08,0x08,0x00,0x00,0x90,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x52,0xd8,0xfe,0xff,0x00,0x00,0x00,0x09,0x54,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0x5e,0xff,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x81,0x80,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0xbf,0x05,0x00,0x00,0x00,0x69,0x6e,0x70,0x75,0x74,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc2,0xd8,0xfe,0xff,0x00,0x00,0x00,0x09,0x5c,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xdf,0xfe,0xff,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x3b,0x21,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x50,0x72,0x65,0x64,0x69,0x63,0x74,0x69,0x6f,0x6e,0x73,0x2f,0x52,0x65,0x73,0x68,0x61,0x70,0x65,0x5f,0x31,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0xd9,0xfe,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xcc,0x5f,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x39,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xd2,0xd9,0xfe,0xff,0x00,0x00,0x00,0x02,0x64,0x06,0x00,0x00,0x0f,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xe0,0xfe,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x09,0xc1,0x56,0x38,0x70,0xbe,0x8a,0x38,0xc6,0x5e,0x5c,0x38,0x6b,0x13,0x7e,0x38,0x35,0xee,0x4e,0x38,0x92,0x3c,0xb2,0x38,0x73,0x8f,0x83,0x38,0x0e,0x10,0x96,0x38,0x30,0xad,0x59,0x38,0x3a,0xfb,0x97,0x38,0x7d,0xae,0x8d,0x38,0x37,0x9b,0x8a,0x38,0x06,0xbc,0x4d,0x38,0x17,0x10,0x7e,0x38,0x6a,0xf4,0x80,0x38,0x76,0x67,0x2f,0x38,0xcc,0x91,0x68,0x38,0x9a,0x18,0x55,0x38,0x1b,0x65,0x30,0x38,0x52,0xad,0x97,0x38,0x99,0x46,0x80,0x38,0x7e,0x0e,0x81,0x38,0x50,0xe4,0x69,0x38,0xc7,0x6b,0x51,0x38,0x9b,0x88,0x39,0x38,0xf3,0xa1,0xc5,0x38,0x62,0xe9,0x42,0x38,0x89,0xe8,0xad,0x38,0x8e,0xc1,0xc0,0x38,0x2c,0xf5,0x85,0x38,0x94,0xee,0x7c,0x38,0x4c,0xde,0x9f,0x38,0xea,0xa8,0x98,0x38,0xe4,0x06,0x5e,0x38,0x83,0x3e,0x92,0x38,0x1b,0x6c,0x4d,0x38,0x38,0xee,0x8d,0x38,0xe2,0xb2,0x82,0x38,0x8e,0xc1,0x55,0x38,0xc9,0x3b,0x9d,0x38,0xf6,0x00,0x9a,0x38,0x65,0x1f,0x9f,0x38,0x38,0xc2,0x5a,0x38,0x8c,0x70,0x7b,0x38,0xa7,0x22,0x53,0x38,0xe2,0xe7,0x55,0x38,0xfc,0xcf,0x8c,0x38,0xed,0x8b,0x7a,0x38,0x13,0xa5,0x86,0x38,0x7f,0xf3,0x87,0x38,0x76,0x25,0x69,0x38,0x2e,0x32,0x80,0x38,0x72,0x5e,0x95,0x38,0x7a,0x2c,0x85,0x38,0xc3,0x7d,0x94,0x38,0x50,0x99,0x97,0x38,0x0a,0x98,0x80,0x38,0x47,0xa5,0x4c,0x38,0x61,0x07,0x7c,0x38,0x4b,0x39,0x82,0x38,0xc3,0x09,0x6f,0x38,0x41,0xb8,0x78,0x38,0x5f,0x0e,0x51,0x38,0x23,0xc2,0x86,0x38,0x30,0xc3,0x98,0x38,0xa8,0x15,0x80,0x38,0xea,0xe4,0x8b,0x38,0x8b,0x83,0x86,0x38,0x03,0xff,0x52,0x38,0x19,0xcf,0x84,0x38,0x30,0xfe,0xad,0x38,0xd5,0x13,0x56,0x38,0x41,0x60,0x7f,0x38,0x73,0xa4,0x81,0x38,0xd9,0x0d,0xbc,0x38,0xf5,0xae,0xa6,0x38,0x59,0xa6,0x7f,0x38,0x04,0xb7,0x91,0x38,0xb0,0x51,0x88,0x38,0xdf,0x68,0x85,0x38,0x73,0xfc,0x88,0x38,0x3e,0xf8,0x79,0x38,0xf6,0x38,0x97,0x38,0x69,0x3e,0x97,0x38,0x50,0xf3,0x7a,0x38,0x91,0x57,0x5d,0x38,0x06,0x22,0x63,0x38,0xaf,0x51,0x7c,0x38,0x6e,0x68,0xa1,0x38,0x08,0x2a,0xa3,0x38,0x5b,0x07,0xb2,0x38,0x36,0x72,0x95,0x38,0x02,0xcf,0x6e,0x38,0x17,0x6b,0x84,0x38,0x7f,0x72,0x78,0x38,0xc7,0x37,0x78,0x38,0xb3,0xd1,0x61,0x38,0x69,0xc3,0x96,0x38,0x8e,0x04,0x50,0x38,0x4b,0x1c,0x89,0x38,0x7d,0x9d,0x7f,0x38,0xb0,0x7d,0x5f,0x38,0xe8,0x6b,0x70,0x38,0xd3,0x12,0x65,0x38,0x5b,0x57,0x91,0x38,0x35,0x42,0x6d,0x38,0x3d,0xa2,0x89,0x38,0xa9,0xdb,0x56,0x38,0x8e,0x11,0x5f,0x38,0x0b,0x42,0x4b,0x38,0xe7,0x81,0xc2,0x38,0x9e,0xfc,0x61,0x38,0x95,0xd3,0xb9,0x38,0x15,0x9f,0x93,0x38,0x07,0x4e,0x39,0x38,0x9e,0xa7,0x70,0x38,0x4d,0xd4,0x61,0x38,0xc6,0x72,0x70,0x38,0x04,0xf0,0xa8,0x38,0x59,0x15,0xd0,0x38,0x9c,0x9a,0xbf,0x38,0x39,0x42,0x84,0x38,0xfa,0x8a,0x8d,0x38,0x36,0x1c,0x3a,0x38,0xfc,0x64,0x61,0x38,0x61,0xb6,0x73,0x38,0x3d,0x27,0x75,0x38,0xd9,0xc4,0x97,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x39,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x46,0xe0,0xfe,0xff,0x00,0x00,0x00,0x02,0x6c,0x06,0x00,0x00,0x11,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xa2,0xd9,0xfe,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x8f,0xcb,0x23,0x39,0x92,0x83,0xcf,0x38,0x7c,0x0d,0xdd,0x38,0xbc,0x8b,0x0a,0x39,0x18,0x12,0x7a,0x39,0x9b,0x70,0x06,0x39,0x6a,0xc6,0xff,0x38,0x8b,0x50,0x1d,0x39,0x18,0xe3,0xe4,0x38,0xf7,0x10,0xdb,0x38,0x6c,0xc8,0x1a,0x39,0x79,0x8f,0x3f,0x39,0xb3,0x01,0xe1,0x38,0xde,0x9f,0xd4,0x38,0xdb,0x07,0x55,0x39,0xea,0x41,0x30,0x39,0xf5,0xa0,0x3a,0x39,0x4b,0x1f,0x00,0x39,0x59,0xf8,0xe1,0x38,0xea,0x98,0xae,0x38,0x56,0x25,0x36,0x39,0x43,0x8e,0xda,0x38,0xa3,0x92,0x53,0x39,0xd0,0x31,0x66,0x39,0x14,0x14,0x51,0x39,0xa9,0xf9,0x2a,0x39,0x56,0x7e,0xd5,0x38,0x7a,0x79,0x55,0x39,0xfc,0xb2,0x3a,0x39,0x8e,0x31,0x95,0x39,0x4d,0x04,0x49,0x39,0x61,0xaf,0x20,0x39,0xa4,0xb7,0x04,0x39,0x80,0x50,0x2a,0x39,0xff,0xd1,0x1a,0x39,0x4b,0xe2,0x3b,0x39,0x02,0xbb,0x21,0x39,0x92,0x95,0x02,0x39,0xba,0x20,0x04,0x39,0x61,0x09,0x6b,0x39,0x8b,0x71,0xca,0x38,0x98,0x2e,0x08,0x39,0xf6,0xa6,0xe1,0x38,0x29,0x2a,0x43,0x39,0x0f,0x60,0x36,0x39,0xe2,0x80,0x08,0x39,0xa7,0x75,0xf3,0x38,0xd4,0x07,0x09,0x39,0x68,0x6f,0x6c,0x39,0xe4,0x93,0x7f,0x39,0xa9,0x4c,0x04,0x39,0x53,0x42,0x4a,0x39,0xe4,0x10,0x1f,0x39,0x80,0x86,0xe8,0x38,0x73,0xef,0x04,0x39,0xf8,0xa4,0x05,0x39,0x28,0x51,0x15,0x39,0x1e,0x0c,0x23,0x39,0x8c,0x98,0xa8,0x39,0x05,0x83,0x7a,0x39,0xd1,0x6b,0x1a,0x39,0x17,0x32,0x8c,0x39,0xb9,0xa8,0x18,0x39,0x00,0x47,0x03,0x39,0x0b,0x94,0x23,0x39,0xb5,0xd3,0x5c,0x39,0x92,0xba,0xd8,0x38,0x4b,0x61,0x18,0x39,0x41,0x3f,0x6f,0x39,0x84,0x04,0xac,0x38,0x30,0x2b,0x48,0x39,0xa4,0x34,0x23,0x39,0x8b,0x5e,0xe8,0x38,0x2a,0x30,0xe6,0x38,0xf0,0x4c,0x09,0x39,0x29,0xe9,0xac,0x39,0x2a,0xdf,0x08,0x39,0xed,0x3c,0x30,0x39,0x8f,0x37,0xf1,0x38,0x94,0xf6,0xd6,0x38,0x8e,0x51,0xee,0x38,0x39,0x4a,0x0f,0x39,0x83,0xca,0x44,0x39,0x70,0x12,0xf0,0x38,0x93,0x9a,0x34,0x39,0x77,0xfc,0xdc,0x38,0x3b,0xaa,0xf1,0x38,0x86,0x48,0x16,0x39,0x52,0xb3,0x3c,0x39,0xd2,0x02,0x37,0x39,0xba,0x0a,0xe7,0x38,0xe5,0x71,0xfc,0x38,0x2d,0x79,0x05,0x39,0xb7,0x1e,0xb7,0x38,0x7f,0x1e,0x97,0x39,0x91,0xcc,0xd1,0x38,0x2b,0x81,0x36,0x39,0xb6,0x3f,0x4a,0x39,0x2f,0x77,0xe9,0x38,0xfc,0x08,0xe2,0x38,0xdb,0xac,0x41,0x39,0x6e,0x60,0xe8,0x38,0x32,0x5a,0x0a,0x39,0x8c,0x3a,0xd8,0x38,0x97,0x15,0xd5,0x38,0x4d,0x54,0xf7,0x38,0xc6,0x45,0x3a,0x39,0xcf,0x4c,0x24,0x39,0xf7,0x4e,0x00,0x39,0x9b,0xa0,0x3f,0x39,0x7c,0x4c,0xeb,0x38,0x34,0x60,0x40,0x39,0xd8,0xdc,0xe2,0x38,0x21,0x86,0xce,0x38,0x5f,0x05,0x0d,0x39,0x79,0x9f,0x01,0x39,0x15,0xa6,0x19,0x39,0x70,0x6d,0x1a,0x39,0x0e,0xe6,0x4b,0x39,0x22,0x44,0x35,0x39,0x7a,0x72,0x45,0x39,0x75,0x03,0xb3,0x38,0xdf,0x93,0xe4,0x38,0xcf,0x69,0xd4,0x38,0x56,0xa3,0x02,0x39,0x29,0x15,0xd1,0x38,0xf9,0x55,0xf6,0x38,0xea,0x4f,0x0f,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x39,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xc2,0xe6,0xfe,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0x6d,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x39,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x62,0xe7,0xfe,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfc,0x6d,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x38,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,0xe8,0xfe,0xff,0x00,0x00,0x00,0x02,0x64,0x06,0x00,0x00,0x12,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x84,0xee,0xfe,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xc0,0x87,0x53,0x38,0x9e,0xa2,0x7d,0x38,0x7f,0xbe,0x75,0x38,0xa1,0x24,0x71,0x38,0x94,0x4d,0xb1,0x38,0x29,0xe9,0xae,0x38,0x71,0x40,0x73,0x38,0x2d,0x97,0x66,0x38,0x02,0xf5,0x6a,0x38,0xdf,0xd8,0x99,0x38,0x88,0x06,0x87,0x38,0xd1,0xe2,0x82,0x38,0x30,0xc7,0x82,0x38,0x47,0x1e,0x87,0x38,0xc7,0x7d,0x50,0x38,0xac,0x3f,0x59,0x38,0xf9,0xac,0x8c,0x38,0x30,0xa1,0x91,0x38,0x5b,0x15,0x7f,0x38,0xff,0xfa,0x54,0x38,0x85,0x90,0x8c,0x38,0x37,0x35,0x7e,0x38,0xfa,0xe0,0x88,0x38,0x18,0x32,0x87,0x38,0x52,0x6e,0x92,0x38,0xf0,0xb0,0x7e,0x38,0x18,0xd4,0x73,0x38,0x67,0x2d,0x95,0x38,0x44,0x40,0x83,0x38,0x8c,0xae,0x83,0x38,0x22,0xa0,0x86,0x38,0x1a,0xad,0x94,0x38,0xed,0xfd,0x8f,0x38,0xa1,0x1d,0x65,0x38,0xff,0x45,0x67,0x38,0x24,0x9b,0x85,0x38,0xfb,0x5f,0xb1,0x38,0xee,0xe4,0x8e,0x38,0x3f,0xd4,0x83,0x38,0x67,0x1c,0x70,0x38,0xab,0xef,0x8a,0x38,0x9e,0x4b,0x83,0x38,0x4d,0x92,0x5c,0x38,0xd9,0x84,0x7a,0x38,0x41,0xde,0x51,0x38,0x2d,0x3c,0x75,0x38,0x6d,0x6f,0x96,0x38,0xb5,0x6d,0x95,0x38,0xdc,0xf4,0x31,0x38,0x74,0x9c,0x2c,0x38,0xb6,0x91,0x8b,0x38,0xa3,0xac,0x32,0x38,0x8e,0xf8,0x80,0x38,0x33,0x35,0x66,0x38,0x91,0x5c,0x41,0x38,0x70,0x7b,0x88,0x38,0xa8,0x31,0x85,0x38,0x4a,0xf1,0x50,0x38,0x20,0x68,0x86,0x38,0x2f,0x82,0x80,0x38,0x08,0x63,0x43,0x38,0x62,0x65,0x70,0x38,0x5b,0x58,0x84,0x38,0x3c,0x49,0x97,0x38,0x98,0x68,0x60,0x38,0xd0,0xe8,0x83,0x38,0x62,0xca,0x4b,0x38,0xc5,0xaf,0x81,0x38,0x0f,0x62,0x73,0x38,0xff,0xbd,0x7f,0x38,0xc6,0x43,0x9f,0x38,0x96,0x2d,0x93,0x38,0x40,0x9d,0x8f,0x38,0x54,0xaa,0xac,0x38,0x20,0x51,0xb0,0x38,0x8e,0xa3,0x84,0x38,0xaa,0x0f,0xb8,0x38,0xad,0x3d,0x5f,0x38,0x45,0x6d,0x83,0x38,0x4d,0x6c,0x6a,0x38,0xea,0xc4,0x87,0x38,0xa7,0x52,0xac,0x38,0x12,0xef,0x95,0x38,0xeb,0x1b,0x8b,0x38,0xf0,0xe9,0xaf,0x38,0xb3,0xf3,0x81,0x38,0xe4,0xa8,0x3e,0x38,0xde,0x8f,0x5d,0x38,0xaa,0xd3,0x44,0x38,0x61,0x96,0x87,0x38,0x40,0x35,0x7a,0x38,0xf3,0x84,0x90,0x38,0x05,0x94,0x79,0x38,0x90,0x70,0x93,0x38,0xa9,0x54,0x6c,0x38,0x5d,0x5e,0x81,0x38,0xd6,0x95,0xa7,0x38,0xc0,0xd9,0x8d,0x38,0xb8,0xd5,0x62,0x38,0x94,0x3e,0x6c,0x38,0x0c,0xf8,0xa4,0x38,0xd5,0x76,0x54,0x38,0xe6,0xe2,0x93,0x38,0x74,0x27,0x3d,0x38,0x9e,0xcb,0x93,0x38,0xeb,0x8c,0x5d,0x38,0x6f,0x7d,0x94,0x38,0x2e,0x42,0xb9,0x38,0x94,0x65,0x55,0x38,0x1a,0xe5,0x66,0x38,0x17,0x0f,0x55,0x38,0xbe,0x91,0x84,0x38,0x1b,0xc5,0x89,0x38,0x72,0x38,0x85,0x38,0x87,0xcc,0x8f,0x38,0x96,0x71,0x83,0x38,0xbd,0x04,0x6f,0x38,0x33,0x99,0x3c,0x38,0x73,0x9d,0x7d,0x38,0x8f,0x0d,0x4b,0x38,0xa4,0x6f,0x73,0x38,0xca,0xbf,0x69,0x38,0x64,0x33,0x7e,0x38,0x55,0x02,0x81,0x38,0xe5,0xd2,0x96,0x38,0x27,0x00,0x5d,0x38,0xd2,0x15,0x7b,0x38,0xbf,0xea,0x81,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x38,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x76,0xee,0xfe,0xff,0x00,0x00,0x00,0x02,0x6c,0x06,0x00,0x00,0x37,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xd2,0xe7,0xfe,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x6c,0xe2,0x0b,0x39,0xc3,0x54,0x4b,0x39,0x78,0x29,0x00,0x39,0x17,0x23,0xcd,0x38,0xa2,0x60,0x0c,0x39,0xf0,0xcc,0x5e,0x39,0x9b,0x41,0x5d,0x39,0x8d,0xb7,0x25,0x39,0x5c,0xc1,0xdf,0x38,0x54,0x8d,0x01,0x39,0x37,0x5d,0xf5,0x38,0xa0,0xf1,0x70,0x39,0x3e,0xb2,0xfd,0x38,0x98,0x3f,0xe4,0x38,0x65,0x48,0xd0,0x38,0x3e,0x60,0xdd,0x38,0xcd,0x65,0x7b,0x39,0xed,0xa9,0x21,0x39,0x7c,0x44,0x8c,0x39,0x68,0xf2,0xf6,0x38,0xa0,0x2a,0x85,0x39,0xd6,0x79,0xf1,0x38,0xc9,0x1a,0x1f,0x39,0x70,0xb3,0x08,0x39,0xa4,0x37,0xdd,0x38,0x6e,0xfb,0x15,0x39,0x6c,0xa5,0x39,0x39,0x82,0xd6,0x00,0x39,0xd5,0x9a,0x0b,0x39,0xef,0xa1,0x14,0x39,0x02,0xd1,0x81,0x39,0x00,0x71,0x57,0x39,0x77,0xd6,0x30,0x39,0xb3,0xe9,0x1e,0x39,0x08,0x37,0xbf,0x38,0x7f,0x9e,0x1a,0x39,0x5c,0xb7,0xf5,0x38,0x1d,0xb5,0x22,0x39,0x92,0x15,0xf4,0x38,0xaa,0x0e,0x04,0x39,0xa1,0x4e,0x02,0x39,0x83,0xd2,0x54,0x39,0xad,0x3c,0x25,0x39,0x70,0x88,0x09,0x39,0x65,0x13,0xc3,0x38,0x18,0x02,0xf0,0x38,0xc2,0xa6,0x36,0x39,0xeb,0x6f,0x6a,0x39,0xfa,0x9a,0xe6,0x38,0x03,0xd5,0x20,0x39,0xef,0x8b,0x13,0x39,0x3e,0xdb,0xfb,0x38,0xca,0xc2,0x1b,0x39,0x9a,0x7a,0xe7,0x38,0x9b,0x14,0x00,0x39,0x5f,0x15,0x27,0x39,0x39,0xd9,0x30,0x39,0x4c,0xbf,0x86,0x39,0xe9,0x2f,0x29,0x39,0xcc,0xda,0xda,0x38,0xf4,0x7f,0x7a,0x39,0x3a,0x7d,0x1a,0x39,0xe4,0xb2,0xf3,0x38,0xb8,0x92,0x3a,0x39,0x03,0x6d,0x1a,0x39,0x35,0x9d,0x4e,0x39,0xb0,0xf5,0xef,0x38,0x15,0xc7,0xce,0x38,0x91,0x19,0x50,0x39,0xbc,0x6d,0x0a,0x39,0x06,0xfe,0x22,0x39,0x61,0xea,0x30,0x39,0xe8,0x52,0x26,0x39,0xfd,0xea,0xd6,0x38,0x17,0xba,0x33,0x39,0xd8,0x54,0x12,0x39,0x0f,0x2a,0x18,0x39,0x14,0x44,0x04,0x39,0xf2,0x1f,0x2a,0x39,0x3f,0x04,0x99,0x39,0xc7,0xa3,0x09,0x39,0x83,0x12,0xe8,0x38,0x05,0x9a,0x6f,0x39,0x21,0xbe,0x02,0x39,0x81,0xf9,0x26,0x39,0xf0,0x4d,0xec,0x38,0x17,0x0e,0x21,0x39,0xc4,0x6f,0x63,0x39,0x3e,0xa9,0x36,0x39,0x3b,0x91,0x35,0x39,0xe8,0x6e,0x95,0x39,0xe8,0xd4,0xfd,0x38,0xbf,0xfb,0x43,0x39,0xfd,0xd8,0xce,0x38,0x0f,0x5e,0xea,0x38,0x8c,0x83,0xdf,0x38,0xc4,0x46,0x5a,0x39,0x57,0x2e,0x27,0x39,0xad,0x75,0x20,0x39,0xdd,0xcf,0x24,0x39,0x79,0xcb,0xd9,0x38,0x8c,0xf2,0xf7,0x38,0x00,0xbe,0xeb,0x38,0xe8,0x7c,0x32,0x39,0xbd,0xe0,0xd3,0x38,0x73,0xd3,0xf3,0x38,0xb9,0x02,0x2a,0x39,0x3b,0xd8,0x30,0x39,0x18,0xb2,0x09,0x39,0xc7,0x6b,0x62,0x39,0xbf,0x36,0x06,0x39,0xe1,0x87,0x3c,0x39,0xde,0xa6,0x27,0x39,0x44,0x9f,0x63,0x39,0xa9,0x3e,0x2c,0x39,0x1b,0xd6,0xfb,0x38,0xd8,0x3c,0xdb,0x38,0xcd,0xf0,0xed,0x38,0xa1,0xb9,0x82,0x39,0xd9,0x5d,0xd8,0x38,0xf4,0x20,0xef,0x38,0x68,0x24,0x71,0x39,0x7a,0x10,0xe4,0x38,0x0b,0x9c,0x88,0x39,0x8f,0xcb,0x35,0x39,0x82,0xaa,0xfb,0x38,0xce,0x66,0x02,0x39,0xde,0x38,0x17,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x38,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xf2,0xf4,0xfe,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x7b,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x38,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x92,0xf5,0xfe,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2c,0x7c,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x37,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x32,0xf6,0xfe,0xff,0x00,0x00,0x00,0x02,0x64,0x06,0x00,0x00,0x53,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xfc,0xfe,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xaa,0x0c,0x61,0x38,0xf0,0x53,0xb3,0x38,0x35,0xea,0x8d,0x38,0xa4,0xc2,0x86,0x38,0xe8,0x92,0x60,0x38,0xc0,0x2c,0x5c,0x38,0x67,0xa0,0x62,0x38,0xa1,0xb3,0xb4,0x38,0x5c,0x07,0x60,0x38,0x30,0xdc,0x5f,0x38,0x2a,0xa0,0xd1,0x38,0xc9,0x14,0x9e,0x38,0x9d,0xac,0x58,0x38,0xf3,0x95,0x8a,0x38,0x83,0x03,0x8d,0x38,0x78,0x46,0x86,0x38,0x80,0xea,0x5d,0x38,0xe1,0x99,0x9a,0x38,0x4b,0xe2,0x96,0x38,0xa9,0xeb,0x83,0x38,0x6b,0x80,0x8f,0x38,0x18,0xf4,0x80,0x38,0x65,0xfb,0x67,0x38,0x1b,0xd7,0x8e,0x38,0xc4,0x6c,0x96,0x38,0x92,0x70,0x98,0x38,0x9e,0x46,0x47,0x38,0xaa,0xde,0x7c,0x38,0x5f,0xc7,0x4b,0x38,0xff,0xa2,0x83,0x38,0x4b,0xa4,0x82,0x38,0x61,0xee,0x9b,0x38,0x47,0xdb,0x66,0x38,0xb4,0x48,0x85,0x38,0xe1,0x54,0x6e,0x38,0x47,0xba,0xb8,0x38,0x65,0x8b,0x85,0x38,0xaa,0x65,0x41,0x38,0x33,0x6d,0x88,0x38,0xfc,0xe2,0x72,0x38,0x92,0x90,0xae,0x38,0x60,0x60,0x9e,0x38,0x9a,0xa0,0x77,0x38,0x67,0x07,0x78,0x38,0x6a,0x34,0x83,0x38,0xba,0xe1,0x6b,0x38,0x1d,0x9b,0x78,0x38,0xd7,0x8f,0x8b,0x38,0x0f,0xc0,0x8a,0x38,0xbb,0xcc,0x85,0x38,0x85,0xf7,0x50,0x38,0x48,0xc2,0x8c,0x38,0x4a,0x58,0x56,0x38,0x73,0x66,0x5a,0x38,0x6d,0x58,0x63,0x38,0x49,0x9b,0x6a,0x38,0xd9,0x6a,0x5b,0x38,0x61,0xbc,0x58,0x38,0xe4,0x43,0x55,0x38,0x4c,0x13,0x9a,0x38,0xe5,0xe5,0x94,0x38,0x92,0xf8,0x3a,0x38,0xa9,0x4e,0x66,0x38,0x46,0xdf,0x69,0x38,0xc3,0xbc,0x92,0x38,0xee,0xc7,0x84,0x38,0x63,0x4c,0x9c,0x38,0xfc,0x62,0x60,0x38,0xfb,0x60,0x85,0x38,0xeb,0x7f,0x7b,0x38,0xb0,0xbc,0xa1,0x38,0x0d,0x46,0x8c,0x38,0xc8,0xf9,0x88,0x38,0x81,0x37,0x81,0x38,0xf2,0x93,0x95,0x38,0x38,0xc8,0x98,0x38,0x1f,0x9a,0x9b,0x38,0xfb,0x1e,0x80,0x38,0xce,0x84,0x81,0x38,0x1d,0x96,0x7d,0x38,0xbb,0x15,0xb2,0x38,0x39,0x9f,0x84,0x38,0xeb,0xbe,0x7a,0x38,0xc4,0x6f,0x87,0x38,0x37,0x62,0x93,0x38,0xc1,0x53,0x99,0x38,0xa2,0xe3,0x3f,0x38,0x67,0xdf,0x43,0x38,0x7f,0xd2,0x64,0x38,0x7c,0x06,0x7f,0x38,0x0c,0xe0,0x6c,0x38,0x30,0x77,0x90,0x38,0x49,0xd7,0x57,0x38,0x65,0x1d,0x7a,0x38,0x36,0x38,0xb0,0x38,0xb9,0x08,0x86,0x38,0x9d,0x25,0x47,0x38,0xd6,0x87,0x69,0x38,0x73,0x64,0xce,0x38,0x14,0xae,0x5b,0x38,0x65,0xe5,0x99,0x38,0xb0,0xec,0x5e,0x38,0xf2,0x88,0x9f,0x38,0x3c,0x3b,0x8a,0x38,0xd1,0xf0,0x82,0x38,0x3e,0xe0,0x7b,0x38,0xc9,0xd2,0x6f,0x38,0xa4,0x9f,0x95,0x38,0x0e,0x3b,0x5b,0x38,0x15,0x3c,0x6d,0x38,0xd3,0xed,0x5a,0x38,0xa0,0x9e,0x96,0x38,0x49,0x50,0xcc,0x38,0x1e,0xe4,0x48,0x38,0xda,0x56,0x3a,0x38,0x41,0x0d,0x57,0x38,0xc9,0x68,0xc0,0x38,0x86,0x69,0x4a,0x38,0x97,0x84,0x6f,0x38,0xb3,0x7c,0x9d,0x38,0x24,0x1c,0x6f,0x38,0x62,0xb0,0x8e,0x38,0x61,0xaf,0x72,0x38,0x03,0x03,0x83,0x38,0xf3,0x9f,0x5b,0x38,0x6f,0xbe,0x89,0x38,0x82,0x3b,0x9c,0x38,0x9f,0x52,0x8a,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x37,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa6,0xfc,0xfe,0xff,0x00,0x00,0x00,0x02,0x6c,0x06,0x00,0x00,0x4e,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0xf6,0xfe,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa1,0x0c,0xe5,0x38,0xb5,0x80,0x28,0x39,0x9e,0xce,0x25,0x39,0xeb,0xb3,0x62,0x39,0x74,0x53,0x38,0x39,0x9f,0x2b,0xb8,0x38,0xb9,0x9e,0x07,0x39,0xdb,0x1c,0x63,0x39,0x9e,0x9d,0x0f,0x39,0xbd,0x02,0x0c,0x39,0xc0,0xda,0x50,0x39,0x0c,0x9f,0x4e,0x39,0xfb,0xe3,0x85,0x39,0x9b,0x35,0xd1,0x39,0xde,0x77,0x12,0x39,0x61,0x64,0x33,0x39,0xeb,0xba,0x62,0x39,0xa4,0x8c,0x63,0x39,0x4c,0xd0,0x39,0x39,0xb5,0x69,0x9b,0x39,0xb9,0x55,0x80,0x39,0x97,0x96,0x52,0x39,0xd6,0x78,0x74,0x39,0xa2,0x2d,0x09,0x39,0x67,0xac,0xc4,0x38,0x1d,0x5f,0x21,0x39,0x02,0x83,0x13,0x39,0xdb,0x4b,0x4a,0x39,0xcf,0x1b,0x20,0x39,0xb4,0x50,0x70,0x39,0xf7,0xd3,0xe9,0x38,0xe2,0x48,0x15,0x39,0x93,0x55,0x04,0x39,0xfc,0xb9,0x34,0x39,0xda,0x08,0x2d,0x39,0xb3,0x09,0x5f,0x39,0x25,0x87,0x07,0x39,0x7c,0x80,0x37,0x39,0xfd,0x85,0x24,0x39,0x0b,0x4b,0x0d,0x39,0xae,0xfa,0x17,0x39,0x80,0x0e,0x44,0x39,0xa4,0x0e,0x12,0x39,0xa1,0xb3,0x12,0x39,0xd2,0x44,0x1c,0x39,0x15,0x69,0xd7,0x38,0x18,0x08,0x25,0x39,0x73,0x4a,0x6f,0x39,0x70,0xe3,0x78,0x39,0xbe,0x9e,0x31,0x39,0x1b,0x13,0x1b,0x39,0x3f,0xf2,0x41,0x39,0xc3,0xb6,0x1c,0x39,0xfe,0x9d,0x13,0x39,0x61,0x1b,0x0d,0x39,0x23,0x75,0x06,0x39,0x7b,0xa1,0x3c,0x39,0xde,0x43,0x7c,0x39,0xeb,0x1b,0x22,0x39,0x76,0xff,0x30,0x39,0x24,0x23,0x53,0x39,0x8b,0x71,0x03,0x39,0x3b,0x12,0x84,0x39,0x9b,0x1d,0x9a,0x39,0x1e,0xe6,0x02,0x39,0x2c,0xbe,0xdd,0x38,0x55,0xdd,0x7b,0x39,0xc8,0xdf,0x05,0x39,0x61,0x65,0x25,0x39,0x23,0xbb,0x43,0x39,0x18,0x72,0xe3,0x38,0x4d,0x09,0x6e,0x39,0x91,0xf0,0x36,0x39,0x9b,0x10,0x1e,0x39,0x54,0xa5,0x8f,0x39,0x8c,0x4f,0xbb,0x39,0xf5,0xd3,0x1a,0x39,0xe7,0x86,0xc7,0x38,0x0f,0x4e,0x11,0x39,0xab,0xce,0x17,0x39,0xc4,0xb5,0x56,0x39,0x18,0xfb,0x76,0x39,0x06,0x4d,0x46,0x39,0x1f,0x49,0x09,0x39,0xd0,0x09,0xf7,0x38,0xbc,0x92,0x38,0x39,0x5c,0x55,0x63,0x39,0x49,0xda,0x43,0x39,0xf9,0xcd,0x0a,0x39,0xfd,0xf5,0xc2,0x39,0x49,0xd8,0x45,0x39,0xf9,0x91,0x0d,0x39,0x59,0x18,0x15,0x39,0xc5,0x1a,0x12,0x39,0xa6,0xfe,0x1d,0x39,0x1d,0x58,0x35,0x39,0x24,0x78,0x42,0x39,0x59,0x85,0x63,0x39,0xd1,0x0f,0x00,0x39,0xfa,0x4c,0x6a,0x39,0xf8,0x36,0x27,0x39,0x8e,0xea,0x21,0x39,0x6e,0xdc,0x77,0x39,0x21,0x26,0xf4,0x38,0x3f,0xff,0x00,0x39,0x2c,0x94,0x14,0x39,0x12,0x2e,0x36,0x39,0x00,0xd5,0xd7,0x38,0xbd,0xa6,0x18,0x39,0xb5,0xda,0x5d,0x39,0xcd,0x8e,0x94,0x39,0x64,0x41,0xa4,0x39,0xcf,0x85,0x10,0x39,0x15,0x89,0x8f,0x39,0x7a,0x67,0x1f,0x39,0x30,0x0c,0x8e,0x39,0x2d,0x18,0x1b,0x39,0x5e,0x4b,0x6d,0x39,0xda,0x52,0x25,0x39,0x27,0x75,0x70,0x39,0xea,0x56,0x39,0x39,0x05,0x83,0xce,0x38,0x68,0x65,0xea,0x38,0x05,0xd0,0xe0,0x38,0xf6,0xf8,0x67,0x39,0x3c,0x43,0x41,0x39,0xa0,0x45,0x4d,0x39,0xa9,0x70,0xda,0x38,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x37,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x22,0x03,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0x89,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x37,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xc2,0x03,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0x8a,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x36,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x62,0x04,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x06,0x00,0x00,0x18,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xe4,0x0a,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x30,0x0b,0xba,0x38,0x07,0xe6,0x99,0x38,0x5b,0xb2,0x0d,0x39,0x9a,0xf2,0xbe,0x38,0x1f,0x1d,0x99,0x38,0x8b,0x74,0xed,0x38,0xaf,0x9e,0x6d,0x38,0xcb,0xd4,0x9e,0x38,0xde,0xf6,0xda,0x38,0x9a,0xb8,0xa7,0x38,0x2e,0x44,0x99,0x38,0x6a,0x0c,0xd5,0x38,0x30,0x65,0x86,0x38,0xcb,0xe2,0x38,0x38,0x20,0xca,0x7d,0x38,0xa1,0x51,0x8b,0x38,0x0e,0xc5,0x88,0x38,0x3e,0x33,0x95,0x38,0xa2,0x88,0xbb,0x38,0xcf,0xaf,0x7e,0x38,0x6a,0x0d,0xae,0x38,0xf3,0x33,0x86,0x38,0x67,0xd4,0xc5,0x38,0x0f,0x0f,0xcc,0x38,0xa6,0xfb,0xd7,0x38,0x6e,0xf4,0x8e,0x38,0x61,0x41,0xa3,0x38,0xf7,0xbe,0xb4,0x38,0xb1,0xe2,0x9b,0x38,0x70,0x32,0xca,0x38,0xe1,0xfb,0xac,0x38,0xff,0xc4,0x93,0x38,0x49,0x65,0xb3,0x38,0x95,0xae,0x8b,0x38,0x1e,0x8a,0x86,0x38,0xcf,0x20,0x83,0x38,0x64,0x37,0x9c,0x38,0x8a,0xb5,0x35,0x38,0xe5,0xbe,0xa6,0x38,0x35,0x13,0xbe,0x38,0x70,0x9c,0xc5,0x38,0xa9,0xf2,0xa6,0x38,0x45,0x16,0x95,0x38,0x29,0xe0,0xaa,0x38,0x64,0xfa,0xc7,0x38,0xa3,0x66,0x49,0x38,0xe7,0x2d,0xa4,0x38,0xd4,0x74,0xa8,0x38,0xb8,0xb8,0x63,0x38,0x26,0x53,0x72,0x38,0x06,0x28,0xc2,0x38,0x06,0xe0,0xb0,0x38,0xa7,0x1d,0xa6,0x38,0x05,0x41,0xaa,0x38,0xc2,0x93,0x95,0x38,0x38,0xc1,0x97,0x38,0xb0,0xa8,0xb6,0x38,0x7a,0x24,0xa5,0x38,0xeb,0xed,0x83,0x38,0xd6,0x54,0x48,0x38,0x6f,0x32,0x94,0x38,0x54,0x98,0x8a,0x38,0x88,0x4d,0x83,0x38,0xb0,0xe4,0x96,0x38,0xf9,0xf6,0xa9,0x38,0xe1,0x67,0xa6,0x38,0x06,0x46,0x78,0x38,0xed,0xd5,0xea,0x38,0x05,0x1f,0x94,0x38,0x91,0xe5,0x91,0x38,0xf6,0x2e,0x98,0x38,0x94,0x63,0x5d,0x38,0xf9,0x4f,0xa4,0x38,0x4b,0x46,0x9e,0x38,0x19,0xcf,0x98,0x38,0x3e,0x3b,0x4b,0x38,0x38,0xc9,0x79,0x38,0x24,0xbb,0x88,0x38,0xda,0x39,0x87,0x38,0xd0,0xe6,0x84,0x38,0x05,0x05,0xa9,0x38,0x1a,0xae,0x9d,0x38,0xc1,0x65,0xbe,0x38,0xf1,0xc2,0x98,0x38,0x20,0x08,0x93,0x38,0x15,0xb5,0x9c,0x38,0xba,0x98,0x63,0x38,0x98,0xf0,0x97,0x38,0x04,0xe0,0x90,0x38,0xc7,0x9e,0x74,0x38,0xfe,0x4c,0xb7,0x38,0x50,0xeb,0x7f,0x38,0x2a,0xe3,0xa6,0x38,0x14,0xed,0x73,0x38,0x62,0x8f,0xcd,0x38,0xee,0x19,0x78,0x38,0x3a,0xd7,0x6c,0x38,0x61,0x01,0xbd,0x38,0x56,0xda,0x97,0x38,0xd0,0xa5,0xa5,0x38,0x1b,0xb8,0xc4,0x38,0xbb,0x0b,0xcc,0x38,0x9d,0xe2,0xa7,0x38,0xef,0xaf,0xb6,0x38,0x9e,0x37,0xae,0x38,0x6a,0x46,0x72,0x38,0xfb,0x4c,0x88,0x38,0x7a,0xea,0x96,0x38,0x2e,0xf7,0x98,0x38,0x08,0x3a,0xa5,0x38,0xe1,0xdf,0xb4,0x38,0xcf,0x6f,0x4d,0x38,0x9b,0xe7,0x91,0x38,0xd6,0x8a,0x94,0x38,0x71,0x6f,0x88,0x38,0xa5,0x79,0x9d,0x38,0xf7,0xe3,0xa4,0x38,0x3d,0xe7,0x6e,0x38,0xea,0xa0,0x8c,0x38,0x66,0x7f,0x3d,0x38,0x0e,0x6e,0x93,0x38,0xd3,0x64,0x6d,0x38,0xc9,0xb9,0x9b,0x38,0xde,0x7c,0xdc,0x38,0xc9,0xa5,0xcf,0x38,0xc7,0xca,0x7d,0x38,0x79,0x75,0xa0,0x38,0x5e,0xab,0x95,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x36,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xd6,0x0a,0xff,0xff,0x00,0x00,0x00,0x02,0x6c,0x03,0x00,0x00,0x1a,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x04,0xff,0xff,0x14,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xe4,0xe1,0xd9,0x38,0x59,0x7e,0xcd,0x38,0x89,0x65,0xac,0x38,0x2d,0x36,0xbb,0x38,0xa1,0x1e,0x8e,0x38,0xbb,0x08,0x92,0x38,0x77,0xc7,0xf3,0x38,0xb3,0xfb,0xbc,0x38,0x7f,0x6a,0xba,0x38,0xff,0xe1,0x05,0x39,0x24,0xf5,0xb9,0x38,0x71,0xb3,0xcb,0x38,0xbe,0x56,0xce,0x38,0x18,0xb7,0xc0,0x38,0xd2,0x9d,0xbd,0x38,0x74,0x16,0x37,0x39,0x46,0x11,0xb2,0x38,0xbd,0x56,0x6c,0x39,0xdb,0x35,0xb7,0x38,0xe8,0x93,0xd7,0x38,0x53,0xc4,0xab,0x38,0xb6,0xa6,0xc4,0x38,0xb5,0xd1,0x09,0x39,0xdd,0x60,0xa5,0x38,0x77,0x4e,0xed,0x38,0x35,0x67,0xb4,0x38,0x85,0x14,0xe0,0x38,0x6b,0x21,0xc0,0x38,0xfd,0x90,0xbf,0x38,0xd6,0x8b,0xe1,0x38,0x76,0x9c,0xaa,0x38,0x06,0x37,0xc2,0x38,0x18,0x19,0xac,0x38,0xbc,0x40,0xb5,0x38,0x54,0x25,0x3a,0x39,0x03,0xd8,0x01,0x39,0x1a,0xdc,0xe0,0x38,0xdb,0x58,0xe6,0x38,0x8f,0xb3,0x98,0x38,0xe6,0xda,0x9c,0x38,0x80,0xed,0xb5,0x38,0x71,0x6c,0xfd,0x38,0x0f,0xc1,0xf6,0x38,0x20,0x63,0xde,0x38,0x89,0x1f,0xab,0x38,0xc7,0xcd,0xdd,0x38,0x5c,0xf0,0x9f,0x38,0x1a,0x54,0xe4,0x38,0x2d,0x39,0xba,0x38,0x20,0x55,0xd1,0x38,0xcf,0x66,0x87,0x38,0xe1,0xb7,0xe6,0x38,0x9a,0x6d,0x1a,0x39,0xfc,0x97,0x11,0x39,0x28,0x62,0xaf,0x38,0x0b,0xcf,0xc5,0x38,0x61,0xbc,0x23,0x39,0x0c,0x7b,0xc5,0x38,0xfc,0xfa,0x94,0x38,0x39,0x7c,0x96,0x38,0x2a,0x7e,0x8e,0x38,0x5e,0x2d,0xd6,0x38,0xa1,0xd1,0xcc,0x38,0x43,0x1a,0x24,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x36,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x52,0x0e,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0x94,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x36,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xf2,0x0e,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x95,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x35,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x92,0x0f,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x03,0x00,0x00,0x54,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x16,0xff,0xff,0x10,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xd3,0x57,0x81,0x38,0x47,0x8c,0xbc,0x38,0x50,0xdf,0xd4,0x38,0xe8,0xc0,0xf7,0x38,0xa1,0x2a,0xaa,0x38,0x11,0x80,0x8b,0x38,0xdc,0xc8,0xb0,0x38,0xbc,0xd0,0xa3,0x38,0x79,0xa4,0xd5,0x38,0xb0,0x8f,0xc2,0x38,0x83,0xa4,0xbf,0x38,0xf4,0xa6,0xa9,0x38,0x77,0x21,0xc2,0x38,0x2f,0xca,0x6f,0x38,0x06,0x11,0xfe,0x38,0xe8,0xd1,0x57,0x38,0x97,0xa2,0xc2,0x38,0x6b,0x93,0x59,0x38,0x7a,0x86,0x7d,0x38,0x15,0xc0,0xe4,0x38,0x70,0xa8,0xb4,0x38,0x14,0x02,0xa1,0x38,0x58,0x71,0xb0,0x38,0xfd,0x49,0xb5,0x38,0x91,0x89,0x81,0x38,0x3a,0x10,0x6c,0x38,0x68,0x77,0xea,0x38,0x45,0xdc,0xa9,0x38,0x91,0x2c,0xd9,0x38,0x22,0x65,0xa5,0x38,0x4c,0x00,0xc3,0x38,0x82,0x95,0xa6,0x38,0xdf,0xb7,0x91,0x38,0x4f,0xb4,0xa3,0x38,0xcf,0x1e,0x9a,0x38,0x15,0xe8,0x8d,0x38,0xd5,0xfc,0xa2,0x38,0x68,0xb5,0x62,0x38,0x51,0x04,0x82,0x38,0x4a,0x25,0xd2,0x38,0x8b,0xd1,0xc4,0x38,0x02,0x61,0xb0,0x38,0x5f,0x34,0x8b,0x38,0xf3,0xd3,0xb3,0x38,0x6d,0x60,0xb8,0x38,0x7f,0xeb,0xa8,0x38,0x85,0x4d,0x8d,0x38,0x56,0x3a,0x6c,0x38,0x9d,0xee,0x94,0x38,0x9c,0x0c,0x3d,0x38,0xc0,0x96,0xae,0x38,0x52,0xab,0xd5,0x38,0xe1,0xa7,0x18,0x38,0x47,0xfe,0x55,0x38,0x36,0xac,0xb0,0x38,0xd8,0xdf,0xa3,0x38,0xc1,0x94,0x9c,0x38,0x24,0xd7,0xb0,0x38,0x40,0x4a,0xad,0x38,0x0f,0x31,0xa7,0x38,0x7c,0xb9,0xbf,0x38,0xd0,0x06,0xc6,0x38,0x53,0x4e,0x5f,0x38,0x94,0x25,0x5d,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x35,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x06,0x13,0xff,0xff,0x00,0x00,0x00,0x02,0x6c,0x03,0x00,0x00,0x1d,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x62,0x0c,0xff,0xff,0x14,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xa7,0x20,0xfc,0x38,0x89,0x62,0x69,0x39,0xfc,0x00,0x35,0x39,0xca,0x7e,0x39,0x39,0x08,0x4e,0x66,0x39,0xf3,0x61,0xd8,0x38,0x94,0xb7,0x05,0x39,0x40,0x49,0x97,0x38,0x31,0xdd,0x9c,0x39,0x72,0x72,0xb2,0x39,0x74,0xe6,0xd4,0x39,0x53,0x96,0x64,0x39,0x38,0xbe,0x5f,0x39,0x6a,0x5f,0xbe,0x38,0x01,0x21,0x21,0x39,0x8f,0xf1,0x40,0x39,0xa2,0x39,0x0f,0x39,0xc1,0x47,0xe9,0x38,0x86,0x92,0x22,0x39,0x34,0xfb,0xec,0x38,0xdf,0x67,0xe0,0x38,0x53,0x3a,0x11,0x39,0x1a,0xf8,0xd1,0x39,0xb5,0x00,0x19,0x39,0x26,0x8e,0x05,0x39,0x43,0x28,0xac,0x39,0xdb,0xee,0x8a,0x39,0x85,0x31,0xe1,0x38,0x0f,0x1e,0x11,0x39,0xe7,0xea,0x2f,0x39,0x42,0x73,0x05,0x39,0xec,0x15,0x2f,0x39,0x12,0x09,0xd2,0x38,0xd2,0x2e,0x09,0x39,0x1e,0x05,0x22,0x39,0xaa,0x44,0xaf,0x38,0x02,0xe1,0x86,0x39,0x59,0x42,0x92,0x39,0xe4,0x90,0x09,0x39,0x3c,0xde,0x04,0x39,0xaa,0xf2,0x32,0x39,0xc0,0x84,0x2a,0x39,0x1d,0xd5,0x76,0x39,0x1a,0x13,0x24,0x39,0x4f,0xbd,0xbc,0x38,0xe0,0x06,0xa8,0x38,0xd5,0x4b,0x8f,0x39,0xe1,0xed,0xc7,0x38,0xfd,0xea,0x80,0x39,0x77,0xf5,0x5b,0x39,0x00,0xa6,0x37,0x39,0xf3,0x36,0x55,0x39,0x77,0x6e,0xa1,0x39,0x2b,0x10,0x07,0x39,0xd0,0xf0,0xdb,0x38,0x62,0xd5,0xff,0x38,0xcd,0xfc,0x53,0x39,0x5c,0xc1,0x16,0x39,0xd3,0xbe,0xe9,0x38,0x77,0xc2,0xf2,0x38,0x71,0x2a,0x98,0x39,0xe4,0x4e,0xd0,0x38,0x4b,0x79,0x0a,0x39,0x56,0x9a,0x8e,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x35,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x82,0x16,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x9d,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x35,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x22,0x17,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0x9d,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x34,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xc2,0x17,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x03,0x00,0x00,0x4c,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x1e,0xff,0xff,0x10,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xa9,0xbb,0xd0,0x38,0x3a,0x81,0x84,0x38,0x12,0x86,0xf8,0x38,0xd8,0xe1,0xd0,0x38,0xb4,0x0a,0xa1,0x38,0x93,0x51,0xb6,0x38,0x65,0xd7,0xf0,0x38,0x98,0x9a,0xc6,0x38,0xbf,0x4e,0x88,0x38,0xc6,0xa5,0xd3,0x38,0x59,0xc6,0x60,0x38,0xd2,0xdc,0xf0,0x38,0x70,0x7e,0x87,0x38,0xa3,0xd3,0xcf,0x38,0x54,0xfb,0x02,0x39,0xdb,0x90,0x45,0x39,0x8b,0x00,0xcc,0x38,0x3b,0xd8,0xc4,0x38,0x73,0xed,0xd3,0x38,0xcb,0xb7,0x8d,0x38,0x3e,0xc5,0x2d,0x39,0xe9,0xaf,0x9f,0x38,0x61,0x00,0xa6,0x38,0xa9,0xf7,0x12,0x39,0x70,0x6d,0x0c,0x39,0x18,0x81,0x2a,0x38,0x9d,0x17,0x83,0x38,0x0b,0x0d,0x22,0x39,0x83,0x52,0x07,0x39,0x26,0x7c,0xc5,0x38,0xb5,0x04,0xd0,0x38,0x42,0xcc,0x12,0x39,0x01,0x47,0x00,0x39,0x5e,0x12,0x74,0x38,0x62,0x92,0xb3,0x38,0x20,0xfd,0x27,0x39,0xd0,0x51,0x6e,0x38,0x79,0x0f,0x77,0x38,0x3e,0x76,0xb4,0x38,0x32,0x98,0x88,0x38,0x30,0x5d,0xa8,0x38,0x11,0x95,0xd5,0x38,0xb0,0x91,0x9f,0x38,0xad,0x1f,0xd7,0x38,0xec,0x9d,0x1b,0x39,0xcb,0x15,0x1d,0x39,0x27,0x48,0x4a,0x38,0x09,0xb3,0xb5,0x38,0x98,0x7f,0x02,0x39,0x47,0x95,0x53,0x39,0xf1,0x99,0x47,0x39,0x73,0x76,0xd8,0x38,0x71,0x7a,0xd5,0x38,0x67,0x79,0x4e,0x39,0x42,0xf0,0x01,0x39,0x59,0xbe,0xe5,0x38,0x0a,0xec,0x9f,0x38,0x87,0x6a,0x20,0x39,0x6a,0x06,0xdc,0x38,0x40,0x5d,0xfa,0x38,0x95,0x1d,0x92,0x38,0xd3,0xcd,0x3e,0x39,0xa1,0x43,0x0d,0x39,0x6b,0x23,0x97,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x34,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x36,0x1b,0xff,0xff,0x00,0x00,0x00,0x02,0xec,0x01,0x00,0x00,0x1f,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x92,0x14,0xff,0xff,0x14,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xc5,0xba,0x8c,0x38,0x92,0x4d,0xa9,0x38,0x52,0x02,0x82,0x38,0xfc,0xa9,0xaf,0x38,0xff,0x9a,0x46,0x39,0x14,0xa1,0xcb,0x38,0x60,0xad,0x95,0x38,0xb6,0xdd,0x96,0x38,0x69,0x54,0x96,0x38,0xca,0x22,0x68,0x38,0x68,0x2c,0xac,0x38,0xe7,0x85,0x95,0x38,0x41,0x03,0xd5,0x38,0xd5,0x13,0x28,0x39,0xa9,0xae,0xde,0x38,0x26,0x06,0xa4,0x38,0xa7,0x7b,0x9a,0x38,0x0e,0x89,0x8f,0x38,0x4c,0x4a,0xf2,0x38,0x6d,0x8f,0x9d,0x38,0x03,0xb2,0xef,0x38,0x3e,0x97,0xd8,0x38,0x80,0xfe,0x4b,0x38,0xed,0x28,0xad,0x38,0x04,0xbb,0x2a,0x39,0x49,0x6b,0xbb,0x38,0x82,0x54,0xa2,0x38,0xbd,0xee,0x90,0x38,0x46,0xb5,0xea,0x38,0xd2,0x63,0xa7,0x38,0x11,0x03,0xda,0x38,0x48,0x20,0x22,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x34,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x32,0x1d,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xcc,0xa3,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x34,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xd2,0x1d,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0xa4,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x33,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x72,0x1e,0xff,0xff,0x00,0x00,0x00,0x02,0xe4,0x01,0x00,0x00,0x3b,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0x24,0xff,0xff,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x3e,0x8f,0xd5,0x38,0xe1,0xa8,0x15,0x39,0x06,0x19,0xf5,0x38,0x79,0x80,0xc5,0x38,0x35,0x5e,0x4f,0x38,0x3f,0x44,0x8d,0x38,0x0a,0xa0,0xb7,0x38,0xb2,0xf2,0xa7,0x38,0x34,0xb7,0xf3,0x38,0xb4,0xd4,0xb8,0x38,0x08,0x3d,0x0e,0x39,0xea,0xad,0xa8,0x38,0x47,0xf9,0x00,0x39,0xbf,0x4e,0x04,0x39,0xdb,0x31,0xa0,0x38,0xed,0x1d,0xbd,0x38,0x41,0x75,0xc6,0x38,0x76,0x6a,0xe9,0x38,0xe5,0x13,0x0f,0x39,0x14,0xa9,0xed,0x38,0xd2,0x34,0x26,0x39,0xc4,0x70,0xc7,0x38,0x27,0xd1,0xb3,0x38,0xb7,0x3f,0xfd,0x38,0x58,0x20,0x1e,0x39,0xd6,0xeb,0x47,0x39,0x15,0x4c,0x22,0x39,0xa1,0xd0,0x04,0x39,0xa2,0x9e,0x8c,0x38,0x2c,0x4b,0xbe,0x38,0xd9,0xb7,0xe5,0x38,0x2a,0xdd,0xbf,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x33,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x66,0x20,0xff,0xff,0x00,0x00,0x00,0x02,0xec,0x01,0x00,0x00,0x22,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xc2,0x19,0xff,0xff,0x14,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xe1,0x95,0x47,0x39,0x5c,0xa6,0x6d,0x39,0x76,0xe7,0x2c,0x39,0x44,0x2e,0x74,0x39,0x27,0x35,0x9d,0x39,0x0c,0xe8,0x14,0x3a,0x59,0x1e,0xd8,0x38,0x9b,0xf8,0x30,0x39,0xfc,0xec,0x33,0x39,0xcd,0x64,0xd1,0x39,0x39,0xe6,0x05,0x3a,0x72,0xd9,0x25,0x39,0x42,0xa7,0x87,0x38,0xd6,0xfc,0xa1,0x39,0xe1,0x80,0x50,0x39,0xe2,0x17,0x4b,0x38,0x07,0xb7,0x2c,0x39,0xa1,0x48,0xd2,0x38,0x3d,0xfc,0x06,0x3a,0xae,0x9c,0x16,0x3a,0x53,0xec,0x07,0x39,0x9c,0xa6,0x10,0x3a,0x59,0x92,0x9c,0x38,0xd0,0xc6,0x1f,0x39,0x61,0x0a,0x16,0x39,0xb9,0x19,0x35,0x3a,0x4d,0x18,0x3b,0x39,0x21,0x5f,0x9e,0x38,0x70,0x69,0xfb,0x38,0x85,0x13,0x29,0x39,0xca,0x56,0x1f,0x39,0x98,0x9d,0x8a,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x33,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x62,0x22,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfc,0xa8,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x33,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x23,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9c,0xa9,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x32,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xa2,0x23,0xff,0xff,0x00,0x00,0x00,0x02,0xe4,0x01,0x00,0x00,0x3e,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0x2a,0xff,0xff,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xa9,0x23,0x8e,0x39,0xb2,0x18,0xc6,0x38,0x94,0x74,0x1a,0x39,0x67,0xb0,0x1d,0x39,0xcd,0x82,0xf5,0x38,0xb3,0x69,0x1d,0x38,0x67,0xcc,0x03,0x39,0x74,0xc8,0x29,0x39,0xaf,0x8a,0xb9,0x38,0x18,0x9b,0xa7,0x38,0xb5,0x00,0x2d,0x38,0x4f,0x24,0xfe,0x38,0xce,0xc8,0x1c,0x39,0xe2,0x95,0xfb,0x38,0xc4,0x61,0x72,0x39,0x18,0x6d,0x8d,0x39,0x57,0x16,0x24,0x39,0x92,0xe1,0x3c,0x39,0x03,0x6a,0x5a,0x38,0x21,0x2c,0x9b,0x38,0xa9,0x0d,0x05,0x39,0xd1,0x14,0x3f,0x38,0x2a,0xa9,0x11,0x39,0xf1,0xe3,0x25,0x39,0xd4,0x0c,0x05,0x39,0x8c,0x1e,0xdc,0x37,0xfa,0xf1,0x07,0x39,0x33,0x53,0x34,0x39,0x97,0x2f,0x6a,0x39,0xd0,0x60,0xe8,0x38,0x00,0x42,0x4d,0x39,0xf1,0xd0,0xb5,0x38,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x32,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x96,0x25,0xff,0xff,0x00,0x00,0x00,0x02,0x2c,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf2,0x1e,0xff,0xff,0x94,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x27,0xf0,0xac,0x38,0x4d,0xb4,0x95,0x38,0x20,0x35,0xf3,0x38,0xed,0x7a,0xc5,0x38,0x08,0x25,0x10,0x39,0xff,0xdf,0xec,0x38,0x1b,0x9b,0xf9,0x38,0xce,0x25,0x84,0x38,0x67,0xff,0xf7,0x38,0xf1,0x99,0x5b,0x39,0x59,0xbf,0x93,0x38,0x9e,0x8e,0xf4,0x38,0xf9,0x05,0xb2,0x38,0xa0,0x01,0xad,0x38,0x04,0x3f,0x24,0x39,0xef,0x8a,0x32,0x39,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x32,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xd2,0x26,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0xad,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x32,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x72,0x27,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0xae,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x12,0x28,0xff,0xff,0x00,0x00,0x00,0x02,0x24,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x94,0x2e,0xff,0xff,0x90,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x58,0x91,0xaa,0x39,0x89,0x15,0x5a,0x39,0x0c,0xe3,0xcb,0x39,0x37,0x66,0x33,0x39,0xb6,0xee,0x95,0x39,0x82,0xd1,0x97,0x39,0xc1,0x33,0x41,0x39,0x27,0x74,0x53,0x39,0xfc,0x35,0xb0,0x39,0x97,0x5a,0x4c,0x39,0x7b,0xb4,0x9e,0x39,0x95,0xda,0x45,0x39,0xfc,0x96,0x95,0x39,0x36,0x8b,0x2b,0x39,0x2f,0x32,0x48,0x39,0x51,0x8f,0x86,0x39,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x46,0x29,0xff,0xff,0x00,0x00,0x00,0x02,0xcc,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xa2,0x22,0xff,0xff,0x54,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xfa,0x50,0xd3,0x38,0x62,0x8a,0x18,0x39,0x74,0x24,0x61,0x3b,0x22,0x48,0x8f,0x38,0xec,0xd9,0xb4,0x39,0x0a,0xb5,0x82,0x38,0x1c,0xef,0x35,0x39,0xd6,0x72,0xf6,0x3b,0x39,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x22,0x2a,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0xb0,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xc2,0x2a,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0xb1,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x72,0x98,0x3c,0x01,0x00,0x00,0x00,0x25,0xda,0x97,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x33,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x62,0x2b,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0xe4,0x31,0xff,0xff,0x10,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x1f,0x37,0xa6,0x37,0xa1,0xb4,0x00,0x38,0x98,0x9f,0xe0,0x37,0x43,0x01,0x4f,0x37,0x0f,0xa8,0xe7,0x37,0x6d,0x06,0x84,0x37,0x96,0x2b,0x92,0x37,0x4d,0xf5,0xe0,0x37,0x9e,0xa2,0xa7,0x37,0xa0,0x06,0xcc,0x37,0xe4,0x70,0xa6,0x37,0x4d,0x9c,0x85,0x37,0xbd,0x71,0xd4,0x37,0xfe,0x3d,0x8b,0x37,0xd5,0xe9,0x87,0x37,0x0a,0x83,0xa1,0x37,0xae,0x42,0xae,0x37,0xc5,0xda,0x82,0x37,0xad,0xbd,0x6b,0x37,0xa5,0x09,0xbe,0x37,0xb8,0xf0,0x5c,0x37,0x78,0xb8,0x95,0x37,0x6a,0xbe,0xc1,0x37,0xc7,0xbc,0x96,0x37,0x14,0xb4,0xe4,0x37,0xf2,0x48,0x92,0x37,0x46,0xc4,0x06,0x38,0x59,0x42,0xc5,0x37,0x7c,0x19,0x66,0x37,0x30,0xe4,0x8a,0x37,0x5b,0x24,0xa4,0x37,0x78,0x26,0xba,0x37,0xca,0xbf,0xd9,0x37,0xf5,0xb8,0x9c,0x37,0xee,0xa0,0x96,0x37,0xb5,0xa5,0x8f,0x37,0x58,0xa9,0x9e,0x37,0xc0,0x9e,0x79,0x37,0x56,0xde,0xac,0x37,0x89,0xa8,0x94,0x37,0xcc,0xeb,0xc6,0x37,0xd2,0x26,0xa3,0x37,0x3b,0x10,0xc7,0x37,0x7c,0x49,0xba,0x37,0xbb,0x07,0x5a,0x37,0xe4,0x03,0x6f,0x37,0xee,0x71,0x93,0x37,0x74,0x4a,0x89,0x37,0x3d,0x2f,0xd1,0x37,0x38,0x2e,0xca,0x37,0xa3,0x44,0xa3,0x37,0x4d,0xbe,0x6d,0x37,0x27,0x53,0x88,0x37,0x87,0x38,0x1c,0x38,0x53,0x4c,0x8e,0x37,0x3f,0x6a,0xbe,0x37,0x6a,0x06,0xc9,0x37,0xf6,0xa8,0x96,0x37,0x07,0x79,0x87,0x37,0xa5,0x0f,0xa6,0x37,0xc0,0x65,0xa6,0x37,0x4d,0xf4,0x9a,0x37,0xa1,0x4f,0xc2,0x37,0x49,0xa7,0x8f,0x37,0x46,0x94,0x68,0x37,0xd8,0x90,0xa0,0x37,0x00,0x2c,0x76,0x37,0xe0,0xdc,0x92,0x37,0x02,0x50,0x92,0x37,0xb5,0x1f,0xab,0x37,0x77,0x9c,0xae,0x37,0x4f,0x20,0x8f,0x37,0x30,0xd6,0x43,0x37,0xbc,0xb3,0x9f,0x37,0x08,0x44,0x7e,0x37,0x8b,0x1a,0x79,0x37,0x2f,0xb3,0xf9,0x37,0x19,0x9a,0xa3,0x37,0x64,0xa1,0x87,0x37,0x39,0xb2,0x4f,0x37,0x24,0x04,0x19,0x38,0x06,0x87,0x81,0x37,0x8b,0xfb,0x4f,0x37,0xbc,0x34,0x93,0x37,0xff,0x66,0xd9,0x37,0xfc,0x08,0x66,0x37,0x44,0xf8,0x87,0x37,0xfd,0xf8,0xec,0x37,0x74,0x22,0x93,0x37,0x8b,0x02,0x99,0x37,0x05,0x49,0xc1,0x37,0x7d,0x68,0x7d,0x37,0x7e,0x66,0x99,0x37,0xff,0xdd,0xa3,0x37,0xc7,0x00,0x5b,0x37,0x1b,0x9c,0xe9,0x37,0xbe,0x3f,0xc6,0x37,0x12,0x48,0xad,0x37,0x61,0x61,0xe4,0x37,0x61,0xd1,0x81,0x37,0x4f,0xd5,0x80,0x37,0x5b,0x9b,0x7c,0x37,0xc3,0x4c,0x7c,0x37,0xad,0xdd,0xa6,0x37,0x0f,0x98,0xcf,0x37,0x6f,0xb3,0x83,0x37,0xff,0xdd,0x7e,0x37,0x8f,0x15,0x7e,0x37,0x39,0xbb,0xb7,0x37,0xc2,0xa7,0xa1,0x37,0x33,0xa7,0xc9,0x37,0x5e,0x0a,0x7d,0x37,0xb5,0x3e,0x45,0x37,0xbb,0x10,0xe8,0x37,0xc9,0xc0,0x86,0x37,0xb3,0x01,0xc6,0x37,0x1a,0xfe,0xd6,0x37,0x12,0x88,0x8b,0x37,0x5b,0x0c,0xf5,0x37,0xeb,0x77,0x7b,0x37,0xb1,0x5b,0xa6,0x37,0x80,0xb2,0x6e,0x37,0x2c,0x7e,0x78,0x37,0xea,0xc5,0xa0,0x37,0x8c,0xee,0xa6,0x37,0xf1,0x74,0x7a,0x37,0x47,0xd0,0x72,0x37,0x7a,0xca,0xb8,0x37,0x4f,0x17,0xb1,0x37,0xe8,0xee,0xe9,0x37,0x0c,0xb2,0xf3,0x37,0x43,0xcd,0xbe,0x37,0x4e,0xe2,0xa2,0x37,0xcc,0x69,0x77,0x37,0x63,0xbf,0xae,0x37,0xcf,0xf5,0x49,0x37,0x15,0x5a,0xbd,0x37,0x87,0xe5,0xb5,0x37,0x0e,0x9c,0x78,0x37,0x58,0x6c,0x92,0x37,0x82,0xbe,0xb3,0x37,0xbe,0xbd,0x92,0x37,0xd5,0xe0,0x97,0x37,0xcb,0xee,0xa7,0x37,0x6e,0xab,0xa0,0x37,0x21,0x07,0x9d,0x37,0xa1,0x64,0xac,0x37,0x56,0xbc,0xa9,0x37,0xb5,0x8d,0xb8,0x37,0xed,0x81,0x87,0x37,0x95,0xbf,0xaa,0x37,0xc1,0xd9,0x93,0x37,0xaa,0x1d,0x79,0x37,0x89,0xa7,0x66,0x37,0x52,0x2f,0xb7,0x37,0x72,0xb9,0xa3,0x37,0x1d,0xa3,0x91,0x37,0xe2,0x52,0xef,0x37,0xb0,0x2b,0x95,0x37,0xed,0x68,0x97,0x37,0x15,0xd7,0x76,0x37,0x53,0xba,0x95,0x37,0x24,0x50,0x0a,0x38,0xbd,0xc8,0x9b,0x37,0xcd,0x2e,0x92,0x37,0x41,0x93,0x8c,0x37,0x7d,0xa0,0x6e,0x37,0x05,0x97,0x97,0x37,0x11,0xc1,0x5d,0x37,0x40,0x3d,0xf4,0x37,0x88,0x74,0x9c,0x37,0x6d,0x48,0x6e,0x37,0xf1,0x0a,0xd1,0x37,0x6b,0x91,0x87,0x37,0x1d,0x90,0x96,0x37,0x8a,0x5c,0x97,0x37,0xcd,0x78,0x4c,0x38,0xb6,0xc4,0x18,0x38,0xe7,0xee,0xaa,0x37,0x76,0xff,0x9c,0x37,0x3e,0xe5,0x75,0x37,0x5e,0x91,0x8d,0x37,0xe8,0x93,0x94,0x37,0x67,0xa9,0xa1,0x37,0x38,0x67,0xbc,0x37,0x0f,0x70,0xae,0x37,0x56,0xb9,0xe5,0x37,0xb9,0x85,0x8f,0x37,0x9e,0xfe,0x89,0x37,0xeb,0x2d,0x98,0x37,0xad,0x33,0x9e,0x37,0x15,0x54,0xbd,0x37,0xac,0x25,0x78,0x37,0xa2,0x99,0xa2,0x37,0x0f,0x39,0xb8,0x37,0x1d,0x29,0x70,0x37,0x49,0x30,0x88,0x37,0x29,0x56,0xc4,0x37,0x5c,0xc7,0x73,0x37,0x5a,0x86,0x28,0x37,0xb9,0x1a,0x89,0x37,0x19,0x6d,0x34,0x37,0x86,0xf1,0xb0,0x37,0xc2,0xbb,0xb5,0x37,0xb9,0xcc,0x9e,0x37,0x53,0xfc,0xc1,0x37,0x15,0x65,0xd7,0x37,0x36,0x53,0x84,0x37,0x11,0x3c,0x5f,0x37,0x21,0xdf,0xad,0x37,0xaa,0xa4,0xb3,0x37,0xf0,0x1d,0xc0,0x37,0x89,0x4d,0x9d,0x37,0x0b,0x3f,0x90,0x37,0xc7,0x60,0x0d,0x38,0x17,0xd5,0x62,0x37,0x79,0xf9,0x64,0x37,0x05,0xa7,0x9d,0x37,0xa4,0x54,0xb6,0x37,0xd5,0xd7,0x9a,0x37,0x6d,0x6c,0xa5,0x37,0xbc,0x04,0x84,0x37,0x26,0xd0,0xc6,0x37,0x27,0x4f,0xd9,0x37,0xe4,0x88,0x97,0x37,0xa0,0xb0,0x90,0x37,0xd0,0x8a,0x70,0x37,0x37,0x89,0x65,0x37,0xd0,0xed,0x84,0x37,0x51,0x5b,0x81,0x37,0xa1,0xcb,0xcf,0x37,0x50,0x99,0x89,0x37,0x06,0x12,0x98,0x37,0xb9,0x3c,0x46,0x37,0x79,0x62,0xc0,0x37,0x77,0x44,0xfd,0x37,0xe2,0x7a,0xc5,0x37,0xcd,0xd7,0x74,0x37,0xfe,0x0e,0x80,0x37,0xc2,0x16,0xbe,0x37,0xd8,0x0f,0x0f,0x38,0x06,0x17,0xd0,0x37,0x17,0xb5,0x7e,0x37,0xda,0x09,0x0d,0x38,0x12,0xbe,0x6c,0x37,0xae,0x7e,0xfe,0x37,0xc7,0xb0,0xe0,0x37,0x2b,0xdd,0xaf,0x37,0x8a,0xa2,0x86,0x37,0x71,0x66,0x13,0x38,0x3e,0x15,0x8b,0x37,0xd1,0x60,0xa3,0x37,0xd0,0xe7,0xf9,0x37,0xf3,0xcf,0xcb,0x37,0xc5,0x4b,0xa0,0x37,0x35,0xae,0xcb,0x37,0x37,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x33,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xd6,0x37,0xff,0xff,0x00,0x00,0x00,0x02,0x6c,0x0c,0x00,0x00,0x06,0x00,0x00,0x00,0x24,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x32,0x31,0xff,0xff,0x14,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xb0,0xe5,0x90,0x39,0xc1,0x92,0x2e,0x39,0x18,0xad,0xa1,0x39,0x8b,0xcb,0x3b,0x39,0x27,0xd9,0x0f,0x39,0xb2,0x7b,0x51,0x39,0x41,0xb1,0x05,0x39,0x4f,0x04,0x77,0x39,0xf3,0x6c,0x0f,0x39,0x3d,0xfc,0x77,0x39,0x70,0x73,0x25,0x39,0x99,0xd2,0x12,0x39,0x26,0xc1,0x33,0x39,0x8f,0x0b,0x33,0x39,0xae,0xe1,0x81,0x39,0xe4,0xf5,0x62,0x39,0x63,0x50,0x20,0x39,0x76,0x82,0x10,0x39,0xc6,0x80,0x65,0x39,0xf6,0x7d,0x54,0x39,0x0f,0x03,0x79,0x39,0x9b,0xef,0x4c,0x39,0xa1,0x12,0x48,0x39,0x23,0x63,0x51,0x39,0x52,0xcf,0x62,0x39,0x3c,0xff,0x24,0x39,0x9a,0xbd,0x33,0x39,0x89,0x8e,0x5a,0x39,0x53,0x05,0x71,0x39,0xe1,0x35,0x06,0x39,0x36,0x71,0x1b,0x39,0x3b,0x22,0x09,0x39,0x4e,0x59,0x17,0x39,0x51,0x6c,0x31,0x39,0xd2,0x94,0x46,0x39,0x15,0x9a,0x4c,0x39,0x68,0x27,0x85,0x39,0x57,0x9e,0x40,0x39,0xdd,0x3e,0x9e,0x39,0x05,0x2d,0x87,0x39,0x9b,0xb1,0x55,0x39,0x79,0x55,0x42,0x39,0x5e,0x90,0x21,0x39,0xa1,0x2a,0x2d,0x39,0xb0,0xa2,0x36,0x39,0x06,0x7a,0x40,0x39,0x00,0x86,0x4d,0x39,0x12,0xab,0x82,0x39,0x90,0xf3,0x3f,0x39,0xe0,0x70,0x2c,0x39,0x5b,0x73,0x27,0x39,0x54,0x38,0x23,0x39,0xf7,0xd0,0xff,0x38,0xbb,0x29,0x5e,0x39,0x1b,0xd5,0x83,0x39,0x4d,0xff,0x25,0x39,0x21,0xa7,0x28,0x39,0x92,0x5f,0x2c,0x39,0x55,0x77,0x76,0x39,0xc4,0x8a,0x09,0x39,0x5f,0xdc,0x3d,0x39,0xed,0xe2,0x8c,0x39,0xde,0x2b,0x44,0x39,0x36,0x74,0x9c,0x39,0xf6,0xe6,0x7d,0x39,0x15,0xad,0x6c,0x39,0x94,0x7b,0x23,0x39,0x21,0xda,0x65,0x39,0xf0,0xe6,0x51,0x39,0xb0,0xcd,0x54,0x39,0x93,0x79,0x19,0x39,0x8c,0x13,0x6c,0x39,0x9b,0x9e,0x26,0x39,0x2e,0xd8,0x37,0x39,0x2c,0x02,0x4e,0x39,0xe1,0x82,0x3b,0x39,0x80,0x97,0x14,0x39,0xb0,0x36,0x47,0x39,0x4b,0x5c,0x84,0x39,0xac,0xcb,0x38,0x39,0xad,0xc9,0x78,0x39,0x77,0x79,0x25,0x39,0x58,0x48,0x7a,0x39,0xb6,0x02,0x31,0x39,0x6a,0xcd,0x0b,0x39,0xde,0xf4,0x50,0x39,0xd2,0x52,0x83,0x39,0x30,0x2e,0x34,0x39,0x35,0x7c,0x59,0x39,0x2c,0x59,0x2f,0x39,0x3b,0x14,0x19,0x39,0xc2,0x49,0x26,0x39,0xea,0xbf,0x4c,0x39,0x64,0xb8,0x97,0x39,0xf3,0xb8,0x52,0x39,0xed,0xde,0x44,0x39,0xb5,0xb9,0x58,0x39,0x58,0x74,0x62,0x39,0x6f,0x38,0x1a,0x39,0x82,0x10,0x2f,0x39,0xf7,0xa6,0x60,0x39,0xd3,0xbd,0x6f,0x39,0x12,0xb3,0x3b,0x39,0xf1,0x46,0x42,0x39,0x72,0xd8,0x2c,0x39,0xd3,0x91,0x4e,0x39,0xaa,0x80,0x26,0x39,0x1b,0x95,0xff,0x38,0xf0,0xa8,0x69,0x39,0xcf,0x29,0x86,0x39,0xd1,0x23,0x1a,0x39,0xb6,0x2f,0x3a,0x39,0xa5,0x55,0x1e,0x39,0x17,0xcf,0x45,0x39,0x15,0x57,0xea,0x38,0xcf,0xbb,0x17,0x39,0x52,0xc3,0x44,0x39,0x2d,0x44,0x66,0x39,0x13,0x22,0x9e,0x39,0xa2,0x1f,0x2b,0x39,0x6d,0xac,0x57,0x39,0x06,0xa5,0x84,0x39,0x9f,0x2c,0x0f,0x39,0x2a,0xab,0x35,0x39,0x8c,0x72,0x49,0x39,0x73,0x53,0x4c,0x39,0xc6,0x1a,0x90,0x39,0xf9,0xa3,0x6c,0x39,0xa7,0xa9,0xac,0x39,0x5d,0x07,0x1c,0x39,0x75,0x46,0x21,0x39,0x4d,0xad,0x4a,0x39,0x23,0x7f,0x52,0x39,0x94,0x97,0x4b,0x39,0xab,0x86,0x17,0x39,0x15,0xa4,0x05,0x39,0xe3,0xce,0x1b,0x39,0xbb,0xe3,0xd9,0x38,0x55,0x62,0x1e,0x39,0x8e,0x3c,0x6c,0x39,0x92,0xd5,0x4d,0x39,0x33,0x73,0x81,0x39,0x98,0xce,0xb0,0x39,0x57,0xe4,0x25,0x39,0x59,0x1f,0x67,0x39,0x09,0x6b,0x77,0x39,0xbe,0xcc,0x52,0x39,0x30,0x00,0x5a,0x39,0x24,0x7f,0x5c,0x39,0x62,0x99,0x6e,0x39,0xa7,0xc8,0x44,0x39,0xd3,0x1c,0xf9,0x38,0xad,0xa2,0x8b,0x39,0x0b,0xe0,0x61,0x39,0x64,0xf5,0x25,0x39,0x56,0x0a,0x53,0x39,0x35,0x4a,0x47,0x39,0x0f,0x33,0x3c,0x39,0xc0,0xb1,0x34,0x39,0x24,0x11,0x6c,0x39,0x32,0x70,0x3c,0x39,0xfe,0x33,0x36,0x39,0xe7,0xbc,0xeb,0x38,0xba,0xd8,0x17,0x39,0x27,0x6b,0x5f,0x39,0xef,0x82,0x2d,0x39,0x34,0x5c,0x6a,0x39,0x8c,0x54,0x3b,0x39,0x44,0x16,0x3c,0x39,0x08,0x5b,0x78,0x39,0x20,0xb4,0xc1,0x39,0x49,0xb8,0x08,0x39,0x08,0xe9,0x63,0x39,0x4d,0x7b,0x49,0x39,0x0a,0x6c,0x2c,0x39,0x15,0x27,0x86,0x39,0x71,0xda,0x74,0x39,0xb1,0x10,0x18,0x39,0xa4,0x45,0x94,0x39,0x61,0x87,0x71,0x39,0x8c,0x1c,0x64,0x39,0x7a,0x1e,0x7b,0x39,0x7e,0xb6,0x36,0x39,0x2f,0x59,0x14,0x39,0xd5,0x70,0x1a,0x39,0x12,0xa8,0xc2,0x39,0xe5,0x23,0x80,0x39,0x73,0xd2,0x95,0x39,0xe4,0xe4,0x2c,0x39,0xc7,0x98,0x50,0x39,0xe2,0x0d,0x62,0x39,0xef,0xd1,0x22,0x39,0xc5,0xb5,0x05,0x39,0x7b,0x81,0x3b,0x39,0xe7,0xc4,0x00,0x39,0x93,0xcf,0x24,0x39,0xa4,0x08,0x18,0x39,0xa9,0xa7,0x5f,0x39,0x70,0xad,0x8b,0x39,0x8c,0xa8,0x7c,0x39,0x9e,0x62,0x85,0x39,0x26,0x5a,0x54,0x39,0xfc,0x19,0x0d,0x39,0x66,0x93,0x06,0x39,0x5c,0x72,0x7e,0x39,0xde,0x33,0xf3,0x38,0x1e,0x7d,0x42,0x39,0x73,0xfb,0x46,0x39,0x9a,0x5f,0x96,0x39,0x9c,0xf5,0x80,0x39,0x92,0x05,0x2a,0x39,0x64,0x49,0x2e,0x39,0xcf,0xb0,0x3c,0x39,0x6e,0x23,0x41,0x39,0x46,0xda,0x63,0x39,0xde,0x7d,0x7f,0x39,0x2c,0x55,0x5c,0x39,0xc0,0x05,0x29,0x39,0xdf,0xf3,0x44,0x39,0xba,0x41,0x06,0x39,0xe5,0x32,0x7a,0x39,0xee,0xf3,0x67,0x39,0x0c,0x2d,0x49,0x39,0xf7,0x67,0x7f,0x39,0x86,0x07,0x3b,0x39,0x94,0x91,0x50,0x39,0x8a,0xc6,0x32,0x39,0x20,0x3b,0x17,0x39,0x77,0xba,0x46,0x39,0x53,0xe6,0x58,0x39,0x2a,0x2e,0x9f,0x39,0x08,0x04,0x5a,0x39,0x02,0xc9,0x2c,0x39,0x9e,0x69,0x6e,0x39,0x42,0xac,0x92,0x39,0xb7,0xa2,0x17,0x39,0x1b,0x22,0x7f,0x39,0x59,0x99,0x24,0x39,0x8c,0xee,0x42,0x39,0x79,0xb6,0x2a,0x39,0x41,0xef,0x78,0x39,0xad,0x11,0x25,0x39,0x55,0x23,0x07,0x39,0x13,0xd7,0x38,0x39,0x6e,0xff,0x5f,0x39,0x80,0x41,0x7f,0x39,0x58,0xd1,0x52,0x39,0x4a,0x08,0x74,0x39,0x7a,0xa0,0x64,0x39,0xc1,0x91,0x66,0x39,0xbe,0x37,0x6e,0x39,0xb9,0xa4,0x32,0x39,0x67,0x88,0x00,0x39,0xb8,0xeb,0x56,0x39,0xec,0x29,0x15,0x39,0xec,0x57,0x40,0x39,0x3a,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x33,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x52,0x44,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0xca,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x33,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xf2,0x44,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0xcb,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x32,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x92,0x45,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x0c,0x00,0x00,0x08,0x00,0x00,0x00,0x20,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x4c,0xff,0xff,0x10,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x5e,0xab,0x58,0x38,0x1b,0x09,0x10,0x38,0x76,0x32,0x30,0x38,0xb8,0xde,0x27,0x38,0xe2,0x95,0x9b,0x38,0xac,0xeb,0x28,0x38,0x59,0xcd,0x7f,0x38,0xfb,0xe1,0x81,0x38,0x42,0x88,0x30,0x38,0x21,0x9e,0x49,0x38,0x15,0x51,0x46,0x38,0x57,0xbd,0x3e,0x38,0x2f,0xbe,0x17,0x38,0xdc,0x57,0x53,0x38,0xae,0xf1,0xa4,0x38,0x12,0xd3,0x64,0x38,0x91,0x27,0x7a,0x38,0xf3,0x6c,0x14,0x38,0x97,0x6f,0x4a,0x38,0x8b,0xcb,0x48,0x38,0x08,0xfb,0x82,0x38,0x3f,0x07,0x44,0x38,0xdb,0xb2,0x3a,0x38,0x27,0xbd,0x26,0x38,0xde,0xeb,0x56,0x38,0x6a,0x0a,0x7d,0x38,0x79,0x0c,0x58,0x38,0x98,0x0d,0x79,0x38,0x22,0x01,0x2f,0x38,0xaa,0x72,0x46,0x38,0x91,0x50,0x07,0x38,0xea,0xe2,0x68,0x38,0x14,0x55,0x53,0x38,0x32,0xe4,0x4b,0x38,0x9b,0x92,0x0f,0x38,0xf7,0xef,0x3c,0x38,0x62,0x4e,0xa8,0x38,0x67,0x90,0x3c,0x38,0x05,0xdf,0x14,0x38,0x3a,0x8e,0x7d,0x38,0x32,0x6c,0x7f,0x38,0x05,0x40,0x4b,0x38,0x85,0x4e,0x46,0x38,0xbe,0x73,0x26,0x38,0xf9,0x5d,0x36,0x38,0x8a,0x30,0x3d,0x38,0x3c,0x9b,0x2c,0x38,0x6a,0x3b,0x2c,0x38,0xe1,0x38,0x89,0x38,0xdf,0x1e,0x5c,0x38,0x11,0x07,0x4f,0x38,0x08,0x26,0x15,0x38,0x92,0x27,0x75,0x38,0xcf,0x76,0x3a,0x38,0x14,0x13,0x55,0x38,0x64,0x30,0x53,0x38,0x4d,0x19,0x75,0x38,0xea,0x65,0x3d,0x38,0xe5,0x0c,0x1d,0x38,0xc0,0xb7,0x4a,0x38,0x9f,0xc4,0x1c,0x38,0x38,0xae,0x72,0x38,0x00,0xba,0x11,0x38,0xc9,0xb0,0x54,0x38,0x51,0xb9,0x83,0x38,0x30,0xf6,0x57,0x38,0x2f,0x3b,0x4f,0x38,0xe4,0x2f,0x58,0x38,0x59,0xec,0x16,0x38,0xf4,0x06,0x4a,0x38,0x8e,0x81,0x41,0x38,0x30,0x10,0x40,0x38,0xb3,0xfd,0x95,0x38,0xa9,0xfa,0x49,0x38,0xcd,0x4f,0x45,0x38,0x48,0x3e,0x22,0x38,0x5b,0xb5,0x5e,0x38,0x80,0x22,0x44,0x38,0x02,0x38,0x78,0x38,0xfc,0x94,0xef,0x38,0xc1,0xab,0x95,0x38,0xfc,0x35,0x17,0x38,0xcd,0xd4,0x6d,0x38,0xa0,0xed,0xe6,0x37,0x17,0xfc,0x26,0x38,0x9a,0x2a,0xdd,0x37,0x00,0x2a,0x6e,0x38,0xc3,0xcf,0x97,0x38,0x4b,0x50,0x1a,0x38,0x34,0xe2,0x78,0x38,0x65,0x83,0x76,0x38,0xff,0xf5,0x8f,0x38,0x00,0x75,0x4c,0x38,0xed,0x8f,0x8a,0x38,0xa4,0x3f,0x6c,0x38,0x32,0x37,0x66,0x38,0xb9,0xa6,0x40,0x38,0x6f,0x8b,0x40,0x38,0xea,0x25,0x5f,0x38,0x8c,0xbb,0x52,0x38,0x1e,0x92,0x4d,0x38,0x64,0xda,0x51,0x38,0xb2,0xc2,0x16,0x38,0xa6,0x8a,0x2f,0x38,0x8b,0x23,0x58,0x38,0x9d,0x86,0x4c,0x38,0x39,0xd1,0x24,0x38,0x59,0x2d,0x2d,0x38,0xdd,0x33,0x92,0x38,0x39,0xe8,0x28,0x38,0xc6,0x34,0x57,0x38,0x16,0xd8,0x2d,0x38,0x44,0x45,0x63,0x38,0x12,0x10,0x9b,0x38,0xf7,0x0b,0x05,0x38,0xae,0x23,0x35,0x38,0xd5,0xd1,0x96,0x38,0xfd,0xf5,0x81,0x38,0x0b,0x99,0x71,0x38,0xd5,0xae,0x7e,0x38,0xb0,0x03,0x50,0x38,0xff,0x6c,0x70,0x38,0xbd,0xeb,0x23,0x38,0xce,0xd1,0x33,0x38,0x27,0xe9,0x3f,0x38,0x94,0xc7,0x39,0x38,0x1c,0x36,0x22,0x38,0xb0,0x96,0x37,0x38,0x2e,0x1b,0x24,0x38,0xa6,0x99,0x53,0x38,0x89,0x1b,0x3e,0x38,0x4d,0x3d,0x65,0x38,0x82,0xda,0x30,0x38,0x7f,0xe9,0x47,0x38,0xe8,0xd4,0xa1,0x38,0xc1,0x4b,0x2f,0x38,0x68,0x9d,0x48,0x38,0x62,0xfb,0x09,0x38,0xa7,0x96,0xff,0x37,0xb3,0x52,0x43,0x38,0x3f,0x5f,0x2a,0x38,0x08,0x03,0x76,0x38,0x11,0x90,0x2d,0x38,0xed,0x50,0x4f,0x38,0x46,0xf5,0x75,0x38,0x73,0xd3,0x8e,0x38,0x4a,0x4a,0x84,0x38,0xaf,0xdc,0x82,0x38,0x77,0xda,0x24,0x38,0x5e,0x8b,0x45,0x38,0x6e,0x38,0x4a,0x38,0x12,0x5b,0x3c,0x38,0x7c,0x27,0x68,0x38,0x77,0x4e,0x0f,0x38,0xb6,0x1d,0x5c,0x38,0xa2,0x68,0x9c,0x38,0x32,0x4e,0x5c,0x38,0xa4,0xeb,0x6b,0x38,0xfa,0x00,0x69,0x38,0xe1,0xb9,0x5a,0x38,0xe2,0xa4,0x57,0x38,0xb3,0x7c,0x4e,0x38,0xef,0x33,0x32,0x38,0x6b,0x57,0x08,0x38,0x25,0xf4,0x2b,0x38,0x26,0x3a,0x74,0x38,0xc7,0x13,0x74,0x38,0x1f,0x16,0x82,0x38,0x27,0x5f,0x21,0x38,0xbe,0x7b,0x7d,0x38,0x7b,0x58,0x98,0x38,0xe7,0x8b,0x95,0x38,0x4f,0xd2,0x3c,0x38,0xdb,0x19,0x3f,0x38,0x06,0xed,0x7d,0x38,0x75,0x64,0x2a,0x38,0xcf,0x6a,0x56,0x38,0x32,0x2a,0x39,0x38,0xb3,0xd9,0x4d,0x38,0x8f,0xe5,0x79,0x38,0x20,0xf9,0x4a,0x38,0x9b,0x1b,0x4f,0x38,0xa1,0xbf,0x9e,0x38,0xa5,0x73,0x3a,0x38,0x33,0xe8,0x34,0x38,0xbb,0x0b,0x3b,0x38,0x8b,0xbd,0x42,0x38,0xc6,0x6b,0x38,0x38,0x80,0x3c,0x52,0x38,0x18,0xd2,0x8b,0x38,0x2e,0x63,0x40,0x38,0x07,0x07,0x3d,0x38,0xb8,0x65,0x5a,0x38,0xa2,0x62,0x11,0x38,0x44,0x30,0x4b,0x38,0x7c,0xf0,0x4c,0x38,0x5b,0xf6,0x3d,0x38,0x2f,0x0b,0x84,0x38,0xc7,0xb6,0x77,0x38,0x7c,0x0e,0x82,0x38,0x3e,0x69,0x6a,0x38,0x80,0x1a,0x62,0x38,0x55,0x09,0x7f,0x38,0x05,0x5b,0x89,0x38,0xbf,0xa8,0x10,0x38,0xac,0x94,0x86,0x38,0x84,0xe1,0x39,0x38,0xcd,0xe1,0x6c,0x38,0x44,0xc8,0x6d,0x38,0xb5,0x9e,0x32,0x38,0xb0,0x68,0x71,0x38,0x58,0x21,0x1f,0x38,0x68,0x40,0x4a,0x38,0xb5,0x63,0x7e,0x38,0x51,0x7d,0x25,0x38,0x76,0x9f,0x4e,0x38,0xc6,0x16,0x7e,0x38,0x82,0x8f,0x41,0x38,0xbe,0x2b,0x58,0x38,0xe2,0x0c,0x5e,0x38,0xff,0xba,0x83,0x38,0xf0,0x81,0x99,0x38,0x97,0x78,0x4f,0x38,0x44,0x39,0x51,0x38,0x49,0xee,0x6f,0x38,0x32,0xce,0x0c,0x38,0x67,0x24,0x2f,0x38,0xde,0xb2,0x52,0x38,0xad,0x9c,0x36,0x38,0x03,0x36,0x23,0x38,0x55,0x22,0x60,0x38,0x68,0xd0,0x87,0x38,0x77,0x81,0x41,0x38,0x0b,0xc1,0x4c,0x38,0x41,0xfd,0x7a,0x38,0x32,0x30,0x24,0x38,0x0c,0xca,0x24,0x38,0xb9,0xa1,0x48,0x38,0x92,0x65,0x73,0x38,0x20,0x5f,0x55,0x38,0xdb,0xe4,0x2a,0x38,0x86,0x64,0x13,0x38,0x71,0x46,0x5a,0x38,0x3e,0x8c,0x96,0x38,0x09,0xa2,0x35,0x38,0x49,0x97,0x71,0x38,0x38,0xd5,0x4b,0x38,0xd9,0xfc,0x5a,0x38,0x7a,0xbd,0x73,0x38,0xba,0x91,0x8a,0x38,0xcc,0x88,0x54,0x38,0xaa,0xbe,0x3f,0x38,0x39,0xe4,0x2d,0x38,0x47,0x27,0x4a,0x38,0x22,0xc9,0x98,0x38,0x3c,0x45,0x93,0x38,0x37,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x32,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x06,0x52,0xff,0xff,0x00,0x00,0x00,0x02,0x6c,0x06,0x00,0x00,0x09,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x62,0x4b,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xaf,0xee,0x04,0x39,0x1a,0x2d,0xe1,0x38,0xcd,0x5c,0x4a,0x39,0x9e,0x09,0x23,0x39,0x24,0x90,0x63,0x39,0x5e,0x18,0xd8,0x38,0x4f,0x1f,0x02,0x39,0x8f,0x4d,0x25,0x39,0xb8,0x22,0xe3,0x38,0xbb,0xb9,0x51,0x39,0x64,0x85,0x10,0x39,0xfc,0xae,0xee,0x38,0x6d,0x49,0x23,0x39,0x77,0xdd,0x05,0x39,0xac,0xbd,0xfc,0x38,0xfc,0x0d,0x1b,0x39,0x8f,0xdc,0x65,0x39,0x40,0xf4,0x2c,0x39,0x34,0xb4,0x0b,0x39,0xc5,0x81,0x01,0x39,0xbe,0xfd,0x06,0x39,0x4c,0xa1,0xe8,0x38,0x53,0xb2,0x25,0x39,0xcb,0x38,0x0b,0x39,0x73,0x8a,0xce,0x38,0x69,0xdc,0x28,0x39,0x95,0x30,0x0e,0x39,0xee,0x53,0xdd,0x38,0x1a,0x2f,0x33,0x39,0xbf,0x3e,0x1e,0x39,0x45,0x1b,0x1e,0x39,0x12,0x7d,0x3e,0x39,0x16,0x99,0x24,0x39,0x2a,0xbc,0x36,0x39,0xa1,0x90,0x05,0x39,0xbe,0x5a,0x33,0x39,0x74,0x39,0x2d,0x39,0x1b,0xc8,0xbe,0x38,0x73,0xbe,0xda,0x38,0xff,0x96,0x5e,0x39,0xb8,0xdb,0xc5,0x38,0x08,0x9c,0x74,0x39,0x5c,0x88,0x46,0x39,0x2f,0x30,0x12,0x39,0xe2,0x1a,0xff,0x38,0xf5,0x05,0x12,0x39,0xd8,0x56,0xed,0x38,0xee,0xd7,0x53,0x39,0xf4,0x60,0xfa,0x38,0x44,0x47,0xfc,0x38,0x65,0x71,0xf3,0x38,0x7d,0x30,0xdc,0x38,0x8c,0xb8,0x2e,0x39,0x7a,0x16,0x40,0x39,0x1f,0x90,0x29,0x39,0xf5,0x2a,0x39,0x39,0x15,0x22,0xde,0x38,0x49,0x46,0x28,0x39,0x24,0x4d,0xc1,0x38,0x9a,0x81,0x05,0x39,0xb0,0xfd,0x31,0x39,0x87,0x96,0x35,0x39,0xfd,0x04,0x14,0x39,0x56,0x18,0xce,0x38,0xe7,0x38,0x04,0x39,0x89,0x3d,0x2d,0x39,0xad,0x29,0xe1,0x38,0x89,0x83,0x17,0x39,0xa7,0x0c,0x16,0x39,0x41,0x56,0x4d,0x39,0x04,0x5a,0x0f,0x39,0x6d,0x76,0xd5,0x38,0x6a,0xbd,0x03,0x39,0x8e,0x29,0xdd,0x38,0xa9,0x07,0x09,0x39,0x75,0x72,0x02,0x39,0x9b,0x42,0xb7,0x38,0x42,0x41,0x03,0x39,0xbc,0xb7,0x1e,0x39,0x2c,0xaa,0xf1,0x38,0xaf,0xed,0x1f,0x39,0x8c,0xe9,0x3d,0x39,0x4f,0xae,0x02,0x39,0xb3,0x70,0x19,0x39,0x78,0xa2,0x37,0x39,0xcf,0xbf,0x24,0x39,0x11,0x48,0x2a,0x39,0x88,0xc4,0x09,0x39,0xb8,0x9c,0x61,0x39,0x2a,0xbb,0x2d,0x39,0x4d,0x46,0xb3,0x38,0x2c,0xb1,0x2f,0x39,0x3b,0xb2,0x5c,0x39,0x68,0x02,0x0b,0x39,0xac,0x5f,0x0e,0x39,0x97,0x49,0x52,0x39,0x5b,0x3c,0xf5,0x38,0x9c,0x54,0x14,0x39,0xa5,0x79,0x19,0x39,0x05,0x86,0xf3,0x38,0x98,0xb5,0x4e,0x39,0xeb,0x2d,0x65,0x39,0x64,0xe8,0x74,0x39,0x2c,0xf8,0xf9,0x38,0x76,0x51,0x20,0x39,0x6d,0xf2,0xf9,0x38,0x23,0xa2,0x4d,0x39,0xb9,0xfe,0x14,0x39,0xcc,0x69,0x09,0x39,0xa2,0x12,0x85,0x39,0x09,0x0a,0x39,0x39,0xc0,0xa2,0xf4,0x38,0x3e,0x22,0x19,0x39,0xa1,0x25,0x0e,0x39,0x1b,0xf8,0x13,0x39,0x19,0x29,0x16,0x39,0xa0,0x37,0x5e,0x39,0x24,0x0b,0x1c,0x39,0x9d,0x0b,0xce,0x38,0x1b,0x8f,0xe9,0x38,0xd7,0x0e,0x26,0x39,0x18,0x13,0xc2,0x38,0x5a,0xb2,0x07,0x39,0xe5,0xa3,0x74,0x39,0x15,0x8b,0x99,0x38,0x37,0xae,0xfe,0x38,0x85,0x31,0x53,0x39,0x73,0x9b,0x49,0x39,0x3a,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x32,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x82,0x58,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0xdf,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x32,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x22,0x59,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0xdf,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x31,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xc2,0x59,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x06,0x00,0x00,0x0b,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x60,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x69,0x47,0x9f,0x38,0x5b,0xf0,0x8b,0x38,0xaa,0xcd,0x9a,0x38,0x40,0x1d,0x5d,0x38,0x15,0xe3,0x78,0x38,0xdb,0x22,0x2f,0x38,0xb7,0xfc,0x7c,0x38,0x05,0xdd,0x4b,0x38,0x70,0xd6,0x56,0x38,0xfd,0x3d,0x4a,0x38,0x70,0xb2,0x4d,0x38,0x21,0xe6,0x7e,0x38,0x51,0xa8,0x8b,0x38,0x00,0x8f,0x43,0x38,0x02,0xd3,0x73,0x38,0x4c,0x13,0x44,0x38,0x1e,0x6c,0xa3,0x38,0xa9,0x97,0x88,0x38,0x5b,0x0c,0x3e,0x38,0xf6,0x0a,0x6a,0x38,0x1a,0x32,0x71,0x38,0x05,0xfb,0x42,0x38,0x7d,0x9d,0x57,0x38,0x1e,0x05,0x7c,0x38,0x9b,0x6e,0x9b,0x38,0xe5,0x57,0x55,0x38,0x15,0xcd,0x74,0x38,0x79,0xb9,0x82,0x38,0x9a,0x43,0x30,0x38,0xa6,0xd0,0x75,0x38,0xba,0x21,0x79,0x38,0x85,0x96,0x5f,0x38,0x89,0xcb,0x5d,0x38,0xee,0xb0,0x90,0x38,0x39,0xf4,0x8c,0x38,0x98,0xf8,0x3a,0x38,0x85,0x5f,0x65,0x38,0x93,0x54,0x39,0x38,0xf6,0xa8,0x77,0x38,0xb8,0xa7,0x58,0x38,0x38,0x90,0x54,0x38,0x66,0x29,0x8a,0x38,0xbb,0xbe,0x59,0x38,0x69,0x3f,0x85,0x38,0x96,0x0d,0xaa,0x38,0x2b,0x8d,0x98,0x38,0x0b,0x19,0x57,0x38,0x14,0x47,0x7c,0x38,0xe1,0x06,0x91,0x38,0xaa,0x54,0x72,0x38,0xaa,0x43,0x4b,0x38,0x24,0x3a,0x55,0x38,0xad,0xc2,0x45,0x38,0x38,0xd2,0x6c,0x38,0x21,0x95,0x43,0x38,0xd6,0x2d,0x5f,0x38,0x6b,0x28,0xaa,0x38,0x59,0xf8,0x56,0x38,0x3d,0xa1,0x72,0x38,0xcf,0x5e,0x46,0x38,0x98,0x72,0x64,0x38,0x59,0xb0,0x82,0x38,0x93,0x97,0x89,0x38,0x94,0x0b,0x71,0x38,0x68,0x1e,0x9e,0x38,0x4f,0x79,0x6b,0x38,0x64,0x7c,0x71,0x38,0x5c,0x15,0x69,0x38,0x5c,0x37,0x82,0x38,0xbb,0x01,0x5e,0x38,0x38,0x98,0x3c,0x38,0x40,0xc6,0x59,0x38,0xa7,0x14,0x57,0x38,0xa7,0xad,0x8f,0x38,0x1a,0xc8,0x51,0x38,0x30,0x3a,0x6b,0x38,0x18,0xbd,0x2f,0x38,0x27,0x7e,0x34,0x38,0x24,0xe2,0x84,0x38,0x5c,0x2c,0x74,0x38,0xfd,0xc7,0xc2,0x38,0xe7,0xfd,0xb9,0x38,0x1a,0x1c,0x75,0x38,0x07,0x09,0x86,0x38,0x1b,0x05,0x4b,0x38,0x4f,0xc3,0x5a,0x38,0xbc,0x2c,0x36,0x38,0x17,0x0d,0x45,0x38,0xb3,0x8a,0x92,0x38,0x30,0x8f,0x94,0x38,0x79,0xf2,0x53,0x38,0x2c,0x41,0x95,0x38,0x57,0x91,0x8f,0x38,0x46,0x02,0x4b,0x38,0xd0,0xaa,0x2d,0x38,0xe4,0x49,0x5a,0x38,0xf2,0xaa,0x37,0x38,0x02,0x5e,0x5a,0x38,0x30,0x54,0x40,0x38,0x44,0xbc,0xb3,0x38,0xe7,0x64,0x79,0x38,0xe5,0x9f,0x78,0x38,0x9c,0x06,0x88,0x38,0x2d,0x40,0x77,0x38,0x82,0x16,0x2f,0x38,0xce,0xd7,0x8c,0x38,0x11,0x5a,0x54,0x38,0xa5,0x49,0x8a,0x38,0xa3,0x55,0x6f,0x38,0x39,0xb9,0x4d,0x38,0xcb,0x17,0x85,0x38,0x20,0xec,0x5f,0x38,0xe8,0x9c,0x7f,0x38,0x12,0xe5,0x55,0x38,0xcc,0xb5,0x6b,0x38,0xc3,0xa4,0x6c,0x38,0x2e,0x80,0x87,0x38,0xb6,0x54,0x47,0x38,0xfd,0x78,0x88,0x38,0xca,0x4d,0x62,0x38,0x88,0x90,0x74,0x38,0xf6,0xe1,0x42,0x38,0x0b,0x9f,0x55,0x38,0xfb,0xe5,0x94,0x38,0x2c,0x57,0x49,0x38,0x58,0xdf,0x76,0x38,0x7f,0x56,0x9a,0x38,0x80,0x6d,0x6d,0x38,0x37,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x31,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x36,0x60,0xff,0xff,0x00,0x00,0x00,0x02,0x6c,0x06,0x00,0x00,0x13,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x92,0x59,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xa6,0x5d,0x16,0x39,0x80,0xca,0x26,0x39,0x1d,0x38,0x4e,0x39,0x85,0x11,0x0e,0x39,0x7a,0xb2,0xf1,0x38,0xe4,0x71,0xf9,0x38,0xf8,0xbb,0x22,0x39,0x83,0xfe,0x50,0x39,0xa7,0x56,0x2a,0x39,0x64,0xa7,0x64,0x39,0xc3,0x88,0x5f,0x39,0xe8,0x19,0x12,0x39,0x73,0xa6,0x46,0x39,0x32,0xc1,0x7c,0x39,0xfc,0x05,0x25,0x39,0x2c,0x83,0xdd,0x38,0x09,0x83,0x3f,0x39,0x1a,0xee,0xf2,0x38,0xca,0x53,0xff,0x38,0x98,0xc7,0x8a,0x38,0x3c,0x4e,0x0a,0x39,0xbb,0xe2,0x2a,0x39,0x73,0x31,0xa6,0x38,0xba,0x18,0x16,0x39,0x16,0x5c,0x26,0x39,0x16,0x0f,0x23,0x39,0x9d,0x2c,0x7a,0x39,0xed,0x6f,0x80,0x39,0xfd,0xae,0x61,0x39,0xb5,0xd3,0x56,0x39,0x52,0xe0,0xaa,0x38,0x71,0x4c,0x34,0x39,0x86,0x28,0x3a,0x39,0xff,0xb9,0x3d,0x39,0x86,0x87,0xff,0x38,0x5b,0xb7,0x33,0x39,0x6e,0x8a,0xdc,0x38,0xd8,0xfa,0x17,0x39,0xfa,0x05,0x9b,0x39,0x54,0x55,0x03,0x39,0x2e,0x3e,0x38,0x39,0x55,0xe2,0x58,0x39,0x6b,0x3d,0x7a,0x39,0xa9,0xf1,0x01,0x39,0xc4,0x32,0xd8,0x38,0x2f,0xa2,0xe2,0x38,0x64,0x41,0x24,0x39,0x74,0x1a,0x21,0x39,0x02,0x5f,0x36,0x39,0x27,0x2b,0x03,0x39,0xfc,0xdf,0xf0,0x38,0x63,0xa1,0x31,0x39,0x45,0x79,0x16,0x39,0xd8,0x1d,0x39,0x39,0x72,0x33,0x1b,0x39,0xe9,0x8d,0x85,0x39,0xcd,0xf4,0x07,0x39,0x30,0x96,0x60,0x39,0x2d,0x4a,0x36,0x39,0x73,0xac,0x17,0x39,0x8f,0x96,0x04,0x39,0xe0,0xe9,0x14,0x39,0x02,0xd8,0x74,0x39,0xd3,0x31,0x3b,0x39,0xc6,0x17,0x61,0x39,0x47,0xbf,0x00,0x39,0x3b,0x76,0xf1,0x38,0x1b,0x81,0xeb,0x38,0xd8,0xf2,0xf8,0x38,0xbd,0xd6,0x2a,0x39,0x99,0x29,0x23,0x39,0xa7,0x7a,0x10,0x39,0x7d,0x22,0x30,0x39,0x9b,0xd2,0xf2,0x38,0xfd,0x0b,0x16,0x39,0x88,0xd2,0x14,0x39,0x0c,0x47,0x46,0x39,0x25,0x27,0x35,0x39,0xed,0xda,0x4c,0x39,0x61,0xa7,0x3d,0x39,0x47,0xde,0xfb,0x38,0x92,0x79,0xf0,0x38,0x33,0x22,0x1d,0x39,0xe0,0x77,0xb5,0x38,0xcc,0x41,0x13,0x39,0x32,0xe3,0x24,0x39,0xef,0xfb,0x3c,0x39,0x18,0x5d,0x89,0x39,0xed,0xb6,0x31,0x39,0x80,0xf8,0xdc,0x38,0xde,0xc0,0x61,0x39,0xab,0x1b,0x1d,0x39,0xd7,0xde,0x3a,0x39,0x2b,0xa0,0x80,0x39,0x9b,0xbf,0x6f,0x39,0xa3,0x07,0x82,0x39,0x11,0xa3,0x68,0x39,0x0d,0x4d,0x28,0x39,0x37,0xf5,0xe5,0x38,0xe2,0x07,0x1d,0x39,0x22,0xe9,0x2b,0x39,0x64,0x6d,0xdc,0x38,0xe7,0xfb,0x96,0x38,0xa9,0x83,0x2e,0x39,0xce,0x74,0x31,0x39,0xa4,0xab,0x71,0x39,0xf6,0xbc,0x3b,0x39,0xb8,0x99,0x7f,0x39,0xa7,0xd0,0x18,0x39,0x3b,0x6e,0x5f,0x39,0x35,0x63,0xd0,0x38,0x92,0xbf,0xf0,0x38,0x99,0x14,0x40,0x39,0x36,0xed,0x0d,0x39,0x67,0x31,0x17,0x39,0x3e,0x94,0x28,0x39,0x57,0x94,0x17,0x39,0x1e,0x64,0x11,0x39,0x73,0x4a,0x72,0x39,0xa7,0xf6,0x39,0x39,0x73,0xd8,0x35,0x39,0xc5,0x95,0x1a,0x39,0x01,0xa4,0x07,0x39,0x15,0x2b,0x2f,0x39,0xcf,0xa3,0x5c,0x39,0x98,0xfc,0x71,0x39,0x66,0xc2,0x88,0x39,0xc0,0xba,0x55,0x39,0x3a,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x31,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xb2,0x66,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0xed,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x31,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x52,0x67,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0xed,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x30,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xf2,0x67,0xff,0xff,0x00,0x00,0x00,0x02,0x64,0x06,0x00,0x00,0x46,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x74,0x6e,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0f,0xdb,0x81,0x38,0x9a,0x27,0x6e,0x38,0xf4,0x34,0x6d,0x38,0xd5,0x59,0x5c,0x38,0xfa,0x44,0x57,0x38,0x7d,0xe6,0x46,0x38,0xc9,0xad,0x3f,0x38,0xcc,0x17,0x2a,0x38,0xc3,0x1f,0x69,0x38,0x5a,0x69,0x85,0x38,0xa7,0xd6,0xad,0x38,0xd1,0x8d,0x8a,0x38,0x68,0xae,0x66,0x38,0xeb,0xdf,0x6a,0x38,0x20,0x8b,0x56,0x38,0x3c,0x9c,0x91,0x38,0x20,0xc1,0x8e,0x38,0x56,0x75,0x5d,0x38,0xb0,0x8a,0x82,0x38,0xd1,0xe7,0x87,0x38,0xa7,0xbf,0x82,0x38,0x8b,0xf8,0xa1,0x38,0x6e,0x1e,0x6c,0x38,0xbb,0x19,0x7f,0x38,0x32,0xb7,0x7a,0x38,0xb2,0x5a,0x75,0x38,0x36,0x30,0xaa,0x38,0x09,0x83,0x67,0x38,0x76,0x02,0x91,0x38,0x95,0x5a,0x7b,0x38,0xc1,0xa1,0x55,0x38,0x6a,0x3e,0x3d,0x38,0x67,0xf7,0x6f,0x38,0x32,0x6e,0x40,0x38,0x0f,0x3a,0x86,0x38,0xb5,0xd7,0x7d,0x38,0x6c,0xfd,0xa5,0x38,0x24,0xfa,0x7b,0x38,0x47,0x81,0x70,0x38,0xad,0x65,0x65,0x38,0xa2,0xce,0x83,0x38,0x27,0xa2,0x62,0x38,0x6d,0x47,0x6b,0x38,0x82,0x04,0x3a,0x38,0x52,0x8e,0x69,0x38,0xfc,0x53,0x45,0x38,0x77,0x70,0x61,0x38,0xc8,0xc8,0x95,0x38,0x9b,0x83,0x5f,0x38,0x95,0xb5,0x9d,0x38,0x71,0x60,0x6c,0x38,0x49,0x40,0xa6,0x38,0x6a,0x26,0x80,0x38,0x89,0x76,0x4b,0x38,0x7a,0xdd,0x87,0x38,0x01,0x7e,0x90,0x38,0x12,0xd1,0x73,0x38,0x62,0x7a,0x8e,0x38,0xf4,0xd6,0x6a,0x38,0x8b,0xd9,0x4a,0x38,0x41,0x51,0x3c,0x38,0xf6,0x05,0x3a,0x38,0xa1,0x01,0x81,0x38,0x43,0x13,0x72,0x38,0x92,0x81,0x94,0x38,0x70,0x8b,0x6d,0x38,0x18,0xc6,0x71,0x38,0x80,0xd6,0xa2,0x38,0x1f,0xdb,0xae,0x38,0xb3,0x44,0xd1,0x38,0xde,0x33,0x3f,0x38,0x51,0xf0,0x3c,0x38,0xbe,0x68,0x6d,0x38,0xf0,0xc2,0x30,0x38,0x8b,0x96,0x84,0x38,0xcf,0x4e,0x6d,0x38,0x39,0xcb,0x4c,0x38,0x64,0xf9,0x32,0x38,0x90,0x6f,0x3f,0x38,0xa0,0xd9,0x65,0x38,0x2d,0x33,0x74,0x38,0x8f,0x61,0x5b,0x38,0xc8,0xcb,0x80,0x38,0x9e,0x5d,0x4b,0x38,0xb8,0x83,0x97,0x38,0x2a,0x05,0x96,0x38,0xfc,0x2b,0x6a,0x38,0xb6,0x3f,0x36,0x38,0x50,0x70,0x6a,0x38,0x52,0xfe,0x64,0x38,0xd2,0x09,0x6d,0x38,0x2a,0x53,0x9e,0x38,0x4c,0x99,0x8c,0x38,0xac,0x4d,0x94,0x38,0x6f,0x65,0xa6,0x38,0xe0,0xc6,0x83,0x38,0x24,0xb7,0x8a,0x38,0x5e,0x02,0x74,0x38,0xdb,0xbe,0x4d,0x38,0x1b,0x8b,0x43,0x38,0xa1,0x86,0x2b,0x38,0x67,0x24,0x89,0x38,0xd5,0x4c,0x40,0x38,0x30,0xf2,0x4b,0x38,0x8c,0xf6,0x63,0x38,0x3d,0x68,0x78,0x38,0x64,0x47,0x98,0x38,0xde,0xaa,0x66,0x38,0x2f,0x29,0x6a,0x38,0xa3,0x0e,0x50,0x38,0x4a,0xd1,0x53,0x38,0xa1,0xd8,0x62,0x38,0xfc,0x95,0x84,0x38,0x64,0x6e,0x9d,0x38,0x4f,0xa2,0x8d,0x38,0x03,0xbe,0x80,0x38,0xa1,0x5f,0x55,0x38,0x43,0x55,0x71,0x38,0xb5,0xef,0x5b,0x38,0x94,0x43,0x5e,0x38,0x31,0x5b,0x77,0x38,0x32,0xe8,0x61,0x38,0x0c,0x74,0x53,0x38,0x7a,0xe4,0x5f,0x38,0x62,0xdf,0x51,0x38,0x23,0x25,0x99,0x38,0x17,0xd0,0x64,0x38,0x62,0xd0,0x68,0x38,0x37,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x30,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x66,0x6e,0xff,0xff,0x00,0x00,0x00,0x02,0x6c,0x06,0x00,0x00,0x16,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xc2,0x67,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x8d,0xb4,0x0a,0x39,0x7e,0xcb,0x12,0x39,0x18,0x65,0x2f,0x39,0x96,0xaa,0x18,0x39,0x5e,0xca,0x1c,0x39,0x2f,0x14,0x37,0x39,0x40,0x9c,0x08,0x39,0x42,0x07,0x23,0x39,0x7b,0xbd,0x1c,0x39,0x0f,0xa2,0xf1,0x38,0xeb,0x75,0x25,0x39,0xb6,0x10,0x4c,0x39,0x1e,0x2c,0x31,0x39,0x98,0xa3,0x48,0x39,0xfa,0x46,0x7a,0x39,0xaa,0xdf,0xd6,0x38,0xff,0xec,0x4e,0x39,0x8f,0xac,0x3e,0x39,0x94,0x6b,0x02,0x39,0xfd,0xcc,0xf7,0x38,0x71,0x65,0x42,0x39,0x9a,0x8d,0x17,0x39,0x2a,0x92,0xb3,0x38,0x2a,0x7d,0x27,0x39,0x7d,0x6a,0x6f,0x39,0xd8,0xce,0xda,0x38,0x2a,0x54,0x0b,0x39,0x05,0x96,0x05,0x39,0xef,0x61,0x2b,0x39,0xe2,0x57,0x75,0x39,0x3b,0x78,0x2c,0x39,0xbe,0x24,0xb6,0x38,0x8b,0xca,0x46,0x39,0x11,0x3f,0x42,0x39,0x03,0x1c,0x14,0x39,0x3f,0x96,0x8c,0x39,0x53,0xac,0x00,0x39,0x20,0x71,0x35,0x39,0x29,0x32,0x53,0x39,0x8e,0x91,0xfc,0x38,0xb9,0xf3,0x29,0x39,0x2f,0xed,0xde,0x38,0x52,0x28,0x5a,0x39,0xb4,0x10,0x82,0x39,0xd9,0xdb,0x42,0x39,0x26,0xb8,0xd0,0x38,0xd1,0x22,0x22,0x39,0x73,0xda,0x13,0x39,0x23,0x11,0x55,0x39,0x4d,0xd7,0xce,0x38,0x7c,0x2d,0x29,0x39,0xa2,0x76,0x3a,0x39,0x30,0x7f,0x45,0x39,0x36,0x9d,0x29,0x39,0x49,0x0c,0xd5,0x38,0x70,0x44,0x30,0x39,0x4f,0x38,0xec,0x38,0x3f,0x3d,0xb5,0x38,0xbf,0x25,0x33,0x39,0x12,0xd7,0xbd,0x38,0xc6,0x3e,0xd0,0x38,0x9e,0xdd,0x25,0x39,0x5d,0x82,0x93,0x39,0x3c,0x1b,0x19,0x39,0xe8,0xcc,0xf0,0x38,0x73,0x56,0x38,0x39,0xbe,0x5c,0xf0,0x38,0x7f,0x48,0x30,0x39,0x02,0xed,0x57,0x39,0x6d,0x10,0x1d,0x39,0x94,0xbf,0x21,0x39,0x89,0x6e,0x5e,0x39,0x52,0x37,0x01,0x39,0x36,0x31,0xb7,0x38,0x09,0xc4,0xec,0x38,0x1d,0xcd,0x17,0x39,0xb8,0xd1,0xd2,0x38,0x14,0x86,0x03,0x39,0x0f,0xd3,0xc9,0x38,0x0a,0x46,0x03,0x39,0xa7,0xb6,0x1f,0x39,0x91,0x21,0xfc,0x38,0x47,0x19,0x61,0x39,0x33,0x5a,0x0f,0x39,0x3e,0x5c,0xb4,0x38,0xb6,0x11,0x22,0x39,0xf3,0x79,0x61,0x39,0xd8,0x00,0x6c,0x39,0x67,0xe8,0x30,0x39,0x41,0xd7,0x8a,0x39,0xff,0x16,0x1f,0x39,0x75,0x6b,0x28,0x39,0xe4,0x57,0x40,0x39,0x82,0xef,0xdb,0x38,0x8c,0x69,0xa0,0x39,0xc2,0xb9,0x40,0x39,0x04,0xc8,0x83,0x39,0xce,0xdd,0x0e,0x39,0x4d,0xa8,0xee,0x38,0xea,0xbf,0x24,0x39,0xfe,0x8e,0x10,0x39,0x17,0x94,0xe9,0x38,0x38,0x42,0xaa,0x38,0x87,0x5e,0x37,0x39,0xa7,0xe2,0xd0,0x38,0xa6,0x2c,0x21,0x39,0xd0,0xeb,0x41,0x39,0x59,0x17,0x5a,0x39,0x15,0xe7,0x8c,0x39,0xf4,0xde,0x67,0x39,0x58,0x8c,0x2d,0x39,0x5c,0x8e,0x1b,0x39,0x9a,0xe9,0xe6,0x38,0xa4,0xe6,0x29,0x39,0x3c,0x34,0x0a,0x39,0x7c,0x46,0xcb,0x38,0xe7,0x15,0x28,0x39,0xa1,0x03,0x35,0x39,0xa3,0x8a,0x20,0x39,0x05,0xe8,0xf2,0x38,0x61,0xcf,0xbb,0x38,0xc6,0x8a,0x13,0x39,0x4d,0xb1,0x41,0x39,0x3f,0x33,0x38,0x39,0xac,0x8c,0x5d,0x39,0xa1,0x08,0xc6,0x38,0x12,0x0e,0x39,0x39,0x79,0x73,0x3a,0x39,0x3a,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x30,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xe2,0x74,0xff,0xff,0x00,0x00,0x00,0x09,0x84,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0xfb,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x30,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x82,0x75,0xff,0xff,0x00,0x00,0x00,0x09,0x78,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0xfc,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x30,0x2f,0x52,0x65,0x6c,0x75,0x36,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x16,0x76,0xff,0xff,0x00,0x00,0x00,0x02,0xc0,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x72,0x6f,0xff,0xff,0x54,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x8c,0x89,0x06,0x39,0x3a,0xd9,0x5a,0x39,0xb1,0xe4,0xc7,0x37,0x81,0xa6,0xd6,0x37,0x69,0xc0,0xbd,0x38,0xcd,0xb7,0x99,0x39,0xeb,0x2f,0x15,0x39,0x7f,0xee,0x0e,0x37,0x2c,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x30,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xe6,0x76,0xff,0xff,0x00,0x00,0x00,0x02,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4c,0x6f,0x67,0x69,0x74,0x73,0x2f,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x53,0x71,0x75,0x65,0x65,0x7a,0x65,0x5f,0x73,0x68,0x61,0x70,0x65,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3a,0x77,0xff,0xff,0x00,0x00,0x00,0x09,0x74,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0xfd,0xff,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x73,0x1b,0x4d,0x3c,0x01,0x00,0x00,0x00,0xce,0xb0,0xcc,0x3f,0x01,0x00,0x00,0x00,0xe2,0xeb,0xcb,0xbf,0x21,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4c,0x6f,0x67,0x69,0x74,0x73,0x2f,0x53,0x70,0x61,0x74,0x69,0x61,0x6c,0x53,0x71,0x75,0x65,0x65,0x7a,0x65,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xc2,0x77,0xff,0xff,0x00,0x00,0x00,0x09,0x74,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x7e,0xff,0xff,0x20,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xe5,0xd6,0xbf,0x3a,0x4a,0xd6,0xb6,0x3a,0x2d,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4c,0x6f,0x67,0x69,0x74,0x73,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x63,0x5f,0x31,0x78,0x31,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x52,0x78,0xff,0xff,0x00,0x00,0x00,0x02,0x70,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x7e,0xff,0xff,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xef,0x7a,0xe4,0x37,0x28,0xc2,0xd9,0x37,0x2c,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4c,0x6f,0x67,0x69,0x74,0x73,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x63,0x5f,0x31,0x78,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x5f,0x62,0x69,0x61,0x73,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xd2,0x78,0xff,0xff,0x00,0x00,0x00,0x09,0x78,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x73,0x1b,0x4d,0x3c,0x01,0x00,0x00,0x00,0xce,0xb0,0xcc,0x3f,0x01,0x00,0x00,0x00,0xe2,0xeb,0xcb,0xbf,0x28,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4c,0x6f,0x67,0x69,0x74,0x73,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x63,0x5f,0x31,0x78,0x31,0x2f,0x42,0x69,0x61,0x73,0x41,0x64,0x64,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x66,0x79,0xff,0xff,0x00,0x00,0x00,0x09,0x80,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x14,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x0c,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x98,0x72,0x98,0x3c,0x01,0x00,0x00,0x00,0x25,0xda,0x97,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x4c,0x6f,0x67,0x69,0x74,0x73,0x2f,0x41,0x76,0x67,0x50,0x6f,0x6f,0x6c,0x5f,0x31,0x61,0x2f,0x41,0x76,0x67,0x50,0x6f,0x6f,0x6c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x7a,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x06,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x84,0x80,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x30,0x9c,0x0e,0x3b,0xed,0x44,0x38,0x3b,0xef,0x56,0x12,0x3b,0xe5,0xb8,0x28,0x3b,0x2f,0x6a,0x09,0x3b,0x71,0xb8,0x6c,0x3b,0x85,0xba,0x2e,0x3b,0x52,0x4d,0x47,0x3b,0x02,0x8d,0x10,0x3b,0xa9,0xd9,0x49,0x3b,0xbe,0x2b,0x3c,0x3b,0x25,0x16,0x38,0x3b,0xdc,0x9e,0x08,0x3b,0xaf,0xb6,0x28,0x3b,0x9d,0x44,0x2b,0x3b,0x68,0xf5,0xe8,0x3a,0xd1,0x70,0x1a,0x3b,0x56,0x82,0x0d,0x3b,0x47,0x46,0xea,0x3a,0x30,0x72,0x49,0x3b,0xc3,0x5d,0x2a,0x3b,0x3f,0x67,0x2b,0x3b,0x9d,0x51,0x1b,0x3b,0x92,0x11,0x0b,0x3b,0x6e,0x69,0xf6,0x3a,0x8b,0x3d,0x83,0x3b,0xfb,0x6e,0x01,0x3b,0xd5,0xf8,0x66,0x3b,0x88,0x00,0x80,0x3b,0x9e,0xe9,0x31,0x3b,0x6e,0xf6,0x27,0x3b,0x3d,0x53,0x54,0x3b,0x57,0xc0,0x4a,0x3b,0x93,0x70,0x13,0x3b,0x06,0x3b,0x42,0x3b,0xca,0x69,0x08,0x3b,0x62,0x80,0x3c,0x3b,0x94,0x95,0x2d,0x3b,0x88,0xf2,0x0d,0x3b,0x67,0xd3,0x50,0x3b,0x47,0x89,0x4c,0x3b,0xb2,0x55,0x53,0x3b,0xf9,0x44,0x11,0x3b,0xbd,0xf8,0x26,0x3b,0x03,0x35,0x0c,0x3b,0xfc,0x0b,0x0e,0x3b,0x3a,0x04,0x3b,0x3b,0xeb,0x60,0x26,0x3b,0x3d,0xd3,0x32,0x3b,0x65,0x8f,0x34,0x3b,0xe0,0xd2,0x1a,0x3b,0xa5,0x42,0x2a,0x3b,0x6f,0x61,0x46,0x3b,0x12,0xdf,0x30,0x3b,0x07,0x37,0x45,0x3b,0x9e,0x57,0x49,0x3b,0xed,0xc9,0x2a,0x3b,0xc1,0xe5,0x07,0x3b,0xe6,0x5c,0x27,0x3b,0x18,0xf4,0x2c,0x3b,0x7b,0xbc,0x1e,0x3b,0x5b,0x2a,0x25,0x3b,0x8b,0xd3,0x0a,0x3b,0xd6,0xf9,0x32,0x3b,0x3b,0xe3,0x4a,0x3b,0xc3,0x1c,0x2a,0x3b,0x06,0xcc,0x39,0x3b,0xb5,0xa6,0x32,0x3b,0x58,0x1d,0x0c,0x3b,0x0d,0x63,0x30,0x3b,0x98,0x15,0x67,0x3b,0x2b,0x29,0x0e,0x3b,0xeb,0x95,0x29,0x3b,0x68,0x2e,0x2c,0x3b,0x64,0xc2,0x79,0x3b,0x5d,0x60,0x5d,0x3b,0x77,0xc4,0x29,0x3b,0x11,0x87,0x41,0x3b,0x7e,0x0c,0x35,0x3b,0x48,0x2f,0x31,0x3b,0x48,0xef,0x35,0x3b,0xd9,0xfe,0x25,0x3b,0xa7,0xd7,0x48,0x3b,0xe3,0xde,0x48,0x3b,0x93,0xa5,0x26,0x3b,0x26,0xfc,0x12,0x3b,0x98,0xd4,0x16,0x3b,0x3e,0x8e,0x27,0x3b,0xb2,0x5e,0x56,0x3b,0xd3,0xb3,0x58,0x3b,0xc5,0x71,0x6c,0x3b,0xb0,0x7b,0x46,0x3b,0x77,0x95,0x1e,0x3b,0x3a,0xde,0x2f,0x3b,0x08,0xfc,0x24,0x3b,0x0a,0xd5,0x24,0x3b,0x41,0xf5,0x15,0x3b,0x87,0x3b,0x48,0x3b,0x06,0x23,0x0a,0x3b,0x94,0x19,0x36,0x3b,0x95,0xbe,0x29,0x3b,0x77,0x69,0x14,0x3b,0xa8,0xa7,0x1f,0x3b,0x80,0x1e,0x18,0x3b,0x05,0x08,0x41,0x3b,0xf7,0x8d,0x1d,0x3b,0x79,0xcb,0x36,0x3b,0xde,0xad,0x0e,0x3b,0xa8,0x21,0x14,0x3b,0xdb,0xf9,0x06,0x3b,0x43,0x2a,0x81,0x3b,0xc1,0x11,0x16,0x3b,0x01,0xcd,0x76,0x3b,0x47,0x0f,0x44,0x3b,0xa1,0x1b,0xf6,0x3a,0x4f,0xcf,0x1f,0x3b,0xfb,0xf6,0x15,0x3b,0x37,0xac,0x1f,0x3b,0xc5,0x5e,0x60,0x3b,0x2d,0x2e,0x8a,0x3b,0x57,0x79,0x7e,0x3b,0xf3,0xa7,0x2f,0x3b,0x94,0xfc,0x3b,0x3b,0x78,0x2d,0xf7,0x3a,0x0f,0xad,0x15,0x3b,0x1c,0xd7,0x21,0x3b,0x0e,0xcc,0x22,0x3b,0x70,0x91,0x49,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x39,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x76,0x80,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x06,0x00,0x00,0x50,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xd2,0x79,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x5a,0x8a,0xd9,0x3b,0x5f,0xcd,0x89,0x3b,0xf4,0xca,0x92,0x3b,0x96,0x01,0xb8,0x3b,0x04,0x10,0x26,0x3c,0x8e,0x8d,0xb2,0x3b,0xc2,0xd9,0xa9,0x3b,0xf9,0xee,0xd0,0x3b,0xce,0xfe,0x97,0x3b,0x44,0x79,0x91,0x3b,0x2f,0x92,0xcd,0x3b,0x8d,0x6a,0xfe,0x3b,0x21,0x6b,0x95,0x3b,0x29,0x32,0x8d,0x3b,0x37,0x77,0x0d,0x3c,0x8a,0x17,0xea,0x3b,0xc5,0xdd,0xf7,0x3b,0x8f,0x29,0xaa,0x3b,0xeb,0x0e,0x96,0x3b,0x17,0xe3,0x67,0x3b,0x96,0xe9,0xf1,0x3b,0x78,0x22,0x91,0x3b,0x60,0x7f,0x0c,0x3c,0x14,0xdd,0x18,0x3c,0x55,0xd7,0x0a,0x3c,0x94,0x13,0xe3,0x3b,0xe5,0xc5,0x8d,0x3b,0xab,0xc2,0x0d,0x3c,0xb7,0xf5,0xf7,0x3b,0xd0,0x25,0x46,0x3c,0xdb,0x7c,0x05,0x3c,0xec,0x68,0xd5,0x3b,0xe5,0x43,0xb0,0x3b,0xea,0x32,0xe2,0x3b,0xe6,0x9e,0xcd,0x3b,0x8b,0x88,0xf9,0x3b,0x5e,0xcc,0xd6,0x3b,0xa6,0x6e,0xad,0x3b,0x77,0x7b,0xaf,0x3b,0x3a,0x14,0x1c,0x3c,0x66,0x6f,0x86,0x3b,0xe2,0xdd,0xb4,0x3b,0xdf,0xd8,0x95,0x3b,0xff,0x99,0x01,0x3c,0x94,0x37,0xf2,0x3b,0x2c,0x4b,0xb5,0x3b,0x21,0xac,0xa1,0x3b,0x65,0xfe,0xb5,0x3b,0xfb,0x01,0x1d,0x3c,0x35,0xb8,0x29,0x3c,0xd0,0xb5,0xaf,0x3b,0x0b,0x50,0x06,0x3c,0x6f,0x42,0xd3,0x3b,0x51,0x69,0x9a,0x3b,0x05,0x8e,0xb0,0x3b,0x19,0x7f,0xb1,0x3b,0xc9,0x4f,0xc6,0x3b,0x17,0x8c,0xd8,0x3b,0x99,0xea,0x5f,0x3c,0x01,0x5b,0x26,0x3c,0x31,0x17,0xcd,0x3b,0x86,0x32,0x3a,0x3c,0x16,0xc0,0xca,0x3b,0x4c,0x5a,0xae,0x3b,0x9e,0x40,0xd9,0x3b,0x96,0xa4,0x12,0x3c,0xe5,0xeb,0x8f,0x3b,0x37,0x61,0xca,0x3b,0x01,0xe0,0x1e,0x3c,0xff,0x75,0x64,0x3b,0xae,0xec,0x04,0x3c,0xe9,0xc1,0xd8,0x3b,0xc8,0x4e,0x9a,0x3b,0xfc,0xdb,0x98,0x3b,0x2e,0x5a,0xb6,0x3b,0xaa,0xa5,0x65,0x3c,0x63,0xc8,0xb5,0x3b,0xeb,0x10,0xea,0x3b,0xe5,0x2e,0xa0,0x3b,0xbe,0xbf,0x8e,0x3b,0x28,0x42,0x9e,0x3b,0x94,0x4e,0xbe,0x3b,0x7b,0xae,0x02,0x3c,0x3e,0x6c,0x9f,0x3b,0x4b,0xdd,0xef,0x3b,0xa7,0xbf,0x92,0x3b,0x0b,0x7b,0xa0,0x3b,0x52,0x98,0xc7,0x3b,0x29,0x9e,0xfa,0x3b,0xbf,0x0f,0xf3,0x3b,0x1f,0x6d,0x99,0x3b,0xa2,0xa3,0xa7,0x3b,0xf0,0x44,0xb1,0x3b,0xcb,0x34,0x73,0x3b,0x80,0xb4,0x48,0x3c,0xd8,0x51,0x8b,0x3b,0x8d,0x63,0xf2,0x3b,0x4f,0x4e,0x06,0x3c,0x25,0x09,0x9b,0x3b,0xf7,0x19,0x96,0x3b,0xc9,0x9c,0x00,0x3c,0x09,0x50,0x9a,0x3b,0xca,0xbf,0xb7,0x3b,0xe1,0x96,0x8f,0x3b,0x56,0x80,0x8d,0x3b,0xfb,0x3d,0xa4,0x3b,0xab,0x64,0xf7,0x3b,0x02,0x36,0xda,0x3b,0xe0,0x68,0xaa,0x3b,0x4d,0x81,0xfe,0x3b,0xca,0x40,0x9c,0x3b,0xc5,0x7f,0xff,0x3b,0xa7,0xa6,0x96,0x3b,0x12,0x25,0x89,0x3b,0x22,0x4b,0xbb,0x3b,0xcd,0x27,0xac,0x3b,0x94,0x10,0xcc,0x3b,0x58,0x19,0xcd,0x3b,0xc5,0x66,0x07,0x3c,0x7d,0xbe,0xf0,0x3b,0x05,0x1e,0x03,0x3c,0x97,0xc0,0x6d,0x3b,0x32,0xca,0x97,0x3b,0x43,0x0e,0x8d,0x3b,0xee,0x80,0xad,0x3b,0x0d,0xd8,0x8a,0x3b,0x17,0x95,0xa3,0x3b,0x22,0x56,0xbe,0x3b,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x39,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xfa,0x86,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x06,0x00,0x00,0x14,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0x8d,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x25,0x78,0x0c,0x3b,0xfd,0x6d,0x28,0x3b,0x80,0x30,0x23,0x3b,0x53,0x22,0x20,0x3b,0x08,0x7b,0x6b,0x3b,0xaa,0x4d,0x68,0x3b,0xcb,0x88,0x21,0x3b,0x64,0x20,0x19,0x3b,0xb3,0x06,0x1c,0x3b,0x08,0x54,0x4c,0x3b,0xad,0x54,0x33,0x3b,0x3e,0xd5,0x2d,0x3b,0x8c,0xb0,0x2d,0x3b,0x36,0x74,0x33,0x3b,0x86,0x73,0x0a,0x3b,0x48,0x44,0x10,0x3b,0xba,0xd5,0x3a,0x3b,0x14,0x6a,0x41,0x3b,0x2e,0x64,0x29,0x3b,0xad,0x6e,0x0d,0x3b,0xf0,0xaf,0x3a,0x3b,0x56,0xcf,0x28,0x3b,0xcc,0xca,0x35,0x3b,0x87,0x8e,0x33,0x3b,0x84,0x7a,0x42,0x3b,0x7f,0x21,0x29,0x3b,0xd8,0xea,0x21,0x3b,0x4c,0x20,0x46,0x3b,0x5a,0x51,0x2e,0x3b,0xd2,0xe3,0x2e,0x3b,0xad,0xcc,0x32,0x3b,0xe6,0x75,0x45,0x3b,0x3e,0x3d,0x3f,0x3b,0xad,0x25,0x18,0x3b,0x7b,0x94,0x19,0x3b,0x0c,0x72,0x31,0x3b,0x79,0x93,0x6b,0x3b,0x0c,0xc8,0x3d,0x3b,0xe3,0x15,0x2f,0x3b,0xdc,0x72,0x1f,0x3b,0x4f,0x86,0x38,0x3b,0x6e,0x60,0x2e,0x3b,0x27,0x79,0x12,0x3b,0x38,0x5c,0x26,0x3b,0x97,0x5d,0x0b,0x3b,0xf6,0xd9,0x22,0x3b,0xfd,0xcb,0x47,0x3b,0xb4,0x75,0x46,0x3b,0x34,0x59,0xec,0x3a,0xca,0x3f,0xe5,0x3a,0x85,0x5d,0x39,0x3b,0x48,0x4d,0xed,0x3a,0x1c,0x4a,0x2b,0x3b,0x54,0xdf,0x18,0x3b,0x78,0x67,0x00,0x3b,0xf0,0x43,0x35,0x3b,0xf3,0xe5,0x30,0x3b,0x3b,0xc0,0x0a,0x3b,0x4a,0x82,0x32,0x3b,0xe6,0xac,0x2a,0x3b,0xc3,0xbf,0x01,0x3b,0x53,0xa3,0x1f,0x3b,0x59,0xc5,0x2f,0x3b,0x43,0xed,0x48,0x3b,0x75,0x05,0x15,0x3b,0x34,0x31,0x2f,0x3b,0x65,0x54,0x07,0x3b,0x71,0x3d,0x2c,0x3b,0x1e,0x9f,0x21,0x3b,0x2b,0xd4,0x29,0x3b,0x03,0x86,0x53,0x3b,0x8b,0x78,0x43,0x3b,0xd9,0xbc,0x3e,0x3b,0x37,0x52,0x65,0x3b,0xbe,0x2b,0x6a,0x3b,0x39,0x29,0x30,0x3b,0xce,0x74,0x74,0x3b,0xf5,0x3e,0x14,0x3b,0x20,0x8d,0x2e,0x3b,0xeb,0xab,0x1b,0x3b,0x86,0x51,0x34,0x3b,0xc5,0xdd,0x64,0x3b,0x83,0x21,0x47,0x3b,0x14,0xc1,0x38,0x3b,0xb2,0xa2,0x69,0x3b,0xaa,0x97,0x2c,0x3b,0x4f,0x38,0xfd,0x3a,0x89,0x21,0x13,0x3b,0x8f,0xb4,0x02,0x3b,0xb8,0x13,0x34,0x3b,0x5c,0x27,0x26,0x3b,0x92,0xf0,0x3f,0x3b,0x4b,0xbc,0x25,0x3b,0x7f,0xd1,0x43,0x3b,0x38,0xf0,0x1c,0x3b,0x53,0xd1,0x2b,0x3b,0x00,0x93,0x5e,0x3b,0x33,0x65,0x3c,0x3b,0xec,0xa1,0x16,0x3b,0x8e,0xe1,0x1c,0x3b,0x70,0x19,0x5b,0x3b,0xe9,0x16,0x0d,0x3b,0x59,0x69,0x44,0x3b,0x66,0x38,0xfb,0x3a,0x6d,0x4a,0x44,0x3b,0x94,0x1f,0x13,0x3b,0x97,0x36,0x45,0x3b,0xe5,0x0b,0x76,0x3b,0x74,0xb5,0x0d,0x3b,0x23,0x54,0x19,0x3b,0x05,0x7c,0x0d,0x3b,0x90,0x11,0x30,0x3b,0xc7,0xf9,0x36,0x3b,0xf7,0xee,0x30,0x3b,0xa3,0xfb,0x3e,0x3b,0xdb,0x92,0x2e,0x3b,0x25,0xb9,0x1e,0x3b,0x77,0x7b,0xfa,0x3a,0x8e,0x6a,0x28,0x3b,0x01,0xd7,0x06,0x3b,0x23,0xa8,0x21,0x3b,0x5c,0x39,0x1b,0x3b,0x20,0xce,0x28,0x3b,0x19,0x57,0x2b,0x3b,0x18,0x50,0x48,0x3b,0x1a,0xc2,0x12,0x3b,0x7d,0xbc,0x26,0x3b,0xc6,0x8b,0x2c,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x38,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x6e,0x8d,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x06,0x00,0x00,0x47,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xca,0x86,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xb7,0xc8,0xb9,0x3b,0x49,0x06,0x07,0x3c,0x13,0x37,0xaa,0x3b,0x4d,0x39,0x88,0x3b,0x57,0x70,0xba,0x3b,0x17,0xf4,0x13,0x3c,0x91,0xed,0x12,0x3c,0xc7,0x17,0xdc,0x3b,0x67,0x96,0x94,0x3b,0xb3,0x0f,0xac,0x3b,0xe6,0xef,0xa2,0x3b,0x74,0x00,0x20,0x3c,0x5d,0x78,0xa8,0x3b,0x3b,0x92,0x97,0x3b,0x13,0x50,0x8a,0x3b,0xe9,0x01,0x93,0x3b,0x9a,0xf1,0x26,0x3c,0xaf,0xb5,0xd6,0x3b,0xf4,0x4a,0x3a,0x3c,0xf9,0xfc,0xa3,0x3b,0x9c,0xdc,0x30,0x3c,0xe8,0x5a,0xa0,0x3b,0x93,0x4f,0xd3,0x3b,0x50,0x8e,0xb5,0x3b,0xf3,0xe6,0x92,0x3b,0xee,0x31,0xc7,0x3b,0xb3,0x8f,0xf6,0x3b,0xe5,0x1c,0xab,0x3b,0xa2,0x69,0xb9,0x3b,0x11,0x67,0xc5,0x3b,0x97,0x69,0x2c,0x3c,0x0a,0x11,0x0f,0x3c,0xd6,0xdc,0xea,0x3b,0x62,0x0e,0xd3,0x3b,0x16,0xf5,0x7d,0x3b,0x81,0x5a,0xcd,0x3b,0xc3,0x2b,0xa3,0x3b,0x8a,0x18,0xd8,0x3b,0x53,0x16,0xa2,0x3b,0x79,0x63,0xaf,0x3b,0x6d,0x10,0xad,0x3b,0xcb,0x53,0x0d,0x3c,0x96,0x74,0xdb,0x3b,0x34,0xa9,0xb6,0x3b,0xe1,0x8a,0x81,0x3b,0x64,0x61,0x9f,0x3b,0x79,0x95,0xf2,0x3b,0x52,0xae,0x1b,0x3c,0xea,0x22,0x99,0x3b,0xe8,0x9a,0xd5,0x3b,0xd9,0xf5,0xc3,0x3b,0x97,0x3f,0xa7,0x3b,0xb4,0xde,0xce,0x3b,0x6a,0xb7,0x99,0x3b,0x5d,0x1b,0xaa,0x3b,0x62,0xe8,0xdd,0x3b,0x80,0xe0,0xea,0x3b,0x11,0xf6,0x32,0x3c,0xa1,0xb3,0xe0,0x3b,0x4b,0x55,0x91,0x3b,0xf8,0x58,0x26,0x3c,0x51,0x2e,0xcd,0x3b,0xcb,0xd4,0xa1,0x3b,0xdc,0xca,0xf7,0x3b,0xc8,0x18,0xcd,0x3b,0x65,0x34,0x09,0x3c,0x27,0x59,0x9f,0x3b,0x34,0x50,0x89,0x3b,0xfa,0x30,0x0a,0x3c,0xbd,0xd9,0xb7,0x3b,0x60,0x79,0xd8,0x3b,0x48,0xf7,0xea,0x3b,0x1c,0xe6,0xdc,0x3b,0x0c,0xb8,0x8e,0x3b,0x26,0xb3,0xee,0x3b,0xae,0x58,0xc2,0x3b,0xdb,0x17,0xca,0x3b,0x6b,0xaa,0xaf,0x3b,0x6d,0xf2,0xe1,0x3b,0xa3,0x39,0x4b,0x3c,0x84,0xcd,0xb6,0x3b,0x4b,0x1c,0x9a,0x3b,0x47,0x1c,0x1f,0x3c,0x83,0xa4,0xad,0x3b,0x5f,0xc3,0xdd,0x3b,0xc1,0xeb,0x9c,0x3b,0xb6,0xe6,0xd5,0x3b,0x38,0x08,0x17,0x3c,0xc6,0x98,0xf2,0x3b,0xe2,0x24,0xf1,0x3b,0x4c,0x77,0x46,0x3c,0x62,0x8f,0xa8,0x3b,0x2d,0x25,0x02,0x3c,0x18,0x5c,0x89,0x3b,0x76,0xa2,0x9b,0x3b,0x5b,0x6d,0x94,0x3b,0xfe,0xf2,0x10,0x3c,0x8b,0x09,0xde,0x3b,0x4a,0x1c,0xd5,0x3b,0x11,0xe4,0xda,0x3b,0x1e,0xa1,0x90,0x3b,0x11,0xa7,0xa4,0x3b,0x2c,0x8c,0x9c,0x3b,0xe4,0x0d,0xed,0x3b,0x3d,0xb3,0x8c,0x3b,0x6a,0xea,0xa1,0x3b,0x9e,0xcb,0xe1,0x3b,0x2e,0xdf,0xea,0x3b,0x87,0xe0,0xb6,0x3b,0x92,0x5b,0x16,0x3c,0xb6,0x40,0xb2,0x3b,0x77,0x64,0xfa,0x3b,0x9f,0xa9,0xde,0x3b,0xc3,0x27,0x17,0x3c,0x38,0xc3,0xe4,0x3b,0x2e,0x3c,0xa7,0x3b,0x67,0x96,0x91,0x3b,0xe8,0x01,0x9e,0x3b,0x8a,0x9e,0x2d,0x3c,0x52,0xae,0x8f,0x3b,0xe2,0xcb,0x9e,0x3b,0x2d,0x22,0x20,0x3c,0xf1,0x72,0x97,0x3b,0x3e,0x6f,0x35,0x3c,0x5a,0x72,0xf1,0x3b,0x3a,0x1f,0xa7,0x3b,0x8a,0x30,0xad,0x3b,0x86,0xd7,0xc8,0x3b,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x38,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xf2,0x93,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x06,0x00,0x00,0x15,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x74,0x9a,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x69,0x72,0x15,0x3b,0x7b,0x2b,0x6e,0x3b,0x0e,0x7b,0x3c,0x3b,0x82,0xfa,0x32,0x3b,0x8e,0x21,0x15,0x3b,0xb7,0x35,0x12,0x3b,0x84,0x7e,0x16,0x3b,0x91,0xfe,0x6f,0x3b,0xe3,0xc4,0x14,0x3b,0x38,0xa8,0x14,0x3b,0x5c,0x34,0x8b,0x3b,0x9b,0xf3,0x51,0x3b,0xa0,0xe2,0x0f,0x3b,0x26,0x0f,0x38,0x3b,0xaa,0x48,0x3b,0x3b,0x97,0x55,0x32,0x3b,0xb9,0x5d,0x13,0x3b,0x5e,0x54,0x4d,0x3b,0x8b,0x64,0x48,0x3b,0xfc,0x34,0x2f,0x3b,0x8e,0x96,0x3e,0x3b,0x2f,0x44,0x2b,0x3b,0xf1,0x0c,0x1a,0x3b,0xaf,0xb5,0x3d,0x3b,0x74,0xc8,0x47,0x3b,0x81,0x75,0x4a,0x3b,0xe5,0x54,0x04,0x3b,0xdd,0xeb,0x27,0x3b,0x65,0x52,0x07,0x3b,0x7a,0xd4,0x2e,0x3b,0x34,0x82,0x2d,0x3b,0x98,0x18,0x4f,0x3b,0x9d,0x4d,0x19,0x3b,0x8f,0x04,0x31,0x3b,0x5d,0x44,0x1e,0x3b,0x66,0x57,0x75,0x3b,0x22,0x5d,0x31,0x3b,0x83,0x6d,0x00,0x3b,0x07,0x31,0x35,0x3b,0xbb,0x4a,0x21,0x3b,0x02,0xd8,0x67,0x3b,0xff,0x57,0x52,0x3b,0xa6,0x70,0x24,0x3b,0xea,0xb4,0x24,0x3b,0x9d,0x41,0x2e,0x3b,0xe5,0xa3,0x1c,0x3b,0x01,0x17,0x25,0x3b,0x09,0x5b,0x39,0x3b,0x14,0x47,0x38,0x3b,0xe8,0xb3,0x31,0x3b,0x5e,0xc4,0x0a,0x3b,0x07,0xf2,0x3a,0x3b,0xa1,0x56,0x0e,0x3b,0x08,0x08,0x11,0x3b,0xb8,0xf8,0x16,0x3b,0x1e,0xcb,0x1b,0x3b,0xf4,0xb4,0x11,0x3b,0x18,0xed,0x0f,0x3b,0x15,0x9f,0x0d,0x3b,0xa1,0xa1,0x4c,0x3b,0x54,0xc1,0x45,0x3b,0x22,0x52,0xf8,0x3a,0x3c,0xf0,0x18,0x3b,0x44,0x4e,0x1b,0x3b,0xb3,0xe2,0x42,0x3b,0x88,0x59,0x30,0x3b,0x73,0x95,0x4f,0x3b,0xbb,0x01,0x15,0x3b,0xcd,0x24,0x31,0x3b,0xf2,0x02,0x27,0x3b,0x99,0xce,0x56,0x3b,0x09,0x4d,0x3a,0x3b,0xbe,0xeb,0x35,0x3b,0xb7,0x9d,0x2b,0x3b,0x7d,0xa8,0x46,0x3b,0xea,0xe9,0x4a,0x3b,0xb1,0xa8,0x4e,0x3b,0x25,0x29,0x2a,0x3b,0x61,0x04,0x2c,0x3b,0xaf,0x65,0x28,0x3b,0xdc,0x84,0x6c,0x3b,0x77,0x23,0x30,0x3b,0xc8,0x82,0x26,0x3b,0x70,0xe0,0x33,0x3b,0x71,0xbe,0x43,0x3b,0x3c,0xa3,0x4b,0x3b,0x53,0xda,0xfe,0x3a,0x5a,0x12,0x02,0x3b,0xc8,0xf3,0x17,0x3b,0x4e,0x5a,0x29,0x3b,0xc8,0x4c,0x1d,0x3b,0x4b,0xde,0x3f,0x3b,0xf6,0x54,0x0f,0x3b,0x85,0x17,0x26,0x3b,0xa8,0x0a,0x6a,0x3b,0x96,0x03,0x32,0x3b,0xfa,0x3e,0x04,0x3b,0x34,0x14,0x1b,0x3b,0xb4,0x0e,0x89,0x3b,0x99,0xe1,0x11,0x3b,0xaa,0x64,0x4c,0x3b,0x2d,0x09,0x14,0x3b,0xe1,0xe1,0x53,0x3b,0xac,0x96,0x37,0x3b,0xd6,0xe7,0x2d,0x3b,0xe9,0x42,0x27,0x3b,0xf9,0x41,0x1f,0x3b,0x05,0xb8,0x46,0x3b,0x37,0x95,0x11,0x3b,0xe6,0x89,0x1d,0x3b,0xee,0x61,0x11,0x3b,0xac,0x0a,0x48,0x3b,0x50,0xad,0x87,0x3b,0x7c,0x67,0x05,0x3b,0x59,0x7b,0xf7,0x3a,0xcd,0xce,0x0e,0x3b,0x2b,0x8b,0x7f,0x3b,0x13,0x6a,0x06,0x3b,0x0c,0x0e,0x1f,0x3b,0x9d,0x29,0x51,0x3b,0xb0,0xc8,0x1e,0x3b,0x42,0x82,0x3d,0x3b,0x76,0x28,0x21,0x3b,0x00,0x00,0x2e,0x3b,0x37,0xd8,0x11,0x3b,0xeb,0xf0,0x36,0x3b,0x08,0x7f,0x4f,0x3b,0xbb,0xb5,0x37,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x37,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x66,0x9a,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x06,0x00,0x00,0x17,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xc2,0x93,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x63,0x1a,0x98,0x3b,0xf0,0xca,0xdf,0x3b,0x6a,0x36,0xdc,0x3b,0x7a,0x8b,0x16,0x3c,0xd6,0xce,0xf4,0x3b,0xef,0x99,0x74,0x3b,0xcd,0x1e,0xb4,0x3b,0x29,0xd1,0x16,0x3c,0x55,0xbd,0xbe,0x3b,0xa3,0xf3,0xb9,0x3b,0x43,0xb1,0x0a,0x3c,0x9e,0x35,0x09,0x3c,0xc9,0xd2,0x31,0x3c,0x99,0xed,0x8a,0x3c,0x32,0x87,0xc2,0x3b,0x50,0x41,0xee,0x3b,0x20,0x90,0x16,0x3c,0x65,0x1b,0x17,0x3c,0xa5,0xc8,0xf6,0x3b,0x64,0x68,0x4e,0x3c,0xda,0x71,0x2a,0x3c,0x00,0xd8,0x0b,0x3c,0x3e,0x58,0x22,0x3c,0x9b,0x30,0xb6,0x3b,0x7c,0x9a,0x82,0x3b,0x52,0x52,0xd6,0x3b,0xfe,0xe9,0xc3,0x3b,0x5f,0x56,0x06,0x3c,0xef,0xa4,0xd4,0x3b,0x97,0x95,0x1f,0x3c,0xc2,0x46,0x9b,0x3b,0xcc,0x44,0xc6,0x3b,0xa7,0xc1,0xaf,0x3b,0x02,0x07,0xf0,0x3b,0xc1,0xcf,0xe5,0x3b,0x71,0x1c,0x14,0x3c,0x7d,0xff,0xb3,0x3b,0xa4,0xb6,0xf3,0x3b,0xf4,0x81,0xda,0x3b,0xab,0xa7,0xbb,0x3b,0xef,0xd8,0xc9,0x3b,0xa1,0x31,0x02,0x3c,0x71,0xfb,0xc1,0x3b,0x91,0xd6,0xc2,0x3b,0x67,0x8b,0xcf,0x3b,0xc8,0x0b,0x8f,0x3b,0xbf,0x2e,0xdb,0x3b,0x70,0xe7,0x1e,0x3c,0x08,0x47,0x25,0x3c,0xd4,0xe6,0xeb,0x3b,0x60,0xf5,0xcd,0x3b,0xde,0xca,0x00,0x3c,0xbb,0x22,0xd0,0x3b,0xd5,0x0d,0xc4,0x3b,0x5c,0x68,0xbb,0x3b,0x92,0x93,0xb2,0x3b,0x77,0x86,0xfa,0x3b,0x11,0x85,0x27,0x3c,0x14,0x4d,0xd7,0x3b,0x49,0x13,0xeb,0x3b,0x56,0x35,0x0c,0x3c,0xcc,0x92,0xae,0x3b,0x36,0x68,0x2f,0x3c,0x52,0xaf,0x4c,0x3c,0xa0,0xd9,0xad,0x3b,0x49,0x40,0x93,0x3b,0xfa,0x40,0x27,0x3c,0x35,0xcd,0xb1,0x3b,0xa4,0xaa,0xdb,0x3b,0x45,0xfa,0x01,0x3c,0xc4,0x09,0x97,0x3b,0x2d,0x12,0x1e,0x3c,0x80,0xf7,0xf2,0x3b,0x0e,0xee,0xd1,0x3b,0x93,0xc7,0x3e,0x3c,0xa5,0xc5,0x78,0x3c,0x81,0xa1,0xcd,0x3b,0x95,0x7f,0x84,0x3b,0xac,0xfb,0xc0,0x3b,0x7b,0x9e,0xc9,0x3b,0xb4,0x94,0x0e,0x3c,0xbe,0x02,0x24,0x3c,0x26,0xaf,0x03,0x3c,0x1d,0x55,0xb6,0x3b,0x84,0x0c,0xa4,0x3b,0xe1,0x22,0xf5,0x3b,0xaf,0xf6,0x16,0x3c,0xf4,0x0e,0x02,0x3c,0x8f,0x59,0xb8,0x3b,0x5a,0x77,0x81,0x3c,0xa0,0x61,0x03,0x3c,0xdf,0x05,0xbc,0x3b,0x56,0x04,0xc6,0x3b,0x8d,0x0b,0xc2,0x3b,0x34,0xd6,0xd1,0x3b,0x06,0xd9,0xf0,0x3b,0xc8,0x23,0x01,0x3c,0x8d,0x16,0x17,0x3c,0x01,0x15,0xaa,0x3b,0x1e,0x97,0x1b,0x3c,0x01,0x15,0xde,0x3b,0x84,0x0b,0xd7,0x3b,0x61,0x98,0x24,0x3c,0x52,0x21,0xa2,0x3b,0x00,0x53,0xab,0x3b,0xca,0x54,0xc5,0x3b,0x2f,0xf5,0xf1,0x3b,0x72,0x53,0x8f,0x3b,0x73,0xbd,0xca,0x3b,0x3c,0x53,0x13,0x3c,0xa8,0x4d,0x45,0x3c,0xd9,0x26,0x5a,0x3c,0xb7,0xf1,0xbf,0x3b,0x0f,0xa2,0x3e,0x3c,0x6e,0xb5,0xd3,0x3b,0x30,0xa8,0x3c,0x3c,0x1c,0xfc,0xcd,0x3b,0x0c,0x94,0x1d,0x3c,0x09,0x92,0xdb,0x3b,0xcc,0xad,0x1f,0x3c,0x6e,0x27,0xf6,0x3b,0x01,0x23,0x89,0x3b,0x57,0xa7,0x9b,0x3b,0x23,0x4a,0x95,0x3b,0x53,0x0b,0x1a,0x3c,0xa6,0x56,0x00,0x3c,0x3c,0x50,0x08,0x3c,0xd0,0x0e,0x91,0x3b,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x37,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xea,0xa0,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x06,0x00,0x00,0x19,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0xa7,0xff,0xff,0x10,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xdb,0x16,0x77,0x3b,0x81,0x65,0x4c,0x3b,0xe0,0x30,0xbc,0x3b,0x34,0x9a,0x7d,0x3b,0xad,0x5a,0x4b,0x3b,0x64,0xaf,0x9d,0x3b,0x60,0xcb,0x1d,0x3b,0x9d,0xf2,0x52,0x3b,0xef,0x67,0x91,0x3b,0x2c,0xc1,0x5e,0x3b,0x8d,0x8e,0x4b,0x3b,0x3e,0x7a,0x8d,0x3b,0x64,0x7e,0x32,0x3b,0x35,0x8d,0xf5,0x3a,0x39,0x88,0x28,0x3b,0x69,0x08,0x39,0x3b,0xb7,0xa5,0x35,0x3b,0x0e,0x28,0x46,0x3b,0x77,0x11,0x79,0x3b,0xbf,0x20,0x29,0x3b,0xd0,0x29,0x67,0x3b,0xff,0x3c,0x32,0x3b,0x0c,0x5f,0x83,0x3b,0x00,0x82,0x87,0x3b,0x1c,0x6d,0x8f,0x3b,0xa2,0xdc,0x3d,0x3b,0xd5,0xd2,0x58,0x3b,0xa0,0x0d,0x70,0x3b,0x13,0x09,0x4f,0x3b,0x7e,0x45,0x86,0x3b,0x87,0xbe,0x65,0x3b,0xa3,0x41,0x44,0x3b,0x85,0x42,0x6e,0x3b,0xdd,0x83,0x39,0x3b,0x70,0xaf,0x32,0x3b,0x93,0x27,0x2e,0x3b,0x90,0x79,0x4f,0x3b,0x1b,0x55,0xf1,0x3a,0x88,0x75,0x5d,0x3b,0x82,0x71,0x7c,0x3b,0xe2,0x39,0x83,0x3b,0x48,0xba,0x5d,0x3b,0x93,0x01,0x46,0x3b,0xb6,0xf1,0x62,0x3b,0x46,0xcc,0x84,0x3b,0x28,0xbe,0x05,0x3b,0xf6,0x0c,0x5a,0x3b,0x29,0xbb,0x5f,0x3b,0xaa,0x38,0x17,0x3b,0x37,0xeb,0x20,0x3b,0x94,0xee,0x80,0x3b,0x88,0xe9,0x6a,0x3b,0x62,0x9f,0x5c,0x3b,0x5b,0x1e,0x62,0x3b,0x3d,0xa8,0x46,0x3b,0x9e,0x8c,0x49,0x3b,0x0a,0x98,0x72,0x3b,0x72,0x54,0x5b,0x3b,0xfc,0x37,0x2f,0x3b,0x56,0x08,0x05,0x3b,0xfb,0xd2,0x44,0x3b,0x4f,0x12,0x38,0x3b,0xf8,0x62,0x2e,0x3b,0xba,0x67,0x48,0x3b,0x02,0xbc,0x61,0x3b,0xf7,0x01,0x5d,0x3b,0x80,0xde,0x24,0x3b,0x0f,0xf2,0x9b,0x3b,0x33,0xb9,0x44,0x3b,0xe4,0xc4,0x41,0x3b,0x5e,0x1e,0x4a,0x3b,0x20,0x04,0x13,0x3b,0x37,0x3a,0x5a,0x3b,0x5c,0x35,0x52,0x3b,0x0d,0xf3,0x4a,0x3b,0x57,0xf5,0x06,0x3b,0x9f,0xdf,0x25,0x3b,0x8c,0x98,0x35,0x3b,0xd5,0x98,0x33,0x3b,0x8c,0x82,0x30,0x3b,0xaa,0x7a,0x60,0x3b,0x3a,0x6b,0x51,0x3b,0x24,0xdf,0x7c,0x3b,0xe8,0xe2,0x4a,0x3b,0xca,0x46,0x43,0x3b,0x7f,0x20,0x50,0x3b,0x6b,0x23,0x17,0x3b,0x89,0xcb,0x49,0x3b,0x85,0x69,0x40,0x3b,0x70,0x71,0x22,0x3b,0x41,0x72,0x73,0x3b,0x43,0xf2,0x29,0x3b,0xb4,0xa5,0x5d,0x3b,0x6f,0xfb,0x21,0x3b,0x37,0x81,0x88,0x3b,0x38,0xc1,0x24,0x3b,0xec,0x46,0x1d,0x3b,0xd5,0x05,0x7b,0x3b,0xfa,0xad,0x49,0x3b,0x38,0x00,0x5c,0x3b,0x42,0xa2,0x82,0x3b,0xca,0x7f,0x87,0x3b,0xf8,0xf8,0x5e,0x3b,0xa9,0xa1,0x72,0x3b,0xdd,0x61,0x67,0x3b,0xc2,0xe2,0x20,0x3b,0x3d,0x06,0x35,0x3b,0x6a,0x6f,0x48,0x3b,0x49,0x28,0x4b,0x3b,0x13,0x71,0x5b,0x3b,0x57,0x39,0x70,0x3b,0x3f,0x6c,0x08,0x3b,0x99,0xc7,0x41,0x3b,0x64,0x48,0x45,0x3b,0x02,0x34,0x35,0x3b,0x8f,0x25,0x51,0x3b,0xc4,0xfe,0x5a,0x3b,0x8e,0xa5,0x1e,0x3b,0xb6,0xc5,0x3a,0x3b,0x33,0xad,0xfb,0x3a,0x2b,0xce,0x43,0x3b,0xf4,0xa4,0x1d,0x3b,0xbf,0xd2,0x4e,0x3b,0xeb,0x6a,0x92,0x3b,0x17,0xe4,0x89,0x3b,0xa8,0x88,0x28,0x3b,0x04,0x1c,0x55,0x3b,0x98,0xc7,0x46,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x36,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x5e,0xa7,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x03,0x00,0x00,0x1b,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0xba,0xa0,0xff,0xff,0x14,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0xb0,0x90,0x3b,0xe7,0x75,0x88,0x3b,0xda,0xf6,0x64,0x3b,0xf3,0xa3,0x78,0x3b,0xae,0xc0,0x3c,0x3b,0x98,0xf3,0x41,0x3b,0x75,0xe2,0xa1,0x3b,0x49,0xfe,0x7a,0x3b,0x71,0x95,0x77,0x3b,0x26,0xd0,0xb1,0x3b,0x93,0xf9,0x76,0x3b,0x29,0x45,0x87,0x3b,0x9a,0x05,0x89,0x3b,0x2c,0xf3,0x7f,0x3b,0x9b,0xd5,0x7b,0x3b,0xd2,0x29,0xf3,0x3b,0xf1,0x7e,0x6c,0x3b,0x99,0xf1,0x1c,0x3c,0x86,0x53,0x73,0x3b,0x38,0x28,0x8f,0x3b,0xbe,0x20,0x64,0x3b,0xb5,0x96,0x82,0x3b,0x84,0x0a,0xb7,0x3b,0xa5,0xa4,0x5b,0x3b,0x1b,0x96,0x9d,0x3b,0x12,0x99,0x6f,0x3b,0xa0,0xcd,0x94,0x3b,0x62,0x2c,0x7f,0x3b,0x90,0x6c,0x7e,0x3b,0xdc,0xc6,0x95,0x3b,0xcd,0x97,0x62,0x3b,0x8a,0xf8,0x80,0x3b,0x53,0x91,0x64,0x3b,0xf9,0xb9,0x70,0x3b,0x93,0x39,0xf7,0x3b,0xe4,0x72,0xac,0x3b,0x29,0x52,0x95,0x3b,0x01,0xf7,0x98,0x3b,0x7a,0xce,0x4a,0x3b,0xb9,0x52,0x50,0x3b,0x6e,0x9f,0x71,0x3b,0x03,0x4a,0xa8,0x3b,0x34,0xdc,0xa3,0x3b,0xd3,0xad,0x93,0x3b,0xe2,0x45,0x63,0x3b,0xa6,0x4a,0x93,0x3b,0x3a,0x6b,0x54,0x3b,0xd9,0x9f,0x97,0x3b,0xef,0x53,0x77,0x3b,0x87,0x02,0x8b,0x3b,0x8b,0xd4,0x33,0x3b,0x1b,0x36,0x99,0x3b,0x90,0x19,0xcd,0x3b,0xda,0x5d,0xc1,0x3b,0x5d,0xee,0x68,0x3b,0x7d,0x5b,0x83,0x3b,0x30,0x76,0xd9,0x3b,0xb6,0x23,0x83,0x3b,0x57,0xdd,0x45,0x3b,0xfc,0xdc,0x47,0x3b,0x90,0x3f,0x3d,0x3b,0x20,0x3a,0x8e,0x3b,0x35,0x03,0x88,0x3b,0xe1,0xf2,0xd9,0x3b,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x36,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xe2,0xaa,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x03,0x00,0x00,0x1c,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xb1,0xff,0xff,0x10,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xa4,0xc8,0x2b,0x3b,0x4e,0x6a,0x7a,0x3b,0x4b,0x5c,0x8d,0x3b,0x1a,0x86,0xa4,0x3b,0x9d,0x00,0x62,0x3b,0x17,0x46,0x39,0x3b,0xc4,0xca,0x6a,0x3b,0x39,0x91,0x59,0x3b,0x38,0xdf,0x8d,0x3b,0x6b,0x33,0x81,0x3b,0x7e,0x86,0x7e,0x3b,0xbc,0x51,0x61,0x3b,0x39,0xea,0x80,0x3b,0x43,0x3c,0x1f,0x3b,0x4e,0xb7,0xa8,0x3b,0x64,0x51,0x0f,0x3b,0xf8,0x3f,0x81,0x3b,0xe5,0x7b,0x10,0x3b,0x4d,0x5b,0x28,0x3b,0x8e,0xe7,0x97,0x3b,0xb4,0xef,0x6f,0x3b,0xc2,0xd6,0x55,0x3b,0x89,0x56,0x6a,0x3b,0x44,0xc6,0x70,0x3b,0xb4,0x0a,0x2c,0x3b,0xc6,0xc2,0x1c,0x3b,0x4b,0xb3,0x9b,0x3b,0x8c,0x98,0x61,0x3b,0x98,0x37,0x90,0x3b,0x51,0xaa,0x5b,0x3b,0x32,0x7e,0x81,0x3b,0x90,0x3e,0x5d,0x3b,0x34,0x88,0x41,0x3b,0x78,0x6b,0x59,0x3b,0xeb,0xb0,0x4c,0x3b,0x3c,0x78,0x3c,0x3b,0xcb,0x77,0x58,0x3b,0x77,0x8c,0x16,0x3b,0xbb,0xad,0x2c,0x3b,0xc3,0x8c,0x8b,0x3b,0x26,0xb3,0x82,0x3b,0xd6,0x40,0x6a,0x3b,0x8e,0xe1,0x38,0x3b,0x7e,0xd5,0x6e,0x3b,0x10,0xe0,0x74,0x3b,0xc5,0x58,0x60,0x3b,0xf5,0xaa,0x3b,0x3b,0xbd,0xde,0x1c,0x3b,0xe8,0xcc,0x45,0x3b,0xbf,0x14,0xfb,0x3a,0x37,0xe0,0x67,0x3b,0xc4,0xe3,0x8d,0x3b,0xf7,0xbe,0xca,0x3a,0xdb,0x1a,0x0e,0x3b,0xb8,0xa4,0x6a,0x3b,0x4b,0xa5,0x59,0x3b,0x90,0xf5,0x4f,0x3b,0xbc,0xdd,0x6a,0x3b,0x9d,0x26,0x66,0x3b,0x28,0x0d,0x5e,0x3b,0x58,0xa2,0x7e,0x3b,0x86,0x80,0x83,0x3b,0x03,0x4a,0x14,0x3b,0xf4,0xda,0x12,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x35,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x56,0xae,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x03,0x00,0x00,0x4d,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0xb2,0xa7,0xff,0xff,0x14,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xaf,0x6d,0xa7,0x3b,0x6f,0xfb,0x1a,0x3c,0x4f,0x65,0xf0,0x3b,0x64,0x5c,0xf6,0x3b,0xd1,0xef,0x18,0x3c,0x0b,0xb1,0x8f,0x3b,0xd0,0x97,0xb1,0x3b,0x49,0xed,0x48,0x3b,0xc5,0x55,0x50,0x3c,0xff,0xff,0x6c,0x3c,0x09,0x61,0x8d,0x3c,0xd3,0xcb,0x17,0x3c,0x51,0x94,0x14,0x3c,0xb9,0xd6,0x7c,0x3b,0xd5,0xff,0xd5,0x3b,0x69,0x20,0x00,0x3c,0x8b,0x38,0xbe,0x3b,0xa6,0xe9,0x9a,0x3b,0x9a,0xea,0xd7,0x3b,0xd0,0x5e,0x9d,0x3b,0xfa,0x04,0x95,0x3b,0x76,0xe1,0xc0,0x3b,0xc1,0x6e,0x8b,0x3c,0xf0,0x34,0xcb,0x3b,0xca,0x60,0xb1,0x3b,0x79,0xa5,0x64,0x3c,0x3b,0x85,0x38,0x3c,0xe2,0x8a,0x95,0x3b,0xec,0xbb,0xc0,0x3b,0xfb,0xa3,0xe9,0x3b,0x14,0x3d,0xb1,0x3b,0x1d,0x89,0xe8,0x3b,0x06,0x7a,0x8b,0x3b,0x2f,0x32,0xb6,0x3b,0xcc,0x2e,0xd7,0x3b,0x32,0xc7,0x68,0x3b,0xd7,0x22,0x33,0x3c,0x1e,0x40,0x42,0x3c,0x6e,0xb4,0xb6,0x3b,0x28,0x77,0xb0,0x3b,0x49,0xaa,0xed,0x3b,0x4f,0x78,0xe2,0x3b,0x85,0xe9,0x23,0x3c,0x5e,0xe9,0xd9,0x3b,0x6d,0xab,0x7a,0x3b,0x21,0x29,0x5f,0x3b,0xb7,0x50,0x3e,0x3c,0xf7,0xc3,0x84,0x3b,0x18,0x38,0x2b,0x3c,0x01,0x11,0x12,0x3c,0x78,0xe8,0xf3,0x3b,0x7d,0x96,0x0d,0x3c,0xb6,0x66,0x56,0x3c,0x79,0x61,0xb3,0x3b,0xea,0x0d,0x92,0x3b,0xb3,0xe3,0xa9,0x3b,0xe0,0xc5,0x0c,0x3c,0xce,0x38,0xc8,0x3b,0xb8,0x38,0x9b,0x3b,0x23,0x35,0xa1,0x3b,0x5e,0x18,0x4a,0x3c,0x63,0x54,0x8a,0x3b,0x17,0xe9,0xb7,0x3b,0xfa,0x64,0x3d,0x3c,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x35,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xda,0xb1,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x03,0x00,0x00,0x1e,0x00,0x00,0x00,0x20,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0xb8,0xff,0xff,0x10,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x9e,0x9c,0x8a,0x3b,0xa1,0xfb,0x2f,0x3b,0x08,0x09,0xa5,0x3b,0xf9,0xb5,0x8a,0x3b,0x37,0xe2,0x55,0x3b,0x57,0x24,0x72,0x3b,0x09,0xef,0x9f,0x3b,0xa9,0xe2,0x83,0x3b,0x95,0x08,0x35,0x3b,0x15,0x8c,0x8c,0x3b,0xb7,0x43,0x15,0x3b,0xa3,0xf2,0x9f,0x3b,0xed,0xf3,0x33,0x3b,0x8a,0x02,0x8a,0x3b,0xcc,0xf5,0xad,0x3b,0x31,0x32,0x03,0x3c,0x5c,0x78,0x87,0x3b,0x97,0xb7,0x82,0x3b,0xae,0xbb,0x8c,0x3b,0x1a,0x38,0x3c,0x3b,0xf6,0xc9,0xe6,0x3b,0xa1,0x15,0x54,0x3b,0x80,0x78,0x5c,0x3b,0xec,0x30,0xc3,0x3b,0x58,0x81,0xba,0x3b,0x74,0x73,0xe2,0x3a,0x5c,0x1b,0x2e,0x3b,0x52,0x39,0xd7,0x3b,0x96,0xb9,0xb3,0x3b,0x71,0x24,0x83,0x3b,0x20,0x23,0x8a,0x3b,0x48,0xf7,0xc2,0x3b,0x4d,0x5e,0xaa,0x3b,0x32,0x14,0x22,0x3b,0x6a,0x7e,0x6e,0x3b,0x2e,0x1c,0xdf,0x3b,0x54,0x42,0x1e,0x3b,0x46,0x10,0x24,0x3b,0x0a,0xad,0x6f,0x3b,0x22,0x6a,0x35,0x3b,0xc4,0x9b,0x5f,0x3b,0xfd,0xd4,0x8d,0x3b,0x7e,0xed,0x53,0x3b,0x09,0xdb,0x8e,0x3b,0xbd,0xad,0xce,0x3b,0xf2,0xa0,0xd0,0x3b,0xea,0x53,0x06,0x3b,0xc8,0x51,0x71,0x3b,0x76,0x51,0xad,0x3b,0x21,0x81,0x0c,0x3c,0x3a,0x8c,0x04,0x3c,0xa8,0xbe,0x8f,0x3b,0x4f,0xc3,0x8d,0x3b,0x9e,0x1c,0x09,0x3c,0x17,0x93,0xac,0x3b,0x67,0x90,0x98,0x3b,0x7d,0x65,0x54,0x3b,0x7b,0x0d,0xd5,0x3b,0x42,0x1c,0x92,0x3b,0xec,0x41,0xa6,0x3b,0x4a,0x0f,0x42,0x3b,0x5c,0x69,0xfd,0x3b,0xd2,0x9d,0xbb,0x3b,0x0a,0xbb,0x48,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x34,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x4e,0xb5,0xff,0xff,0x00,0x00,0x00,0x09,0xe8,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xaa,0xae,0xff,0xff,0x14,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x0e,0xe8,0x3a,0x3b,0x06,0xdb,0x60,0x3b,0x15,0xab,0x2c,0x3b,0xc2,0x4d,0x69,0x3b,0xed,0xe2,0x03,0x3c,0xf7,0x38,0x87,0x3b,0x43,0xca,0x46,0x3b,0x75,0x5e,0x48,0x3b,0x1b,0xa8,0x47,0x3b,0x1a,0x27,0x1a,0x3b,0xfa,0xaa,0x64,0x3b,0xd7,0x95,0x46,0x3b,0x29,0x74,0x8d,0x3b,0x56,0x3a,0xdf,0x3b,0xfc,0xdf,0x93,0x3b,0x2a,0xd8,0x59,0x3b,0x3a,0x2c,0x4d,0x3b,0x06,0xa2,0x3e,0x3b,0x56,0xe5,0xa0,0x3b,0x7c,0x42,0x51,0x3b,0x36,0x2c,0x9f,0x3b,0x6f,0xd4,0x8f,0x3b,0x01,0x77,0x07,0x3b,0x5a,0xfa,0x65,0x3b,0x61,0xc0,0xe2,0x3b,0x7d,0xea,0x78,0x3b,0x3d,0x98,0x57,0x3b,0x13,0x7d,0x40,0x3b,0x60,0xdc,0x9b,0x3b,0x92,0x50,0x5e,0x3b,0x09,0xc6,0x90,0x3b,0xe0,0x52,0xd7,0x3b,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x34,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x52,0xb7,0xff,0xff,0x00,0x00,0x00,0x09,0xd8,0x01,0x00,0x00,0x21,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0xbd,0xff,0xff,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x1f,0xd1,0x8d,0x3b,0x4a,0xc4,0xc6,0x3b,0x9e,0xc2,0xa2,0x3b,0x50,0x27,0x83,0x3b,0x8f,0xb4,0x09,0x3b,0xa4,0x9e,0x3b,0x3b,0x8d,0xe0,0x73,0x3b,0x54,0x0e,0x5f,0x3b,0xa8,0xd7,0xa1,0x3b,0x7f,0x7a,0x75,0x3b,0x0e,0xe9,0xbc,0x3b,0xfa,0x06,0x60,0x3b,0x12,0x4b,0xab,0x3b,0x95,0xb8,0xaf,0x3b,0x37,0xc2,0x54,0x3b,0xbe,0x2b,0x7b,0x3b,0xdd,0xc9,0x83,0x3b,0xb2,0x00,0x9b,0x3b,0x6c,0x06,0xbe,0x3b,0x47,0xd2,0x9d,0x3b,0x27,0xbe,0xdc,0x3b,0xe2,0x70,0x84,0x3b,0xc7,0xd1,0x6e,0x3b,0x4f,0x2c,0xa8,0x3b,0xf4,0x02,0xd2,0x3b,0x9c,0xc2,0x04,0x3c,0x0b,0x8d,0xd7,0x3b,0x16,0x65,0xb0,0x3b,0xaf,0xc2,0x3a,0x3b,0xd6,0xbb,0x7c,0x3b,0x16,0x8c,0x98,0x3b,0xbb,0xd1,0x7e,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x33,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x46,0xb9,0xff,0xff,0x00,0x00,0x00,0x09,0xe8,0x01,0x00,0x00,0x23,0x00,0x00,0x00,0xa4,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xa2,0xb2,0xff,0xff,0x14,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x87,0x89,0x04,0x3c,0x79,0xd0,0x1d,0x3c,0x68,0xa3,0xe5,0x3b,0xb9,0x26,0x22,0x3c,0x98,0xca,0x50,0x3c,0x30,0xc4,0xc5,0x3c,0x27,0x84,0x8f,0x3b,0x2d,0x0a,0xeb,0x3b,0xbe,0xf6,0xee,0x3b,0xf0,0x0c,0x8b,0x3c,0xc4,0xd5,0xb1,0x3c,0xcb,0x44,0xdc,0x3b,0x23,0x2a,0x34,0x3b,0xcc,0x23,0x57,0x3c,0x95,0x75,0x0a,0x3c,0xdc,0xdd,0x06,0x3b,0x15,0x63,0xe5,0x3b,0x3b,0xa4,0x8b,0x3b,0x01,0x47,0xb3,0x3c,0x17,0x08,0xc8,0x3c,0xde,0x85,0xb4,0x3b,0x47,0x1d,0xc0,0x3c,0x5e,0xf2,0x4f,0x3b,0x0c,0x34,0xd4,0x3b,0xc9,0x45,0xc7,0x3b,0x2a,0x86,0xf0,0x3c,0x46,0x7c,0xf8,0x3b,0x57,0x56,0x52,0x3b,0x04,0xf4,0xa6,0x3b,0xec,0x8d,0xe0,0x3b,0x44,0x9f,0xd3,0x3b,0x4d,0x19,0x38,0x3c,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x33,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x4a,0xbb,0xff,0xff,0x00,0x00,0x00,0x09,0xd8,0x01,0x00,0x00,0x3d,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xcc,0xc1,0xff,0xff,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x5c,0xc7,0x3c,0x3c,0x66,0x8c,0x83,0x3b,0xd4,0x22,0xcd,0x3b,0x48,0x6e,0xd1,0x3b,0xdc,0x08,0xa3,0x3b,0x61,0x10,0xd1,0x3a,0x79,0x0b,0xaf,0x3b,0x3a,0x7e,0xe1,0x3b,0x30,0x6c,0x76,0x3b,0xfb,0x99,0x5e,0x3b,0xf0,0xc4,0xe5,0x3a,0x1c,0xc4,0xa8,0x3b,0xb1,0x3a,0xd0,0x3b,0x88,0x11,0xa7,0x3b,0xec,0xf4,0x20,0x3c,0xe3,0xd4,0x3b,0x3c,0xab,0xed,0xd9,0x3b,0x95,0xdb,0xfa,0x3b,0x66,0x0a,0x11,0x3b,0x9b,0x16,0x4e,0x3b,0x24,0xb6,0xb0,0x3b,0xa5,0xc7,0xfd,0x3a,0xac,0x74,0xc1,0x3b,0xbc,0x52,0xdc,0x3b,0x0a,0xb5,0xb0,0x3b,0x49,0x2c,0x92,0x3a,0x60,0x8d,0xb4,0x3b,0x7f,0x7e,0xef,0x3b,0x9a,0x83,0x1b,0x3c,0x4a,0x50,0x9a,0x3b,0xd4,0x4d,0x08,0x3c,0x80,0x79,0x71,0x3b,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x32,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x3e,0xbd,0xff,0xff,0x00,0x00,0x00,0x09,0x28,0x01,0x00,0x00,0x3a,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9a,0xb6,0xff,0xff,0x94,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xf3,0xae,0x65,0x3b,0x76,0xd3,0x46,0x3b,0x47,0x81,0xa1,0x3b,0xa1,0x23,0x83,0x3b,0x2e,0x71,0xbf,0x3b,0xbf,0x4c,0x9d,0x3b,0x00,0xc1,0xa5,0x3b,0x36,0x82,0x2f,0x3b,0x9a,0xaf,0xa4,0x3b,0x3a,0xd4,0x11,0x3c,0x22,0x3a,0x44,0x3b,0xb5,0x66,0xa2,0x3b,0xef,0x6f,0x6c,0x3b,0x28,0xc6,0x65,0x3b,0xb1,0x23,0xda,0x3b,0x85,0x20,0xed,0x3b,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x32,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x82,0xbe,0xff,0xff,0x00,0x00,0x00,0x09,0x18,0x01,0x00,0x00,0x3f,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xc5,0xff,0xff,0x90,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x09,0x89,0x62,0x3c,0x4d,0xd2,0x10,0x3c,0xc6,0x64,0x87,0x3c,0xc1,0x43,0xee,0x3b,0x0a,0x21,0x47,0x3c,0x41,0xa2,0x49,0x3c,0x5e,0x4c,0x00,0x3c,0x22,0x6b,0x0c,0x3c,0xb3,0x07,0x6a,0x3c,0x28,0xb4,0x07,0x3c,0xb3,0xc7,0x52,0x3c,0x27,0x63,0x03,0x3c,0x87,0xac,0x46,0x3c,0xe4,0xd4,0xe3,0x3b,0x53,0xf1,0x04,0x3c,0x58,0xb6,0x32,0x3c,0x2b,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xb6,0xbf,0xff,0xff,0x00,0x00,0x00,0x09,0xc8,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x12,0xb9,0xff,0xff,0x54,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xc6,0x53,0x8c,0x3b,0xca,0x97,0xca,0x3b,0x35,0x82,0x15,0x3e,0xcd,0x4b,0x3e,0x3b,0x6d,0x31,0x70,0x3c,0x71,0x98,0x2d,0x3b,0x91,0xa1,0xf1,0x3b,0x42,0xa8,0xa3,0x3e,0x35,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x9a,0xc0,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x0c,0x00,0x00,0x05,0x00,0x00,0x00,0x1c,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0xc7,0xff,0xff,0x0c,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x35,0xc1,0x5c,0x3a,0xe5,0xef,0xaa,0x3a,0xfb,0x29,0x95,0x3a,0xd6,0x76,0x09,0x3a,0x9a,0xd5,0x99,0x3a,0x88,0x58,0x2f,0x3a,0xe3,0x21,0x42,0x3a,0xe5,0x62,0x95,0x3a,0xfa,0xa3,0x5e,0x3a,0x66,0x7c,0x87,0x3a,0xef,0x0d,0x5d,0x3a,0x96,0x73,0x31,0x3a,0x87,0x13,0x8d,0x3a,0x55,0xee,0x38,0x3a,0x8f,0x82,0x34,0x3a,0x09,0x82,0x56,0x3a,0x8f,0x70,0x67,0x3a,0x8d,0xca,0x2d,0x3a,0xf5,0x8b,0x1c,0x3a,0xcf,0x64,0x7c,0x3a,0xda,0xb7,0x12,0x3a,0xff,0xd8,0x46,0x3a,0x72,0xa8,0x80,0x3a,0xb8,0x32,0x48,0x3a,0x95,0xdf,0x97,0x3a,0xe1,0x48,0x42,0x3a,0xad,0xfc,0xb2,0x3a,0x0f,0xfe,0x82,0x3a,0xec,0xcc,0x18,0x3a,0x0f,0x77,0x38,0x3a,0x48,0x00,0x5a,0x3a,0x17,0x3b,0x77,0x3a,0x5c,0x99,0x90,0x3a,0xa5,0x25,0x50,0x3a,0xbc,0x0d,0x48,0x3a,0x14,0xc8,0x3e,0x3a,0xe9,0xb8,0x52,0x3a,0x6b,0xc3,0x25,0x3a,0x4a,0x97,0x65,0x3a,0xd6,0x6f,0x45,0x3a,0x95,0x18,0x84,0x3a,0x8e,0xaf,0x58,0x3a,0xc7,0x30,0x84,0x3a,0x99,0x69,0x77,0x3a,0x22,0xc9,0x10,0x3a,0x95,0xb8,0x1e,0x3a,0x50,0xd3,0x43,0x3a,0xe2,0x56,0x36,0x3a,0x5e,0xe9,0x8a,0x3a,0xb1,0x42,0x86,0x3a,0x28,0xd7,0x58,0x3a,0x5f,0xe0,0x1d,0x3a,0x70,0x0e,0x35,0x3a,0x13,0x7b,0xcf,0x3a,0x5e,0xfd,0x3c,0x3a,0x1c,0xe5,0x7c,0x3a,0x42,0x7e,0x85,0x3a,0x67,0x18,0x48,0x3a,0xbd,0xec,0x33,0x3a,0xc7,0x8c,0x5c,0x3a,0x23,0xff,0x5c,0x3a,0x76,0xcc,0x4d,0x3a,0xe1,0x08,0x81,0x3a,0x2d,0xca,0x3e,0x3a,0x76,0x72,0x1a,0x3a,0x5e,0x40,0x55,0x3a,0x38,0x79,0x23,0x3a,0x59,0x0d,0x43,0x3a,0x43,0x52,0x42,0x3a,0x1c,0x46,0x63,0x3a,0xce,0xe7,0x67,0x3a,0xe9,0x16,0x3e,0x3a,0x3c,0x0c,0x02,0x3a,0xb6,0x1a,0x54,0x3a,0x2d,0xd9,0x28,0x3a,0xa0,0x6b,0x25,0x3a,0xfd,0xd0,0xa5,0x3a,0xa9,0x48,0x59,0x3a,0x58,0x22,0x34,0x3a,0x5a,0xec,0x09,0x3a,0x80,0x39,0xcb,0x3a,0x54,0x07,0x2c,0x3a,0x0a,0x1d,0x0a,0x3a,0x0a,0x82,0x43,0x3a,0x65,0x5e,0x90,0x3a,0xf7,0xc1,0x18,0x3a,0xba,0x95,0x34,0x3a,0x58,0x5d,0x9d,0x3a,0xc2,0x69,0x43,0x3a,0x61,0x37,0x4b,0x3a,0x7d,0x5a,0x80,0x3a,0x63,0x47,0x28,0x3a,0x1f,0xbc,0x4b,0x3a,0xd7,0xa2,0x59,0x3a,0x84,0x6e,0x11,0x3a,0xaa,0x21,0x9b,0x3a,0x54,0xa6,0x83,0x3a,0xb7,0x23,0x66,0x3a,0xaa,0xa8,0x97,0x3a,0x14,0x6a,0x2c,0x3a,0x4d,0x1b,0x2b,0x3a,0x2a,0xbf,0x27,0x3a,0xf9,0x8a,0x27,0x3a,0x6a,0x9e,0x5d,0x3a,0xfa,0xda,0x89,0x3a,0x4f,0xea,0x2e,0x3a,0x6b,0x3f,0x29,0x3a,0x51,0xba,0x28,0x3a,0xa8,0x04,0x74,0x3a,0xcd,0xb2,0x56,0x3a,0x08,0xe9,0x85,0x3a,0xe2,0x08,0x28,0x3a,0xa4,0xfb,0x02,0x3a,0x1c,0x1b,0x9a,0x3a,0x0b,0xf8,0x32,0x3a,0x21,0x7d,0x83,0x3a,0xbd,0xc4,0x8e,0x3a,0xb8,0x50,0x39,0x3a,0x34,0xba,0xa2,0x3a,0xa2,0xfd,0x26,0x3a,0xc7,0xf1,0x5c,0x3a,0x89,0x82,0x1e,0x3a,0xc9,0x03,0x25,0x3a,0xda,0x86,0x55,0x3a,0xd2,0xb4,0x5d,0x3a,0xa8,0x51,0x26,0x3a,0x4f,0x3e,0x21,0x3a,0xea,0x6c,0x75,0x3a,0xf4,0x32,0x6b,0x3a,0xa6,0x58,0x9b,0x3a,0x3c,0xd4,0xa1,0x3a,0x9c,0x68,0x7d,0x3a,0x8f,0x54,0x58,0x3a,0x41,0x4c,0x24,0x3a,0x2f,0x16,0x68,0x3a,0x3b,0x1d,0x06,0x3a,0xa3,0x7b,0x7b,0x3a,0xd7,0x94,0x71,0x3a,0xa1,0x17,0x25,0x3a,0xe4,0x77,0x42,0x3a,0x05,0xb9,0x6e,0x3a,0x00,0xe4,0x42,0x3a,0x9b,0xb6,0x49,0x3a,0x25,0x09,0x5f,0x3a,0xae,0x63,0x55,0x3a,0x78,0x8d,0x50,0x3a,0xa5,0xf5,0x64,0x3a,0x22,0x6e,0x61,0x3a,0x34,0x1c,0x75,0x3a,0x8f,0xf8,0x33,0x3a,0x71,0xc6,0x62,0x3a,0x34,0x5d,0x44,0x3a,0xb3,0x6d,0x25,0x3a,0x41,0x2b,0x19,0x3a,0xd8,0x4a,0x73,0x3a,0x4b,0x72,0x59,0x3a,0xa2,0x6c,0x41,0x3a,0x0a,0xed,0x9e,0x3a,0x05,0x1e,0x46,0x3a,0x5a,0x17,0x49,0x3a,0xd4,0xea,0x23,0x3a,0x76,0xdb,0x46,0x3a,0x6f,0xb2,0xb7,0x3a,0x9b,0xe6,0x4e,0x3a,0x28,0x26,0x42,0x3a,0x92,0xb3,0x3a,0x3a,0x93,0x76,0x1e,0x3a,0x92,0x54,0x49,0x3a,0x35,0x42,0x13,0x3a,0xac,0x30,0xa2,0x3a,0xc4,0xca,0x4f,0x3a,0x18,0x3c,0x1e,0x3a,0x44,0xd1,0x8a,0x3a,0x22,0x0d,0x34,0x3a,0x66,0xf7,0x47,0x3a,0xe7,0x06,0x49,0x3a,0x38,0xc8,0x07,0x3b,0x41,0xe5,0xca,0x3a,0x4b,0x05,0x63,0x3a,0x48,0x83,0x50,0x3a,0x3b,0x4a,0x23,0x3a,0x10,0x05,0x3c,0x3a,0x70,0x54,0x45,0x3a,0xfc,0xb4,0x56,0x3a,0x16,0x39,0x7a,0x3a,0xd3,0xac,0x67,0x3a,0x13,0x8d,0x98,0x3a,0x99,0x9d,0x3e,0x3a,0x2a,0x46,0x37,0x3a,0xfc,0x1c,0x4a,0x3a,0xa1,0x1c,0x52,0x3a,0xab,0x73,0x7b,0x3a,0x04,0xc9,0x24,0x3a,0x0b,0xf4,0x57,0x3a,0xc8,0xab,0x74,0x3a,0x4d,0x7b,0x1f,0x3a,0x21,0xe0,0x34,0x3a,0x37,0x61,0x82,0x3a,0x63,0xe2,0x21,0x3a,0x6f,0xd2,0xdf,0x39,0x7e,0x17,0x36,0x3a,0xe5,0xa0,0xef,0x39,0xc6,0x00,0x6b,0x3a,0x5d,0x5d,0x71,0x3a,0xe6,0xe7,0x52,0x3a,0x8f,0xd1,0x80,0x3a,0x20,0x09,0x8f,0x3a,0x83,0xbe,0x2f,0x3a,0xe3,0x3d,0x14,0x3a,0x58,0xec,0x66,0x3a,0xb2,0x96,0x6e,0x3a,0xc3,0x27,0x7f,0x3a,0xfa,0xea,0x50,0x3a,0xbb,0x93,0x3f,0x3a,0x88,0xc4,0xbb,0x3a,0x81,0xa1,0x16,0x3a,0xaa,0x0d,0x18,0x3a,0xd3,0x61,0x51,0x3a,0x6a,0x28,0x72,0x3a,0xa7,0xa6,0x4d,0x3a,0x01,0xb4,0x5b,0x3a,0x49,0x56,0x2f,0x3a,0x39,0x06,0x84,0x3a,0x90,0x4e,0x90,0x3a,0xce,0x41,0x49,0x3a,0x94,0x2a,0x40,0x3a,0x2e,0xbc,0x1f,0x3a,0x1e,0x6d,0x18,0x3a,0xd8,0x8b,0x30,0x3a,0x48,0xcd,0x2b,0x3a,0x39,0xfd,0x89,0x3a,0x9e,0xbf,0x36,0x3a,0xf0,0xf7,0x49,0x3a,0x53,0xa4,0x03,0x3a,0xc8,0x82,0x7f,0x3a,0x77,0x2f,0xa8,0x3a,0x9a,0x23,0x83,0x3a,0x4e,0x97,0x22,0x3a,0xe9,0x13,0x2a,0x3a,0x39,0x76,0x7c,0x3a,0x0b,0x01,0xbe,0x3a,0x4a,0x2f,0x8a,0x3a,0x41,0x24,0x29,0x3a,0x15,0x51,0xbb,0x3a,0x38,0x36,0x1d,0x3a,0x1f,0x00,0xa9,0x3a,0x64,0x35,0x95,0x3a,0xbd,0x91,0x69,0x3a,0xdf,0xcf,0x32,0x3a,0x0e,0xc4,0xc3,0x3a,0x36,0xb8,0x38,0x3a,0x95,0xfc,0x58,0x3a,0xf0,0xf3,0xa5,0x3a,0x17,0x58,0x87,0x3a,0xa1,0xe4,0x54,0x3a,0xaf,0x41,0x87,0x3a,0x2c,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x33,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x0e,0xcd,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x0c,0x00,0x00,0x07,0x00,0x00,0x00,0x24,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x6a,0xc6,0xff,0xff,0x14,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x0e,0x71,0x40,0x3c,0xe8,0xda,0xe7,0x3b,0xe4,0xb9,0x56,0x3c,0x54,0x6a,0xf9,0x3b,0x67,0x0c,0xbf,0x3b,0x24,0x1c,0x0b,0x3c,0x6a,0x8f,0xb1,0x3b,0xdc,0x08,0x24,0x3c,0xb2,0x7c,0xbe,0x3b,0x80,0xad,0x24,0x3c,0x51,0xbd,0xdb,0x3b,0xb3,0xff,0xc2,0x3b,0x86,0xbc,0xee,0x3b,0x59,0xcb,0xed,0x3b,0xbb,0x7f,0x2c,0x3c,0x49,0xb7,0x16,0x3c,0xc3,0xea,0xd4,0x3b,0x45,0xed,0xbf,0x3b,0x83,0x67,0x18,0x3c,0xa5,0x1b,0x0d,0x3c,0x08,0x5c,0x25,0x3c,0x1d,0x17,0x08,0x3c,0x5f,0xdc,0x04,0x3c,0xd5,0x0b,0x0b,0x3c,0xac,0x9d,0x16,0x3c,0xfb,0x22,0xdb,0x3b,0xd0,0xb7,0xee,0x3b,0xa7,0x22,0x11,0x3c,0x89,0x0d,0x20,0x3c,0x8f,0x3f,0xb2,0x3b,0x5b,0x72,0xce,0x3b,0x76,0x21,0xb6,0x3b,0x9b,0x02,0xc9,0x3b,0xdb,0xa3,0xeb,0x3b,0xd3,0xde,0x03,0x3c,0x52,0xde,0x07,0x3c,0x56,0xd8,0x30,0x3c,0x4b,0xd2,0xff,0x3b,0x7d,0x2b,0x52,0x3c,0xca,0x87,0x33,0x3c,0xf1,0xe7,0x0d,0x3c,0xc2,0x0c,0x01,0x3c,0xbc,0x93,0xd6,0x3b,0x9d,0xfc,0xe5,0x3b,0x11,0x90,0xf2,0x3b,0x0f,0xa2,0xff,0x3b,0xfc,0x7a,0x08,0x3c,0x34,0x8b,0x2d,0x3c,0x7b,0xef,0xfe,0x3b,0xe9,0x05,0xe5,0x3b,0x35,0x65,0xde,0x3b,0xcf,0xc6,0xd8,0x3b,0xc4,0xe0,0xa9,0x3b,0xb6,0x87,0x13,0x3c,0x08,0x17,0x2f,0x3c,0x12,0x77,0xdc,0x3b,0xf8,0xfd,0xdf,0x3b,0xed,0xee,0xe4,0x3b,0x3e,0xab,0x23,0x3c,0x4c,0xac,0xb6,0x3b,0xae,0x28,0xfc,0x3b,0x63,0x1d,0x3b,0x3c,0x21,0x45,0x02,0x3c,0x58,0xca,0x4f,0x3c,0x5f,0x9b,0x28,0x3c,0xf0,0x2a,0x1d,0x3c,0x20,0x20,0xd9,0x3b,0xda,0xa2,0x18,0x3c,0x5b,0x63,0x0b,0x3c,0x97,0x50,0x0d,0x3c,0x77,0xd5,0xcb,0x3b,0xfb,0xc4,0x1c,0x3c,0xa6,0x4a,0xdd,0x3b,0x1d,0x2b,0xf4,0x3b,0x71,0xcd,0x08,0x3c,0xd3,0x09,0xf9,0x3b,0x36,0x59,0xc5,0x3b,0x51,0x4a,0x04,0x3c,0x93,0xca,0x2f,0x3c,0x80,0x6e,0xf5,0x3b,0xed,0x35,0x25,0x3c,0x52,0xc5,0xdb,0x3b,0x0a,0x34,0x26,0x3c,0x9a,0x17,0xeb,0x3b,0xd1,0xac,0xb9,0x3b,0x9b,0xc2,0x0a,0x3c,0xff,0x69,0x2e,0x3c,0x57,0x4d,0xef,0x3b,0x7b,0x6c,0x10,0x3c,0x6e,0xe2,0xe8,0x3b,0xde,0x4e,0xcb,0x3b,0xf6,0xd9,0xdc,0x3b,0x71,0xf7,0x07,0x3c,0xe5,0x80,0x49,0x3c,0xd1,0xee,0x0b,0x3c,0x09,0xbc,0x02,0x3c,0x52,0xeb,0x0f,0x3c,0x42,0x61,0x16,0x3c,0xf3,0xd2,0xcc,0x3b,0xec,0x81,0xe8,0x3b,0xe0,0x2e,0x15,0x3c,0x0e,0x34,0x1f,0x3c,0xd3,0x49,0xf9,0x3b,0x1c,0x03,0x01,0x3c,0x77,0x8f,0xe5,0x3b,0xd6,0x2c,0x09,0x3c,0xe1,0x22,0xdd,0x3b,0x04,0xb9,0xa9,0x3b,0x2f,0x2a,0x1b,0x3c,0x87,0x2f,0x32,0x3c,0x91,0xb7,0xcc,0x3b,0x5e,0x47,0xf7,0x3b,0xbf,0x49,0xd2,0x3b,0x85,0x5b,0x03,0x3c,0xd4,0x9d,0x9b,0x3b,0x6f,0x85,0xc9,0x3b,0xb4,0xa9,0x02,0x3c,0x46,0xe9,0x18,0x3c,0x41,0x05,0x52,0x3c,0x03,0x46,0xe3,0x3b,0x80,0x38,0x0f,0x3c,0x2c,0x2b,0x30,0x3c,0x43,0x27,0xbe,0x3b,0x53,0x47,0xf1,0x3b,0x11,0xc6,0x05,0x3c,0x6a,0xaf,0x07,0x3c,0x8f,0x63,0x3f,0x3c,0xe3,0x24,0x1d,0x3c,0x52,0x51,0x65,0x3c,0xc7,0x39,0xcf,0x3b,0x93,0x31,0xd6,0x3b,0x15,0x97,0x06,0x3c,0x6d,0xc8,0x0b,0x3c,0xa8,0x32,0x07,0x3c,0xdb,0x3e,0xc9,0x3b,0xec,0x7d,0xb1,0x3b,0xc5,0xee,0xce,0x3b,0x3a,0xb1,0x90,0x3b,0x99,0x5a,0xd2,0x3b,0x36,0xe0,0x1c,0x3c,0xd3,0xaf,0x08,0x3c,0x00,0xed,0x2b,0x3c,0x61,0xd2,0x6a,0x3c,0x43,0x53,0xdc,0x3b,0xd1,0x7a,0x19,0x3c,0x14,0x4d,0x24,0x3c,0xf6,0xfb,0x0b,0x3c,0x20,0xc4,0x10,0x3c,0x6e,0x6c,0x12,0x3c,0xdb,0x71,0x1e,0x3c,0x3f,0xad,0x02,0x3c,0x24,0x6d,0xa5,0x3b,0x0e,0x74,0x39,0x3c,0xc7,0xfe,0x15,0x3c,0xe8,0x69,0xdc,0x3b,0xdd,0x24,0x0c,0x3c,0x47,0x57,0x04,0x3c,0xcf,0xf3,0xf9,0x3b,0x13,0xfc,0xef,0x3b,0x62,0xc3,0x1c,0x3c,0x02,0x45,0xfa,0x3b,0x0d,0xfd,0xf1,0x3b,0x71,0x8b,0x9c,0x3b,0xd7,0xab,0xc9,0x3b,0x28,0x5d,0x14,0x3c,0xe5,0x71,0xe6,0x3b,0x3a,0xa1,0x1b,0x3c,0x49,0xcc,0xf8,0x3b,0x92,0xcd,0xf9,0x3b,0x73,0xec,0x24,0x3c,0x9d,0xa1,0x80,0x3c,0xc1,0x94,0xb5,0x3b,0xbf,0x58,0x17,0x3c,0xe1,0xcb,0x05,0x3c,0x7d,0xff,0xe4,0x3b,0xe8,0x2b,0x32,0x3c,0x0f,0x99,0x22,0x3c,0x2b,0xf6,0xc9,0x3b,0x7d,0xec,0x44,0x3c,0xe6,0x63,0x20,0x3c,0xf5,0x7a,0x17,0x3c,0x3d,0xc2,0x26,0x3c,0x5f,0xaa,0xf2,0x3b,0x72,0x06,0xc5,0x3b,0xdb,0x1d,0xcd,0x3b,0x9c,0x43,0x81,0x3c,0xac,0x2f,0x2a,0x3c,0x80,0xfb,0x46,0x3c,0xfe,0x9f,0xe5,0x3b,0x74,0x85,0x0a,0x3c,0x38,0x1d,0x16,0x3c,0xd1,0x3e,0xd8,0x3b,0x6a,0x95,0xb1,0x3b,0xf7,0x07,0xf9,0x3b,0x82,0x05,0xab,0x3b,0xaf,0xe3,0xda,0x3b,0x7a,0xeb,0xc9,0x3b,0x56,0x85,0x14,0x3c,0x58,0x82,0x39,0x3c,0xed,0xc7,0x27,0x3c,0xfa,0x26,0x31,0x3c,0xdd,0x03,0x0d,0x3c,0x82,0x66,0xbb,0x3b,0xc3,0xbb,0xb2,0x3b,0xf1,0xf7,0x28,0x3c,0x71,0x80,0xa1,0x3b,0x16,0x27,0x01,0x3c,0xfa,0x22,0x04,0x3c,0xf8,0xb6,0x47,0x3c,0x33,0x46,0x2b,0x3c,0x65,0xcf,0xe1,0x3b,0x78,0x79,0xe7,0x3b,0xd3,0x9a,0xfa,0x3b,0x87,0x41,0x00,0x3c,0xf2,0x4e,0x17,0x3c,0x95,0xa9,0x29,0x3c,0x8f,0x50,0x12,0x3c,0xa3,0x7b,0xe0,0x3b,0xf2,0xc9,0x02,0x3c,0x4b,0x4f,0xb2,0x3b,0xcc,0x25,0x26,0x3c,0xfc,0x07,0x1a,0x3c,0xea,0x97,0x05,0x3c,0x0a,0x9b,0x29,0x3c,0xfe,0x65,0xf8,0x3b,0xac,0x80,0x0a,0x3c,0xaf,0x6f,0xed,0x3b,0x86,0xda,0xc8,0x3b,0xd3,0xf7,0x03,0x3c,0xf3,0x08,0x10,0x3c,0x4f,0x69,0x53,0x3c,0xad,0xc6,0x10,0x3c,0xf6,0x7a,0xe5,0x3b,0x23,0x52,0x1e,0x3c,0xc8,0xcc,0x42,0x3c,0x1b,0x64,0xc9,0x3b,0xa6,0x6c,0x29,0x3c,0xaa,0x9b,0xda,0x3b,0x69,0x72,0x01,0x3c,0x59,0xba,0xe2,0x3b,0xe1,0x4e,0x25,0x3c,0x79,0x3b,0xdb,0x3b,0xed,0x7a,0xb3,0x3b,0xa5,0x7d,0xf5,0x3b,0x9f,0xbf,0x14,0x3c,0x7f,0x81,0x29,0x3c,0x04,0xff,0x0b,0x3c,0x81,0x0d,0x22,0x3c,0x91,0xd2,0x17,0x3c,0xca,0x1c,0x19,0x3c,0x04,0x31,0x1e,0x3c,0xc5,0x42,0xed,0x3b,0x29,0xb5,0xaa,0x3b,0x88,0xb8,0x0e,0x3c,0xad,0x1b,0xc6,0x3b,0xc5,0x74,0xff,0x3b,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x33,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x92,0xd9,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x0c,0x00,0x00,0x45,0x00,0x00,0x00,0x1c,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xe0,0xff,0xff,0x0c,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xcc,0xe1,0x0f,0x3b,0x17,0x4c,0xbf,0x3a,0x04,0x03,0xea,0x3a,0xcc,0xf3,0xde,0x3a,0x10,0xa3,0x4e,0x3b,0x00,0x59,0xe0,0x3a,0x5d,0xde,0x29,0x3b,0x21,0x80,0x2c,0x3b,0xf8,0x74,0xea,0x3a,0x02,0xe3,0x05,0x3b,0xd8,0xb1,0x03,0x3b,0x77,0x53,0xfd,0x3a,0x96,0x88,0xc9,0x3a,0x58,0x58,0x0c,0x3b,0xfb,0x10,0x5b,0x3b,0x2a,0xf4,0x17,0x3b,0x46,0x1e,0x26,0x3b,0xb2,0x20,0xc5,0x3a,0x1a,0x6e,0x06,0x3b,0x2a,0x57,0x05,0x3b,0x67,0xf5,0x2d,0x3b,0xd0,0x2c,0x02,0x3b,0x8a,0xf5,0xf7,0x3a,0x38,0x73,0xdd,0x3a,0xa1,0xb8,0x0e,0x3b,0xea,0x08,0x28,0x3b,0x48,0x78,0x0f,0x3b,0x07,0x63,0x25,0x3b,0x81,0x6d,0xe8,0x3a,0x25,0xc8,0x03,0x3b,0x00,0xb7,0xb3,0x3a,0xaf,0xa6,0x1a,0x3b,0x7f,0x56,0x0c,0x3b,0x89,0x65,0x07,0x3b,0xb5,0xae,0xbe,0x3a,0xb4,0xee,0xfa,0x3a,0x1a,0x88,0x5f,0x3b,0xc9,0x6f,0xfa,0x3a,0x32,0xb8,0xc5,0x3a,0x72,0x60,0x28,0x3b,0xd9,0x9d,0x29,0x3b,0x83,0xf8,0x06,0x3b,0x24,0xb0,0x03,0x3b,0xb8,0x11,0xdd,0x3a,0xce,0x34,0xf2,0x3a,0x77,0x44,0xfb,0x3a,0x2c,0x3e,0xe5,0x3a,0xe8,0xbe,0xe4,0x3a,0x8b,0x3f,0x36,0x3b,0x80,0x2c,0x12,0x3b,0xb1,0x7a,0x09,0x3b,0x83,0x16,0xc6,0x3a,0x47,0xcc,0x22,0x3b,0xcb,0xa5,0xf7,0x3a,0xab,0x7e,0x0d,0x3b,0x22,0x3e,0x0c,0x3b,0xcd,0xc2,0x22,0x3b,0x5a,0x8b,0xfb,0x3a,0x20,0x95,0xd0,0x3a,0x05,0x9e,0x06,0x3b,0x23,0x35,0xd0,0x3a,0xb1,0x27,0x21,0x3b,0x08,0x8b,0xc1,0x3a,0x65,0x3d,0x0d,0x3b,0x1f,0xf2,0x2e,0x3b,0x7c,0x69,0x0f,0x3b,0x4d,0x9d,0x09,0x3b,0xcd,0x8f,0x0f,0x3b,0xe6,0x71,0xc8,0x3a,0x9e,0x28,0x06,0x3b,0x08,0x80,0x00,0x3b,0x80,0x15,0xff,0x3a,0xf1,0x34,0x47,0x3b,0x74,0x20,0x06,0x3b,0xfe,0x06,0x03,0x3b,0xb7,0x7a,0xd7,0x3a,0x6e,0xe4,0x13,0x3b,0xe9,0x3e,0x02,0x3b,0x31,0xd5,0x24,0x3b,0xef,0x18,0x9f,0x3b,0x1c,0xc8,0x46,0x3b,0xb3,0xd3,0xc8,0x3a,0x50,0xef,0x1d,0x3b,0xcc,0x59,0x99,0x3a,0xce,0xc6,0xdd,0x3a,0x4a,0xde,0x92,0x3a,0xe4,0x27,0x1e,0x3b,0xef,0x9f,0x49,0x3b,0xa4,0xf2,0xcc,0x3a,0x36,0x46,0x25,0x3b,0x41,0xb3,0x23,0x3b,0xb6,0x32,0x3f,0x3b,0xb2,0xc5,0x07,0x3b,0x26,0x07,0x38,0x3b,0x43,0xe2,0x1c,0x3b,0xa7,0xe0,0x18,0x3b,0x6e,0xdd,0xff,0x3a,0x2f,0xb9,0xff,0x3a,0x2d,0x2f,0x14,0x3b,0x8b,0xf0,0x0b,0x3b,0x08,0x83,0x08,0x3b,0x06,0x5b,0x0b,0x3b,0x94,0x3a,0xc8,0x3a,0x24,0x24,0xe9,0x3a,0x9a,0x87,0x0f,0x3b,0x64,0xd1,0x07,0x3b,0xdf,0xe5,0xda,0x3a,0x3a,0x00,0xe6,0x3a,0xe1,0x2c,0x42,0x3b,0x6c,0x54,0xe0,0x3a,0x0b,0xe9,0x0e,0x3b,0xfd,0xe2,0xe6,0x3a,0xff,0xeb,0x16,0x3b,0x57,0xf1,0x4d,0x3b,0xe4,0xb3,0xb0,0x3a,0x63,0x93,0xf0,0x3a,0xaf,0x4e,0x48,0x3b,0xb4,0x9a,0x2c,0x3b,0xa1,0x6f,0x20,0x3b,0x19,0x20,0x29,0x3b,0x73,0x22,0x0a,0x3b,0x61,0xa8,0x1f,0x3b,0x17,0xb5,0xd9,0x3a,0xa5,0xd2,0xee,0x3a,0xa7,0xe1,0xfe,0x3a,0x10,0xbd,0xf6,0x3a,0xdd,0x6f,0xd7,0x3a,0x21,0xd4,0xf3,0x3a,0x19,0xf4,0xd9,0x3a,0x08,0x84,0x0c,0x3b,0x92,0x7c,0xfc,0x3a,0xb5,0x3a,0x18,0x3b,0x34,0xe2,0xea,0x3a,0x0e,0xc1,0x04,0x3b,0xc4,0xee,0x56,0x3b,0x9c,0xd0,0xe8,0x3a,0x87,0x38,0x05,0x3b,0xde,0x41,0xb7,0x3a,0x0b,0xba,0xa9,0x3a,0xeb,0xb4,0x01,0x3b,0x7f,0x46,0xe2,0x3a,0x03,0x5e,0x23,0x3b,0x56,0x83,0xe6,0x3a,0xbd,0xab,0x09,0x3b,0xe0,0x54,0x23,0x3b,0xd5,0xb0,0x3d,0x3b,0xaa,0xb2,0x2f,0x3b,0x18,0xcd,0x2d,0x3b,0x26,0xf2,0xda,0x3a,0x8c,0x2e,0x03,0x3b,0x79,0x49,0x06,0x3b,0xf3,0x28,0xfa,0x3a,0x38,0x2a,0x1a,0x3b,0x36,0x54,0xbe,0x3a,0xbb,0x2b,0x12,0x3b,0xf7,0xba,0x4f,0x3b,0xed,0x4b,0x12,0x3b,0x7b,0xaa,0x1c,0x3b,0xa6,0xba,0x1a,0x3b,0x6f,0x3f,0x11,0x3b,0x7e,0x33,0x0f,0x3b,0xcf,0x1e,0x09,0x3b,0xf9,0xac,0xec,0x3a,0x1a,0x14,0xb5,0x3a,0x41,0x60,0xe4,0x3a,0x9d,0x2e,0x22,0x3b,0x22,0x15,0x22,0x3b,0x61,0xc5,0x2c,0x3b,0x5f,0x52,0xd6,0x3a,0x2c,0x54,0x28,0x3b,0x83,0x55,0x4a,0x3b,0xce,0x9d,0x46,0x3b,0x50,0xc7,0xfa,0x3a,0x57,0xce,0xfd,0x3a,0x66,0x9f,0x28,0x3b,0x6b,0x4d,0xe2,0x3a,0xed,0x62,0x0e,0x3b,0x0a,0xec,0xf5,0x3a,0x91,0xb2,0x08,0x3b,0x71,0xf2,0x25,0x3b,0x6f,0xc9,0x06,0x3b,0x55,0x88,0x09,0x3b,0x81,0xd6,0x52,0x3b,0x97,0xa1,0xf7,0x3a,0x63,0x44,0xf0,0x3a,0x94,0x6b,0xf8,0x3a,0xde,0x51,0x01,0x3b,0x22,0xef,0xf4,0x3a,0x2d,0x9c,0x0b,0x3b,0x08,0xb3,0x39,0x3b,0xb9,0x83,0xff,0x3a,0x55,0x0d,0xfb,0x3a,0x8c,0x07,0x11,0x3b,0xff,0x16,0xc1,0x3a,0x0d,0xee,0x06,0x3b,0xb2,0x17,0x08,0x3b,0x31,0x4b,0xfc,0x3a,0xda,0x5e,0x2f,0x3b,0x60,0x7f,0x24,0x3b,0x3d,0xbb,0x2c,0x3b,0xe3,0xa9,0x1b,0x3b,0x99,0x25,0x16,0x3b,0x32,0x5c,0x29,0x3b,0xe2,0x6c,0x36,0x3b,0x1e,0x20,0xc0,0x3a,0x74,0xbd,0x32,0x3b,0x83,0xdf,0xf6,0x3a,0xf2,0x4d,0x1d,0x3b,0xfd,0xe6,0x1d,0x3b,0xc8,0x3a,0xed,0x3a,0x85,0x4f,0x20,0x3b,0x49,0x58,0xd3,0x3a,0xc5,0x4e,0x06,0x3b,0x36,0xee,0x28,0x3b,0x6f,0xca,0xdb,0x3a,0xe4,0x35,0x09,0x3b,0x1f,0xbb,0x28,0x3b,0x4c,0x89,0x00,0x3b,0x0c,0x8d,0x0f,0x3b,0x8e,0x74,0x13,0x3b,0x5b,0xf4,0x2e,0x3b,0x93,0xe0,0x4b,0x3b,0x14,0xc6,0x09,0x3b,0x07,0xf0,0x0a,0x3b,0x3c,0x54,0x1f,0x3b,0xda,0x01,0xbb,0x3a,0x59,0x9c,0xe8,0x3a,0xc7,0xea,0x0b,0x3b,0x15,0x88,0xf2,0x3a,0xbc,0xc3,0xd8,0x3a,0xcc,0xd6,0x14,0x3b,0xca,0x60,0x34,0x3b,0xf9,0x7f,0x00,0x3b,0x31,0xf8,0x07,0x3b,0x2d,0xac,0x26,0x3b,0x02,0x10,0xda,0x3a,0x58,0xdc,0xda,0x3a,0x65,0x3b,0x05,0x3b,0x73,0xa1,0x21,0x3b,0x2b,0xb1,0x0d,0x3b,0xf2,0xf7,0xe2,0x3a,0x82,0xc1,0xc3,0x3a,0xc7,0xf2,0x10,0x3b,0x42,0xf2,0x47,0x3b,0x33,0x3b,0xf1,0x3a,0x76,0x6e,0x20,0x3b,0x97,0x5b,0x07,0x3b,0xe8,0x6b,0x11,0x3b,0xd3,0xdb,0x21,0x3b,0x8b,0x09,0x38,0x3b,0xd7,0x22,0x0d,0x3b,0x39,0xa9,0xfe,0x3a,0x1b,0xf3,0xe6,0x3a,0x15,0x3e,0x06,0x3b,0x21,0xeb,0x4a,0x3b,0xf3,0x97,0x43,0x3b,0x2c,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x32,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x06,0xe6,0xff,0xff,0x00,0x00,0x00,0x09,0x68,0x06,0x00,0x00,0x0a,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x62,0xdf,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x8d,0xb0,0x3b,0xf3,0x87,0x95,0x3b,0xa0,0x61,0x06,0x3c,0xc6,0x88,0xd8,0x3b,0xb8,0x1d,0x17,0x3c,0x2e,0x80,0x8f,0x3b,0x95,0xd1,0xac,0x3b,0x02,0x8b,0xdb,0x3b,0x0e,0xd5,0x96,0x3b,0x56,0x45,0x0b,0x3c,0x29,0xf1,0xbf,0x3b,0x33,0x80,0x9e,0x3b,0x84,0xdd,0xd8,0x3b,0x22,0xca,0xb1,0x3b,0xf4,0xd5,0xa7,0x3b,0x93,0xee,0xcd,0x3b,0x77,0xa4,0x18,0x3c,0x65,0xb4,0xe5,0x3b,0x55,0x8b,0xb9,0x3b,0x5a,0x00,0xac,0x3b,0x00,0x49,0xb3,0x3b,0x1c,0x7b,0x9a,0x3b,0xd6,0x10,0xdc,0x3b,0x6d,0xe7,0xb8,0x3b,0xf0,0x27,0x89,0x3b,0xbb,0x44,0xe0,0x3b,0x85,0xd8,0xbc,0x3b,0xbc,0xf9,0x92,0x3b,0x8e,0xfa,0xed,0x3b,0x55,0x2b,0xd2,0x3b,0x37,0xfc,0xd1,0x3b,0x1b,0xfe,0xfc,0x3b,0x51,0x9b,0xda,0x3b,0xe7,0xb1,0xf2,0x3b,0x15,0x64,0xb1,0x3b,0x84,0x34,0xee,0x3b,0x4e,0x10,0xe6,0x3b,0xc4,0x61,0x7d,0x3b,0x78,0x42,0x91,0x3b,0x45,0xd0,0x13,0x3c,0xe8,0x63,0x83,0x3b,0x9d,0x6f,0x22,0x3c,0x8d,0xd6,0x03,0x3c,0xfe,0x27,0xc2,0x3b,0xda,0x67,0xa9,0x3b,0xe9,0xef,0xc1,0x3b,0xab,0x9b,0x9d,0x3b,0x64,0xad,0x0c,0x3c,0x62,0x44,0xa6,0x3b,0x53,0x87,0xa7,0x3b,0x4d,0xa9,0xa1,0x3b,0x33,0x38,0x92,0x3b,0x1a,0x0d,0xe8,0x3b,0xda,0x1d,0xff,0x3b,0x69,0x33,0xe1,0x3b,0x0d,0xed,0xf5,0x3b,0xa2,0x82,0x93,0x3b,0x59,0x7d,0xdf,0x3b,0x3a,0x5d,0x80,0x3b,0x20,0x50,0xb1,0x3b,0xee,0x64,0xec,0x3b,0xeb,0x2b,0xf1,0x3b,0xa0,0x96,0xc4,0x3b,0x29,0xdc,0x88,0x3b,0x92,0x9b,0xaf,0x3b,0xb9,0x15,0xe6,0x3b,0xad,0x85,0x95,0x3b,0xb2,0x3a,0xc9,0x3b,0xcd,0x48,0xc7,0x3b,0x47,0x5b,0x08,0x3c,0x8d,0x63,0xbe,0x3b,0xa4,0xc0,0x8d,0x3b,0x91,0xf7,0xae,0x3b,0x98,0xdd,0x92,0x3b,0x2c,0xfe,0xb5,0x3b,0x03,0x40,0xad,0x3b,0x76,0x64,0x73,0x3b,0xac,0x52,0xae,0x3b,0x06,0xcc,0xd2,0x3b,0x01,0x7b,0xa0,0x3b,0xac,0x67,0xd4,0x3b,0x2d,0x3a,0xfc,0x3b,0x81,0x8f,0xad,0x3b,0xae,0xc9,0xcb,0x3b,0xc7,0xe3,0xf3,0x3b,0xbf,0xce,0xda,0x3b,0xb6,0x27,0xe2,0x3b,0x05,0xf9,0xb6,0x3b,0x12,0xd2,0x15,0x3c,0x93,0xbc,0xe6,0x3b,0x5e,0x19,0x6e,0x3b,0x4e,0x57,0xe9,0x3b,0x5b,0x8e,0x12,0x3c,0x32,0x9f,0xb8,0x3b,0x10,0x17,0xbd,0x3b,0xde,0xa4,0x0b,0x3c,0x14,0xda,0xa2,0x3b,0x5f,0x00,0xc5,0x3b,0x8f,0xd5,0xcb,0x3b,0xff,0xb6,0xa1,0x3b,0x97,0x44,0x09,0x3c,0x7e,0x30,0x18,0x3c,0x52,0xa2,0x22,0x3c,0xcd,0xfe,0xa5,0x3b,0x30,0xec,0xd4,0x3b,0xfc,0xfa,0xa5,0x3b,0xab,0x8d,0x08,0x3c,0x4e,0xe2,0xc5,0x3b,0x83,0x80,0xb6,0x3b,0xbf,0xbc,0x30,0x3c,0x53,0xc1,0xf5,0x3b,0x13,0x74,0xa2,0x3b,0x7a,0x61,0xcb,0x3b,0xf9,0xc9,0xbc,0x3b,0x84,0x85,0xc4,0x3b,0x95,0x6e,0xc7,0x3b,0xf0,0x90,0x13,0x3c,0xcc,0x3e,0xcf,0x3b,0xb6,0xd3,0x88,0x3b,0x08,0x19,0x9b,0x3b,0xb5,0x8b,0xdc,0x3b,0xae,0xe0,0x80,0x3b,0xdf,0x38,0xb4,0x3b,0xd6,0x74,0x22,0x3c,0xb8,0xec,0x4b,0x3b,0xb0,0x1f,0xa9,0x3b,0xe2,0x3e,0x0c,0x3c,0x3a,0xe1,0x05,0x3c,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x32,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x8a,0xec,0xff,0xff,0x00,0x00,0x00,0x09,0x58,0x06,0x00,0x00,0x0c,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0xf3,0xff,0xff,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xd7,0x8a,0x53,0x3b,0x38,0xdb,0x39,0x3b,0x26,0x99,0x4d,0x3b,0x6c,0xd5,0x12,0x3b,0xcc,0x46,0x25,0x3b,0x4b,0x9a,0xe8,0x3a,0xd1,0xff,0x27,0x3b,0xc5,0x60,0x07,0x3b,0x66,0xaa,0x0e,0x3b,0x2a,0x4d,0x06,0x3b,0x7e,0x98,0x08,0x3b,0xd2,0x44,0x29,0x3b,0x8c,0x7b,0x39,0x3b,0xf6,0xdc,0x01,0x3b,0x1f,0xea,0x21,0x3b,0xd0,0x34,0x02,0x3b,0x98,0x0b,0x59,0x3b,0x6c,0x69,0x35,0x3b,0x68,0x68,0xfc,0x3a,0x47,0x6b,0x1b,0x3b,0x45,0x2b,0x20,0x3b,0xb1,0x7a,0x01,0x3b,0x95,0x2e,0x0f,0x3b,0x66,0x5b,0x27,0x3b,0xe6,0x6e,0x4e,0x3b,0x5e,0xac,0x0d,0x3b,0x30,0x90,0x22,0x3b,0x54,0x9e,0x2d,0x3b,0xc8,0x19,0xea,0x3a,0x8e,0x3c,0x23,0x3b,0x65,0x70,0x25,0x3b,0xf4,0x79,0x14,0x3b,0x29,0x49,0x13,0x3b,0xfc,0x2a,0x40,0x3b,0x5c,0x34,0x3b,0x3b,0x2a,0x52,0xf8,0x3a,0x6e,0x51,0x18,0x3b,0x53,0x24,0xf6,0x3a,0x33,0x76,0x24,0x3b,0x60,0xdf,0x0f,0x3b,0xc5,0x27,0x0d,0x3b,0xfb,0x7e,0x37,0x3b,0xa8,0x98,0x10,0x3b,0x37,0xf8,0x30,0x3b,0x0b,0xda,0x61,0x3b,0x7d,0x9b,0x4a,0x3b,0xa1,0xd6,0x0e,0x3b,0x33,0x87,0x27,0x3b,0x23,0x9d,0x40,0x3b,0x39,0xec,0x20,0x3b,0xef,0xfa,0x06,0x3b,0x9c,0x98,0x0d,0x3b,0x47,0x53,0x03,0x3b,0x99,0x43,0x1d,0x3b,0x08,0xe1,0x01,0x3b,0x70,0x34,0x14,0x3b,0xae,0xfd,0x61,0x3b,0xeb,0xc0,0x0e,0x3b,0x12,0x1f,0x21,0x3b,0xf5,0xba,0x03,0x3b,0x19,0xb4,0x17,0x3b,0x36,0x92,0x2d,0x3b,0x4f,0xbd,0x36,0x3b,0xb0,0x11,0x20,0x3b,0x62,0x00,0x52,0x3b,0x8e,0x5e,0x1c,0x3b,0x9a,0x5c,0x20,0x3b,0x2f,0xc8,0x1a,0x3b,0x86,0xf1,0x2c,0x3b,0x26,0x6d,0x13,0x3b,0x2a,0x7a,0xfa,0x3a,0xa6,0x9d,0x10,0x3b,0xb7,0xd3,0x0e,0x3b,0xa1,0xd2,0x3e,0x3b,0xe1,0x4e,0x0b,0x3b,0xa4,0x34,0x1c,0x3b,0x23,0x67,0xe9,0x3a,0x8c,0xb7,0xef,0x3a,0x58,0x7c,0x30,0x3b,0x75,0x25,0x22,0x3b,0xce,0x58,0x81,0x3b,0x37,0x05,0x77,0x3b,0xa9,0xc4,0x22,0x3b,0xfd,0x03,0x32,0x3b,0x64,0xd1,0x06,0x3b,0xb2,0x45,0x11,0x3b,0x69,0xf3,0xf1,0x3a,0xb1,0xda,0x02,0x3b,0x36,0xa0,0x42,0x3b,0x2c,0x4e,0x45,0x3b,0x04,0xbf,0x0c,0x3b,0x8e,0x3a,0x46,0x3b,0x07,0xad,0x3e,0x3b,0x82,0xcf,0x06,0x3b,0xdc,0xa6,0xe6,0x3a,0x11,0xf5,0x10,0x3b,0x09,0xef,0xf3,0x3a,0x6d,0x02,0x11,0x3b,0xcf,0x6f,0xff,0x3a,0x0a,0xb6,0x6e,0x3b,0x01,0x9d,0x25,0x3b,0x2e,0x1a,0x25,0x3b,0xc7,0xa8,0x34,0x3b,0x9e,0x30,0x24,0x3b,0xe5,0x89,0xe8,0x3a,0x9e,0x0e,0x3b,0x3b,0xcf,0x03,0x0d,0x3b,0xcf,0xa9,0x37,0x3b,0xde,0xee,0x1e,0x3b,0x00,0x9d,0x08,0x3b,0x9a,0xc3,0x30,0x3b,0xcd,0xb2,0x14,0x3b,0x32,0xbe,0x29,0x3b,0x1e,0x0a,0x0e,0x3b,0xb9,0x86,0x1c,0x3b,0x69,0x25,0x1d,0x3b,0x3d,0xf6,0x33,0x3b,0x41,0x5e,0x04,0x3b,0xb0,0x40,0x35,0x3b,0xa8,0x47,0x16,0x3b,0xfa,0x67,0x22,0x3b,0x0d,0x6a,0x01,0x3b,0x9d,0xdb,0x0d,0x3b,0x71,0xc1,0x45,0x3b,0xe3,0xb3,0x05,0x3b,0x50,0xf0,0x23,0x3b,0xe0,0xfa,0x4c,0x3b,0xb7,0xaa,0x1d,0x3b,0x2c,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x31,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xfe,0xf2,0xff,0xff,0x00,0x00,0x00,0x09,0x64,0x06,0x00,0x00,0x0d,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x5a,0xec,0xff,0xff,0x10,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x60,0xb4,0xc7,0x3b,0xf2,0x84,0xdd,0x3b,0x43,0xf1,0x08,0x3c,0x44,0xaf,0xbc,0x3b,0x85,0x80,0xa0,0x3b,0xa1,0xa5,0xa5,0x3b,0xa5,0x21,0xd8,0x3b,0x03,0xc9,0x0a,0x3c,0x16,0x3b,0xe2,0x3b,0x28,0xd7,0x17,0x3c,0xd1,0x70,0x14,0x3c,0x68,0x0a,0xc2,0x3b,0x88,0xea,0x03,0x3c,0x4b,0xd8,0x27,0x3c,0xf2,0x2b,0xdb,0x3b,0x1b,0x19,0x93,0x3b,0x08,0x5a,0xfe,0x3b,0x1d,0x52,0xa1,0x3b,0xa4,0x8d,0xa9,0x3b,0x15,0x51,0x38,0x3b,0xe8,0xaf,0xb7,0x3b,0x20,0xf5,0xe2,0x3b,0xad,0xb9,0x5c,0x3b,0xd7,0x58,0xc7,0x3b,0x4d,0xf2,0xdc,0x3b,0x09,0x90,0xd8,0x3b,0xa0,0x21,0x26,0x3c,0xa6,0x94,0x2a,0x3c,0x34,0xde,0x15,0x3c,0x96,0xa8,0x0e,0x3c,0xec,0xf1,0x62,0x3b,0x86,0x75,0xef,0x3b,0xd2,0x3d,0xf7,0x3b,0x06,0xfb,0xfb,0x3b,0xff,0xaf,0xa9,0x3b,0x84,0xaf,0xee,0x3b,0xed,0x73,0x92,0x3b,0x26,0xd9,0xc9,0x3b,0xf0,0xe3,0x4d,0x3c,0x54,0x6d,0xae,0x3b,0x95,0xb2,0xf4,0x3b,0x4c,0x06,0x10,0x3c,0xc9,0x2c,0x26,0x3c,0xf4,0x94,0xac,0x3b,0xb6,0x91,0x8f,0x3b,0xb3,0x7f,0x96,0x3b,0xd8,0x26,0xda,0x3b,0x22,0xf7,0xd5,0x3b,0x2f,0x36,0xf2,0x3b,0x4f,0x35,0xae,0x3b,0xbd,0xf4,0x9f,0x3b,0x57,0xea,0xeb,0x3b,0x0f,0xd9,0xc7,0x3b,0xa2,0xdb,0xf5,0x3b,0x53,0x20,0xce,0x3b,0x79,0x60,0x31,0x3c,0x20,0x91,0xb4,0x3b,0xbc,0x23,0x15,0x3c,0x83,0x1a,0xf2,0x3b,0x09,0x71,0xc9,0x3b,0xf6,0x17,0xb0,0x3b,0x9d,0xc6,0xc5,0x3b,0x71,0x97,0x22,0x3c,0x2c,0x9e,0xf8,0x3b,0xc9,0x79,0x15,0x3c,0x0a,0xfe,0xaa,0x3b,0x83,0x58,0xa0,0x3b,0xbc,0x63,0x9c,0x3b,0x43,0x51,0xa5,0x3b,0x33,0xe5,0xe2,0x3b,0x3f,0xb3,0xd8,0x3b,0xe6,0xe2,0xbf,0x3b,0xce,0xed,0xe9,0x3b,0xdb,0x3f,0xa1,0x3b,0xec,0x47,0xc7,0x3b,0x9d,0xa7,0xc5,0x3b,0x2e,0xab,0x03,0x3c,0xfd,0x97,0xf0,0x3b,0x61,0x09,0x08,0x3c,0x4c,0xe2,0xfb,0x3b,0x9b,0x41,0xa7,0x3b,0xbb,0xb0,0x9f,0x3b,0x6c,0xb1,0xd0,0x3b,0x35,0x03,0x71,0x3b,0x63,0x93,0xc3,0x3b,0xbe,0xfd,0xda,0x3b,0x99,0xfe,0xfa,0x3b,0xa3,0x6f,0x36,0x3c,0xf2,0x06,0xec,0x3b,0x05,0xbd,0x92,0x3b,0x13,0xea,0x15,0x3c,0xbf,0xa8,0xd0,0x3b,0xf5,0x2f,0xf8,0x3b,0xb9,0xd4,0x2a,0x3c,0x3d,0x35,0x1f,0x3c,0x24,0xb2,0x2c,0x3c,0x49,0x7c,0x1a,0x3c,0x55,0x86,0xdf,0x3b,0xd6,0xb4,0x98,0x3b,0x78,0x8e,0xd0,0x3b,0xa1,0x51,0xe4,0x3b,0xa4,0x60,0x92,0x3b,0x8e,0x86,0x48,0x3b,0xdc,0xc6,0xe7,0x3b,0x21,0xaf,0xeb,0x3b,0xfb,0x7b,0x20,0x3c,0xf6,0x56,0xf9,0x3b,0x14,0xbc,0x29,0x3c,0x1e,0xf5,0xca,0x3b,0x33,0x5f,0x14,0x3c,0xe1,0x61,0x8a,0x3b,0x37,0xdf,0x9f,0x3b,0x5b,0x1b,0xff,0x3b,0x0b,0x7f,0xbc,0x3b,0x9d,0xcd,0xc8,0x3b,0xe2,0xe4,0xdf,0x3b,0x03,0x51,0xc9,0x3b,0xf8,0x18,0xc1,0x3b,0x70,0xe5,0x20,0x3c,0x96,0xfb,0xf6,0x3b,0x78,0x83,0xf1,0x3b,0xe9,0x4e,0xcd,0x3b,0xd1,0x25,0xb4,0x3b,0x38,0xa5,0xe8,0x3b,0xc7,0x84,0x12,0x3c,0xbd,0xb1,0x20,0x3c,0x2f,0xa2,0x35,0x3c,0x03,0xee,0x0d,0x3c,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x31,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x7e,0xf9,0xff,0xff,0x00,0x00,0x00,0x09,0x64,0x06,0x00,0x00,0x0e,0x00,0x00,0x00,0x28,0x06,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xf0,0x76,0x2c,0x3b,0x4c,0x26,0x1e,0x3b,0x2a,0x85,0x1d,0x3b,0xa7,0x53,0x12,0x3b,0xce,0xf3,0x0e,0x3b,0x0f,0x15,0x04,0x3b,0xce,0x92,0xfe,0x3a,0x9b,0xe7,0xe1,0x3a,0x17,0xcf,0x1a,0x3b,0xeb,0x2f,0x31,0x3b,0x15,0xe1,0x66,0x3b,0x5a,0x04,0x38,0x3b,0xd1,0x2f,0x19,0x3b,0xb2,0xf8,0x1b,0x3b,0x63,0x78,0x0e,0x3b,0x80,0x63,0x41,0x3b,0x7e,0x98,0x3d,0x3b,0xeb,0x0f,0x13,0x3b,0x31,0x60,0x2d,0x3b,0xe1,0x7f,0x34,0x3b,0x89,0xa6,0x2d,0x3b,0x18,0x1e,0x57,0x3b,0x35,0xcc,0x1c,0x3b,0x16,0x67,0x29,0x3b,0xa7,0x7d,0x26,0x3b,0x3a,0xee,0x22,0x3b,0x08,0x08,0x62,0x3b,0x04,0xbd,0x19,0x3b,0x44,0x97,0x40,0x3b,0x27,0xea,0x26,0x3b,0x6a,0xdd,0x0d,0x3b,0xe4,0x56,0xfb,0x3a,0x4a,0x5a,0x1f,0x3b,0x5a,0x92,0xff,0x3a,0x1c,0x45,0x32,0x3b,0x3e,0x91,0x28,0x3b,0x93,0x74,0x5c,0x3b,0x1c,0x54,0x27,0x3b,0xd9,0xb5,0x1f,0x3b,0x85,0x55,0x18,0x3b,0x6f,0x0e,0x2f,0x3b,0xae,0x7f,0x16,0x3b,0x6e,0x3d,0x1c,0x3b,0xfc,0x0d,0xf7,0x3a,0x82,0x18,0x1b,0x3b,0xc5,0x09,0x03,0x3b,0xaf,0xb4,0x15,0x3b,0xa9,0xee,0x46,0x3b,0x65,0x6d,0x14,0x3b,0x29,0x75,0x51,0x3b,0x0b,0xf8,0x1c,0x3b,0x61,0xcd,0x5c,0x3b,0x05,0x33,0x2a,0x3b,0xb7,0x1c,0x07,0x3b,0x26,0x72,0x34,0x3b,0x59,0xe7,0x3f,0x3b,0xd6,0xe8,0x21,0x3b,0x8a,0x3a,0x3d,0x3b,0xbe,0xf2,0x1b,0x3b,0x76,0xb4,0x06,0x3b,0xea,0x1b,0xfa,0x3a,0xeb,0x0f,0xf7,0x3a,0x2a,0x56,0x2b,0x3b,0xca,0xc0,0x20,0x3b,0x15,0x3c,0x45,0x3b,0x98,0xbe,0x1d,0x3b,0x8c,0x8d,0x20,0x3b,0xe2,0x44,0x58,0x3b,0x05,0x3b,0x68,0x3b,0x9f,0xf7,0x8a,0x3b,0xe2,0xf0,0xfd,0x3a,0x2b,0xef,0xfa,0x3a,0x8e,0xa7,0x1d,0x3b,0xe6,0xc2,0xea,0x3a,0xf1,0x17,0x30,0x3b,0x55,0x96,0x1d,0x3b,0xf4,0xfe,0x07,0x3b,0x39,0xb3,0xed,0x3a,0x2b,0x40,0xfe,0x3a,0x84,0xa2,0x18,0x3b,0xfc,0x29,0x22,0x3b,0xc9,0xae,0x11,0x3b,0xa5,0x0e,0x2b,0x3b,0x2b,0x0c,0x07,0x3b,0xf0,0x3a,0x49,0x3b,0xdc,0x3e,0x47,0x3b,0x35,0x81,0x1b,0x3b,0x9d,0x0c,0xf2,0x3a,0x95,0xae,0x1b,0x3b,0xe2,0x10,0x18,0x3b,0x85,0x68,0x1d,0x3b,0x74,0x46,0x52,0x3b,0x99,0xbb,0x3a,0x3b,0x28,0xf7,0x44,0x3b,0xb7,0xfe,0x5c,0x3b,0x21,0x04,0x2f,0x3b,0x3b,0x3b,0x38,0x3b,0x92,0x09,0x22,0x3b,0xbd,0xa0,0x08,0x3b,0x60,0xda,0x01,0x3b,0xcd,0xce,0xe3,0x3a,0x59,0x24,0x36,0x3b,0x0a,0x66,0xff,0x3a,0xd4,0x6e,0x07,0x3b,0xb9,0x61,0x17,0x3b,0x38,0xf5,0x24,0x3b,0xd1,0x3e,0x4a,0x3b,0x77,0x2d,0x19,0x3b,0x59,0x7f,0x1b,0x3b,0xb8,0x29,0x0a,0x3b,0xfb,0xa8,0x0c,0x3b,0xdb,0xa3,0x16,0x3b,0x33,0x17,0x30,0x3b,0x9c,0x16,0x51,0x3b,0x91,0x1b,0x3c,0x3b,0x5c,0xfc,0x2a,0x3b,0x81,0xb1,0x0d,0x3b,0x9e,0x42,0x20,0x3b,0x2e,0x0d,0x12,0x3b,0xe0,0x98,0x13,0x3b,0x8e,0x42,0x24,0x3b,0x31,0x04,0x16,0x3b,0x10,0x6b,0x0c,0x3b,0xb9,0xad,0x14,0x3b,0x57,0x5e,0x0b,0x3b,0x52,0x65,0x4b,0x3b,0x2f,0xf2,0x17,0x3b,0x61,0x9a,0x1a,0x3b,0x2c,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x30,0x5f,0x70,0x6f,0x69,0x6e,0x74,0x77,0x69,0x73,0x65,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x08,0x00,0x07,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x68,0x06,0x00,0x00,0x48,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x6a,0xf9,0xff,0xff,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xcb,0x37,0xb8,0x3b,0x43,0xf6,0xc2,0x3b,0x44,0xf2,0xe8,0x3b,0x8f,0xc2,0xca,0x3b,0xc4,0x3c,0xd0,0x3b,0xce,0x26,0xf3,0x3b,0x85,0x6f,0xb5,0x3b,0xa4,0x85,0xd8,0x3b,0xa7,0x2b,0xd0,0x3b,0x9e,0x75,0xa0,0x3b,0x9c,0xc0,0xdb,0x3b,0x19,0x83,0x07,0x3c,0x97,0x4e,0xeb,0x3b,0xa3,0x3c,0x05,0x3c,0x22,0x33,0x26,0x3c,0x87,0xb0,0x8e,0x3b,0x61,0x69,0x09,0x3c,0x2e,0x3d,0xfd,0x3b,0xe0,0x36,0xad,0x3b,0x20,0x8e,0xa4,0x3b,0x5d,0x17,0x01,0x3c,0x10,0x48,0xc9,0x3b,0x1f,0x7e,0x6e,0x3b,0x3c,0x72,0xde,0x3b,0xb7,0xfc,0x1e,0x3c,0x5b,0x4d,0x91,0x3b,0xc7,0x0b,0xb9,0x3b,0x3f,0x6b,0xb1,0x3b,0x11,0x9e,0xe3,0x3b,0x5c,0xec,0x22,0x3c,0xae,0x0f,0xe5,0x3b,0xcc,0xe8,0x71,0x3b,0x80,0x02,0x04,0x3c,0xe1,0xfd,0x00,0x3c,0x34,0xb5,0xc4,0x3b,0x8c,0xb7,0x3a,0x3c,0xde,0xe4,0xaa,0x3b,0x3e,0xfa,0xf0,0x3b,0x4f,0x3f,0x0c,0x3c,0xa8,0xb8,0xa7,0x3b,0xb1,0xb7,0xe1,0x3b,0x81,0x09,0x94,0x3b,0xc6,0xde,0x10,0x3c,0x2f,0xbe,0x2c,0x3c,0xfe,0x65,0x01,0x3c,0x49,0x9a,0x8a,0x3b,0x3d,0x56,0xd7,0x3b,0x21,0x5e,0xc4,0x3b,0x61,0x7d,0x0d,0x3c,0xf9,0x5a,0x89,0x3b,0x69,0xb0,0xe0,0x3b,0x8f,0xa5,0xf7,0x3b,0x76,0x26,0x03,0x3c,0xcb,0x44,0xe1,0x3b,0x28,0x7a,0x8d,0x3b,0xe5,0x1a,0xea,0x3b,0x64,0xdd,0x9c,0x3b,0x57,0xb5,0x70,0x3b,0x22,0xee,0xed,0x3b,0xa3,0x21,0x7c,0x3b,0xaf,0x49,0x8a,0x3b,0x56,0x4a,0xdc,0x3b,0x23,0xe9,0x43,0x3c,0x2c,0x58,0xcb,0x3b,0x12,0xe8,0x9f,0x3b,0xd0,0xd2,0xf4,0x3b,0x96,0x9d,0x9f,0x3b,0x48,0x20,0xea,0x3b,0x63,0x63,0x0f,0x3c,0xd0,0x99,0xd0,0x3b,0x70,0xd2,0xd6,0x3b,0x67,0xb5,0x13,0x3c,0x79,0x9d,0xab,0x3b,0x5b,0x4d,0x73,0x3b,0x2e,0x3a,0x9d,0x3b,0x6a,0x9c,0xc9,0x3b,0x44,0xff,0x8b,0x3b,0x13,0xae,0xae,0x3b,0x28,0x06,0x86,0x3b,0x05,0x59,0xae,0x3b,0x95,0x1e,0xd4,0x3b,0x4a,0x6e,0xa7,0x3b,0xc9,0x7a,0x15,0x3c,0xcb,0x63,0xbe,0x3b,0x82,0x8a,0x6f,0x3b,0x86,0x3f,0xd7,0x3b,0xfb,0xba,0x15,0x3c,0x8f,0xb8,0x1c,0x3c,0xa9,0xf4,0xea,0x3b,0xe2,0x65,0x38,0x3c,0x8b,0x4a,0xd3,0x3b,0xb7,0xae,0xdf,0x3b,0xbb,0x74,0xff,0x3b,0x0c,0x0d,0x92,0x3b,0x2e,0x0c,0x55,0x3c,0xb5,0xf6,0xff,0x3b,0xa5,0x05,0x2f,0x3c,0x95,0xbe,0xbd,0x3b,0xc3,0x7b,0x9e,0x3b,0xe2,0xce,0xda,0x3b,0xe9,0xfd,0xbf,0x3b,0x57,0x1c,0x9b,0x3b,0xf2,0x1f,0x62,0x3b,0x8b,0x89,0xf3,0x3b,0x83,0xb6,0x8a,0x3b,0x4c,0x0f,0xd6,0x3b,0x98,0xc6,0x00,0x3c,0x81,0xd3,0x10,0x3c,0xe8,0x22,0x3b,0x3c,0x0e,0xfa,0x19,0x3c,0x64,0x7e,0xe6,0x3b,0x12,0x99,0xce,0x3b,0x20,0x57,0x99,0x3b,0x51,0xa6,0xe1,0x3b,0x5f,0x8d,0xb7,0x3b,0xce,0xfc,0x86,0x3b,0x17,0x3d,0xdf,0x3b,0xd1,0x68,0xf0,0x3b,0x20,0x38,0xd5,0x3b,0x13,0x4e,0xa1,0x3b,0x6d,0x6f,0x79,0x3b,0x4f,0xf4,0xc3,0x3b,0xbd,0x9f,0x00,0x3c,0x0f,0xa4,0xf4,0x3b,0x6a,0x1f,0x13,0x3c,0xbb,0x81,0x83,0x3b,0xaf,0xc6,0xf5,0x3b,0x5c,0xa1,0xf7,0x3b,0x36,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x31,0x30,0x5f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x5f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x1a,0x00,0x08,0x00,0x07,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xc4,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x12,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0x03,0x86,0x3c,0x60,0xfe,0xd9,0x3c,0xcc,0x1c,0x47,0x3b,0xda,0xcf,0x55,0x3b,0xa8,0x02,0x3d,0x3c,0x15,0x1e,0x19,0x3d,0xbb,0x9a,0x94,0x3c,0x90,0x5f,0x8e,0x3a,0x21,0x00,0x00,0x00,0x4d,0x6f,0x62,0x69,0x6c,0x65,0x6e,0x65,0x74,0x56,0x31,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x64,0x5f,0x30,0x2f,0x77,0x65,0x69,0x67,0x68,0x74,0x73,0x2f,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd6,0xff,0xff,0xff,0x00,0x00,0x00,0x19,0x02,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x07,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xf2,0xff,0xff,0xff,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0e,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,}; +const unsigned int g_person_detect_model_data_size = 300568; \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.h b/components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.h new file mode 100644 index 00000000..401db682 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/models/person_detect_model_data.h @@ -0,0 +1,2 @@ +extern const unsigned char g_person_detect_model_data[]; +extern const unsigned int g_person_detect_model_data_size; \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.cc b/components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.cc new file mode 100644 index 00000000..467db263 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.cc @@ -0,0 +1,4 @@ +#include "tensorflow/lite/micro/examples/person_detection/testdata/vww2_50_50_INT8_model_data.h" + +alignas(16) const unsigned char g_vww2_50_50_INT8_model_data[] = {0x28,0x00,0x00,0x00,0x54,0x46,0x4c,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x1c,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x00,0x00,0x18,0x00,0x12,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x46,0x04,0x00,0x28,0x95,0x01,0x00,0x10,0x95,0x01,0x00,0x3c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x6d,0x69,0x6e,0x5f,0x72,0x75,0x6e,0x74,0x69,0x6d,0x65,0x5f,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x00,0xba,0x00,0x00,0x00,0xc0,0x94,0x01,0x00,0xac,0x94,0x01,0x00,0x70,0x94,0x01,0x00,0x2c,0x94,0x01,0x00,0xf8,0x93,0x01,0x00,0xb4,0x93,0x01,0x00,0x90,0x93,0x01,0x00,0x1c,0x91,0x01,0x00,0xa8,0x8e,0x01,0x00,0xd4,0x8c,0x01,0x00,0x00,0x8b,0x01,0x00,0x2c,0x89,0x01,0x00,0x58,0x87,0x01,0x00,0x14,0x86,0x01,0x00,0xd0,0x84,0x01,0x00,0x8c,0x83,0x01,0x00,0x48,0x82,0x01,0x00,0x54,0x81,0x01,0x00,0x60,0x80,0x01,0x00,0x6c,0x7f,0x01,0x00,0x78,0x7e,0x01,0x00,0xf4,0x7d,0x01,0x00,0x00,0x7d,0x01,0x00,0x0c,0x7c,0x01,0x00,0x78,0x7a,0x01,0x00,0xe4,0x78,0x01,0x00,0x50,0x77,0x01,0x00,0xbc,0x75,0x01,0x00,0x38,0x75,0x01,0x00,0xa4,0x73,0x01,0x00,0x10,0x72,0x01,0x00,0xfc,0x6f,0x01,0x00,0x78,0x6f,0x01,0x00,0xf4,0x6e,0x01,0x00,0xd0,0x6e,0x01,0x00,0xbc,0x6c,0x01,0x00,0xa8,0x6a,0x01,0x00,0x34,0x68,0x01,0x00,0xc0,0x65,0x01,0x00,0x4c,0x63,0x01,0x00,0xd8,0x60,0x01,0x00,0x54,0x60,0x01,0x00,0x10,0x60,0x01,0x00,0xdc,0x5f,0x01,0x00,0xe8,0x5e,0x01,0x00,0x34,0x5c,0x01,0x00,0x80,0x59,0x01,0x00,0x3c,0x57,0x01,0x00,0x28,0x4b,0x01,0x00,0x14,0x3d,0x01,0x00,0x60,0x2c,0x01,0x00,0xcc,0x22,0x01,0x00,0x18,0x12,0x01,0x00,0x64,0x01,0x01,0x00,0xb0,0xf0,0x00,0x00,0x5c,0xe2,0x00,0x00,0xc8,0xd7,0x00,0x00,0x34,0xcd,0x00,0x00,0xa0,0xc2,0x00,0x00,0x4c,0xbd,0x00,0x00,0x18,0xb6,0x00,0x00,0x84,0xac,0x00,0x00,0xf0,0xa2,0x00,0x00,0x1c,0x9e,0x00,0x00,0x88,0x9a,0x00,0x00,0x54,0x94,0x00,0x00,0x20,0x8e,0x00,0x00,0xec,0x87,0x00,0x00,0xb8,0x81,0x00,0x00,0x24,0x7e,0x00,0x00,0x10,0x78,0x00,0x00,0xfc,0x71,0x00,0x00,0xe8,0x6b,0x00,0x00,0xd4,0x65,0x00,0x00,0xc0,0x5f,0x00,0x00,0xac,0x53,0x00,0x00,0x98,0x43,0x00,0x00,0x84,0x42,0x00,0x00,0x50,0x42,0x00,0x00,0x1c,0x42,0x00,0x00,0x08,0x41,0x00,0x00,0x94,0x40,0x00,0x00,0x80,0x3f,0x00,0x00,0x1c,0x3f,0x00,0x00,0x88,0x3a,0x00,0x00,0x04,0x3a,0x00,0x00,0x90,0x34,0x00,0x00,0x3c,0x34,0x00,0x00,0xc8,0x2e,0x00,0x00,0x44,0x2e,0x00,0x00,0xd0,0x28,0x00,0x00,0x5c,0x28,0x00,0x00,0x58,0x24,0x00,0x00,0xe4,0x23,0x00,0x00,0xe0,0x1f,0x00,0x00,0x9c,0x1f,0x00,0x00,0xd8,0x1c,0x00,0x00,0x44,0x1c,0x00,0x00,0x80,0x19,0x00,0x00,0x2c,0x19,0x00,0x00,0x18,0x17,0x00,0x00,0x94,0x16,0x00,0x00,0x80,0x14,0x00,0x00,0xfc,0x13,0x00,0x00,0xe8,0x11,0x00,0x00,0x94,0x11,0x00,0x00,0x20,0x0e,0x00,0x00,0xcc,0x0d,0x00,0x00,0x58,0x0a,0x00,0x00,0x04,0x0a,0x00,0x00,0x90,0x06,0x00,0x00,0xfc,0x05,0x00,0x00,0xd8,0x05,0x00,0x00,0xb4,0x05,0x00,0x00,0xa8,0x05,0x00,0x00,0x94,0x05,0x00,0x00,0x80,0x05,0x00,0x00,0x6c,0x05,0x00,0x00,0x58,0x05,0x00,0x00,0x44,0x05,0x00,0x00,0x30,0x05,0x00,0x00,0x1c,0x05,0x00,0x00,0x08,0x05,0x00,0x00,0xf4,0x04,0x00,0x00,0xe0,0x04,0x00,0x00,0xcc,0x04,0x00,0x00,0xb8,0x04,0x00,0x00,0xa4,0x04,0x00,0x00,0x90,0x04,0x00,0x00,0x7c,0x04,0x00,0x00,0x68,0x04,0x00,0x00,0x54,0x04,0x00,0x00,0x40,0x04,0x00,0x00,0x2c,0x04,0x00,0x00,0x18,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0xf0,0x03,0x00,0x00,0xdc,0x03,0x00,0x00,0xc8,0x03,0x00,0x00,0xb4,0x03,0x00,0x00,0xa0,0x03,0x00,0x00,0x8c,0x03,0x00,0x00,0x78,0x03,0x00,0x00,0x64,0x03,0x00,0x00,0x50,0x03,0x00,0x00,0x3c,0x03,0x00,0x00,0x28,0x03,0x00,0x00,0x14,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0xec,0x02,0x00,0x00,0xd8,0x02,0x00,0x00,0xc4,0x02,0x00,0x00,0xb0,0x02,0x00,0x00,0x9c,0x02,0x00,0x00,0x88,0x02,0x00,0x00,0x74,0x02,0x00,0x00,0x60,0x02,0x00,0x00,0x4c,0x02,0x00,0x00,0x38,0x02,0x00,0x00,0x24,0x02,0x00,0x00,0x10,0x02,0x00,0x00,0xfc,0x01,0x00,0x00,0xe8,0x01,0x00,0x00,0xd4,0x01,0x00,0x00,0xc0,0x01,0x00,0x00,0xac,0x01,0x00,0x00,0x98,0x01,0x00,0x00,0x84,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x5c,0x01,0x00,0x00,0x48,0x01,0x00,0x00,0x34,0x01,0x00,0x00,0x20,0x01,0x00,0x00,0x0c,0x01,0x00,0x00,0xf8,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x76,0x6e,0xfe,0xff,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x31,0x2e,0x35,0x2e,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xbd,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xbe,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xbf,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xc0,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe4,0xc1,0xfb,0xff,0x00,0x00,0x00,0x00,0x06,0x73,0xfe,0xff,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x73,0xfe,0xff,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x9e,0xc2,0xfe,0xff,0xfe,0xe7,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x73,0xfe,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x3c,0xc3,0xff,0xff,0xe1,0xe7,0xff,0xff,0xe7,0x42,0x00,0x00,0x05,0xbe,0xff,0xff,0x15,0x17,0x00,0x00,0xa5,0x32,0x00,0x00,0xa4,0x3d,0x00,0x00,0x5f,0xc5,0xff,0xff,0xa2,0x40,0x00,0x00,0xab,0xf8,0xff,0xff,0xfd,0xf8,0xff,0xff,0x06,0xc4,0xff,0xff,0x91,0xc9,0xff,0xff,0xd8,0x3a,0x00,0x00,0xe0,0x24,0x00,0x00,0xa7,0xf2,0xff,0xff,0x44,0xd3,0xff,0xff,0x9c,0xf5,0xff,0xff,0xe9,0x17,0x00,0x00,0x71,0x15,0x00,0x00,0x1a,0xc0,0xff,0xff,0x10,0x3a,0x00,0x00,0x98,0xc4,0xff,0xff,0xd5,0x40,0x00,0x00,0x73,0xc2,0xff,0xff,0xfa,0x3a,0x00,0x00,0xa7,0xf7,0xff,0xff,0x09,0x32,0x00,0x00,0x38,0x3b,0x00,0x00,0x70,0xc5,0xff,0xff,0x9c,0xfb,0xff,0xff,0x4a,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x73,0xfe,0xff,0x04,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0xb7,0xbb,0x1a,0x05,0x31,0x1d,0x17,0x22,0x2f,0xc6,0x9c,0xeb,0x0f,0x14,0xc1,0xf9,0x23,0xe9,0x16,0xe4,0x10,0xc7,0xd5,0x19,0xcc,0x34,0xfa,0x21,0x16,0x01,0x17,0x68,0x09,0xd2,0xef,0x04,0xfe,0x0f,0xda,0x21,0xee,0xe6,0x25,0xe7,0xb5,0x3e,0x24,0x08,0xc7,0x03,0xbd,0xda,0x3f,0x03,0xbb,0xfa,0x26,0x2c,0xc0,0x1e,0x1f,0x0b,0x0d,0x1d,0x06,0xf3,0xcb,0xcd,0x20,0x24,0x14,0x00,0xf5,0xcf,0xe3,0x0c,0x1b,0xb9,0x06,0x15,0xf5,0x24,0x21,0xac,0xfe,0xe1,0xf9,0xd0,0x1b,0x0f,0xda,0x03,0x03,0xf7,0xb7,0x7f,0x9d,0xbc,0x02,0xb5,0x7f,0xf4,0x28,0x00,0x36,0x5a,0x26,0x1a,0xe4,0x2a,0x7f,0x12,0x29,0x2f,0x4d,0xcd,0x0e,0xe5,0xb2,0xf2,0xa5,0xe9,0xea,0x18,0x26,0xe7,0x45,0xf5,0x1d,0xc2,0x21,0xfe,0xfd,0x24,0x16,0x34,0x17,0x29,0x71,0xcb,0xfc,0xc0,0x2a,0x0e,0x81,0xac,0x81,0x7f,0xfa,0x02,0xa2,0xf6,0x26,0xfd,0x81,0x1b,0x1e,0x2e,0xf2,0x4a,0x05,0xc5,0xe6,0xb7,0x2f,0x77,0x1b,0x11,0x2d,0xac,0x91,0x2f,0x03,0xef,0xed,0x06,0xea,0x33,0x1c,0x97,0x05,0x3b,0x1a,0x81,0x30,0x1c,0x81,0x03,0xf6,0xf5,0xb7,0x28,0x9e,0xd6,0xdf,0xf2,0x66,0x11,0x12,0xfc,0x16,0x43,0x08,0x01,0xc6,0x0a,0x39,0x05,0x06,0x0a,0x20,0xd7,0x03,0xf0,0xdd,0x0b,0xed,0x08,0xe1,0x14,0x0e,0xb3,0x1a,0x06,0xf6,0xfd,0x09,0xf4,0xf0,0x0f,0x11,0x19,0x09,0x17,0x3e,0xa9,0x1a,0x03,0x0c,0xec,0xa6,0x07,0xcb,0x41,0xfe,0xe8,0xbf,0xf0,0x0f,0xc5,0xb3,0x0c,0x1a,0x19,0x09,0x22,0x0b,0xfd,0x03,0xa6,0x16,0x37,0x15,0x0a,0x0d,0xb9,0x0c,0x10,0xbe,0x21,0x08,0xba,0xe8,0x17,0x06,0xb5,0x02,0x12,0xf6,0xa3,0x13,0x14,0xd8,0x00,0xfa,0x7f,0xdf,0xc6,0xa7,0x9d,0x02,0x03,0x3f,0x7f,0x45,0xd4,0x7c,0xaf,0xf7,0xf9,0x21,0x47,0xac,0x28,0x4c,0xdf,0x1d,0xb7,0xd7,0xc4,0x58,0x7f,0xd8,0x7f,0x22,0x45,0x4b,0xbe,0x19,0x7f,0x46,0xbb,0xfb,0x04,0x22,0x4c,0x34,0x4c,0xb1,0xce,0x17,0x08,0x1d,0x7b,0xfd,0xce,0xa5,0x0a,0xf1,0xd7,0x7f,0x27,0x81,0x21,0x42,0x3f,0x8b,0x4d,0x3e,0x1c,0x18,0x31,0xab,0xdf,0x81,0x81,0x4d,0x3c,0x52,0x0c,0x38,0x9f,0x7f,0x3d,0x36,0x0a,0x2d,0x1b,0x2a,0x43,0x3c,0x90,0x0a,0xbf,0xda,0xb6,0x4b,0x3b,0xa9,0xeb,0xfc,0xf1,0x43,0x4a,0x85,0x81,0x53,0xa5,0x7f,0xec,0x7f,0x81,0x6a,0x7f,0x7f,0xa5,0x7f,0x7f,0x53,0x7f,0x7f,0x7f,0x7f,0x81,0xfc,0x81,0x7f,0xe7,0x81,0xed,0x7f,0x7f,0x7f,0x57,0x7f,0x26,0x46,0x81,0x89,0xf4,0x7f,0x7f,0x7f,0x7f,0x81,0x7f,0x7f,0x58,0x7f,0x81,0x7f,0x81,0xc9,0x7f,0x13,0xf0,0xed,0x7f,0x81,0x7f,0x7f,0x7f,0xf9,0x7f,0x7f,0x7f,0xf3,0x7f,0x81,0x7f,0xa9,0x83,0x7f,0x7f,0x7f,0xbe,0x7f,0x81,0x70,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x81,0xe9,0x7f,0x81,0xb7,0x7f,0x7f,0xa9,0xd0,0xd7,0xbd,0x7f,0xc2,0x81,0xac,0x7f,0x7f,0x6a,0x20,0x2a,0xa6,0x77,0x50,0x1f,0xa8,0x9c,0x2d,0x07,0xc9,0x28,0x13,0x5a,0x9f,0xe8,0xcb,0x28,0x11,0xde,0x26,0x9b,0x2c,0x24,0x7f,0x5c,0x12,0xc7,0xd3,0x81,0x7f,0xb0,0x29,0x35,0x49,0xf7,0x10,0x5c,0x7f,0x39,0x06,0x0d,0xe3,0xaf,0x22,0xe8,0xe3,0x0f,0xad,0xa5,0xb1,0x34,0x2e,0xc2,0x38,0x32,0x3c,0x7f,0x4d,0xf2,0x33,0xc2,0x9d,0x49,0x55,0x29,0x81,0x34,0x84,0x81,0x43,0x19,0x28,0x0f,0x75,0xb7,0x45,0x36,0x89,0xf0,0x6d,0xab,0xa7,0x48,0x33,0xd5,0xda,0xf8,0x2e,0xf7,0x05,0xf3,0x17,0xe5,0x05,0x1e,0xfd,0x09,0xec,0x28,0xeb,0x01,0xe8,0x09,0xff,0xea,0x01,0x00,0xf4,0xfd,0xd5,0xad,0xea,0x06,0xfa,0xd0,0xec,0x12,0xfd,0xf9,0xc4,0xf4,0x12,0x08,0xee,0xf3,0x08,0x14,0xfc,0x08,0x07,0xe4,0xe3,0xf2,0xec,0x0e,0xe2,0xe0,0xe2,0xd5,0xeb,0xed,0xf5,0xe4,0x12,0xf6,0x16,0xff,0x0c,0x91,0x0a,0x07,0xe9,0x0d,0xf2,0xe5,0xde,0xe9,0xeb,0x0b,0xff,0xfe,0x0b,0x05,0xe6,0x29,0xec,0xf0,0x18,0x18,0xe5,0x0d,0x14,0x09,0x13,0xe5,0xf5,0xf3,0xe1,0x07,0xfd,0xcd,0xe3,0x04,0xf6,0x27,0x8e,0xf6,0x16,0x32,0x11,0x04,0xec,0x15,0x10,0x7f,0xe0,0x08,0x81,0x08,0x0a,0xd0,0xb7,0x17,0xfb,0x14,0xe0,0x7f,0xcf,0x2b,0x00,0xe2,0xe2,0x57,0x0f,0x0c,0x20,0x10,0x18,0x81,0x21,0xc6,0xe8,0x4f,0x09,0x0f,0x1e,0x1d,0x07,0x07,0x2f,0x16,0xdb,0xf8,0xd1,0xbd,0xe9,0x06,0xeb,0xe4,0x33,0xe7,0x6b,0x10,0x12,0xb7,0x10,0x1e,0xfe,0xeb,0xfc,0xfd,0xf5,0x0a,0xf6,0x20,0xf8,0x0b,0xf3,0x12,0xdb,0x4f,0xf2,0x16,0x10,0x2d,0x32,0x14,0x21,0x0d,0x1c,0x3b,0x95,0xf0,0xe9,0x1d,0x01,0xd6,0x3f,0x0c,0xe3,0x21,0xde,0xd8,0xe4,0x4f,0x25,0xfb,0x12,0xfd,0x46,0x72,0xe1,0x02,0x84,0xd7,0xff,0xf0,0xd5,0x09,0x03,0x03,0xec,0x30,0xe8,0x05,0x0c,0xf5,0x03,0xb0,0xfc,0x02,0x62,0xff,0x0e,0x9f,0x25,0xca,0x0c,0xbf,0xff,0xf7,0x15,0x1f,0x05,0xef,0x63,0xfd,0xfc,0x0a,0xec,0xb5,0x05,0xec,0xf8,0x0e,0xb5,0xc0,0xb1,0xfe,0xf5,0x00,0xfe,0xfe,0xf5,0x1a,0xfa,0x42,0x04,0x2c,0xda,0x13,0xfd,0x02,0xd5,0x02,0xd7,0xb7,0x01,0x06,0xfb,0x0e,0x59,0xc2,0x0f,0xfe,0xf0,0x7f,0xc7,0xe1,0xed,0x11,0xee,0xf3,0x7f,0x7f,0xd9,0xd0,0x0b,0x00,0x00,0x00,0x00,0x46,0x77,0xfe,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x67,0xf7,0xff,0xff,0xcb,0x2a,0x00,0x00,0xf7,0xf9,0xff,0xff,0x4c,0xac,0xff,0xff,0xbb,0x8a,0x00,0x00,0xbe,0x96,0xff,0xff,0x4e,0x17,0x00,0x00,0x49,0x3a,0x00,0x00,0xd2,0x07,0x00,0x00,0x30,0xa2,0xff,0xff,0xcd,0x3c,0x00,0x00,0x15,0x56,0x00,0x00,0x08,0x55,0x00,0x00,0x04,0xcc,0xff,0xff,0xe3,0x90,0xff,0xff,0x7c,0xb6,0xff,0xff,0x00,0x00,0x00,0x00,0x96,0x77,0xfe,0xff,0x04,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0x00,0x0a,0xf5,0xdc,0xd3,0xa9,0xb4,0x95,0x0d,0xbc,0xfc,0xaf,0xc2,0xd9,0xd3,0x07,0x0e,0xa1,0x56,0xe8,0x0e,0xd9,0xa9,0xae,0xd0,0x14,0x04,0x8b,0x05,0xce,0x31,0xfc,0xcc,0xd0,0xa8,0xb1,0xb1,0xe9,0x5e,0xf0,0xda,0xb9,0xcf,0x9f,0xb9,0xaa,0x0d,0xf6,0xe2,0xfb,0x7f,0xf2,0x08,0x61,0xb4,0xf4,0xf0,0xcb,0xb1,0x44,0x7f,0xb5,0xcb,0xc4,0xcc,0xa2,0xdc,0x1a,0x0b,0xf1,0x0b,0x2d,0xc3,0xaf,0xf2,0x99,0x16,0x81,0xe1,0x7f,0xd1,0xe0,0xd8,0xe5,0xbb,0xc5,0x01,0x7f,0x7f,0xbd,0x93,0xdd,0xb0,0xbe,0xb9,0xed,0xfd,0xe2,0x59,0x07,0x64,0x34,0x81,0x81,0x04,0xeb,0x12,0xd1,0xfa,0xf7,0x7f,0xb3,0xe8,0xf4,0x51,0xbe,0x00,0x81,0x93,0xda,0xff,0xfc,0xfc,0xb1,0x08,0xc8,0x10,0x08,0xd7,0x25,0xe2,0xea,0xbe,0x1b,0x02,0x5b,0x7f,0xd2,0xfd,0x0e,0xbe,0xd6,0xf3,0xda,0xe2,0x00,0x0d,0xbc,0x1c,0x13,0x66,0xc7,0x89,0xdb,0xf7,0x4b,0x1d,0x81,0xaf,0xe5,0xac,0xb2,0x06,0x27,0xcb,0xf0,0x15,0x52,0xca,0xf3,0x81,0x7f,0x5e,0x43,0xba,0x01,0xcb,0xe6,0xa5,0x81,0xc1,0xec,0x0a,0x13,0x50,0xdc,0x81,0xd6,0xd4,0xd2,0xda,0xc8,0xf8,0x81,0x7f,0xd6,0x60,0xcc,0xdf,0xdb,0xa4,0x09,0xf7,0x19,0x0c,0x0c,0x78,0xc7,0xfa,0xfd,0xf7,0xd9,0x0f,0xfb,0xfd,0x0e,0x09,0xfc,0xfe,0xee,0x9d,0xcb,0xe8,0x03,0x1a,0x04,0x06,0x08,0xf1,0x0c,0xe5,0x46,0x3d,0x10,0xf8,0x7f,0x0f,0x07,0x0a,0xe8,0xc1,0x03,0x0a,0xc4,0xea,0xef,0x3a,0x16,0x81,0x12,0x07,0xec,0xf6,0xc5,0xea,0x02,0xcf,0xec,0x0c,0xc0,0xbc,0x1c,0x21,0x51,0x1e,0xfa,0xb0,0x55,0x28,0x98,0xbf,0xf4,0x16,0xd8,0xe0,0xa1,0xd3,0xf7,0xec,0x12,0x08,0x0a,0xdb,0xc8,0x0e,0x10,0x0e,0xd4,0x81,0xa0,0xbd,0x3d,0x92,0x81,0xaa,0x1c,0x81,0x3d,0x51,0x73,0x7f,0x7f,0xa1,0x29,0x7f,0x5f,0x66,0x39,0xbb,0xcf,0xc6,0x5e,0x81,0x0b,0x29,0x7f,0x81,0x43,0x62,0xe6,0x45,0x81,0x49,0x5f,0x81,0x81,0x6d,0xc8,0xdd,0x63,0x7f,0xd7,0x57,0x5c,0xc1,0xf3,0xee,0x08,0x1b,0x15,0x3b,0x6f,0x81,0x5f,0xf1,0x49,0x48,0x4d,0x33,0xd5,0x03,0x7f,0x81,0x81,0x3b,0x48,0xda,0xe7,0x3d,0xee,0x7c,0x3f,0x34,0x9d,0xc1,0x97,0x3b,0x05,0x7f,0xe3,0x81,0x35,0x67,0x6f,0x63,0xf9,0x22,0x3d,0x4e,0xff,0x7f,0x59,0x60,0x14,0xd2,0x6a,0x32,0x5c,0x6c,0x5c,0x65,0xf4,0x3e,0x4d,0x7f,0x4c,0x02,0x08,0x5e,0x7a,0xd0,0x5a,0xb8,0x7f,0xb8,0x3d,0x7f,0x7f,0x53,0x8a,0x81,0xfe,0x5b,0x7f,0x19,0x06,0x3f,0x49,0x7f,0x58,0x73,0x98,0xca,0x5c,0x04,0x6a,0x0a,0xdf,0x7f,0x7f,0xb0,0x11,0x7f,0x02,0xbb,0x7f,0x7f,0xa9,0x4e,0x66,0x17,0x50,0x46,0xf7,0xa2,0x6a,0xa0,0xea,0xcc,0x79,0x4a,0x7f,0x5c,0x12,0x60,0x2b,0x42,0x4f,0x2a,0x08,0xfd,0x35,0x7f,0xa5,0x61,0xdc,0x56,0xae,0x7f,0x5a,0x7f,0xb0,0x92,0x7f,0x17,0x7f,0x4e,0x68,0x3f,0x7f,0x14,0x31,0x30,0x81,0x6f,0x66,0x4b,0xe5,0x33,0x81,0xc0,0x8a,0xf3,0xe6,0x61,0x72,0xf7,0x85,0x09,0x3f,0xfe,0x34,0x48,0x90,0x31,0xbf,0xb2,0xcb,0x42,0x2e,0xed,0x00,0x92,0x1f,0x84,0x81,0x40,0x1b,0x0d,0x52,0xf5,0xc2,0x05,0xeb,0xb8,0xaf,0x01,0xbe,0x28,0x24,0x00,0x2b,0xd3,0xfc,0x21,0x88,0x0c,0x81,0x83,0x05,0xef,0x3a,0xcb,0xf4,0xf8,0x46,0x81,0xa3,0x57,0x5e,0x37,0x30,0x93,0x81,0x03,0x12,0xfb,0xa8,0x52,0xef,0xcc,0xa8,0x4e,0x16,0x33,0x81,0x99,0x0c,0x05,0x9f,0xe8,0x23,0x8d,0xc4,0x8e,0x32,0xba,0xd6,0xe5,0x5f,0xf7,0xc9,0xe1,0x55,0xc0,0x40,0xef,0x56,0x76,0x23,0xff,0x98,0x1c,0x73,0xaa,0xd4,0x87,0xe1,0xea,0x74,0x9d,0xca,0xf5,0x17,0xb0,0x1e,0xba,0x2c,0x34,0xa9,0x56,0x67,0xbf,0xda,0x81,0x04,0xfa,0x48,0x26,0xfd,0x56,0x6a,0x4e,0x6b,0xdb,0x7f,0xca,0x0c,0xf6,0x81,0xc0,0x6c,0xfd,0x54,0x4a,0xc1,0xbc,0xd8,0x7f,0x1d,0xed,0xd0,0x3d,0x2d,0x81,0xf1,0xc6,0x97,0x4f,0x5a,0x09,0xde,0x81,0xeb,0xd3,0xcd,0x51,0x7f,0x99,0x17,0x14,0x45,0xe2,0xcc,0xb3,0x63,0x06,0xe3,0x6f,0x42,0x56,0xc5,0xb5,0x38,0x98,0x73,0x81,0xce,0x33,0x12,0x11,0x6c,0xe1,0x7f,0x09,0xf3,0x85,0x6e,0xe1,0x3e,0x81,0x45,0x81,0x12,0x08,0x6b,0x24,0x81,0x94,0x25,0x5f,0x47,0x81,0x7f,0x7f,0x1e,0x61,0x6d,0x0b,0x0d,0xc5,0x81,0xbb,0x7f,0xf2,0xad,0x7b,0x6c,0x3b,0x7f,0x49,0x62,0xe7,0x51,0xcd,0xd6,0x0e,0x7f,0x2b,0x66,0x7f,0x81,0xe0,0x2b,0x35,0x07,0x3d,0x0d,0x6f,0x1c,0x3b,0xd6,0x81,0x81,0x7f,0x41,0x26,0x05,0xfd,0x20,0x6c,0xe8,0x7c,0x5c,0x2d,0x4b,0x4c,0x60,0xbb,0xd6,0xd5,0x67,0x1a,0x46,0x5c,0x7f,0x7f,0x4a,0xff,0x1d,0xbc,0xcb,0xb4,0x1c,0xf5,0x0a,0x55,0xdf,0xf8,0xc1,0xc2,0x05,0x9b,0x7f,0x01,0x81,0xfa,0x7f,0xd3,0x03,0x0f,0x8f,0x11,0xae,0xb4,0x0d,0x4d,0x19,0xc0,0xc4,0xd9,0x0f,0xc2,0xbc,0x04,0x14,0x0a,0xc7,0xf8,0xd1,0x0e,0xef,0xc0,0xda,0x81,0xa2,0x57,0x87,0x02,0x28,0x00,0x03,0x00,0x9b,0x11,0xbb,0xd7,0xe7,0x08,0x07,0xea,0xf9,0x18,0xf2,0xd4,0xf1,0x5a,0x81,0xb4,0xd8,0xc1,0xac,0x21,0x10,0x0f,0xe9,0x43,0x07,0xdc,0xcb,0xf2,0x3d,0x28,0xba,0xe0,0x12,0x02,0xa9,0x0e,0x40,0xbe,0xd3,0xcb,0x79,0x00,0x00,0x00,0x00,0x06,0x7b,0xfe,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xd1,0x20,0x00,0x00,0x7b,0xb5,0xff,0xff,0xc4,0x84,0xff,0xff,0x84,0x87,0x00,0x00,0xc8,0x73,0x00,0x00,0x7b,0x7d,0xff,0xff,0xcf,0xd0,0xff,0xff,0x5f,0x20,0x00,0x00,0x26,0x9c,0xff,0xff,0xb9,0xae,0xff,0xff,0x5e,0x0e,0x00,0x00,0xd1,0xb2,0xff,0xff,0x6e,0x44,0x00,0x00,0xaa,0xb5,0xff,0xff,0xc6,0x97,0xff,0xff,0xc6,0xb0,0xff,0xff,0x00,0x00,0x00,0x00,0x56,0x7b,0xfe,0xff,0x04,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0xb4,0x23,0xdb,0xbb,0x4d,0xcc,0x24,0xd3,0xee,0x04,0xff,0x0d,0x16,0xd3,0x28,0xde,0x1d,0xb8,0xaf,0x02,0x56,0xba,0xc6,0x8d,0x26,0x20,0x7f,0xc0,0xf2,0x31,0xe5,0xc4,0xbf,0xb1,0x04,0x33,0xc7,0x26,0x0c,0x06,0x20,0xc0,0x1b,0xee,0x12,0x18,0x20,0xe6,0xc0,0xbb,0x1a,0x7f,0xff,0x02,0xba,0xae,0xf6,0x0a,0xd8,0x08,0xf4,0x3c,0x6f,0xb6,0x12,0x0b,0x0a,0xbb,0x2f,0xca,0xf8,0x22,0x1a,0x89,0xaa,0xbd,0xd9,0x16,0x7f,0x5c,0xbb,0xe9,0x1e,0x27,0x2c,0x7f,0xfc,0x97,0xb8,0x1c,0xdf,0x24,0x09,0xd3,0x81,0xaf,0x53,0x19,0x10,0xb5,0x37,0x94,0x07,0x50,0x7f,0xfe,0xf5,0x17,0x3b,0x1f,0x0c,0x9f,0x05,0xbe,0xe8,0x3e,0x2a,0x34,0x49,0xc9,0x0c,0x01,0x23,0xa5,0xef,0xfa,0x0d,0xda,0xe0,0x81,0x26,0xf3,0x81,0x02,0x26,0xfe,0x1b,0xfb,0x37,0x00,0xc7,0xfd,0x03,0x0b,0x70,0x54,0x20,0x05,0x33,0x14,0x81,0x07,0x0d,0x18,0x81,0xe8,0xc0,0x21,0x02,0xa9,0x35,0xc9,0xf8,0xce,0x11,0xb5,0x2e,0xf9,0x05,0xe3,0x97,0x94,0x02,0x09,0x1f,0x30,0xa9,0xbf,0x19,0xf3,0x11,0x47,0xea,0xa1,0x48,0x03,0xae,0x20,0xfb,0x91,0xe0,0x9a,0x51,0x05,0xca,0x09,0x8b,0x15,0xde,0x7f,0x54,0xfb,0xef,0x11,0xf5,0x0e,0x0a,0xd6,0xaf,0xb7,0xf8,0xe6,0xdc,0x60,0x3a,0x03,0x1f,0x08,0xff,0x08,0x01,0xda,0xe2,0x07,0xfe,0xb7,0xf7,0xad,0xf1,0xd7,0x21,0xf5,0x1a,0xe1,0xed,0x0d,0xd7,0xa9,0x0c,0x0d,0x7f,0x4a,0x1f,0x07,0x32,0x14,0x9f,0x26,0xfd,0x16,0xe1,0xf8,0x07,0x15,0x02,0xdd,0xf4,0x92,0xda,0x04,0x1d,0xca,0x03,0x11,0xf4,0xe0,0xde,0xa8,0xfb,0xa5,0xee,0x93,0xcc,0xcd,0x1b,0xcf,0x18,0xf5,0xfa,0xeb,0x4f,0xb1,0x9b,0x1f,0xfa,0xfc,0xf8,0x05,0x81,0x7f,0x52,0x81,0x61,0x9d,0x7f,0xaf,0x8c,0x34,0xea,0x03,0x7f,0x92,0x7f,0x76,0x56,0x67,0x7f,0x7f,0x7f,0x81,0x81,0x7f,0x7f,0x7f,0xe2,0x81,0x7f,0x7f,0x5d,0x7f,0x7f,0xbe,0x7d,0x53,0xc2,0x81,0x13,0x19,0x7f,0x87,0x7f,0x7f,0x7f,0x5f,0x7f,0x81,0xc4,0x81,0x7f,0xf5,0xe7,0xdd,0xad,0x81,0xa4,0x7f,0x8f,0xf0,0xe5,0x7f,0x7f,0x6d,0x5d,0xcf,0x68,0x7f,0x7f,0xf2,0x02,0x81,0x5f,0x4c,0x7f,0xa5,0x7f,0x5e,0xe1,0x7f,0x81,0xf2,0x7f,0x7f,0x7c,0x3a,0x17,0x81,0x81,0x44,0x37,0x7f,0xf9,0x81,0x58,0x7f,0x4c,0x7a,0x48,0x62,0x49,0xae,0x4e,0x68,0xc6,0xed,0xd0,0x1c,0x70,0x81,0x77,0x7f,0x7f,0x7f,0xf8,0x2f,0x2e,0x51,0x41,0x06,0x4c,0x67,0xc9,0x66,0x7e,0x7a,0x40,0x0a,0x04,0xa6,0x7f,0x7f,0x59,0x4f,0x7f,0xdd,0x68,0x81,0x4e,0x76,0x74,0x7f,0x6d,0xdc,0x0f,0x5d,0x77,0x96,0x30,0x7c,0x0e,0xd5,0x81,0x79,0xd0,0xa2,0x30,0x69,0x13,0x7f,0x59,0x7f,0x7f,0x32,0x6a,0x7f,0xd4,0xfe,0x7f,0x7f,0x70,0x81,0x0b,0x7f,0xdf,0x3c,0xb0,0x81,0x5d,0x7d,0x7f,0x2b,0xea,0x67,0x58,0x7f,0x7f,0x68,0xe3,0xb6,0x25,0x61,0x33,0x18,0x81,0x63,0x81,0x81,0xd9,0x40,0x08,0xc6,0xf9,0x03,0xb4,0xd3,0x15,0x0d,0xfd,0xe3,0xf2,0xa8,0xd7,0x3f,0x3f,0xc3,0x1f,0x2e,0xf2,0x72,0x32,0xe6,0x81,0xef,0xdd,0x9b,0xbd,0xef,0x59,0x4a,0x48,0xef,0x1b,0x00,0xe1,0x2b,0x37,0x0b,0x0e,0xe9,0x2c,0x4c,0x25,0xf5,0x7f,0x7f,0xea,0x3b,0xd7,0x16,0x81,0x53,0xee,0x15,0xfd,0x00,0xa5,0x2a,0x0d,0xa3,0x38,0x0c,0xcd,0xf2,0x1e,0x0e,0x36,0x9e,0xfc,0x00,0xf4,0x9f,0xf7,0xe6,0x0f,0x05,0x1d,0x17,0xe6,0x6c,0x5d,0x06,0x65,0x22,0x04,0xd0,0xd4,0x0f,0xd2,0x31,0x55,0xc5,0x82,0xdb,0x0f,0x0f,0xe9,0x3d,0x24,0xbf,0xce,0xe3,0x20,0x14,0x05,0x6d,0x0a,0x0c,0xa9,0xbf,0xc7,0x06,0x27,0x0f,0xf7,0xbe,0x34,0x88,0x4b,0x54,0x20,0xf2,0xe9,0xe0,0xc9,0xd8,0xd7,0x40,0x29,0xd8,0xd0,0x2c,0x2a,0x16,0x09,0xbb,0x16,0xca,0x2f,0xd6,0xd1,0xe2,0xbe,0xe1,0xe0,0x32,0xe6,0xdf,0x71,0x2a,0x14,0x0a,0x2a,0x87,0x22,0x48,0x37,0xe1,0x71,0x9e,0x3d,0x1d,0x1f,0x0f,0x0a,0xe1,0xe0,0xd1,0xdc,0x40,0x27,0x27,0x1b,0xc9,0x45,0xc5,0xc9,0xfd,0xd8,0x31,0x1c,0xd9,0xfb,0x65,0xe1,0x2d,0x3b,0x0b,0xfb,0xc5,0xc8,0x8a,0x8a,0x7f,0x7f,0x81,0xc1,0xce,0x25,0x20,0x17,0x1e,0x09,0xf4,0xb2,0xeb,0xfc,0x0f,0x30,0xf2,0xe6,0x1b,0x30,0x08,0x56,0x19,0x01,0xd9,0xe4,0x08,0x23,0x7f,0xac,0x7f,0x26,0xc6,0xc7,0xf7,0x36,0x11,0x0f,0xdf,0x9b,0xeb,0x19,0xe3,0x9d,0xae,0x0a,0x94,0xdc,0x2a,0xb8,0x39,0x7f,0x30,0x13,0x1b,0x0c,0x41,0x22,0x2a,0x27,0x59,0x7f,0xbe,0x1d,0x2e,0x15,0x10,0xe7,0x13,0xec,0xd7,0x2f,0x6d,0x1e,0x25,0x30,0xdb,0x7f,0x10,0xd4,0x16,0x4e,0x30,0x7f,0xca,0x02,0x29,0xec,0xfd,0xb7,0xfc,0xf4,0xc6,0x9d,0xb2,0xf1,0xbd,0xe8,0xe7,0x06,0xd4,0xfc,0x24,0x0b,0xcf,0xff,0xe6,0x0e,0xdc,0xf9,0x06,0x09,0xee,0xfd,0xf1,0xfe,0x41,0xd7,0xd8,0xf9,0xde,0xfc,0xf7,0x00,0x54,0xbc,0xab,0x03,0x02,0xf4,0xf2,0xf7,0x11,0xde,0x01,0xbf,0xec,0xee,0x02,0xf1,0x1f,0x4e,0x8e,0xef,0x07,0xd4,0x7f,0xa9,0x02,0x08,0x0e,0x81,0x68,0xe4,0x90,0x0c,0x1c,0xc6,0xdb,0xfc,0xfa,0x25,0xf1,0x02,0x20,0xff,0xd9,0x14,0x2a,0xfe,0x03,0x00,0xfa,0xd8,0x05,0xeb,0x03,0x75,0x02,0xee,0xe9,0xfb,0xdc,0x00,0x00,0x00,0x00,0xc6,0x7e,0xfe,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x73,0xff,0xff,0xff,0xa7,0x07,0x00,0x00,0xaa,0xf3,0xff,0xff,0x2a,0xfd,0xff,0xff,0x7d,0x0a,0x00,0x00,0x78,0xfb,0xff,0xff,0x45,0xff,0xff,0xff,0x39,0xf6,0xff,0xff,0x79,0xf2,0xff,0xff,0x2a,0xfc,0xff,0xff,0xf2,0xf6,0xff,0xff,0xdb,0xfe,0xff,0xff,0x37,0x06,0x00,0x00,0x27,0xf1,0xff,0xff,0xbf,0xf7,0xff,0xff,0x3f,0xfe,0xff,0xff,0x00,0x00,0x00,0x00,0x16,0x7f,0xfe,0xff,0x04,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x3a,0x7f,0x26,0xf6,0x48,0xbf,0xdc,0x49,0x3c,0x81,0x18,0x97,0xd4,0xef,0x97,0x81,0x36,0xe7,0x09,0x81,0x22,0x21,0x7a,0xed,0x81,0x46,0x03,0x56,0xed,0x43,0x51,0x81,0x3a,0xad,0xd6,0x27,0x44,0x81,0x4f,0xcb,0x81,0x81,0x40,0xbf,0xcc,0x19,0x65,0x74,0x28,0x58,0x54,0x3d,0xfa,0x87,0x9a,0xf1,0x46,0xef,0x10,0xce,0x43,0xc8,0xb3,0x31,0x1e,0xfc,0x16,0x99,0x81,0x17,0xb6,0xeb,0x1c,0x2e,0x07,0xcd,0x30,0x81,0x7f,0x9f,0x93,0x4f,0x06,0xa6,0x16,0x0f,0x17,0xbd,0x2e,0x81,0x41,0x13,0x0c,0xed,0x2c,0xc0,0xe1,0xa7,0xef,0x52,0xe0,0xfb,0x7f,0x0f,0xed,0x53,0xcb,0x1c,0x19,0x81,0xcb,0x7f,0xbd,0xfd,0x0a,0xc8,0xee,0xa8,0xcd,0xa2,0x42,0xd3,0x2d,0x2b,0xc5,0x1d,0x95,0xd7,0x3b,0x7f,0xef,0x9d,0x53,0x8b,0x22,0x83,0x06,0xa1,0x1e,0x81,0x17,0x58,0x70,0x1a,0xb3,0x95,0x01,0x00,0xdd,0xf4,0x1c,0xbd,0xe1,0xb1,0x0f,0x8c,0xaa,0xf8,0x18,0x7f,0xb7,0x20,0x54,0x46,0x39,0xc3,0x81,0x3a,0x7f,0x51,0x3e,0x81,0x64,0x95,0xd4,0x4b,0x02,0xa5,0xf9,0x81,0xdc,0x26,0x81,0x9b,0x66,0x04,0x5f,0xec,0x40,0xf7,0xf1,0xd6,0x84,0x7f,0xfc,0x2a,0x7f,0x35,0x45,0xd3,0x5b,0x98,0xd8,0x4e,0x14,0x98,0x81,0xf9,0x93,0xd6,0x6b,0x0c,0xc6,0xd9,0x77,0x33,0xf4,0x2b,0x78,0x76,0x46,0xbe,0xc4,0xcd,0x57,0x2d,0x7f,0xa5,0xea,0x81,0xe3,0x0a,0x42,0x1b,0x6d,0xe0,0xdd,0x4c,0xdb,0xbf,0x71,0x2f,0x33,0x19,0x2e,0xec,0x14,0xd1,0x32,0x38,0x10,0xbd,0x4c,0x13,0x19,0xfc,0x26,0xdb,0x7f,0x3e,0xc2,0xf4,0xc6,0xae,0xfd,0x2a,0x04,0xa8,0xb5,0xe0,0x2e,0x27,0xff,0x7f,0x1c,0x7f,0x5a,0xfa,0xd5,0xdd,0xa7,0x9d,0x29,0xfa,0x81,0xae,0xd8,0x81,0x23,0x44,0x38,0xfb,0xf6,0x7f,0xf2,0xf8,0xf2,0x42,0x1e,0xf5,0x07,0xf4,0xf3,0xaa,0xbf,0x9b,0x29,0xcb,0x47,0xf3,0xf6,0x29,0x81,0xcf,0x59,0x00,0x81,0x36,0x0d,0xa3,0x09,0x00,0x93,0x81,0xe3,0x81,0xaf,0xf1,0xd0,0x64,0x9d,0xe7,0x7c,0xc6,0x9e,0xd3,0xe4,0xbc,0x0c,0xd0,0xd8,0xc4,0xa7,0xfa,0x81,0xd6,0x2b,0x14,0xab,0x15,0xc8,0x97,0x02,0xf6,0x65,0xc8,0x60,0xc3,0x9c,0xc7,0xde,0xee,0x4c,0x06,0x0a,0x7f,0x7b,0x0c,0xfd,0xf7,0xc2,0x67,0xe7,0xd3,0x18,0xc1,0xd5,0xd6,0x7f,0xbc,0x81,0x95,0xb9,0x77,0x81,0xe0,0x41,0x06,0x3a,0xaa,0xba,0x0b,0xd3,0xa9,0x49,0xb6,0xab,0x99,0xbd,0xef,0xb5,0x0c,0x7f,0x2d,0xbb,0x1e,0xb5,0xae,0xab,0x3f,0x7f,0xec,0x7f,0xa3,0x87,0xb9,0xb3,0xf1,0x71,0xdf,0x2c,0x68,0x7f,0x34,0xfa,0x0e,0x4c,0x7f,0xc7,0xf0,0x0c,0x81,0xf8,0xd6,0x45,0xd9,0x8d,0xb7,0x95,0x64,0xb4,0x3f,0xfd,0xf3,0x61,0xbc,0xa1,0xda,0xd7,0x86,0x30,0xe5,0xa3,0xed,0x81,0xe4,0xc7,0xe7,0x39,0x2e,0xf6,0x2f,0xc7,0xe0,0x81,0x44,0x23,0xc9,0xff,0xc8,0xc4,0x81,0x9a,0xc3,0x7f,0xb8,0x3b,0x03,0xfc,0x37,0xcd,0xb4,0x6d,0x16,0x9c,0xf0,0x01,0xa8,0xda,0xbb,0x99,0xc6,0xae,0x99,0xb4,0xd6,0xae,0x5b,0x81,0xab,0x7f,0xd1,0xd5,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x81,0xfe,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x85,0x16,0x00,0x00,0x0b,0xe7,0xff,0xff,0xdf,0xe2,0xff,0xff,0x05,0x1a,0x00,0x00,0x82,0xdd,0xff,0xff,0x09,0x07,0x00,0x00,0x27,0x0b,0x00,0x00,0xac,0x21,0x00,0x00,0x22,0x23,0x00,0x00,0x8e,0xf6,0xff,0xff,0x56,0xcf,0xff,0xff,0xbb,0xd7,0xff,0xff,0x69,0xeb,0xff,0xff,0xb3,0x02,0x00,0x00,0xf5,0x21,0x00,0x00,0xb3,0x16,0x00,0x00,0x50,0x16,0x00,0x00,0x94,0xff,0xff,0xff,0xdb,0xe7,0xff,0xff,0x24,0xf0,0xff,0xff,0xd2,0xdb,0xff,0xff,0x88,0xd9,0xff,0xff,0xc7,0x1b,0x00,0x00,0x10,0x1b,0x00,0x00,0xb8,0x07,0x00,0x00,0x7c,0xf3,0xff,0xff,0x4d,0xf1,0xff,0xff,0x79,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x81,0xfe,0xff,0x04,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x2d,0xb9,0xd3,0xa1,0xdf,0xe8,0xe5,0xcc,0x81,0x33,0x4b,0xe9,0x7d,0x69,0x29,0x3f,0x58,0xf6,0x0b,0x5b,0x26,0x37,0xb3,0x5b,0xf2,0x2a,0xd5,0xc6,0x4d,0x7f,0x6d,0x8d,0x95,0xb4,0x4c,0x81,0x05,0x89,0x81,0x2c,0x17,0x0b,0xd2,0xb0,0x64,0x2a,0xd0,0x5a,0x39,0x47,0x44,0x81,0xea,0x59,0x8c,0x3c,0x24,0xcb,0x2e,0xcb,0xc9,0x51,0xb6,0x89,0x91,0x55,0xec,0x20,0x42,0x57,0xf7,0x22,0x42,0x1e,0x1e,0x28,0x2b,0x42,0xea,0xe9,0x1e,0x0b,0xc3,0x1f,0x20,0x55,0x7f,0x15,0xab,0x7f,0x56,0x4c,0x47,0x81,0x0a,0x5f,0x4f,0x4e,0x7f,0x7f,0x2a,0x15,0x7f,0x0c,0x54,0x36,0x22,0xb4,0x46,0x53,0xac,0xf9,0x14,0xc9,0x4e,0xb8,0xb0,0x7f,0x81,0x81,0xb5,0xf1,0xc7,0xf9,0x58,0xf2,0x81,0x56,0x64,0xc9,0x18,0x08,0xed,0xfa,0x81,0x81,0xc7,0xc9,0xbd,0x42,0xf4,0x33,0x5e,0x3d,0xa7,0x1c,0xa1,0x60,0xb7,0xc8,0xa0,0xf7,0x0c,0xf0,0x23,0x32,0x2f,0x1b,0x3f,0x79,0x06,0x7e,0x1d,0xb4,0x00,0x13,0xca,0x83,0x7f,0xcb,0x81,0x60,0x7f,0xf4,0x50,0xff,0x0d,0x5a,0xe6,0x34,0x03,0x7a,0x33,0x47,0x7f,0xe9,0x7f,0x47,0xa9,0x6c,0xf5,0x73,0xbe,0xf1,0xcb,0x81,0x17,0x24,0x14,0x81,0x81,0x87,0xf7,0x8f,0x35,0x5c,0x96,0x5a,0x7f,0x57,0x82,0x91,0x06,0x7f,0x88,0x0f,0x7f,0x12,0x7f,0x96,0x81,0x7f,0xa5,0x7f,0x73,0xb7,0xc4,0x79,0x79,0x32,0x31,0x93,0xf4,0x72,0x00,0x32,0xe0,0x7f,0x6e,0xd2,0x4d,0x19,0x74,0xff,0x81,0x7f,0x64,0x00,0xb9,0xf1,0xe3,0xdf,0x0c,0x01,0x8a,0xfc,0xff,0x36,0xb8,0x22,0x7f,0x2f,0x16,0x7f,0x58,0x7f,0x2c,0x6e,0x11,0x7d,0x04,0xec,0x62,0x11,0x38,0xb8,0x08,0x7a,0x11,0x4b,0x16,0xbc,0x45,0x23,0x6c,0x3e,0xb8,0xbf,0xdb,0x2f,0x9c,0x17,0x49,0x10,0x9f,0xd1,0x52,0xff,0x28,0x0a,0x89,0x14,0xa9,0xb2,0x81,0xf3,0x15,0x3f,0x22,0x13,0x86,0x2e,0x93,0xfe,0xb3,0x39,0xc2,0x1b,0x9e,0x15,0x1a,0x09,0xf3,0x40,0x7f,0x56,0x1b,0x7f,0x22,0x1f,0x3f,0xbb,0x29,0x26,0x9d,0xd4,0x37,0x7f,0xae,0x15,0x0c,0xcf,0x3d,0x32,0x5b,0x7f,0x0a,0x73,0xaf,0xc1,0x88,0x7f,0x89,0x8d,0xf1,0xc7,0xa8,0xe4,0xc9,0xf1,0xab,0xc9,0x52,0x8d,0x8a,0xab,0xd4,0xbd,0x9a,0xa7,0x9a,0xc4,0x31,0xd6,0x9c,0x4e,0x37,0x0e,0xb4,0xc0,0x89,0xd4,0xd1,0xa5,0x2f,0x81,0x7e,0x9e,0x88,0x45,0xba,0x6c,0x2c,0x4e,0x03,0x7f,0x0e,0xf2,0x3e,0x17,0x74,0x6a,0x0e,0x7f,0x81,0xe6,0xb9,0x59,0xa6,0x81,0x20,0x82,0xa9,0x1d,0xe9,0xcd,0xd5,0x81,0x7f,0xbb,0x81,0x9f,0xd3,0xe2,0x3a,0x41,0x81,0x11,0x4c,0x25,0x0c,0x4a,0x42,0x0a,0x4f,0x04,0x85,0xf3,0x4f,0xc5,0x0e,0x9a,0x57,0xff,0xb0,0x42,0x14,0x53,0xe6,0x56,0x0a,0x17,0xe1,0x18,0xe6,0x58,0x6e,0x05,0x81,0x29,0xa6,0xcf,0xbd,0x2d,0xbe,0x97,0xf0,0x81,0xa1,0xe2,0x9a,0xcf,0xa5,0xbb,0x79,0x03,0x8e,0xa3,0xd0,0x08,0xcd,0x19,0x8c,0x2b,0xe0,0x32,0xd5,0x18,0xf3,0xc6,0x1f,0xf7,0xbb,0xee,0x39,0xe7,0xe9,0xb6,0x1a,0xe2,0xb0,0xe9,0x81,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x83,0xfe,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4b,0x20,0x00,0x00,0xe6,0xf9,0xff,0xff,0x4d,0xf7,0xff,0xff,0xba,0x17,0x00,0x00,0x05,0xf4,0xff,0xff,0x77,0xa6,0xff,0xff,0xd0,0xe2,0xff,0xff,0xc6,0x2b,0x00,0x00,0x4e,0x13,0x00,0x00,0x9a,0xfd,0xff,0xff,0xb4,0x08,0x00,0x00,0xde,0xf5,0xff,0xff,0x0c,0xf8,0xff,0xff,0x06,0x12,0x00,0x00,0x82,0xf1,0xff,0xff,0x84,0x09,0x00,0x00,0xf1,0xd7,0xff,0xff,0xc3,0xf5,0xff,0xff,0x3d,0x1f,0x00,0x00,0xd8,0x07,0x00,0x00,0x35,0x0f,0x00,0x00,0x31,0x26,0x00,0x00,0xd9,0xf4,0xff,0xff,0xd6,0xdd,0xff,0xff,0x88,0x05,0x00,0x00,0xbb,0x06,0x00,0x00,0x20,0x17,0x00,0x00,0xda,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x84,0xfe,0xff,0x04,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x81,0x1a,0x9d,0xa5,0x8a,0xc3,0x1f,0xef,0x69,0x88,0xe2,0x85,0xeb,0x8e,0x61,0x53,0xa6,0x7f,0x7f,0x7f,0x81,0x9d,0xee,0xa9,0x44,0x81,0xaa,0xc7,0x81,0x30,0x87,0x7f,0xaf,0xe6,0x84,0x03,0xa7,0x7f,0x7f,0x6a,0x3d,0x79,0x06,0x42,0x81,0x3f,0x2a,0x81,0xb2,0x48,0x69,0xf2,0x81,0xa2,0x6f,0x81,0x95,0x20,0xd6,0xa9,0x82,0xeb,0x16,0xa0,0x61,0xe5,0xf7,0xdf,0xf7,0x9e,0x7f,0x63,0x22,0x67,0x1f,0xff,0x98,0xdf,0xff,0x60,0x35,0x00,0x9a,0xa2,0xbc,0xf1,0xbe,0x5f,0xb6,0x11,0xf6,0xd6,0xe0,0x3e,0x3f,0x44,0x29,0x15,0xaf,0x4d,0xa5,0xec,0x09,0xdc,0xa6,0x27,0x72,0xc0,0x06,0x1b,0x2e,0xbe,0xa8,0x2a,0xc8,0x9a,0x93,0xf9,0x24,0xcf,0x30,0x9f,0xe6,0x81,0xdc,0xc9,0x1d,0x02,0x85,0x69,0x9d,0xce,0x9a,0x81,0xbb,0xfb,0x7f,0x98,0x81,0x81,0xb2,0x94,0x81,0xc6,0x81,0xb9,0xec,0xcd,0x4a,0x31,0x7a,0x4c,0x4e,0x91,0x3b,0x46,0xbd,0x81,0x15,0x82,0xb0,0x15,0x7f,0x7f,0xc0,0x81,0x7f,0xa2,0xe9,0x4f,0x32,0x93,0xc5,0xd4,0x13,0xb7,0x7f,0xae,0x03,0xa0,0x1b,0x3d,0xf5,0xc3,0xc4,0x38,0x34,0x26,0xf4,0xee,0x88,0x8d,0x21,0xc8,0xa3,0xf5,0xee,0x32,0xb3,0xdc,0xc2,0xfc,0xc6,0xde,0x69,0x3e,0xfc,0x6c,0x55,0x59,0x3f,0x46,0xbe,0x75,0x7d,0xb0,0xa2,0x58,0x21,0xf2,0x90,0xbb,0x27,0xbb,0x3f,0x1c,0x7f,0x81,0x05,0x77,0x0b,0xa1,0x16,0x7f,0x1c,0xfe,0x1f,0xdb,0x29,0xa0,0x6c,0x0d,0x1c,0xd5,0x48,0x74,0x88,0x09,0xd9,0x63,0xe8,0xe9,0x51,0xe9,0x2e,0x13,0xe9,0x2e,0x18,0xf1,0x1a,0xfd,0xe5,0x0a,0x7f,0x25,0x90,0x1f,0xcf,0x0b,0x31,0x29,0xcb,0x6a,0x1d,0x9c,0x36,0xf9,0xdb,0x20,0xf1,0x43,0x58,0x0b,0x05,0x5b,0xeb,0x81,0xf7,0xf7,0x45,0x92,0x48,0xdc,0x82,0x81,0x81,0x20,0xa9,0xcc,0xfc,0x0c,0xfb,0x68,0xee,0xd5,0xe4,0xb1,0xfb,0x81,0xb7,0x88,0xc7,0x81,0x8d,0xe2,0xd6,0xf6,0xe2,0x51,0x77,0x81,0x03,0x67,0xa0,0xc2,0x7b,0xb7,0x81,0x7f,0x42,0x34,0xef,0x84,0x1c,0xd0,0xa0,0x7f,0x67,0xca,0x7f,0x81,0xb8,0xf7,0x39,0x92,0x54,0x95,0x7f,0x7f,0xd6,0x10,0x92,0x2d,0x1b,0x29,0x81,0x94,0x7a,0x97,0x36,0xb3,0xb8,0xb4,0x87,0x1a,0x9e,0x0f,0xcd,0x06,0x9e,0x7f,0xc0,0xe2,0x58,0x5c,0x8a,0xe6,0x7f,0x7f,0xae,0xf3,0xb5,0x81,0x08,0x91,0xe1,0xe5,0x84,0xd7,0x2c,0xb3,0xc5,0x53,0x74,0xd6,0x6a,0xc9,0x81,0x2c,0x38,0xe1,0x5b,0xfe,0x57,0xb5,0xfb,0xfe,0xfb,0x0c,0x2c,0xd1,0x4b,0xf1,0x0d,0x81,0x39,0xe7,0x11,0x41,0xef,0xbd,0x2b,0x55,0x0b,0x1b,0xe0,0x46,0x81,0xc6,0x10,0x19,0xc6,0xc9,0xc7,0x71,0xe7,0xe4,0x81,0x4b,0x4f,0xd9,0xe4,0xbd,0x1b,0x02,0x11,0x1b,0xb3,0x51,0x53,0xab,0x58,0xf1,0xa0,0x19,0x75,0x8e,0x7f,0x82,0x58,0x06,0xe1,0xd2,0x83,0x06,0x9f,0xfd,0xa1,0xa7,0x81,0xfa,0x57,0x99,0x98,0xae,0xbb,0x98,0xad,0xe8,0xd7,0xb8,0x81,0x4f,0x9d,0xd7,0x43,0x7f,0xbd,0xca,0x2e,0x7c,0xa2,0xc1,0x9c,0xb6,0x24,0xef,0xdb,0x14,0xdb,0x95,0x2f,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x86,0xfe,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x51,0x1d,0x00,0x00,0x4d,0xd5,0xff,0xff,0x24,0xd0,0xff,0xff,0x94,0xf8,0xff,0xff,0xea,0xcf,0xff,0xff,0xcc,0x39,0x00,0x00,0x0b,0xb8,0xff,0xff,0xac,0xe1,0xff,0xff,0x51,0x1a,0x00,0x00,0x8f,0x0a,0x00,0x00,0x2f,0x04,0x00,0x00,0xde,0xd7,0xff,0xff,0x50,0xff,0xff,0xff,0x5e,0xf5,0xff,0xff,0x86,0x31,0x00,0x00,0x3b,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x96,0x86,0xfe,0xff,0x04,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x26,0xd6,0x4e,0x7f,0xb2,0x56,0xb1,0x2b,0xa3,0x11,0x9d,0xbc,0xfe,0x7f,0x72,0x8e,0xed,0x2f,0x78,0x0b,0xc9,0x95,0x2c,0x89,0x7f,0x0e,0x2b,0xf3,0x81,0x25,0xbd,0xc0,0x67,0xf0,0x8d,0xee,0x81,0xb5,0x35,0x94,0xed,0xc2,0x1a,0x3e,0x31,0xbc,0x1e,0x04,0xdb,0x7f,0xa3,0x81,0x7f,0x0b,0x0f,0x89,0x3a,0xe3,0x69,0x35,0xfb,0x93,0x5f,0x78,0xac,0x7f,0x81,0x20,0xc9,0xa5,0x4c,0xa7,0xc7,0xbe,0x81,0x3b,0x6a,0x11,0x7f,0x37,0xb3,0x7e,0x0e,0x7f,0xac,0x7f,0xa8,0xc2,0x16,0xe8,0x22,0x8a,0x14,0x33,0xab,0x7f,0xb2,0xab,0x96,0x19,0x49,0x29,0x1a,0x05,0xcc,0xf3,0xbb,0x47,0x74,0x04,0xaa,0x4c,0x0e,0xb5,0x08,0x85,0xb4,0x81,0x11,0x7f,0x0d,0xb2,0x7f,0x46,0xcb,0x37,0x01,0x99,0x21,0x13,0x0b,0xc2,0x38,0x08,0x7f,0x35,0x81,0xe2,0x1b,0x63,0xc1,0x55,0xfd,0xfb,0xc1,0x29,0x03,0xad,0xa8,0xc6,0x6c,0x77,0x50,0xc8,0x47,0x75,0xc3,0xa4,0xc9,0x38,0xbe,0x36,0xa8,0xc9,0xf5,0x65,0x7f,0xcb,0xa8,0xe1,0x33,0x67,0xc0,0x96,0xae,0x81,0x76,0x14,0x1b,0xdc,0xb3,0x0b,0xb4,0xd7,0x3b,0xfd,0x86,0x65,0x7d,0x8f,0x2d,0x9a,0xdb,0xa3,0x4c,0x3b,0x30,0xd8,0x38,0x13,0xc6,0x73,0xac,0xb1,0x96,0x0b,0x0e,0xd0,0x10,0xe8,0x49,0x2e,0xa6,0x97,0x81,0x1d,0x81,0x33,0x34,0x12,0xb7,0x5d,0x9f,0xa2,0xa0,0x95,0x32,0x7f,0x3d,0xd9,0x34,0x3c,0x9b,0x28,0xc7,0x0c,0xd6,0xae,0x91,0x29,0x75,0x45,0x68,0xbc,0x25,0x6a,0x22,0x03,0xa7,0x28,0x6e,0xdd,0x39,0x57,0x7f,0x2f,0xf4,0x4f,0xa6,0xf4,0x64,0xd1,0xdb,0xf9,0xaa,0x60,0x7f,0xcf,0x96,0x1c,0x52,0xfd,0x5d,0xb0,0x32,0x43,0xc4,0xfc,0x81,0xd1,0x33,0x25,0x54,0xfa,0xf1,0xbc,0x18,0x42,0x02,0xf0,0x7c,0xa5,0x48,0xe9,0xa9,0x74,0x20,0xcd,0x7f,0x34,0x44,0xd7,0x92,0x20,0x75,0x7f,0x44,0x0e,0x98,0x81,0xc1,0x1e,0xdc,0xe2,0x9e,0xfb,0x42,0x0b,0x4d,0x81,0x0e,0x7f,0x8b,0x70,0xd5,0x1c,0xe1,0xa4,0x35,0x42,0x53,0x48,0xe7,0x7f,0xf0,0x3f,0x7f,0x02,0x52,0x32,0x0b,0x7f,0x26,0xa9,0x81,0xf6,0x35,0x38,0xd8,0x07,0x73,0x7f,0xec,0xcc,0x0e,0xe4,0x54,0x28,0x7f,0xe0,0x7f,0x10,0x16,0x7f,0x4e,0xe2,0x31,0x8c,0x44,0x01,0x44,0xa3,0x0e,0x7f,0x18,0x7f,0x2e,0xc7,0x46,0x4f,0x7f,0xfd,0x10,0x76,0xab,0xbe,0x81,0x0e,0xfe,0xc8,0xbf,0x34,0x7f,0x40,0x74,0xa6,0x71,0x21,0x81,0x73,0xc2,0xf5,0x81,0xd7,0x21,0x7f,0x7d,0x40,0xbe,0x4f,0xaf,0x9b,0x55,0x26,0x23,0x7f,0x2a,0x22,0x28,0xeb,0x91,0x04,0x1f,0x0c,0x72,0x03,0xdf,0x20,0xcf,0xcc,0xc5,0xd7,0xc8,0x1c,0x64,0xe2,0x21,0xc1,0x0d,0x02,0x63,0xe5,0x8f,0x81,0x48,0x28,0x4a,0x7f,0x19,0x3e,0x8b,0x0b,0x2a,0xc5,0xf8,0x54,0xc2,0x83,0x50,0x55,0xa8,0xf4,0xb7,0xb4,0x65,0x0b,0xc2,0x6f,0x18,0x04,0x78,0x93,0x4d,0xfc,0x68,0xba,0xbc,0x43,0x69,0xab,0x04,0x19,0x18,0x7f,0xb4,0x45,0x81,0xb8,0xe2,0x81,0x22,0xde,0xc2,0xfd,0x31,0x62,0x9c,0x4e,0x1f,0xe7,0xef,0xe1,0xed,0xde,0x10,0xf6,0xbe,0x95,0x2b,0x45,0x3a,0x81,0xfd,0x81,0xe9,0xc3,0x3c,0x8b,0xf2,0xee,0x13,0x45,0x1e,0xcd,0x49,0x00,0x6a,0x5c,0xaf,0x81,0xc4,0x48,0xc2,0x5a,0x49,0x10,0x81,0xb8,0x09,0xe0,0x7f,0x40,0x81,0x53,0x5d,0x23,0x0b,0xa3,0x7f,0x25,0xbc,0x31,0xce,0x7d,0xfb,0xe5,0x00,0x17,0xe1,0x77,0xc5,0x53,0xa5,0x7f,0xf6,0x13,0x28,0x2f,0xf5,0x3b,0x6a,0x49,0xa1,0x5d,0x7f,0x26,0x81,0x7f,0x1f,0x72,0x7f,0xe0,0xc6,0xe5,0x2d,0x7f,0x5d,0x99,0x09,0xdb,0xe1,0x33,0x02,0xa6,0xdd,0x37,0x1e,0x0d,0xc9,0xbe,0x7f,0x2c,0x05,0x44,0x81,0x8d,0x17,0x70,0xcc,0x77,0x39,0x31,0x86,0x4d,0xdf,0xc3,0x17,0x3d,0xb7,0x7f,0x45,0x11,0x1a,0x92,0x48,0xbe,0xf4,0x2e,0x81,0x7f,0x9a,0x98,0xf7,0x11,0x47,0x51,0xd1,0x72,0x8e,0x92,0x04,0x56,0x7f,0x21,0x0f,0xda,0x6c,0x7f,0xa1,0x5e,0x0d,0x01,0xdc,0x4d,0x07,0x1b,0x7f,0xd8,0xb2,0xac,0x9f,0x25,0x5e,0x94,0xfd,0xae,0xf9,0x03,0x25,0x81,0xc2,0x55,0x41,0x34,0xe7,0xce,0x29,0x04,0x83,0x0e,0x9a,0x93,0x12,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x89,0xfe,0xff,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x20,0x11,0x00,0x00,0x7b,0xe4,0xff,0xff,0x0f,0xe4,0xff,0xff,0xad,0xfc,0xff,0xff,0x15,0xf0,0xff,0xff,0xf3,0x06,0x00,0x00,0x00,0xf8,0xff,0xff,0x98,0xe8,0xff,0xff,0x05,0x06,0x00,0x00,0x24,0xf0,0xff,0xff,0x23,0xf5,0xff,0xff,0x72,0xf2,0xff,0xff,0x23,0x04,0x00,0x00,0x67,0x01,0x00,0x00,0xae,0xe1,0xff,0xff,0x59,0xf6,0xff,0xff,0xa7,0x17,0x00,0x00,0x57,0x07,0x00,0x00,0xc3,0xde,0xff,0xff,0x02,0x0a,0x00,0x00,0x67,0x07,0x00,0x00,0x20,0xef,0xff,0xff,0x7c,0xf3,0xff,0xff,0x95,0xfe,0xff,0xff,0xc3,0xed,0xff,0xff,0x78,0x09,0x00,0x00,0xc4,0xff,0xff,0xff,0x4b,0xea,0xff,0xff,0x3c,0x0c,0x00,0x00,0xd6,0x12,0x00,0x00,0xcf,0xfe,0xff,0xff,0x84,0xdb,0xff,0xff,0x00,0x00,0x00,0x00,0xe6,0x89,0xfe,0xff,0x04,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x42,0xf7,0xf6,0x0e,0x7e,0x21,0xb8,0x1a,0x93,0x85,0xfa,0xab,0x37,0xf7,0x1f,0x16,0x55,0xef,0x8f,0xce,0xa3,0x81,0x18,0xb4,0x39,0x1b,0x09,0xa5,0x5c,0xa2,0x2c,0xe2,0x31,0xf3,0xe1,0x23,0x08,0xdf,0xe3,0xce,0x01,0xc3,0xee,0x24,0x09,0x10,0xe9,0x3b,0x81,0x19,0xc7,0x05,0x7b,0x47,0x32,0xbe,0x7f,0x20,0x81,0x2f,0x15,0xd4,0xe3,0xf6,0x07,0x65,0xee,0x48,0x77,0xe6,0xc0,0x7f,0xee,0x82,0x4f,0xea,0x7f,0x2a,0x7f,0x81,0x69,0x0f,0xcd,0xd7,0xba,0xb1,0xb3,0x81,0x7f,0x05,0x0f,0x1d,0x7f,0x81,0x81,0x0a,0x90,0xf8,0xfa,0x8d,0x7f,0x6a,0x7f,0xcc,0x81,0x42,0x00,0xad,0x38,0xaa,0xa7,0x81,0x40,0xce,0xde,0xc6,0xe6,0xc0,0x93,0xc7,0xf8,0x1d,0xaf,0x2f,0x50,0x55,0xad,0x02,0x1b,0xe1,0x7f,0xae,0x1f,0x38,0x8f,0x52,0xe5,0x04,0x11,0xb7,0xbc,0x6b,0x17,0x7f,0x5b,0xbb,0x12,0x2c,0x11,0xcd,0x38,0xad,0x24,0x02,0x0d,0xf9,0x7f,0x06,0x36,0xde,0x95,0x91,0xf0,0xab,0x23,0xf9,0x39,0x38,0x29,0xb3,0xe2,0xc8,0x4e,0x6f,0x15,0x81,0x34,0x40,0xf5,0x9a,0x44,0x65,0x19,0xbc,0x54,0xb0,0xf4,0x22,0x0c,0x3e,0xed,0xc3,0x02,0xae,0x94,0x14,0x05,0x21,0xb1,0x2e,0x73,0x4f,0xb2,0xed,0x7f,0xbc,0x26,0xda,0xee,0x54,0x93,0x08,0xee,0xec,0xe1,0xdd,0xd4,0x71,0x09,0x4c,0x7f,0x21,0xff,0x5a,0xf5,0x81,0x81,0x46,0xc0,0x7f,0x17,0x70,0x29,0x27,0x99,0x2a,0x7f,0xb1,0x22,0x1c,0x01,0x0a,0x2c,0x7f,0xd3,0xa1,0x83,0xf2,0xdd,0xc6,0x33,0xb3,0x1e,0x48,0xed,0x9e,0xf8,0xda,0x7a,0x2a,0x6b,0xc6,0x68,0x66,0x3d,0xf4,0xf4,0x81,0xbf,0x95,0xc1,0x7f,0xd9,0x3a,0xce,0x7f,0xa2,0x7f,0xd6,0x2c,0xdf,0x7f,0x0b,0x90,0x4c,0x13,0xdb,0x50,0x63,0x44,0x20,0xd4,0x29,0x1b,0x8d,0x32,0x5e,0xd7,0xfd,0xf8,0x14,0x32,0x27,0xab,0xa7,0x53,0x75,0xb6,0x03,0xa4,0xd2,0xca,0x26,0x24,0x16,0x2d,0x13,0x10,0x0a,0x47,0xda,0x0c,0xa8,0x5b,0xa6,0xff,0x2d,0x95,0xd5,0x46,0xfc,0xa3,0x9a,0x30,0x2a,0x56,0x4c,0xdf,0xd3,0xa9,0x7f,0x13,0xd9,0xa4,0xc9,0xfe,0x2d,0x06,0xbf,0x7f,0x8a,0x6a,0xea,0xe3,0x28,0x0c,0xcd,0x0f,0x08,0xd6,0x2c,0x3c,0xc6,0x7b,0xf0,0x19,0xd9,0xd6,0x3e,0xe2,0x3e,0xb0,0x16,0xbb,0xef,0xc9,0x05,0x29,0xd9,0xc3,0xd7,0x47,0x3b,0x5b,0x3a,0x1d,0x7f,0xe5,0x62,0xb4,0x1f,0x03,0x10,0xf6,0x37,0x47,0xd5,0x6b,0xb0,0xcd,0x7f,0x44,0x1e,0xa3,0x46,0x3d,0xfb,0x89,0xdc,0x7f,0x7f,0x17,0x7f,0xbd,0x47,0x40,0x0f,0x7f,0x00,0xc6,0x9e,0xd2,0x81,0x53,0xd1,0x44,0xe7,0x6f,0xe3,0xfc,0xdf,0x17,0x1c,0xbd,0xef,0x92,0xe1,0x0e,0xb7,0x7f,0x7f,0x2f,0x38,0xd8,0x12,0x2d,0xb9,0x28,0x4c,0x09,0x7f,0x33,0xe3,0x24,0xe7,0x7f,0xf8,0x5a,0x53,0xc6,0x12,0x6c,0xa9,0x7f,0xdb,0x81,0xfc,0x5d,0xeb,0x18,0x7f,0x2d,0x20,0xb1,0xdc,0xd2,0xbf,0xe2,0x10,0xce,0xfc,0x57,0x0d,0xc3,0xd9,0x02,0x22,0x7f,0xc6,0x94,0x70,0xf5,0xfd,0x06,0x57,0xb2,0x68,0x81,0x97,0x2c,0x35,0x10,0x7f,0xe8,0xea,0xe5,0xcd,0x4e,0xf9,0xd9,0xed,0x43,0x20,0xa3,0x8b,0x2a,0x8d,0x7e,0x2e,0xc8,0xa7,0x9b,0x81,0x55,0x2b,0xa3,0x0e,0xe8,0x33,0x40,0xf3,0xe0,0xe7,0x07,0x50,0xb0,0xc1,0xfb,0xd2,0x0a,0xd4,0xbf,0x7f,0x7c,0x01,0x7f,0x21,0x38,0xc4,0xff,0xae,0x7f,0x39,0xd3,0x7f,0xcb,0x9e,0x7f,0x12,0x81,0xcb,0xf0,0x05,0x37,0x1e,0xca,0x66,0xde,0x3d,0x5e,0x7f,0xcd,0x7f,0xac,0xaa,0xdd,0x7f,0x48,0x74,0xe0,0xe7,0xe3,0x7f,0x72,0x0e,0xc5,0x6b,0x7f,0xff,0x9c,0x9d,0x42,0x94,0x59,0x7f,0x7f,0x81,0x81,0x16,0xe6,0xfc,0x7f,0xc3,0x9a,0x7f,0xf1,0xfb,0xce,0xf1,0x37,0x6c,0xe0,0xb6,0x7f,0x2f,0xcf,0xc8,0xa9,0x06,0x47,0xf1,0x05,0x61,0x10,0x23,0x0c,0xa1,0xd4,0x64,0x2c,0x16,0xa1,0x33,0x63,0xfe,0xde,0xc6,0x25,0x18,0x59,0xe7,0x81,0x7f,0xe5,0x24,0x7f,0x32,0xbc,0x76,0x98,0xa3,0x0e,0x23,0x03,0x58,0x15,0xf3,0x0e,0x07,0x7f,0xe3,0xdb,0x08,0x26,0xd1,0x81,0x9e,0x26,0xd5,0x7f,0x20,0xce,0xb2,0xc5,0xb2,0x56,0x33,0x34,0xc6,0xf9,0xfc,0x25,0x22,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x8c,0xfe,0xff,0x04,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3c,0xf1,0xff,0xff,0x55,0xda,0xff,0xff,0x31,0x01,0x00,0x00,0x15,0x28,0x00,0x00,0xe6,0x0d,0x00,0x00,0x31,0xf9,0xff,0xff,0xdd,0x0e,0x00,0x00,0x3f,0xd8,0xff,0xff,0x71,0xf7,0xff,0xff,0x46,0xfc,0xff,0xff,0x5c,0x06,0x00,0x00,0xe3,0xed,0xff,0xff,0x00,0x00,0x00,0x00,0xe6,0x8c,0xfe,0xff,0x04,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x8c,0x9a,0x81,0x18,0xfb,0xa8,0x81,0xba,0x5d,0x66,0xdc,0xd7,0x87,0xbd,0x5a,0x3d,0x99,0x9c,0xc4,0xea,0xd7,0xb3,0x46,0x64,0xda,0x8d,0x00,0xe3,0x33,0x7f,0xac,0xdb,0x95,0x58,0x6d,0xe9,0x86,0xd7,0x11,0x5c,0xb1,0x3a,0x55,0xf8,0xe3,0xe7,0xdd,0xdc,0xca,0x81,0xd0,0xf5,0xc4,0xfe,0xc8,0x75,0x09,0x3a,0xc7,0x85,0x7f,0x81,0x58,0xa1,0xf4,0x49,0xb2,0xb5,0x18,0x81,0xa8,0xd4,0xa4,0xb5,0xd3,0x33,0xb8,0xb6,0xbf,0xbf,0xb5,0xce,0xec,0xef,0xe8,0x0c,0x81,0x06,0xef,0x08,0x20,0x3b,0xac,0xac,0x22,0x43,0x7f,0xe7,0x07,0x40,0xde,0x27,0xe5,0xf7,0xeb,0xa3,0x93,0x7f,0x53,0x2f,0x4b,0xef,0xee,0xe9,0x91,0x23,0x7f,0x32,0x86,0xc6,0x3a,0x1d,0x53,0xe4,0x86,0xd2,0xfd,0xbe,0xd9,0x10,0x29,0xc1,0x0d,0xcd,0x4a,0xdb,0xae,0xaa,0xfe,0xcf,0x44,0x18,0xae,0xc7,0x93,0x7f,0x13,0xf1,0xcf,0xf9,0x08,0xfd,0xe4,0x7f,0x7f,0xd0,0xd8,0xb8,0x88,0xb5,0x10,0xd8,0xaa,0x3a,0xef,0x34,0xe5,0xe7,0x16,0x0b,0x41,0x15,0xd4,0xf2,0x7f,0xc2,0xdf,0x81,0xec,0xb7,0x7f,0xb1,0xa5,0xd6,0xb9,0xce,0xfe,0x94,0x81,0x69,0xdd,0x32,0x26,0x93,0x85,0xbe,0xef,0x3e,0x0b,0x7d,0x0c,0x7f,0x65,0x18,0xc8,0xff,0x54,0x7f,0x18,0xeb,0x96,0x13,0xdc,0xb6,0xbe,0x5e,0x15,0xcb,0x7f,0xf5,0x7f,0xd4,0x7f,0x8f,0x6b,0x30,0xbe,0x91,0xdd,0xd9,0x96,0xe9,0x7f,0x7f,0xe3,0xb7,0x81,0xe9,0x3a,0x3e,0x81,0x63,0xb3,0xe6,0xe8,0xba,0x7f,0x81,0xb9,0xe5,0x30,0xda,0x15,0x65,0x9b,0xe6,0xa2,0x55,0x7f,0xf9,0xc4,0x03,0x56,0x43,0xd9,0x2c,0x5e,0xfc,0xfb,0x9f,0xdd,0x8d,0x9a,0x6c,0x90,0xdd,0xaf,0x22,0xb4,0x81,0x18,0x0e,0xc4,0x81,0x30,0x73,0x69,0xa7,0xe9,0x17,0x9c,0xb7,0x28,0x9b,0x75,0xa3,0xcd,0x9b,0xd6,0xc3,0xad,0x26,0xd8,0x73,0x3c,0xdd,0xb8,0xee,0xdc,0x31,0xe3,0xc5,0xf0,0x18,0x22,0x81,0xf1,0x4f,0x42,0x58,0x87,0x0d,0xf3,0xc9,0xfa,0x59,0x06,0x72,0x2b,0x81,0x6a,0x7c,0x3e,0x0a,0xd4,0x3c,0x81,0x88,0x3e,0x2f,0x07,0x95,0x19,0x00,0x1c,0x14,0x62,0x83,0x90,0x58,0x4e,0x47,0x08,0xb1,0x84,0x7a,0xde,0x30,0x12,0x30,0xd2,0x41,0xde,0x7d,0x3b,0xf7,0xba,0x21,0x8f,0xfe,0xfd,0x22,0x81,0xea,0x1b,0x7a,0x07,0x10,0x1d,0x71,0xc0,0xb2,0xee,0xb2,0x8f,0xa0,0x9c,0x05,0x81,0xf4,0xa7,0x30,0x65,0x7e,0xd2,0xcc,0x01,0xb2,0x5d,0x12,0x17,0x47,0x7f,0xa0,0x03,0xc0,0xd0,0x60,0xa9,0x81,0x7a,0x49,0xe9,0xa4,0xbc,0x81,0x81,0xc1,0xbb,0x45,0xa6,0x22,0xd6,0xeb,0x96,0xc5,0xf9,0x5e,0x1a,0x95,0x7f,0x1f,0x50,0xa5,0x48,0x39,0xe4,0x29,0xc0,0xa1,0x7f,0xeb,0xe8,0xff,0x2d,0x1d,0x2a,0xb4,0xd7,0xfa,0x14,0x1a,0x0e,0x1b,0x14,0xc1,0x92,0x1d,0x2f,0x81,0xb5,0x44,0xe6,0x81,0x4d,0xee,0x13,0x97,0x7f,0x36,0x2f,0x04,0x2c,0x46,0xed,0x36,0x15,0xd9,0x1b,0xe6,0x7f,0x56,0xd7,0x12,0x1e,0xd8,0x0c,0x0e,0x16,0xf5,0x00,0xf7,0xd8,0xd0,0x4b,0xd7,0xa4,0xfe,0xe1,0x9d,0xab,0x81,0x65,0x08,0x50,0x18,0x50,0x53,0x06,0xc2,0xe6,0xad,0x27,0xae,0x28,0x3d,0xcf,0xc7,0x20,0xdb,0xe4,0x24,0x49,0xc7,0xf1,0xe8,0xe2,0x00,0x20,0xcb,0x14,0xc0,0xfb,0xe8,0xb2,0x23,0xc3,0x31,0xc0,0x00,0x10,0xd1,0x66,0x11,0xd7,0xb4,0x81,0xe3,0x03,0x81,0xc5,0xd0,0xb5,0x42,0xef,0xa9,0x28,0x13,0xdd,0xc1,0x68,0x7f,0x2d,0x81,0x20,0xef,0x0f,0x32,0x24,0xd6,0x7f,0xa1,0x04,0x7f,0x55,0x43,0x1d,0x33,0x81,0x7f,0x22,0x11,0x0c,0xa9,0xc5,0x5d,0x35,0x69,0x0d,0xf7,0x7f,0x10,0xc2,0x21,0xed,0x1c,0x97,0x32,0x0c,0x7f,0x08,0xfe,0x09,0x0b,0xd6,0x94,0xe0,0xc6,0xa4,0x62,0x81,0xf9,0xb1,0x0b,0xa3,0x06,0x7f,0x7d,0xc0,0xcd,0x05,0x84,0x18,0xc4,0x21,0x29,0x66,0x9e,0xd4,0xdd,0xd6,0x6a,0xaf,0x9e,0x45,0xdd,0xde,0x65,0xec,0x51,0x44,0xb1,0x06,0x52,0xad,0x34,0xc8,0x8c,0x86,0xbf,0xad,0xad,0x0b,0x7f,0x78,0x2c,0xcb,0xb7,0x51,0xa4,0xd1,0x51,0xb5,0x81,0x5f,0xfc,0x2e,0x24,0x24,0x0d,0xc3,0x8a,0xd5,0xb5,0x77,0x82,0xd4,0x7f,0x4a,0x22,0xf3,0xd4,0x7b,0x5a,0xff,0xd9,0x7f,0x19,0x38,0xb2,0xaf,0x08,0xb6,0x48,0xc3,0xb6,0x81,0x6c,0xdd,0xa0,0x7f,0xf7,0xa6,0x7f,0xaa,0x00,0x18,0x7f,0x96,0x7f,0x81,0x68,0x7f,0xe9,0x1e,0x6b,0xed,0x81,0x81,0x81,0x7f,0xff,0xa6,0x7b,0xd9,0x1c,0xa5,0xfa,0xf2,0x7f,0x88,0xcb,0xeb,0x7a,0x02,0x31,0x10,0x3f,0xd9,0xb9,0xe5,0xd5,0x7f,0x56,0x81,0xb8,0x7f,0x47,0x9a,0xbb,0xf1,0xcc,0xb6,0x7f,0x50,0x7f,0x81,0x3a,0xd0,0xe3,0x81,0xe0,0xd0,0xdf,0x49,0xe1,0xb1,0x40,0xee,0x7f,0x2c,0x81,0xdf,0x15,0x19,0x9d,0x53,0x4b,0x0c,0xc6,0x8f,0x45,0x41,0xc2,0xea,0x18,0x23,0x9a,0x87,0xff,0x6a,0x7f,0x54,0x83,0x47,0x43,0xce,0xbd,0x1e,0x2d,0xfa,0x81,0x93,0xa1,0x0b,0x7f,0x0d,0xd1,0x3e,0x7f,0xa3,0x81,0x48,0xe9,0xdf,0x31,0x1b,0xd6,0x01,0x48,0xad,0x9f,0x93,0x04,0x71,0xd3,0x27,0x7f,0x7f,0xc4,0xd7,0xa3,0x57,0x06,0xb8,0xf8,0xbb,0x71,0x52,0xe0,0xc9,0x11,0x7f,0xb7,0x56,0xea,0xbf,0x81,0x7f,0xa0,0xd6,0x7f,0xec,0xa6,0xe7,0x81,0xc7,0xad,0x12,0x7f,0x23,0x9a,0xed,0xed,0x18,0x4d,0x7f,0xd8,0xf6,0x59,0xc7,0x7f,0x9c,0x9a,0x81,0xbb,0x7f,0xa2,0x1e,0x46,0xdd,0x10,0x1b,0xf2,0x7f,0xee,0x7f,0xc8,0x83,0x31,0xf7,0xca,0xbf,0x7f,0xa6,0xcb,0x5d,0x1d,0x58,0xe3,0xec,0xa2,0x39,0x36,0x0e,0xab,0x50,0x6b,0xf9,0xda,0x58,0x23,0x27,0x51,0xac,0x18,0x91,0x2f,0xe3,0x45,0x84,0x68,0x7f,0xc9,0x70,0xd6,0x1c,0x4d,0xbc,0x1d,0x15,0x5f,0x8f,0xaa,0x88,0x6a,0x63,0xf3,0x3d,0x64,0xd1,0xba,0xc1,0xa9,0x7e,0x0a,0xc4,0x7f,0xd3,0x10,0x81,0x40,0x21,0x59,0xc8,0xd8,0xe5,0xba,0xd7,0xec,0x14,0x14,0xef,0xc6,0xf6,0xce,0x82,0x65,0x9f,0xac,0x6f,0xd5,0xa4,0x81,0x7f,0x3e,0x31,0x46,0x4c,0x71,0x86,0x7f,0xc9,0xf0,0x99,0xe6,0xb5,0xdb,0x27,0x21,0xef,0x3a,0x26,0x6a,0xe9,0x65,0xfb,0x2e,0xf9,0xc3,0x18,0x4a,0xd9,0xd4,0x99,0x18,0xc4,0x81,0x00,0x00,0x00,0x00,0xe6,0x90,0xfe,0xff,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xc4,0x16,0x00,0x00,0xa6,0xe4,0xff,0xff,0xd7,0x00,0x00,0x00,0x7a,0x34,0x00,0x00,0x79,0xd6,0xff,0xff,0xaa,0xdf,0xff,0xff,0x98,0x19,0x00,0x00,0xd4,0x0a,0x00,0x00,0xf3,0xea,0xff,0xff,0x33,0x0f,0x00,0x00,0x12,0x06,0x00,0x00,0x79,0x12,0x00,0x00,0x8c,0x02,0x00,0x00,0x0c,0xf6,0xff,0xff,0xd4,0x07,0x00,0x00,0xa1,0x3e,0x00,0x00,0x40,0x08,0x00,0x00,0x6c,0x15,0x00,0x00,0x5e,0x1a,0x00,0x00,0xc2,0x05,0x00,0x00,0x9c,0xe3,0xff,0xff,0xa1,0x19,0x00,0x00,0xfd,0xf1,0xff,0xff,0x59,0xfe,0xff,0xff,0x00,0x00,0x00,0x00,0x56,0x91,0xfe,0xff,0x04,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x70,0x50,0x55,0x9f,0x54,0x0e,0x90,0x63,0xbb,0x07,0x77,0x49,0x05,0x04,0x30,0xfa,0x9c,0xb4,0xd0,0xe5,0x04,0x91,0x57,0x57,0x6b,0x84,0x90,0x5e,0x4c,0xbb,0xc9,0xd3,0xad,0x17,0x3b,0x03,0x78,0xe1,0x34,0x8d,0x9c,0x17,0x62,0x1b,0x50,0x84,0x01,0xd5,0xb8,0x81,0x1a,0xaa,0x87,0x09,0x44,0x19,0xeb,0x99,0x21,0x5d,0x9f,0xb7,0x55,0x55,0x7f,0x48,0xbf,0xe6,0x3d,0x9d,0x15,0x4b,0xa1,0x7f,0xce,0xa9,0x25,0x77,0x22,0xe7,0xff,0x81,0xff,0xf3,0xbe,0xfc,0x0a,0xe1,0xb3,0x0d,0xfd,0x68,0x9b,0x0e,0xc2,0x2e,0xbf,0xd8,0x9e,0x81,0xed,0x41,0x91,0xdb,0x94,0x44,0x99,0x5c,0x4b,0x51,0xc6,0x90,0x68,0x3e,0x8a,0x8c,0x04,0x02,0xe4,0x13,0xba,0xb7,0xbd,0x28,0x81,0x7f,0x56,0xc4,0x7f,0x7f,0xaa,0xd3,0xca,0xa3,0x11,0x01,0xc2,0x49,0x2d,0x7f,0xdd,0xdf,0x67,0xbe,0x92,0x5f,0x69,0xf5,0x7a,0xf5,0x26,0xd4,0x1f,0xbf,0xe6,0xc2,0x7f,0xb9,0x34,0xf4,0x46,0x12,0xb9,0xed,0xba,0x12,0x7f,0x7f,0x81,0x9a,0x7f,0x88,0x81,0x9d,0x7f,0x06,0xf7,0x81,0x21,0xd3,0x0e,0xd7,0x7f,0x7f,0xde,0xb6,0x81,0xbb,0x53,0x18,0xf5,0x3c,0x21,0xb4,0xac,0x17,0x19,0xd9,0x7f,0x94,0x5b,0xa7,0xf9,0xf7,0x97,0x7f,0x7f,0x03,0xea,0xd3,0xb4,0xb0,0x62,0x7f,0x2a,0xe3,0xa9,0x03,0x90,0x44,0x7f,0xe6,0xdd,0xb0,0x70,0x50,0xce,0xab,0x1a,0x7f,0x87,0x57,0x52,0x0f,0xb2,0x39,0x0f,0x3d,0xa7,0xe1,0xea,0xa7,0x3f,0x05,0x1f,0x81,0x7e,0x59,0xc8,0x7f,0x57,0x2c,0xc1,0xd5,0xca,0xc1,0x1c,0xff,0x32,0x05,0x4e,0xec,0x53,0x7f,0x81,0x1e,0x60,0xf1,0x42,0xab,0xf9,0x2c,0xba,0x7e,0x30,0x5a,0x81,0xf4,0x34,0xfa,0x2d,0xba,0x0c,0x7f,0x87,0xc2,0x58,0xb7,0xa7,0x09,0xa0,0xf3,0x86,0x51,0x0c,0x42,0x58,0xba,0xa2,0xbe,0x3b,0x7f,0xeb,0x09,0x02,0x9c,0xee,0x74,0xc5,0xe3,0x10,0xe9,0xb0,0x11,0xf8,0xca,0x81,0xf0,0xce,0x6e,0xd5,0xd2,0xd4,0x83,0xdc,0x2d,0x81,0x01,0x81,0x2e,0xb1,0x60,0x1a,0xac,0x68,0x8f,0xdb,0x62,0x7f,0x8c,0x7f,0x16,0x9a,0xec,0xa3,0x1f,0x36,0x2f,0xd1,0xde,0x3d,0xe1,0xcc,0xfc,0xd0,0x8b,0x0a,0xd7,0x65,0x06,0x53,0xaa,0xa6,0xa5,0xb1,0xe6,0xd8,0x37,0xc6,0x15,0xc1,0x02,0x19,0x83,0xa8,0xcb,0x2e,0x81,0x25,0xe7,0x0a,0x63,0x81,0xb8,0xe6,0x5f,0xe7,0x81,0xa9,0x47,0xdd,0xf2,0x32,0x81,0xd8,0x2a,0xf3,0xe7,0x4a,0xce,0x41,0x7a,0x4e,0x2b,0x46,0x81,0xee,0x39,0xa5,0x2c,0xa9,0xd1,0x2a,0xed,0xf6,0xc7,0xdf,0xe2,0x0f,0xc7,0x90,0x1a,0x06,0xab,0x92,0xea,0x37,0x7f,0x1f,0x03,0xd4,0x77,0xe6,0x11,0xd5,0xd9,0xe3,0xdc,0x8e,0xf5,0xfc,0x22,0x4d,0x87,0x0a,0x71,0xae,0xac,0xac,0x8e,0xfd,0x97,0x67,0xf0,0xf9,0x81,0xdb,0xc0,0x08,0xf7,0xfa,0x1a,0x14,0xc9,0x10,0x15,0x1e,0xc7,0xbf,0x2e,0x81,0x1c,0xf2,0xf7,0x09,0x38,0xdf,0xde,0x0e,0x07,0xd1,0x2d,0x81,0xd6,0xed,0x1d,0x81,0xba,0xa7,0xea,0x0d,0x8e,0xb2,0x6e,0xfd,0xfc,0x7f,0xeb,0x22,0xc8,0x43,0x0a,0xa8,0xbb,0xb6,0xb1,0x11,0xb5,0xde,0xd6,0x38,0x11,0xbd,0xdd,0x14,0x03,0x92,0xf8,0xac,0xb9,0x2b,0xc4,0x0a,0xb4,0x09,0xe7,0xe0,0x4a,0xaf,0xa7,0x0f,0x1c,0x3d,0x28,0xe7,0xc9,0xca,0x00,0x9c,0xeb,0x68,0x13,0x22,0x81,0xfe,0x81,0xd6,0x4d,0x2b,0x2d,0x4d,0xdd,0x34,0x81,0xee,0xf5,0xfa,0x17,0x1c,0x70,0xe3,0x58,0xcb,0x81,0x7c,0xe2,0x81,0xe1,0x7f,0x14,0x9d,0x12,0xeb,0xf5,0x81,0xf4,0xfb,0xe0,0x7f,0x7f,0x1e,0xde,0x7c,0x11,0xb6,0x3c,0x1c,0x98,0x64,0xe3,0xdb,0x4c,0x7f,0x23,0xb2,0xaa,0x12,0x9b,0xad,0x4b,0x08,0xa3,0x3d,0x22,0x00,0x7f,0x95,0x7f,0xae,0x91,0x46,0x6d,0x90,0xab,0xc4,0xd8,0x30,0x8e,0xe1,0x1c,0x18,0x01,0x37,0xf4,0xb1,0x88,0x7f,0x50,0x7f,0x55,0xfc,0x06,0x7f,0xc1,0x98,0xf5,0x1b,0xc2,0xb2,0xf6,0xd7,0xc2,0x17,0x7f,0x81,0x1d,0x07,0x81,0x89,0xf7,0x05,0x96,0x0f,0x0f,0xf4,0x71,0xf6,0x0b,0xbc,0x19,0xe9,0x10,0xa6,0x01,0x07,0x23,0x4a,0x81,0x23,0x81,0xc9,0x81,0x7f,0x7f,0xe4,0xb0,0x4b,0xff,0xef,0x6a,0xc9,0xf7,0x7f,0xc0,0xb4,0xa5,0x1d,0x0b,0x18,0xfd,0xdd,0xda,0x61,0x9b,0x42,0xa4,0x12,0xea,0x5f,0x91,0x81,0x81,0x25,0x4c,0xec,0xc2,0x3c,0xfa,0xbc,0x81,0xb4,0x1e,0x72,0xda,0x89,0x27,0xe9,0x05,0xab,0xce,0xa3,0x3e,0xdd,0x92,0x9c,0x81,0xf3,0xfd,0x65,0xc8,0xd6,0xb8,0x59,0x9f,0x04,0xc7,0xa0,0x4e,0x45,0x57,0xcd,0xda,0xdf,0x2b,0xaf,0xc4,0xfb,0xb6,0xe9,0xbc,0x7f,0x94,0x1c,0xbd,0x16,0xc2,0xfd,0x16,0x0c,0xa7,0xa9,0xcd,0x7f,0x4b,0x07,0x4d,0x16,0x67,0x43,0x0b,0x3b,0x9e,0xf7,0xd7,0xb8,0x78,0x3a,0x6a,0xe6,0xb4,0xeb,0x26,0x7f,0xa7,0x6c,0x4b,0x70,0x95,0x12,0x07,0xba,0xfe,0xb4,0x7f,0x9c,0x81,0x28,0xd4,0xea,0x7f,0xbe,0x60,0x42,0xc5,0x22,0xd2,0xbe,0x03,0x4a,0xbb,0xe7,0x9e,0x02,0xd1,0x7f,0x7f,0xf0,0x81,0x37,0x7f,0x81,0x44,0xd2,0xde,0xf1,0xb5,0xa5,0x7f,0xb9,0xd7,0xa1,0xe7,0xee,0x04,0x7f,0xf8,0xf6,0xfb,0xdb,0xd6,0x46,0x87,0xdf,0xf3,0x54,0x81,0xab,0xe5,0xe4,0xd2,0xe3,0x7f,0xd2,0x0c,0xe8,0xcd,0xb8,0x1f,0xc5,0x81,0x7f,0xfa,0xaf,0x7f,0x7f,0x90,0x7f,0x2f,0xad,0x7f,0xd1,0xfd,0x1b,0x7f,0xfb,0xfc,0x2c,0x76,0xfe,0xc6,0x7f,0x5d,0x7f,0xd3,0x7f,0xe6,0x04,0x65,0x47,0x04,0x81,0xb5,0xd7,0x1c,0x11,0xcd,0x6b,0x73,0xb5,0x9f,0x52,0xe9,0xd0,0x68,0x4a,0xec,0x95,0xd5,0xa1,0xb1,0xc0,0x28,0xfc,0x07,0xf2,0x60,0x7f,0xd3,0x1c,0x81,0x81,0x01,0x81,0x8c,0x71,0xa9,0x11,0x53,0x3e,0xc3,0x5e,0xbc,0xa4,0xa8,0xcb,0xfd,0x7e,0xa9,0x81,0x21,0xc8,0xd6,0xa6,0xf5,0xbc,0xb6,0x11,0x7c,0xa7,0x51,0xf8,0x01,0x2c,0x20,0xe0,0xc0,0x35,0xad,0x36,0x7f,0x5a,0xc0,0x52,0x53,0x01,0x31,0xe0,0x46,0x46,0x38,0xe9,0xd0,0xe3,0xd1,0x34,0xc8,0x23,0x9d,0x17,0x28,0x06,0x1c,0x0b,0x99,0x81,0xb2,0x7f,0x96,0x2e,0x69,0x04,0x32,0x1a,0xfb,0x55,0x92,0x24,0xd6,0x97,0x7f,0x34,0x7e,0xef,0xcd,0xf8,0xb1,0x13,0x8c,0x00,0x00,0x00,0x00,0x56,0x95,0xfe,0xff,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x5b,0x1b,0x00,0x00,0xf9,0xad,0xff,0xff,0xae,0x43,0x00,0x00,0xfc,0x81,0xff,0xff,0xe2,0x28,0x00,0x00,0xcf,0x20,0x00,0x00,0x49,0xed,0xff,0xff,0xdf,0xd4,0xff,0xff,0xae,0x04,0x00,0x00,0x93,0x85,0xff,0xff,0xaf,0x27,0x00,0x00,0xe3,0xe7,0xff,0xff,0x35,0x9b,0xff,0xff,0x82,0x49,0x00,0x00,0x39,0x14,0xff,0xff,0xad,0xc7,0x00,0x00,0x9c,0x6c,0x00,0x00,0x05,0xb8,0xff,0xff,0x06,0x41,0x00,0x00,0x0a,0x84,0x00,0x00,0x54,0xc5,0xff,0xff,0x29,0xa8,0x00,0x00,0xd2,0xd0,0xff,0xff,0xaf,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0x95,0xfe,0xff,0x04,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0xba,0x3a,0x32,0x38,0xcd,0x6d,0xd0,0x25,0x3a,0x4c,0x38,0xc9,0x79,0x52,0xf8,0xa9,0xf6,0xf2,0xd5,0xcc,0xce,0x6b,0xfa,0xc5,0xfa,0x43,0xac,0x4f,0x29,0x42,0x56,0xab,0x1d,0x15,0xfe,0xc2,0x19,0xbe,0xed,0x25,0xe6,0x4a,0xc0,0x4b,0x47,0xc8,0x5a,0xa7,0x5c,0x70,0xbe,0x7f,0x40,0xbc,0xb1,0xa0,0xe5,0xbd,0x0e,0xf3,0x0c,0xe9,0x40,0x38,0x33,0x0c,0x1e,0xf1,0x35,0x49,0xd2,0x94,0xe7,0x40,0xda,0xc6,0x4b,0xe0,0xd2,0x14,0xec,0x32,0x90,0xe3,0x21,0x05,0x1a,0xc8,0x4b,0x3d,0x07,0xcd,0x1b,0x54,0xb3,0xac,0x28,0x10,0x4a,0xf7,0x02,0x50,0x1f,0x4e,0x1d,0xd8,0x40,0xc5,0x29,0xb1,0xd4,0x6c,0x5a,0x2b,0xbd,0xae,0xcb,0x04,0xae,0xd6,0xec,0x22,0xe1,0xc6,0x69,0x51,0x7f,0x03,0x3b,0xad,0xc8,0xc4,0x8e,0xa4,0xc7,0xc8,0x3e,0xc0,0x4b,0x34,0x66,0x01,0xaf,0xa5,0x8f,0xc2,0x39,0x01,0xad,0x05,0xfb,0xb7,0x81,0x61,0x75,0x4c,0x90,0x7f,0x95,0x3b,0x69,0x70,0x73,0xf0,0x73,0x7a,0xcb,0xbf,0xa8,0x26,0xbe,0xb1,0xa7,0x6a,0x77,0xc3,0xa1,0x73,0x83,0x65,0x20,0x7d,0x77,0xb3,0x5d,0x1b,0xd7,0x8b,0x2f,0x23,0xcc,0x4f,0xa8,0x72,0x95,0x7f,0x64,0xcd,0x7f,0xff,0x7f,0x7f,0x8c,0x69,0x5f,0x3e,0xd4,0x18,0xb9,0xcc,0x32,0x4c,0xdf,0xdc,0x5e,0x4f,0x41,0x38,0xc7,0x1d,0x75,0x5a,0x49,0xcc,0xda,0x35,0x85,0xd0,0x50,0xa7,0x3b,0x43,0x81,0x5b,0x8f,0xc6,0x5d,0x4f,0x0d,0xc8,0x73,0x6d,0x99,0xaf,0x2b,0xbf,0xc8,0x85,0x4d,0x3d,0x46,0xee,0xfd,0x4f,0x4f,0x7f,0xcf,0x8a,0x5e,0xfc,0x20,0x91,0x8b,0x7f,0x5a,0x34,0x53,0x81,0x86,0x2d,0x99,0xaf,0xdf,0x27,0x81,0x8b,0x7f,0x52,0x61,0xd7,0x6d,0xbf,0x8e,0xa8,0xce,0xc1,0xaa,0x92,0x61,0x1e,0xde,0x4c,0x76,0xd8,0xbd,0x81,0x4e,0x92,0x79,0xf1,0xa7,0x2d,0xa8,0x99,0xb9,0x48,0x3c,0x25,0xa4,0x11,0xd7,0x12,0x29,0x2f,0x71,0x1a,0x19,0x64,0xf0,0xde,0xc5,0x44,0xf6,0xd8,0xbb,0x51,0x45,0xe1,0xe1,0x62,0xa9,0x50,0xfe,0x71,0x4a,0xc7,0x31,0xf2,0xf8,0xd2,0x2b,0x5d,0xeb,0x36,0xdd,0x57,0xd5,0x52,0x37,0xd2,0x2d,0x2a,0x5a,0x42,0xc2,0xd2,0x25,0x66,0xce,0x52,0xd0,0xe3,0x07,0x45,0xd7,0xdb,0x4b,0x34,0x2c,0x18,0xe3,0xd9,0x60,0x44,0x2b,0xd2,0x0a,0x33,0xed,0x81,0xff,0xa1,0xe3,0x3d,0xab,0x40,0xae,0xd3,0x3d,0x42,0x06,0xaa,0x52,0x16,0x2f,0xeb,0x1d,0x81,0xc1,0xc4,0x22,0x27,0x15,0x0d,0x23,0x1c,0x43,0x3f,0xf2,0xc9,0x57,0x11,0x25,0xca,0xb4,0x08,0x4e,0x0f,0xc1,0xc4,0xe8,0xef,0x9d,0xb7,0xdf,0x42,0xa6,0xab,0x56,0x37,0x0b,0xff,0x33,0xa0,0xc0,0x93,0xbc,0x11,0xa6,0x30,0x36,0x6d,0x81,0x35,0x39,0xef,0xd5,0x8b,0x7f,0xb1,0x4f,0x07,0xb6,0xdd,0xcd,0xcf,0xb7,0x3e,0x4f,0x40,0xb5,0x6f,0xa1,0x49,0x6f,0x5f,0x7c,0x96,0x7a,0x44,0xe4,0xb3,0xb1,0x48,0x64,0xb2,0xa4,0x50,0xe7,0xc2,0xcd,0x5a,0xae,0x65,0x4b,0x50,0x5a,0x9d,0x3c,0x5d,0xd3,0xb8,0x39,0x9f,0x86,0x4f,0xb6,0x5a,0x92,0x40,0x69,0x87,0x0c,0x81,0x20,0x60,0x91,0x74,0x2d,0xa4,0x2b,0x8e,0xbe,0x81,0x52,0x27,0xa0,0x81,0x50,0x60,0x49,0x33,0x7f,0x41,0x46,0x5b,0xa2,0xb3,0xbe,0x4b,0xb4,0xb6,0x63,0x9f,0xdf,0x50,0x86,0x48,0x8c,0x9e,0x45,0x42,0x52,0x81,0x0f,0x7f,0x4f,0xa9,0x4b,0x5c,0x8f,0xba,0x42,0x32,0x72,0x37,0x2f,0x47,0x76,0x3f,0xe5,0xaa,0x48,0x32,0x7f,0xa1,0xac,0x30,0x23,0x4f,0xb1,0xe1,0x94,0x50,0x11,0xcd,0xb5,0x43,0xbe,0xb3,0x73,0x64,0x5e,0xa3,0x2c,0xaf,0xa3,0xee,0x88,0xb7,0xa8,0x81,0x54,0xbf,0x74,0x51,0x55,0x91,0x81,0x31,0x94,0xc8,0x5a,0x9d,0x1e,0x7f,0xba,0xad,0x9e,0x7f,0x7f,0x7f,0x81,0x6d,0x81,0x7f,0x7f,0x7f,0x7f,0x68,0x7f,0x71,0x81,0xb5,0x81,0x7f,0x7f,0x81,0x84,0x7f,0x76,0x81,0x81,0x7f,0x81,0x7f,0x7f,0x7f,0x7f,0x98,0x7f,0x7f,0x81,0x81,0x7f,0xa2,0x81,0x7f,0xba,0x7f,0x8a,0x78,0x7f,0x81,0x1e,0xfb,0x10,0x76,0x81,0x60,0x7f,0x7b,0x7f,0x52,0x81,0x85,0x7f,0x6a,0x81,0x9f,0x7f,0x7f,0x7f,0x7f,0x49,0x5e,0x7f,0x7f,0x30,0x81,0x81,0x66,0x81,0x91,0x7f,0x81,0x7f,0x7f,0x8a,0x7f,0xa3,0x81,0x7f,0x7f,0x59,0x89,0xd6,0x5e,0x81,0x81,0x7f,0x0e,0x81,0x87,0x7f,0x7f,0x7f,0x7f,0x54,0x7f,0x7f,0x4e,0x85,0x81,0x7f,0x6a,0x76,0x81,0x8f,0x18,0x0a,0x7f,0x7f,0x90,0x81,0x7f,0x29,0x81,0x81,0x7f,0x90,0x81,0x5d,0x30,0x74,0x81,0x7f,0x81,0x81,0x81,0x81,0x9b,0x81,0xee,0x7f,0xe5,0x26,0x7f,0x7f,0x81,0xa3,0x33,0x5a,0x81,0x7f,0x81,0x5f,0x43,0x81,0x81,0xa1,0x68,0x51,0x44,0xa0,0x3b,0xa3,0x3a,0x44,0x3f,0x5f,0x7f,0x10,0x7f,0xe0,0x81,0x8a,0x40,0x74,0xc3,0xad,0x5d,0x7f,0xbe,0xc0,0x67,0x9e,0x54,0x35,0x4d,0x5f,0xa2,0x50,0x28,0xc9,0x9b,0x56,0xec,0x88,0x38,0xba,0x09,0xb1,0x34,0x36,0x9d,0x03,0x56,0x58,0x50,0xab,0xc0,0x58,0x7f,0x11,0x7f,0xb4,0x95,0x47,0x33,0xc9,0xa0,0x55,0x60,0x5a,0x4e,0x90,0x5b,0x44,0x6d,0x7f,0xbc,0xc7,0x58,0xbe,0xb0,0x2d,0xb7,0xd2,0x5a,0xcf,0x4f,0x81,0xb6,0x58,0x6e,0x3a,0xb2,0xe4,0xc7,0x32,0xae,0x60,0xa3,0xb8,0x81,0x2c,0x4c,0x40,0x61,0x42,0x29,0x48,0x25,0xad,0x94,0x60,0x67,0x33,0xb2,0x9e,0xf4,0x0f,0x42,0xcb,0xb3,0x9d,0x39,0x2c,0xa1,0xc9,0x4b,0xad,0xbf,0xdb,0x47,0x45,0xaf,0x46,0xb1,0x9b,0xb1,0x8a,0x5d,0xc1,0x66,0x53,0x7f,0x99,0x3f,0x3d,0xa8,0xac,0x08,0x5d,0x9d,0x4f,0xa4,0x2c,0xaf,0xaf,0x9d,0xdb,0x14,0x34,0x3c,0xf4,0x15,0xc9,0x35,0x22,0x23,0x55,0xed,0x0e,0xdc,0xfc,0x9a,0xbc,0x43,0x52,0xdd,0xd6,0xb8,0xc0,0xe9,0xbc,0x31,0xb8,0x55,0x32,0x24,0xe4,0x81,0x26,0x40,0xc3,0xe0,0x3b,0x81,0xce,0x37,0xde,0x2a,0xc2,0x0b,0x2a,0xb9,0xc1,0x97,0xcd,0x2d,0xcb,0x3f,0x1a,0xc0,0xde,0xb5,0xe1,0xcc,0x3a,0x36,0xd9,0xbd,0x5e,0x49,0x3b,0x4f,0x3e,0x61,0xf8,0x3e,0xc8,0xb8,0xd9,0x44,0xb9,0xbf,0x38,0xd0,0xd4,0x40,0x8d,0x40,0xc4,0xc9,0x3b,0x3a,0x55,0xc0,0xaa,0x4a,0x45,0xe6,0x34,0x46,0xc3,0x0d,0x2d,0x00,0x22,0x3e,0x4e,0xf1,0x57,0xec,0x96,0xd1,0x2d,0x62,0x78,0xa7,0xb3,0xdf,0xa3,0x40,0xdb,0xed,0x10,0xe0,0x50,0xf0,0xdc,0x7e,0xb6,0xa5,0xec,0x9b,0x0e,0xa5,0x01,0x33,0xc3,0x19,0xe3,0x74,0xce,0x99,0x2a,0xc6,0x49,0x2e,0xe7,0x9f,0xba,0x41,0xc0,0xe3,0xf8,0xf6,0x58,0x55,0xc7,0xf1,0xfb,0x56,0x41,0x41,0xe4,0x61,0xbe,0x53,0x66,0x04,0x53,0x60,0x43,0x2b,0xb3,0xcf,0xbc,0x63,0x76,0xb4,0x81,0xc1,0xaa,0xc3,0xaf,0x39,0xb1,0x49,0x67,0x34,0xfc,0xa9,0x30,0x68,0xb9,0xc4,0x5d,0x90,0xb9,0x4d,0x81,0x3f,0x81,0x36,0x38,0xa3,0x9f,0x08,0x8c,0x3c,0xc9,0x02,0x35,0x11,0xd8,0x19,0xad,0x90,0x72,0x7f,0xb8,0xc0,0x62,0x6c,0x66,0x55,0x36,0x7f,0xf8,0x60,0x03,0x9c,0xb4,0x7f,0x90,0x88,0x2d,0xa9,0x46,0x5e,0xb5,0x50,0x82,0xbe,0x5b,0x5c,0x7f,0x96,0x81,0x20,0x81,0xa7,0x52,0x17,0x9c,0x43,0x4f,0x2d,0x69,0x72,0x7f,0x0f,0x63,0xdb,0x81,0xa0,0x4f,0x7f,0x71,0xaa,0x81,0xbd,0x81,0x69,0x4d,0x9f,0xf2,0xa8,0x7f,0xcd,0xc3,0x77,0x91,0xa3,0xf4,0x8b,0x69,0xce,0x18,0xcf,0x97,0xc4,0xbd,0xa2,0xaf,0x4d,0x66,0xd9,0x54,0x38,0x4b,0xc9,0xbb,0x4c,0x04,0xb9,0x03,0xac,0x7f,0x32,0xc7,0xbd,0xcb,0x29,0x3a,0x2a,0xd6,0x0b,0xb8,0x2a,0x47,0x20,0x2c,0x61,0xa2,0x37,0xe7,0xc1,0xb3,0x25,0x52,0xcf,0xdd,0xf6,0xd6,0xe2,0xc8,0x44,0x97,0x2d,0x39,0x24,0x08,0x95,0x20,0x13,0xc3,0xa7,0x41,0xba,0xc0,0x24,0xc8,0xb8,0x86,0x14,0x11,0xc0,0xd9,0x5c,0xbc,0x37,0x13,0xd6,0x12,0x0f,0xea,0x52,0xf2,0x9b,0x53,0x5d,0xc9,0xf0,0x31,0x5a,0x3f,0x38,0x46,0x56,0x1e,0x5a,0x53,0xcf,0xf1,0x3a,0xf6,0xd0,0x19,0xce,0x9e,0x3d,0x0b,0x25,0xe2,0xe3,0x14,0x5c,0x4e,0xb1,0xa5,0xc8,0x41,0xb2,0x43,0x9b,0xec,0xfc,0x3c,0x01,0x35,0x56,0x4e,0x1e,0x3a,0xe5,0xd2,0xb8,0x33,0x3d,0x29,0xca,0xd1,0xcc,0xbc,0x54,0xe0,0xbb,0xc2,0xde,0x5b,0xd4,0xd7,0x54,0xf1,0xc5,0xd4,0x81,0x4e,0x8e,0xfb,0x16,0xc9,0xef,0xeb,0x7f,0xf2,0x43,0x2c,0x44,0x9e,0x16,0x16,0xa4,0xb1,0x29,0x09,0xbd,0xf4,0xc7,0x5a,0xbf,0xc2,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x9b,0xfe,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xf7,0x3a,0x00,0x00,0xd5,0x98,0xff,0xff,0xe7,0xfc,0xff,0xff,0x6b,0x0c,0x00,0x00,0xee,0xe2,0xff,0xff,0x83,0xe9,0xff,0xff,0x6c,0x2d,0x00,0x00,0x14,0xf2,0xff,0xff,0x6d,0x03,0x00,0x00,0x92,0xd2,0xff,0xff,0x05,0x17,0x00,0x00,0xd8,0xb1,0xff,0xff,0x3d,0xda,0xff,0xff,0x8c,0x25,0x00,0x00,0x47,0xe2,0xff,0xff,0x6f,0xff,0xff,0xff,0x6b,0xe7,0xff,0xff,0x05,0x18,0x00,0x00,0x3d,0x3c,0x00,0x00,0x5d,0x50,0x00,0x00,0x36,0xed,0xff,0xff,0xc9,0xcb,0xff,0xff,0x11,0x16,0x00,0x00,0x04,0x26,0x00,0x00,0xd7,0x21,0x00,0x00,0x59,0x08,0x00,0x00,0xb4,0xee,0xff,0xff,0x0d,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0x9b,0xfe,0xff,0x04,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0x81,0x1e,0x0f,0x1b,0x0c,0x12,0xd3,0x0e,0xcd,0xa7,0xd8,0xd3,0x93,0x11,0xd3,0xc1,0x73,0xf1,0x01,0xbc,0xb9,0xff,0xd0,0xac,0x0a,0x20,0x6c,0xec,0xfb,0x81,0xd4,0x45,0x56,0x29,0xda,0xf1,0x03,0xc1,0x2b,0xf9,0x2e,0x01,0x59,0xb8,0xf7,0x5e,0x81,0xcc,0x52,0x7f,0x0e,0x90,0x12,0x50,0xc4,0xce,0xea,0x7f,0xdb,0xfd,0x7e,0x64,0x22,0x11,0x41,0xc5,0xad,0xe2,0x0b,0x10,0xea,0x15,0x63,0x7f,0x7f,0xff,0xff,0xea,0xa0,0xc4,0xf5,0xeb,0xf9,0x66,0xee,0xf5,0xe7,0xf0,0xfb,0xe7,0x05,0xda,0x17,0xc7,0x4f,0xe4,0x36,0xf5,0xd4,0x7f,0xa0,0xd2,0x38,0x04,0x81,0xc8,0xdd,0xf0,0x09,0xd9,0x00,0xc2,0xe1,0x11,0xc2,0xe6,0xea,0x28,0x3f,0xe8,0xdb,0x27,0xc4,0x18,0xa1,0x07,0xa9,0xbe,0xdf,0xae,0xd6,0xf9,0x46,0x65,0xe1,0x81,0xd8,0xef,0x18,0xd9,0x4e,0xe7,0x14,0x7f,0xfd,0xa2,0x81,0xf2,0xaf,0x7f,0xf7,0xb6,0x13,0x52,0x7f,0x3f,0xfa,0xe6,0xb4,0xf3,0x00,0x7f,0x8e,0x04,0xc6,0x7f,0xc8,0x81,0x40,0xa0,0x4d,0xa3,0x7f,0x7f,0x88,0xbe,0x36,0x70,0xb1,0xa3,0x81,0x04,0xbc,0x31,0x7f,0x7f,0x10,0xcf,0x7b,0x00,0x0b,0xf7,0x64,0x4c,0x58,0xc9,0x17,0x81,0x08,0xed,0x56,0x1d,0x7f,0x81,0xd9,0xd4,0x81,0x9d,0xcb,0x0a,0xc1,0x96,0x72,0x35,0xc9,0xe0,0x81,0xcb,0x8b,0xfc,0xc3,0x7f,0xd1,0x9f,0x03,0x3f,0xe1,0x5b,0x7f,0x0d,0x39,0xe9,0x1a,0x1b,0xa7,0x7f,0xf2,0x9b,0x1f,0x1d,0x7f,0x49,0x7f,0x81,0x61,0xe7,0x32,0x0b,0xcd,0x0d,0xa1,0xd8,0x81,0xbe,0x40,0x7f,0xcd,0x74,0x66,0xc2,0x1f,0xb7,0x7f,0x99,0x85,0x67,0xe5,0x9b,0xee,0x7f,0x3d,0xf5,0xc2,0x33,0x90,0xbe,0xb0,0x0d,0x7f,0xb5,0x55,0x85,0x72,0xd5,0x1e,0x41,0xcd,0xc3,0xca,0xa1,0xfb,0x81,0xd1,0x74,0x23,0x45,0xf0,0xc4,0xad,0x25,0x22,0xbb,0x65,0x1f,0xd2,0x37,0x58,0xed,0xe4,0x5e,0x9b,0xf6,0xbc,0x85,0xef,0x41,0xb2,0x4c,0xde,0x9c,0x81,0xe4,0xe9,0x7f,0xbb,0xc0,0xaf,0x7f,0xdc,0x07,0x81,0xc2,0xda,0x33,0xc8,0x36,0x63,0x20,0xdf,0xdd,0x11,0xe5,0x9a,0x21,0xcc,0x18,0xff,0xb9,0x12,0xd1,0x47,0x32,0x59,0x31,0x1c,0xcf,0xdb,0xce,0x9c,0xe0,0xef,0x71,0xfc,0x85,0x57,0xc0,0xf7,0x48,0xe1,0xd9,0x7f,0xee,0xaa,0x20,0x0e,0x34,0x7f,0xc7,0xea,0xd0,0xdb,0xf0,0xc3,0x7f,0x03,0xfc,0x7f,0x55,0x34,0x88,0x53,0xf4,0xdc,0xe9,0x41,0xe0,0xf0,0xd1,0xbe,0xeb,0x00,0xe0,0x1b,0x0e,0x81,0xdd,0xe0,0x4c,0x9b,0x41,0xc2,0x91,0xe7,0x97,0x10,0xe7,0xdb,0x2f,0xb9,0x37,0xee,0x44,0x19,0x0d,0x7f,0x9d,0xcf,0xf6,0xc9,0x08,0xa6,0xa8,0xae,0x81,0xc3,0xbc,0xa1,0x79,0xe3,0xe7,0x81,0x08,0x01,0xbf,0xb3,0xe9,0x2e,0xeb,0x02,0x06,0x20,0xf1,0x00,0xb7,0xd9,0xff,0x67,0xef,0xe4,0x64,0x7f,0x22,0xc7,0x7f,0x9b,0xd1,0x44,0x04,0xbf,0x2d,0xcf,0x46,0x30,0x9e,0x81,0xc6,0xe4,0x3c,0xdd,0xb9,0x0d,0xff,0x5a,0x7f,0xb8,0x93,0xf6,0x55,0xd4,0x47,0xa1,0xd0,0x2e,0xee,0x19,0xd4,0xf9,0xbf,0x13,0xfe,0x25,0xd3,0xd1,0x89,0x6d,0x2c,0x5a,0x9f,0x9b,0x7f,0xd7,0xe7,0x7f,0x2b,0xc4,0x7d,0x40,0x7f,0x9a,0x1d,0x34,0x7f,0xe7,0xd4,0xbd,0x07,0x03,0xd5,0x3f,0x1b,0xea,0xae,0xcd,0xf2,0xc0,0xf9,0x0e,0x01,0xf2,0x65,0xab,0x87,0x1f,0xb8,0xfe,0xa1,0xf1,0x39,0xc3,0x6e,0x61,0x52,0xf7,0x20,0x2a,0x69,0xa5,0xfd,0x7f,0xe4,0x42,0xc1,0xe7,0x7f,0x47,0x93,0xf3,0x9d,0xb1,0x52,0xa7,0xfc,0xdf,0xb1,0x4d,0xad,0xbc,0x29,0x0b,0x7f,0x81,0x7f,0x15,0x0f,0xc6,0xb2,0x2f,0x83,0x5b,0x0a,0x1f,0x86,0xca,0xdc,0x81,0x55,0x7f,0x29,0x22,0x60,0x2b,0x39,0xa4,0xe5,0x81,0x9a,0x03,0x3a,0xa0,0x7f,0xdd,0x73,0xe9,0xdc,0xa6,0xc7,0x1b,0x48,0xed,0x7f,0x81,0xd3,0x81,0x69,0x35,0x1b,0xa0,0x05,0xee,0x3c,0x9e,0x8b,0x7f,0x28,0x1c,0x6f,0x40,0x00,0xcb,0x7f,0x95,0x38,0x81,0x14,0x7f,0xc6,0x28,0x3f,0x54,0x30,0x64,0x20,0x44,0xaf,0xc7,0x81,0x55,0x8a,0x55,0xac,0x2e,0xde,0x1e,0xfe,0x48,0xf6,0xa1,0xb2,0xf9,0x60,0x0b,0xef,0xc0,0x23,0xd0,0xac,0xe9,0x2c,0xd3,0x66,0xee,0x5f,0xde,0x7f,0x4c,0xd5,0xf1,0xfd,0x3a,0xd7,0xd8,0x64,0xd5,0x8a,0x7f,0x7f,0x3b,0x7f,0x76,0x77,0x10,0x7f,0xfb,0x7f,0x81,0x2f,0x7f,0x82,0xdf,0x7f,0xbc,0xbb,0x31,0x1b,0x88,0x99,0x7f,0xb3,0x4f,0xd3,0xa5,0x7f,0x2f,0xa5,0xad,0xab,0x7f,0x7f,0xa9,0xab,0x37,0xb9,0xad,0x35,0x22,0xe1,0x7f,0x81,0x7f,0xa9,0x08,0x7f,0x02,0x97,0xb9,0x7f,0xe8,0x76,0x47,0x0e,0x6d,0x15,0x0e,0x1b,0xa0,0x5f,0x64,0x61,0x7f,0xee,0x0a,0x31,0xbf,0x27,0x98,0x6f,0xba,0xb4,0xb2,0xeb,0x36,0x2b,0xb1,0xf7,0xbf,0x6f,0xaf,0xb8,0xa6,0xf7,0xf2,0xaf,0xf3,0x42,0x08,0xfb,0x08,0x4f,0x96,0x7f,0xd8,0x2a,0x93,0x3f,0xaa,0xc8,0x45,0xed,0xf2,0x7f,0xb6,0xde,0x66,0xee,0x1d,0xa8,0x75,0xcd,0x7f,0xe6,0x2f,0xe6,0x7f,0xa9,0x1d,0xec,0x75,0x19,0x20,0x81,0x6f,0x9c,0x7f,0xea,0xb0,0x5b,0x70,0xda,0xae,0xf0,0xf7,0xd0,0x16,0x1a,0xf1,0x3a,0x07,0x08,0xd1,0x0b,0x00,0xde,0x4e,0x01,0x7f,0x81,0x62,0xdd,0x0c,0xa8,0xef,0x4c,0xb7,0x77,0xc4,0x3c,0x7e,0x18,0xd6,0x0d,0x9a,0xbd,0xf4,0xe3,0x57,0x4a,0xfb,0xe1,0x84,0x81,0x28,0xf3,0x81,0xd7,0x81,0x72,0xf5,0xfe,0xf1,0x5e,0x7b,0x26,0xc5,0xcb,0xae,0x8c,0xf4,0x0a,0xa6,0x88,0x2d,0x81,0x81,0x21,0xfe,0x87,0xa3,0xd8,0x96,0x34,0x8b,0xec,0x7f,0xf4,0x08,0xcb,0x15,0xe2,0x77,0x13,0x2f,0xdc,0x63,0x18,0xe1,0xc3,0x2d,0x78,0xd9,0x18,0x86,0xec,0x43,0xd3,0xe8,0x50,0xd1,0x08,0x10,0x06,0x84,0xe6,0xfb,0x4d,0xb3,0xa5,0x6a,0xd1,0xd7,0xeb,0x88,0xae,0xa1,0x31,0x1f,0x90,0x33,0xc5,0xfd,0xbb,0x7f,0xda,0xb4,0xa6,0x7f,0x3b,0x7f,0x99,0xe1,0xfc,0x50,0x23,0x0c,0xa5,0xa9,0x18,0xd3,0xb3,0x0a,0x3c,0x04,0xa0,0x31,0xeb,0x12,0x7f,0x36,0xaa,0x00,0x33,0xbc,0x27,0x7f,0xd2,0xc4,0xa2,0xe0,0xdf,0xd7,0x1e,0xd0,0x04,0x1a,0xed,0x33,0xa6,0xf0,0xf7,0x3e,0x12,0xd5,0xf4,0xcd,0x1f,0xc7,0xef,0x81,0x25,0xe1,0x50,0xf0,0x2b,0xad,0x36,0x24,0x08,0x04,0x86,0x7f,0x2b,0x04,0xa5,0xf1,0xb3,0xb3,0xd5,0xc9,0x08,0x37,0xe5,0x58,0x24,0xdc,0xbf,0x23,0xe8,0x9c,0x02,0x1e,0x7f,0x31,0xe8,0x38,0x0b,0x2f,0x26,0x1a,0x98,0xa1,0xe4,0x14,0xb5,0xd3,0xea,0x17,0x2b,0x7f,0x7f,0xca,0xde,0xd9,0xfa,0xcd,0x7f,0x8f,0x36,0xe5,0x7f,0xcf,0x7f,0x81,0xf5,0x9f,0xc0,0x01,0xb7,0xe2,0xee,0x8e,0xdd,0x6c,0x7f,0x8c,0x4e,0xc6,0x2c,0x81,0xce,0x6b,0x81,0x18,0x27,0xd3,0x1d,0x93,0x7d,0xf9,0xb3,0x3f,0x7f,0x4b,0x7f,0x65,0x34,0x81,0x81,0x79,0x7f,0x17,0xad,0xb2,0xd7,0x05,0x1e,0x7f,0x07,0x34,0x2a,0x40,0x81,0x06,0x3b,0x75,0x01,0x7f,0x0c,0xfc,0x18,0xbe,0xca,0x29,0x7f,0x81,0x15,0x0e,0x7f,0xa5,0xdf,0xdc,0x9a,0x5f,0x7f,0x7f,0xf3,0x7f,0x71,0xf2,0x92,0xf3,0xa6,0x55,0xe1,0x16,0x0b,0x9f,0xd0,0x81,0x1c,0xd7,0x34,0x71,0x7f,0xa5,0xb2,0xdc,0x7c,0xcc,0x5a,0xec,0x81,0x26,0xbe,0x5e,0xd1,0xe3,0x81,0x96,0xca,0x25,0xb0,0x7f,0xc7,0xd6,0x3a,0x0a,0xd4,0x7f,0x41,0xa9,0xd6,0xb6,0xb6,0xf2,0x00,0x4d,0x06,0x36,0x16,0x7f,0xad,0xf2,0x1d,0xfe,0xcc,0x2a,0x81,0x2a,0x20,0x2d,0x7e,0x35,0x81,0x89,0xd3,0x0a,0xff,0x33,0x06,0xd8,0xeb,0xfa,0x79,0xa6,0xdf,0x81,0x53,0x7f,0xd3,0x00,0x2a,0xcb,0x14,0x17,0x14,0xaf,0xb4,0x5d,0x93,0xd1,0x00,0x70,0xc8,0x7c,0x46,0x8e,0x3d,0x81,0x30,0x1d,0x9e,0x1f,0xdf,0x0a,0x40,0x42,0x37,0xbc,0xa3,0x66,0x13,0xf2,0xb1,0x26,0xbc,0xbc,0x0c,0xe4,0xc8,0x69,0xea,0x78,0x8b,0x37,0x49,0x7f,0xd7,0x0d,0x04,0xc8,0xa8,0xd7,0xc4,0xe5,0x12,0xc7,0x47,0xe9,0xa1,0xa8,0x07,0x07,0x3c,0xdb,0x28,0xee,0xf2,0x1c,0x7f,0x98,0xde,0x16,0x9b,0x9a,0xe3,0xc4,0x0b,0xb2,0x01,0xcf,0x0e,0x25,0x39,0xcd,0x68,0xed,0xff,0x83,0x23,0xeb,0xe9,0x15,0xa5,0x73,0xf6,0xea,0x99,0xe5,0x07,0xcb,0xe4,0xb2,0x7f,0x1a,0xae,0xeb,0x08,0x30,0x7f,0x13,0xc2,0xa3,0xfe,0xf1,0x7a,0xec,0xb6,0x0a,0xc6,0xc8,0x21,0x00,0xca,0xce,0xf1,0x15,0xb7,0x5b,0x08,0x0a,0xf6,0xb4,0x09,0x71,0xc3,0x22,0x2d,0x04,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0xa1,0xfe,0xff,0x04,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0xd7,0x3a,0x00,0x00,0x94,0xb7,0xff,0xff,0xc0,0x27,0x00,0x00,0xad,0x1f,0x00,0x00,0x60,0xa1,0xff,0xff,0x0f,0xed,0xff,0xff,0x6a,0xf8,0xff,0xff,0x8a,0x59,0x00,0x00,0xf2,0xe7,0xff,0xff,0x7c,0x29,0x00,0x00,0x66,0x66,0x00,0x00,0x10,0xaa,0xff,0xff,0xa0,0x15,0x00,0x00,0x67,0xd8,0xff,0xff,0x5b,0x27,0x00,0x00,0xda,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xa1,0xfe,0xff,0x04,0x00,0x00,0x00,0x58,0x05,0x00,0x00,0xfd,0x09,0x18,0x33,0xd6,0x6a,0xce,0x37,0xe7,0x2a,0xf4,0x25,0x7f,0x17,0x34,0x58,0x3c,0x7f,0x5a,0xc5,0xec,0x17,0x03,0x7f,0xbe,0x03,0x05,0xed,0xf0,0xe9,0xa1,0xf8,0xa0,0xf0,0x07,0x00,0x55,0x21,0xa5,0x81,0xd3,0x3a,0xf6,0x98,0x6c,0x36,0xb9,0x23,0x26,0x3c,0x69,0xc3,0xaa,0xf8,0xf9,0xbf,0x9c,0x35,0xcf,0x7f,0x5a,0x0f,0xa8,0x1b,0xdc,0x14,0x00,0xe5,0xaf,0xdd,0xfb,0xe3,0xd7,0x4c,0x14,0xdd,0xaf,0xf1,0x0c,0x18,0x02,0xf7,0x08,0x75,0x3a,0x06,0x22,0xee,0x62,0xfe,0x19,0xa2,0xbd,0x19,0x94,0xb9,0x8d,0xe3,0x1e,0x1e,0xed,0x7f,0x1d,0x47,0xef,0x00,0xe9,0xd6,0xe5,0xf8,0xc6,0x3d,0xe9,0x52,0xc4,0xef,0x0d,0x7f,0xb6,0xe7,0xf9,0xda,0xbf,0x13,0x22,0xb5,0xf0,0xfa,0xf1,0x81,0xd8,0xdc,0xa4,0xf9,0x08,0x03,0xf6,0xed,0xe8,0xf4,0x87,0xb9,0xde,0xb4,0x13,0x81,0x04,0xf6,0x81,0x02,0xdd,0xe3,0xc3,0x81,0x7f,0xe8,0x81,0x51,0x06,0x81,0x13,0x3f,0xbe,0x0c,0x11,0x7f,0x7f,0x6a,0x7f,0xe3,0x13,0xd6,0x96,0xb4,0xd5,0x43,0x3a,0xa4,0x81,0xdd,0xe2,0xf1,0x18,0x49,0x2c,0x11,0x28,0x02,0x7f,0xd7,0xd3,0x19,0x37,0xc4,0xc5,0xa7,0x34,0x7f,0xc7,0x81,0x7f,0xaa,0xc6,0x9e,0xf5,0xbb,0xe7,0x81,0x7f,0x40,0x7f,0xb1,0x7f,0xf3,0xce,0x53,0x25,0x7f,0xad,0xb6,0x03,0x81,0xe6,0xe3,0xcc,0xfa,0x3e,0xc5,0xcd,0xd5,0xff,0x7f,0xf6,0x7f,0x81,0x18,0xff,0x95,0xc4,0xea,0x0d,0xc1,0xa5,0x9f,0xa9,0xfe,0xcf,0x81,0x32,0xc0,0xe0,0xa8,0x37,0xa9,0xe3,0xe7,0xa8,0xca,0x09,0xb9,0x3d,0xeb,0x7f,0xc4,0x7f,0x81,0x0d,0x6d,0x81,0x40,0x89,0x7f,0xca,0xd9,0x81,0xd5,0xa5,0x60,0x81,0x63,0xba,0x94,0x1f,0xa6,0xbc,0x2f,0x1c,0xa6,0x3f,0x60,0x81,0xa2,0xcf,0x47,0xda,0xac,0x2d,0xd7,0x40,0xf4,0xa4,0xc5,0xe2,0xe7,0xf5,0x12,0x4a,0xe8,0xd5,0x14,0xad,0x50,0xc4,0xbd,0x40,0x0f,0xe0,0xcb,0x38,0x7f,0x27,0x94,0x36,0xed,0xda,0x57,0xdf,0x91,0x7f,0x5a,0xef,0xf9,0xc9,0xe4,0x56,0x55,0x8a,0x12,0xc2,0x25,0x42,0xe4,0xac,0x6b,0x0e,0xe9,0x0a,0xf8,0x81,0x13,0xbe,0x11,0x57,0x98,0xe0,0xbe,0x7f,0xbc,0xed,0xd2,0x27,0x21,0xe1,0x05,0xb5,0x1a,0x4f,0xf1,0xe2,0x28,0xcd,0xef,0xc5,0x50,0x2c,0x66,0xca,0x5d,0x0d,0xdd,0xd4,0x13,0xe7,0xcb,0xfb,0x38,0xec,0xba,0x08,0xfb,0x48,0xdb,0xff,0x40,0xe0,0xcd,0xc3,0xdd,0x94,0x93,0x69,0x30,0x12,0x8e,0xef,0x27,0xf1,0xf4,0xb1,0x0e,0x7c,0x08,0xd1,0xdf,0xff,0xf3,0x40,0x13,0x22,0xe5,0x02,0x73,0x4b,0xef,0xf4,0x26,0x64,0x11,0xcd,0x9b,0xb3,0x22,0xea,0xa3,0xf5,0x38,0x68,0x0c,0x0a,0xb0,0x00,0x20,0xca,0xfa,0xb5,0x05,0xeb,0xc6,0x94,0xce,0xec,0x24,0xe2,0x48,0xe1,0x0f,0x7f,0x32,0x08,0x81,0x4f,0x63,0x91,0x12,0xb4,0x7f,0xfc,0x05,0x34,0xda,0xf4,0xe5,0xd3,0x64,0xde,0x7f,0x81,0x43,0x81,0xd2,0x9e,0x11,0x8b,0xf6,0xf9,0xe0,0x7f,0x29,0x94,0x70,0x1d,0x7f,0xc6,0x7f,0x89,0x03,0xdf,0x81,0x81,0x1f,0xc2,0xa5,0xad,0x00,0xbe,0x00,0x7f,0xd1,0x28,0x25,0xe1,0xb8,0xda,0x0c,0x04,0x60,0x07,0x59,0x6c,0xf0,0x81,0x35,0x3a,0xfc,0xc1,0xc2,0xae,0x05,0xe1,0xbe,0xfd,0xcf,0xd3,0xd3,0x7f,0xd3,0xb8,0x09,0x5e,0x32,0x44,0x65,0x39,0x29,0x7e,0x15,0xc0,0x19,0xcd,0xe7,0xd2,0xec,0x88,0xd0,0x0e,0x4f,0x0d,0x98,0x33,0x7f,0x9a,0x00,0x34,0x81,0xb2,0xd8,0xea,0x7f,0x12,0xa6,0xa8,0xfa,0xcf,0x4c,0x81,0x02,0xf7,0xf5,0xa0,0x7f,0xac,0x81,0xdc,0xf2,0xde,0xa3,0xbc,0x20,0x81,0x22,0x11,0xf5,0xa6,0x7f,0x3b,0xfa,0xd7,0xa4,0x7f,0x2a,0x88,0xd8,0xf5,0x43,0x5e,0xe1,0xb4,0xde,0x3c,0xac,0xbb,0x24,0xb1,0x0a,0xfc,0x93,0xa5,0xb8,0x3d,0x28,0x1e,0x1e,0xdd,0xf5,0xec,0x06,0xf9,0xf7,0x23,0x1f,0xe6,0xfc,0x13,0xab,0xde,0xb5,0x9b,0x4d,0x47,0x7f,0x8a,0xfb,0x7f,0x0e,0x12,0xc3,0xa8,0x52,0x7f,0x4e,0xd3,0x85,0xa2,0xf9,0x04,0xed,0x9f,0x9c,0xc5,0x7f,0x02,0x7f,0x90,0x55,0x07,0x7f,0x76,0x32,0x6b,0x81,0xe8,0x81,0xe8,0x1c,0xee,0xdd,0x30,0x04,0x7a,0xe4,0xd4,0x8e,0x81,0x7f,0xc5,0xc3,0xde,0xbe,0xc0,0xdf,0xd9,0x06,0x7f,0x33,0xa0,0x7f,0xfe,0xc8,0xe6,0xe0,0x02,0xcc,0x21,0x09,0xf4,0xc7,0x7f,0x75,0x7f,0x3c,0x7f,0xed,0x03,0xea,0xef,0x85,0x7f,0x9e,0x6f,0x9b,0x6c,0xf6,0x3c,0x53,0x2f,0xf7,0xbe,0xa2,0x7f,0x81,0xa7,0xa4,0x06,0x43,0x67,0x36,0xc1,0xe8,0xde,0x41,0xf9,0x7f,0x2f,0x7f,0x29,0x70,0x49,0xcc,0xe4,0x7f,0xe9,0x39,0xef,0xb3,0x7f,0x81,0xd9,0xab,0xb9,0xe7,0x96,0x0b,0xc1,0x69,0x60,0x31,0x81,0x09,0xc7,0xe1,0x81,0x0f,0x60,0xff,0x0e,0x20,0x46,0xe8,0x70,0xe7,0x63,0x3c,0xb5,0x51,0x7c,0x81,0xbe,0xa6,0xf0,0xdb,0xc2,0x74,0x8d,0x81,0xa5,0xf5,0xe8,0xe9,0x81,0x00,0x73,0x00,0xbd,0x98,0xd7,0xb4,0xc2,0xf4,0xca,0x7f,0xc3,0x73,0xb6,0x18,0x04,0xa9,0x2d,0x0c,0x03,0x95,0x4c,0x35,0x1f,0xae,0xa8,0xfc,0xbb,0xfc,0xa6,0xbf,0x7f,0x7f,0xf0,0xc4,0x11,0xc1,0xa6,0x7f,0xb8,0xd2,0x7a,0xf7,0x4b,0x81,0x07,0x07,0xca,0x02,0xe3,0x7f,0x7f,0x11,0xad,0x7f,0x02,0x0d,0x2a,0xbb,0xff,0xc1,0x07,0xeb,0x11,0xfa,0x86,0x3a,0xd9,0xa8,0xf4,0xcf,0xd5,0xe8,0xfb,0x23,0x7f,0xfb,0xe5,0x47,0x13,0xf3,0x2e,0x99,0x67,0xe1,0x1b,0x8e,0x8b,0xec,0xf9,0xa1,0x81,0xa6,0x53,0x4f,0xfa,0x3c,0x7f,0xf3,0x32,0x11,0xa8,0x30,0xc7,0x21,0xb5,0xb1,0x13,0x26,0xfe,0x7f,0xbb,0x7f,0xea,0xf1,0xf2,0x2b,0x22,0xfb,0x27,0xdc,0x31,0x34,0x01,0xdb,0x41,0x12,0xee,0xd7,0xca,0xf2,0x2d,0xa0,0xe8,0x14,0xf3,0xbb,0x8a,0x2e,0xdf,0x37,0xd6,0xbf,0x15,0x26,0x81,0xa2,0xd4,0x57,0x97,0xdc,0xcb,0x29,0xde,0xd6,0x82,0x12,0xec,0xcc,0xa7,0x9d,0x13,0x8a,0x4d,0x00,0xf6,0xcd,0x31,0xb9,0xfd,0xf4,0x1e,0xa9,0xef,0x08,0x33,0x21,0xb1,0xd9,0x7f,0x19,0xb8,0xad,0x12,0xe7,0x0c,0x9d,0x01,0xba,0xb6,0xfd,0x3c,0xf1,0xc4,0xe7,0x10,0x98,0x10,0x0a,0xab,0xe7,0xd6,0x09,0xda,0x41,0x25,0x11,0x81,0x54,0x9a,0x0f,0xcb,0x1c,0xfc,0xd0,0xdb,0xf1,0x81,0xd3,0x7f,0x38,0xdb,0x10,0xfd,0x47,0xd0,0xc2,0xce,0xff,0xcb,0x26,0x67,0x0f,0xdf,0x28,0x06,0x26,0x81,0x07,0x9a,0xc8,0x37,0xd4,0x7e,0x19,0xd8,0x37,0x01,0xfc,0xfd,0x2c,0x00,0xf9,0xef,0x27,0x2c,0x0d,0xbc,0xdd,0x19,0x3f,0x46,0x01,0x47,0xfa,0x53,0xa6,0xe9,0x32,0x17,0x7f,0xc5,0xb2,0x7f,0xc0,0x4b,0x13,0xc5,0xe3,0xb5,0x1d,0xa5,0xb6,0x0f,0xe4,0x44,0x7f,0xb0,0xb4,0x1d,0x6a,0x01,0x7f,0x7f,0x81,0x0a,0x2a,0x8f,0x30,0xa8,0xc5,0x92,0xfb,0xbd,0xcd,0x29,0x42,0xc4,0x81,0xf5,0x07,0x81,0x9e,0xfa,0xf0,0x02,0x62,0x23,0xdf,0x7f,0xe5,0xee,0xfa,0xcd,0x07,0x5c,0xd6,0x81,0xfd,0xaa,0xe1,0x53,0x7f,0x81,0xf8,0x00,0x12,0x7f,0x81,0x53,0x03,0x9b,0x32,0xf5,0xec,0xc8,0xd0,0x8b,0x32,0x29,0x7f,0x7f,0xba,0x81,0xed,0x31,0x7f,0x7f,0xf9,0xa5,0x5b,0x3b,0x81,0xb7,0x7f,0x18,0x12,0x0e,0x0a,0xd3,0x7f,0x2f,0x8d,0xfd,0x7f,0x30,0xc0,0x29,0x6b,0xd8,0x7f,0xf8,0xdd,0x5d,0xdd,0x9b,0xf3,0xec,0x07,0x5d,0xf4,0xcd,0x81,0x7f,0xaf,0x5c,0x7f,0x0c,0x2b,0x7f,0x34,0xbf,0xdd,0xa7,0x7f,0xa3,0x86,0x24,0x7f,0x7f,0x94,0x2f,0xe6,0x25,0xfb,0x7f,0xc5,0xdf,0xf1,0xb2,0xa4,0x38,0xe0,0xd4,0xd9,0x37,0xd2,0xa5,0x7f,0x1f,0x06,0xc8,0xe2,0xa8,0x04,0x7f,0xeb,0xcf,0xc3,0xb5,0x24,0x2e,0x9f,0xb7,0x3b,0x4a,0xb2,0xb4,0x8d,0x82,0x45,0xcd,0x01,0x9d,0x1a,0x91,0xee,0x74,0x06,0xb6,0xb9,0xdb,0xc5,0x0d,0xaa,0xe5,0x48,0xec,0x28,0xc3,0xe6,0x0f,0xa5,0xf2,0x2f,0x2f,0x0a,0x0a,0xff,0xcf,0x5c,0xd9,0xe6,0x8f,0x17,0xc6,0xfa,0xf1,0xcc,0x3c,0x9c,0xed,0x8f,0x81,0x1b,0xd2,0xe8,0x7f,0xde,0x23,0xfd,0xfe,0xb9,0xc2,0xdb,0xbd,0x34,0x57,0x41,0xdb,0x0c,0xab,0x77,0x7f,0x06,0xd2,0x0d,0xda,0x01,0xeb,0xd9,0xa1,0x1c,0x86,0x2d,0xe0,0x4b,0x00,0x09,0xf8,0xeb,0x41,0x1c,0xd2,0x32,0x07,0x08,0xdd,0xed,0x28,0xfc,0x3c,0xf8,0x9b,0xc5,0x2e,0xa5,0xc7,0x88,0x02,0xe7,0xeb,0x27,0x1d,0xd0,0xe7,0xf7,0x81,0xcd,0x02,0xe9,0x73,0xf8,0xea,0xf3,0x16,0x09,0x51,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0xa6,0xfe,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x2d,0xf9,0xff,0xff,0xc8,0x9f,0xff,0xff,0x5b,0xa7,0x00,0x00,0xe3,0x77,0x00,0x00,0xdb,0x22,0x00,0x00,0xe7,0x6e,0x00,0x00,0x23,0x90,0xff,0xff,0xe3,0x44,0x00,0x00,0xa6,0xcd,0xff,0xff,0x1c,0x0a,0x00,0x00,0xef,0xb4,0x00,0x00,0xf1,0x41,0x00,0x00,0x4d,0x7d,0x00,0x00,0x46,0x58,0x00,0x00,0x41,0x6e,0xfe,0xff,0xc4,0x2a,0x00,0x00,0x22,0x15,0x00,0x00,0xf0,0x64,0x00,0x00,0xf5,0x7f,0x00,0x00,0x67,0xb7,0xff,0xff,0xf6,0xa9,0x00,0x00,0xed,0xce,0xff,0xff,0x97,0xa5,0xff,0xff,0x25,0x31,0x00,0x00,0x48,0x04,0x00,0x00,0x79,0x8c,0x00,0x00,0x13,0x58,0xff,0xff,0xb1,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xa7,0xfe,0xff,0x04,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x42,0xf0,0x39,0x60,0xf6,0xe2,0x22,0x68,0x57,0x26,0x38,0x29,0xd0,0x09,0xcc,0x18,0x1e,0xb3,0x6b,0x09,0xf0,0x02,0x0b,0xdc,0xf0,0x51,0x3e,0xbf,0xd3,0xc5,0xdf,0xac,0x2d,0xc2,0xcb,0x21,0x22,0x1e,0xda,0xbe,0xb6,0x46,0xd5,0xca,0x34,0xcb,0x81,0xec,0xa4,0x30,0x1b,0xed,0x2f,0x3e,0x43,0xdf,0xcf,0x32,0xba,0xce,0x20,0x2e,0xe2,0x33,0xd8,0x44,0x34,0x05,0x2c,0x0b,0x81,0xd3,0xd8,0xe7,0x3f,0x13,0xdf,0x07,0x2c,0x3e,0x9c,0xa1,0x3a,0xe5,0x29,0x18,0x10,0x33,0xa1,0x19,0x7f,0xfe,0x18,0xd9,0xf5,0xea,0x1d,0x48,0xb7,0x32,0xdb,0x93,0xc5,0x0e,0xaa,0x1f,0xd9,0x0d,0xc0,0xa9,0x42,0xa7,0x36,0x81,0xf6,0xd5,0xd3,0xa8,0x0d,0xc2,0xe4,0x7f,0x04,0xa7,0x18,0x9a,0x10,0xfa,0x73,0x38,0x70,0x4c,0xdf,0xeb,0x3b,0x81,0x7f,0x3f,0x58,0x7d,0xee,0xfd,0xa3,0x3e,0x40,0xb4,0x7f,0xd9,0x24,0x02,0x36,0xb2,0xe5,0xe9,0xb6,0xb0,0x7f,0x8d,0x1d,0xbc,0x45,0x26,0xb9,0xa2,0x26,0x12,0xcd,0x1a,0x9e,0x68,0xb8,0xb6,0x81,0x66,0xfe,0xaa,0x90,0x81,0x46,0x4b,0x5a,0x64,0x7f,0xb7,0x35,0x50,0xc4,0xf6,0x5a,0x4b,0xbc,0x2f,0xbe,0x81,0x4b,0xfe,0x49,0x35,0x8a,0x43,0xe0,0xa8,0x58,0x5b,0xbd,0xff,0x4e,0x6c,0x7a,0xae,0x58,0x3d,0x66,0x4d,0x47,0x43,0x23,0x98,0xd1,0xd9,0x26,0xb4,0x28,0xae,0x35,0xb9,0x72,0x5e,0x4f,0xe8,0xcd,0x46,0x9f,0x95,0x93,0x34,0xca,0x81,0xf7,0x81,0x4c,0x4b,0x16,0x81,0xd7,0xa3,0x2d,0x81,0xd0,0x7f,0x2c,0xed,0x3b,0x46,0x44,0x56,0x48,0xb5,0x3f,0xfa,0xe4,0xed,0x21,0xbc,0x67,0x34,0x2b,0x42,0x3b,0xee,0xc4,0xa3,0x31,0xee,0x4d,0xec,0xc8,0x11,0x32,0xd8,0xf0,0xb8,0xe4,0xb8,0x9c,0xd4,0x3c,0x0d,0x2c,0x06,0xdc,0xf1,0xc2,0xa7,0xc4,0x38,0xc2,0x40,0xdd,0xe0,0x20,0xd0,0x47,0xba,0xcb,0x5b,0x2b,0xa8,0x36,0x29,0x69,0xc6,0x44,0x33,0xf8,0xf9,0x59,0x06,0xc9,0xdf,0xc2,0xbe,0x48,0x05,0x2a,0x35,0x47,0xbb,0x61,0xd3,0x21,0x35,0xe6,0xfd,0x1c,0x4e,0x66,0x0d,0x0e,0x54,0x44,0x31,0x32,0x25,0x14,0x34,0xe2,0xb1,0x19,0x14,0x3c,0xb8,0x20,0xf7,0xa4,0x4a,0xbd,0x7f,0xd4,0x24,0xe4,0x3e,0x97,0x0c,0xea,0xd6,0xcb,0xa3,0x24,0x98,0x37,0xbe,0xde,0xe8,0x18,0xc0,0xed,0x35,0xc8,0x3e,0x23,0xf7,0x3b,0x5c,0x5d,0xc3,0x43,0x7f,0x98,0x8c,0x3d,0x68,0x94,0x04,0x4c,0xe9,0x98,0xe8,0xad,0xd0,0x3d,0xad,0x4d,0xf7,0xc1,0xba,0x57,0xb3,0x3e,0x96,0x7f,0xa6,0x09,0xb1,0x22,0x8b,0x51,0x66,0xb9,0x2c,0x4d,0xac,0xc5,0x9a,0x81,0x4f,0xb6,0x8e,0x0d,0xdd,0x76,0x9c,0x8c,0x03,0x3a,0xff,0x55,0x3a,0xb7,0x99,0x44,0x59,0x81,0x5b,0x49,0x5a,0xca,0x7b,0xad,0x56,0x57,0x28,0x50,0x4b,0x88,0x21,0x97,0xda,0x6c,0xc2,0xc3,0xb3,0x3a,0xe0,0x7f,0x81,0x42,0x29,0x44,0x33,0x26,0x4f,0x81,0xcc,0xa3,0x0a,0x49,0x8e,0x32,0xb4,0x49,0x7f,0xb2,0x4e,0xc8,0x84,0xa6,0x39,0xa6,0xbd,0x81,0x25,0xa0,0x31,0x6f,0xe8,0x55,0x8b,0x09,0xb7,0x81,0x95,0x4a,0x45,0x99,0x7b,0x1c,0xa0,0x36,0x7f,0x2e,0x3a,0x7f,0x6b,0x7f,0x4f,0x81,0x81,0x7f,0x42,0x88,0x43,0x7f,0x81,0xb4,0x65,0x81,0x7f,0x7f,0x84,0x5a,0x81,0x7f,0x81,0x7f,0x81,0x7f,0xe5,0x8c,0xa9,0xd7,0x81,0x7f,0x81,0x7f,0x81,0x81,0x81,0x28,0x5d,0x81,0xf7,0x83,0x7f,0x81,0x81,0x17,0x62,0xcb,0x81,0x81,0xd3,0x7f,0x81,0x7f,0x7f,0x95,0x81,0x71,0x7f,0x92,0x7f,0x7f,0x7f,0x81,0x70,0x81,0xcd,0x7f,0x55,0x7f,0x7f,0x90,0x81,0xcb,0x81,0x7f,0x54,0x81,0x81,0x7f,0xbd,0x68,0x88,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x64,0x7f,0x61,0x97,0x7f,0x81,0x7f,0x81,0x7f,0xa3,0x7f,0x7f,0x7f,0xea,0x81,0x7f,0x81,0x7f,0x85,0x63,0x81,0x7f,0x67,0xea,0x7f,0x70,0x10,0xa5,0x87,0x81,0x7f,0x7b,0x81,0x5c,0x81,0x17,0x7f,0x6f,0x7a,0x7f,0x58,0x81,0x45,0xb6,0x8f,0xab,0x5f,0xa3,0x89,0x7f,0x4c,0xdc,0x7f,0xaf,0x87,0x4f,0x49,0xbd,0x31,0x84,0xbd,0xcd,0x49,0xc6,0x48,0x7f,0xdf,0x81,0x0b,0xdc,0x6d,0xee,0x5e,0xd2,0xb2,0xb2,0x81,0x4d,0x9e,0x7f,0xa0,0x4f,0xb2,0xb8,0xcb,0x7f,0x98,0x91,0xaf,0x11,0x46,0x61,0x3d,0x6e,0xa7,0x8f,0x3f,0x43,0xdf,0x4d,0x62,0x2a,0xb5,0xf5,0x99,0xb4,0x5e,0x35,0x4c,0x48,0x6d,0x3f,0x7f,0x81,0x36,0x7f,0xb4,0xce,0x69,0xcb,0xc8,0x00,0x24,0x69,0x66,0x4d,0x6b,0x3a,0x18,0xaa,0xfb,0x81,0x4c,0x11,0x61,0xb9,0x2c,0x11,0xb0,0x42,0xa2,0x6b,0xbd,0x48,0xc2,0x8f,0x9a,0x7f,0xce,0x20,0xf4,0xfe,0x42,0x90,0x7f,0xcd,0xb5,0xa6,0x4f,0x2b,0xbe,0x2e,0x4f,0x7f,0x5a,0xd8,0x7f,0x2b,0x16,0xd0,0x23,0x2c,0xae,0xf3,0x2a,0xba,0xeb,0x02,0x3d,0xcc,0xac,0xdb,0xe3,0xfc,0x38,0xcd,0xea,0xfe,0xea,0x50,0x4f,0xe2,0xc4,0x04,0x4c,0xdd,0x0c,0xd2,0x1c,0xa0,0x32,0x9e,0xea,0x1c,0x34,0xf2,0xfd,0xd6,0xde,0x2e,0xd0,0xd5,0xd6,0xf5,0xa6,0xab,0xb9,0xed,0x1c,0xf8,0x34,0x02,0xf2,0x9f,0x7f,0x33,0xba,0x9a,0x2a,0x3a,0xeb,0x3c,0xcc,0x33,0x44,0x34,0x33,0x3f,0xa9,0xe9,0xd8,0xe4,0x36,0xbc,0xea,0x1f,0x04,0xb6,0x45,0xa6,0x08,0x44,0x24,0x15,0x09,0x2d,0xc2,0x11,0x01,0x13,0x38,0xb1,0x05,0xcf,0x59,0x37,0xd3,0x15,0xe1,0xc5,0xbd,0x32,0xde,0x25,0x85,0x11,0xba,0xf3,0x3e,0x51,0x27,0xad,0x0b,0xd4,0xd5,0xe5,0x4a,0x02,0xc2,0xe7,0xb2,0xc3,0x1d,0x6e,0x19,0x1d,0x2c,0x56,0x45,0xdd,0x8c,0xb8,0x53,0x3e,0xe8,0x1d,0x51,0x93,0xd4,0x7f,0xb5,0x8b,0x63,0x8e,0xe6,0xb1,0x39,0x73,0x64,0xc7,0xa5,0x18,0xd8,0xd7,0xbf,0x9f,0x5e,0xac,0x48,0x50,0xbb,0xa2,0xef,0x81,0xbb,0xc2,0xab,0x3c,0xaa,0xc4,0x70,0x9d,0x12,0x99,0x8d,0x34,0x44,0x33,0x55,0x42,0xf0,0xa7,0x68,0x4e,0xb0,0x91,0x3f,0x56,0xe2,0x7f,0xbe,0x28,0x6c,0x7f,0x4b,0x5b,0xba,0x35,0xc2,0xc1,0x36,0xd8,0xb8,0x32,0x4f,0x81,0xdf,0xc6,0x21,0x68,0x61,0x2c,0x58,0x44,0x3c,0xbf,0xc5,0xa7,0x6d,0xc4,0x36,0x95,0x58,0xd0,0x28,0x3a,0x37,0x06,0xab,0x3d,0xd0,0xc3,0x95,0x4c,0x92,0xd1,0x7f,0x7b,0x3d,0x3d,0x09,0xbd,0xd1,0xb3,0x75,0x34,0xb2,0xc7,0x3e,0x17,0x53,0xfa,0x4a,0x1d,0x21,0xa2,0x20,0xcd,0xb8,0xb1,0x1e,0xd2,0xf5,0x35,0x45,0xb9,0x5a,0xe6,0xc5,0xfe,0x32,0x81,0xf2,0xb0,0xd5,0x1b,0x32,0xe1,0xc4,0xfa,0xde,0xdc,0x42,0xd6,0x29,0xfc,0x36,0x0e,0xd6,0xad,0xb0,0xe7,0xb0,0x59,0xc4,0x16,0xc4,0xd0,0xce,0x47,0x05,0xd4,0xa3,0xe3,0x2a,0xc7,0x11,0x4b,0x13,0xc4,0xe1,0x2d,0xea,0x8d,0x17,0x33,0xe9,0x32,0xcc,0xd4,0x2f,0x39,0x2b,0x33,0x62,0xdd,0x24,0xcd,0x1c,0x38,0xd4,0x03,0x49,0xb9,0xbe,0x07,0x01,0x3b,0x3b,0x14,0x43,0x26,0x00,0x26,0x16,0x90,0x47,0x0c,0x28,0xdc,0x1e,0xeb,0xd9,0x18,0xdf,0x2a,0xbe,0x24,0xfb,0x15,0xdb,0x56,0xd1,0xd8,0x34,0x35,0x17,0xab,0x6b,0xce,0xc5,0xd0,0x45,0x08,0xe5,0xdd,0xd3,0x3a,0x46,0xb6,0x45,0xe1,0x00,0x00,0x00,0x00,0xf6,0xab,0xfe,0xff,0x04,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x03,0xb9,0xff,0xff,0xdf,0x05,0x00,0x00,0xe4,0xda,0xff,0xff,0x48,0x3d,0x00,0x00,0xa6,0x37,0x00,0x00,0xea,0x83,0x00,0x00,0x31,0x54,0x00,0x00,0x33,0x17,0x00,0x00,0x3e,0x5e,0x00,0x00,0x5d,0xac,0xff,0xff,0xc9,0x50,0x00,0x00,0xbd,0xf2,0xff,0xff,0x3b,0xb0,0xff,0xff,0x48,0x05,0x00,0x00,0xac,0x23,0x00,0x00,0xb9,0xdd,0xff,0xff,0x71,0xe3,0xff,0xff,0xe8,0xf4,0xff,0xff,0x68,0x8b,0x00,0x00,0x26,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0xac,0xfe,0xff,0x04,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x06,0xfe,0x0c,0x11,0x12,0xf5,0x09,0x37,0xf2,0xfb,0xfd,0x34,0xed,0x08,0x7f,0xfd,0xfd,0xf0,0xf1,0xf6,0x06,0xdf,0xf1,0x06,0xa3,0xf1,0xff,0x15,0xdc,0x03,0xc7,0xe4,0xf3,0xff,0xea,0x81,0xee,0xdb,0xff,0x86,0xee,0x7f,0x67,0x7f,0x03,0x25,0x71,0xd8,0x45,0xd7,0xf0,0xd7,0x4f,0x7f,0x30,0xc2,0x06,0xe6,0xcb,0xf2,0xf1,0xfc,0xee,0xfa,0xf9,0x12,0xa1,0x0d,0xdc,0x21,0xfd,0x1c,0xf7,0x11,0x97,0x1b,0x02,0x0c,0x17,0x99,0xf6,0x37,0x03,0x0a,0xea,0x67,0x9e,0x16,0x7f,0xe3,0x7f,0xdd,0x81,0xeb,0xfa,0xf9,0xca,0xdf,0x00,0xea,0x34,0xe9,0xf4,0x81,0x0c,0xc8,0x41,0xe8,0x7f,0x02,0xf6,0xfa,0xa6,0xef,0xed,0x38,0xcd,0x7f,0xe5,0x37,0x20,0x28,0xf9,0x81,0x7f,0xbd,0x34,0xd4,0x7f,0xc2,0x81,0x15,0x81,0x7f,0xd5,0xb1,0x99,0xe1,0x81,0xb8,0xe3,0x81,0x7f,0x1d,0xe0,0xf4,0xe8,0xe6,0xed,0x81,0x7f,0x44,0xf3,0xd6,0x4c,0xe7,0xf9,0x81,0x29,0x30,0x52,0xb7,0xcf,0xe0,0xd4,0xd5,0xe1,0xf9,0xf2,0x07,0xf2,0xcf,0xff,0xfc,0xfb,0xcf,0xef,0xff,0xf7,0x24,0xdf,0x17,0xc2,0xfc,0xfc,0xfb,0x0c,0x08,0x15,0xf7,0xe7,0x18,0xf7,0x07,0xff,0xdf,0x7f,0xd3,0x2c,0x7f,0xee,0xb7,0xf1,0x43,0xec,0x6e,0xfd,0x36,0xca,0xce,0xe6,0xf5,0xf2,0x43,0xec,0xd3,0xfd,0xc3,0x7f,0x7f,0xda,0xd1,0x2b,0x7f,0x0d,0xe7,0xd8,0x25,0xf8,0x01,0xf6,0x05,0xfc,0x4e,0xf0,0x04,0xc7,0x02,0x41,0xf8,0xfa,0x2b,0x24,0x00,0x12,0xe8,0xec,0x6f,0xf9,0xe9,0x06,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xad,0xfe,0xff,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x19,0x71,0x00,0x00,0xa7,0xbb,0xff,0xff,0x45,0x38,0x00,0x00,0x0a,0x3d,0x00,0x00,0x2c,0x45,0x00,0x00,0x97,0xa5,0xff,0xff,0xf9,0x47,0x00,0x00,0x6d,0x9a,0xff,0xff,0x6f,0x83,0x00,0x00,0xed,0xe9,0xff,0xff,0xb7,0xea,0xff,0xff,0x24,0x56,0x00,0x00,0xf3,0xb6,0xff,0xff,0x0f,0xd3,0xff,0xff,0x4b,0xc8,0xff,0xff,0x46,0xa5,0xff,0xff,0xed,0x4a,0x00,0x00,0x41,0xd7,0xff,0xff,0xc2,0x94,0xff,0xff,0xb4,0x36,0x00,0x00,0x03,0x7e,0xff,0xff,0x27,0x42,0x00,0x00,0x90,0x26,0x00,0x00,0xb9,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0xad,0xfe,0xff,0x04,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x06,0x81,0x42,0xf5,0xdb,0xde,0xc1,0x83,0xdc,0x1d,0x7a,0x2a,0xfe,0xbf,0xf5,0x28,0x04,0x68,0x1f,0x37,0x52,0x3f,0xeb,0x1c,0xfc,0xfd,0x37,0x6a,0x6a,0x5b,0xe9,0x12,0xb8,0xd6,0xef,0xe1,0xbf,0xfa,0x7f,0x7f,0x0b,0xbb,0xc4,0x48,0xe2,0xbb,0x28,0x81,0xcd,0xae,0x60,0x11,0x50,0x32,0x54,0xbc,0x93,0x53,0xd7,0xf6,0xd9,0xc9,0xfa,0x39,0x09,0xcd,0x0c,0x33,0xe5,0x81,0x44,0x11,0x17,0x2b,0x8d,0x47,0xe8,0x0c,0xb4,0xfc,0x7f,0x14,0x3a,0xd6,0xf8,0xdb,0x74,0x7f,0x40,0xda,0x0d,0x03,0x12,0x0a,0x26,0xe5,0xcf,0x2a,0xf1,0xed,0xfb,0x1e,0xf4,0xdd,0x7f,0x5b,0x45,0x81,0x01,0x0a,0xba,0x81,0x87,0x2f,0xc2,0xba,0x7f,0xb5,0xfa,0x28,0x34,0xfb,0x4f,0xa5,0x7f,0xa4,0x95,0xeb,0xa0,0x81,0x30,0x59,0x9f,0x81,0x64,0xac,0x77,0x7f,0x81,0x5a,0x7f,0xd9,0xd0,0xd5,0x4b,0xec,0x19,0x09,0x51,0x28,0x4e,0xe9,0xd0,0xcc,0x7f,0xf8,0x67,0x53,0x81,0xcc,0xe8,0x25,0x81,0xf5,0x3b,0x10,0xaf,0x27,0x02,0x33,0x7f,0xc2,0xe9,0x42,0x81,0x7f,0x42,0xa1,0xd9,0xeb,0x17,0x43,0x02,0x81,0x00,0xc3,0x0b,0xec,0x3e,0x1d,0xe2,0x67,0x0e,0x04,0x10,0x15,0x0f,0xe4,0xd8,0x24,0xc5,0x7f,0xa6,0x4d,0x7f,0x7f,0xf6,0xde,0xcd,0xed,0xc8,0xa6,0x7e,0xa5,0x0b,0x23,0xcf,0xcc,0x4b,0x3f,0x45,0x09,0x2f,0xea,0xef,0x9f,0xb6,0x12,0xdf,0x4e,0xe2,0x87,0x5f,0xb9,0xfc,0xda,0x10,0xc8,0x2f,0xee,0x81,0xee,0xc5,0xef,0xf4,0x09,0xe4,0x0c,0x5d,0x0e,0x17,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0xae,0xfe,0xff,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x98,0x55,0x00,0x00,0x1a,0x2a,0x00,0x00,0x98,0x55,0x00,0x00,0x97,0x55,0x00,0x00,0x98,0x55,0x00,0x00,0x6b,0xaa,0xff,0xff,0x6d,0xaa,0xff,0xff,0xf7,0xdb,0xff,0xff,0x00,0x00,0x00,0x00,0x16,0xaf,0xfe,0xff,0x04,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0xe7,0x02,0x7f,0x62,0x8e,0x1f,0x46,0x5a,0x81,0x00,0x2f,0x0e,0x59,0x00,0x28,0x6a,0xcc,0x81,0x0c,0x7f,0x90,0x31,0xff,0x1c,0xf2,0x01,0x56,0x30,0xb6,0x13,0x33,0x14,0xc3,0x02,0x2a,0xd7,0x46,0xaf,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x7f,0x20,0xb5,0xb4,0xaf,0x20,0x22,0x54,0xae,0x3e,0x55,0x38,0x52,0x4f,0x1e,0x1a,0x22,0xb3,0x57,0x24,0x1d,0xb0,0x2e,0xb8,0x28,0xb8,0x21,0x5a,0x21,0x71,0x58,0x21,0x24,0x46,0xb1,0x5a,0x5e,0xba,0x2c,0xb0,0x68,0x17,0x45,0x1a,0x7c,0x19,0xb2,0x22,0x25,0x6e,0x48,0x3d,0xab,0x1d,0x4c,0x20,0x44,0xb0,0xb4,0xb3,0x1f,0xac,0x2d,0x46,0x1f,0x17,0x61,0xb1,0xad,0x4f,0xb1,0x27,0x4e,0xb6,0xa7,0xb6,0xb2,0x23,0x1a,0x3b,0xa4,0x36,0x1b,0xb3,0x5a,0xa6,0x5d,0x1a,0x16,0xb5,0x1f,0x5f,0x62,0x1d,0x25,0x30,0x25,0x1b,0xaa,0xb2,0x0f,0x12,0xb9,0x27,0x2b,0x35,0x4f,0xb8,0x25,0x2d,0x20,0x24,0xb1,0xb0,0x4a,0xa9,0x4f,0x23,0x1b,0xb5,0x41,0x43,0x15,0xb7,0xb5,0x23,0x39,0xb4,0xc8,0x1c,0xd4,0xe1,0xdc,0x1c,0x1d,0xce,0xce,0xe0,0xe9,0xe7,0xfa,0xe1,0xc8,0xeb,0x25,0xe3,0xe6,0x21,0x15,0xcb,0xe9,0xe7,0xea,0xf3,0xc7,0xd1,0x1f,0xe0,0xe2,0xb9,0x2a,0xf6,0xde,0xd1,0xd9,0xf3,0xda,0xe2,0xe4,0xcb,0xd1,0x03,0xcc,0x4e,0xd4,0x19,0xb9,0xc7,0xcc,0xd0,0xa7,0xc7,0xcd,0xd4,0x02,0x81,0xe7,0xd6,0x1d,0xe2,0xaa,0xd0,0x16,0x23,0xd7,0xe9,0xc8,0xd1,0xea,0x37,0xd4,0xd8,0x97,0xe8,0xcf,0xd7,0xc6,0xc2,0x9a,0xfa,0x09,0xe4,0xe3,0x9e,0xd8,0x0b,0x01,0x81,0x1f,0xe3,0xd6,0x0f,0x30,0xec,0x2b,0x14,0x95,0xd3,0x0d,0x1b,0x0b,0x38,0xaa,0xd6,0xdc,0xf2,0x25,0xfd,0x22,0xcf,0x84,0xd4,0xe1,0xb9,0xe8,0xbb,0xc7,0xed,0xde,0xf2,0xd6,0x09,0xea,0xc9,0xf3,0xdc,0x00,0x00,0x00,0x00,0x56,0xb0,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0xe3,0x99,0x28,0xd8,0x53,0xeb,0x1a,0xe3,0x0d,0xb9,0x95,0xe4,0xf6,0x01,0x55,0x81,0xc4,0x87,0x53,0x4d,0xf6,0x12,0xe5,0x4c,0xcd,0x16,0x84,0xe5,0x0c,0xf8,0xb5,0x5d,0xc2,0x33,0x1d,0x9a,0x0a,0x36,0x57,0xbb,0x48,0x02,0xf3,0x90,0x8f,0x4e,0xf1,0x19,0xe4,0x12,0xf5,0x0f,0x81,0x09,0xa4,0x60,0xab,0x57,0xd7,0x18,0x70,0x9a,0x1e,0x1e,0x3b,0x08,0xe0,0x38,0xdd,0xba,0xa3,0x75,0xb7,0x3c,0x1b,0x6f,0x79,0xa2,0xfe,0x07,0x36,0x01,0x0e,0x2c,0x7f,0xce,0x32,0xaf,0x44,0x8a,0x06,0xd9,0xa0,0x76,0xee,0x03,0x1f,0x12,0xbe,0x60,0xf4,0xba,0x90,0x4a,0xe5,0xdd,0xf8,0x22,0x35,0xc7,0xca,0xe5,0x0b,0xfe,0x0d,0x07,0x36,0xf4,0x2d,0xe4,0x6a,0xa2,0x1e,0xae,0xa5,0x7f,0x01,0xd4,0x46,0xf4,0xcd,0x3b,0x08,0xc4,0x91,0x60,0xe5,0xeb,0x1b,0x26,0x59,0xa9,0xdd,0x28,0x26,0x13,0x0c,0x05,0x4e,0xfb,0x33,0xe5,0x66,0xb4,0xec,0xa8,0xaa,0x7f,0x14,0xfe,0xed,0xe6,0x1b,0xd2,0x22,0x47,0x2d,0xba,0x25,0x22,0x0c,0x9d,0xab,0x5e,0xfd,0xec,0xe5,0xf9,0xe0,0xf7,0x94,0x40,0xba,0x2a,0x81,0x28,0x0b,0x47,0x56,0xbc,0x0b,0x22,0xc2,0x14,0x6c,0xa4,0xed,0x5d,0x6e,0xb3,0x4d,0x2a,0xfa,0xaf,0xb7,0x4b,0x35,0xfc,0x0c,0x11,0xcb,0xf2,0x9d,0x47,0xaa,0x55,0x9d,0x4f,0x0d,0x4a,0x3f,0x81,0xd4,0x1f,0xe4,0xa3,0x1d,0xe9,0x58,0xe2,0x1a,0xdd,0x10,0xaa,0x9f,0xeb,0x0d,0x0e,0x43,0x8d,0xc5,0x93,0x49,0x4a,0xde,0x36,0xe8,0x20,0xd0,0x1e,0x81,0xf8,0x1b,0x06,0xba,0x67,0x21,0xe7,0xd4,0x4d,0xf4,0xcb,0xa8,0x7a,0xe6,0x29,0xec,0x7f,0x7c,0xc1,0xf6,0x21,0x08,0x01,0xf0,0x14,0x4e,0xd8,0x5f,0x9c,0x4a,0x99,0x20,0xcb,0xa2,0x6d,0x1e,0x20,0xd2,0x5f,0xf4,0x09,0xc1,0x4b,0x3e,0xcf,0xfa,0x6d,0x46,0xef,0xc7,0x37,0xc4,0x7f,0xfa,0x64,0x99,0xcd,0xd8,0x03,0xea,0xd9,0xfc,0x39,0x73,0x1b,0x0c,0xc8,0x4a,0xb7,0xeb,0x54,0x05,0x0d,0xb7,0x3a,0x33,0xda,0xfe,0x38,0x57,0xfd,0xc5,0x1a,0xd5,0x72,0x23,0x72,0xcd,0xd0,0xfa,0xfd,0x0c,0xdc,0xe0,0x2c,0x7d,0x3d,0x30,0xce,0x47,0x81,0xdb,0xf8,0x34,0xea,0x11,0x05,0x19,0xe4,0x21,0x93,0xa2,0xe6,0xec,0xff,0x3c,0x93,0xb0,0xa2,0x19,0x0a,0xfb,0xf0,0xf0,0x25,0x06,0x01,0x87,0x17,0x09,0x10,0x81,0x6c,0x0c,0x9d,0xff,0x04,0x2e,0x18,0x32,0xde,0xed,0x14,0x20,0xe7,0xdd,0x1f,0xeb,0x1f,0x3a,0x2a,0x6c,0x50,0x03,0x33,0xee,0xf3,0xd7,0x1e,0x4f,0xef,0x27,0xf2,0x7f,0xc7,0xf9,0x50,0x10,0xf6,0xbb,0x30,0x10,0xe9,0xe9,0x43,0x56,0x01,0xc1,0x0c,0xcc,0x5c,0x3d,0x63,0xc3,0xd9,0xde,0x03,0xe2,0xf6,0xe8,0x10,0x7f,0x31,0x38,0xd4,0x50,0x9c,0x0c,0x52,0xe2,0x16,0xb0,0x10,0x06,0x01,0xf5,0x49,0x51,0x01,0xe7,0xfa,0xa1,0x7f,0x53,0x75,0xbc,0xc9,0x18,0xf4,0x0b,0xe0,0x06,0xfe,0x75,0xfc,0x0d,0xf1,0x71,0x90,0xe3,0x2e,0x1a,0xe8,0xef,0xf7,0x05,0x05,0x0f,0xda,0xb6,0x0b,0x16,0x05,0x1a,0xd4,0xcb,0xcc,0xb8,0xdb,0xf3,0xef,0x0e,0x1d,0x10,0xf0,0x93,0x12,0x00,0xfb,0x81,0x34,0xbd,0x17,0x38,0xb7,0x08,0x2a,0x67,0xa2,0x21,0x01,0x38,0xb8,0xe4,0x20,0x2a,0xfb,0xe3,0x19,0xc6,0xff,0x93,0x2d,0x93,0x3d,0xb0,0x25,0xdc,0x1c,0x59,0x81,0x11,0x09,0x36,0xe0,0xd8,0x63,0x0d,0xdf,0xe3,0x60,0xdc,0x2b,0xd2,0x3b,0x53,0xa5,0xfc,0x30,0x24,0x09,0x26,0x17,0x73,0xce,0x6c,0xbd,0x5d,0xcb,0x05,0xc5,0xdd,0x7f,0x36,0xfb,0x0b,0x5f,0xef,0x06,0xc3,0x2b,0x21,0xd1,0x07,0x62,0x6d,0xf9,0xba,0x3a,0xb7,0x7f,0x36,0x6e,0xc3,0xc4,0x02,0x20,0x03,0xf8,0xe0,0x2d,0x76,0x40,0x3e,0xd8,0x6c,0x97,0xe1,0x33,0x1d,0xa3,0x1b,0x4b,0x66,0x90,0x24,0x3a,0x07,0x95,0xba,0x62,0x33,0xe5,0xe7,0x27,0xf7,0xfd,0x81,0x51,0xbc,0x5e,0x97,0x43,0xe8,0x40,0x3d,0x8b,0x05,0xe2,0xd5,0x12,0x7d,0x97,0xfb,0x08,0x71,0xab,0x17,0x0b,0x37,0xd6,0xaf,0x70,0xf2,0x21,0xb4,0xde,0xd6,0x18,0x81,0x54,0x94,0x44,0xb9,0x45,0xe5,0x35,0x1c,0xad,0xef,0x0a,0x5f,0xe3,0xa9,0x1c,0xef,0xb6,0x81,0x54,0xd3,0xfb,0x03,0x49,0x5d,0xcc,0xc1,0xea,0x45,0x13,0x12,0x14,0x61,0xe4,0x28,0xb4,0x62,0xb9,0x0a,0xcb,0x9f,0x69,0x19,0xdd,0x09,0x84,0x09,0xfe,0x39,0xf3,0x03,0xe2,0xfa,0xd2,0xdc,0xc8,0x01,0x23,0x32,0xd3,0xdc,0xb5,0x7f,0x57,0xf4,0x45,0xd2,0x13,0xea,0x11,0xca,0x09,0x03,0xfd,0x0a,0x34,0x0f,0x07,0xc0,0x48,0x26,0xc2,0xcc,0x3f,0xbb,0x1e,0x1c,0x41,0x4a,0xab,0xd8,0x0e,0x3f,0xe5,0x45,0x0e,0x57,0xf0,0x49,0xaf,0x7f,0xba,0x31,0xcb,0xb7,0x6e,0xf4,0xec,0x08,0x81,0x07,0x07,0x49,0xfb,0x1f,0xd9,0xf2,0xd7,0xd9,0xd4,0xed,0x01,0x06,0xdc,0x16,0xde,0x73,0x5c,0x12,0x40,0xe1,0x17,0xdd,0x10,0xf1,0xda,0x1c,0xfd,0x14,0x2a,0x2a,0xed,0xb1,0x50,0xf5,0xcd,0xb5,0x33,0xb8,0xda,0xf7,0x15,0x33,0xae,0xf4,0xec,0x05,0x24,0x18,0x03,0x38,0xe5,0x29,0xc9,0x38,0xd5,0x25,0xec,0x9a,0x7f,0x13,0xe5,0xd6,0x68,0xf4,0x31,0xce,0x44,0x1d,0xa3,0xec,0x64,0x41,0xb1,0xbb,0x46,0xd3,0x70,0xe8,0x5f,0xb8,0xdb,0x18,0x29,0xe5,0x16,0x12,0x04,0x7f,0x2a,0x13,0x11,0x47,0xae,0xf1,0xb3,0x24,0xdb,0x3b,0xda,0x14,0xfb,0x12,0xb4,0x9e,0xd7,0x16,0xf7,0x50,0x81,0xd9,0x9e,0x2e,0x39,0xeb,0x1c,0xf8,0x29,0xe3,0x11,0x81,0xe2,0x07,0xec,0x99,0x61,0xe9,0x23,0x1b,0xa7,0xe0,0x44,0x7f,0xaf,0x51,0x05,0x2f,0xa3,0xa0,0x6c,0x28,0xcb,0xd9,0x1c,0xcf,0x09,0xb9,0x13,0xaf,0x62,0xb4,0x45,0x0c,0x3f,0x4d,0xa4,0xdf,0xff,0xf0,0x43,0xf7,0x02,0xbd,0x2e,0x3f,0xcb,0xf9,0x51,0x60,0xf2,0xd0,0x32,0xc0,0x60,0x2d,0x77,0xcb,0xc3,0xe7,0xfe,0x05,0xdd,0xe5,0x0f,0x7f,0x15,0x3a,0xce,0x66,0xa6,0xe6,0x37,0xf6,0x06,0xc8,0x39,0x14,0xce,0x01,0x56,0x5b,0xd8,0xce,0x25,0xbf,0x7f,0x40,0x68,0xc3,0xc3,0xe4,0xf9,0xe3,0xea,0xeb,0x22,0x77,0x26,0x31,0xe7,0x52,0x85,0x0d,0x49,0xe5,0x2b,0xb6,0x1a,0x00,0xec,0xe5,0x60,0x65,0x10,0xe4,0xfa,0xad,0x7f,0x44,0x7b,0xba,0xbc,0x10,0xf9,0x0a,0xca,0x03,0x07,0x7d,0x01,0xfe,0x06,0x78,0x83,0xea,0x05,0x49,0x9d,0x09,0x4f,0x6b,0x85,0x10,0x1d,0x14,0x8c,0xb6,0x2e,0x1b,0xff,0xfb,0xf2,0xc9,0xe0,0xa1,0x2e,0x87,0x1c,0xc9,0x43,0xf4,0x15,0x43,0x81,0xda,0xee,0x0d,0xa3,0x07,0x0d,0x21,0x23,0x2b,0xe4,0xeb,0x0e,0x0f,0xe9,0xd7,0x16,0xe6,0x20,0x36,0x2c,0x6c,0x42,0x03,0x27,0xd8,0x02,0xe5,0x24,0x51,0xf5,0x1a,0xe4,0x7f,0xca,0x1f,0xe3,0xd3,0x2e,0xdf,0x02,0xc6,0x35,0xc0,0xea,0xf1,0x68,0x48,0xa6,0xd1,0x1a,0x1a,0x02,0x11,0x2c,0x3f,0xce,0x56,0xd5,0x60,0xd0,0x23,0xb5,0xdd,0x7f,0x0b,0xfe,0xf9,0xa6,0x21,0xe4,0x42,0x09,0x12,0xd7,0xff,0xad,0xb7,0xe2,0xfd,0x1c,0x53,0x81,0xbd,0x8f,0x3e,0x42,0xf5,0x05,0xf4,0x38,0xcf,0x06,0x92,0xfb,0x01,0xe7,0xa5,0x72,0xeb,0x4b,0x07,0x07,0xb4,0x28,0x2b,0xd9,0x0a,0x4b,0x54,0xf1,0xd1,0x35,0xcd,0x72,0x3b,0x5a,0xc1,0xcc,0xef,0x03,0xef,0xe0,0xee,0x23,0x7f,0x22,0x2c,0xe4,0x60,0x90,0x0c,0x10,0x9d,0x68,0xf5,0xae,0xcd,0x26,0xdc,0x15,0xfb,0x27,0x60,0xdb,0xec,0x39,0x08,0xf9,0x1c,0x38,0x72,0xd9,0x74,0xed,0x68,0x8e,0x18,0x9a,0xaf,0x7f,0x19,0x14,0x0e,0xb6,0x0f,0xfd,0x7f,0x0a,0x02,0xb9,0x02,0xbf,0xa6,0xd6,0xe4,0xfd,0x13,0xb5,0xab,0xa5,0x2e,0x5d,0xda,0x46,0xf5,0x4c,0x0b,0xfc,0xa2,0xf3,0x33,0x06,0xc7,0x32,0x50,0xd2,0xae,0x6c,0xe1,0xd3,0xaf,0x6e,0xe4,0xfa,0xfb,0x25,0x49,0xb0,0xc4,0xe8,0x39,0xef,0xdf,0x19,0x7f,0xbb,0x28,0xda,0x7f,0x8c,0x13,0xa9,0xad,0x70,0x11,0xe9,0xe4,0x4c,0xf3,0x0d,0xaf,0x1c,0x46,0xce,0xff,0x5e,0x60,0xf8,0xc6,0x1c,0xba,0x6d,0x42,0x6b,0xc7,0xc9,0xec,0x1b,0xeb,0xfa,0xeb,0x12,0x7f,0x25,0x41,0xe6,0x62,0x8e,0xc9,0xdd,0x32,0xe9,0x55,0x41,0x52,0xa8,0x1e,0xce,0xdb,0xa5,0xb5,0x22,0x61,0xc4,0xab,0xce,0x3c,0x51,0xf6,0x5b,0xda,0x3f,0xe6,0x0e,0xb4,0x09,0x13,0xfe,0x81,0x7f,0xe5,0xab,0x32,0xd0,0x49,0xec,0x0c,0xee,0x0b,0xab,0xbf,0xe1,0xe2,0x05,0x4c,0xa5,0xcb,0x95,0x75,0x52,0x01,0x1e,0xbe,0x35,0xda,0x01,0x81,0xf6,0x03,0xfe,0xb9,0x50,0xbf,0xc8,0x2c,0x8f,0x12,0x3d,0x3b,0xf1,0x2e,0x41,0x26,0xd4,0xde,0x59,0x2b,0x1c,0xf6,0x20,0x35,0xf4,0xc8,0x3d,0x8b,0x40,0xa3,0x7f,0x11,0x2c,0x7e,0xa0,0x34,0x03,0xe6,0xa0,0x11,0xd3,0x4c,0xf8,0x0e,0xec,0x13,0xa2,0xa3,0xd0,0x13,0x0c,0x54,0x83,0xca,0x8c,0x58,0x41,0xe7,0x22,0xd8,0x30,0xe6,0x0e,0x81,0xf7,0x14,0xeb,0xad,0x59,0x1c,0x1a,0x71,0x81,0xee,0x22,0x14,0xed,0x0d,0x13,0x26,0xbd,0xf3,0x18,0xe2,0xf8,0xfe,0x0e,0x01,0xe1,0x84,0x05,0x86,0x26,0x87,0x4a,0x14,0x5e,0x58,0x84,0x16,0xe1,0x13,0xdc,0xc6,0x58,0xf6,0xb8,0x98,0x7f,0xca,0xfa,0xf0,0x49,0x6c,0xd4,0xd4,0x0f,0x0b,0x24,0xe9,0x16,0x5e,0xfc,0x5b,0xde,0x38,0xe0,0x0f,0xe7,0xaf,0x6b,0x1a,0x0a,0xb3,0xfa,0x57,0x89,0x26,0x2a,0x72,0x8d,0x22,0x03,0x43,0xb9,0x8e,0x4a,0x2e,0xe7,0x0a,0xfc,0xcb,0xdd,0x81,0x2f,0xd8,0x60,0xa6,0x75,0x14,0x6b,0x6c,0xac,0x15,0x02,0x18,0x3d,0xdf,0x23,0xb8,0x11,0x0e,0xf0,0xf1,0x47,0x4b,0x17,0xe8,0x09,0xa9,0x61,0x4a,0x71,0xca,0xbf,0x11,0xf7,0x1c,0xd4,0x0a,0x02,0x7f,0x05,0xfd,0xff,0x59,0xa2,0xe3,0xab,0x26,0xca,0x5a,0xe5,0x0f,0xdd,0x06,0xac,0x9e,0xed,0x0a,0x07,0x47,0x9b,0xca,0x82,0x57,0x52,0xe2,0x22,0xdb,0x3e,0xdb,0x1e,0x81,0xe2,0xfb,0xdf,0xb0,0x62,0xdd,0xa1,0x1c,0xdb,0x4e,0x07,0x09,0xf5,0x15,0xb6,0xa4,0xcf,0x05,0x20,0x48,0x89,0xc4,0x81,0x74,0x3f,0xdd,0x1f,0xe9,0x2f,0xcc,0xf9,0x88,0xfb,0x14,0xf3,0xa5,0x70,0xf3,0x89,0x3b,0x02,0x43,0x27,0x2c,0xc3,0x22,0xbe,0xcd,0xe7,0xf6,0x02,0x2a,0x9b,0xcf,0x8f,0x4e,0x4d,0x09,0x3b,0xe6,0x26,0xfc,0x31,0x95,0xe3,0x24,0xf5,0xac,0x7f,0x29,0xc9,0xe9,0x32,0x0b,0xe5,0x81,0x72,0xd8,0xfb,0x24,0x68,0x61,0xc3,0xf4,0x0c,0x15,0x15,0x2e,0x0b,0x15,0xda,0x2c,0xf1,0x4e,0xc5,0x0b,0xea,0xad,0x5a,0x2b,0xdc,0xe3,0xc9,0xec,0x18,0x6b,0x31,0x4a,0xae,0xf5,0xb4,0xd1,0xb4,0xc2,0x36,0x50,0xbc,0xbb,0xb3,0x24,0x39,0x16,0x33,0xed,0x32,0x0b,0xf7,0x9a,0xfb,0x05,0x18,0x81,0x56,0xff,0x89,0x30,0xd4,0x49,0xfd,0x05,0xef,0x09,0xb8,0xb5,0xd7,0x0d,0x12,0x3f,0x98,0xb7,0x81,0x69,0x47,0xe0,0x2e,0xf9,0x44,0xda,0x1d,0xa1,0xef,0xfd,0xe7,0xa6,0x53,0xcd,0x94,0xf4,0xfa,0x51,0x06,0x31,0xbf,0xf8,0xaa,0xdd,0xbd,0xc4,0xf6,0x32,0x82,0xd6,0x81,0x40,0x53,0xec,0x3f,0x03,0x1e,0xf8,0xfb,0xad,0x01,0x3c,0x12,0xb7,0x41,0xef,0x7e,0x16,0xe4,0xb7,0x04,0x19,0xe0,0x14,0x04,0x11,0xef,0xec,0x17,0xf7,0x15,0xe7,0x09,0x81,0xa3,0xe0,0xdb,0x07,0xfe,0xfe,0x0a,0xf1,0x28,0x06,0xe0,0xb4,0x09,0x22,0x10,0xee,0x1f,0xf3,0xeb,0x8a,0x7f,0xed,0x16,0x05,0x60,0x53,0xba,0x00,0xf4,0x03,0x09,0x06,0xf4,0x16,0xdd,0x30,0xcc,0x44,0xd3,0xef,0xdd,0xb4,0x4a,0x0d,0x07,0x1e,0x1b,0x9e,0x74,0x14,0xab,0xa2,0x32,0xfc,0xe3,0xf7,0x4e,0x4b,0xb9,0xf7,0x11,0x2a,0x12,0x2d,0xdc,0x6c,0xd4,0x75,0xba,0x40,0x8b,0xf2,0xc4,0x81,0x72,0x28,0xfa,0x07,0x12,0xb5,0x49,0xe0,0xf8,0x93,0x7f,0xdd,0xf3,0xe2,0x6a,0x72,0xae,0xdc,0x25,0x36,0x01,0xf9,0x24,0x4e,0xca,0x14,0xd0,0x6b,0x9d,0xf4,0xea,0xd0,0x77,0x2f,0x15,0xc7,0x40,0x7f,0x88,0x20,0x40,0x59,0xc2,0x2f,0x30,0xf2,0x9e,0x91,0x45,0x06,0x0c,0xaa,0xe3,0x0d,0xd0,0xcf,0x49,0x9b,0x49,0x89,0x7f,0x20,0x3d,0x27,0xad,0x17,0x08,0x26,0xef,0xb0,0x71,0xe6,0xe6,0xc3,0x58,0xc5,0xf7,0xdc,0x5d,0x3c,0xa1,0xcf,0x0d,0x37,0xec,0xeb,0x1a,0x79,0xdb,0x53,0xb2,0x50,0x9d,0xf9,0xc0,0x98,0x7f,0x1f,0xee,0x05,0x4f,0xe3,0x30,0xb8,0x01,0x0b,0xf0,0xe4,0x51,0x5b,0x10,0xe5,0x04,0xa9,0x77,0x53,0x73,0xbc,0xc0,0x13,0xea,0x21,0xc6,0x06,0xfd,0x7f,0x08,0x0a,0xfa,0x6e,0x8f,0xf3,0xae,0x2b,0xdd,0x42,0x05,0xf5,0xf9,0x15,0xb8,0x9f,0xde,0x0f,0x12,0x34,0x81,0xe3,0x97,0x5b,0x5d,0xed,0x3d,0xd0,0x30,0xce,0x03,0x90,0xe8,0x26,0xf6,0xab,0x4b,0xdf,0x28,0x5f,0xa1,0x08,0x3e,0x64,0xc2,0x4b,0x15,0xfd,0xd6,0xa9,0x79,0x05,0x17,0xb7,0x07,0xef,0x26,0x96,0x2d,0xdb,0x47,0x81,0x47,0x04,0x3c,0x5b,0x94,0xf2,0xf8,0x1c,0x0a,0x6c,0xcb,0x0c,0x0a,0x68,0xf3,0x44,0xde,0x21,0xc0,0xb4,0x1c,0xef,0x17,0xfc,0xfd,0x1d,0xf8,0x91,0x01,0xc1,0x58,0xb7,0x6e,0xdc,0x51,0x22,0x81,0x33,0xef,0xe7,0xb8,0x2b,0xd1,0x46,0xef,0x06,0xf2,0x14,0xb5,0xb3,0xd8,0xef,0xff,0x3e,0x96,0xc9,0xb0,0x34,0x3a,0xfb,0x04,0xe5,0x3f,0xf6,0xfb,0x81,0xfb,0x00,0xd7,0xc2,0x58,0x19,0xd0,0xbb,0x52,0x21,0xce,0xdd,0x4c,0xbf,0x02,0x12,0x1a,0x26,0xa6,0xe8,0x17,0x33,0x1e,0x2b,0xfb,0x61,0xcc,0x42,0xa8,0x6d,0x95,0x0d,0xb8,0xae,0x7f,0x19,0xf1,0x2e,0xf4,0xe6,0x35,0x2a,0xdb,0xa5,0x7f,0xd2,0xf5,0x07,0x6d,0x4f,0xaf,0xd8,0x06,0x17,0x09,0xf2,0xfd,0x47,0xe5,0x3f,0xc2,0x5d,0xd0,0x04,0xe2,0xb2,0x69,0x24,0xe5,0xf8,0xae,0x32,0xc8,0x36,0xef,0xfd,0xfa,0x24,0xad,0xb2,0xd1,0xfa,0x05,0x3e,0xa6,0xc8,0x91,0x56,0x5f,0x01,0x24,0xee,0x18,0xce,0x06,0x81,0x0f,0x17,0xea,0x98,0x59,0x24,0xc9,0xb6,0x7b,0x22,0xbb,0xbc,0x3f,0xda,0xfd,0xdd,0x51,0x35,0xdb,0xf8,0x45,0x2a,0x09,0xf6,0x00,0x79,0xeb,0x51,0xcd,0x3e,0xbd,0x2b,0xb3,0xb5,0x7f,0x1e,0x0f,0xc7,0xeb,0x57,0xd3,0xfd,0x3d,0x72,0x81,0x37,0x47,0xfb,0xc4,0x83,0x5a,0xf3,0xf7,0xc4,0x1f,0xd9,0xe8,0xbe,0x0b,0x87,0x3e,0x83,0x53,0xff,0x4d,0x6b,0x9b,0x1b,0x06,0xf4,0xb6,0x1e,0xe8,0x3f,0xf7,0x09,0xf1,0x16,0xaa,0x9b,0xd0,0x05,0xfa,0x45,0x81,0xba,0x91,0x48,0x40,0xf4,0x1c,0xe5,0x33,0xef,0x0e,0x85,0xfe,0x07,0xdc,0xa5,0x62,0x1c,0xe9,0xbd,0x58,0xed,0xd8,0xb9,0x54,0x06,0x20,0xf7,0x72,0x7f,0xa9,0xed,0x21,0x1b,0x05,0xd9,0x2b,0x54,0xdd,0x6b,0xba,0x64,0xbd,0xda,0xe9,0xce,0x47,0x19,0xf0,0x45,0xdd,0xc9,0x2d,0x0a,0xd5,0x9a,0x7f,0xff,0x0f,0x1e,0x55,0x40,0xbc,0xf7,0xeb,0x18,0x28,0x36,0x24,0x36,0xe3,0x3c,0xe3,0x3d,0xc5,0x1e,0xfa,0xc6,0x44,0x31,0xf3,0x10,0xda,0xb7,0x79,0x09,0xbb,0xc0,0x71,0xc8,0xf9,0xdf,0x57,0x2b,0xb4,0xe5,0xe0,0x21,0x1e,0xe6,0xee,0x7f,0xc5,0x20,0xb2,0x59,0x96,0x1c,0xab,0xba,0x52,0x00,0xe6,0x3d,0xfc,0xb1,0x20,0x0a,0xcc,0xc3,0x63,0xe4,0xef,0xe8,0x52,0x7f,0x88,0xd9,0x0c,0x3b,0x23,0x02,0x03,0x3f,0xe2,0x2c,0xe1,0x5f,0xa7,0x20,0xae,0x96,0x61,0xf8,0xde,0xf6,0x53,0xfc,0x0f,0xd0,0x2f,0x0d,0xc2,0xff,0x2f,0x2d,0xf6,0xf0,0x29,0xea,0x63,0xf9,0x60,0x81,0xb5,0xfa,0x13,0xf9,0x18,0xf1,0x11,0x65,0x02,0x3e,0xda,0x1f,0xda,0x0f,0x42,0xf8,0x18,0xba,0x18,0x1d,0xf4,0xfe,0x44,0x65,0xfa,0xe0,0x1a,0xc8,0x76,0x28,0x6d,0xc5,0xbc,0xf9,0xf9,0xf7,0xe3,0xf8,0x09,0x7f,0x17,0x19,0xe7,0x68,0x97,0xf7,0xad,0x15,0xdd,0x63,0x0f,0x10,0xd7,0x17,0xa0,0x96,0xb9,0xc6,0x07,0x5f,0xbe,0xda,0xaf,0x2e,0x3a,0xd2,0x18,0xf5,0x48,0xdd,0xf9,0xb1,0xdd,0x14,0x0d,0x86,0x7f,0x31,0xe4,0xcd,0x30,0x31,0xd8,0x95,0x7f,0xec,0x0f,0x39,0x63,0x3f,0xaa,0xfa,0xf0,0x36,0xf8,0x2b,0x13,0x3a,0xff,0x2e,0xda,0x45,0xcf,0x24,0xcf,0xcd,0x43,0x38,0xed,0xe6,0x7d,0x0c,0xe1,0xbe,0xf8,0x04,0xeb,0x1a,0x0a,0x00,0xfc,0xe6,0x12,0x03,0x11,0xe1,0xfb,0x81,0x9c,0xeb,0xd7,0xf6,0xfc,0xf9,0x0f,0xeb,0x21,0x0a,0xdd,0xaa,0x01,0xd2,0xdb,0x69,0xb0,0xfa,0x11,0x10,0xb7,0x4c,0x41,0x22,0x99,0xa1,0x4e,0xf1,0xf9,0x08,0xfc,0x16,0x27,0x87,0x20,0xc0,0x56,0xb3,0x77,0x2e,0x61,0x64,0x81,0xda,0x12,0x2b,0xe1,0xbc,0x7d,0x0e,0xbf,0x9a,0x57,0xeb,0xdc,0x02,0x67,0x2b,0xbe,0xdf,0x0c,0x18,0x0d,0x07,0x3d,0x7f,0xe3,0x51,0xc0,0x37,0x8e,0x4a,0xb0,0xb1,0x49,0x09,0xd8,0xf9,0x46,0xf6,0x0e,0xc0,0x29,0x40,0xe4,0xfb,0x56,0x42,0xea,0xc3,0x3b,0xb4,0x7a,0x12,0x6c,0xbf,0xb3,0xe6,0xfc,0x00,0xe2,0xf4,0x10,0x7f,0x2b,0x43,0xd3,0x58,0x8c,0x29,0xec,0xd0,0x22,0x1c,0xeb,0xa5,0x7f,0x08,0x0f,0x21,0x4e,0x59,0xbb,0xf4,0x0b,0x28,0x11,0x47,0x19,0x3d,0xeb,0x3d,0xca,0x3b,0xbf,0x0c,0xcf,0xaf,0x41,0x29,0xdb,0x08,0xad,0x37,0xcc,0x52,0xe1,0x13,0xe2,0x18,0xbc,0x9f,0xe5,0x03,0xf9,0x34,0x83,0xba,0x81,0x3c,0x36,0xe4,0x0f,0xd2,0x3c,0xe5,0x1d,0x91,0xf9,0x14,0x02,0xbb,0x6f,0xed,0xef,0x35,0xd5,0xec,0x36,0x30,0xd0,0xf3,0x15,0x23,0xb5,0xb9,0x44,0x31,0x23,0xc5,0x30,0x13,0x20,0xba,0x37,0x9c,0x1f,0x81,0x6c,0x13,0x3b,0x1b,0x8a,0x2f,0x1e,0xf4,0xff,0x76,0xab,0xe8,0x26,0x44,0xb8,0x28,0x4c,0xe9,0xae,0xd6,0x68,0x1a,0xf5,0xcd,0x1b,0x27,0x2c,0xd3,0xfc,0xe6,0xfa,0xb6,0x63,0x03,0x11,0x4a,0x81,0xfa,0xec,0x22,0x14,0xda,0x0f,0xff,0xf8,0x94,0x7f,0xf8,0xfb,0x07,0x45,0x55,0xbc,0x15,0xfc,0x05,0x07,0xe7,0x07,0x14,0xe4,0x1e,0xe7,0x44,0xc0,0xff,0xfa,0xb7,0x44,0xf2,0xf2,0xce,0x1d,0x66,0xb9,0xd8,0x31,0x63,0x9b,0x30,0x04,0xf9,0x87,0xc9,0x73,0x0b,0xf9,0xc2,0x0c,0x0a,0x00,0x94,0x09,0x8f,0x38,0xc6,0x7f,0x35,0x54,0x5d,0x8b,0xfa,0x02,0xf8,0x53,0x0c,0x0c,0xb8,0x2d,0x2b,0xc5,0xf0,0x51,0x4f,0xd8,0xc4,0x1b,0xb8,0x7b,0x2b,0x60,0xc6,0xb9,0xf8,0x13,0xee,0xe3,0xf8,0x2a,0x7f,0x21,0x29,0xd5,0x6a,0x91,0xf0,0x97,0x10,0xd4,0x4d,0xf8,0x20,0xdd,0x09,0xb4,0xa3,0xf5,0x0f,0xff,0x4f,0x9a,0xcc,0x99,0x42,0x40,0xe7,0x1f,0xd1,0x3b,0xea,0x04,0x81,0x05,0x00,0xe9,0xb5,0x60,0xae,0xef,0x60,0x8c,0xf8,0x6a,0x35,0xab,0x52,0x34,0x0a,0xa7,0xab,0x42,0x11,0x01,0x06,0x3e,0x17,0xef,0xa7,0x4a,0xab,0x3a,0xca,0x3b,0xf7,0x73,0x7f,0xb7,0xea,0x23,0xd0,0x23,0x5c,0x90,0xe2,0x43,0x54,0xa5,0x05,0x20,0x16,0x8e,0x89,0x74,0x11,0xff,0xb1,0x1d,0x20,0x10,0x87,0x11,0xb8,0x16,0x8c,0x68,0x12,0x3b,0x7b,0x81,0xfa,0x0d,0xe7,0x74,0x09,0xe7,0xbc,0xfd,0x0a,0xe7,0x1a,0x02,0xfa,0x06,0xea,0x0c,0xfe,0x0e,0xf5,0xfd,0x81,0x9d,0xde,0xdd,0xfa,0x01,0xfc,0x01,0xe3,0x29,0x15,0xeb,0xba,0x0e,0xd7,0xf9,0x2d,0xc7,0xd4,0x44,0x6f,0x81,0x15,0x3e,0x17,0x9a,0x8c,0x42,0x42,0xf8,0xc5,0xef,0xec,0xe1,0x8e,0x36,0x9f,0x2d,0x89,0x57,0xeb,0x66,0x3a,0xb0,0xe9,0xf7,0xc4,0x23,0x52,0xce,0x01,0x53,0x3a,0xae,0x35,0xfb,0x38,0xd1,0xc1,0x27,0x25,0xdd,0xae,0x09,0x13,0xdd,0xa8,0x37,0x86,0x58,0x8b,0x7a,0x18,0x43,0x27,0x81,0x19,0x3c,0x33,0xe7,0xcd,0x1f,0x1c,0xff,0xaf,0x7f,0xf0,0xfc,0x10,0x4d,0x4f,0xb4,0xe4,0x15,0x1d,0x01,0x3b,0x0e,0x33,0xd4,0x38,0xda,0x37,0xce,0x2a,0x01,0xc9,0x38,0x1f,0xfe,0x21,0xf2,0xb4,0x27,0xdf,0xe3,0x82,0x5b,0xc0,0x38,0x1b,0x67,0x7f,0x91,0xe8,0x06,0x41,0x01,0xf6,0x09,0x5a,0xd9,0x78,0xd1,0x6d,0xb3,0xfa,0x9b,0xb7,0x69,0x10,0x2e,0x05,0x0d,0x2d,0xd0,0x04,0x09,0x28,0xd8,0xe0,0xbb,0x18,0xd7,0xe0,0x40,0xd7,0xc5,0xb1,0x2f,0xee,0xe2,0xc9,0xfb,0x81,0x4f,0x98,0x4a,0x12,0x58,0x2f,0xd5,0x29,0xd8,0x0f,0x05,0x5e,0xd2,0x08,0x3f,0x36,0xc9,0x03,0xca,0x22,0xae,0xd0,0x64,0x21,0xe9,0xd3,0x22,0xf5,0xe5,0x99,0xd8,0x81,0x4b,0xb8,0x34,0xca,0x30,0x0e,0x9b,0x1e,0xcf,0x06,0x04,0xca,0x7f,0xd9,0xe3,0xf8,0x05,0xb3,0xfb,0xdc,0x19,0x16,0xba,0x02,0x37,0x25,0xfc,0xfa,0x1f,0x5a,0x08,0x69,0x9f,0x6d,0xa3,0x16,0xa5,0xd5,0x7a,0xe7,0x04,0xb8,0x0c,0x34,0x9e,0xdf,0x42,0x75,0x81,0x31,0x0d,0x08,0x9e,0xc1,0x65,0xfd,0x0e,0xeb,0x1c,0x1c,0xfb,0xc9,0x3b,0xb8,0x35,0x94,0x43,0x19,0x4c,0x57,0x9e,0x1b,0x00,0x1a,0x41,0xed,0x23,0xb7,0x14,0x0c,0xff,0xdc,0x54,0x4b,0x0b,0xeb,0x06,0xb5,0x6c,0x4c,0x6a,0xcd,0xc2,0x07,0xea,0x1f,0xd0,0x00,0xf4,0x7f,0xfc,0x10,0x06,0x5c,0x9b,0xe2,0x90,0xfd,0xd1,0x3d,0x1c,0x16,0xb0,0x13,0xbf,0xa0,0xaa,0x0b,0x2f,0x15,0x8d,0xac,0x94,0x56,0x6b,0xf8,0x21,0xfe,0x25,0x0c,0x25,0xa6,0xe9,0x01,0xec,0xb3,0x7f,0xfd,0xa9,0x12,0xc8,0x37,0xff,0x10,0xd9,0x03,0xab,0xc4,0xd4,0xee,0x10,0x41,0x89,0xc9,0x81,0x44,0x48,0xda,0x20,0xd6,0x2e,0xe1,0x11,0x86,0xf0,0xf0,0xf6,0xb2,0x64,0x2a,0xd5,0x94,0x2f,0x01,0xb8,0xe3,0x21,0xe9,0xef,0x09,0x3f,0x41,0xca,0xdf,0xf9,0x0c,0x10,0x1e,0x10,0x68,0xdb,0x7b,0xa6,0x71,0x81,0x05,0xd4,0xb1,0x50,0x20,0xc5,0xb9,0x33,0x21,0xc5,0x27,0x2d,0x49,0x9f,0x30,0x34,0xf6,0x97,0xbc,0x69,0xf7,0xf5,0xc6,0x11,0x01,0xeb,0x81,0x50,0xbf,0x29,0x82,0x72,0xe7,0x33,0x7b,0x87,0xf5,0xf1,0x22,0x11,0xef,0x18,0xd9,0x08,0x17,0xf8,0xd6,0x3e,0x41,0x00,0xfb,0x01,0xba,0x60,0x43,0x57,0xf5,0xf1,0x0f,0x08,0xfb,0xdf,0xf1,0x12,0x7e,0xe9,0x0b,0x0b,0x7f,0x9b,0xe0,0x03,0x4a,0xda,0xf3,0x38,0x53,0x94,0x45,0x35,0x1e,0x9e,0x91,0x23,0xed,0x22,0xcd,0xff,0xf9,0x14,0x9c,0x59,0x81,0x26,0x92,0x6c,0xe9,0x45,0x2d,0x95,0x17,0x0b,0xc8,0xf6,0x39,0xf5,0x4e,0x57,0x54,0x85,0x42,0x2b,0x26,0x86,0x90,0x48,0x73,0x0a,0x81,0x2a,0x18,0xeb,0xcf,0x5b,0xb5,0x60,0xcf,0x57,0xfe,0x51,0x5e,0xca,0xde,0xf6,0x29,0xe9,0xd4,0x1f,0xf7,0xed,0x84,0x7f,0xe9,0x12,0x19,0x59,0x67,0xc8,0xf2,0xe9,0x24,0x0c,0x07,0x1b,0x32,0xd9,0x31,0xee,0x2f,0xc8,0x17,0xfd,0xc2,0x37,0x17,0xf4,0x37,0x18,0xe0,0x2b,0x1c,0xbd,0x81,0x7b,0xd2,0x06,0x06,0x31,0x6c,0xb6,0x11,0xe1,0x23,0x02,0x0c,0xed,0x50,0xd7,0x3e,0xaa,0x66,0x83,0x1a,0xda,0x92,0x7d,0x20,0xd4,0xe9,0x57,0x05,0x15,0xb9,0x22,0x31,0xdd,0xea,0x4b,0x42,0xf8,0xca,0x17,0xd9,0x7f,0x16,0x5c,0xb0,0xac,0xe2,0xf1,0x03,0xef,0xed,0x26,0x6e,0x31,0x28,0xdd,0x37,0xa9,0x17,0xed,0xd0,0x24,0x10,0xdb,0x81,0x6f,0xed,0x13,0x05,0x7e,0x68,0xa2,0xe5,0x17,0x3c,0xf6,0x22,0x26,0x30,0xd0,0x4c,0xc7,0x48,0xaf,0x2b,0xb5,0xc4,0x6d,0x30,0x0e,0xf1,0x47,0xf8,0xf5,0xc7,0x37,0x2f,0xd1,0x0a,0x3b,0x55,0x06,0xd4,0x0e,0xc9,0x6e,0x21,0x6a,0xcd,0xca,0xfe,0xf3,0xe3,0xf0,0xef,0x19,0x7f,0x2d,0x15,0xca,0x3f,0x9c,0x02,0x4c,0xf1,0x2c,0xc2,0x1c,0x17,0xfd,0xee,0x4d,0x4c,0x01,0xfb,0x04,0xa1,0x7f,0x55,0x75,0xbe,0xc1,0x0f,0xf5,0x13,0xd5,0x16,0xf9,0x7b,0x12,0x08,0xfe,0x6e,0x8f,0x07,0x50,0xdd,0x1b,0xb3,0x04,0x05,0xec,0xd8,0x42,0x56,0x0b,0xfa,0x03,0xbe,0x69,0x30,0x74,0xd5,0xd5,0xfd,0xea,0x0e,0xd1,0x13,0x09,0x7f,0x12,0x01,0xfc,0x5a,0x9d,0x09,0xf1,0xb4,0x4e,0x36,0xa7,0xdc,0x55,0xf4,0x08,0xf5,0x10,0x41,0x9c,0x04,0x29,0x27,0x08,0x38,0xec,0x72,0xdb,0x63,0xd0,0x3e,0xbc,0x11,0xad,0xc5,0x7f,0x36,0xe7,0xdc,0xe8,0x29,0xcc,0x29,0xe8,0xe5,0xea,0x08,0x9e,0x9c,0xf4,0x03,0x0d,0x2e,0xa5,0xc7,0xb4,0x18,0x14,0xe2,0xf5,0xf5,0x35,0xe2,0xea,0x81,0x07,0xfa,0xe6,0x91,0x67,0xf1,0x74,0x10,0xf4,0xb4,0xf7,0x06,0xe6,0x1e,0xfd,0x0a,0xf8,0xeb,0x16,0xf3,0x12,0xf3,0x02,0x81,0x96,0xe1,0xe7,0x0d,0x0b,0x00,0x05,0xea,0x16,0x0b,0xdd,0xae,0x0a,0xdb,0x5b,0x1b,0x04,0xda,0x6a,0x60,0xa7,0x23,0x7f,0x57,0xcb,0xbb,0x32,0xfe,0x57,0xcf,0x7f,0xcb,0xc8,0xe1,0x5f,0xc7,0x21,0xc6,0x53,0x47,0x12,0x52,0xe6,0x22,0xb9,0x34,0xf1,0x8c,0x7f,0xe5,0xdf,0xaf,0x39,0xea,0x04,0xe8,0x21,0x39,0x91,0xfc,0x20,0x51,0x08,0x27,0xe1,0x69,0xcf,0x3c,0xe4,0x4a,0xc3,0xea,0xa5,0xa8,0x60,0x21,0x01,0x55,0xfb,0xac,0x7f,0x26,0xc4,0xcf,0x26,0xd2,0xe3,0xe1,0x3f,0x3b,0x9a,0xbb,0x19,0x2f,0x0f,0x24,0x18,0x7c,0xba,0x39,0xb0,0x6e,0xd6,0x08,0xd2,0x90,0x4c,0x10,0xbf,0xa9,0x4f,0x33,0xe5,0xff,0x76,0x3f,0xae,0x2a,0x28,0x0f,0xbb,0xb2,0x6c,0x5c,0x08,0xa1,0xf0,0x81,0xb6,0xbf,0x4d,0xbb,0x56,0xc1,0x58,0x14,0x5b,0x72,0xc1,0xb8,0x18,0x1f,0x99,0x08,0x04,0x2e,0x28,0x3f,0xdf,0xdf,0x13,0x28,0xe4,0xdf,0x10,0xdd,0x2b,0x33,0x28,0x6d,0x57,0xf9,0x3e,0xf2,0xff,0xdc,0x27,0x5b,0xe8,0x16,0xe0,0x7f,0xd5,0x42,0xdf,0xd0,0x2f,0xf2,0xc4,0x9c,0x7a,0xcf,0x2e,0xf0,0x74,0x6d,0xd2,0x07,0x1c,0xf5,0x1e,0x23,0xfd,0x7f,0xc7,0x3c,0xbb,0x7d,0xda,0x27,0xc6,0x9c,0x64,0xeb,0xf0,0x00,0x00,0x00,0x00,0x66,0xc0,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x08,0x22,0x4b,0xdd,0x5b,0xb5,0x45,0xe9,0x81,0xe1,0x32,0xf8,0xee,0x48,0xea,0xe5,0x43,0xb1,0x31,0x24,0xd6,0xf3,0x1e,0xbd,0xee,0xa8,0xee,0x46,0x49,0x25,0x37,0xa6,0x13,0x01,0x02,0xfd,0xe2,0x4f,0x26,0x61,0x02,0xb5,0x33,0x3f,0x49,0xf2,0xca,0xf6,0x14,0xb8,0xfa,0x00,0xd8,0xf3,0x1c,0xc8,0x57,0x45,0x13,0x42,0x4c,0x3a,0xcd,0x40,0xe8,0xcd,0xf1,0x13,0x49,0x3b,0x38,0x0f,0x59,0x09,0x14,0x28,0x44,0x10,0xa6,0x2a,0xea,0x4a,0x4e,0x0a,0xa7,0x04,0x07,0x01,0x65,0x46,0xef,0xc1,0xbe,0x02,0x22,0xf4,0x0a,0x14,0xf5,0xf4,0xfe,0x69,0x06,0x20,0xf8,0xa9,0xff,0xfb,0x10,0x00,0x87,0x10,0x02,0xbd,0x11,0x0b,0x3b,0x0d,0xe8,0x31,0x17,0x7d,0x2e,0xff,0xf8,0xf5,0x05,0x33,0xef,0x03,0x01,0x81,0x31,0xfc,0x0b,0xfe,0x01,0xc4,0x08,0xef,0x0a,0x17,0xbd,0x10,0x02,0x1b,0x02,0xbe,0x47,0x17,0x03,0x45,0x07,0xfe,0xfa,0x00,0x07,0x08,0xb2,0x02,0x10,0x28,0x16,0xfb,0x0c,0x05,0xf9,0x04,0x10,0x12,0xfb,0x10,0xf6,0xe7,0x03,0xff,0x0b,0x05,0xfc,0x1a,0x23,0x90,0x08,0xfb,0x0d,0x04,0xfd,0x33,0x2a,0xd2,0xee,0x17,0xe4,0xeb,0xb7,0x2f,0x91,0x32,0xb5,0x06,0x7f,0x34,0xc1,0x00,0x0e,0xaa,0x25,0x06,0xbb,0x60,0xb9,0xe1,0x38,0x11,0xd3,0x36,0x06,0x3d,0x19,0xd0,0xc2,0xd6,0xb9,0x5f,0x06,0x06,0x04,0x28,0x1a,0xb8,0xd7,0x8f,0xf7,0x57,0xcd,0xbf,0xc0,0x0c,0x41,0x0c,0xe4,0x40,0xfe,0x19,0x28,0x0c,0xe1,0x1a,0xbc,0xca,0xf1,0xbe,0xb3,0xb8,0x46,0xbf,0x0f,0x32,0x03,0xf6,0xa4,0xc7,0xc8,0xf7,0xb3,0xea,0xea,0xe5,0xb0,0xe6,0x54,0xba,0x10,0x99,0xbc,0xe6,0x5f,0x2c,0x08,0xe7,0x9e,0xc9,0x00,0x27,0x4a,0x0b,0xd0,0x24,0x24,0x1d,0x44,0xe5,0x66,0xde,0x40,0xfa,0x81,0xd7,0x2a,0x04,0xf4,0x46,0xe4,0xf7,0x47,0x97,0x3b,0x18,0xc0,0x04,0x29,0xd9,0xf6,0xce,0xec,0x38,0x3d,0x31,0x41,0xb4,0x04,0xfa,0x0f,0xcf,0xe8,0x4d,0x30,0x60,0xf9,0xad,0x30,0x54,0x3d,0x05,0xac,0xf9,0x1b,0xc1,0x07,0xf2,0xd3,0xe4,0x10,0xe4,0x43,0x40,0x22,0x43,0x3f,0x37,0xb2,0x30,0x02,0xc5,0x03,0x12,0x59,0x42,0x40,0xff,0x4f,0x1e,0x1d,0x24,0x3b,0x17,0xb1,0x32,0xf3,0x61,0x41,0x09,0xb4,0xf2,0x06,0x0c,0x5b,0x26,0xfe,0xc2,0xb0,0xe9,0x2a,0xf8,0xf2,0xf6,0x06,0x18,0xf1,0x99,0xe8,0xe9,0x0e,0x56,0xf8,0xf9,0xe1,0xf1,0x6a,0xdd,0xef,0x54,0xfc,0xf3,0xd4,0xfb,0x13,0xd0,0xf9,0x81,0xcd,0x09,0xfb,0xfe,0xfa,0xbd,0x0d,0xf8,0xf3,0x7d,0xcb,0x04,0xef,0xfc,0x01,0x57,0x02,0xff,0xff,0xdd,0x47,0x02,0xfd,0x16,0xf7,0x45,0xba,0xdd,0xfe,0xb7,0xf5,0x01,0x13,0xfd,0xfd,0xf6,0x5f,0xf4,0xe9,0xf7,0xef,0x0b,0x05,0xef,0xf2,0xf9,0xf0,0xea,0x01,0x05,0x01,0x26,0xf8,0xfd,0xd9,0xf2,0x09,0xfa,0xef,0x69,0x00,0x00,0xfc,0x02,0xf4,0xeb,0x02,0x22,0x11,0xde,0xe0,0xf8,0xc8,0xf7,0xb5,0x61,0xd0,0xf6,0x7f,0x04,0xc7,0x0b,0x1d,0xce,0x0b,0x30,0xd3,0x2b,0xc6,0xee,0x14,0x03,0xd3,0x46,0x02,0x74,0x21,0xca,0xc3,0xca,0xca,0x5d,0x18,0x05,0xf9,0x10,0x33,0xba,0xd5,0xac,0xf3,0x0d,0xcc,0xbc,0xc8,0x26,0x18,0xfd,0xea,0x00,0x02,0x0d,0x4b,0x1e,0xeb,0x45,0xd0,0xd7,0xdc,0xd4,0xc9,0xe0,0x15,0xcc,0x05,0xf0,0xf8,0xfb,0xac,0xd2,0xbf,0x09,0xc8,0xef,0xf6,0xe3,0xc4,0xf1,0x6e,0xd8,0x1c,0xba,0xc3,0xe9,0x2b,0x0c,0xf7,0xf1,0xb4,0xd7,0x04,0x04,0x0d,0x0a,0xdb,0x33,0xe7,0xe0,0xd2,0x04,0xab,0x45,0xc7,0xf9,0x7f,0x0d,0xcf,0x05,0x0e,0xc3,0x12,0x17,0xc3,0x36,0xd2,0xd7,0x0a,0x09,0xe7,0x35,0x14,0x59,0x18,0xcd,0xba,0xdf,0xc8,0x59,0x09,0xfc,0x04,0x1d,0x1e,0xbb,0xd0,0xa6,0x07,0x1b,0xdc,0xc9,0xd3,0x0a,0x25,0x03,0xeb,0x09,0x05,0x06,0x40,0x16,0xec,0x24,0xbc,0xc9,0xe6,0xd0,0xc9,0xd0,0x1a,0xd1,0x08,0xff,0x00,0xf6,0xb1,0xd0,0xc1,0x04,0xcb,0xdf,0xf2,0xe8,0xca,0xf7,0x58,0xdf,0x19,0xb2,0xcd,0xea,0x28,0x19,0xff,0xef,0xac,0xce,0x05,0x16,0x18,0x07,0xe1,0x28,0x1b,0x16,0x2e,0x03,0x4f,0xcb,0x43,0xfe,0x81,0xf1,0x32,0x06,0xf8,0x44,0xf5,0xec,0x34,0xc1,0x33,0x23,0xf3,0xee,0x17,0xcb,0xeb,0xb0,0xec,0x31,0x3b,0x2b,0x2e,0xa6,0xf6,0xf6,0xf8,0xf0,0xd9,0x43,0x2e,0x4f,0xf9,0xe4,0x26,0x2f,0x2a,0xf9,0xe6,0xfa,0x14,0xec,0xfb,0xfb,0xc9,0xec,0x17,0xdc,0x41,0x2e,0x1d,0x32,0x36,0x2c,0xe0,0x38,0xf9,0xf7,0x01,0x15,0x53,0x2f,0x34,0x02,0x32,0x21,0x16,0x19,0x3a,0x0a,0xb3,0x27,0xe7,0x4f,0x33,0x16,0xcc,0xe9,0xf7,0x0b,0x53,0x32,0xed,0xea,0xd8,0xf9,0x1a,0xe5,0xdc,0xf2,0xac,0x26,0x88,0x4a,0xa6,0x1f,0x7f,0x2d,0xd1,0x0b,0x15,0x9a,0x18,0x12,0xba,0x77,0xbe,0xe1,0x4d,0x10,0xc0,0x45,0x04,0x3a,0x0e,0xd1,0xb9,0xdc,0xb3,0x5d,0xec,0x0b,0x0e,0x04,0x19,0x9b,0xe1,0xa7,0x0d,0x52,0xcf,0xaf,0xc3,0x0d,0x47,0xf7,0xec,0x69,0xff,0x10,0x1c,0x0f,0x00,0x33,0xb4,0xa9,0xed,0xd1,0xc6,0xd0,0x36,0xbb,0xfb,0x54,0x08,0xe1,0x9e,0xc6,0xbc,0xfe,0xa0,0xe1,0xee,0xeb,0xb2,0xe9,0x4f,0xbe,0xff,0xa7,0xb8,0xf8,0x70,0xf4,0x05,0xfa,0xa6,0xc6,0xf2,0x4d,0x73,0x1d,0xcb,0x03,0xfd,0xfd,0xfd,0xe6,0xfb,0x5b,0xfa,0xf5,0x0e,0xbb,0x01,0x0a,0x1d,0xfe,0xc4,0x39,0xf9,0xbc,0x01,0xfa,0xff,0xf6,0xf9,0x42,0xf9,0x7f,0x2b,0x0c,0xf7,0xfd,0x05,0x36,0x08,0x01,0xf5,0xc9,0x2e,0xfd,0x13,0xfd,0x02,0xb0,0xf7,0xf6,0xff,0x12,0xc3,0xf8,0x01,0xbc,0xfa,0xe0,0x5c,0x27,0x08,0x39,0x02,0xfa,0xf9,0xf6,0x09,0x02,0xbb,0x00,0xef,0xd5,0xf8,0xf8,0xfd,0x00,0x0a,0x06,0x00,0xff,0xf6,0x07,0xf3,0xf6,0x30,0x05,0x20,0xff,0xf9,0x09,0xf1,0xd5,0x03,0x08,0xf8,0xfd,0x00,0xef,0xd0,0xf2,0xf9,0x36,0xfc,0x08,0xf2,0xe3,0xec,0x64,0xf7,0xff,0x0d,0xc9,0x06,0xf7,0x1a,0xfe,0xbf,0x2f,0xfe,0xc0,0x0a,0x05,0xf6,0x02,0xfd,0x35,0xf9,0x7f,0x21,0x0d,0x05,0x07,0xfb,0x3b,0x0b,0x00,0xfc,0xc8,0x3c,0x0c,0x0f,0xfb,0x03,0xa9,0x02,0xed,0x0a,0x24,0xbe,0xfe,0xf9,0xbb,0xf5,0xe3,0x57,0x23,0xff,0x30,0x04,0xfa,0xed,0xfe,0xfe,0xfc,0xc1,0x02,0xee,0xca,0x05,0x04,0xfd,0x02,0xff,0x01,0x03,0xf8,0xf6,0x08,0xec,0xed,0x2d,0xf6,0x1f,0xf8,0x07,0xf9,0xe8,0xd2,0xf1,0x02,0xf3,0x0d,0x06,0xf0,0xd0,0xfe,0x03,0x31,0x1a,0x18,0x32,0xf5,0x52,0xcd,0x46,0xfb,0x81,0xd9,0x31,0x03,0xf6,0x40,0xdc,0xe7,0x41,0xbd,0x35,0x25,0xe9,0xf4,0x1b,0xcd,0xee,0xc3,0xea,0x34,0x47,0x24,0x31,0xac,0xfa,0xfe,0xf8,0xdf,0xe1,0x45,0x2e,0x61,0x01,0xd2,0x28,0x3b,0x30,0xfa,0xd4,0xf7,0x0e,0xe6,0xf8,0xf5,0xd9,0xe8,0x17,0xe2,0x46,0x39,0x16,0x35,0x35,0x3a,0xce,0x33,0xf7,0xf5,0x06,0x12,0x55,0x3f,0x3f,0xfc,0x39,0x1e,0x19,0x26,0x30,0x06,0xad,0x30,0xf2,0x50,0x31,0x15,0xcf,0xdf,0xfb,0x06,0x4d,0x27,0xf2,0xe2,0xcd,0xeb,0x1a,0xe7,0x14,0x13,0x36,0xff,0x51,0xb1,0x40,0xfa,0x81,0xeb,0x32,0x07,0xea,0x3c,0xf6,0xe4,0x36,0xca,0x30,0x2a,0xed,0xef,0x25,0xc7,0xe9,0x9c,0xe1,0x33,0x45,0x24,0x38,0x9e,0xfc,0x04,0xf8,0xf5,0xce,0x41,0x1e,0x57,0x01,0xe6,0x23,0x33,0x33,0xe9,0xee,0x02,0x12,0xf3,0xfd,0x04,0xbf,0xe6,0x0a,0xcd,0x3c,0x2d,0x1c,0x31,0x3b,0x2e,0xed,0x30,0xfa,0x03,0x04,0x14,0x4e,0x33,0x3b,0xf7,0x2e,0x1f,0x0f,0x1c,0x31,0x18,0xa7,0x2a,0xed,0x53,0x29,0x13,0xdb,0xf5,0xf9,0x10,0x4b,0x2c,0xfa,0xed,0xe2,0xfd,0x21,0xda,0xf2,0xe3,0xd0,0x0c,0xab,0x52,0xbe,0x05,0x7f,0x18,0xc5,0x08,0x09,0xbc,0x0a,0x22,0xc9,0x43,0xc4,0xe7,0x18,0x0f,0xe0,0x41,0x0e,0x5a,0x1c,0xcc,0xb7,0xd4,0xcd,0x63,0x01,0x04,0x06,0x10,0x2a,0xbd,0xce,0xa6,0xf9,0x1d,0xcb,0xb8,0xd1,0x19,0x21,0xf9,0xe8,0x12,0x00,0x02,0x4b,0x1e,0xeb,0x34,0xbe,0xc3,0xe1,0xd2,0xc7,0xc4,0x24,0xd0,0x07,0x0a,0x04,0xef,0xa3,0xcd,0xc3,0x0a,0xc0,0xe5,0xef,0xdd,0xcc,0xee,0x54,0xcf,0x1a,0xa7,0xc3,0xee,0x38,0x13,0xfa,0xec,0xaf,0xd1,0x12,0x18,0x33,0x0f,0xdc,0x23,0xfb,0xfd,0xd7,0x32,0xcb,0xbf,0xdb,0x1c,0x39,0x4e,0xec,0x01,0xe4,0xe6,0x44,0xcf,0xde,0x7f,0xed,0x01,0x1a,0xf8,0xeb,0xda,0xff,0xa5,0xe0,0xf9,0xd7,0xde,0xf0,0xf8,0xee,0xf6,0x04,0x40,0xc5,0xe0,0xf7,0xe4,0x06,0x7d,0xde,0xe9,0xd8,0xd1,0x62,0x06,0xfa,0x5e,0x03,0x36,0xbe,0xdb,0xf1,0xde,0xdb,0xdf,0xf7,0xe5,0xe8,0xe2,0x5a,0xe9,0x0d,0x3d,0x01,0xf3,0xd9,0xe7,0xd9,0xf4,0xce,0xf7,0xf3,0xf5,0xf6,0x25,0xf9,0xe9,0xd8,0xd8,0xd4,0xed,0x45,0x36,0xfc,0x00,0xe1,0xe9,0xfb,0x2e,0x60,0x20,0xee,0xe5,0x07,0xfd,0x07,0xec,0x04,0x67,0x01,0xfd,0x02,0xbd,0xff,0x05,0x16,0x0c,0xbd,0x24,0xfd,0xab,0x08,0xf7,0xfa,0x08,0xfe,0x32,0x00,0x7f,0x27,0x04,0x08,0x0b,0xfe,0x33,0x08,0xff,0x02,0xc5,0x39,0x06,0x0b,0x07,0x03,0xa4,0x01,0x06,0x0e,0x18,0xb7,0xff,0xf9,0xb0,0xff,0xd9,0x50,0x2c,0x00,0x31,0x06,0x05,0xfa,0x04,0x04,0x07,0xb6,0x09,0x05,0xcd,0xf6,0x03,0xfc,0x02,0x09,0xfd,0x12,0x06,0xf9,0xfb,0xf4,0xea,0x26,0x06,0x1e,0xfd,0x03,0x07,0xe9,0xd6,0x09,0x01,0x00,0xfa,0xfa,0xf1,0xc9,0xf6,0xfb,0x2a,0x0d,0x08,0x31,0xdc,0x41,0x21,0x26,0xe4,0xb7,0xd1,0x34,0x02,0x13,0x35,0xde,0x1c,0x36,0x92,0x2d,0x0d,0xbe,0x08,0x14,0x05,0xf3,0x29,0x02,0x2c,0x3d,0x27,0x20,0xd1,0x0d,0x00,0xfb,0xda,0x11,0x29,0x24,0x41,0x02,0x8a,0x15,0x2c,0x30,0x13,0xa9,0x09,0x10,0x81,0x0d,0xdc,0x17,0x18,0xfd,0x17,0x21,0x24,0x00,0x2a,0x35,0x1f,0xaf,0x2b,0xeb,0xac,0xe5,0x0f,0x34,0x2a,0x36,0x02,0x2f,0x15,0x0b,0x14,0x2b,0xf1,0xe0,0x2a,0x20,0x3d,0x24,0xfa,0xa2,0xe3,0xfb,0x04,0x3b,0x23,0xf5,0xbd,0x8e,0xff,0x1b,0x1e,0x00,0xfe,0xfc,0xe9,0x05,0x67,0x06,0xfd,0x09,0xbe,0x01,0x05,0x1c,0x0a,0xc5,0x2a,0xfd,0xb5,0xfc,0x03,0xf6,0xfa,0xfd,0x3f,0xfb,0x7f,0x23,0x0b,0xfa,0xff,0x0b,0x30,0x08,0xfb,0xf7,0xc9,0x38,0x0b,0x0d,0xf7,0x00,0xa5,0xf9,0x04,0x0c,0x18,0xbf,0x08,0xfd,0xac,0xff,0xd8,0x4f,0x25,0x04,0x38,0x0a,0x02,0xf5,0x05,0xff,0xfd,0xaf,0x05,0xfe,0xc3,0xfe,0x02,0xfd,0x04,0x04,0x03,0x09,0x03,0x03,0x05,0xf0,0xf1,0x24,0x05,0x28,0x01,0x07,0x04,0xe1,0xd9,0x00,0xfa,0xfc,0x06,0xfa,0xe7,0xc8,0x00,0xfd,0x2c,0xf0,0xf1,0x0d,0xfd,0xfb,0xb2,0xf5,0xe7,0x0b,0x49,0x03,0x02,0xeb,0xf1,0x70,0xef,0xfc,0x34,0xf3,0xe5,0xbc,0xf1,0x0a,0xd8,0xf0,0x9b,0xe2,0x07,0x02,0x09,0xec,0xc9,0x1d,0xf9,0xef,0x7f,0xd0,0x04,0xfe,0xee,0xf4,0x39,0x03,0x03,0x05,0xf0,0x3a,0xf9,0x0a,0xd5,0xfe,0x3c,0xc1,0xe0,0x06,0xc8,0xfe,0x03,0x13,0x08,0x08,0xfa,0x45,0xfa,0xf0,0xc0,0xf3,0xfc,0xfa,0xfa,0x0f,0x07,0xf6,0xec,0x02,0xf1,0x18,0x0c,0x0e,0x0a,0xe8,0xf8,0x00,0xf2,0xd7,0x7c,0xf2,0xf6,0xec,0xf9,0x00,0xcd,0xcb,0x32,0x17,0xf7,0xef,0xf8,0x10,0x0e,0x08,0xa5,0xfa,0xf0,0x0d,0x5e,0xf7,0x04,0xe2,0x06,0x7f,0xf5,0xfa,0x39,0xfa,0xf3,0xbe,0xed,0x17,0xd4,0xed,0x83,0xcf,0x00,0xf6,0x03,0xf3,0xb9,0x16,0xfe,0xf1,0x7b,0xd4,0xfc,0xe8,0xfc,0xf4,0x3e,0xf9,0x0f,0xf3,0xf1,0x40,0xf9,0x05,0xe9,0x01,0x42,0xbd,0xe6,0xf9,0xb9,0xf8,0x0d,0x0a,0xfb,0x02,0xf7,0x54,0xf8,0xf4,0xe0,0xed,0xf5,0x00,0xff,0x08,0x0b,0xff,0xef,0x0a,0xf2,0x14,0x12,0xf3,0xfb,0xf5,0x0a,0xf9,0xf9,0xde,0x74,0xf4,0x04,0xfa,0xf7,0xff,0xd5,0xc8,0x34,0x09,0xee,0x17,0x0e,0x51,0xe4,0x76,0xba,0x4b,0xfb,0x81,0xe7,0x36,0xf6,0xeb,0x56,0xe8,0xea,0x3e,0xa7,0x3c,0x19,0xd9,0xf4,0x20,0xc1,0xfa,0xac,0xe8,0x3e,0x52,0x38,0x3f,0x97,0xf5,0xfc,0x08,0xf2,0xdb,0x45,0x2b,0x62,0x07,0xc8,0x2e,0x4f,0x38,0xe9,0xce,0xfc,0x24,0xc7,0x04,0xf0,0xbf,0xe2,0x0f,0xd1,0x4f,0x3b,0x14,0x43,0x42,0x37,0xc6,0x42,0x06,0xde,0xf3,0x1b,0x58,0x34,0x3f,0xfa,0x49,0x24,0x1c,0x12,0x4f,0x20,0x98,0x35,0xe6,0x68,0x43,0x18,0xb0,0xf8,0x07,0x10,0x68,0x2b,0xf2,0xc5,0xb0,0xf7,0x23,0xdb,0xf7,0xe1,0xc5,0x08,0xb6,0x23,0xcc,0xf5,0x7f,0x31,0xd5,0xfb,0xfa,0xbf,0x41,0x13,0xc4,0x57,0xd6,0xdc,0xf8,0xfe,0xed,0x2a,0xfe,0x3e,0xfd,0xda,0xc5,0xe4,0xcd,0x3e,0x04,0xf2,0xfa,0x4d,0x19,0xd0,0xdc,0xa2,0xfb,0x24,0xd0,0xc2,0xca,0x04,0x37,0x01,0xf2,0xfb,0xfb,0x31,0x2c,0x0c,0xf0,0x16,0xba,0xd7,0xe9,0xc9,0xcc,0xd6,0x2d,0xce,0xfd,0xf1,0xfa,0xf7,0xaf,0xcb,0xc8,0x00,0xce,0xed,0xef,0xe2,0xc4,0xfc,0x5c,0xdd,0x17,0xc1,0xce,0xf6,0x20,0x3e,0x01,0xf2,0xad,0xdc,0x0c,0x0e,0x08,0x2c,0xe7,0x18,0x18,0x1f,0x42,0xe7,0x56,0xba,0x44,0xf1,0x81,0xe2,0x3c,0x01,0xf8,0x42,0xd5,0xe8,0x40,0xb1,0x39,0x20,0xed,0xfe,0x26,0xcf,0xf3,0xbf,0xea,0x33,0x47,0x2c,0x3f,0xa6,0xf6,0xfc,0x03,0xcd,0xd8,0x41,0x28,0x62,0xfe,0xc9,0x26,0x41,0x3b,0x00,0xcc,0xf7,0x14,0xe5,0xfe,0xe1,0xd6,0xed,0x08,0xd9,0x44,0x2d,0x11,0x35,0x40,0x3b,0xc7,0x39,0x04,0xf3,0x03,0x0f,0x53,0x30,0x41,0xfd,0x3d,0x1a,0x0d,0x25,0x41,0x0a,0xb6,0x3b,0xf0,0x56,0x3c,0x12,0xc7,0xd4,0xfa,0x19,0x4e,0x2b,0x02,0xe1,0xd3,0xe3,0x1c,0xed,0xe1,0xee,0xbf,0x2e,0x8d,0x17,0xae,0x13,0x7f,0x36,0xcd,0xf6,0xfa,0xb5,0x43,0x0b,0xcd,0x74,0xcd,0xea,0x36,0x10,0xdf,0x1e,0x12,0x19,0x05,0xd3,0xbd,0xcb,0xbe,0x4f,0xee,0xf7,0x06,0x3f,0x08,0xc4,0xc9,0xa6,0xfe,0x5f,0xcd,0xbc,0xc6,0x01,0x64,0x06,0xf4,0x4e,0xfb,0x22,0x0f,0xfb,0xe8,0x0c,0xaf,0xc2,0xeb,0xc2,0xba,0xc2,0x46,0xc8,0x0a,0x2a,0x0c,0xfd,0xa5,0xca,0xc1,0x09,0xc6,0xdf,0xed,0xe0,0xb9,0xf6,0x3a,0xc2,0xfc,0xa4,0xc3,0xe5,0x4e,0x2f,0xf6,0xf4,0xa6,0xc7,0x01,0x35,0x5a,0x27,0xdb,0x08,0x1d,0x1b,0x3f,0xf0,0x62,0xc3,0x3e,0xff,0x81,0xd4,0x30,0xfd,0xf6,0x3f,0xe4,0xe8,0x3a,0xb4,0x36,0x1f,0xe7,0xf7,0x1e,0xd1,0xef,0xae,0xf4,0x2a,0x48,0x2b,0x38,0xa4,0xfb,0x04,0xfc,0xd9,0xe1,0x3f,0x29,0x5b,0xfc,0xd2,0x2d,0x3d,0x36,0xf8,0xc9,0x04,0x1c,0xe8,0x03,0xe9,0xbe,0xe1,0x13,0xdc,0x4b,0x35,0x1b,0x34,0x3c,0x3c,0xd8,0x38,0x05,0xf1,0x09,0x18,0x5b,0x3e,0x3f,0x05,0x43,0x20,0x1a,0x21,0x3b,0x0a,0xb0,0x34,0xed,0x58,0x32,0x13,0xc9,0xd7,0x09,0x0a,0x5d,0x2f,0xf4,0xe3,0xd8,0xe6,0x1f,0xe4,0xe8,0xe7,0xc8,0x13,0x99,0x4c,0xc3,0xfd,0x7f,0x1e,0xc5,0x09,0x07,0xb4,0x0f,0x1c,0xcc,0x3f,0xc7,0xd4,0x1c,0x10,0xd8,0x35,0x0c,0x59,0x11,0xcc,0xb6,0xcc,0xcf,0x64,0x04,0x01,0x01,0x25,0x26,0xc6,0xd5,0xa2,0x08,0x2d,0xd8,0xc8,0xca,0x18,0x2f,0x00,0xf4,0x12,0xfa,0x15,0x48,0x28,0xf8,0x2b,0xc2,0xd1,0xdd,0xc8,0xc5,0xcb,0x1e,0xd3,0x09,0x0e,0x07,0xe7,0xa6,0xc1,0xc1,0xfe,0xc0,0xe8,0xe5,0xd9,0xc9,0xe9,0x56,0xca,0x20,0xa4,0xc5,0xea,0x2f,0x1e,0xf6,0xef,0xa9,0xd5,0x02,0x12,0x21,0x16,0xd9,0x2d,0x02,0xfe,0x0b,0xde,0xfe,0x69,0x03,0xf4,0x0a,0xc9,0x01,0xfd,0x11,0x0b,0xcc,0x31,0x01,0xab,0x0b,0xfa,0xe6,0xfe,0xf8,0x37,0xf9,0x7f,0x1d,0x07,0x0a,0x05,0x03,0x34,0x0d,0xf6,0xfa,0xdb,0x3e,0x0e,0x06,0x00,0xf4,0x9b,0xfd,0xfc,0x0c,0x19,0xb0,0xff,0x07,0x97,0xfe,0xde,0x61,0x2e,0xf7,0x33,0x02,0x0c,0xf6,0x0a,0x03,0x04,0xab,0x04,0xfe,0xa7,0xf3,0xfb,0xfb,0x07,0x02,0x02,0x10,0x05,0xfe,0x00,0xf5,0xe9,0x32,0x07,0x23,0x04,0x08,0xf7,0xe1,0xec,0xfb,0xfa,0xf6,0xfb,0x05,0xde,0xb4,0x00,0x08,0x33,0xf9,0xec,0xb2,0x0b,0x9b,0x67,0xb5,0x06,0x71,0xfa,0xda,0xfa,0x26,0xc2,0xed,0x1d,0xb9,0x2e,0xc5,0xf4,0x2e,0x09,0xdf,0x50,0x15,0x7f,0x33,0xd5,0xb1,0xce,0xc3,0x70,0x0a,0x08,0xf7,0xf4,0x34,0xc2,0xd7,0xab,0x02,0x1b,0xd6,0xc1,0xc3,0x11,0x1e,0x06,0xef,0x39,0xfb,0xf5,0x4a,0x2e,0xf1,0x50,0xb9,0xc4,0xe9,0xc2,0xc3,0xdc,0x15,0xd4,0xf9,0x2b,0x03,0xf5,0xb2,0xc0,0xc6,0x0b,0xc4,0xdf,0xf7,0xfb,0xb1,0xd8,0x67,0xb9,0x16,0xa5,0xc5,0xe7,0x49,0xe9,0xf9,0xe8,0xb5,0xd5,0x03,0x39,0x3b,0x00,0xe5,0x28,0xeb,0xe6,0xc4,0x06,0xaa,0x52,0xc1,0x09,0x7f,0x17,0xcc,0x01,0x0d,0xbe,0x17,0x15,0xd0,0x3b,0xc7,0xdc,0x11,0x0b,0xe3,0x44,0x0e,0x64,0x1f,0xca,0xbf,0xd5,0xc9,0x59,0x01,0x03,0x07,0x10,0x2d,0xc5,0xd6,0xa2,0xff,0x29,0xd1,0xc3,0xc9,0x10,0x26,0xfd,0xe3,0x0a,0x05,0x05,0x4e,0x1a,0xf2,0x38,0xbb,0xcf,0xe4,0xc9,0xcf,0xc8,0x23,0xc5,0x01,0xff,0xfb,0xed,0xae,0xc8,0xc3,0xff,0xbd,0xe0,0xf6,0xdd,0xbe,0xe6,0x64,0xd7,0x14,0xab,0xc3,0xee,0x38,0x1b,0x07,0xed,0xad,0xd6,0xff,0x13,0x1e,0x04,0xe0,0x1e,0x18,0x19,0x40,0xee,0x6a,0xb0,0x46,0xfe,0x81,0xee,0x37,0xfb,0xf5,0x48,0xe9,0xdc,0x34,0xc0,0x34,0x24,0xd9,0xf2,0x22,0xc8,0xef,0xa1,0xe2,0x2f,0x42,0x2a,0x3b,0xa2,0x00,0xfa,0x00,0xee,0xd5,0x49,0x2f,0x65,0xfc,0xd5,0x30,0x43,0x35,0xf7,0xdc,0x02,0x1f,0xe6,0x03,0xf3,0xbd,0xde,0x15,0xd5,0x45,0x38,0x19,0x32,0x40,0x31,0xde,0x3c,0xfb,0xe7,0xfe,0x12,0x5c,0x3d,0x38,0xf6,0x45,0x1a,0x0f,0x17,0x38,0x15,0xa4,0x2c,0xe7,0x54,0x39,0x14,0xbf,0xf0,0xfb,0x15,0x5d,0x26,0xfa,0xe3,0xc8,0xfc,0x20,0xde,0xf9,0xf5,0x09,0xe2,0x01,0x55,0xff,0xeb,0x0f,0xe2,0x0d,0x02,0x10,0x09,0xef,0x31,0x08,0xb0,0x01,0xf9,0xde,0xf4,0xfe,0x26,0xff,0x66,0x0f,0x00,0x0c,0x0c,0x04,0x25,0x17,0xf9,0xf8,0x06,0x2d,0x09,0x09,0xf7,0xf5,0xa6,0xff,0x06,0x0a,0x17,0xbd,0xf8,0x0b,0x81,0xfe,0xf0,0x4a,0x21,0x07,0x25,0x05,0x01,0xf6,0x05,0x0b,0xfc,0xc4,0x0d,0xec,0x91,0xf3,0xfd,0x00,0xff,0x13,0xff,0x08,0xf8,0x02,0x04,0x02,0xfd,0x2c,0x0e,0x20,0xf6,0x12,0xfc,0xc4,0x18,0xf7,0x02,0xfb,0x09,0xf6,0xc1,0x9c,0x1b,0x03,0x2a,0xfe,0xfe,0x00,0x18,0xfa,0x96,0xf2,0x09,0xfd,0x3f,0xf7,0x0b,0xe4,0xeb,0x35,0xd6,0x01,0x57,0x03,0xff,0x12,0x09,0xff,0xc6,0xfe,0x81,0xd9,0xf9,0xf4,0xfb,0xf8,0xc9,0xee,0xfa,0x02,0x37,0xcf,0xf7,0xf3,0x01,0x01,0x6b,0x01,0x06,0xfd,0xe4,0x4a,0xfc,0x04,0x62,0xf7,0x24,0xa3,0xd4,0x00,0xbc,0xf0,0xf8,0x0a,0xfa,0xff,0x01,0x59,0xf9,0x08,0x4c,0x03,0xfc,0xfd,0x00,0x02,0x04,0xf5,0x04,0x08,0xfe,0xfd,0x18,0xd8,0xf5,0xe4,0x0b,0xf1,0x03,0x22,0x22,0xff,0x05,0xfb,0x00,0x02,0x26,0x4e,0x04,0xfc,0xd0,0x00,0x00,0x00,0x00,0x76,0xcc,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x21,0xc8,0xea,0xae,0x08,0xff,0x0b,0xd0,0xa3,0xe0,0x1c,0x04,0x7f,0xa8,0xc0,0x04,0xea,0xec,0xd4,0x8e,0x67,0xbf,0xe2,0x0f,0xdc,0xb3,0x48,0x23,0x7b,0xa1,0x81,0xd0,0x1b,0xd0,0x47,0x19,0x87,0x05,0x35,0x4a,0x4b,0x1e,0xe2,0x10,0xb8,0x5a,0x7f,0xff,0xd0,0x60,0xfb,0xdb,0x2a,0x1f,0xd1,0x81,0xd6,0x15,0x1c,0x17,0x1c,0xba,0xef,0x12,0xc4,0xf7,0xdb,0x7f,0xe3,0x1e,0x31,0xc9,0xc2,0x45,0xad,0xcc,0xbb,0x2a,0x27,0x1d,0x0a,0xbc,0xb2,0x44,0x52,0xbf,0x61,0x7f,0xee,0xc3,0xf1,0x0c,0x05,0x32,0xbf,0xe0,0xd4,0x2b,0x72,0x11,0x81,0x2f,0xbf,0xb0,0x27,0x4e,0x0e,0x0a,0xa6,0x0b,0x5f,0x06,0x1b,0xd4,0xf1,0x81,0x2c,0xfb,0x84,0x01,0x10,0x07,0x01,0x14,0x13,0x0a,0x08,0x57,0xdb,0xe2,0xc7,0xa1,0x4e,0xe2,0x81,0xd2,0x06,0xe8,0x2e,0x4c,0xfc,0xe6,0xd8,0xe9,0x39,0xd1,0x81,0x58,0x71,0xb4,0x4d,0x56,0xe1,0xb7,0xe1,0xce,0x0e,0x14,0xa2,0xd5,0x1e,0x21,0x7f,0x08,0x85,0x38,0x98,0xd1,0x3a,0x2d,0x46,0xff,0xdf,0xc5,0x7b,0xfd,0xf0,0xe5,0x8e,0x09,0xe3,0x14,0x39,0xd0,0x12,0x37,0x81,0x2c,0xeb,0x5d,0xd2,0xf2,0xc2,0x50,0xe7,0xea,0x2f,0x1b,0xd6,0x81,0xc8,0x11,0x1c,0x0d,0x21,0xbe,0xda,0x15,0xef,0x42,0x7f,0xf0,0x94,0x53,0xa9,0xcc,0x3f,0x2f,0x24,0x0e,0xc4,0x09,0x6b,0x2c,0x34,0xf9,0xa6,0x7f,0x2d,0xb9,0x62,0x56,0x00,0xe2,0xdc,0xc8,0xfe,0x0f,0xb8,0xe5,0xde,0xe6,0xe3,0x93,0x3a,0xfe,0x81,0xb6,0xe0,0xfd,0x00,0x1b,0x17,0x04,0x02,0x3c,0x22,0xe4,0x56,0x33,0x81,0x09,0x32,0x3c,0x62,0x2f,0xc0,0xe6,0xd6,0x15,0x51,0x0f,0xec,0xd2,0x93,0x5b,0x7f,0xbb,0x7b,0x6d,0xe5,0xbb,0x0b,0x00,0x12,0xef,0xa7,0xb4,0xda,0x17,0xef,0x6f,0x89,0x48,0x28,0x81,0xb7,0x6c,0xec,0xdb,0x9a,0xee,0x7b,0x13,0xfb,0x0b,0xf6,0xbe,0x45,0xe7,0x37,0x48,0xd9,0xaf,0x43,0x47,0x7f,0xcc,0x9e,0xbe,0xdc,0xa1,0x1a,0x90,0x22,0x0f,0xdf,0x77,0x05,0xc4,0x4b,0x7f,0x1d,0x1a,0xdb,0xe9,0xe5,0xdc,0x6c,0x81,0xcc,0x4b,0x0f,0x0d,0x54,0x0e,0x0b,0x4c,0xf8,0x11,0x23,0x19,0xe6,0xa1,0x5c,0x81,0xd3,0x40,0xa9,0xce,0x42,0x10,0xed,0x6f,0x0a,0x27,0x73,0x4e,0x11,0xd5,0xa3,0x56,0x66,0xbe,0x53,0x7f,0xef,0xbf,0xec,0xd7,0xfd,0x0f,0xbb,0xc8,0x15,0x07,0x79,0x81,0xc1,0x4a,0x0a,0x12,0x4d,0x1f,0xfa,0x53,0xfb,0xf1,0x07,0x30,0x11,0xb8,0xc1,0x4f,0x2f,0xd0,0x63,0x7f,0x03,0xd9,0xdc,0xf0,0xe4,0x37,0xd2,0xe5,0xdf,0x21,0xf9,0xbf,0x2d,0x09,0xa1,0x81,0xdb,0x08,0x09,0xf7,0x1e,0xe2,0xee,0x29,0xea,0xe6,0x7f,0x01,0x9d,0x20,0xfd,0x16,0x22,0x31,0xf0,0xee,0xbc,0x24,0x67,0x25,0xf4,0x3f,0x7f,0xe3,0x92,0x37,0xba,0xce,0x60,0x3c,0x03,0x20,0xc5,0xf0,0x59,0x20,0x2b,0xc2,0x7f,0x02,0x89,0x11,0x33,0x37,0x50,0x29,0xe7,0x2b,0xd7,0x42,0x6c,0xf0,0xe4,0x8f,0xe1,0x7e,0x8e,0x63,0xfe,0xd0,0xb6,0x78,0xb2,0xa9,0xa6,0x27,0x7f,0x43,0xfa,0xec,0xa5,0x7f,0x4d,0xd2,0x71,0x48,0x0e,0xf9,0xc3,0xdb,0xc9,0x2c,0xdc,0xe7,0x1d,0xdf,0xc2,0x81,0x3b,0xdc,0x8f,0xcc,0xe0,0x19,0x40,0x56,0xf6,0xd7,0x11,0x09,0x35,0xae,0xee,0x81,0x15,0xf0,0xb4,0x0f,0x2e,0xe7,0x3d,0x38,0x32,0xd9,0xe7,0x04,0xa9,0xf5,0x16,0x2d,0xb6,0x28,0x1c,0xc2,0x12,0xfc,0xc9,0x21,0xb9,0x7f,0x4d,0x2f,0xde,0x12,0xdc,0x85,0x40,0xfe,0x88,0x81,0xcc,0xf0,0x1a,0x16,0x34,0xe7,0xdf,0x2b,0xd3,0x33,0xde,0xbc,0x36,0x01,0xa3,0x81,0xd4,0x0b,0xf6,0x10,0x0f,0xe6,0xe0,0x34,0xf7,0x29,0x7f,0xd4,0xb3,0x3b,0xc6,0xdf,0x36,0x2a,0x11,0x07,0xe1,0x00,0x5a,0x1c,0xeb,0xbf,0x53,0xc4,0x85,0x3b,0x81,0xdd,0xf9,0x3c,0x35,0x07,0xcd,0x24,0x6e,0x08,0x28,0x40,0x6a,0x4c,0x81,0x2c,0x2c,0x2b,0x4f,0x38,0xf5,0xd9,0xa8,0x03,0x6a,0xe1,0xff,0x81,0xf6,0x90,0x30,0x14,0xe3,0x24,0x01,0x04,0x34,0x2c,0x24,0x1b,0xe1,0x3d,0x05,0xcf,0x90,0x46,0x65,0xc1,0x6d,0x7f,0xf2,0xc8,0x05,0x08,0x0c,0x0e,0xa9,0xbb,0xf2,0xf8,0xd7,0x72,0x81,0x25,0x37,0xe8,0xd5,0x6a,0xaf,0xbb,0xa5,0x0a,0x65,0xee,0xe6,0x22,0x48,0x13,0x81,0x1c,0x13,0xe1,0x2c,0x33,0x24,0x3b,0xd0,0x1e,0x7e,0xee,0xe1,0xd8,0x5c,0xf4,0xa2,0x39,0x81,0xb7,0x1a,0x4f,0x1d,0x17,0xb0,0x23,0x77,0x21,0x18,0xd0,0xcb,0x57,0x07,0xd6,0x7f,0x5e,0x19,0xea,0xca,0xda,0xdc,0x2c,0x02,0xf8,0x20,0xa9,0x81,0x27,0x7e,0xae,0x2b,0x6a,0xde,0xae,0x03,0x07,0x30,0xfd,0x9b,0xcb,0xfe,0xa7,0x62,0x81,0xd9,0x4a,0x13,0xe8,0x2e,0x4c,0x06,0x6b,0xbd,0x09,0x4d,0x21,0xfe,0xbb,0xc9,0x99,0x09,0x08,0x0a,0xc4,0x81,0xf5,0x21,0x1c,0x69,0xa7,0xd5,0xf0,0x42,0x27,0xb4,0x7f,0x2b,0xc2,0x77,0x12,0xf3,0xe5,0xc2,0x93,0xf1,0x09,0xc5,0xf2,0xaa,0xb4,0x7f,0xa8,0x05,0xe2,0xd5,0x0b,0x03,0x55,0x1d,0x1d,0xbf,0x01,0x3a,0x61,0x1c,0x0f,0xd9,0x7f,0xfb,0xfc,0x68,0x25,0xf8,0x0e,0xc8,0xc3,0xe6,0x10,0xf8,0xf1,0x09,0xe0,0xab,0x6c,0x57,0xc6,0x7a,0x7f,0xfc,0xc8,0xe3,0xed,0xfc,0x19,0xc1,0xcc,0xd4,0x39,0xd9,0xc3,0x3e,0x0e,0xaf,0x81,0xd5,0x09,0xfd,0x11,0x1a,0xf1,0xe5,0x24,0x0f,0xee,0xf0,0xa1,0x0a,0xee,0xd2,0xf0,0xc8,0xa6,0x37,0x23,0x7f,0xa2,0xcd,0xf1,0xde,0x1e,0xe0,0xc3,0x2a,0x0f,0xac,0x81,0xd6,0x04,0xfc,0xfc,0x10,0xf7,0xf1,0x23,0xd0,0x2a,0x53,0xf4,0x92,0x60,0xac,0x9e,0xe9,0x5c,0x0c,0x13,0xc7,0xee,0x7f,0x3a,0xeb,0xf6,0x63,0xe0,0x81,0x28,0x89,0xd6,0x3b,0x39,0x0c,0x3b,0xd3,0x29,0x78,0x50,0x03,0xc6,0xb4,0xb4,0x27,0x07,0x45,0xe2,0x81,0xed,0x26,0x04,0x77,0xd0,0xd0,0x02,0xec,0x00,0x73,0x12,0x81,0x26,0xc9,0xfa,0x2f,0x21,0x0e,0x05,0xc3,0x1a,0x7d,0x17,0xd5,0x2e,0x64,0xf6,0x83,0x3c,0xe0,0xc8,0x22,0x4d,0x28,0x10,0xbd,0x01,0x7f,0x04,0xf3,0xc9,0x2e,0x3c,0xa6,0x49,0xce,0xe9,0xe6,0x7f,0xdd,0xd7,0x92,0x54,0x71,0x40,0xe7,0x38,0xc9,0xd5,0x48,0xf3,0xd2,0x81,0xb3,0xec,0x08,0xf0,0x32,0xc6,0xbe,0x18,0xfd,0xcd,0xe6,0x7f,0xa3,0x23,0x14,0xff,0xb9,0x5c,0xc2,0xbd,0x9d,0x2d,0x38,0x27,0x0b,0xcf,0xf0,0x85,0x19,0xf7,0x81,0xb9,0xfc,0xe5,0xe3,0xef,0x11,0x03,0xea,0x50,0x31,0xe9,0x8e,0x7f,0x64,0xb1,0x78,0x54,0xd1,0xbf,0xea,0xbf,0x20,0xf0,0x88,0xbc,0x09,0x93,0xfd,0xaa,0xf1,0xf3,0xb5,0x26,0x0d,0xd4,0x03,0x7f,0x0f,0x24,0x37,0x28,0x09,0xd9,0xcc,0xa8,0x3a,0xf0,0x31,0xe4,0x81,0xd8,0x19,0xff,0x66,0xa9,0xa7,0x0d,0x1e,0x35,0x72,0x59,0x81,0x1e,0x23,0x25,0x60,0x38,0x03,0xd2,0xa8,0x09,0x67,0xd4,0xe9,0xe2,0xe5,0x7f,0xbb,0x2f,0x0a,0xe8,0xc9,0x58,0xa0,0xbb,0xbf,0x32,0x40,0x21,0xef,0x3d,0x7f,0xd8,0x8c,0x44,0xc0,0xd1,0x46,0x20,0x12,0x25,0xd7,0xf5,0x45,0x25,0x9e,0x46,0x4a,0x4a,0xd5,0x59,0x7f,0xbf,0xe7,0x69,0x9d,0xcf,0xd3,0xf3,0xfa,0xfc,0xe2,0x2b,0x6c,0xef,0x87,0x48,0xa4,0xc8,0x0a,0x53,0x30,0x18,0x9e,0x03,0x7f,0xf5,0x20,0x04,0xf1,0x96,0x21,0xfa,0x24,0xf4,0xd8,0xd4,0x40,0x32,0x7f,0xb3,0x96,0xd1,0x81,0x60,0x27,0xf9,0xd5,0x2c,0x12,0xb9,0x1a,0x58,0xf2,0x03,0xcc,0x39,0x44,0x48,0xb4,0x81,0x34,0x14,0x85,0x20,0xad,0xc8,0xd0,0x5c,0xfb,0xf6,0xd9,0x5a,0x5a,0x4b,0x25,0xe0,0x7f,0xe1,0xb3,0x2a,0xd9,0x39,0x4d,0x05,0x00,0x22,0xdd,0x17,0x49,0x14,0xbc,0x0b,0xee,0x72,0x02,0x1f,0x7f,0xf5,0x0c,0x41,0x8b,0xe2,0x91,0x57,0x26,0x40,0xda,0x0a,0xad,0x8c,0x78,0xf6,0x97,0x81,0xb4,0xe6,0x2a,0x23,0x3d,0xbf,0xb5,0xf4,0x14,0xb5,0x43,0xdf,0x8c,0x30,0x15,0x35,0x50,0x2b,0xfc,0x2c,0xce,0x53,0x7f,0x0a,0xe6,0x3b,0xfa,0xae,0x33,0xfe,0xb2,0x81,0xdd,0x0b,0x29,0xe5,0x15,0xea,0xef,0x24,0x0b,0x20,0x58,0x5f,0x81,0x29,0x18,0x2f,0x4a,0x2f,0x0d,0xf4,0xc0,0x03,0x5b,0xd7,0xdf,0x3a,0x7f,0xd5,0xa7,0x4a,0xa8,0xce,0x11,0x3b,0x1e,0x1e,0xcd,0x13,0x67,0x31,0x03,0xc4,0xae,0x84,0x55,0xda,0xdf,0xce,0x99,0xa6,0x4a,0x2d,0x7f,0x99,0x92,0xcd,0xc8,0xca,0xff,0x81,0x2a,0x14,0xb3,0xe3,0xf5,0xfe,0x0b,0x39,0x1a,0x17,0xf3,0x29,0xc6,0x90,0xe3,0x90,0x3d,0x1a,0xb6,0x5c,0xfd,0xd7,0x47,0x7f,0x13,0x22,0xea,0xf7,0xa3,0x8e,0x14,0xb4,0x0f,0xfb,0xf3,0xd0,0x12,0x0c,0xf1,0x35,0xc6,0x7f,0x5b,0x1d,0xd7,0xfc,0xcb,0xcf,0x32,0xef,0x3d,0xe0,0xa6,0xef,0x22,0xe0,0x56,0x81,0xde,0xde,0x2a,0x3a,0x75,0x53,0x81,0x2d,0x12,0x25,0x3d,0x2a,0xf7,0xd6,0xb0,0x0c,0x49,0xde,0x01,0xcd,0x55,0x17,0x83,0x3f,0xe2,0x15,0x0c,0x35,0x15,0xf5,0xb3,0x3d,0x7f,0x09,0x10,0xef,0x22,0x81,0xe8,0x20,0x02,0x02,0x20,0x1e,0xef,0x3e,0xf8,0x07,0x18,0x23,0xe2,0x9c,0xeb,0x81,0x26,0xfc,0x9b,0x0a,0xf1,0xdb,0x18,0x59,0x1a,0x31,0x03,0x20,0xf2,0xe2,0x07,0x97,0x13,0x04,0x81,0xbb,0x01,0x03,0x01,0x23,0x10,0x16,0xff,0x42,0xde,0x6a,0xfd,0x23,0x03,0x22,0x13,0x81,0xd7,0x1c,0x04,0xe3,0x0d,0xc6,0xf6,0x06,0xeb,0x0e,0x63,0xa0,0x83,0x40,0x81,0xc0,0x3f,0x2f,0x0f,0x38,0xd7,0xe5,0x5e,0x21,0xf1,0x14,0xe8,0x5b,0x3b,0x02,0x7f,0x68,0x01,0xda,0x2c,0x28,0x19,0xbe,0xbe,0x9d,0x00,0x00,0x00,0x00,0x86,0xd2,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x04,0xec,0x13,0x04,0x12,0xf2,0x23,0xea,0xf2,0x89,0x48,0xfe,0xf3,0xd2,0xf7,0x03,0x0e,0x1c,0x40,0xdb,0x0b,0x0f,0x0c,0xdf,0x3b,0x18,0x21,0xdf,0xd1,0x07,0x32,0xe8,0xd4,0x32,0xb6,0xb7,0x0a,0x05,0x4a,0x04,0x0d,0xc5,0xcd,0x14,0xc8,0xf5,0xdd,0xd5,0xf0,0xc6,0x2e,0xda,0x4d,0x3b,0x21,0xe1,0x11,0xc5,0xdc,0x3c,0x3d,0x13,0xe1,0xd1,0x18,0x15,0x81,0x3e,0xc0,0x1d,0x31,0x52,0xe3,0xbe,0xf0,0x31,0xf0,0x09,0xf4,0x2b,0xfb,0x00,0x01,0x21,0x0a,0x11,0x45,0x3b,0x2c,0xc5,0xf2,0xe4,0x04,0xea,0xe9,0xdc,0x09,0xf0,0xe3,0xb6,0xdd,0xe1,0x02,0x04,0x0b,0xe1,0x27,0xc8,0x30,0x70,0xe0,0xa5,0x71,0xc0,0x13,0x99,0x18,0xfd,0x23,0xd6,0x17,0x08,0x2c,0x31,0xec,0x81,0x0f,0x3b,0xd1,0xfc,0xd8,0xd2,0xf9,0x06,0x46,0xe7,0xe1,0xda,0x47,0xf8,0xe5,0xbc,0x14,0x07,0x9e,0x02,0x19,0xb2,0x36,0x16,0xe7,0xc8,0x01,0xd6,0xd4,0x0b,0x15,0x31,0xfa,0x75,0x04,0x1c,0xf1,0x28,0xc6,0xef,0xff,0xed,0xe8,0xcb,0xf2,0xde,0xf3,0xfa,0x86,0xfe,0xcf,0x2d,0xe1,0xdf,0x93,0xd9,0x2e,0x07,0xfd,0xdf,0x39,0xab,0xb8,0xc6,0xd9,0x91,0xff,0x07,0x23,0xbd,0x0d,0x09,0x04,0x3b,0x14,0xe6,0xdd,0xdf,0x69,0x7f,0x0d,0xd7,0x76,0xd1,0xed,0xe5,0xf6,0xf0,0x05,0xd4,0xfe,0x0a,0x08,0x50,0x2b,0xd7,0xe1,0x3e,0xd2,0xfa,0xed,0xe0,0x00,0xfe,0xf6,0x18,0x25,0xe9,0x61,0x01,0xe2,0xd1,0x30,0x3a,0xff,0x45,0xdc,0xfe,0xed,0x14,0x17,0xdb,0xfb,0xd5,0xd6,0xf5,0xea,0xfd,0x23,0x63,0xfc,0xf1,0xde,0x10,0x02,0x19,0xf8,0xfd,0xdc,0xc9,0x25,0x14,0xf7,0x02,0xf2,0xe6,0xcf,0x26,0xf9,0xed,0xc9,0xbe,0xea,0xef,0xe5,0xcd,0x1e,0xea,0xd6,0xde,0xd6,0xee,0xfe,0x13,0xda,0x62,0xdf,0x1f,0xef,0x00,0x0b,0x7f,0xec,0x39,0xdc,0xf4,0xd8,0x2c,0xf2,0x22,0xf6,0x1d,0x00,0x00,0x19,0x5c,0xf9,0x03,0xff,0x16,0x46,0x35,0xef,0x01,0x4f,0xf1,0x5e,0x5f,0x0b,0x0c,0x0e,0xe1,0xfe,0x4a,0xfb,0x5c,0x5b,0x54,0x0b,0xf6,0x29,0xfd,0xd9,0x28,0xfa,0xf8,0xec,0x3e,0xf5,0x56,0x60,0xe0,0xfa,0x01,0xe9,0xff,0x05,0x06,0x78,0xeb,0x43,0xe4,0xe8,0xf5,0x44,0x58,0x0c,0x04,0xfb,0xfd,0x23,0xcf,0x3f,0x04,0x05,0xfa,0x19,0x2d,0xe6,0xe8,0x0c,0x52,0x07,0x18,0x52,0x51,0x36,0x21,0xfa,0xf7,0xf0,0xba,0xf8,0x10,0xe9,0x04,0xf2,0x81,0xfa,0xd7,0xe7,0xc8,0xf1,0xe0,0xd7,0xdc,0x0b,0xea,0x07,0xe5,0xeb,0x9b,0xd9,0x01,0x04,0xfb,0xc7,0xf0,0x0a,0xf2,0xc4,0xd9,0x84,0xa7,0xdb,0x0b,0x02,0xf0,0xe7,0xb9,0xc1,0x16,0xa8,0xa2,0x13,0xfb,0xf0,0x01,0xf8,0xf9,0xff,0xf7,0xd7,0xc1,0xed,0x96,0xb7,0xfa,0xf8,0xd9,0x02,0xd5,0xdd,0xe0,0xa1,0xf7,0xe9,0xeb,0x08,0xe4,0xc0,0x9c,0x0a,0xf5,0xf1,0xe4,0xf6,0x0c,0xb3,0x00,0xeb,0xdc,0xd1,0xcd,0x0f,0x13,0xfa,0xc4,0xff,0xff,0xc8,0xb7,0xc2,0xee,0x0c,0xfb,0x24,0x39,0x23,0xf6,0x15,0x2b,0x03,0x77,0xd2,0x33,0x62,0x7f,0x0a,0x07,0x6b,0x16,0xd4,0xf1,0xe2,0xf2,0x06,0x42,0xfb,0x09,0xea,0x3a,0x21,0xf6,0xe3,0x2b,0x43,0x16,0x6f,0x5a,0xf1,0xf4,0xeb,0x10,0x24,0x5c,0x6a,0xd3,0x69,0x4f,0x2c,0x37,0xdf,0x4f,0xcf,0xe3,0xce,0xeb,0x12,0x28,0x02,0x65,0x2f,0xe6,0xc9,0xf5,0x10,0x73,0x02,0xf6,0x77,0x16,0x02,0x22,0xf4,0xec,0x48,0x60,0x20,0x26,0xf5,0x05,0xe4,0xce,0x3f,0x27,0x05,0xf2,0x14,0x1e,0xc5,0xc2,0xda,0x42,0x34,0xf4,0x41,0x4c,0x2e,0xec,0xf1,0x02,0xe4,0x2b,0xd3,0xf5,0x1a,0x0e,0x0c,0x0e,0x81,0x09,0x01,0x09,0xd1,0x3b,0xd4,0x10,0xc2,0x20,0xe2,0x08,0x26,0x22,0x16,0xf6,0xf6,0x2d,0x23,0x26,0xc9,0x01,0x1c,0x00,0x28,0x1c,0xfd,0xff,0xb0,0xd1,0xdf,0x07,0x01,0x24,0x1a,0x0a,0x29,0x21,0x2f,0x13,0x94,0x35,0x90,0xbd,0xfe,0x12,0x03,0x25,0x17,0x9a,0xad,0x18,0x1b,0x05,0x05,0x03,0x10,0xc5,0x50,0xe0,0xb3,0xc6,0x0f,0x1a,0x08,0xfa,0xee,0x08,0x35,0x9f,0x10,0x36,0x09,0x05,0x2a,0x05,0x99,0x8c,0xad,0x2a,0x17,0x2d,0x28,0x0e,0x03,0x3a,0x09,0xff,0x56,0xac,0x59,0x08,0xdf,0x0c,0xee,0x9a,0xe8,0xcb,0x10,0xee,0x57,0xe3,0x09,0xca,0x17,0xff,0x17,0xda,0x07,0x99,0xf0,0x0e,0x1f,0x06,0x03,0xec,0x1d,0xf4,0xb7,0x06,0x8c,0xae,0xe5,0xff,0x0c,0x4d,0x52,0xaf,0xd8,0x59,0x81,0x99,0x17,0xf5,0x09,0xf8,0xf9,0xe6,0xf1,0x09,0x38,0xa5,0xed,0xab,0x9c,0x01,0x00,0xe4,0x07,0xd8,0xd7,0xf3,0xa6,0xfa,0x07,0x58,0x50,0x39,0xd1,0x96,0xfe,0x50,0x28,0x07,0xe3,0xe6,0xa9,0x04,0xf5,0xd5,0xec,0xbf,0xfb,0xdf,0xff,0xb7,0x08,0xfc,0xac,0xa6,0xb4,0xf5,0x23,0xe6,0x22,0x89,0x30,0xe8,0xf7,0xfc,0xe6,0xad,0x3a,0xb0,0x29,0x61,0x49,0x9f,0x5f,0xbf,0x2f,0xc0,0x15,0x08,0x06,0xba,0x1f,0x19,0x1f,0x1e,0x12,0x97,0x17,0x08,0xad,0xf8,0xcb,0x9d,0x14,0x0d,0x33,0x40,0x40,0xb8,0x47,0x19,0xb5,0x92,0x0f,0x27,0xc2,0x02,0x23,0xc7,0x30,0x4a,0x26,0x89,0xf6,0xaa,0xaf,0x63,0x25,0x14,0x00,0x3b,0x12,0x15,0xae,0x4b,0xfa,0x47,0x34,0x41,0xcc,0x98,0xf5,0x45,0x22,0x15,0x9d,0x24,0x99,0x1d,0xe8,0xdf,0x85,0xa1,0x40,0x39,0x38,0x97,0x16,0xdb,0x81,0xa6,0xb1,0xb5,0xeb,0xf4,0xf2,0x1e,0xe3,0x08,0xfb,0x00,0x14,0x74,0x05,0x1a,0x24,0x3d,0xf6,0x0c,0x35,0x03,0x12,0x01,0x02,0x00,0x07,0x49,0xf5,0xf2,0x05,0x0f,0x45,0x08,0x07,0x19,0x37,0xfe,0x7f,0x4a,0x0d,0x0b,0x1b,0xdf,0xec,0x4b,0x2f,0xe6,0x66,0x3f,0x02,0x12,0x03,0x0d,0x0f,0x09,0x12,0x21,0xec,0x2b,0xfd,0x62,0x3e,0x07,0x09,0x0e,0x12,0x32,0x02,0xf1,0x69,0x1c,0x26,0xe6,0xf5,0xe9,0x2e,0x48,0x0a,0xec,0xf7,0xf1,0x0d,0x02,0x3d,0x13,0x05,0x02,0x0b,0x01,0x08,0x06,0x01,0x3e,0x05,0xff,0x36,0x4c,0x37,0x03,0x10,0x02,0x26,0xbd,0x14,0x16,0xfe,0xf0,0xc0,0xb7,0x19,0xdb,0x02,0x1f,0x1b,0xc4,0xf7,0xe7,0x0e,0xe2,0xed,0x17,0x02,0xa9,0x10,0x0e,0x08,0xfe,0x85,0xf7,0x1d,0xcb,0xd7,0x02,0xa7,0xaa,0x02,0xf3,0x14,0x16,0x34,0xef,0x10,0x0b,0xb2,0xe1,0xf6,0xdd,0xe5,0xf3,0x20,0xf0,0x1d,0x25,0x07,0xc6,0xf3,0xc9,0xc1,0xf1,0x0a,0xf3,0xfd,0x0b,0xe6,0xee,0x81,0x16,0xb6,0x4b,0x06,0x32,0xe9,0xb6,0xe5,0x4f,0x09,0x07,0xda,0x0b,0xcc,0xc0,0xf5,0xf8,0xe3,0xe9,0x1e,0x06,0xe9,0xcb,0x16,0xe5,0xe9,0xbb,0xf3,0xd2,0x05,0xfa,0x7f,0x88,0x5e,0xc2,0xfb,0xfe,0xdf,0x95,0xb6,0xd2,0x4e,0x30,0x5f,0xb1,0x1d,0xd6,0xbb,0xc5,0xfd,0xe0,0xb3,0xd6,0x17,0x04,0x0a,0xff,0xbf,0xf0,0xb0,0x1a,0xd4,0x24,0xc6,0xbf,0xfb,0x08,0xab,0x57,0x76,0xb2,0xfb,0x8a,0xb5,0xcb,0x01,0x10,0xe5,0x0f,0xde,0x0d,0xb0,0xbc,0x5e,0xc4,0xf3,0xc7,0xa1,0xef,0xea,0xfa,0xef,0x09,0xfe,0x0b,0x94,0xd7,0xab,0x6c,0x20,0x0a,0xdc,0xa6,0xf4,0x7d,0x0e,0x07,0xcb,0xcf,0xc4,0x0f,0xf3,0xf1,0xd1,0xbb,0xbc,0xc9,0xee,0xa6,0xf5,0xe6,0xbd,0xe8,0xdb,0xf1,0x00,0x10,0xf3,0xc7,0xfc,0xee,0x12,0x16,0xfa,0x89,0xe1,0xd1,0x02,0xe0,0x02,0x00,0xf6,0xdf,0xe5,0x0c,0xf3,0x0b,0xf9,0xa5,0x0b,0x10,0x0b,0xfa,0xd4,0xef,0x09,0xf3,0xd0,0x0c,0x81,0xa7,0x0b,0x08,0xe9,0x00,0xf3,0xc3,0xd8,0xf4,0xa6,0xc8,0x1b,0x15,0x12,0x18,0xe2,0x16,0xe9,0xf5,0xf7,0xbf,0x00,0x9e,0xbe,0xf2,0x0d,0x0e,0x05,0xdc,0x06,0x06,0x83,0x10,0xd6,0xfc,0xfb,0x1a,0xb8,0xc1,0x02,0x0f,0xfe,0x03,0xfa,0xf5,0xc5,0x12,0xf8,0xee,0xed,0xdd,0xec,0xfa,0xeb,0xac,0x15,0x06,0xd0,0xac,0xc2,0x03,0x12,0x0e,0xed,0x0b,0xff,0x10,0x0a,0xc9,0x16,0x7f,0x0b,0x15,0xdf,0xd5,0xf4,0x1f,0xd0,0x0f,0x14,0x22,0x12,0x07,0x05,0x51,0x1b,0xfd,0xef,0xbc,0x67,0x1c,0x11,0xcc,0x42,0x10,0x72,0x48,0x1b,0x0f,0x11,0xdd,0xf0,0x56,0xd8,0x22,0x58,0x3a,0xc8,0xca,0x25,0xb6,0x0f,0x22,0x04,0xff,0xf7,0x3a,0x12,0x4f,0x21,0x05,0xf9,0xfb,0xee,0xd0,0x0d,0x1f,0x7c,0xda,0x2f,0xda,0x01,0xe8,0x4f,0x39,0xce,0xef,0x0f,0xe6,0x27,0x17,0x29,0xc8,0xf3,0xed,0x1d,0x0a,0x0b,0x0a,0x0c,0x42,0xd3,0x1b,0x2d,0x3c,0x26,0x19,0xfb,0xf5,0x12,0x32,0x09,0x00,0x03,0x06,0xe5,0x70,0x20,0x37,0x1f,0x34,0x05,0xef,0x3e,0x21,0x22,0xe5,0x03,0xf3,0xf1,0x3e,0xf6,0x05,0x01,0x09,0x06,0x06,0x21,0x10,0x49,0x06,0x7f,0x56,0xeb,0xfc,0x20,0x0d,0x18,0x54,0x2d,0xf0,0x6a,0x4c,0x02,0xf7,0xec,0x10,0x2e,0xeb,0x2a,0x2a,0x04,0x29,0x0a,0x68,0x43,0x36,0x22,0xec,0xf9,0x46,0xf0,0xff,0x60,0x22,0xf3,0x10,0x10,0x14,0x4e,0x5c,0xf2,0x0f,0x06,0x02,0xe5,0x22,0x41,0xf3,0x02,0x12,0x06,0x10,0x1b,0xfd,0x24,0x4b,0x09,0xf2,0x2f,0x44,0x37,0xda,0xde,0x07,0xb0,0x2d,0xb0,0xe4,0xff,0xf0,0x53,0x7b,0x14,0x07,0x1b,0x06,0xb2,0x28,0x30,0x30,0x01,0x3e,0x02,0x0c,0xdf,0x4e,0x07,0xfa,0x10,0xe4,0x7f,0x31,0x0f,0xfd,0x1d,0xdf,0x75,0x67,0xe7,0xfb,0x3b,0xd1,0xbe,0x45,0xf4,0xe0,0x69,0x31,0xd5,0xe8,0x3a,0xe3,0x2b,0x23,0x29,0x40,0xd1,0x29,0x03,0x74,0x26,0x10,0x04,0x03,0x15,0x10,0x05,0xee,0x5a,0x00,0x50,0xb6,0xf9,0xe7,0x26,0x54,0xfc,0xa7,0xd5,0xee,0x4c,0x32,0x2d,0xdd,0x0e,0xe2,0x1f,0xed,0x40,0x3b,0xeb,0x4b,0xc6,0x26,0x4c,0x28,0x46,0x3a,0x00,0x00,0x00,0x00,0x96,0xd8,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xe8,0xe7,0x19,0x81,0xc0,0x41,0x34,0x22,0x38,0x4f,0x35,0x42,0x1f,0xf7,0xfa,0x4d,0xe2,0x45,0x15,0xce,0xc2,0x21,0x10,0x21,0x49,0x07,0xdf,0x7f,0x3e,0x4c,0xf2,0xc4,0x53,0xd8,0xcd,0x78,0x54,0x81,0x42,0xeb,0xab,0xb1,0xf1,0xbc,0x5a,0xdf,0xe2,0x95,0x3d,0x23,0x26,0x7f,0x8f,0xee,0x41,0x2d,0x77,0x01,0x26,0xb8,0xe2,0x67,0x41,0xfc,0xe4,0x81,0xe5,0xd1,0x12,0xed,0xdb,0x6a,0xe1,0xc4,0x1a,0x30,0xf6,0xf9,0xe4,0xef,0x40,0x07,0x7f,0xa8,0x1e,0x35,0x34,0xf4,0x3e,0x5f,0x85,0x0e,0x17,0x10,0x67,0x7c,0x12,0x7f,0xdf,0x34,0x4b,0xe1,0x3b,0x6c,0xe2,0xf7,0xfd,0x8f,0xe1,0x14,0xa5,0x83,0x2b,0xd3,0xd0,0x15,0x4e,0xcf,0x6a,0x4e,0xab,0xb7,0xfd,0x90,0xf4,0xcd,0xf8,0x81,0x7f,0x1f,0x05,0x56,0x14,0xd7,0x36,0x2b,0x1d,0xb2,0xf4,0x95,0x40,0xf2,0xf2,0x9a,0x14,0x6d,0x7f,0xf8,0x91,0x3a,0xb0,0xc3,0x67,0x27,0x31,0x0f,0xe2,0x2a,0x70,0xee,0xd0,0xec,0x0f,0x93,0x2a,0x0b,0x81,0xa2,0xff,0xcf,0x0e,0x5a,0x38,0xe3,0xd1,0x0c,0x18,0x6b,0x7f,0xb7,0xe4,0x16,0xe5,0xd3,0x59,0xe7,0xf3,0x1c,0xd8,0x6e,0x68,0x49,0x70,0x81,0xfb,0x42,0x07,0xbc,0xfa,0x59,0xfa,0xc7,0xc5,0xa6,0xe8,0x03,0xb9,0xa5,0x11,0x38,0xd9,0x7f,0xf8,0xe4,0x52,0x3b,0x05,0xe3,0x0d,0xce,0x08,0xe1,0x02,0xd9,0x5a,0x89,0xc4,0x1a,0x7a,0xa9,0xd1,0x5b,0xd3,0x81,0x29,0xe3,0xf2,0xc3,0xc5,0xac,0x13,0x0e,0x56,0x81,0xa9,0x31,0xce,0x3f,0x4a,0x63,0x1f,0x10,0xf0,0xea,0x0a,0x53,0x2e,0xcb,0xf9,0x42,0xfb,0xd5,0x54,0x7f,0x0e,0xfa,0xe9,0xc0,0xed,0x18,0xf8,0xea,0x26,0x11,0x7f,0xaf,0xf7,0x23,0x0e,0x3a,0x35,0xfc,0x30,0x09,0xd1,0x3c,0x58,0x39,0x4c,0xcd,0xa3,0x7f,0x27,0xec,0x22,0x1e,0xde,0xbf,0x04,0xe9,0x0d,0xe1,0xc3,0xd2,0xee,0x4a,0x25,0x1e,0xae,0x21,0x4c,0xc1,0x7f,0x33,0xe2,0x57,0x13,0x5e,0x59,0x02,0xea,0xfd,0x3c,0xeb,0x98,0x0c,0x34,0x36,0x7f,0x51,0xa9,0x43,0x95,0x70,0x3a,0x27,0x09,0x16,0xd9,0x60,0x32,0xdc,0x5f,0x40,0x24,0xe9,0xff,0x81,0x03,0x12,0xd8,0xac,0xfd,0x20,0xe7,0x5f,0xe4,0xfb,0x7f,0x4d,0x2d,0x11,0xac,0xe7,0xd8,0x1f,0xff,0xf3,0xf6,0x4a,0x7f,0xdc,0x98,0x25,0xf3,0xc6,0x7e,0x41,0x3e,0xf1,0xf5,0x13,0x24,0x12,0x04,0xd6,0x25,0xd8,0x13,0xe6,0x73,0x7f,0x00,0x02,0x55,0x18,0x12,0xca,0x08,0xb3,0xcb,0xe5,0x09,0xed,0x13,0xcf,0xd4,0x31,0x23,0x36,0xc8,0x7f,0xe1,0x71,0x73,0xd1,0x94,0x67,0x20,0xda,0xc5,0x03,0x72,0x29,0x78,0xf6,0x22,0x07,0xf7,0x7f,0x66,0xff,0x4b,0x18,0xaa,0x7f,0x0c,0xbd,0x46,0x26,0xfa,0xdf,0xfa,0xac,0xed,0x14,0xd1,0xf5,0x7f,0xb6,0x27,0x11,0xdc,0xd3,0xba,0x58,0x35,0xcf,0x05,0xb1,0x00,0xf1,0xeb,0xd7,0x5b,0x3b,0x4e,0x3c,0xba,0x7f,0xcb,0xcc,0x50,0x30,0xdf,0x4b,0x87,0x6c,0x0e,0x68,0x46,0x9c,0x02,0x9b,0x7d,0x96,0xad,0x7f,0xbe,0xb3,0x56,0x5c,0x19,0xe5,0x9b,0xa0,0xf8,0xb6,0x30,0x81,0x37,0x0b,0x81,0xa7,0xc4,0xf3,0xf4,0x65,0x21,0x0f,0xf1,0x02,0xc3,0x1d,0x4a,0xfd,0xc3,0x2b,0x0f,0xbf,0x7f,0x4b,0x25,0x19,0xd8,0x31,0x6b,0xd2,0xf8,0xce,0xee,0xe9,0x51,0x01,0x37,0x7f,0xce,0x24,0x55,0xe9,0xe1,0x0a,0xe0,0xb0,0x10,0x79,0x7f,0xf6,0xb0,0x0b,0xb1,0xc2,0x3e,0x08,0x54,0xe9,0x12,0x08,0x4a,0xdf,0x05,0x16,0x7f,0xd8,0xc8,0x37,0xd7,0xfb,0x45,0x03,0x23,0x11,0xe9,0x24,0x61,0x15,0x36,0xdc,0xca,0x68,0x42,0xb7,0x7f,0x3f,0xe8,0xb9,0x38,0xfc,0xd8,0x0d,0xbe,0xdb,0xdb,0x2e,0x2d,0x83,0xef,0x11,0x2a,0xaf,0xf2,0x42,0x95,0x30,0xe0,0x71,0xc8,0x7f,0x31,0xa8,0x21,0x2a,0xe1,0xd3,0x41,0x7f,0x2d,0xde,0x21,0x1c,0x17,0xf4,0x25,0xd7,0x17,0x81,0xea,0xc5,0x5b,0x9e,0xe1,0x60,0xd1,0xb1,0x41,0xfd,0x58,0xd4,0xbb,0xce,0x47,0xfd,0xc9,0x7f,0xe8,0x00,0x2c,0x1e,0x18,0x0d,0xfd,0xb6,0xf0,0x13,0xe7,0xca,0x4a,0x16,0x71,0xa4,0x99,0x73,0x97,0xbe,0x7f,0x18,0xf7,0x2c,0x05,0x1d,0x3f,0x18,0x45,0xed,0x9a,0x7f,0x05,0xad,0x77,0x70,0xdd,0xfe,0xb2,0xac,0xd6,0x12,0xdb,0xf5,0x00,0x05,0x3f,0x81,0x08,0x3b,0x01,0xee,0x22,0x25,0xd3,0x65,0xda,0x01,0xe2,0x35,0x65,0x6c,0x7a,0x29,0x8d,0x2b,0xb9,0xea,0x7f,0xfd,0x0c,0x02,0xaf,0x04,0x75,0x17,0x7a,0x7a,0x54,0xd8,0xad,0x5e,0x81,0x04,0x5d,0x04,0x71,0x33,0xc5,0xeb,0x5c,0x13,0xb6,0xf7,0x12,0x84,0x1f,0xee,0x81,0xb2,0xdb,0xe4,0xf2,0x6e,0x32,0x20,0x0f,0x0b,0xf3,0x1d,0xe0,0x87,0x0f,0x1f,0xc8,0x81,0x06,0xf6,0x3d,0x1f,0x41,0xc5,0xc3,0x1f,0x14,0xea,0x27,0xd5,0x81,0x61,0x32,0xed,0x2d,0x4b,0xc9,0x54,0x1d,0x4d,0x4a,0x38,0xf6,0xbf,0x0d,0x81,0x14,0xe6,0x85,0x10,0xdb,0xb2,0x20,0x66,0x19,0x07,0x01,0xf0,0x32,0xf1,0xc3,0x7f,0xf5,0xbe,0x6a,0x42,0xf3,0x0a,0xc9,0xb2,0xc4,0x20,0xe7,0xcb,0x13,0x2f,0x01,0xd0,0xc1,0x3d,0x24,0x07,0x2c,0x3d,0x04,0xed,0x81,0x07,0x40,0x4c,0x99,0x38,0x19,0x9c,0x28,0x0f,0xcc,0x81,0xca,0x05,0x1e,0x6d,0x3e,0xbc,0xd0,0xfc,0x49,0xf7,0xf5,0x51,0x1b,0xdc,0x5a,0x7f,0xcc,0xfa,0x23,0xed,0x31,0x13,0xda,0xa8,0x09,0xda,0xc0,0x55,0x49,0x14,0x73,0x7f,0x11,0xf7,0xec,0xf8,0xfe,0x2c,0xd4,0xf3,0xeb,0xe4,0x7d,0x3d,0x81,0x0e,0xf1,0x45,0x38,0x36,0xf7,0xd1,0xd0,0x75,0x52,0xfd,0xd8,0x42,0xd9,0x27,0xeb,0xdc,0xfa,0xe2,0x9f,0xce,0xfa,0xf9,0x3b,0x81,0x23,0xb6,0xff,0x53,0x7f,0xe4,0xbd,0x00,0xcc,0xee,0x51,0x33,0x3e,0x24,0xfb,0x19,0x2e,0x04,0xbe,0x18,0x7f,0xea,0xaa,0x0f,0xe5,0x1d,0x37,0x23,0x18,0x30,0xf3,0x4f,0x3e,0x36,0x29,0xf4,0x85,0x79,0x6b,0xbf,0x7f,0x32,0xe7,0x9a,0x3a,0xe4,0x0a,0xc3,0x8a,0xc4,0x35,0x0d,0xb7,0x7f,0x2d,0xe6,0x6f,0x42,0x0b,0xf2,0x0e,0xce,0xe2,0x05,0xd1,0xcb,0x3e,0x33,0xdb,0x7f,0x26,0xec,0x6e,0x1c,0xf0,0xde,0xdb,0xa2,0xd5,0xd1,0xd1,0xd9,0xd8,0xbe,0xfd,0xdf,0x2c,0xda,0x1d,0x7f,0x56,0xed,0xf2,0xd9,0x08,0x31,0xe0,0xc9,0x4a,0x20,0xe0,0x56,0xef,0x17,0x7f,0x72,0x49,0x0b,0xab,0x94,0xb1,0x3a,0x0f,0x1b,0x30,0xb2,0xfd,0xd9,0x1f,0x0a,0x81,0xd4,0xf9,0x98,0x14,0x20,0x6e,0x9d,0xe3,0xef,0x14,0xf4,0xd9,0x6b,0x24,0xdd,0x7f,0x0b,0x11,0x29,0xec,0xe0,0x19,0xc8,0xbe,0xac,0x17,0x35,0x6c,0x78,0x81,0xf3,0x29,0x2c,0x76,0x2f,0x16,0x97,0xf6,0x59,0x63,0xc4,0xca,0x4a,0xeb,0xca,0x30,0x12,0xde,0x81,0xeb,0xfb,0xd6,0x40,0xf4,0xe3,0xef,0xfe,0x23,0xf5,0x7f,0xd9,0xd8,0xfa,0xde,0x4b,0x5b,0x0d,0x39,0x03,0xe1,0x69,0x53,0x0a,0xf6,0xd8,0xca,0xb4,0xee,0xdd,0x81,0xad,0xd9,0xff,0xe1,0x14,0x2b,0xc2,0xfe,0xeb,0xc9,0x81,0xec,0x9d,0x5d,0xf1,0xd0,0xac,0x9f,0xbd,0xe1,0x5b,0x60,0x00,0xb4,0xc4,0x03,0xa4,0x8b,0x1a,0x7f,0xdf,0xcb,0x29,0xcf,0xbd,0xc7,0x18,0x4a,0xe4,0xac,0xdb,0x15,0x2b,0x7f,0x94,0xb8,0x51,0xf9,0xc7,0x5a,0x38,0x09,0x04,0xc1,0x0f,0x6d,0x35,0x14,0x3f,0x7f,0xe8,0xc4,0x2a,0xe7,0x18,0x4f,0x2f,0x31,0x30,0xb6,0x0c,0x2d,0x2e,0xfc,0x7f,0x04,0x52,0xcd,0x1e,0x36,0xbb,0x17,0x56,0x10,0xc5,0xef,0x08,0x22,0x23,0x15,0xe2,0xe0,0x71,0x21,0xf5,0x7f,0x36,0x2d,0x11,0xbc,0xd9,0xa0,0x37,0x1d,0xd8,0x49,0xdf,0xda,0x7f,0xf7,0x16,0x52,0x45,0xfe,0x45,0xb0,0xee,0x07,0x00,0x06,0xe5,0xc9,0x8a,0xec,0xfa,0x1c,0xd1,0x50,0x7f,0x0b,0xa7,0x07,0xc4,0xf9,0x61,0x37,0x0c,0x05,0x27,0x7f,0xea,0xe4,0x22,0xea,0xfe,0x3e,0xed,0x39,0x21,0xb0,0x54,0x39,0x2d,0x3a,0x29,0xdf,0x7a,0x08,0xf6,0x7f,0x4c,0x14,0xf3,0xc7,0xd2,0xc2,0x04,0xf3,0xfc,0xf3,0x05,0x7f,0x89,0xaf,0x6d,0xc9,0xc0,0x3a,0x40,0xf2,0x62,0xf2,0x06,0x2f,0x1e,0xfa,0xe6,0xd8,0x81,0x12,0x04,0xa2,0xbf,0xc9,0xd1,0x42,0x7e,0x4c,0xf7,0xc2,0xf1,0x08,0x2b,0xb1,0x2b,0x3e,0x18,0x7d,0x7f,0x1c,0x12,0x66,0xda,0x3e,0xb1,0x2d,0x9c,0x55,0x7f,0x0d,0xef,0x37,0x5f,0xa7,0x95,0xe1,0xdf,0xc7,0x25,0x0f,0x84,0xc8,0xe4,0xe8,0x01,0x31,0xee,0x8e,0x4a,0xf2,0xe5,0x5d,0xfe,0x25,0x34,0xa4,0xe1,0x7f,0x3f,0xe0,0xf6,0x6d,0xe1,0xea,0xf6,0xf5,0x52,0x7f,0x01,0xf1,0xfb,0x1a,0x54,0x5e,0x13,0xc3,0xf3,0x21,0x81,0x2a,0xf7,0xa1,0xbd,0xe3,0xe5,0xfb,0x57,0x31,0xcc,0x01,0xf0,0x2b,0xf8,0x01,0x7d,0xeb,0xdd,0x7f,0x49,0x4e,0x27,0xb3,0xd8,0xce,0x4e,0x0b,0xf7,0x74,0x31,0x04,0x4b,0xfc,0xd9,0x7f,0x60,0x1a,0x0b,0xad,0x8c,0xb5,0xe4,0xd8,0xd9,0xfa,0x1e,0x45,0xf0,0xc0,0xfe,0xe4,0x34,0x73,0x38,0x26,0x0c,0xcc,0x4b,0x7f,0x17,0x4b,0x46,0xab,0x7f,0x14,0xb4,0x4c,0xfc,0x00,0x1d,0xd7,0xba,0xd7,0xd8,0xc1,0xf4,0xd1,0x62,0x48,0xd6,0x81,0x03,0x37,0xba,0x56,0x20,0xdb,0x14,0xc9,0xf5,0x75,0x19,0xdc,0x0d,0x7f,0x94,0x93,0x41,0xda,0xdc,0x7d,0x1f,0xf7,0x51,0xee,0x31,0x35,0xf1,0xe9,0x55,0x7f,0xbc,0x8e,0x2d,0xd3,0xae,0x5d,0x44,0x48,0x13,0xdd,0x44,0x43,0xf1,0x39,0xf6,0x5a,0xcf,0x90,0x49,0xc5,0x1a,0x7f,0xe9,0xf3,0x4e,0xa4,0x49,0x34,0x07,0xe4,0x23,0x4d,0x36,0x9a,0x39,0x60,0x81,0x0c,0x7f,0xbc,0x56,0xfa,0x6e,0x20,0xfe,0x00,0x00,0x00,0x00,0xa6,0xde,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xf8,0xd7,0x81,0x18,0xcf,0x2c,0xfd,0xf9,0xff,0x06,0x21,0xff,0x24,0x1c,0xe7,0xc1,0xeb,0xa7,0xff,0xf5,0x24,0x19,0x16,0x03,0xe2,0xf1,0xf2,0x2d,0xe4,0x4c,0xa1,0x00,0x0d,0xf1,0x1c,0xba,0x3c,0xdf,0x1f,0x02,0xc6,0x2c,0x1d,0xe2,0xd5,0xd4,0x03,0x16,0xf7,0x21,0xd6,0x0d,0x42,0x21,0x02,0xe8,0x02,0xe1,0x09,0x31,0x0d,0xd8,0x3b,0xdb,0x26,0xf1,0xc9,0xa7,0xe6,0x02,0xf3,0x0a,0xcb,0xdb,0xd5,0xfc,0x2d,0xe7,0xf5,0xde,0x18,0x25,0xf5,0xdc,0xd3,0x05,0x10,0x3b,0x33,0xce,0xd4,0xce,0xfb,0x2b,0x02,0xc3,0xe4,0x0a,0x41,0x0a,0x26,0x10,0x03,0xef,0xd3,0x41,0x4a,0xfe,0x01,0x1f,0xfa,0x01,0x07,0x2c,0x73,0x0f,0xe6,0xe9,0xf9,0x6a,0xfa,0xef,0xf9,0xf6,0xf9,0x24,0x31,0x44,0x4d,0xfc,0x01,0x22,0x0b,0xdc,0xe1,0x48,0x02,0x1d,0x01,0x02,0xfc,0x03,0xfc,0x06,0xd6,0xd8,0x01,0xfd,0xe7,0xde,0x0b,0xe8,0x17,0x09,0x0d,0x0e,0x3b,0x11,0x2e,0x01,0x04,0x02,0x04,0x36,0xfd,0xfa,0x46,0x02,0xfe,0xeb,0x0a,0xf4,0x7f,0x12,0xf0,0x1a,0x06,0x24,0x0f,0x08,0xfa,0x08,0x50,0x08,0xd8,0xf7,0xf9,0x0d,0x5d,0x15,0x5b,0x1b,0x03,0x41,0x7f,0xf8,0x52,0xf8,0x40,0x02,0x03,0x11,0xef,0x00,0xe8,0xee,0x25,0x33,0x40,0x45,0x1d,0x22,0xf6,0x06,0x02,0x0b,0x28,0x2c,0xf7,0xf9,0x38,0xcb,0x70,0x06,0x1c,0x13,0xeb,0x47,0xed,0x33,0xdb,0x0a,0x48,0xfc,0xf1,0x1b,0x3c,0x37,0x26,0xfa,0x07,0xf6,0x31,0xf9,0xfa,0xe8,0x04,0x01,0xf2,0x32,0xdd,0xd9,0xf3,0x43,0xe1,0x4a,0x02,0x34,0x2f,0x57,0x2a,0x0f,0x03,0xff,0x2b,0x2b,0x35,0x19,0x31,0x4c,0xed,0x56,0x07,0xee,0x42,0x45,0x2c,0xfa,0xfd,0xea,0xfa,0x38,0x36,0x45,0xfc,0xed,0x06,0x58,0xdd,0xb3,0xbb,0xfe,0x5d,0xf3,0xda,0xcb,0xf9,0x37,0x2a,0xff,0xf6,0x1f,0xc6,0x9a,0xb5,0x90,0x4e,0xb5,0x09,0xde,0xf6,0x3e,0xca,0xd8,0xd8,0x1e,0xb6,0x08,0x8c,0x2e,0x29,0xf3,0xe9,0xc7,0x1a,0x24,0xc5,0x3b,0xbb,0x05,0xf0,0xc4,0xb3,0xa4,0xad,0x06,0xd9,0x06,0xcc,0xf8,0xd0,0xad,0xe1,0x05,0x2a,0xb1,0xfd,0xef,0x22,0xa9,0x09,0x81,0x07,0x30,0xa2,0xa4,0xe1,0xe8,0x22,0x11,0xb9,0xa3,0xb1,0xfc,0x65,0xa0,0xd1,0xd9,0xf2,0x21,0xae,0x96,0xce,0xf6,0x30,0x0c,0xf1,0xcc,0xcd,0xd2,0x06,0x0a,0x42,0x9f,0x0d,0xd0,0x81,0x11,0x99,0x11,0xc1,0x0e,0x00,0xfa,0x07,0x04,0x23,0x07,0xc2,0xb5,0xca,0xc3,0xeb,0xd7,0x0a,0x12,0x1a,0xea,0xca,0xc4,0x25,0x14,0xd9,0x49,0xac,0xe3,0xd0,0xf2,0x19,0xa6,0x0e,0xc3,0x2e,0xf9,0xc4,0x11,0x1f,0xdc,0xc6,0xb9,0xd7,0xff,0x10,0x2d,0xb5,0x1d,0x28,0x3e,0xdc,0xf1,0x05,0xc9,0x1f,0x27,0xf7,0xb1,0x1d,0xce,0x09,0xde,0xc6,0xa2,0xe2,0xf6,0xf2,0x0e,0xe4,0xd6,0xd8,0xdb,0xd5,0xbf,0x12,0x95,0xf0,0xfa,0xca,0xc6,0xc2,0x01,0xec,0x05,0x2e,0xbd,0xd4,0xc4,0x06,0x15,0xeb,0xbc,0xf0,0x56,0x7f,0xf1,0x53,0xe6,0x3f,0x05,0x06,0x1a,0xf9,0x03,0xce,0xed,0x31,0x65,0x55,0x5c,0x27,0x21,0xe4,0xe0,0xed,0x18,0x22,0x33,0xce,0xff,0x2f,0xbe,0x63,0x01,0x1d,0x2e,0xe0,0x59,0xfc,0x5f,0xbf,0x0f,0x52,0xe3,0xd7,0x2c,0x48,0x3a,0x2d,0xfc,0xfe,0xd6,0x2b,0xf2,0xda,0xbd,0x0a,0x14,0x01,0x49,0xde,0xc3,0xf3,0x58,0xbd,0x6b,0x01,0x5b,0x26,0x59,0x3c,0x28,0xf4,0xee,0x26,0x31,0x50,0x37,0x34,0x65,0xe2,0x51,0xf2,0xec,0x55,0x3c,0x37,0xf0,0xfc,0xf7,0xe1,0x49,0x62,0x56,0x17,0xeb,0xfb,0x58,0xd4,0x3c,0x0e,0xfb,0x2a,0xde,0x16,0xc1,0x0a,0x10,0x0f,0xf4,0xa0,0xeb,0x4e,0x2e,0x3e,0xf9,0xfc,0x14,0xe9,0xe8,0xe2,0x15,0x2a,0x31,0x92,0xfe,0x35,0xd1,0x1a,0xe4,0x17,0x5d,0xa8,0x30,0x0c,0x5e,0x9a,0x35,0x2c,0xe2,0x96,0x43,0x37,0x33,0x3a,0xf2,0xec,0xe4,0x31,0xbd,0xb0,0x81,0x38,0x52,0xe9,0x35,0xd3,0xb8,0x13,0x4d,0xc3,0x08,0x04,0x63,0x35,0x09,0x48,0x26,0xfe,0xdb,0x44,0x30,0x1f,0x66,0x04,0x1f,0x82,0x25,0x0b,0xe2,0x3c,0x1d,0x51,0xb8,0xf3,0x12,0xea,0x48,0x5b,0x38,0xde,0xc5,0x07,0x0b,0x75,0x05,0xeb,0x1f,0xe1,0x03,0xfc,0x4d,0x55,0xc8,0xbd,0x09,0xca,0x02,0xf3,0xfc,0xf6,0xf4,0xac,0xed,0xd7,0x62,0x51,0xa7,0x17,0x03,0xb4,0x2b,0x04,0xd9,0xef,0xc1,0xb2,0xf4,0xaf,0xe0,0x30,0x1b,0x26,0xb8,0x09,0xfa,0xb8,0x0f,0xfc,0xef,0x11,0x02,0x65,0x7c,0x02,0xc2,0x4e,0x2e,0xee,0x17,0x0a,0xfe,0xf5,0x06,0xc6,0xfc,0x8d,0xe8,0xe2,0x2c,0x01,0xec,0x13,0x09,0xbb,0x09,0x0a,0x0b,0xfa,0xf9,0xa8,0xf9,0xa0,0xdb,0xff,0xea,0xf9,0x01,0x08,0xc2,0xb2,0x29,0x7f,0xf0,0x12,0x0d,0x8d,0xf4,0xc0,0xfa,0xfb,0x23,0x7f,0xf0,0x5f,0xf7,0x35,0x02,0xf1,0xfd,0x03,0x11,0xe7,0xeb,0x39,0x4b,0x41,0x3f,0x0d,0x2d,0xfc,0x02,0x12,0x07,0x24,0x37,0xe7,0xf1,0x31,0xd7,0x54,0xf2,0x02,0x07,0xf0,0x53,0xf9,0x26,0xdb,0xea,0x2c,0xf3,0xec,0x29,0x2f,0x26,0x1c,0xef,0x02,0x04,0x39,0xe7,0xfb,0xd9,0xff,0x00,0xf6,0x2f,0xe4,0xd4,0xf2,0x4b,0xce,0x52,0xf0,0x35,0x3d,0x52,0x2e,0xf8,0xec,0x03,0x1e,0x2d,0x47,0xf9,0x08,0x48,0xe5,0x46,0xfd,0xf3,0x3b,0x32,0x2c,0xe4,0xfd,0x03,0x02,0x31,0x36,0x3a,0xf0,0xf6,0xf0,0x59,0xd6,0x25,0x7f,0xff,0x67,0xed,0x33,0xeb,0xf3,0x0f,0xfd,0xf0,0xd3,0xfb,0x1e,0x3f,0x40,0x34,0x1c,0x24,0xdf,0xd3,0xeb,0x13,0x2f,0x18,0xda,0xf2,0x25,0xdf,0x5e,0x16,0x2c,0x1d,0xdd,0x4e,0x01,0x2e,0xbf,0x1a,0x35,0xf3,0xe0,0x25,0x28,0x2b,0x0a,0xf6,0xdb,0xca,0x1d,0xf3,0xc1,0xb8,0x0e,0x0e,0x02,0x38,0xe4,0xeb,0x0f,0x37,0xd6,0x2f,0xf3,0x38,0x2e,0x56,0x31,0xff,0x08,0x09,0x20,0x16,0x33,0x1f,0x32,0x36,0xcf,0x40,0xff,0x09,0x26,0x32,0x21,0xea,0x17,0xfd,0xc9,0x22,0x3b,0x39,0x1c,0xe3,0x15,0x3d,0x36,0xf3,0xc4,0x06,0xb2,0x09,0xf6,0x37,0x20,0x13,0xf8,0xfe,0xe4,0xfe,0xfd,0xe2,0xd7,0x02,0x3b,0x0a,0xeb,0x24,0x1e,0x1d,0xe2,0xe6,0xe8,0xe3,0xff,0x12,0xf3,0x2f,0x27,0xee,0xfb,0xca,0xd4,0xab,0x24,0x1c,0xd3,0x0e,0xe0,0x0a,0xf4,0xfa,0xde,0xfd,0x3f,0x1e,0xf4,0xf5,0x4c,0x4e,0xe6,0x0e,0x06,0xe8,0x0e,0x2b,0x22,0xe3,0x17,0xe0,0x01,0x81,0xe4,0xf0,0xd9,0xd6,0x14,0x14,0xf2,0x05,0xea,0xec,0x2f,0xf3,0xe9,0xe3,0x06,0x09,0xf6,0x0c,0xe4,0xff,0x1f,0xf8,0x12,0xd2,0xb7,0xe2,0x2b,0x19,0x29,0x07,0xf1,0x25,0x6f,0xce,0xae,0xfd,0xfd,0x27,0xea,0x02,0xe1,0xfe,0x0f,0xed,0x14,0x6f,0x4a,0x54,0xf2,0x30,0x0c,0x09,0xee,0xf0,0x2a,0x1b,0x36,0xb6,0x4d,0x9b,0x48,0x02,0xf2,0xef,0x1c,0x1a,0xd5,0x0f,0xe3,0xf1,0x36,0xcf,0x14,0x34,0x35,0x5d,0x0b,0xd3,0x1c,0xe3,0x49,0x13,0xee,0x06,0xf1,0xff,0xf4,0x32,0xf7,0xeb,0x0b,0x14,0xbc,0x57,0x0f,0x0c,0x61,0x7f,0x2d,0x20,0xd1,0xed,0x34,0x5e,0x54,0xea,0xeb,0x47,0x21,0x12,0xec,0xd7,0x17,0x57,0xfb,0x1a,0xfc,0xc9,0xf6,0x39,0x67,0x21,0xfc,0xd9,0xcf,0x61,0x07,0xcf,0x81,0xfe,0x90,0x1c,0xcb,0x26,0x07,0x0f,0xfc,0x0d,0x1f,0x10,0xd8,0xd1,0xd0,0xd6,0xf5,0xf7,0x14,0x1e,0x19,0x12,0xc7,0xdd,0x25,0xf1,0xdb,0x40,0xb0,0x04,0xfc,0xe5,0x19,0xce,0x01,0xb5,0x4e,0x14,0xc1,0x10,0x24,0xed,0xba,0xdb,0xf2,0xf8,0x0f,0x1b,0xe3,0x0e,0x33,0x4f,0xfe,0xf4,0x09,0xd2,0x2c,0x35,0x07,0xc1,0x5b,0xc9,0x18,0xa5,0xe4,0xb0,0xcb,0xe3,0xfd,0x06,0xe1,0xca,0xc4,0xeb,0x01,0xb2,0x2f,0xb8,0xf2,0xf8,0xc2,0xcb,0xe1,0x35,0x11,0x08,0x11,0xd4,0xbc,0xc9,0x12,0x08,0x0f,0xc3,0xf6,0x36,0x7f,0x05,0x6a,0xe8,0x3f,0xe6,0xf6,0xeb,0xdb,0xf1,0xf4,0xfe,0x45,0x47,0x3b,0x39,0xe5,0x1b,0xda,0xf8,0xf4,0xce,0x32,0x2b,0xf3,0xfe,0x36,0xa8,0x65,0xd8,0xd1,0x15,0xef,0x6d,0xf3,0x45,0xb9,0xd9,0x54,0xf5,0xea,0x03,0x3f,0x34,0x19,0xf4,0xdd,0x08,0x43,0xf5,0xd4,0xcf,0x13,0xf8,0xf2,0x32,0xdb,0xce,0xe6,0x4a,0x87,0x5f,0xf8,0x52,0x31,0x67,0x46,0x09,0xc1,0x12,0x34,0x45,0x4a,0x05,0xd5,0x38,0xe2,0x61,0xf5,0xed,0x31,0x31,0x40,0xca,0xd6,0xf8,0xf7,0x30,0x56,0x47,0xc8,0xdf,0xda,0x5f,0xdc,0x2b,0x7f,0x01,0x6a,0xe4,0x40,0xf6,0xe9,0xf7,0xe8,0x02,0xde,0x00,0x3f,0x47,0x44,0x45,0x17,0x23,0xe3,0xf0,0xe2,0x00,0x31,0x37,0xde,0x01,0x2c,0xc5,0x75,0x0d,0x18,0x12,0xf5,0x5c,0xf3,0x45,0xb6,0xee,0x48,0xeb,0xe1,0x29,0x41,0x30,0x1f,0xee,0xd9,0xd7,0x41,0xfa,0xcb,0xc8,0x21,0x09,0xff,0x2e,0xdc,0xcd,0xf0,0x40,0xc3,0x59,0x04,0x53,0x44,0x6e,0x3b,0x02,0xeb,0xf6,0x21,0x32,0x55,0x2b,0x16,0x40,0xef,0x52,0x0d,0xf5,0x41,0x31,0x3d,0xec,0x06,0xfa,0xcd,0x33,0x50,0x47,0x0b,0xec,0xfa,0x49,0xf1,0x3c,0x7f,0xf1,0x2d,0xf6,0x3a,0xe7,0xe2,0xe7,0xde,0x00,0xf5,0xe3,0x21,0x51,0x47,0x36,0xd6,0x24,0xf8,0xf6,0xe5,0xe5,0x2e,0x2e,0xec,0x03,0x24,0xe2,0x5b,0xee,0xda,0x12,0x13,0x42,0x0d,0x35,0xd3,0xd9,0x44,0xef,0x09,0x0f,0x39,0x17,0x2f,0x04,0xe6,0xea,0x21,0xee,0xe4,0xc8,0x12,0xf3,0xf1,0x2f,0xf8,0xec,0xd7,0x3d,0xe6,0x43,0x00,0x4c,0x29,0x64,0x2a,0x0b,0xed,0x03,0x2a,0x22,0x2d,0x2e,0xde,0x5a,0xf7,0x2e,0xff,0xf4,0x47,0x2a,0x34,0xfd,0xeb,0xf4,0xe0,0x27,0x4f,0x2a,0xe9,0xf4,0xdd,0x59,0x00,0x00,0x00,0x00,0xb6,0xe4,0xfe,0xff,0x04,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x61,0xd8,0xc1,0x71,0x0e,0xb7,0x65,0x7f,0x01,0xcd,0xf2,0xd1,0x1d,0xc8,0xd4,0xa0,0xcb,0x66,0xff,0x41,0x9c,0x53,0x32,0xf9,0x7f,0x51,0xe5,0x4c,0x91,0x6d,0x74,0x29,0xf0,0xf0,0x7f,0xd1,0xae,0x4d,0x1b,0x4f,0x48,0x22,0xf4,0xef,0xf3,0x64,0x6f,0x40,0x39,0xe9,0xe0,0x7f,0x15,0xc3,0x5a,0x44,0x08,0xe9,0x15,0xc5,0x08,0xda,0xce,0xae,0x13,0xc2,0x58,0x13,0xc4,0x12,0x23,0x7f,0x51,0x13,0x0d,0xf8,0xf1,0x62,0x38,0x0b,0x59,0xc4,0x33,0xa3,0x9a,0x28,0x97,0x4e,0x75,0x3d,0xe7,0x63,0x17,0x7f,0x4c,0x20,0x39,0xf6,0x59,0x1f,0x9b,0x3d,0x70,0x62,0x30,0x03,0xce,0xde,0xe0,0x7f,0x7a,0x28,0x3c,0xf1,0xb0,0x09,0x6f,0xb5,0x5d,0x47,0xb1,0x87,0x1c,0x7f,0x78,0xa2,0xe0,0x9c,0x1d,0xcf,0x0c,0x35,0xdd,0xff,0x58,0x7f,0x17,0x09,0xfb,0xd1,0xcc,0x1a,0x1f,0xf2,0xc4,0xf8,0x12,0x81,0xfb,0xf6,0x92,0xb8,0xfc,0x0a,0x41,0x27,0x1d,0xc0,0x05,0x28,0xc4,0x2b,0x25,0x8f,0xf5,0x0e,0x81,0x96,0xe0,0xe8,0x26,0x5e,0x1c,0xf9,0xe8,0x19,0xf3,0xb2,0xcc,0x1c,0x7f,0x16,0x99,0xd4,0xce,0x97,0x03,0x06,0xc9,0xdc,0xcd,0xd6,0xdc,0xc9,0xf7,0x81,0x5a,0xea,0x93,0xbe,0xcf,0xc9,0x44,0x3a,0x32,0xa0,0xc2,0xd3,0xdb,0x24,0x7e,0x81,0xe2,0x5a,0xa7,0x36,0x36,0x37,0xcb,0xc8,0xc7,0x19,0xf7,0x25,0x12,0x7f,0x7c,0x0f,0xa8,0x47,0x39,0x03,0x3f,0x5c,0x9a,0x45,0x82,0x14,0x1e,0x4d,0x9c,0x02,0x7f,0xaf,0xad,0x52,0x0b,0x08,0x1e,0x4d,0x27,0x1f,0x02,0x2b,0x47,0x46,0x05,0x0a,0x7f,0xad,0xa6,0x5d,0x39,0x1c,0x40,0x39,0xce,0x23,0xea,0x28,0x22,0x3f,0xfb,0x14,0x36,0xc5,0xb9,0x73,0xcd,0xd9,0x58,0x2b,0xd5,0x3a,0xa3,0x45,0x7f,0x25,0x4c,0x09,0x11,0x7f,0xbe,0xe7,0x56,0x5e,0x12,0xfb,0xa5,0x8e,0x86,0x30,0x30,0x19,0xad,0x35,0x7f,0xa4,0xe7,0x72,0x9e,0xe1,0x4b,0x1b,0x28,0x43,0xba,0xe1,0x0a,0x1d,0x11,0xe9,0xc1,0xa0,0x60,0xde,0xf4,0x0b,0xb1,0x96,0x49,0x33,0x7f,0x97,0xc1,0x9e,0x41,0x0b,0xaa,0x73,0x2c,0xbb,0x7f,0x35,0xc5,0xea,0xff,0xf8,0x1f,0xba,0xe9,0x94,0x73,0xe3,0xbb,0x74,0x34,0x87,0x78,0x7f,0xbf,0x95,0xe9,0xdb,0x11,0xd3,0xa0,0xc3,0x2a,0x16,0x16,0x7f,0xe0,0xfc,0x3c,0x29,0x09,0x0e,0xc8,0x99,0xac,0x36,0x10,0xfe,0xb9,0x37,0x48,0x56,0xbc,0x7f,0x07,0xcb,0x46,0x64,0x8f,0x35,0x91,0x6b,0x15,0x33,0x05,0x53,0x6e,0x87,0xb5,0x3f,0xdc,0x1c,0x7f,0x5c,0x54,0x18,0xb2,0x05,0x4c,0x39,0x49,0xf8,0xff,0x7f,0xee,0xec,0x51,0x41,0x14,0xfe,0xc3,0x8f,0xc5,0xf4,0x06,0xe3,0x58,0x00,0xd2,0x77,0x19,0xfe,0x56,0x7f,0x19,0xd3,0x0b,0xeb,0x0c,0xde,0xd7,0xab,0xf5,0x7a,0x21,0x4a,0xb1,0x7f,0x11,0xba,0x76,0x70,0xc6,0xf0,0xa6,0x32,0x69,0x24,0x07,0x9e,0xd4,0xc9,0x59,0xdb,0x81,0x29,0x19,0x89,0x55,0x66,0x06,0xca,0xa4,0x9c,0x0e,0x25,0x7f,0x37,0xae,0x56,0x51,0x6b,0x60,0x57,0xcc,0x17,0xcd,0x5d,0x70,0x20,0x5e,0xe7,0x9e,0x06,0x29,0x81,0xd9,0x26,0xd3,0xa6,0x62,0x90,0x44,0xac,0xc4,0xbc,0x34,0xb3,0xb7,0x7f,0xff,0xb9,0x2a,0x4d,0xfc,0xc8,0x07,0x84,0x00,0xe9,0xbd,0xdf,0x54,0xdd,0x9a,0x03,0x29,0xa4,0x24,0x1d,0xb7,0xb3,0x5d,0x9f,0x7d,0x84,0x81,0xdb,0xe6,0xd6,0x12,0xae,0x2d,0xeb,0x81,0xd0,0xd0,0xe2,0x4d,0x35,0x39,0xb2,0xcb,0xcc,0xfa,0xee,0x7f,0x9b,0xab,0x0f,0xfb,0x25,0x7f,0x39,0xd7,0x1e,0xb2,0x76,0x62,0x39,0x63,0xc3,0xef,0x42,0xfd,0xbf,0x47,0x51,0xf3,0xd6,0x17,0x81,0x2a,0xf9,0xf2,0xe2,0x9d,0x35,0x75,0xd1,0xb6,0x30,0x14,0x17,0x63,0x28,0xef,0xf3,0xbc,0x7f,0x77,0x55,0xf6,0xd8,0xc2,0xb6,0x55,0xd2,0x81,0xfa,0xbe,0xb0,0x32,0x40,0x22,0xe2,0xc0,0xbf,0xd2,0x0a,0x2b,0x91,0x1b,0xf9,0x81,0xb8,0xf0,0x10,0x3d,0x3f,0x01,0xda,0x0c,0xec,0xeb,0x69,0x32,0x0b,0xa2,0x50,0xb3,0xc7,0x7f,0x2a,0xaf,0x46,0x90,0x5c,0x2a,0x19,0x9e,0x39,0x70,0x81,0x91,0x49,0x05,0xe4,0x48,0x41,0x3b,0x10,0xd0,0x7f,0x56,0x08,0x00,0xdc,0xa2,0xb8,0x7f,0xab,0x93,0x12,0xa0,0x9d,0x5b,0x47,0x7f,0xae,0xcd,0xa1,0xec,0x68,0x53,0xec,0x82,0x3f,0x17,0xb7,0x2d,0x4c,0x10,0x38,0xe7,0x62,0x70,0x7f,0xce,0x73,0x26,0x5c,0xac,0x56,0x51,0x1a,0x7f,0x67,0xc8,0x0b,0xb2,0x6f,0x71,0x3d,0xd2,0x6b,0x7b,0x81,0xf1,0x20,0xcb,0x89,0x6b,0x71,0xe2,0x66,0xcb,0x13,0x10,0x5c,0xb6,0x7f,0x4b,0xc1,0xab,0x45,0xee,0xbc,0x73,0x64,0x38,0x3c,0xa6,0xd2,0x4c,0x65,0x14,0x03,0x72,0xf9,0x0f,0xfd,0x81,0x48,0x3e,0xe5,0xd7,0x51,0xc3,0x65,0xe5,0xce,0x5d,0xa8,0xa0,0x7f,0x3f,0xb2,0x50,0x3f,0xca,0xbb,0xe0,0x8d,0x2f,0x9e,0xc6,0xdc,0x56,0xde,0xaa,0x7f,0x50,0xbe,0x6a,0x60,0xda,0xc6,0xee,0xd7,0xf7,0xf1,0xdd,0xab,0xf3,0x66,0x2e,0x2b,0x96,0x2a,0x2a,0x28,0x7f,0x6a,0x96,0xdb,0x88,0x16,0x2f,0x39,0x48,0xf1,0xfb,0x7f,0xf9,0xe6,0x53,0x4a,0x23,0x1b,0xe3,0xc7,0xe6,0x1c,0x04,0xdf,0x14,0xfc,0xb8,0xfa,0x32,0xeb,0xb0,0xc3,0x8d,0xa9,0x3a,0xf0,0x38,0x81,0xc1,0xb9,0xd0,0xbc,0x04,0x95,0x47,0xd9,0x81,0xe2,0xd0,0xbf,0x47,0x56,0x28,0xb8,0xd3,0xda,0x28,0xe8,0xe2,0xc5,0x44,0xc0,0x0a,0xcb,0xa7,0xd3,0x58,0xf2,0x7f,0xb7,0xca,0xdf,0x17,0xb9,0xa5,0xa9,0x29,0xa9,0xf5,0xb6,0x9d,0xff,0x39,0xc2,0x7f,0x91,0xc0,0xdd,0xd9,0x3e,0x73,0x81,0xc2,0x78,0xec,0x32,0x18,0xf4,0xb5,0x57,0x0a,0xef,0x0e,0x60,0xd9,0x41,0x56,0xa4,0xc3,0x63,0xc5,0x81,0x3f,0x2a,0x16,0x61,0x97,0x47,0x26,0x46,0xc8,0xe7,0x7f,0x93,0xed,0x5b,0xdd,0x63,0x75,0x2a,0x04,0xea,0xff,0x68,0x5c,0x33,0xec,0x1b,0x09,0x8a,0x2a,0x28,0x96,0xb4,0xa5,0xf0,0x56,0x7f,0x44,0xba,0xdb,0xf4,0xc2,0x04,0x27,0x95,0x2a,0xd1,0x95,0xbc,0xca,0xe6,0x78,0x7f,0x24,0xe1,0x04,0xbd,0x08,0x61,0x51,0x71,0xb7,0x0f,0x4e,0x0c,0x47,0x41,0x82,0x00,0x81,0x5a,0x56,0x19,0x1a,0xb5,0xc2,0x40,0x45,0x97,0x24,0x7f,0x15,0xbf,0x08,0xcf,0xf2,0x07,0xfa,0x95,0xe8,0xf2,0x6d,0x81,0xe6,0x2d,0xd5,0x23,0x24,0x15,0x0a,0x4b,0xe0,0x2a,0x2a,0x35,0xd6,0xe3,0xd1,0xa1,0x57,0xe3,0x81,0xd3,0xe2,0x0c,0x54,0xfe,0x46,0xd9,0x0e,0xbc,0x58,0xa8,0x01,0x26,0x35,0xe8,0x63,0x7f,0x10,0xbb,0xfd,0x92,0x25,0x46,0xf2,0xb8,0xfc,0x46,0x7f,0xea,0x93,0x55,0x04,0xf6,0x31,0x62,0x03,0x02,0xc8,0x62,0x42,0x59,0x2c,0x23,0x48,0xc6,0xd5,0x41,0x21,0x3f,0x7f,0x34,0x00,0xfa,0xbd,0x5e,0x50,0x0a,0xa7,0x66,0x0f,0x12,0xb9,0x56,0xb0,0xef,0x36,0x12,0xaf,0x2c,0x81,0x63,0x48,0x47,0xa7,0x1e,0x27,0x1a,0xfa,0x26,0x2e,0x06,0x76,0x33,0xc5,0x7f,0xb2,0xf3,0x44,0x58,0xe8,0x13,0x50,0x81,0x06,0x39,0x88,0xcb,0x01,0x02,0x3c,0x6f,0x15,0xf1,0x10,0x13,0xd7,0x08,0x22,0x0e,0xee,0x3b,0x05,0x23,0x7f,0xe4,0xd3,0xe2,0x19,0x01,0x5a,0xef,0xc8,0x7f,0x33,0xf6,0xb6,0x3b,0x9a,0xa9,0x4a,0x62,0x03,0x1e,0xd6,0x38,0x15,0x21,0x02,0x1e,0x59,0xb0,0x8f,0x4d,0xc8,0xea,0x7f,0x50,0x25,0x18,0xba,0x25,0x77,0x5f,0x06,0xeb,0x6f,0x81,0x9f,0x4a,0x04,0x1c,0x1d,0x32,0x03,0x44,0x10,0x2c,0x30,0x0b,0x2c,0xbf,0xe4,0x9f,0x2e,0xf4,0xf9,0x0a,0xa5,0xe8,0x68,0xf4,0x7f,0x84,0xc4,0xf6,0x25,0xf8,0xfd,0x7f,0x11,0xe5,0x60,0x66,0xfe,0xd0,0xf7,0xb3,0xea,0x1c,0x1e,0xf8,0xcf,0xd8,0x7f,0xbd,0xa0,0x19,0xef,0x35,0x3f,0x3b,0x1b,0x36,0xe8,0x49,0x63,0x4c,0x4e,0x12,0xdd,0x7f,0x00,0xf5,0x52,0x3d,0xf2,0xe7,0xc5,0xa2,0xdc,0x03,0xfa,0xdd,0xe2,0xe0,0x60,0xbc,0xbe,0x2e,0x06,0x5d,0x73,0x3c,0x05,0x1c,0xdf,0x7f,0x51,0x32,0xec,0xde,0xdb,0x81,0x3b,0x30,0xdf,0x05,0xe4,0xbb,0x38,0x1e,0x0e,0xed,0xe6,0xe8,0xbe,0x1b,0x30,0x82,0xc9,0x1c,0xa1,0x81,0xdb,0xf6,0x4d,0x6a,0x0e,0xde,0x28,0x4d,0xe4,0x4f,0x7f,0x20,0x89,0x26,0x1c,0x29,0x24,0x6e,0xc6,0xfc,0x91,0x66,0x71,0x33,0x9b,0x34,0x2d,0x0c,0xa3,0x08,0xde,0xe5,0x52,0x41,0xd0,0x0e,0xc8,0x7f,0x52,0x45,0xe6,0x58,0x48,0x3f,0xa3,0x55,0x1f,0x3b,0x6a,0x4e,0xba,0x15,0xb0,0x2e,0x7f,0x3a,0x22,0xf0,0x93,0x7f,0x19,0x8b,0x67,0x57,0xeb,0xe4,0x31,0xd8,0x33,0xcc,0xb5,0x91,0xda,0x0d,0x22,0x81,0xf1,0x13,0x88,0xbe,0xde,0xf1,0x20,0x16,0x03,0xec,0x06,0x09,0x5d,0xed,0xc2,0x7f,0xf7,0xcc,0x45,0x6f,0x09,0xc7,0x0a,0xad,0xfc,0xde,0xdb,0xb2,0x73,0xc5,0xb6,0x7f,0x1f,0xd6,0x73,0x39,0xdc,0xc9,0xec,0x8c,0x14,0xf8,0xb3,0x9e,0xcf,0x3a,0x46,0xaf,0xb4,0x3f,0x3a,0x42,0x6f,0x43,0x03,0x2f,0xfa,0x7f,0x62,0x07,0x1a,0x05,0x76,0x00,0xcd,0x49,0x50,0x3d,0x7d,0x0e,0xfa,0xe2,0xaa,0x7f,0x43,0x22,0x02,0x3d,0x2e,0x7f,0xb4,0x38,0x2e,0x03,0x5b,0x40,0x8b,0xe0,0x89,0x67,0x3e,0x3a,0xc4,0x06,0x0e,0xa4,0x0a,0x0c,0x81,0x95,0xf1,0xf9,0x1f,0x07,0xf3,0xf3,0x05,0x1b,0x23,0xd9,0x7f,0x86,0xa8,0x0c,0x9d,0x63,0x78,0x6e,0xe5,0x48,0xb6,0x4c,0xf8,0x74,0x4b,0x03,0xce,0x71,0xe5,0xe6,0x47,0x2c,0xef,0xf4,0xcb,0x81,0xf7,0xed,0xfb,0x04,0xb7,0x04,0x7a,0xaf,0xb1,0x18,0xdf,0xe5,0x7f,0x3b,0x00,0x54,0xcc,0x6b,0x58,0x0a,0x00,0x00,0x00,0x00,0xc6,0xea,0xfe,0xff,0x04,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xd0,0x09,0xdf,0x02,0x00,0x15,0x15,0xbe,0xdd,0xe9,0xe3,0x0c,0x0a,0x6f,0x0a,0xf9,0xcc,0xfc,0xfd,0xfe,0xfa,0x1d,0xd4,0xcc,0xff,0xbf,0x7f,0x0f,0x3f,0x03,0xe3,0x17,0xb3,0xe5,0xd9,0xe5,0x0d,0xf7,0xfd,0xfc,0xfe,0x0c,0x0b,0x12,0xf1,0x0d,0xd4,0x04,0xf5,0x35,0x1c,0xd7,0x78,0x0f,0x11,0xdf,0xed,0x0f,0x0f,0x08,0x0b,0x08,0x02,0x21,0xea,0xfb,0x49,0xf6,0xef,0x81,0xfc,0xff,0x1e,0xfc,0x08,0xe9,0x2d,0xf8,0x96,0x48,0x04,0x0c,0xdb,0xfa,0xd5,0x25,0x23,0xf9,0x27,0x3b,0x3e,0x22,0x16,0x00,0x24,0x06,0x04,0xeb,0xfa,0xed,0x16,0x07,0xf0,0x21,0xf5,0xad,0xf6,0x0c,0xa7,0xf2,0xf1,0x30,0xdb,0x20,0x42,0xfa,0x05,0xe5,0xf1,0x0d,0x05,0x04,0x57,0x0a,0xf3,0xa0,0xec,0xf1,0x63,0x01,0x1c,0xde,0x3a,0x01,0xcc,0x4b,0xfb,0xdd,0xbf,0x03,0x81,0x40,0x2e,0x01,0xff,0x3a,0x68,0x34,0x02,0xfe,0x25,0x00,0xfe,0xe2,0x2e,0xf8,0x18,0x05,0xfe,0x3b,0x07,0x9f,0x08,0x42,0x8f,0xe8,0xee,0x06,0xba,0x2d,0xd0,0x0b,0xf4,0x1f,0x0c,0xba,0xf5,0xd5,0xec,0x00,0xf0,0x66,0x02,0xe9,0xf8,0x0a,0xd9,0xf5,0xf5,0xfa,0xc0,0x13,0xfa,0xc4,0x7f,0x0e,0x33,0xee,0x11,0x11,0x9e,0xfc,0xf5,0xe5,0x16,0xef,0x1f,0xf4,0xdb,0x02,0x1d,0x19,0xf3,0x07,0xcf,0x18,0xeb,0x1b,0x32,0x00,0x5f,0xfa,0x11,0xf1,0x39,0xde,0xc4,0x01,0xfe,0x12,0x0a,0xfe,0x0a,0xfd,0xa2,0xf8,0x0b,0x51,0x0e,0x0a,0x98,0x02,0xf0,0x26,0xcf,0xfd,0x52,0xb7,0x04,0x3d,0x17,0xfc,0x7f,0xcb,0xd4,0xf7,0x16,0xbb,0xa8,0xd6,0xf7,0xfb,0xd1,0x07,0x01,0x1c,0xd6,0x06,0xe1,0xf8,0x0f,0xc8,0xfa,0x5f,0xf1,0xc0,0x60,0x16,0x13,0xfb,0xde,0x20,0x46,0x00,0x08,0xed,0xf4,0x10,0xfb,0x09,0x58,0xff,0xfc,0x84,0xf5,0xf5,0x60,0x06,0x10,0xdd,0x36,0xfe,0xc8,0x55,0x05,0xe1,0xae,0x01,0x82,0x3b,0x2a,0xf7,0x09,0x44,0x61,0x2c,0x07,0x02,0x2a,0xff,0x08,0xe8,0x15,0xf0,0x21,0xfe,0x03,0x32,0x0c,0x8e,0xf7,0x42,0x81,0xeb,0xe4,0x0b,0xa1,0x22,0xe1,0x05,0xf3,0x1c,0x10,0xa9,0xf5,0xe4,0xe5,0x07,0x01,0x77,0x03,0xec,0xf1,0x02,0xeb,0x03,0xf9,0x11,0xce,0xe9,0xff,0xa4,0x73,0x16,0x1d,0xef,0x02,0x0c,0x81,0xe7,0xf1,0xf3,0x0f,0xf3,0x07,0x01,0xe6,0x02,0x17,0x23,0x00,0x0a,0xd7,0x16,0xf2,0x20,0x30,0x0a,0x6c,0x03,0x0f,0xcf,0xca,0x2a,0xeb,0xf7,0xfa,0x0d,0xfd,0xb9,0x12,0xe0,0xe2,0x09,0xff,0x7f,0xf6,0xec,0xf8,0x09,0xf6,0xfd,0xfa,0x05,0x18,0xea,0xf6,0xb9,0x43,0x19,0x14,0x00,0x03,0x0f,0x90,0xdb,0xf8,0xf6,0x06,0xeb,0x02,0xfa,0xe9,0x05,0x32,0x1a,0xf0,0x09,0xf0,0x0a,0x01,0x31,0x35,0x0d,0x51,0xf7,0x06,0xda,0xb6,0x42,0x45,0xf2,0xf6,0xe2,0xdd,0xee,0x09,0xe6,0x64,0xfe,0xd7,0xd3,0xe8,0xd8,0x63,0x06,0x16,0xd5,0x4b,0xeb,0xca,0x4d,0xf2,0xb1,0xe9,0x03,0x87,0x40,0x46,0x08,0xca,0x35,0x7f,0x39,0x07,0xf2,0x3f,0xed,0xe3,0xd5,0x4c,0xfd,0x18,0xf5,0xe9,0x49,0xf0,0xa8,0x2c,0x4b,0xb5,0xd9,0xe3,0x13,0xd1,0x28,0x42,0xfc,0x03,0xe8,0xee,0x07,0xf7,0x0a,0x60,0x02,0xf0,0x93,0xee,0xf6,0x68,0x00,0x07,0xd6,0x33,0xf9,0xa4,0x61,0xfa,0xd3,0xd5,0xfb,0x81,0x34,0x35,0x01,0xfe,0x4e,0x61,0x20,0x06,0x02,0x36,0xfd,0x03,0xe4,0x1d,0xf2,0x20,0xfb,0xf8,0x35,0xff,0x8c,0x0c,0x43,0x8b,0xe6,0xf2,0x0b,0x61,0xbe,0x1d,0x09,0x04,0xf5,0x0a,0x32,0x2c,0x1c,0xee,0xf5,0x0e,0xd6,0x0b,0x10,0xee,0xfd,0x36,0x16,0x0c,0x15,0x7f,0xbc,0x07,0x4a,0x9e,0xf3,0x06,0xf6,0xef,0xe1,0x68,0xe6,0xd6,0x00,0x04,0x08,0xcf,0x0c,0x14,0x03,0x00,0xf3,0xfc,0xf8,0x32,0xcc,0x17,0x20,0xcd,0xe4,0xd4,0x08,0xf8,0x04,0x30,0xf4,0x29,0xfc,0x03,0xe7,0xe7,0x11,0x30,0x14,0x10,0xfe,0x05,0xd0,0xfa,0x04,0x12,0xfc,0x08,0xfe,0x06,0xfb,0x55,0x08,0x0a,0x20,0x81,0xf8,0xc9,0x0b,0xfd,0xf6,0x23,0x04,0x12,0x19,0xf5,0x06,0xff,0x08,0x14,0xf5,0x03,0xef,0x0c,0xf6,0x27,0xf0,0x0e,0xf7,0xe2,0x0e,0xae,0x02,0xef,0x11,0x5a,0xa5,0xc4,0x12,0x04,0x17,0x1c,0x25,0x0b,0x28,0x88,0x0b,0x3c,0x2f,0x26,0x35,0x94,0xf1,0x03,0x2e,0xc9,0x21,0x5b,0x87,0x09,0x50,0xfa,0xfb,0x5d,0xca,0xb6,0xe8,0x44,0xc7,0x81,0xe3,0xf4,0x15,0xa7,0x21,0x2e,0x2f,0xbd,0x01,0xf2,0x15,0x2e,0xa9,0x14,0x5f,0xc8,0xaf,0x4f,0x29,0x20,0xe1,0xa2,0x49,0x48,0xfc,0xec,0xee,0xe7,0xdd,0x03,0xe7,0x6a,0x02,0xce,0xf9,0xe2,0xc7,0x7a,0x0f,0xf6,0xd0,0x36,0xda,0xd1,0x4c,0xe4,0xa2,0xec,0x08,0x81,0x32,0x46,0x0f,0xa1,0x1b,0x7d,0x39,0x0e,0xf5,0x38,0xdc,0xd1,0xe7,0x60,0x16,0x14,0xf9,0xec,0x4f,0xf9,0x99,0x42,0x6b,0xb8,0xdf,0xd9,0x09,0xce,0x2a,0x42,0xfc,0x04,0xee,0xed,0x07,0x00,0x01,0x5b,0x04,0xe8,0xad,0xf1,0xec,0x69,0x01,0x10,0xd7,0x34,0xfb,0xbc,0x53,0xf5,0xce,0xcc,0x03,0x81,0x30,0x35,0x08,0xf4,0x3d,0x68,0x32,0x06,0xf9,0x34,0xf1,0xf4,0xdf,0x35,0xfa,0x1c,0xf8,0xf6,0x3d,0x05,0x95,0x0e,0x49,0x92,0xe5,0xe5,0x07,0xfb,0x0e,0x2c,0xf7,0x06,0xea,0xf2,0x3e,0xf0,0x1d,0x49,0x00,0x01,0x81,0xfd,0x09,0x48,0x01,0x07,0xed,0x25,0xff,0xbe,0x42,0x0f,0x03,0xb6,0xfa,0x95,0x2e,0x18,0xf4,0x2f,0x3a,0x4a,0x2a,0xfb,0x05,0x0e,0x01,0x06,0xf4,0x13,0xf3,0x1d,0xfb,0x07,0x25,0x13,0x99,0xf2,0x31,0x82,0xf6,0xee,0x13,0x00,0x00,0x00,0x00,0x56,0xee,0xfe,0xff,0x04,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x39,0x3e,0xd5,0xe7,0x92,0x9e,0x64,0x0a,0x7a,0xf0,0xf0,0x81,0x28,0x57,0x71,0x23,0x16,0xf4,0xe8,0xf3,0xf5,0xe9,0xdf,0x2a,0x1a,0x11,0x04,0x1b,0x1e,0x4e,0x1d,0xce,0x45,0xae,0x33,0xcc,0xfa,0xf1,0xf4,0x3d,0x81,0x49,0xf4,0xd9,0xe0,0xfe,0x1f,0x1e,0x03,0x1c,0xfa,0x13,0x0c,0x12,0x1d,0x0c,0x37,0x7d,0x0b,0xc4,0x7f,0xf6,0x70,0xca,0xfb,0xce,0xe0,0x61,0xd2,0x5b,0x3d,0xdc,0x17,0xe3,0xf9,0x0c,0xe8,0xe1,0x2a,0x04,0x0b,0xee,0xe3,0x14,0x08,0x61,0xfa,0xb6,0xed,0x10,0xff,0x9b,0xfd,0x64,0xf7,0xf1,0xc9,0xcc,0x13,0xfe,0xf5,0x81,0x43,0x10,0xdc,0xf3,0xcd,0xff,0x74,0x79,0x22,0xaf,0x66,0xf0,0xa6,0x0c,0xbd,0xff,0xfd,0x1d,0x4c,0x4d,0x0d,0xe2,0xa5,0x2b,0x56,0x61,0x22,0xe4,0xeb,0x1b,0xc2,0xfe,0xf7,0x1c,0x24,0xeb,0x09,0x7f,0x31,0x3b,0xf2,0xcc,0x6d,0x7f,0x2f,0xb6,0xc7,0x13,0x3b,0x70,0x20,0x12,0x44,0xdc,0x2b,0xbf,0xf7,0x1f,0xe5,0xd7,0x44,0x10,0x22,0xf7,0xb4,0x31,0xfb,0xfd,0xd2,0x46,0x10,0xdc,0x35,0x64,0x2d,0xb6,0x81,0xdd,0xfb,0x30,0x17,0xd5,0x3c,0x19,0x13,0xc2,0x07,0xcd,0x04,0x56,0xeb,0xcc,0xd9,0x0b,0x29,0x0d,0xc0,0x1f,0xac,0xc1,0x76,0x1d,0x53,0x02,0x8f,0x96,0x0e,0xe7,0x70,0x40,0x48,0x06,0x81,0xe9,0xb6,0xb8,0x0e,0x1b,0x05,0x01,0x12,0x62,0xb2,0xed,0xc0,0x55,0xc3,0x07,0x10,0x60,0x68,0xc7,0xcb,0x81,0x5b,0xea,0xe8,0x9a,0x14,0xdb,0x14,0x01,0x0f,0xb8,0x33,0x66,0xfc,0xb4,0x8f,0x25,0xd0,0x61,0x37,0xda,0x58,0x81,0x71,0x08,0x0b,0xeb,0xd9,0x36,0x07,0x47,0x12,0xf0,0xe1,0xf0,0x0a,0xf8,0xed,0x08,0xe6,0x1f,0x1a,0x03,0xfc,0x20,0xf2,0x66,0x55,0xe5,0x7f,0xb6,0x48,0x08,0xe0,0xfd,0x10,0x63,0x09,0x29,0xff,0x27,0x08,0x10,0xf2,0x0d,0xf2,0xf9,0x10,0xfb,0xf2,0xf2,0x26,0x1f,0x0d,0xc2,0xc0,0x1a,0xcc,0x30,0x01,0x00,0x20,0x22,0xd1,0xf1,0x4f,0xd9,0x7f,0x5f,0x40,0x02,0xbf,0x01,0xd2,0xee,0xe4,0x16,0xef,0xe9,0x02,0x46,0xe3,0x22,0x0a,0x0e,0x1c,0xb4,0xd7,0x35,0xec,0x11,0x7f,0x17,0x20,0xcd,0x97,0xd9,0xe3,0xef,0x1d,0x10,0xf8,0xff,0xdd,0x16,0x38,0x17,0xf6,0xe1,0x4d,0x0b,0xcc,0x2e,0x81,0xaa,0x07,0x4a,0x77,0x19,0x05,0x86,0x0c,0x4e,0x2c,0x19,0x07,0xe8,0xfe,0xfd,0x01,0x0c,0xf4,0x0a,0x00,0xfb,0xe8,0x1b,0xf5,0x23,0xe5,0xd0,0x1c,0x7f,0xe5,0xa0,0xd4,0x3c,0x3e,0x4b,0x32,0xcb,0x0b,0xca,0xed,0xbe,0x27,0xed,0xf7,0xe7,0xef,0x27,0x5b,0x3e,0xdf,0xcf,0xe4,0x1a,0x10,0x09,0x24,0xfb,0xe1,0x25,0xee,0xfc,0x7d,0x2b,0x55,0xb9,0x81,0xb5,0xd5,0xd0,0x0c,0xf0,0x0c,0xee,0xe7,0xff,0x3d,0x30,0xe4,0xbb,0x15,0x59,0x1d,0xb8,0x75,0x3d,0x55,0xba,0xd8,0xf6,0x00,0x50,0x81,0x2c,0x10,0xd1,0x0c,0xf4,0xf5,0x0b,0xf5,0xe9,0x09,0x11,0x16,0x0a,0xe9,0x0b,0xf5,0xfa,0x3f,0x07,0x36,0x99,0x3a,0x02,0xbf,0x07,0x3e,0x46,0xaa,0x1e,0xf0,0x30,0x81,0x79,0x28,0xed,0x34,0x42,0xe3,0x25,0xd0,0xfb,0x54,0x41,0x26,0x49,0x1b,0xc7,0x40,0x81,0x3f,0xd6,0xee,0xa7,0x48,0x4b,0x27,0x65,0xde,0x18,0xc9,0x18,0x4c,0x2f,0x08,0x43,0xfc,0xdb,0xd9,0x02,0x2c,0xdc,0x17,0x04,0x25,0xfe,0x27,0x13,0xd1,0xd7,0xc2,0x59,0x7f,0x42,0x3d,0xe8,0xe1,0x24,0xeb,0x01,0x09,0xe9,0x10,0x29,0xb2,0x09,0x0d,0x1f,0x10,0xfa,0x4b,0x7a,0x42,0xe6,0x40,0x81,0x23,0x01,0x00,0xf5,0x70,0x3c,0x01,0x47,0xfa,0x41,0xc7,0x41,0x02,0x2f,0xff,0x35,0x0c,0xdd,0xe1,0x0f,0x73,0x13,0xdf,0xdb,0xc7,0x34,0xf6,0xf1,0xcc,0x53,0x19,0x0c,0xfb,0xf1,0x3d,0x81,0xdf,0x19,0x1f,0xe7,0xdd,0x15,0xdc,0xdb,0x37,0xfe,0xf4,0xd1,0x01,0x23,0x19,0x28,0xba,0xf8,0xa9,0xf4,0x64,0x19,0x75,0xc9,0x81,0x8e,0xd2,0x51,0x46,0xe2,0x21,0xf9,0xe4,0x14,0xdc,0xb9,0x31,0x21,0x19,0xfa,0xee,0x22,0x39,0xf2,0xd8,0xcf,0xa5,0x40,0x0e,0xc7,0x34,0xe9,0xc6,0xb5,0xf2,0x5a,0x7f,0x2e,0xfb,0x05,0xfd,0x08,0xf5,0x10,0x01,0xf7,0xf7,0x03,0xfa,0x0f,0x01,0x54,0x1d,0xe7,0x3c,0x07,0x36,0xed,0xdf,0x04,0x7f,0x19,0x34,0x36,0xe5,0xd9,0xe7,0x02,0x18,0xc2,0xce,0xfc,0xca,0x1d,0x35,0x1f,0xf4,0x05,0x16,0x1c,0xd9,0x02,0x95,0xb0,0x65,0x2b,0x64,0x16,0xae,0x81,0x1c,0x1e,0x7b,0x5e,0x2c,0xf8,0xc5,0xf5,0xdb,0xe8,0xdb,0x29,0x10,0x10,0xf9,0x48,0xda,0xf9,0xcc,0x37,0x94,0xcb,0x2d,0x5c,0x6e,0xe5,0x9d,0x81,0xde,0x17,0xdf,0xbd,0x05,0xf9,0x02,0x0d,0x04,0xe8,0x1f,0x16,0x06,0xf4,0xeb,0x02,0x29,0x24,0x57,0x14,0x19,0x9d,0xd0,0x04,0xa1,0x75,0x74,0x3a,0x30,0xba,0x8a,0x1e,0xc8,0x19,0x27,0x3e,0x02,0x23,0xd1,0xbb,0xfd,0x12,0x7f,0x10,0x35,0x1b,0xeb,0x34,0xee,0x81,0x44,0x27,0x47,0xe6,0xe5,0xeb,0x32,0x7f,0x34,0x4e,0x0d,0x0f,0x04,0xc0,0x26,0x0c,0xac,0x34,0xef,0xf9,0xed,0x16,0x2a,0x63,0x40,0xf0,0x2d,0x81,0x12,0x0e,0x1f,0xf5,0x6f,0x24,0x17,0x46,0xe7,0x34,0xcf,0x31,0x1b,0x06,0x08,0x2f,0xec,0xfd,0xf7,0x14,0x4b,0x0f,0x44,0x5c,0x3d,0xfe,0x29,0x81,0x07,0x1d,0x0b,0xfb,0x73,0x2b,0xff,0x3a,0xd9,0x26,0xcd,0x37,0x0f,0x10,0x10,0x28,0xf0,0xe8,0xf4,0x07,0x4e,0x02,0x02,0xf4,0x99,0x16,0xa0,0x30,0x2e,0x00,0x5b,0x99,0x81,0x8e,0x26,0xd5,0x56,0xdf,0x49,0x04,0xb8,0x21,0xc5,0xaa,0x11,0x1b,0x1a,0xf2,0xdf,0x10,0x1c,0x17,0xc4,0x1a,0x9a,0xa6,0x4f,0x45,0x7c,0x0a,0xcb,0x81,0x2c,0x08,0x54,0x49,0x24,0x0a,0xc3,0xfa,0xcc,0xdc,0xfa,0x18,0xfa,0x05,0x14,0x4e,0x11,0xf2,0xd8,0xc7,0xb8,0x7f,0xdd,0xb9,0x1d,0x08,0x4e,0xc1,0x28,0x07,0x35,0x00,0x0a,0xe5,0xfd,0x03,0xea,0xf3,0xfc,0x05,0x1e,0x17,0xd1,0xed,0xaa,0x57,0x7f,0xbc,0x74,0x4a,0x5b,0xbb,0xad,0xff,0xee,0x53,0xec,0x33,0xe2,0xcd,0xe7,0x13,0x0b,0xff,0x14,0x1c,0xe1,0xfd,0xf1,0x14,0x05,0xcf,0x20,0x5c,0x30,0xd7,0x27,0x81,0x30,0xf7,0x0d,0xc6,0x2e,0x1f,0x29,0x3d,0xfd,0x28,0xd7,0x28,0x0b,0x1b,0x04,0x2b,0x02,0xdd,0xe6,0x0b,0x49,0xea,0xe2,0x4a,0x4a,0xeb,0x24,0x81,0x1e,0xf9,0xe0,0x05,0xda,0x43,0xc6,0x20,0xd7,0xbd,0xb4,0x0e,0x14,0x12,0x00,0x24,0xef,0xfc,0xfd,0x15,0x52,0x06,0xd4,0x7f,0x13,0xb6,0x2d,0x88,0x46,0xcf,0xd9,0xda,0xd6,0x39,0xfa,0x28,0x2c,0xcf,0xd9,0xde,0xff,0x02,0xc9,0x01,0xf8,0xff,0x20,0x1f,0x1c,0xf8,0xfe,0x11,0x0d,0xfa,0x07,0xc9,0xfb,0x05,0x04,0xd7,0x52,0x1e,0x7f,0xef,0xed,0x14,0xfb,0xfc,0xff,0x00,0xfd,0x0b,0xff,0xf1,0xf0,0xff,0xff,0xfb,0x01,0x12,0xf2,0xe0,0xe4,0xeb,0xef,0xfe,0xe5,0xd3,0x7f,0xe6,0xf9,0xf7,0x83,0xb2,0xef,0xdf,0x40,0x1e,0x02,0x4a,0xd5,0xe3,0x3b,0x2f,0xee,0xd0,0xb7,0x51,0x58,0xf3,0x30,0xca,0xe4,0x34,0xcd,0x58,0x0c,0x27,0xe1,0xa6,0x81,0x93,0xbc,0xf4,0x26,0xf7,0x06,0x1e,0xdb,0xfd,0x3d,0x4b,0x0f,0xc3,0x1f,0x04,0x12,0xf0,0x25,0x41,0xd4,0xdd,0xd3,0x6c,0x7f,0x46,0x27,0x04,0x0c,0x28,0x0b,0xde,0xf9,0xe3,0x0e,0x0d,0xa9,0x1c,0x1d,0x1c,0xdd,0xf4,0xd8,0x7f,0x74,0xb0,0x6a,0xb8,0x4d,0xd9,0xe7,0xe0,0x35,0x42,0x02,0x5f,0xfc,0x02,0xfb,0x0e,0x06,0x00,0x0c,0x13,0x02,0xf7,0xfb,0x04,0x27,0xf1,0x53,0x2a,0xe1,0xce,0x5a,0x3b,0x27,0x8f,0xf9,0x92,0x57,0x6b,0x7f,0x5b,0x22,0xad,0xf7,0xab,0x20,0xcd,0xfc,0xec,0x01,0x2d,0x3a,0xfd,0x95,0x13,0x44,0x2b,0x10,0xba,0xc8,0x33,0xd0,0xa7,0x06,0x20,0x7f,0xd6,0xd8,0x3d,0x06,0xdd,0xc8,0xff,0x13,0x25,0xff,0x35,0xf9,0xe4,0x33,0x4a,0x1f,0xb8,0xed,0x7f,0x6f,0xab,0x5c,0xfa,0x29,0xe7,0x8e,0xe0,0x2a,0x78,0xe8,0x46,0xd2,0xf7,0xd5,0xf4,0xf5,0x17,0xb8,0xc7,0xeb,0x27,0x56,0x28,0xe8,0xff,0x3b,0xe2,0xad,0x58,0x8b,0xbe,0x15,0x78,0x56,0xe9,0xbd,0x81,0x27,0xfa,0x44,0x44,0x1c,0x16,0xed,0xf6,0x0b,0x03,0x0d,0x0c,0xe8,0xce,0x07,0x4e,0x32,0x65,0x3c,0xfc,0x37,0x81,0x18,0x12,0x10,0xf9,0x73,0x33,0xfe,0x3f,0xd7,0x21,0xd3,0x2a,0x12,0x10,0x0c,0x23,0xfa,0xf3,0xf0,0x09,0x4e,0x0b,0x1b,0xb2,0xd4,0x1b,0xbe,0x7f,0xf3,0x07,0x2f,0x19,0x12,0xd8,0xf6,0x06,0x22,0xf7,0x37,0xeb,0xfb,0xfa,0x0c,0xe6,0xfa,0x2c,0xff,0xdb,0xa6,0x24,0x5b,0x4b,0xb8,0x46,0xba,0x9e,0x62,0x74,0x7f,0xe3,0x18,0xae,0xfe,0x7e,0x04,0x94,0x16,0x0d,0x2e,0xe6,0x19,0xd9,0xef,0x38,0x03,0xd8,0xe4,0xfa,0xf6,0x7f,0x48,0xee,0x2c,0x93,0x48,0x21,0x07,0xc8,0x16,0x19,0xc1,0x6f,0xb1,0x88,0xde,0x12,0x3c,0x0a,0x29,0x15,0x1e,0x09,0xf3,0xe2,0x11,0xf1,0x12,0x56,0x1d,0xc4,0x4e,0x10,0x46,0xd7,0xf9,0x04,0xdc,0x23,0x81,0x3f,0x23,0xec,0x07,0xff,0x01,0x02,0xf5,0xf6,0x13,0x0b,0x07,0x00,0x05,0x0c,0x2c,0x11,0xd5,0x2a,0x8c,0xa6,0x15,0x52,0x73,0xf8,0xd7,0x81,0xcd,0x4e,0xfd,0xdd,0xf3,0xfa,0x17,0x07,0x08,0x04,0x06,0x10,0x15,0xfc,0xf4,0x02,0x2d,0x2b,0xf9,0xea,0x23,0x1f,0xf7,0xc5,0xd3,0x40,0x7f,0x49,0x31,0xf5,0x04,0x14,0x00,0xd8,0xf5,0x07,0xe9,0x03,0xc6,0x25,0x27,0x2f,0xf3,0xff,0x31,0x23,0xdf,0xe4,0x33,0x7f,0xfa,0xb8,0xce,0x56,0x3a,0x4e,0x0a,0x06,0x25,0xdf,0x06,0xe6,0x05,0xf7,0xf9,0xee,0xef,0x1a,0x18,0xff,0xe0,0x1e,0x1f,0x0c,0x22,0x16,0x14,0x81,0xf1,0x34,0xf9,0xec,0x63,0x2c,0x7c,0xd3,0xd7,0x23,0xed,0xfa,0xe4,0x1c,0xf5,0x17,0xfd,0xe5,0xd1,0x02,0x08,0xfe,0x00,0x00,0x00,0x00,0x86,0xf4,0xfe,0xff,0x04,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x0d,0x81,0xc2,0xc6,0xe3,0x00,0x19,0xfc,0x10,0xec,0xf4,0x03,0x68,0xdc,0x2b,0xa0,0x4f,0xfd,0x00,0x40,0x9f,0xfb,0x38,0x4e,0xd1,0xe1,0xea,0x0b,0x5b,0x46,0x23,0xe6,0xea,0x91,0xde,0xde,0xcd,0x22,0xd2,0x02,0x05,0x03,0x8c,0x20,0x5f,0x43,0xa2,0xfb,0xe9,0xf8,0xf1,0xe5,0x19,0xf5,0xb7,0xee,0x17,0xf6,0x03,0x09,0xf6,0xf5,0x1d,0xef,0x4e,0x13,0x05,0x2e,0xd6,0x18,0x07,0xf8,0x7f,0xe2,0x0d,0xf5,0xea,0x0e,0xff,0x08,0xe9,0x02,0xe6,0xff,0xf8,0x07,0x06,0xe2,0xf7,0x18,0xfd,0xeb,0xf7,0x2c,0xfa,0x11,0x0b,0x0e,0x1a,0xf5,0xfd,0x43,0x14,0x0b,0x09,0x08,0x0c,0x0a,0x11,0x11,0xec,0x1d,0x20,0x30,0xed,0x27,0x1c,0xee,0x15,0x04,0x62,0x19,0x04,0x2d,0x86,0x19,0x13,0xe1,0x7f,0xe1,0x13,0xda,0xf8,0x1a,0xfd,0xfd,0xe9,0xfa,0x12,0xfe,0xe4,0xe7,0x09,0xea,0x04,0x30,0x01,0xe1,0x02,0x2f,0x0e,0x1a,0x16,0x06,0x34,0xe2,0xd6,0x3b,0x17,0xd9,0x17,0x0a,0x1b,0x1b,0x09,0x08,0x01,0x22,0xcd,0xdd,0x25,0xe6,0x2d,0x04,0xf7,0x2c,0xb8,0xcf,0x05,0xb6,0x72,0xc2,0xfd,0xef,0x81,0x30,0xd1,0x36,0xfd,0xd3,0x0d,0x08,0xfb,0xf2,0x43,0x03,0x36,0x34,0x46,0x33,0xf4,0xdb,0x10,0x55,0xe3,0xcb,0xf8,0xe1,0xda,0xdc,0xd4,0x0a,0x37,0xc3,0x02,0x19,0xe2,0x07,0xde,0xe2,0xfc,0xcc,0xe6,0xc6,0x28,0x24,0xf9,0x19,0x06,0xfc,0x11,0xe8,0x4c,0x20,0xf8,0x35,0x99,0x3b,0x0d,0xf1,0x7f,0xd5,0x24,0xdc,0xfe,0x2c,0xe7,0xf3,0xf0,0x17,0xf0,0x04,0xd6,0xe7,0x02,0xe6,0x08,0x32,0xf7,0xdb,0x06,0x20,0x12,0x0f,0x1e,0x09,0x3b,0xe0,0xde,0x3f,0x26,0xf4,0x24,0x15,0x1e,0x16,0x02,0x27,0x0a,0x21,0xfd,0x18,0x0b,0x10,0xf5,0x00,0x02,0xf5,0xf8,0x18,0x04,0x08,0xe8,0x10,0xe8,0x2e,0x81,0x0e,0xeb,0xe7,0x2d,0xfa,0xf6,0xef,0x31,0x07,0xed,0xed,0xe7,0xec,0xd7,0x03,0x09,0x17,0x07,0xfd,0x13,0xe2,0x11,0x18,0x01,0x04,0x1b,0xfa,0xe7,0xa9,0x12,0xed,0x0e,0xef,0x0f,0x0e,0xe7,0x13,0x1e,0x0f,0xc6,0xc5,0x25,0x00,0xf6,0xe7,0x0b,0xd6,0x26,0xd7,0x0a,0xed,0x1d,0xdc,0xfd,0x2a,0x7f,0x01,0xc5,0x2c,0xf7,0xcc,0x0a,0x23,0xf6,0x0b,0x91,0x06,0x24,0x36,0xfc,0xc7,0xee,0x22,0x07,0xf8,0x08,0x2c,0xec,0xd8,0xc5,0xd9,0x16,0xd9,0x29,0xe0,0x2c,0x65,0xd6,0xd6,0xd4,0xf3,0x15,0xd7,0xdc,0xe9,0xce,0xc2,0x40,0xd7,0x1b,0xf3,0xff,0x21,0xad,0xc4,0x05,0xaf,0x7f,0xa6,0xfb,0xdf,0xda,0x14,0xe7,0x1a,0xd5,0xd7,0x10,0x1a,0xe6,0xf5,0x51,0xfa,0x28,0x21,0x25,0x27,0xfb,0xe1,0x08,0x6c,0xd3,0xe9,0xda,0xd0,0xd9,0xd7,0xc9,0x14,0x2d,0xe6,0x0d,0x2a,0xbf,0x26,0xc7,0xd2,0x01,0xbf,0xd3,0xcf,0xd6,0xbe,0x14,0xdd,0xf0,0xfa,0xfc,0xff,0xc9,0xdd,0xfe,0xcf,0x7f,0xc6,0xf9,0x0a,0xb4,0x1f,0xdd,0x30,0xfa,0xc9,0x12,0x17,0xf9,0xef,0xfb,0xf5,0x30,0x19,0x09,0x0a,0xf6,0xe4,0x00,0x38,0xe9,0xe9,0xf3,0xdb,0xd6,0xdd,0xbf,0x13,0x31,0xcc,0xf4,0x2f,0xd6,0xef,0xde,0xf1,0x00,0xca,0xe6,0xdb,0x0e,0x3b,0x9e,0xd6,0x4c,0x32,0xfa,0xec,0x05,0x17,0x0c,0x37,0xdd,0x07,0x15,0xea,0xf5,0xf8,0x1f,0x1a,0x24,0x39,0xfd,0xfe,0x1c,0x32,0xd0,0x36,0x02,0xed,0x7f,0x06,0xd6,0xa3,0x12,0x92,0x09,0xeb,0x02,0x06,0x4a,0x06,0xd0,0x2a,0x15,0x10,0xa6,0xbf,0x18,0x4c,0xef,0x05,0x2b,0x11,0x10,0x07,0x33,0x53,0xd4,0x03,0x43,0x0b,0x34,0xe8,0x74,0x15,0xf7,0x12,0x9c,0x1d,0x1e,0xd4,0x7f,0xe9,0x2a,0x10,0xed,0x2f,0x0d,0x04,0xe8,0x04,0x4d,0x1f,0x02,0xff,0x5f,0xf0,0x0f,0x11,0xf2,0xdb,0x02,0x3d,0x0c,0x04,0x1b,0x11,0x2d,0xea,0x07,0x6e,0xfc,0x92,0x1a,0x3d,0x19,0x1b,0x0b,0x11,0xf9,0x29,0x34,0x33,0xe7,0x24,0x13,0x01,0x0c,0xec,0x50,0x16,0x07,0x31,0x8f,0x3c,0x0b,0xea,0x7f,0xdd,0x24,0xd3,0xfd,0x37,0xe1,0xee,0xf2,0x15,0x0c,0x09,0xe4,0xdf,0x08,0xf5,0x02,0x2d,0xfd,0xd3,0x0c,0x21,0x12,0x1a,0x2e,0x13,0x34,0xeb,0xda,0x48,0x1e,0xe3,0x25,0x1e,0x29,0x13,0x10,0x24,0x0a,0x29,0xf4,0x6f,0x19,0xe8,0x59,0xf6,0x1b,0x21,0x34,0xe3,0x01,0xd7,0xf3,0xf8,0x14,0x1a,0xac,0x35,0xe2,0x2e,0x06,0xdf,0x1e,0x14,0x0d,0x03,0x7f,0x05,0x11,0x15,0x2d,0x09,0x07,0x24,0x0b,0x27,0x04,0x1e,0x1e,0xff,0xde,0xee,0x24,0xfe,0x1e,0xd6,0x13,0xbf,0xf1,0xf6,0xf6,0xf0,0xff,0xef,0x02,0x0f,0xc6,0xaa,0x39,0xfc,0xfb,0xf1,0x25,0xe2,0x2d,0xe2,0x0d,0x08,0x3c,0xd1,0x18,0x17,0x63,0x08,0xcb,0x56,0xdd,0xd0,0x1f,0x2a,0xdb,0xfc,0x81,0xfc,0x4d,0x54,0x25,0xcf,0xfb,0x0e,0x0b,0x0e,0x0e,0x2d,0xe4,0xdb,0xb8,0xdd,0xf9,0xd2,0x43,0x02,0x10,0x3c,0xc0,0xcc,0xe0,0x00,0x20,0xd6,0xd6,0xf1,0x0a,0xbd,0xba,0xe1,0xf0,0x04,0xfb,0xf2,0xcb,0x0c,0xf3,0x17,0x56,0xed,0x17,0xf6,0xac,0xf2,0x00,0x27,0xfd,0x01,0x27,0x39,0x06,0xf6,0xc7,0xf0,0x28,0x22,0xd8,0xf4,0xea,0x9b,0xea,0xc1,0xde,0xfb,0xec,0x00,0x0b,0x11,0x81,0x24,0x1f,0xd6,0x8f,0x18,0x11,0xdf,0x10,0xf0,0xff,0x14,0xff,0xf5,0xfd,0x53,0x81,0xe1,0x61,0xf2,0xf3,0xf0,0x18,0xf7,0xeb,0x09,0xf5,0xe7,0x46,0xb8,0xd1,0x06,0x05,0x24,0xe7,0xf9,0x41,0x31,0xf9,0xf0,0x15,0xf3,0x14,0x07,0x2f,0xf7,0xe3,0xb8,0xf0,0xca,0xed,0x19,0xf2,0xed,0xf5,0xf9,0xcb,0x3a,0x15,0x1c,0x8c,0xc9,0xf1,0xe4,0xf5,0x01,0xdc,0xf9,0x16,0xfb,0xe5,0xda,0xec,0x11,0xea,0x0a,0xef,0xe0,0xbc,0x1c,0xfc,0xfd,0x5a,0x0d,0xe6,0x05,0x81,0x1e,0xc6,0x31,0x36,0xfa,0x02,0x13,0x30,0x09,0xd6,0xee,0x28,0x33,0xf5,0xe1,0xf5,0xe1,0xfd,0xed,0xf2,0xc1,0x01,0x05,0xf3,0x0a,0xae,0x0a,0x1a,0x8a,0xd9,0x29,0x0f,0xdf,0x11,0x00,0x01,0x1d,0xf5,0xfb,0xec,0x27,0x0d,0x21,0x2e,0xc5,0x15,0xf2,0x07,0xc5,0xfc,0xce,0xe0,0xdd,0x16,0x1f,0x7f,0x22,0x16,0x0d,0xfb,0xe5,0x18,0x17,0xe3,0x06,0xe2,0xf8,0xf9,0x19,0x12,0xec,0x1d,0x1b,0x12,0xec,0x20,0x4a,0x0c,0xb6,0xc4,0xf2,0x15,0xcc,0x0b,0x53,0x0e,0xdf,0xcd,0xe4,0xa7,0xe8,0xee,0xbe,0x0f,0xee,0xf4,0xe2,0x7f,0x0f,0x43,0xef,0x02,0x1f,0x0c,0x02,0xff,0x02,0xe2,0x05,0xe7,0x21,0x3c,0x20,0x02,0x10,0xfc,0xf4,0xf1,0xdc,0x0d,0x08,0xe1,0xe4,0x0e,0xfc,0x18,0x1a,0x0f,0x29,0x04,0x68,0x18,0xf4,0x0d,0xf1,0xe8,0xf4,0x1d,0xbe,0x07,0x1a,0x65,0xc0,0xf6,0x05,0xe8,0xff,0x05,0xdf,0xfd,0xfc,0x23,0xde,0xd0,0xe9,0x81,0x16,0x0b,0x02,0x29,0x09,0xf2,0x16,0xf4,0x27,0xf3,0x32,0x5b,0xf4,0x22,0xea,0xe6,0x2c,0xfd,0xe5,0xe5,0xe2,0x0e,0x14,0xf3,0xe6,0xbc,0xea,0x1b,0xe0,0xfe,0xef,0xe8,0x34,0x09,0x16,0x1e,0x16,0x0a,0x32,0xee,0x5b,0xd3,0xf9,0x0a,0x0f,0xf9,0x0e,0x22,0xff,0x23,0x28,0xea,0x20,0x72,0x2e,0x7f,0xbf,0xfd,0x28,0xf0,0xde,0x20,0xed,0xe2,0xe7,0x0a,0x3b,0x14,0x4d,0xed,0x25,0x11,0xed,0xf4,0xe7,0x01,0x21,0xff,0xde,0x3a,0x29,0x59,0x1f,0x13,0x34,0x1b,0x5a,0x18,0xef,0x09,0x02,0xd9,0xef,0x48,0xc5,0x3a,0xda,0x6d,0xdf,0xe9,0xf9,0xcb,0x08,0x0d,0xe5,0xdb,0xfc,0x06,0x6c,0xde,0x02,0x77,0x0e,0x21,0x2d,0x70,0x07,0xdf,0x2f,0xa1,0xf5,0x36,0xfb,0x73,0xef,0x38,0x21,0xe4,0xfb,0x24,0x0f,0xd8,0xe5,0x1d,0x03,0xe5,0xda,0x61,0x0a,0x18,0x05,0xe0,0xf6,0xf5,0x4d,0xf8,0x06,0xfa,0xfc,0x35,0x1b,0xe7,0x7f,0xf8,0x82,0xf7,0x06,0xfb,0x12,0xf9,0xeb,0x30,0x07,0x05,0xc3,0xfb,0x05,0x81,0xff,0xeb,0xf7,0xde,0xfe,0xf4,0xfe,0xf0,0x0b,0xdc,0x06,0xfb,0xeb,0x04,0xa6,0x01,0x0e,0xef,0xca,0xed,0xfd,0xed,0x08,0xbe,0xcc,0x9c,0xfe,0x1c,0x0a,0xf7,0xf7,0xfd,0xf0,0x0e,0xf8,0x09,0x09,0x08,0x00,0xbb,0x24,0x02,0x10,0x11,0x08,0x0f,0xfa,0xfc,0x0d,0x17,0xf5,0xcd,0x9f,0x3f,0xff,0x20,0xb9,0x1a,0xe1,0xef,0xd2,0x19,0xea,0x6c,0xde,0xec,0xee,0xd2,0x04,0xb2,0x46,0x0e,0xb6,0xe3,0x3e,0x11,0xfc,0xa2,0xcd,0x75,0x53,0x48,0xd9,0xcf,0x10,0x14,0x2c,0x1a,0xd6,0xd3,0xeb,0xe1,0xd7,0xcd,0xd0,0x79,0x88,0x34,0x7f,0xee,0xd5,0xea,0x0d,0x02,0xd6,0x9d,0xea,0x4a,0x81,0xe1,0xf0,0xab,0x06,0x3c,0x21,0x3a,0x6d,0x03,0x67,0x11,0x51,0xdb,0xad,0xf5,0xa3,0x0b,0xed,0x1d,0x2f,0xd3,0x00,0xe0,0x08,0xcf,0xec,0xcb,0xd9,0xc1,0xe0,0xfd,0xf4,0xcf,0xfc,0xfa,0x01,0xe1,0x54,0x2f,0x1a,0x92,0x1e,0xc7,0xd7,0xdf,0x5b,0x3c,0xfb,0x49,0xf0,0xef,0x4b,0xc0,0x5f,0x2a,0x33,0x81,0xf2,0xea,0x21,0x29,0x13,0x76,0x26,0xff,0x32,0xc3,0x37,0x30,0x16,0x2f,0xd5,0x35,0x00,0xf0,0x0b,0x19,0x19,0xee,0x00,0x0c,0xff,0xe4,0xda,0xf0,0xe7,0xfd,0xd9,0x00,0xaa,0xfb,0x4f,0xff,0x1e,0x10,0x0b,0x0a,0x1c,0xd1,0x22,0xb6,0xe3,0x0d,0x07,0x25,0xf2,0xf6,0x14,0xfe,0x22,0x15,0x22,0xc4,0x01,0x0c,0xf7,0x0a,0x01,0x2a,0x01,0x05,0x0e,0xdb,0x08,0x18,0xe5,0x7f,0xf8,0x19,0x03,0xe0,0x12,0x19,0x03,0xdd,0xfe,0x09,0x10,0xf7,0xeb,0x14,0xf0,0xfd,0xfd,0xff,0xd5,0xf3,0x3a,0xfd,0xf9,0x04,0x03,0x1a,0x00,0xf1,0x69,0xea,0xe0,0x02,0x00,0xf5,0x03,0x0e,0xf9,0x04,0xfe,0x10,0x92,0xc0,0xc8,0x05,0xfa,0xfb,0xbd,0x10,0xed,0x07,0x1d,0x48,0xfe,0x1d,0xae,0x1c,0xf9,0x0f,0x37,0xec,0xfb,0x07,0x55,0xfc,0xee,0xa9,0x1a,0x40,0x3e,0x0c,0xf2,0xc0,0xb5,0x04,0xac,0xf8,0x2f,0xe2,0xf9,0x07,0xf4,0xa3,0x15,0x40,0x07,0xaf,0x7f,0xff,0xe2,0x0b,0x01,0xf6,0xf4,0xd2,0xf8,0x00,0x00,0x00,0x00,0xb6,0xfa,0xfe,0xff,0x04,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0xd2,0x78,0x6b,0x97,0x7f,0x15,0x70,0xc3,0x00,0xbf,0xf3,0x5e,0xde,0x63,0x0b,0xbf,0x15,0xe6,0xfc,0xf3,0xfc,0xe5,0x07,0x15,0x13,0x11,0xc4,0xec,0x77,0x10,0x24,0x2a,0x5e,0x76,0x0e,0x19,0xfd,0x79,0x47,0x31,0x8f,0x3f,0x19,0xba,0x7f,0xc3,0xb8,0x16,0xa9,0x9f,0x7a,0xf1,0xd1,0x9d,0xbc,0x77,0x58,0x25,0xe0,0x03,0xd8,0x24,0x03,0xff,0x38,0xea,0x7f,0xd6,0xe6,0x57,0x26,0xe5,0x1c,0xcf,0xd8,0x15,0xe3,0xed,0x08,0x06,0x21,0xfc,0xd1,0x26,0xf7,0xc5,0xf3,0x33,0xc1,0x11,0x81,0x25,0xf8,0x71,0xd1,0xc4,0xca,0xa6,0xe3,0x31,0xd6,0x16,0x21,0x07,0x21,0x46,0xf0,0xb2,0xca,0xfc,0x63,0xdc,0x6b,0xf0,0x16,0x47,0xcc,0x81,0xc1,0x6b,0x2f,0x62,0x69,0xd7,0x27,0x2b,0xdb,0x23,0xd4,0xf5,0x0c,0x11,0x19,0x49,0xe4,0xec,0xe0,0x0b,0x0b,0xf5,0xa2,0x34,0x57,0xfc,0x3f,0xa3,0x7f,0x93,0xcd,0xce,0xe4,0x65,0xb9,0x10,0xd3,0xc7,0xd9,0x3f,0x1a,0xb4,0x44,0xe0,0xe5,0x37,0x09,0x1f,0x26,0xc4,0xd5,0x3a,0x16,0xed,0x31,0x21,0x3a,0xe5,0xef,0x81,0xa7,0x26,0x40,0x33,0x1d,0xeb,0x0e,0xfc,0x0d,0xf6,0x0b,0xd1,0xd8,0x2d,0x22,0xfb,0xcb,0xd6,0x7f,0xe8,0xdd,0x2a,0xc3,0xf3,0xdd,0x13,0x19,0x03,0x54,0xba,0xf0,0x1d,0xf7,0xfb,0xf4,0xf0,0x18,0x0d,0x20,0x2a,0xde,0x0a,0xf6,0x08,0xf6,0xfc,0xf9,0x63,0x54,0xd4,0x6c,0xc0,0x7f,0x0f,0x16,0x88,0xdb,0x1f,0xe5,0x58,0x0c,0xc1,0x2e,0xca,0xe2,0xe8,0xf6,0xdb,0xf8,0x1b,0x0c,0xf8,0x99,0xcc,0xc4,0x48,0x6b,0xb2,0x6a,0xe2,0x5a,0xd4,0xe4,0x81,0x26,0x35,0x5a,0x25,0xdf,0xde,0xf8,0xe8,0x15,0xf5,0x18,0x07,0xda,0xf4,0xe8,0x1e,0xe7,0xd3,0xa3,0x0a,0x7f,0xc1,0x16,0x1a,0x1b,0x2c,0xce,0xfc,0xb2,0x76,0xc1,0x6a,0xdf,0xec,0x99,0x33,0x31,0x17,0xdb,0xd6,0xb8,0x38,0x1f,0x41,0x18,0xf1,0xfa,0x40,0x1d,0xdd,0x3c,0xec,0x3c,0xe6,0xfa,0x81,0x1e,0x2b,0x62,0x32,0xfc,0xe2,0x02,0xdc,0xfe,0x01,0x08,0x0a,0xe6,0xfb,0xf9,0x07,0xc6,0xe1,0x8f,0xf9,0xe5,0xee,0xe8,0x0c,0x24,0xf3,0x10,0xc8,0x81,0xdf,0x25,0xbb,0x03,0x16,0x03,0x14,0x08,0xec,0xfc,0xf5,0x12,0xfb,0xf8,0xfa,0x10,0xe0,0xd7,0x46,0x75,0xb2,0x3d,0x60,0x1c,0xd8,0xe0,0x4c,0xfe,0x15,0x81,0x0f,0x2f,0xf8,0xf5,0x22,0xfb,0xf2,0xf1,0x01,0xdc,0x1e,0x2c,0x09,0x00,0xd7,0x86,0xd9,0xe7,0xf1,0x0d,0x7f,0x05,0xb7,0xf2,0xa8,0x8e,0x1c,0x0c,0xc0,0x17,0x11,0x11,0x01,0xea,0xc4,0x00,0xd9,0xf7,0x1d,0x1c,0x02,0xdc,0xe0,0x4e,0xfc,0xd6,0x2a,0x81,0xb9,0x9b,0x16,0x33,0x0d,0x3e,0xb9,0x24,0x37,0xf2,0xee,0xc5,0x06,0x31,0x07,0x3b,0x4d,0xed,0xe3,0xf9,0x20,0x04,0xb1,0xfc,0x28,0x0c,0xd6,0x4c,0x7f,0x5a,0xd1,0xf9,0x05,0xbc,0x23,0xa2,0x37,0x4d,0xd3,0x35,0xe6,0xe8,0xec,0xfa,0xc6,0x01,0x25,0x10,0xed,0xa4,0xfd,0x04,0xba,0xb9,0x3c,0xfd,0x55,0xf0,0xfa,0x27,0xf3,0xad,0xff,0x7f,0xad,0x31,0x37,0x3a,0xce,0xd4,0x00,0xc6,0xd9,0x2f,0xee,0xcf,0xcf,0xcc,0x26,0x0a,0x70,0x5f,0xa5,0x59,0x2e,0x7f,0xb2,0xf8,0xaf,0x03,0x38,0xee,0x61,0x4b,0xc4,0x21,0xda,0x13,0xfb,0x0b,0xf2,0xe3,0x2c,0x32,0x07,0xa6,0xd1,0x44,0x14,0xaf,0xfa,0xa8,0xf5,0x23,0x16,0x7f,0x9c,0x0e,0x92,0xea,0x4b,0x58,0x0a,0x37,0xf4,0xdc,0xb8,0xfd,0xc8,0x09,0x08,0x0c,0x11,0xbb,0xbf,0xca,0x01,0x4f,0x1e,0x58,0xa0,0xed,0xf8,0xac,0xf9,0x6e,0x63,0x3c,0xbd,0x81,0xce,0xfd,0x06,0x20,0x0b,0xe2,0x0b,0x03,0xe4,0x27,0xf7,0xf8,0xe0,0xc9,0x6c,0x7b,0x90,0x7f,0x67,0x71,0xab,0xe9,0xe6,0xdb,0x35,0xb5,0x4d,0x3a,0xb1,0xde,0x11,0x06,0xeb,0x32,0xfc,0xdc,0x08,0x2f,0x2f,0xd0,0xb6,0xdb,0xda,0xdf,0x08,0x02,0x16,0x07,0xec,0x13,0xab,0xd9,0x04,0x7f,0xb9,0x1e,0x21,0x39,0xfb,0xdc,0xcc,0xd9,0xd5,0x20,0xff,0xd5,0xcf,0xd7,0x1d,0xe9,0x05,0x9b,0xe3,0xa8,0x67,0x1d,0xd5,0x4a,0xb5,0x82,0xb9,0xef,0x02,0x6f,0x1c,0x1d,0x20,0x0b,0x81,0x11,0xf2,0x2c,0x01,0xed,0xeb,0x0c,0xc8,0xae,0xf3,0x37,0x04,0x50,0x01,0xf3,0xd2,0xbf,0x31,0x42,0x7f,0x6d,0xcf,0xd0,0x01,0xe2,0x38,0x2c,0x00,0x0d,0x20,0xf5,0xf9,0xf2,0x04,0x28,0x08,0xd1,0x25,0x3c,0xd9,0x29,0x4c,0x0a,0xe2,0xd0,0x68,0xd2,0xfe,0x81,0x23,0xa2,0xd6,0x99,0x4d,0x51,0x15,0x6d,0x21,0xab,0x6b,0x71,0x6f,0x27,0xbd,0x18,0x04,0x0b,0x06,0x27,0x30,0xfe,0xe3,0xd2,0x7f,0xc0,0x37,0x9c,0x21,0x11,0xf1,0xfc,0x12,0x09,0x04,0x07,0x1b,0x03,0xf1,0xfc,0xf6,0x27,0x2b,0x81,0x48,0x54,0xb9,0x1b,0xe4,0x60,0xb6,0xf1,0xf3,0x86,0x18,0xe5,0x22,0x02,0x05,0xa4,0x5b,0x0a,0x0b,0xfd,0x0e,0xd3,0xf5,0x08,0x78,0x66,0xa0,0xd0,0xf2,0xa8,0xef,0xd7,0xee,0x23,0xe1,0x44,0x8b,0x81,0xcd,0x73,0xbb,0x2e,0x45,0x16,0xe8,0xf5,0xd7,0xdf,0xe7,0x17,0xed,0xe7,0xfe,0xd9,0xc1,0xf2,0x01,0xc4,0xf7,0xc4,0x02,0x2f,0x0e,0x5b,0xc2,0x81,0xcd,0x0d,0x11,0x5c,0x37,0x3e,0xcf,0xc6,0xf9,0xd2,0xbe,0x37,0xee,0xf7,0xec,0xc6,0xf4,0x81,0x37,0x3c,0xe2,0x43,0xe4,0x7b,0x20,0xf9,0xc8,0x97,0x11,0xba,0xf8,0xec,0xc4,0x0a,0x16,0xf2,0xfd,0xeb,0xda,0xff,0x20,0x1a,0x06,0xf5,0xef,0x3e,0x1e,0x06,0x11,0x22,0xc6,0x13,0x23,0xff,0xff,0x7f,0x12,0xfb,0x3b,0xdf,0xe1,0x12,0xe5,0xeb,0x29,0xf2,0x05,0x02,0xfc,0xfe,0xfb,0xf1,0x39,0x23,0xca,0xcb,0xf7,0xbc,0x7f,0xbd,0x0b,0x53,0xed,0x46,0xcb,0x4b,0xf5,0x18,0x03,0x07,0xf5,0xfc,0xcd,0xee,0xe6,0xec,0x0b,0xfe,0x10,0xc9,0xc7,0x7f,0xd0,0xe2,0x5e,0xe0,0x82,0xc5,0x5e,0x25,0xf4,0x10,0xd9,0xe5,0xe6,0xb6,0xce,0x03,0xdc,0xff,0x39,0xf9,0x16,0xfb,0xe9,0x04,0x01,0xf3,0x26,0xf5,0x56,0x05,0xbb,0x3a,0x7f,0x56,0xbf,0x02,0x3b,0xe7,0x35,0xf8,0x72,0xf9,0xaf,0xf4,0x03,0x24,0x0f,0x12,0xd9,0xff,0x41,0x45,0xe7,0xf5,0x13,0x45,0x1c,0x10,0x00,0xfb,0xf9,0xfe,0x0f,0x0d,0x09,0x7f,0xfe,0xda,0x37,0xd6,0xb8,0xfa,0xf2,0x08,0x17,0x0a,0x06,0xed,0x09,0x12,0x18,0xea,0xfe,0x03,0x31,0x3e,0xfb,0x4c,0xae,0x36,0xee,0xbf,0xee,0x10,0x31,0x9a,0x40,0x96,0x81,0xfa,0x19,0x25,0x3a,0x0a,0xff,0x03,0x02,0x26,0x23,0x10,0xdb,0xc0,0x39,0x44,0xd3,0x3c,0x55,0x41,0xe1,0xf1,0x06,0xf9,0xfd,0x81,0x40,0x2a,0xcc,0x2a,0x00,0x06,0xb8,0x1d,0xb8,0xf6,0x4f,0x3b,0x07,0x8b,0xdd,0xb8,0x81,0xd3,0x22,0x9c,0x50,0xa4,0xf2,0x2d,0x3b,0x9e,0xa8,0x1e,0x95,0x12,0x2a,0xd6,0x1f,0x25,0x97,0x0c,0xfe,0xdd,0x2f,0x1b,0x1b,0xdd,0xad,0xca,0x6c,0x7f,0xc7,0x72,0xe5,0x5a,0xd3,0xb1,0x93,0x2c,0x5a,0x24,0x29,0xe5,0xbc,0x0b,0xe2,0x18,0xe2,0x21,0x18,0xc3,0xf1,0x25,0x4d,0xc6,0xa1,0xc7,0x7a,0x47,0xac,0x7f,0x1d,0x74,0xa9,0xda,0x81,0x04,0x56,0x41,0x47,0xea,0xbc,0x07,0xe3,0x1a,0xe3,0x29,0xf3,0xc8,0x08,0x0f,0x37,0xb2,0xce,0xd4,0x73,0x68,0x87,0x77,0x3a,0x5c,0xce,0xdc,0x09,0x03,0x2d,0x81,0x32,0x12,0xbc,0xdb,0x02,0x02,0xec,0x0d,0x0f,0xa8,0x2c,0x0c,0x43,0xe5,0xdd,0x5b,0xc4,0xfa,0x57,0xcf,0x81,0x9b,0x5d,0x19,0xe0,0x2f,0xdb,0xef,0xd6,0xb3,0xcf,0xe9,0xee,0x0b,0x49,0x05,0x25,0xf3,0x02,0x14,0xfa,0x00,0x0f,0xe1,0x12,0x15,0x29,0x4e,0x81,0x28,0x2b,0xef,0xcd,0x56,0x3c,0x51,0x14,0x86,0xb1,0x00,0xe0,0x04,0x2a,0x08,0x16,0x0f,0xed,0x24,0x11,0xef,0x00,0xc8,0x09,0xcf,0xf5,0xee,0xe4,0x45,0x0e,0x3b,0xa1,0x81,0xd6,0x2f,0xef,0x1a,0x17,0x14,0x0b,0xee,0xe4,0xf0,0xe5,0x0c,0x09,0x00,0x0a,0xe4,0xcb,0x1d,0x39,0x13,0xb0,0x45,0x7f,0x65,0xc5,0x0f,0xc5,0xe9,0x2b,0xec,0x5c,0x69,0xdb,0x25,0xdf,0x00,0xd1,0x13,0xd4,0xef,0x1b,0x10,0x02,0x99,0xef,0x7f,0x00,0xe0,0x3d,0xdd,0xa8,0xe1,0x36,0x34,0x0a,0x42,0xe0,0x0d,0x1d,0x0f,0x03,0x1f,0xd8,0xcd,0x23,0xdf,0x04,0xfa,0xff,0xfa,0xf5,0xdb,0x59,0x7f,0x10,0xea,0x18,0xf3,0xdd,0xdc,0xee,0x0c,0x2e,0x2c,0x1e,0x2e,0x47,0xf0,0xed,0xe3,0xe8,0x24,0x2e,0x19,0x30,0x02,0xc9,0xe0,0x09,0x10,0xd2,0xc4,0x79,0x7f,0x9a,0x76,0x27,0x66,0xd4,0xc0,0xfc,0x28,0x53,0x9f,0x32,0xd6,0xbd,0x01,0x10,0xfe,0xf3,0x24,0x1b,0xca,0x3c,0x21,0x3b,0xe0,0xd1,0x14,0x6e,0x08,0xc4,0x3c,0x1f,0x7f,0xc9,0x05,0xc2,0xec,0x2f,0x2f,0x5b,0x29,0xd1,0xfd,0xf4,0x29,0x00,0x0f,0x02,0xd3,0x12,0x24,0x0c,0xd2,0xd9,0xf3,0x64,0x3f,0xea,0x7f,0xe8,0x52,0xd7,0xe4,0xc8,0x0f,0x5e,0xf3,0x2c,0xe7,0xd4,0xf6,0xff,0x03,0x11,0xec,0x13,0xe7,0xee,0xf9,0xfb,0xf2,0xfd,0xfa,0x35,0x25,0xb6,0xc2,0x0c,0x07,0xcd,0x19,0xd3,0x76,0xbe,0xe0,0x5d,0xcd,0xcd,0xe1,0x23,0x39,0xd4,0x32,0xff,0xc9,0x41,0x4a,0x4b,0x12,0x81,0xde,0x23,0x18,0xdd,0x02,0x6b,0x41,0xda,0x0a,0x13,0x81,0x07,0x8a,0x2f,0x34,0xc4,0xec,0x21,0x21,0xd7,0x1e,0xd9,0xe0,0x43,0x30,0x24,0xea,0xba,0xb8,0x66,0x7f,0xbb,0x6b,0x1e,0x32,0xd2,0xd7,0xf8,0x2d,0x42,0xbc,0x14,0xf2,0xe4,0xce,0x08,0x08,0xfb,0x17,0x1e,0xd7,0x1f,0x26,0x13,0x0c,0xcd,0xf8,0xa0,0xe1,0x3d,0x81,0x34,0x96,0x25,0x09,0x2d,0x1b,0x9c,0xfd,0x9d,0xe4,0x2a,0x0b,0x08,0xfd,0xe2,0xf7,0x06,0x20,0xea,0xea,0x0e,0x1e,0xd9,0xb6,0x68,0x78,0xb0,0x4c,0x1d,0x73,0xb5,0xec,0xc6,0xd8,0x30,0x14,0x54,0x2f,0xd7,0xd6,0x16,0x3d,0xc3,0x2e,0x00,0xc4,0x19,0xfa,0x32,0xd1,0x81,0x00,0x00,0x00,0x00,0xe6,0x00,0xff,0xff,0x04,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0xea,0xdc,0x81,0xf2,0xbc,0x0e,0xff,0xf7,0x4e,0xfa,0xf5,0xf0,0xd6,0x16,0xfa,0x1f,0x1b,0xe5,0xd3,0xe8,0x00,0x19,0xf2,0x22,0x41,0xf4,0xdd,0xea,0x1a,0x16,0xf3,0x16,0xe8,0xf9,0xed,0xd8,0xf1,0xe6,0xba,0x03,0xcd,0x07,0x3b,0xe3,0xd6,0x1a,0x15,0xf6,0x0f,0xc1,0xd1,0x3a,0xf6,0xf9,0x0b,0xe1,0x15,0x48,0x35,0xf9,0x09,0x02,0x0e,0xf5,0xef,0xb1,0x37,0xfd,0x62,0xf3,0xaa,0x0b,0xef,0xd3,0x27,0xc9,0x05,0xf2,0x0b,0xe9,0xe9,0xab,0x14,0x22,0xf5,0xcc,0x5b,0xec,0x1b,0x03,0x01,0x14,0x0a,0xc9,0xcb,0x39,0x57,0xe2,0xea,0x23,0xed,0xf6,0x09,0x3e,0x2d,0x7f,0x64,0x0a,0xfc,0x12,0xe7,0x1b,0x1d,0x26,0x4d,0x08,0x1f,0x07,0xff,0xff,0xe3,0xc7,0x1d,0x17,0x35,0xfb,0xc0,0xf6,0xe9,0xd4,0x25,0xd4,0xfd,0xe0,0x0f,0xf2,0xd7,0xc7,0x20,0x12,0xe5,0xd6,0x4e,0xde,0x26,0x06,0x08,0x2c,0x03,0xcf,0xee,0x1c,0x27,0xda,0xf0,0x10,0x0f,0xe4,0xef,0x3d,0x17,0x37,0x7f,0xeb,0x0b,0x13,0xe1,0x2c,0xcb,0xa7,0xba,0xfc,0xee,0x20,0xfb,0xf6,0x39,0x2e,0xc6,0xfa,0x92,0x0f,0x5d,0x0b,0x13,0x29,0xe0,0x27,0xfa,0x18,0xf7,0x13,0x56,0x31,0xd5,0xdd,0x16,0x37,0xa3,0x52,0xdd,0xff,0xdc,0xf4,0x03,0x30,0xfe,0xcf,0xb0,0x24,0x0f,0xcb,0xe3,0x0c,0xf8,0xc7,0xf0,0x91,0x81,0x26,0xf0,0xdc,0x23,0xe2,0x22,0x3c,0x53,0x01,0x17,0xf0,0xfa,0xfd,0xde,0xcf,0x1d,0x12,0x44,0xf3,0xb5,0x0a,0xe2,0xd4,0x2b,0xc5,0xf9,0xdf,0x08,0xf0,0xd3,0xc1,0x20,0x1d,0xe5,0xd0,0x4f,0xe1,0x28,0x09,0x15,0x34,0xfc,0xc1,0xee,0x20,0x3c,0xe6,0xea,0x2b,0x10,0xe1,0xef,0x45,0x06,0x53,0x7f,0xef,0x12,0x16,0xd8,0x2a,0x2a,0x4d,0x16,0x2a,0x02,0xc8,0xf3,0x19,0x05,0x7f,0x2b,0x1b,0x44,0x11,0xfc,0x1b,0x0c,0x4e,0x00,0x17,0x11,0x07,0xf6,0x01,0x13,0x78,0x25,0x0a,0x16,0x0b,0x06,0xc5,0x20,0x0d,0x1b,0xfa,0xe6,0x1a,0x70,0x1b,0xf7,0xf5,0xf9,0x54,0x3c,0x0d,0x02,0x0c,0xca,0xc7,0x0e,0xae,0x17,0x0c,0x4f,0x17,0x0a,0x44,0x19,0xfc,0xf7,0xfa,0x09,0x03,0x1a,0xe3,0x30,0x00,0x62,0xeb,0xd8,0x10,0x03,0x16,0x1c,0xf9,0x0c,0x0b,0xf1,0xe9,0x10,0xe1,0xfc,0x12,0x11,0xd6,0x28,0x02,0xf8,0x01,0x01,0xf1,0x0a,0x02,0x0a,0x3c,0x64,0xf1,0x00,0x27,0xe2,0x14,0x34,0x11,0x1c,0x7f,0x18,0x13,0xf2,0xfa,0x25,0x07,0xc0,0xb4,0x81,0xd9,0xd4,0x22,0x08,0xf7,0x50,0x00,0xdd,0xdd,0xab,0x04,0x79,0x0d,0x1b,0x39,0xdb,0x2c,0xf9,0x20,0xf8,0x1c,0x5a,0x06,0xbe,0xc8,0x24,0x21,0x97,0x76,0xb6,0xf1,0xc9,0xc5,0x14,0x48,0x18,0xe7,0xb1,0x33,0x14,0xbf,0xbf,0x06,0x1d,0xb3,0xf8,0xb8,0x89,0x5a,0xdf,0xcd,0x27,0xbb,0xdf,0xd6,0xa1,0xf1,0xd4,0x0f,0x0a,0x00,0x2f,0x16,0xed,0xd5,0xe3,0x03,0x2d,0x01,0x2b,0x20,0xe3,0x2f,0x08,0x2b,0xf3,0x0f,0x31,0x1c,0xd7,0xe7,0x25,0x1e,0xbd,0x25,0xd2,0xf3,0xe8,0xc2,0x04,0x26,0xfd,0xfc,0xf0,0x17,0x0b,0xe1,0xcf,0x27,0x27,0xc3,0x0d,0xec,0x81,0x30,0xe3,0xec,0x28,0xd0,0xf5,0x0d,0xd2,0x11,0xe3,0x0e,0xef,0x03,0x1e,0xfd,0x36,0x0d,0x39,0x08,0x13,0x29,0xf1,0x0d,0xf4,0xdd,0x01,0xda,0x0a,0x19,0x29,0x02,0xfb,0xf8,0xdd,0x18,0x02,0x03,0xfe,0xf3,0xfd,0x28,0xf7,0x15,0x0f,0xf9,0x98,0x0e,0x0d,0x26,0x12,0xfb,0xea,0x06,0xe9,0x81,0x31,0xec,0x01,0x05,0x0f,0x01,0x0b,0x0a,0x2b,0x00,0x0b,0x01,0x05,0x03,0x16,0xd6,0xf3,0x11,0xdf,0x0c,0xb9,0xe4,0xf6,0xd0,0x0a,0xa9,0xf9,0xe7,0x03,0xfe,0x0e,0xd3,0x1f,0x04,0xe4,0xde,0x3c,0xd6,0x21,0xfc,0xfe,0x34,0x03,0xcc,0xd0,0x03,0x0c,0xda,0xeb,0xfc,0x16,0xfe,0xf5,0x33,0x0b,0x1c,0x7f,0xfa,0x10,0x13,0xe4,0x20,0x18,0x2e,0x59,0x03,0x1d,0xf7,0xfe,0xff,0xe2,0xd0,0x0b,0x14,0x27,0xfd,0xbc,0x0a,0xe3,0xd0,0x1f,0xc4,0xfc,0xdd,0x10,0xf2,0xd2,0xd1,0x1f,0x1b,0xe2,0xd9,0x4c,0xdd,0x25,0x05,0x14,0x3d,0x00,0xce,0xe9,0x1c,0x2c,0xe2,0xf1,0x1d,0x19,0xe1,0xe4,0x45,0x03,0x3c,0x7f,0xe3,0x13,0x18,0xd2,0x2f,0xf3,0x29,0x2f,0x02,0x28,0x1c,0x08,0x0a,0x2e,0x01,0xb7,0x0d,0x81,0x0a,0xfd,0xd8,0xfe,0x00,0x0c,0xeb,0xf2,0xf3,0xfb,0x04,0x20,0x02,0x12,0x07,0xf2,0x03,0x07,0x18,0x07,0x0f,0x00,0x14,0x0d,0x0d,0xea,0x0f,0x2a,0xfb,0xe5,0x19,0x18,0x11,0x08,0x02,0x14,0x3c,0x08,0x05,0xfb,0x04,0xed,0x00,0x0d,0x45,0xec,0xf2,0xc9,0x17,0x11,0xfd,0x3a,0xb1,0x38,0xf3,0x76,0xe8,0x81,0x20,0x0a,0xb1,0x0d,0xa7,0x07,0x10,0xef,0x02,0x05,0xa4,0xf4,0x25,0x1c,0xca,0x47,0xdb,0xfc,0xf3,0xfc,0xce,0xf7,0x93,0x82,0x43,0x67,0xda,0x05,0x28,0xca,0x02,0x2c,0x3d,0x35,0x7c,0x13,0x31,0xf7,0x06,0xfa,0x0f,0x12,0xf8,0xa2,0x09,0xda,0x0b,0x17,0x0a,0x1a,0x4e,0x11,0xdb,0x32,0xdc,0xfe,0x0d,0x24,0x2b,0xd8,0x35,0x17,0x2e,0xe9,0xfd,0x28,0x4e,0xd7,0x01,0x38,0x11,0xb6,0xfc,0xda,0xf7,0x06,0x96,0x09,0x1b,0xf1,0x08,0xf0,0x0b,0x46,0x00,0xef,0x5d,0x48,0xba,0xf8,0xe3,0x81,0x36,0xc9,0xf7,0x40,0xd0,0xeb,0xdb,0x10,0x0b,0x19,0x47,0x15,0x03,0xf7,0x0b,0xbb,0xcb,0x81,0x0e,0x16,0xff,0xfc,0x10,0xdc,0x12,0xfd,0xe8,0xf5,0xfb,0x59,0x1f,0x01,0xfd,0xe3,0x3a,0xb3,0x1b,0xf0,0x18,0x0f,0x1a,0x08,0x3d,0xc9,0xd5,0xa1,0x27,0x5c,0xdf,0x2f,0x6b,0xe5,0xbd,0xf7,0x9f,0x36,0x34,0xc0,0x1e,0x0f,0xcc,0x0e,0xf4,0x81,0x14,0xf7,0xc7,0x1c,0x07,0x56,0x60,0x01,0x15,0x23,0xcf,0x10,0x33,0x36,0x4c,0x1f,0x3a,0x03,0x39,0xc8,0xee,0x0a,0x5d,0xc8,0xd9,0x3b,0x19,0xa0,0x09,0xd3,0x20,0xfb,0xc2,0x23,0x27,0x32,0xf4,0x44,0x21,0x32,0x1c,0xfc,0x49,0x7d,0xab,0xd2,0x1f,0x82,0x14,0x02,0xdf,0x7a,0xd8,0x0d,0x34,0x7f,0xf9,0x20,0x12,0xfb,0xf0,0xc1,0xdd,0xff,0x03,0xf3,0xfc,0x0e,0x22,0x06,0xf4,0x16,0xf6,0xff,0xee,0xf6,0xed,0xfd,0xcf,0x18,0x24,0xe3,0x25,0x0c,0x35,0x04,0x31,0xfd,0x47,0x1c,0xfc,0xf7,0x16,0xc5,0x06,0xdb,0x08,0x00,0x39,0xf5,0x03,0x22,0xe5,0x6b,0x0d,0xe8,0x1c,0xd7,0xfa,0xd1,0x43,0x5a,0xfb,0xd4,0x1f,0xe7,0xf1,0x01,0xc5,0x20,0x13,0xe1,0x2e,0x15,0xe0,0x04,0xc0,0x30,0xde,0xe5,0xe8,0xe3,0x0a,0xd8,0xca,0x16,0xec,0xe4,0x13,0x3d,0x03,0x03,0x15,0x02,0x12,0xc1,0xdd,0x91,0x10,0x12,0x0d,0x8d,0x32,0xf9,0xbd,0x84,0x4a,0xfc,0x12,0xf2,0xe6,0x1f,0x12,0x81,0x44,0x08,0xe7,0xf6,0xeb,0xf5,0x06,0xef,0xfa,0xdd,0xe5,0x06,0x02,0xfa,0xfe,0x2a,0x05,0xcb,0x06,0xd7,0x02,0xf5,0xed,0x20,0x1e,0xf8,0xe8,0x0f,0x0d,0xf6,0xf2,0x1f,0xf6,0x0f,0xd9,0x09,0x15,0xf2,0xea,0x33,0xef,0xec,0x04,0x3a,0xef,0x07,0x81,0xc8,0x1f,0x09,0xf0,0xfd,0xf6,0x28,0x07,0x06,0x15,0xd1,0x48,0x5b,0xf1,0xeb,0x21,0xd1,0xf7,0x43,0xee,0x24,0x1f,0xe2,0x30,0xd8,0x02,0x18,0xc9,0x3b,0xdd,0xea,0xf6,0xdf,0xfd,0x0b,0xf2,0xf1,0xf6,0xe9,0xff,0x25,0x12,0xfd,0x0f,0xef,0x04,0xf7,0xe0,0x81,0x39,0x14,0xf3,0xb0,0x2a,0xf0,0xef,0xc2,0x21,0xfe,0x2d,0x08,0xf3,0x07,0xf1,0xc6,0x1f,0xf2,0xd3,0x5b,0xf0,0xfd,0x5d,0xf2,0x02,0xf5,0xcf,0xe6,0x0c,0xb9,0x31,0xe0,0xe4,0xd9,0xc1,0xe1,0xc3,0xf5,0xca,0xff,0x12,0x15,0xde,0x18,0x15,0xd1,0xf8,0x41,0xe1,0x12,0xee,0xf0,0x2f,0xde,0xeb,0xa1,0xd7,0xba,0xf3,0xf4,0xd0,0xfa,0xc2,0x81,0x3d,0x14,0xcb,0x53,0xf7,0x13,0x18,0xbb,0x23,0x06,0xba,0xdb,0xf0,0xfb,0xce,0x05,0xf8,0xca,0x0e,0xcf,0x01,0xe1,0xe1,0x7f,0x2c,0xfa,0x3f,0xea,0x3a,0x0b,0x21,0x16,0xfc,0x00,0x23,0x04,0xf2,0x09,0x24,0xe5,0x0f,0x02,0x07,0xfc,0x11,0x15,0x3b,0x61,0xd1,0xda,0x2b,0x00,0xcb,0xfa,0xde,0x05,0xea,0xe5,0xce,0xda,0xe3,0x1e,0xfc,0x31,0x08,0x08,0x7f,0xeb,0x13,0xd6,0x03,0x24,0x08,0x5e,0x0a,0x4f,0xff,0x72,0xd9,0xcf,0x29,0x34,0x11,0x39,0xea,0x0a,0x20,0xdf,0x09,0x30,0x03,0xd7,0xee,0x27,0xe3,0xdf,0x35,0xdb,0x01,0xfd,0xc7,0x21,0x11,0xee,0x63,0x5a,0xf4,0xd3,0x6b,0xde,0x58,0x77,0xdd,0x04,0x6b,0xab,0x54,0xde,0xe9,0x23,0xf0,0x29,0x76,0xec,0x0e,0xd8,0xd4,0x06,0x02,0xe9,0xec,0x66,0xf8,0x7f,0xe8,0xcf,0x07,0xf9,0x03,0x0c,0xef,0x00,0x00,0xe2,0xfe,0xb0,0xf0,0xf3,0xf1,0xf2,0xbb,0x09,0xe1,0xe9,0xd0,0x00,0xc0,0xe8,0xe8,0x28,0x38,0x51,0xee,0x02,0x5a,0xf1,0xe3,0x20,0xfb,0xfb,0x41,0xab,0x18,0xfa,0xfc,0xf9,0xf5,0x32,0x7a,0x35,0xfd,0xde,0x1b,0xef,0x0e,0xa6,0xc1,0x58,0xdc,0x61,0x27,0x8d,0xc2,0xc5,0xca,0x1d,0xc1,0x18,0xb8,0x3f,0x13,0xa3,0xba,0x35,0x11,0xb8,0xd0,0x7f,0xa0,0x08,0x03,0x11,0xfe,0xc8,0xbb,0xc1,0x45,0x3e,0xb0,0x20,0x2e,0x0e,0x24,0xf9,0x45,0x36,0x3f,0x5e,0xda,0x15,0x3f,0xa3,0xea,0xf5,0xbe,0x6c,0xf9,0x37,0x32,0xf7,0xe4,0xa0,0xb0,0xed,0xe4,0xdb,0xee,0x3c,0x0b,0xdb,0xf6,0xd0,0xee,0xff,0xd0,0x1e,0xee,0x19,0xbd,0x18,0x23,0xcf,0x29,0x30,0x30,0x04,0x13,0x00,0x6d,0x11,0x19,0xfd,0xcf,0x81,0x1a,0x04,0xa5,0x03,0xfb,0xb7,0x16,0x32,0xb2,0x79,0x01,0xe2,0x28,0xd5,0xf3,0xf8,0xc9,0xf1,0xf7,0xde,0x08,0x04,0xf5,0x01,0xfb,0xe8,0xf6,0xf3,0xa2,0x09,0x7f,0xd0,0x24,0xaa,0xd0,0x09,0x01,0xc2,0x23,0x68,0xfb,0xdb,0x0d,0x14,0xee,0xca,0x2d,0xe9,0xe0,0xf4,0x2d,0x29,0x10,0x1e,0xec,0xbd,0x23,0x5f,0xd9,0xe3,0xea,0x0b,0xc8,0xf5,0xb5,0xf9,0x6b,0xce,0xe5,0x63,0xee,0x00,0x00,0x00,0x00,0x16,0x07,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x31,0xc8,0xbc,0x09,0x92,0x7f,0xc2,0xe0,0x1c,0x0e,0xd1,0xb9,0xca,0xee,0x28,0xfb,0x03,0x6b,0x7a,0xba,0x7f,0xce,0x6f,0xec,0xd9,0xfa,0x37,0x4d,0xc9,0x45,0xf6,0xa9,0x38,0xf6,0x0f,0x0a,0x00,0x17,0xf5,0x1e,0x04,0x52,0xfd,0xed,0x81,0x19,0x04,0xe1,0xb0,0x18,0x4f,0xf8,0x43,0xaa,0xfd,0x28,0xe0,0x2d,0x4f,0x1e,0xa3,0x9b,0x81,0xc8,0x00,0x0c,0x37,0x01,0x2e,0x02,0x19,0x03,0xdd,0x4d,0xe7,0x1c,0x81,0x1f,0xff,0xe1,0x18,0x26,0x39,0x11,0x23,0xba,0x08,0x17,0xec,0x45,0x7b,0x47,0x7f,0x29,0xda,0xeb,0x6c,0xef,0xb9,0xf2,0xb8,0xc8,0xfd,0x14,0x5c,0x5f,0xd4,0x85,0xce,0x7f,0x6f,0x1a,0xf9,0x17,0x36,0x30,0x23,0x9b,0x17,0x0c,0xcb,0x7c,0x7f,0x5e,0xe8,0xf3,0xb0,0x04,0xaa,0xf2,0x10,0x03,0x20,0xdb,0x16,0xf2,0xe9,0xfc,0x81,0x14,0xbc,0xde,0xf5,0x0d,0xaf,0x30,0x42,0xbc,0x73,0x79,0x64,0xaa,0x9a,0x19,0xf8,0x7f,0x54,0x08,0x0b,0xc3,0x0a,0x16,0xea,0xf6,0xfd,0xe4,0x18,0xec,0x13,0x9f,0x10,0x14,0x7f,0xff,0x04,0xf6,0x1b,0x2c,0x1b,0x1a,0x2a,0x81,0x28,0x1e,0x10,0xc4,0xf2,0x0f,0xe0,0x20,0xce,0xd1,0x0a,0x11,0xef,0x02,0xf1,0xd6,0x11,0x00,0x1a,0x93,0x0b,0x04,0x7f,0xfb,0xf8,0xfb,0x66,0xd4,0xe1,0x39,0xcc,0xf6,0xa3,0x4f,0x31,0x20,0x7f,0xc5,0xfa,0xee,0xda,0x1c,0x7f,0x2a,0xbb,0x06,0xcd,0x11,0x07,0xe6,0x36,0xc3,0x50,0xe4,0x0e,0x63,0x08,0xc7,0xe7,0x2a,0x59,0x34,0x4c,0x81,0xf8,0x50,0xe0,0x1d,0x4a,0x4a,0x69,0x00,0x98,0xf1,0x8c,0x23,0x1a,0xae,0x55,0x7e,0x34,0x81,0xad,0x23,0x20,0x5a,0x75,0x2c,0xf8,0x02,0x7f,0x28,0xc6,0x1f,0xb7,0x9d,0x03,0x1b,0x53,0xed,0x10,0xca,0xcb,0x65,0x19,0xf3,0xa9,0x3d,0x3e,0x81,0x24,0x4e,0x68,0xac,0xf3,0xf1,0xa1,0x29,0x25,0x54,0x62,0x1b,0x7f,0x17,0xb5,0xff,0xb2,0x2b,0xe7,0xf7,0x40,0xf3,0x54,0xc7,0xb9,0x53,0x13,0xd9,0xcd,0x2f,0x1c,0xb9,0x19,0x7f,0x2e,0xad,0xc1,0xec,0xff,0x1c,0xd7,0x1d,0x28,0xc8,0x4c,0x2c,0xec,0xdd,0x40,0x7f,0x4c,0xab,0xe0,0xd2,0x09,0x60,0x50,0x50,0x2a,0xae,0xf6,0x1d,0x01,0xfe,0x36,0x0c,0x44,0xe0,0xd0,0x2b,0x81,0x4a,0x91,0x22,0x0d,0xa8,0x16,0x17,0x0f,0x15,0x28,0xc6,0xfa,0x17,0xfb,0xe2,0x7f,0x28,0x46,0xfa,0x9e,0xdd,0x38,0x26,0xe6,0x1d,0xde,0x81,0x2b,0x25,0x4c,0xde,0xab,0xe0,0xb4,0x58,0x1a,0xff,0xa8,0x2b,0x3a,0xbc,0x63,0x7f,0x5c,0x96,0xa0,0x27,0xe1,0x6d,0x58,0x03,0x18,0xe0,0x07,0xe5,0xe1,0xc7,0xa5,0x7f,0xd8,0xbe,0x25,0xf3,0xff,0xa6,0x22,0x18,0x4b,0x30,0x90,0xed,0xf7,0xd3,0xe4,0x39,0x10,0xb7,0xf3,0xc7,0x81,0xf6,0x3c,0xe1,0x2b,0x07,0x07,0x0e,0xf7,0xdb,0x1c,0x7f,0x29,0xc4,0xdf,0x15,0x09,0x37,0x22,0x2a,0x1b,0xd8,0x32,0x0b,0xf4,0x1a,0x0b,0xd8,0xfd,0x1a,0xff,0xe7,0x7f,0x0b,0x03,0x02,0xaa,0xc1,0x35,0xf6,0xc8,0xbd,0x9b,0x7f,0xdd,0xad,0x31,0xe4,0xe5,0xbb,0xe6,0x41,0x6f,0x10,0x60,0x32,0xf0,0xef,0xf0,0x02,0x08,0xe6,0x13,0xfa,0x7f,0x02,0x0e,0x5b,0xfd,0xd8,0x02,0xe2,0xd8,0xc5,0x9f,0x7f,0xcc,0xbc,0x31,0xd6,0x1e,0xac,0x1e,0xff,0x47,0x23,0x12,0xe4,0xe8,0x1a,0xdf,0x81,0xcf,0x43,0x4a,0xc8,0xdc,0xcf,0x13,0xe0,0x02,0x59,0x12,0xbc,0xce,0x2a,0x81,0x26,0x9a,0xfb,0x41,0x34,0xd1,0xa4,0xed,0xc9,0x34,0x52,0x1e,0x1b,0x26,0x18,0x42,0xfd,0x33,0xf7,0xcf,0x63,0xb9,0x44,0x81,0x5d,0x02,0xc1,0x5e,0xc4,0xbf,0x4e,0xba,0x56,0xb5,0x21,0x2a,0x7f,0x15,0xd4,0xef,0xed,0x12,0x32,0x7f,0x1e,0x9f,0x12,0xa1,0x17,0xf3,0xe4,0x5e,0xbf,0x38,0xc8,0x0d,0x5c,0x29,0xe7,0x77,0x15,0xaf,0xfe,0x81,0xfb,0xcc,0xdc,0x4b,0xd7,0x04,0xb2,0x37,0x54,0x55,0x1d,0x12,0x76,0x63,0xca,0x55,0xbf,0x53,0xe2,0x01,0xff,0xe2,0x2a,0x81,0x7a,0x0b,0xca,0x13,0x01,0x30,0xf8,0x17,0x17,0xf9,0x10,0xeb,0x72,0x02,0xff,0x81,0x02,0x09,0xf7,0x44,0x15,0xf7,0x0f,0x20,0x02,0xff,0x05,0xf5,0xfb,0x7f,0x1e,0xce,0x1b,0xb4,0xb8,0xe1,0xe2,0xed,0x0f,0xeb,0xf4,0x0b,0x00,0x06,0x16,0x81,0xfa,0xbf,0xfe,0x30,0x21,0xec,0x5a,0x6a,0xbe,0x7f,0xec,0x67,0xe3,0xde,0xf9,0x3b,0x50,0x0b,0x38,0xe5,0xb8,0x37,0xb9,0xe7,0x22,0x91,0x13,0x81,0x2f,0x25,0x5d,0x30,0x97,0xd6,0xd2,0xf5,0x3a,0xb5,0xef,0xd4,0xe1,0xa9,0x02,0x04,0xdc,0x47,0xf9,0x81,0xb1,0xdc,0x1c,0x6e,0x7a,0xbe,0x0f,0xfa,0xdc,0x06,0xe2,0x47,0xe3,0x0c,0xda,0x81,0xff,0xaf,0x13,0x26,0x17,0x12,0xf1,0xc8,0xaa,0x94,0x73,0xf5,0xa1,0x39,0xba,0xc6,0xa6,0xf5,0x4a,0x7f,0x15,0x02,0x23,0xfd,0xc4,0xf9,0xd6,0x3c,0xbd,0xf3,0x83,0xf5,0x31,0x7f,0x39,0x1f,0xe8,0x10,0xf8,0x29,0xf8,0x0b,0x1d,0xed,0x19,0xee,0x73,0xf9,0xfd,0x81,0xfc,0x0c,0x01,0x00,0x0c,0xdf,0xf6,0x02,0x06,0x17,0xd8,0x04,0x94,0xf0,0x19,0x7f,0xf4,0x10,0xfd,0x26,0xfe,0xbb,0xff,0xcf,0xf9,0x26,0xe6,0x23,0x95,0x81,0xf1,0x04,0x3c,0x31,0xe6,0x51,0xc2,0xe3,0x45,0xc4,0xe2,0xa9,0x3a,0x21,0x2a,0x23,0xcc,0x81,0xd9,0xd4,0xed,0x3c,0xde,0xa4,0xf4,0xa0,0x7f,0xef,0xe1,0x1d,0x0a,0xe8,0xcc,0x05,0x0f,0x46,0xf2,0x4e,0x1f,0xe0,0x1c,0xcb,0x81,0x05,0x2d,0x46,0xfc,0xde,0xd8,0xd0,0x54,0x1e,0x06,0x26,0xce,0xbd,0xd4,0x93,0x7f,0xb8,0xa5,0x29,0xd6,0xd3,0xa9,0xd7,0x0d,0x51,0x08,0x00,0x00,0x00,0x00,0xa6,0x0a,0xff,0xff,0x04,0x00,0x00,0x00,0xc0,0x04,0x00,0x00,0x39,0x18,0xf8,0xc0,0xf2,0x11,0x26,0xee,0xc0,0x33,0xc1,0xdb,0x5e,0xe1,0x01,0xed,0xfa,0xd1,0x4d,0xc7,0xdc,0x04,0xde,0x02,0xec,0xe6,0xfa,0xd0,0x18,0x7f,0x28,0x17,0xdf,0x10,0xee,0x1a,0x3f,0xe0,0xf6,0xd3,0x2c,0xa7,0xd8,0x25,0xd3,0xb8,0xe6,0xda,0x0a,0x31,0xd4,0x19,0xf0,0xba,0x0a,0x0f,0xf9,0x16,0xe7,0x19,0x3e,0xf0,0xba,0xd5,0xdb,0xd8,0xe3,0x41,0x02,0xd2,0xd5,0x01,0xf6,0x0e,0x06,0xf4,0xe7,0x44,0x51,0x2e,0xb3,0x23,0xde,0x24,0xec,0x13,0xe5,0x57,0xe1,0x54,0x03,0x2e,0x34,0xd9,0x0e,0x13,0x1e,0x38,0x27,0xdf,0x22,0x45,0x6c,0x14,0xe3,0xd2,0xfa,0x35,0x25,0x2f,0x37,0xe9,0xc2,0x22,0x1b,0xea,0xa3,0x0b,0x63,0x7f,0x08,0xf0,0x49,0x1f,0x10,0x16,0x23,0xd9,0x28,0xb4,0x42,0x0b,0x2d,0xc9,0xd5,0x58,0x16,0x22,0x2e,0xeb,0x53,0xdb,0xeb,0x0b,0x33,0x41,0x3f,0x39,0xfb,0xd5,0x2a,0x49,0xc8,0x1d,0x2d,0x60,0xe8,0x0d,0xe2,0x07,0x2c,0x06,0x0c,0x1f,0xae,0x3d,0xed,0x2b,0x55,0xc4,0xd8,0x1f,0x47,0x38,0x25,0xe0,0x1e,0x5a,0x44,0x3d,0xef,0x81,0xda,0x0e,0x1e,0x1f,0x35,0xe6,0xc4,0x3a,0x0f,0x2d,0xb7,0x38,0x4d,0x44,0x29,0x12,0x27,0x27,0x29,0xcc,0x42,0xd6,0x17,0x1d,0x38,0xe7,0x24,0xd8,0xbf,0x36,0xf2,0x24,0x25,0x04,0x42,0xea,0xf4,0xf8,0x0d,0x50,0x44,0x2d,0xe6,0xe7,0x1f,0x18,0x2e,0x0a,0xff,0xb2,0x36,0xe6,0x4f,0xfc,0xeb,0x08,0xe7,0xc4,0x45,0xc7,0x19,0xce,0x0c,0x11,0x25,0xe0,0xd8,0xe5,0xbe,0x11,0xf6,0xb1,0xb7,0xca,0x33,0x7f,0x27,0xf5,0xf6,0xdd,0xc6,0x1b,0x4d,0xc6,0xfd,0x03,0x63,0xbe,0xbd,0xaf,0xd5,0xfd,0xb0,0xdf,0x01,0x02,0xe5,0x2c,0xcf,0x73,0xdc,0x28,0xd3,0x3b,0x3b,0xc8,0x14,0xd9,0xce,0xfd,0xbf,0xfa,0x25,0x1e,0xd4,0xb9,0xda,0xd1,0x0b,0x29,0x08,0xf2,0xb3,0x31,0x45,0x67,0xd9,0x16,0xcf,0x07,0x27,0xde,0x2b,0x20,0x9b,0x5f,0xd9,0x41,0x45,0xb1,0xf1,0x40,0x49,0x33,0x34,0xce,0x34,0x5f,0x43,0x56,0xd5,0x81,0xd7,0x24,0x41,0x29,0x3c,0xd3,0xb5,0x4b,0x28,0x20,0xa9,0x34,0x6c,0x37,0x21,0x0f,0x34,0x3e,0x27,0xd2,0x4a,0xc6,0x24,0x12,0x41,0xdd,0x25,0xc3,0xc3,0x22,0xf0,0x2e,0x33,0x01,0x42,0xe2,0x03,0xed,0x11,0x44,0x5c,0x29,0xf6,0xd9,0x24,0x28,0xfc,0x98,0xaf,0x4b,0x22,0x08,0xba,0x9a,0x20,0xcc,0x62,0xcc,0xe9,0xe0,0xc7,0x0c,0x81,0xdf,0xee,0x1f,0x08,0xc6,0x2a,0x14,0x1c,0x2a,0xa1,0x74,0xbb,0xcb,0xcd,0xc9,0xcd,0x01,0xfb,0x1a,0x0d,0x39,0xd3,0xff,0xf5,0x40,0xe4,0xa7,0x41,0x0d,0xef,0x13,0x1e,0xf5,0xfe,0x0f,0x32,0xcd,0xf0,0xac,0x0e,0xf9,0xdc,0xd1,0xda,0x08,0x03,0x0e,0xf3,0x1c,0xf5,0x37,0xe1,0x02,0xc6,0xcc,0xe8,0x07,0xde,0xb2,0xe2,0x3c,0x5b,0x39,0x99,0x12,0xd8,0x41,0xe1,0xd6,0xee,0x7f,0xae,0x5f,0x1a,0x36,0x3b,0xff,0xea,0x26,0x18,0x33,0x42,0xe7,0x48,0x48,0x5e,0x37,0xd8,0xb1,0xfd,0x39,0x2f,0x2a,0x4c,0xc8,0xa1,0x1c,0x15,0xdd,0x9e,0x25,0x7f,0x71,0x12,0x2e,0x51,0x22,0x06,0x1e,0x29,0xf0,0x38,0xb2,0x4d,0x34,0x35,0xca,0x09,0x5e,0xf5,0x2e,0x60,0x00,0x59,0xf6,0x15,0xfb,0x43,0x4d,0x52,0x4d,0x11,0xd5,0x26,0x67,0x2d,0x1c,0x02,0xb6,0x1b,0xdd,0x63,0x08,0xe1,0x24,0xa2,0xf1,0x36,0xbf,0x3c,0xc5,0x57,0x2f,0x19,0xcb,0xec,0x1e,0xb2,0x0a,0xfa,0xc7,0xd5,0xa8,0x4b,0x6f,0x21,0xfd,0xe7,0xe4,0xd8,0x22,0x45,0xd0,0xf8,0x0b,0x3d,0xca,0xd4,0xe3,0xeb,0x16,0xb9,0xce,0x09,0xf9,0xdf,0x33,0xc4,0x7f,0xf9,0x3a,0xe1,0x38,0x36,0xfb,0x0e,0xe8,0xd1,0x00,0xe9,0xed,0x0b,0x10,0xdc,0xe2,0xd4,0x07,0xef,0x32,0x15,0x07,0x4e,0xf6,0xe2,0x9b,0x05,0xf3,0x36,0x17,0xbb,0x20,0xab,0x11,0x57,0xb7,0x38,0xcc,0xe4,0x46,0x19,0xba,0xb3,0xec,0xce,0x2b,0xda,0xaf,0xe9,0x99,0x2d,0x7f,0x31,0xf7,0xc8,0xe5,0xdd,0x1e,0x31,0xbc,0xe0,0xc6,0x40,0xc9,0xbb,0x0a,0xd4,0xf2,0xe4,0xc3,0xd7,0x4b,0xb7,0x39,0xdc,0xd2,0xdd,0x43,0xe4,0x30,0x40,0x08,0x1a,0xdf,0xd1,0xf7,0xda,0x0e,0xf5,0x0f,0x0c,0xce,0xb8,0xf9,0x0b,0x1a,0xf1,0x06,0x11,0xe7,0xb5,0x53,0x29,0xdf,0x1b,0xbf,0xed,0x0a,0xe0,0x9b,0xfc,0xbd,0x0e,0xe8,0x25,0xe9,0xb4,0xd6,0x1e,0x2a,0x08,0xf0,0x41,0x54,0x92,0x3c,0x14,0xcd,0xea,0xda,0xc3,0x0b,0xea,0x28,0x3f,0x37,0xd3,0x2f,0x17,0x03,0x01,0xf2,0x4e,0x13,0xa8,0xe5,0x66,0xae,0x04,0xf9,0xe1,0x73,0x11,0xc5,0x08,0x13,0xe6,0x1a,0xf5,0xe8,0xf1,0x26,0xd3,0xf2,0xff,0x7b,0x81,0x37,0xf4,0x07,0xbe,0x2a,0x11,0xdd,0xec,0x3b,0x40,0x16,0x0a,0x3e,0xf3,0xf1,0x44,0x5e,0x27,0xca,0x20,0x29,0xc3,0x36,0x0b,0x9c,0x6e,0x1f,0x26,0x27,0xff,0xcc,0xe1,0x35,0x55,0xff,0xe3,0x13,0xe6,0x25,0x23,0x29,0x08,0x28,0x22,0x1e,0x26,0x2a,0xdb,0xf5,0x14,0x24,0xf9,0x84,0x00,0x0f,0x2c,0xd4,0x19,0xc6,0x31,0xfa,0x08,0xc9,0x1d,0xd6,0x81,0xea,0x64,0x14,0xce,0xbf,0x30,0x9f,0x81,0x05,0x0a,0xf8,0x1d,0xd2,0xd9,0xe6,0x20,0xd8,0xb2,0x2b,0x53,0x71,0xd6,0x24,0xc0,0x0c,0x33,0xe5,0x4d,0x0e,0x99,0x7d,0xc1,0x55,0x34,0x99,0xf5,0x58,0x53,0x26,0x40,0xc3,0x27,0x5f,0x43,0x5e,0xc2,0x81,0xd6,0x24,0x5b,0x30,0x34,0xc8,0xa6,0x47,0x3a,0x28,0x9c,0x2f,0x77,0x28,0x22,0xfa,0x3b,0x4b,0x27,0xc8,0x54,0xb3,0x32,0x10,0x3f,0xd1,0x27,0xb7,0xb0,0x15,0xf9,0x2f,0x3d,0xf4,0x34,0xdc,0x0a,0xea,0x15,0x3b,0x6e,0x13,0xf6,0xca,0x23,0x25,0xed,0xdd,0x7f,0xf3,0x02,0x04,0xd9,0x44,0x75,0x3b,0x50,0x0c,0xf2,0x57,0xe2,0x1b,0xb5,0x1f,0x1c,0x5e,0xe8,0xd9,0x06,0x0a,0xb0,0xba,0x68,0xba,0xde,0x20,0x02,0x11,0x55,0xf6,0x03,0xdc,0xcd,0xca,0x3a,0x0a,0xde,0x16,0xe3,0xcd,0xda,0xcb,0x20,0x22,0xd0,0xe3,0x10,0xe9,0x32,0xf7,0xd5,0x2c,0xf4,0xe1,0xe1,0xc0,0x42,0x0e,0x0b,0xb9,0x02,0xc4,0xd6,0x9f,0x7b,0xda,0x1f,0xac,0x2c,0xca,0xd9,0xfb,0x35,0x1c,0x0b,0x00,0xb5,0x21,0x04,0x2c,0xb3,0x19,0xb6,0x3d,0x30,0x1b,0x17,0x0e,0x22,0xe0,0x14,0xc6,0xe1,0x20,0x0c,0xfc,0x14,0x20,0x34,0xfb,0x05,0x2e,0x25,0x22,0xed,0x2a,0x23,0xea,0xef,0xef,0xf8,0xbb,0xfc,0xcb,0x2c,0x7f,0xed,0xdc,0x1c,0xe8,0x07,0x48,0xf0,0x06,0x14,0x8e,0x27,0x2d,0x18,0xfa,0x03,0x5b,0x2b,0x07,0xff,0xee,0x19,0xe4,0xf5,0x46,0x22,0x17,0x01,0x31,0xfc,0xf0,0x17,0x3d,0x48,0x96,0xa9,0xe1,0xe1,0xda,0xfc,0x1d,0xb8,0x13,0xd0,0x1a,0x15,0xd6,0x24,0xd4,0xa8,0x51,0xb9,0xd5,0xcc,0xe4,0x0d,0x2c,0xee,0xe7,0xd6,0xe1,0xff,0x1d,0x1b,0xeb,0xbf,0xeb,0x01,0xed,0x00,0xe6,0xda,0xb7,0x2d,0xf1,0xe4,0x2d,0xfd,0x0e,0x07,0xcc,0xdb,0x3d,0xbf,0x2f,0xe5,0x81,0xec,0x1b,0xfe,0x1c,0x49,0x2a,0xff,0xf0,0xfc,0x0a,0xd3,0x23,0x15,0x49,0x14,0x13,0xc2,0x1e,0x15,0xfc,0xbd,0x0b,0x3c,0x9a,0xb5,0xd8,0x4b,0xa5,0x2a,0x52,0x26,0x36,0x0e,0xd6,0xfb,0xe3,0x01,0xc1,0xb9,0x7f,0x9d,0x04,0xd2,0xf6,0xe8,0x28,0x9d,0xc0,0xce,0x92,0x23,0xed,0x12,0xe9,0xf2,0xc2,0xc9,0xe0,0x2e,0xdf,0x18,0x2f,0x70,0x26,0xb4,0xec,0x0a,0xff,0xf4,0xd9,0xd0,0xd0,0xda,0xe1,0x99,0x5e,0xa4,0xec,0xd1,0x2c,0x70,0xdd,0x22,0xce,0xd3,0x2a,0xad,0x37,0xd0,0xda,0xe3,0x03,0xd7,0xcd,0x14,0xf2,0xa9,0x07,0x00,0x00,0x00,0x00,0x76,0x0f,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x09,0x00,0x00,0xd6,0xdf,0x3b,0xf9,0xfc,0xdc,0xf3,0x94,0x39,0xf9,0xfd,0x7f,0xed,0x18,0x2c,0xf2,0x1b,0xb5,0x12,0x04,0x1f,0x23,0x4a,0xf6,0x17,0x0b,0x02,0xdc,0xd1,0x21,0x08,0xf2,0x00,0xa2,0x2a,0x81,0xdf,0xac,0x72,0xfe,0x9b,0x04,0x55,0x0d,0xf5,0x16,0x16,0xed,0x35,0xbd,0xe8,0x9e,0x19,0xbf,0xaf,0xfc,0x14,0xca,0xf9,0x27,0xa2,0x21,0x48,0x0f,0x22,0x25,0x2d,0x0c,0xc1,0x30,0xed,0xd5,0x81,0xca,0x46,0xc5,0xed,0xf1,0x25,0x04,0x21,0x04,0xe2,0x9a,0x58,0x9e,0x07,0xd4,0xea,0x10,0xbe,0x11,0x04,0x1e,0x36,0x2f,0xaf,0x81,0xc6,0x23,0xee,0xe1,0xb1,0xbc,0xf2,0xd4,0x49,0xde,0x0c,0x16,0xc1,0x8e,0xa6,0x17,0x6a,0x0f,0x0a,0xe8,0xfb,0x07,0x19,0xed,0x1d,0x0d,0x1d,0xe1,0xe4,0xe6,0x0b,0xf4,0x3c,0xc7,0x2c,0xb5,0xea,0x3d,0xd9,0xce,0x01,0xf1,0xc6,0xca,0xbd,0x2e,0x7f,0xed,0xba,0x0e,0xee,0x46,0xef,0x30,0xf7,0xf7,0x14,0x06,0xf8,0x01,0xfb,0x20,0x7f,0xd4,0xec,0xf5,0x36,0xe8,0xe2,0x14,0x0a,0xd5,0x08,0x01,0x3e,0xeb,0x06,0x00,0x14,0x04,0xa4,0xfa,0xdd,0xd9,0x20,0x2a,0x09,0x09,0x17,0xdc,0xee,0x02,0xfe,0x0e,0xd8,0x9b,0xb6,0x34,0x81,0x1f,0x48,0x90,0xb3,0x12,0x04,0xec,0x04,0x6c,0xd9,0x3b,0xaf,0x06,0xf0,0x51,0x45,0x3e,0x57,0xc5,0xc4,0x12,0xf6,0x0c,0x02,0x09,0xfa,0xca,0x66,0x55,0xd2,0x7b,0xa8,0x07,0xd7,0x7f,0x4a,0x9a,0x7b,0x5b,0x9e,0x5d,0xe9,0xeb,0x09,0xe2,0xa8,0x00,0xb9,0x28,0x3a,0x34,0xad,0xf3,0xef,0xee,0xb6,0x3f,0x21,0x09,0xb5,0xd8,0x0d,0xee,0xbf,0xcf,0xc2,0xfe,0xe3,0x37,0xf6,0xe4,0x11,0x81,0x00,0xf2,0x7c,0x8f,0x05,0xdf,0x10,0xbd,0x0c,0x28,0xdb,0xfb,0x13,0xdf,0x1a,0x2c,0xeb,0x02,0x81,0xad,0x2f,0xd0,0x2d,0x41,0x74,0x63,0xc6,0xc1,0xe8,0xf0,0x27,0x86,0x12,0x23,0x0d,0xcd,0xe1,0xfb,0xcc,0xcd,0x1e,0x12,0xff,0xdc,0x08,0x16,0x31,0xef,0xdb,0x32,0x37,0xd3,0xba,0x1a,0x45,0xcf,0x81,0x03,0xed,0xdc,0x25,0x0b,0x14,0x00,0x46,0xb3,0xde,0xbf,0x39,0xdb,0xff,0xe1,0x1d,0x2a,0x3b,0xfd,0x2b,0xec,0x11,0xee,0xe2,0x0a,0xcb,0x77,0x11,0xbe,0x01,0xa2,0xe8,0xbc,0xc9,0xb3,0xf5,0x0a,0x7f,0x2b,0xf0,0x12,0x1d,0xfa,0x35,0xec,0x59,0xbb,0xf6,0xbf,0x5e,0xfd,0x33,0xee,0x0f,0xd3,0xf5,0xf5,0xf4,0x54,0xe4,0x81,0xf9,0x3b,0x94,0x26,0x02,0xe1,0x88,0x89,0xb5,0x3e,0xb3,0x9b,0x28,0x2a,0x1d,0x06,0x42,0x6b,0xc4,0x52,0xc4,0x22,0xf8,0xee,0x26,0x04,0xf8,0xcb,0xe2,0x96,0xec,0xc0,0xf7,0xe0,0x20,0xc0,0x16,0x9d,0x02,0xf4,0xce,0x0a,0x81,0xd6,0x16,0x22,0x22,0x44,0xfd,0xf4,0x19,0xfc,0xef,0xd5,0x1f,0x13,0x1a,0xdf,0xeb,0x05,0xf5,0x59,0x25,0xf8,0x15,0x06,0x81,0x0a,0x73,0xb1,0xef,0xb8,0xd6,0x1c,0xe7,0x9b,0xff,0x3d,0xf7,0xfa,0xf5,0x09,0x01,0x99,0xe3,0xfe,0x1c,0xfc,0xe7,0x07,0xea,0xd7,0x24,0x63,0x46,0x55,0xf7,0x3b,0xe5,0xda,0x81,0xae,0x0a,0xb1,0xfb,0xdd,0x42,0x02,0xe6,0x13,0xee,0xec,0x32,0xbd,0x26,0xce,0x11,0x00,0xe3,0x00,0xf5,0x16,0x0b,0x4c,0xc5,0x93,0x72,0x38,0x08,0x19,0xa6,0xef,0xdf,0xc9,0x5d,0xa8,0xd6,0x37,0xe2,0x81,0x0d,0x0d,0x1d,0xcb,0x2f,0xe0,0x55,0xfd,0xde,0x04,0xec,0x0b,0x19,0xeb,0x04,0xfc,0x16,0x4b,0x81,0xbf,0xf1,0xd4,0x0e,0xe5,0x02,0x00,0x7c,0xb9,0xb6,0x0a,0x62,0x79,0xab,0xc5,0x14,0x0d,0xb2,0x7c,0xa4,0x1a,0xe4,0xdb,0xf3,0x37,0xf5,0xf9,0x18,0x23,0x58,0x0c,0x0b,0x28,0x27,0x00,0xea,0x2b,0xff,0x0d,0xd3,0x0d,0x0e,0x0a,0x1f,0x7f,0x49,0x10,0xe1,0xec,0xe1,0xda,0xc8,0xc4,0xfe,0x28,0xf1,0xcf,0x12,0x1a,0x00,0xdf,0xea,0x3e,0xed,0xff,0x32,0x32,0xfc,0x07,0x18,0xbc,0xb9,0x4b,0xfb,0x1d,0xa5,0x2d,0x09,0x04,0xda,0x7f,0x04,0x28,0x00,0x06,0x1b,0x04,0xe3,0xf8,0x02,0x12,0x08,0x11,0xbd,0x28,0x8a,0x81,0x3b,0x25,0xf4,0xdc,0x1b,0xee,0x45,0xb2,0xee,0x05,0x0e,0x1b,0x83,0x53,0x91,0xe5,0xc4,0x24,0xf9,0xe1,0xca,0xf2,0x3c,0xfc,0xfe,0xf7,0xd8,0xf5,0x33,0x4b,0xec,0xdd,0xf4,0x01,0x0c,0x12,0xfd,0xa6,0xd2,0x45,0x39,0xa6,0xb7,0x34,0x34,0x51,0xe2,0x7f,0x0c,0x6e,0xef,0xf4,0x19,0x11,0xf3,0xe6,0xe7,0x24,0x10,0xf0,0x31,0xfb,0x81,0x1f,0x4c,0x42,0xd4,0x27,0x18,0xd7,0xc8,0x44,0xbc,0xef,0xce,0x1a,0xec,0x18,0xcc,0x18,0x01,0xe7,0xf6,0x67,0xf2,0x07,0xfe,0xfa,0x23,0xeb,0xdb,0x19,0x18,0x0f,0x9e,0x2f,0x3d,0xf1,0x30,0xee,0xbd,0xba,0x06,0xf2,0x81,0x46,0x90,0x0d,0x17,0x02,0xc2,0x2e,0xf5,0xed,0x43,0xf0,0x22,0x15,0xe6,0x09,0x18,0xf7,0xff,0x02,0xb3,0xe7,0xfb,0x26,0x04,0xe7,0xc2,0xec,0x16,0xd5,0x15,0xcc,0x2a,0x7f,0x03,0x2a,0x0d,0xee,0x5d,0x0f,0x2e,0xe8,0xf0,0x46,0xdf,0x22,0x11,0xff,0x03,0xfe,0xf7,0xe4,0x37,0x81,0xe0,0xae,0x35,0xf6,0xc0,0xbf,0xd2,0xcc,0x10,0x01,0x13,0xde,0xe3,0xd3,0x41,0x0a,0x09,0xda,0xab,0xef,0xed,0xf8,0xc4,0xfd,0xde,0xfa,0x1c,0x07,0x13,0xe8,0xd2,0x27,0x24,0x52,0xd6,0xd8,0x2d,0xe6,0x0b,0x95,0x2b,0x85,0x02,0x3d,0x19,0x18,0x20,0xed,0x22,0xa1,0x7f,0xd7,0x3a,0x5b,0x29,0xfe,0x31,0x09,0xe9,0xdf,0xe5,0xf2,0x08,0xdc,0xad,0xe6,0x6d,0x74,0x81,0xa2,0x83,0x9d,0x47,0x00,0xc4,0xdb,0xa4,0xb0,0x32,0xff,0xd9,0xf2,0xf4,0x98,0x11,0x01,0xf7,0x0a,0xc1,0xfc,0x24,0x04,0x0e,0x1d,0x2e,0x54,0x81,0xdf,0xfd,0x00,0x14,0xcb,0xec,0xd1,0x9e,0x09,0x90,0xfe,0x82,0x0e,0x59,0x04,0xb4,0x2d,0xb2,0x31,0xec,0xf1,0x1e,0x1e,0xec,0xd5,0x1c,0x0b,0xe5,0xd1,0xf7,0x0b,0x09,0x12,0x60,0xca,0xf2,0x0a,0xe3,0xe0,0x2a,0xd4,0xb7,0xb7,0x14,0x4f,0x2e,0x03,0xf0,0x48,0x0b,0x7f,0xe1,0xf3,0xf7,0xea,0xfe,0x20,0x19,0xe5,0x00,0x2f,0xf6,0x81,0xf9,0x5e,0xf2,0x35,0x0e,0xed,0xe7,0x0e,0xb5,0xc5,0xfa,0xff,0xe4,0x3d,0x0f,0xcd,0xd0,0x2c,0x3f,0xe5,0x0d,0xfc,0xc2,0x02,0x05,0x12,0x10,0xf4,0xfc,0xf4,0x56,0xfe,0x7f,0xab,0x15,0x1a,0xd4,0xd4,0xa0,0xc0,0x87,0x38,0xdf,0x00,0xed,0x09,0x2c,0xfe,0x58,0xff,0x29,0xd1,0xfe,0xe8,0xe4,0x02,0x11,0xe9,0x11,0x03,0xe4,0xf3,0x11,0xe9,0xd7,0xdf,0xf9,0xee,0x3f,0xe4,0x54,0x81,0x03,0x06,0x03,0xf7,0x99,0xfe,0x01,0x0c,0x09,0x4c,0xe7,0x0c,0xf6,0x17,0x02,0xeb,0x17,0xfb,0xfb,0xff,0xf0,0x0c,0xf0,0xa0,0xf2,0xc2,0x0f,0x07,0x0e,0xcd,0xf4,0xe3,0xe5,0xfb,0x94,0x20,0xf1,0x7f,0xc4,0xe5,0x1a,0x08,0x34,0xd4,0xee,0xf6,0x0b,0x16,0xec,0xee,0x1c,0x13,0x08,0xf4,0x70,0xf4,0xb1,0xe8,0x47,0x2b,0xdd,0x33,0x58,0xd4,0xb0,0x42,0xa5,0x81,0x8c,0xc7,0xf8,0xdb,0xea,0x43,0xba,0x2b,0x02,0x18,0x01,0x2a,0xd3,0xd7,0xef,0x2b,0x08,0x02,0x81,0xf1,0xf3,0x8e,0xe2,0x30,0xf2,0x02,0x2e,0x43,0xa3,0xf0,0x28,0x40,0x38,0xaa,0x10,0xa4,0xf5,0xce,0x3e,0x0a,0x5f,0xd3,0x01,0x03,0x0f,0xf2,0xf6,0x02,0xe8,0xf8,0x81,0xaa,0xec,0xcd,0x46,0xf4,0xe3,0xb2,0x57,0xf5,0xdf,0x0a,0xbd,0xf7,0x0f,0xb0,0xf5,0xdc,0xbe,0xc1,0x3a,0x14,0x3a,0xc5,0x15,0xfe,0x06,0xe1,0x13,0xf5,0xd7,0x04,0x11,0x44,0xd0,0xf1,0x4f,0x10,0x24,0x07,0x0d,0x81,0x17,0x21,0xfd,0x03,0xab,0xc3,0x2e,0xf1,0xf8,0x31,0xc3,0x01,0x23,0x08,0x41,0x14,0xf5,0xe5,0xc2,0x18,0x0f,0xf5,0xf6,0xe3,0xfd,0xcc,0xca,0x0d,0xf9,0xd9,0xd2,0x81,0xc3,0x26,0xef,0xff,0xae,0x4a,0x21,0x34,0xdc,0x40,0x14,0xef,0xd6,0xea,0x0b,0xfb,0xfe,0xff,0x1e,0x05,0x07,0x1c,0xab,0xc4,0xfd,0xed,0x6e,0x24,0xca,0x23,0x1a,0xdd,0x2d,0xfb,0xb3,0xfc,0xfa,0x12,0xfc,0x81,0x1f,0x03,0x11,0xf4,0x43,0x4d,0x02,0x15,0xed,0xfc,0x31,0xec,0xee,0x09,0xea,0xf4,0x11,0x05,0x2c,0x05,0xf3,0x19,0xe1,0x30,0x81,0x8f,0xe9,0xef,0xc6,0x39,0x3e,0xf1,0xca,0x29,0x67,0x54,0x1c,0xe5,0xe0,0x0c,0x31,0xea,0xe4,0x07,0xe2,0xef,0x8c,0x1a,0x53,0x85,0x15,0xbe,0x02,0x30,0x81,0x42,0x5c,0x27,0xe6,0x10,0x21,0x00,0x7a,0x37,0xf7,0xa6,0xe2,0xfc,0x24,0xc0,0xd6,0xf0,0x20,0xe0,0xce,0x0c,0xe7,0xd0,0x4b,0xd7,0x3a,0xf0,0xe9,0xe1,0x55,0x06,0x7f,0x40,0xf8,0x2f,0xf6,0x22,0xd5,0x46,0x39,0xea,0xf8,0x53,0xe8,0x58,0xf5,0x08,0xfa,0x11,0x17,0xd8,0x00,0x0c,0xe4,0xb8,0x05,0x7f,0x39,0xf9,0x29,0x47,0xc2,0x1c,0x1e,0xb5,0x29,0x28,0x3c,0x68,0x1c,0x7a,0x40,0xb2,0xbd,0xe0,0x1c,0xe3,0xaf,0x35,0x09,0xf0,0xf8,0x11,0x02,0xea,0x02,0x0b,0xcb,0x2d,0x05,0xcf,0x48,0x34,0x7f,0xbb,0xde,0xb4,0x14,0x38,0xfc,0x26,0xa2,0xcf,0x3d,0xed,0x21,0x1e,0xdf,0xec,0x13,0xdd,0x1f,0x0c,0xd6,0xfa,0x02,0xfa,0x16,0xc9,0xd1,0xd3,0x25,0x54,0xe4,0x9a,0x18,0x34,0x53,0xf9,0x33,0x77,0x17,0xba,0xe7,0x02,0x12,0xe9,0x98,0xf3,0xc1,0xfc,0xe6,0x81,0x41,0xf7,0x22,0xea,0xcb,0x02,0x17,0xcb,0x7f,0x90,0x68,0xa7,0xef,0x29,0xf3,0x17,0x0b,0x0f,0xeb,0x29,0xc8,0x03,0xed,0xe5,0xf7,0xe1,0xd1,0x23,0xc3,0x66,0xe4,0xc3,0xac,0x0d,0xdb,0xd6,0x18,0x25,0x09,0x10,0xd7,0x40,0xe5,0x1a,0x27,0x0f,0xfb,0xe5,0x1d,0x81,0x0f,0xf7,0x19,0x06,0xad,0xea,0x20,0xe3,0x16,0x41,0x05,0x01,0x21,0x1a,0x0c,0xf6,0x08,0x05,0xea,0xfc,0xf8,0x24,0x51,0x04,0xc7,0xee,0x27,0xba,0x03,0x38,0x49,0x1b,0xcc,0xf4,0x01,0xb5,0x8f,0xa2,0x18,0xf9,0xc4,0x7f,0xb5,0x5d,0xe6,0x19,0xf7,0x0b,0xf4,0xeb,0xfd,0x32,0x15,0xfc,0xeb,0x0c,0x61,0x42,0xf7,0x84,0xf0,0x9c,0xa2,0xba,0x12,0x19,0xa0,0xdb,0x19,0x58,0x3f,0xc8,0xd6,0x96,0xa1,0xbd,0x7f,0xaa,0x17,0x10,0xe1,0xd7,0x2e,0x13,0xf2,0xee,0xa9,0xbe,0xe6,0xb4,0x7f,0xec,0xd9,0xc0,0x33,0x1d,0x21,0xcb,0xf4,0x08,0x06,0x97,0xa0,0xfa,0x91,0xc4,0xb9,0x00,0x17,0xef,0x0b,0xee,0x32,0xf0,0x1b,0xe4,0xc4,0xd8,0xf5,0x25,0xba,0x50,0x0d,0x26,0x00,0x81,0x5d,0xb1,0xe6,0x35,0xf5,0x70,0x82,0xda,0xb2,0x08,0x11,0x5d,0xfb,0x1f,0x32,0x38,0x44,0x09,0xf4,0x12,0x1e,0xe3,0x07,0x0c,0xfd,0x1e,0xeb,0x50,0x06,0x58,0xf8,0x0a,0x17,0xf7,0xd3,0x45,0xeb,0x42,0xd9,0x7f,0x39,0x01,0x9b,0x5c,0x36,0x4e,0x00,0x0b,0xe8,0x1d,0xe3,0xee,0x21,0x05,0x01,0x03,0x15,0x12,0x2f,0x7f,0x2f,0xb9,0xe8,0xed,0x35,0x50,0xf3,0x08,0xe3,0x0e,0x22,0xe9,0x28,0x04,0x2e,0xf9,0x25,0xca,0xfb,0xf6,0xe9,0x29,0xd4,0xf1,0x1e,0x1b,0x16,0x30,0x0d,0x2f,0x2f,0x06,0xe1,0x0b,0x20,0xfb,0x47,0x81,0x33,0x06,0x19,0x13,0xbf,0x2a,0x32,0xf8,0x16,0x42,0x08,0x2c,0xfc,0x25,0xee,0x03,0x12,0xed,0xfa,0x0b,0xef,0xf9,0xd3,0xb9,0x81,0xed,0x48,0x26,0x57,0xf8,0x4e,0xdb,0xee,0x37,0xd5,0x47,0x95,0x33,0x11,0xc4,0x18,0x3c,0x0d,0xda,0x26,0x2e,0x0a,0x20,0xd6,0xf4,0x3c,0xe9,0xea,0xee,0x49,0x23,0x52,0xdf,0xff,0x34,0x0d,0x12,0x39,0xeb,0xfb,0x3d,0xf0,0x6f,0xd0,0x7f,0x41,0xae,0xa6,0x3c,0x08,0x17,0xa6,0xfd,0xf4,0x0f,0xd6,0xfb,0x17,0x18,0x22,0x08,0xe8,0xed,0x07,0xe8,0xde,0x3b,0x6e,0x27,0xcf,0xe2,0xf1,0xdb,0xde,0x36,0xad,0x7f,0x10,0x28,0x8a,0x42,0xfe,0x31,0x0f,0xd8,0x18,0x00,0x2a,0x02,0xea,0xfe,0xf0,0x02,0xb6,0x04,0xec,0xfc,0x21,0xbb,0x19,0x81,0x26,0xdf,0x01,0x22,0x8e,0xf1,0x1f,0x49,0x2c,0x94,0x0e,0xe2,0x20,0x2c,0xd5,0x30,0xfb,0xef,0xf8,0x09,0xf0,0xfc,0x0c,0x20,0xf4,0x71,0x2a,0xf8,0x45,0x15,0xe4,0x00,0x3a,0x85,0x7b,0xd1,0x7f,0x13,0xcd,0x05,0x74,0x98,0x6c,0x2c,0xd6,0xf1,0x27,0x56,0xf8,0xe7,0x2b,0x03,0xf0,0xdc,0xda,0x2d,0xf2,0x22,0x18,0xfe,0x03,0xbb,0xf6,0xfd,0xfe,0x09,0x24,0x7f,0xe5,0x3b,0x19,0xf2,0xea,0x2b,0x07,0xf9,0xfb,0x28,0xd1,0x3c,0x0b,0xf4,0xf0,0x09,0xf8,0xff,0x0d,0x0c,0x81,0x1f,0xb8,0xdf,0x00,0x13,0xfa,0xdf,0x48,0x1a,0x22,0xfa,0x09,0x41,0x07,0xd7,0x91,0x12,0xa2,0xeb,0xfd,0xf8,0x2c,0xeb,0x26,0xee,0x2d,0x0c,0x00,0xdf,0xe0,0xeb,0xef,0x59,0xc4,0x15,0x4d,0x7f,0x04,0x60,0x2f,0xeb,0xee,0x1a,0x0f,0x60,0xb6,0x1b,0x21,0xd9,0xc4,0x39,0xfa,0x04,0xf9,0x09,0xf8,0x01,0xf8,0x06,0x01,0xf3,0xf6,0x23,0x02,0xba,0x7f,0x31,0xcf,0x16,0xf4,0xa4,0x48,0x2e,0xe3,0x35,0x25,0x02,0x26,0xf4,0xce,0x96,0xb0,0xd5,0x31,0x23,0xd7,0x20,0x36,0x02,0xe7,0x0a,0xe3,0x0e,0x32,0x1f,0xf8,0x35,0x0b,0xdd,0x11,0x8a,0xbf,0x31,0xa3,0xd1,0xdb,0x40,0x0d,0xdb,0xed,0x39,0x44,0x51,0x55,0x2a,0x1c,0xce,0x0b,0x81,0x50,0xf0,0x38,0x08,0x0b,0xe6,0xfb,0xf2,0xff,0xdc,0x1d,0xc9,0xf1,0x0d,0x0c,0xda,0x2a,0x0d,0x3d,0x7f,0xe1,0x35,0x2b,0x00,0xd4,0x0f,0xf7,0xc1,0x10,0xe8,0x14,0xf0,0x10,0xf3,0xee,0x04,0xf0,0x09,0x13,0x08,0x51,0x31,0x1f,0x70,0xd0,0xb7,0xca,0xfb,0xf2,0x0c,0xef,0x11,0x01,0xe5,0xf7,0x19,0x2b,0x36,0x7e,0x3e,0xdb,0xd5,0x81,0xbd,0xcb,0x07,0xf2,0xec,0xea,0x24,0x15,0xfe,0x98,0xca,0x71,0x45,0x20,0x81,0x97,0xde,0x2b,0x59,0x09,0x53,0x58,0xd8,0x62,0x9e,0x0f,0xc2,0x33,0xd0,0x63,0xab,0xfd,0x03,0x18,0x0c,0xf3,0x01,0x06,0x0b,0x12,0x1f,0x36,0xa3,0x0a,0xd1,0xe5,0x13,0x24,0x20,0x06,0x25,0x17,0xa5,0xb8,0xd9,0xc3,0x33,0x2a,0xe1,0x81,0xe3,0xdc,0xda,0xb8,0x24,0xd1,0x04,0x1e,0xf7,0x0e,0x18,0xf4,0xf4,0x01,0x32,0x34,0x2b,0x41,0x5c,0xdd,0x1d,0x17,0xcb,0x34,0xf8,0xe6,0x7f,0xd0,0x64,0x36,0x9f,0xe6,0x1c,0x1a,0x04,0xc2,0xff,0xcf,0x1f,0xe1,0xf5,0x33,0x15,0x07,0xe1,0x07,0xe1,0x3c,0xc6,0xe9,0xa7,0x33,0xad,0xf2,0x30,0x63,0x03,0x0d,0xf4,0x7f,0x18,0x12,0x0f,0x29,0xc7,0x2e,0x01,0xbe,0x0d,0xe2,0xe8,0xf6,0xf9,0xef,0x1e,0x28,0xf9,0x5f,0xda,0xb1,0x1f,0x0c,0xce,0x18,0x2d,0x5c,0x81,0xf4,0x0b,0xdc,0x99,0xaf,0xed,0xf6,0x18,0x2e,0x2b,0xcb,0x1b,0x2a,0xf8,0x2a,0x09,0x34,0xdd,0xdd,0x05,0xe1,0xf3,0x07,0xc6,0x42,0xa7,0x16,0x67,0x00,0x86,0x46,0xfa,0x1b,0xb1,0xcc,0x02,0x13,0x64,0x1f,0x0c,0x7d,0x6a,0x25,0x2f,0xe2,0x81,0xe9,0xd6,0x25,0x2b,0xfc,0xfa,0xed,0x07,0x7f,0x61,0x24,0x20,0x95,0x1c,0xef,0xb7,0xdb,0xe1,0xa9,0x19,0xb9,0x05,0xba,0x69,0x20,0xee,0x0b,0x3f,0x39,0x3c,0xfc,0xe2,0xf3,0x2c,0xef,0xea,0x0e,0x06,0xf5,0xfb,0xe9,0xce,0x75,0xdb,0x62,0x29,0x34,0xe2,0xf2,0x55,0x7f,0xa5,0xdf,0x7f,0x21,0xee,0x01,0x8b,0x54,0xd2,0xc5,0x0b,0x03,0xd2,0x99,0x09,0xc0,0x10,0xf5,0x22,0x33,0xf8,0x14,0x11,0xe6,0x8f,0x1a,0xb7,0xcb,0x12,0x81,0xd3,0xcb,0x36,0x16,0x1f,0x03,0x46,0x19,0xe1,0x9b,0x0e,0x58,0xa5,0xb7,0xbc,0x25,0xcd,0x21,0x29,0xf1,0xfd,0x1f,0x12,0x00,0x00,0x00,0x00,0x06,0x19,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x09,0x00,0x00,0x5e,0x0e,0xf2,0xf7,0xae,0x08,0xf8,0x22,0xeb,0x2b,0x3e,0x9c,0xfe,0xd3,0xd7,0xa8,0xf9,0x04,0x1e,0x2c,0x1e,0xb1,0x7f,0xd6,0x02,0xb6,0x54,0x0b,0x1e,0xf5,0xde,0xcd,0x2e,0xec,0xce,0xc2,0x01,0x0a,0xcb,0xe0,0x05,0x52,0x18,0xcb,0xd8,0x55,0xdd,0xd8,0x29,0xf0,0xf8,0xab,0xfc,0x30,0x2e,0xb3,0xd7,0xf3,0xfd,0x51,0x01,0xc6,0x16,0xc1,0xec,0xbf,0xf9,0xea,0x08,0x05,0x22,0xeb,0xe0,0x1f,0x23,0x25,0xe9,0x56,0x26,0x22,0x39,0xdd,0x36,0xd0,0xf6,0xe3,0x33,0x01,0x1b,0x51,0x0f,0x13,0x09,0x20,0xda,0xf7,0xe0,0xf6,0x09,0xe5,0x0f,0x2a,0x63,0xdb,0x20,0x01,0x4d,0x1a,0xfa,0x01,0x1c,0x30,0x41,0xff,0xfa,0xe8,0x8c,0x23,0x08,0x1c,0xc1,0x23,0xe6,0x7f,0x14,0xf8,0x0f,0x2f,0x14,0x11,0x7e,0xc5,0xe5,0x18,0x28,0x25,0x1c,0x18,0xff,0xcb,0xfb,0x2f,0xe1,0x24,0x73,0xd0,0x10,0x1c,0xab,0xe6,0x0f,0x06,0x10,0xf5,0x3a,0x23,0x09,0xdd,0x24,0x21,0x21,0xdf,0x42,0x04,0x78,0x13,0x18,0x14,0x21,0xf2,0x94,0x0f,0x52,0xcd,0xf3,0x54,0x2d,0x0b,0x17,0xd9,0xe7,0xed,0x81,0x54,0xf2,0xf6,0xdb,0x09,0xda,0x04,0xe3,0x69,0xe2,0x14,0xdd,0xe4,0xe4,0xf1,0xdd,0xdd,0x40,0xfc,0xcd,0x59,0x59,0x19,0xde,0x2b,0xf6,0xfe,0x2b,0x15,0xbf,0x09,0xc7,0x3c,0x29,0x4a,0x40,0x21,0xdf,0x2a,0xf8,0x6b,0xf9,0xd9,0xfa,0x02,0xfd,0x0d,0xcd,0x08,0x4b,0x4f,0x21,0x37,0x07,0x07,0xc9,0x13,0xce,0x08,0x7f,0xdd,0x38,0x03,0xe6,0xc2,0x47,0xba,0xd4,0xca,0x5e,0x8f,0x2f,0x1c,0xef,0x0d,0xfa,0x54,0x44,0xb6,0xed,0xeb,0xb5,0x05,0xf2,0xce,0x1f,0x74,0xd9,0x5e,0xca,0x4f,0x12,0x26,0x35,0x0d,0x15,0x04,0x06,0x12,0x07,0x0f,0xe6,0xe5,0x2f,0x46,0xa7,0x32,0xf1,0x12,0xbe,0x36,0x17,0xb5,0xb8,0x1f,0xf4,0x3f,0x31,0xf3,0x02,0x02,0x09,0xf4,0xfe,0xf4,0x2e,0xf3,0x08,0xf6,0x37,0xfb,0x05,0x11,0xdf,0x1c,0xcf,0xd9,0xfe,0x1d,0x17,0x19,0xdf,0xd7,0x1f,0xd8,0xe5,0xfd,0xe7,0x0e,0x12,0x04,0x02,0x19,0xf8,0x60,0xd1,0x04,0xdd,0x09,0x18,0xe3,0x33,0x2f,0x09,0x0b,0x7f,0xf8,0x0a,0xda,0xed,0x2c,0x3b,0xb0,0xe2,0x0e,0x0b,0xfb,0xdd,0xe5,0xe6,0xe5,0xf0,0xe8,0x3b,0x07,0xf8,0x0e,0xf8,0xd7,0x00,0x0b,0xf5,0xbd,0x4b,0x26,0x2c,0x00,0x19,0x2e,0x29,0x29,0x1a,0x06,0x24,0xe6,0x0c,0x0a,0x56,0xdd,0x08,0x04,0x1f,0xee,0x11,0x2b,0xfb,0x12,0xff,0x12,0x7f,0xd0,0xd8,0x04,0x32,0x11,0x0d,0xf9,0x1f,0xe6,0x3c,0xe0,0xb4,0x10,0x9b,0x18,0xe7,0xb9,0xcb,0x17,0xf0,0x34,0xd5,0xf1,0xe4,0x1e,0x2d,0xdd,0x14,0xb2,0xab,0x04,0x70,0xf2,0xd4,0xd9,0x02,0x56,0x1c,0x86,0x00,0xec,0xe5,0xea,0xdd,0xe3,0xfe,0xf0,0x29,0x08,0x0f,0x20,0x13,0xfd,0x2c,0x25,0x1d,0xd4,0xf7,0xd0,0xdd,0x0d,0xee,0x24,0x35,0xed,0x16,0xed,0x30,0xbc,0x14,0x02,0xfd,0x06,0x00,0x01,0x3d,0x03,0x6b,0xd1,0x37,0x0c,0x1b,0x23,0xe8,0xc9,0x22,0xe9,0xd9,0xc6,0x0a,0xcf,0x25,0x0c,0xee,0x2d,0xdb,0xfd,0xc2,0x7f,0x2f,0xa4,0x26,0x00,0xe0,0x3a,0xe1,0x2f,0xed,0x02,0xf6,0xf7,0x1b,0x72,0xe5,0x27,0x14,0x02,0xef,0x15,0x34,0xdc,0xbf,0xe1,0x1f,0x0e,0xc4,0x17,0x19,0x1a,0x26,0x1d,0x7f,0x22,0x09,0xe7,0xe8,0x0e,0xdd,0xf0,0x52,0xe3,0xf9,0x39,0x55,0x14,0x28,0x07,0x10,0x36,0xe3,0x08,0x70,0x18,0x26,0x20,0xf2,0xf6,0x4d,0xd8,0xc1,0xb8,0xcf,0xdc,0x20,0x20,0x54,0xce,0xd3,0xf3,0xc5,0x34,0xf1,0xdc,0x98,0x4f,0xcd,0x2e,0x2b,0x14,0x07,0xfb,0xb1,0xd9,0x32,0xe6,0x61,0x15,0x6d,0x01,0x1e,0x45,0xd4,0xca,0xed,0x1e,0xff,0x49,0xed,0xc8,0xf2,0x0f,0xff,0x0c,0x0f,0xd9,0x5e,0x29,0xd6,0x02,0x11,0xab,0xef,0xdd,0xf1,0xf0,0x7f,0xba,0xcf,0x52,0x09,0xfa,0x4f,0x03,0x64,0x63,0xb6,0x6f,0x62,0xca,0x21,0x25,0x59,0x02,0x34,0x42,0xee,0xcc,0xd1,0xe3,0xc5,0x0e,0x56,0x90,0xe1,0xb0,0x01,0xf2,0xcb,0xab,0xd8,0x38,0x1f,0x16,0xf0,0x37,0x15,0x34,0xeb,0x4b,0x8c,0xdc,0x34,0x1b,0xff,0x22,0x07,0x05,0x20,0xdc,0xdb,0xf3,0xd6,0x21,0x20,0xa2,0x25,0x89,0xf9,0x32,0x3e,0xe7,0x12,0xf1,0x49,0x2f,0x04,0x21,0xd8,0xff,0x0a,0xdb,0xb5,0xee,0x0e,0xd5,0x66,0x39,0x0d,0xf7,0x2a,0xec,0xfd,0x25,0xb8,0x2f,0xee,0x51,0xb0,0xe6,0x10,0xaa,0x35,0x42,0xcc,0xf6,0x0a,0x43,0x28,0xd3,0xa8,0x28,0x07,0xc1,0x29,0xd5,0xc3,0xd0,0xce,0x39,0xd4,0xd8,0xc8,0x1b,0x0f,0xe6,0xc9,0xfc,0x7f,0x07,0x4e,0xd1,0x05,0x58,0xbf,0xfb,0x1e,0xeb,0x07,0x45,0xf3,0xec,0xd7,0x0d,0x2b,0xea,0xd7,0xd9,0xfd,0xf3,0x46,0xc4,0x66,0xc7,0x02,0x19,0x1a,0x08,0x1a,0x1c,0x62,0xec,0xc2,0xdd,0x12,0x35,0xec,0xf1,0xd2,0xcb,0xa6,0x0e,0xb4,0x1f,0xd3,0xd8,0xf7,0xf0,0x37,0x1e,0xe3,0x36,0x9d,0xcb,0xe4,0xda,0x02,0x21,0x14,0x1e,0x2b,0xcb,0x0e,0x81,0x34,0x2b,0xdc,0xf4,0xf5,0xb4,0xe2,0xd0,0x9c,0x03,0x01,0x17,0xbf,0x17,0xc0,0x03,0x4d,0x4d,0x31,0x21,0x15,0x43,0x67,0x01,0x34,0x1c,0x43,0xf5,0x07,0x17,0x3a,0xe4,0xf4,0x2a,0xed,0xcf,0xe0,0xd2,0x26,0x06,0x4c,0xc8,0xac,0x4a,0x12,0xb4,0x4c,0x13,0x45,0x25,0xed,0xe2,0x1a,0xc6,0xf9,0x58,0x04,0x4d,0x27,0xf2,0xb0,0x16,0x4c,0x34,0x9f,0xf4,0x3d,0xab,0x07,0x11,0xee,0x0e,0xd5,0xce,0xeb,0x23,0x0e,0xa8,0xde,0xf0,0xfb,0x7f,0x2f,0x3c,0x00,0xd8,0xee,0xcc,0x19,0x5e,0x09,0x7d,0x39,0xee,0x02,0x07,0xcf,0xea,0xec,0x08,0x51,0xde,0xf3,0x2c,0x37,0xf3,0xdb,0x79,0x49,0x03,0xed,0x33,0x0c,0x0f,0xb1,0x15,0x30,0x37,0xff,0x79,0x5d,0xff,0x65,0x29,0x1c,0xf7,0xdd,0xf4,0x48,0x0b,0xa7,0xbe,0xe7,0x34,0x07,0x21,0x2b,0xe6,0x3c,0x81,0xbb,0xe3,0x59,0xe9,0xf9,0xac,0x97,0x3e,0x17,0xc7,0xed,0x04,0xe4,0x3e,0x17,0xe1,0xed,0x08,0x9e,0x5b,0x1c,0xf6,0x40,0xec,0xd5,0x07,0xcd,0xbf,0x90,0x2d,0x9e,0x55,0x18,0xaa,0xfd,0x12,0x2b,0xb4,0x10,0xe9,0x1a,0xd1,0x0c,0x39,0x97,0x18,0x11,0x09,0x3d,0xe0,0xd9,0xe0,0xf7,0x41,0x32,0x62,0xcd,0xe8,0x22,0x24,0x05,0xf9,0x31,0x0d,0xd2,0xca,0x8b,0x0b,0xd9,0x05,0xfa,0x3a,0xeb,0x38,0x0a,0x81,0x37,0x4d,0xad,0xe9,0x10,0xac,0x83,0x6a,0xe8,0xf3,0xf7,0x7d,0xf0,0x03,0xfd,0xd1,0xf5,0xbe,0xe0,0x4a,0x31,0xff,0xe8,0xe6,0x08,0x1b,0x09,0x55,0xd0,0x5b,0xb9,0x1a,0x18,0x0a,0xd8,0x0d,0x22,0xf4,0x14,0xf7,0xe9,0xf4,0xe8,0xfb,0x7f,0x1d,0x40,0x13,0xed,0xf7,0x0d,0xb2,0xd7,0xfb,0x44,0xeb,0x5f,0x32,0xf9,0x06,0xf0,0xe1,0xe5,0x33,0x95,0x2d,0xf4,0x7e,0xc6,0xb9,0x10,0xa2,0x59,0x5a,0xc6,0x45,0x05,0x48,0x5d,0xcd,0xb4,0x4a,0x0c,0xd0,0x3e,0xbf,0xac,0xa0,0xd7,0x74,0xbb,0xcc,0xcd,0x26,0x12,0xd3,0xcd,0xf5,0x72,0x21,0x35,0xc6,0xf4,0x53,0xe0,0x07,0x34,0xfa,0xf8,0x7b,0x62,0xee,0xe1,0x11,0x1d,0xd2,0xda,0xf2,0x36,0x13,0x10,0x14,0xe5,0xec,0x26,0x9a,0x0b,0x07,0x43,0xdb,0x2a,0xf4,0xea,0xb6,0xdb,0x1d,0xbe,0x06,0x04,0x9f,0x0d,0xc1,0x61,0xe2,0x3d,0xf2,0x3d,0xef,0xf6,0x37,0xe7,0x11,0x26,0x2b,0x07,0xd5,0xd2,0x1d,0xd3,0x75,0xb6,0x0a,0x81,0x62,0x0e,0xb5,0x1d,0x01,0xef,0x14,0x38,0x5b,0x4f,0xf0,0xde,0x18,0x44,0x2a,0xf3,0x42,0xf7,0xe0,0xf9,0x2a,0x2b,0xe3,0xd1,0xca,0x07,0x1f,0xde,0xf3,0x18,0x4c,0xec,0xea,0xc4,0xf8,0xe3,0xf0,0x2e,0xea,0x0b,0x2f,0x4d,0xf6,0xd2,0xfb,0xa5,0xeb,0xe1,0x09,0xc6,0x18,0x0a,0xbf,0x43,0xf2,0x1c,0xad,0x44,0x28,0xf8,0x3b,0x81,0xf4,0x19,0xd4,0x0f,0xc6,0xbc,0x20,0x1f,0xf1,0xe9,0x2f,0xd0,0x2b,0x21,0x31,0x15,0x96,0x30,0x28,0x26,0xee,0x19,0x29,0x1b,0x0c,0xb0,0x03,0xee,0x1f,0xe1,0xbf,0x08,0x00,0x04,0xfc,0x0b,0xbe,0xc4,0x0b,0x19,0x10,0xd9,0x10,0x22,0x0c,0xd5,0xf1,0x0b,0xdf,0xb3,0x00,0xc7,0x5a,0xcd,0x27,0x81,0x51,0x2a,0xd7,0xfd,0xe9,0x2d,0xda,0x29,0xf1,0x45,0x05,0xe5,0x21,0x19,0x99,0xd6,0x0e,0xf3,0x4c,0x39,0xa0,0x22,0xdd,0x03,0xf0,0xce,0x2f,0x72,0xd0,0xf9,0xc1,0x17,0xfc,0x25,0x21,0xee,0x0b,0xf9,0xe5,0xd1,0xe7,0xc4,0x04,0x2d,0xff,0x2d,0xeb,0xb4,0x01,0x5b,0xff,0xce,0xbd,0xed,0x45,0x10,0xe7,0x06,0x29,0xe0,0xf7,0xd5,0x0a,0x1e,0xfe,0xf2,0x0b,0xbe,0xe6,0x13,0x27,0x1d,0x5c,0xd7,0x7f,0x8b,0x57,0x14,0x57,0xc9,0xe3,0xf2,0x27,0x21,0xff,0x15,0x15,0xae,0xb7,0xf3,0xa3,0x1e,0x5d,0xe0,0x60,0x2b,0xfe,0x02,0x44,0x5f,0xd3,0x47,0x1c,0x41,0x28,0x06,0x27,0xc6,0xe5,0x4e,0x4f,0x21,0xb7,0xef,0x30,0x19,0xee,0xf2,0xe6,0xa7,0x2f,0xe7,0x0c,0xdd,0x91,0xbd,0x0f,0xc9,0x51,0xdc,0xfd,0x5f,0xfb,0x04,0x24,0xf6,0xd2,0x17,0x0b,0x12,0x0a,0x33,0x0f,0xb1,0xe9,0xcb,0xe6,0x02,0xf9,0xf2,0x39,0x1e,0xea,0xdc,0x1a,0xbd,0xb7,0x1c,0x01,0x20,0x26,0x07,0xdb,0x57,0xc0,0x35,0x9b,0x46,0x35,0x15,0x49,0xf6,0xc2,0x26,0xea,0xfe,0xd3,0xd7,0x10,0x25,0xc9,0xf2,0x33,0xc8,0x1d,0x30,0x7f,0x21,0xb6,0x2b,0x32,0x15,0xe1,0xf7,0x48,0x23,0xf8,0xb1,0xee,0xe5,0x36,0x06,0xed,0x15,0xed,0xc3,0x14,0x0c,0x9b,0xc3,0xef,0x1b,0xdd,0x01,0x2e,0x2b,0x1b,0xaf,0x13,0xfa,0x0b,0x1d,0x23,0x4d,0xf2,0xd4,0x01,0xd6,0x50,0x4a,0x28,0xe9,0x0a,0xda,0xf9,0x81,0xde,0x47,0xed,0xb9,0x30,0x09,0x05,0x00,0xfc,0xd5,0x3c,0x88,0x46,0xf8,0xad,0x54,0x0d,0x94,0x39,0x24,0x1a,0xd9,0x45,0xd2,0x57,0xfc,0xfb,0x11,0xac,0x12,0xeb,0xfd,0xc7,0x44,0x0f,0x49,0x51,0xcd,0xee,0x1f,0xe5,0xeb,0xf1,0xdb,0x50,0xec,0x1c,0x45,0xde,0xb0,0x07,0xb3,0x45,0xfa,0xf2,0xe5,0xff,0x6a,0x0a,0xd3,0xda,0xd6,0xb1,0xc0,0xd8,0x11,0xde,0x07,0xc3,0x17,0xdf,0xb2,0xdb,0x3c,0xde,0x4f,0x69,0xcf,0x21,0x2e,0xcd,0x7f,0xf8,0x69,0xce,0x44,0x15,0x6c,0xd9,0xc3,0x5c,0x23,0x11,0x0b,0xdb,0xff,0xf2,0x0c,0xcc,0xfe,0xc2,0x17,0x5f,0x0b,0x28,0xff,0x1d,0xe9,0x08,0x10,0x30,0xcf,0xd7,0x14,0xf7,0x0b,0x1f,0x47,0x48,0x0f,0xc0,0xe6,0x0d,0x01,0x3f,0x03,0xbb,0xe7,0x9d,0x2a,0x2b,0x43,0x0f,0xb9,0xfd,0xf3,0xed,0x2c,0xfc,0x32,0xed,0x23,0x05,0x07,0x20,0xde,0x7f,0xfe,0x34,0x54,0xf0,0x4b,0xd9,0x16,0x20,0x28,0xe4,0xf6,0x01,0xfe,0x44,0xe0,0x72,0xb5,0xe0,0x76,0x13,0xe8,0xb1,0xc0,0x2d,0x5b,0x8a,0x49,0x20,0xcc,0x41,0x68,0x12,0x28,0xe0,0x2a,0x02,0x4a,0x0a,0x83,0x08,0xe8,0x5f,0x0f,0xb7,0xda,0x20,0x01,0xb9,0x16,0x3c,0x02,0x4d,0x12,0xa2,0x8d,0x39,0xf5,0xf3,0xd0,0x0d,0x03,0xd3,0x14,0x3b,0xc2,0x10,0x71,0x16,0x15,0xd7,0xee,0x0f,0xef,0x16,0xad,0x1a,0x01,0x38,0x52,0x27,0x36,0x1a,0xca,0xf6,0x28,0xdb,0x16,0xf4,0x71,0x15,0xfc,0x7f,0x07,0x03,0xf9,0xf8,0x3f,0x02,0xf1,0xff,0x2e,0xe2,0xe9,0x20,0xab,0xd6,0x19,0x3d,0x2e,0x0f,0x11,0x45,0x1d,0xbc,0xd7,0xf3,0xe0,0xe7,0xf7,0x0f,0x10,0xeb,0xbd,0xf7,0x1b,0xfe,0xc0,0xe8,0xee,0x18,0x27,0xe3,0xf1,0xbd,0x34,0x1c,0x1b,0xef,0xc4,0x30,0xf9,0xf1,0x19,0xfd,0x14,0xf8,0xd8,0xfd,0xe1,0x22,0xea,0x7f,0x1b,0xe2,0x40,0x05,0x32,0xcd,0xef,0xe5,0xe3,0x07,0x18,0x28,0x09,0x22,0xf5,0x34,0xf4,0xf9,0x4c,0x2c,0xf8,0xf1,0x50,0xdc,0x39,0xf5,0xe6,0x31,0x23,0xf2,0x07,0x05,0x1b,0xde,0xee,0xfc,0x1d,0x50,0x24,0x03,0x2b,0xe2,0xf2,0xd8,0xec,0x16,0xf0,0x17,0x30,0x08,0xe7,0x46,0xe5,0x8b,0x1d,0x0e,0x14,0xfa,0xba,0xfc,0x10,0x0d,0x00,0x02,0xea,0x47,0xe7,0x27,0x2f,0x18,0x0a,0x24,0xe6,0x06,0xc7,0x0c,0xf6,0xee,0x02,0x06,0x06,0x06,0x35,0xe9,0x23,0xe8,0xff,0xf6,0x0b,0x43,0x0a,0x3b,0x9c,0x25,0x59,0x9a,0xdc,0x1d,0x97,0x03,0xfd,0xbd,0xd6,0x3e,0xdc,0x15,0xc5,0x6a,0xcc,0x92,0x4b,0xf2,0x1b,0xc5,0xe9,0x31,0x34,0xe0,0xd2,0xc7,0x36,0x42,0xfc,0xda,0xa4,0x06,0xf3,0xdb,0x09,0xf8,0x81,0xff,0x05,0x2c,0xfe,0x12,0x2d,0xe8,0xd9,0x5b,0x14,0xe0,0xe4,0xc4,0xfa,0xb5,0xc6,0xfe,0x2d,0x37,0x18,0x4d,0xd6,0x3a,0x1a,0xec,0x2b,0x20,0xc7,0x12,0xff,0x1b,0x10,0x0f,0x0d,0xf4,0x0a,0x28,0x14,0xca,0xb2,0x0d,0x73,0x1b,0x70,0xd8,0x23,0xe4,0x14,0xef,0xc6,0x05,0xfe,0xd6,0x3e,0xd9,0xce,0x61,0x23,0x1f,0x08,0x21,0xd5,0x30,0x79,0x2e,0xb7,0x81,0x04,0xf0,0x13,0xd9,0xee,0x5e,0x14,0xc0,0x42,0xb6,0xe1,0xcf,0xee,0xf0,0x01,0x1a,0xf9,0x09,0x04,0xdd,0x22,0x31,0xf2,0x25,0xed,0xe3,0xb3,0x23,0x4c,0xe5,0x3a,0xf5,0xff,0x0d,0xee,0xcf,0x0c,0x0e,0xc1,0x16,0xfe,0xf0,0xf1,0xc5,0xf9,0xe2,0x79,0x0b,0xbd,0x3d,0x46,0xfa,0x2a,0x20,0xf8,0x35,0x02,0xf1,0x2d,0x03,0x20,0xd5,0x03,0x7f,0xf3,0xf0,0xe1,0xf0,0x07,0xb0,0x05,0x12,0x05,0x2f,0x07,0xd6,0x02,0x2f,0x10,0x1e,0xdb,0x0e,0x16,0x29,0x40,0x10,0xee,0x10,0x33,0xec,0xc2,0x13,0x22,0xb7,0xb5,0x0a,0xc1,0x68,0xf8,0x33,0x1f,0x3c,0xdc,0xf7,0x0e,0xcf,0x65,0xde,0x81,0xf6,0xf5,0xe5,0x2e,0x24,0x07,0xaa,0x9e,0x9e,0xce,0x2a,0x09,0xe9,0xfa,0xe8,0x11,0xd2,0xea,0x2f,0xe1,0x1b,0xd5,0xd4,0x41,0xef,0xbb,0x2c,0x5d,0x32,0xdf,0xe0,0xf2,0xd8,0xec,0xdd,0xf2,0xe0,0x29,0x26,0xf1,0x3e,0xfe,0xf4,0xf4,0x9e,0xd2,0x2a,0x0f,0xaa,0x10,0xe9,0xdb,0x41,0xd5,0x3e,0x75,0x03,0xdc,0x2a,0x21,0xd1,0x3b,0x3c,0xe6,0xd0,0x02,0xfe,0x02,0x04,0x38,0x96,0xa2,0xc8,0xc7,0x03,0xec,0xf5,0xdd,0x28,0x0c,0xc7,0x33,0x23,0x34,0x51,0x08,0x0f,0xf9,0xef,0xa7,0x03,0x40,0xcb,0x99,0xf2,0xa9,0xfa,0xc8,0x20,0xe6,0x15,0x09,0x10,0x81,0x05,0xd0,0xba,0x3a,0xea,0xe4,0x03,0x0f,0x3a,0xfe,0xc3,0xbc,0x02,0x30,0x5e,0x0a,0x1c,0xe5,0xda,0x47,0xc0,0xf2,0x35,0xd1,0xea,0x15,0x34,0xba,0x16,0x1d,0xdb,0x1b,0xbe,0x09,0xfd,0x06,0x25,0xe9,0x3f,0x01,0xde,0xbb,0xf8,0x19,0xc6,0xff,0xce,0x13,0x00,0xc1,0xd9,0x24,0xa5,0xd4,0x47,0xfc,0x11,0xdc,0xd5,0xdf,0xbb,0x0e,0x39,0x14,0x17,0xc1,0xbb,0xca,0x20,0xf2,0x6c,0xbe,0x1c,0x7f,0xd4,0xdb,0xd9,0xc6,0x32,0x2e,0xb9,0xb0,0xfd,0x50,0xc2,0x34,0xbe,0x95,0xed,0x34,0x48,0xf6,0x4f,0xfd,0x18,0x02,0xdd,0x05,0x69,0x0b,0x2e,0x28,0x33,0xe0,0xec,0xf4,0xe4,0x1c,0xf0,0x0b,0xfa,0x5b,0x2e,0x0e,0x02,0x11,0xdb,0xf7,0xed,0x36,0xf4,0x11,0xeb,0xed,0x28,0xc0,0xfa,0xff,0xd0,0xf4,0x2a,0x1f,0xd2,0x30,0xba,0x10,0xe3,0x10,0x31,0x00,0x7e,0xd7,0xd1,0xf6,0x3b,0xf1,0x4c,0xf3,0x22,0x48,0x41,0x27,0xa5,0x0c,0x66,0x06,0x04,0x2b,0xd9,0x35,0xb3,0x4b,0xe7,0xd0,0x21,0x08,0x51,0xe3,0xec,0x5a,0xf0,0x00,0x0e,0xf8,0x0c,0x7f,0x05,0x0c,0x67,0x3d,0xfe,0xea,0x16,0x00,0x00,0x00,0x00,0x96,0x22,0xff,0xff,0x04,0x00,0x00,0x00,0x20,0x07,0x00,0x00,0x3f,0x03,0xd2,0xd5,0xf2,0xe0,0x07,0x3d,0x37,0x81,0x19,0x20,0x55,0xd8,0xf9,0xd2,0x51,0x22,0xd8,0x01,0x0f,0x4c,0x5f,0xb0,0x8c,0x8f,0xf2,0x3e,0xf1,0xfb,0x2a,0x31,0xdb,0x00,0x0b,0xda,0x81,0x00,0x2d,0x28,0xe3,0x09,0xf4,0xb0,0xe9,0xd9,0x4c,0x0e,0x16,0x0c,0xd4,0x2d,0xfb,0x2b,0xe3,0xf8,0x1e,0xe9,0x89,0x81,0x4f,0x19,0xb5,0xb4,0x0b,0x4f,0x8b,0x31,0xd6,0xff,0xd5,0x0a,0x02,0xff,0xe8,0xea,0x1c,0xe0,0x27,0x1d,0x87,0xdd,0xf7,0x0d,0xdd,0x4a,0x09,0x7f,0x25,0x50,0x0a,0xed,0x14,0x14,0x00,0x10,0x39,0x2a,0x57,0x79,0xe8,0x08,0xee,0xb6,0x24,0x28,0x06,0xcd,0xff,0x0f,0x19,0xc0,0x01,0x7b,0x1e,0xfe,0x04,0xdb,0x0e,0x81,0xb6,0xcd,0xcb,0xbd,0x0d,0x12,0x05,0xc9,0x0b,0xb4,0x49,0x61,0xda,0xa1,0xc5,0x81,0xf3,0x39,0xf9,0xd6,0xf3,0xec,0x19,0x23,0x03,0x4d,0x42,0xc9,0x7f,0x6c,0x6e,0xb1,0x55,0xcf,0x2f,0xe9,0x38,0x13,0xd2,0x62,0xf7,0x03,0xe6,0x4e,0xfd,0xed,0x9f,0x28,0x4b,0x2f,0xfe,0x12,0xfd,0xfc,0xc9,0xe4,0xed,0xcf,0xef,0xdf,0xf1,0xe3,0x25,0x7f,0x00,0x31,0x02,0x1b,0x19,0xb8,0x1c,0x3c,0xc5,0x0e,0x8f,0xe3,0x14,0xf9,0x3f,0xce,0x4e,0x89,0x2b,0x32,0x81,0xfa,0x1e,0x55,0xe4,0x4b,0x31,0xbc,0xc5,0x58,0x0f,0xfb,0x09,0x4f,0xda,0xd8,0x1f,0x7d,0x41,0xc7,0x81,0xe6,0x1b,0xcf,0x50,0xc6,0x40,0x2f,0xbd,0x12,0x1c,0x0d,0x21,0xff,0x07,0xe7,0x81,0xdd,0x50,0x13,0x10,0xff,0xe7,0xc7,0x21,0xe0,0x0e,0x01,0x3e,0x21,0x42,0x6b,0xe0,0xf4,0x45,0x01,0x17,0x30,0xc9,0x4e,0x1b,0xef,0xdd,0x43,0x3d,0xc9,0xf6,0x39,0x7f,0xb5,0x35,0xd9,0xf6,0x61,0xc4,0x1f,0xe5,0xeb,0x3d,0x7c,0xe4,0x36,0xfd,0x13,0x98,0x22,0x08,0xf4,0xc4,0xda,0x22,0x43,0x4c,0x11,0x22,0xb4,0xce,0x2f,0x02,0x07,0xb6,0x5d,0x81,0xa9,0x9e,0x34,0x50,0x1a,0xb9,0x08,0xca,0xe5,0xd9,0x19,0x29,0x81,0xe5,0xb8,0x49,0xb0,0x07,0xda,0xf3,0x22,0x0d,0x06,0x90,0xe1,0x2a,0xd4,0xd1,0xee,0x13,0xe5,0xc4,0x94,0xf9,0x38,0xc5,0xe9,0x4e,0xe6,0x7f,0x3e,0x31,0x63,0x20,0xba,0x86,0x04,0x3f,0x1d,0x0f,0xfd,0x0a,0x3f,0xf6,0xc8,0xe2,0x92,0x07,0x72,0xa6,0x7f,0x75,0x24,0x19,0x12,0x01,0x65,0xc9,0xd6,0x07,0x5f,0xec,0xdf,0x1f,0xcd,0xe7,0x9a,0xf8,0x5b,0x1a,0xe8,0x03,0x7f,0x55,0xc0,0x7c,0x55,0xb4,0xb6,0x15,0x50,0xd7,0x39,0xc4,0xf5,0x20,0x12,0xc8,0x2d,0xaa,0x25,0x01,0x46,0x09,0xbe,0x10,0xff,0xde,0xb3,0x79,0xf3,0xe5,0x9e,0x1c,0x1e,0x42,0x7f,0x31,0x1f,0x4f,0x19,0x26,0xdc,0xd4,0x50,0x1a,0x4f,0x3c,0xfd,0xee,0x09,0xcb,0xb8,0xaf,0x15,0x0f,0x25,0x3b,0xa6,0x58,0xde,0x4e,0x1e,0x7f,0xdb,0xff,0x96,0x07,0x06,0x84,0xb5,0x56,0x2e,0x11,0x15,0xa2,0xcc,0x7f,0xe6,0xd0,0x37,0x1e,0xb5,0x17,0x37,0x1c,0x49,0xd3,0x60,0x23,0x6d,0x22,0xc0,0xbb,0x5e,0xb5,0x79,0xf7,0x5c,0xdc,0x36,0x08,0x81,0x43,0x79,0xc3,0x5b,0xa0,0xe9,0x2c,0x9e,0x19,0xee,0xd1,0x2c,0xeb,0x0f,0x3a,0x35,0xf5,0x7f,0x0b,0xda,0xe6,0x1c,0x05,0x3d,0x11,0x08,0x0a,0x5e,0x05,0x3e,0x43,0x51,0x1e,0x1f,0xe8,0x17,0xdd,0x0a,0x81,0xf3,0x01,0xab,0x19,0xd6,0xd1,0x86,0x9f,0xcc,0x09,0xe3,0x5b,0xd3,0xe6,0x04,0xd8,0x6a,0x5c,0x5a,0xc3,0x24,0xfc,0xe2,0xe0,0x14,0xd1,0xbd,0x3b,0xb6,0xf9,0xe8,0x40,0x13,0x37,0xc6,0xea,0x12,0xb1,0xe0,0x7f,0x22,0xc6,0x42,0xb3,0xca,0xc7,0x04,0xd5,0x06,0xce,0x1c,0x6e,0x81,0x03,0x17,0xff,0x35,0xe1,0xd4,0x15,0x4e,0xfc,0x09,0x2c,0xa7,0x5f,0x2a,0xf7,0xb1,0xed,0x21,0x1d,0xf6,0x1a,0x31,0x02,0x0a,0xfa,0x81,0x0d,0xf2,0xd2,0xd6,0xf0,0x45,0xe5,0xda,0xfd,0x25,0xe6,0xfd,0xb2,0x1c,0xfc,0xff,0xa0,0xe2,0xea,0x4a,0x41,0xd4,0xd9,0x12,0xca,0xee,0x7f,0xbd,0xbc,0x06,0xc1,0xa1,0x24,0xbc,0xf2,0x17,0x0a,0xb5,0x52,0x16,0xf4,0x4e,0xe4,0x81,0x03,0x4b,0xf1,0x03,0xbe,0xd6,0x07,0xea,0xfe,0xe2,0x47,0x31,0x14,0xfa,0xf2,0xb7,0x13,0xe2,0xeb,0xb9,0xb7,0x85,0x8a,0xc2,0x03,0xfc,0x4b,0x01,0x0b,0xda,0x28,0x57,0x0e,0xd4,0x53,0x1a,0x23,0xf6,0x21,0x81,0x23,0x87,0xe2,0xe7,0x04,0xfd,0x7f,0x0b,0x00,0x30,0x23,0x18,0x44,0xfd,0xfc,0x07,0x23,0x01,0xff,0x2f,0x21,0xdb,0xc2,0x12,0xf0,0x6d,0xe9,0xbb,0xd2,0xa9,0xfc,0x1d,0x4e,0x01,0x3e,0x36,0x59,0xfc,0x32,0x57,0xfb,0x13,0x36,0x24,0xc7,0x18,0x96,0xbf,0x43,0x81,0x01,0x92,0xdb,0x21,0xcd,0xdd,0x7a,0xf0,0x57,0x5e,0x61,0xfa,0xa9,0xca,0x38,0x2a,0xb8,0x2d,0x03,0x8a,0x7f,0x42,0x0b,0x07,0xac,0xf3,0xf5,0x81,0xc7,0xab,0x71,0x51,0xb1,0xd3,0xb0,0x27,0xcd,0xff,0x18,0xbf,0x0a,0x15,0xed,0xe1,0xd9,0xef,0x9b,0xf4,0xfe,0x09,0xf2,0xd9,0x15,0x12,0x44,0x27,0x0f,0xe2,0xf3,0xff,0xde,0x0e,0xe7,0x0b,0x10,0x36,0xff,0xe8,0x7f,0x10,0x06,0x35,0x08,0x37,0x24,0xe8,0x01,0x1c,0xfc,0x04,0xd5,0xcd,0xf9,0xee,0x0b,0xe1,0xd2,0xe3,0xe1,0x81,0x11,0x32,0x7f,0x0c,0x0c,0xd6,0xf5,0xbb,0xec,0x40,0x16,0x54,0x45,0xd8,0xd4,0x01,0x97,0x08,0x7f,0xc9,0xb9,0x07,0xf0,0x37,0x34,0x2c,0xf2,0x3b,0x02,0x04,0x04,0x56,0xd3,0x42,0x54,0x1c,0xf1,0x23,0xb7,0x2b,0x94,0x23,0x1c,0x3f,0xfb,0xc4,0x1f,0x3c,0x2a,0x30,0x7f,0x21,0xf1,0xf2,0xe2,0x22,0x8a,0x4b,0xda,0x1b,0x0e,0x1a,0x3d,0x1e,0x4f,0x81,0xf1,0x19,0x3d,0xc6,0x92,0xbc,0x23,0x0d,0xe7,0x44,0x04,0x53,0xf2,0x2e,0x34,0xc5,0x14,0xfd,0x07,0xd3,0x0c,0x0c,0x7f,0xc5,0xe5,0x2a,0xe7,0xed,0xa0,0xd4,0xe9,0xe9,0xeb,0x44,0xf2,0x28,0xc8,0x1b,0x8d,0x2e,0xe6,0xa3,0x7f,0xe7,0x3e,0xa0,0xf3,0x15,0xf4,0xb4,0x96,0x1e,0xc1,0x18,0x30,0xc3,0x55,0x54,0x02,0x60,0xcc,0x3f,0x0c,0x1b,0xb8,0xcd,0xe7,0xc3,0xff,0xfd,0xa2,0xcc,0x58,0x05,0x34,0xe0,0x0d,0xec,0x1f,0x7f,0x10,0xeb,0x94,0x3c,0xfd,0x06,0x4a,0x35,0xce,0x0d,0x32,0xae,0x1f,0x11,0x73,0x37,0xd7,0x07,0x06,0x25,0x0c,0x0f,0x0d,0x81,0x10,0xf9,0xf5,0x27,0x26,0xfd,0x32,0x1e,0x34,0x11,0xd2,0xd0,0xe6,0xf3,0x5a,0x1a,0xe2,0x0f,0x43,0xcf,0x9f,0xfb,0x6d,0x1e,0xa4,0x7f,0x1a,0x29,0xe2,0x04,0x90,0x2f,0x28,0x22,0x33,0x50,0x5d,0xea,0x7f,0x82,0x10,0xc3,0x69,0xf0,0x9f,0x07,0x09,0xe7,0xe7,0x7b,0x22,0x43,0xe5,0x57,0xf5,0x55,0x30,0xdd,0xdd,0xd1,0xb6,0xf8,0x97,0xe7,0xcd,0xf5,0x99,0xe3,0x1a,0x5b,0x74,0x27,0x3d,0x92,0xee,0x81,0xd0,0xd5,0xe7,0x2d,0xf9,0xed,0x12,0x3e,0xf5,0xd1,0x81,0x08,0x1c,0xf1,0x15,0x17,0x1e,0xc8,0xda,0x3b,0x0a,0xb6,0x2b,0xd6,0xf4,0xd1,0xf1,0x9c,0x28,0x4c,0x4f,0xf5,0xc2,0xc5,0x2f,0xe5,0xd9,0x25,0x49,0xe3,0xfc,0x7f,0xcc,0x46,0x8c,0x66,0x25,0x78,0xc7,0x4e,0xee,0xb1,0x46,0xd2,0x57,0x46,0x7f,0xc1,0xf0,0xe4,0x38,0xd5,0xaf,0xfc,0x1b,0x03,0x17,0xe2,0x5a,0xfc,0x30,0xe0,0xdf,0x0b,0x25,0x7f,0xd4,0xb9,0x2d,0x4c,0xf6,0xd3,0x60,0xb9,0xf0,0xdf,0x2d,0x50,0xf8,0x3a,0x4d,0x08,0xe3,0x35,0xc7,0xf1,0xea,0xe3,0x63,0x0b,0x4b,0xc1,0xe6,0x12,0xdf,0x21,0x24,0x81,0x49,0x2b,0x0b,0xbe,0xe1,0xe6,0x78,0xfb,0xee,0xea,0x1f,0x41,0xe7,0x74,0xc4,0x3e,0x1c,0xc9,0x50,0xf0,0x0d,0xdb,0xff,0x81,0x15,0x50,0x15,0xc9,0x0a,0x48,0x07,0x12,0x44,0xe6,0xdf,0x12,0xa8,0x2c,0xfc,0xd7,0xf2,0xbd,0x38,0xad,0x61,0x1b,0xfe,0x12,0x67,0x70,0x3d,0x3e,0x0e,0xeb,0xc3,0xf0,0xe8,0x46,0x7f,0xa8,0xe9,0xe2,0x91,0x1f,0x33,0x02,0xf5,0xdd,0xf7,0x2e,0x08,0xad,0xa7,0x4b,0x29,0xa7,0x53,0x7f,0x22,0xf3,0x63,0x2f,0x47,0x28,0xd1,0x8a,0xf0,0xeb,0xd0,0xd9,0xeb,0xe6,0xf6,0x29,0xe0,0xfd,0xef,0x28,0xd7,0x0f,0x3c,0xf2,0xf0,0x21,0x37,0xa0,0xfe,0x81,0x0e,0x27,0x9c,0xce,0x5b,0xf7,0xc3,0xf0,0x13,0xf5,0x42,0xf1,0xed,0xaa,0x7f,0x1e,0x30,0x72,0xed,0x2d,0x4d,0x1f,0x00,0x4b,0xa2,0xfb,0x05,0x2d,0x04,0x83,0x84,0xbd,0xea,0xd5,0x94,0x82,0xe4,0x36,0x22,0xaf,0x2f,0x7f,0x77,0x3d,0x82,0xa9,0x35,0xbf,0x08,0xd3,0xca,0xd8,0x10,0xd8,0x0f,0x13,0x27,0x01,0x13,0xfc,0x81,0xcc,0xcc,0xd8,0x00,0xd9,0x01,0xca,0xd5,0xed,0x35,0x0f,0x0d,0x10,0x2f,0xe0,0x39,0xe2,0x25,0xc6,0x24,0xd2,0xdc,0xd1,0x09,0xc6,0xe6,0xd2,0xdd,0x17,0x47,0xbd,0xbf,0x12,0x7f,0xc4,0xab,0x34,0xca,0xcb,0xb0,0x81,0x25,0xfa,0x24,0x0e,0xc3,0xf0,0x02,0x30,0xf0,0x31,0x3c,0x43,0x0a,0x10,0x14,0x9e,0x30,0xb9,0xf3,0xe2,0x32,0xeb,0x1c,0x33,0x43,0x5a,0x81,0xc2,0x89,0x40,0x57,0x1f,0xac,0x58,0xf8,0xc7,0x23,0xdb,0xe4,0xf6,0x23,0x9d,0x0f,0x45,0x71,0xf7,0xaa,0x00,0x3a,0x2d,0x3f,0xff,0xd9,0x50,0xf2,0x29,0x2f,0x7f,0xce,0xfe,0xcb,0x34,0x2b,0x70,0xe2,0x46,0xc1,0xe1,0x43,0x36,0xd2,0x0b,0xaf,0x1d,0x81,0x8a,0x39,0xb9,0x41,0xab,0xde,0xfd,0x1d,0xdc,0x42,0xee,0xf6,0x24,0xcc,0x3b,0x02,0xd9,0xab,0x25,0xec,0xb0,0x02,0xf0,0xbb,0xa6,0x0f,0x81,0x27,0x02,0x43,0x11,0xdb,0x14,0x05,0x2a,0x01,0xec,0xc1,0x78,0xda,0x53,0xed,0xdc,0x72,0x95,0xed,0xe1,0x60,0x2b,0xbb,0xef,0x56,0xe9,0xd2,0x02,0x01,0x10,0x38,0xb4,0x44,0xfe,0x3d,0xdb,0x2a,0x81,0xf8,0x06,0xf3,0xf4,0x2e,0x48,0x7f,0x05,0x56,0xec,0x00,0xec,0xd1,0x16,0x89,0x5c,0x32,0x3a,0xf6,0x6d,0xce,0x52,0xe6,0xe5,0x81,0xcc,0x07,0xe3,0x53,0x5f,0x3c,0xf0,0x3d,0x0d,0xfb,0x94,0x0c,0x40,0xb0,0xbf,0xe1,0x03,0xfb,0x44,0xe6,0xee,0x2b,0x51,0x1b,0xf4,0x02,0xcc,0x20,0x05,0x30,0xfb,0x03,0x13,0x3f,0x07,0xde,0x20,0xf0,0xc9,0x00,0xd4,0x7f,0x10,0xeb,0xe4,0x1c,0xf6,0x15,0x02,0x2b,0xfa,0xb9,0x2b,0xba,0x81,0x3d,0xff,0xe5,0x08,0xfd,0xea,0x12,0xe5,0x14,0xd5,0xdb,0xce,0x08,0xd5,0xe6,0xe3,0xf5,0xe9,0x39,0x09,0x7f,0xec,0x33,0xfe,0xc7,0x1f,0x0f,0x22,0xd6,0xe1,0x32,0x00,0xee,0x19,0x21,0xe7,0x18,0x17,0xec,0x22,0x91,0x47,0x29,0x39,0xc0,0x5e,0x91,0x5b,0xc6,0x9d,0xf6,0x7e,0xb2,0x37,0xb3,0x27,0x2e,0x81,0x54,0x97,0xc7,0xe5,0x9e,0xe7,0x2f,0xe2,0xce,0x81,0xbf,0xf2,0x0f,0xbe,0x2c,0xb5,0x13,0x0e,0xaa,0x10,0x2b,0x20,0xbc,0x1a,0x58,0xe7,0x43,0xaa,0x33,0x36,0x5c,0x22,0xdc,0x12,0x7f,0x7c,0xb2,0xda,0xb1,0x29,0x01,0x68,0x07,0xf3,0x00,0x15,0x2a,0x9a,0x0b,0x0f,0xe1,0xbd,0xe9,0x18,0x6c,0x6b,0x4b,0xd2,0xfb,0xed,0x0e,0x41,0x03,0x10,0x14,0xa7,0x36,0x12,0x66,0x52,0xec,0xa0,0x67,0x2f,0x11,0x18,0x7f,0x40,0xf7,0x0e,0x4b,0xc7,0xf5,0x12,0x54,0x0a,0x97,0x19,0xaf,0xcd,0x9e,0xe0,0xd7,0x7f,0x51,0x16,0xbb,0x0b,0x9f,0x50,0xba,0xd5,0x29,0x5a,0x7f,0xef,0x27,0x1c,0x13,0xcd,0x56,0x31,0x56,0xdb,0xf8,0x55,0xe2,0x4a,0x1f,0xd7,0xe0,0xf0,0xd4,0xcc,0xdf,0xdd,0xad,0x81,0xa9,0xd4,0x3e,0xba,0x69,0xd5,0xfa,0x14,0x3a,0xf0,0xb3,0xe0,0xc8,0x0d,0xed,0xfc,0xc0,0x64,0x31,0xff,0xea,0xd1,0x00,0x00,0x00,0x00,0xc6,0x29,0xff,0xff,0x04,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0xfb,0x30,0x0e,0xf6,0xb7,0xf7,0xf2,0x3a,0xfe,0x34,0xaa,0xfb,0x02,0x21,0xd4,0xc4,0xfc,0x4f,0xf1,0x38,0xef,0x2f,0x13,0x15,0x00,0xfe,0xed,0x2e,0xfe,0x5c,0xe6,0x16,0xcd,0xba,0x81,0x04,0xe7,0x1d,0xe4,0xeb,0x4f,0x49,0xd9,0x18,0x17,0xfe,0x17,0xf7,0x24,0x3b,0xee,0x0c,0x31,0x26,0xe4,0xc2,0xc7,0xef,0x01,0xc3,0x53,0xe9,0xd5,0xf9,0xd9,0xe7,0xdb,0xee,0xe5,0xec,0x0c,0xda,0xca,0xcf,0x46,0x5f,0x40,0x48,0xf3,0xa7,0x3b,0xd2,0x92,0x1e,0xf3,0xa2,0xca,0xba,0x15,0x49,0x1c,0x6e,0x6e,0x58,0x3c,0xdb,0x78,0xf0,0x19,0x17,0xde,0x36,0x1a,0x12,0xfd,0xfd,0x34,0xda,0x55,0xb1,0x23,0x53,0xe7,0xd3,0xe5,0x1c,0xeb,0xd3,0x49,0x91,0x0e,0x81,0x15,0x04,0x05,0xe1,0x72,0x5b,0x09,0xfc,0x53,0xdf,0xfc,0x3e,0xfe,0x14,0xfa,0xc3,0xbd,0xb8,0x41,0xf6,0x2c,0xfb,0x2e,0x5b,0xff,0xef,0x18,0xf6,0x55,0x48,0x1d,0x00,0x26,0x58,0xcb,0xd2,0x37,0x12,0x56,0xd7,0xe8,0xe9,0x1a,0xfc,0xe8,0xea,0x51,0x73,0x2d,0x46,0xdc,0xf7,0xd0,0x2e,0xd9,0x1a,0xcf,0x04,0xd4,0x46,0x08,0xe4,0xcb,0x0c,0x49,0xe3,0xf7,0x4b,0xf2,0x01,0xe1,0xc9,0x08,0x1f,0x11,0x23,0x45,0x0a,0x0f,0xe8,0x9e,0x0c,0x00,0x21,0x19,0x5c,0xf9,0x2e,0xde,0x26,0xdc,0x06,0xc0,0x28,0x0d,0x19,0x17,0x08,0x59,0xed,0x36,0xec,0xf9,0x09,0xfc,0xf4,0xf2,0xd6,0x15,0x0f,0xbf,0xe2,0x71,0xed,0x33,0xd1,0xc3,0xd0,0x07,0x43,0x33,0xdb,0x35,0xfc,0x3c,0xee,0xec,0x5d,0xc2,0x0e,0x76,0x9c,0x04,0x03,0x01,0xb3,0x3b,0xcd,0xfd,0x1a,0x1b,0xca,0x2c,0x0e,0x74,0x3d,0x34,0xd6,0xff,0x01,0xf6,0x05,0xd8,0xf8,0xd0,0x0c,0x38,0xca,0x52,0x34,0xea,0xf4,0x9f,0x24,0xf2,0x67,0xb3,0xf7,0x8f,0xda,0xb2,0xdb,0xda,0x18,0xfc,0x11,0xe7,0x04,0x25,0xe6,0x05,0xf7,0xf9,0xd6,0x17,0x89,0x05,0x7f,0x7c,0x4f,0x12,0x01,0xde,0x45,0x08,0x03,0xa6,0x6e,0xfe,0x35,0x1b,0xdb,0x3b,0xda,0xa4,0xd3,0x44,0xff,0xac,0xec,0x24,0xb0,0x33,0x0a,0xb1,0x05,0xf5,0xd6,0x0a,0x33,0xf6,0xf7,0xf6,0xd8,0xb9,0xf7,0x06,0x2c,0x23,0xc3,0xcb,0x17,0xeb,0x11,0xc1,0xbd,0x2e,0xb7,0xfa,0x77,0x03,0x26,0xf6,0x36,0xf7,0xbc,0x25,0x86,0xff,0x7f,0x0b,0x30,0xd7,0x44,0x8a,0xd0,0x21,0x55,0x2f,0xd2,0xe4,0xcc,0x26,0xdb,0xe3,0x87,0xac,0xfa,0xb6,0xe3,0x40,0xc7,0x0c,0x2d,0x57,0xae,0x0f,0x41,0xc0,0xa3,0x0e,0x24,0x0d,0xed,0xb9,0x02,0x29,0xa9,0x30,0x51,0xf9,0xf3,0xa2,0xbc,0x34,0xf1,0xf5,0xc8,0xef,0xc7,0x35,0x1b,0x01,0xae,0x09,0x33,0xed,0x58,0xb1,0xce,0x2d,0xd9,0x12,0x0b,0x35,0x3f,0xdf,0x4d,0x2d,0x22,0x24,0xb1,0x1e,0xfb,0x06,0x24,0xf3,0x14,0x4f,0x29,0xf9,0x3b,0xb9,0x01,0x2a,0xf0,0x0a,0xc6,0xcb,0x2c,0xcc,0xfa,0x22,0xe0,0xf7,0x07,0xf6,0x4c,0x1a,0x06,0xde,0x92,0x50,0x26,0x16,0xe5,0xd9,0xc8,0x36,0xde,0x14,0xf6,0x6e,0x2b,0xe4,0x2d,0xa5,0x81,0x35,0xa6,0xc6,0xff,0xba,0x79,0x2e,0xfe,0xf1,0xf2,0xf9,0x28,0x24,0xf6,0x32,0x05,0x6a,0xd5,0xd5,0xd8,0xec,0x2a,0x05,0x31,0x13,0x41,0xf7,0xfd,0x1c,0xc5,0x3f,0x59,0x98,0xeb,0xdf,0x05,0x0f,0xaf,0xd4,0xf8,0xe6,0xb6,0xe7,0xcd,0xf2,0x13,0x0a,0xae,0xdf,0xf3,0xea,0xf5,0xe8,0x0b,0xdb,0xd9,0x23,0x26,0x12,0xb0,0x36,0xc3,0xee,0x57,0xfc,0x56,0xa3,0x05,0xfa,0xd1,0xcc,0xe6,0x1a,0x0e,0x02,0xf7,0x50,0xd1,0xfd,0x16,0x81,0x1a,0x1e,0x14,0xc1,0x0c,0x22,0x0c,0xd2,0x30,0xe8,0x34,0x1b,0x11,0xf1,0xbd,0xf2,0x23,0xe9,0xf3,0x00,0xd7,0xed,0x19,0xf2,0x2a,0x0d,0x1f,0x06,0x1b,0x16,0xfb,0x0f,0xe5,0xfc,0xcb,0xf5,0xfa,0x44,0xc7,0xec,0x20,0x01,0x02,0xe0,0xd4,0x09,0x2d,0x13,0x28,0xf7,0x24,0x26,0x03,0xd4,0x09,0xee,0x0b,0xfa,0x33,0x18,0x02,0x02,0x1f,0xe1,0xf0,0x02,0x20,0x1b,0xe6,0xea,0x0b,0xe2,0xc1,0xf1,0xff,0xee,0xf7,0x23,0xe9,0x04,0x21,0xec,0x0c,0xf3,0x1b,0xe8,0x0a,0xfc,0x18,0x2f,0xf8,0xf0,0x48,0xff,0x1d,0xe5,0xfd,0x1d,0xef,0x19,0x15,0xd5,0x19,0x21,0xee,0xe7,0x35,0xd9,0x26,0x45,0x05,0xe2,0xf4,0x21,0xdc,0xd9,0xd8,0x3b,0xef,0xd6,0x17,0x16,0xef,0x42,0x02,0xe9,0x0b,0x00,0x0c,0x42,0x02,0xe5,0x06,0xd1,0xa7,0x7f,0xc7,0x18,0x02,0xf0,0xfe,0xab,0xe6,0x16,0xd3,0x0d,0xf0,0x29,0x1d,0xe1,0x3f,0x1f,0x46,0xc9,0xf3,0x09,0xd4,0x0e,0x91,0xc2,0xf2,0xe4,0xbd,0x34,0xeb,0x33,0xf3,0xc6,0xfe,0xaf,0xb0,0xfb,0x29,0x15,0xf7,0xf6,0xef,0x14,0xcc,0xb2,0xc5,0xff,0x07,0xd6,0xb9,0xc4,0xe9,0x3f,0x11,0x27,0x07,0x70,0xdc,0x2c,0x0e,0xfe,0xb9,0x22,0xee,0x4d,0xdd,0x22,0xd0,0xd2,0xe6,0x20,0x2c,0x26,0x1d,0x2b,0xa8,0xe0,0xf8,0x14,0x3a,0xf4,0xc5,0x8f,0xe2,0xa2,0x2e,0x41,0xf5,0xf5,0xde,0xf3,0x03,0xe1,0xb2,0xd7,0x2e,0xd5,0xf5,0x35,0x2e,0x0e,0xfe,0x06,0xb0,0x28,0xfc,0x3a,0x7d,0xe0,0x6f,0x07,0x74,0x3c,0xf5,0x23,0xfb,0xe8,0x02,0xe6,0xf2,0x29,0xda,0x04,0xfd,0xf6,0x5f,0xfc,0x29,0x33,0xc8,0xf2,0xfe,0x00,0x4d,0x25,0xb4,0x0d,0xd7,0xc1,0x12,0x02,0x2e,0x17,0x7d,0xbe,0x28,0xcd,0xe2,0x16,0xa8,0x32,0xdb,0x20,0x0a,0x58,0x19,0x2f,0x51,0x0a,0x07,0xbe,0x70,0x09,0xca,0x34,0x0a,0x19,0x19,0x39,0x1c,0xad,0x06,0x7f,0xd6,0x32,0xbc,0xf9,0xf6,0x2b,0xfb,0xeb,0xe6,0xed,0xe9,0x38,0xed,0xbb,0xc5,0x3b,0x09,0x2f,0x12,0x8d,0xdb,0x61,0xdf,0x0f,0xef,0x37,0xc4,0x0f,0xf4,0xd0,0xd6,0x58,0xbf,0x00,0x9a,0xe7,0xf5,0x0d,0xf1,0x27,0x3d,0xd8,0x3b,0xda,0xe5,0x18,0x33,0xf2,0xe8,0xcf,0xf7,0xea,0xda,0xf0,0xe3,0x12,0x26,0x1a,0x90,0x0e,0x2b,0xce,0x38,0x4a,0xd9,0xeb,0x37,0x2e,0x30,0x0b,0x90,0x0a,0xfa,0x27,0x8d,0xeb,0x28,0x10,0x43,0xad,0xbc,0xd0,0x1b,0x03,0x4e,0x2d,0x08,0x5a,0x4c,0xbd,0x08,0x4e,0x81,0x63,0xb7,0x15,0xf4,0xd6,0xe8,0x0f,0xa6,0x11,0x14,0x1b,0xf4,0x0b,0xd3,0xd5,0x9e,0x3a,0x39,0x48,0xfd,0x46,0x75,0x35,0xd9,0x0e,0x2f,0xe4,0xfa,0x4e,0x09,0x4e,0x0d,0x42,0xb5,0xa2,0x22,0x2c,0xfb,0x0c,0xed,0xf3,0xff,0xe2,0x00,0x1d,0x09,0x2b,0x17,0xfe,0x0f,0x2e,0xf8,0xcf,0x0c,0xe8,0xe4,0xf1,0xf3,0x12,0x0f,0x1a,0xfc,0x14,0x0d,0xdb,0xe7,0xf6,0x33,0xeb,0x17,0x07,0xca,0xd5,0x02,0xf2,0x7f,0xe1,0x05,0xf9,0x02,0x13,0x22,0xd1,0xfd,0xf8,0x2e,0x17,0x07,0x2d,0x47,0x21,0x32,0xea,0x32,0x02,0xca,0xfd,0x0c,0xe9,0xfa,0x24,0x09,0xe8,0x03,0xba,0xf9,0x0e,0xd9,0xd6,0xfd,0x3c,0xfa,0x11,0xfc,0x0c,0x24,0xeb,0x14,0xf7,0xff,0x36,0x12,0xd7,0xdb,0x14,0x23,0x1b,0xf9,0xf0,0xd5,0x44,0xe2,0xd6,0x08,0xf3,0x0d,0xdd,0xee,0x08,0xef,0xf3,0x04,0xe1,0xe5,0x1b,0xec,0x0d,0x08,0xfa,0xda,0xf8,0x11,0xe1,0x3b,0xe3,0xdd,0x26,0xce,0x7f,0xc7,0x07,0xf5,0xeb,0x1b,0x4e,0x22,0x1c,0x3f,0x0d,0xfd,0x55,0xec,0xcf,0x10,0xe9,0xdd,0x5c,0xac,0xe9,0xf5,0x5c,0x09,0xaf,0x35,0xfc,0x2e,0x05,0x20,0xba,0xf1,0x34,0x10,0x0c,0xf8,0x29,0x01,0x21,0x09,0xef,0x1e,0xc5,0x0c,0xcf,0x0f,0xfb,0x16,0x35,0x1c,0xe0,0xd3,0x3c,0x18,0x14,0xb4,0x08,0xeb,0x49,0xcb,0xe1,0xdd,0x01,0xe1,0x36,0xe6,0x33,0x03,0x15,0xf9,0xda,0x2e,0xd9,0x2b,0xc8,0xc4,0xea,0xfc,0xc9,0xf9,0x3b,0x12,0xd4,0x08,0xf9,0x0c,0xd2,0xe9,0x1b,0x01,0x23,0xd8,0xd7,0x23,0x06,0x37,0xd7,0x25,0xce,0xdc,0xd4,0xde,0x03,0x4a,0x0d,0x07,0xf3,0x3f,0xdf,0x0d,0x1d,0xea,0x48,0x09,0x24,0xfb,0xb9,0xe7,0x52,0x18,0xd1,0x03,0x09,0x16,0x44,0xdb,0x06,0x0f,0x01,0x40,0x2c,0x15,0xf9,0xc9,0x0d,0x0c,0x05,0xfe,0x18,0xf3,0xd9,0x4a,0x3c,0x27,0xd9,0x07,0xfe,0x07,0xf5,0x07,0x22,0x1a,0xf4,0x4d,0xd6,0x23,0x16,0x17,0x01,0xbc,0xdc,0xda,0xdb,0xf9,0x0a,0xf0,0xc9,0xfc,0xe2,0x13,0xf6,0xf1,0xf3,0x30,0xf6,0xba,0x57,0x08,0x11,0xfa,0xe4,0xf4,0xe7,0xf7,0x12,0xf9,0xe8,0x0d,0x24,0xec,0x19,0xdb,0x0b,0x2a,0x32,0x1a,0xaa,0xe2,0x12,0x03,0x38,0xf6,0x26,0xfb,0xed,0xdf,0x01,0xfd,0x1a,0x7f,0x09,0xf1,0xee,0x11,0x00,0x00,0x00,0x00,0x16,0x2f,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x0a,0x00,0x00,0x2e,0x47,0x2c,0x20,0xbc,0x03,0xe9,0x5a,0xa7,0xe6,0x7f,0x15,0xa8,0x04,0xfe,0x6e,0x6b,0x32,0x4e,0x09,0xea,0xed,0xfc,0xec,0xcf,0x05,0x2e,0x18,0xd6,0x07,0xcc,0x05,0xb1,0x10,0x21,0x29,0xcb,0xab,0x3c,0x5e,0x45,0x15,0xdc,0x31,0xe2,0x6d,0x7f,0x36,0xf4,0xff,0x38,0xc0,0x0f,0xed,0x81,0x44,0xfd,0x10,0xbd,0xbd,0x0a,0xe5,0xca,0xd9,0xfd,0xc9,0xc7,0xf6,0xa5,0xd3,0xbb,0x08,0xf0,0x08,0xcb,0x1c,0x23,0xe5,0xca,0xc2,0x2f,0xd1,0x52,0x35,0x60,0xcd,0xe0,0xf9,0xf7,0xe5,0x47,0x7b,0xf9,0x3f,0xc4,0x7f,0xf6,0xd0,0x7f,0xcc,0xd0,0x56,0xec,0x2a,0x17,0xe0,0x4b,0x54,0x1f,0xc6,0xe1,0xbd,0x55,0xf5,0xec,0x24,0x6f,0xf4,0x13,0xcf,0xa8,0x2b,0x78,0x5d,0xc4,0xea,0xe8,0x4f,0xa5,0xc3,0x2d,0x20,0x94,0xcb,0xf0,0x7f,0xf5,0xe3,0x29,0xb9,0x08,0x3b,0xe5,0xeb,0x1f,0xc8,0xb4,0xf3,0xe5,0xe8,0xdf,0xd0,0xcc,0xfe,0xf5,0x1b,0x7f,0x0a,0x18,0x20,0x0f,0xbf,0xff,0xcf,0x4f,0xb9,0xd1,0xc8,0xa4,0x06,0x17,0xe3,0x0d,0x7f,0x17,0x68,0x14,0xbf,0xf8,0xfa,0xbf,0xcf,0xaf,0xc8,0x04,0xcd,0xe1,0xa7,0xd9,0x9d,0xc8,0x63,0x14,0x3b,0x2b,0xdb,0x3e,0xef,0x27,0xcb,0x0c,0xfa,0x39,0xb9,0x11,0x76,0xe2,0x38,0x07,0x81,0x26,0x33,0xb0,0x0e,0x14,0x2f,0xf9,0x7f,0x23,0xf3,0x43,0x65,0x2a,0x4e,0xf7,0x09,0xb3,0xdd,0xe9,0x29,0xf9,0x3b,0x13,0xd2,0x81,0xca,0x12,0x98,0xbc,0x06,0xe8,0xb3,0x81,0x4e,0xe6,0x9a,0xa4,0xf0,0x24,0x0d,0x1a,0xe5,0x00,0xeb,0xfc,0x2e,0x2b,0xfa,0x93,0x18,0x16,0xe6,0xc0,0xcd,0xb1,0xbc,0xcc,0x7b,0x81,0xb6,0xb0,0xdf,0xa5,0x01,0xdc,0x33,0x4c,0xfb,0x0c,0xc4,0xf0,0x21,0xb0,0x84,0x07,0xca,0xa2,0x18,0xb0,0x33,0xe0,0x8c,0xc5,0xec,0xed,0xf3,0xff,0xbe,0x77,0x8f,0x55,0x10,0x08,0x1e,0x47,0x2c,0x67,0x3e,0x6c,0x07,0x87,0x7f,0xfb,0x81,0xaa,0xe7,0xba,0xd8,0xc2,0x2d,0x43,0x1e,0x06,0xe7,0x1a,0xe4,0x17,0xe2,0xef,0xbe,0x02,0xdf,0xd6,0xe0,0x34,0x14,0xa6,0xed,0x2a,0xd9,0x0d,0xf4,0x21,0x7f,0x14,0x3c,0xbf,0xce,0x21,0xf4,0xf0,0x12,0x4b,0xf9,0xb9,0x03,0x3c,0x3a,0xfa,0x1c,0x0c,0xaf,0x2e,0xf4,0x04,0x10,0x01,0x13,0xab,0x7f,0x58,0xaf,0xfd,0xe6,0x7c,0x0d,0xd6,0x16,0xe9,0xb3,0x05,0x0b,0x4e,0xb9,0xff,0x77,0xf6,0xec,0xdf,0xda,0x1f,0x39,0x12,0xe5,0x9e,0x5f,0xf3,0x0d,0x14,0x7f,0x4a,0x06,0x3b,0xed,0xa7,0x3d,0xb7,0xee,0x01,0x44,0x9b,0x16,0x74,0x7f,0xbc,0xb0,0xbe,0xd2,0xe9,0x5b,0xec,0x44,0xd7,0xf1,0xb6,0xfc,0xc7,0x06,0xf1,0xf2,0x9e,0xe3,0x0d,0xe7,0x02,0xbb,0x66,0x09,0x40,0xb0,0x14,0x14,0x14,0xe5,0x22,0x1c,0xf0,0x4f,0xc6,0xc1,0x06,0x7f,0x03,0x46,0xff,0xe4,0x15,0xcd,0x99,0xc7,0x3c,0xfe,0xfc,0xb4,0x7a,0x0a,0x68,0x3a,0x01,0x22,0xc6,0xba,0x7f,0xab,0xb1,0x0a,0xc9,0xd4,0xaa,0xcc,0x7f,0x19,0x33,0xe5,0xde,0x44,0x15,0xc9,0xe6,0xe3,0x13,0x00,0x0e,0xf4,0xe2,0xe3,0x51,0xa9,0x15,0xe9,0x11,0xcb,0x0f,0xc4,0x4f,0x81,0x46,0xd1,0xdd,0xde,0x02,0xc4,0x1d,0xfd,0x07,0xd0,0xff,0xa5,0x41,0x2b,0xf2,0xce,0x24,0xc5,0xd6,0x70,0xec,0xdd,0x1f,0xf5,0x35,0x70,0xdc,0xfc,0x9c,0x27,0xb3,0x11,0x03,0x16,0x24,0xd1,0xe3,0x81,0x3a,0x5e,0x0f,0x10,0x02,0x9c,0x43,0xbe,0xbe,0xc3,0x1d,0x7f,0xf6,0xc1,0xf3,0xd7,0x05,0x18,0x4c,0x2a,0xf5,0x07,0xe7,0xbd,0xb1,0xa5,0xd6,0xef,0xbb,0x34,0xbd,0xf7,0xf1,0xcf,0xbb,0xd9,0x9c,0xea,0xce,0x1d,0xd9,0xe5,0x44,0x7f,0xd5,0x3d,0x48,0x40,0x26,0xd9,0x65,0xaf,0x64,0xcc,0x06,0x30,0x2a,0x50,0xd0,0x1a,0xcf,0xec,0xdb,0x10,0x23,0xd2,0x7f,0x1f,0x44,0xfe,0x2a,0xe4,0xde,0x17,0xd5,0xc1,0xaa,0x2a,0xe7,0x2e,0xfd,0x95,0x24,0x06,0xfe,0xd9,0x17,0x00,0xdd,0x0a,0x5d,0x3f,0xcd,0xed,0xfc,0x15,0xf5,0x57,0xe8,0x4b,0xb6,0x7f,0xf4,0xd7,0x0e,0x93,0x95,0xf1,0x3a,0x7f,0xe8,0xef,0x8b,0x0e,0x44,0xe1,0xc4,0xe3,0x10,0xf3,0x02,0x2f,0x92,0xdf,0xc4,0x2a,0x15,0x9c,0xd7,0xe5,0x81,0x1c,0x95,0x00,0xf5,0x02,0xab,0xe8,0x0e,0xe0,0xe2,0x03,0xe4,0x27,0x2d,0x2b,0xb0,0xd9,0x58,0xb8,0xd2,0x02,0x70,0x6f,0x7b,0x81,0xf0,0x0b,0x5e,0xba,0xcd,0xbd,0x08,0xf7,0x34,0xf8,0xbe,0x3f,0x30,0xd7,0xc7,0x64,0xc2,0x74,0x4c,0xbf,0xed,0x30,0xdc,0x56,0xcf,0xbc,0xc8,0xdb,0x2d,0x1a,0xcb,0xfb,0xc6,0x2a,0x41,0xd8,0x3a,0x22,0x0a,0xda,0xe0,0x0c,0x7f,0xf7,0x0a,0x49,0xe1,0xfe,0x0b,0x1e,0xf1,0x7f,0x67,0x40,0xd9,0xfd,0x1f,0x3d,0x1a,0x08,0xdc,0xfd,0xe6,0xe9,0xe8,0x2f,0xf2,0x09,0xff,0x6b,0xcf,0xc8,0x17,0x31,0x7f,0xeb,0x3e,0x29,0x0f,0x95,0xee,0x35,0xe9,0x1a,0xef,0xe7,0xa9,0x60,0xe2,0x75,0xf0,0xd9,0xf6,0xc1,0xbb,0xf5,0xf7,0xf9,0xf5,0x81,0xfc,0xd7,0x69,0x46,0x60,0xf2,0xfa,0x27,0xd3,0xc3,0xd5,0xf0,0xb7,0xef,0x25,0x02,0x23,0xd6,0xe1,0xf5,0x1b,0xe0,0x4e,0xbf,0xf0,0x06,0xd1,0x05,0x1a,0x03,0x43,0x7f,0xe2,0xfc,0x14,0x1a,0x27,0x4e,0x9f,0xe3,0x0a,0xf3,0x7f,0xe3,0xf7,0xf7,0xf4,0xfe,0x0f,0x03,0x24,0x00,0x05,0xfe,0xf4,0xe9,0x04,0xe5,0xe7,0x0b,0xf3,0x11,0xf1,0x12,0x0c,0x47,0xbf,0xf8,0x75,0x28,0xe5,0x01,0xe8,0x0e,0x81,0x0c,0x17,0x02,0x18,0x59,0x09,0x83,0xdf,0x03,0xda,0xf3,0xeb,0x17,0x09,0xb0,0x20,0xfb,0xdb,0xb4,0x17,0x56,0x4b,0xc4,0xde,0x27,0x25,0xce,0xf2,0x13,0x33,0xd6,0x88,0xc7,0x1d,0x10,0x81,0x22,0xb0,0xc8,0xfb,0x58,0x3a,0x04,0x32,0x2d,0x43,0xd6,0x30,0x12,0xc4,0x31,0xaf,0x27,0xc1,0x72,0xf4,0x5f,0xb4,0x6e,0xf0,0x7f,0x28,0x22,0xfb,0x5f,0x3e,0xc0,0x0c,0x7f,0xfb,0x20,0xf1,0x21,0x06,0x0e,0xdd,0x02,0x58,0x54,0x99,0x13,0x8e,0xfc,0xdd,0x1f,0x44,0x6d,0xfb,0xdc,0x02,0x15,0x81,0x24,0xc5,0xfd,0x0a,0x63,0x5b,0xf5,0x0a,0x5b,0x32,0xf4,0x20,0x39,0x62,0x01,0xd7,0xea,0x89,0x11,0x0f,0x20,0x52,0xad,0x36,0x4d,0x16,0xf6,0x01,0x0d,0x7f,0x39,0xf7,0x15,0xb9,0x76,0xd1,0x34,0x9a,0x4c,0x43,0xe7,0xb4,0xc6,0xb8,0xde,0xb6,0x1a,0x29,0x23,0x10,0x81,0xe3,0xfb,0xb1,0xf1,0xa1,0x08,0x2e,0x40,0x90,0xf6,0x2f,0x38,0xc9,0x63,0xdd,0x19,0x2e,0x1a,0x11,0xf9,0x1e,0xfa,0x3b,0x6b,0x26,0xa3,0xef,0xc6,0xec,0xe8,0x48,0x12,0x27,0x23,0x04,0x98,0x81,0xdb,0xdb,0xfc,0x2b,0x81,0xc0,0x5a,0x30,0x29,0xd0,0x0a,0x1e,0x06,0xe1,0x04,0x33,0x41,0x05,0x1b,0x3f,0xc9,0x6c,0xcf,0x25,0xea,0xb2,0x6c,0x81,0x24,0x0b,0xfb,0xd3,0xca,0xe8,0x06,0x2b,0x14,0xf7,0xca,0x2c,0x28,0x20,0xde,0x2a,0x03,0x14,0xd3,0xec,0xc9,0x7f,0x02,0x7e,0xf9,0x1f,0xa5,0x16,0x2d,0x56,0x1a,0xad,0xda,0x07,0x0e,0x04,0x0b,0x56,0xac,0xf1,0xc6,0xb0,0x37,0x0f,0xd7,0xee,0x33,0xa6,0xd6,0xfb,0xc7,0x3c,0x28,0x7e,0xe2,0x00,0xb5,0xd1,0x00,0xd6,0xf5,0xe3,0xd9,0xba,0x52,0xb5,0x7f,0x55,0xff,0xea,0x5d,0xbd,0xd1,0x20,0x16,0xdc,0x20,0xfa,0xc6,0xaf,0x12,0x10,0x33,0xf1,0x23,0xec,0x1d,0x5e,0x0c,0x04,0x12,0x81,0x33,0xd6,0x81,0xd8,0x33,0x0e,0xea,0xed,0xcb,0x26,0xf1,0xb8,0x06,0xe6,0x48,0xf0,0xed,0xae,0x9b,0xe4,0xd8,0x34,0xe3,0x03,0x3d,0xdc,0x7e,0xb8,0xdf,0x34,0xcc,0xd1,0xe6,0xcc,0x0e,0xe9,0x2c,0xe9,0xec,0x1a,0xfb,0x20,0xed,0x7f,0xfa,0x01,0xb5,0xf2,0xce,0xc8,0xd2,0xdc,0xce,0x32,0x2f,0x6a,0x2e,0x15,0x15,0x55,0xd1,0xa8,0xe0,0xfb,0x7f,0x0a,0x02,0x17,0x04,0xde,0xd0,0xdc,0xff,0x2c,0x2b,0xee,0x08,0xcb,0xe8,0xea,0x81,0xdd,0xf0,0xb5,0xeb,0x08,0x0b,0xf9,0xe3,0x12,0xee,0x08,0x0c,0x0f,0x15,0x37,0x07,0x05,0x2c,0x68,0x01,0xe4,0x23,0xe5,0xf7,0x9e,0x30,0xe1,0xec,0x0c,0x10,0x48,0x7f,0x01,0x09,0xdf,0xe2,0xea,0x58,0x0f,0xb4,0xcb,0xb0,0xa3,0x81,0xf0,0x1c,0x06,0x09,0x83,0x22,0x05,0x12,0x2d,0xf1,0x50,0xdb,0x08,0x98,0x5d,0xc0,0x53,0xb9,0x4b,0xb5,0xd4,0x83,0xfb,0xf8,0x2c,0xe3,0xae,0xb8,0x7f,0x1f,0x42,0x24,0xfd,0x21,0x0b,0xe3,0xc1,0x39,0xbe,0xf8,0x10,0xbf,0x61,0xed,0x72,0xcb,0x7f,0xbe,0x49,0xeb,0x4f,0x07,0x1b,0xdd,0x10,0x45,0x08,0xca,0x0e,0x79,0x25,0xed,0x39,0xf2,0xd9,0x24,0x85,0xcb,0x20,0xe1,0x53,0x42,0x18,0x69,0xdb,0x81,0x1b,0x1f,0xf2,0x09,0x27,0xf0,0xbc,0x8e,0xc9,0xf0,0xaf,0x2b,0x16,0xc1,0xcf,0x10,0x7a,0x2f,0xe1,0x0c,0xce,0xe4,0xbf,0xc5,0x08,0xee,0x0e,0x26,0x28,0x04,0x05,0xb8,0xfe,0x7f,0x2f,0x06,0xac,0x0a,0xc3,0xdb,0x17,0x05,0x26,0xcb,0x7f,0xcb,0xf0,0x56,0x3b,0x48,0x86,0x56,0xfd,0x22,0x19,0x03,0xd4,0xa3,0x31,0xfd,0x34,0xd4,0xe3,0x38,0x15,0x7f,0xe0,0xdd,0x22,0x1b,0x2b,0xde,0x04,0x14,0xf2,0x1c,0x24,0xfb,0xf8,0x21,0x39,0x03,0xa0,0x38,0xf7,0x2f,0x3c,0x1e,0x37,0xc7,0xf7,0xed,0x41,0xec,0xe6,0xce,0x62,0x29,0x13,0xbc,0xf8,0x01,0x58,0x7f,0x3d,0x3a,0xc6,0xce,0xf3,0xad,0x43,0x26,0x42,0x1a,0x49,0x0c,0x1a,0xd7,0x81,0x22,0xcf,0x14,0xec,0xfb,0xea,0x48,0xf3,0x2d,0x08,0xf5,0x96,0xfd,0x00,0xde,0xe0,0x0d,0xb2,0xa0,0x7f,0xbd,0xab,0x35,0xa5,0xc7,0xfc,0x52,0xc3,0xdd,0x43,0x6c,0xd2,0xa8,0x1f,0xad,0xdf,0x07,0x43,0xf8,0xab,0xb3,0x16,0x31,0x7f,0xf8,0xc5,0x78,0x1a,0x09,0xda,0xff,0x44,0x2a,0xe9,0x22,0x1e,0x1a,0xfb,0x37,0x2e,0xbc,0x19,0xe5,0x5f,0xe8,0x21,0x44,0x08,0x15,0x0b,0xc7,0xee,0x48,0xe8,0x06,0x23,0x17,0xc5,0x56,0x0e,0x7f,0xfe,0x36,0xe6,0x4f,0xc1,0x5c,0x1b,0x1f,0x07,0xf7,0x9b,0xd7,0xf4,0xc7,0x23,0x1a,0x08,0xf6,0x36,0xc1,0x00,0xf9,0xe0,0x96,0x5a,0xe4,0x1e,0xef,0x81,0xfa,0xb4,0x06,0x9b,0xee,0xc0,0x47,0x35,0x7f,0x10,0x15,0x19,0xff,0x3b,0x1e,0xea,0xb4,0xff,0x0a,0xa5,0x1c,0x91,0x18,0x08,0x0e,0x01,0xb5,0x37,0xf0,0x11,0xaf,0xe8,0x13,0xcc,0x2c,0xf6,0xdb,0x26,0x7f,0x40,0x0a,0xe5,0x0e,0xe7,0x01,0xd7,0x18,0x1e,0x38,0xfe,0x12,0xa9,0xe5,0x1e,0x7a,0x39,0x08,0xed,0xd7,0x94,0x0b,0xd2,0xea,0xbf,0x33,0xf9,0x40,0x11,0xf8,0xe7,0x36,0x49,0x0b,0x7f,0xbe,0x16,0xb9,0x1f,0x0c,0x14,0xfb,0x99,0xb2,0x7f,0x35,0x20,0x1b,0x25,0x0a,0x48,0x09,0x1c,0x44,0xe9,0xeb,0xfd,0xef,0x32,0x10,0xfe,0x25,0x13,0xd9,0x81,0xfa,0xfc,0xfb,0xc8,0x0b,0x23,0xbb,0x02,0x21,0x0f,0x25,0x4d,0x05,0x4a,0xce,0x04,0xc4,0xfa,0xf8,0xe9,0xe0,0xd4,0xe9,0x19,0x09,0xf4,0xd3,0x63,0x35,0x1a,0xcf,0xe6,0xde,0x2f,0x49,0xe5,0x81,0xcd,0x11,0xe8,0x33,0xea,0x17,0x03,0xf4,0xcc,0x48,0x15,0xa4,0xa8,0x0e,0x2f,0xbd,0x87,0x16,0xb7,0x5f,0xa0,0x81,0xe8,0xab,0xe4,0x06,0xd0,0xae,0x7b,0x43,0x1b,0x81,0x35,0xa9,0xcc,0x59,0x2b,0xd8,0x07,0x1e,0x52,0xe1,0xe5,0xfd,0xdc,0xef,0xca,0x10,0xe9,0x28,0x1c,0xd8,0xf4,0xed,0xf3,0x56,0x1b,0xc9,0x16,0x24,0xdc,0x1f,0x4e,0xaa,0xdc,0x0c,0xa7,0xd4,0xf5,0x2a,0xf2,0x30,0x43,0x1e,0x0e,0xa5,0x38,0x7f,0x35,0xf9,0x49,0xd7,0x15,0x1c,0x1c,0xfd,0x81,0x3b,0x4c,0xce,0xc1,0x08,0x22,0xde,0xcc,0x0d,0xfc,0x94,0x03,0xb1,0x09,0x8c,0xcc,0x6d,0x8a,0xc2,0x1f,0x48,0x12,0xa5,0xfa,0xe4,0xb8,0x1b,0x79,0xd4,0x01,0x23,0xeb,0x4e,0xeb,0x36,0x2c,0x0b,0x81,0x7f,0x0b,0x23,0x15,0x7d,0x14,0xb9,0x09,0x7f,0xbc,0x0d,0xf1,0x18,0x0d,0x21,0xeb,0x22,0xeb,0xb6,0xff,0xd9,0xd1,0xf3,0xce,0x96,0x81,0xcf,0xfe,0x0a,0x10,0x16,0x06,0xfc,0x3a,0x0d,0xae,0xfd,0xca,0xf4,0xf6,0xca,0xe7,0xf6,0x02,0xe4,0xfc,0x40,0xee,0xa0,0xf8,0xc4,0x02,0xd7,0xe0,0xa8,0x41,0xdf,0xa6,0x11,0x2c,0x30,0x04,0xe8,0xff,0xfe,0x21,0xe6,0x64,0xe1,0x11,0x24,0x81,0xb9,0xe8,0x81,0xe4,0xee,0xe6,0x03,0x09,0xf4,0xa1,0x9d,0x1f,0x2d,0xc6,0xb8,0xdf,0xe4,0x42,0x38,0x7a,0x08,0xe8,0xe9,0x36,0xc2,0xf0,0xf3,0x10,0x7f,0x0b,0xe8,0xff,0xf1,0xee,0x08,0xb7,0x12,0x09,0xed,0xf3,0xe9,0xd0,0x0c,0x17,0x46,0x37,0x12,0x49,0x19,0x90,0x46,0x2d,0x8e,0xd5,0xf6,0xbb,0x40,0x7f,0xbd,0xf7,0x10,0x09,0xd9,0xea,0x8d,0x07,0xd8,0xcf,0x17,0x21,0x3a,0x5d,0x0a,0xd6,0x91,0xaf,0x81,0x28,0xfb,0x75,0xe9,0xed,0xec,0x5d,0xe7,0x9c,0x41,0x1d,0x52,0xab,0xd4,0x13,0xea,0x07,0xe1,0xf8,0x36,0xe9,0xeb,0xf5,0x1a,0xd1,0xeb,0xfc,0x81,0x1a,0xf4,0xee,0x00,0x09,0x1d,0x19,0x25,0xfa,0x07,0x27,0x15,0xe8,0x57,0xed,0x3b,0x40,0xf2,0x3f,0x9a,0x34,0xee,0x04,0x30,0x46,0x23,0x13,0x00,0x1b,0x26,0xe6,0xe9,0x4a,0x81,0x2b,0x28,0xe6,0xe7,0x4e,0xeb,0x14,0xb1,0xea,0xd1,0xcc,0xe8,0x1c,0x97,0x29,0xc7,0x22,0x16,0x51,0x81,0x0d,0x1d,0x08,0x37,0xde,0x3f,0x60,0xdc,0x02,0x79,0x14,0x43,0xff,0xe0,0xec,0x26,0xee,0xf6,0xe6,0xb5,0xf5,0x04,0x00,0xec,0xe5,0x00,0x19,0xdb,0x81,0xf1,0xf1,0x19,0x45,0x02,0xd4,0x12,0x8a,0x08,0xe1,0x11,0x7f,0x24,0x85,0xb6,0x39,0xfa,0x66,0xc3,0xf8,0x1e,0xf8,0x46,0xc1,0xda,0xea,0xd2,0x02,0xe5,0x14,0x0b,0xbf,0xfc,0x10,0xec,0x7f,0xf2,0x2e,0xca,0x0a,0xf3,0xf5,0xfb,0xe3,0x13,0xd7,0xf6,0xd9,0xed,0x05,0xdb,0xa6,0xf1,0x13,0x7f,0xd7,0xfa,0x57,0x4a,0xa6,0x8b,0x26,0xe0,0x01,0x2f,0x92,0xd9,0xf1,0x20,0x1b,0xf7,0xeb,0x23,0x26,0xc7,0xab,0xeb,0x36,0xaf,0x26,0xcc,0xb1,0x2d,0x34,0x4d,0x26,0x67,0x00,0x81,0x9a,0xa2,0x05,0xf0,0x31,0xe6,0xf6,0x8b,0xcc,0xc1,0xae,0x32,0x17,0x05,0x7f,0xdd,0x01,0x39,0x16,0x30,0xe7,0xfe,0x3d,0xe9,0x60,0xf9,0x05,0xff,0xee,0xe0,0xcd,0x08,0xed,0x22,0xfe,0xbc,0x01,0x08,0xdb,0x05,0xeb,0xd7,0xe5,0x81,0x01,0xf1,0xfb,0xe2,0x03,0x32,0xfa,0xf5,0x08,0xf4,0xff,0x04,0xe8,0x2e,0xf1,0x12,0x1a,0xf5,0xc6,0xde,0x81,0xf1,0x26,0x12,0xf0,0xa0,0x4e,0xcf,0xd5,0xe3,0xdf,0xfc,0x15,0x21,0xe9,0xbd,0x02,0x3a,0xdd,0x70,0x35,0x7f,0x71,0xbd,0x28,0x4a,0x37,0xf0,0x1e,0x18,0x2c,0xb9,0x3c,0xe9,0xfd,0x17,0x25,0x06,0xc2,0x38,0xd7,0x0a,0x0d,0xcc,0x11,0x22,0xda,0x27,0x5f,0x0f,0x15,0xc7,0x38,0xda,0x22,0xc6,0x20,0x9d,0x21,0x6d,0x18,0x81,0x97,0xed,0xbb,0x5e,0x68,0x51,0xf9,0xa8,0xcb,0x10,0x2b,0x0f,0x39,0xf1,0x10,0xf4,0xe6,0x25,0xbd,0xb2,0xe1,0x49,0xee,0xc9,0x15,0x22,0xf1,0xfd,0x81,0x14,0xc9,0x6a,0xe7,0x07,0xe0,0x7f,0x2d,0xb4,0xf4,0xc9,0x28,0x1b,0x28,0xfc,0xed,0x3a,0xcb,0x25,0x4c,0x5c,0x15,0x3c,0xdc,0x3c,0xe2,0x81,0x3f,0x15,0xc2,0xed,0xd5,0xdc,0x31,0xed,0x08,0x23,0x4b,0x9f,0x0b,0x17,0x36,0xe4,0xf4,0xe3,0x14,0x34,0x8e,0x47,0x21,0x42,0x3a,0xd2,0xcb,0x37,0x20,0x03,0x35,0x02,0xb5,0x0b,0x31,0xda,0xac,0xab,0x40,0xe2,0xa2,0x7f,0x17,0x04,0x15,0xdf,0x26,0xf2,0xba,0x9d,0x57,0x22,0x3b,0xa6,0xc6,0xc7,0x2c,0x19,0x0a,0xf0,0xeb,0xd2,0xca,0x7f,0x29,0x20,0xa5,0x10,0xf8,0x0f,0x05,0x4e,0xf2,0x08,0xf0,0x43,0xd1,0x43,0x11,0xf7,0xf5,0xfe,0xbf,0x08,0x0d,0x7f,0x5b,0x4c,0xf8,0x43,0xc7,0xe4,0xe7,0x61,0xd3,0x40,0xae,0x0a,0x81,0xe8,0xe1,0xc6,0xd3,0xc3,0xeb,0x11,0xde,0x24,0x02,0x09,0x18,0xd8,0x58,0xbc,0xfd,0x00,0x12,0x0e,0x62,0xd5,0x69,0xb4,0x04,0x20,0xac,0x22,0x42,0xa9,0x9b,0xf8,0x81,0x65,0xb8,0x0b,0x38,0xbd,0x34,0xd0,0xac,0xd3,0xaa,0x2e,0x04,0x71,0x27,0xe2,0xf7,0x37,0x40,0xd3,0xfd,0xfd,0x41,0x81,0x3a,0x24,0xdb,0x09,0x2e,0xc4,0xec,0x3c,0xa8,0x2b,0x0d,0xdb,0x1b,0x96,0xfb,0xad,0x3d,0x81,0xd9,0x24,0x18,0x2b,0x1d,0xfa,0x55,0x53,0x09,0x02,0xda,0xbf,0xe9,0xfc,0xff,0xd9,0xd7,0x29,0xc2,0x32,0x81,0x33,0xbb,0xe7,0xdc,0xd6,0x06,0x04,0xf7,0x1e,0xcd,0xee,0x3c,0x79,0xe3,0x9a,0x4c,0x9d,0xe7,0xcb,0x02,0xe8,0xbe,0x36,0x06,0xf3,0xe4,0xa8,0xd4,0xd5,0x7f,0xce,0xde,0xfd,0x1a,0xc7,0xf5,0xde,0x41,0x0f,0x2a,0x4d,0xf9,0x3c,0x60,0x5e,0xbf,0x3b,0xb3,0x30,0x46,0x1f,0x40,0x9b,0x14,0xda,0xe4,0x1b,0x5d,0xf4,0xd7,0x1b,0xe3,0x7f,0xd8,0x43,0x40,0xe6,0xf5,0x58,0x04,0x38,0x14,0xd7,0x06,0x03,0x81,0x03,0xac,0xf7,0x3b,0x0e,0x9b,0x0a,0x4f,0x0b,0x17,0xd1,0x26,0xa2,0x13,0xee,0x2d,0xfb,0x00,0x00,0x00,0x00,0xa6,0x39,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x0a,0x00,0x00,0xc7,0xbd,0x3e,0xc4,0x0f,0x08,0xb6,0xec,0x21,0xbd,0xfc,0xee,0xfe,0x36,0xd0,0x26,0x7f,0x30,0x33,0xe1,0xd4,0x1f,0xe2,0x4b,0x03,0xd0,0x35,0x04,0x06,0xa5,0x1c,0xda,0xd8,0xa4,0x09,0xe8,0x06,0xfa,0xfa,0x51,0xef,0x0a,0x1e,0xe2,0xf1,0x19,0xcd,0x03,0x49,0x53,0x10,0xda,0xfa,0x2a,0xfb,0x54,0xc6,0xd7,0xf4,0xef,0xcb,0xf9,0x86,0xf5,0x49,0xe4,0x45,0xd2,0x24,0x5b,0x93,0x0f,0xe9,0x3f,0x23,0x02,0xe3,0xda,0xfa,0xca,0x72,0x38,0xfb,0xf0,0xe6,0x07,0xcd,0xc8,0xe8,0xca,0x55,0xfb,0x19,0xed,0x08,0x28,0x35,0xe9,0xfa,0xe9,0xeb,0x6e,0xee,0xca,0xbe,0xda,0xd8,0xf4,0xef,0x4c,0xc6,0xfd,0x5c,0x2c,0xde,0xe5,0x50,0x0e,0x20,0x3f,0x3a,0xa0,0xd9,0xcc,0x06,0x0d,0xf3,0xcb,0x0f,0x0d,0xe6,0x33,0xfb,0x3c,0x04,0x4c,0x3c,0x29,0x29,0xc9,0xf5,0x21,0xfd,0xd3,0x02,0xed,0x66,0xb9,0x32,0xf3,0xdf,0x0b,0x20,0x96,0xfd,0x00,0xc4,0xa7,0x26,0x2e,0x1d,0xf7,0xe8,0x34,0x2f,0xcb,0xd0,0x1e,0x19,0xf5,0x27,0x11,0x19,0x14,0xf6,0xfa,0x1b,0x5b,0xc5,0x05,0x0f,0x21,0x11,0x1f,0x31,0x12,0xce,0x30,0x9e,0x11,0xac,0xc9,0x38,0x02,0xc5,0x03,0xf5,0x90,0xe1,0xd1,0x1b,0xf8,0x11,0x52,0x37,0x11,0xe8,0x35,0xdf,0x13,0x18,0x1c,0x7f,0xf5,0x21,0xbe,0x63,0x23,0xe5,0x9b,0xee,0x08,0x17,0xf5,0x1b,0xf8,0xd4,0x00,0x0f,0xdf,0xc2,0xf7,0x33,0x0a,0x17,0x1d,0x00,0xe1,0x07,0xd5,0x3b,0xda,0xb4,0xd6,0xe9,0x1e,0x10,0xe9,0x1a,0x08,0xfc,0xda,0x36,0xf3,0xf5,0x08,0xfe,0xe6,0x27,0x15,0xfc,0x39,0xdc,0x13,0x3e,0x01,0xe2,0xe5,0x19,0x09,0xbb,0xf9,0xf5,0xea,0xe3,0x33,0xff,0xf9,0xf9,0x55,0xfe,0xfe,0xc9,0x09,0x00,0x03,0x35,0xe6,0x09,0x0d,0x14,0xe8,0xe4,0x06,0xfd,0x7f,0xd3,0x09,0x0f,0xf3,0x07,0x07,0x05,0x02,0x13,0x08,0xe0,0x1b,0xba,0x24,0xd8,0x17,0xfc,0xfb,0x1f,0x1b,0xef,0x2b,0xfb,0xea,0x04,0xe5,0x24,0x21,0x20,0xf8,0x03,0xb3,0x25,0xda,0xd7,0xd8,0xdf,0x1c,0xe4,0xde,0xd1,0xd7,0x35,0xdc,0xed,0x7f,0x57,0xf1,0x4d,0xe5,0xe2,0x9b,0xfd,0x22,0xf0,0xd8,0xd4,0x26,0x59,0x13,0xf5,0xbc,0xcf,0x06,0x16,0xdd,0x31,0x40,0xd4,0xf0,0x3e,0x20,0xf0,0x2c,0xee,0x26,0xbc,0xc4,0xf5,0x0b,0xd5,0xcf,0x86,0x00,0xc7,0xe4,0x0c,0x0a,0x0f,0x45,0x5b,0x44,0xe6,0xf3,0x27,0xf6,0x3a,0xb4,0xbb,0xd2,0x03,0xdb,0x4e,0xba,0x20,0x15,0x00,0xf2,0x14,0x23,0x16,0x1f,0x50,0x7d,0xfd,0x72,0xdf,0x16,0x1c,0x22,0xb0,0x64,0xd4,0xf0,0xce,0xc4,0xcd,0xab,0xf0,0xe0,0x36,0xfc,0xee,0xcd,0xda,0xec,0xd3,0x42,0x3f,0xf8,0x5f,0xd7,0xd9,0xed,0xd8,0xbf,0xbb,0xcc,0xcd,0xf2,0x9c,0xb8,0x59,0x08,0xd2,0xf5,0x3c,0xd7,0x96,0xe1,0x3c,0x11,0x0f,0xfe,0x1b,0x07,0x08,0x26,0xee,0x7f,0xd4,0xf4,0x74,0x63,0x12,0x14,0xfd,0xf9,0x22,0x39,0x42,0x4f,0xb2,0xe0,0xf8,0x1a,0xca,0xd9,0xef,0x53,0xe7,0x09,0x52,0x00,0xeb,0xf3,0x23,0xf5,0xdb,0x05,0x03,0x23,0xe4,0xd0,0xfc,0x1e,0x68,0xd5,0x39,0x18,0xe0,0x0d,0xfa,0x19,0x23,0xc5,0x28,0x46,0x08,0x4a,0xd6,0x16,0x15,0x16,0x01,0xd6,0x07,0x41,0xd0,0xe6,0xaa,0xfe,0xfc,0x22,0xf9,0xad,0xfe,0xf9,0xcf,0xdc,0x17,0xec,0xe1,0xdf,0xf5,0xa5,0x00,0x40,0x30,0xe9,0xf1,0xd0,0x0d,0x1b,0x03,0xce,0x21,0xc0,0xdd,0xf8,0x02,0xcf,0x03,0x3f,0xd6,0xe7,0xd5,0xdd,0x25,0x20,0xdc,0x1e,0x7f,0xd1,0xdc,0x3b,0x0b,0x10,0xe1,0x1b,0xda,0xe2,0xf7,0xe3,0x35,0x0b,0x43,0x7c,0x0f,0x2a,0x12,0x21,0xf2,0x31,0xe2,0xba,0xfb,0xf1,0x1a,0xfc,0x55,0xf5,0x34,0xf9,0x4d,0xf6,0x13,0x9d,0xf5,0x00,0xed,0xfa,0x30,0x37,0xc6,0x0b,0xed,0xfa,0xa9,0xc8,0x03,0x1b,0x3e,0x0a,0x3a,0x29,0xdf,0x70,0x51,0x36,0xe5,0xb4,0xcc,0x00,0x2f,0xfa,0x18,0x08,0xd2,0xf8,0xb6,0x42,0xec,0x2a,0xde,0x35,0x08,0xcd,0x12,0x38,0xcb,0x19,0x10,0xe0,0xff,0x20,0x10,0xb4,0xea,0x0d,0xbf,0xd1,0x09,0x30,0xf8,0x36,0x23,0xa9,0x66,0xd3,0x1a,0xd6,0x9b,0x0d,0x44,0xbc,0x3b,0xcd,0xd6,0x47,0x45,0xd2,0x20,0x1a,0xd8,0xf9,0x10,0x31,0x5d,0xcd,0x0d,0x43,0x3d,0x08,0xe3,0x2e,0x17,0xdf,0x7b,0x1d,0x23,0xf0,0xe4,0xfa,0x42,0xe3,0x19,0xd3,0x16,0xe5,0x84,0x00,0xe1,0x0c,0x35,0x2a,0x51,0x36,0xdd,0xdb,0x78,0x45,0xf8,0x2f,0xef,0xb9,0xbc,0xda,0xe3,0x0c,0x28,0x25,0x83,0xdc,0xbb,0x2f,0xc2,0xd2,0xda,0xfe,0xf6,0xb9,0xe5,0xb0,0xdf,0x3b,0xdf,0x18,0xd5,0xde,0x19,0xca,0x3b,0x0f,0xc2,0x14,0x08,0xed,0xd1,0x06,0x15,0x08,0xfc,0x81,0x05,0xf8,0x01,0xd5,0x89,0x4e,0x0e,0xbe,0x39,0xaa,0x0b,0xd8,0x0d,0x00,0x27,0xc2,0x19,0xcf,0xd7,0xb5,0x4b,0xfd,0xf9,0x4b,0x4a,0x47,0xf9,0x23,0x1d,0xf4,0xd0,0x32,0x1a,0xb5,0x1e,0xe9,0x17,0xcd,0x32,0xfa,0x08,0x18,0x11,0xc9,0x3f,0xfb,0x01,0xec,0x01,0xfd,0xe0,0x07,0x24,0x20,0x2d,0x7f,0xfb,0xba,0xcb,0x02,0x1f,0x21,0xf8,0x07,0xe9,0xe6,0x4e,0xbe,0x12,0xdc,0xd1,0xe3,0x0f,0xe4,0x18,0xd8,0xea,0xef,0x01,0xf3,0x00,0x04,0xd9,0xe2,0xc9,0x02,0xff,0x54,0xee,0xfe,0xf9,0x0e,0xd4,0x36,0x0f,0xcc,0xff,0xe2,0xdf,0x6c,0x61,0xd3,0x2f,0x2f,0x15,0x14,0xe3,0x2f,0x9f,0xea,0x1f,0xcc,0x1d,0xff,0xc7,0xeb,0x2e,0x41,0xdd,0xe2,0x09,0xcf,0x09,0xc2,0x22,0xe0,0xe4,0xd8,0xf7,0xa2,0x29,0x08,0x07,0x2c,0x1e,0xcd,0x16,0x1d,0x05,0x40,0xef,0xc5,0x73,0x4b,0x8f,0x20,0xd0,0x1b,0x44,0x43,0xf1,0x92,0xf6,0xcc,0xc3,0xc1,0xae,0x2c,0x05,0x01,0x36,0xc0,0xb1,0xa1,0xd7,0xd1,0xd3,0xc5,0xf1,0x22,0xe5,0xf3,0xb7,0x55,0x15,0x0f,0xe0,0x19,0x20,0x1e,0x87,0x08,0x10,0x19,0xd6,0xf9,0xb9,0x93,0x27,0x9d,0xee,0x10,0xac,0xf1,0x07,0x31,0xe1,0x0d,0xbe,0x44,0x08,0xee,0xf0,0x0e,0x20,0x35,0xfb,0xea,0x15,0x03,0x19,0x5e,0xd8,0xcf,0xef,0xf0,0x9d,0x40,0x5d,0xbc,0x5c,0x24,0xee,0xf3,0x24,0xc8,0x52,0xc1,0x0c,0x7f,0x1b,0xab,0x22,0x04,0x06,0x11,0x00,0x0e,0x3f,0x14,0xd9,0xbd,0x15,0x31,0x37,0xef,0x1f,0x08,0xed,0x1e,0xef,0x36,0xd4,0xe3,0x9d,0x18,0xec,0xb3,0x13,0xc6,0xf3,0x0b,0x0f,0x16,0xeb,0x2d,0xd1,0xe4,0x42,0x50,0xf8,0x35,0x01,0x14,0x1c,0x7f,0x53,0x0b,0x26,0xee,0xf9,0xb5,0xee,0xe3,0xf3,0x25,0x3e,0xec,0xfd,0x45,0x13,0xf8,0x10,0xff,0xdf,0xe5,0xf5,0x24,0x0f,0x87,0x56,0xcb,0xec,0xe2,0xe2,0xf0,0xfe,0xf5,0xa7,0x39,0x02,0x07,0xf3,0xdc,0xd8,0xc6,0x0e,0xf5,0xea,0x3e,0xb0,0x0e,0x3f,0x3d,0xf5,0xdc,0x0b,0xd1,0x44,0x17,0xff,0xf6,0xaf,0xe2,0x0f,0xe2,0x1f,0xc5,0xff,0xc6,0xc7,0x02,0xc0,0xde,0xfe,0xea,0x13,0xf3,0xfb,0xaa,0xd2,0x0b,0xf6,0xf1,0xdd,0x17,0x9f,0x01,0x02,0xfb,0xd6,0xd1,0x09,0x36,0xff,0xff,0x28,0xda,0xb2,0xe2,0x1b,0x4f,0xfd,0x04,0x03,0x32,0x34,0x39,0xf0,0x18,0xc2,0xed,0x13,0xdf,0x07,0xfb,0xc0,0xe2,0x0f,0xd9,0x1a,0xe2,0x13,0x1f,0x07,0x0a,0xd5,0xcd,0x09,0xf3,0x0b,0x17,0xf8,0x11,0x01,0x0a,0x1c,0xf1,0x03,0xfa,0x1b,0x11,0xce,0x12,0x18,0x32,0xab,0x13,0x5a,0x02,0x07,0x1d,0x0e,0xd2,0xe8,0xce,0xea,0xd6,0x0b,0xf7,0x11,0x81,0xc7,0xd8,0xf8,0x10,0xbc,0x52,0x32,0x0d,0x4a,0xd4,0xcc,0xf2,0x4a,0xc6,0xe4,0x00,0xa0,0x1f,0x00,0xfc,0x0b,0x3f,0x05,0x1f,0xf9,0xf4,0x15,0xd6,0x2c,0x3d,0x1d,0x26,0xd8,0x05,0x27,0xf8,0x0e,0x0a,0xdf,0x44,0x0d,0xc9,0x18,0xe3,0x2f,0xe4,0xd1,0x8e,0x50,0x1d,0x07,0x18,0x07,0x0e,0xf7,0x2e,0x12,0x05,0x21,0xf7,0xfc,0x51,0x1e,0x2c,0xfa,0xf0,0x0e,0xfe,0x2e,0xf2,0xc7,0xcc,0xff,0xd7,0xe6,0x03,0xfe,0xcc,0xbf,0xf0,0xf0,0xde,0xdb,0x0d,0xd7,0x0f,0xcc,0x0b,0x1f,0x02,0xea,0x0e,0xd1,0xe7,0x00,0x11,0xfa,0xee,0x75,0x2b,0x5e,0x23,0xa7,0xfc,0x25,0x2f,0xdc,0x56,0x0a,0xe3,0x0f,0xc6,0x16,0xf4,0xe7,0x19,0x29,0x08,0x4b,0x3c,0xa9,0x1b,0x25,0xe0,0xa9,0x65,0x3a,0xb9,0xad,0x32,0x46,0x10,0xd9,0x1f,0xed,0xd3,0xec,0x08,0x0d,0x05,0xd3,0x32,0xc7,0x18,0xdb,0x81,0xfe,0x28,0x39,0x13,0xdd,0x0d,0xbe,0xcb,0xc5,0xf1,0xfd,0x04,0xcd,0xe4,0xc1,0x09,0xcc,0xb0,0x1a,0x23,0x1b,0xe2,0x2d,0x0a,0xc5,0x13,0xcf,0x0c,0x19,0x1d,0x16,0x1f,0xe6,0xb6,0xdb,0xca,0xe7,0xf2,0xff,0xe2,0x48,0xe4,0x17,0xf9,0x12,0x1a,0x42,0x08,0x50,0x2a,0xc0,0xe7,0x63,0xe9,0xd1,0xe9,0xca,0xdb,0xec,0xf8,0x11,0x01,0xb8,0x34,0x3d,0x1c,0xe1,0xf8,0x41,0xda,0xf8,0x81,0xd8,0x0a,0xf5,0x34,0x64,0xfb,0x08,0xa9,0xfe,0x52,0xfe,0xf7,0x0b,0x03,0xea,0x02,0x3f,0xe7,0x3f,0x0f,0x09,0x67,0x4c,0xcf,0x19,0xfd,0xe0,0x18,0x32,0x3b,0x3b,0xc8,0xbc,0x0e,0x60,0x22,0xe6,0x51,0xf0,0x1f,0xba,0x59,0xdf,0xa9,0x0e,0xe7,0x9b,0xc6,0x32,0xc5,0xa8,0xde,0xf4,0x59,0x00,0x94,0x2c,0x36,0xee,0x7e,0x14,0xf5,0xc7,0xb8,0x52,0xdf,0xc9,0x09,0x51,0x57,0x0e,0x48,0xe6,0xda,0xdb,0xb2,0x09,0x0d,0x15,0x4e,0x06,0x1b,0x1b,0x8f,0xd7,0x72,0x31,0xc7,0x3b,0x50,0x2a,0xf0,0xd1,0x69,0xeb,0x19,0x5b,0x11,0xe8,0xf4,0xf0,0x0b,0x64,0xda,0xb9,0xf9,0xee,0xdf,0xfb,0x74,0x0b,0xfc,0x9f,0x10,0x26,0x4c,0x9e,0x44,0x3e,0x05,0xcb,0xde,0xa1,0x91,0x40,0xfe,0x33,0xf8,0x81,0xa9,0x2b,0xb7,0xa0,0x32,0x44,0xd1,0x60,0xf1,0x2c,0xd0,0x6f,0x6e,0xc9,0x07,0x04,0xa9,0x53,0xc6,0xde,0xc5,0xf3,0xbf,0x6c,0x4d,0x0e,0xca,0x17,0x05,0x31,0x60,0xff,0x05,0xbf,0xe0,0xf7,0x0b,0xc4,0xb0,0x24,0xc1,0xf0,0xf8,0x2e,0xe7,0xff,0x39,0xae,0x12,0x4b,0x2e,0xec,0x13,0x2c,0x1d,0x20,0x65,0x51,0x11,0x53,0xd8,0x0e,0xff,0x0f,0xe0,0x10,0x39,0x21,0xce,0xf3,0x07,0xf4,0x19,0x12,0x14,0x06,0xe7,0x01,0x00,0xfc,0x8f,0x25,0xbc,0xf9,0xc5,0xde,0x23,0x20,0xfd,0xc0,0x44,0x3b,0x0c,0xf6,0x07,0xb9,0xc9,0x07,0xcd,0x06,0x04,0xa0,0x18,0x16,0x35,0x08,0x0c,0xe8,0xd4,0x50,0xed,0x03,0xf9,0xbf,0x90,0x28,0xeb,0xc8,0xc0,0xdc,0x12,0xa0,0x7f,0xc1,0xe6,0x32,0x02,0x1d,0x25,0x0a,0xdd,0x23,0x33,0xca,0x51,0xe8,0xf3,0xc0,0x31,0x14,0xe8,0xcf,0xb8,0x09,0xd7,0x24,0xe3,0x17,0xde,0x0b,0xf1,0x2c,0xe4,0x16,0xb2,0x29,0x38,0x2f,0xfb,0xf3,0x4d,0xf5,0xcc,0xfd,0x04,0x4f,0xf7,0x29,0x13,0x1a,0xf4,0xf0,0xd8,0x2b,0xee,0xb8,0xff,0xf3,0xd8,0xf4,0x52,0x3d,0x95,0x9f,0x19,0x43,0x0e,0xff,0x4a,0x19,0xdd,0xe1,0x27,0x95,0x2d,0x09,0xfb,0x00,0xd9,0xcd,0x2e,0xf8,0xcd,0xdf,0xdd,0x11,0x2a,0x92,0x81,0x08,0x29,0x0e,0xf0,0x2c,0x2a,0xe7,0x07,0x14,0x0c,0x05,0x38,0x01,0xfa,0xc5,0x09,0xfd,0xd3,0x17,0x9f,0xb3,0x31,0xc9,0x3e,0xb8,0xf0,0xf4,0xf2,0x14,0xf3,0x5e,0xf4,0x20,0x13,0x13,0x09,0xbd,0xfa,0x0c,0xe5,0xdf,0x2f,0xf9,0x0b,0xb0,0xb9,0xeb,0xda,0x54,0xff,0x2b,0xf5,0xeb,0x2f,0xf3,0x23,0x00,0xfb,0xed,0x1c,0x3d,0xde,0x1b,0xf4,0xa3,0xb0,0x08,0xeb,0x11,0xd2,0xef,0xa2,0xaa,0x0d,0xb7,0x0d,0xf4,0x2d,0xf7,0x24,0xcc,0xf8,0xbf,0x35,0x25,0xdb,0x08,0xe8,0x16,0xd2,0x03,0x1b,0x19,0xea,0xd4,0x4c,0xd7,0x26,0x0e,0x75,0x03,0xeb,0xc8,0x02,0x1d,0xae,0xfb,0x15,0xf1,0xf8,0x3d,0x34,0x15,0x37,0xf5,0x21,0x51,0xf1,0xed,0xde,0xe8,0x19,0xfa,0x27,0xd8,0x0c,0xc6,0x1c,0x0e,0x19,0xb9,0xf1,0x1e,0x48,0xff,0x17,0x53,0x81,0x13,0x1b,0xda,0xf8,0x19,0xd8,0x28,0x35,0xf6,0xe1,0x11,0xeb,0xfc,0xda,0x3b,0xf6,0x02,0x26,0xf7,0x22,0x3b,0x3e,0x4c,0x2f,0x1d,0xed,0xf7,0xfa,0xec,0xf8,0xe7,0xa5,0x0c,0x01,0xff,0x1f,0x1d,0x51,0xe8,0xd2,0xe3,0xd2,0xf8,0x0c,0xd5,0x09,0xc3,0x1e,0xf9,0x48,0x0a,0xe1,0xd6,0x07,0x19,0xf1,0x1b,0xc0,0xe0,0x09,0xd7,0xdb,0xf0,0xdf,0x35,0xdf,0x00,0xe1,0x13,0x07,0xe3,0x1e,0x81,0xe2,0x02,0x30,0x0d,0x13,0x07,0xea,0x31,0x00,0xfd,0x1d,0xec,0xf5,0xdd,0x21,0x42,0xc3,0x36,0x06,0xef,0x1d,0x2f,0x5a,0x0c,0x18,0xef,0x03,0xfd,0x2e,0xfd,0xea,0xf7,0x08,0xfd,0xf1,0xd4,0x5b,0x03,0xe2,0xdb,0xf2,0x22,0x06,0xaa,0xe4,0xee,0xf5,0xc8,0xea,0x3b,0x1d,0xda,0xb8,0xcf,0x28,0x37,0xed,0x01,0xc7,0x20,0xd1,0xf3,0xf4,0xff,0xbf,0xf6,0x49,0x16,0x52,0xfe,0x13,0x06,0x01,0xe4,0xf5,0x17,0x05,0x22,0xda,0x31,0x02,0x35,0x0b,0xc7,0xea,0x2a,0xad,0xca,0x25,0x1c,0x15,0xd4,0x14,0xe6,0xf5,0xb5,0xe9,0x16,0xd2,0xfe,0xfa,0x5c,0xf9,0x0d,0xf5,0xdf,0xc9,0xef,0x2f,0xe7,0x06,0x4a,0x0a,0x10,0xf5,0x4e,0x1c,0xf2,0xc4,0x31,0x2a,0xf5,0xff,0x0a,0x2b,0x0b,0xf8,0xf5,0xc5,0xf8,0xd5,0xde,0xf3,0xfb,0x02,0xeb,0x0f,0x81,0x12,0xf3,0x29,0x0f,0xd6,0x97,0x34,0xd9,0x12,0xfa,0xfa,0x36,0xee,0x12,0x09,0x40,0x0f,0x36,0x96,0x42,0xcb,0xfb,0xd3,0xf5,0xfc,0xfe,0xb4,0x1d,0xec,0xff,0x27,0x07,0xa4,0x06,0x04,0x5c,0xf6,0x1a,0xe0,0x06,0x58,0xcf,0x2e,0x1f,0x0b,0xe9,0x21,0x15,0xfc,0x09,0xff,0xca,0x10,0x1c,0x11,0x16,0xcf,0xe1,0xc4,0xdd,0xf9,0x88,0xc4,0xfc,0xd8,0xce,0x10,0xd7,0xe9,0xfd,0x26,0x10,0xfa,0xe3,0xf0,0x1b,0x05,0xf2,0x1c,0xfd,0xff,0xc6,0x04,0xeb,0x30,0x25,0x42,0xda,0xd3,0xf4,0x2a,0x09,0xeb,0xc3,0xd2,0x30,0x10,0x0a,0x14,0xf7,0x37,0x13,0xd5,0x4e,0xee,0x08,0x1a,0xe5,0xdf,0xf2,0x03,0x86,0x29,0x05,0xd4,0x2b,0x59,0xb4,0xed,0x2a,0x15,0x3a,0x15,0xef,0x81,0x21,0x0e,0xfe,0xd3,0xee,0xcf,0x11,0x2f,0xe3,0xf2,0x08,0xc4,0xf3,0xf8,0x4e,0xfe,0xd7,0x41,0x38,0x21,0x2d,0xd1,0x3e,0xd8,0xfd,0xda,0x18,0xfc,0x13,0x06,0xfb,0x0c,0x11,0xff,0xf8,0xe2,0x00,0xc6,0x22,0xeb,0x27,0x17,0x02,0x18,0xf6,0xec,0xdf,0x44,0xfc,0x04,0x0d,0xeb,0x1c,0x2a,0x39,0xe6,0xf3,0xd4,0xe4,0xdd,0x0f,0xf8,0x09,0x45,0x16,0x21,0x10,0xdc,0xf2,0x1b,0xf6,0x14,0x28,0xe9,0x1e,0x16,0x10,0xd0,0x48,0xfb,0xef,0x3e,0x01,0x27,0xd5,0x2f,0xa9,0x04,0x0c,0xe0,0x2c,0xff,0xc1,0xee,0x6a,0xd8,0xdb,0x1b,0xf7,0xc5,0x81,0xf0,0xfe,0xe4,0x07,0x0d,0x37,0xf7,0x04,0x30,0xf3,0xbe,0xfe,0xff,0xfd,0x07,0x23,0x0f,0x16,0xfd,0x37,0x57,0x0f,0xd4,0x4b,0x09,0x1d,0x24,0x57,0xe1,0x61,0x20,0x9c,0x3b,0xcb,0x15,0x4c,0x14,0xf7,0x01,0xec,0xda,0x09,0xec,0xce,0x9a,0x0d,0xe3,0xd5,0x05,0x92,0x50,0x18,0xbe,0xfd,0xe0,0xf0,0xca,0xf8,0xe4,0x96,0xbb,0xec,0x3c,0xd6,0xda,0xa8,0xf2,0xea,0x18,0x03,0x2e,0x99,0x3f,0xd1,0x13,0xe6,0x11,0xcd,0xdf,0xe0,0x03,0x39,0xeb,0xec,0x45,0xca,0xa9,0xfb,0x66,0x03,0x08,0x31,0x17,0xb5,0xe3,0x3f,0xba,0x25,0xfd,0x4f,0xe7,0xc0,0xc4,0x4e,0x02,0xff,0xb3,0x21,0xfa,0xdb,0xdd,0xf2,0x3d,0x27,0xf0,0xa7,0xcf,0x23,0xeb,0xe9,0xbf,0xcc,0x13,0x01,0xba,0x17,0x1b,0x07,0x0d,0xf2,0xf8,0x36,0xb0,0x7f,0x46,0xf8,0xb2,0x23,0xac,0xcd,0x2e,0xf9,0xfe,0x33,0xf7,0xb1,0x0a,0xe4,0xf6,0x0a,0xd7,0xfe,0x4d,0xed,0x0a,0xe6,0x2f,0x12,0xd3,0x05,0xed,0xec,0x06,0x4a,0xfc,0xfa,0x0d,0xe9,0xdf,0x1e,0x06,0x36,0x22,0x02,0x71,0x24,0x2d,0x33,0xec,0xcc,0xfd,0xfc,0xd5,0x0e,0x05,0x31,0xd5,0xc1,0x1c,0xae,0x2f,0xf8,0xec,0x06,0xe4,0x03,0x22,0xed,0xee,0x1d,0xf4,0x06,0x1f,0x7f,0xe9,0x27,0x09,0x0d,0x3f,0xe9,0x14,0x23,0xdf,0x33,0x0c,0xd6,0xf5,0x06,0xf9,0xf7,0xe1,0x0e,0x00,0x0a,0x0a,0xc0,0xfa,0x13,0x0c,0x1b,0x0a,0x01,0x19,0x14,0x4b,0xf5,0x13,0xd6,0x13,0xf4,0x00,0xfd,0xef,0xdc,0xed,0x3b,0x07,0xee,0x0f,0x3c,0xe6,0x12,0xdf,0x1e,0xf2,0x24,0x2c,0x06,0x1a,0x36,0x2b,0xfa,0x2c,0x14,0xd1,0xef,0x6e,0xd0,0xb6,0xb5,0xf0,0x04,0xee,0x09,0xe8,0xeb,0x04,0x03,0xa4,0xc7,0x0a,0x0d,0xde,0xdc,0x0a,0x12,0x53,0xe7,0x2d,0xce,0xcc,0x00,0xea,0xf0,0x05,0x27,0x1c,0xb3,0x0c,0xef,0x2e,0x50,0x02,0xda,0xdc,0x1a,0x0b,0xd2,0x02,0xf7,0xe6,0x5e,0xe0,0x34,0xec,0x12,0xc9,0x02,0x28,0xc2,0xd9,0x05,0x10,0x35,0x10,0x46,0x0d,0x53,0xe5,0xc6,0x0b,0xb5,0x2d,0xda,0xe8,0x0a,0xf3,0x3f,0x03,0xa0,0xd5,0xd6,0xaf,0xbe,0xf8,0x1e,0x9d,0x13,0x32,0x81,0x03,0x08,0xd8,0x28,0x3e,0x13,0xfd,0xf4,0xfd,0x45,0x27,0xf5,0xcc,0xdf,0x21,0x00,0x00,0x00,0x00,0x36,0x44,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x0a,0x00,0x00,0xbf,0x22,0x27,0xba,0x4a,0x1e,0xca,0xd8,0xdd,0xee,0x26,0xc6,0xa6,0xea,0x32,0x61,0x01,0xd6,0x52,0x07,0x21,0x7f,0x09,0x36,0x8e,0x05,0x4a,0x85,0x45,0xe9,0xd5,0x7f,0x43,0x25,0x53,0x12,0xe8,0x0f,0x99,0xcd,0x79,0x44,0xe7,0x18,0xb7,0xdd,0x94,0x20,0x2e,0x2e,0x31,0xda,0xf6,0x37,0x0e,0xef,0x7f,0xfb,0xfe,0xf4,0x19,0x35,0x38,0x65,0xe2,0xd3,0x96,0x0e,0x3a,0x21,0x63,0x4c,0xf8,0x7f,0x84,0xfa,0x7e,0x1b,0xe5,0xc3,0x82,0xe0,0x20,0x3f,0xfa,0x00,0x1e,0x23,0x25,0x00,0x21,0xdc,0xe8,0xa8,0xf5,0xe1,0xfe,0x81,0xea,0x50,0xb2,0xec,0xe9,0xec,0x3a,0x52,0x01,0xfa,0xe8,0x0e,0x3c,0x8c,0xb2,0xd2,0x16,0xaa,0x32,0xff,0x27,0x50,0xe5,0x26,0xb7,0xe9,0x5c,0x2b,0xe6,0xe5,0x23,0xf8,0x06,0xf7,0x9e,0x81,0x03,0x17,0x58,0xfb,0xc1,0x16,0x1b,0x8e,0x4d,0xed,0xff,0x45,0x13,0xfb,0x7f,0xe3,0xb1,0x29,0xe9,0x21,0xaf,0x2d,0x3e,0x2c,0x24,0x4e,0x44,0x9f,0xdf,0xe1,0x15,0xe2,0x05,0xf3,0xf5,0x5d,0x19,0xe2,0xf8,0x14,0xe8,0x0f,0x7f,0xce,0xdd,0xbd,0xe0,0x11,0xb4,0xf8,0x21,0xbf,0xa5,0xe1,0x00,0xf3,0xe7,0x0b,0xb5,0x66,0xb3,0x16,0x7f,0x33,0x3d,0xc0,0x17,0xd8,0x3b,0x1f,0xec,0xde,0xeb,0x19,0xd6,0x11,0xc4,0x5e,0x02,0xe8,0x14,0xe8,0xda,0x00,0xb6,0x08,0x3e,0x0b,0x0e,0xa7,0xd2,0xec,0xfb,0xaa,0x1f,0x48,0xed,0x1c,0x81,0x23,0x2d,0x5a,0xf5,0x2a,0xf5,0xd9,0x87,0x81,0x51,0xc3,0xf7,0xd5,0x27,0xe8,0x96,0xf1,0x45,0xd9,0xcd,0x15,0xed,0x09,0x1d,0x1c,0x06,0x12,0x40,0x09,0x2c,0xc7,0x74,0x10,0x09,0x32,0xdc,0x2f,0xfe,0x81,0x3d,0xec,0x08,0x9a,0x47,0x05,0xd5,0x89,0x92,0x0a,0x12,0x5f,0xfc,0x25,0x16,0x95,0x23,0xa0,0x3c,0x04,0x0e,0xfd,0xf4,0xf9,0xf9,0x2f,0x20,0x23,0x15,0x15,0x0b,0x81,0xbd,0x3d,0x07,0xc0,0x06,0xaf,0x42,0xe0,0xa1,0x75,0xc4,0x4c,0xee,0xa7,0xd4,0x7c,0xc1,0x09,0xfd,0x4d,0xd2,0x89,0x6c,0x57,0xfc,0xe5,0x81,0x93,0xec,0x22,0x19,0x34,0x10,0xf5,0x41,0xfe,0x1a,0xc9,0x46,0xf8,0xb9,0xe6,0xe7,0xd3,0x00,0x35,0x0d,0x7f,0xf2,0xd0,0x36,0x3d,0x21,0x5c,0xce,0x78,0xdb,0x39,0x78,0x56,0xc0,0xe3,0xb2,0xe1,0xbf,0x24,0x38,0x52,0xfb,0x4a,0x23,0x7f,0x1d,0x34,0x02,0xec,0xf1,0x50,0xd7,0xcc,0xff,0x77,0x14,0xfd,0x1f,0xf8,0x18,0xda,0xd4,0x06,0x35,0xa5,0x26,0x7f,0xeb,0xfd,0xff,0xf8,0x15,0x3d,0xdc,0xf2,0xeb,0xdc,0x09,0x3f,0xff,0x6c,0xd1,0xc7,0xb8,0xc4,0xef,0x16,0x05,0x2a,0xee,0x15,0x13,0x21,0x0f,0x7f,0x22,0x16,0xe8,0xe8,0xbe,0xa3,0xd2,0x10,0x4d,0x3a,0xb2,0xd0,0x48,0x2d,0xee,0xe6,0xf8,0xfe,0x06,0x1c,0xcd,0xf2,0xdc,0x8f,0x81,0xf4,0x15,0x4d,0xc1,0xec,0xf2,0x2c,0x65,0xf9,0xed,0x25,0xe3,0xd4,0xe6,0x17,0xda,0xe3,0xfa,0xd8,0x3f,0x3d,0x7f,0xf3,0xfa,0xd9,0x43,0xc8,0x3a,0xd4,0x0d,0x48,0x3d,0xea,0x29,0x1c,0xd1,0x3c,0x15,0x08,0xf4,0xea,0x29,0x3c,0xfd,0x35,0x12,0xeb,0x81,0x1e,0x02,0x2b,0x04,0x0e,0x1a,0xf8,0xc9,0x0a,0xd2,0x04,0x22,0x13,0xef,0xe5,0xff,0x12,0xee,0xfd,0xdd,0xff,0x12,0x2c,0x81,0xee,0x10,0xf5,0xec,0x11,0xc2,0xbf,0xe0,0x81,0x32,0xf5,0x18,0xf6,0xfe,0xf6,0x13,0xfa,0xfa,0x17,0xf3,0x0b,0xfe,0xf9,0x2e,0x0a,0x11,0xd8,0xc6,0x0c,0x82,0xff,0xe4,0x36,0xcd,0xba,0xca,0x48,0xde,0x6a,0x36,0x19,0xe5,0xc8,0x3b,0xcd,0x22,0x7f,0x95,0xd7,0x18,0xe0,0x15,0x94,0xd2,0x25,0x73,0x1e,0x0e,0x2b,0xf3,0xe6,0xd8,0x1f,0x30,0xf2,0x49,0x06,0xd2,0xd7,0x0d,0x9c,0x22,0xf9,0xf9,0x26,0xba,0x81,0x1f,0xbe,0xa5,0x51,0x81,0x00,0x69,0xd4,0x75,0xdd,0x59,0x28,0x59,0x06,0xf2,0x03,0xa1,0x39,0x61,0x55,0xea,0x66,0xdb,0x23,0xca,0x7d,0x81,0xf7,0x46,0x26,0x41,0xaa,0xef,0xa2,0x07,0x19,0xf6,0xfe,0xce,0x2e,0xe6,0x0b,0xee,0x3e,0x1d,0x0f,0xdb,0x05,0xe8,0xbf,0x89,0x9a,0x6e,0x32,0x13,0xb7,0xbf,0xb3,0xe3,0x13,0x03,0xb1,0x9d,0x93,0xcf,0xf5,0x10,0xef,0xe3,0x81,0xb4,0x32,0x10,0xe1,0x0d,0xdc,0x15,0x19,0xd7,0xac,0x42,0x3f,0x22,0x21,0xdd,0x4d,0x1e,0x29,0x23,0x7f,0xec,0x17,0xfe,0x12,0x34,0xdc,0xec,0xf0,0x04,0xe4,0xcf,0x10,0x2d,0xea,0x09,0x0f,0x38,0xd0,0x08,0x3d,0x06,0x11,0xe1,0x10,0x7f,0x0b,0x30,0xeb,0xb8,0x24,0xfb,0xf2,0xf8,0x81,0x01,0x30,0x0d,0x50,0x0b,0xfe,0x62,0xdf,0x18,0x05,0x39,0xc3,0xac,0x48,0x7e,0xf3,0x24,0x28,0x14,0x4e,0xcd,0xbb,0xd0,0xcb,0x7f,0x00,0x46,0x12,0xdb,0xbe,0x3b,0x6c,0xf6,0xb5,0x9e,0xb7,0x1e,0x5c,0x1f,0x32,0x04,0x9f,0xc7,0x40,0x0e,0xf3,0xda,0xce,0xad,0xcb,0xec,0xc5,0xf8,0xc0,0xaf,0xda,0x00,0x05,0xfa,0xa4,0x3d,0x6e,0x93,0xc1,0x19,0xad,0x7f,0xa8,0x30,0xfb,0x7f,0x3e,0xb3,0x3d,0x0c,0x0a,0x37,0x37,0x4a,0x30,0xbf,0xca,0x07,0x33,0xb6,0x7d,0xb7,0x0f,0xa4,0x2b,0xfd,0xc1,0xee,0xa7,0xfc,0xaf,0x0f,0x0e,0x07,0x09,0xfc,0xf6,0x50,0x1e,0xfd,0xf5,0x10,0xde,0xbe,0xcc,0xdc,0x81,0x1f,0xa7,0xd7,0xa6,0x5a,0xf5,0x16,0xfe,0xd5,0xff,0xd5,0xc1,0x25,0xbe,0xe5,0x16,0xea,0x1c,0xec,0x41,0x58,0x3a,0x98,0xed,0x11,0x05,0xd3,0x7f,0xbb,0x63,0xdd,0x4a,0x27,0x39,0x15,0xe3,0x13,0xd1,0x46,0x45,0x4b,0xe4,0xec,0x30,0xb5,0x20,0x5e,0x77,0xbd,0x7f,0xa6,0x7e,0xdd,0xc7,0xdb,0xf5,0xbe,0xd8,0xf8,0x1d,0xcc,0x61,0xf2,0xc4,0x23,0x0f,0x34,0xbb,0x27,0x2a,0x02,0xf6,0x38,0xb6,0xf5,0x81,0x2c,0xf6,0x14,0xd9,0x1e,0x05,0xf8,0x81,0x06,0xa3,0x17,0x25,0xd0,0xea,0xbe,0x3c,0x0a,0xf4,0xd4,0x1d,0xea,0x1d,0xbd,0xd1,0xfe,0x5f,0x67,0xc6,0x67,0x7f,0x05,0xf0,0x01,0x03,0x31,0xe2,0x32,0x28,0xc0,0xfe,0x37,0xbd,0xe5,0x2e,0xc6,0xe0,0xae,0xb6,0x3a,0xe9,0x17,0x65,0xd8,0x21,0x0c,0x1d,0x0f,0xd2,0x34,0x37,0x27,0x9c,0x3f,0x7f,0x16,0xea,0x27,0xee,0x19,0x6c,0x62,0xdf,0xc9,0x34,0x9b,0x90,0x7f,0x04,0x3a,0x85,0xe7,0xc9,0x15,0x20,0xe7,0x50,0xaa,0x31,0x3d,0xfe,0x08,0x4c,0xce,0xf6,0xad,0x50,0xe3,0xee,0x24,0x25,0x26,0xab,0xb9,0xdb,0xb2,0x32,0x81,0xfb,0xdc,0x09,0x15,0x49,0x24,0xda,0x92,0xf6,0x0e,0x0e,0x09,0xf0,0x28,0xe9,0xdd,0x98,0x01,0xcc,0x07,0xd4,0xf4,0xab,0x48,0xae,0x20,0x11,0xcc,0x8e,0x04,0x37,0x69,0x24,0xd0,0x11,0x7f,0xb7,0x09,0x97,0xf2,0xc9,0x66,0xb9,0xff,0x81,0xd6,0xf2,0xf9,0x1a,0xf0,0x15,0xdf,0xa4,0xc6,0x18,0x2e,0x11,0x1b,0xeb,0xc6,0x42,0xd8,0xd6,0x0e,0xa3,0x1f,0x1d,0x16,0x35,0xf0,0x1f,0xe2,0xc2,0xd0,0xfb,0xf9,0x26,0x3e,0xff,0x81,0xd1,0xf3,0xd5,0x9c,0xf9,0xdb,0xa3,0x7f,0x08,0x37,0x17,0x07,0xa8,0xdb,0x2e,0x04,0xec,0xd2,0x1c,0xdc,0x42,0xde,0x28,0x03,0x78,0xde,0x5c,0x42,0xfa,0xed,0x17,0xd4,0x2e,0x81,0xbe,0x05,0x31,0xbe,0x02,0xf8,0xe9,0x00,0xd8,0x23,0xb3,0xff,0x14,0xf9,0xbe,0xf0,0x13,0x12,0xf1,0x08,0x3c,0x81,0xef,0x1d,0xea,0x21,0xfa,0x43,0xe1,0x20,0xe6,0xf7,0xfd,0xea,0xf7,0x01,0x15,0xbf,0xfe,0xcb,0x12,0xc4,0x07,0xb7,0x7f,0xa9,0x0b,0x11,0x2c,0x1b,0xd3,0x43,0xd3,0x1b,0x0f,0x10,0x13,0xd6,0x37,0x2e,0x0a,0x03,0x48,0xd7,0x42,0xe5,0x56,0xe3,0x08,0x0e,0x23,0x13,0x19,0x3f,0x22,0xc3,0xc8,0x45,0x1a,0xaa,0x0f,0xc4,0xb4,0xc6,0x81,0xfb,0x02,0xfb,0x5d,0x3f,0x41,0xea,0xfc,0xb3,0x0c,0x12,0x0d,0x3e,0xec,0x3c,0xc1,0x32,0x13,0xe7,0xd9,0xf3,0x54,0xb7,0xf7,0x81,0x14,0x17,0x36,0xd4,0x29,0xf0,0x8b,0x3c,0xe3,0x56,0xe8,0x12,0x29,0xcf,0x03,0x1a,0x32,0xf6,0x43,0xbd,0x0e,0x05,0x0b,0x81,0xfc,0xe8,0xc4,0xbb,0x44,0x28,0xbc,0x07,0xae,0x1e,0x23,0xef,0x54,0xe5,0x03,0x2a,0x04,0xbc,0xe8,0x10,0x59,0x29,0xf3,0x81,0xc0,0x16,0xab,0xc0,0x11,0x27,0xf1,0x21,0x08,0x03,0x93,0xfb,0xd8,0xcb,0xf4,0xfc,0x1a,0x32,0x7f,0xfd,0x10,0x14,0x15,0x6d,0x03,0x00,0x0a,0xc2,0x67,0xc7,0x23,0x17,0x9b,0x09,0x1e,0x49,0xf3,0x2a,0xe7,0x19,0xad,0x21,0x7f,0x8c,0xc1,0x5b,0xde,0x18,0x6a,0xb7,0xd2,0x21,0x09,0xe2,0x37,0xd7,0x03,0x7f,0x17,0x32,0xe0,0xff,0xd8,0x35,0x54,0x13,0x13,0xbd,0xe4,0xfe,0x15,0xd6,0x63,0xf9,0x17,0x37,0xfa,0x17,0x11,0x7f,0xe0,0xd2,0x32,0xcf,0xc8,0xfb,0x22,0xeb,0xe4,0x12,0xdf,0xf5,0xdf,0x2e,0xe6,0x15,0x18,0x27,0x16,0xf3,0x00,0xdb,0xe6,0x1d,0xdb,0x76,0xe7,0x81,0x74,0xcf,0x1b,0x1e,0x58,0x15,0xcf,0x16,0x32,0x74,0xdb,0x24,0x15,0xf0,0xac,0x19,0x34,0xbe,0x90,0xe4,0xbc,0x2f,0xe8,0x16,0x3c,0x30,0x7e,0xe9,0xfc,0x05,0xf8,0x27,0xe9,0xea,0xdc,0x18,0xee,0x16,0xa5,0x81,0xe1,0x9a,0xc3,0x02,0x21,0x57,0xff,0x4a,0xd1,0xd2,0xd4,0xb4,0xf2,0x32,0x4d,0xc5,0x5d,0x95,0x19,0xae,0x6d,0x7f,0x44,0xf6,0x20,0x73,0x0c,0xc1,0x31,0xd6,0x00,0x21,0xf4,0xff,0xe9,0xfe,0x0d,0xc8,0xfb,0x04,0x2a,0xe9,0x22,0x81,0xd0,0xda,0xfe,0xe7,0xde,0x13,0xfc,0xe9,0xf3,0xe7,0xd9,0x28,0x21,0x18,0xfe,0xea,0x34,0xf9,0x23,0xec,0xe8,0x0c,0x2a,0x81,0x9c,0xe0,0xc4,0xd5,0xd9,0xf6,0x0a,0x39,0x25,0xec,0xdc,0x25,0x4b,0x81,0xda,0x0d,0x2c,0xe6,0xea,0xc4,0x02,0xc7,0xb1,0xe9,0xe1,0xd8,0x1f,0xc7,0xcd,0xcf,0x7f,0xd7,0x08,0x21,0x27,0x1e,0xef,0x05,0xe4,0xdd,0xe4,0xde,0x37,0xcf,0xff,0xf8,0xe7,0x25,0x0c,0xe1,0x0f,0x09,0x2b,0xc5,0x37,0x92,0x44,0x7f,0x30,0x37,0xcd,0x12,0xe7,0x4b,0x7f,0xef,0x05,0xb7,0xe5,0xc1,0xfb,0x9f,0x2e,0x17,0x04,0x06,0x94,0x4c,0xe8,0xd9,0x10,0x00,0xf7,0x27,0xab,0xfa,0xb7,0x12,0xc8,0xed,0x0b,0xb7,0xd8,0xe5,0x59,0xe8,0x03,0x81,0x16,0xdb,0xfc,0xdc,0xd7,0x7d,0xbf,0xc5,0xf4,0x38,0xdb,0x65,0xea,0x2e,0xd9,0x28,0x4f,0x8d,0x81,0xcb,0x30,0xa8,0x4a,0xed,0x41,0xe8,0x05,0xea,0xc0,0xe9,0x34,0xdd,0xc4,0x1e,0xaa,0x4b,0xe5,0x1a,0x0d,0xbf,0xcd,0x32,0x2b,0xcc,0x90,0xd1,0x81,0xca,0x07,0x0d,0x29,0x13,0xc0,0xcb,0xd8,0xbd,0x83,0xcf,0x13,0xe7,0x19,0xbe,0xec,0xe4,0xdd,0x7f,0x65,0x0c,0x49,0x4e,0xe5,0x21,0x43,0x18,0x28,0x2f,0xe6,0x24,0x01,0xb6,0x2e,0x23,0x49,0x14,0xef,0x1a,0x20,0xf6,0x8b,0xd1,0xd8,0xff,0x41,0x37,0x3a,0xcd,0x2f,0xdc,0x7f,0x3b,0x33,0x79,0x38,0x0e,0x6e,0x11,0x9f,0x57,0x13,0xcc,0x0b,0xdd,0xc7,0xdc,0x2a,0x24,0x81,0x1c,0xf5,0x01,0xe2,0xa5,0xf7,0x04,0x81,0x45,0x16,0xc7,0x8d,0xd3,0x2c,0xd8,0x61,0x14,0x2e,0xd0,0x3c,0x41,0xcb,0xe3,0xff,0x39,0x9d,0xe6,0xe0,0xcd,0xb0,0x04,0x1d,0x9b,0x29,0x38,0x46,0x78,0xf6,0x37,0xa8,0x0d,0x15,0xec,0x91,0xed,0x47,0xce,0xf0,0xbf,0x33,0x2a,0x19,0x0d,0x7f,0xb5,0x00,0xea,0xd6,0x5f,0x03,0x66,0x52,0x4e,0xe8,0x26,0x53,0x4f,0x0c,0x9d,0xed,0xe4,0xeb,0xf0,0x7f,0xd2,0x19,0x17,0x1d,0x18,0xb1,0x4c,0xbe,0xd3,0x62,0x01,0x81,0xd6,0xd1,0xf8,0xd7,0xb9,0x0b,0xd7,0x23,0x19,0x1c,0xe6,0xfd,0x48,0x14,0xbe,0xce,0xb9,0x10,0x3c,0xdb,0x1b,0x16,0x2d,0xed,0x02,0xb0,0x46,0x14,0xed,0xf6,0xba,0x14,0x16,0x28,0x32,0x1d,0xbc,0xee,0xe9,0x7f,0x02,0x81,0xb0,0xfe,0x0b,0x05,0x0f,0xc0,0x5b,0x22,0xe4,0xf4,0x0a,0x49,0xd4,0xf6,0xa2,0xfb,0xd2,0x42,0xf7,0x1d,0x15,0xc4,0x18,0xf6,0x34,0xc9,0xdd,0xaa,0x02,0x17,0xb2,0xf7,0x05,0xcd,0xdf,0xed,0x1d,0x18,0x7f,0x64,0x2a,0xfd,0x1e,0xb1,0xc7,0x08,0xfa,0x1b,0x0e,0x44,0x06,0x01,0x0d,0x0f,0x22,0xd7,0x25,0x0d,0x41,0x0f,0xdb,0x47,0xcf,0xa8,0x38,0x5c,0x1c,0x7f,0x94,0x4d,0x49,0x00,0x4f,0x5e,0xd3,0x44,0xdb,0xf7,0xe8,0xf9,0x39,0x34,0x16,0x07,0x31,0x15,0xfc,0xea,0xd0,0x96,0x0b,0xc4,0x51,0x81,0xc5,0x0e,0xe6,0x81,0x24,0x3e,0xd0,0xeb,0x9b,0xd0,0x21,0xd9,0xb7,0x1a,0x1a,0xf5,0x10,0xd6,0x09,0xa7,0x3d,0xd4,0x12,0xd8,0xf9,0x1d,0xe3,0xa2,0x4d,0xd3,0xea,0x98,0xa2,0xdc,0xce,0x1c,0x2d,0x10,0x22,0x0c,0xd3,0x10,0x7f,0x13,0x25,0x32,0xe0,0xd5,0xce,0x15,0x00,0x8f,0xd4,0xe5,0x2b,0x45,0x5a,0xd9,0xd4,0xce,0xeb,0xb9,0xa8,0x81,0xf7,0xab,0xc9,0xf3,0xb2,0x70,0xa1,0x16,0xdc,0xc8,0x19,0xfa,0x2c,0xf6,0x01,0xbc,0x7c,0x40,0xbd,0xfe,0x13,0x03,0xf0,0x81,0xa1,0xd0,0xf9,0x18,0xf0,0x26,0x36,0x12,0xa4,0xe2,0x39,0x37,0xe9,0x03,0x12,0xdc,0xc9,0x47,0x47,0xc7,0x2d,0x03,0x02,0x26,0x01,0x55,0x39,0x7f,0x0e,0x14,0x14,0xbd,0x34,0xfb,0xdf,0x16,0xfc,0x04,0xe9,0xe1,0x81,0xa6,0x0a,0x54,0x16,0xcf,0x17,0x42,0x12,0x23,0x31,0x05,0x0d,0xf5,0x1c,0x37,0xa3,0x0e,0x14,0xe5,0xea,0x8f,0xc4,0xad,0xda,0x26,0x44,0xe5,0x89,0x0c,0x3c,0x65,0x4f,0x1e,0x57,0x4c,0x10,0x73,0x0e,0x81,0xe3,0xb4,0xbf,0xb4,0x3b,0x0d,0x04,0xa4,0xb5,0xce,0xfc,0xea,0xd6,0x0b,0x35,0x14,0x94,0xd2,0x7f,0xdc,0x3c,0xfe,0x17,0x26,0xb5,0x50,0x7f,0xd6,0x09,0xdb,0xad,0x42,0xd8,0x2b,0x4d,0x10,0x94,0xd9,0xfa,0x37,0x6a,0x62,0x51,0x32,0x02,0x46,0xba,0x0c,0x71,0x9c,0x28,0xf3,0x1b,0x06,0x18,0x8b,0x3c,0x2c,0xcd,0xce,0xce,0x76,0xd3,0x29,0xea,0xcf,0x0b,0x23,0x1d,0x97,0x81,0x04,0xa9,0x5f,0x8a,0xd9,0x7d,0x27,0x3d,0xd3,0x7f,0xeb,0xf6,0x02,0xd8,0xe3,0xc5,0x00,0x83,0xc8,0xc9,0x34,0xc5,0x6d,0xa6,0x20,0x48,0x00,0xe1,0x26,0x6b,0x17,0x5b,0xec,0xf4,0xca,0x1d,0x18,0xc9,0xe9,0xca,0xf4,0xc6,0x07,0x7f,0x2f,0xa1,0x17,0xea,0x18,0xd2,0x2f,0xfe,0x06,0x3f,0x07,0xec,0xe8,0xcc,0xe0,0x36,0x0b,0x00,0x27,0x22,0x1c,0xe5,0x1c,0x44,0xd7,0xb6,0x0c,0xfc,0x7f,0x0e,0xfd,0x29,0x2b,0x11,0x2e,0x2e,0x07,0x1b,0x15,0x04,0xd2,0xe1,0xcf,0xe9,0xe3,0xf9,0x81,0xce,0x1e,0x19,0xf4,0xff,0xe5,0x37,0xbc,0x2b,0x42,0xb5,0x1f,0x05,0xc6,0xed,0x00,0x29,0x10,0xeb,0xe0,0x0f,0xcd,0x05,0x81,0xd1,0xe4,0x2a,0x24,0x4d,0x0f,0x76,0xff,0x0d,0x7f,0x0d,0x24,0x0b,0xf2,0xf8,0x20,0xd4,0x20,0xef,0xe1,0xee,0xf9,0xbe,0x1b,0xf5,0x1f,0xeb,0xe9,0xdc,0xfe,0x1a,0x1c,0xce,0x0d,0xe1,0xef,0x3e,0xf5,0xf5,0x9a,0xf3,0xca,0xf9,0x47,0xb2,0x0e,0x2a,0xdd,0xf0,0x4a,0x01,0x59,0x35,0x7f,0xc9,0x0a,0x05,0xe1,0x0b,0x22,0xed,0x34,0x1f,0xd9,0x12,0x1a,0xfa,0xb7,0xed,0x37,0x19,0xf9,0x98,0x0d,0xe4,0x7f,0x19,0x16,0xe2,0x93,0xe6,0xde,0x01,0x81,0x08,0x4a,0x0c,0x06,0xee,0x34,0xcd,0x50,0x0d,0x4c,0x1d,0xd9,0x28,0xd6,0x15,0x13,0xc8,0x4b,0x11,0x19,0x5b,0x08,0x4c,0xee,0xec,0x0b,0x20,0x4c,0x1b,0xbf,0x39,0xf5,0x29,0x29,0x0d,0xf4,0x12,0x1e,0xee,0xd6,0xd8,0x81,0x81,0x2d,0x97,0x2a,0xfa,0xc1,0xcd,0x64,0xb9,0xfa,0x3e,0xed,0xb3,0x24,0xf8,0x59,0x5f,0xfb,0xf0,0x11,0xd2,0xc8,0xf8,0x14,0x3d,0x99,0x50,0xdc,0xc3,0x03,0xf2,0xd9,0x7f,0x26,0x28,0xe2,0xf6,0x03,0xe3,0xbd,0xea,0xa1,0xa0,0xd3,0xf8,0xf4,0xe1,0x97,0x81,0x06,0xb7,0xc8,0x13,0xdb,0x05,0x05,0xd6,0x10,0x4d,0xac,0xe5,0xa7,0x11,0x39,0x65,0x13,0xbe,0x2b,0x01,0xd8,0x99,0x9e,0xed,0xbb,0x09,0x1b,0x6e,0x86,0xff,0x0d,0xa1,0x41,0xc8,0xfe,0xe5,0x7f,0x00,0x17,0x2e,0xc0,0x9f,0xf2,0x00,0xb3,0x3b,0xc5,0x05,0x32,0x4e,0xda,0xbe,0x1f,0xd8,0xc7,0x28,0xe1,0x23,0xca,0xe7,0x88,0xfc,0xc4,0x1f,0x24,0x37,0xfd,0x03,0xe6,0xb2,0x81,0xef,0x7f,0x19,0x1d,0x33,0xce,0x01,0x24,0xf5,0x64,0xf3,0xb7,0xee,0x79,0x02,0x11,0xf3,0x12,0x53,0x40,0xff,0xf1,0x8e,0xfe,0x6a,0x2e,0x7f,0x05,0x01,0xda,0xbb,0xfa,0xd6,0xdf,0xd6,0x45,0x1c,0x36,0xd6,0x06,0x33,0xf3,0x86,0xb8,0xc0,0xe9,0xff,0x37,0x95,0x1a,0x3f,0x07,0xf9,0xf4,0xee,0x05,0xa5,0xf5,0x5d,0x97,0xb6,0x27,0x17,0x7f,0x53,0xe6,0x71,0x21,0x28,0x10,0x16,0x28,0x81,0xf1,0xa1,0xc5,0x7d,0x1a,0x06,0x0f,0x39,0x10,0x0a,0x07,0xda,0x01,0x05,0x48,0xc9,0xc5,0xac,0x2a,0x27,0xfc,0x0f,0x23,0x34,0xd6,0xec,0x11,0x0e,0x0a,0xf3,0x08,0xf6,0x07,0x16,0x06,0xdd,0x37,0x2d,0x7f,0x2a,0x4a,0xa7,0xe2,0x20,0xc7,0x3a,0xea,0x11,0x50,0xaf,0xe9,0xfe,0x7f,0x07,0xb5,0x40,0xc1,0x25,0x18,0x18,0xe3,0xcc,0xb7,0x1d,0xc5,0x07,0x1a,0xe2,0x07,0x24,0x61,0x00,0x00,0x00,0x00,0xc6,0x4e,0xff,0xff,0x04,0x00,0x00,0x00,0x40,0x0e,0x00,0x00,0xf8,0x25,0xfd,0xda,0xe4,0xfd,0x23,0x0e,0xfd,0xf5,0xc2,0xd6,0x42,0x29,0xf4,0x18,0x00,0xc0,0x6e,0xf4,0xe7,0x07,0xf9,0xc6,0x27,0xef,0x15,0xb3,0xbc,0x21,0x0a,0x36,0x85,0x03,0xc0,0xf3,0x10,0x40,0xc4,0xc9,0xd2,0x4e,0xdd,0xf5,0xb7,0xe9,0x65,0xfa,0xfd,0x1c,0x43,0x21,0x03,0xe6,0x00,0x09,0x48,0x3d,0xf6,0xf5,0x16,0x0f,0x03,0x08,0x18,0xd8,0xd0,0x9a,0xf3,0x56,0x09,0xde,0x5d,0x48,0x1f,0xd7,0x39,0x2c,0x11,0x16,0xf6,0xd9,0xfd,0xdf,0xbc,0xfa,0x88,0xf7,0x14,0xd3,0xde,0x0e,0x64,0xe5,0xe4,0xe9,0xec,0x17,0x0f,0xfe,0x7f,0x1c,0xdd,0xff,0x1d,0xa8,0xcb,0x03,0x36,0xed,0xf3,0x06,0xfa,0xf7,0xdd,0x77,0x2e,0xf0,0x3e,0x63,0x1a,0x49,0xe0,0x1f,0x20,0xfa,0xf7,0xf5,0xfb,0xe6,0xe5,0xee,0x0e,0xd5,0xc8,0xca,0xec,0x16,0xf5,0xe9,0xd2,0xf5,0x2b,0x50,0xbf,0x9e,0xda,0x08,0xec,0xf8,0x9f,0x02,0x0c,0x1c,0x0a,0x64,0x18,0xfb,0xef,0xec,0xf0,0x00,0x27,0x09,0x19,0x24,0x02,0x9a,0x1a,0x56,0xae,0x50,0x27,0x00,0x03,0x35,0x2c,0x10,0x29,0x40,0xf4,0xea,0xdc,0x19,0xeb,0xf9,0xdf,0xdd,0x18,0xf4,0x0d,0x66,0xd9,0x16,0xec,0x21,0x15,0xfc,0xee,0x32,0x05,0xdc,0x2f,0x15,0xf8,0x1a,0x09,0xf4,0xe4,0x08,0x13,0x0b,0x17,0xf7,0x40,0x28,0xda,0x74,0x0a,0x1b,0x05,0x1f,0xf1,0x0b,0x0a,0x28,0x32,0x40,0x0c,0x32,0x1d,0x32,0x2b,0x2f,0xf7,0x27,0xb9,0xd4,0xeb,0xe9,0xfd,0xff,0x0c,0xe2,0x17,0x02,0x06,0xf4,0x3b,0x16,0xf5,0x12,0xc5,0x3a,0x2d,0xca,0xe8,0xe4,0x41,0xe0,0xfd,0xcf,0x28,0x00,0x06,0x7f,0xf9,0x1a,0x26,0x07,0xc7,0x2e,0xd5,0x20,0x10,0xbd,0x01,0xcf,0xeb,0x16,0x20,0xe0,0xde,0xd9,0xdb,0x0d,0x39,0x11,0xf6,0x18,0x3a,0x2a,0xfa,0x21,0xeb,0xfa,0x29,0x02,0x2f,0xf7,0xa9,0x2f,0x18,0x8e,0x0c,0x3d,0x66,0xe6,0xf7,0x00,0x4a,0xb7,0xde,0xda,0x0c,0xf6,0xff,0x19,0x0c,0x4d,0x41,0x02,0xda,0xc2,0x21,0x06,0xfb,0xff,0x27,0xbb,0x11,0xf0,0xef,0x0a,0xfe,0x55,0xb5,0xdf,0xa0,0x21,0x1f,0x15,0xf9,0x13,0xd8,0x00,0x81,0xfd,0x0c,0xae,0x12,0xf0,0xc2,0x05,0xbd,0x5a,0x08,0xf0,0xc9,0x1a,0x31,0xff,0xe5,0xf7,0x22,0x91,0x43,0xe3,0xda,0xa9,0xdd,0xc5,0x1c,0x7c,0xda,0xca,0x3d,0xfc,0xf7,0x29,0xe8,0x3a,0x2d,0xea,0x06,0xbd,0x39,0x36,0x4f,0xfe,0xcc,0xea,0x34,0xbb,0xd7,0xe5,0xf3,0x0b,0x01,0xf3,0xd4,0x14,0x20,0x1e,0x0c,0x9a,0xa2,0xb5,0xd5,0x16,0xde,0x39,0x00,0x0f,0xf2,0x07,0xd5,0x9a,0xd9,0xb9,0x00,0xe5,0xf1,0x0a,0xcc,0xef,0xd1,0x3f,0x16,0xfc,0xd4,0xf5,0xf6,0x0f,0xe6,0xd0,0xf7,0xe2,0x13,0xe7,0x0c,0xb6,0xd5,0xbe,0xfe,0xfa,0x0d,0x08,0xf5,0xfe,0x15,0xb8,0xe9,0x24,0x32,0x3b,0xcb,0x70,0x0d,0xf4,0x1b,0xed,0x14,0x0b,0x35,0xbf,0x43,0x12,0x06,0xfc,0xde,0x14,0xff,0xe7,0x22,0x2c,0xde,0xf3,0xfa,0x0d,0x7a,0x14,0x42,0xfb,0x1e,0x10,0xec,0x22,0xde,0xe7,0x2e,0xfd,0xb6,0xec,0x33,0x04,0xbd,0xfc,0x05,0x4c,0xcf,0xfd,0xcc,0xcb,0x19,0xe2,0x1c,0xb7,0xee,0xfc,0xfe,0x11,0x07,0x16,0xf7,0xf5,0x58,0x02,0xcb,0x1d,0x50,0x3c,0x22,0xf7,0x1b,0x18,0x13,0x07,0x38,0x2c,0x15,0x3c,0xf0,0x37,0xf6,0x3c,0x49,0x33,0x35,0x10,0xc9,0x06,0x28,0xf7,0xd0,0x3c,0x22,0xef,0x0d,0x22,0xed,0xf8,0x31,0xe7,0x14,0xda,0xda,0x01,0x1a,0x28,0x09,0x06,0x9f,0x1a,0x08,0x26,0x1a,0xf9,0x2f,0xeb,0x1a,0x7f,0xd9,0xe5,0xce,0xe1,0xea,0x1c,0x25,0xfd,0x0a,0x12,0x0e,0xcb,0xa6,0x47,0xe1,0xf1,0x5b,0x1a,0xfd,0x56,0xd7,0x2c,0x04,0xfa,0xff,0x19,0x42,0xdd,0x00,0x39,0x13,0xfc,0xe2,0x2e,0xc0,0x17,0xbc,0xf0,0x3b,0x22,0x18,0x21,0x10,0x1b,0x04,0x83,0xe4,0xf6,0x06,0xee,0xfb,0x02,0x4e,0xd8,0xeb,0xd0,0x10,0x07,0x09,0xed,0xc8,0xee,0x35,0xcf,0xfe,0xbf,0x21,0xe9,0x2f,0x2f,0x21,0x46,0x60,0x0e,0x90,0x34,0xe4,0x5b,0x55,0x0c,0x1c,0xfb,0x02,0xf8,0xc8,0xd5,0xc9,0xeb,0xda,0xed,0xf5,0xc2,0x0c,0x07,0xc6,0x06,0xc4,0x06,0x41,0xb5,0xcb,0x3a,0x00,0xe9,0x2c,0x31,0xef,0xe8,0xfb,0xd6,0x5d,0x02,0xf2,0x2e,0x14,0xfd,0xb0,0x56,0xaf,0xb1,0x46,0x45,0xf9,0x28,0x1e,0xcb,0x2e,0xfa,0xfd,0xd5,0x1d,0xef,0x2a,0x0b,0x5e,0x16,0xd6,0xe5,0xfa,0xec,0xda,0x0a,0xea,0xd9,0x40,0x81,0xf4,0x02,0xc2,0x2f,0x1c,0xd0,0x00,0x17,0x2c,0x0e,0x1b,0xa9,0xf3,0xe2,0xeb,0x0d,0xf4,0xf8,0xbc,0x15,0x00,0x39,0xd7,0xe3,0x3c,0xec,0x20,0x46,0x64,0xbe,0xfb,0xfc,0x1b,0x15,0x25,0x13,0xf5,0xbf,0xf3,0x23,0x05,0x06,0x36,0x28,0x17,0x3c,0x10,0x07,0xeb,0xb3,0xd2,0xf1,0xd3,0xf5,0x0c,0xd6,0x20,0xed,0x1f,0x07,0xf2,0x11,0x07,0x07,0x08,0xc7,0xdd,0xa4,0xc0,0x07,0xeb,0x18,0x18,0x20,0x54,0xbc,0xd8,0x1e,0xf0,0xf6,0xe2,0xf5,0xcb,0x45,0x81,0x58,0x26,0xd6,0x07,0x19,0x06,0xe5,0x21,0xf7,0xf2,0xf3,0x4e,0xfb,0x28,0x15,0x99,0x02,0x3d,0x2a,0xf4,0xef,0xc9,0xf6,0xeb,0x24,0xdd,0xf0,0xd4,0x03,0x25,0xed,0xfc,0xfd,0x04,0x36,0xc8,0xdc,0xe6,0x29,0xda,0x05,0xe9,0x29,0xd6,0x15,0xdb,0x12,0x25,0xe5,0x12,0xf3,0xf8,0x26,0x19,0x13,0x03,0x0f,0xf4,0xfd,0xd8,0xea,0xe7,0xe3,0x05,0xea,0x47,0xde,0x2d,0x06,0x2c,0xcd,0x1b,0xb9,0xf5,0xe9,0xf6,0xfd,0x18,0x0d,0xe9,0xf8,0x15,0xf0,0xbe,0x13,0xec,0xf3,0xf8,0xef,0xe7,0xe8,0xd7,0x15,0xd0,0x43,0x25,0x19,0xe9,0xf7,0x0d,0x05,0x18,0xea,0x1a,0xf9,0xde,0xfe,0xde,0x2b,0x0a,0xe6,0xe8,0x2a,0xef,0xfe,0xd0,0xd2,0xdc,0x15,0x21,0x04,0x1d,0x40,0xe0,0x09,0x00,0xde,0x3b,0x00,0xbd,0x04,0x01,0xdd,0xd7,0x05,0xe6,0xe4,0xdd,0xe2,0xf6,0x05,0x2b,0xc3,0x28,0xfd,0xff,0x1c,0xe1,0x29,0x29,0x02,0xf7,0x58,0x92,0x04,0x28,0xd4,0x30,0x03,0xe9,0x01,0x33,0x3e,0x32,0x04,0x00,0xd2,0xcb,0xf4,0x34,0xf4,0x02,0xdb,0x10,0xd2,0xf2,0xed,0xf5,0x51,0x39,0xff,0xe5,0xff,0xd3,0xd9,0xa7,0x37,0xf9,0xd0,0x08,0xdf,0x01,0x03,0x7f,0xcb,0xe4,0x10,0x18,0x45,0xe6,0xc9,0xc8,0x2a,0xef,0x24,0xec,0xb7,0xe5,0x65,0x1f,0x44,0xb5,0x44,0x28,0xf2,0xef,0xef,0xb1,0x07,0x15,0x04,0xfd,0x39,0x09,0x0c,0x03,0xf1,0xeb,0xe2,0x50,0x3a,0xef,0x1a,0x1f,0xe3,0x33,0xf0,0xfb,0x31,0xc8,0x0b,0xdb,0x16,0xfc,0xe8,0x15,0xf6,0xe7,0xf5,0xf0,0x0e,0xf8,0x2f,0xfe,0x16,0x25,0xef,0x07,0x22,0xd8,0x32,0xf6,0x0d,0x0f,0x64,0x20,0x09,0x24,0xf4,0xd8,0x15,0xea,0x12,0xf7,0x15,0x24,0x37,0x2c,0x1b,0xef,0xf9,0x21,0xfb,0x00,0x04,0x0f,0x10,0x30,0x18,0x34,0xfe,0x06,0x0a,0x0c,0xf4,0x13,0x3d,0xf8,0xd7,0xee,0x15,0x00,0xf2,0x11,0x19,0x17,0x22,0x04,0x16,0x02,0x0e,0xf9,0xda,0xf7,0xeb,0xed,0xe8,0x2d,0xe8,0x2d,0x04,0xaa,0xd1,0x12,0xf4,0xde,0xef,0x07,0x4a,0x20,0x0a,0x03,0xc5,0xe0,0x9a,0x09,0xfe,0x07,0xfa,0x03,0xc5,0x27,0x15,0x08,0x0b,0x0f,0x24,0xbd,0xe6,0xf0,0x06,0x01,0xb9,0xc1,0xf1,0x0a,0xdd,0x19,0x18,0x05,0x01,0x6e,0xe8,0x53,0x2c,0xe7,0xfc,0x10,0xca,0xee,0xe7,0x19,0x00,0xd9,0x81,0xf4,0x24,0xf5,0x0b,0xe2,0x01,0xed,0x49,0x31,0x0e,0x30,0x1a,0x13,0x1c,0xf6,0xe4,0x03,0xe7,0xf1,0x0a,0x01,0x12,0x4f,0xf0,0xfd,0x04,0x0a,0x02,0xf7,0x07,0x0c,0x1e,0xf3,0x14,0x0d,0x20,0x26,0xfc,0x08,0xc7,0xb6,0x51,0x15,0xf7,0xe2,0xd4,0x57,0x8f,0x4d,0xee,0x28,0x2b,0xe8,0x16,0x27,0x3a,0x43,0xe0,0x30,0x03,0xff,0x06,0xf8,0x21,0xda,0x47,0x44,0xdf,0xf6,0x03,0x40,0x3f,0xfd,0xe8,0xf3,0x17,0xd0,0xd6,0x26,0xc7,0xc1,0x48,0x1a,0xc7,0xdd,0x3c,0x2d,0x3f,0x1c,0x44,0x1c,0xc6,0x3c,0x2a,0x0e,0x3a,0x52,0x02,0x09,0xff,0x01,0x0b,0x43,0xde,0xf1,0xf7,0xc2,0x55,0x0f,0x59,0xdf,0x08,0xfe,0xd7,0x43,0x09,0xc1,0x2b,0xbb,0xd2,0x0f,0xab,0xaa,0xb1,0xe0,0xdd,0xfd,0xfd,0xb7,0x19,0xee,0x2a,0xed,0x0c,0x31,0x05,0x04,0x32,0xf9,0x22,0x2a,0xdc,0x43,0xa3,0xfe,0xeb,0x8c,0xc9,0x28,0x05,0x0d,0x9e,0xd7,0x1d,0x04,0xe3,0xeb,0x08,0x7f,0xc8,0x1d,0x3d,0xfd,0x31,0x58,0x3d,0xec,0xdf,0xb6,0xca,0xdb,0xeb,0x0e,0xc7,0xe7,0xd9,0xdb,0x44,0x23,0xcb,0x62,0x23,0xe3,0x25,0xfb,0x1b,0xb4,0xcc,0x11,0xdc,0xe2,0x38,0x39,0x16,0x40,0xfa,0x24,0xe6,0x35,0xc8,0x17,0x05,0x42,0xf0,0xdf,0x0b,0x35,0x2c,0x0c,0x2a,0x4c,0xff,0xf9,0x33,0x04,0x15,0xf7,0x08,0x33,0x49,0xfb,0x22,0x2b,0x26,0xf6,0x35,0x44,0xce,0xfc,0x42,0xdd,0x1c,0xe1,0x21,0x07,0x20,0xca,0x18,0x05,0xa8,0xf5,0x0c,0x90,0xc4,0x1a,0xf1,0x03,0x2a,0xef,0x04,0xd9,0xe9,0xfe,0x24,0x22,0xdd,0xfc,0x29,0xf9,0x1b,0xf1,0xdb,0x16,0x44,0x11,0x08,0xf3,0x01,0xf2,0x16,0x15,0x27,0x0e,0xe0,0x08,0xce,0xd2,0x25,0xfd,0xe4,0xef,0x17,0x36,0xd3,0x19,0xff,0x0e,0xf1,0x1e,0xfd,0x32,0x9f,0x0f,0xf8,0x01,0x22,0x12,0xf1,0xdf,0xf7,0xf7,0xff,0x00,0xc8,0xe1,0x1d,0x1d,0xea,0xfd,0xfd,0xf7,0x36,0x3a,0x48,0xbd,0x14,0x7f,0x2c,0x00,0x35,0x0a,0xe6,0x14,0xfc,0x24,0xd6,0x34,0xe5,0xf5,0x0f,0x28,0xc9,0x22,0xcf,0xf5,0x3f,0x15,0x01,0xe3,0xed,0x2c,0x2c,0x20,0xbe,0xe9,0xe3,0x18,0x13,0xdc,0xfc,0x0a,0xca,0xd5,0x1c,0x24,0x3f,0x28,0xf4,0xdf,0x22,0xd6,0xda,0xf7,0x02,0x03,0x0d,0xef,0x10,0x37,0xee,0x15,0xd0,0x0f,0xdd,0x08,0x09,0x02,0x22,0x17,0x00,0x31,0xf1,0xe9,0xb5,0x00,0xc2,0x0a,0xbd,0x00,0xe9,0x09,0x16,0xd9,0xf8,0x3c,0xec,0xfd,0xff,0xaa,0xe1,0xf1,0xfb,0x23,0x2f,0x45,0x09,0x99,0x06,0x17,0xfa,0x05,0x0f,0xea,0x13,0xe3,0xac,0x05,0xcb,0xf7,0xfb,0x20,0x1b,0xfd,0xf2,0xd4,0xd5,0x28,0x43,0xc3,0xd7,0xe7,0x04,0xfe,0x15,0x0a,0x17,0x18,0x09,0x2a,0xef,0x06,0x1d,0x0c,0xf6,0x14,0x0a,0xcd,0x23,0x0f,0xd7,0xd8,0xe9,0xfa,0x01,0x0a,0x9c,0x0d,0xe2,0xe6,0x24,0xef,0xe4,0x03,0x3c,0xfe,0x09,0x4b,0xfb,0xb2,0xd1,0x02,0x22,0xe5,0x26,0xe1,0x18,0xd9,0x3b,0xb0,0xef,0x0f,0x26,0x81,0x49,0xf1,0x17,0x1d,0x27,0xec,0x30,0x2a,0xff,0x27,0xe8,0x03,0x08,0xf2,0x04,0xfb,0x00,0x0d,0xc9,0x03,0x29,0x22,0xe4,0xec,0xdb,0x0e,0xfe,0xfb,0xf8,0xf6,0xea,0x03,0xfc,0xff,0xf5,0x1b,0x00,0x35,0xec,0x13,0x1e,0x41,0x1d,0x39,0xfd,0x30,0x10,0xd8,0x08,0xd7,0x81,0xfa,0x42,0x0a,0xd9,0xee,0xfe,0x17,0xf4,0xe7,0x39,0xfe,0x1a,0x19,0x12,0xea,0x04,0x43,0x1b,0x00,0xf4,0xae,0xf3,0xfa,0xe3,0xdc,0xf5,0xd1,0xcd,0x1e,0xf7,0xe2,0xd3,0x32,0x98,0x2b,0x0f,0x0b,0x03,0x28,0x17,0x0a,0xe6,0x0f,0x00,0x0a,0x01,0xde,0x2c,0x27,0x3e,0x15,0x00,0xd1,0xfe,0xe1,0xed,0x20,0x2b,0x06,0xee,0xe3,0x34,0xd1,0xd8,0x09,0x19,0xa1,0x15,0x24,0x16,0x0c,0x00,0xf4,0x18,0x1e,0x3f,0xee,0xdc,0x36,0x11,0x01,0xe8,0x13,0xfb,0xf4,0xe5,0x0d,0xfe,0xd7,0x17,0xcf,0xf4,0x04,0xec,0x18,0xfe,0x1d,0x32,0x01,0xbc,0xde,0x12,0xf0,0xf9,0x28,0x0d,0x12,0xe3,0x04,0x18,0x07,0x0f,0x41,0xf4,0x45,0xe5,0x08,0xf7,0x16,0x3b,0x0f,0x0d,0xcd,0xf4,0x09,0xfc,0x3c,0xf9,0x02,0x05,0xbc,0xd5,0x13,0x01,0x01,0xf3,0x3f,0x16,0x3f,0x05,0x1e,0x50,0x03,0x27,0x22,0x3e,0xec,0xe8,0x9b,0xf7,0x0d,0x0b,0x1e,0xce,0xcd,0x3a,0xe3,0x0c,0xe7,0x07,0xe9,0x0e,0x1d,0xf8,0x1c,0x1c,0xe4,0x0f,0x2e,0x0d,0xef,0xff,0xc4,0x0f,0x15,0x0b,0x16,0x0d,0xea,0xea,0x10,0x6e,0xe5,0x26,0x05,0xbf,0x17,0x05,0xf8,0x06,0xf0,0x05,0x02,0x7f,0x60,0x1b,0x2d,0xef,0x3b,0x04,0x31,0xee,0x04,0x09,0x12,0x14,0xed,0xf0,0xfb,0x27,0x0e,0xf1,0xea,0x40,0xd8,0xd6,0x02,0xf2,0xde,0xcd,0x3d,0x14,0xf7,0x01,0xc3,0x08,0xf0,0xff,0x17,0xe8,0x24,0x08,0x15,0x0a,0x14,0xff,0xde,0x33,0x18,0x19,0x15,0x02,0xd2,0xdd,0xf2,0xf8,0xf7,0xe4,0x16,0xed,0xc6,0x1d,0xea,0xe4,0x0f,0x2e,0x15,0xfc,0x27,0x25,0x25,0xe4,0x24,0xfb,0x40,0xc6,0xf2,0xcc,0xcb,0xec,0x14,0x0b,0x0d,0x11,0xe9,0x22,0x10,0x61,0xfe,0xe6,0xf6,0xe7,0xfa,0x2e,0xec,0x0c,0x00,0xda,0xd4,0x02,0xfe,0x04,0xef,0xf2,0xac,0x12,0xb6,0xe2,0x0f,0xf3,0xe1,0xf3,0xe5,0x21,0x21,0xc4,0x22,0xed,0xff,0xfd,0xcf,0xf6,0xf3,0xb7,0x1a,0x25,0xdc,0xef,0x1f,0x0e,0x1b,0x0b,0xd6,0xf9,0xeb,0xc1,0x7f,0x12,0xf3,0xf2,0x12,0x13,0xfe,0x68,0xf8,0xf0,0xf4,0x09,0x19,0xee,0x4c,0xf8,0xe7,0x08,0xf5,0x04,0x24,0xee,0x10,0x9d,0xcd,0xfe,0x0b,0x24,0xf4,0xfc,0xeb,0xdf,0x07,0x16,0x05,0x21,0x23,0xed,0x03,0xde,0xb1,0xf3,0x19,0x07,0x14,0xd7,0xf7,0xd9,0xf1,0x02,0xff,0x17,0x13,0x10,0x25,0x09,0x0c,0xf7,0x0f,0xe4,0xda,0x13,0xef,0xf1,0x04,0xc9,0xda,0x0d,0xa2,0xf0,0xd7,0x1b,0x06,0xf4,0xc7,0xfb,0xea,0xf9,0xc4,0x0b,0x10,0x03,0x0b,0x0a,0x2e,0x0b,0x11,0x02,0xe3,0x23,0xc8,0x22,0x55,0xbb,0x12,0x01,0x43,0xa5,0x78,0x3d,0x52,0xe8,0x43,0xab,0xe0,0xeb,0x0e,0x52,0xc3,0x17,0x4f,0xfd,0xfc,0x4b,0x48,0x4a,0xe5,0x20,0x54,0x1b,0x27,0xf6,0x11,0x6f,0xee,0x3c,0x59,0xef,0x4c,0x3a,0xcb,0xf4,0x1b,0x3f,0x2e,0x46,0xba,0x50,0xf9,0xe5,0xd4,0xd8,0xbc,0x0d,0xfe,0xc6,0xca,0x4e,0x5c,0x0e,0xf1,0x1a,0xeb,0x4f,0xd3,0xf4,0x00,0x2c,0x1c,0xec,0xd5,0xeb,0x0f,0x28,0x28,0x24,0x57,0xd8,0x20,0x63,0x1f,0x36,0xee,0xca,0x21,0xd3,0xd2,0x78,0xf7,0xd1,0xe6,0x5a,0x6d,0xf9,0x16,0xee,0x41,0xf6,0x56,0x5d,0x39,0xc9,0x6e,0xdb,0xa7,0x35,0x43,0x0a,0x0b,0x18,0xf5,0xfa,0x0d,0xd7,0xc2,0x0c,0x25,0x0c,0xe4,0x18,0xe2,0x2b,0x07,0x3d,0xa9,0x00,0x2c,0x3e,0x39,0x55,0x7f,0x36,0x44,0xee,0x6a,0xc0,0x04,0xc8,0xfc,0x75,0x1a,0xe5,0xdc,0xe4,0x17,0x0e,0x08,0x04,0xea,0x18,0x20,0xbc,0x0b,0xa0,0xa6,0x91,0xfb,0xdc,0xd0,0x95,0xd1,0x11,0x12,0xf3,0xcc,0xe9,0xae,0xc3,0xf1,0xf6,0xfa,0xec,0xab,0x08,0xfb,0xfc,0x22,0xdd,0xff,0x92,0xe2,0xbb,0x98,0xd8,0x31,0xeb,0xd2,0xe2,0xf5,0x16,0xef,0xe7,0x17,0x0f,0x1b,0x2f,0xc0,0xed,0xa6,0xfe,0xcb,0x95,0xb3,0x0b,0x1c,0x20,0x0b,0xd0,0x07,0xd0,0xea,0xee,0xd1,0xa6,0x2f,0xd8,0xc2,0x07,0xff,0xd8,0x0d,0x7f,0xe4,0xc8,0xfd,0x8f,0xcd,0x24,0x4a,0x76,0x15,0xeb,0x99,0xe7,0xa6,0x18,0xc3,0xa0,0x38,0x55,0xf1,0xe8,0x01,0xfd,0xdd,0x4e,0xaa,0xd5,0xef,0xde,0x33,0x3f,0xf4,0xfa,0xc5,0x27,0xb8,0xec,0xed,0x63,0xde,0x54,0xf5,0xff,0xeb,0xd8,0x09,0x49,0xf6,0x18,0xa4,0xcc,0xff,0xe9,0x01,0xf3,0xbd,0x19,0x1f,0xe7,0xf2,0xfd,0x15,0xe2,0x31,0x23,0x39,0xed,0x95,0xbf,0x1d,0x21,0xcc,0x70,0xa4,0x23,0x34,0x12,0x61,0x87,0xdb,0x13,0xd8,0xa6,0xe5,0xe4,0xc8,0x25,0x10,0x03,0xd5,0x22,0xda,0xe9,0xe1,0x07,0xc8,0x31,0x23,0x1d,0xe2,0xe5,0xa4,0xe6,0xf3,0x00,0x02,0x15,0xfb,0xf6,0x1a,0xe7,0xb1,0xbe,0xa7,0x17,0xa5,0xd6,0xde,0xe3,0xee,0xf9,0xf9,0xdd,0x01,0xe7,0x16,0xec,0xce,0x19,0x0c,0xd8,0x13,0x25,0x1c,0x2a,0x2c,0x17,0xca,0x28,0xfc,0xce,0xe0,0xf4,0xf6,0xdd,0x2d,0xd6,0x04,0x20,0x11,0xeb,0xe0,0x4b,0x2b,0xb6,0x10,0xf6,0xc5,0x09,0x05,0x1f,0x29,0xb2,0xc5,0xc1,0xf3,0x5f,0x81,0x2b,0x02,0xcf,0xe9,0x46,0xf3,0x0b,0xda,0x14,0x15,0x0a,0xdb,0xf3,0x0a,0xbf,0xf5,0xf3,0xee,0xff,0xcb,0xdb,0xbe,0x21,0xe6,0x11,0xe5,0x02,0xf8,0x1d,0x0f,0x1a,0x07,0x48,0xcd,0x12,0xab,0x1c,0x1d,0xda,0x1c,0x1d,0x03,0x10,0x2c,0xcf,0xe7,0xf3,0x0d,0x01,0xfe,0x36,0x24,0x06,0xf0,0x85,0xfd,0x36,0xae,0x64,0xe5,0xe6,0x97,0x05,0x22,0xb9,0x0a,0xd3,0x75,0x11,0xcf,0x25,0xd6,0x04,0x0f,0x10,0xe2,0x43,0xef,0xec,0xec,0xc4,0xe9,0x01,0xe1,0xf0,0xfe,0x36,0x1b,0xf4,0xfe,0x2a,0x22,0xdd,0x39,0x25,0xec,0x41,0x16,0xed,0xf7,0xb4,0x2c,0x16,0xec,0x16,0x10,0xdb,0xfe,0x26,0x0b,0xb1,0xfc,0xfe,0x21,0x23,0xb4,0xc1,0x1b,0xc8,0xf3,0x1a,0x06,0xa1,0x04,0xc8,0x2c,0xff,0x0a,0xfe,0xc2,0xea,0x0e,0xd6,0x0c,0xc6,0xdb,0x81,0x0f,0xfd,0xdf,0xc7,0x1b,0x1a,0x41,0xe2,0x14,0xca,0xd3,0x1b,0xf2,0xed,0x44,0x16,0x2f,0x3e,0xed,0x0e,0x2c,0x70,0xf7,0x0a,0x3c,0xe4,0x0c,0xc8,0x21,0x11,0x1f,0x3c,0x23,0x2d,0xc1,0xcf,0xa7,0x08,0x03,0x2f,0x47,0xf8,0xba,0x16,0x2a,0x1a,0x03,0xf1,0xf7,0xe7,0xcd,0x4c,0xf8,0xc3,0x17,0x0a,0x0b,0x0f,0xc8,0xd5,0x16,0xf4,0x0c,0xdb,0xc2,0xca,0x4c,0x29,0x10,0xe9,0xea,0x2d,0xf2,0xb1,0xe4,0x72,0xed,0x1e,0x1c,0x9e,0x2f,0x55,0xd4,0x1c,0xc1,0x0f,0x81,0x14,0xd8,0x19,0xe9,0xe5,0xf5,0x31,0xec,0xf2,0x9a,0xe7,0x8a,0xe5,0xcf,0xe3,0x30,0x0b,0x02,0x74,0x0d,0xb7,0x00,0xab,0xfb,0x2e,0x1d,0xb3,0xb6,0x02,0x0a,0xfe,0xe7,0x22,0xeb,0x13,0xf3,0x19,0x05,0x13,0xf4,0x8f,0xce,0x2e,0x17,0xe2,0x1d,0x06,0x16,0x01,0xbf,0x01,0xef,0x20,0x34,0x02,0xf2,0x69,0xf5,0xe0,0xed,0xac,0x1e,0x03,0xe9,0x52,0x1c,0x39,0xda,0xc1,0xe7,0x6a,0xe9,0xb8,0x2f,0xb4,0x23,0x1c,0x3c,0xcd,0x52,0x35,0xf4,0x07,0xe4,0x2c,0x23,0x1e,0x48,0x35,0xde,0xc5,0xd0,0xff,0xbd,0x18,0x53,0xc3,0xea,0x87,0x02,0x01,0xe5,0x49,0x38,0xda,0xc3,0x01,0xec,0xf6,0x34,0xdb,0x63,0xe6,0xb4,0xe5,0xcc,0x7b,0xa1,0x25,0xff,0xe7,0x35,0xe6,0x75,0x35,0xae,0x41,0xd8,0x43,0x44,0x48,0x0a,0x18,0x11,0x60,0x1d,0xc7,0xa4,0x15,0xff,0xd8,0x24,0x1d,0xfc,0xf5,0xe5,0x96,0x50,0xbf,0xbb,0xfa,0xfc,0xfc,0xac,0x44,0xb3,0x8d,0x8d,0x06,0xef,0x47,0xbb,0x00,0x06,0xde,0x0f,0xb2,0xcc,0x08,0x02,0x21,0xcc,0xb6,0x46,0xbb,0xda,0xf8,0xaf,0x0f,0x26,0xfb,0x05,0xd7,0xfe,0x26,0xce,0x23,0xed,0x47,0x02,0xe3,0xf2,0x9b,0x00,0xd4,0xe6,0xfc,0x08,0x2a,0x55,0x06,0xfe,0x1b,0xd4,0xe5,0x9c,0xee,0xda,0xef,0x22,0xa8,0x6a,0xf3,0x0d,0xdd,0xbb,0x52,0x1d,0x05,0xde,0xd9,0xf7,0x0a,0xd3,0x64,0xff,0x9e,0xa8,0x11,0x09,0xef,0xec,0x20,0x62,0xee,0xfb,0xf2,0x14,0xe5,0xca,0x2b,0xe4,0xee,0xb7,0xd2,0xc0,0xa8,0xfa,0x2e,0xf1,0xd6,0x05,0xc4,0xd7,0x1e,0xf3,0xfe,0x07,0x03,0xbe,0xdc,0x40,0x37,0x1a,0xf3,0xf2,0xe8,0x1e,0x1f,0x0e,0x15,0x45,0x0b,0x1c,0xe2,0xdc,0xe0,0xc6,0xda,0xcc,0x20,0xb7,0xfe,0xb3,0x1f,0x25,0xe2,0xcb,0x32,0x15,0x1c,0xeb,0x4b,0x7f,0xea,0x08,0xb3,0x04,0x3d,0x35,0x5d,0x24,0xb2,0xe4,0xf2,0xe5,0x81,0xf6,0x31,0xca,0xfc,0xc8,0xe8,0x07,0x25,0x05,0xf1,0x10,0xe6,0x93,0x04,0x02,0xd1,0x27,0xf3,0x00,0x3c,0x02,0xbc,0xa7,0x1d,0x21,0x34,0x06,0x15,0xfc,0x0a,0x28,0x29,0xf4,0xbb,0xe3,0x1f,0xf0,0x24,0xf4,0xde,0xcf,0x24,0xe5,0xe6,0x20,0x37,0xc5,0x01,0xf3,0x15,0xe8,0xf4,0x0a,0x02,0xc4,0xf2,0xbd,0x31,0x00,0x76,0xe1,0xed,0xf8,0x1a,0x15,0x06,0xc4,0xfa,0x09,0x18,0x05,0xba,0xf8,0xfd,0x32,0x49,0x1d,0x06,0x21,0x38,0x31,0x0d,0x27,0x0f,0xcb,0x2c,0xfe,0xf2,0xd9,0xd1,0x17,0xd7,0xf8,0x1e,0xe0,0xf8,0x20,0x23,0xd8,0xe3,0x18,0x33,0xda,0x01,0x12,0x2a,0x1a,0xc7,0x02,0xee,0x3f,0xcb,0xdb,0x30,0xd9,0x37,0x1b,0xce,0xde,0x01,0x0c,0x24,0x2e,0x00,0x1e,0xe2,0x13,0x08,0xca,0x06,0xf6,0xfc,0x16,0xf2,0x02,0xed,0x12,0x17,0x2f,0x30,0x1c,0xd1,0xca,0x13,0x3c,0xd4,0xca,0x10,0xcc,0xeb,0x34,0xf1,0x24,0x1d,0xf3,0xdd,0x32,0xcd,0x8f,0xde,0x32,0x02,0xd7,0xe2,0x1d,0x05,0xfb,0xf6,0xf9,0x1b,0xd5,0xeb,0x1c,0xe9,0x09,0xcd,0xfe,0x13,0xe3,0xcf,0x57,0x20,0xeb,0xed,0xda,0xec,0xf6,0x30,0x2a,0x81,0xfa,0xe2,0x15,0x53,0xe3,0x14,0x30,0xeb,0x1a,0x21,0x8c,0x2b,0x27,0x02,0xf2,0x08,0xfb,0x3e,0x11,0xc6,0xcd,0xe5,0x1e,0xee,0xf9,0xf8,0xe0,0x1b,0x0c,0x43,0xda,0x19,0xd8,0x12,0xf8,0xc9,0xde,0x97,0xd7,0xba,0xfd,0xea,0xc9,0xfa,0xbe,0x95,0x98,0xe5,0xc4,0xf7,0xd5,0xd1,0xe4,0xe7,0xf1,0x42,0x4b,0x9f,0x0e,0xda,0x1f,0x15,0xa0,0x4d,0x52,0x04,0xca,0xdb,0xd4,0x0e,0xd0,0xeb,0xe9,0x12,0x2c,0xe9,0xc3,0x13,0xcd,0x02,0xed,0xc7,0xc0,0x9e,0x52,0xca,0x17,0x1a,0xf5,0xda,0xd2,0xe1,0xcd,0x33,0x3a,0x04,0xd1,0x04,0x17,0x21,0x33,0xab,0xd5,0x32,0x23,0xf4,0xb8,0x01,0x1a,0x03,0x04,0x1a,0x48,0x3e,0x37,0x07,0x34,0x19,0x06,0x42,0x30,0x3d,0x29,0xc5,0xbe,0xf9,0xe2,0x01,0x07,0x15,0xd3,0x28,0xe4,0x01,0x14,0x05,0x3c,0x27,0xc1,0x19,0xec,0xef,0xff,0xf3,0x55,0x46,0xd1,0x47,0x15,0x0c,0x21,0x22,0x14,0x19,0x54,0x63,0xdd,0xf6,0x2a,0x0c,0xe3,0x02,0xcb,0x1a,0x2e,0xff,0x30,0xf0,0x57,0xef,0x52,0xc3,0x26,0x7f,0x2b,0xb1,0x2e,0xa2,0xf1,0x42,0x1f,0x1d,0x76,0xb1,0xda,0xe5,0x03,0x12,0x4d,0xce,0xd2,0x47,0xdf,0x08,0xd0,0x39,0xfe,0x10,0xf6,0x12,0x2b,0x39,0x26,0x33,0x2c,0x1c,0xe5,0xea,0xc8,0xa8,0xaf,0xcd,0x37,0xe4,0x2a,0xd6,0xfe,0xfd,0x4a,0xde,0x12,0xec,0x20,0x27,0x41,0x31,0xe2,0x20,0x03,0xf5,0x7a,0x24,0xd0,0x04,0xbd,0x15,0xff,0x1c,0xe4,0xf6,0x9e,0x1d,0x2a,0x0e,0xf9,0xeb,0xf9,0xf2,0xe8,0x15,0xfa,0xe9,0x3c,0x00,0x13,0x01,0xe5,0x24,0xba,0x17,0x28,0x79,0xa9,0x11,0x14,0x89,0x4c,0x00,0x72,0x18,0xc9,0xc4,0xed,0xd1,0xf6,0xe7,0xfd,0xfc,0xdb,0xfe,0x05,0xc3,0x1b,0x03,0x1e,0x2a,0x26,0x30,0x26,0x9c,0xc9,0x3b,0x5f,0x05,0xf5,0x44,0xbb,0x04,0x27,0xcc,0x08,0x1f,0x3d,0xbb,0xf2,0xed,0xda,0x23,0x0f,0xd2,0xee,0x5d,0xf7,0xfb,0xfa,0xc6,0xd4,0x08,0x9b,0x81,0x0c,0x58,0xf5,0xd5,0x18,0x28,0xc5,0xbb,0x06,0xfe,0xd3,0xd8,0xfc,0xf2,0x3e,0x04,0x07,0xfa,0xe6,0xd1,0xf8,0x3f,0x60,0x11,0xe4,0xf0,0xd2,0x42,0x14,0x27,0x93,0x4b,0x17,0xc1,0xe6,0xd3,0xec,0xaa,0xdd,0x1d,0x07,0x21,0x11,0xb8,0x33,0x0f,0x20,0xff,0xbc,0x01,0xca,0xbe,0x59,0xee,0xc5,0xf1,0xa2,0xa1,0x2d,0x1e,0xc0,0xd2,0x4d,0xbd,0x8d,0x8d,0xd4,0xc1,0xe7,0xef,0x05,0x2a,0xde,0x23,0xe5,0x12,0x28,0x5a,0x2d,0xe5,0xd5,0xda,0x18,0x8e,0xb6,0xc9,0xce,0xec,0xc1,0xc9,0x00,0x00,0x00,0x00,0x16,0x5d,0xff,0xff,0x04,0x00,0x00,0x00,0xa0,0x10,0x00,0x00,0x22,0x08,0x59,0xe4,0x81,0x2b,0xb9,0x1c,0x08,0x0e,0xe4,0x43,0xd2,0x36,0x32,0xd0,0x38,0x99,0xe6,0xf9,0xf8,0x3c,0x18,0x00,0xfc,0x22,0x49,0xb2,0xda,0xfa,0x56,0x5c,0x03,0x39,0xd9,0xb8,0xd6,0x13,0x1e,0x09,0xcb,0xc0,0x81,0xd8,0xf0,0xf7,0x4e,0xfb,0x4b,0xa7,0xda,0xd1,0xbc,0x02,0xbb,0xa4,0xe9,0x1a,0x31,0x05,0x48,0xb5,0xf7,0xdb,0xd8,0xb8,0xcf,0xf7,0xe4,0x03,0x01,0xf9,0xea,0xa4,0x62,0x02,0xf8,0x01,0xc3,0x81,0x6b,0xc6,0xef,0xff,0xeb,0xbc,0x1c,0x55,0x07,0xca,0xe0,0x9b,0x0f,0xf1,0x03,0xd8,0x25,0x0c,0x0c,0x04,0x3e,0xfb,0x03,0x27,0x08,0x0a,0x00,0x2a,0x3a,0x2a,0x1a,0x7f,0x07,0xf7,0x18,0xde,0x17,0x18,0x7f,0x05,0xb7,0xe2,0xcb,0x2c,0xb8,0x07,0x1f,0xc0,0x2e,0x57,0xeb,0xbe,0xda,0xb7,0xd5,0x01,0x99,0xc6,0x41,0xef,0x49,0x81,0x2e,0x2d,0xa0,0x38,0xf7,0xc4,0xf8,0x2d,0x2a,0xd7,0x01,0x0c,0x48,0xc6,0xe4,0xf2,0xe3,0x00,0x20,0x00,0xef,0x49,0x2b,0x32,0x0e,0x2e,0xd6,0xff,0x3e,0xc9,0xbb,0xcc,0x11,0xf0,0x7f,0xee,0xe4,0x28,0x36,0x12,0xdf,0xdb,0xde,0x18,0x03,0xf3,0x03,0xf7,0x0c,0x3a,0xc2,0xf8,0xc6,0x3d,0x27,0x81,0x15,0xc6,0x1c,0xe0,0xe1,0x00,0x31,0xbd,0x01,0x06,0xc2,0xed,0xca,0xb3,0xfc,0x38,0x2e,0xe6,0xcd,0x9e,0xfd,0xf2,0xda,0xff,0xd6,0x6a,0x39,0xf1,0x6e,0xea,0x4c,0x17,0x02,0x0c,0xe6,0x02,0xde,0xda,0xe2,0xed,0xe2,0xd4,0xd1,0x7a,0x35,0x7f,0xb4,0xb0,0xda,0x33,0x10,0x55,0xaf,0xce,0x76,0xf9,0x81,0x2b,0x08,0x20,0x83,0xf6,0xc8,0xf2,0x01,0xdc,0x8d,0x0c,0x27,0xfb,0x15,0x24,0x00,0xe4,0x3e,0x2b,0x15,0xe8,0x20,0x39,0x49,0xfb,0x24,0x02,0x1f,0x29,0x0d,0xcd,0xd0,0xd0,0x00,0x0f,0x1b,0xde,0x0b,0x11,0x13,0xdc,0x3a,0x12,0xf3,0x49,0x1b,0xfe,0x01,0x07,0x2c,0x7f,0x06,0xa7,0x48,0xae,0x2f,0x58,0xff,0xef,0xd3,0xd7,0xfa,0x03,0xc8,0x12,0x13,0x7b,0xd3,0x81,0xfe,0x49,0x21,0xc7,0x3c,0xdd,0x54,0x0c,0xf3,0xe4,0xf6,0xde,0x10,0xbf,0xdf,0xff,0xff,0xca,0x46,0x4c,0xf5,0x45,0x37,0xad,0x81,0xe1,0xda,0x15,0x0c,0x1c,0xef,0x04,0xcb,0xa7,0xe8,0x08,0xc7,0xda,0xe0,0xc8,0x48,0xcf,0x66,0x23,0xfd,0xef,0xdf,0xdf,0x03,0x23,0xa9,0x32,0x1a,0x7d,0xc3,0xb2,0x31,0x3d,0xfc,0x81,0x25,0xe3,0x78,0x27,0x25,0xa1,0xd8,0x2b,0xa7,0x25,0x0f,0xe9,0xe0,0xf4,0x7f,0x45,0x24,0xe7,0xae,0x06,0xd9,0x1e,0xc4,0xf8,0x0b,0x2f,0xd3,0xfb,0xbb,0xf6,0x26,0x19,0xd5,0x37,0xea,0x07,0x13,0x5c,0x8b,0xe0,0xf3,0xf0,0x3d,0xcd,0x0a,0xa5,0x81,0x81,0x4a,0x4d,0xd5,0xc2,0x34,0x53,0xcd,0x00,0xcc,0xb9,0x1b,0x0f,0xe9,0xcd,0xf5,0x4b,0x2a,0xc6,0x14,0x3f,0xdb,0x20,0x62,0xe8,0x83,0xf2,0x12,0x70,0x81,0xe6,0x79,0xf1,0x5e,0x57,0xa3,0x29,0xce,0x16,0xeb,0x00,0x91,0xcf,0x4b,0x01,0xc8,0x8f,0x11,0xe6,0xac,0x24,0x8f,0xac,0x81,0x01,0xff,0x69,0x70,0x21,0xf8,0xbd,0xc0,0x18,0x17,0x16,0x4d,0x3f,0x22,0x6d,0x12,0x25,0xb0,0x9f,0x12,0x58,0x68,0xde,0xc2,0x81,0xab,0xee,0x36,0x24,0xf9,0x17,0x2c,0xfd,0x5b,0xbf,0x6f,0xab,0x57,0x79,0x46,0xdc,0x06,0xe8,0xe8,0x14,0xfb,0x31,0xfc,0xc8,0x17,0x38,0xad,0x08,0x39,0x05,0x39,0xe3,0xee,0x14,0x13,0x14,0x2d,0xac,0x81,0x0c,0x02,0xb8,0xf3,0x22,0xe8,0xef,0xc7,0x4d,0xfc,0xf1,0x2e,0xd4,0x6a,0xf8,0xe8,0x02,0x31,0xf0,0xd6,0x08,0x21,0x10,0x18,0x00,0xf4,0xcd,0x14,0xdb,0x5f,0x2d,0x00,0x65,0xd5,0x88,0xb6,0x13,0x3d,0x7f,0x7f,0xbe,0x2d,0x3e,0x32,0x10,0x48,0xba,0x15,0xdd,0xb9,0x4c,0xcb,0x7f,0x2c,0x98,0x21,0x5c,0xd1,0xcd,0x2e,0xe4,0x4a,0x3d,0xdd,0xb7,0xd3,0xca,0x81,0x7a,0xd3,0x2d,0x47,0x23,0xea,0x3b,0x16,0xdb,0x22,0x0c,0xf4,0xcb,0x12,0x2e,0x26,0xf0,0xa6,0xe1,0x98,0x1a,0xb1,0xc0,0xdd,0x24,0x26,0xd4,0x15,0x5f,0xd4,0x17,0x50,0xc2,0x8d,0x03,0x4c,0xef,0x52,0x40,0x11,0xf7,0x7f,0xdb,0x0b,0xf5,0x1c,0x1e,0x0b,0xe2,0xb5,0xaf,0xe0,0x02,0xd4,0x38,0xbb,0xfc,0x12,0x8d,0x01,0x94,0x1f,0xe5,0xf4,0xd7,0xd0,0x15,0xe1,0x2a,0x2d,0x81,0x31,0x1b,0xc8,0xe5,0x0b,0xba,0xff,0x29,0xcc,0xf1,0x39,0x10,0x1c,0x82,0xff,0xb8,0x06,0xc9,0xd4,0x7f,0x02,0x4b,0xb1,0xc9,0x16,0xd1,0xdd,0x14,0x45,0xb5,0x12,0x4b,0xf0,0x92,0x27,0x08,0x16,0x02,0xed,0xd3,0x2b,0x2b,0xa6,0xa2,0xc7,0x05,0xc7,0x22,0x92,0xdd,0x2e,0x10,0xf1,0xbd,0x7f,0xdf,0x27,0x0e,0x07,0x4d,0x66,0xf0,0x12,0x0f,0xed,0xc8,0x2e,0xda,0x81,0x95,0x1d,0xf4,0xb1,0x10,0xab,0xcb,0xd7,0xe5,0x16,0xf8,0x76,0xad,0x8b,0xe4,0xcd,0xeb,0x22,0xfe,0x42,0xea,0xdd,0x2e,0x0e,0xda,0xda,0x14,0x0e,0xac,0xb2,0xbf,0x26,0xc1,0x9c,0x60,0xe7,0xfa,0xed,0x7f,0x2b,0xf8,0xe9,0xda,0xf2,0x20,0x42,0xd0,0xe7,0xba,0x16,0xa9,0x05,0xfd,0x92,0x8d,0xef,0xd1,0x1b,0x46,0x3f,0x11,0x1c,0x0d,0x81,0x27,0xfd,0xef,0x02,0xed,0xe9,0xec,0xf2,0x0f,0x1b,0x18,0x11,0x31,0xe7,0xf3,0x13,0xe6,0xd8,0x22,0x20,0xa5,0x60,0xc8,0xfe,0xa0,0x81,0x17,0x73,0xf4,0x0f,0x5e,0xa0,0x21,0xf7,0x53,0x41,0xd2,0xe9,0x32,0x1c,0xca,0x3e,0xfb,0xdf,0x69,0xf8,0xca,0xf7,0xdf,0xfb,0x16,0xdd,0x22,0x7f,0xfa,0xd9,0x0b,0x18,0xc8,0x1b,0x26,0x20,0xfc,0x28,0x22,0xe3,0xef,0xff,0xc2,0x11,0x32,0xbe,0x0c,0x2b,0x07,0x4b,0xf5,0xa1,0xd4,0xe9,0xd6,0xf1,0x0c,0x13,0x0b,0xec,0x0f,0x7f,0x05,0x2c,0x00,0xb0,0xec,0xfb,0x1a,0xf8,0xd7,0x22,0x22,0x0b,0xfb,0xd0,0xf4,0x15,0x26,0xe0,0x17,0xfa,0x1d,0x41,0x92,0x3e,0xeb,0x1d,0xdb,0xdf,0xe6,0x31,0x81,0xa5,0xb1,0xd7,0xc2,0x55,0xfb,0x04,0xc3,0xac,0xc6,0x25,0xf2,0x09,0xf6,0xf4,0x1e,0xe2,0x31,0x81,0x1f,0x32,0xf1,0xf1,0x02,0x36,0xf9,0xbd,0xf9,0x03,0x24,0x3b,0xef,0x53,0x12,0x12,0x09,0x6a,0xff,0x0d,0x23,0x13,0x1b,0xfe,0xbc,0x2f,0x00,0x0b,0x35,0xf9,0xd6,0xfb,0xad,0xce,0x19,0x81,0xe2,0x28,0x55,0xf6,0x10,0xed,0xd7,0xf1,0xda,0xe4,0x30,0xfb,0x48,0x19,0x00,0xe3,0xed,0xc1,0xc4,0x18,0x1f,0xfa,0x36,0xd4,0x28,0x12,0xed,0xdb,0x81,0xe0,0x7a,0xe1,0xc1,0xc1,0x33,0xfd,0x17,0xe9,0x58,0xda,0xbf,0xb7,0xc2,0xf6,0xd8,0xe3,0x35,0x31,0xf5,0x43,0x37,0x08,0xfd,0x88,0xe3,0xfd,0xfa,0x12,0x81,0x8f,0xe0,0xff,0x2f,0x06,0xe1,0x28,0xd3,0x24,0xba,0x0f,0x7f,0xf9,0x59,0x39,0xe3,0xc5,0xc2,0xe5,0x3e,0x0d,0x1b,0x03,0xe1,0x33,0xc5,0x54,0xff,0xd3,0x58,0x0f,0xc3,0xce,0x77,0x05,0xf0,0xec,0x06,0xf5,0xfa,0x3d,0xff,0x42,0x0f,0xf6,0x89,0x1b,0xc8,0x92,0xd8,0x43,0x14,0xec,0xcf,0xdf,0xc0,0xec,0x9a,0x13,0x45,0xef,0xd5,0x7f,0xbf,0x43,0xeb,0xee,0x12,0x16,0xfd,0x25,0xfc,0x07,0xd7,0xf0,0xef,0x06,0x33,0xbf,0xf3,0xb8,0x2d,0xe2,0x16,0xf9,0xd3,0xe2,0x0c,0xd5,0xf6,0x20,0x2e,0xec,0x81,0x0d,0x81,0x14,0x0a,0xce,0xd7,0x5a,0xc6,0xf5,0x0b,0xf9,0xcd,0x09,0x14,0x1b,0x28,0xdc,0x25,0x19,0x19,0xcd,0xee,0xeb,0xc9,0xfc,0x46,0xc0,0x72,0xe4,0xfd,0xfd,0x7f,0xf7,0x37,0x94,0xa1,0xce,0xe9,0x24,0x46,0xff,0xe0,0xa6,0x1c,0x20,0x59,0x23,0xfc,0x7d,0xbe,0x0d,0xf5,0xfa,0x13,0xa4,0xe8,0x4a,0xe5,0x1a,0xea,0x81,0x01,0xb0,0x35,0x27,0xb6,0xae,0x0d,0x57,0xd1,0x52,0x20,0x24,0x46,0x40,0xfc,0x25,0xfe,0xe3,0xd1,0x19,0xf8,0x35,0xf6,0x0d,0x23,0xc9,0x08,0x45,0x2a,0xc1,0xbb,0xcf,0x81,0xf9,0x5e,0x11,0x3f,0xfc,0xb1,0xbe,0xea,0x5c,0xe4,0x17,0xf4,0xfb,0xb1,0x22,0x58,0x1c,0xd6,0xcf,0x13,0x7f,0x2f,0x25,0xe6,0x37,0x30,0xb0,0xcf,0xa8,0x20,0x33,0x1c,0xfa,0xe3,0xd4,0x1e,0x57,0xa1,0xe7,0xab,0xc7,0xcf,0x07,0x2f,0xcf,0x03,0x23,0x81,0x35,0xb4,0xd3,0xb2,0xf1,0xf2,0x31,0xb1,0x6e,0x98,0xab,0xe7,0x34,0xd5,0xdb,0x45,0x07,0x01,0x21,0x89,0xd5,0x32,0x29,0xb3,0x18,0x3d,0xff,0x1b,0x56,0xfa,0x5b,0x0d,0x5a,0x5a,0xf3,0x1d,0xcd,0x81,0x06,0xf6,0xda,0x01,0xce,0x2b,0x15,0xef,0xc7,0xcc,0xd2,0xc6,0x19,0xf5,0x00,0x1a,0x13,0x1a,0xd3,0xd6,0x81,0x40,0x39,0xd1,0x2d,0x21,0xf7,0xf7,0xa4,0x3f,0x1c,0x35,0xfc,0x9e,0xab,0x40,0x04,0x2f,0x10,0x0c,0xf1,0x09,0x36,0xd8,0xd6,0xc0,0xfe,0x7f,0xe6,0xd1,0xec,0x7a,0x46,0xaa,0x1b,0xc8,0xe2,0xfd,0x06,0xfe,0xee,0x11,0x2a,0x17,0x3d,0x15,0xe1,0xc0,0x24,0x1d,0xe6,0x11,0x1a,0xbf,0x14,0xdf,0xc0,0xdc,0xc5,0x7f,0xff,0x0a,0xe3,0x3b,0x27,0x0c,0x2d,0x0a,0xe8,0xeb,0x00,0xe0,0x30,0x11,0x36,0xef,0x31,0x42,0x1a,0xf1,0xef,0x28,0x19,0x32,0x11,0x81,0xf1,0x21,0x1f,0xb4,0xc3,0x43,0xca,0x36,0xc3,0xb3,0xc4,0x63,0x15,0xb9,0x40,0x34,0x25,0x5a,0xf1,0xf6,0xd0,0x09,0x27,0xaa,0xd1,0x74,0xe9,0x05,0x46,0x51,0x48,0x99,0x03,0x07,0x14,0x4a,0xf4,0xd9,0xc5,0x45,0x48,0xc8,0xf5,0xd4,0x31,0xe4,0xf3,0xfc,0xd7,0x7f,0x5a,0xcf,0x02,0xff,0x3e,0xc6,0x8f,0xd4,0x8d,0xe5,0xe4,0x14,0x81,0xa1,0x08,0x22,0x28,0x23,0xd0,0x0c,0x19,0x3e,0x15,0x11,0xfc,0xec,0x68,0xbd,0xff,0x1e,0xf4,0xed,0xf2,0x81,0x24,0xbb,0x1a,0x9c,0xb6,0x30,0x31,0xbd,0xe2,0xf1,0xf5,0x5a,0x26,0x66,0x23,0xa4,0x21,0x20,0x52,0x49,0xc4,0xd6,0xa1,0xdc,0xf3,0x6c,0xe5,0xa9,0xcd,0x4b,0x66,0x81,0xce,0x3b,0xd4,0x24,0xe4,0xc9,0xf7,0x71,0xe5,0xe8,0x3d,0x2d,0xf6,0xfa,0x59,0xbe,0x9c,0x2b,0xce,0x81,0x8e,0xb1,0xa4,0xe7,0x44,0x24,0xbf,0xbb,0x84,0x38,0xc0,0xb0,0xe9,0x19,0x1b,0x53,0x3d,0xfc,0xd0,0xc7,0x06,0xa8,0x00,0x28,0x3f,0xfd,0x37,0xee,0x9c,0x30,0x07,0xe8,0x1e,0x2f,0xee,0xfa,0x9e,0xc8,0x19,0xf6,0x05,0x95,0xdd,0xae,0x02,0x4c,0x30,0x0b,0x1a,0x25,0x53,0x08,0xdc,0x7f,0xf9,0xee,0x03,0xf8,0xf8,0xf5,0xea,0xdd,0xdf,0xba,0x44,0x11,0xdf,0x29,0xec,0xfc,0x16,0x17,0xe8,0x21,0x0d,0xd0,0x32,0x0d,0xe4,0x27,0xd1,0x81,0xef,0xe6,0xb4,0xfd,0x37,0xeb,0xe5,0x81,0xfa,0xa6,0x20,0x0f,0xcc,0x0a,0x32,0xb2,0xfa,0x03,0xe7,0xdb,0xd6,0xe7,0xe5,0xf5,0xea,0x4e,0x0f,0xb5,0xf0,0x5c,0xec,0x35,0xf4,0xfd,0x55,0xab,0x10,0xf7,0x25,0xd7,0xdf,0x1c,0x41,0xb3,0xa7,0x81,0x99,0xfe,0xeb,0x2b,0xd2,0x55,0x2e,0xf5,0x12,0x04,0x1f,0x1f,0x29,0xfb,0x70,0x28,0x00,0x7f,0x19,0x28,0xa5,0xad,0x37,0x18,0xe7,0xcf,0xe5,0xb0,0x3c,0xde,0xe9,0x3a,0x0b,0xd6,0x42,0x08,0xf8,0x4f,0x3d,0xd9,0x38,0x65,0x26,0xe6,0xfe,0xd7,0xe7,0x2f,0xd0,0x2b,0xde,0x4d,0xf5,0x81,0x3c,0x2b,0xdf,0xf5,0x1a,0xc1,0x28,0x09,0xce,0xe0,0xe8,0xc5,0x27,0x81,0x2d,0x67,0xd9,0x19,0x46,0xff,0xd4,0xe8,0xc7,0xb4,0xbf,0xb9,0x0e,0x1a,0x69,0xf3,0xed,0x6e,0xfa,0xf4,0x2a,0x55,0x57,0xb1,0xa3,0xd3,0xbb,0x81,0xf1,0xb1,0x38,0x05,0x14,0x36,0x1d,0xc3,0xcb,0xf1,0xd2,0x14,0xbf,0x05,0xee,0xf4,0xfd,0xda,0x36,0x47,0x03,0xb6,0x2a,0x1f,0x07,0xc9,0x58,0xc8,0x11,0x81,0x03,0xf7,0x13,0x02,0x1b,0xdb,0xc3,0xb3,0x3c,0x0c,0xd6,0x1c,0x0b,0xe0,0xdd,0x4e,0x29,0x1a,0x32,0x41,0x3c,0xd9,0x96,0x28,0x5c,0xa4,0x3b,0x3c,0x04,0x02,0xf4,0xda,0x0c,0xd2,0xf5,0xe7,0x0b,0x67,0x04,0x81,0x33,0x1a,0xf6,0x18,0x23,0xe7,0x1c,0xfc,0x26,0xd3,0xc0,0x07,0xf5,0xea,0xbc,0xf9,0xcd,0x0e,0x47,0xfc,0xf7,0x03,0xc5,0x6b,0x9f,0xe0,0x2f,0x04,0x26,0xc0,0x10,0x31,0xf2,0xd0,0x32,0x1d,0xc9,0xf7,0xfb,0x81,0x77,0x17,0xbc,0xf1,0x81,0x31,0xdd,0x30,0x10,0xec,0xe5,0x47,0xdb,0xb2,0xbf,0x9e,0x2e,0x18,0xee,0xea,0xd0,0x36,0xbc,0xe2,0x31,0x3e,0xbe,0xa9,0xf4,0x1d,0x29,0x21,0x26,0xb2,0xf1,0xf8,0x2f,0x15,0xa0,0x5c,0xa2,0x12,0x47,0xe0,0xea,0x0e,0xc7,0xf1,0x7f,0x28,0x1a,0x2d,0x11,0x05,0x83,0xdb,0xea,0x09,0xf1,0x04,0x1e,0x35,0x2e,0xfb,0xcf,0x26,0xce,0x70,0x9c,0xc8,0xe4,0xef,0x0d,0x00,0xbf,0x11,0x0a,0xf1,0xf5,0x14,0xfb,0xc5,0xf2,0x81,0xe3,0x48,0xb5,0xdb,0x03,0x04,0xbb,0x4c,0x1c,0xd6,0xbc,0x28,0xd1,0x1b,0xeb,0xd3,0xba,0xdb,0x05,0xff,0x0a,0x7f,0xfd,0xf3,0x6a,0x5e,0xf0,0xab,0x1a,0x0b,0xf8,0x05,0xfa,0xf1,0x7f,0xdf,0xdf,0xf7,0xb2,0xf1,0xd0,0x4a,0x28,0x9b,0x31,0xe2,0xfa,0xe6,0x21,0xef,0x3d,0xde,0xc5,0x08,0x06,0x13,0x81,0xa2,0xcd,0x22,0x05,0xe3,0x1b,0xfb,0x0a,0x2d,0xde,0x06,0xf0,0x41,0xad,0xae,0x8b,0x5c,0x2d,0xa5,0xed,0x33,0xaf,0xe4,0xc8,0x1c,0xcd,0xe0,0x27,0xd5,0xb6,0xfd,0xfd,0x51,0xf2,0x4f,0x1e,0xf6,0xe9,0x1f,0x1a,0xe5,0x18,0xd7,0x2a,0x08,0x16,0x1d,0x7f,0x1d,0x28,0xfd,0xb5,0xbe,0x02,0x23,0xef,0xdb,0xec,0xe8,0x1d,0x81,0xa1,0x01,0x3f,0x0d,0x3f,0xc7,0xe3,0x08,0x25,0xdc,0xc9,0xe2,0x1f,0x25,0x0e,0xbd,0x1b,0x0b,0x07,0xe6,0x14,0x4d,0x40,0x04,0x43,0xee,0x1e,0x44,0xef,0x41,0x2b,0x03,0xbf,0xf9,0xc4,0xbc,0xf3,0xd9,0x81,0x36,0x38,0x75,0x00,0x19,0x1a,0xf2,0xfe,0x0b,0x28,0xdf,0xa8,0x88,0x1f,0xc7,0x38,0x91,0x1c,0xca,0x18,0xae,0x59,0x23,0xd9,0xc8,0x11,0xbe,0x39,0xd3,0x13,0x5e,0x10,0x81,0x41,0x66,0x9b,0x15,0x8c,0x8c,0xed,0xe7,0xf4,0x32,0x17,0x30,0x27,0x37,0x10,0xf7,0xd5,0xcf,0x81,0xf6,0xf0,0x00,0xea,0x01,0xd6,0xe8,0xfc,0x62,0xe7,0x03,0xff,0x01,0x02,0xde,0x2c,0xed,0x15,0x0b,0x22,0x9f,0x25,0x11,0xde,0xc6,0x36,0xdf,0xbb,0x4d,0xba,0xf0,0x7f,0xfc,0x2b,0xfd,0xb2,0xb5,0x90,0xe0,0x45,0x23,0xc4,0xbb,0xfd,0xff,0x3a,0xce,0x13,0x14,0x05,0x36,0x17,0xf9,0xbd,0xf4,0x69,0xc1,0x13,0xb6,0x81,0x3e,0x16,0x37,0x16,0xe8,0x3e,0x3f,0xf7,0x06,0x33,0x4e,0x0b,0xd7,0x43,0x1a,0xb3,0x2b,0x4c,0x38,0x2c,0xf1,0xb2,0xb4,0xdb,0xe2,0xcb,0x42,0x7f,0xc9,0x26,0x0a,0x04,0xd0,0x65,0xcb,0xb6,0x9f,0xe0,0xfa,0x31,0xf1,0xee,0xf6,0xe5,0x9c,0xdd,0x1b,0x0e,0xe6,0xf5,0x15,0x7f,0x19,0x25,0x02,0x0f,0x24,0xe0,0x44,0x09,0xe9,0x34,0x7c,0x5c,0x3a,0x0f,0x33,0x11,0x0c,0xf2,0xed,0xc8,0xdc,0x3b,0xf4,0xea,0x27,0x04,0x30,0x04,0xf4,0xda,0x45,0x07,0x1a,0xf2,0xec,0xdc,0x81,0x1f,0xf8,0xc4,0x2a,0xe5,0xa3,0xf0,0xe0,0x5f,0x26,0x05,0xad,0x7f,0x11,0xbe,0xe5,0xe0,0x25,0x05,0xd6,0x69,0xd1,0xf1,0xba,0xf1,0x03,0xd7,0xe6,0x16,0xdb,0xe2,0x16,0xc2,0xe0,0x3f,0x81,0x21,0xd3,0xad,0x0b,0x19,0xfb,0xd7,0x1a,0x0e,0xda,0xf3,0x2a,0x13,0xe2,0xdc,0x18,0x42,0xef,0x25,0x11,0x0d,0x2b,0x19,0xe3,0xe7,0x2d,0xd6,0xc6,0x55,0x94,0xcd,0x37,0x3a,0xf4,0xfa,0xea,0x0e,0x09,0xdd,0x21,0x81,0xf1,0x27,0x17,0x06,0xf2,0x28,0x1f,0x4d,0x01,0xba,0x22,0xad,0x07,0xf0,0xea,0x32,0x39,0xe9,0x9b,0x94,0x14,0x66,0xc8,0xf2,0xb2,0x21,0x05,0xd6,0xa1,0x18,0x01,0x14,0xc8,0x2a,0x02,0xb3,0x12,0x47,0x45,0xa4,0x7f,0x56,0x32,0x2b,0xf4,0x67,0x2d,0x25,0xf3,0xa3,0xdb,0x16,0xec,0xce,0x35,0xe8,0xd4,0xfb,0x7f,0xfb,0xe2,0xcd,0xd8,0xfa,0x10,0x05,0xd4,0xff,0x23,0xd4,0xd8,0xdd,0xce,0x1f,0x30,0xed,0x00,0xe5,0xf8,0xcf,0x24,0x81,0x01,0x33,0x25,0x1b,0x08,0xdc,0x23,0x1d,0x07,0xed,0x04,0x10,0x19,0x10,0xc1,0x50,0x90,0x68,0xb1,0xb2,0xa9,0x57,0xe0,0x4a,0xb1,0x05,0x0d,0x34,0x44,0x4d,0xe2,0x3b,0xe2,0x64,0x2c,0x0d,0xca,0x50,0xc1,0xee,0x3d,0x81,0x23,0x3a,0x0f,0xd3,0x0c,0xeb,0xc6,0xd3,0x38,0x0d,0x00,0x24,0xda,0x0c,0xe3,0xd3,0x02,0x5d,0x04,0xf2,0x81,0x01,0x3b,0xc2,0xe1,0x49,0xef,0xc5,0x0f,0xfc,0x14,0x1b,0xf8,0xd9,0x02,0x96,0x08,0x07,0xba,0x38,0x69,0xf9,0x2c,0x07,0xdc,0x02,0x29,0x27,0x2f,0x4e,0x19,0x1b,0xf4,0xe3,0x19,0x03,0x81,0xe2,0x00,0x13,0x75,0x9c,0x09,0x5d,0x0f,0x7f,0xcd,0x10,0x42,0x6a,0x34,0xe0,0x16,0xeb,0x09,0x55,0xde,0x08,0xf7,0x21,0xfa,0xd0,0xfd,0xaa,0x58,0xeb,0x50,0x66,0xfe,0xdb,0xf9,0xe6,0x62,0x39,0x81,0x19,0x00,0x04,0x50,0xf1,0x3f,0x43,0x27,0xad,0xec,0xee,0x08,0x30,0xe9,0xf5,0x23,0xe7,0x04,0xe5,0xdf,0x33,0x7f,0xe8,0xfa,0x09,0x2c,0xe0,0xc9,0xfb,0xde,0xd5,0xea,0x08,0x16,0xea,0x16,0x0d,0xf0,0xff,0x4f,0xda,0xe5,0xfd,0x1f,0xf8,0x00,0x5c,0xfb,0x3e,0x0b,0x22,0xe3,0x0e,0xe9,0x1b,0xf5,0xd6,0xda,0xdb,0x13,0x40,0x12,0xdd,0x20,0x20,0x5e,0xe0,0x10,0x1c,0xff,0x23,0x7f,0x35,0x32,0x51,0x20,0xe0,0xdb,0x10,0xff,0xf8,0x3c,0x0f,0xe3,0x62,0xf7,0xba,0x0a,0x13,0xe5,0xe7,0xe9,0x81,0xe9,0xc4,0xe7,0xdb,0x36,0x32,0x1e,0xed,0x11,0x09,0x1a,0x37,0xcf,0x29,0x58,0xbc,0x37,0x00,0xbe,0x8a,0x26,0xc4,0xeb,0x3f,0xbc,0xca,0x05,0x7f,0x6b,0xe1,0x17,0x12,0xeb,0x6e,0x09,0x0c,0xa9,0x7f,0x02,0x51,0xea,0xc4,0x0b,0x86,0x22,0x12,0x0d,0xfd,0x19,0xe7,0x23,0xc3,0x33,0xeb,0x08,0x15,0x09,0x24,0xc1,0xf9,0xc5,0x64,0x48,0x3e,0xe9,0x6b,0xc5,0x4f,0x50,0x9d,0x24,0x2e,0x15,0x22,0x7f,0xd2,0x9e,0xac,0x50,0xe1,0x75,0x9d,0x21,0xa2,0xd5,0xc9,0x07,0xdb,0x28,0x12,0x0c,0xe4,0x93,0xe3,0xfc,0xdc,0x38,0xe8,0x05,0x36,0x1b,0x32,0xc5,0x07,0xdf,0x20,0x03,0x09,0x13,0xec,0x18,0x36,0x16,0xed,0xc6,0x06,0xe2,0xef,0x05,0xa9,0x7f,0xbf,0xff,0xb8,0x27,0xd3,0x02,0x09,0xbf,0x22,0xc9,0xca,0x93,0x86,0x12,0xf1,0x81,0xed,0xd4,0xe6,0xeb,0x00,0x5f,0x18,0xda,0x0e,0x34,0x38,0x01,0x2f,0x52,0x33,0xc8,0xda,0xcc,0xa4,0xe4,0x21,0x7f,0x53,0xc8,0xdc,0x25,0xf4,0xce,0x3d,0xaf,0x3d,0x5b,0x32,0x15,0x23,0xf1,0x00,0xec,0xaf,0x51,0x31,0xd2,0xf6,0x09,0x01,0x22,0x12,0x13,0xf2,0xd4,0xc3,0xd8,0xcc,0x0c,0xfa,0x41,0xc8,0x39,0xe3,0x10,0xe7,0x29,0x37,0xe2,0x7f,0x24,0x57,0x84,0xeb,0x27,0x34,0x28,0x31,0x39,0xba,0xf0,0x32,0xf2,0x08,0xb1,0x05,0x32,0xe4,0xf2,0x95,0x47,0x30,0x7f,0x39,0xb6,0x0e,0xfc,0x10,0x37,0x20,0x30,0x0a,0xee,0xd5,0x00,0xf2,0x09,0xfd,0x81,0x1d,0xd9,0x02,0x08,0x0c,0x04,0x2a,0xa5,0x10,0x1d,0x1f,0xf9,0x34,0x20,0x11,0xf0,0xd5,0x36,0x00,0xe9,0x34,0xb7,0xfc,0xe4,0x12,0x39,0x7f,0x54,0x0c,0xd0,0x00,0x22,0x41,0xf0,0x1c,0xcc,0xf6,0x27,0xd1,0xa7,0x09,0x4e,0x2c,0xd3,0xa5,0x50,0x20,0x0a,0x73,0xcb,0x29,0xa7,0x81,0x06,0x69,0xc1,0x93,0x11,0x55,0xd2,0x87,0x21,0xcf,0x16,0xa3,0x15,0x1f,0xf9,0x39,0xaf,0xf9,0x1a,0xbd,0xc5,0xcf,0x14,0x1f,0xe7,0x69,0x0f,0xf8,0xc0,0xe0,0x81,0x1b,0x0a,0x3e,0x18,0x16,0x44,0x20,0xac,0x08,0xda,0xfe,0x17,0x11,0xbf,0x1b,0x33,0xf5,0x0f,0x36,0x18,0x54,0x14,0x08,0x07,0xca,0xff,0x01,0x04,0xfe,0x26,0xf0,0x08,0xd2,0x38,0x31,0xe6,0x8c,0x81,0xbc,0x31,0x23,0x78,0xfa,0x19,0xe5,0xe7,0xe1,0xca,0x36,0xc0,0x06,0x1e,0xff,0x29,0xf9,0xb2,0x21,0xdf,0x94,0x48,0xf7,0x2e,0xd7,0x81,0xbe,0x35,0x03,0x28,0x3b,0x03,0x24,0x3f,0x28,0xc0,0xf9,0xdb,0xe6,0x96,0xd6,0xf8,0xea,0x31,0xee,0x0b,0xb4,0x09,0x37,0x7f,0xc4,0x1c,0x19,0xe3,0x00,0xe8,0x6f,0xb3,0x77,0x9b,0xe6,0x18,0xbb,0xcd,0xec,0xcd,0x15,0x30,0x22,0x81,0xe8,0xd5,0x13,0xce,0xaf,0xd9,0x0a,0x9d,0xe7,0x0d,0xf3,0xe0,0x15,0x0c,0xe5,0x43,0x3a,0xbd,0xfc,0xfc,0xf3,0xff,0xd1,0x16,0x33,0x84,0x7f,0xfe,0x98,0xa1,0x60,0x9a,0xfc,0x82,0x16,0x1f,0x31,0x4c,0x11,0xbc,0x1b,0xcf,0x4a,0x4f,0x28,0xe4,0x0a,0xd3,0xa3,0xd9,0xb1,0x67,0x12,0xc7,0x0f,0x2f,0xb3,0x05,0xd9,0xcd,0xbe,0xda,0xec,0x59,0xee,0xd9,0x5d,0xa5,0x52,0xe7,0x33,0x0a,0x7f,0x96,0x37,0x02,0x21,0xcf,0x0c,0xcf,0x5e,0x06,0x0f,0x26,0x8f,0xa4,0xc0,0x3d,0x63,0x2b,0x10,0xed,0xe0,0xda,0x0c,0x50,0xf2,0xc7,0x3d,0x76,0x30,0x1a,0x06,0xdb,0x19,0x7f,0xa6,0x1c,0x56,0x18,0x04,0xdf,0xdb,0xf1,0x31,0x13,0xe8,0x17,0xb4,0x91,0xc7,0xf0,0x38,0xe0,0x0e,0x4b,0xb2,0x11,0x30,0x06,0x1e,0x4a,0x7f,0x29,0x07,0x0b,0xf8,0xf6,0x0a,0x81,0x25,0x8b,0xba,0x32,0x1d,0x1b,0xfe,0x60,0xef,0xd7,0x05,0xe2,0x52,0xf2,0x3b,0x3f,0x13,0xf0,0x11,0xe4,0xb2,0x12,0xf8,0xe3,0x49,0xc0,0xda,0x2f,0x08,0x11,0xf4,0x1b,0xc4,0x48,0xb0,0x3a,0x37,0xfa,0x33,0x11,0x49,0xac,0x37,0x4e,0x7f,0x08,0x52,0xbf,0xbc,0x09,0xec,0x1e,0x34,0xe8,0xe3,0x1a,0xfe,0x6e,0x39,0xed,0xea,0x48,0xe3,0x0f,0x81,0xea,0xdc,0xed,0xd9,0x2d,0xb0,0xcb,0x22,0x66,0xf6,0x11,0x3e,0x09,0xf2,0xa2,0xef,0xd4,0x0f,0x33,0xf2,0x20,0xfc,0x04,0xbb,0x2e,0xfb,0x37,0x81,0xe5,0xfc,0x54,0x0a,0x18,0x07,0xef,0x45,0xfa,0x11,0xe5,0xee,0xf5,0xd3,0xd6,0xcb,0xdc,0x5e,0xfe,0xe5,0x06,0x7f,0x21,0xa9,0xca,0x0c,0x31,0xf6,0xf5,0x3c,0xc8,0x00,0x4f,0x37,0xe1,0xf6,0xc0,0x86,0x09,0xef,0xfa,0x35,0xcd,0x35,0xf9,0xda,0x02,0xf5,0x16,0xfe,0x0e,0xec,0x10,0xe0,0x87,0x00,0xf3,0xdb,0x90,0xf4,0x2b,0xf5,0x28,0xcf,0xc3,0xe0,0x13,0x0c,0xfd,0xbd,0x7f,0x46,0x81,0x2b,0x21,0xe4,0xe7,0xeb,0x03,0x0a,0xde,0x0f,0xee,0x08,0x46,0x03,0x8f,0x20,0x19,0x7c,0x00,0x0d,0xee,0xf8,0x06,0x3d,0xac,0x06,0x4f,0x12,0x5a,0x20,0xc8,0x2e,0x2e,0xdc,0x66,0xd4,0x1e,0x9c,0x3c,0x6c,0xf6,0xd9,0xb1,0xe6,0x81,0x58,0x06,0xce,0x20,0xf3,0xd5,0x30,0xc5,0xc6,0x0c,0x94,0xc4,0x92,0xf8,0x01,0xef,0x08,0x1e,0x03,0x5d,0x81,0x27,0x07,0x0a,0xea,0xab,0xf3,0xf3,0xff,0xf2,0x4e,0x46,0xe5,0x4f,0xdf,0x8f,0xe0,0xd0,0x06,0xcb,0x35,0x12,0x24,0xd4,0x7f,0x2a,0xb1,0x0e,0x00,0xe4,0xf5,0x48,0x23,0xda,0x73,0x2f,0x50,0x16,0xc2,0xfd,0xef,0xa2,0xbe,0x38,0xfe,0x33,0x22,0xcf,0xd5,0x49,0xf7,0x04,0xf5,0xc1,0xe3,0xa7,0xeb,0xf0,0x81,0xe1,0x2f,0xc2,0x11,0xec,0xc4,0x22,0x3e,0xeb,0x1f,0x17,0x09,0xbe,0xf4,0xa3,0x0f,0xce,0x32,0x18,0x27,0x11,0xaa,0x1f,0x0a,0xf1,0x25,0x8d,0x1b,0x07,0xa1,0xe5,0xeb,0x7a,0x0a,0x00,0xd5,0xee,0xcb,0x1d,0x31,0x40,0xdb,0x7f,0xec,0xe1,0x49,0x2a,0x37,0xf8,0xd8,0xad,0xb4,0x41,0xe0,0x26,0x14,0x35,0xae,0xde,0x63,0x1c,0x5f,0x11,0x09,0x81,0xd8,0x18,0xcd,0xf0,0x91,0x49,0xcb,0x40,0xe5,0x4f,0x11,0x17,0xd7,0x00,0x4e,0xe7,0x06,0xb2,0x13,0xfc,0x81,0xea,0x19,0x25,0xfe,0xc0,0x74,0xf4,0x08,0xbb,0x4e,0x20,0xd5,0x2b,0xda,0x9f,0x2b,0xf3,0x1e,0x81,0x1a,0x98,0x02,0xcb,0xfb,0x14,0xf9,0x21,0xf6,0xab,0xfe,0xf5,0x1d,0xdb,0xfa,0xea,0x30,0x2b,0xec,0x1f,0xf5,0x7b,0x44,0xb6,0x5d,0x15,0xe1,0x22,0xb5,0xbc,0x16,0xc0,0xb2,0xf9,0x18,0x3c,0xeb,0xe8,0x7f,0x1e,0xf4,0xbb,0x1c,0xe3,0x7c,0x2a,0x31,0xf9,0xe3,0xe2,0xda,0xd3,0xc3,0xd3,0x4a,0xeb,0xc3,0x3c,0xed,0xa8,0xec,0x12,0xf2,0x0b,0xa2,0x23,0x57,0x1e,0x64,0x7c,0x3c,0x29,0xec,0x81,0x0a,0xf9,0xe9,0x60,0x52,0xe6,0x2d,0x40,0xe6,0xdf,0x08,0xfb,0x04,0x82,0xe8,0xd0,0x64,0x6c,0x15,0xe2,0xdd,0x32,0x7f,0xec,0x04,0xe5,0xfb,0x48,0x17,0xf1,0xde,0x4f,0xcb,0x81,0x30,0x1c,0x1c,0xe9,0xe5,0xa6,0x25,0x34,0x2f,0xc4,0xfa,0xbb,0xf1,0xdb,0xf9,0xcf,0xed,0x05,0x13,0xd8,0xfe,0x3a,0xe6,0x5a,0xdc,0x13,0x38,0xb8,0xef,0x05,0xe0,0xaf,0x6a,0xd4,0x3b,0xc4,0x1c,0xea,0x14,0x1e,0xf2,0x1f,0xf6,0x13,0x36,0x41,0x12,0xee,0x18,0xfb,0xf2,0xfd,0xd9,0x7f,0x51,0xb6,0xeb,0xa9,0xc7,0x98,0x42,0xd1,0xfd,0xe2,0xc5,0x2c,0x7f,0x16,0xfe,0x31,0x0b,0x11,0x1b,0x50,0xf2,0xfb,0xea,0xf4,0x39,0xd7,0xce,0x3e,0xfe,0x21,0x2d,0xf0,0x10,0x44,0x1d,0x7f,0xe1,0x05,0x00,0xc9,0xf0,0x05,0xf2,0x14,0xe9,0xec,0x10,0xd9,0xef,0xbe,0xeb,0xd3,0x17,0xdb,0x04,0xe8,0xe0,0xfd,0x3b,0xef,0xd4,0x2f,0xc8,0x3f,0x28,0x14,0x0d,0xfe,0xec,0xdd,0x0b,0xe1,0x57,0xdd,0xf8,0xf9,0x7f,0x08,0xf0,0x1d,0xeb,0x1f,0x4d,0xf1,0xf9,0x02,0x31,0x30,0xea,0xdf,0xf1,0x99,0x49,0xe5,0x1d,0x79,0xc6,0xcd,0x0f,0xed,0xdf,0x95,0xfe,0xd7,0x6c,0xad,0x05,0x07,0x81,0xd2,0x01,0xb8,0xf0,0x2d,0xd8,0x7f,0xde,0x2e,0x06,0x1c,0xd0,0xf2,0xf7,0xe3,0xc0,0xe2,0x31,0xe9,0xfc,0x45,0xda,0xf0,0x0d,0x25,0xee,0x2b,0x4e,0x0c,0x2a,0x02,0xf1,0xa0,0x0c,0x3e,0xce,0xe0,0x08,0x58,0x3d,0x81,0x51,0xd4,0xf1,0xff,0x12,0x2a,0xad,0x28,0xd8,0x23,0x09,0xf0,0xb9,0xf4,0x16,0x46,0xff,0x12,0x3d,0x28,0x0a,0xfb,0xb3,0xe6,0x7f,0x37,0xd0,0xa9,0x16,0x02,0x60,0x10,0x52,0xfb,0xd5,0xd3,0x29,0xde,0xa2,0x0f,0xd0,0xa9,0x01,0xc5,0xa9,0x2f,0x47,0x44,0x6e,0x11,0xfb,0x3f,0xeb,0x4f,0x05,0xd8,0x74,0x0b,0xbe,0xe5,0x7f,0x9d,0xd3,0x1e,0xff,0xca,0xf9,0x1c,0x9e,0x44,0xb2,0xb4,0x28,0x3a,0x40,0x9f,0xf8,0xbe,0x08,0xf9,0x3f,0xad,0x21,0x81,0x8c,0xd5,0xf6,0x2d,0xdd,0x47,0x31,0x40,0xcb,0xc4,0xe8,0x37,0x7c,0xa1,0xd4,0x33,0xa4,0xd3,0x0f,0x3f,0x0b,0x30,0xa7,0x3b,0x7b,0x51,0xed,0x0a,0xa4,0xde,0x37,0x13,0x00,0xec,0x1a,0x12,0xf0,0xe4,0xcc,0x7f,0xbe,0xd7,0x54,0x3d,0xed,0x2b,0x40,0xab,0x9d,0xd9,0x8d,0x20,0xf3,0x09,0xaf,0xd5,0x0c,0x97,0xa2,0x03,0x13,0xd4,0xfc,0x00,0xd9,0x3b,0x4e,0x4b,0x42,0x3a,0x7f,0xf4,0x12,0xf2,0x3b,0xfa,0x2b,0xfd,0xce,0x04,0xef,0x63,0x06,0xd1,0x00,0x15,0xfd,0x20,0xee,0xf5,0x43,0x9a,0xec,0xa3,0xd5,0x54,0x81,0xb9,0x4c,0xfb,0xb1,0x8d,0x2a,0x3c,0x4d,0xec,0x28,0x06,0xfe,0xd5,0xea,0xea,0x0a,0x43,0xf3,0xf6,0x19,0xf1,0x7f,0x4f,0x11,0x2c,0xda,0x63,0xd0,0xc7,0xcb,0xb0,0x46,0x19,0x1e,0x6d,0x38,0x73,0x9f,0x69,0xf2,0xea,0x42,0xd8,0x27,0xc0,0x16,0x0c,0x33,0xb1,0x8a,0x27,0x87,0xce,0xb6,0xd6,0x90,0x7f,0x0f,0xbf,0x1f,0xbf,0x00,0x00,0x00,0x00,0xc6,0x6d,0xff,0xff,0x04,0x00,0x00,0x00,0xa0,0x10,0x00,0x00,0xfe,0xaa,0x15,0xf3,0xf1,0x93,0xef,0xff,0x78,0x21,0xfb,0xe7,0xd6,0x0f,0x02,0x28,0xee,0x53,0xd6,0x12,0xea,0xb5,0x11,0x13,0xd9,0x23,0xea,0x4f,0x10,0xd6,0x17,0x81,0xee,0xce,0xae,0x29,0x03,0xac,0xb9,0x31,0x2e,0x34,0xf6,0xd2,0x2b,0xf9,0x1e,0x93,0xc9,0xf8,0x31,0xb9,0xe7,0x1a,0xfc,0xfa,0xf5,0xd6,0x11,0xfc,0xe5,0x0b,0x0a,0xef,0xf0,0x29,0xc5,0xf9,0x00,0x37,0xf0,0x0b,0x04,0xf9,0xec,0xc7,0xe4,0x9d,0xfd,0xca,0xb6,0xaf,0xaf,0x30,0xd5,0x85,0xc4,0x47,0xf3,0x3b,0x2b,0xdd,0x1a,0xf1,0xe0,0x1c,0x24,0xa3,0x28,0x4b,0x00,0x40,0x1a,0x8c,0x6d,0xef,0x42,0xee,0xcd,0xb1,0xfa,0x2b,0xeb,0xb5,0xb2,0x3c,0xee,0xfd,0x64,0xe8,0x2d,0xf3,0x00,0x27,0x12,0xf9,0x14,0x62,0x10,0x96,0x0c,0xa7,0xd6,0xc5,0x2d,0xbc,0xdd,0x1e,0x2b,0x19,0xf7,0x10,0x05,0xd2,0xed,0xab,0xfa,0x3e,0x1a,0x0f,0x27,0x2d,0xed,0x4a,0xff,0x14,0xf4,0xf3,0x1e,0x31,0xc2,0xdb,0x3a,0x70,0x33,0x00,0xfc,0x34,0x22,0xce,0x12,0x44,0x13,0xea,0xd3,0x42,0x0b,0x47,0x20,0x60,0xec,0x39,0xf9,0x1e,0x0c,0x62,0x27,0xff,0x14,0xc4,0x09,0x66,0x01,0x1b,0x17,0xab,0xe0,0x1f,0xe1,0x0d,0x44,0x31,0x39,0xf1,0x3b,0x35,0x30,0xf8,0x02,0xbd,0x12,0xf0,0xc9,0x66,0x32,0xd1,0x6c,0x23,0x31,0x23,0x0a,0x2c,0x1c,0xff,0xe3,0x29,0x3c,0x0a,0x12,0xe8,0x8f,0x40,0xe6,0x4c,0x0c,0x40,0x20,0x09,0x0f,0xe5,0x1c,0x13,0x68,0x22,0x0d,0xc6,0x47,0x2d,0x01,0xf0,0xfb,0xf0,0x4e,0xa0,0x2f,0x03,0xee,0x21,0xc0,0xb7,0x7f,0x0f,0x04,0xad,0xb8,0x17,0xe9,0xc6,0x1f,0xe5,0x0d,0x78,0x0b,0x0d,0xaa,0x02,0x0a,0x3f,0x18,0x41,0xed,0xfe,0xa7,0x25,0x11,0xfc,0x34,0xa0,0x30,0x13,0xe7,0x1c,0x6f,0x2f,0x1e,0xf0,0x2b,0xfe,0x2c,0xcb,0x25,0x0f,0xdd,0x31,0x0c,0x40,0x11,0xda,0x0d,0xde,0x30,0x1e,0x12,0x40,0x05,0x54,0xee,0x1b,0x2e,0xe5,0x3c,0x47,0xea,0x1a,0x03,0x11,0x26,0x29,0x19,0x07,0x03,0xe0,0x1b,0x1a,0xfa,0xe9,0xec,0xde,0x19,0xdd,0x0e,0xf1,0xf7,0x1a,0x51,0xd2,0x48,0xa5,0xc4,0x03,0xf9,0x00,0x0c,0x01,0x16,0x10,0xfe,0xc6,0xfb,0x0b,0x02,0xd9,0x13,0x15,0x19,0x1f,0xe7,0xff,0x50,0xe7,0xef,0x23,0xf7,0x8d,0xfe,0x1f,0x34,0x09,0x14,0xfa,0xf8,0x19,0xde,0x02,0x04,0xf4,0xb9,0xf6,0x1a,0x28,0x1c,0xe5,0x04,0xd9,0x31,0x08,0x03,0x0e,0x0a,0xf4,0xde,0x11,0xec,0xef,0x4a,0x1e,0xc8,0xb4,0x00,0x01,0xda,0x2f,0xdc,0x1e,0x02,0xf9,0x04,0x1a,0xea,0x1c,0x05,0xd1,0xd8,0x24,0xc7,0xbc,0x20,0xfd,0x05,0xf4,0x20,0x17,0xd8,0x00,0x81,0xf2,0x1d,0xe7,0x11,0xb1,0xfe,0xf4,0x2b,0x30,0x04,0xfd,0x94,0x31,0x01,0xe0,0x08,0x04,0xc6,0x00,0x1a,0x0a,0x20,0x3b,0xba,0x3e,0x3a,0xec,0x2f,0x14,0x05,0x44,0x18,0xf3,0x01,0x27,0x11,0xe1,0x0b,0xed,0x29,0xdb,0x12,0x04,0xe0,0x49,0x2f,0xc3,0xd1,0xd3,0x1b,0x63,0xb6,0xf8,0x0b,0x5c,0xe4,0x50,0x3d,0xd9,0x2d,0x5e,0xf7,0xbb,0xe1,0xf7,0xd6,0x0d,0x2a,0x09,0x20,0x3e,0x1b,0xd7,0x53,0xbe,0xe9,0xd1,0xfe,0xd0,0x4e,0xbb,0x19,0x96,0xfd,0x00,0x1e,0x0f,0x17,0x94,0xf3,0xdc,0x0c,0xe2,0x31,0xf2,0xab,0xdd,0x11,0xd1,0x24,0xc8,0x39,0xf1,0xc0,0xd1,0x03,0x1c,0xe9,0xe1,0xcc,0xe1,0x81,0xdc,0x1e,0xb3,0xd0,0xfe,0xc4,0x04,0x0a,0x08,0x0c,0x10,0xe0,0x20,0x05,0x09,0x0f,0x0a,0x45,0x34,0x01,0x1b,0x0b,0x12,0x26,0x43,0xb6,0xd2,0xf3,0xf7,0x10,0x1a,0x05,0xfe,0xe1,0x65,0x09,0x3b,0x0f,0x14,0xee,0xe2,0x09,0x28,0xbd,0xdf,0xfa,0x14,0xb7,0x05,0xe7,0xcc,0x07,0x39,0x2e,0x3d,0xc6,0x1a,0x35,0xec,0x21,0x40,0x1e,0x7f,0x1f,0xf5,0x20,0x2e,0x20,0x54,0xbe,0x1a,0xcb,0x27,0xf5,0x24,0x18,0xd2,0x3f,0xda,0x03,0x09,0x1c,0x24,0x05,0x2d,0x2c,0xfa,0x26,0xe4,0xee,0x2b,0xed,0xec,0xc1,0xdc,0xd0,0xeb,0x2e,0xb9,0x04,0x5a,0xdd,0x95,0x3c,0x12,0xe5,0x09,0x19,0x3f,0xd2,0x09,0xba,0xf2,0x1b,0x1b,0xc0,0xfa,0x03,0x20,0x1f,0xed,0xee,0xff,0xf6,0x11,0x29,0x12,0x53,0xb3,0x17,0xe4,0xb2,0xcf,0xfe,0x1a,0xde,0xdf,0x07,0x01,0x02,0xf9,0x22,0x14,0x08,0xfb,0xe8,0x30,0x3d,0xe4,0xf6,0x05,0xf9,0xd5,0x10,0x33,0xe2,0xe7,0x14,0xf8,0xd6,0x04,0xc4,0xec,0xcb,0xe8,0x0f,0x06,0xfd,0x08,0x64,0xf6,0x0b,0x1c,0x25,0xe4,0x0f,0xf2,0xc8,0xd5,0xe5,0x45,0x16,0xe9,0xe6,0x28,0x44,0x2e,0x05,0xff,0xb1,0x2b,0xe3,0xeb,0x32,0xe1,0xe3,0xde,0x54,0x22,0xe6,0x1f,0x43,0x14,0x1f,0x30,0x43,0xf0,0x2c,0x03,0x27,0xfd,0x37,0x3f,0x1d,0x31,0xea,0x0f,0xb6,0xe5,0x07,0x13,0xf4,0x2e,0xf7,0x01,0x18,0xde,0x16,0x39,0x09,0xe4,0x0f,0x0f,0x0b,0xf6,0x33,0x22,0x0f,0x1e,0x06,0x03,0xcc,0xe9,0x24,0xf8,0x3d,0x04,0x47,0xf0,0x39,0xbc,0x06,0x1d,0xf6,0x33,0x1c,0xe9,0x00,0x28,0xe9,0xee,0x2e,0x11,0x09,0x0b,0x0a,0x06,0x2f,0x04,0xfb,0x14,0xde,0xf0,0x10,0x17,0x0b,0xe7,0x1a,0x06,0x17,0x09,0x0a,0x41,0x0f,0x0c,0xbe,0x0f,0x18,0x32,0x17,0xc5,0xf4,0xfe,0x0d,0xfa,0xfa,0xf7,0xd1,0xf9,0xd9,0xd1,0x44,0x11,0xf8,0x33,0xd0,0x1f,0x18,0x32,0xe5,0x13,0xfe,0xe1,0x0a,0xe7,0xfb,0x0e,0xeb,0x17,0xdc,0xee,0x0b,0x16,0x03,0xdb,0xd1,0x24,0x1a,0xd9,0xdf,0x04,0xdf,0x23,0xe6,0xe6,0x09,0x11,0x27,0xeb,0xfe,0xbd,0x00,0xff,0x04,0x34,0xe6,0x0d,0x07,0x7f,0xfc,0xb2,0xf1,0xdd,0x11,0x11,0x24,0xad,0x29,0x30,0x02,0xe7,0x19,0xf6,0xd7,0x0c,0x16,0xd6,0xdc,0xd5,0x75,0x0c,0xb2,0x1b,0x06,0xb0,0xed,0xf5,0x0c,0xb7,0xb6,0xde,0xe1,0xd3,0x81,0x06,0x01,0x3b,0xec,0xdd,0x2b,0x0e,0x11,0x0f,0x3c,0x1c,0xb1,0x04,0xb3,0x0f,0xc7,0xe2,0xd5,0xf1,0x26,0xec,0x21,0xdd,0xd9,0x09,0xee,0xe1,0x1f,0xcb,0x15,0xdf,0xb9,0x0e,0xe0,0x47,0x29,0xaa,0x00,0xca,0xea,0x48,0xd5,0x35,0xd5,0x9b,0x97,0x50,0xcc,0xd5,0xd4,0x1a,0x54,0x25,0xd9,0x04,0x28,0x07,0x26,0xf3,0xf5,0x27,0xf9,0xd7,0x09,0x15,0xef,0x99,0x11,0x34,0x49,0x3a,0x36,0xba,0xf6,0x28,0xce,0x43,0xf6,0x27,0xee,0x58,0x4c,0x21,0x52,0xc9,0x00,0x02,0x90,0x2b,0xa6,0xcf,0x06,0x47,0xf2,0xda,0x4e,0x65,0xea,0xd0,0xf9,0x4d,0x41,0x0e,0xc7,0x10,0xb9,0xbc,0xc8,0xa9,0x37,0xba,0x1c,0x1d,0x24,0x09,0xfc,0xfb,0xf2,0x24,0xea,0xf9,0x35,0xf0,0xc0,0xe6,0xb8,0x0f,0xdc,0xd0,0x25,0x20,0x3b,0xc9,0x28,0xea,0x7c,0xe7,0x16,0xe0,0xe6,0xe6,0xe7,0x12,0xdc,0xe6,0xed,0xed,0xce,0xfb,0x28,0x06,0x06,0x14,0xf5,0x21,0xe5,0xde,0xc3,0x34,0x31,0x0e,0xf1,0x2b,0xb8,0x06,0xff,0x39,0x1a,0x21,0xe3,0xec,0x28,0x0d,0xf4,0xc6,0xe0,0x2d,0x07,0xfd,0xe9,0x21,0xea,0x03,0xba,0x09,0x57,0xfa,0x03,0x17,0xfb,0xd0,0x24,0xf7,0x18,0xd6,0x3c,0xcc,0xe3,0xaa,0x37,0x0a,0xe1,0x1e,0x38,0xed,0x31,0x27,0x43,0x01,0x08,0xa6,0xf5,0x0f,0x1f,0xcb,0x3a,0xfb,0x10,0xe5,0x14,0xf5,0xfc,0xf0,0x01,0xb8,0xf4,0xd5,0xfa,0x0f,0x0b,0x25,0x43,0xd5,0xcc,0x16,0xef,0xbd,0x38,0xda,0x06,0x18,0xf5,0xef,0xff,0xfc,0xbb,0xdc,0xf8,0x06,0x09,0x38,0x35,0xfe,0xce,0x7f,0x25,0xf7,0xe4,0x58,0x12,0x32,0x0c,0xd6,0x0f,0xf2,0x08,0xc5,0x19,0xdb,0xf9,0x32,0xeb,0x08,0x24,0x0a,0xb2,0x07,0x17,0x38,0x0e,0xf0,0x14,0x4d,0x1e,0x3a,0xd7,0xb6,0xe1,0xf9,0x41,0xf1,0x4a,0xab,0x24,0x4b,0x49,0x4c,0xd5,0x26,0x03,0x2d,0xd9,0x0e,0x07,0xce,0x2d,0x92,0xdb,0xd4,0x03,0x01,0x2b,0x0e,0x39,0xce,0xb6,0x2c,0xf8,0x33,0x32,0x3e,0xe7,0x1a,0x35,0xc8,0x17,0xe5,0xc3,0xfe,0x9e,0xed,0xd9,0x0b,0xc6,0x14,0x0a,0xdc,0x1a,0xc6,0x14,0x2b,0x02,0xf2,0x2a,0x89,0xe8,0xf3,0x05,0x3a,0xeb,0xec,0xe1,0x37,0xe5,0x13,0x1f,0x26,0x4c,0xee,0x1d,0xff,0xd6,0xb3,0xf6,0x20,0xf2,0x00,0xfd,0xd4,0x2d,0x3d,0x2d,0xac,0xd6,0xaf,0xeb,0xf0,0x7f,0xfb,0xce,0xb2,0xcd,0x49,0x11,0xde,0x01,0x16,0xdb,0xfa,0x14,0x01,0x3e,0x47,0xe0,0x43,0x07,0xed,0x08,0x0e,0xf1,0xab,0xeb,0x19,0x05,0xe9,0xd2,0x63,0x3c,0xd8,0xda,0xd7,0x12,0x43,0xb2,0xdc,0xe2,0xf8,0xae,0xda,0x0e,0xdb,0xe1,0x45,0x10,0x22,0xe6,0x42,0xb3,0x3c,0xd3,0xc1,0xfc,0x3c,0x0b,0x43,0x21,0x2d,0xe9,0xe2,0x34,0x07,0x17,0x38,0x12,0x03,0xe0,0xf6,0x3e,0xf7,0x10,0xbf,0x0c,0xda,0x2e,0x36,0xfb,0x01,0xd6,0x06,0x05,0x26,0x04,0x04,0x42,0xd6,0x2c,0x09,0xf3,0x0b,0xc5,0xc4,0xf2,0xe1,0x38,0xf6,0xe9,0x3a,0xc4,0xb0,0x15,0xbc,0x32,0xfb,0xf5,0x00,0xdb,0xda,0xd4,0x09,0x16,0xd9,0xf3,0xd8,0x00,0x7f,0x10,0x06,0x23,0x14,0x1c,0x03,0x1f,0xf8,0xff,0x3a,0x04,0x76,0xf7,0xfa,0xdd,0xee,0x3a,0xe4,0x50,0x23,0x2c,0x43,0xea,0x22,0x06,0x24,0xbf,0x26,0x3a,0xfd,0x41,0x1c,0x2d,0x15,0x00,0x10,0xfa,0x2b,0xff,0xf2,0xd7,0x2e,0xf3,0xc2,0xe4,0x1b,0x0d,0xe8,0xca,0x0a,0x01,0x25,0xfd,0x1a,0xe9,0x2c,0x34,0x0d,0x05,0x00,0x52,0x0e,0xdf,0xed,0xa3,0x10,0x05,0x0a,0xca,0xeb,0x34,0x22,0x34,0xfc,0x1d,0xef,0xfc,0xef,0x2d,0xde,0xde,0xdf,0x1e,0xdc,0x0d,0xff,0x28,0xcd,0x01,0xee,0xdf,0xf6,0xe7,0x1e,0xcb,0xe9,0x0b,0x33,0x96,0xcd,0x08,0xc5,0xf9,0xff,0xd2,0xe3,0xdc,0xdc,0x2a,0x17,0xff,0xfb,0x13,0xe5,0xe9,0x29,0x11,0xe4,0x05,0x31,0xf8,0xce,0x81,0xfd,0x05,0x23,0x14,0x35,0x0e,0x23,0x27,0x18,0x17,0xdc,0x0a,0x12,0x1f,0x17,0xf5,0x2d,0xa6,0x13,0x00,0xf7,0x22,0xcf,0x06,0xbb,0x3a,0xe0,0x04,0x05,0xee,0x04,0xf1,0xeb,0x06,0xf9,0xd9,0xee,0x3b,0xf4,0x27,0xef,0x24,0xed,0x3b,0xe8,0x19,0xe0,0x03,0x1b,0x05,0xef,0xf4,0x1b,0x23,0xf0,0x00,0x16,0x0e,0x1a,0x16,0x00,0xde,0xed,0xd9,0x35,0x25,0x1b,0xe8,0x14,0x1d,0xe1,0x0e,0x10,0xe7,0x30,0xf9,0x01,0xff,0xeb,0xfd,0x28,0xf8,0xee,0xf2,0x36,0xc7,0xd1,0x34,0xe6,0x0c,0x01,0xe9,0x12,0x5f,0xf6,0x1b,0xff,0xfe,0xd6,0x0e,0xfa,0x49,0x04,0xf0,0x14,0x37,0x20,0xdf,0xd6,0x22,0xe1,0xd0,0xf1,0x06,0xdb,0xfe,0xf9,0xe5,0xd7,0x0c,0xf2,0x13,0x17,0x11,0x30,0x1f,0x03,0x27,0xe7,0x17,0x1c,0xc6,0xd7,0x2c,0x3b,0x24,0x51,0xf9,0xeb,0x26,0x03,0x2c,0x02,0x03,0x05,0x17,0x0c,0xd1,0x23,0xf8,0x04,0xac,0xd4,0xd7,0x0a,0x35,0x0a,0x63,0x17,0x4d,0x3a,0xde,0x73,0x5b,0xc6,0x11,0xf9,0x33,0xfc,0x25,0x4e,0xf2,0x48,0xde,0x36,0x44,0xc2,0xe1,0x15,0xfa,0x44,0x2f,0x39,0x0f,0x30,0x3c,0x13,0x40,0xc7,0xb3,0x2e,0x09,0xf6,0xef,0xf5,0xd9,0x05,0xc4,0xe1,0x3d,0xc5,0x1f,0xcc,0xbe,0xed,0xe8,0x3a,0x45,0x3e,0xe7,0xa2,0x0b,0xb3,0x13,0xf3,0x37,0xee,0xf6,0x6a,0xce,0x01,0x14,0xe8,0x2a,0xfd,0x92,0xc8,0x01,0x0f,0x2e,0x0f,0x43,0x31,0x01,0xf6,0x09,0xd8,0xde,0x10,0x7f,0x35,0x20,0x2e,0xd5,0xed,0xd1,0xe1,0x09,0x49,0xfd,0x3d,0xe2,0x2c,0xd8,0x32,0xe9,0xd6,0xed,0x94,0xff,0x1e,0xdc,0x2f,0x06,0x0f,0x1d,0x6b,0x50,0x0b,0x38,0x02,0xf0,0x18,0xea,0xfb,0x0f,0x37,0x28,0xec,0x16,0xec,0x09,0x10,0x03,0xfa,0x2c,0x00,0xdf,0xe9,0x21,0x28,0xd3,0xf9,0xf9,0x01,0xea,0xfc,0xf0,0x06,0xcf,0xe8,0x35,0xfb,0x1d,0xf6,0x38,0x10,0xe1,0x05,0xe6,0x12,0x9d,0x7f,0x19,0x29,0x18,0x19,0x02,0x02,0x04,0x27,0xe2,0xff,0xfa,0xdb,0x01,0x1d,0x16,0x0b,0xfd,0xfd,0xff,0x1f,0xdb,0xea,0x0a,0x41,0x02,0x3d,0x17,0xf7,0xe2,0xed,0xf4,0x0b,0x0e,0x33,0x26,0xc7,0xf7,0x68,0xfb,0x26,0xce,0xf1,0x31,0x21,0x28,0x2f,0x7d,0x31,0xd1,0x00,0xf0,0x07,0xfe,0x05,0xc6,0x93,0x3b,0xc8,0xf6,0x4c,0x39,0xf6,0x32,0x39,0x0b,0x3c,0x9e,0xe3,0x21,0xdc,0x36,0xfe,0x00,0xe4,0x3f,0x0a,0xfc,0x06,0x06,0x1e,0x08,0x0b,0x1d,0x08,0xc7,0x07,0xc3,0x24,0xf7,0xd9,0x47,0xd0,0x16,0xfb,0xea,0xe4,0x03,0x24,0xd5,0xee,0x9a,0xc7,0xec,0x2d,0x06,0x52,0x05,0x17,0xe2,0x0d,0xe6,0x08,0xd9,0xec,0x0d,0xfa,0xcd,0xed,0x03,0xe0,0xe1,0xc8,0x2d,0x52,0x11,0x45,0xd8,0x23,0xf1,0x00,0x01,0x2c,0xd7,0xda,0x57,0xed,0xf1,0xfd,0x16,0xf7,0xcc,0xe3,0xed,0x16,0xbb,0xa6,0xdd,0x1b,0xfb,0x0d,0xb7,0x00,0x13,0xee,0x07,0x20,0xfc,0xb7,0xc1,0xf6,0x35,0xf8,0xec,0x13,0x0c,0xf0,0xca,0x37,0xe3,0x03,0xf9,0xd0,0x2f,0xd5,0xa4,0x29,0x0b,0xe0,0x24,0x25,0xdf,0x03,0xdd,0xc1,0x28,0x1c,0x2e,0xfe,0xc1,0xf0,0xf7,0xef,0xce,0xd5,0x81,0xfa,0xc2,0xe4,0x00,0xc9,0x3b,0xfb,0xa3,0xfe,0xee,0xd4,0x41,0x2b,0xf0,0xcd,0x0b,0xd6,0xbf,0x40,0x15,0x2a,0x41,0xe4,0x21,0x05,0x7f,0x2e,0xee,0xca,0x09,0xf4,0xf5,0xb7,0xfb,0x05,0xf3,0xed,0xd9,0x22,0x57,0x21,0x1b,0xfe,0xd5,0x2c,0x50,0x41,0x0b,0xe1,0xfd,0xf4,0xc6,0x9b,0x05,0x95,0xcf,0x1d,0x13,0x21,0xe9,0x1e,0xef,0xde,0xfa,0xc5,0xde,0x4a,0x01,0x22,0x21,0x23,0x3a,0x6d,0x4b,0x3d,0x3b,0x12,0xd6,0x2e,0x07,0xcc,0x0f,0x21,0xf7,0x0a,0x8c,0xf9,0x4f,0x06,0x19,0x07,0x03,0xe8,0xb8,0x02,0x7c,0x22,0xd5,0x5e,0xd0,0xfb,0xc8,0x13,0xba,0x07,0xe1,0x15,0x32,0x4c,0x00,0x2a,0x2a,0xe4,0xee,0x33,0xff,0x9a,0x4a,0xf7,0xd6,0xdf,0x1f,0xe0,0xef,0x10,0xdb,0x93,0xf9,0xd7,0x26,0x04,0xe0,0xeb,0x26,0x02,0xec,0x1e,0x0f,0x21,0xbe,0x14,0x05,0xd0,0x41,0x19,0xdf,0x05,0x15,0x5d,0x2e,0xf8,0x10,0xed,0xe3,0xcd,0x41,0xe9,0xca,0xec,0x35,0x2d,0x06,0x0d,0x44,0xbf,0xa3,0x79,0xe2,0xc5,0x30,0x0d,0x21,0x28,0x9d,0xc8,0x06,0x42,0xdb,0xd9,0x6c,0x9c,0x03,0x26,0xb5,0xed,0xb5,0x71,0x76,0xdf,0xd3,0xa2,0x1b,0x32,0x2b,0x45,0xf0,0x5a,0xcc,0x1f,0x06,0xe8,0x35,0xb5,0x1b,0xe0,0x47,0x81,0xb7,0x6c,0xf9,0x37,0x09,0xfd,0x13,0x14,0xed,0x1b,0x1a,0xfa,0x44,0x3c,0x22,0xd6,0xde,0x23,0x0c,0xfe,0xee,0xdb,0x10,0xcf,0x08,0xc7,0xbb,0xed,0x29,0x22,0xdc,0x2a,0x52,0xda,0xf7,0x23,0xc2,0x06,0xf5,0x00,0x0a,0x47,0x13,0xe1,0xf0,0x17,0xf1,0x1f,0x4c,0xc6,0x1f,0x32,0x3f,0xb0,0x03,0xde,0x02,0xfb,0x0b,0x15,0x39,0x0f,0xe6,0x13,0x1b,0xef,0xe9,0x1d,0x3a,0xbf,0x5f,0xd4,0x00,0x1e,0xd8,0xf1,0x2a,0x06,0x2b,0x06,0xfb,0x94,0x04,0x0a,0x1d,0x34,0x46,0x1d,0xe1,0x17,0x2a,0x06,0x33,0xf6,0x3e,0x0d,0x67,0xe0,0x21,0xe9,0x0c,0x0b,0x20,0x40,0x20,0xfa,0x07,0x08,0x9f,0x3f,0x02,0x29,0xfb,0x13,0x13,0x0b,0xfc,0xdb,0xff,0xcd,0x0a,0xda,0xb3,0xbe,0x06,0x2d,0xfe,0x1d,0xdf,0x27,0xb6,0xfa,0xd9,0x1b,0x46,0x4e,0xd1,0x17,0x07,0x06,0x0b,0xd7,0xd5,0xfd,0x01,0x21,0x31,0x27,0x12,0x13,0x40,0xe3,0xfc,0xef,0xef,0xbb,0xdb,0xf8,0x2e,0x2d,0x14,0x7f,0x0b,0xcf,0xd7,0x11,0x24,0x0e,0x17,0xf0,0x27,0x1d,0x09,0xdb,0x36,0x08,0x46,0x37,0xf9,0x4e,0x19,0x14,0xdc,0x35,0x09,0x5a,0xdb,0x1d,0x2d,0x2a,0xe4,0xe5,0xe2,0xcd,0xfc,0xe8,0x20,0x0f,0xef,0xb4,0x3a,0xfa,0x08,0xd9,0x2b,0xe5,0xea,0xe9,0x0f,0xd6,0xa8,0xe8,0xff,0x08,0xe2,0x01,0x7f,0x22,0x26,0xf4,0xfa,0x0a,0x22,0x2d,0xf9,0xe2,0x25,0xdb,0xd8,0xfd,0xf8,0xd8,0xef,0x03,0x14,0x0b,0x13,0xd9,0x1d,0xf2,0xdd,0x38,0x52,0xd5,0x01,0x41,0xff,0x0e,0x13,0xd2,0xfc,0xd3,0x01,0xf7,0x1a,0xd2,0x3e,0xe0,0x01,0x5a,0xfd,0x1d,0x1c,0x33,0x25,0xa9,0x16,0xf5,0xcd,0xc7,0xf2,0xfe,0x1b,0xae,0x38,0x03,0xf6,0xe0,0x07,0x1a,0xa3,0xfe,0x49,0x0d,0xce,0xf5,0xc7,0x3a,0x3a,0x0d,0xe7,0xf8,0xe2,0x42,0x1e,0x44,0xb7,0xfe,0x05,0xf6,0xff,0x0b,0x0e,0x05,0x39,0xea,0x19,0x12,0xf0,0x32,0xe9,0xf8,0x24,0xe1,0xf8,0x09,0xfd,0xeb,0xdc,0x04,0x3d,0x05,0xd6,0xc3,0x19,0x84,0x2a,0xf4,0x29,0x48,0x43,0x14,0xe0,0xfb,0xed,0x2f,0xfa,0xee,0xde,0xda,0x1d,0x15,0xdf,0xfe,0x81,0xd8,0xf2,0xfd,0xd9,0x19,0xee,0xb6,0x29,0x20,0xfa,0xf2,0xf8,0xd1,0x15,0x04,0x16,0x2b,0xe7,0x4b,0xbd,0xec,0x1a,0xed,0x3a,0x20,0x07,0xef,0x03,0x25,0x18,0xca,0x04,0xed,0x00,0xeb,0x99,0x1c,0xf8,0xe5,0xf0,0x18,0x37,0xd3,0xde,0xc1,0x12,0x2d,0xf3,0x44,0xc5,0x5f,0xff,0xac,0xdf,0xdc,0xb9,0xd2,0x04,0x09,0x09,0xed,0x03,0xfa,0xf8,0x3f,0xc7,0x07,0x23,0xeb,0x23,0xd4,0xf0,0x42,0xd6,0x1e,0xe1,0xf0,0x28,0x21,0x04,0xfa,0x28,0x0e,0x0f,0xdc,0xfe,0xe0,0xd8,0xc2,0x2e,0x13,0xf8,0xe7,0xcc,0x09,0x45,0x0d,0x11,0x1f,0x06,0x01,0x13,0xfe,0xff,0xd1,0x11,0x12,0x1b,0xd6,0xd1,0xd1,0xf8,0x0c,0xfc,0x28,0xf6,0x16,0xe5,0xf5,0xea,0x06,0xe9,0x2e,0x3b,0x1c,0x17,0x36,0xed,0xf3,0xc9,0x02,0xd6,0xb8,0xa4,0x09,0x1a,0x2b,0xfc,0xe1,0xb4,0xd1,0x27,0xfb,0xe7,0x0c,0x12,0xe5,0xee,0xf9,0x22,0xec,0x97,0xd6,0x04,0xc1,0xb8,0xed,0xe4,0xf9,0x31,0x4e,0xc8,0x0c,0xc3,0x34,0xe7,0x0a,0x08,0x08,0x14,0x4b,0xfb,0x16,0xde,0xdf,0xde,0xdb,0xbe,0xe0,0xeb,0x19,0x0e,0x3e,0xfe,0xee,0xd9,0x14,0x09,0xf0,0xf6,0x14,0x20,0xe6,0xf9,0xd6,0x2e,0xbd,0x12,0x12,0x59,0xca,0xe4,0xe6,0xde,0xb6,0x02,0xd0,0x05,0xdf,0xc8,0x09,0x12,0x14,0xdc,0x08,0xd7,0xf8,0xa6,0xc4,0xbd,0x11,0xea,0x0d,0x09,0xd9,0x0c,0xf9,0xe6,0x7f,0xff,0x54,0xdb,0xbc,0x0c,0xf8,0xee,0x03,0xfb,0x2b,0x4b,0x16,0x01,0x11,0x2d,0x34,0xdf,0xbb,0x18,0xd5,0x75,0x1b,0x11,0x09,0x20,0xec,0x45,0xd5,0xc2,0xe2,0xed,0xe3,0x2c,0x28,0xf6,0xc6,0x17,0xc4,0xf8,0xee,0x17,0x24,0x09,0x4e,0xe7,0xe3,0x3b,0xf1,0x05,0x03,0xf8,0xe9,0xf6,0xaf,0xc3,0xd9,0xd9,0xe3,0x47,0xa1,0xae,0xac,0xe9,0x8d,0xf6,0xe1,0x13,0xef,0x19,0x18,0xb1,0xd1,0xd8,0xf2,0x5c,0x36,0xe5,0xab,0x49,0xf9,0xfa,0x11,0x00,0x49,0xfe,0x12,0x26,0x1a,0x06,0xb6,0xa7,0x07,0xc9,0x13,0xc7,0xde,0xbc,0xf3,0xd7,0x81,0x1a,0xf0,0xb8,0x3e,0x22,0xe9,0xff,0xc7,0x87,0x4e,0xee,0xf0,0xe3,0xf6,0xd7,0xbc,0x5c,0x34,0xf2,0x11,0x27,0xf9,0xf8,0x19,0x23,0x54,0xe0,0x30,0x27,0x6e,0x3c,0xd7,0x35,0xb6,0x0a,0x2e,0xd4,0x11,0x21,0x13,0xf8,0xbc,0x9c,0xf3,0x09,0x33,0xee,0xad,0xb6,0xf0,0xe3,0x05,0x03,0xff,0xeb,0xdd,0xc4,0xe1,0x0a,0xeb,0xfc,0x67,0xf0,0xf4,0xee,0xf6,0xc8,0x57,0xe9,0xbb,0xec,0xf7,0x5c,0x34,0x49,0xbf,0xa4,0xab,0xf2,0xce,0x27,0xe2,0x07,0xe6,0x4e,0xe9,0xc3,0x1f,0x06,0x05,0xf4,0xb6,0xc0,0xea,0xce,0x17,0x17,0x94,0xf3,0xf9,0x2f,0x17,0x26,0xbe,0xe3,0xdb,0xd4,0x11,0x25,0xfc,0x0b,0xfc,0x36,0x3f,0xf5,0x1b,0xce,0x4a,0xf5,0x1f,0x43,0x00,0xfb,0xdb,0xf4,0x15,0x8e,0x1c,0xa2,0xf0,0x16,0xc6,0x17,0xde,0x45,0x1f,0x36,0xba,0x27,0xdc,0x03,0xf5,0xf9,0x2c,0xd8,0x01,0xd8,0xe5,0xf7,0xef,0xf6,0x39,0xf2,0xf9,0xe4,0xf3,0xf1,0x7f,0xfd,0x27,0x26,0xce,0x21,0x3e,0xd7,0x22,0x31,0x15,0x08,0x11,0x00,0xd0,0xf0,0xed,0xff,0xcb,0x08,0xd7,0xe1,0x65,0x18,0xcd,0xcf,0x16,0xeb,0xb5,0x32,0x4b,0xa2,0x09,0x0e,0x1f,0x04,0x09,0x40,0xd1,0xf5,0xd1,0xe0,0x36,0xe0,0xf6,0xee,0xf5,0xfa,0x03,0x1d,0xf6,0xf6,0xed,0xed,0x05,0xfe,0x1b,0xc8,0xd1,0x2d,0xfe,0xec,0x12,0xbe,0xb3,0xda,0xf2,0x3b,0xea,0xf7,0xc9,0x0a,0x2d,0xee,0xf5,0xe5,0x24,0xb3,0x10,0xf7,0x13,0xfe,0x0d,0x36,0x5f,0xc2,0x06,0x1b,0x18,0xe8,0x26,0x1a,0x2b,0xff,0xfe,0xf1,0x16,0x12,0x43,0xa3,0xcf,0xf9,0xf3,0xe5,0x37,0xdc,0xd6,0x3a,0x09,0x0c,0xc4,0x26,0x3e,0x20,0x1c,0x0a,0xe7,0x0a,0xe3,0x16,0x19,0x3d,0x0a,0x0e,0x10,0x15,0x30,0x14,0x31,0xcc,0x06,0x32,0xc3,0xe1,0x25,0x40,0x0c,0xe9,0x02,0xbf,0xdc,0xc3,0xfe,0x04,0x17,0xc1,0xe8,0xcc,0x04,0x11,0x07,0x03,0x00,0xfb,0x05,0x21,0xe3,0xc6,0x67,0xf5,0xe3,0x58,0x25,0x11,0x2c,0xc9,0x16,0x20,0x33,0xf4,0xcc,0xdf,0x52,0x35,0xd8,0xd7,0xd1,0xc7,0x39,0xde,0xf0,0xf6,0x16,0x17,0x0b,0xdd,0xfb,0xfb,0xf4,0x38,0xde,0xd7,0xdb,0x48,0x75,0x37,0xd2,0x19,0x0f,0x01,0x01,0x18,0x23,0xa6,0xbf,0xbd,0x26,0x09,0xf9,0xd9,0xef,0x5b,0xaf,0xd0,0xd9,0x26,0xf5,0xec,0x23,0x2f,0x11,0xe3,0x56,0xd7,0xe3,0x54,0x1d,0x5a,0xf4,0xe0,0xe4,0x03,0x08,0xf0,0x51,0xbf,0x38,0xf0,0x76,0x7f,0xd5,0x18,0x06,0xfb,0xf5,0x20,0x11,0x0c,0x1b,0x27,0xe4,0x34,0xd7,0x30,0x07,0xf7,0xe1,0x1b,0x3a,0x0a,0x4c,0x12,0x13,0xd9,0xfc,0xf6,0x19,0xdb,0x03,0x3a,0xca,0xd3,0xe7,0x30,0x09,0xf5,0x13,0x32,0xc5,0xd2,0xc3,0x16,0xb3,0xfc,0xe2,0xd7,0xda,0xf0,0xe0,0x34,0x20,0xb7,0xe5,0x26,0xd2,0x4f,0x05,0xe1,0xe4,0x13,0x20,0xd2,0xfc,0xb2,0x1e,0xfb,0xdd,0x0b,0xfb,0xfa,0x38,0xe3,0xed,0xf3,0x3b,0xb7,0x07,0xb8,0x2e,0x26,0x23,0xaf,0xff,0xec,0x1f,0xd9,0x0c,0xdf,0x15,0xe9,0xf6,0x08,0xc6,0xee,0xef,0x8e,0xd0,0x03,0xe6,0xeb,0x1c,0x4e,0xea,0xbd,0xea,0xcc,0xe0,0xc7,0x29,0x0c,0xd4,0xee,0x99,0x2d,0x03,0x72,0x3a,0xca,0xca,0x06,0x37,0x07,0xa0,0xf2,0x41,0xe3,0x75,0xf9,0xe8,0x01,0x01,0x95,0xdc,0xee,0xa7,0x15,0x17,0x81,0xbe,0x15,0x10,0xb6,0xf8,0xed,0x0c,0xd5,0x3b,0x0c,0x44,0x04,0x05,0x02,0x46,0x05,0xee,0xef,0x3d,0xc8,0x36,0x12,0x03,0x13,0x81,0x14,0x06,0x09,0xf5,0x7e,0xb1,0x30,0xf1,0x43,0x25,0xee,0xf8,0x0c,0xfd,0x1d,0x5a,0xde,0xb6,0xc5,0xdc,0xa9,0xfc,0x7d,0xa2,0xee,0x3a,0x3d,0x2e,0x29,0xc1,0xa3,0xd5,0x08,0x3e,0x1a,0xe8,0x11,0x12,0xc5,0x10,0xdd,0xd0,0xbe,0xda,0x0f,0xd3,0x16,0xf8,0x4b,0x1a,0xe0,0xfd,0x08,0xc8,0x04,0x48,0x1a,0xf9,0xe1,0xda,0xe9,0x12,0xf6,0x00,0xee,0x1d,0xb5,0x05,0x20,0x15,0xb2,0x1f,0x00,0xf2,0x00,0x0e,0x0a,0x1e,0x02,0x1f,0x11,0xe8,0xd6,0x1c,0xf9,0x23,0x22,0xfd,0xbf,0x2c,0x12,0xf8,0x19,0xd2,0xea,0xcb,0xa2,0xc4,0xf1,0x93,0x0e,0x62,0x32,0xed,0x4f,0x1f,0x0b,0xf2,0xff,0xec,0xd0,0xee,0xec,0x01,0xdd,0x00,0xc4,0x06,0x0c,0xee,0x82,0x14,0xfb,0xaa,0xd0,0x2e,0x25,0xfa,0x62,0x0a,0x12,0xe6,0xa7,0xd7,0xcf,0xfe,0x05,0xfd,0xee,0xa4,0xbb,0xca,0xfb,0xc8,0xe9,0x38,0xd0,0x0f,0x09,0xd5,0xd0,0xf5,0xb4,0x36,0x1a,0x4d,0x00,0x04,0x09,0x20,0xe3,0xe0,0xf6,0x42,0x1d,0x16,0xda,0x2a,0x08,0x06,0xe2,0xe4,0xeb,0x33,0x58,0xc2,0x05,0x5d,0x40,0x27,0x38,0x02,0xf7,0xcb,0xc9,0x01,0x04,0x0e,0xea,0x31,0xe0,0x32,0xd2,0xe6,0x35,0xd8,0x07,0xd5,0x03,0x0f,0x68,0x01,0xf2,0x2b,0xef,0xca,0x06,0xf8,0x31,0xc1,0x53,0xda,0xfb,0x40,0x01,0xf7,0xd8,0xf2,0x10,0xe2,0xfb,0xf0,0x1d,0x01,0xd8,0xf0,0x0f,0x1f,0xf1,0xea,0x6d,0xf6,0xf0,0x36,0x02,0xd0,0x0a,0x22,0x81,0xfe,0x13,0xf9,0xf3,0xc4,0x30,0xf3,0x11,0xa1,0x28,0xf8,0xd4,0x05,0x2a,0xdd,0x19,0x17,0xe2,0xe2,0x09,0x04,0xfd,0xda,0x28,0xff,0xba,0xea,0xbe,0xee,0x57,0x05,0x00,0x10,0xf8,0x02,0xfc,0x06,0x12,0x16,0x43,0xf1,0xdd,0xbd,0x19,0x3e,0x07,0xde,0x17,0x0e,0xce,0xaf,0x1c,0xeb,0x06,0x0b,0x05,0x21,0xfd,0x1f,0xe1,0xd8,0x03,0x0c,0xec,0x16,0xda,0x0b,0x21,0x12,0xe3,0x31,0x03,0xe1,0xf0,0xe6,0x0f,0xd8,0x14,0xd9,0xf2,0x10,0x11,0xfa,0xd2,0x03,0xed,0x12,0xfd,0x19,0x22,0x27,0xfd,0x1c,0x1b,0x0d,0x10,0x09,0x07,0x16,0x0c,0x21,0x05,0xe5,0x00,0xfe,0xbe,0xdc,0xe3,0xf8,0xfb,0x3a,0xe1,0xcd,0x7f,0x00,0x00,0xdf,0xee,0xc9,0x04,0xba,0xd0,0xfe,0x04,0x01,0x01,0x1f,0xff,0x09,0xf4,0x23,0x0c,0xff,0x02,0x19,0xcd,0x21,0xf6,0x19,0x04,0x32,0xfa,0xee,0x28,0xf7,0x1c,0x1c,0x13,0x13,0xec,0xd5,0xf6,0xd2,0xec,0x25,0x20,0xe2,0x0b,0x0b,0xf9,0xf7,0x30,0xda,0xef,0xe9,0xda,0x38,0xe2,0x00,0xf3,0xd6,0xed,0x1a,0xfa,0xd5,0x08,0x3e,0xff,0xd6,0x0a,0xf1,0x1c,0xfb,0xe2,0x01,0x1a,0xde,0x04,0x19,0xe0,0xd3,0xe5,0x16,0xd6,0xf8,0x20,0x4b,0x13,0x2d,0x38,0x09,0xe2,0x10,0xfa,0x19,0xc1,0x14,0xcd,0x00,0xf6,0xdd,0xe0,0x0f,0x0f,0x06,0x1f,0x05,0x11,0x68,0xf1,0x0c,0xed,0x55,0x06,0x41,0x1c,0x1a,0x2b,0xe7,0x0e,0xdc,0x14,0x01,0xff,0x00,0x24,0x02,0x08,0xf2,0xe7,0xeb,0x0a,0x0b,0x9b,0xad,0x1c,0x3e,0x10,0xce,0x23,0x1f,0x2c,0xe9,0xf6,0x50,0xbf,0x49,0x36,0xeb,0x20,0x00,0xfd,0x01,0xfa,0xf0,0x3b,0xbf,0xcb,0xfb,0xdb,0xc2,0x03,0x04,0xd4,0xfe,0x18,0xe8,0x2f,0xd5,0x14,0x0b,0x35,0x47,0xf0,0xf4,0xc1,0xd9,0x47,0xfb,0xeb,0x0a,0xeb,0x52,0xd9,0xfd,0x35,0xdd,0xf7,0x09,0xb3,0x16,0x1c,0xfd,0x21,0x20,0xf2,0x7f,0xe7,0xf2,0xf0,0x41,0x35,0xf8,0xfc,0xb5,0x0a,0xd6,0xd0,0x35,0xef,0x4e,0x0a,0xad,0x12,0xdd,0x00,0xcb,0xe0,0x02,0xe0,0xcc,0x26,0xd2,0xe4,0xc4,0xd1,0x04,0x56,0x38,0x11,0x2e,0x24,0xfd,0x01,0x0f,0x2f,0xd8,0xd0,0x28,0x29,0x46,0x16,0xaf,0xc4,0xd2,0x23,0x40,0x28,0xa2,0x49,0xf9,0xe8,0x22,0x58,0x2f,0xfb,0xed,0x33,0x18,0xc8,0xd6,0x06,0xcb,0xca,0x21,0x12,0xfc,0x11,0x01,0xa1,0xca,0xc7,0x7f,0x03,0x0f,0xe4,0xb6,0x04,0xd8,0xe3,0xd9,0xfb,0xe1,0xdc,0xed,0x1e,0xfa,0x03,0x3c,0xfe,0x30,0xd3,0xfc,0xb4,0xdf,0x3b,0xaa,0x08,0x18,0xdf,0x44,0xb8,0xd8,0xdf,0xca,0xb1,0xf8,0xa9,0xac,0x02,0x40,0x25,0x3a,0xfc,0x1b,0xf9,0xc1,0xc9,0x1f,0xdc,0xc6,0xcb,0x1b,0x3c,0x1a,0xd3,0xdb,0x26,0x3b,0x25,0xb6,0xfa,0x2f,0x99,0xfd,0xe1,0x0e,0xf7,0xc1,0xf0,0xd8,0xd0,0xfd,0xe9,0x26,0x24,0x39,0xdc,0xd5,0x13,0xe3,0xce,0xb3,0x4f,0x24,0x01,0x11,0xbc,0x4d,0x22,0xea,0x2a,0xb5,0xe7,0xee,0xa6,0xd9,0x01,0x37,0xec,0xcb,0x16,0x12,0xeb,0xca,0x0a,0xb1,0x2e,0x48,0x45,0x4b,0xcb,0x09,0x10,0x16,0x32,0xbc,0x55,0xd1,0xc8,0xcd,0x20,0x2e,0xe4,0x16,0x17,0x05,0xec,0x48,0x52,0xd9,0xbf,0x18,0xd6,0x0c,0x3c,0x4d,0x44,0x2a,0x00,0x00,0x00,0x00,0x76,0x7e,0xff,0xff,0x04,0x00,0x00,0x00,0xa0,0x10,0x00,0x00,0x38,0x81,0xfc,0xb5,0xc6,0x40,0xf5,0x59,0x4a,0xce,0xc0,0x54,0x7b,0xf2,0xee,0xfb,0x72,0xa7,0x11,0xd5,0xf4,0x0c,0x66,0xb4,0xe3,0xfc,0x3b,0xdd,0x47,0x13,0x34,0x0d,0xe1,0xec,0x74,0xfe,0x21,0x37,0x34,0x07,0xf4,0xd7,0xc1,0xc5,0xee,0x06,0x0b,0x03,0x7f,0xd5,0xf1,0x12,0x17,0x1d,0x04,0xf2,0xca,0x3f,0xec,0xb0,0x73,0xee,0x54,0x3c,0x81,0x5c,0x2f,0xd8,0xab,0xc3,0xd7,0xd6,0x08,0x24,0xcd,0xae,0xe3,0xc0,0x81,0x16,0xfb,0x22,0xd9,0xe3,0xfd,0xfe,0xd2,0x0a,0x74,0x1a,0x47,0x81,0xc8,0xa3,0xbc,0x2f,0x5b,0x02,0xae,0x0a,0xa1,0x51,0x41,0xcf,0x88,0xd6,0xac,0xee,0xfc,0x0a,0xac,0xae,0x33,0x26,0x24,0x52,0x36,0x19,0xd7,0x08,0x13,0x29,0x1d,0xf4,0x3e,0xf2,0x7f,0xe1,0xfb,0x93,0xfc,0x55,0xe2,0x25,0xf8,0x0e,0xb9,0xab,0xf2,0xee,0xca,0x2a,0xd3,0x16,0x89,0x4b,0xe4,0x3a,0xda,0xfd,0xa9,0x36,0xbc,0x13,0xc7,0x81,0xbe,0xde,0x1b,0xc3,0x4b,0x43,0xc6,0xed,0x18,0xc8,0xe9,0xc3,0x08,0xc9,0xc9,0x0f,0xc6,0x0d,0x1f,0x51,0x56,0xe7,0x42,0xd1,0x04,0x2e,0x44,0x1f,0xc6,0x81,0x48,0xfd,0x3d,0x29,0xf6,0xc3,0xce,0x4d,0x1d,0x33,0xd9,0x63,0x6f,0x56,0xa8,0x16,0x2b,0xff,0x3a,0xef,0x7f,0xc2,0x0c,0x18,0x39,0xbf,0xc4,0x28,0xb6,0x13,0x32,0xfd,0xdc,0xfd,0x02,0x99,0xf8,0xf7,0xd0,0xe6,0xd3,0x02,0x9f,0xfb,0xd6,0x2f,0x0e,0x22,0xe7,0x16,0x17,0x22,0x09,0xc2,0x81,0xc2,0xed,0xcf,0xfa,0xf4,0xdb,0x10,0xea,0xf9,0xc3,0xfd,0x0f,0xb1,0x35,0xb1,0x3f,0x4c,0x23,0x20,0xe4,0x01,0xea,0x12,0xa5,0xe6,0x20,0x08,0x81,0x13,0x01,0x3a,0x26,0xe2,0x37,0x0d,0x05,0xe0,0x65,0xf1,0xe8,0xb7,0x3d,0xdf,0xd6,0x81,0x08,0x70,0xd5,0xe5,0x2d,0xa4,0x24,0x3b,0xf0,0xec,0xfe,0x34,0x00,0x11,0xd7,0xc7,0x19,0x19,0x12,0x28,0x4f,0x2a,0xea,0x81,0x32,0xd8,0x14,0x21,0xfa,0xd4,0x49,0xfd,0xd5,0x0f,0x23,0xc9,0x0b,0x06,0xdc,0x0f,0x04,0xf0,0xd9,0x4b,0xeb,0xd9,0x01,0xfa,0x25,0x1b,0x1c,0x14,0x72,0x27,0x4e,0xe2,0xd7,0xf8,0xf8,0x57,0x3b,0x19,0x43,0x30,0x03,0x81,0xe6,0x33,0x14,0xec,0x10,0xd6,0xba,0x3b,0x0d,0xea,0xb4,0x16,0xf1,0x81,0x43,0xcb,0x40,0x17,0x18,0xd1,0x4d,0xc7,0xad,0xcd,0xf1,0x9b,0xad,0xeb,0x17,0x35,0x2b,0x1c,0x1b,0xe1,0xf0,0xef,0x69,0xa7,0x19,0xfd,0x70,0xa2,0xd9,0xff,0x62,0x3a,0x9c,0x06,0x24,0xe5,0xcf,0x7f,0x04,0xf2,0x38,0x32,0xf2,0xa3,0xf8,0x15,0x2a,0x0a,0x08,0x17,0x16,0xec,0x05,0xc9,0xfe,0xf9,0x19,0xfc,0x40,0x49,0x22,0x4c,0xe8,0xe8,0x26,0xf4,0xfe,0x2e,0xc8,0xde,0x81,0x0d,0xe5,0x7d,0xcc,0xe0,0x51,0xde,0xc6,0xe4,0x3c,0x25,0xeb,0x58,0x4f,0xc3,0x0c,0xe6,0x81,0x2f,0xca,0xfc,0x42,0x2d,0x9b,0xe3,0xe5,0xe1,0xf6,0x49,0xdf,0xf3,0xfc,0x3b,0x11,0x26,0x57,0x3c,0x3c,0x24,0xfb,0xac,0x10,0x7f,0x35,0xdc,0xd6,0x07,0x0f,0xda,0x28,0x02,0xf6,0x38,0x0d,0xe0,0x19,0xf0,0x1c,0x27,0x0d,0xd5,0x29,0x21,0xde,0x36,0xf4,0x34,0xfd,0x94,0xe1,0xd6,0x0d,0x31,0x7f,0x37,0xbc,0x60,0x3d,0xb8,0x02,0x0d,0x23,0xb0,0x53,0x4c,0x0d,0xe7,0xd8,0xae,0x25,0xb9,0xb9,0x7a,0xc9,0x0a,0x29,0xa5,0x1c,0x8a,0xcc,0x30,0x24,0x0a,0x79,0x38,0x4a,0xcc,0xfb,0x00,0x05,0x08,0x2f,0x40,0xf8,0x81,0x05,0x3b,0xa5,0xdc,0x56,0x00,0xa0,0x1e,0x50,0xc7,0x3d,0x32,0xb5,0x71,0xfd,0x50,0x67,0x07,0xcb,0x0c,0xf3,0xc2,0x1d,0xfe,0xb8,0xd2,0xec,0x7f,0x3b,0x36,0x29,0x10,0xd3,0xd3,0x37,0x04,0x18,0xd2,0x0e,0x30,0xe3,0xf8,0xec,0x05,0x81,0x5b,0x05,0xe6,0xf1,0x09,0xeb,0xe8,0x13,0x34,0x33,0xda,0xd7,0xa6,0xb9,0x0b,0x05,0x27,0x96,0xf2,0x43,0x07,0x9b,0x27,0x7f,0x24,0xd9,0xe3,0x19,0xe0,0xe6,0x08,0xbe,0xd8,0x33,0x06,0x45,0x61,0xf7,0x5c,0x25,0x58,0x25,0x68,0x3a,0xe8,0x1c,0x28,0xc7,0xcb,0x25,0xb7,0xc8,0xff,0x40,0x25,0x19,0x19,0xd0,0xa1,0x32,0xd6,0x09,0x94,0x49,0x5c,0xf5,0x0c,0x81,0xb9,0x32,0xc3,0xe2,0xd4,0xce,0x3c,0xcd,0x40,0x13,0x11,0xd9,0xf4,0x25,0x2d,0x18,0xfd,0xd8,0xf8,0x81,0xfe,0x04,0xd1,0xff,0x08,0x22,0xeb,0xcd,0x3b,0xce,0xea,0x1d,0xff,0x49,0xd7,0xec,0xec,0x54,0xfb,0x29,0x26,0x1d,0x35,0xfc,0xed,0xe9,0x8c,0xbe,0x04,0xbe,0xef,0x25,0x7f,0xfd,0xd4,0xdd,0x11,0xf9,0xd0,0x28,0x3d,0x48,0x0a,0xa9,0xc6,0x4d,0xca,0x3c,0x21,0xca,0x64,0xb6,0xe9,0x81,0x07,0xfb,0x03,0x40,0x1b,0xfa,0x4d,0x08,0x5d,0xec,0xfc,0x2d,0xc7,0x37,0x25,0x34,0xd5,0xd4,0x09,0xb4,0x55,0xf2,0x07,0xdc,0xe3,0xf7,0x20,0xbc,0xfb,0xb5,0x1e,0x02,0x81,0xb0,0xbb,0x3b,0x16,0x21,0x34,0xab,0xdf,0x3c,0xde,0x17,0xf9,0x13,0xfb,0xe9,0x22,0xb9,0x13,0xef,0xe6,0xd3,0xe6,0x3f,0x7f,0xe1,0xdd,0x30,0x30,0x32,0x07,0xf1,0x54,0x26,0xea,0x23,0xed,0xdb,0x2f,0xed,0x81,0xde,0xff,0x25,0x37,0x14,0xe0,0xc6,0xcf,0xef,0x08,0x2b,0x4d,0xee,0x1b,0xfd,0x16,0x5d,0x9d,0xef,0x7f,0xea,0x8c,0xdc,0x05,0xf8,0x00,0x90,0x21,0x7c,0xac,0x09,0x56,0x2a,0x47,0x4d,0xc6,0xc3,0x7f,0x8c,0x73,0x05,0x1d,0x30,0x31,0x3d,0x92,0xe6,0x1a,0x24,0xe4,0x19,0x14,0xc0,0xb2,0x3e,0x8b,0x1f,0x81,0x42,0xfc,0x51,0xb8,0x18,0xae,0x0c,0xc1,0xe3,0xf9,0xd5,0x09,0xf3,0xfa,0x34,0xcd,0x42,0x05,0x31,0xeb,0x1f,0xb0,0xe1,0x66,0xca,0x10,0xee,0x14,0xe4,0x81,0x20,0xb1,0x66,0xe5,0xe9,0xcd,0xd0,0xbd,0x2e,0xf9,0x07,0xc5,0xeb,0x0b,0xed,0xf1,0xee,0xd1,0x21,0x24,0x10,0xec,0xf0,0x19,0xd5,0x7f,0x49,0x38,0xca,0x18,0x0c,0x7d,0x6e,0xde,0x36,0xe1,0xc2,0xf5,0x08,0x8c,0x5f,0x7a,0x49,0x28,0x66,0x1c,0x1f,0x02,0xd6,0xf9,0xdd,0x08,0x7f,0xe1,0x3f,0xfd,0x16,0xf0,0x50,0xdb,0x66,0xfd,0x5d,0xea,0x5e,0x4f,0xe7,0xec,0xe8,0x17,0xd9,0x1f,0x37,0xe3,0xf7,0x19,0x10,0x43,0xf2,0x45,0xf0,0xbd,0x0b,0xd1,0xdc,0x51,0x7f,0x78,0xfa,0xf0,0x2e,0xdc,0x10,0x55,0x37,0xf8,0xf5,0x0d,0x03,0xc0,0xdf,0xdf,0x0a,0xc8,0xe2,0xd2,0xc7,0x05,0xcb,0xe0,0x04,0x2f,0x15,0xbc,0x74,0xf3,0xa2,0x46,0x81,0x1b,0x22,0x24,0x1c,0xd6,0x12,0xdb,0x21,0xf1,0x12,0x27,0x00,0x0e,0xf5,0xa9,0xdf,0xf8,0x5f,0x05,0x01,0xce,0xc7,0x9d,0x25,0x2b,0x21,0xb4,0x81,0xf3,0x1e,0xa2,0xb9,0xe1,0x5a,0x20,0xe3,0x54,0x3a,0xd3,0x52,0x31,0xe5,0xbd,0xea,0xef,0x14,0xd4,0x42,0x60,0xc8,0xf6,0xf7,0x05,0x0b,0x81,0x09,0x1e,0xe4,0x06,0xed,0x14,0xda,0x5d,0xa4,0x18,0xfa,0x28,0xd4,0xe3,0x0a,0x41,0xeb,0xa9,0xbf,0xba,0x1c,0xbc,0x0e,0x22,0x81,0x22,0xb1,0xcf,0xb9,0xf3,0x45,0xed,0x23,0xfd,0x22,0x19,0x0f,0xe9,0xbf,0x0f,0x2d,0x15,0x15,0x11,0xca,0xe5,0x03,0x81,0xb4,0xf5,0xfc,0xf1,0xed,0x07,0xfc,0xa2,0xd2,0x00,0x08,0x0f,0xda,0xf7,0x12,0xf8,0xfb,0xfc,0x91,0x1c,0xfa,0xd0,0x00,0x39,0x3c,0x29,0x00,0x81,0x06,0xc1,0xf1,0xc3,0x24,0x20,0xc1,0x03,0xdb,0xf9,0x4e,0x2a,0xd0,0x15,0xf7,0x07,0x24,0xdd,0xeb,0xe0,0x07,0x13,0xe0,0xc3,0xec,0x2e,0x15,0xf8,0x5e,0xda,0xdf,0xff,0xeb,0xe0,0x54,0x14,0x44,0xe1,0xe4,0x05,0x38,0xb4,0x81,0x26,0x02,0x9e,0x11,0xa5,0xcc,0xe9,0x08,0x51,0xca,0xe8,0xff,0xf9,0x22,0x7f,0xee,0x08,0xdc,0x08,0x15,0xe4,0xd7,0x31,0x24,0xc3,0x04,0x21,0xe8,0x26,0xef,0x02,0x21,0x03,0xf2,0xf5,0x12,0x23,0xe4,0xb7,0x37,0xb2,0xfe,0x2e,0xe4,0xda,0xbf,0xe4,0x18,0x07,0x44,0x24,0xa6,0x32,0x91,0xfd,0x7f,0x2c,0xf3,0x01,0xf8,0xed,0xb1,0xde,0x66,0x49,0x96,0xd2,0x68,0xa0,0x09,0x24,0x7f,0xe3,0x13,0xba,0xf7,0x14,0x25,0xee,0xd3,0x4f,0x2e,0xa3,0xe9,0xf8,0x1f,0x18,0x4f,0xfa,0xbe,0x72,0x03,0xec,0xf9,0x11,0x21,0xf5,0x16,0x57,0x35,0x1e,0xf4,0x81,0x75,0x3c,0xbb,0x43,0x1c,0x63,0x19,0xb7,0x02,0xeb,0xb1,0xdf,0x2a,0xc9,0x0f,0x09,0x0f,0xf0,0xff,0xde,0xf3,0xf5,0x25,0xdd,0x2a,0x2c,0xc3,0x38,0xdb,0x02,0xfe,0xd3,0x16,0x34,0x56,0xc6,0x14,0x04,0x8c,0x0f,0x81,0x0e,0x2f,0xfd,0x07,0x10,0xcf,0x25,0x5e,0xaa,0x07,0x2c,0x3a,0xed,0xfe,0x02,0x32,0xfa,0xdb,0x38,0x13,0x35,0xf9,0x07,0x0e,0x36,0xe7,0x7f,0xde,0xf2,0xbb,0xdd,0x5a,0x41,0xb2,0xb0,0x1a,0x27,0xdc,0x71,0x1d,0xd2,0xe7,0xb0,0x0a,0x81,0xcf,0xfe,0xf9,0x53,0xcd,0x05,0x0f,0x0d,0x0d,0x3a,0x18,0xf7,0x13,0x23,0x0d,0xd3,0x0c,0xe1,0xf7,0x11,0xbb,0x00,0x7f,0x20,0x4a,0x93,0x35,0xe2,0x02,0x16,0xc4,0x1c,0xf2,0xf7,0x17,0x0c,0xa0,0x18,0xbb,0x13,0xf3,0x17,0xe5,0x38,0x21,0xdd,0x49,0x2d,0x5f,0x54,0xf3,0xa6,0xbc,0x35,0x5b,0x70,0x7f,0x87,0x1e,0x07,0x00,0x98,0x22,0x20,0xb9,0xe3,0xf5,0xd0,0xee,0x32,0x26,0x3a,0x9d,0x41,0xb9,0x13,0xc8,0x99,0x28,0x0f,0xde,0x17,0xc9,0x44,0xe6,0xe2,0x10,0x4d,0x68,0xdb,0x81,0xff,0x34,0x21,0x07,0x02,0xfb,0x04,0x04,0x3b,0x26,0x2f,0xec,0xd0,0x81,0xd9,0xba,0x61,0x07,0x88,0xfb,0x29,0x99,0x10,0xa4,0x68,0x0a,0x08,0xfe,0x20,0xf5,0x03,0x5b,0x29,0xa8,0x30,0x34,0x2e,0x61,0x82,0xdb,0x32,0x25,0xaa,0x7a,0x05,0x30,0x2f,0x81,0x1f,0x2a,0xb6,0xaa,0x04,0xc2,0xb5,0xc4,0x63,0xdf,0x55,0xd3,0xc4,0x5f,0x2c,0xc3,0x07,0x28,0xde,0x0f,0xd1,0x20,0x3c,0xbc,0xbb,0x19,0xdb,0xd2,0xfd,0x14,0xfe,0x42,0xe6,0xfa,0x51,0x32,0xf1,0xdb,0x3f,0x9d,0x81,0x14,0x22,0xb1,0x7a,0xf2,0xf9,0xdb,0x2c,0x81,0xb3,0x6d,0x11,0xd1,0x93,0xbd,0xf1,0xc4,0x7f,0xef,0xc7,0x19,0xaa,0x03,0x2a,0xf4,0xc4,0x1f,0x25,0xcf,0xea,0x4e,0xf9,0x38,0xaf,0x83,0x8e,0x2c,0x2b,0x07,0xd5,0xce,0x0b,0x61,0xe0,0xd9,0xfd,0x07,0x2a,0x9f,0x2f,0xcf,0x3d,0xca,0x92,0x32,0xe3,0x17,0x2f,0xee,0x81,0xc9,0xfe,0xbe,0xf5,0x15,0x5a,0x23,0xfc,0xe0,0x05,0xde,0x47,0xf7,0x1c,0xd3,0x7f,0xf3,0xb6,0x38,0x04,0xe1,0x07,0x3d,0xfe,0x67,0xe3,0xd8,0xeb,0xe8,0xfc,0x09,0xdb,0x23,0xd1,0x51,0x56,0x15,0x4f,0x24,0x02,0xfd,0x97,0xfc,0x12,0xec,0x40,0x81,0x34,0xf2,0x50,0xf8,0xf7,0x10,0xf4,0x19,0xe1,0x2d,0x17,0xbe,0xfe,0x09,0x00,0x37,0xb2,0x44,0xbb,0x17,0xc0,0x0f,0x9a,0x12,0x01,0x3d,0x81,0xcb,0x0b,0x05,0xd4,0x37,0x40,0x0c,0xf7,0x16,0x92,0x04,0x3b,0xf0,0x81,0x23,0xf5,0xe9,0xe8,0x09,0x46,0x0f,0xcd,0xf3,0xfd,0xe7,0x21,0xa3,0x26,0x1b,0x44,0x2f,0x04,0xe6,0x6d,0xfe,0xf0,0xd0,0x32,0xd7,0x14,0x46,0xf8,0x66,0xd6,0x9f,0x4d,0xb6,0xfa,0x53,0x42,0x50,0x10,0x2e,0x37,0x7f,0xf8,0x1d,0x9d,0x9d,0x4d,0x2b,0x46,0xd6,0xe3,0xec,0xa4,0x2d,0x28,0xd1,0x02,0x12,0xac,0x68,0x40,0xfc,0x2b,0xfa,0xc9,0x81,0xd9,0x38,0x05,0x65,0xb9,0xf0,0x48,0x12,0x45,0x19,0xdd,0x09,0x1d,0x29,0xf2,0xb7,0xf6,0x40,0xc5,0x12,0xf9,0x0d,0xbe,0x3b,0x0d,0xa6,0xa1,0x03,0x93,0x34,0x4f,0x97,0xdb,0xd8,0xe0,0x1f,0x2e,0xe2,0x26,0x97,0x7f,0x9a,0x06,0x3b,0x23,0xd6,0xce,0x3b,0xa6,0xa9,0x10,0x7f,0x64,0x93,0x3a,0x40,0xd3,0xf2,0xfb,0x06,0x16,0xd7,0x32,0xd0,0xde,0xbb,0x0a,0x1f,0xf4,0xd9,0xd2,0x12,0x12,0xf1,0xcc,0x23,0x75,0xf9,0xe5,0xf6,0xef,0x1a,0x81,0xef,0xbb,0x3a,0x4c,0xbc,0x1e,0x45,0x0f,0x14,0x0a,0xe6,0x06,0xe5,0x04,0xfc,0x01,0xe2,0x2e,0x16,0x8c,0x5a,0x5e,0x1e,0xc6,0x1e,0xef,0x24,0xcf,0xd9,0x8a,0x0a,0x53,0x1d,0xc0,0x31,0xed,0x0f,0x7e,0x08,0x81,0x07,0xfd,0x6c,0x12,0x98,0x5d,0x28,0x1e,0x03,0x56,0xd4,0x0c,0x1e,0x33,0xed,0x1c,0x18,0xd9,0xda,0xce,0x04,0x10,0xc9,0x48,0xc5,0xf4,0x5e,0x2e,0x1a,0x7f,0x26,0x42,0x06,0x11,0xef,0xe9,0x2a,0x25,0x0b,0x35,0xd4,0xf7,0x10,0x2e,0x6f,0x82,0xfd,0x0f,0xc4,0x2e,0x0c,0x68,0xe0,0xf1,0xae,0xf8,0xd2,0x21,0xe5,0x7f,0x1a,0x0e,0x44,0x16,0x22,0xa2,0xe1,0x32,0x03,0x07,0xc2,0x25,0x25,0xe1,0x03,0xfa,0xd1,0x93,0x7f,0x30,0xe1,0xad,0xfa,0xf7,0xfc,0xfd,0x07,0xd9,0xdb,0xdc,0xf0,0xdc,0x4c,0x85,0x09,0xc0,0x04,0x18,0xee,0xae,0xe1,0x11,0x0e,0x00,0x29,0xf0,0x4d,0xbd,0x2c,0x19,0xf3,0x81,0x2d,0xbe,0xf3,0xf1,0x03,0xcf,0xe8,0xe1,0xf3,0xea,0x10,0x06,0x36,0xd0,0x00,0x30,0xf3,0x50,0x81,0xdc,0x00,0x41,0x06,0xf5,0xd5,0xe1,0x09,0xfa,0xf9,0x09,0xf9,0xfe,0x1b,0x9f,0x7f,0x1f,0x45,0x34,0x10,0xf8,0x93,0x38,0x21,0xf0,0xdd,0x0b,0x17,0xdc,0xfb,0xec,0xd0,0x3e,0x27,0x64,0xe9,0x30,0xcf,0xd5,0xe8,0x29,0xf7,0xce,0xff,0xd3,0x4c,0x07,0xf0,0x71,0x0d,0x71,0x35,0xf2,0xfb,0xe0,0xeb,0x10,0xf4,0x03,0x81,0x3d,0x06,0x44,0xdd,0x08,0x29,0xe1,0x07,0x27,0x17,0x19,0x7f,0xb1,0x13,0x52,0xe2,0xd6,0x33,0x1d,0x29,0x25,0x69,0x61,0xae,0xa5,0xb5,0x32,0xbd,0xf4,0x10,0xa6,0x61,0xdc,0x9e,0xf6,0xf3,0x29,0xf4,0xe1,0xbf,0x01,0x14,0x4e,0xc3,0x01,0x3c,0xf8,0xd4,0x22,0xeb,0x81,0xfe,0xc3,0x0f,0x3f,0xe1,0x3e,0x07,0xf2,0x20,0xe7,0xf2,0xeb,0xad,0x00,0xec,0xae,0x33,0x2a,0x85,0xf1,0x2b,0x31,0xb7,0x02,0x00,0xc8,0xdc,0x3d,0xef,0x00,0x18,0x81,0x08,0xf6,0xe8,0x16,0x05,0xd6,0x06,0x23,0x2b,0x08,0x0b,0xc1,0xc9,0x1b,0xcf,0xb1,0xf4,0x06,0x3b,0xda,0x81,0x6d,0xf4,0xd9,0xa9,0xd6,0xf6,0x15,0x0c,0x3a,0x2f,0x25,0xbf,0xde,0xe3,0x04,0xcf,0x2c,0xbf,0x96,0x7e,0xe9,0x2a,0x59,0xc5,0xf0,0xec,0x5f,0x29,0x1f,0xde,0x09,0xc6,0x30,0xfe,0x39,0x57,0xe4,0x16,0x9f,0x2d,0x7f,0x83,0x42,0x1f,0x2e,0xd0,0xbc,0x12,0x05,0x91,0x3f,0xad,0x26,0x5c,0x43,0x47,0xb7,0xe3,0x95,0x38,0x0e,0x4c,0x81,0xe3,0x05,0xb0,0xa3,0x53,0x49,0x32,0xf5,0xdd,0xcd,0x57,0xdd,0xe7,0xde,0xcf,0xb1,0xe1,0xa7,0xde,0x2b,0x58,0x46,0xfd,0x7f,0x29,0x9d,0x02,0xd2,0xb2,0x58,0xf4,0xcd,0xa7,0x2a,0x17,0xf6,0xa8,0x4d,0xd5,0x0b,0x7f,0xc9,0xe9,0xd4,0xc8,0xc8,0xf2,0xe5,0x14,0x69,0xef,0x0a,0x25,0xd6,0xe8,0x02,0xbe,0xab,0xed,0xa6,0x3c,0xf7,0xd5,0xfc,0x21,0x63,0x94,0xe3,0x08,0x0d,0xad,0x47,0x2a,0x32,0xc2,0x93,0x57,0xea,0x60,0x08,0x3c,0x21,0x0b,0x81,0xec,0xdc,0x3c,0x4a,0x2a,0xf2,0xa9,0xf9,0x5d,0xf0,0xff,0x10,0x35,0x81,0x05,0xd8,0x10,0xfc,0x48,0x04,0x4a,0x74,0x2b,0x3c,0x28,0xd5,0xae,0xbe,0xf0,0xf0,0x03,0xfd,0x38,0x02,0x0e,0xda,0x16,0x42,0xfb,0xff,0xf2,0xae,0xe1,0x8e,0xe8,0x10,0x03,0x28,0x9b,0xb5,0x1d,0x24,0xd3,0xce,0x02,0x54,0xd8,0xd0,0xe9,0x1f,0xe6,0x4e,0xe2,0xed,0xf1,0x31,0x7f,0x3a,0x99,0xf8,0xae,0x81,0x0c,0xf4,0xe4,0x24,0xba,0xde,0xdd,0x1b,0xf4,0xc5,0xc1,0x37,0xe8,0x05,0xbd,0xce,0x1e,0x1f,0xdd,0xec,0x25,0x2b,0x3f,0xc2,0xf7,0xd6,0x53,0xcf,0xf4,0x7f,0xf0,0xc0,0xc9,0x4b,0x33,0x2c,0x03,0xd3,0x77,0xc0,0x17,0x1d,0x99,0xeb,0xd9,0x10,0x4c,0x93,0x76,0x08,0xb1,0x25,0x38,0xbc,0xf7,0xf9,0xeb,0x43,0x3a,0x22,0xef,0xa9,0xa6,0x7f,0xca,0x1c,0x6c,0xb1,0x31,0xea,0xe9,0xc3,0x1f,0xe0,0x1e,0xe3,0xdd,0xb7,0x6a,0xc5,0x34,0x04,0x14,0xf0,0x09,0x10,0xe8,0x01,0xbc,0xde,0x0a,0x2b,0xc6,0x33,0xf9,0x0f,0xd4,0xec,0x11,0x20,0x15,0x2c,0xd3,0x7f,0xea,0x16,0x37,0xff,0xd9,0xdd,0x7f,0xee,0xe5,0x20,0x59,0x3f,0x05,0xce,0x11,0xab,0xae,0x06,0xe3,0x1c,0x19,0x56,0xdf,0xd7,0xdd,0x01,0xda,0xcb,0xf8,0x91,0x33,0xb9,0x4a,0x99,0x74,0x7f,0x1d,0x1f,0x3b,0x98,0x4b,0xe2,0xf3,0xc5,0x2b,0x4f,0x34,0x3e,0xae,0xb9,0x12,0xce,0x1e,0x19,0xfa,0xb4,0xf4,0x01,0xe1,0x2c,0x20,0xfe,0x26,0x0c,0xab,0x5a,0xc7,0x81,0x48,0xb7,0x94,0x04,0x2e,0xdc,0xd2,0x20,0xc6,0xe1,0x01,0xcc,0x16,0x2c,0xd9,0xe4,0xd8,0xe7,0x30,0xf0,0x0b,0xfe,0xd0,0xe4,0x04,0xc6,0xcd,0xf9,0x2d,0xcd,0x2d,0x4b,0x07,0x08,0x7f,0xea,0xdb,0x52,0xd4,0x01,0x47,0x15,0x39,0xf6,0xc2,0xf1,0x0f,0x85,0x0c,0x32,0x5b,0x48,0xf6,0x4d,0x81,0xff,0xf7,0xe9,0x5b,0x2f,0x05,0x1d,0x1e,0xfd,0x49,0xdf,0x12,0xe1,0x1f,0x33,0xc3,0xc2,0x2f,0x0c,0xf8,0xc9,0xbe,0xe1,0x1b,0x01,0xd6,0xd6,0x7f,0xe4,0xcb,0x09,0xd5,0x4a,0xd6,0x2d,0x3a,0xc7,0xe3,0xf6,0xe1,0xf2,0x03,0x39,0xf7,0xf8,0xfa,0xf9,0x15,0xc8,0x31,0x4b,0x7f,0x37,0x22,0xcb,0xd8,0x3c,0x5e,0xf4,0x0f,0xe0,0xf6,0x03,0x64,0xb7,0x24,0xba,0xc2,0x70,0x66,0xe7,0xf6,0x2a,0xe1,0xe0,0xcf,0xfb,0xd3,0xb7,0x49,0x29,0xbb,0x02,0xf4,0xe8,0x4d,0xc6,0xeb,0x42,0xdf,0x46,0xda,0xe5,0xbf,0x7f,0xe2,0xd8,0x02,0x23,0xe3,0x26,0xee,0x46,0xc1,0xdc,0x3a,0x00,0x89,0x2c,0xed,0xe6,0x81,0x59,0x51,0x23,0x02,0xd3,0x7a,0x01,0x01,0x86,0xfd,0xb9,0x30,0x0a,0x59,0x20,0x1b,0x7a,0xeb,0xa7,0xc6,0x2c,0x24,0xec,0x2d,0xda,0x45,0x15,0xe0,0x29,0x1f,0x18,0x55,0xf8,0x3f,0xe5,0x7f,0xba,0x2f,0xdf,0xec,0x0d,0xc1,0x0d,0x08,0xce,0xfd,0xe7,0xca,0x2e,0x39,0xec,0xfd,0xbc,0x4f,0x19,0xdf,0x21,0xf5,0x0b,0x0c,0x9c,0xc3,0xea,0xb7,0xe9,0x28,0x0f,0x1b,0x2a,0x0d,0x5c,0xf1,0xcd,0x31,0x1f,0xe8,0x7f,0xd3,0x4d,0x7f,0x52,0xea,0xf4,0x42,0xfd,0x37,0xf1,0x41,0x17,0xfd,0xeb,0x36,0xbe,0x1a,0x0e,0x07,0x05,0x32,0xef,0xf0,0x18,0x1a,0x06,0xed,0xea,0xa8,0x0a,0x17,0xaa,0xd9,0x7c,0xd2,0x92,0x34,0x66,0x3d,0x75,0xeb,0x52,0x7f,0xed,0x07,0x69,0x26,0x16,0x64,0x28,0x10,0xee,0x51,0x03,0x39,0x9f,0x46,0xbc,0x7f,0x5c,0xb1,0x51,0xa6,0x3c,0x50,0x53,0x2b,0x25,0xd1,0x0a,0x4f,0x15,0xed,0xde,0x06,0x2f,0x48,0x28,0x19,0xef,0xc0,0xf5,0x0a,0xff,0x3d,0x24,0xf8,0x4e,0xb4,0x11,0xec,0x07,0xea,0xea,0xde,0xf0,0xaa,0xc7,0x2f,0x1c,0xaf,0x25,0xaf,0xc6,0x32,0x0d,0x13,0x37,0x2c,0x7f,0xfa,0xe9,0xba,0xdb,0x52,0x0b,0x73,0x71,0xc6,0x19,0x24,0xef,0xb8,0xd8,0xdb,0xdc,0x7f,0xeb,0xe7,0xf9,0x20,0xc4,0xce,0x20,0xcf,0xbb,0x22,0xed,0x17,0xeb,0xf2,0xff,0x1c,0xd3,0xd6,0x07,0x01,0x64,0x7c,0x81,0xe5,0xad,0x1b,0xe7,0xee,0x51,0x0e,0xce,0x04,0xfa,0x09,0x4e,0xe2,0xdd,0x22,0x04,0x16,0x4f,0x1a,0xff,0xf5,0x12,0x8f,0x79,0xbb,0x57,0xda,0x4e,0x38,0x0a,0x2b,0xd5,0x7f,0xc7,0x4d,0x01,0xf9,0x1c,0xda,0x03,0x2f,0x88,0x00,0xd5,0x32,0xbc,0x48,0xaa,0xf7,0x81,0x18,0x2e,0xf3,0xd9,0xf8,0x01,0xd2,0x40,0x3d,0xcb,0xc8,0x0b,0x0a,0x1b,0x1c,0xd6,0x33,0xf5,0x34,0xec,0x40,0x0f,0xf7,0xc6,0x58,0xfb,0x31,0x9b,0x4a,0x09,0x62,0x28,0x2f,0x4b,0x63,0xb4,0xf2,0xfe,0xee,0x14,0xfc,0xe4,0xed,0xfc,0x11,0xf9,0xe8,0xe0,0xd8,0x7f,0x37,0x1b,0x23,0xd6,0x0c,0x4a,0xb5,0xcc,0xb1,0x0f,0x12,0xa9,0x81,0x0b,0xee,0xd9,0xac,0x36,0xf1,0x17,0x05,0xc8,0x3a,0x24,0xba,0x15,0x36,0x0b,0x03,0xc6,0xf5,0x47,0x06,0x1d,0xba,0xf7,0x81,0x15,0x15,0x22,0xd5,0x39,0x44,0x25,0xa5,0x07,0xee,0xef,0x3b,0x06,0x10,0x4b,0xec,0x21,0x1c,0x27,0xcb,0x0d,0x17,0x1b,0xc3,0x1f,0xdb,0x2c,0xce,0x0f,0xc7,0x3b,0xa6,0x67,0xf3,0xe5,0x52,0xde,0x2c,0xe1,0x0a,0x05,0x7f,0x64,0x3f,0x33,0xf8,0xa6,0xfd,0xbe,0x5c,0x17,0x1d,0xea,0xc9,0xed,0xf1,0x44,0x0a,0xe6,0xd0,0x36,0xea,0xee,0xc3,0xbf,0x7f,0x37,0xff,0x41,0x21,0x63,0x57,0x20,0x07,0xec,0x30,0xfb,0xfb,0x26,0xff,0xf3,0x08,0x0a,0xc9,0xd7,0xfc,0xc4,0x46,0x16,0xfa,0xfe,0x0e,0xbd,0x1e,0xfa,0xf2,0x0d,0x0c,0xf3,0x24,0x0a,0x36,0x27,0x7f,0xc3,0x70,0x24,0xf5,0xbc,0xfd,0xee,0x13,0x1a,0x28,0x17,0x14,0xa7,0x4b,0x57,0x18,0xd2,0xc0,0xa4,0x37,0x18,0x7f,0x07,0xe1,0x2d,0xd4,0xf7,0x5a,0xce,0x56,0x0d,0x2f,0x7f,0x90,0x62,0x84,0xd5,0x3d,0x14,0x27,0xf2,0x02,0x4b,0xfb,0x33,0xfe,0x90,0xd8,0x21,0x44,0xf0,0xf5,0xfd,0x18,0xd4,0xf0,0x09,0x23,0x4a,0xf5,0xf0,0x7f,0x40,0xf2,0xfa,0xf5,0x14,0x60,0x08,0xe6,0xd0,0x48,0xbf,0xfe,0x9a,0xe0,0x11,0x02,0x05,0xc1,0xd6,0xe2,0x0c,0xfc,0x3a,0x7f,0xfb,0xe3,0x0a,0xf4,0x97,0xb8,0x1e,0xe7,0xe1,0x0d,0x48,0x1b,0xda,0xec,0xcc,0x5b,0xf4,0xe1,0xc3,0x14,0x41,0x97,0x0d,0x76,0x0d,0xd2,0x94,0x32,0xeb,0x1c,0xfa,0xf8,0xf3,0xab,0x07,0x39,0xaf,0xc8,0x2a,0x46,0x43,0x7f,0x12,0x09,0xd6,0x14,0xe6,0x31,0x2d,0x19,0xc1,0xca,0x0b,0x27,0xd8,0x20,0x26,0x9b,0x0c,0xf8,0x31,0xa5,0x27,0xaf,0xb9,0x1e,0x07,0xf3,0x81,0xfb,0xe4,0xd3,0x07,0xe3,0xd0,0x28,0x54,0xf4,0xfb,0xcd,0x08,0x3f,0xa0,0x2f,0x22,0x81,0xe8,0xd4,0x13,0xaa,0xfe,0x3b,0x21,0x08,0x7a,0xeb,0xbc,0x49,0xc8,0x0a,0xac,0xda,0x1f,0x35,0x41,0x36,0x9c,0x63,0x14,0xea,0xfb,0x0b,0x83,0xca,0x13,0x01,0xf6,0xff,0x2d,0x9d,0xdc,0xe3,0x24,0xe5,0xff,0xe9,0x26,0x0c,0x17,0xfa,0x12,0xde,0x52,0xe1,0xc4,0x18,0x7f,0x18,0x10,0xdc,0xd3,0x22,0x2d,0xfc,0x20,0x01,0x0b,0x31,0xfe,0xfc,0xf9,0x19,0x5d,0x06,0xd5,0x0a,0xf6,0x4a,0xfa,0x54,0xa3,0x08,0x85,0x39,0x7f,0xdc,0xfb,0x08,0xf4,0xe9,0xdc,0xea,0xca,0xfa,0xff,0xe0,0x2b,0x0e,0xda,0x7f,0x2f,0xdd,0xb2,0x5f,0xd9,0xe2,0x9b,0xfd,0x1e,0xd1,0xf2,0x31,0xf2,0xd9,0x1c,0x1f,0xb1,0xc7,0x9b,0xfc,0x09,0x45,0xc4,0xe5,0x32,0xb9,0x13,0xda,0xdd,0x81,0xd9,0x1f,0x36,0x13,0xe2,0x21,0x22,0x38,0x0d,0x1d,0x5e,0x58,0xe6,0x00,0x0f,0xef,0xaf,0x94,0xdb,0xd7,0x10,0x23,0xfb,0x26,0x1b,0x3f,0xf2,0x61,0x07,0x74,0xb4,0xc8,0x81,0x07,0x3d,0xb7,0x14,0x2b,0xff,0xd4,0xfd,0x13,0xf6,0x23,0x2d,0xb5,0xe6,0xf6,0x7f,0x51,0xd7,0x47,0xda,0x1e,0x26,0x09,0x1f,0xfb,0xfb,0xfb,0xe2,0xef,0xf9,0xe3,0xc6,0x18,0x35,0x05,0xe8,0xf7,0xc1,0x17,0x81,0xe7,0xa7,0x37,0xaa,0x3a,0xb3,0xf6,0xe2,0x43,0x35,0x5e,0x08,0x0b,0x23,0xff,0x29,0xf0,0xdd,0x40,0x24,0xce,0xc0,0xa4,0x67,0xf2,0xe9,0x54,0xfa,0x41,0xe2,0x81,0x5d,0x8b,0xd6,0xe6,0xf1,0x5c,0x22,0x42,0xde,0xee,0xdd,0x06,0xcd,0x81,0x0b,0xf8,0xd3,0xe4,0x28,0xb0,0x16,0x1e,0x02,0xdb,0x2e,0xc7,0xfe,0xa7,0xf6,0xd9,0xe6,0xef,0x3c,0xaa,0xb8,0x27,0x2c,0xef,0x36,0xd5,0x01,0x1f,0xf3,0xf2,0x0a,0x23,0xf1,0x12,0x81,0x3f,0x10,0x68,0xf0,0x54,0x2b,0x1f,0xdc,0x7f,0x5d,0x2e,0xc2,0x3c,0x0e,0x1e,0xea,0xb6,0x16,0xf0,0x76,0x1b,0x12,0x17,0x4a,0x3a,0x2d,0x07,0x19,0xbe,0xf3,0x7f,0xf0,0x1e,0xc6,0x88,0xf7,0x57,0xde,0x3a,0xfe,0xdd,0xd5,0xa2,0xea,0x18,0x00,0x1a,0x39,0x0c,0x83,0xf9,0x03,0xda,0x21,0xf2,0xd8,0x06,0xd2,0xf3,0x10,0xde,0xd5,0x28,0x29,0xdb,0xf5,0x17,0xe3,0x7f,0xed,0x24,0x8c,0xdf,0x64,0xf5,0xf6,0x00,0x34,0x0e,0x54,0xd5,0x3e,0x01,0x29,0x27,0xbe,0xd4,0x61,0xca,0x04,0xb8,0x11,0x7f,0xc5,0xd3,0xf5,0x12,0xed,0x1c,0xdc,0xa1,0xf2,0x30,0x49,0x46,0x18,0x24,0xcc,0xc7,0xde,0xd6,0x0e,0x4f,0xf6,0x1e,0x1d,0x60,0xe7,0xed,0xf6,0xf2,0x2c,0xe9,0x1b,0x34,0x20,0xe5,0x06,0x33,0xf5,0xff,0x1c,0xdd,0x81,0xf5,0x0a,0xdb,0x3f,0xf1,0xa1,0x5c,0xba,0x2c,0x87,0x37,0xd5,0x5a,0xb7,0x09,0x07,0xfc,0xc4,0x45,0xc9,0xff,0xff,0xb2,0xfa,0x15,0x8f,0x7f,0xea,0x15,0x7f,0x01,0x70,0x25,0xd6,0xaf,0x14,0x1a,0x34,0x81,0x30,0x0c,0xe8,0x29,0xc4,0x06,0x2e,0x04,0x23,0xf1,0xfb,0xd5,0x34,0xb8,0xcb,0x10,0x3f,0x35,0x30,0x10,0x15,0x04,0x24,0xb0,0x81,0x11,0xc9,0x48,0xa0,0xb1,0xfb,0xae,0xe1,0xc6,0x63,0x35,0xa5,0xcb,0x67,0x6a,0x08,0x6d,0x12,0x19,0xf7,0x1b,0xc1,0x4a,0x46,0x33,0x10,0x14,0xc3,0x18,0x37,0x6b,0xc7,0x3e,0xd5,0x29,0xf1,0x1e,0xea,0xfe,0xfd,0x2f,0x34,0x7f,0xf7,0x03,0x26,0x15,0xdf,0x4c,0xfb,0x49,0xa2,0x64,0x45,0x33,0xf2,0x0a,0x3a,0xa4,0x17,0x23,0x45,0x4f,0x0e,0x81,0xe0,0x03,0x00,0x27,0x1b,0xb6,0x01,0x08,0x05,0x39,0xc9,0x26,0xaa,0xd5,0x0e,0x0c,0xbb,0xf2,0x87,0xd5,0xc7,0xb9,0xcf,0x7e,0x53,0x9e,0x38,0x81,0x26,0xab,0xe4,0x01,0x1c,0xde,0xcc,0x27,0xdb,0xb9,0x0f,0x22,0xdb,0x09,0x22,0x3e,0x26,0xf5,0xed,0xf6,0x2c,0x24,0xe1,0xd7,0xe0,0x0c,0x14,0xe1,0x03,0x96,0xe5,0xec,0x0e,0x04,0xf0,0x0a,0x1e,0x1f,0x50,0xfa,0x81,0x2a,0x2f,0xfc,0xe3,0x01,0x95,0x13,0xf7,0x20,0xba,0xa7,0x42,0x8c,0x81,0x2f,0xb0,0xcb,0xf5,0x10,0xe2,0xe0,0xe4,0x4c,0x0c,0xe4,0x41,0xc8,0xc4,0xd0,0x18,0xd8,0x05,0x28,0xce,0x0c,0x86,0xc9,0xc7,0xed,0xe4,0xf0,0xf1,0x04,0x3b,0x14,0xec,0x81,0x05,0xf9,0x05,0x11,0x02,0x48,0x0a,0x00,0x1f,0x44,0xb4,0x2c,0xee,0x0a,0x32,0x37,0x46,0xe6,0x3e,0x19,0x12,0x81,0x18,0x2b,0x05,0xc4,0x1b,0xbf,0x43,0x0e,0x1d,0x23,0xa5,0xf7,0xd3,0x91,0x13,0xf9,0x19,0xc3,0xe1,0x39,0xc8,0x4d,0xd4,0xe3,0x42,0xea,0x0e,0x0e,0x1c,0x2d,0xec,0x08,0x33,0xf7,0xf7,0x7f,0xf3,0xc6,0xbf,0xf4,0x14,0xc3,0xed,0x1c,0xed,0xcd,0xff,0x51,0xc0,0x7f,0x35,0x1c,0xe8,0x2b,0x86,0xe3,0x12,0x92,0x11,0x17,0xc5,0x78,0x18,0xdb,0x33,0x8f,0xd5,0x05,0x08,0x4d,0x13,0x3b,0xce,0xfd,0x28,0x8b,0xcd,0xa5,0xae,0xc9,0x0b,0x92,0xc8,0x83,0xbd,0xb6,0xe0,0xba,0xf6,0x7f,0x16,0x35,0xd6,0xc1,0x01,0x08,0x48,0x11,0xe5,0xbd,0xd3,0x0b,0xb9,0x8e,0x2d,0x2e,0xee,0xfc,0x93,0x30,0xc7,0xa9,0xfb,0x21,0xc2,0x0e,0x37,0xd7,0x0e,0xe0,0x42,0x10,0xc1,0xd2,0x81,0xc2,0x11,0x13,0xd2,0xfe,0x18,0xe8,0xc6,0xbf,0x05,0xa3,0x2e,0xd1,0x13,0xde,0x9d,0xfd,0x0a,0xf2,0xdf,0xf7,0x15,0x20,0x3a,0xc5,0xfb,0x0c,0x0c,0x38,0xb7,0x6d,0x7f,0x31,0xdf,0x2a,0xa8,0x85,0x92,0x39,0x37,0xbe,0x52,0xa0,0x4d,0x10,0x05,0x27,0xb3,0x07,0xb5,0xeb,0x81,0x49,0xd1,0x0e,0xf9,0xff,0xa3,0x1e,0x32,0xf3,0x04,0x00,0x00,0x00,0x00,0x26,0x8f,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x09,0x00,0x00,0x21,0x06,0xf2,0xff,0x11,0xeb,0x0c,0xb3,0x2e,0x14,0x3f,0xf4,0xcc,0xea,0x35,0x06,0x22,0x50,0x70,0x44,0x10,0xe9,0xc1,0x12,0x14,0x42,0xed,0xfd,0xf8,0x56,0xd8,0x16,0xf6,0xbf,0x2f,0xcf,0xef,0x49,0xee,0xcf,0x0e,0xf0,0x62,0x0c,0x10,0x27,0xca,0x9f,0x39,0x0c,0xfd,0x0c,0x12,0x20,0x0b,0xdd,0x2d,0xd6,0x1f,0x13,0x17,0x3b,0xf1,0x0f,0xf6,0xe7,0xb4,0x10,0xca,0xd7,0x11,0x3b,0x01,0x17,0x51,0xd7,0x02,0x6a,0xf9,0xf1,0x41,0xef,0x00,0x01,0xd6,0xbf,0x00,0xd2,0x27,0x88,0xd0,0x0c,0xd4,0x6f,0x78,0x15,0xd8,0x15,0xc8,0xca,0xcb,0xf3,0x81,0xd6,0xf7,0x02,0xbe,0xf9,0xb0,0x17,0x17,0xda,0x07,0xf6,0xe4,0xc6,0xb1,0x1a,0xb3,0x19,0xe1,0xfc,0xea,0xea,0x13,0x1d,0x27,0xf2,0xe3,0xb7,0xc7,0x49,0xda,0x99,0x0e,0x0f,0x06,0x15,0xca,0x1e,0x0b,0xba,0x00,0x17,0x02,0xa2,0xdb,0x0c,0x11,0x28,0xf7,0x8d,0x49,0xff,0x59,0xf1,0x00,0x11,0xd3,0x0a,0xf8,0xfa,0xad,0x0e,0x18,0x75,0xe5,0x39,0x10,0x1d,0xdb,0xdd,0x1e,0xd6,0x0a,0x15,0x4c,0xf2,0x04,0x16,0x3f,0xa7,0x3c,0x19,0xfc,0x3e,0xb7,0xf8,0x27,0x17,0xe1,0x6e,0x20,0xe3,0x1c,0xfd,0xf7,0xa9,0xd5,0xe7,0xbd,0x00,0x1d,0x08,0xfa,0x13,0x50,0xe4,0x61,0x3b,0x67,0x56,0x44,0xcc,0x14,0xff,0x0b,0xb0,0xc0,0x3d,0x02,0x09,0x05,0xac,0x04,0x29,0xca,0xd2,0x02,0xb2,0x4d,0xe7,0x2e,0xa0,0x23,0x63,0xf5,0xea,0xd5,0x06,0xe2,0xfd,0x37,0x46,0x01,0xde,0x0b,0x37,0x0d,0xe2,0x6e,0x2e,0x4f,0xdd,0x4a,0xe6,0xc4,0xfe,0x27,0x06,0x2a,0x29,0x08,0x37,0x50,0xf8,0x0f,0x21,0xdf,0xc4,0x1b,0xfb,0x2a,0xf3,0xc2,0xfe,0xd5,0xe8,0x2f,0x64,0x29,0xfd,0xf9,0xc5,0x30,0x7f,0xed,0x3a,0x2e,0x2f,0x16,0x1e,0x44,0xd7,0xa9,0xc6,0x0f,0x02,0x39,0xf2,0xf6,0x2d,0x98,0x2a,0xc7,0x21,0x04,0xb6,0x0f,0x37,0xe7,0xf1,0xbf,0x27,0x52,0xb5,0xfe,0x07,0x43,0x19,0xd1,0x03,0x16,0x29,0xe1,0xe2,0xcc,0x91,0x06,0x7f,0x23,0x48,0x02,0xe4,0x33,0xad,0xe3,0xe9,0xfa,0xf7,0xfd,0xfc,0x0d,0x17,0x4a,0xc4,0x34,0x18,0x0e,0x38,0xc2,0x11,0x5a,0xc5,0xf7,0xc2,0xc3,0x1b,0xdb,0xdb,0x2e,0xda,0xc0,0xec,0xc3,0x23,0xdd,0xdf,0xd3,0x1c,0xe1,0xbb,0x12,0xfb,0xd4,0x29,0xf5,0x19,0xda,0x0e,0xfe,0xca,0x0f,0xe2,0x06,0x00,0xe1,0xef,0xdc,0x23,0x0f,0xb8,0x42,0xd3,0x18,0xfb,0xcb,0x03,0xfe,0x5b,0x00,0xf5,0xad,0xe8,0xa3,0xbf,0x15,0x35,0x45,0xe1,0xc4,0xf7,0xe5,0x9a,0xff,0x16,0xd3,0xb5,0x33,0xb6,0xd8,0x07,0x63,0x0b,0xbb,0x0b,0x13,0x0a,0xe4,0xee,0x4b,0x12,0x3a,0x10,0xcc,0xd8,0x0e,0xce,0xff,0xe5,0x25,0xe0,0x20,0x14,0xfd,0xec,0x01,0xd3,0x94,0x39,0x98,0x32,0xdd,0xfc,0x01,0x29,0xdc,0xe7,0x2d,0x01,0xab,0x3c,0x42,0x3a,0xd3,0x25,0x0a,0xcd,0x0a,0xa1,0xc6,0xdb,0xdb,0xf2,0xf6,0xdd,0xfa,0x0f,0x07,0xf4,0x0c,0xef,0x0a,0xc7,0xe1,0xac,0xf0,0xd9,0xe5,0xfc,0xbc,0x1f,0xbe,0xbd,0xf1,0xf5,0x00,0x41,0x00,0xfd,0x2e,0x21,0x31,0x31,0xfb,0x25,0x19,0x3f,0x23,0xf7,0xb9,0xf4,0x14,0xea,0xe0,0xf5,0xc9,0x04,0x09,0x1a,0xee,0xe9,0xcf,0xbf,0x1c,0x2c,0xf3,0x16,0x05,0xee,0xf4,0x37,0x00,0xc3,0x7f,0xcd,0xf2,0xbc,0x52,0xd4,0x10,0xf2,0x1b,0xdf,0xe8,0x02,0x43,0x20,0x20,0xf8,0xd9,0x55,0x09,0x1e,0x09,0x33,0xf5,0x29,0x1d,0x47,0xef,0xc5,0xfc,0x1d,0xfd,0x11,0x33,0x24,0xbd,0x10,0x47,0xd4,0x4b,0xd1,0xe4,0x1f,0xd2,0x13,0x35,0x08,0xbd,0x02,0x01,0x95,0xa1,0x2b,0xe0,0x0d,0xda,0xe0,0x01,0x12,0xf9,0x10,0x1a,0xb4,0x18,0xb9,0xe0,0x29,0x0c,0xf8,0x1b,0xf7,0xf7,0xdf,0xce,0x18,0x0f,0x3a,0xd6,0x09,0x16,0x1f,0xf6,0x08,0xf5,0x56,0x26,0x4f,0xdb,0x05,0xdd,0x2b,0x40,0x1c,0xf5,0x11,0x0e,0xdb,0xf4,0x3c,0x0c,0xe5,0x00,0x42,0xc0,0x7f,0xe4,0x3a,0x9a,0xfb,0xd9,0xf8,0xbb,0x1c,0x47,0xdd,0xfd,0xfa,0xfc,0x08,0x04,0x12,0x00,0xe4,0x55,0x3d,0x46,0xd7,0x4b,0xef,0xcb,0xcc,0xed,0xd8,0x24,0x17,0xde,0xdb,0x4c,0x28,0x04,0x1a,0xf7,0xeb,0xda,0xe8,0xe1,0x1f,0xfd,0x38,0xf5,0xf1,0xff,0xcf,0x1c,0xad,0x57,0x26,0x20,0xfd,0xc9,0x0e,0x1f,0xb1,0xbe,0xe5,0x0e,0xe4,0x41,0xda,0x47,0xea,0x06,0x24,0x1f,0xd5,0xdf,0x26,0xe2,0x08,0x31,0x2e,0x7f,0xeb,0xfe,0x0f,0x12,0x59,0x79,0xee,0xee,0x16,0x05,0x4f,0xfb,0xc0,0xe5,0x1e,0x20,0xef,0x2a,0x43,0x31,0x01,0xcc,0x06,0x7e,0xc9,0x03,0x1b,0xfa,0xc0,0xfc,0x10,0x2d,0xe9,0x8b,0x29,0xf4,0xcf,0x30,0xef,0xf4,0xfd,0x03,0x5c,0x2f,0xfa,0x25,0x1a,0x0d,0x0b,0x2d,0x12,0xa7,0xfc,0x45,0xd5,0x10,0xeb,0xe0,0xce,0x14,0x13,0x3e,0x33,0x3d,0x24,0x49,0xfd,0x0e,0x24,0xfc,0x11,0xfc,0xea,0xed,0xdb,0x2d,0x0f,0x5d,0xff,0xfb,0x2b,0x15,0xf3,0xdb,0xf8,0x19,0xde,0xf6,0x02,0xf9,0x10,0xeb,0xea,0x12,0x44,0xe1,0x65,0x0d,0x6b,0xb1,0x6a,0x1a,0x37,0x01,0x13,0x24,0x39,0x17,0xaa,0xfb,0xe7,0xff,0xd2,0xf6,0x8d,0xc7,0xed,0x09,0xfb,0x2f,0xdd,0x01,0xe0,0x9f,0x0e,0xd3,0x12,0xd6,0x07,0x04,0xfe,0xfd,0x1b,0x19,0x1c,0xeb,0x49,0x07,0x4f,0xd5,0xff,0xba,0xe8,0x2d,0x7f,0x31,0x28,0x34,0x18,0xea,0x46,0x38,0xf4,0xdc,0x16,0x11,0x12,0x4f,0xc7,0xf6,0x14,0xb5,0xbd,0x15,0x37,0xfe,0xd8,0xe4,0x3a,0xc7,0x07,0x08,0x0e,0xea,0xef,0x52,0x26,0xf6,0xa6,0x16,0x00,0x05,0x2f,0xbc,0xd7,0xdb,0x1a,0x00,0x14,0xf8,0x9a,0x37,0x1f,0x54,0xda,0x22,0x54,0xf1,0x10,0xfd,0x01,0x19,0xd6,0xe7,0x19,0x24,0x0d,0x00,0xde,0x06,0xf9,0xef,0xec,0xf7,0xcd,0xd0,0xef,0xf5,0xd4,0x0e,0xf9,0xe9,0xdd,0xdd,0xe3,0x06,0x13,0xf6,0xba,0x0c,0xed,0x27,0xd3,0x04,0x0b,0xf4,0x02,0x03,0xf9,0x06,0x02,0xfb,0x0a,0x0b,0x0b,0xdb,0xfe,0xfe,0x24,0xf2,0x01,0xde,0xdf,0x07,0x0a,0x81,0xe5,0xda,0x40,0x06,0xfb,0x00,0x13,0x19,0x1b,0x0f,0x02,0x0f,0x13,0xfb,0xd4,0x06,0xe2,0x00,0x19,0x0e,0x2f,0xf0,0x05,0x0f,0xe2,0xa3,0xf3,0xf8,0xd5,0xde,0x11,0xfb,0x0c,0x00,0x43,0x1a,0x16,0xf9,0xff,0x35,0x13,0x0f,0x01,0x34,0xf1,0x15,0xf9,0xe5,0x31,0x38,0x0f,0xd5,0x28,0xcc,0xe4,0x0f,0xf8,0xeb,0x03,0xe3,0xf9,0x0a,0x2e,0x01,0x1d,0xfa,0x18,0x05,0x19,0xe3,0xe9,0xf8,0xff,0x0b,0x1d,0xfc,0xf4,0xf2,0x10,0x1f,0xef,0xff,0xe4,0xd8,0x3b,0x01,0xe0,0x1b,0x31,0xf9,0x22,0x03,0xea,0xfd,0x05,0x05,0x01,0x4e,0xbc,0x08,0xfb,0x1d,0x4b,0xfa,0xc0,0xf2,0x19,0xc2,0xd5,0x32,0xe8,0xd5,0xe0,0xfa,0x39,0xe1,0xae,0xfc,0x25,0xcd,0xd1,0xe1,0x1d,0x69,0xbb,0xd6,0x28,0x0d,0xfa,0x24,0x3e,0xcd,0x10,0x18,0xfb,0xba,0xca,0xba,0xb3,0x03,0x1b,0x13,0xcb,0x53,0x27,0xbd,0xff,0xd3,0xd5,0x08,0xf6,0x0e,0x3a,0xf6,0x2a,0xba,0xe6,0xe5,0x3f,0x10,0x32,0x21,0xf1,0x0e,0x08,0x18,0xc8,0x4e,0xd9,0xf9,0x12,0x45,0xe2,0x2e,0xdd,0xbe,0x42,0xfc,0xf2,0x5a,0x30,0xd8,0x2a,0x29,0xf2,0xc6,0xdf,0x0e,0x29,0x14,0x94,0x12,0x1b,0xbf,0xee,0xe3,0xe7,0xdf,0xc7,0xbf,0xcc,0x23,0x43,0xd9,0xf7,0x1a,0x63,0x1a,0x9b,0x20,0x93,0x19,0xf3,0xfc,0xa2,0x07,0xf5,0xe0,0xc7,0xf9,0x51,0xda,0x24,0xa7,0x0e,0x20,0xca,0x07,0xdf,0x62,0x20,0x81,0x0e,0xdd,0x38,0x07,0xd5,0x9f,0xd3,0xfd,0x42,0x5c,0x16,0x40,0x2a,0xfe,0xb0,0x06,0x13,0xaa,0x29,0x1f,0xda,0x3a,0xe8,0x16,0x10,0x18,0xec,0x27,0xc8,0x4b,0xc2,0xe0,0x25,0xe0,0x76,0xf4,0x12,0xd2,0x33,0x29,0x30,0x10,0x48,0x30,0x25,0xa8,0xf9,0xf2,0xaa,0xe8,0x02,0xfb,0xe6,0x24,0xe3,0x23,0xb9,0x07,0x43,0xf9,0x17,0xeb,0xf7,0xa6,0x64,0x38,0x29,0xc6,0xdd,0x61,0xc5,0xf0,0xed,0x0e,0xbc,0xff,0x02,0xde,0x02,0x05,0x0b,0x5f,0x05,0xf2,0x1b,0x0b,0x26,0x55,0x1f,0xf9,0xd2,0x0b,0xfc,0xda,0xdb,0xd3,0xd0,0x2d,0x44,0x29,0x04,0xfb,0xd5,0x1a,0x2e,0xf8,0x0a,0x7f,0x27,0xcf,0xc0,0xd1,0x54,0xdc,0x30,0xe7,0x07,0x17,0xd4,0x25,0xa2,0xe9,0x32,0xe9,0xf4,0x06,0x02,0xc0,0xe0,0xeb,0x23,0x0d,0x43,0x56,0xb1,0x00,0xb4,0xf2,0x3f,0x48,0xe9,0x1d,0xf6,0x0b,0x1c,0xbf,0xfb,0x3b,0x23,0x00,0xeb,0x00,0x29,0x12,0x09,0x95,0x0a,0x19,0xe7,0xf8,0xe1,0x58,0x0f,0x1a,0xdd,0x19,0x2e,0xc4,0xfb,0x28,0x3e,0xe6,0x3c,0xb7,0x3f,0x11,0xed,0x7f,0x39,0x12,0xc9,0x01,0x28,0xc9,0xe4,0x17,0x1e,0xff,0xdc,0x03,0x19,0xf3,0xc0,0x05,0xb2,0x24,0x12,0xb6,0xfd,0xf5,0xfc,0xa3,0x3a,0xc7,0xb5,0xfc,0x12,0xfe,0x42,0x32,0x0e,0x21,0x24,0x11,0x04,0xe7,0xe0,0xc6,0xc0,0xd1,0xb6,0xa1,0xff,0x2d,0xea,0x61,0x06,0x3a,0x0a,0x29,0x95,0x2c,0x18,0xf7,0xec,0xf6,0xd1,0xed,0xf2,0xf0,0xdf,0x04,0x09,0x11,0xe7,0x59,0xcc,0xc8,0xd8,0x0a,0x4f,0x0a,0xdd,0x1d,0x40,0xd3,0xa3,0xc3,0x30,0x01,0xf6,0x25,0x05,0x59,0xff,0x25,0xe2,0x1b,0x09,0xfa,0x45,0x14,0x35,0x10,0xb2,0x43,0x3a,0x35,0xd6,0x34,0xdf,0x10,0x25,0x57,0xee,0xce,0x0e,0xf3,0xb4,0x0f,0x90,0xcc,0xae,0xb0,0xee,0xdd,0x39,0x59,0x1b,0xef,0xce,0x3b,0x4a,0xea,0x9f,0xf2,0xa4,0x98,0xcf,0xb9,0xe8,0x4a,0x1d,0xce,0x2d,0x88,0x07,0x1c,0x46,0x02,0x0b,0x2a,0xf6,0xdb,0xf5,0x3a,0x02,0xec,0x57,0x3b,0xbb,0x27,0xb4,0x0b,0x05,0x1a,0xe3,0xbb,0xe5,0xa8,0xfb,0xf4,0xdf,0x69,0xc5,0x3e,0xc4,0x10,0x2b,0x31,0xdd,0xe9,0x0a,0x58,0xd2,0x10,0xdc,0xad,0xf9,0x09,0xd5,0xfe,0xc2,0xc3,0xc6,0xdb,0xc9,0xdd,0x25,0xa8,0xb1,0x0d,0x11,0x0d,0xc3,0x16,0x09,0x11,0x28,0xd6,0x3d,0x08,0x45,0xe3,0x81,0x16,0xf8,0xa3,0x05,0x15,0x58,0x04,0xb3,0x02,0xf5,0xef,0xf2,0xdc,0xed,0xd3,0x35,0xfc,0xa8,0xe7,0xed,0xd7,0xce,0x3d,0xf9,0xcc,0xe3,0x08,0x23,0xfc,0x2b,0x17,0xf4,0xe8,0x0a,0xfb,0x9b,0xb8,0x01,0x0c,0x20,0xba,0x1d,0xf2,0xa1,0x24,0x07,0xdb,0xf5,0xda,0xd8,0x31,0xea,0xf0,0x2d,0xd1,0xb6,0xcb,0x0f,0xbd,0x1c,0xd4,0xb9,0x22,0xde,0x2e,0xba,0xee,0x06,0xbe,0x11,0xf0,0xe0,0xe5,0xf3,0xb1,0x01,0x18,0x1b,0xd9,0x07,0x2d,0xd4,0x01,0xa7,0x32,0xcb,0xea,0xfa,0x1d,0x2b,0x32,0xf7,0x0e,0x0e,0xf6,0xe2,0xd0,0x06,0xfe,0xf3,0x2d,0x10,0x30,0xcb,0x2d,0x16,0x0a,0x0e,0xdc,0xf5,0xe2,0x1f,0x37,0xd7,0xc1,0x3f,0x0c,0x12,0x0d,0xef,0x3f,0xc7,0x01,0x2d,0xd0,0xfa,0xcc,0x2b,0x42,0x63,0xdf,0x22,0x08,0xfa,0x07,0xd6,0x05,0x2a,0x1a,0x0e,0x09,0x1d,0xdc,0xd2,0x36,0xc6,0xe5,0x36,0x14,0x0d,0x1e,0x02,0xe2,0x05,0x2c,0x0a,0xf8,0x11,0x13,0x41,0x04,0x14,0x2c,0x10,0x0d,0x3f,0x0f,0xc9,0xe9,0xd4,0xe1,0x0c,0x26,0x49,0xf3,0x42,0xf6,0xcf,0xac,0x0d,0xef,0x21,0xe2,0xd5,0x23,0xe5,0xef,0xbc,0xfc,0xeb,0x0e,0x3b,0x1d,0xf1,0x11,0x01,0x03,0xb9,0xbd,0x05,0x17,0x04,0x6f,0xe1,0x11,0x65,0x11,0xe4,0x04,0x2a,0xd9,0x39,0x5e,0x7f,0xfd,0xd9,0x13,0x0c,0xb3,0xf7,0xde,0x22,0xf8,0x36,0x18,0xf7,0xdf,0x26,0x1e,0xb7,0x19,0xbb,0xec,0xb8,0x30,0x25,0xe4,0xed,0xf9,0x13,0xee,0x26,0x30,0xf1,0x1f,0xf3,0x0c,0xfb,0x03,0x2d,0x05,0xbf,0x05,0xfb,0x1c,0x07,0xbd,0xe9,0xc4,0x18,0xbf,0x10,0x09,0xb8,0x33,0x06,0xde,0xf0,0xe6,0x58,0x0f,0x08,0xfa,0xf8,0xf9,0x3c,0x18,0x25,0x13,0xd4,0x00,0x02,0xf7,0xd6,0xa3,0xf0,0xba,0x10,0x1e,0xec,0x31,0xca,0x35,0xcb,0x31,0xe7,0xe2,0x3d,0xf6,0xfe,0xd9,0x52,0xdf,0xea,0x4b,0xeb,0x7a,0x1e,0x00,0xf7,0x2f,0x88,0xfd,0xfd,0x29,0x37,0xce,0x40,0x0c,0xf1,0x28,0x1a,0xdd,0xe5,0xc7,0x81,0x1d,0xef,0xc5,0x2d,0xf9,0x13,0xc8,0xf4,0xe8,0x1f,0x09,0xea,0x07,0x04,0x04,0xbb,0x26,0xdb,0xd8,0x3f,0xf3,0x1e,0xe9,0xbb,0xc5,0x1e,0xc6,0x29,0xcd,0x07,0x0d,0xc3,0x00,0x44,0x20,0x1d,0x3b,0xfb,0xda,0x1d,0xc0,0xe0,0xc3,0x0f,0x06,0xb4,0x10,0xc9,0x0e,0x13,0x46,0x69,0x43,0xe5,0xbf,0x5d,0xfc,0x18,0x0b,0x17,0xde,0x26,0x26,0xf0,0x38,0xe0,0x46,0xd5,0xf6,0xe8,0x6b,0x11,0x24,0xe6,0x09,0xc6,0xcc,0xdd,0x30,0xfa,0xc5,0xe8,0x20,0xe1,0x0d,0x25,0xff,0x4e,0x10,0x0c,0x51,0xf3,0xe3,0xfe,0xda,0xda,0x02,0x47,0x4b,0x04,0xf7,0x10,0xe1,0xd2,0x2d,0xf4,0x07,0xf3,0x18,0x58,0xf1,0x31,0xba,0xe8,0x05,0xc3,0xd0,0xc8,0xeb,0x95,0xad,0xa8,0x26,0x09,0x12,0x5d,0xb2,0x0e,0xa9,0xde,0x1e,0x23,0xe4,0xf8,0x00,0x0b,0xf1,0x09,0xfe,0x13,0xd9,0x0c,0x19,0x14,0x0c,0x20,0xe2,0xfd,0x28,0xca,0x03,0x2d,0xf0,0x15,0xe1,0xd6,0xf7,0x1c,0xd9,0xf8,0xe7,0xe5,0x05,0x20,0x1a,0x33,0x42,0xd4,0x07,0xee,0xfc,0x21,0xe3,0x7f,0xe5,0x06,0xf3,0x88,0x2d,0xef,0x33,0x6a,0xd8,0x17,0x1b,0x3a,0xf7,0x09,0xfa,0x14,0xf5,0x03,0x11,0xfa,0xe9,0x11,0x26,0xf2,0xfc,0x34,0x30,0x10,0xfb,0x1e,0x05,0xf9,0xcf,0x16,0xcf,0x12,0x0f,0x19,0x37,0x18,0xe9,0xef,0x18,0xe0,0xeb,0x10,0xf7,0x04,0x16,0xe0,0x07,0xda,0xa8,0x09,0x14,0x23,0x06,0xdf,0xfe,0x16,0xed,0xb1,0xeb,0xef,0xc1,0xf9,0xd8,0x03,0x05,0x00,0xde,0xc3,0x0d,0x10,0xc8,0x2c,0xfa,0xfd,0xfb,0xe2,0xdd,0x27,0x06,0x00,0x0f,0xf8,0xeb,0xe0,0x2d,0xfa,0xd5,0xc4,0xe7,0x1e,0x25,0xeb,0x07,0x0c,0xc9,0xe2,0x12,0x25,0xea,0x24,0x0c,0x06,0xcc,0x2e,0xd8,0xdc,0x81,0xc4,0xfb,0xf5,0x48,0xf3,0x02,0xbf,0xcf,0xe8,0xea,0xe9,0xfa,0xcc,0xc0,0x0e,0x22,0x0f,0x11,0xcf,0xfa,0x3e,0xf8,0xa1,0x4d,0x3f,0xee,0x09,0x21,0xf3,0x11,0xe3,0xcc,0xf4,0xf0,0x13,0x13,0x42,0x13,0x1d,0xe5,0x21,0xab,0x1b,0xc6,0x0a,0xe5,0x17,0xdc,0xc7,0x2e,0x34,0xdb,0xf6,0xbe,0x28,0x15,0xf7,0xef,0xe0,0x00,0x21,0x0c,0x08,0xc1,0x27,0x13,0xf2,0x05,0xe1,0xfb,0x0e,0x1f,0x34,0xf2,0xf7,0xef,0x1e,0xf2,0xff,0xe9,0x24,0xb5,0x34,0xe1,0x8e,0xe8,0xf8,0xba,0x1e,0x1f,0xea,0xff,0x34,0x4f,0x06,0x1a,0x15,0xf4,0x15,0x1f,0x28,0xb9,0x11,0xff,0xf6,0x5c,0xf6,0xec,0xe4,0x12,0x02,0x33,0x3d,0x00,0xf6,0xfc,0x28,0x15,0xb8,0x12,0xfb,0x27,0x14,0xd6,0x04,0x0b,0x09,0xe0,0xd7,0x08,0xd5,0x45,0x36,0xde,0x05,0xdb,0x17,0x04,0x36,0xf6,0xfc,0x51,0x09,0xd8,0xfb,0x09,0x30,0x17,0xdd,0xbd,0x0e,0xe6,0x34,0x04,0xee,0x0a,0xf9,0x04,0x0b,0xfb,0xf8,0x2b,0x2c,0x12,0xc0,0xf7,0xc7,0x00,0xeb,0x1d,0x50,0x1b,0xdb,0xfd,0xc0,0xea,0x1c,0x05,0xf5,0xfa,0x3c,0x23,0xda,0x36,0x51,0xe9,0x22,0xee,0xe5,0x23,0x3c,0x3a,0xd7,0x1b,0x05,0x18,0xf0,0xe9,0xfb,0xed,0x10,0x09,0x0e,0xeb,0xe2,0x05,0xb8,0xea,0xe3,0xf5,0x1d,0x14,0x31,0xfb,0x22,0x47,0xd6,0x64,0x7f,0xe5,0x02,0xfc,0x20,0x2e,0x2c,0xea,0xcb,0x6a,0xdd,0x17,0xc9,0xf9,0x10,0x00,0x00,0x00,0x00,0xb6,0x98,0xff,0xff,0x04,0x00,0x00,0x00,0xa0,0x10,0x00,0x00,0xe1,0x16,0xfd,0x03,0xe8,0x1d,0x12,0x16,0x24,0x0a,0xee,0x01,0xf8,0xf6,0xe8,0x1a,0x81,0x31,0x01,0x73,0x01,0x06,0x0b,0xff,0xf2,0x34,0x0f,0xf0,0x04,0xd5,0xb6,0xc2,0xd4,0xdc,0xa7,0xcc,0x7f,0xd7,0x0f,0xe0,0x60,0xda,0x0d,0xde,0xb9,0xe5,0xf0,0xef,0x62,0x1f,0x2d,0x39,0x48,0xde,0x31,0x34,0x15,0xd8,0x2f,0xb8,0x22,0xf1,0x7f,0xdf,0xf0,0xc4,0xf5,0x8a,0x26,0x09,0xbe,0x14,0x75,0x35,0x3c,0x1e,0x52,0xce,0x3f,0x7a,0x22,0xa4,0xed,0x40,0x5e,0x07,0xed,0x04,0xec,0xd1,0x09,0xe4,0x11,0x09,0x1b,0x12,0x13,0xfe,0x02,0x03,0x7f,0xf6,0xc8,0xa6,0x12,0x00,0xe3,0x1b,0x0c,0xd4,0xcf,0xe3,0x1c,0x15,0xb0,0x24,0xa9,0x0c,0x81,0x29,0x25,0xf9,0xd2,0x46,0xf7,0xe4,0x4c,0xe2,0xf2,0x23,0xeb,0x46,0x49,0x12,0x15,0x1b,0xff,0xef,0xfc,0x9e,0x13,0x2e,0x25,0x2a,0xf1,0x11,0xf9,0x06,0xd1,0x00,0xf1,0x17,0x24,0x12,0xcf,0xfd,0x0c,0x31,0xab,0x1b,0x18,0x0b,0x0f,0x7f,0x42,0xfc,0xce,0xeb,0x2c,0xe6,0xd5,0xde,0xfb,0xdb,0x81,0xe6,0x47,0xe2,0xad,0x21,0x36,0xf7,0x32,0x19,0x00,0xd0,0x07,0xee,0x22,0xf6,0x1b,0xe4,0x37,0x1c,0x05,0xca,0x08,0xfe,0xda,0x58,0xd1,0x4e,0x83,0x2c,0x0e,0xfb,0x1b,0x29,0x1c,0xde,0xda,0x10,0xa9,0x34,0x15,0x06,0x19,0x6f,0x0c,0x00,0x77,0x7f,0x23,0x32,0x05,0xe9,0xe2,0x1e,0xdc,0xcd,0x06,0xf8,0x19,0xd4,0x27,0xc8,0xec,0xfc,0xe4,0xf2,0x7f,0x12,0xe8,0x9a,0xfc,0x17,0xe3,0xe2,0xe4,0x26,0xc1,0x03,0xee,0xf0,0xce,0xff,0xb6,0x10,0x02,0x1a,0x1f,0xf1,0xde,0x1b,0x04,0xdb,0x15,0xf4,0xe5,0x12,0xd6,0x9d,0x0e,0x7f,0x03,0xe8,0x65,0x08,0x0a,0x29,0xd0,0xe1,0x48,0x22,0x26,0xb9,0xc4,0xef,0x37,0x04,0x0e,0xcb,0x49,0x1f,0x1b,0xb5,0x56,0x40,0x25,0x00,0xe5,0x97,0x27,0xa9,0x35,0x2d,0x81,0x3b,0x29,0x06,0xa3,0x04,0xbb,0xd9,0xe6,0x12,0x3e,0xec,0x24,0x22,0x00,0xec,0xd1,0x0e,0x6e,0xcd,0xad,0x94,0x1b,0x7f,0xd0,0xbb,0x1e,0x46,0xe3,0xdc,0xe2,0x0f,0x4c,0x16,0xfd,0x40,0x9f,0xea,0x32,0x03,0xb5,0x39,0x26,0x0f,0xf5,0xd8,0xab,0xe0,0x4a,0x7f,0x37,0x42,0x22,0x09,0x24,0xdd,0x28,0x0b,0x81,0x22,0x53,0x06,0xc0,0xfe,0x6c,0x18,0x2d,0xc7,0xf1,0x0f,0xde,0x15,0xca,0xe3,0x9f,0x57,0x02,0xbe,0xd2,0xf7,0xde,0x08,0xd5,0x00,0x1a,0xd8,0xf7,0xe0,0xf9,0x17,0x1e,0x15,0xad,0xe8,0xed,0xdf,0xe3,0x43,0xcf,0xf8,0xca,0x1b,0x3e,0x25,0xf2,0x1a,0x7f,0xc5,0x43,0x16,0x21,0x21,0x03,0xb7,0x12,0x04,0x38,0x81,0x3c,0xa5,0xae,0xd8,0x0e,0x9a,0xd3,0xdd,0x09,0xf8,0xff,0x1d,0x7d,0x19,0x37,0x47,0xad,0xbe,0x07,0xcf,0x43,0xfd,0x22,0xe2,0xfb,0x00,0x17,0x0c,0xee,0xcc,0x04,0xfd,0xdc,0xef,0x67,0xd2,0xdc,0x05,0xe1,0x16,0x7f,0xfa,0xc0,0xb5,0xec,0xb8,0xe1,0x23,0xe6,0x46,0xd0,0x02,0xeb,0xe0,0x3b,0xfc,0xe7,0xfd,0x7f,0x00,0xf0,0x09,0x29,0xc9,0xf1,0x16,0x07,0xe9,0xfe,0x20,0xdc,0xd5,0xeb,0xd7,0xf1,0xa6,0x01,0xdc,0xf7,0x36,0x25,0xdc,0xb4,0x2c,0xbc,0xfb,0x73,0x20,0x97,0x22,0xc0,0xc6,0xde,0x2d,0x3d,0xb0,0xae,0x0b,0x7f,0x9b,0x05,0xe6,0xf9,0x06,0x8b,0xe1,0xc9,0x10,0x16,0xbf,0x15,0xd5,0xca,0x00,0xfb,0xd2,0x1c,0x1c,0x45,0xc1,0x58,0x09,0x07,0x07,0x5c,0x1b,0xd0,0x81,0x94,0xcb,0xa9,0xdd,0x67,0x08,0xac,0x05,0x0d,0x0f,0xcd,0xf6,0xca,0x03,0x08,0xfb,0x07,0x09,0x23,0xe7,0x04,0xd8,0xfd,0xfb,0x57,0xe9,0xda,0x81,0xd9,0x63,0xce,0xd6,0x31,0x15,0xeb,0x2c,0xf7,0xf5,0x4d,0xf4,0x21,0xc0,0x48,0xde,0x31,0xbd,0x72,0xa7,0xf7,0x1c,0x19,0xeb,0x2a,0x5a,0x00,0xd1,0xd5,0xd5,0xec,0x2d,0x81,0xc6,0x12,0x0e,0x3b,0x2c,0xd6,0x1f,0x24,0x11,0xa7,0xe4,0x3b,0xe7,0x33,0x13,0x23,0xef,0xc4,0x2f,0x03,0x2e,0x1e,0x26,0x5b,0xcf,0xf5,0x08,0x71,0x7f,0x1b,0xbd,0x10,0x0e,0xfa,0xfb,0xe7,0xcf,0xd0,0x2e,0xe9,0xfc,0x07,0xe8,0xeb,0x05,0xbb,0x06,0x44,0xe9,0x0b,0x8e,0x09,0x1a,0x81,0xda,0x27,0xfd,0x93,0xf9,0xf8,0x00,0xf5,0xd8,0xd1,0xc5,0xbf,0xce,0x7f,0xcf,0xe9,0x06,0x51,0x0e,0xd7,0xba,0x35,0xe3,0x3e,0x31,0x73,0x12,0x06,0x18,0x52,0xfa,0xf0,0xe9,0x46,0x06,0x28,0x4b,0x10,0xd2,0xe9,0xdc,0x42,0x7d,0x37,0x06,0x0d,0x13,0x1d,0xc5,0x6e,0xca,0xb5,0x06,0x53,0x81,0x05,0xeb,0x12,0x19,0x99,0xe0,0xde,0xe6,0x4a,0xfc,0xfe,0x03,0x42,0x21,0xd3,0xf1,0xe5,0x0c,0xc9,0x1d,0xf2,0x14,0x39,0xf5,0x2e,0xe0,0xd5,0xe4,0xfe,0xe2,0x81,0xed,0x0b,0xfb,0xef,0x5c,0x37,0x7f,0x08,0xe3,0xeb,0xd5,0x23,0x8d,0x61,0xcf,0xd4,0x3b,0x57,0x88,0x40,0x28,0xb5,0x47,0x25,0xcf,0xf2,0x7c,0xcd,0x93,0xef,0xb9,0x46,0xa2,0x02,0x8d,0xf6,0x81,0xfb,0x12,0x30,0x2a,0xa2,0xe6,0x42,0xfd,0x30,0x31,0x96,0x36,0x08,0x52,0xc8,0xb8,0x2d,0x0f,0x13,0x26,0xce,0x1e,0x2c,0x84,0xb7,0xc4,0xa4,0x81,0xe0,0x05,0x0f,0xe1,0xb6,0xda,0x74,0x03,0x1f,0x0e,0xba,0x39,0xe8,0x0e,0xb2,0xca,0x56,0x61,0x06,0x13,0x06,0xf1,0x3d,0x16,0xd9,0x0b,0xe7,0xf0,0x0c,0xf8,0x06,0xef,0x14,0xfd,0x20,0xe7,0xcd,0xdd,0x7f,0x13,0x21,0x92,0xff,0x53,0xbc,0x26,0x0b,0x09,0xd3,0xfd,0xd1,0x17,0x37,0x25,0x18,0x46,0x41,0x11,0xea,0x09,0xe0,0xd5,0xe7,0x0d,0x03,0xf6,0x81,0x28,0x22,0x3f,0xfd,0xd2,0x29,0x1b,0x00,0xfe,0x38,0x17,0xa9,0x07,0xf0,0xfe,0xab,0x0c,0x20,0x28,0x01,0xf4,0xbc,0x01,0xce,0xf8,0xbd,0x05,0xb1,0x4a,0x81,0xf3,0xff,0x4e,0x01,0x16,0x39,0x22,0xd5,0xf1,0x46,0xfc,0x46,0x34,0x22,0x70,0xf1,0xc0,0xbf,0xd1,0xcc,0xc6,0xc0,0x1b,0xe2,0x60,0x5f,0x0d,0xe1,0x0f,0x31,0xab,0x6d,0x16,0x7f,0x90,0x67,0xca,0xf1,0xb6,0xcf,0xd9,0x1b,0xab,0x13,0x03,0x16,0x15,0x81,0xf6,0xd5,0xff,0xfc,0x1b,0xb9,0xd7,0xd1,0xd0,0x85,0x10,0x0a,0xa2,0xff,0x41,0xc5,0xfa,0xb6,0xfa,0x3d,0x28,0xf4,0x24,0x81,0x08,0x0b,0x2b,0x2a,0xca,0x16,0x13,0x23,0x9f,0xd4,0xd8,0xd4,0xdf,0x9a,0x0b,0xda,0xce,0x1a,0xda,0xa2,0x5e,0xf2,0xf9,0x12,0xfe,0x14,0x10,0x7f,0xfd,0x5f,0xcd,0x45,0xa3,0x12,0x3c,0x1f,0xc2,0x98,0x05,0x37,0x09,0xe0,0x2d,0x16,0xa4,0xd2,0xef,0x23,0x7e,0xd1,0x11,0xd9,0x26,0x9a,0x1b,0x05,0x52,0xe1,0xd2,0x94,0x1c,0xa5,0x20,0x04,0x0a,0x81,0xf0,0xe2,0x3a,0xe8,0x3a,0xf3,0x28,0xd7,0xf6,0x37,0xc9,0xf8,0xe4,0xe5,0x10,0xce,0xfe,0x28,0x1b,0xe0,0x17,0xdf,0xf6,0x1c,0x00,0x02,0xf1,0x05,0x24,0x05,0xf1,0x38,0xec,0x25,0x7f,0xf3,0xf8,0xe8,0x19,0xa1,0xce,0xe2,0x0b,0xf2,0xeb,0xca,0x33,0x28,0x46,0xba,0x2d,0x52,0xd9,0x1f,0xf5,0xaf,0x4f,0x25,0xac,0x81,0xdb,0x51,0xda,0xbd,0x7b,0x9e,0xe4,0xbc,0x06,0x37,0xdf,0x19,0x41,0x02,0x08,0xd3,0xa0,0x27,0xe0,0xec,0x00,0xc0,0x16,0xf4,0x7f,0x24,0x49,0xd0,0xd1,0xfb,0xf9,0xfe,0x00,0x11,0xe5,0x28,0x0d,0x1c,0x1c,0xbe,0x3d,0x01,0x0b,0x01,0x5b,0xdf,0x7f,0xe6,0xd2,0x38,0x09,0x05,0xf7,0xfd,0xa1,0x41,0xea,0x07,0xbc,0xf3,0xc3,0xd9,0xa9,0x31,0xf2,0xd0,0xcb,0xff,0x04,0xce,0xfd,0x4f,0xca,0xfb,0xa1,0x23,0x02,0x7f,0xc5,0x42,0xe7,0x34,0x42,0xf2,0x5b,0x34,0xe5,0xee,0xa5,0x4f,0x61,0x87,0xb4,0x3d,0x25,0x36,0x38,0x9c,0xe5,0xf8,0x9f,0x42,0xd9,0x0d,0x21,0x81,0x00,0xe6,0x59,0x06,0x34,0x06,0x28,0x3c,0xa8,0x0e,0x4d,0x20,0x3f,0x17,0xfc,0xd1,0x0f,0xc1,0xff,0xef,0xff,0x11,0x01,0x10,0x0a,0x1a,0xf9,0xe0,0xdd,0x11,0xde,0xfd,0x81,0x35,0x3c,0xc7,0x34,0x02,0x11,0xf3,0x07,0x09,0xef,0xbc,0x07,0xff,0xfc,0x81,0x0d,0x16,0xff,0xbc,0x1a,0x0b,0xf1,0xd4,0xe6,0x09,0xd2,0x4c,0x1a,0x47,0x27,0x03,0xfa,0x51,0x32,0xee,0xff,0x4f,0x40,0xd3,0x32,0x23,0xde,0x81,0xf4,0x38,0xeb,0x19,0x43,0xfc,0xf1,0xf9,0x0d,0xfb,0xeb,0xe1,0x2c,0x3b,0xe7,0xec,0x0c,0x4b,0x5d,0x12,0x9c,0x44,0x13,0xc6,0x2f,0xcd,0x45,0x08,0x5d,0xa7,0xe9,0x1a,0x43,0xb9,0xf2,0x40,0x29,0x3c,0x57,0xf0,0xc3,0x0d,0xf1,0x07,0xe1,0xf3,0x15,0x7f,0xa7,0xfd,0x4e,0xb6,0x55,0x81,0x50,0xdf,0xff,0xdf,0xe0,0xd4,0xf8,0xd3,0xe2,0x47,0xe8,0xbf,0x33,0xaf,0x12,0x14,0x1e,0x16,0x69,0x3f,0xab,0x39,0xbd,0x03,0x2a,0xb2,0xe1,0xcf,0xf6,0x22,0x04,0xd1,0x25,0x2c,0xfb,0xf5,0xd9,0x13,0x01,0x38,0x29,0x92,0x81,0xd2,0x09,0x97,0x1b,0x1e,0x1c,0xda,0xc8,0x77,0x24,0x16,0xe3,0x2f,0xbb,0x91,0xf5,0x5e,0x3e,0x36,0x1e,0x63,0xe3,0x58,0xd6,0xda,0xce,0xfa,0x7f,0xfd,0xef,0xeb,0x19,0xc7,0xff,0xf4,0x1f,0xad,0xc9,0x4a,0x35,0x03,0x5e,0xe3,0x14,0x1c,0xd9,0x24,0xf4,0xd6,0x1e,0xf1,0x0f,0x81,0x58,0xcb,0x30,0xf8,0xf4,0x2c,0x9a,0xf4,0x20,0x2e,0x15,0x17,0x06,0x1f,0x20,0x34,0x3a,0xf1,0x21,0xdf,0x0d,0xd7,0x03,0xd9,0x02,0x14,0x15,0x81,0x2b,0x05,0x4f,0x04,0x03,0x27,0x10,0x15,0xf2,0x4d,0x15,0x3e,0xe7,0xe6,0xea,0x01,0x31,0xc5,0x0e,0x4e,0x2b,0xc5,0x0a,0x01,0xe4,0x13,0x1a,0xab,0xab,0xfd,0xd3,0xd5,0x7f,0x06,0xf3,0x0f,0xff,0x2a,0x2c,0xf9,0xed,0x3b,0x1e,0x25,0x2b,0x81,0xee,0xc9,0xe2,0xda,0x37,0xd3,0x0b,0x8d,0x0f,0x0a,0xb7,0x41,0xbd,0x32,0xb8,0xec,0xf2,0x46,0xd7,0x1f,0xbc,0x98,0xde,0xc2,0x0d,0xc2,0x38,0x57,0x19,0xe2,0xc7,0xd6,0xc6,0xcc,0x0b,0xcf,0xf9,0x0a,0x05,0xae,0xcd,0xfa,0x7f,0x16,0x0c,0x53,0x15,0x3d,0x62,0xce,0x0b,0x31,0x25,0x03,0x24,0xb4,0x10,0xc6,0xaa,0x26,0xfd,0x1f,0xfd,0xf5,0xe4,0x7f,0x29,0xfe,0x44,0xcd,0x4a,0xf9,0x05,0x0c,0xac,0x0f,0x29,0x04,0xe7,0x41,0x08,0x53,0xf8,0x0b,0x05,0xe2,0x0b,0xeb,0xcc,0x0a,0x0a,0xc5,0x1c,0xd9,0x60,0x5b,0x3b,0xba,0xb9,0xdb,0xd7,0x3e,0x1f,0x81,0x01,0xa6,0xca,0x27,0xc2,0xf8,0xed,0x5c,0x00,0xda,0xe0,0x4a,0x81,0xc4,0x09,0xdd,0xff,0xcb,0x49,0xee,0xab,0xd2,0xb6,0xc2,0x11,0xbe,0xed,0xee,0x33,0x22,0xb1,0x3c,0xd7,0x26,0xc2,0xcb,0xfa,0x1d,0x20,0xe6,0xca,0x5e,0x04,0xfc,0xe8,0xa5,0xeb,0x31,0x7f,0xce,0xad,0x22,0xf8,0x10,0x06,0xd8,0x55,0x0a,0x12,0xff,0x2a,0x3b,0x1b,0xbe,0x11,0xfb,0xd2,0x1e,0xe8,0xea,0x16,0xab,0x24,0x81,0x3b,0x15,0x41,0x13,0x23,0xf1,0x1f,0x26,0x37,0xf0,0x36,0x0d,0x0e,0xaf,0xed,0xed,0x2e,0x81,0xf9,0x0d,0xfd,0xf0,0x1d,0xe7,0xdc,0xfb,0xf9,0x09,0xef,0x20,0x1e,0x4c,0x02,0x17,0xf3,0x62,0x08,0x3f,0xd5,0xb9,0x0a,0x47,0x46,0x67,0x08,0x3c,0x32,0x81,0xf4,0xb5,0xcb,0xe3,0x12,0xb8,0x42,0xa9,0x48,0x0e,0x12,0xb4,0xc1,0xe7,0x52,0xdd,0x1e,0xd9,0xd9,0x05,0xad,0xde,0x0c,0xa4,0x0e,0x25,0x31,0x01,0x09,0x09,0x09,0xdd,0x07,0xe9,0x1d,0x96,0xf7,0xea,0xa9,0xcc,0x3b,0xc4,0x81,0x53,0x72,0xfb,0x27,0xc4,0x01,0xf1,0xf0,0xf2,0x32,0xc8,0x0e,0x81,0x44,0xcd,0x3e,0x61,0xd5,0xff,0xf9,0x1b,0x13,0x0c,0xe1,0x97,0x0e,0xf4,0x13,0x40,0xf2,0xd1,0x04,0x21,0xd7,0xd8,0x2e,0x2c,0xf1,0xac,0x1b,0xa8,0x2b,0x0d,0xcc,0xb9,0x16,0x37,0xea,0x81,0xa1,0xf2,0xa0,0xf3,0x97,0xe6,0x00,0xff,0xf9,0xed,0x08,0x21,0xe6,0x23,0xe2,0x0c,0x13,0xdf,0x05,0x23,0xbd,0x07,0xfc,0x0f,0x04,0x02,0x01,0x36,0x10,0xff,0x4c,0x17,0x3d,0x30,0x1b,0xc8,0xc9,0x7f,0x24,0xf1,0xf2,0xb6,0xf2,0xb7,0xff,0x27,0x1b,0xb0,0xf5,0xb3,0xfc,0x96,0xfb,0x18,0xeb,0xb0,0x02,0xfe,0x81,0xf7,0xff,0xe5,0xea,0x2e,0xba,0x44,0xc9,0x23,0x17,0x4e,0x11,0x20,0x20,0x68,0x0b,0xc9,0x3e,0x7f,0xd4,0xc1,0x11,0x35,0x09,0x33,0xbf,0x06,0xe1,0xeb,0xb2,0xf4,0xbb,0x96,0x34,0x56,0x50,0x10,0x21,0xc8,0x36,0xbb,0x0e,0xdb,0x09,0x9e,0x1e,0xc5,0x4a,0xf7,0x01,0xdf,0x0c,0x45,0xee,0xe6,0xd4,0x1a,0x08,0xd7,0x7f,0x30,0xe6,0xdf,0xbc,0x26,0x24,0x46,0x33,0xcc,0x38,0x1f,0xe8,0x13,0xfc,0x5d,0x1a,0xf0,0x37,0xbd,0xdb,0xe0,0xda,0xcf,0x2a,0x7f,0xed,0xd0,0xfe,0x23,0xe6,0x16,0xf9,0xdf,0xc3,0xbe,0xba,0x07,0x18,0x53,0xd6,0xf8,0x01,0xfa,0x96,0x8b,0xfa,0xdf,0x35,0x81,0x2e,0x2c,0x1f,0x23,0xcc,0x26,0xac,0x62,0x4b,0x26,0xeb,0x81,0x13,0x33,0x57,0x30,0x6f,0xf3,0x1c,0xf1,0xf3,0x3e,0xfd,0x96,0xe0,0xa1,0x50,0xad,0x7f,0xcb,0x3d,0x05,0x00,0x19,0xb1,0xec,0x61,0x35,0xe9,0xcf,0xb9,0x50,0x17,0xb9,0x28,0x7f,0x1d,0xbf,0xfe,0x1d,0xea,0xf7,0x29,0x0d,0xff,0x50,0x1a,0xe1,0xd7,0xc8,0xf9,0x52,0xf0,0x9a,0xf4,0x04,0x3d,0xc3,0x00,0x3d,0x41,0xd0,0x10,0x76,0x2c,0xab,0x29,0x3a,0xee,0x81,0xf8,0xb3,0x33,0x12,0x3f,0xe4,0xbb,0xa4,0x0e,0xe6,0xd2,0xd6,0x6c,0xfa,0x00,0xa9,0x0f,0x04,0x57,0xd7,0x7f,0xe2,0x13,0xb2,0x1f,0xe3,0x42,0xea,0x07,0xc7,0xf9,0xff,0xed,0xdf,0xbd,0x1a,0x28,0x48,0x38,0xdf,0x17,0x39,0xe2,0xd4,0x0d,0xde,0x23,0xfd,0x64,0xcb,0x03,0xe1,0x11,0xd6,0x38,0xdf,0xf9,0xd4,0x12,0x81,0x31,0x15,0x27,0x14,0x23,0x08,0xd6,0x25,0x2d,0x39,0x05,0x00,0xf6,0x0b,0xeb,0xec,0x15,0x7f,0xf3,0x16,0x0c,0xfa,0xd3,0x26,0x24,0xea,0xec,0x03,0x28,0x4f,0x1f,0x42,0xf2,0x1a,0x08,0x19,0xfd,0xff,0x35,0x7f,0xbd,0xd4,0x81,0x2c,0xb7,0x53,0xc4,0x40,0x33,0xe7,0xe1,0x19,0xc9,0x22,0x4a,0x39,0xf9,0x48,0x0b,0x6c,0x9e,0x3b,0x28,0xeb,0x06,0x0a,0xad,0x27,0x07,0xea,0x02,0xf8,0xd3,0x5d,0xcb,0x73,0x2a,0x11,0xca,0x17,0x20,0x36,0xc5,0x81,0xa1,0x2f,0x10,0x29,0x0f,0xba,0xbd,0x9c,0xb8,0xad,0x29,0xae,0x05,0xdc,0x0c,0x9a,0x22,0x38,0x1f,0xf4,0x81,0x12,0x17,0x9e,0x03,0xdf,0xeb,0x31,0x6f,0x15,0xdd,0xdd,0x77,0xee,0xc7,0xe2,0x1a,0x29,0xd7,0xf9,0xae,0xbf,0xec,0x03,0xd2,0xd6,0x07,0x14,0x36,0xf2,0xd9,0xbe,0xfa,0x15,0x0e,0x88,0xd5,0x19,0xc3,0x47,0x90,0x10,0x81,0x03,0x59,0xd1,0xf3,0xdb,0x05,0xfd,0x10,0x06,0x0d,0x7f,0x15,0x26,0xe4,0xf2,0xde,0xc9,0x00,0x2b,0xea,0x10,0x3c,0xa4,0xf5,0x08,0xe3,0x0f,0x9b,0x18,0xf1,0x19,0xff,0xf9,0xcf,0x64,0x1a,0x1c,0xc2,0x2e,0x03,0x32,0xfa,0x39,0xbd,0x31,0x2b,0xd0,0x03,0xbf,0x29,0xfb,0x7f,0xe8,0xc2,0x2e,0x03,0xf3,0x04,0xfc,0x66,0xb0,0xd1,0xfe,0xe5,0x1e,0x11,0x34,0xe3,0x19,0xc9,0x7f,0xb8,0xdc,0xea,0xfa,0xf6,0xe6,0x6e,0xd9,0xa4,0xde,0xf8,0x23,0xe2,0xdc,0x2b,0x6a,0xfd,0xaf,0xd7,0xeb,0xea,0xfd,0x2a,0xd9,0xf7,0xd9,0xb9,0x81,0x0b,0xd6,0xfb,0x98,0xc9,0xe2,0xe2,0x66,0x9f,0xfc,0x63,0xbe,0xe2,0x7b,0x8f,0x00,0x24,0x9a,0x06,0x0d,0x25,0x81,0x08,0x53,0x39,0xee,0x11,0xe6,0x29,0xeb,0xf2,0xd7,0xee,0xed,0x3c,0xc3,0xaf,0xe2,0x2c,0x2e,0x15,0x19,0x6f,0x10,0xe1,0x17,0x26,0x87,0x9e,0x0b,0x30,0xae,0x18,0xea,0xfb,0x8e,0x63,0x17,0xd1,0xfa,0x03,0x0c,0x1b,0xfd,0x2f,0x24,0x49,0x28,0x7f,0x49,0xdf,0x3c,0x02,0x63,0xbc,0xb2,0x81,0xde,0x9d,0xe9,0xe4,0x92,0xbe,0x0b,0x1e,0x58,0xff,0xd7,0x20,0x3f,0xac,0xd4,0xa2,0x23,0xe9,0x9b,0x7d,0x2b,0xbc,0x3b,0xe8,0x62,0x06,0x16,0xe7,0xb4,0xf4,0xde,0xf3,0x7f,0x2c,0x14,0x16,0x24,0xed,0x66,0x08,0x48,0x0d,0xc8,0x6b,0x57,0xd5,0x11,0xe2,0xf3,0xe3,0xee,0xd9,0xb7,0xe9,0x34,0x41,0x44,0x2d,0x8d,0x45,0xbc,0x14,0x19,0x2e,0xd7,0x24,0x52,0xff,0x9d,0xbf,0x81,0x1e,0x84,0xdb,0xe6,0xf0,0x91,0xc9,0xfb,0x00,0xcf,0xcc,0x06,0xea,0x03,0xe6,0x6e,0xdb,0xd9,0x1a,0xed,0xee,0xd2,0x08,0xe3,0x0b,0xb0,0xf2,0xfc,0x81,0x0d,0xb0,0x10,0xf6,0xe0,0xdc,0x0d,0xeb,0xfc,0x32,0xd0,0x36,0x46,0x2b,0xf4,0x13,0xbc,0x31,0xea,0x5f,0xf5,0x00,0xe9,0x08,0xe4,0xc7,0x0f,0x25,0x2a,0x50,0x3d,0x7f,0xcb,0x16,0x30,0x06,0x47,0x41,0x30,0x0d,0xf3,0x1f,0x22,0x07,0xe7,0x01,0x7f,0x0b,0xb7,0xf0,0xf6,0x13,0xcd,0xf9,0xee,0xfc,0x69,0x09,0xbb,0x25,0xee,0xd5,0x26,0xfb,0x63,0x01,0xc7,0xe5,0xb7,0xdf,0x2a,0x09,0x34,0xdd,0x34,0xb4,0x5d,0x0f,0x7f,0x03,0xe0,0x00,0xfd,0x34,0xa1,0x54,0xf4,0x08,0xc2,0x02,0x32,0x34,0x38,0xe1,0x12,0xef,0x2a,0xf5,0xf0,0xf1,0xf7,0x4e,0xf7,0xc4,0x05,0x0e,0x18,0x31,0x81,0x92,0xe2,0xd4,0xf9,0xa6,0xc7,0xfb,0x2e,0x1c,0xc6,0x0e,0xe3,0xf6,0x5b,0xee,0xbe,0xe7,0x17,0xe2,0x3d,0xd5,0x56,0x3b,0x2b,0x0b,0xa3,0xf8,0x7f,0x36,0x12,0xec,0x24,0x87,0xf0,0x0f,0xa9,0x10,0xe0,0xa7,0xe3,0x05,0x28,0x1a,0x1b,0x1e,0x01,0x09,0x0c,0xe6,0xed,0x10,0x28,0x09,0xfb,0xcd,0x81,0x02,0x23,0x13,0xfa,0x27,0x1f,0x28,0xf4,0xf3,0x2f,0x37,0xf1,0xf0,0x07,0xca,0x91,0x56,0x5e,0x4e,0x81,0xf0,0xca,0x17,0xb8,0xd7,0x13,0x2a,0x4f,0x1c,0xf5,0x09,0x3c,0xed,0x0e,0x0f,0x17,0xc0,0x58,0xe1,0x36,0x00,0xeb,0xf7,0x09,0xf3,0x13,0xfc,0x03,0xcf,0x2c,0xcc,0xc8,0xee,0xc4,0x1c,0x39,0x1e,0x03,0x81,0x39,0x1e,0xcf,0x32,0xec,0x2a,0xec,0xf1,0x38,0xe6,0x2a,0x0e,0xb0,0xd0,0x2a,0x3c,0xda,0xf8,0x81,0x08,0xc3,0x0f,0x18,0x0a,0xe8,0x09,0x04,0x03,0xf0,0xf6,0xca,0x04,0xe8,0xa7,0xe5,0x9b,0x10,0x0a,0xe0,0xf3,0xf3,0xd2,0x32,0xe8,0x01,0xee,0x22,0xe4,0x12,0x17,0xfd,0xfa,0x7f,0x05,0x06,0xb2,0xf1,0x17,0xcb,0xe1,0x0d,0xd9,0xa9,0xe3,0x26,0xb4,0xc5,0xf7,0xf6,0xde,0xbd,0x04,0x7f,0xa9,0x01,0xd7,0xea,0x06,0x0a,0xfb,0xd5,0xd5,0x21,0xd6,0x51,0x55,0x36,0xe1,0x0a,0x15,0x43,0x5f,0x16,0xf2,0xc2,0xc7,0xfd,0xe1,0xfd,0x02,0xf7,0xe7,0x3d,0xd0,0xdd,0xf9,0xfd,0x06,0x49,0x20,0xd2,0x8c,0xd8,0x1b,0x81,0xc7,0x1f,0xfc,0xc6,0xee,0x27,0xe8,0xfb,0x0e,0x22,0xca,0xd5,0xee,0xe9,0x2c,0x2b,0xa2,0xde,0x03,0xed,0xf9,0xa7,0xa7,0x1d,0xfb,0x19,0x81,0xd8,0x2e,0x1e,0x1f,0x03,0x1c,0x29,0x12,0x1f,0x17,0xbe,0x04,0xf8,0xfe,0x40,0x0a,0x46,0xd7,0x3b,0x00,0xec,0xe1,0x7f,0xe3,0xe8,0xce,0x01,0x38,0xf7,0xfb,0xf3,0x2c,0xc5,0x3c,0x13,0x11,0x2f,0x0a,0x1c,0x57,0xe7,0x2b,0xda,0xdb,0xcb,0x1d,0xdd,0xf4,0xd1,0x50,0x81,0x25,0x2d,0x40,0x06,0x2d,0x03,0x1e,0x0c,0x18,0x19,0xfc,0x32,0xf8,0xd4,0x03,0xc9,0xd6,0xf6,0xfe,0xec,0x06,0x05,0xfe,0xf8,0xe3,0x01,0xe8,0x7f,0xec,0xdf,0x8f,0x02,0x31,0xa9,0xee,0xff,0xf9,0xb3,0xe3,0xa7,0x0e,0x54,0x4e,0xaa,0x1c,0x7f,0x28,0xe7,0x00,0xe9,0x07,0xe5,0x14,0xc6,0xf6,0xf1,0x3c,0xcf,0xcc,0xe2,0x04,0x03,0xef,0x03,0xf3,0xc1,0x00,0x81,0x1a,0x35,0x48,0x29,0x0f,0x11,0x07,0xcf,0x0f,0x28,0xfd,0xc1,0x12,0xb1,0x1f,0xa3,0x3f,0xc7,0x05,0x11,0xd3,0xf4,0x08,0xee,0x34,0xd7,0xe7,0x2e,0xef,0x38,0x06,0xb6,0x1a,0x58,0x29,0xa5,0x23,0xfd,0x10,0xd0,0x20,0x2e,0x04,0x24,0xf9,0xf3,0xf3,0xe2,0xd6,0x1b,0xf5,0x81,0xc3,0xd1,0xfa,0x81,0xc4,0x29,0x13,0xde,0x0f,0x03,0xfe,0xe6,0xa3,0xe6,0xf0,0xd8,0x13,0xa0,0x35,0xdb,0x45,0xc9,0xb7,0x0f,0x12,0x21,0x0d,0x49,0x41,0x33,0xf3,0x1b,0xf3,0x00,0x09,0xbb,0xea,0x13,0x02,0xf7,0x0a,0x35,0xe9,0xf2,0x08,0xf8,0xd7,0x56,0x1e,0xe8,0x81,0xe3,0xec,0xb6,0xe5,0x22,0x05,0xd0,0x03,0x02,0xf4,0xe8,0x31,0xf1,0x31,0x2f,0x33,0xb9,0x12,0xa2,0x4c,0xae,0xf9,0xed,0x2b,0xac,0xf0,0x36,0x25,0x0e,0x4a,0x43,0xb7,0x1f,0x4c,0x7f,0xed,0x0c,0xfd,0xfc,0xf5,0x27,0x1b,0xf8,0x1c,0xfb,0xbd,0x16,0xe9,0xcf,0x1a,0xf0,0x04,0x81,0x3d,0x2b,0x49,0xd8,0x1d,0x08,0x18,0xe8,0x03,0x51,0x27,0x43,0x05,0x57,0x23,0xcd,0xfc,0x9b,0x1e,0x2e,0xbe,0x39,0x7f,0x35,0x0a,0xf9,0x01,0x2f,0x23,0x4d,0x0f,0x1d,0xbe,0x4f,0xda,0xaf,0x47,0x40,0xa1,0xed,0xf3,0xc9,0x2d,0x0c,0x29,0xba,0x19,0xc2,0xcc,0x28,0x5a,0x98,0xea,0xdc,0xfe,0x7f,0x0a,0x16,0x91,0x38,0xf8,0x29,0xbc,0xf2,0x45,0x56,0xa8,0xd5,0xec,0xd2,0xdd,0x3a,0xf5,0xf8,0x01,0x09,0xe7,0x03,0x16,0xa8,0xf6,0xd1,0x03,0x17,0xbc,0x33,0xf2,0x33,0x12,0x05,0x81,0xc4,0x3b,0x25,0x07,0xe9,0xf4,0x06,0xea,0x0c,0x02,0x2c,0xf7,0xec,0x2f,0x18,0xa7,0x0a,0x01,0x3c,0x08,0x12,0xdb,0xd9,0x04,0x81,0xdf,0xe1,0xc2,0x3c,0x1f,0xd7,0x4f,0x7f,0x93,0xd9,0xa4,0x98,0xec,0x40,0xf0,0x37,0x05,0xa6,0xfe,0x7c,0x05,0xfc,0x0d,0x17,0x1c,0x0b,0x17,0x27,0x11,0x7f,0x20,0x42,0x05,0x5f,0x1e,0x58,0xdb,0x0d,0xca,0x2d,0xb8,0x0b,0xed,0xf2,0x7f,0xf8,0x06,0x47,0x0b,0x21,0xca,0x44,0xcc,0x20,0x4b,0xf0,0xba,0x08,0x50,0xe6,0xd3,0xb8,0x4c,0xc2,0x03,0x0d,0x32,0x1f,0x47,0xde,0x1e,0xf1,0xe9,0xdc,0x0b,0xee,0x03,0xe3,0xf1,0x81,0x2e,0x11,0x75,0x0a,0x06,0x25,0xea,0x15,0x02,0x2b,0x12,0x2f,0xf6,0xde,0xec,0xf1,0x06,0x0d,0x14,0xf4,0xe3,0x19,0x1a,0xe9,0xec,0x09,0x25,0xc3,0xdf,0x32,0xfe,0x17,0x05,0xf4,0x03,0x81,0xee,0x67,0xdb,0xe5,0x26,0x25,0x55,0x0b,0x7f,0xea,0xe0,0x18,0x6e,0x79,0x20,0xdd,0x16,0x28,0xfe,0x33,0xe2,0x9e,0xfa,0x37,0xab,0xf3,0xc7,0x61,0xea,0xfe,0xa6,0x33,0x16,0x01,0xed,0xea,0x07,0x3d,0xe2,0x25,0xcc,0x27,0x07,0xe8,0x21,0xca,0x01,0x6a,0x16,0xe7,0x65,0x7f,0xff,0xd1,0x0e,0x54,0xdf,0x1b,0xf0,0x0f,0xce,0x0e,0xfa,0xa4,0xfc,0xdf,0xe8,0x20,0x23,0xa5,0x23,0x63,0x09,0x46,0xd7,0x30,0x81,0x07,0xf8,0x39,0xee,0x3c,0x27,0xe9,0x97,0x54,0x15,0x04,0xe0,0x13,0x15,0xd0,0xe4,0xee,0xff,0x57,0x05,0x3e,0xaa,0x07,0x15,0x00,0xea,0x00,0xb3,0xf0,0x1e,0xeb,0x20,0xed,0xad,0x18,0x7f,0xeb,0x5b,0xcc,0xd2,0x1c,0x28,0xdb,0xd6,0x48,0x0b,0x2d,0xb0,0x14,0xc4,0x1c,0x1e,0xef,0xd0,0xee,0x2b,0x34,0x81,0x00,0x14,0xea,0x01,0xf6,0xf2,0xd2,0x54,0x41,0x11,0x2f,0xe7,0x25,0x81,0x61,0xac,0xf2,0x30,0x1f,0xd1,0x01,0x0e,0x68,0xf6,0x2f,0xdd,0xa1,0x38,0xa6,0xb3,0x18,0x4a,0xe3,0xb9,0xe4,0x10,0xc7,0xd4,0xce,0xf8,0xfd,0x36,0x32,0x14,0xd4,0xe5,0xcd,0x19,0xb7,0x12,0xd1,0x01,0x3b,0xd8,0x7f,0xfb,0x06,0x42,0x2f,0x86,0x13,0x53,0x4b,0x37,0x18,0xdd,0xeb,0x08,0x1b,0x1f,0xb8,0xf1,0x7f,0x12,0xd9,0x4d,0x07,0xff,0xc7,0x16,0x91,0xeb,0x0c,0x7b,0x49,0x23,0x6e,0xe4,0xdd,0x3e,0x1e,0xf5,0xc5,0x05,0xe6,0x51,0x81,0x21,0xd5,0x24,0xde,0x10,0xd9,0x66,0xe9,0xfd,0x2d,0xd1,0x32,0xed,0x12,0x87,0xc2,0x25,0xe6,0x92,0xbe,0xc9,0xdf,0xb5,0x2d,0xe6,0xfb,0x05,0xb7,0x12,0xe8,0xf8,0x10,0x16,0x6f,0xf5,0x36,0xea,0xd8,0x16,0x21,0xe3,0xe1,0x81,0x23,0x2c,0xa2,0xeb,0x43,0x49,0xc8,0x1a,0xb0,0xfc,0x0c,0x04,0x81,0x17,0x1f,0x13,0x38,0xf6,0xa5,0x0f,0x03,0x18,0xc3,0x82,0x9d,0x17,0xf3,0xcb,0x22,0x45,0xe7,0x25,0x32,0xc5,0xdf,0x03,0x81,0xee,0x48,0xfd,0x42,0x25,0x08,0x0b,0xd5,0xb4,0x53,0xc2,0xb0,0x03,0x86,0x35,0x27,0x5e,0x0a,0xd2,0xe7,0xc6,0xf6,0xee,0xcc,0x40,0x18,0xf0,0xcd,0xcf,0xd0,0xf8,0xed,0xd1,0x17,0x2b,0x19,0x37,0xd7,0x48,0xd7,0xee,0xfc,0x11,0xd9,0xef,0x47,0xa2,0xd8,0xe8,0x0c,0x9b,0x81,0x46,0xc2,0xd6,0x0d,0x22,0xef,0x16,0x1e,0x1e,0xb6,0x12,0x18,0x02,0x9a,0x48,0x00,0x1e,0xd3,0xd2,0xa0,0x08,0x45,0x7f,0x3d,0x1b,0xfa,0x36,0x73,0x13,0xee,0xde,0x17,0x10,0xaf,0x14,0x02,0xe3,0x8b,0x0b,0x40,0xf7,0xf7,0xf4,0x26,0x00,0xd1,0xca,0xee,0x2d,0x09,0xf6,0x1a,0x41,0xfd,0x14,0x7f,0x5b,0xa6,0x36,0xca,0x26,0x29,0x3e,0x14,0xcb,0x75,0x33,0xa5,0x09,0xfe,0xf8,0xc9,0x35,0x04,0xde,0x25,0x11,0x01,0xf1,0x04,0x81,0xe9,0xf5,0x8f,0xf1,0xab,0xd2,0xb7,0xfa,0xe7,0xd7,0x37,0xc0,0xf1,0xd3,0xd6,0xc0,0x36,0xed,0xd5,0x0a,0xe7,0x20,0x37,0x02,0x9d,0x4c,0x4c,0x81,0x0e,0x4d,0xb1,0x25,0x15,0xbf,0x45,0xf2,0xe9,0xee,0x81,0x50,0x02,0x16,0xca,0x49,0x94,0x5a,0xaf,0xb8,0x2a,0x46,0xf4,0x8f,0xc2,0xee,0x5e,0x29,0xf7,0x46,0x04,0xb4,0x2d,0xaa,0x29,0xd5,0xce,0xde,0xdc,0xe7,0x45,0x01,0x35,0x7f,0x08,0x59,0xfd,0xe5,0xe8,0x0f,0xa4,0xe6,0xfc,0xcc,0x73,0xa2,0xee,0xe5,0x0e,0x47,0xc4,0xda,0xb5,0x16,0x1d,0x3f,0x11,0x17,0xbd,0x20,0xd9,0xd6,0x23,0xee,0x29,0x2a,0x30,0x9e,0x2c,0x25,0xcb,0xf8,0x81,0x0d,0xe9,0xf9,0xb8,0xa9,0xbc,0x1d,0xe4,0x33,0x6d,0x68,0xaa,0x04,0x7f,0x6d,0x83,0x3e,0xd0,0x3c,0xf6,0x3a,0x84,0x1a,0x24,0x55,0x52,0x1f,0x9c,0xcf,0xc1,0xfe,0xb4,0x47,0x91,0xc4,0x50,0xeb,0xf7,0x18,0xe6,0xfb,0x81,0xf7,0x26,0x16,0xdb,0x47,0x20,0xf4,0xff,0x26,0x5d,0xd0,0xed,0xe0,0xf0,0x48,0x25,0x05,0x0f,0x21,0xd8,0xe6,0xef,0x03,0x52,0x17,0xc3,0x21,0x7f,0x29,0xc3,0x20,0xfb,0xff,0xdb,0x22,0x0e,0xf7,0x05,0xfd,0xfe,0xea,0xdd,0xb9,0xf4,0xf2,0xa9,0xfa,0x03,0xe8,0x1e,0x18,0xfd,0x48,0x2f,0x2d,0x8d,0x10,0xe2,0x24,0xfd,0x7b,0xfd,0xe6,0xc1,0x3d,0x0e,0x38,0x46,0x26,0x7f,0xde,0xe2,0xff,0x31,0xeb,0x90,0xad,0x5d,0x01,0x92,0xee,0x9a,0xfc,0xaf,0x29,0xf9,0xf7,0xbe,0x12,0xb9,0xde,0xe6,0xfb,0x46,0x07,0x13,0xe6,0x07,0x7f,0xac,0xf6,0x5e,0xf3,0xda,0xec,0x1a,0xf2,0xee,0xd7,0xe1,0xcb,0x32,0xe3,0x16,0xe8,0x43,0xea,0x12,0x00,0xdd,0xdd,0x47,0xf1,0xf9,0x81,0xfe,0x2e,0xc4,0x18,0x05,0x1e,0xe4,0x14,0xf8,0x04,0xa5,0xff,0x99,0x15,0xe0,0x28,0xca,0xec,0xb1,0x26,0xae,0xd2,0x08,0xfe,0x3b,0x11,0xc2,0xeb,0x08,0x7f,0x04,0x11,0x34,0xd2,0x15,0xcd,0xe6,0xcf,0x1e,0xd7,0xe4,0x1e,0x5a,0x05,0xf8,0xef,0x1c,0xc8,0x13,0xf5,0xf8,0xfb,0x2f,0x38,0x45,0x33,0xbe,0x6f,0x28,0xc7,0xe9,0xe4,0x28,0x7f,0x4c,0xc3,0xbf,0x99,0xfc,0x81,0x14,0x02,0x26,0xe3,0xba,0xdf,0x60,0xf1,0x70,0xd8,0x69,0x04,0xfc,0x0f,0xad,0xf2,0x28,0x16,0xdd,0xb6,0x16,0x0f,0x00,0x00,0x00,0x00,0x66,0xa9,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0xe6,0x12,0x43,0x37,0xfd,0x36,0xea,0x1f,0x1e,0x04,0xd5,0x02,0x14,0xf6,0xfc,0xea,0xf4,0x00,0x1e,0x2a,0xf7,0x33,0xe3,0xe8,0x26,0xfc,0x37,0x36,0xe7,0xc9,0x11,0xe5,0xe7,0xea,0xc4,0x2c,0x2e,0xd4,0x38,0x43,0xe2,0x12,0xf7,0x13,0xf6,0xfc,0x02,0x0e,0x04,0xf6,0x81,0xf2,0x3c,0xf2,0x11,0x2f,0x23,0x11,0xfc,0x20,0xe8,0x3a,0x02,0xfb,0xc2,0x30,0xfb,0x1a,0xef,0xdb,0x22,0xe9,0xed,0x2e,0x03,0x03,0x3b,0x10,0xf0,0xd1,0x0a,0x15,0x7f,0xe6,0xba,0x5f,0xda,0xf8,0xfe,0xe4,0x02,0x3d,0x0f,0x33,0x1b,0xd4,0x0b,0xe4,0xe7,0xe9,0xda,0x10,0x3f,0xa3,0x33,0xdd,0x4a,0x06,0x34,0x13,0x25,0x44,0xc2,0x29,0xd4,0xbf,0xfc,0xf1,0x3f,0x2f,0xb9,0x5a,0xe1,0x26,0x55,0xff,0xc9,0x2c,0x3f,0xcd,0xf0,0xc8,0x42,0x14,0xe0,0xe9,0xf1,0x11,0x4e,0xe6,0xc8,0xec,0x62,0x05,0x0c,0x0b,0xe6,0x15,0x9c,0x14,0x03,0xd7,0xc3,0x03,0x12,0x0f,0xf7,0x15,0x43,0x09,0x19,0xe7,0xe8,0x19,0xeb,0x0b,0x09,0xb4,0x14,0x16,0xc0,0x24,0x07,0xff,0x06,0x0e,0x32,0xfe,0xc4,0xde,0x7f,0xe6,0xdc,0x28,0x0f,0xda,0xda,0xda,0x47,0x22,0x33,0xe0,0xce,0x2e,0x16,0x2c,0x17,0x08,0xd9,0xbc,0xf0,0x44,0x16,0xd9,0x1c,0xff,0x1c,0x33,0xdf,0x19,0xba,0xdc,0x23,0x17,0x09,0xff,0xce,0xee,0xdf,0xd1,0x31,0x04,0xf1,0x03,0xd7,0xf4,0xe8,0x47,0x21,0xe2,0x5c,0x20,0x3f,0xce,0x2c,0x1b,0x1d,0xef,0x09,0x52,0xb0,0xf1,0xe6,0x31,0x39,0xfd,0x4d,0xf8,0xcb,0xcb,0xd0,0x21,0x18,0xfc,0x0e,0x26,0xfa,0x2d,0x04,0xfa,0xf9,0xad,0xcd,0xf2,0xdb,0xe5,0xf0,0x07,0x2e,0x24,0x1b,0xf2,0xae,0x2b,0x12,0xc2,0x0e,0x1c,0x16,0xc3,0xe7,0xea,0xe3,0xdd,0x02,0x17,0xd4,0xf0,0xe3,0xf3,0xed,0xbc,0xd7,0xee,0xe4,0xf6,0x2b,0xf2,0x11,0x12,0x15,0x00,0xf3,0xeb,0x17,0xf8,0x03,0x0c,0xf4,0xee,0x04,0xf4,0xe2,0xf1,0xc0,0xe0,0xe8,0xe5,0x35,0xe3,0xc4,0xde,0x00,0x0f,0xfc,0x10,0xd2,0xfc,0xfb,0xa9,0x49,0x0b,0x2e,0x0d,0xd5,0x81,0xf8,0xe3,0xe0,0x0d,0x18,0xde,0xca,0x4c,0x12,0xe5,0xf7,0xb9,0x89,0xd7,0x3f,0xf0,0xd0,0xf3,0x04,0xfb,0xeb,0x0b,0x46,0x0b,0x1e,0xfa,0xf2,0x1a,0xf6,0xf9,0xf0,0x17,0x0f,0xed,0x3d,0x0b,0xc2,0x0a,0xf8,0x34,0xe6,0x2a,0x04,0x20,0xc1,0x1e,0x55,0x08,0x0b,0xfc,0xec,0x01,0x0a,0xf0,0x01,0xe0,0x1e,0xf8,0xf4,0x0e,0xfe,0xf5,0xff,0xfc,0xd6,0xfb,0x0d,0xff,0xed,0xef,0xe4,0xf0,0x06,0x07,0x02,0xfe,0x02,0xee,0xe8,0xf7,0x03,0xf9,0xf8,0x09,0xf7,0xf6,0x00,0xe9,0xea,0x13,0xf9,0x13,0xed,0x03,0xf5,0xf7,0xfb,0xf1,0xeb,0xff,0x0b,0x04,0x11,0xf6,0xeb,0x10,0x04,0xfd,0xe8,0xf7,0xe1,0xd6,0xea,0xf8,0x21,0x81,0xf9,0xf9,0xda,0xfa,0x23,0x09,0xff,0x19,0xd2,0xfa,0x00,0xe1,0xe7,0x10,0xd6,0xd6,0x0a,0xf6,0xfe,0xf8,0xf6,0xf9,0x0c,0xfd,0xd9,0x02,0x18,0xec,0xd4,0xfc,0x00,0x2c,0xfa,0xd7,0x25,0xed,0x04,0xf8,0xf5,0xff,0x13,0xf8,0x02,0xce,0xeb,0xfb,0xfe,0xec,0x08,0xfe,0x13,0xfc,0xfa,0xf6,0xef,0xfe,0xf2,0x02,0x0f,0x10,0xfd,0x07,0x21,0xbb,0xec,0xf3,0x94,0x42,0x0b,0x0e,0xfb,0xd2,0xe9,0x0e,0x29,0x2b,0x92,0x0d,0x92,0xce,0xf4,0x19,0xf6,0x88,0x15,0xdc,0xf6,0x03,0x34,0x0b,0x35,0xec,0xfd,0x0a,0xa0,0x24,0xeb,0x1e,0xd3,0x1c,0x19,0xce,0xe7,0x2e,0x25,0x02,0x26,0xc9,0xf4,0x18,0x44,0x35,0x72,0x0f,0x02,0xd7,0xf1,0xed,0x05,0x32,0x1e,0x39,0x10,0xc9,0x7f,0x4d,0xe9,0x0b,0x68,0x21,0x05,0x42,0x21,0x12,0xcb,0xb3,0x7e,0x26,0x0c,0xde,0xd5,0x0e,0xff,0xe6,0x4a,0x14,0x0a,0xed,0xf3,0x12,0x14,0xe6,0xe3,0xaf,0xcd,0x42,0x97,0xe7,0xf7,0xd6,0xd6,0xe8,0x4b,0xff,0x12,0x38,0xae,0x1f,0xd8,0x1d,0x58,0xe1,0x1c,0xfd,0x05,0xce,0xcd,0x16,0x0f,0x14,0xce,0x04,0x30,0x23,0x10,0xf1,0x1f,0xb1,0x10,0x1a,0x10,0xf8,0xd7,0x20,0xe2,0x01,0xd9,0xf1,0xe0,0x30,0x17,0xf3,0x4d,0xf0,0x9d,0x4a,0x33,0xf8,0xe6,0x17,0xf5,0xfb,0xb9,0xf3,0xe2,0x0f,0xf4,0x0e,0x0a,0xf2,0xee,0xe4,0x0d,0x03,0x4b,0xf9,0xf5,0xe3,0xe7,0xdd,0xde,0x4d,0x15,0x00,0xdf,0xe6,0x4d,0x03,0x11,0x00,0xe4,0x0e,0xe2,0xe3,0x1d,0x0b,0xe7,0xf6,0x02,0x16,0xdf,0x06,0xdc,0x06,0x1e,0xea,0xcb,0x46,0x23,0xf7,0x10,0xf1,0xc1,0x11,0xa2,0x02,0xdb,0xda,0x04,0x05,0x81,0xd0,0x13,0xf2,0xd8,0xb3,0xdc,0xe0,0xf4,0x22,0x65,0x40,0x0a,0xe8,0xc3,0xfe,0xf8,0x25,0xf6,0xea,0x2e,0xfe,0xc9,0xec,0xd4,0x21,0xf3,0xff,0x46,0xed,0xf1,0x10,0x11,0x02,0xf0,0x1c,0xe7,0xf0,0x05,0x10,0x04,0x16,0x1a,0xdf,0xef,0xdb,0x17,0x1a,0x02,0xf4,0x12,0xef,0xe8,0x0e,0xf1,0x17,0x7f,0xfe,0x48,0x22,0x04,0x04,0xb3,0x1d,0xc2,0x15,0x4e,0xec,0xe6,0x4e,0xfd,0x15,0x30,0xfa,0xfd,0x16,0x07,0x03,0x41,0xec,0x43,0x19,0x1d,0xef,0xe9,0xf6,0xe4,0x2a,0xd0,0xf8,0x00,0x02,0xf0,0xdf,0xf7,0x13,0x0d,0xdb,0xd6,0x00,0xea,0xf6,0x2c,0x1c,0xf5,0xfd,0x35,0x37,0xf9,0x00,0xa5,0xff,0xd0,0xf3,0xba,0x1a,0x2c,0xe3,0x23,0xe3,0x4b,0x00,0xda,0xe7,0x24,0xf5,0xf2,0x15,0x54,0x0d,0x2a,0xde,0xfd,0x64,0x30,0xf2,0xeb,0x14,0xf1,0x05,0x26,0xd8,0x2a,0x53,0x3f,0x0e,0x39,0x38,0xf6,0x0a,0x09,0xe6,0xf8,0x1c,0x1f,0x01,0xfb,0xe3,0x32,0x3e,0x2f,0x13,0xf2,0xde,0x06,0xf7,0x33,0x36,0xe6,0x14,0xe9,0x0a,0xef,0x10,0xf3,0x03,0x9f,0x12,0xf0,0x2d,0x13,0xf7,0xd1,0xb4,0x16,0x46,0x11,0xea,0xfe,0xfc,0x11,0xf6,0xb0,0x37,0x02,0x0c,0xd3,0x63,0xd8,0x03,0x33,0xba,0xdd,0x0b,0x0c,0xf6,0x15,0xe3,0x29,0x1f,0x07,0xf9,0xfa,0x38,0xbb,0x4a,0xe7,0x01,0xe5,0x13,0xf9,0x1b,0x18,0xf2,0xd9,0xdc,0xf7,0x52,0xef,0x0b,0x3a,0x0f,0x09,0xed,0xdb,0x35,0xbd,0x04,0xd2,0xf9,0xde,0xe3,0xe3,0x13,0xf4,0xce,0x25,0x31,0xda,0x36,0xc1,0x0c,0x9f,0x0a,0xef,0x33,0xe3,0xec,0xdb,0xc7,0x81,0xfa,0x0a,0xd7,0xdc,0x0d,0xec,0x0c,0xe7,0xcc,0xef,0x00,0x0a,0x38,0xeb,0xf4,0x20,0xbc,0xf4,0xdf,0xf9,0xc1,0x17,0xff,0x55,0xfe,0xe0,0x0d,0xe5,0x04,0x0d,0x38,0xea,0x04,0x20,0x39,0x06,0x12,0xcb,0x30,0xf9,0x1f,0xcc,0xf2,0xf4,0xef,0x06,0xeb,0xf2,0xed,0x22,0x01,0xdd,0x23,0xee,0x08,0xf2,0x1e,0x7f,0xbb,0x1b,0xf2,0xe2,0x13,0xf4,0xf0,0x1d,0x09,0xd4,0x08,0x1b,0x2e,0xc0,0xf9,0xd8,0x14,0x03,0xca,0xe8,0x03,0x19,0xc9,0x31,0xdf,0x10,0xf3,0x23,0x08,0x13,0xdd,0xf7,0xf5,0x0d,0x16,0x0d,0x09,0x0d,0xe7,0x0b,0x17,0xec,0xf3,0x13,0xf4,0xf3,0xfb,0x00,0xde,0x52,0x0a,0x2e,0xd7,0xe7,0x12,0x11,0xe7,0xf1,0x20,0x1e,0x0e,0x14,0xdd,0x0e,0x04,0x31,0xe6,0x0e,0xf1,0x14,0xe8,0xf1,0x17,0x1a,0xcb,0xe3,0xda,0xe9,0x17,0x48,0xc9,0xc7,0x38,0xe7,0x04,0xf3,0x4a,0xfc,0x12,0x1f,0x1b,0xec,0x0b,0x16,0x32,0xe0,0xec,0x11,0x24,0x03,0x09,0x0a,0x17,0x05,0x30,0x19,0x00,0xf1,0x2d,0xf5,0x23,0xeb,0x06,0xfe,0x01,0x0c,0x01,0x30,0x13,0xeb,0x18,0xfc,0xc2,0x26,0xf1,0xe5,0xfb,0xc2,0x11,0xfa,0xf2,0x1b,0xe4,0xf7,0xfc,0xef,0x03,0x0e,0xf7,0x07,0xdf,0x0d,0x18,0xfd,0xf4,0xfb,0x0a,0x2a,0xf2,0xeb,0x05,0xf1,0xfe,0xf2,0xe5,0x0d,0xf9,0x0e,0xf2,0x16,0x0e,0xf9,0xfb,0xec,0x08,0xe1,0xe8,0xfd,0x11,0xfa,0xf7,0xf8,0x01,0x04,0xd4,0xe8,0x0d,0xc4,0xbe,0xe2,0xd2,0x20,0xfc,0x20,0xf2,0xfe,0xe7,0x2f,0xf1,0xeb,0xb8,0xfc,0x1e,0x07,0xf3,0xff,0x3f,0xfe,0xf9,0x19,0xf3,0xf7,0x0a,0x1f,0x1a,0xe0,0xc8,0xe1,0x1d,0x0d,0xe3,0x26,0x26,0x39,0x23,0x0d,0xf6,0x17,0x14,0x42,0xdf,0x13,0x13,0xfd,0x00,0x03,0xea,0x04,0xf8,0x7f,0xe6,0x0f,0xe2,0x00,0x26,0x25,0xf1,0xea,0xc3,0xbe,0x04,0xfc,0x04,0xf8,0xe6,0x10,0x1b,0xf6,0x32,0x97,0x18,0xf3,0x0b,0xf7,0x02,0x29,0x08,0x14,0xe8,0xf3,0x1f,0xf9,0x81,0xb6,0x02,0x19,0x17,0x15,0x0e,0x20,0xc9,0x2a,0x0c,0x87,0x14,0xf7,0xf8,0xf7,0xf4,0xe9,0xe1,0x0a,0xff,0x0a,0x0f,0xfb,0x23,0xf0,0x06,0xe6,0x0c,0x5e,0x0e,0xdc,0x20,0xf6,0x32,0xf9,0xee,0x2b,0xec,0xba,0x0f,0xe4,0x31,0xfa,0xfe,0xec,0xe2,0x19,0x18,0xf5,0xcb,0x53,0xd5,0xfd,0x3c,0xf6,0xfd,0x16,0xc9,0xec,0xe0,0xf5,0xb5,0x1b,0x39,0xe1,0x10,0x0b,0xff,0x06,0x2e,0xdc,0x32,0x20,0xf9,0x10,0x17,0x11,0xde,0x3e,0xf7,0xea,0x24,0x21,0x37,0xde,0x32,0xf3,0xf5,0x06,0x0a,0x16,0x1f,0xd5,0xe2,0xb8,0x2e,0xc3,0xba,0x0d,0x1d,0xcb,0xf5,0xaa,0x1b,0xf1,0x16,0xac,0xa4,0x50,0xfd,0x12,0xd6,0x0c,0xfa,0x2c,0xfa,0xf6,0xee,0x1b,0xe5,0x07,0x00,0xfd,0xff,0xd6,0x06,0xe6,0xe9,0x4c,0xfa,0xb2,0x3f,0xce,0xdd,0xfb,0x2b,0xd4,0xce,0x03,0xfd,0xdf,0xea,0x12,0xaa,0x29,0x27,0x1b,0x0c,0xd6,0xfa,0xde,0x25,0x10,0xe7,0xc1,0xe1,0x8a,0x1a,0x0d,0x15,0xbd,0xe2,0x19,0x1c,0xa9,0xe4,0xe9,0xa4,0x08,0x28,0xff,0x26,0x04,0x14,0xdc,0xbf,0xfc,0x2f,0x20,0xb0,0xd7,0xf5,0xe7,0xdd,0xbe,0x22,0xbd,0x1a,0xe7,0x6e,0xe5,0x45,0xd9,0xd1,0xdb,0xf0,0xf2,0x17,0x02,0xa9,0x2c,0xd0,0x04,0xf2,0xfa,0xaa,0xd3,0x43,0xd3,0xd9,0x22,0xda,0x37,0xe7,0xc9,0x16,0xdc,0xd5,0x11,0xab,0x1f,0x0a,0x7f,0xef,0xe2,0x48,0xd3,0xe8,0x45,0xd7,0xd8,0xf8,0x25,0xee,0xc7,0xf2,0xe0,0xdd,0x3c,0xdc,0xdd,0xd8,0xf3,0x2c,0xe6,0xf0,0xc7,0xe7,0x2c,0xfd,0x14,0x00,0xcf,0x12,0x04,0xa4,0x1a,0x55,0x03,0xea,0xf3,0xe3,0x20,0xd3,0xd5,0x2f,0xca,0xe8,0xf7,0x1f,0x01,0xcd,0xb8,0xf9,0x1b,0xe5,0xe5,0xfd,0x18,0x14,0xf2,0xcc,0xe6,0x11,0xec,0x02,0x0b,0x18,0xed,0xb3,0xdf,0xec,0xaa,0xc8,0xda,0x47,0xc1,0xcc,0x34,0x2d,0xf9,0xdb,0xd9,0x1a,0xfc,0x0a,0x09,0x2c,0x01,0x17,0x0c,0xdb,0xf9,0xf2,0x13,0x09,0xe2,0x31,0x1d,0xf3,0x06,0x2b,0x04,0xd1,0x0a,0xf2,0x51,0xde,0x2b,0x17,0x08,0x16,0xea,0x1b,0xdf,0x5b,0xe3,0x1d,0x02,0x36,0x0b,0x19,0xde,0x23,0xce,0xc8,0xe6,0xdc,0xfc,0x1d,0x7f,0x0e,0xdd,0x11,0x10,0x01,0x0b,0xd3,0x66,0x2a,0xb8,0x14,0xc9,0x20,0x21,0xc2,0xf2,0xf3,0x7f,0x0d,0x0c,0x58,0xf3,0x12,0x11,0xef,0x0a,0x04,0xc7,0x07,0x28,0xe9,0xcc,0xf0,0x4e,0xf3,0x14,0xdf,0x1f,0x41,0xf4,0xdc,0x2d,0xda,0xe4,0xa4,0x9c,0xec,0xc7,0x32,0x17,0x1d,0xe2,0x1f,0xff,0x04,0xd6,0xf4,0x0a,0x17,0x18,0xe7,0x25,0xff,0x77,0xea,0xce,0x56,0xd5,0x0f,0xe9,0xe8,0x2f,0xdd,0xb5,0x92,0xf2,0xa2,0x05,0x17,0xe6,0x06,0x00,0xe6,0xf8,0xe4,0x1f,0x04,0xd7,0xf5,0xf1,0xe1,0xfa,0xe9,0x45,0xd3,0xc3,0x12,0x53,0xe3,0xfa,0x1c,0x9a,0xa5,0x58,0xd3,0xaa,0x30,0x17,0x2a,0xe3,0x50,0x3f,0xc0,0x3b,0xe7,0x16,0x0f,0x02,0xec,0xee,0xd5,0x11,0xdc,0x28,0xdb,0x00,0xeb,0x02,0xfc,0xe5,0x26,0xf5,0x11,0xe2,0xb1,0x3c,0x18,0x4c,0x0b,0x17,0x44,0xf9,0x42,0x48,0x04,0x28,0x2d,0x34,0xf5,0x14,0x14,0x1c,0x0f,0x5a,0x16,0x3d,0x3b,0x47,0xfe,0x0e,0x20,0x3c,0xca,0xf5,0x2a,0xe6,0x81,0x39,0x38,0x56,0xe0,0x35,0x34,0x5d,0x15,0x12,0x0a,0xf1,0x45,0xc7,0xd7,0x10,0xf6,0xd6,0xf3,0x36,0x03,0xf2,0xf8,0xfe,0xfd,0x2c,0xfd,0x06,0xf6,0x55,0x33,0x4a,0x1f,0xf8,0x0d,0x54,0x0e,0x59,0x3b,0x08,0x35,0x23,0xe2,0x54,0x0f,0x68,0x1b,0x16,0xcb,0x07,0x2c,0x29,0x11,0x1f,0x98,0xcd,0x67,0x1a,0x5c,0x08,0xfa,0xe2,0x46,0x1a,0x67,0xdf,0xb8,0xe7,0x42,0x4b,0x3c,0x67,0x2d,0x1c,0x3d,0x18,0xe0,0xd4,0x26,0x4a,0xdf,0x2f,0x3d,0x1b,0x2c,0x08,0x9c,0x19,0x1d,0x60,0x06,0xf7,0xdf,0xd9,0x68,0x54,0x15,0xb8,0xfb,0x01,0x07,0x28,0x1a,0xdf,0x0c,0xec,0x27,0xb2,0xe9,0x4e,0x1f,0xe5,0x07,0xf6,0xe3,0x81,0x56,0x4d,0xf0,0x05,0x02,0x3a,0xdc,0xdf,0xde,0x1e,0x2c,0xf2,0x3b,0x3f,0xec,0x24,0xfb,0xcd,0x2b,0xd7,0xe8,0x1a,0x1a,0xd8,0xed,0xfa,0x04,0xfb,0x01,0xf4,0xfc,0x1c,0xdf,0x09,0xfc,0x3c,0xf4,0xed,0x02,0x1e,0xa5,0x28,0xeb,0x1c,0x34,0xe8,0x0f,0x59,0x28,0xd7,0xe4,0xf2,0xe4,0x04,0xf1,0xe5,0xfa,0xf9,0x24,0xfa,0x23,0xd2,0xac,0xf9,0x11,0x2a,0x61,0xf4,0x06,0xd0,0x0d,0xf3,0xeb,0x0a,0x20,0x11,0xe4,0xd2,0xf8,0xf5,0xff,0xee,0xea,0xf0,0xf1,0xe1,0xc0,0xd8,0x04,0x18,0x24,0xfe,0x1f,0x3e,0xfd,0x19,0x13,0xf5,0x26,0xdd,0x54,0xff,0x1c,0xe8,0x24,0x04,0x00,0x10,0x20,0x88,0x11,0xd7,0x0e,0xa4,0x05,0xfc,0x16,0x1c,0xdc,0x1a,0x26,0xfb,0x0c,0x0f,0xf0,0xe2,0xe6,0x8b,0x14,0xfd,0xf5,0x0a,0x19,0xe7,0xf7,0x0b,0x22,0xe5,0x10,0x03,0xdc,0x10,0xf5,0x26,0xfb,0xf7,0xf5,0x18,0xe2,0xf2,0xd7,0xf9,0x04,0x1e,0xbd,0x0f,0x02,0xf9,0x55,0xbf,0x1c,0xc9,0xf0,0x3a,0xdc,0x16,0x3d,0x2d,0x1d,0x26,0x31,0x1f,0x25,0x18,0xda,0x38,0xef,0x0c,0x4c,0xea,0xdc,0x1f,0xe2,0x03,0xf2,0x34,0xfb,0x26,0x10,0x2c,0x0a,0x1b,0xea,0xbd,0x11,0xa7,0x1f,0x20,0x30,0x02,0x17,0x22,0xf6,0x09,0x09,0xda,0xe8,0x36,0x13,0x16,0x12,0xf3,0xde,0x23,0x81,0x16,0xfa,0x28,0xd7,0xe9,0x07,0xf6,0xe0,0xbd,0xfb,0xf8,0xde,0xf2,0xbe,0x16,0x22,0xd5,0xff,0xe2,0x01,0x1f,0x09,0xd7,0x39,0x34,0x16,0xcf,0xdf,0xe8,0xd3,0x3b,0x06,0xfc,0xe2,0xca,0xfa,0x2a,0xd1,0x1d,0xf1,0x2a,0x0d,0xca,0xc0,0x18,0x0a,0x9b,0xc8,0xf7,0xe2,0x29,0xf7,0xf2,0x61,0x81,0xe8,0xfc,0xe0,0xe4,0x01,0x37,0xf8,0xe7,0x22,0xd1,0x32,0x5e,0x1e,0xfb,0x03,0xec,0x26,0x21,0x05,0xd8,0xf4,0x0d,0x30,0xfc,0x0e,0x2b,0xc2,0x29,0x0e,0xdc,0x01,0xb0,0x20,0xda,0x06,0x4e,0x27,0x29,0xe5,0x19,0xfc,0x1b,0xfe,0xeb,0x28,0xc3,0x26,0xfd,0xe8,0x02,0xfa,0xf9,0x2f,0xe4,0x8b,0xdd,0xef,0x25,0xe9,0x00,0xf6,0xd9,0xfb,0xf9,0x1b,0x2e,0x0a,0x0c,0xf7,0xf3,0x3a,0xf7,0x20,0xf2,0x04,0x0b,0xde,0x04,0x14,0xe6,0xec,0xf6,0x04,0xeb,0x44,0xd6,0x28,0xe2,0x0a,0xd7,0xea,0xfb,0x1b,0xa9,0xee,0xde,0x19,0x25,0xf2,0x09,0xbb,0x14,0x0d,0xc5,0x30,0x08,0xee,0xb8,0xf3,0xe4,0x02,0x41,0x0d,0x34,0xff,0xc1,0x05,0xf7,0xf2,0xfc,0xcb,0xe7,0x0a,0x10,0xf4,0xe3,0xc6,0x12,0x28,0x81,0xfe,0xda,0x1d,0xd3,0x0b,0x13,0xd8,0x30,0x9a,0xef,0x17,0xdc,0xfd,0x18,0xe9,0x16,0xfd,0x00,0x00,0xf7,0xfa,0xf9,0xbc,0x3f,0x42,0xe6,0xed,0xe4,0x34,0x23,0xe7,0xc4,0x17,0xe6,0x14,0xf3,0x5f,0x03,0xff,0x0e,0x1a,0x0c,0xde,0x43,0xfc,0x07,0xcd,0xc8,0x04,0xfa,0x20,0xaf,0xec,0xd9,0xff,0x16,0xfe,0xde,0x0c,0xda,0xda,0x0d,0x09,0x24,0xf9,0xef,0x10,0xfc,0xf7,0xb1,0x00,0xdb,0xea,0xd2,0xcf,0x47,0xee,0x21,0xe2,0xe9,0x20,0xfc,0xf7,0xfa,0xfa,0xe2,0xe0,0xc1,0xe1,0x08,0xcc,0x0e,0x24,0x75,0x0d,0xf8,0x05,0xfb,0xea,0xec,0x11,0xb5,0xe8,0xf0,0xce,0xf5,0xf0,0xf3,0xf6,0x40,0x0e,0xcf,0x38,0x0a,0x0f,0xfe,0xfc,0xe1,0x10,0xed,0xfb,0xf7,0x15,0x07,0xdb,0xe6,0xec,0xf0,0x02,0xe5,0xee,0xf9,0x0b,0x1b,0xfc,0x08,0xfd,0xfb,0x36,0xec,0x0b,0x00,0xc8,0x3c,0x07,0x31,0x0b,0x7f,0x2e,0xf8,0xcd,0xe2,0x02,0xfc,0xf3,0xc7,0xdd,0x10,0x4b,0xfa,0xe9,0x18,0x28,0xea,0x28,0x04,0x13,0xff,0x03,0xef,0x08,0x62,0x01,0xac,0x29,0xd7,0x16,0x3b,0x09,0x24,0x23,0xb7,0xf4,0xff,0xf2,0xeb,0x03,0x06,0x11,0xcf,0xf0,0x0c,0xef,0xec,0x48,0xf9,0x0f,0x21,0x26,0x2e,0x0d,0xcf,0xe5,0x0c,0x06,0xe2,0xf8,0x28,0x02,0xf8,0xe6,0x12,0x2f,0x39,0x0a,0xe1,0xe3,0x14,0xf0,0x20,0xf1,0xad,0x28,0xdd,0xec,0xf2,0xe9,0x05,0xf0,0xc5,0x01,0x29,0x15,0xd2,0x19,0x06,0xf4,0x0c,0x17,0x26,0xef,0xf7,0x03,0x02,0xd9,0xeb,0xec,0x3a,0xf8,0x02,0x3c,0x1c,0xcd,0xf2,0xff,0xbf,0x05,0xfe,0x16,0xec,0xfd,0x01,0xf8,0x19,0xe8,0xec,0x0e,0x02,0xfb,0x12,0xdd,0xd8,0x17,0x1e,0x0f,0xad,0xea,0x27,0xdd,0x29,0xda,0xf1,0x39,0xfd,0x11,0x03,0xd1,0xf7,0x11,0x07,0x02,0x10,0xda,0x11,0x19,0xef,0xff,0xce,0xf1,0xda,0xf6,0x15,0x1e,0xdc,0xf4,0xca,0x0b,0x07,0x15,0x08,0xca,0xd7,0x16,0x04,0xfb,0xe6,0xfc,0xeb,0xea,0x04,0xff,0xd9,0xfe,0xfc,0xe9,0xf0,0x1c,0xef,0x08,0xec,0xf9,0xe8,0x02,0x0e,0xd8,0xf7,0x0c,0xf7,0xb8,0xda,0xc9,0xf4,0xe5,0x00,0x09,0x07,0xc3,0x19,0x24,0x81,0x22,0xd9,0xea,0xff,0x15,0xfb,0x31,0xf0,0x02,0x04,0x01,0x2a,0x0f,0xeb,0x0a,0xde,0x1c,0xfb,0x01,0x19,0x2a,0xea,0xf0,0xd1,0x3d,0xef,0x2d,0xf7,0xfa,0x02,0x2a,0x1c,0x0e,0xc9,0x1e,0x30,0x18,0xf8,0x13,0x1c,0x14,0x0a,0x4f,0xc5,0xf4,0x08,0x0e,0x17,0x06,0xf0,0xff,0xee,0x05,0xf9,0x4f,0xe4,0x15,0x26,0x4a,0xe6,0x02,0xf7,0x3b,0xe0,0x1e,0x17,0x07,0x2e,0x1c,0xcd,0x20,0xf0,0x08,0xf2,0x2f,0x81,0xed,0x9b,0xeb,0x0d,0xf1,0xf1,0x06,0xd5,0xcd,0xfb,0xe7,0x23,0x81,0xe9,0x1c,0x0e,0x09,0x0c,0xf7,0xf0,0xcb,0x43,0xf2,0xe5,0x60,0xef,0xf1,0xec,0xe5,0xe1,0x07,0x00,0x04,0xea,0xec,0xf3,0xfd,0xd1,0x02,0xea,0x29,0x27,0xe8,0x16,0xdf,0x27,0x07,0x15,0xe3,0xdf,0x22,0x13,0x34,0x26,0x08,0x0c,0xfb,0xd4,0x15,0xeb,0x0e,0x41,0xfc,0xf8,0x13,0x0b,0xe1,0x1d,0x18,0xbe,0x0f,0x1b,0x01,0x13,0x04,0xae,0xe8,0x75,0x04,0xd0,0x1d,0x15,0xed,0xcb,0x09,0x22,0xf1,0x02,0xef,0x16,0x17,0xfc,0xe9,0xda,0x7f,0x1c,0x0e,0x0c,0x09,0xfd,0xf7,0x21,0x23,0x4d,0x19,0xda,0x42,0x72,0xcd,0x26,0x02,0x1f,0x4d,0xf0,0x26,0xee,0x15,0x59,0xe7,0x3b,0xe6,0x15,0xf1,0x2e,0x1d,0x07,0xcc,0x16,0x34,0xf4,0x12,0xc0,0x00,0xf4,0x07,0xc2,0x09,0x38,0x2d,0xeb,0x51,0xea,0xf6,0x12,0xfd,0xeb,0x02,0xc7,0xd5,0x04,0x09,0x00,0x08,0x10,0x08,0xc3,0x3a,0xd0,0xfc,0xcf,0xd9,0xec,0x08,0xf7,0xf3,0x41,0x0a,0x16,0xb1,0xda,0x26,0x4d,0xed,0x21,0x42,0x22,0xd7,0x34,0xea,0xca,0xea,0x53,0xf7,0x0f,0xc4,0xc2,0xd3,0x61,0x3b,0x0a,0x08,0xf1,0xa4,0xd7,0xc7,0xce,0xe0,0x98,0xeb,0xc8,0x1b,0x09,0x03,0xe8,0x17,0x03,0x04,0x7f,0x03,0x0f,0xf6,0xbb,0xd9,0x10,0x13,0x07,0x09,0xab,0x29,0x01,0x3c,0x83,0x6c,0x64,0xe5,0xf8,0xf2,0x00,0xea,0x13,0x0f,0xe8,0xfd,0xfe,0x06,0x2b,0x0a,0x08,0xa5,0x05,0x1c,0xd7,0xf5,0x0f,0x54,0x90,0xf2,0x37,0x09,0x29,0x8f,0xae,0x27,0xa9,0x34,0xf9,0xfe,0xd0,0x02,0xf5,0x09,0x1b,0xfb,0xc1,0xad,0x03,0x55,0x30,0x0a,0x15,0x03,0xfc,0xee,0x33,0xc6,0xca,0xf3,0xf1,0x3a,0x06,0xb4,0xe6,0x04,0x36,0x50,0x40,0x1f,0xf7,0xf5,0xd9,0x00,0xf7,0x13,0x08,0x12,0xbe,0xd6,0x1b,0x22,0x5c,0xf0,0x1d,0xe0,0x19,0xdc,0x18,0xcf,0xf4,0x03,0x2b,0xd7,0x4b,0xfc,0xe4,0x20,0x05,0xfc,0xcc,0xe5,0x14,0xdf,0xef,0xd9,0xe3,0xe8,0xb5,0xff,0x09,0x00,0xc1,0xff,0x4b,0xfa,0xf4,0x26,0xcf,0xfe,0x0d,0xf4,0x0c,0x29,0x9b,0x22,0xf2,0xda,0x34,0x14,0x20,0x04,0x19,0x21,0x09,0x13,0xfc,0xe6,0x24,0x0d,0xed,0x06,0x15,0x10,0x54,0xb4,0x01,0xfb,0xe5,0x24,0xd4,0xcc,0xbf,0xd9,0x28,0xea,0xd8,0xe7,0xf0,0x0b,0x45,0xca,0x04,0x19,0x22,0x3f,0x8d,0x13,0x1a,0xea,0x0e,0x26,0x31,0x22,0x26,0x3d,0xee,0x00,0x29,0x81,0xec,0x32,0x16,0xde,0xdb,0x12,0x3a,0x57,0xf2,0xc8,0xdd,0xc8,0xe0,0x4d,0x00,0xf8,0xfd,0x24,0x0a,0x02,0xdc,0xe4,0x22,0xf5,0xd3,0xf2,0xd8,0xee,0x47,0xfc,0xd9,0xe7,0xea,0xfc,0x1f,0x09,0xe4,0xf9,0x0b,0xfb,0xe2,0xea,0xfd,0x00,0xf0,0x16,0xfb,0xf3,0xbd,0xdc,0x09,0x0d,0xf3,0x04,0x10,0xdc,0x2d,0x0e,0xf5,0x12,0xdb,0x29,0xd7,0xda,0xc3,0xef,0xee,0x21,0x03,0x1c,0x0c,0xf2,0x0b,0x01,0xac,0xe2,0xef,0xf4,0x17,0x00,0xc8,0x52,0xf1,0x02,0xfc,0x05,0x06,0x20,0x02,0xef,0xf3,0x04,0x7f,0x23,0xc4,0xfb,0x17,0x31,0xf5,0xc9,0x0a,0x23,0xa4,0x03,0x0e,0xe0,0xd8,0xb8,0xa1,0xc5,0xf6,0x05,0xe9,0x0d,0x20,0x00,0xf8,0x29,0xd8,0x04,0x02,0xe9,0x52,0x19,0xda,0xaa,0xee,0x17,0xeb,0x00,0x09,0xfb,0x17,0xec,0xd9,0xeb,0x0b,0xdd,0xde,0x2a,0xcb,0x0c,0xe2,0xee,0xc2,0xf6,0x01,0xd7,0xe8,0x26,0x27,0x2e,0xe4,0xed,0xe6,0x13,0xfe,0x35,0x0c,0x30,0xde,0xea,0x13,0xdc,0xb1,0x0b,0xe2,0xde,0x12,0xed,0x60,0xf5,0xfd,0x3a,0xbb,0x44,0x06,0xe3,0x21,0x1c,0xf1,0x0c,0x36,0x1a,0x16,0x32,0x43,0x41,0xdf,0x20,0x47,0x39,0x12,0xf9,0x17,0x1a,0xed,0x01,0x12,0xfd,0x3b,0xed,0x16,0x2b,0xd8,0x08,0x20,0xf7,0xd0,0x16,0xdc,0x40,0xfb,0x15,0x01,0xe1,0x29,0xe7,0x17,0x04,0xf1,0x35,0x21,0xe3,0xda,0x7f,0x1f,0xec,0xff,0x10,0xf6,0x19,0xf9,0x39,0x3b,0x56,0x12,0x1b,0x20,0x0b,0x14,0xf6,0x5b,0x23,0xb1,0x10,0xd8,0x4f,0xff,0x14,0xf3,0xe7,0x16,0xd5,0xc8,0x78,0xcc,0xdd,0xfe,0x33,0x77,0x36,0xe3,0x02,0x23,0xed,0xfa,0x21,0xe1,0xcc,0x02,0xf0,0xf1,0xe2,0xda,0xdd,0xe1,0x11,0x5e,0x3d,0x44,0x21,0xdd,0x0a,0xf8,0xfa,0xcc,0x2a,0x2c,0xfb,0x0c,0x05,0xea,0x19,0x9d,0x1f,0xa7,0x2f,0x12,0x62,0xbf,0x06,0x0b,0x26,0x2e,0x2d,0xab,0xf7,0x3e,0x15,0xca,0x2c,0xc0,0xd6,0xc3,0xea,0x35,0xfb,0xb0,0xdf,0x11,0x28,0xff,0xb9,0x31,0xe4,0x58,0xdf,0xc7,0x35,0xcd,0xeb,0x45,0x1d,0xc4,0x4e,0xde,0x51,0xe2,0xdd,0x43,0x1a,0x20,0xc8,0xdb,0x59,0x63,0x2c,0x2a,0x6a,0x07,0xd2,0x69,0x4d,0x95,0x29,0xcb,0x40,0xb6,0x33,0xaf,0x14,0xf8,0x0a,0xba,0x57,0xdc,0x43,0x3f,0xf0,0x81,0x0d,0x3a,0x1e,0xd8,0xbc,0x43,0xd7,0x0e,0xea,0x06,0x84,0x05,0xc0,0x2b,0x3f,0x2b,0x22,0xb6,0xf9,0xfc,0xda,0x33,0x07,0x37,0x34,0x06,0x2f,0x25,0xec,0xd2,0x2c,0xbd,0xed,0xbb,0x00,0x61,0xef,0x0b,0x0f,0x05,0xcb,0xdb,0xc7,0xf9,0xe6,0x1e,0xc3,0x3b,0x26,0xb1,0x30,0x5c,0x35,0x00,0x00,0x00,0x00,0x76,0xb7,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0xc2,0xfb,0xa8,0x0a,0x04,0x14,0xff,0xfd,0x6c,0xb8,0xb0,0xfa,0x08,0x12,0x86,0x46,0xd0,0x2e,0x7f,0x11,0x37,0xff,0x15,0x41,0x81,0x19,0xea,0x99,0xdf,0xc9,0xe2,0xef,0xb7,0x17,0xca,0xff,0xc3,0x53,0xf2,0x42,0xea,0x39,0xfb,0x16,0x1b,0x09,0x04,0xf2,0x48,0xd7,0x31,0x99,0x14,0xea,0x04,0x25,0x13,0x1e,0xee,0x7f,0x21,0x37,0x10,0xcf,0x22,0x11,0xd2,0xec,0x07,0x03,0x23,0x38,0xca,0xd6,0xda,0x81,0xe7,0x8a,0xea,0x03,0x27,0xfb,0xc6,0xe1,0xf6,0x50,0x91,0x68,0x03,0xc3,0xe6,0xf0,0xe0,0xe5,0xb4,0x9e,0x0a,0x3e,0xe4,0x5a,0x94,0xf1,0x38,0x1a,0xae,0x81,0xab,0xef,0xd1,0x42,0xc6,0xe6,0xf5,0x37,0x55,0x2d,0x2c,0xf9,0xee,0x43,0xf2,0xed,0xe9,0x27,0x22,0xe0,0x28,0x40,0x7f,0xcd,0xd2,0x14,0xf6,0xd7,0x7c,0x06,0x05,0xac,0x00,0x04,0xfd,0x13,0xb9,0xe6,0xfd,0xc4,0xb3,0x94,0x27,0xe6,0x00,0xd0,0xbb,0x16,0xe7,0xdb,0x36,0x2c,0xa3,0x66,0xa0,0x98,0x08,0x81,0xf9,0xed,0x36,0x1e,0x08,0x2e,0x9d,0x8b,0x49,0xe7,0x7f,0xfd,0x5d,0x04,0xa2,0x12,0x53,0x03,0x5b,0xde,0x17,0xde,0x05,0x01,0x0a,0x56,0x3f,0x19,0xf9,0x03,0xf7,0xf0,0x81,0x45,0xec,0x10,0x11,0x00,0x06,0x07,0x17,0xd8,0x05,0x3f,0xb9,0x0a,0xd0,0x64,0x17,0xf2,0xe6,0x10,0xdf,0xa3,0x08,0x0a,0x1c,0x2e,0x13,0xc0,0xe3,0x0f,0xe6,0x34,0x31,0xe1,0xf2,0x76,0x06,0x19,0x81,0xdb,0x21,0x48,0x15,0xf6,0xf5,0x82,0x3a,0x08,0xd3,0x46,0x0b,0x20,0x07,0x81,0xed,0xf8,0x04,0xbc,0xf8,0xed,0x08,0x8a,0x04,0xd9,0x19,0x0a,0x13,0x54,0xf4,0x12,0x02,0x08,0x7f,0xe5,0x0f,0xc2,0xf0,0x3d,0xde,0x10,0x01,0x15,0xfd,0xf2,0x1d,0x66,0x1f,0xd2,0xdc,0xf4,0xd8,0x8f,0x8d,0xf6,0x01,0x50,0xf0,0x14,0x0e,0x37,0xbc,0xb7,0x7f,0xa9,0x6a,0x10,0xa8,0x18,0xed,0xc8,0x49,0x02,0x18,0x0b,0x5a,0x3e,0x06,0x9f,0x1c,0xd5,0x9f,0x0a,0xe0,0xe7,0xd3,0xc2,0x0b,0x5f,0xe6,0x20,0xca,0x08,0x2c,0x4c,0xa8,0x92,0xec,0x10,0x7f,0xf0,0x72,0xec,0xbc,0x05,0xf9,0x04,0x18,0x19,0x08,0x13,0xd9,0x22,0x46,0x38,0xef,0x81,0x9b,0x16,0x4f,0xdd,0x34,0x27,0x3a,0xfb,0x50,0xaa,0x68,0xed,0xc1,0x14,0xf4,0x27,0x90,0x69,0x81,0x5f,0xbc,0x25,0x1c,0xe3,0x0e,0x4d,0xc2,0xd4,0x12,0xed,0xe6,0x08,0x43,0xd4,0xe0,0x2f,0xe8,0xd2,0xbb,0x0b,0x12,0x01,0xd6,0x81,0x6a,0xec,0xfa,0x01,0x3e,0xe9,0xd7,0xa3,0x1a,0x06,0x0d,0x11,0x10,0xe1,0xe4,0xf0,0x55,0xbd,0xed,0xe9,0xe6,0xf5,0xe7,0xee,0x39,0xe8,0xeb,0xf6,0x09,0xc7,0xe6,0x81,0xfb,0x0a,0x19,0xca,0x3a,0x2b,0x96,0x12,0xfb,0xc2,0x3e,0x25,0x62,0xe7,0x53,0x7f,0xb9,0x08,0xf0,0x2c,0x02,0x49,0x1f,0x35,0xf7,0x0a,0x14,0xf6,0x12,0x0c,0x32,0x2f,0xc8,0x06,0x5a,0xd2,0x25,0x2b,0x22,0xfe,0x22,0x14,0xb6,0xb5,0xed,0x1f,0xfb,0xed,0x02,0x2b,0x7f,0xe5,0x00,0x0c,0xc4,0x14,0xec,0x22,0xfc,0x25,0xd3,0xcf,0x7f,0xd9,0x05,0x1c,0x91,0x1c,0x1e,0x35,0x57,0xdf,0xfb,0x33,0x7b,0x0e,0xd9,0xe1,0x06,0x04,0x04,0xd8,0xfd,0x73,0xef,0xff,0x13,0x1b,0x35,0x0e,0x26,0x38,0x07,0x90,0x23,0xf0,0x6d,0x81,0x81,0xa3,0x22,0xaf,0xdb,0x1d,0xba,0x2b,0x1d,0x0e,0x6a,0xc4,0x3c,0x7f,0xd1,0xf7,0xec,0xe1,0xe8,0xb9,0xe4,0x4a,0x12,0xff,0x0c,0x2c,0x14,0xe3,0xcc,0x13,0x40,0x04,0xfd,0xfa,0xcd,0x1d,0xf8,0x14,0x0c,0xe8,0x28,0x25,0xf7,0x02,0x09,0x01,0xa4,0x40,0xea,0x7f,0x2e,0x03,0x8c,0x9a,0xd4,0x20,0x81,0xf1,0x39,0xd9,0x09,0x97,0x1c,0x54,0x45,0x0b,0x8d,0xd6,0xe7,0xeb,0x0a,0x0f,0x30,0xec,0xf5,0x12,0x26,0x15,0xa7,0x39,0x38,0x31,0x31,0xe2,0x04,0x5f,0x1f,0xfa,0x2c,0x46,0xe1,0x4f,0xbf,0x7f,0x08,0x0c,0x07,0xef,0x82,0x7b,0x1f,0x07,0xc3,0xfc,0x20,0xff,0x8e,0xbc,0x01,0x97,0x0f,0x3e,0xfd,0xed,0x81,0xf6,0xc7,0x3b,0xe9,0x08,0x3d,0x20,0xe9,0x90,0xbe,0xd4,0xf5,0x27,0xdd,0x27,0xe7,0xee,0xf1,0x2e,0x06,0x1d,0x81,0x32,0x28,0x0a,0x51,0x8f,0x14,0xf2,0x0f,0x0b,0xf4,0xfc,0x21,0x5d,0xf8,0x09,0xec,0x16,0x5d,0xdf,0x29,0x3a,0xae,0x7f,0x1f,0x02,0x16,0xf3,0x16,0x25,0x43,0x04,0xf8,0xd7,0xdf,0x23,0x28,0x06,0x7f,0x2c,0x2b,0xbb,0xe3,0x0d,0xff,0xfc,0xdf,0x30,0x18,0xde,0x21,0x44,0x4b,0xc1,0xe6,0x19,0xc8,0x98,0xe1,0xc4,0x0b,0x01,0x31,0xde,0x12,0xd3,0xc7,0x25,0x81,0x02,0x40,0x1a,0x14,0x00,0x25,0x25,0x0f,0x90,0x12,0x28,0x13,0xbb,0xf9,0x04,0xd5,0x16,0x24,0x0e,0xee,0x16,0x08,0xf0,0xf1,0xfa,0xbf,0xd0,0x05,0x63,0xf7,0x81,0xeb,0x02,0xf9,0xd4,0xbc,0x11,0xf6,0xc5,0x44,0xed,0xd4,0x3e,0xf9,0xf2,0xf2,0xe1,0xe7,0xea,0x0e,0x20,0xc2,0xac,0xe9,0x20,0xed,0xd0,0x03,0x1d,0x7f,0x33,0x08,0x0a,0x14,0xed,0x81,0x37,0xec,0x2c,0x32,0xd4,0x22,0xf5,0x3a,0x04,0x08,0xfd,0xf6,0x14,0xf8,0x71,0x34,0x08,0xec,0x2f,0x10,0x28,0x0d,0x0f,0xdf,0xf8,0x2e,0x0b,0x3b,0x53,0x09,0x0c,0xf1,0xf8,0xdd,0xeb,0xe4,0xe5,0x07,0xd7,0x7f,0xcb,0x31,0xc4,0xfc,0x03,0x0b,0xf3,0x13,0xf8,0x0c,0x0c,0x13,0x06,0x00,0x27,0x33,0xf2,0x7f,0xf5,0x10,0xd9,0xd3,0x36,0x21,0x08,0xe1,0xfe,0x28,0xeb,0xb8,0x4f,0x39,0xe9,0x61,0x25,0x7f,0xc0,0x24,0x46,0xd2,0x0a,0xf4,0x14,0x55,0x3e,0x2d,0xb7,0xdd,0x21,0x2d,0xd9,0x95,0xb3,0xc7,0xea,0x81,0x02,0x2d,0x1f,0xfa,0x08,0x01,0xdf,0x2e,0x13,0xde,0x1f,0xe8,0x06,0x66,0xf1,0x00,0xef,0x2e,0x2e,0xe2,0xe5,0x30,0x2f,0xb6,0xde,0x6a,0x22,0x13,0xc7,0x12,0xfc,0x77,0x07,0xcf,0x95,0x4c,0xde,0x7f,0x41,0xbf,0x2e,0x66,0x16,0x58,0xc4,0xff,0x17,0x1b,0xfe,0x4f,0x19,0x7f,0xa7,0x24,0x73,0xdc,0x01,0xf9,0x02,0x47,0xee,0x12,0xae,0xec,0x1f,0x07,0xdf,0xdf,0xde,0x1b,0xf4,0xfa,0xcc,0x10,0x21,0x0f,0xee,0x0f,0x4b,0x65,0x03,0x7f,0xe9,0x20,0xf5,0x31,0x08,0x18,0x15,0x26,0x0c,0x35,0x82,0x14,0x11,0x03,0xdb,0x2c,0xfe,0x76,0x81,0x23,0x4a,0xdd,0xdf,0xea,0xe1,0x58,0x8c,0x09,0xab,0xf3,0x0f,0x0d,0x07,0x00,0xe8,0xe9,0x16,0x76,0xf8,0xfd,0xc6,0x03,0xec,0x81,0x04,0x4a,0x5b,0x24,0xc5,0x63,0x46,0x07,0xc7,0x28,0x31,0xf1,0xac,0x62,0xda,0xbf,0x28,0x2b,0x2f,0x10,0xdb,0x81,0x10,0x1b,0x0e,0x3a,0xea,0xc9,0xf8,0xce,0xd5,0x26,0xa4,0x00,0x02,0x7c,0x14,0x01,0xf7,0xf0,0xdc,0x4f,0xe5,0xb9,0x09,0xfb,0x1d,0xf3,0x46,0xd3,0xed,0x05,0x7c,0xf0,0x03,0xbe,0xda,0x39,0xda,0x81,0xbb,0x12,0xc8,0x15,0xfc,0x81,0x34,0x2f,0x3c,0x4a,0xd4,0xb2,0x4d,0xb8,0xfd,0xce,0xba,0xc4,0x1b,0x0b,0x9f,0x52,0xea,0x41,0x0a,0xe9,0x3e,0x7f,0xd8,0x28,0xdd,0xfb,0xb5,0x28,0x1d,0xd8,0xaf,0xff,0xeb,0xe7,0xfc,0x49,0xda,0xd4,0x3b,0xc2,0xf1,0xe4,0xac,0x7f,0x1d,0x1c,0xd6,0x5d,0x17,0x4d,0x2f,0xfd,0x0b,0xb2,0x28,0xff,0xf7,0x0a,0xbf,0x2f,0xd0,0xe2,0x08,0x21,0x05,0xd1,0x0c,0x7f,0xe5,0xc6,0x25,0xe4,0x38,0xe0,0x51,0x47,0xf0,0x3a,0x0a,0x2c,0x4f,0xf9,0xa2,0xbc,0x0c,0x1f,0x56,0x0e,0x28,0x18,0x41,0x08,0x07,0xd4,0x36,0x11,0x30,0x11,0xfe,0xf0,0xed,0x7f,0x0d,0xf8,0xfe,0xc8,0xf1,0x31,0x2c,0x53,0x12,0xe8,0x25,0x3f,0x08,0xa1,0xce,0xed,0x39,0xa7,0xd2,0xc1,0xd3,0x5e,0xdc,0x4f,0xd8,0x2e,0x6f,0xf3,0x52,0xdd,0xf5,0xf1,0xd9,0xea,0xf4,0x7f,0x01,0x2c,0xed,0xb1,0x0c,0xa4,0xec,0xfb,0x19,0xe5,0xfd,0xf5,0x17,0xaa,0x31,0xef,0x2c,0x28,0x41,0xf1,0x81,0x22,0xcb,0x19,0x16,0xc3,0x2e,0xad,0xd6,0x07,0x19,0xcb,0xdf,0x24,0x7f,0xe6,0xc9,0xf6,0x49,0x03,0x3f,0x24,0xd4,0x2e,0x7c,0xd3,0x19,0x20,0x3c,0xd0,0xba,0x16,0x95,0x9f,0xe3,0x2e,0xdb,0xf6,0x05,0x39,0x7f,0x1b,0x28,0x48,0xf5,0xd8,0xf6,0x22,0xe1,0xe1,0x14,0x61,0xc9,0xf7,0x6c,0x92,0x90,0xd4,0x04,0x81,0x01,0xf8,0x9b,0x17,0xc1,0xcc,0x69,0x66,0x19,0x83,0xb6,0xf2,0xd5,0xee,0xf4,0x6a,0xd3,0xc5,0x0c,0xe0,0x3e,0x67,0x0b,0xce,0xa3,0x7f,0xcf,0x0e,0xdd,0x46,0x31,0x1f,0xf8,0xe0,0xa3,0xe4,0xea,0xfc,0x19,0x4b,0xd9,0xa5,0x19,0x63,0xfa,0x1f,0xc0,0x6f,0x39,0x31,0xe1,0x04,0xce,0xf3,0x76,0x1e,0xea,0x81,0xc7,0x31,0x71,0x14,0x14,0xff,0x24,0x43,0xb7,0xb3,0x28,0xdb,0x13,0x4e,0xff,0x2e,0x81,0x44,0x30,0xfc,0x25,0xd8,0x14,0x3b,0xaf,0x30,0xf2,0xd4,0xfa,0x33,0x32,0x18,0x13,0x09,0x04,0x28,0x0d,0x43,0xfa,0x7f,0xf6,0xf7,0xd2,0xfb,0x19,0x14,0xcd,0x08,0xef,0xd7,0x43,0xe1,0x20,0xfc,0xec,0x0f,0xf8,0x1c,0x05,0x9f,0x2a,0xf0,0x4b,0x0d,0xff,0xf0,0x02,0x29,0xde,0xc7,0x44,0xce,0x0c,0xd2,0x7f,0x16,0xfa,0xf8,0x19,0xaa,0xda,0x40,0x05,0xdb,0xb8,0x1d,0x38,0x44,0x17,0xc0,0xef,0x28,0x46,0x0d,0xff,0xd3,0x93,0x27,0x02,0xf9,0xc9,0x81,0xef,0xd5,0x1a,0xc6,0xf5,0x1c,0x35,0x7f,0x1d,0x35,0xed,0xe1,0xb4,0xfd,0x2b,0x9d,0xbd,0xec,0x9b,0xd6,0x44,0xaa,0xfc,0x69,0x71,0x41,0xf8,0xc6,0x17,0x28,0xb4,0xf8,0xe7,0x07,0x0f,0xf0,0xb6,0xf2,0x20,0xd5,0xca,0x09,0x81,0xf0,0xd2,0x00,0xd8,0xf1,0x2f,0xfd,0x18,0xa7,0x38,0xa5,0x15,0xf7,0x05,0x81,0xa8,0x8e,0xd4,0xb2,0x24,0xa7,0xee,0xd7,0x33,0x42,0x56,0x60,0xdf,0xc1,0x29,0x42,0x05,0x32,0x28,0x16,0x14,0x03,0xd6,0x7f,0xfd,0xea,0x20,0xb7,0x0d,0x6f,0x29,0x28,0xfc,0x94,0xea,0x15,0x18,0x0d,0x1e,0x72,0xd0,0x25,0xc4,0xbf,0xe9,0xe0,0x19,0xec,0x0b,0xef,0x6a,0x81,0x11,0x38,0xdc,0x0f,0x22,0x86,0x96,0x07,0xf9,0x0b,0xf5,0xf8,0xed,0x1b,0x6a,0x7f,0xfa,0xee,0xf5,0x14,0xf2,0xcb,0x58,0xf5,0x0d,0x9e,0xe6,0x48,0xdc,0x27,0x35,0x20,0x29,0xff,0xf3,0x9c,0xff,0x35,0x2f,0xee,0x7f,0x44,0xc1,0xcd,0xcc,0xdd,0x7b,0xec,0x11,0x14,0x15,0xbd,0x03,0x71,0x73,0x0b,0x10,0x26,0xf1,0xe5,0xab,0x2a,0x14,0x88,0x50,0x4f,0x1d,0x48,0xb9,0xf8,0x56,0xf7,0xf6,0xbb,0x32,0x05,0xd5,0x1e,0x5f,0x2c,0x03,0x0e,0x7f,0xc9,0x81,0xf9,0x8e,0x8a,0x2b,0xfc,0x26,0xb5,0xfa,0x02,0x76,0xef,0x0e,0xd6,0x0c,0xc8,0x19,0x3f,0xea,0xec,0xe8,0x12,0xf1,0xfb,0xe2,0x29,0x15,0x21,0xe1,0x09,0x2a,0x7f,0xf3,0x0f,0x17,0x1e,0x27,0x71,0x00,0x10,0xdb,0xee,0x2f,0x1d,0x11,0xc5,0x0e,0xc5,0x18,0x09,0xfc,0x0e,0x28,0xc9,0xcc,0x10,0xf7,0x1c,0xe9,0x20,0xec,0x29,0xe8,0x81,0xae,0x11,0x0a,0x02,0x13,0x3f,0xbc,0x3a,0xcd,0x58,0xba,0xe3,0x02,0xad,0xbe,0xd2,0x73,0xcd,0x15,0xc4,0xb6,0xc2,0xd4,0xc6,0x2b,0xe3,0x1b,0xff,0xe9,0x81,0xb5,0xff,0xe5,0xf1,0x17,0xf5,0xf9,0xf0,0x67,0x02,0xe3,0xd7,0x0d,0xb0,0x27,0x4f,0x26,0xf2,0xe2,0x1f,0xad,0x5f,0xc5,0x81,0xf3,0x27,0x0b,0xf9,0xf1,0xe0,0xe3,0x3c,0x9b,0x72,0x06,0xd5,0xe8,0xbf,0xe9,0xac,0x9b,0x1d,0x44,0xfb,0xe9,0x81,0x46,0x77,0x2a,0xc7,0xe8,0xb4,0x33,0x81,0xf7,0xf4,0x0a,0xeb,0xc6,0xa3,0xfb,0xd2,0x2d,0xcf,0x1e,0x04,0x24,0xfe,0x01,0x20,0xe1,0x20,0x3f,0x1a,0x85,0x11,0x33,0x32,0xef,0x42,0x0e,0x56,0x81,0x3a,0x41,0xe3,0xcb,0xc5,0xea,0x40,0x95,0x0a,0x9d,0xdb,0xf8,0x04,0x07,0x33,0x30,0x55,0xf6,0xd3,0xef,0x4b,0xc2,0x1b,0x08,0x04,0xed,0xf6,0xfb,0x81,0xd9,0x16,0x39,0xd2,0xde,0x1e,0xff,0x6c,0xa1,0xea,0xe5,0x17,0x12,0xb2,0xfe,0x31,0x21,0x7f,0xc5,0xe8,0x14,0xe0,0x53,0x23,0xbf,0xfa,0xdb,0x0a,0x5b,0xee,0x06,0xf0,0x0e,0xc7,0xe0,0x50,0xe1,0xb9,0x5f,0xc2,0xb3,0x81,0x2a,0x1e,0xaa,0x34,0xb3,0x19,0xd1,0xcc,0xb9,0xde,0x06,0x26,0xdc,0xaa,0x15,0x0e,0xd9,0xde,0xcc,0x13,0xf8,0x27,0xe7,0xe2,0xfa,0xf2,0xef,0x43,0x2e,0xbc,0x7f,0xeb,0xda,0xd9,0xe1,0xe5,0x34,0x36,0xfe,0x0e,0xef,0x29,0x1d,0xe9,0xf5,0x34,0xf9,0x35,0x1b,0xee,0xd5,0xf0,0xce,0xf1,0x81,0x01,0xf5,0x10,0x03,0xf6,0x32,0x3a,0x37,0x1e,0x7f,0xea,0xd3,0xe0,0xdb,0xce,0xf0,0xb6,0x1d,0x9b,0xb7,0x4b,0x55,0x4c,0xe6,0xef,0x13,0xdf,0x24,0xdc,0xe3,0x0a,0xfb,0xd2,0x61,0xeb,0xca,0xdb,0x1a,0x1e,0x57,0xe1,0xec,0x1a,0xba,0x89,0x28,0x6e,0x2e,0x08,0x85,0x29,0x21,0xec,0x36,0x7f,0x71,0x7f,0xb6,0x2f,0x23,0x09,0x30,0x13,0x65,0xe0,0x03,0xb9,0xe8,0xa1,0x51,0xd3,0x05,0xfa,0xc2,0xed,0xe8,0x44,0x0b,0xb5,0x37,0x37,0x29,0x3e,0xfc,0x17,0xeb,0x7f,0xfa,0xe0,0xf8,0xe0,0xe3,0xf8,0x39,0xf7,0x1c,0x55,0xf7,0x4c,0xad,0xc1,0xcb,0xf2,0x11,0xbc,0xed,0x36,0xd3,0xfb,0xb1,0x07,0xf4,0x3e,0xe3,0xd9,0x1e,0xf8,0x07,0xf7,0x5b,0x7f,0xab,0xf0,0xfd,0x08,0xdb,0x1d,0x0d,0xbf,0xe3,0xe0,0x13,0x3f,0x22,0x27,0x7f,0x16,0x1b,0x04,0x05,0x1d,0xf9,0x38,0x30,0xfb,0xd0,0x0d,0xc0,0x3c,0xe3,0xbb,0x00,0x54,0x6b,0x51,0x65,0x04,0xd7,0x24,0xbf,0x30,0xf5,0xe8,0x1a,0xe9,0xf0,0x7f,0x36,0xdf,0xde,0x8b,0x35,0xee,0x32,0x27,0xfb,0xf8,0x0d,0x25,0xd6,0xa9,0x35,0xcf,0x3f,0x67,0xca,0x17,0xcd,0x32,0x0b,0xff,0x02,0x15,0x10,0xdf,0x7f,0x40,0x09,0xe6,0xee,0x06,0xf0,0x03,0x13,0x18,0xfc,0x11,0xdc,0xd1,0x0e,0xec,0x20,0xf5,0xf2,0xdf,0x7f,0x11,0xed,0xdf,0xc9,0xf4,0xe9,0xf1,0xf1,0x02,0xd4,0xf5,0xeb,0xce,0xf3,0xed,0xc4,0xf0,0x30,0x09,0x28,0xe0,0xf8,0x92,0xf3,0xee,0x22,0x2a,0xa0,0x20,0xf8,0x7f,0x29,0x25,0xe5,0xb6,0x26,0x53,0xc2,0x7d,0x39,0x5c,0xcf,0x77,0x7f,0xd5,0xfd,0xe4,0x04,0x2c,0x60,0xda,0xc0,0xcd,0xf5,0x32,0xf4,0xfd,0xe2,0xd3,0x0b,0xec,0x1b,0x1d,0xe3,0xf0,0x21,0xff,0xf8,0xf8,0x23,0x81,0x01,0xf7,0x2e,0xfd,0xd0,0xfb,0xf4,0x67,0x09,0x2b,0xfc,0x03,0x48,0x0e,0x32,0x61,0xde,0x49,0xf1,0xd2,0x16,0xda,0x1c,0x4d,0x14,0x17,0xe7,0x81,0x24,0x07,0x19,0xfd,0x13,0xea,0xf6,0xf7,0xf4,0x00,0xf1,0x1f,0x31,0x26,0xe9,0xf7,0x19,0x0e,0xfe,0x0b,0x02,0xe2,0x7f,0xe6,0xca,0xd4,0xec,0xea,0xe5,0x27,0x18,0xe9,0xe5,0xf4,0x44,0x35,0x28,0x0e,0xd8,0x12,0x1a,0xe5,0x22,0x0a,0x0a,0x81,0x09,0xf8,0x27,0xcd,0xdb,0x18,0x01,0xfa,0xdf,0x9e,0xd5,0x0e,0x2d,0xe3,0x21,0xe6,0xfe,0x01,0xfe,0x9f,0x0a,0xcb,0x7f,0xf9,0xe4,0xdc,0x9c,0x1e,0xe8,0xe4,0xe2,0xa7,0xd6,0x19,0xb1,0xc4,0x2a,0xa8,0xf3,0x81,0x0a,0xf2,0xad,0xf0,0x23,0xb1,0x08,0xd5,0x0e,0xe2,0xe3,0x3d,0x1a,0x0c,0xee,0x3f,0xea,0xee,0xe1,0xf2,0x03,0x2a,0x17,0x0c,0x39,0x81,0x34,0xe9,0x07,0xc4,0xee,0xad,0x10,0x20,0x40,0xe4,0xe6,0xc9,0x14,0x03,0xf3,0xc7,0xd6,0x30,0xf3,0xda,0x05,0xf4,0x1d,0xe0,0xf9,0xba,0xd1,0xfc,0x48,0x04,0xd7,0xe2,0xc7,0x2c,0xca,0x81,0xeb,0xf7,0x7f,0x04,0x0c,0xf2,0x02,0xdc,0xf0,0xb5,0x0e,0x35,0xc1,0x1d,0xf9,0x41,0x04,0xfd,0x2d,0xef,0x20,0x26,0xfa,0x09,0x03,0x5d,0x4b,0x9b,0xd3,0xcb,0xb0,0x1f,0x67,0xf6,0x81,0x24,0xe1,0xf5,0xe3,0xe1,0x61,0x0e,0x12,0x2d,0x8b,0xf6,0xee,0x64,0x15,0x69,0xfc,0x36,0xe0,0x55,0xdf,0x19,0xd6,0x21,0x13,0x27,0xec,0x70,0x11,0x25,0xc8,0x00,0x81,0xc9,0xcd,0xd5,0x06,0x0a,0xcf,0x3b,0xb0,0x81,0x0d,0x07,0xfb,0x44,0x3f,0x44,0xb5,0x56,0x06,0x19,0x2f,0x06,0xec,0xed,0xd3,0x16,0x8a,0xe6,0x04,0x6a,0xf2,0xde,0xd7,0x95,0x22,0x9c,0x11,0x07,0xeb,0x2f,0xb9,0x15,0xde,0x0d,0x02,0xd8,0xd8,0x81,0x53,0x2d,0x9e,0x2d,0xfc,0x56,0x0b,0xa6,0xbf,0xdc,0x14,0x81,0xea,0x20,0x2e,0xe2,0xf3,0x10,0x10,0xf9,0xff,0xe3,0x26,0xfc,0x52,0x17,0xed,0xf5,0xe9,0x35,0x35,0xfe,0x81,0x1b,0x0b,0x16,0x15,0xfc,0xe8,0x3b,0x2a,0x0d,0x14,0xfd,0xce,0xb5,0xd4,0x0b,0x0a,0xb7,0x0b,0x05,0xf9,0xab,0xfa,0x81,0x0a,0x36,0x2a,0xc0,0xab,0x19,0xef,0x24,0xa8,0x0b,0x25,0x8a,0x7d,0xd5,0x18,0xeb,0x12,0x1f,0x18,0x2c,0x2d,0xe9,0x28,0xff,0x14,0x6e,0x00,0x95,0xfe,0x5c,0xae,0x3b,0x0d,0xff,0xf8,0xef,0xff,0xa5,0x9a,0xfb,0xfe,0xc1,0x9e,0x18,0xd4,0x7f,0xce,0xdd,0xc5,0x81,0x71,0xbf,0x0c,0x1e,0xee,0x5d,0xce,0xe3,0x8e,0x0d,0x3d,0xd7,0x1f,0x56,0x1b,0xfc,0xdb,0x28,0xed,0x15,0x35,0x0b,0x7f,0xf4,0x0d,0xe6,0xfe,0x96,0xbe,0xb7,0x2e,0x23,0xab,0x20,0xee,0x23,0xe6,0x1c,0x0c,0xe8,0x52,0x29,0xea,0xea,0xdf,0xef,0x1e,0xe2,0xf2,0xf8,0xc9,0x6f,0xc3,0x3d,0xf4,0xbc,0x1a,0x7f,0xac,0x02,0xe1,0x0d,0xc9,0xfe,0x28,0xbf,0x1b,0x17,0x1c,0xf9,0x05,0x04,0xed,0x12,0xfe,0x1f,0x21,0x1a,0xf7,0xfd,0x20,0x0e,0x15,0x7f,0xfc,0x12,0xe3,0xe2,0x1c,0x21,0xfc,0xf8,0x0b,0x47,0x98,0xf7,0xe9,0xc2,0x06,0xeb,0x9f,0x0a,0x08,0x01,0x24,0xa0,0x7f,0xac,0x1f,0x22,0x78,0xb8,0xa4,0x1b,0x33,0x5a,0xdb,0x06,0x02,0xed,0xfa,0xd9,0x06,0xf4,0x3a,0x3e,0xe6,0x0f,0x05,0x21,0xcd,0xe9,0x24,0xdd,0x7f,0xd6,0x07,0x10,0x14,0xdb,0xe5,0x17,0xd0,0x1e,0x30,0xdf,0x4a,0x28,0xb4,0x0d,0x19,0x02,0xf2,0xf0,0x42,0x81,0x2d,0xf5,0x17,0xb4,0xb9,0x06,0x14,0x71,0x08,0x85,0x07,0x7f,0xfa,0xfe,0xe1,0x39,0xfb,0x6d,0xe2,0xbc,0xfb,0xd5,0xf8,0x2d,0x18,0xf2,0xf0,0xd2,0x22,0xff,0xf7,0xd3,0x10,0x10,0x4a,0xdc,0xc8,0xed,0x07,0xee,0xf3,0x47,0x0c,0x1d,0xe2,0x18,0x0d,0xfd,0x31,0xfe,0x7f,0x0f,0x03,0x0e,0xfb,0xd6,0xe9,0xd2,0xd9,0xdb,0x19,0x06,0x06,0xe0,0x56,0xf8,0x30,0x18,0x0e,0x44,0x14,0x4e,0x3c,0x0b,0x81,0x05,0x15,0x4c,0xaf,0xa4,0xf1,0x08,0x0b,0xf0,0x13,0xdf,0x0c,0x3c,0xf3,0x44,0x02,0xe5,0x22,0x0a,0xf6,0xd0,0xee,0xfa,0xc9,0x06,0xd4,0x7f,0xde,0x45,0xd2,0x1f,0x35,0xa8,0xb0,0x50,0xc7,0x3e,0x11,0x1f,0xef,0xf4,0x02,0xfb,0x7f,0x2e,0x1c,0x22,0x0d,0xfc,0xa9,0xd2,0xe6,0x58,0xb5,0x21,0x1d,0x24,0xfc,0xc1,0xc0,0x3e,0x0d,0x81,0x2c,0x15,0xeb,0xae,0xfc,0xf1,0x57,0x75,0x61,0xf5,0xcd,0x05,0xd7,0xa4,0x3b,0xd4,0xd3,0x17,0xb0,0xca,0xc8,0x81,0xc6,0xb6,0x70,0x04,0xed,0x0f,0xd4,0xc6,0xf6,0xe0,0x11,0x0e,0x0a,0x1b,0xe0,0xad,0xf7,0xdc,0xc5,0x81,0x12,0x33,0xf5,0xb9,0xda,0x31,0xb5,0xd5,0x14,0xdb,0x00,0xfc,0xab,0xb9,0xbb,0xe9,0xde,0x31,0x36,0x14,0xea,0xb5,0xb2,0x39,0xe6,0x23,0xe7,0xef,0xcf,0x1f,0x0e,0x81,0x34,0x0f,0x08,0xf7,0x58,0x2e,0xff,0xca,0xd3,0xdc,0x06,0x01,0xfd,0xdf,0xeb,0xd6,0xe2,0x05,0xe6,0x08,0x24,0xfa,0xf9,0x17,0xfc,0x39,0x0b,0xc3,0xec,0x03,0x15,0x7f,0xfa,0x01,0x15,0x13,0xfa,0xaa,0x13,0x59,0x41,0xf8,0x46,0x25,0xf3,0x39,0xf2,0xcd,0x74,0xe1,0x2b,0x6f,0x51,0xf7,0x6b,0xe2,0x7f,0x16,0xf3,0x29,0xcd,0x00,0x00,0x00,0x00,0x86,0xc3,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x08,0x01,0x73,0x22,0x60,0x06,0xcc,0xb9,0x50,0x5b,0x1c,0x09,0xe6,0x7b,0x0b,0x81,0xb9,0x1e,0xeb,0x10,0xf5,0xd8,0x11,0x1e,0x32,0xce,0x32,0x14,0x0b,0xc0,0xf4,0xa1,0xf8,0x3a,0x04,0xfc,0xe3,0xe1,0x38,0x05,0x1a,0x19,0xf7,0x05,0xd8,0xe1,0xf7,0x19,0x0d,0xf6,0x7f,0xeb,0xee,0x08,0x2d,0xb7,0xca,0xff,0xa8,0x30,0x77,0x52,0xf5,0x01,0xef,0x35,0xe8,0xb1,0x12,0xb1,0x00,0x59,0x7f,0xc2,0xf2,0x4f,0xf9,0x38,0xed,0x0d,0x11,0xd3,0xf0,0x30,0xcc,0x89,0xee,0x23,0x3f,0xe4,0x18,0x0f,0xe1,0xe9,0x73,0x01,0xd9,0x0c,0x2e,0x50,0x09,0x14,0x4b,0x3c,0x84,0xb9,0x81,0x27,0x10,0xc4,0x03,0xc4,0xe6,0x23,0x8e,0x57,0x00,0xf4,0x87,0xc2,0xad,0x69,0x03,0xee,0xdf,0x21,0xdc,0x7f,0xac,0xd2,0xcc,0x21,0xd7,0x58,0x20,0x19,0xba,0xcf,0x18,0xc3,0xec,0xcb,0xf1,0xf9,0x24,0xc4,0x09,0xa4,0x0f,0x08,0x2d,0xa6,0xee,0xdb,0x09,0xdc,0x5a,0xeb,0x8f,0x14,0xf2,0xef,0x02,0x96,0x18,0x81,0x8c,0xc2,0x3e,0x98,0x0b,0x81,0xff,0xe2,0x03,0x14,0xd8,0xf5,0xe9,0x11,0x23,0xc5,0xb7,0x0a,0xcd,0x2d,0xed,0xde,0x0d,0xd5,0xfb,0xe8,0xcf,0xe1,0x18,0xc6,0xef,0xe0,0x14,0x06,0xc8,0xfb,0x07,0xc5,0x81,0x51,0xe2,0xf9,0x03,0x43,0x05,0xf3,0x09,0x38,0x08,0xf1,0xef,0xf1,0xe3,0x34,0x00,0xd0,0xe2,0x34,0xe4,0xa4,0x81,0x0a,0x29,0xd0,0xaa,0xea,0xc5,0x29,0xe4,0x50,0x08,0x0c,0xd1,0xc2,0x89,0x03,0x0c,0x22,0xd9,0xec,0x1e,0xe9,0xf0,0x03,0xed,0xd1,0xed,0x42,0xdd,0xf4,0x24,0x7f,0xef,0xf5,0xf5,0x52,0xfc,0xfb,0x2b,0xfc,0xb9,0x09,0x05,0xee,0xd5,0x29,0x2d,0xd8,0x1c,0x15,0x24,0x0b,0x0d,0x1d,0x44,0xf1,0xfb,0xf0,0x15,0x05,0x22,0x0d,0xe1,0x02,0x22,0xfd,0x81,0x15,0xfd,0xdd,0xd8,0x05,0xec,0xde,0xb9,0xd2,0x15,0xe0,0x07,0x15,0x13,0x14,0x23,0x41,0x19,0x12,0x37,0x02,0xf3,0x1c,0x28,0x37,0xe4,0x21,0xe6,0xc0,0x01,0x6c,0x81,0x18,0xc8,0x4b,0x23,0xf2,0x1f,0x8f,0x15,0x97,0x38,0x25,0xe7,0xe6,0x1e,0xf0,0xa3,0xf4,0x60,0x32,0x81,0x53,0x2d,0xd3,0x76,0x52,0xc5,0xaf,0x07,0x01,0xcb,0xfb,0x19,0xee,0x36,0x1f,0x19,0x5a,0x0e,0xc4,0x33,0xe4,0xca,0xe4,0x02,0x1e,0xc4,0x48,0xd4,0xe3,0x40,0xc3,0x7f,0xde,0xdc,0xd1,0xd9,0xbd,0x3a,0xeb,0x27,0x03,0xfb,0xfc,0x41,0xf7,0x4b,0x5e,0x0c,0x81,0x09,0xcc,0x4e,0xf9,0x13,0xfa,0xd4,0xd5,0xf4,0x09,0xfe,0xe7,0xe8,0xde,0xe1,0xde,0xf2,0x4a,0x14,0xe4,0xf2,0xfb,0x09,0x37,0xe8,0x03,0xfd,0x4d,0x1b,0x3d,0x54,0xfa,0x88,0x50,0x7f,0x0e,0x54,0x57,0xcf,0xa1,0xf5,0xf2,0xbc,0x55,0xda,0xf9,0xb8,0x2b,0xdc,0xab,0xa2,0x50,0xec,0xc6,0x9d,0x11,0xd8,0x29,0x2d,0xbb,0x01,0xdf,0x11,0xe0,0xe3,0x27,0xda,0x09,0x7f,0x54,0x99,0xcc,0x05,0x16,0xed,0x01,0x1a,0x77,0x40,0x3f,0x1d,0xe8,0xfc,0xfe,0x0a,0xd6,0x23,0x12,0xec,0xcc,0x01,0xe8,0xd4,0xd5,0x7f,0x00,0xdf,0xfd,0xcb,0x3f,0xf0,0xdd,0x07,0xfc,0xd9,0xfb,0xfe,0xff,0x1c,0xfe,0x05,0x68,0x0a,0xec,0x89,0x07,0x53,0xcd,0xbe,0xbe,0xf7,0x0c,0xf7,0xd1,0xf6,0x03,0xe1,0xe4,0xfb,0x81,0xf4,0xff,0xba,0xde,0x1a,0xb3,0x00,0x00,0xe7,0xd8,0x1c,0xff,0xdd,0x12,0xf3,0x1d,0xd4,0x10,0x2d,0x00,0x0b,0xc9,0x13,0x42,0x01,0x23,0x26,0x3b,0x09,0x2c,0x22,0xa5,0x34,0x81,0x32,0xfb,0x00,0x00,0x00,0x00,0xc6,0xc5,0xff,0xff,0x04,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x07,0x14,0x7f,0xed,0x98,0xff,0x3c,0x0a,0xe5,0x2c,0xde,0xf1,0x04,0xf6,0xfe,0x23,0x09,0x0d,0xf1,0x47,0xe7,0xf1,0xd5,0x3b,0x21,0x1a,0x23,0x01,0x25,0xb9,0xfc,0xcb,0x3b,0xed,0x9e,0x7f,0xe3,0xf5,0xe0,0x22,0xe3,0xdb,0xf4,0x38,0xe1,0xf5,0xca,0xf3,0xae,0x0e,0xc2,0xe9,0x81,0x01,0xdf,0xea,0x6c,0xd5,0x00,0xf9,0x2c,0xda,0x33,0x08,0xc6,0x1f,0xe9,0x4f,0x07,0x0c,0x0b,0x05,0x2d,0xe3,0xea,0xfb,0xf5,0xde,0x03,0x04,0xda,0xbe,0x04,0x08,0x20,0x02,0x24,0xda,0xe8,0x81,0xfe,0xcf,0xe1,0x0c,0x29,0x10,0xfa,0x7f,0xda,0xd3,0xbc,0xe1,0x5e,0x0c,0x09,0xca,0x32,0xab,0x53,0xd6,0x51,0xc0,0xeb,0x17,0x12,0xc3,0xf7,0x26,0x4f,0x0f,0x0e,0x06,0x04,0x41,0xc1,0xe8,0x25,0x30,0x39,0xe2,0xd3,0x1c,0xdf,0x23,0x90,0x81,0xb8,0x1a,0x02,0xd0,0x7f,0xa0,0x4d,0x2b,0xcf,0x97,0x11,0x0c,0x5a,0x11,0x81,0x0c,0xff,0x26,0xe3,0x68,0x84,0x0c,0x93,0x60,0x1b,0xd9,0xf3,0xfe,0x20,0xc5,0x8c,0xe1,0xea,0xe3,0x11,0xc8,0xd6,0x2a,0xaf,0x05,0x81,0xfb,0x19,0xeb,0x0a,0x02,0xda,0x22,0x02,0x22,0x0b,0xbe,0x29,0x16,0x43,0x08,0xef,0x99,0xb0,0x0a,0x2d,0x30,0xc3,0x4f,0xb2,0x25,0x07,0x0f,0xd9,0x03,0xe6,0x7f,0xf8,0xf5,0x07,0xb7,0x22,0xe9,0xd2,0x20,0x3d,0x1e,0xaa,0xdf,0x4e,0xe3,0x95,0xdd,0xe2,0xcc,0x04,0x0b,0x2b,0x0f,0x76,0x81,0xa8,0xa8,0xfb,0xbd,0x1e,0x27,0x6b,0xce,0x3d,0xef,0x1a,0xe0,0x17,0xf7,0xea,0x65,0x09,0x2d,0x05,0x0d,0xdc,0xfe,0x7f,0xf6,0x2c,0xf9,0xf6,0x13,0x1c,0xf4,0x9d,0xf7,0xba,0xef,0xf9,0xc1,0xfe,0x0d,0x07,0xd4,0xb1,0xd4,0x0e,0xb6,0x2b,0x16,0x81,0x3e,0xe4,0xc4,0x0f,0xdc,0xb2,0xeb,0x4b,0xf8,0xf0,0x7f,0xfb,0xbd,0x01,0x1e,0xaa,0xef,0xa5,0x27,0xb9,0xbd,0x08,0x0b,0xfd,0xd7,0xe1,0x61,0xfb,0x60,0x26,0xeb,0xdc,0xe4,0x25,0xcf,0x12,0x19,0xfb,0xec,0xbf,0xaa,0xee,0x2c,0xb5,0x7f,0xbb,0xf3,0xa4,0x2a,0x3d,0x0e,0x00,0x34,0xff,0xf5,0xbe,0xe4,0x0c,0x7f,0xfa,0xc6,0xfb,0xf8,0xe6,0xd5,0xf6,0x3c,0xc6,0xb8,0x33,0xf7,0x2a,0x18,0xd4,0xd9,0x0d,0x50,0xee,0xfb,0x31,0x12,0xfc,0x56,0xd0,0x00,0xbb,0x10,0x1d,0x3f,0x19,0xb8,0x23,0xab,0x4e,0x05,0x76,0xe0,0x81,0xf2,0xf6,0xd6,0x10,0x13,0x3e,0x36,0x16,0x3d,0x5a,0xf1,0xf6,0xb5,0x15,0xb8,0x7f,0xee,0x1f,0xf3,0x13,0x0d,0xf4,0x8e,0x26,0x0e,0xea,0x33,0xd9,0x17,0x57,0xe0,0x58,0x19,0x0f,0x08,0x33,0xee,0xe4,0xdb,0xb2,0x28,0xc2,0xf0,0x0f,0x04,0xf1,0xbb,0xf2,0x81,0x08,0xe9,0x26,0xd0,0x03,0x01,0xe6,0x70,0x1e,0x04,0xe2,0xf2,0x17,0x87,0xdd,0xaf,0xe2,0xca,0x2c,0xf4,0x99,0xd6,0xe5,0x19,0x06,0x13,0xca,0x2d,0x7f,0x14,0xe6,0xc6,0x5b,0xcc,0x47,0x1c,0xd0,0xd1,0x18,0x49,0x04,0x65,0xb0,0xd6,0x81,0xdf,0x56,0x2a,0xdc,0x2d,0x2a,0x3b,0x1c,0x12,0x1b,0x82,0xbb,0x4d,0xce,0x00,0x1e,0xf5,0x31,0x81,0x4c,0x41,0x02,0xe8,0xe2,0x15,0x4c,0xc1,0x06,0xdd,0xe3,0x19,0xe3,0x01,0xe0,0xff,0x15,0xe4,0x16,0x00,0x09,0x0c,0x0c,0x30,0x02,0xc8,0x03,0x23,0xfd,0x7f,0x21,0xc1,0xf5,0x79,0xc0,0xf3,0xa3,0xc9,0xcb,0x44,0xe0,0x0c,0xdd,0x1b,0xed,0xe9,0xf4,0x0e,0x05,0x81,0x20,0xf7,0xe0,0xe3,0xe3,0x40,0x09,0x0d,0x3e,0x16,0x14,0x0c,0xf9,0x39,0xc9,0x05,0xb7,0x0b,0x47,0x4e,0xe1,0xb1,0x33,0x81,0x3c,0x3f,0x57,0xe5,0xe0,0x02,0x0e,0xdf,0xf5,0x17,0x11,0xfa,0xfe,0xcb,0x9e,0x0a,0x5f,0xf7,0xb7,0x81,0xd1,0x27,0xee,0xe5,0x36,0x01,0xfd,0xd5,0xb7,0xa6,0xf1,0xc3,0xf0,0x12,0x36,0x97,0x3e,0xe1,0x2a,0x0e,0x02,0xef,0xe2,0xce,0x0f,0x13,0x96,0x7f,0xbb,0xfe,0xde,0xf1,0xf0,0xf4,0xf4,0x63,0xdb,0xd1,0xb4,0xed,0xf9,0xf0,0xe2,0x11,0xde,0x23,0xfa,0xf1,0xb8,0x14,0x19,0xec,0xec,0x10,0x81,0x01,0x02,0x24,0x14,0xcb,0x0d,0xeb,0x64,0x12,0xe7,0x05,0xbc,0x0d,0x52,0x03,0xe6,0xbc,0xd8,0x70,0x98,0x3b,0x24,0x9c,0x7f,0x3d,0xbf,0x89,0xf5,0x2e,0x3e,0x0f,0x99,0xea,0x00,0x00,0x00,0x00,0x76,0xc8,0xff,0xff,0x04,0x00,0x00,0x00,0xa0,0x02,0x00,0x00,0x15,0xa4,0x19,0x11,0xb9,0x7d,0x0c,0x81,0xfe,0x0f,0x0b,0x04,0xee,0x13,0xf5,0x26,0xf4,0xec,0x32,0xcd,0xed,0xad,0xd9,0xc7,0xcf,0xbf,0xdf,0xdf,0x77,0xef,0x18,0x3d,0x39,0x4e,0xd3,0x04,0xc4,0x39,0x26,0x4e,0xdc,0xdd,0x97,0xfe,0x5e,0xd9,0xf0,0x2e,0xb6,0x06,0xd1,0x0e,0x29,0x71,0x40,0x7f,0xb2,0x1d,0x5a,0x06,0x3d,0x5f,0x04,0x1c,0xc8,0x25,0x20,0x56,0xce,0x14,0x97,0xd9,0xbe,0xd7,0x8f,0xe6,0x7f,0x5d,0xf2,0x05,0xc3,0xb3,0xa1,0xec,0x10,0xe7,0x1d,0x81,0xe1,0xd9,0x32,0xfe,0xdb,0xc0,0x00,0xfe,0xe8,0xdc,0xf5,0x67,0xdb,0x0b,0x50,0x1f,0xea,0xe7,0x0c,0xe6,0xf1,0xca,0x1e,0xd0,0x0e,0x0a,0xf9,0x10,0x4a,0x7f,0x09,0xd2,0x9b,0xd0,0x1d,0xa4,0xf8,0xeb,0x2d,0x19,0x2c,0xf3,0x1f,0xe9,0xac,0x16,0xd3,0x01,0xc6,0x86,0x68,0x05,0x1f,0x17,0xf0,0x18,0x07,0x88,0xfb,0xda,0x10,0x01,0x42,0x30,0x07,0xcf,0x65,0x24,0x21,0x17,0xfd,0xc7,0x7f,0x28,0x06,0xf9,0x2f,0x13,0xfd,0xd7,0x02,0x31,0x29,0x84,0x7f,0x3c,0x79,0xc7,0x0d,0xf9,0x8d,0x60,0xa2,0xeb,0xa7,0x3d,0xe9,0x0e,0xc7,0x98,0xb9,0xd1,0x32,0xe1,0xf2,0x66,0xb6,0x83,0xc8,0xd6,0x43,0xfb,0xfd,0xe0,0xfa,0xdb,0x06,0x3a,0xca,0x43,0x02,0x06,0x7f,0xed,0xec,0x14,0x33,0xf5,0xce,0x21,0x11,0x10,0x2f,0x3d,0xd6,0xd8,0x06,0xde,0x24,0xe0,0xfa,0x81,0x10,0x42,0xed,0xf8,0xd1,0x03,0xab,0xdc,0x98,0x08,0xc1,0x0b,0xfa,0xf5,0x8c,0xe2,0xcc,0xfe,0xd7,0xc4,0x18,0xe3,0x7f,0x09,0x16,0xfa,0x37,0x2f,0x1e,0xee,0x16,0x0a,0xf2,0xe5,0xf9,0x23,0x1e,0xf4,0x52,0x10,0xfc,0x72,0x15,0xde,0x16,0x0e,0xe6,0xaa,0xea,0x6b,0xb6,0x05,0xda,0x19,0xf0,0xdf,0x32,0x13,0xfb,0xc8,0x86,0x1d,0xd9,0x13,0x34,0xdf,0xa1,0x0d,0xba,0xcb,0x01,0xb3,0xc6,0x23,0x7f,0x40,0xcb,0xe1,0xb8,0xf3,0x03,0xfb,0xff,0xe6,0x08,0xe5,0xf1,0x00,0x12,0x12,0xf8,0x46,0x02,0xf1,0xd7,0x05,0x25,0xbf,0xf0,0xd1,0x23,0x25,0xb8,0x81,0xf3,0x0b,0x0a,0x5f,0x1e,0x34,0xdc,0x40,0x46,0x14,0xd3,0x9c,0xc5,0xd2,0x10,0xcc,0xc1,0x18,0xe8,0x12,0xd9,0xc9,0x60,0x51,0x1b,0x02,0x7f,0x7a,0x0e,0x3e,0x13,0x12,0xa9,0xfb,0x01,0x0c,0x21,0xf9,0x26,0x35,0xb3,0xe8,0xc7,0xff,0x4a,0x2c,0x36,0xda,0x5b,0x7f,0xe2,0xc2,0x8b,0x15,0x04,0x5a,0xd3,0x17,0xe3,0x18,0x7f,0x6b,0x0b,0x0d,0x12,0xd9,0xfe,0xf2,0xca,0xeb,0x22,0x19,0xfa,0x0c,0xf8,0x0b,0x36,0x05,0xe7,0x10,0x0a,0x22,0x52,0xfe,0x09,0x20,0x27,0x22,0xd9,0x0f,0xfb,0x04,0xf1,0x7f,0xd2,0xe6,0xc7,0x4c,0x0b,0xe5,0x70,0xe6,0x1c,0x27,0x5e,0x0b,0xda,0x1e,0x0b,0x04,0xf1,0xd7,0xe2,0x17,0xd0,0xf9,0xe1,0x23,0xff,0x4d,0x22,0x0c,0xed,0xe8,0x08,0x50,0xf2,0xd4,0x20,0x3d,0xb8,0x1c,0xd4,0xcf,0xf0,0x99,0xe4,0xd2,0xb5,0x81,0xb3,0xf6,0xea,0xcf,0xe4,0x09,0x71,0xf9,0xff,0xe9,0xfa,0xef,0x06,0x7d,0xfc,0x08,0x0b,0x0b,0xfb,0x09,0xe2,0x06,0x1d,0xd8,0xff,0x49,0x20,0x08,0x7f,0x44,0xf7,0x2c,0x81,0xe8,0x07,0x55,0xcc,0xec,0x86,0x28,0xdc,0x47,0x3b,0xba,0x63,0x4a,0x2c,0x06,0x43,0x08,0xcc,0x85,0xeb,0x9c,0x29,0x7e,0xdc,0x72,0x65,0xfa,0x16,0x5c,0xcf,0x81,0x00,0x29,0x37,0x0c,0x2b,0x3f,0x1d,0xe4,0xac,0x0d,0x41,0xe0,0x01,0x28,0x04,0x07,0xb7,0xf6,0xc9,0xbb,0xbb,0x39,0x2e,0xf2,0x5d,0xd7,0xee,0x86,0xf1,0xdf,0x81,0x75,0x4e,0xe2,0x9f,0xca,0x6a,0x4b,0x95,0x0f,0x20,0x20,0x28,0x3d,0x6d,0xfe,0x1e,0xfb,0xfe,0x5b,0x1b,0xef,0xd3,0x5e,0x36,0xbf,0x0d,0xd0,0x95,0x81,0xdd,0xc2,0x3d,0x08,0xd3,0x3f,0xda,0x16,0xdd,0x1a,0x26,0xdc,0x13,0x33,0x33,0xfd,0xec,0xe1,0xf5,0xf2,0xa4,0xcc,0xc8,0xff,0xc4,0x08,0xdc,0xda,0xdf,0xb7,0xb9,0x36,0xd1,0xca,0x10,0xfb,0x90,0xf7,0x4f,0xab,0x00,0xfe,0x2a,0x7f,0xc4,0x40,0xe8,0xa7,0xfe,0xdb,0x97,0xae,0xf4,0xea,0xcd,0xc6,0xf9,0x2d,0x44,0xd0,0xed,0x00,0x64,0x07,0xdb,0x25,0xf2,0x1f,0x10,0xb7,0x05,0x16,0x81,0x05,0x00,0x00,0x00,0x00,0x26,0xcb,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xb2,0x1f,0x23,0xdc,0xcf,0x7f,0xee,0xe1,0xe4,0xa9,0xec,0x81,0x6c,0x44,0x7d,0x1d,0x3e,0x1c,0x7f,0x2d,0x41,0x9a,0xb7,0xe6,0x1f,0x01,0x11,0x5d,0x41,0x81,0xe5,0xc6,0xba,0xdc,0xf4,0xf5,0x81,0x06,0x01,0x45,0xc5,0x13,0x10,0xea,0x7f,0x8a,0xdb,0x1d,0x16,0xb0,0x8b,0xc2,0x02,0xf8,0x7f,0x00,0xde,0xd7,0x95,0xb0,0xf6,0x7f,0x2c,0x00,0x9c,0xfb,0xad,0x8a,0x4e,0x5f,0x7f,0xf5,0x81,0x18,0xa4,0xc0,0xb1,0x44,0x7d,0xde,0xc9,0x04,0x10,0xbc,0xa4,0x7f,0x34,0xe9,0xfd,0xa9,0xfa,0x76,0x7f,0xb5,0xda,0x09,0xce,0x09,0x9d,0x81,0x3a,0x7d,0x28,0x00,0x31,0xf5,0x60,0x7f,0x46,0xfb,0xd9,0x9b,0x7f,0x0e,0x2c,0x7a,0x79,0xa4,0xaa,0x85,0xbe,0x0c,0xab,0x81,0x6b,0x55,0xf9,0x1e,0x1e,0xfe,0xe1,0x6a,0x3c,0xd1,0xe0,0x81,0xc8,0x12,0xbc,0x93,0xd7,0x7f,0x19,0xdc,0x38,0x81,0xf4,0xa9,0xef,0x5b,0x70,0xfa,0xa7,0x81,0xac,0x9f,0xd6,0xce,0x01,0x2a,0xc8,0x23,0x8e,0x81,0x15,0x64,0x34,0x24,0x21,0x5b,0xfe,0x2f,0x17,0x81,0xa6,0xad,0x96,0xec,0xd2,0xab,0xd8,0x7f,0x29,0xeb,0x81,0xbf,0x9b,0x9b,0xc3,0xb8,0x5d,0x23,0x16,0xed,0x0c,0x0e,0x1f,0x81,0xe7,0x2f,0x26,0x14,0xfc,0x3f,0x7f,0xe1,0x0a,0xf0,0x39,0xce,0xa6,0xca,0x81,0x49,0xe8,0x68,0xf5,0x26,0x60,0x25,0x4c,0x81,0x2b,0xaa,0x00,0x00,0x00,0x00,0x16,0xcc,0xff,0xff,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x81,0x86,0xd5,0x0d,0xc2,0xfe,0x81,0x05,0x81,0xdb,0x06,0x28,0x81,0xeb,0xe2,0xdb,0x81,0xd4,0xfb,0x00,0x7f,0xe0,0xcc,0xf3,0x7f,0x4c,0xbb,0xde,0x35,0x3d,0x7f,0x00,0x00,0x00,0x00,0x46,0xcc,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x44,0xdc,0x3d,0xba,0x0e,0x1f,0xa7,0xfc,0xb9,0xe5,0x7f,0x3e,0x03,0x27,0x03,0x7f,0xfd,0x72,0x22,0x32,0x60,0x00,0xfa,0x01,0x29,0xaf,0x3d,0x81,0xe7,0xbd,0x2b,0xed,0xd4,0xd1,0x60,0x26,0x2a,0x7f,0xf6,0x74,0x1b,0x6b,0x4e,0x4e,0x4f,0x1c,0x0f,0x20,0x00,0x00,0x00,0x00,0x86,0xcc,0xff,0xff,0x04,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x40,0x08,0x1e,0x7f,0x13,0xf7,0x11,0xfe,0xfb,0xea,0xc0,0xf0,0xcc,0x81,0xd6,0xe0,0xe2,0xd9,0xf4,0x8d,0x81,0xf8,0xc5,0xbc,0xfc,0xed,0xea,0x98,0x91,0xfd,0x85,0x81,0xf4,0xf7,0xf8,0xfc,0x7f,0x45,0x3b,0x71,0x55,0x25,0x38,0x38,0x0f,0x97,0x91,0xfa,0x84,0x81,0xf3,0xf6,0xf7,0xfa,0xfd,0xe2,0xe3,0xbe,0x81,0xd4,0xf3,0xd1,0x02,0xf0,0xde,0xf8,0xb5,0x81,0xe0,0xdd,0xe0,0xf3,0x9b,0x94,0xfb,0x85,0x81,0xf2,0xf6,0xf6,0xfc,0x81,0x0c,0x9a,0xc2,0xbd,0x20,0xc8,0xbd,0x01,0x7f,0x75,0x00,0x58,0x79,0x07,0x48,0x62,0xea,0x7f,0x5c,0xf3,0x7c,0x3e,0xe4,0x4f,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcd,0xff,0xff,0x04,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0xb7,0xfb,0xff,0xff,0x6c,0xea,0xff,0xff,0x57,0x10,0x00,0x00,0x08,0xed,0xff,0xff,0xbc,0xfb,0xff,0xff,0x8f,0xdd,0xff,0xff,0x99,0x2b,0x00,0x00,0xd7,0xfa,0xff,0xff,0x3e,0x23,0x00,0x00,0x8d,0xf4,0xff,0xff,0x33,0x09,0x00,0x00,0x8e,0xf8,0xff,0xff,0x44,0x26,0x00,0x00,0x46,0xf8,0xff,0xff,0xc8,0x1a,0x00,0x00,0x02,0xfa,0xff,0xff,0x48,0xee,0xff,0xff,0x30,0x00,0x00,0x00,0x25,0x2c,0x00,0x00,0x30,0x0f,0x00,0x00,0x44,0xfa,0xff,0xff,0x2c,0xe8,0xff,0xff,0x61,0x1f,0x00,0x00,0xe8,0x0a,0x00,0x00,0x03,0xef,0xff,0xff,0xf4,0x03,0x00,0x00,0xc2,0xf0,0xff,0xff,0x1b,0xfc,0xff,0xff,0xfa,0x31,0x00,0x00,0x0a,0xfc,0xff,0xff,0xdb,0x18,0x00,0x00,0xe2,0xd5,0xff,0xff,0x5b,0xf3,0xff,0xff,0x8f,0xfd,0xff,0xff,0x05,0x0f,0x00,0x00,0xc0,0x08,0x00,0x00,0x75,0xad,0xff,0xff,0xe3,0x06,0x00,0x00,0xbf,0xff,0xff,0xff,0xb7,0xe7,0xff,0xff,0x0a,0xfc,0xff,0xff,0x05,0x16,0x00,0x00,0x48,0xe6,0xff,0xff,0x77,0xfd,0xff,0xff,0xe4,0xe7,0xff,0xff,0x32,0x0e,0x00,0x00,0xa5,0xfd,0xff,0xff,0x7d,0x1a,0x00,0x00,0x62,0xe7,0xff,0xff,0x10,0xf9,0xff,0xff,0xbc,0xea,0xff,0xff,0x1c,0x17,0x00,0x00,0xdb,0xf4,0xff,0xff,0x7c,0xee,0xff,0xff,0x55,0x00,0x00,0x00,0x01,0x30,0x00,0x00,0xce,0xfe,0xff,0xff,0x18,0xb8,0xff,0xff,0xe3,0xeb,0xff,0xff,0xec,0x23,0x00,0x00,0x92,0xd4,0xff,0xff,0x58,0xed,0xff,0xff,0x1c,0xfd,0xff,0xff,0x4a,0xf5,0xff,0xff,0xfb,0x13,0x00,0x00,0xcc,0x14,0x00,0x00,0xd1,0xf9,0xff,0xff,0x80,0xff,0xff,0xff,0xbd,0x17,0x00,0x00,0x04,0xea,0xff,0xff,0x57,0xfa,0xff,0xff,0xf3,0xfc,0xff,0xff,0x92,0xff,0xff,0xff,0x31,0xf1,0xff,0xff,0x39,0x09,0x00,0x00,0xfe,0xea,0xff,0xff,0x33,0xec,0xff,0xff,0x11,0xef,0xff,0xff,0xf7,0x0d,0x00,0x00,0x8f,0xfe,0xff,0xff,0xc7,0xeb,0xff,0xff,0x86,0xed,0xff,0xff,0x7d,0x00,0x00,0x00,0x5e,0xe5,0xff,0xff,0xe1,0xfa,0xff,0xff,0xbd,0x4c,0x00,0x00,0x54,0xd9,0xff,0xff,0x0e,0xfa,0xff,0xff,0x94,0xfe,0xff,0xff,0x31,0xf7,0xff,0xff,0xe1,0xf7,0xff,0xff,0x8d,0xf0,0xff,0xff,0xb4,0x22,0x00,0x00,0x30,0xda,0xff,0xff,0x85,0xfc,0xff,0xff,0xa7,0xf3,0xff,0xff,0x9e,0xf6,0xff,0xff,0xf3,0xf8,0xff,0xff,0x66,0x02,0x00,0x00,0x3d,0xf7,0xff,0xff,0xc1,0x2b,0x00,0x00,0x99,0xf3,0xff,0xff,0x4a,0xea,0xff,0xff,0x6e,0xf5,0xff,0xff,0x35,0xfc,0xff,0xff,0xcd,0x08,0x00,0x00,0xfc,0xe7,0xff,0xff,0x8c,0x1c,0x00,0x00,0x78,0xd6,0xff,0xff,0x20,0x2b,0x00,0x00,0x4a,0xff,0xff,0xff,0x2f,0x26,0x00,0x00,0xbf,0x29,0x00,0x00,0xf7,0xee,0xff,0xff,0x13,0x23,0x00,0x00,0x30,0xf4,0xff,0xff,0x7b,0xf7,0xff,0xff,0xd1,0xfa,0xff,0xff,0xd6,0xf2,0xff,0xff,0x59,0xee,0xff,0xff,0x9e,0xe8,0xff,0xff,0xe8,0xf5,0xff,0xff,0x4e,0xf3,0xff,0xff,0x07,0xff,0xff,0xff,0x7c,0x2b,0x00,0x00,0xe3,0xf2,0xff,0xff,0x2c,0xfb,0xff,0xff,0xaf,0xfd,0xff,0xff,0x82,0xfb,0xff,0xff,0x0b,0x2e,0x00,0x00,0xd9,0xf9,0xff,0xff,0xda,0x1e,0x00,0x00,0x5c,0xf1,0xff,0xff,0x71,0xdb,0xff,0xff,0xf4,0xf7,0xff,0xff,0xbe,0x32,0x00,0x00,0x9c,0x0f,0x00,0x00,0xbb,0xfd,0xff,0xff,0xa1,0x11,0x00,0x00,0x6a,0x08,0x00,0x00,0xf1,0xf1,0xff,0xff,0x2d,0xf7,0xff,0xff,0x5e,0xf1,0xff,0xff,0xae,0xeb,0xff,0xff,0x15,0xf0,0xff,0xff,0x8c,0xf6,0xff,0xff,0x33,0x0e,0x00,0x00,0xaa,0x0d,0x00,0x00,0xce,0xf4,0xff,0xff,0x52,0xfc,0xff,0xff,0x3c,0xf8,0xff,0xff,0xde,0xed,0xff,0xff,0x00,0x00,0x00,0x00,0x76,0xcf,0xff,0xff,0x04,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x2b,0x02,0x00,0x00,0xb6,0xf8,0xff,0xff,0x0b,0x22,0x00,0x00,0x7d,0xea,0xff,0xff,0x10,0x0f,0x00,0x00,0x2a,0xfa,0xff,0xff,0x3d,0x04,0x00,0x00,0xb3,0x06,0x00,0x00,0xe5,0x00,0x00,0x00,0xd0,0x05,0x00,0x00,0xe4,0xf5,0xff,0xff,0xb7,0xf8,0xff,0xff,0x18,0x07,0x00,0x00,0x82,0xf1,0xff,0xff,0xdf,0xfc,0xff,0xff,0x21,0xfe,0xff,0xff,0xdf,0x01,0x00,0x00,0x4b,0x02,0x00,0x00,0x71,0x06,0x00,0x00,0xf0,0xeb,0xff,0xff,0x05,0x08,0x00,0x00,0x18,0x01,0x00,0x00,0x1b,0x01,0x00,0x00,0x6e,0x00,0x00,0x00,0x22,0xf2,0xff,0xff,0xc8,0x08,0x00,0x00,0xfb,0x00,0x00,0x00,0x2c,0xef,0xff,0xff,0x0d,0x03,0x00,0x00,0xd0,0x0b,0x00,0x00,0x3a,0xf5,0xff,0xff,0x64,0xf6,0xff,0xff,0xf7,0x04,0x00,0x00,0x99,0xf0,0xff,0xff,0x26,0x06,0x00,0x00,0x9d,0xfd,0xff,0xff,0x89,0x05,0x00,0x00,0x1b,0x12,0x00,0x00,0x30,0x95,0xff,0xff,0x22,0x06,0x00,0x00,0x90,0xff,0xff,0xff,0xe6,0x07,0x00,0x00,0x62,0xef,0xff,0xff,0x1a,0xfa,0xff,0xff,0x3f,0xf5,0xff,0xff,0xaf,0xf1,0xff,0xff,0xfe,0x14,0x00,0x00,0xab,0xfd,0xff,0xff,0xdd,0xee,0xff,0xff,0x6a,0xff,0xff,0xff,0x5c,0xee,0xff,0xff,0x2b,0xf1,0xff,0xff,0x3f,0xfd,0xff,0xff,0xf9,0x1b,0x00,0x00,0x39,0xf5,0xff,0xff,0xd2,0x05,0x00,0x00,0xa0,0x4f,0xff,0xff,0xed,0x09,0x00,0x00,0xbd,0x02,0x00,0x00,0x12,0xf6,0xff,0xff,0x0b,0xef,0xff,0xff,0xc7,0xef,0xff,0xff,0xef,0x02,0x00,0x00,0xb6,0xf4,0xff,0xff,0x3b,0x02,0x00,0x00,0x13,0x05,0x00,0x00,0x72,0x14,0x00,0x00,0xba,0x08,0x00,0x00,0x47,0x01,0x00,0x00,0xfd,0xf7,0xff,0xff,0xc3,0x02,0x00,0x00,0x78,0x0a,0x00,0x00,0x27,0xff,0xff,0xff,0x38,0xf3,0xff,0xff,0x47,0xfd,0xff,0xff,0xd5,0x12,0x00,0x00,0xcc,0xfa,0xff,0xff,0x12,0x06,0x00,0x00,0x5a,0x01,0x00,0x00,0x43,0xf3,0xff,0xff,0x8a,0xf7,0xff,0xff,0x5f,0xfc,0xff,0xff,0x98,0x0f,0x00,0x00,0xd8,0xfb,0xff,0xff,0xc8,0xf3,0xff,0xff,0xa0,0x11,0x00,0x00,0xfa,0xfe,0xff,0xff,0x6f,0xf7,0xff,0xff,0x67,0xe9,0xff,0xff,0x7c,0x02,0x00,0x00,0xdd,0xf3,0xff,0xff,0xf2,0x0c,0x00,0x00,0x83,0xfd,0xff,0xff,0x67,0x05,0x00,0x00,0x68,0xfa,0xff,0xff,0xde,0xf2,0xff,0xff,0x23,0x07,0x00,0x00,0xd4,0xe8,0xff,0xff,0xa1,0x1f,0x00,0x00,0x54,0x0a,0x00,0x00,0x17,0x00,0x00,0x00,0x31,0xf8,0xff,0xff,0x1f,0x0f,0x00,0x00,0xa7,0x0c,0x00,0x00,0x67,0x03,0x00,0x00,0x47,0x03,0x00,0x00,0x27,0x11,0x00,0x00,0xe6,0xfe,0xff,0xff,0x98,0x12,0x00,0x00,0x73,0x03,0x00,0x00,0x05,0x57,0xff,0xff,0x76,0x03,0x00,0x00,0xc4,0x03,0x00,0x00,0x1f,0xfb,0xff,0xff,0x92,0xff,0xff,0xff,0xae,0x07,0x00,0x00,0xb3,0x13,0x00,0x00,0x20,0x09,0x00,0x00,0x29,0xf0,0xff,0xff,0x68,0xf9,0xff,0xff,0x7a,0x13,0x00,0x00,0x09,0x2a,0x00,0x00,0x77,0xfa,0xff,0xff,0x73,0xff,0xff,0xff,0x27,0x06,0x00,0x00,0xba,0x0f,0x00,0x00,0x22,0x0a,0x00,0x00,0x24,0x09,0x00,0x00,0xbb,0x08,0x00,0x00,0x67,0xfe,0xff,0xff,0x27,0xf2,0xff,0xff,0xac,0xfb,0xff,0xff,0xc6,0x0d,0x00,0x00,0x1a,0xf6,0xff,0xff,0xb1,0x06,0x00,0x00,0x2b,0x04,0x00,0x00,0x37,0xf1,0xff,0xff,0x33,0x07,0x00,0x00,0xdd,0x1b,0x00,0x00,0x3e,0x0f,0x00,0x00,0x05,0x01,0x00,0x00,0xb5,0x05,0x00,0x00,0xbc,0xf7,0xff,0xff,0x06,0xf6,0xff,0xff,0xef,0x04,0x00,0x00,0x5e,0xfd,0xff,0xff,0x04,0xfc,0xff,0xff,0x48,0xf9,0xff,0xff,0xb1,0x15,0x00,0x00,0xe3,0x25,0x00,0x00,0x1e,0xee,0xff,0xff,0x4b,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0xd1,0xff,0xff,0x04,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x0a,0xfb,0xff,0xff,0x04,0x18,0x00,0x00,0x5c,0x05,0x00,0x00,0xb0,0xf9,0xff,0xff,0xda,0xfe,0xff,0xff,0xb9,0xd9,0xff,0xff,0x55,0x2b,0x00,0x00,0xe2,0x0e,0x00,0x00,0x63,0xf9,0xff,0xff,0x14,0xf6,0xff,0xff,0xda,0x05,0x00,0x00,0x86,0xf6,0xff,0xff,0x59,0xf2,0xff,0xff,0x0a,0xf8,0xff,0xff,0x1f,0xf6,0xff,0xff,0x41,0xee,0xff,0xff,0x0c,0xf6,0xff,0xff,0x7a,0xf0,0xff,0xff,0xd1,0xd1,0xff,0xff,0xee,0x11,0x00,0x00,0xd2,0x06,0x00,0x00,0x60,0xe0,0xff,0xff,0x13,0x28,0x00,0x00,0x49,0xf4,0xff,0xff,0x5b,0xf8,0xff,0xff,0xb6,0x0b,0x00,0x00,0x5f,0x19,0x00,0x00,0xba,0xf2,0xff,0xff,0xfa,0xfe,0xff,0xff,0x49,0x26,0x00,0x00,0xfe,0x08,0x00,0x00,0x70,0xda,0xff,0xff,0x3d,0x14,0x00,0x00,0x51,0xf8,0xff,0xff,0xb3,0x03,0x00,0x00,0x7e,0xf1,0xff,0xff,0xca,0xf9,0xff,0xff,0xad,0xfa,0xff,0xff,0xfa,0x29,0x00,0x00,0x9c,0xf0,0xff,0xff,0x50,0xe4,0xff,0xff,0x36,0x03,0x00,0x00,0x9c,0x2d,0x00,0x00,0x01,0x1c,0x00,0x00,0x05,0x0d,0x00,0x00,0xb8,0x0d,0x00,0x00,0x90,0x1e,0x00,0x00,0x8d,0x24,0x00,0x00,0xae,0xfd,0xff,0xff,0xc3,0x21,0x00,0x00,0xd8,0xfb,0xff,0xff,0xfc,0xf2,0xff,0xff,0xbe,0x08,0x00,0x00,0x2b,0xff,0xff,0xff,0xe4,0xfd,0xff,0xff,0xb6,0x26,0x00,0x00,0xda,0xf9,0xff,0xff,0x60,0xe6,0xff,0xff,0xc5,0xe9,0xff,0xff,0x58,0xf8,0xff,0xff,0x20,0xf0,0xff,0xff,0x33,0xfd,0xff,0xff,0x05,0x0d,0x00,0x00,0x4e,0xfe,0xff,0xff,0x35,0x17,0x00,0x00,0x7d,0xee,0xff,0xff,0xb2,0x06,0x00,0x00,0x91,0xf6,0xff,0xff,0x59,0x2e,0x00,0x00,0xec,0x13,0x00,0x00,0x8d,0xe0,0xff,0xff,0xff,0xf6,0xff,0xff,0xc7,0xff,0xff,0xff,0x75,0x1b,0x00,0x00,0xd4,0xfc,0xff,0xff,0x42,0x21,0x00,0x00,0xe9,0x00,0x00,0x00,0xda,0xfc,0xff,0xff,0x71,0x02,0x00,0x00,0xdc,0x05,0x00,0x00,0x0f,0xfc,0xff,0xff,0x9e,0xfe,0xff,0xff,0x97,0x11,0x00,0x00,0x33,0x02,0x00,0x00,0x61,0xe8,0xff,0xff,0x30,0xfd,0xff,0xff,0x47,0x00,0x00,0x00,0x8f,0xfa,0xff,0xff,0x8c,0x06,0x00,0x00,0xf4,0x01,0x00,0x00,0x8f,0xf7,0xff,0xff,0x41,0xf9,0xff,0xff,0xa9,0x13,0x00,0x00,0x02,0xfd,0xff,0xff,0x6d,0x3b,0x00,0x00,0x18,0x17,0x00,0x00,0x60,0xe4,0xff,0xff,0x39,0x17,0x00,0x00,0x6b,0xf8,0xff,0xff,0xe0,0xf8,0xff,0xff,0x74,0xf1,0xff,0xff,0x1e,0xfb,0xff,0xff,0xdf,0xff,0xff,0xff,0x52,0xf4,0xff,0xff,0xf2,0x1e,0x00,0x00,0x40,0xe6,0xff,0xff,0x7f,0x0b,0x00,0x00,0x87,0x1d,0x00,0x00,0x88,0xfc,0xff,0xff,0x55,0xfc,0xff,0xff,0x21,0xd2,0xff,0xff,0x27,0xff,0xff,0xff,0xb7,0xe8,0xff,0xff,0xc8,0x03,0x00,0x00,0x57,0xe3,0xff,0xff,0x9a,0xe0,0xff,0xff,0xb7,0x17,0x00,0x00,0xeb,0xdd,0xff,0xff,0x42,0x28,0x00,0x00,0xb2,0x00,0x00,0x00,0xb2,0x03,0x00,0x00,0x8a,0x18,0x00,0x00,0x60,0x0d,0x00,0x00,0x90,0xf9,0xff,0xff,0x15,0x13,0x00,0x00,0x89,0x2a,0x00,0x00,0x68,0x32,0x00,0x00,0xd9,0x05,0x00,0x00,0x95,0xfc,0xff,0xff,0xfd,0x2b,0x00,0x00,0x35,0x0d,0x00,0x00,0x01,0xfc,0xff,0xff,0xde,0x18,0x00,0x00,0x1b,0xff,0xff,0xff,0xc7,0xf8,0xff,0xff,0x88,0xf6,0xff,0xff,0xd5,0xfa,0xff,0xff,0x38,0xea,0xff,0xff,0x93,0x1d,0x00,0x00,0x0b,0xfc,0xff,0xff,0x17,0x13,0x00,0x00,0xa0,0x07,0x00,0x00,0x14,0xfc,0xff,0xff,0x2d,0xfa,0xff,0xff,0x77,0x07,0x00,0x00,0x56,0x2f,0x00,0x00,0x5c,0xf6,0xff,0xff,0x62,0xff,0xff,0xff,0xae,0xfd,0xff,0xff,0x45,0xf8,0xff,0xff,0xa3,0xff,0xff,0xff,0x82,0xfc,0xff,0xff,0x00,0x00,0x00,0x00,0x56,0xd4,0xff,0xff,0x04,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0xbd,0xff,0xff,0xff,0x87,0x22,0x00,0x00,0x2e,0xf7,0xff,0xff,0xce,0x22,0x00,0x00,0xa2,0x08,0x00,0x00,0x32,0xff,0xff,0xff,0x52,0x03,0x00,0x00,0x85,0x0c,0x00,0x00,0x75,0x00,0x00,0x00,0x4c,0x04,0x00,0x00,0x21,0x27,0x00,0x00,0x16,0xff,0xff,0xff,0xad,0x04,0x00,0x00,0x64,0x02,0x00,0x00,0x8d,0x03,0x00,0x00,0x02,0xff,0xff,0xff,0x13,0x04,0x00,0x00,0xd8,0x02,0x00,0x00,0x27,0x07,0x00,0x00,0x11,0x0c,0x00,0x00,0x39,0x06,0x00,0x00,0x6f,0x09,0x00,0x00,0x5e,0x0e,0x00,0x00,0x0c,0x0e,0x00,0x00,0x67,0x0a,0x00,0x00,0xaf,0x22,0x00,0x00,0xee,0xfd,0xff,0xff,0x87,0x0b,0x00,0x00,0x91,0x0d,0x00,0x00,0x06,0x0d,0x00,0x00,0x37,0xfb,0xff,0xff,0x45,0x03,0x00,0x00,0xd4,0xe6,0xff,0xff,0x93,0x0a,0x00,0x00,0xe2,0x19,0x00,0x00,0xee,0xfe,0xff,0xff,0x2d,0x0d,0x00,0x00,0xc3,0x13,0x00,0x00,0xe5,0x02,0x00,0x00,0xfe,0x02,0x00,0x00,0x4e,0xfb,0xff,0xff,0x4c,0x0b,0x00,0x00,0xaf,0x0b,0x00,0x00,0xd1,0xf4,0xff,0xff,0x9f,0x01,0x00,0x00,0xd1,0x05,0x00,0x00,0xd8,0x04,0x00,0x00,0x92,0x02,0x00,0x00,0x7f,0x08,0x00,0x00,0x53,0x05,0x00,0x00,0xdd,0x0e,0x00,0x00,0x85,0xf6,0xff,0xff,0xed,0x0a,0x00,0x00,0xcf,0x14,0x00,0x00,0x5c,0x2b,0x00,0x00,0x3c,0x0c,0x00,0x00,0x1e,0x06,0x00,0x00,0x30,0xfb,0xff,0xff,0xc1,0xf9,0xff,0xff,0x27,0x13,0x00,0x00,0x5d,0xf1,0xff,0xff,0xab,0x05,0x00,0x00,0xa4,0xfc,0xff,0xff,0x8e,0x05,0x00,0x00,0x2b,0x00,0x00,0x00,0xec,0x01,0x00,0x00,0xa8,0x0a,0x00,0x00,0x06,0x27,0x00,0x00,0x14,0x15,0x00,0x00,0xfe,0x0e,0x00,0x00,0x1e,0x0e,0x00,0x00,0x5a,0xfa,0xff,0xff,0x3b,0xe4,0xfe,0xff,0x8e,0x02,0x00,0x00,0x0e,0x0d,0x00,0x00,0xfb,0x28,0x00,0x00,0xb5,0x9f,0xff,0xff,0xe0,0xfd,0xff,0xff,0x24,0x19,0x00,0x00,0xca,0x0b,0x00,0x00,0x97,0x14,0x00,0x00,0x93,0x12,0x00,0x00,0x4b,0x0f,0x00,0x00,0x2f,0x17,0x00,0x00,0xa2,0xf5,0xff,0xff,0x35,0xee,0xff,0xff,0x15,0x0f,0x00,0x00,0x19,0x24,0x00,0x00,0x27,0x08,0x00,0x00,0x16,0x18,0x00,0x00,0xf5,0xfd,0xff,0xff,0x4d,0x07,0x00,0x00,0x3f,0x0d,0x00,0x00,0x60,0x03,0x00,0x00,0x7e,0xf8,0xff,0xff,0x34,0x0c,0x00,0x00,0x37,0x07,0x00,0x00,0x91,0x03,0x00,0x00,0xf0,0x22,0x00,0x00,0xe5,0xf5,0xff,0xff,0x84,0x00,0x00,0x00,0x37,0x12,0x00,0x00,0x71,0xf3,0xff,0xff,0x79,0x00,0x00,0x00,0x8c,0xfa,0xff,0xff,0xf7,0x08,0x00,0x00,0x66,0x02,0x00,0x00,0xa4,0xf6,0xff,0xff,0x3d,0x0a,0x00,0x00,0xa6,0xfc,0xff,0xff,0xb6,0xff,0xff,0xff,0x0a,0x36,0x00,0x00,0xc5,0xfd,0xff,0xff,0xf5,0x13,0x00,0x00,0x1a,0x09,0x00,0x00,0x31,0x07,0x00,0x00,0x5a,0x1f,0x00,0x00,0xba,0x00,0x00,0x00,0xe8,0x05,0x00,0x00,0xe8,0x27,0x00,0x00,0x5c,0x0f,0x00,0x00,0x36,0xf5,0xff,0xff,0xee,0xfa,0xff,0xff,0xcd,0x06,0x00,0x00,0x69,0x00,0x00,0x00,0xcb,0x1a,0x00,0x00,0xd2,0x07,0x00,0x00,0x9b,0x0d,0x00,0x00,0x34,0x18,0x00,0x00,0x8f,0x03,0x00,0x00,0x92,0x2b,0x00,0x00,0x3f,0x18,0x00,0x00,0xfe,0xfc,0xff,0xff,0x89,0xe9,0xff,0xff,0x64,0xed,0xff,0xff,0x8d,0x0e,0x00,0x00,0x24,0xf3,0xff,0xff,0x3e,0xfa,0xff,0xff,0xc5,0x0a,0x00,0x00,0x80,0x04,0x00,0x00,0x5d,0xee,0xff,0xff,0xdd,0x11,0x00,0x00,0x63,0x07,0x00,0x00,0xf8,0xf1,0xff,0xff,0xbf,0x18,0x00,0x00,0x09,0xfb,0xff,0xff,0xb6,0xeb,0xff,0xff,0x31,0xef,0xff,0xff,0xd7,0x08,0x00,0x00,0xf2,0xf9,0xff,0xff,0xdf,0x09,0x00,0x00,0x43,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xd6,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x19,0xfd,0xff,0xff,0xdf,0xfe,0xff,0xff,0xc7,0x00,0x00,0x00,0xa9,0xff,0xff,0xff,0x6d,0x24,0x00,0x00,0x24,0x10,0x00,0x00,0x90,0x09,0x00,0x00,0x37,0xff,0xff,0xff,0xfe,0x08,0x00,0x00,0xd8,0xff,0xff,0xff,0xc4,0xff,0xff,0xff,0x6c,0xfd,0xff,0xff,0xf5,0xf5,0xff,0xff,0xe1,0xf5,0xff,0xff,0x78,0x2c,0x00,0x00,0x91,0xfb,0xff,0xff,0x81,0xef,0xff,0xff,0x2f,0x1f,0x00,0x00,0x85,0xf6,0xff,0xff,0xf7,0x14,0x00,0x00,0xc8,0x02,0x00,0x00,0xa1,0xfd,0xff,0xff,0x25,0xf8,0xff,0xff,0x8c,0x35,0x01,0x00,0xfe,0xfc,0xff,0xff,0x73,0xfb,0xff,0xff,0xe6,0xfc,0xff,0xff,0x39,0x1d,0x00,0x00,0x89,0xfd,0xff,0xff,0x74,0x68,0x00,0x00,0x1e,0x00,0x00,0x00,0x4e,0x31,0x00,0x00,0x6f,0x02,0x00,0x00,0x7d,0x03,0x00,0x00,0xc6,0xc0,0x00,0x00,0xae,0x12,0x00,0x00,0x38,0xff,0xff,0xff,0x61,0xfe,0xff,0xff,0xd7,0x10,0x00,0x00,0xfd,0xf7,0xff,0xff,0x3a,0x3b,0x00,0x00,0xf3,0x03,0x00,0x00,0x0f,0x2e,0x00,0x00,0x9e,0x2b,0x00,0x00,0x5a,0xfc,0xff,0xff,0xeb,0xff,0xff,0xff,0x3c,0x04,0x00,0x00,0x9f,0x31,0x00,0x00,0x22,0x2b,0x00,0x00,0x58,0xfd,0xff,0xff,0xdd,0x07,0x00,0x00,0xe4,0xfe,0xff,0xff,0xee,0xea,0xff,0xff,0xb6,0x0b,0x00,0x00,0x83,0xf8,0xff,0xff,0xcc,0x24,0x00,0x00,0x85,0xff,0xff,0xff,0x79,0x05,0x00,0x00,0xa6,0x2b,0x00,0x00,0x34,0xff,0xff,0xff,0x3e,0x01,0x00,0x00,0x47,0x00,0x00,0x00,0xb6,0x60,0x00,0x00,0x1c,0x05,0x00,0x00,0xa7,0x7b,0x00,0x00,0xc7,0xfd,0xff,0xff,0x34,0x00,0x00,0x00,0x6f,0xf1,0xff,0xff,0x0b,0xff,0xff,0xff,0xd2,0x08,0x00,0x00,0xfd,0x0c,0x00,0x00,0xd6,0x05,0x00,0x00,0x94,0x01,0x00,0x00,0x2c,0x34,0x00,0x00,0x46,0xf7,0xff,0xff,0x68,0x00,0x00,0x00,0xe9,0xa1,0x00,0x00,0x12,0x0f,0x00,0x00,0x4e,0x0f,0x00,0x00,0xfb,0x08,0x00,0x00,0xad,0xff,0xff,0xff,0xce,0x18,0x00,0x00,0xf1,0x02,0x00,0x00,0x02,0xae,0xff,0xff,0x3e,0x02,0x00,0x00,0xef,0xff,0xff,0xff,0x76,0x0a,0x00,0x00,0x65,0xfa,0xff,0xff,0x38,0xfd,0xff,0xff,0x49,0xff,0xff,0xff,0x7c,0xf3,0xff,0xff,0x18,0x12,0x00,0x00,0x2d,0xff,0xff,0xff,0x13,0x18,0x00,0x00,0x79,0xc8,0xff,0xff,0x0d,0x4d,0x00,0x00,0xc3,0x00,0x00,0x00,0x6d,0xf6,0xff,0xff,0x04,0xff,0xff,0xff,0xed,0xff,0xff,0xff,0x11,0x00,0x00,0x00,0x02,0x05,0x00,0x00,0xf3,0x94,0x00,0x00,0xf3,0x0c,0x00,0x00,0x3d,0x59,0x00,0x00,0x63,0xfb,0xff,0xff,0x8b,0x3a,0x00,0x00,0x9b,0xf6,0xff,0xff,0xec,0x38,0x00,0x00,0x1e,0xff,0xff,0xff,0x74,0xff,0xff,0xff,0x5a,0x00,0x00,0x00,0x73,0x02,0x00,0x00,0xbb,0x09,0x00,0x00,0xdb,0xf2,0xff,0xff,0x17,0x4f,0x00,0x00,0x4a,0x25,0x00,0x00,0x51,0x41,0x00,0x00,0xa0,0xff,0xff,0xff,0x7d,0xfa,0xff,0xff,0x8a,0x29,0x00,0x00,0x3e,0xf8,0xff,0xff,0x6c,0x00,0x00,0x00,0x49,0xf9,0xff,0xff,0xc2,0xfe,0xff,0xff,0x4e,0xfb,0xff,0xff,0x31,0xff,0xff,0xff,0x94,0xf2,0xff,0xff,0x00,0x00,0x00,0x00,0xd6,0xd8,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x30,0xf8,0xff,0xff,0xe0,0x0b,0x00,0x00,0x62,0xf5,0xff,0xff,0x77,0xf7,0xff,0xff,0x79,0xfb,0xff,0xff,0xce,0xf5,0xff,0xff,0x3f,0xf7,0xff,0xff,0xa3,0xe7,0xff,0xff,0xf2,0x0e,0x00,0x00,0x93,0xfd,0xff,0xff,0xe6,0xf3,0xff,0xff,0x62,0x05,0x00,0x00,0x19,0x04,0x00,0x00,0xfa,0xfb,0xff,0xff,0x36,0xf4,0xff,0xff,0x80,0x01,0x00,0x00,0x34,0xfe,0xff,0xff,0x2b,0xfb,0xff,0xff,0x8d,0xfe,0xff,0xff,0x11,0xfb,0xff,0xff,0x83,0x12,0x00,0x00,0xfa,0x1c,0x00,0x00,0x33,0xf4,0xff,0xff,0x24,0x01,0x00,0x00,0x7c,0x18,0x00,0x00,0xc5,0x08,0x00,0x00,0x10,0x0d,0x00,0x00,0xa7,0xf6,0xff,0xff,0xd2,0x06,0x00,0x00,0x34,0x05,0x00,0x00,0x50,0xf6,0xff,0xff,0xea,0x00,0x00,0x00,0x01,0xf6,0xff,0xff,0x25,0x07,0x00,0x00,0xc8,0xfe,0xff,0xff,0xc2,0xfe,0xff,0xff,0x09,0xfd,0xff,0xff,0x52,0xff,0xff,0xff,0xd9,0xf3,0xff,0xff,0xe9,0x09,0x00,0x00,0xb8,0xf5,0xff,0xff,0x31,0xec,0xff,0xff,0x4b,0xf9,0xff,0xff,0x62,0xfa,0xff,0xff,0x2f,0x14,0x00,0x00,0xc1,0x90,0xff,0xff,0x96,0x0f,0x00,0x00,0x4b,0xfa,0xff,0xff,0x41,0xf9,0xff,0xff,0x6c,0x11,0x00,0x00,0x65,0xfa,0xff,0xff,0xe6,0x02,0x00,0x00,0xb7,0x0e,0x00,0x00,0x3e,0xf4,0xff,0xff,0xa6,0x17,0x00,0x00,0xe3,0xf8,0xff,0xff,0x70,0xec,0xff,0xff,0xb4,0xee,0xff,0xff,0x61,0xfc,0xff,0xff,0xe9,0x07,0x00,0x00,0x3d,0xfa,0xff,0xff,0x84,0xee,0xff,0xff,0xec,0x07,0x00,0x00,0x8d,0xf3,0xff,0xff,0x4d,0xfc,0xff,0xff,0xd3,0xf7,0xff,0xff,0x5d,0xf9,0xff,0xff,0xf2,0x00,0x00,0x00,0xb5,0xf2,0xff,0xff,0x49,0xfb,0xff,0xff,0x79,0xf8,0xff,0xff,0x07,0x11,0x00,0x00,0xca,0x0a,0x00,0x00,0x23,0xfc,0xff,0xff,0x7e,0xfa,0xff,0xff,0x25,0xf8,0xff,0xff,0xfe,0x09,0x00,0x00,0x1f,0x08,0x00,0x00,0xed,0xf5,0xff,0xff,0xf2,0x0c,0x00,0x00,0xd4,0xf3,0xff,0xff,0x83,0xfb,0xff,0xff,0xfc,0x06,0x00,0x00,0x27,0x13,0x00,0x00,0x73,0xf8,0xff,0xff,0xc6,0xfb,0xff,0xff,0x3d,0xf9,0xff,0xff,0x60,0xfc,0xff,0xff,0x1f,0x0e,0x00,0x00,0x17,0x0c,0x00,0x00,0x19,0x0b,0x00,0x00,0x37,0xfb,0xff,0xff,0x79,0xf3,0xff,0xff,0xe9,0xfd,0xff,0xff,0xc3,0x05,0x00,0x00,0x92,0xfe,0xff,0xff,0xd9,0xf9,0xff,0xff,0x43,0x18,0x00,0x00,0xfb,0x08,0x00,0x00,0x0c,0xf9,0xff,0xff,0x67,0x0f,0x00,0x00,0x5e,0x0f,0x00,0x00,0x8c,0x08,0x00,0x00,0x20,0xfa,0xff,0xff,0x35,0x13,0x00,0x00,0xac,0x02,0x00,0x00,0xcb,0xfb,0xff,0xff,0x6b,0xf8,0xff,0xff,0xc6,0x00,0x00,0x00,0x45,0xff,0xff,0xff,0xf9,0xee,0xff,0xff,0x94,0x11,0x00,0x00,0x15,0xfa,0xff,0xff,0xbf,0xfe,0xff,0xff,0xdc,0xfc,0xff,0xff,0x83,0x02,0x00,0x00,0x61,0xfb,0xff,0xff,0x69,0xfd,0xff,0xff,0x35,0x06,0x00,0x00,0x15,0x08,0x00,0x00,0xc3,0xf7,0xff,0xff,0x20,0xfa,0xff,0xff,0x4d,0x18,0x00,0x00,0xc1,0x11,0x00,0x00,0x8f,0xf8,0xff,0xff,0x7d,0xf9,0xff,0xff,0x24,0xfc,0xff,0xff,0x9e,0xfb,0xff,0xff,0x00,0x00,0x00,0x00,0xe6,0xda,0xff,0xff,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x7a,0x3b,0x00,0x00,0xcc,0xfe,0xff,0xff,0xda,0x7c,0x00,0x00,0x7a,0x26,0xff,0xff,0x00,0x00,0x00,0x00,0x06,0xdb,0xff,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x7c,0x10,0x00,0x00,0x52,0x3a,0x00,0x00,0xaf,0x26,0x00,0x00,0xa5,0xf9,0xff,0xff,0x33,0x04,0x00,0x00,0xe2,0xfe,0xff,0xff,0x85,0x02,0x00,0x00,0xaf,0x0a,0x00,0x00,0xc2,0x3f,0x00,0x00,0x97,0x22,0x00,0x00,0x84,0xff,0xff,0xff,0xbc,0x22,0x00,0x00,0xca,0x6c,0x00,0x00,0x68,0x07,0x00,0x00,0x40,0xf4,0xff,0xff,0x07,0x00,0x00,0x00,0xe4,0x0f,0x00,0x00,0xfc,0x27,0x00,0x00,0x9f,0x05,0x00,0x00,0x0c,0x4a,0x00,0x00,0x57,0x00,0x00,0x00,0xdf,0x11,0x00,0x00,0xd3,0x07,0x00,0x00,0xec,0x18,0x00,0x00,0x9c,0x08,0x00,0x00,0x79,0x10,0x00,0x00,0xa8,0x03,0x00,0x00,0x44,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0xdb,0xff,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x8f,0x06,0x00,0x00,0x35,0x1a,0x00,0x00,0x6d,0x12,0x00,0x00,0x6f,0xfe,0xff,0xff,0xdf,0x1c,0x00,0x00,0xef,0xf8,0xff,0xff,0x31,0x12,0x00,0x00,0xc9,0x0e,0x00,0x00,0xce,0x0e,0x00,0x00,0xdf,0x0a,0x00,0x00,0x22,0x07,0x00,0x00,0x65,0x02,0x00,0x00,0xdd,0x16,0x00,0x00,0x76,0x28,0x00,0x00,0x5d,0x0d,0x00,0x00,0x93,0x15,0x00,0x00,0x80,0xfc,0xff,0xff,0x5c,0x0a,0x00,0x00,0x69,0x05,0x00,0x00,0x60,0x15,0x00,0x00,0xd9,0xff,0xff,0xff,0xc7,0x09,0x00,0x00,0xb9,0x0c,0x00,0x00,0x52,0x29,0x00,0x00,0x28,0x08,0x00,0x00,0x7a,0x30,0x00,0x00,0x2b,0xfd,0xff,0xff,0xf3,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xdc,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xda,0xf8,0xff,0xff,0x06,0x19,0x00,0x00,0x4f,0xe8,0xff,0xff,0x05,0xdd,0xff,0xff,0xf0,0xdb,0xff,0xff,0xe6,0x14,0x00,0x00,0x95,0x22,0x00,0x00,0xa6,0xf5,0xff,0xff,0xf7,0xeb,0xff,0xff,0x82,0xe8,0xff,0xff,0xfe,0xfd,0xff,0xff,0xe4,0xf7,0xff,0xff,0x49,0x03,0x00,0x00,0xa0,0xfb,0xff,0xff,0x4b,0xf6,0xff,0xff,0xc5,0xfb,0xff,0xff,0xef,0x1e,0x00,0x00,0x12,0xd0,0xff,0xff,0xde,0xfb,0xff,0xff,0x35,0x21,0x00,0x00,0xa3,0x13,0x00,0x00,0xe7,0xf1,0xff,0xff,0xfe,0xf7,0xff,0xff,0x53,0xce,0xff,0xff,0x8b,0x00,0x00,0x00,0xd8,0xd1,0xff,0xff,0xd8,0xcc,0xff,0xff,0x80,0xff,0xff,0xff,0xcb,0x1e,0x00,0x00,0xb6,0xfa,0xff,0xff,0xbb,0xfa,0xff,0xff,0xa9,0xf4,0xff,0xff,0xc1,0x20,0x00,0x00,0x71,0x01,0x00,0x00,0x66,0xd7,0xff,0xff,0xe4,0xfa,0xff,0xff,0x26,0xf9,0xff,0xff,0xec,0xc3,0xff,0xff,0x3b,0xe3,0xff,0xff,0xc6,0xd5,0xff,0xff,0x5d,0xfa,0xff,0xff,0xf4,0xc2,0xff,0xff,0x88,0xee,0xff,0xff,0x2e,0x06,0x00,0x00,0x52,0xf8,0xff,0xff,0x43,0x24,0x00,0x00,0x77,0xea,0xff,0xff,0x60,0x20,0x00,0x00,0xea,0xf5,0xff,0xff,0x7e,0xf8,0xff,0xff,0xfe,0xf3,0xff,0xff,0x27,0xe5,0xff,0xff,0xd6,0xfd,0xff,0xff,0x24,0xcb,0xff,0xff,0x13,0xf5,0xff,0xff,0x97,0xd5,0xff,0xff,0x39,0x03,0x00,0x00,0x1a,0x16,0x00,0x00,0x39,0xd6,0xff,0xff,0x42,0xea,0xff,0xff,0xd2,0x1e,0x00,0x00,0x98,0xd5,0xff,0xff,0x1b,0xf3,0xff,0xff,0xaa,0xf6,0xff,0xff,0x92,0x19,0x00,0x00,0xf8,0x0d,0x00,0x00,0x8c,0xfb,0xff,0xff,0x28,0xce,0xff,0xff,0x7d,0xf0,0xff,0xff,0x4e,0xf8,0xff,0xff,0x5f,0xcb,0xff,0xff,0x49,0x31,0x00,0x00,0x29,0xf9,0xff,0xff,0x59,0xeb,0xff,0xff,0x14,0x05,0x00,0x00,0x9b,0xd8,0xff,0xff,0xda,0xee,0xff,0xff,0x51,0xe3,0xff,0xff,0xba,0xf7,0xff,0xff,0x28,0xcf,0xff,0xff,0xbf,0xff,0xff,0xff,0x16,0xff,0xff,0xff,0xc2,0x0e,0x00,0x00,0x34,0xcb,0xff,0xff,0x07,0xff,0xff,0xff,0xa2,0xff,0xff,0xff,0xae,0xfa,0xff,0xff,0x23,0x07,0x00,0x00,0x25,0xfd,0xff,0xff,0x6c,0x12,0x00,0x00,0x52,0x1f,0x00,0x00,0x6c,0xf9,0xff,0xff,0x32,0xf9,0xff,0xff,0x04,0x14,0x00,0x00,0x03,0x30,0x00,0x00,0x57,0xfd,0xff,0xff,0x6f,0x27,0x00,0x00,0x38,0x14,0x00,0x00,0x0e,0x03,0x00,0x00,0x71,0xe7,0xff,0xff,0xdf,0x02,0x00,0x00,0xea,0x09,0x00,0x00,0x9b,0xbd,0xff,0xff,0xdf,0x2e,0x00,0x00,0xb9,0xf3,0xff,0xff,0xe4,0xdf,0xff,0xff,0x97,0xfd,0xff,0xff,0x97,0xca,0xff,0xff,0x16,0x27,0x00,0x00,0x8b,0x04,0x00,0x00,0x21,0x1f,0x00,0x00,0x64,0xb5,0xff,0xff,0x2f,0x11,0x00,0x00,0x0d,0xe9,0xff,0xff,0x5a,0xfb,0xff,0xff,0x22,0xf4,0xff,0xff,0x1a,0xfc,0xff,0xff,0xe1,0xf4,0xff,0xff,0xb5,0xf5,0xff,0xff,0xa9,0xd1,0xff,0xff,0xab,0xfc,0xff,0xff,0x4b,0xfb,0xff,0xff,0xd5,0xc5,0xff,0xff,0x7e,0xc0,0xff,0xff,0xc6,0xc7,0xff,0xff,0x8a,0xbe,0xff,0xff,0x26,0x02,0x00,0x00,0xe4,0xe2,0xff,0xff,0x00,0x00,0x00,0x00,0x16,0xde,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x61,0x18,0x00,0x00,0x7c,0x18,0x00,0x00,0xab,0xf8,0xff,0xff,0x24,0x00,0x00,0x00,0xcc,0xdf,0xff,0xff,0xf6,0xfa,0xff,0xff,0x69,0xf2,0xff,0xff,0xa5,0x07,0x00,0x00,0x37,0xeb,0xff,0xff,0x65,0xfa,0xff,0xff,0xc8,0xf7,0xff,0xff,0x8e,0x08,0x00,0x00,0xd8,0x01,0x00,0x00,0xf3,0xf2,0xff,0xff,0x84,0xff,0xff,0xff,0x56,0x01,0x00,0x00,0xf7,0xf1,0xff,0xff,0x50,0xf9,0xff,0xff,0xc9,0xe8,0xff,0xff,0x68,0x21,0x00,0x00,0x60,0xfc,0xff,0xff,0x5d,0x14,0x00,0x00,0x2c,0xf6,0xff,0xff,0x7d,0xf9,0xff,0xff,0x25,0x14,0x00,0x00,0x86,0x02,0x00,0x00,0xc0,0x01,0x00,0x00,0x44,0xf2,0xff,0xff,0xfb,0xf2,0xff,0xff,0xf6,0xfa,0xff,0xff,0x6e,0xeb,0xff,0xff,0x0e,0xee,0xff,0xff,0x37,0x0a,0x00,0x00,0xe8,0x06,0x00,0x00,0xb0,0x0e,0x00,0x00,0x1c,0xfb,0xff,0xff,0x7a,0x03,0x00,0x00,0x79,0xf2,0xff,0xff,0x34,0xf2,0xff,0xff,0x67,0xed,0xff,0xff,0x52,0x08,0x00,0x00,0xe8,0xfc,0xff,0xff,0x7e,0xe6,0xff,0xff,0xc9,0xfd,0xff,0xff,0x5c,0xf4,0xff,0xff,0xb5,0x03,0x00,0x00,0xca,0xf5,0xff,0xff,0x85,0x0b,0x00,0x00,0x64,0x13,0x00,0x00,0x2b,0xfa,0xff,0xff,0xa1,0x07,0x00,0x00,0xe8,0xfd,0xff,0xff,0x5f,0xfd,0xff,0xff,0x56,0x01,0x00,0x00,0x91,0x17,0x00,0x00,0xe3,0x01,0x00,0x00,0xc2,0xf0,0xff,0xff,0x3e,0xf6,0xff,0xff,0x2e,0x10,0x00,0x00,0x7b,0xf2,0xff,0xff,0x1f,0xf0,0xff,0xff,0x96,0xef,0xff,0xff,0x48,0xf9,0xff,0xff,0x66,0xec,0xff,0xff,0xde,0x05,0x00,0x00,0x16,0xfc,0xff,0xff,0x9d,0x0b,0x00,0x00,0x52,0x13,0x00,0x00,0xf5,0xee,0xff,0xff,0xcb,0xe8,0xff,0xff,0x8c,0xf2,0xff,0xff,0x92,0x08,0x00,0x00,0x47,0xf1,0xff,0xff,0x63,0x22,0x00,0x00,0xcb,0xfe,0xff,0xff,0xe7,0xee,0xff,0xff,0x95,0xf6,0xff,0xff,0x30,0xf5,0xff,0xff,0x9a,0xf3,0xff,0xff,0xc4,0xf3,0xff,0xff,0x9d,0x00,0x00,0x00,0x2b,0xee,0xff,0xff,0xd8,0xf2,0xff,0xff,0xca,0x15,0x00,0x00,0xc5,0xf7,0xff,0xff,0x9d,0x02,0x00,0x00,0xca,0x09,0x00,0x00,0xe5,0x0c,0x00,0x00,0x5b,0xef,0xff,0xff,0x27,0xf1,0xff,0xff,0x69,0x13,0x00,0x00,0x5e,0xfc,0xff,0xff,0x96,0xff,0xff,0xff,0x6c,0x00,0x00,0x00,0x66,0xfb,0xff,0xff,0xcf,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0xdf,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xb2,0x09,0x00,0x00,0x28,0x1f,0x00,0x00,0x6a,0x09,0x00,0x00,0x90,0x02,0x00,0x00,0x1f,0xf5,0xff,0xff,0x0f,0x0f,0x00,0x00,0x65,0x0b,0x00,0x00,0x4d,0x00,0x00,0x00,0x60,0xf0,0xff,0xff,0x26,0x0f,0x00,0x00,0x81,0x03,0x00,0x00,0x20,0x00,0x00,0x00,0x07,0x01,0x00,0x00,0x5a,0x0c,0x00,0x00,0x9c,0x07,0x00,0x00,0xbd,0xff,0xff,0xff,0x23,0x08,0x00,0x00,0x2b,0x03,0x00,0x00,0xa2,0x02,0x00,0x00,0xdf,0x1d,0x00,0x00,0x40,0x04,0x00,0x00,0x44,0x02,0x00,0x00,0xca,0x00,0x00,0x00,0x3b,0x07,0x00,0x00,0xce,0x00,0x00,0x00,0x32,0x13,0x00,0x00,0xb5,0x02,0x00,0x00,0x01,0x07,0x00,0x00,0x1a,0x0c,0x00,0x00,0x1d,0x04,0x00,0x00,0xbe,0xff,0xff,0xff,0x99,0xfd,0xff,0xff,0xf0,0xfe,0xff,0xff,0x90,0xfd,0xff,0xff,0x72,0x01,0x00,0x00,0xff,0x07,0x00,0x00,0x28,0x02,0x00,0x00,0x3f,0x0a,0x00,0x00,0x1e,0x05,0x00,0x00,0x03,0x15,0x00,0x00,0xed,0xfe,0xff,0xff,0xf9,0x08,0x00,0x00,0x54,0xf9,0xff,0xff,0xa3,0x06,0x00,0x00,0xe9,0x06,0x00,0x00,0x4d,0x00,0x00,0x00,0xd3,0x08,0x00,0x00,0xcc,0xfb,0xff,0xff,0x28,0x06,0x00,0x00,0x04,0x03,0x00,0x00,0xe4,0xff,0xff,0xff,0x75,0x04,0x00,0x00,0x48,0x15,0x00,0x00,0x98,0x01,0x00,0x00,0xe1,0x0d,0x00,0x00,0xa1,0x03,0x00,0x00,0x9b,0x08,0x00,0x00,0x3e,0x0b,0x00,0x00,0xd7,0x04,0x00,0x00,0xe7,0x08,0x00,0x00,0x1b,0x0b,0x00,0x00,0x0f,0xfd,0xff,0xff,0x44,0x07,0x00,0x00,0x2e,0xfc,0xff,0xff,0x2b,0xfe,0xff,0xff,0x39,0x0d,0x00,0x00,0xed,0x00,0x00,0x00,0xbb,0x06,0x00,0x00,0x7e,0x14,0x00,0x00,0x3a,0xf6,0xff,0xff,0xb5,0x09,0x00,0x00,0x2d,0x01,0x00,0x00,0x74,0x0b,0x00,0x00,0x2e,0x17,0x00,0x00,0x16,0x03,0x00,0x00,0x92,0x02,0x00,0x00,0xa5,0x06,0x00,0x00,0xc6,0xfb,0xff,0xff,0x91,0xfc,0xff,0xff,0x9a,0x05,0x00,0x00,0xc4,0x01,0x00,0x00,0x3e,0x12,0x00,0x00,0x95,0x09,0x00,0x00,0xc9,0x15,0x00,0x00,0xbf,0xff,0xff,0xff,0x86,0x03,0x00,0x00,0xbb,0xfe,0xff,0xff,0x0d,0x01,0x00,0x00,0xc7,0x11,0x00,0x00,0xd2,0x05,0x00,0x00,0xa7,0xfe,0xff,0xff,0xd4,0x01,0x00,0x00,0x03,0x04,0x00,0x00,0x0d,0x04,0x00,0x00,0x70,0x01,0x00,0x00,0xa4,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0xe1,0xff,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0x17,0x1b,0x00,0x00,0x4b,0x03,0x00,0x00,0x9f,0x00,0x00,0x00,0x45,0xff,0xff,0xff,0xae,0x04,0x00,0x00,0x76,0x1f,0x00,0x00,0xcd,0x4d,0x00,0x00,0x36,0x00,0x00,0x00,0x70,0x3f,0x00,0x00,0x05,0x53,0x00,0x00,0x83,0x07,0x00,0x00,0x52,0x09,0x00,0x00,0x06,0x2b,0x00,0x00,0x46,0x2e,0x00,0x00,0xfb,0x3e,0x00,0x00,0x64,0x00,0x00,0x00,0xb9,0x5a,0x00,0x00,0x55,0x1f,0x00,0x00,0x24,0x00,0x00,0x00,0x14,0x01,0x00,0x00,0x28,0x07,0x00,0x00,0xc9,0x12,0x00,0x00,0x9b,0x00,0x00,0x00,0x1c,0xb4,0xff,0xff,0x55,0xfa,0xff,0xff,0x86,0xfd,0xff,0xff,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0xe1,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xa7,0x08,0x00,0x00,0xf0,0xfc,0xff,0xff,0x3f,0xff,0xff,0xff,0x12,0xfb,0xff,0xff,0xbd,0x05,0x00,0x00,0x09,0xf9,0xff,0xff,0x54,0x07,0x00,0x00,0x55,0x06,0x00,0x00,0x04,0x05,0x00,0x00,0x24,0xfe,0xff,0xff,0x46,0xfe,0xff,0xff,0x1a,0xfc,0xff,0xff,0x48,0xf4,0xff,0xff,0xba,0xf7,0xff,0xff,0x82,0x00,0x00,0x00,0xeb,0xf5,0xff,0xff,0xcc,0xfa,0xff,0xff,0xc8,0xfc,0xff,0xff,0x61,0xff,0xff,0xff,0x5a,0xf5,0xff,0xff,0xe4,0x0c,0x00,0x00,0x22,0x08,0x00,0x00,0x74,0x02,0x00,0x00,0xc1,0xfb,0xff,0xff,0x55,0x08,0x00,0x00,0x31,0x0c,0x00,0x00,0x23,0x11,0x00,0x00,0xd3,0x00,0x00,0x00,0x6a,0x02,0x00,0x00,0x7e,0xf5,0xff,0xff,0xaf,0x05,0x00,0x00,0x61,0xfa,0xff,0xff,0x5f,0xfd,0xff,0xff,0xdb,0x06,0x00,0x00,0x4b,0xfd,0xff,0xff,0xc2,0xfc,0xff,0xff,0x78,0x08,0x00,0x00,0x2f,0x09,0x00,0x00,0x67,0xfe,0xff,0xff,0x63,0xff,0xff,0xff,0xc0,0xfd,0xff,0xff,0xd0,0xf8,0xff,0xff,0x65,0xf6,0xff,0xff,0xea,0x03,0x00,0x00,0xdd,0xf9,0xff,0xff,0x22,0xf9,0xff,0xff,0x03,0x0b,0x00,0x00,0x2d,0x03,0x00,0x00,0x80,0xf8,0xff,0xff,0x5d,0xfa,0xff,0xff,0x6e,0xfe,0xff,0xff,0x0d,0xf7,0xff,0xff,0x4f,0xfd,0xff,0xff,0x81,0xff,0xff,0xff,0xb6,0x08,0x00,0x00,0xfb,0xf9,0xff,0xff,0x4a,0x02,0x00,0x00,0x36,0xfe,0xff,0xff,0xba,0xfd,0xff,0xff,0x2c,0xff,0xff,0xff,0xb5,0x00,0x00,0x00,0x7d,0x06,0x00,0x00,0x69,0x05,0x00,0x00,0x59,0xff,0xff,0xff,0x84,0x05,0x00,0x00,0xd0,0x07,0x00,0x00,0xc4,0xfb,0xff,0xff,0x81,0xfb,0xff,0xff,0x1b,0xfb,0xff,0xff,0xb6,0x02,0x00,0x00,0xc1,0x03,0x00,0x00,0x53,0x03,0x00,0x00,0xcd,0xfb,0xff,0xff,0x96,0x00,0x00,0x00,0x0e,0x05,0x00,0x00,0x43,0x02,0x00,0x00,0x7a,0x00,0x00,0x00,0x33,0x07,0x00,0x00,0xd7,0xf4,0xff,0xff,0x9c,0x01,0x00,0x00,0x01,0xf8,0xff,0xff,0x00,0x05,0x00,0x00,0x21,0x09,0x00,0x00,0x91,0x05,0x00,0x00,0xed,0xf5,0xff,0xff,0x09,0xfb,0xff,0xff,0x1f,0x05,0x00,0x00,0xda,0x00,0x00,0x00,0x25,0xfc,0xff,0xff,0xbc,0xf9,0xff,0xff,0x3d,0x07,0x00,0x00,0xcc,0xf7,0xff,0xff,0xbe,0xfe,0xff,0xff,0xde,0xf8,0xff,0xff,0x8e,0xfd,0xff,0xff,0x6c,0xf6,0xff,0xff,0x00,0x00,0x00,0x00,0x46,0xe3,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xec,0xfe,0xff,0xff,0xd2,0xff,0xff,0xff,0xfd,0x09,0x00,0x00,0x01,0x01,0x00,0x00,0x42,0x03,0x00,0x00,0xc4,0x01,0x00,0x00,0x86,0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x59,0x00,0x00,0x00,0xa9,0x02,0x00,0x00,0x8b,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x7c,0x02,0x00,0x00,0xd8,0x01,0x00,0x00,0x67,0x08,0x00,0x00,0xfe,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x65,0x02,0x00,0x00,0x85,0x01,0x00,0x00,0x8c,0x02,0x00,0x00,0xc4,0xff,0xff,0xff,0xa1,0x01,0x00,0x00,0x35,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x93,0xff,0xff,0xff,0x7c,0x01,0x00,0x00,0xce,0x01,0x00,0x00,0x56,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x08,0x03,0x00,0x00,0x0e,0x00,0x00,0x00,0x78,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x94,0xff,0xff,0xff,0x9c,0xff,0xff,0xff,0x4a,0x01,0x00,0x00,0x9a,0x05,0x00,0x00,0x33,0x01,0x00,0x00,0xb6,0x01,0x00,0x00,0xf6,0x02,0x00,0x00,0x32,0xff,0xff,0xff,0xe1,0x03,0x00,0x00,0xac,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xa5,0x01,0x00,0x00,0x4c,0x05,0x00,0x00,0x70,0x01,0x00,0x00,0x6d,0x03,0x00,0x00,0x53,0x01,0x00,0x00,0xcb,0x01,0x00,0x00,0xb3,0x02,0x00,0x00,0xbc,0x01,0x00,0x00,0x51,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xbc,0xff,0xff,0xff,0xf9,0x00,0x00,0x00,0x63,0x0d,0x00,0x00,0x47,0x03,0x00,0x00,0x0a,0x02,0x00,0x00,0xaf,0xff,0xff,0xff,0xd1,0x01,0x00,0x00,0xfd,0x02,0x00,0x00,0xbf,0x00,0x00,0x00,0x05,0xff,0xff,0xff,0x18,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x5e,0x01,0x00,0x00,0x57,0x05,0x00,0x00,0x5c,0x02,0x00,0x00,0x31,0xff,0xff,0xff,0x2f,0x03,0x00,0x00,0x3e,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x36,0x03,0x00,0x00,0xb2,0x02,0x00,0x00,0x66,0x01,0x00,0x00,0x65,0x01,0x00,0x00,0xc0,0x02,0x00,0x00,0xdf,0xff,0xff,0xff,0x1d,0x05,0x00,0x00,0xa0,0x01,0x00,0x00,0x1b,0x01,0x00,0x00,0xc8,0x02,0x00,0x00,0x5c,0x01,0x00,0x00,0x85,0xff,0xff,0xff,0x87,0x02,0x00,0x00,0xe1,0xff,0xff,0xff,0x2b,0x04,0x00,0x00,0x12,0xff,0xff,0xff,0x7a,0xfe,0xff,0xff,0x0c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0xe4,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x1f,0x05,0x00,0x00,0xd0,0xeb,0xff,0xff,0x16,0xfc,0xff,0xff,0xd4,0x09,0x00,0x00,0x59,0xfb,0xff,0xff,0xc9,0x17,0x00,0x00,0xcb,0xf8,0xff,0xff,0xd2,0xfc,0xff,0xff,0x17,0x05,0x00,0x00,0x9c,0x00,0x00,0x00,0x3e,0xff,0xff,0xff,0xd5,0x04,0x00,0x00,0xcb,0xfe,0xff,0xff,0x06,0x10,0x00,0x00,0x9f,0xee,0xff,0xff,0xc1,0xf7,0xff,0xff,0x3a,0xf4,0xff,0xff,0xdc,0xf9,0xff,0xff,0x3e,0xff,0xff,0xff,0x0f,0xf8,0xff,0xff,0x29,0xfe,0xff,0xff,0x0a,0x04,0x00,0x00,0x12,0x05,0x00,0x00,0xb3,0x01,0x00,0x00,0x59,0xee,0xff,0xff,0xe7,0xf0,0xff,0xff,0x91,0xfe,0xff,0xff,0x5c,0x08,0x00,0x00,0x32,0xee,0xff,0xff,0xd4,0xf0,0xff,0xff,0x02,0xfb,0xff,0xff,0x37,0xf8,0xff,0xff,0x9f,0xf9,0xff,0xff,0x37,0x1a,0x00,0x00,0xc4,0xf9,0xff,0xff,0xc0,0xf4,0xff,0xff,0x13,0x08,0x00,0x00,0x41,0xfa,0xff,0xff,0xee,0xf8,0xff,0xff,0xad,0x01,0x00,0x00,0xdd,0xeb,0xff,0xff,0x4e,0x16,0x00,0x00,0x12,0xfa,0xff,0xff,0x11,0xef,0xff,0xff,0x74,0xf3,0xff,0xff,0xca,0xf2,0xff,0xff,0xf9,0xef,0xff,0xff,0x66,0x09,0x00,0x00,0x09,0x01,0x00,0x00,0x3c,0x05,0x00,0x00,0xcf,0xea,0xff,0xff,0x6f,0x02,0x00,0x00,0xa2,0xfc,0xff,0xff,0xc6,0xf3,0xff,0xff,0x29,0x07,0x00,0x00,0x33,0x13,0x00,0x00,0x4b,0x0f,0x00,0x00,0x6f,0xec,0xff,0xff,0xd8,0x18,0x00,0x00,0x9f,0xf9,0xff,0xff,0x71,0xf9,0xff,0xff,0xd3,0xed,0xff,0xff,0x6a,0xf0,0xff,0xff,0x73,0xf9,0xff,0xff,0x83,0x02,0x00,0x00,0x57,0xfe,0xff,0xff,0xb4,0xf1,0xff,0xff,0xdd,0xfc,0xff,0xff,0x94,0xeb,0xff,0xff,0x89,0xfb,0xff,0xff,0xbf,0x00,0x00,0x00,0x26,0x08,0x00,0x00,0x9f,0xef,0xff,0xff,0x01,0xf7,0xff,0xff,0xba,0xf9,0xff,0xff,0xd8,0x14,0x00,0x00,0x78,0xf9,0xff,0xff,0x4a,0xf6,0xff,0xff,0x66,0xfe,0xff,0xff,0xb7,0xfa,0xff,0xff,0x43,0x06,0x00,0x00,0x9e,0x08,0x00,0x00,0x61,0xef,0xff,0xff,0x2e,0xf2,0xff,0xff,0x43,0xec,0xff,0xff,0x00,0xf1,0xff,0xff,0xa6,0xfd,0xff,0xff,0xbf,0x0d,0x00,0x00,0x20,0x05,0x00,0x00,0xed,0xf3,0xff,0xff,0xa6,0xf8,0xff,0xff,0x0a,0xec,0xff,0xff,0x9e,0xfb,0xff,0xff,0xc1,0x16,0x00,0x00,0x95,0x00,0x00,0x00,0xcb,0xf9,0xff,0xff,0x00,0x00,0x00,0x00,0x66,0xe6,0xff,0xff,0x04,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x0e,0x06,0x00,0x00,0x41,0x0a,0x00,0x00,0x97,0xfd,0xff,0xff,0x3c,0x00,0x00,0x00,0xf6,0xff,0xff,0xff,0x66,0x00,0x00,0x00,0x53,0x06,0x00,0x00,0xed,0x05,0x00,0x00,0xae,0x00,0x00,0x00,0xaa,0x02,0x00,0x00,0x2c,0x02,0x00,0x00,0x64,0xfc,0xff,0xff,0x12,0x03,0x00,0x00,0xf2,0xfa,0xff,0xff,0xd6,0x06,0x00,0x00,0x32,0x02,0x00,0x00,0xd5,0x04,0x00,0x00,0x4f,0x01,0x00,0x00,0x9d,0x00,0x00,0x00,0xaa,0xff,0xff,0xff,0x7c,0x00,0x00,0x00,0xea,0x07,0x00,0x00,0x6e,0x07,0x00,0x00,0x81,0xff,0xff,0xff,0x6f,0x01,0x00,0x00,0x86,0x06,0x00,0x00,0x35,0x02,0x00,0x00,0xe3,0x01,0x00,0x00,0x64,0x07,0x00,0x00,0xa2,0x01,0x00,0x00,0x63,0x06,0x00,0x00,0x75,0x06,0x00,0x00,0xde,0x02,0x00,0x00,0x46,0x06,0x00,0x00,0x68,0x01,0x00,0x00,0x7a,0x04,0x00,0x00,0x27,0x03,0x00,0x00,0x8d,0x03,0x00,0x00,0xdf,0x04,0x00,0x00,0x06,0x02,0x00,0x00,0xf8,0x0b,0x00,0x00,0xc8,0x01,0x00,0x00,0x1e,0x09,0x00,0x00,0x0b,0x04,0x00,0x00,0x48,0x0d,0x00,0x00,0x2e,0x01,0x00,0x00,0x1a,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x55,0x09,0x00,0x00,0x37,0x09,0x00,0x00,0x83,0x0a,0x00,0x00,0x28,0x01,0x00,0x00,0x97,0x06,0x00,0x00,0xa9,0x04,0x00,0x00,0x02,0x06,0x00,0x00,0x30,0x08,0x00,0x00,0x94,0xff,0xff,0xff,0xa1,0x0b,0x00,0x00,0xd6,0xfb,0xff,0xff,0x20,0x09,0x00,0x00,0x54,0x03,0x00,0x00,0x32,0x0c,0x00,0x00,0xd4,0x01,0x00,0x00,0xb3,0xfd,0xff,0xff,0xdd,0xff,0xff,0xff,0x82,0xfe,0xff,0xff,0x2e,0x07,0x00,0x00,0xf9,0xff,0xff,0xff,0xbd,0xfd,0xff,0xff,0xcf,0x01,0x00,0x00,0x6b,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0xe8,0x04,0x00,0x00,0xd3,0x05,0x00,0x00,0xc8,0xfe,0xff,0xff,0x81,0x03,0x00,0x00,0x04,0x03,0x00,0x00,0xae,0x00,0x00,0x00,0xc4,0x04,0x00,0x00,0xec,0x02,0x00,0x00,0xda,0xff,0xff,0xff,0xe2,0x02,0x00,0x00,0x49,0x10,0x00,0x00,0xc1,0x06,0x00,0x00,0xa7,0x09,0x00,0x00,0x36,0x0d,0x00,0x00,0x0a,0x03,0x00,0x00,0xd2,0x01,0x00,0x00,0xc8,0x0a,0x00,0x00,0x3f,0x04,0x00,0x00,0x3f,0x02,0x00,0x00,0x52,0x0c,0x00,0x00,0x7c,0xff,0xff,0xff,0x46,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xee,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0xe7,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xac,0xf2,0xff,0xff,0xc0,0xfe,0xff,0xff,0x66,0x03,0x00,0x00,0x73,0x16,0x00,0x00,0xc9,0xfe,0xff,0xff,0x4e,0x37,0x00,0x00,0xa3,0x0f,0x00,0x00,0xea,0xfe,0xff,0xff,0x1b,0xff,0xff,0xff,0x27,0x08,0x00,0x00,0x4e,0xe8,0xff,0xff,0x2d,0x09,0x00,0x00,0x5b,0x12,0x00,0x00,0x4b,0xe4,0xff,0xff,0x0b,0x19,0x00,0x00,0x09,0x19,0x00,0x00,0x57,0xf1,0xff,0xff,0x91,0xdb,0xff,0xff,0x33,0xe7,0xff,0xff,0x78,0x21,0x00,0x00,0x2b,0xe3,0xff,0xff,0x27,0x0d,0x00,0x00,0x97,0x08,0x00,0x00,0x7b,0x46,0x00,0x00,0x30,0x15,0x00,0x00,0x7f,0xf9,0xff,0xff,0xcf,0xe6,0xff,0xff,0xd6,0x05,0x00,0x00,0x58,0xe7,0xff,0xff,0xc0,0xe4,0xff,0xff,0x89,0xe7,0xff,0xff,0x67,0x05,0x00,0x00,0x71,0xf9,0xff,0xff,0x8d,0x1e,0x00,0x00,0x0f,0xf7,0xff,0xff,0xd8,0xe7,0xff,0xff,0x79,0x0a,0x00,0x00,0x45,0x08,0x00,0x00,0x91,0xfc,0xff,0xff,0x60,0x10,0x00,0x00,0x57,0x13,0x00,0x00,0x43,0x1a,0x00,0x00,0x49,0xfe,0xff,0xff,0x29,0x0e,0x00,0x00,0x48,0x18,0x00,0x00,0xa9,0x0d,0x00,0x00,0xd9,0xf0,0xff,0xff,0xd4,0xe1,0xff,0xff,0xe5,0x0d,0x00,0x00,0xec,0xcf,0xff,0xff,0x87,0xfa,0xff,0xff,0x80,0xe9,0xff,0xff,0x4b,0xcb,0xff,0xff,0xc3,0x23,0x00,0x00,0x4c,0x2b,0x00,0x00,0x75,0xef,0xff,0xff,0x00,0x00,0x00,0x00,0xe6,0xe8,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x36,0x0f,0x00,0x00,0x36,0x09,0x00,0x00,0x69,0x0e,0x00,0x00,0xce,0xfb,0xff,0xff,0x01,0x02,0x00,0x00,0x1e,0x04,0x00,0x00,0x83,0xfc,0xff,0xff,0x92,0x08,0x00,0x00,0x6f,0x03,0x00,0x00,0x34,0xfd,0xff,0xff,0x76,0x3a,0x00,0x00,0x72,0xfb,0xff,0xff,0x3f,0xfb,0xff,0xff,0xed,0x3e,0x00,0x00,0x7c,0xf9,0xff,0xff,0x38,0xf8,0xff,0xff,0x5a,0x20,0x00,0x00,0xf7,0xfc,0xff,0xff,0xb3,0x09,0x00,0x00,0x40,0x01,0x00,0x00,0xb5,0x16,0x00,0x00,0x82,0xfb,0xff,0xff,0xbd,0x1b,0x00,0x00,0xff,0x34,0x00,0x00,0x96,0xfd,0xff,0xff,0xb6,0x1c,0x00,0x00,0xd9,0x36,0x00,0x00,0x4b,0x01,0x00,0x00,0x00,0xea,0xff,0xff,0x2a,0x0d,0x00,0x00,0xf3,0x0d,0x00,0x00,0xdf,0x00,0x00,0x00,0x1a,0x1f,0x00,0x00,0xf4,0xfe,0xff,0xff,0x3c,0xf5,0xff,0xff,0x9c,0x06,0x00,0x00,0x3a,0x01,0x00,0x00,0x54,0xfa,0xff,0xff,0x70,0x05,0x00,0x00,0xe9,0xfa,0xff,0xff,0x6a,0xf8,0xff,0xff,0x72,0xfe,0xff,0xff,0x84,0x0e,0x00,0x00,0xd1,0x01,0x00,0x00,0xa0,0xf9,0xff,0xff,0xe5,0x0b,0x00,0x00,0x3b,0xff,0xff,0xff,0xdb,0x19,0x00,0x00,0xc4,0x03,0x00,0x00,0xac,0x01,0x00,0x00,0x07,0x09,0x00,0x00,0x3e,0x09,0x00,0x00,0x85,0x5c,0x00,0x00,0xd7,0xfc,0xff,0xff,0x16,0xff,0xff,0xff,0xe8,0xfd,0xff,0xff,0x00,0x00,0x00,0x00,0xd6,0xe9,0xff,0xff,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x90,0x1e,0x00,0x00,0x11,0x06,0x00,0x00,0x0f,0x27,0x00,0x00,0xeb,0x19,0x00,0x00,0xf5,0x04,0x00,0x00,0x28,0x10,0x00,0x00,0xca,0x01,0x00,0x00,0x66,0x16,0x00,0x00,0x17,0xee,0xff,0xff,0x62,0x0d,0x00,0x00,0xcd,0xfd,0xff,0xff,0x8e,0x1d,0x00,0x00,0x19,0x09,0x00,0x00,0xef,0x00,0x00,0x00,0xec,0x1d,0x00,0x00,0xa5,0xfc,0xff,0xff,0xfa,0x11,0x00,0x00,0x17,0x03,0x00,0x00,0x3e,0x5f,0x00,0x00,0x10,0x12,0x00,0x00,0x9d,0x0e,0x00,0x00,0xf6,0x11,0x00,0x00,0x33,0x04,0x00,0x00,0xf0,0x06,0x00,0x00,0xe2,0x27,0x00,0x00,0xe1,0x0f,0x00,0x00,0xa4,0x47,0x00,0x00,0x7a,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0xea,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x87,0xea,0xff,0xff,0x0a,0x02,0x00,0x00,0x34,0x09,0x00,0x00,0x13,0xf1,0xff,0xff,0x3a,0xef,0xff,0xff,0xc8,0xef,0xff,0xff,0x15,0xff,0xff,0xff,0xa5,0x0c,0x00,0x00,0xea,0x00,0x00,0x00,0x15,0xe1,0xff,0xff,0x80,0x06,0x00,0x00,0x69,0xed,0xff,0xff,0x1c,0x03,0x00,0x00,0x56,0xe9,0xff,0xff,0x69,0x0c,0x00,0x00,0xd2,0xed,0xff,0xff,0x9f,0xf7,0xff,0xff,0xea,0x13,0x00,0x00,0x24,0xee,0xff,0xff,0x32,0x0b,0x00,0x00,0xe2,0x14,0x00,0x00,0xe4,0xec,0xff,0xff,0xea,0x10,0x00,0x00,0xb8,0x06,0x00,0x00,0x74,0x15,0x00,0x00,0x1e,0x0d,0x00,0x00,0x57,0xff,0xff,0xff,0x7f,0x09,0x00,0x00,0x14,0x0c,0x00,0x00,0x24,0x05,0x00,0x00,0xb1,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x8b,0x15,0x00,0x00,0x19,0xff,0xff,0xff,0x7e,0x0e,0x00,0x00,0xcf,0xfc,0xff,0xff,0x0d,0xf4,0xff,0xff,0xa4,0x00,0x00,0x00,0x6a,0x11,0x00,0x00,0xb3,0xe0,0xff,0xff,0xc7,0xe7,0xff,0xff,0xc5,0xf3,0xff,0xff,0x9f,0xfb,0xff,0xff,0x82,0xf7,0xff,0xff,0x4a,0x00,0x00,0x00,0x89,0xf3,0xff,0xff,0xb2,0xf8,0xff,0xff,0x41,0xf9,0xff,0xff,0xf1,0xe6,0xff,0xff,0x78,0xff,0xff,0xff,0x86,0xde,0xff,0xff,0xd3,0x1d,0x00,0x00,0xfa,0x0a,0x00,0x00,0x8a,0xdf,0xff,0xff,0xa5,0x12,0x00,0x00,0x67,0xef,0xff,0xff,0x00,0x00,0x00,0x00,0x46,0xeb,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xa3,0x02,0x00,0x00,0x77,0x02,0x00,0x00,0x4c,0x01,0x00,0x00,0xd3,0x01,0x00,0x00,0xb2,0xff,0xff,0xff,0xd4,0x05,0x00,0x00,0xc3,0xff,0xff,0xff,0x4f,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4a,0xfe,0xff,0xff,0x03,0x01,0x00,0x00,0x51,0xfb,0xff,0xff,0x40,0x03,0x00,0x00,0x5c,0xfe,0xff,0xff,0xa9,0xff,0xff,0xff,0x2a,0x07,0x00,0x00,0x87,0xfd,0xff,0xff,0x63,0xff,0xff,0xff,0xcc,0x00,0x00,0x00,0xf5,0x04,0x00,0x00,0x65,0xfb,0xff,0xff,0x85,0xfe,0xff,0xff,0x22,0x02,0x00,0x00,0x62,0x02,0x00,0x00,0x79,0xfd,0xff,0xff,0x71,0x04,0x00,0x00,0xde,0xff,0xff,0xff,0x2b,0x05,0x00,0x00,0xb3,0x02,0x00,0x00,0x3d,0x0a,0x00,0x00,0x11,0x01,0x00,0x00,0xc8,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x28,0x05,0x00,0x00,0xe9,0xfe,0xff,0xff,0x64,0x01,0x00,0x00,0x1c,0xff,0xff,0xff,0x29,0x00,0x00,0x00,0xf5,0xff,0xff,0xff,0xc1,0x03,0x00,0x00,0xf7,0x03,0x00,0x00,0x92,0x00,0x00,0x00,0x66,0x02,0x00,0x00,0x3a,0x02,0x00,0x00,0x2b,0x01,0x00,0x00,0xd3,0x00,0x00,0x00,0xf7,0x05,0x00,0x00,0xbd,0x01,0x00,0x00,0x84,0x03,0x00,0x00,0xee,0xff,0xff,0xff,0xd6,0x08,0x00,0x00,0x79,0x01,0x00,0x00,0x0c,0x00,0x00,0x00,0xa6,0x01,0x00,0x00,0x1d,0xfc,0xff,0xff,0xeb,0xfe,0xff,0xff,0x00,0x00,0x00,0x00,0x36,0xec,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x23,0x12,0x00,0x00,0x3f,0xd2,0xff,0xff,0x1d,0xec,0xff,0xff,0x7b,0x1f,0x00,0x00,0x24,0x0a,0x00,0x00,0x32,0xfd,0xff,0xff,0x67,0x09,0x00,0x00,0xe8,0x0f,0x00,0x00,0x8c,0xf3,0xff,0xff,0x5b,0x1d,0x00,0x00,0xaa,0xe4,0xff,0xff,0x2c,0x20,0x00,0x00,0x14,0xe5,0xff,0xff,0xc7,0x07,0x00,0x00,0x7a,0xf5,0xff,0xff,0x93,0x03,0x00,0x00,0xdd,0x15,0x00,0x00,0x09,0xe4,0xff,0xff,0xca,0xfe,0xff,0xff,0xc5,0xff,0xff,0xff,0xd8,0x0d,0x00,0x00,0x77,0x10,0x00,0x00,0x26,0x0f,0x00,0x00,0xbf,0x06,0x00,0x00,0xb6,0xe2,0xff,0xff,0xb7,0x17,0x00,0x00,0x89,0x13,0x00,0x00,0x68,0x19,0x00,0x00,0x59,0x17,0x00,0x00,0x6c,0x10,0x00,0x00,0xba,0x28,0x00,0x00,0xfa,0xf8,0xff,0xff,0x43,0x11,0x00,0x00,0xe6,0x07,0x00,0x00,0xa3,0x0f,0x00,0x00,0x7d,0xfa,0xff,0xff,0x7c,0x03,0x00,0x00,0xa8,0xfd,0xff,0xff,0x81,0xef,0xff,0xff,0x8d,0xb9,0xff,0xff,0xbe,0xdc,0xff,0xff,0x2e,0x01,0x00,0x00,0x47,0x05,0x00,0x00,0x9b,0xd3,0xff,0xff,0xd7,0x19,0x00,0x00,0x6f,0x03,0x00,0x00,0xe3,0xf5,0xff,0xff,0xcc,0x23,0x00,0x00,0x0d,0x13,0x00,0x00,0x39,0xe3,0xff,0xff,0x42,0xe1,0xff,0xff,0x77,0x08,0x00,0x00,0x19,0x12,0x00,0x00,0x9f,0x18,0x00,0x00,0x4b,0xe6,0xff,0xff,0xfa,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0xed,0xff,0xff,0x04,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x70,0x0d,0x00,0x00,0xd0,0xff,0xff,0xff,0xed,0xff,0xff,0xff,0x6a,0xff,0xff,0xff,0x2a,0xfa,0xff,0xff,0xac,0x05,0x00,0x00,0x9a,0xfd,0xff,0xff,0x3b,0xfa,0xff,0xff,0xfb,0xed,0xff,0xff,0xfa,0x01,0x00,0x00,0xef,0x00,0x00,0x00,0x0d,0x02,0x00,0x00,0x64,0xff,0xff,0xff,0x74,0x01,0x00,0x00,0xf5,0xfc,0xff,0xff,0x5c,0x08,0x00,0x00,0x39,0x08,0x00,0x00,0xcb,0x02,0x00,0x00,0xe3,0x05,0x00,0x00,0xbb,0x01,0x00,0x00,0x4c,0x05,0x00,0x00,0x25,0x00,0x00,0x00,0x68,0xff,0xff,0xff,0x94,0x05,0x00,0x00,0xbd,0xe8,0xff,0xff,0xea,0xfc,0xff,0xff,0x50,0x04,0x00,0x00,0x1a,0x02,0x00,0x00,0xdf,0x01,0x00,0x00,0x4e,0x17,0x00,0x00,0x50,0x00,0x00,0x00,0x13,0xfe,0xff,0xff,0xa0,0x02,0x00,0x00,0xec,0xf9,0xff,0xff,0x8a,0x01,0x00,0x00,0x89,0xf7,0xff,0xff,0xa5,0x09,0x00,0x00,0x17,0x12,0x00,0x00,0x67,0xfb,0xff,0xff,0x6b,0x03,0x00,0x00,0xda,0x00,0x00,0x00,0x9f,0x06,0x00,0x00,0x94,0x0b,0x00,0x00,0x27,0x00,0x00,0x00,0x45,0x02,0x00,0x00,0xd8,0xfe,0xff,0xff,0x93,0x0f,0x00,0x00,0x8b,0x02,0x00,0x00,0x1f,0x04,0x00,0x00,0x05,0x03,0x00,0x00,0x67,0x00,0x00,0x00,0x56,0x05,0x00,0x00,0xde,0x00,0x00,0x00,0xc2,0x0d,0x00,0x00,0x9f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xee,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x6f,0xb9,0xff,0xff,0x19,0xf4,0xff,0xff,0x71,0xa7,0xff,0xff,0x11,0xb7,0xff,0xff,0xd9,0x35,0x00,0x00,0x07,0x03,0x00,0x00,0x8d,0x1a,0x00,0x00,0x90,0xf7,0xff,0xff,0x92,0x0a,0x00,0x00,0xa1,0xea,0xff,0xff,0x32,0x3a,0x00,0x00,0x96,0xef,0xff,0xff,0xf7,0xc9,0xff,0xff,0x2b,0xcd,0xff,0xff,0xac,0x0d,0x00,0x00,0xf8,0x32,0x00,0x00,0x5a,0xf6,0xff,0xff,0x6d,0xe3,0xff,0xff,0x18,0x0e,0x00,0x00,0x95,0xe0,0xff,0xff,0x5b,0x46,0x00,0x00,0x3d,0xf0,0xff,0xff,0x31,0x04,0x00,0x00,0xd4,0x24,0x00,0x00,0xc2,0xd0,0xff,0xff,0x7f,0xde,0xff,0xff,0xc0,0xbc,0xff,0xff,0x20,0xd3,0xff,0xff,0xf6,0x1c,0x00,0x00,0x5f,0xb3,0xff,0xff,0xba,0x1f,0x00,0x00,0x5b,0xfc,0xff,0xff,0x72,0xda,0xff,0xff,0xa4,0xfd,0xff,0xff,0x31,0xf7,0xff,0xff,0x04,0xeb,0xff,0xff,0x89,0xf9,0xff,0xff,0x8b,0xf8,0xff,0xff,0xc2,0xe1,0xff,0xff,0xc2,0x0e,0x00,0x00,0xf9,0x58,0x00,0x00,0x70,0xfd,0xff,0xff,0xc9,0xc0,0xff,0xff,0x53,0xe6,0xff,0xff,0xe0,0xfc,0xff,0xff,0x0a,0x07,0x00,0x00,0x39,0xf9,0xff,0xff,0x1a,0xe7,0xff,0xff,0x8e,0xf9,0xff,0xff,0x1a,0xef,0xff,0xff,0x7b,0x28,0x00,0x00,0xbd,0x27,0x00,0x00,0x01,0xec,0xff,0xff,0x21,0xe7,0xff,0xff,0x9d,0xe6,0xff,0xff,0x07,0x2b,0x00,0x00,0x0d,0xee,0xff,0xff,0x48,0x1b,0x00,0x00,0xa5,0xe4,0xff,0xff,0x17,0xf7,0xff,0xff,0x1e,0x01,0x00,0x00,0x82,0x22,0x00,0x00,0xe4,0xf5,0xff,0xff,0x90,0xf9,0xff,0xff,0x3b,0xfa,0xff,0xff,0x12,0xe2,0xff,0xff,0x7e,0x07,0x00,0x00,0x7a,0xfe,0xff,0xff,0x79,0xf0,0xff,0xff,0x2d,0xdc,0xff,0xff,0x09,0xf4,0xff,0xff,0xf6,0xeb,0xff,0xff,0x23,0x13,0x00,0x00,0x1b,0x17,0x00,0x00,0x51,0xfb,0xff,0xff,0xf6,0xc9,0xff,0xff,0x00,0x00,0x00,0x00,0x56,0xef,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x06,0x06,0x00,0x00,0xcf,0xff,0xff,0xff,0x16,0x12,0x00,0x00,0x27,0x0c,0x00,0x00,0x79,0x03,0x00,0x00,0x12,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x6c,0xff,0xff,0xff,0x74,0x1e,0x00,0x00,0x16,0x0b,0x00,0x00,0x4b,0x09,0x00,0x00,0x41,0xfb,0xff,0xff,0x3c,0xf8,0xff,0xff,0x64,0x15,0x00,0x00,0x93,0xf5,0xff,0xff,0x11,0x0e,0x00,0x00,0x6f,0xf7,0xff,0xff,0xae,0x06,0x00,0x00,0x45,0x03,0x00,0x00,0x2d,0xfe,0xff,0xff,0xf2,0x0a,0x00,0x00,0xb5,0xf5,0xff,0xff,0x94,0x0b,0x00,0x00,0x16,0xfc,0xff,0xff,0x44,0xfc,0xff,0xff,0x8e,0xf8,0xff,0xff,0xf7,0xfd,0xff,0xff,0xa1,0x01,0x00,0x00,0x2c,0xf7,0xff,0xff,0x58,0xfb,0xff,0xff,0xd0,0xfd,0xff,0xff,0xfe,0xfe,0xff,0xff,0x3d,0xfe,0xff,0xff,0xc9,0x03,0x00,0x00,0x72,0x0b,0x00,0x00,0x14,0xfe,0xff,0xff,0x5f,0x20,0x00,0x00,0xed,0xed,0xff,0xff,0xb0,0x03,0x00,0x00,0xd7,0x01,0x00,0x00,0x7f,0x19,0x00,0x00,0x3e,0x0e,0x00,0x00,0x7a,0xfe,0xff,0xff,0x37,0xee,0xff,0xff,0x9a,0xfb,0xff,0xff,0x5c,0x05,0x00,0x00,0x18,0xeb,0xff,0xff,0x4f,0xf9,0xff,0xff,0xd0,0xf7,0xff,0xff,0xac,0x00,0x00,0x00,0x51,0x11,0x00,0x00,0x61,0xf8,0xff,0xff,0x7d,0x01,0x00,0x00,0x40,0xff,0xff,0xff,0x1b,0xef,0xff,0xff,0x04,0xfb,0xff,0xff,0x7d,0xf4,0xff,0xff,0x69,0xfd,0xff,0xff,0x8a,0xfb,0xff,0xff,0x1a,0xe0,0xff,0xff,0xdc,0x02,0x00,0x00,0x6a,0xfd,0xff,0xff,0x2c,0x01,0x00,0x00,0x18,0x02,0x00,0x00,0x4e,0x02,0x00,0x00,0x1d,0x02,0x00,0x00,0x9d,0xfc,0xff,0xff,0x56,0x0a,0x00,0x00,0xf9,0x00,0x00,0x00,0x35,0xff,0xff,0xff,0xa7,0x0c,0x00,0x00,0xca,0xff,0xff,0xff,0xec,0x12,0x00,0x00,0x9c,0xec,0xff,0xff,0x90,0x02,0x00,0x00,0xe2,0xf9,0xff,0xff,0x00,0x00,0x00,0x00,0x96,0xf0,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x89,0xfc,0xff,0xff,0xb5,0xde,0xff,0xff,0x1d,0xbd,0xff,0xff,0x91,0x07,0x00,0x00,0xa9,0xf2,0xff,0xff,0x1c,0xee,0xff,0xff,0xbc,0x00,0x00,0x00,0x58,0xfc,0xff,0xff,0x18,0x04,0x00,0x00,0xc3,0x2a,0x00,0x00,0x37,0xf2,0xff,0xff,0xd2,0xef,0xff,0xff,0xc1,0xf4,0xff,0xff,0xb1,0xf1,0xff,0xff,0x12,0xd8,0xff,0xff,0x77,0xdd,0xff,0xff,0x7c,0xf6,0xff,0xff,0x81,0x09,0x00,0x00,0xce,0x35,0x00,0x00,0x10,0xfc,0xff,0xff,0xc6,0xfa,0xff,0xff,0x8e,0xf0,0xff,0xff,0xe3,0xe7,0xff,0xff,0x77,0x1d,0x00,0x00,0x9e,0xf1,0xff,0xff,0x7e,0xbd,0xff,0xff,0x00,0xf3,0xff,0xff,0x82,0x29,0x00,0x00,0x4d,0x0e,0x00,0x00,0x70,0xed,0xff,0xff,0x32,0xe3,0xff,0xff,0x9a,0xea,0xff,0xff,0x8c,0xd1,0xff,0xff,0x27,0x28,0x00,0x00,0x9c,0xe5,0xff,0xff,0x0a,0x0c,0x00,0x00,0xa4,0xee,0xff,0xff,0x32,0xf1,0xff,0xff,0x3d,0xf6,0xff,0xff,0x4f,0x20,0x00,0x00,0xd9,0xf3,0xff,0xff,0x26,0x2f,0x00,0x00,0x3e,0x15,0x00,0x00,0x8c,0xfa,0xff,0xff,0x6e,0xfb,0xff,0xff,0x48,0xd7,0xff,0xff,0xc6,0xf8,0xff,0xff,0x43,0xbf,0xff,0xff,0x31,0x01,0x00,0x00,0xf4,0xfb,0xff,0xff,0xea,0xfd,0xff,0xff,0xeb,0xe1,0xff,0xff,0x06,0xf8,0xff,0xff,0x71,0xf9,0xff,0xff,0x8a,0xf9,0xff,0xff,0x6e,0x08,0x00,0x00,0x04,0xee,0xff,0xff,0xa3,0xf8,0xff,0xff,0x4a,0x1a,0x00,0x00,0xe5,0x9f,0xff,0xff,0xf6,0xfd,0xff,0xff,0x83,0xd0,0xff,0xff,0x87,0xef,0xff,0xff,0x31,0x0a,0x00,0x00,0x59,0x20,0x00,0x00,0xb6,0xf7,0xff,0xff,0x5e,0x11,0x00,0x00,0x57,0xce,0xff,0xff,0x39,0xa9,0xff,0xff,0x70,0x00,0x00,0x00,0x16,0xfe,0xff,0xff,0x36,0xf5,0xff,0xff,0x52,0xf6,0xff,0xff,0x1f,0x01,0x00,0x00,0xa1,0xfa,0xff,0xff,0xdb,0xfe,0xff,0xff,0x00,0x00,0x00,0x00,0xd6,0xf1,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x01,0x00,0x00,0x62,0xfa,0xff,0xff,0xff,0xfe,0xff,0xff,0x39,0x02,0x00,0x00,0xaf,0xfb,0xff,0xff,0x68,0xfd,0xff,0xff,0x47,0xff,0xff,0xff,0x58,0x03,0x00,0x00,0x32,0xfb,0xff,0xff,0x26,0xff,0xff,0xff,0xc3,0x05,0x00,0x00,0x93,0xf8,0xff,0xff,0xba,0x03,0x00,0x00,0xd6,0xfe,0xff,0xff,0xb0,0xf8,0xff,0xff,0xd5,0xfd,0xff,0xff,0x92,0xf9,0xff,0xff,0xc1,0xfc,0xff,0xff,0xf0,0x03,0x00,0x00,0x04,0x05,0x00,0x00,0xf7,0xfd,0xff,0xff,0xc4,0xf5,0xff,0xff,0x21,0x06,0x00,0x00,0xab,0xf5,0xff,0xff,0x16,0xfd,0xff,0xff,0xd6,0xf4,0xff,0xff,0x3f,0xfc,0xff,0xff,0x3e,0xfc,0xff,0xff,0xf0,0xff,0xff,0xff,0x4b,0xfd,0xff,0xff,0x12,0xf7,0xff,0xff,0x16,0xfe,0xff,0xff,0x1f,0xed,0xff,0xff,0x3e,0xfb,0xff,0xff,0x5a,0x04,0x00,0x00,0x58,0xfa,0xff,0xff,0xb5,0xfd,0xff,0xff,0xff,0xee,0xff,0xff,0x18,0xf2,0xff,0xff,0xfc,0xfb,0xff,0xff,0x61,0xff,0xff,0xff,0xe1,0xfa,0xff,0xff,0x83,0x08,0x00,0x00,0xe2,0xf0,0xff,0xff,0x5a,0xe3,0xff,0xff,0x33,0xf8,0xff,0xff,0x1b,0x05,0x00,0x00,0xb0,0xfe,0xff,0xff,0xfc,0x05,0x00,0x00,0x48,0xfe,0xff,0xff,0xa3,0xd5,0xff,0xff,0x35,0x07,0x00,0x00,0xe9,0xfc,0xff,0xff,0x4c,0xe7,0xff,0xff,0x20,0x10,0x00,0x00,0x88,0xeb,0xff,0xff,0xa3,0xff,0xff,0xff,0x49,0x00,0x00,0x00,0xb1,0x0c,0x00,0x00,0x1f,0xf9,0xff,0xff,0xef,0x02,0x00,0x00,0x22,0x04,0x00,0x00,0x6c,0xfd,0xff,0xff,0x03,0xf7,0xff,0xff,0xc4,0xff,0xff,0xff,0x24,0x01,0x00,0x00,0xc5,0x0d,0x00,0x00,0xc7,0x01,0x00,0x00,0xab,0x06,0x00,0x00,0x1d,0x05,0x00,0x00,0x52,0xff,0xff,0xff,0x4c,0xfa,0xff,0xff,0xd4,0xef,0xff,0xff,0x67,0xf6,0xff,0xff,0xdb,0x0c,0x00,0x00,0x89,0xff,0xff,0xff,0xbc,0xfd,0xff,0xff,0x00,0x00,0x00,0x00,0x16,0xf3,0xff,0xff,0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xa6,0xff,0xff,0xff,0x40,0xf9,0xff,0xff,0xe5,0xf4,0xff,0xff,0x20,0x0c,0x00,0x00,0xad,0xfd,0xff,0xff,0x2f,0x00,0x00,0x00,0xdf,0xf4,0xff,0xff,0x9f,0xfd,0xff,0xff,0xa5,0xf9,0xff,0xff,0x5d,0xfe,0xff,0xff,0x2d,0xd6,0xff,0xff,0x47,0x09,0x00,0x00,0xba,0x1d,0x00,0x00,0x69,0xf2,0xff,0xff,0xf3,0xbf,0xff,0xff,0x07,0xf6,0xff,0xff,0xf7,0xff,0xff,0xff,0xcd,0xff,0xff,0xff,0x80,0x26,0x00,0x00,0x5e,0xfc,0xff,0xff,0xb2,0xfe,0xff,0xff,0xce,0xee,0xff,0xff,0xeb,0xee,0xff,0xff,0xcd,0x04,0x00,0x00,0x66,0x12,0x00,0x00,0xad,0xe8,0xff,0xff,0x04,0xf8,0xff,0xff,0x08,0xf8,0xff,0xff,0xcf,0xb8,0xff,0xff,0x67,0xff,0xff,0xff,0x81,0x04,0x00,0x00,0xb8,0xf4,0xff,0xff,0xc7,0x19,0x00,0x00,0x82,0xe4,0xff,0xff,0x3e,0xf6,0xff,0xff,0xfa,0xf7,0xff,0xff,0x92,0x22,0x00,0x00,0x67,0x01,0x00,0x00,0x7f,0x06,0x00,0x00,0x56,0xc2,0xff,0xff,0xd0,0xed,0xff,0xff,0x87,0xf8,0xff,0xff,0x0f,0xda,0xff,0xff,0x32,0xec,0xff,0xff,0x30,0x04,0x00,0x00,0xc9,0x1d,0x00,0x00,0x6a,0x11,0x00,0x00,0x91,0x20,0x00,0x00,0xa0,0x06,0x00,0x00,0x17,0xfc,0xff,0xff,0x0f,0x1e,0x00,0x00,0x74,0xf0,0xff,0xff,0x7f,0x1b,0x00,0x00,0x4d,0xf6,0xff,0xff,0xaf,0x10,0x00,0x00,0x16,0xfb,0xff,0xff,0x56,0xf1,0xff,0xff,0xf0,0xca,0xff,0xff,0xdb,0xf6,0xff,0xff,0xb9,0x17,0x00,0x00,0x12,0xf3,0xff,0xff,0xa0,0x0d,0x00,0x00,0x40,0xf7,0xff,0xff,0xca,0x15,0x00,0x00,0x39,0xee,0xff,0xff,0x9f,0x07,0x00,0x00,0xec,0xf4,0xff,0xff,0xeb,0x0c,0x00,0x00,0xcc,0xf7,0xff,0xff,0xe3,0x1a,0x00,0x00,0xff,0xff,0xff,0xff,0xce,0xfd,0xff,0xff,0x64,0x1a,0x00,0x00,0x49,0x26,0x00,0x00,0xb6,0xd6,0xff,0xff,0xa3,0xf5,0xff,0xff,0x71,0x17,0x00,0x00,0x81,0x03,0x00,0x00,0xb0,0x05,0x00,0x00,0x1f,0xf6,0xff,0xff,0x46,0xf8,0xff,0xff,0xdd,0x04,0x00,0x00,0x82,0xfe,0xff,0xff,0x0c,0xfa,0xff,0xff,0x67,0x14,0x00,0x00,0xee,0xe2,0xff,0xff,0x1f,0x1f,0x00,0x00,0x6b,0xf2,0xff,0xff,0x79,0x19,0x00,0x00,0x06,0xff,0xff,0xff,0x10,0x11,0x00,0x00,0x6c,0xfe,0xff,0xff,0x16,0xec,0xff,0xff,0x25,0x00,0x00,0x00,0x67,0xd0,0xff,0xff,0xab,0xc1,0xff,0xff,0x84,0xfb,0xff,0xff,0xba,0xfa,0xff,0xff,0x11,0x02,0x00,0x00,0x6f,0xfe,0xff,0xff,0x76,0xfa,0xff,0xff,0x42,0xfe,0xff,0xff,0xb9,0xfc,0xff,0xff,0xd3,0x11,0x00,0x00,0x86,0xfc,0xff,0xff,0x18,0xfc,0xff,0xff,0xfb,0xf7,0xff,0xff,0x4a,0xfa,0xff,0xff,0xf3,0xee,0xff,0xff,0x9a,0xf1,0xff,0xff,0xbb,0xf9,0xff,0xff,0x26,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0xe6,0xf4,0xff,0xff,0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x59,0x03,0x00,0x00,0x52,0x01,0x00,0x00,0xbe,0xff,0xff,0xff,0x91,0x0b,0x00,0x00,0x4f,0x05,0x00,0x00,0x9e,0x04,0x00,0x00,0xba,0x02,0x00,0x00,0x43,0xff,0xff,0xff,0xdf,0xe6,0xff,0xff,0xc3,0xf6,0xff,0xff,0x4a,0xf3,0xff,0xff,0xbb,0x00,0x00,0x00,0x06,0x07,0x00,0x00,0xba,0x00,0x00,0x00,0x9e,0x05,0x00,0x00,0xb7,0x04,0x00,0x00,0x8d,0x21,0x00,0x00,0x08,0xff,0xff,0xff,0x80,0x06,0x00,0x00,0x7a,0x00,0x00,0x00,0x07,0x02,0x00,0x00,0x90,0xfd,0xff,0xff,0xbf,0xf7,0xff,0xff,0xfa,0xfe,0xff,0xff,0xc2,0x05,0x00,0x00,0xf8,0xf1,0xff,0xff,0x98,0x00,0x00,0x00,0xd5,0x04,0x00,0x00,0x4f,0x03,0x00,0x00,0x62,0xe4,0xff,0xff,0x4e,0xfe,0xff,0xff,0xc6,0xfa,0xff,0xff,0xa3,0x03,0x00,0x00,0x49,0xfc,0xff,0xff,0x21,0x01,0x00,0x00,0xac,0xf4,0xff,0xff,0xd2,0x03,0x00,0x00,0x61,0x02,0x00,0x00,0x9b,0x08,0x00,0x00,0x4a,0x00,0x00,0x00,0xb5,0xf7,0xff,0xff,0x11,0xf6,0xff,0xff,0x58,0xfb,0xff,0xff,0x68,0xfc,0xff,0xff,0xac,0xf9,0xff,0xff,0x3b,0xfe,0xff,0xff,0x63,0x00,0x00,0x00,0x4a,0xfc,0xff,0xff,0x3f,0x03,0x00,0x00,0x1c,0x04,0x00,0x00,0x81,0x00,0x00,0x00,0x66,0x04,0x00,0x00,0xbd,0xfd,0xff,0xff,0x18,0x09,0x00,0x00,0xb9,0xfe,0xff,0xff,0xb0,0x08,0x00,0x00,0xdd,0xe5,0xff,0xff,0xf7,0x02,0x00,0x00,0x10,0x04,0x00,0x00,0x55,0x07,0x00,0x00,0x30,0xfc,0xff,0xff,0xc3,0xff,0xff,0xff,0x4a,0xe8,0xff,0xff,0x7d,0xfe,0xff,0xff,0xed,0x02,0x00,0x00,0x6d,0x06,0x00,0x00,0x9d,0xfb,0xff,0xff,0xa2,0xfe,0xff,0xff,0x55,0xfb,0xff,0xff,0x54,0x05,0x00,0x00,0x58,0x02,0x00,0x00,0x92,0xef,0xff,0xff,0xf5,0xfe,0xff,0xff,0xe1,0x06,0x00,0x00,0x5f,0xfa,0xff,0xff,0x9a,0xfe,0xff,0xff,0x1c,0x01,0x00,0x00,0xe1,0x04,0x00,0x00,0xa0,0xf9,0xff,0xff,0xff,0x05,0x00,0x00,0xe3,0x08,0x00,0x00,0xc5,0x08,0x00,0x00,0xdb,0xff,0xff,0xff,0xf5,0xfa,0xff,0xff,0x0f,0xfc,0xff,0xff,0xee,0xfa,0xff,0xff,0x06,0x08,0x00,0x00,0xc5,0x00,0x00,0x00,0x6e,0xfe,0xff,0xff,0x9e,0xff,0xff,0xff,0x99,0x03,0x00,0x00,0x45,0x02,0x00,0x00,0x58,0x03,0x00,0x00,0x5c,0x02,0x00,0x00,0x8c,0xf9,0xff,0xff,0x90,0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x9e,0xfa,0xff,0xff,0xf7,0xfe,0xff,0xff,0x8a,0x02,0x00,0x00,0x59,0xfa,0xff,0xff,0x42,0xfb,0xff,0xff,0x91,0xfb,0xff,0xff,0xe3,0xfe,0xff,0xff,0xb9,0xf5,0xff,0xff,0xc0,0x05,0x00,0x00,0x90,0xff,0xff,0xff,0x29,0x04,0x00,0x00,0x45,0xfb,0xff,0xff,0x85,0xf7,0xff,0xff,0xb9,0xff,0xff,0xff,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,0xf6,0xff,0xff,0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xa8,0xc4,0xff,0xff,0xf6,0x65,0xff,0xff,0xe2,0xf7,0xff,0xff,0x7c,0x21,0x00,0x00,0xa3,0xe5,0xff,0xff,0xac,0xfb,0xff,0xff,0x6c,0x1f,0x00,0x00,0x17,0xe3,0xff,0xff,0x25,0xfd,0xff,0xff,0xa0,0xf8,0xff,0xff,0x69,0xff,0xff,0xff,0xe8,0xf9,0xff,0xff,0x38,0x12,0x00,0x00,0xec,0x12,0x00,0x00,0x05,0xfe,0xff,0xff,0xf1,0xfa,0xff,0xff,0x1e,0x04,0x00,0x00,0x25,0xf3,0xff,0xff,0x57,0xf0,0xff,0xff,0xc7,0x00,0x00,0x00,0xfe,0xf2,0xff,0xff,0x3b,0x2a,0x00,0x00,0x4f,0xe9,0xff,0xff,0x5c,0xf7,0xff,0xff,0x18,0xfc,0xff,0xff,0x7a,0xf4,0xff,0xff,0x28,0xfc,0xff,0xff,0x91,0x0a,0x00,0x00,0x45,0xfe,0xff,0xff,0x75,0x16,0x00,0x00,0xb3,0xea,0xff,0xff,0xfc,0xe1,0xff,0xff,0x77,0xfc,0xff,0xff,0xa8,0xfc,0xff,0xff,0xc8,0xf1,0xff,0xff,0x48,0xfd,0xff,0xff,0x66,0xea,0xff,0xff,0x43,0x1d,0x00,0x00,0xdd,0x11,0x00,0x00,0x8f,0xfd,0xff,0xff,0x67,0xfb,0xff,0xff,0x9b,0x18,0x00,0x00,0x9a,0x0b,0x00,0x00,0x45,0xf4,0xff,0xff,0xef,0xfa,0xff,0xff,0x92,0xf4,0xff,0xff,0xb0,0x18,0x00,0x00,0x47,0xf7,0xff,0xff,0x61,0xff,0xff,0xff,0x8e,0xf9,0xff,0xff,0x62,0xec,0xff,0xff,0x2f,0xfc,0xff,0xff,0x4a,0x2c,0x00,0x00,0xf4,0xfb,0xff,0xff,0x5f,0x03,0x00,0x00,0x1c,0x04,0x00,0x00,0x62,0xff,0xff,0xff,0xc7,0x1f,0x00,0x00,0xdb,0xf5,0xff,0xff,0x06,0xfd,0xff,0xff,0x84,0x07,0x00,0x00,0x5d,0x0f,0x00,0x00,0xe0,0xe9,0xff,0xff,0x86,0xf9,0xff,0xff,0xfb,0xfa,0xff,0xff,0xb2,0xfc,0xff,0xff,0x02,0xed,0xff,0xff,0xb3,0xf2,0xff,0xff,0x2b,0xfc,0xff,0xff,0x68,0xfc,0xff,0xff,0x34,0xfc,0xff,0xff,0x80,0xe3,0xff,0xff,0x1b,0xf4,0xff,0xff,0xf7,0xfd,0xff,0xff,0x1f,0x0e,0x00,0x00,0xd0,0x23,0x00,0x00,0x07,0xdc,0xff,0xff,0x82,0xee,0xff,0xff,0x7a,0xfe,0xff,0xff,0xbb,0xf3,0xff,0xff,0xaa,0xf9,0xff,0xff,0xaa,0x25,0x00,0x00,0x69,0xf7,0xff,0xff,0x46,0xdb,0xff,0xff,0x61,0x21,0x00,0x00,0x0f,0xf4,0xff,0xff,0x8b,0xfa,0xff,0xff,0x92,0x1c,0x00,0x00,0xc6,0x19,0x00,0x00,0xa0,0xfe,0xff,0xff,0x1e,0xfa,0xff,0xff,0x0d,0xf4,0xff,0xff,0x93,0xff,0xff,0xff,0x0f,0xb9,0xff,0xff,0xe4,0xf4,0xff,0xff,0x5d,0xf9,0xff,0xff,0xe9,0xef,0xff,0xff,0x96,0x04,0x00,0x00,0xc8,0xf9,0xff,0xff,0x7a,0x1d,0x00,0x00,0x35,0xde,0xff,0xff,0x23,0xf2,0xff,0xff,0xe3,0x1f,0x00,0x00,0xb0,0xe8,0xff,0xff,0xc7,0x0d,0x00,0x00,0x6e,0xdc,0xff,0xff,0x39,0x16,0x00,0x00,0xf1,0x15,0x00,0x00,0x79,0xe6,0xff,0xff,0xfc,0xf8,0xff,0xff,0x95,0xf9,0xff,0xff,0x8e,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0xf8,0xff,0xff,0x04,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xb2,0x0d,0x00,0x00,0x6f,0x11,0x00,0x00,0x9f,0x02,0x00,0x00,0xeb,0xfa,0xff,0xff,0x2e,0xed,0xff,0xff,0x76,0xee,0xff,0xff,0x95,0xf9,0xff,0xff,0xa8,0x15,0x00,0x00,0x1a,0x04,0x00,0x00,0x47,0xfe,0xff,0xff,0x9e,0xfd,0xff,0xff,0xee,0x16,0x00,0x00,0x59,0x07,0x00,0x00,0xf9,0x05,0x00,0x00,0x50,0x06,0x00,0x00,0x03,0x05,0x00,0x00,0x48,0x0f,0x00,0x00,0x2f,0xfc,0xff,0xff,0x49,0x03,0x00,0x00,0x69,0x14,0x00,0x00,0x82,0x01,0x00,0x00,0xf7,0xfa,0xff,0xff,0xcf,0x00,0x00,0x00,0x43,0xf7,0xff,0xff,0x47,0x0b,0x00,0x00,0xa3,0x07,0x00,0x00,0x42,0x29,0x00,0x00,0x35,0x31,0x00,0x00,0x2e,0x09,0x00,0x00,0xba,0xfd,0xff,0xff,0x83,0x03,0x00,0x00,0xd7,0x0a,0x00,0x00,0x88,0xfc,0xff,0xff,0x11,0x24,0x00,0x00,0x43,0x28,0x00,0x00,0x4c,0x04,0x00,0x00,0x66,0x09,0x00,0x00,0xc2,0xf6,0xff,0xff,0x2a,0x02,0x00,0x00,0x6d,0x0a,0x00,0x00,0x4a,0xff,0xff,0xff,0x20,0x00,0x00,0x00,0x53,0xfd,0xff,0xff,0x4c,0xff,0xff,0xff,0xcb,0x11,0x00,0x00,0x99,0x04,0x00,0x00,0xde,0x06,0x00,0x00,0x79,0x0a,0x00,0x00,0x61,0xff,0xff,0xff,0x32,0x0f,0x00,0x00,0x2e,0x04,0x00,0x00,0x65,0x26,0x00,0x00,0x7d,0x0a,0x00,0x00,0x07,0x09,0x00,0x00,0x60,0x0e,0x00,0x00,0x29,0xed,0xff,0xff,0xf7,0x01,0x00,0x00,0x16,0xfb,0xff,0xff,0x24,0xf7,0xff,0xff,0x7b,0x07,0x00,0x00,0x72,0x0a,0x00,0x00,0xc0,0xf4,0xff,0xff,0x20,0xf6,0xff,0xff,0x7a,0x01,0x00,0x00,0x22,0xfb,0xff,0xff,0xda,0x0d,0x00,0x00,0x8b,0xf3,0xff,0xff,0xd1,0xfd,0xff,0xff,0xe9,0xfd,0xff,0xff,0xd2,0x0e,0x00,0x00,0x4d,0xfd,0xff,0xff,0x2e,0x0c,0x00,0x00,0x46,0x35,0x00,0x00,0x61,0x0b,0x00,0x00,0x30,0xe4,0xff,0xff,0xb4,0x0b,0x00,0x00,0x32,0x06,0x00,0x00,0x2b,0x10,0x00,0x00,0x5a,0x01,0x00,0x00,0x45,0x06,0x00,0x00,0xd3,0x14,0x00,0x00,0x2f,0x02,0x00,0x00,0x36,0xf6,0xff,0xff,0xcd,0x0c,0x00,0x00,0xb9,0x2c,0x00,0x00,0xbc,0x01,0x00,0x00,0xeb,0xe6,0xff,0xff,0xde,0x03,0x00,0x00,0xb7,0x01,0x00,0x00,0xa3,0x0a,0x00,0x00,0x5e,0x07,0x00,0x00,0xc7,0x2d,0x00,0x00,0xfd,0x0a,0x00,0x00,0x79,0x00,0x00,0x00,0x4b,0x0e,0x00,0x00,0xec,0xf5,0xff,0xff,0xaa,0x08,0x00,0x00,0x22,0x08,0x00,0x00,0xac,0xfd,0xff,0xff,0xb3,0x05,0x00,0x00,0x70,0x06,0x00,0x00,0x18,0xf2,0xff,0xff,0xbd,0x08,0x00,0x00,0x27,0xef,0xff,0xff,0xe4,0xff,0xff,0xff,0xf7,0x01,0x00,0x00,0x16,0xf6,0xff,0xff,0x7b,0x0e,0x00,0x00,0xd6,0xfe,0xff,0xff,0x20,0x0d,0x00,0x00,0x35,0xf7,0xff,0xff,0xca,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0xfa,0xff,0xff,0x04,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x92,0x48,0x00,0x00,0x13,0xe1,0xff,0xff,0x6b,0xc2,0xff,0xff,0x39,0xfa,0xff,0xff,0x52,0x2f,0x00,0x00,0x06,0x00,0x00,0x00,0x3e,0x1e,0x00,0x00,0xb8,0xf5,0xff,0xff,0xe5,0xe4,0xff,0xff,0xf3,0xfb,0xff,0xff,0x6b,0xdd,0xff,0xff,0xb9,0xff,0xff,0xff,0xb6,0xeb,0xff,0xff,0x52,0xff,0xff,0xff,0xfd,0x27,0x00,0x00,0x36,0x30,0x00,0x00,0x53,0x3c,0x00,0x00,0x4f,0xeb,0xff,0xff,0x40,0xdd,0xff,0xff,0x57,0x25,0x00,0x00,0x29,0x34,0x00,0x00,0x4e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x30,0x22,0x00,0x00,0xcd,0x33,0x00,0x00,0x65,0xf6,0xff,0xff,0x90,0x43,0x00,0x00,0x04,0xaf,0xff,0xff,0x43,0xf3,0xff,0xff,0xc0,0xc4,0xff,0xff,0xad,0xf1,0xff,0xff,0xad,0x3d,0x00,0x00,0x30,0xf8,0xff,0xff,0x73,0xf9,0xff,0xff,0xe2,0x31,0x00,0x00,0x81,0x2c,0x00,0x00,0xc3,0xf5,0xff,0xff,0x5d,0x33,0x00,0x00,0xcd,0x3c,0x00,0x00,0x2b,0x03,0x00,0x00,0xf9,0x26,0x00,0x00,0xe8,0xff,0xff,0xff,0x64,0x3f,0x00,0x00,0xf1,0xff,0xff,0xff,0xb9,0xf2,0xff,0xff,0xf3,0x4d,0x00,0x00,0x77,0xfa,0xff,0xff,0x18,0xed,0xff,0xff,0x77,0xee,0xff,0xff,0x6b,0x02,0x00,0x00,0x76,0x3a,0x00,0x00,0x77,0xfa,0xff,0xff,0xc6,0xf8,0xff,0xff,0x1d,0xec,0xff,0xff,0x18,0xf8,0xff,0xff,0xf3,0xec,0xff,0xff,0xc8,0x3c,0x00,0x00,0xf3,0x32,0x00,0x00,0x1c,0xf6,0xff,0xff,0xa7,0xff,0xff,0xff,0xb5,0x2f,0x00,0x00,0x16,0x3a,0x00,0x00,0x64,0xff,0xff,0xff,0x65,0xd4,0xff,0xff,0x94,0xf2,0xff,0xff,0x58,0xff,0xff,0xff,0x06,0x00,0x00,0x00,0xcb,0xf4,0xff,0xff,0x1a,0xe3,0xff,0xff,0x64,0xbf,0xff,0xff,0x1e,0xe4,0xff,0xff,0x6b,0x36,0x00,0x00,0x9f,0x28,0x00,0x00,0x18,0xe0,0xff,0xff,0xd6,0x31,0x00,0x00,0x36,0x3d,0x00,0x00,0x57,0xf4,0xff,0xff,0x88,0x3e,0x00,0x00,0x9f,0xf2,0xff,0xff,0x1d,0xd2,0xff,0xff,0xf2,0x3e,0x00,0x00,0x4c,0xee,0xff,0xff,0x8c,0x36,0x00,0x00,0x34,0x50,0x00,0x00,0xed,0xc6,0xff,0xff,0x73,0xfa,0xff,0xff,0xaf,0xfc,0xff,0xff,0x5d,0x39,0x00,0x00,0xfe,0x0e,0x00,0x00,0xd4,0xec,0xff,0xff,0x2a,0xfc,0xff,0xff,0xb0,0x29,0x00,0x00,0xad,0xf9,0xff,0xff,0x7b,0xfb,0xff,0xff,0xf7,0x25,0x00,0x00,0x10,0x16,0x00,0x00,0x20,0xe1,0xff,0xff,0x18,0xf4,0xff,0xff,0x78,0xf6,0xff,0xff,0x71,0xff,0xff,0xff,0x90,0xf8,0xff,0xff,0xee,0xfb,0xff,0xff,0x2b,0xf2,0xff,0xff,0xe6,0xff,0xff,0xff,0xa2,0x32,0x00,0x00,0xe4,0x26,0x00,0x00,0x09,0xf6,0xff,0xff,0x69,0xf5,0xff,0xff,0x4d,0xf7,0xff,0xff,0xfe,0x44,0x00,0x00,0xed,0x29,0x00,0x00,0x1c,0x00,0x00,0x00,0xd3,0xfc,0xff,0xff,0x50,0xff,0xff,0xff,0xfe,0xf1,0xff,0xff,0x0f,0x43,0x00,0x00,0x89,0x30,0x00,0x00,0xe4,0xe9,0xff,0xff,0xa3,0xf4,0xff,0xff,0x02,0x30,0x00,0x00,0xb0,0x2f,0x00,0x00,0x32,0xf3,0xff,0xff,0x08,0x25,0x00,0x00,0xc3,0x3c,0x00,0x00,0x0d,0x00,0x00,0x00,0x56,0xef,0xff,0xff,0x02,0xf0,0xff,0xff,0x6d,0x32,0x00,0x00,0xe8,0xfe,0xff,0xff,0x87,0x3a,0x00,0x00,0x68,0x33,0x00,0x00,0x03,0x29,0x00,0x00,0x73,0x2c,0x00,0x00,0x98,0xf9,0xff,0xff,0xf3,0x4c,0x00,0x00,0x73,0xfb,0xff,0xff,0xd9,0xe6,0xff,0xff,0x39,0xf5,0xff,0xff,0xf5,0xfc,0xff,0xff,0xe6,0xf5,0xff,0xff,0x77,0x00,0x00,0x00,0x35,0x3a,0x00,0x00,0x45,0x2c,0x00,0x00,0xbf,0x00,0x00,0x00,0x67,0xf0,0xff,0xff,0x32,0x3f,0x00,0x00,0x4c,0x00,0x00,0x00,0x19,0x37,0x00,0x00,0xc0,0xf4,0xff,0xff,0x44,0xf9,0xff,0xff,0xa2,0x24,0x00,0x00,0x89,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xfc,0xff,0xff,0x04,0x00,0x00,0x00,0x60,0x02,0x00,0x00,0x6c,0x03,0x00,0x00,0x0a,0xfe,0xff,0xff,0xfb,0x08,0x00,0x00,0xaf,0xff,0xff,0xff,0x3a,0xff,0xff,0xff,0xb0,0x58,0xff,0xff,0xc2,0xf7,0xff,0xff,0x90,0xf8,0xff,0xff,0xb3,0xf3,0xff,0xff,0xbb,0xf0,0xff,0xff,0xaa,0xf7,0xff,0xff,0x69,0x9c,0xfb,0xff,0xac,0xf3,0xff,0xff,0xaf,0xdf,0xff,0xff,0x2d,0xfc,0xff,0xff,0x34,0x05,0x00,0x00,0x89,0x0d,0x00,0x00,0x60,0xf4,0xff,0xff,0x95,0xfe,0xff,0xff,0x3e,0x00,0x00,0x00,0xb2,0xfe,0xff,0xff,0xc2,0xee,0xfe,0xff,0x83,0x7b,0xfd,0xff,0xb1,0x02,0x00,0x00,0xaf,0x09,0x00,0x00,0xc9,0xe3,0xff,0xff,0xe0,0x00,0x00,0x00,0xb9,0x02,0x00,0x00,0x41,0xf1,0xff,0xff,0x15,0xff,0xff,0xff,0xbb,0xf3,0xff,0xff,0x67,0x07,0x00,0x00,0xe2,0xfe,0xff,0xff,0xaa,0xf6,0xff,0xff,0x33,0x06,0x00,0x00,0x8d,0xfc,0xff,0xff,0xb5,0xf1,0xff,0xff,0xac,0x02,0x00,0x00,0x56,0xfd,0xff,0xff,0xaf,0xeb,0xff,0xff,0x0c,0x02,0x00,0x00,0xcd,0xe5,0xff,0xff,0x6d,0xfc,0xff,0xff,0x10,0xf0,0xff,0xff,0x2e,0xf4,0xff,0xff,0x02,0x0e,0x00,0x00,0x53,0x09,0x00,0x00,0x6e,0x06,0x00,0x00,0x1a,0x00,0x00,0x00,0x6f,0xe0,0xff,0xff,0x9d,0x03,0x00,0x00,0xe0,0xeb,0xff,0xff,0x80,0xf3,0xff,0xff,0x4e,0x04,0x00,0x00,0x33,0x12,0x00,0x00,0x2d,0xff,0xff,0xff,0xd2,0x19,0x00,0x00,0x48,0x00,0x00,0x00,0x77,0xf5,0xff,0xff,0xcb,0x7e,0xfe,0xff,0x18,0x00,0x00,0x00,0x76,0x13,0x00,0x00,0xb3,0xdd,0xff,0xff,0xee,0xfa,0xff,0xff,0x85,0xf4,0xff,0xff,0xf2,0xed,0xff,0xff,0x58,0x29,0xff,0xff,0x68,0xfa,0xff,0xff,0xda,0xfb,0xff,0xff,0x94,0xf0,0xff,0xff,0x34,0x08,0x00,0x00,0x32,0xfe,0xff,0xff,0x63,0x05,0x00,0x00,0x29,0xef,0xff,0xff,0x72,0x06,0x00,0x00,0xa3,0x03,0x00,0x00,0xe5,0xf7,0xff,0xff,0x34,0xf7,0xff,0xff,0xab,0x05,0x00,0x00,0xd6,0xf9,0xff,0xff,0xf2,0x0f,0x00,0x00,0x45,0xf5,0xff,0xff,0x3e,0x03,0x00,0x00,0x74,0x07,0x00,0x00,0xa8,0x0e,0x00,0x00,0xf5,0xe9,0xff,0xff,0x57,0xea,0xff,0xff,0xda,0xfa,0xff,0xff,0x73,0xff,0xff,0xff,0xa1,0x02,0x00,0x00,0x5d,0xf8,0xff,0xff,0x37,0xfb,0xff,0xff,0xcb,0xf7,0xff,0xff,0x65,0x0a,0x00,0x00,0xba,0xfa,0xff,0xff,0x23,0xfb,0xff,0xff,0x1a,0xfc,0xff,0xff,0x71,0xfa,0xff,0xff,0x1a,0xf0,0xff,0xff,0x96,0xf7,0xff,0xff,0xb6,0xf2,0xff,0xff,0xa2,0xfb,0xff,0xff,0x34,0xe8,0xff,0xff,0xc5,0xfc,0xff,0xff,0x0a,0x0b,0x00,0x00,0x28,0xfc,0xff,0xff,0xa2,0xef,0xff,0xff,0xcf,0xef,0xff,0xff,0x05,0xe6,0xff,0xff,0x97,0x02,0x00,0x00,0x18,0xff,0xff,0xff,0x50,0xe4,0xfe,0xff,0x86,0x0e,0x00,0x00,0x1a,0xef,0xff,0xff,0x5c,0x05,0x00,0x00,0xba,0x18,0x00,0x00,0x8d,0x04,0x00,0x00,0x26,0xfd,0xff,0xff,0x67,0x0c,0x00,0x00,0x7e,0x07,0x00,0x00,0x04,0x13,0x00,0x00,0xde,0xfe,0xff,0xff,0xa0,0xfd,0xff,0xff,0xe8,0xff,0xff,0xff,0xdb,0xd7,0xff,0xff,0x20,0x04,0x00,0x00,0xb8,0xf4,0xff,0xff,0x78,0x0a,0x00,0x00,0x0b,0xfe,0xff,0xff,0x79,0x0b,0x00,0x00,0x0a,0x00,0x00,0x00,0x90,0xfb,0xff,0xff,0xac,0xfd,0xff,0xff,0x86,0xfb,0xff,0xff,0xae,0x0a,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0xf8,0xff,0xff,0x84,0xfc,0xff,0xff,0x63,0xfd,0xff,0xff,0x26,0xf8,0xff,0xff,0x6b,0xf0,0xff,0xff,0x45,0x0e,0x00,0x00,0x96,0x03,0x00,0x00,0xe0,0xfb,0xff,0xff,0xf8,0x02,0x00,0x00,0x76,0x08,0x00,0x00,0x1c,0xdf,0xff,0xff,0xc2,0x15,0x00,0x00,0x20,0xf2,0xff,0xff,0xcd,0xf3,0xff,0xff,0x12,0xfa,0xff,0xff,0x5c,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0xff,0xff,0xff,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xf2,0xd1,0xff,0xff,0x5e,0x77,0x00,0x00,0x11,0x64,0xfe,0xff,0xf3,0x1d,0xf8,0xff,0x00,0x00,0x00,0x00,0x56,0xff,0xff,0xff,0x04,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x26,0x2a,0xff,0xff,0x64,0x45,0x00,0x00,0x26,0x82,0xff,0xff,0x70,0x74,0x01,0x00,0x9c,0xe6,0xfd,0xff,0x60,0x79,0x01,0x00,0x85,0x6a,0x00,0x00,0x1b,0x17,0x00,0x00,0x1f,0x70,0x01,0x00,0xcb,0x8e,0xff,0xff,0xca,0x94,0x00,0x00,0xe2,0x53,0xfe,0xff,0x00,0x00,0x00,0x00,0x96,0xff,0xff,0xff,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc6,0xff,0xff,0xff,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x4f,0xfd,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x4f,0xfd,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x4d,0x4c,0x49,0x52,0x20,0x43,0x6f,0x6e,0x76,0x65,0x72,0x74,0x65,0x64,0x2e,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0xec,0x11,0x00,0x00,0xe0,0x11,0x00,0x00,0xd4,0x11,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6d,0x61,0x69,0x6e,0x00,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x70,0x11,0x00,0x00,0x20,0x11,0x00,0x00,0xc8,0x10,0x00,0x00,0x70,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0xd8,0x0f,0x00,0x00,0x8c,0x0f,0x00,0x00,0x4c,0x0f,0x00,0x00,0x04,0x0f,0x00,0x00,0xc8,0x0e,0x00,0x00,0x94,0x0e,0x00,0x00,0x60,0x0e,0x00,0x00,0x20,0x0e,0x00,0x00,0xd8,0x0d,0x00,0x00,0x9c,0x0d,0x00,0x00,0x5c,0x0d,0x00,0x00,0x14,0x0d,0x00,0x00,0xd8,0x0c,0x00,0x00,0xa4,0x0c,0x00,0x00,0x70,0x0c,0x00,0x00,0x30,0x0c,0x00,0x00,0xe8,0x0b,0x00,0x00,0xac,0x0b,0x00,0x00,0x78,0x0b,0x00,0x00,0x38,0x0b,0x00,0x00,0xf0,0x0a,0x00,0x00,0xb4,0x0a,0x00,0x00,0x74,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0xf0,0x09,0x00,0x00,0xbc,0x09,0x00,0x00,0x7c,0x09,0x00,0x00,0x34,0x09,0x00,0x00,0xf8,0x08,0x00,0x00,0xc4,0x08,0x00,0x00,0x90,0x08,0x00,0x00,0x50,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0xcc,0x07,0x00,0x00,0x98,0x07,0x00,0x00,0x64,0x07,0x00,0x00,0x24,0x07,0x00,0x00,0xdc,0x06,0x00,0x00,0xa0,0x06,0x00,0x00,0x60,0x06,0x00,0x00,0x18,0x06,0x00,0x00,0xdc,0x05,0x00,0x00,0xa8,0x05,0x00,0x00,0x74,0x05,0x00,0x00,0x34,0x05,0x00,0x00,0xec,0x04,0x00,0x00,0xb0,0x04,0x00,0x00,0x7c,0x04,0x00,0x00,0x3c,0x04,0x00,0x00,0xf4,0x03,0x00,0x00,0xb8,0x03,0x00,0x00,0x78,0x03,0x00,0x00,0x30,0x03,0x00,0x00,0xf4,0x02,0x00,0x00,0xc0,0x02,0x00,0x00,0x80,0x02,0x00,0x00,0x38,0x02,0x00,0x00,0xfc,0x01,0x00,0x00,0xc8,0x01,0x00,0x00,0x88,0x01,0x00,0x00,0x40,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0xc4,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x10,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xea,0xef,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xce,0xf0,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0xc2,0xf0,0xff,0xff,0x00,0x00,0x00,0x05,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x0e,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x6e,0xf0,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0xf0,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0xaa,0xf0,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8e,0xf1,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb3,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x66,0xf2,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x72,0xf1,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x26,0xf1,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0xf1,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xe6,0xf2,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x52,0xfd,0xff,0x01,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x92,0xf1,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x76,0xf2,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x4e,0xf3,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5a,0xf2,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x0e,0xf2,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xf2,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0xce,0xf3,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x58,0x53,0xfd,0xff,0x01,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x7a,0xf2,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5e,0xf3,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x36,0xf4,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x42,0xf3,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xf6,0xf2,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe8,0xf2,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x32,0xf3,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x16,0xf4,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xee,0xf4,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfa,0xf3,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0xae,0xf3,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xa0,0xf3,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x6e,0xf5,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0x54,0xfd,0xff,0x01,0x00,0x00,0x00,0xa5,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x1a,0xf4,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfe,0xf4,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0xd6,0xf5,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe2,0xf4,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x96,0xf4,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x88,0xf4,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x56,0xf6,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe0,0x55,0xfd,0xff,0x01,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x86,0xf6,0xff,0xff,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x56,0xfd,0xff,0x01,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x32,0xf5,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x16,0xf6,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xee,0xf6,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfa,0xf5,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0xae,0xf5,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xa0,0xf5,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xea,0xf5,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xce,0xf6,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0xa6,0xf7,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb2,0xf6,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x66,0xf6,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x58,0xf6,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x26,0xf8,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb0,0x57,0xfd,0xff,0x01,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x56,0xf8,0xff,0xff,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe0,0x57,0xfd,0xff,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0xf7,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe6,0xf7,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xbe,0xf8,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xca,0xf7,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x7e,0xf7,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0xf7,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x3e,0xf9,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xc8,0x58,0xfd,0xff,0x01,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x6e,0xf9,0xff,0xff,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0x58,0xfd,0xff,0x01,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1a,0xf8,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfe,0xf8,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x92,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0xd6,0xf9,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe2,0xf8,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x96,0xf8,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x88,0xf8,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x56,0xfa,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe0,0x59,0xfd,0xff,0x01,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x02,0xf9,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe6,0xf9,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0xbe,0xfa,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xca,0xf9,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x7e,0xf9,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0xf9,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xba,0xf9,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9e,0xfa,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8b,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x76,0xfb,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x82,0xfa,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x36,0xfa,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x28,0xfa,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xf6,0xfb,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x5b,0xfd,0xff,0x01,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0xa2,0xfa,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x86,0xfb,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x87,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x5e,0xfc,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6a,0xfb,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x1e,0xfb,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0xfb,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xde,0xfc,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x5c,0xfd,0xff,0x01,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x0e,0xfd,0xff,0xff,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x5c,0xfd,0xff,0x01,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xba,0xfb,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9e,0xfc,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x76,0xfd,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x82,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x36,0xfc,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x28,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x72,0xfc,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x56,0xfd,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x2e,0xfe,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x3a,0xfd,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0xee,0xfc,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xe0,0xfc,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xae,0xfe,0xff,0xff,0x00,0x00,0x00,0x0b,0x03,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x5e,0xfd,0xff,0x01,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0xde,0xfe,0xff,0xff,0x00,0x00,0x00,0x16,0x02,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x68,0x5e,0xfd,0xff,0x01,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8a,0xfd,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6e,0xfe,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x46,0xff,0xff,0xff,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x52,0xfe,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x06,0xfe,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xfd,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x42,0xfe,0xff,0xff,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x26,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x07,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1a,0xff,0xff,0xff,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0xce,0xfe,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xc0,0xfe,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x16,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x07,0x00,0x10,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x1a,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x07,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x07,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0xc2,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xff,0xff,0xff,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x07,0x00,0x10,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x0c,0x00,0x07,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xd4,0x9e,0x02,0x00,0x84,0x9e,0x02,0x00,0x48,0x9e,0x02,0x00,0x0c,0x9e,0x02,0x00,0xac,0x9c,0x02,0x00,0xbc,0x9b,0x02,0x00,0xd8,0x93,0x02,0x00,0xf4,0x8b,0x02,0x00,0xf0,0x85,0x02,0x00,0xec,0x7f,0x02,0x00,0xe8,0x79,0x02,0x00,0xe4,0x73,0x02,0x00,0x90,0x6f,0x02,0x00,0x3c,0x6b,0x02,0x00,0xe8,0x66,0x02,0x00,0x94,0x62,0x02,0x00,0x30,0x5f,0x02,0x00,0xcc,0x5b,0x02,0x00,0x68,0x58,0x02,0x00,0x04,0x55,0x02,0x00,0xf0,0x52,0x02,0x00,0x8c,0x4f,0x02,0x00,0x28,0x4c,0x02,0x00,0xe4,0x46,0x02,0x00,0xa0,0x41,0x02,0x00,0x5c,0x3c,0x02,0x00,0x18,0x37,0x02,0x00,0x04,0x35,0x02,0x00,0xc0,0x2f,0x02,0x00,0x7c,0x2a,0x02,0x00,0xb8,0x23,0x02,0x00,0xa4,0x21,0x02,0x00,0x90,0x1f,0x02,0x00,0x9c,0x1e,0x02,0x00,0xd8,0x17,0x02,0x00,0x14,0x11,0x02,0x00,0x30,0x09,0x02,0x00,0x4c,0x01,0x02,0x00,0x68,0xf9,0x01,0x00,0x84,0xf1,0x01,0x00,0xd8,0xef,0x01,0x00,0xcc,0xee,0x01,0x00,0x70,0xed,0x01,0x00,0x84,0xea,0x01,0x00,0xe8,0xe7,0x01,0x00,0xfc,0xe4,0x01,0x00,0xb0,0xe2,0x01,0x00,0xf4,0xd7,0x01,0x00,0x08,0xd5,0x01,0x00,0x6c,0xc8,0x01,0x00,0x70,0xc6,0x01,0x00,0xd4,0xb9,0x01,0x00,0xe8,0xb6,0x01,0x00,0x4c,0xaa,0x01,0x00,0xb0,0xa7,0x01,0x00,0x34,0x9e,0x01,0x00,0x98,0x9b,0x01,0x00,0x1c,0x92,0x01,0x00,0x70,0x90,0x01,0x00,0xc4,0x89,0x01,0x00,0x88,0x86,0x01,0x00,0xdc,0x7f,0x01,0x00,0xe0,0x7d,0x01,0x00,0xc4,0x78,0x01,0x00,0xd8,0x75,0x01,0x00,0xbc,0x70,0x01,0x00,0xd0,0x6d,0x01,0x00,0xb4,0x68,0x01,0x00,0xb8,0x66,0x01,0x00,0x7c,0x5e,0x01,0x00,0x80,0x5c,0x01,0x00,0x44,0x54,0x01,0x00,0x48,0x52,0x01,0x00,0x0c,0x4a,0x01,0x00,0xd0,0x46,0x01,0x00,0x14,0x3c,0x01,0x00,0x30,0x3b,0x01,0x00,0x84,0x39,0x01,0x00,0xf0,0x37,0x01,0x00,0x10,0x34,0x01,0x00,0x68,0x31,0x01,0x00,0x88,0x2d,0x01,0x00,0x70,0x2b,0x01,0x00,0xc0,0x1f,0x01,0x00,0xe8,0x1c,0x01,0x00,0x58,0x0f,0x01,0x00,0x10,0x0d,0x01,0x00,0x80,0xff,0x00,0x00,0xa8,0xfc,0x00,0x00,0x80,0xef,0x00,0x00,0xd8,0xec,0x00,0x00,0x68,0xe2,0x00,0x00,0x20,0xe0,0x00,0x00,0x18,0xd6,0x00,0x00,0x60,0xd4,0x00,0x00,0xc0,0xcc,0x00,0x00,0xb8,0xc9,0x00,0x00,0x78,0xc2,0x00,0x00,0x30,0xc0,0x00,0x00,0x18,0xba,0x00,0x00,0x40,0xb7,0x00,0x00,0x28,0xb1,0x00,0x00,0xb0,0xae,0x00,0x00,0x00,0xa9,0x00,0x00,0xb8,0xa6,0x00,0x00,0x80,0x9d,0x00,0x00,0x38,0x9b,0x00,0x00,0x00,0x92,0x00,0x00,0x18,0x90,0x00,0x00,0x48,0x87,0x00,0x00,0xa0,0x84,0x00,0x00,0x64,0x83,0x00,0x00,0xd4,0x82,0x00,0x00,0xc4,0x80,0x00,0x00,0x28,0x7e,0x00,0x00,0x6c,0x7c,0x00,0x00,0x18,0x7b,0x00,0x00,0x14,0x78,0x00,0x00,0x08,0x75,0x00,0x00,0x54,0x73,0x00,0x00,0x50,0x70,0x00,0x00,0x34,0x6e,0x00,0x00,0xe0,0x6c,0x00,0x00,0x14,0x6c,0x00,0x00,0x48,0x6b,0x00,0x00,0x44,0x68,0x00,0x00,0x28,0x66,0x00,0x00,0x6c,0x64,0x00,0x00,0xc8,0x61,0x00,0x00,0x24,0x5f,0x00,0x00,0x68,0x5d,0x00,0x00,0x9c,0x5c,0x00,0x00,0xd0,0x5b,0x00,0x00,0x2c,0x59,0x00,0x00,0x88,0x56,0x00,0x00,0xcc,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x5c,0x51,0x00,0x00,0xa0,0x4f,0x00,0x00,0xec,0x4d,0x00,0x00,0x48,0x4b,0x00,0x00,0xa4,0x48,0x00,0x00,0x50,0x47,0x00,0x00,0x84,0x46,0x00,0x00,0xe0,0x43,0x00,0x00,0x24,0x42,0x00,0x00,0xd0,0x40,0x00,0x00,0x04,0x40,0x00,0x00,0x38,0x3f,0x00,0x00,0x94,0x3c,0x00,0x00,0xf0,0x39,0x00,0x00,0x34,0x38,0x00,0x00,0x68,0x37,0x00,0x00,0x9c,0x36,0x00,0x00,0xf8,0x33,0x00,0x00,0x3c,0x32,0x00,0x00,0x80,0x30,0x00,0x00,0xdc,0x2d,0x00,0x00,0x30,0x2b,0x00,0x00,0x74,0x29,0x00,0x00,0xa8,0x28,0x00,0x00,0xdc,0x27,0x00,0x00,0x38,0x25,0x00,0x00,0x8c,0x22,0x00,0x00,0x38,0x21,0x00,0x00,0x6c,0x20,0x00,0x00,0xc8,0x1d,0x00,0x00,0x0c,0x1c,0x00,0x00,0x50,0x1a,0x00,0x00,0xac,0x17,0x00,0x00,0x00,0x15,0x00,0x00,0x44,0x13,0x00,0x00,0x78,0x12,0x00,0x00,0xd4,0x0f,0x00,0x00,0x28,0x0d,0x00,0x00,0xd4,0x0b,0x00,0x00,0x08,0x0b,0x00,0x00,0x64,0x08,0x00,0x00,0xa8,0x06,0x00,0x00,0x4c,0x05,0x00,0x00,0xa8,0x02,0x00,0x00,0xd4,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1a,0x64,0xfd,0xff,0x00,0x00,0x00,0x09,0x5c,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x64,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x8d,0x5f,0x3d,0x01,0x00,0x00,0x00,0xcc,0x94,0xa1,0x40,0x01,0x00,0x00,0x00,0x6b,0xe3,0x0d,0xc1,0x08,0x00,0x00,0x00,0x49,0x64,0x65,0x6e,0x74,0x69,0x74,0x79,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8a,0x64,0xfd,0xff,0x00,0x00,0x00,0x09,0x3c,0x01,0x00,0x00,0xb7,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0x64,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x8d,0x5f,0x3d,0x01,0x00,0x00,0x00,0xcc,0x94,0xa1,0x40,0x01,0x00,0x00,0x00,0x6b,0xe3,0x0d,0xc1,0xe8,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xe2,0x65,0xfd,0xff,0x00,0x00,0x00,0x09,0xb4,0x00,0x00,0x00,0xb6,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x65,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x86,0xc7,0x91,0x3c,0x01,0x00,0x00,0x00,0xbe,0x35,0x91,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x41,0x76,0x67,0x50,0x6f,0x6f,0x6c,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x41,0x76,0x67,0x50,0x6f,0x6f,0x6c,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xb2,0x66,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0xb5,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xa4,0x66,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x86,0xc7,0x91,0x3c,0x01,0x00,0x00,0x00,0xbe,0x35,0x91,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x52,0x69,0xfd,0xff,0x00,0x00,0x00,0x09,0x3c,0x01,0x00,0x00,0xb4,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x69,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x88,0x89,0x0c,0x3d,0x01,0x00,0x00,0x00,0x99,0xbd,0x8e,0x40,0x01,0x00,0x00,0x00,0x62,0x3c,0x89,0xc0,0xe8,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xaa,0x6a,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0xb3,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9c,0x6a,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x62,0x6c,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0xb2,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0x6c,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x25,0xcc,0xa5,0x3c,0x01,0x00,0x00,0x00,0x59,0x26,0xa5,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x02,0x6f,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0x6e,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9a,0xd5,0xca,0x3d,0x01,0x00,0x00,0x00,0xa4,0x50,0x5a,0x41,0x01,0x00,0x00,0x00,0xe3,0xc4,0x39,0xc1,0x5b,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xca,0x6f,0xfd,0xff,0x00,0x00,0x00,0x09,0x34,0x01,0x00,0x00,0xb0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0x6f,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf2,0x5a,0x1d,0x3d,0x01,0x00,0x00,0x00,0x0f,0x39,0x9c,0x40,0x01,0x00,0x00,0x00,0x1f,0x42,0x9d,0xc0,0xe7,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1a,0x71,0xfd,0xff,0x00,0x00,0x00,0x09,0x8c,0x02,0x00,0x00,0xaf,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x71,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xc2,0x73,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0xae,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0x73,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xf4,0xc9,0x93,0x3c,0x01,0x00,0x00,0x00,0x2a,0x36,0x93,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x62,0x76,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0x76,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa8,0xa7,0x94,0x3d,0x01,0x00,0x00,0x00,0x90,0x0a,0x22,0x41,0x01,0x00,0x00,0x00,0x71,0x1b,0x06,0xc1,0x5b,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2a,0x77,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0xac,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x77,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe0,0x79,0x0c,0x3d,0x01,0x00,0x00,0x00,0xdb,0x04,0x8f,0x40,0x01,0x00,0x00,0x00,0xf1,0xd5,0x88,0xc0,0x49,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xe2,0x78,0xfd,0xff,0x00,0x00,0x00,0x09,0x8c,0x02,0x00,0x00,0xab,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x78,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x8a,0x7b,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0xaa,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0x7b,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xcc,0x87,0x95,0x3c,0x01,0x00,0x00,0x00,0x44,0xf2,0x94,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x2a,0x7e,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0xa9,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x7e,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x91,0xf1,0x78,0x3d,0x01,0x00,0x00,0x00,0x5c,0x1d,0x04,0x41,0x01,0x00,0x00,0x00,0x86,0xb6,0xe7,0xc0,0x49,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xe2,0x7f,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0xa8,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x7f,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x9a,0x81,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0xa7,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x81,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3a,0x84,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2c,0x84,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa3,0x2b,0xf2,0x3d,0x01,0x00,0x00,0x00,0x0f,0x8f,0x82,0x41,0x01,0x00,0x00,0x00,0xd0,0x54,0x5d,0xc1,0x5b,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x02,0x85,0xfd,0xff,0x00,0x00,0x00,0x09,0x34,0x01,0x00,0x00,0xa5,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0x84,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x89,0xdc,0x41,0x3d,0x01,0x00,0x00,0x00,0x88,0xf3,0xa4,0x40,0x01,0x00,0x00,0x00,0xd0,0x41,0xdd,0xc0,0xe7,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x52,0x86,0xfd,0xff,0x00,0x00,0x00,0x09,0x8c,0x02,0x00,0x00,0xa4,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x86,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xfa,0x88,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0xa3,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0x88,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x9a,0x8b,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x8b,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x85,0x48,0xdd,0x3d,0x01,0x00,0x00,0x00,0xc6,0x66,0x63,0x41,0x01,0x00,0x00,0x00,0xb3,0x6f,0x55,0xc1,0x5b,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x62,0x8c,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0x8c,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x78,0xb5,0x3d,0x01,0x00,0x00,0x00,0xfa,0x48,0x47,0x41,0x01,0x00,0x00,0x00,0x57,0x3c,0x22,0xc1,0x5b,0x00,0x00,0x00,0x50,0x61,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2a,0x8d,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0xa0,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x8d,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa1,0xc8,0x4e,0x3d,0x01,0x00,0x00,0x00,0x45,0xd9,0xc9,0x40,0x01,0x00,0x00,0x00,0x6a,0x1a,0xd2,0xc0,0x49,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xe2,0x8e,0xfd,0xff,0x00,0x00,0x00,0x09,0x8c,0x02,0x00,0x00,0x9f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x8e,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x8a,0x91,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x9e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0x91,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2a,0x94,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x9d,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x94,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x78,0xb5,0x3d,0x01,0x00,0x00,0x00,0xfa,0x48,0x47,0x41,0x01,0x00,0x00,0x00,0x57,0x3c,0x22,0xc1,0x49,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xe2,0x95,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x9c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x95,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x9a,0x97,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x9b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x97,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x3a,0x9a,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x9a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2c,0x9a,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xad,0x67,0x0c,0x3e,0x01,0x00,0x00,0x00,0xa4,0xe1,0x94,0x41,0x01,0x00,0x00,0x00,0xe6,0xd4,0x82,0xc1,0x5b,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x9b,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0x9a,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8c,0x64,0x0a,0x3e,0x01,0x00,0x00,0x00,0x13,0x54,0x90,0x41,0x01,0x00,0x00,0x00,0x3b,0x60,0x83,0xc1,0x5b,0x00,0x00,0x00,0x50,0x61,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x64,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xca,0x9b,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x98,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0x9b,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x35,0x16,0xb5,0x3d,0x01,0x00,0x00,0x00,0xe7,0x6a,0x5e,0x41,0x01,0x00,0x00,0x00,0x57,0x57,0x0a,0xc1,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x82,0x9d,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x97,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x74,0x9d,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x22,0xa0,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x96,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xa0,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xc2,0xa2,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x95,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xa2,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8c,0x64,0x0a,0x3e,0x01,0x00,0x00,0x00,0x13,0x54,0x90,0x41,0x01,0x00,0x00,0x00,0x3b,0x60,0x83,0xc1,0x5a,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x8a,0xa3,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0xa3,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe0,0xe3,0xa1,0x3d,0x01,0x00,0x00,0x00,0xe3,0xf7,0x27,0x41,0x01,0x00,0x00,0x00,0x15,0x8c,0x1a,0xc1,0x5a,0x00,0x00,0x00,0x50,0x61,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x52,0xa4,0xfd,0xff,0x00,0x00,0x00,0x09,0x34,0x01,0x00,0x00,0x93,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xa4,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xe0,0xe3,0xa1,0x3d,0x01,0x00,0x00,0x00,0xe3,0xf7,0x27,0x41,0x01,0x00,0x00,0x00,0x15,0x8c,0x1a,0xc1,0xe6,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0xa2,0xa5,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x92,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x94,0xa5,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x5a,0xa7,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x91,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0xa7,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xfa,0xa9,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0xa9,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0xe9,0xdc,0x3d,0x01,0x00,0x00,0x00,0x24,0x5f,0x6c,0x41,0x01,0x00,0x00,0x00,0x9a,0xb9,0x4b,0xc1,0x5a,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xc2,0xaa,0xfd,0xff,0x00,0x00,0x00,0x09,0x34,0x01,0x00,0x00,0x8f,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xaa,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0e,0x08,0x55,0x3d,0x01,0x00,0x00,0x00,0x02,0x88,0xcf,0x40,0x01,0x00,0x00,0x00,0x0a,0xde,0xd8,0xc0,0xe6,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x12,0xac,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x8e,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xac,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xb2,0xae,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x8d,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xa4,0xae,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x52,0xb1,0xfd,0xff,0x00,0x00,0x00,0x09,0x94,0x01,0x00,0x00,0x8c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xb1,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x97,0x2c,0xc1,0x3d,0x01,0x00,0x00,0x00,0x2d,0xf3,0x53,0x41,0x01,0x00,0x00,0x00,0xa6,0xe3,0x2c,0xc1,0x47,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x02,0xb3,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x8b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0xb2,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xba,0xb4,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x8a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xac,0xb4,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x5a,0xb7,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0xb7,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x87,0x16,0x4a,0x3e,0x01,0x00,0x00,0x00,0x98,0xf6,0xd3,0x41,0x01,0x00,0x00,0x00,0x47,0xa2,0xbe,0xc1,0x5a,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x22,0xb8,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x88,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xb8,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xdd,0xec,0xf2,0x3d,0x01,0x00,0x00,0x00,0x38,0x35,0x6a,0x41,0x01,0x00,0x00,0x00,0xa7,0xbe,0x79,0xc1,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xda,0xb9,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x87,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xcc,0xb9,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x7a,0xbc,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x86,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0xbc,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x1a,0xbf,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0xbf,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x2c,0x1f,0x3e,0x01,0x00,0x00,0x00,0x3b,0x8a,0xab,0x41,0x01,0x00,0x00,0x00,0x7e,0x8f,0x91,0xc1,0x5a,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xe2,0xbf,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0xbf,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf9,0x5c,0xee,0x3d,0x01,0x00,0x00,0x00,0x65,0x2b,0x84,0x41,0x01,0x00,0x00,0x00,0x6d,0x86,0x52,0xc1,0x5a,0x00,0x00,0x00,0x50,0x61,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xaa,0xc0,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x83,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9c,0xc0,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf9,0x5c,0xee,0x3d,0x01,0x00,0x00,0x00,0x65,0x2b,0x84,0x41,0x01,0x00,0x00,0x00,0x6d,0x86,0x52,0xc1,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x62,0xc2,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x82,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xc2,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x02,0xc5,0xfd,0xff,0x00,0x00,0x00,0x09,0x84,0x02,0x00,0x00,0x81,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0xc4,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xa2,0xc7,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x94,0xc7,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3d,0x0a,0x19,0x3e,0x01,0x00,0x00,0x00,0xe8,0x52,0x9f,0x41,0x01,0x00,0x00,0x00,0x7e,0x8f,0x91,0xc1,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x5a,0xc9,0xfd,0xff,0x00,0x00,0x00,0x09,0xfc,0x01,0x00,0x00,0x7f,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0xc9,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x72,0xcb,0xfd,0xff,0x00,0x00,0x00,0x09,0xe4,0x02,0x00,0x00,0x7e,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xcb,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x72,0xce,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xce,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xcd,0xaa,0x5b,0x3e,0x01,0x00,0x00,0x00,0x4e,0xca,0xcb,0x41,0x01,0x00,0x00,0x00,0xf5,0xd3,0xe9,0xc1,0x5a,0x00,0x00,0x00,0x61,0x64,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x61,0x64,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x3a,0xcf,0xfd,0xff,0x00,0x00,0x00,0x09,0xac,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2c,0xcf,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xcb,0xc8,0xe9,0x3d,0x01,0x00,0x00,0x00,0xfb,0xab,0x60,0x41,0x01,0x00,0x00,0x00,0x0a,0x12,0x71,0xc1,0x5a,0x00,0x00,0x00,0x50,0x61,0x64,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x64,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x02,0xd0,0xfd,0xff,0x00,0x00,0x00,0x09,0x34,0x01,0x00,0x00,0x7b,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0xcf,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xcb,0xc8,0xe9,0x3d,0x01,0x00,0x00,0x00,0xfb,0xab,0x60,0x41,0x01,0x00,0x00,0x00,0x0a,0x12,0x71,0xc1,0xe6,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x52,0xd1,0xfd,0xff,0x00,0x00,0x00,0x09,0xfc,0x01,0x00,0x00,0x7a,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xd1,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6a,0xd3,0xfd,0xff,0x00,0x00,0x00,0x09,0xe4,0x02,0x00,0x00,0x79,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0xd3,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6a,0xd6,0xfd,0xff,0x00,0x00,0x00,0x09,0x94,0x01,0x00,0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0xd6,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x58,0x3a,0x51,0x3e,0x01,0x00,0x00,0x00,0x1d,0xa6,0xcb,0x41,0x01,0x00,0x00,0x00,0x20,0x2c,0xd5,0xc1,0x47,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1a,0xd8,0xfd,0xff,0x00,0x00,0x00,0x09,0xec,0x02,0x00,0x00,0x77,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0xd8,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x22,0xdb,0xfd,0xff,0x00,0x00,0x00,0x09,0xe4,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xdb,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc1,0xc0,0xc0,0x3c,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x22,0xde,0xfd,0xff,0x00,0x00,0x00,0x09,0x34,0x01,0x00,0x00,0x75,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xde,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0xc9,0x12,0x3e,0x01,0x00,0x00,0x00,0x70,0x82,0x8a,0x41,0x01,0x00,0x00,0x00,0x7c,0xeb,0x99,0xc1,0xe5,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x31,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x72,0xdf,0xfd,0xff,0x00,0x00,0x00,0x09,0x9c,0x01,0x00,0x00,0x74,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xdf,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4b,0x2b,0xa3,0x3c,0x01,0x00,0x00,0x00,0x20,0x88,0xa2,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2a,0xe1,0xfd,0xff,0x00,0x00,0x00,0x09,0x7c,0x02,0x00,0x00,0x73,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0xe1,0xfd,0xff,0x30,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0xc9,0xaf,0x3c,0x01,0x00,0x00,0x00,0x47,0x19,0xaf,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2b,0x02,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xc2,0xe3,0xfd,0xff,0x00,0x00,0x00,0x09,0xf0,0x01,0x00,0x00,0x72,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xe3,0xfd,0xff,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x3d,0x13,0xb7,0x3c,0x01,0x00,0x00,0x00,0x2a,0x5c,0xb6,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x01,0x00,0x00,0x52,0x65,0x6c,0x75,0x36,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x52,0x65,0x6c,0x75,0x36,0x3b,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0xce,0xe5,0xfd,0xff,0x00,0x00,0x00,0x02,0x7c,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0xe6,0xfd,0xff,0x63,0x00,0x00,0x00,0x53,0x71,0x75,0x65,0x65,0x7a,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x71,0x75,0x65,0x65,0x7a,0x65,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x5a,0xe6,0xfd,0xff,0x00,0x00,0x00,0x02,0x28,0x01,0x00,0x00,0x70,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xe8,0xfd,0xff,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xb1,0xe8,0x90,0x37,0x34,0x7d,0x06,0x35,0xe7,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x92,0xe7,0xfd,0xff,0x00,0x00,0x00,0x02,0x94,0x02,0x00,0x00,0x6f,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x9c,0xe9,0xfd,0xff,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x6f,0xeb,0x0a,0x37,0x36,0x02,0x00,0x38,0x33,0xf6,0x03,0x37,0x65,0x57,0x19,0x37,0xdc,0x84,0xc1,0x37,0xa8,0x98,0x2b,0x37,0x1d,0x15,0x44,0x37,0xeb,0x62,0x46,0x37,0x88,0x7f,0x00,0x37,0x50,0x76,0xda,0x37,0x91,0xa4,0xda,0x37,0xa5,0x5c,0x3a,0x37,0x0f,0x48,0x4c,0x37,0x72,0xc1,0x28,0x37,0xb9,0xa7,0x87,0x37,0x74,0x2c,0xf9,0x37,0x8c,0x15,0x63,0x37,0x53,0xcb,0xf5,0x37,0x20,0xdc,0x0a,0x38,0x2a,0xaf,0xd4,0x37,0x7a,0x83,0x1c,0x37,0x89,0x31,0x37,0x37,0x18,0x7b,0x34,0x37,0xc8,0x31,0x20,0x37,0x9e,0xca,0x3e,0x37,0xb0,0x1a,0x2b,0x37,0x8f,0x0c,0x01,0x38,0x98,0xb3,0x1a,0x37,0x89,0x49,0x3b,0x37,0x83,0xb0,0x47,0x37,0x15,0x84,0x04,0x38,0x9b,0xa6,0xd9,0x37,0xe7,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x36,0xea,0xfd,0xff,0x00,0x00,0x00,0x09,0xb0,0x08,0x00,0x00,0x6e,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x42,0x4e,0xff,0xff,0x24,0x06,0x00,0x00,0x9c,0x04,0x00,0x00,0x14,0x03,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x0e,0x73,0xbc,0x3b,0x7e,0x64,0xc9,0x3b,0x7b,0xd3,0x09,0x3c,0xb4,0x85,0xba,0x3b,0xbe,0x05,0xad,0x3b,0x97,0xfb,0x11,0x3c,0x09,0xce,0xcb,0x3b,0x66,0x8b,0xe7,0x3b,0xb0,0xfc,0x24,0x3c,0x18,0x72,0xc3,0x3b,0x59,0xdd,0x19,0x3c,0xd5,0x5e,0xdc,0x3b,0x6c,0x6f,0xc7,0x3b,0x79,0x35,0xda,0x3b,0x74,0xb1,0xc8,0x3b,0xe3,0xf8,0xea,0x3b,0x91,0x7b,0xcb,0x3b,0x92,0x62,0x1d,0x3c,0xd4,0xd8,0xae,0x3b,0x13,0x52,0xed,0x3b,0x4e,0x95,0x0f,0x3c,0xf8,0x45,0xb6,0x3b,0xe9,0xbd,0xbb,0x3b,0x4f,0x75,0x11,0x3c,0x79,0x86,0xac,0x3b,0xe9,0x86,0xfc,0x3b,0x21,0x4f,0x9f,0x3b,0x00,0x6f,0xc3,0x3b,0x69,0x40,0xd6,0x3b,0x42,0xbf,0xee,0x3b,0x65,0xa5,0xb6,0x3b,0x1e,0x8d,0xfd,0x3b,0xa5,0x46,0xe7,0x3b,0x57,0x8d,0x0f,0x3c,0x4c,0x61,0xb2,0x3b,0x8a,0x7e,0x15,0x3c,0xbd,0xdb,0xb3,0x3b,0x9b,0xf7,0xdd,0x3b,0x00,0x21,0xea,0x3b,0xc6,0x9f,0xcc,0x3b,0x13,0xb5,0xfc,0x3b,0xcc,0x35,0x06,0x3c,0x41,0x03,0x96,0x3b,0xfe,0x36,0xe6,0x3b,0x96,0x8d,0xe4,0x3b,0x17,0xbd,0xc1,0x3b,0xe1,0xfa,0x3a,0x3c,0x60,0x70,0xe0,0x3b,0x00,0xf8,0x02,0x3c,0x33,0x0f,0x27,0x3c,0x68,0x88,0xe4,0x3b,0x20,0x88,0x04,0x3c,0x7e,0xa0,0xea,0x3b,0x54,0x18,0xb8,0x3b,0x6c,0x63,0xc2,0x3b,0xae,0x41,0xa3,0x3b,0x7f,0x2b,0xdb,0x3b,0x21,0x50,0xd0,0x3b,0x93,0x8d,0x08,0x3c,0x8e,0xe6,0xb6,0x3b,0xe4,0x82,0xc5,0x3b,0x84,0x22,0xd5,0x3b,0x2f,0x9f,0x17,0x3c,0xb6,0xa9,0xc9,0x3b,0xad,0xac,0x0b,0x3c,0x59,0x79,0x4b,0x3c,0x75,0xd9,0x0a,0x3c,0x15,0x42,0xca,0x3b,0xdf,0xaa,0xc8,0x3b,0x62,0x3c,0xa7,0x3b,0xa5,0x9c,0xd7,0x3b,0x53,0xda,0xfb,0x3b,0x80,0xe0,0xdc,0x3b,0x4b,0x0e,0xbd,0x3b,0xc7,0xf9,0xb2,0x3b,0xa8,0xb0,0xc4,0x3b,0x13,0x05,0xe0,0x3b,0x31,0xc7,0xeb,0x3b,0x25,0xcd,0x49,0x3c,0x1b,0x82,0xd4,0x3b,0x2f,0xf3,0xdf,0x3b,0x93,0x03,0xc8,0x3b,0x16,0xd4,0xda,0x3b,0x00,0x23,0xad,0x3b,0x9e,0xd5,0x0c,0x3c,0x61,0x42,0xb2,0x3b,0x48,0x9d,0xc9,0x3b,0x9b,0x67,0x04,0x3c,0x62,0xeb,0xcb,0x3b,0x95,0x46,0xd2,0x3b,0x9d,0x8a,0xaf,0x3b,0xa2,0xcc,0xe3,0x3b,0x3d,0xe3,0x1b,0x3c,0x19,0x9f,0xdf,0x3b,0x17,0x4a,0xef,0x3b,0xf1,0xce,0xeb,0x3b,0x60,0x00,0x00,0x00,0xf8,0xe3,0x5f,0xbd,0x13,0xbe,0x13,0x3e,0xd4,0xbf,0x88,0x3f,0xa9,0x10,0x39,0x3f,0xb3,0xab,0x2b,0x3f,0xa0,0xd7,0x90,0x3f,0x6d,0x36,0x4a,0x3f,0x6a,0x0c,0xff,0x3e,0xb7,0xb2,0xa3,0x3f,0x34,0xeb,0x41,0x3f,0x9e,0xa9,0x98,0x3f,0xe4,0x7d,0x35,0x3e,0x8d,0xe0,0x45,0x3f,0x0e,0x81,0x58,0x3f,0x11,0x20,0x47,0x3f,0xf1,0x22,0x69,0x3f,0x9a,0xe4,0x49,0x3f,0xcd,0x27,0x9c,0x3f,0x22,0x7b,0x2d,0x3f,0x69,0x14,0x16,0xbe,0x23,0x76,0x8e,0x3f,0xd9,0x1e,0xb1,0xbd,0x6d,0x46,0x3a,0x3f,0x64,0x52,0x90,0x3f,0x2a,0xf5,0x67,0xbd,0xdb,0x8d,0x7a,0x3f,0x83,0x10,0x1e,0x3f,0x22,0xe8,0x41,0x3f,0xe8,0x93,0x54,0x3f,0xc3,0xe1,0x6c,0x3f,0x1a,0x38,0x35,0x3f,0x04,0x92,0x7b,0x3f,0x73,0x48,0xfe,0x3e,0x75,0xb8,0xa4,0x3e,0x8c,0x32,0x3a,0x3e,0x8d,0x53,0x94,0x3f,0x06,0x74,0x32,0x3f,0xac,0x3b,0x5c,0x3f,0xbe,0x4c,0x68,0x3f,0x86,0x06,0x4b,0x3f,0x42,0x4b,0x74,0x3e,0x60,0x29,0x85,0x3f,0x3a,0xd7,0x14,0x3f,0x90,0x6a,0x64,0x3f,0x7b,0xc4,0x62,0x3f,0xef,0xc6,0x39,0x3f,0xeb,0x84,0xb9,0x3f,0x92,0x8f,0xc1,0x3d,0xe7,0xd9,0xb0,0xbe,0x15,0xc1,0xa5,0x3f,0x11,0x49,0x09,0x3e,0x10,0x7f,0x83,0x3f,0x3d,0xcb,0x68,0x3f,0x23,0xa8,0x36,0x3f,0x5a,0x70,0x76,0xbd,0x2b,0xfb,0x21,0x3f,0x28,0x75,0x59,0x3f,0x81,0xaf,0x4e,0x3f,0xa8,0x63,0x11,0xbb,0xc1,0x78,0x35,0x3f,0xde,0xf7,0x43,0x3f,0x3f,0x78,0x53,0x3f,0xf1,0x6f,0x96,0x3f,0x63,0x16,0x48,0x3f,0x67,0x30,0x10,0x3f,0x66,0xe2,0xc9,0x3f,0x6e,0x87,0xbd,0x3e,0x5a,0x59,0x7e,0xbd,0x89,0x19,0x47,0x3f,0xe9,0xed,0x25,0x3f,0x6c,0xed,0x55,0x3f,0xf2,0xf8,0x05,0x3e,0xbf,0x26,0x5b,0x3f,0xfd,0xe1,0x1b,0xbe,0xd3,0x93,0x31,0x3f,0x47,0x27,0x43,0x3f,0x09,0x45,0x5e,0x3f,0xa3,0xef,0x69,0x3f,0x8b,0x39,0xc8,0x3f,0x17,0xd9,0x52,0x3f,0x49,0x33,0x5e,0x3f,0x8c,0x73,0x46,0x3f,0x6e,0x1e,0x59,0x3f,0x25,0x9b,0x17,0x3e,0xf3,0xbb,0x8b,0x3f,0xdc,0xdd,0x30,0x3f,0x6c,0xa8,0x25,0x3e,0x0e,0xe4,0x1a,0xbe,0x8b,0x53,0x4a,0x3f,0x08,0xa2,0x50,0x3f,0x87,0x59,0x8b,0xbd,0x09,0x05,0x62,0x3f,0x77,0xab,0x9a,0x3f,0xdb,0xdf,0x5d,0x3f,0x83,0x6b,0x6d,0x3f,0x53,0xf7,0x69,0x3f,0x60,0x00,0x00,0x00,0x28,0xfa,0x3a,0xbf,0xb5,0xd1,0x47,0xbf,0xe6,0xaf,0x8c,0xbe,0xcb,0xcf,0x04,0xbf,0x06,0x4e,0xe7,0xbc,0x9b,0xa7,0x3a,0xbe,0x64,0x81,0x98,0xbc,0x4f,0xbc,0x65,0xbf,0x16,0xc5,0x62,0x3e,0x4a,0x5b,0xf6,0xbe,0x56,0xf8,0x70,0xbf,0x17,0xa6,0x5a,0xbf,0xd8,0x93,0x1b,0xbf,0x67,0xe1,0xc4,0xbb,0x9e,0x13,0x03,0xbf,0x0b,0xf4,0x05,0xbf,0xf8,0xcf,0xf3,0xb8,0x01,0xcd,0xa2,0xbe,0xe4,0x59,0x78,0xbc,0x6f,0x77,0x6b,0xbf,0x93,0x2a,0x3b,0xbf,0x6c,0xd9,0x34,0xbf,0x96,0x46,0xe6,0xbe,0xbf,0xd1,0x65,0xbe,0x6c,0x2d,0x2b,0xbf,0x27,0x40,0x6a,0xbe,0xc3,0x68,0xfb,0xbe,0x44,0x3e,0xce,0xbc,0x59,0x86,0x38,0xbd,0x98,0xdd,0x0f,0xbf,0xa7,0x54,0x8b,0xbd,0x04,0x2f,0xac,0xbd,0x18,0x78,0x65,0xbf,0x3c,0x6e,0x8e,0xbf,0x89,0xfc,0x30,0xbf,0xa5,0x7b,0x5c,0xbe,0xc7,0x11,0xe0,0xbe,0xa3,0x9d,0xf9,0xbc,0x2d,0x2b,0x8a,0xbe,0x85,0xa3,0x2e,0x3d,0xa9,0xbb,0x7a,0xbf,0xd2,0x25,0xd3,0xbe,0x21,0x4c,0x9c,0xbd,0x17,0xef,0x1b,0xbf,0xb3,0x5b,0x06,0xbf,0x9d,0x39,0x40,0xbf,0xf7,0x9a,0xbb,0xbe,0x7f,0xaf,0x5e,0xbf,0x10,0xf2,0x81,0xbf,0xef,0x01,0x5b,0xbf,0x57,0xbf,0x62,0xbf,0xea,0x46,0xaa,0xbe,0x29,0xa0,0x4e,0xbe,0x72,0x2b,0xee,0xbe,0xa5,0xde,0x40,0xbf,0x77,0xe8,0xc8,0xbe,0x65,0x80,0x59,0xbc,0xab,0xb5,0xbf,0xbe,0x78,0x7c,0x87,0xbf,0x53,0x1e,0x4e,0xbc,0xa0,0x8e,0x74,0xbc,0x74,0xa8,0x18,0xbe,0x0b,0x59,0x47,0xbe,0x52,0x04,0xac,0xbd,0x54,0x95,0x8a,0xbf,0xea,0x3b,0x3b,0xbf,0xc2,0xc3,0x89,0xbf,0x91,0xad,0x48,0xbf,0x54,0x27,0x86,0x3d,0xd3,0xa4,0x2c,0xbd,0x24,0x54,0x42,0xbc,0x9e,0xe2,0x79,0xbf,0x07,0xa6,0x9d,0xbd,0x2e,0x94,0x3b,0xbf,0xd7,0x50,0x31,0xbf,0x1a,0xc5,0xf9,0xbd,0x09,0xca,0xe6,0xbe,0x1c,0xfb,0x01,0xbf,0x3f,0x7a,0x6d,0xbe,0xd2,0x20,0xe9,0xbe,0xab,0x7a,0x00,0xbf,0xdc,0xfb,0xc0,0x3d,0xa3,0xc1,0x44,0xbc,0xba,0xc8,0x2b,0xbf,0x12,0x49,0x6f,0xbe,0xc1,0x92,0x15,0xbf,0x0d,0x0a,0x48,0xbf,0xcc,0x5e,0x83,0xbf,0xa3,0xbb,0x25,0x3d,0x3c,0x03,0xe7,0xbd,0x88,0x2b,0x2e,0xbf,0x77,0xcd,0xab,0xbe,0xce,0xd2,0xc6,0xbe,0x1d,0x4c,0xe9,0xbe,0x54,0x74,0x08,0xbf,0x23,0x51,0x51,0xbf,0xed,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x02,0xf3,0xfd,0xff,0x00,0x00,0x00,0x02,0xd4,0x01,0x00,0x00,0x6d,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0xf5,0xfd,0xff,0x90,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x42,0xcb,0x83,0x37,0x2d,0xa0,0x32,0x37,0xe8,0x59,0xd3,0x36,0x95,0xb0,0x20,0x37,0x5b,0x0a,0xcf,0x36,0x36,0xba,0x05,0x37,0x18,0xca,0x51,0x37,0x82,0xd7,0x0c,0x37,0x70,0x13,0xc6,0x36,0xec,0x67,0x23,0x37,0x44,0x73,0x67,0x37,0xc0,0x2a,0x36,0x37,0xe0,0xef,0x0c,0x37,0xf3,0x5a,0x29,0x37,0x5e,0xaa,0xfa,0x36,0x15,0x7f,0x1b,0x37,0xe6,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xe6,0xf4,0xfd,0xff,0x00,0x00,0x00,0x09,0x18,0x09,0x00,0x00,0x6c,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0xf2,0x58,0xff,0xff,0x24,0x06,0x00,0x00,0x9c,0x04,0x00,0x00,0x14,0x03,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xd2,0xa3,0x06,0x3c,0x5e,0x84,0xf6,0x3b,0x15,0xf2,0x22,0x3c,0x5c,0x28,0x1b,0x3c,0xcc,0x21,0xbb,0x3b,0x4f,0x0b,0xff,0x3b,0xe4,0xaa,0xe3,0x3b,0xa1,0x57,0x2a,0x3c,0x1c,0xa0,0x36,0x3c,0xcc,0xe1,0x2a,0x3c,0x2b,0xfe,0x0b,0x3c,0xc2,0x60,0xd5,0x3b,0x3d,0xea,0x11,0x3c,0x44,0xf8,0x3a,0x3c,0xd8,0xe5,0xed,0x3b,0x45,0x00,0xad,0x3b,0x74,0xfd,0x06,0x3c,0x74,0x16,0xd5,0x3b,0x11,0x2b,0x0c,0x3c,0x36,0x57,0xbb,0x3b,0xcb,0x94,0xde,0x3b,0x0c,0x9c,0x31,0x3c,0xb0,0x21,0x0c,0x3c,0xe4,0x3b,0xe1,0x3b,0x58,0x32,0xbc,0x3b,0xe3,0x11,0xba,0x3b,0xf2,0xc7,0xbd,0x3b,0xab,0x2c,0x17,0x3c,0xd0,0x88,0xe9,0x3b,0x57,0xcb,0xb1,0x3b,0x25,0x68,0x10,0x3c,0xf6,0xbb,0x0c,0x3c,0xb3,0x34,0x13,0x3c,0x7e,0x31,0xd6,0x3b,0x1a,0x81,0x16,0x3c,0x65,0x59,0xf9,0x3b,0x7c,0x3a,0xea,0x3b,0x55,0xaf,0xef,0x3b,0xb3,0x3e,0xee,0x3b,0x96,0xe0,0x09,0x3c,0xed,0x0e,0x1f,0x3c,0x15,0x34,0xe9,0x3b,0x6a,0xdc,0x2f,0x3c,0xfc,0xd4,0x12,0x3c,0x7a,0xfd,0xdb,0x3b,0x85,0x26,0xde,0x3b,0x9a,0xbb,0x15,0x3c,0xd1,0x7c,0xd7,0x3b,0xb9,0xbe,0xd6,0x3b,0x7b,0x1d,0xf7,0x3b,0x8e,0xd2,0x11,0x3c,0x00,0x33,0xcb,0x3b,0x9b,0xba,0x14,0x3c,0xf4,0x87,0xfb,0x3b,0x65,0xaf,0xaa,0x3b,0x03,0x71,0xe3,0x3b,0x90,0x8f,0x66,0x3c,0x75,0x20,0x19,0x3c,0x9a,0xb5,0x0a,0x3c,0x36,0xaa,0x21,0x3c,0xe1,0xf1,0xfc,0x3b,0x2e,0x95,0xef,0x3b,0xe7,0x19,0xfb,0x3b,0x87,0x6c,0x62,0x3c,0x8c,0x29,0x38,0x3c,0x4a,0x21,0xdd,0x3b,0x78,0xf3,0x43,0x3c,0x84,0x9c,0xf2,0x3b,0x2a,0xf3,0x00,0x3c,0xb4,0x77,0x0a,0x3c,0xd6,0x32,0xcd,0x3b,0x29,0xd1,0x0d,0x3c,0xb0,0x89,0xe8,0x3b,0x05,0x7f,0x12,0x3c,0x70,0x9e,0x03,0x3c,0x9b,0xa8,0x07,0x3c,0x28,0x99,0x2b,0x3c,0x65,0x3c,0xc7,0x3b,0x36,0x51,0xac,0x3b,0x2f,0x88,0x0b,0x3c,0xd3,0x69,0xd8,0x3b,0x0d,0x69,0x01,0x3c,0x25,0x83,0xd3,0x3b,0x63,0x2b,0x0b,0x3c,0x7a,0xd7,0xa1,0x3b,0x46,0x41,0xd4,0x3b,0x2d,0xdd,0xe2,0x3b,0x3d,0x3a,0x42,0x3c,0xd0,0x64,0xeb,0x3b,0xba,0xc8,0xf2,0x3b,0xde,0x4f,0x02,0x3c,0x46,0x3e,0xe8,0x3b,0x45,0xe1,0xd7,0x3b,0xc6,0xd6,0xf3,0x3b,0xcb,0xa6,0xf2,0x3b,0xf1,0xb5,0xcf,0x3b,0x60,0x00,0x00,0x00,0xfb,0x90,0x2b,0x3e,0x33,0x41,0x4c,0x3f,0x31,0xac,0xa1,0x3f,0x64,0x22,0x8b,0x3f,0x8b,0xf7,0x22,0x3f,0x96,0x72,0x4b,0x3f,0xaf,0xe0,0x33,0x3f,0xe5,0x34,0x61,0x3f,0x39,0xc9,0x73,0x3f,0x08,0xaa,0x8f,0x3f,0x2f,0xe6,0x8a,0x3f,0x00,0xb6,0x53,0x3f,0x69,0xc6,0x90,0x3f,0x53,0x82,0xb9,0x3f,0x0c,0x0a,0x6c,0x3f,0x44,0xa6,0x2b,0x3f,0x79,0xef,0x85,0x3f,0xce,0xba,0x3e,0x3f,0x6c,0xa2,0x5e,0x3f,0x88,0xe0,0x39,0x3f,0x1c,0x4a,0xca,0x3d,0x7b,0xbe,0x28,0x3f,0x6d,0x09,0x8b,0x3f,0x6c,0x79,0x5f,0x3f,0x1a,0x1c,0xf5,0x3e,0x0c,0xac,0xe5,0x3d,0xe6,0x86,0x72,0x3e,0x52,0xfe,0x95,0x3f,0xb3,0x14,0x2d,0x3f,0xc0,0x67,0x30,0x3f,0x56,0x12,0x5c,0x3f,0x7e,0xa2,0x8b,0x3f,0x4a,0x0e,0x92,0x3f,0x9e,0x7f,0xf3,0x3e,0x18,0x54,0x95,0x3f,0x3d,0x4e,0x55,0x3f,0x01,0x07,0x52,0x3f,0x20,0x5a,0x4a,0x3e,0x55,0x15,0x4b,0x3f,0xfa,0x72,0x45,0x3f,0xcf,0xd0,0x9d,0x3f,0xad,0x61,0x67,0x3f,0xb1,0x7c,0xae,0x3f,0x52,0xaf,0x91,0x3f,0x7f,0x45,0x5a,0x3f,0x38,0x6a,0x5c,0x3f,0x0d,0xea,0x35,0x3f,0xd7,0xcd,0x55,0x3f,0x3c,0x11,0x55,0x3f,0x40,0x2f,0x75,0x3f,0xe9,0xae,0x90,0x3f,0x9a,0x9c,0x49,0x3f,0x26,0x91,0x93,0x3f,0x6c,0xa8,0x5a,0x3f,0x71,0xb2,0x07,0x3f,0x21,0xaa,0x61,0x3f,0x57,0x74,0x1a,0x3f,0xc9,0xcd,0x74,0x3f,0x2f,0xa0,0x89,0x3f,0xea,0xc3,0x43,0x3f,0xfd,0xf7,0x7a,0x3f,0x3d,0xe3,0x46,0x3f,0xb3,0x23,0x79,0x3f,0xae,0xa7,0xe0,0x3f,0xba,0x56,0x2e,0x3f,0x00,0x08,0x51,0x3f,0x96,0x56,0xaa,0x3f,0x4b,0xb7,0x70,0x3f,0xc4,0xc9,0x39,0x3f,0xcc,0x43,0x4b,0x3f,0xe8,0x8f,0x1a,0x3f,0x9f,0xbe,0x36,0x3f,0x9d,0xb8,0x66,0x3f,0xad,0x00,0x4f,0x3f,0x03,0x7d,0xd6,0x3e,0x4a,0x99,0x86,0x3f,0xe9,0x41,0x7d,0x3f,0x42,0x0f,0xd0,0x3e,0x94,0xf8,0x2a,0x3f,0x1f,0x71,0x8a,0x3f,0xff,0xb8,0x56,0x3f,0x3b,0x66,0x80,0x3f,0x4b,0x9a,0x0e,0x3f,0x8a,0x67,0x23,0x3f,0xcb,0x93,0x20,0x3f,0xd6,0xf3,0x37,0x3f,0x73,0x17,0x61,0x3f,0xc9,0xb5,0xc0,0x3f,0x06,0x8e,0x69,0x3f,0x29,0xe3,0x70,0x3f,0xc7,0xf8,0x1d,0x3f,0xc9,0x6d,0x66,0x3f,0x82,0x31,0x56,0x3f,0x18,0xef,0x71,0x3f,0x7d,0xc1,0x70,0x3f,0x85,0x16,0x4e,0x3f,0x60,0x00,0x00,0x00,0x8a,0x96,0x85,0xbf,0x55,0x97,0x74,0xbf,0xea,0xa6,0x84,0xbf,0x0b,0xf2,0x99,0xbf,0x88,0xab,0x39,0xbf,0x38,0x0d,0x7d,0xbf,0x8e,0xe3,0x61,0xbf,0xf2,0x02,0xa9,0xbf,0xdc,0x32,0xb5,0xbf,0x08,0x8c,0xa9,0xbf,0x6b,0x29,0x0b,0xbf,0xd8,0xbb,0x44,0xbf,0xc2,0x52,0x0d,0xbf,0xcc,0x67,0xe1,0xbe,0xd9,0x7e,0x65,0xbf,0x37,0x62,0x0c,0xbf,0x7f,0x2a,0xcc,0xbe,0x47,0x6c,0x53,0xbf,0xbb,0x12,0x8b,0xbf,0xc9,0xf2,0xbf,0xbe,0xa1,0xd7,0x5c,0xbf,0xd4,0x38,0xb0,0xbf,0x42,0xc2,0x6e,0xbf,0xd1,0xd8,0x46,0xbf,0xf3,0xb9,0x3a,0xbf,0xbf,0x9d,0x38,0xbf,0x62,0x4c,0x3c,0xbf,0xb3,0xdd,0x89,0xbf,0xbe,0xb5,0x67,0xbf,0xa7,0xa6,0x9a,0xbe,0x55,0x47,0x8f,0xbf,0x96,0x25,0x04,0xbf,0xb8,0x64,0x7d,0xbf,0x1b,0x85,0x54,0xbf,0x1a,0x7e,0x91,0xbf,0xb2,0x66,0x77,0xbf,0x07,0x66,0x68,0xbf,0xf6,0xcf,0x6d,0xbf,0x36,0x62,0x6c,0xbf,0xd5,0xcc,0x88,0xbf,0x0f,0x2b,0x2b,0xbf,0x0e,0x9d,0x01,0xbf,0x44,0xa2,0x06,0xbf,0x04,0x9b,0x5f,0xbf,0xd7,0x9f,0xf7,0xbe,0xeb,0x75,0x14,0xbf,0x23,0x90,0x94,0xbf,0xe0,0x14,0x1f,0xbf,0x29,0xda,0xd1,0xbe,0xd6,0xb0,0x68,0xbf,0x36,0x2e,0x1c,0xbf,0xd6,0x1b,0xd9,0xbe,0x41,0xcf,0xee,0xbe,0xe4,0x90,0x79,0xbf,0x06,0x5a,0x29,0xbf,0xe7,0x41,0x55,0xbf,0x71,0xc2,0xe4,0xbf,0x34,0xee,0x97,0xbf,0x1f,0x6b,0x87,0xbf,0xe2,0x66,0xa0,0xbf,0x7a,0x90,0x3a,0xbf,0x04,0xb6,0x6d,0xbf,0xdd,0x22,0x3d,0xbf,0xbe,0xf3,0x53,0xbf,0x39,0xb9,0xb6,0xbf,0x07,0x67,0x5b,0xbf,0x91,0x6b,0xc2,0xbf,0xd5,0x43,0x30,0xbf,0x87,0xe2,0x7f,0xbf,0xc5,0x62,0x89,0xbf,0x70,0x98,0x4b,0xbf,0x87,0xb5,0x8c,0xbf,0xb0,0x57,0x45,0xbf,0x07,0x5a,0x91,0xbf,0x33,0x97,0x82,0xbf,0x64,0x3c,0x5a,0xbf,0xf6,0x41,0xaa,0xbf,0xec,0xad,0x45,0xbf,0x7b,0x19,0xbc,0xbe,0x9c,0xc6,0x45,0xbf,0x40,0xfe,0xb3,0xbe,0x3c,0xd1,0x32,0xbf,0x1f,0xdc,0x51,0xbf,0x0c,0x15,0x8a,0xbf,0x49,0xc4,0xad,0xbe,0xc3,0x98,0x52,0xbf,0xfd,0xdb,0x35,0xbf,0xff,0xae,0x72,0xbf,0xed,0x2d,0x4b,0xbf,0x35,0x94,0x37,0xbf,0x3e,0x4b,0x81,0xbf,0x11,0x2e,0xcb,0xbe,0x10,0xc3,0x41,0xbf,0x03,0x03,0xfd,0xbe,0xcc,0x77,0x57,0xbf,0x04,0xa5,0xbf,0xbe,0x54,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x1a,0xfe,0xfd,0xff,0x00,0x00,0x00,0x02,0x34,0x02,0x00,0x00,0x6b,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0x00,0xfe,0xff,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0e,0x7a,0x51,0x37,0xdf,0xb2,0xa9,0x37,0xe1,0x0a,0xcf,0x36,0x59,0x80,0x07,0x37,0xb5,0xef,0x57,0x36,0x86,0xf9,0xbe,0x36,0x3c,0x5d,0x0c,0x37,0x3b,0xf3,0x7a,0x37,0x71,0x91,0xe5,0x36,0x4a,0x1b,0xf1,0x36,0xfb,0xe5,0x8c,0x37,0x93,0x92,0x2c,0x37,0x56,0xd5,0xe1,0x36,0x1b,0xd0,0x04,0x37,0xe5,0x0f,0xa4,0x36,0x0a,0x54,0x19,0x37,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x5e,0x00,0xfe,0xff,0x00,0x00,0x00,0x09,0x18,0x09,0x00,0x00,0x6a,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x6a,0x64,0xff,0xff,0x24,0x06,0x00,0x00,0x9c,0x04,0x00,0x00,0x14,0x03,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x44,0xbe,0xc2,0x3b,0xec,0x5b,0xac,0x3b,0x75,0x78,0x26,0x3c,0xdc,0x54,0xda,0x3b,0x0b,0xf8,0x17,0x3c,0x2d,0x54,0x9a,0x3b,0x90,0xdb,0x08,0x3c,0xde,0x1d,0x09,0x3c,0x01,0xf6,0x0c,0x3c,0x43,0x17,0x07,0x3c,0x85,0x59,0x2a,0x3c,0x87,0xd6,0x4c,0x3c,0xc5,0x30,0xf4,0x3b,0x31,0x47,0xc6,0x3b,0xfb,0xf0,0xb5,0x3b,0x7b,0x27,0xc9,0x3b,0x7c,0x82,0xde,0x3b,0x1a,0x0e,0xd1,0x3b,0x0f,0x9c,0x5e,0x3c,0xbc,0xd5,0x17,0x3c,0x20,0x96,0x32,0x3c,0xd8,0xac,0xc9,0x3b,0x11,0x72,0xdc,0x3b,0x1c,0x85,0x2e,0x3c,0xc8,0x46,0xcb,0x3b,0x64,0xd8,0xe0,0x3b,0x06,0xd9,0x21,0x3c,0xfd,0x20,0xb8,0x3b,0xf8,0x9b,0xb4,0x3b,0x49,0xc2,0x01,0x3c,0x0e,0xad,0x0d,0x3c,0x4d,0x15,0x36,0x3c,0x69,0x6f,0x2c,0x3c,0x6f,0x7b,0xf7,0x3b,0xc5,0x7d,0x01,0x3c,0x5e,0x93,0x0c,0x3c,0xea,0x20,0x04,0x3c,0x6d,0x82,0x03,0x3c,0x59,0x26,0xe1,0x3b,0x8c,0x49,0x10,0x3c,0x35,0xd2,0xbb,0x3b,0x81,0xfc,0xb5,0x3b,0xf7,0x04,0x22,0x3c,0xa3,0xda,0xc9,0x3b,0x43,0x15,0xb5,0x3b,0x56,0xad,0xea,0x3b,0x07,0x30,0xd2,0x3b,0x9b,0x07,0x01,0x3c,0x7d,0xb3,0x0f,0x3c,0x41,0xf7,0xbd,0x3b,0x30,0xfe,0xb2,0x3b,0xf7,0x3c,0x09,0x3c,0x7a,0x19,0x0e,0x3c,0xdb,0xb7,0xd3,0x3b,0xce,0xe4,0x38,0x3c,0x86,0xce,0x00,0x3c,0xca,0x04,0xd8,0x3b,0x43,0xf0,0xb8,0x3b,0x6f,0x75,0xa6,0x3b,0xff,0x36,0xc7,0x3b,0xcf,0x65,0xea,0x3b,0x12,0x53,0xc1,0x3b,0x25,0x83,0x00,0x3c,0x88,0x0e,0xe2,0x3b,0x49,0x07,0xde,0x3b,0xe6,0xcb,0x14,0x3c,0xe8,0xcf,0xd7,0x3b,0xc9,0xe7,0x03,0x3c,0x85,0xb0,0xac,0x3b,0x76,0x9d,0xe7,0x3b,0xa1,0xdd,0x42,0x3c,0x76,0xb0,0x0d,0x3c,0xdc,0x7a,0xc6,0x3b,0xa1,0x5e,0xd6,0x3b,0xe0,0x12,0xb7,0x3b,0x2f,0x82,0xe4,0x3b,0x68,0x23,0x3b,0x3c,0xd2,0xae,0xfb,0x3b,0xfb,0x38,0x1e,0x3c,0x8d,0xd5,0xf5,0x3b,0x3c,0x8a,0x1f,0x3c,0x91,0x63,0x0f,0x3c,0x9a,0x3e,0xc3,0x3b,0x75,0x38,0xb9,0x3b,0xee,0x33,0xab,0x3b,0xf2,0x7e,0x15,0x3c,0x2e,0xcf,0x2b,0x3c,0x02,0x81,0xbe,0x3b,0x80,0xf5,0xbc,0x3b,0xfd,0x5e,0xf9,0x3b,0x54,0xe8,0xb9,0x3b,0x6c,0x74,0xbd,0x3b,0xaa,0xb1,0x4d,0x3c,0x0a,0xf3,0xa8,0x3b,0xc4,0x02,0x1e,0x3c,0x39,0xbe,0xc7,0x3b,0x60,0x00,0x00,0x00,0xfd,0x98,0xfc,0x3e,0x34,0x03,0x2b,0x3f,0x4e,0x73,0x5d,0x3f,0x27,0x4e,0x29,0x3f,0xc0,0x5e,0x65,0x3f,0x7e,0xc8,0xcb,0x3d,0xd9,0xc9,0x87,0x3f,0xa2,0x0b,0x88,0x3f,0x15,0xdc,0x8b,0x3f,0x14,0x09,0x86,0x3f,0xd2,0x04,0xa9,0x3f,0x73,0xfd,0xb2,0x3e,0x63,0x48,0x72,0x3f,0xc5,0x4b,0x3f,0x3e,0x19,0x85,0x34,0x3f,0x2c,0x95,0x47,0x3f,0x77,0xc5,0x5c,0x3f,0xfe,0x6b,0x4f,0x3f,0xd7,0xde,0xdc,0x3f,0x11,0xa6,0x96,0x3f,0xf4,0x30,0xb1,0x3f,0xf5,0xae,0x17,0x3f,0x94,0xcf,0xfb,0x3e,0x12,0x28,0xad,0x3f,0x3a,0xb0,0x49,0x3f,0xb3,0x16,0x5f,0x3f,0x54,0x95,0xa0,0x3f,0xf8,0xbc,0x23,0x3f,0xc0,0x32,0x33,0x3f,0xc4,0xbe,0x80,0x3f,0x82,0xff,0x4c,0x3f,0x22,0xa9,0xb4,0x3f,0x8a,0x16,0xab,0x3f,0x11,0xa6,0xde,0xbd,0xc9,0x7a,0x80,0x3f,0x37,0x7a,0x8b,0x3f,0x55,0x30,0x37,0x3f,0xc2,0x2a,0x82,0x3f,0x0c,0x64,0x5f,0x3f,0xf9,0x28,0x8f,0x3f,0x91,0x5a,0x3a,0x3f,0xfc,0x0e,0x0d,0x3c,0xed,0xc0,0xa0,0x3f,0xee,0x46,0x48,0x3f,0x18,0xab,0x33,0x3f,0xfb,0xd7,0x68,0x3f,0xa7,0x8b,0x50,0x3f,0xdf,0x78,0xcc,0x3d,0x16,0x94,0x8e,0x3f,0x0d,0xc8,0x09,0x3f,0x34,0x98,0x31,0x3f,0x7d,0x2a,0x88,0x3f,0x47,0xfd,0x8c,0x3f,0x6b,0x10,0x52,0x3f,0xf4,0xa1,0x61,0x3f,0x96,0xab,0xec,0x3e,0xe1,0x0b,0xae,0x3d,0x62,0x7e,0x37,0x3f,0xa7,0xf1,0x04,0xbe,0x91,0xa8,0x45,0x3f,0x03,0x91,0x68,0x3f,0x6c,0xd0,0x3f,0x3f,0x3e,0x04,0x7f,0x3f,0x6b,0x4a,0x60,0x3f,0x50,0x30,0x21,0x3f,0x4e,0xa2,0x93,0x3f,0x48,0x20,0x56,0x3f,0xf9,0xdf,0x82,0x3f,0x24,0x57,0x2b,0x3f,0x3b,0xce,0x65,0x3f,0xe6,0x57,0xc1,0x3f,0x20,0x8e,0x96,0x3e,0xe6,0xed,0x44,0x3f,0xe4,0xb1,0x54,0x3f,0xba,0xa4,0x35,0x3f,0x3d,0xd7,0xea,0x3d,0x21,0xad,0xb9,0x3f,0x74,0xb7,0x79,0x3f,0x89,0xfc,0x9c,0x3f,0xe2,0xe9,0x73,0x3f,0x5a,0x3b,0xe8,0x3e,0x76,0x58,0x73,0x3f,0x1d,0xb8,0x41,0x3f,0x04,0xc6,0x37,0x3f,0x86,0xdd,0x29,0x3f,0xf4,0x53,0x94,0x3f,0x90,0x77,0xaa,0x3f,0x04,0xde,0x20,0x3f,0xf2,0x69,0x09,0x3f,0x3f,0x6c,0x77,0x3f,0x83,0x74,0x38,0x3f,0x83,0xf9,0x3b,0x3f,0x47,0x16,0xcc,0x3f,0x52,0x6f,0x98,0xbc,0xb3,0x99,0x59,0x3f,0xbd,0x2e,0x46,0x3f,0x60,0x00,0x00,0x00,0xc7,0x38,0x41,0xbf,0x42,0xa5,0x77,0xbc,0x84,0x2b,0xa5,0xbf,0x32,0xa0,0x58,0xbf,0x1b,0xc8,0x96,0xbf,0x85,0x1f,0x19,0xbf,0x2b,0xa0,0x54,0xbf,0xec,0x40,0x7c,0xbf,0x3b,0x34,0x82,0xbf,0xb1,0x0b,0x0e,0xbf,0x82,0xcc,0xfd,0xbe,0xda,0x3c,0xcb,0xbf,0x3a,0x53,0x10,0xbf,0xa3,0xba,0x44,0xbf,0x4b,0x8b,0xa9,0xbc,0x54,0x15,0x18,0xbf,0x6a,0x28,0x0d,0xbf,0xab,0xdc,0xec,0xbe,0xe5,0x5e,0x8c,0xbf,0x93,0x94,0x50,0xbf,0x1a,0xfc,0x71,0xbf,0x7e,0x19,0x48,0xbf,0x2d,0xb9,0x5a,0xbf,0xc5,0x3c,0x9d,0xbf,0xb6,0x75,0x5f,0x3d,0xd2,0xc6,0xf6,0xbd,0x04,0xec,0x0a,0xbf,0xbb,0xb0,0x36,0xbf,0x73,0x63,0xc4,0xbd,0x93,0x72,0x73,0xbf,0xb4,0x91,0x8c,0xbf,0x9d,0xb0,0x29,0xbf,0x39,0x6f,0x30,0xbf,0x78,0x8c,0x75,0xbf,0x9a,0xbc,0x06,0xbf,0xd8,0xb6,0x35,0xbf,0xa8,0x18,0x83,0xbf,0x68,0x7b,0x82,0xbf,0xe9,0x5c,0x13,0xbf,0x77,0x8c,0x3e,0xbf,0xd3,0x10,0x81,0x3c,0x88,0x90,0x34,0xbf,0x32,0xcf,0x10,0xbf,0x34,0x40,0xe4,0xbd,0x14,0x70,0xa2,0xbe,0xd4,0x03,0x1f,0xbf,0x82,0xf3,0x5e,0xbe,0x8c,0x05,0x80,0xbf,0x26,0x63,0x63,0xbf,0x52,0x7b,0x3c,0xbf,0x2a,0x24,0xca,0xbd,0xb4,0x10,0x64,0xbf,0x5c,0x49,0x5b,0xbf,0xf2,0xd9,0x07,0xbf,0x04,0x73,0xb7,0xbf,0xd2,0x99,0x7f,0xbf,0xc0,0x54,0x56,0xbf,0xb7,0xaa,0x16,0x3d,0x84,0x28,0x25,0xbf,0xa6,0x9d,0x11,0xbf,0xaf,0x30,0x20,0xbf,0xfa,0x3c,0x4a,0x3c,0xe7,0x96,0xde,0xbc,0xd5,0xe8,0x19,0xbf,0x3a,0x4b,0x5c,0xbf,0x0a,0x7b,0x8c,0xbf,0xf9,0x09,0x7f,0xbe,0x3e,0xc1,0x66,0xbf,0xde,0xf0,0x83,0x3d,0x8f,0xca,0x07,0xbf,0x66,0x16,0x32,0xbf,0x15,0x95,0x8c,0xbf,0x6b,0xee,0x96,0xbd,0xa6,0xd4,0x47,0xbf,0x76,0x31,0x16,0xbf,0x2b,0xb9,0x62,0xbf,0xbc,0x80,0xe4,0xbe,0x00,0xc6,0x33,0xbf,0x62,0xdb,0xa4,0xbe,0x9b,0x54,0x51,0xbf,0x28,0x4b,0x9e,0xbf,0xca,0x44,0x8e,0xbf,0x6f,0xf2,0x3c,0xbc,0xdf,0x19,0x8f,0xbe,0xab,0x04,0x53,0x3a,0x3f,0xbe,0x00,0xbf,0x46,0x37,0xd6,0xbe,0x00,0x04,0x3d,0xbf,0x95,0x7b,0x3b,0xbf,0xf7,0xb6,0x1a,0xbf,0x34,0x93,0x12,0xbf,0xc3,0xb6,0x57,0x3c,0xe5,0x70,0xb8,0xbe,0x24,0xa1,0x27,0xbf,0xbe,0xc6,0x9c,0xbf,0xd2,0x98,0x1e,0xbf,0x54,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x92,0x09,0xfe,0xff,0x00,0x00,0x00,0x02,0x34,0x02,0x00,0x00,0x69,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9c,0x0b,0xfe,0xff,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xa1,0x67,0x36,0x38,0xd8,0x4c,0x45,0x38,0x26,0x31,0x59,0x38,0x0f,0x62,0x95,0x38,0xbe,0x5f,0x4d,0x38,0xe3,0xd1,0x34,0x38,0x3d,0xdb,0x78,0x38,0x77,0xbd,0x9d,0x38,0x40,0xd7,0x0f,0x38,0xa4,0xb8,0x20,0x38,0x82,0x64,0x2a,0x38,0x8d,0x0c,0x91,0x38,0xe4,0x7b,0x09,0x38,0xa7,0x61,0x0a,0x38,0x86,0xc3,0x41,0x38,0x09,0x88,0x45,0x38,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xd6,0x0b,0xfe,0xff,0x00,0x00,0x00,0x09,0x90,0x05,0x00,0x00,0x68,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0xe2,0x6f,0xff,0xff,0xa4,0x03,0x00,0x00,0xbc,0x02,0x00,0x00,0xd4,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x12,0x2a,0x96,0x3b,0x89,0xe0,0x72,0x3b,0xef,0xc1,0x15,0x3b,0xc4,0xb5,0x43,0x3b,0xa8,0x20,0x92,0x3b,0xe2,0x76,0x1d,0x3b,0x3e,0xd4,0xbc,0x3b,0x36,0x0b,0xba,0x3b,0xbf,0x4b,0xb2,0x3b,0x06,0x54,0xac,0x3b,0x6e,0x90,0xbe,0x3b,0x30,0xfc,0xb4,0x3b,0x3f,0x0a,0x89,0x3b,0x7b,0xc0,0xce,0x3b,0xb5,0xe7,0x42,0x3b,0x17,0x9b,0x6c,0x3b,0x1a,0x70,0x6f,0x3b,0x9b,0xe0,0x36,0x3b,0xd7,0x1a,0x4f,0x3b,0x84,0xb6,0x8d,0x3b,0x39,0xcb,0x4d,0x3b,0x34,0x8d,0xf1,0x3b,0xb0,0x12,0x8d,0x3b,0x4e,0x8e,0x7c,0x3b,0xa6,0xc4,0x44,0x3b,0x30,0x71,0x97,0x3b,0x9c,0x39,0xa8,0x3b,0xf4,0xbc,0x95,0x3b,0xda,0x0e,0x34,0x3c,0x78,0x89,0x55,0x3b,0x50,0x5d,0x3b,0x3b,0x64,0x38,0xcf,0x3b,0x95,0xa7,0xce,0x3b,0xba,0xde,0xa1,0x3b,0x49,0xd8,0x02,0x3c,0xfe,0xe4,0x43,0x3b,0x77,0x70,0x8f,0x3b,0xeb,0xcb,0x99,0x3b,0x62,0x22,0xab,0x3b,0xb9,0x1b,0x64,0x3b,0x3e,0xcd,0x94,0x3b,0xac,0x35,0x90,0x3b,0x9a,0x02,0xc5,0x3b,0x91,0x67,0x7a,0x3b,0x5e,0xa8,0x4d,0x3b,0xad,0xd9,0x55,0x3b,0x99,0xbe,0x9d,0x3b,0x1f,0xcc,0x58,0x3b,0xc3,0x62,0xd4,0x3b,0x91,0x27,0x6c,0x3b,0x43,0xe8,0x8d,0x3b,0xe1,0x9b,0x44,0x3b,0x80,0x98,0x92,0x3b,0x14,0xde,0x36,0x3b,0x49,0x81,0x33,0x3b,0xd2,0x11,0x93,0x3b,0x38,0x00,0x00,0x00,0xbe,0xfd,0x14,0x3f,0xc8,0xfa,0xf0,0x3e,0x6b,0x96,0x94,0x3e,0x15,0x1b,0x93,0xbc,0x22,0x7b,0xe4,0x3e,0x2c,0xba,0x36,0xbd,0x16,0x7a,0x29,0xbe,0x41,0xcc,0xd8,0x3e,0xb4,0xd4,0xb7,0x3e,0x65,0x88,0xb6,0x3e,0x4d,0x13,0x3d,0x3f,0x66,0x67,0x83,0x3e,0x9a,0xb2,0x25,0xbd,0xfa,0x22,0x4d,0x3f,0xa8,0xbc,0x26,0xbd,0x5d,0x23,0xed,0xbc,0x91,0x12,0xd4,0x3e,0xda,0x72,0xb5,0x3e,0xa1,0x7c,0xcd,0x3e,0x3d,0xe1,0xda,0x3d,0xa3,0x2f,0xcc,0x3e,0xa3,0x7f,0x79,0x3e,0x8b,0xf8,0x0b,0x3f,0xbc,0xe6,0x92,0xbd,0x84,0x45,0x1a,0x3e,0x4e,0x42,0x16,0x3f,0x29,0xe9,0x26,0x3f,0xa4,0x49,0xca,0x3e,0xbc,0xa6,0xb2,0x3f,0x65,0xde,0xd3,0x3e,0x95,0xe6,0xb9,0x3e,0xd5,0x9f,0xb3,0x3e,0xfd,0x27,0x12,0x3f,0x79,0xb2,0x90,0x3d,0x98,0xd2,0x81,0x3f,0x34,0x5d,0xc2,0x3e,0x57,0x11,0x99,0x3e,0x6b,0xbd,0x82,0x3e,0x6a,0x42,0xd4,0x3e,0xd7,0xda,0xd3,0xbc,0x2a,0xf2,0x26,0x3d,0xfb,0x07,0x3e,0x3e,0x95,0x78,0x43,0x3f,0x2e,0x91,0x9f,0x3e,0x44,0xc7,0xb9,0xbd,0x0c,0xeb,0xa4,0x3d,0x1c,0x83,0x1c,0x3f,0x87,0x1a,0xd7,0x3e,0xa2,0xc9,0x83,0x3e,0x42,0x4f,0xea,0x3e,0x51,0xd7,0x04,0x3f,0xa9,0x12,0xc3,0x3e,0x4f,0x73,0x11,0x3f,0x1b,0x0d,0x7c,0xbc,0x5f,0x68,0xef,0xbd,0xae,0xeb,0x11,0x3f,0x38,0x00,0x00,0x00,0xf5,0xce,0xd0,0xbe,0xfa,0x1e,0xe7,0xbe,0xf4,0xd2,0xbe,0x3c,0x58,0x2e,0xc2,0xbe,0x67,0xfc,0x10,0xbf,0xf4,0x3b,0x9c,0xbe,0x96,0x5a,0x3b,0xbf,0x20,0x97,0x38,0xbf,0x28,0xe7,0x30,0xbf,0x5e,0xfb,0x2a,0xbf,0x08,0xb0,0x2b,0xbd,0x38,0x92,0x33,0xbf,0x2b,0xf8,0x07,0xbf,0x62,0x55,0xde,0xbd,0xe6,0x61,0xc1,0xbe,0xe1,0xc1,0xea,0xbe,0x3a,0x91,0xed,0xbe,0xec,0xf9,0x8c,0xbd,0x6d,0x7f,0x62,0xbd,0x17,0x9b,0x0c,0xbf,0xdb,0x3f,0x15,0xbb,0x1a,0xaa,0x6f,0xbf,0xc8,0x27,0x05,0xbf,0x31,0x95,0xfa,0xbe,0x1d,0x3b,0xc3,0xbe,0xc7,0xad,0xee,0xbe,0x30,0x13,0xa1,0xbc,0x7a,0x91,0x14,0xbf,0xcd,0x77,0x53,0xbe,0x05,0xe7,0x26,0xbd,0xe5,0x51,0xe1,0xbc,0xf3,0x99,0x4d,0xbf,0x46,0x0a,0x4d,0xbf,0xfd,0x9a,0x20,0xbf,0xdd,0x83,0xfb,0xbe,0x20,0xb3,0x2e,0xba,0x96,0x51,0x0e,0xbf,0x53,0x98,0x18,0xbf,0x1d,0xcc,0x29,0xbf,0x82,0x53,0xe2,0xbe,0xa4,0xa3,0x13,0xbf,0x41,0x15,0x0f,0xbf,0x2f,0xde,0x27,0xbf,0xc2,0x72,0xf8,0xbe,0x0d,0x0d,0xcc,0xbe,0xfa,0x2d,0xd4,0xbe,0x83,0x9e,0x03,0xbf,0x2e,0x80,0x0f,0xbe,0xfd,0xb9,0x52,0xbf,0xa6,0xed,0xeb,0xbd,0x72,0xcc,0x0c,0xbf,0x80,0xcb,0x81,0xbe,0x0f,0xa0,0xe2,0xbc,0x58,0x70,0xb5,0xbe,0x46,0x1a,0xb2,0xbe,0x36,0xa4,0x68,0xbe,0xec,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x82,0x11,0xfe,0xff,0x00,0x00,0x00,0x02,0x64,0x02,0x00,0x00,0x67,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x13,0xfe,0xff,0xf0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xa2,0xae,0x34,0x38,0x1e,0x18,0x13,0x38,0xb5,0x09,0xc7,0x37,0xf6,0x2a,0xc1,0x37,0x6b,0x11,0x6f,0x37,0xef,0xd5,0x9a,0x38,0xfb,0x51,0x08,0x38,0x52,0xd5,0xd0,0x37,0x99,0x9a,0xb9,0x37,0x8c,0x14,0x36,0x38,0x24,0xe3,0xdd,0x37,0xd5,0x28,0x8d,0x37,0x58,0xd0,0x5f,0x38,0xfd,0xc5,0x12,0x38,0x4a,0xae,0x6d,0x38,0xa1,0x9c,0x93,0x38,0xee,0xd8,0x51,0x38,0xfc,0x01,0x9f,0x38,0xa1,0x1e,0xb5,0x38,0xb5,0x5f,0x2d,0x38,0xe1,0xff,0x4d,0x38,0xd6,0x31,0x2f,0x38,0x27,0x6d,0xdc,0x38,0xfa,0x5c,0xe5,0x37,0x2d,0x20,0xd1,0x37,0x6a,0x1c,0x0f,0x38,0x7a,0x6f,0x8b,0x38,0x73,0x1a,0x4b,0x38,0xe6,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xf6,0x13,0xfe,0xff,0x00,0x00,0x00,0x09,0xf8,0x05,0x00,0x00,0x66,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x78,0xff,0xff,0xa4,0x03,0x00,0x00,0xbc,0x02,0x00,0x00,0xd4,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xb6,0xd7,0x8b,0x3b,0x96,0x62,0x91,0x3b,0x92,0x2e,0xe8,0x3b,0x77,0xa4,0x17,0x3c,0xa5,0xc0,0xd4,0x3b,0xf4,0x08,0x9a,0x3b,0xcf,0x96,0x90,0x3b,0x16,0xca,0xd9,0x3b,0xb0,0xe6,0x8d,0x3b,0x90,0x6e,0x45,0x3b,0x33,0x1b,0xb5,0x3b,0xc3,0x23,0xac,0x3b,0xe3,0x16,0x9e,0x3b,0x08,0x3a,0x80,0x3b,0x1a,0xd6,0xce,0x3b,0xef,0x55,0xe2,0x3b,0x92,0x87,0x82,0x3b,0x22,0xdb,0xcf,0x3b,0x54,0xb2,0x9b,0x3b,0x52,0xd3,0xac,0x3b,0x31,0x49,0x72,0x3b,0x44,0x58,0x94,0x3b,0x2a,0xfc,0xdf,0x3b,0xf6,0x59,0xf8,0x3b,0x41,0x8a,0x86,0x3b,0x25,0x82,0xc2,0x3b,0xf4,0x43,0xab,0x3b,0xa2,0xda,0x8c,0x3b,0xf0,0xc5,0xb8,0x3b,0xe7,0x1f,0x9f,0x3b,0xbd,0x15,0x7a,0x3b,0xbf,0x28,0xa8,0x3b,0xf4,0x94,0xa5,0x3b,0xd6,0x29,0x14,0x3c,0x6d,0x1b,0x51,0x3b,0xbf,0x34,0xd5,0x3b,0x21,0xd0,0xca,0x3b,0x5a,0x40,0x95,0x3b,0x5e,0x1d,0xdb,0x3b,0x92,0x95,0x50,0x3b,0x19,0x63,0x69,0x3b,0xc8,0xa6,0x9e,0x3b,0x5a,0x68,0x13,0x3c,0xae,0x24,0xcf,0x3b,0xbc,0x6d,0x9a,0x3b,0xca,0x64,0xba,0x3b,0x54,0x04,0x05,0x3c,0xb0,0xd4,0xc3,0x3b,0x22,0x3e,0x59,0x3b,0x80,0xae,0x6d,0x3b,0xc3,0xdc,0x3b,0x3b,0x9e,0x14,0x4c,0x3b,0x50,0x34,0x85,0x3b,0x07,0xa0,0x3c,0x3b,0x9c,0x59,0xdb,0x3b,0x6a,0xe5,0x82,0x3b,0x38,0x00,0x00,0x00,0x07,0xc0,0x0a,0x3f,0xd1,0x3f,0x10,0x3f,0x62,0x42,0x0d,0x3f,0x2e,0x75,0x96,0x3f,0x24,0x17,0x53,0x3f,0xe2,0xd4,0x18,0x3f,0x31,0xb2,0xb3,0x3e,0x6d,0x4f,0x15,0x3f,0x20,0xea,0x00,0x3f,0xb3,0xe3,0xc3,0x3e,0xc1,0xff,0xd4,0x3e,0x7b,0xcb,0x2a,0x3f,0xf5,0x9c,0x1a,0x3f,0x27,0x73,0xfe,0x3e,0xa3,0xa7,0x31,0x3f,0x43,0x91,0x60,0x3f,0x83,0x82,0x01,0x3f,0xba,0xf6,0x42,0x3e,0xef,0x7a,0x1a,0x3f,0x2e,0x9b,0xf4,0x3e,0xb6,0x6f,0x23,0x3e,0x93,0x2f,0x13,0x3f,0xea,0xf6,0x2e,0x3f,0x86,0xba,0x5f,0x3f,0xda,0x36,0x00,0x3e,0xef,0xd8,0x7d,0x3e,0x6c,0xed,0x29,0x3f,0xcf,0x4e,0x90,0x3e,0x33,0xb0,0xdf,0x3e,0xa7,0xe1,0x1d,0x3f,0x92,0x21,0xf8,0x3e,0xb6,0x8c,0xa1,0x3e,0x92,0x5e,0x95,0x3e,0x82,0x01,0x93,0x3f,0x18,0xd4,0x8b,0x3e,0xd1,0xfc,0x1f,0x3f,0x81,0x3a,0x49,0x3f,0x7d,0xb1,0xd5,0x3e,0xcd,0x6c,0x18,0x3e,0x67,0xf4,0xce,0x3e,0x53,0x90,0xe7,0x3e,0x7a,0x69,0x1d,0x3f,0x89,0x41,0x92,0x3f,0x65,0x86,0x4d,0x3f,0xe1,0x38,0x19,0x3f,0x00,0xf0,0x38,0x3f,0x4b,0xfa,0x83,0x3f,0x07,0x4d,0x42,0x3f,0xa6,0x8b,0xd7,0x3e,0xb4,0x33,0xea,0x3e,0x09,0x65,0xba,0x3e,0x27,0x28,0x85,0xbb,0x8c,0x1a,0x91,0x3e,0xc7,0x26,0xbb,0x3e,0x13,0x68,0x0c,0x3e,0x9f,0xdf,0x01,0x3f,0x38,0x00,0x00,0x00,0xcd,0x54,0xe3,0xbd,0xb1,0x09,0xa5,0xbe,0x35,0x5e,0x66,0xbf,0x3d,0x30,0x62,0xbf,0xfd,0x67,0x05,0xbf,0x90,0xe5,0x6a,0xbe,0xa1,0x75,0x0f,0xbf,0x82,0x16,0x58,0xbf,0xe3,0xca,0x0c,0xbf,0x28,0xc3,0x35,0xbd,0xfd,0xb0,0x33,0xbf,0x6d,0xe4,0xf2,0xbd,0xb5,0xda,0x1c,0xbf,0xb5,0x03,0x7d,0xbe,0x6e,0x38,0x4d,0xbf,0xd8,0xae,0xa4,0xbe,0xb5,0x2f,0xf2,0xbe,0x6c,0x3b,0x4e,0xbf,0xb6,0x2b,0xa0,0xbd,0xab,0x79,0x2b,0xbf,0x9f,0x64,0xf0,0xbe,0xfb,0x90,0x0a,0xbe,0x32,0x3c,0x5e,0xbf,0x42,0x69,0x76,0xbf,0x2c,0x7d,0x05,0xbf,0x21,0xfd,0x40,0xbf,0x6e,0x97,0xb4,0xbe,0xed,0xc0,0x0b,0xbf,0x64,0x54,0x37,0xbf,0x22,0x57,0xf2,0xbe,0x4a,0x5a,0xee,0xbe,0x6e,0xd8,0x26,0xbf,0xca,0x49,0x24,0xbf,0xad,0x6b,0x8c,0xbf,0x36,0x79,0xcf,0xbe,0x56,0x8a,0x53,0xbf,0x66,0x14,0xe6,0xbe,0xd9,0x15,0x14,0xbf,0x23,0x67,0x59,0xbf,0x1e,0x9a,0xf2,0xbc,0xfb,0x04,0x3c,0xbd,0x0e,0xa0,0x8f,0xbe,0xb1,0x8c,0x90,0xbf,0x3f,0x4d,0x33,0xbf,0x2b,0x5e,0x14,0xbf,0x74,0x31,0x81,0xbe,0x08,0xea,0x79,0xbf,0x48,0x25,0x0b,0xbf,0xb5,0xfe,0x9e,0xbd,0x23,0xd3,0xeb,0xbe,0x65,0x75,0x99,0x3d,0x75,0x7c,0xca,0xbe,0xe7,0x29,0x04,0xbf,0xb4,0x52,0x87,0xbd,0xe9,0xa2,0x59,0xbf,0x12,0x18,0xff,0xbe,0x54,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0a,0x1a,0xfe,0xff,0x00,0x00,0x00,0x02,0xc4,0x02,0x00,0x00,0x65,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x1c,0xfe,0xff,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x19,0xf4,0xae,0x38,0x58,0xef,0xe4,0x37,0x3f,0x46,0x43,0x38,0x1e,0x01,0xd2,0x37,0x74,0xc6,0xcf,0x37,0xbf,0x63,0x90,0x38,0x6a,0xa4,0x1e,0x38,0xcd,0x78,0xdd,0x37,0x55,0xb8,0x41,0x38,0x5e,0xb7,0xdb,0x38,0x21,0xb5,0x66,0x38,0xde,0xfe,0x17,0x38,0x7c,0x59,0x16,0x39,0x95,0x98,0xf7,0x37,0xf1,0x46,0x4b,0x38,0xeb,0xef,0x43,0x38,0xd9,0x00,0x52,0x38,0xa7,0x8b,0xad,0x38,0x73,0x43,0x36,0x38,0xfb,0x5b,0x0c,0x39,0x18,0xc6,0x5d,0x38,0xe5,0x7e,0x6a,0x38,0xe1,0xa6,0x64,0x38,0x07,0x99,0x31,0x38,0x8c,0x78,0x57,0x38,0xb3,0x76,0x01,0x38,0x81,0xf8,0x9f,0x38,0x74,0x41,0x83,0x38,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xde,0x1c,0xfe,0xff,0x00,0x00,0x00,0x09,0xf8,0x05,0x00,0x00,0x64,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0xea,0x80,0xff,0xff,0xa4,0x03,0x00,0x00,0xbc,0x02,0x00,0x00,0xd4,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x13,0x27,0xd5,0x3b,0xcb,0x59,0x59,0x3b,0x8d,0xec,0xb7,0x3b,0x74,0x38,0x52,0x3b,0x67,0xbf,0x6b,0x3b,0x8f,0x61,0xe6,0x3b,0x41,0x06,0xb9,0x3b,0xaf,0x17,0x88,0x3b,0x85,0xf4,0x9a,0x3b,0xb4,0x60,0xf1,0x3b,0x44,0x66,0x78,0x3b,0x19,0x19,0x50,0x3b,0xbc,0x77,0xb7,0x3b,0x9d,0x2d,0x02,0x3c,0x72,0x88,0xdc,0x3b,0x8e,0x6a,0x9c,0x3b,0xf0,0xfd,0x95,0x3b,0x5d,0x7d,0x85,0x3b,0xc5,0x54,0xaf,0x3b,0x4f,0x05,0x17,0x3c,0x87,0xe5,0x9d,0x3b,0xab,0xf8,0xf4,0x3b,0x0d,0x40,0xa7,0x3b,0x6c,0xca,0x9f,0x3b,0xf7,0xdc,0xa6,0x3b,0x2b,0xf3,0x09,0x3c,0x30,0x0e,0xec,0x3b,0x59,0x5e,0xdb,0x3b,0x1a,0x72,0xc4,0x3b,0x50,0x0a,0x9c,0x3b,0x50,0xd0,0xc1,0x3b,0xd1,0x94,0xbf,0x3b,0x61,0xf4,0x08,0x3c,0xe7,0x2c,0x2f,0x3c,0x77,0xa5,0xd7,0x3b,0x79,0xfc,0xba,0x3b,0x61,0xaf,0x33,0x3c,0xcb,0x5b,0xdf,0x3b,0x93,0x25,0xcd,0x3b,0x4f,0x96,0xd0,0x3a,0x69,0xdc,0x7e,0x3b,0x46,0x73,0x97,0x3b,0x0e,0xbb,0x0c,0x3c,0x62,0xc0,0x0c,0x3b,0x67,0xb3,0xb3,0x3b,0xfd,0x8c,0x12,0x3c,0x7c,0x4f,0xac,0x3b,0x84,0x9f,0xc5,0x3b,0xfc,0x7a,0x80,0x3b,0x12,0xfb,0xbf,0x3b,0x55,0xdf,0x7c,0x3b,0xb1,0x61,0x17,0x3c,0x32,0x53,0xd3,0x3b,0x5d,0x9b,0x99,0x3b,0x7e,0x7b,0xb9,0x3b,0x7e,0x83,0xcc,0x3b,0x38,0x00,0x00,0x00,0xd2,0x5b,0xd3,0x3e,0x17,0xa7,0xd7,0x3e,0xb4,0x7c,0x36,0x3f,0xb7,0x75,0x10,0x3d,0xe8,0xe7,0xe9,0x3e,0xcf,0x60,0x56,0x3f,0xe0,0xfd,0x4d,0x3e,0x00,0x7f,0x39,0x3e,0x9c,0xbe,0x19,0x3f,0xf3,0x7d,0x6f,0x3f,0x77,0x75,0xf6,0x3e,0xb0,0x2a,0xcb,0xbb,0xcd,0x08,0x36,0x3f,0x42,0x29,0x81,0x3f,0x61,0xcf,0x5a,0x3f,0x45,0x9e,0xf2,0x3e,0x7c,0x9a,0xfc,0x3e,0x62,0x72,0x04,0x3f,0x1b,0xf6,0x2d,0x3f,0x44,0xd7,0x95,0x3f,0x73,0x52,0xb9,0x3e,0xb2,0xd8,0x5e,0x3f,0xcf,0xc4,0x1e,0x3f,0xfd,0x43,0x02,0x3f,0x3d,0x8f,0x25,0x3f,0x04,0xdb,0x55,0x3f,0x07,0x3f,0xfb,0x3d,0x6a,0x8f,0xdf,0x3e,0x1c,0xf4,0xf7,0x3e,0xfc,0xfa,0x73,0x3e,0x41,0x3f,0x8c,0x3e,0xa7,0x15,0x3e,0x3f,0x42,0xf5,0xc3,0x3d,0x78,0x33,0xfa,0x3e,0xef,0xd6,0x22,0x3e,0x80,0x86,0x39,0x3f,0x6c,0xa1,0x93,0x3f,0x13,0x9d,0x5d,0x3f,0x48,0x8b,0x4b,0x3f,0x22,0xf5,0x4e,0x3e,0xb0,0xde,0xfc,0x3e,0x3d,0x9d,0x0e,0x3f,0x98,0xa1,0x8b,0x3f,0xe1,0xa6,0x8b,0x3e,0xea,0x25,0x0e,0xbe,0xf2,0xaa,0x85,0x3f,0x53,0x3d,0x28,0x3f,0x93,0x73,0xe6,0x3e,0x0b,0xff,0x9d,0x3e,0x1c,0x7b,0x3e,0x3f,0x96,0xe5,0xfa,0x3e,0xee,0x32,0x96,0x3f,0xe3,0xb0,0xb3,0x3e,0xd8,0x34,0xff,0x3d,0x87,0x08,0x38,0x3f,0x46,0x6e,0x4a,0x3e,0x38,0x00,0x00,0x00,0xc5,0x7c,0x53,0xbf,0xe1,0xbd,0xad,0x3d,0x31,0xa5,0x0d,0xbf,0x03,0x94,0xd0,0xbe,0x77,0xe1,0xe8,0xbe,0xcc,0x94,0x64,0xbf,0x34,0x94,0x37,0xbf,0x80,0x07,0x07,0xbf,0x49,0x23,0x2a,0xbd,0x91,0x7e,0x62,0xbf,0xda,0x7d,0xeb,0xbd,0xe7,0x78,0xce,0xbe,0xb2,0x16,0x51,0xbe,0x78,0x60,0x68,0xbf,0xa2,0x98,0x59,0xbf,0xb9,0x31,0x1b,0xbf,0xf4,0xd1,0x14,0xbf,0xcf,0x00,0xc9,0x3c,0x81,0xe8,0x07,0xbf,0xe3,0x44,0xf3,0xbe,0xbc,0xa9,0x1c,0xbf,0xba,0x0e,0x73,0xbf,0x8d,0xf1,0x25,0xbf,0xd7,0x8a,0x1e,0xbf,0x8d,0xbe,0x4d,0xbe,0x45,0xdf,0x88,0xbf,0x14,0x36,0x6a,0xbf,0x9c,0xa7,0x59,0xbf,0x36,0xe9,0x42,0xbf,0x3b,0xd2,0x1a,0xbf,0xaf,0x4c,0x40,0xbf,0x80,0x10,0x33,0xbf,0x78,0xe2,0x87,0xbf,0x8d,0xce,0xad,0xbf,0x2c,0xf6,0x55,0xbf,0x46,0xa7,0x93,0xbe,0x02,0x48,0xb2,0xbf,0x76,0x3c,0xca,0xbe,0x4e,0xb5,0x3f,0xbe,0x92,0xf6,0x79,0x3c,0x17,0xc8,0xea,0xbe,0x5f,0x44,0x16,0xbf,0xcb,0x02,0x76,0xbf,0xf0,0x02,0x87,0x3d,0x00,0x4c,0x32,0xbf,0xe3,0x67,0x91,0xbf,0xdd,0xf6,0x2a,0xbf,0x45,0x14,0x44,0xbf,0x0c,0xf4,0xfe,0xbe,0xe7,0x5d,0x26,0xbf,0x0b,0x9b,0x13,0xbe,0xc1,0x23,0x6c,0xbf,0x8c,0xac,0x51,0xbf,0x26,0x68,0x18,0xbf,0x16,0xcb,0x56,0xbe,0x77,0xea,0x4a,0xbf,0x54,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xf2,0x22,0xfe,0xff,0x00,0x00,0x00,0x02,0x34,0x02,0x00,0x00,0x63,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xfc,0x24,0xfe,0xff,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x89,0x1e,0xe4,0x38,0xfd,0x71,0x67,0x38,0x5b,0x3d,0x8c,0x38,0x1e,0xfb,0x49,0x38,0xe3,0xa1,0x9c,0x38,0x3f,0xd7,0xb7,0x38,0x3a,0x79,0x58,0x38,0x32,0x1c,0x6b,0x38,0xdb,0x05,0x81,0x38,0x42,0xb8,0xb8,0x38,0x61,0x86,0xe8,0x38,0x1b,0xff,0x73,0x38,0xa0,0x28,0xd4,0x38,0x2c,0xd7,0xc3,0x38,0x85,0xdc,0x72,0x38,0x0c,0x1a,0x49,0x38,0x48,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x36,0x25,0xfe,0xff,0x00,0x00,0x00,0x09,0x20,0x07,0x00,0x00,0x62,0x00,0x00,0x00,0x24,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x42,0x89,0xff,0xff,0xe4,0x04,0x00,0x00,0xac,0x03,0x00,0x00,0x74,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x83,0xac,0xa7,0x3b,0xbc,0xb3,0x49,0x3c,0xdb,0x5e,0xeb,0x3b,0x2d,0x40,0xa6,0x3b,0x4d,0x52,0x8d,0x3b,0x80,0xa5,0xf6,0x3b,0x33,0xab,0x02,0x3c,0x7f,0xf2,0xdf,0x3b,0x20,0x0d,0x0e,0x3c,0x84,0xf1,0xf1,0x3b,0x20,0x2f,0x90,0x3b,0x2d,0x1c,0x10,0x3c,0x9f,0x59,0xa6,0x3b,0x2e,0x12,0x01,0x3c,0xa2,0xd6,0x4e,0x3b,0x9d,0x5a,0x6c,0x3b,0x4e,0x80,0x38,0x3c,0x26,0xac,0xe9,0x3b,0x8a,0x45,0x0b,0x3c,0xd6,0x60,0xaa,0x3b,0xee,0x95,0x98,0x3b,0x81,0x10,0xc3,0x3b,0x7c,0xc0,0x9c,0x3b,0x90,0x39,0xbc,0x3b,0x0b,0xa4,0xa9,0x3b,0xd0,0x58,0x1f,0x3c,0x5a,0x42,0xc3,0x3b,0x8b,0x9b,0xe4,0x3b,0x1a,0x87,0xf9,0x3b,0xe0,0xaa,0xbb,0x3b,0xf5,0x1a,0xb3,0x3b,0xec,0xa5,0x05,0x3c,0x0b,0xb3,0xb5,0x3b,0xaf,0xb1,0x3b,0x3c,0x52,0x34,0xd6,0x3b,0x59,0xf7,0xeb,0x3b,0x24,0x24,0x24,0x3c,0x51,0x73,0x60,0x3c,0x8d,0x2d,0x54,0x3b,0x33,0xd6,0xa2,0x3b,0xb0,0x29,0xa4,0x3b,0x03,0xd4,0xe0,0x3b,0xfd,0xde,0xc5,0x3b,0x7f,0x77,0x10,0x3c,0xa3,0xa4,0xff,0x3b,0x9b,0xd5,0x01,0x3c,0x53,0x1b,0x5b,0x3c,0xfd,0xac,0xd2,0x3b,0xbb,0xf3,0x08,0x3c,0xff,0xde,0x04,0x3c,0x93,0x40,0xec,0x3b,0xc7,0x2e,0xd1,0x3b,0x2d,0x77,0xd0,0x3b,0x14,0xa1,0x29,0x3c,0x30,0xb4,0x10,0x3c,0xe1,0x59,0xc3,0x3b,0x75,0x2d,0x08,0x3c,0xc7,0xf1,0x09,0x3c,0xb3,0x1e,0xf9,0x3b,0x37,0x96,0x89,0x3c,0x4f,0x33,0xe3,0x3b,0x0c,0x8f,0xb3,0x3b,0x7c,0xd1,0xc9,0x3b,0xab,0x27,0xe6,0x3b,0x64,0xce,0x3e,0x3c,0x6b,0x39,0xc0,0x3b,0x48,0xe5,0x5d,0x3c,0x09,0xa6,0x2e,0x3c,0x17,0xb3,0x01,0x3c,0xc4,0xfc,0xf7,0x3b,0x87,0xf4,0xed,0x3b,0xfc,0xcb,0xe3,0x3b,0xa7,0x51,0xbc,0x3b,0x32,0x24,0x04,0x3c,0xde,0xa9,0x09,0x3c,0xd5,0x59,0x69,0x3b,0x4c,0x00,0x00,0x00,0x2a,0x5d,0x26,0x3f,0x55,0x20,0xc8,0x3f,0x1d,0x88,0x69,0x3f,0xad,0xf3,0x24,0x3f,0xaf,0x25,0x87,0xbe,0x53,0xf1,0x71,0x3f,0x0e,0xa8,0xe7,0x3d,0x9a,0x32,0x5e,0x3f,0x06,0xf1,0x8c,0x3f,0xa1,0x0d,0x70,0x3f,0xdd,0xa2,0x8a,0xbe,0xf5,0xfb,0x8e,0x3f,0xec,0x0c,0x25,0x3f,0x0a,0x10,0x80,0x3f,0xf5,0x38,0xcd,0x3e,0x60,0x90,0x43,0xbe,0x4d,0x0f,0xb7,0x3f,0xce,0xd8,0x67,0x3f,0xdd,0x5e,0x82,0x3f,0x14,0x0c,0x29,0x3f,0x22,0x14,0x4e,0xbe,0x60,0x8a,0x41,0x3f,0x8a,0x0f,0x07,0x3f,0x4c,0x44,0x10,0x3e,0xc3,0x50,0x28,0x3f,0x1e,0x1a,0x9e,0x3f,0xd5,0xbb,0x41,0x3f,0x54,0xd2,0x62,0x3f,0x0d,0x1c,0xc0,0xbd,0x8a,0x33,0x3a,0x3f,0xa1,0xe2,0xb5,0xbd,0xa0,0x9a,0x84,0x3f,0xa5,0x47,0x34,0x3f,0x50,0x3d,0x7c,0x3f,0xe9,0x87,0x54,0x3f,0x6a,0x1f,0x6a,0x3f,0xcb,0xb9,0xa0,0x3f,0x6a,0xb2,0xde,0x3f,0x32,0x85,0xd2,0x3e,0x87,0x90,0x21,0x3f,0x73,0x10,0xc7,0xbd,0xf4,0xaa,0x24,0x3f,0x3f,0x53,0x44,0x3f,0x90,0x56,0x8f,0x3f,0xf6,0x26,0x63,0x3f,0xf0,0xd1,0x80,0x3f,0x1c,0x65,0xd9,0x3f,0xa3,0x07,0x51,0x3f,0xd4,0xe1,0x87,0x3f,0x41,0xd5,0x83,0x3f,0x2c,0xc5,0xcd,0x3d,0xd5,0x94,0x32,0xbe,0x3f,0xd6,0x4e,0x3f,0xd2,0x4d,0xa8,0x3f,0xc8,0x92,0x8f,0x3f,0x1c,0xac,0x1c,0xbd,0x1a,0x1d,0x87,0x3f,0x8c,0xa3,0x09,0x3e,0x76,0x2c,0x77,0x3f,0x0b,0x83,0x08,0x40,0x28,0x18,0x2f,0x3f,0x7e,0xd5,0xb8,0xbd,0xd2,0x6c,0x43,0x3f,0xf6,0x32,0x58,0x3f,0x7f,0xd7,0x56,0x3f,0xf8,0xb8,0x3e,0x3f,0x94,0x0e,0x7f,0x3f,0xbd,0x48,0xad,0x3f,0xb1,0xaf,0x80,0x3f,0xca,0x0c,0x76,0x3f,0x9e,0x18,0x6c,0x3f,0x64,0x04,0x62,0x3f,0x1c,0xef,0xc8,0x3e,0x38,0x84,0xa9,0xbe,0x7a,0x7f,0x68,0x3f,0x21,0x87,0xe7,0x3e,0x4c,0x00,0x00,0x00,0x6c,0x92,0xa2,0xbe,0x6c,0x99,0xc4,0xbf,0xe2,0x2c,0xec,0x3d,0xfa,0xc9,0x92,0x3d,0xa8,0x37,0x0c,0xbf,0x35,0xb8,0x74,0xbf,0xdd,0xa5,0x81,0xbf,0x37,0x19,0x05,0xbf,0xd5,0xf0,0x4d,0xbf,0x82,0x3b,0x1b,0xbf,0xc2,0x0e,0x0f,0xbf,0x72,0x08,0x1a,0xbf,0x1e,0xdc,0x5f,0xbd,0xb5,0x41,0x43,0xbe,0x21,0x62,0x09,0x3d,0xe8,0x81,0xea,0xbe,0x48,0xfc,0x7d,0xbf,0xd7,0xc7,0xf1,0xbe,0xff,0x2e,0x8a,0xbf,0xbe,0x70,0xbb,0xbe,0xc2,0x64,0x17,0xbf,0x63,0x52,0x22,0xbf,0xfb,0x86,0x1b,0xbf,0x1d,0xc1,0x3a,0xbf,0xf5,0xaa,0x45,0xbd,0x6f,0x04,0x07,0x3e,0x0b,0xba,0x3c,0xbe,0xd4,0xb6,0x80,0xbe,0x0c,0x94,0x77,0xbf,0x06,0x81,0x98,0xbd,0xbf,0xb4,0x31,0xbf,0x35,0x1b,0x65,0xbf,0x20,0x08,0x2d,0xbe,0x4c,0x3a,0xba,0xbf,0xb8,0x4b,0x4c,0xbf,0x66,0x4a,0x79,0xbe,0xdc,0xdb,0xa2,0xbf,0x3e,0x78,0xc6,0xbf,0x41,0x6c,0xe0,0x3c,0x95,0xdf,0x1c,0xbf,0x5d,0xe1,0x22,0xbf,0x5b,0x12,0x5f,0xbf,0xca,0xb4,0xa4,0x3d,0xfe,0x76,0x5e,0xbe,0x5a,0xa5,0x7d,0xbf,0x22,0x63,0x21,0xbf,0xb6,0x46,0xe1,0xbe,0x48,0x10,0x61,0xbe,0x62,0x7a,0xff,0xbe,0x36,0xb9,0xd7,0xbe,0x12,0x68,0x6a,0xbf,0x69,0x8c,0x4f,0xbf,0xa1,0x58,0x2c,0xbf,0xa3,0xd6,0xef,0x3d,0xa6,0xff,0xc6,0x3d,0x2d,0xd3,0x41,0xbf,0xac,0xc5,0x03,0xbe,0xe3,0xdd,0x88,0xbf,0xeb,0x58,0x72,0xbe,0xdd,0xa8,0x83,0xbf,0xe8,0x6c,0x61,0xbf,0xee,0x27,0x32,0xbf,0xd9,0x3d,0x48,0xbf,0x5c,0x5b,0x64,0xbf,0xc7,0x50,0xbd,0xbf,0x17,0x46,0x0b,0xbe,0x7d,0x29,0xdc,0xbf,0x89,0xd4,0x7c,0xbf,0xfe,0x64,0x13,0xbf,0x87,0x77,0x30,0xbf,0x32,0x50,0x68,0xbf,0xb4,0x52,0x27,0xbf,0x04,0xd9,0x3a,0xbf,0xea,0x1b,0x83,0xbf,0x8a,0x96,0x88,0xbf,0x5f,0xc6,0xea,0x3d,0xec,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x72,0x2c,0xfe,0xff,0x00,0x00,0x00,0x02,0xf4,0x02,0x00,0x00,0x61,0x00,0x00,0x00,0xa0,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0x2e,0xfe,0xff,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x03,0x96,0xf6,0x38,0x63,0xef,0x97,0x38,0x35,0x98,0xad,0x38,0x83,0xbf,0xe4,0x38,0xf3,0x06,0xd0,0x38,0x70,0xae,0xa9,0x38,0xd1,0x4e,0xb4,0x38,0x3c,0xe0,0xbd,0x38,0x85,0x2a,0x8a,0x38,0x42,0x6d,0x1e,0x38,0x88,0xcd,0x88,0x38,0x78,0x3e,0x2c,0x39,0x37,0xf0,0xe9,0x38,0xaa,0x66,0xb9,0x38,0x42,0x00,0x23,0x38,0x5e,0xd8,0x94,0x38,0x73,0xcc,0xfa,0x37,0x94,0xb6,0x00,0x39,0x30,0x47,0x88,0x38,0xde,0x99,0x52,0x38,0xa0,0x89,0x9a,0x38,0x1d,0xea,0xab,0x38,0x82,0x78,0x74,0x38,0x58,0xcc,0x73,0x38,0x43,0xa6,0x4c,0x39,0x60,0x7e,0xaa,0x38,0xc1,0xeb,0xed,0x38,0xa1,0x39,0xdf,0x38,0xe2,0xa4,0xc7,0x38,0x3b,0x59,0xa6,0x38,0x4c,0x96,0xb4,0x38,0x21,0x20,0xf6,0x38,0x47,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x76,0x2f,0xfe,0xff,0x00,0x00,0x00,0x09,0x80,0x07,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x82,0x93,0xff,0xff,0xe0,0x04,0x00,0x00,0xa8,0x03,0x00,0x00,0x70,0x02,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x84,0x25,0x29,0x3c,0x0f,0xf8,0xaf,0x3b,0x46,0x31,0x9a,0x3b,0xfc,0x31,0x20,0x3c,0x7b,0x7a,0xa9,0x3b,0xe9,0x1c,0x16,0x3c,0xe3,0x25,0xdb,0x3b,0x00,0xb0,0x79,0x3c,0xe0,0x98,0x04,0x3c,0xb6,0x00,0x93,0x3b,0x4e,0x59,0x55,0x3c,0xaa,0x67,0xb8,0x3b,0x12,0x44,0x10,0x3c,0x00,0xb7,0x81,0x3c,0xc4,0x8d,0xe8,0x3b,0xa3,0x8a,0xfa,0x3b,0xfd,0xdc,0x30,0x3c,0x67,0xe2,0xd4,0x3b,0x61,0x80,0x87,0x3b,0x3f,0xb2,0x19,0x3c,0xba,0xbb,0x11,0x3c,0x99,0x0c,0xfb,0x3b,0x90,0x64,0x1f,0x3c,0x59,0x3c,0xf6,0x3b,0x3e,0xe6,0x37,0x3c,0xa9,0xd4,0xd1,0x3b,0x36,0x12,0x5b,0x3c,0xaf,0xbf,0x86,0x3b,0xcd,0x61,0x03,0x3c,0x70,0x41,0x3a,0x3c,0xf3,0x8d,0x11,0x3c,0x75,0xeb,0xfc,0x3b,0x8e,0x53,0xbb,0x3b,0xe2,0xd1,0xc8,0x3b,0x69,0x64,0x09,0x3c,0x78,0x23,0x1e,0x3c,0x88,0x9a,0x70,0x3c,0x96,0x4b,0x04,0x3c,0xbe,0xab,0x0a,0x3c,0x9e,0xb2,0xf2,0x3b,0x6e,0x2e,0x0b,0x3c,0x84,0xcd,0x9a,0x3b,0xcf,0xb1,0x1b,0x3c,0x35,0xae,0x98,0x3c,0x00,0x35,0x7c,0x3c,0x90,0x40,0xfb,0x3b,0xe6,0xa3,0xbb,0x3b,0x56,0xf4,0xd3,0x3b,0xb3,0x97,0x1e,0x3c,0x3c,0x89,0x1f,0x3d,0xd6,0xfa,0x04,0x3c,0xdb,0x9e,0xe2,0x3b,0x7d,0x75,0xa6,0x3c,0x8f,0x28,0x0e,0x3c,0x44,0xd4,0xa6,0x3c,0x68,0xac,0xb8,0x3b,0x5b,0x37,0x07,0x3c,0x1c,0xa1,0xb1,0x3b,0x37,0x38,0xb3,0x3b,0xe2,0xcf,0x9c,0x3b,0xb5,0x3f,0x01,0x3c,0xea,0xfc,0xe2,0x3b,0x84,0x31,0x56,0x3c,0x70,0xef,0x53,0x3c,0x52,0x41,0xc7,0x3b,0x36,0xae,0x9b,0x3b,0xd2,0xb0,0xfe,0x3b,0x7d,0xc6,0xfa,0x3b,0xd3,0x90,0xa4,0x3b,0xce,0x3e,0x26,0x3c,0xcb,0x24,0x38,0x3c,0x48,0x94,0x2c,0x3c,0x1d,0xf8,0x36,0x3c,0xfc,0x55,0xb6,0x3b,0xa0,0xe2,0x3d,0x3c,0xed,0xbc,0x08,0x3c,0x4c,0x00,0x00,0x00,0x39,0xd3,0xa7,0x3f,0x1f,0x98,0x2e,0x3f,0xe3,0xfc,0x18,0x3f,0xd4,0x0f,0x8c,0x3f,0x86,0x27,0x28,0x3f,0xaf,0xf0,0x94,0x3f,0x97,0x6f,0x59,0x3f,0xa0,0xbc,0xf7,0x3f,0xae,0x8f,0x83,0x3f,0xbb,0x5e,0x23,0x3e,0x9b,0xae,0xd3,0x3f,0xf2,0x36,0x33,0x3f,0x8a,0x23,0x8f,0x3f,0x92,0xb3,0x00,0x40,0xa8,0xbc,0x66,0x3f,0x8e,0x95,0x78,0x3f,0x43,0x7b,0xaf,0x3f,0x3e,0x33,0x32,0x3f,0x9c,0xcd,0xfd,0xbd,0xdb,0x7e,0x98,0x3f,0x43,0x98,0x90,0x3f,0x2e,0x88,0x59,0x3f,0xc7,0x25,0x9e,0x3f,0x05,0x84,0xc0,0xbe,0x72,0x76,0xb6,0x3f,0x00,0x31,0x50,0x3f,0x12,0x5c,0xd9,0x3f,0x5f,0xa5,0x0f,0xbe,0xb5,0xce,0x3d,0x3f,0xed,0xcc,0xb8,0x3f,0xd7,0x6a,0x90,0x3f,0x9e,0xf1,0x7a,0x3f,0xe7,0xdc,0x39,0x3f,0x21,0x76,0x9f,0xbd,0xa0,0x51,0x88,0x3f,0xab,0x74,0x7c,0x3f,0x53,0xb9,0xee,0x3f,0xff,0x42,0x83,0x3f,0x67,0x96,0x89,0x3f,0x2b,0xbd,0xbe,0xbe,0x11,0x18,0x8a,0x3f,0x59,0x7a,0x30,0xbc,0x92,0x49,0xda,0x3e,0xd9,0x7c,0x17,0x40,0x96,0x3c,0xfa,0x3f,0x0f,0x4a,0x79,0x3f,0x9e,0x2c,0x3a,0x3f,0x6d,0x4c,0x52,0x3f,0xfd,0x4f,0x8e,0x3f,0x2a,0x4a,0x9e,0x40,0xe0,0xf0,0x83,0x3f,0x9d,0xd9,0x60,0x3f,0x92,0x28,0x25,0x40,0x3e,0x0c,0x8d,0x3f,0x9b,0x86,0x25,0x40,0x0f,0x3b,0x37,0x3f,0xec,0x28,0x86,0x3f,0xa7,0x24,0xea,0x3e,0x27,0x93,0x50,0xbe,0x42,0x96,0x1b,0x3f,0x36,0x3d,0x80,0x3f,0xf0,0x36,0x61,0x3f,0x21,0x85,0xd4,0x3f,0x91,0x47,0xd2,0x3f,0x25,0xa2,0xc0,0x3e,0x5e,0xf9,0x08,0x3f,0xa9,0x4d,0xf8,0x3e,0xf0,0xd0,0x78,0x3f,0xb1,0x47,0x23,0x3f,0x50,0xf2,0xa4,0x3f,0x81,0xb4,0xb6,0x3f,0x1f,0x3b,0xab,0x3f,0x2d,0x8a,0xb5,0x3f,0x3a,0xc7,0xb5,0x3e,0x89,0x52,0x69,0x3f,0x73,0xab,0x87,0x3f,0x4c,0x00,0x00,0x00,0xba,0x65,0x6c,0xbf,0xd0,0x36,0x43,0xbd,0x74,0xd1,0x44,0xbd,0x98,0xf1,0x9e,0xbf,0x84,0x40,0xc5,0xbe,0xba,0x9c,0x57,0xbf,0xe9,0x40,0x30,0xbf,0x26,0xd9,0x51,0xbf,0x51,0xe7,0x61,0xbf,0xb5,0xda,0x11,0xbf,0x4e,0x08,0x81,0xbf,0xdb,0xf6,0x36,0xbf,0x1c,0xc3,0x41,0xbe,0x27,0x9b,0x26,0xbe,0x0e,0x29,0x96,0x3d,0x2a,0x37,0xfd,0x3d,0x1e,0xb0,0x24,0xbf,0xa2,0x38,0x53,0xbf,0x60,0x71,0x06,0xbf,0x94,0x89,0x07,0xbf,0xec,0x62,0x7e,0xbf,0x80,0x16,0x79,0xbf,0x85,0xbd,0x76,0xbd,0xe0,0x4f,0x74,0xbf,0xda,0x34,0x8d,0xbf,0xfb,0x40,0x33,0x3e,0x48,0xe5,0x7f,0xbe,0x30,0xb2,0x05,0xbf,0x09,0x5b,0x82,0xbf,0x34,0x79,0x88,0xbf,0x98,0xa4,0x3d,0x3b,0xb4,0x7b,0x24,0xbf,0x5e,0x51,0xa9,0xbe,0x3e,0x40,0x47,0xbf,0xa5,0xe0,0x3f,0xbf,0x31,0xe7,0x9c,0xbf,0x4e,0x44,0x51,0xbd,0x69,0xba,0xcd,0xbe,0x10,0xe2,0xa9,0xbe,0x39,0xcd,0x70,0xbf,0xbb,0x78,0x54,0xbf,0xe9,0x97,0x19,0xbf,0x6b,0x7a,0x9a,0xbf,0x51,0xd1,0x88,0xbf,0xd0,0x5e,0x80,0xbf,0xa4,0xa2,0xd7,0x3c,0xe5,0xb0,0x2c,0xbf,0xb9,0x67,0x55,0xbe,0x84,0x5a,0x9d,0xbf,0x2c,0xee,0x92,0xbf,0x48,0x85,0x2c,0xbf,0x88,0x22,0x05,0xbe,0x2b,0xb9,0x85,0xbf,0xd3,0x4a,0x17,0xbf,0x11,0x92,0xca,0xbe,0xbc,0x50,0x21,0xbf,0x63,0x06,0xc5,0xbe,0xda,0x3d,0x30,0xbf,0xc7,0xd1,0x31,0xbf,0x14,0x30,0x22,0x3d,0x95,0xff,0x67,0xbf,0x14,0x15,0x9d,0xbe,0xb7,0x0a,0x01,0xbf,0x20,0xe8,0x71,0xbf,0xcf,0xb2,0x45,0xbf,0xda,0x76,0x1a,0xbf,0x70,0xb3,0x7c,0xbf,0x03,0xc5,0x1b,0xbf,0x77,0xfe,0xaf,0xbc,0x7d,0xea,0x70,0xbf,0x54,0x9b,0x38,0xbf,0x74,0x26,0x8a,0xbf,0xfc,0x4f,0xa4,0xbe,0x50,0xe9,0x34,0xbf,0xdb,0x66,0xbc,0xbf,0x61,0xc6,0x35,0xbf,0x53,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x12,0x37,0xfe,0xff,0x00,0x00,0x00,0x02,0xa4,0x01,0x00,0x00,0x5f,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x39,0xfe,0xff,0x70,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x62,0xc9,0x38,0x4f,0xc6,0xf4,0x38,0x76,0x67,0xf8,0x38,0x77,0x3b,0xd1,0x38,0x17,0x64,0xf7,0x38,0x92,0x06,0x55,0x39,0x12,0x27,0xd8,0x38,0x98,0x71,0xcc,0x38,0xd6,0x68,0x03,0x39,0x38,0x88,0x1f,0x39,0x9e,0x08,0x03,0x39,0xde,0xac,0x16,0x39,0xe5,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0xc6,0x38,0xfe,0xff,0x00,0x00,0x00,0x09,0xe8,0x09,0x00,0x00,0x5e,0x00,0x00,0x00,0xf0,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0xd2,0x9c,0xff,0xff,0x20,0x07,0x00,0x00,0x58,0x05,0x00,0x00,0x90,0x03,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xdb,0x86,0xdc,0x3b,0x98,0x0e,0xdd,0x3b,0x81,0xda,0xc6,0x3b,0x91,0x5c,0xc1,0x3b,0xac,0x07,0x20,0x3c,0x1e,0x22,0x21,0x3c,0xd3,0xc9,0xc2,0x3b,0x25,0xf8,0x10,0x3c,0x1f,0xf8,0x70,0x3c,0x1d,0xb2,0xfe,0x3b,0x57,0x3f,0x03,0x3c,0xa0,0x5e,0xc0,0x3b,0xd1,0xa0,0x98,0x3b,0x8c,0x83,0xe3,0x3b,0x0f,0x3b,0xb0,0x3b,0x2e,0x44,0x30,0x3c,0x3e,0xe1,0x22,0x3c,0xf5,0xcc,0x1a,0x3c,0x97,0xd9,0xba,0x3b,0x27,0xbe,0xe7,0x3b,0x70,0xf2,0x08,0x3c,0x67,0x12,0xd3,0x3b,0xe0,0xae,0x08,0x3c,0xe6,0x43,0x2f,0x3c,0xeb,0x90,0xe5,0x3b,0xd3,0x5b,0xf8,0x3b,0xc3,0xce,0x21,0x3c,0x99,0x8b,0xb4,0x3b,0xe6,0x89,0x81,0x3b,0x04,0x0d,0x64,0x3c,0x03,0x59,0xd9,0x3b,0xb1,0x94,0x0f,0x3c,0x84,0x06,0xd1,0x3b,0x9d,0x6a,0xd3,0x3b,0x21,0x4f,0x2f,0x3c,0xaa,0x61,0x83,0x3c,0xcc,0x34,0x92,0x3b,0x64,0xae,0x14,0x3c,0x4e,0xad,0xd0,0x3b,0xed,0xd9,0xc9,0x3b,0xbf,0xa1,0x08,0x3c,0x4d,0x2f,0x3a,0x3c,0xe5,0x52,0xac,0x3b,0xa5,0x94,0xc5,0x3b,0xce,0x16,0x48,0x3c,0x6c,0xd4,0xad,0x3b,0x1d,0xd2,0x24,0x3c,0xb8,0xf3,0xbe,0x3b,0x83,0x55,0xbb,0x3b,0x5c,0xec,0xf3,0x3b,0x56,0x14,0x82,0x3b,0x25,0x09,0x19,0x3c,0x9d,0x50,0xe1,0x3b,0xd6,0xab,0x38,0x3c,0x97,0xf9,0x06,0x3c,0x4b,0xa8,0x57,0x3c,0x6a,0xe8,0x37,0x3c,0x33,0x1c,0xad,0x3b,0x24,0xa9,0x09,0x3c,0xb1,0x87,0x06,0x3c,0x5f,0x0c,0x57,0x3c,0x15,0xff,0x08,0x3c,0xb5,0xba,0x76,0x3c,0x4d,0xbe,0xf7,0x3b,0x20,0x27,0x16,0x3c,0xc2,0x57,0x0b,0x3c,0x32,0x12,0x10,0x3c,0xc3,0x46,0x00,0x3c,0x5f,0xda,0x53,0x3c,0xe3,0x40,0xb5,0x3b,0x94,0xff,0x1d,0x3c,0x42,0x31,0x9e,0x3c,0xcf,0x28,0xcf,0x3b,0xc9,0x4d,0xb2,0x3b,0x39,0xf5,0xf5,0x3b,0x49,0x97,0x11,0x3c,0xf4,0x1a,0x01,0x3c,0x92,0x6e,0xb0,0x3b,0x4f,0x8b,0x2e,0x3c,0x8b,0x1f,0xe1,0x3b,0x3d,0x62,0xf4,0x3b,0xc4,0x99,0xaa,0x3b,0x76,0x2e,0xc3,0x3b,0xfc,0x9f,0x0f,0x3c,0xc8,0x45,0xf7,0x3b,0xfd,0xb9,0xc2,0x3b,0xde,0x41,0xf1,0x3b,0x70,0x7b,0xd3,0x3b,0xe8,0x3b,0x99,0x3b,0x98,0x9e,0x16,0x3c,0x93,0xff,0x01,0x3c,0xb3,0x34,0x29,0x3c,0xe0,0xd0,0xe2,0x3b,0xc1,0x19,0xec,0x3b,0x44,0xe5,0x06,0x3c,0xcf,0x8f,0xab,0x3b,0x03,0xde,0x24,0x3c,0xda,0xc9,0x2a,0x3c,0xbc,0x6d,0x06,0x3c,0x27,0x19,0x08,0x3c,0x61,0x9b,0x80,0x3c,0x55,0x32,0x0a,0x3c,0x45,0x45,0x06,0x3c,0x9c,0x3a,0xc5,0x3b,0x04,0x10,0x40,0x3c,0x07,0x7f,0xb7,0x3b,0xa5,0xcb,0x19,0x3c,0x2f,0xa7,0xd7,0x3b,0x72,0x89,0xf2,0x3b,0x8b,0x84,0x19,0x3c,0xcd,0xd4,0x31,0x3c,0xc3,0xe7,0xab,0x3b,0x70,0x00,0x00,0x00,0x48,0xe9,0x37,0x3f,0x7b,0x54,0x5b,0x3f,0xbd,0x83,0x39,0x3f,0x31,0x00,0x8d,0x3e,0x9d,0xc7,0x9e,0x3f,0xda,0xdf,0x9f,0x3f,0xac,0xfe,0x21,0x3f,0x35,0xd6,0x8f,0x3f,0x2f,0x16,0xef,0x3f,0xb9,0xb4,0x7c,0x3f,0xd8,0x38,0x82,0x3f,0x53,0x2a,0x20,0x3f,0x5b,0x0b,0xa9,0x3c,0x85,0xbc,0x61,0x3f,0x99,0xda,0x2e,0x3f,0x7d,0x43,0x42,0x3f,0x33,0xdf,0x42,0x3f,0xee,0x68,0x6f,0x3f,0x6f,0x05,0x70,0x3e,0xab,0xee,0x65,0x3f,0x8b,0xe0,0x87,0x3f,0x42,0x6c,0x51,0x3f,0x82,0x9d,0x87,0x3f,0xb6,0xe8,0x88,0x3f,0xf1,0xc0,0xdf,0x3e,0x1b,0x6b,0x76,0x3f,0x25,0x8b,0xa0,0x3f,0xe3,0x4b,0x30,0x3f,0xd2,0x86,0x00,0x3f,0xea,0x44,0xe2,0x3f,0x51,0xa6,0x57,0x3f,0x88,0x75,0x8e,0x3f,0x77,0x64,0x4f,0x3f,0xc8,0xc3,0x51,0x3f,0x83,0xf0,0xad,0x3f,0xe7,0x5a,0x02,0x40,0x2f,0xb1,0x0a,0x3e,0x07,0x85,0x93,0x3f,0xa9,0xab,0x0b,0x3f,0x39,0x46,0x48,0x3f,0x7c,0x90,0x87,0x3f,0xee,0xba,0xb8,0x3f,0x3f,0xfa,0x2a,0x3f,0x7c,0x09,0x44,0x3f,0xa0,0x86,0xc6,0x3f,0xbb,0x75,0x0a,0xbe,0x14,0xb9,0x41,0x3f,0x4d,0x85,0x54,0xbe,0xd8,0xde,0x39,0x3f,0x8d,0x9e,0x4d,0x3f,0xee,0x47,0xfa,0xbd,0x13,0xd7,0x97,0x3f,0xed,0xef,0xef,0xbd,0x48,0x21,0xa3,0x3f,0xee,0x51,0x54,0x3f,0x8e,0x40,0xc5,0x3f,0x99,0x78,0xb6,0x3f,0xfb,0xc1,0x2b,0x3f,0xd2,0x95,0x88,0x3f,0xa9,0x4f,0x2e,0x3f,0x46,0x5e,0xd5,0x3f,0xfe,0xca,0x82,0x3f,0x40,0xcd,0xf4,0x3f,0xe0,0x6f,0xbe,0x3e,0xd2,0xfa,0x94,0x3f,0x74,0xef,0x1f,0x3f,0x0e,0xf2,0x8e,0x3f,0x6b,0x8c,0x7e,0x3f,0xaa,0x32,0xd2,0x3f,0xbd,0xb6,0x48,0xbe,0x95,0xc3,0x9c,0x3f,0x7a,0x0b,0x03,0x40,0x6e,0x7a,0x36,0xbe,0xb1,0x5d,0x46,0x3e,0x4f,0x09,0x74,0x3f,0x1a,0x74,0x90,0x3f,0xa8,0xf6,0x8e,0x3e,0x47,0x34,0x11,0x3f,0x38,0x2e,0xad,0x3f,0x14,0x1c,0x4a,0x3f,0x10,0xa6,0x01,0x3f,0x90,0x44,0x29,0x3f,0x19,0xa8,0x41,0x3f,0xbc,0x80,0x8e,0x3f,0x3b,0x32,0x22,0xbd,0x89,0x34,0x41,0x3f,0xdd,0xbf,0xa0,0x3d,0x79,0xd4,0x51,0x3f,0x5b,0x23,0x60,0x3d,0x5b,0x71,0x95,0x3f,0x8f,0xa2,0x4c,0x3f,0x08,0xc9,0x79,0x3f,0x3e,0x0b,0x61,0x3f,0x8d,0x41,0x6a,0x3f,0x79,0xd7,0x85,0x3f,0xaf,0x38,0x2a,0x3f,0x47,0x94,0xa3,0x3f,0x46,0x74,0xa9,0x3f,0xac,0xd6,0x29,0x3f,0x4a,0xce,0x57,0x3f,0x55,0x34,0xff,0x3f,0x67,0x59,0x3f,0x3f,0xba,0x38,0x85,0x3f,0xff,0x44,0x30,0x3f,0xe4,0x8f,0xbe,0x3f,0xdd,0xe2,0xd7,0x3e,0x0e,0x98,0x98,0x3f,0xe1,0xf7,0x55,0x3f,0x5f,0xa4,0x70,0x3f,0x82,0x51,0x98,0x3f,0x23,0x71,0xb0,0x3f,0x28,0x27,0xa1,0x3e,0x70,0x00,0x00,0x00,0xcd,0xcd,0x5a,0xbf,0x8a,0xc5,0x4f,0xbf,0xcc,0x4c,0x45,0xbf,0xd8,0xd9,0x3f,0xbf,0xd2,0x91,0x97,0xbf,0x63,0x4c,0x87,0xbf,0x3f,0x44,0x41,0xbf,0xc1,0x46,0x1e,0xbf,0xf7,0x0c,0xcf,0xbf,0xf7,0xd1,0x78,0xbf,0x5c,0xea,0x93,0xbe,0xe3,0xdd,0x3e,0xbf,0x8f,0x6f,0x17,0xbf,0x4a,0x51,0xef,0xbe,0xcf,0xb9,0x0f,0xbe,0xa6,0xe3,0xae,0xbf,0x7c,0x9b,0xa1,0xbf,0x5b,0x97,0x99,0xbf,0xe4,0x63,0x39,0xbf,0x3c,0xd9,0x3e,0xbf,0xce,0xad,0x6c,0xbf,0xf6,0x0e,0xfd,0xbe,0x04,0x00,0x03,0xbf,0x5e,0xe5,0xad,0xbf,0xc9,0xc5,0x63,0xbf,0xdb,0xce,0x5f,0xbf,0xe3,0x25,0x6c,0xbf,0x82,0x22,0x33,0xbf,0x1d,0x4e,0x4b,0x3d,0x5f,0x8d,0x15,0xbf,0xb8,0x6f,0x2b,0xbf,0xc8,0xa0,0xfd,0xbe,0x91,0x54,0x39,0xbf,0xee,0xf8,0x8b,0xbe,0xed,0xe3,0xe1,0xbe,0xe4,0x82,0xbc,0xbe,0x62,0x10,0x11,0xbf,0xb3,0x73,0x62,0xbf,0xf3,0x0b,0x4f,0xbf,0x62,0x21,0xb0,0xbc,0xc5,0xf1,0x28,0xbf,0x95,0x54,0x04,0xbf,0xfe,0x11,0xa1,0x3a,0xd9,0xab,0x94,0xbe,0x5f,0x13,0x47,0xbf,0xc3,0x78,0x2c,0xbf,0x79,0x88,0xa3,0xbf,0xd1,0x75,0x3d,0xbf,0x59,0x7d,0x25,0xbf,0x83,0x04,0x72,0xbf,0x2d,0x10,0x01,0xbf,0x80,0x11,0x6d,0xbf,0xfc,0x8d,0x5f,0xbf,0x7e,0x3a,0xb7,0xbf,0xa4,0xeb,0x85,0xbf,0xfa,0xf8,0xd5,0xbf,0xcb,0x8e,0x1e,0xbf,0xdd,0xd9,0x76,0x3d,0x57,0x1e,0x81,0xbf,0xa2,0x7a,0x85,0xbf,0x67,0x84,0x13,0xbf,0x17,0xed,0x87,0xbf,0x2a,0x26,0x7a,0xbf,0xd0,0xce,0x75,0xbf,0x0c,0x56,0x9b,0xbe,0x12,0x41,0x8a,0xbf,0x0b,0xb4,0x61,0xbf,0x23,0xc6,0x43,0xbf,0xe9,0xde,0x22,0xbf,0x61,0xd6,0x33,0xbf,0x19,0xe8,0x9b,0xbf,0xdf,0xf4,0x1c,0xc0,0x7d,0x8a,0x4d,0xbf,0x2d,0xe9,0x30,0xbf,0x4d,0x33,0xab,0xbe,0x58,0xce,0x75,0xbf,0xbe,0x18,0x80,0xbf,0xb5,0x0d,0x2f,0xbf,0xd7,0xa8,0x3a,0xbf,0x4c,0x5d,0x5f,0xbf,0x79,0x79,0x72,0xbf,0xea,0xe7,0x10,0xbf,0x86,0xfa,0x3a,0xbf,0x4c,0xf2,0x14,0xbf,0x3c,0x57,0x75,0xbf,0x65,0x4e,0x12,0xbe,0x5a,0x5f,0x6f,0xbf,0xac,0x41,0x3f,0xbf,0x70,0x09,0x18,0xbf,0x12,0xe7,0x6f,0xbf,0x94,0xfb,0x80,0xbf,0x4a,0xe2,0xa7,0xbf,0x33,0xb1,0x15,0xbf,0xdf,0xea,0x45,0xbf,0xe2,0x86,0x26,0xbf,0xcd,0x6e,0xb1,0x3d,0x79,0x3e,0x9b,0xbf,0xd0,0x2f,0x72,0xbf,0xe1,0x60,0x85,0xbf,0xf5,0x08,0x87,0xbf,0x23,0xc0,0x3e,0xbf,0xf0,0x1d,0x89,0xbf,0x4e,0x2f,0x1d,0xbf,0x27,0xb0,0x43,0xbf,0xb2,0x73,0xbb,0xbf,0x09,0x10,0x36,0xbf,0x16,0x1a,0x83,0xbf,0xee,0x3a,0x12,0xbf,0xde,0xba,0x56,0xbf,0x50,0xc7,0xd4,0xbe,0xf5,0xfa,0x78,0xbf,0xf3,0x8f,0x2a,0xbf,0xeb,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xca,0x42,0xfe,0xff,0x00,0x00,0x00,0x02,0x34,0x02,0x00,0x00,0x5d,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xd4,0x44,0xfe,0xff,0xd0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xac,0x85,0xc4,0x38,0xad,0x20,0x97,0x38,0xa1,0x6c,0xa5,0x38,0x52,0xe8,0xa3,0x38,0x2c,0xea,0xc9,0x38,0x60,0x38,0xbe,0x38,0x69,0x1a,0xac,0x38,0xba,0xf6,0x03,0x39,0x02,0xe2,0x92,0x38,0xb3,0x73,0x11,0x38,0x4c,0xa5,0xca,0x38,0xcf,0xa1,0xaa,0x38,0xd8,0xb6,0xc9,0x38,0x88,0x6c,0x90,0x38,0x09,0xfc,0x4c,0x37,0xe4,0x8f,0xc2,0x38,0x55,0x29,0x60,0x38,0xfa,0xbc,0xda,0x38,0x38,0x92,0xc7,0x38,0x47,0x2c,0x54,0x38,0xe7,0x5d,0x00,0x39,0x17,0x3e,0x6d,0x38,0xd0,0xb9,0xdd,0x38,0x8c,0xfa,0xcf,0x38,0xe5,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0e,0x45,0xfe,0xff,0x00,0x00,0x00,0x09,0x50,0x0a,0x00,0x00,0x5c,0x00,0x00,0x00,0xf0,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x1a,0xa9,0xff,0xff,0x20,0x07,0x00,0x00,0x58,0x05,0x00,0x00,0x90,0x03,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x91,0x05,0x8f,0x3b,0xf0,0xed,0xaa,0x3b,0x49,0xf3,0xe5,0x3b,0x0a,0x36,0xa2,0x3b,0x98,0x89,0xf8,0x3b,0x4f,0x1d,0xa1,0x3c,0xef,0x0b,0xd4,0x3b,0xac,0x85,0x10,0x3c,0xf3,0x6c,0x0a,0x3c,0x2c,0x2d,0x35,0x3c,0x73,0xb4,0xc2,0x3b,0x72,0x3b,0xf8,0x3b,0xec,0xa1,0x04,0x3c,0x03,0x0a,0xac,0x3b,0x82,0xd5,0xb0,0x3b,0xa0,0x7e,0x66,0x3c,0x01,0x55,0x47,0x3c,0xbf,0xda,0x59,0x3c,0xce,0x66,0xf0,0x3b,0x62,0xca,0xf8,0x3b,0x4a,0x26,0xe7,0x3b,0x0f,0x83,0x9d,0x3b,0x0a,0xcc,0xad,0x3b,0x19,0x52,0x4d,0x3c,0x27,0x96,0xd2,0x3b,0xc5,0xe8,0xb9,0x3b,0x63,0xfc,0x1b,0x3c,0x99,0x88,0xab,0x3b,0x65,0x49,0xf7,0x3b,0x43,0x17,0x05,0x3c,0xec,0x1e,0x1e,0x3c,0x88,0xaf,0xa3,0x3b,0x9a,0x73,0xdd,0x3b,0x9c,0xf7,0x02,0x3c,0x7a,0x5b,0xf2,0x3b,0xaf,0xb0,0x15,0x3c,0x47,0xc4,0xbf,0x3b,0x8f,0x45,0x00,0x3c,0x86,0x98,0xfb,0x3b,0x8c,0x37,0x04,0x3c,0x52,0x41,0x03,0x3c,0x79,0x77,0x13,0x3c,0x97,0x99,0xee,0x3b,0xd1,0xf2,0x11,0x3c,0x95,0x1c,0xab,0x3b,0x45,0x7b,0xc7,0x3b,0xf8,0xde,0xd4,0x3b,0xf8,0x56,0x14,0x3c,0x99,0xec,0x1a,0x3c,0x4e,0xae,0x05,0x3c,0x14,0x07,0xee,0x3b,0x2a,0xa2,0xbc,0x3b,0x4f,0x17,0x99,0x3b,0xae,0xba,0x5a,0x3c,0x88,0xc2,0xcb,0x3b,0xfb,0xed,0x3f,0x3c,0x5e,0xea,0xd4,0x3b,0xe4,0x27,0x8a,0x3b,0x54,0xe6,0x24,0x3c,0xdd,0xc2,0x02,0x3c,0xa5,0xcb,0xa7,0x3b,0xf4,0x50,0x07,0x3c,0xd3,0x02,0x03,0x3c,0x10,0x87,0x4d,0x3c,0x30,0x41,0x14,0x3c,0xa5,0x7b,0xd1,0x3b,0x0b,0x7d,0x10,0x3c,0xc8,0x19,0xac,0x3b,0x7b,0x6f,0x2d,0x3c,0x63,0xc0,0xf0,0x3b,0x98,0x78,0x08,0x3c,0x86,0x2a,0xd3,0x3b,0x93,0x34,0x00,0x3c,0xa6,0x68,0x01,0x3c,0x39,0xbc,0x3b,0x3c,0x66,0x0c,0xec,0x3b,0x5f,0xe2,0xd8,0x3b,0xfc,0x78,0xeb,0x3b,0xb6,0x03,0x5f,0x3c,0x50,0xba,0xf6,0x3b,0x2c,0x7f,0x23,0x3c,0xa3,0x2e,0x87,0x3b,0xcc,0xdd,0x35,0x3c,0xa0,0x60,0x8e,0x3b,0xb1,0xaa,0x36,0x3c,0x15,0x0d,0xf9,0x3b,0x37,0x93,0xf7,0x3c,0x4b,0x0a,0xe9,0x3b,0x53,0xc5,0xd5,0x3b,0xf0,0xd0,0x52,0x3c,0xb5,0x2c,0xcc,0x3b,0x5a,0x8c,0xba,0x3b,0x79,0x1d,0xcc,0x3b,0xae,0x91,0xda,0x3b,0x82,0x6b,0x34,0x3c,0x8c,0xc4,0x10,0x3c,0x39,0x8b,0x12,0x3c,0x81,0x3c,0x06,0x3c,0xaf,0x4f,0xbf,0x3b,0xa1,0x0a,0xc4,0x3b,0x84,0x27,0x10,0x3c,0xac,0x86,0x21,0x3c,0xdd,0x49,0xa9,0x3b,0x00,0xe0,0x16,0x3c,0x37,0x2c,0x02,0x3c,0x61,0x2d,0xfe,0x3b,0x07,0xdd,0xf2,0x3b,0x83,0x56,0xae,0x3b,0xfa,0x1d,0x28,0x3c,0xf5,0xc7,0xc1,0x3b,0x31,0x25,0x7f,0x3c,0x9c,0xbb,0xb1,0x3b,0x70,0x00,0x00,0x00,0x86,0xe7,0x0d,0x3f,0x14,0x98,0x29,0x3f,0x62,0x27,0x64,0x3f,0x3b,0xc7,0xca,0xbe,0x85,0x98,0x76,0x3f,0x14,0xdb,0x1f,0x40,0x44,0xcb,0x43,0xbd,0x62,0x28,0x70,0x3f,0x19,0x58,0x89,0x3f,0xd2,0xc2,0xb3,0x3f,0x0a,0x2f,0x41,0x3f,0xac,0xaa,0x0c,0x3f,0x3b,0xd9,0xa7,0x3e,0xef,0xb1,0x2a,0x3f,0x14,0x6f,0xed,0x3e,0xa3,0xb1,0xe4,0x3f,0x57,0xc6,0xc5,0x3f,0x0a,0x27,0xd8,0x3f,0x00,0x86,0x6e,0x3f,0xcd,0xd8,0x76,0x3f,0xfd,0x57,0x65,0x3f,0x01,0x7e,0x64,0x3e,0xb1,0x2d,0x2b,0x3f,0xa9,0xd3,0x8e,0x3f,0x37,0x6f,0x2f,0x3f,0xf3,0x74,0x38,0x3f,0x31,0x31,0x68,0x3f,0x88,0x31,0x2a,0x3f,0x8f,0xee,0x5a,0x3f,0xb9,0x52,0x5c,0xbe,0xae,0xe2,0x9c,0x3f,0x29,0x68,0x22,0x3f,0xb3,0xb8,0x5b,0x3f,0x3b,0xc1,0x41,0x3f,0x8e,0x8e,0x46,0x3f,0x4e,0x85,0x94,0x3f,0xce,0x72,0x36,0x3f,0xee,0x63,0x08,0x3f,0x73,0x5e,0x22,0x3f,0x1d,0x2f,0x83,0x3f,0x6e,0xd6,0x80,0x3f,0xc4,0x7b,0x88,0x3e,0x17,0x61,0x36,0x3f,0xeb,0xce,0x90,0x3f,0x5c,0xc6,0x29,0x3f,0x4e,0xec,0x45,0x3f,0x08,0xe2,0xab,0x3e,0x4a,0x2e,0x93,0x3f,0xc0,0xb6,0x99,0x3f,0x1b,0x14,0x83,0x3f,0x06,0x2b,0x6c,0x3f,0x2a,0x59,0x37,0x3f,0x96,0xcb,0xa0,0x3e,0x39,0x00,0x8b,0x3f,0x03,0x2b,0x4a,0x3f,0x1f,0x6e,0xbe,0x3f,0xd7,0x70,0x28,0x3f,0xf9,0x22,0x0a,0x3e,0x87,0x9c,0xa3,0x3f,0x57,0xbd,0x81,0x3f,0x0d,0x3d,0xe9,0x3e,0xd8,0x6d,0x1a,0x3c,0xcd,0xfc,0x81,0x3f,0x02,0xec,0xcb,0x3f,0xae,0x18,0x93,0x3f,0xc7,0x4f,0x48,0x3f,0x11,0x5c,0x8f,0x3f,0x94,0xc1,0x2a,0x3f,0x9c,0x14,0xac,0x3f,0x45,0x00,0x20,0x3f,0xa7,0x67,0x87,0x3f,0x31,0x84,0x51,0x3f,0x54,0x68,0x7e,0x3f,0xd5,0x65,0x80,0x3f,0xdf,0x61,0xf4,0x3d,0xe6,0xd8,0xa7,0xbd,0x9a,0x30,0x57,0x3f,0x0a,0xa2,0x69,0x3f,0xaf,0x45,0xdd,0x3f,0xdb,0xcc,0x74,0x3f,0x2e,0x38,0xa2,0x3f,0xc7,0x9c,0xfc,0xbd,0x10,0x72,0xb4,0x3f,0xdf,0x43,0x0d,0x3f,0xb1,0x96,0x2e,0x3f,0xfb,0x1a,0x77,0x3f,0x11,0xa4,0x75,0x40,0x5c,0xf7,0xa8,0xbc,0x52,0xc6,0x17,0x3f,0x4e,0x2b,0xd1,0x3f,0x5c,0x94,0x4a,0x3f,0x41,0x17,0x39,0x3f,0x64,0x41,0x25,0x3f,0x8b,0xdc,0x58,0x3f,0xab,0x02,0xb3,0x3f,0x95,0x43,0x86,0x3f,0x23,0x66,0x91,0x3f,0x0a,0x29,0x42,0x3f,0x10,0xd1,0x3d,0x3f,0xf0,0xe9,0xec,0x3e,0x35,0x07,0x8f,0x3f,0x9f,0x43,0xa0,0x3f,0x13,0x57,0xcb,0x3e,0x40,0xb2,0x95,0x3f,0x8a,0x6c,0x11,0x3f,0xe3,0x20,0x7b,0x3f,0x4e,0xba,0x11,0x3f,0xe2,0x17,0x03,0x3f,0xbe,0xcd,0xa6,0x3f,0xcf,0xbd,0x2a,0x3f,0xe7,0x26,0xfd,0x3f,0xf3,0xc7,0x1b,0x3f,0x70,0x00,0x00,0x00,0xae,0xb8,0xbb,0xbe,0x6e,0xbf,0x17,0xbf,0x9b,0x62,0x53,0xbf,0x9e,0xf1,0x20,0xbf,0x75,0x25,0xea,0x3c,0x73,0x0c,0x19,0xbf,0xd7,0x63,0x52,0xbf,0xa1,0x64,0x8f,0xbf,0x67,0x33,0x48,0xbf,0xbf,0x45,0x4f,0xbf,0xc6,0x49,0x23,0xbf,0xfb,0x4a,0x76,0xbf,0xa8,0x98,0x83,0xbf,0x57,0xd0,0xf5,0xbe,0xd7,0x73,0x2f,0xbf,0xaf,0xb0,0x57,0xbf,0x16,0x6e,0x9b,0xbf,0x59,0x13,0x97,0xbf,0x3a,0x28,0x21,0xbf,0x31,0xb8,0x62,0xbf,0x3c,0x5d,0xe9,0xbe,0x09,0x48,0x1c,0xbf,0x72,0x70,0x2c,0xbf,0x75,0xb7,0xcb,0xbf,0xfb,0xf0,0x50,0xbf,0x05,0xb2,0x34,0xbf,0x6a,0xc4,0x9a,0xbf,0x24,0x3d,0x1b,0xbf,0xd2,0x5a,0x75,0xbf,0x14,0x0d,0x84,0xbf,0x06,0xec,0x08,0xbf,0x7a,0xa9,0xa7,0xbe,0xca,0x80,0x3e,0xbf,0xad,0xf1,0x81,0xbf,0xc3,0x76,0x70,0xbf,0x7b,0xa8,0x48,0xbf,0xbe,0x44,0x3e,0xbf,0x08,0x8a,0x7e,0xbf,0x55,0xa1,0x79,0xbf,0xfa,0x3b,0x6e,0xbf,0xcf,0x3a,0x82,0xbf,0x8a,0x50,0x92,0xbf,0x64,0xbc,0x6c,0xbf,0xdb,0x7f,0x81,0xbf,0xe5,0x7c,0xd1,0xbe,0x37,0xbd,0x41,0xbf,0x3a,0x35,0x53,0xbf,0x70,0x8f,0x27,0xbf,0xab,0xd1,0x60,0xbf,0xf1,0xa2,0x84,0xbf,0x4e,0xcf,0x03,0xbf,0xe6,0x28,0x3b,0xbf,0x20,0xe5,0x17,0xbf,0x39,0x05,0xd9,0xbf,0x60,0x6b,0x0b,0xbf,0xd3,0x7b,0x4e,0xbf,0x89,0x40,0x53,0xbf,0x94,0x13,0x09,0xbf,0x62,0xec,0xd8,0xbe,0x57,0x04,0x76,0xbf,0x0e,0x7c,0x26,0xbf,0x52,0x42,0x86,0xbf,0x30,0xbe,0x2e,0xbf,0xe9,0x9d,0x6a,0xbf,0x2b,0xa5,0x5d,0xbf,0xae,0xd8,0x4f,0xbf,0x1b,0xe8,0x58,0xbf,0x67,0x06,0x73,0xbe,0x61,0x55,0xa5,0xbf,0xe2,0xde,0x6e,0xbf,0x97,0x94,0x33,0xbf,0x9e,0x5f,0xeb,0xbe,0x59,0x0a,0x3f,0xbf,0xd4,0x47,0x15,0xbf,0xc1,0x44,0xba,0xbf,0x4d,0x34,0x6a,0xbf,0xba,0xee,0x46,0xbe,0x6e,0x7c,0xfa,0xbe,0xa9,0xc9,0x8c,0xbf,0xbe,0x82,0x50,0xbf,0xde,0xd7,0x4f,0xbf,0x46,0x20,0x06,0xbf,0x8c,0x43,0x6e,0xbf,0x7b,0x97,0x8a,0xbe,0x5c,0x3d,0xb5,0xbf,0x83,0xa4,0x97,0xbe,0x35,0x68,0xb7,0xbf,0x36,0x38,0x67,0xbf,0xc8,0x19,0x54,0xbf,0x5a,0xc4,0x92,0xbf,0xbd,0x03,0x20,0xbf,0xb0,0xf9,0x1a,0xbf,0x3e,0x85,0x4a,0xbf,0x66,0x90,0xe0,0xbd,0xa7,0x37,0x2f,0xbf,0x03,0xa3,0x8f,0xbf,0xb1,0xb8,0x13,0xbf,0x08,0x30,0x85,0xbf,0x9d,0x55,0x12,0xbf,0x8c,0x82,0x42,0xbf,0x33,0x05,0xa0,0xbe,0xe7,0x69,0xd4,0xbe,0x49,0xf7,0x27,0xbf,0xb9,0xc7,0xad,0xbe,0xdf,0x27,0x81,0xbf,0x06,0x31,0x7c,0xbf,0x4d,0xf7,0x70,0xbf,0xd6,0xf9,0x2c,0xbf,0xca,0x98,0xd5,0xbe,0x65,0x44,0x40,0xbf,0x73,0xc0,0xa3,0xbf,0x25,0x58,0x30,0xbf,0x52,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x7a,0x4f,0xfe,0xff,0x00,0x00,0x00,0x02,0x94,0x02,0x00,0x00,0x5b,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x84,0x51,0xfe,0xff,0xd0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xfd,0x0d,0xac,0x38,0x1d,0xb1,0xcb,0x38,0xe5,0x06,0xb2,0x38,0x61,0xab,0xaa,0x38,0x55,0x23,0xac,0x38,0x33,0xec,0xc9,0x38,0x8d,0x15,0xa9,0x38,0x56,0x42,0xdc,0x38,0xa0,0x91,0x8c,0x38,0x55,0xb9,0x8d,0x38,0xe7,0x8d,0xdf,0x38,0xa0,0x1a,0xe8,0x38,0xe4,0xd9,0x03,0x39,0x7c,0xe4,0x01,0x39,0x7f,0x64,0x3c,0x38,0xae,0x96,0x7d,0x38,0x6e,0x49,0xb5,0x38,0x05,0x14,0xa7,0x38,0x37,0x0b,0x95,0x38,0x99,0x3b,0x80,0x38,0x23,0xb3,0xb4,0x38,0xba,0xbf,0xaf,0x38,0x61,0x0d,0xce,0x38,0xbd,0xa0,0x9b,0x38,0x46,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1e,0x52,0xfe,0xff,0x00,0x00,0x00,0x09,0x08,0x0d,0x00,0x00,0x5a,0x00,0x00,0x00,0x10,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x2a,0xb6,0xff,0xff,0xa0,0x09,0x00,0x00,0x38,0x07,0x00,0x00,0xd0,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xef,0xc7,0xa1,0x3b,0xc3,0x39,0xea,0x3b,0x97,0x4e,0x8f,0x3b,0xd0,0x94,0xa1,0x3b,0xc5,0x59,0xb2,0x3b,0x14,0xea,0x50,0x3e,0x7f,0x73,0x0a,0x3c,0x2f,0x54,0x00,0x3c,0x6b,0x27,0x12,0x3c,0xc5,0x1f,0xfa,0x3b,0xd0,0x4a,0xf8,0x3b,0xcf,0xb3,0xd1,0x3e,0xfd,0xd3,0xc7,0x3b,0x68,0xd7,0x17,0x3c,0x2f,0x04,0x03,0x3c,0x06,0xc4,0xc0,0x3b,0x03,0xa4,0x99,0x3b,0x30,0x03,0x35,0x3c,0xeb,0x08,0xb7,0x3b,0x71,0x34,0x07,0x3c,0xe7,0x19,0xc7,0x3b,0x39,0x84,0xf1,0x3d,0x49,0x08,0xe6,0x3d,0x65,0xaa,0x01,0x3c,0x5c,0x7b,0x00,0x3c,0x39,0x34,0xa0,0x3c,0x71,0x10,0x82,0x3b,0x73,0x8a,0x81,0x3b,0xb3,0x70,0x1a,0x3c,0xee,0xad,0xd2,0x3b,0xc2,0xb7,0x09,0x3c,0x7c,0x46,0x93,0x3b,0xb9,0x6c,0xa3,0x3b,0x93,0x01,0x13,0x3c,0xe1,0xd4,0xc7,0x3b,0xd8,0xf5,0xdc,0x3b,0x29,0x7a,0x54,0x3c,0x6b,0x59,0x81,0x3b,0xfb,0x72,0xa7,0x3b,0xd2,0xea,0x15,0x3c,0xfb,0x27,0xbf,0x3b,0x52,0xd5,0x55,0x3c,0x8e,0x23,0xaf,0x3b,0x2c,0x06,0xdf,0x3b,0xff,0xac,0x09,0x3c,0x0e,0xf1,0xa7,0x3b,0x2d,0x34,0xcc,0x3b,0x7d,0xc3,0xb3,0x3b,0xcc,0xe3,0xa3,0x3b,0xa9,0x5b,0x34,0x3c,0x06,0x8c,0xa1,0x3b,0x1c,0xb3,0x6d,0x3c,0x84,0xfd,0xa6,0x3b,0x0d,0xbf,0xab,0x3b,0xfa,0x53,0x3d,0x3c,0xfb,0xe5,0xe6,0x3b,0x36,0xe3,0x03,0x3c,0x9e,0xe5,0xb6,0x3b,0x29,0x80,0x59,0x3c,0x17,0x88,0x15,0x3e,0x74,0x49,0xde,0x3b,0x51,0xf1,0xc6,0x3b,0x70,0xfc,0x33,0x3c,0x7b,0xee,0xe8,0x3b,0x84,0x6a,0x09,0x3c,0x43,0x1a,0x05,0x3c,0xbe,0x9b,0xf5,0x3e,0x3f,0xdd,0xe6,0x3b,0x79,0x0a,0x02,0x3c,0x4f,0xdc,0xce,0x3b,0x5d,0x3b,0xd6,0x3b,0xd9,0xe9,0xb1,0x3b,0x4c,0xbb,0xe9,0x3b,0x57,0x70,0x2e,0x3c,0xf3,0x02,0xba,0x3b,0x8d,0x6e,0xa6,0x3b,0xa0,0x82,0x24,0x3c,0x17,0x2f,0x9d,0x3b,0x0a,0x2c,0x1c,0x3c,0xf5,0xdd,0xf3,0x3b,0x4f,0x98,0xce,0x3b,0x6a,0xda,0xec,0x3b,0x2a,0x6b,0xb8,0x3b,0x9d,0xb3,0x8e,0x3b,0x14,0xbd,0x88,0x3b,0xd9,0x73,0x1d,0x3c,0xa5,0xb0,0x66,0x3c,0x11,0xec,0xb9,0x3b,0xa3,0xbf,0xc3,0x3b,0x00,0x53,0xe4,0x3b,0x83,0x8b,0x07,0x3c,0x6f,0x71,0xd4,0x3b,0x4c,0x62,0xf3,0x3b,0x13,0x09,0xac,0x3b,0x02,0x1b,0xbf,0x3b,0xe0,0xf1,0x10,0x3c,0xf0,0x19,0xe2,0x3b,0x67,0x9b,0xd9,0x3b,0x00,0x4a,0x33,0x3c,0x88,0xe2,0xea,0x3b,0xb6,0x56,0x11,0x3c,0xbf,0x62,0xad,0x3b,0xc1,0xae,0x37,0x3c,0x3b,0x67,0xb4,0x3b,0x7b,0xe7,0xbe,0x3b,0x6e,0x3c,0xd7,0x3b,0xaf,0xd6,0x3c,0x3c,0xd7,0x83,0x0b,0x3c,0x7c,0x04,0x57,0x3c,0x9c,0x3a,0x98,0x3b,0xad,0xeb,0x9c,0x3b,0x81,0xd1,0xf0,0x3d,0x65,0x43,0xce,0x3b,0x35,0x2c,0xff,0x3b,0x1e,0x37,0x04,0x3c,0x54,0x96,0xf4,0x3b,0x75,0xdd,0xb7,0x3b,0x1d,0xfb,0xfd,0x3b,0x64,0x99,0xb7,0x3b,0x4d,0x04,0xb4,0x3b,0x0e,0xfd,0xdb,0x3b,0x4a,0x8d,0xa1,0x3b,0xfe,0x44,0xd7,0x3b,0x82,0x93,0xab,0x3b,0x8e,0x41,0xb9,0x3c,0x78,0x38,0x9c,0x3b,0x49,0x0d,0x0b,0x3c,0x24,0x45,0xbe,0x3b,0x45,0x6d,0xd7,0x3b,0x98,0xaa,0xc9,0x3b,0x16,0x1c,0xd4,0x3b,0xc6,0x4f,0xbd,0x3b,0x04,0x72,0xc4,0x3b,0xad,0x30,0xf7,0x3b,0x80,0x29,0xa4,0x3b,0xfc,0x9b,0xef,0x3b,0xd0,0x4c,0xb5,0x3b,0xcc,0xf1,0xe8,0x3b,0x71,0xae,0xc3,0x3b,0xaf,0xd9,0xca,0x3b,0xd4,0x15,0xad,0x3b,0xf7,0x3f,0xae,0x3b,0x56,0x81,0xdb,0x3b,0xcb,0xe9,0xf1,0x3b,0xe8,0xf5,0x90,0x3b,0xb3,0x2a,0xbf,0x3b,0x8f,0xd9,0x45,0x3c,0x91,0x28,0xda,0x3b,0xc1,0xef,0x27,0x3c,0x8c,0x90,0x4f,0x3c,0xa8,0xbc,0xdd,0x3b,0x79,0xb6,0xde,0x3b,0x98,0x00,0x00,0x00,0xd0,0x08,0xcf,0xbc,0x4f,0x65,0x68,0x3f,0xfa,0x2f,0x0e,0x3f,0xa6,0x51,0x20,0x3f,0x63,0x1f,0x88,0xbd,0x40,0x48,0xcf,0x41,0xef,0x90,0xb0,0xbe,0x0e,0xa7,0x7e,0x3f,0x1c,0x03,0x91,0x3f,0x85,0x2b,0x78,0x3f,0x3a,0x5a,0x76,0x3f,0x67,0x10,0x50,0x42,0x55,0x44,0x46,0x3f,0xb9,0xa7,0x96,0x3f,0x85,0x7c,0x09,0xbd,0xdf,0x4f,0x4f,0xbe,0xea,0x35,0x37,0xbd,0x2a,0x99,0xb3,0x3f,0xd9,0x9a,0x35,0x3f,0x73,0xfc,0x91,0xbe,0x3a,0xf5,0x58,0xbe,0x31,0xa1,0x6f,0x41,0x38,0x3c,0x64,0x41,0xa2,0xc2,0x39,0xbe,0xbb,0xea,0x3e,0xbd,0xd1,0xf3,0x1e,0x40,0x26,0x93,0x91,0xbe,0x5e,0x87,0x00,0x3f,0xd2,0x3b,0x99,0x3f,0x92,0x08,0x51,0x3f,0x52,0xa4,0x88,0x3f,0x4f,0xf3,0x82,0xbe,0xe0,0x25,0x22,0x3f,0x90,0xdb,0x91,0x3f,0x48,0xbf,0x46,0xbc,0x1f,0x9d,0x59,0xbe,0x35,0xd1,0xd2,0x3f,0x03,0xb0,0xbb,0x3e,0x4f,0x54,0xc2,0xbd,0xfc,0xbe,0x94,0x3f,0x3a,0xc0,0x1a,0xbe,0xa7,0x29,0xd4,0x3f,0x5d,0xda,0x6c,0xbe,0x20,0x48,0x5d,0x3f,0xa5,0x99,0x88,0x3f,0x69,0x33,0x6f,0xbe,0xc5,0x9b,0x4a,0x3f,0x3e,0x27,0x01,0x3f,0x04,0x9c,0x22,0x3f,0xf2,0xf2,0xb2,0x3f,0x16,0xea,0xc3,0x3d,0xb6,0xd7,0xeb,0x3f,0x89,0xaf,0x25,0x3f,0x8f,0x67,0x2a,0x3f,0x52,0xd9,0xbb,0x3f,0x2f,0x18,0x65,0x3f,0xf0,0xff,0xdf,0xbd,0xcf,0xc4,0x24,0xbe,0x29,0xcd,0xd7,0x3f,0x07,0x5d,0x94,0x41,0x28,0xcc,0xab,0x3d,0x5f,0x65,0xc3,0xbd,0x77,0x94,0xb2,0x3f,0x9e,0x1c,0x67,0x3f,0xaf,0x57,0x88,0x3f,0x0e,0x10,0x84,0x3f,0x87,0xb0,0x73,0x42,0x85,0x0f,0x65,0x3f,0x64,0x06,0x81,0x3f,0x96,0x3e,0x4d,0x3f,0xe6,0x8e,0x54,0x3f,0x12,0xb2,0x7e,0xbe,0x13,0xc7,0x8c,0x3d,0x76,0x13,0xad,0x3f,0xbd,0xad,0x61,0xbd,0x28,0x0d,0x78,0xbe,0x9b,0x39,0xa3,0x3f,0x69,0x2c,0x1e,0xbe,0xb2,0xf3,0x9a,0x3f,0x39,0xf6,0x71,0x3f,0xc3,0x4b,0x90,0x3d,0xb5,0x00,0x6b,0x3f,0xb6,0x45,0x2e,0xbe,0x23,0xb8,0xff,0xbd,0x9a,0xab,0x07,0x3f,0xf1,0x38,0x9c,0x3f,0x44,0xe3,0xe4,0x3f,0x0a,0x8e,0xa1,0xbe,0x49,0xe4,0x2f,0x3f,0x5a,0x8a,0x62,0x3f,0x61,0x7b,0x27,0x3f,0x26,0xe3,0x0d,0xbe,0x87,0x7b,0x71,0x3f,0x01,0x22,0xf6,0x3e,0x4a,0x59,0xee,0xbd,0xb0,0xa5,0x18,0x3f,0xbc,0x55,0x60,0x3f,0x30,0xe8,0x57,0x3f,0x6c,0xe3,0xb1,0x3f,0xc3,0x0c,0x69,0x3f,0x09,0x34,0x90,0x3f,0xfa,0x07,0x2c,0x3f,0x63,0x3f,0xb6,0x3f,0x6d,0xfe,0x32,0x3f,0xa8,0x81,0x2d,0x3e,0xf4,0x52,0x87,0xbe,0x02,0x5d,0xbb,0x3f,0xcf,0x6c,0x8a,0x3f,0x73,0x56,0xd5,0x3f,0x77,0x26,0x7f,0xbe,0x6b,0x13,0x56,0xbe,0xde,0xef,0x6e,0x41,0x14,0xd9,0x10,0x3f,0xdd,0x2d,0x7d,0x3f,0xb0,0x2e,0x83,0x3f,0x5e,0x6f,0x0e,0xbe,0x27,0xca,0xb9,0x3d,0x27,0xff,0x7b,0x3f,0x31,0x2a,0x36,0x3f,0xba,0xda,0xb3,0xbd,0xe9,0x0a,0x0a,0xbe,0x2f,0x4a,0x20,0x3f,0x8f,0x12,0xce,0xbd,0xf4,0xb5,0x9b,0xbe,0x0b,0xcf,0x37,0x40,0xdb,0xa0,0xf4,0x3e,0x2e,0xf7,0x89,0x3f,0xa5,0xba,0x91,0x3c,0x6a,0xbe,0x55,0x3f,0x79,0x98,0xa1,0x3e,0x9e,0xeb,0xb7,0xbe,0x57,0x1f,0x14,0x3e,0x62,0x28,0xfe,0xbd,0x4c,0x42,0x75,0x3f,0x98,0x67,0x8b,0xbd,0x01,0x0e,0x3e,0x3f,0x36,0xe2,0x33,0x3f,0xe8,0x1f,0x67,0x3f,0xd2,0x43,0x31,0x3f,0xfc,0x43,0x49,0x3f,0xa8,0xbb,0x2b,0x3f,0x9c,0xbc,0xdc,0x3b,0xed,0x89,0x93,0xbe,0x1b,0x86,0x0f,0x3f,0xfc,0xd3,0x0f,0x3f,0x21,0x19,0x2d,0xbe,0xdc,0x4d,0xc4,0x3f,0x5b,0xb2,0x35,0x3d,0xe1,0x9f,0xa6,0x3f,0x6b,0xf1,0xcd,0x3f,0x6c,0x3b,0x02,0xbd,0x4c,0x6d,0xb5,0xbd,0x98,0x00,0x00,0x00,0x5f,0x84,0x20,0xbf,0xda,0x22,0x11,0x3e,0x14,0x2f,0x61,0x3e,0x22,0xfd,0x3c,0x3e,0x11,0xf5,0x30,0xbf,0x27,0xcb,0x0d,0x40,0x98,0x5e,0x89,0xbf,0xef,0x61,0x11,0x3e,0xb4,0xfe,0x9b,0x3e,0x9a,0x7b,0xed,0x3c,0x9a,0xe8,0xa9,0x3e,0x3d,0x8c,0x2d,0xc2,0xe5,0x94,0x12,0xbf,0x62,0x9a,0xac,0xbe,0x27,0xfe,0x81,0xbf,0x7e,0x42,0x3f,0xbf,0xbb,0x70,0x18,0xbf,0xf6,0xe4,0x23,0xbe,0x1f,0x12,0xbe,0xbe,0x08,0x26,0x86,0xbf,0xb3,0x8b,0x45,0xbf,0x28,0xf4,0x07,0xc1,0xe9,0x48,0x1a,0xc1,0x10,0xa7,0x80,0xbf,0xca,0xf4,0x7e,0xbf,0xc6,0xf7,0x74,0x3f,0x50,0x0c,0x01,0xbf,0x50,0x4a,0x35,0x3e,0xbf,0x89,0x87,0xbc,0x6e,0x36,0x6f,0x3e,0x24,0x83,0x73,0xbe,0xef,0x1f,0x12,0xbf,0xd3,0x86,0x12,0x3e,0xbd,0xe9,0x01,0xbe,0x37,0x45,0x46,0xbf,0xec,0x3b,0x5b,0xbf,0xf2,0xe0,0xa5,0x3e,0xb8,0x56,0x00,0xbf,0x15,0x24,0x26,0xbf,0xec,0x36,0xa9,0x3e,0xab,0xa9,0x3d,0xbf,0xd3,0x9c,0x71,0xbf,0x47,0xc5,0x2d,0xbf,0x16,0x2a,0x9c,0x3d,0x4d,0xe0,0x13,0x3e,0x2c,0xa1,0x26,0xbf,0xfd,0x7b,0x1b,0xbf,0xf6,0x5b,0x32,0xbf,0x52,0x72,0x14,0xbf,0xa7,0xcc,0xfe,0x3e,0xee,0x48,0x20,0xbf,0xca,0x66,0x6d,0xbf,0x7e,0x6c,0xb8,0x3d,0x92,0xa0,0xf5,0xbe,0x8f,0x23,0x6a,0xbf,0xa6,0x2d,0x4e,0xbf,0x70,0xdb,0x82,0xbf,0xd3,0x77,0x35,0xbf,0xf1,0x0a,0xbf,0x3d,0xcf,0xb1,0xfa,0xbf,0xe1,0x8c,0x5c,0xbf,0x6e,0x63,0x45,0xbf,0x01,0x4d,0x0a,0x3f,0xe3,0x62,0xbe,0x3e,0x4a,0x49,0xbc,0x3e,0x4f,0x1d,0xc1,0x3d,0x1b,0xb0,0x56,0xc2,0xd3,0x70,0x8d,0xbe,0xd0,0x86,0x82,0xbd,0xc3,0x20,0xc9,0x3e,0x44,0x5c,0x1d,0xbf,0x05,0x86,0x30,0xbf,0xd5,0xe7,0x67,0xbf,0xb5,0x2b,0x0b,0x3f,0xed,0x8e,0x38,0xbf,0xb0,0x21,0x25,0xbf,0xc6,0xbf,0x5f,0xbc,0xb9,0xf4,0x1b,0xbf,0xfa,0x9c,0x6e,0xbf,0x50,0x13,0x1a,0x3e,0x1e,0xfb,0x4c,0xbf,0x1a,0x52,0x88,0x3e,0x54,0xfa,0x36,0xbf,0x36,0x96,0x0d,0xbf,0x29,0xc9,0xa9,0x3d,0x60,0x83,0x47,0x3d,0xa0,0x02,0xb1,0x3d,0x39,0x78,0x38,0xbf,0x24,0x38,0x42,0xbf,0xea,0xfb,0xcc,0xbe,0x6c,0x7c,0x86,0xbf,0x8c,0xc8,0x52,0xbf,0x39,0x24,0x4c,0x3e,0x01,0xb1,0x2a,0xbf,0xcc,0x9c,0x3d,0xbf,0xfc,0xcf,0x8f,0xbf,0x1e,0x50,0x6f,0x3e,0x22,0x7b,0x89,0xb9,0xa3,0x6e,0x6b,0x3e,0xb9,0xbf,0x05,0xbe,0x49,0xdf,0xcb,0xbc,0x72,0x6d,0x9e,0xbd,0x8d,0x2c,0xb2,0x3e,0xbf,0x7b,0x4f,0xbe,0xac,0x69,0x3d,0xbf,0xf5,0x8d,0x55,0xbf,0x9b,0xb9,0x04,0x3f,0xf4,0x8c,0x00,0xbf,0x42,0x9f,0xd9,0x3e,0x27,0x0a,0x17,0xbf,0xd6,0xb1,0x1b,0xbf,0x67,0x12,0xfc,0xc0,0xde,0xa6,0x4c,0xbf,0x5b,0xdc,0xe7,0x3d,0x18,0xf6,0x23,0xbf,0x27,0xad,0x72,0xbf,0xba,0x6d,0x36,0xbf,0x57,0xc6,0x2e,0xbf,0xd7,0x4c,0x13,0xbf,0x44,0x9c,0x32,0xbf,0x14,0x45,0x5a,0xbf,0x24,0xf1,0x2b,0x3e,0x74,0x96,0x55,0xbf,0x5b,0x3c,0x2a,0xbf,0x97,0x64,0x80,0xbf,0x07,0x00,0x1b,0xbf,0x7a,0x5f,0xc3,0x3d,0x9a,0xc8,0x3c,0xbf,0x04,0xcf,0x04,0xbd,0x43,0x17,0x48,0xbf,0xde,0x73,0x52,0xbf,0x26,0xd5,0x3b,0xbf,0x20,0xe9,0x42,0xbf,0x28,0x6c,0x42,0xbf,0x2d,0xe1,0x22,0xbf,0xc4,0xbc,0x6d,0xbf,0x12,0x09,0x70,0x3e,0x95,0xb0,0xed,0xbe,0x14,0x27,0x42,0xbf,0x35,0xb1,0x08,0x3e,0xc5,0x66,0x09,0xbe,0x77,0xe3,0x2c,0xbf,0x53,0xca,0x59,0xbf,0xf7,0x05,0x70,0xbf,0x71,0xac,0xff,0xbe,0x5e,0xac,0x3d,0xbf,0x8c,0x74,0x12,0xbe,0x40,0x74,0x58,0xbf,0x62,0x06,0x6a,0xbf,0xbd,0x21,0x84,0xbf,0x2f,0x01,0x5c,0xbf,0x0c,0xf9,0x5c,0xbf,0xeb,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x42,0x5f,0xfe,0xff,0x00,0x00,0x00,0x02,0xc4,0x02,0x00,0x00,0x59,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x61,0xfe,0xff,0xf0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xc1,0xca,0xdc,0x38,0x80,0x17,0xc7,0x38,0xac,0xe1,0xea,0x38,0x70,0x04,0xed,0x38,0x04,0x3f,0x21,0x39,0x77,0xe2,0xcd,0x38,0x52,0x2d,0x55,0x38,0x9e,0x02,0x19,0x39,0xa2,0x8f,0xae,0x38,0x88,0x96,0x05,0x39,0x0b,0x29,0x27,0x39,0x10,0x83,0x8a,0x38,0xed,0x7c,0xcd,0x38,0xf9,0xa4,0xe5,0x38,0x49,0xf5,0x39,0x38,0x9b,0xdc,0xe6,0x38,0x4c,0x39,0x07,0x39,0x7f,0xf2,0xff,0x38,0x0d,0x0b,0xbd,0x38,0x8e,0xb8,0xb2,0x38,0xf6,0xb1,0x1e,0x39,0x95,0x23,0x84,0x38,0xc7,0xec,0xfa,0x38,0x18,0x6c,0xca,0x38,0x93,0x5c,0xb7,0x38,0x46,0x2f,0x2f,0x39,0x10,0x2e,0x0f,0x39,0xe4,0xb7,0x9b,0x38,0x47,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x16,0x62,0xfe,0xff,0x00,0x00,0x00,0x09,0x70,0x0d,0x00,0x00,0x58,0x00,0x00,0x00,0x10,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x22,0xc6,0xff,0xff,0xa0,0x09,0x00,0x00,0x38,0x07,0x00,0x00,0xd0,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x7c,0x30,0x28,0x3c,0x2a,0x75,0x2b,0x3c,0xc3,0xed,0x04,0x3c,0x1b,0xb9,0x20,0x3c,0x26,0xe8,0x2b,0x3c,0x69,0x78,0xf3,0x3b,0xfd,0x5b,0xa5,0x3b,0xba,0x64,0x26,0x3c,0x46,0x05,0xbf,0x3b,0xb4,0x9e,0x2f,0x3c,0xe8,0xf0,0x04,0x3c,0x44,0x90,0x32,0x3c,0xb1,0x3e,0xd3,0x3b,0x53,0x49,0x26,0x3c,0x23,0xf8,0xeb,0x3b,0x3b,0x84,0xee,0x3b,0x70,0xf4,0xe2,0x3b,0xa1,0xeb,0x22,0x3c,0x72,0x3a,0xa0,0x3b,0xc4,0x92,0x2e,0x3c,0x97,0xff,0x37,0x3c,0xfd,0xdb,0x05,0x3c,0x4b,0xbf,0xcf,0x3b,0x35,0x7b,0xc5,0x3b,0x32,0xb0,0x1a,0x3c,0x0a,0x7d,0x1e,0x3c,0xb2,0xbd,0xf3,0x3b,0xbb,0x75,0x78,0x3c,0x88,0x8a,0xb7,0x3b,0x75,0x15,0xf6,0x3b,0x45,0x8d,0xd0,0x3b,0x23,0x25,0xca,0x3b,0x2e,0x56,0xe5,0x3b,0x62,0xf4,0x13,0x3c,0x29,0x1c,0x23,0x3c,0x50,0x67,0x28,0x3c,0x5c,0x05,0xdc,0x3b,0xaf,0xee,0x19,0x3c,0xaf,0xaa,0xec,0x3e,0xc7,0x7f,0x10,0x3c,0x5b,0x2a,0x1c,0x3c,0xcf,0x77,0x05,0x3c,0xdb,0x2c,0x3f,0x3c,0x3c,0x45,0x64,0x3c,0xa0,0x1f,0x62,0x3c,0x4e,0x3d,0x3b,0x3c,0x2e,0x28,0xfe,0x3b,0xc3,0x56,0xe1,0x3b,0x4c,0xfc,0x82,0x3c,0xc4,0xf2,0x1b,0x3c,0x92,0xd9,0x3c,0x3c,0x9d,0x3a,0x08,0x3c,0xbf,0xbe,0xdb,0x3b,0xf4,0x4a,0x29,0x3c,0x1a,0xd2,0x15,0x3c,0x0c,0x2e,0xa3,0x3b,0xf1,0xe4,0x71,0x3d,0x02,0xf8,0xc2,0x3b,0x6b,0xa2,0xf5,0x3b,0x0a,0xcb,0xb0,0x3b,0xfe,0xd1,0x03,0x3c,0x46,0xbf,0x3d,0x3c,0xb6,0xbf,0x38,0x3c,0x0a,0x49,0x70,0x3c,0xd1,0x1f,0xf1,0x3b,0xb8,0xfa,0xfc,0x3b,0x89,0x8a,0x16,0x3c,0xf0,0xd8,0x48,0x3c,0x72,0xa2,0xc5,0x3b,0x1f,0xcd,0x20,0x3c,0xd5,0xf3,0x1f,0x3c,0x52,0x03,0x20,0x3c,0x08,0x3b,0x08,0x3c,0x90,0xfd,0x81,0x3c,0x0f,0x59,0x3c,0x3c,0x15,0x5d,0x17,0x3c,0x88,0x66,0x42,0x3c,0x70,0xfd,0x60,0x3c,0x92,0x07,0x12,0x3c,0x7a,0x2a,0xab,0x3c,0xf1,0xbc,0x49,0x3c,0x7b,0xbf,0x2c,0x3c,0x3b,0xef,0x29,0x3c,0x66,0x3b,0xe5,0x3b,0x92,0x1c,0x63,0x3c,0x3a,0x20,0x84,0x3b,0x13,0xe7,0xfc,0x3b,0x71,0xf0,0x8c,0x3c,0xed,0xfe,0xdf,0x3c,0x25,0x91,0x1f,0x3c,0x2e,0x8f,0x6c,0x3c,0xe6,0x8b,0x11,0x3c,0x22,0x37,0xe1,0x3b,0xf7,0x4e,0x01,0x3c,0xe5,0xf6,0x4d,0x3c,0xb4,0xd3,0x38,0x3c,0x44,0xce,0x31,0x3c,0xa2,0xfe,0xc5,0x3c,0xe6,0xac,0x4d,0x3c,0x59,0x7c,0xb8,0x3b,0x3a,0x54,0x9f,0x3b,0x88,0x9e,0x45,0x3c,0xdc,0xf3,0x32,0x3c,0x1c,0x85,0xf7,0x3b,0x9a,0x3e,0x0e,0x3c,0x59,0xf3,0xdc,0x3b,0xc1,0x3d,0xf0,0x3b,0x90,0xc5,0xcc,0x3b,0xa5,0x70,0x1c,0x3c,0xcc,0x1e,0xb3,0x3b,0x11,0x73,0xfb,0x3d,0x34,0xb4,0xb4,0x3b,0x2e,0x46,0x9a,0x3b,0xb7,0x57,0x0e,0x3c,0xef,0x61,0xe3,0x3b,0x8c,0xa4,0xd2,0x3b,0x2f,0x2b,0x32,0x3c,0x8b,0x77,0xef,0x3b,0xaa,0x6d,0x58,0x3c,0xff,0xd9,0x2e,0x3c,0x16,0x4e,0xdf,0x3b,0xf5,0x18,0x73,0x3c,0x82,0x46,0x3a,0x3c,0x10,0x8d,0x17,0x3c,0x6a,0x11,0x95,0x3b,0x78,0x70,0x35,0x3c,0x89,0x95,0x4f,0x3c,0x61,0xb1,0xe8,0x3b,0xe3,0xb4,0x13,0x3c,0x91,0xa7,0x95,0x3b,0xb3,0x30,0x35,0x3c,0xaa,0x2f,0xc7,0x3b,0xa0,0xfe,0xf4,0x3b,0x30,0x87,0xee,0x3b,0xef,0x07,0x30,0x3c,0xea,0xef,0xad,0x3b,0x26,0x39,0x41,0x3c,0xbc,0xca,0x51,0x3c,0x7e,0xad,0x42,0x3c,0x77,0x7f,0xe6,0x3b,0xd1,0x72,0xde,0x3b,0x67,0xa8,0x67,0x3c,0xdc,0x48,0x40,0x3c,0x94,0xe7,0x22,0x3c,0xba,0xd7,0x15,0x3c,0xb7,0xc7,0x1d,0x3c,0x3b,0x77,0xd4,0x3b,0x94,0xa3,0x40,0x3c,0x6d,0x5b,0x15,0x3c,0x56,0x5f,0x83,0x3c,0xa6,0x52,0x93,0x3c,0xf5,0xf7,0x42,0x3c,0x98,0x00,0x00,0x00,0xa2,0x8f,0x87,0x3f,0x40,0x1e,0xaa,0x3f,0xe7,0xe3,0x83,0x3f,0xa9,0x77,0x9f,0x3f,0x56,0x90,0xaa,0x3f,0x78,0x91,0x71,0x3f,0x99,0x57,0x47,0xbe,0xf1,0x17,0xa5,0x3f,0x23,0xf9,0x1e,0x3e,0x77,0x3f,0xae,0x3f,0x06,0xe7,0x83,0x3f,0x23,0x2b,0xb1,0x3f,0x12,0x58,0x1a,0x37,0xc0,0xfc,0xa4,0x3f,0xde,0x21,0x77,0xbe,0x18,0x9c,0x4e,0x3f,0x45,0xc9,0x4c,0x3f,0xca,0xa5,0xa1,0x3f,0x7d,0x96,0xc0,0x3e,0x9e,0x35,0xad,0x3f,0x98,0x8f,0xb6,0x3f,0x45,0xd0,0x84,0x3f,0x48,0xc3,0xa6,0xbd,0x3f,0xf0,0x43,0x3f,0xd2,0x7a,0x99,0x3f,0x3e,0x3b,0x8b,0x3f,0x73,0x53,0x6b,0x3f,0xd0,0x84,0xf6,0x3f,0x89,0xaa,0xb6,0x3e,0x4a,0x29,0x74,0x3f,0x33,0x0d,0x82,0xbd,0xd9,0x90,0x48,0x3f,0x82,0x8b,0x63,0x3f,0x79,0xcc,0x92,0x3f,0x45,0xa1,0x1f,0x3f,0x81,0x16,0xa7,0x3f,0x51,0x4d,0x5a,0x3f,0xd2,0xba,0x98,0x3f,0x5a,0xd1,0x6a,0x42,0xc7,0x5e,0x8f,0x3f,0x7d,0x70,0x73,0x3f,0xb9,0x98,0x1e,0x3f,0x81,0xae,0xbd,0x3f,0xb2,0x7c,0xe2,0x3f,0x61,0x5b,0xe0,0x3f,0xd7,0x26,0x8a,0x3f,0xe1,0xed,0x68,0x3f,0xab,0xce,0xae,0x3e,0x53,0xf6,0x01,0x40,0xde,0xba,0x9a,0x3f,0xdf,0x5f,0xbb,0x3f,0x63,0xf9,0x73,0x3d,0x42,0x07,0x5a,0x3f,0x5e,0xf8,0xa7,0x3f,0x1e,0x06,0x8d,0x3f,0xe2,0x2a,0x03,0xbc,0x27,0x01,0xf0,0x40,0x12,0x72,0x41,0x3f,0x26,0xb7,0x73,0x3f,0xe9,0x79,0x2c,0x3f,0x5a,0xca,0x82,0x3f,0xc7,0x43,0xbc,0x3f,0x37,0x4e,0xb7,0x3f,0x78,0x68,0xee,0x3f,0x70,0x49,0xf3,0x3e,0xc3,0x00,0x7b,0x3f,0x74,0x5d,0x95,0x3f,0x3e,0x47,0xc7,0x3f,0xfa,0x25,0x89,0x3d,0x85,0x8b,0x9f,0x3f,0xed,0xb3,0x9e,0x3f,0x4b,0xc3,0x9e,0x3f,0x92,0x2a,0x87,0x3f,0x95,0xf9,0x00,0x40,0x5d,0xe0,0xba,0x3f,0x5b,0x2e,0x96,0x3f,0xbb,0xe1,0xc0,0x3f,0x75,0x3b,0xdf,0x3f,0x83,0xe3,0x90,0x3f,0x25,0xd4,0x29,0x40,0x77,0x29,0xc8,0x3f,0xfc,0x65,0xab,0x3f,0x5d,0x9b,0xa8,0x3f,0xef,0x70,0x63,0x3f,0x59,0x56,0xe1,0x3f,0xc8,0x75,0x0d,0xbd,0x45,0xed,0x7a,0x3f,0x90,0xd6,0x0b,0x40,0xef,0x3e,0x5e,0x40,0x03,0x52,0x9e,0x3f,0x10,0xb6,0xea,0x3f,0x1d,0xb7,0x87,0x3f,0xe1,0x8c,0x2b,0x3f,0x59,0x4c,0x80,0x3f,0xea,0xa7,0x9b,0x3f,0x0d,0x62,0xb7,0x3f,0x1e,0x7f,0xae,0x3f,0xa5,0x72,0x44,0x40,0x8c,0x11,0xcc,0x3f,0x60,0x0b,0x37,0x3f,0x24,0xf1,0x24,0xbe,0x4b,0x13,0xc4,0x3f,0xf4,0x8d,0xb1,0x3f,0x12,0x96,0x75,0x3f,0x58,0x3b,0x42,0x3f,0xc2,0x2e,0x48,0x3f,0x45,0x5d,0x6e,0x3f,0x05,0x2c,0x4b,0x3f,0xc4,0x37,0x9b,0x3f,0xd9,0x8f,0x5c,0xbe,0x2b,0x7c,0x79,0x41,0x74,0xd2,0x27,0x3d,0x85,0xd0,0x15,0xbe,0x08,0x3b,0x8d,0x3f,0x97,0xe7,0xa5,0x3e,0x43,0xff,0x50,0x3f,0xd9,0xc6,0xb0,0x3f,0x9c,0x98,0x6d,0x3f,0xcf,0xbc,0xd6,0x3f,0x4b,0x7c,0xad,0x3f,0x7a,0x8f,0x5d,0x3f,0xc3,0x32,0xf1,0x3f,0xf5,0xd1,0xb8,0x3f,0xf6,0x5d,0x96,0x3f,0x61,0xcd,0x7e,0xbe,0x97,0x05,0xb4,0x3f,0x5e,0xf6,0xcd,0x3f,0xfe,0xdf,0x66,0x3f,0x79,0x8d,0x92,0x3f,0x01,0xa6,0xbb,0x3a,0x52,0xc6,0xb3,0x3f,0xe1,0x1f,0x87,0x3d,0x10,0xc8,0x2d,0x3f,0x22,0xaa,0x6c,0x3f,0xdf,0xa7,0xae,0x3f,0xff,0x99,0x07,0xbe,0x7b,0x1c,0x25,0xbe,0x27,0x27,0xd0,0x3f,0xcb,0x6a,0x90,0x3e,0x82,0xb4,0x54,0x3f,0xeb,0xb5,0x5c,0x3f,0x37,0x81,0xd1,0x3f,0x4a,0xc8,0xbe,0x3f,0xc5,0xa1,0xa1,0x3f,0x0b,0xac,0x94,0x3f,0x28,0x8c,0x9c,0x3f,0x1d,0x90,0x3b,0x3f,0x0d,0x6a,0x8f,0x3f,0x2f,0x6e,0x8b,0x3f,0x97,0x58,0x02,0x40,0x01,0x2c,0x12,0x40,0x05,0x72,0xc1,0x3f,0x98,0x00,0x00,0x00,0x1b,0xe0,0xa6,0xbf,0x82,0x77,0x36,0xbe,0x89,0x45,0x06,0xbf,0xf3,0xff,0x18,0xbf,0xb8,0x90,0x8b,0xbf,0xfe,0xcb,0x8a,0xbe,0x45,0x11,0x24,0xbf,0x4e,0xa1,0x44,0xbf,0x3b,0x87,0x3d,0xbf,0xad,0x5d,0xa8,0xbf,0xb2,0x49,0x6d,0xbf,0x53,0xbd,0x4c,0xbf,0x34,0x98,0x51,0xbf,0x63,0x1e,0xea,0xbe,0x33,0x20,0x6a,0xbf,0x33,0xa7,0x6c,0xbf,0x87,0x2e,0x61,0xbf,0x9a,0x08,0x7a,0xbf,0xfd,0xf9,0x1e,0xbf,0x45,0x54,0x7c,0xbf,0xda,0xb0,0x4b,0xbf,0x71,0xd0,0x63,0xbf,0xcc,0x1f,0x4e,0xbf,0x82,0x2b,0x34,0xbf,0x91,0x79,0xae,0xbe,0x10,0x40,0x9d,0xbf,0x37,0xd6,0x71,0xbf,0x1e,0xe9,0xb4,0xbf,0x73,0x1b,0x36,0xbf,0x6c,0x1c,0x74,0xbf,0x2a,0xec,0x4e,0xbf,0xa5,0x1a,0x85,0x3e,0x3f,0x71,0x42,0xbf,0xa6,0x57,0x81,0xbf,0xf1,0xd5,0xa1,0xbf,0x54,0xf2,0x19,0xbf,0xfb,0x28,0x90,0xbc,0xed,0xc9,0x26,0xbf,0xd9,0xd0,0x3b,0xc2,0x4e,0xf7,0xc6,0xbe,0x06,0xf2,0x9a,0xbf,0xdf,0x6c,0x84,0xbf,0x41,0xda,0x00,0xbc,0x92,0xb7,0x80,0xbf,0xd8,0xd2,0x3e,0xbe,0xd3,0xc6,0xb9,0xbf,0xde,0x2b,0x7c,0xbf,0x15,0x94,0x5f,0xbf,0x11,0xbe,0x8a,0xbf,0x94,0xa9,0x8f,0xbf,0xe1,0x60,0xa5,0xbe,0x28,0x2a,0x87,0xbf,0xcf,0x6e,0x2d,0xbf,0x0e,0xff,0x64,0xbf,0x76,0xa6,0x94,0xbf,0xb0,0xe7,0x21,0xbf,0x98,0xfd,0x49,0xc0,0xdc,0xf7,0x7b,0xbd,0x97,0xe0,0x36,0xbf,0x74,0x69,0x2f,0xbf,0xc1,0x99,0x65,0xbd,0x93,0xb6,0x93,0xbf,0xbb,0x0a,0x93,0xbf,0xa7,0x02,0xa6,0xbf,0x91,0x3d,0x6f,0xbf,0x5e,0x62,0x29,0xbf,0x0a,0xd2,0x89,0xbf,0x58,0x43,0x84,0xbf,0x2d,0x17,0x44,0xbf,0x6f,0x58,0x1c,0xbe,0x6b,0x95,0xeb,0xbe,0x57,0xda,0x71,0xbf,0xd6,0xa7,0x40,0xbf,0xce,0xb0,0xbf,0xbf,0x5e,0xad,0xd1,0xbe,0x9c,0x45,0x70,0xbf,0x11,0x00,0x1a,0xbf,0xb2,0x20,0x16,0xbf,0x7e,0x2b,0x5b,0xbf,0xa3,0x7f,0xa1,0xbf,0x97,0x01,0x0e,0xbe,0xda,0x4f,0xdc,0xbe,0x6e,0x16,0x8a,0xbf,0xc6,0xab,0x44,0xbf,0xee,0x21,0x96,0xbf,0xfa,0x17,0x03,0xbf,0xd7,0xb9,0x48,0xbf,0x7d,0x1b,0x9f,0xbf,0xbb,0x2e,0xd3,0xbf,0x55,0x7f,0x6c,0xbf,0x37,0x86,0xb3,0xbf,0xce,0x68,0x90,0xbf,0xb4,0x74,0x5f,0xbf,0x52,0x0d,0xe5,0xbe,0xf7,0x5a,0xcc,0xbf,0x39,0x76,0xa0,0xbe,0xa7,0x6a,0xb0,0xbf,0xa7,0x11,0x47,0xbf,0x48,0x2e,0x99,0xbf,0xe8,0x3e,0x35,0xbf,0x92,0x15,0x1e,0xbf,0xfc,0xac,0x4d,0xbf,0x67,0xee,0x3e,0xbf,0xc9,0x0d,0x06,0xbf,0x1d,0x22,0x8d,0xbf,0x72,0x39,0x5b,0xbf,0x47,0xc1,0x60,0xbf,0x96,0xcc,0x31,0xbf,0xba,0xd3,0x97,0xbf,0x8e,0xb8,0x31,0xbf,0xc0,0x14,0x61,0xc0,0xcc,0x4a,0x33,0xbf,0xa2,0x11,0x19,0xbf,0xb0,0x18,0xf1,0xbe,0x2b,0x9b,0x61,0xbf,0x4a,0xd6,0x25,0xbf,0xb5,0xfe,0x67,0xbf,0xf5,0x1a,0x1f,0xbf,0xd3,0xc6,0x0e,0xbf,0x63,0x74,0x61,0xbf,0x02,0xfa,0x17,0xbf,0xd4,0x6c,0xbb,0xbf,0xa5,0x61,0xa3,0xbf,0x0d,0xa6,0x27,0xbf,0x47,0xe7,0x13,0xbf,0x3a,0x0a,0xa4,0xbf,0x17,0x54,0x92,0xbf,0x0d,0x7c,0x1f,0xbf,0x39,0xc3,0x4f,0xbf,0x42,0x7c,0x14,0xbf,0x0c,0x77,0x2c,0xbf,0x4b,0xa1,0x45,0xbf,0xa3,0x14,0x73,0xbf,0x8c,0x99,0x95,0x3d,0x71,0x16,0x0c,0xbf,0x0a,0x94,0x2c,0xbf,0xb4,0xb6,0xbf,0xbf,0x9f,0x2d,0x9c,0xbf,0x23,0x28,0xc1,0xbf,0x78,0xb2,0x64,0xbf,0xdd,0x78,0x4a,0xbf,0x16,0xd9,0xe5,0xbf,0x9b,0xb4,0xe6,0x3d,0x39,0xbe,0x55,0xbe,0x45,0xef,0x30,0xbf,0x24,0xe0,0x67,0xbf,0x4d,0xce,0x52,0xbf,0x4d,0x22,0xbf,0xbf,0xb6,0x30,0x94,0xbf,0xa4,0xc9,0xd0,0xbf,0x17,0x38,0x6c,0xbf,0x03,0x02,0x62,0xbf,0x52,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xa2,0x6f,0xfe,0xff,0x00,0x00,0x00,0x02,0x34,0x02,0x00,0x00,0x57,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xac,0x71,0xfe,0xff,0x90,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xb9,0x40,0x9c,0x38,0xc1,0xa3,0xc1,0x38,0x5e,0x35,0xcb,0x38,0xb4,0xed,0xef,0x38,0xde,0x87,0xba,0x38,0x69,0xf7,0xb9,0x38,0x74,0xfa,0xfe,0x38,0x89,0x41,0xc2,0x38,0x29,0x3c,0xc5,0x38,0x23,0xed,0xcd,0x38,0x81,0x69,0xa1,0x38,0xf9,0xa6,0xc6,0x38,0x2d,0x53,0xa3,0x38,0xaf,0xa6,0xf8,0x38,0x26,0xf8,0xf7,0x38,0x6a,0x1a,0x01,0x39,0x47,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xe6,0x71,0xfe,0xff,0x00,0x00,0x00,0x09,0x70,0x0d,0x00,0x00,0x56,0x00,0x00,0x00,0x10,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0xf2,0xd5,0xff,0xff,0xa0,0x09,0x00,0x00,0x38,0x07,0x00,0x00,0xd0,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x1b,0xf0,0x1a,0x3c,0x51,0x26,0x43,0x3c,0xfe,0xe3,0x13,0x3c,0xe2,0xac,0x91,0x3c,0x22,0x13,0x2f,0x3c,0x1c,0xc3,0x08,0x3c,0x26,0xad,0xb4,0x3b,0x17,0x5c,0x0f,0x3c,0x4c,0x01,0x2f,0x3c,0x90,0x9b,0x27,0x3c,0x3c,0x46,0x42,0x3c,0x25,0x84,0x12,0x3c,0x55,0xcf,0xd0,0x3b,0x36,0x37,0x65,0x3c,0xf2,0x3e,0x3c,0x3c,0xa4,0x84,0xb7,0x3b,0xeb,0x8f,0xe6,0x3b,0x94,0xe6,0xe1,0x3b,0xb5,0xfe,0x54,0x3b,0x7b,0x93,0x2c,0x3c,0x44,0xd1,0x0a,0x3c,0x69,0xaa,0xcb,0x3b,0x84,0x02,0xdb,0x3b,0x31,0x36,0x0c,0x3c,0x4f,0x8c,0x96,0x3b,0x42,0xde,0x21,0x3c,0xef,0x2f,0xd5,0x3b,0xca,0x9a,0xf2,0x3b,0x70,0x73,0x24,0x3c,0xf5,0x6d,0x01,0x3c,0x36,0x8c,0xe3,0x3b,0xfc,0xea,0xa4,0x3b,0xc9,0xde,0x18,0x3c,0x7d,0x38,0x55,0x3c,0xb7,0xc2,0x20,0x3c,0xde,0xf2,0xc4,0x3b,0x1d,0x0a,0xcd,0x3b,0x4f,0xa2,0x91,0x3c,0x41,0x04,0x79,0x3b,0x09,0xad,0x33,0x3c,0x48,0x16,0x02,0x3c,0xe7,0xe2,0x5b,0x3c,0xf5,0xce,0xa3,0x3b,0x24,0x4d,0xd1,0x3b,0xac,0x68,0x03,0x3c,0x1a,0xb2,0x2a,0x3c,0xda,0x73,0xcf,0x3b,0x6d,0xbe,0xde,0x3b,0xd1,0x4b,0x2c,0x3c,0xe2,0x03,0xb7,0x3b,0xdd,0x32,0xea,0x3b,0x37,0xf7,0x16,0x3c,0x1f,0xed,0xd9,0x3b,0xf4,0x75,0x35,0x3c,0x62,0x94,0x5f,0x3c,0x73,0xf0,0xc6,0x3b,0x09,0x69,0x24,0x3c,0x9c,0x6a,0x20,0x3c,0x60,0x6f,0x29,0x3c,0x52,0x5f,0x19,0x3c,0x03,0x5f,0x24,0x3c,0x16,0xea,0x97,0x3c,0xbe,0x78,0x19,0x3c,0x41,0x86,0x3f,0x3c,0x9a,0xa7,0xe4,0x3b,0xc7,0xf7,0x22,0x3c,0x2d,0x57,0xa5,0x3b,0xad,0xc4,0x6e,0x3c,0x18,0x7b,0xbf,0x3b,0xb8,0x3e,0x10,0x3c,0x3b,0xd3,0x57,0x3c,0x21,0x1b,0x25,0x3c,0x64,0x62,0xa4,0x3e,0xc3,0x31,0xa0,0x3b,0x1c,0x00,0x9f,0x3c,0x36,0x53,0x0e,0x3c,0x3e,0x86,0x85,0x3d,0x65,0xd8,0x09,0x3c,0x5c,0x14,0x1e,0x3c,0x5c,0xab,0x2c,0x3c,0x47,0xa3,0x1f,0x3c,0x63,0xb4,0x02,0x3c,0x52,0xf7,0xdb,0x3b,0xbd,0x0d,0x0f,0x3c,0x0a,0x11,0x26,0x3c,0xfe,0xc6,0x8e,0x3c,0xca,0x1c,0x62,0x3c,0xa4,0xda,0x57,0x3c,0x08,0xde,0xbe,0x3b,0x0f,0xcd,0xfa,0x3b,0x67,0x89,0x24,0x3c,0xda,0xfe,0xd5,0x3b,0x0c,0x53,0xe0,0x3b,0x17,0x16,0x5f,0x3c,0xb0,0xc6,0x95,0x3b,0xf1,0x2f,0x91,0x3b,0x56,0xad,0x8b,0x3b,0x33,0x4e,0x01,0x3c,0x3c,0x89,0x6d,0x3c,0x78,0x17,0x47,0x3c,0xd0,0x97,0x3f,0x3c,0x87,0x77,0x49,0x3c,0xaa,0x0d,0x50,0x3c,0xe0,0x75,0x30,0x3c,0xad,0x28,0xc9,0x3b,0xcd,0xf7,0x11,0x3c,0x8f,0x41,0xc7,0x3b,0x3a,0x2d,0x01,0x3c,0x4d,0x1d,0x6f,0x3c,0xa6,0x6f,0x79,0x3c,0xe7,0x60,0xaa,0x3b,0xd6,0xa2,0x54,0x3c,0x71,0x0f,0xe8,0x3b,0x6e,0x94,0x73,0x3c,0x0e,0xc6,0xda,0x3b,0x48,0xd1,0xed,0x3b,0x2a,0xa0,0x3a,0x3c,0x7f,0xfb,0x9c,0x3b,0x97,0x0d,0xb1,0x3b,0x38,0xbb,0x98,0x3c,0x21,0x81,0x55,0x3c,0x24,0x17,0x36,0x3c,0x77,0xef,0xcf,0x3b,0xf0,0x39,0x37,0x3c,0x44,0xd1,0xd1,0x3b,0xc7,0x1f,0xea,0x3b,0x98,0x34,0x95,0x3b,0x98,0xa4,0x04,0x3c,0x3c,0xcb,0x32,0x3c,0x23,0x8e,0xac,0x3b,0xec,0xb0,0x12,0x3c,0x1a,0x67,0x3b,0x3c,0x04,0x40,0xc8,0x3b,0xfa,0x63,0x90,0x3c,0xdc,0x04,0xa3,0x3c,0xa9,0xd0,0x03,0x3c,0x3a,0xd5,0xa2,0x3c,0x3d,0x93,0x1c,0x3c,0xfd,0x0f,0xf3,0x3b,0xc7,0xa3,0x45,0x3c,0x34,0xb0,0x12,0x3c,0x65,0x6e,0x13,0x3c,0x36,0x25,0xf3,0x3b,0xc5,0xb5,0x6f,0x3c,0x4f,0xc9,0x0a,0x3c,0x50,0x40,0xb1,0x3b,0xf3,0x2c,0xc7,0x3c,0x71,0x86,0x16,0x3d,0x76,0xcb,0xf2,0x3b,0x9f,0x84,0x96,0x3c,0x70,0xe5,0xf1,0x3b,0xd9,0x90,0x43,0x3c,0x98,0x00,0x00,0x00,0x3b,0xba,0x99,0x3f,0x06,0x8a,0x18,0x3f,0x36,0xbc,0x92,0x3f,0xbe,0xdc,0xee,0x3f,0x86,0xe2,0x82,0x3f,0x96,0xb1,0x87,0x3f,0x66,0x44,0x5c,0x3e,0xd8,0x39,0x32,0x3f,0x49,0xa3,0xad,0x3f,0x59,0x4c,0xa6,0x3f,0x8b,0xc8,0x63,0x3f,0x1d,0x5f,0x91,0x3f,0xb6,0x2d,0x4f,0x3f,0xc8,0x6c,0xe3,0x3f,0x74,0xc6,0xba,0x3f,0x9b,0x15,0x36,0x3f,0xcb,0xc2,0x64,0x3f,0xc7,0x22,0x60,0x3f,0xb8,0x54,0xd3,0x3e,0x54,0x3a,0xab,0x3f,0x6b,0x5f,0x56,0x3f,0x14,0x13,0x4a,0x3f,0x63,0x23,0x98,0x3c,0xc5,0x1d,0x8b,0x3f,0x36,0x5f,0x15,0x3f,0x4b,0x6e,0x86,0x3f,0x37,0xb7,0x00,0x3d,0x94,0xb5,0x70,0x3f,0x89,0x2a,0xa3,0x3f,0x09,0x5c,0x1c,0x3f,0x1e,0xc5,0x61,0x3f,0x26,0xa1,0x23,0x3f,0x77,0x7f,0xd4,0x3e,0x4a,0x53,0xba,0x3f,0x32,0x81,0x9f,0x3f,0xf8,0x68,0x43,0x3f,0x09,0x70,0x4b,0x3f,0x0a,0x7f,0x10,0x40,0x13,0x54,0x2f,0xbe,0x2c,0xa1,0x95,0x3f,0x1b,0x12,0x81,0x3f,0x8f,0x2d,0x86,0x3f,0xe3,0x9f,0x48,0x3d,0x90,0xda,0x4a,0x3e,0x50,0x15,0x5d,0x3f,0xb6,0x5c,0xa9,0x3f,0x51,0xc9,0xa7,0x3d,0xbf,0xcb,0x72,0x3e,0x39,0xf3,0xaa,0x3f,0xda,0x95,0x35,0x3f,0x77,0x5e,0x68,0x3f,0x49,0xc9,0x95,0x3f,0x45,0x39,0x58,0x3f,0x08,0x0b,0xb4,0x3f,0x39,0xd5,0xdd,0x3f,0x26,0x65,0x03,0x3f,0x37,0x20,0xa3,0x3f,0xc7,0x29,0x9f,0x3f,0x81,0x1c,0xa8,0x3f,0x93,0x2c,0x98,0x3f,0x45,0x16,0xa3,0x3f,0x18,0x76,0xd2,0x3f,0xfa,0xf3,0x81,0x3f,0x5f,0xf2,0x89,0x3f,0x81,0xa1,0x83,0x3e,0xd7,0xb1,0xa1,0x3f,0x7f,0x0c,0x24,0x3f,0x24,0xe7,0xec,0x3f,0x33,0xd5,0x8e,0x3e,0x6b,0x1e,0x35,0x3f,0x95,0x23,0xd6,0x3f,0xeb,0xd0,0xa3,0x3f,0x9f,0x19,0x23,0x42,0xc6,0xbf,0xe8,0x3e,0x50,0xb1,0xce,0x3f,0x90,0x36,0x8d,0x3f,0x4e,0xa6,0x36,0xc0,0xb4,0xc4,0x88,0x3f,0x33,0xd8,0x9c,0x3f,0x05,0x52,0xab,0x3f,0x00,0x64,0x9e,0x3f,0xfa,0xae,0x81,0x3f,0x96,0x6e,0x21,0x3f,0xe9,0xca,0x82,0x3f,0xe8,0xc4,0xa4,0x3f,0x70,0xa9,0x0d,0x40,0x90,0x58,0xe0,0x3f,0xef,0x2a,0xd6,0x3f,0xc3,0xd3,0x3b,0x3f,0x75,0xd7,0x78,0x3f,0x54,0x40,0xa3,0x3f,0xdc,0x52,0x54,0x3f,0x66,0x92,0x5e,0x3f,0xeb,0x57,0xdd,0x3f,0x4f,0x42,0x19,0x3e,0x1f,0x1e,0x07,0x3f,0xfb,0x95,0x0a,0x3f,0x3f,0x23,0xc2,0x3e,0x2a,0xae,0xeb,0x3f,0x49,0x89,0xc5,0x3f,0xa0,0x18,0xbe,0x3f,0x98,0xe4,0xc7,0x3f,0x8f,0x6d,0xce,0x3f,0xf4,0x14,0xaf,0x3f,0x78,0x3e,0x9c,0x3c,0xdd,0xd3,0x90,0x3f,0x0c,0xb3,0x45,0x3f,0x65,0x5f,0xe1,0x3e,0x12,0x3f,0xed,0x3f,0xc7,0x7c,0xf7,0x3f,0x25,0x0c,0x29,0x3f,0x90,0xf9,0xd2,0x3f,0x52,0x3f,0x66,0x3f,0x3e,0x8f,0xcb,0x3f,0x82,0x10,0x59,0x3f,0xa5,0xf5,0x6b,0x3f,0x42,0x17,0x08,0x3f,0x88,0xc1,0x1b,0x3f,0x93,0xe5,0x0d,0x3f,0xc2,0x89,0x17,0x40,0x1f,0xd6,0xd3,0x3f,0x1c,0xb9,0xe1,0x3e,0xd1,0x67,0x27,0x3f,0x7c,0xcb,0xb5,0x3f,0xc8,0x54,0x18,0x3f,0x5d,0xcf,0x2f,0x3f,0x07,0x39,0xf0,0x3e,0xf6,0xb7,0x4d,0x3f,0xa6,0x65,0xb1,0x3f,0x2c,0x0d,0x00,0xbe,0x4d,0x0d,0x90,0x3f,0x4c,0xf0,0xb9,0x3f,0xb8,0x4f,0x23,0x3f,0x32,0x43,0x0f,0x40,0xd2,0xbe,0x21,0x40,0x08,0xc9,0x82,0x3f,0x90,0x8f,0x21,0x40,0x17,0x5a,0x9b,0x3f,0x72,0xaf,0x09,0x3f,0x7f,0x18,0xc4,0x3f,0x54,0x1a,0x1c,0xbe,0x88,0x47,0x92,0x3f,0xec,0x3e,0x71,0x3f,0x59,0xd6,0xed,0x3f,0xbc,0xb3,0x89,0x3f,0x7b,0x46,0x2c,0xbd,0x99,0x9e,0x45,0x40,0xb8,0x44,0x1d,0x40,0x2a,0x22,0x33,0x3f,0x96,0x57,0x15,0x40,0xa5,0x01,0x70,0x3f,0xb7,0x09,0xc2,0x3f,0x98,0x00,0x00,0x00,0x4d,0x01,0x80,0xbf,0x04,0xa0,0xc1,0xbf,0x8c,0x39,0x34,0xbf,0x88,0x89,0x10,0xc0,0xfc,0xb4,0xad,0xbf,0xbb,0x6b,0x89,0xbe,0xcc,0x43,0x33,0xbf,0x5f,0x3d,0x8e,0xbf,0xb6,0x84,0x77,0xbf,0x22,0x12,0x3d,0xbf,0xb0,0xc1,0xc0,0xbf,0x1a,0x7e,0xab,0xbe,0xb5,0xad,0xbf,0xbe,0xac,0xe4,0x3c,0xbf,0x2b,0x88,0x5c,0xbf,0x18,0xf9,0x6d,0xbe,0xdb,0x5f,0x23,0xbf,0xd7,0xf3,0x3e,0xbf,0xce,0x39,0xe4,0xbd,0x84,0x5a,0x81,0xbf,0xa1,0xbb,0x89,0xbf,0x28,0x20,0xf3,0xbe,0x7f,0x4c,0x59,0xbf,0xb7,0x01,0x73,0xbf,0xcc,0x37,0x0b,0xbf,0x85,0x9a,0xa0,0xbf,0x8f,0x85,0x53,0xbf,0x8c,0x2d,0x2b,0xbf,0x4f,0x37,0x81,0xbf,0x19,0x6b,0x80,0xbf,0x1d,0x48,0x28,0xbf,0x12,0x79,0x14,0xbf,0x0b,0xad,0x97,0xbf,0x0c,0x8e,0xd3,0xbf,0x5f,0xb7,0x65,0xbf,0xb5,0x0f,0xb7,0xbe,0xae,0xe4,0x2f,0xbf,0xdd,0x66,0x8b,0xbf,0x38,0x12,0xf7,0xbe,0xaf,0x45,0xb2,0xbf,0x8e,0x70,0xb6,0xbe,0x21,0x2b,0xda,0xbf,0x57,0x87,0x22,0xbf,0x8a,0xaa,0x4f,0xbf,0xdb,0x61,0x82,0xbf,0x3d,0x93,0x73,0xbf,0xf2,0xd4,0x4d,0xbf,0xf0,0x00,0x5d,0xbf,0xe9,0xa2,0x82,0xbf,0xf8,0x5a,0x28,0xbf,0x3a,0x63,0xe0,0xbe,0xb6,0xbd,0x66,0xbf,0xcd,0xf9,0x12,0xbf,0x84,0x1f,0x44,0xbf,0x97,0x1c,0xc4,0xbf,0x92,0x62,0x45,0xbf,0xad,0x1a,0x80,0xbf,0x97,0x19,0xf0,0xbd,0x33,0xe0,0x06,0xbf,0xa9,0x01,0x80,0xbf,0x0c,0x8c,0x41,0xbf,0x42,0xba,0x16,0xc0,0xcd,0x45,0x98,0xbf,0x34,0x07,0xbe,0xbf,0x4b,0xde,0x62,0xbf,0x4e,0xac,0xc4,0xbe,0x99,0x8d,0x11,0xbf,0xfc,0xf0,0x8a,0xbf,0x22,0xfc,0x3d,0xbf,0x3b,0x1e,0x8f,0xbf,0x80,0x6e,0x89,0xbf,0x4d,0x78,0x05,0xbf,0x7c,0xe8,0x8b,0xc1,0x5f,0xf1,0x1e,0xbf,0x1c,0xc2,0x1d,0xc0,0xc8,0x1d,0x7c,0xbf,0x32,0x7b,0x04,0xc1,0x8e,0xbf,0x03,0xbf,0xc3,0xf9,0x31,0xbf,0x2f,0x3c,0x31,0xbf,0x8a,0x5e,0x33,0xbf,0x33,0x06,0xc4,0xbe,0x63,0x3f,0x5a,0xbf,0xa2,0xef,0x8d,0xbf,0xaf,0xec,0xcb,0xbc,0x9a,0x49,0xee,0xbf,0x4b,0x82,0xa9,0xbf,0x74,0x1f,0x6b,0xbf,0x4c,0x60,0x3d,0xbf,0x32,0xd1,0xf6,0xbe,0x3d,0xa5,0x69,0xbf,0xf4,0x44,0x22,0xbf,0x7c,0x14,0x18,0xbf,0x68,0x72,0x35,0xbf,0x23,0x9b,0x14,0xbf,0x91,0x0d,0x10,0xbf,0x1f,0xe2,0x02,0xbf,0x97,0x4b,0x80,0xbf,0x3c,0xd8,0x87,0xbf,0xeb,0xba,0xb0,0xbf,0xba,0x28,0xe2,0xbe,0x1b,0x32,0xa4,0xbf,0xf7,0x9c,0xf2,0xbe,0x5c,0x60,0xd5,0xbe,0x5c,0x96,0x47,0xbf,0x90,0xe6,0xf6,0xbe,0x68,0xbf,0x3d,0xbf,0xe0,0x2a,0x80,0xbf,0x16,0x66,0x91,0xbf,0xd9,0xa6,0xbe,0xbf,0xa5,0xd0,0x99,0xbe,0x9d,0x7b,0xa7,0xbf,0x87,0xcf,0xae,0xbe,0x45,0xad,0xf1,0xbf,0x56,0xd9,0x16,0xbf,0x2c,0xcc,0x46,0xbe,0xea,0x2a,0xb9,0xbf,0x2d,0x01,0x2c,0xbe,0x7c,0xab,0x2f,0xbf,0x0e,0x11,0xe1,0xbf,0x65,0x4b,0xa9,0xbf,0xf6,0xaa,0xb4,0xbf,0x98,0x4f,0x4e,0xbf,0x79,0x2f,0x84,0xbf,0xa1,0x2d,0x50,0xbf,0x87,0x4b,0x68,0xbf,0x2f,0x0a,0x14,0xbf,0x4f,0x9b,0x83,0xbf,0xc0,0x64,0x43,0xbf,0x07,0x35,0x2b,0xbf,0x8a,0x8b,0x91,0xbf,0xfb,0x70,0xaf,0xbf,0x84,0xaf,0x46,0xbf,0x4c,0xcc,0xe5,0xbe,0x6d,0x32,0xd3,0xbe,0x1a,0x55,0x3a,0xbf,0xd0,0x6c,0xe5,0xbf,0x2d,0xfe,0xe8,0xbe,0xdd,0x29,0x71,0xbf,0xfb,0x65,0x91,0xbf,0xd4,0x8a,0x91,0xbf,0xdf,0xaf,0x8c,0xbf,0xf1,0x5b,0xd9,0xbe,0xec,0x8e,0x9d,0xbf,0x46,0xa9,0x81,0xbf,0xcf,0xdd,0x2f,0xbf,0x74,0x41,0x09,0xbf,0x64,0x59,0x95,0xc0,0xdf,0xe5,0x70,0xbf,0x38,0xca,0xc6,0xbf,0x5a,0xca,0x0e,0xbf,0x54,0x25,0x34,0xbf,0x52,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x72,0x7f,0xfe,0xff,0x00,0x00,0x00,0x02,0xc4,0x02,0x00,0x00,0x55,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x7c,0x81,0xfe,0xff,0xf0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x59,0x79,0xbb,0x38,0xbb,0x51,0x62,0x38,0x4a,0xfd,0xd0,0x38,0xee,0x3d,0xe6,0x38,0xd2,0x69,0x9f,0x38,0x58,0xc3,0xb2,0x38,0x32,0x12,0xf0,0x38,0xe7,0xed,0x5f,0x38,0xc9,0x35,0xe7,0x38,0xd2,0x76,0xd1,0x38,0xdf,0xbd,0xc2,0x38,0xb5,0xfa,0x84,0x38,0xbe,0x52,0xbb,0x38,0x36,0x2d,0x2e,0x38,0x5f,0xcf,0x6d,0x38,0x04,0x55,0xa9,0x38,0xd6,0xf6,0xe6,0x38,0x74,0x42,0xdf,0x38,0x53,0x84,0xf8,0x38,0xa9,0x80,0xe5,0x38,0x14,0x60,0xf2,0x38,0xa4,0x11,0xf7,0x38,0x6e,0xcd,0xcb,0x38,0x71,0xee,0xc7,0x38,0x06,0x16,0xeb,0x38,0x7c,0xc3,0xf1,0x38,0x58,0x37,0xbc,0x38,0xa1,0xc1,0x76,0x38,0x47,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x46,0x82,0xfe,0xff,0x00,0x00,0x00,0x09,0x90,0x0b,0x00,0x00,0x54,0x00,0x00,0x00,0x34,0x0a,0x00,0x00,0x04,0x00,0x00,0x00,0x52,0xe6,0xff,0xff,0x24,0x08,0x00,0x00,0x1c,0x06,0x00,0x00,0x14,0x04,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x9f,0xb7,0x00,0x3c,0x11,0xfc,0xc0,0x3b,0x25,0xf7,0x4a,0x3c,0x1d,0xfa,0x33,0x3c,0xb3,0x98,0x07,0x3c,0x3b,0x2a,0x86,0x3c,0xff,0x3f,0xfb,0x3b,0x81,0xa6,0x1e,0x3d,0x8a,0x65,0xb0,0x3b,0xdf,0x38,0xe2,0x3b,0xbe,0xd3,0x3c,0x3c,0xa6,0xc7,0xdf,0x3b,0x83,0x52,0xe4,0x3b,0x5c,0x4a,0x20,0x3c,0x90,0xd3,0x0f,0x3c,0x98,0xbe,0xe7,0x3b,0x80,0xfd,0xa3,0x3b,0x9e,0x9c,0x1c,0x3c,0x4a,0x71,0xf3,0x3b,0x9d,0x14,0x48,0x3c,0xd0,0x61,0x0b,0x3c,0xb6,0xba,0x35,0x3c,0xf6,0x3e,0x4e,0x3c,0xef,0xbb,0x20,0x3b,0x28,0x39,0xe1,0x3b,0xd3,0xf3,0x1d,0x3c,0xad,0x30,0xe1,0x3b,0x30,0xd3,0x2a,0x3c,0x10,0x6b,0x00,0x3c,0xfb,0x4f,0xa0,0x3b,0x45,0xcf,0x0c,0x3c,0x36,0x6a,0xb7,0x3b,0x9f,0x7f,0xb5,0x3b,0x72,0x64,0xd6,0x3b,0xd6,0x9d,0x3d,0x3b,0xa8,0xb1,0xf9,0x3b,0x66,0xbc,0x9a,0x3c,0x1f,0xc2,0x1c,0x3c,0x16,0xe7,0x74,0x3c,0xae,0x37,0x33,0x3c,0x2f,0x60,0xf2,0x3b,0xe1,0x3e,0x6b,0x3c,0xfd,0xba,0x00,0x3c,0x82,0xa2,0x09,0x3c,0x9c,0x30,0xef,0x3b,0xc5,0x1f,0xb1,0x3e,0x87,0x28,0xe6,0x3b,0x2d,0x70,0x02,0x3c,0x51,0xa7,0x15,0x3c,0xf0,0x02,0x0f,0x3c,0xa0,0x13,0xe8,0x3b,0xd3,0x2c,0xf9,0x3b,0x9a,0xc5,0x97,0x3b,0x52,0xb1,0xeb,0x3b,0xb2,0x42,0xf4,0x3b,0xc2,0xca,0x26,0x3c,0x2b,0xe7,0x14,0x3c,0xa4,0xdf,0x80,0x3c,0xf6,0x64,0x0d,0x3c,0x1e,0xfe,0xab,0x3b,0xe2,0x20,0xb6,0x3b,0xed,0x11,0x3e,0x3c,0x1b,0x1d,0xd9,0x3b,0xee,0x08,0xbf,0x3b,0x35,0x3e,0x9e,0x3b,0x9b,0x6b,0x4d,0x3c,0xe4,0xda,0xa7,0x3b,0xb9,0x07,0xd2,0x3b,0x99,0x23,0x46,0x3c,0x8d,0x78,0x9b,0x3b,0x00,0xcd,0xf5,0x3b,0x85,0x7f,0x15,0x3c,0xc6,0x9d,0xca,0x3b,0xe0,0xb2,0xe5,0x3b,0x45,0x44,0xd4,0x3b,0x82,0x8d,0x42,0x3c,0x76,0x5f,0x8a,0x3b,0x75,0x31,0x20,0x3c,0xf5,0xa5,0xe8,0x3b,0x39,0x2d,0xed,0x3b,0xca,0x67,0x5e,0x3c,0xe0,0x6b,0x15,0x3c,0xf3,0xb3,0xa4,0x3b,0xf1,0xd8,0x84,0x3b,0x57,0xa3,0xda,0x3b,0x82,0x1e,0xc1,0x3b,0xc2,0x36,0xff,0x3b,0xee,0x96,0x75,0x3b,0x3e,0xcd,0xd2,0x3b,0x3b,0xfe,0xf0,0x3b,0x45,0x59,0xda,0x3b,0xf1,0x9d,0x41,0x3c,0x93,0x28,0x26,0x3c,0xa3,0x9f,0x51,0x3c,0xb9,0x44,0x07,0x3c,0xa4,0x96,0xb0,0x3b,0x7a,0x93,0x02,0x3c,0x29,0x7c,0x00,0x3c,0x7b,0x0b,0xad,0x3b,0xf6,0x70,0xc5,0x3b,0xd5,0x9d,0xe8,0x3b,0x87,0x68,0xcb,0x3b,0x2b,0x6b,0x53,0x3b,0xf7,0x69,0xbb,0x3b,0x37,0xf7,0xb6,0x3b,0x3b,0x42,0x14,0x3c,0x90,0x8c,0xc9,0x3b,0xe9,0x2f,0x62,0x3c,0xa3,0xea,0xff,0x3b,0x21,0xee,0x07,0x3c,0xcd,0x0c,0x5e,0x3c,0xd6,0x00,0x0f,0x3c,0xd2,0x40,0xe3,0x3b,0x0f,0x47,0xc4,0x3b,0x26,0xc4,0x16,0x3c,0x71,0xf1,0xad,0x3b,0xd6,0xec,0x1d,0x3c,0x16,0x6c,0xd9,0x3b,0x4c,0x54,0x6c,0x3b,0x49,0x09,0xdd,0x3b,0xad,0x49,0x48,0x3c,0x7d,0x30,0x05,0x3c,0xe5,0xd0,0x11,0x3c,0xa4,0x14,0xbc,0x3b,0x5c,0x7a,0x61,0x3c,0x26,0x6b,0x26,0x3c,0x63,0x5f,0xa8,0x3b,0x7e,0xc7,0x01,0x3c,0x80,0x00,0x00,0x00,0x60,0x6c,0x7f,0x3f,0xf0,0x8d,0x21,0x3f,0x37,0x61,0xc9,0x3f,0x29,0x92,0xb2,0x3f,0xcc,0x61,0xa2,0xbd,0xb0,0x2d,0x56,0xbe,0x7f,0x49,0x79,0x3f,0x2c,0xfc,0x80,0x40,0xbf,0x04,0x2f,0x3f,0x6d,0x74,0x60,0x3f,0x17,0x5a,0xbb,0x3f,0xe5,0x35,0x5a,0x3f,0xde,0x89,0x62,0x3f,0xc7,0x09,0x9f,0x3f,0xad,0x07,0x83,0xbe,0x1b,0xef,0x65,0x3f,0x85,0xb5,0x22,0x3f,0xc5,0x5d,0x2b,0xbe,0x67,0x8a,0x71,0x3f,0x0b,0x0a,0xdc,0x3d,0x0c,0x4b,0x8a,0x3f,0x81,0xdb,0xa3,0x3f,0x78,0xa2,0xcc,0x3f,0x85,0x5b,0x97,0xbd,0xb6,0x76,0x5f,0x3f,0xeb,0xb7,0x9c,0x3f,0x4c,0x6e,0x5f,0x3f,0x2f,0x3f,0xb9,0xbe,0x73,0xd4,0x7e,0x3f,0xe4,0x9f,0x32,0xbe,0xa6,0xb5,0x8b,0x3f,0xec,0xed,0x92,0x3d,0xa0,0x14,0x34,0x3f,0x54,0x5c,0x2a,0x3f,0x93,0x22,0x84,0xbd,0x19,0x26,0xab,0x3e,0x80,0x40,0xba,0x3f,0x52,0x19,0x64,0x3f,0x15,0x1f,0x42,0xbd,0x3f,0xd1,0xb1,0x3f,0x15,0x63,0x7f,0xbe,0x63,0x68,0xe9,0x3f,0xb0,0x22,0x8d,0xbe,0xfb,0x18,0x88,0xbe,0xce,0x79,0x50,0x3f,0x85,0xbd,0x2f,0x42,0xeb,0x5d,0x53,0x3f,0x0e,0xa5,0x25,0xbe,0x2f,0x74,0xf8,0xbe,0x03,0x5e,0x4b,0x3f,0x79,0x43,0x66,0x3f,0x11,0xa4,0x3c,0x3f,0x0f,0x96,0x16,0x3f,0xef,0xd9,0x69,0x3f,0x2d,0x5a,0x72,0x3f,0x4a,0xa6,0xaa,0xbe,0x5d,0xbd,0x93,0x3f,0xca,0xbb,0xff,0x3f,0x56,0x20,0x8a,0xbd,0x22,0xa6,0x2a,0x3f,0xa0,0xb4,0x34,0x3f,0xc9,0x95,0xbc,0x3f,0x13,0x02,0x0d,0xbe,0xdc,0x8a,0x3d,0x3f,0x9c,0xe5,0x46,0xbe,0x43,0x78,0x8a,0x3f,0x2e,0x8b,0x26,0x3f,0xaa,0x63,0x50,0x3f,0x52,0x97,0xc4,0x3f,0x9c,0x41,0x1a,0x3f,0xfe,0x8e,0x51,0x3f,0xe4,0x70,0x1c,0x3f,0x8a,0x08,0x49,0x3f,0x24,0xd8,0x35,0xbe,0xbc,0x9b,0x52,0x3f,0x67,0x08,0xc1,0x3f,0x2d,0x05,0xba,0xbd,0xc4,0xd0,0xf8,0x3e,0xa9,0xd4,0x66,0x3f,0xb2,0x61,0x47,0x3f,0xfa,0xaa,0xdc,0x3f,0xc4,0xe5,0xf5,0x3d,0x8b,0x6a,0x23,0x3f,0x3f,0xcf,0x03,0x3f,0x10,0xee,0x58,0x3f,0x45,0x9c,0x3f,0x3f,0x54,0x38,0x7d,0x3f,0xc0,0xab,0xf3,0x3e,0xa6,0xb4,0x24,0x3f,0x3f,0x1c,0x6f,0x3f,0x92,0xa4,0x58,0x3f,0xca,0xe8,0x62,0x3e,0x42,0xdc,0xa4,0x3f,0x8b,0x3f,0x85,0x3e,0x30,0x36,0x86,0x3f,0xa8,0x57,0xf1,0xbd,0x53,0x8e,0x81,0x3f,0x61,0xf6,0x7e,0x3f,0x64,0xb1,0x2b,0x3f,0x14,0xe6,0x43,0x3f,0x99,0xcc,0x66,0x3f,0xb6,0xd1,0x49,0x3f,0xdb,0x7a,0x10,0xbe,0x23,0xf3,0x39,0x3f,0x0a,0x02,0xd9,0xbc,0xb7,0x19,0x93,0x3f,0x75,0x46,0x67,0xbe,0x89,0x6b,0xe0,0x3f,0xe0,0x9c,0x2d,0xbe,0x37,0x91,0x86,0x3f,0xb3,0x50,0xdc,0x3f,0x43,0x78,0x89,0x3f,0x50,0x7a,0x61,0x3f,0xbf,0x7e,0x2b,0x3f,0x9e,0x96,0x95,0x3f,0xa7,0xe7,0x6a,0xbe,0xdf,0x80,0xa9,0xbe,0x94,0x96,0x20,0xbe,0xa3,0x7b,0xea,0x3e,0x14,0x92,0x54,0x3f,0xef,0x52,0x6b,0xbe,0x1c,0x26,0x84,0x3f,0x90,0x09,0x34,0x3f,0x7b,0x9c,0x3a,0x3f,0x67,0xb7,0xdf,0x3f,0x50,0x1e,0xa5,0x3f,0xa4,0x0e,0x27,0x3f,0xef,0xc3,0x80,0x3f,0x80,0x00,0x00,0x00,0x1f,0x38,0x33,0x3e,0x19,0x7a,0x3f,0xbf,0x26,0x18,0xcb,0x3e,0x6f,0x24,0x51,0xbf,0x82,0x89,0x86,0xbf,0xe7,0x1d,0x05,0xc0,0x4b,0x00,0x69,0x3e,0x34,0x69,0x9d,0xc0,0xb2,0xae,0x25,0xbf,0x8f,0x2a,0x5e,0x3c,0x67,0x06,0xfb,0x3e,0x17,0x08,0x5e,0xbf,0x90,0x0a,0x39,0xbf,0x3f,0xc3,0x49,0xbf,0xe9,0xb3,0x8e,0xbf,0xbd,0xa2,0x53,0xbf,0x3f,0xee,0x1a,0x3e,0x65,0x63,0x9b,0xbf,0xb4,0xa3,0x44,0xbe,0x74,0x84,0xc6,0xbf,0x13,0x37,0x11,0xbf,0x41,0x4f,0xb4,0xbf,0xd8,0xce,0x0d,0x3e,0x77,0x7a,0x9f,0xbe,0x88,0xb7,0x1f,0xbf,0x43,0x81,0x82,0xbf,0xa9,0x09,0x4c,0xbf,0x8a,0x7d,0xa9,0xbf,0xb7,0x2b,0x48,0xbf,0x5b,0x0f,0x1f,0xbf,0x1a,0xa5,0x91,0xbe,0x62,0xfb,0x35,0xbf,0x95,0x30,0x7c,0x3e,0xa9,0xb7,0x54,0xbf,0x9a,0x22,0xbc,0xbe,0x45,0xbe,0x77,0xbf,0xed,0x86,0x19,0xc0,0x9b,0x88,0x9b,0xbf,0x48,0xfd,0xf2,0xbf,0x70,0xea,0x8e,0xbf,0x6f,0x7b,0x70,0xbf,0x2e,0x63,0xa1,0x3e,0x0f,0x73,0x7f,0xbf,0x3d,0x8f,0x88,0xbf,0x3b,0x52,0x6d,0xbf,0x5f,0xc1,0x08,0xc2,0x36,0x5c,0x64,0xbf,0x4d,0x6b,0x81,0xbf,0x02,0x7c,0x94,0xbf,0xea,0xe4,0x8d,0xbf,0xd3,0xe4,0x43,0x3e,0x79,0x3a,0x77,0xbf,0xc6,0x33,0xa3,0x3d,0xec,0xce,0x3b,0x3c,0xa0,0x5e,0x4c,0xbf,0x2c,0x7d,0xa5,0xbf,0x5c,0xc8,0xe1,0xbe,0x69,0x02,0x34,0x3f,0x2c,0x4a,0x8c,0xbf,0x72,0x73,0x1a,0xbf,0x9a,0x41,0x00,0x3e,0xaa,0xa1,0x88,0x3d,0xe1,0x6a,0x57,0xbf,0xf8,0xec,0x46,0xbe,0xb9,0x01,0x1d,0xbf,0xc4,0xd0,0xcb,0xbf,0x18,0x64,0x77,0x3e,0xd9,0x85,0x80,0xbc,0x4e,0x8e,0x03,0x3f,0x21,0xb1,0x4c,0x3d,0x66,0xe1,0x73,0xbf,0x86,0x54,0x94,0xbf,0x38,0xdb,0x25,0xbf,0x7a,0xe7,0x63,0xbf,0xdd,0x75,0x37,0x3e,0xf1,0x20,0x50,0xbf,0xb7,0x4a,0x09,0xbf,0x12,0xf1,0x9e,0xbf,0x6d,0x0f,0xe8,0x3c,0xdf,0x52,0x6b,0xbf,0x32,0xb2,0xad,0xbf,0x08,0x41,0x94,0xbf,0xea,0xa6,0x87,0x3b,0x0c,0xf4,0xe3,0xbd,0xe2,0x10,0x73,0x3e,0x81,0x70,0xec,0x3d,0x7d,0x00,0x96,0x3d,0x65,0xb6,0x0d,0x3e,0xa4,0x27,0x51,0xbf,0x78,0x1a,0x43,0xbf,0xf5,0x17,0x1e,0xbf,0xb5,0x1a,0xc0,0xbf,0x02,0xc8,0x7d,0x3e,0x64,0xfc,0xcf,0xbf,0x28,0x73,0xbb,0xbd,0x77,0x35,0x2f,0xbf,0xe0,0x73,0x6c,0x3e,0xe5,0xc5,0x39,0xbf,0xeb,0xe7,0xf8,0xbe,0x1d,0x8f,0x04,0x3e,0x54,0xa1,0x2b,0xbf,0xea,0x48,0x45,0xbf,0x55,0xc4,0xd1,0xbe,0x84,0xae,0xa4,0x3d,0x49,0x89,0x35,0xbf,0x54,0x6d,0x83,0xbf,0x77,0xf9,0x47,0xbf,0x58,0x2c,0x2c,0x3e,0xce,0xea,0x7d,0xbf,0x45,0xde,0x86,0xbf,0xa3,0xc8,0x37,0xbf,0xd4,0xe2,0x8d,0xbf,0x66,0xc5,0x26,0x3e,0x81,0xbe,0x42,0xbf,0x03,0xf6,0xbc,0xbd,0x8e,0x95,0x2c,0xbf,0xfc,0xb0,0x9c,0xbf,0x3e,0xb9,0x57,0xbf,0xe8,0xc0,0x39,0x3d,0x36,0x4f,0x5b,0xbf,0x1a,0xb9,0xc6,0xbf,0x54,0xdd,0xee,0xbe,0x43,0xad,0x90,0xbf,0xb9,0x71,0x0c,0xbf,0x3d,0xef,0xaa,0x3e,0xcc,0x2c,0x85,0xbf,0xa9,0x0f,0xa4,0x3d,0x39,0xd6,0x79,0xbe,0x4d,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xf2,0x8d,0xfe,0xff,0x00,0x00,0x00,0x02,0x04,0x02,0x00,0x00,0x53,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xfc,0x8f,0xfe,0xff,0xb0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x4a,0xe1,0x07,0x39,0x71,0xcc,0xbe,0x37,0x7d,0xc1,0xe3,0x38,0x54,0x08,0x16,0x39,0x98,0xf5,0x99,0x38,0xaa,0x12,0x1d,0x39,0xad,0x16,0xf8,0x38,0xa9,0x00,0xf1,0x38,0x12,0xec,0xa0,0x38,0x82,0xe5,0x92,0x38,0xea,0x5a,0x72,0x39,0xf1,0xac,0x32,0x39,0x8a,0x4f,0x15,0x39,0x2f,0xb6,0x43,0x39,0xbe,0xe3,0x3c,0x39,0xdd,0x4f,0x84,0x38,0x9f,0x0f,0x2c,0x39,0xab,0x6e,0x9c,0x38,0xdb,0x48,0x29,0x39,0x71,0x76,0x23,0x39,0xe5,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x06,0x90,0xfe,0xff,0x00,0x00,0x00,0x09,0xc0,0x03,0x00,0x00,0x52,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x12,0xf4,0xff,0xff,0xe4,0x01,0x00,0x00,0x6c,0x01,0x00,0x00,0xf4,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x96,0x30,0x04,0x3c,0xce,0xde,0x11,0x3c,0x68,0xfa,0x14,0x3c,0xa4,0xca,0x53,0x3c,0xe3,0x55,0x8b,0x3c,0xf8,0x2e,0xe8,0x3c,0x05,0xf8,0x2d,0x3c,0x98,0x5b,0x2e,0x3c,0x23,0x76,0x1d,0x3c,0xa0,0x04,0x01,0x3c,0xe0,0xb8,0x88,0x3c,0xfe,0xe6,0xd5,0x3b,0xfa,0x70,0xb8,0x3b,0xf5,0x63,0x86,0x3c,0xf0,0xd0,0x6e,0x3b,0x13,0xd1,0x6e,0x3c,0x58,0x34,0x07,0x3c,0x59,0x0a,0xce,0x3b,0x13,0x3b,0x31,0x3c,0x8b,0x81,0xdf,0x3b,0x7f,0x4c,0x85,0x3c,0x33,0x5d,0x33,0x3c,0x82,0xd4,0x46,0x3c,0x59,0xb2,0x28,0x3c,0x4e,0xef,0x24,0x3c,0x8b,0x86,0x53,0x3c,0x27,0x93,0xec,0x3c,0x3b,0xa0,0x55,0x3c,0x1c,0x00,0x00,0x00,0x35,0x28,0x83,0x3f,0x9a,0xb5,0x69,0x3f,0x73,0xd0,0x93,0x3f,0x0f,0x23,0xd2,0x3f,0x37,0x3f,0x0a,0x40,0x9a,0x5e,0x66,0x40,0x15,0x9c,0xac,0x3f,0x03,0xe1,0x37,0x3f,0x96,0xcf,0x9d,0x3e,0x7d,0x62,0x5d,0x3f,0x6e,0xa7,0x07,0x40,0x99,0x65,0xe4,0x3e,0x18,0x00,0x37,0x3f,0x2d,0x57,0x05,0x40,0x4e,0xf3,0xec,0x3e,0x71,0xf3,0xec,0x3f,0xef,0x25,0x86,0x3f,0x83,0x22,0xd7,0x3e,0xb2,0x26,0x9c,0x3f,0x92,0xed,0xa6,0x3e,0xe0,0x2c,0xab,0x3f,0x79,0xf6,0xb1,0x3f,0xd9,0x46,0xc5,0x3f,0xf4,0x60,0xa7,0x3f,0x6f,0xa5,0xa3,0x3f,0x7e,0xdf,0xd1,0x3f,0x90,0x31,0xb2,0x3f,0xfb,0xf4,0xd3,0x3f,0x1c,0x00,0x00,0x00,0x36,0x22,0x39,0xbf,0x10,0xbb,0x90,0xbf,0x07,0xc2,0x63,0xbf,0x55,0x91,0x20,0xbf,0x12,0x8a,0x5c,0xbf,0xf8,0x14,0x04,0xc0,0xc4,0x6a,0x90,0xbe,0xe1,0xfe,0xac,0xbf,0x37,0x3b,0x9c,0xbf,0x97,0x02,0x80,0xbf,0x55,0xd6,0xcb,0xbf,0x30,0x3b,0x54,0xbf,0x21,0x2e,0xa3,0xbe,0x3c,0xa1,0x8c,0xbf,0x10,0xbc,0x67,0xbe,0x4e,0x7a,0x25,0xbf,0x12,0xa4,0xed,0xbd,0x44,0x6e,0x4c,0xbf,0x9d,0xd8,0xaf,0xbf,0x88,0xc2,0x5d,0xbf,0xe6,0x41,0x04,0xc0,0xbd,0xcb,0x4b,0xbf,0x3c,0xc7,0x17,0xbf,0xad,0x8c,0x87,0xbf,0x0a,0x73,0x84,0xbf,0xa8,0x3c,0x1c,0xbf,0x01,0xba,0x6a,0xc0,0xcc,0x63,0x70,0xbf,0x4d,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x35,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xe2,0x93,0xfe,0xff,0x00,0x00,0x00,0x02,0x94,0x02,0x00,0x00,0x51,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0x95,0xfe,0xff,0xd0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x9b,0x24,0x3e,0x39,0x41,0x26,0x42,0x39,0x95,0x23,0x43,0x39,0xfd,0xfc,0x50,0x39,0x53,0xe0,0x7d,0x39,0x8e,0xbb,0x15,0x39,0x37,0x21,0x2a,0x39,0x40,0x18,0x6a,0x39,0x2c,0xea,0x86,0x39,0x1d,0x02,0x7f,0x39,0x21,0xe0,0xde,0x38,0x85,0xb3,0x94,0x39,0x77,0x0a,0xca,0x38,0x43,0x38,0xc2,0x38,0x7c,0xbd,0x99,0x39,0xb0,0x32,0x97,0x39,0x1d,0x44,0x43,0x39,0x25,0xac,0xb5,0x39,0x8f,0x80,0x2c,0x38,0x79,0x3e,0x5d,0x39,0x5a,0xb2,0x31,0x39,0x0c,0xbe,0x51,0x39,0x4c,0x16,0x73,0x39,0x5b,0xff,0x75,0x39,0x46,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x86,0x96,0xfe,0xff,0x00,0x00,0x00,0x09,0xc0,0x03,0x00,0x00,0x50,0x00,0x00,0x00,0x64,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x92,0xfa,0xff,0xff,0xe4,0x01,0x00,0x00,0x6c,0x01,0x00,0x00,0xf4,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xb9,0x41,0xa8,0x3c,0xdc,0xaa,0xe3,0x3b,0x21,0xc1,0x85,0x3c,0x6d,0x70,0x0a,0x3d,0x7b,0x9b,0x30,0x3c,0x4e,0x99,0x86,0x3c,0x85,0x78,0xc5,0x3b,0x03,0x4b,0x9b,0x3b,0x0a,0xb7,0x3c,0x3c,0xb8,0x1e,0xde,0x3b,0x3a,0x06,0xe4,0x3a,0x50,0x84,0xa2,0x3c,0xae,0xdc,0x26,0x3c,0x3f,0x18,0x65,0x3b,0xe5,0x08,0x3e,0x3c,0xe1,0xf9,0x2f,0x3b,0x13,0x13,0xae,0x3c,0x93,0x65,0x03,0x3b,0x17,0x1c,0x7d,0x3c,0x30,0xc5,0xcd,0x3c,0x76,0x20,0xe1,0x3b,0xa5,0x5e,0x3b,0x3c,0x1b,0x77,0xd5,0x3b,0xe2,0xb2,0x4b,0x3c,0xef,0xd8,0x85,0x3b,0xea,0x6e,0xfb,0x3b,0x31,0xfa,0x94,0x3c,0x83,0xf8,0xf3,0x3c,0x1c,0x00,0x00,0x00,0x36,0xf1,0x26,0x40,0x7d,0xfa,0x21,0x3f,0x9f,0xb5,0x04,0x40,0x8c,0x5b,0x89,0x40,0x44,0x3a,0xaf,0x3f,0x1b,0x8c,0x05,0x40,0xc9,0x0e,0x1a,0x3e,0x6d,0x14,0x1a,0x3f,0x9c,0x3d,0xbb,0x3f,0x7b,0x62,0x5c,0x3f,0x2e,0x3e,0x62,0x3e,0x47,0x3f,0x21,0x40,0xf5,0x8e,0xa5,0x3f,0x2f,0x32,0x6e,0x3e,0xd3,0x8c,0xbc,0x3f,0xc0,0xf5,0x44,0x3e,0xa6,0x13,0x2b,0x40,0x8f,0x93,0x54,0x3e,0x62,0xd6,0x3e,0x3f,0x2d,0x69,0x0e,0x40,0x35,0x5e,0x5f,0x3f,0xa5,0xb6,0x84,0x3f,0xf4,0xf4,0x25,0x3f,0xa1,0xac,0xa4,0x3f,0x3d,0xcd,0x04,0x3f,0x0c,0x78,0x79,0x3f,0xb1,0x76,0xc2,0x3f,0x80,0x2a,0x49,0x40,0x1c,0x00,0x00,0x00,0xb1,0x23,0x1f,0xc0,0x86,0xe3,0x61,0xbf,0xb0,0xe7,0x99,0xbf,0x82,0xa9,0x16,0xc0,0x0f,0xf4,0x46,0xbf,0xda,0x18,0x9d,0xbf,0x94,0xed,0x43,0xbf,0x76,0x6d,0x17,0xbf,0x4d,0x89,0x40,0xbf,0xaf,0x60,0x25,0xbf,0x8a,0x42,0x8b,0xbd,0xbc,0x10,0xe7,0xbf,0xfd,0xb9,0x03,0xbf,0x0f,0x4e,0xe3,0xbe,0x49,0x6a,0x9f,0xbf,0xed,0x99,0xae,0xbe,0xed,0xb6,0x2c,0xc0,0xc8,0x5e,0x82,0xbe,0xdf,0x21,0xfb,0xbf,0xa6,0x29,0x4c,0xc0,0x9e,0xf1,0x29,0xbf,0xe8,0xe7,0xb9,0xbf,0x2d,0xcc,0x53,0xbf,0x7c,0x1b,0xca,0xbf,0x97,0xda,0x6c,0xbc,0xb1,0x6d,0xbb,0xbc,0x3d,0xd0,0x13,0xc0,0x92,0x10,0x72,0xc0,0x4d,0x01,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x62,0x9a,0xfe,0xff,0x00,0x00,0x00,0x02,0x70,0x01,0x00,0x00,0x4f,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0x9c,0xfe,0xff,0x4c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x54,0xf4,0xfe,0x39,0x91,0xa5,0x57,0x38,0x9a,0x2f,0x1c,0x3a,0xa5,0xc3,0x74,0x3a,0x0b,0x17,0x19,0x3a,0x4d,0x03,0x88,0x3a,0x51,0x2b,0xb9,0x39,0xfe,0x71,0x7d,0x39,0xe4,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x1a,0x00,0x08,0x00,0x07,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x8c,0x01,0x00,0x00,0x4e,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x18,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x12,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6b,0xad,0xb9,0x3a,0x06,0xd5,0xbe,0x3b,0xe2,0x71,0x21,0x3a,0xe7,0x9b,0x76,0x38,0x04,0x00,0x00,0x00,0x26,0x81,0x00,0x3e,0x1b,0xea,0x92,0x3e,0xfe,0x2e,0xa0,0x3d,0xaf,0xae,0xf4,0x3b,0x04,0x00,0x00,0x00,0x10,0x3a,0x38,0xbe,0x5c,0x57,0x3d,0xbf,0x17,0x88,0x15,0xba,0xe2,0x76,0x1f,0xbb,0xe9,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x64,0x65,0x70,0x74,0x68,0x77,0x69,0x73,0x65,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9a,0x9d,0xfe,0xff,0x00,0x00,0x00,0x09,0xc4,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0x9d,0xfe,0xff,0x3c,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xb1,0x78,0x7e,0x3a,0x5f,0x2c,0xec,0x37,0x02,0x00,0x00,0x00,0xc0,0x7b,0xfc,0x3d,0x05,0x24,0x0f,0x3b,0x02,0x00,0x00,0x00,0xa8,0x6b,0xb6,0xbd,0x06,0x54,0x6a,0xbb,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x7a,0x9e,0xfe,0xff,0x00,0x00,0x00,0x09,0x9c,0x0a,0x00,0x00,0x4c,0x00,0x00,0x00,0x2c,0x0a,0x00,0x00,0x04,0x00,0x00,0x00,0x6c,0x9e,0xfe,0xff,0x1c,0x08,0x00,0x00,0x14,0x06,0x00,0x00,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x5c,0x58,0x8a,0x3a,0x91,0xdc,0x31,0x3a,0x1f,0x7c,0x17,0x3a,0x1a,0xed,0x3c,0x3a,0xca,0xae,0x3d,0x3a,0xdc,0xf7,0x4e,0x3a,0x3d,0x8a,0x24,0x3a,0x03,0x7f,0x6f,0x3a,0xc7,0x67,0x2b,0x3a,0x77,0x12,0x45,0x3a,0x4e,0x43,0x6c,0x3a,0xb8,0xe5,0x63,0x3a,0x02,0x0d,0x44,0x3b,0x01,0xf4,0x76,0x3a,0x98,0xe0,0x55,0x3a,0x01,0x46,0xe1,0x3a,0xc3,0xe4,0x47,0x3a,0xf8,0xb7,0x35,0x3a,0x9b,0x38,0x5a,0x3a,0x62,0x0b,0x2e,0x3a,0xb1,0x74,0x2f,0x3a,0xaf,0xfa,0x24,0x3a,0xda,0x7f,0x87,0x3a,0x18,0xad,0x29,0x3a,0xc1,0xba,0xd2,0x3a,0x57,0x32,0x49,0x3a,0xe1,0xa2,0x47,0x3a,0x07,0xb7,0x81,0x3a,0x1a,0xc3,0x30,0x3a,0xf3,0x7a,0x92,0x3a,0xf2,0x0d,0x6d,0x3a,0x6a,0x6f,0x53,0x3a,0x43,0x94,0x44,0x3a,0xa6,0xb5,0x2d,0x3b,0x4a,0x8b,0x4c,0x3a,0x94,0x41,0x6e,0x3a,0x73,0x3e,0x7e,0x3a,0xcb,0x86,0x1c,0x3a,0x04,0x04,0x55,0x3a,0x38,0xf8,0x20,0x3a,0x9a,0x4c,0x80,0x3a,0xf1,0x94,0x22,0x3a,0x66,0xc1,0x57,0x3a,0x0e,0x98,0x38,0x3a,0x46,0xd8,0x89,0x3a,0xf3,0x5d,0x5c,0x3a,0x22,0x31,0x3d,0x3a,0xd3,0x8e,0x23,0x3a,0x74,0x48,0x7d,0x3a,0x8c,0x25,0x7a,0x3a,0xd1,0x4b,0x4b,0x3a,0x22,0x33,0x40,0x3a,0xb9,0xa3,0x60,0x3a,0x9c,0x84,0x46,0x3a,0x77,0x75,0x61,0x3a,0x4e,0xf9,0x4c,0x3a,0xb9,0xc1,0x09,0x3b,0x47,0xb8,0x87,0x3a,0x59,0x19,0x1f,0x3a,0x1f,0x8e,0x30,0x3a,0xa2,0x45,0x20,0x3a,0xf5,0x3f,0x2a,0x3a,0xb7,0x41,0x81,0x3a,0x82,0x54,0x5b,0x3a,0xc1,0xd9,0x2b,0x3a,0x2a,0xd6,0x5e,0x3a,0x9d,0x01,0x87,0x3a,0xb3,0x5f,0x34,0x3a,0x2c,0x11,0x45,0x3a,0x12,0x09,0x5c,0x3a,0x91,0x4c,0x39,0x3a,0xba,0x30,0x2f,0x3a,0x37,0x6b,0x66,0x3a,0x0c,0x68,0x31,0x3a,0xa4,0x65,0x7e,0x3a,0xc1,0xa1,0x24,0x3a,0x65,0xce,0x2a,0x3a,0x61,0x9d,0x7f,0x3a,0xe7,0x6a,0x60,0x3a,0x3a,0x7b,0x4c,0x3a,0x07,0x34,0x75,0x3a,0x4d,0x5f,0x03,0x3b,0x0b,0x99,0x2c,0x3a,0x8e,0x00,0x2a,0x3a,0xb5,0x00,0x75,0x3a,0xdf,0x81,0x72,0x3a,0xcc,0x1d,0x69,0x3a,0xbf,0x54,0x4c,0x3a,0x79,0x21,0x4a,0x3a,0x5d,0x49,0x94,0x3a,0x42,0xb5,0x1f,0x3a,0x87,0xa5,0x72,0x3a,0x3d,0x2c,0x77,0x3a,0x4a,0xb8,0x25,0x3a,0x55,0x6b,0x24,0x3a,0xe4,0x36,0x07,0x3b,0xe5,0x6c,0x2d,0x3a,0x5f,0x6e,0x27,0x3a,0x43,0x7d,0x84,0x3a,0x4a,0x13,0x1b,0x3a,0xdb,0x94,0x84,0x3a,0x89,0x42,0x57,0x3a,0x87,0x14,0x33,0x3a,0x49,0xc2,0x3b,0x3a,0x49,0xdc,0x86,0x3a,0x22,0xe8,0x34,0x3a,0xd3,0xf2,0x5a,0x3a,0xce,0x17,0x2b,0x3a,0x79,0x50,0x2e,0x3a,0xe3,0x20,0x8b,0x3a,0x32,0x54,0x2b,0x3a,0xde,0x7d,0x05,0x3a,0x23,0x42,0x81,0x3a,0x12,0xc0,0x28,0x3a,0x70,0x57,0x70,0x3a,0x67,0x49,0x3d,0x3a,0x18,0x69,0x77,0x3a,0x4d,0x9e,0x65,0x3a,0x96,0x5d,0x60,0x3a,0x42,0x9d,0x3a,0x3a,0xe8,0x2b,0x79,0x3a,0xa5,0xcc,0x13,0x3b,0x55,0x6e,0x1a,0x3a,0xcb,0xd6,0x2e,0x3a,0xf0,0xf3,0x1e,0x3a,0x62,0x62,0x18,0x3a,0xf4,0xff,0x17,0x3b,0xec,0x2f,0x26,0x3a,0x80,0x00,0x00,0x00,0xe3,0x1b,0xca,0x3d,0x60,0x0c,0x9b,0x3d,0x27,0x4d,0x96,0x3d,0x40,0x73,0xbb,0x3d,0x6c,0x33,0xbc,0x3d,0xb9,0x8e,0x98,0x3d,0x6e,0xe9,0x8c,0x3d,0xf2,0x70,0xc1,0x3d,0xf7,0x10,0xaa,0x3d,0x52,0x88,0xc3,0x3d,0x28,0x9c,0xe7,0x3d,0xb8,0x03,0xc1,0x3d,0xe8,0x84,0xc2,0x3e,0x19,0x06,0xf5,0x3d,0xd7,0x34,0xd4,0x3d,0xe9,0xc9,0xb6,0x3d,0x29,0x61,0xa1,0x3d,0x88,0x4c,0xb4,0x3d,0x2a,0x84,0xd8,0x3d,0x5f,0x43,0x8b,0x3d,0xbb,0xef,0xaa,0x3d,0xac,0x4a,0x87,0x3d,0xda,0x70,0x06,0x3e,0xbe,0x59,0xa8,0x3d,0xdd,0xc1,0x3d,0x3e,0xf2,0x9f,0xc7,0x3d,0x9b,0x13,0xc6,0x3d,0x85,0xa2,0xc4,0x3d,0x94,0x61,0xaf,0x3d,0xfd,0x55,0x11,0x3e,0xd6,0x33,0xeb,0x3d,0x8b,0xc8,0xd1,0x3d,0x66,0x68,0xa4,0x3d,0x3b,0x5a,0xac,0x3e,0x33,0xf2,0xca,0x3d,0x8b,0xa6,0xd4,0x3d,0xf6,0x41,0xfc,0x3d,0xbd,0x4d,0x9b,0x3d,0xfc,0x59,0xd3,0x3d,0x48,0xb6,0x9f,0x3d,0x01,0x98,0xfe,0x3d,0x27,0xd6,0xa0,0x3d,0x4e,0x3d,0xc5,0x3d,0xde,0x26,0xb7,0x3d,0xda,0x7a,0xbf,0x3d,0x42,0xdf,0xc1,0x3d,0xc0,0xb6,0xbb,0x3d,0xb7,0xfd,0x95,0x3d,0xe3,0x4d,0xfb,0x3d,0xb7,0x1e,0xc0,0x3d,0x6e,0xca,0xb8,0x3d,0xbc,0xb2,0xbe,0x3d,0x9a,0xc4,0xc7,0x3d,0xf9,0x35,0xa5,0x3d,0x71,0xcd,0xb9,0x3d,0x0e,0x29,0x85,0x3d,0xd6,0xa0,0x87,0x3e,0xd6,0xa8,0x06,0x3e,0x48,0xce,0x90,0x3d,0x03,0x2d,0xaf,0x3d,0x17,0x05,0x9f,0x3d,0x75,0xeb,0xa8,0x3d,0x34,0x3f,0x00,0x3e,0x54,0x91,0x9f,0x3d,0xed,0x63,0xa2,0x3d,0x43,0xea,0xbe,0x3d,0xe9,0x0c,0xb9,0x3d,0xf4,0xf6,0xb2,0x3d,0x0a,0x87,0xc3,0x3d,0xc3,0x6c,0xa3,0x3d,0xf8,0xd9,0xb7,0x3d,0x48,0x3d,0x9c,0x3d,0x12,0x4f,0xb0,0x3d,0x3c,0x05,0xb0,0x3d,0xd9,0x68,0xfc,0x3d,0x7d,0x58,0xa3,0x3d,0xc8,0x78,0xa9,0x3d,0x06,0x87,0xc9,0x3d,0x11,0xaa,0xde,0x3d,0x44,0xe2,0xca,0x3d,0x9f,0x49,0xf3,0x3d,0x53,0x9a,0x80,0x3e,0x44,0x45,0xa0,0x3d,0x8d,0xac,0xa8,0x3d,0xb4,0x16,0xf3,0x3d,0xdb,0x9c,0xf0,0x3d,0xc6,0xc9,0xc9,0x3d,0x00,0x9f,0xac,0x3d,0x67,0x1b,0xba,0x3d,0xca,0x20,0x13,0x3e,0xd7,0x75,0x9e,0x3d,0x3c,0xc0,0xf0,0x3d,0xb0,0xaf,0xb9,0x3d,0xd9,0x6c,0xa4,0x3d,0xef,0x4e,0x9e,0x3d,0x71,0xe2,0x74,0x3e,0x4e,0x20,0x96,0x3d,0x5c,0x0a,0x9f,0x3d,0x48,0x74,0x03,0x3e,0x23,0xdd,0x99,0x3d,0x60,0xa9,0xb6,0x3d,0xc8,0xb1,0xa7,0x3d,0x5e,0xae,0xb1,0x3d,0x98,0x24,0xab,0x3d,0x90,0xce,0x05,0x3e,0x52,0x7e,0xb3,0x3d,0x2a,0x92,0xaa,0x3d,0xba,0xea,0xa3,0x3d,0x0c,0xfe,0xa6,0x3d,0xa1,0x0a,0x0a,0x3e,0x30,0xfb,0x8f,0x3d,0xdb,0xdb,0x70,0x3d,0x9f,0x3f,0x00,0x3e,0x2a,0xb4,0xa4,0x3d,0xc1,0x76,0xee,0x3d,0x3d,0xd6,0xba,0x3d,0x46,0x7a,0xf5,0x3d,0x10,0xd3,0xe3,0x3d,0xdb,0x9c,0xde,0x3d,0x07,0x28,0xb9,0x3d,0xc1,0x2e,0xc9,0x3d,0xb2,0x76,0x85,0x3e,0x78,0x39,0x99,0x3d,0x1d,0x79,0xad,0x3d,0x08,0xb6,0x9d,0x3d,0x92,0xce,0x8c,0x3d,0xf4,0xcf,0x96,0x3e,0x8c,0xe3,0xa4,0x3d,0x80,0x00,0x00,0x00,0xab,0x43,0x09,0xbe,0xd8,0x78,0xb0,0xbd,0x7c,0xfc,0x8b,0xbd,0x1f,0xab,0xa4,0xbd,0xa6,0xe1,0xa4,0xbd,0xec,0x59,0xcd,0xbd,0x29,0x41,0xa3,0xbd,0x05,0xa0,0xed,0xbd,0x73,0x55,0x89,0xbd,0x13,0xff,0x9d,0xbd,0xc7,0x6a,0xea,0xbd,0xed,0x1d,0xe2,0xbd,0x7f,0xb5,0x97,0xbe,0xeb,0xee,0xc0,0xbd,0x08,0x15,0xbb,0xbd,0x75,0x83,0x5f,0xbe,0xf9,0x54,0xc6,0xbd,0xdc,0xa0,0x80,0xbd,0x62,0xc0,0xb2,0xbd,0x4b,0xaf,0xac,0xbd,0xc8,0x15,0xae,0xbd,0xba,0xb0,0xa3,0xbd,0xa6,0xbd,0x02,0xbe,0xf9,0x3f,0x62,0xbd,0x4b,0x15,0x51,0xbe,0xf5,0x9c,0xa0,0xbd,0x6e,0xd6,0x90,0xbd,0x99,0xb3,0x00,0xbe,0xde,0x59,0x84,0xbd,0x94,0x46,0xcd,0xbd,0x3b,0xf5,0xe2,0xbd,0x3b,0x6b,0xce,0xbd,0x1a,0x0b,0xc3,0xbd,0xcd,0xd8,0x7c,0xbe,0x23,0x1b,0x90,0xbd,0x11,0x65,0xec,0xbd,0x93,0x3e,0xdf,0xbd,0xbe,0xfd,0x8b,0xbd,0x88,0x05,0x9d,0xbd,0x02,0xd4,0x91,0xbd,0x64,0x69,0xe4,0xbd,0xc7,0x4f,0xa1,0xbd,0xe3,0x11,0xd6,0xbd,0xe6,0x6c,0xa8,0xbd,0x95,0xc4,0x08,0xbe,0x37,0xa5,0xda,0xbd,0x2b,0xc7,0x99,0xbd,0xb5,0x47,0xa2,0xbd,0xf7,0xbd,0xba,0xbd,0x41,0x31,0xf8,0xbd,0x39,0xb5,0xc9,0xbd,0xed,0xf4,0xb2,0xbd,0x72,0xe2,0xde,0xbd,0x93,0xf7,0xc4,0xbd,0x8c,0xb2,0xdf,0xbd,0x5b,0x5f,0xcb,0xbd,0x36,0xae,0x88,0xbe,0x49,0xf3,0xfa,0xbd,0x26,0xdb,0x9d,0xbd,0x56,0x96,0x96,0xbd,0x90,0x1b,0x96,0xbd,0xdf,0xe5,0x89,0xbd,0x2f,0xed,0xe4,0xbd,0xd9,0x9d,0xd9,0xbd,0x0d,0x82,0xaa,0xbd,0x7e,0x18,0xdd,0xbd,0x9a,0xf3,0x05,0xbe,0xcf,0xaf,0x96,0xbd,0xcf,0x68,0x8b,0xbd,0x00,0x51,0xda,0xbd,0xe3,0x56,0x5e,0xbd,0x59,0xd2,0xad,0xbd,0x61,0x9e,0xe4,0xbd,0x64,0x6a,0x72,0xbd,0xdf,0x5f,0xcb,0xbd,0xc1,0xc9,0x88,0xbd,0xcf,0x14,0xa0,0xbd,0x26,0x9e,0xfd,0xbd,0x6d,0x1a,0xb8,0xbd,0x9e,0xdb,0xc2,0xbd,0xa2,0xaf,0xcc,0xbd,0x8e,0x58,0x82,0xbe,0xd9,0x3f,0xab,0xbd,0x40,0x12,0x97,0xbd,0xa9,0xe7,0xdd,0xbd,0xa1,0x3d,0xad,0xbd,0x90,0x4b,0xe7,0xbd,0x16,0xbc,0xca,0xbd,0x36,0x8d,0xc8,0xbd,0x4e,0xb6,0xf9,0xbd,0x5b,0xed,0x96,0xbd,0x43,0x7c,0xd2,0xbd,0xe5,0x3d,0xf5,0xbd,0x52,0xb5,0x95,0xbd,0x7e,0x22,0xa3,0xbd,0x76,0x28,0x86,0xbe,0x0b,0x12,0xac,0xbd,0x82,0x1f,0xa6,0xbd,0xa2,0xc5,0xa6,0xbd,0xf1,0x10,0x99,0xbd,0xb1,0x8b,0x03,0xbe,0x04,0x94,0xd5,0xbd,0xb9,0x84,0x87,0xbd,0xc4,0x4a,0xba,0xbd,0x50,0x5a,0xd5,0xbd,0xc5,0x61,0xa2,0xbd,0xed,0x3c,0xd9,0xbd,0x9e,0xc1,0xa9,0xbd,0xd8,0xf3,0xac,0xbd,0xeb,0x13,0xdc,0xbd,0x8a,0xfd,0xa9,0xbd,0xe2,0x72,0x84,0xbd,0x14,0xa9,0xf9,0xbd,0x92,0x6e,0xa7,0xbd,0x45,0x72,0xa3,0xbd,0xd4,0xce,0xbb,0xbd,0xd7,0xd2,0xc1,0xbd,0x0c,0x32,0xca,0xbd,0xf2,0xf6,0xac,0xbd,0xf3,0xe8,0x91,0xbd,0x90,0x39,0xf7,0xbd,0x0c,0xa5,0x92,0xbe,0x7b,0x09,0x56,0xbd,0x2c,0xa1,0x9e,0xbd,0x14,0x7f,0x8b,0xbd,0x9d,0x31,0x97,0xbd,0x14,0x92,0x73,0xbe,0x0b,0x55,0x82,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x32,0xa9,0xfe,0xff,0x00,0x00,0x00,0x09,0x1c,0x03,0x00,0x00,0x4b,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0xa9,0xfe,0xff,0x1c,0x02,0x00,0x00,0x94,0x01,0x00,0x00,0x0c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xaf,0x80,0xb8,0x39,0xf0,0x02,0xaa,0x3a,0xfb,0x42,0xaf,0x39,0x12,0xa8,0xcb,0x39,0x3a,0x82,0x80,0x3a,0xbf,0xe6,0xe3,0x39,0x05,0x36,0x02,0x3a,0xb0,0xbd,0x03,0x3a,0x60,0xa9,0xaa,0x39,0x91,0x12,0x91,0x3a,0x48,0x31,0x91,0x3a,0x0b,0x83,0xf7,0x39,0xda,0xa7,0x07,0x3a,0xeb,0x20,0xe0,0x39,0xc2,0x2a,0x34,0x3a,0x85,0x77,0xa5,0x3a,0x4f,0xcc,0x16,0x3a,0x05,0x39,0xa3,0x3a,0x5a,0x6c,0xb8,0x3a,0x52,0x3c,0x8d,0x3a,0x9e,0xde,0xcf,0x39,0xc9,0x4d,0xf3,0x39,0x7c,0xb3,0xef,0x39,0x1d,0xc2,0xd4,0x39,0x1a,0x65,0xfd,0x39,0x71,0x3f,0xe3,0x39,0xae,0x64,0xab,0x3a,0x85,0x76,0xcd,0x39,0xa9,0xbd,0xf8,0x39,0x37,0x9b,0x04,0x3a,0x6c,0xff,0xaf,0x3a,0xa3,0x88,0x90,0x3a,0x20,0x00,0x00,0x00,0x18,0xb6,0x11,0x3d,0xc1,0xa9,0x26,0x3e,0x75,0xe4,0x2d,0x3d,0x36,0xc5,0x22,0x3d,0xcf,0x0b,0xfb,0x3d,0xf2,0x1e,0x62,0x3d,0x99,0x31,0x81,0x3d,0x52,0xda,0x2a,0x3d,0x0d,0x54,0x29,0x3d,0x6c,0xf0,0x0f,0x3e,0xe5,0x0e,0x10,0x3e,0xbe,0x18,0x3c,0x3d,0x13,0x3e,0x39,0x3d,0xa9,0x60,0x5e,0x3d,0x6c,0xc2,0xb2,0x3d,0x96,0x2c,0x24,0x3e,0xbf,0x12,0x1a,0x3d,0x93,0xf2,0x21,0x3e,0x81,0xfb,0x36,0x3e,0xd9,0x21,0x0c,0x3e,0xa4,0x22,0x40,0x3d,0x2d,0x67,0x71,0x3d,0x64,0x00,0x38,0x3d,0x99,0x18,0x53,0x3d,0xc0,0xf9,0x41,0x3d,0xf2,0x78,0x61,0x3d,0xe5,0x0d,0x2a,0x3e,0x98,0xdb,0x4b,0x3d,0x2e,0xcc,0x76,0x3d,0x13,0xae,0x5a,0x3d,0x7c,0xbd,0x0b,0x3e,0xa9,0x03,0xf2,0x3d,0x20,0x00,0x00,0x00,0xae,0x0f,0x37,0xbd,0xea,0xae,0x28,0xbe,0xfc,0xc5,0x1a,0xbd,0xc2,0x10,0x4a,0xbd,0x6b,0x02,0xff,0xbd,0xbd,0x13,0x16,0xbd,0x0e,0xe5,0x36,0xbd,0x35,0xb6,0x82,0xbd,0x62,0x85,0x1f,0xbd,0xc0,0x4a,0xb5,0xbd,0xa1,0x41,0xc5,0xbd,0x05,0x94,0x75,0xbd,0x8a,0x98,0x86,0xbd,0x61,0x3a,0x22,0xbd,0x94,0x11,0x7f,0xbd,0x8e,0xac,0xec,0xbd,0xb6,0x9e,0x95,0xbd,0xfa,0x4a,0xe7,0xbd,0x33,0x5b,0x11,0xbe,0xdf,0xeb,0x09,0xbe,0xe1,0x3e,0x4e,0xbd,0x72,0x9a,0x32,0xbd,0x15,0xd4,0x6d,0xbd,0x98,0xdb,0x3e,0xbd,0x50,0x6a,0x7b,0xbd,0x83,0x95,0x37,0xbd,0xc7,0x0a,0x0c,0xbe,0xf0,0xae,0x22,0xbd,0xc5,0x8e,0x37,0xbd,0x01,0x92,0x83,0xbd,0x6d,0x9f,0x2e,0xbe,0x92,0x67,0x0f,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x6a,0xac,0xfe,0xff,0x00,0x00,0x00,0x09,0x1c,0x08,0x00,0x00,0x4a,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0xac,0xfe,0xff,0x1c,0x06,0x00,0x00,0x94,0x04,0x00,0x00,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x8e,0x94,0x70,0x3a,0x17,0x20,0x06,0x3a,0xd4,0xb7,0x3b,0x3a,0xa4,0x81,0xdb,0x3a,0xdf,0x82,0x80,0x3a,0x81,0xba,0x76,0x3a,0x5a,0x2e,0x2e,0x3a,0x98,0x09,0x05,0x3b,0x01,0xed,0x8a,0x3a,0x9f,0x07,0x2d,0x3a,0xc3,0xfe,0x80,0x3a,0x27,0xfc,0xdd,0x3a,0x2b,0x08,0xdb,0x3a,0xfe,0x2a,0x2c,0x3a,0x43,0x8a,0x77,0x3a,0xb0,0x6f,0xd3,0x3a,0xb2,0x3d,0x53,0x3a,0xd2,0xc5,0x34,0x3a,0xa0,0x19,0x3e,0x3a,0x48,0xa5,0x2b,0x3a,0xe5,0xa4,0xd2,0x3a,0x2d,0xf1,0x83,0x3a,0x4f,0xa2,0x45,0x3a,0x99,0x75,0x4f,0x3a,0x7c,0x11,0x8c,0x3a,0x6a,0x9e,0x91,0x3a,0x56,0x1f,0xd5,0x3a,0xca,0x77,0x3b,0x3a,0x6e,0xcc,0x35,0x3a,0xaa,0x84,0x48,0x3a,0x7c,0x61,0x28,0x3a,0x78,0xc0,0xb8,0x3a,0x1b,0x30,0x9b,0x3a,0x2e,0xe4,0x9e,0x3a,0x2b,0x02,0x2f,0x3a,0xd8,0x0c,0x91,0x3a,0xba,0x6e,0xd3,0x3a,0x2c,0x1b,0x57,0x3a,0xdd,0x54,0x61,0x3a,0x68,0x29,0x45,0x3a,0xb2,0xc7,0x25,0x3b,0xa6,0x4d,0x47,0x3a,0x15,0xdd,0x55,0x3a,0x77,0x1b,0x4f,0x3a,0xb6,0xcf,0x38,0x3a,0xcb,0x1b,0xbb,0x3a,0x85,0x6d,0x17,0x3a,0x4d,0x12,0x4f,0x3a,0x2a,0xdf,0x7d,0x3a,0x42,0x61,0x96,0x3a,0xe7,0xef,0x7c,0x3a,0xe3,0x91,0xd9,0x3a,0xd9,0x36,0x5f,0x3a,0xdb,0x3c,0xda,0x3a,0x79,0x5e,0x40,0x3a,0x66,0xe6,0xed,0x3a,0xa2,0x6c,0x2a,0x3a,0x08,0x8e,0x23,0x3a,0x16,0xd0,0x83,0x3a,0x20,0x13,0x43,0x3a,0x84,0xf0,0x31,0x3a,0xee,0xae,0x1d,0x3a,0x5d,0xba,0x92,0x3a,0x20,0x3f,0x69,0x3a,0x4b,0xf1,0xef,0x3a,0x69,0xe0,0x18,0x3a,0x7a,0x1f,0x21,0x3b,0x35,0xe8,0x51,0x3a,0x21,0x15,0x45,0x3a,0x03,0xdb,0x55,0x3a,0x41,0xcf,0x45,0x3a,0x64,0x0c,0x40,0x3a,0x4b,0x49,0x38,0x3a,0x55,0xa4,0x3d,0x3a,0x5b,0x0c,0x24,0x3a,0x6d,0x7e,0x35,0x3a,0x3e,0x60,0x8d,0x3a,0x29,0xc6,0x2e,0x3a,0x62,0xc2,0x45,0x3a,0x5a,0xfe,0x3c,0x3a,0x89,0x41,0xce,0x3a,0x08,0x92,0x66,0x3a,0x29,0x16,0x2b,0x3a,0x4c,0x7b,0x01,0x3a,0x5c,0x5b,0x08,0x3b,0x3d,0x5a,0xce,0x3a,0x44,0x6b,0x76,0x3a,0x7b,0xe6,0x74,0x3a,0xf2,0x5f,0x5e,0x3a,0xae,0xa0,0x41,0x3a,0x29,0xe4,0xdc,0x3a,0x83,0x9b,0xf2,0x3a,0x92,0x47,0xdc,0x3a,0xb0,0x0a,0x1f,0x3b,0x72,0x8d,0x45,0x3a,0xa5,0xbd,0x74,0x3a,0x60,0x00,0x00,0x00,0x65,0xb3,0xee,0x3d,0xa5,0xe0,0x80,0x3d,0x64,0x40,0xba,0x3d,0x51,0x49,0x24,0x3e,0xb3,0x03,0xff,0x3d,0x0c,0xcd,0xf4,0x3d,0xe5,0xaa,0x9b,0x3d,0xfd,0xe8,0x33,0x3e,0x89,0x95,0xa9,0x3d,0xee,0x05,0x99,0x3d,0x8a,0xf9,0xff,0x3d,0xf0,0x83,0x20,0x3e,0x0e,0x47,0x08,0x3e,0xa8,0xd2,0xaa,0x3d,0x2e,0x9b,0xf5,0x3d,0x7d,0xbd,0xc6,0x3d,0xf4,0xfc,0xa0,0x3d,0x46,0x5c,0xb3,0x3d,0x06,0x36,0xb7,0x3d,0xfd,0x4d,0xaa,0x3d,0x9b,0xff,0x50,0x3e,0xe9,0x7e,0xdf,0x3d,0x25,0x62,0xb1,0x3d,0xae,0xd6,0xcd,0x3d,0x3d,0xcd,0x04,0x3e,0x2d,0x7b,0x10,0x3e,0x2a,0xb4,0x94,0x3d,0xda,0x00,0xba,0x3d,0xd5,0x60,0xb4,0x3d,0xa1,0xf3,0xc6,0x3d,0xb9,0x10,0xa7,0x3d,0xf7,0x4e,0x37,0x3e,0x96,0x5c,0xd1,0x3d,0xe7,0x7c,0x96,0x3d,0x27,0xa4,0xad,0x3d,0x07,0xb3,0x90,0x3d,0x67,0xbc,0xb2,0x3d,0xf6,0x6c,0xd5,0x3d,0xc2,0x24,0xc1,0x3d,0x54,0x9b,0xa3,0x3d,0x90,0x28,0x1e,0x3e,0x0b,0xbf,0xc5,0x3d,0x42,0x3c,0xbe,0x3d,0x00,0x8f,0xcc,0x3d,0x83,0x70,0xab,0x3d,0x93,0xa5,0x39,0x3e,0x71,0xa6,0x95,0x3d,0x2e,0xb1,0xad,0x3d,0x0c,0xc7,0xd0,0x3d,0x7f,0x34,0x15,0x3e,0x07,0xf6,0xfa,0x3d,0xbf,0xde,0x57,0x3e,0x6b,0x78,0xdd,0x3d,0xb3,0xdf,0xd1,0x3d,0xbc,0xdd,0xbe,0x3d,0xab,0x93,0x9d,0x3d,0xc9,0x17,0xa9,0x3d,0xe4,0xb1,0x98,0x3d,0x70,0x44,0xf4,0x3d,0x2f,0x1c,0xbe,0x3d,0xa3,0x8c,0xb0,0x3d,0x90,0x73,0x9c,0x3d,0xeb,0x17,0xa5,0x3d,0xa2,0x6c,0xe7,0x3d,0x95,0xab,0x15,0x3e,0xa8,0xae,0x97,0x3d,0x3b,0xdd,0x9f,0x3e,0x19,0xae,0xa6,0x3d,0x07,0x4b,0xaf,0x3d,0x4d,0x2f,0xd4,0x3d,0xa2,0x43,0xc4,0x3d,0x4b,0x8c,0xbe,0x3d,0xb8,0xd8,0xb6,0x3d,0x0c,0x29,0xbc,0x3d,0x7c,0xb6,0x76,0x3d,0x43,0x16,0x83,0x3d,0x7e,0x45,0x0c,0x3e,0x9d,0x68,0xad,0x3d,0xb6,0xe7,0xb9,0x3d,0x5d,0x84,0xbb,0x3d,0xa2,0x9a,0xbf,0x3d,0x11,0xeb,0xab,0x3d,0xfd,0xbf,0xa9,0x3d,0x55,0x78,0x80,0x3d,0x8a,0xf3,0xf4,0x3d,0x89,0xbd,0x4c,0x3e,0x6d,0x7e,0xf4,0x3d,0xc9,0xe1,0xa3,0x3d,0xe6,0x9b,0xca,0x3d,0x6d,0x1d,0xc0,0x3d,0x69,0x7c,0xd5,0x3d,0x6b,0xc8,0x27,0x3e,0xb4,0x41,0xe4,0x3d,0x7d,0x36,0x84,0x3e,0xb2,0x59,0x98,0x3d,0x2a,0xd4,0xf2,0x3d,0x60,0x00,0x00,0x00,0x5e,0x7a,0xaf,0xbd,0xd7,0x13,0x85,0xbd,0x99,0xa9,0xb1,0xbd,0xa1,0xca,0x59,0xbe,0x62,0x6c,0xa7,0xbd,0x4b,0x88,0x95,0xbd,0xfd,0xd1,0xac,0xbd,0x85,0xff,0x83,0xbe,0x27,0xd7,0x09,0xbe,0x90,0xad,0xab,0xbd,0x27,0x96,0xf7,0xbd,0x2f,0x40,0x5c,0xbe,0x1b,0x52,0x59,0xbe,0x2b,0xe1,0x91,0xbd,0x04,0xa2,0xad,0xbd,0xd1,0xc8,0x51,0xbe,0x37,0x97,0xd1,0xbd,0x10,0xd2,0x99,0xbd,0x6d,0x9d,0xbc,0xbd,0x93,0xfc,0x83,0xbd,0x57,0xa1,0x38,0xbe,0x4b,0xe9,0x02,0xbe,0x0a,0x17,0xc4,0xbd,0x25,0xbc,0x96,0xbd,0x59,0xf9,0x0a,0xbe,0x3c,0xd6,0xa4,0xbd,0x17,0x75,0x53,0xbe,0x6e,0xee,0x90,0xbd,0xfa,0x90,0x9c,0xbd,0x34,0x0d,0xba,0xbd,0xa6,0x61,0x95,0xbd,0x93,0x8d,0x03,0xbe,0xbb,0xf9,0x19,0xbe,0x66,0xa6,0x1d,0xbe,0xb6,0xb9,0x6c,0xbd,0xbe,0xea,0x0f,0xbe,0xdd,0xc7,0x51,0xbe,0x13,0x3c,0x81,0xbd,0x33,0x92,0xdf,0xbd,0x15,0x9f,0xc3,0xbd,0x23,0x7c,0xa4,0xbe,0xb7,0x4f,0xae,0xbd,0x5b,0x31,0xd4,0xbd,0x40,0x7d,0xcd,0xbd,0x17,0x5e,0xb7,0xbd,0xd4,0xd2,0x9e,0xbd,0xaa,0x3e,0x96,0xbd,0x28,0x74,0xcd,0xbd,0x6c,0xe3,0xfb,0xbd,0x8f,0xd4,0xff,0xbd,0x4a,0x61,0xae,0xbd,0xd5,0x9f,0xce,0xbd,0xca,0x06,0x95,0xbd,0x61,0x88,0x58,0xbe,0x2f,0xbb,0x8e,0xbd,0x99,0x0a,0x6c,0xbe,0xe1,0x4e,0x92,0xbd,0xec,0x46,0xa2,0xbd,0x76,0xc8,0x02,0xbe,0xfa,0x8c,0xc1,0xbd,0xf6,0x54,0xad,0xbd,0x59,0x67,0x87,0xbd,0xe8,0x94,0x11,0xbe,0x6c,0x39,0xb4,0xbd,0x68,0x11,0x6e,0xbe,0x82,0xc4,0x8e,0xbd,0x83,0xcb,0x89,0xbe,0x65,0x44,0xd0,0xbd,0xf7,0x8a,0xc3,0xbd,0xe6,0x81,0xa0,0xbd,0xd0,0x36,0xb3,0xbd,0x2f,0x0a,0x94,0xbd,0x71,0xd5,0xad,0xbd,0x07,0x7b,0x9d,0xbd,0x42,0xc4,0xa2,0xbd,0x70,0x13,0xb4,0xbd,0x34,0x42,0xa9,0xbd,0xd3,0x9a,0x9f,0xbd,0xdd,0x36,0xc4,0xbd,0x2d,0x76,0xab,0xbd,0x06,0xa5,0x4c,0xbe,0xe4,0xc4,0xe4,0xbd,0x09,0x22,0x6f,0xbd,0x49,0xe5,0x79,0xbd,0xa5,0x4a,0x87,0xbe,0xb1,0xc8,0x34,0xbe,0xdb,0x97,0xdb,0xbd,0xae,0xfc,0xf2,0xbd,0x32,0xa3,0xdc,0xbd,0xf7,0x38,0xbd,0xbd,0x61,0x2a,0x5b,0xbe,0x4c,0xb6,0x70,0xbe,0x03,0x8f,0x5a,0xbe,0x9b,0xcc,0x9d,0xbe,0x57,0x02,0xc4,0xbd,0xcb,0xc1,0xbd,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x36,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xa2,0xb4,0xfe,0xff,0x00,0x00,0x00,0x09,0xdc,0x01,0x00,0x00,0x49,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x94,0xb4,0xfe,0xff,0x1c,0x01,0x00,0x00,0xd4,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xf3,0x09,0x2f,0x3a,0xbc,0x3c,0xed,0x39,0xb4,0x59,0x8c,0x39,0x85,0x6a,0xd5,0x39,0xe0,0x7c,0x89,0x39,0x50,0x9b,0xb1,0x39,0x34,0x50,0x0b,0x3a,0x38,0x0e,0xbb,0x39,0xe8,0x88,0x83,0x39,0x05,0x06,0xd9,0x39,0x8b,0xb2,0x19,0x3a,0xc7,0xf0,0xf1,0x39,0x95,0x2e,0xbb,0x39,0xca,0xec,0xe0,0x39,0x22,0x75,0xa6,0x39,0xc7,0x84,0xce,0x39,0x10,0x00,0x00,0x00,0x3f,0x20,0x61,0x3d,0x0b,0x1b,0x58,0x3d,0x01,0x41,0x0b,0x3d,0xb0,0xbf,0x53,0x3d,0x3c,0xc4,0xbe,0x3b,0x19,0x38,0x30,0x3d,0xdd,0x24,0x2e,0x3d,0xb1,0xa9,0x02,0x3d,0x86,0x59,0xcc,0x3c,0xf9,0x53,0x57,0x3d,0xab,0xc0,0x3c,0x3d,0xe5,0x0c,0x70,0x3d,0x6f,0x15,0x1f,0x3c,0xf0,0x2a,0x5f,0x3d,0x38,0x28,0x25,0x3d,0xbd,0xe7,0x4c,0x3d,0x10,0x00,0x00,0x00,0xdf,0xab,0xad,0xbd,0x43,0x62,0x6b,0xbd,0x23,0x5f,0x93,0xbc,0xfa,0xdb,0xa4,0xbc,0xe6,0x69,0x08,0xbd,0xc2,0xd6,0xaa,0xbc,0x94,0x39,0x8a,0xbd,0x1c,0x98,0x39,0xbd,0xd6,0x81,0x02,0xbd,0xad,0xfc,0x61,0xbc,0x26,0x7f,0x98,0xbd,0xda,0x09,0x63,0xbd,0x38,0xb8,0x39,0xbd,0x92,0x0b,0x02,0xbd,0x75,0x67,0x44,0xbc,0x7f,0xb9,0x0f,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x9a,0xb6,0xfe,0xff,0x00,0x00,0x00,0x09,0x1c,0x08,0x00,0x00,0x48,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x8c,0xb6,0xfe,0xff,0x1c,0x06,0x00,0x00,0x94,0x04,0x00,0x00,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x63,0xca,0x9f,0x3a,0xe5,0x76,0xcb,0x3a,0xd3,0x68,0x16,0x3a,0x92,0x64,0x93,0x3a,0x8a,0x22,0xe3,0x3a,0x73,0x24,0x4a,0x3a,0xaf,0x65,0x93,0x3a,0xf1,0xe7,0x41,0x3a,0x3b,0x22,0x82,0x3a,0x11,0x2d,0x3b,0x3a,0xe8,0x21,0xba,0x3a,0x94,0x08,0x33,0x3a,0xe0,0x83,0x67,0x3a,0x84,0x2f,0xd1,0x3a,0x9a,0x53,0x16,0x3a,0x77,0xda,0x75,0x3a,0xfe,0x9e,0xc5,0x3a,0x72,0xb1,0x7f,0x3a,0xf4,0xc1,0x59,0x3a,0x0c,0x3c,0x44,0x3a,0x0d,0xe0,0x1a,0x3a,0xaf,0xd5,0x9a,0x3a,0x93,0x66,0xca,0x3a,0xd0,0x56,0x53,0x3a,0x87,0x5f,0x0a,0x3b,0xa9,0xa3,0xad,0x3a,0x87,0xe9,0x4e,0x3a,0xb3,0xf5,0x92,0x3a,0x2d,0x78,0xe5,0x3a,0x8d,0x6a,0x24,0x3a,0xb8,0x09,0x2e,0x3a,0xb6,0x59,0xcf,0x3a,0x41,0x62,0x4f,0x3a,0x62,0x81,0xd6,0x3a,0x85,0xb6,0xa4,0x3a,0x42,0x56,0x6f,0x3a,0xe9,0x91,0x76,0x3a,0x9a,0xb2,0x63,0x3a,0xf5,0x4f,0x05,0x3b,0xf0,0xca,0x30,0x3a,0x69,0x13,0xdb,0x3a,0x35,0x06,0x41,0x3a,0xf1,0x71,0x7b,0x3a,0x8b,0xcc,0x9b,0x3a,0x38,0x82,0x4a,0x3a,0x31,0x3e,0x7b,0x3a,0xcd,0x45,0xc2,0x3a,0xd5,0xed,0xc0,0x3a,0x43,0x31,0x43,0x3a,0x24,0x60,0xe4,0x3a,0x7a,0xc9,0xa3,0x3a,0xe4,0xa8,0x6f,0x3a,0x6a,0x21,0xb1,0x3a,0xa0,0xfd,0x87,0x3a,0xac,0x0d,0xbf,0x3a,0x8b,0x92,0x50,0x3a,0x47,0x3e,0xa4,0x3a,0xc9,0x3f,0x84,0x3a,0x84,0xc2,0x49,0x3a,0xe3,0x5d,0x18,0x3a,0x5a,0xf8,0x96,0x3a,0xb5,0xbd,0x99,0x3a,0x42,0x49,0x1f,0x3b,0xbf,0x1b,0x94,0x3a,0x3e,0x04,0x7c,0x3a,0x1a,0x88,0x9e,0x3a,0x0d,0x0f,0x74,0x3a,0x02,0xf2,0x09,0x3b,0x4e,0xdd,0x85,0x3a,0x52,0x25,0xc8,0x3a,0xf0,0x57,0x74,0x3a,0x35,0x82,0x3a,0x3a,0xd5,0xa7,0x27,0x3a,0x66,0x2e,0x5b,0x3a,0x63,0x4d,0xbc,0x3a,0x02,0xc1,0xc5,0x3a,0x45,0xda,0xe3,0x3a,0x49,0x8f,0x03,0x3b,0xf5,0x60,0x6a,0x3a,0x31,0x9b,0xca,0x3a,0x44,0x9c,0x33,0x3a,0x51,0x46,0x9c,0x3a,0xbd,0xf7,0xa4,0x3a,0xbe,0x0b,0xea,0x3a,0x75,0xc0,0x4a,0x3a,0x32,0xaa,0x85,0x3a,0x03,0xb7,0xd3,0x3a,0x05,0x16,0xa3,0x3a,0x3b,0x6e,0xa8,0x3a,0xaf,0xa0,0x52,0x3a,0x2a,0x84,0xa6,0x3a,0xd5,0x9e,0x3b,0x3a,0xac,0xde,0x30,0x3a,0x94,0xb6,0x31,0x3a,0x3b,0xb2,0x47,0x3a,0xad,0x79,0x3d,0x3a,0x60,0x00,0x00,0x00,0x18,0x99,0xc5,0x3d,0xf7,0xdf,0x49,0x3e,0x2b,0xbd,0x8c,0x3d,0xc9,0x3d,0x12,0x3e,0xbf,0x7a,0x3c,0x3e,0x2a,0x90,0xc8,0x3d,0xe4,0x3e,0x12,0x3e,0x6f,0x1d,0xa0,0x3d,0xf7,0x1d,0x01,0x3e,0xb7,0xb6,0xb9,0x3d,0x48,0x3f,0x02,0x3e,0x83,0xa2,0xb1,0x3d,0x05,0x15,0xcb,0x3d,0x25,0x8d,0x4f,0x3e,0x2f,0xd6,0x8f,0x3d,0xca,0x8f,0xbe,0x3d,0xc0,0x13,0x44,0x3e,0x0f,0xb2,0xfd,0x3d,0x70,0x0e,0xd8,0x3d,0x94,0xb3,0xc2,0x3d,0x4d,0xaa,0x99,0x3d,0x22,0xe8,0xe8,0x3d,0xc6,0xd1,0x48,0x3e,0x22,0xb0,0xd1,0x3d,0xc8,0x4a,0x89,0x3e,0x62,0x48,0x2c,0x3e,0xb4,0x4b,0xcd,0x3d,0xc8,0xcf,0x11,0x3e,0x3d,0xad,0x63,0x3e,0xb8,0x21,0xa3,0x3d,0xa5,0xad,0xac,0x3d,0x4c,0xfa,0x23,0x3e,0x7c,0xc3,0xcd,0x3d,0x5f,0xd4,0x54,0x3e,0x18,0x6d,0x23,0x3e,0x95,0x77,0xed,0x3d,0xc5,0xa4,0xf4,0x3d,0x35,0xeb,0xe1,0x3d,0x55,0x45,0x84,0x3e,0x34,0x8c,0x84,0x3d,0x42,0x5d,0x59,0x3e,0x29,0x84,0xbf,0x3d,0x0d,0x7b,0xf9,0x3d,0x47,0xf8,0xf4,0x3d,0x34,0xed,0xc8,0x3d,0xae,0x3b,0xf0,0x3d,0xdb,0x84,0x26,0x3e,0x70,0x7b,0xc3,0x3d,0xe8,0x6b,0x94,0x3d,0x0f,0xdd,0x35,0x3e,0xe7,0x81,0x22,0x3e,0x15,0xbe,0x8d,0x3d,0xa1,0x3a,0x17,0x3e,0xa5,0xed,0x06,0x3e,0x91,0x8f,0x3d,0x3e,0xb1,0x4b,0xcb,0x3d,0x35,0x6b,0xaa,0x3d,0x49,0x37,0x03,0x3e,0xff,0x2e,0xc8,0x3d,0x27,0x2d,0x97,0x3d,0x69,0xca,0x15,0x3e,0x3a,0x8a,0x18,0x3e,0xaf,0x0a,0x9e,0x3e,0x88,0xf3,0x12,0x3e,0x38,0x63,0xd9,0x3d,0x0a,0x4b,0x1d,0x3e,0x1f,0x7b,0xe4,0x3d,0x52,0x56,0x1f,0x3e,0x93,0xd1,0x04,0x3e,0x0f,0x63,0x85,0x3d,0xe8,0x2d,0xb8,0x3d,0x31,0x0d,0xb9,0x3d,0x85,0x58,0xa6,0x3d,0x09,0x78,0xd9,0x3d,0xc8,0xd4,0x3a,0x3e,0x80,0x35,0x44,0x3e,0x90,0x12,0x62,0x3e,0x2a,0x88,0x82,0x3e,0x33,0x8c,0xe8,0x3d,0xfb,0x05,0x49,0x3e,0x0b,0x35,0xb2,0x3d,0xe3,0x1d,0x1a,0x3e,0xce,0xad,0x23,0x3e,0xa7,0x37,0x68,0x3e,0xf4,0x2a,0xc9,0x3d,0xde,0x9e,0x04,0x3e,0xe5,0x91,0x10,0x3e,0xd9,0xcf,0x21,0x3e,0x5f,0x1d,0x27,0x3e,0x6e,0xfb,0xd0,0x3d,0x22,0x37,0x25,0x3e,0xbf,0x49,0xab,0x3d,0xef,0x7c,0xaf,0x3d,0x27,0x53,0xb0,0x3d,0xd7,0x22,0xc6,0x3d,0x12,0x97,0xbb,0x3d,0x60,0x00,0x00,0x00,0xce,0x8a,0x1e,0xbe,0x55,0x88,0xc4,0xbd,0x01,0x3c,0x95,0xbd,0xcc,0xae,0x01,0xbe,0x45,0x5c,0x61,0xbe,0xb2,0xcb,0xc1,0xbd,0xaa,0x85,0x0f,0xbe,0x21,0x64,0xc0,0xbd,0x41,0xeb,0xd9,0xbd,0x57,0x1f,0xa2,0xbd,0xa4,0xad,0x38,0xbe,0x16,0x12,0x4c,0xbd,0xd8,0xb4,0xe5,0xbd,0x20,0xc7,0xa3,0xbd,0xf3,0x26,0x95,0xbd,0xc2,0xee,0xf3,0xbd,0x73,0x91,0xc5,0xbd,0x23,0x1a,0xa1,0xbd,0xf7,0xfa,0x9e,0xbd,0x0d,0xa1,0x7b,0xbd,0xcf,0xf9,0x80,0xbd,0x04,0xa0,0x19,0xbe,0x39,0x3d,0x05,0xbe,0x46,0x6f,0xac,0xbd,0xf6,0x9a,0x25,0xbe,0xde,0xad,0x96,0xbd,0xee,0x12,0xaf,0xbd,0xb4,0x1f,0xc6,0xbd,0x02,0xf3,0x0c,0xbe,0x4c,0xf5,0x9a,0xbd,0x86,0x3a,0x90,0xbd,0x03,0xbb,0x4d,0xbe,0x1e,0xa9,0x52,0xbd,0x3b,0x92,0x05,0xbe,0xca,0x23,0xce,0xbd,0xc9,0xbe,0x4f,0xbd,0x6a,0x27,0x8d,0xbd,0x14,0x10,0xde,0xbd,0xd9,0xf3,0x36,0xbe,0x5a,0x69,0xaf,0xbd,0x63,0x9b,0xfe,0xbd,0x84,0xd4,0x9d,0xbd,0x14,0x1e,0xc9,0xbd,0xf2,0x94,0x1a,0xbe,0xdd,0xc2,0xb5,0xbd,0xb5,0x47,0xf9,0xbd,0x41,0xc1,0x40,0xbe,0xf9,0x6b,0x3f,0xbe,0xe0,0xaa,0xc1,0xbd,0x64,0x97,0x62,0xbe,0x10,0x73,0xc7,0xbd,0x92,0xc9,0xed,0xbd,0x27,0xbf,0x2f,0xbe,0xdd,0x1a,0xba,0xbd,0x87,0x9e,0xbd,0xbd,0x66,0xf1,0xce,0xbd,0xca,0xf5,0x22,0xbe,0x1d,0x7f,0x89,0xbd,0x7b,0x7e,0x87,0xbd,0x33,0xf5,0x91,0xbd,0x04,0x2c,0xab,0xbd,0x1a,0xb5,0xe2,0xbd,0x3c,0x0d,0x24,0xbe,0xaf,0x0e,0xfa,0xbd,0x36,0x0c,0xfa,0xbd,0xbc,0xbc,0xd0,0xbd,0xef,0x26,0xf2,0xbd,0x1e,0xde,0x88,0xbe,0x78,0x9f,0x28,0xbd,0x07,0x95,0x46,0xbe,0x40,0x6f,0xf2,0xbd,0x42,0xfb,0xa9,0xbd,0x79,0x6e,0x8d,0xbd,0x3f,0x78,0x7c,0xbd,0x44,0x51,0xca,0xbd,0x52,0x37,0x14,0xbe,0x11,0x6d,0x0e,0xbe,0x80,0xc0,0x71,0xbe,0xcf,0xd0,0x91,0xbd,0x18,0xd6,0xc5,0xbd,0x72,0x6c,0xa7,0xbd,0xc4,0x0d,0x1b,0xbe,0x26,0x93,0x00,0xbe,0xf6,0x60,0x62,0xbe,0x80,0x1a,0xb5,0xbd,0x52,0xdb,0x06,0xbd,0x95,0x0f,0x52,0xbe,0x2b,0x1b,0xc5,0xbd,0x52,0xe7,0x18,0xbe,0x83,0x8c,0x53,0xbd,0x82,0xd7,0xdc,0xbd,0x97,0x27,0xba,0xbd,0x02,0xa1,0x96,0xbd,0xbf,0x6d,0x9e,0xbd,0x61,0x80,0xaf,0xbd,0xba,0xfe,0xbb,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xd2,0xbe,0xfe,0xff,0x00,0x00,0x00,0x09,0xdc,0x01,0x00,0x00,0x47,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xc4,0xbe,0xfe,0xff,0x1c,0x01,0x00,0x00,0xd4,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0d,0x1b,0x0b,0x3a,0x90,0x61,0x61,0x3a,0x39,0x7d,0x89,0x39,0x76,0xf6,0xb3,0x39,0x2e,0x65,0x0f,0x39,0x66,0xa3,0x7d,0x39,0xd4,0x6b,0xba,0x39,0x85,0xa5,0x26,0x3a,0x95,0x72,0x98,0x39,0x1f,0x1c,0xa0,0x39,0x71,0x21,0x3b,0x3a,0xab,0x32,0xe5,0x39,0xab,0xf7,0x95,0x39,0x64,0x64,0xb0,0x39,0x1c,0xe5,0x59,0x39,0x9d,0xa3,0xcb,0x39,0x10,0x00,0x00,0x00,0x00,0x9f,0x25,0x3d,0xcd,0x9e,0xdf,0x3d,0x3f,0x6a,0x08,0x3d,0x40,0x0e,0x0e,0x3d,0x64,0x2c,0x24,0x3c,0x1f,0xa8,0xfb,0x3c,0x8d,0xf7,0x13,0x3d,0x3a,0x58,0xa5,0x3d,0xb0,0x41,0x17,0x3d,0xe7,0xdb,0x1e,0x3d,0x9c,0x9d,0x64,0x3d,0x46,0x68,0x63,0x3d,0xab,0xf7,0xd5,0x3c,0x9b,0x03,0x2f,0x3d,0x52,0x31,0xd8,0x3c,0x56,0x0c,0x4a,0x3d,0x10,0x00,0x00,0x00,0xd7,0x04,0x8a,0xbd,0xe1,0x7c,0x1d,0xbd,0xb4,0x69,0x63,0xbc,0x89,0x8e,0x32,0xbd,0x64,0x46,0x8e,0xbc,0x01,0x82,0x85,0xbc,0xfc,0xf6,0x38,0xbd,0x7c,0x62,0x95,0xbd,0x64,0x1a,0x6f,0xbc,0xe4,0x04,0xb4,0xbc,0x2e,0xab,0xb9,0xbd,0xcf,0x48,0x35,0xbd,0xbc,0xcb,0x14,0xbd,0x5e,0x5c,0x26,0xbd,0x18,0x57,0x7b,0xbc,0x14,0x05,0xb1,0xbc,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xca,0xc0,0xfe,0xff,0x00,0x00,0x00,0x09,0x1c,0x08,0x00,0x00,0x46,0x00,0x00,0x00,0xac,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0xbc,0xc0,0xfe,0xff,0x1c,0x06,0x00,0x00,0x94,0x04,0x00,0x00,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x1f,0x48,0x76,0x3a,0x84,0x68,0x3c,0x3a,0x2a,0xbd,0x6a,0x3a,0xbe,0x69,0xa1,0x3a,0xd5,0xa1,0xbe,0x3a,0x89,0x58,0x8e,0x3a,0x7c,0x2d,0x75,0x3a,0xad,0x1f,0x40,0x3a,0x89,0xbf,0x06,0x3b,0x2a,0x5a,0xe0,0x3a,0x62,0x8e,0xc3,0x3a,0x50,0x55,0xb7,0x3a,0x5e,0x5c,0x8c,0x3a,0x06,0xbd,0x92,0x3a,0xf7,0x3e,0x46,0x3a,0x13,0xb3,0x74,0x3a,0x09,0xd7,0x7e,0x3a,0xde,0xb4,0x4f,0x3a,0x0e,0xe8,0xa2,0x3a,0x04,0x3d,0x7e,0x3a,0x55,0x04,0x4d,0x3a,0x13,0x03,0x7e,0x3a,0x4c,0x6c,0x3e,0x3a,0xd9,0x43,0xdb,0x3a,0x9c,0x7c,0x46,0x3a,0x32,0xa1,0x52,0x3a,0x24,0x9b,0xd7,0x3a,0x3c,0xbc,0xa7,0x3a,0x21,0x57,0x3e,0x3a,0x7d,0xa1,0x87,0x3a,0xf5,0x05,0x44,0x3a,0x03,0x2e,0x4d,0x3a,0xb8,0xc4,0x8d,0x3a,0x2f,0x6a,0x30,0x3a,0xaa,0x27,0xb1,0x3a,0x6d,0x39,0x4c,0x3a,0x89,0x18,0xad,0x3a,0x8c,0x65,0x3c,0x3a,0x3b,0x28,0x8c,0x3a,0x45,0x3c,0xe8,0x3a,0x2b,0x3d,0x4a,0x3a,0xe7,0x82,0x44,0x3a,0x6a,0xbf,0x33,0x3a,0x29,0xb1,0x3a,0x3a,0xec,0x48,0x33,0x3a,0x7d,0x47,0x4a,0x3a,0x23,0x83,0x42,0x3a,0xc6,0x1b,0x15,0x3b,0xa0,0xd9,0x42,0x3a,0x2c,0xb2,0x6d,0x3a,0xaa,0xf7,0x52,0x3a,0x98,0x98,0xec,0x3a,0xdf,0x23,0x6f,0x3a,0x66,0x3c,0x9d,0x3a,0x24,0x30,0x80,0x3a,0xd3,0x6b,0x5b,0x3a,0x4b,0xf4,0x93,0x3a,0xaf,0x5a,0x47,0x3a,0x4c,0x23,0x75,0x3a,0xdf,0xc1,0xac,0x3a,0x0d,0x41,0xbe,0x3a,0x13,0xcd,0x54,0x3a,0x24,0x81,0x92,0x3a,0xf7,0xba,0xa7,0x3a,0x4c,0x0e,0xba,0x3a,0xd1,0x53,0xa7,0x3a,0x3d,0xfc,0x3f,0x3a,0xa6,0x11,0x82,0x3a,0xf2,0x82,0x59,0x3a,0x8d,0x95,0x94,0x3a,0x63,0xdf,0xb9,0x3a,0x8f,0x00,0x05,0x3b,0xe5,0xcd,0x6d,0x3a,0xad,0x4c,0x3a,0x3a,0x37,0x9e,0x9a,0x3a,0x27,0x18,0x84,0x3a,0x61,0x47,0xe2,0x3a,0x98,0xfc,0x70,0x3a,0xd7,0x29,0xd3,0x3a,0x96,0x2e,0x72,0x3a,0x66,0x31,0x05,0x3b,0xa1,0x8c,0x9c,0x3a,0x68,0x19,0x32,0x3a,0x7d,0xf0,0x5f,0x3a,0x69,0x65,0x40,0x3a,0xa2,0x25,0x55,0x3a,0xd6,0xcd,0xf5,0x3a,0x9b,0xd3,0x94,0x3a,0x79,0xaf,0x62,0x3a,0x96,0x54,0x68,0x3a,0x72,0x38,0x68,0x3a,0x2c,0xc8,0x56,0x3a,0xa9,0x4f,0xf3,0x3a,0x64,0xb0,0x62,0x3a,0x6f,0x68,0xe0,0x3a,0x9c,0x35,0x52,0x3a,0x60,0x00,0x00,0x00,0x8f,0x5b,0xf4,0x3d,0xb3,0xef,0xba,0x3d,0xb0,0xe7,0xe8,0x3d,0xeb,0x26,0x20,0x3e,0x91,0x24,0x3d,0x3e,0xd8,0x3b,0x0d,0x3e,0x21,0x43,0xf3,0x3d,0x6e,0x9f,0xbe,0x3d,0x0a,0xb2,0x85,0x3e,0x6e,0xd3,0xe4,0x3d,0x24,0x52,0x10,0x3e,0xa5,0xe6,0x35,0x3e,0xce,0x1a,0xc6,0x3d,0x85,0x03,0x11,0x3e,0x79,0xb2,0xc4,0x3d,0xad,0xc9,0xf2,0x3d,0x5b,0xd9,0xfc,0x3d,0x74,0x15,0xce,0x3d,0x3e,0xa2,0x21,0x3e,0x8a,0x40,0xfc,0x3d,0x4c,0x6a,0xcb,0x3d,0x0d,0x07,0xfc,0x3d,0x73,0xef,0xbc,0x3d,0x51,0x8d,0x59,0x3e,0xa3,0xef,0xc4,0x3d,0xf0,0xfb,0xd0,0x3d,0xee,0xeb,0x55,0x3e,0xc4,0x6c,0x26,0x3e,0x73,0xda,0xbc,0x3d,0xb1,0xb5,0xd7,0x3d,0xe9,0x7d,0xc2,0x3d,0xf6,0x4a,0x9c,0x3d,0x2f,0xa9,0x0c,0x3e,0x91,0xdd,0xac,0x3d,0x33,0x06,0xd6,0x3d,0xfa,0xa0,0xca,0x3d,0x91,0x9e,0x05,0x3e,0xc1,0xec,0xba,0x3d,0x3f,0x5b,0xba,0x3d,0x99,0x10,0xe3,0x3d,0xb1,0xa8,0xc8,0x3d,0xf9,0x76,0xc2,0x3d,0xeb,0x57,0xb2,0x3d,0xc7,0x3b,0xb9,0x3d,0x5a,0xe2,0xb1,0x3d,0x3e,0x1d,0xc3,0x3d,0x1d,0xfe,0xc0,0x3d,0xb4,0xc3,0x84,0x3e,0xed,0x53,0xc1,0x3d,0xc8,0xd6,0xeb,0x3d,0xbb,0x51,0xd1,0x3d,0x67,0xbf,0x6a,0x3e,0x37,0x2b,0x5a,0x3d,0x61,0x35,0xd2,0x3d,0x87,0x5f,0xfe,0x3d,0xfb,0xb4,0xd9,0x3d,0xd5,0x00,0x0b,0x3e,0x85,0x2c,0x9a,0x3d,0x05,0x39,0xf3,0x3d,0x5b,0x68,0x2b,0x3e,0x8b,0xc4,0x3c,0x3e,0x25,0x5e,0xbc,0x3d,0x22,0x5c,0x11,0x3e,0x3f,0x68,0x0f,0x3e,0x1f,0xc6,0xfd,0x3d,0x29,0x05,0x26,0x3e,0x45,0x7c,0xbe,0x3d,0x83,0x0d,0x01,0x3e,0x6e,0xf9,0xac,0x3d,0x62,0x6c,0x13,0x3e,0xf4,0xd3,0x21,0x3e,0x8e,0xf6,0x83,0x3e,0x49,0xf2,0xeb,0x3d,0x14,0xd8,0xb8,0x3d,0x4c,0x9e,0x05,0x3e,0xf7,0x0f,0x03,0x3e,0xd2,0x82,0x60,0x3e,0x9f,0x1a,0xef,0x3d,0x83,0x83,0x51,0x3e,0x39,0x4a,0xf0,0x3d,0xf7,0xbd,0xf4,0x3d,0x95,0xa8,0x01,0x3e,0x35,0xb5,0xb0,0x3d,0x9c,0x30,0xde,0x3d,0x9e,0xe4,0xbe,0x3d,0x57,0x7b,0xd3,0x3d,0x87,0x4e,0x84,0x3d,0xf4,0xa9,0x13,0x3e,0x1a,0xea,0xe0,0x3d,0xed,0x83,0xe6,0x3d,0x01,0x68,0xe6,0x3d,0x9c,0x1a,0xd5,0x3d,0x15,0x33,0x6c,0x3d,0x03,0xeb,0xe0,0x3d,0x5c,0x85,0x46,0x3e,0x31,0x91,0xd0,0x3d,0x60,0x00,0x00,0x00,0x33,0xe2,0xb7,0xbd,0xa5,0x34,0xa3,0xbd,0xe6,0x15,0x97,0xbd,0xee,0xc8,0xce,0xbd,0x1e,0xec,0xb9,0xbd,0x4d,0xab,0xe9,0xbd,0xfc,0x85,0xc0,0xbd,0x1f,0x18,0xb6,0xbd,0x36,0x8e,0xdc,0xbd,0x76,0x99,0x5e,0xbe,0x45,0x07,0x42,0xbe,0x9f,0x83,0x16,0xbe,0xa5,0x43,0x0b,0xbe,0x8c,0x97,0x11,0xbe,0xfb,0x27,0xc3,0xbd,0x31,0xe4,0xbf,0xbd,0xf4,0x6f,0xb2,0xbd,0x50,0x48,0x97,0xbd,0xdd,0x96,0x1b,0xbe,0x97,0x2a,0xc2,0xbd,0xaf,0x7a,0xa9,0xbd,0xe0,0xa1,0xd6,0xbd,0x4a,0x78,0xb3,0xbd,0x28,0x5f,0x30,0xbe,0x06,0x8c,0xaf,0xbd,0xff,0x9b,0xc7,0xbd,0x31,0x75,0x3e,0xbe,0x9a,0x50,0xdf,0xbd,0xe4,0x32,0x85,0xbd,0x3a,0x92,0x06,0xbe,0x6c,0x1d,0x7c,0xbd,0xa7,0x93,0xcb,0xbd,0xd7,0xe7,0x08,0xbe,0x5b,0x09,0xaf,0xbd,0x5b,0xc5,0x2f,0xbe,0xf7,0xeb,0xa1,0xbd,0x58,0xbe,0x2b,0xbe,0x56,0x8b,0x91,0xbd,0xeb,0x0f,0x0b,0xbe,0xcc,0x6b,0x66,0xbe,0x3d,0x94,0xb1,0xbd,0xe1,0xf9,0xc2,0xbd,0x8e,0xfe,0x98,0xbd,0xd9,0x5a,0xb7,0xbd,0x45,0xc6,0x6b,0xbd,0xee,0xb2,0xc8,0xbd,0x86,0x5a,0x88,0xbd,0x8e,0xf1,0x93,0xbe,0x7d,0x80,0xae,0xbd,0x38,0xea,0x9f,0xbd,0x94,0x2b,0xc5,0xbd,0x8c,0x45,0xd4,0xbd,0x97,0x45,0xed,0xbd,0xed,0x01,0x1c,0xbe,0x66,0x29,0xb2,0xbd,0xb5,0xe2,0xbd,0xbd,0x62,0xcc,0x12,0xbe,0xfa,0xcb,0xc5,0xbd,0xfe,0x81,0xd1,0xbd,0x25,0xb8,0x1f,0xbe,0x06,0xbc,0x1f,0xbe,0x79,0x23,0xd3,0xbd,0xc6,0x88,0xf4,0xbd,0x81,0x6b,0x26,0xbe,0x2f,0x9a,0x38,0xbe,0x74,0x33,0x0f,0xbe,0xd8,0x67,0xa3,0xbd,0x0d,0xd1,0x88,0xbd,0xec,0xcf,0xd7,0xbd,0x57,0x13,0xcf,0xbd,0xa4,0x6b,0x38,0xbe,0xee,0xbc,0xb9,0xbd,0x22,0xc0,0xbc,0xbd,0x37,0x20,0xa5,0xbd,0xfb,0x68,0x19,0xbe,0xa6,0x3e,0xff,0xbd,0xe4,0xff,0x07,0xbe,0x18,0x4d,0xb5,0xbd,0xf5,0x81,0x1b,0xbe,0x69,0x0e,0x80,0xbd,0x03,0x27,0x84,0xbe,0x88,0x53,0x1b,0xbe,0xba,0xd3,0xa5,0xbd,0x61,0x31,0xb1,0xbd,0xe8,0xe5,0x8b,0xbd,0x9f,0x71,0xc3,0xbd,0x3a,0xe2,0x73,0xbe,0x95,0x4e,0xc1,0xbd,0x90,0x37,0xce,0xbd,0xb3,0x54,0x92,0xbd,0x06,0x4f,0x9b,0xbd,0xbb,0xeb,0xc6,0xbd,0x0a,0x69,0x71,0xbe,0xd6,0x1b,0xd8,0xbd,0x9e,0xa7,0x5e,0xbe,0x17,0x3c,0x84,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0xc9,0xfe,0xff,0x00,0x00,0x00,0x09,0xdc,0x01,0x00,0x00,0x45,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0xc8,0xfe,0xff,0x1c,0x01,0x00,0x00,0xd4,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xa1,0x41,0xf2,0x3a,0x07,0x05,0x03,0x3b,0xa3,0x3a,0x10,0x3b,0x3c,0x66,0x46,0x3b,0x94,0x61,0x08,0x3b,0xc1,0x26,0xf0,0x3a,0x96,0x41,0x25,0x3b,0xa2,0x7f,0x51,0x3b,0xe1,0x09,0xbf,0x3a,0x3a,0x75,0xd5,0x3a,0x7d,0x4d,0xe2,0x3a,0xab,0xa4,0x40,0x3b,0x8b,0x98,0xb6,0x3a,0xb2,0xc9,0xb7,0x3a,0xd7,0xab,0x00,0x3b,0x56,0x2c,0x03,0x3b,0x10,0x00,0x00,0x00,0x1e,0x5d,0x70,0x3e,0x65,0x13,0x16,0x3e,0x43,0x4a,0x6b,0x3e,0x70,0xd9,0xc4,0x3e,0xd1,0x50,0x87,0x3e,0x21,0xc5,0x35,0x3e,0x01,0x36,0x99,0x3e,0xa3,0xdc,0xcf,0x3e,0xcd,0x8b,0x3d,0x3e,0x4b,0x82,0x2d,0x3e,0xe2,0x88,0x60,0x3e,0x54,0x79,0x7e,0x3e,0xd9,0x25,0x07,0x3e,0x8a,0x78,0x33,0x3e,0xe7,0x9c,0x52,0x3e,0x0c,0x2a,0x18,0x3e,0x10,0x00,0x00,0x00,0xe6,0x0a,0x11,0xbe,0xfd,0xfe,0x81,0xbe,0x2e,0x1a,0x8f,0xbe,0x90,0xbf,0x97,0xbe,0xd5,0xb2,0x5d,0xbe,0x73,0x46,0x6e,0xbe,0x13,0xf7,0xa3,0xbe,0x1b,0xbf,0xb6,0xbe,0x99,0x0c,0x34,0xbe,0x50,0xca,0x53,0xbe,0xac,0xf7,0x2c,0xbe,0x62,0x23,0xbf,0xbe,0x5a,0x2b,0x35,0xbe,0x1f,0x5a,0x36,0xbe,0xff,0x54,0x7f,0xbe,0xfd,0x25,0x82,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xfa,0xca,0xfe,0xff,0x00,0x00,0x00,0x09,0xfc,0x04,0x00,0x00,0x44,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0xca,0xfe,0xff,0x9c,0x03,0x00,0x00,0xb4,0x02,0x00,0x00,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x50,0x35,0x52,0x3a,0x96,0xc2,0x45,0x3a,0x35,0xd9,0x83,0x3a,0x7e,0x49,0x81,0x3a,0xe6,0x59,0x3c,0x3a,0xbc,0x34,0x61,0x3a,0x77,0xae,0x4d,0x3a,0x99,0x43,0x08,0x3a,0xe0,0x5f,0x1c,0x3a,0xd8,0x33,0x5e,0x3a,0x55,0x37,0xf2,0x39,0x59,0xed,0x30,0x3a,0xf7,0x8f,0x81,0x3a,0xf4,0xcc,0x01,0x3a,0xac,0xb1,0x66,0x3a,0x4d,0x31,0x57,0x3a,0xd7,0x36,0x63,0x3a,0x87,0x9f,0x61,0x3a,0x60,0x9a,0x29,0x3a,0x57,0x8b,0x6c,0x3a,0xcf,0x6d,0x2a,0x3a,0x76,0xd4,0x81,0x3a,0x1f,0xd8,0x18,0x3a,0xf6,0x4c,0x19,0x3a,0xe1,0x77,0x43,0x3a,0x76,0x7a,0x15,0x3a,0xcc,0xc2,0x04,0x3a,0x72,0xab,0x24,0x3a,0xc8,0xc3,0x54,0x3a,0x79,0xcf,0x5a,0x3a,0x66,0x2f,0x60,0x3a,0x6f,0x37,0x06,0x3a,0x69,0x99,0x02,0x3a,0xe2,0x97,0x1d,0x3b,0x8c,0x0c,0xfe,0x39,0x95,0xf2,0x7e,0x3a,0x9a,0x8c,0x42,0x3a,0x83,0x75,0x3d,0x3a,0xc6,0xe1,0xdb,0x3a,0x7d,0x70,0x7e,0x3a,0xc6,0x3e,0x19,0x3a,0x3f,0xcf,0x98,0x3a,0xbe,0x6b,0x05,0x3a,0xe5,0xb8,0x58,0x3a,0x93,0xd4,0x95,0x3a,0x78,0x96,0xe7,0x39,0x64,0x31,0xe0,0x39,0xfa,0x77,0x38,0x3a,0xc4,0xfc,0x58,0x3a,0x07,0x19,0x7f,0x3a,0xf1,0x84,0x3a,0x3a,0x69,0xf6,0xbc,0x3a,0xf0,0xdc,0xcd,0x39,0x7a,0xa8,0x77,0x3a,0xc1,0x00,0xac,0x3a,0xf6,0x07,0xb9,0x3a,0x38,0x00,0x00,0x00,0x9b,0x2a,0xc8,0x3d,0x60,0x17,0x71,0x3d,0x83,0xd1,0x02,0x3e,0xed,0xb0,0xf3,0x3d,0x32,0xe1,0xba,0x3d,0x53,0x72,0xdf,0x3d,0x83,0xdd,0xa0,0x3d,0x0f,0x15,0x7c,0x3d,0x88,0x3f,0x7f,0x3d,0xbf,0xaa,0xc4,0x3d,0xe6,0x52,0x70,0x3d,0x7e,0x8b,0xaf,0x3d,0xd7,0x8c,0x00,0x3e,0xbe,0xf3,0x71,0x3d,0x49,0xe4,0xe4,0x3d,0x00,0xef,0xd1,0x3d,0xb7,0x57,0xcf,0x3d,0x41,0x91,0xd5,0x3d,0xa6,0x0c,0x86,0x3d,0x40,0xb2,0xea,0x3d,0x20,0x00,0xa2,0x3d,0x29,0xa1,0xa7,0x3d,0xcd,0x2b,0x8c,0x3d,0x5c,0x1a,0x98,0x3d,0xf1,0xf0,0xc1,0x3d,0x6c,0x91,0x8f,0x3d,0x5e,0x8f,0x64,0x3d,0x1b,0x62,0xa3,0x3d,0x40,0x1a,0xd3,0x3d,0x06,0xeb,0xbd,0x3d,0x5f,0x3c,0xc9,0x3d,0x8c,0x04,0x3e,0x3d,0x2b,0x04,0x7d,0x3d,0xb2,0x5c,0x9c,0x3e,0x73,0x10,0x7c,0x3d,0x68,0xe4,0xb7,0x3d,0x0d,0x45,0x79,0x3d,0x98,0xfa,0xbb,0x3d,0x02,0x2a,0x5a,0x3e,0x9c,0x73,0xfc,0x3d,0x93,0x93,0x53,0x3d,0xa1,0x9d,0x17,0x3e,0xe7,0x60,0x84,0x3d,0x73,0x07,0xd7,0x3d,0xea,0xa8,0x14,0x3e,0x4b,0xc7,0x65,0x3d,0x54,0x61,0x51,0x3d,0x52,0x36,0xa5,0x3d,0xca,0x4a,0xd7,0x3d,0xd5,0x1a,0xfd,0x3d,0xe7,0x0f,0xb9,0x3d,0x6e,0xe3,0xfc,0x3d,0xbc,0xb1,0x38,0x3d,0x29,0xb9,0xf5,0x3d,0xbf,0xa8,0x2a,0x3e,0xa5,0x1f,0x33,0x3e,0x38,0x00,0x00,0x00,0xe5,0x90,0xd0,0xbd,0x11,0x37,0xc4,0xbd,0x50,0xb1,0x78,0xbd,0xeb,0x46,0x00,0xbe,0xbd,0x3e,0x85,0xbd,0x44,0xaf,0x85,0xbd,0x1a,0x13,0xcc,0xbd,0x12,0x33,0x87,0xbd,0x20,0x27,0x9b,0xbd,0x70,0x77,0xdc,0xbd,0xbd,0xc5,0x0c,0xbd,0xcd,0xd5,0x33,0xbd,0x4d,0xa8,0xd3,0xbd,0x5a,0xc9,0x80,0xbd,0x9a,0x80,0xac,0xbd,0xea,0x82,0xd5,0xbd,0x69,0x70,0xe1,0xbd,0x48,0xdc,0xdf,0xbd,0x2b,0x47,0xa8,0xbd,0xd4,0x3d,0x8f,0xbd,0xf3,0x18,0xa9,0xbd,0xcd,0xd0,0x00,0xbe,0x6f,0xa6,0x97,0xbd,0x79,0xb0,0x59,0xbd,0x58,0xe4,0x3b,0xbd,0x81,0x4f,0x94,0xbd,0x46,0xb9,0x83,0xbd,0x28,0x69,0x98,0xbd,0x78,0xb2,0xd2,0xbd,0xda,0x19,0xd9,0xbd,0x07,0x6f,0xde,0xbd,0x00,0x2b,0x85,0xbd,0x36,0x94,0x81,0xbd,0xf4,0x9a,0x30,0xbe,0x6c,0xd8,0x29,0xbd,0xb0,0xf4,0xfc,0xbd,0x81,0x07,0xc1,0xbd,0x80,0xba,0xb1,0xbd,0x94,0x18,0xbc,0xbd,0xb1,0x4e,0xf9,0xbd,0x48,0x0c,0x98,0xbd,0xaa,0x5c,0xcf,0xbd,0x17,0x00,0x26,0xbd,0x7f,0x40,0xbf,0xbd,0x36,0xea,0xd0,0xbd,0xe9,0x87,0x4e,0xbd,0x01,0x71,0x5e,0xbd,0x0a,0x07,0xb7,0xbd,0xab,0x17,0x98,0xbd,0xff,0xc8,0xd7,0xbd,0x52,0x85,0xae,0xbd,0x7c,0x7c,0x3b,0xbe,0x36,0x41,0x4c,0xbd,0xa5,0xba,0x65,0xbd,0xd6,0xec,0xc1,0xbd,0xe6,0x95,0x37,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x33,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x12,0xd0,0xfe,0xff,0x00,0x00,0x00,0x09,0xcc,0x02,0x00,0x00,0x43,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xd0,0xfe,0xff,0xdc,0x01,0x00,0x00,0x64,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xef,0xf7,0xef,0x3a,0x07,0x5c,0xc3,0x3a,0x72,0x2c,0x84,0x3a,0x87,0x46,0x80,0x3a,0x91,0xc1,0x1e,0x3a,0x21,0xa4,0x4d,0x3b,0xe1,0x0c,0xb5,0x3a,0xa8,0xad,0x8a,0x3a,0x53,0x81,0x76,0x3a,0x49,0xd3,0xf1,0x3a,0xd6,0x58,0x93,0x3a,0x3b,0x7a,0x3b,0x3a,0x5a,0xa0,0x14,0x3b,0xf4,0xee,0xc2,0x3a,0xbd,0xd5,0x1d,0x3b,0x05,0x0c,0x44,0x3b,0x0e,0x5a,0x0b,0x3b,0xa2,0x2e,0x53,0x3b,0xad,0x8c,0x70,0x3b,0x1c,0x43,0xe6,0x3a,0xeb,0xcb,0x08,0x3b,0x30,0xae,0xe8,0x3a,0x7c,0x60,0x92,0x3b,0xbe,0x4f,0x98,0x3a,0x5e,0xdf,0x8a,0x3a,0xbc,0x11,0xbe,0x3a,0x0e,0x30,0x39,0x3b,0x90,0xdf,0x06,0x3b,0x1c,0x00,0x00,0x00,0x4a,0x52,0x43,0x3e,0x4f,0xd5,0x41,0x3e,0x19,0x24,0x03,0x3e,0x2d,0x4f,0xe5,0x3d,0x0e,0x84,0x9d,0x3d,0x55,0xaa,0x1c,0x3e,0xc7,0xa2,0x33,0x3e,0x4d,0x98,0x09,0x3e,0x50,0x94,0xf4,0x3d,0xa2,0xef,0x6f,0x3e,0x24,0x32,0x12,0x3e,0x47,0x03,0xba,0x3d,0x19,0x77,0x93,0x3e,0x51,0xbf,0x16,0x3e,0x90,0x80,0x54,0x3e,0x64,0xf3,0x94,0x3e,0xd1,0x99,0x44,0x3e,0x45,0x88,0xd1,0x3e,0x94,0xab,0xee,0x3e,0xaa,0x05,0x24,0x3e,0x53,0xba,0x87,0x3e,0xd4,0xdc,0x66,0x3e,0x88,0xa7,0x25,0x3e,0x1f,0x1f,0x17,0x3e,0xaa,0xf9,0xeb,0x3d,0x98,0x3a,0x2f,0x3e,0xae,0xbd,0xb7,0x3e,0xd1,0xd1,0x85,0x3e,0x1c,0x00,0x00,0x00,0xff,0x17,0x6e,0xbe,0x02,0xaf,0x7f,0xbd,0xeb,0x79,0xfb,0xbd,0xf4,0x8b,0xfe,0xbd,0x43,0x58,0x80,0xbd,0xd9,0x08,0xcc,0xbe,0xbe,0x59,0x1d,0xbe,0x04,0xbe,0xc2,0xbd,0xfb,0xb0,0x92,0xbd,0x48,0x43,0x4f,0xbe,0x93,0x2c,0xfe,0xbd,0x25,0xf4,0xa4,0xbd,0xaa,0xcf,0x42,0xbe,0x16,0x69,0x41,0xbe,0x12,0x9a,0x9c,0xbe,0xed,0x83,0xc2,0xbe,0x5a,0x43,0x8a,0xbe,0xb8,0xec,0x92,0xbe,0xe5,0x29,0x77,0xbe,0x96,0x76,0x64,0xbe,0x05,0xf6,0x09,0xbe,0x97,0x82,0x64,0xbe,0xbb,0x3b,0x11,0xbf,0xd7,0x40,0x0f,0xbe,0x9f,0xc9,0x09,0xbe,0x99,0x95,0x3c,0xbe,0x8b,0xf5,0x2c,0xbe,0xe3,0x68,0x68,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xfa,0xd2,0xfe,0xff,0x00,0x00,0x00,0x09,0xfc,0x04,0x00,0x00,0x42,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0xd2,0xfe,0xff,0x9c,0x03,0x00,0x00,0xb4,0x02,0x00,0x00,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xb0,0x96,0x0f,0x3a,0xb1,0x65,0xcc,0x3a,0x37,0xa3,0x0a,0x3b,0x72,0xc3,0x64,0x3a,0x81,0x66,0xad,0x3a,0xab,0x9b,0x16,0x3a,0x0d,0xa9,0xa4,0x3a,0x2b,0x67,0xc0,0x3a,0x11,0x9b,0x5c,0x3a,0x3d,0x34,0x19,0x3a,0xf7,0x6c,0x48,0x3a,0x8e,0x3f,0x85,0x3a,0x96,0x78,0x0c,0x3b,0x79,0xc7,0x7c,0x3a,0xc8,0xde,0x07,0x3b,0xbd,0x21,0x9e,0x3a,0xb7,0x41,0xde,0x3a,0x8e,0xb5,0x57,0x3a,0x51,0x4c,0x27,0x3a,0x1c,0xc6,0x5e,0x3a,0x32,0xcd,0x36,0x3a,0x14,0x38,0x0a,0x3a,0xe1,0x75,0xd2,0x3a,0x29,0xbe,0x58,0x3a,0x55,0x64,0x48,0x3a,0x82,0xbe,0x45,0x3a,0xca,0xa2,0x42,0x3b,0x4b,0x79,0x52,0x3a,0x7a,0x15,0x84,0x3a,0x39,0xe2,0x49,0x3a,0x75,0x56,0x89,0x3a,0x46,0x38,0x03,0x3b,0xc2,0xea,0xa2,0x3a,0x7d,0x80,0x87,0x3a,0x2f,0x82,0x5e,0x3a,0x92,0x74,0xf3,0x3a,0xc6,0x23,0x3a,0x3a,0x8c,0xb6,0x79,0x3a,0x1b,0x43,0x4e,0x3a,0x77,0x9d,0xef,0x39,0xb7,0x24,0xfd,0x39,0x0f,0xc9,0x12,0x3a,0xab,0xd8,0x97,0x3a,0x98,0x28,0x6c,0x3a,0x6a,0xd1,0xda,0x3a,0x94,0x67,0x8c,0x3a,0x79,0x8e,0x93,0x3a,0x6d,0x69,0x34,0x3b,0x7f,0xcf,0xf1,0x39,0x39,0xff,0x59,0x3a,0x3c,0x8d,0x31,0x3a,0x03,0x4a,0x90,0x3a,0xa4,0x38,0xc2,0x3a,0xfb,0x69,0x15,0x3a,0x3d,0x07,0x3d,0x3a,0xf7,0x4e,0x12,0x3a,0x38,0x00,0x00,0x00,0x83,0x77,0x8e,0x3d,0xe6,0xcc,0x4a,0x3e,0xf1,0x8d,0x89,0x3e,0xac,0xae,0xc9,0x3d,0x13,0x83,0x11,0x3e,0x74,0x6e,0x95,0x3d,0xf6,0x0b,0xa4,0x3d,0x5d,0xe6,0x3e,0x3e,0xdb,0xe1,0xda,0x3d,0x5d,0x54,0x80,0x3d,0x1d,0xdc,0xc6,0x3d,0x36,0x2d,0xcc,0x3d,0x73,0xc2,0xa1,0x3d,0x52,0x80,0xe7,0x3d,0x0a,0xcf,0x86,0x3e,0xb0,0xcc,0xbf,0x3d,0x34,0x85,0x5c,0x3e,0x23,0x06,0xd6,0x3d,0xb8,0xfd,0xa5,0x3d,0x90,0x08,0xdd,0x3d,0x72,0xd8,0x9c,0x3d,0xa4,0x23,0x89,0x3d,0xf5,0xd0,0x50,0x3e,0x75,0x67,0xbc,0x3d,0x8c,0xd3,0xc6,0x3d,0xf5,0x57,0xae,0x3d,0x84,0x1d,0xc1,0x3e,0xea,0x81,0xc4,0x3d,0x59,0xde,0xed,0x3d,0x73,0xde,0x90,0x3d,0x9e,0x7a,0x03,0x3e,0xd5,0x31,0x82,0x3e,0xec,0xa4,0x21,0x3e,0x7c,0x71,0x06,0x3e,0x2b,0xc5,0xdc,0x3d,0xa9,0x8d,0x71,0x3e,0x52,0x5b,0x5c,0x3d,0x9c,0xac,0xa5,0x3d,0xde,0x82,0x80,0x3d,0x3c,0xbe,0x6d,0x3d,0x47,0x89,0x7a,0x3d,0x1f,0x03,0x89,0x3d,0x80,0xd4,0xdd,0x3d,0xad,0xcd,0x9d,0x3d,0xd7,0x80,0xeb,0x3d,0xc5,0x4e,0x0b,0x3e,0x5c,0x67,0x12,0x3e,0x9a,0x00,0xb3,0x3e,0xe0,0xeb,0x6f,0x3d,0x3b,0x4b,0xd8,0x3d,0x22,0x2a,0xb0,0x3d,0x48,0x91,0x04,0x3e,0x5b,0x98,0x22,0x3e,0x27,0x3f,0x94,0x3d,0x8f,0x07,0x33,0x3d,0xbc,0x61,0x89,0x3d,0x38,0x00,0x00,0x00,0x01,0x62,0x6c,0xbd,0x49,0x21,0x34,0xbe,0x15,0xdd,0xd2,0xbd,0xeb,0xf9,0xe2,0xbd,0xb4,0x0b,0x2c,0xbe,0x54,0x23,0x80,0xbd,0xbb,0x5f,0x23,0xbe,0x6f,0x7c,0xd3,0xbd,0xf7,0x3a,0xcf,0xbd,0xd5,0x01,0x98,0xbd,0xc0,0xc0,0xa1,0xbd,0x0f,0x35,0x04,0xbe,0xa5,0x5f,0x8b,0xbe,0xea,0xcd,0xfa,0xbd,0xa9,0x7e,0x81,0xbe,0x7a,0xe5,0x1c,0xbe,0xdf,0x78,0x22,0xbe,0x09,0xef,0x8b,0xbd,0x94,0xcb,0x6c,0xbd,0x58,0xaa,0xbf,0xbd,0x98,0x5f,0xb5,0xbd,0x17,0x59,0x72,0xbd,0xea,0x55,0x0b,0xbe,0xad,0x0c,0xd7,0xbd,0x93,0x05,0x80,0xbd,0x05,0x33,0xc4,0xbd,0xbb,0x2d,0x98,0xbe,0x58,0xd4,0xd0,0xbd,0x4f,0x0d,0x03,0xbe,0x75,0x4e,0xc8,0xbd,0xc8,0x43,0x08,0xbe,0x63,0x18,0xed,0xbd,0x89,0xd6,0xac,0xbd,0x86,0xa6,0x05,0xbe,0x66,0x62,0x8c,0xbd,0x81,0x18,0x09,0xbe,0x7e,0xaf,0xb8,0xbd,0x1f,0xc3,0xf7,0xbd,0x95,0xa6,0xcc,0xbd,0x4f,0x79,0x4b,0xbd,0x6e,0x2a,0x7b,0xbd,0x7d,0xa3,0x91,0xbd,0xfa,0xa8,0x16,0xbe,0x47,0x50,0xea,0xbd,0xc7,0x1b,0x59,0xbe,0x02,0x02,0xe3,0xbd,0xec,0x14,0xcb,0xbd,0xaf,0x3a,0x1a,0xbe,0xc4,0x52,0x40,0xbd,0xbb,0xc8,0x53,0xbd,0x13,0x67,0x1c,0xbd,0x6f,0x29,0x0f,0xbe,0x33,0xb4,0x40,0xbe,0x04,0xa5,0x28,0xbd,0x2f,0x8d,0xbb,0xbd,0x59,0x2a,0x91,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x12,0xd8,0xfe,0xff,0x00,0x00,0x00,0x09,0xcc,0x02,0x00,0x00,0x41,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xd8,0xfe,0xff,0xdc,0x01,0x00,0x00,0x64,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x31,0x5c,0x68,0x3b,0xf0,0x06,0x98,0x3a,0xa6,0xac,0x01,0x3b,0xbe,0x74,0x8b,0x3a,0xc9,0xf9,0x89,0x3a,0x7a,0xc4,0x3f,0x3b,0x5c,0xb2,0xd2,0x3a,0x38,0x12,0x93,0x3a,0x68,0xa4,0x00,0x3b,0xc4,0xe7,0x91,0x3b,0x48,0x34,0x19,0x3b,0x7e,0xde,0xc9,0x3a,0xd8,0xae,0xc7,0x3b,0x53,0x6b,0xa4,0x3a,0x1c,0xfd,0x06,0x3b,0x52,0x1d,0x02,0x3b,0x90,0x74,0x0b,0x3b,0x79,0x7d,0x66,0x3b,0x95,0x11,0xf2,0x3a,0x29,0x6a,0xba,0x3b,0x8c,0x45,0x13,0x3b,0x44,0xb8,0x1b,0x3b,0xd1,0xd6,0x17,0x3b,0x3d,0xdf,0xeb,0x3a,0x0d,0x16,0x0f,0x3b,0xa5,0xf1,0xab,0x3a,0x0b,0x76,0x54,0x3b,0xee,0x52,0x2e,0x3b,0x1c,0x00,0x00,0x00,0x72,0x1a,0x8d,0x3e,0xe2,0xd6,0x16,0x3e,0x4d,0xa9,0x80,0x3e,0xb9,0x8a,0xcb,0x3d,0xd5,0xe5,0x08,0x3e,0xf1,0x44,0xbe,0x3e,0xf7,0x0c,0x51,0x3e,0xbf,0x4c,0x0b,0x3e,0x45,0x6f,0xc4,0x3d,0xbb,0x14,0x83,0x3e,0xdf,0x01,0x98,0x3e,0xc1,0x4a,0x48,0x3e,0x04,0x2e,0xbc,0x3e,0x65,0x5f,0x1f,0x3e,0x5c,0xe3,0x43,0x3e,0x92,0xc7,0x59,0x3e,0x97,0xe2,0x87,0x3e,0x7e,0xb0,0xe4,0x3e,0xcd,0xba,0x2a,0x3e,0x24,0xb6,0xa8,0x3e,0x83,0x5a,0x52,0x3e,0x32,0x54,0x61,0x3e,0x23,0xa7,0x96,0x3e,0x7f,0x07,0x6a,0x3e,0xe1,0xf7,0x8d,0x3e,0xc2,0x99,0x2a,0x3e,0x60,0x64,0xc8,0x3e,0x48,0xf6,0xac,0x3e,0x1c,0x00,0x00,0x00,0x79,0x8b,0xe6,0xbe,0x1b,0x4e,0xcd,0xbd,0x12,0xe8,0x01,0xbe,0xd5,0x5d,0x0a,0xbe,0xf5,0xab,0xa1,0xbd,0xaa,0x0e,0x76,0xbe,0xa3,0xb3,0x89,0xbd,0x14,0xec,0x11,0xbe,0x3e,0x46,0x7f,0xbe,0xf4,0xc3,0x10,0xbf,0x95,0xce,0x4f,0xbe,0xd1,0xfb,0xd7,0xbd,0x7a,0x1f,0x46,0xbf,0x7c,0x22,0x23,0xbe,0x22,0xef,0x85,0xbe,0x17,0x19,0x81,0xbe,0xa7,0x5d,0x8a,0xbe,0xd4,0x03,0x64,0xbe,0x72,0x2d,0x70,0xbe,0x55,0xf5,0x38,0xbf,0x01,0x1f,0x92,0xbe,0xd3,0x80,0x9a,0xbe,0xa6,0x53,0x26,0xbe,0x66,0x75,0x1d,0xbe,0xf0,0x23,0x3f,0xbe,0xae,0x36,0x1a,0xbe,0x1f,0xcd,0xd2,0xbe,0xcd,0xce,0x7f,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xfa,0xda,0xfe,0xff,0x00,0x00,0x00,0x09,0xfc,0x04,0x00,0x00,0x40,0x00,0x00,0x00,0x8c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0xec,0xda,0xfe,0xff,0x9c,0x03,0x00,0x00,0xb4,0x02,0x00,0x00,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x72,0x41,0x8c,0x3a,0x02,0x8b,0x65,0x3a,0x38,0xf5,0x12,0x3b,0x59,0x2f,0xb2,0x3a,0x00,0x05,0x0a,0x3b,0x60,0x05,0xbf,0x3a,0x2e,0xfd,0x79,0x3a,0x2c,0x88,0xb7,0x3a,0x9f,0xba,0x54,0x3b,0x2c,0x8b,0x40,0x3a,0x39,0xd8,0x27,0x3b,0xe2,0x03,0x27,0x3b,0xa5,0xb4,0x3c,0x3b,0x62,0xb7,0xae,0x3a,0x6a,0x45,0x1f,0x3b,0xd8,0x9b,0xa7,0x3a,0x21,0xd2,0x5d,0x3a,0x97,0x70,0xb7,0x3a,0xb2,0x70,0xa7,0x3a,0xf4,0x64,0xca,0x3a,0x9f,0x49,0xc3,0x3a,0x3e,0x6e,0xaa,0x3a,0xe2,0xc5,0xec,0x3a,0x14,0x2b,0xe0,0x3a,0xf6,0x30,0xe8,0x3a,0x28,0xab,0x4c,0x3a,0xa6,0x37,0xd3,0x3a,0xa6,0x0e,0x2b,0x3b,0xbc,0x87,0x0a,0x3b,0x83,0xf8,0x34,0x3b,0xdc,0x38,0x9a,0x3a,0x87,0xe1,0x31,0x3b,0x4d,0x9b,0xd0,0x3a,0xfd,0x6d,0xb8,0x3a,0xc1,0x0b,0x55,0x3a,0x95,0x1a,0xe4,0x3a,0x17,0x92,0x82,0x3a,0xaf,0xa4,0xb2,0x3a,0x10,0x86,0x86,0x3a,0x26,0xb2,0x8f,0x3a,0xc4,0xf9,0x19,0x3b,0x58,0x9e,0x0f,0x3b,0xd5,0x26,0x09,0x3b,0xf9,0x42,0x4c,0x3a,0x4d,0x84,0x6e,0x3a,0x6d,0x18,0x9f,0x3a,0xe5,0xc8,0x55,0x3b,0x5c,0xc3,0xa6,0x3a,0xbf,0x89,0xcb,0x3a,0x64,0x73,0x0e,0x3b,0x32,0x8a,0x2e,0x3b,0x55,0xdc,0x03,0x3b,0x7a,0xe7,0x98,0x3a,0x12,0xf4,0xb6,0x3a,0xe0,0xe7,0xc5,0x3a,0xa6,0xac,0x94,0x3a,0x38,0x00,0x00,0x00,0xef,0x28,0x0b,0x3e,0xec,0xbf,0xe3,0x3d,0xd2,0x33,0x3b,0x3e,0x9d,0x59,0xdb,0x3d,0x12,0x9d,0x26,0x3e,0x55,0x87,0x3d,0x3e,0x34,0x09,0xf8,0x3d,0x1c,0x19,0x36,0x3e,0xcd,0x79,0xd2,0x3d,0x16,0x0a,0xbf,0x3d,0x89,0x88,0xa6,0x3e,0xdb,0xed,0xe5,0x3d,0x3c,0x3b,0xbb,0x3e,0xf3,0x59,0x2d,0x3e,0xdf,0x06,0x9e,0x3e,0x72,0xec,0x09,0x3e,0x5b,0x52,0xda,0x3d,0xb6,0x01,0x36,0x3e,0xee,0x93,0x08,0x3e,0x2a,0xd0,0x48,0x3e,0x0c,0xc3,0x41,0x3e,0x62,0x19,0x29,0x3e,0xcc,0xca,0x09,0x3e,0xbe,0x6a,0x5e,0x3e,0x00,0xe3,0x1f,0x3e,0xd2,0x11,0xcb,0x3d,0x37,0x91,0x51,0x3e,0x9e,0xb8,0x20,0x3e,0xad,0x72,0x89,0x3e,0x92,0x8e,0xb3,0x3e,0x6a,0x04,0x19,0x3e,0xc4,0x7d,0xb0,0x3e,0x16,0xfa,0x4e,0x3e,0x34,0x29,0x00,0x3e,0x79,0xec,0x88,0x3d,0x49,0x2e,0x30,0x3e,0xf3,0x8c,0x01,0x3e,0x66,0x3f,0x31,0x3e,0x87,0x80,0xf9,0x3d,0x55,0xa5,0x08,0x3e,0x25,0x94,0x88,0x3e,0x1b,0x7f,0x8e,0x3e,0x83,0x3c,0xcd,0x3d,0x73,0xaa,0xca,0x3d,0xd1,0xb1,0xac,0x3d,0x82,0x0e,0x17,0x3e,0xf4,0x64,0x6e,0x3e,0xd5,0x75,0x25,0x3e,0xac,0xf2,0x49,0x3e,0x65,0x2d,0x80,0x3e,0x1e,0x2d,0xad,0x3e,0xd4,0x70,0xf8,0x3d,0xce,0x7a,0xc1,0x3d,0x2a,0x86,0x35,0x3e,0x8a,0x66,0x01,0x3e,0x4d,0x83,0x13,0x3e,0x38,0x00,0x00,0x00,0x25,0xdf,0xf0,0xbd,0x5e,0x66,0x9c,0xbd,0x4e,0xcf,0x91,0xbe,0xfa,0xca,0x30,0xbe,0xf6,0xf0,0x88,0xbe,0xe3,0x23,0xd1,0xbd,0x75,0x51,0xf0,0xbd,0x65,0xb8,0x10,0xbe,0x2a,0x11,0xd3,0xbe,0x86,0x20,0x9a,0xbd,0x7a,0xa2,0x7f,0xbe,0xda,0xb5,0xa5,0xbe,0x23,0x27,0xa0,0xbe,0x90,0xea,0xfe,0xbd,0xbb,0x4f,0x2c,0xbe,0xa0,0x4c,0x26,0xbe,0x7d,0x16,0xdc,0xbd,0x49,0x8f,0x0d,0xbe,0xd1,0x21,0x26,0xbe,0x3d,0xdc,0xf7,0xbd,0x44,0xc6,0xfc,0xbd,0x93,0xc4,0xe1,0xbd,0x56,0xec,0x6a,0xbe,0x4d,0x7f,0x2b,0xbe,0x94,0x60,0x66,0xbe,0xe2,0xf1,0xa8,0xbd,0x4e,0x53,0x16,0xbe,0x89,0xb8,0xa9,0xbe,0x7f,0xcb,0x02,0xbe,0x60,0x39,0x72,0xbe,0x3b,0xe1,0xf2,0xbd,0x42,0xc5,0xdb,0xbd,0xfc,0xb5,0x1e,0xbe,0x21,0xfd,0x36,0xbe,0xa9,0x61,0xd3,0xbd,0x60,0x52,0x62,0xbe,0x55,0x45,0x99,0xbd,0x24,0x0c,0x08,0xbe,0x04,0x79,0x05,0xbe,0xc2,0x92,0x0e,0xbe,0xd0,0xc5,0x98,0xbe,0xad,0x6e,0x2b,0xbe,0x87,0x14,0x88,0xbe,0x8b,0x35,0x66,0xbd,0x44,0xa7,0xec,0xbd,0x3c,0xda,0x1d,0xbe,0x53,0x1d,0xd4,0xbe,0x12,0x6d,0x0c,0xbe,0xf9,0x5f,0x46,0xbe,0x7d,0x56,0x8d,0xbe,0xcd,0xa2,0x93,0xbe,0x9c,0xd4,0x82,0xbe,0xab,0xb5,0x17,0xbe,0x1a,0xc9,0x08,0xbe,0x10,0x5c,0x44,0xbe,0x58,0x52,0xfe,0xbd,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x12,0xe0,0xfe,0xff,0x00,0x00,0x00,0x09,0xdc,0x01,0x00,0x00,0x3f,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xe0,0xfe,0xff,0x1c,0x01,0x00,0x00,0xd4,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x47,0x7c,0x97,0x3b,0xb2,0xb1,0x19,0x3b,0x7d,0x41,0x3a,0x3b,0xc2,0x20,0x06,0x3b,0x01,0x07,0x50,0x3b,0xe0,0x29,0x74,0x3b,0x80,0xc0,0x0f,0x3b,0xb9,0x20,0x1c,0x3b,0xc7,0x5b,0x2b,0x3b,0xb8,0x54,0x75,0x3b,0x3c,0x69,0x9a,0x3b,0x68,0x07,0x22,0x3b,0xfa,0xe2,0x8c,0x3b,0xe3,0x0c,0x82,0x3b,0x70,0x46,0x21,0x3b,0x4c,0x8b,0x05,0x3b,0x10,0x00,0x00,0x00,0x4e,0x4d,0x16,0x3f,0x4f,0x7e,0x98,0x3e,0x58,0x50,0x8c,0x3e,0x80,0x14,0x85,0x3e,0x04,0x4a,0xb0,0x3e,0x55,0xc6,0xdc,0x3e,0xff,0xa0,0x8e,0x3e,0x78,0xe8,0x9a,0x3e,0x0f,0x05,0xaa,0x3e,0x93,0x3e,0xec,0x3e,0x90,0x43,0x04,0x3f,0x68,0x18,0x9e,0x3e,0x34,0xc9,0x0b,0x3f,0xc9,0x08,0x01,0x3f,0x26,0xfd,0x4c,0x3e,0x35,0x80,0x84,0x3e,0x10,0x00,0x00,0x00,0xa3,0x04,0xd3,0xbe,0x0b,0xf0,0x5e,0xbe,0xfa,0xcc,0xb8,0xbe,0x0b,0x2d,0x29,0xbe,0xf3,0x66,0xce,0xbe,0x8c,0x41,0xf2,0xbe,0xea,0x24,0x67,0xbe,0xd1,0x40,0x64,0xbe,0xba,0xbe,0x89,0xbe,0x0f,0x6a,0xf3,0xbe,0x6a,0x34,0x19,0xbf,0x59,0xc3,0xa0,0xbe,0xcc,0xfe,0xd5,0xbe,0x9d,0xfc,0xe7,0xbe,0xe3,0x03,0xa0,0xbe,0x19,0xb1,0x65,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x0a,0xe2,0xfe,0xff,0x00,0x00,0x00,0x09,0x8c,0x06,0x00,0x00,0x3e,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xfc,0xe1,0xfe,0xff,0xdc,0x04,0x00,0x00,0xa4,0x03,0x00,0x00,0x6c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x72,0x2b,0xb7,0x3a,0x65,0xef,0x89,0x3a,0x64,0x6b,0x88,0x3a,0x8e,0x80,0x80,0x3a,0xb5,0x2b,0xa9,0x3a,0x81,0x06,0xe6,0x3a,0x83,0x7b,0x89,0x3a,0x4d,0x36,0x6a,0x3a,0x64,0x95,0x53,0x3a,0xa6,0xbc,0x96,0x3a,0xfe,0xf0,0x96,0x3a,0xb4,0x02,0xa3,0x3a,0xd4,0xe0,0xb1,0x3a,0x3a,0xb0,0x81,0x3a,0x80,0x03,0xb0,0x3a,0x5d,0xba,0x78,0x3a,0x30,0x0d,0x83,0x3a,0x79,0x64,0x85,0x3a,0x8e,0xf5,0xbb,0x3a,0x5b,0x54,0x8e,0x3a,0x3d,0x15,0x78,0x3a,0xf1,0x4b,0x5c,0x3a,0xf3,0x15,0x82,0x3a,0x95,0x2c,0x86,0x3a,0x48,0x2f,0xd9,0x3a,0xd7,0xcd,0xb8,0x3a,0x96,0x0a,0xbe,0x3a,0x8c,0x03,0x61,0x3a,0xf1,0xb3,0x6c,0x3a,0x09,0x8d,0xd6,0x3a,0x4c,0x76,0xbb,0x3a,0x1d,0x7e,0x97,0x3a,0x25,0xfb,0x92,0x3a,0x24,0xf4,0xbd,0x3a,0x80,0xe8,0x5f,0x3a,0x70,0x9a,0x87,0x3a,0xa0,0x46,0x43,0x3a,0xbb,0x85,0x7f,0x3a,0x4b,0x4a,0xa1,0x3a,0x4d,0x9f,0x96,0x3a,0x73,0xa8,0x82,0x3a,0xdd,0xea,0x6c,0x3a,0xd4,0x88,0xde,0x3a,0x3c,0x6b,0xa1,0x3a,0xd0,0x4b,0x8a,0x3a,0xed,0xde,0x8e,0x3a,0x67,0x3c,0x8e,0x3a,0x62,0x0b,0x9a,0x3a,0x68,0x4d,0x71,0x3a,0x8f,0x3b,0x8c,0x3a,0x68,0x7e,0x5d,0x3a,0xeb,0xf8,0x4f,0x3a,0x23,0x8b,0x85,0x3a,0x68,0x86,0xb5,0x3a,0xa1,0xb6,0x88,0x3a,0xd2,0x00,0x6c,0x3a,0x38,0xc9,0x6b,0x3a,0x23,0x16,0x87,0x3a,0xae,0xb9,0xa2,0x3a,0x7f,0x64,0x43,0x3a,0x9c,0xb5,0xf0,0x3a,0xbd,0xac,0x92,0x3a,0xbf,0xb6,0x8d,0x3a,0x69,0xa4,0x9a,0x3a,0x08,0xeb,0x95,0x3a,0xd8,0x8c,0xdc,0x3a,0xd5,0xc9,0x94,0x3a,0x2d,0xc6,0x3a,0x3a,0xfc,0x67,0xa5,0x3a,0x1d,0xdd,0x99,0x3a,0x3d,0xd6,0x87,0x3a,0x50,0xbe,0x9b,0x3a,0x80,0x80,0x69,0x3a,0x94,0x09,0x56,0x3a,0x7f,0x07,0x7b,0x3a,0xd0,0xe8,0x97,0x3a,0x4c,0x00,0x00,0x00,0x1b,0xbd,0x35,0x3e,0xe6,0xec,0xf4,0x3d,0xd2,0x25,0xbb,0x3d,0x07,0x6e,0xd5,0x3d,0x5e,0xd9,0x27,0x3e,0x74,0x3a,0x64,0x3e,0xc1,0x9e,0xe7,0x3d,0xe0,0x61,0xe8,0x3d,0x2e,0x2a,0xcd,0x3d,0xa2,0x75,0x08,0x3e,0x97,0x43,0xa4,0x3d,0xaf,0xbc,0x21,0x3e,0x50,0x12,0x15,0x3e,0x3a,0xcc,0x88,0x3d,0x87,0xb8,0x1e,0x3e,0xea,0xfe,0xbf,0x3d,0x1c,0x36,0xea,0x3d,0x7a,0x15,0x01,0x3e,0xa3,0x7d,0x3a,0x3e,0xb2,0x37,0x0d,0x3e,0xaa,0x62,0xa1,0x3d,0x59,0x93,0xda,0x3d,0xb2,0x90,0xd0,0x3d,0x52,0x0d,0x93,0x3d,0xe9,0x7c,0x57,0x3e,0x91,0xb0,0xba,0x3d,0x81,0x8e,0x3c,0x3e,0xc9,0xbf,0xcc,0x3d,0xab,0x57,0xa5,0x3d,0xef,0xdf,0x54,0x3e,0xcd,0xed,0x09,0x3e,0x21,0x4f,0x16,0x3e,0x8e,0xb6,0xc0,0x3d,0x3c,0x78,0x3c,0x3e,0xee,0x8e,0xc4,0x3d,0x1a,0x4a,0xc9,0x3d,0xb3,0x2e,0x85,0x3d,0xd9,0xad,0x9d,0x3d,0x39,0x88,0xbb,0x3d,0x05,0x0f,0x01,0x3e,0x98,0x12,0xd2,0x3d,0x12,0xe1,0xe1,0x3d,0xc2,0xcb,0x5c,0x3e,0x66,0x28,0x20,0x3e,0x38,0x37,0x09,0x3e,0xeb,0xab,0x04,0x3e,0xee,0x1f,0x0d,0x3e,0x84,0x14,0x9c,0x3d,0xcd,0x6a,0xef,0x3d,0x18,0x23,0x0b,0x3e,0x6b,0xc3,0xdb,0x3d,0x67,0xc9,0xb5,0x3d,0x0d,0x80,0x04,0x3e,0x5b,0x1b,0x34,0x3e,0x0e,0xe3,0x96,0x3d,0xf0,0x8a,0x9f,0x3d,0xa6,0xf1,0xe9,0x3d,0xf7,0x07,0x06,0x3e,0xc0,0xa3,0xb9,0x3d,0xb6,0xdd,0xc1,0x3d,0x31,0xd4,0x6e,0x3e,0x05,0x7b,0xa5,0x3d,0x52,0x9b,0x0c,0x3e,0x20,0x6f,0x19,0x3e,0xb4,0x4c,0xc6,0x3d,0xbe,0xd3,0x5a,0x3e,0xa6,0x07,0x13,0x3e,0xcc,0x8d,0xa5,0x3d,0x53,0x7e,0x8a,0x3d,0x63,0xa9,0x18,0x3e,0x91,0xc6,0x06,0x3e,0xb9,0x69,0xe6,0x3d,0x02,0xe3,0xe3,0x3d,0x81,0x5d,0xd4,0x3d,0x70,0x11,0xf9,0x3d,0x14,0x8b,0xd0,0x3d,0x4c,0x00,0x00,0x00,0x73,0x88,0x1a,0xbe,0x86,0xdb,0x08,0xbe,0x8d,0x5a,0x07,0xbe,0x1a,0xff,0xfe,0xbd,0x01,0x34,0xc6,0xbd,0x09,0xa1,0x24,0xbe,0x8c,0x68,0x08,0xbe,0x55,0xdc,0xba,0xbd,0x39,0xee,0xd1,0xbd,0x2d,0x8f,0x15,0xbe,0x1c,0xc3,0x15,0xbe,0x05,0xf4,0xef,0xbd,0x12,0x7d,0x30,0xbe,0xda,0xac,0x00,0xbe,0x79,0xa3,0x2e,0xbe,0xe8,0xc8,0xf6,0xbd,0x16,0x07,0x02,0xbe,0xb0,0x59,0x04,0xbe,0x58,0xe7,0xaf,0xbd,0x3a,0x1a,0xca,0xbd,0x13,0x25,0xf6,0xbd,0x34,0x9c,0x9b,0xbd,0xc7,0x11,0x01,0xbe,0x3c,0x20,0x05,0xbe,0xc3,0x13,0x02,0xbe,0x3b,0x5c,0x37,0xbe,0x6b,0x74,0x36,0xbe,0x85,0x41,0xdf,0xbd,0x89,0xda,0xea,0xbd,0x21,0x63,0xf3,0xbd,0x5f,0xff,0x39,0xbe,0x67,0x93,0x0f,0xbe,0x2f,0xd5,0x11,0xbe,0x95,0x9b,0x20,0xbe,0xaf,0x28,0xde,0xbd,0x3b,0x8b,0x06,0xbe,0x13,0xc0,0xc1,0xbd,0xb0,0x86,0xfd,0xbd,0xb6,0x07,0x20,0xbe,0x0e,0x72,0x15,0xbe,0x22,0xa3,0x01,0xbe,0x07,0x11,0xeb,0xbd,0x9b,0x75,0xfb,0xbd,0xfb,0xbf,0xcc,0xbd,0xb9,0x21,0xcb,0xbd,0x2f,0xc1,0x0d,0xbe,0xec,0x1d,0xf9,0xbd,0x4b,0xd7,0x18,0xbe,0xe1,0xd2,0xd5,0xbd,0x67,0xb3,0x07,0xbe,0xf9,0x3f,0xbf,0xbd,0xf9,0x58,0xce,0xbd,0xca,0x9c,0xd2,0xbd,0x22,0x2b,0xc9,0xbd,0x34,0xa5,0x07,0xbe,0xd0,0x28,0xea,0xbd,0x3e,0x65,0xa6,0xbd,0xfd,0x7b,0xf8,0xbd,0x3b,0x74,0x21,0xbe,0x6c,0x31,0xbb,0xbd,0x97,0xa4,0x01,0xbe,0x64,0x87,0x11,0xbe,0x81,0xb1,0xa4,0xbd,0x6a,0x0a,0xff,0xbd,0x32,0xbf,0x14,0xbe,0xa6,0xc6,0xd7,0xbd,0x41,0xa0,0x13,0xbe,0xa1,0x50,0xb9,0xbd,0x2c,0x1d,0x24,0xbe,0x44,0x5a,0xea,0xbd,0xa2,0x9a,0xbd,0xbd,0xd3,0x86,0x1a,0xbe,0x7f,0xad,0xe7,0xbd,0xbe,0x71,0xb2,0xbd,0x4f,0xca,0xe4,0xbd,0xfe,0xb8,0x16,0xbe,0x61,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xb2,0xe8,0xfe,0xff,0x00,0x00,0x00,0x09,0x1c,0x03,0x00,0x00,0x3d,0x00,0x00,0x00,0xac,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xa4,0xe8,0xfe,0xff,0x1c,0x02,0x00,0x00,0x94,0x01,0x00,0x00,0x0c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x9e,0xbf,0xa3,0x3b,0xef,0xc9,0x49,0x3b,0x26,0x8e,0x66,0x3b,0x2d,0xe7,0x97,0x3b,0x9d,0x24,0x8a,0x3b,0xac,0x5b,0x61,0x3b,0xad,0x78,0x6f,0x3b,0xd0,0x2d,0x7c,0x3b,0x79,0x80,0x37,0x3b,0x1c,0x69,0xd2,0x3a,0xf8,0xb0,0x35,0x3b,0xf7,0xc2,0xe4,0x3b,0x84,0x59,0x9b,0x3b,0x5a,0x3c,0x76,0x3b,0x58,0x7c,0xd8,0x3a,0x5c,0xaf,0x45,0x3b,0xc4,0x8b,0xa6,0x3a,0x7c,0xf2,0xaa,0x3b,0x8c,0xfe,0x34,0x3b,0x2d,0xda,0x0b,0x3b,0xc8,0x3e,0x4d,0x3b,0xee,0x52,0x64,0x3b,0x06,0x58,0x22,0x3b,0xb2,0xe5,0x21,0x3b,0x68,0xe6,0x07,0x3c,0xd7,0x6f,0x62,0x3b,0x8e,0xfe,0x9d,0x3b,0x45,0x3c,0x94,0x3b,0x7e,0x93,0x84,0x3b,0x82,0xee,0x5c,0x3b,0x9c,0xd7,0x6f,0x3b,0x56,0x71,0xa3,0x3b,0x20,0x00,0x00,0x00,0x1f,0x78,0x22,0x3f,0x5b,0x36,0xc8,0x3e,0xf4,0xf9,0xd7,0x3e,0x5f,0xb7,0x16,0x3f,0x54,0x10,0x09,0x3f,0xf5,0x98,0xdf,0x3e,0xbc,0x99,0xed,0x3e,0x74,0x35,0xfa,0x3e,0x78,0x11,0xb6,0x3e,0x4a,0xc4,0x50,0x3e,0x0b,0x95,0x92,0x3e,0x71,0xf9,0x62,0x3f,0xa7,0xe1,0x12,0x3f,0x78,0xbf,0xef,0x3e,0x5f,0xcb,0x56,0x3e,0xb4,0xc6,0xb4,0x3e,0x30,0x3a,0xc9,0x3d,0x83,0xd8,0x18,0x3f,0x8f,0x94,0xb3,0x3e,0x79,0xc2,0x8a,0x3e,0x3b,0x31,0x8b,0x3e,0x48,0x8a,0xe2,0x3e,0x56,0x13,0xa1,0x3e,0xe7,0xa1,0xa0,0x3e,0x9b,0xd6,0x86,0x3f,0xb8,0xea,0xba,0x3e,0xb4,0xfa,0x14,0x3f,0xcc,0x13,0x13,0x3f,0x0a,0xba,0xf1,0x3e,0x76,0x73,0xa1,0x3e,0xed,0xf7,0xed,0x3e,0x73,0x2a,0x22,0x3f,0x20,0x00,0x00,0x00,0x9a,0x89,0xff,0xbe,0xdc,0x47,0xb7,0xbe,0x0a,0xc1,0xe4,0xbe,0xdc,0x9b,0x05,0xbf,0x7f,0xdc,0xac,0xbe,0x44,0x40,0xd7,0xbe,0xfd,0x3f,0xac,0xbe,0x43,0xff,0xcb,0xbe,0xdc,0xf7,0xaa,0xbe,0xad,0xa2,0x10,0xbe,0x96,0x45,0xb4,0xbe,0x0a,0x3f,0x2d,0xbf,0xd1,0x22,0x1a,0xbf,0xe1,0x4f,0xf4,0xbe,0xb4,0x0a,0x35,0xbe,0xfd,0x23,0xc4,0xbe,0xac,0x3e,0x25,0xbe,0x97,0x9c,0x29,0xbf,0x8e,0x28,0xa5,0xbe,0xf5,0xc7,0x5d,0xbe,0x4a,0xa4,0xcb,0xbe,0xd2,0x87,0xb0,0xbe,0x17,0x21,0x9e,0xbe,0x12,0x34,0x58,0xbe,0x29,0x1c,0x79,0xbf,0xf7,0xaa,0xe0,0xbe,0x91,0xc2,0x1c,0xbf,0x00,0x3c,0xb9,0xbe,0x57,0x8a,0x03,0xbf,0xa5,0x34,0xdb,0xbe,0xa5,0x1f,0xc8,0xbe,0x07,0x20,0xe7,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xea,0xeb,0xfe,0xff,0x00,0x00,0x00,0x09,0x8c,0x06,0x00,0x00,0x3c,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0xeb,0xfe,0xff,0xdc,0x04,0x00,0x00,0xa4,0x03,0x00,0x00,0x6c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x7b,0xfe,0xcb,0x3a,0x29,0x55,0x9f,0x3a,0x62,0x3f,0x8d,0x3a,0xca,0x3a,0xae,0x3a,0x74,0xed,0x94,0x3a,0x3e,0x9c,0x94,0x3a,0xb2,0x1c,0x55,0x3a,0xe5,0xb8,0xd5,0x3a,0xfa,0x5a,0x90,0x3a,0x5f,0x4c,0xac,0x3a,0x08,0xa9,0xbe,0x3a,0x69,0xc2,0x86,0x3a,0x67,0xbe,0xa3,0x3a,0xb7,0xd3,0x9b,0x3a,0xa8,0xbd,0x87,0x3a,0x27,0x62,0x9a,0x3a,0x69,0xc3,0x88,0x3a,0x9e,0x87,0xa8,0x3a,0x35,0x03,0x8e,0x3a,0xca,0xc9,0x93,0x3a,0x0f,0xdc,0x84,0x3a,0x01,0x2a,0xba,0x3a,0x1d,0xaa,0x9a,0x3a,0xd4,0xbb,0xa3,0x3a,0x88,0x37,0x8c,0x3a,0x05,0x44,0xe9,0x3a,0x0e,0x09,0xae,0x3a,0x9d,0xfc,0xaf,0x3a,0x09,0xcc,0x83,0x3a,0xda,0xef,0xad,0x3a,0xd7,0xea,0x95,0x3a,0x49,0x9e,0x66,0x3a,0x8e,0x46,0xb6,0x3a,0x48,0x53,0xe7,0x3a,0x83,0xdd,0xc8,0x3a,0xd3,0xee,0xac,0x3a,0x17,0x34,0x88,0x3a,0xec,0x7e,0x6d,0x3a,0x63,0xc9,0xa7,0x3a,0x62,0x32,0x7a,0x3a,0x79,0xc5,0xac,0x3a,0xb3,0xe6,0xa9,0x3a,0x18,0x69,0x8f,0x3a,0x28,0x45,0x37,0x3a,0x54,0xd8,0x83,0x3a,0x60,0xe1,0xbf,0x3a,0x09,0x8a,0x8c,0x3a,0xcb,0xb1,0x9c,0x3a,0x3a,0x2a,0x93,0x3a,0x50,0x99,0x38,0x3a,0x14,0x46,0x99,0x3a,0x2f,0xbb,0x9c,0x3a,0xcb,0x19,0x58,0x3a,0xc1,0x36,0x96,0x3a,0x3b,0xed,0x85,0x3a,0x5e,0xd3,0x64,0x3a,0x39,0x35,0xdd,0x3a,0x0e,0x03,0xa1,0x3a,0x4a,0x4b,0x95,0x3a,0x1a,0x8c,0xa5,0x3a,0x7d,0x7a,0xa9,0x3a,0xe2,0x0c,0xa5,0x3a,0x6f,0x85,0x8b,0x3a,0xd6,0x56,0x90,0x3a,0x97,0xf3,0x81,0x3a,0x08,0xce,0x6d,0x3a,0x0d,0xc7,0xda,0x3a,0xd5,0x3e,0xcb,0x3a,0x8d,0xed,0xf7,0x3a,0x0e,0xa3,0x94,0x3a,0x6a,0x78,0xa4,0x3a,0x19,0x21,0x87,0x3a,0x89,0x17,0x89,0x3a,0x2e,0xc3,0x7a,0x3a,0xb3,0xc8,0xa9,0x3a,0xa8,0x41,0x85,0x3a,0x4c,0x00,0x00,0x00,0xb2,0xf9,0x17,0x3e,0xed,0x07,0xbc,0x3d,0xda,0x60,0xaf,0x3d,0x54,0xde,0x2c,0x3e,0x38,0x62,0x0f,0x3e,0x0d,0x3d,0xe1,0x3d,0x79,0x72,0xd3,0x3d,0x73,0x0d,0x54,0x3e,0xb8,0xf6,0xc6,0x3d,0xcf,0x70,0x28,0x3e,0x5c,0xde,0x1f,0x3e,0xe4,0xb4,0x05,0x3e,0x1c,0xc8,0xee,0x3d,0xf8,0x0f,0xb1,0x3d,0x2d,0xae,0x06,0x3e,0x63,0x2d,0x19,0x3e,0xe2,0xb1,0x07,0x3e,0x8f,0x36,0x27,0x3e,0x2f,0xe7,0x0c,0x3e,0x36,0xa2,0x12,0x3e,0x84,0x81,0xfb,0x3d,0xad,0xb5,0x38,0x3e,0x8c,0x58,0x00,0x3e,0x5c,0x74,0x22,0x3e,0xcf,0x2a,0xf1,0x3d,0x67,0x1c,0xfa,0x3d,0xfc,0xac,0x2c,0x3e,0xd9,0x13,0xd6,0x3d,0x28,0xef,0xb3,0x3d,0xfa,0x93,0x2c,0x3e,0x06,0xd5,0xcf,0x3d,0x0c,0xd1,0xe4,0x3d,0x31,0x33,0x21,0x3e,0xa1,0x84,0x65,0x3e,0xc8,0x4b,0x47,0x3e,0xf5,0x94,0x2b,0x3e,0xaf,0x23,0x07,0x3e,0xf8,0xe6,0x99,0x3d,0xd0,0x79,0x26,0x3e,0xfd,0x3d,0xf8,0x3d,0xee,0x6b,0x2b,0x3e,0x1d,0x72,0x18,0x3e,0x46,0x4a,0x0e,0x3e,0x9e,0xd6,0xb5,0x3d,0xa0,0x07,0xef,0x3d,0xee,0xaa,0xb9,0x3d,0xf5,0x70,0x0b,0x3e,0x67,0x78,0x1b,0x3e,0xe6,0x03,0x12,0x3e,0x59,0xe7,0xac,0x3d,0x8c,0x4b,0xc0,0x3d,0xb9,0x81,0x1b,0x3e,0x97,0x69,0xd6,0x3d,0xcc,0x5b,0x8d,0x3d,0x61,0xe1,0x04,0x3e,0xb7,0x09,0xe3,0x3d,0x0d,0xea,0xb6,0x3d,0x08,0xc1,0x1f,0x3e,0x42,0xc0,0x9c,0x3d,0x2e,0x9a,0xe8,0x3d,0x88,0x27,0x28,0x3e,0x98,0x81,0xab,0x3d,0x84,0x18,0x03,0x3e,0xc8,0xac,0x00,0x3e,0xb0,0xef,0x00,0x3e,0x10,0x7a,0xb0,0x3d,0x7f,0x11,0x59,0x3e,0xd3,0x00,0xc2,0x3d,0xb2,0xfd,0x75,0x3e,0x04,0x4d,0x12,0x3e,0x75,0x09,0xe3,0x3d,0xd7,0x12,0x06,0x3e,0x5a,0x05,0x08,0x3e,0xa8,0xcd,0xf8,0x3d,0x22,0x75,0x28,0x3e,0xa9,0xde,0xd9,0x3d,0x4c,0x00,0x00,0x00,0x7e,0x66,0x4a,0xbe,0x7f,0x16,0x1e,0xbe,0xe3,0x24,0x0c,0xbe,0x04,0x27,0x25,0xbe,0x99,0xc3,0x13,0xbe,0x06,0x73,0x13,0xbe,0x0d,0x1c,0xa2,0xbd,0x06,0xd0,0xef,0xbd,0x44,0x3a,0x0f,0xbe,0xc6,0xf3,0x2a,0xbe,0xb6,0x2b,0x3d,0xbe,0x80,0xbd,0x9e,0xbd,0xea,0x76,0x22,0xbe,0x10,0x9c,0x1a,0xbe,0x57,0x86,0x01,0xbe,0xfa,0x88,0x04,0xbe,0x1e,0x1f,0xb7,0xbd,0x5c,0x67,0x00,0xbe,0x8a,0x3a,0xec,0xbd,0xcb,0xe3,0x0e,0xbe,0x57,0xd2,0x03,0xbe,0x26,0x44,0x5a,0xbd,0xc9,0x74,0x19,0xbe,0xb3,0x95,0xc9,0xbd,0x19,0x1f,0x0b,0xbe,0x7d,0x71,0x67,0xbe,0xd8,0x78,0x02,0xbe,0xa4,0x9c,0x2e,0xbe,0x71,0xc4,0x02,0xbe,0xa9,0x29,0xbc,0xbd,0x01,0xbf,0x14,0xbe,0xdc,0x47,0xd5,0xbd,0x01,0xda,0x34,0xbe,0x40,0xd6,0x8c,0xbd,0x72,0xcc,0x46,0xbe,0x14,0x5c,0x0d,0xbe,0x00,0xb2,0xe5,0xbd,0xee,0xa3,0xeb,0xbd,0xbe,0xaf,0xfa,0xbd,0x45,0xdd,0xdf,0xbd,0x2b,0x29,0x12,0xbe,0xe6,0x92,0x28,0xbe,0xc2,0x90,0xd9,0xbd,0xec,0x7a,0xb4,0xbd,0xa3,0xd0,0x02,0xbe,0x9d,0x61,0x3e,0xbe,0x57,0xdf,0xfd,0xbd,0x28,0x21,0xc7,0xbd,0x7c,0xaa,0xa2,0xbd,0x1d,0x28,0xb7,0xbd,0x88,0x13,0x18,0xbe,0x77,0x1a,0xd7,0xbd,0x8c,0x97,0xc7,0xbd,0x53,0x0a,0x15,0xbe,0x44,0x4e,0xd2,0xbd,0xb4,0x6c,0xe1,0xbd,0xcf,0x7a,0x5b,0xbe,0x1b,0xd0,0xd6,0xbd,0xb3,0x20,0x14,0xbe,0x02,0x41,0x24,0xbe,0x61,0xad,0xe2,0xbd,0xc8,0xc2,0x23,0xbe,0x64,0x6e,0x0a,0xbe,0x28,0x36,0x0f,0xbe,0x95,0x08,0xf2,0xbd,0x6c,0xf2,0xeb,0xbd,0x23,0x0f,0xbc,0xbd,0x57,0xa8,0x49,0xbe,0xa5,0xec,0xdd,0xbd,0xc8,0x79,0x13,0xbe,0x79,0x2f,0x23,0xbe,0xf2,0xa2,0xd6,0xbd,0x7c,0xd2,0xcc,0xbd,0x7f,0x43,0xcd,0xbd,0x87,0x52,0x8a,0xbd,0x25,0x37,0x04,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x92,0xf2,0xfe,0xff,0x00,0x00,0x00,0x09,0x8c,0x01,0x00,0x00,0x3b,0x00,0x00,0x00,0x1c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x84,0xf2,0xfe,0xff,0xdc,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x14,0xbb,0x85,0x3b,0xb0,0x8b,0xa2,0x3b,0xb4,0xf4,0xa4,0x3b,0x7d,0xf1,0x8a,0x3b,0x77,0x48,0xa4,0x3b,0x5d,0x76,0x0d,0x3c,0xf2,0x89,0x8f,0x3b,0x6f,0xc3,0x87,0x3b,0x3c,0x87,0xae,0x3b,0xea,0xe0,0xd3,0x3b,0x71,0x07,0xae,0x3b,0x97,0x1d,0xc8,0x3b,0x0c,0x00,0x00,0x00,0x36,0xa8,0xfa,0x3e,0xa6,0x03,0x12,0x3f,0xcb,0xaa,0x23,0x3f,0x9a,0xdb,0x09,0x3f,0x8b,0xdf,0x1a,0x3f,0xb7,0x8b,0x31,0x3f,0xde,0x6a,0x0e,0x3f,0xe8,0xb3,0x06,0x3f,0x3f,0x91,0x1f,0x3f,0x28,0x39,0x52,0x3f,0x62,0xab,0x2c,0x3f,0x5c,0x8d,0x46,0x3f,0x0c,0x00,0x00,0x00,0x9e,0xaf,0x04,0xbf,0x99,0x46,0x21,0xbf,0xd9,0x44,0x19,0xbf,0xa3,0xda,0x04,0xbf,0xe6,0xff,0x22,0xbf,0x70,0x5b,0x8c,0xbf,0x8e,0x31,0xf8,0xbe,0x51,0xca,0xef,0xbe,0x2e,0x2a,0x2d,0xbf,0xaf,0x3f,0xe7,0xbe,0xc6,0x85,0xe4,0xbe,0xe6,0xe4,0x05,0xbf,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x3a,0xf4,0xfe,0xff,0x00,0x00,0x00,0x09,0x5c,0x09,0x00,0x00,0x3a,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x2c,0xf4,0xfe,0xff,0x1c,0x07,0x00,0x00,0x54,0x05,0x00,0x00,0x8c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x58,0xac,0x99,0x3a,0x30,0xfa,0xb6,0x3a,0x52,0x0b,0xd7,0x3a,0x4f,0x13,0x88,0x3a,0xc1,0xdf,0xd1,0x3a,0xdb,0xdd,0x9d,0x3a,0x60,0x10,0xdd,0x3a,0x0c,0x66,0x9f,0x3a,0xfa,0x50,0x86,0x3a,0xe8,0x82,0x8e,0x3a,0x43,0xc1,0xc8,0x3a,0xbb,0x61,0x8d,0x3a,0x45,0x76,0x88,0x3a,0x0d,0xfc,0xd8,0x3a,0xc2,0xec,0xe9,0x3a,0xa5,0x39,0x8c,0x3a,0x7c,0xc0,0x68,0x3a,0x37,0x25,0xa4,0x3a,0x28,0x8f,0xa4,0x3a,0x85,0x20,0x99,0x3a,0xc5,0x2c,0xe6,0x3a,0x56,0x12,0xbf,0x3a,0x25,0xdc,0x91,0x3a,0x8c,0x0a,0xd2,0x3a,0xb4,0xf6,0x85,0x3a,0xad,0xc9,0xb3,0x3a,0x39,0x5f,0xbe,0x3a,0x32,0x8f,0xaf,0x3a,0xf6,0xc3,0xb2,0x3a,0x2d,0x09,0x7d,0x3a,0xcf,0x5c,0xc2,0x3a,0x1d,0x7c,0xe3,0x3a,0xd6,0x93,0x88,0x3a,0x49,0xea,0xd3,0x3a,0x88,0x21,0xd3,0x3a,0xf8,0x08,0x0c,0x3b,0x8e,0x5c,0xba,0x3a,0x65,0x47,0xca,0x3a,0x90,0x5c,0x71,0x3a,0x4b,0x02,0xb4,0x3a,0x23,0x2e,0xa0,0x3a,0xbf,0x84,0x92,0x3a,0xea,0x9f,0x97,0x3a,0xfc,0x1e,0xe2,0x3a,0xaa,0x59,0xa4,0x3a,0x11,0xa5,0xe9,0x3a,0x5c,0x61,0xaa,0x3a,0xdf,0xa0,0x8f,0x3a,0x92,0xb0,0xc1,0x3a,0x46,0x33,0xba,0x3a,0x0e,0xe7,0xc9,0x3a,0x10,0xe9,0xaf,0x3a,0xdd,0xdb,0x09,0x3b,0xa8,0x46,0xa1,0x3a,0xc5,0xe4,0x78,0x3a,0x5e,0xbb,0xa9,0x3a,0xd6,0xca,0x80,0x3a,0x7e,0xb9,0xaa,0x3a,0xc2,0xfa,0xa8,0x3a,0xfc,0x78,0x9e,0x3a,0xca,0x3c,0xc0,0x3a,0xeb,0x22,0xdf,0x3a,0xcf,0xec,0xc3,0x3a,0xb9,0x45,0x8f,0x3a,0x20,0x0d,0xd1,0x3a,0xcc,0x68,0xa7,0x3a,0x31,0x5b,0xcb,0x3a,0x85,0x76,0xb4,0x3a,0x5d,0x1d,0x0a,0x3b,0x44,0x24,0xaa,0x3a,0x24,0x58,0xe0,0x3a,0x09,0x6a,0xb9,0x3a,0x47,0x86,0xeb,0x3a,0xc1,0x7f,0x8b,0x3a,0x42,0x94,0xd4,0x3a,0x71,0x9d,0xd8,0x3a,0x7e,0xd0,0x9d,0x3a,0x64,0xf8,0x8f,0x3a,0x62,0xdd,0xbb,0x3a,0x5d,0x1f,0xee,0x3a,0x86,0xef,0xa9,0x3a,0xdd,0x43,0xa5,0x3a,0x23,0x60,0x03,0x3b,0x20,0x85,0xb5,0x3a,0x81,0x19,0x7d,0x3a,0x3a,0x94,0xf6,0x3a,0x12,0xd6,0xc5,0x3a,0x0d,0xd7,0xbc,0x3a,0x58,0xcf,0xe8,0x3a,0x50,0x3e,0xab,0x3a,0x23,0x80,0xf0,0x3a,0x8b,0xd8,0xba,0x3a,0x9d,0x1f,0x9a,0x3a,0x2e,0x3d,0xe3,0x3a,0xa2,0x67,0x1a,0x3b,0x09,0x35,0xe2,0x3a,0x62,0xce,0xab,0x3a,0xf9,0x21,0x9b,0x3a,0xde,0xc4,0xcc,0x3a,0xff,0xd4,0x9c,0x3a,0x99,0x9d,0xd5,0x3a,0x06,0x15,0xa4,0x3a,0xe1,0x42,0x97,0x3a,0xa7,0x4c,0xb9,0x3a,0xff,0xf1,0xda,0x3a,0xad,0x53,0x99,0x3a,0x9c,0xd0,0xb1,0x3a,0x39,0xfe,0xd2,0x3a,0xa4,0x67,0xb0,0x3a,0xc7,0x2c,0xaa,0x3a,0xec,0xf7,0xa2,0x3a,0x53,0x13,0xb6,0x3a,0x70,0x00,0x00,0x00,0xff,0x78,0x18,0x3e,0x3c,0x8c,0x35,0x3e,0xa0,0x0f,0xe3,0x3d,0x28,0x03,0x07,0x3e,0x01,0x3c,0x50,0x3e,0x1f,0xa2,0x1c,0x3e,0x3f,0x56,0x5b,0x3e,0x40,0x27,0x1e,0x3e,0x30,0x42,0xf8,0x3d,0xb6,0x45,0x0d,0x3e,0x97,0x38,0xf4,0x3d,0x84,0x12,0x08,0x3e,0x58,0x65,0x07,0x3e,0x1b,0xfa,0xe3,0x3d,0xe8,0x18,0x68,0x3e,0x32,0x21,0x0b,0x3e,0xfb,0xee,0xe6,0x3d,0xed,0xdc,0x22,0x3e,0x0a,0x46,0x23,0x3e,0x44,0xee,0x17,0x3e,0x6b,0x60,0x64,0x3e,0x23,0x3e,0x27,0x3e,0xab,0x2f,0x00,0x3e,0x77,0x66,0x50,0x3e,0xc7,0xea,0x04,0x3e,0x1a,0x62,0x32,0x3e,0x7b,0xe2,0x3c,0x3e,0x14,0x30,0x2e,0x3e,0xca,0x69,0xf6,0x3d,0x8a,0x72,0xf3,0x3d,0x15,0xd8,0x40,0x3e,0x25,0xb5,0x61,0x3e,0xae,0x82,0x07,0x3e,0xa1,0x2d,0x2d,0x3e,0x45,0x7b,0x51,0x3e,0xe6,0xf0,0x8a,0x3e,0x96,0xd1,0x2a,0x3e,0x86,0x0b,0x08,0x3e,0xd7,0x79,0xef,0x3d,0x46,0x9a,0x32,0x3e,0x61,0x51,0x08,0x3e,0xb6,0x5f,0x11,0x3e,0x59,0xc6,0xe9,0x3d,0x5a,0xf8,0x3c,0x3e,0xc4,0x2a,0x0b,0x3e,0xef,0xcc,0x44,0x3e,0x99,0x0c,0x29,0x3e,0x9d,0x81,0x0e,0x3e,0x76,0x9e,0x0d,0x3e,0x7f,0xb0,0xd1,0x3d,0x40,0x53,0x48,0x3e,0x3e,0x89,0x2e,0x3e,0x62,0x0e,0xed,0x3d,0x1b,0x04,0x20,0x3e,0x1c,0xcd,0xb5,0x3d,0xe7,0x67,0x28,0x3e,0x81,0x92,0xff,0x3d,0x66,0x4e,0x0c,0x3e,0xcc,0xa8,0x27,0x3e,0x0a,0x3c,0x1d,0x3e,0x50,0xbc,0x3e,0x3e,0xa5,0x64,0x5d,0x3e,0xb3,0x52,0xde,0x3d,0x2e,0x27,0x0e,0x3e,0x06,0x6b,0x4f,0x3e,0xfa,0x19,0x26,0x3e,0xff,0x6b,0x0f,0x3e,0x98,0x0d,0x33,0x3e,0x22,0x09,0x89,0x3e,0xfb,0xcf,0x28,0x3e,0x74,0x97,0x5e,0x3e,0x71,0x73,0xde,0x3d,0x16,0xab,0x36,0x3e,0xb3,0x18,0x06,0x3e,0xb0,0x50,0x14,0x3e,0x36,0xec,0x56,0x3e,0x2c,0xc5,0xbb,0x3d,0x95,0xbf,0x0e,0x3e,0xa7,0x65,0x3a,0x3e,0xf8,0x65,0xef,0x3d,0x7d,0xd2,0x04,0x3e,0x97,0x44,0x1d,0x3e,0x63,0x59,0x82,0x3e,0x16,0x1a,0x34,0x3e,0x0f,0x53,0xe8,0x3d,0xd0,0xb7,0x26,0x3e,0xc4,0x7e,0xf1,0x3d,0xc7,0xb4,0x32,0x3e,0xff,0x7a,0xfa,0x3d,0xd3,0xe7,0x29,0x3e,0x23,0x9f,0x6e,0x3e,0xda,0x62,0x39,0x3e,0xaa,0xe6,0xf8,0x3d,0xb4,0x76,0x61,0x3e,0xa8,0x9e,0xf2,0x3d,0xd7,0x32,0x45,0x3e,0xc5,0x76,0x2a,0x3e,0x1b,0xe5,0x03,0x3e,0xf1,0x5b,0xea,0x3d,0x55,0x9b,0x1b,0x3e,0x7b,0x8f,0xfb,0x3d,0xdc,0xcc,0x22,0x3e,0x5b,0x14,0x16,0x3e,0x0e,0xda,0x37,0x3e,0x3f,0xfc,0x16,0x3e,0x3e,0x8c,0xfc,0x3d,0xe7,0x7b,0x1d,0x3e,0xa4,0xec,0x0c,0x3e,0xd6,0x20,0x26,0x3e,0x6d,0xd8,0x28,0x3e,0xfc,0xb1,0x21,0x3e,0x83,0x8c,0xe0,0x3d,0x70,0x00,0x00,0x00,0x73,0x2d,0xd5,0xbd,0xab,0xeb,0xf1,0xbd,0x3b,0x5d,0x55,0xbe,0x15,0x04,0x84,0xbd,0x68,0x37,0xda,0xbd,0x91,0xa4,0x04,0xbe,0xb2,0x84,0x02,0xbe,0xa5,0xa6,0xf7,0xbd,0x58,0x44,0x05,0xbe,0xe2,0x65,0x0d,0xbe,0xc0,0x2f,0x47,0xbe,0xf8,0x46,0x0c,0xbe,0x22,0x79,0x00,0xbe,0x15,0x4a,0x57,0xbe,0x30,0xb3,0x23,0xbe,0x07,0x69,0xb9,0xbd,0x27,0x57,0xb2,0xbd,0x28,0x00,0x01,0xbe,0xd8,0xa2,0xcd,0xbd,0xfb,0x06,0xf7,0xbd,0x4c,0x3c,0x1c,0xbe,0x31,0x94,0x3d,0xbe,0x6d,0xb8,0x10,0xbe,0x4c,0xc0,0x15,0xbe,0xaf,0x66,0xd1,0xbd,0x70,0xaa,0xf1,0xbd,0x0a,0x33,0x1f,0xbe,0x60,0x37,0x20,0xbe,0x6e,0x5e,0x31,0xbe,0x1b,0x0f,0xfb,0xbd,0xd6,0x06,0xcd,0xbd,0x0c,0x76,0x89,0xbd,0x73,0xa1,0xe3,0xbd,0x74,0x42,0x52,0xbe,0xe9,0xa3,0x1f,0xbe,0xcb,0x28,0x80,0xbd,0xd5,0xe7,0x38,0xbe,0xd6,0xb2,0x48,0xbe,0x37,0xf2,0x97,0xbd,0x0b,0xc8,0x1f,0xbe,0xc7,0xed,0x1e,0xbe,0xc1,0xef,0x07,0xbe,0xaa,0x70,0x16,0xbe,0xbe,0x5a,0x60,0xbe,0xf7,0x10,0x23,0xbe,0xc7,0xd1,0x67,0xbe,0xf6,0x07,0xf1,0xbd,0x2a,0xe1,0xc8,0xbd,0x31,0x2d,0x40,0xbe,0xdf,0xbe,0x38,0xbe,0x07,0x77,0xed,0xbd,0x3c,0xfc,0xf0,0xbd,0x25,0xc8,0x88,0xbe,0xa6,0x66,0xf7,0xbd,0xfb,0xf2,0xf6,0xbd,0x8c,0xec,0x25,0xbe,0xb2,0xd6,0xf7,0xbd,0x0b,0x64,0x29,0xbe,0xa6,0x66,0xdd,0xbd,0xff,0x8b,0x16,0xbe,0x7b,0x86,0x10,0xbe,0x9f,0xf0,0x10,0xbe,0xf5,0x64,0x42,0xbe,0x43,0x15,0xd6,0xbd,0x4c,0xec,0xdc,0xbd,0x05,0xb9,0xa4,0xbd,0x7b,0xc4,0x49,0xbe,0x13,0x54,0x1c,0xbe,0x5a,0x02,0x2e,0xbe,0x37,0x31,0x10,0xbe,0x8a,0xb3,0x33,0xbe,0x35,0xf7,0x37,0xbe,0x3a,0xaf,0x69,0xbe,0xc1,0x68,0x0a,0xbe,0x19,0xeb,0x52,0xbe,0xe1,0x90,0x19,0xbe,0xdd,0x94,0x1c,0xbe,0x73,0xd8,0x0e,0xbe,0x45,0x3e,0x1c,0xbe,0x1e,0x43,0x6c,0xbe,0xa7,0x9b,0x28,0xbe,0x55,0xf9,0x23,0xbe,0x46,0xcd,0x16,0xbe,0x38,0x97,0x22,0xbe,0x4e,0x1f,0xfb,0xbd,0x12,0xa7,0x74,0xbe,0x66,0x4a,0x44,0xbe,0x5f,0x5d,0x3b,0xbe,0xb9,0xfd,0x66,0xbe,0x87,0xdc,0x24,0xbe,0xbd,0xa8,0x29,0xbe,0xc1,0x73,0x2b,0xbe,0x5e,0xeb,0x18,0xbe,0x38,0x4b,0xf2,0xbd,0xd3,0x32,0x99,0xbe,0x9f,0x70,0x60,0xbe,0xeb,0xa2,0xbe,0xbd,0xb5,0xeb,0x19,0xbe,0x54,0x2b,0x4b,0xbe,0xac,0x65,0xbb,0xbd,0x5e,0xf2,0x53,0xbe,0xd0,0xf2,0xf0,0xbd,0xb5,0x99,0xe9,0xbd,0x09,0xf7,0xbb,0xbd,0x1b,0x3c,0x59,0xbe,0x06,0x21,0x18,0xbe,0xfb,0x6c,0x30,0xbe,0x3d,0x58,0x51,0xbe,0xd5,0x06,0x2f,0xbe,0x9b,0xfd,0xe9,0xbd,0x60,0x91,0x00,0xbe,0x2c,0xa7,0x34,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xb2,0xfd,0xfe,0xff,0x00,0x00,0x00,0x09,0x7c,0x02,0x00,0x00,0x39,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xa4,0xfd,0xfe,0xff,0x9c,0x01,0x00,0x00,0x34,0x01,0x00,0x00,0xcc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xc4,0x80,0x82,0x3b,0x65,0xb7,0x48,0x3b,0x46,0xb4,0x5b,0x3b,0x8d,0xb0,0x59,0x3b,0x81,0x15,0x86,0x3b,0xdf,0xa2,0x7c,0x3b,0x13,0x93,0x64,0x3b,0xaf,0x43,0xaf,0x3b,0x2a,0x14,0x43,0x3b,0xa9,0x2d,0xc1,0x3a,0xc4,0x91,0x86,0x3b,0xe7,0x9e,0x62,0x3b,0x6b,0xf3,0x85,0x3b,0x24,0xd0,0x3f,0x3b,0x5e,0x1f,0x08,0x3a,0x8d,0x33,0x81,0x3b,0x72,0xdb,0x14,0x3b,0x7e,0x41,0x91,0x3b,0x19,0x87,0x84,0x3b,0x67,0xe5,0x0c,0x3b,0xb6,0x7c,0xaa,0x3b,0x3b,0x8b,0x1d,0x3b,0x64,0x3d,0x93,0x3b,0x61,0x1c,0x8a,0x3b,0x18,0x00,0x00,0x00,0xc2,0x7b,0x01,0x3f,0xf6,0x25,0xc7,0x3e,0xdd,0xfc,0xd9,0x3e,0x2c,0xfd,0xd7,0x3e,0x56,0x09,0x05,0x3f,0x99,0xa9,0xfa,0x3e,0x9e,0x42,0xdb,0x3e,0x28,0xe5,0x2d,0x3f,0x02,0x8e,0xc1,0x3e,0x4e,0xab,0x3f,0x3e,0xb4,0x9f,0xbc,0x3e,0x22,0xb7,0xcf,0x3e,0x90,0xeb,0xd7,0x3e,0x05,0xf4,0xbc,0x3e,0x1f,0x0f,0x87,0x3d,0xf6,0x10,0xbd,0x3e,0x5d,0xcc,0x87,0x3e,0x81,0x06,0xce,0x3e,0x72,0xd6,0xbd,0x3e,0x16,0x17,0x4a,0x3e,0xf9,0xd5,0x0c,0x3f,0x25,0x50,0x9c,0x3e,0xe9,0x16,0x12,0x3f,0x4d,0xc9,0xed,0x3e,0x18,0x00,0x00,0x00,0xf0,0xac,0xf9,0xbe,0xeb,0xba,0xaf,0xbe,0xeb,0x9b,0x84,0xbe,0xe1,0x4f,0xcf,0xbe,0x67,0x30,0xdd,0xbe,0xe4,0x28,0xc8,0xbe,0xed,0xc9,0xe2,0xbe,0xe6,0x5a,0x04,0xbf,0x56,0x07,0xb9,0xbe,0x99,0x3b,0x37,0xbe,0xa0,0x84,0x05,0xbf,0xa9,0xd9,0xe0,0xbe,0x84,0xe7,0x04,0xbf,0x84,0x50,0xbe,0xbe,0x4f,0x4d,0x70,0xbd,0x26,0x31,0x00,0xbf,0xbb,0xb1,0x93,0xbe,0xfb,0x1e,0x10,0xbf,0x0b,0x7e,0x03,0xbf,0x9c,0xcb,0x8b,0xbe,0xbd,0x27,0x29,0xbf,0x56,0xbf,0x87,0xbe,0x30,0xc8,0xbb,0xbe,0x28,0x08,0x09,0xbf,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4a,0x00,0xff,0xff,0x00,0x00,0x00,0x09,0x5c,0x09,0x00,0x00,0x38,0x00,0x00,0x00,0xec,0x08,0x00,0x00,0x04,0x00,0x00,0x00,0x3c,0x00,0xff,0xff,0x1c,0x07,0x00,0x00,0x54,0x05,0x00,0x00,0x8c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x72,0xcd,0xbb,0x3a,0x14,0x95,0xb4,0x3a,0xcb,0x60,0xcb,0x3a,0x42,0xc9,0xd6,0x3a,0x99,0x1b,0x8f,0x3a,0x8c,0x30,0xaf,0x3a,0xf3,0x3d,0xe1,0x3a,0xfa,0x9d,0x9e,0x3a,0xa1,0x99,0x99,0x3a,0xc3,0x8c,0xbc,0x3a,0x63,0xdb,0xba,0x3a,0xd3,0x29,0x8a,0x3a,0xd0,0x35,0xb0,0x3a,0x69,0x68,0x87,0x3a,0x24,0xfe,0xa4,0x3a,0xbe,0xf7,0x9e,0x3a,0x27,0x9c,0xaa,0x3a,0xa2,0x18,0xc4,0x3a,0xf9,0xb0,0xe8,0x3a,0x6f,0xe8,0x8d,0x3a,0x51,0x41,0xe2,0x3a,0xf5,0xac,0x28,0x3b,0x0a,0x70,0xef,0x3a,0xc5,0x39,0x81,0x3a,0x98,0x8c,0xd8,0x3a,0x1b,0x59,0x87,0x3a,0xb5,0x2e,0x45,0x3a,0x09,0x52,0x2b,0x3a,0x7e,0xe8,0x0c,0x3b,0xa6,0xf0,0x04,0x3b,0x5a,0x02,0xb7,0x3a,0x5f,0x7d,0x8f,0x3a,0xba,0xba,0xa9,0x3a,0x45,0xd0,0x74,0x3a,0xfd,0x76,0x71,0x3a,0xd3,0x2a,0xc6,0x3a,0xb9,0x44,0x5c,0x3a,0x98,0xfb,0xaf,0x3a,0x4b,0x27,0xbe,0x3a,0xeb,0x98,0x9d,0x3a,0xd8,0xfb,0xbb,0x3a,0xd2,0x66,0x50,0x3a,0xd6,0x87,0xc5,0x3a,0x69,0x37,0xbd,0x3a,0x3d,0x8a,0xaa,0x3a,0xe4,0xc1,0xcd,0x3a,0xc2,0x2f,0xc9,0x3a,0x86,0x6d,0xc1,0x3a,0x7a,0x9c,0xbf,0x3a,0x44,0xe9,0x7a,0x3a,0x6e,0xd2,0xd1,0x3a,0xbc,0x30,0x72,0x3a,0x10,0x8d,0xc5,0x3a,0x3f,0x0b,0xb6,0x3a,0x05,0x07,0xb1,0x3a,0xe7,0xc0,0x94,0x3a,0xeb,0x5b,0xa6,0x3a,0xe5,0xc9,0x06,0x3b,0x5f,0x83,0xc0,0x3a,0xd5,0x14,0xac,0x3a,0x2b,0xaa,0x90,0x3a,0xfa,0x94,0xec,0x3a,0xa1,0x4a,0xe1,0x3a,0x4d,0x07,0x26,0x3b,0xf8,0x1c,0xe8,0x3a,0xec,0x3f,0x91,0x3a,0xae,0x0d,0xab,0x3a,0x63,0x77,0x95,0x3a,0x09,0xab,0xf2,0x3a,0xd3,0xba,0x92,0x3a,0x2a,0x80,0xdc,0x3a,0xe7,0x34,0xc1,0x3a,0x9e,0x4a,0x2e,0x3a,0x45,0x37,0x81,0x3a,0xe1,0x7d,0x6b,0x3a,0xff,0x81,0xd4,0x3a,0xe9,0xfe,0xac,0x3a,0xcf,0xcd,0xa6,0x3a,0xfb,0x9d,0xbe,0x3a,0x3e,0x8f,0xa2,0x3a,0x51,0x81,0x89,0x3a,0xe9,0x2f,0xe0,0x3a,0x27,0xc5,0xc3,0x3a,0x6b,0xc0,0x90,0x3a,0x2e,0x80,0x78,0x3a,0xd8,0x9a,0xda,0x3a,0xda,0x0b,0xbd,0x3a,0x9c,0xac,0x92,0x3a,0x38,0xbd,0xa3,0x3a,0xbc,0x0d,0xa2,0x3a,0xfb,0xf0,0xb4,0x3a,0xd7,0x00,0x1b,0x3a,0x45,0xa9,0x9f,0x3a,0xa8,0xae,0x17,0x3b,0x57,0x06,0x07,0x3b,0x2d,0xff,0xee,0x3a,0x12,0x84,0x0e,0x3b,0x3d,0x33,0x8d,0x3a,0xb8,0xb2,0xd5,0x3a,0x4c,0x43,0xd0,0x3a,0x1f,0xc8,0xf4,0x3a,0x0b,0x47,0xaf,0x3a,0x5b,0x8d,0xa8,0x3a,0x65,0x6f,0xb4,0x3a,0xc1,0x83,0xbc,0x3a,0x25,0x24,0xeb,0x3a,0xca,0x2e,0xda,0x3a,0xca,0xfe,0xb1,0x3a,0x2c,0x95,0xa4,0x3a,0x4f,0xcb,0x99,0x3a,0x59,0x10,0xf7,0x3a,0xe0,0xee,0x8f,0x3a,0x70,0x00,0x00,0x00,0xd7,0x55,0x3a,0x3e,0xea,0x2b,0x33,0x3e,0x09,0xca,0x49,0x3e,0xaf,0x1b,0x55,0x3e,0x48,0xde,0xb7,0x3d,0x0f,0x5a,0xfc,0x3d,0x77,0x7b,0x5f,0x3e,0xbe,0x60,0x1d,0x3e,0x6e,0x66,0x18,0x3e,0xa6,0x00,0x05,0x3e,0x83,0x18,0xed,0x3d,0x22,0xb9,0xfa,0x3d,0x47,0x58,0xb4,0x3d,0x5b,0xf6,0x02,0x3e,0x28,0xb4,0x23,0x3e,0xcf,0xb9,0x1d,0x3e,0xef,0x46,0x29,0x3e,0x71,0x90,0x42,0x3e,0xc1,0x91,0x0b,0x3e,0x9e,0xcc,0x0c,0x3e,0xc8,0xa3,0xfe,0x3d,0x7f,0x61,0xe8,0x3d,0xc7,0xb4,0xbc,0x3d,0x51,0x37,0x00,0x3e,0xc0,0x5f,0x42,0x3e,0x58,0xaf,0xf6,0x3d,0xf8,0xdc,0xc0,0x3d,0x73,0xbf,0x93,0x3d,0xad,0xce,0x8b,0x3e,0xc5,0xe6,0x83,0x3e,0x06,0xa6,0x33,0x3e,0x64,0x5e,0x0e,0x3e,0x45,0x67,0x28,0x3e,0xa4,0xe6,0xf2,0x3d,0xf2,0x71,0x96,0x3d,0x7d,0x9e,0x44,0x3e,0x30,0x8c,0xda,0x3d,0x7b,0xed,0x04,0x3e,0x8d,0x4b,0xb3,0x3d,0xb9,0x5d,0x1c,0x3e,0xe0,0x83,0x3a,0x3e,0x04,0xc6,0xce,0x3d,0x26,0x25,0xe0,0x3d,0xfa,0xbc,0x3b,0x3e,0x6a,0x52,0x08,0x3e,0x58,0xc8,0xc6,0x3d,0x62,0x9d,0x47,0x3e,0xb6,0x22,0x94,0x3d,0xdb,0xc1,0xc8,0x3d,0x71,0xf3,0xf8,0x3d,0xa2,0xab,0x18,0x3e,0x27,0x24,0x9f,0x3d,0x69,0x72,0x04,0x3e,0x00,0x29,0xfc,0x3d,0xf7,0xa4,0x2f,0x3e,0x65,0x97,0x13,0x3e,0x33,0x0f,0x25,0x3e,0x51,0xbc,0x85,0x3e,0xe0,0x09,0x32,0x3e,0x94,0xcd,0x28,0x3e,0xd7,0x88,0x0f,0x3e,0xe3,0x41,0x55,0x3e,0x8c,0x0d,0xb7,0x3d,0x25,0x4d,0x42,0x3e,0xbe,0x4c,0x66,0x3e,0x6c,0x1d,0x10,0x3e,0x6a,0xc3,0xec,0x3d,0x11,0x17,0x12,0x3e,0x95,0x79,0x0e,0x3e,0x5d,0x95,0x11,0x3e,0x2a,0xc7,0x5a,0x3e,0xd8,0x5f,0x37,0x3e,0x08,0xdc,0x83,0x3d,0xd6,0x34,0x00,0x3e,0xe5,0xa6,0xe9,0x3d,0x54,0x53,0x22,0x3e,0xeb,0xa4,0x2b,0x3e,0x51,0x3e,0xee,0x3d,0xbf,0x20,0x3d,0x3e,0x20,0x4a,0x21,0x3e,0x46,0x2b,0xc9,0x3d,0xaf,0xea,0xda,0x3d,0x9d,0x3d,0x42,0x3e,0xe5,0x46,0xfe,0x3d,0xa6,0x70,0xf0,0x3d,0xa2,0xe5,0x58,0x3e,0x37,0x5b,0xf9,0x3d,0x9a,0xa2,0x03,0x3e,0xbe,0x75,0x22,0x3e,0xa1,0xc9,0x20,0x3e,0x55,0x6c,0x26,0x3e,0xd5,0xca,0x99,0x3d,0xf2,0x69,0x1e,0x3e,0x4b,0x7f,0x96,0x3e,0x50,0x61,0xc2,0x3d,0x58,0x56,0x0f,0x3e,0x0a,0x67,0x8d,0x3e,0xd7,0x18,0x0c,0x3e,0x53,0x07,0x54,0x3e,0x4e,0x8a,0x02,0x3e,0xf9,0xbd,0x2e,0x3e,0xdf,0x5a,0x09,0x3e,0x40,0x3c,0x27,0x3e,0xe1,0x03,0x0f,0x3e,0xb9,0x0a,0x3b,0x3e,0x4f,0x56,0x0f,0x3e,0x6c,0x7a,0x58,0x3e,0xcc,0x9a,0x30,0x3e,0x02,0x4c,0x23,0x3e,0x03,0x99,0x16,0x3e,0x38,0x22,0x75,0x3e,0x02,0xcf,0x0e,0x3e,0x70,0x00,0x00,0x00,0xc7,0x4d,0x04,0xbe,0xcf,0x00,0x2e,0xbe,0x92,0x67,0x28,0xbe,0xf3,0x14,0x53,0xbe,0x62,0xfd,0x0d,0xbe,0x2b,0xd2,0x2d,0xbe,0xeb,0xc6,0x2a,0xbe,0x21,0xfa,0xe0,0xbd,0x18,0x72,0xb8,0xbd,0xa9,0x13,0x3b,0xbe,0xac,0x65,0x39,0xbe,0x7f,0x15,0x09,0xbe,0x64,0xd5,0x2e,0xbe,0x98,0x59,0x06,0xbe,0x5b,0x84,0xb6,0xbd,0xc5,0xa5,0xc1,0xbd,0x21,0x40,0xf2,0xbd,0x60,0x0d,0x0f,0xbe,0x97,0xdf,0x66,0xbe,0x09,0xa3,0x79,0xbd,0xce,0x7c,0x60,0xbe,0x9b,0x5b,0xa7,0xbe,0x2a,0x91,0x6d,0xbe,0x50,0xc2,0xfe,0xbd,0x7f,0xdb,0x56,0xbe,0x69,0x4a,0x06,0xbe,0x58,0xa4,0xc3,0xbd,0x65,0xfb,0xa9,0xbd,0xfe,0x3c,0x38,0xbe,0x46,0x97,0x14,0xbe,0x55,0x94,0x35,0xbe,0xec,0x36,0xdb,0xbd,0x41,0xfd,0x0f,0xbe,0x72,0xcd,0xb0,0xbd,0x0f,0x94,0xef,0xbd,0xc9,0x18,0x21,0xbe,0xfb,0x4b,0x9a,0xbd,0xa1,0x9b,0x2e,0xbe,0xfc,0xaa,0x3c,0xbe,0x04,0xfd,0xc8,0xbd,0xc3,0xae,0x12,0xbe,0x8b,0xcf,0xc7,0xbd,0xc6,0xfc,0x43,0xbe,0xe3,0xf4,0x27,0xbe,0x29,0x35,0x29,0xbe,0x60,0x26,0x4c,0xbe,0x9f,0x65,0x11,0xbe,0xab,0xea,0x3f,0xbe,0x41,0x1d,0x3e,0xbe,0x85,0x0b,0xab,0xbd,0xc9,0x2e,0x50,0xbe,0x5b,0x4c,0xf0,0xbd,0xf6,0x01,0x44,0xbe,0x29,0x9f,0x34,0xbe,0x57,0x2e,0x17,0xbe,0x7a,0x59,0x07,0xbe,0x6a,0x5a,0xad,0xbd,0xe8,0x11,0xeb,0xbd,0x58,0x02,0x3f,0xbe,0xab,0xbc,0x2a,0xbe,0x70,0xe0,0xf1,0xbd,0xd0,0xbb,0x6a,0xbe,0x0c,0x88,0x5f,0xbe,0x3e,0xbb,0xa4,0xbe,0x30,0x81,0xb1,0xbd,0x8f,0x05,0xf9,0xbd,0x93,0xb7,0x29,0xbe,0x74,0x4c,0x14,0xbe,0xb3,0xc5,0x70,0xbe,0x77,0xb7,0x0f,0xbe,0x32,0xdf,0x49,0xbe,0x7d,0xb2,0x3f,0xbe,0x09,0xee,0xac,0xbd,0x8b,0x12,0xe0,0xbd,0xd9,0x3a,0xb5,0xbd,0xfb,0xd8,0x52,0xbe,0x35,0x37,0xd8,0xbd,0x33,0x80,0x25,0xbe,0x6a,0xe9,0xff,0xbd,0x1a,0x0e,0x09,0xbe,0x4e,0x6e,0x08,0xbe,0x89,0x6f,0x5e,0xbe,0x0c,0xce,0x1e,0xbe,0xea,0x9e,0x0f,0xbe,0x2e,0x8f,0xf6,0xbd,0x9b,0xb6,0x1c,0xbe,0xc2,0x91,0x3b,0xbe,0x43,0x87,0x11,0xbe,0x09,0xed,0x09,0xbe,0x40,0x3e,0x08,0xbe,0x19,0x87,0x33,0xbe,0xe7,0xd8,0x96,0xbd,0x67,0x67,0xed,0xbd,0xc0,0x60,0x2e,0xbe,0x4a,0xf8,0x85,0xbe,0x2f,0x21,0x6d,0xbe,0xde,0xde,0x12,0xbe,0x60,0x53,0xe1,0xbd,0xf9,0xe2,0x2c,0xbe,0xc5,0xa2,0x4e,0xbe,0x8f,0xde,0x72,0xbe,0x7d,0xe8,0x2d,0xbe,0xa9,0x8f,0x0a,0xbe,0x86,0x06,0x33,0xbe,0x0e,0xf3,0x33,0xbe,0xdd,0x4d,0x69,0xbe,0x73,0x58,0x42,0xbe,0xe6,0xee,0x29,0xbe,0x75,0x5a,0x09,0xbe,0xb8,0x97,0x18,0xbe,0x5f,0xfa,0x2a,0xbe,0xa4,0xab,0xb6,0xbd,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xc2,0x09,0xff,0xff,0x00,0x00,0x00,0x09,0x7c,0x02,0x00,0x00,0x37,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0x09,0xff,0xff,0x9c,0x01,0x00,0x00,0x34,0x01,0x00,0x00,0xcc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x94,0x82,0x64,0x3b,0x9d,0x43,0x87,0x3b,0x28,0x71,0x6c,0x3b,0x9c,0xab,0x62,0x3b,0xed,0x9e,0x64,0x3b,0xda,0x16,0x86,0x3b,0x9f,0x90,0x60,0x3b,0x0d,0x44,0x92,0x3b,0x68,0xb1,0x3a,0x3b,0x25,0x3a,0x3c,0x3b,0x3b,0x74,0x94,0x3b,0xae,0x21,0x9a,0x3b,0x62,0x1d,0xaf,0x3b,0x75,0x83,0xac,0x3b,0x78,0x35,0xfa,0x3a,0x0f,0x66,0x28,0x3b,0x86,0xc5,0x70,0x3b,0x97,0xe6,0x5d,0x3b,0xe5,0xf2,0x45,0x3b,0x27,0x4f,0x2a,0x3b,0xea,0xfd,0x6f,0x3b,0xa3,0x6a,0x69,0x3b,0xe2,0xd4,0x88,0x3b,0x7b,0xb1,0x4e,0x3b,0x18,0x00,0x00,0x00,0x8f,0xb9,0xe2,0x3e,0x16,0x35,0x06,0x3f,0x15,0x7a,0xe5,0x3e,0x45,0xe6,0xe0,0x3e,0xf4,0x07,0xb3,0x3e,0x18,0xa3,0xb7,0x3e,0x7e,0xcf,0xde,0x3e,0xdf,0x8a,0xfb,0x3e,0x05,0x3c,0xb9,0x3e,0xb1,0xc1,0xba,0x3e,0xc4,0x93,0xad,0x3e,0xea,0x7c,0xa1,0x3e,0x27,0xbf,0x2d,0x3f,0x6e,0x2a,0x2b,0x3f,0x0d,0x41,0x78,0x3e,0x43,0x15,0xa7,0x3e,0xd3,0x93,0xbc,0x3e,0x0e,0xa0,0xca,0x3e,0x1f,0x7b,0xbd,0x3e,0x89,0xfa,0xa8,0x3e,0xaa,0xcb,0xdc,0x3e,0xaa,0x47,0x9f,0x3e,0x38,0xc3,0x07,0x3f,0x29,0xbe,0xc2,0x3e,0x18,0x00,0x00,0x00,0xd0,0xb8,0xdb,0xbe,0x76,0xbb,0xf1,0xbe,0x46,0x98,0xea,0xbe,0x4e,0xed,0xab,0xbe,0xaf,0xd5,0xe2,0xbe,0xac,0x0a,0x05,0xbf,0xbd,0x49,0xc0,0xbe,0x85,0x1f,0x11,0xbf,0x6e,0xb3,0xa9,0xbe,0x79,0xe7,0xa4,0xbe,0x53,0x4b,0x13,0xbf,0x6b,0xed,0x18,0xbf,0x27,0x39,0x0a,0xbf,0x10,0x19,0x05,0xbf,0x68,0xb8,0x31,0xbe,0xf9,0xa3,0x9e,0xbe,0xfb,0xe3,0xee,0xbe,0xca,0x2a,0xdc,0xbe,0xff,0x66,0xc4,0xbe,0x96,0x96,0x99,0xbe,0xee,0x1d,0xee,0xbe,0xce,0x97,0xe7,0xbe,0x15,0x72,0xd2,0xbe,0x18,0x14,0xcd,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x5a,0x0c,0xff,0xff,0x00,0x00,0x00,0x09,0x7c,0x0c,0x00,0x00,0x36,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x0c,0xff,0xff,0x9c,0x09,0x00,0x00,0x34,0x07,0x00,0x00,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xf5,0x00,0x81,0x3a,0x4c,0xef,0x6e,0x3a,0xf7,0x9e,0x9b,0x3a,0xd4,0xce,0x94,0x3a,0x45,0x1f,0x95,0x3a,0x69,0xb5,0x40,0x39,0x93,0x39,0x8a,0x3a,0xa7,0xf7,0x6c,0x3a,0x5d,0xc3,0x59,0x3a,0x03,0x53,0x84,0x3a,0x34,0x63,0xbe,0x3a,0xc1,0x80,0xd5,0x37,0xfd,0xd3,0x8b,0x3a,0x69,0x01,0x3e,0x3a,0x38,0x03,0x9f,0x3a,0xd8,0xa4,0x4d,0x3a,0x17,0xf5,0x3b,0x3a,0x75,0x9e,0x4c,0x3a,0x78,0xa4,0x42,0x3a,0x9e,0x39,0x9b,0x3a,0x56,0x7f,0xa2,0x3a,0x34,0xf0,0xed,0x38,0x31,0xa9,0x1d,0x38,0xe8,0xf3,0x82,0x3a,0x3b,0xbf,0x78,0x3a,0xe8,0x48,0x22,0x3a,0x49,0xe7,0x57,0x3a,0xb7,0x1e,0x91,0x3a,0x4d,0x4e,0x4e,0x3a,0x96,0x65,0xdd,0x3a,0xd6,0xe0,0x4d,0x3a,0xed,0x6a,0x9b,0x3a,0xda,0xbd,0xab,0x3a,0x82,0xcd,0x69,0x3a,0x93,0x27,0x8d,0x3a,0xe7,0x41,0xa0,0x3a,0x58,0x21,0x89,0x3a,0xfe,0x21,0x6e,0x3a,0x77,0x92,0x7e,0x3a,0xce,0xee,0x5c,0x3a,0x98,0x72,0x92,0x3a,0xef,0x83,0x4b,0x3a,0xb9,0x88,0x71,0x3a,0xdf,0x80,0x88,0x3a,0x24,0x37,0x7b,0x3a,0x71,0x22,0x74,0x3a,0x70,0x90,0x5d,0x3a,0x9e,0x3b,0x51,0x3a,0x93,0xee,0x68,0x3a,0x2d,0xf0,0x6c,0x3a,0x2d,0x7f,0x9c,0x3a,0x73,0xc2,0x43,0x3a,0xf7,0x3b,0x63,0x3a,0x6f,0xdf,0x64,0x3a,0x6e,0x16,0x3d,0x3a,0xe1,0x22,0x34,0x3a,0xa6,0x43,0x26,0x3a,0x93,0x67,0x8f,0x3a,0x26,0x31,0xa7,0x3a,0xb6,0x81,0x98,0x38,0xbf,0xe1,0x69,0x3a,0x39,0xa2,0x41,0x3a,0xeb,0x06,0xb0,0x3a,0x25,0xa6,0x5a,0x3a,0x23,0xb8,0x86,0x3a,0x54,0xd4,0x59,0x3a,0xa6,0x14,0xfc,0x38,0x03,0x2f,0x76,0x3a,0x36,0x1c,0x7b,0x3a,0xea,0xab,0xd6,0x3a,0x20,0xc8,0x58,0x3a,0x9f,0x81,0x62,0x3a,0xc2,0xd6,0x8d,0x3a,0xd1,0xe5,0x6c,0x3a,0x45,0x12,0x8f,0x3a,0x1f,0xd7,0x96,0x3a,0xb4,0x44,0x8a,0x3a,0x7e,0x76,0x38,0x3a,0xf9,0x87,0x88,0x3a,0x94,0x7c,0x74,0x3a,0x8a,0xad,0x65,0x3a,0x4c,0x76,0x59,0x3a,0x61,0x8d,0x86,0x3a,0x47,0xf5,0xb2,0x3a,0xf4,0x4f,0x85,0x3a,0x83,0x09,0xbf,0x3a,0xaa,0xe1,0x8a,0x3a,0x87,0xb5,0x4c,0x3a,0x2a,0x73,0x8c,0x3a,0x65,0x17,0x9a,0x3a,0xd7,0x15,0x1b,0x3a,0xd2,0x93,0x9d,0x3a,0xe2,0x1a,0x9a,0x3a,0x61,0xf7,0x5f,0x3a,0x7b,0x25,0x92,0x3a,0x53,0xf6,0xa4,0x3a,0x92,0x74,0x9b,0x3a,0xa5,0xca,0x94,0x3a,0x2e,0x44,0x5d,0x3a,0x53,0xef,0x85,0x3a,0x35,0xa3,0x3d,0x3a,0x73,0xbc,0x90,0x3a,0x2a,0xf8,0x7a,0x3a,0x9b,0x35,0x76,0x3a,0x0a,0xb3,0x6e,0x3a,0x86,0x4a,0x81,0x3a,0x00,0xf5,0xae,0x3a,0x50,0x30,0x78,0x3a,0x99,0x22,0x38,0x3a,0x76,0x9c,0x81,0x3a,0xa7,0x05,0x7c,0x3a,0xa8,0x55,0xa3,0x38,0x21,0x5e,0x4f,0x3a,0x00,0xd3,0xb1,0x3a,0x04,0x63,0x1c,0x3a,0x2f,0xfc,0x25,0x3a,0xdd,0x76,0x4f,0x3a,0xd9,0x3e,0x97,0x3a,0x3f,0xdd,0x5d,0x3a,0xa4,0x33,0x6d,0x3a,0xd2,0x30,0x2a,0x3a,0x9d,0x86,0x94,0x3a,0xbb,0xba,0x8e,0x3a,0xc3,0xeb,0x84,0x3a,0x5a,0x0e,0x44,0x3a,0x1c,0x92,0x58,0x3a,0xa1,0x0a,0x60,0x3a,0x88,0xa5,0x4d,0x3a,0xfd,0x50,0x74,0x3a,0x91,0xf9,0x3d,0x3a,0x76,0xae,0x58,0x3a,0xb8,0xd4,0x76,0x3a,0x33,0xe7,0x5d,0x3a,0x4f,0x63,0x49,0x3a,0x21,0xaf,0x61,0x3a,0xaa,0x5f,0x3b,0x3a,0xcf,0xe2,0xa3,0x3a,0x0d,0xf6,0x67,0x3a,0xe6,0xb5,0x60,0x3a,0x3a,0x23,0x93,0x3a,0x01,0x71,0xd8,0x3a,0xa1,0xd4,0x3c,0x3a,0x87,0x17,0x93,0x3a,0xee,0xc8,0x84,0x3a,0x4e,0x1a,0x60,0x3a,0xc5,0x93,0x5a,0x3a,0xbf,0x8a,0x23,0x3a,0xb1,0xe7,0x3f,0x3a,0xed,0x19,0x50,0x3a,0x10,0x7e,0x63,0x3a,0xa5,0xe6,0x9b,0x3a,0xb2,0x75,0x13,0x3a,0x98,0x00,0x00,0x00,0xb2,0x5d,0xb3,0x3d,0x45,0x47,0xac,0x3d,0xb2,0xcc,0x01,0x3e,0x36,0xa5,0x13,0x3e,0x06,0xf5,0x13,0x3e,0xb3,0xbc,0x5b,0x3c,0x20,0x25,0x09,0x3e,0x29,0x35,0xc4,0x3d,0xd6,0x0f,0xd8,0x3d,0x2b,0x07,0xf4,0x3d,0x6e,0xe6,0x3c,0x3e,0xbe,0x4a,0x4d,0x3b,0x12,0x94,0xa5,0x3d,0xd9,0xec,0xb9,0x3d,0x32,0xc5,0x1d,0x3e,0x21,0x4d,0x93,0x3d,0xd2,0x4c,0xb2,0x3d,0x49,0xab,0xb2,0x3d,0x2a,0xfe,0xb7,0x3d,0x7f,0x22,0xbb,0x3d,0x57,0x3a,0x21,0x3e,0x54,0x14,0x6c,0x3c,0x93,0x92,0x96,0x3b,0x00,0xee,0x01,0x3e,0xb5,0xcd,0x5c,0x3d,0x56,0x04,0xa1,0x3d,0x7a,0x37,0xd6,0x3d,0xb1,0x41,0x06,0x3e,0xb0,0xb1,0xcc,0x3d,0x0b,0xbc,0xf1,0x3d,0xe1,0x06,0xb9,0x3d,0x17,0x34,0x1a,0x3e,0x5e,0x66,0x2a,0x3e,0x7f,0x86,0x9b,0x3d,0x3a,0x4f,0xe9,0x3d,0x31,0x3d,0xd5,0x3d,0x83,0xdb,0x02,0x3e,0xc3,0x79,0x77,0x3d,0x52,0x95,0xfc,0x3d,0xf0,0x34,0xdb,0x3d,0x10,0x1c,0x69,0x3d,0x6d,0x2b,0xb5,0x3d,0xa8,0xa5,0xef,0x3d,0x83,0xce,0xb8,0x3d,0x76,0xfe,0xb8,0x3d,0x2c,0x3a,0xf2,0x3d,0xb4,0xf2,0xbe,0x3d,0xdf,0x16,0x94,0x3d,0x69,0x54,0x6a,0x3d,0x4d,0x16,0xeb,0x3d,0x2f,0x46,0x1b,0x3e,0x76,0x08,0x98,0x3d,0x7f,0x75,0xe1,0x3d,0x10,0xf4,0xb9,0x3d,0x62,0xe8,0x96,0x3d,0xa2,0xa9,0x9e,0x3d,0x99,0xf6,0x56,0x3d,0xc4,0x48,0x0e,0x3e,0x6c,0x8e,0xb0,0x3d,0x32,0x87,0xba,0x3b,0x9a,0x3d,0xa7,0x3d,0xf5,0x1e,0xc0,0x3d,0xa5,0x50,0x0a,0x3e,0x14,0xf5,0xbb,0x3d,0x82,0x8e,0x95,0x3d,0x2b,0xd1,0x95,0x3d,0x12,0xa7,0x4a,0x3c,0xaa,0xbc,0xcd,0x3d,0xb3,0x25,0xea,0x3d,0x92,0xfe,0x54,0x3e,0x3d,0x23,0xbd,0x3d,0x9c,0xbc,0xe0,0x3d,0x14,0xbb,0x0c,0x3e,0x99,0x75,0xaa,0x3d,0x20,0xf4,0x0d,0x3e,0xad,0xcd,0xb4,0x3d,0x5e,0xbc,0xfb,0x3d,0x66,0x91,0x93,0x3d,0x16,0x7c,0xd1,0x3d,0x9b,0x93,0xf2,0x3d,0xdd,0x0d,0xbd,0x3d,0x5f,0xc3,0xd7,0x3d,0x46,0x80,0x05,0x3e,0xac,0x37,0xc1,0x3d,0x54,0x45,0x04,0x3e,0x45,0xd9,0xc3,0x3d,0xb7,0xe7,0xb8,0x3d,0x1c,0x1c,0xcb,0x3d,0x44,0x5a,0x0b,0x3e,0x45,0x35,0x77,0x3d,0x6c,0xbc,0x7c,0x3d,0x6e,0xd8,0xe4,0x3d,0x05,0x09,0xfd,0x3d,0x72,0x37,0xde,0x3d,0xf2,0xf5,0xe8,0x3d,0x66,0xac,0x23,0x3e,0xa9,0x3d,0x1a,0x3e,0x73,0x96,0xe4,0x3d,0xa6,0x89,0xdb,0x3d,0x74,0xe3,0x04,0x3e,0xef,0x27,0xbc,0x3d,0xfa,0x9a,0x0f,0x3e,0xb0,0x74,0xba,0x3d,0x30,0x49,0xf4,0x3d,0xa4,0xd5,0xec,0x3d,0xf1,0x47,0x00,0x3e,0x2d,0x97,0x92,0x3d,0xef,0x3f,0xf6,0x3d,0x84,0x0a,0xa5,0x3d,0x57,0x15,0xd5,0x3d,0x7a,0x66,0xeb,0x3d,0x5c,0x09,0xb8,0x3b,0x65,0xbf,0xcd,0x3d,0x17,0x91,0xb9,0x3d,0x3e,0x2a,0x9b,0x3d,0x37,0xb0,0xa4,0x3d,0xef,0xd7,0xcd,0x3d,0x5b,0x10,0x16,0x3e,0x3b,0x2c,0xa6,0x3d,0x3d,0x59,0xeb,0x3d,0xa6,0xbc,0x91,0x3d,0xfc,0x56,0xc2,0x3d,0x46,0x9d,0x0d,0x3e,0xeb,0xe1,0x03,0x3e,0x95,0x39,0xbd,0x3d,0xb6,0xf9,0xb5,0x3d,0xd5,0xa5,0xa3,0x3d,0x3d,0x0a,0xcc,0x3d,0x90,0xea,0x8b,0x3d,0x9e,0x7d,0xbc,0x3d,0x67,0x69,0xa7,0x3d,0x05,0xda,0xdf,0x3d,0xa0,0x0e,0xd6,0x3d,0x88,0xd0,0xc7,0x3d,0xc4,0xa9,0xda,0x3d,0xeb,0xe8,0xb9,0x3d,0x70,0x35,0xe7,0x3d,0x21,0x26,0xe6,0x3d,0x7a,0xf4,0xde,0x3d,0xf4,0xfc,0x11,0x3e,0x1f,0xc0,0x56,0x3e,0xe8,0xc7,0xb2,0x3d,0x58,0xf1,0x11,0x3e,0x05,0x97,0xb5,0x3d,0x19,0x5a,0xde,0x3d,0x9d,0xde,0xd8,0x3d,0x91,0xe0,0x9d,0x3d,0xe2,0x67,0xbe,0x3d,0xb9,0x79,0xce,0x3d,0x46,0xb4,0xaf,0x3d,0xd8,0xae,0x1a,0x3e,0xc7,0x4e,0x92,0x3d,0x98,0x00,0x00,0x00,0xe6,0xfd,0xff,0xbd,0x6d,0x11,0xed,0xbd,0xb9,0x67,0x1a,0xbe,0x70,0xff,0xeb,0xbd,0xad,0x05,0xf1,0xbd,0xfe,0x33,0xbf,0xbc,0x34,0x36,0x94,0xbd,0xb8,0x1d,0xeb,0xbd,0x70,0xb0,0x89,0xbd,0x5d,0x4a,0x03,0xbe,0x97,0xb6,0x04,0xbe,0xbf,0xd5,0x53,0xbb,0x55,0xbc,0x0a,0xbe,0x66,0x85,0xbc,0xbd,0x76,0xe1,0xdc,0xbd,0x8e,0x09,0xcc,0xbd,0x2d,0x7d,0xba,0xbd,0x38,0x05,0xcb,0xbd,0x2f,0x1f,0xc1,0xbd,0x2b,0x03,0x1a,0xbe,0x12,0x98,0x18,0xbe,0x39,0xe1,0x40,0xbc,0xdf,0x6d,0x9c,0xbb,0xd9,0x67,0xeb,0xbd,0xbd,0xcd,0xf6,0xbd,0x4b,0x5d,0xa0,0xbd,0x6c,0x4e,0xba,0xbd,0x7a,0xfc,0x0f,0xbe,0x22,0x7a,0xb9,0xbd,0xcb,0xaa,0x5b,0xbe,0x14,0x45,0xcc,0xbd,0x8b,0x89,0xa0,0xbd,0x03,0x09,0x00,0xbe,0xe7,0xf9,0xe7,0xbd,0x44,0x0d,0x0c,0xbe,0x63,0x01,0x1f,0xbe,0x15,0x0f,0x08,0xbe,0xba,0x45,0xec,0xbd,0x3f,0xd3,0x77,0xbd,0x4e,0x15,0xce,0xbd,0xb3,0x4d,0x11,0xbe,0xe7,0xec,0xc9,0xbd,0x0d,0xf5,0xcb,0xbd,0xdd,0x6f,0x07,0xbe,0xb6,0x40,0xf9,0xbd,0x39,0xff,0xb5,0xbd,0x4f,0xd5,0xdb,0xbd,0x27,0x99,0xcf,0xbd,0xb6,0x1c,0xe7,0xbd,0x11,0x9a,0x9f,0xbd,0x6f,0x67,0x9e,0xbd,0xee,0x3a,0xc2,0xbd,0xae,0x2f,0xb6,0xbd,0xb0,0x15,0xe3,0xbd,0x41,0x9c,0xbb,0xbd,0x9b,0xba,0xb2,0xbd,0x1f,0xf7,0xa4,0xbd,0xd7,0xab,0xef,0xbd,0xc4,0xe2,0x25,0xbe,0xb3,0x50,0x17,0xbc,0xfc,0x0d,0xe8,0xbd,0x97,0x06,0x8a,0xbd,0xdd,0xa6,0x2e,0xbe,0xd9,0xf0,0xd8,0xbd,0xb3,0xaa,0x05,0xbe,0xab,0x20,0xd8,0xbd,0x7d,0x1c,0x7a,0xbc,0xa5,0x42,0xf4,0xbd,0xfe,0x25,0xf9,0xbd,0x1c,0x74,0x52,0xbe,0x90,0x16,0xd7,0xbd,0x18,0x3e,0x97,0xbd,0x97,0xdd,0xde,0xbd,0x05,0x0c,0xeb,0xbd,0xdb,0xe7,0xa6,0xbd,0x71,0xa9,0x15,0xbe,0x2b,0x30,0x09,0xbe,0x91,0x05,0xb7,0xbd,0xe9,0x76,0x07,0xbe,0x56,0xe0,0xd6,0xbd,0x2f,0xe2,0xe3,0xbd,0x8b,0x9d,0xa5,0xbd,0x8e,0xa9,0xd1,0xbd,0x5c,0x8f,0x31,0xbe,0x8e,0xc7,0xac,0xbd,0x70,0x8b,0x3d,0xbe,0xe7,0xcb,0x09,0xbe,0xff,0x7a,0xac,0xbd,0xc2,0xad,0xcb,0xbd,0x36,0xe3,0x18,0xbe,0xab,0xdf,0x99,0xbd,0xaa,0x58,0x1c,0xbe,0xac,0xe6,0x18,0xbe,0xfe,0x35,0xaf,0xbd,0x30,0x01,0x11,0xbe,0xb4,0xf2,0x8e,0xbd,0x3d,0x50,0x4d,0xbd,0x10,0xa1,0x13,0xbe,0x48,0x32,0xcb,0xbd,0x7b,0x27,0x00,0xbe,0xed,0x27,0xa2,0xbd,0x4c,0xcb,0xc5,0xbd,0x3a,0x02,0xf9,0xbd,0x13,0x6f,0xb0,0xbd,0x6b,0x01,0xe8,0xbd,0x86,0x20,0xd8,0xbd,0x16,0x97,0x2d,0xbe,0x01,0xbe,0xaf,0xbd,0x54,0xb2,0xb6,0xbd,0x3d,0x99,0x00,0xbe,0x9c,0x0d,0xfa,0xbd,0xfd,0x0e,0x22,0xbc,0xab,0x5c,0xab,0xbd,0x5a,0x6f,0x30,0xbe,0x88,0x42,0x9a,0xbd,0xfe,0x75,0x89,0xbd,0x2b,0x5e,0xb7,0xbd,0x8f,0xa1,0x02,0xbe,0x85,0x21,0xdc,0xbd,0xbb,0x49,0x9b,0xbd,0x70,0xdc,0xa8,0xbd,0x90,0x5d,0x13,0xbe,0xf6,0x17,0x08,0xbe,0x56,0xcb,0xfa,0xbd,0x3d,0x86,0xc2,0xbd,0xf8,0xe0,0xd6,0xbd,0x8c,0x4a,0xde,0xbd,0xef,0x77,0x97,0xbd,0x5b,0x68,0xf2,0xbd,0x21,0xed,0xaa,0xbd,0x19,0xfd,0xd6,0xbd,0x0f,0xe7,0xf4,0xbd,0x65,0x2b,0xdc,0xbd,0xf8,0xa0,0x74,0xbd,0xc3,0xeb,0xdf,0xbd,0x9d,0x31,0xb8,0xbd,0x09,0x9b,0x22,0xbe,0x32,0x4f,0x92,0xbd,0x69,0x86,0xb6,0xbd,0x7a,0xab,0x97,0xbd,0x68,0x9a,0xbe,0xbd,0xf8,0x5a,0xbb,0xbd,0x88,0x31,0x92,0xbd,0x5c,0xbf,0x03,0xbe,0x7a,0x0c,0xa4,0xbd,0xdc,0xde,0xa8,0xbd,0xaa,0x43,0xa2,0xbd,0xfa,0x82,0x89,0xbd,0x9f,0x36,0xbb,0xbd,0x14,0xb7,0xe1,0xbd,0x01,0x56,0xc2,0xbd,0x85,0x1a,0x8b,0xbd,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xf2,0x18,0xff,0xff,0x00,0x00,0x00,0x09,0xcc,0x02,0x00,0x00,0x35,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xe4,0x18,0xff,0xff,0xdc,0x01,0x00,0x00,0x64,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xa4,0x9e,0x92,0x3b,0x9b,0x35,0x84,0x3b,0xdc,0xf9,0x9b,0x3b,0xf2,0x64,0x9d,0x3b,0xb1,0x27,0xd6,0x3b,0x63,0xb8,0x88,0x3b,0x18,0x90,0x0d,0x3b,0x79,0x37,0xcb,0x3b,0xc3,0xd6,0x67,0x3b,0xec,0x6b,0xb1,0x3b,0x82,0x02,0xde,0x3b,0x11,0xf6,0x37,0x3b,0xf5,0x74,0x88,0x3b,0x8d,0x7f,0x98,0x3b,0xc4,0xf9,0xf6,0x3a,0x7f,0x4e,0x99,0x3b,0x19,0x98,0xb3,0x3b,0x08,0xf7,0xa9,0x3b,0xad,0x12,0x7b,0x3b,0x1c,0x5d,0x6d,0x3b,0x5a,0xc4,0xd2,0x3b,0x42,0x7f,0x2f,0x3b,0x3c,0xa1,0xa6,0x3b,0xc8,0x6b,0x86,0x3b,0xf3,0x86,0x73,0x3b,0xc9,0xaa,0xe8,0x3b,0x2d,0x29,0xbe,0x3b,0x3a,0xd0,0x4e,0x3b,0x1c,0x00,0x00,0x00,0x96,0x18,0x09,0x3f,0x30,0x2d,0x03,0x3f,0x68,0xa1,0xcc,0x3e,0x91,0x70,0xf8,0x3e,0x62,0x7b,0x54,0x3f,0xf2,0xa6,0x07,0x3f,0x41,0xea,0x80,0x3e,0x0a,0xa1,0x49,0x3f,0x15,0x07,0xe6,0x3e,0x14,0x09,0x30,0x3f,0x3c,0x14,0x24,0x3f,0x25,0x86,0xb6,0x3e,0x0b,0x64,0x07,0x3f,0x53,0x0f,0x17,0x3f,0xde,0x97,0x6e,0x3e,0xe2,0x1b,0x18,0x3f,0xe9,0x30,0x32,0x3f,0xcc,0x97,0xfc,0x3e,0x88,0x1c,0xf9,0x3e,0x80,0xe4,0xcb,0x3e,0xd1,0x1e,0x51,0x3f,0x43,0x20,0xae,0x3e,0xb7,0x48,0x18,0x3f,0x4d,0xc9,0x04,0x3f,0x8b,0x26,0xcf,0x3e,0x73,0xd9,0x66,0x3f,0xdb,0xac,0x3c,0x3f,0x9a,0x32,0xcd,0x3e,0x1c,0x00,0x00,0x00,0x67,0x79,0x11,0xbf,0x27,0xe1,0xe8,0xbe,0xe8,0xc1,0x1a,0xbf,0x28,0x2a,0x1c,0xbf,0xb2,0x85,0x32,0xbf,0x63,0x97,0xb1,0xbe,0xf8,0x74,0x8c,0xbe,0xae,0x87,0x0f,0xbf,0x38,0x3b,0xd8,0xbe,0x32,0x4d,0x01,0xbf,0x7d,0x46,0x5c,0xbf,0x2e,0xa5,0x9e,0xbe,0x38,0xd3,0xe7,0xbe,0x8e,0x4e,0x17,0xbf,0xd0,0x0b,0x75,0xbe,0x33,0xb5,0x01,0xbf,0x43,0x26,0x02,0xbf,0x1a,0xa3,0x28,0xbf,0xa0,0xb9,0xcd,0xbe,0x62,0x82,0xeb,0xbe,0x04,0x0c,0x3b,0xbf,0xe3,0x25,0x7f,0xbe,0xfa,0x53,0x25,0xbf,0xf0,0x5e,0x05,0xbf,0xe5,0x9f,0xf1,0xbe,0xd5,0x0a,0xfe,0xbe,0xe1,0x8c,0x16,0xbf,0xaf,0x1d,0xa6,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xda,0x1b,0xff,0xff,0x00,0x00,0x00,0x09,0x7c,0x0c,0x00,0x00,0x34,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0xcc,0x1b,0xff,0xff,0x9c,0x09,0x00,0x00,0x34,0x07,0x00,0x00,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x46,0x1f,0x80,0x3a,0x28,0xa5,0xc9,0x3a,0x91,0x6b,0x1f,0x3a,0x64,0xef,0xa2,0x3a,0x1b,0x36,0x7c,0x3a,0xf8,0x5b,0x8e,0x3a,0xc5,0xb1,0xb7,0x3a,0xb0,0x96,0x80,0x3a,0xf2,0x0b,0xc3,0x3a,0x70,0xe1,0xa6,0x3a,0x6e,0x5e,0x92,0x3a,0x2a,0x50,0xec,0x3a,0x08,0xad,0xa2,0x3a,0xd7,0xc2,0x82,0x3a,0xf8,0x5e,0x8c,0x3a,0x35,0xef,0xc7,0x3a,0xfb,0x54,0xa6,0x3a,0xf0,0x46,0xc4,0x3a,0x6e,0x73,0x7c,0x3a,0xf2,0xd6,0x88,0x3a,0xa5,0x2f,0x88,0x3a,0x33,0x1d,0xb7,0x3a,0xb1,0xed,0xa1,0x3a,0xb5,0x7a,0x87,0x3a,0xbb,0x04,0xf8,0x3a,0x35,0xe9,0x7c,0x3a,0x77,0xa7,0xa9,0x3a,0x01,0x20,0x8b,0x3a,0x98,0x67,0xb0,0x3a,0x32,0xa3,0x89,0x3a,0xf9,0x82,0x7c,0x3a,0x72,0x09,0x93,0x3a,0x81,0x8e,0x9e,0x3a,0x35,0xb1,0x89,0x3a,0xef,0xf8,0x8f,0x3a,0xf4,0x54,0xa0,0x3a,0x07,0x38,0xad,0x3a,0x5e,0x69,0x94,0x3a,0x5a,0x5a,0xab,0x39,0xd3,0x2f,0xad,0x3a,0xd7,0x7e,0xb8,0x3a,0x71,0xd8,0xae,0x3a,0x39,0x4a,0x89,0x3a,0x57,0x52,0xd2,0x3a,0x3e,0x60,0x8f,0x3a,0xde,0xde,0x97,0x3a,0xc2,0x50,0x6e,0x3a,0xb2,0xd7,0xe2,0x3a,0x3e,0x21,0xa4,0x3a,0x6d,0x99,0xc2,0x3a,0xd6,0xe1,0xb6,0x3a,0xbd,0x3b,0x60,0x3a,0x54,0xfe,0xa8,0x3a,0xe6,0x28,0x47,0x3a,0xef,0xf8,0x66,0x3a,0x90,0x5f,0xa0,0x3a,0x1d,0x40,0x2c,0x39,0x2c,0x0c,0x9b,0x3a,0xd7,0x01,0xf6,0x3a,0x3c,0x90,0xb2,0x3a,0x60,0xfd,0xae,0x3a,0xe5,0x50,0x84,0x3a,0x59,0xf2,0x68,0x3a,0xd3,0x81,0xa0,0x3a,0x75,0x48,0x96,0x3a,0xf6,0x5c,0x8e,0x3a,0x56,0x00,0x76,0x3a,0x4d,0xcf,0x4c,0x3a,0x6e,0xa3,0xc7,0x3a,0x9e,0x88,0x91,0x3a,0x84,0x03,0xcd,0x3a,0xe7,0xcb,0xa0,0x3a,0x95,0xf1,0xc2,0x3a,0xdc,0x2b,0xa7,0x3a,0xd4,0xe7,0xaf,0x3a,0xa8,0xd3,0x79,0x3a,0x8c,0x14,0xbe,0x3a,0x1e,0xf2,0xad,0x3a,0x78,0x2d,0x95,0x3a,0xba,0x6a,0x73,0x3a,0x44,0xc8,0x7c,0x3a,0x22,0xa0,0xa4,0x3a,0xa0,0x7b,0x72,0x3a,0x4b,0x17,0x8a,0x3a,0x3d,0x9c,0xbc,0x3a,0x4a,0x6b,0x90,0x3a,0x3b,0xfe,0x93,0x3a,0x7c,0x6e,0xa1,0x3a,0x68,0xb4,0x5c,0x3a,0x6f,0xc3,0x05,0x3b,0x19,0x69,0x76,0x3a,0x8f,0xa0,0x7b,0x3a,0x89,0x76,0xc5,0x3a,0x26,0x07,0xa6,0x3a,0xd2,0x1e,0x98,0x3a,0x36,0xf3,0xc1,0x3a,0x31,0x48,0x84,0x3a,0x63,0xd8,0x8b,0x3a,0x5b,0xe3,0x23,0x3a,0x38,0xb3,0x9f,0x3a,0x29,0xfd,0xb5,0x3a,0xe9,0x72,0xbe,0x3a,0xbb,0x51,0x7e,0x3a,0xe6,0x39,0x8a,0x3a,0x0e,0x37,0x97,0x3a,0x32,0xa2,0xb6,0x3a,0x60,0x87,0x8c,0x3a,0x22,0x55,0x90,0x3a,0x69,0x9e,0x93,0x3a,0xfa,0x81,0x9e,0x3a,0x76,0x47,0x34,0x39,0x7b,0x4f,0xbe,0x3a,0x34,0xc8,0x79,0x3a,0x6d,0x48,0xb1,0x3a,0xdb,0xcb,0xf4,0x3a,0xdc,0x21,0x89,0x3a,0xda,0x3c,0x51,0x3a,0x12,0x9b,0xab,0x3a,0x3f,0xcc,0xa0,0x3a,0xda,0x5d,0xa0,0x3a,0x94,0x07,0x8c,0x3a,0xce,0x90,0x1d,0x3a,0xa6,0xa3,0xd0,0x3a,0xc5,0xef,0xbc,0x3a,0xfa,0x54,0xad,0x3a,0x98,0x5f,0x8a,0x3a,0xe4,0x0b,0x91,0x3a,0x8d,0x7a,0xc2,0x3a,0x61,0x88,0x6a,0x3a,0xd4,0x20,0xc3,0x3a,0x99,0xa2,0xb4,0x3a,0x81,0x69,0x8e,0x3a,0x66,0xfe,0x84,0x3a,0x3d,0xf9,0xe5,0x3a,0x7a,0x4f,0x90,0x3a,0x16,0x7e,0xd0,0x3a,0xa9,0xa9,0x8a,0x3a,0x3f,0x72,0xa8,0x3a,0x4f,0x5a,0x37,0x3a,0xe8,0xd7,0x85,0x3a,0x24,0xe4,0xbb,0x3a,0xda,0x19,0x88,0x3a,0x74,0xd6,0xdb,0x3a,0x7f,0x0e,0xab,0x3a,0xfc,0x33,0xb4,0x3a,0xcf,0xb4,0x9a,0x3a,0x1f,0x9f,0xc9,0x3a,0x75,0x5d,0xa8,0x3a,0x52,0x54,0x45,0x3a,0xe3,0x40,0x1a,0x3a,0xd1,0xa8,0x95,0x3a,0xc6,0x86,0x43,0x3a,0x98,0x00,0x00,0x00,0xa3,0x4a,0xf5,0x3d,0xde,0x11,0x48,0x3e,0x78,0x68,0x8f,0x3d,0x73,0xae,0x13,0x3e,0xaf,0x3d,0xfa,0x3d,0x28,0x79,0xa7,0x3d,0xc0,0x2b,0xf7,0x3d,0x05,0x2b,0xff,0x3d,0x85,0x65,0x8f,0x3d,0xfc,0x82,0x03,0x3e,0x50,0x1f,0x00,0x3e,0xbf,0xeb,0x09,0x3e,0xcc,0x1a,0x11,0x3e,0x77,0xe7,0xd6,0x3d,0x3a,0x46,0x0b,0x3e,0x2e,0xd0,0x42,0x3e,0xa6,0x86,0xe3,0x3d,0x62,0xbe,0x42,0x3e,0x87,0x7a,0xfa,0x3d,0xe8,0xb3,0x01,0x3e,0x46,0x1f,0x07,0x3e,0x6c,0x92,0x02,0x3e,0xd6,0xa9,0x20,0x3e,0x0c,0xe5,0xc1,0x3d,0x20,0x0d,0x0e,0x3e,0x63,0xef,0xfa,0x3d,0x63,0x2d,0x05,0x3e,0x09,0xdb,0xb8,0x3d,0x46,0x8c,0x2e,0x3e,0xec,0x8f,0x08,0x3e,0xf3,0x89,0xfa,0x3d,0x25,0x2f,0xeb,0x3d,0x11,0xea,0xfd,0x3d,0xd3,0x9d,0x08,0x3e,0xfd,0xd8,0x0e,0x3e,0x4a,0x14,0x1f,0x3e,0x96,0x7e,0x1d,0x3e,0xd8,0x5c,0xdb,0x3d,0x6b,0x23,0x00,0x3d,0x0c,0x38,0xba,0x3d,0x2e,0x09,0xac,0x3d,0xe2,0x60,0xd5,0x3d,0x4d,0xa6,0xc8,0x3d,0xb2,0xad,0x50,0x3e,0x7e,0x41,0x0e,0x3e,0x20,0xaf,0x16,0x3e,0x5c,0x51,0xd9,0x3d,0x98,0xe5,0x18,0x3e,0xfc,0xd8,0x22,0x3e,0x02,0xac,0x2b,0x3e,0x12,0x74,0x35,0x3e,0x46,0x7b,0xde,0x3d,0x49,0xf3,0x09,0x3e,0x30,0x85,0xa2,0x3d,0x38,0xde,0xdc,0x3d,0xd4,0x6a,0x18,0x3e,0x9d,0xe7,0xaa,0x3c,0xb7,0x4d,0xeb,0x3d,0xd3,0x15,0x74,0x3e,0xeb,0xd2,0xef,0x3d,0x2e,0xb6,0xb9,0x3d,0xee,0xd0,0xe0,0x3d,0x74,0x20,0xe7,0x3d,0x61,0xfc,0x02,0x3e,0xe4,0x1b,0x15,0x3e,0x3c,0x40,0x0d,0x3e,0xaf,0x75,0xe1,0x3d,0x5a,0xf5,0xc9,0x3d,0x27,0x14,0x46,0x3e,0x8d,0x65,0x10,0x3e,0x7d,0x69,0x4b,0x3e,0xbb,0x6d,0xc1,0x3d,0xcd,0x18,0xf4,0x3d,0x84,0xdd,0x25,0x3e,0x71,0x2d,0x1b,0x3e,0x01,0xe0,0xf7,0x3d,0x63,0xd8,0xe7,0x3d,0xa3,0x14,0xa7,0x3d,0x95,0x0d,0xfd,0x3d,0xe5,0x83,0xf1,0x3d,0x91,0x84,0xb5,0x3d,0xe2,0x56,0x23,0x3e,0xa9,0x96,0xf0,0x3d,0xb8,0x3a,0xce,0x3d,0x22,0x8c,0x2b,0x3e,0x73,0x4a,0x0f,0x3e,0xf3,0x3c,0x91,0x3d,0x9f,0x2b,0x20,0x3e,0xff,0xfa,0xda,0x3d,0xe8,0xb7,0x84,0x3e,0x47,0x7c,0xf4,0x3d,0x4e,0xa9,0xf9,0x3d,0xe1,0x19,0x0b,0x3e,0x18,0xbb,0x24,0x3e,0x34,0x70,0xd8,0x3d,0x50,0x6f,0x40,0x3e,0xa1,0x3f,0x03,0x3e,0xb2,0xc0,0x0a,0x3e,0xbd,0xc3,0x9c,0x3d,0xd2,0x73,0x1e,0x3e,0x2f,0x91,0x34,0x3e,0x03,0xf6,0x3c,0x3e,0x18,0x55,0xfc,0x3d,0x72,0x25,0x09,0x3e,0xa0,0x08,0x16,0x3e,0xee,0x34,0x35,0x3e,0xc7,0x16,0x08,0x3e,0x78,0x34,0x0f,0x3e,0x88,0x9d,0xa5,0x3d,0xf6,0x44,0x1d,0x3e,0x75,0x2a,0x4f,0x3c,0x86,0xf5,0xdd,0x3d,0xa4,0xd4,0xf7,0x3d,0xdc,0xe5,0x2f,0x3e,0x43,0xe2,0x72,0x3e,0x98,0x0f,0x08,0x3e,0x60,0x9a,0xcf,0x3d,0xdc,0x43,0x2a,0x3e,0xa7,0x8a,0x1f,0x3e,0x1e,0x1d,0x1f,0x3e,0x2d,0x87,0xb7,0x3d,0x80,0x7d,0x96,0x3d,0x5f,0x02,0x4f,0x3e,0xe5,0x75,0x3b,0x3e,0x50,0xfa,0x2b,0x3e,0x97,0x17,0xcb,0x3d,0x6e,0xef,0x02,0x3e,0x98,0xf5,0x40,0x3e,0x93,0x43,0xbc,0x3d,0xc5,0x32,0x0d,0x3e,0x64,0x0c,0xa8,0x3d,0xae,0x4c,0x0d,0x3e,0x69,0xf4,0x03,0x3e,0x4b,0x2d,0x64,0x3e,0xdb,0x2e,0x0f,0x3e,0x02,0x93,0x1c,0x3e,0x56,0x94,0x09,0x3e,0xc5,0x21,0xa5,0x3d,0xa1,0xd1,0x9b,0x3d,0x38,0xcc,0x04,0x3e,0x3d,0x9e,0xe7,0x3d,0xa6,0xb1,0x05,0x3e,0xd0,0xc6,0x08,0x3e,0x1f,0x2f,0xca,0x3d,0x22,0x7e,0xc9,0x3d,0x2c,0x63,0xa9,0x3d,0xe1,0x0b,0x48,0x3e,0xba,0x0c,0x27,0x3e,0xa9,0xc9,0xc3,0x3d,0xfb,0xb5,0x1f,0x3d,0x7f,0x7d,0x14,0x3e,0x5f,0x20,0x79,0x3d,0x98,0x00,0x00,0x00,0x0f,0x3e,0xfe,0xbd,0x8b,0xc2,0xc6,0xbd,0xba,0x2c,0x9e,0xbd,0x85,0xa9,0x21,0xbe,0xb8,0x63,0xd6,0xbd,0x40,0x3f,0x0d,0xbe,0x61,0x42,0x36,0xbe,0xc5,0xd5,0xcf,0xbd,0xda,0x85,0x41,0xbe,0xad,0x93,0x25,0xbe,0xb1,0x39,0x11,0xbe,0x8a,0x77,0x6a,0xbe,0xae,0x67,0x21,0xbe,0x51,0xbd,0x01,0xbe,0x0c,0xf4,0xdb,0xbd,0x57,0x5f,0x46,0xbe,0x51,0x08,0x25,0xbe,0xb2,0x60,0x01,0xbe,0x5c,0xb7,0xd4,0xbd,0x44,0xc5,0x07,0xbe,0x48,0x90,0xa0,0xbd,0xf9,0xae,0x35,0xbe,0x58,0x4e,0xff,0xbd,0xc0,0x6b,0x06,0xbe,0xb2,0x14,0x76,0xbe,0x71,0xee,0xe4,0xbd,0x28,0x54,0x28,0xbe,0xc1,0x09,0x0a,0xbe,0xc9,0x06,0x2f,0xbe,0xeb,0x30,0xfa,0xbd,0x4d,0xfb,0xe6,0xbd,0x5f,0xe3,0x11,0xbe,0x64,0x51,0x1d,0xbe,0x55,0xc7,0xf9,0xbd,0x4c,0x2d,0x31,0xbd,0x77,0x2d,0xa7,0xbd,0x97,0xdd,0x2b,0xbe,0x8b,0x40,0x13,0xbe,0xa5,0x03,0x2a,0xbd,0x73,0xd5,0x2b,0xbe,0xd9,0x0d,0x37,0xbe,0xc0,0x7a,0x2d,0xbe,0xa5,0x37,0x08,0xbe,0x3e,0xaf,0xf0,0xbd,0xb4,0x8e,0xf9,0xbd,0x75,0xed,0xe2,0xbd,0x20,0x74,0xec,0xbd,0x03,0x12,0x61,0xbe,0xb8,0x8b,0xdc,0xbd,0x3a,0x14,0x41,0xbe,0x68,0xaa,0x1b,0xbe,0xe0,0x33,0xd4,0xbd,0x57,0xac,0x27,0xbe,0x94,0x9a,0xc5,0xbd,0xfd,0x2a,0xe5,0xbd,0xd1,0x1e,0x1f,0xbe,0xb3,0x55,0xaa,0xbc,0x14,0xd6,0x19,0xbe,0x0b,0x41,0x0e,0xbe,0x1c,0x2b,0x31,0xbe,0x65,0x9f,0x2d,0xbe,0x43,0x48,0x03,0xbe,0xdb,0x1a,0xb4,0xbd,0xcf,0x40,0x1f,0xbe,0x0b,0x3e,0x00,0xbe,0x02,0xe4,0xf2,0xbd,0x55,0x14,0xf4,0xbd,0xae,0x35,0xcb,0xbd,0x03,0x4b,0xb8,0xbd,0x82,0xbc,0x0e,0xbe,0x93,0xcd,0x2e,0xbe,0x4f,0x8a,0x1f,0xbe,0xb2,0x6b,0x41,0xbe,0x35,0x8d,0x0e,0xbe,0x04,0x88,0x2e,0xbe,0xd6,0x5f,0xbe,0xbd,0x63,0x98,0x3c,0xbe,0x3a,0x96,0x2c,0xbe,0x1d,0x03,0x14,0xbe,0x50,0x45,0xee,0xbd,0xb3,0xce,0xfa,0xbd,0xf5,0x96,0xfd,0xbd,0x4b,0x4b,0xcd,0xbd,0x1c,0x03,0x09,0xbe,0x05,0x23,0x3b,0xbe,0x95,0xb4,0x00,0xbe,0x3f,0xd6,0x12,0xbe,0x1c,0x54,0x09,0xbe,0xc2,0x3e,0x9b,0xbd,0x81,0xa9,0x0d,0xbe,0xb9,0x2a,0xd6,0xbd,0x1c,0xcf,0xcb,0xbd,0x9c,0xeb,0x43,0xbe,0x7d,0x00,0x1f,0xbe,0x94,0xee,0x16,0xbe,0xde,0x15,0xc7,0xbd,0x45,0x1b,0x96,0xbd,0xb4,0xa4,0x9f,0xbd,0x94,0x9b,0xa2,0xbd,0x12,0x83,0xae,0xbd,0x94,0xf7,0x0d,0xbe,0x6a,0xec,0xc4,0xbd,0xf2,0x62,0xdb,0xbd,0x09,0x82,0xc1,0xbd,0x50,0x62,0xca,0xbd,0xc5,0xad,0xce,0xbd,0x51,0x6e,0x0b,0xbe,0xdf,0xe6,0x06,0xbe,0x2c,0x77,0x12,0xbe,0xc4,0x1a,0xfb,0xbd,0xe7,0xde,0xb2,0xbc,0xdc,0xd2,0x3c,0xbe,0x65,0x70,0xb0,0xbd,0x74,0x71,0xb4,0xbd,0x30,0x6c,0xfe,0xbd,0x91,0x0f,0xc4,0xbd,0x34,0x5a,0xca,0xbd,0x6c,0x7f,0x08,0xbe,0x80,0x3b,0x08,0xbe,0x3d,0x12,0xd6,0xbd,0x85,0xef,0x0a,0xbe,0xac,0x55,0x9c,0xbd,0x60,0x6c,0x4b,0xbe,0x2e,0x47,0x36,0xbe,0x19,0xcc,0x08,0xbe,0xd9,0x4a,0x09,0xbe,0xcc,0xe9,0x0f,0xbe,0x02,0xd8,0xe3,0xbd,0x50,0xb3,0xe8,0xbd,0x92,0x9a,0x41,0xbe,0x54,0x39,0x33,0xbe,0xd4,0x63,0xa4,0xbd,0xbc,0x87,0x01,0xbe,0xdf,0xbd,0x50,0xbe,0xdc,0x3b,0xd7,0xbd,0x1a,0xdd,0x4e,0xbe,0xcc,0x1b,0x03,0xbe,0x5b,0x21,0x27,0xbe,0x9a,0xeb,0xb5,0xbd,0x9b,0x18,0xc4,0xbd,0x5c,0x6c,0x3a,0xbe,0xa6,0x09,0x07,0xbe,0xc7,0x1e,0x5a,0xbe,0x62,0xb8,0x29,0xbe,0x94,0xcb,0x32,0xbe,0x65,0x7f,0x19,0xbe,0xb2,0x68,0xcd,0xbd,0x5a,0x45,0x20,0xbe,0xd8,0x5a,0xc1,0xbd,0x61,0x0c,0x99,0xbd,0x7f,0xa0,0xe7,0xbd,0xb8,0xff,0xc1,0xbd,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x72,0x28,0xff,0xff,0x00,0x00,0x00,0x09,0xdc,0x01,0x00,0x00,0x33,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0x28,0xff,0xff,0x1c,0x01,0x00,0x00,0xd4,0x00,0x00,0x00,0x8c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xf6,0x85,0x4f,0x3b,0xbe,0x96,0x80,0x3b,0x70,0xf1,0x86,0x3b,0xd9,0x53,0x9f,0x3b,0x72,0xbc,0x77,0x3b,0x97,0xfc,0x76,0x3b,0x51,0x52,0xa9,0x3b,0x85,0xff,0x80,0x3b,0xf3,0xf9,0x82,0x3b,0x79,0xbf,0x88,0x3b,0x1f,0x60,0x56,0x3b,0xe1,0xea,0x83,0x3b,0x78,0xea,0x58,0x3b,0xb0,0x1e,0xa5,0x3b,0xc9,0xaa,0xa4,0x3b,0x15,0x77,0xab,0x3b,0x10,0x00,0x00,0x00,0x5c,0x98,0xc2,0x3e,0x22,0x2b,0xff,0x3e,0x8d,0xe3,0x05,0x3f,0x31,0x15,0x1e,0x3f,0xf9,0xcc,0xf5,0x3e,0x9e,0x0e,0xf5,0x3e,0x41,0x5b,0xb0,0x3e,0x66,0xd6,0xd3,0x3e,0xff,0xf3,0x01,0x3f,0xfa,0xad,0x07,0x3f,0x10,0x59,0xb0,0x3e,0x0b,0xe3,0x02,0x3f,0xf7,0xe9,0xcd,0x3e,0x73,0xd4,0x23,0x3f,0x4f,0x63,0xc5,0x3e,0x27,0x20,0x2a,0x3f,0x10,0x00,0x00,0x00,0xea,0xe6,0xcd,0xbe,0xdb,0x2e,0xd1,0xbe,0xda,0x3f,0xe9,0xbe,0x4f,0x9a,0x04,0xbf,0xbb,0xd1,0xe1,0xbe,0xb5,0x84,0xdd,0xbe,0xac,0xff,0x27,0xbf,0x0b,0xfb,0xff,0xbe,0x2c,0x7b,0xda,0xbe,0x3c,0x5c,0x00,0xbf,0x5f,0xb3,0xd4,0xbe,0x5e,0x50,0xad,0xbe,0xa3,0x38,0xd7,0xbe,0xfa,0x31,0x1a,0xbf,0x73,0x61,0x23,0xbf,0x3f,0x23,0x18,0xbf,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x37,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x6a,0x2a,0xff,0xff,0x00,0x00,0x00,0x09,0x7c,0x0c,0x00,0x00,0x32,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0x2a,0xff,0xff,0x9c,0x09,0x00,0x00,0x34,0x07,0x00,0x00,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xa8,0x5f,0xef,0x3a,0x89,0xa3,0x2b,0x3a,0x6d,0x4e,0x67,0x3a,0x4f,0xaa,0x4a,0x3a,0xe8,0x12,0x81,0x3a,0xb6,0x1c,0x00,0x3b,0x24,0xbb,0xab,0x3a,0x2b,0xa5,0x65,0x3a,0x33,0x7f,0xda,0x3a,0x29,0x2e,0xa3,0x3a,0xf8,0xab,0x17,0x3a,0x1f,0x1f,0x94,0x3a,0xa9,0xf9,0x8f,0x3a,0x00,0x66,0x89,0x3a,0xcf,0x95,0xa4,0x3a,0xf1,0x2a,0x98,0x3a,0xbb,0xad,0x9e,0x3a,0xbf,0x6a,0x9d,0x3a,0x53,0x70,0xcc,0x3a,0x52,0x81,0x7f,0x3a,0x45,0x20,0xab,0x3a,0xd4,0x71,0x56,0x3a,0x63,0xe1,0x7c,0x3a,0x77,0x51,0x9b,0x3a,0x7a,0x5e,0x8c,0x3a,0xf8,0x0e,0x34,0x3a,0xb6,0x81,0xcb,0x3a,0xc1,0xf8,0x8f,0x3a,0x04,0x90,0x84,0x3a,0xbe,0x1e,0x9f,0x3a,0x4c,0x08,0xd8,0x3a,0x4a,0xf3,0xb5,0x3a,0x39,0x86,0x6f,0x3a,0xf5,0x54,0x80,0x3a,0x25,0x5e,0x67,0x3a,0x14,0xdc,0xba,0x3a,0xb3,0x9a,0x65,0x3a,0x03,0x73,0x74,0x3a,0xcc,0xfe,0x2c,0x3b,0x07,0x1a,0x95,0x3a,0xb0,0xe5,0x9a,0x3a,0x2f,0x29,0x97,0x3a,0xda,0x50,0x59,0x3a,0x17,0x46,0x96,0x3a,0xec,0x8a,0xd1,0x3a,0xf6,0x1c,0x8e,0x3a,0x65,0xa2,0x87,0x3a,0xcd,0xde,0x8a,0x3a,0x0a,0xf7,0x70,0x3a,0x48,0x6f,0x9b,0x3a,0x33,0xf8,0x51,0x3a,0xb8,0x2d,0xb5,0x3a,0x1c,0xb8,0x1e,0x3b,0x82,0xa8,0x8d,0x3a,0x49,0x06,0x37,0x3a,0x6f,0x4c,0x87,0x3a,0x33,0x81,0xbb,0x3a,0xa1,0x03,0x95,0x3a,0x6a,0xc1,0x5d,0x3a,0x30,0x2e,0x46,0x3a,0xa6,0x97,0xd5,0x3a,0xaa,0x18,0xb4,0x3a,0xac,0x40,0x81,0x3a,0xe3,0x82,0x88,0x3a,0x7b,0x2e,0xcb,0x3a,0xa4,0x3c,0xe7,0x3a,0x21,0xa7,0xaf,0x3a,0xb7,0x11,0x3d,0x3a,0x2b,0xa3,0x5c,0x3a,0xf3,0x8d,0x74,0x3a,0x6a,0x1e,0xbc,0x3a,0xdb,0xb6,0x96,0x3a,0x00,0x65,0xe7,0x38,0x69,0x5a,0x8a,0x3a,0x25,0x02,0x45,0x3a,0x69,0x83,0x20,0x3a,0x88,0x2f,0x96,0x39,0x6f,0x11,0xe2,0x3a,0x98,0x08,0x5b,0x3a,0x12,0x57,0x73,0x3a,0x2d,0x74,0x3d,0x3a,0x06,0x3d,0x8f,0x3a,0xfa,0x15,0xa6,0x3a,0xdc,0x06,0x4b,0x3a,0xd0,0x62,0x8c,0x3a,0x3b,0x43,0x6d,0x3a,0xd2,0x00,0x7c,0x3a,0xe7,0xf7,0x47,0x3a,0xb9,0x12,0x94,0x3a,0x15,0x21,0x7c,0x3a,0xb2,0x38,0xb0,0x3a,0xf8,0xd1,0xa1,0x3a,0xb1,0xb0,0x9f,0x3a,0xa4,0x76,0xfd,0x3a,0xa4,0xd6,0x97,0x3a,0xb2,0x7f,0x9d,0x3a,0x0e,0x47,0xa0,0x3a,0x30,0x74,0xfe,0x3a,0x53,0x6a,0x2e,0x3a,0xb0,0x9c,0xcd,0x3a,0x9d,0x63,0xdc,0x3a,0x93,0xc8,0xa0,0x3a,0x25,0xf8,0x9d,0x3a,0x2b,0xba,0xbe,0x3a,0xbc,0x9b,0xb6,0x3a,0x61,0xa8,0xb3,0x3a,0xf5,0xfd,0xae,0x3a,0xfa,0x25,0xc1,0x3a,0xc3,0x27,0x8e,0x3a,0xaa,0x35,0xa1,0x3a,0x35,0x36,0x11,0x3b,0x09,0xf9,0x0d,0x3a,0xc8,0x99,0xd3,0x3a,0x8d,0xec,0x56,0x3a,0x65,0x90,0xce,0x3a,0x78,0x62,0xb5,0x3a,0xd1,0x1f,0x33,0x3a,0x6f,0xb3,0x09,0x3b,0x52,0xdd,0xa8,0x3a,0x05,0x39,0x3c,0x3a,0xe1,0xb7,0x4a,0x3a,0xae,0x10,0xca,0x3a,0xfc,0xd3,0xf9,0x3a,0x2f,0xf5,0xb6,0x3a,0x89,0xa7,0xcb,0x3a,0x56,0x43,0x4e,0x3a,0x7e,0x74,0xc1,0x3a,0xad,0xe4,0xad,0x3a,0xb4,0x91,0x37,0x3a,0xf5,0x3d,0xbf,0x3a,0x8d,0x78,0x22,0x3a,0x6d,0x98,0x44,0x3a,0x83,0x12,0xba,0x3a,0xba,0xf9,0x9d,0x3a,0xd5,0x00,0x4b,0x3a,0x73,0xab,0x94,0x3a,0xa7,0xe5,0x82,0x3a,0x8f,0x23,0xa2,0x3a,0xad,0xf0,0x88,0x3a,0xa5,0x1e,0xbe,0x3a,0x1a,0xb4,0x47,0x3a,0xd6,0xac,0x91,0x3a,0x22,0xa4,0xcb,0x3a,0x7c,0x2d,0x65,0x3a,0x69,0xdc,0x78,0x3a,0x4d,0xa9,0xb7,0x3a,0xf2,0x20,0x89,0x3a,0xab,0xcc,0x82,0x3a,0x9e,0x14,0xc4,0x3a,0x79,0x80,0x64,0x3a,0x00,0xfc,0x88,0x3a,0x96,0x5c,0x51,0x3a,0x98,0x00,0x00,0x00,0xb1,0x90,0x57,0x3e,0x42,0x4c,0xaa,0x3d,0xd0,0x7f,0xe5,0x3d,0xfa,0x14,0xc9,0x3d,0x8b,0x8d,0x99,0x3d,0xfa,0x38,0x7e,0x3e,0xf5,0x7a,0xbe,0x3d,0xe1,0xd9,0xe3,0x3d,0x35,0xca,0x58,0x3e,0xcd,0xe7,0x21,0x3e,0xee,0xa3,0x4a,0x3d,0xe1,0xf6,0x12,0x3e,0xb6,0xd9,0x0e,0x3e,0x57,0x50,0xe8,0x3d,0xa3,0x4c,0x23,0x3e,0xc2,0x23,0x14,0x3e,0x60,0x70,0x1d,0x3e,0xea,0x2f,0x1c,0x3e,0x72,0xd7,0x4a,0x3e,0xe6,0xc4,0xcd,0x3d,0x4b,0xb1,0x04,0x3e,0x5c,0xd6,0xbe,0x3d,0xa0,0xe7,0xfa,0x3d,0x10,0xe9,0xa3,0x3d,0xbd,0x45,0x0b,0x3e,0xee,0x59,0xaf,0x3d,0x96,0x64,0xea,0x3d,0xcf,0xd8,0x0e,0x3e,0x61,0x4e,0xa9,0x3d,0x8d,0x33,0x10,0x3e,0x3b,0x58,0x56,0x3e,0x66,0x62,0xc8,0x3d,0x9f,0x10,0x92,0x3d,0x97,0xa8,0xfe,0x3d,0xf1,0x3d,0x6a,0x3d,0x3e,0x8c,0x09,0x3e,0x7e,0xcf,0xe3,0x3d,0x3d,0xb9,0x9b,0x3d,0xce,0xa4,0xab,0x3e,0x58,0x57,0x0f,0x3e,0xe5,0xaf,0x19,0x3e,0xdd,0xfa,0x15,0x3e,0x38,0x9e,0xd7,0x3d,0x70,0xfb,0xd0,0x3d,0xde,0x64,0xc3,0x3d,0xd8,0xca,0xb2,0x3d,0xf8,0xd3,0xc5,0x3d,0x0f,0xc9,0x09,0x3e,0xf7,0xf1,0xc4,0x3d,0xf2,0x43,0x87,0x3d,0x43,0x54,0xd0,0x3d,0xd0,0x7a,0x04,0x3e,0x45,0x2a,0x44,0x3e,0x31,0x8d,0x0c,0x3e,0x13,0xad,0x47,0x3d,0xd6,0x3d,0x06,0x3e,0x31,0x0a,0x3a,0x3e,0x76,0x97,0xdf,0x3d,0x87,0x17,0xa0,0x3d,0xd4,0xa1,0xc4,0x3d,0x9e,0xcd,0xd9,0x3d,0xbe,0x7b,0x09,0x3e,0xe5,0x83,0xd0,0x3d,0xb3,0xdc,0xf2,0x3d,0xd6,0xad,0x1a,0x3e,0x29,0x61,0xc7,0x3d,0xd3,0x47,0x2e,0x3e,0x69,0x53,0x48,0x3d,0xe5,0xe9,0xda,0x3d,0xd7,0xa4,0xf2,0x3d,0x2d,0xa6,0x3a,0x3e,0x7d,0xc2,0xe7,0x3d,0x36,0x96,0x65,0x3c,0xb4,0x45,0x09,0x3e,0xad,0xfd,0xb4,0x3d,0x62,0x42,0x9f,0x3d,0x82,0xc4,0xe9,0x3c,0x4c,0x4d,0x60,0x3e,0x36,0x3d,0xd9,0x3d,0x32,0x6f,0xda,0x3d,0xab,0xaa,0xaf,0x3d,0x29,0x77,0xc7,0x3d,0xce,0xc9,0x24,0x3e,0xce,0x70,0xc9,0x3d,0x0a,0x4a,0x0b,0x3e,0xec,0xa1,0xe4,0x3d,0xbc,0x3f,0xdb,0x3d,0xf7,0x67,0xc6,0x3d,0xad,0x7d,0x10,0x3e,0xd3,0x28,0xfa,0x3d,0xab,0xea,0xe0,0x3d,0xa6,0x7b,0x0b,0x3e,0x50,0x71,0x1e,0x3e,0xb7,0x7b,0x7b,0x3e,0xf7,0xa6,0x16,0x3e,0x47,0x48,0xbf,0x3d,0x80,0x06,0x1f,0x3e,0x88,0xad,0xda,0x3d,0x2c,0x03,0x7f,0x3d,0xea,0x6e,0xb8,0x3d,0xe7,0xf6,0xce,0x3d,0x02,0x87,0x1f,0x3e,0x35,0xbc,0x1c,0x3e,0xa9,0x1e,0xd8,0x3d,0xb6,0x7a,0x83,0x3d,0x10,0x41,0x32,0x3e,0xd6,0x1b,0xef,0x3d,0xae,0xa3,0x3f,0x3e,0x73,0x0b,0x0d,0x3e,0x50,0x10,0xb5,0x3d,0xa7,0x50,0x48,0x3e,0x9e,0x7c,0x22,0x3d,0x59,0xd6,0x0d,0x3e,0xb4,0x3e,0xd5,0x3d,0xfb,0x94,0x02,0x3e,0xb3,0xf7,0x33,0x3e,0x91,0xb9,0xb1,0x3d,0x53,0x47,0xff,0x3d,0xc9,0x80,0xd1,0x3d,0x93,0xc0,0xba,0x3d,0x71,0x22,0xc9,0x3d,0x5a,0x27,0x39,0x3e,0xb4,0xca,0x48,0x3e,0x45,0x87,0x35,0x3e,0x3a,0x10,0x4a,0x3e,0x89,0xf7,0x9e,0x3d,0x95,0xf1,0x3f,0x3e,0xad,0xdf,0xe3,0x3d,0x57,0xb2,0x94,0x3d,0x79,0xbf,0x3d,0x3e,0x9c,0x33,0xa1,0x3d,0x21,0xcd,0x9c,0x3d,0x27,0xf7,0x20,0x3e,0xe9,0x4e,0xab,0x3d,0x40,0x7e,0x94,0x3d,0x70,0xfc,0xa7,0x3d,0xdc,0xdf,0x01,0x3e,0x48,0xdf,0x20,0x3e,0x06,0xe9,0xf9,0x3d,0x9c,0x2b,0xe5,0x3d,0x2f,0x81,0x92,0x3d,0x7c,0x89,0x10,0x3e,0x2c,0xb7,0xc8,0x3d,0x21,0x63,0xe3,0x3d,0x5f,0x3c,0xb4,0x3d,0xfa,0x39,0x36,0x3e,0xb0,0x0e,0x08,0x3e,0x12,0xc7,0x01,0x3e,0x9b,0x2b,0xd9,0x3d,0x78,0xb7,0xe2,0x3d,0x08,0xea,0x07,0x3e,0x95,0x8c,0xb6,0x3d,0x98,0x00,0x00,0x00,0xe9,0x80,0x6d,0xbe,0xc1,0x62,0x6e,0xbd,0xa2,0x9e,0xd4,0xbd,0x6a,0x08,0x8e,0xbd,0xc2,0x10,0x00,0xbe,0x77,0x54,0x2a,0xbe,0xae,0x63,0x2a,0xbe,0x11,0x82,0xe0,0xbd,0x66,0x96,0x2e,0xbe,0x22,0x30,0xfc,0xbd,0xa0,0x7c,0x96,0xbd,0xe2,0xa0,0xfa,0xbd,0xd9,0x63,0xd9,0xbd,0x34,0x53,0x08,0xbe,0x50,0x81,0xd5,0xbd,0x9b,0xfa,0x16,0xbe,0x40,0x2d,0xb9,0xbd,0x54,0x3d,0xdd,0xbd,0x40,0x2b,0x3b,0xbe,0x4f,0x82,0xfd,0xbd,0x04,0xca,0x29,0xbe,0xf0,0xc4,0xd4,0xbd,0x6f,0xf3,0xaf,0xbd,0xd4,0x1a,0x1a,0xbe,0x8d,0x4c,0x99,0xbd,0xda,0xa6,0xb2,0xbd,0xb3,0xea,0x49,0xbe,0x44,0xb7,0x06,0xbe,0xe4,0x86,0x03,0xbe,0x81,0xe0,0x1d,0xbe,0xbf,0xea,0x38,0xbe,0x63,0x87,0x34,0xbe,0x2d,0xa7,0xed,0xbd,0xc3,0x84,0xe0,0xbd,0x69,0x8f,0xe5,0xbd,0x5c,0x66,0x39,0xbe,0xb6,0xfc,0xba,0xbd,0x1d,0x8a,0xf2,0xbd,0xb0,0xc7,0x06,0xbe,0xd3,0xef,0x13,0xbe,0x6f,0x82,0xe8,0xbd,0xcf,0x84,0xe0,0xbd,0x56,0xd3,0xa0,0xbd,0x8b,0x19,0x15,0xbe,0xd6,0xe7,0x4f,0xbe,0xbc,0x00,0x0d,0xbe,0x20,0x93,0x06,0xbe,0x71,0x22,0xc1,0xbd,0x1c,0x15,0xef,0xbd,0x69,0x38,0x1a,0xbe,0x75,0xf5,0xb5,0xbd,0x5d,0xc3,0x33,0xbe,0xac,0x7a,0x9d,0xbe,0x37,0xb9,0xbb,0xbd,0x3c,0x98,0xb5,0xbd,0xe6,0x02,0xdc,0xbd,0xc0,0x07,0xfb,0xbd,0x9a,0xd9,0x13,0xbe,0xe7,0x05,0xdc,0xbd,0xc5,0xe2,0x8c,0xbd,0x77,0xec,0x53,0xbe,0x79,0xb0,0x32,0xbe,0x2b,0x3e,0x00,0xbe,0xdd,0x71,0x07,0xbe,0x1e,0x98,0x49,0xbe,0x2b,0x6e,0x65,0xbe,0xf7,0xdb,0xb8,0xbd,0x94,0x97,0xbb,0xbd,0xa8,0xc8,0xb6,0xbd,0xdb,0x3e,0xbb,0xbd,0x51,0xd6,0xc4,0xbd,0x6d,0x89,0x15,0xbe,0xd4,0xba,0x64,0xbc,0x44,0x65,0xdc,0xbd,0x21,0x78,0xc3,0xbd,0xe4,0xa2,0x5a,0xbd,0x29,0x03,0x15,0xbd,0x8d,0x67,0x9e,0xbd,0x87,0x52,0xd9,0xbd,0x64,0x70,0xf1,0xbd,0x45,0xf9,0xbb,0xbd,0x8c,0x1e,0x0e,0xbe,0xba,0x4c,0x03,0xbe,0xbe,0xf8,0x52,0xbd,0xc1,0x30,0xc9,0xbd,0xb5,0x68,0xeb,0xbd,0xd0,0x08,0xfa,0xbd,0x87,0x8c,0xbd,0xbd,0x94,0xea,0x12,0xbe,0x50,0x10,0x96,0xbd,0x41,0xd8,0x2e,0xbe,0x54,0x8e,0x20,0xbe,0xb1,0x1c,0xa9,0xbd,0x8b,0x2e,0x10,0xbe,0xe4,0xfe,0xe0,0xbd,0xb3,0x44,0x1c,0xbe,0x7e,0x47,0x17,0xbe,0x48,0x77,0x7c,0xbe,0x7e,0x0d,0xad,0xbd,0x77,0x01,0x4c,0xbe,0xd6,0xaa,0x5a,0xbe,0xb1,0x51,0xda,0xbd,0x57,0xf5,0xd6,0xbd,0xb7,0x3c,0x3d,0xbe,0x85,0x2e,0x35,0xbe,0x46,0x05,0xb8,0xbd,0xf9,0x9f,0x2d,0xbe,0x7e,0x75,0x2a,0xbe,0x17,0x6f,0xc5,0xbd,0x3f,0xf3,0x1f,0xbe,0xc9,0x13,0x90,0xbe,0x17,0xdd,0x8c,0xbd,0x94,0xf2,0x51,0xbe,0x0b,0x38,0x9d,0xbd,0x44,0xf3,0x4c,0xbe,0x27,0xbe,0x0e,0xbe,0x24,0x49,0x9b,0xbd,0x08,0xa0,0x88,0xbe,0x97,0x8b,0x27,0xbe,0x07,0xdf,0xa0,0xbd,0xe5,0x43,0x65,0xbd,0x8d,0x7c,0x48,0xbe,0x54,0xe0,0x77,0xbe,0xf3,0xaf,0x0c,0xbe,0xc6,0x13,0xac,0xbd,0xcf,0xa6,0xcc,0xbd,0xa4,0x9c,0x02,0xbe,0xe4,0x88,0x2c,0xbe,0x91,0x22,0xb6,0xbd,0xa1,0xcf,0x35,0xbe,0xe0,0x80,0x8d,0xbd,0x3c,0x0f,0xc3,0xbd,0x5e,0x9e,0x38,0xbe,0xc7,0xbd,0x1c,0xbe,0xd3,0x6a,0xc9,0xbd,0x1c,0x82,0x13,0xbe,0x1b,0x2d,0xd0,0xbd,0xb8,0x9b,0x13,0xbe,0xcc,0xde,0x07,0xbe,0x68,0xa2,0x3c,0xbe,0xb2,0x24,0xc6,0xbd,0xdd,0x99,0xd6,0xbd,0xda,0x0c,0x4a,0xbe,0xe2,0xe6,0xdf,0xbd,0xb0,0xea,0xf6,0xbd,0x0c,0xbb,0xf8,0xbd,0x3f,0x77,0xf7,0xbd,0x22,0x5c,0xe1,0xbd,0x75,0x8c,0x42,0xbe,0xb0,0xb9,0xb7,0xbd,0x13,0x6e,0x8c,0xbd,0xdd,0xb9,0xcf,0xbd,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x02,0x37,0xff,0xff,0x00,0x00,0x00,0x09,0xcc,0x02,0x00,0x00,0x31,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0x36,0xff,0xff,0xdc,0x01,0x00,0x00,0x64,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x2a,0xfd,0x78,0x3b,0x46,0x4a,0x16,0x3b,0x33,0xc8,0x8a,0x3b,0x20,0xe5,0x98,0x3b,0x8b,0xb8,0x53,0x3b,0x70,0x6b,0x6d,0x3b,0x15,0x6c,0x9f,0x3b,0xfb,0xb3,0x14,0x3b,0xb7,0x89,0x99,0x3b,0xe7,0x18,0x8b,0x3b,0x16,0x52,0x81,0x3b,0xf8,0x9c,0x30,0x3b,0xe4,0xc9,0x78,0x3b,0x0b,0x54,0xe7,0x3a,0xb5,0xeb,0x1d,0x3b,0xe9,0xe4,0x60,0x3b,0xea,0x5f,0x99,0x3b,0x21,0x42,0x94,0x3b,0xdf,0x07,0xa5,0x3b,0x70,0x67,0x98,0x3b,0xcd,0xf3,0xa0,0x3b,0xb7,0x11,0xa4,0x3b,0x6b,0x56,0x87,0x3b,0x57,0xc4,0x84,0x3b,0xa0,0x1c,0x9c,0x3b,0xd0,0x8b,0xa0,0x3b,0x80,0xf9,0x79,0x3b,0x95,0xdc,0x23,0x3b,0x1c,0x00,0x00,0x00,0x30,0x0b,0xf7,0x3e,0xb1,0x1d,0x95,0x3e,0x23,0x8d,0xb7,0x3e,0x8c,0xdc,0x52,0x3e,0x1a,0x11,0xd2,0x3e,0xfc,0xee,0xba,0x3e,0x3d,0x2d,0x1e,0x3f,0xef,0xfa,0x65,0x3e,0xa4,0x56,0x18,0x3f,0xb5,0x02,0x0a,0x3f,0x03,0xf3,0xbe,0x3e,0xbe,0x3b,0xaf,0x3e,0x50,0xd8,0xf6,0x3e,0x63,0x85,0x65,0x3e,0x39,0xaa,0x80,0x3e,0xce,0xd4,0xa9,0x3e,0x46,0xa6,0xcc,0x3e,0x33,0x52,0xe0,0x3e,0xeb,0x7c,0x17,0x3f,0xa1,0x36,0x17,0x3f,0x50,0xb7,0x96,0x3e,0x36,0x42,0xf5,0x3e,0xbe,0x47,0x06,0x3f,0xce,0xba,0x03,0x3f,0x18,0xac,0xd3,0x3e,0xb8,0x4a,0x1f,0x3f,0x8d,0x05,0xf8,0x3e,0xc3,0x5e,0x87,0x3e,0x1c,0x00,0x00,0x00,0xf5,0xfa,0xf6,0xbe,0x1d,0x48,0x6a,0xbe,0xa3,0xb2,0x09,0xbf,0x56,0xb3,0x17,0xbf,0x62,0x51,0xc6,0xbe,0x99,0x90,0xeb,0xbe,0x41,0x15,0xe2,0xbe,0x93,0x8a,0x93,0xbe,0x02,0xd7,0xa4,0xbe,0x7a,0x53,0x9d,0xbe,0x72,0x4f,0x00,0xbf,0x4e,0x3d,0xa3,0xbe,0x37,0x02,0xb3,0xbe,0x4e,0x30,0x46,0xbe,0xde,0xaf,0x9c,0xbe,0x1f,0x23,0xdf,0xbe,0x2a,0x2d,0x18,0xbf,0x9d,0x19,0x13,0xbf,0xcf,0xbd,0x23,0xbf,0xbc,0x52,0xc7,0xbe,0xe5,0xb1,0x1f,0xbf,0x94,0xc9,0x22,0xbf,0x5f,0x73,0xae,0xbe,0x9a,0xb0,0x01,0xbf,0x67,0xe4,0x1a,0xbf,0x08,0x83,0xef,0xbe,0xac,0x28,0xc1,0xbe,0xdc,0x94,0xa2,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x39,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xea,0x39,0xff,0xff,0x00,0x00,0x00,0x09,0x9c,0x0a,0x00,0x00,0x30,0x00,0x00,0x00,0x2c,0x0a,0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0x39,0xff,0xff,0x1c,0x08,0x00,0x00,0x14,0x06,0x00,0x00,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x70,0x2b,0xcd,0x3a,0x04,0x25,0x63,0x3a,0x8e,0x8a,0xf5,0x3a,0xf3,0x4d,0x87,0x3a,0x7f,0x4b,0xa9,0x3a,0xf9,0xc5,0xb9,0x3a,0xff,0x28,0xb4,0x3a,0x4e,0xe7,0x4f,0x3a,0x85,0x64,0xa4,0x3a,0x2a,0x87,0xbe,0x3a,0xd6,0x9f,0xe0,0x3a,0x66,0xba,0x90,0x3a,0x70,0xe6,0x7e,0x3a,0xd2,0xb5,0x8c,0x3a,0x32,0x59,0xbe,0x3a,0xdc,0x86,0x76,0x3a,0x1d,0x1f,0xf4,0x3a,0x1b,0xf7,0xc1,0x3a,0x22,0xb3,0xb2,0x3a,0xda,0xd6,0xcb,0x3a,0x5e,0x1e,0x69,0x3a,0x5b,0x83,0x21,0x3a,0x43,0x08,0xbc,0x3a,0xaf,0xef,0xfd,0x3b,0x94,0x09,0x64,0x3a,0x2e,0xe4,0x7b,0x3a,0x5d,0xcb,0x86,0x3a,0xe2,0x1c,0xc7,0x3a,0x51,0x44,0x9a,0x3a,0x0c,0x58,0x5a,0x3b,0xdb,0x2f,0xc7,0x3a,0xe3,0x56,0x18,0x3b,0x76,0x55,0xd8,0x3a,0x91,0x51,0xb9,0x3a,0xf3,0xb4,0x85,0x3b,0x06,0xa9,0x0a,0x3b,0x13,0x9a,0xa3,0x3a,0xae,0x80,0x95,0x3a,0xdb,0x6f,0x7b,0x3a,0x90,0x2d,0x82,0x3a,0xc3,0x61,0x1c,0x3b,0x42,0x93,0xd5,0x3a,0xda,0xe6,0xc8,0x3a,0x3d,0xa5,0xae,0x3a,0xd4,0x2e,0x64,0x3a,0xc9,0x32,0x66,0x39,0x5a,0x35,0x57,0x3a,0x5a,0x78,0x00,0x3b,0x6c,0xfb,0xb5,0x3a,0x2a,0x3d,0x99,0x3a,0x27,0xac,0xc3,0x3a,0xcd,0x8e,0xac,0x3a,0x64,0x7d,0x78,0x3a,0x96,0x4c,0x2a,0x3b,0x3b,0x45,0x4c,0x3a,0x3a,0xe0,0xb6,0x3a,0x8e,0x7c,0x91,0x3a,0x05,0xa2,0xfd,0x3a,0xe5,0xe9,0xe4,0x3a,0xc4,0x02,0xaa,0x3a,0xa7,0x25,0xa5,0x3a,0x6a,0x48,0xb4,0x3a,0xe7,0x3a,0xd6,0x3a,0x0b,0xda,0x94,0x3a,0xfb,0x58,0x3b,0x3b,0xb5,0x46,0x92,0x3a,0x1a,0x25,0x01,0x3b,0x20,0x35,0xab,0x3a,0x07,0x7d,0x98,0x3a,0x5a,0x65,0xdb,0x3a,0x5b,0x6e,0xac,0x3a,0x7a,0x3c,0x93,0x3a,0xbb,0xc5,0x76,0x3a,0x46,0x8c,0x0e,0x3b,0xbb,0x73,0xca,0x3a,0xfb,0x99,0xa4,0x3a,0x39,0x49,0xa3,0x3a,0x56,0xe6,0x9d,0x3a,0x9b,0x91,0xde,0x3a,0x73,0xcd,0x96,0x3a,0xd0,0x64,0xb2,0x3a,0xd4,0x58,0xec,0x3a,0xc1,0x47,0x81,0x3a,0x13,0x5f,0x76,0x3a,0xd9,0x26,0xb1,0x3a,0x2a,0xdd,0x17,0x3b,0x2e,0xf4,0xfb,0x3a,0xb1,0x6a,0x2e,0x3b,0x5f,0x87,0x83,0x3a,0x3c,0x71,0x93,0x3a,0xad,0xf1,0xb3,0x3a,0x4d,0x29,0x9e,0x3a,0xca,0x20,0xa4,0x3a,0x53,0x36,0xc0,0x3a,0x80,0x9a,0xac,0x3a,0x70,0x8b,0x67,0x3b,0x5b,0xfa,0x05,0x3b,0xc2,0x8a,0x59,0x3a,0xfa,0xe1,0x82,0x3a,0xce,0x22,0xf2,0x3a,0x11,0x9e,0x76,0x3a,0x4e,0x71,0x9d,0x3a,0xc2,0x89,0x9a,0x3a,0xe0,0x9c,0xc4,0x3a,0x79,0xb2,0x4d,0x3a,0x2b,0x06,0x72,0x3a,0x7f,0x25,0xef,0x3a,0x74,0x78,0xc4,0x3a,0x23,0xf4,0xb9,0x3a,0xb8,0x92,0x96,0x3a,0xdb,0x5d,0xc0,0x3a,0x42,0x39,0x4d,0x3a,0xf5,0x58,0xe6,0x3a,0x3e,0x09,0x02,0x3b,0x7c,0x00,0x7d,0x3a,0xc2,0x30,0x8e,0x3b,0x75,0xe4,0xe3,0x3a,0x09,0x8f,0xd6,0x3a,0x05,0xf5,0xce,0x3a,0xba,0xd3,0x82,0x3a,0x5c,0xb5,0x10,0x3b,0x07,0xe4,0xa4,0x3a,0xf6,0xbf,0x43,0x3a,0x23,0x45,0x70,0x3a,0x33,0x9f,0xd1,0x3a,0x6e,0xc0,0x99,0x3a,0x8e,0x09,0x46,0x3b,0xe2,0x21,0x57,0x3a,0x80,0x00,0x00,0x00,0x19,0x91,0x4b,0x3e,0x93,0x15,0x94,0x3d,0x79,0x9f,0x73,0x3e,0x32,0x2a,0xdb,0x3d,0x1b,0x23,0xef,0x3d,0x6d,0x52,0x38,0x3e,0x26,0x38,0x10,0x3e,0x7f,0x47,0xce,0x3d,0x17,0x36,0x00,0x3e,0x66,0x9c,0x2f,0x3e,0x22,0x60,0x13,0x3e,0xf1,0x98,0x0f,0x3e,0xa3,0xe8,0xfc,0x3d,0x66,0x9c,0x0b,0x3e,0x5f,0xed,0x29,0x3e,0x2a,0xa5,0xc9,0x3d,0xc3,0x07,0x4a,0x3e,0xcb,0x59,0x00,0x3e,0xbc,0x4d,0x31,0x3e,0x2c,0x3f,0x4a,0x3e,0x21,0x4c,0xe7,0x3d,0xff,0x7c,0x91,0x3d,0x32,0x90,0x3a,0x3e,0xd0,0xf3,0x7b,0x3f,0x79,0xe8,0x95,0x3d,0x66,0xec,0xf9,0x3d,0xaf,0x34,0x01,0x3e,0x16,0x76,0xfc,0x3d,0xc8,0x0f,0x19,0x3e,0x5c,0xa3,0xd8,0x3e,0x62,0x2c,0xc6,0x3d,0x38,0xd6,0x6b,0x3e,0xcb,0xa4,0x56,0x3e,0x42,0x1c,0x24,0x3e,0x89,0xa9,0x04,0x3f,0xb4,0x93,0x89,0x3e,0xdf,0x52,0x22,0x3e,0xe7,0x7d,0xee,0x3d,0xfb,0x78,0xf9,0x3d,0x35,0x29,0x01,0x3e,0xff,0x28,0x9b,0x3e,0x1f,0x53,0x44,0x3e,0x3b,0xe1,0x38,0x3e,0xce,0x8e,0x29,0x3e,0xde,0xb2,0xdd,0x3d,0xac,0xc3,0x92,0x3c,0xef,0x86,0xd5,0x3d,0xd3,0xee,0x7e,0x3e,0x75,0x8f,0x34,0x3e,0xb0,0x0a,0x18,0x3e,0xcf,0x24,0x42,0x3e,0x59,0x68,0xaf,0x3d,0x69,0x8c,0xf6,0x3d,0xfd,0xf7,0xa8,0x3e,0xa5,0x26,0xad,0x3d,0x7a,0x72,0x35,0x3e,0xca,0xfe,0x05,0x3e,0x09,0x0c,0x1a,0x3e,0x11,0x20,0x63,0x3e,0xbe,0xae,0x28,0x3e,0x12,0x8b,0xb5,0x3d,0xd9,0xdf,0x32,0x3e,0x17,0x63,0xd8,0x3d,0xc5,0xa8,0xde,0x3d,0x49,0xe2,0xb9,0x3e,0x71,0xc2,0x01,0x3e,0xd0,0x22,0x80,0x3e,0xb6,0xde,0x29,0x3e,0x0d,0x4c,0x17,0x3e,0xbc,0x08,0x4a,0x3e,0x7e,0x15,0x2b,0x3e,0x70,0x65,0x91,0x3d,0x51,0x77,0xdd,0x3d,0xfd,0xea,0x64,0x3e,0x8e,0x68,0x3c,0x3e,0x87,0xc4,0xa1,0x3d,0xdf,0x93,0xda,0x3d,0xe0,0x0f,0x05,0x3e,0x78,0xd4,0x5c,0x3e,0xb2,0xaf,0xdf,0x3d,0x06,0x00,0x31,0x3e,0x3e,0xae,0xd5,0x3d,0x31,0x45,0x00,0x3e,0x55,0x72,0xf4,0x3d,0x8b,0xc4,0x2f,0x3e,0x70,0xad,0x96,0x3e,0x46,0xfc,0x79,0x3e,0xdc,0x0d,0xad,0x3e,0x50,0x80,0x02,0x3e,0x5a,0x4a,0x12,0x3e,0xca,0x89,0x32,0x3e,0xfa,0xec,0x1c,0x3e,0x88,0xd8,0x22,0x3e,0x03,0xfb,0x19,0x3e,0x29,0x11,0x03,0x3e,0x59,0xbc,0xe5,0x3e,0x79,0xa7,0x0e,0x3e,0xac,0xd7,0xd7,0x3d,0xa7,0x31,0x7b,0x3d,0xf1,0xf5,0xf0,0x3d,0xcd,0xe4,0x8a,0x3d,0x6b,0x36,0x1c,0x3e,0x27,0x16,0xf9,0x3d,0xce,0x9b,0x2b,0x3e,0x2e,0x92,0xa9,0x3d,0x4a,0x47,0xa3,0x3d,0x93,0x1b,0x1a,0x3e,0xa1,0x4f,0xb6,0x3d,0x21,0x8b,0x35,0x3e,0x93,0x65,0x15,0x3e,0xb0,0x4b,0x2a,0x3e,0xcf,0x9e,0xcb,0x3d,0x43,0x8c,0x64,0x3e,0x2c,0x05,0x81,0x3e,0x7b,0x06,0xfb,0x3d,0x60,0x14,0x0d,0x3f,0x98,0x57,0x48,0x3e,0xeb,0xe1,0x54,0x3e,0x1b,0x57,0x4d,0x3e,0xc4,0x5e,0xaf,0x3d,0xf1,0x93,0x8f,0x3e,0x3f,0x9a,0x23,0x3e,0xb3,0x71,0xb3,0x3d,0xa8,0x68,0xd1,0x3d,0x57,0x83,0xaf,0x3d,0x2d,0x57,0xd2,0x3d,0x7b,0x7d,0xc4,0x3e,0x9e,0x73,0xd5,0x3d,0x80,0x00,0x00,0x00,0x28,0xd6,0x43,0xbe,0xba,0x5e,0xe1,0xbd,0x52,0xaa,0x45,0xbe,0x57,0x3f,0x06,0xbe,0xe8,0xf8,0x27,0xbe,0x8a,0x2a,0xf3,0xbd,0xad,0xc0,0x32,0xbe,0xdd,0x39,0xbd,0xbd,0xbc,0x1b,0x23,0xbe,0x1c,0x0a,0x3d,0xbe,0x96,0xde,0x5e,0xbe,0xc3,0x85,0xff,0xbd,0xc7,0x80,0xe4,0xbd,0x86,0x27,0xf2,0xbd,0x80,0xdc,0x3c,0xbe,0xce,0x99,0xf4,0xbd,0xdf,0x36,0x72,0xbe,0x2d,0x73,0x40,0xbe,0xd9,0xff,0x13,0xbe,0xb6,0x72,0xed,0xbd,0xa8,0xe8,0xca,0xbd,0x54,0x40,0xa0,0xbd,0xb3,0x26,0xee,0xbd,0x29,0x87,0x35,0xbf,0x81,0x41,0xe2,0xbd,0x95,0xe9,0xaf,0xbd,0xc6,0xbd,0x05,0xbe,0xa8,0x8e,0x45,0xbe,0xd5,0xaf,0xc6,0xbd,0x05,0xaa,0xb0,0xbe,0x7b,0xa1,0x45,0xbe,0x35,0x26,0x97,0xbe,0x3a,0x44,0x0e,0xbe,0xee,0xde,0x37,0xbe,0x33,0x8e,0x7b,0xbe,0x7f,0x08,0xc1,0xbd,0x54,0x9c,0xba,0xbd,0xad,0x55,0x14,0xbe,0xe0,0x96,0xd2,0xbd,0x75,0xab,0xb5,0xbd,0x02,0xf9,0xff,0xbd,0x1b,0xe8,0x53,0xbe,0x0c,0x55,0x47,0xbe,0xf3,0x47,0x2d,0xbe,0x76,0x66,0xe2,0xbd,0x63,0x66,0xe4,0xbc,0x0f,0xf6,0x8c,0xbd,0xc0,0x3d,0x1c,0xbe,0x61,0x1c,0x05,0xbe,0x66,0xdd,0x85,0xbd,0x94,0x8b,0x11,0xbe,0xaf,0x35,0x2b,0xbe,0xc0,0x18,0xa1,0xbd,0x4f,0x03,0x8f,0xbe,0xb1,0xac,0xca,0xbd,0x18,0x03,0x05,0xbe,0x95,0x59,0x10,0xbe,0xc1,0xa6,0x7b,0xbe,0x75,0x29,0xb5,0xbd,0xb0,0x81,0x00,0xbe,0x5c,0xdb,0x23,0xbe,0xcd,0x38,0x0e,0xbe,0x71,0x8e,0x54,0xbe,0x57,0xb0,0x13,0xbe,0x37,0xa5,0x9e,0xbe,0x28,0x22,0x11,0xbe,0x4e,0x58,0x46,0xbe,0x9b,0xb6,0x05,0xbe,0xd9,0x18,0x0f,0xbe,0x8f,0xae,0x59,0xbe,0x2c,0xa1,0x9f,0xbd,0x01,0x16,0x12,0xbe,0x30,0xd8,0xf4,0xbd,0x2d,0x6f,0x8d,0xbe,0xd4,0xde,0x48,0xbe,0xc7,0x50,0x23,0xbe,0xa7,0x02,0x22,0xbe,0x89,0xaa,0x1c,0xbe,0xfc,0x54,0x07,0xbe,0xd8,0x9f,0x15,0xbe,0x83,0x8a,0xbe,0xbd,0x22,0x80,0x6a,0xbe,0x28,0x1c,0xcc,0xbd,0xcf,0x83,0xed,0xbd,0xe5,0x74,0x03,0xbe,0xc7,0x02,0x46,0xbe,0xc7,0x95,0x26,0xbe,0xa3,0xa1,0x3b,0xbe,0x5c,0xa9,0xef,0xbd,0xe2,0xa7,0xc8,0xbd,0x33,0xd0,0x9b,0xbd,0x48,0x87,0x08,0xbe,0x25,0x00,0xbd,0xbd,0xe6,0xb5,0x3e,0xbe,0x4b,0x41,0x2b,0xbe,0xea,0xf3,0x44,0xbe,0x66,0xee,0x84,0xbe,0xf0,0x41,0xaa,0xbd,0x36,0xdc,0x01,0xbe,0x88,0x3e,0x70,0xbe,0xd5,0xb0,0xf4,0xbd,0x7c,0xc9,0xb8,0xbd,0xae,0x54,0x19,0xbe,0xa6,0x13,0x43,0xbe,0x14,0x17,0xcc,0xbd,0x1f,0x22,0xf0,0xbd,0x34,0x47,0x6d,0xbe,0x83,0xef,0x42,0xbe,0x3b,0x80,0x38,0xbe,0x02,0x67,0xfc,0xbd,0x1f,0xdd,0x3e,0xbe,0xe3,0xcd,0xa9,0xbd,0x17,0x6b,0x16,0xbe,0x07,0x71,0x71,0xbd,0x6d,0x74,0xce,0xbd,0xed,0xc8,0x61,0xbe,0xac,0x1c,0x62,0xbe,0x47,0x86,0x4e,0xbe,0x72,0x60,0xb6,0xbd,0x13,0xce,0x01,0xbe,0xe9,0x53,0xfa,0xbd,0xda,0xd4,0xe2,0xbd,0x76,0x38,0xc2,0xbd,0x99,0x64,0xee,0xbd,0xf5,0xfb,0x4f,0xbe,0xed,0x8c,0x18,0xbe,0x05,0x59,0x3b,0xbe,0x87,0x1e,0x90,0xbd,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xa2,0x44,0xff,0xff,0x00,0x00,0x00,0x09,0x2c,0x02,0x00,0x00,0x2f,0x00,0x00,0x00,0xbc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x94,0x44,0xff,0xff,0x5c,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0xac,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x36,0x77,0xb4,0x3b,0x86,0x67,0x7d,0x3a,0x7d,0x3e,0x97,0x3b,0x0f,0x43,0xc7,0x3b,0x2e,0x7a,0x4c,0x3b,0xca,0x9c,0xd0,0x3b,0x0f,0xbf,0xa4,0x3b,0x70,0x0a,0xa0,0x3b,0x88,0xb9,0x55,0x3b,0xd0,0x18,0x43,0x3b,0x5f,0xf0,0x20,0x3c,0xb0,0x4d,0xed,0x3b,0xa3,0x4d,0xc6,0x3b,0xfb,0xf6,0x01,0x3c,0x78,0xde,0xfa,0x3b,0x11,0xba,0x2f,0x3b,0xbf,0x84,0xe4,0x3b,0xfb,0xc2,0x4f,0x3b,0xc3,0xd4,0xe0,0x3b,0x4e,0x19,0xd9,0x3b,0x14,0x00,0x00,0x00,0x96,0xdf,0x2c,0x3f,0xb7,0x6c,0xfb,0x3d,0x00,0x10,0x16,0x3f,0xfb,0x68,0x32,0x3f,0x3a,0xe1,0xca,0x3e,0xfe,0x8b,0x12,0x3f,0xa3,0x8f,0x9f,0x3e,0xb0,0xa7,0xc9,0x3e,0x0a,0xd6,0x84,0x3e,0x9e,0x92,0xc1,0x3e,0xa5,0xf9,0x2a,0x3f,0x4a,0x2e,0x48,0x3f,0x55,0x59,0x36,0x3f,0x0d,0xf3,0x80,0x3f,0xc7,0x0c,0x19,0x3f,0x9d,0x5a,0xae,0x3e,0xb6,0xbb,0x62,0x3f,0x75,0x23,0xce,0x3e,0x6a,0xdd,0x36,0x3f,0x8a,0x1c,0xe1,0x3e,0x14,0x00,0x00,0x00,0x48,0x0e,0x33,0xbf,0x84,0xc6,0xbb,0xbd,0x5e,0x04,0xd0,0xbe,0x89,0xb4,0x45,0xbf,0xa5,0x20,0xc1,0xbe,0x90,0xfb,0x4e,0xbf,0x91,0x75,0x23,0xbf,0x5b,0xca,0x1e,0xbf,0x15,0x0e,0xd4,0xbe,0xc3,0x26,0x57,0xbe,0x7e,0xae,0x9f,0xbf,0x15,0x73,0x6b,0xbf,0x08,0xc1,0x44,0xbf,0x6c,0x09,0x08,0xbf,0xbb,0xe8,0x78,0xbf,0x9c,0x64,0xa4,0xbe,0x85,0x4a,0x38,0xbf,0x81,0x51,0x2d,0xbe,0x19,0x13,0x5f,0xbf,0x1b,0x67,0x57,0xbf,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x38,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xea,0x46,0xff,0xff,0x00,0x00,0x00,0x09,0xcc,0x02,0x00,0x00,0x2e,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xdc,0x46,0xff,0xff,0xdc,0x01,0x00,0x00,0x64,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x78,0x02,0xca,0x3a,0x76,0x6e,0x9b,0x3a,0x7b,0xab,0x8f,0x3a,0x52,0x0a,0xd0,0x3a,0xd0,0xc0,0x6e,0x3a,0xd2,0xa8,0xdd,0x3a,0xe3,0xea,0xa8,0x3a,0x77,0x6e,0xaa,0x3a,0x94,0x2e,0xbd,0x3a,0x16,0x79,0x9a,0x3a,0xf6,0xcc,0xa7,0x3a,0x09,0xd0,0x03,0x3b,0xb1,0xaf,0x8b,0x3a,0x0e,0x26,0x7a,0x3a,0xfd,0x7e,0x93,0x3a,0x44,0xb8,0x86,0x3a,0xcb,0x0a,0x24,0x3b,0x85,0xd8,0xf1,0x3a,0xac,0x83,0xc4,0x3a,0xfb,0xdc,0x93,0x3a,0x2e,0x77,0xa7,0x3a,0x1c,0x7e,0xce,0x3a,0x30,0xd6,0xb3,0x3a,0x63,0x97,0x55,0x3a,0xa0,0x2b,0x9e,0x3a,0x1d,0x5a,0x53,0x3a,0xbf,0x61,0xca,0x3a,0xc5,0x1e,0x3f,0x3a,0x1c,0x00,0x00,0x00,0x73,0x6e,0x48,0x3e,0x99,0x37,0x1a,0x3e,0x5a,0x95,0xf1,0x3d,0x15,0x58,0x93,0x3d,0x4e,0xe3,0xec,0x3d,0x6b,0x13,0x5b,0x3e,0xb5,0xa3,0x08,0x3e,0xbe,0xa3,0xb1,0x3d,0x37,0xb4,0x3b,0x3e,0x0d,0xe3,0x0d,0x3e,0x5c,0x7d,0x26,0x3e,0x88,0x31,0x1b,0x3e,0x52,0x98,0x0a,0x3e,0xc2,0x31,0xf8,0x3d,0xff,0x57,0x12,0x3e,0xbe,0x00,0xf8,0x3d,0xb5,0xc2,0xa2,0x3e,0x2e,0xa8,0x25,0x3e,0xa5,0xfa,0x42,0x3e,0x60,0x00,0xe9,0x3d,0x99,0x7e,0xc8,0x3d,0x20,0xe1,0x4c,0x3e,0x42,0x88,0xbf,0x3d,0x19,0x3e,0x91,0x3d,0x40,0xe7,0xea,0x3d,0x69,0xb3,0xd1,0x3d,0x4c,0xdb,0x1d,0x3e,0x87,0xa0,0xbd,0x3d,0x1c,0x00,0x00,0x00,0x90,0x80,0x23,0xbe,0x51,0xd2,0xee,0xbd,0x24,0x8c,0x0e,0xbe,0x3d,0x6a,0x4e,0xbe,0xdb,0xf0,0x9e,0xbd,0x80,0xed,0x5b,0xbe,0x0d,0x99,0x27,0xbe,0x9a,0x19,0x29,0xbe,0x4b,0xe4,0x18,0xbe,0x24,0x44,0x19,0xbe,0xd1,0x1b,0x02,0xbe,0x69,0xc8,0x82,0xbe,0xb3,0xe9,0xc5,0xbd,0x33,0x0d,0xb3,0xbd,0x0d,0xa4,0xa5,0xbd,0xd3,0xaa,0x05,0xbe,0x6f,0xa7,0x92,0xbe,0xd4,0xf4,0x6f,0xbe,0xd1,0x40,0x3a,0xbe,0x41,0xb5,0x12,0xbe,0x40,0x28,0x26,0xbe,0xd9,0xdd,0x15,0xbe,0x84,0x6e,0x32,0xbe,0x34,0xec,0xd3,0xbd,0x49,0xef,0x1c,0xbe,0xb2,0x6e,0xaf,0xbd,0xfc,0xcc,0x48,0xbe,0xe3,0x99,0xb1,0xbd,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xd2,0x49,0xff,0xff,0x00,0x00,0x00,0x09,0x7c,0x02,0x00,0x00,0x2d,0x00,0x00,0x00,0x0c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xc4,0x49,0xff,0xff,0x9c,0x01,0x00,0x00,0x34,0x01,0x00,0x00,0xcc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x9d,0x88,0xfc,0x3b,0x67,0xed,0x00,0x3c,0xa1,0x95,0x01,0x3c,0x00,0xc8,0x0a,0x3c,0xf7,0x96,0x28,0x3c,0x19,0xdd,0xc6,0x3b,0x1d,0xf4,0xe1,0x3b,0x1a,0x74,0x1b,0x3c,0x02,0x2f,0x33,0x3c,0x67,0x57,0x29,0x3c,0xd6,0x00,0x94,0x3b,0x6c,0x7e,0x45,0x3c,0xf3,0x2a,0x86,0x3b,0x5c,0xf9,0x80,0x3b,0xa8,0x2f,0x4c,0x3c,0x51,0xcf,0x48,0x3c,0x3b,0xab,0x01,0x3c,0xa1,0x48,0x71,0x3c,0xbd,0x1a,0xe5,0x3a,0x7c,0xeb,0x12,0x3c,0xdf,0x00,0xec,0x3b,0x34,0x48,0x0b,0x3c,0xce,0x6c,0x21,0x3c,0x92,0x5b,0x23,0x3c,0x18,0x00,0x00,0x00,0x99,0xd7,0x75,0x3f,0x18,0xd7,0x7f,0x3f,0x76,0x92,0x80,0x3f,0x4b,0x60,0x60,0x3f,0xc9,0x45,0xa7,0x3f,0x5f,0x4f,0x45,0x3f,0x35,0x30,0x60,0x3f,0x32,0x3d,0x9a,0x3f,0xa7,0x2f,0x38,0x3f,0xb8,0x04,0xa8,0x3f,0xd4,0xd8,0x12,0x3f,0x25,0x87,0x59,0x3f,0x9d,0x1e,0x05,0x3f,0xd2,0xee,0xff,0x3e,0x49,0x97,0xca,0x3f,0xb2,0x3d,0xc7,0x3f,0x66,0x33,0x21,0x3f,0x10,0x66,0xef,0x3f,0x5d,0x34,0x62,0x3e,0x85,0x18,0x68,0x3f,0x23,0x76,0x58,0x3f,0xd5,0x4e,0x4c,0x3f,0xf4,0x29,0xa0,0x3f,0xca,0x23,0x80,0x3f,0x18,0x00,0x00,0x00,0x8c,0x8f,0x7a,0xbf,0x25,0x3f,0x54,0xbf,0xa2,0xf6,0x63,0xbf,0x70,0xb2,0x89,0xbf,0x2b,0x02,0xa1,0xbf,0x8a,0x33,0x3a,0xbf,0x7c,0xfa,0x5c,0xbf,0xc8,0x3f,0x08,0xbf,0xa4,0xc8,0xb1,0xbf,0xdb,0xbe,0x63,0xbf,0x9b,0x0f,0x0d,0xbf,0x6f,0xf3,0xc3,0xbf,0x6c,0x7a,0xd2,0xbe,0xf9,0x8a,0xec,0xbe,0x0a,0xf9,0x2b,0xbf,0xcf,0xfa,0x31,0xbf,0xe5,0xa7,0x80,0xbf,0x70,0x75,0x39,0xbf,0x88,0x50,0x63,0xbe,0xa5,0xc5,0x91,0xbf,0xdd,0x28,0x6a,0xbf,0xa4,0x31,0x8a,0xbf,0xd8,0xb9,0x8d,0xbf,0xdb,0x14,0xa2,0xbf,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x30,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6a,0x4c,0xff,0xff,0x00,0x00,0x00,0x09,0xcc,0x02,0x00,0x00,0x2c,0x00,0x00,0x00,0x5c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x5c,0x4c,0xff,0xff,0xdc,0x01,0x00,0x00,0x64,0x01,0x00,0x00,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x38,0xe8,0x04,0x3b,0x33,0x50,0x4a,0x3b,0x46,0x36,0x7f,0x3a,0xf3,0xa6,0x6c,0x3a,0x56,0xaa,0xab,0x3b,0xad,0x00,0xff,0x3a,0x69,0x01,0x10,0x3c,0xb2,0x95,0x0a,0x3b,0xfd,0xd6,0x21,0x3b,0xb6,0x65,0x37,0x3b,0x97,0xe0,0x8f,0x3b,0x0b,0x06,0x9d,0x3a,0xc2,0x5a,0x30,0x3b,0xf8,0xd2,0xe5,0x3b,0x09,0x0a,0x8f,0x3a,0x44,0x3e,0x17,0x3c,0xde,0x8e,0x02,0x3b,0x2b,0x6b,0x4d,0x3b,0x34,0xb6,0x0e,0x3a,0xe6,0x07,0x27,0x3b,0x2c,0x6a,0x19,0x3b,0x1b,0x87,0x25,0x3b,0xa8,0x61,0x21,0x3b,0xb0,0xcd,0x46,0x3b,0x17,0xd4,0xd8,0x3a,0x6a,0x1e,0xe9,0x3a,0x18,0x5f,0xc2,0x3a,0x75,0xd6,0xa4,0x3a,0x1c,0x00,0x00,0x00,0x68,0xde,0x83,0x3e,0xef,0x4e,0xc6,0x3e,0xd9,0x37,0xfd,0x3d,0x96,0xc9,0xab,0x3d,0x9e,0xd9,0xb7,0x3e,0xac,0x02,0x7d,0x3e,0x66,0xe1,0x8e,0x3f,0x87,0x80,0x89,0x3e,0x4f,0x93,0xa0,0x3e,0xc8,0xb2,0xb2,0x3e,0xd6,0xc0,0x0e,0x3f,0xff,0xcb,0x1b,0x3e,0x1e,0x80,0xac,0x3e,0x52,0x07,0x64,0x3f,0xf5,0xeb,0x0d,0x3e,0xa5,0x60,0x7d,0x3f,0x3d,0xf0,0x57,0x3e,0x55,0xd0,0xcb,0x3e,0xb9,0x5d,0x79,0x3d,0x40,0x0e,0xdc,0x3d,0x05,0x38,0x70,0x3e,0xc3,0x12,0x6c,0x3e,0xe5,0x1e,0xa0,0x3e,0x1e,0x0d,0x91,0x3e,0xae,0xf0,0x9d,0x3d,0x2d,0x4c,0x67,0x3e,0xf3,0x8c,0x1e,0x3e,0xfb,0x8f,0xf7,0x3d,0x1c,0x00,0x00,0x00,0x3f,0x93,0x21,0xbe,0x93,0xbb,0xc8,0xbe,0x58,0x9e,0xca,0xbd,0xa5,0xcd,0xea,0xbd,0x01,0x53,0x2a,0xbf,0xa9,0xba,0x6b,0xbe,0x63,0x43,0x83,0xbf,0x74,0xd1,0x66,0xbe,0x21,0x56,0x95,0xbe,0xeb,0xf6,0xb5,0xbe,0x6f,0xfd,0xcd,0xbe,0x9f,0x8e,0xd6,0xbd,0x0c,0xfa,0xae,0xbe,0xad,0xd8,0x34,0xbf,0xd8,0xd9,0x09,0xbe,0xc7,0x0f,0x96,0xbf,0xc0,0x89,0x81,0xbe,0xa1,0x7b,0xae,0xbe,0xc8,0x98,0x8d,0xbd,0xd6,0xb9,0xa5,0xbe,0x58,0x37,0x98,0xbe,0x0d,0x3c,0xa4,0xbe,0x43,0x10,0x85,0xbe,0x15,0x40,0xc5,0xbe,0x6f,0x22,0x57,0xbe,0x48,0x6a,0x62,0xbd,0x5a,0xda,0x40,0xbe,0xc8,0x8c,0x23,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x34,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x52,0x4f,0xff,0xff,0x00,0x00,0x00,0x09,0x3c,0x01,0x00,0x00,0x2b,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x4f,0xff,0xff,0x9c,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x89,0x00,0xc8,0x3c,0xae,0x2a,0x29,0x3b,0x3f,0x0b,0xf5,0x3c,0x1f,0x02,0x40,0x3d,0xc9,0x2f,0xf0,0x3c,0xda,0x64,0x55,0x3d,0x1c,0x42,0x91,0x3c,0x78,0xd1,0x46,0x3c,0x08,0x00,0x00,0x00,0x4d,0x9f,0xff,0x3e,0x85,0x09,0x05,0x3d,0xf5,0xd0,0x2a,0x3e,0x9c,0x03,0xef,0x3f,0x66,0x61,0x24,0xbe,0x10,0xba,0xd3,0x40,0x98,0x1f,0x10,0x40,0xd5,0x43,0xc5,0x3f,0x08,0x00,0x00,0x00,0x88,0x70,0x46,0xc0,0x59,0xd8,0xa7,0xbe,0x29,0x21,0x73,0xc0,0x1b,0x82,0xbe,0xc0,0x69,0x4f,0x6e,0xc0,0x56,0xcc,0x2b,0xc0,0xa8,0xa8,0x9d,0xbf,0x98,0x03,0xd1,0xbe,0x60,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x32,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xaa,0x50,0xff,0xff,0x00,0x00,0x00,0x09,0xec,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x9c,0x50,0xff,0xff,0x60,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4d,0x99,0xfa,0x3b,0x9a,0x9a,0x13,0x3b,0x26,0x8a,0xa9,0x3b,0x78,0x6c,0x1e,0x3b,0x04,0x00,0x00,0x00,0x1a,0xa4,0x78,0x3f,0x65,0x73,0x92,0x3e,0xa0,0xcb,0xfd,0x3e,0x9f,0x2f,0x9d,0x3e,0x04,0x00,0x00,0x00,0x8f,0x67,0x2e,0xbf,0xb6,0xaf,0x5e,0xbc,0x12,0x37,0x28,0xbf,0xf3,0x2e,0xc1,0xbc,0x5f,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0xb2,0x51,0xff,0xff,0x00,0x00,0x00,0x09,0x8c,0x01,0x00,0x00,0x29,0x00,0x00,0x00,0x20,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xa4,0x51,0xff,0xff,0xe0,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x83,0xcf,0x3a,0x3b,0xfb,0x42,0x3d,0x3c,0x8d,0x8b,0x38,0x3b,0x6d,0x4e,0xc9,0x3b,0x68,0xc3,0x0d,0x3a,0x8a,0x66,0xc6,0x3b,0xcf,0xdc,0x42,0x3c,0x2f,0x5a,0xc3,0x3c,0x5b,0xbc,0xca,0x3b,0x4c,0x3a,0xa8,0x3a,0xcf,0x05,0x8d,0x39,0x54,0x29,0x48,0x3a,0x0c,0x00,0x00,0x00,0xe4,0x59,0xb9,0x3e,0x0f,0x19,0x3b,0xbe,0x5f,0xb7,0x34,0xbc,0x0a,0x48,0xac,0xbc,0xe1,0xa7,0x8c,0x3d,0x75,0x9c,0x08,0xbd,0xa0,0xf0,0xb4,0x3c,0x39,0xcc,0x4e,0xbe,0x0f,0x9c,0xc4,0xbc,0x53,0xd1,0x28,0x3d,0xc3,0xeb,0x0b,0x3d,0x01,0x99,0xc6,0x3d,0x0c,0x00,0x00,0x00,0x97,0x6a,0xd6,0xbc,0x75,0xc8,0xbb,0xbf,0x76,0x1a,0xb7,0xbe,0xd0,0xbb,0x47,0xbf,0x8e,0xe2,0x08,0x3c,0xbd,0xd9,0x44,0xbf,0x15,0x57,0xc1,0xbf,0x7b,0xd3,0x41,0xc0,0xe2,0x26,0x49,0xbf,0xd7,0xe9,0x26,0xbe,0x6a,0x42,0xc4,0xbb,0xbd,0x69,0xad,0xbc,0x5f,0x00,0x00,0x00,0x43,0x6f,0x6e,0x76,0x32,0x44,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x2f,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x43,0x6f,0x6e,0x76,0x32,0x44,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5a,0x53,0xff,0xff,0x00,0x00,0x00,0x02,0xd0,0x07,0x00,0x00,0x28,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0x55,0xff,0xff,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x46,0x7d,0x39,0xf9,0x18,0x81,0x39,0xd2,0x2c,0x48,0x39,0xb0,0x07,0x72,0x39,0x8c,0x6f,0x81,0x39,0xa1,0x51,0x37,0x39,0xff,0x02,0xf9,0x38,0xa9,0x91,0x7a,0x39,0xc8,0xd3,0x0f,0x39,0x42,0x3b,0x84,0x39,0x8e,0x31,0x48,0x39,0xa6,0x72,0x86,0x39,0x13,0x0e,0x1f,0x39,0x65,0x68,0x7a,0x39,0xc6,0xab,0x31,0x39,0xc3,0x96,0x33,0x39,0x36,0xe2,0x2a,0x39,0xc9,0x56,0x75,0x39,0xf4,0x48,0xf1,0x38,0x85,0x71,0x83,0x39,0x3c,0x8a,0x8a,0x39,0x8f,0x93,0x49,0x39,0xe4,0x6b,0x1c,0x39,0x19,0xb1,0x14,0x39,0x3d,0xf1,0x68,0x39,0x3a,0xaa,0x6e,0x39,0xcc,0x85,0x37,0x39,0x60,0x13,0xbb,0x39,0x18,0x32,0x0a,0x39,0x61,0x49,0x39,0x39,0xfb,0x06,0x1d,0x39,0x0f,0x34,0x18,0x39,0x50,0xad,0x2c,0x39,0x61,0xcd,0x5e,0x39,0xde,0x9f,0x75,0x39,0x91,0x98,0x7d,0x39,0xaf,0xa9,0x25,0x39,0xd5,0xcd,0x67,0x39,0x36,0x32,0x32,0x3c,0x44,0x99,0x59,0x39,0xb4,0x2a,0x6b,0x39,0xb3,0xfc,0x48,0x39,0x96,0xf1,0x8f,0x39,0xcd,0xdf,0xab,0x39,0xfa,0x41,0xaa,0x39,0xf6,0xfa,0x8c,0x39,0x80,0x5d,0x3f,0x39,0xbd,0xaa,0x29,0x39,0xb2,0x3f,0xc5,0x39,0xfd,0xd6,0x6a,0x39,0x5f,0x31,0x8e,0x39,0x11,0x25,0x4d,0x39,0x84,0x74,0x25,0x39,0x5e,0xef,0x7e,0x39,0xc4,0x9c,0x61,0x39,0xcd,0xba,0xf5,0x38,0xd7,0x21,0xb6,0x3a,0xce,0xcc,0x12,0x39,0xc3,0xf2,0x38,0x39,0x65,0x1d,0x05,0x39,0x7f,0x81,0x46,0x39,0x53,0xde,0x8e,0x39,0xe4,0x1a,0x8b,0x39,0xb3,0xeb,0xb4,0x39,0x6a,0x8d,0x35,0x39,0x85,0x7a,0x3e,0x39,0x80,0xb2,0x62,0x39,0xee,0x39,0x97,0x39,0xa4,0xce,0x14,0x39,0xd5,0x25,0x72,0x39,0x9e,0xde,0x70,0x39,0xf1,0xf5,0x70,0x39,0xb2,0x25,0x4d,0x39,0x18,0xc0,0xc3,0x39,0x9c,0xd0,0x8d,0x39,0x8f,0xef,0x63,0x39,0x45,0x5f,0x92,0x39,0x7c,0x67,0xa9,0x39,0x43,0xe7,0x5b,0x39,0xbc,0xe0,0x00,0x3a,0x9b,0xe5,0x97,0x39,0xae,0x11,0x82,0x39,0xc0,0xe6,0x7f,0x39,0x26,0x99,0x2c,0x39,0x6e,0x00,0xab,0x39,0x4f,0xf7,0xc6,0x38,0xba,0x6b,0x3e,0x39,0xe7,0x3c,0xd4,0x39,0xda,0xa7,0x28,0x3a,0x02,0x4a,0x70,0x39,0x80,0x1d,0xb2,0x39,0x06,0x2d,0x5b,0x39,0xed,0x92,0x29,0x39,0x2c,0xb9,0x42,0x39,0x40,0x14,0x9b,0x39,0xf1,0x29,0x8b,0x39,0x94,0xe0,0x85,0x39,0x0e,0x14,0x15,0x3a,0x89,0xdc,0x9a,0x39,0x2b,0xe8,0x0a,0x39,0x46,0xee,0xef,0x38,0xb2,0xcb,0x94,0x39,0xa3,0xbd,0x86,0x39,0x33,0x5e,0x3a,0x39,0x1b,0x34,0x56,0x39,0xe0,0x5c,0x26,0x39,0x34,0xe3,0x34,0x39,0x5b,0x2e,0x1a,0x39,0x8c,0x94,0x6b,0x39,0xf7,0xdd,0x06,0x39,0xa1,0x53,0x3d,0x3b,0x36,0x0f,0x08,0x39,0x97,0x51,0xe8,0x38,0xed,0x59,0x56,0x39,0xa8,0x34,0x2b,0x39,0x03,0x9a,0x1e,0x39,0x8a,0x26,0x86,0x39,0xf6,0x4d,0x34,0x39,0x35,0xf5,0xa2,0x39,0x27,0xa7,0x83,0x39,0xb3,0x22,0x28,0x39,0xc2,0x09,0xb7,0x39,0x23,0x41,0x8c,0x39,0xd0,0x37,0x64,0x39,0x9a,0x7a,0xe0,0x38,0xf7,0x9c,0x88,0x39,0x73,0x4c,0x9c,0x39,0x3d,0x34,0x2f,0x39,0xc3,0x6d,0x5e,0x39,0xb7,0x5c,0xe1,0x38,0xf3,0x6c,0x88,0x39,0xb9,0xf9,0x15,0x39,0x70,0x77,0x38,0x39,0xfd,0x98,0x33,0x39,0x7e,0x8a,0x84,0x39,0xe7,0xf6,0x02,0x39,0x59,0x7c,0x91,0x39,0x03,0xf6,0x9d,0x39,0xb3,0x94,0x92,0x39,0x27,0x8d,0x2d,0x39,0x9b,0x7d,0x27,0x39,0xba,0x6c,0xae,0x39,0x6d,0xc7,0x90,0x39,0xaf,0x50,0x75,0x39,0x3d,0xa5,0x61,0x39,0x2c,0x99,0x6d,0x39,0x66,0xf9,0x1f,0x39,0xbb,0x0b,0x91,0x39,0x0e,0xea,0x60,0x39,0xd6,0xd4,0xc5,0x39,0xd3,0xd9,0xdd,0x39,0xc5,0xcc,0x92,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x3a,0x5b,0xff,0xff,0x00,0x00,0x00,0x02,0xd0,0x07,0x00,0x00,0x27,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0x5d,0xff,0xff,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xec,0x52,0x1f,0x39,0x85,0xc0,0x7a,0x39,0x75,0x3e,0xc6,0x38,0x6b,0x9d,0x4a,0x39,0xfc,0xd0,0x1c,0x39,0x37,0x07,0x31,0x39,0x03,0x6e,0x64,0x39,0x6a,0xe7,0x1f,0x39,0xef,0x8b,0x72,0x39,0x71,0x85,0x4f,0x39,0xa6,0x03,0x36,0x39,0x6f,0xee,0x92,0x39,0xe6,0x4a,0x4a,0x39,0x02,0x9b,0x22,0x39,0x41,0x8e,0x2e,0x39,0xeb,0x9f,0x78,0x39,0xc7,0xd6,0x4e,0x39,0xa3,0x13,0x74,0x39,0x1d,0xf7,0x1c,0x39,0x13,0x2a,0x2a,0x39,0x08,0x5a,0x29,0x39,0x43,0xb5,0x63,0x39,0xf6,0x5c,0x49,0x39,0x07,0x79,0x28,0x39,0x99,0x35,0x9a,0x39,0x58,0x40,0x1d,0x39,0x62,0xf8,0x52,0x39,0x9d,0x01,0x2d,0x39,0x5d,0x5d,0x5b,0x39,0x11,0x28,0x2b,0x39,0xc7,0x00,0x1d,0x39,0x50,0xd8,0x36,0x39,0x8f,0x2b,0x45,0x39,0x7d,0x39,0x2b,0x39,0xbf,0x08,0x33,0x39,0xae,0x60,0x47,0x39,0x2f,0x67,0x57,0x39,0xf0,0x8d,0x38,0x39,0x2e,0x15,0x55,0x38,0xfb,0x5c,0x57,0x39,0x06,0x6d,0x65,0x39,0x02,0x6d,0x59,0x39,0x6d,0xb9,0x2a,0x39,0x51,0xc5,0x82,0x39,0xdf,0x4a,0x32,0x39,0x16,0xdb,0x3c,0x39,0x26,0x2d,0x14,0x39,0xfc,0x0a,0x8d,0x39,0xc1,0x19,0x4c,0x39,0x86,0xfd,0x71,0x39,0x71,0x6b,0x63,0x39,0xac,0x6b,0x0b,0x39,0x0e,0x26,0x52,0x39,0x50,0xa9,0xf7,0x38,0x56,0x9c,0x0f,0x39,0xe0,0x6d,0x47,0x39,0xe5,0x32,0xd6,0x37,0x75,0xce,0x40,0x39,0x75,0xf5,0x98,0x39,0x97,0x0c,0x5e,0x39,0xef,0x9a,0x59,0x39,0x01,0x8a,0x24,0x39,0x96,0xd6,0x10,0x39,0x7b,0x98,0x47,0x39,0xb4,0xe1,0x3a,0x39,0x72,0x08,0x31,0x39,0x85,0xf4,0x18,0x39,0xf6,0xaf,0xfe,0x38,0xaf,0x41,0x78,0x39,0xc4,0xf9,0x34,0x39,0xe4,0xf0,0x7e,0x39,0x99,0xf4,0x47,0x39,0x26,0x6b,0x72,0x39,0xfd,0xe1,0x4f,0x39,0x7c,0xbe,0x5a,0x39,0x6e,0x55,0x1b,0x39,0xe9,0x5e,0x6c,0x39,0x97,0x4e,0x58,0x39,0xcc,0x81,0x39,0x39,0x27,0x59,0x17,0x39,0xdd,0x2b,0x1d,0x39,0x8c,0xb7,0x4c,0x39,0x7d,0xc4,0x16,0x39,0x70,0xb8,0x2b,0x39,0xf5,0x8a,0x6a,0x39,0xf4,0x96,0x33,0x39,0xb6,0x08,0x38,0x39,0xc6,0xbe,0x48,0x39,0x02,0x3a,0x09,0x39,0xc7,0x56,0xa6,0x39,0xa8,0x35,0x19,0x39,0x00,0x74,0x1c,0x39,0x2b,0x8d,0x75,0x39,0xfe,0x75,0x4e,0x39,0x9d,0x2a,0x3d,0x39,0xd5,0x2e,0x71,0x39,0x2e,0x7f,0x24,0x39,0xe6,0xe6,0x2d,0x39,0xcb,0xcc,0xcb,0x38,0x8f,0x97,0x46,0x39,0x13,0x4f,0x62,0x39,0x41,0xd4,0x6c,0x39,0x81,0x20,0x1e,0x39,0x78,0xe3,0x2b,0x39,0x68,0x0a,0x3c,0x39,0x4d,0x1c,0x63,0x39,0x81,0xc0,0x2e,0x39,0x67,0x7b,0x33,0x39,0x8e,0x91,0x37,0x39,0xfb,0x1b,0x45,0x39,0xc8,0x2e,0xe0,0x37,0x32,0xa8,0x6c,0x39,0x4f,0x4e,0x1b,0x39,0xf3,0x74,0x5c,0x39,0xb8,0x34,0x98,0x39,0x3b,0x87,0x2a,0x39,0xc8,0x18,0x02,0x39,0xa8,0x65,0x55,0x39,0x07,0xf5,0x47,0x39,0xbf,0x6b,0x47,0x39,0x95,0x21,0x2e,0x39,0x14,0xf0,0xc3,0x38,0x87,0xb9,0x81,0x39,0xd5,0xf2,0x6a,0x39,0x2f,0x8b,0x57,0x39,0x58,0x12,0x2c,0x39,0xaa,0x5e,0x34,0x39,0x21,0xd7,0x71,0x39,0x0b,0xd3,0x11,0x39,0xe7,0xa5,0x72,0x39,0x1d,0xa0,0x60,0x39,0x0b,0x18,0x31,0x39,0xc2,0x61,0x25,0x39,0x5b,0xfd,0x8e,0x39,0x5e,0x74,0x33,0x39,0x2c,0xa2,0x81,0x39,0x73,0x6e,0x2c,0x39,0xdc,0x77,0x51,0x39,0x41,0x01,0xe4,0x38,0x3d,0x70,0x26,0x39,0x07,0xa6,0x69,0x39,0xee,0x3e,0x29,0x39,0x02,0xb0,0x88,0x39,0xd9,0xb6,0x54,0x39,0x90,0x16,0x60,0x39,0xd1,0x61,0x40,0x39,0x04,0xb9,0x7a,0x39,0x02,0x5e,0x51,0x39,0x9f,0x62,0xf5,0x38,0xaa,0xd1,0xbf,0x38,0x2f,0x1b,0x3a,0x39,0xad,0x24,0xf3,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x1a,0x63,0xff,0xff,0x00,0x00,0x00,0x02,0xd0,0x07,0x00,0x00,0x26,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0x65,0xff,0xff,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x7a,0x51,0x69,0x39,0xad,0xef,0x92,0x39,0xb2,0xb4,0x5e,0x39,0xb2,0x5e,0xdb,0x39,0x2c,0xd2,0x83,0x39,0x9d,0xf2,0x4d,0x39,0xe7,0x09,0x08,0x39,0x05,0xe2,0x57,0x39,0xbe,0xc4,0x83,0x39,0xbe,0x65,0x7c,0x39,0xf4,0x46,0x92,0x39,0xdb,0xa2,0x5c,0x39,0xb9,0x38,0x1d,0x39,0xff,0x95,0xac,0x39,0xf3,0xbc,0x8d,0x39,0xa9,0x2d,0x0a,0x39,0x8a,0x99,0x2d,0x39,0x06,0x17,0x2a,0x39,0x67,0x5f,0xa0,0x38,0x8d,0xf0,0x81,0x39,0xf1,0x0a,0x51,0x39,0x28,0x59,0x19,0x39,0xca,0xe6,0x24,0x39,0x6e,0x24,0x53,0x39,0x2c,0xb5,0xe2,0x38,0x24,0xc1,0x73,0x39,0x78,0x84,0x20,0x39,0xc2,0xaa,0x36,0x39,0xcd,0xa4,0x77,0x39,0xd8,0xe7,0x42,0x39,0x7d,0x54,0x2b,0x39,0xd3,0x58,0xf8,0x38,0x62,0x34,0x66,0x39,0xe9,0x8a,0xa0,0x39,0x29,0x16,0x72,0x39,0x71,0x4a,0x14,0x39,0xf8,0x61,0x1a,0x39,0xc6,0x4e,0xdb,0x39,0xb0,0x7e,0xbb,0x38,0x10,0x49,0x87,0x39,0x52,0xe5,0x43,0x39,0xbd,0x8f,0xa5,0x39,0x1d,0xad,0xf6,0x38,0x73,0x97,0x1d,0x39,0xe5,0xe2,0x45,0x39,0x1a,0x86,0x80,0x39,0x17,0x33,0x1c,0x39,0x88,0xb6,0x27,0x39,0x98,0xba,0x81,0x39,0xb6,0xcc,0x09,0x39,0x7c,0x56,0x30,0x39,0x29,0x56,0x63,0x39,0xed,0x15,0x24,0x39,0x18,0xa1,0x88,0x39,0xa1,0x57,0xa8,0x39,0x21,0xca,0x15,0x39,0x23,0x95,0x77,0x39,0x7c,0x91,0x71,0x39,0x37,0x26,0x7f,0x39,0xf1,0xf5,0x66,0x39,0x0b,0x86,0x77,0x39,0xe5,0xc3,0xe4,0x39,0x3a,0x1c,0x67,0x39,0xe6,0x34,0x90,0x39,0xde,0x29,0x2c,0x39,0x14,0x69,0x75,0x39,0xc0,0xfb,0xf8,0x38,0x49,0xc7,0xb3,0x39,0x7f,0x2c,0x10,0x39,0x4c,0x37,0x59,0x39,0xed,0x80,0xa2,0x39,0x53,0xa1,0x78,0x39,0x21,0x8b,0xf7,0x3b,0xe1,0x3b,0xf1,0x38,0x9a,0x6f,0xef,0x39,0x24,0x53,0x56,0x39,0x70,0x12,0xc9,0x3a,0x2c,0x94,0x4f,0x39,0x97,0x0c,0x6e,0x39,0x88,0x02,0x82,0x39,0x50,0x65,0x70,0x39,0x68,0xd3,0x44,0x39,0x1d,0x9f,0x25,0x39,0x08,0x6c,0x57,0x39,0xa3,0x13,0x7a,0x39,0x7f,0x01,0xd7,0x39,0xd8,0x3f,0xaa,0x39,0x82,0x86,0xa2,0x39,0x3c,0xb6,0x0f,0x39,0xa2,0xd6,0x3c,0x39,0xe1,0xc5,0x77,0x39,0x44,0x20,0x21,0x39,0x30,0xe7,0x28,0x39,0x8a,0xf8,0xa7,0x39,0x94,0x8b,0xe1,0x38,0x8c,0xa2,0xda,0x38,0x58,0x56,0xd2,0x38,0x05,0xb8,0x42,0x39,0xc7,0xd9,0xb2,0x39,0x82,0xe7,0x95,0x39,0x1e,0x42,0x90,0x39,0x57,0xb1,0x97,0x39,0xe7,0xa6,0x9c,0x39,0x45,0xdd,0x84,0x39,0xf8,0x75,0x17,0x39,0x83,0xcf,0x5b,0x39,0x33,0x07,0x16,0x39,0x5e,0x86,0x42,0x39,0x04,0x0a,0xb4,0x39,0x8c,0xcf,0xbb,0x39,0xf6,0x48,0x00,0x39,0x3b,0x1a,0xa0,0x39,0x4f,0xba,0x2e,0x39,0xb9,0x66,0xb7,0x39,0x44,0xb9,0x24,0x39,0x06,0x10,0x33,0x39,0xa4,0x84,0x8c,0x39,0xa4,0x65,0xec,0x38,0x81,0x4f,0x05,0x39,0xd3,0xfe,0xe5,0x39,0x9b,0xc1,0xa0,0x39,0x76,0x1a,0x89,0x39,0x2a,0x90,0x1c,0x39,0x6a,0xf5,0x89,0x39,0xee,0xfa,0x1d,0x39,0x1e,0x48,0x30,0x39,0x94,0xaf,0xe0,0x38,0xa3,0xbe,0x47,0x39,0x0c,0x9f,0x86,0x39,0x87,0xec,0x01,0x39,0x49,0xe6,0x5c,0x39,0x6e,0x1a,0x8d,0x39,0xca,0xc6,0x16,0x39,0x67,0x6f,0xd9,0x39,0xc7,0x7c,0xf5,0x39,0x7d,0x7f,0x46,0x39,0x0c,0x35,0xf5,0x39,0xa4,0xc8,0x6b,0x39,0x01,0x03,0x37,0x39,0xa5,0xcf,0x94,0x39,0x33,0xe5,0x5c,0x39,0x9b,0x03,0x5e,0x39,0xfc,0x12,0x37,0x39,0xd1,0x7c,0xb4,0x39,0xf6,0xfe,0x50,0x39,0xb2,0x75,0x05,0x39,0xae,0xf7,0x15,0x3a,0x56,0xac,0x62,0x3a,0x68,0xcf,0x36,0x39,0x98,0xa9,0xe2,0x39,0x36,0x22,0x36,0x39,0xe3,0x3f,0x93,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xfa,0x6a,0xff,0xff,0x00,0x00,0x00,0x02,0xd0,0x07,0x00,0x00,0x25,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x6d,0xff,0xff,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xbe,0x19,0x8f,0x39,0x34,0x37,0xcd,0x38,0x1f,0x47,0x0a,0x39,0xc8,0x4f,0xf2,0x38,0xec,0x52,0x1a,0x39,0x91,0x2c,0x99,0x39,0x6d,0x53,0x4d,0x39,0xe6,0x48,0x09,0x39,0xc3,0x9e,0x82,0x39,0x3a,0x1a,0x43,0x39,0xb0,0x57,0xb5,0x38,0x0c,0x19,0x31,0x39,0xf0,0x23,0x2c,0x39,0xe9,0x46,0x24,0x39,0x3c,0xc8,0x44,0x39,0x80,0xef,0x35,0x39,0x5b,0xb8,0x3d,0x39,0x30,0x36,0x3c,0x39,0x9d,0x6e,0x74,0x39,0x82,0xbe,0x18,0x39,0x43,0x9a,0x4c,0x39,0x9b,0x32,0x00,0x39,0xd1,0x2c,0x17,0x39,0xcd,0xb3,0x39,0x39,0x28,0xd4,0x27,0x39,0x4b,0x48,0xd7,0x38,0x53,0x51,0x73,0x39,0xdb,0x22,0x2c,0x39,0xbf,0x7e,0x1e,0x39,0x79,0x3f,0x3e,0x39,0x99,0x25,0x81,0x39,0x5c,0x8b,0x59,0x39,0xcc,0x30,0x0f,0x39,0xd1,0x6f,0x19,0x39,0x85,0x50,0x0a,0x39,0x02,0x6a,0x5f,0x39,0xa4,0x42,0x09,0x39,0x84,0x22,0x12,0x39,0x66,0xd6,0xce,0x39,0x09,0x45,0x32,0x39,0xf0,0x32,0x39,0x39,0x51,0xbb,0x34,0x39,0x03,0xea,0x01,0x39,0xcd,0xab,0x33,0x39,0xd1,0x88,0x7a,0x39,0xfc,0xe9,0x29,0x39,0xf6,0x2a,0x22,0x39,0x6d,0x09,0x26,0x39,0x48,0x0d,0x10,0x39,0x73,0xd7,0x39,0x39,0x78,0x0b,0xfb,0x38,0x24,0x9f,0x58,0x39,0xc3,0xc4,0xbd,0x39,0xc0,0x5e,0x29,0x39,0x27,0xd4,0xda,0x38,0x2f,0xc4,0x21,0x39,0x6e,0x2f,0x60,0x39,0x42,0x2a,0x32,0x39,0x77,0x91,0x04,0x39,0x0f,0xf3,0xec,0x38,0x5a,0x60,0x7f,0x39,0xe3,0x53,0x57,0x39,0xa4,0x89,0x1a,0x39,0x5f,0x37,0x23,0x39,0xcf,0xed,0x72,0x39,0x7d,0x3c,0x8a,0x39,0xd2,0x03,0x52,0x39,0x4c,0x0e,0xe2,0x38,0x58,0xe6,0x03,0x39,0x9e,0x32,0x12,0x39,0x67,0xeb,0x60,0x39,0xa0,0x32,0x34,0x39,0x9e,0x54,0x8a,0x37,0x23,0x6b,0x25,0x39,0x52,0x8c,0xeb,0x38,0xea,0xe9,0xbf,0x38,0xd4,0x90,0x33,0x38,0x76,0x25,0x87,0x39,0xe5,0xf0,0x02,0x39,0xc5,0x78,0x11,0x39,0x05,0x84,0xe2,0x38,0x66,0x42,0x2b,0x39,0x8e,0x93,0x46,0x39,0x70,0xbe,0xf2,0x38,0x57,0xd9,0x27,0x39,0xab,0xd6,0x0d,0x39,0x92,0xa6,0x16,0x39,0x51,0x16,0xef,0x38,0x39,0x0a,0x31,0x39,0xdb,0xb9,0x16,0x39,0xdd,0xb1,0x52,0x39,0xec,0x79,0x41,0x39,0xf9,0xed,0x3e,0x39,0x0b,0x86,0x97,0x39,0xb5,0x8a,0x35,0x39,0x3c,0x4f,0x3c,0x39,0xc1,0xa1,0x3f,0x39,0x9e,0x1d,0x98,0x39,0x0b,0x89,0xd0,0x38,0xbd,0xd5,0x75,0x39,0x59,0xc0,0x83,0x39,0x9c,0x3c,0x40,0x39,0x3f,0xdf,0x3c,0x39,0xc9,0x09,0x64,0x39,0xc2,0x54,0x5a,0x39,0xa3,0xcd,0x56,0x39,0x8e,0x39,0x51,0x39,0xd8,0xee,0x66,0x39,0xe6,0xf6,0x29,0x39,0x0a,0xbf,0x40,0x39,0x69,0x9e,0xad,0x39,0x08,0xbf,0xa9,0x38,0xbe,0xfe,0x7c,0x39,0xf9,0x7b,0x00,0x39,0x1e,0xf9,0x76,0x39,0x36,0xde,0x58,0x39,0x5c,0x2a,0xd6,0x38,0x7e,0xa3,0xa4,0x39,0x0e,0xe6,0x49,0x39,0x36,0x0b,0xe1,0x38,0x02,0x60,0xf2,0x38,0x1a,0x98,0x71,0x39,0xaf,0x59,0x95,0x39,0xb5,0xbf,0x5a,0x39,0x8c,0x7e,0x73,0x39,0xfc,0x9c,0xf6,0x38,0xb8,0x4c,0x67,0x39,0x40,0xe9,0x4f,0x39,0xd8,0x7a,0xdb,0x38,0x5b,0xa7,0x64,0x39,0x17,0x41,0xc2,0x38,0xec,0x0d,0xeb,0x38,0x03,0x79,0x5e,0x39,0x23,0xe1,0x3c,0x39,0x3b,0xb7,0xf2,0x38,0xd4,0xc0,0x31,0x39,0xfa,0x80,0x1c,0x39,0x79,0xdb,0x41,0x39,0xa3,0xba,0x23,0x39,0xd6,0x4f,0x63,0x39,0x40,0xc5,0xee,0x38,0x3f,0x2c,0x2e,0x39,0x7b,0x7a,0x73,0x39,0x59,0x01,0x09,0x39,0xaf,0xc5,0x14,0x39,0x0f,0x97,0x5b,0x39,0x59,0xf4,0x23,0x39,0x1b,0x63,0x1c,0x39,0x54,0x70,0x6a,0x39,0xec,0x99,0x08,0x39,0x2d,0xc8,0x23,0x39,0x6a,0x51,0xfa,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0xda,0x72,0xff,0xff,0x00,0x00,0x00,0x02,0xb0,0x06,0x00,0x00,0x24,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xe4,0x74,0xff,0xff,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x44,0xd5,0x41,0x39,0x5b,0x4e,0x11,0x39,0x2e,0xd2,0x98,0x39,0x19,0x83,0x87,0x39,0x3e,0x31,0x4c,0x39,0x62,0x09,0xca,0x39,0x2d,0x2d,0x3d,0x39,0xaa,0xe8,0x6e,0x3a,0xf9,0xd0,0x04,0x39,0xfc,0x54,0x2a,0x39,0xfc,0x2c,0x8e,0x39,0x3b,0x7e,0x28,0x39,0xcc,0xe9,0x2b,0x39,0xeb,0x60,0x71,0x39,0xee,0x95,0x58,0x39,0x70,0x7d,0x2e,0x39,0x34,0xf3,0xf6,0x38,0xc4,0xd6,0x6b,0x39,0x44,0x4c,0x37,0x39,0x1c,0xa6,0x96,0x39,0x9d,0xe4,0x51,0x39,0xde,0xd4,0x88,0x39,0x83,0x4a,0x9b,0x39,0xf3,0x0b,0x72,0x38,0x73,0x94,0x29,0x39,0x98,0xdb,0x6d,0x39,0x10,0x8e,0x29,0x39,0x03,0x9f,0x80,0x39,0xfa,0x61,0x41,0x39,0x62,0x69,0xf1,0x38,0xf3,0x0a,0x54,0x39,0xc2,0x19,0x0a,0x39,0x60,0xa8,0x08,0x39,0xc2,0x6c,0x21,0x39,0x26,0xc5,0x8e,0x38,0x3f,0x01,0x3c,0x39,0x9d,0x03,0xe9,0x39,0x3e,0x0f,0x6c,0x39,0xb6,0x65,0xb8,0x39,0xb3,0xf0,0x86,0x39,0xa2,0x7e,0x36,0x39,0x49,0x20,0xb1,0x39,0x56,0xda,0x41,0x39,0x06,0x43,0x4f,0x39,0x8e,0x18,0x34,0x39,0x31,0x5d,0x05,0x3c,0xb1,0x4b,0x2d,0x39,0xb0,0x6c,0x44,0x39,0x56,0x5c,0x61,0x39,0xc4,0x5b,0x57,0x39,0x76,0xbd,0x2e,0x39,0x3c,0x9d,0x3b,0x39,0xf4,0x8c,0xe4,0x38,0x74,0x76,0x31,0x39,0xf0,0xe9,0x37,0x39,0x4f,0x2b,0x7b,0x39,0xfc,0x3a,0x60,0x39,0x88,0x11,0xc2,0x39,0x5e,0xec,0x54,0x39,0x17,0x80,0x01,0x39,0xcb,0x21,0x09,0x39,0x8e,0x1c,0x8f,0x39,0x4e,0x79,0x23,0x39,0x89,0xd6,0x0f,0x39,0x9b,0x4b,0xee,0x38,0x60,0xab,0x9a,0x39,0x1b,0xc5,0xfc,0x38,0xef,0x23,0x1e,0x39,0xe3,0x2f,0x95,0x39,0xf3,0x1e,0xea,0x38,0xd3,0x12,0x39,0x39,0x68,0x20,0x61,0x39,0xe4,0x8e,0x18,0x39,0x1b,0xf3,0x2c,0x39,0x07,0xd3,0x1f,0x39,0x9e,0x7c,0x92,0x39,0x91,0x5f,0xd0,0x38,0x6b,0x3b,0x71,0x39,0xa4,0x2b,0x2f,0x39,0x7f,0x94,0x32,0x39,0x4d,0x75,0xa7,0x39,0xd3,0x02,0x61,0x39,0xf3,0x05,0xf8,0x38,0x77,0x0d,0xc8,0x38,0x21,0x9f,0x24,0x39,0x4a,0x68,0x11,0x39,0x3b,0x29,0x40,0x39,0x1d,0xea,0xb8,0x38,0xa7,0xb8,0x1e,0x39,0x21,0x74,0x35,0x39,0x5b,0x67,0x24,0x39,0x3d,0xc8,0x91,0x39,0x14,0x37,0x7a,0x39,0x90,0xd5,0x9d,0x39,0xc9,0xb2,0x4b,0x39,0xf1,0xf5,0x04,0x39,0xd9,0xa1,0x44,0x39,0xb9,0x7b,0x41,0x39,0xe7,0x4a,0x02,0x39,0x62,0xa9,0x14,0x39,0x85,0x25,0x2f,0x39,0x8d,0x27,0x19,0x39,0x90,0x2f,0x9f,0x38,0x96,0x1c,0x0d,0x39,0x2d,0xc3,0x09,0x39,0x9b,0x42,0x5f,0x39,0x2d,0xc1,0x17,0x39,0x3d,0x4e,0xaa,0x39,0xab,0xb0,0x40,0x39,0xe4,0xb1,0x4c,0x39,0xcb,0x30,0xa7,0x39,0x9a,0x58,0x57,0x39,0xb9,0x1b,0x2b,0x39,0x15,0xc9,0x13,0x39,0x43,0x09,0x63,0x39,0x0d,0xf8,0x02,0x39,0x12,0xd1,0x6d,0x39,0xc5,0xb4,0x23,0x39,0x2a,0xf1,0xb1,0x38,0x64,0x6d,0x26,0x39,0x10,0xce,0x96,0x39,0x4d,0x91,0x48,0x39,0xed,0x94,0x5b,0x39,0x18,0x9d,0x0d,0x39,0x8b,0xc5,0xa9,0x39,0x55,0x9b,0x7a,0x39,0xa1,0x8c,0xfd,0x38,0xac,0x6e,0x43,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x9a,0x79,0xff,0xff,0x00,0x00,0x00,0x02,0xb0,0x06,0x00,0x00,0x23,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0xa4,0x7b,0xff,0xff,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0c,0x0d,0xb0,0x39,0x37,0xe8,0x42,0x39,0x5a,0xb1,0xd2,0x39,0xea,0x33,0x68,0x39,0x89,0x44,0x91,0x39,0x4e,0x68,0x9f,0x39,0x46,0x97,0x9a,0x39,0x96,0x65,0x32,0x39,0xac,0x0f,0x8d,0x39,0xbf,0x7c,0xa3,0x39,0x9a,0xbe,0xc0,0x39,0x0a,0x60,0x78,0x39,0x33,0xb9,0x5a,0x39,0xd8,0x7a,0x71,0x39,0x4d,0x55,0xa3,0x39,0xd9,0x89,0x53,0x39,0x7e,0x79,0xd1,0x39,0xce,0x6f,0xa6,0x39,0x78,0x56,0x99,0x39,0xcc,0xe8,0xae,0x39,0x83,0x08,0x48,0x39,0x21,0x97,0x0a,0x39,0x85,0x58,0xa1,0x39,0x77,0xe5,0xd9,0x3a,0x57,0xac,0x43,0x39,0x43,0x24,0x58,0x39,0xcf,0x53,0x67,0x39,0x8e,0xda,0xaa,0x39,0x5e,0x5f,0x84,0x39,0x00,0x5b,0x3b,0x3a,0xd6,0xea,0xaa,0x39,0xf8,0xb7,0x02,0x3a,0x72,0xa1,0xb9,0x39,0x6c,0x04,0x9f,0x39,0x02,0x76,0x65,0x3a,0x37,0xf6,0xed,0x39,0xf6,0x61,0x8c,0x39,0xd4,0x48,0x80,0x39,0x72,0xc0,0x57,0x39,0xa9,0x67,0x5f,0x39,0xf8,0x2f,0x06,0x3a,0x78,0x43,0xb7,0x39,0x87,0x63,0xac,0x39,0xe1,0xdb,0x95,0x39,0x4d,0xcc,0x43,0x39,0x08,0x87,0x45,0x38,0x3a,0xaa,0x38,0x39,0x58,0x79,0xdc,0x39,0x80,0x27,0x9c,0x39,0x90,0x7d,0x83,0x39,0xd2,0xe6,0xa7,0x39,0x4a,0x11,0x94,0x39,0x0f,0x39,0x55,0x39,0x24,0x21,0x12,0x3a,0x83,0x47,0x2f,0x39,0xd5,0xeb,0x9c,0x39,0x3d,0xad,0x79,0x39,0xd3,0xa2,0xd9,0x39,0xd2,0x6c,0xc4,0x39,0xcc,0xe1,0x91,0x39,0x65,0xb5,0x8d,0x39,0x3b,0xb2,0x9a,0x39,0x52,0xd3,0xb7,0x39,0xaf,0x73,0x7f,0x39,0x1e,0xc2,0x20,0x3a,0x2a,0x08,0x7b,0x39,0xcf,0xa1,0xdd,0x39,0xad,0xe8,0x92,0x39,0xb2,0xd8,0x82,0x39,0x15,0x42,0xbc,0x39,0x73,0xf5,0x93,0x39,0xf1,0xad,0x7c,0x39,0xcc,0xbf,0x53,0x39,0x36,0xa2,0xf4,0x39,0x14,0xb8,0xad,0x39,0x8c,0x3d,0x8d,0x39,0x95,0x1c,0x8c,0x39,0x65,0x7d,0x87,0x39,0x0f,0xfb,0xbe,0x39,0x5f,0x66,0x81,0x39,0x44,0x13,0x99,0x39,0xae,0xcd,0xca,0x39,0x47,0xdd,0x5d,0x39,0xb6,0x67,0x53,0x39,0x6d,0x02,0x98,0x39,0x85,0x4f,0x02,0x3a,0xfd,0x31,0xd8,0x39,0xa4,0xa9,0x15,0x3a,0x1f,0xb9,0x61,0x39,0x7b,0x08,0x7d,0x39,0xce,0x67,0x9a,0x39,0xdb,0xb6,0x87,0x39,0x8e,0xd5,0x8c,0x39,0xb7,0xee,0xa4,0x39,0x54,0x1b,0x94,0x39,0xc5,0xae,0x46,0x3a,0x1f,0xed,0xe5,0x39,0xd8,0xaa,0x3a,0x39,0x47,0x9d,0x60,0x39,0x53,0xc5,0xcf,0x39,0xc3,0x9d,0x53,0x39,0xf9,0x18,0x87,0x39,0xf4,0x9a,0x84,0x39,0x61,0xb5,0xa8,0x39,0xeb,0x80,0x30,0x39,0xc1,0xac,0x4f,0x39,0xa2,0x34,0xcd,0x39,0x21,0x96,0xa8,0x39,0xeb,0x8f,0x9f,0x39,0xf9,0x33,0x81,0x39,0xa3,0x10,0xa5,0x39,0xe8,0x18,0x30,0x39,0xc9,0xa7,0xc5,0x39,0x55,0x29,0xdf,0x39,0x37,0x18,0x59,0x39,0x28,0x05,0x74,0x3a,0x7c,0x8c,0xc3,0x39,0x83,0x1b,0xb8,0x39,0xb0,0x95,0xb1,0x39,0xd3,0x84,0x60,0x39,0x64,0x57,0xf8,0x39,0x15,0x7d,0x8d,0x39,0xd2,0xf7,0x27,0x39,0x73,0x2b,0x4e,0x39,0x0c,0xdf,0xb3,0x39,0x33,0xee,0x83,0x39,0x4d,0xee,0x29,0x3a,0x85,0x99,0x38,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x32,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x5a,0x80,0xff,0xff,0x00,0x00,0x00,0x02,0xe0,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0x82,0xff,0xff,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x6b,0x36,0x33,0x39,0x37,0x1d,0x53,0x38,0xfe,0x7c,0xf2,0x38,0xe3,0x96,0x62,0x38,0x83,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x4a,0x81,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x21,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0x83,0xff,0xff,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xf1,0x0f,0x47,0x39,0xdf,0xa9,0x5b,0x39,0xf4,0x57,0x60,0x39,0x73,0x77,0x9f,0x39,0xa7,0xd2,0xd1,0x39,0x0c,0xd2,0x2e,0x3a,0x01,0xfd,0x82,0x39,0xfa,0x47,0x83,0x39,0x53,0x1e,0x6d,0x39,0x39,0x49,0x42,0x39,0x33,0xe3,0xcd,0x39,0x4d,0x0e,0x21,0x39,0x9b,0xdf,0x0a,0x39,0x50,0x60,0xca,0x39,0x85,0xd0,0xb3,0x38,0x9f,0xd0,0xb3,0x39,0x1e,0x9a,0x4b,0x39,0xe6,0x22,0x1b,0x39,0xc0,0x71,0x85,0x39,0x72,0x49,0x28,0x39,0x7a,0xbb,0xc8,0x39,0xf3,0x0c,0x87,0x39,0x17,0xb5,0x95,0x39,0x8f,0x09,0x7e,0x39,0x55,0x5f,0x78,0x39,0x2d,0x44,0x9f,0x39,0x7e,0x20,0x32,0x3a,0x05,0xd9,0xa0,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x5a,0x83,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x20,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0x85,0xff,0xff,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x0e,0x1a,0xa5,0x39,0x36,0x11,0x7e,0x39,0x7b,0xd7,0x6a,0x39,0xd7,0x07,0xaa,0x39,0xd4,0x21,0x43,0x39,0x58,0x29,0xb5,0x39,0x43,0x0e,0x8a,0x39,0x07,0x4b,0x8b,0x39,0x24,0x9e,0x9a,0x39,0x1f,0x80,0x7c,0x39,0x93,0x24,0x89,0x39,0xc4,0x75,0xd7,0x39,0x8b,0x54,0x64,0x39,0x14,0x72,0x4c,0x39,0x94,0x18,0x71,0x39,0x47,0x36,0x5c,0x39,0x33,0x12,0x06,0x3a,0xe3,0xa8,0xc5,0x39,0x49,0x9c,0xa0,0x39,0x38,0xb2,0x71,0x39,0x77,0xde,0x88,0x39,0x04,0xc4,0xa8,0x39,0xda,0xfa,0x92,0x39,0x46,0x91,0x2e,0x39,0xaa,0x45,0x81,0x39,0xbd,0xbc,0x2c,0x39,0xed,0x67,0xa5,0x39,0xae,0x33,0x1c,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x6a,0x85,0xff,0xff,0x00,0x00,0x00,0x02,0xb0,0x06,0x00,0x00,0x1f,0x00,0x00,0x00,0x1c,0x06,0x00,0x00,0x04,0x00,0x00,0x00,0x74,0x87,0xff,0xff,0x0c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x4a,0xe5,0x17,0x38,0x5a,0x48,0xc3,0x37,0x86,0x52,0xa6,0x37,0x53,0x6e,0xcf,0x37,0xfc,0x42,0xd0,0x37,0x7a,0x3d,0xe3,0x37,0xfe,0xa7,0xb4,0x37,0x20,0x7a,0x03,0x38,0xad,0x31,0xbc,0x37,0xf1,0x5f,0xd8,0x37,0xbc,0xb3,0x01,0x38,0x1f,0x38,0xfa,0x37,0xe0,0x40,0xd7,0x38,0x1c,0x92,0x07,0x38,0x74,0xd3,0xea,0x37,0x9d,0x56,0x77,0x38,0xfd,0x78,0xdb,0x37,0x77,0x84,0xc7,0x37,0x62,0x98,0xef,0x37,0x74,0x17,0xbf,0x37,0x27,0xa4,0xc0,0x37,0x73,0x23,0xb5,0x37,0x6d,0xc5,0x14,0x38,0xa2,0x4b,0xba,0x37,0xaf,0x5e,0x67,0x38,0x3d,0xe7,0xdc,0x37,0xa7,0x30,0xdb,0x37,0x8f,0x6b,0x0e,0x38,0x51,0x13,0xc2,0x37,0xdd,0xd3,0x20,0x38,0xfb,0x22,0x02,0x38,0x0a,0x25,0xe8,0x37,0x61,0xd5,0xd7,0x37,0x53,0xb9,0xbe,0x38,0x1f,0x94,0xe0,0x37,0xdd,0xcb,0x02,0x38,0xbd,0x92,0x0b,0x38,0x9d,0xdb,0xab,0x37,0x45,0xe1,0xe9,0x37,0x72,0xbc,0xb0,0x37,0xa3,0xdd,0x0c,0x38,0x98,0x81,0xb2,0x37,0x5a,0xe3,0xec,0x37,0xa6,0xac,0xca,0x37,0xa9,0x58,0x17,0x38,0x88,0xf3,0xf1,0x37,0x05,0xb9,0xcf,0x37,0xf3,0x93,0xb3,0x37,0xb2,0x0b,0x0b,0x38,0xec,0x52,0x09,0x38,0x5c,0x35,0xdf,0x37,0x70,0x06,0xd3,0x37,0x70,0xa4,0xf6,0x37,0x57,0xf6,0xd9,0x37,0xb9,0x8a,0xf7,0x37,0xea,0x0c,0xe1,0x37,0xe6,0x3f,0x97,0x38,0x61,0x03,0x15,0x38,0xac,0xae,0xae,0x37,0x26,0xd9,0xc1,0x37,0x5e,0xf8,0xaf,0x37,0xe1,0xec,0xba,0x37,0xc2,0xea,0x0d,0x38,0x18,0xd0,0xf0,0x37,0xd1,0xae,0xbc,0x37,0xac,0xa9,0xf4,0x37,0xd3,0x3a,0x14,0x38,0x7a,0x0a,0xc6,0x37,0x86,0x5e,0xd8,0x37,0x57,0x96,0xf1,0x37,0xd7,0x72,0xcb,0x37,0x88,0x59,0xc0,0x37,0xd8,0xfc,0xfc,0x37,0x6b,0xc8,0xc2,0x37,0x41,0xa8,0x0b,0x38,0xcf,0xc1,0xb4,0x37,0x45,0x89,0xbb,0x37,0x64,0x53,0x0c,0x38,0x0e,0x66,0xf6,0x37,0x7d,0x82,0xe0,0x37,0x2f,0x9c,0x06,0x38,0x64,0x3d,0x90,0x38,0xd7,0x80,0xbd,0x37,0x45,0xa7,0xba,0x37,0x03,0x80,0x06,0x38,0x4e,0x21,0x05,0x38,0x11,0xf3,0xff,0x37,0x3d,0x58,0xe0,0x37,0xcb,0xed,0xdd,0x37,0x92,0xcf,0x22,0x38,0xda,0x59,0xaf,0x37,0xe1,0x34,0x05,0x38,0xfb,0xb0,0x07,0x38,0xa0,0xf3,0xb5,0x37,0x0f,0x86,0xb4,0x37,0x52,0x75,0x94,0x38,0x71,0x69,0xbe,0x37,0x9e,0xd4,0xb7,0x37,0x5c,0x77,0x11,0x38,0xb8,0x43,0xaa,0x37,0x44,0x91,0x11,0x38,0x10,0x58,0xec,0x37,0xde,0x9e,0xc4,0x37,0x3d,0x26,0xce,0x37,0xd7,0x11,0x14,0x38,0x46,0xa0,0xc6,0x37,0xd7,0x64,0xf0,0x37,0xdf,0xd9,0xbb,0x37,0x50,0x63,0xbf,0x37,0x75,0xc1,0x18,0x38,0x2d,0x1c,0xbc,0x37,0x19,0x91,0x92,0x37,0x38,0xeb,0x0d,0x38,0x65,0x47,0xb9,0x37,0xf0,0xf0,0x03,0x38,0xaa,0xd3,0xcf,0x37,0x64,0xd2,0x07,0x38,0xdc,0x1b,0xfc,0x37,0x6f,0x57,0xf6,0x37,0x83,0xe4,0xcc,0x37,0xe0,0xc9,0x08,0x38,0xa3,0x46,0xa2,0x38,0x9b,0x8e,0xa9,0x37,0xca,0xf6,0xbf,0x37,0x98,0x85,0xae,0x37,0x56,0x4f,0xa7,0x37,0x44,0xe3,0xa6,0x38,0xfa,0x76,0xb6,0x37,0x85,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x2a,0x8c,0xff,0xff,0x00,0x00,0x00,0x02,0x30,0x05,0x00,0x00,0x1e,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x34,0x8e,0xff,0xff,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xde,0x18,0xf4,0x38,0x5e,0x6e,0x02,0x39,0x6d,0x86,0x32,0x39,0xd5,0x99,0xf1,0x38,0x5a,0x1d,0xe0,0x38,0x24,0x17,0x3d,0x39,0x51,0xfe,0x03,0x39,0x7d,0xf5,0x15,0x39,0xdd,0xb4,0x55,0x39,0xc9,0x28,0xfd,0x38,0xba,0x4c,0x47,0x39,0xdb,0xb8,0x0e,0x39,0xda,0x29,0x01,0x39,0x79,0x52,0x0d,0x39,0x6a,0xfa,0x01,0x39,0xcb,0x2d,0x18,0x39,0xe8,0xc8,0x03,0x39,0x13,0xdc,0x4b,0x39,0x5d,0x7a,0xe2,0x38,0x26,0xb3,0x19,0x39,0x76,0xfb,0x39,0x39,0xe6,0x18,0xec,0x38,0x3b,0x2e,0xf3,0x38,0x35,0x69,0x3c,0x39,0x80,0x78,0xdf,0x38,0x54,0x8c,0x23,0x39,0x15,0x5a,0xce,0x38,0xc7,0x24,0xfd,0x38,0x5e,0xc2,0x0a,0x39,0xa8,0x9f,0x1a,0x39,0x81,0x94,0xec,0x38,0x25,0x36,0x24,0x39,0xf6,0xc8,0x15,0x39,0x25,0xf1,0x39,0x39,0xeb,0x0d,0xe7,0x38,0x8b,0xa3,0x41,0x39,0x1c,0xf8,0xe8,0x38,0x98,0xc1,0x0f,0x39,0xf9,0xa1,0x17,0x39,0x28,0x86,0x04,0x39,0x3a,0xaa,0x23,0x39,0x66,0xd7,0x2d,0x39,0x72,0x4f,0xc2,0x38,0x07,0x19,0x15,0x39,0x84,0x05,0x14,0x39,0xbd,0xf2,0xfa,0x38,0x9c,0x31,0x72,0x39,0x68,0x5b,0x11,0x39,0x91,0xa4,0x29,0x39,0x08,0x64,0x58,0x39,0x29,0x02,0x14,0x39,0xd9,0xaa,0x2b,0x39,0x8b,0xf4,0x17,0x39,0xf8,0x74,0xee,0x38,0x30,0xca,0xfb,0x38,0x0a,0x77,0xd3,0x38,0xcf,0xf1,0x0d,0x39,0xc3,0xe9,0x06,0x39,0x49,0xe0,0x30,0x39,0xe7,0xe8,0xec,0x38,0xbc,0xd5,0xff,0x38,0x35,0x09,0x0a,0x39,0x04,0x65,0x44,0x39,0x33,0x9b,0x02,0x39,0x5b,0xeb,0x34,0x39,0x78,0xc7,0x83,0x39,0xc4,0xd9,0x33,0x39,0xe1,0xfd,0x02,0x39,0x27,0xf6,0x01,0x39,0x8f,0x9e,0xd8,0x38,0xe6,0xa3,0x0b,0x39,0x8e,0x1c,0x23,0x39,0xd5,0x0c,0x0f,0x39,0xf2,0xe1,0xf4,0x38,0x6c,0xd3,0xe7,0x38,0x6b,0xc5,0xfe,0x38,0xea,0x15,0x11,0x39,0x67,0xb3,0x18,0x39,0x25,0xb2,0x82,0x39,0x52,0xa1,0x09,0x39,0x53,0x0a,0x11,0x39,0xce,0x89,0x01,0x39,0x33,0xb9,0x0d,0x39,0x40,0x43,0xe0,0x38,0xfb,0x6b,0x36,0x39,0xde,0xe5,0xe6,0x38,0x26,0x93,0x02,0x39,0xb9,0x80,0x2b,0x39,0x53,0x11,0x04,0x39,0x2d,0x2f,0x08,0x39,0xa6,0x60,0xe3,0x38,0x8c,0x88,0x13,0x39,0x8c,0xeb,0x49,0x39,0xde,0xd3,0x10,0x39,0x92,0xf9,0x1a,0x39,0x6c,0xb8,0x18,0x39,0x85,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x30,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x6a,0x91,0xff,0xff,0x00,0x00,0x00,0x02,0x30,0x05,0x00,0x00,0x1d,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x74,0x93,0xff,0xff,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xf4,0x9d,0xbe,0x38,0x77,0x8a,0x54,0x38,0xae,0xbb,0x94,0x38,0x72,0xeb,0x2d,0x39,0xfc,0xa4,0xcb,0x38,0x07,0x7d,0xc3,0x38,0xe8,0x01,0x8a,0x38,0x26,0xd1,0x52,0x39,0xdb,0x25,0xdc,0x38,0x63,0x18,0x89,0x38,0x4f,0x69,0xcc,0x38,0x2f,0xe2,0x2f,0x39,0x33,0x8b,0x2d,0x39,0x94,0x69,0x88,0x38,0xa4,0x21,0xc4,0x38,0x8c,0x86,0x27,0x39,0xf0,0x5e,0xa7,0x38,0xed,0x3a,0x8f,0x38,0xd6,0x9e,0x96,0x38,0xa3,0xff,0x87,0x38,0xdf,0xe5,0x26,0x39,0xc9,0x14,0xd1,0x38,0xf9,0x96,0x9c,0x38,0xe4,0x5f,0xa4,0x38,0x55,0xf5,0xdd,0x38,0x00,0xc1,0xe6,0x38,0x8d,0xdc,0x28,0x39,0xf1,0x88,0x94,0x38,0xff,0x0a,0x90,0x38,0xfd,0xdf,0x9e,0x38,0x6a,0x69,0x85,0x38,0x06,0x62,0x12,0x39,0xe3,0xea,0xf5,0x38,0x3f,0xc9,0xfb,0x38,0xbc,0xa9,0x8a,0x38,0x53,0xda,0xe5,0x38,0xc9,0x85,0x27,0x39,0xec,0x6e,0xaa,0x38,0xfa,0x88,0xb2,0x38,0x2e,0x37,0x9c,0x38,0xe5,0x59,0x83,0x39,0x90,0xe9,0x9d,0x38,0xe4,0x72,0xa9,0x38,0x7a,0x18,0xa4,0x38,0x1a,0x6e,0x92,0x38,0x0d,0x40,0x14,0x39,0x88,0xf5,0x6f,0x38,0x38,0x11,0xa4,0x38,0xeb,0x25,0xc9,0x38,0x6f,0x4c,0xee,0x38,0x58,0x68,0xc8,0x38,0xa6,0x62,0x2c,0x39,0x86,0xdb,0xb0,0x38,0x1d,0xea,0x2c,0x39,0x0e,0x6b,0x98,0x38,0x4c,0x7e,0x3c,0x39,0xeb,0x07,0x87,0x38,0x8a,0x96,0x81,0x38,0x5a,0xe0,0xd0,0x38,0xdc,0x8f,0x9a,0x38,0x40,0xfc,0x8c,0x38,0x32,0xdf,0x79,0x38,0xf5,0x82,0xe8,0x38,0x6d,0xce,0xb8,0x38,0x99,0x1c,0x3e,0x39,0x43,0x41,0x72,0x38,0x8d,0x52,0x7f,0x39,0x5e,0x50,0xa6,0x38,0x1d,0x27,0x9c,0x38,0x40,0x71,0xa9,0x38,0x96,0xba,0x9c,0x38,0x05,0x2a,0x98,0x38,0x99,0x03,0x92,0x38,0xe7,0x41,0x96,0x38,0xa1,0xfa,0x81,0x38,0x31,0xcd,0x8f,0x38,0xce,0x07,0xe0,0x38,0x30,0x7a,0x8a,0x38,0x63,0xb0,0x9c,0x38,0x64,0xbe,0x95,0x38,0xcf,0x6b,0x23,0x39,0x9d,0xaf,0xb6,0x38,0x3d,0x8e,0x87,0x38,0xa7,0x2e,0x4d,0x38,0xb9,0x13,0x58,0x39,0x61,0x7f,0x23,0x39,0x3f,0x3e,0xc3,0x38,0x34,0x0a,0xc2,0x38,0x41,0x31,0xb0,0x38,0x58,0x6a,0x99,0x38,0x57,0x04,0x2f,0x39,0x23,0x39,0x40,0x39,0x45,0x88,0x2e,0x39,0x45,0x06,0x7c,0x39,0x71,0x86,0x9c,0x38,0xd9,0xe9,0xc1,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xaa,0x96,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x1c,0x00,0x00,0x00,0x6c,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0x98,0xff,0xff,0xec,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xf6,0x5f,0xfd,0x39,0x91,0x6b,0x2b,0x39,0x1d,0x6b,0xc9,0x39,0x1d,0x79,0x50,0x3a,0x96,0xf9,0x84,0x39,0xa6,0xb0,0xca,0x39,0x13,0xaf,0x14,0x39,0x5f,0xda,0xe9,0x38,0x5f,0x17,0x8e,0x39,0x48,0x3e,0x27,0x39,0x5c,0xb0,0x2b,0x38,0x34,0xbb,0xf4,0x39,0x4c,0x46,0x7b,0x39,0xae,0x7e,0xac,0x38,0xc2,0x15,0x8f,0x39,0xe9,0x7f,0x84,0x38,0x60,0x11,0x03,0x3a,0x3b,0xde,0x45,0x38,0xa5,0x93,0xbe,0x39,0xd3,0xee,0x1a,0x3a,0xdb,0x81,0x29,0x39,0x10,0x14,0x8d,0x39,0x0f,0xba,0x20,0x39,0x89,0x5f,0x99,0x39,0xf6,0x8e,0xc9,0x38,0x80,0x50,0x3d,0x39,0xa1,0x57,0xe0,0x39,0x15,0xb2,0x37,0x3a,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xba,0x98,0xff,0xff,0x00,0x00,0x00,0x02,0x30,0x05,0x00,0x00,0x1b,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0xc4,0x9a,0xff,0xff,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x91,0x74,0x1b,0x39,0x7b,0x50,0x0e,0x39,0x1b,0x23,0x3c,0x39,0x27,0x25,0x33,0x39,0x10,0x10,0xd8,0x38,0xb1,0x3c,0x13,0x39,0xbb,0x6e,0x03,0x39,0x65,0xad,0x44,0x39,0x04,0xdc,0x52,0x39,0xed,0x4c,0x45,0x39,0xc5,0xa2,0x21,0x39,0xc7,0x5d,0xf6,0x38,0x3a,0x79,0x28,0x39,0x1c,0xe0,0x57,0x39,0xa7,0x56,0x09,0x39,0x43,0xbf,0xc7,0x38,0x0f,0xdc,0x1b,0x39,0xfd,0x07,0xf6,0x38,0x9c,0xd6,0x21,0x39,0xbc,0x4d,0xd8,0x38,0x08,0x7f,0x00,0x39,0x6f,0x11,0x4d,0x39,0xc8,0xcb,0x21,0x39,0x13,0x07,0x02,0x39,0xbf,0x4a,0xd9,0x38,0x1d,0xd6,0xd6,0x38,0x0e,0x1f,0xdb,0x38,0xd1,0x8b,0x2e,0x39,0xca,0xd1,0x06,0x39,0x0a,0x48,0xcd,0x38,0x71,0xbb,0x26,0x39,0xe8,0x7d,0x22,0x39,0xc7,0xf6,0x29,0x39,0xc9,0x4e,0xf7,0x38,0xb9,0xc5,0x2d,0x39,0x0a,0xf3,0x0f,0x39,0x5c,0x38,0x07,0x39,0xc3,0x5e,0x0a,0x39,0xf3,0x89,0x09,0x39,0x76,0x31,0x1f,0x39,0x19,0xa6,0x37,0x39,0xe0,0xa0,0x06,0x39,0x99,0x0c,0x4b,0x39,0x44,0x88,0x29,0x39,0x32,0x00,0xfe,0x38,0x5e,0x3f,0x00,0x39,0xb1,0xe1,0x2c,0x39,0x55,0xcd,0xf8,0x38,0xd9,0xf1,0xf7,0x38,0xdf,0xa8,0x0e,0x39,0xe2,0x5d,0x28,0x39,0x2b,0x9d,0xea,0x38,0xf7,0xb8,0x2b,0x39,0x7f,0x35,0x11,0x39,0xbb,0x12,0xc5,0x38,0x51,0x4d,0x03,0x39,0x52,0x1a,0x85,0x39,0xdf,0xcc,0x30,0x39,0x68,0x27,0x20,0x39,0x8b,0xa8,0x3a,0x39,0x6f,0x06,0x12,0x39,0xaa,0x4f,0x0a,0x39,0xf6,0xf5,0x10,0x39,0xf1,0xb6,0x82,0x39,0x47,0xa2,0x54,0x39,0x1f,0x51,0xff,0x38,0xc6,0x3e,0x62,0x39,0x44,0x0f,0x0c,0x39,0xb6,0xe2,0x14,0x39,0xf1,0xdf,0x1f,0x39,0x23,0xec,0xec,0x38,0xf6,0xbd,0x23,0x39,0x82,0x3e,0x06,0x39,0x02,0x25,0x29,0x39,0x9e,0xf7,0x17,0x39,0xab,0xa1,0x1c,0x39,0xa2,0x20,0x46,0x39,0xb5,0x09,0xe6,0x38,0x24,0xf5,0xc6,0x38,0x8c,0x1a,0x21,0x39,0xfb,0xde,0xf9,0x38,0xd3,0x6a,0x15,0x39,0x54,0x36,0xf4,0x38,0x67,0xaf,0x20,0x39,0xcf,0xdc,0xba,0x38,0xda,0x11,0xf5,0x38,0xf9,0xf7,0x02,0x39,0x54,0x41,0x60,0x39,0x96,0xe4,0x07,0x39,0xca,0x28,0x0c,0x39,0x53,0x75,0x16,0x39,0xf8,0x12,0x06,0x39,0x51,0x41,0xf9,0x38,0xb0,0xc4,0x0c,0x39,0x33,0x15,0x0c,0x39,0xaa,0xd2,0xef,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xfa,0x9d,0xff,0xff,0x00,0x00,0x00,0x02,0x30,0x05,0x00,0x00,0x1a,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xa0,0xff,0xff,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x4e,0x93,0xb9,0x38,0xf9,0x4b,0xec,0x38,0x36,0xae,0x2e,0x38,0x57,0x2d,0xab,0x38,0xb8,0xe4,0x03,0x39,0xea,0xc2,0x6a,0x38,0xa2,0x2e,0xab,0x38,0x2a,0x32,0x61,0x38,0x08,0x22,0x97,0x38,0x46,0x61,0x59,0x38,0x01,0x2b,0xd8,0x38,0x6b,0xec,0x4f,0x38,0xdc,0x6f,0x86,0x38,0xef,0xf0,0xf2,0x38,0x90,0x95,0x2e,0x38,0x50,0xc3,0x8e,0x38,0xaf,0x82,0xe5,0x38,0x0a,0x7a,0x94,0x38,0x7b,0xe5,0x7c,0x38,0x76,0xe6,0x63,0x38,0xeb,0xdd,0x33,0x38,0xe0,0xd1,0xb3,0x38,0xb5,0x0f,0xeb,0x38,0x31,0x71,0x75,0x38,0xb2,0xb3,0x20,0x39,0xab,0xa8,0xc9,0x38,0x08,0x4d,0x70,0x38,0x94,0xac,0xaa,0x38,0xc2,0x3f,0x05,0x39,0x8e,0xf2,0x3e,0x38,0x32,0x1f,0x4a,0x38,0x52,0xcf,0xf0,0x38,0x3e,0xd9,0x70,0x38,0x90,0x1e,0xf9,0x38,0xc8,0x4a,0xbf,0x38,0x9c,0xfa,0x8a,0x38,0xd6,0x2d,0x8f,0x38,0x60,0x38,0x84,0x38,0x11,0xd3,0x1a,0x39,0x36,0x52,0x4d,0x38,0x64,0x6d,0xfe,0x38,0x01,0x2c,0x60,0x38,0x8c,0x02,0x92,0x38,0x92,0xf0,0xb4,0x38,0xd0,0x2f,0x6b,0x38,0x7f,0xe4,0x91,0x38,0x2b,0x9f,0xe1,0x38,0xb2,0x0f,0xe0,0x38,0xa0,0xb0,0x62,0x38,0x25,0x9d,0x04,0x39,0x7d,0x37,0xbe,0x38,0x98,0x2a,0x8b,0x38,0xa5,0xb6,0xcd,0x38,0x60,0xef,0x9d,0x38,0x0d,0xe2,0xdd,0x38,0xa2,0x3a,0x72,0x38,0x23,0xbf,0xbe,0x38,0xf9,0x96,0x99,0x38,0x2d,0x51,0x6a,0x38,0x21,0xf4,0x30,0x38,0xe6,0x54,0xaf,0x38,0xb9,0x8c,0xb2,0x38,0x57,0xfd,0x38,0x39,0x13,0x02,0xac,0x38,0x80,0x57,0x92,0x38,0x04,0x1d,0xb8,0x38,0x89,0xb8,0x8d,0x38,0x81,0x34,0x20,0x39,0x39,0x77,0x9b,0x38,0x4e,0x71,0xe8,0x38,0xdc,0xe2,0x8d,0x38,0xd8,0x9a,0x58,0x38,0xa7,0xb5,0x42,0x38,0xbc,0x8c,0x7e,0x38,0x1f,0xb0,0xda,0x38,0x30,0xaa,0xe5,0x38,0x69,0x4f,0x04,0x39,0xfe,0xc9,0x18,0x39,0x8d,0x19,0x88,0x38,0xd1,0x4c,0xeb,0x38,0xf0,0x97,0x50,0x38,0xff,0x7d,0xb5,0x38,0x86,0x96,0xbf,0x38,0x11,0xe8,0x07,0x39,0x18,0x78,0x6b,0x38,0xdd,0x3b,0x9b,0x38,0xea,0xe0,0xf5,0x38,0x13,0x67,0xbd,0x38,0x11,0x9c,0xc3,0x38,0xac,0x9d,0x74,0x38,0xec,0x62,0xc1,0x38,0x66,0xe5,0x59,0x38,0x22,0x69,0x4d,0x38,0xe1,0x63,0x4e,0x38,0xa5,0xeb,0x67,0x38,0xdd,0x0c,0x5c,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x3a,0xa3,0xff,0xff,0x00,0x00,0x00,0x02,0x30,0x05,0x00,0x00,0x19,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x44,0xa5,0xff,0xff,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x16,0x80,0xe3,0x38,0xdc,0x59,0xc9,0x38,0xd5,0x78,0x42,0x39,0x6a,0x0e,0xff,0x38,0xf7,0x87,0x31,0x39,0xb7,0x49,0xb4,0x38,0xc7,0xe0,0x1f,0x39,0x3c,0x2e,0x20,0x39,0xe9,0xab,0x24,0x39,0x66,0xd0,0x1d,0x39,0xef,0x00,0x47,0x39,0x0a,0x4b,0x6f,0x39,0xeb,0xa1,0x0e,0x39,0x3a,0xa1,0xe7,0x38,0x8a,0x8b,0xd4,0x38,0x5d,0xfd,0xea,0x38,0xfa,0xf7,0x01,0x39,0x34,0x38,0xf4,0x38,0xea,0x06,0x82,0x39,0xe2,0x5f,0x31,0x39,0x38,0xa0,0x50,0x39,0x29,0x99,0xeb,0x38,0x54,0xc3,0x00,0x39,0x19,0xe0,0x4b,0x39,0x0d,0x78,0xed,0x38,0x37,0x55,0x03,0x39,0x56,0x12,0x3d,0x39,0xbf,0x19,0xd7,0x38,0x2b,0xfd,0xd2,0x38,0xd3,0x95,0x17,0x39,0xc1,0x81,0x25,0x39,0xf8,0xb5,0x54,0x39,0xa1,0x70,0x49,0x39,0x1f,0x8e,0x10,0x39,0xc8,0x45,0x17,0x39,0xaf,0x38,0x24,0x39,0x7e,0x5a,0x1a,0x39,0x58,0xa1,0x19,0x39,0xc0,0x82,0x03,0x39,0xb0,0x8e,0x28,0x39,0xf5,0x69,0xdb,0x38,0x01,0x99,0xd4,0x38,0xab,0x45,0x3d,0x39,0xa8,0xce,0xeb,0x38,0xdd,0x8a,0xd3,0x38,0x5f,0x13,0x09,0x39,0xe6,0x8a,0xf5,0x38,0xbe,0xbb,0x16,0x39,0x64,0xdf,0x27,0x39,0x5b,0xeb,0xdd,0x38,0xc9,0x19,0xd1,0x38,0x91,0x52,0x20,0x39,0x69,0x00,0x26,0x39,0xa2,0x54,0xf7,0x38,0x80,0xfe,0x57,0x39,0x0f,0x79,0x16,0x39,0xc0,0x5a,0xfc,0x38,0xe2,0x0b,0xd8,0x38,0x4c,0x75,0xc2,0x38,0x5e,0xb9,0xe8,0x38,0x98,0xe9,0x08,0x39,0xcd,0xd7,0xe1,0x38,0x00,0x21,0x16,0x39,0x5f,0x0a,0x04,0x39,0x04,0xb0,0x01,0x39,0x36,0xd3,0x2d,0x39,0xf9,0x1c,0xfc,0x38,0xc1,0x17,0x1a,0x39,0xb0,0xbc,0xc9,0x38,0x82,0x49,0x07,0x39,0xba,0xa4,0x63,0x39,0xbb,0x85,0x25,0x39,0x96,0xdd,0xe7,0x38,0x95,0x6d,0xfa,0x38,0x32,0xde,0xd5,0x38,0xfc,0x78,0x05,0x39,0xc1,0x9d,0x5a,0x39,0x42,0x02,0x13,0x39,0x30,0xd6,0x38,0x39,0xb3,0x97,0x0f,0x39,0x2c,0x60,0x3a,0x39,0x06,0x82,0x27,0x39,0x02,0x16,0xe4,0x38,0x39,0x60,0xd8,0x38,0x15,0x00,0xc8,0x38,0x60,0xa4,0x2e,0x39,0x72,0xb5,0x48,0x39,0x48,0x8c,0xde,0x38,0x3f,0xbe,0xdc,0x38,0x91,0xa8,0x11,0x39,0xad,0x2d,0xd9,0x38,0x84,0x52,0xdd,0x38,0x09,0x4b,0x70,0x39,0x27,0x5e,0xc5,0x38,0xdb,0x96,0x38,0x39,0x57,0x57,0xe9,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x7a,0xa8,0xff,0xff,0x00,0x00,0x00,0x02,0x30,0x05,0x00,0x00,0x18,0x00,0x00,0x00,0x9c,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x84,0xaa,0xff,0xff,0x0c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x43,0x7e,0x6f,0x38,0x09,0x37,0x37,0x38,0xc2,0x44,0x64,0x38,0xc0,0xf6,0x9c,0x38,0xa9,0x60,0xb9,0x38,0x17,0x6c,0x8a,0x38,0x6b,0x6b,0x6e,0x38,0xfa,0xd3,0x3a,0x38,0xb3,0x08,0x03,0x39,0x0d,0x2b,0xda,0x38,0x77,0x2a,0xbe,0x38,0xa5,0x47,0xb2,0x38,0xee,0x7d,0x88,0x38,0x95,0xb1,0x8e,0x38,0x11,0xc8,0x40,0x38,0x62,0xf4,0x6d,0x38,0xc9,0xd0,0x77,0x38,0x36,0xfb,0x49,0x38,0x86,0x6a,0x9e,0x38,0x03,0x3b,0x77,0x38,0xa8,0x5d,0x47,0x38,0xab,0x02,0x77,0x38,0x99,0x2c,0x39,0x38,0xa1,0x38,0xd5,0x38,0x03,0x04,0x41,0x38,0xe9,0xd2,0x4c,0x38,0xbe,0xa9,0xd1,0x38,0xa1,0x1c,0xa3,0x38,0x04,0x18,0x39,0x38,0x6d,0xe4,0x83,0x38,0xbe,0x9e,0x3e,0x38,0x2f,0x86,0x47,0x38,0x59,0xdc,0x89,0x38,0x55,0x8d,0x2b,0x38,0x97,0x45,0xac,0x38,0x57,0x98,0x46,0x38,0x1b,0x53,0xa8,0x38,0x26,0x34,0x37,0x38,0x3a,0x4b,0x88,0x38,0x87,0xd5,0xe1,0x38,0x18,0xaa,0x44,0x38,0x3e,0x18,0x3f,0x38,0x0c,0xcb,0x2e,0x38,0xca,0x8b,0x35,0x38,0xd2,0x57,0x2e,0x38,0x21,0xb4,0x44,0x38,0x96,0x26,0x3d,0x38,0x9b,0xff,0x10,0x39,0xb0,0x7a,0x3d,0x38,0xe6,0x24,0x67,0x38,0xff,0x26,0x4d,0x38,0x15,0x13,0xe6,0x38,0x68,0x8c,0x68,0x38,0xe2,0xe6,0x98,0x38,0x32,0x4f,0x79,0x38,0x81,0x5f,0x55,0x38,0x45,0xe0,0x8f,0x38,0xf7,0xdb,0x41,0x38,0x83,0x61,0x6e,0x38,0xd4,0xfe,0xa7,0x38,0x8c,0x02,0xb9,0x38,0x78,0xef,0x4e,0x38,0x59,0x77,0x8e,0x38,0x65,0x1b,0xa3,0x38,0x6a,0xed,0xb4,0x38,0x17,0xb7,0xa2,0x38,0x84,0xb1,0x3a,0x38,0xaa,0xf7,0x7c,0x38,0x1a,0x84,0x53,0x38,0x16,0x7d,0x90,0x38,0xcc,0xbf,0xb4,0x38,0x0b,0x56,0x01,0x39,0xdb,0x3f,0x67,0x38,0x13,0x2a,0x35,0x38,0x2c,0x5b,0x96,0x38,0x0b,0x74,0x80,0x38,0xab,0x0a,0xdc,0x38,0x1a,0x58,0x6a,0x38,0xca,0x57,0xcd,0x38,0xa8,0x81,0x6b,0x38,0x8a,0x85,0x01,0x39,0xf5,0x3b,0x98,0x38,0xac,0x30,0x2d,0x38,0x49,0xc4,0x59,0x38,0xca,0x17,0x3b,0x38,0x96,0x45,0x4f,0x38,0x59,0x07,0xef,0x38,0x6e,0xb9,0x90,0x38,0xe5,0x6f,0x5c,0x38,0x2d,0xed,0x61,0x38,0xcf,0xd1,0x61,0x38,0x97,0xdc,0x50,0x38,0xc4,0x9a,0xec,0x38,0xc9,0x70,0x5c,0x38,0xed,0x38,0xda,0x38,0x4b,0x6a,0x4c,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xba,0xad,0xff,0xff,0x00,0x00,0x00,0x02,0x50,0x03,0x00,0x00,0x17,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xc4,0xaf,0xff,0xff,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3d,0x21,0xe2,0x38,0x46,0xdf,0xb6,0x38,0x6b,0x84,0x61,0x38,0xaf,0x5b,0x93,0x38,0x09,0x0d,0xdc,0x38,0x73,0x1f,0x6d,0x38,0x5c,0x2d,0x0e,0x39,0x7d,0x14,0x0c,0x39,0x0e,0x3f,0x06,0x39,0xc5,0xc0,0x01,0x39,0xce,0x7b,0x0f,0x39,0x6a,0x45,0x08,0x39,0xbc,0x5d,0xce,0x38,0x08,0xac,0x1b,0x39,0x88,0xc0,0x92,0x38,0x78,0x26,0xb2,0x38,0x5c,0x48,0xb4,0x38,0x27,0xb2,0x89,0x38,0x12,0xf0,0x9b,0x38,0x2d,0x67,0xd5,0x38,0x5e,0xf3,0x9a,0x38,0xc7,0xdf,0x35,0x39,0x79,0x70,0xd4,0x38,0xe4,0x28,0xbe,0x38,0xa4,0x27,0x94,0x38,0xd6,0x0d,0xe4,0x38,0xbe,0x53,0xfd,0x38,0xeb,0x7c,0xe1,0x38,0xb6,0x92,0x87,0x39,0xe2,0xc7,0xa0,0x38,0x0f,0x13,0x8d,0x38,0x52,0x06,0x1c,0x39,0x49,0x99,0x1b,0x39,0xd9,0xc1,0xf3,0x38,0x77,0x09,0x45,0x39,0x3e,0x7f,0x93,0x38,0xb3,0x00,0xd8,0x38,0x7a,0x99,0xe7,0x38,0xa4,0xda,0x00,0x39,0x8c,0xc0,0xab,0x38,0xf1,0x13,0xe0,0x38,0xac,0x29,0xd9,0x38,0x4a,0x56,0x14,0x39,0x37,0x8a,0xbc,0x38,0x20,0xd9,0x9a,0x38,0x46,0x04,0xa1,0x38,0x71,0x8b,0xed,0x38,0x54,0x3c,0xa3,0x38,0xfc,0xe9,0x1f,0x39,0x7c,0xcf,0xb1,0x38,0x17,0xb2,0xd5,0x38,0xf2,0x08,0x94,0x38,0x82,0xc1,0xdc,0x38,0x3f,0xb0,0x89,0x38,0x1f,0x28,0x87,0x38,0x33,0x78,0xdd,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1a,0xb1,0xff,0xff,0x00,0x00,0x00,0x02,0x50,0x03,0x00,0x00,0x16,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x24,0xb3,0xff,0xff,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3a,0xda,0xc6,0x38,0xa7,0x13,0xbb,0x38,0x9b,0x73,0xf9,0x38,0x06,0x9b,0xf4,0x38,0x16,0x2d,0xb2,0x38,0x3d,0x0a,0xd5,0x38,0xfc,0x91,0xc2,0x38,0x21,0xe7,0x80,0x38,0x49,0xed,0x93,0x38,0xe2,0x32,0xd2,0x38,0x98,0x21,0x65,0x38,0x87,0x5e,0xa7,0x38,0x5a,0x20,0xf5,0x38,0xbd,0x93,0x75,0x38,0x47,0x3b,0xda,0x38,0x49,0x91,0xcb,0x38,0x92,0xf0,0xd6,0x38,0x43,0x6f,0xd5,0x38,0xd8,0x70,0xa0,0x38,0x0a,0xc4,0xdf,0x38,0xdb,0x38,0xa1,0x38,0xf2,0xa1,0xf5,0x38,0x5b,0x96,0x90,0x38,0xe2,0x04,0x91,0x38,0xa4,0xe8,0xb8,0x38,0x3e,0x67,0x8d,0x38,0x8c,0x2d,0x7b,0x38,0x23,0xc6,0x9b,0x38,0x57,0x45,0xc9,0x38,0x6d,0xfd,0xce,0x38,0x05,0x13,0xd4,0x38,0x8f,0xee,0x7d,0x38,0x90,0x16,0x77,0x38,0x70,0x14,0x95,0x39,0x2a,0x53,0x70,0x38,0xc6,0x2c,0xf1,0x38,0x13,0x0a,0xb8,0x38,0x61,0x39,0xb3,0x38,0xe8,0x00,0x50,0x39,0xb5,0xb1,0xf0,0x38,0x76,0xf7,0x90,0x38,0xf6,0x8d,0x10,0x39,0x2f,0x6d,0x7c,0x38,0xba,0x03,0xcd,0x38,0x7d,0xbc,0x0d,0x39,0xb7,0x13,0x5b,0x38,0xe8,0x14,0x54,0x38,0xdc,0x80,0xae,0x38,0xee,0x43,0xcd,0x38,0x24,0x51,0xf1,0x38,0x77,0x71,0xb0,0x38,0x25,0xc1,0x32,0x39,0xf2,0xbd,0x42,0x38,0x7a,0x47,0xea,0x38,0x08,0xb6,0x22,0x39,0x11,0x09,0x2f,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x38,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x7a,0xb4,0xff,0xff,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x15,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x84,0xb6,0xff,0xff,0xf0,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x5c,0x6a,0x98,0x39,0x5c,0x02,0xe8,0x39,0x15,0x56,0x12,0x39,0xb7,0xb1,0x07,0x39,0xdd,0xdc,0x44,0x3a,0x59,0x37,0x92,0x39,0x96,0x24,0xa5,0x3a,0x2e,0xed,0x9e,0x39,0x4f,0x98,0xb9,0x39,0x14,0x51,0xd2,0x39,0xf3,0xfe,0x24,0x3a,0x64,0x12,0x34,0x39,0x7c,0x3d,0xca,0x39,0x70,0xc7,0x83,0x3a,0xe7,0x08,0x24,0x39,0x68,0x71,0xad,0x3a,0xbd,0xb8,0x95,0x39,0x03,0x92,0xeb,0x39,0xc3,0xa8,0xa3,0x38,0x47,0x8c,0xbf,0x39,0xe9,0xee,0xaf,0x39,0x01,0xd3,0xbd,0x39,0xc1,0x11,0xb9,0x39,0xf6,0xfb,0xe3,0x39,0xad,0xa7,0x78,0x39,0x10,0xab,0x85,0x39,0xd4,0xe6,0x5e,0x39,0x6d,0x08,0x3d,0x39,0x83,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x01,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x8a,0xb6,0xff,0xff,0x00,0x00,0x00,0x02,0x50,0x03,0x00,0x00,0x14,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x94,0xb8,0xff,0xff,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x27,0x96,0xd2,0x38,0xd0,0xee,0xda,0x38,0xbf,0xd1,0x2e,0x39,0x0e,0x5b,0x64,0x39,0xad,0x30,0x20,0x39,0x64,0xf5,0xe7,0x38,0xf3,0xbb,0xd9,0x38,0x8c,0xfb,0x23,0x39,0xb8,0xaf,0xd5,0x38,0x94,0xa7,0x94,0x38,0xc3,0x5c,0x08,0x39,0x6f,0x9c,0x01,0x39,0x65,0x10,0xee,0x38,0x24,0x18,0xc1,0x38,0x50,0xbc,0x1b,0x39,0xde,0x6a,0x2a,0x39,0xeb,0x8f,0xc4,0x38,0xdb,0x80,0x1c,0x39,0xf4,0x75,0xea,0x38,0x9e,0x20,0x02,0x39,0x52,0x6d,0xb6,0x38,0xca,0x63,0xdf,0x38,0xc5,0xa5,0x28,0x39,0x77,0xfe,0x3a,0x39,0xfc,0x99,0xca,0x38,0x10,0x74,0x12,0x39,0xeb,0xf3,0x00,0x39,0x0f,0x1c,0xd4,0x38,0x94,0x1f,0x0b,0x39,0x7a,0x9f,0xef,0x38,0x9b,0x4c,0xbc,0x38,0x59,0x3a,0xfd,0x38,0xc7,0x58,0xf9,0x38,0xdf,0x1d,0x5f,0x39,0x04,0x72,0x9d,0x38,0x18,0x88,0x20,0x39,0xce,0xb4,0x18,0x39,0x49,0xc1,0xe0,0x38,0x02,0xfb,0x24,0x39,0x3b,0x0d,0x9d,0x38,0x0d,0xba,0xaf,0x38,0x15,0xe9,0xee,0x38,0x82,0xfa,0x5d,0x39,0x7a,0xf7,0x1b,0x39,0x27,0x8d,0xe8,0x38,0xf0,0x57,0x0c,0x39,0xcd,0x4e,0x48,0x39,0xf7,0x72,0x13,0x39,0x2c,0x92,0xa3,0x38,0xd6,0xf5,0xb2,0x38,0x05,0x73,0x8d,0x38,0x20,0xa9,0x99,0x38,0x0f,0x97,0xc8,0x38,0x0b,0x06,0x8e,0x38,0x5e,0x28,0x25,0x39,0x3c,0x1d,0xc5,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xea,0xb9,0xff,0xff,0x00,0x00,0x00,0x02,0x50,0x03,0x00,0x00,0x13,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xf4,0xbb,0xff,0xff,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x86,0x3b,0x78,0x38,0xb1,0xad,0x30,0x39,0x59,0xac,0x6f,0x39,0x87,0xbd,0xc5,0x38,0x9c,0xe2,0x15,0x39,0x0d,0x2f,0x82,0x38,0x95,0x54,0x0e,0x39,0x91,0x4f,0x26,0x39,0x5c,0xb0,0xbe,0x38,0x7f,0x6d,0x84,0x38,0xd8,0x3e,0xad,0x38,0x39,0x5b,0xe6,0x38,0xc9,0xd7,0x72,0x39,0xcf,0x7f,0xda,0x38,0xa0,0xe3,0x6a,0x39,0xec,0xaf,0x08,0x39,0xb1,0x1d,0x40,0x39,0xd7,0x74,0xba,0x38,0x46,0x9c,0x90,0x38,0x22,0x90,0xc0,0x38,0xed,0x02,0x9e,0x38,0x22,0xf3,0x6e,0x38,0x62,0xeb,0x35,0x39,0x8f,0x59,0xbb,0x38,0x62,0x37,0xad,0x38,0x7b,0xed,0xaa,0x38,0xab,0x3d,0xa8,0x39,0x55,0xee,0xb5,0x38,0xea,0x57,0xe4,0x38,0x7c,0x81,0xae,0x38,0x15,0x6d,0xed,0x38,0x81,0xd9,0x62,0x39,0xd0,0xd2,0x0c,0x39,0x9d,0x40,0xea,0x38,0x6b,0x55,0xc0,0x38,0x99,0x70,0x52,0x39,0x9d,0xe5,0xa0,0x38,0x54,0xd9,0xd7,0x38,0x5c,0x4a,0xb2,0x38,0xd1,0x1e,0x4f,0x38,0x68,0xd0,0x5a,0x38,0x4e,0xc2,0x7d,0x38,0x0f,0x41,0x03,0x39,0xf1,0x21,0xcc,0x38,0xc5,0x24,0x3d,0x39,0x62,0xba,0xf2,0x38,0x96,0x17,0xff,0x38,0x1e,0xf2,0x9b,0x39,0xa1,0x04,0x51,0x38,0x15,0x6f,0xbc,0x38,0x39,0x79,0x99,0x38,0x89,0x71,0xf9,0x38,0xea,0xe1,0x27,0x39,0xd1,0x26,0x81,0x38,0xcc,0x64,0xa3,0x38,0x3b,0xef,0x7c,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x4a,0xbd,0xff,0xff,0x00,0x00,0x00,0x02,0x50,0x03,0x00,0x00,0x12,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xbf,0xff,0xff,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xcc,0x7d,0x20,0x39,0xff,0xa6,0xa3,0x38,0xe6,0x7b,0x0a,0x39,0xa0,0x48,0x9e,0x38,0x0f,0x81,0xb1,0x38,0xa2,0x76,0x2d,0x39,0x01,0x50,0x0b,0x39,0x77,0xf0,0xcc,0x38,0x20,0x58,0xe9,0x38,0x46,0xbe,0x35,0x39,0xbb,0x07,0xbb,0x38,0x82,0xaf,0x9c,0x38,0xf1,0x23,0x0a,0x39,0x74,0x08,0x44,0x39,0x62,0x0c,0x26,0x39,0x61,0x8b,0xeb,0x38,0xc7,0xde,0xe1,0x38,0x11,0x05,0xc9,0x38,0x98,0x03,0x04,0x39,0x62,0x6b,0x63,0x39,0x11,0xc6,0xed,0x38,0xf3,0x72,0x38,0x39,0xf0,0xdb,0xfb,0x38,0x43,0xa0,0xf0,0x38,0xba,0x46,0xfb,0x38,0x7d,0xbc,0x4f,0x39,0x61,0xbc,0x31,0x39,0xef,0x2b,0x25,0x39,0x7d,0xe9,0x13,0x39,0x73,0xfa,0xea,0x38,0x2a,0xee,0x11,0x39,0xdd,0x3f,0x10,0x39,0xcf,0x3c,0x4e,0x39,0x93,0xe5,0x83,0x39,0x78,0x5e,0x22,0x39,0x25,0xca,0x0c,0x39,0xd4,0x4a,0x87,0x39,0x05,0x2d,0x28,0x39,0xa5,0x76,0x1a,0x39,0xc9,0x0d,0x1d,0x38,0x34,0xe5,0xbf,0x38,0xfa,0x10,0xe4,0x38,0x82,0xec,0x53,0x39,0x88,0xf4,0x53,0x38,0xdb,0x4d,0x07,0x39,0x2c,0xb0,0x5c,0x39,0x5b,0xbd,0x01,0x39,0x70,0xcc,0x14,0x39,0xf4,0x79,0xc1,0x38,0xdb,0x8c,0x10,0x39,0xe6,0x65,0xbe,0x38,0x80,0xf6,0x63,0x39,0x83,0x1d,0x1f,0x39,0x5c,0x50,0xe7,0x38,0x47,0xa8,0x0b,0x39,0x9b,0xfc,0x19,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x37,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xaa,0xc0,0xff,0xff,0x00,0x00,0x00,0x02,0x50,0x03,0x00,0x00,0x11,0x00,0x00,0x00,0xbc,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xc2,0xff,0xff,0xcc,0x01,0x00,0x00,0x04,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x2c,0xd8,0xc6,0x38,0xfe,0xb6,0xa2,0x38,0xac,0x58,0x50,0x39,0x2d,0x9e,0xfc,0x38,0x99,0xac,0x43,0x39,0x6f,0x68,0x07,0x39,0x4f,0x35,0xb1,0x38,0x66,0x19,0x02,0x39,0xc4,0xcb,0x96,0x39,0xbf,0x7c,0x88,0x38,0x45,0xf5,0x6d,0x39,0x3b,0xc8,0x6c,0x39,0x45,0xc4,0x85,0x39,0x48,0xb3,0xf7,0x38,0xa1,0xcd,0x61,0x39,0xab,0x9f,0xed,0x38,0xa8,0x3d,0x9d,0x38,0xae,0x08,0x02,0x39,0x7f,0x62,0xed,0x38,0x59,0x78,0x0f,0x39,0xb0,0x6e,0x0a,0x39,0xd6,0x9f,0xf1,0x38,0x03,0xd7,0x27,0x39,0xa5,0xe7,0x1e,0x39,0x92,0x97,0x24,0x39,0x0d,0x15,0x91,0x38,0x75,0xb9,0x15,0x39,0x3f,0x83,0x72,0x39,0xf2,0x65,0x44,0x39,0xa0,0x48,0x80,0x39,0x23,0xa5,0xda,0x38,0xd9,0x2f,0x7c,0x39,0xb0,0xdf,0x13,0x39,0x4e,0xbc,0x02,0x39,0x48,0x05,0x97,0x38,0xd4,0xb1,0x21,0x39,0x1e,0x1d,0xb9,0x38,0x87,0x44,0xfd,0x38,0xd2,0xb7,0xbe,0x38,0xc5,0xb8,0xcb,0x38,0xb0,0x4b,0x5a,0x39,0xb1,0x9c,0x4b,0x39,0xa0,0x71,0x42,0x39,0x33,0xcb,0x90,0x38,0x76,0x13,0xa9,0x38,0xd9,0x8d,0xe1,0x38,0x5b,0x8b,0x97,0x39,0xc1,0x6c,0xec,0x38,0xe6,0x47,0x10,0x39,0xdb,0xf4,0x49,0x39,0x38,0x73,0x77,0x39,0x50,0xf1,0x3a,0x39,0xd2,0xc6,0xd8,0x38,0x6a,0xb0,0x01,0x39,0xcf,0x49,0x0c,0x39,0xaa,0xc7,0xd2,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0a,0xc4,0xff,0xff,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x10,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xc6,0xff,0xff,0x6c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x44,0x7f,0xfc,0x38,0xac,0xde,0x97,0x39,0x5d,0x38,0x31,0x39,0x9e,0x5a,0xfa,0x38,0x44,0xd0,0xd4,0x38,0xd6,0xb5,0x39,0x39,0x92,0xc5,0x44,0x39,0x7e,0x9e,0x28,0x39,0x9a,0xe9,0x55,0x39,0x4f,0x2b,0x36,0x39,0xd0,0x1f,0xd9,0x38,0x47,0x03,0x59,0x39,0xf0,0x80,0xfa,0x38,0xa3,0x5d,0x42,0x39,0xb6,0xbc,0x9b,0x38,0xec,0xf5,0xb1,0x38,0x26,0xeb,0x8a,0x39,0x0e,0xf1,0x2f,0x39,0x09,0xba,0x51,0x39,0xea,0x48,0x00,0x39,0xac,0xc6,0xe5,0x38,0x40,0xdf,0x12,0x39,0xc7,0x0c,0xec,0x38,0xe5,0xb8,0x0d,0x39,0x86,0x75,0xff,0x38,0x2d,0xf5,0x6f,0x39,0xc8,0x04,0x13,0x39,0xc9,0x20,0x2c,0x39,0x35,0xe1,0x3b,0x39,0x76,0x4d,0x0d,0x39,0x13,0xdb,0x06,0x39,0x24,0x42,0x49,0x39,0x18,0xcf,0x08,0x39,0x96,0x52,0x8d,0x39,0x86,0x48,0x21,0x39,0x2e,0xab,0x31,0x39,0x64,0x2d,0x77,0x39,0x7c,0xff,0xa8,0x39,0xec,0xc1,0x9f,0x38,0x83,0x36,0xf5,0x38,0xbe,0x35,0xf7,0x38,0x4b,0x48,0x29,0x39,0x3a,0xfc,0x14,0x39,0xcc,0x8c,0x59,0x39,0xf6,0x7b,0x40,0x39,0xed,0x83,0x43,0x39,0x78,0xf9,0xa4,0x39,0x5e,0xa0,0x1e,0x39,0xd5,0x3b,0x4e,0x39,0x95,0x16,0x48,0x39,0x51,0xe2,0x31,0x39,0x96,0x80,0x1d,0x39,0x58,0xf6,0x1c,0x39,0x0f,0x71,0x7f,0x39,0x30,0xe8,0x59,0x39,0x7f,0x16,0x13,0x39,0x41,0x11,0x4d,0x39,0x65,0xba,0x4f,0x39,0x99,0x92,0x3b,0x39,0x83,0x30,0xcf,0x39,0x8d,0x11,0x2b,0x39,0x7c,0x32,0x07,0x39,0x12,0xf5,0x17,0x39,0x0c,0x4b,0x2d,0x39,0x76,0xaa,0x8f,0x39,0xcc,0xbb,0x10,0x39,0x09,0x13,0xa7,0x39,0x07,0x80,0x83,0x39,0xf3,0x4f,0x43,0x39,0x4c,0xb8,0x3a,0x39,0x90,0x2a,0x33,0x39,0x82,0x84,0x2b,0x39,0x08,0xcb,0x0d,0x39,0x49,0xfd,0x46,0x39,0x1b,0x4e,0x4f,0x39,0x13,0xb3,0xaf,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x5a,0xc8,0xff,0xff,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x0f,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x64,0xca,0xff,0xff,0x6c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xe1,0xeb,0x48,0x39,0x90,0x4d,0x17,0x39,0xf4,0xa3,0x15,0x39,0xb0,0xf4,0x0c,0x39,0xd4,0x90,0x39,0x39,0x6d,0x51,0x7c,0x39,0x72,0xce,0x16,0x39,0x8c,0x74,0x00,0x39,0xc6,0x16,0xe8,0x38,0x6d,0x58,0x25,0x39,0xd8,0x91,0x25,0x39,0xfd,0xce,0x32,0x39,0xfb,0x1d,0x43,0x39,0xcb,0x41,0x0e,0x39,0x65,0x12,0x41,0x39,0xa6,0x6a,0x08,0x39,0x92,0xc0,0x0f,0x39,0xef,0x51,0x12,0x39,0xd1,0x2c,0x4e,0x39,0x8c,0x1f,0x1c,0x39,0x16,0x10,0x08,0x39,0x7e,0xa5,0xf1,0x38,0x5f,0xb1,0x0e,0x39,0x70,0x2d,0x13,0x39,0xa0,0x3b,0x6e,0x39,0xd3,0xb6,0x4a,0x39,0x81,0x75,0x50,0x39,0x22,0xd2,0xf6,0x38,0x44,0xd2,0x01,0x39,0x09,0x58,0x6b,0x39,0x3a,0xa1,0x4d,0x39,0xa4,0x2c,0x26,0x39,0xbd,0x39,0x21,0x39,0xe3,0x5c,0x50,0x39,0xa8,0x9b,0xf5,0x38,0xc0,0xbe,0x14,0x39,0x6a,0x33,0xd6,0x38,0x9e,0x24,0x0c,0x39,0xe6,0xeb,0x30,0x39,0x3c,0x38,0x25,0x39,0x12,0x52,0x0f,0x39,0x63,0xf0,0x01,0x39,0xe7,0x19,0x74,0x39,0x08,0x10,0x31,0x39,0xef,0xb2,0x17,0x39,0x8c,0xb7,0x1c,0x39,0x46,0x05,0x1c,0x39,0x39,0xf9,0x28,0x39,0x0e,0x58,0x04,0x39,0xba,0xd2,0x19,0x39,0xa9,0xf5,0xf2,0x38,0xb4,0x20,0xe4,0x38,0x59,0x7c,0x12,0x39,0x09,0x1e,0x47,0x39,0x7c,0xf6,0x15,0x39,0x07,0x70,0x01,0x39,0x88,0x51,0x01,0x39,0xa1,0x2d,0x14,0x39,0xe4,0x7e,0x32,0x39,0x2e,0x54,0xd6,0x38,0xcd,0x04,0x84,0x39,0xbc,0xe3,0x20,0x39,0xa9,0x72,0x1b,0x39,0x14,0xa1,0x29,0x39,0x7f,0x72,0x24,0x39,0xb0,0xec,0x71,0x39,0x44,0x35,0x23,0x39,0x09,0xe0,0xcc,0x38,0xb5,0x6f,0x35,0x39,0x78,0xc6,0x28,0x39,0x59,0x00,0x15,0x39,0x4d,0xd6,0x2a,0x39,0xd6,0x10,0x00,0x39,0xd7,0xc7,0xea,0x38,0xc3,0xad,0x09,0x39,0xae,0xa1,0x26,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x36,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xaa,0xcc,0xff,0xff,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x0e,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0xce,0xff,0xff,0x6c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xfd,0xb6,0x7e,0x39,0x8a,0x7e,0x04,0x39,0x1b,0x32,0xe8,0x38,0x37,0x3c,0x71,0x39,0xf0,0x36,0xff,0x38,0x6b,0x0d,0x62,0x39,0x6c,0x01,0x25,0x39,0x00,0x00,0xbc,0x39,0xfd,0xac,0x47,0x39,0x70,0x5e,0xdd,0x38,0x9e,0xa3,0xa0,0x39,0x98,0xd8,0x0a,0x39,0x5b,0x3f,0x59,0x39,0xd6,0x55,0xc3,0x39,0x6d,0x19,0x2f,0x39,0x9f,0xa4,0x3c,0x39,0xe9,0x2a,0x85,0x39,0x18,0x4a,0x20,0x39,0x9e,0x0c,0xcc,0x38,0xd2,0x72,0x67,0x39,0x0c,0x75,0x5b,0x39,0x79,0x06,0x3d,0x39,0xdf,0x06,0x70,0x39,0xaa,0x66,0x39,0x39,0x26,0x77,0x8a,0x39,0x7c,0xfd,0x1d,0x39,0x9b,0xf2,0xa4,0x39,0x71,0xea,0xca,0x38,0x8c,0xd8,0x45,0x39,0x51,0x3d,0x8c,0x39,0x1d,0x30,0x5b,0x39,0x07,0x6f,0x3e,0x39,0xb6,0x0b,0x0d,0x39,0x9e,0x34,0x17,0x39,0x83,0xe5,0x4e,0x39,0x58,0x23,0x6e,0x39,0x0f,0x29,0xb5,0x39,0x9a,0x38,0x47,0x39,0x70,0xd2,0x50,0x39,0xb3,0xbc,0x36,0x39,0x3d,0x97,0x51,0x39,0x64,0x1d,0xe9,0x38,0x2c,0x75,0x6a,0x39,0x3b,0xeb,0xe5,0x39,0xa6,0xe5,0xbd,0x39,0x9a,0x2d,0x3d,0x39,0x35,0x48,0x0d,0x39,0xd8,0x96,0x1f,0x39,0x5f,0xd2,0x6e,0x39,0x18,0x3e,0x70,0x3a,0x82,0x40,0x48,0x39,0xc6,0xa1,0x2a,0x39,0xe7,0xaa,0xfa,0x39,0xea,0x12,0x56,0x39,0xa0,0x39,0xfb,0x39,0x5b,0x0c,0x0b,0x39,0xa7,0x9e,0x4b,0x39,0x94,0xbe,0x05,0x39,0x1b,0xf1,0x06,0x39,0xf7,0x23,0xec,0x38,0x32,0xa2,0x42,0x39,0x98,0xe8,0x2a,0x39,0x6a,0x46,0xa1,0x39,0x27,0x93,0x9f,0x39,0x05,0x07,0x16,0x39,0xc1,0x6f,0xea,0x38,0x62,0xc4,0x3f,0x39,0xb0,0xd1,0x3c,0x39,0x0e,0xd1,0xf7,0x38,0x8e,0x58,0x7a,0x39,0x3f,0xa6,0x8a,0x39,0x27,0xf1,0x81,0x39,0xda,0xc3,0x89,0x39,0xc7,0x49,0x09,0x39,0xf1,0xf8,0x8e,0x39,0x4d,0xe9,0x4d,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0xfa,0xd0,0xff,0xff,0x00,0x00,0x00,0x02,0x40,0x04,0x00,0x00,0x0d,0x00,0x00,0x00,0xac,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0xd3,0xff,0xff,0x6c,0x02,0x00,0x00,0x04,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x9b,0x8e,0x5c,0x39,0xf9,0x44,0x2c,0x39,0x4a,0xb7,0x18,0x39,0x3e,0x60,0x3c,0x39,0xfd,0x04,0x21,0x39,0x2f,0xad,0x20,0x39,0x57,0x6a,0xe6,0x38,0x39,0x13,0x67,0x39,0x7a,0x13,0x1c,0x39,0xaf,0x49,0x3a,0x39,0x01,0x24,0x4e,0x39,0x74,0xb3,0x11,0x39,0xe7,0x09,0x31,0x39,0xa9,0x7a,0x28,0x39,0x1a,0xc3,0x12,0x39,0x18,0xeb,0x26,0x39,0x1b,0xde,0x13,0x39,0x99,0x36,0x36,0x39,0x03,0x8b,0x19,0x39,0xa5,0xc9,0x1f,0x39,0x9d,0xa5,0x0f,0x39,0x86,0x47,0x49,0x39,0xe5,0x38,0x27,0x39,0x1e,0x07,0x31,0x39,0x03,0x9a,0x17,0x39,0x92,0x34,0x7c,0x39,0x79,0x2a,0x3c,0x39,0x97,0x46,0x3e,0x39,0x81,0x7f,0x0e,0x39,0x39,0x0f,0x3c,0x39,0xf3,0x16,0x22,0x39,0xcf,0x57,0xf9,0x38,0x40,0x13,0x45,0x39,0x80,0x1b,0x7a,0x39,0x9a,0x2c,0x59,0x39,0x53,0xf9,0x3a,0x39,0x26,0x43,0x13,0x39,0xb3,0x63,0x00,0x39,0xec,0x68,0x35,0x39,0x6d,0x41,0x07,0x39,0x9e,0xcc,0x3a,0x39,0x2f,0xb2,0x37,0x39,0xf5,0x0d,0x1b,0x39,0x86,0x26,0xc6,0x38,0xcc,0x8c,0x0e,0x39,0xb5,0x75,0x4f,0x39,0x37,0xf3,0x17,0x39,0xc5,0x6a,0x29,0x39,0x20,0x1d,0x1f,0x39,0x4c,0x96,0xc7,0x38,0xf4,0xb7,0x25,0x39,0xec,0x74,0x29,0x39,0x8f,0xa5,0xe9,0x38,0x07,0x69,0x22,0x39,0xf7,0xcc,0x10,0x39,0xa1,0x67,0xf7,0x38,0x25,0x2b,0x6f,0x39,0xc6,0x15,0x2e,0x39,0x72,0x6a,0x21,0x39,0x17,0xfd,0x32,0x39,0x30,0x3d,0x37,0x39,0x8a,0x73,0x32,0x39,0x75,0xd9,0x16,0x39,0x00,0x0f,0x1c,0x39,0xb3,0x80,0x0c,0x39,0x77,0x8e,0x00,0x39,0x75,0x8a,0x6c,0x39,0x65,0xbf,0x5b,0x39,0x6e,0x07,0x86,0x39,0x8d,0xb4,0x20,0x39,0x04,0xd3,0x31,0x39,0xd5,0x19,0x12,0x39,0x10,0x39,0x14,0x39,0xb4,0x8f,0x07,0x39,0xbf,0x91,0x37,0x39,0x76,0x13,0x10,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4a,0xd5,0xff,0xff,0x00,0x00,0x00,0x02,0xf0,0x05,0x00,0x00,0x0c,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xd7,0xff,0xff,0x8c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x0b,0x26,0x39,0x64,0x71,0x26,0x39,0x9b,0xb9,0x15,0x39,0x04,0x97,0x11,0x39,0x7f,0xfc,0x70,0x39,0xd3,0xa5,0x72,0x39,0x08,0xaa,0x12,0x39,0x86,0x4e,0x5a,0x39,0x87,0x6f,0xb5,0x39,0x5b,0xc5,0x3f,0x39,0xa7,0xa4,0x45,0x39,0xd0,0xd7,0x10,0x39,0x11,0xd7,0xe5,0x38,0xf7,0x4d,0x2b,0x39,0xfc,0xb0,0x04,0x39,0xdb,0xb7,0x84,0x39,0x24,0x47,0x75,0x39,0x8c,0x1c,0x69,0x39,0xe1,0xaf,0x0c,0x39,0x1b,0x7d,0x2e,0x39,0xe2,0x39,0x4e,0x39,0xba,0xec,0x1e,0x39,0x24,0xd4,0x4d,0x39,0xe4,0xf6,0x83,0x39,0x8a,0xd9,0x2c,0x39,0xde,0xff,0x3a,0x39,0xcf,0xa9,0x73,0x39,0xa4,0xf0,0x07,0x39,0xeb,0x11,0xc3,0x38,0x79,0xb5,0xab,0x39,0x69,0xa6,0x23,0x39,0x41,0x37,0x58,0x39,0x45,0x62,0x1d,0x39,0x25,0x2f,0x1f,0x39,0x58,0xff,0x83,0x39,0x58,0xd8,0xc5,0x39,0x5e,0x2b,0xdc,0x38,0x7c,0xe5,0x5f,0x39,0x1a,0x1f,0x1d,0x39,0x6d,0xfb,0x17,0x39,0x5f,0xc0,0x4d,0x39,0xaa,0x2f,0x8c,0x39,0xec,0xbf,0x01,0x39,0x40,0xc4,0x14,0x39,0xc2,0xa7,0x96,0x39,0x33,0xe2,0x02,0x39,0x5f,0x33,0x78,0x39,0x91,0xc6,0x0f,0x39,0x30,0x0d,0x0d,0x39,0xee,0xa8,0x37,0x39,0x64,0xe2,0xc3,0x38,0x2c,0x74,0x66,0x39,0x1c,0xa6,0x29,0x39,0xed,0x0b,0x8b,0x39,0xa4,0x41,0x4b,0x39,0x99,0x60,0xa2,0x39,0xc8,0x78,0x8a,0x39,0x7e,0x57,0x02,0x39,0x03,0x4d,0x4f,0x39,0x20,0x96,0x4a,0x39,0x33,0xeb,0xa1,0x39,0xed,0x4c,0x4e,0x39,0xce,0xc5,0xb9,0x39,0x43,0x89,0x3a,0x39,0xcd,0x1c,0x62,0x39,0x79,0xd5,0x51,0x39,0x40,0xf4,0x58,0x39,0x50,0x2b,0x41,0x39,0x4b,0x83,0x9f,0x39,0x24,0x79,0x08,0x39,0x4c,0xed,0x6d,0x39,0x1b,0x38,0xee,0x39,0x96,0xfa,0x1b,0x39,0x98,0x40,0x06,0x39,0x1c,0x31,0x39,0x39,0x2c,0x3e,0x5b,0x39,0xd9,0x6a,0x42,0x39,0xc5,0xd7,0x04,0x39,0xe7,0x6b,0x83,0x39,0x2a,0x81,0x29,0x39,0xb0,0x01,0x38,0x39,0xc7,0x73,0x00,0x39,0xce,0xf5,0x12,0x39,0x43,0x48,0x58,0x39,0x85,0x2e,0x3a,0x39,0x1c,0x9e,0x12,0x39,0x0e,0xa7,0x35,0x39,0xd0,0x3b,0x1f,0x39,0x9d,0xc0,0xe6,0x38,0xb5,0xd0,0x62,0x39,0x20,0xc3,0x43,0x39,0xdb,0xcd,0x7e,0x39,0x70,0xc7,0x2a,0x39,0x16,0xc5,0x31,0x39,0x09,0x23,0x4b,0x39,0x08,0x2d,0x01,0x39,0x4a,0x45,0x78,0x39,0xfc,0x97,0x80,0x39,0x09,0x6f,0x4a,0x39,0xad,0xf2,0x4c,0x39,0xbc,0xaa,0xc1,0x39,0x9b,0x1b,0x50,0x39,0x1a,0x32,0x4a,0x39,0x76,0x80,0x14,0x39,0xa0,0x9c,0x90,0x39,0x6f,0x29,0x0a,0x39,0x11,0x99,0x67,0x39,0xc3,0x5f,0x22,0x39,0xb3,0x9d,0x36,0x39,0xff,0x2d,0x67,0x39,0x7f,0xe5,0x85,0x39,0x42,0x6f,0x01,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x33,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4a,0xdb,0xff,0xff,0x00,0x00,0x00,0x02,0xf0,0x05,0x00,0x00,0x0b,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xdd,0xff,0xff,0x8c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x25,0x9c,0x04,0x39,0xbe,0xe5,0x1d,0x39,0xb0,0x91,0x39,0x39,0x2f,0xd9,0xea,0x38,0x8a,0x1b,0x35,0x39,0x84,0x3a,0x08,0x39,0x85,0xc3,0x3e,0x39,0xf3,0x8c,0x09,0x39,0xf9,0xcf,0xe7,0x38,0xb9,0xf4,0xf5,0x38,0x06,0x3d,0x2d,0x39,0xa5,0x01,0xf4,0x38,0xfb,0x83,0xeb,0x38,0x56,0x3e,0x3b,0x39,0xa1,0xdc,0x49,0x39,0xa3,0x02,0xf2,0x38,0x83,0xd9,0xc8,0x38,0x8f,0xa5,0x0d,0x39,0xfb,0x00,0x0e,0x39,0x7c,0x23,0x04,0x39,0x39,0xa0,0x46,0x39,0xdf,0xe1,0x24,0x39,0x34,0xbc,0xfb,0x38,0x77,0x40,0x35,0x39,0x2c,0x34,0xe7,0x38,0x26,0x25,0x1b,0x39,0x4f,0x47,0x24,0x39,0x0a,0x7f,0x17,0x39,0x4e,0x43,0x1a,0x39,0x77,0x5a,0xda,0x38,0xdf,0xb8,0x27,0x39,0xf5,0x4d,0x44,0x39,0x02,0xb7,0xeb,0x38,0x73,0xde,0x36,0x39,0x36,0x31,0x36,0x39,0xa1,0xae,0x71,0x39,0x5d,0xd1,0x20,0x39,0xaf,0x8d,0x2e,0x39,0x7d,0x47,0xd0,0x38,0x01,0x56,0x1b,0x39,0x9d,0x39,0x0a,0x39,0x30,0xdf,0xfc,0x38,0x98,0xd7,0x02,0x39,0xae,0x20,0x43,0x39,0xd2,0xd2,0x0d,0x39,0xc4,0x9e,0x49,0x39,0xee,0x06,0x13,0x39,0x43,0xe2,0xf7,0x38,0x3e,0x24,0x27,0x39,0xbd,0xad,0x20,0x39,0x8c,0x3a,0x2e,0x39,0x96,0xcc,0x17,0x39,0x24,0xed,0x6d,0x39,0xaf,0x2b,0x0b,0x39,0x68,0xc7,0xd6,0x38,0xb0,0x77,0x12,0x39,0x59,0x47,0xde,0x38,0xfb,0x52,0x13,0x39,0x7a,0xd1,0x11,0x39,0x61,0xc0,0x08,0x39,0x6b,0xe3,0x25,0x39,0x57,0x8d,0x40,0x39,0x0c,0x12,0x29,0x39,0xf3,0x44,0xf7,0x38,0xc7,0x65,0x34,0x39,0x9d,0x76,0x10,0x39,0xad,0x7b,0x2f,0x39,0x4d,0xba,0x1b,0x39,0x2f,0x5e,0x6e,0x39,0x35,0xd2,0x12,0x39,0x2e,0x98,0x41,0x39,0x15,0x00,0x20,0x39,0x04,0x3e,0x4b,0x39,0xd1,0xc1,0xf0,0x38,0x1f,0x71,0x37,0x39,0xb1,0xec,0x3a,0x39,0xfb,0x2e,0x08,0x39,0x4f,0x79,0xf8,0x38,0x72,0x1d,0x22,0x39,0xf1,0x7b,0x4d,0x39,0xb2,0xa4,0x12,0x39,0xeb,0x9c,0x0e,0x39,0xab,0xbc,0x62,0x39,0xd1,0xa3,0x1c,0x39,0x8e,0x68,0xda,0x38,0x14,0xc8,0x54,0x39,0x3f,0xb8,0x2a,0x39,0xe4,0xf4,0x22,0x39,0x56,0xe6,0x48,0x39,0x99,0xc5,0x13,0x39,0x46,0x89,0x4f,0x39,0x5b,0x3c,0x21,0x39,0x9d,0xff,0x04,0x39,0xa6,0x17,0x44,0x39,0xc3,0x3d,0x85,0x39,0xb6,0x33,0x43,0x39,0xeb,0x41,0x14,0x39,0x90,0xde,0x05,0x39,0xc8,0xb3,0x30,0x39,0xf5,0x55,0x07,0x39,0x18,0x56,0x38,0x39,0x96,0x97,0x0d,0x39,0x50,0x87,0x02,0x39,0xba,0xe6,0x1f,0x39,0x7b,0xef,0x3c,0x39,0xa1,0x4f,0x04,0x39,0x4f,0x71,0x19,0x39,0xbe,0x12,0x36,0x39,0xd1,0x39,0x18,0x39,0x8e,0xd9,0x12,0x39,0x90,0xa1,0x0c,0x39,0x86,0x1e,0x1d,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4a,0xe1,0xff,0xff,0x00,0x00,0x00,0x02,0xf0,0x05,0x00,0x00,0x0a,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xe3,0xff,0xff,0x8c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xb9,0x5f,0xd7,0x38,0x27,0xb3,0x00,0x39,0x9b,0x23,0x2d,0x39,0x55,0x45,0xf4,0x38,0x55,0x22,0x3b,0x39,0x95,0x9e,0xf2,0x39,0x9c,0xa8,0x1f,0x39,0x24,0xa2,0x59,0x39,0xe1,0x73,0x50,0x39,0x4b,0x6a,0x88,0x39,0xf0,0x99,0x12,0x39,0x7d,0xe7,0x3a,0x39,0x9d,0xba,0x47,0x39,0x0b,0x89,0x01,0x39,0x47,0x25,0x05,0x39,0x85,0x8c,0xad,0x39,0xd7,0x15,0x96,0x39,0x18,0x08,0xa4,0x39,0x1d,0x02,0x35,0x39,0x1d,0x53,0x3b,0x39,0xc2,0x0a,0x2e,0x39,0xc9,0x31,0xed,0x38,0xe4,0xdb,0x02,0x39,0x2b,0x98,0x9a,0x39,0x2d,0x8f,0x1e,0x39,0x8e,0xfa,0x0b,0x39,0x7a,0xe5,0x6a,0x39,0x9b,0x27,0x01,0x39,0x3d,0x31,0x3a,0x39,0x50,0x6b,0x48,0x39,0x7f,0x1c,0x6e,0x39,0xca,0x7d,0xf6,0x38,0x71,0xbd,0x26,0x39,0xa3,0x38,0x45,0x39,0x17,0x7b,0x36,0x39,0x71,0x6a,0x61,0x39,0x99,0x63,0x10,0x39,0x80,0x29,0x41,0x39,0xd5,0x6f,0x3d,0x39,0x6d,0x1a,0x47,0x39,0xa3,0xa7,0x45,0x39,0x47,0x11,0x5e,0x39,0xd8,0xa6,0x33,0x39,0x02,0xc8,0x5b,0x39,0x46,0xd6,0x00,0x39,0xa7,0x32,0x16,0x39,0x82,0x47,0x20,0x39,0xd6,0x61,0x5f,0x39,0x32,0x4c,0x69,0x39,0xc4,0x4e,0x49,0x39,0x88,0x38,0x33,0x39,0xa7,0x07,0x0e,0x39,0x80,0x89,0xe6,0x38,0xb3,0xb0,0xa4,0x39,0x52,0x6b,0x19,0x39,0xff,0x82,0x90,0x39,0x17,0x50,0x20,0x39,0xe2,0x0b,0xd0,0x38,0xd0,0x51,0x78,0x39,0x35,0xe9,0x44,0x39,0x26,0xae,0xfc,0x38,0x33,0xc5,0x4b,0x39,0x86,0x49,0x45,0x39,0x0c,0xc0,0x9a,0x39,0x09,0x41,0x5f,0x39,0x76,0xba,0x1d,0x39,0x26,0x95,0x59,0x39,0xeb,0x94,0x01,0x39,0x33,0x96,0x82,0x39,0x90,0x45,0x35,0x39,0x67,0x82,0x4d,0x39,0xe4,0xfe,0x1e,0x39,0xed,0x0f,0x41,0x39,0xd9,0xdf,0x42,0x39,0x85,0x5a,0x8d,0x39,0x08,0xbb,0x31,0x39,0x15,0x4d,0x23,0x39,0x09,0x4c,0x31,0x39,0xb3,0xea,0xa7,0x39,0x82,0xc5,0x39,0x39,0xf7,0x34,0x76,0x39,0x86,0x91,0xcb,0x38,0x48,0xef,0x88,0x39,0x58,0x67,0xd6,0x38,0x8e,0x89,0x89,0x39,0x55,0x85,0x3b,0x39,0xd2,0x68,0x3a,0x3a,0x30,0x77,0x2f,0x39,0xf3,0xf4,0x20,0x39,0x70,0xbb,0x9e,0x39,0x43,0xbb,0x19,0x39,0xb9,0x75,0x0c,0x39,0xcb,0xaf,0x19,0x39,0xd5,0x91,0x24,0x39,0x7a,0xd8,0x87,0x39,0xd3,0x00,0x5a,0x39,0x83,0xad,0x5c,0x39,0xe7,0x24,0x4a,0x39,0xcf,0x0b,0x10,0x39,0x95,0x9b,0x13,0x39,0x5b,0x14,0x59,0x39,0x40,0x3d,0x73,0x39,0xba,0xed,0xfe,0x38,0x33,0x33,0x63,0x39,0x59,0x06,0x44,0x39,0x6a,0x61,0x3f,0x39,0xa2,0xdc,0x36,0x39,0x27,0x44,0x03,0x39,0x21,0x2a,0x7d,0x39,0xe0,0xe7,0x11,0x39,0x01,0x1c,0xc0,0x39,0x88,0xd2,0x05,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x37,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4a,0xe7,0xff,0xff,0x00,0x00,0x00,0x02,0xf0,0x05,0x00,0x00,0x09,0x00,0x00,0x00,0x5c,0x05,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xe9,0xff,0xff,0x8c,0x03,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x99,0xb6,0x0d,0x39,0xd8,0x43,0x08,0x39,0x66,0x77,0x19,0x39,0x24,0x13,0x22,0x39,0x77,0xf9,0xd7,0x38,0x1d,0x32,0x04,0x39,0xf0,0xf6,0x29,0x39,0x74,0x61,0xef,0x38,0x27,0xcf,0xe7,0x38,0xf6,0x46,0x0e,0x39,0xf2,0xff,0x0c,0x39,0x32,0x83,0xd0,0x38,0x43,0xf7,0x04,0x39,0x9a,0x5a,0xcc,0x38,0xac,0x00,0xf9,0x38,0xed,0xe8,0xef,0x38,0x71,0xbd,0x00,0x39,0xba,0xf8,0x13,0x39,0xf3,0x95,0x2f,0x39,0xe7,0x29,0xd6,0x38,0xa7,0xba,0x2a,0x39,0x8c,0x8f,0x7e,0x39,0x2c,0xad,0x34,0x39,0x1f,0x06,0xc3,0x38,0xb6,0x67,0x23,0x39,0x81,0x43,0xcc,0x38,0x8f,0xca,0x94,0x38,0xb0,0x46,0x81,0x38,0xa4,0xa7,0x54,0x39,0x2a,0xa1,0x48,0x39,0xa6,0x18,0x0a,0x39,0x06,0x8d,0xd8,0x38,0x56,0x13,0x00,0x39,0xa8,0xbb,0xb8,0x38,0xc4,0x34,0xb6,0x38,0xcd,0x88,0x15,0x39,0x2d,0x36,0xa6,0x38,0x55,0xcb,0x04,0x39,0xbe,0x7c,0x0f,0x39,0x79,0xd7,0xed,0x38,0x9c,0xd9,0x0d,0x39,0xd1,0x41,0x9d,0x38,0xd0,0x0d,0x15,0x39,0xbb,0xc7,0x0e,0x39,0xec,0xaf,0x00,0x39,0x04,0x43,0x1b,0x39,0x0c,0xd0,0x17,0x39,0x43,0xf5,0x11,0x39,0x58,0x96,0x10,0x39,0x90,0x55,0xbd,0x38,0x31,0x54,0x1e,0x39,0xed,0xc0,0xb6,0x38,0xc2,0x11,0x15,0x39,0x30,0x5e,0x09,0x39,0x20,0x95,0x05,0x39,0xae,0x7e,0xe0,0x38,0x8c,0x10,0xfb,0x38,0x60,0x6b,0x4b,0x39,0x93,0x44,0x11,0x39,0xae,0xd9,0x01,0x39,0xfa,0x52,0xda,0x38,0x86,0x85,0x32,0x39,0x81,0x00,0x2a,0x39,0xd8,0x90,0x7a,0x39,0x45,0x26,0x2f,0x39,0xfb,0x34,0xdb,0x38,0x1b,0x13,0x01,0x39,0x15,0x92,0xe1,0x38,0x36,0x1d,0x37,0x39,0xcf,0x70,0xdd,0x38,0x08,0x63,0x26,0x39,0x89,0xca,0x11,0x39,0x9d,0x84,0x83,0x38,0x59,0x02,0xc3,0x38,0xeb,0xb2,0xb1,0x38,0x05,0x5b,0x20,0x39,0x50,0x8a,0x02,0x39,0x6e,0xbc,0xfb,0x38,0x4e,0xd6,0x0f,0x39,0x9c,0x54,0xf5,0x38,0xe3,0x84,0xcf,0x38,0x2b,0x2b,0x29,0x39,0xbc,0xb9,0x13,0x39,0x8e,0x74,0xda,0x38,0xeb,0x83,0xbb,0x38,0xd0,0xf4,0x24,0x39,0xdd,0xa6,0x0e,0x39,0x5c,0x5b,0xdd,0x38,0x59,0x1c,0xf7,0x38,0x29,0x91,0xf4,0x38,0x31,0x89,0x08,0x39,0x43,0xed,0x69,0x38,0xd9,0xf4,0xf0,0x38,0x30,0xea,0x64,0x39,0x99,0xc6,0x4b,0x39,0x02,0x58,0x34,0x39,0xc9,0x14,0x57,0x39,0x72,0x18,0xd5,0x38,0xf5,0x40,0x21,0x39,0x03,0x27,0x1d,0x39,0x82,0xb5,0x38,0x39,0x17,0x43,0x04,0x39,0xdb,0x5f,0xfe,0x38,0x69,0x27,0x08,0x39,0x2a,0x40,0x0e,0x39,0x35,0x6f,0x31,0x39,0x47,0xa3,0x24,0x39,0x17,0x50,0x06,0x39,0x42,0x62,0xf8,0x38,0x20,0x1a,0xe8,0x38,0x5c,0x6e,0x3a,0x39,0x52,0x38,0xd9,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x4a,0xed,0xff,0xff,0x00,0x00,0x00,0x02,0xd0,0x07,0x00,0x00,0x08,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x54,0xef,0xff,0xff,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x86,0x9f,0xf3,0x38,0xae,0x5b,0x30,0x39,0xb0,0xcd,0xd7,0x38,0x8b,0x52,0xf3,0x38,0x9e,0x49,0x06,0x39,0xdc,0x4c,0x9d,0x3b,0xbd,0x7d,0x50,0x39,0x86,0x3f,0x41,0x39,0x38,0x17,0x5c,0x39,0x28,0x54,0x3c,0x39,0x0f,0xf3,0x3a,0x39,0xc0,0xe4,0x1d,0x3c,0x73,0x75,0x16,0x39,0xc4,0xa7,0x64,0x39,0x92,0x4b,0x45,0x39,0x29,0x24,0x11,0x39,0x62,0x5d,0xe7,0x38,0xaf,0x4a,0x88,0x39,0x81,0xd0,0x09,0x39,0x44,0x9a,0x4b,0x39,0x57,0xe9,0x15,0x39,0x04,0xd9,0x35,0x3b,0x6a,0x33,0x2d,0x3b,0xdb,0x42,0x43,0x39,0x85,0x7a,0x41,0x39,0x95,0x3f,0xf1,0x39,0x86,0xdc,0xc3,0x38,0xbf,0x12,0xc3,0x38,0x9e,0x91,0x68,0x39,0x14,0xa1,0x1e,0x39,0x06,0x63,0x4f,0x39,0x82,0xc7,0xdd,0x38,0x2f,0x19,0xf6,0x38,0xbd,0x5f,0x5d,0x39,0x1f,0x76,0x16,0x39,0xc1,0x5e,0x26,0x39,0x9b,0xfb,0x9f,0x39,0xea,0xc8,0xc2,0x38,0xa1,0x28,0xfc,0x38,0xfd,0xc1,0x61,0x39,0xea,0xed,0x0f,0x39,0xff,0x00,0xa1,0x39,0x89,0xde,0x03,0x39,0x8e,0xec,0x27,0x39,0xd2,0x52,0x4f,0x39,0x7c,0xe6,0xfc,0x38,0xe3,0xc0,0x19,0x39,0xf8,0x59,0x07,0x39,0x7f,0xcc,0xf6,0x38,0x8b,0xcc,0x87,0x39,0x4f,0x45,0xf3,0x38,0x4f,0xf9,0xb2,0x39,0xbe,0x77,0xfb,0x38,0x9b,0x50,0x01,0x39,0x89,0x8d,0x8e,0x39,0x57,0xda,0x2d,0x39,0x6d,0x9b,0x46,0x39,0xed,0xb5,0x09,0x39,0xe3,0xc3,0xa3,0x39,0x50,0x2d,0x61,0x3b,0x76,0x5e,0x27,0x39,0xc8,0xca,0x15,0x39,0xd9,0x84,0x87,0x39,0x3f,0x62,0x2f,0x39,0xb5,0xee,0x4e,0x39,0xd5,0x6f,0x48,0x39,0xbc,0xed,0x38,0x3c,0xc3,0xd3,0x2d,0x39,0x89,0xd3,0x43,0x39,0xfc,0xc0,0x1b,0x39,0xd4,0x4d,0x21,0x39,0x58,0xf5,0x05,0x39,0x76,0xfc,0x2f,0x39,0x99,0x57,0x83,0x39,0x45,0x0e,0x0c,0x39,0x74,0xa0,0xfa,0x38,0xac,0xbb,0x77,0x39,0x56,0xb3,0xec,0x38,0x3d,0x2d,0x6b,0x39,0x16,0x9e,0x37,0x39,0xc9,0x8d,0x1b,0x39,0x26,0x56,0x32,0x39,0x3b,0xdb,0x0a,0x39,0x50,0xe4,0xd6,0x38,0x88,0xe9,0xcd,0x38,0xe1,0x1a,0x6d,0x39,0x2e,0xb2,0xad,0x39,0x0a,0xfd,0x0b,0x39,0x1e,0x63,0x13,0x39,0x2a,0xea,0x2b,0x39,0x62,0x1d,0x4c,0x39,0x08,0xf5,0x1f,0x39,0xfa,0x40,0x37,0x39,0x57,0x88,0x01,0x39,0x26,0xe4,0x0f,0x39,0x15,0x45,0x5a,0x39,0xb2,0x3d,0x2a,0x39,0x66,0xd8,0x23,0x39,0x7f,0xfe,0x86,0x39,0xc1,0xda,0x30,0x39,0xee,0xdc,0x5a,0x39,0x9c,0x8c,0x02,0x39,0x5e,0x4d,0x8a,0x39,0x42,0xd5,0x07,0x39,0x5a,0xbd,0x0f,0x39,0x62,0x0f,0x22,0x39,0x33,0x2f,0x8e,0x39,0xdb,0x17,0x52,0x39,0x42,0xe5,0xa1,0x39,0x27,0x3d,0xe5,0x38,0xd2,0x4d,0xec,0x38,0x73,0x52,0x35,0x3b,0xda,0x4d,0x1b,0x39,0x49,0x21,0x40,0x39,0xc7,0x19,0x47,0x39,0xe8,0x28,0x38,0x39,0x88,0x70,0x0a,0x39,0x92,0x3b,0x3f,0x39,0x48,0x3d,0x0a,0x39,0xc5,0x8a,0x07,0x39,0x6e,0xa3,0x25,0x39,0x37,0x47,0xf3,0x38,0xd5,0x15,0x22,0x39,0xd1,0x2f,0x01,0x39,0xa7,0x7c,0x0b,0x3a,0xf4,0x3f,0xeb,0x38,0x53,0x65,0x51,0x39,0x1e,0x43,0x0f,0x39,0x28,0x34,0x22,0x39,0xca,0xd7,0x17,0x39,0xc5,0xb4,0x1f,0x39,0x5f,0x8a,0x0e,0x39,0x6d,0xe9,0x13,0x39,0xa1,0x1e,0x3a,0x39,0x76,0x35,0xf7,0x38,0x67,0x69,0x34,0x39,0x1e,0x82,0x08,0x39,0xbe,0x64,0x2f,0x39,0x2b,0x56,0x13,0x39,0xff,0xbb,0x18,0x39,0xb2,0x52,0x02,0x39,0x2d,0x33,0x03,0x39,0x47,0x46,0x25,0x39,0x7e,0x25,0x36,0x39,0x27,0x4b,0xda,0x38,0xf6,0xef,0x0f,0x39,0x24,0xf8,0x94,0x39,0xb0,0x42,0x24,0x39,0x86,0xe4,0x7c,0x39,0xb2,0x48,0x9c,0x39,0x73,0xf4,0x26,0x39,0x8c,0xb0,0x27,0x39,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x34,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x2a,0xf5,0xff,0xff,0x00,0x00,0x00,0x02,0xd0,0x07,0x00,0x00,0x07,0x00,0x00,0x00,0x3c,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x34,0xf7,0xff,0xff,0xcc,0x04,0x00,0x00,0x04,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x37,0xac,0x4b,0x39,0xd9,0x9d,0x3c,0x39,0x41,0xb2,0x75,0x39,0x97,0xf0,0x6a,0x39,0x98,0x6f,0x6b,0x39,0x1a,0x20,0x18,0x38,0x30,0x3b,0x5a,0x39,0x44,0x10,0x3b,0x39,0x51,0xe7,0x2b,0x39,0x4b,0xea,0x50,0x39,0x08,0x4b,0x96,0x39,0x62,0x8a,0xa8,0x36,0x27,0xc3,0x5c,0x39,0xd5,0xfd,0x15,0x39,0x11,0x0d,0x7b,0x39,0x2b,0x56,0x22,0x39,0xee,0x5f,0x14,0x39,0x0a,0x87,0x21,0x39,0xe7,0xa6,0x19,0x39,0x3f,0x12,0x75,0x39,0xc6,0x46,0x80,0x39,0x79,0xd4,0xbb,0x37,0xc1,0xea,0xf8,0x36,0xf6,0xbf,0x4e,0x39,0xc8,0x5c,0x44,0x39,0xcf,0x1b,0x00,0x39,0x7f,0x6f,0x2a,0x39,0x03,0x1e,0x65,0x39,0xf0,0xdb,0x22,0x39,0xa4,0xc5,0xae,0x39,0x87,0x85,0x22,0x39,0x18,0x60,0x75,0x39,0xeb,0x92,0x87,0x39,0xbc,0x90,0x38,0x39,0x4c,0xdb,0x5e,0x39,0x35,0x04,0x7d,0x39,0xc1,0x80,0x58,0x39,0xc7,0xfb,0x3b,0x39,0xf9,0xf5,0x48,0x39,0xe0,0x67,0x2e,0x39,0x9e,0x36,0x67,0x39,0x03,0xa8,0x20,0x39,0x23,0xab,0x3e,0x39,0x66,0x83,0x57,0x39,0x9e,0x4f,0x46,0x39,0xa9,0xb8,0x40,0x39,0x78,0xe7,0x2e,0x39,0x74,0x2b,0x25,0x39,0xbf,0xe0,0x37,0x39,0x5d,0x0a,0x3b,0x39,0x3e,0x14,0x77,0x39,0xa9,0x88,0x1a,0x39,0x50,0x61,0x33,0x39,0x71,0xac,0x34,0x39,0x56,0x44,0x15,0x39,0x60,0x33,0x0e,0x39,0x02,0x40,0x03,0x39,0xb1,0x68,0x62,0x39,0x7e,0xfb,0x83,0x39,0x8a,0xc7,0x70,0x37,0xb5,0xa0,0x38,0x39,0x0b,0xdb,0x18,0x39,0xf3,0xf4,0x8a,0x39,0x57,0x9a,0x2c,0x39,0x4d,0xb2,0x54,0x39,0xb5,0xf4,0x2b,0x39,0x7a,0xfe,0xc6,0x37,0xc2,0x56,0x42,0x39,0x5b,0x3a,0x46,0x39,0x8b,0x76,0xa9,0x39,0xfd,0x20,0x2b,0x39,0x36,0xce,0x32,0x39,0xe1,0xef,0x5f,0x39,0x30,0x02,0x3b,0x39,0x03,0xe2,0x61,0x39,0x09,0x26,0x6e,0x39,0xc2,0x4c,0x5a,0x39,0xbb,0x9d,0x11,0x39,0x9c,0x8e,0x57,0x39,0xd0,0xff,0x40,0x39,0x25,0x4f,0x35,0x39,0x7b,0xaa,0x2b,0x39,0xcb,0x6e,0x54,0x39,0x49,0x45,0x8d,0x39,0xa3,0x79,0x52,0x39,0x51,0xce,0x96,0x39,0x92,0x44,0x5b,0x39,0x40,0x99,0x21,0x39,0x76,0xbe,0x5d,0x39,0x0a,0x48,0x73,0x39,0xc3,0xd9,0xf4,0x38,0x03,0xc9,0x78,0x39,0x8c,0x4d,0x73,0x39,0xe8,0xcc,0x30,0x39,0xdf,0xbc,0x66,0x39,0xe2,0x38,0x82,0x39,0x52,0x6f,0x75,0x39,0xfc,0xe9,0x6a,0x39,0x45,0xab,0x2e,0x39,0x41,0x75,0x53,0x39,0x78,0xb3,0x15,0x39,0xdf,0x82,0x64,0x39,0xe7,0x1d,0x46,0x39,0xf7,0x5b,0x42,0x39,0x47,0x6e,0x3c,0x39,0x5d,0x20,0x4c,0x39,0xb7,0x1c,0x8a,0x39,0xf6,0xeb,0x43,0x39,0x81,0x5b,0x11,0x39,0xba,0xa1,0x4c,0x39,0xa3,0xf2,0x46,0x39,0xf6,0xef,0x80,0x37,0x85,0xb2,0x23,0x39,0x24,0x60,0x8c,0x39,0xc8,0xe7,0xf6,0x38,0x98,0x07,0x03,0x39,0x0c,0xc6,0x23,0x39,0xcd,0xc9,0x6e,0x39,0x1a,0x24,0x2f,0x39,0x9f,0x3f,0x3b,0x39,0x80,0x59,0x06,0x39,0x94,0x7e,0x6a,0x39,0xce,0x57,0x61,0x39,0x74,0xdb,0x51,0x39,0x94,0xc4,0x1a,0x39,0x59,0xf6,0x2a,0x39,0x1a,0xdc,0x30,0x39,0xb6,0x56,0x22,0x39,0x67,0xdd,0x40,0x39,0xa4,0xf7,0x15,0x39,0xba,0x0c,0x2b,0x39,0x92,0xd9,0x42,0x39,0xf5,0x2b,0x2f,0x39,0x15,0xfa,0x1e,0x39,0x0c,0x28,0x32,0x39,0xf9,0xe9,0x13,0x39,0x63,0x5f,0x81,0x39,0x90,0x1c,0x37,0x39,0x4e,0x63,0x31,0x39,0x7d,0x4d,0x68,0x39,0x37,0xdc,0xaa,0x39,0x65,0x10,0x15,0x39,0x04,0x3b,0x68,0x39,0x76,0xa4,0x51,0x39,0x7a,0xe8,0x30,0x39,0xd5,0x8b,0x2c,0x39,0xdf,0x19,0x01,0x39,0xb5,0x7d,0x17,0x39,0xc5,0x46,0x24,0x39,0x7d,0x95,0x33,0x39,0x6c,0x23,0x76,0x39,0xb1,0xcf,0xe8,0x38,0x84,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x33,0x39,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x98,0x00,0x00,0x00,0x0a,0xfd,0xff,0xff,0x00,0x00,0x00,0x02,0xdc,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x14,0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xc2,0xfe,0xfe,0x37,0x80,0x09,0x03,0x39,0x4c,0xb7,0x5d,0x37,0x43,0x56,0xa9,0x35,0x83,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x35,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xf6,0xfd,0xff,0xff,0x00,0x00,0x00,0x02,0x4c,0x01,0x00,0x00,0x05,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x9d,0x83,0xb4,0x37,0xef,0xe1,0xb6,0x38,0x33,0x53,0xb2,0x37,0x73,0x85,0x42,0x38,0x33,0xfc,0x88,0x36,0xa3,0xb6,0x3f,0x38,0x6f,0x4b,0xbc,0x38,0x95,0xc4,0x3c,0x39,0x0b,0xe7,0x43,0x38,0xbd,0x8e,0x22,0x37,0xfe,0x44,0x08,0x36,0x3b,0x6a,0xc1,0x36,0x83,0x00,0x00,0x00,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x3b,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x5f,0x31,0x2f,0x53,0x74,0x61,0x74,0x65,0x66,0x75,0x6c,0x50,0x61,0x72,0x74,0x69,0x74,0x69,0x6f,0x6e,0x65,0x64,0x43,0x61,0x6c,0x6c,0x2f,0x46,0x75,0x73,0x65,0x64,0x42,0x61,0x74,0x63,0x68,0x4e,0x6f,0x72,0x6d,0x56,0x33,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x52,0xff,0xff,0xff,0x00,0x00,0x00,0x02,0x24,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x90,0xff,0xff,0xff,0x0a,0x00,0x00,0x00,0x75,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x5f,0x38,0x30,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x8a,0xff,0xff,0xff,0x00,0x00,0x00,0x02,0x24,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xc8,0xff,0xff,0xff,0x0a,0x00,0x00,0x00,0x75,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x5f,0x34,0x39,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xc2,0xff,0xff,0xff,0x00,0x00,0x00,0x02,0x28,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x75,0x6e,0x6b,0x6e,0x6f,0x77,0x6e,0x5f,0x31,0x35,0x37,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x08,0x00,0x07,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x60,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x0c,0x00,0x14,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x10,0x00,0x0c,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x19,0x5f,0xf7,0x3b,0x01,0x00,0x00,0x00,0xb7,0xb0,0xc0,0x3f,0x01,0x00,0x00,0x00,0x0a,0xdc,0xd6,0xbe,0x05,0x00,0x00,0x00,0x69,0x6e,0x70,0x75,0x74,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x07,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xd2,0xff,0xff,0xff,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xf2,0xff,0xff,0xff,0x00,0x00,0x00,0x22,0x02,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0e,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0c,0x00,0x07,0x00,0x00,0x00,0x08,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,}; +const unsigned int g_vww2_50_50_INT8_model_data_size = 280384; \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.h b/components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.h new file mode 100644 index 00000000..c386f633 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/models/vww2_50_50_INT8_model_data.h @@ -0,0 +1,2 @@ +extern const unsigned char g_vww2_50_50_INT8_model_data[]; +extern const unsigned int g_vww2_50_50_INT8_model_data_size; \ No newline at end of file diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.cc b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.cc new file mode 100644 index 00000000..f1b179f3 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.cc @@ -0,0 +1,249 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/recording_micro_allocator.h" + +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/micro/recording_simple_memory_allocator.h" + +namespace tflite { + +RecordingMicroAllocator::RecordingMicroAllocator( + RecordingSimpleMemoryAllocator *recording_memory_allocator, + ErrorReporter *error_reporter) + : MicroAllocator(recording_memory_allocator, error_reporter), + recording_memory_allocator_(recording_memory_allocator) +{ +} + +RecordingMicroAllocator *RecordingMicroAllocator::Create( + uint8_t *tensor_arena, size_t arena_size, ErrorReporter *error_reporter) +{ + TFLITE_DCHECK(error_reporter != nullptr); + + RecordingSimpleMemoryAllocator *simple_memory_allocator = + RecordingSimpleMemoryAllocator::Create(error_reporter, tensor_arena, + arena_size); + TFLITE_DCHECK(simple_memory_allocator != nullptr); + + uint8_t *allocator_buffer = simple_memory_allocator->AllocateFromTail( + sizeof(RecordingMicroAllocator), alignof(RecordingMicroAllocator)); + RecordingMicroAllocator *allocator = new (allocator_buffer) + RecordingMicroAllocator(simple_memory_allocator, error_reporter); + return allocator; +} + +RecordedAllocation RecordingMicroAllocator::GetRecordedAllocation( + RecordedAllocationType allocation_type) const +{ + switch (allocation_type) { + case RecordedAllocationType::kTfLiteEvalTensorData: + return recorded_tflite_eval_tensor_data_; + case RecordedAllocationType::kPersistentTfLiteTensorData: + return recorded_persistent_tflite_tensor_data_; + case RecordedAllocationType::kPersistentTfLiteTensorQuantizationData: + return recorded_persistent_tflite_tensor_quantization_data_; + case RecordedAllocationType::kPersistentBufferData: + return recorded_persistent_buffer_data_; + case RecordedAllocationType::kTfLiteTensorVariableBufferData: + return recorded_tflite_tensor_variable_buffer_data_; + case RecordedAllocationType::kNodeAndRegistrationArray: + return recorded_node_and_registration_array_data_; + case RecordedAllocationType::kOpData: + return recorded_op_data_; + } + TF_LITE_REPORT_ERROR(error_reporter(), "Invalid allocation type supplied: %d", + allocation_type); + return RecordedAllocation(); +} + +const RecordingSimpleMemoryAllocator * +RecordingMicroAllocator::GetSimpleMemoryAllocator() const +{ + return recording_memory_allocator_; +} + +void RecordingMicroAllocator::PrintAllocations() const +{ + TF_LITE_REPORT_ERROR( + error_reporter(), + "[RecordingMicroAllocator] Arena allocation total %d bytes", + recording_memory_allocator_->GetUsedBytes()); + TF_LITE_REPORT_ERROR( + error_reporter(), + "[RecordingMicroAllocator] Arena allocation head %d bytes", + recording_memory_allocator_->GetHeadUsedBytes()); + TF_LITE_REPORT_ERROR( + error_reporter(), + "[RecordingMicroAllocator] Arena allocation tail %d bytes", + recording_memory_allocator_->GetTailUsedBytes()); + PrintRecordedAllocation(RecordedAllocationType::kTfLiteEvalTensorData, + "TfLiteEvalTensor data", "allocations"); + PrintRecordedAllocation(RecordedAllocationType::kPersistentTfLiteTensorData, + "Persistent TfLiteTensor data", "tensors"); + PrintRecordedAllocation( + RecordedAllocationType::kPersistentTfLiteTensorQuantizationData, + "Persistent TfLiteTensor quantization data", "allocations"); + PrintRecordedAllocation(RecordedAllocationType::kPersistentBufferData, + "Persistent buffer data", "allocations"); + PrintRecordedAllocation( + RecordedAllocationType::kTfLiteTensorVariableBufferData, + "TfLiteTensor variable buffer data", "allocations"); + PrintRecordedAllocation(RecordedAllocationType::kNodeAndRegistrationArray, + "NodeAndRegistration struct", + "NodeAndRegistration structs"); + PrintRecordedAllocation(RecordedAllocationType::kOpData, + "Operator runtime data", "OpData structs"); +} + +void *RecordingMicroAllocator::AllocatePersistentBuffer(size_t bytes) +{ + RecordedAllocation allocations = SnapshotAllocationUsage(); + void *buffer = MicroAllocator::AllocatePersistentBuffer(bytes); + RecordAllocationUsage(allocations, recorded_persistent_buffer_data_); + + return buffer; +} + +void RecordingMicroAllocator::PrintRecordedAllocation( + RecordedAllocationType allocation_type, const char *allocation_name, + const char *allocation_description) const +{ +#ifndef TF_LITE_STRIP_ERROR_STRINGS + RecordedAllocation allocation = GetRecordedAllocation(allocation_type); + if (allocation.used_bytes > 0 || allocation.requested_bytes > 0) { + TF_LITE_REPORT_ERROR( + error_reporter(), + "[RecordingMicroAllocator] '%s' used %d bytes with alignment overhead " + "(requested %d bytes for %d %s)", + allocation_name, allocation.used_bytes, allocation.requested_bytes, + allocation.count, allocation_description); + } +#endif +} + +TfLiteStatus RecordingMicroAllocator::AllocateNodeAndRegistrations( + const Model *model, SubgraphAllocations *subgraph_allocations) +{ + RecordedAllocation allocations = SnapshotAllocationUsage(); + + TfLiteStatus status = + MicroAllocator::AllocateNodeAndRegistrations(model, subgraph_allocations); + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + RecordAllocationUsage(allocations, + recorded_node_and_registration_array_data_); + // The allocation count in SimpleMemoryAllocator will only be 1. To provide + // better logging, decrement by 1 and add in the actual number of operators + // used in the graph: + // The allocation for this recording will always be 1. This is because the + // parent class mallocs one large allocation for the number of nodes in the + // graph (e.g. sizeof(NodeAndRegistration) * num_nodes). + // To prevent extra overhead and potential for fragmentation, manually + // adjust the accounting by decrementing by 1 and adding the actual number + // of nodes used in the graph: + recorded_node_and_registration_array_data_.count += + model->subgraphs()->Get(subgraph_idx)->operators()->size() - 1; + } + return status; +} + +TfLiteStatus RecordingMicroAllocator::AllocateTfLiteEvalTensors( + const Model *model, SubgraphAllocations *subgraph_allocations) +{ + RecordedAllocation allocations = SnapshotAllocationUsage(); + + TfLiteStatus status = + MicroAllocator::AllocateTfLiteEvalTensors(model, subgraph_allocations); + for (size_t subgraph_idx = 0; subgraph_idx < model->subgraphs()->size(); + subgraph_idx++) { + RecordAllocationUsage(allocations, recorded_tflite_eval_tensor_data_); + // The allocation for this recording will always be 1. This is because the + // parent class mallocs one large allocation for the number of tensors in + // the graph (e.g. sizeof(TfLiteEvalTensor) * num_tensors). To prevent extra + // overhead and potential for fragmentation, manually adjust the accounting + // by decrementing by 1 and adding the actual number of tensors used in the + // graph: + recorded_tflite_eval_tensor_data_.count += + model->subgraphs()->Get(subgraph_idx)->tensors()->size() - 1; + } + return status; +} + +TfLiteStatus RecordingMicroAllocator::AllocateVariables( + const SubGraph *subgraph, TfLiteEvalTensor *eval_tensors) +{ + RecordedAllocation allocations = SnapshotAllocationUsage(); + + TfLiteStatus status = + MicroAllocator::AllocateVariables(subgraph, eval_tensors); + + RecordAllocationUsage(allocations, + recorded_tflite_tensor_variable_buffer_data_); + return status; +} + +TfLiteTensor * +RecordingMicroAllocator::AllocatePersistentTfLiteTensorInternal() +{ + RecordedAllocation allocations = SnapshotAllocationUsage(); + + TfLiteTensor *result = + MicroAllocator::AllocatePersistentTfLiteTensorInternal(); + + RecordAllocationUsage(allocations, recorded_persistent_tflite_tensor_data_); + return result; +} + +TfLiteStatus RecordingMicroAllocator::PopulateTfLiteTensorFromFlatbuffer( + const Model *model, TfLiteTensor *tensor, int tensor_index, + int subgraph_index, bool allocate_temp) +{ + RecordedAllocation allocations = SnapshotAllocationUsage(); + + TfLiteStatus status = MicroAllocator::PopulateTfLiteTensorFromFlatbuffer( + model, tensor, tensor_index, subgraph_index, allocate_temp); + + RecordAllocationUsage(allocations, + recorded_persistent_tflite_tensor_quantization_data_); + return status; +} + +RecordedAllocation RecordingMicroAllocator::SnapshotAllocationUsage() const +{ + return { /*requested_bytes=*/recording_memory_allocator_->GetRequestedBytes(), + /*used_bytes=*/recording_memory_allocator_->GetUsedBytes(), + /*count=*/recording_memory_allocator_->GetAllocatedCount() }; +} + +void RecordingMicroAllocator::RecordAllocationUsage( + const RecordedAllocation &snapshotted_allocation, + RecordedAllocation &recorded_allocation) +{ + recorded_allocation.requested_bytes += + recording_memory_allocator_->GetRequestedBytes() - + snapshotted_allocation.requested_bytes; + recorded_allocation.used_bytes += + recording_memory_allocator_->GetUsedBytes() - + snapshotted_allocation.used_bytes; + recorded_allocation.count += + recording_memory_allocator_->GetAllocatedCount() - + snapshotted_allocation.count; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.h b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.h new file mode 100644 index 00000000..cd2bfa7b --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator.h @@ -0,0 +1,121 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_RECORDING_MICRO_ALLOCATOR_H_ +#define TENSORFLOW_LITE_MICRO_RECORDING_MICRO_ALLOCATOR_H_ + +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/micro/recording_simple_memory_allocator.h" + +namespace tflite { +// List of buckets currently recorded by this class. Each type keeps a list of +// allocated information during model initialization. +// TODO(b/169834511): Add tracking for scratch buffer allocations. +enum class RecordedAllocationType { + kTfLiteEvalTensorData, + kPersistentTfLiteTensorData, + kPersistentTfLiteTensorQuantizationData, + kPersistentBufferData, + kTfLiteTensorVariableBufferData, + kNodeAndRegistrationArray, + kOpData, +}; + +// Container for holding information about allocation recordings by a given +// type. Each recording contains the number of bytes requested, the actual bytes +// allocated (can defer from requested by alignment), and the number of items +// allocated. +struct RecordedAllocation { + size_t requested_bytes; + size_t used_bytes; + size_t count; +}; + +// Utility subclass of MicroAllocator that records all allocations +// inside the arena. A summary of allocations can be logged through the +// ErrorReporter by invoking LogAllocations(). This special allocator requires +// an instance of RecordingSimpleMemoryAllocator to capture allocations in the +// head and tail. Arena allocation recording can be retrieved by type through +// the GetRecordedAllocation() function. This class should only be used for +// auditing memory usage or integration testing. +class RecordingMicroAllocator : public MicroAllocator { +public: + static RecordingMicroAllocator *Create(uint8_t *tensor_arena, + size_t arena_size, + ErrorReporter *error_reporter); + + // Returns the recorded allocations information for a given allocation type. + RecordedAllocation GetRecordedAllocation( + RecordedAllocationType allocation_type) const; + + const RecordingSimpleMemoryAllocator *GetSimpleMemoryAllocator() const; + + // Logs out through the ErrorReporter all allocation recordings by type + // defined in RecordedAllocationType. + void PrintAllocations() const; + + void *AllocatePersistentBuffer(size_t bytes) override; + +protected: + TfLiteStatus AllocateNodeAndRegistrations( + const Model *model, SubgraphAllocations *subgraph_allocations) override; + TfLiteStatus AllocateTfLiteEvalTensors( + const Model *model, SubgraphAllocations *subgraph_allocations) override; + TfLiteStatus AllocateVariables(const SubGraph *subgraph, + TfLiteEvalTensor *eval_tensors) override; + // TODO(b/162311891): Once all kernels have been updated to the new API drop + // this method. It is only used to record TfLiteTensor persistent allocations. + TfLiteTensor *AllocatePersistentTfLiteTensorInternal() override; + + // TODO(b/162311891): Once all kernels have been updated to the new API drop + // this function since all allocations for quantized data will take place in + // the temp section. + TfLiteStatus PopulateTfLiteTensorFromFlatbuffer(const Model *model, + TfLiteTensor *tensor, + int tensor_index, + int subgraph_index, + bool allocate_temp) override; + +private: + RecordingMicroAllocator(RecordingSimpleMemoryAllocator *memory_allocator, + ErrorReporter *error_reporter); + + void PrintRecordedAllocation(RecordedAllocationType allocation_type, + const char *allocation_name, + const char *allocation_description) const; + + RecordedAllocation SnapshotAllocationUsage() const; + void RecordAllocationUsage(const RecordedAllocation &snapshotted_allocation, + RecordedAllocation &recorded_allocation); + + const RecordingSimpleMemoryAllocator *recording_memory_allocator_; + + RecordedAllocation recorded_tflite_eval_tensor_data_ = {}; + RecordedAllocation recorded_persistent_tflite_tensor_data_ = {}; + RecordedAllocation recorded_persistent_tflite_tensor_quantization_data_ = {}; + RecordedAllocation recorded_persistent_buffer_data_ = {}; + RecordedAllocation recorded_tflite_tensor_variable_buffer_data_ = {}; + RecordedAllocation recorded_node_and_registration_array_data_ = {}; + + // TODO(b/187993291): Re-enable OpData allocating tracking. + RecordedAllocation recorded_op_data_ = {}; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_RECORDING_MICRO_ALLOCATOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator_test.cc new file mode 100644 index 00000000..d1b79438 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_allocator_test.cc @@ -0,0 +1,302 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/recording_micro_allocator.h" + +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/micro_allocator.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" +#include "tensorflow/lite/micro/testing/test_conv_model.h" + +#define TF_LITE_TENSOR_STRUCT_SIZE sizeof(TfLiteTensor) +#define TF_LITE_EVAL_TENSOR_STRUCT_SIZE sizeof(TfLiteEvalTensor) +#define TF_LITE_AFFINE_QUANTIZATION_SIZE sizeof(TfLiteAffineQuantization) +#define NODE_AND_REGISTRATION_STRUCT_SIZE sizeof(tflite::NodeAndRegistration) + +// TODO(b/158303868): Move tests into anonymous namespace. +namespace { + +constexpr int kTestConvArenaSize = 1024 * 12; + +} // namespace + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestRecordsTfLiteEvalTensorArrayData) +{ + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver all_ops_resolver; + const tflite::Model *model = tflite::GetModel(kTestConvModelData); + uint8_t arena[kTestConvArenaSize]; + + tflite::RecordingMicroAllocator *micro_allocator = + tflite::RecordingMicroAllocator::Create(arena, kTestConvArenaSize, + tflite::GetMicroErrorReporter()); + // TODO(b/158102673): ugly workaround for not having fatal assertions. Same + // throughout this file. + TF_LITE_MICRO_EXPECT_NE(micro_allocator, nullptr); + if (micro_allocator == nullptr) + return 1; + + tflite::SubgraphAllocations *subgraph_allocations = + micro_allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + if (subgraph_allocations == nullptr) + return 1; + + TfLiteStatus status = micro_allocator->FinishModelAllocation( + model, subgraph_allocations, &scratch_buffer_handles); + TF_LITE_MICRO_EXPECT_EQ(status, kTfLiteOk); + if (status != kTfLiteOk) + return 1; + + micro_allocator->PrintAllocations(); + + tflite::RecordedAllocation recorded_allocation = + micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteEvalTensorData); + + micro_allocator->PrintAllocations(); + + size_t tensors_count = tflite::testing::GetModelTensorCount(model); + + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, tensors_count); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + tensors_count * TF_LITE_EVAL_TENSOR_STRUCT_SIZE); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + tensors_count * TF_LITE_EVAL_TENSOR_STRUCT_SIZE); +} + +TF_LITE_MICRO_TEST(TestRecordsNodeAndRegistrationArrayData) +{ + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver all_ops_resolver; + const tflite::Model *model = tflite::GetModel(kTestConvModelData); + uint8_t arena[kTestConvArenaSize]; + + tflite::RecordingMicroAllocator *micro_allocator = + tflite::RecordingMicroAllocator::Create(arena, kTestConvArenaSize, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(micro_allocator, nullptr); + if (micro_allocator == nullptr) + return 1; + + tflite::SubgraphAllocations *subgraph_allocations = + micro_allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + if (subgraph_allocations == nullptr) + return 1; + + TfLiteStatus status = micro_allocator->FinishModelAllocation( + model, subgraph_allocations, &scratch_buffer_handles); + TF_LITE_MICRO_EXPECT_EQ(status, kTfLiteOk); + if (status != kTfLiteOk) + return 1; + + size_t num_ops = model->subgraphs()->Get(0)->operators()->size(); + tflite::RecordedAllocation recorded_allocation = + micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType::kNodeAndRegistrationArray); + + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, num_ops); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + num_ops * NODE_AND_REGISTRATION_STRUCT_SIZE); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + num_ops * NODE_AND_REGISTRATION_STRUCT_SIZE); +} + +TF_LITE_MICRO_TEST(TestRecordsMultiTenantAllocations) +{ + tflite::ScratchBufferHandle *scratch_buffer_handles = nullptr; + tflite::AllOpsResolver all_ops_resolver; + const tflite::Model *model = tflite::GetModel(kTestConvModelData); + + // Double the arena size to allocate two models inside of it: + uint8_t arena[kTestConvArenaSize * 2]; + + TfLiteStatus status; + + tflite::RecordingMicroAllocator *micro_allocator = + tflite::RecordingMicroAllocator::Create(arena, kTestConvArenaSize * 2, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(micro_allocator, nullptr); + if (micro_allocator == nullptr) + return 1; + + // First allocation with the model in the arena: + tflite::SubgraphAllocations *subgraph_allocations = + micro_allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + if (subgraph_allocations == nullptr) + return 1; + + status = micro_allocator->FinishModelAllocation(model, subgraph_allocations, + &scratch_buffer_handles); + TF_LITE_MICRO_EXPECT_EQ(status, kTfLiteOk); + if (status != kTfLiteOk) + return 1; + + // Second allocation with the same model in the arena: + subgraph_allocations = micro_allocator->StartModelAllocation(model); + TF_LITE_MICRO_EXPECT(nullptr != subgraph_allocations); + if (subgraph_allocations == nullptr) + return 1; + + status = kTfLiteOk, micro_allocator->FinishModelAllocation( + model, subgraph_allocations, &scratch_buffer_handles); + TF_LITE_MICRO_EXPECT_EQ(status, kTfLiteOk); + if (status != kTfLiteOk) + return 1; + + size_t tensors_count = tflite::testing::GetModelTensorCount(model); + + tflite::RecordedAllocation recorded_allocation = + micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType::kTfLiteEvalTensorData); + + // Node and tensor arrays must be allocated as well as each node and tensor. + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, tensors_count * 2); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + tensors_count * TF_LITE_EVAL_TENSOR_STRUCT_SIZE * 2); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + tensors_count * TF_LITE_EVAL_TENSOR_STRUCT_SIZE * 2); +} + +TF_LITE_MICRO_TEST(TestRecordsPersistentTfLiteTensorData) +{ + const tflite::Model *model = tflite::GetModel(kTestConvModelData); + uint8_t arena[kTestConvArenaSize]; + + tflite::RecordingMicroAllocator *micro_allocator = + tflite::RecordingMicroAllocator::Create(arena, kTestConvArenaSize, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(micro_allocator, nullptr); + if (micro_allocator == nullptr) + return 1; + + TfLiteTensor *tensor = micro_allocator->AllocatePersistentTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, 0, 0); + TF_LITE_MICRO_EXPECT_NE(tensor, nullptr); + if (tensor == nullptr) + return 1; + + tflite::RecordedAllocation recorded_allocation = + micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType::kPersistentTfLiteTensorData); + + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, static_cast(1)); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + TF_LITE_TENSOR_STRUCT_SIZE); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + TF_LITE_TENSOR_STRUCT_SIZE); +} + +TF_LITE_MICRO_TEST(TestRecordsPersistentTfLiteTensorQuantizationData) +{ + const tflite::Model *model = tflite::GetModel(kTestConvModelData); + uint8_t arena[kTestConvArenaSize]; + + tflite::RecordingMicroAllocator *micro_allocator = + tflite::RecordingMicroAllocator::Create(arena, kTestConvArenaSize, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(micro_allocator, nullptr); + if (micro_allocator == nullptr) + return 1; + + TfLiteTensor *tensor = micro_allocator->AllocatePersistentTfLiteTensor( + model, /*subgraph_allocations=*/nullptr, 0, 0); + TF_LITE_MICRO_EXPECT_NE(tensor, nullptr); + if (tensor == nullptr) + return 1; + + // Walk the model subgraph to find all tensors with quantization params and + // keep a tally. + size_t quantized_channel_bytes = 0; + const tflite::Tensor *cur_tensor = + model->subgraphs()->Get(0)->tensors()->Get(0); + const tflite::QuantizationParameters *quantization_params = + cur_tensor->quantization(); + if (quantization_params && quantization_params->scale() && + quantization_params->scale()->size() > 0 && + quantization_params->zero_point() && + quantization_params->zero_point()->size() > 0) { + size_t num_channels = quantization_params->scale()->size(); + quantized_channel_bytes += TfLiteIntArrayGetSizeInBytes(num_channels); + } + + // Calculate the expected allocation bytes with subgraph quantization data: + size_t expected_requested_bytes = + TF_LITE_AFFINE_QUANTIZATION_SIZE + quantized_channel_bytes; + + tflite::RecordedAllocation recorded_allocation = + micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType:: + kPersistentTfLiteTensorQuantizationData); + + // Each quantized tensors has 2 mallocs (quant struct, zero point dimensions): + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, static_cast(2)); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + expected_requested_bytes); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + expected_requested_bytes); +} + +TF_LITE_MICRO_TEST(TestRecordsPersistentBufferData) +{ + uint8_t arena[kTestConvArenaSize]; + + tflite::RecordingMicroAllocator *micro_allocator = + tflite::RecordingMicroAllocator::Create(arena, kTestConvArenaSize, + tflite::GetMicroErrorReporter()); + TF_LITE_MICRO_EXPECT_NE(micro_allocator, nullptr); + if (micro_allocator == nullptr) + return 1; + + void *buffer = micro_allocator->AllocatePersistentBuffer(/*bytes=*/100); + TF_LITE_MICRO_EXPECT_NE(buffer, nullptr); + if (buffer == nullptr) + return 1; + + tflite::RecordedAllocation recorded_allocation = + micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType::kPersistentBufferData); + + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, static_cast(1)); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + static_cast(100)); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + static_cast(100)); + + buffer = micro_allocator->AllocatePersistentBuffer(/*bytes=*/50); + TF_LITE_MICRO_EXPECT_NE(buffer, nullptr); + if (buffer == nullptr) + return 1; + + recorded_allocation = micro_allocator->GetRecordedAllocation( + tflite::RecordedAllocationType::kPersistentBufferData); + + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.count, static_cast(2)); + TF_LITE_MICRO_EXPECT_EQ(recorded_allocation.requested_bytes, + static_cast(150)); + TF_LITE_MICRO_EXPECT_GE(recorded_allocation.used_bytes, + static_cast(150)); +} + +// TODO(b/158124094): Find a way to audit OpData allocations on +// cross-architectures. + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_interpreter.h b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_interpreter.h new file mode 100644 index 00000000..2f68f1ac --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_micro_interpreter.h @@ -0,0 +1,70 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_RECORDING_MICRO_INTERPRETER_H_ +#define TENSORFLOW_LITE_MICRO_RECORDING_MICRO_INTERPRETER_H_ + +#include "tensorflow/lite/micro/micro_interpreter.h" +#include "tensorflow/lite/micro/recording_micro_allocator.h" + +namespace tflite { +// Utility subclass that enables internal recordings of the MicroInterpreter. +// This class should be used to audit and analyze memory arena usage for a given +// model and interpreter. +// +// After construction and the first Invoke() or AllocateTensors() call - the +// memory usage is recorded and available through the GetMicroAllocator() +// function. See RecordingMicroAlloctor for more details on what is currently +// recorded from arena allocations. +// +// It is recommended for users to increase the tensor arena size by at least 1kb +// to ensure enough additional memory is available for internal recordings. +class RecordingMicroInterpreter : public MicroInterpreter { +public: + RecordingMicroInterpreter(const Model *model, + const MicroOpResolver &op_resolver, + uint8_t *tensor_arena, size_t tensor_arena_size, + ErrorReporter *error_reporter, + MicroProfiler *profiler = nullptr) + : MicroInterpreter(model, op_resolver, + RecordingMicroAllocator::Create( + tensor_arena, tensor_arena_size, error_reporter), + error_reporter, profiler), + recording_micro_allocator_( + static_cast(allocator())) + { + } + + RecordingMicroInterpreter(const Model *model, + const MicroOpResolver &op_resolver, + RecordingMicroAllocator *allocator, + ErrorReporter *error_reporter) + : MicroInterpreter(model, op_resolver, allocator, error_reporter), + recording_micro_allocator_(*allocator) + { + } + + const RecordingMicroAllocator &GetMicroAllocator() const + { + return recording_micro_allocator_; + } + +private: + const RecordingMicroAllocator &recording_micro_allocator_; +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_RECORDING_MICRO_INTERPRETER_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.cc b/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.cc new file mode 100644 index 00000000..ee5b0922 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.cc @@ -0,0 +1,94 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/recording_simple_memory_allocator.h" + +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" + +namespace tflite { + +RecordingSimpleMemoryAllocator::RecordingSimpleMemoryAllocator( + ErrorReporter *error_reporter, uint8_t *buffer_head, size_t buffer_size) + : SimpleMemoryAllocator(error_reporter, buffer_head, buffer_size), + requested_head_bytes_(0), + requested_tail_bytes_(0), + used_bytes_(0), + alloc_count_(0) +{ +} + +RecordingSimpleMemoryAllocator::~RecordingSimpleMemoryAllocator() +{ +} + +RecordingSimpleMemoryAllocator *RecordingSimpleMemoryAllocator::Create( + ErrorReporter *error_reporter, uint8_t *buffer_head, size_t buffer_size) +{ + TFLITE_DCHECK(error_reporter != nullptr); + TFLITE_DCHECK(buffer_head != nullptr); + RecordingSimpleMemoryAllocator tmp = + RecordingSimpleMemoryAllocator(error_reporter, buffer_head, buffer_size); + + uint8_t *allocator_buffer = + tmp.AllocateFromTail(sizeof(RecordingSimpleMemoryAllocator), + alignof(RecordingSimpleMemoryAllocator)); + // Use the default copy constructor to populate internal states. + return new (allocator_buffer) RecordingSimpleMemoryAllocator(tmp); +} + +size_t RecordingSimpleMemoryAllocator::GetRequestedBytes() const +{ + return requested_head_bytes_ + requested_tail_bytes_; +} + +size_t RecordingSimpleMemoryAllocator::GetUsedBytes() const +{ + return used_bytes_; +} + +size_t RecordingSimpleMemoryAllocator::GetAllocatedCount() const +{ + return alloc_count_; +} + +TfLiteStatus RecordingSimpleMemoryAllocator::SetHeadBufferSize( + size_t size, size_t alignment) +{ + const uint8_t *previous_head = head(); + TfLiteStatus status = + SimpleMemoryAllocator::SetHeadBufferSize(size, alignment); + if (status == kTfLiteOk) { + used_bytes_ += head() - previous_head; + requested_head_bytes_ = size; + } + return status; +} + +uint8_t *RecordingSimpleMemoryAllocator::AllocateFromTail(size_t size, + size_t alignment) +{ + const uint8_t *previous_tail = tail(); + uint8_t *result = SimpleMemoryAllocator::AllocateFromTail(size, alignment); + if (result != nullptr) { + used_bytes_ += previous_tail - tail(); + requested_tail_bytes_ += size; + alloc_count_++; + } + return result; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.h b/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.h new file mode 100644 index 00000000..d9e1578f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator.h @@ -0,0 +1,63 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_RECORDING_SIMPLE_MEMORY_ALLOCATOR_H_ +#define TENSORFLOW_LITE_MICRO_RECORDING_SIMPLE_MEMORY_ALLOCATOR_H_ + +#include "tensorflow/lite/micro/compatibility.h" +#include "tensorflow/lite/micro/simple_memory_allocator.h" + +namespace tflite { +// Utility class used to log allocations of a SimpleMemoryAllocator. Should only +// be used in debug/evaluation settings or unit tests to evaluate allocation +// usage. +class RecordingSimpleMemoryAllocator : public SimpleMemoryAllocator { +public: + RecordingSimpleMemoryAllocator(ErrorReporter *error_reporter, + uint8_t *buffer_head, size_t buffer_size); + // TODO(b/157615197): Cleanup constructors/destructor and use factory + // functions. + ~RecordingSimpleMemoryAllocator() override; + + static RecordingSimpleMemoryAllocator *Create(ErrorReporter *error_reporter, + uint8_t *buffer_head, + size_t buffer_size); + + // Returns the number of bytes requested from the head or tail. + size_t GetRequestedBytes() const; + + // Returns the number of bytes actually allocated from the head or tail. This + // value will be >= to the number of requested bytes due to padding and + // alignment. + size_t GetUsedBytes() const; + + // Returns the number of alloc calls from the head or tail. + size_t GetAllocatedCount() const; + + TfLiteStatus SetHeadBufferSize(size_t size, size_t alignment) override; + uint8_t *AllocateFromTail(size_t size, size_t alignment) override; + +private: + size_t requested_head_bytes_; + size_t requested_tail_bytes_; + size_t used_bytes_; + size_t alloc_count_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_RECORDING_SIMPLE_MEMORY_ALLOCATOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator_test.cc new file mode 100644 index 00000000..7e1dfe72 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/recording_simple_memory_allocator_test.cc @@ -0,0 +1,144 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/recording_simple_memory_allocator.h" + +#include + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestRecordsTailAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::RecordingSimpleMemoryAllocator allocator( + tflite::GetMicroErrorReporter(), arena, arena_size); + + uint8_t *result = allocator.AllocateFromTail(/*size=*/10, /*alignment=*/1); + TF_LITE_MICRO_EXPECT_NE(result, nullptr); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(10)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(10)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(1)); + + result = allocator.AllocateFromTail(/*size=*/20, /*alignment=*/1); + TF_LITE_MICRO_EXPECT_NE(result, nullptr); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(30)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(30)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(2)); +} + +TF_LITE_MICRO_TEST(TestRecordsMisalignedTailAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::RecordingSimpleMemoryAllocator allocator( + tflite::GetMicroErrorReporter(), arena, arena_size); + + uint8_t *result = allocator.AllocateFromTail(/*size=*/10, /*alignment=*/12); + TF_LITE_MICRO_EXPECT_NE(result, nullptr); + // Validate used bytes in 8 byte range that can included alignment of 12: + TF_LITE_MICRO_EXPECT_GE(allocator.GetUsedBytes(), static_cast(10)); + TF_LITE_MICRO_EXPECT_LE(allocator.GetUsedBytes(), static_cast(20)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(10)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(1)); +} + +TF_LITE_MICRO_TEST(TestDoesNotRecordFailedTailAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::RecordingSimpleMemoryAllocator allocator( + tflite::GetMicroErrorReporter(), arena, arena_size); + + uint8_t *result = allocator.AllocateFromTail(/*size=*/2048, /*alignment=*/1); + TF_LITE_MICRO_EXPECT(result == nullptr); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(0)); +} + +TF_LITE_MICRO_TEST(TestRecordsHeadSizeAdjustment) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::RecordingSimpleMemoryAllocator allocator( + tflite::GetMicroErrorReporter(), arena, arena_size); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/5, /*alignment=*/1)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(5)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(5)); + // Head adjustments do not count as an allocation: + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(0)); + + uint8_t *result = allocator.AllocateFromTail(/*size=*/15, /*alignment=*/1); + TF_LITE_MICRO_EXPECT_NE(result, nullptr); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(20)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(20)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(1)); +} + +TF_LITE_MICRO_TEST(TestRecordsMisalignedHeadSizeAdjustments) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::RecordingSimpleMemoryAllocator allocator( + tflite::GetMicroErrorReporter(), arena, arena_size); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/10, /*alignment=*/12)); + // Validate used bytes in 8 byte range that can included alignment of 12: + TF_LITE_MICRO_EXPECT_GE(allocator.GetUsedBytes(), static_cast(10)); + TF_LITE_MICRO_EXPECT_LE(allocator.GetUsedBytes(), static_cast(20)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(10)); + // Head adjustments do not count as an allocation: + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(0)); +} + +TF_LITE_MICRO_TEST(TestDoesNotRecordFailedTailAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::RecordingSimpleMemoryAllocator allocator( + tflite::GetMicroErrorReporter(), arena, arena_size); + + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, allocator.SetHeadBufferSize( + /*size=*/2048, /*alignment=*/1)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetRequestedBytes(), + static_cast(0)); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAllocatedCount(), + static_cast(0)); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.cc b/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.cc new file mode 100644 index 00000000..0126610f --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.cc @@ -0,0 +1,176 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/simple_memory_allocator.h" + +#include +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/micro/memory_helpers.h" + +namespace tflite { + +SimpleMemoryAllocator::SimpleMemoryAllocator(ErrorReporter *error_reporter, + uint8_t *buffer_head, + uint8_t *buffer_tail) + : error_reporter_(error_reporter), + buffer_head_(buffer_head), + buffer_tail_(buffer_tail), + head_(buffer_head), + tail_(buffer_tail), + temp_(buffer_head_) +{ +} + +SimpleMemoryAllocator::SimpleMemoryAllocator(ErrorReporter *error_reporter, + uint8_t *buffer, + size_t buffer_size) + : SimpleMemoryAllocator(error_reporter, buffer, buffer + buffer_size) +{ +} + +/* static */ +SimpleMemoryAllocator *SimpleMemoryAllocator::Create( + ErrorReporter *error_reporter, uint8_t *buffer_head, size_t buffer_size) +{ + TFLITE_DCHECK(error_reporter != nullptr); + TFLITE_DCHECK(buffer_head != nullptr); + SimpleMemoryAllocator tmp = + SimpleMemoryAllocator(error_reporter, buffer_head, buffer_size); + + // Allocate enough bytes from the buffer to create a SimpleMemoryAllocator. + // The new instance will use the current adjusted tail buffer from the tmp + // allocator instance. + uint8_t *allocator_buffer = tmp.AllocateFromTail( + sizeof(SimpleMemoryAllocator), alignof(SimpleMemoryAllocator)); + // Use the default copy constructor to populate internal states. + return new (allocator_buffer) SimpleMemoryAllocator(tmp); +} + +SimpleMemoryAllocator::~SimpleMemoryAllocator() +{ +} + +TfLiteStatus SimpleMemoryAllocator::SetHeadBufferSize(size_t size, + size_t alignment) +{ + if (head_ != temp_) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Internal error: SetHeadBufferSize() needs to be called " + "after ResetTempAllocations()."); + return kTfLiteError; + } + + uint8_t *const aligned_result = AlignPointerUp(buffer_head_, alignment); + const size_t available_memory = tail_ - aligned_result; + if (available_memory < size) { + TF_LITE_REPORT_ERROR( + error_reporter_, + "Failed to set head size. Requested: %u, available %u, missing: %u", + size, available_memory, size - available_memory); + return kTfLiteError; + } + head_ = aligned_result + size; + temp_ = head_; + + return kTfLiteOk; +} + +uint8_t *SimpleMemoryAllocator::AllocateFromTail(size_t size, + size_t alignment) +{ + uint8_t *const aligned_result = AlignPointerDown(tail_ - size, alignment); + if (aligned_result < head_) { +#ifndef TF_LITE_STRIP_ERROR_STRINGS + const size_t missing_memory = head_ - aligned_result; + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed to allocate tail memory. Requested: %u, " + "available %u, missing: %u", + size, size - missing_memory, missing_memory); +#endif + return nullptr; + } + tail_ = aligned_result; + return aligned_result; +} + +uint8_t *SimpleMemoryAllocator::AllocateTemp(size_t size, size_t alignment) +{ + uint8_t *const aligned_result = AlignPointerUp(temp_, alignment); + const size_t available_memory = tail_ - aligned_result; + if (available_memory < size) { + TF_LITE_REPORT_ERROR(error_reporter_, + "Failed to allocate temp memory. Requested: %u, " + "available %u, missing: %u", + size, available_memory, size - available_memory); + return nullptr; + } + temp_ = aligned_result + size; + return aligned_result; +} + +void SimpleMemoryAllocator::ResetTempAllocations() +{ + temp_ = head_; +} + +uint8_t *SimpleMemoryAllocator::GetHeadBuffer() const +{ + return buffer_head_; +} + +size_t SimpleMemoryAllocator::GetHeadUsedBytes() const +{ + return head_ - buffer_head_; +} + +size_t SimpleMemoryAllocator::GetTailUsedBytes() const +{ + return buffer_tail_ - tail_; +} + +size_t SimpleMemoryAllocator::GetAvailableMemory(size_t alignment) const +{ + uint8_t *const aligned_temp = AlignPointerUp(temp_, alignment); + uint8_t *const aligned_tail = AlignPointerDown(tail_, alignment); + return aligned_tail - aligned_temp; +} + +size_t SimpleMemoryAllocator::GetUsedBytes() const +{ + return GetBufferSize() - (tail_ - temp_); +} + +size_t SimpleMemoryAllocator::GetBufferSize() const +{ + return buffer_tail_ - buffer_head_; +} + +uint8_t *SimpleMemoryAllocator::head() const +{ + return head_; +} + +uint8_t *SimpleMemoryAllocator::tail() const +{ + return tail_; +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.h b/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.h new file mode 100644 index 00000000..18731f78 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator.h @@ -0,0 +1,111 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_SIMPLE_MEMORY_ALLOCATOR_H_ +#define TENSORFLOW_LITE_MICRO_SIMPLE_MEMORY_ALLOCATOR_H_ + +#include +#include + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/micro/compatibility.h" + +namespace tflite { +// TODO(petewarden): This allocator never frees up or reuses any memory, even +// though we have enough information about lifetimes of the tensors to do so. +// This makes it pretty wasteful, so we should use a more intelligent method. +class SimpleMemoryAllocator { +public: + // TODO(b/157615197): Cleanup constructors/destructor and use factory + // functions. + SimpleMemoryAllocator(ErrorReporter *error_reporter, uint8_t *buffer_head, + uint8_t *buffer_tail); + SimpleMemoryAllocator(ErrorReporter *error_reporter, uint8_t *buffer, + size_t buffer_size); + virtual ~SimpleMemoryAllocator(); + + // Creates a new SimpleMemoryAllocator from a given buffer head and size. + static SimpleMemoryAllocator *Create(ErrorReporter *error_reporter, + uint8_t *buffer_head, + size_t buffer_size); + + // Adjusts the head (lowest address and moving upwards) memory allocation to a + // given size. Calls to this method will also invalidate all temporary + // allocation values (it sets the location of temp space at the end of the + // head section). This call will fail if a chain of allocations through + // AllocateTemp() have not been cleaned up with a call to + // ResetTempAllocations(). + virtual TfLiteStatus SetHeadBufferSize(size_t size, size_t alignment); + + // Allocates memory starting at the tail of the arena (highest address and + // moving downwards). + virtual uint8_t *AllocateFromTail(size_t size, size_t alignment); + + // Allocates a temporary buffer from the head of the arena (lowest address and + // moving upwards) but does not update the actual head allocation size or + // position. The returned buffer is guaranteed until either + // ResetTempAllocations() is called or another call to AllocateFromHead(). + // Repeat calls to this function will create a chain of temp allocations. All + // calls to AllocateTemp() must end with a call to ResetTempAllocations(). If + // AllocateFromHead() is called before a call to ResetTempAllocations(), it + // will fail with an error message. + virtual uint8_t *AllocateTemp(size_t size, size_t alignment); + + // Resets a chain of temporary allocations back to the current head of the + // arena (lowest address). + virtual void ResetTempAllocations(); + + // Returns a pointer to the buffer currently assigned to the head section. + // This buffer is set by calling SetHeadSize(). + uint8_t *GetHeadBuffer() const; + + // Returns the size of the head section in bytes. + size_t GetHeadUsedBytes() const; + + // Returns the size of all allocations in the tail section in bytes. + size_t GetTailUsedBytes() const; + + // Returns the number of bytes available with a given alignment. This number + // takes in account any temporary allocations. + size_t GetAvailableMemory(size_t alignment) const; + + // Returns the number of used bytes in the allocator. This number takes in + // account any temporary allocations. + size_t GetUsedBytes() const; + +protected: + // Returns a pointer to the current end of the head buffer. + uint8_t *head() const; + + // Returns a pointer to the current end of the tail buffer. + uint8_t *tail() const; + +private: + size_t GetBufferSize() const; + + ErrorReporter *error_reporter_; + uint8_t *buffer_head_; + uint8_t *buffer_tail_; + uint8_t *head_; + uint8_t *tail_; + uint8_t *temp_; + + TF_LITE_REMOVE_VIRTUAL_DELETE +}; + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_SIMPLE_MEMORY_ALLOCATOR_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator_test.cc new file mode 100644 index 00000000..5acaeb86 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/simple_memory_allocator_test.cc @@ -0,0 +1,285 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/simple_memory_allocator.h" + +#include + +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(TestEnsureHeadSizeSimpleAlignment) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/100, /*alignment=*/1)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(100), + allocator.GetHeadUsedBytes()); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/10, /*alignment=*/1)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(10), + allocator.GetHeadUsedBytes()); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/1000, /*alignment=*/1)); + TF_LITE_MICRO_EXPECT_EQ(static_cast(1000), + allocator.GetHeadUsedBytes()); +} + +TF_LITE_MICRO_TEST(TestAdjustHeadSizeMisalignment) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + // First head adjustment of 100 bytes (aligned 12): + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/100, /*alignment=*/12)); + + // Offset alignment of 12 can lead to allocation within 8 byte range of + // requested bytes based to arena alignment at runtime: + TF_LITE_MICRO_EXPECT_GE(allocator.GetHeadUsedBytes(), 100); + TF_LITE_MICRO_EXPECT_LE(allocator.GetHeadUsedBytes(), 100 + 11); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/10, /*alignment=*/12)); + TF_LITE_MICRO_EXPECT_GE(allocator.GetHeadUsedBytes(), 10); + TF_LITE_MICRO_EXPECT_LE(allocator.GetHeadUsedBytes(), 100 + 11); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/1000, /*alignment=*/12)); + TF_LITE_MICRO_EXPECT_GE(allocator.GetHeadUsedBytes(), 1000); + TF_LITE_MICRO_EXPECT_LE(allocator.GetHeadUsedBytes(), 1000 + 11); +} + +TF_LITE_MICRO_TEST(TestAdjustHeadSizeMisalignedHandlesCorrectBytesAvailable) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + // First head adjustment of 100 bytes (aligned 12): + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/100, /*alignment=*/12)); + + // allocator.GetAvailableMemory() should also report the actual amount of + // memory available based on a requested offset (12): + size_t aligned_available_bytes = + allocator.GetAvailableMemory(/*alignment=*/12); + TF_LITE_MICRO_EXPECT_LE(aligned_available_bytes, arena_size - 100); + TF_LITE_MICRO_EXPECT_GE(aligned_available_bytes, arena_size - 100 - 24); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/10, /*alignment=*/12)); + aligned_available_bytes = allocator.GetAvailableMemory(/*alignment=*/12); + + TF_LITE_MICRO_EXPECT_LE(aligned_available_bytes, arena_size - 10); + TF_LITE_MICRO_EXPECT_GE(aligned_available_bytes, arena_size - 10 - 24); + + TF_LITE_MICRO_EXPECT_EQ( + kTfLiteOk, allocator.SetHeadBufferSize(/*size=*/1000, /*alignment=*/12)); + aligned_available_bytes = allocator.GetAvailableMemory(/*alignment=*/12); + TF_LITE_MICRO_EXPECT_LE(aligned_available_bytes, arena_size - 1000); + TF_LITE_MICRO_EXPECT_GE(aligned_available_bytes, arena_size - 1000 - 24); +} + +TF_LITE_MICRO_TEST(TestGetAvailableMemory) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + constexpr size_t allocation_size = 100; + allocator.SetHeadBufferSize(/*size=*/allocation_size, + /*alignment=*/1); + allocator.AllocateFromTail(/*size=*/allocation_size, + /*alignment=*/1); + + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAvailableMemory(/*alignment=*/1), + arena_size - allocation_size * 2); +} + +TF_LITE_MICRO_TEST(TestGetAvailableMemoryWithTempAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + constexpr size_t allocation_size = 100; + allocator.AllocateTemp(/*size=*/allocation_size, + /*alignment=*/1); + + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAvailableMemory(/*alignment=*/1), + arena_size - allocation_size); + + // Reset temp allocations and ensure GetAvailableMemory() is back to the + // starting size: + allocator.ResetTempAllocations(); + + TF_LITE_MICRO_EXPECT_EQ(allocator.GetAvailableMemory(/*alignment=*/1), + arena_size); +} + +TF_LITE_MICRO_TEST(TestGetUsedBytes) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(0)); + + constexpr size_t allocation_size = 100; + allocator.SetHeadBufferSize(/*size=*/allocation_size, + /*alignment=*/1); + allocator.AllocateFromTail(/*size=*/allocation_size, + /*alignment=*/1); + + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), allocation_size * 2); +} + +TF_LITE_MICRO_TEST(TestGetUsedBytesTempAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + constexpr size_t allocation_size = 100; + allocator.AllocateTemp(/*size=*/allocation_size, + /*alignment=*/1); + + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), allocation_size); + + // Reset temp allocations and ensure GetUsedBytes() is back to the starting + // size: + allocator.ResetTempAllocations(); + + TF_LITE_MICRO_EXPECT_EQ(allocator.GetUsedBytes(), static_cast(0)); +} + +TF_LITE_MICRO_TEST(TestJustFits) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + uint8_t *result = allocator.AllocateFromTail(arena_size, 1); + TF_LITE_MICRO_EXPECT(nullptr != result); +} + +TF_LITE_MICRO_TEST(TestAligned) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + uint8_t *result = allocator.AllocateFromTail(1, 1); + TF_LITE_MICRO_EXPECT(nullptr != result); + + result = allocator.AllocateFromTail(16, 4); + TF_LITE_MICRO_EXPECT(nullptr != result); + TF_LITE_MICRO_EXPECT_EQ(static_cast(0), + reinterpret_cast(result) & 3); +} + +TF_LITE_MICRO_TEST(TestMultipleTooLarge) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + uint8_t *result = allocator.AllocateFromTail(768, 1); + TF_LITE_MICRO_EXPECT(nullptr != result); + + result = allocator.AllocateFromTail(768, 1); + TF_LITE_MICRO_EXPECT(nullptr == result); +} + +TF_LITE_MICRO_TEST(TestTempAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + uint8_t *temp1 = allocator.AllocateTemp(100, 1); + TF_LITE_MICRO_EXPECT(nullptr != temp1); + + uint8_t *temp2 = allocator.AllocateTemp(100, 1); + TF_LITE_MICRO_EXPECT(nullptr != temp2); + + // Expect that the next micro allocation is 100 bytes away from each other. + TF_LITE_MICRO_EXPECT_EQ(temp2 - temp1, 100); +} + +TF_LITE_MICRO_TEST(TestResetTempAllocations) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + uint8_t *temp1 = allocator.AllocateTemp(100, 1); + TF_LITE_MICRO_EXPECT(nullptr != temp1); + + allocator.ResetTempAllocations(); + + uint8_t *temp2 = allocator.AllocateTemp(100, 1); + TF_LITE_MICRO_EXPECT(nullptr != temp2); + + // Reset temp allocations should have the same start address: + TF_LITE_MICRO_EXPECT_EQ(temp2 - temp1, 0); +} + +TF_LITE_MICRO_TEST(TestEnsureHeadSizeWithoutResettingTemp) +{ + constexpr size_t arena_size = 1024; + uint8_t arena[arena_size]; + tflite::SimpleMemoryAllocator allocator(tflite::GetMicroErrorReporter(), + arena, arena_size); + + uint8_t *temp = allocator.AllocateTemp(100, 1); + TF_LITE_MICRO_EXPECT(nullptr != temp); + + // Adjustment to head should fail since temp allocation was not followed by a + // call to ResetTempAllocations(). + TF_LITE_MICRO_EXPECT_EQ(kTfLiteError, allocator.SetHeadBufferSize(100, 1)); + + allocator.ResetTempAllocations(); + + // Reduce head size back to zero. + TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, allocator.SetHeadBufferSize(0, 1)); + + // The most recent head allocation should be in the same location as the + // original temp allocation pointer. + TF_LITE_MICRO_EXPECT(temp == allocator.GetHeadBuffer()); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/system_setup.cc b/components/TensorFlowLite/tensorflow/lite/micro/system_setup.cc new file mode 100644 index 00000000..24881d5e --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/system_setup.cc @@ -0,0 +1,27 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/system_setup.h" + +namespace tflite { + +// To add an equivalent function for your own platform, create your own +// implementation file, and place it in a subfolder named after the target. See +// tensorflow/lite/micro/debug_log.cc for a similar example. +void InitializeTarget() +{ +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/system_setup.h b/components/TensorFlowLite/tensorflow/lite/micro/system_setup.h new file mode 100644 index 00000000..9ef4266a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/system_setup.h @@ -0,0 +1,26 @@ +/* Copyright 2021 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_MICRO_SYSTEM_SETUP_H_ +#define TENSORFLOW_LITE_MICRO_SYSTEM_SETUP_H_ + +namespace tflite { +// This should called during initialization of TFLM binaries and tests. It can +// be specialized if there is a need for custom target-specific intialization. +// For more information, see tensorflow/lite/micro/system_setup.cc. +void InitializeTarget(); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_SYSTEM_SETUP_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/test_helpers.cc b/components/TensorFlowLite/tensorflow/lite/micro/test_helpers.cc new file mode 100644 index 00000000..565ffbf1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/test_helpers.cc @@ -0,0 +1,1394 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/test_helpers.h" + +#include +#include +#include +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/core/api/error_reporter.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/kernels/kernel_util.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/schema/schema_generated.h" + +// TODO(b/170464050): Use TFLM test only version of schema_utils. + +namespace tflite { +namespace testing { +namespace { + +class StackAllocator : public flatbuffers::Allocator { +public: + StackAllocator() + : data_(data_backing_), data_size_(0) + { + } + + uint8_t *allocate(size_t size) override + { + TFLITE_DCHECK((data_size_ + size) <= kStackAllocatorSize); + uint8_t *result = data_; + data_ += size; + data_size_ += size; + return result; + } + + void deallocate(uint8_t *p, size_t) override + { + } + + static StackAllocator &instance() + { + // Avoid using true dynamic memory allocation to be portable to bare metal. + static char inst_memory[sizeof(StackAllocator)]; + static StackAllocator *inst = new (inst_memory) StackAllocator; + return *inst; + } + + static constexpr size_t kStackAllocatorSize = 8192; + +private: + uint8_t data_backing_[kStackAllocatorSize]; + uint8_t *data_; + int data_size_; +}; + +flatbuffers::FlatBufferBuilder *BuilderInstance() +{ + static char inst_memory[sizeof(flatbuffers::FlatBufferBuilder)]; + static flatbuffers::FlatBufferBuilder *inst = + new (inst_memory) flatbuffers::FlatBufferBuilder( + StackAllocator::kStackAllocatorSize, &StackAllocator::instance()); + return inst; +} + +// A wrapper around FlatBuffer API to help build model easily. +class ModelBuilder { +public: + typedef int32_t Tensor; + typedef int Operator; + typedef int Node; + + // `builder` needs to be available until BuildModel is called. + explicit ModelBuilder(flatbuffers::FlatBufferBuilder *builder) + : builder_(builder) + { + } + + // Registers an operator that will be used in the model. + Operator RegisterOp(BuiltinOperator op, const char *custom_code); + + // Adds a tensor to the model. + Tensor AddTensor(TensorType type, std::initializer_list shape) + { + return AddTensorImpl(type, /* is_variable */ false, shape); + } + + // Adds a variable tensor to the model. + Tensor AddVariableTensor(TensorType type, + std::initializer_list shape) + { + return AddTensorImpl(type, /* is_variable */ true, shape); + } + + // Adds a node to the model with given input and output Tensors. + Node AddNode(Operator op, std::initializer_list inputs, + std::initializer_list outputs); + + void AddMetadata(const char *description_string, + const int32_t *metadata_buffer_data, size_t num_elements); + + // Constructs the flatbuffer model using `builder_` and return a pointer to + // it. The returned model has the same lifetime as `builder_`. + // Note the default value of 0 for num_subgraph_inputs means all tensor inputs + // are in subgraph input list. + const Model *BuildModel(std::initializer_list inputs, + std::initializer_list outputs, + size_t num_subgraph_inputs = 0); + +private: + // Adds a tensor to the model. + Tensor AddTensorImpl(TensorType type, bool is_variable, + std::initializer_list shape); + + flatbuffers::FlatBufferBuilder *builder_; + + static constexpr int kMaxOperatorCodes = 10; + flatbuffers::Offset operator_codes_[kMaxOperatorCodes]; + int next_operator_code_id_ = 0; + + static constexpr int kMaxOperators = 50; + flatbuffers::Offset operators_[kMaxOperators]; + int next_operator_id_ = 0; + + static constexpr int kMaxTensors = 50; + flatbuffers::Offset tensors_[kMaxTensors]; + + static constexpr int kMaxMetadataBuffers = 10; + + static constexpr int kMaxMetadatas = 10; + flatbuffers::Offset metadata_[kMaxMetadatas]; + + flatbuffers::Offset metadata_buffers_[kMaxMetadataBuffers]; + + int nbr_of_metadata_buffers_ = 0; + + int next_tensor_id_ = 0; +}; + +ModelBuilder::Operator ModelBuilder::RegisterOp(BuiltinOperator op, + const char *custom_code) +{ + TFLITE_DCHECK(next_operator_code_id_ <= kMaxOperatorCodes); + operator_codes_[next_operator_code_id_] = tflite::CreateOperatorCodeDirect( + *builder_, /*deprecated_builtin_code=*/0, custom_code, /*version=*/0, op); + next_operator_code_id_++; + return next_operator_code_id_ - 1; +} + +ModelBuilder::Node ModelBuilder::AddNode( + ModelBuilder::Operator op, + std::initializer_list inputs, + std::initializer_list outputs) +{ + TFLITE_DCHECK(next_operator_id_ <= kMaxOperators); + operators_[next_operator_id_] = tflite::CreateOperator( + *builder_, op, builder_->CreateVector(inputs.begin(), inputs.size()), + builder_->CreateVector(outputs.begin(), outputs.size()), + BuiltinOptions_NONE); + next_operator_id_++; + return next_operator_id_ - 1; +} + +void ModelBuilder::AddMetadata(const char *description_string, + const int32_t *metadata_buffer_data, + size_t num_elements) +{ + metadata_[ModelBuilder::nbr_of_metadata_buffers_] = + CreateMetadata(*builder_, builder_->CreateString(description_string), + 1 + ModelBuilder::nbr_of_metadata_buffers_); + + metadata_buffers_[nbr_of_metadata_buffers_] = tflite::CreateBuffer( + *builder_, builder_->CreateVector((uint8_t *)metadata_buffer_data, + sizeof(uint32_t) * num_elements)); + + ModelBuilder::nbr_of_metadata_buffers_++; +} + +const Model *ModelBuilder::BuildModel( + std::initializer_list inputs, + std::initializer_list outputs, + size_t num_subgraph_inputs) +{ + // Model schema requires an empty buffer at idx 0. + size_t buffer_size = 1 + ModelBuilder::nbr_of_metadata_buffers_; + flatbuffers::Offset buffers[kMaxMetadataBuffers]; + buffers[0] = tflite::CreateBuffer(*builder_); + + // Place the metadata buffers first in the buffer since the indices for them + // have already been set in AddMetadata() + for (int i = 1; i < ModelBuilder::nbr_of_metadata_buffers_ + 1; ++i) { + buffers[i] = metadata_buffers_[i - 1]; + } + + // Default to single subgraph model. + constexpr size_t subgraphs_size = 1; + + // Find out number of subgraph inputs. + if (num_subgraph_inputs == 0) { + // This is the default case. + num_subgraph_inputs = inputs.size(); + } else { + // A non-zero value of num_subgraph_inputs means that some of + // the operator input tensors are not subgraph inputs. + TFLITE_DCHECK(num_subgraph_inputs <= inputs.size()); + } + + const flatbuffers::Offset subgraphs[subgraphs_size] = { + tflite::CreateSubGraph( + *builder_, builder_->CreateVector(tensors_, next_tensor_id_), + builder_->CreateVector(inputs.begin(), num_subgraph_inputs), + builder_->CreateVector(outputs.begin(), outputs.size()), + builder_->CreateVector(operators_, next_operator_id_), + builder_->CreateString("test_subgraph")) + }; + + flatbuffers::Offset model_offset; + if (ModelBuilder::nbr_of_metadata_buffers_ > 0) { + model_offset = tflite::CreateModel( + *builder_, 0, + builder_->CreateVector(operator_codes_, next_operator_code_id_), + builder_->CreateVector(subgraphs, subgraphs_size), + builder_->CreateString("teset_model"), + builder_->CreateVector(buffers, buffer_size), 0, + builder_->CreateVector(metadata_, + ModelBuilder::nbr_of_metadata_buffers_)); + } else { + model_offset = tflite::CreateModel( + *builder_, 0, + builder_->CreateVector(operator_codes_, next_operator_code_id_), + builder_->CreateVector(subgraphs, subgraphs_size), + builder_->CreateString("teset_model"), + builder_->CreateVector(buffers, buffer_size)); + } + + tflite::FinishModelBuffer(*builder_, model_offset); + void *model_pointer = builder_->GetBufferPointer(); + const Model *model = flatbuffers::GetRoot(model_pointer); + return model; +} + +ModelBuilder::Tensor ModelBuilder::AddTensorImpl( + TensorType type, bool is_variable, std::initializer_list shape) +{ + TFLITE_DCHECK(next_tensor_id_ <= kMaxTensors); + tensors_[next_tensor_id_] = tflite::CreateTensor( + *builder_, builder_->CreateVector(shape.begin(), shape.size()), type, + /* buffer */ 0, /* name */ 0, /* quantization */ 0, + /* is_variable */ is_variable, + /* sparsity */ 0); + next_tensor_id_++; + return next_tensor_id_ - 1; +} + +const Model *BuildSimpleStatefulModel() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *fb_builder = BuilderInstance(); + + ModelBuilder model_builder(fb_builder); + + const int op_id = + model_builder.RegisterOp(BuiltinOperator_CUSTOM, "simple_stateful_op"); + const int input_tensor = model_builder.AddTensor(TensorType_UINT8, { 3 }); + const int median_tensor = model_builder.AddTensor(TensorType_UINT8, { 3 }); + const int invoke_count_tensor = + model_builder.AddTensor(TensorType_INT32, { 1 }); + + model_builder.AddNode(op_id, { input_tensor }, + { median_tensor, invoke_count_tensor }); + return model_builder.BuildModel({ input_tensor }, + { median_tensor, invoke_count_tensor }); +} + +const Model *BuildSimpleModelWithBranch() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *fb_builder = BuilderInstance(); + + ModelBuilder model_builder(fb_builder); + /* Model structure + | t0 + +------| + | v + | +---------+ + | | n0 | + | | | + | +---------+ + v + + | + +---------+ | t1 + | n1 | | + | | | + +---------+ | + | | + t2 | v + | +---------+ + +-->| n2 | + | | + +-------|-+ + |t3 + v + */ + const int op_id = + model_builder.RegisterOp(BuiltinOperator_CUSTOM, "mock_custom"); + const int t0 = model_builder.AddTensor(TensorType_FLOAT32, { 2, 2, 3 }); + const int t1 = model_builder.AddTensor(TensorType_FLOAT32, { 2, 2, 3 }); + const int t2 = model_builder.AddTensor(TensorType_FLOAT32, { 2, 2, 3 }); + const int t3 = model_builder.AddTensor(TensorType_FLOAT32, { 2, 2, 3 }); + model_builder.AddNode(op_id, { t0 }, { t1 }); // n0 + model_builder.AddNode(op_id, { t0 }, { t2 }); // n1 + model_builder.AddNode(op_id, { t1, t2 }, { t3 }); // n2 + return model_builder.BuildModel({ t0 }, { t3 }); +} + +const Model *BuildModelWithOfflinePlanning(int number_of_tensors, + const int32_t *metadata_buffer, + NodeConnection *node_conn, + int num_conns, + int num_subgraph_inputs) +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *fb_builder = BuilderInstance(); + + ModelBuilder model_builder(fb_builder); + + const int op_id = + model_builder.RegisterOp(BuiltinOperator_CUSTOM, "mock_custom"); + + for (int i = 0; i < number_of_tensors; ++i) { + model_builder.AddTensor(TensorType_FLOAT32, { 2, 2, 3 }); + } + + for (int i = 0; i < num_conns; ++i) { + model_builder.AddNode(op_id, node_conn[i].input, node_conn[i].output); + } + + model_builder.AddMetadata( + "OfflineMemoryAllocation", metadata_buffer, + number_of_tensors + tflite::testing::kOfflinePlannerHeaderSize); + + return model_builder.BuildModel( + node_conn[0].input, node_conn[num_conns - 1].output, num_subgraph_inputs); +} + +const Model *BuildModelWithUnusedInputs() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + + constexpr size_t buffers_size = 1; + const Offset buffers[buffers_size] = { CreateBuffer(*builder) }; + constexpr size_t tensor_shape_size = 2; + const int32_t tensor_shape[tensor_shape_size] = { 1, 64 }; + constexpr size_t tensors_size = 4; + const Offset tensors[tensors_size] = { + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT8, 0, + builder->CreateString("test_input_tensor"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT8, 0, + builder->CreateString("test_unused_input_tensor"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT8, 0, + builder->CreateString("test_output_tensor"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT8, 0, + builder->CreateString("test_unused_tensor"), 0, false), + }; + constexpr size_t inputs_size = 2; + const int32_t inputs[inputs_size] = { 0, 1 }; + constexpr size_t outputs_size = 1; + const int32_t outputs[outputs_size] = { 2 }; + constexpr size_t operator_inputs_size = 1; + const int32_t operator_inputs[operator_inputs_size] = { 0 }; + constexpr size_t operator_outputs_size = 1; + const int32_t operator_outputs[operator_outputs_size] = { 2 }; + constexpr size_t operators_size = 1; + const Offset operators[operators_size] = { + CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, operator_outputs_size), + BuiltinOptions_NONE), + }; + constexpr size_t subgraphs_size = 1; + const Offset subgraphs[subgraphs_size] = { + CreateSubGraph(*builder, builder->CreateVector(tensors, tensors_size), + builder->CreateVector(inputs, inputs_size), + builder->CreateVector(outputs, outputs_size), + builder->CreateVector(operators, operators_size), + builder->CreateString("test_subgraph")) + }; + constexpr size_t operator_codes_size = 1; + const Offset operator_codes[operator_codes_size] = { + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "mock_custom", + /*version=*/0, BuiltinOperator_CUSTOM) + }; + const Offset model_offset = CreateModel( + *builder, 0, builder->CreateVector(operator_codes, operator_codes_size), + builder->CreateVector(subgraphs, subgraphs_size), + builder->CreateString("test_model"), + builder->CreateVector(buffers, buffers_size)); + FinishModelBuffer(*builder, model_offset); + void *model_pointer = builder->GetBufferPointer(); + const Model *model = flatbuffers::GetRoot(model_pointer); + return model; +} + +const Model *BuildSimpleMockModel() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + + constexpr size_t buffer_data_size = 1; + const uint8_t buffer_data[buffer_data_size] = { 21 }; + constexpr size_t buffers_size = 2; + const Offset buffers[buffers_size] = { + CreateBuffer(*builder), + CreateBuffer(*builder, + builder->CreateVector(buffer_data, buffer_data_size)) + }; + constexpr size_t tensor_shape_size = 1; + const int32_t tensor_shape[tensor_shape_size] = { 1 }; + constexpr size_t tensors_size = 4; + const Offset tensors[tensors_size] = { + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, + builder->CreateString("test_input_tensor"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_UINT8, 1, + builder->CreateString("test_weight_tensor"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, + builder->CreateString("test_output_tensor"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, + builder->CreateString("test_output2_tensor"), 0, false), + }; + constexpr size_t inputs_size = 1; + const int32_t inputs[inputs_size] = { 0 }; + constexpr size_t outputs_size = 2; + const int32_t outputs[outputs_size] = { 2, 3 }; + constexpr size_t operator_inputs_size = 2; + const int32_t operator_inputs[operator_inputs_size] = { 0, 1 }; + constexpr size_t operator_outputs_size = 1; + const int32_t operator_outputs[operator_outputs_size] = { 2 }; + const int32_t operator2_outputs[operator_outputs_size] = { 3 }; + constexpr size_t operators_size = 2; + const Offset operators[operators_size] = { + CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, operator_outputs_size), + BuiltinOptions_NONE), + CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator2_outputs, operator_outputs_size), + BuiltinOptions_NONE), + }; + constexpr size_t subgraphs_size = 1; + const Offset subgraphs[subgraphs_size] = { + CreateSubGraph(*builder, builder->CreateVector(tensors, tensors_size), + builder->CreateVector(inputs, inputs_size), + builder->CreateVector(outputs, outputs_size), + builder->CreateVector(operators, operators_size), + builder->CreateString("test_subgraph")) + }; + constexpr size_t operator_codes_size = 1; + const Offset operator_codes[operator_codes_size] = { + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "mock_custom", + /*version=*/0, BuiltinOperator_CUSTOM) + }; + const Offset model_offset = CreateModel( + *builder, 0, builder->CreateVector(operator_codes, operator_codes_size), + builder->CreateVector(subgraphs, subgraphs_size), + builder->CreateString("test_model"), + builder->CreateVector(buffers, buffers_size)); + FinishModelBuffer(*builder, model_offset); + void *model_pointer = builder->GetBufferPointer(); + const Model *model = flatbuffers::GetRoot(model_pointer); + return model; +} + +const Model *BuildComplexMockModel() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + + constexpr size_t buffer_data_size = 1; + const uint8_t buffer_data_1[buffer_data_size] = { 21 }; + const uint8_t buffer_data_2[buffer_data_size] = { 21 }; + const uint8_t buffer_data_3[buffer_data_size] = { 21 }; + constexpr size_t buffers_size = 7; + const Offset buffers[buffers_size] = { + // Op 1 buffers: + CreateBuffer(*builder), + CreateBuffer(*builder), + CreateBuffer(*builder, + builder->CreateVector(buffer_data_1, buffer_data_size)), + // Op 2 buffers: + CreateBuffer(*builder), + CreateBuffer(*builder, + builder->CreateVector(buffer_data_2, buffer_data_size)), + // Op 3 buffers: + CreateBuffer(*builder), + CreateBuffer(*builder, + builder->CreateVector(buffer_data_3, buffer_data_size)), + }; + constexpr size_t tensor_shape_size = 1; + const int32_t tensor_shape[tensor_shape_size] = { 1 }; + + constexpr size_t tensors_size = 10; + const Offset tensors[tensors_size] = { + // Op 1 inputs: + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_input_tensor_1"), 0, + false /* is_variable */), + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 1, builder->CreateString("test_variable_tensor_1"), + 0, true /* is_variable */), + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_UINT8, 2, builder->CreateString("test_weight_tensor_1"), 0, + false /* is_variable */), + // Op 1 output / Op 2 input: + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_output_tensor_1"), 0, + false /* is_variable */), + // Op 2 inputs: + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 1, builder->CreateString("test_variable_tensor_2"), + 0, true /* is_variable */), + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_UINT8, 2, builder->CreateString("test_weight_tensor_2"), 0, + false /* is_variable */), + // Op 2 output / Op 3 input: + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_output_tensor_2"), 0, + false /* is_variable */), + // Op 3 inputs: + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 1, builder->CreateString("test_variable_tensor_3"), + 0, true /* is_variable */), + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_UINT8, 2, builder->CreateString("test_weight_tensor_3"), 0, + false /* is_variable */), + // Op 3 output: + CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_output_tensor_3"), 0, + false /* is_variable */), + }; + + constexpr size_t operators_size = 3; + Offset operators[operators_size]; + { + // Set Op 1 attributes: + constexpr size_t operator_inputs_size = 3; + const int32_t operator_inputs[operator_inputs_size] = { 0, 1, 2 }; + constexpr size_t operator_outputs_size = 1; + const int32_t operator_outputs[operator_outputs_size] = { 3 }; + + operators[0] = { CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, operator_outputs_size), + BuiltinOptions_NONE) }; + } + + { + // Set Op 2 attributes + constexpr size_t operator_inputs_size = 3; + const int32_t operator_inputs[operator_inputs_size] = { 3, 4, 5 }; + constexpr size_t operator_outputs_size = 1; + const int32_t operator_outputs[operator_outputs_size] = { 6 }; + + operators[1] = { CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, operator_outputs_size), + BuiltinOptions_NONE) }; + } + + { + // Set Op 3 attributes + constexpr size_t operator_inputs_size = 3; + const int32_t operator_inputs[operator_inputs_size] = { 6, 7, 8 }; + constexpr size_t operator_outputs_size = 1; + const int32_t operator_outputs[operator_outputs_size] = { 9 }; + + operators[2] = { CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, operator_outputs_size), + BuiltinOptions_NONE) }; + } + + constexpr size_t inputs_size = 1; + const int32_t inputs[inputs_size] = { 0 }; + constexpr size_t outputs_size = 1; + const int32_t outputs[outputs_size] = { 9 }; + + constexpr size_t subgraphs_size = 1; + const Offset subgraphs[subgraphs_size] = { + CreateSubGraph(*builder, builder->CreateVector(tensors, tensors_size), + builder->CreateVector(inputs, inputs_size), + builder->CreateVector(outputs, outputs_size), + builder->CreateVector(operators, operators_size), + builder->CreateString("test_subgraph")) + }; + + constexpr size_t operator_codes_size = 1; + const Offset operator_codes[operator_codes_size] = { + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "mock_custom", + /*version=*/0, BuiltinOperator_CUSTOM) + }; + + const Offset model_offset = CreateModel( + *builder, 0, builder->CreateVector(operator_codes, operator_codes_size), + builder->CreateVector(subgraphs, subgraphs_size), + builder->CreateString("test_model"), + builder->CreateVector(buffers, buffers_size)); + + FinishModelBuffer(*builder, model_offset); + void *model_pointer = builder->GetBufferPointer(); + const Model *model = flatbuffers::GetRoot(model_pointer); + return model; +} + +const Model *BuildSimpleMultipleInputsModel() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + + constexpr size_t buffers_size = 1; + const Offset buffers[buffers_size] = { + CreateBuffer(*builder), + }; + constexpr size_t tensor_shape_size = 1; + const int32_t tensor_shape[tensor_shape_size] = { 1 }; + constexpr size_t tensors_size = 4; + const Offset tensors[tensors_size] = { + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, + builder->CreateString("test_input_tensor1"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT8, 0, + builder->CreateString("test_input_tensor2"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, + builder->CreateString("test_input_tensor3"), 0, false), + CreateTensor(*builder, + builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, + builder->CreateString("test_output_tensor"), 0, false), + }; + constexpr size_t inputs_size = 3; + const int32_t inputs[inputs_size] = { 0, 1, 2 }; + constexpr size_t outputs_size = 1; + const int32_t outputs[outputs_size] = { 3 }; + constexpr size_t operator_inputs_size = 3; + const int32_t operator_inputs[operator_inputs_size] = { 0, 1, 2 }; + constexpr size_t operator_outputs_size = 1; + const int32_t operator_outputs[operator_outputs_size] = { 3 }; + constexpr size_t operators_size = 1; + const Offset operators[operators_size] = { + CreateOperator( + *builder, 0, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, operator_outputs_size), + BuiltinOptions_NONE), + }; + constexpr size_t subgraphs_size = 1; + const Offset subgraphs[subgraphs_size] = { + CreateSubGraph(*builder, builder->CreateVector(tensors, tensors_size), + builder->CreateVector(inputs, inputs_size), + builder->CreateVector(outputs, outputs_size), + builder->CreateVector(operators, operators_size), + builder->CreateString("test_subgraph")) + }; + constexpr size_t operator_codes_size = 1; + const Offset operator_codes[operator_codes_size] = { + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "multiple_inputs_op", + /*version=*/0, BuiltinOperator_CUSTOM) + }; + const Offset model_offset = CreateModel( + *builder, 0, builder->CreateVector(operator_codes, operator_codes_size), + builder->CreateVector(subgraphs, subgraphs_size), + builder->CreateString("test_model"), + builder->CreateVector(buffers, buffers_size)); + FinishModelBuffer(*builder, model_offset); + void *model_pointer = builder->GetBufferPointer(); + const Model *model = flatbuffers::GetRoot(model_pointer); + return model; +} + +const Model *BuildSimpleModelWithSubgraphsAndIf() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + + constexpr size_t buffers_size = 1; + const Offset buffers[buffers_size] = { + CreateBuffer(*builder), + }; + const int32_t condition_tensor_shape[] = { 1 }; + const int32_t data_tensor_shape[] = { 1, 2 }; + constexpr size_t tensors_size = 4; + const Offset subgraph1_tensors[tensors_size] = { + CreateTensor(*builder, builder->CreateVector(condition_tensor_shape, 1), + TensorType_BOOL, 0, + builder->CreateString("condition tensor"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("input_tensor1"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("input_tensor2"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("output_tensor"), 0, false), + }; + const Offset subgraph2_tensors[tensors_size] = { + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("input_tensor1"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("input_tensor2"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("output_tensor"), 0, false), + }; + const Offset subgraph3_tensors[tensors_size] = { + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("input_tensor1"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("input_tensor2"), 0, false), + CreateTensor(*builder, builder->CreateVector(data_tensor_shape, 2), + TensorType_FLOAT32, 0, + builder->CreateString("output_tensor"), 0, false), + }; + + constexpr size_t if_inputs_size = 3; + const int32_t if_inputs[if_inputs_size] = { 0, 1, 2 }; + constexpr size_t outputs_size = 1; + const int32_t if_outputs[outputs_size] = { 3 }; + constexpr size_t operator_inputs_size = 2; + const int32_t operator_inputs[operator_inputs_size] = { 0, 1 }; + const int32_t operator_outputs[outputs_size] = { 2 }; + constexpr size_t operators_size = 1; + const Offset subgraph1_operators[operators_size] = { + CreateOperator( + *builder, 0, builder->CreateVector(if_inputs, if_inputs_size), + builder->CreateVector(if_outputs, outputs_size), + BuiltinOptions_IfOptions, CreateIfOptions(*builder, 1, 2).Union()), + }; + const Offset subgraph2_operators[operators_size] = { + CreateOperator( + *builder, 1, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, outputs_size), + BuiltinOptions_NONE), + }; + const Offset subgraph3_operators[operators_size] = { + CreateOperator( + *builder, 2, + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, outputs_size), + BuiltinOptions_NONE), + }; + constexpr size_t subgraphs_size = 3; + const Offset subgraphs[subgraphs_size] = { + CreateSubGraph(*builder, builder->CreateVector(subgraph1_tensors, 4), + builder->CreateVector(if_inputs, if_inputs_size), + builder->CreateVector(if_outputs, outputs_size), + builder->CreateVector(subgraph1_operators, operators_size), + builder->CreateString("if_subgraph")), + CreateSubGraph( + *builder, builder->CreateVector(subgraph2_tensors, 3), + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, outputs_size), + builder->CreateVector(subgraph2_operators, operators_size), + builder->CreateString("then_subgraph")), + CreateSubGraph( + *builder, builder->CreateVector(subgraph3_tensors, 3), + builder->CreateVector(operator_inputs, operator_inputs_size), + builder->CreateVector(operator_outputs, outputs_size), + builder->CreateVector(subgraph3_operators, operators_size), + builder->CreateString("else_subgraph")), + }; + constexpr size_t operator_codes_size = 3; + const Offset operator_codes[operator_codes_size] = { + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "multiple_inputs_op", + /*version=*/0, BuiltinOperator_IF), + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "multiple_inputs_op", + /*version=*/0, BuiltinOperator_ADD), + CreateOperatorCodeDirect(*builder, /*deprecated_builtin_code=*/0, + "multiple_inputs_op", + /*version=*/0, BuiltinOperator_MUL), + }; + const Offset model_offset = CreateModel( + *builder, 0, builder->CreateVector(operator_codes, operator_codes_size), + builder->CreateVector(subgraphs, subgraphs_size), + builder->CreateString("test_model"), + builder->CreateVector(buffers, buffers_size)); + FinishModelBuffer(*builder, model_offset); + void *model_pointer = builder->GetBufferPointer(); + const Model *model = flatbuffers::GetRoot(model_pointer); + return model; +} + +} // namespace + +const TfLiteRegistration *SimpleStatefulOp::getRegistration() +{ + return GetMutableRegistration(); +} + +TfLiteRegistration *SimpleStatefulOp::GetMutableRegistration() +{ + static TfLiteRegistration r; + r.init = Init; + r.prepare = Prepare; + r.invoke = Invoke; + return &r; +} + +void *SimpleStatefulOp::Init(TfLiteContext *context, const char *buffer, + size_t length) +{ + TFLITE_DCHECK(context->AllocateBufferForEval == nullptr); + TFLITE_DCHECK(context->GetScratchBuffer == nullptr); + TFLITE_DCHECK(context->RequestScratchBufferInArena == nullptr); + + void *raw = context->AllocatePersistentBuffer(context, sizeof(OpData)); + OpData *data = reinterpret_cast(raw); + *data = {}; + return raw; +} + +TfLiteStatus SimpleStatefulOp::Prepare(TfLiteContext *context, + TfLiteNode *node) +{ + OpData *data = reinterpret_cast(node->user_data); + + // Make sure that the input is in uint8_t with at least 1 data entry. + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + if (input->type != kTfLiteUInt8) + return kTfLiteError; + if (NumElements(input->dims) == 0) + return kTfLiteError; + + // Allocate a temporary buffer with the same size of input for sorting. + TF_LITE_ENSURE_STATUS(context->RequestScratchBufferInArena( + context, sizeof(uint8_t) * NumElements(input->dims), + &data->sorting_buffer)); + // We can interleave scratch / persistent buffer allocation. + data->invoke_count = reinterpret_cast( + context->AllocatePersistentBuffer(context, sizeof(int))); + *data->invoke_count = 0; + + return kTfLiteOk; +} + +TfLiteStatus SimpleStatefulOp::Invoke(TfLiteContext *context, + TfLiteNode *node) +{ + OpData *data = reinterpret_cast(node->user_data); + *data->invoke_count += 1; + + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, kInputTensor, &input)); + const uint8_t *input_data = GetTensorData(input); + int size = NumElements(input->dims); + + uint8_t *sorting_buffer = reinterpret_cast( + context->GetScratchBuffer(context, data->sorting_buffer)); + // Copy inputs data to the sorting buffer. We don't want to mutate the input + // tensor as it might be used by a another node. + for (int i = 0; i < size; i++) { + sorting_buffer[i] = input_data[i]; + } + + // In place insertion sort on `sorting_buffer`. + for (int i = 1; i < size; i++) { + for (int j = i; j > 0 && sorting_buffer[j] < sorting_buffer[j - 1]; j--) { + std::swap(sorting_buffer[j], sorting_buffer[j - 1]); + } + } + + TfLiteTensor *median; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kMedianTensor, &median)); + uint8_t *median_data = GetTensorData(median); + TfLiteTensor *invoke_count; + TF_LITE_ENSURE_OK(context, + GetOutputSafe(context, node, kInvokeCount, &invoke_count)); + int32_t *invoke_count_data = GetTensorData(invoke_count); + + median_data[0] = sorting_buffer[size / 2]; + invoke_count_data[0] = *data->invoke_count; + return kTfLiteOk; +} + +const TfLiteRegistration *MockCustom::getRegistration() +{ + return GetMutableRegistration(); +} + +TfLiteRegistration *MockCustom::GetMutableRegistration() +{ + static TfLiteRegistration r; + r.init = Init; + r.prepare = Prepare; + r.invoke = Invoke; + r.free = Free; + return &r; +} + +void *MockCustom::Init(TfLiteContext *context, const char *buffer, + size_t length) +{ + // We don't support delegate in TFL micro. This is a weak check to test if + // context struct being zero-initialized. + TFLITE_DCHECK(context->ReplaceNodeSubsetsWithDelegateKernels == nullptr); + freed_ = false; + // Do nothing. + return nullptr; +} + +void MockCustom::Free(TfLiteContext *context, void *buffer) +{ + freed_ = true; +} + +TfLiteStatus MockCustom::Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return kTfLiteOk; +} + +TfLiteStatus MockCustom::Invoke(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 0, &input)); + const int32_t *input_data = input->data.i32; + const TfLiteTensor *weight; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 1, &weight)); + const uint8_t *weight_data = weight->data.uint8; + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, GetOutputSafe(context, node, 0, &output)); + int32_t *output_data = output->data.i32; + output_data[0] = + 0; // Catch output tensor sharing memory with an input tensor + output_data[0] = input_data[0] + weight_data[0]; + return kTfLiteOk; +} + +bool MockCustom::freed_ = false; + +const TfLiteRegistration *MultipleInputs::getRegistration() +{ + return GetMutableRegistration(); +} + +TfLiteRegistration *MultipleInputs::GetMutableRegistration() +{ + static TfLiteRegistration r; + r.init = Init; + r.prepare = Prepare; + r.invoke = Invoke; + r.free = Free; + return &r; +} + +void *MultipleInputs::Init(TfLiteContext *context, const char *buffer, + size_t length) +{ + // We don't support delegate in TFL micro. This is a weak check to test if + // context struct being zero-initialized. + TFLITE_DCHECK(context->ReplaceNodeSubsetsWithDelegateKernels == nullptr); + freed_ = false; + // Do nothing. + return nullptr; +} + +void MultipleInputs::Free(TfLiteContext *context, void *buffer) +{ + freed_ = true; +} + +TfLiteStatus MultipleInputs::Prepare(TfLiteContext *context, TfLiteNode *node) +{ + return kTfLiteOk; +} + +TfLiteStatus MultipleInputs::Invoke(TfLiteContext *context, TfLiteNode *node) +{ + const TfLiteTensor *input; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 0, &input)); + const int32_t *input_data = input->data.i32; + const TfLiteTensor *input1; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 1, &input1)); + const int32_t *input_data1 = input1->data.i32; + const TfLiteTensor *input2; + TF_LITE_ENSURE_OK(context, GetInputSafe(context, node, 2, &input2)); + const int32_t *input_data2 = input2->data.i32; + + TfLiteTensor *output; + TF_LITE_ENSURE_OK(context, GetOutputSafe(context, node, 0, &output)); + int32_t *output_data = output->data.i32; + output_data[0] = + 0; // Catch output tensor sharing memory with an input tensor + output_data[0] = input_data[0] + input_data1[0] + input_data2[0]; + return kTfLiteOk; +} + +bool MultipleInputs::freed_ = false; + +AllOpsResolver GetOpResolver() +{ + AllOpsResolver op_resolver; + op_resolver.AddCustom("mock_custom", MockCustom::GetMutableRegistration()); + op_resolver.AddCustom("simple_stateful_op", + SimpleStatefulOp::GetMutableRegistration()); + op_resolver.AddCustom("multiple_inputs_op", + MultipleInputs::GetMutableRegistration()); + return op_resolver; +} +const Model *GetModelWithUnusedInputs() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildModelWithUnusedInputs()); + } + return model; +} + +const Model *GetSimpleMockModel() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildSimpleMockModel()); + } + return model; +} + +const Model *GetSimpleMultipleInputsModel() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildSimpleMultipleInputsModel()); + } + return model; +} + +const Model *GetSimpleModelWithSubgraphsAndIf() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildSimpleModelWithSubgraphsAndIf()); + } + return model; +} + +const Model *GetComplexMockModel() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildComplexMockModel()); + } + return model; +} + +const Model *GetSimpleModelWithBranch() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildSimpleModelWithBranch()); + } + return model; +} + +const Model *GetModelWithOfflinePlanning(int num_tensors, + const int32_t *metadata_buffer, + NodeConnection *node_conn, + int num_conns, + int num_subgraph_inputs) +{ + const Model *model = BuildModelWithOfflinePlanning( + num_tensors, metadata_buffer, node_conn, num_conns, num_subgraph_inputs); + return model; +} + +const Model *GetSimpleStatefulModel() +{ + static Model *model = nullptr; + if (!model) { + model = const_cast(BuildSimpleStatefulModel()); + } + return model; +} + +const Tensor *Create1dFlatbufferTensor(int size, bool is_variable) +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + constexpr size_t tensor_shape_size = 1; + const int32_t tensor_shape[tensor_shape_size] = { size }; + const Offset tensor_offset = CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_tensor"), 0, + is_variable); + builder->Finish(tensor_offset); + void *tensor_pointer = builder->GetBufferPointer(); + const Tensor *tensor = flatbuffers::GetRoot(tensor_pointer); + return tensor; +} + +const Tensor *CreateQuantizedFlatbufferTensor(int size) +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + const Offset quant_params = + CreateQuantizationParameters( + *builder, + /*min=*/builder->CreateVector({ 0.1f }), + /*max=*/builder->CreateVector({ 0.2f }), + /*scale=*/builder->CreateVector({ 0.3f }), + /*zero_point=*/builder->CreateVector({ 100ll })); + + constexpr size_t tensor_shape_size = 1; + const int32_t tensor_shape[tensor_shape_size] = { size }; + const Offset tensor_offset = CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_tensor"), quant_params, + false); + builder->Finish(tensor_offset); + void *tensor_pointer = builder->GetBufferPointer(); + const Tensor *tensor = flatbuffers::GetRoot(tensor_pointer); + return tensor; +} + +const Tensor *CreateMissingQuantizationFlatbufferTensor(int size) +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + const Offset quant_params = + CreateQuantizationParameters(*builder, 0, 0, 0, 0, + QuantizationDetails_NONE, 0, 0); + constexpr size_t tensor_shape_size = 1; + const int32_t tensor_shape[tensor_shape_size] = { size }; + const Offset tensor_offset = CreateTensor( + *builder, builder->CreateVector(tensor_shape, tensor_shape_size), + TensorType_INT32, 0, builder->CreateString("test_tensor"), quant_params, + false); + builder->Finish(tensor_offset); + void *tensor_pointer = builder->GetBufferPointer(); + const Tensor *tensor = flatbuffers::GetRoot(tensor_pointer); + return tensor; +} + +const flatbuffers::Vector > * +CreateFlatbufferBuffers() +{ + using flatbuffers::Offset; + flatbuffers::FlatBufferBuilder *builder = BuilderInstance(); + constexpr size_t buffers_size = 1; + const Offset buffers[buffers_size] = { + CreateBuffer(*builder), + }; + const flatbuffers::Offset > > + buffers_offset = builder->CreateVector(buffers, buffers_size); + builder->Finish(buffers_offset); + void *buffers_pointer = builder->GetBufferPointer(); + const flatbuffers::Vector > *result = + flatbuffers::GetRoot > >( + buffers_pointer); + return result; +} + +int TestStrcmp(const char *a, const char *b) +{ + if ((a == nullptr) || (b == nullptr)) { + return -1; + } + while ((*a != 0) && (*a == *b)) { + a++; + b++; + } + return *reinterpret_cast(a) - + *reinterpret_cast(b); +} + +// Wrapper to forward kernel errors to the interpreter's error reporter. +void ReportOpError(struct TfLiteContext *context, const char *format, ...) +{ +#ifndef TF_LITE_STRIP_ERROR_STRINGS + ErrorReporter *error_reporter = static_cast(context->impl_); + va_list args; + va_start(args, format); + TF_LITE_REPORT_ERROR(error_reporter, format, args); + va_end(args); +#endif +} + +// Create a TfLiteIntArray from an array of ints. The first element in the +// supplied array must be the size of the array expressed as an int. +TfLiteIntArray *IntArrayFromInts(int *int_array) +{ + return reinterpret_cast(int_array); +} + +// Create a TfLiteFloatArray from an array of floats. The first element in the +// supplied array must be the size of the array expressed as a float. +TfLiteFloatArray *FloatArrayFromFloats(const float *floats) +{ + static_assert(sizeof(float) == sizeof(int), + "assumes sizeof(float) == sizeof(int) to perform casting"); + int size = static_cast(floats[0]); + *reinterpret_cast(const_cast(floats)) = size; + return reinterpret_cast(const_cast(floats)); +} + +TfLiteTensor CreateQuantizedBiasTensor(const float *data, int32_t *quantized, + TfLiteIntArray *dims, float input_scale, + float weights_scale, bool is_variable) +{ + float bias_scale = input_scale * weights_scale; + tflite::SymmetricQuantize(data, quantized, ElementCount(*dims), bias_scale); + + // Quantized int32_t tensors always have a zero point of 0, since the range of + // int32_t values is large, and because zero point costs extra cycles during + // processing. + TfLiteTensor result = + CreateQuantizedTensor(quantized, dims, bias_scale, 0, is_variable); + return result; +} + +TfLiteTensor CreateQuantizedBiasTensor(const float *data, + std::int64_t *quantized, + TfLiteIntArray *dims, float input_scale, + float weights_scale, bool is_variable) +{ + float bias_scale = input_scale * weights_scale; + tflite::SymmetricQuantize(data, quantized, ElementCount(*dims), bias_scale); + + // Quantized int32_t tensors always have a zero point of 0, since the range of + // int32_t values is large, and because zero point costs extra cycles during + // processing. + TfLiteTensor result = + CreateQuantizedTensor(quantized, dims, bias_scale, 0, is_variable); + return result; +} + +// Quantizes int32_t bias tensor with per-channel weights determined by input +// scale multiplied by weight scale for each channel. +template +TfLiteTensor CreatePerChannelQuantizedBiasTensor( + const float *input, T *quantized, TfLiteIntArray *dims, float input_scale, + float *weight_scales, float *scales, int *zero_points, + TfLiteAffineQuantization *affine_quant, int quantized_dimension, + bool is_variable) +{ + int input_size = ElementCount(*dims); + int num_channels = dims->data[quantized_dimension]; + // First element is reserved for array length + zero_points[0] = num_channels; + scales[0] = static_cast(num_channels); + float *scales_array = &scales[1]; + for (int i = 0; i < num_channels; i++) { + scales_array[i] = input_scale * weight_scales[i]; + zero_points[i + 1] = 0; + } + + SymmetricPerChannelQuantize(input, quantized, input_size, num_channels, + scales_array); + + affine_quant->scale = FloatArrayFromFloats(scales); + affine_quant->zero_point = IntArrayFromInts(zero_points); + affine_quant->quantized_dimension = quantized_dimension; + + TfLiteTensor result = CreateTensor(quantized, dims, is_variable); + result.quantization = { kTfLiteAffineQuantization, affine_quant }; + return result; +} + +TfLiteTensor CreatePerChannelQuantizedBiasTensor( + const float *input, int32_t *quantized, TfLiteIntArray *dims, + float input_scale, float *weight_scales, float *scales, int *zero_points, + TfLiteAffineQuantization *affine_quant, int quantized_dimension, + bool is_variable) +{ + return CreatePerChannelQuantizedBiasTensor( + input, quantized, dims, input_scale, weight_scales, scales, zero_points, + affine_quant, quantized_dimension, is_variable); +} + +TfLiteTensor CreatePerChannelQuantizedBiasTensor( + const float *input, std::int64_t *quantized, TfLiteIntArray *dims, + float input_scale, float *weight_scales, float *scales, int *zero_points, + TfLiteAffineQuantization *affine_quant, int quantized_dimension, + bool is_variable) +{ + return CreatePerChannelQuantizedBiasTensor( + input, quantized, dims, input_scale, weight_scales, scales, zero_points, + affine_quant, quantized_dimension, is_variable); +} + +TfLiteTensor CreateSymmetricPerChannelQuantizedTensor( + const float *input, int8_t *quantized, TfLiteIntArray *dims, float *scales, + int *zero_points, TfLiteAffineQuantization *affine_quant, + int quantized_dimension, bool is_variable) +{ + int channel_count = dims->data[quantized_dimension]; + scales[0] = static_cast(channel_count); + zero_points[0] = channel_count; + + SignedSymmetricPerChannelQuantize(input, dims, quantized_dimension, quantized, + &scales[1]); + + for (int i = 0; i < channel_count; i++) { + zero_points[i + 1] = 0; + } + + affine_quant->scale = FloatArrayFromFloats(scales); + affine_quant->zero_point = IntArrayFromInts(zero_points); + affine_quant->quantized_dimension = quantized_dimension; + + TfLiteTensor result = CreateTensor(quantized, dims, is_variable); + result.quantization = { kTfLiteAffineQuantization, affine_quant }; + return result; +} + +size_t GetModelTensorCount(const Model *model) +{ + auto *subgraphs = model->subgraphs(); + if (subgraphs) { + return (*subgraphs)[0]->tensors()->size(); + } + return 0; +} + +} // namespace testing +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/micro/test_helpers.h b/components/TensorFlowLite/tensorflow/lite/micro/test_helpers.h new file mode 100644 index 00000000..eda966bd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/test_helpers.h @@ -0,0 +1,266 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_TEST_HELPERS_H_ +#define TENSORFLOW_LITE_MICRO_TEST_HELPERS_H_ + +// Useful functions for writing tests. + +#include +#include + +#include "flatbuffers/flatbuffers.h" // from @flatbuffers +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/kernels/internal/compatibility.h" +#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" +#include "tensorflow/lite/micro/all_ops_resolver.h" +#include "tensorflow/lite/micro/micro_utils.h" +#include "tensorflow/lite/portable_type_to_tflitetype.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +namespace testing { +constexpr int kOfflinePlannerHeaderSize = 3; + +struct NodeConnection_ { + std::initializer_list input; + std::initializer_list output; +}; +typedef struct NodeConnection_ NodeConnection; + +// A simple operator that returns the median of the input with the number of +// times the kernel was invoked. The implementation below is deliberately +// complicated, just to demonstrate how kernel memory planning works. +class SimpleStatefulOp { + static constexpr int kBufferNotAllocated = 0; + // Inputs: + static constexpr int kInputTensor = 0; + // Outputs: + static constexpr int kMedianTensor = 0; + static constexpr int kInvokeCount = 1; + struct OpData { + int *invoke_count = nullptr; + int sorting_buffer = kBufferNotAllocated; + }; + +public: + static const TfLiteRegistration *getRegistration(); + static TfLiteRegistration *GetMutableRegistration(); + static void *Init(TfLiteContext *context, const char *buffer, size_t length); + static TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node); + static TfLiteStatus Invoke(TfLiteContext *context, TfLiteNode *node); +}; + +class MockCustom { +public: + static const TfLiteRegistration *getRegistration(); + static TfLiteRegistration *GetMutableRegistration(); + static void *Init(TfLiteContext *context, const char *buffer, size_t length); + static void Free(TfLiteContext *context, void *buffer); + static TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node); + static TfLiteStatus Invoke(TfLiteContext *context, TfLiteNode *node); + + static bool freed_; +}; + +// A simple operator with the purpose of testing multiple inputs. It returns +// the sum of the inputs. +class MultipleInputs { +public: + static const TfLiteRegistration *getRegistration(); + static TfLiteRegistration *GetMutableRegistration(); + static void *Init(TfLiteContext *context, const char *buffer, size_t length); + static void Free(TfLiteContext *context, void *buffer); + static TfLiteStatus Prepare(TfLiteContext *context, TfLiteNode *node); + static TfLiteStatus Invoke(TfLiteContext *context, TfLiteNode *node); + + static bool freed_; +}; + +// Returns an Op Resolver that can be used in the testing code. +AllOpsResolver GetOpResolver(); + +// Returns a simple example flatbuffer TensorFlow Lite model. Contains 1 input, +// 1 layer of weights, 1 output Tensor, and 1 operator. +const Model *GetSimpleMockModel(); + +// Returns a flatbuffer TensorFlow Lite model with more inputs, variable +// tensors, and operators. +const Model *GetComplexMockModel(); + +// Returns a simple flatbuffer model with two branches. +const Model *GetSimpleModelWithBranch(); + +// Returns a simple example flatbuffer TensorFlow Lite model. Contains 3 inputs, +// 1 output Tensor, and 1 operator. +const Model *GetSimpleMultipleInputsModel(); + +// Returns a simple flatbuffer model with offline planned tensors +// @param[in] num_tensors Number of tensors in the model. +// @param[in] metadata_buffer Metadata for offline planner. +// @param[in] node_con List of connections, i.e. operators +// in the model. +// @param[in] num_conns Number of connections. +// @param[in] num_subgraph_inputs How many of the input tensors are in +// the subgraph inputs. The default value +// of 0 means all of the input tensors +// are in the subgraph input list. There +// must be at least 1 input tensor in the +// subgraph input list. +const Model *GetModelWithOfflinePlanning(int num_tensors, + const int32_t *metadata_buffer, + NodeConnection *node_conn, + int num_conns, + int num_subgraph_inputs = 0); + +// Returns a flatbuffer with a single operator, two inputs (one unused) and one +// output. +const Model *GetModelWithUnusedInputs(); + +// Returns a flatbuffer model with `simple_stateful_op` +const Model *GetSimpleStatefulModel(); + +// Returns a flatbuffer model with "if" and two subgraphs. +const Model *GetSimpleModelWithSubgraphsAndIf(); + +// Builds a one-dimensional flatbuffer tensor of the given size. +const Tensor *Create1dFlatbufferTensor(int size, bool is_variable = false); + +// Builds a one-dimensional flatbuffer tensor of the given size with +// quantization metadata. +const Tensor *CreateQuantizedFlatbufferTensor(int size); + +// Creates a one-dimensional tensor with no quantization metadata. +const Tensor *CreateMissingQuantizationFlatbufferTensor(int size); + +// Creates a vector of flatbuffer buffers. +const flatbuffers::Vector > * +CreateFlatbufferBuffers(); + +// Performs a simple string comparison without requiring standard C library. +int TestStrcmp(const char *a, const char *b); + +// Wrapper to forward kernel errors to the interpreter's error reporter. +void ReportOpError(struct TfLiteContext *context, const char *format, ...); + +void PopulateContext(TfLiteTensor *tensors, int tensors_size, + TfLiteContext *context); + +// Create a TfLiteIntArray from an array of ints. The first element in the +// supplied array must be the size of the array expressed as an int. +TfLiteIntArray *IntArrayFromInts(int *int_array); + +// Create a TfLiteFloatArray from an array of floats. The first element in the +// supplied array must be the size of the array expressed as a float. +TfLiteFloatArray *FloatArrayFromFloats(const float *floats); + +template +TfLiteTensor CreateTensor(const T *data, TfLiteIntArray *dims, + const bool is_variable = false) +{ + TfLiteTensor result; + result.dims = dims; + result.params = {}; + result.quantization = { kTfLiteNoQuantization, nullptr }; + result.is_variable = is_variable; + result.allocation_type = kTfLiteMemNone; + result.type = typeToTfLiteType(); + // Const cast is used to allow passing in const and non-const arrays within a + // single CreateTensor method. A Const array should be used for immutable + // input tensors and non-const array should be used for mutable and output + // tensors. + result.data.data = const_cast(data); + result.quantization = { kTfLiteAffineQuantization, nullptr }; + result.bytes = ElementCount(*dims) * sizeof(T); + return result; +} + +template +TfLiteTensor CreateQuantizedTensor(const T *data, TfLiteIntArray *dims, + const float scale, const int zero_point = 0, + const bool is_variable = false) +{ + TfLiteTensor result = CreateTensor(data, dims, is_variable); + result.params = { scale, zero_point }; + result.quantization = { kTfLiteAffineQuantization, nullptr }; + return result; +} + +template +TfLiteTensor CreateQuantizedTensor(const float *input, T *quantized, + TfLiteIntArray *dims, float scale, + int zero_point, bool is_variable = false) +{ + int input_size = ElementCount(*dims); + tflite::Quantize(input, quantized, input_size, scale, zero_point); + return CreateQuantizedTensor(quantized, dims, scale, zero_point, is_variable); +} + +TfLiteTensor CreateQuantizedBiasTensor(const float *data, int32_t *quantized, + TfLiteIntArray *dims, float input_scale, + float weights_scale, + bool is_variable = false); + +TfLiteTensor CreateQuantizedBiasTensor(const float *data, + std::int64_t *quantized, + TfLiteIntArray *dims, float input_scale, + float weights_scale, + bool is_variable = false); + +// Quantizes int32_t bias tensor with per-channel weights determined by input +// scale multiplied by weight scale for each channel. +TfLiteTensor CreatePerChannelQuantizedBiasTensor( + const float *input, int32_t *quantized, TfLiteIntArray *dims, + float input_scale, float *weight_scales, float *scales, int *zero_points, + TfLiteAffineQuantization *affine_quant, int quantized_dimension, + bool is_variable = false); + +// Quantizes int64_t bias tensor with per-channel weights determined by input +// scale multiplied by weight scale for each channel. +TfLiteTensor CreatePerChannelQuantizedBiasTensor( + const float *input, std::int64_t *quantized, TfLiteIntArray *dims, + float input_scale, float *weight_scales, float *scales, int *zero_points, + TfLiteAffineQuantization *affine_quant, int quantized_dimension, + bool is_variable = false); + +TfLiteTensor CreateSymmetricPerChannelQuantizedTensor( + const float *input, int8_t *quantized, TfLiteIntArray *dims, float *scales, + int *zero_points, TfLiteAffineQuantization *affine_quant, + int quantized_dimension, bool is_variable = false); + +// Returns the number of tensors in the default subgraph for a tflite::Model. +size_t GetModelTensorCount(const Model *model); + +// Derives the quantization scaling factor from a min and max range. +template +inline float ScaleFromMinMax(const float min, const float max) +{ + return (max - min) / + static_cast((std::numeric_limits::max() * 1.0) - + std::numeric_limits::min()); +} + +// Derives the quantization zero point from a min and max range. +template +inline int ZeroPointFromMinMax(const float min, const float max) +{ + return static_cast(std::numeric_limits::min()) + + static_cast(-min / ScaleFromMinMax(min, max) + 0.5f); +} + +} // namespace testing +} // namespace tflite + +#endif // TENSORFLOW_LITE_MICRO_TEST_HELPERS_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing/generate_test_models.py b/components/TensorFlowLite/tensorflow/lite/micro/testing/generate_test_models.py new file mode 100644 index 00000000..afeab774 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing/generate_test_models.py @@ -0,0 +1,80 @@ +# Copyright 2020 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Python utility script to generate unit test model data.""" + +# Steps to regenerate model test data: +# TODO(b/158011574): Do these steps in the script here instead of manually. +# 1.) Run this script +# 2.) Hexdump the model into a .h/.cc file: +# xxd -i /tmp/tf_micro_conv_test_model.tflite > /tmp/temp.cc +# 3.) Copy/replace contents of temp.cc into desired header/source files (e.g. +# test_conv_model.h/.cc + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from absl import app +import numpy as np +import tensorflow as tf + + +def generate_conv_model(): + """Creates a basic Keras model and converts to tflite. + + This model does not make any relevant classifications. It only exists to + generate a model that is designed to run on embedded devices. + """ + input_shape = (16, 16, 1) + + model = tf.keras.models.Sequential() + model.add( + tf.keras.layers.Conv2D(16, 3, activation="relu", input_shape=input_shape)) + model.add(tf.keras.layers.Conv2D(32, 3, activation="relu")) + model.add(tf.keras.layers.MaxPooling2D(2)) + model.add(tf.keras.layers.Flatten()) + model.add(tf.keras.layers.Dense(10)) + model.compile( + optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"]) + model.summary() + + # Test with random data + data_x = np.random.rand(12, 16, 16, 1) + data_y = np.random.randint(2, size=(12, 10)) + model.fit(data_x, data_y, epochs=5) + + def representative_dataset_gen(): + for _ in range(12): + yield [np.random.rand(16, 16).reshape(1, 16, 16, 1).astype(np.float32)] + + # Now convert to a TFLite model with full int8 quantization: + converter = tf.lite.TFLiteConverter.from_keras_model(model) + converter.optimizations = [tf.lite.Optimize.DEFAULT] + converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] + converter.inference_input_type = tf.int8 + converter.inference_output_type = tf.int8 + converter.representative_dataset = representative_dataset_gen + + tflite_model = converter.convert() + open("/tmp/tf_micro_conv_test_model.int8.tflite", "wb").write(tflite_model) + + +def main(argv): + del argv # Unused for now + generate_conv_model() + + +if __name__ == "__main__": + app.run(main) diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing/micro_test.h b/components/TensorFlowLite/tensorflow/lite/micro/testing/micro_test.h new file mode 100644 index 00000000..cfcf973a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing/micro_test.h @@ -0,0 +1,241 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +// An ultra-lightweight testing framework designed for use with microcontroller +// applications. Its only dependency is on TensorFlow Lite's ErrorReporter +// interface, where log messages are output. This is designed to be usable even +// when no standard C or C++ libraries are available, and without any dynamic +// memory allocation or reliance on global constructors. +// +// To build a test, you use syntax similar to gunit, but with some extra +// decoration to create a hidden 'main' function containing each of the tests to +// be run. Your code should look something like: +// ---------------------------------------------------------------------------- +// #include "path/to/this/header" +// +// TF_LITE_MICRO_TESTS_BEGIN +// +// TF_LITE_MICRO_TEST(SomeTest) { +// TF_LITE_LOG_EXPECT_EQ(true, true); +// } +// +// TF_LITE_MICRO_TESTS_END +// ---------------------------------------------------------------------------- +// If you compile this for your platform, you'll get a normal binary that you +// should be able to run. Executing it will output logging information like this +// to stderr (or whatever equivalent is available and written to by +// ErrorReporter): +// ---------------------------------------------------------------------------- +// Testing SomeTest +// 1/1 tests passed +// ~~~ALL TESTS PASSED~~~ +// ---------------------------------------------------------------------------- +// This is designed to be human-readable, so you can just run tests manually, +// but the string "~~~ALL TESTS PASSED~~~" should only appear if all of the +// tests do pass. This makes it possible to integrate with automated test +// systems by scanning the output logs and looking for that magic value. +// +// This framework is intended to be a rudimentary alternative to no testing at +// all on systems that struggle to run more conventional approaches, so use with +// caution! + +#ifndef TENSORFLOW_LITE_MICRO_TESTING_MICRO_TEST_H_ +#define TENSORFLOW_LITE_MICRO_TESTING_MICRO_TEST_H_ + +#include "tensorflow/lite/c/common.h" +#include "tensorflow/lite/micro/micro_error_reporter.h" +#include "tensorflow/lite/micro/system_setup.h" + +namespace micro_test { +extern int tests_passed; +extern int tests_failed; +extern bool is_test_complete; +extern bool did_test_fail; +} // namespace micro_test + +namespace tflite { +// This additional helper function is used (instead of directly calling +// tflite::InitializeTarget from the TF_LITE_MICRO_TESTS_BEGIN macro) to avoid +// adding a dependency from every bazel test target to micro:system_setp (which +// is the target that implements InitializeTarget(). +// +// The underlying issue here is that the use of the macros results in +// dependencies that can be containted within the micro/testing:micro_test +// target bleeding on to all the tests. +inline void InitializeTest() +{ + InitializeTarget(); +} +} // namespace tflite + +#define TF_LITE_MICRO_TESTS_BEGIN \ + namespace micro_test { \ + int tests_passed; \ + int tests_failed; \ + bool is_test_complete; \ + bool did_test_fail; \ + } \ + \ + int main(int argc, char **argv) \ + { \ + micro_test::tests_passed = 0; \ + micro_test::tests_failed = 0; \ + tflite::InitializeTest(); + +#define TF_LITE_MICRO_TESTS_END \ + MicroPrintf("%d/%d tests passed", micro_test::tests_passed, \ + (micro_test::tests_failed + micro_test::tests_passed)); \ + if (micro_test::tests_failed == 0) { \ + MicroPrintf("~~~ALL TESTS PASSED~~~\n"); \ + return kTfLiteOk; \ + } else { \ + MicroPrintf("~~~SOME TESTS FAILED~~~\n"); \ + return kTfLiteError; \ + } \ + } + +// TODO(petewarden): I'm going to hell for what I'm doing to this poor for loop. +#define TF_LITE_MICRO_TEST(name) \ + MicroPrintf("Testing " #name); \ + for (micro_test::is_test_complete = false, \ + micro_test::did_test_fail = false; \ + !micro_test::is_test_complete; micro_test::is_test_complete = true, \ + micro_test::tests_passed += (micro_test::did_test_fail) ? 0 : 1, \ + micro_test::tests_failed += (micro_test::did_test_fail) ? 1 : 0) + +#define TF_LITE_MICRO_EXPECT(x) \ + do { \ + if (!(x)) { \ + MicroPrintf(#x " failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +// TODO(b/139142772): this macro is used with types other than ints even though +// the printf specifier is %d. +#define TF_LITE_MICRO_EXPECT_EQ(x, y) \ + do { \ + auto vx = x; \ + auto vy = y; \ + if ((vx) != (vy)) { \ + MicroPrintf(#x " == " #y " failed at %s:%d (%d vs %d)", __FILE__, \ + __LINE__, static_cast(vx), static_cast(vy)); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_NE(x, y) \ + do { \ + if ((x) == (y)) { \ + MicroPrintf(#x " != " #y " failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +// TODO(wangtz): Making it more generic once needed. +#define TF_LITE_MICRO_ARRAY_ELEMENT_EXPECT_NEAR(arr1, idx1, arr2, idx2, \ + epsilon) \ + do { \ + auto delta = ((arr1)[(idx1)] > (arr2)[(idx2)]) ? ((arr1)[(idx1)] - (arr2)[(idx2)]) : ((arr2)[(idx2)] - (arr1)[(idx1)]); \ + if (delta > epsilon) { \ + MicroPrintf(#arr1 "[%d] (%f) near " #arr2 "[%d] (%f) failed at %s:%d", \ + static_cast(idx1), static_cast((arr1)[(idx1)]), \ + static_cast(idx2), static_cast((arr2)[(idx2)]), \ + __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +// The check vx != vy is needed to properly handle the case where both +// x and y evaluate to infinity. See #46960 for more details. +#define TF_LITE_MICRO_EXPECT_NEAR(x, y, epsilon) \ + do { \ + auto vx = (x); \ + auto vy = (y); \ + auto delta = ((vx) > (vy)) ? ((vx) - (vy)) : ((vy) - (vx)); \ + if (vx != vy && delta > epsilon) { \ + MicroPrintf(#x " (%f) near " #y " (%f) failed at %s:%d", \ + static_cast(vx), static_cast(vy), __FILE__, \ + __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_GT(x, y) \ + do { \ + if ((x) <= (y)) { \ + MicroPrintf(#x " > " #y " failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_LT(x, y) \ + do { \ + if ((x) >= (y)) { \ + MicroPrintf(#x " < " #y " failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_GE(x, y) \ + do { \ + if ((x) < (y)) { \ + MicroPrintf(#x " >= " #y " failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_LE(x, y) \ + do { \ + if ((x) > (y)) { \ + MicroPrintf(#x " <= " #y " failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_TRUE(x) \ + do { \ + if (!(x)) { \ + MicroPrintf(#x " was not true failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_FALSE(x) \ + do { \ + if (x) { \ + MicroPrintf(#x " was not false failed at %s:%d", __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } while (false) + +#define TF_LITE_MICRO_FAIL(msg) \ + do { \ + MicroPrintf("FAIL: %s", msg, __FILE__, __LINE__); \ + micro_test::did_test_fail = true; \ + } while (false) + +#define TF_LITE_MICRO_EXPECT_STRING_EQ(string1, string2) \ + do { \ + for (int i = 0; string1[i] != '\0' && string2[i] != '\0'; i++) { \ + if (string1[i] != string2[i]) { \ + MicroPrintf("FAIL: %s did not match %s", string1, string2, __FILE__, \ + __LINE__); \ + micro_test::did_test_fail = true; \ + } \ + } \ + } while (false) + +#endif // TENSORFLOW_LITE_MICRO_TESTING_MICRO_TEST_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing/robot.resource.txt b/components/TensorFlowLite/tensorflow/lite/micro/testing/robot.resource.txt new file mode 100644 index 00000000..e06720c8 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing/robot.resource.txt @@ -0,0 +1,26 @@ +*** Variables *** +${UART} sysbus.cpu.uartSemihosting + +*** Keywords *** +Teardown With Custom Message + Test Teardown + [Documentation] Replace robot fail message with whole UART output + ${UART_LOGS} Get File ${UART_LOG} + Set Test Message UART OUTPUT:\n\n${UART_LOGS} + Remove File ${UART_LOG} + +Create Platform + Execute Command $logfile=@${UART_LOG} + Execute Script ${RESC} + Provides ready-platform + +Test Binary + [Arguments] ${BIN} + Requires ready-platform + Execute Command sysbus LoadELF ${BIN} + + Create Terminal Tester ${UART} timeout=2 + Start Emulation + + Wait For Line On Uart ${UART_LINE_ON_SUCCESS} + diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.cc b/components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.cc new file mode 100644 index 00000000..fef21ad7 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.cc @@ -0,0 +1,1800 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/testing/test_conv_model.h" + +extern const unsigned char kTestConvModelData[] = { + 0x24, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb4, 0x52, 0x00, 0x00, + 0x3c, 0x42, 0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x0f, 0x00, 0x00, 0x00, + 0xd4, 0x41, 0x00, 0x00, 0xc0, 0x41, 0x00, 0x00, 0x64, 0x41, 0x00, 0x00, + 0xc0, 0x40, 0x00, 0x00, 0x7c, 0x40, 0x00, 0x00, 0x58, 0x40, 0x00, 0x00, + 0x44, 0x13, 0x00, 0x00, 0xa0, 0x12, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xd6, 0xbe, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x31, 0x2e, 0x35, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x94, 0xb2, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xb2, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb4, 0xb2, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc4, 0xb2, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xb2, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x46, 0xbf, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, 0x7d, 0x6a, 0x24, 0xa1, 0xf6, 0xca, 0x70, 0x2f, + 0x8e, 0xb1, 0xe8, 0x15, 0x42, 0x08, 0x32, 0xf6, 0xe9, 0xfb, 0xa0, 0xda, + 0xe4, 0xf1, 0x0a, 0x9d, 0x72, 0x66, 0x88, 0x37, 0xe9, 0x9e, 0x08, 0x54, + 0x61, 0x51, 0x40, 0x93, 0x4d, 0xcf, 0xe2, 0x08, 0x36, 0xad, 0xb1, 0x8e, + 0xfc, 0xe4, 0x02, 0xd1, 0x9a, 0x1e, 0x05, 0x67, 0xa3, 0x3b, 0xa6, 0xde, + 0x5d, 0x2a, 0xcc, 0x8c, 0x3c, 0x2e, 0xd2, 0x15, 0xc2, 0x60, 0xab, 0xea, + 0x73, 0xe4, 0x88, 0xc1, 0x66, 0x21, 0xb0, 0xe5, 0x5b, 0x55, 0xda, 0x69, + 0x2d, 0x0c, 0x66, 0x07, 0x74, 0x36, 0xcd, 0x79, 0x81, 0xf9, 0x5c, 0x2c, + 0xb5, 0x93, 0xab, 0x76, 0xa1, 0x1f, 0x20, 0x90, 0x89, 0xe1, 0x41, 0xc7, + 0x32, 0xc2, 0xa3, 0x03, 0x77, 0x86, 0x79, 0xf7, 0x89, 0xc1, 0xb1, 0x42, + 0x2a, 0x75, 0xc7, 0xc1, 0x2f, 0xbb, 0xf6, 0xe8, 0x23, 0x99, 0x9b, 0x74, + 0x9c, 0xe5, 0x91, 0x15, 0xc6, 0x08, 0x0e, 0xae, 0x7c, 0xd3, 0x27, 0x54, + 0xfb, 0xa7, 0x49, 0x65, 0x52, 0x2f, 0x63, 0x33, 0x8b, 0x5f, 0x67, 0x21, + 0x25, 0xe0, 0xcf, 0x95, 0x03, 0x05, 0x19, 0x0c, 0x3d, 0xfc, 0x95, 0x42, + 0xa9, 0x26, 0x27, 0x54, 0xa3, 0x71, 0xb4, 0x70, 0x7a, 0x40, 0x0d, 0xc1, + 0x72, 0x04, 0x81, 0x3b, 0xb9, 0xb7, 0xd2, 0xc1, 0x4e, 0xf8, 0xff, 0xca, + 0x66, 0xc1, 0xbe, 0xb9, 0x09, 0xbd, 0xb9, 0x2c, 0x5b, 0x97, 0xc3, 0xa8, + 0xf6, 0xc4, 0x23, 0x93, 0x2e, 0xf6, 0xce, 0x2e, 0xdb, 0xfb, 0x8f, 0xb0, + 0xc8, 0xba, 0xfa, 0x97, 0xfd, 0xc0, 0x0a, 0xc8, 0x2c, 0xf3, 0x4c, 0x4d, + 0x8b, 0x3b, 0x47, 0x11, 0xfb, 0xe8, 0x96, 0xe3, 0xcc, 0xef, 0xe4, 0xb5, + 0x07, 0xa1, 0xb7, 0xa9, 0xf7, 0x98, 0x71, 0x59, 0x9b, 0x5a, 0x7b, 0x88, + 0xe4, 0xcf, 0x9b, 0x55, 0x26, 0xce, 0x59, 0x73, 0x66, 0x17, 0x9c, 0x74, + 0x02, 0xfc, 0x24, 0x01, 0xde, 0x44, 0x98, 0xe3, 0x8b, 0x18, 0x02, 0x42, + 0xf5, 0x0f, 0xbc, 0xcb, 0xf7, 0x37, 0xb1, 0xd5, 0xb4, 0x7c, 0x0a, 0x6a, + 0x59, 0x59, 0xc9, 0x11, 0xd8, 0x0f, 0xf9, 0xab, 0x40, 0xdd, 0x14, 0xf9, + 0x30, 0xaa, 0xf1, 0x8c, 0x6d, 0xbc, 0x4c, 0x5b, 0x71, 0x95, 0xfd, 0x41, + 0x4c, 0xf3, 0xb4, 0x7f, 0x1c, 0xb6, 0x4b, 0x12, 0x3b, 0x6e, 0xc1, 0xce, + 0x6f, 0xf8, 0x57, 0xb7, 0x5e, 0x2a, 0x36, 0x32, 0x3d, 0x85, 0xc6, 0xbf, + 0xd7, 0xab, 0x95, 0x45, 0x62, 0xae, 0xb8, 0xa6, 0x03, 0xcc, 0x21, 0x25, + 0x18, 0x5a, 0xa8, 0x03, 0x27, 0x33, 0x47, 0xb1, 0x7e, 0x0e, 0xbd, 0xc3, + 0x24, 0x25, 0x78, 0x28, 0xa4, 0xe3, 0x5b, 0x08, 0xbf, 0x04, 0xa2, 0xae, + 0x90, 0x4c, 0x96, 0x78, 0xa8, 0xb1, 0xb8, 0x54, 0x89, 0x25, 0x2d, 0x35, + 0x93, 0x95, 0xa5, 0xd3, 0x1a, 0xe6, 0x00, 0x8b, 0xfe, 0x36, 0x0f, 0xd2, + 0x6e, 0xff, 0x86, 0x93, 0x48, 0xb8, 0x08, 0x39, 0x1f, 0x3a, 0x2d, 0xe7, + 0x47, 0x5e, 0x05, 0x66, 0x7a, 0xb8, 0xe4, 0xda, 0xbc, 0x5b, 0x57, 0xdf, + 0xd9, 0x0a, 0xb9, 0x48, 0x5d, 0x0c, 0x57, 0xed, 0x8d, 0xbb, 0x8d, 0x4b, + 0x0e, 0xb8, 0xea, 0x02, 0x06, 0x2f, 0xfd, 0x28, 0x0d, 0x0b, 0xf4, 0xf4, + 0x52, 0x81, 0x77, 0x15, 0x87, 0x53, 0x28, 0xef, 0xbe, 0xc6, 0x4c, 0x45, + 0x3e, 0x1a, 0x6e, 0xbd, 0x10, 0xd8, 0x9a, 0x72, 0x1f, 0x14, 0xe2, 0x37, + 0x08, 0xaf, 0xfa, 0xce, 0xd3, 0x84, 0x23, 0x43, 0x8c, 0x5c, 0xce, 0x1b, + 0xf7, 0xf3, 0xb0, 0x3b, 0xfd, 0x33, 0xf8, 0x09, 0xf1, 0x41, 0xa5, 0xa8, + 0x86, 0x8d, 0x56, 0xde, 0xf6, 0x68, 0xe3, 0x4c, 0x97, 0xa6, 0xc3, 0x66, + 0x9b, 0xa9, 0x8a, 0xbd, 0x59, 0x45, 0xfb, 0xdf, 0xa1, 0x42, 0x10, 0x1c, + 0x55, 0x22, 0x53, 0xe1, 0x32, 0x33, 0xf9, 0xfa, 0xc2, 0x70, 0x0f, 0x49, + 0x15, 0xa7, 0x21, 0xbc, 0x56, 0x35, 0x09, 0x06, 0xe6, 0x5e, 0xc4, 0xc1, + 0x64, 0x93, 0x59, 0x3b, 0x8e, 0xb7, 0x52, 0x6c, 0x4d, 0xa1, 0xb7, 0xee, + 0x14, 0xc2, 0x01, 0x25, 0xbb, 0x5e, 0xe0, 0xc6, 0xa4, 0x4f, 0xb5, 0x20, + 0x88, 0xe0, 0xd7, 0x5e, 0x26, 0x5b, 0x9f, 0xf7, 0xb5, 0x26, 0x5b, 0xfc, + 0xf3, 0x3e, 0xf3, 0x57, 0x6f, 0x9e, 0x9e, 0x51, 0x07, 0x6e, 0xc0, 0x53, + 0x17, 0x89, 0x79, 0xf0, 0x91, 0xb2, 0x54, 0x30, 0x1f, 0x97, 0x95, 0xfc, + 0x02, 0x2d, 0x0c, 0x06, 0xb0, 0x82, 0xad, 0x20, 0xc2, 0xdc, 0x78, 0xbc, + 0xbe, 0x5b, 0x88, 0xa0, 0xdd, 0x45, 0x49, 0x26, 0xec, 0xb4, 0xa5, 0x8b, + 0x7f, 0xdd, 0x40, 0xcf, 0x9e, 0xbe, 0x46, 0x4d, 0x36, 0xab, 0x0a, 0x34, + 0x1a, 0x2a, 0xd0, 0xd3, 0x83, 0x96, 0xff, 0x88, 0xa4, 0xd8, 0x48, 0x75, + 0x2f, 0xcb, 0x3c, 0xc3, 0xbb, 0xc7, 0x2f, 0xe9, 0xf9, 0xa3, 0xde, 0x9d, + 0xbb, 0x5e, 0x37, 0x29, 0xf6, 0x75, 0xcc, 0x85, 0xeb, 0xf9, 0x73, 0xf7, + 0xdc, 0x31, 0x8c, 0x56, 0x52, 0x4a, 0x44, 0xa4, 0x2a, 0x2a, 0x51, 0x49, + 0x77, 0x6d, 0x35, 0x0a, 0xf9, 0x44, 0xaa, 0x36, 0x05, 0xef, 0x1e, 0x6b, + 0xe5, 0x65, 0x6b, 0xaa, 0xc1, 0x41, 0x9c, 0x62, 0xd0, 0x70, 0x78, 0xff, + 0x88, 0xe8, 0x5f, 0x3c, 0x2e, 0x00, 0x6c, 0xe3, 0xdb, 0xc3, 0x54, 0x66, + 0xa9, 0xf4, 0xe2, 0x4c, 0x91, 0x11, 0xc8, 0x3c, 0x39, 0x9b, 0x31, 0x81, + 0xc7, 0x11, 0x22, 0x62, 0xb7, 0x26, 0xa0, 0x0c, 0x2e, 0x6c, 0xe7, 0x34, + 0x3b, 0x1f, 0x27, 0xb3, 0xe5, 0x4f, 0xc9, 0x71, 0xb2, 0x18, 0x99, 0x59, + 0x95, 0xc6, 0x35, 0x4c, 0x5d, 0xa3, 0x59, 0xd1, 0x8b, 0x71, 0xea, 0xe7, + 0x30, 0x3f, 0xe7, 0x8c, 0x1a, 0x59, 0xeb, 0xc5, 0x5d, 0xbd, 0xe6, 0x00, + 0x67, 0x02, 0xfb, 0xca, 0x8d, 0xdf, 0x71, 0xb6, 0xed, 0xc7, 0xd2, 0xf2, + 0x72, 0x1b, 0xd3, 0x63, 0x51, 0x1f, 0x04, 0xe9, 0xf9, 0xe2, 0x38, 0x13, + 0x48, 0x63, 0x19, 0x66, 0x2b, 0x48, 0xc8, 0x1b, 0x9d, 0x19, 0x5a, 0x57, + 0x44, 0x2d, 0x30, 0xb5, 0xce, 0x3b, 0xcc, 0xae, 0xc4, 0x5e, 0x4e, 0x96, + 0x62, 0x5c, 0x53, 0x1f, 0xbf, 0xbd, 0xc8, 0x9d, 0xcf, 0x81, 0xb3, 0x1e, + 0xb0, 0x22, 0xd5, 0xbe, 0x60, 0x65, 0xd9, 0xeb, 0x11, 0x74, 0x8c, 0x24, + 0x18, 0x67, 0x45, 0xd3, 0xf8, 0x3f, 0xc5, 0xdf, 0xac, 0x65, 0xd4, 0x0c, + 0x82, 0x63, 0xd6, 0x43, 0x94, 0xa0, 0x3b, 0xff, 0x03, 0x0f, 0xbb, 0xe4, + 0x4d, 0x3b, 0x41, 0x9f, 0xf4, 0x1a, 0xa9, 0xdb, 0x15, 0x5b, 0x9a, 0x92, + 0xcb, 0xd5, 0xb8, 0x33, 0x5e, 0xea, 0x28, 0x3d, 0x2d, 0x30, 0x20, 0xcd, + 0xb6, 0x23, 0x18, 0x0e, 0x10, 0x2a, 0xa9, 0xe1, 0xad, 0xbc, 0x96, 0xd1, + 0xf9, 0xf3, 0x95, 0x4f, 0x2a, 0x0b, 0x91, 0xff, 0xf0, 0x96, 0x14, 0x00, + 0xaa, 0xfb, 0x1a, 0x44, 0x21, 0x9b, 0xe8, 0x71, 0x31, 0x9e, 0xd6, 0x58, + 0x7f, 0x02, 0x36, 0x5e, 0x92, 0x8d, 0x93, 0x99, 0xac, 0xb6, 0x87, 0x39, + 0xda, 0x47, 0xef, 0x70, 0xd4, 0xf7, 0x8d, 0x2a, 0xbd, 0x08, 0x40, 0x4d, + 0xec, 0xeb, 0x4e, 0x1b, 0x85, 0x5d, 0x55, 0x64, 0x4c, 0xf3, 0x5e, 0x8f, + 0x68, 0x1e, 0x5e, 0x64, 0xc3, 0xb8, 0x92, 0x24, 0x41, 0x98, 0x78, 0x09, + 0x85, 0x87, 0x17, 0x2c, 0x88, 0x9e, 0x62, 0x86, 0x4f, 0x44, 0x71, 0x9c, + 0xa8, 0x73, 0xb3, 0x14, 0x1f, 0x3c, 0x96, 0x6b, 0xab, 0xad, 0x43, 0xdf, + 0x67, 0x34, 0x66, 0x30, 0x1d, 0x15, 0xd3, 0xe7, 0xd5, 0x8b, 0x00, 0xaa, + 0x11, 0x77, 0xea, 0x36, 0xc9, 0x49, 0x99, 0x93, 0x01, 0x6e, 0x00, 0x4a, + 0x93, 0x08, 0x2c, 0x44, 0x01, 0x91, 0xe0, 0x91, 0xdd, 0xab, 0x70, 0x4b, + 0xe7, 0xbf, 0x2d, 0x0f, 0xd4, 0x52, 0xa0, 0xf1, 0x5d, 0xa0, 0xcc, 0xb9, + 0x1b, 0xa2, 0x62, 0xeb, 0x23, 0x1e, 0x8e, 0xbb, 0x2b, 0xb6, 0xc5, 0x3a, + 0xdf, 0x32, 0x99, 0xde, 0x2e, 0x94, 0xcf, 0x98, 0x99, 0x34, 0x59, 0x60, + 0xcf, 0x57, 0xe0, 0xb0, 0xd9, 0x89, 0xaa, 0xc2, 0x4f, 0x1e, 0x38, 0x88, + 0xca, 0x32, 0x93, 0x9b, 0xa3, 0x2b, 0x17, 0x0b, 0x40, 0x5e, 0x69, 0xbd, + 0x14, 0x15, 0xca, 0x1a, 0x21, 0xdf, 0xa8, 0x4e, 0x14, 0x5e, 0x18, 0x40, + 0xe3, 0x4e, 0x04, 0x1f, 0xe5, 0x81, 0x53, 0x11, 0xae, 0x5e, 0x30, 0xe5, + 0xda, 0xd7, 0xf1, 0x3b, 0x72, 0x1b, 0xa5, 0xe3, 0x13, 0xad, 0x40, 0x54, + 0xae, 0xf0, 0xbc, 0x2b, 0xc1, 0x1a, 0x9c, 0xdd, 0xe1, 0xd0, 0x12, 0x10, + 0xfd, 0x59, 0xce, 0x36, 0x60, 0x86, 0xa0, 0xa7, 0xee, 0xe1, 0x02, 0xe6, + 0xf8, 0xf0, 0x5c, 0x4f, 0xa3, 0xa4, 0xe4, 0x09, 0xb9, 0xc3, 0x84, 0xe3, + 0x8d, 0x97, 0x21, 0x62, 0xf3, 0x11, 0x47, 0xb1, 0x4a, 0xce, 0x5b, 0x89, + 0xde, 0x86, 0xb5, 0x0e, 0xba, 0xbc, 0x8c, 0xcf, 0x54, 0x38, 0x3a, 0xc6, + 0xaf, 0x8c, 0x4d, 0x9d, 0xff, 0x58, 0x9b, 0xe8, 0x32, 0xb7, 0xa2, 0x29, + 0xad, 0x91, 0x3a, 0xa5, 0xc7, 0x54, 0xff, 0xd8, 0x47, 0x4f, 0x8f, 0x38, + 0x91, 0x12, 0x76, 0xa3, 0x2e, 0xf7, 0xdd, 0xba, 0xa7, 0xd4, 0x49, 0xe5, + 0xd1, 0x74, 0xe9, 0x2a, 0x29, 0xe4, 0x64, 0xb9, 0x58, 0x98, 0x0c, 0xe5, + 0x1f, 0xb2, 0x0e, 0x33, 0xea, 0xf8, 0x2e, 0xb1, 0x22, 0x46, 0xc2, 0x67, + 0x2d, 0xfe, 0x2e, 0xd3, 0xcf, 0xbc, 0x64, 0x7b, 0x75, 0x24, 0x53, 0x1c, + 0x42, 0x8c, 0x0b, 0x99, 0x9e, 0xa7, 0xa6, 0xb9, 0xfb, 0x5d, 0x86, 0x9f, + 0xe9, 0x04, 0x62, 0xb2, 0x42, 0x81, 0xa2, 0x0d, 0x60, 0x83, 0x40, 0xbb, + 0x21, 0x10, 0xdf, 0xaa, 0xe6, 0x6c, 0x72, 0xc5, 0xb1, 0xad, 0x9f, 0xd2, + 0x91, 0xf8, 0xb6, 0x56, 0xfb, 0x2e, 0xb3, 0xc4, 0x12, 0xd9, 0x86, 0x29, + 0x6c, 0x55, 0x88, 0x72, 0xba, 0xfb, 0x9b, 0xb9, 0x6f, 0x2d, 0x7d, 0x75, + 0xd0, 0x9d, 0xaf, 0x44, 0xb6, 0xbd, 0x7b, 0xec, 0x78, 0xf1, 0xbf, 0x66, + 0xe8, 0x79, 0x66, 0x16, 0x5e, 0xf9, 0x68, 0x89, 0x5b, 0xde, 0x8f, 0xf9, + 0xeb, 0x04, 0x0b, 0x6a, 0x71, 0xa1, 0x3b, 0x46, 0x03, 0xb4, 0x29, 0xa9, + 0x31, 0xf4, 0xc5, 0xd3, 0x43, 0x6d, 0x88, 0x43, 0xa8, 0xef, 0xb7, 0xd7, + 0x75, 0x6b, 0x83, 0x35, 0xb6, 0x2f, 0xe0, 0x5f, 0xf2, 0x14, 0xcd, 0xd0, + 0x06, 0xb3, 0x5e, 0x8b, 0xdb, 0x86, 0x11, 0x94, 0x2f, 0xfb, 0x92, 0x19, + 0x52, 0x7f, 0xcb, 0xe5, 0x22, 0x27, 0x5f, 0xe4, 0x68, 0xb2, 0xcb, 0xc7, + 0xb8, 0xec, 0xfd, 0x9e, 0x39, 0x9c, 0x5b, 0xe4, 0xae, 0xca, 0x83, 0x19, + 0xcf, 0xf0, 0x01, 0xe3, 0xfc, 0xb0, 0x28, 0xda, 0x79, 0x84, 0xfb, 0xfe, + 0xa5, 0xb6, 0xb3, 0xd2, 0x73, 0xd3, 0x11, 0xe5, 0xdf, 0x7a, 0xd7, 0x82, + 0x78, 0x25, 0x06, 0x5b, 0x0f, 0x89, 0x9d, 0x0b, 0x9b, 0xd1, 0x1b, 0xc5, + 0xb7, 0x67, 0xef, 0x7c, 0xa2, 0xa3, 0xca, 0x27, 0xd0, 0x59, 0xb9, 0x99, + 0x86, 0xa9, 0xf6, 0x9a, 0x28, 0xf0, 0xbb, 0x42, 0xd2, 0xa0, 0xa8, 0x01, + 0x29, 0xa1, 0x0c, 0x1b, 0x33, 0x1b, 0x9c, 0xcb, 0xe4, 0x6c, 0x61, 0x0a, + 0xc4, 0xd7, 0x6c, 0xec, 0x86, 0xb3, 0xd2, 0xaa, 0x8c, 0xab, 0x1a, 0xf4, + 0x03, 0x2e, 0x2b, 0x42, 0xbe, 0xc1, 0x31, 0x1d, 0x57, 0x47, 0xdc, 0x7b, + 0xb5, 0x8f, 0x8b, 0xdf, 0x06, 0xad, 0x3f, 0xf4, 0x4f, 0xb5, 0x52, 0x07, + 0x4e, 0x25, 0xb3, 0x73, 0x34, 0x92, 0x6a, 0x89, 0x93, 0x28, 0x8b, 0x96, + 0x9d, 0xdb, 0xb4, 0x77, 0x81, 0x76, 0x86, 0xd2, 0xa5, 0x94, 0x76, 0x35, + 0xc9, 0x66, 0x4e, 0xd8, 0xc5, 0xc3, 0xc9, 0x34, 0xaf, 0xad, 0x4a, 0x7c, + 0x92, 0x24, 0xb1, 0x7d, 0x7d, 0xac, 0xf6, 0xcb, 0x8f, 0x36, 0xc1, 0xb2, + 0x63, 0x78, 0x99, 0x33, 0x23, 0x68, 0x6e, 0x71, 0x6a, 0xcc, 0x05, 0xf9, + 0x41, 0x92, 0x30, 0xf0, 0xb1, 0xb4, 0xa6, 0x46, 0x86, 0x62, 0xd9, 0xd9, + 0x94, 0x8a, 0xb2, 0x9c, 0x68, 0xff, 0xf4, 0x3a, 0x2e, 0xaf, 0xee, 0xcf, + 0x04, 0x94, 0x53, 0x35, 0x25, 0xf9, 0xaa, 0x74, 0x93, 0xf3, 0x63, 0xc0, + 0xd2, 0x22, 0x30, 0x8c, 0xde, 0xa6, 0xb1, 0xb4, 0xa1, 0x56, 0x07, 0x06, + 0x71, 0xa2, 0x9e, 0x42, 0x31, 0xa3, 0x1e, 0xa6, 0x9a, 0xbc, 0x9f, 0x5b, + 0x12, 0x3c, 0xc2, 0x74, 0xf9, 0x61, 0x71, 0xef, 0x73, 0x86, 0xc2, 0x3b, + 0x25, 0x8a, 0x31, 0x72, 0x27, 0xac, 0xa4, 0x72, 0xf3, 0xbb, 0x78, 0x2c, + 0x94, 0xed, 0xa8, 0x3a, 0x42, 0x98, 0x34, 0xda, 0x3e, 0x60, 0x1c, 0x4a, + 0xec, 0x6b, 0x4e, 0x5f, 0x2a, 0x62, 0xb9, 0xad, 0xc9, 0xd9, 0x38, 0x90, + 0xa7, 0x3b, 0xd3, 0x1a, 0xbb, 0x81, 0x0d, 0x33, 0xd9, 0x16, 0x35, 0x8e, + 0xc3, 0x88, 0x36, 0xfa, 0x3e, 0xa8, 0x4f, 0x30, 0x9d, 0xf1, 0x08, 0xea, + 0x40, 0x1b, 0x87, 0x4d, 0x23, 0x8e, 0x8e, 0xb0, 0xe2, 0xf0, 0x27, 0xc1, + 0xdc, 0x0d, 0xe2, 0x8f, 0x93, 0xef, 0x8b, 0xd1, 0x19, 0xa5, 0xbe, 0xd7, + 0x5a, 0x8a, 0x38, 0x62, 0x43, 0xba, 0x74, 0xf8, 0xae, 0x11, 0x1f, 0x1d, + 0xa4, 0x6e, 0x70, 0x94, 0x91, 0x14, 0xf4, 0xff, 0xbe, 0x39, 0xb4, 0x33, + 0xc2, 0x87, 0x74, 0x1b, 0xfd, 0x9a, 0xa8, 0x64, 0x09, 0x4b, 0x7f, 0x95, + 0x0a, 0xcb, 0x6b, 0x15, 0x54, 0x1d, 0xc6, 0x03, 0x1d, 0x1b, 0x25, 0x56, + 0x15, 0xb5, 0xd7, 0xe5, 0xd6, 0xf3, 0x28, 0xa4, 0xde, 0x1b, 0x39, 0x0d, + 0x59, 0x26, 0x12, 0xe4, 0x32, 0xf2, 0x25, 0xeb, 0xc0, 0xdb, 0x58, 0xe5, + 0xce, 0x64, 0x6f, 0x70, 0x74, 0xc1, 0xc9, 0xbd, 0x75, 0xef, 0x16, 0x02, + 0xdf, 0x27, 0x09, 0xc8, 0xb8, 0x37, 0x8f, 0x44, 0x0d, 0x58, 0x48, 0xf5, + 0xc2, 0x53, 0x21, 0x28, 0x16, 0xa4, 0x56, 0x02, 0xdf, 0xa7, 0x97, 0xa4, + 0x5c, 0x48, 0x75, 0x51, 0x89, 0x0b, 0xa7, 0x4d, 0xd9, 0x9e, 0x04, 0x4e, + 0x5d, 0x6c, 0xe5, 0x1f, 0x68, 0x88, 0xcc, 0xb7, 0x9a, 0x20, 0x05, 0x83, + 0x82, 0x6c, 0xfd, 0xdb, 0x07, 0x6c, 0xec, 0x61, 0xaa, 0x36, 0x57, 0x68, + 0x01, 0xf2, 0x70, 0xfe, 0xe6, 0x4d, 0xe1, 0xa9, 0xb6, 0xb6, 0x52, 0xe6, + 0x20, 0x52, 0x0f, 0x27, 0x9a, 0x1c, 0x2d, 0x20, 0x9b, 0xd4, 0x07, 0xd3, + 0xf6, 0x85, 0x4b, 0xf2, 0x52, 0x4d, 0x4c, 0xd7, 0xf0, 0x32, 0x5d, 0x2e, + 0xef, 0xa2, 0xd0, 0xcd, 0x48, 0x89, 0xbc, 0x9f, 0xcb, 0x37, 0x02, 0x29, + 0xa5, 0xdb, 0xab, 0xfa, 0x1d, 0xf4, 0x53, 0x78, 0x30, 0xde, 0x2c, 0x5c, + 0x35, 0x7f, 0x3d, 0xe1, 0xe0, 0xce, 0xdb, 0x13, 0xca, 0x2a, 0xae, 0xdf, + 0x1c, 0xb1, 0xb6, 0xb9, 0x6a, 0x9f, 0x28, 0xb0, 0x54, 0x5a, 0x00, 0xdd, + 0x76, 0x14, 0xfb, 0x17, 0xc2, 0x2a, 0x45, 0xa2, 0x18, 0xbb, 0x8a, 0x3e, + 0xbe, 0x0e, 0xa5, 0x1b, 0x3c, 0x70, 0x56, 0x10, 0x98, 0xec, 0xc6, 0x3a, + 0x95, 0x2a, 0x96, 0x6a, 0x44, 0xef, 0xd9, 0x9c, 0x2a, 0x45, 0xb4, 0x15, + 0xf8, 0x2e, 0x03, 0x5d, 0x8c, 0x79, 0xfb, 0xb0, 0x53, 0x71, 0xcd, 0x0d, + 0xf4, 0xe2, 0xfc, 0x3b, 0x71, 0xee, 0x30, 0xf2, 0x29, 0xd3, 0xaa, 0x18, + 0x7a, 0x45, 0x1d, 0x99, 0x6d, 0x2f, 0x1f, 0x2d, 0x32, 0x23, 0x48, 0xc2, + 0x69, 0x33, 0x3d, 0x04, 0xa7, 0xa3, 0x96, 0xb5, 0x76, 0x5b, 0x4e, 0xb7, + 0x3c, 0x10, 0x58, 0x17, 0xf4, 0x5f, 0xec, 0x51, 0x6d, 0x5a, 0x3b, 0x7f, + 0x1e, 0x0e, 0xbb, 0xbf, 0x77, 0x43, 0xf7, 0xa4, 0x57, 0xc0, 0x33, 0xac, + 0xc1, 0xe3, 0x3e, 0x1f, 0x65, 0x3c, 0x62, 0x19, 0x46, 0x2d, 0x7b, 0x2d, + 0x07, 0x44, 0x48, 0xf4, 0x91, 0xdf, 0x59, 0x32, 0x10, 0xf7, 0x12, 0xe2, + 0xe5, 0x39, 0x70, 0x37, 0xa4, 0x79, 0x9a, 0x17, 0x19, 0xe8, 0x90, 0xe7, + 0x37, 0x0d, 0xb6, 0x6d, 0x58, 0xe6, 0x7e, 0x57, 0x76, 0x8a, 0xe8, 0xd0, + 0x76, 0x30, 0x25, 0xda, 0xb6, 0xdf, 0x59, 0x3c, 0x6c, 0x20, 0x65, 0x88, + 0xd2, 0x60, 0x5e, 0x39, 0xb6, 0x6b, 0xac, 0xa2, 0x25, 0xc6, 0xa7, 0xb1, + 0x2f, 0xbb, 0x1d, 0x23, 0xee, 0x02, 0x08, 0x1d, 0xd6, 0x6c, 0x0e, 0xbc, + 0xea, 0xd2, 0xc2, 0x70, 0x34, 0xe9, 0x96, 0xd3, 0xf3, 0xf4, 0x8e, 0x94, + 0x6f, 0x86, 0x76, 0xe7, 0x38, 0x08, 0x6f, 0x47, 0xf5, 0xcd, 0xab, 0xad, + 0x7a, 0x39, 0x10, 0x9a, 0xa8, 0x44, 0xba, 0x2d, 0x7f, 0x05, 0x1e, 0xb7, + 0x44, 0xd8, 0x10, 0x05, 0xd1, 0x8d, 0x98, 0x09, 0x14, 0xbb, 0x6b, 0x2b, + 0xf7, 0xeb, 0x9f, 0xa5, 0x65, 0x4b, 0x21, 0xff, 0xaf, 0xe8, 0x2e, 0x34, + 0x52, 0x38, 0xcf, 0xd5, 0x51, 0x29, 0x2c, 0x91, 0x43, 0x3a, 0x49, 0x42, + 0xdd, 0xfb, 0x0e, 0xd2, 0x77, 0x8f, 0x65, 0x93, 0x3e, 0x52, 0x22, 0x58, + 0xd6, 0xf9, 0xd9, 0x58, 0xd4, 0x06, 0xa9, 0x0c, 0x79, 0x9f, 0x1b, 0xa5, + 0x45, 0x61, 0xd8, 0x4e, 0xbf, 0x4b, 0x51, 0xe2, 0xfb, 0x6f, 0x58, 0xee, + 0xc5, 0xa5, 0x11, 0xbd, 0x99, 0x25, 0x14, 0xac, 0x94, 0x0e, 0xd1, 0xf7, + 0x54, 0xb6, 0x05, 0x8c, 0xc3, 0x57, 0xa5, 0x3c, 0x3c, 0xa6, 0x83, 0x47, + 0x38, 0xd1, 0x6a, 0xab, 0x12, 0xc0, 0xd3, 0x7f, 0x96, 0x55, 0xd7, 0xf4, + 0x3a, 0xd0, 0x08, 0x85, 0x5f, 0x3d, 0x65, 0x8e, 0xbb, 0xea, 0x34, 0xf3, + 0x53, 0x96, 0x71, 0x08, 0x9b, 0x50, 0xe9, 0x4b, 0xce, 0x8a, 0x2f, 0xef, + 0xe4, 0xb2, 0x72, 0x68, 0xcb, 0x88, 0xa8, 0xd9, 0xd9, 0xa2, 0xfc, 0x62, + 0xe8, 0x8b, 0x23, 0x2b, 0xbc, 0xf0, 0x9e, 0xb4, 0xd0, 0x40, 0x8b, 0x45, + 0xff, 0x6d, 0x37, 0x01, 0xa6, 0x4b, 0x62, 0xe0, 0x3b, 0x4e, 0x18, 0x67, + 0xb3, 0x97, 0x04, 0xa0, 0x2a, 0xf2, 0x11, 0x79, 0x38, 0xb4, 0xb2, 0xed, + 0x64, 0xc1, 0x1e, 0xfe, 0xc4, 0xf4, 0xe2, 0x4d, 0x94, 0xb4, 0x17, 0x52, + 0x1a, 0x63, 0xe6, 0x56, 0x8a, 0x41, 0x0a, 0x5b, 0xa2, 0x1c, 0x59, 0xef, + 0x17, 0x64, 0xf9, 0xf7, 0x2c, 0xa4, 0xfd, 0x66, 0xf7, 0xe3, 0xae, 0xa0, + 0x54, 0x36, 0x64, 0x26, 0x84, 0x51, 0x49, 0xd5, 0x3a, 0x5e, 0x2c, 0xc5, + 0xca, 0xde, 0x8e, 0xe7, 0x25, 0x59, 0xb3, 0x9a, 0xb2, 0xf0, 0xff, 0xf1, + 0x83, 0xe5, 0x70, 0xc3, 0xef, 0x63, 0x66, 0x31, 0x04, 0x4d, 0x42, 0xf1, + 0xd9, 0x4c, 0x5e, 0x29, 0x92, 0x37, 0x8d, 0xd1, 0x18, 0x2a, 0x9e, 0x3c, + 0xcc, 0x05, 0xb9, 0xc4, 0xb6, 0xe7, 0x2a, 0x09, 0x3a, 0x68, 0xb5, 0x61, + 0x60, 0x36, 0x11, 0x02, 0x92, 0xf8, 0xa0, 0x56, 0x9b, 0xe8, 0xfe, 0xac, + 0x87, 0xcc, 0xaf, 0xb9, 0x62, 0xa7, 0x1e, 0x99, 0xb8, 0x9f, 0x47, 0xf7, + 0xa5, 0x12, 0x47, 0x66, 0xeb, 0xd6, 0x3a, 0x6f, 0xb3, 0x26, 0x63, 0xe2, + 0xec, 0x0c, 0xba, 0x7d, 0xc2, 0x9b, 0xb2, 0x10, 0x62, 0x03, 0x3f, 0x20, + 0xed, 0x7a, 0xce, 0x47, 0xd0, 0x50, 0x5b, 0x5c, 0x66, 0xbf, 0x01, 0x09, + 0x84, 0x0b, 0x71, 0xa8, 0x1f, 0x8d, 0xe1, 0x05, 0x09, 0xb4, 0xd5, 0x34, + 0xf1, 0xba, 0x31, 0xc6, 0x76, 0x8e, 0x00, 0x96, 0x3d, 0x6b, 0xe4, 0x66, + 0x3a, 0x22, 0xcd, 0x7f, 0x9d, 0xf8, 0x64, 0xfc, 0x76, 0x42, 0x88, 0x0e, + 0x32, 0xa5, 0xd0, 0x69, 0x56, 0xe2, 0xa5, 0x6f, 0xbb, 0xfa, 0xd8, 0xde, + 0xb4, 0x23, 0xa9, 0xc7, 0x9a, 0xc1, 0x99, 0xa7, 0x7f, 0x79, 0x58, 0xe1, + 0xe7, 0xc5, 0x56, 0x36, 0xc0, 0xfb, 0x8d, 0x8f, 0xe4, 0x6c, 0x96, 0x89, + 0xcb, 0xb0, 0xb0, 0x6e, 0xee, 0x20, 0x46, 0xd3, 0x43, 0x83, 0xac, 0x39, + 0x7c, 0x25, 0xba, 0x69, 0x3a, 0x58, 0x8a, 0x48, 0x0a, 0xf7, 0xb7, 0xfc, + 0x58, 0x7b, 0x93, 0x8b, 0xcd, 0x81, 0x7e, 0x94, 0xe0, 0xdf, 0xb1, 0xca, + 0xf6, 0x60, 0x54, 0xa9, 0x6e, 0xc6, 0x7f, 0xac, 0xfb, 0x62, 0xfe, 0xd9, + 0xd5, 0xf4, 0x6c, 0x62, 0x65, 0xf6, 0x0b, 0x24, 0x49, 0x1d, 0x55, 0xd6, + 0x4c, 0x0b, 0x5a, 0xf1, 0x2e, 0x78, 0x7a, 0x4e, 0xc1, 0xd0, 0xdb, 0xfe, + 0xd2, 0x84, 0x60, 0x68, 0x51, 0x8e, 0x3f, 0xf1, 0xa8, 0x90, 0xbf, 0xda, + 0x86, 0xda, 0x41, 0xd8, 0x90, 0x7b, 0xc3, 0xc8, 0x9e, 0xa5, 0x77, 0x06, + 0x56, 0x02, 0x13, 0x59, 0xaa, 0x89, 0xf9, 0xd5, 0x3c, 0x1d, 0xe2, 0xa9, + 0xb1, 0xc8, 0x02, 0x5a, 0x1c, 0xae, 0x72, 0x66, 0xdf, 0xb4, 0x1a, 0xb7, + 0xd2, 0x4d, 0xda, 0x4f, 0xc9, 0xed, 0x88, 0x7d, 0x9b, 0xc4, 0x4a, 0x8c, + 0x5e, 0x77, 0xaf, 0xd6, 0xd3, 0xbb, 0x38, 0xd2, 0xfa, 0x85, 0xe4, 0xdd, + 0xe7, 0x6e, 0xcb, 0x0b, 0x34, 0x1e, 0xa8, 0xfd, 0xf4, 0xd2, 0xc3, 0xdd, + 0xe0, 0xa6, 0xb1, 0x78, 0x16, 0x85, 0x2b, 0x1b, 0x22, 0xa6, 0xd5, 0x93, + 0x4f, 0xa1, 0xd5, 0x10, 0x96, 0xab, 0x38, 0xa7, 0x3c, 0xf2, 0xbd, 0xd9, + 0x7c, 0x59, 0x71, 0x25, 0x6f, 0x7c, 0xce, 0x73, 0x8e, 0x4e, 0xfb, 0x5a, + 0x30, 0x24, 0x53, 0xc5, 0xa3, 0x20, 0x13, 0x03, 0xfc, 0x7a, 0xaf, 0x1f, + 0x71, 0x5d, 0x6b, 0xce, 0x2e, 0x92, 0x16, 0x4d, 0xab, 0x96, 0x10, 0xc0, + 0xf6, 0x3c, 0xfe, 0x51, 0x89, 0x4d, 0x39, 0x45, 0x2c, 0x92, 0x5a, 0x86, + 0x24, 0xce, 0xbc, 0x75, 0xc6, 0x7f, 0x0e, 0xc2, 0xd1, 0xe7, 0x6a, 0x75, + 0x30, 0x59, 0xfb, 0xbf, 0x6b, 0xcf, 0x60, 0x90, 0x07, 0x73, 0xb1, 0x47, + 0x6e, 0x5d, 0xcd, 0x44, 0xac, 0xee, 0x2a, 0xdb, 0x16, 0x5a, 0x1a, 0xaf, + 0xba, 0xf8, 0x64, 0xdd, 0xdd, 0xed, 0x46, 0x4b, 0x67, 0xf3, 0xf8, 0x2d, + 0x22, 0xe9, 0x25, 0x74, 0x4c, 0x70, 0xe0, 0x3d, 0xbc, 0x11, 0xd3, 0x56, + 0xec, 0x86, 0x39, 0x89, 0x4c, 0xf2, 0xbc, 0x39, 0xdc, 0xde, 0x5f, 0x3b, + 0x42, 0xcb, 0xf6, 0x0c, 0x49, 0x8c, 0x66, 0x76, 0x58, 0x28, 0xe8, 0x47, + 0x59, 0x40, 0x11, 0xef, 0xb5, 0x9d, 0x93, 0xe5, 0x39, 0x56, 0x62, 0x0d, + 0xd0, 0xdd, 0xbb, 0x51, 0xff, 0x87, 0xa3, 0xd1, 0x9e, 0x0e, 0x0c, 0xbd, + 0x8e, 0xfc, 0xa5, 0x44, 0xc7, 0x6d, 0x35, 0x1d, 0x69, 0x14, 0x5b, 0x0d, + 0x45, 0xff, 0x85, 0x2d, 0xd1, 0x14, 0xf4, 0x5e, 0x5b, 0x49, 0x85, 0xad, + 0x69, 0xf1, 0x34, 0x9e, 0x7a, 0xf3, 0xed, 0x2d, 0xf2, 0x5f, 0x70, 0x5a, + 0xc1, 0xca, 0x63, 0xb5, 0xec, 0x49, 0xfc, 0x88, 0xcb, 0x0f, 0x81, 0x1d, + 0xd4, 0x2f, 0x18, 0xf6, 0xfe, 0x71, 0x51, 0xe2, 0x25, 0x71, 0x48, 0xa4, + 0xb2, 0x9f, 0x4f, 0xc0, 0xa5, 0x24, 0x12, 0x5b, 0xf8, 0xf2, 0xcf, 0x6e, + 0x52, 0x52, 0x6a, 0xee, 0x7d, 0xa5, 0x9b, 0xdb, 0x9c, 0xc9, 0x35, 0x30, + 0x1a, 0xf0, 0x7d, 0xcc, 0x98, 0x73, 0x09, 0x16, 0x8c, 0x05, 0x8d, 0x70, + 0xa3, 0x15, 0xd6, 0x7a, 0xa0, 0x7c, 0xd5, 0xcc, 0xd3, 0x29, 0x32, 0x2e, + 0xa5, 0xde, 0xf6, 0xd3, 0xa4, 0x03, 0x59, 0x6c, 0x05, 0x2d, 0x0e, 0x8b, + 0xb7, 0x1f, 0xa0, 0x57, 0x5c, 0x76, 0xde, 0x81, 0xcb, 0x64, 0xb9, 0x73, + 0xc1, 0x3b, 0x26, 0xba, 0x16, 0xdb, 0xe6, 0x40, 0x23, 0xa4, 0xe9, 0x24, + 0x48, 0xb8, 0x73, 0x23, 0x67, 0xbf, 0x26, 0xca, 0x95, 0x4f, 0xa0, 0x60, + 0x95, 0xa2, 0x0f, 0x29, 0xed, 0x5d, 0x71, 0x66, 0x94, 0xa3, 0xd0, 0x2a, + 0x4e, 0x17, 0x32, 0x18, 0xe6, 0xd6, 0x75, 0x84, 0xa5, 0x2a, 0x72, 0x18, + 0x60, 0x85, 0xde, 0x66, 0x22, 0x52, 0xf6, 0x45, 0xd6, 0xf0, 0xed, 0x93, + 0x0f, 0x5a, 0xa9, 0x12, 0x2a, 0xc4, 0xa8, 0x3d, 0x97, 0xc9, 0xc7, 0x84, + 0x71, 0x14, 0xb3, 0x54, 0xb6, 0xf7, 0x92, 0x7a, 0xc0, 0x6e, 0x02, 0xf7, + 0x48, 0xdb, 0x7c, 0xc1, 0x45, 0x21, 0xdb, 0x1b, 0x51, 0xc3, 0xea, 0xc0, + 0x19, 0x31, 0xe4, 0x6c, 0x20, 0x5f, 0x08, 0xe7, 0x88, 0xf7, 0xc0, 0x6e, + 0xee, 0x5f, 0x20, 0x33, 0x68, 0xef, 0xc5, 0x33, 0x1b, 0x40, 0x66, 0xc5, + 0xa3, 0x68, 0xdb, 0xbc, 0x8a, 0xb7, 0x54, 0xdb, 0xc7, 0xc5, 0x2c, 0x42, + 0x65, 0x51, 0xab, 0x56, 0x94, 0x73, 0xec, 0xd9, 0x95, 0xfa, 0x6a, 0x56, + 0xef, 0x22, 0x95, 0xa4, 0x75, 0x46, 0xee, 0x60, 0x8b, 0x25, 0xa6, 0x92, + 0x0a, 0x8e, 0xc1, 0x39, 0x97, 0x69, 0xa9, 0x19, 0x97, 0xf1, 0x0f, 0x61, + 0xc2, 0x40, 0x7d, 0x62, 0xe9, 0x5e, 0x22, 0x1f, 0x27, 0xe5, 0xc7, 0xe7, + 0xa4, 0x35, 0x5d, 0x90, 0xc7, 0x38, 0x38, 0x2d, 0xb0, 0x1e, 0x29, 0x0f, + 0x4f, 0x08, 0x8b, 0xdd, 0x69, 0x3c, 0x5c, 0x03, 0xbe, 0x9a, 0x76, 0xba, + 0x91, 0xf5, 0x57, 0x07, 0x39, 0xfe, 0x09, 0xfc, 0x01, 0x7b, 0x37, 0xc4, + 0x73, 0x7f, 0x76, 0x50, 0x76, 0xae, 0x6e, 0x4b, 0x22, 0x2c, 0x3b, 0xe7, + 0x77, 0x19, 0x9a, 0x92, 0x26, 0xdf, 0xc4, 0xe6, 0xd8, 0x57, 0xc1, 0x7f, + 0x65, 0x0b, 0xfb, 0xfa, 0xdd, 0xd2, 0x8c, 0xc7, 0xb1, 0x72, 0x2a, 0xb2, + 0x5a, 0xfa, 0xb2, 0x84, 0xb1, 0xec, 0x79, 0x9e, 0xde, 0xd8, 0x2f, 0xdf, + 0x3b, 0x39, 0x0b, 0xac, 0xfa, 0xb8, 0x07, 0x38, 0xff, 0x2e, 0x22, 0x2b, + 0xc9, 0x31, 0x3b, 0x09, 0x05, 0xd2, 0x06, 0xc4, 0x2d, 0x22, 0x1c, 0x21, + 0x70, 0x03, 0x93, 0xd1, 0x3a, 0x8d, 0x94, 0x60, 0xfe, 0x99, 0x13, 0xc3, + 0x00, 0x03, 0x41, 0xfa, 0x50, 0x79, 0x31, 0xeb, 0xf0, 0xf4, 0x06, 0x7a, + 0x19, 0xe8, 0x90, 0xdf, 0x61, 0x4d, 0x5f, 0xe3, 0x99, 0x1b, 0xca, 0xbf, + 0xcf, 0xae, 0xca, 0xfa, 0x84, 0x63, 0x88, 0x56, 0x1d, 0x52, 0x5a, 0x21, + 0xf9, 0xcd, 0xa3, 0x30, 0x16, 0xb9, 0x0d, 0xe1, 0x87, 0x08, 0x78, 0xa2, + 0xdb, 0x7e, 0x16, 0x82, 0x48, 0x48, 0x17, 0x1a, 0xa8, 0x3f, 0xc7, 0x4d, + 0xfd, 0x99, 0x2b, 0x36, 0xbf, 0x08, 0xb9, 0xeb, 0xa6, 0xbf, 0xb6, 0xa0, + 0x9e, 0x26, 0x15, 0xac, 0xd2, 0x65, 0xc9, 0x36, 0x41, 0xe3, 0x59, 0x4e, + 0xdc, 0x7b, 0x58, 0x3b, 0x47, 0x0b, 0xc9, 0xf3, 0xb3, 0xf9, 0x81, 0x33, + 0x39, 0xca, 0xf8, 0x97, 0x2d, 0x9b, 0x24, 0x33, 0x69, 0xbe, 0x1b, 0x81, + 0x59, 0x59, 0x17, 0xed, 0x7d, 0x5b, 0xbe, 0xda, 0xeb, 0x4e, 0x5d, 0x5d, + 0x70, 0x13, 0x3c, 0x4b, 0x4a, 0xfc, 0xa4, 0xbe, 0xa0, 0x5d, 0xa2, 0xed, + 0xe8, 0x8d, 0xf8, 0xf2, 0xa5, 0xdd, 0xd4, 0x49, 0x45, 0x04, 0xef, 0x18, + 0x9f, 0xa1, 0xf7, 0xc4, 0x3b, 0xc2, 0x6b, 0xe0, 0x45, 0xa8, 0x76, 0x39, + 0x49, 0x32, 0xec, 0xc3, 0xcb, 0x45, 0x46, 0xd2, 0x4b, 0x3a, 0x55, 0xe5, + 0xce, 0x08, 0xc4, 0x84, 0xe5, 0xd9, 0xb3, 0xf3, 0xc4, 0xa8, 0xe9, 0x88, + 0x83, 0xd5, 0x56, 0xe1, 0xa6, 0xef, 0x41, 0x55, 0xb0, 0x3f, 0xa3, 0xc1, + 0xbe, 0x3b, 0x83, 0xd6, 0x92, 0x90, 0x38, 0xd3, 0xf3, 0x75, 0xf6, 0x49, + 0x95, 0xee, 0xa9, 0xed, 0xaa, 0xf8, 0xb9, 0x14, 0x0e, 0x6a, 0x48, 0x9d, + 0xc5, 0x48, 0x3b, 0x5e, 0x61, 0xd3, 0x8c, 0x4a, 0x10, 0x12, 0x7c, 0x0a, + 0xf7, 0xaf, 0x62, 0x2d, 0xd3, 0x89, 0x8d, 0x75, 0x19, 0x6b, 0x62, 0x4b, + 0x1a, 0x04, 0xc7, 0xd3, 0x32, 0x17, 0x2f, 0x5f, 0x29, 0xfa, 0xb1, 0x8d, + 0x78, 0xe7, 0x27, 0xf6, 0x67, 0x7e, 0x17, 0xa3, 0x18, 0xdc, 0x13, 0x08, + 0x1e, 0x4b, 0xc7, 0x8e, 0xf6, 0xba, 0x90, 0xb3, 0x32, 0x42, 0x37, 0x6b, + 0x60, 0xa9, 0x23, 0xb5, 0x89, 0x57, 0x7b, 0xdb, 0x98, 0x35, 0x1f, 0x95, + 0x86, 0xa5, 0x83, 0x36, 0xd1, 0x8c, 0x8e, 0xc0, 0x77, 0x5c, 0x40, 0x8e, + 0xec, 0xdf, 0x25, 0x69, 0x0a, 0x83, 0x8f, 0xdf, 0x91, 0x52, 0x31, 0xab, + 0xd5, 0x61, 0x37, 0xbd, 0x83, 0x1d, 0x4c, 0x8b, 0xa1, 0x4a, 0x81, 0x8b, + 0xa0, 0xf4, 0x41, 0xbd, 0x54, 0x36, 0x36, 0x56, 0x6d, 0x4c, 0xe7, 0xd9, + 0xc7, 0x09, 0xd9, 0x4b, 0xf0, 0x54, 0x45, 0x3c, 0x62, 0x47, 0x17, 0x54, + 0x1f, 0x55, 0x2f, 0x74, 0xdc, 0x11, 0xe9, 0xa3, 0xb5, 0x75, 0xe9, 0x10, + 0xde, 0x62, 0xa9, 0x24, 0x39, 0xd4, 0x17, 0xbb, 0x15, 0xe4, 0x48, 0x09, + 0x26, 0x6a, 0xbd, 0x3b, 0x10, 0xa1, 0x55, 0xe5, 0x99, 0x53, 0x1e, 0xd2, + 0xee, 0x7c, 0x54, 0xd8, 0x06, 0x8b, 0x1e, 0xe7, 0x3f, 0x08, 0x38, 0x9b, + 0x2e, 0x41, 0xdf, 0x0b, 0x7e, 0x83, 0x7f, 0x04, 0x38, 0xa5, 0x1f, 0x46, + 0x8b, 0x94, 0x28, 0x9f, 0xb8, 0x8c, 0x41, 0xfe, 0x96, 0xe2, 0x24, 0xd1, + 0x97, 0xa4, 0xcb, 0xba, 0xfa, 0x19, 0xc9, 0x57, 0x30, 0x0f, 0x88, 0x58, + 0xa9, 0x67, 0x31, 0x74, 0x51, 0x34, 0x03, 0xbc, 0xff, 0x3b, 0x12, 0x61, + 0x84, 0x63, 0x74, 0xec, 0x4d, 0xda, 0xa3, 0x56, 0xc3, 0xe5, 0x5e, 0x4a, + 0x03, 0x26, 0x88, 0x1a, 0x1d, 0x7f, 0xe8, 0x3f, 0x61, 0x78, 0xb6, 0xc5, + 0x66, 0xb7, 0xb4, 0xc1, 0xe7, 0x82, 0xc1, 0x44, 0xdf, 0xf9, 0x30, 0x30, + 0xe1, 0xd0, 0xf8, 0xf5, 0x40, 0x5a, 0x72, 0x29, 0xef, 0x30, 0xe1, 0x01, + 0xca, 0x1b, 0xb0, 0xa6, 0xa3, 0x17, 0x2b, 0x58, 0x03, 0xda, 0x25, 0x0f, + 0xdc, 0x49, 0x7c, 0xc5, 0x8f, 0x2d, 0x83, 0xca, 0x43, 0x08, 0xc0, 0x36, + 0x70, 0x1e, 0x42, 0xfd, 0xac, 0x4d, 0x31, 0xcf, 0x68, 0x4a, 0xda, 0xd8, + 0xcb, 0xee, 0xaa, 0xfc, 0xcf, 0xcc, 0xe6, 0xb2, 0x77, 0x8b, 0x83, 0x5b, + 0xd5, 0x3d, 0x55, 0xba, 0x03, 0x45, 0xce, 0x51, 0x78, 0x36, 0xcb, 0xcd, + 0x9a, 0x0f, 0x58, 0xbe, 0x15, 0x10, 0xdb, 0x3f, 0x1d, 0x28, 0x27, 0x11, + 0x69, 0xca, 0x95, 0x68, 0xa8, 0xc8, 0xff, 0x0c, 0x3f, 0xd5, 0x11, 0x91, + 0x35, 0x45, 0x35, 0x9d, 0x1c, 0x58, 0xa2, 0xe5, 0xab, 0x83, 0x95, 0x10, + 0x44, 0xd4, 0xc0, 0x27, 0xf4, 0xc2, 0x72, 0x0f, 0x1a, 0x3d, 0x1c, 0xf2, + 0x7f, 0xb9, 0x54, 0xf2, 0x41, 0x24, 0xa8, 0x67, 0x30, 0xa0, 0x57, 0x67, + 0x00, 0xa8, 0x06, 0x60, 0xc3, 0x74, 0x6d, 0x54, 0x90, 0x5e, 0xad, 0x71, + 0x41, 0x50, 0xab, 0x9d, 0xba, 0x34, 0x1a, 0xfd, 0x19, 0x21, 0x0e, 0x87, + 0xb7, 0x22, 0xe6, 0xca, 0xb9, 0x0d, 0x3c, 0x4f, 0xad, 0x16, 0xf1, 0xa5, + 0x6d, 0xba, 0x6d, 0x7b, 0xbe, 0x7b, 0xe3, 0x95, 0xec, 0x1b, 0x8b, 0x6e, + 0xb0, 0xdc, 0x5c, 0xfd, 0x31, 0x73, 0x85, 0x02, 0x63, 0xc6, 0xcc, 0x04, + 0x29, 0xa5, 0xf4, 0x1f, 0xcb, 0x90, 0xf7, 0x83, 0x0d, 0x36, 0xbf, 0x31, + 0xc0, 0xfc, 0x26, 0x15, 0x87, 0xc8, 0x15, 0x88, 0xc9, 0x79, 0x11, 0x67, + 0x23, 0x53, 0xca, 0x03, 0x7a, 0x02, 0xe5, 0xfc, 0xb3, 0x38, 0xf3, 0x5d, + 0xfc, 0x91, 0x6f, 0x59, 0x26, 0xae, 0xd8, 0x45, 0xfa, 0xc4, 0x5b, 0xa2, + 0xfb, 0x2c, 0xc5, 0x36, 0xc6, 0x0d, 0x7b, 0x4e, 0xd2, 0x7f, 0x61, 0xc5, + 0xcc, 0x74, 0xd3, 0x41, 0xd4, 0x8a, 0xaf, 0xcb, 0x32, 0x50, 0xca, 0xeb, + 0x59, 0x0a, 0x05, 0x25, 0xe0, 0x5f, 0x30, 0x2b, 0x5d, 0x9b, 0xf7, 0xe8, + 0x14, 0x14, 0xb5, 0xfe, 0xd5, 0x2f, 0x94, 0x84, 0x5b, 0xc7, 0x4f, 0x82, + 0x01, 0x50, 0xbf, 0x54, 0xe2, 0x7d, 0xeb, 0x0c, 0x85, 0xc8, 0x99, 0x45, + 0x50, 0x8e, 0x4e, 0x10, 0x12, 0x01, 0x17, 0x41, 0xf3, 0x21, 0x4a, 0xee, + 0xaf, 0x0f, 0x76, 0x44, 0xe2, 0x8e, 0xf8, 0x36, 0x25, 0xab, 0x0d, 0x8f, + 0xb1, 0x0a, 0xbf, 0x63, 0x0e, 0xf2, 0x0c, 0x9d, 0x39, 0xa1, 0x98, 0x98, + 0x69, 0x91, 0xd1, 0x9b, 0xe8, 0xcf, 0x16, 0x65, 0x02, 0xc9, 0x67, 0x72, + 0x71, 0x7c, 0xfb, 0x41, 0x2d, 0xe4, 0xd3, 0xfb, 0x44, 0x8a, 0x7a, 0x88, + 0x32, 0x62, 0x26, 0x63, 0xfe, 0x5b, 0x0c, 0x4f, 0x6c, 0xad, 0x2f, 0x64, + 0x6f, 0xc9, 0xda, 0x95, 0x10, 0xbe, 0xd1, 0xfa, 0x8b, 0x67, 0x64, 0x35, + 0x2d, 0xed, 0xca, 0xf3, 0x12, 0xb7, 0x06, 0xc3, 0xa9, 0x8e, 0x3f, 0x09, + 0x4d, 0x1f, 0x50, 0x3a, 0x97, 0xb7, 0xa7, 0xce, 0x4d, 0x46, 0xf1, 0x61, + 0xc1, 0x06, 0x95, 0x0d, 0x07, 0xa2, 0xbc, 0xed, 0xeb, 0x45, 0xb4, 0x69, + 0x05, 0x7a, 0x30, 0x47, 0xa3, 0xbf, 0x81, 0xa9, 0xa7, 0xf0, 0x53, 0x36, + 0x31, 0x37, 0x13, 0xe5, 0x0e, 0xd6, 0xe6, 0xc7, 0x17, 0x17, 0x21, 0x6d, + 0x36, 0xd0, 0xf6, 0x2a, 0xea, 0x2d, 0x32, 0x0e, 0x90, 0x03, 0x30, 0x4d, + 0x30, 0x31, 0xaa, 0x79, 0x2d, 0xae, 0x2e, 0xb0, 0x13, 0xad, 0x63, 0x69, + 0x67, 0xd8, 0xf3, 0x6e, 0xa4, 0x34, 0xcf, 0x02, 0x10, 0xdd, 0x76, 0xfa, + 0xa7, 0xb0, 0x92, 0xea, 0x47, 0xbd, 0xff, 0xf9, 0xac, 0x8a, 0x1f, 0x31, + 0xf8, 0x05, 0xd4, 0xce, 0x23, 0xad, 0x32, 0x8c, 0x6c, 0x92, 0x85, 0xb9, + 0x74, 0xa6, 0xab, 0x6e, 0x76, 0xfd, 0x3e, 0x8a, 0xac, 0xa3, 0xd1, 0xb7, + 0x40, 0x53, 0x87, 0x28, 0xfc, 0xbc, 0x8a, 0x52, 0x8e, 0x2e, 0x59, 0x2c, + 0x5f, 0x3f, 0xcb, 0xd8, 0xbe, 0x37, 0xfd, 0xdc, 0xc0, 0x34, 0x85, 0x67, + 0x28, 0x9f, 0x1d, 0x05, 0x05, 0x94, 0xed, 0x6f, 0x54, 0x7a, 0x51, 0x9a, + 0xaa, 0xca, 0xe1, 0x41, 0x10, 0xf0, 0x9d, 0x38, 0x9c, 0x5e, 0x95, 0xe3, + 0x7e, 0x62, 0xe2, 0x31, 0x81, 0x28, 0x4a, 0x3c, 0x5e, 0x04, 0x11, 0xe2, + 0x6a, 0x45, 0x6f, 0x68, 0x96, 0x5b, 0xbf, 0x22, 0xd8, 0x29, 0x91, 0x76, + 0xe1, 0xb2, 0x5f, 0xfc, 0x89, 0x90, 0x87, 0xf8, 0xb8, 0x3f, 0xd5, 0x11, + 0xe7, 0x36, 0x47, 0x71, 0xb9, 0x52, 0x97, 0x8e, 0x62, 0x8b, 0x05, 0x31, + 0xe5, 0xd9, 0xa2, 0xc3, 0x1a, 0xb5, 0xda, 0xc7, 0xa5, 0x37, 0x06, 0x67, + 0x41, 0x1f, 0x6e, 0xa3, 0xc2, 0xb4, 0x96, 0x64, 0xfc, 0x46, 0x85, 0x95, + 0x4e, 0xd8, 0x2a, 0x4b, 0xaa, 0x1e, 0xec, 0xd5, 0xed, 0x81, 0x23, 0x68, + 0x0f, 0x5d, 0x0b, 0x95, 0x29, 0xd4, 0x36, 0x4d, 0x8c, 0x32, 0x73, 0x6a, + 0xb7, 0xad, 0xb8, 0x9c, 0xad, 0x76, 0x09, 0xad, 0xb9, 0xea, 0x2d, 0x17, + 0x3c, 0x33, 0x87, 0x7f, 0x62, 0x74, 0x77, 0xc9, 0xd6, 0x3d, 0x17, 0xbc, + 0xff, 0x57, 0x10, 0xec, 0x7a, 0xb7, 0x89, 0x05, 0x26, 0xf1, 0xb2, 0x53, + 0xa1, 0x91, 0xc5, 0x2a, 0xfb, 0x5a, 0xce, 0x5d, 0xd1, 0x6b, 0xbc, 0xb7, + 0x39, 0x09, 0x43, 0xdf, 0x20, 0xd3, 0xc1, 0x74, 0x8d, 0xf4, 0x0b, 0x2a, + 0xc7, 0xe8, 0xa1, 0x5f, 0xb2, 0xfe, 0x1a, 0x96, 0x3a, 0x92, 0xbc, 0x8f, + 0x85, 0xe2, 0x22, 0x73, 0x3f, 0x49, 0xb3, 0x6b, 0x90, 0xbd, 0xcb, 0x3f, + 0x36, 0x6c, 0x3d, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x56, 0xd1, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x1f, 0x05, 0x81, 0x3f, + 0x25, 0x68, 0xde, 0x72, 0x88, 0x26, 0x66, 0x2d, 0xe4, 0xc8, 0x81, 0xf8, + 0x5d, 0x98, 0xa2, 0xc2, 0x02, 0x62, 0x63, 0x47, 0xe6, 0x61, 0x7f, 0xee, + 0xca, 0x3f, 0x81, 0xd7, 0x1e, 0xa9, 0xbf, 0x66, 0x59, 0x7f, 0xc3, 0x35, + 0x03, 0xae, 0xe5, 0xf2, 0x4d, 0x81, 0x82, 0x78, 0x5e, 0xaf, 0xaa, 0xd1, + 0x27, 0x41, 0x19, 0x93, 0xa8, 0x9b, 0x78, 0x4e, 0x95, 0x89, 0x7f, 0xce, + 0x49, 0xd0, 0x45, 0xb5, 0x7f, 0x1d, 0xe9, 0xee, 0x7f, 0x91, 0xf4, 0x0a, + 0x67, 0x7d, 0x75, 0xff, 0x38, 0x81, 0x27, 0x90, 0x14, 0xa5, 0x99, 0x40, + 0x5b, 0xe6, 0x9a, 0x81, 0x75, 0x22, 0x5f, 0x18, 0x81, 0x34, 0xb7, 0x54, + 0x2e, 0x8d, 0x81, 0x36, 0x0e, 0x5e, 0xc0, 0x5f, 0xd4, 0xc6, 0x34, 0x81, + 0xc8, 0xb9, 0xe2, 0xa9, 0x77, 0x81, 0x44, 0xb4, 0x06, 0x24, 0x81, 0x74, + 0x1c, 0xeb, 0xfb, 0xdd, 0x25, 0x81, 0x14, 0x09, 0x2d, 0xba, 0x11, 0x4b, + 0x07, 0x13, 0xf1, 0xae, 0x81, 0xaf, 0xa3, 0x87, 0x00, 0x00, 0x00, 0x00, + 0xf6, 0xd1, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, + 0x8a, 0x29, 0x03, 0xe6, 0x24, 0x2a, 0xd6, 0x21, 0xb6, 0xb1, 0x2d, 0x3a, + 0xff, 0xd6, 0x27, 0xd7, 0x18, 0x42, 0xc1, 0xb4, 0xf8, 0xfd, 0xdf, 0x45, + 0x09, 0x91, 0xcb, 0xfe, 0xe9, 0xb5, 0x24, 0xf1, 0xc0, 0x69, 0xd0, 0x64, + 0xa8, 0xeb, 0x12, 0x71, 0xe3, 0xb4, 0xbe, 0xb4, 0x93, 0xbf, 0x8a, 0x8b, + 0xf3, 0x4d, 0x13, 0x3b, 0x6f, 0x6f, 0x32, 0x12, 0x98, 0x95, 0xb9, 0x63, + 0xcd, 0xa5, 0x23, 0xa4, 0xb8, 0x2e, 0x74, 0x75, 0xbc, 0xe4, 0xc7, 0x46, + 0x96, 0xd4, 0x47, 0xa0, 0x65, 0xec, 0xea, 0xcf, 0xd0, 0xdc, 0xe9, 0x8b, + 0xcc, 0x1d, 0x2f, 0x0d, 0x0a, 0x9c, 0x6e, 0x99, 0x97, 0x97, 0xcc, 0x00, + 0xd2, 0x8e, 0xbc, 0x3c, 0x9a, 0xf1, 0x32, 0x0e, 0xf3, 0xd6, 0x27, 0x1c, + 0xea, 0xab, 0xca, 0x4d, 0x69, 0x32, 0x30, 0x5f, 0x18, 0xd7, 0xb7, 0x4a, + 0xcb, 0x8e, 0xb2, 0x96, 0x39, 0xa3, 0xc7, 0x42, 0xca, 0x60, 0x9b, 0xad, + 0x8e, 0xb7, 0x54, 0x32, 0xea, 0xfd, 0x58, 0xfa, 0xf8, 0x02, 0xef, 0x2f, + 0xec, 0x3c, 0x2a, 0x1a, 0x6a, 0x08, 0xa4, 0x4b, 0xec, 0x30, 0x90, 0xaf, + 0x13, 0x98, 0xcd, 0x48, 0xfd, 0x5f, 0x56, 0x68, 0x17, 0x9e, 0x87, 0xb1, + 0x2b, 0x16, 0xd3, 0x3c, 0xe0, 0xe8, 0x0e, 0xa6, 0xc4, 0x24, 0xd3, 0x05, + 0x75, 0xda, 0x22, 0x44, 0xb5, 0x41, 0xd2, 0xa5, 0x99, 0xf1, 0x5e, 0xbe, + 0x15, 0xb7, 0x33, 0x54, 0x9a, 0x97, 0x5b, 0x35, 0x77, 0x2b, 0x18, 0x46, + 0x2f, 0x92, 0xc5, 0x97, 0x2d, 0x4c, 0xa6, 0xf8, 0x9e, 0xc3, 0xe0, 0x0a, + 0x52, 0xf9, 0x97, 0xc7, 0xd6, 0x36, 0xdd, 0x38, 0xaa, 0xf3, 0x05, 0x30, + 0xc3, 0xe5, 0xaf, 0x54, 0xdc, 0xc4, 0xf2, 0x01, 0x9e, 0xe6, 0xc1, 0x89, + 0xee, 0xd8, 0x5f, 0xfe, 0xf0, 0x70, 0x3c, 0xc4, 0x40, 0xa4, 0xd4, 0xee, + 0xaf, 0x3d, 0xe6, 0xcd, 0x31, 0x16, 0x31, 0x3b, 0xa0, 0x0e, 0xc4, 0x71, + 0xbf, 0xbd, 0x39, 0x89, 0x0f, 0x36, 0xba, 0xd8, 0xa2, 0x49, 0x01, 0xab, + 0xf4, 0x07, 0x99, 0xc7, 0xb1, 0x0c, 0x33, 0x9d, 0x71, 0xf1, 0x15, 0x4b, + 0x60, 0xe0, 0xed, 0x59, 0x0a, 0x34, 0xd9, 0xa2, 0x45, 0x99, 0x4a, 0x60, + 0xd3, 0xdc, 0x37, 0x56, 0x32, 0x4c, 0xea, 0xdc, 0xcf, 0xe6, 0x22, 0x27, + 0x17, 0xea, 0x75, 0x3f, 0x69, 0xd4, 0xcf, 0x53, 0x92, 0x98, 0xf4, 0xfe, + 0x13, 0xa8, 0xe2, 0xb2, 0x48, 0x5f, 0x64, 0xab, 0x2b, 0x61, 0x97, 0xf5, + 0xc5, 0xb6, 0xef, 0x32, 0x4e, 0x47, 0x26, 0x42, 0x48, 0x9c, 0x5b, 0x24, + 0xa3, 0xcb, 0x70, 0xc7, 0x31, 0x6c, 0xc8, 0x4d, 0x5c, 0x02, 0xca, 0x71, + 0x1e, 0x56, 0xdb, 0x27, 0x66, 0x5d, 0x4f, 0x0b, 0x09, 0x57, 0xbe, 0x72, + 0x17, 0x3b, 0xce, 0xdd, 0xd2, 0x20, 0x13, 0x67, 0x32, 0x04, 0xee, 0xc4, + 0x66, 0x23, 0x0e, 0x97, 0x5e, 0x21, 0x30, 0xb2, 0xe4, 0x16, 0x06, 0x57, + 0xc3, 0x9b, 0x29, 0x5b, 0x76, 0xd0, 0x36, 0xac, 0xe6, 0xa2, 0x91, 0x57, + 0x96, 0x4e, 0x1c, 0x6f, 0x4a, 0x03, 0x50, 0x55, 0x6d, 0xaf, 0x9a, 0x29, + 0xc9, 0x61, 0x6c, 0x18, 0x4c, 0xb9, 0xd5, 0x41, 0xf8, 0x75, 0x2b, 0xc3, + 0x0e, 0x69, 0x9f, 0x45, 0x93, 0x2f, 0xa6, 0xf9, 0x30, 0x65, 0x05, 0x13, + 0xe3, 0x00, 0x54, 0x0e, 0xa4, 0xb5, 0x89, 0x6d, 0x4d, 0x11, 0x3d, 0x2a, + 0x29, 0x99, 0xd9, 0xdf, 0x75, 0xce, 0x01, 0x21, 0xbc, 0x26, 0xb3, 0x22, + 0xf9, 0xb0, 0x45, 0x5c, 0xf8, 0xea, 0xb2, 0x08, 0x1a, 0xf7, 0xa0, 0x70, + 0x65, 0xa8, 0xab, 0xe1, 0x92, 0xcc, 0xcc, 0x1f, 0x0e, 0x36, 0x60, 0xb7, + 0xea, 0xcb, 0x3d, 0xf6, 0x98, 0xbf, 0xcd, 0x00, 0xc9, 0x16, 0x1e, 0xdb, + 0x58, 0x24, 0xb1, 0xd8, 0xaf, 0x01, 0x00, 0xfa, 0x15, 0xf4, 0x37, 0x05, + 0xd7, 0x17, 0x2a, 0xd2, 0xe8, 0xe4, 0x0c, 0x50, 0xfa, 0xe8, 0xd6, 0x99, + 0xa9, 0x58, 0x61, 0x38, 0xee, 0x22, 0x3c, 0x53, 0xcf, 0x64, 0x8e, 0xad, + 0x4d, 0xd6, 0xc3, 0xc3, 0xdd, 0xb0, 0xb3, 0xf7, 0xdd, 0x37, 0xfd, 0xf3, + 0x2b, 0x6a, 0xe2, 0xd4, 0xfc, 0x0c, 0x74, 0xca, 0x37, 0x2f, 0xd2, 0xf8, + 0x5b, 0xf1, 0x8c, 0x32, 0xa0, 0xdc, 0x2c, 0xa8, 0x36, 0x2f, 0xbe, 0x45, + 0x9b, 0x42, 0x95, 0x15, 0x5e, 0x08, 0xb1, 0x61, 0xec, 0xa2, 0xdf, 0x5f, + 0xca, 0xf8, 0x62, 0x73, 0xfd, 0x66, 0xc8, 0x51, 0x2a, 0x69, 0x3c, 0x8f, + 0x75, 0xa4, 0x6f, 0xbe, 0xc1, 0x5c, 0x66, 0xe2, 0x60, 0x92, 0xd7, 0x0e, + 0xee, 0x1b, 0xc7, 0x39, 0x8b, 0x56, 0x6c, 0xc6, 0x20, 0xfa, 0xec, 0x96, + 0xa5, 0x0f, 0x74, 0x42, 0x32, 0x12, 0x11, 0xdf, 0x02, 0xfe, 0x42, 0x1c, + 0xfe, 0xf1, 0x72, 0xaf, 0x47, 0x3b, 0x62, 0xe3, 0x27, 0x29, 0xf0, 0xec, + 0x39, 0xd2, 0xdd, 0xb6, 0xe9, 0xbe, 0x5f, 0x66, 0x67, 0x6c, 0xc9, 0xa1, + 0xf0, 0x25, 0x9a, 0x1b, 0xa8, 0xa0, 0x15, 0xcb, 0x61, 0x98, 0x98, 0xfd, + 0xef, 0xba, 0x74, 0x9b, 0x54, 0xf3, 0x6d, 0xe1, 0xa4, 0xcf, 0xb5, 0xe7, + 0xba, 0x0f, 0xd1, 0x41, 0xd8, 0x63, 0x94, 0x09, 0xcd, 0x4f, 0xb1, 0x31, + 0x49, 0x5e, 0x54, 0xb1, 0x28, 0x39, 0x8e, 0x13, 0x48, 0x2e, 0x20, 0xb0, + 0xf7, 0x18, 0x9a, 0xea, 0xf2, 0x9b, 0xde, 0x8f, 0x16, 0xc8, 0x9e, 0x31, + 0xca, 0x94, 0x28, 0x26, 0x0d, 0x8c, 0x0f, 0x09, 0x69, 0xc5, 0x2a, 0x38, + 0xae, 0x6b, 0xfb, 0x4f, 0xbb, 0xf4, 0x14, 0xea, 0x8d, 0x13, 0xc0, 0x09, + 0xe2, 0xfb, 0xfb, 0x09, 0xa1, 0xfc, 0x49, 0xff, 0x0f, 0x52, 0x3e, 0xe8, + 0xda, 0xfe, 0xe1, 0x67, 0x8f, 0x21, 0xcf, 0xaf, 0xb7, 0xe2, 0xcf, 0x09, + 0x15, 0x10, 0x51, 0x72, 0x8f, 0x42, 0x09, 0x9d, 0xea, 0x27, 0x2d, 0x25, + 0x9f, 0x54, 0x50, 0xfa, 0xdf, 0x9f, 0x41, 0xe8, 0xd2, 0x66, 0xd8, 0x28, + 0xfb, 0x8b, 0xe4, 0x42, 0x03, 0x92, 0xf9, 0xcd, 0xcc, 0xb0, 0xc0, 0x52, + 0x53, 0x6d, 0xcd, 0xed, 0x16, 0xad, 0x3c, 0x3d, 0xf9, 0x3b, 0x05, 0xbb, + 0xac, 0x9e, 0xa3, 0x4b, 0x17, 0xb4, 0xc7, 0xdd, 0xd4, 0xd3, 0x0c, 0x10, + 0x0d, 0xd8, 0x9c, 0xdb, 0xa4, 0x60, 0x06, 0x89, 0x4b, 0x06, 0x4c, 0x9f, + 0xc4, 0x47, 0xc8, 0xaf, 0xab, 0x02, 0x23, 0x89, 0x6e, 0xf2, 0x9d, 0x2b, + 0x6b, 0x9a, 0xa4, 0xee, 0x16, 0x0b, 0x3c, 0x76, 0xd4, 0xf0, 0x17, 0x90, + 0xca, 0xf5, 0xc8, 0xbf, 0xcb, 0xb1, 0x02, 0x69, 0x34, 0x71, 0x59, 0x5d, + 0x0e, 0x56, 0xd8, 0x41, 0x0a, 0xa5, 0x0a, 0x16, 0xbc, 0x93, 0x63, 0xf9, + 0xd9, 0xab, 0x3e, 0x75, 0x1e, 0xd3, 0xf3, 0x56, 0xf5, 0x14, 0xee, 0x65, + 0xf3, 0x2f, 0x72, 0x03, 0xcb, 0x69, 0x90, 0x91, 0x0d, 0x31, 0x8e, 0x3e, + 0xe9, 0xb0, 0xe6, 0x2e, 0x37, 0x5d, 0xb0, 0x38, 0x52, 0xe6, 0x23, 0x24, + 0x36, 0xb2, 0xe9, 0xa5, 0xa0, 0xae, 0xed, 0xfd, 0x95, 0xa5, 0xcf, 0x4a, + 0xe3, 0xbd, 0xe7, 0x29, 0xd0, 0x57, 0x3e, 0xf1, 0xdf, 0xc8, 0xc7, 0x26, + 0xf6, 0xc7, 0x4b, 0xc8, 0x6a, 0x4a, 0xed, 0x49, 0x60, 0x2d, 0x1c, 0xe3, + 0x8b, 0x10, 0x24, 0xfc, 0xef, 0xbb, 0x1e, 0x24, 0xbb, 0x40, 0xeb, 0x99, + 0xba, 0xe1, 0x4a, 0xd4, 0x1f, 0x69, 0x47, 0xa4, 0x8f, 0x48, 0x05, 0x17, + 0xcb, 0xee, 0x55, 0xca, 0xe5, 0xe3, 0x60, 0xec, 0xfa, 0xe6, 0xd1, 0x28, + 0xc5, 0xa8, 0x04, 0xd8, 0xce, 0x13, 0x2b, 0x99, 0x2b, 0xc7, 0x94, 0x9d, + 0xda, 0xd7, 0x6f, 0x31, 0xfe, 0xee, 0x6c, 0x9b, 0xf1, 0x70, 0xd2, 0xee, + 0xc4, 0xba, 0xb7, 0xbe, 0xd3, 0x37, 0xdc, 0x43, 0x4e, 0x30, 0x4a, 0x67, + 0xf2, 0x45, 0x29, 0xe1, 0x8b, 0xb8, 0x6d, 0xca, 0xec, 0xb9, 0xd6, 0xd3, + 0xdd, 0xcb, 0xde, 0xdb, 0xa9, 0x4d, 0xdd, 0x3d, 0x41, 0xae, 0x99, 0x89, + 0xce, 0x70, 0x50, 0x61, 0x07, 0xf3, 0xca, 0x24, 0x56, 0x76, 0x3f, 0xe0, + 0x6e, 0xbe, 0xa7, 0xc6, 0xac, 0x6c, 0xf1, 0x8c, 0xa2, 0x0e, 0xc4, 0x2a, + 0x48, 0x30, 0x8b, 0xc9, 0xc0, 0x5a, 0xb2, 0x2b, 0xbd, 0xa2, 0xcc, 0xf7, + 0x25, 0x16, 0xc3, 0xde, 0x1b, 0x8d, 0x23, 0x8c, 0xb6, 0xc4, 0xaa, 0x4a, + 0x0b, 0x66, 0x25, 0x35, 0xb3, 0x9a, 0x74, 0x27, 0x63, 0xea, 0xef, 0x92, + 0x12, 0x8c, 0x58, 0xd9, 0x3a, 0x55, 0xd6, 0x61, 0x29, 0x9f, 0xbc, 0x28, + 0xbd, 0x30, 0xcd, 0x43, 0xe6, 0x36, 0x36, 0x66, 0x20, 0x8c, 0x9e, 0x23, + 0xfe, 0x6d, 0xf0, 0xbc, 0x61, 0xcd, 0x58, 0xd8, 0xe0, 0x2e, 0xe4, 0xcf, + 0x61, 0xf7, 0xd5, 0x6b, 0x54, 0x33, 0xb3, 0x2c, 0x60, 0xa8, 0x59, 0x21, + 0x5d, 0xaa, 0x65, 0x9e, 0xdc, 0xa3, 0xc9, 0xc4, 0x9d, 0x4d, 0x95, 0x29, + 0xf6, 0x2b, 0xcd, 0xc9, 0xb9, 0x9d, 0x46, 0xa0, 0x89, 0xf4, 0x4e, 0x52, + 0x55, 0xe2, 0x13, 0x98, 0xf0, 0xef, 0x27, 0xc3, 0xc9, 0xd1, 0xe1, 0xee, + 0x07, 0x1b, 0x9d, 0x8a, 0x5b, 0x9d, 0x06, 0x26, 0x61, 0x2a, 0x55, 0x6f, + 0x54, 0x22, 0xd5, 0x06, 0x20, 0xed, 0x06, 0x4d, 0xa2, 0xb3, 0xaa, 0x4f, + 0x1f, 0x3e, 0xd2, 0x0d, 0x6a, 0xab, 0x6d, 0xee, 0x8f, 0x09, 0xb2, 0xd9, + 0x39, 0x46, 0x0f, 0xe7, 0x51, 0x70, 0x51, 0xdb, 0x09, 0xf8, 0x8e, 0xbb, + 0x06, 0x98, 0x49, 0x69, 0xb7, 0x9e, 0xa0, 0xbc, 0x16, 0x5f, 0x96, 0xad, + 0xe9, 0x76, 0x9f, 0x71, 0xe2, 0x1b, 0x91, 0x73, 0xd9, 0x74, 0x6a, 0x70, + 0x48, 0x71, 0x47, 0x3b, 0x0c, 0xd5, 0x96, 0xe3, 0x6e, 0xdb, 0xbb, 0x9c, + 0x44, 0x5c, 0xe5, 0x07, 0x73, 0x31, 0xd1, 0x55, 0x07, 0xff, 0x5f, 0xb1, + 0x55, 0x9d, 0x0d, 0xbf, 0x32, 0x53, 0xf9, 0xfe, 0xcd, 0xc8, 0xe0, 0x56, + 0x18, 0x8f, 0x4b, 0x51, 0xd1, 0x23, 0x2e, 0x9f, 0xb9, 0xee, 0xf3, 0xfd, + 0x26, 0x02, 0xf6, 0x54, 0xd5, 0x3e, 0x13, 0xc1, 0xc1, 0xe4, 0xa8, 0xb4, + 0x5f, 0x5c, 0xa0, 0x9f, 0xb5, 0x19, 0xbb, 0x4e, 0xd6, 0xf8, 0x18, 0x9b, + 0xeb, 0x9e, 0x58, 0x9d, 0x00, 0x51, 0x24, 0x28, 0x70, 0x55, 0xf7, 0xb9, + 0x5a, 0x59, 0x50, 0xc5, 0x72, 0xab, 0x6b, 0x13, 0x95, 0xfb, 0xe4, 0xc2, + 0x05, 0x96, 0xf3, 0x48, 0xef, 0x02, 0x67, 0xd5, 0x8f, 0x5b, 0x8e, 0xb6, + 0xbe, 0xc1, 0x3d, 0x8e, 0x22, 0xee, 0x49, 0xc7, 0xbe, 0xfb, 0x2d, 0x51, + 0x45, 0x44, 0xca, 0x94, 0x8e, 0xce, 0xb5, 0x9a, 0x29, 0xc7, 0x52, 0xde, + 0x2c, 0xdf, 0xcc, 0x43, 0xc7, 0xd7, 0x51, 0xb7, 0x07, 0xf0, 0x9b, 0x9d, + 0x33, 0x98, 0x62, 0xfa, 0xc9, 0x13, 0x0b, 0xcd, 0xdf, 0xbd, 0xff, 0x8e, + 0x13, 0x44, 0xda, 0x62, 0xc0, 0xd1, 0x8d, 0x57, 0x0e, 0xec, 0x53, 0x8a, + 0x04, 0xcf, 0x0f, 0x5a, 0xd7, 0x3c, 0x4b, 0x17, 0xda, 0x3b, 0xf0, 0x30, + 0xbf, 0xea, 0x40, 0xa6, 0x36, 0xed, 0xda, 0xf7, 0x40, 0x6b, 0xf1, 0x1e, + 0x61, 0xa0, 0x8b, 0x5d, 0xfa, 0xa8, 0x6a, 0xca, 0xfd, 0x6a, 0x06, 0xb4, + 0xf5, 0xb6, 0xc7, 0xbe, 0xdf, 0xac, 0x17, 0x00, 0x4a, 0x91, 0x8d, 0x97, + 0x5b, 0xc8, 0xcb, 0xd4, 0xc8, 0x20, 0x0b, 0x53, 0xee, 0x2b, 0x25, 0xb8, + 0xa1, 0x24, 0xa1, 0xa0, 0x17, 0x60, 0xd9, 0xf7, 0x2d, 0x00, 0x6c, 0x70, + 0x44, 0x0d, 0x60, 0xe7, 0x95, 0x1e, 0x8a, 0x1b, 0x29, 0xcf, 0xb5, 0xc1, + 0xbe, 0xd0, 0xe5, 0xeb, 0xd8, 0x71, 0x88, 0x34, 0xcb, 0xbd, 0x32, 0x52, + 0xa7, 0xcf, 0x6d, 0x9b, 0xef, 0xf2, 0xe4, 0x68, 0x6f, 0xfe, 0xb9, 0x17, + 0x31, 0xa0, 0x3e, 0xfc, 0xae, 0xf6, 0x54, 0xe3, 0x33, 0x24, 0xd1, 0xfc, + 0xb7, 0x37, 0x8f, 0xd3, 0x4f, 0xf2, 0x59, 0x53, 0xea, 0xaf, 0x71, 0xc5, + 0xb1, 0xdb, 0xf9, 0xed, 0xc0, 0x46, 0x56, 0xfc, 0x09, 0x90, 0xf7, 0x09, + 0x5a, 0x12, 0x71, 0xad, 0xa6, 0x0f, 0xba, 0x4c, 0x2f, 0xd7, 0x61, 0xcb, + 0xf2, 0xab, 0x44, 0x67, 0x43, 0xd0, 0x41, 0xd5, 0xba, 0xff, 0x26, 0x50, + 0x5b, 0x97, 0x91, 0xc4, 0x8f, 0x2a, 0x64, 0x3c, 0x06, 0x2e, 0x26, 0x8e, + 0x5f, 0xb1, 0xba, 0x74, 0x16, 0xeb, 0xee, 0x6e, 0xe1, 0x68, 0xcc, 0x09, + 0xed, 0xa5, 0x5d, 0xf7, 0xef, 0xd6, 0xfa, 0x9f, 0x39, 0xe1, 0x5c, 0x38, + 0xbd, 0x1b, 0xe6, 0x8a, 0xfa, 0xea, 0xbc, 0x14, 0x4c, 0x31, 0xa8, 0x9d, + 0x64, 0xa6, 0xec, 0xf0, 0xf8, 0xa2, 0x0a, 0x6c, 0xb9, 0xc5, 0x3d, 0x40, + 0x48, 0x41, 0x1d, 0xf2, 0xab, 0xd4, 0xdf, 0xfb, 0x55, 0x9e, 0xa5, 0xac, + 0xe9, 0xf0, 0x46, 0x96, 0xc5, 0x4d, 0x5f, 0x5f, 0x64, 0x00, 0x69, 0x48, + 0x0e, 0xa3, 0xb5, 0x5d, 0x45, 0xce, 0x57, 0xc4, 0x45, 0xdb, 0xc6, 0x13, + 0x4b, 0xa7, 0xa0, 0xd5, 0x31, 0xb4, 0xd4, 0x0f, 0x4f, 0x29, 0x40, 0xc0, + 0xaa, 0xb7, 0x54, 0x21, 0xd5, 0x3a, 0x01, 0xbc, 0xa8, 0x58, 0xb5, 0x3f, + 0xa6, 0x1a, 0x06, 0xb5, 0x07, 0xd3, 0xb6, 0xff, 0x6e, 0x74, 0x08, 0x16, + 0x45, 0xaf, 0xd9, 0xc5, 0x4a, 0x0d, 0xd2, 0x8a, 0xd1, 0x6c, 0xba, 0x5a, + 0xd0, 0xee, 0x57, 0x10, 0xa4, 0x1a, 0xf4, 0x92, 0x97, 0xe0, 0xd7, 0xa8, + 0xff, 0x47, 0xed, 0x56, 0x6b, 0x91, 0x77, 0x5d, 0xa6, 0xcf, 0xed, 0x96, + 0xc5, 0x5a, 0xe3, 0x0b, 0x1d, 0xc0, 0xcc, 0xa1, 0x71, 0x95, 0xa8, 0xec, + 0xef, 0x33, 0x91, 0xd6, 0x53, 0x1f, 0xef, 0x43, 0xa9, 0x42, 0x2a, 0xc7, + 0xf6, 0x15, 0x60, 0xc2, 0xde, 0xeb, 0xac, 0xf8, 0x55, 0x27, 0x14, 0xf1, + 0xf8, 0x69, 0x55, 0xc8, 0x69, 0x1f, 0xf3, 0xc2, 0x71, 0xe8, 0x75, 0xa9, + 0x1a, 0x91, 0xc5, 0x1e, 0xe3, 0x52, 0x24, 0x5f, 0x60, 0xb5, 0xf1, 0xe6, + 0xdd, 0x4b, 0x1b, 0xdd, 0x3a, 0xad, 0x58, 0x36, 0x9c, 0xb3, 0x25, 0x9e, + 0x28, 0xd4, 0x3b, 0x6a, 0x64, 0xe7, 0x57, 0x54, 0xad, 0x4d, 0x44, 0xfc, + 0x54, 0xd3, 0xa3, 0x96, 0x4e, 0xee, 0xde, 0x23, 0x30, 0x30, 0x1f, 0x57, + 0x2f, 0xd6, 0xb4, 0xfa, 0x5c, 0x1b, 0x4a, 0x1b, 0x96, 0x58, 0x9a, 0xc7, + 0x25, 0xd0, 0x9c, 0xf3, 0x2b, 0x16, 0x58, 0x62, 0x0c, 0x5b, 0x45, 0x96, + 0xb0, 0xc2, 0x3e, 0xca, 0x0a, 0xb5, 0x0f, 0x06, 0xa8, 0xa3, 0xb2, 0x0a, + 0x6a, 0xc5, 0xb7, 0xf8, 0x69, 0xfa, 0xc1, 0xa8, 0xbc, 0x17, 0x6c, 0x92, + 0x06, 0x50, 0x74, 0x4b, 0x02, 0xc8, 0x4d, 0x9c, 0x3e, 0x94, 0x6f, 0xef, + 0x3e, 0xd9, 0x71, 0xa6, 0x3a, 0x70, 0x6a, 0x14, 0x0e, 0x06, 0xbe, 0x40, + 0x2b, 0xa1, 0xbb, 0x05, 0x71, 0x05, 0xbd, 0xd5, 0x2d, 0xd9, 0xe2, 0xf6, + 0xb4, 0x32, 0x33, 0xac, 0x0f, 0x9a, 0xe3, 0xaf, 0xf4, 0x44, 0x21, 0x59, + 0x91, 0x0d, 0xd0, 0xf1, 0x47, 0x9e, 0x00, 0x38, 0xa2, 0x1d, 0x61, 0x54, + 0xd2, 0x18, 0x9d, 0xe4, 0x4f, 0xf3, 0xbd, 0x04, 0xdb, 0x4d, 0x59, 0x8c, + 0xfa, 0x12, 0xdd, 0xe4, 0xb5, 0x32, 0x3b, 0xf8, 0x93, 0xae, 0x3b, 0xa9, + 0xb3, 0xe9, 0x57, 0x30, 0x49, 0x6d, 0xaa, 0x35, 0x12, 0xce, 0x16, 0x98, + 0x3c, 0xd0, 0xed, 0xe8, 0xa6, 0xbc, 0xa6, 0xe6, 0x66, 0x0f, 0xb3, 0x12, + 0x95, 0x19, 0x56, 0x23, 0xb1, 0x30, 0x5d, 0xb3, 0x4c, 0x5f, 0x0c, 0xef, + 0x24, 0x12, 0xe0, 0x97, 0xf3, 0x3e, 0x9c, 0x49, 0xff, 0xa6, 0x6f, 0xa6, + 0xd2, 0x58, 0xbe, 0x3f, 0x30, 0xdd, 0x65, 0xd0, 0x40, 0xe1, 0xaf, 0x09, + 0xf1, 0xf4, 0x0f, 0x1a, 0xe5, 0xef, 0x51, 0x50, 0x38, 0x5d, 0xb0, 0x1e, + 0xed, 0x19, 0x8d, 0x4e, 0x20, 0xa1, 0x65, 0x07, 0x5b, 0x23, 0x0c, 0x14, + 0xd3, 0x18, 0xa3, 0xda, 0x58, 0x9f, 0x10, 0x00, 0xbd, 0xb5, 0x95, 0x07, + 0x1d, 0x0f, 0xf9, 0x2a, 0xe4, 0x35, 0x3c, 0x60, 0xad, 0xb2, 0x13, 0x3b, + 0xd5, 0x9e, 0xeb, 0xc7, 0x09, 0x6e, 0x53, 0xff, 0x95, 0xf3, 0xc1, 0x9b, + 0xcd, 0x21, 0x15, 0x3b, 0x5f, 0xfe, 0x4e, 0xaf, 0x3f, 0xf8, 0xe3, 0xa8, + 0x35, 0xee, 0x44, 0x33, 0xc7, 0x8c, 0x9c, 0x1c, 0x33, 0x55, 0x3c, 0x4a, + 0xa4, 0x35, 0xf6, 0xf0, 0x32, 0x8e, 0xed, 0x6d, 0x06, 0xff, 0x8d, 0x24, + 0x05, 0x72, 0x4c, 0xa2, 0x97, 0x25, 0x93, 0x3d, 0x79, 0x18, 0x22, 0x15, + 0xec, 0x5c, 0xc4, 0x10, 0x65, 0xec, 0x90, 0x6d, 0x28, 0xba, 0x93, 0xb5, + 0x2f, 0x53, 0xe4, 0x00, 0x9c, 0x39, 0xf5, 0x4c, 0xde, 0x51, 0x39, 0xc3, + 0xd8, 0x03, 0xc3, 0x97, 0xe1, 0xa8, 0x3e, 0x06, 0x26, 0x4d, 0xd9, 0x49, + 0x75, 0xbb, 0xd5, 0x69, 0x20, 0xfb, 0x85, 0x12, 0xc9, 0xac, 0xfc, 0x05, + 0xad, 0x57, 0xa9, 0x58, 0xcd, 0xfd, 0xbe, 0x64, 0x31, 0x50, 0x4d, 0xa4, + 0x93, 0xb6, 0x23, 0x3b, 0xfd, 0xd9, 0xdb, 0x46, 0xdd, 0x1f, 0x07, 0x54, + 0xc2, 0xc2, 0xd6, 0xad, 0xf6, 0x21, 0x39, 0xa1, 0x96, 0x53, 0x12, 0x46, + 0x5a, 0xc8, 0xf3, 0xf8, 0xe2, 0xa3, 0xd0, 0x29, 0x3f, 0x30, 0xca, 0x0b, + 0x57, 0xab, 0xcf, 0x1e, 0x08, 0x59, 0x3d, 0x41, 0x6a, 0xf7, 0xb2, 0xfc, + 0xff, 0x33, 0x46, 0xd1, 0x1a, 0xa6, 0x91, 0x54, 0xca, 0x27, 0x5a, 0x94, + 0x13, 0xf4, 0xf0, 0xcf, 0x58, 0xe0, 0x96, 0x50, 0xda, 0xe6, 0x91, 0xc7, + 0x8d, 0x14, 0x5b, 0xc1, 0xeb, 0x4a, 0x96, 0xf1, 0xa5, 0x43, 0xf6, 0x29, + 0x91, 0xb9, 0xb9, 0x67, 0x3f, 0x31, 0xd7, 0x08, 0xe6, 0x2b, 0xfb, 0x43, + 0x56, 0x39, 0x4e, 0xf9, 0x02, 0x8e, 0x96, 0x1f, 0xa3, 0x3c, 0xae, 0x55, + 0x03, 0x05, 0x9a, 0x39, 0xbe, 0xf7, 0x67, 0xa1, 0x6b, 0x2f, 0x42, 0x45, + 0x9b, 0x45, 0x8f, 0x53, 0x1f, 0x96, 0x42, 0x54, 0xd2, 0x5b, 0xf0, 0x17, + 0x94, 0x41, 0xaf, 0xd4, 0xc6, 0x37, 0x5f, 0xc0, 0xbd, 0xe3, 0x44, 0x8d, + 0xc1, 0x69, 0x64, 0x2a, 0xe7, 0x08, 0xe5, 0x18, 0x92, 0x53, 0xfc, 0xed, + 0xd3, 0x69, 0x94, 0x6b, 0x10, 0x0b, 0x5e, 0x91, 0x38, 0x4b, 0xa5, 0x19, + 0x3a, 0x6a, 0x2e, 0x5a, 0xa2, 0x6f, 0x34, 0x2c, 0x7b, 0x5d, 0x53, 0x33, + 0x77, 0x46, 0xf8, 0x4a, 0xa2, 0x8d, 0x55, 0x67, 0xa8, 0xbd, 0xc6, 0x3c, + 0x5d, 0x47, 0xeb, 0x99, 0xed, 0xdc, 0xae, 0xcf, 0xec, 0xbe, 0x40, 0x60, + 0xfc, 0x36, 0x5c, 0x93, 0x95, 0x64, 0xd8, 0x47, 0x14, 0xe2, 0x1e, 0xa2, + 0xd4, 0xd4, 0xdf, 0xd9, 0x23, 0x18, 0xf2, 0x99, 0xe8, 0xe4, 0x2a, 0x3b, + 0xec, 0x2e, 0x28, 0xa8, 0x04, 0x74, 0x04, 0xa4, 0x32, 0xa6, 0x49, 0xf9, + 0x33, 0x6c, 0xa8, 0x1d, 0xb2, 0xbb, 0x57, 0xe4, 0xcf, 0xf2, 0x9e, 0x74, + 0x8d, 0xf7, 0x22, 0xaa, 0x0d, 0x8a, 0x2f, 0x34, 0x72, 0x33, 0xec, 0xdf, + 0x46, 0x57, 0x6c, 0x97, 0x94, 0xad, 0x06, 0x88, 0xeb, 0x20, 0xec, 0x79, + 0x44, 0xe1, 0xbc, 0xf8, 0xbd, 0xeb, 0x99, 0xe3, 0xaf, 0xfe, 0xc5, 0xb5, + 0xfa, 0x31, 0x75, 0x62, 0xff, 0x2a, 0x2a, 0x1b, 0xce, 0xad, 0xa8, 0xc8, + 0x3c, 0x54, 0x23, 0xf9, 0x9e, 0x2d, 0xe2, 0xa4, 0x4f, 0x5b, 0x4d, 0xb8, + 0x4f, 0xc6, 0xb3, 0xc6, 0xef, 0x66, 0x54, 0x31, 0xab, 0xd3, 0xf0, 0xb9, + 0xfa, 0xb6, 0x15, 0xe6, 0xdb, 0x4b, 0x51, 0x4d, 0x77, 0xa5, 0x3d, 0x4e, + 0xd9, 0xc9, 0xdb, 0x95, 0x31, 0x1d, 0x4d, 0x37, 0xe0, 0x34, 0xd3, 0xf3, + 0x20, 0x6b, 0xb8, 0x16, 0x0b, 0x4e, 0x55, 0x96, 0x56, 0x1e, 0xa7, 0xe8, + 0xc6, 0x3a, 0x08, 0x49, 0xa1, 0x16, 0x46, 0xc9, 0x43, 0xcb, 0x8f, 0x28, + 0x4a, 0x78, 0xaa, 0xf9, 0x6c, 0x74, 0xc8, 0x0b, 0xce, 0x13, 0x2c, 0xef, + 0xfe, 0x73, 0x42, 0xa7, 0xbc, 0x3d, 0xc9, 0xf2, 0xaf, 0x1c, 0x32, 0xdb, + 0xb2, 0x15, 0x70, 0x6b, 0x9b, 0x6e, 0x6f, 0x6e, 0xf7, 0x95, 0xea, 0x3e, + 0xd0, 0xb1, 0x2a, 0xbe, 0x8c, 0x66, 0x4e, 0xe9, 0x29, 0xe3, 0x35, 0xde, + 0xbf, 0x44, 0xbc, 0x5e, 0x56, 0x8b, 0xb3, 0xd4, 0xdf, 0xf5, 0x4e, 0x2e, + 0xeb, 0xe6, 0x8e, 0x58, 0xe2, 0xfd, 0xe7, 0x27, 0xff, 0x07, 0x49, 0x20, + 0xdd, 0xcf, 0xe4, 0xd7, 0x5c, 0x5f, 0x1f, 0xcc, 0xeb, 0x29, 0xeb, 0x34, + 0xac, 0xd6, 0xb6, 0xf8, 0xae, 0xdf, 0x11, 0x58, 0xd5, 0xea, 0xf1, 0x76, + 0xe5, 0x4d, 0x51, 0x72, 0xd4, 0x5e, 0x1e, 0x0f, 0xfd, 0x2e, 0xbe, 0x8e, + 0x07, 0x1a, 0x1f, 0x99, 0x4d, 0x73, 0x70, 0xe1, 0x41, 0xb4, 0x20, 0x10, + 0x75, 0x0f, 0xc8, 0x69, 0x5f, 0x6c, 0x20, 0x2b, 0xc8, 0xfd, 0xe9, 0x4c, + 0xf4, 0x6f, 0x6a, 0xe0, 0x1a, 0xb5, 0xec, 0x2e, 0xf5, 0x25, 0x6d, 0x56, + 0x56, 0xb9, 0x42, 0xca, 0x70, 0x72, 0xe5, 0x41, 0x07, 0x4f, 0x41, 0x25, + 0xea, 0x0a, 0x5d, 0xe1, 0x0a, 0xd5, 0x6f, 0x35, 0x50, 0xcc, 0x27, 0x53, + 0x5f, 0x31, 0x1c, 0xee, 0xae, 0x26, 0xc8, 0xc4, 0x4f, 0x9b, 0xf5, 0xf6, + 0x4d, 0x19, 0xb9, 0xc4, 0x55, 0xcd, 0xe5, 0x8a, 0xe9, 0x45, 0xec, 0xf2, + 0xf9, 0x33, 0x4d, 0xba, 0x57, 0x8f, 0xd6, 0xf5, 0xf7, 0x92, 0xb3, 0xd3, + 0x65, 0x39, 0x07, 0x04, 0x92, 0x2f, 0x70, 0x99, 0x97, 0x96, 0x60, 0xe5, + 0x92, 0x60, 0xc3, 0x72, 0x1e, 0xc7, 0xe6, 0x1d, 0xbb, 0x5b, 0xd5, 0x64, + 0x1b, 0x36, 0x45, 0xb8, 0xcb, 0x42, 0xe7, 0x26, 0x45, 0x65, 0xc8, 0x04, + 0x1c, 0x05, 0x9b, 0x48, 0xe3, 0x93, 0x8e, 0xb2, 0x1c, 0x6a, 0xab, 0x60, + 0xc2, 0xa6, 0x1a, 0x71, 0xd5, 0x2c, 0xb8, 0xe9, 0x9e, 0x66, 0x8d, 0xb6, + 0xb1, 0x99, 0x90, 0x9c, 0x1b, 0xc9, 0x44, 0x6d, 0x31, 0xbb, 0x62, 0x6e, + 0x46, 0xcc, 0xd7, 0x47, 0x3a, 0x40, 0x63, 0x33, 0x34, 0x4f, 0x50, 0x3c, + 0x94, 0x97, 0xe9, 0xe8, 0x3a, 0xf7, 0x2d, 0x2d, 0x9c, 0xb6, 0x5d, 0x52, + 0xbd, 0xa9, 0x2d, 0x42, 0xfc, 0xe8, 0x70, 0x09, 0x48, 0xd0, 0x36, 0x0b, + 0x3d, 0x2b, 0x9f, 0xe2, 0x4c, 0xdf, 0xf3, 0x57, 0x73, 0x55, 0xf7, 0x34, + 0xb8, 0x6b, 0x44, 0x6f, 0xf6, 0x6d, 0xcf, 0x93, 0x09, 0x14, 0xac, 0x8f, + 0xde, 0xce, 0x5f, 0x05, 0x04, 0x9f, 0xc7, 0x05, 0x5f, 0xdd, 0x2e, 0xfc, + 0x53, 0xec, 0x9e, 0xdb, 0xa8, 0xa2, 0xc7, 0x53, 0x5c, 0x9a, 0x4d, 0xb6, + 0x6f, 0xa5, 0xc6, 0xf3, 0xc5, 0xa4, 0x56, 0x62, 0xdc, 0x75, 0xe4, 0x0b, + 0xb0, 0xcc, 0x38, 0xde, 0x2d, 0xbb, 0xbc, 0x0b, 0xc6, 0xab, 0xac, 0xac, + 0x46, 0xce, 0x1e, 0xe6, 0x47, 0x6c, 0x6e, 0x8e, 0x00, 0x00, 0xa0, 0xae, + 0x1e, 0x1d, 0xaa, 0x22, 0xaf, 0x34, 0xc7, 0x26, 0x37, 0x01, 0x46, 0x25, + 0x9c, 0x5f, 0x92, 0xef, 0xda, 0x07, 0x64, 0x62, 0xe4, 0xf7, 0x4c, 0xa2, + 0x41, 0xf1, 0x10, 0xe0, 0xe5, 0x73, 0x72, 0xe1, 0xf8, 0x66, 0x19, 0x58, + 0xa9, 0xdf, 0xb1, 0x41, 0xcb, 0xb3, 0xc4, 0xe6, 0x21, 0xbe, 0x17, 0x26, + 0xa9, 0x68, 0x96, 0xde, 0x5d, 0xba, 0x8f, 0x1b, 0x09, 0x00, 0x39, 0x0e, + 0xc2, 0x8d, 0x31, 0x61, 0xfe, 0x9e, 0x60, 0x05, 0xf3, 0x72, 0xdf, 0x78, + 0x14, 0x5a, 0x1b, 0x74, 0xa1, 0x23, 0xa7, 0x6e, 0x93, 0x76, 0xfa, 0x4a, + 0x73, 0xa1, 0x3b, 0xda, 0x0b, 0x06, 0xdd, 0xfc, 0x2f, 0xef, 0x0a, 0x38, + 0x03, 0xbf, 0xbb, 0x12, 0x29, 0x6b, 0xec, 0x68, 0xc7, 0xa6, 0xf9, 0x72, + 0xbc, 0xdb, 0xeb, 0x4e, 0x8f, 0x5f, 0x3a, 0xa9, 0x06, 0x4e, 0x3c, 0xf4, + 0x3b, 0xe0, 0x98, 0x9b, 0x77, 0x57, 0x0f, 0x39, 0x08, 0x43, 0x3f, 0x9b, + 0x76, 0x11, 0xd3, 0x38, 0xb6, 0x1f, 0x1e, 0xfe, 0xbb, 0x16, 0x37, 0x24, + 0x15, 0xf7, 0x8e, 0x61, 0x3d, 0xf5, 0x60, 0xab, 0x46, 0x49, 0xd6, 0xb2, + 0x8e, 0x35, 0xd5, 0x66, 0x20, 0x1f, 0xad, 0xf5, 0x95, 0xc3, 0x3e, 0xaa, + 0xda, 0x12, 0x1f, 0x33, 0xf4, 0xc0, 0xd9, 0x9e, 0x09, 0x76, 0x8b, 0x2f, + 0x35, 0xe2, 0x58, 0x09, 0x36, 0xf1, 0x03, 0xbc, 0xc2, 0x54, 0x67, 0x29, + 0x00, 0x3b, 0xf0, 0x24, 0xdf, 0xa0, 0x92, 0x71, 0xc3, 0x98, 0xe8, 0x5d, + 0xbe, 0xc7, 0xe8, 0x6f, 0x2f, 0x05, 0x89, 0x9f, 0xa1, 0x63, 0x29, 0x12, + 0x94, 0xff, 0xc7, 0x4c, 0xec, 0x98, 0x0e, 0xb8, 0xeb, 0x9e, 0x6d, 0x1e, + 0x4f, 0x4a, 0x1e, 0x41, 0xb0, 0xf9, 0x40, 0x8b, 0xdd, 0xd9, 0xa6, 0x1b, + 0xd4, 0x6d, 0xaf, 0x5b, 0x14, 0x68, 0xfd, 0x96, 0x5d, 0x0d, 0xad, 0x46, + 0x03, 0xf8, 0xd7, 0x13, 0x1d, 0xf3, 0x47, 0xbe, 0x46, 0x3d, 0xc7, 0xdd, + 0xa9, 0x60, 0x05, 0x15, 0xef, 0x9d, 0xa4, 0xb8, 0xde, 0xf2, 0x41, 0xe2, + 0x07, 0x1d, 0xcb, 0xe8, 0xf3, 0x9c, 0x9c, 0x5e, 0xcd, 0xec, 0x53, 0x39, + 0xf2, 0x62, 0x3b, 0x69, 0x3a, 0x29, 0xc7, 0xb3, 0x57, 0xce, 0x58, 0xd6, + 0x55, 0xf8, 0xc2, 0xf1, 0x16, 0xf3, 0x33, 0x3f, 0xf2, 0xaa, 0x63, 0x42, + 0x27, 0x01, 0x22, 0x5a, 0x1e, 0x8d, 0xa5, 0x33, 0x34, 0x29, 0x12, 0xf6, + 0x07, 0x22, 0xfd, 0xbb, 0x72, 0x60, 0x2a, 0xf5, 0xec, 0x71, 0xfe, 0xd7, + 0xc1, 0xf5, 0xdf, 0x97, 0x3e, 0x4a, 0x9a, 0x97, 0x6f, 0x56, 0xf1, 0xd4, + 0xba, 0x29, 0x09, 0x46, 0x3f, 0x10, 0xdc, 0x2d, 0xb2, 0x04, 0x32, 0x38, + 0xa3, 0xc7, 0x75, 0x95, 0x16, 0xd6, 0x12, 0x44, 0x7a, 0xd3, 0x18, 0xb3, + 0x51, 0x72, 0x63, 0xb8, 0xae, 0x9b, 0xf1, 0xec, 0x17, 0xe4, 0x2d, 0xed, + 0x29, 0x05, 0x63, 0xd7, 0x01, 0xf4, 0xf5, 0xc1, 0x6d, 0x13, 0x5f, 0x5c, + 0x73, 0x11, 0xc9, 0x53, 0xf4, 0xda, 0x90, 0xa2, 0x1c, 0x0b, 0x1d, 0x37, + 0x28, 0xa1, 0x06, 0x65, 0xd3, 0x49, 0x5d, 0x07, 0x1f, 0x93, 0xa9, 0x98, + 0xc5, 0xa5, 0x13, 0xc5, 0xac, 0xda, 0x64, 0x25, 0x77, 0x9a, 0xd5, 0xa9, + 0xe9, 0x3a, 0x77, 0x62, 0xac, 0xf2, 0x76, 0xf4, 0x03, 0xb6, 0x03, 0x6e, + 0xef, 0x97, 0x13, 0x1c, 0xd1, 0xb9, 0x73, 0x12, 0xf7, 0x10, 0xbd, 0x1c, + 0xa1, 0xe7, 0xed, 0xd7, 0xa0, 0xd7, 0x53, 0xa1, 0x21, 0xf1, 0x5f, 0x1e, + 0xec, 0x36, 0x0d, 0x2c, 0xce, 0x74, 0x4a, 0x0c, 0x97, 0x5a, 0x76, 0x62, + 0x18, 0x9c, 0xc3, 0xc1, 0xc4, 0x5e, 0xf1, 0xfa, 0xe6, 0x4b, 0x15, 0xda, + 0xfa, 0xfd, 0xe9, 0x98, 0x09, 0xc3, 0x67, 0x63, 0x1f, 0x28, 0x37, 0xf0, + 0x59, 0x4b, 0x4b, 0xa3, 0xd1, 0x41, 0x94, 0xa6, 0x05, 0xb0, 0x93, 0xee, + 0x41, 0xa4, 0xce, 0xee, 0xea, 0xc4, 0x43, 0x6e, 0xab, 0x65, 0x70, 0xe3, + 0x4d, 0xf1, 0x02, 0xf5, 0x0f, 0xd5, 0x5e, 0xfd, 0x03, 0xcd, 0x22, 0x27, + 0x90, 0xf4, 0x98, 0xa2, 0xc0, 0xb4, 0xd5, 0x04, 0xfa, 0x75, 0x22, 0x4c, + 0xe7, 0xdd, 0xef, 0x3a, 0x1d, 0xb6, 0x00, 0x58, 0xcd, 0x5a, 0xbc, 0x12, + 0xea, 0x5a, 0xda, 0xa9, 0x18, 0x0e, 0xff, 0x51, 0xc4, 0xaf, 0xc8, 0x95, + 0xfb, 0x92, 0xdf, 0x99, 0xc9, 0x4e, 0xfe, 0xb1, 0xb0, 0xca, 0xa1, 0xba, + 0x90, 0xc8, 0x07, 0x34, 0x52, 0x6d, 0xd8, 0x05, 0x72, 0x2e, 0xee, 0x98, + 0xc0, 0x1e, 0x25, 0xb3, 0xa2, 0xb4, 0x9c, 0xa5, 0xdc, 0xd3, 0xb1, 0xdf, + 0x17, 0xd9, 0xda, 0xe9, 0x5d, 0x41, 0xca, 0xc7, 0xe4, 0x94, 0x0d, 0x67, + 0xba, 0x9c, 0xcf, 0x52, 0xf0, 0x00, 0x54, 0xe0, 0xbd, 0x3c, 0xc7, 0xb9, + 0x6a, 0x11, 0xc6, 0xd1, 0x62, 0xc3, 0xcf, 0xc2, 0x6a, 0x44, 0xeb, 0x41, + 0x43, 0x54, 0xe2, 0xf5, 0xc4, 0x11, 0xd7, 0x6a, 0xf2, 0x76, 0xa9, 0x16, + 0xae, 0xe2, 0x11, 0xfb, 0x04, 0x3d, 0xee, 0xd1, 0x98, 0x30, 0x0b, 0x6b, + 0x8a, 0x6f, 0x45, 0xb7, 0x01, 0x64, 0x46, 0x32, 0x61, 0xd5, 0x05, 0xfa, + 0xb1, 0x14, 0x54, 0x39, 0x13, 0x9b, 0xd5, 0x1d, 0x5c, 0xad, 0xd0, 0x5e, + 0x6d, 0xb3, 0xa1, 0xb3, 0xc5, 0x8d, 0xf8, 0x12, 0xd9, 0x5f, 0x94, 0x27, + 0xdf, 0x30, 0xc8, 0x0e, 0x3a, 0x46, 0x70, 0x5c, 0x4c, 0xaa, 0x24, 0xc3, + 0x50, 0x62, 0x52, 0xc8, 0x63, 0x64, 0xc9, 0x49, 0x74, 0x1c, 0xd2, 0x49, + 0x0f, 0x20, 0x69, 0x53, 0x97, 0x34, 0xc0, 0x92, 0x48, 0x28, 0x7b, 0x64, + 0xca, 0xea, 0x07, 0x6c, 0x63, 0x3e, 0xb6, 0xdb, 0xd5, 0x52, 0x9d, 0x7a, + 0x5f, 0x46, 0xc1, 0xb9, 0x3e, 0xe2, 0xe9, 0xeb, 0x04, 0x65, 0xc0, 0x74, + 0x4b, 0x07, 0x6a, 0x19, 0x4a, 0x9d, 0x05, 0xa0, 0xba, 0xae, 0x74, 0xef, + 0x62, 0x09, 0x57, 0x36, 0xe5, 0x9c, 0x54, 0x59, 0x3d, 0x04, 0xf0, 0xfb, + 0x6f, 0x89, 0x13, 0x1f, 0x1f, 0x88, 0x03, 0x6b, 0x0c, 0xeb, 0x53, 0xac, + 0x3a, 0x18, 0xa4, 0x93, 0xcc, 0x4f, 0xf5, 0x92, 0x44, 0x23, 0x9e, 0x67, + 0xf0, 0xf5, 0x2f, 0xb9, 0xc9, 0x34, 0x76, 0x97, 0x1d, 0x94, 0x75, 0x3f, + 0x47, 0x97, 0xe0, 0x30, 0xcc, 0xff, 0xd2, 0x7a, 0x3b, 0x04, 0xa7, 0xa5, + 0x62, 0x9e, 0xe4, 0x8f, 0xd8, 0x62, 0xee, 0x1d, 0x1c, 0xff, 0xad, 0x18, + 0xc9, 0x66, 0x47, 0x36, 0xfb, 0x2e, 0x74, 0x2a, 0xe7, 0x5f, 0xb2, 0x12, + 0xd2, 0x9e, 0xae, 0x2b, 0x92, 0xb8, 0x53, 0x66, 0x22, 0x5c, 0xa8, 0xaf, + 0x4f, 0x29, 0xab, 0x64, 0x50, 0x09, 0xe9, 0x2f, 0x2e, 0x62, 0x2e, 0x0e, + 0x8a, 0xd6, 0xeb, 0xa7, 0x5d, 0x3e, 0x9e, 0xe1, 0x39, 0x52, 0x13, 0x57, + 0x54, 0x5c, 0x78, 0xed, 0xb3, 0xfc, 0x5f, 0xa1, 0xf3, 0x2a, 0x77, 0x90, + 0xa9, 0x09, 0xa1, 0x05, 0x3b, 0xa9, 0x6a, 0xf5, 0xc4, 0xfa, 0x97, 0x79, + 0x64, 0x57, 0x1a, 0xf1, 0x74, 0xe5, 0x16, 0x93, 0xa9, 0xef, 0xe6, 0xdf, + 0x36, 0xd2, 0xd0, 0xe6, 0xb8, 0xdd, 0xe9, 0x13, 0x4c, 0xcd, 0x22, 0x98, + 0xc1, 0x94, 0xbb, 0x04, 0x2a, 0x4a, 0x69, 0x10, 0x5a, 0xcb, 0x1d, 0x9e, + 0xc4, 0x3d, 0x6d, 0x0e, 0xe0, 0x12, 0xb4, 0xe1, 0x6c, 0x55, 0x6f, 0xa3, + 0xf5, 0x1b, 0x0c, 0xe5, 0x1c, 0x99, 0x8b, 0x23, 0x23, 0xbc, 0x33, 0xe4, + 0xd4, 0x15, 0xfd, 0xcc, 0x90, 0x87, 0xb5, 0x0e, 0x24, 0xba, 0x20, 0x1b, + 0xcf, 0x67, 0x98, 0x1a, 0x35, 0xe7, 0xc3, 0x95, 0x29, 0xd6, 0xd2, 0x4f, + 0xe4, 0x14, 0xd5, 0xa1, 0x93, 0xff, 0x24, 0x0e, 0xfc, 0xb7, 0xd6, 0xde, + 0x05, 0xc5, 0x2f, 0xaa, 0x92, 0xd4, 0xd8, 0xac, 0x8f, 0x67, 0x45, 0xdb, + 0x36, 0x19, 0x15, 0x09, 0x9a, 0x3f, 0x2a, 0x56, 0xd5, 0xa9, 0x26, 0xb6, + 0xcb, 0x19, 0xf3, 0x6a, 0xbb, 0xba, 0xba, 0xa3, 0x68, 0x90, 0x0f, 0xb1, + 0x98, 0x14, 0x33, 0xd8, 0x12, 0xdf, 0xef, 0xe5, 0x01, 0x93, 0xab, 0xf8, + 0x93, 0x40, 0xbd, 0xa0, 0x01, 0x34, 0x54, 0xfd, 0xa0, 0xc4, 0xc3, 0xf3, + 0x6b, 0x90, 0x30, 0xc1, 0xbe, 0xd8, 0xbb, 0xab, 0x71, 0xaa, 0xe5, 0x3b, + 0x2d, 0x5d, 0x6e, 0x00, 0x34, 0xa8, 0x02, 0x34, 0xa9, 0x67, 0x95, 0xcd, + 0xed, 0xa2, 0x25, 0x55, 0xc9, 0x03, 0x1c, 0x30, 0xe7, 0xdf, 0xe6, 0xe7, + 0x2b, 0x5a, 0x9a, 0xcd, 0xa8, 0xf0, 0x4e, 0xe4, 0xd7, 0x90, 0x5f, 0x4e, + 0xbf, 0x5d, 0x68, 0x12, 0x1c, 0x4c, 0x68, 0x03, 0x9c, 0x49, 0xcb, 0xe6, + 0xc4, 0xfd, 0xad, 0xd5, 0xa8, 0xd8, 0xda, 0x2f, 0x13, 0xbc, 0x42, 0x61, + 0xa5, 0x0a, 0x1a, 0xe9, 0x5e, 0x5c, 0x01, 0x7c, 0xca, 0x73, 0x6f, 0x32, + 0xc1, 0x96, 0x24, 0x9d, 0x12, 0x20, 0x11, 0x6a, 0xf6, 0xbc, 0xff, 0x6a, + 0xc1, 0x58, 0x0d, 0xb9, 0xad, 0xc5, 0xde, 0x69, 0x37, 0xbe, 0xd9, 0x93, + 0xcc, 0x2b, 0xe9, 0x13, 0x45, 0xa0, 0x6c, 0x3f, 0x44, 0x34, 0xaf, 0x43, + 0x6d, 0xae, 0xef, 0xb2, 0x65, 0x03, 0xc1, 0xef, 0x10, 0x1e, 0xd8, 0x6e, + 0xb5, 0xb9, 0x03, 0xd8, 0x6e, 0x2f, 0x53, 0xe6, 0xc0, 0xaf, 0x44, 0xd2, + 0xd8, 0x15, 0x56, 0x15, 0x59, 0xd6, 0xd4, 0xe4, 0x1a, 0x25, 0xd5, 0xcf, + 0xe7, 0x6a, 0x55, 0xd4, 0xf8, 0x42, 0x4c, 0xcb, 0x9a, 0x48, 0x4d, 0x27, + 0x61, 0x4c, 0x36, 0x2b, 0xcb, 0x10, 0xba, 0xf7, 0xe3, 0x23, 0x27, 0xc5, + 0x6a, 0x1b, 0x94, 0x69, 0x64, 0xb1, 0x8c, 0xdb, 0xd4, 0x0d, 0x32, 0x3e, + 0x58, 0x73, 0xa8, 0x2f, 0x3d, 0x22, 0xd9, 0x0d, 0x2a, 0x52, 0xf0, 0xdd, + 0xeb, 0x21, 0x42, 0xc7, 0x59, 0x96, 0x09, 0x93, 0x5a, 0x70, 0xc3, 0x21, + 0x5f, 0xce, 0xc2, 0xdd, 0xcf, 0x61, 0xed, 0x1c, 0xfb, 0x2f, 0x57, 0xf7, + 0x31, 0xb8, 0x3e, 0x92, 0x29, 0xd4, 0x47, 0x6a, 0x19, 0x66, 0x00, 0xc2, + 0xc4, 0x6c, 0xb5, 0xc5, 0x68, 0x24, 0xa8, 0x64, 0x26, 0x72, 0x43, 0x20, + 0x9f, 0xf1, 0x3f, 0xac, 0x64, 0xb5, 0x12, 0x26, 0x13, 0x76, 0x52, 0x05, + 0xda, 0x57, 0xe3, 0x53, 0x73, 0x30, 0x21, 0x27, 0x75, 0x8d, 0x37, 0xd1, + 0x77, 0x40, 0x97, 0x2a, 0xb7, 0x0b, 0x2e, 0x9e, 0x4c, 0x36, 0x75, 0x44, + 0x15, 0xdb, 0x96, 0x70, 0xf9, 0x33, 0x9a, 0x1e, 0x6e, 0x13, 0x05, 0x38, + 0x2c, 0xbf, 0x0a, 0xdd, 0x2b, 0x2b, 0x38, 0x77, 0xa9, 0x00, 0x2d, 0x5e, + 0xee, 0x4b, 0xf3, 0x20, 0x7a, 0x90, 0x97, 0x44, 0xdf, 0x55, 0xfd, 0x50, + 0xe3, 0x24, 0x25, 0xa9, 0xd9, 0x3f, 0x6d, 0x09, 0x32, 0x67, 0xb5, 0x43, + 0xf1, 0xc7, 0xa7, 0xfb, 0x92, 0xde, 0xc3, 0xbf, 0x64, 0x6b, 0x35, 0xda, + 0x08, 0x94, 0x68, 0xb0, 0xc8, 0x3f, 0xb5, 0x9f, 0x15, 0x05, 0xff, 0x6c, + 0xbc, 0x22, 0x61, 0xf4, 0x67, 0xf8, 0x1f, 0x2e, 0x91, 0xc8, 0x12, 0xdc, + 0xcb, 0x22, 0x05, 0xb8, 0xab, 0x0d, 0x0e, 0xd7, 0x04, 0x8e, 0x32, 0x0e, + 0xfe, 0x72, 0x79, 0xc3, 0xba, 0xd8, 0x68, 0x3e, 0x5d, 0xab, 0xa0, 0xf8, + 0x26, 0x57, 0xe4, 0x20, 0x91, 0x0a, 0xde, 0x52, 0x95, 0xbc, 0xb7, 0x71, + 0x50, 0xe4, 0x3f, 0x07, 0x4c, 0xa8, 0x6a, 0xb6, 0xa0, 0x95, 0xe2, 0x31, + 0x8f, 0x5f, 0xfa, 0xdd, 0xee, 0x02, 0x23, 0x56, 0xf1, 0xdd, 0x1a, 0xa6, + 0xa0, 0x2d, 0x46, 0x36, 0x6c, 0x79, 0xe8, 0x67, 0x43, 0xdd, 0xe7, 0x2e, + 0x25, 0xda, 0x35, 0x6f, 0x63, 0xf1, 0x2c, 0x6c, 0x61, 0xaa, 0xb7, 0x51, + 0x91, 0xa1, 0x7c, 0x54, 0x9a, 0xf6, 0x3c, 0x3f, 0xa8, 0xba, 0x4d, 0xee, + 0xb6, 0xab, 0xa5, 0x05, 0xc6, 0xb6, 0xe8, 0x2f, 0x1b, 0x99, 0xb0, 0x45, + 0x3e, 0xc3, 0x50, 0x26, 0x0b, 0x10, 0x61, 0x5a, 0xc6, 0x25, 0x2d, 0x07, + 0xb6, 0x28, 0x59, 0xf3, 0xb4, 0x02, 0x61, 0xa0, 0xd0, 0x0a, 0xae, 0xd6, + 0x3c, 0xcc, 0x5f, 0xfb, 0xc0, 0xfd, 0xeb, 0x7b, 0xe2, 0x66, 0xc5, 0x98, + 0x70, 0x50, 0x31, 0x3a, 0x12, 0x45, 0xf4, 0x1c, 0xba, 0xa6, 0x92, 0x51, + 0xae, 0x68, 0xec, 0xb0, 0x1a, 0xd9, 0x45, 0x00, 0xd6, 0x9e, 0xad, 0x64, + 0xfe, 0xd9, 0xfb, 0xcc, 0x57, 0xff, 0x9e, 0xa3, 0x71, 0xe7, 0x7a, 0xaf, + 0x26, 0x31, 0x31, 0x6a, 0x41, 0xa4, 0x4d, 0x68, 0xbc, 0xcb, 0xfa, 0xb4, + 0x3a, 0x1c, 0x3a, 0x8f, 0xcd, 0xc1, 0x95, 0xb2, 0x46, 0x72, 0xf7, 0xfc, + 0x20, 0xe2, 0x2f, 0x0f, 0xbd, 0x74, 0xe1, 0x2a, 0xd5, 0xf6, 0xe9, 0xe1, + 0x45, 0x7d, 0x95, 0xb0, 0x49, 0xce, 0xe8, 0x53, 0x69, 0x46, 0x9d, 0x03, + 0x5f, 0x15, 0x2e, 0x92, 0x4c, 0xb7, 0xf1, 0x43, 0x67, 0x8a, 0x43, 0xc6, + 0x90, 0xec, 0xb5, 0x5d, 0xd5, 0x64, 0x16, 0x6e, 0xf0, 0xad, 0x4e, 0xf0, + 0x56, 0xe8, 0x77, 0xd5, 0x47, 0x47, 0x41, 0xc9, 0x98, 0x3a, 0xcb, 0xe0, + 0x01, 0x77, 0x93, 0x15, 0xe0, 0xd3, 0x93, 0xbe, 0xe1, 0x97, 0xe0, 0x21, + 0x60, 0x2b, 0xf1, 0x4a, 0x62, 0x29, 0x11, 0xe9, 0x61, 0x55, 0xc4, 0x57, + 0x04, 0xa8, 0xb3, 0xb3, 0x61, 0xd7, 0xa6, 0xce, 0x50, 0xd2, 0xc3, 0x38, + 0xda, 0xc2, 0x23, 0x67, 0x37, 0x09, 0xa7, 0xfd, 0x29, 0xdc, 0xcc, 0x52, + 0x65, 0xea, 0x3f, 0xcc, 0x67, 0x5e, 0x3b, 0xd4, 0x59, 0x59, 0x12, 0x9b, + 0xf1, 0xd2, 0x43, 0x46, 0x54, 0xcd, 0xb9, 0xbe, 0x71, 0xb6, 0x6d, 0x6a, + 0x62, 0xc5, 0x59, 0xc1, 0x21, 0xf7, 0x4c, 0x91, 0x64, 0xe0, 0xd7, 0xd9, + 0x34, 0x60, 0x0d, 0xb2, 0x93, 0xd8, 0xd3, 0x01, 0x8b, 0xf3, 0x9c, 0x6c, + 0xff, 0x63, 0xca, 0xd2, 0xf4, 0x76, 0xe3, 0x60, 0x52, 0x5c, 0x0e, 0xa3, + 0x13, 0xc8, 0xd9, 0xa7, 0x13, 0x6d, 0x1b, 0x29, 0xc0, 0xb1, 0x54, 0x31, + 0x33, 0x55, 0x44, 0x0a, 0x0a, 0x96, 0x3f, 0xf0, 0xb2, 0x64, 0x23, 0xa1, + 0xc8, 0x08, 0x01, 0x94, 0x2f, 0xc8, 0x0a, 0xfb, 0x93, 0x38, 0xe4, 0xc1, + 0xd9, 0xea, 0x46, 0x96, 0xdd, 0x5d, 0x62, 0xfc, 0xb0, 0x4d, 0x17, 0xe8, + 0xa0, 0xd4, 0x35, 0x98, 0x65, 0xb0, 0x27, 0x97, 0xbc, 0xe8, 0x48, 0x38, + 0x90, 0x9b, 0x6e, 0xf1, 0xd2, 0x17, 0x1b, 0xbf, 0x03, 0xc6, 0xa3, 0x42, + 0xaf, 0xdc, 0x44, 0x9d, 0x9e, 0x69, 0x67, 0x33, 0x61, 0xfb, 0x96, 0xfa, + 0xff, 0xf4, 0xa8, 0x3c, 0xb6, 0x42, 0xd2, 0x4c, 0xc0, 0xa8, 0x2a, 0x4b, + 0x37, 0x78, 0x41, 0x94, 0xf6, 0x04, 0xb9, 0x54, 0xe4, 0x2b, 0xfc, 0xed, + 0xf5, 0xf7, 0x62, 0x23, 0x44, 0xc4, 0xd7, 0x5a, 0xeb, 0xc2, 0x3d, 0x4c, + 0x41, 0x22, 0xa0, 0xe3, 0x22, 0xbc, 0x91, 0x69, 0x37, 0x3f, 0x94, 0xfd, + 0x07, 0xa7, 0x6e, 0x53, 0x27, 0xdc, 0xb0, 0x14, 0x8d, 0x0a, 0x08, 0x31, + 0xba, 0xf0, 0xd0, 0xda, 0xa6, 0x7a, 0xc0, 0x4c, 0x9d, 0x3b, 0x8f, 0xee, + 0x11, 0xc7, 0x9f, 0xc9, 0xcc, 0x4c, 0x26, 0x51, 0xb4, 0x10, 0xde, 0xc2, + 0xa3, 0xe0, 0xaa, 0x7c, 0x9c, 0x27, 0x8d, 0x04, 0x8e, 0xfc, 0xe4, 0x68, + 0x93, 0xf9, 0x67, 0x28, 0xa0, 0xe6, 0xca, 0xbd, 0x5a, 0x64, 0x98, 0x9f, + 0xe3, 0x7b, 0x16, 0x5d, 0x61, 0xcc, 0x4c, 0x64, 0x04, 0x1b, 0xcc, 0xa6, + 0xa2, 0x31, 0x28, 0xa2, 0xac, 0xd0, 0xce, 0x40, 0x19, 0xe7, 0xf9, 0xea, + 0xc5, 0x98, 0x50, 0x16, 0x38, 0xad, 0x58, 0x21, 0x2e, 0x10, 0x48, 0x4f, + 0xe7, 0xc0, 0xc0, 0x6c, 0xcd, 0xe2, 0xc3, 0xcd, 0xc5, 0xfc, 0x26, 0x91, + 0xea, 0xcf, 0x52, 0x97, 0x9f, 0xdc, 0x2c, 0x45, 0xd8, 0x50, 0xf8, 0x75, + 0xa2, 0x93, 0x52, 0x2b, 0x23, 0xd3, 0x30, 0x9d, 0xa7, 0xf7, 0xbb, 0xc2, + 0xd2, 0xb7, 0x9d, 0xec, 0xf9, 0x9a, 0xec, 0x3e, 0xc0, 0xce, 0x64, 0xb8, + 0xf5, 0x41, 0x4e, 0x06, 0xa1, 0x25, 0xf2, 0x40, 0xee, 0x07, 0xec, 0x6d, + 0x9a, 0xd0, 0x5c, 0xdd, 0xe9, 0xf5, 0x56, 0xf9, 0x2e, 0xf5, 0xdb, 0x69, + 0xc9, 0x3e, 0xb5, 0x0c, 0xbc, 0x29, 0xa4, 0xa9, 0x55, 0x9b, 0xf6, 0xab, + 0x1f, 0x55, 0x9d, 0x25, 0xd2, 0xde, 0x3f, 0xa0, 0xe5, 0x1c, 0xb3, 0x90, + 0x2f, 0x6c, 0xaf, 0xb5, 0x6d, 0x23, 0x15, 0xab, 0x91, 0x55, 0x5f, 0x02, + 0x20, 0x22, 0x8e, 0xc1, 0x4a, 0x63, 0xa6, 0x5e, 0x85, 0x99, 0x58, 0xdc, + 0xde, 0xb0, 0x76, 0x9f, 0x21, 0x4d, 0xe9, 0x47, 0xcc, 0x3f, 0x02, 0x91, + 0x75, 0x67, 0xe5, 0x6a, 0x2c, 0xc3, 0x69, 0x95, 0x2d, 0x74, 0x77, 0xf7, + 0x1d, 0xe1, 0x12, 0x2b, 0xcf, 0x4c, 0x7b, 0xcf, 0xbe, 0x24, 0x1d, 0x07, + 0x34, 0xd3, 0x67, 0xa8, 0xb9, 0x76, 0x2a, 0x3e, 0xfd, 0xb5, 0xcd, 0xf6, + 0x29, 0x07, 0x4e, 0x17, 0xcf, 0x28, 0xdd, 0x90, 0x4b, 0x17, 0x24, 0x55, + 0xdc, 0x78, 0xe5, 0xf4, 0x97, 0x31, 0x3d, 0xfa, 0x96, 0xe2, 0x99, 0x61, + 0xb1, 0xcb, 0xa4, 0x7b, 0x4e, 0x5d, 0x6a, 0xf8, 0xb2, 0x79, 0xfc, 0xa9, + 0xd9, 0x27, 0x46, 0xdd, 0x52, 0xdf, 0x24, 0x66, 0x1c, 0xa6, 0xbc, 0x18, + 0x13, 0x72, 0x38, 0x53, 0xac, 0x1b, 0x67, 0x1f, 0x30, 0xae, 0x5a, 0xf3, + 0x55, 0xd0, 0xe1, 0x23, 0x9a, 0x46, 0xa4, 0xbb, 0x68, 0x73, 0x30, 0xda, + 0xb7, 0x3b, 0xff, 0xd1, 0x0d, 0xe0, 0xf7, 0xda, 0x36, 0x3a, 0x7a, 0x19, + 0xf5, 0x2e, 0xf4, 0xda, 0xa4, 0x09, 0x94, 0xb8, 0x18, 0xad, 0x6b, 0xf6, + 0x64, 0xbf, 0x2a, 0x04, 0xc6, 0xde, 0x0f, 0x45, 0x27, 0x3a, 0x3d, 0x61, + 0xf5, 0xde, 0x38, 0x1d, 0x23, 0x23, 0x70, 0x00, 0xfc, 0x0c, 0x5c, 0x96, + 0xc1, 0x21, 0x78, 0x25, 0x24, 0x71, 0xd1, 0xe2, 0xe9, 0x1a, 0x2f, 0x48, + 0x4d, 0x09, 0x24, 0x27, 0xe4, 0xe7, 0x42, 0x76, 0x92, 0x93, 0x7a, 0x62, + 0x76, 0xc6, 0xd7, 0xdf, 0xe4, 0x5e, 0x0e, 0xfc, 0x4e, 0x0a, 0x65, 0x63, + 0x51, 0x90, 0xfd, 0x92, 0x5f, 0x9a, 0x49, 0xa9, 0x6c, 0xb1, 0xb6, 0xe6, + 0xab, 0xf7, 0xb9, 0x39, 0xc0, 0xed, 0x1d, 0x65, 0x9c, 0x24, 0x21, 0xc1, + 0x0d, 0xd6, 0x9a, 0xbe, 0xd4, 0x74, 0xa2, 0x70, 0xab, 0x0b, 0x45, 0xf0, + 0xc9, 0xaa, 0xf1, 0x49, 0x0b, 0x6c, 0x20, 0xdc, 0x37, 0x2b, 0x13, 0x68, + 0x48, 0x0e, 0xd8, 0xd1, 0x67, 0xd8, 0xa3, 0x7e, 0xd7, 0xb7, 0x50, 0xc8, + 0x14, 0x58, 0x6a, 0x04, 0xa5, 0x70, 0x22, 0x2d, 0x41, 0xea, 0x28, 0xb7, + 0xf0, 0xde, 0xc4, 0xe4, 0x5b, 0x4d, 0xc1, 0x33, 0x9e, 0x14, 0x32, 0xa8, + 0x9b, 0xc8, 0xd9, 0x5b, 0x95, 0x2a, 0x91, 0x9d, 0xe8, 0x15, 0x19, 0x9b, + 0x38, 0xf3, 0x35, 0x69, 0x3e, 0xd3, 0x4b, 0xcc, 0xf2, 0x94, 0x5a, 0xaf, + 0x91, 0xa4, 0xa1, 0x03, 0x48, 0x5f, 0x6d, 0x16, 0x56, 0x03, 0x5a, 0xcb, + 0x99, 0x19, 0x45, 0x9c, 0xba, 0xc9, 0xbc, 0x5b, 0x0f, 0xf5, 0xde, 0x70, + 0xa3, 0x70, 0x0d, 0x3f, 0x3e, 0x5c, 0x4d, 0x5a, 0x1a, 0x46, 0x1b, 0x44, + 0x4a, 0x73, 0xfa, 0xb1, 0xc4, 0x42, 0x7b, 0x0c, 0x15, 0x0d, 0x35, 0xc4, + 0xa3, 0xea, 0x17, 0xa0, 0x0b, 0xfb, 0x4d, 0x1b, 0x2f, 0x96, 0x1f, 0xaa, + 0xc0, 0xad, 0xdc, 0xf3, 0xb2, 0xb1, 0x44, 0x1f, 0x39, 0xc7, 0x33, 0x18, + 0xad, 0xe1, 0x50, 0x7d, 0xf9, 0x2a, 0x90, 0xf2, 0x06, 0xce, 0x07, 0xae, + 0x9f, 0xbc, 0x4d, 0xae, 0x30, 0xdd, 0x47, 0xa2, 0xd3, 0x6d, 0x0c, 0xc6, + 0xb7, 0xae, 0xf5, 0x38, 0xa3, 0x00, 0x59, 0x6a, 0x00, 0x04, 0xd2, 0x77, + 0x0a, 0x58, 0xc9, 0xaf, 0x1b, 0x59, 0x29, 0xf3, 0xdd, 0x58, 0xcf, 0xa1, + 0x6d, 0xb4, 0x66, 0x23, 0x9f, 0x9b, 0x41, 0x2a, 0xc8, 0x28, 0x34, 0x77, + 0x3a, 0x1f, 0xa5, 0xde, 0x4b, 0x3f, 0xc7, 0x19, 0xf5, 0xdb, 0x98, 0xc4, + 0x6c, 0x2f, 0x34, 0x20, 0xc9, 0x52, 0x16, 0x60, 0xbc, 0x04, 0xd5, 0xff, + 0x4b, 0x07, 0x28, 0x5a, 0x3a, 0x48, 0x5b, 0x96, 0xee, 0x1f, 0xf1, 0xb4, + 0x9b, 0xb5, 0x64, 0xde, 0x1c, 0xd5, 0x3c, 0x1b, 0x98, 0x11, 0xc7, 0x0b, + 0x97, 0x00, 0x2f, 0x8f, 0xf9, 0x24, 0x4d, 0xba, 0x75, 0x6a, 0xce, 0xd8, + 0x7a, 0xee, 0x02, 0xd5, 0x19, 0xd6, 0x26, 0x40, 0xa7, 0x78, 0x76, 0x1a, + 0x17, 0xc2, 0xe6, 0x5a, 0x6e, 0x24, 0xb1, 0x17, 0xf8, 0x9f, 0xdc, 0x64, + 0xf0, 0x59, 0xc5, 0xfc, 0x4c, 0xbb, 0x3d, 0x3f, 0x70, 0x2c, 0x0d, 0xf5, + 0x6c, 0x96, 0x46, 0x1a, 0x1e, 0x5f, 0xd1, 0x3a, 0x00, 0x9a, 0x9d, 0x63, + 0xe6, 0xd1, 0xa2, 0x5a, 0x4a, 0x50, 0xa8, 0xd5, 0x91, 0x90, 0x69, 0x58, + 0x65, 0x00, 0xc7, 0xf1, 0xa6, 0x45, 0xfd, 0x5a, 0xe6, 0x05, 0x4b, 0xb2, + 0x3a, 0xdf, 0xa9, 0xd9, 0xe5, 0xa6, 0xe5, 0xe2, 0x5b, 0x3b, 0x2f, 0x57, + 0x6c, 0xc4, 0x06, 0xe1, 0x8e, 0x15, 0x98, 0xc8, 0x5e, 0x63, 0xba, 0x37, + 0xe6, 0x91, 0x5f, 0x1c, 0x5b, 0x77, 0xb5, 0x91, 0x07, 0x3a, 0xa6, 0x67, + 0x6d, 0xdf, 0x15, 0x62, 0x6b, 0x3b, 0xed, 0xa2, 0xc7, 0x46, 0x52, 0x8f, + 0xf2, 0x9f, 0x69, 0x00, 0xb8, 0x49, 0xcf, 0xd4, 0xf0, 0x95, 0x51, 0xda, + 0x0f, 0x4e, 0x0d, 0x11, 0x2f, 0x27, 0x73, 0xe9, 0x13, 0xcb, 0xa1, 0xfc, + 0x6b, 0x45, 0xf0, 0xfd, 0xc7, 0x17, 0xaa, 0x0c, 0xac, 0x98, 0xc4, 0x6c, + 0xf0, 0x32, 0x45, 0x67, 0xfe, 0x6f, 0x2e, 0xfb, 0xec, 0x19, 0xda, 0xbd, + 0x93, 0x5f, 0x50, 0xc2, 0x22, 0x9a, 0x3a, 0x5b, 0x31, 0xf5, 0x4e, 0x91, + 0xa6, 0xea, 0x67, 0xdd, 0x69, 0xf4, 0xd7, 0xea, 0x02, 0xbe, 0x55, 0x52, + 0xb9, 0x30, 0x21, 0xe5, 0xfc, 0x9a, 0x93, 0xd6, 0x6c, 0x33, 0x06, 0xb9, + 0xe3, 0xb0, 0x6a, 0xff, 0x9e, 0xc2, 0x5e, 0x1d, 0xd6, 0xdb, 0xa1, 0x60, + 0x34, 0x5d, 0x08, 0xf9, 0xeb, 0xd6, 0x1f, 0x90, 0xf1, 0xf4, 0x07, 0x47, + 0xbf, 0xd9, 0xc9, 0xe8, 0xcf, 0xce, 0xa5, 0x1d, 0xb0, 0xd9, 0xbe, 0xc7, + 0xfb, 0xcc, 0xac, 0x3e, 0x92, 0x59, 0x0d, 0x1d, 0x65, 0x16, 0xa3, 0xdc, + 0x9b, 0x72, 0x22, 0x46, 0x04, 0xca, 0xb3, 0x5a, 0x2f, 0x3d, 0x99, 0x5c, + 0xb5, 0xb9, 0x30, 0xe3, 0xde, 0x8c, 0xba, 0xc7, 0x4c, 0xe5, 0x34, 0x6e, + 0xf4, 0x75, 0xf4, 0x38, 0x01, 0xf1, 0x61, 0xb8, 0x2b, 0xc3, 0x6f, 0xae, + 0xd1, 0x0a, 0x9d, 0x48, 0xc9, 0xe7, 0xc3, 0xe7, 0xc9, 0xe1, 0x6f, 0x96, + 0xa0, 0xc2, 0x91, 0xfd, 0xad, 0x99, 0x48, 0xde, 0xfc, 0xa3, 0x6e, 0xe3, + 0x94, 0x0e, 0xb5, 0xf6, 0x24, 0x8b, 0xce, 0x70, 0x3c, 0xdc, 0xe2, 0x66, + 0x9f, 0xe3, 0x6b, 0xc5, 0xd1, 0x97, 0x38, 0x12, 0x46, 0x37, 0xd6, 0x9a, + 0x4c, 0x6d, 0x4a, 0x2d, 0xc3, 0x28, 0x20, 0x2f, 0x55, 0x67, 0x17, 0x71, + 0xd3, 0x5c, 0xdc, 0xa3, 0x23, 0x60, 0x25, 0x2d, 0xe0, 0xc2, 0xed, 0xee, + 0x67, 0x9f, 0x26, 0xfb, 0x2f, 0x63, 0xf2, 0x6a, 0x23, 0x45, 0x26, 0x2c, + 0x33, 0x8a, 0xf2, 0xd1, 0xb2, 0x77, 0x99, 0x98, 0xd6, 0x18, 0xfe, 0xf3, + 0xff, 0xa4, 0x36, 0x03, 0xf4, 0xf5, 0xb1, 0xca, 0xa3, 0x5f, 0xe2, 0xc6, + 0xb2, 0x55, 0x2c, 0xaa, 0x64, 0xef, 0x28, 0x3a, 0x9e, 0x98, 0x01, 0x57, + 0x49, 0x98, 0x61, 0x4f, 0x42, 0x57, 0x00, 0x19, 0xb9, 0xa8, 0xec, 0xed, + 0x2b, 0x63, 0xf3, 0x0c, 0x3a, 0x1f, 0x10, 0xab, 0xe9, 0x6e, 0x61, 0x69, + 0xd1, 0x2d, 0xf3, 0x1f, 0xaa, 0x00, 0x57, 0xe2, 0xab, 0x74, 0xcd, 0xff, + 0x97, 0x2c, 0x3b, 0x67, 0xae, 0xa3, 0xfc, 0x69, 0xa9, 0x4e, 0x42, 0x07, + 0xfc, 0xbf, 0x36, 0x1a, 0xef, 0x6d, 0x6d, 0x14, 0x61, 0x30, 0x27, 0x98, + 0xfa, 0xf8, 0xc9, 0x70, 0xb4, 0xaa, 0x53, 0x48, 0x72, 0x3f, 0x58, 0x69, + 0x8d, 0x08, 0xc8, 0x09, 0x2b, 0xfc, 0x1d, 0xa1, 0x92, 0xae, 0x62, 0xa0, + 0xea, 0x05, 0x40, 0xac, 0x9c, 0xaf, 0x0e, 0xf4, 0x1e, 0x45, 0x33, 0xee, + 0x31, 0x39, 0x08, 0x4b, 0x54, 0x02, 0x2d, 0x03, 0x1c, 0xe6, 0x2d, 0x0c, + 0xd0, 0x92, 0x44, 0xd6, 0xa1, 0x57, 0x4e, 0x17, 0xde, 0xe6, 0x4f, 0x6a, + 0x07, 0x9f, 0x58, 0xe2, 0x27, 0xdb, 0xa9, 0x0c, 0x19, 0x56, 0xa3, 0xb4, + 0xc4, 0xe8, 0xa3, 0x52, 0x9f, 0x6a, 0xc9, 0xb1, 0xda, 0xe9, 0xef, 0x12, + 0xc1, 0x6d, 0x5b, 0x04, 0x20, 0x93, 0xac, 0xf4, 0x38, 0x95, 0xdb, 0x50, + 0xa6, 0x2e, 0x5c, 0x3f, 0x2d, 0x32, 0x50, 0x03, 0x73, 0x64, 0x3a, 0xd5, + 0xfd, 0x98, 0x1c, 0x57, 0xc3, 0xe7, 0xf7, 0x14, 0x13, 0x15, 0x2a, 0xa2, + 0x5f, 0xa0, 0x67, 0xdd, 0x67, 0x00, 0x09, 0xc6, 0xfe, 0xad, 0x06, 0x4c, + 0x5e, 0x9a, 0x5b, 0x55, 0x06, 0x8c, 0x9a, 0x2a, 0x51, 0x0e, 0x4f, 0x15, + 0xcc, 0xe1, 0x53, 0x9c, 0x43, 0x37, 0xc1, 0x3e, 0x02, 0x4b, 0x98, 0x6f, + 0x9b, 0x60, 0x31, 0x2c, 0x2b, 0x9d, 0xda, 0xe0, 0x1d, 0xe4, 0x49, 0x66, + 0x65, 0x18, 0xfb, 0x24, 0x97, 0xe0, 0x2d, 0xf5, 0x44, 0x23, 0x09, 0x01, + 0xf9, 0xf5, 0x29, 0xff, 0x01, 0x36, 0xb9, 0x0e, 0x9b, 0xb3, 0x23, 0x1e, + 0xe5, 0x12, 0xbb, 0x3a, 0x04, 0x14, 0xb8, 0x23, 0x43, 0x95, 0xc1, 0x9d, + 0x57, 0x45, 0x46, 0x4c, 0x8f, 0x35, 0x25, 0x5f, 0x2b, 0xd9, 0xc6, 0xdd, + 0x61, 0xb8, 0xbb, 0x4d, 0x49, 0xef, 0x6e, 0x0c, 0x50, 0x07, 0xc9, 0x9b, + 0x2e, 0xb7, 0xbe, 0x23, 0xc3, 0xcf, 0x9d, 0xeb, 0x13, 0xc8, 0xeb, 0x72, + 0x51, 0x71, 0x69, 0x35, 0xf3, 0xce, 0x35, 0x45, 0x02, 0xba, 0x44, 0x5d, + 0xaf, 0xd0, 0xe5, 0x1d, 0x9b, 0x18, 0xbb, 0x62, 0xce, 0xaf, 0x40, 0x48, + 0x40, 0x2a, 0x5d, 0xcd, 0xa7, 0x2b, 0x8f, 0xf4, 0x4a, 0x4c, 0xe1, 0x59, + 0x40, 0x63, 0x33, 0xae, 0xd8, 0x9d, 0x4d, 0x11, 0x3d, 0x2d, 0x11, 0xc6, + 0x8c, 0xa9, 0xab, 0xa2, 0x08, 0xb8, 0xbf, 0x09, 0x66, 0xbc, 0xd7, 0xab, + 0xce, 0x0d, 0xe0, 0x9e, 0x51, 0x2f, 0x5c, 0xc7, 0x21, 0xb9, 0xcf, 0xc4, + 0x8b, 0xc0, 0x4b, 0x04, 0x1b, 0xfd, 0x43, 0xcf, 0xa4, 0x72, 0x62, 0x04, + 0x0b, 0x1f, 0x9f, 0x35, 0x9d, 0xa9, 0x19, 0x71, 0x06, 0xda, 0x03, 0x0f, + 0xcc, 0x3a, 0xf4, 0x3a, 0xaf, 0x07, 0x0f, 0xf2, 0x3e, 0x4a, 0xd3, 0x41, + 0x6a, 0x90, 0x35, 0x39, 0x4c, 0x1d, 0x2f, 0x05, 0xff, 0xcf, 0xc0, 0xbe, + 0x0f, 0xaf, 0x90, 0x4e, 0x45, 0x8c, 0x78, 0x4d, 0x6b, 0xf2, 0x47, 0x26, + 0xe9, 0x0d, 0xee, 0xd3, 0x97, 0x44, 0xaf, 0x6f, 0x95, 0x30, 0x9c, 0x08, + 0xe5, 0x18, 0x9e, 0xad, 0xd2, 0x2a, 0x0c, 0x21, 0x67, 0x50, 0x28, 0x4f, + 0x31, 0x9c, 0xee, 0xb2, 0x95, 0xbd, 0xef, 0xc0, 0xd0, 0x0d, 0xd4, 0x6e, + 0xff, 0x93, 0x12, 0xc3, 0x51, 0x41, 0xe4, 0x6c, 0x19, 0x09, 0xd7, 0x0a, + 0xe0, 0xea, 0x0a, 0xe7, 0xa8, 0x4b, 0x60, 0xd6, 0x0c, 0x4d, 0xb5, 0x29, + 0x01, 0x74, 0xf9, 0x40, 0x8c, 0x6b, 0x11, 0xf6, 0xe4, 0xc9, 0x3c, 0x1a, + 0xf7, 0xce, 0x2c, 0xd8, 0xe3, 0x0e, 0xc5, 0xb9, 0x6c, 0x40, 0x44, 0xc9, + 0x04, 0xf6, 0x5c, 0xe1, 0x9f, 0xc7, 0xe0, 0x68, 0xe7, 0x6a, 0x92, 0xe7, + 0xb2, 0x12, 0x72, 0x3f, 0xfd, 0xc3, 0x06, 0xeb, 0x0a, 0xab, 0x6d, 0xad, + 0x03, 0x0b, 0x5d, 0xcc, 0x49, 0x04, 0x52, 0x19, 0xd4, 0x9d, 0x67, 0xbf, + 0xd3, 0xf4, 0x22, 0x76, 0x99, 0x52, 0xf5, 0xb5, 0x15, 0x38, 0x58, 0x57, + 0x9a, 0xa2, 0xd1, 0xbb, 0x3a, 0x07, 0xe2, 0xd6, 0x8d, 0x69, 0x9e, 0x5c, + 0xf4, 0xba, 0xda, 0x4a, 0x4d, 0x73, 0xdc, 0x32, 0xfd, 0xe1, 0x3a, 0x16, + 0xf1, 0x09, 0x26, 0x3b, 0x2a, 0xa9, 0xa7, 0x2c, 0xd3, 0xcf, 0x6b, 0xc5, + 0xb5, 0xbc, 0x71, 0xb6, 0x9e, 0xa0, 0x6a, 0x69, 0xa5, 0xeb, 0x54, 0x87, + 0xe9, 0x4f, 0x69, 0x39, 0xc5, 0x54, 0x28, 0x55, 0xb9, 0xff, 0x5d, 0x9e, + 0x17, 0x8e, 0x8c, 0xd5, 0x14, 0x5c, 0xa7, 0x33, 0x5a, 0x2f, 0x2d, 0x37, + 0x0e, 0xf2, 0x54, 0x64, 0x9d, 0xdf, 0x49, 0xab, 0xd3, 0x0f, 0xbd, 0xad, + 0x19, 0xb9, 0xcf, 0x0f, 0x40, 0x62, 0x4b, 0x93, 0xd7, 0xf4, 0x3b, 0xee, + 0x2b, 0x97, 0xe3, 0x55, 0xb3, 0x5b, 0x3f, 0x93, 0xa5, 0xf1, 0x40, 0x99, + 0xa1, 0x69, 0xbd, 0xf3, 0xf0, 0xb1, 0x6e, 0x5c, 0xba, 0x4a, 0xc4, 0x51, + 0x8e, 0xe1, 0x5c, 0xb8, 0x92, 0xb5, 0x43, 0xc4, 0x9e, 0x38, 0x0d, 0xfb, + 0x60, 0xb3, 0xe6, 0x0f, 0x55, 0x94, 0x01, 0xaf, 0xaa, 0xc3, 0x6d, 0xea, + 0xb2, 0xfc, 0xb0, 0x06, 0x29, 0x0f, 0xd3, 0x95, 0xb9, 0xf1, 0x8b, 0xce, + 0xd3, 0x5d, 0x16, 0xbf, 0x5c, 0x24, 0xc5, 0x36, 0x98, 0x8c, 0x5b, 0x43, + 0xe7, 0xfe, 0x77, 0xda, 0xc5, 0xd8, 0xf6, 0x72, 0xba, 0xcf, 0x9c, 0x18, + 0x58, 0xb8, 0xe4, 0x1d, 0xf6, 0xfb, 0x3b, 0xb4, 0x1f, 0xea, 0xa3, 0xe3, + 0xd5, 0xbe, 0x3f, 0xd5, 0xf9, 0xc4, 0x00, 0x8e, 0x17, 0x22, 0x3d, 0x96, + 0xd8, 0xb6, 0xa5, 0xf6, 0xcd, 0x55, 0x48, 0x8b, 0x1b, 0x38, 0x9c, 0xd7, + 0x6d, 0x40, 0x2a, 0x5f, 0xcf, 0xcb, 0x67, 0xa4, 0x8c, 0xf4, 0x8f, 0x70, + 0x34, 0xeb, 0x70, 0xcd, 0xee, 0x1c, 0xbd, 0xae, 0xd1, 0xc1, 0xf8, 0x62, + 0x45, 0xb5, 0x5d, 0xe6, 0x0b, 0xd4, 0x3d, 0x23, 0xf0, 0x27, 0x44, 0x56, + 0x32, 0x4d, 0xb1, 0x6c, 0x5d, 0x33, 0x94, 0x77, 0xe3, 0xac, 0x54, 0x56, + 0x24, 0x05, 0x26, 0x4a, 0xf0, 0x59, 0xfb, 0x1f, 0xa4, 0x0f, 0xbe, 0x9e, + 0xbc, 0x76, 0x9d, 0x5a, 0xed, 0x15, 0x97, 0x4e, 0x05, 0x8a, 0x8b, 0xff, + 0xc7, 0x9b, 0x67, 0x32, 0x12, 0x41, 0x04, 0xcb, 0x24, 0xae, 0x9e, 0xcc, + 0xd6, 0xc6, 0x67, 0x53, 0xfa, 0x29, 0x37, 0x73, 0xc6, 0xdf, 0xf2, 0x56, + 0x72, 0x06, 0x03, 0xaa, 0x5d, 0x07, 0xac, 0x38, 0xb9, 0x2a, 0x61, 0x02, + 0x24, 0xcf, 0x54, 0x3f, 0x98, 0xb0, 0x5c, 0xba, 0xe3, 0x15, 0x27, 0x52, + 0x63, 0x43, 0x12, 0x62, 0x33, 0x02, 0xb8, 0x69, 0x52, 0x70, 0x6c, 0xc0, + 0x23, 0x37, 0x65, 0x4b, 0xc9, 0xea, 0x98, 0x06, 0xde, 0x3d, 0x59, 0x72, + 0x94, 0x48, 0x60, 0xeb, 0xe7, 0xaa, 0x68, 0x72, 0x22, 0x15, 0x39, 0xf0, + 0x47, 0x43, 0xeb, 0x37, 0xb1, 0x3b, 0x9e, 0x05, 0x12, 0xdb, 0x74, 0x18, + 0xfe, 0x11, 0xcb, 0xae, 0xe0, 0xed, 0x1c, 0xe3, 0x19, 0x71, 0x56, 0xa6, + 0x04, 0xe6, 0x20, 0x62, 0xfd, 0xb1, 0x57, 0x44, 0xca, 0x3f, 0xdf, 0x51, + 0x23, 0x76, 0x3b, 0x70, 0x27, 0x33, 0x62, 0x74, 0x94, 0xff, 0x70, 0xcc, + 0xd4, 0xbf, 0x67, 0x12, 0x17, 0x5f, 0x71, 0xf8, 0x8f, 0x09, 0xca, 0xb5, + 0x49, 0x38, 0xcf, 0x1f, 0x94, 0x9a, 0xe6, 0x76, 0x0e, 0xa6, 0x5a, 0x2c, + 0x36, 0x61, 0x41, 0x2d, 0x14, 0x2f, 0x35, 0xa2, 0xaa, 0x2d, 0xd5, 0x54, + 0x3c, 0x4e, 0xa0, 0x63, 0xa9, 0x9e, 0xe9, 0x65, 0x62, 0xcf, 0x5a, 0x1a, + 0xb9, 0x70, 0xf7, 0xf1, 0x8a, 0xc7, 0x19, 0x6e, 0x34, 0xa0, 0xbb, 0x1b, + 0x76, 0x9b, 0x60, 0x20, 0xfd, 0xff, 0xe1, 0x40, 0x5e, 0xd7, 0x49, 0xd3, + 0x3c, 0x0f, 0x52, 0xae, 0x37, 0x38, 0x1d, 0xd5, 0xd0, 0xe7, 0xd6, 0xfc, + 0x06, 0x3b, 0x50, 0x06, 0x9c, 0xb4, 0x37, 0x9a, 0x53, 0x09, 0x56, 0xa4, + 0xa8, 0x64, 0x70, 0xa7, 0xaf, 0xb9, 0xd9, 0x19, 0xbc, 0x5b, 0x04, 0x07, + 0x68, 0xc0, 0xa4, 0xc0, 0x3d, 0x32, 0x36, 0x94, 0x24, 0xd3, 0x36, 0x1f, + 0xfc, 0xd8, 0x26, 0x49, 0x94, 0xd2, 0x1e, 0x8b, 0x0c, 0x70, 0x6e, 0xd7, + 0xd2, 0x37, 0x8f, 0x13, 0xef, 0x41, 0xdb, 0x53, 0xb5, 0xba, 0xe5, 0xe3, + 0x0c, 0xcd, 0xa3, 0xfa, 0x74, 0x16, 0xd9, 0x42, 0x10, 0xa3, 0xe6, 0x26, + 0xd6, 0x74, 0xbc, 0x17, 0x9b, 0x2e, 0x4c, 0xe2, 0x13, 0x49, 0x0f, 0xc9, + 0xc2, 0x34, 0xae, 0x5b, 0x6b, 0x46, 0xbc, 0xc4, 0x62, 0xa0, 0x4a, 0x18, + 0x62, 0x69, 0x1c, 0xc3, 0x78, 0x36, 0xfa, 0xd9, 0x8d, 0xd0, 0xf9, 0x4f, + 0x56, 0x90, 0x4b, 0xca, 0xc4, 0xdd, 0x64, 0x2c, 0xd1, 0x3c, 0xa8, 0xbe, + 0x62, 0x8f, 0x2a, 0x11, 0x93, 0x71, 0x75, 0x70, 0x43, 0xd0, 0x5f, 0xfb, + 0x36, 0x2b, 0x35, 0x26, 0xda, 0xda, 0x25, 0x3c, 0x17, 0xf2, 0xb7, 0x36, + 0xd7, 0x8d, 0xd1, 0xbc, 0x2f, 0xe7, 0xf8, 0x55, 0x42, 0x2e, 0xe1, 0xc0, + 0x4a, 0xee, 0x3d, 0x5b, 0xc9, 0x69, 0x15, 0xc5, 0x42, 0x03, 0x2c, 0x46, + 0x02, 0x94, 0x91, 0xfb, 0x0f, 0x98, 0x8d, 0x32, 0xdf, 0x0b, 0x19, 0xda, + 0x9f, 0x96, 0x6e, 0x2d, 0xc4, 0xa1, 0x92, 0xc1, 0x73, 0x2f, 0x23, 0x9f, + 0x55, 0xc5, 0xb4, 0x8c, 0xef, 0xf3, 0xa2, 0x94, 0x8f, 0x6c, 0xd8, 0xb1, + 0x9d, 0x0d, 0x17, 0x93, 0x21, 0xd7, 0xae, 0xa8, 0x41, 0xd3, 0xf1, 0x9a, + 0xe3, 0x36, 0xca, 0x5f, 0xa4, 0xd9, 0xaf, 0x34, 0xbf, 0xe6, 0x9e, 0x4c, + 0xf0, 0xd1, 0xb0, 0x8c, 0x8e, 0x76, 0x3d, 0xb3, 0xf7, 0xd9, 0xfb, 0xbf, + 0x72, 0xae, 0xa8, 0x39, 0x00, 0xe5, 0x53, 0x17, 0x6c, 0x4e, 0x06, 0x22, + 0xc0, 0x10, 0xe7, 0x4d, 0xff, 0x75, 0x03, 0x01, 0x18, 0x46, 0xfd, 0xde, + 0x1e, 0x95, 0x46, 0xb8, 0x5b, 0x36, 0xbc, 0x1d, 0x95, 0x05, 0x8f, 0x5d, + 0x38, 0x41, 0x25, 0x2c, 0x9b, 0x34, 0x75, 0x9b, 0xf0, 0x8b, 0xaf, 0x0d, + 0x2e, 0xc2, 0x1a, 0x03, 0x61, 0xbe, 0xe8, 0x49, 0xbc, 0x9b, 0x45, 0xfb, + 0x35, 0x2b, 0x6c, 0xa1, 0x96, 0xa0, 0x08, 0x0e, 0xca, 0x01, 0xc0, 0x97, + 0xfa, 0xdf, 0x11, 0x1a, 0x0d, 0xf9, 0xc2, 0x5a, 0xe1, 0x4c, 0xb5, 0x37, + 0xff, 0x91, 0xb6, 0x96, 0xbf, 0x62, 0x04, 0x59, 0x69, 0x01, 0x68, 0x66, + 0x52, 0x66, 0x4a, 0x49, 0xe9, 0xe6, 0xe4, 0x44, 0x92, 0x5e, 0xaf, 0xf5, + 0x24, 0xdb, 0x6f, 0x21, 0xf9, 0x21, 0x58, 0x5f, 0xc4, 0xf0, 0x30, 0x90, + 0x68, 0xff, 0x58, 0x5c, 0xbd, 0x6f, 0x58, 0x77, 0xe0, 0x03, 0x68, 0x2a, + 0x1a, 0xa4, 0xd6, 0x9d, 0xd0, 0x38, 0x5a, 0xbd, 0x52, 0xa8, 0xc5, 0xf0, + 0xbc, 0xf2, 0x04, 0x49, 0x0e, 0x1b, 0x1b, 0x93, 0xc0, 0x65, 0xca, 0x05, + 0x42, 0x11, 0x03, 0xd6, 0xd5, 0x2c, 0x4c, 0xcd, 0xed, 0xb4, 0x54, 0xa4, + 0x3d, 0x46, 0x64, 0x4c, 0xc4, 0x8f, 0x0a, 0x95, 0x6a, 0x4f, 0xfb, 0x2e, + 0x1d, 0x5a, 0x8a, 0xcb, 0x31, 0x94, 0x21, 0x54, 0x51, 0xf5, 0x4e, 0x3e, + 0x32, 0x00, 0x12, 0x8e, 0x4c, 0x8c, 0x17, 0x90, 0xea, 0x8d, 0xfe, 0xc3, + 0xfe, 0x69, 0x10, 0xd9, 0x1c, 0x60, 0x91, 0xb6, 0xbb, 0x11, 0xb7, 0x77, + 0x1c, 0x69, 0xec, 0xb5, 0x28, 0x1e, 0x4b, 0xc8, 0xac, 0xe2, 0xe7, 0xe4, + 0xca, 0x1c, 0x6a, 0x16, 0xb8, 0x0a, 0x1c, 0xcb, 0xbd, 0x0e, 0x61, 0xf6, + 0x30, 0xa0, 0xb0, 0x11, 0x57, 0xd0, 0xa0, 0xe5, 0x63, 0xb4, 0x5e, 0x65, + 0x54, 0xbd, 0x2b, 0xcf, 0x92, 0xb3, 0xe2, 0xad, 0xba, 0x6b, 0xd8, 0x8b, + 0xd4, 0xc9, 0x49, 0x6b, 0xe9, 0x6f, 0x30, 0x9a, 0x8d, 0x1a, 0xd2, 0x73, + 0xed, 0x01, 0x20, 0x76, 0x59, 0x3b, 0x63, 0x15, 0xf7, 0x4a, 0x93, 0xf5, + 0xe8, 0xaa, 0x77, 0xf7, 0xee, 0x16, 0x26, 0x6d, 0x6d, 0x1e, 0xb3, 0x04, + 0xd1, 0x36, 0x6d, 0xdb, 0xe1, 0xee, 0xdf, 0x69, 0x0e, 0x28, 0x3b, 0x5a, + 0x37, 0x51, 0x61, 0x10, 0x58, 0xd0, 0x58, 0x75, 0x63, 0x5b, 0x76, 0x3e, + 0x55, 0x0a, 0x07, 0x3e, 0xfe, 0xb9, 0x6e, 0x4c, 0xfc, 0x1b, 0x8a, 0xa5, + 0x03, 0x1a, 0xb9, 0x04, 0x22, 0x60, 0x33, 0x66, 0xda, 0xb7, 0x1c, 0x3a, + 0xb6, 0x92, 0x45, 0x01, 0xc2, 0x73, 0x49, 0x6a, 0x9a, 0x54, 0x10, 0xe2, + 0x36, 0x45, 0xbd, 0x1d, 0x33, 0x2a, 0xd2, 0xc9, 0x70, 0x63, 0x39, 0xcf, + 0xf7, 0x76, 0x70, 0x37, 0xde, 0x23, 0x4c, 0xd2, 0xa1, 0x37, 0x2c, 0x52, + 0xae, 0xa3, 0xfb, 0x45, 0xd0, 0xb9, 0x46, 0x3e, 0x2a, 0xe8, 0xe9, 0x64, + 0xe1, 0x16, 0x30, 0x08, 0x36, 0xcd, 0x9e, 0x15, 0x44, 0xdd, 0x27, 0xa9, + 0x1c, 0x29, 0xf1, 0xa7, 0x20, 0x21, 0x59, 0x61, 0x4c, 0xbe, 0x5e, 0x20, + 0x36, 0xca, 0xb8, 0x6d, 0xb5, 0x0c, 0x29, 0x41, 0xa1, 0xd3, 0x8a, 0x2b, + 0x34, 0xd2, 0x5b, 0x92, 0x12, 0x1f, 0x36, 0x9f, 0x5d, 0x02, 0x2a, 0xca, + 0xac, 0x5b, 0x29, 0x8b, 0x51, 0x3a, 0x65, 0xf5, 0xdf, 0x60, 0x6c, 0x0c, + 0xa7, 0x95, 0x3d, 0x52, 0x13, 0xb4, 0xbd, 0x8c, 0xf1, 0xac, 0xba, 0x3c, + 0x24, 0x6c, 0xc0, 0xdb, 0xa8, 0x5b, 0xd4, 0xdb, 0xf5, 0xcd, 0xaf, 0xdf, + 0x2f, 0xe2, 0x71, 0xcc, 0x00, 0x3a, 0x87, 0xdc, 0x23, 0xdf, 0xa7, 0xb0, + 0xb6, 0xcb, 0xff, 0x1c, 0xe7, 0xfe, 0xa8, 0xa8, 0xea, 0xad, 0x37, 0x58, + 0xfd, 0x58, 0x01, 0xa5, 0xe4, 0x5d, 0xdf, 0x4a, 0x10, 0x0b, 0xc3, 0x5e, + 0xd1, 0x0d, 0x4c, 0x21, 0x0e, 0x51, 0x95, 0x99, 0x58, 0xdf, 0x6d, 0xa8, + 0x8e, 0xf7, 0x51, 0xa6, 0x53, 0x44, 0x6b, 0xb3, 0x00, 0x64, 0xe1, 0x6f, + 0x3d, 0x19, 0x40, 0x30, 0x46, 0x95, 0x9b, 0x39, 0xa5, 0x0d, 0x77, 0xaa, + 0xb1, 0x57, 0x57, 0x08, 0xe0, 0xab, 0xd1, 0xd5, 0x25, 0x59, 0x11, 0x2f, + 0x62, 0xbf, 0x50, 0x95, 0x02, 0x18, 0xdb, 0x2d, 0xbc, 0xdb, 0xfa, 0x3d, + 0x45, 0xab, 0xb5, 0x2e, 0x8e, 0x9b, 0x49, 0xe5, 0x50, 0xbd, 0x1f, 0x1c, + 0x64, 0xd8, 0x9d, 0x0c, 0x0c, 0xe8, 0xf3, 0x54, 0x49, 0x95, 0x3d, 0x71, + 0xa1, 0x16, 0x98, 0x08, 0x16, 0x37, 0x6a, 0x95, 0xa3, 0xaa, 0xb6, 0xf7, + 0x0e, 0x99, 0x2a, 0x0b, 0x68, 0x49, 0xd1, 0xa4, 0x33, 0x3e, 0x57, 0xfc, + 0xc3, 0x5a, 0xa9, 0x1e, 0xbf, 0xf1, 0x19, 0x2d, 0xee, 0xfa, 0x01, 0xa8, + 0x64, 0x0d, 0x74, 0x54, 0xed, 0x4d, 0xab, 0xad, 0x23, 0x25, 0xde, 0xef, + 0xb4, 0x54, 0xfe, 0x3f, 0xba, 0xe0, 0x0e, 0x76, 0x1b, 0x1a, 0xa9, 0xe3, + 0x53, 0xbd, 0xde, 0x65, 0x6b, 0x08, 0x6d, 0x71, 0x45, 0xb4, 0xf8, 0x9a, + 0x06, 0x3d, 0xae, 0x87, 0x25, 0x51, 0x9d, 0x46, 0x33, 0xf3, 0x77, 0x6d, + 0xb6, 0x5d, 0xbe, 0x08, 0xfc, 0xf5, 0x31, 0xa1, 0xd5, 0x22, 0x19, 0xcd, + 0x66, 0x82, 0x19, 0xf5, 0xf5, 0x29, 0x28, 0x83, 0xa5, 0xa3, 0x30, 0x50, + 0xa1, 0xfb, 0xf6, 0x36, 0x31, 0xbf, 0xb5, 0xc4, 0xe7, 0x99, 0xd5, 0x4f, + 0xf5, 0xb0, 0xf5, 0x9a, 0x12, 0x4e, 0x1b, 0xdb, 0x4d, 0x21, 0x6d, 0xda, + 0xeb, 0x6a, 0x11, 0x55, 0xa2, 0xe2, 0x6a, 0xe9, 0xe8, 0x01, 0xa1, 0x97, + 0x68, 0xc2, 0x30, 0xd2, 0xfa, 0x60, 0xec, 0x4d, 0x54, 0x5b, 0x9e, 0x2d, + 0x97, 0xca, 0x1b, 0xc2, 0xb2, 0x14, 0x3f, 0xaf, 0x23, 0x54, 0xe8, 0x0c, + 0x3c, 0xed, 0x50, 0x32, 0xff, 0x3a, 0x8c, 0xe6, 0xdc, 0x17, 0xad, 0x65, + 0x05, 0x35, 0x28, 0xc9, 0x77, 0x21, 0xb1, 0x9a, 0xec, 0xf1, 0xd6, 0x53, + 0xb9, 0xb3, 0xe0, 0x41, 0x11, 0x85, 0x2e, 0x1a, 0xb5, 0xad, 0xab, 0x9b, + 0xae, 0x69, 0xa0, 0xb1, 0xa0, 0x07, 0x72, 0x8f, 0x4a, 0xd9, 0x5e, 0x1f, + 0x29, 0x9e, 0x4d, 0x0b, 0x9a, 0x82, 0xfe, 0x26, 0xc5, 0x17, 0x5b, 0x51, + 0x46, 0xf2, 0xf7, 0x27, 0xba, 0x06, 0x91, 0x0e, 0xc2, 0x07, 0xb3, 0x1b, + 0x54, 0xad, 0xb5, 0xf5, 0x02, 0xc1, 0x39, 0x6a, 0x2a, 0xd7, 0x46, 0xbf, + 0x3d, 0x39, 0x4e, 0x8e, 0xb1, 0x58, 0xf4, 0x90, 0xa7, 0x08, 0x0e, 0x99, + 0x64, 0x33, 0x3e, 0x1e, 0x09, 0xb7, 0x88, 0xa0, 0x29, 0xb2, 0x0b, 0x5c, + 0x15, 0xd4, 0x36, 0x55, 0x42, 0x48, 0xe7, 0x47, 0xf9, 0xb5, 0x05, 0xcd, + 0x40, 0xde, 0x92, 0x27, 0x11, 0x3b, 0xad, 0x3e, 0x9b, 0x95, 0x38, 0xad, + 0x11, 0xd5, 0x9d, 0x1d, 0x38, 0x60, 0xde, 0x31, 0xe3, 0x40, 0xb2, 0xf2, + 0x8e, 0xb4, 0x03, 0xaa, 0x51, 0x15, 0xe4, 0x36, 0x4d, 0x43, 0x05, 0xbc, + 0x36, 0x82, 0xdf, 0xfc, 0xfd, 0x23, 0x4d, 0xad, 0x9f, 0xf4, 0xce, 0xfb, + 0xaf, 0x46, 0xb3, 0x59, 0x98, 0x91, 0x85, 0x4a, 0xa7, 0x67, 0x70, 0xbd, + 0xca, 0x12, 0x9b, 0x6b, 0x00, 0xe5, 0x82, 0x3c, 0x37, 0x99, 0x8d, 0x6b, + 0x32, 0xaf, 0x08, 0x05, 0x36, 0xd6, 0xd7, 0xfb, 0x65, 0xce, 0x4e, 0x9f, + 0xd5, 0xd1, 0x3a, 0x42, 0xb0, 0x31, 0x62, 0xd0, 0xe2, 0xe5, 0x37, 0xc1, + 0x6d, 0x8a, 0x24, 0xa4, 0x19, 0xc2, 0x59, 0x3c, 0x44, 0xef, 0x96, 0xf6, + 0x35, 0x00, 0xe7, 0xe6, 0x2e, 0x82, 0xa5, 0x4a, 0x2f, 0xa2, 0xfe, 0x1f, + 0x53, 0x52, 0x31, 0x97, 0x47, 0x37, 0x15, 0x26, 0xa7, 0x8d, 0xd3, 0x21, + 0x6a, 0x98, 0x6d, 0xf1, 0xe6, 0x29, 0xf8, 0x9d, 0xaf, 0x5f, 0x3e, 0x3a, + 0xbc, 0x65, 0xb2, 0xd8, 0x41, 0xbc, 0xd6, 0x39, 0x3c, 0xc7, 0x2f, 0x2e, + 0xa3, 0x08, 0x9a, 0x21, 0x05, 0xe0, 0x4c, 0x06, 0x4d, 0x82, 0x68, 0x5d, + 0x4a, 0x9e, 0xca, 0xee, 0x3d, 0x28, 0x45, 0x0e, 0xff, 0xdd, 0xe6, 0x46, + 0xbc, 0xf8, 0x19, 0x5b, 0xda, 0xf4, 0x14, 0xd1, 0x4f, 0x02, 0x6e, 0xf6, + 0x01, 0x2d, 0xd6, 0xb6, 0x8b, 0xf5, 0x9c, 0x4e, 0xee, 0xe7, 0xc8, 0x10, + 0x05, 0xb6, 0x6d, 0x8d, 0x49, 0xe2, 0x04, 0xec, 0x4d, 0x61, 0x67, 0xc2, + 0x19, 0x27, 0xab, 0xe1, 0x0d, 0x29, 0xab, 0xf2, 0xa0, 0xf9, 0x69, 0x0d, + 0x81, 0x29, 0x4d, 0x40, 0x6d, 0xd7, 0xda, 0xb7, 0x9e, 0x0b, 0x90, 0x9c, + 0x9b, 0xeb, 0x59, 0x2c, 0xc9, 0xa4, 0x85, 0x95, 0xe2, 0xda, 0x2d, 0xe4, + 0x60, 0x9a, 0x64, 0x21, 0xbf, 0x1d, 0x57, 0x4d, 0x3e, 0xa0, 0x35, 0x0f, + 0xce, 0xd7, 0xe1, 0x44, 0x63, 0x9e, 0xe8, 0x8e, 0xbd, 0xc8, 0xc1, 0x65, + 0xe1, 0xd2, 0x09, 0x45, 0xd3, 0xbd, 0x13, 0xb2, 0x1f, 0x46, 0x32, 0xa6, + 0xcd, 0xa3, 0x44, 0x4c, 0x52, 0xa7, 0xe7, 0x54, 0xea, 0xe6, 0xa0, 0xce, + 0x02, 0x8b, 0x69, 0xdb, 0xde, 0xef, 0x5f, 0xcb, 0x6f, 0x6e, 0x0f, 0xf5, + 0x68, 0x42, 0xf4, 0x37, 0x08, 0x1f, 0x87, 0x55, 0xb4, 0xbc, 0x8a, 0x84, + 0x84, 0x10, 0xc6, 0x36, 0x3e, 0x8a, 0x6b, 0x4e, 0xd5, 0xc8, 0x64, 0xcb, + 0xb5, 0xc0, 0xfe, 0x99, 0x66, 0xaa, 0xb1, 0x50, 0xa7, 0x70, 0xd9, 0xa6, + 0x17, 0x2d, 0xd4, 0xad, 0xdf, 0xf2, 0x2f, 0xac, 0xae, 0xae, 0x12, 0xcf, + 0x5b, 0x09, 0xf2, 0x2d, 0xb4, 0x21, 0xc9, 0xd1, 0x58, 0xdb, 0x4e, 0x9b, + 0xe0, 0x32, 0x08, 0xe4, 0x4a, 0xe6, 0x9c, 0x61, 0x25, 0x90, 0x08, 0xf2, + 0xb1, 0xc1, 0x3c, 0x25, 0x0b, 0x5a, 0x03, 0x40, 0xdb, 0x06, 0x5f, 0xd2, + 0x60, 0x8e, 0x0a, 0x5b, 0xc8, 0xa2, 0xcd, 0xac, 0xb3, 0x54, 0x0b, 0xb6, + 0x05, 0x45, 0xd7, 0xa8, 0x8a, 0xfa, 0x8a, 0xba, 0x09, 0x53, 0x81, 0xd7, + 0xf5, 0x40, 0x61, 0x46, 0xf2, 0x22, 0xe4, 0x21, 0xb4, 0x26, 0x41, 0x10, + 0x25, 0x4d, 0x93, 0xc2, 0xa2, 0xae, 0xc3, 0xaa, 0xbe, 0x71, 0xa6, 0xaa, + 0xf7, 0xb1, 0xbf, 0x02, 0x22, 0xe9, 0xd7, 0xfb, 0xaa, 0x1d, 0x5d, 0xf5, + 0xe7, 0x5b, 0x63, 0xf2, 0xe6, 0x5c, 0xd6, 0x24, 0x6d, 0xb5, 0xca, 0xa3, + 0xe7, 0x57, 0x1a, 0xa5, 0xf7, 0x95, 0xc5, 0x92, 0x51, 0x65, 0x68, 0xc5, + 0xe6, 0x27, 0xa9, 0x94, 0x8a, 0xb6, 0xec, 0x0d, 0x9c, 0x51, 0xdf, 0x22, + 0xca, 0xdf, 0x5a, 0xf5, 0xe4, 0xad, 0xf4, 0xfc, 0x1f, 0x68, 0x9f, 0xdb, + 0x40, 0x4e, 0x6a, 0x1e, 0x5a, 0xd8, 0x6c, 0xd6, 0xef, 0xad, 0x64, 0xe7, + 0xcb, 0xfc, 0x44, 0xae, 0xa5, 0x62, 0x65, 0xad, 0x2e, 0x6a, 0x46, 0xcf, + 0x0d, 0xd0, 0x46, 0x5e, 0x87, 0x37, 0xb6, 0xab, 0x70, 0x52, 0xee, 0x5a, + 0xa7, 0x13, 0xa3, 0xc3, 0x4b, 0x62, 0xe7, 0x31, 0x10, 0xed, 0x39, 0x1c, + 0x4a, 0xe3, 0xc1, 0x57, 0xcb, 0x45, 0xe4, 0x89, 0xee, 0x0e, 0x24, 0xc1, + 0xa6, 0xac, 0xd4, 0x0e, 0x9b, 0xe0, 0x26, 0x28, 0x08, 0x2b, 0xe1, 0xc9, + 0x42, 0x37, 0xa3, 0x46, 0xcc, 0x5d, 0x89, 0x10, 0x1f, 0x23, 0xcb, 0x1c, + 0x67, 0xe2, 0x6d, 0xaa, 0x66, 0xa5, 0xf5, 0xea, 0x94, 0x2b, 0x8c, 0xf6, + 0xf4, 0xd3, 0xfb, 0x9c, 0x96, 0x0a, 0x87, 0xaf, 0x5c, 0x19, 0xb4, 0x3b, + 0x26, 0xb2, 0x48, 0x55, 0x97, 0xfd, 0x3a, 0xec, 0x06, 0xe4, 0x58, 0x99, + 0x9a, 0x26, 0x4f, 0xe0, 0x9c, 0x67, 0x09, 0x05, 0x5b, 0x72, 0x8e, 0xd6, + 0xe4, 0x4e, 0xe2, 0x63, 0xb0, 0x9c, 0xf6, 0x92, 0xd3, 0x05, 0x3f, 0xb0, + 0x04, 0x5f, 0x02, 0x97, 0xf4, 0x42, 0x1d, 0x3b, 0x5c, 0x44, 0x00, 0x95, + 0x8b, 0xf5, 0x06, 0x40, 0xbd, 0xb8, 0xf7, 0x4b, 0x4a, 0xfa, 0xf0, 0x04, + 0x04, 0xd0, 0xa5, 0xb9, 0x3a, 0xa0, 0x2d, 0x0c, 0x1b, 0xec, 0x5a, 0x14, + 0xc8, 0x1d, 0x93, 0x86, 0xfd, 0x16, 0x68, 0xf8, 0x16, 0x9b, 0xb4, 0x88, + 0x99, 0x63, 0x0e, 0xd5, 0x20, 0x07, 0x43, 0x28, 0x26, 0xba, 0xf9, 0x97, + 0xed, 0x6b, 0x40, 0xb8, 0x07, 0x73, 0x59, 0xd5, 0x55, 0xa8, 0x64, 0x14, + 0x1c, 0xc5, 0xc0, 0x1f, 0x8d, 0x09, 0xae, 0x9c, 0x66, 0xa1, 0x94, 0xca, + 0x14, 0x46, 0xed, 0x46, 0x46, 0x25, 0x63, 0x5b, 0x2b, 0x95, 0x85, 0x05, + 0xc2, 0xb7, 0xeb, 0x06, 0x30, 0x5a, 0xf6, 0x22, 0x4e, 0x47, 0x1e, 0x0e, + 0x0c, 0xad, 0xd5, 0x11, 0xa8, 0x6a, 0x89, 0xd5, 0x49, 0xd4, 0xfa, 0x43, + 0xb0, 0x32, 0xb0, 0xb9, 0xb3, 0xda, 0x3f, 0x4f, 0xac, 0x4c, 0xc1, 0xa7, + 0x9f, 0xc2, 0xc2, 0x04, 0x70, 0xa2, 0x08, 0x01, 0xeb, 0x10, 0xa4, 0xa5, + 0x4c, 0xcd, 0xb3, 0x81, 0x4e, 0xbe, 0x6c, 0x51, 0x44, 0xf8, 0x82, 0xbd, + 0x42, 0x34, 0xfb, 0xdb, 0xb4, 0x32, 0xd2, 0x93, 0x63, 0x5e, 0xf6, 0x07, + 0x6e, 0x2c, 0xc2, 0xcf, 0xf4, 0x5d, 0x84, 0xe9, 0x5e, 0x5c, 0xa8, 0x39, + 0x28, 0x4a, 0xed, 0x15, 0x1b, 0xea, 0xe6, 0xde, 0x85, 0x92, 0x86, 0xe7, + 0x83, 0x4b, 0x87, 0xf7, 0x23, 0x60, 0xe2, 0x22, 0xd3, 0x32, 0x16, 0x4e, + 0x2f, 0xde, 0x01, 0x8b, 0x48, 0xea, 0xcd, 0x8a, 0x8b, 0xbc, 0xc6, 0x64, + 0xb2, 0x67, 0x47, 0xf5, 0x98, 0xf8, 0xca, 0xf1, 0x83, 0x66, 0xd7, 0x9a, + 0xef, 0xca, 0x20, 0xc2, 0xec, 0x8c, 0x38, 0xb1, 0x37, 0x13, 0x93, 0x92, + 0xba, 0xa1, 0xee, 0x6a, 0x57, 0x43, 0xaa, 0xdc, 0xdf, 0xa4, 0x3f, 0xc6, + 0xb6, 0xd6, 0x68, 0x54, 0xab, 0x36, 0xe9, 0x0f, 0x6f, 0xd5, 0xa1, 0x1b, + 0xa1, 0x02, 0xc9, 0x41, 0xef, 0x4f, 0x86, 0xcc, 0x1a, 0xfa, 0xd2, 0xdd, + 0x87, 0x04, 0xe0, 0x27, 0x38, 0xcf, 0x91, 0x95, 0xb4, 0x02, 0x10, 0x1d, + 0xc3, 0xcc, 0x6f, 0xaf, 0xbc, 0x94, 0x64, 0x47, 0xbc, 0x37, 0xde, 0xe3, + 0x2e, 0x89, 0x03, 0xb6, 0xd3, 0x28, 0x4a, 0x5e, 0x6d, 0x1e, 0xc5, 0x1a, + 0xa5, 0x0c, 0x92, 0xf7, 0xe2, 0x19, 0xe7, 0x39, 0xf0, 0xf2, 0x49, 0x8b, + 0xe6, 0x99, 0xd8, 0x4b, 0x0d, 0x6e, 0x3f, 0x57, 0x89, 0x9e, 0x0d, 0x34, + 0x4b, 0x52, 0xcd, 0x18, 0x57, 0xc7, 0x8e, 0x48, 0x03, 0x65, 0xd4, 0xdd, + 0xdf, 0x04, 0xf5, 0x39, 0x5e, 0x97, 0xbc, 0xc0, 0xc5, 0x91, 0xe7, 0x9d, + 0xbe, 0x28, 0x4c, 0xe7, 0xf4, 0xa0, 0x34, 0xee, 0xba, 0xa7, 0x8d, 0x52, + 0xc4, 0x07, 0x14, 0xd2, 0x93, 0xb0, 0x1d, 0x61, 0x53, 0x23, 0xc3, 0xe1, + 0xd2, 0xbf, 0xe1, 0xd6, 0x1f, 0x27, 0xcc, 0x8c, 0xe7, 0x0b, 0x09, 0x4f, + 0xe6, 0xa2, 0x41, 0xf4, 0x31, 0xbe, 0x95, 0x17, 0xfb, 0x50, 0xa4, 0xa4, + 0x51, 0x3c, 0x6f, 0xf8, 0x6a, 0xba, 0xac, 0xe4, 0x1e, 0x38, 0x78, 0x18, + 0x58, 0x31, 0x69, 0xc9, 0x52, 0xb0, 0xfc, 0x71, 0x54, 0xad, 0xe2, 0x8e, + 0xa2, 0xf2, 0x8e, 0x58, 0x11, 0x1d, 0xcc, 0x30, 0x74, 0x55, 0x41, 0x02, + 0x9b, 0x2a, 0x2f, 0x17, 0x97, 0xe4, 0x1a, 0xd0, 0xd5, 0x8f, 0x60, 0x10, + 0xdb, 0xc2, 0x69, 0x94, 0x0d, 0xaf, 0x44, 0xd0, 0x95, 0x3d, 0x50, 0xf4, + 0x27, 0x5e, 0xdc, 0x56, 0x5f, 0xa7, 0x4c, 0x41, 0xe5, 0x9e, 0xc8, 0x31, + 0xb0, 0x8e, 0x3f, 0xde, 0xdc, 0x42, 0x24, 0x93, 0x98, 0xce, 0x69, 0x90, + 0x98, 0x73, 0x06, 0xb9, 0x8e, 0xa4, 0x8d, 0x97, 0xb1, 0x41, 0x33, 0x64, + 0x5a, 0xae, 0xe8, 0x2f, 0x5f, 0x99, 0x64, 0x3e, 0xea, 0xd4, 0xbe, 0xa2, + 0x52, 0x2d, 0xc7, 0x56, 0x46, 0xfb, 0x33, 0xd8, 0xde, 0xe6, 0x74, 0xf6, + 0x2e, 0x2a, 0x26, 0xa1, 0x07, 0xcd, 0x3c, 0xca, 0x39, 0x74, 0x61, 0x4a, + 0x53, 0xf7, 0x8c, 0xd7, 0x3c, 0x4f, 0x4f, 0xd9, 0x14, 0x74, 0x56, 0xa8, + 0x3b, 0x3b, 0xe4, 0xe5, 0x70, 0x2e, 0xda, 0xde, 0xcd, 0x65, 0x4f, 0x2e, + 0xb6, 0x76, 0x17, 0x59, 0x6a, 0xaf, 0x0a, 0x24, 0x8c, 0x99, 0x0b, 0x2a, + 0xac, 0x46, 0x74, 0x2c, 0x3b, 0x40, 0x20, 0xad, 0x30, 0xab, 0x63, 0x34, + 0x8f, 0x30, 0x22, 0x50, 0x5c, 0xf8, 0x73, 0x21, 0x3e, 0xeb, 0x16, 0x44, + 0x30, 0xb9, 0x59, 0x0f, 0xf0, 0xe5, 0xb6, 0x6a, 0xde, 0x32, 0x03, 0x28, + 0x3c, 0xc8, 0xc2, 0x8d, 0x6b, 0x72, 0x2f, 0x3e, 0x2b, 0x99, 0xc1, 0xa6, + 0xdf, 0x5a, 0x91, 0x2d, 0x40, 0x39, 0xb2, 0x24, 0x27, 0x25, 0x26, 0x51, + 0xbb, 0xb5, 0x6a, 0x47, 0x38, 0x94, 0x2c, 0x3e, 0xa0, 0x96, 0x19, 0xf7, + 0x99, 0x0c, 0x34, 0x41, 0xb9, 0x0d, 0xad, 0x37, 0xa6, 0x0c, 0x38, 0x9c, + 0xee, 0x03, 0x68, 0x62, 0x76, 0x64, 0x18, 0x63, 0x62, 0x10, 0xd6, 0x2a, + 0xca, 0xdb, 0x73, 0x9b, 0x93, 0x35, 0x29, 0xb0, 0xec, 0x6c, 0xa8, 0x1f, + 0xa6, 0xac, 0xf8, 0xd8, 0xfa, 0x98, 0xc3, 0x02, 0xf0, 0xf5, 0x66, 0x2c, + 0xfc, 0x75, 0xc7, 0xb0, 0x76, 0xfe, 0x0f, 0x92, 0x9b, 0xce, 0xc5, 0xe8, + 0x9a, 0x5e, 0x8f, 0x16, 0x26, 0x8c, 0x97, 0x20, 0x97, 0x36, 0xca, 0x56, + 0xed, 0xf2, 0x05, 0x53, 0xf7, 0x9f, 0x23, 0xbb, 0x1e, 0xdc, 0x5a, 0x94, + 0x0b, 0x1d, 0x0e, 0x55, 0xc7, 0x34, 0xff, 0xd9, 0xa3, 0x37, 0x69, 0x63, + 0x9f, 0x00, 0x0f, 0xa1, 0x5c, 0x1f, 0x50, 0x56, 0x25, 0xf0, 0xb8, 0x0e, + 0x92, 0x70, 0xcd, 0xa0, 0xca, 0x2a, 0xce, 0xa5, 0x21, 0xe7, 0x5b, 0x10, + 0x13, 0xd5, 0x9b, 0x9f, 0x60, 0x1b, 0x3f, 0x21, 0xa9, 0x27, 0xd9, 0xeb, + 0xdc, 0xe8, 0x05, 0x8e, 0x09, 0x27, 0x4b, 0x8b, 0xb1, 0x3b, 0x07, 0xb1, + 0xe9, 0x55, 0xc4, 0xab, 0x5d, 0x74, 0x11, 0xcf, 0x98, 0x5d, 0x47, 0x58, + 0x9d, 0x08, 0xec, 0x0b, 0x31, 0x69, 0x98, 0xad, 0xd0, 0x93, 0x09, 0xc7, + 0xcc, 0xe3, 0x64, 0x67, 0xef, 0xce, 0x98, 0xf3, 0xc2, 0x69, 0xd4, 0x47, + 0x4d, 0xf7, 0x1a, 0x10, 0xa9, 0x18, 0x35, 0x94, 0xc8, 0xe1, 0xd2, 0xf5, + 0xb5, 0xb4, 0x0b, 0xd7, 0x28, 0xa8, 0x97, 0x9b, 0xbf, 0x90, 0xe5, 0xc6, + 0xde, 0xf7, 0x4f, 0x33, 0xaf, 0x36, 0xe2, 0xa8, 0x65, 0x56, 0xdd, 0xe8, + 0x79, 0xae, 0x68, 0xc1, 0xf3, 0x5b, 0x26, 0x59, 0x53, 0x00, 0x43, 0x4c, + 0x3e, 0xf9, 0x24, 0xc4, 0x8d, 0x73, 0x00, 0x6c, 0xb2, 0x97, 0x56, 0x90, + 0x42, 0xde, 0xba, 0xd6, 0x3a, 0x6d, 0x39, 0x9d, 0xbe, 0x1c, 0xca, 0x24, + 0xbb, 0xba, 0x06, 0xf0, 0x59, 0x74, 0x32, 0x99, 0x1b, 0x02, 0xad, 0xc1, + 0x8b, 0xd4, 0x0b, 0xd8, 0xb7, 0xe7, 0xbd, 0xbd, 0x68, 0x56, 0xc1, 0x1e, + 0xda, 0xa4, 0xfe, 0x6b, 0x94, 0xf3, 0xda, 0x9a, 0x33, 0x01, 0x97, 0xb6, + 0x39, 0xc4, 0xe7, 0x57, 0xee, 0xcf, 0x0e, 0xce, 0x40, 0x7a, 0xd4, 0x4d, + 0x30, 0x6a, 0x57, 0x8f, 0x97, 0x92, 0x59, 0xeb, 0xf2, 0x18, 0x8c, 0x77, + 0xd9, 0x8f, 0x72, 0xff, 0xd5, 0xb2, 0x1f, 0x2e, 0xba, 0xb6, 0x46, 0x1a, + 0x33, 0xe0, 0x74, 0x2a, 0xd7, 0xdb, 0xc7, 0x07, 0x37, 0x2f, 0x55, 0xe2, + 0x70, 0x43, 0xc2, 0xbc, 0x33, 0x03, 0xc9, 0xd4, 0x4e, 0x6e, 0x3e, 0xc9, + 0x67, 0x55, 0xf8, 0x6d, 0x63, 0x9f, 0x6b, 0x3f, 0x5b, 0xc7, 0xe9, 0xb8, + 0x31, 0x04, 0x0b, 0x71, 0x15, 0xcd, 0x34, 0xe4, 0xaf, 0x74, 0x73, 0xea, + 0xbf, 0x20, 0x00, 0x75, 0xd7, 0xa7, 0xf7, 0x9c, 0xf5, 0xa1, 0x28, 0xc7, + 0xfe, 0x6b, 0xa2, 0x36, 0xdc, 0xd4, 0xf0, 0xd7, 0x42, 0x4e, 0xe4, 0x3f, + 0x00, 0x09, 0x3c, 0x5e, 0x1f, 0xc8, 0xfd, 0xb9, 0xd8, 0x90, 0xdb, 0xf4, + 0x41, 0x0b, 0xda, 0x68, 0xe1, 0xe4, 0xb9, 0xfb, 0x36, 0x37, 0xa9, 0x5f, + 0xc9, 0xb6, 0xb8, 0xa4, 0xda, 0x41, 0xaa, 0xab, 0xa8, 0xc8, 0xd3, 0xc6, + 0x6a, 0xbe, 0x03, 0x77, 0xcc, 0x1a, 0x8d, 0x0d, 0xe8, 0xcc, 0x58, 0x46, + 0x71, 0x33, 0x19, 0x62, 0xe5, 0xc4, 0xe3, 0x4a, 0x1d, 0xf7, 0x96, 0xd4, + 0x08, 0xe5, 0xa8, 0x18, 0x40, 0x2d, 0xc5, 0xd7, 0xa7, 0x31, 0xa2, 0x5f, + 0x60, 0xde, 0x21, 0xe5, 0xaa, 0x65, 0x93, 0x0d, 0xdb, 0x55, 0x54, 0x88, + 0xbd, 0x53, 0x8e, 0xe0, 0xa6, 0x23, 0xcd, 0x1d, 0xb7, 0xbd, 0x2a, 0x8c, + 0x0e, 0x67, 0x65, 0xab, 0xda, 0xe9, 0x3b, 0x12, 0xf6, 0x97, 0x4b, 0xe8, + 0x16, 0xf7, 0x09, 0xb6, 0x45, 0x97, 0x16, 0xec, 0xd9, 0xdc, 0x8d, 0x01, + 0xba, 0xb0, 0xb6, 0xdd, 0x59, 0x60, 0xbf, 0x92, 0x92, 0xc3, 0x21, 0x41, + 0x46, 0xcb, 0x5e, 0x6e, 0x99, 0x10, 0x41, 0x45, 0x9a, 0xb9, 0xe0, 0x6d, + 0x22, 0x68, 0xd3, 0x5a, 0xaa, 0x6e, 0xb4, 0xc6, 0x42, 0xa2, 0xad, 0xf1, + 0xf7, 0x0b, 0x3d, 0x29, 0x38, 0xa2, 0x11, 0xf8, 0x57, 0x25, 0xb8, 0x8f, + 0xbc, 0x65, 0xac, 0x0d, 0xf0, 0xb7, 0x5c, 0x95, 0xfb, 0x5d, 0xdb, 0x54, + 0x3d, 0x3e, 0xd6, 0x4f, 0x2a, 0xfe, 0x43, 0xfc, 0x1c, 0xca, 0xb9, 0xb3, + 0x95, 0x06, 0x90, 0xd9, 0x5d, 0x43, 0xc4, 0xe9, 0xbb, 0x17, 0xd6, 0xaf, + 0xf2, 0xb0, 0x24, 0x9d, 0x27, 0xdf, 0xaf, 0xf7, 0x6f, 0xd1, 0x4c, 0xbe, + 0xd0, 0x1d, 0x16, 0x3f, 0xf5, 0x23, 0xdb, 0x52, 0xc4, 0x3b, 0x99, 0x3d, + 0xd5, 0xdc, 0x0b, 0x54, 0x3b, 0xfd, 0x9d, 0x36, 0xf6, 0xd9, 0x63, 0xd4, + 0xc0, 0x8f, 0x9d, 0x00, 0xa6, 0x1e, 0x41, 0x72, 0x18, 0xa6, 0xc5, 0xd0, + 0xb6, 0xdd, 0x10, 0x61, 0x45, 0xe0, 0xdc, 0xcc, 0x92, 0xd3, 0x05, 0x54, + 0x26, 0x2c, 0xcf, 0x94, 0x67, 0xa5, 0xae, 0x62, 0x97, 0x4e, 0x10, 0x2b, + 0xf4, 0x65, 0x89, 0x21, 0x98, 0xad, 0x25, 0x6a, 0x01, 0xa9, 0x4f, 0x57, + 0x2b, 0xbe, 0x3b, 0xcc, 0x34, 0x89, 0xc3, 0xd2, 0xa0, 0xc5, 0x72, 0xd9, + 0x39, 0x3f, 0x45, 0x62, 0x73, 0xda, 0xf3, 0xe7, 0xbf, 0xfd, 0xfe, 0x5b, + 0xe0, 0xc5, 0x9f, 0xf9, 0xbe, 0x2b, 0x9a, 0xf7, 0xc2, 0xe9, 0x59, 0x73, + 0xc4, 0x0a, 0xfe, 0x73, 0x5b, 0x34, 0xb9, 0xfc, 0x45, 0xb7, 0x4d, 0x39, + 0xc2, 0xcd, 0x5f, 0x33, 0x91, 0xab, 0x48, 0x57, 0x0a, 0x27, 0xf3, 0xd4, + 0xf3, 0xb4, 0x57, 0x04, 0xeb, 0x8a, 0xb2, 0xd4, 0x06, 0x60, 0x09, 0x48, + 0x58, 0xf8, 0x1f, 0x06, 0x8c, 0x2d, 0x55, 0x2b, 0x8d, 0xbb, 0x37, 0xbb, + 0xc5, 0xa3, 0x05, 0x38, 0xf7, 0x47, 0x0a, 0xd9, 0xa8, 0x5a, 0x5b, 0x75, + 0x58, 0xa3, 0x35, 0x01, 0x1a, 0x5c, 0xe3, 0x97, 0xef, 0x04, 0xd9, 0x28, + 0x93, 0xc9, 0x59, 0xfc, 0xc1, 0x9b, 0x25, 0xe8, 0x44, 0x05, 0x17, 0xdc, + 0xe1, 0xb2, 0x06, 0xd6, 0x08, 0xe0, 0x00, 0xe0, 0x06, 0xaf, 0xb6, 0xf8, + 0x63, 0x6c, 0x54, 0x29, 0x7a, 0x25, 0x0c, 0xc4, 0xe7, 0x6c, 0x2b, 0xe8, + 0xe9, 0x06, 0xa4, 0x9e, 0xb0, 0x38, 0xd4, 0xf1, 0x46, 0xb3, 0x93, 0x54, + 0xa7, 0xa1, 0xcd, 0x65, 0x43, 0xe8, 0xc3, 0x03, 0x60, 0x9c, 0x39, 0x02, + 0xea, 0xc5, 0x0c, 0x96, 0xd2, 0x05, 0x0d, 0x1f, 0xc7, 0x04, 0xc4, 0xa3, + 0xc4, 0xc0, 0xa9, 0x0b, 0xc7, 0xa1, 0x3f, 0xdc, 0x35, 0x51, 0x4d, 0xc8, + 0xc2, 0x87, 0x99, 0x3c, 0x46, 0xb3, 0x4e, 0xc9, 0xbf, 0xb3, 0x34, 0x8b, + 0xb7, 0x6f, 0xe5, 0x95, 0x9b, 0x17, 0x20, 0x56, 0xa6, 0x64, 0x4c, 0x77, + 0xdc, 0x0e, 0x28, 0xc3, 0xef, 0xf4, 0x28, 0x47, 0xd4, 0x0c, 0x6a, 0xe1, + 0x75, 0x63, 0xc9, 0xae, 0xe9, 0x36, 0x57, 0xfd, 0x08, 0x2f, 0xb2, 0x0b, + 0x48, 0xd4, 0x04, 0x24, 0x2f, 0x17, 0x03, 0x9e, 0xfe, 0xfd, 0x67, 0x0e, + 0xbe, 0x66, 0xcf, 0x2c, 0xaa, 0x4f, 0x1c, 0x32, 0x2e, 0xa0, 0xfb, 0x55, + 0x40, 0x15, 0x5d, 0x51, 0xca, 0xbe, 0xff, 0xb2, 0xb2, 0x2b, 0x47, 0xee, + 0x37, 0xc8, 0x65, 0xad, 0xda, 0xb9, 0x3a, 0x75, 0x3a, 0x98, 0x1f, 0xcf, + 0xd7, 0x48, 0x56, 0xa2, 0xed, 0xb4, 0x46, 0x60, 0x30, 0x6a, 0x19, 0x5b, + 0x38, 0xc8, 0x0d, 0x3a, 0xc3, 0xe1, 0x34, 0x6e, 0x39, 0x5f, 0xf2, 0x4d, + 0x78, 0x02, 0xba, 0x3c, 0x71, 0x70, 0x75, 0x6c, 0xb0, 0xfa, 0x38, 0xe3, + 0x6b, 0x42, 0x1e, 0x23, 0xcd, 0xe6, 0xf8, 0xc5, 0x9c, 0x24, 0x3d, 0x98, + 0xa8, 0xbb, 0x4a, 0x07, 0x8c, 0xb6, 0xfa, 0x13, 0xd0, 0xfc, 0xc5, 0xdc, + 0xb2, 0xcd, 0x65, 0x59, 0xc2, 0x3a, 0x24, 0x47, 0x1c, 0x53, 0x92, 0x57, + 0x21, 0xf3, 0x26, 0x9b, 0xe9, 0xa5, 0x95, 0x9a, 0xd6, 0xa5, 0xe2, 0xda, + 0x0e, 0xb7, 0xab, 0x9e, 0xee, 0xe3, 0xef, 0x59, 0xd2, 0x88, 0x32, 0x1f, + 0x0d, 0xbf, 0xf2, 0xa4, 0x3b, 0xd7, 0xd5, 0xf2, 0xa4, 0xae, 0x65, 0xab, + 0xb3, 0x72, 0xf6, 0x3b, 0xe8, 0xc5, 0x2b, 0xad, 0xcc, 0xbe, 0x02, 0x95, + 0x63, 0x95, 0x2c, 0x22, 0x74, 0x3a, 0x1b, 0xd5, 0xd1, 0x1d, 0xf8, 0x69, + 0x03, 0x98, 0x70, 0x66, 0x43, 0xb5, 0x6d, 0xd0, 0x27, 0x6a, 0x1c, 0xfc, + 0xf9, 0xaf, 0x71, 0x9b, 0x8c, 0xcb, 0xf8, 0xbd, 0x18, 0xad, 0x5f, 0xb7, + 0xbc, 0xfb, 0xbd, 0xde, 0xb9, 0xdc, 0x54, 0x65, 0x3b, 0xaf, 0xa7, 0x92, + 0xbe, 0x62, 0xdc, 0x25, 0x50, 0x48, 0x78, 0xd4, 0xed, 0xed, 0x96, 0x3f, + 0x53, 0xc5, 0xb5, 0x5f, 0xac, 0xa7, 0x5c, 0x92, 0xd9, 0xfe, 0x3b, 0xcd, + 0xbb, 0x29, 0xa0, 0xe0, 0x1e, 0xb0, 0x92, 0xad, 0x6b, 0x45, 0x29, 0x59, + 0xff, 0x5d, 0x5a, 0xfe, 0x8f, 0x63, 0x86, 0x6d, 0xa4, 0x4a, 0x53, 0xc4, + 0x3e, 0x39, 0xbf, 0xe5, 0x20, 0xbc, 0xd1, 0xdf, 0x59, 0x9c, 0x3a, 0x72, + 0x3b, 0x8f, 0xb2, 0x40, 0xe5, 0x9e, 0xa5, 0x02, 0x35, 0xd0, 0x4d, 0x6f, + 0x7d, 0xd5, 0x4c, 0xde, 0x51, 0x0a, 0x9a, 0x57, 0x43, 0x43, 0xe5, 0x97, + 0x95, 0x4b, 0xb2, 0x6c, 0xaf, 0x92, 0x4e, 0x52, 0x06, 0x0b, 0x72, 0x60, + 0x9e, 0x5c, 0xa1, 0xe3, 0x9b, 0xb3, 0x8c, 0x32, 0xcd, 0xc1, 0x4a, 0x88, + 0xd6, 0x3d, 0xed, 0xe8, 0x42, 0x5d, 0x53, 0xdd, 0x00, 0x52, 0x26, 0x2e, + 0xd5, 0x41, 0xf2, 0xfc, 0x51, 0x40, 0x45, 0xe4, 0x00, 0xe3, 0x1c, 0xfb, + 0x32, 0x33, 0x22, 0xed, 0x15, 0x12, 0x9b, 0xc4, 0x89, 0xd0, 0x0e, 0x95, + 0xad, 0xfd, 0x04, 0x2e, 0xee, 0x73, 0x06, 0xee, 0x23, 0xe2, 0xd3, 0x3d, + 0x44, 0x62, 0x35, 0xdc, 0x18, 0x9d, 0xf4, 0x9d, 0x92, 0x00, 0x4e, 0x8e, + 0x4e, 0x24, 0xa1, 0x2c, 0xb2, 0xb2, 0x3f, 0xfc, 0xe4, 0x27, 0x43, 0x3b, + 0x59, 0xb4, 0x13, 0xff, 0x57, 0xdf, 0x3d, 0xee, 0x1a, 0xab, 0x8c, 0x51, + 0xd9, 0x96, 0x1f, 0x2b, 0x66, 0x67, 0x42, 0xb6, 0x91, 0xfe, 0x8f, 0x4d, + 0xa6, 0xd3, 0x3b, 0x51, 0x45, 0x35, 0xab, 0xe5, 0x6e, 0x07, 0xed, 0x24, + 0x95, 0x3d, 0x6a, 0x47, 0x3f, 0x4e, 0xe4, 0x13, 0x5f, 0xfc, 0x19, 0xe8, + 0x09, 0x4b, 0x3d, 0xdf, 0x4f, 0xb4, 0xb4, 0xc1, 0x74, 0x31, 0xff, 0x13, + 0x00, 0xaf, 0x07, 0x16, 0xb6, 0x57, 0xfe, 0x6a, 0x37, 0x05, 0x62, 0x01, + 0xa0, 0xfa, 0xe2, 0xe5, 0x57, 0xcb, 0xa4, 0x5a, 0x57, 0xee, 0xd1, 0x5f, + 0x14, 0x23, 0xbe, 0xef, 0x9b, 0x91, 0x0f, 0x97, 0xa8, 0xf2, 0x36, 0xf7, + 0xc3, 0xb6, 0xbe, 0xe5, 0x59, 0x2b, 0x3c, 0xb3, 0x5d, 0x9f, 0x1e, 0x3b, + 0xd3, 0xf7, 0xee, 0x2e, 0xc0, 0x73, 0x6f, 0x2e, 0xfd, 0xc7, 0x3f, 0xfd, + 0x9c, 0xac, 0xbd, 0xa1, 0x8e, 0xcc, 0x59, 0x41, 0xa4, 0x41, 0xd3, 0x39, + 0x28, 0x67, 0x96, 0x14, 0x42, 0xc3, 0x38, 0x96, 0x0d, 0xfc, 0x68, 0x3d, + 0x2e, 0x2f, 0x46, 0x24, 0x66, 0x0d, 0xa6, 0x72, 0xc7, 0x27, 0x66, 0x3c, + 0xad, 0x55, 0xae, 0xbd, 0x34, 0xb4, 0x3b, 0x60, 0x73, 0xa5, 0xaa, 0xd4, + 0x56, 0x0b, 0x61, 0xf5, 0x5c, 0x66, 0x2e, 0x9d, 0x33, 0xfe, 0xfe, 0x7b, + 0x21, 0xbc, 0x36, 0xec, 0x0f, 0x03, 0x28, 0xa4, 0xd6, 0x05, 0x21, 0x30, + 0xf8, 0x3c, 0xd9, 0x3b, 0xaf, 0x5d, 0x92, 0x25, 0xce, 0xac, 0x28, 0xe1, + 0xd1, 0x02, 0x3c, 0x49, 0xe6, 0xed, 0xb7, 0x0e, 0xe7, 0xe7, 0x1e, 0x56, + 0xbf, 0x5d, 0xfd, 0xed, 0xdb, 0x4d, 0x63, 0x03, 0x8c, 0x06, 0x30, 0xfa, + 0x62, 0x78, 0x3f, 0x6e, 0x63, 0x1e, 0xa6, 0x4b, 0x96, 0xe9, 0xe4, 0x2d, + 0x16, 0x51, 0xf2, 0xf1, 0xa7, 0x2a, 0xeb, 0x15, 0xb5, 0xb1, 0x04, 0x9a, + 0xde, 0x77, 0xde, 0xcf, 0xcc, 0x21, 0xd9, 0x30, 0xf1, 0xea, 0xb9, 0xb0, + 0x39, 0xe1, 0x6f, 0xc7, 0x0a, 0xbd, 0x64, 0x75, 0x59, 0xbf, 0x3c, 0xbf, + 0xd0, 0xdb, 0x00, 0xfa, 0x2e, 0x36, 0xcc, 0xb5, 0xd1, 0x20, 0x46, 0xb0, + 0xd7, 0xfc, 0xb1, 0x5b, 0x54, 0x9f, 0xe2, 0xe1, 0xd0, 0x18, 0xa3, 0x51, + 0x62, 0x24, 0x0f, 0xa1, 0xa1, 0x9a, 0x47, 0x33, 0xca, 0xb9, 0x26, 0xb6, + 0x0b, 0x46, 0xd4, 0xb5, 0xc6, 0xbb, 0x72, 0x1e, 0x60, 0xeb, 0xb4, 0x9d, + 0x9f, 0x09, 0x10, 0x12, 0xce, 0x68, 0xa3, 0xb6, 0x8c, 0xce, 0xd7, 0x26, + 0x55, 0xb5, 0x90, 0x08, 0x9f, 0xf2, 0xa8, 0xc0, 0x56, 0xd8, 0xf6, 0x29, + 0x60, 0xe0, 0x73, 0x52, 0x22, 0x6f, 0x35, 0x4e, 0xe7, 0xc5, 0xa3, 0x95, + 0xcd, 0xd0, 0x8e, 0xd3, 0x95, 0xe3, 0x03, 0x04, 0x00, 0x54, 0xeb, 0xef, + 0x27, 0x11, 0xef, 0x38, 0x56, 0x6f, 0xa0, 0xe5, 0x72, 0x2a, 0x97, 0x23, + 0x56, 0xe2, 0x93, 0x21, 0x3f, 0xe2, 0xd6, 0x12, 0xcd, 0x61, 0x50, 0x44, + 0xd3, 0xe3, 0x8d, 0x3f, 0x24, 0x90, 0x6c, 0x53, 0xad, 0x1c, 0xad, 0x03, + 0x0f, 0x89, 0x63, 0xf9, 0xb9, 0xbc, 0xe2, 0x56, 0xdd, 0x16, 0xcf, 0x2d, + 0xa1, 0xda, 0xf9, 0x3f, 0xec, 0xbf, 0xb1, 0xb6, 0xe1, 0xdf, 0x3f, 0x11, + 0x02, 0x76, 0xe9, 0xe2, 0x9f, 0xa2, 0x02, 0xce, 0x3e, 0xf9, 0xcf, 0x4f, + 0xd9, 0x5f, 0x72, 0x5d, 0x51, 0xa7, 0x1d, 0x98, 0xeb, 0x8e, 0x97, 0x98, + 0x39, 0x58, 0x52, 0x11, 0xed, 0x95, 0x3c, 0x94, 0xf0, 0x6c, 0xa2, 0x3e, + 0x5f, 0x5f, 0x05, 0x98, 0xf1, 0x73, 0xab, 0xc7, 0xa8, 0x4b, 0x92, 0x73, + 0xda, 0x59, 0x1d, 0x56, 0x11, 0xc2, 0x38, 0x43, 0xdb, 0x4b, 0xbe, 0x08, + 0xdd, 0xf2, 0x5d, 0x47, 0x26, 0xdc, 0x16, 0xf9, 0x62, 0xf8, 0x92, 0x19, + 0x5c, 0x6f, 0x2b, 0xe1, 0x15, 0x66, 0xfa, 0xdb, 0x3a, 0xe0, 0x92, 0x9c, + 0x70, 0x91, 0x3f, 0xb8, 0xb0, 0x01, 0xc1, 0x44, 0xf6, 0x62, 0x47, 0x37, + 0xe9, 0xd9, 0x4c, 0x0f, 0x99, 0x6a, 0xc4, 0x60, 0x26, 0x2f, 0xc6, 0x43, + 0x50, 0x62, 0xee, 0x44, 0x21, 0xbd, 0xad, 0x50, 0x2d, 0x58, 0x78, 0xea, + 0x5a, 0x5f, 0x5c, 0xf7, 0x28, 0xa9, 0xdf, 0x0e, 0xd3, 0x67, 0xdf, 0x1f, + 0x4c, 0xd3, 0xe9, 0x5e, 0x0f, 0xa3, 0xb7, 0x56, 0xa5, 0x4e, 0x5f, 0x2a, + 0xb6, 0x14, 0x5e, 0x2f, 0x16, 0x71, 0x48, 0x59, 0x77, 0x6b, 0xf9, 0x6c, + 0x79, 0xba, 0xc4, 0x26, 0x30, 0x44, 0x61, 0x62, 0x60, 0xef, 0x35, 0x95, + 0xe3, 0x77, 0xd5, 0xc8, 0x44, 0xa4, 0xf8, 0x95, 0xba, 0xd1, 0x73, 0x6f, + 0x92, 0xf2, 0xd3, 0x98, 0x4c, 0x8f, 0xe0, 0x2e, 0x27, 0xaa, 0x2f, 0x63, + 0x00, 0x00, 0x00, 0x00, 0x06, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x80, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x26, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, + 0x0e, 0xfe, 0xff, 0xff, 0xbb, 0xfd, 0xff, 0xff, 0xe1, 0x05, 0x00, 0x00, + 0x4b, 0x0f, 0x00, 0x00, 0x8e, 0x15, 0x00, 0x00, 0x7f, 0x04, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x00, 0x53, 0xe6, 0xff, 0xff, 0xa6, 0x04, 0x00, 0x00, + 0xdf, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x7f, 0xfd, 0xff, 0xff, 0x3e, 0xf8, 0xff, 0xff, + 0xae, 0x03, 0x00, 0x00, 0x5c, 0xfe, 0xff, 0xff, 0x82, 0xfa, 0xff, 0xff, + 0xbd, 0xf8, 0xff, 0xff, 0x04, 0xfe, 0xff, 0xff, 0x8c, 0xfe, 0xff, 0xff, + 0x9b, 0xf8, 0xff, 0xff, 0x51, 0x02, 0x00, 0x00, 0x19, 0xfe, 0xff, 0xff, + 0x54, 0xfe, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe7, 0xfd, 0xff, 0xff, + 0xc2, 0x07, 0x00, 0x00, 0x36, 0x06, 0x00, 0x00, 0x57, 0xfd, 0xff, 0xff, + 0xa3, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x79, 0x03, 0x00, 0x00, + 0x9b, 0xf7, 0xff, 0xff, 0xc7, 0x04, 0x00, 0x00, 0xbf, 0x06, 0x00, 0x00, + 0x86, 0xfe, 0xff, 0xff, 0x20, 0xfb, 0xff, 0xff, 0x90, 0xfc, 0xff, 0xff, + 0x16, 0x00, 0x00, 0x00, 0x8e, 0xff, 0xff, 0xff, 0xa0, 0x03, 0x00, 0x00, + 0xc7, 0xff, 0xff, 0xff, 0x51, 0x01, 0x00, 0x00, 0x24, 0xf8, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xee, 0x01, 0x00, 0x00, + 0xda, 0x02, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xc4, 0xfe, 0xff, 0xff, 0xfa, 0xfc, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, + 0x6a, 0xff, 0xff, 0xff, 0x92, 0x02, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, + 0xfd, 0xfe, 0xff, 0xff, 0x4e, 0xfd, 0xff, 0xff, 0x87, 0x00, 0x00, 0x00, + 0x19, 0xfe, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf4, 0xf3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0xf4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x4d, 0x4c, 0x49, 0x52, + 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x0e, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, + 0xe0, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x82, 0xfe, 0xff, 0xff, + 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x07, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc8, 0xf4, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xe6, 0xfe, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x1a, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x07, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, + 0xc2, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb4, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, + 0x07, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x06, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x07, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x04, 0x00, + 0x08, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0xb8, 0x0d, 0x00, 0x00, + 0x64, 0x0c, 0x00, 0x00, 0x64, 0x0a, 0x00, 0x00, 0xe8, 0x09, 0x00, 0x00, + 0x9c, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x6c, 0x07, 0x00, 0x00, + 0x78, 0x04, 0x00, 0x00, 0x74, 0x03, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, + 0xbc, 0x01, 0x00, 0x00, 0x28, 0x01, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, + 0x54, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xff, 0xff, + 0x28, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x30, 0xf3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0x6c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x14, 0xf3, 0xff, 0xff, + 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0xc2, 0x47, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0x8d, 0xf4, 0xad, 0x3e, 0x01, 0x00, 0x00, 0x00, + 0x15, 0x00, 0xe0, 0xbe, 0x0d, 0x00, 0x00, 0x00, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x38, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0xb0, 0xf3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x7c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x04, 0x00, 0x00, 0x94, 0xf3, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x6c, 0x02, 0xa5, 0x3a, + 0x01, 0x00, 0x00, 0x00, 0x6a, 0x5d, 0xa4, 0x3e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x66, 0x6c, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x2f, 0x52, 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, + 0x40, 0xf4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x8c, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2c, 0xf4, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x6c, 0x02, 0xa5, 0x3a, 0x01, 0x00, 0x00, 0x00, + 0x6a, 0x5d, 0xa4, 0x3e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x69, + 0x6e, 0x67, 0x32, 0x64, 0x2f, 0x4d, 0x61, 0x78, 0x50, 0x6f, 0x6f, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xe8, 0xf4, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0xec, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xd4, 0xf4, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x6c, 0x02, 0xa5, 0x3a, 0x01, 0x00, 0x00, 0x00, + 0x6a, 0x5d, 0xa4, 0x3e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x2f, + 0x52, 0x65, 0x6c, 0x75, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, + 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x3b, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, + 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x44, 0x3b, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x42, 0x69, 0x61, 0x73, + 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xf0, 0xf5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0xe4, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xdc, 0xf5, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x15, 0xa1, 0x10, 0x3b, 0x01, 0x00, 0x00, 0x00, + 0x74, 0x10, 0x10, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7b, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x52, 0x65, + 0x6c, 0x75, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x42, 0x69, 0x61, + 0x73, 0x41, 0x64, 0x64, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x43, + 0x6f, 0x6e, 0x76, 0x32, 0x44, 0x3b, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, + 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x3a, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, + 0xd4, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xac, 0x02, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xc4, 0xf6, 0xff, 0xff, 0x1c, 0x02, 0x00, 0x00, + 0x94, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0xb9, 0x37, 0x74, 0x3a, 0x8b, 0xfe, 0x77, 0x3a, 0x54, 0xc7, 0x75, 0x3a, + 0xc4, 0x11, 0x78, 0x3a, 0xb9, 0x90, 0x74, 0x3a, 0x3b, 0x97, 0x7b, 0x3a, + 0xe8, 0x57, 0x75, 0x3a, 0x0c, 0x0e, 0x74, 0x3a, 0x76, 0x8b, 0x79, 0x3a, + 0x2b, 0x7b, 0x6d, 0x3a, 0x17, 0xad, 0x71, 0x3a, 0xe4, 0x9b, 0x77, 0x3a, + 0x0b, 0xab, 0x7a, 0x3a, 0x9e, 0x12, 0x75, 0x3a, 0x8c, 0xcf, 0x79, 0x3a, + 0xa0, 0x5a, 0x79, 0x3a, 0x74, 0xc3, 0x78, 0x3a, 0x0e, 0xa9, 0x74, 0x3a, + 0x6b, 0xf8, 0x6f, 0x3a, 0x53, 0xeb, 0x72, 0x3a, 0xff, 0xe2, 0x73, 0x3a, + 0x3b, 0x38, 0x78, 0x3a, 0xed, 0x9e, 0x76, 0x3a, 0x77, 0xbc, 0x6d, 0x3a, + 0x4f, 0xf5, 0x71, 0x3a, 0x17, 0xc9, 0x74, 0x3a, 0x87, 0x84, 0x6b, 0x3a, + 0x4b, 0xc5, 0x78, 0x3a, 0xdd, 0x02, 0x75, 0x3a, 0x0e, 0xcf, 0x78, 0x3a, + 0x14, 0x40, 0x75, 0x3a, 0x2e, 0xca, 0x72, 0x3a, 0x20, 0x00, 0x00, 0x00, + 0x95, 0x2f, 0xef, 0x3d, 0x47, 0x1c, 0xf0, 0x3d, 0xc5, 0xdb, 0xf3, 0x3d, + 0x2e, 0x57, 0xe7, 0x3d, 0x98, 0xa7, 0xf2, 0x3d, 0x98, 0x89, 0xe4, 0x3d, + 0x38, 0x6d, 0xf3, 0x3d, 0x3f, 0x38, 0xe2, 0x3d, 0x91, 0x6f, 0xf0, 0x3d, + 0x35, 0xa0, 0xeb, 0x3d, 0x42, 0x3d, 0xeb, 0x3d, 0xed, 0x89, 0xe7, 0x3d, + 0xb5, 0xb5, 0xf8, 0x3d, 0x79, 0x28, 0xf3, 0x3d, 0xed, 0xdb, 0xf7, 0x3d, + 0xeb, 0x67, 0xf7, 0x3d, 0xed, 0xd1, 0xf6, 0x3d, 0xbc, 0xbf, 0xf2, 0x3d, + 0x7a, 0x18, 0xee, 0x3d, 0x7c, 0x05, 0xf1, 0x3d, 0x63, 0x69, 0xe8, 0x3d, + 0xbb, 0xc0, 0xf1, 0x3d, 0xaf, 0xb1, 0xf4, 0x3d, 0xfe, 0xe0, 0xeb, 0x3d, + 0xb6, 0x60, 0xec, 0x3d, 0x8c, 0x32, 0xf0, 0x3d, 0x7e, 0xad, 0xe9, 0x3d, + 0xc0, 0xd3, 0xf6, 0x3d, 0xd7, 0x18, 0xf3, 0x3d, 0x40, 0x53, 0xf0, 0x3d, + 0x2c, 0xdc, 0xf1, 0x3d, 0x9a, 0xe4, 0xf0, 0x3d, 0x20, 0x00, 0x00, 0x00, + 0x4a, 0x4f, 0xf2, 0xbd, 0x8e, 0x0e, 0xf6, 0xbd, 0x74, 0x46, 0xec, 0xbd, + 0xa0, 0x21, 0xf6, 0xbd, 0x8e, 0x27, 0xf0, 0xbd, 0x0d, 0xa0, 0xf9, 0xbd, + 0x0c, 0x97, 0xec, 0xbd, 0xf0, 0x25, 0xf2, 0xbd, 0x5f, 0x98, 0xf7, 0xbd, + 0x27, 0x8d, 0xe8, 0xbd, 0xbd, 0xc9, 0xef, 0xbd, 0xac, 0xac, 0xf5, 0xbd, + 0x5a, 0x94, 0xed, 0xbd, 0x5a, 0x64, 0xf1, 0xbd, 0x2a, 0xa7, 0xe9, 0xbd, + 0x3c, 0x93, 0xf3, 0xbd, 0xf8, 0x2b, 0xf3, 0xbd, 0xf6, 0x35, 0xed, 0xbd, + 0x94, 0xf4, 0xed, 0xbd, 0x70, 0x94, 0xe9, 0xbd, 0x39, 0xfb, 0xf1, 0xbd, + 0xcb, 0x47, 0xf6, 0xbd, 0x88, 0xb9, 0xe7, 0xbd, 0x49, 0x62, 0xe9, 0xbd, + 0x64, 0x11, 0xf0, 0xbd, 0x85, 0xdf, 0xf2, 0xbd, 0x5c, 0x61, 0xe8, 0xbd, + 0x22, 0x46, 0xf3, 0xbd, 0x5a, 0x8e, 0xf0, 0xbd, 0x70, 0xdd, 0xf6, 0xbd, + 0x94, 0x55, 0xf3, 0xbd, 0x57, 0xba, 0xf0, 0xbd, 0x1a, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x43, 0x6f, 0x6e, 0x76, + 0x32, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x2a, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x94, 0x01, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xb4, 0xf9, 0xff, 0xff, 0x1c, 0x01, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xe6, 0x69, 0xc5, 0x3a, 0xa0, 0x8d, 0xa8, 0x3a, 0xfe, 0x5c, 0xc1, 0x3a, + 0x84, 0x01, 0xcb, 0x3a, 0xa2, 0xc2, 0xb5, 0x3a, 0x42, 0x01, 0xd1, 0x3a, + 0xd7, 0x01, 0xcc, 0x3a, 0x20, 0xd8, 0xc7, 0x3a, 0x28, 0x80, 0xa4, 0x3a, + 0xd9, 0x25, 0xbe, 0x3a, 0x39, 0x6f, 0xc4, 0x3a, 0x59, 0x6c, 0xcb, 0x3a, + 0xb8, 0x0a, 0xc2, 0x3a, 0x73, 0x3f, 0xca, 0x3a, 0xb9, 0xed, 0xc5, 0x3a, + 0xe9, 0x9f, 0xc1, 0x3a, 0x10, 0x00, 0x00, 0x00, 0x5b, 0x2e, 0x2f, 0x3e, + 0x3e, 0xd9, 0x06, 0x3e, 0x44, 0xda, 0x3f, 0x3e, 0xd3, 0x09, 0x22, 0x3e, + 0x1d, 0x57, 0x34, 0x3e, 0xa4, 0xb6, 0x44, 0x3e, 0xd3, 0x69, 0x4a, 0x3e, + 0x70, 0x48, 0x46, 0x3e, 0x28, 0x37, 0x23, 0x3e, 0xe6, 0xdb, 0x06, 0x3e, + 0x3c, 0x1d, 0x34, 0x3e, 0x36, 0xba, 0x16, 0x3e, 0x24, 0xa4, 0x34, 0x3e, + 0xf4, 0xfb, 0x37, 0x3e, 0xd6, 0x7b, 0x8a, 0x3d, 0x00, 0x85, 0xe3, 0x3d, + 0x10, 0x00, 0x00, 0x00, 0x12, 0xdf, 0x43, 0xbe, 0x85, 0x3c, 0x27, 0xbe, + 0x54, 0xcd, 0x0d, 0xbe, 0x81, 0x6b, 0x49, 0xbe, 0x33, 0xb1, 0xe7, 0xbd, + 0x3f, 0x5f, 0x4f, 0xbe, 0xa1, 0x63, 0x3e, 0xbe, 0xbb, 0xa7, 0xea, 0xbd, + 0x2d, 0x8c, 0x0e, 0xbe, 0x8d, 0xa9, 0x3c, 0xbe, 0x5b, 0xe6, 0x42, 0xbe, + 0x80, 0xd5, 0x49, 0xbe, 0xa3, 0x86, 0x40, 0xbe, 0xf4, 0xaa, 0x48, 0xbe, + 0xde, 0x61, 0x44, 0xbe, 0xa9, 0x1c, 0x40, 0xbe, 0x18, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x2f, 0x43, 0x6f, 0x6e, 0x76, 0x32, 0x44, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xda, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x09, 0x64, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x64, 0xfb, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x07, 0x72, 0x1e, 0x3a, 0x01, 0x00, 0x00, 0x00, 0x32, 0xe2, 0x9b, 0x3d, + 0x01, 0x00, 0x00, 0x00, 0x23, 0x35, 0x9d, 0xbd, 0x17, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, + 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x4d, 0x61, 0x74, 0x4d, 0x75, 0x6c, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, + 0x52, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x66, + 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x9a, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x68, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x8c, 0xfd, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xfc, 0x41, 0x4c, 0x35, 0x30, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x64, + 0x65, 0x6e, 0x73, 0x65, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, + 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x12, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0xdc, 0x01, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0xfe, 0xff, 0xff, 0x0c, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x03, 0xf9, 0x09, 0x36, 0x3a, 0x1b, 0x0c, 0x36, 0xc6, 0xda, 0x0a, 0x36, + 0x16, 0x26, 0x0c, 0x36, 0x4b, 0x2b, 0x0a, 0x36, 0x60, 0x23, 0x0e, 0x36, + 0xd3, 0x9b, 0x0a, 0x36, 0x78, 0xe1, 0x09, 0x36, 0x78, 0xfb, 0x0c, 0x36, + 0xb6, 0x2a, 0x06, 0x36, 0x6f, 0x89, 0x08, 0x36, 0x7e, 0xe3, 0x0b, 0x36, + 0xf0, 0x9d, 0x0d, 0x36, 0xae, 0x74, 0x0a, 0x36, 0xef, 0x21, 0x0d, 0x36, + 0xe0, 0xdf, 0x0c, 0x36, 0x79, 0x8a, 0x0c, 0x36, 0x0a, 0x39, 0x0a, 0x36, + 0xbb, 0x92, 0x07, 0x36, 0x39, 0x3d, 0x09, 0x36, 0x25, 0xc9, 0x09, 0x36, + 0xd1, 0x3b, 0x0c, 0x36, 0x93, 0x54, 0x0b, 0x36, 0x9a, 0x4f, 0x06, 0x36, + 0x3c, 0xb2, 0x08, 0x36, 0x23, 0x4b, 0x0a, 0x36, 0xbe, 0x0e, 0x05, 0x36, + 0x83, 0x8b, 0x0c, 0x36, 0xc7, 0x6b, 0x0a, 0x36, 0x07, 0x91, 0x0c, 0x36, + 0x5d, 0x8e, 0x0a, 0x36, 0x7f, 0x2a, 0x09, 0x36, 0x33, 0x00, 0x00, 0x00, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, + 0x6f, 0x6e, 0x76, 0x32, 0x64, 0x5f, 0x31, 0x2f, 0x42, 0x69, 0x61, 0x73, + 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x2c, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0xe1, 0x22, 0xc6, 0x36, 0x90, 0x2b, 0xa9, 0x36, 0x2d, 0x12, 0xc2, 0x36, + 0xbc, 0xbf, 0xcb, 0x36, 0xf2, 0x6c, 0xb6, 0x36, 0x19, 0xc5, 0xd1, 0x36, + 0xff, 0xc0, 0xcc, 0x36, 0x62, 0x93, 0xc8, 0x36, 0x4c, 0x1a, 0xa5, 0x36, + 0x05, 0xd8, 0xbe, 0x36, 0x49, 0x27, 0xc5, 0x36, 0xf5, 0x2a, 0xcc, 0x36, + 0x8a, 0xc0, 0xc2, 0x36, 0xf5, 0xfc, 0xca, 0x36, 0x2f, 0xa7, 0xc6, 0x36, + 0x57, 0x55, 0xc2, 0x36, 0x31, 0x00, 0x00, 0x00, 0x73, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x32, + 0x64, 0x2f, 0x42, 0x69, 0x61, 0x73, 0x41, 0x64, 0x64, 0x2f, 0x52, 0x65, + 0x61, 0x64, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x70, + 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1c, 0x00, + 0x08, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, + 0x24, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x77, 0x80, 0x3b, + 0x01, 0x00, 0x00, 0x00, 0xf0, 0xee, 0x7f, 0x3f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x76, + 0x32, 0x64, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x74, + 0x38, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x06, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, 0x07, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xe6, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x16, 0x0a, 0x00, + 0x0e, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, + 0x0c, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00 +}; + +const unsigned int kTestConvModelDataSize = 21344; diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.h b/components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.h new file mode 100644 index 00000000..d8def7de --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing/test_conv_model.h @@ -0,0 +1,23 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#ifndef TENSORFLOW_LITE_MICRO_TESTING_TEST_CONV_MODEL_H_ +#define TENSORFLOW_LITE_MICRO_TESTING_TEST_CONV_MODEL_H_ + +// See generate_test_models.py for updating the contents of this model: +extern const unsigned char kTestConvModelData[]; +extern const unsigned int kTestConvModelDataSize; + +#endif // TENSORFLOW_LITE_MICRO_TESTING_TEST_CONV_MODEL_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing/util_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/testing/util_test.cc new file mode 100644 index 00000000..1af169b6 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing/util_test.cc @@ -0,0 +1,30 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(ArgumentsExecutedOnlyOnce) +{ + float count = 0.; + // Make sure either argument is executed once after macro expansion. + TF_LITE_MICRO_EXPECT_NEAR(0, count++, 0.1f); + TF_LITE_MICRO_EXPECT_NEAR(1, count++, 0.1f); + TF_LITE_MICRO_EXPECT_NEAR(count++, 2, 0.1f); + TF_LITE_MICRO_EXPECT_NEAR(count++, 3, 0.1f); +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/micro/testing_helpers_test.cc b/components/TensorFlowLite/tensorflow/lite/micro/testing_helpers_test.cc new file mode 100644 index 00000000..5ee62ccd --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/micro/testing_helpers_test.cc @@ -0,0 +1,109 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/lite/micro/test_helpers.h" +#include "tensorflow/lite/micro/testing/micro_test.h" + +TF_LITE_MICRO_TESTS_BEGIN + +TF_LITE_MICRO_TEST(CreateQuantizedBiasTensor) +{ + float input_scale = 0.5; + float weight_scale = 0.5; + constexpr int tensor_size = 12; + int dims_arr[] = { 4, 2, 3, 2, 1 }; + int32_t quantized[tensor_size]; + float pre_quantized[] = { -10, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 10 }; + int32_t expected_quantized_values[] = { -40, -20, -16, -12, -8, -4, + 0, 4, 8, 12, 16, 40 }; + TfLiteIntArray *dims = tflite::testing::IntArrayFromInts(dims_arr); + + TfLiteTensor result = tflite::testing::CreateQuantizedBiasTensor( + pre_quantized, quantized, dims, input_scale, weight_scale); + + TF_LITE_MICRO_EXPECT_EQ(result.bytes, tensor_size * sizeof(int32_t)); + TF_LITE_MICRO_EXPECT(result.dims == dims); + TF_LITE_MICRO_EXPECT_EQ(result.params.scale, input_scale * weight_scale); + for (int i = 0; i < tensor_size; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_quantized_values[i], result.data.i32[i]); + } +} + +TF_LITE_MICRO_TEST(CreatePerChannelQuantizedBiasTensor) +{ + float input_scale = 0.5; + float weight_scales[] = { 0.5, 1, 2, 4 }; + constexpr int tensor_size = 12; + const int channels = 4; + int dims_arr[] = { 4, 4, 3, 1, 1 }; + int32_t quantized[tensor_size]; + float scales[channels + 1]; + int zero_points[] = { 4, 0, 0, 0, 0 }; + float pre_quantized[] = { -10, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 10 }; + int32_t expected_quantized_values[] = { -40, -20, -16, -6, -4, -2, + 0, 1, 2, 2, 2, 5 }; + TfLiteIntArray *dims = tflite::testing::IntArrayFromInts(dims_arr); + + TfLiteAffineQuantization quant; + TfLiteTensor result = tflite::testing::CreatePerChannelQuantizedBiasTensor( + pre_quantized, quantized, dims, input_scale, weight_scales, scales, + zero_points, &quant, 0); + + // Values in scales array start at index 1 since index 0 is dedicated to + // tracking the tensor size. + for (int i = 0; i < channels; i++) { + TF_LITE_MICRO_EXPECT_EQ(scales[i + 1], input_scale * weight_scales[i]); + } + + TF_LITE_MICRO_EXPECT_EQ(result.bytes, tensor_size * sizeof(int32_t)); + TF_LITE_MICRO_EXPECT(result.dims == dims); + for (int i = 0; i < tensor_size; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_quantized_values[i], result.data.i32[i]); + } +} + +TF_LITE_MICRO_TEST(CreateSymmetricPerChannelQuantizedTensor) +{ + const int tensor_size = 12; + constexpr int channels = 2; + int dims_arr[] = { 4, channels, 3, 2, 1 }; + int8_t quantized[12]; + const float pre_quantized[] = { -127, -55, -4, -3, -2, -1, + 0, 1, 2, 3, 4, 63.5 }; + const int8_t expected_quantized_values[] = { -127, -55, -4, -3, -2, -1, + 0, 2, 4, 6, 8, 127 }; + float expected_scales[] = { 1.0, 0.5 }; + TfLiteIntArray *dims = tflite::testing::IntArrayFromInts(dims_arr); + + int zero_points[channels + 1]; + float scales[channels + 1]; + TfLiteAffineQuantization quant; + TfLiteTensor result = + tflite::testing::CreateSymmetricPerChannelQuantizedTensor( + pre_quantized, quantized, dims, scales, zero_points, &quant, 0); + + TF_LITE_MICRO_EXPECT_EQ(result.bytes, tensor_size * sizeof(int8_t)); + TF_LITE_MICRO_EXPECT(result.dims == dims); + TfLiteFloatArray *result_scales = + static_cast(result.quantization.params)->scale; + for (int i = 0; i < channels; i++) { + TF_LITE_MICRO_EXPECT_EQ(result_scales->data[i], expected_scales[i]); + } + for (int i = 0; i < tensor_size; i++) { + TF_LITE_MICRO_EXPECT_EQ(expected_quantized_values[i], result.data.int8[i]); + } +} + +TF_LITE_MICRO_TESTS_END diff --git a/components/TensorFlowLite/tensorflow/lite/portable_type_to_tflitetype.h b/components/TensorFlowLite/tensorflow/lite/portable_type_to_tflitetype.h new file mode 100644 index 00000000..a63cbc1a --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/portable_type_to_tflitetype.h @@ -0,0 +1,76 @@ +/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_PORTABLE_TYPE_TO_TFLITETYPE_H_ +#define TENSORFLOW_LITE_PORTABLE_TYPE_TO_TFLITETYPE_H_ + +// Most of the definitions have been moved to this subheader so that Micro +// can include it without relying on and , which isn't +// available on all platforms. + +// Arduino build defines abs as a macro here. That is invalid C++, and breaks +// libc++'s header, undefine it. +#ifdef abs +#undef abs +#endif + +#include + +#include "tensorflow/lite/c/common.h" + +namespace tflite { +// Map statically from a C++ type to a TfLiteType. Used in interpreter for +// safe casts. +// Example: +// typeToTfLiteType() -> kTfLiteBool +template +constexpr TfLiteType typeToTfLiteType() +{ + return kTfLiteNoType; +} +// Map from TfLiteType to the corresponding C++ type. +// Example: +// TfLiteTypeToType::Type -> bool +template +struct TfLiteTypeToType { +}; // Specializations below + +// Template specialization for both typeToTfLiteType and TfLiteTypeToType. +#define MATCH_TYPE_AND_TFLITE_TYPE(CPP_TYPE, TFLITE_TYPE_ENUM) \ + template <> \ + constexpr TfLiteType typeToTfLiteType() \ + { \ + return TFLITE_TYPE_ENUM; \ + } \ + template <> \ + struct TfLiteTypeToType { \ + using Type = CPP_TYPE; \ + } + +// No string mapping is included here, since the TF Lite packed representation +// doesn't correspond to a C++ type well. +MATCH_TYPE_AND_TFLITE_TYPE(int32_t, kTfLiteInt32); +MATCH_TYPE_AND_TFLITE_TYPE(uint32_t, kTfLiteUInt32); +MATCH_TYPE_AND_TFLITE_TYPE(int16_t, kTfLiteInt16); +MATCH_TYPE_AND_TFLITE_TYPE(int64_t, kTfLiteInt64); +MATCH_TYPE_AND_TFLITE_TYPE(float, kTfLiteFloat32); +MATCH_TYPE_AND_TFLITE_TYPE(unsigned char, kTfLiteUInt8); +MATCH_TYPE_AND_TFLITE_TYPE(int8_t, kTfLiteInt8); +MATCH_TYPE_AND_TFLITE_TYPE(bool, kTfLiteBool); +MATCH_TYPE_AND_TFLITE_TYPE(TfLiteFloat16, kTfLiteFloat16); +MATCH_TYPE_AND_TFLITE_TYPE(double, kTfLiteFloat64); +MATCH_TYPE_AND_TFLITE_TYPE(uint64_t, kTfLiteUInt64); + +} // namespace tflite +#endif // TENSORFLOW_LITE_PORTABLE_TYPE_TO_TFLITETYPE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/schema/schema_generated.h b/components/TensorFlowLite/tensorflow/lite/schema/schema_generated.h new file mode 100644 index 00000000..6345445d --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/schema/schema_generated.h @@ -0,0 +1,21963 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +// automatically generated by the FlatBuffers compiler, do not modify + +#ifndef FLATBUFFERS_GENERATED_SCHEMA_TFLITE_H_ +#define FLATBUFFERS_GENERATED_SCHEMA_TFLITE_H_ + +#include "flatbuffers/flatbuffers.h" + +namespace tflite { +struct CustomQuantization; +struct CustomQuantizationT; + +struct QuantizationParameters; +struct QuantizationParametersT; + +struct Int32Vector; +struct Int32VectorT; + +struct Uint16Vector; +struct Uint16VectorT; + +struct Uint8Vector; +struct Uint8VectorT; + +struct DimensionMetadata; +struct DimensionMetadataT; + +struct SparsityParameters; +struct SparsityParametersT; + +struct Tensor; +struct TensorT; + +struct Conv2DOptions; +struct Conv2DOptionsT; + +struct Conv3DOptions; +struct Conv3DOptionsT; + +struct Pool2DOptions; +struct Pool2DOptionsT; + +struct DepthwiseConv2DOptions; +struct DepthwiseConv2DOptionsT; + +struct ConcatEmbeddingsOptions; +struct ConcatEmbeddingsOptionsT; + +struct LSHProjectionOptions; +struct LSHProjectionOptionsT; + +struct SVDFOptions; +struct SVDFOptionsT; + +struct RNNOptions; +struct RNNOptionsT; + +struct SequenceRNNOptions; +struct SequenceRNNOptionsT; + +struct BidirectionalSequenceRNNOptions; +struct BidirectionalSequenceRNNOptionsT; + +struct FullyConnectedOptions; +struct FullyConnectedOptionsT; + +struct SoftmaxOptions; +struct SoftmaxOptionsT; + +struct ConcatenationOptions; +struct ConcatenationOptionsT; + +struct AddOptions; +struct AddOptionsT; + +struct MulOptions; +struct MulOptionsT; + +struct L2NormOptions; +struct L2NormOptionsT; + +struct LocalResponseNormalizationOptions; +struct LocalResponseNormalizationOptionsT; + +struct LSTMOptions; +struct LSTMOptionsT; + +struct UnidirectionalSequenceLSTMOptions; +struct UnidirectionalSequenceLSTMOptionsT; + +struct BidirectionalSequenceLSTMOptions; +struct BidirectionalSequenceLSTMOptionsT; + +struct ResizeBilinearOptions; +struct ResizeBilinearOptionsT; + +struct ResizeNearestNeighborOptions; +struct ResizeNearestNeighborOptionsT; + +struct CallOptions; +struct CallOptionsT; + +struct PadOptions; +struct PadOptionsT; + +struct PadV2Options; +struct PadV2OptionsT; + +struct ReshapeOptions; +struct ReshapeOptionsT; + +struct SpaceToBatchNDOptions; +struct SpaceToBatchNDOptionsT; + +struct BatchToSpaceNDOptions; +struct BatchToSpaceNDOptionsT; + +struct SkipGramOptions; +struct SkipGramOptionsT; + +struct SpaceToDepthOptions; +struct SpaceToDepthOptionsT; + +struct DepthToSpaceOptions; +struct DepthToSpaceOptionsT; + +struct SubOptions; +struct SubOptionsT; + +struct DivOptions; +struct DivOptionsT; + +struct TopKV2Options; +struct TopKV2OptionsT; + +struct EmbeddingLookupSparseOptions; +struct EmbeddingLookupSparseOptionsT; + +struct GatherOptions; +struct GatherOptionsT; + +struct TransposeOptions; +struct TransposeOptionsT; + +struct ExpOptions; +struct ExpOptionsT; + +struct CosOptions; +struct CosOptionsT; + +struct ReducerOptions; +struct ReducerOptionsT; + +struct SqueezeOptions; +struct SqueezeOptionsT; + +struct SplitOptions; +struct SplitOptionsT; + +struct SplitVOptions; +struct SplitVOptionsT; + +struct StridedSliceOptions; +struct StridedSliceOptionsT; + +struct LogSoftmaxOptions; +struct LogSoftmaxOptionsT; + +struct CastOptions; +struct CastOptionsT; + +struct DequantizeOptions; +struct DequantizeOptionsT; + +struct MaximumMinimumOptions; +struct MaximumMinimumOptionsT; + +struct TileOptions; +struct TileOptionsT; + +struct ArgMaxOptions; +struct ArgMaxOptionsT; + +struct ArgMinOptions; +struct ArgMinOptionsT; + +struct GreaterOptions; +struct GreaterOptionsT; + +struct GreaterEqualOptions; +struct GreaterEqualOptionsT; + +struct LessOptions; +struct LessOptionsT; + +struct LessEqualOptions; +struct LessEqualOptionsT; + +struct NegOptions; +struct NegOptionsT; + +struct SelectOptions; +struct SelectOptionsT; + +struct SliceOptions; +struct SliceOptionsT; + +struct TransposeConvOptions; +struct TransposeConvOptionsT; + +struct ExpandDimsOptions; +struct ExpandDimsOptionsT; + +struct SparseToDenseOptions; +struct SparseToDenseOptionsT; + +struct EqualOptions; +struct EqualOptionsT; + +struct NotEqualOptions; +struct NotEqualOptionsT; + +struct ShapeOptions; +struct ShapeOptionsT; + +struct RankOptions; +struct RankOptionsT; + +struct PowOptions; +struct PowOptionsT; + +struct FakeQuantOptions; +struct FakeQuantOptionsT; + +struct PackOptions; +struct PackOptionsT; + +struct LogicalOrOptions; +struct LogicalOrOptionsT; + +struct OneHotOptions; +struct OneHotOptionsT; + +struct AbsOptions; +struct AbsOptionsT; + +struct HardSwishOptions; +struct HardSwishOptionsT; + +struct LogicalAndOptions; +struct LogicalAndOptionsT; + +struct LogicalNotOptions; +struct LogicalNotOptionsT; + +struct UnpackOptions; +struct UnpackOptionsT; + +struct FloorDivOptions; +struct FloorDivOptionsT; + +struct SquareOptions; +struct SquareOptionsT; + +struct ZerosLikeOptions; +struct ZerosLikeOptionsT; + +struct FillOptions; +struct FillOptionsT; + +struct FloorModOptions; +struct FloorModOptionsT; + +struct RangeOptions; +struct RangeOptionsT; + +struct LeakyReluOptions; +struct LeakyReluOptionsT; + +struct SquaredDifferenceOptions; +struct SquaredDifferenceOptionsT; + +struct MirrorPadOptions; +struct MirrorPadOptionsT; + +struct UniqueOptions; +struct UniqueOptionsT; + +struct ReverseV2Options; +struct ReverseV2OptionsT; + +struct AddNOptions; +struct AddNOptionsT; + +struct GatherNdOptions; +struct GatherNdOptionsT; + +struct WhereOptions; +struct WhereOptionsT; + +struct ReverseSequenceOptions; +struct ReverseSequenceOptionsT; + +struct MatrixDiagOptions; +struct MatrixDiagOptionsT; + +struct QuantizeOptions; +struct QuantizeOptionsT; + +struct MatrixSetDiagOptions; +struct MatrixSetDiagOptionsT; + +struct IfOptions; +struct IfOptionsT; + +struct CallOnceOptions; +struct CallOnceOptionsT; + +struct WhileOptions; +struct WhileOptionsT; + +struct NonMaxSuppressionV4Options; +struct NonMaxSuppressionV4OptionsT; + +struct NonMaxSuppressionV5Options; +struct NonMaxSuppressionV5OptionsT; + +struct ScatterNdOptions; +struct ScatterNdOptionsT; + +struct SelectV2Options; +struct SelectV2OptionsT; + +struct DensifyOptions; +struct DensifyOptionsT; + +struct SegmentSumOptions; +struct SegmentSumOptionsT; + +struct BatchMatMulOptions; +struct BatchMatMulOptionsT; + +struct CumsumOptions; +struct CumsumOptionsT; + +struct BroadcastToOptions; +struct BroadcastToOptionsT; + +struct Rfft2dOptions; +struct Rfft2dOptionsT; + +struct HashtableOptions; +struct HashtableOptionsT; + +struct HashtableFindOptions; +struct HashtableFindOptionsT; + +struct HashtableImportOptions; +struct HashtableImportOptionsT; + +struct HashtableSizeOptions; +struct HashtableSizeOptionsT; + +struct OperatorCode; +struct OperatorCodeT; + +struct Operator; +struct OperatorT; + +struct SubGraph; +struct SubGraphT; + +struct Buffer; +struct BufferT; + +struct Metadata; +struct MetadataT; + +struct TensorMap; +struct TensorMapT; + +struct SignatureDef; +struct SignatureDefT; + +struct Model; +struct ModelT; + +enum TensorType { + TensorType_FLOAT32 = 0, + TensorType_FLOAT16 = 1, + TensorType_INT32 = 2, + TensorType_UINT8 = 3, + TensorType_INT64 = 4, + TensorType_STRING = 5, + TensorType_BOOL = 6, + TensorType_INT16 = 7, + TensorType_COMPLEX64 = 8, + TensorType_INT8 = 9, + TensorType_FLOAT64 = 10, + TensorType_COMPLEX128 = 11, + TensorType_UINT64 = 12, + TensorType_RESOURCE = 13, + TensorType_VARIANT = 14, + TensorType_UINT32 = 15, + TensorType_MIN = TensorType_FLOAT32, + TensorType_MAX = TensorType_UINT32 +}; + +inline const TensorType (&EnumValuesTensorType())[16] +{ + static const TensorType values[] = { + TensorType_FLOAT32, + TensorType_FLOAT16, + TensorType_INT32, + TensorType_UINT8, + TensorType_INT64, + TensorType_STRING, + TensorType_BOOL, + TensorType_INT16, + TensorType_COMPLEX64, + TensorType_INT8, + TensorType_FLOAT64, + TensorType_COMPLEX128, + TensorType_UINT64, + TensorType_RESOURCE, + TensorType_VARIANT, + TensorType_UINT32 + }; + return values; +} + +inline const char *const *EnumNamesTensorType() +{ + static const char *const names[17] = { + "FLOAT32", + "FLOAT16", + "INT32", + "UINT8", + "INT64", + "STRING", + "BOOL", + "INT16", + "COMPLEX64", + "INT8", + "FLOAT64", + "COMPLEX128", + "UINT64", + "RESOURCE", + "VARIANT", + "UINT32", + nullptr + }; + return names; +} + +inline const char *EnumNameTensorType(TensorType e) +{ + if (flatbuffers::IsOutRange(e, TensorType_FLOAT32, TensorType_UINT32)) + return ""; + const size_t index = static_cast(e); + return EnumNamesTensorType()[index]; +} + +enum QuantizationDetails { + QuantizationDetails_NONE = 0, + QuantizationDetails_CustomQuantization = 1, + QuantizationDetails_MIN = QuantizationDetails_NONE, + QuantizationDetails_MAX = QuantizationDetails_CustomQuantization +}; + +inline const QuantizationDetails (&EnumValuesQuantizationDetails())[2] +{ + static const QuantizationDetails values[] = { + QuantizationDetails_NONE, + QuantizationDetails_CustomQuantization + }; + return values; +} + +inline const char *const *EnumNamesQuantizationDetails() +{ + static const char *const names[3] = { + "NONE", + "CustomQuantization", + nullptr + }; + return names; +} + +inline const char *EnumNameQuantizationDetails(QuantizationDetails e) +{ + if (flatbuffers::IsOutRange(e, QuantizationDetails_NONE, QuantizationDetails_CustomQuantization)) + return ""; + const size_t index = static_cast(e); + return EnumNamesQuantizationDetails()[index]; +} + +template +struct QuantizationDetailsTraits { + static const QuantizationDetails enum_value = QuantizationDetails_NONE; +}; + +template <> +struct QuantizationDetailsTraits { + static const QuantizationDetails enum_value = QuantizationDetails_CustomQuantization; +}; + +struct QuantizationDetailsUnion { + QuantizationDetails type; + void *value; + + QuantizationDetailsUnion() + : type(QuantizationDetails_NONE), value(nullptr) + { + } + QuantizationDetailsUnion(QuantizationDetailsUnion &&u) FLATBUFFERS_NOEXCEPT : type(QuantizationDetails_NONE), value(nullptr) + { + std::swap(type, u.type); + std::swap(value, u.value); + } + QuantizationDetailsUnion(const QuantizationDetailsUnion &) FLATBUFFERS_NOEXCEPT; + QuantizationDetailsUnion &operator=(const QuantizationDetailsUnion &u) FLATBUFFERS_NOEXCEPT + { + QuantizationDetailsUnion t(u); + std::swap(type, t.type); + std::swap(value, t.value); + return *this; + } + QuantizationDetailsUnion &operator=(QuantizationDetailsUnion &&u) FLATBUFFERS_NOEXCEPT + { + std::swap(type, u.type); + std::swap(value, u.value); + return *this; + } + ~QuantizationDetailsUnion() + { + Reset(); + } + + void Reset(); + +#ifndef FLATBUFFERS_CPP98_STL + template + void Set(T &&val) + { + using RT = typename std::remove_reference::type; + Reset(); + type = QuantizationDetailsTraits::enum_value; + if (type != QuantizationDetails_NONE) { + value = new RT(std::forward(val)); + } + } +#endif // FLATBUFFERS_CPP98_STL + + static void *UnPack(const void *obj, QuantizationDetails type, const flatbuffers::resolver_function_t *resolver); + flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const; + + tflite::CustomQuantizationT *AsCustomQuantization() + { + return type == QuantizationDetails_CustomQuantization ? + reinterpret_cast(value) : + nullptr; + } + const tflite::CustomQuantizationT *AsCustomQuantization() const + { + return type == QuantizationDetails_CustomQuantization ? + reinterpret_cast(value) : + nullptr; + } +}; + +bool VerifyQuantizationDetails(flatbuffers::Verifier &verifier, const void *obj, QuantizationDetails type); +bool VerifyQuantizationDetailsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector > *values, const flatbuffers::Vector *types); + +enum DimensionType { + DimensionType_DENSE = 0, + DimensionType_SPARSE_CSR = 1, + DimensionType_MIN = DimensionType_DENSE, + DimensionType_MAX = DimensionType_SPARSE_CSR +}; + +inline const DimensionType (&EnumValuesDimensionType())[2] +{ + static const DimensionType values[] = { + DimensionType_DENSE, + DimensionType_SPARSE_CSR + }; + return values; +} + +inline const char *const *EnumNamesDimensionType() +{ + static const char *const names[3] = { + "DENSE", + "SPARSE_CSR", + nullptr + }; + return names; +} + +inline const char *EnumNameDimensionType(DimensionType e) +{ + if (flatbuffers::IsOutRange(e, DimensionType_DENSE, DimensionType_SPARSE_CSR)) + return ""; + const size_t index = static_cast(e); + return EnumNamesDimensionType()[index]; +} + +enum SparseIndexVector { + SparseIndexVector_NONE = 0, + SparseIndexVector_Int32Vector = 1, + SparseIndexVector_Uint16Vector = 2, + SparseIndexVector_Uint8Vector = 3, + SparseIndexVector_MIN = SparseIndexVector_NONE, + SparseIndexVector_MAX = SparseIndexVector_Uint8Vector +}; + +inline const SparseIndexVector (&EnumValuesSparseIndexVector())[4] +{ + static const SparseIndexVector values[] = { + SparseIndexVector_NONE, + SparseIndexVector_Int32Vector, + SparseIndexVector_Uint16Vector, + SparseIndexVector_Uint8Vector + }; + return values; +} + +inline const char *const *EnumNamesSparseIndexVector() +{ + static const char *const names[5] = { + "NONE", + "Int32Vector", + "Uint16Vector", + "Uint8Vector", + nullptr + }; + return names; +} + +inline const char *EnumNameSparseIndexVector(SparseIndexVector e) +{ + if (flatbuffers::IsOutRange(e, SparseIndexVector_NONE, SparseIndexVector_Uint8Vector)) + return ""; + const size_t index = static_cast(e); + return EnumNamesSparseIndexVector()[index]; +} + +template +struct SparseIndexVectorTraits { + static const SparseIndexVector enum_value = SparseIndexVector_NONE; +}; + +template <> +struct SparseIndexVectorTraits { + static const SparseIndexVector enum_value = SparseIndexVector_Int32Vector; +}; + +template <> +struct SparseIndexVectorTraits { + static const SparseIndexVector enum_value = SparseIndexVector_Uint16Vector; +}; + +template <> +struct SparseIndexVectorTraits { + static const SparseIndexVector enum_value = SparseIndexVector_Uint8Vector; +}; + +struct SparseIndexVectorUnion { + SparseIndexVector type; + void *value; + + SparseIndexVectorUnion() + : type(SparseIndexVector_NONE), value(nullptr) + { + } + SparseIndexVectorUnion(SparseIndexVectorUnion &&u) FLATBUFFERS_NOEXCEPT : type(SparseIndexVector_NONE), value(nullptr) + { + std::swap(type, u.type); + std::swap(value, u.value); + } + SparseIndexVectorUnion(const SparseIndexVectorUnion &) FLATBUFFERS_NOEXCEPT; + SparseIndexVectorUnion &operator=(const SparseIndexVectorUnion &u) FLATBUFFERS_NOEXCEPT + { + SparseIndexVectorUnion t(u); + std::swap(type, t.type); + std::swap(value, t.value); + return *this; + } + SparseIndexVectorUnion &operator=(SparseIndexVectorUnion &&u) FLATBUFFERS_NOEXCEPT + { + std::swap(type, u.type); + std::swap(value, u.value); + return *this; + } + ~SparseIndexVectorUnion() + { + Reset(); + } + + void Reset(); + +#ifndef FLATBUFFERS_CPP98_STL + template + void Set(T &&val) + { + using RT = typename std::remove_reference::type; + Reset(); + type = SparseIndexVectorTraits::enum_value; + if (type != SparseIndexVector_NONE) { + value = new RT(std::forward(val)); + } + } +#endif // FLATBUFFERS_CPP98_STL + + static void *UnPack(const void *obj, SparseIndexVector type, const flatbuffers::resolver_function_t *resolver); + flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const; + + tflite::Int32VectorT *AsInt32Vector() + { + return type == SparseIndexVector_Int32Vector ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Int32VectorT *AsInt32Vector() const + { + return type == SparseIndexVector_Int32Vector ? + reinterpret_cast(value) : + nullptr; + } + tflite::Uint16VectorT *AsUint16Vector() + { + return type == SparseIndexVector_Uint16Vector ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Uint16VectorT *AsUint16Vector() const + { + return type == SparseIndexVector_Uint16Vector ? + reinterpret_cast(value) : + nullptr; + } + tflite::Uint8VectorT *AsUint8Vector() + { + return type == SparseIndexVector_Uint8Vector ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Uint8VectorT *AsUint8Vector() const + { + return type == SparseIndexVector_Uint8Vector ? + reinterpret_cast(value) : + nullptr; + } +}; + +bool VerifySparseIndexVector(flatbuffers::Verifier &verifier, const void *obj, SparseIndexVector type); +bool VerifySparseIndexVectorVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector > *values, const flatbuffers::Vector *types); + +enum BuiltinOperator { + BuiltinOperator_ADD = 0, + BuiltinOperator_AVERAGE_POOL_2D = 1, + BuiltinOperator_CONCATENATION = 2, + BuiltinOperator_CONV_2D = 3, + BuiltinOperator_DEPTHWISE_CONV_2D = 4, + BuiltinOperator_DEPTH_TO_SPACE = 5, + BuiltinOperator_DEQUANTIZE = 6, + BuiltinOperator_EMBEDDING_LOOKUP = 7, + BuiltinOperator_FLOOR = 8, + BuiltinOperator_FULLY_CONNECTED = 9, + BuiltinOperator_HASHTABLE_LOOKUP = 10, + BuiltinOperator_L2_NORMALIZATION = 11, + BuiltinOperator_L2_POOL_2D = 12, + BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION = 13, + BuiltinOperator_LOGISTIC = 14, + BuiltinOperator_LSH_PROJECTION = 15, + BuiltinOperator_LSTM = 16, + BuiltinOperator_MAX_POOL_2D = 17, + BuiltinOperator_MUL = 18, + BuiltinOperator_RELU = 19, + BuiltinOperator_RELU_N1_TO_1 = 20, + BuiltinOperator_RELU6 = 21, + BuiltinOperator_RESHAPE = 22, + BuiltinOperator_RESIZE_BILINEAR = 23, + BuiltinOperator_RNN = 24, + BuiltinOperator_SOFTMAX = 25, + BuiltinOperator_SPACE_TO_DEPTH = 26, + BuiltinOperator_SVDF = 27, + BuiltinOperator_TANH = 28, + BuiltinOperator_CONCAT_EMBEDDINGS = 29, + BuiltinOperator_SKIP_GRAM = 30, + BuiltinOperator_CALL = 31, + BuiltinOperator_CUSTOM = 32, + BuiltinOperator_EMBEDDING_LOOKUP_SPARSE = 33, + BuiltinOperator_PAD = 34, + BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN = 35, + BuiltinOperator_GATHER = 36, + BuiltinOperator_BATCH_TO_SPACE_ND = 37, + BuiltinOperator_SPACE_TO_BATCH_ND = 38, + BuiltinOperator_TRANSPOSE = 39, + BuiltinOperator_MEAN = 40, + BuiltinOperator_SUB = 41, + BuiltinOperator_DIV = 42, + BuiltinOperator_SQUEEZE = 43, + BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM = 44, + BuiltinOperator_STRIDED_SLICE = 45, + BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN = 46, + BuiltinOperator_EXP = 47, + BuiltinOperator_TOPK_V2 = 48, + BuiltinOperator_SPLIT = 49, + BuiltinOperator_LOG_SOFTMAX = 50, + BuiltinOperator_DELEGATE = 51, + BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM = 52, + BuiltinOperator_CAST = 53, + BuiltinOperator_PRELU = 54, + BuiltinOperator_MAXIMUM = 55, + BuiltinOperator_ARG_MAX = 56, + BuiltinOperator_MINIMUM = 57, + BuiltinOperator_LESS = 58, + BuiltinOperator_NEG = 59, + BuiltinOperator_PADV2 = 60, + BuiltinOperator_GREATER = 61, + BuiltinOperator_GREATER_EQUAL = 62, + BuiltinOperator_LESS_EQUAL = 63, + BuiltinOperator_SELECT = 64, + BuiltinOperator_SLICE = 65, + BuiltinOperator_SIN = 66, + BuiltinOperator_TRANSPOSE_CONV = 67, + BuiltinOperator_SPARSE_TO_DENSE = 68, + BuiltinOperator_TILE = 69, + BuiltinOperator_EXPAND_DIMS = 70, + BuiltinOperator_EQUAL = 71, + BuiltinOperator_NOT_EQUAL = 72, + BuiltinOperator_LOG = 73, + BuiltinOperator_SUM = 74, + BuiltinOperator_SQRT = 75, + BuiltinOperator_RSQRT = 76, + BuiltinOperator_SHAPE = 77, + BuiltinOperator_POW = 78, + BuiltinOperator_ARG_MIN = 79, + BuiltinOperator_FAKE_QUANT = 80, + BuiltinOperator_REDUCE_PROD = 81, + BuiltinOperator_REDUCE_MAX = 82, + BuiltinOperator_PACK = 83, + BuiltinOperator_LOGICAL_OR = 84, + BuiltinOperator_ONE_HOT = 85, + BuiltinOperator_LOGICAL_AND = 86, + BuiltinOperator_LOGICAL_NOT = 87, + BuiltinOperator_UNPACK = 88, + BuiltinOperator_REDUCE_MIN = 89, + BuiltinOperator_FLOOR_DIV = 90, + BuiltinOperator_REDUCE_ANY = 91, + BuiltinOperator_SQUARE = 92, + BuiltinOperator_ZEROS_LIKE = 93, + BuiltinOperator_FILL = 94, + BuiltinOperator_FLOOR_MOD = 95, + BuiltinOperator_RANGE = 96, + BuiltinOperator_RESIZE_NEAREST_NEIGHBOR = 97, + BuiltinOperator_LEAKY_RELU = 98, + BuiltinOperator_SQUARED_DIFFERENCE = 99, + BuiltinOperator_MIRROR_PAD = 100, + BuiltinOperator_ABS = 101, + BuiltinOperator_SPLIT_V = 102, + BuiltinOperator_UNIQUE = 103, + BuiltinOperator_CEIL = 104, + BuiltinOperator_REVERSE_V2 = 105, + BuiltinOperator_ADD_N = 106, + BuiltinOperator_GATHER_ND = 107, + BuiltinOperator_COS = 108, + BuiltinOperator_WHERE = 109, + BuiltinOperator_RANK = 110, + BuiltinOperator_ELU = 111, + BuiltinOperator_REVERSE_SEQUENCE = 112, + BuiltinOperator_MATRIX_DIAG = 113, + BuiltinOperator_QUANTIZE = 114, + BuiltinOperator_MATRIX_SET_DIAG = 115, + BuiltinOperator_ROUND = 116, + BuiltinOperator_HARD_SWISH = 117, + BuiltinOperator_IF = 118, + BuiltinOperator_WHILE = 119, + BuiltinOperator_NON_MAX_SUPPRESSION_V4 = 120, + BuiltinOperator_NON_MAX_SUPPRESSION_V5 = 121, + BuiltinOperator_SCATTER_ND = 122, + BuiltinOperator_SELECT_V2 = 123, + BuiltinOperator_DENSIFY = 124, + BuiltinOperator_SEGMENT_SUM = 125, + BuiltinOperator_BATCH_MATMUL = 126, + BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES = 127, + BuiltinOperator_CUMSUM = 128, + BuiltinOperator_CALL_ONCE = 129, + BuiltinOperator_BROADCAST_TO = 130, + BuiltinOperator_RFFT2D = 131, + BuiltinOperator_CONV_3D = 132, + BuiltinOperator_IMAG = 133, + BuiltinOperator_REAL = 134, + BuiltinOperator_COMPLEX_ABS = 135, + BuiltinOperator_HASHTABLE = 136, + BuiltinOperator_HASHTABLE_FIND = 137, + BuiltinOperator_HASHTABLE_IMPORT = 138, + BuiltinOperator_HASHTABLE_SIZE = 139, + BuiltinOperator_REDUCE_ALL = 140, + BuiltinOperator_CONV_3D_TRANSPOSE = 141, + BuiltinOperator_MIN = BuiltinOperator_ADD, + BuiltinOperator_MAX = BuiltinOperator_CONV_3D_TRANSPOSE +}; + +inline const BuiltinOperator (&EnumValuesBuiltinOperator())[142] +{ + static const BuiltinOperator values[] = { + BuiltinOperator_ADD, + BuiltinOperator_AVERAGE_POOL_2D, + BuiltinOperator_CONCATENATION, + BuiltinOperator_CONV_2D, + BuiltinOperator_DEPTHWISE_CONV_2D, + BuiltinOperator_DEPTH_TO_SPACE, + BuiltinOperator_DEQUANTIZE, + BuiltinOperator_EMBEDDING_LOOKUP, + BuiltinOperator_FLOOR, + BuiltinOperator_FULLY_CONNECTED, + BuiltinOperator_HASHTABLE_LOOKUP, + BuiltinOperator_L2_NORMALIZATION, + BuiltinOperator_L2_POOL_2D, + BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION, + BuiltinOperator_LOGISTIC, + BuiltinOperator_LSH_PROJECTION, + BuiltinOperator_LSTM, + BuiltinOperator_MAX_POOL_2D, + BuiltinOperator_MUL, + BuiltinOperator_RELU, + BuiltinOperator_RELU_N1_TO_1, + BuiltinOperator_RELU6, + BuiltinOperator_RESHAPE, + BuiltinOperator_RESIZE_BILINEAR, + BuiltinOperator_RNN, + BuiltinOperator_SOFTMAX, + BuiltinOperator_SPACE_TO_DEPTH, + BuiltinOperator_SVDF, + BuiltinOperator_TANH, + BuiltinOperator_CONCAT_EMBEDDINGS, + BuiltinOperator_SKIP_GRAM, + BuiltinOperator_CALL, + BuiltinOperator_CUSTOM, + BuiltinOperator_EMBEDDING_LOOKUP_SPARSE, + BuiltinOperator_PAD, + BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN, + BuiltinOperator_GATHER, + BuiltinOperator_BATCH_TO_SPACE_ND, + BuiltinOperator_SPACE_TO_BATCH_ND, + BuiltinOperator_TRANSPOSE, + BuiltinOperator_MEAN, + BuiltinOperator_SUB, + BuiltinOperator_DIV, + BuiltinOperator_SQUEEZE, + BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM, + BuiltinOperator_STRIDED_SLICE, + BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN, + BuiltinOperator_EXP, + BuiltinOperator_TOPK_V2, + BuiltinOperator_SPLIT, + BuiltinOperator_LOG_SOFTMAX, + BuiltinOperator_DELEGATE, + BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM, + BuiltinOperator_CAST, + BuiltinOperator_PRELU, + BuiltinOperator_MAXIMUM, + BuiltinOperator_ARG_MAX, + BuiltinOperator_MINIMUM, + BuiltinOperator_LESS, + BuiltinOperator_NEG, + BuiltinOperator_PADV2, + BuiltinOperator_GREATER, + BuiltinOperator_GREATER_EQUAL, + BuiltinOperator_LESS_EQUAL, + BuiltinOperator_SELECT, + BuiltinOperator_SLICE, + BuiltinOperator_SIN, + BuiltinOperator_TRANSPOSE_CONV, + BuiltinOperator_SPARSE_TO_DENSE, + BuiltinOperator_TILE, + BuiltinOperator_EXPAND_DIMS, + BuiltinOperator_EQUAL, + BuiltinOperator_NOT_EQUAL, + BuiltinOperator_LOG, + BuiltinOperator_SUM, + BuiltinOperator_SQRT, + BuiltinOperator_RSQRT, + BuiltinOperator_SHAPE, + BuiltinOperator_POW, + BuiltinOperator_ARG_MIN, + BuiltinOperator_FAKE_QUANT, + BuiltinOperator_REDUCE_PROD, + BuiltinOperator_REDUCE_MAX, + BuiltinOperator_PACK, + BuiltinOperator_LOGICAL_OR, + BuiltinOperator_ONE_HOT, + BuiltinOperator_LOGICAL_AND, + BuiltinOperator_LOGICAL_NOT, + BuiltinOperator_UNPACK, + BuiltinOperator_REDUCE_MIN, + BuiltinOperator_FLOOR_DIV, + BuiltinOperator_REDUCE_ANY, + BuiltinOperator_SQUARE, + BuiltinOperator_ZEROS_LIKE, + BuiltinOperator_FILL, + BuiltinOperator_FLOOR_MOD, + BuiltinOperator_RANGE, + BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, + BuiltinOperator_LEAKY_RELU, + BuiltinOperator_SQUARED_DIFFERENCE, + BuiltinOperator_MIRROR_PAD, + BuiltinOperator_ABS, + BuiltinOperator_SPLIT_V, + BuiltinOperator_UNIQUE, + BuiltinOperator_CEIL, + BuiltinOperator_REVERSE_V2, + BuiltinOperator_ADD_N, + BuiltinOperator_GATHER_ND, + BuiltinOperator_COS, + BuiltinOperator_WHERE, + BuiltinOperator_RANK, + BuiltinOperator_ELU, + BuiltinOperator_REVERSE_SEQUENCE, + BuiltinOperator_MATRIX_DIAG, + BuiltinOperator_QUANTIZE, + BuiltinOperator_MATRIX_SET_DIAG, + BuiltinOperator_ROUND, + BuiltinOperator_HARD_SWISH, + BuiltinOperator_IF, + BuiltinOperator_WHILE, + BuiltinOperator_NON_MAX_SUPPRESSION_V4, + BuiltinOperator_NON_MAX_SUPPRESSION_V5, + BuiltinOperator_SCATTER_ND, + BuiltinOperator_SELECT_V2, + BuiltinOperator_DENSIFY, + BuiltinOperator_SEGMENT_SUM, + BuiltinOperator_BATCH_MATMUL, + BuiltinOperator_PLACEHOLDER_FOR_GREATER_OP_CODES, + BuiltinOperator_CUMSUM, + BuiltinOperator_CALL_ONCE, + BuiltinOperator_BROADCAST_TO, + BuiltinOperator_RFFT2D, + BuiltinOperator_CONV_3D, + BuiltinOperator_IMAG, + BuiltinOperator_REAL, + BuiltinOperator_COMPLEX_ABS, + BuiltinOperator_HASHTABLE, + BuiltinOperator_HASHTABLE_FIND, + BuiltinOperator_HASHTABLE_IMPORT, + BuiltinOperator_HASHTABLE_SIZE, + BuiltinOperator_REDUCE_ALL, + BuiltinOperator_CONV_3D_TRANSPOSE + }; + return values; +} + +inline const char *const *EnumNamesBuiltinOperator() +{ + static const char *const names[143] = { + "ADD", + "AVERAGE_POOL_2D", + "CONCATENATION", + "CONV_2D", + "DEPTHWISE_CONV_2D", + "DEPTH_TO_SPACE", + "DEQUANTIZE", + "EMBEDDING_LOOKUP", + "FLOOR", + "FULLY_CONNECTED", + "HASHTABLE_LOOKUP", + "L2_NORMALIZATION", + "L2_POOL_2D", + "LOCAL_RESPONSE_NORMALIZATION", + "LOGISTIC", + "LSH_PROJECTION", + "LSTM", + "MAX_POOL_2D", + "MUL", + "RELU", + "RELU_N1_TO_1", + "RELU6", + "RESHAPE", + "RESIZE_BILINEAR", + "RNN", + "SOFTMAX", + "SPACE_TO_DEPTH", + "SVDF", + "TANH", + "CONCAT_EMBEDDINGS", + "SKIP_GRAM", + "CALL", + "CUSTOM", + "EMBEDDING_LOOKUP_SPARSE", + "PAD", + "UNIDIRECTIONAL_SEQUENCE_RNN", + "GATHER", + "BATCH_TO_SPACE_ND", + "SPACE_TO_BATCH_ND", + "TRANSPOSE", + "MEAN", + "SUB", + "DIV", + "SQUEEZE", + "UNIDIRECTIONAL_SEQUENCE_LSTM", + "STRIDED_SLICE", + "BIDIRECTIONAL_SEQUENCE_RNN", + "EXP", + "TOPK_V2", + "SPLIT", + "LOG_SOFTMAX", + "DELEGATE", + "BIDIRECTIONAL_SEQUENCE_LSTM", + "CAST", + "PRELU", + "MAXIMUM", + "ARG_MAX", + "MINIMUM", + "LESS", + "NEG", + "PADV2", + "GREATER", + "GREATER_EQUAL", + "LESS_EQUAL", + "SELECT", + "SLICE", + "SIN", + "TRANSPOSE_CONV", + "SPARSE_TO_DENSE", + "TILE", + "EXPAND_DIMS", + "EQUAL", + "NOT_EQUAL", + "LOG", + "SUM", + "SQRT", + "RSQRT", + "SHAPE", + "POW", + "ARG_MIN", + "FAKE_QUANT", + "REDUCE_PROD", + "REDUCE_MAX", + "PACK", + "LOGICAL_OR", + "ONE_HOT", + "LOGICAL_AND", + "LOGICAL_NOT", + "UNPACK", + "REDUCE_MIN", + "FLOOR_DIV", + "REDUCE_ANY", + "SQUARE", + "ZEROS_LIKE", + "FILL", + "FLOOR_MOD", + "RANGE", + "RESIZE_NEAREST_NEIGHBOR", + "LEAKY_RELU", + "SQUARED_DIFFERENCE", + "MIRROR_PAD", + "ABS", + "SPLIT_V", + "UNIQUE", + "CEIL", + "REVERSE_V2", + "ADD_N", + "GATHER_ND", + "COS", + "WHERE", + "RANK", + "ELU", + "REVERSE_SEQUENCE", + "MATRIX_DIAG", + "QUANTIZE", + "MATRIX_SET_DIAG", + "ROUND", + "HARD_SWISH", + "IF", + "WHILE", + "NON_MAX_SUPPRESSION_V4", + "NON_MAX_SUPPRESSION_V5", + "SCATTER_ND", + "SELECT_V2", + "DENSIFY", + "SEGMENT_SUM", + "BATCH_MATMUL", + "PLACEHOLDER_FOR_GREATER_OP_CODES", + "CUMSUM", + "CALL_ONCE", + "BROADCAST_TO", + "RFFT2D", + "CONV_3D", + "IMAG", + "REAL", + "COMPLEX_ABS", + "HASHTABLE", + "HASHTABLE_FIND", + "HASHTABLE_IMPORT", + "HASHTABLE_SIZE", + "REDUCE_ALL", + "CONV_3D_TRANSPOSE", + nullptr + }; + return names; +} + +inline const char *EnumNameBuiltinOperator(BuiltinOperator e) +{ + if (flatbuffers::IsOutRange(e, BuiltinOperator_ADD, BuiltinOperator_CONV_3D_TRANSPOSE)) + return ""; + const size_t index = static_cast(e); + return EnumNamesBuiltinOperator()[index]; +} + +enum BuiltinOptions { + BuiltinOptions_NONE = 0, + BuiltinOptions_Conv2DOptions = 1, + BuiltinOptions_DepthwiseConv2DOptions = 2, + BuiltinOptions_ConcatEmbeddingsOptions = 3, + BuiltinOptions_LSHProjectionOptions = 4, + BuiltinOptions_Pool2DOptions = 5, + BuiltinOptions_SVDFOptions = 6, + BuiltinOptions_RNNOptions = 7, + BuiltinOptions_FullyConnectedOptions = 8, + BuiltinOptions_SoftmaxOptions = 9, + BuiltinOptions_ConcatenationOptions = 10, + BuiltinOptions_AddOptions = 11, + BuiltinOptions_L2NormOptions = 12, + BuiltinOptions_LocalResponseNormalizationOptions = 13, + BuiltinOptions_LSTMOptions = 14, + BuiltinOptions_ResizeBilinearOptions = 15, + BuiltinOptions_CallOptions = 16, + BuiltinOptions_ReshapeOptions = 17, + BuiltinOptions_SkipGramOptions = 18, + BuiltinOptions_SpaceToDepthOptions = 19, + BuiltinOptions_EmbeddingLookupSparseOptions = 20, + BuiltinOptions_MulOptions = 21, + BuiltinOptions_PadOptions = 22, + BuiltinOptions_GatherOptions = 23, + BuiltinOptions_BatchToSpaceNDOptions = 24, + BuiltinOptions_SpaceToBatchNDOptions = 25, + BuiltinOptions_TransposeOptions = 26, + BuiltinOptions_ReducerOptions = 27, + BuiltinOptions_SubOptions = 28, + BuiltinOptions_DivOptions = 29, + BuiltinOptions_SqueezeOptions = 30, + BuiltinOptions_SequenceRNNOptions = 31, + BuiltinOptions_StridedSliceOptions = 32, + BuiltinOptions_ExpOptions = 33, + BuiltinOptions_TopKV2Options = 34, + BuiltinOptions_SplitOptions = 35, + BuiltinOptions_LogSoftmaxOptions = 36, + BuiltinOptions_CastOptions = 37, + BuiltinOptions_DequantizeOptions = 38, + BuiltinOptions_MaximumMinimumOptions = 39, + BuiltinOptions_ArgMaxOptions = 40, + BuiltinOptions_LessOptions = 41, + BuiltinOptions_NegOptions = 42, + BuiltinOptions_PadV2Options = 43, + BuiltinOptions_GreaterOptions = 44, + BuiltinOptions_GreaterEqualOptions = 45, + BuiltinOptions_LessEqualOptions = 46, + BuiltinOptions_SelectOptions = 47, + BuiltinOptions_SliceOptions = 48, + BuiltinOptions_TransposeConvOptions = 49, + BuiltinOptions_SparseToDenseOptions = 50, + BuiltinOptions_TileOptions = 51, + BuiltinOptions_ExpandDimsOptions = 52, + BuiltinOptions_EqualOptions = 53, + BuiltinOptions_NotEqualOptions = 54, + BuiltinOptions_ShapeOptions = 55, + BuiltinOptions_PowOptions = 56, + BuiltinOptions_ArgMinOptions = 57, + BuiltinOptions_FakeQuantOptions = 58, + BuiltinOptions_PackOptions = 59, + BuiltinOptions_LogicalOrOptions = 60, + BuiltinOptions_OneHotOptions = 61, + BuiltinOptions_LogicalAndOptions = 62, + BuiltinOptions_LogicalNotOptions = 63, + BuiltinOptions_UnpackOptions = 64, + BuiltinOptions_FloorDivOptions = 65, + BuiltinOptions_SquareOptions = 66, + BuiltinOptions_ZerosLikeOptions = 67, + BuiltinOptions_FillOptions = 68, + BuiltinOptions_BidirectionalSequenceLSTMOptions = 69, + BuiltinOptions_BidirectionalSequenceRNNOptions = 70, + BuiltinOptions_UnidirectionalSequenceLSTMOptions = 71, + BuiltinOptions_FloorModOptions = 72, + BuiltinOptions_RangeOptions = 73, + BuiltinOptions_ResizeNearestNeighborOptions = 74, + BuiltinOptions_LeakyReluOptions = 75, + BuiltinOptions_SquaredDifferenceOptions = 76, + BuiltinOptions_MirrorPadOptions = 77, + BuiltinOptions_AbsOptions = 78, + BuiltinOptions_SplitVOptions = 79, + BuiltinOptions_UniqueOptions = 80, + BuiltinOptions_ReverseV2Options = 81, + BuiltinOptions_AddNOptions = 82, + BuiltinOptions_GatherNdOptions = 83, + BuiltinOptions_CosOptions = 84, + BuiltinOptions_WhereOptions = 85, + BuiltinOptions_RankOptions = 86, + BuiltinOptions_ReverseSequenceOptions = 87, + BuiltinOptions_MatrixDiagOptions = 88, + BuiltinOptions_QuantizeOptions = 89, + BuiltinOptions_MatrixSetDiagOptions = 90, + BuiltinOptions_HardSwishOptions = 91, + BuiltinOptions_IfOptions = 92, + BuiltinOptions_WhileOptions = 93, + BuiltinOptions_DepthToSpaceOptions = 94, + BuiltinOptions_NonMaxSuppressionV4Options = 95, + BuiltinOptions_NonMaxSuppressionV5Options = 96, + BuiltinOptions_ScatterNdOptions = 97, + BuiltinOptions_SelectV2Options = 98, + BuiltinOptions_DensifyOptions = 99, + BuiltinOptions_SegmentSumOptions = 100, + BuiltinOptions_BatchMatMulOptions = 101, + BuiltinOptions_CumsumOptions = 102, + BuiltinOptions_CallOnceOptions = 103, + BuiltinOptions_BroadcastToOptions = 104, + BuiltinOptions_Rfft2dOptions = 105, + BuiltinOptions_Conv3DOptions = 106, + BuiltinOptions_HashtableOptions = 107, + BuiltinOptions_HashtableFindOptions = 108, + BuiltinOptions_HashtableImportOptions = 109, + BuiltinOptions_HashtableSizeOptions = 110, + BuiltinOptions_MIN = BuiltinOptions_NONE, + BuiltinOptions_MAX = BuiltinOptions_HashtableSizeOptions +}; + +inline const BuiltinOptions (&EnumValuesBuiltinOptions())[111] +{ + static const BuiltinOptions values[] = { + BuiltinOptions_NONE, + BuiltinOptions_Conv2DOptions, + BuiltinOptions_DepthwiseConv2DOptions, + BuiltinOptions_ConcatEmbeddingsOptions, + BuiltinOptions_LSHProjectionOptions, + BuiltinOptions_Pool2DOptions, + BuiltinOptions_SVDFOptions, + BuiltinOptions_RNNOptions, + BuiltinOptions_FullyConnectedOptions, + BuiltinOptions_SoftmaxOptions, + BuiltinOptions_ConcatenationOptions, + BuiltinOptions_AddOptions, + BuiltinOptions_L2NormOptions, + BuiltinOptions_LocalResponseNormalizationOptions, + BuiltinOptions_LSTMOptions, + BuiltinOptions_ResizeBilinearOptions, + BuiltinOptions_CallOptions, + BuiltinOptions_ReshapeOptions, + BuiltinOptions_SkipGramOptions, + BuiltinOptions_SpaceToDepthOptions, + BuiltinOptions_EmbeddingLookupSparseOptions, + BuiltinOptions_MulOptions, + BuiltinOptions_PadOptions, + BuiltinOptions_GatherOptions, + BuiltinOptions_BatchToSpaceNDOptions, + BuiltinOptions_SpaceToBatchNDOptions, + BuiltinOptions_TransposeOptions, + BuiltinOptions_ReducerOptions, + BuiltinOptions_SubOptions, + BuiltinOptions_DivOptions, + BuiltinOptions_SqueezeOptions, + BuiltinOptions_SequenceRNNOptions, + BuiltinOptions_StridedSliceOptions, + BuiltinOptions_ExpOptions, + BuiltinOptions_TopKV2Options, + BuiltinOptions_SplitOptions, + BuiltinOptions_LogSoftmaxOptions, + BuiltinOptions_CastOptions, + BuiltinOptions_DequantizeOptions, + BuiltinOptions_MaximumMinimumOptions, + BuiltinOptions_ArgMaxOptions, + BuiltinOptions_LessOptions, + BuiltinOptions_NegOptions, + BuiltinOptions_PadV2Options, + BuiltinOptions_GreaterOptions, + BuiltinOptions_GreaterEqualOptions, + BuiltinOptions_LessEqualOptions, + BuiltinOptions_SelectOptions, + BuiltinOptions_SliceOptions, + BuiltinOptions_TransposeConvOptions, + BuiltinOptions_SparseToDenseOptions, + BuiltinOptions_TileOptions, + BuiltinOptions_ExpandDimsOptions, + BuiltinOptions_EqualOptions, + BuiltinOptions_NotEqualOptions, + BuiltinOptions_ShapeOptions, + BuiltinOptions_PowOptions, + BuiltinOptions_ArgMinOptions, + BuiltinOptions_FakeQuantOptions, + BuiltinOptions_PackOptions, + BuiltinOptions_LogicalOrOptions, + BuiltinOptions_OneHotOptions, + BuiltinOptions_LogicalAndOptions, + BuiltinOptions_LogicalNotOptions, + BuiltinOptions_UnpackOptions, + BuiltinOptions_FloorDivOptions, + BuiltinOptions_SquareOptions, + BuiltinOptions_ZerosLikeOptions, + BuiltinOptions_FillOptions, + BuiltinOptions_BidirectionalSequenceLSTMOptions, + BuiltinOptions_BidirectionalSequenceRNNOptions, + BuiltinOptions_UnidirectionalSequenceLSTMOptions, + BuiltinOptions_FloorModOptions, + BuiltinOptions_RangeOptions, + BuiltinOptions_ResizeNearestNeighborOptions, + BuiltinOptions_LeakyReluOptions, + BuiltinOptions_SquaredDifferenceOptions, + BuiltinOptions_MirrorPadOptions, + BuiltinOptions_AbsOptions, + BuiltinOptions_SplitVOptions, + BuiltinOptions_UniqueOptions, + BuiltinOptions_ReverseV2Options, + BuiltinOptions_AddNOptions, + BuiltinOptions_GatherNdOptions, + BuiltinOptions_CosOptions, + BuiltinOptions_WhereOptions, + BuiltinOptions_RankOptions, + BuiltinOptions_ReverseSequenceOptions, + BuiltinOptions_MatrixDiagOptions, + BuiltinOptions_QuantizeOptions, + BuiltinOptions_MatrixSetDiagOptions, + BuiltinOptions_HardSwishOptions, + BuiltinOptions_IfOptions, + BuiltinOptions_WhileOptions, + BuiltinOptions_DepthToSpaceOptions, + BuiltinOptions_NonMaxSuppressionV4Options, + BuiltinOptions_NonMaxSuppressionV5Options, + BuiltinOptions_ScatterNdOptions, + BuiltinOptions_SelectV2Options, + BuiltinOptions_DensifyOptions, + BuiltinOptions_SegmentSumOptions, + BuiltinOptions_BatchMatMulOptions, + BuiltinOptions_CumsumOptions, + BuiltinOptions_CallOnceOptions, + BuiltinOptions_BroadcastToOptions, + BuiltinOptions_Rfft2dOptions, + BuiltinOptions_Conv3DOptions, + BuiltinOptions_HashtableOptions, + BuiltinOptions_HashtableFindOptions, + BuiltinOptions_HashtableImportOptions, + BuiltinOptions_HashtableSizeOptions + }; + return values; +} + +inline const char *const *EnumNamesBuiltinOptions() +{ + static const char *const names[112] = { + "NONE", + "Conv2DOptions", + "DepthwiseConv2DOptions", + "ConcatEmbeddingsOptions", + "LSHProjectionOptions", + "Pool2DOptions", + "SVDFOptions", + "RNNOptions", + "FullyConnectedOptions", + "SoftmaxOptions", + "ConcatenationOptions", + "AddOptions", + "L2NormOptions", + "LocalResponseNormalizationOptions", + "LSTMOptions", + "ResizeBilinearOptions", + "CallOptions", + "ReshapeOptions", + "SkipGramOptions", + "SpaceToDepthOptions", + "EmbeddingLookupSparseOptions", + "MulOptions", + "PadOptions", + "GatherOptions", + "BatchToSpaceNDOptions", + "SpaceToBatchNDOptions", + "TransposeOptions", + "ReducerOptions", + "SubOptions", + "DivOptions", + "SqueezeOptions", + "SequenceRNNOptions", + "StridedSliceOptions", + "ExpOptions", + "TopKV2Options", + "SplitOptions", + "LogSoftmaxOptions", + "CastOptions", + "DequantizeOptions", + "MaximumMinimumOptions", + "ArgMaxOptions", + "LessOptions", + "NegOptions", + "PadV2Options", + "GreaterOptions", + "GreaterEqualOptions", + "LessEqualOptions", + "SelectOptions", + "SliceOptions", + "TransposeConvOptions", + "SparseToDenseOptions", + "TileOptions", + "ExpandDimsOptions", + "EqualOptions", + "NotEqualOptions", + "ShapeOptions", + "PowOptions", + "ArgMinOptions", + "FakeQuantOptions", + "PackOptions", + "LogicalOrOptions", + "OneHotOptions", + "LogicalAndOptions", + "LogicalNotOptions", + "UnpackOptions", + "FloorDivOptions", + "SquareOptions", + "ZerosLikeOptions", + "FillOptions", + "BidirectionalSequenceLSTMOptions", + "BidirectionalSequenceRNNOptions", + "UnidirectionalSequenceLSTMOptions", + "FloorModOptions", + "RangeOptions", + "ResizeNearestNeighborOptions", + "LeakyReluOptions", + "SquaredDifferenceOptions", + "MirrorPadOptions", + "AbsOptions", + "SplitVOptions", + "UniqueOptions", + "ReverseV2Options", + "AddNOptions", + "GatherNdOptions", + "CosOptions", + "WhereOptions", + "RankOptions", + "ReverseSequenceOptions", + "MatrixDiagOptions", + "QuantizeOptions", + "MatrixSetDiagOptions", + "HardSwishOptions", + "IfOptions", + "WhileOptions", + "DepthToSpaceOptions", + "NonMaxSuppressionV4Options", + "NonMaxSuppressionV5Options", + "ScatterNdOptions", + "SelectV2Options", + "DensifyOptions", + "SegmentSumOptions", + "BatchMatMulOptions", + "CumsumOptions", + "CallOnceOptions", + "BroadcastToOptions", + "Rfft2dOptions", + "Conv3DOptions", + "HashtableOptions", + "HashtableFindOptions", + "HashtableImportOptions", + "HashtableSizeOptions", + nullptr + }; + return names; +} + +inline const char *EnumNameBuiltinOptions(BuiltinOptions e) +{ + if (flatbuffers::IsOutRange(e, BuiltinOptions_NONE, BuiltinOptions_HashtableSizeOptions)) + return ""; + const size_t index = static_cast(e); + return EnumNamesBuiltinOptions()[index]; +} + +template +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_NONE; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_Conv2DOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_DepthwiseConv2DOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ConcatEmbeddingsOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LSHProjectionOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_Pool2DOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SVDFOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_RNNOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_FullyConnectedOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SoftmaxOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ConcatenationOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_AddOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_L2NormOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LocalResponseNormalizationOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LSTMOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ResizeBilinearOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_CallOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ReshapeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SkipGramOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SpaceToDepthOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_EmbeddingLookupSparseOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_MulOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_PadOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_GatherOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_BatchToSpaceNDOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SpaceToBatchNDOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_TransposeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ReducerOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SubOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_DivOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SqueezeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SequenceRNNOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_StridedSliceOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ExpOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_TopKV2Options; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SplitOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LogSoftmaxOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_CastOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_DequantizeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_MaximumMinimumOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ArgMaxOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LessOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_NegOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_PadV2Options; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_GreaterOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_GreaterEqualOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LessEqualOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SelectOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SliceOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_TransposeConvOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SparseToDenseOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_TileOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ExpandDimsOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_EqualOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_NotEqualOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ShapeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_PowOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ArgMinOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_FakeQuantOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_PackOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LogicalOrOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_OneHotOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LogicalAndOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LogicalNotOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_UnpackOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_FloorDivOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SquareOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ZerosLikeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_FillOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_BidirectionalSequenceLSTMOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_BidirectionalSequenceRNNOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_UnidirectionalSequenceLSTMOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_FloorModOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_RangeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ResizeNearestNeighborOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_LeakyReluOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SquaredDifferenceOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_MirrorPadOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_AbsOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SplitVOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_UniqueOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ReverseV2Options; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_AddNOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_GatherNdOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_CosOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_WhereOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_RankOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ReverseSequenceOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_MatrixDiagOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_QuantizeOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_MatrixSetDiagOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_HardSwishOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_IfOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_WhileOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_DepthToSpaceOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_NonMaxSuppressionV4Options; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_NonMaxSuppressionV5Options; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_ScatterNdOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SelectV2Options; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_DensifyOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_SegmentSumOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_BatchMatMulOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_CumsumOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_CallOnceOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_BroadcastToOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_Rfft2dOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_Conv3DOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_HashtableOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_HashtableFindOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_HashtableImportOptions; +}; + +template <> +struct BuiltinOptionsTraits { + static const BuiltinOptions enum_value = BuiltinOptions_HashtableSizeOptions; +}; + +struct BuiltinOptionsUnion { + BuiltinOptions type; + void *value; + + BuiltinOptionsUnion() + : type(BuiltinOptions_NONE), value(nullptr) + { + } + BuiltinOptionsUnion(BuiltinOptionsUnion &&u) FLATBUFFERS_NOEXCEPT : type(BuiltinOptions_NONE), value(nullptr) + { + std::swap(type, u.type); + std::swap(value, u.value); + } + BuiltinOptionsUnion(const BuiltinOptionsUnion &) FLATBUFFERS_NOEXCEPT; + BuiltinOptionsUnion &operator=(const BuiltinOptionsUnion &u) FLATBUFFERS_NOEXCEPT + { + BuiltinOptionsUnion t(u); + std::swap(type, t.type); + std::swap(value, t.value); + return *this; + } + BuiltinOptionsUnion &operator=(BuiltinOptionsUnion &&u) FLATBUFFERS_NOEXCEPT + { + std::swap(type, u.type); + std::swap(value, u.value); + return *this; + } + ~BuiltinOptionsUnion() + { + Reset(); + } + + void Reset(); + +#ifndef FLATBUFFERS_CPP98_STL + template + void Set(T &&val) + { + using RT = typename std::remove_reference::type; + Reset(); + type = BuiltinOptionsTraits::enum_value; + if (type != BuiltinOptions_NONE) { + value = new RT(std::forward(val)); + } + } +#endif // FLATBUFFERS_CPP98_STL + + static void *UnPack(const void *obj, BuiltinOptions type, const flatbuffers::resolver_function_t *resolver); + flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const; + + tflite::Conv2DOptionsT *AsConv2DOptions() + { + return type == BuiltinOptions_Conv2DOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Conv2DOptionsT *AsConv2DOptions() const + { + return type == BuiltinOptions_Conv2DOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::DepthwiseConv2DOptionsT *AsDepthwiseConv2DOptions() + { + return type == BuiltinOptions_DepthwiseConv2DOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::DepthwiseConv2DOptionsT *AsDepthwiseConv2DOptions() const + { + return type == BuiltinOptions_DepthwiseConv2DOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ConcatEmbeddingsOptionsT *AsConcatEmbeddingsOptions() + { + return type == BuiltinOptions_ConcatEmbeddingsOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ConcatEmbeddingsOptionsT *AsConcatEmbeddingsOptions() const + { + return type == BuiltinOptions_ConcatEmbeddingsOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LSHProjectionOptionsT *AsLSHProjectionOptions() + { + return type == BuiltinOptions_LSHProjectionOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LSHProjectionOptionsT *AsLSHProjectionOptions() const + { + return type == BuiltinOptions_LSHProjectionOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::Pool2DOptionsT *AsPool2DOptions() + { + return type == BuiltinOptions_Pool2DOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Pool2DOptionsT *AsPool2DOptions() const + { + return type == BuiltinOptions_Pool2DOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SVDFOptionsT *AsSVDFOptions() + { + return type == BuiltinOptions_SVDFOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SVDFOptionsT *AsSVDFOptions() const + { + return type == BuiltinOptions_SVDFOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::RNNOptionsT *AsRNNOptions() + { + return type == BuiltinOptions_RNNOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::RNNOptionsT *AsRNNOptions() const + { + return type == BuiltinOptions_RNNOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::FullyConnectedOptionsT *AsFullyConnectedOptions() + { + return type == BuiltinOptions_FullyConnectedOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::FullyConnectedOptionsT *AsFullyConnectedOptions() const + { + return type == BuiltinOptions_FullyConnectedOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SoftmaxOptionsT *AsSoftmaxOptions() + { + return type == BuiltinOptions_SoftmaxOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SoftmaxOptionsT *AsSoftmaxOptions() const + { + return type == BuiltinOptions_SoftmaxOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ConcatenationOptionsT *AsConcatenationOptions() + { + return type == BuiltinOptions_ConcatenationOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ConcatenationOptionsT *AsConcatenationOptions() const + { + return type == BuiltinOptions_ConcatenationOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::AddOptionsT *AsAddOptions() + { + return type == BuiltinOptions_AddOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::AddOptionsT *AsAddOptions() const + { + return type == BuiltinOptions_AddOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::L2NormOptionsT *AsL2NormOptions() + { + return type == BuiltinOptions_L2NormOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::L2NormOptionsT *AsL2NormOptions() const + { + return type == BuiltinOptions_L2NormOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LocalResponseNormalizationOptionsT *AsLocalResponseNormalizationOptions() + { + return type == BuiltinOptions_LocalResponseNormalizationOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LocalResponseNormalizationOptionsT *AsLocalResponseNormalizationOptions() const + { + return type == BuiltinOptions_LocalResponseNormalizationOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LSTMOptionsT *AsLSTMOptions() + { + return type == BuiltinOptions_LSTMOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LSTMOptionsT *AsLSTMOptions() const + { + return type == BuiltinOptions_LSTMOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ResizeBilinearOptionsT *AsResizeBilinearOptions() + { + return type == BuiltinOptions_ResizeBilinearOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ResizeBilinearOptionsT *AsResizeBilinearOptions() const + { + return type == BuiltinOptions_ResizeBilinearOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::CallOptionsT *AsCallOptions() + { + return type == BuiltinOptions_CallOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::CallOptionsT *AsCallOptions() const + { + return type == BuiltinOptions_CallOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ReshapeOptionsT *AsReshapeOptions() + { + return type == BuiltinOptions_ReshapeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ReshapeOptionsT *AsReshapeOptions() const + { + return type == BuiltinOptions_ReshapeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SkipGramOptionsT *AsSkipGramOptions() + { + return type == BuiltinOptions_SkipGramOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SkipGramOptionsT *AsSkipGramOptions() const + { + return type == BuiltinOptions_SkipGramOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SpaceToDepthOptionsT *AsSpaceToDepthOptions() + { + return type == BuiltinOptions_SpaceToDepthOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SpaceToDepthOptionsT *AsSpaceToDepthOptions() const + { + return type == BuiltinOptions_SpaceToDepthOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::EmbeddingLookupSparseOptionsT *AsEmbeddingLookupSparseOptions() + { + return type == BuiltinOptions_EmbeddingLookupSparseOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::EmbeddingLookupSparseOptionsT *AsEmbeddingLookupSparseOptions() const + { + return type == BuiltinOptions_EmbeddingLookupSparseOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::MulOptionsT *AsMulOptions() + { + return type == BuiltinOptions_MulOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::MulOptionsT *AsMulOptions() const + { + return type == BuiltinOptions_MulOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::PadOptionsT *AsPadOptions() + { + return type == BuiltinOptions_PadOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::PadOptionsT *AsPadOptions() const + { + return type == BuiltinOptions_PadOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::GatherOptionsT *AsGatherOptions() + { + return type == BuiltinOptions_GatherOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::GatherOptionsT *AsGatherOptions() const + { + return type == BuiltinOptions_GatherOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::BatchToSpaceNDOptionsT *AsBatchToSpaceNDOptions() + { + return type == BuiltinOptions_BatchToSpaceNDOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::BatchToSpaceNDOptionsT *AsBatchToSpaceNDOptions() const + { + return type == BuiltinOptions_BatchToSpaceNDOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SpaceToBatchNDOptionsT *AsSpaceToBatchNDOptions() + { + return type == BuiltinOptions_SpaceToBatchNDOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SpaceToBatchNDOptionsT *AsSpaceToBatchNDOptions() const + { + return type == BuiltinOptions_SpaceToBatchNDOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::TransposeOptionsT *AsTransposeOptions() + { + return type == BuiltinOptions_TransposeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::TransposeOptionsT *AsTransposeOptions() const + { + return type == BuiltinOptions_TransposeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ReducerOptionsT *AsReducerOptions() + { + return type == BuiltinOptions_ReducerOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ReducerOptionsT *AsReducerOptions() const + { + return type == BuiltinOptions_ReducerOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SubOptionsT *AsSubOptions() + { + return type == BuiltinOptions_SubOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SubOptionsT *AsSubOptions() const + { + return type == BuiltinOptions_SubOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::DivOptionsT *AsDivOptions() + { + return type == BuiltinOptions_DivOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::DivOptionsT *AsDivOptions() const + { + return type == BuiltinOptions_DivOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SqueezeOptionsT *AsSqueezeOptions() + { + return type == BuiltinOptions_SqueezeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SqueezeOptionsT *AsSqueezeOptions() const + { + return type == BuiltinOptions_SqueezeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SequenceRNNOptionsT *AsSequenceRNNOptions() + { + return type == BuiltinOptions_SequenceRNNOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SequenceRNNOptionsT *AsSequenceRNNOptions() const + { + return type == BuiltinOptions_SequenceRNNOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::StridedSliceOptionsT *AsStridedSliceOptions() + { + return type == BuiltinOptions_StridedSliceOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::StridedSliceOptionsT *AsStridedSliceOptions() const + { + return type == BuiltinOptions_StridedSliceOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ExpOptionsT *AsExpOptions() + { + return type == BuiltinOptions_ExpOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ExpOptionsT *AsExpOptions() const + { + return type == BuiltinOptions_ExpOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::TopKV2OptionsT *AsTopKV2Options() + { + return type == BuiltinOptions_TopKV2Options ? + reinterpret_cast(value) : + nullptr; + } + const tflite::TopKV2OptionsT *AsTopKV2Options() const + { + return type == BuiltinOptions_TopKV2Options ? + reinterpret_cast(value) : + nullptr; + } + tflite::SplitOptionsT *AsSplitOptions() + { + return type == BuiltinOptions_SplitOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SplitOptionsT *AsSplitOptions() const + { + return type == BuiltinOptions_SplitOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LogSoftmaxOptionsT *AsLogSoftmaxOptions() + { + return type == BuiltinOptions_LogSoftmaxOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LogSoftmaxOptionsT *AsLogSoftmaxOptions() const + { + return type == BuiltinOptions_LogSoftmaxOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::CastOptionsT *AsCastOptions() + { + return type == BuiltinOptions_CastOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::CastOptionsT *AsCastOptions() const + { + return type == BuiltinOptions_CastOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::DequantizeOptionsT *AsDequantizeOptions() + { + return type == BuiltinOptions_DequantizeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::DequantizeOptionsT *AsDequantizeOptions() const + { + return type == BuiltinOptions_DequantizeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::MaximumMinimumOptionsT *AsMaximumMinimumOptions() + { + return type == BuiltinOptions_MaximumMinimumOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::MaximumMinimumOptionsT *AsMaximumMinimumOptions() const + { + return type == BuiltinOptions_MaximumMinimumOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ArgMaxOptionsT *AsArgMaxOptions() + { + return type == BuiltinOptions_ArgMaxOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ArgMaxOptionsT *AsArgMaxOptions() const + { + return type == BuiltinOptions_ArgMaxOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LessOptionsT *AsLessOptions() + { + return type == BuiltinOptions_LessOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LessOptionsT *AsLessOptions() const + { + return type == BuiltinOptions_LessOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::NegOptionsT *AsNegOptions() + { + return type == BuiltinOptions_NegOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::NegOptionsT *AsNegOptions() const + { + return type == BuiltinOptions_NegOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::PadV2OptionsT *AsPadV2Options() + { + return type == BuiltinOptions_PadV2Options ? + reinterpret_cast(value) : + nullptr; + } + const tflite::PadV2OptionsT *AsPadV2Options() const + { + return type == BuiltinOptions_PadV2Options ? + reinterpret_cast(value) : + nullptr; + } + tflite::GreaterOptionsT *AsGreaterOptions() + { + return type == BuiltinOptions_GreaterOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::GreaterOptionsT *AsGreaterOptions() const + { + return type == BuiltinOptions_GreaterOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::GreaterEqualOptionsT *AsGreaterEqualOptions() + { + return type == BuiltinOptions_GreaterEqualOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::GreaterEqualOptionsT *AsGreaterEqualOptions() const + { + return type == BuiltinOptions_GreaterEqualOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LessEqualOptionsT *AsLessEqualOptions() + { + return type == BuiltinOptions_LessEqualOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LessEqualOptionsT *AsLessEqualOptions() const + { + return type == BuiltinOptions_LessEqualOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SelectOptionsT *AsSelectOptions() + { + return type == BuiltinOptions_SelectOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SelectOptionsT *AsSelectOptions() const + { + return type == BuiltinOptions_SelectOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SliceOptionsT *AsSliceOptions() + { + return type == BuiltinOptions_SliceOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SliceOptionsT *AsSliceOptions() const + { + return type == BuiltinOptions_SliceOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::TransposeConvOptionsT *AsTransposeConvOptions() + { + return type == BuiltinOptions_TransposeConvOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::TransposeConvOptionsT *AsTransposeConvOptions() const + { + return type == BuiltinOptions_TransposeConvOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SparseToDenseOptionsT *AsSparseToDenseOptions() + { + return type == BuiltinOptions_SparseToDenseOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SparseToDenseOptionsT *AsSparseToDenseOptions() const + { + return type == BuiltinOptions_SparseToDenseOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::TileOptionsT *AsTileOptions() + { + return type == BuiltinOptions_TileOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::TileOptionsT *AsTileOptions() const + { + return type == BuiltinOptions_TileOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ExpandDimsOptionsT *AsExpandDimsOptions() + { + return type == BuiltinOptions_ExpandDimsOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ExpandDimsOptionsT *AsExpandDimsOptions() const + { + return type == BuiltinOptions_ExpandDimsOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::EqualOptionsT *AsEqualOptions() + { + return type == BuiltinOptions_EqualOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::EqualOptionsT *AsEqualOptions() const + { + return type == BuiltinOptions_EqualOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::NotEqualOptionsT *AsNotEqualOptions() + { + return type == BuiltinOptions_NotEqualOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::NotEqualOptionsT *AsNotEqualOptions() const + { + return type == BuiltinOptions_NotEqualOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ShapeOptionsT *AsShapeOptions() + { + return type == BuiltinOptions_ShapeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ShapeOptionsT *AsShapeOptions() const + { + return type == BuiltinOptions_ShapeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::PowOptionsT *AsPowOptions() + { + return type == BuiltinOptions_PowOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::PowOptionsT *AsPowOptions() const + { + return type == BuiltinOptions_PowOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ArgMinOptionsT *AsArgMinOptions() + { + return type == BuiltinOptions_ArgMinOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ArgMinOptionsT *AsArgMinOptions() const + { + return type == BuiltinOptions_ArgMinOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::FakeQuantOptionsT *AsFakeQuantOptions() + { + return type == BuiltinOptions_FakeQuantOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::FakeQuantOptionsT *AsFakeQuantOptions() const + { + return type == BuiltinOptions_FakeQuantOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::PackOptionsT *AsPackOptions() + { + return type == BuiltinOptions_PackOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::PackOptionsT *AsPackOptions() const + { + return type == BuiltinOptions_PackOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LogicalOrOptionsT *AsLogicalOrOptions() + { + return type == BuiltinOptions_LogicalOrOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LogicalOrOptionsT *AsLogicalOrOptions() const + { + return type == BuiltinOptions_LogicalOrOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::OneHotOptionsT *AsOneHotOptions() + { + return type == BuiltinOptions_OneHotOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::OneHotOptionsT *AsOneHotOptions() const + { + return type == BuiltinOptions_OneHotOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LogicalAndOptionsT *AsLogicalAndOptions() + { + return type == BuiltinOptions_LogicalAndOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LogicalAndOptionsT *AsLogicalAndOptions() const + { + return type == BuiltinOptions_LogicalAndOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LogicalNotOptionsT *AsLogicalNotOptions() + { + return type == BuiltinOptions_LogicalNotOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LogicalNotOptionsT *AsLogicalNotOptions() const + { + return type == BuiltinOptions_LogicalNotOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::UnpackOptionsT *AsUnpackOptions() + { + return type == BuiltinOptions_UnpackOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::UnpackOptionsT *AsUnpackOptions() const + { + return type == BuiltinOptions_UnpackOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::FloorDivOptionsT *AsFloorDivOptions() + { + return type == BuiltinOptions_FloorDivOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::FloorDivOptionsT *AsFloorDivOptions() const + { + return type == BuiltinOptions_FloorDivOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SquareOptionsT *AsSquareOptions() + { + return type == BuiltinOptions_SquareOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SquareOptionsT *AsSquareOptions() const + { + return type == BuiltinOptions_SquareOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ZerosLikeOptionsT *AsZerosLikeOptions() + { + return type == BuiltinOptions_ZerosLikeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ZerosLikeOptionsT *AsZerosLikeOptions() const + { + return type == BuiltinOptions_ZerosLikeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::FillOptionsT *AsFillOptions() + { + return type == BuiltinOptions_FillOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::FillOptionsT *AsFillOptions() const + { + return type == BuiltinOptions_FillOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::BidirectionalSequenceLSTMOptionsT *AsBidirectionalSequenceLSTMOptions() + { + return type == BuiltinOptions_BidirectionalSequenceLSTMOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::BidirectionalSequenceLSTMOptionsT *AsBidirectionalSequenceLSTMOptions() const + { + return type == BuiltinOptions_BidirectionalSequenceLSTMOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::BidirectionalSequenceRNNOptionsT *AsBidirectionalSequenceRNNOptions() + { + return type == BuiltinOptions_BidirectionalSequenceRNNOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::BidirectionalSequenceRNNOptionsT *AsBidirectionalSequenceRNNOptions() const + { + return type == BuiltinOptions_BidirectionalSequenceRNNOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::UnidirectionalSequenceLSTMOptionsT *AsUnidirectionalSequenceLSTMOptions() + { + return type == BuiltinOptions_UnidirectionalSequenceLSTMOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::UnidirectionalSequenceLSTMOptionsT *AsUnidirectionalSequenceLSTMOptions() const + { + return type == BuiltinOptions_UnidirectionalSequenceLSTMOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::FloorModOptionsT *AsFloorModOptions() + { + return type == BuiltinOptions_FloorModOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::FloorModOptionsT *AsFloorModOptions() const + { + return type == BuiltinOptions_FloorModOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::RangeOptionsT *AsRangeOptions() + { + return type == BuiltinOptions_RangeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::RangeOptionsT *AsRangeOptions() const + { + return type == BuiltinOptions_RangeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ResizeNearestNeighborOptionsT *AsResizeNearestNeighborOptions() + { + return type == BuiltinOptions_ResizeNearestNeighborOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ResizeNearestNeighborOptionsT *AsResizeNearestNeighborOptions() const + { + return type == BuiltinOptions_ResizeNearestNeighborOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::LeakyReluOptionsT *AsLeakyReluOptions() + { + return type == BuiltinOptions_LeakyReluOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::LeakyReluOptionsT *AsLeakyReluOptions() const + { + return type == BuiltinOptions_LeakyReluOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SquaredDifferenceOptionsT *AsSquaredDifferenceOptions() + { + return type == BuiltinOptions_SquaredDifferenceOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SquaredDifferenceOptionsT *AsSquaredDifferenceOptions() const + { + return type == BuiltinOptions_SquaredDifferenceOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::MirrorPadOptionsT *AsMirrorPadOptions() + { + return type == BuiltinOptions_MirrorPadOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::MirrorPadOptionsT *AsMirrorPadOptions() const + { + return type == BuiltinOptions_MirrorPadOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::AbsOptionsT *AsAbsOptions() + { + return type == BuiltinOptions_AbsOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::AbsOptionsT *AsAbsOptions() const + { + return type == BuiltinOptions_AbsOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SplitVOptionsT *AsSplitVOptions() + { + return type == BuiltinOptions_SplitVOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SplitVOptionsT *AsSplitVOptions() const + { + return type == BuiltinOptions_SplitVOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::UniqueOptionsT *AsUniqueOptions() + { + return type == BuiltinOptions_UniqueOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::UniqueOptionsT *AsUniqueOptions() const + { + return type == BuiltinOptions_UniqueOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ReverseV2OptionsT *AsReverseV2Options() + { + return type == BuiltinOptions_ReverseV2Options ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ReverseV2OptionsT *AsReverseV2Options() const + { + return type == BuiltinOptions_ReverseV2Options ? + reinterpret_cast(value) : + nullptr; + } + tflite::AddNOptionsT *AsAddNOptions() + { + return type == BuiltinOptions_AddNOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::AddNOptionsT *AsAddNOptions() const + { + return type == BuiltinOptions_AddNOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::GatherNdOptionsT *AsGatherNdOptions() + { + return type == BuiltinOptions_GatherNdOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::GatherNdOptionsT *AsGatherNdOptions() const + { + return type == BuiltinOptions_GatherNdOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::CosOptionsT *AsCosOptions() + { + return type == BuiltinOptions_CosOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::CosOptionsT *AsCosOptions() const + { + return type == BuiltinOptions_CosOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::WhereOptionsT *AsWhereOptions() + { + return type == BuiltinOptions_WhereOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::WhereOptionsT *AsWhereOptions() const + { + return type == BuiltinOptions_WhereOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::RankOptionsT *AsRankOptions() + { + return type == BuiltinOptions_RankOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::RankOptionsT *AsRankOptions() const + { + return type == BuiltinOptions_RankOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::ReverseSequenceOptionsT *AsReverseSequenceOptions() + { + return type == BuiltinOptions_ReverseSequenceOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ReverseSequenceOptionsT *AsReverseSequenceOptions() const + { + return type == BuiltinOptions_ReverseSequenceOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::MatrixDiagOptionsT *AsMatrixDiagOptions() + { + return type == BuiltinOptions_MatrixDiagOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::MatrixDiagOptionsT *AsMatrixDiagOptions() const + { + return type == BuiltinOptions_MatrixDiagOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::QuantizeOptionsT *AsQuantizeOptions() + { + return type == BuiltinOptions_QuantizeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::QuantizeOptionsT *AsQuantizeOptions() const + { + return type == BuiltinOptions_QuantizeOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::MatrixSetDiagOptionsT *AsMatrixSetDiagOptions() + { + return type == BuiltinOptions_MatrixSetDiagOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::MatrixSetDiagOptionsT *AsMatrixSetDiagOptions() const + { + return type == BuiltinOptions_MatrixSetDiagOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::HardSwishOptionsT *AsHardSwishOptions() + { + return type == BuiltinOptions_HardSwishOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::HardSwishOptionsT *AsHardSwishOptions() const + { + return type == BuiltinOptions_HardSwishOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::IfOptionsT *AsIfOptions() + { + return type == BuiltinOptions_IfOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::IfOptionsT *AsIfOptions() const + { + return type == BuiltinOptions_IfOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::WhileOptionsT *AsWhileOptions() + { + return type == BuiltinOptions_WhileOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::WhileOptionsT *AsWhileOptions() const + { + return type == BuiltinOptions_WhileOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::DepthToSpaceOptionsT *AsDepthToSpaceOptions() + { + return type == BuiltinOptions_DepthToSpaceOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::DepthToSpaceOptionsT *AsDepthToSpaceOptions() const + { + return type == BuiltinOptions_DepthToSpaceOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::NonMaxSuppressionV4OptionsT *AsNonMaxSuppressionV4Options() + { + return type == BuiltinOptions_NonMaxSuppressionV4Options ? + reinterpret_cast(value) : + nullptr; + } + const tflite::NonMaxSuppressionV4OptionsT *AsNonMaxSuppressionV4Options() const + { + return type == BuiltinOptions_NonMaxSuppressionV4Options ? + reinterpret_cast(value) : + nullptr; + } + tflite::NonMaxSuppressionV5OptionsT *AsNonMaxSuppressionV5Options() + { + return type == BuiltinOptions_NonMaxSuppressionV5Options ? + reinterpret_cast(value) : + nullptr; + } + const tflite::NonMaxSuppressionV5OptionsT *AsNonMaxSuppressionV5Options() const + { + return type == BuiltinOptions_NonMaxSuppressionV5Options ? + reinterpret_cast(value) : + nullptr; + } + tflite::ScatterNdOptionsT *AsScatterNdOptions() + { + return type == BuiltinOptions_ScatterNdOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::ScatterNdOptionsT *AsScatterNdOptions() const + { + return type == BuiltinOptions_ScatterNdOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SelectV2OptionsT *AsSelectV2Options() + { + return type == BuiltinOptions_SelectV2Options ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SelectV2OptionsT *AsSelectV2Options() const + { + return type == BuiltinOptions_SelectV2Options ? + reinterpret_cast(value) : + nullptr; + } + tflite::DensifyOptionsT *AsDensifyOptions() + { + return type == BuiltinOptions_DensifyOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::DensifyOptionsT *AsDensifyOptions() const + { + return type == BuiltinOptions_DensifyOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::SegmentSumOptionsT *AsSegmentSumOptions() + { + return type == BuiltinOptions_SegmentSumOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::SegmentSumOptionsT *AsSegmentSumOptions() const + { + return type == BuiltinOptions_SegmentSumOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::BatchMatMulOptionsT *AsBatchMatMulOptions() + { + return type == BuiltinOptions_BatchMatMulOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::BatchMatMulOptionsT *AsBatchMatMulOptions() const + { + return type == BuiltinOptions_BatchMatMulOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::CumsumOptionsT *AsCumsumOptions() + { + return type == BuiltinOptions_CumsumOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::CumsumOptionsT *AsCumsumOptions() const + { + return type == BuiltinOptions_CumsumOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::CallOnceOptionsT *AsCallOnceOptions() + { + return type == BuiltinOptions_CallOnceOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::CallOnceOptionsT *AsCallOnceOptions() const + { + return type == BuiltinOptions_CallOnceOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::BroadcastToOptionsT *AsBroadcastToOptions() + { + return type == BuiltinOptions_BroadcastToOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::BroadcastToOptionsT *AsBroadcastToOptions() const + { + return type == BuiltinOptions_BroadcastToOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::Rfft2dOptionsT *AsRfft2dOptions() + { + return type == BuiltinOptions_Rfft2dOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Rfft2dOptionsT *AsRfft2dOptions() const + { + return type == BuiltinOptions_Rfft2dOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::Conv3DOptionsT *AsConv3DOptions() + { + return type == BuiltinOptions_Conv3DOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::Conv3DOptionsT *AsConv3DOptions() const + { + return type == BuiltinOptions_Conv3DOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::HashtableOptionsT *AsHashtableOptions() + { + return type == BuiltinOptions_HashtableOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::HashtableOptionsT *AsHashtableOptions() const + { + return type == BuiltinOptions_HashtableOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::HashtableFindOptionsT *AsHashtableFindOptions() + { + return type == BuiltinOptions_HashtableFindOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::HashtableFindOptionsT *AsHashtableFindOptions() const + { + return type == BuiltinOptions_HashtableFindOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::HashtableImportOptionsT *AsHashtableImportOptions() + { + return type == BuiltinOptions_HashtableImportOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::HashtableImportOptionsT *AsHashtableImportOptions() const + { + return type == BuiltinOptions_HashtableImportOptions ? + reinterpret_cast(value) : + nullptr; + } + tflite::HashtableSizeOptionsT *AsHashtableSizeOptions() + { + return type == BuiltinOptions_HashtableSizeOptions ? + reinterpret_cast(value) : + nullptr; + } + const tflite::HashtableSizeOptionsT *AsHashtableSizeOptions() const + { + return type == BuiltinOptions_HashtableSizeOptions ? + reinterpret_cast(value) : + nullptr; + } +}; + +bool VerifyBuiltinOptions(flatbuffers::Verifier &verifier, const void *obj, BuiltinOptions type); +bool VerifyBuiltinOptionsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector > *values, const flatbuffers::Vector *types); + +enum Padding { + Padding_SAME = 0, + Padding_VALID = 1, + Padding_MIN = Padding_SAME, + Padding_MAX = Padding_VALID +}; + +inline const Padding (&EnumValuesPadding())[2] +{ + static const Padding values[] = { + Padding_SAME, + Padding_VALID + }; + return values; +} + +inline const char *const *EnumNamesPadding() +{ + static const char *const names[3] = { + "SAME", + "VALID", + nullptr + }; + return names; +} + +inline const char *EnumNamePadding(Padding e) +{ + if (flatbuffers::IsOutRange(e, Padding_SAME, Padding_VALID)) + return ""; + const size_t index = static_cast(e); + return EnumNamesPadding()[index]; +} + +enum ActivationFunctionType { + ActivationFunctionType_NONE = 0, + ActivationFunctionType_RELU = 1, + ActivationFunctionType_RELU_N1_TO_1 = 2, + ActivationFunctionType_RELU6 = 3, + ActivationFunctionType_TANH = 4, + ActivationFunctionType_SIGN_BIT = 5, + ActivationFunctionType_MIN = ActivationFunctionType_NONE, + ActivationFunctionType_MAX = ActivationFunctionType_SIGN_BIT +}; + +inline const ActivationFunctionType (&EnumValuesActivationFunctionType())[6] +{ + static const ActivationFunctionType values[] = { + ActivationFunctionType_NONE, + ActivationFunctionType_RELU, + ActivationFunctionType_RELU_N1_TO_1, + ActivationFunctionType_RELU6, + ActivationFunctionType_TANH, + ActivationFunctionType_SIGN_BIT + }; + return values; +} + +inline const char *const *EnumNamesActivationFunctionType() +{ + static const char *const names[7] = { + "NONE", + "RELU", + "RELU_N1_TO_1", + "RELU6", + "TANH", + "SIGN_BIT", + nullptr + }; + return names; +} + +inline const char *EnumNameActivationFunctionType(ActivationFunctionType e) +{ + if (flatbuffers::IsOutRange(e, ActivationFunctionType_NONE, ActivationFunctionType_SIGN_BIT)) + return ""; + const size_t index = static_cast(e); + return EnumNamesActivationFunctionType()[index]; +} + +enum LSHProjectionType { + LSHProjectionType_UNKNOWN = 0, + LSHProjectionType_SPARSE = 1, + LSHProjectionType_DENSE = 2, + LSHProjectionType_MIN = LSHProjectionType_UNKNOWN, + LSHProjectionType_MAX = LSHProjectionType_DENSE +}; + +inline const LSHProjectionType (&EnumValuesLSHProjectionType())[3] +{ + static const LSHProjectionType values[] = { + LSHProjectionType_UNKNOWN, + LSHProjectionType_SPARSE, + LSHProjectionType_DENSE + }; + return values; +} + +inline const char *const *EnumNamesLSHProjectionType() +{ + static const char *const names[4] = { + "UNKNOWN", + "SPARSE", + "DENSE", + nullptr + }; + return names; +} + +inline const char *EnumNameLSHProjectionType(LSHProjectionType e) +{ + if (flatbuffers::IsOutRange(e, LSHProjectionType_UNKNOWN, LSHProjectionType_DENSE)) + return ""; + const size_t index = static_cast(e); + return EnumNamesLSHProjectionType()[index]; +} + +enum FullyConnectedOptionsWeightsFormat { + FullyConnectedOptionsWeightsFormat_DEFAULT = 0, + FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8 = 1, + FullyConnectedOptionsWeightsFormat_MIN = FullyConnectedOptionsWeightsFormat_DEFAULT, + FullyConnectedOptionsWeightsFormat_MAX = FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8 +}; + +inline const FullyConnectedOptionsWeightsFormat (&EnumValuesFullyConnectedOptionsWeightsFormat())[2] +{ + static const FullyConnectedOptionsWeightsFormat values[] = { + FullyConnectedOptionsWeightsFormat_DEFAULT, + FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8 + }; + return values; +} + +inline const char *const *EnumNamesFullyConnectedOptionsWeightsFormat() +{ + static const char *const names[3] = { + "DEFAULT", + "SHUFFLED4x16INT8", + nullptr + }; + return names; +} + +inline const char *EnumNameFullyConnectedOptionsWeightsFormat(FullyConnectedOptionsWeightsFormat e) +{ + if (flatbuffers::IsOutRange(e, FullyConnectedOptionsWeightsFormat_DEFAULT, FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8)) + return ""; + const size_t index = static_cast(e); + return EnumNamesFullyConnectedOptionsWeightsFormat()[index]; +} + +enum LSTMKernelType { + LSTMKernelType_FULL = 0, + LSTMKernelType_BASIC = 1, + LSTMKernelType_MIN = LSTMKernelType_FULL, + LSTMKernelType_MAX = LSTMKernelType_BASIC +}; + +inline const LSTMKernelType (&EnumValuesLSTMKernelType())[2] +{ + static const LSTMKernelType values[] = { + LSTMKernelType_FULL, + LSTMKernelType_BASIC + }; + return values; +} + +inline const char *const *EnumNamesLSTMKernelType() +{ + static const char *const names[3] = { + "FULL", + "BASIC", + nullptr + }; + return names; +} + +inline const char *EnumNameLSTMKernelType(LSTMKernelType e) +{ + if (flatbuffers::IsOutRange(e, LSTMKernelType_FULL, LSTMKernelType_BASIC)) + return ""; + const size_t index = static_cast(e); + return EnumNamesLSTMKernelType()[index]; +} + +enum CombinerType { + CombinerType_SUM = 0, + CombinerType_MEAN = 1, + CombinerType_SQRTN = 2, + CombinerType_MIN = CombinerType_SUM, + CombinerType_MAX = CombinerType_SQRTN +}; + +inline const CombinerType (&EnumValuesCombinerType())[3] +{ + static const CombinerType values[] = { + CombinerType_SUM, + CombinerType_MEAN, + CombinerType_SQRTN + }; + return values; +} + +inline const char *const *EnumNamesCombinerType() +{ + static const char *const names[4] = { + "SUM", + "MEAN", + "SQRTN", + nullptr + }; + return names; +} + +inline const char *EnumNameCombinerType(CombinerType e) +{ + if (flatbuffers::IsOutRange(e, CombinerType_SUM, CombinerType_SQRTN)) + return ""; + const size_t index = static_cast(e); + return EnumNamesCombinerType()[index]; +} + +enum MirrorPadMode { + MirrorPadMode_REFLECT = 0, + MirrorPadMode_SYMMETRIC = 1, + MirrorPadMode_MIN = MirrorPadMode_REFLECT, + MirrorPadMode_MAX = MirrorPadMode_SYMMETRIC +}; + +inline const MirrorPadMode (&EnumValuesMirrorPadMode())[2] +{ + static const MirrorPadMode values[] = { + MirrorPadMode_REFLECT, + MirrorPadMode_SYMMETRIC + }; + return values; +} + +inline const char *const *EnumNamesMirrorPadMode() +{ + static const char *const names[3] = { + "REFLECT", + "SYMMETRIC", + nullptr + }; + return names; +} + +inline const char *EnumNameMirrorPadMode(MirrorPadMode e) +{ + if (flatbuffers::IsOutRange(e, MirrorPadMode_REFLECT, MirrorPadMode_SYMMETRIC)) + return ""; + const size_t index = static_cast(e); + return EnumNamesMirrorPadMode()[index]; +} + +enum CustomOptionsFormat { + CustomOptionsFormat_FLEXBUFFERS = 0, + CustomOptionsFormat_MIN = CustomOptionsFormat_FLEXBUFFERS, + CustomOptionsFormat_MAX = CustomOptionsFormat_FLEXBUFFERS +}; + +inline const CustomOptionsFormat (&EnumValuesCustomOptionsFormat())[1] +{ + static const CustomOptionsFormat values[] = { + CustomOptionsFormat_FLEXBUFFERS + }; + return values; +} + +inline const char *const *EnumNamesCustomOptionsFormat() +{ + static const char *const names[2] = { + "FLEXBUFFERS", + nullptr + }; + return names; +} + +inline const char *EnumNameCustomOptionsFormat(CustomOptionsFormat e) +{ + if (flatbuffers::IsOutRange(e, CustomOptionsFormat_FLEXBUFFERS, CustomOptionsFormat_FLEXBUFFERS)) + return ""; + const size_t index = static_cast(e); + return EnumNamesCustomOptionsFormat()[index]; +} + +struct CustomQuantizationT : public flatbuffers::NativeTable { + typedef CustomQuantization TableType; + std::vector custom; + CustomQuantizationT() + { + } +}; + +struct CustomQuantization FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef CustomQuantizationT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_CUSTOM = 4 + }; + const flatbuffers::Vector *custom() const + { + return GetPointer *>(VT_CUSTOM); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_CUSTOM) && + verifier.VerifyVector(custom()) && + verifier.EndTable(); + } + CustomQuantizationT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(CustomQuantizationT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct CustomQuantizationBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_custom(flatbuffers::Offset > custom) + { + fbb_.AddOffset(CustomQuantization::VT_CUSTOM, custom); + } + explicit CustomQuantizationBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + CustomQuantizationBuilder &operator=(const CustomQuantizationBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateCustomQuantization( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > custom = 0) +{ + CustomQuantizationBuilder builder_(_fbb); + builder_.add_custom(custom); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateCustomQuantizationDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *custom = nullptr) +{ + if (custom) { + _fbb.ForceVectorAlignment(custom->size(), sizeof(uint8_t), 16); + } + auto custom__ = custom ? _fbb.CreateVector(*custom) : 0; + return tflite::CreateCustomQuantization( + _fbb, + custom__); +} + +flatbuffers::Offset CreateCustomQuantization(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct QuantizationParametersT : public flatbuffers::NativeTable { + typedef QuantizationParameters TableType; + std::vector min; + std::vector max; + std::vector scale; + std::vector zero_point; + tflite::QuantizationDetailsUnion details; + int32_t quantized_dimension; + QuantizationParametersT() + : quantized_dimension(0) + { + } +}; + +struct QuantizationParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef QuantizationParametersT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_MIN = 4, + VT_MAX = 6, + VT_SCALE = 8, + VT_ZERO_POINT = 10, + VT_DETAILS_TYPE = 12, + VT_DETAILS = 14, + VT_QUANTIZED_DIMENSION = 16 + }; + const flatbuffers::Vector *min() const + { + return GetPointer *>(VT_MIN); + } + const flatbuffers::Vector *max() const + { + return GetPointer *>(VT_MAX); + } + const flatbuffers::Vector *scale() const + { + return GetPointer *>(VT_SCALE); + } + const flatbuffers::Vector *zero_point() const + { + return GetPointer *>(VT_ZERO_POINT); + } + tflite::QuantizationDetails details_type() const + { + return static_cast(GetField(VT_DETAILS_TYPE, 0)); + } + const void *details() const + { + return GetPointer(VT_DETAILS); + } + template + const T *details_as() const; + const tflite::CustomQuantization *details_as_CustomQuantization() const + { + return details_type() == tflite::QuantizationDetails_CustomQuantization ? static_cast(details()) : nullptr; + } + int32_t quantized_dimension() const + { + return GetField(VT_QUANTIZED_DIMENSION, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_MIN) && + verifier.VerifyVector(min()) && + VerifyOffset(verifier, VT_MAX) && + verifier.VerifyVector(max()) && + VerifyOffset(verifier, VT_SCALE) && + verifier.VerifyVector(scale()) && + VerifyOffset(verifier, VT_ZERO_POINT) && + verifier.VerifyVector(zero_point()) && + VerifyField(verifier, VT_DETAILS_TYPE) && + VerifyOffset(verifier, VT_DETAILS) && + VerifyQuantizationDetails(verifier, details(), details_type()) && + VerifyField(verifier, VT_QUANTIZED_DIMENSION) && + verifier.EndTable(); + } + QuantizationParametersT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(QuantizationParametersT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +template <> +inline const tflite::CustomQuantization *QuantizationParameters::details_as() const +{ + return details_as_CustomQuantization(); +} + +struct QuantizationParametersBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_min(flatbuffers::Offset > min) + { + fbb_.AddOffset(QuantizationParameters::VT_MIN, min); + } + void add_max(flatbuffers::Offset > max) + { + fbb_.AddOffset(QuantizationParameters::VT_MAX, max); + } + void add_scale(flatbuffers::Offset > scale) + { + fbb_.AddOffset(QuantizationParameters::VT_SCALE, scale); + } + void add_zero_point(flatbuffers::Offset > zero_point) + { + fbb_.AddOffset(QuantizationParameters::VT_ZERO_POINT, zero_point); + } + void add_details_type(tflite::QuantizationDetails details_type) + { + fbb_.AddElement(QuantizationParameters::VT_DETAILS_TYPE, static_cast(details_type), 0); + } + void add_details(flatbuffers::Offset details) + { + fbb_.AddOffset(QuantizationParameters::VT_DETAILS, details); + } + void add_quantized_dimension(int32_t quantized_dimension) + { + fbb_.AddElement(QuantizationParameters::VT_QUANTIZED_DIMENSION, quantized_dimension, 0); + } + explicit QuantizationParametersBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + QuantizationParametersBuilder &operator=(const QuantizationParametersBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateQuantizationParameters( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > min = 0, + flatbuffers::Offset > max = 0, + flatbuffers::Offset > scale = 0, + flatbuffers::Offset > zero_point = 0, + tflite::QuantizationDetails details_type = tflite::QuantizationDetails_NONE, + flatbuffers::Offset details = 0, + int32_t quantized_dimension = 0) +{ + QuantizationParametersBuilder builder_(_fbb); + builder_.add_quantized_dimension(quantized_dimension); + builder_.add_details(details); + builder_.add_zero_point(zero_point); + builder_.add_scale(scale); + builder_.add_max(max); + builder_.add_min(min); + builder_.add_details_type(details_type); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateQuantizationParametersDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *min = nullptr, + const std::vector *max = nullptr, + const std::vector *scale = nullptr, + const std::vector *zero_point = nullptr, + tflite::QuantizationDetails details_type = tflite::QuantizationDetails_NONE, + flatbuffers::Offset details = 0, + int32_t quantized_dimension = 0) +{ + auto min__ = min ? _fbb.CreateVector(*min) : 0; + auto max__ = max ? _fbb.CreateVector(*max) : 0; + auto scale__ = scale ? _fbb.CreateVector(*scale) : 0; + auto zero_point__ = zero_point ? _fbb.CreateVector(*zero_point) : 0; + return tflite::CreateQuantizationParameters( + _fbb, + min__, + max__, + scale__, + zero_point__, + details_type, + details, + quantized_dimension); +} + +flatbuffers::Offset CreateQuantizationParameters(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Int32VectorT : public flatbuffers::NativeTable { + typedef Int32Vector TableType; + std::vector values; + Int32VectorT() + { + } +}; + +struct Int32Vector FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Int32VectorT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VALUES = 4 + }; + const flatbuffers::Vector *values() const + { + return GetPointer *>(VT_VALUES); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_VALUES) && + verifier.VerifyVector(values()) && + verifier.EndTable(); + } + Int32VectorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Int32VectorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Int32VectorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_values(flatbuffers::Offset > values) + { + fbb_.AddOffset(Int32Vector::VT_VALUES, values); + } + explicit Int32VectorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Int32VectorBuilder &operator=(const Int32VectorBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateInt32Vector( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > values = 0) +{ + Int32VectorBuilder builder_(_fbb); + builder_.add_values(values); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateInt32VectorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *values = nullptr) +{ + auto values__ = values ? _fbb.CreateVector(*values) : 0; + return tflite::CreateInt32Vector( + _fbb, + values__); +} + +flatbuffers::Offset CreateInt32Vector(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Uint16VectorT : public flatbuffers::NativeTable { + typedef Uint16Vector TableType; + std::vector values; + Uint16VectorT() + { + } +}; + +struct Uint16Vector FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Uint16VectorT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VALUES = 4 + }; + const flatbuffers::Vector *values() const + { + return GetPointer *>(VT_VALUES); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_VALUES) && + verifier.VerifyVector(values()) && + verifier.EndTable(); + } + Uint16VectorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Uint16VectorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Uint16VectorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_values(flatbuffers::Offset > values) + { + fbb_.AddOffset(Uint16Vector::VT_VALUES, values); + } + explicit Uint16VectorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Uint16VectorBuilder &operator=(const Uint16VectorBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateUint16Vector( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > values = 0) +{ + Uint16VectorBuilder builder_(_fbb); + builder_.add_values(values); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateUint16VectorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *values = nullptr) +{ + if (values) { + _fbb.ForceVectorAlignment(values->size(), sizeof(uint16_t), 4); + } + auto values__ = values ? _fbb.CreateVector(*values) : 0; + return tflite::CreateUint16Vector( + _fbb, + values__); +} + +flatbuffers::Offset CreateUint16Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Uint8VectorT : public flatbuffers::NativeTable { + typedef Uint8Vector TableType; + std::vector values; + Uint8VectorT() + { + } +}; + +struct Uint8Vector FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Uint8VectorT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VALUES = 4 + }; + const flatbuffers::Vector *values() const + { + return GetPointer *>(VT_VALUES); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_VALUES) && + verifier.VerifyVector(values()) && + verifier.EndTable(); + } + Uint8VectorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Uint8VectorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Uint8VectorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_values(flatbuffers::Offset > values) + { + fbb_.AddOffset(Uint8Vector::VT_VALUES, values); + } + explicit Uint8VectorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Uint8VectorBuilder &operator=(const Uint8VectorBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateUint8Vector( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > values = 0) +{ + Uint8VectorBuilder builder_(_fbb); + builder_.add_values(values); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateUint8VectorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *values = nullptr) +{ + if (values) { + _fbb.ForceVectorAlignment(values->size(), sizeof(uint8_t), 4); + } + auto values__ = values ? _fbb.CreateVector(*values) : 0; + return tflite::CreateUint8Vector( + _fbb, + values__); +} + +flatbuffers::Offset CreateUint8Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DimensionMetadataT : public flatbuffers::NativeTable { + typedef DimensionMetadata TableType; + tflite::DimensionType format; + int32_t dense_size; + tflite::SparseIndexVectorUnion array_segments; + tflite::SparseIndexVectorUnion array_indices; + DimensionMetadataT() + : format(tflite::DimensionType_DENSE), + dense_size(0) + { + } +}; + +struct DimensionMetadata FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef DimensionMetadataT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FORMAT = 4, + VT_DENSE_SIZE = 6, + VT_ARRAY_SEGMENTS_TYPE = 8, + VT_ARRAY_SEGMENTS = 10, + VT_ARRAY_INDICES_TYPE = 12, + VT_ARRAY_INDICES = 14 + }; + tflite::DimensionType format() const + { + return static_cast(GetField(VT_FORMAT, 0)); + } + int32_t dense_size() const + { + return GetField(VT_DENSE_SIZE, 0); + } + tflite::SparseIndexVector array_segments_type() const + { + return static_cast(GetField(VT_ARRAY_SEGMENTS_TYPE, 0)); + } + const void *array_segments() const + { + return GetPointer(VT_ARRAY_SEGMENTS); + } + template + const T *array_segments_as() const; + const tflite::Int32Vector *array_segments_as_Int32Vector() const + { + return array_segments_type() == tflite::SparseIndexVector_Int32Vector ? static_cast(array_segments()) : nullptr; + } + const tflite::Uint16Vector *array_segments_as_Uint16Vector() const + { + return array_segments_type() == tflite::SparseIndexVector_Uint16Vector ? static_cast(array_segments()) : nullptr; + } + const tflite::Uint8Vector *array_segments_as_Uint8Vector() const + { + return array_segments_type() == tflite::SparseIndexVector_Uint8Vector ? static_cast(array_segments()) : nullptr; + } + tflite::SparseIndexVector array_indices_type() const + { + return static_cast(GetField(VT_ARRAY_INDICES_TYPE, 0)); + } + const void *array_indices() const + { + return GetPointer(VT_ARRAY_INDICES); + } + template + const T *array_indices_as() const; + const tflite::Int32Vector *array_indices_as_Int32Vector() const + { + return array_indices_type() == tflite::SparseIndexVector_Int32Vector ? static_cast(array_indices()) : nullptr; + } + const tflite::Uint16Vector *array_indices_as_Uint16Vector() const + { + return array_indices_type() == tflite::SparseIndexVector_Uint16Vector ? static_cast(array_indices()) : nullptr; + } + const tflite::Uint8Vector *array_indices_as_Uint8Vector() const + { + return array_indices_type() == tflite::SparseIndexVector_Uint8Vector ? static_cast(array_indices()) : nullptr; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FORMAT) && + VerifyField(verifier, VT_DENSE_SIZE) && + VerifyField(verifier, VT_ARRAY_SEGMENTS_TYPE) && + VerifyOffset(verifier, VT_ARRAY_SEGMENTS) && + VerifySparseIndexVector(verifier, array_segments(), array_segments_type()) && + VerifyField(verifier, VT_ARRAY_INDICES_TYPE) && + VerifyOffset(verifier, VT_ARRAY_INDICES) && + VerifySparseIndexVector(verifier, array_indices(), array_indices_type()) && + verifier.EndTable(); + } + DimensionMetadataT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DimensionMetadataT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +template <> +inline const tflite::Int32Vector *DimensionMetadata::array_segments_as() const +{ + return array_segments_as_Int32Vector(); +} + +template <> +inline const tflite::Uint16Vector *DimensionMetadata::array_segments_as() const +{ + return array_segments_as_Uint16Vector(); +} + +template <> +inline const tflite::Uint8Vector *DimensionMetadata::array_segments_as() const +{ + return array_segments_as_Uint8Vector(); +} + +template <> +inline const tflite::Int32Vector *DimensionMetadata::array_indices_as() const +{ + return array_indices_as_Int32Vector(); +} + +template <> +inline const tflite::Uint16Vector *DimensionMetadata::array_indices_as() const +{ + return array_indices_as_Uint16Vector(); +} + +template <> +inline const tflite::Uint8Vector *DimensionMetadata::array_indices_as() const +{ + return array_indices_as_Uint8Vector(); +} + +struct DimensionMetadataBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_format(tflite::DimensionType format) + { + fbb_.AddElement(DimensionMetadata::VT_FORMAT, static_cast(format), 0); + } + void add_dense_size(int32_t dense_size) + { + fbb_.AddElement(DimensionMetadata::VT_DENSE_SIZE, dense_size, 0); + } + void add_array_segments_type(tflite::SparseIndexVector array_segments_type) + { + fbb_.AddElement(DimensionMetadata::VT_ARRAY_SEGMENTS_TYPE, static_cast(array_segments_type), 0); + } + void add_array_segments(flatbuffers::Offset array_segments) + { + fbb_.AddOffset(DimensionMetadata::VT_ARRAY_SEGMENTS, array_segments); + } + void add_array_indices_type(tflite::SparseIndexVector array_indices_type) + { + fbb_.AddElement(DimensionMetadata::VT_ARRAY_INDICES_TYPE, static_cast(array_indices_type), 0); + } + void add_array_indices(flatbuffers::Offset array_indices) + { + fbb_.AddOffset(DimensionMetadata::VT_ARRAY_INDICES, array_indices); + } + explicit DimensionMetadataBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + DimensionMetadataBuilder &operator=(const DimensionMetadataBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateDimensionMetadata( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::DimensionType format = tflite::DimensionType_DENSE, + int32_t dense_size = 0, + tflite::SparseIndexVector array_segments_type = tflite::SparseIndexVector_NONE, + flatbuffers::Offset array_segments = 0, + tflite::SparseIndexVector array_indices_type = tflite::SparseIndexVector_NONE, + flatbuffers::Offset array_indices = 0) +{ + DimensionMetadataBuilder builder_(_fbb); + builder_.add_array_indices(array_indices); + builder_.add_array_segments(array_segments); + builder_.add_dense_size(dense_size); + builder_.add_array_indices_type(array_indices_type); + builder_.add_array_segments_type(array_segments_type); + builder_.add_format(format); + return builder_.Finish(); +} + +flatbuffers::Offset CreateDimensionMetadata(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SparsityParametersT : public flatbuffers::NativeTable { + typedef SparsityParameters TableType; + std::vector traversal_order; + std::vector block_map; + std::vector > dim_metadata; + SparsityParametersT() + { + } +}; + +struct SparsityParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SparsityParametersT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TRAVERSAL_ORDER = 4, + VT_BLOCK_MAP = 6, + VT_DIM_METADATA = 8 + }; + const flatbuffers::Vector *traversal_order() const + { + return GetPointer *>(VT_TRAVERSAL_ORDER); + } + const flatbuffers::Vector *block_map() const + { + return GetPointer *>(VT_BLOCK_MAP); + } + const flatbuffers::Vector > *dim_metadata() const + { + return GetPointer > *>(VT_DIM_METADATA); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_TRAVERSAL_ORDER) && + verifier.VerifyVector(traversal_order()) && + VerifyOffset(verifier, VT_BLOCK_MAP) && + verifier.VerifyVector(block_map()) && + VerifyOffset(verifier, VT_DIM_METADATA) && + verifier.VerifyVector(dim_metadata()) && + verifier.VerifyVectorOfTables(dim_metadata()) && + verifier.EndTable(); + } + SparsityParametersT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SparsityParametersT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SparsityParametersBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_traversal_order(flatbuffers::Offset > traversal_order) + { + fbb_.AddOffset(SparsityParameters::VT_TRAVERSAL_ORDER, traversal_order); + } + void add_block_map(flatbuffers::Offset > block_map) + { + fbb_.AddOffset(SparsityParameters::VT_BLOCK_MAP, block_map); + } + void add_dim_metadata(flatbuffers::Offset > > dim_metadata) + { + fbb_.AddOffset(SparsityParameters::VT_DIM_METADATA, dim_metadata); + } + explicit SparsityParametersBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SparsityParametersBuilder &operator=(const SparsityParametersBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSparsityParameters( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > traversal_order = 0, + flatbuffers::Offset > block_map = 0, + flatbuffers::Offset > > dim_metadata = 0) +{ + SparsityParametersBuilder builder_(_fbb); + builder_.add_dim_metadata(dim_metadata); + builder_.add_block_map(block_map); + builder_.add_traversal_order(traversal_order); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateSparsityParametersDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *traversal_order = nullptr, + const std::vector *block_map = nullptr, + const std::vector > *dim_metadata = nullptr) +{ + auto traversal_order__ = traversal_order ? _fbb.CreateVector(*traversal_order) : 0; + auto block_map__ = block_map ? _fbb.CreateVector(*block_map) : 0; + auto dim_metadata__ = dim_metadata ? _fbb.CreateVector >(*dim_metadata) : 0; + return tflite::CreateSparsityParameters( + _fbb, + traversal_order__, + block_map__, + dim_metadata__); +} + +flatbuffers::Offset CreateSparsityParameters(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct TensorT : public flatbuffers::NativeTable { + typedef Tensor TableType; + std::vector shape; + tflite::TensorType type; + uint32_t buffer; + std::string name; + std::unique_ptr quantization; + bool is_variable; + std::unique_ptr sparsity; + std::vector shape_signature; + TensorT() + : type(tflite::TensorType_FLOAT32), + buffer(0), + is_variable(false) + { + } +}; + +struct Tensor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TensorT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_SHAPE = 4, + VT_TYPE = 6, + VT_BUFFER = 8, + VT_NAME = 10, + VT_QUANTIZATION = 12, + VT_IS_VARIABLE = 14, + VT_SPARSITY = 16, + VT_SHAPE_SIGNATURE = 18 + }; + const flatbuffers::Vector *shape() const + { + return GetPointer *>(VT_SHAPE); + } + tflite::TensorType type() const + { + return static_cast(GetField(VT_TYPE, 0)); + } + uint32_t buffer() const + { + return GetField(VT_BUFFER, 0); + } + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + const tflite::QuantizationParameters *quantization() const + { + return GetPointer(VT_QUANTIZATION); + } + bool is_variable() const + { + return GetField(VT_IS_VARIABLE, 0) != 0; + } + const tflite::SparsityParameters *sparsity() const + { + return GetPointer(VT_SPARSITY); + } + const flatbuffers::Vector *shape_signature() const + { + return GetPointer *>(VT_SHAPE_SIGNATURE); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_SHAPE) && + verifier.VerifyVector(shape()) && + VerifyField(verifier, VT_TYPE) && + VerifyField(verifier, VT_BUFFER) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyOffset(verifier, VT_QUANTIZATION) && + verifier.VerifyTable(quantization()) && + VerifyField(verifier, VT_IS_VARIABLE) && + VerifyOffset(verifier, VT_SPARSITY) && + verifier.VerifyTable(sparsity()) && + VerifyOffset(verifier, VT_SHAPE_SIGNATURE) && + verifier.VerifyVector(shape_signature()) && + verifier.EndTable(); + } + TensorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(TensorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct TensorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_shape(flatbuffers::Offset > shape) + { + fbb_.AddOffset(Tensor::VT_SHAPE, shape); + } + void add_type(tflite::TensorType type) + { + fbb_.AddElement(Tensor::VT_TYPE, static_cast(type), 0); + } + void add_buffer(uint32_t buffer) + { + fbb_.AddElement(Tensor::VT_BUFFER, buffer, 0); + } + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(Tensor::VT_NAME, name); + } + void add_quantization(flatbuffers::Offset quantization) + { + fbb_.AddOffset(Tensor::VT_QUANTIZATION, quantization); + } + void add_is_variable(bool is_variable) + { + fbb_.AddElement(Tensor::VT_IS_VARIABLE, static_cast(is_variable), 0); + } + void add_sparsity(flatbuffers::Offset sparsity) + { + fbb_.AddOffset(Tensor::VT_SPARSITY, sparsity); + } + void add_shape_signature(flatbuffers::Offset > shape_signature) + { + fbb_.AddOffset(Tensor::VT_SHAPE_SIGNATURE, shape_signature); + } + explicit TensorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + TensorBuilder &operator=(const TensorBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateTensor( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > shape = 0, + tflite::TensorType type = tflite::TensorType_FLOAT32, + uint32_t buffer = 0, + flatbuffers::Offset name = 0, + flatbuffers::Offset quantization = 0, + bool is_variable = false, + flatbuffers::Offset sparsity = 0, + flatbuffers::Offset > shape_signature = 0) +{ + TensorBuilder builder_(_fbb); + builder_.add_shape_signature(shape_signature); + builder_.add_sparsity(sparsity); + builder_.add_quantization(quantization); + builder_.add_name(name); + builder_.add_buffer(buffer); + builder_.add_shape(shape); + builder_.add_is_variable(is_variable); + builder_.add_type(type); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateTensorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *shape = nullptr, + tflite::TensorType type = tflite::TensorType_FLOAT32, + uint32_t buffer = 0, + const char *name = nullptr, + flatbuffers::Offset quantization = 0, + bool is_variable = false, + flatbuffers::Offset sparsity = 0, + const std::vector *shape_signature = nullptr) +{ + auto shape__ = shape ? _fbb.CreateVector(*shape) : 0; + auto name__ = name ? _fbb.CreateString(name) : 0; + auto shape_signature__ = shape_signature ? _fbb.CreateVector(*shape_signature) : 0; + return tflite::CreateTensor( + _fbb, + shape__, + type, + buffer, + name__, + quantization, + is_variable, + sparsity, + shape_signature__); +} + +flatbuffers::Offset CreateTensor(flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Conv2DOptionsT : public flatbuffers::NativeTable { + typedef Conv2DOptions TableType; + tflite::Padding padding; + int32_t stride_w; + int32_t stride_h; + tflite::ActivationFunctionType fused_activation_function; + int32_t dilation_w_factor; + int32_t dilation_h_factor; + Conv2DOptionsT() + : padding(tflite::Padding_SAME), + stride_w(0), + stride_h(0), + fused_activation_function(tflite::ActivationFunctionType_NONE), + dilation_w_factor(1), + dilation_h_factor(1) + { + } +}; + +struct Conv2DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Conv2DOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PADDING = 4, + VT_STRIDE_W = 6, + VT_STRIDE_H = 8, + VT_FUSED_ACTIVATION_FUNCTION = 10, + VT_DILATION_W_FACTOR = 12, + VT_DILATION_H_FACTOR = 14 + }; + tflite::Padding padding() const + { + return static_cast(GetField(VT_PADDING, 0)); + } + int32_t stride_w() const + { + return GetField(VT_STRIDE_W, 0); + } + int32_t stride_h() const + { + return GetField(VT_STRIDE_H, 0); + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + int32_t dilation_w_factor() const + { + return GetField(VT_DILATION_W_FACTOR, 1); + } + int32_t dilation_h_factor() const + { + return GetField(VT_DILATION_H_FACTOR, 1); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PADDING) && + VerifyField(verifier, VT_STRIDE_W) && + VerifyField(verifier, VT_STRIDE_H) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_DILATION_W_FACTOR) && + VerifyField(verifier, VT_DILATION_H_FACTOR) && + verifier.EndTable(); + } + Conv2DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Conv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Conv2DOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_padding(tflite::Padding padding) + { + fbb_.AddElement(Conv2DOptions::VT_PADDING, static_cast(padding), 0); + } + void add_stride_w(int32_t stride_w) + { + fbb_.AddElement(Conv2DOptions::VT_STRIDE_W, stride_w, 0); + } + void add_stride_h(int32_t stride_h) + { + fbb_.AddElement(Conv2DOptions::VT_STRIDE_H, stride_h, 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(Conv2DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_dilation_w_factor(int32_t dilation_w_factor) + { + fbb_.AddElement(Conv2DOptions::VT_DILATION_W_FACTOR, dilation_w_factor, 1); + } + void add_dilation_h_factor(int32_t dilation_h_factor) + { + fbb_.AddElement(Conv2DOptions::VT_DILATION_H_FACTOR, dilation_h_factor, 1); + } + explicit Conv2DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Conv2DOptionsBuilder &operator=(const Conv2DOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateConv2DOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::Padding padding = tflite::Padding_SAME, + int32_t stride_w = 0, + int32_t stride_h = 0, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + int32_t dilation_w_factor = 1, + int32_t dilation_h_factor = 1) +{ + Conv2DOptionsBuilder builder_(_fbb); + builder_.add_dilation_h_factor(dilation_h_factor); + builder_.add_dilation_w_factor(dilation_w_factor); + builder_.add_stride_h(stride_h); + builder_.add_stride_w(stride_w); + builder_.add_fused_activation_function(fused_activation_function); + builder_.add_padding(padding); + return builder_.Finish(); +} + +flatbuffers::Offset CreateConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Conv3DOptionsT : public flatbuffers::NativeTable { + typedef Conv3DOptions TableType; + tflite::Padding padding; + int32_t stride_d; + int32_t stride_w; + int32_t stride_h; + tflite::ActivationFunctionType fused_activation_function; + int32_t dilation_d_factor; + int32_t dilation_w_factor; + int32_t dilation_h_factor; + Conv3DOptionsT() + : padding(tflite::Padding_SAME), + stride_d(0), + stride_w(0), + stride_h(0), + fused_activation_function(tflite::ActivationFunctionType_NONE), + dilation_d_factor(1), + dilation_w_factor(1), + dilation_h_factor(1) + { + } +}; + +struct Conv3DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Conv3DOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PADDING = 4, + VT_STRIDE_D = 6, + VT_STRIDE_W = 8, + VT_STRIDE_H = 10, + VT_FUSED_ACTIVATION_FUNCTION = 12, + VT_DILATION_D_FACTOR = 14, + VT_DILATION_W_FACTOR = 16, + VT_DILATION_H_FACTOR = 18 + }; + tflite::Padding padding() const + { + return static_cast(GetField(VT_PADDING, 0)); + } + int32_t stride_d() const + { + return GetField(VT_STRIDE_D, 0); + } + int32_t stride_w() const + { + return GetField(VT_STRIDE_W, 0); + } + int32_t stride_h() const + { + return GetField(VT_STRIDE_H, 0); + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + int32_t dilation_d_factor() const + { + return GetField(VT_DILATION_D_FACTOR, 1); + } + int32_t dilation_w_factor() const + { + return GetField(VT_DILATION_W_FACTOR, 1); + } + int32_t dilation_h_factor() const + { + return GetField(VT_DILATION_H_FACTOR, 1); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PADDING) && + VerifyField(verifier, VT_STRIDE_D) && + VerifyField(verifier, VT_STRIDE_W) && + VerifyField(verifier, VT_STRIDE_H) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_DILATION_D_FACTOR) && + VerifyField(verifier, VT_DILATION_W_FACTOR) && + VerifyField(verifier, VT_DILATION_H_FACTOR) && + verifier.EndTable(); + } + Conv3DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Conv3DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Conv3DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Conv3DOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_padding(tflite::Padding padding) + { + fbb_.AddElement(Conv3DOptions::VT_PADDING, static_cast(padding), 0); + } + void add_stride_d(int32_t stride_d) + { + fbb_.AddElement(Conv3DOptions::VT_STRIDE_D, stride_d, 0); + } + void add_stride_w(int32_t stride_w) + { + fbb_.AddElement(Conv3DOptions::VT_STRIDE_W, stride_w, 0); + } + void add_stride_h(int32_t stride_h) + { + fbb_.AddElement(Conv3DOptions::VT_STRIDE_H, stride_h, 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(Conv3DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_dilation_d_factor(int32_t dilation_d_factor) + { + fbb_.AddElement(Conv3DOptions::VT_DILATION_D_FACTOR, dilation_d_factor, 1); + } + void add_dilation_w_factor(int32_t dilation_w_factor) + { + fbb_.AddElement(Conv3DOptions::VT_DILATION_W_FACTOR, dilation_w_factor, 1); + } + void add_dilation_h_factor(int32_t dilation_h_factor) + { + fbb_.AddElement(Conv3DOptions::VT_DILATION_H_FACTOR, dilation_h_factor, 1); + } + explicit Conv3DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Conv3DOptionsBuilder &operator=(const Conv3DOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateConv3DOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::Padding padding = tflite::Padding_SAME, + int32_t stride_d = 0, + int32_t stride_w = 0, + int32_t stride_h = 0, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + int32_t dilation_d_factor = 1, + int32_t dilation_w_factor = 1, + int32_t dilation_h_factor = 1) +{ + Conv3DOptionsBuilder builder_(_fbb); + builder_.add_dilation_h_factor(dilation_h_factor); + builder_.add_dilation_w_factor(dilation_w_factor); + builder_.add_dilation_d_factor(dilation_d_factor); + builder_.add_stride_h(stride_h); + builder_.add_stride_w(stride_w); + builder_.add_stride_d(stride_d); + builder_.add_fused_activation_function(fused_activation_function); + builder_.add_padding(padding); + return builder_.Finish(); +} + +flatbuffers::Offset CreateConv3DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Conv3DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Pool2DOptionsT : public flatbuffers::NativeTable { + typedef Pool2DOptions TableType; + tflite::Padding padding; + int32_t stride_w; + int32_t stride_h; + int32_t filter_width; + int32_t filter_height; + tflite::ActivationFunctionType fused_activation_function; + Pool2DOptionsT() + : padding(tflite::Padding_SAME), + stride_w(0), + stride_h(0), + filter_width(0), + filter_height(0), + fused_activation_function(tflite::ActivationFunctionType_NONE) + { + } +}; + +struct Pool2DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Pool2DOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PADDING = 4, + VT_STRIDE_W = 6, + VT_STRIDE_H = 8, + VT_FILTER_WIDTH = 10, + VT_FILTER_HEIGHT = 12, + VT_FUSED_ACTIVATION_FUNCTION = 14 + }; + tflite::Padding padding() const + { + return static_cast(GetField(VT_PADDING, 0)); + } + int32_t stride_w() const + { + return GetField(VT_STRIDE_W, 0); + } + int32_t stride_h() const + { + return GetField(VT_STRIDE_H, 0); + } + int32_t filter_width() const + { + return GetField(VT_FILTER_WIDTH, 0); + } + int32_t filter_height() const + { + return GetField(VT_FILTER_HEIGHT, 0); + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PADDING) && + VerifyField(verifier, VT_STRIDE_W) && + VerifyField(verifier, VT_STRIDE_H) && + VerifyField(verifier, VT_FILTER_WIDTH) && + VerifyField(verifier, VT_FILTER_HEIGHT) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + verifier.EndTable(); + } + Pool2DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Pool2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Pool2DOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_padding(tflite::Padding padding) + { + fbb_.AddElement(Pool2DOptions::VT_PADDING, static_cast(padding), 0); + } + void add_stride_w(int32_t stride_w) + { + fbb_.AddElement(Pool2DOptions::VT_STRIDE_W, stride_w, 0); + } + void add_stride_h(int32_t stride_h) + { + fbb_.AddElement(Pool2DOptions::VT_STRIDE_H, stride_h, 0); + } + void add_filter_width(int32_t filter_width) + { + fbb_.AddElement(Pool2DOptions::VT_FILTER_WIDTH, filter_width, 0); + } + void add_filter_height(int32_t filter_height) + { + fbb_.AddElement(Pool2DOptions::VT_FILTER_HEIGHT, filter_height, 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(Pool2DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + explicit Pool2DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Pool2DOptionsBuilder &operator=(const Pool2DOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreatePool2DOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::Padding padding = tflite::Padding_SAME, + int32_t stride_w = 0, + int32_t stride_h = 0, + int32_t filter_width = 0, + int32_t filter_height = 0, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) +{ + Pool2DOptionsBuilder builder_(_fbb); + builder_.add_filter_height(filter_height); + builder_.add_filter_width(filter_width); + builder_.add_stride_h(stride_h); + builder_.add_stride_w(stride_w); + builder_.add_fused_activation_function(fused_activation_function); + builder_.add_padding(padding); + return builder_.Finish(); +} + +flatbuffers::Offset CreatePool2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DepthwiseConv2DOptionsT : public flatbuffers::NativeTable { + typedef DepthwiseConv2DOptions TableType; + tflite::Padding padding; + int32_t stride_w; + int32_t stride_h; + int32_t depth_multiplier; + tflite::ActivationFunctionType fused_activation_function; + int32_t dilation_w_factor; + int32_t dilation_h_factor; + DepthwiseConv2DOptionsT() + : padding(tflite::Padding_SAME), + stride_w(0), + stride_h(0), + depth_multiplier(0), + fused_activation_function(tflite::ActivationFunctionType_NONE), + dilation_w_factor(1), + dilation_h_factor(1) + { + } +}; + +struct DepthwiseConv2DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef DepthwiseConv2DOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PADDING = 4, + VT_STRIDE_W = 6, + VT_STRIDE_H = 8, + VT_DEPTH_MULTIPLIER = 10, + VT_FUSED_ACTIVATION_FUNCTION = 12, + VT_DILATION_W_FACTOR = 14, + VT_DILATION_H_FACTOR = 16 + }; + tflite::Padding padding() const + { + return static_cast(GetField(VT_PADDING, 0)); + } + int32_t stride_w() const + { + return GetField(VT_STRIDE_W, 0); + } + int32_t stride_h() const + { + return GetField(VT_STRIDE_H, 0); + } + int32_t depth_multiplier() const + { + return GetField(VT_DEPTH_MULTIPLIER, 0); + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + int32_t dilation_w_factor() const + { + return GetField(VT_DILATION_W_FACTOR, 1); + } + int32_t dilation_h_factor() const + { + return GetField(VT_DILATION_H_FACTOR, 1); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PADDING) && + VerifyField(verifier, VT_STRIDE_W) && + VerifyField(verifier, VT_STRIDE_H) && + VerifyField(verifier, VT_DEPTH_MULTIPLIER) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_DILATION_W_FACTOR) && + VerifyField(verifier, VT_DILATION_H_FACTOR) && + verifier.EndTable(); + } + DepthwiseConv2DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DepthwiseConv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct DepthwiseConv2DOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_padding(tflite::Padding padding) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_PADDING, static_cast(padding), 0); + } + void add_stride_w(int32_t stride_w) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_STRIDE_W, stride_w, 0); + } + void add_stride_h(int32_t stride_h) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_STRIDE_H, stride_h, 0); + } + void add_depth_multiplier(int32_t depth_multiplier) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_DEPTH_MULTIPLIER, depth_multiplier, 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_dilation_w_factor(int32_t dilation_w_factor) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_DILATION_W_FACTOR, dilation_w_factor, 1); + } + void add_dilation_h_factor(int32_t dilation_h_factor) + { + fbb_.AddElement(DepthwiseConv2DOptions::VT_DILATION_H_FACTOR, dilation_h_factor, 1); + } + explicit DepthwiseConv2DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + DepthwiseConv2DOptionsBuilder &operator=(const DepthwiseConv2DOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateDepthwiseConv2DOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::Padding padding = tflite::Padding_SAME, + int32_t stride_w = 0, + int32_t stride_h = 0, + int32_t depth_multiplier = 0, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + int32_t dilation_w_factor = 1, + int32_t dilation_h_factor = 1) +{ + DepthwiseConv2DOptionsBuilder builder_(_fbb); + builder_.add_dilation_h_factor(dilation_h_factor); + builder_.add_dilation_w_factor(dilation_w_factor); + builder_.add_depth_multiplier(depth_multiplier); + builder_.add_stride_h(stride_h); + builder_.add_stride_w(stride_w); + builder_.add_fused_activation_function(fused_activation_function); + builder_.add_padding(padding); + return builder_.Finish(); +} + +flatbuffers::Offset CreateDepthwiseConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ConcatEmbeddingsOptionsT : public flatbuffers::NativeTable { + typedef ConcatEmbeddingsOptions TableType; + int32_t num_channels; + std::vector num_columns_per_channel; + std::vector embedding_dim_per_channel; + ConcatEmbeddingsOptionsT() + : num_channels(0) + { + } +}; + +struct ConcatEmbeddingsOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ConcatEmbeddingsOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NUM_CHANNELS = 4, + VT_NUM_COLUMNS_PER_CHANNEL = 6, + VT_EMBEDDING_DIM_PER_CHANNEL = 8 + }; + int32_t num_channels() const + { + return GetField(VT_NUM_CHANNELS, 0); + } + const flatbuffers::Vector *num_columns_per_channel() const + { + return GetPointer *>(VT_NUM_COLUMNS_PER_CHANNEL); + } + const flatbuffers::Vector *embedding_dim_per_channel() const + { + return GetPointer *>(VT_EMBEDDING_DIM_PER_CHANNEL); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_NUM_CHANNELS) && + VerifyOffset(verifier, VT_NUM_COLUMNS_PER_CHANNEL) && + verifier.VerifyVector(num_columns_per_channel()) && + VerifyOffset(verifier, VT_EMBEDDING_DIM_PER_CHANNEL) && + verifier.VerifyVector(embedding_dim_per_channel()) && + verifier.EndTable(); + } + ConcatEmbeddingsOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ConcatEmbeddingsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ConcatEmbeddingsOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_num_channels(int32_t num_channels) + { + fbb_.AddElement(ConcatEmbeddingsOptions::VT_NUM_CHANNELS, num_channels, 0); + } + void add_num_columns_per_channel(flatbuffers::Offset > num_columns_per_channel) + { + fbb_.AddOffset(ConcatEmbeddingsOptions::VT_NUM_COLUMNS_PER_CHANNEL, num_columns_per_channel); + } + void add_embedding_dim_per_channel(flatbuffers::Offset > embedding_dim_per_channel) + { + fbb_.AddOffset(ConcatEmbeddingsOptions::VT_EMBEDDING_DIM_PER_CHANNEL, embedding_dim_per_channel); + } + explicit ConcatEmbeddingsOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ConcatEmbeddingsOptionsBuilder &operator=(const ConcatEmbeddingsOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateConcatEmbeddingsOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t num_channels = 0, + flatbuffers::Offset > num_columns_per_channel = 0, + flatbuffers::Offset > embedding_dim_per_channel = 0) +{ + ConcatEmbeddingsOptionsBuilder builder_(_fbb); + builder_.add_embedding_dim_per_channel(embedding_dim_per_channel); + builder_.add_num_columns_per_channel(num_columns_per_channel); + builder_.add_num_channels(num_channels); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateConcatEmbeddingsOptionsDirect( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t num_channels = 0, + const std::vector *num_columns_per_channel = nullptr, + const std::vector *embedding_dim_per_channel = nullptr) +{ + auto num_columns_per_channel__ = num_columns_per_channel ? _fbb.CreateVector(*num_columns_per_channel) : 0; + auto embedding_dim_per_channel__ = embedding_dim_per_channel ? _fbb.CreateVector(*embedding_dim_per_channel) : 0; + return tflite::CreateConcatEmbeddingsOptions( + _fbb, + num_channels, + num_columns_per_channel__, + embedding_dim_per_channel__); +} + +flatbuffers::Offset CreateConcatEmbeddingsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LSHProjectionOptionsT : public flatbuffers::NativeTable { + typedef LSHProjectionOptions TableType; + tflite::LSHProjectionType type; + LSHProjectionOptionsT() + : type(tflite::LSHProjectionType_UNKNOWN) + { + } +}; + +struct LSHProjectionOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LSHProjectionOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TYPE = 4 + }; + tflite::LSHProjectionType type() const + { + return static_cast(GetField(VT_TYPE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_TYPE) && + verifier.EndTable(); + } + LSHProjectionOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LSHProjectionOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LSHProjectionOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_type(tflite::LSHProjectionType type) + { + fbb_.AddElement(LSHProjectionOptions::VT_TYPE, static_cast(type), 0); + } + explicit LSHProjectionOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LSHProjectionOptionsBuilder &operator=(const LSHProjectionOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLSHProjectionOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::LSHProjectionType type = tflite::LSHProjectionType_UNKNOWN) +{ + LSHProjectionOptionsBuilder builder_(_fbb); + builder_.add_type(type); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLSHProjectionOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SVDFOptionsT : public flatbuffers::NativeTable { + typedef SVDFOptions TableType; + int32_t rank; + tflite::ActivationFunctionType fused_activation_function; + bool asymmetric_quantize_inputs; + SVDFOptionsT() + : rank(0), + fused_activation_function(tflite::ActivationFunctionType_NONE), + asymmetric_quantize_inputs(false) + { + } +}; + +struct SVDFOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SVDFOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_RANK = 4, + VT_FUSED_ACTIVATION_FUNCTION = 6, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 8 + }; + int32_t rank() const + { + return GetField(VT_RANK, 0); + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_RANK) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + SVDFOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SVDFOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SVDFOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_rank(int32_t rank) + { + fbb_.AddElement(SVDFOptions::VT_RANK, rank, 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(SVDFOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(SVDFOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit SVDFOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SVDFOptionsBuilder &operator=(const SVDFOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSVDFOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t rank = 0, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + bool asymmetric_quantize_inputs = false) +{ + SVDFOptionsBuilder builder_(_fbb); + builder_.add_rank(rank); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSVDFOptions(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct RNNOptionsT : public flatbuffers::NativeTable { + typedef RNNOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + bool asymmetric_quantize_inputs; + RNNOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + asymmetric_quantize_inputs(false) + { + } +}; + +struct RNNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef RNNOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 6 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + RNNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(RNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct RNNOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(RNNOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(RNNOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit RNNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + RNNOptionsBuilder &operator=(const RNNOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateRNNOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + bool asymmetric_quantize_inputs = false) +{ + RNNOptionsBuilder builder_(_fbb); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SequenceRNNOptionsT : public flatbuffers::NativeTable { + typedef SequenceRNNOptions TableType; + bool time_major; + tflite::ActivationFunctionType fused_activation_function; + bool asymmetric_quantize_inputs; + SequenceRNNOptionsT() + : time_major(false), + fused_activation_function(tflite::ActivationFunctionType_NONE), + asymmetric_quantize_inputs(false) + { + } +}; + +struct SequenceRNNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SequenceRNNOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TIME_MAJOR = 4, + VT_FUSED_ACTIVATION_FUNCTION = 6, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 8 + }; + bool time_major() const + { + return GetField(VT_TIME_MAJOR, 0) != 0; + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_TIME_MAJOR) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + SequenceRNNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SequenceRNNOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_time_major(bool time_major) + { + fbb_.AddElement(SequenceRNNOptions::VT_TIME_MAJOR, static_cast(time_major), 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(SequenceRNNOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(SequenceRNNOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit SequenceRNNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SequenceRNNOptionsBuilder &operator=(const SequenceRNNOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSequenceRNNOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool time_major = false, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + bool asymmetric_quantize_inputs = false) +{ + SequenceRNNOptionsBuilder builder_(_fbb); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_fused_activation_function(fused_activation_function); + builder_.add_time_major(time_major); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct BidirectionalSequenceRNNOptionsT : public flatbuffers::NativeTable { + typedef BidirectionalSequenceRNNOptions TableType; + bool time_major; + tflite::ActivationFunctionType fused_activation_function; + bool merge_outputs; + bool asymmetric_quantize_inputs; + BidirectionalSequenceRNNOptionsT() + : time_major(false), + fused_activation_function(tflite::ActivationFunctionType_NONE), + merge_outputs(false), + asymmetric_quantize_inputs(false) + { + } +}; + +struct BidirectionalSequenceRNNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef BidirectionalSequenceRNNOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TIME_MAJOR = 4, + VT_FUSED_ACTIVATION_FUNCTION = 6, + VT_MERGE_OUTPUTS = 8, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 10 + }; + bool time_major() const + { + return GetField(VT_TIME_MAJOR, 0) != 0; + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool merge_outputs() const + { + return GetField(VT_MERGE_OUTPUTS, 0) != 0; + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_TIME_MAJOR) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_MERGE_OUTPUTS) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + BidirectionalSequenceRNNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct BidirectionalSequenceRNNOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_time_major(bool time_major) + { + fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_TIME_MAJOR, static_cast(time_major), 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_merge_outputs(bool merge_outputs) + { + fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_MERGE_OUTPUTS, static_cast(merge_outputs), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit BidirectionalSequenceRNNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + BidirectionalSequenceRNNOptionsBuilder &operator=(const BidirectionalSequenceRNNOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateBidirectionalSequenceRNNOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool time_major = false, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + bool merge_outputs = false, + bool asymmetric_quantize_inputs = false) +{ + BidirectionalSequenceRNNOptionsBuilder builder_(_fbb); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_merge_outputs(merge_outputs); + builder_.add_fused_activation_function(fused_activation_function); + builder_.add_time_major(time_major); + return builder_.Finish(); +} + +flatbuffers::Offset CreateBidirectionalSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct FullyConnectedOptionsT : public flatbuffers::NativeTable { + typedef FullyConnectedOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + tflite::FullyConnectedOptionsWeightsFormat weights_format; + bool keep_num_dims; + bool asymmetric_quantize_inputs; + FullyConnectedOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + weights_format(tflite::FullyConnectedOptionsWeightsFormat_DEFAULT), + keep_num_dims(false), + asymmetric_quantize_inputs(false) + { + } +}; + +struct FullyConnectedOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FullyConnectedOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_WEIGHTS_FORMAT = 6, + VT_KEEP_NUM_DIMS = 8, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 10 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + tflite::FullyConnectedOptionsWeightsFormat weights_format() const + { + return static_cast(GetField(VT_WEIGHTS_FORMAT, 0)); + } + bool keep_num_dims() const + { + return GetField(VT_KEEP_NUM_DIMS, 0) != 0; + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_WEIGHTS_FORMAT) && + VerifyField(verifier, VT_KEEP_NUM_DIMS) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + FullyConnectedOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(FullyConnectedOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct FullyConnectedOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(FullyConnectedOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_weights_format(tflite::FullyConnectedOptionsWeightsFormat weights_format) + { + fbb_.AddElement(FullyConnectedOptions::VT_WEIGHTS_FORMAT, static_cast(weights_format), 0); + } + void add_keep_num_dims(bool keep_num_dims) + { + fbb_.AddElement(FullyConnectedOptions::VT_KEEP_NUM_DIMS, static_cast(keep_num_dims), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(FullyConnectedOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit FullyConnectedOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + FullyConnectedOptionsBuilder &operator=(const FullyConnectedOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFullyConnectedOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + tflite::FullyConnectedOptionsWeightsFormat weights_format = tflite::FullyConnectedOptionsWeightsFormat_DEFAULT, + bool keep_num_dims = false, + bool asymmetric_quantize_inputs = false) +{ + FullyConnectedOptionsBuilder builder_(_fbb); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_keep_num_dims(keep_num_dims); + builder_.add_weights_format(weights_format); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateFullyConnectedOptions(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SoftmaxOptionsT : public flatbuffers::NativeTable { + typedef SoftmaxOptions TableType; + float beta; + SoftmaxOptionsT() + : beta(0.0f) + { + } +}; + +struct SoftmaxOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SoftmaxOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BETA = 4 + }; + float beta() const + { + return GetField(VT_BETA, 0.0f); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BETA) && + verifier.EndTable(); + } + SoftmaxOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SoftmaxOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_beta(float beta) + { + fbb_.AddElement(SoftmaxOptions::VT_BETA, beta, 0.0f); + } + explicit SoftmaxOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SoftmaxOptionsBuilder &operator=(const SoftmaxOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSoftmaxOptions( + flatbuffers::FlatBufferBuilder &_fbb, + float beta = 0.0f) +{ + SoftmaxOptionsBuilder builder_(_fbb); + builder_.add_beta(beta); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ConcatenationOptionsT : public flatbuffers::NativeTable { + typedef ConcatenationOptions TableType; + int32_t axis; + tflite::ActivationFunctionType fused_activation_function; + ConcatenationOptionsT() + : axis(0), + fused_activation_function(tflite::ActivationFunctionType_NONE) + { + } +}; + +struct ConcatenationOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ConcatenationOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_AXIS = 4, + VT_FUSED_ACTIVATION_FUNCTION = 6 + }; + int32_t axis() const + { + return GetField(VT_AXIS, 0); + } + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_AXIS) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + verifier.EndTable(); + } + ConcatenationOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ConcatenationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ConcatenationOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_axis(int32_t axis) + { + fbb_.AddElement(ConcatenationOptions::VT_AXIS, axis, 0); + } + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(ConcatenationOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + explicit ConcatenationOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ConcatenationOptionsBuilder &operator=(const ConcatenationOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateConcatenationOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t axis = 0, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) +{ + ConcatenationOptionsBuilder builder_(_fbb); + builder_.add_axis(axis); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateConcatenationOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct AddOptionsT : public flatbuffers::NativeTable { + typedef AddOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + bool pot_scale_int16; + AddOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + pot_scale_int16(true) + { + } +}; + +struct AddOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef AddOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_POT_SCALE_INT16 = 6 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool pot_scale_int16() const + { + return GetField(VT_POT_SCALE_INT16, 1) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_POT_SCALE_INT16) && + verifier.EndTable(); + } + AddOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(AddOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct AddOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(AddOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_pot_scale_int16(bool pot_scale_int16) + { + fbb_.AddElement(AddOptions::VT_POT_SCALE_INT16, static_cast(pot_scale_int16), 1); + } + explicit AddOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + AddOptionsBuilder &operator=(const AddOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateAddOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + bool pot_scale_int16 = true) +{ + AddOptionsBuilder builder_(_fbb); + builder_.add_pot_scale_int16(pot_scale_int16); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateAddOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct MulOptionsT : public flatbuffers::NativeTable { + typedef MulOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + MulOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE) + { + } +}; + +struct MulOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef MulOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + verifier.EndTable(); + } + MulOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(MulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct MulOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(MulOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + explicit MulOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + MulOptionsBuilder &operator=(const MulOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateMulOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) +{ + MulOptionsBuilder builder_(_fbb); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct L2NormOptionsT : public flatbuffers::NativeTable { + typedef L2NormOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + L2NormOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE) + { + } +}; + +struct L2NormOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef L2NormOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + verifier.EndTable(); + } + L2NormOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(L2NormOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct L2NormOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(L2NormOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + explicit L2NormOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + L2NormOptionsBuilder &operator=(const L2NormOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateL2NormOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) +{ + L2NormOptionsBuilder builder_(_fbb); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateL2NormOptions(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LocalResponseNormalizationOptionsT : public flatbuffers::NativeTable { + typedef LocalResponseNormalizationOptions TableType; + int32_t radius; + float bias; + float alpha; + float beta; + LocalResponseNormalizationOptionsT() + : radius(0), + bias(0.0f), + alpha(0.0f), + beta(0.0f) + { + } +}; + +struct LocalResponseNormalizationOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LocalResponseNormalizationOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_RADIUS = 4, + VT_BIAS = 6, + VT_ALPHA = 8, + VT_BETA = 10 + }; + int32_t radius() const + { + return GetField(VT_RADIUS, 0); + } + float bias() const + { + return GetField(VT_BIAS, 0.0f); + } + float alpha() const + { + return GetField(VT_ALPHA, 0.0f); + } + float beta() const + { + return GetField(VT_BETA, 0.0f); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_RADIUS) && + VerifyField(verifier, VT_BIAS) && + VerifyField(verifier, VT_ALPHA) && + VerifyField(verifier, VT_BETA) && + verifier.EndTable(); + } + LocalResponseNormalizationOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LocalResponseNormalizationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LocalResponseNormalizationOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_radius(int32_t radius) + { + fbb_.AddElement(LocalResponseNormalizationOptions::VT_RADIUS, radius, 0); + } + void add_bias(float bias) + { + fbb_.AddElement(LocalResponseNormalizationOptions::VT_BIAS, bias, 0.0f); + } + void add_alpha(float alpha) + { + fbb_.AddElement(LocalResponseNormalizationOptions::VT_ALPHA, alpha, 0.0f); + } + void add_beta(float beta) + { + fbb_.AddElement(LocalResponseNormalizationOptions::VT_BETA, beta, 0.0f); + } + explicit LocalResponseNormalizationOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LocalResponseNormalizationOptionsBuilder &operator=(const LocalResponseNormalizationOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLocalResponseNormalizationOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t radius = 0, + float bias = 0.0f, + float alpha = 0.0f, + float beta = 0.0f) +{ + LocalResponseNormalizationOptionsBuilder builder_(_fbb); + builder_.add_beta(beta); + builder_.add_alpha(alpha); + builder_.add_bias(bias); + builder_.add_radius(radius); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLocalResponseNormalizationOptions(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LSTMOptionsT : public flatbuffers::NativeTable { + typedef LSTMOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + float cell_clip; + float proj_clip; + tflite::LSTMKernelType kernel_type; + bool asymmetric_quantize_inputs; + LSTMOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + cell_clip(0.0f), + proj_clip(0.0f), + kernel_type(tflite::LSTMKernelType_FULL), + asymmetric_quantize_inputs(false) + { + } +}; + +struct LSTMOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LSTMOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_CELL_CLIP = 6, + VT_PROJ_CLIP = 8, + VT_KERNEL_TYPE = 10, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 12 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + float cell_clip() const + { + return GetField(VT_CELL_CLIP, 0.0f); + } + float proj_clip() const + { + return GetField(VT_PROJ_CLIP, 0.0f); + } + tflite::LSTMKernelType kernel_type() const + { + return static_cast(GetField(VT_KERNEL_TYPE, 0)); + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_CELL_CLIP) && + VerifyField(verifier, VT_PROJ_CLIP) && + VerifyField(verifier, VT_KERNEL_TYPE) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + LSTMOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LSTMOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(LSTMOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_cell_clip(float cell_clip) + { + fbb_.AddElement(LSTMOptions::VT_CELL_CLIP, cell_clip, 0.0f); + } + void add_proj_clip(float proj_clip) + { + fbb_.AddElement(LSTMOptions::VT_PROJ_CLIP, proj_clip, 0.0f); + } + void add_kernel_type(tflite::LSTMKernelType kernel_type) + { + fbb_.AddElement(LSTMOptions::VT_KERNEL_TYPE, static_cast(kernel_type), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(LSTMOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit LSTMOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LSTMOptionsBuilder &operator=(const LSTMOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLSTMOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + float cell_clip = 0.0f, + float proj_clip = 0.0f, + tflite::LSTMKernelType kernel_type = tflite::LSTMKernelType_FULL, + bool asymmetric_quantize_inputs = false) +{ + LSTMOptionsBuilder builder_(_fbb); + builder_.add_proj_clip(proj_clip); + builder_.add_cell_clip(cell_clip); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_kernel_type(kernel_type); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct UnidirectionalSequenceLSTMOptionsT : public flatbuffers::NativeTable { + typedef UnidirectionalSequenceLSTMOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + float cell_clip; + float proj_clip; + bool time_major; + bool asymmetric_quantize_inputs; + UnidirectionalSequenceLSTMOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + cell_clip(0.0f), + proj_clip(0.0f), + time_major(false), + asymmetric_quantize_inputs(false) + { + } +}; + +struct UnidirectionalSequenceLSTMOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef UnidirectionalSequenceLSTMOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_CELL_CLIP = 6, + VT_PROJ_CLIP = 8, + VT_TIME_MAJOR = 10, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 12 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + float cell_clip() const + { + return GetField(VT_CELL_CLIP, 0.0f); + } + float proj_clip() const + { + return GetField(VT_PROJ_CLIP, 0.0f); + } + bool time_major() const + { + return GetField(VT_TIME_MAJOR, 0) != 0; + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_CELL_CLIP) && + VerifyField(verifier, VT_PROJ_CLIP) && + VerifyField(verifier, VT_TIME_MAJOR) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + UnidirectionalSequenceLSTMOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct UnidirectionalSequenceLSTMOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_cell_clip(float cell_clip) + { + fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_CELL_CLIP, cell_clip, 0.0f); + } + void add_proj_clip(float proj_clip) + { + fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_PROJ_CLIP, proj_clip, 0.0f); + } + void add_time_major(bool time_major) + { + fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_TIME_MAJOR, static_cast(time_major), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit UnidirectionalSequenceLSTMOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + UnidirectionalSequenceLSTMOptionsBuilder &operator=(const UnidirectionalSequenceLSTMOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateUnidirectionalSequenceLSTMOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + float cell_clip = 0.0f, + float proj_clip = 0.0f, + bool time_major = false, + bool asymmetric_quantize_inputs = false) +{ + UnidirectionalSequenceLSTMOptionsBuilder builder_(_fbb); + builder_.add_proj_clip(proj_clip); + builder_.add_cell_clip(cell_clip); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_time_major(time_major); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateUnidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct BidirectionalSequenceLSTMOptionsT : public flatbuffers::NativeTable { + typedef BidirectionalSequenceLSTMOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + float cell_clip; + float proj_clip; + bool merge_outputs; + bool time_major; + bool asymmetric_quantize_inputs; + BidirectionalSequenceLSTMOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + cell_clip(0.0f), + proj_clip(0.0f), + merge_outputs(false), + time_major(true), + asymmetric_quantize_inputs(false) + { + } +}; + +struct BidirectionalSequenceLSTMOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef BidirectionalSequenceLSTMOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_CELL_CLIP = 6, + VT_PROJ_CLIP = 8, + VT_MERGE_OUTPUTS = 10, + VT_TIME_MAJOR = 12, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 14 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + float cell_clip() const + { + return GetField(VT_CELL_CLIP, 0.0f); + } + float proj_clip() const + { + return GetField(VT_PROJ_CLIP, 0.0f); + } + bool merge_outputs() const + { + return GetField(VT_MERGE_OUTPUTS, 0) != 0; + } + bool time_major() const + { + return GetField(VT_TIME_MAJOR, 1) != 0; + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_CELL_CLIP) && + VerifyField(verifier, VT_PROJ_CLIP) && + VerifyField(verifier, VT_MERGE_OUTPUTS) && + VerifyField(verifier, VT_TIME_MAJOR) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + BidirectionalSequenceLSTMOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct BidirectionalSequenceLSTMOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_cell_clip(float cell_clip) + { + fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_CELL_CLIP, cell_clip, 0.0f); + } + void add_proj_clip(float proj_clip) + { + fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_PROJ_CLIP, proj_clip, 0.0f); + } + void add_merge_outputs(bool merge_outputs) + { + fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_MERGE_OUTPUTS, static_cast(merge_outputs), 0); + } + void add_time_major(bool time_major) + { + fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_TIME_MAJOR, static_cast(time_major), 1); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit BidirectionalSequenceLSTMOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + BidirectionalSequenceLSTMOptionsBuilder &operator=(const BidirectionalSequenceLSTMOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateBidirectionalSequenceLSTMOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + float cell_clip = 0.0f, + float proj_clip = 0.0f, + bool merge_outputs = false, + bool time_major = true, + bool asymmetric_quantize_inputs = false) +{ + BidirectionalSequenceLSTMOptionsBuilder builder_(_fbb); + builder_.add_proj_clip(proj_clip); + builder_.add_cell_clip(cell_clip); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_time_major(time_major); + builder_.add_merge_outputs(merge_outputs); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateBidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ResizeBilinearOptionsT : public flatbuffers::NativeTable { + typedef ResizeBilinearOptions TableType; + bool align_corners; + bool half_pixel_centers; + ResizeBilinearOptionsT() + : align_corners(false), + half_pixel_centers(false) + { + } +}; + +struct ResizeBilinearOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ResizeBilinearOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ALIGN_CORNERS = 8, + VT_HALF_PIXEL_CENTERS = 10 + }; + bool align_corners() const + { + return GetField(VT_ALIGN_CORNERS, 0) != 0; + } + bool half_pixel_centers() const + { + return GetField(VT_HALF_PIXEL_CENTERS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ALIGN_CORNERS) && + VerifyField(verifier, VT_HALF_PIXEL_CENTERS) && + verifier.EndTable(); + } + ResizeBilinearOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ResizeBilinearOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ResizeBilinearOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_align_corners(bool align_corners) + { + fbb_.AddElement(ResizeBilinearOptions::VT_ALIGN_CORNERS, static_cast(align_corners), 0); + } + void add_half_pixel_centers(bool half_pixel_centers) + { + fbb_.AddElement(ResizeBilinearOptions::VT_HALF_PIXEL_CENTERS, static_cast(half_pixel_centers), 0); + } + explicit ResizeBilinearOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ResizeBilinearOptionsBuilder &operator=(const ResizeBilinearOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateResizeBilinearOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool align_corners = false, + bool half_pixel_centers = false) +{ + ResizeBilinearOptionsBuilder builder_(_fbb); + builder_.add_half_pixel_centers(half_pixel_centers); + builder_.add_align_corners(align_corners); + return builder_.Finish(); +} + +flatbuffers::Offset CreateResizeBilinearOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ResizeNearestNeighborOptionsT : public flatbuffers::NativeTable { + typedef ResizeNearestNeighborOptions TableType; + bool align_corners; + bool half_pixel_centers; + ResizeNearestNeighborOptionsT() + : align_corners(false), + half_pixel_centers(false) + { + } +}; + +struct ResizeNearestNeighborOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ResizeNearestNeighborOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ALIGN_CORNERS = 4, + VT_HALF_PIXEL_CENTERS = 6 + }; + bool align_corners() const + { + return GetField(VT_ALIGN_CORNERS, 0) != 0; + } + bool half_pixel_centers() const + { + return GetField(VT_HALF_PIXEL_CENTERS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ALIGN_CORNERS) && + VerifyField(verifier, VT_HALF_PIXEL_CENTERS) && + verifier.EndTable(); + } + ResizeNearestNeighborOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ResizeNearestNeighborOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ResizeNearestNeighborOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_align_corners(bool align_corners) + { + fbb_.AddElement(ResizeNearestNeighborOptions::VT_ALIGN_CORNERS, static_cast(align_corners), 0); + } + void add_half_pixel_centers(bool half_pixel_centers) + { + fbb_.AddElement(ResizeNearestNeighborOptions::VT_HALF_PIXEL_CENTERS, static_cast(half_pixel_centers), 0); + } + explicit ResizeNearestNeighborOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ResizeNearestNeighborOptionsBuilder &operator=(const ResizeNearestNeighborOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateResizeNearestNeighborOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool align_corners = false, + bool half_pixel_centers = false) +{ + ResizeNearestNeighborOptionsBuilder builder_(_fbb); + builder_.add_half_pixel_centers(half_pixel_centers); + builder_.add_align_corners(align_corners); + return builder_.Finish(); +} + +flatbuffers::Offset CreateResizeNearestNeighborOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct CallOptionsT : public flatbuffers::NativeTable { + typedef CallOptions TableType; + uint32_t subgraph; + CallOptionsT() + : subgraph(0) + { + } +}; + +struct CallOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef CallOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_SUBGRAPH = 4 + }; + uint32_t subgraph() const + { + return GetField(VT_SUBGRAPH, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_SUBGRAPH) && + verifier.EndTable(); + } + CallOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(CallOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct CallOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_subgraph(uint32_t subgraph) + { + fbb_.AddElement(CallOptions::VT_SUBGRAPH, subgraph, 0); + } + explicit CallOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + CallOptionsBuilder &operator=(const CallOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateCallOptions( + flatbuffers::FlatBufferBuilder &_fbb, + uint32_t subgraph = 0) +{ + CallOptionsBuilder builder_(_fbb); + builder_.add_subgraph(subgraph); + return builder_.Finish(); +} + +flatbuffers::Offset CreateCallOptions(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct PadOptionsT : public flatbuffers::NativeTable { + typedef PadOptions TableType; + PadOptionsT() + { + } +}; + +struct PadOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef PadOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + PadOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(PadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct PadOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit PadOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + PadOptionsBuilder &operator=(const PadOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreatePadOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + PadOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreatePadOptions(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct PadV2OptionsT : public flatbuffers::NativeTable { + typedef PadV2Options TableType; + PadV2OptionsT() + { + } +}; + +struct PadV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef PadV2OptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + PadV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(PadV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct PadV2OptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit PadV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + PadV2OptionsBuilder &operator=(const PadV2OptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreatePadV2Options( + flatbuffers::FlatBufferBuilder &_fbb) +{ + PadV2OptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreatePadV2Options(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ReshapeOptionsT : public flatbuffers::NativeTable { + typedef ReshapeOptions TableType; + std::vector new_shape; + ReshapeOptionsT() + { + } +}; + +struct ReshapeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ReshapeOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NEW_SHAPE = 4 + }; + const flatbuffers::Vector *new_shape() const + { + return GetPointer *>(VT_NEW_SHAPE); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_NEW_SHAPE) && + verifier.VerifyVector(new_shape()) && + verifier.EndTable(); + } + ReshapeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ReshapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ReshapeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_new_shape(flatbuffers::Offset > new_shape) + { + fbb_.AddOffset(ReshapeOptions::VT_NEW_SHAPE, new_shape); + } + explicit ReshapeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ReshapeOptionsBuilder &operator=(const ReshapeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateReshapeOptions( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > new_shape = 0) +{ + ReshapeOptionsBuilder builder_(_fbb); + builder_.add_new_shape(new_shape); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateReshapeOptionsDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *new_shape = nullptr) +{ + auto new_shape__ = new_shape ? _fbb.CreateVector(*new_shape) : 0; + return tflite::CreateReshapeOptions( + _fbb, + new_shape__); +} + +flatbuffers::Offset CreateReshapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SpaceToBatchNDOptionsT : public flatbuffers::NativeTable { + typedef SpaceToBatchNDOptions TableType; + SpaceToBatchNDOptionsT() + { + } +}; + +struct SpaceToBatchNDOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SpaceToBatchNDOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SpaceToBatchNDOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SpaceToBatchNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SpaceToBatchNDOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SpaceToBatchNDOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SpaceToBatchNDOptionsBuilder &operator=(const SpaceToBatchNDOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSpaceToBatchNDOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SpaceToBatchNDOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSpaceToBatchNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct BatchToSpaceNDOptionsT : public flatbuffers::NativeTable { + typedef BatchToSpaceNDOptions TableType; + BatchToSpaceNDOptionsT() + { + } +}; + +struct BatchToSpaceNDOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef BatchToSpaceNDOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + BatchToSpaceNDOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(BatchToSpaceNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct BatchToSpaceNDOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit BatchToSpaceNDOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + BatchToSpaceNDOptionsBuilder &operator=(const BatchToSpaceNDOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateBatchToSpaceNDOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + BatchToSpaceNDOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateBatchToSpaceNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SkipGramOptionsT : public flatbuffers::NativeTable { + typedef SkipGramOptions TableType; + int32_t ngram_size; + int32_t max_skip_size; + bool include_all_ngrams; + SkipGramOptionsT() + : ngram_size(0), + max_skip_size(0), + include_all_ngrams(false) + { + } +}; + +struct SkipGramOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SkipGramOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NGRAM_SIZE = 4, + VT_MAX_SKIP_SIZE = 6, + VT_INCLUDE_ALL_NGRAMS = 8 + }; + int32_t ngram_size() const + { + return GetField(VT_NGRAM_SIZE, 0); + } + int32_t max_skip_size() const + { + return GetField(VT_MAX_SKIP_SIZE, 0); + } + bool include_all_ngrams() const + { + return GetField(VT_INCLUDE_ALL_NGRAMS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_NGRAM_SIZE) && + VerifyField(verifier, VT_MAX_SKIP_SIZE) && + VerifyField(verifier, VT_INCLUDE_ALL_NGRAMS) && + verifier.EndTable(); + } + SkipGramOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SkipGramOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SkipGramOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_ngram_size(int32_t ngram_size) + { + fbb_.AddElement(SkipGramOptions::VT_NGRAM_SIZE, ngram_size, 0); + } + void add_max_skip_size(int32_t max_skip_size) + { + fbb_.AddElement(SkipGramOptions::VT_MAX_SKIP_SIZE, max_skip_size, 0); + } + void add_include_all_ngrams(bool include_all_ngrams) + { + fbb_.AddElement(SkipGramOptions::VT_INCLUDE_ALL_NGRAMS, static_cast(include_all_ngrams), 0); + } + explicit SkipGramOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SkipGramOptionsBuilder &operator=(const SkipGramOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSkipGramOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t ngram_size = 0, + int32_t max_skip_size = 0, + bool include_all_ngrams = false) +{ + SkipGramOptionsBuilder builder_(_fbb); + builder_.add_max_skip_size(max_skip_size); + builder_.add_ngram_size(ngram_size); + builder_.add_include_all_ngrams(include_all_ngrams); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSkipGramOptions(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SpaceToDepthOptionsT : public flatbuffers::NativeTable { + typedef SpaceToDepthOptions TableType; + int32_t block_size; + SpaceToDepthOptionsT() + : block_size(0) + { + } +}; + +struct SpaceToDepthOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SpaceToDepthOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BLOCK_SIZE = 4 + }; + int32_t block_size() const + { + return GetField(VT_BLOCK_SIZE, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BLOCK_SIZE) && + verifier.EndTable(); + } + SpaceToDepthOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SpaceToDepthOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SpaceToDepthOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_block_size(int32_t block_size) + { + fbb_.AddElement(SpaceToDepthOptions::VT_BLOCK_SIZE, block_size, 0); + } + explicit SpaceToDepthOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SpaceToDepthOptionsBuilder &operator=(const SpaceToDepthOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSpaceToDepthOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t block_size = 0) +{ + SpaceToDepthOptionsBuilder builder_(_fbb); + builder_.add_block_size(block_size); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSpaceToDepthOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DepthToSpaceOptionsT : public flatbuffers::NativeTable { + typedef DepthToSpaceOptions TableType; + int32_t block_size; + DepthToSpaceOptionsT() + : block_size(0) + { + } +}; + +struct DepthToSpaceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef DepthToSpaceOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BLOCK_SIZE = 4 + }; + int32_t block_size() const + { + return GetField(VT_BLOCK_SIZE, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BLOCK_SIZE) && + verifier.EndTable(); + } + DepthToSpaceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DepthToSpaceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct DepthToSpaceOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_block_size(int32_t block_size) + { + fbb_.AddElement(DepthToSpaceOptions::VT_BLOCK_SIZE, block_size, 0); + } + explicit DepthToSpaceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + DepthToSpaceOptionsBuilder &operator=(const DepthToSpaceOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateDepthToSpaceOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t block_size = 0) +{ + DepthToSpaceOptionsBuilder builder_(_fbb); + builder_.add_block_size(block_size); + return builder_.Finish(); +} + +flatbuffers::Offset CreateDepthToSpaceOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SubOptionsT : public flatbuffers::NativeTable { + typedef SubOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + bool pot_scale_int16; + SubOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE), + pot_scale_int16(true) + { + } +}; + +struct SubOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SubOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4, + VT_POT_SCALE_INT16 = 6 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool pot_scale_int16() const + { + return GetField(VT_POT_SCALE_INT16, 1) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + VerifyField(verifier, VT_POT_SCALE_INT16) && + verifier.EndTable(); + } + SubOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SubOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SubOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(SubOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + void add_pot_scale_int16(bool pot_scale_int16) + { + fbb_.AddElement(SubOptions::VT_POT_SCALE_INT16, static_cast(pot_scale_int16), 1); + } + explicit SubOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SubOptionsBuilder &operator=(const SubOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSubOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, + bool pot_scale_int16 = true) +{ + SubOptionsBuilder builder_(_fbb); + builder_.add_pot_scale_int16(pot_scale_int16); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSubOptions(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DivOptionsT : public flatbuffers::NativeTable { + typedef DivOptions TableType; + tflite::ActivationFunctionType fused_activation_function; + DivOptionsT() + : fused_activation_function(tflite::ActivationFunctionType_NONE) + { + } +}; + +struct DivOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef DivOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_FUSED_ACTIVATION_FUNCTION = 4 + }; + tflite::ActivationFunctionType fused_activation_function() const + { + return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && + verifier.EndTable(); + } + DivOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct DivOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) + { + fbb_.AddElement(DivOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); + } + explicit DivOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + DivOptionsBuilder &operator=(const DivOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateDivOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) +{ + DivOptionsBuilder builder_(_fbb); + builder_.add_fused_activation_function(fused_activation_function); + return builder_.Finish(); +} + +flatbuffers::Offset CreateDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct TopKV2OptionsT : public flatbuffers::NativeTable { + typedef TopKV2Options TableType; + TopKV2OptionsT() + { + } +}; + +struct TopKV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TopKV2OptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + TopKV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(TopKV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct TopKV2OptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit TopKV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + TopKV2OptionsBuilder &operator=(const TopKV2OptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateTopKV2Options( + flatbuffers::FlatBufferBuilder &_fbb) +{ + TopKV2OptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateTopKV2Options(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct EmbeddingLookupSparseOptionsT : public flatbuffers::NativeTable { + typedef EmbeddingLookupSparseOptions TableType; + tflite::CombinerType combiner; + EmbeddingLookupSparseOptionsT() + : combiner(tflite::CombinerType_SUM) + { + } +}; + +struct EmbeddingLookupSparseOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef EmbeddingLookupSparseOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_COMBINER = 4 + }; + tflite::CombinerType combiner() const + { + return static_cast(GetField(VT_COMBINER, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_COMBINER) && + verifier.EndTable(); + } + EmbeddingLookupSparseOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(EmbeddingLookupSparseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct EmbeddingLookupSparseOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_combiner(tflite::CombinerType combiner) + { + fbb_.AddElement(EmbeddingLookupSparseOptions::VT_COMBINER, static_cast(combiner), 0); + } + explicit EmbeddingLookupSparseOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + EmbeddingLookupSparseOptionsBuilder &operator=(const EmbeddingLookupSparseOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateEmbeddingLookupSparseOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::CombinerType combiner = tflite::CombinerType_SUM) +{ + EmbeddingLookupSparseOptionsBuilder builder_(_fbb); + builder_.add_combiner(combiner); + return builder_.Finish(); +} + +flatbuffers::Offset CreateEmbeddingLookupSparseOptions(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct GatherOptionsT : public flatbuffers::NativeTable { + typedef GatherOptions TableType; + int32_t axis; + int32_t batch_dims; + GatherOptionsT() + : axis(0), + batch_dims(0) + { + } +}; + +struct GatherOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef GatherOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_AXIS = 4, + VT_BATCH_DIMS = 6 + }; + int32_t axis() const + { + return GetField(VT_AXIS, 0); + } + int32_t batch_dims() const + { + return GetField(VT_BATCH_DIMS, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_AXIS) && + VerifyField(verifier, VT_BATCH_DIMS) && + verifier.EndTable(); + } + GatherOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(GatherOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct GatherOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_axis(int32_t axis) + { + fbb_.AddElement(GatherOptions::VT_AXIS, axis, 0); + } + void add_batch_dims(int32_t batch_dims) + { + fbb_.AddElement(GatherOptions::VT_BATCH_DIMS, batch_dims, 0); + } + explicit GatherOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + GatherOptionsBuilder &operator=(const GatherOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateGatherOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t axis = 0, + int32_t batch_dims = 0) +{ + GatherOptionsBuilder builder_(_fbb); + builder_.add_batch_dims(batch_dims); + builder_.add_axis(axis); + return builder_.Finish(); +} + +flatbuffers::Offset CreateGatherOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct TransposeOptionsT : public flatbuffers::NativeTable { + typedef TransposeOptions TableType; + TransposeOptionsT() + { + } +}; + +struct TransposeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TransposeOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + TransposeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(TransposeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct TransposeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit TransposeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + TransposeOptionsBuilder &operator=(const TransposeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateTransposeOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + TransposeOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateTransposeOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ExpOptionsT : public flatbuffers::NativeTable { + typedef ExpOptions TableType; + ExpOptionsT() + { + } +}; + +struct ExpOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ExpOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + ExpOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ExpOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ExpOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit ExpOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ExpOptionsBuilder &operator=(const ExpOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateExpOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + ExpOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateExpOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct CosOptionsT : public flatbuffers::NativeTable { + typedef CosOptions TableType; + CosOptionsT() + { + } +}; + +struct CosOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef CosOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + CosOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(CosOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct CosOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit CosOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + CosOptionsBuilder &operator=(const CosOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateCosOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + CosOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateCosOptions(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ReducerOptionsT : public flatbuffers::NativeTable { + typedef ReducerOptions TableType; + bool keep_dims; + ReducerOptionsT() + : keep_dims(false) + { + } +}; + +struct ReducerOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ReducerOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_KEEP_DIMS = 4 + }; + bool keep_dims() const + { + return GetField(VT_KEEP_DIMS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_KEEP_DIMS) && + verifier.EndTable(); + } + ReducerOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ReducerOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ReducerOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_keep_dims(bool keep_dims) + { + fbb_.AddElement(ReducerOptions::VT_KEEP_DIMS, static_cast(keep_dims), 0); + } + explicit ReducerOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ReducerOptionsBuilder &operator=(const ReducerOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateReducerOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool keep_dims = false) +{ + ReducerOptionsBuilder builder_(_fbb); + builder_.add_keep_dims(keep_dims); + return builder_.Finish(); +} + +flatbuffers::Offset CreateReducerOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SqueezeOptionsT : public flatbuffers::NativeTable { + typedef SqueezeOptions TableType; + std::vector squeeze_dims; + SqueezeOptionsT() + { + } +}; + +struct SqueezeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SqueezeOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_SQUEEZE_DIMS = 4 + }; + const flatbuffers::Vector *squeeze_dims() const + { + return GetPointer *>(VT_SQUEEZE_DIMS); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_SQUEEZE_DIMS) && + verifier.VerifyVector(squeeze_dims()) && + verifier.EndTable(); + } + SqueezeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SqueezeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SqueezeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_squeeze_dims(flatbuffers::Offset > squeeze_dims) + { + fbb_.AddOffset(SqueezeOptions::VT_SQUEEZE_DIMS, squeeze_dims); + } + explicit SqueezeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SqueezeOptionsBuilder &operator=(const SqueezeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSqueezeOptions( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > squeeze_dims = 0) +{ + SqueezeOptionsBuilder builder_(_fbb); + builder_.add_squeeze_dims(squeeze_dims); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateSqueezeOptionsDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *squeeze_dims = nullptr) +{ + auto squeeze_dims__ = squeeze_dims ? _fbb.CreateVector(*squeeze_dims) : 0; + return tflite::CreateSqueezeOptions( + _fbb, + squeeze_dims__); +} + +flatbuffers::Offset CreateSqueezeOptions(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SplitOptionsT : public flatbuffers::NativeTable { + typedef SplitOptions TableType; + int32_t num_splits; + SplitOptionsT() + : num_splits(0) + { + } +}; + +struct SplitOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SplitOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NUM_SPLITS = 4 + }; + int32_t num_splits() const + { + return GetField(VT_NUM_SPLITS, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_NUM_SPLITS) && + verifier.EndTable(); + } + SplitOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SplitOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SplitOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_num_splits(int32_t num_splits) + { + fbb_.AddElement(SplitOptions::VT_NUM_SPLITS, num_splits, 0); + } + explicit SplitOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SplitOptionsBuilder &operator=(const SplitOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSplitOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t num_splits = 0) +{ + SplitOptionsBuilder builder_(_fbb); + builder_.add_num_splits(num_splits); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSplitOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SplitVOptionsT : public flatbuffers::NativeTable { + typedef SplitVOptions TableType; + int32_t num_splits; + SplitVOptionsT() + : num_splits(0) + { + } +}; + +struct SplitVOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SplitVOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NUM_SPLITS = 4 + }; + int32_t num_splits() const + { + return GetField(VT_NUM_SPLITS, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_NUM_SPLITS) && + verifier.EndTable(); + } + SplitVOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SplitVOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SplitVOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_num_splits(int32_t num_splits) + { + fbb_.AddElement(SplitVOptions::VT_NUM_SPLITS, num_splits, 0); + } + explicit SplitVOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SplitVOptionsBuilder &operator=(const SplitVOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSplitVOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t num_splits = 0) +{ + SplitVOptionsBuilder builder_(_fbb); + builder_.add_num_splits(num_splits); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSplitVOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct StridedSliceOptionsT : public flatbuffers::NativeTable { + typedef StridedSliceOptions TableType; + int32_t begin_mask; + int32_t end_mask; + int32_t ellipsis_mask; + int32_t new_axis_mask; + int32_t shrink_axis_mask; + StridedSliceOptionsT() + : begin_mask(0), + end_mask(0), + ellipsis_mask(0), + new_axis_mask(0), + shrink_axis_mask(0) + { + } +}; + +struct StridedSliceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef StridedSliceOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_BEGIN_MASK = 4, + VT_END_MASK = 6, + VT_ELLIPSIS_MASK = 8, + VT_NEW_AXIS_MASK = 10, + VT_SHRINK_AXIS_MASK = 12 + }; + int32_t begin_mask() const + { + return GetField(VT_BEGIN_MASK, 0); + } + int32_t end_mask() const + { + return GetField(VT_END_MASK, 0); + } + int32_t ellipsis_mask() const + { + return GetField(VT_ELLIPSIS_MASK, 0); + } + int32_t new_axis_mask() const + { + return GetField(VT_NEW_AXIS_MASK, 0); + } + int32_t shrink_axis_mask() const + { + return GetField(VT_SHRINK_AXIS_MASK, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_BEGIN_MASK) && + VerifyField(verifier, VT_END_MASK) && + VerifyField(verifier, VT_ELLIPSIS_MASK) && + VerifyField(verifier, VT_NEW_AXIS_MASK) && + VerifyField(verifier, VT_SHRINK_AXIS_MASK) && + verifier.EndTable(); + } + StridedSliceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(StridedSliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct StridedSliceOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_begin_mask(int32_t begin_mask) + { + fbb_.AddElement(StridedSliceOptions::VT_BEGIN_MASK, begin_mask, 0); + } + void add_end_mask(int32_t end_mask) + { + fbb_.AddElement(StridedSliceOptions::VT_END_MASK, end_mask, 0); + } + void add_ellipsis_mask(int32_t ellipsis_mask) + { + fbb_.AddElement(StridedSliceOptions::VT_ELLIPSIS_MASK, ellipsis_mask, 0); + } + void add_new_axis_mask(int32_t new_axis_mask) + { + fbb_.AddElement(StridedSliceOptions::VT_NEW_AXIS_MASK, new_axis_mask, 0); + } + void add_shrink_axis_mask(int32_t shrink_axis_mask) + { + fbb_.AddElement(StridedSliceOptions::VT_SHRINK_AXIS_MASK, shrink_axis_mask, 0); + } + explicit StridedSliceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + StridedSliceOptionsBuilder &operator=(const StridedSliceOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateStridedSliceOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t begin_mask = 0, + int32_t end_mask = 0, + int32_t ellipsis_mask = 0, + int32_t new_axis_mask = 0, + int32_t shrink_axis_mask = 0) +{ + StridedSliceOptionsBuilder builder_(_fbb); + builder_.add_shrink_axis_mask(shrink_axis_mask); + builder_.add_new_axis_mask(new_axis_mask); + builder_.add_ellipsis_mask(ellipsis_mask); + builder_.add_end_mask(end_mask); + builder_.add_begin_mask(begin_mask); + return builder_.Finish(); +} + +flatbuffers::Offset CreateStridedSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LogSoftmaxOptionsT : public flatbuffers::NativeTable { + typedef LogSoftmaxOptions TableType; + LogSoftmaxOptionsT() + { + } +}; + +struct LogSoftmaxOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LogSoftmaxOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + LogSoftmaxOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LogSoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LogSoftmaxOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit LogSoftmaxOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LogSoftmaxOptionsBuilder &operator=(const LogSoftmaxOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLogSoftmaxOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + LogSoftmaxOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLogSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct CastOptionsT : public flatbuffers::NativeTable { + typedef CastOptions TableType; + tflite::TensorType in_data_type; + tflite::TensorType out_data_type; + CastOptionsT() + : in_data_type(tflite::TensorType_FLOAT32), + out_data_type(tflite::TensorType_FLOAT32) + { + } +}; + +struct CastOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef CastOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_IN_DATA_TYPE = 4, + VT_OUT_DATA_TYPE = 6 + }; + tflite::TensorType in_data_type() const + { + return static_cast(GetField(VT_IN_DATA_TYPE, 0)); + } + tflite::TensorType out_data_type() const + { + return static_cast(GetField(VT_OUT_DATA_TYPE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_IN_DATA_TYPE) && + VerifyField(verifier, VT_OUT_DATA_TYPE) && + verifier.EndTable(); + } + CastOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(CastOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct CastOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_in_data_type(tflite::TensorType in_data_type) + { + fbb_.AddElement(CastOptions::VT_IN_DATA_TYPE, static_cast(in_data_type), 0); + } + void add_out_data_type(tflite::TensorType out_data_type) + { + fbb_.AddElement(CastOptions::VT_OUT_DATA_TYPE, static_cast(out_data_type), 0); + } + explicit CastOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + CastOptionsBuilder &operator=(const CastOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateCastOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::TensorType in_data_type = tflite::TensorType_FLOAT32, + tflite::TensorType out_data_type = tflite::TensorType_FLOAT32) +{ + CastOptionsBuilder builder_(_fbb); + builder_.add_out_data_type(out_data_type); + builder_.add_in_data_type(in_data_type); + return builder_.Finish(); +} + +flatbuffers::Offset CreateCastOptions(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DequantizeOptionsT : public flatbuffers::NativeTable { + typedef DequantizeOptions TableType; + DequantizeOptionsT() + { + } +}; + +struct DequantizeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef DequantizeOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + DequantizeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DequantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct DequantizeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit DequantizeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + DequantizeOptionsBuilder &operator=(const DequantizeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateDequantizeOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + DequantizeOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateDequantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct MaximumMinimumOptionsT : public flatbuffers::NativeTable { + typedef MaximumMinimumOptions TableType; + MaximumMinimumOptionsT() + { + } +}; + +struct MaximumMinimumOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef MaximumMinimumOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + MaximumMinimumOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(MaximumMinimumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct MaximumMinimumOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit MaximumMinimumOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + MaximumMinimumOptionsBuilder &operator=(const MaximumMinimumOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateMaximumMinimumOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + MaximumMinimumOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateMaximumMinimumOptions(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct TileOptionsT : public flatbuffers::NativeTable { + typedef TileOptions TableType; + TileOptionsT() + { + } +}; + +struct TileOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TileOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + TileOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(TileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct TileOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit TileOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + TileOptionsBuilder &operator=(const TileOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateTileOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + TileOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateTileOptions(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ArgMaxOptionsT : public flatbuffers::NativeTable { + typedef ArgMaxOptions TableType; + tflite::TensorType output_type; + ArgMaxOptionsT() + : output_type(tflite::TensorType_FLOAT32) + { + } +}; + +struct ArgMaxOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ArgMaxOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_OUTPUT_TYPE = 4 + }; + tflite::TensorType output_type() const + { + return static_cast(GetField(VT_OUTPUT_TYPE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_OUTPUT_TYPE) && + verifier.EndTable(); + } + ArgMaxOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ArgMaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ArgMaxOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_output_type(tflite::TensorType output_type) + { + fbb_.AddElement(ArgMaxOptions::VT_OUTPUT_TYPE, static_cast(output_type), 0); + } + explicit ArgMaxOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ArgMaxOptionsBuilder &operator=(const ArgMaxOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateArgMaxOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::TensorType output_type = tflite::TensorType_FLOAT32) +{ + ArgMaxOptionsBuilder builder_(_fbb); + builder_.add_output_type(output_type); + return builder_.Finish(); +} + +flatbuffers::Offset CreateArgMaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ArgMinOptionsT : public flatbuffers::NativeTable { + typedef ArgMinOptions TableType; + tflite::TensorType output_type; + ArgMinOptionsT() + : output_type(tflite::TensorType_FLOAT32) + { + } +}; + +struct ArgMinOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ArgMinOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_OUTPUT_TYPE = 4 + }; + tflite::TensorType output_type() const + { + return static_cast(GetField(VT_OUTPUT_TYPE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_OUTPUT_TYPE) && + verifier.EndTable(); + } + ArgMinOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ArgMinOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ArgMinOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_output_type(tflite::TensorType output_type) + { + fbb_.AddElement(ArgMinOptions::VT_OUTPUT_TYPE, static_cast(output_type), 0); + } + explicit ArgMinOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ArgMinOptionsBuilder &operator=(const ArgMinOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateArgMinOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::TensorType output_type = tflite::TensorType_FLOAT32) +{ + ArgMinOptionsBuilder builder_(_fbb); + builder_.add_output_type(output_type); + return builder_.Finish(); +} + +flatbuffers::Offset CreateArgMinOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct GreaterOptionsT : public flatbuffers::NativeTable { + typedef GreaterOptions TableType; + GreaterOptionsT() + { + } +}; + +struct GreaterOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef GreaterOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + GreaterOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(GreaterOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct GreaterOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit GreaterOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + GreaterOptionsBuilder &operator=(const GreaterOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateGreaterOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + GreaterOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateGreaterOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct GreaterEqualOptionsT : public flatbuffers::NativeTable { + typedef GreaterEqualOptions TableType; + GreaterEqualOptionsT() + { + } +}; + +struct GreaterEqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef GreaterEqualOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + GreaterEqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(GreaterEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct GreaterEqualOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit GreaterEqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + GreaterEqualOptionsBuilder &operator=(const GreaterEqualOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateGreaterEqualOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + GreaterEqualOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateGreaterEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LessOptionsT : public flatbuffers::NativeTable { + typedef LessOptions TableType; + LessOptionsT() + { + } +}; + +struct LessOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LessOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + LessOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LessOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LessOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit LessOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LessOptionsBuilder &operator=(const LessOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLessOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + LessOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLessOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LessEqualOptionsT : public flatbuffers::NativeTable { + typedef LessEqualOptions TableType; + LessEqualOptionsT() + { + } +}; + +struct LessEqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LessEqualOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + LessEqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LessEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LessEqualOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit LessEqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LessEqualOptionsBuilder &operator=(const LessEqualOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLessEqualOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + LessEqualOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLessEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct NegOptionsT : public flatbuffers::NativeTable { + typedef NegOptions TableType; + NegOptionsT() + { + } +}; + +struct NegOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef NegOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + NegOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(NegOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct NegOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit NegOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + NegOptionsBuilder &operator=(const NegOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateNegOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + NegOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateNegOptions(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SelectOptionsT : public flatbuffers::NativeTable { + typedef SelectOptions TableType; + SelectOptionsT() + { + } +}; + +struct SelectOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SelectOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SelectOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SelectOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SelectOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SelectOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SelectOptionsBuilder &operator=(const SelectOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSelectOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SelectOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSelectOptions(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SliceOptionsT : public flatbuffers::NativeTable { + typedef SliceOptions TableType; + SliceOptionsT() + { + } +}; + +struct SliceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SliceOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SliceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SliceOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SliceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SliceOptionsBuilder &operator=(const SliceOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSliceOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SliceOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct TransposeConvOptionsT : public flatbuffers::NativeTable { + typedef TransposeConvOptions TableType; + tflite::Padding padding; + int32_t stride_w; + int32_t stride_h; + TransposeConvOptionsT() + : padding(tflite::Padding_SAME), + stride_w(0), + stride_h(0) + { + } +}; + +struct TransposeConvOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TransposeConvOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_PADDING = 4, + VT_STRIDE_W = 6, + VT_STRIDE_H = 8 + }; + tflite::Padding padding() const + { + return static_cast(GetField(VT_PADDING, 0)); + } + int32_t stride_w() const + { + return GetField(VT_STRIDE_W, 0); + } + int32_t stride_h() const + { + return GetField(VT_STRIDE_H, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_PADDING) && + VerifyField(verifier, VT_STRIDE_W) && + VerifyField(verifier, VT_STRIDE_H) && + verifier.EndTable(); + } + TransposeConvOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(TransposeConvOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct TransposeConvOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_padding(tflite::Padding padding) + { + fbb_.AddElement(TransposeConvOptions::VT_PADDING, static_cast(padding), 0); + } + void add_stride_w(int32_t stride_w) + { + fbb_.AddElement(TransposeConvOptions::VT_STRIDE_W, stride_w, 0); + } + void add_stride_h(int32_t stride_h) + { + fbb_.AddElement(TransposeConvOptions::VT_STRIDE_H, stride_h, 0); + } + explicit TransposeConvOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + TransposeConvOptionsBuilder &operator=(const TransposeConvOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateTransposeConvOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::Padding padding = tflite::Padding_SAME, + int32_t stride_w = 0, + int32_t stride_h = 0) +{ + TransposeConvOptionsBuilder builder_(_fbb); + builder_.add_stride_h(stride_h); + builder_.add_stride_w(stride_w); + builder_.add_padding(padding); + return builder_.Finish(); +} + +flatbuffers::Offset CreateTransposeConvOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ExpandDimsOptionsT : public flatbuffers::NativeTable { + typedef ExpandDimsOptions TableType; + ExpandDimsOptionsT() + { + } +}; + +struct ExpandDimsOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ExpandDimsOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + ExpandDimsOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ExpandDimsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ExpandDimsOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit ExpandDimsOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ExpandDimsOptionsBuilder &operator=(const ExpandDimsOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateExpandDimsOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + ExpandDimsOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateExpandDimsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SparseToDenseOptionsT : public flatbuffers::NativeTable { + typedef SparseToDenseOptions TableType; + bool validate_indices; + SparseToDenseOptionsT() + : validate_indices(false) + { + } +}; + +struct SparseToDenseOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SparseToDenseOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VALIDATE_INDICES = 4 + }; + bool validate_indices() const + { + return GetField(VT_VALIDATE_INDICES, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_VALIDATE_INDICES) && + verifier.EndTable(); + } + SparseToDenseOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SparseToDenseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SparseToDenseOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_validate_indices(bool validate_indices) + { + fbb_.AddElement(SparseToDenseOptions::VT_VALIDATE_INDICES, static_cast(validate_indices), 0); + } + explicit SparseToDenseOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SparseToDenseOptionsBuilder &operator=(const SparseToDenseOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSparseToDenseOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool validate_indices = false) +{ + SparseToDenseOptionsBuilder builder_(_fbb); + builder_.add_validate_indices(validate_indices); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSparseToDenseOptions(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct EqualOptionsT : public flatbuffers::NativeTable { + typedef EqualOptions TableType; + EqualOptionsT() + { + } +}; + +struct EqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef EqualOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + EqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(EqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct EqualOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit EqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + EqualOptionsBuilder &operator=(const EqualOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateEqualOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + EqualOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct NotEqualOptionsT : public flatbuffers::NativeTable { + typedef NotEqualOptions TableType; + NotEqualOptionsT() + { + } +}; + +struct NotEqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef NotEqualOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + NotEqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(NotEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct NotEqualOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit NotEqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + NotEqualOptionsBuilder &operator=(const NotEqualOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateNotEqualOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + NotEqualOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateNotEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ShapeOptionsT : public flatbuffers::NativeTable { + typedef ShapeOptions TableType; + tflite::TensorType out_type; + ShapeOptionsT() + : out_type(tflite::TensorType_FLOAT32) + { + } +}; + +struct ShapeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ShapeOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_OUT_TYPE = 4 + }; + tflite::TensorType out_type() const + { + return static_cast(GetField(VT_OUT_TYPE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_OUT_TYPE) && + verifier.EndTable(); + } + ShapeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ShapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ShapeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_out_type(tflite::TensorType out_type) + { + fbb_.AddElement(ShapeOptions::VT_OUT_TYPE, static_cast(out_type), 0); + } + explicit ShapeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ShapeOptionsBuilder &operator=(const ShapeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateShapeOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::TensorType out_type = tflite::TensorType_FLOAT32) +{ + ShapeOptionsBuilder builder_(_fbb); + builder_.add_out_type(out_type); + return builder_.Finish(); +} + +flatbuffers::Offset CreateShapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct RankOptionsT : public flatbuffers::NativeTable { + typedef RankOptions TableType; + RankOptionsT() + { + } +}; + +struct RankOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef RankOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + RankOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(RankOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct RankOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit RankOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + RankOptionsBuilder &operator=(const RankOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateRankOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + RankOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateRankOptions(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct PowOptionsT : public flatbuffers::NativeTable { + typedef PowOptions TableType; + PowOptionsT() + { + } +}; + +struct PowOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef PowOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + PowOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(PowOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct PowOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit PowOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + PowOptionsBuilder &operator=(const PowOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreatePowOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + PowOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreatePowOptions(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct FakeQuantOptionsT : public flatbuffers::NativeTable { + typedef FakeQuantOptions TableType; + float min; + float max; + int32_t num_bits; + bool narrow_range; + FakeQuantOptionsT() + : min(0.0f), + max(0.0f), + num_bits(0), + narrow_range(false) + { + } +}; + +struct FakeQuantOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FakeQuantOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_MIN = 4, + VT_MAX = 6, + VT_NUM_BITS = 8, + VT_NARROW_RANGE = 10 + }; + float min() const + { + return GetField(VT_MIN, 0.0f); + } + float max() const + { + return GetField(VT_MAX, 0.0f); + } + int32_t num_bits() const + { + return GetField(VT_NUM_BITS, 0); + } + bool narrow_range() const + { + return GetField(VT_NARROW_RANGE, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_MIN) && + VerifyField(verifier, VT_MAX) && + VerifyField(verifier, VT_NUM_BITS) && + VerifyField(verifier, VT_NARROW_RANGE) && + verifier.EndTable(); + } + FakeQuantOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(FakeQuantOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct FakeQuantOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_min(float min) + { + fbb_.AddElement(FakeQuantOptions::VT_MIN, min, 0.0f); + } + void add_max(float max) + { + fbb_.AddElement(FakeQuantOptions::VT_MAX, max, 0.0f); + } + void add_num_bits(int32_t num_bits) + { + fbb_.AddElement(FakeQuantOptions::VT_NUM_BITS, num_bits, 0); + } + void add_narrow_range(bool narrow_range) + { + fbb_.AddElement(FakeQuantOptions::VT_NARROW_RANGE, static_cast(narrow_range), 0); + } + explicit FakeQuantOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + FakeQuantOptionsBuilder &operator=(const FakeQuantOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFakeQuantOptions( + flatbuffers::FlatBufferBuilder &_fbb, + float min = 0.0f, + float max = 0.0f, + int32_t num_bits = 0, + bool narrow_range = false) +{ + FakeQuantOptionsBuilder builder_(_fbb); + builder_.add_num_bits(num_bits); + builder_.add_max(max); + builder_.add_min(min); + builder_.add_narrow_range(narrow_range); + return builder_.Finish(); +} + +flatbuffers::Offset CreateFakeQuantOptions(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct PackOptionsT : public flatbuffers::NativeTable { + typedef PackOptions TableType; + int32_t values_count; + int32_t axis; + PackOptionsT() + : values_count(0), + axis(0) + { + } +}; + +struct PackOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef PackOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VALUES_COUNT = 4, + VT_AXIS = 6 + }; + int32_t values_count() const + { + return GetField(VT_VALUES_COUNT, 0); + } + int32_t axis() const + { + return GetField(VT_AXIS, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_VALUES_COUNT) && + VerifyField(verifier, VT_AXIS) && + verifier.EndTable(); + } + PackOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(PackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct PackOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_values_count(int32_t values_count) + { + fbb_.AddElement(PackOptions::VT_VALUES_COUNT, values_count, 0); + } + void add_axis(int32_t axis) + { + fbb_.AddElement(PackOptions::VT_AXIS, axis, 0); + } + explicit PackOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + PackOptionsBuilder &operator=(const PackOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreatePackOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t values_count = 0, + int32_t axis = 0) +{ + PackOptionsBuilder builder_(_fbb); + builder_.add_axis(axis); + builder_.add_values_count(values_count); + return builder_.Finish(); +} + +flatbuffers::Offset CreatePackOptions(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LogicalOrOptionsT : public flatbuffers::NativeTable { + typedef LogicalOrOptions TableType; + LogicalOrOptionsT() + { + } +}; + +struct LogicalOrOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LogicalOrOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + LogicalOrOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LogicalOrOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LogicalOrOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit LogicalOrOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LogicalOrOptionsBuilder &operator=(const LogicalOrOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLogicalOrOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + LogicalOrOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLogicalOrOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct OneHotOptionsT : public flatbuffers::NativeTable { + typedef OneHotOptions TableType; + int32_t axis; + OneHotOptionsT() + : axis(0) + { + } +}; + +struct OneHotOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef OneHotOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_AXIS = 4 + }; + int32_t axis() const + { + return GetField(VT_AXIS, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_AXIS) && + verifier.EndTable(); + } + OneHotOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(OneHotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct OneHotOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_axis(int32_t axis) + { + fbb_.AddElement(OneHotOptions::VT_AXIS, axis, 0); + } + explicit OneHotOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + OneHotOptionsBuilder &operator=(const OneHotOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateOneHotOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t axis = 0) +{ + OneHotOptionsBuilder builder_(_fbb); + builder_.add_axis(axis); + return builder_.Finish(); +} + +flatbuffers::Offset CreateOneHotOptions(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct AbsOptionsT : public flatbuffers::NativeTable { + typedef AbsOptions TableType; + AbsOptionsT() + { + } +}; + +struct AbsOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef AbsOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + AbsOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(AbsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct AbsOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit AbsOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + AbsOptionsBuilder &operator=(const AbsOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateAbsOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + AbsOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateAbsOptions(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct HardSwishOptionsT : public flatbuffers::NativeTable { + typedef HardSwishOptions TableType; + HardSwishOptionsT() + { + } +}; + +struct HardSwishOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef HardSwishOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + HardSwishOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(HardSwishOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct HardSwishOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit HardSwishOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + HardSwishOptionsBuilder &operator=(const HardSwishOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateHardSwishOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + HardSwishOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateHardSwishOptions(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LogicalAndOptionsT : public flatbuffers::NativeTable { + typedef LogicalAndOptions TableType; + LogicalAndOptionsT() + { + } +}; + +struct LogicalAndOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LogicalAndOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + LogicalAndOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LogicalAndOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LogicalAndOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit LogicalAndOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LogicalAndOptionsBuilder &operator=(const LogicalAndOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLogicalAndOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + LogicalAndOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLogicalAndOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LogicalNotOptionsT : public flatbuffers::NativeTable { + typedef LogicalNotOptions TableType; + LogicalNotOptionsT() + { + } +}; + +struct LogicalNotOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LogicalNotOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + LogicalNotOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LogicalNotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LogicalNotOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit LogicalNotOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LogicalNotOptionsBuilder &operator=(const LogicalNotOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLogicalNotOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + LogicalNotOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLogicalNotOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct UnpackOptionsT : public flatbuffers::NativeTable { + typedef UnpackOptions TableType; + int32_t num; + int32_t axis; + UnpackOptionsT() + : num(0), + axis(0) + { + } +}; + +struct UnpackOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef UnpackOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NUM = 4, + VT_AXIS = 6 + }; + int32_t num() const + { + return GetField(VT_NUM, 0); + } + int32_t axis() const + { + return GetField(VT_AXIS, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_NUM) && + VerifyField(verifier, VT_AXIS) && + verifier.EndTable(); + } + UnpackOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(UnpackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct UnpackOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_num(int32_t num) + { + fbb_.AddElement(UnpackOptions::VT_NUM, num, 0); + } + void add_axis(int32_t axis) + { + fbb_.AddElement(UnpackOptions::VT_AXIS, axis, 0); + } + explicit UnpackOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + UnpackOptionsBuilder &operator=(const UnpackOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateUnpackOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t num = 0, + int32_t axis = 0) +{ + UnpackOptionsBuilder builder_(_fbb); + builder_.add_axis(axis); + builder_.add_num(num); + return builder_.Finish(); +} + +flatbuffers::Offset CreateUnpackOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct FloorDivOptionsT : public flatbuffers::NativeTable { + typedef FloorDivOptions TableType; + FloorDivOptionsT() + { + } +}; + +struct FloorDivOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FloorDivOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + FloorDivOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(FloorDivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct FloorDivOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit FloorDivOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + FloorDivOptionsBuilder &operator=(const FloorDivOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFloorDivOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + FloorDivOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateFloorDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SquareOptionsT : public flatbuffers::NativeTable { + typedef SquareOptions TableType; + SquareOptionsT() + { + } +}; + +struct SquareOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SquareOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SquareOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SquareOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SquareOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SquareOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SquareOptionsBuilder &operator=(const SquareOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSquareOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SquareOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSquareOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ZerosLikeOptionsT : public flatbuffers::NativeTable { + typedef ZerosLikeOptions TableType; + ZerosLikeOptionsT() + { + } +}; + +struct ZerosLikeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ZerosLikeOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + ZerosLikeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ZerosLikeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ZerosLikeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit ZerosLikeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ZerosLikeOptionsBuilder &operator=(const ZerosLikeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateZerosLikeOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + ZerosLikeOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateZerosLikeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct FillOptionsT : public flatbuffers::NativeTable { + typedef FillOptions TableType; + FillOptionsT() + { + } +}; + +struct FillOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FillOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + FillOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(FillOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct FillOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit FillOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + FillOptionsBuilder &operator=(const FillOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFillOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + FillOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateFillOptions(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct FloorModOptionsT : public flatbuffers::NativeTable { + typedef FloorModOptions TableType; + FloorModOptionsT() + { + } +}; + +struct FloorModOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef FloorModOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + FloorModOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(FloorModOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct FloorModOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit FloorModOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + FloorModOptionsBuilder &operator=(const FloorModOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateFloorModOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + FloorModOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateFloorModOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct RangeOptionsT : public flatbuffers::NativeTable { + typedef RangeOptions TableType; + RangeOptionsT() + { + } +}; + +struct RangeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef RangeOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + RangeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(RangeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct RangeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit RangeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + RangeOptionsBuilder &operator=(const RangeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateRangeOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + RangeOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateRangeOptions(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct LeakyReluOptionsT : public flatbuffers::NativeTable { + typedef LeakyReluOptions TableType; + float alpha; + LeakyReluOptionsT() + : alpha(0.0f) + { + } +}; + +struct LeakyReluOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef LeakyReluOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ALPHA = 4 + }; + float alpha() const + { + return GetField(VT_ALPHA, 0.0f); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ALPHA) && + verifier.EndTable(); + } + LeakyReluOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(LeakyReluOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct LeakyReluOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_alpha(float alpha) + { + fbb_.AddElement(LeakyReluOptions::VT_ALPHA, alpha, 0.0f); + } + explicit LeakyReluOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + LeakyReluOptionsBuilder &operator=(const LeakyReluOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateLeakyReluOptions( + flatbuffers::FlatBufferBuilder &_fbb, + float alpha = 0.0f) +{ + LeakyReluOptionsBuilder builder_(_fbb); + builder_.add_alpha(alpha); + return builder_.Finish(); +} + +flatbuffers::Offset CreateLeakyReluOptions(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SquaredDifferenceOptionsT : public flatbuffers::NativeTable { + typedef SquaredDifferenceOptions TableType; + SquaredDifferenceOptionsT() + { + } +}; + +struct SquaredDifferenceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SquaredDifferenceOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SquaredDifferenceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SquaredDifferenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SquaredDifferenceOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SquaredDifferenceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SquaredDifferenceOptionsBuilder &operator=(const SquaredDifferenceOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSquaredDifferenceOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SquaredDifferenceOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSquaredDifferenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct MirrorPadOptionsT : public flatbuffers::NativeTable { + typedef MirrorPadOptions TableType; + tflite::MirrorPadMode mode; + MirrorPadOptionsT() + : mode(tflite::MirrorPadMode_REFLECT) + { + } +}; + +struct MirrorPadOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef MirrorPadOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_MODE = 4 + }; + tflite::MirrorPadMode mode() const + { + return static_cast(GetField(VT_MODE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_MODE) && + verifier.EndTable(); + } + MirrorPadOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(MirrorPadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct MirrorPadOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_mode(tflite::MirrorPadMode mode) + { + fbb_.AddElement(MirrorPadOptions::VT_MODE, static_cast(mode), 0); + } + explicit MirrorPadOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + MirrorPadOptionsBuilder &operator=(const MirrorPadOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateMirrorPadOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::MirrorPadMode mode = tflite::MirrorPadMode_REFLECT) +{ + MirrorPadOptionsBuilder builder_(_fbb); + builder_.add_mode(mode); + return builder_.Finish(); +} + +flatbuffers::Offset CreateMirrorPadOptions(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct UniqueOptionsT : public flatbuffers::NativeTable { + typedef UniqueOptions TableType; + tflite::TensorType idx_out_type; + UniqueOptionsT() + : idx_out_type(tflite::TensorType_INT32) + { + } +}; + +struct UniqueOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef UniqueOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_IDX_OUT_TYPE = 4 + }; + tflite::TensorType idx_out_type() const + { + return static_cast(GetField(VT_IDX_OUT_TYPE, 2)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_IDX_OUT_TYPE) && + verifier.EndTable(); + } + UniqueOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(UniqueOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct UniqueOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_idx_out_type(tflite::TensorType idx_out_type) + { + fbb_.AddElement(UniqueOptions::VT_IDX_OUT_TYPE, static_cast(idx_out_type), 2); + } + explicit UniqueOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + UniqueOptionsBuilder &operator=(const UniqueOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateUniqueOptions( + flatbuffers::FlatBufferBuilder &_fbb, + tflite::TensorType idx_out_type = tflite::TensorType_INT32) +{ + UniqueOptionsBuilder builder_(_fbb); + builder_.add_idx_out_type(idx_out_type); + return builder_.Finish(); +} + +flatbuffers::Offset CreateUniqueOptions(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ReverseV2OptionsT : public flatbuffers::NativeTable { + typedef ReverseV2Options TableType; + ReverseV2OptionsT() + { + } +}; + +struct ReverseV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ReverseV2OptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + ReverseV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ReverseV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ReverseV2OptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit ReverseV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ReverseV2OptionsBuilder &operator=(const ReverseV2OptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateReverseV2Options( + flatbuffers::FlatBufferBuilder &_fbb) +{ + ReverseV2OptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateReverseV2Options(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct AddNOptionsT : public flatbuffers::NativeTable { + typedef AddNOptions TableType; + AddNOptionsT() + { + } +}; + +struct AddNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef AddNOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + AddNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(AddNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct AddNOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit AddNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + AddNOptionsBuilder &operator=(const AddNOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateAddNOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + AddNOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateAddNOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct GatherNdOptionsT : public flatbuffers::NativeTable { + typedef GatherNdOptions TableType; + GatherNdOptionsT() + { + } +}; + +struct GatherNdOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef GatherNdOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + GatherNdOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(GatherNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct GatherNdOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit GatherNdOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + GatherNdOptionsBuilder &operator=(const GatherNdOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateGatherNdOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + GatherNdOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateGatherNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct WhereOptionsT : public flatbuffers::NativeTable { + typedef WhereOptions TableType; + WhereOptionsT() + { + } +}; + +struct WhereOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef WhereOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + WhereOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(WhereOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct WhereOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit WhereOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + WhereOptionsBuilder &operator=(const WhereOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateWhereOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + WhereOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateWhereOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ReverseSequenceOptionsT : public flatbuffers::NativeTable { + typedef ReverseSequenceOptions TableType; + int32_t seq_dim; + int32_t batch_dim; + ReverseSequenceOptionsT() + : seq_dim(0), + batch_dim(0) + { + } +}; + +struct ReverseSequenceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ReverseSequenceOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_SEQ_DIM = 4, + VT_BATCH_DIM = 6 + }; + int32_t seq_dim() const + { + return GetField(VT_SEQ_DIM, 0); + } + int32_t batch_dim() const + { + return GetField(VT_BATCH_DIM, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_SEQ_DIM) && + VerifyField(verifier, VT_BATCH_DIM) && + verifier.EndTable(); + } + ReverseSequenceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ReverseSequenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ReverseSequenceOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_seq_dim(int32_t seq_dim) + { + fbb_.AddElement(ReverseSequenceOptions::VT_SEQ_DIM, seq_dim, 0); + } + void add_batch_dim(int32_t batch_dim) + { + fbb_.AddElement(ReverseSequenceOptions::VT_BATCH_DIM, batch_dim, 0); + } + explicit ReverseSequenceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ReverseSequenceOptionsBuilder &operator=(const ReverseSequenceOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateReverseSequenceOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t seq_dim = 0, + int32_t batch_dim = 0) +{ + ReverseSequenceOptionsBuilder builder_(_fbb); + builder_.add_batch_dim(batch_dim); + builder_.add_seq_dim(seq_dim); + return builder_.Finish(); +} + +flatbuffers::Offset CreateReverseSequenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct MatrixDiagOptionsT : public flatbuffers::NativeTable { + typedef MatrixDiagOptions TableType; + MatrixDiagOptionsT() + { + } +}; + +struct MatrixDiagOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef MatrixDiagOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + MatrixDiagOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(MatrixDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct MatrixDiagOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit MatrixDiagOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + MatrixDiagOptionsBuilder &operator=(const MatrixDiagOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateMatrixDiagOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + MatrixDiagOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateMatrixDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct QuantizeOptionsT : public flatbuffers::NativeTable { + typedef QuantizeOptions TableType; + QuantizeOptionsT() + { + } +}; + +struct QuantizeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef QuantizeOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + QuantizeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(QuantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct QuantizeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit QuantizeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + QuantizeOptionsBuilder &operator=(const QuantizeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateQuantizeOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + QuantizeOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateQuantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct MatrixSetDiagOptionsT : public flatbuffers::NativeTable { + typedef MatrixSetDiagOptions TableType; + MatrixSetDiagOptionsT() + { + } +}; + +struct MatrixSetDiagOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef MatrixSetDiagOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + MatrixSetDiagOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(MatrixSetDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct MatrixSetDiagOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit MatrixSetDiagOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + MatrixSetDiagOptionsBuilder &operator=(const MatrixSetDiagOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateMatrixSetDiagOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + MatrixSetDiagOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateMatrixSetDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct IfOptionsT : public flatbuffers::NativeTable { + typedef IfOptions TableType; + int32_t then_subgraph_index; + int32_t else_subgraph_index; + IfOptionsT() + : then_subgraph_index(0), + else_subgraph_index(0) + { + } +}; + +struct IfOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef IfOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_THEN_SUBGRAPH_INDEX = 4, + VT_ELSE_SUBGRAPH_INDEX = 6 + }; + int32_t then_subgraph_index() const + { + return GetField(VT_THEN_SUBGRAPH_INDEX, 0); + } + int32_t else_subgraph_index() const + { + return GetField(VT_ELSE_SUBGRAPH_INDEX, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_THEN_SUBGRAPH_INDEX) && + VerifyField(verifier, VT_ELSE_SUBGRAPH_INDEX) && + verifier.EndTable(); + } + IfOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(IfOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct IfOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_then_subgraph_index(int32_t then_subgraph_index) + { + fbb_.AddElement(IfOptions::VT_THEN_SUBGRAPH_INDEX, then_subgraph_index, 0); + } + void add_else_subgraph_index(int32_t else_subgraph_index) + { + fbb_.AddElement(IfOptions::VT_ELSE_SUBGRAPH_INDEX, else_subgraph_index, 0); + } + explicit IfOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + IfOptionsBuilder &operator=(const IfOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateIfOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t then_subgraph_index = 0, + int32_t else_subgraph_index = 0) +{ + IfOptionsBuilder builder_(_fbb); + builder_.add_else_subgraph_index(else_subgraph_index); + builder_.add_then_subgraph_index(then_subgraph_index); + return builder_.Finish(); +} + +flatbuffers::Offset CreateIfOptions(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct CallOnceOptionsT : public flatbuffers::NativeTable { + typedef CallOnceOptions TableType; + int32_t init_subgraph_index; + CallOnceOptionsT() + : init_subgraph_index(0) + { + } +}; + +struct CallOnceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef CallOnceOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_INIT_SUBGRAPH_INDEX = 4 + }; + int32_t init_subgraph_index() const + { + return GetField(VT_INIT_SUBGRAPH_INDEX, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_INIT_SUBGRAPH_INDEX) && + verifier.EndTable(); + } + CallOnceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(CallOnceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CallOnceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct CallOnceOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_init_subgraph_index(int32_t init_subgraph_index) + { + fbb_.AddElement(CallOnceOptions::VT_INIT_SUBGRAPH_INDEX, init_subgraph_index, 0); + } + explicit CallOnceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + CallOnceOptionsBuilder &operator=(const CallOnceOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateCallOnceOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t init_subgraph_index = 0) +{ + CallOnceOptionsBuilder builder_(_fbb); + builder_.add_init_subgraph_index(init_subgraph_index); + return builder_.Finish(); +} + +flatbuffers::Offset CreateCallOnceOptions(flatbuffers::FlatBufferBuilder &_fbb, const CallOnceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct WhileOptionsT : public flatbuffers::NativeTable { + typedef WhileOptions TableType; + int32_t cond_subgraph_index; + int32_t body_subgraph_index; + WhileOptionsT() + : cond_subgraph_index(0), + body_subgraph_index(0) + { + } +}; + +struct WhileOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef WhileOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_COND_SUBGRAPH_INDEX = 4, + VT_BODY_SUBGRAPH_INDEX = 6 + }; + int32_t cond_subgraph_index() const + { + return GetField(VT_COND_SUBGRAPH_INDEX, 0); + } + int32_t body_subgraph_index() const + { + return GetField(VT_BODY_SUBGRAPH_INDEX, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_COND_SUBGRAPH_INDEX) && + VerifyField(verifier, VT_BODY_SUBGRAPH_INDEX) && + verifier.EndTable(); + } + WhileOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(WhileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct WhileOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_cond_subgraph_index(int32_t cond_subgraph_index) + { + fbb_.AddElement(WhileOptions::VT_COND_SUBGRAPH_INDEX, cond_subgraph_index, 0); + } + void add_body_subgraph_index(int32_t body_subgraph_index) + { + fbb_.AddElement(WhileOptions::VT_BODY_SUBGRAPH_INDEX, body_subgraph_index, 0); + } + explicit WhileOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + WhileOptionsBuilder &operator=(const WhileOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateWhileOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t cond_subgraph_index = 0, + int32_t body_subgraph_index = 0) +{ + WhileOptionsBuilder builder_(_fbb); + builder_.add_body_subgraph_index(body_subgraph_index); + builder_.add_cond_subgraph_index(cond_subgraph_index); + return builder_.Finish(); +} + +flatbuffers::Offset CreateWhileOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct NonMaxSuppressionV4OptionsT : public flatbuffers::NativeTable { + typedef NonMaxSuppressionV4Options TableType; + NonMaxSuppressionV4OptionsT() + { + } +}; + +struct NonMaxSuppressionV4Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef NonMaxSuppressionV4OptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + NonMaxSuppressionV4OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(NonMaxSuppressionV4OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct NonMaxSuppressionV4OptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit NonMaxSuppressionV4OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + NonMaxSuppressionV4OptionsBuilder &operator=(const NonMaxSuppressionV4OptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateNonMaxSuppressionV4Options( + flatbuffers::FlatBufferBuilder &_fbb) +{ + NonMaxSuppressionV4OptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateNonMaxSuppressionV4Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct NonMaxSuppressionV5OptionsT : public flatbuffers::NativeTable { + typedef NonMaxSuppressionV5Options TableType; + NonMaxSuppressionV5OptionsT() + { + } +}; + +struct NonMaxSuppressionV5Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef NonMaxSuppressionV5OptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + NonMaxSuppressionV5OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(NonMaxSuppressionV5OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct NonMaxSuppressionV5OptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit NonMaxSuppressionV5OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + NonMaxSuppressionV5OptionsBuilder &operator=(const NonMaxSuppressionV5OptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateNonMaxSuppressionV5Options( + flatbuffers::FlatBufferBuilder &_fbb) +{ + NonMaxSuppressionV5OptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateNonMaxSuppressionV5Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ScatterNdOptionsT : public flatbuffers::NativeTable { + typedef ScatterNdOptions TableType; + ScatterNdOptionsT() + { + } +}; + +struct ScatterNdOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ScatterNdOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + ScatterNdOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ScatterNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ScatterNdOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit ScatterNdOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ScatterNdOptionsBuilder &operator=(const ScatterNdOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateScatterNdOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + ScatterNdOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateScatterNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SelectV2OptionsT : public flatbuffers::NativeTable { + typedef SelectV2Options TableType; + SelectV2OptionsT() + { + } +}; + +struct SelectV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SelectV2OptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SelectV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SelectV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SelectV2OptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SelectV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SelectV2OptionsBuilder &operator=(const SelectV2OptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSelectV2Options( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SelectV2OptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSelectV2Options(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct DensifyOptionsT : public flatbuffers::NativeTable { + typedef DensifyOptions TableType; + DensifyOptionsT() + { + } +}; + +struct DensifyOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef DensifyOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + DensifyOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(DensifyOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct DensifyOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit DensifyOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + DensifyOptionsBuilder &operator=(const DensifyOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateDensifyOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + DensifyOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateDensifyOptions(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SegmentSumOptionsT : public flatbuffers::NativeTable { + typedef SegmentSumOptions TableType; + SegmentSumOptionsT() + { + } +}; + +struct SegmentSumOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SegmentSumOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + SegmentSumOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SegmentSumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SegmentSumOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit SegmentSumOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SegmentSumOptionsBuilder &operator=(const SegmentSumOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSegmentSumOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + SegmentSumOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateSegmentSumOptions(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct BatchMatMulOptionsT : public flatbuffers::NativeTable { + typedef BatchMatMulOptions TableType; + bool adj_x; + bool adj_y; + bool asymmetric_quantize_inputs; + BatchMatMulOptionsT() + : adj_x(false), + adj_y(false), + asymmetric_quantize_inputs(false) + { + } +}; + +struct BatchMatMulOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef BatchMatMulOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_ADJ_X = 4, + VT_ADJ_Y = 6, + VT_ASYMMETRIC_QUANTIZE_INPUTS = 8 + }; + bool adj_x() const + { + return GetField(VT_ADJ_X, 0) != 0; + } + bool adj_y() const + { + return GetField(VT_ADJ_Y, 0) != 0; + } + bool asymmetric_quantize_inputs() const + { + return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_ADJ_X) && + VerifyField(verifier, VT_ADJ_Y) && + VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && + verifier.EndTable(); + } + BatchMatMulOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(BatchMatMulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct BatchMatMulOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_adj_x(bool adj_x) + { + fbb_.AddElement(BatchMatMulOptions::VT_ADJ_X, static_cast(adj_x), 0); + } + void add_adj_y(bool adj_y) + { + fbb_.AddElement(BatchMatMulOptions::VT_ADJ_Y, static_cast(adj_y), 0); + } + void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) + { + fbb_.AddElement(BatchMatMulOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); + } + explicit BatchMatMulOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + BatchMatMulOptionsBuilder &operator=(const BatchMatMulOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateBatchMatMulOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool adj_x = false, + bool adj_y = false, + bool asymmetric_quantize_inputs = false) +{ + BatchMatMulOptionsBuilder builder_(_fbb); + builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); + builder_.add_adj_y(adj_y); + builder_.add_adj_x(adj_x); + return builder_.Finish(); +} + +flatbuffers::Offset CreateBatchMatMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct CumsumOptionsT : public flatbuffers::NativeTable { + typedef CumsumOptions TableType; + bool exclusive; + bool reverse; + CumsumOptionsT() + : exclusive(false), + reverse(false) + { + } +}; + +struct CumsumOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef CumsumOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_EXCLUSIVE = 4, + VT_REVERSE = 6 + }; + bool exclusive() const + { + return GetField(VT_EXCLUSIVE, 0) != 0; + } + bool reverse() const + { + return GetField(VT_REVERSE, 0) != 0; + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_EXCLUSIVE) && + VerifyField(verifier, VT_REVERSE) && + verifier.EndTable(); + } + CumsumOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(CumsumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CumsumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct CumsumOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_exclusive(bool exclusive) + { + fbb_.AddElement(CumsumOptions::VT_EXCLUSIVE, static_cast(exclusive), 0); + } + void add_reverse(bool reverse) + { + fbb_.AddElement(CumsumOptions::VT_REVERSE, static_cast(reverse), 0); + } + explicit CumsumOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + CumsumOptionsBuilder &operator=(const CumsumOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateCumsumOptions( + flatbuffers::FlatBufferBuilder &_fbb, + bool exclusive = false, + bool reverse = false) +{ + CumsumOptionsBuilder builder_(_fbb); + builder_.add_reverse(reverse); + builder_.add_exclusive(exclusive); + return builder_.Finish(); +} + +flatbuffers::Offset CreateCumsumOptions(flatbuffers::FlatBufferBuilder &_fbb, const CumsumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct BroadcastToOptionsT : public flatbuffers::NativeTable { + typedef BroadcastToOptions TableType; + BroadcastToOptionsT() + { + } +}; + +struct BroadcastToOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef BroadcastToOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + BroadcastToOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(BroadcastToOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BroadcastToOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct BroadcastToOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit BroadcastToOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + BroadcastToOptionsBuilder &operator=(const BroadcastToOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateBroadcastToOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + BroadcastToOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateBroadcastToOptions(flatbuffers::FlatBufferBuilder &_fbb, const BroadcastToOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct Rfft2dOptionsT : public flatbuffers::NativeTable { + typedef Rfft2dOptions TableType; + Rfft2dOptionsT() + { + } +}; + +struct Rfft2dOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef Rfft2dOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + Rfft2dOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(Rfft2dOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Rfft2dOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct Rfft2dOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit Rfft2dOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + Rfft2dOptionsBuilder &operator=(const Rfft2dOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateRfft2dOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + Rfft2dOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateRfft2dOptions(flatbuffers::FlatBufferBuilder &_fbb, const Rfft2dOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct HashtableOptionsT : public flatbuffers::NativeTable { + typedef HashtableOptions TableType; + int32_t table_id; + tflite::TensorType key_dtype; + tflite::TensorType value_dtype; + HashtableOptionsT() + : table_id(0), + key_dtype(tflite::TensorType_FLOAT32), + value_dtype(tflite::TensorType_FLOAT32) + { + } +}; + +struct HashtableOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef HashtableOptionsT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TABLE_ID = 4, + VT_KEY_DTYPE = 6, + VT_VALUE_DTYPE = 8 + }; + int32_t table_id() const + { + return GetField(VT_TABLE_ID, 0); + } + tflite::TensorType key_dtype() const + { + return static_cast(GetField(VT_KEY_DTYPE, 0)); + } + tflite::TensorType value_dtype() const + { + return static_cast(GetField(VT_VALUE_DTYPE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_TABLE_ID) && + VerifyField(verifier, VT_KEY_DTYPE) && + VerifyField(verifier, VT_VALUE_DTYPE) && + verifier.EndTable(); + } + HashtableOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(HashtableOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct HashtableOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_table_id(int32_t table_id) + { + fbb_.AddElement(HashtableOptions::VT_TABLE_ID, table_id, 0); + } + void add_key_dtype(tflite::TensorType key_dtype) + { + fbb_.AddElement(HashtableOptions::VT_KEY_DTYPE, static_cast(key_dtype), 0); + } + void add_value_dtype(tflite::TensorType value_dtype) + { + fbb_.AddElement(HashtableOptions::VT_VALUE_DTYPE, static_cast(value_dtype), 0); + } + explicit HashtableOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + HashtableOptionsBuilder &operator=(const HashtableOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateHashtableOptions( + flatbuffers::FlatBufferBuilder &_fbb, + int32_t table_id = 0, + tflite::TensorType key_dtype = tflite::TensorType_FLOAT32, + tflite::TensorType value_dtype = tflite::TensorType_FLOAT32) +{ + HashtableOptionsBuilder builder_(_fbb); + builder_.add_table_id(table_id); + builder_.add_value_dtype(value_dtype); + builder_.add_key_dtype(key_dtype); + return builder_.Finish(); +} + +flatbuffers::Offset CreateHashtableOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct HashtableFindOptionsT : public flatbuffers::NativeTable { + typedef HashtableFindOptions TableType; + HashtableFindOptionsT() + { + } +}; + +struct HashtableFindOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef HashtableFindOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + HashtableFindOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(HashtableFindOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableFindOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct HashtableFindOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit HashtableFindOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + HashtableFindOptionsBuilder &operator=(const HashtableFindOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateHashtableFindOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + HashtableFindOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateHashtableFindOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableFindOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct HashtableImportOptionsT : public flatbuffers::NativeTable { + typedef HashtableImportOptions TableType; + HashtableImportOptionsT() + { + } +}; + +struct HashtableImportOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef HashtableImportOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + HashtableImportOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(HashtableImportOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableImportOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct HashtableImportOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit HashtableImportOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + HashtableImportOptionsBuilder &operator=(const HashtableImportOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateHashtableImportOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + HashtableImportOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateHashtableImportOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableImportOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct HashtableSizeOptionsT : public flatbuffers::NativeTable { + typedef HashtableSizeOptions TableType; + HashtableSizeOptionsT() + { + } +}; + +struct HashtableSizeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef HashtableSizeOptionsT NativeTableType; + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + verifier.EndTable(); + } + HashtableSizeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(HashtableSizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableSizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct HashtableSizeOptionsBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + explicit HashtableSizeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + HashtableSizeOptionsBuilder &operator=(const HashtableSizeOptionsBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateHashtableSizeOptions( + flatbuffers::FlatBufferBuilder &_fbb) +{ + HashtableSizeOptionsBuilder builder_(_fbb); + return builder_.Finish(); +} + +flatbuffers::Offset CreateHashtableSizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableSizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct OperatorCodeT : public flatbuffers::NativeTable { + typedef OperatorCode TableType; + int8_t deprecated_builtin_code; + std::string custom_code; + int32_t version; + tflite::BuiltinOperator builtin_code; + OperatorCodeT() + : deprecated_builtin_code(0), + version(1), + builtin_code(tflite::BuiltinOperator_ADD) + { + } +}; + +struct OperatorCode FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef OperatorCodeT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_DEPRECATED_BUILTIN_CODE = 4, + VT_CUSTOM_CODE = 6, + VT_VERSION = 8, + VT_BUILTIN_CODE = 10 + }; + int8_t deprecated_builtin_code() const + { + return GetField(VT_DEPRECATED_BUILTIN_CODE, 0); + } + const flatbuffers::String *custom_code() const + { + return GetPointer(VT_CUSTOM_CODE); + } + int32_t version() const + { + return GetField(VT_VERSION, 1); + } + tflite::BuiltinOperator builtin_code() const + { + return static_cast(GetField(VT_BUILTIN_CODE, 0)); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_DEPRECATED_BUILTIN_CODE) && + VerifyOffset(verifier, VT_CUSTOM_CODE) && + verifier.VerifyString(custom_code()) && + VerifyField(verifier, VT_VERSION) && + VerifyField(verifier, VT_BUILTIN_CODE) && + verifier.EndTable(); + } + OperatorCodeT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(OperatorCodeT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct OperatorCodeBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_deprecated_builtin_code(int8_t deprecated_builtin_code) + { + fbb_.AddElement(OperatorCode::VT_DEPRECATED_BUILTIN_CODE, deprecated_builtin_code, 0); + } + void add_custom_code(flatbuffers::Offset custom_code) + { + fbb_.AddOffset(OperatorCode::VT_CUSTOM_CODE, custom_code); + } + void add_version(int32_t version) + { + fbb_.AddElement(OperatorCode::VT_VERSION, version, 1); + } + void add_builtin_code(tflite::BuiltinOperator builtin_code) + { + fbb_.AddElement(OperatorCode::VT_BUILTIN_CODE, static_cast(builtin_code), 0); + } + explicit OperatorCodeBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + OperatorCodeBuilder &operator=(const OperatorCodeBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateOperatorCode( + flatbuffers::FlatBufferBuilder &_fbb, + int8_t deprecated_builtin_code = 0, + flatbuffers::Offset custom_code = 0, + int32_t version = 1, + tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD) +{ + OperatorCodeBuilder builder_(_fbb); + builder_.add_builtin_code(builtin_code); + builder_.add_version(version); + builder_.add_custom_code(custom_code); + builder_.add_deprecated_builtin_code(deprecated_builtin_code); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateOperatorCodeDirect( + flatbuffers::FlatBufferBuilder &_fbb, + int8_t deprecated_builtin_code = 0, + const char *custom_code = nullptr, + int32_t version = 1, + tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD) +{ + auto custom_code__ = custom_code ? _fbb.CreateString(custom_code) : 0; + return tflite::CreateOperatorCode( + _fbb, + deprecated_builtin_code, + custom_code__, + version, + builtin_code); +} + +flatbuffers::Offset CreateOperatorCode(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct OperatorT : public flatbuffers::NativeTable { + typedef Operator TableType; + uint32_t opcode_index; + std::vector inputs; + std::vector outputs; + tflite::BuiltinOptionsUnion builtin_options; + std::vector custom_options; + tflite::CustomOptionsFormat custom_options_format; + std::vector mutating_variable_inputs; + std::vector intermediates; + OperatorT() + : opcode_index(0), + custom_options_format(tflite::CustomOptionsFormat_FLEXBUFFERS) + { + } +}; + +struct Operator FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef OperatorT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_OPCODE_INDEX = 4, + VT_INPUTS = 6, + VT_OUTPUTS = 8, + VT_BUILTIN_OPTIONS_TYPE = 10, + VT_BUILTIN_OPTIONS = 12, + VT_CUSTOM_OPTIONS = 14, + VT_CUSTOM_OPTIONS_FORMAT = 16, + VT_MUTATING_VARIABLE_INPUTS = 18, + VT_INTERMEDIATES = 20 + }; + uint32_t opcode_index() const + { + return GetField(VT_OPCODE_INDEX, 0); + } + const flatbuffers::Vector *inputs() const + { + return GetPointer *>(VT_INPUTS); + } + const flatbuffers::Vector *outputs() const + { + return GetPointer *>(VT_OUTPUTS); + } + tflite::BuiltinOptions builtin_options_type() const + { + return static_cast(GetField(VT_BUILTIN_OPTIONS_TYPE, 0)); + } + const void *builtin_options() const + { + return GetPointer(VT_BUILTIN_OPTIONS); + } + template + const T *builtin_options_as() const; + const tflite::Conv2DOptions *builtin_options_as_Conv2DOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_Conv2DOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::DepthwiseConv2DOptions *builtin_options_as_DepthwiseConv2DOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_DepthwiseConv2DOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ConcatEmbeddingsOptions *builtin_options_as_ConcatEmbeddingsOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ConcatEmbeddingsOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LSHProjectionOptions *builtin_options_as_LSHProjectionOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LSHProjectionOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::Pool2DOptions *builtin_options_as_Pool2DOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_Pool2DOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SVDFOptions *builtin_options_as_SVDFOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SVDFOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::RNNOptions *builtin_options_as_RNNOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_RNNOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::FullyConnectedOptions *builtin_options_as_FullyConnectedOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_FullyConnectedOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SoftmaxOptions *builtin_options_as_SoftmaxOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SoftmaxOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ConcatenationOptions *builtin_options_as_ConcatenationOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ConcatenationOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::AddOptions *builtin_options_as_AddOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_AddOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::L2NormOptions *builtin_options_as_L2NormOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_L2NormOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LocalResponseNormalizationOptions *builtin_options_as_LocalResponseNormalizationOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LocalResponseNormalizationOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LSTMOptions *builtin_options_as_LSTMOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LSTMOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ResizeBilinearOptions *builtin_options_as_ResizeBilinearOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ResizeBilinearOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::CallOptions *builtin_options_as_CallOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_CallOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ReshapeOptions *builtin_options_as_ReshapeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ReshapeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SkipGramOptions *builtin_options_as_SkipGramOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SkipGramOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SpaceToDepthOptions *builtin_options_as_SpaceToDepthOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SpaceToDepthOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::EmbeddingLookupSparseOptions *builtin_options_as_EmbeddingLookupSparseOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_EmbeddingLookupSparseOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::MulOptions *builtin_options_as_MulOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_MulOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::PadOptions *builtin_options_as_PadOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_PadOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::GatherOptions *builtin_options_as_GatherOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_GatherOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::BatchToSpaceNDOptions *builtin_options_as_BatchToSpaceNDOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_BatchToSpaceNDOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SpaceToBatchNDOptions *builtin_options_as_SpaceToBatchNDOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SpaceToBatchNDOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::TransposeOptions *builtin_options_as_TransposeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_TransposeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ReducerOptions *builtin_options_as_ReducerOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ReducerOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SubOptions *builtin_options_as_SubOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SubOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::DivOptions *builtin_options_as_DivOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_DivOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SqueezeOptions *builtin_options_as_SqueezeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SqueezeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SequenceRNNOptions *builtin_options_as_SequenceRNNOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SequenceRNNOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::StridedSliceOptions *builtin_options_as_StridedSliceOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_StridedSliceOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ExpOptions *builtin_options_as_ExpOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ExpOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::TopKV2Options *builtin_options_as_TopKV2Options() const + { + return builtin_options_type() == tflite::BuiltinOptions_TopKV2Options ? static_cast(builtin_options()) : nullptr; + } + const tflite::SplitOptions *builtin_options_as_SplitOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SplitOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LogSoftmaxOptions *builtin_options_as_LogSoftmaxOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LogSoftmaxOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::CastOptions *builtin_options_as_CastOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_CastOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::DequantizeOptions *builtin_options_as_DequantizeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_DequantizeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::MaximumMinimumOptions *builtin_options_as_MaximumMinimumOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_MaximumMinimumOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ArgMaxOptions *builtin_options_as_ArgMaxOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ArgMaxOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LessOptions *builtin_options_as_LessOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LessOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::NegOptions *builtin_options_as_NegOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_NegOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::PadV2Options *builtin_options_as_PadV2Options() const + { + return builtin_options_type() == tflite::BuiltinOptions_PadV2Options ? static_cast(builtin_options()) : nullptr; + } + const tflite::GreaterOptions *builtin_options_as_GreaterOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_GreaterOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::GreaterEqualOptions *builtin_options_as_GreaterEqualOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_GreaterEqualOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LessEqualOptions *builtin_options_as_LessEqualOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LessEqualOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SelectOptions *builtin_options_as_SelectOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SelectOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SliceOptions *builtin_options_as_SliceOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SliceOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::TransposeConvOptions *builtin_options_as_TransposeConvOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_TransposeConvOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SparseToDenseOptions *builtin_options_as_SparseToDenseOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SparseToDenseOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::TileOptions *builtin_options_as_TileOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_TileOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ExpandDimsOptions *builtin_options_as_ExpandDimsOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ExpandDimsOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::EqualOptions *builtin_options_as_EqualOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_EqualOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::NotEqualOptions *builtin_options_as_NotEqualOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_NotEqualOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ShapeOptions *builtin_options_as_ShapeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ShapeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::PowOptions *builtin_options_as_PowOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_PowOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ArgMinOptions *builtin_options_as_ArgMinOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ArgMinOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::FakeQuantOptions *builtin_options_as_FakeQuantOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_FakeQuantOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::PackOptions *builtin_options_as_PackOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_PackOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LogicalOrOptions *builtin_options_as_LogicalOrOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LogicalOrOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::OneHotOptions *builtin_options_as_OneHotOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_OneHotOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LogicalAndOptions *builtin_options_as_LogicalAndOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LogicalAndOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LogicalNotOptions *builtin_options_as_LogicalNotOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LogicalNotOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::UnpackOptions *builtin_options_as_UnpackOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_UnpackOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::FloorDivOptions *builtin_options_as_FloorDivOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_FloorDivOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SquareOptions *builtin_options_as_SquareOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SquareOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ZerosLikeOptions *builtin_options_as_ZerosLikeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ZerosLikeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::FillOptions *builtin_options_as_FillOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_FillOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::BidirectionalSequenceLSTMOptions *builtin_options_as_BidirectionalSequenceLSTMOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_BidirectionalSequenceLSTMOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::BidirectionalSequenceRNNOptions *builtin_options_as_BidirectionalSequenceRNNOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_BidirectionalSequenceRNNOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::UnidirectionalSequenceLSTMOptions *builtin_options_as_UnidirectionalSequenceLSTMOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_UnidirectionalSequenceLSTMOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::FloorModOptions *builtin_options_as_FloorModOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_FloorModOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::RangeOptions *builtin_options_as_RangeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_RangeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ResizeNearestNeighborOptions *builtin_options_as_ResizeNearestNeighborOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ResizeNearestNeighborOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::LeakyReluOptions *builtin_options_as_LeakyReluOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_LeakyReluOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SquaredDifferenceOptions *builtin_options_as_SquaredDifferenceOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SquaredDifferenceOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::MirrorPadOptions *builtin_options_as_MirrorPadOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_MirrorPadOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::AbsOptions *builtin_options_as_AbsOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_AbsOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SplitVOptions *builtin_options_as_SplitVOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SplitVOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::UniqueOptions *builtin_options_as_UniqueOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_UniqueOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ReverseV2Options *builtin_options_as_ReverseV2Options() const + { + return builtin_options_type() == tflite::BuiltinOptions_ReverseV2Options ? static_cast(builtin_options()) : nullptr; + } + const tflite::AddNOptions *builtin_options_as_AddNOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_AddNOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::GatherNdOptions *builtin_options_as_GatherNdOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_GatherNdOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::CosOptions *builtin_options_as_CosOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_CosOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::WhereOptions *builtin_options_as_WhereOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_WhereOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::RankOptions *builtin_options_as_RankOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_RankOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::ReverseSequenceOptions *builtin_options_as_ReverseSequenceOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ReverseSequenceOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::MatrixDiagOptions *builtin_options_as_MatrixDiagOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_MatrixDiagOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::QuantizeOptions *builtin_options_as_QuantizeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_QuantizeOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::MatrixSetDiagOptions *builtin_options_as_MatrixSetDiagOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_MatrixSetDiagOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::HardSwishOptions *builtin_options_as_HardSwishOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_HardSwishOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::IfOptions *builtin_options_as_IfOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_IfOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::WhileOptions *builtin_options_as_WhileOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_WhileOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::DepthToSpaceOptions *builtin_options_as_DepthToSpaceOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_DepthToSpaceOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::NonMaxSuppressionV4Options *builtin_options_as_NonMaxSuppressionV4Options() const + { + return builtin_options_type() == tflite::BuiltinOptions_NonMaxSuppressionV4Options ? static_cast(builtin_options()) : nullptr; + } + const tflite::NonMaxSuppressionV5Options *builtin_options_as_NonMaxSuppressionV5Options() const + { + return builtin_options_type() == tflite::BuiltinOptions_NonMaxSuppressionV5Options ? static_cast(builtin_options()) : nullptr; + } + const tflite::ScatterNdOptions *builtin_options_as_ScatterNdOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_ScatterNdOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SelectV2Options *builtin_options_as_SelectV2Options() const + { + return builtin_options_type() == tflite::BuiltinOptions_SelectV2Options ? static_cast(builtin_options()) : nullptr; + } + const tflite::DensifyOptions *builtin_options_as_DensifyOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_DensifyOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::SegmentSumOptions *builtin_options_as_SegmentSumOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_SegmentSumOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::BatchMatMulOptions *builtin_options_as_BatchMatMulOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_BatchMatMulOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::CumsumOptions *builtin_options_as_CumsumOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_CumsumOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::CallOnceOptions *builtin_options_as_CallOnceOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_CallOnceOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::BroadcastToOptions *builtin_options_as_BroadcastToOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_BroadcastToOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::Rfft2dOptions *builtin_options_as_Rfft2dOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_Rfft2dOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::Conv3DOptions *builtin_options_as_Conv3DOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_Conv3DOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::HashtableOptions *builtin_options_as_HashtableOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_HashtableOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::HashtableFindOptions *builtin_options_as_HashtableFindOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_HashtableFindOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::HashtableImportOptions *builtin_options_as_HashtableImportOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_HashtableImportOptions ? static_cast(builtin_options()) : nullptr; + } + const tflite::HashtableSizeOptions *builtin_options_as_HashtableSizeOptions() const + { + return builtin_options_type() == tflite::BuiltinOptions_HashtableSizeOptions ? static_cast(builtin_options()) : nullptr; + } + const flatbuffers::Vector *custom_options() const + { + return GetPointer *>(VT_CUSTOM_OPTIONS); + } + tflite::CustomOptionsFormat custom_options_format() const + { + return static_cast(GetField(VT_CUSTOM_OPTIONS_FORMAT, 0)); + } + const flatbuffers::Vector *mutating_variable_inputs() const + { + return GetPointer *>(VT_MUTATING_VARIABLE_INPUTS); + } + const flatbuffers::Vector *intermediates() const + { + return GetPointer *>(VT_INTERMEDIATES); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_OPCODE_INDEX) && + VerifyOffset(verifier, VT_INPUTS) && + verifier.VerifyVector(inputs()) && + VerifyOffset(verifier, VT_OUTPUTS) && + verifier.VerifyVector(outputs()) && + VerifyField(verifier, VT_BUILTIN_OPTIONS_TYPE) && + VerifyOffset(verifier, VT_BUILTIN_OPTIONS) && + VerifyBuiltinOptions(verifier, builtin_options(), builtin_options_type()) && + VerifyOffset(verifier, VT_CUSTOM_OPTIONS) && + verifier.VerifyVector(custom_options()) && + VerifyField(verifier, VT_CUSTOM_OPTIONS_FORMAT) && + VerifyOffset(verifier, VT_MUTATING_VARIABLE_INPUTS) && + verifier.VerifyVector(mutating_variable_inputs()) && + VerifyOffset(verifier, VT_INTERMEDIATES) && + verifier.VerifyVector(intermediates()) && + verifier.EndTable(); + } + OperatorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(OperatorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +template <> +inline const tflite::Conv2DOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_Conv2DOptions(); +} + +template <> +inline const tflite::DepthwiseConv2DOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_DepthwiseConv2DOptions(); +} + +template <> +inline const tflite::ConcatEmbeddingsOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ConcatEmbeddingsOptions(); +} + +template <> +inline const tflite::LSHProjectionOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LSHProjectionOptions(); +} + +template <> +inline const tflite::Pool2DOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_Pool2DOptions(); +} + +template <> +inline const tflite::SVDFOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SVDFOptions(); +} + +template <> +inline const tflite::RNNOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_RNNOptions(); +} + +template <> +inline const tflite::FullyConnectedOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_FullyConnectedOptions(); +} + +template <> +inline const tflite::SoftmaxOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SoftmaxOptions(); +} + +template <> +inline const tflite::ConcatenationOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ConcatenationOptions(); +} + +template <> +inline const tflite::AddOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_AddOptions(); +} + +template <> +inline const tflite::L2NormOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_L2NormOptions(); +} + +template <> +inline const tflite::LocalResponseNormalizationOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LocalResponseNormalizationOptions(); +} + +template <> +inline const tflite::LSTMOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LSTMOptions(); +} + +template <> +inline const tflite::ResizeBilinearOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ResizeBilinearOptions(); +} + +template <> +inline const tflite::CallOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_CallOptions(); +} + +template <> +inline const tflite::ReshapeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ReshapeOptions(); +} + +template <> +inline const tflite::SkipGramOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SkipGramOptions(); +} + +template <> +inline const tflite::SpaceToDepthOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SpaceToDepthOptions(); +} + +template <> +inline const tflite::EmbeddingLookupSparseOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_EmbeddingLookupSparseOptions(); +} + +template <> +inline const tflite::MulOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_MulOptions(); +} + +template <> +inline const tflite::PadOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_PadOptions(); +} + +template <> +inline const tflite::GatherOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_GatherOptions(); +} + +template <> +inline const tflite::BatchToSpaceNDOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_BatchToSpaceNDOptions(); +} + +template <> +inline const tflite::SpaceToBatchNDOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SpaceToBatchNDOptions(); +} + +template <> +inline const tflite::TransposeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_TransposeOptions(); +} + +template <> +inline const tflite::ReducerOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ReducerOptions(); +} + +template <> +inline const tflite::SubOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SubOptions(); +} + +template <> +inline const tflite::DivOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_DivOptions(); +} + +template <> +inline const tflite::SqueezeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SqueezeOptions(); +} + +template <> +inline const tflite::SequenceRNNOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SequenceRNNOptions(); +} + +template <> +inline const tflite::StridedSliceOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_StridedSliceOptions(); +} + +template <> +inline const tflite::ExpOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ExpOptions(); +} + +template <> +inline const tflite::TopKV2Options *Operator::builtin_options_as() const +{ + return builtin_options_as_TopKV2Options(); +} + +template <> +inline const tflite::SplitOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SplitOptions(); +} + +template <> +inline const tflite::LogSoftmaxOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LogSoftmaxOptions(); +} + +template <> +inline const tflite::CastOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_CastOptions(); +} + +template <> +inline const tflite::DequantizeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_DequantizeOptions(); +} + +template <> +inline const tflite::MaximumMinimumOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_MaximumMinimumOptions(); +} + +template <> +inline const tflite::ArgMaxOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ArgMaxOptions(); +} + +template <> +inline const tflite::LessOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LessOptions(); +} + +template <> +inline const tflite::NegOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_NegOptions(); +} + +template <> +inline const tflite::PadV2Options *Operator::builtin_options_as() const +{ + return builtin_options_as_PadV2Options(); +} + +template <> +inline const tflite::GreaterOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_GreaterOptions(); +} + +template <> +inline const tflite::GreaterEqualOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_GreaterEqualOptions(); +} + +template <> +inline const tflite::LessEqualOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LessEqualOptions(); +} + +template <> +inline const tflite::SelectOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SelectOptions(); +} + +template <> +inline const tflite::SliceOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SliceOptions(); +} + +template <> +inline const tflite::TransposeConvOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_TransposeConvOptions(); +} + +template <> +inline const tflite::SparseToDenseOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SparseToDenseOptions(); +} + +template <> +inline const tflite::TileOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_TileOptions(); +} + +template <> +inline const tflite::ExpandDimsOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ExpandDimsOptions(); +} + +template <> +inline const tflite::EqualOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_EqualOptions(); +} + +template <> +inline const tflite::NotEqualOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_NotEqualOptions(); +} + +template <> +inline const tflite::ShapeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ShapeOptions(); +} + +template <> +inline const tflite::PowOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_PowOptions(); +} + +template <> +inline const tflite::ArgMinOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ArgMinOptions(); +} + +template <> +inline const tflite::FakeQuantOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_FakeQuantOptions(); +} + +template <> +inline const tflite::PackOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_PackOptions(); +} + +template <> +inline const tflite::LogicalOrOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LogicalOrOptions(); +} + +template <> +inline const tflite::OneHotOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_OneHotOptions(); +} + +template <> +inline const tflite::LogicalAndOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LogicalAndOptions(); +} + +template <> +inline const tflite::LogicalNotOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LogicalNotOptions(); +} + +template <> +inline const tflite::UnpackOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_UnpackOptions(); +} + +template <> +inline const tflite::FloorDivOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_FloorDivOptions(); +} + +template <> +inline const tflite::SquareOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SquareOptions(); +} + +template <> +inline const tflite::ZerosLikeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ZerosLikeOptions(); +} + +template <> +inline const tflite::FillOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_FillOptions(); +} + +template <> +inline const tflite::BidirectionalSequenceLSTMOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_BidirectionalSequenceLSTMOptions(); +} + +template <> +inline const tflite::BidirectionalSequenceRNNOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_BidirectionalSequenceRNNOptions(); +} + +template <> +inline const tflite::UnidirectionalSequenceLSTMOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_UnidirectionalSequenceLSTMOptions(); +} + +template <> +inline const tflite::FloorModOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_FloorModOptions(); +} + +template <> +inline const tflite::RangeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_RangeOptions(); +} + +template <> +inline const tflite::ResizeNearestNeighborOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ResizeNearestNeighborOptions(); +} + +template <> +inline const tflite::LeakyReluOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_LeakyReluOptions(); +} + +template <> +inline const tflite::SquaredDifferenceOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SquaredDifferenceOptions(); +} + +template <> +inline const tflite::MirrorPadOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_MirrorPadOptions(); +} + +template <> +inline const tflite::AbsOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_AbsOptions(); +} + +template <> +inline const tflite::SplitVOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SplitVOptions(); +} + +template <> +inline const tflite::UniqueOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_UniqueOptions(); +} + +template <> +inline const tflite::ReverseV2Options *Operator::builtin_options_as() const +{ + return builtin_options_as_ReverseV2Options(); +} + +template <> +inline const tflite::AddNOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_AddNOptions(); +} + +template <> +inline const tflite::GatherNdOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_GatherNdOptions(); +} + +template <> +inline const tflite::CosOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_CosOptions(); +} + +template <> +inline const tflite::WhereOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_WhereOptions(); +} + +template <> +inline const tflite::RankOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_RankOptions(); +} + +template <> +inline const tflite::ReverseSequenceOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ReverseSequenceOptions(); +} + +template <> +inline const tflite::MatrixDiagOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_MatrixDiagOptions(); +} + +template <> +inline const tflite::QuantizeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_QuantizeOptions(); +} + +template <> +inline const tflite::MatrixSetDiagOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_MatrixSetDiagOptions(); +} + +template <> +inline const tflite::HardSwishOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_HardSwishOptions(); +} + +template <> +inline const tflite::IfOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_IfOptions(); +} + +template <> +inline const tflite::WhileOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_WhileOptions(); +} + +template <> +inline const tflite::DepthToSpaceOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_DepthToSpaceOptions(); +} + +template <> +inline const tflite::NonMaxSuppressionV4Options *Operator::builtin_options_as() const +{ + return builtin_options_as_NonMaxSuppressionV4Options(); +} + +template <> +inline const tflite::NonMaxSuppressionV5Options *Operator::builtin_options_as() const +{ + return builtin_options_as_NonMaxSuppressionV5Options(); +} + +template <> +inline const tflite::ScatterNdOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_ScatterNdOptions(); +} + +template <> +inline const tflite::SelectV2Options *Operator::builtin_options_as() const +{ + return builtin_options_as_SelectV2Options(); +} + +template <> +inline const tflite::DensifyOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_DensifyOptions(); +} + +template <> +inline const tflite::SegmentSumOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_SegmentSumOptions(); +} + +template <> +inline const tflite::BatchMatMulOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_BatchMatMulOptions(); +} + +template <> +inline const tflite::CumsumOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_CumsumOptions(); +} + +template <> +inline const tflite::CallOnceOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_CallOnceOptions(); +} + +template <> +inline const tflite::BroadcastToOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_BroadcastToOptions(); +} + +template <> +inline const tflite::Rfft2dOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_Rfft2dOptions(); +} + +template <> +inline const tflite::Conv3DOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_Conv3DOptions(); +} + +template <> +inline const tflite::HashtableOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_HashtableOptions(); +} + +template <> +inline const tflite::HashtableFindOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_HashtableFindOptions(); +} + +template <> +inline const tflite::HashtableImportOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_HashtableImportOptions(); +} + +template <> +inline const tflite::HashtableSizeOptions *Operator::builtin_options_as() const +{ + return builtin_options_as_HashtableSizeOptions(); +} + +struct OperatorBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_opcode_index(uint32_t opcode_index) + { + fbb_.AddElement(Operator::VT_OPCODE_INDEX, opcode_index, 0); + } + void add_inputs(flatbuffers::Offset > inputs) + { + fbb_.AddOffset(Operator::VT_INPUTS, inputs); + } + void add_outputs(flatbuffers::Offset > outputs) + { + fbb_.AddOffset(Operator::VT_OUTPUTS, outputs); + } + void add_builtin_options_type(tflite::BuiltinOptions builtin_options_type) + { + fbb_.AddElement(Operator::VT_BUILTIN_OPTIONS_TYPE, static_cast(builtin_options_type), 0); + } + void add_builtin_options(flatbuffers::Offset builtin_options) + { + fbb_.AddOffset(Operator::VT_BUILTIN_OPTIONS, builtin_options); + } + void add_custom_options(flatbuffers::Offset > custom_options) + { + fbb_.AddOffset(Operator::VT_CUSTOM_OPTIONS, custom_options); + } + void add_custom_options_format(tflite::CustomOptionsFormat custom_options_format) + { + fbb_.AddElement(Operator::VT_CUSTOM_OPTIONS_FORMAT, static_cast(custom_options_format), 0); + } + void add_mutating_variable_inputs(flatbuffers::Offset > mutating_variable_inputs) + { + fbb_.AddOffset(Operator::VT_MUTATING_VARIABLE_INPUTS, mutating_variable_inputs); + } + void add_intermediates(flatbuffers::Offset > intermediates) + { + fbb_.AddOffset(Operator::VT_INTERMEDIATES, intermediates); + } + explicit OperatorBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + OperatorBuilder &operator=(const OperatorBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateOperator( + flatbuffers::FlatBufferBuilder &_fbb, + uint32_t opcode_index = 0, + flatbuffers::Offset > inputs = 0, + flatbuffers::Offset > outputs = 0, + tflite::BuiltinOptions builtin_options_type = tflite::BuiltinOptions_NONE, + flatbuffers::Offset builtin_options = 0, + flatbuffers::Offset > custom_options = 0, + tflite::CustomOptionsFormat custom_options_format = tflite::CustomOptionsFormat_FLEXBUFFERS, + flatbuffers::Offset > mutating_variable_inputs = 0, + flatbuffers::Offset > intermediates = 0) +{ + OperatorBuilder builder_(_fbb); + builder_.add_intermediates(intermediates); + builder_.add_mutating_variable_inputs(mutating_variable_inputs); + builder_.add_custom_options(custom_options); + builder_.add_builtin_options(builtin_options); + builder_.add_outputs(outputs); + builder_.add_inputs(inputs); + builder_.add_opcode_index(opcode_index); + builder_.add_custom_options_format(custom_options_format); + builder_.add_builtin_options_type(builtin_options_type); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateOperatorDirect( + flatbuffers::FlatBufferBuilder &_fbb, + uint32_t opcode_index = 0, + const std::vector *inputs = nullptr, + const std::vector *outputs = nullptr, + tflite::BuiltinOptions builtin_options_type = tflite::BuiltinOptions_NONE, + flatbuffers::Offset builtin_options = 0, + const std::vector *custom_options = nullptr, + tflite::CustomOptionsFormat custom_options_format = tflite::CustomOptionsFormat_FLEXBUFFERS, + const std::vector *mutating_variable_inputs = nullptr, + const std::vector *intermediates = nullptr) +{ + auto inputs__ = inputs ? _fbb.CreateVector(*inputs) : 0; + auto outputs__ = outputs ? _fbb.CreateVector(*outputs) : 0; + auto custom_options__ = custom_options ? _fbb.CreateVector(*custom_options) : 0; + auto mutating_variable_inputs__ = mutating_variable_inputs ? _fbb.CreateVector(*mutating_variable_inputs) : 0; + auto intermediates__ = intermediates ? _fbb.CreateVector(*intermediates) : 0; + return tflite::CreateOperator( + _fbb, + opcode_index, + inputs__, + outputs__, + builtin_options_type, + builtin_options, + custom_options__, + custom_options_format, + mutating_variable_inputs__, + intermediates__); +} + +flatbuffers::Offset CreateOperator(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SubGraphT : public flatbuffers::NativeTable { + typedef SubGraph TableType; + std::vector > tensors; + std::vector inputs; + std::vector outputs; + std::vector > operators; + std::string name; + SubGraphT() + { + } +}; + +struct SubGraph FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SubGraphT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_TENSORS = 4, + VT_INPUTS = 6, + VT_OUTPUTS = 8, + VT_OPERATORS = 10, + VT_NAME = 12 + }; + const flatbuffers::Vector > *tensors() const + { + return GetPointer > *>(VT_TENSORS); + } + const flatbuffers::Vector *inputs() const + { + return GetPointer *>(VT_INPUTS); + } + const flatbuffers::Vector *outputs() const + { + return GetPointer *>(VT_OUTPUTS); + } + const flatbuffers::Vector > *operators() const + { + return GetPointer > *>(VT_OPERATORS); + } + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_TENSORS) && + verifier.VerifyVector(tensors()) && + verifier.VerifyVectorOfTables(tensors()) && + VerifyOffset(verifier, VT_INPUTS) && + verifier.VerifyVector(inputs()) && + VerifyOffset(verifier, VT_OUTPUTS) && + verifier.VerifyVector(outputs()) && + VerifyOffset(verifier, VT_OPERATORS) && + verifier.VerifyVector(operators()) && + verifier.VerifyVectorOfTables(operators()) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + verifier.EndTable(); + } + SubGraphT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SubGraphT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SubGraphBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_tensors(flatbuffers::Offset > > tensors) + { + fbb_.AddOffset(SubGraph::VT_TENSORS, tensors); + } + void add_inputs(flatbuffers::Offset > inputs) + { + fbb_.AddOffset(SubGraph::VT_INPUTS, inputs); + } + void add_outputs(flatbuffers::Offset > outputs) + { + fbb_.AddOffset(SubGraph::VT_OUTPUTS, outputs); + } + void add_operators(flatbuffers::Offset > > operators) + { + fbb_.AddOffset(SubGraph::VT_OPERATORS, operators); + } + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(SubGraph::VT_NAME, name); + } + explicit SubGraphBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SubGraphBuilder &operator=(const SubGraphBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSubGraph( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > > tensors = 0, + flatbuffers::Offset > inputs = 0, + flatbuffers::Offset > outputs = 0, + flatbuffers::Offset > > operators = 0, + flatbuffers::Offset name = 0) +{ + SubGraphBuilder builder_(_fbb); + builder_.add_name(name); + builder_.add_operators(operators); + builder_.add_outputs(outputs); + builder_.add_inputs(inputs); + builder_.add_tensors(tensors); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateSubGraphDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector > *tensors = nullptr, + const std::vector *inputs = nullptr, + const std::vector *outputs = nullptr, + const std::vector > *operators = nullptr, + const char *name = nullptr) +{ + auto tensors__ = tensors ? _fbb.CreateVector >(*tensors) : 0; + auto inputs__ = inputs ? _fbb.CreateVector(*inputs) : 0; + auto outputs__ = outputs ? _fbb.CreateVector(*outputs) : 0; + auto operators__ = operators ? _fbb.CreateVector >(*operators) : 0; + auto name__ = name ? _fbb.CreateString(name) : 0; + return tflite::CreateSubGraph( + _fbb, + tensors__, + inputs__, + outputs__, + operators__, + name__); +} + +flatbuffers::Offset CreateSubGraph(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct BufferT : public flatbuffers::NativeTable { + typedef Buffer TableType; + std::vector data; + BufferT() + { + } +}; + +struct Buffer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef BufferT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_DATA = 4 + }; + const flatbuffers::Vector *data() const + { + return GetPointer *>(VT_DATA); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_DATA) && + verifier.VerifyVector(data()) && + verifier.EndTable(); + } + BufferT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(BufferT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct BufferBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_data(flatbuffers::Offset > data) + { + fbb_.AddOffset(Buffer::VT_DATA, data); + } + explicit BufferBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + BufferBuilder &operator=(const BufferBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateBuffer( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > data = 0) +{ + BufferBuilder builder_(_fbb); + builder_.add_data(data); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateBufferDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector *data = nullptr) +{ + if (data) { + _fbb.ForceVectorAlignment(data->size(), sizeof(uint8_t), 16); + } + auto data__ = data ? _fbb.CreateVector(*data) : 0; + return tflite::CreateBuffer( + _fbb, + data__); +} + +flatbuffers::Offset CreateBuffer(flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct MetadataT : public flatbuffers::NativeTable { + typedef Metadata TableType; + std::string name; + uint32_t buffer; + MetadataT() + : buffer(0) + { + } +}; + +struct Metadata FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef MetadataT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_BUFFER = 6 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + uint32_t buffer() const + { + return GetField(VT_BUFFER, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyField(verifier, VT_BUFFER) && + verifier.EndTable(); + } + MetadataT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(MetadataT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct MetadataBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(Metadata::VT_NAME, name); + } + void add_buffer(uint32_t buffer) + { + fbb_.AddElement(Metadata::VT_BUFFER, buffer, 0); + } + explicit MetadataBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + MetadataBuilder &operator=(const MetadataBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateMetadata( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + uint32_t buffer = 0) +{ + MetadataBuilder builder_(_fbb); + builder_.add_buffer(buffer); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateMetadataDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + uint32_t buffer = 0) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + return tflite::CreateMetadata( + _fbb, + name__, + buffer); +} + +flatbuffers::Offset CreateMetadata(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct TensorMapT : public flatbuffers::NativeTable { + typedef TensorMap TableType; + std::string name; + uint32_t tensor_index; + TensorMapT() + : tensor_index(0) + { + } +}; + +struct TensorMap FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef TensorMapT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_NAME = 4, + VT_TENSOR_INDEX = 6 + }; + const flatbuffers::String *name() const + { + return GetPointer(VT_NAME); + } + uint32_t tensor_index() const + { + return GetField(VT_TENSOR_INDEX, 0); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_NAME) && + verifier.VerifyString(name()) && + VerifyField(verifier, VT_TENSOR_INDEX) && + verifier.EndTable(); + } + TensorMapT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(TensorMapT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TensorMapT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct TensorMapBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_name(flatbuffers::Offset name) + { + fbb_.AddOffset(TensorMap::VT_NAME, name); + } + void add_tensor_index(uint32_t tensor_index) + { + fbb_.AddElement(TensorMap::VT_TENSOR_INDEX, tensor_index, 0); + } + explicit TensorMapBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + TensorMapBuilder &operator=(const TensorMapBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateTensorMap( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset name = 0, + uint32_t tensor_index = 0) +{ + TensorMapBuilder builder_(_fbb); + builder_.add_tensor_index(tensor_index); + builder_.add_name(name); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateTensorMapDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const char *name = nullptr, + uint32_t tensor_index = 0) +{ + auto name__ = name ? _fbb.CreateString(name) : 0; + return tflite::CreateTensorMap( + _fbb, + name__, + tensor_index); +} + +flatbuffers::Offset CreateTensorMap(flatbuffers::FlatBufferBuilder &_fbb, const TensorMapT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct SignatureDefT : public flatbuffers::NativeTable { + typedef SignatureDef TableType; + std::vector > inputs; + std::vector > outputs; + std::string method_name; + std::string key; + SignatureDefT() + { + } +}; + +struct SignatureDef FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef SignatureDefT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_INPUTS = 4, + VT_OUTPUTS = 6, + VT_METHOD_NAME = 8, + VT_KEY = 10 + }; + const flatbuffers::Vector > *inputs() const + { + return GetPointer > *>(VT_INPUTS); + } + const flatbuffers::Vector > *outputs() const + { + return GetPointer > *>(VT_OUTPUTS); + } + const flatbuffers::String *method_name() const + { + return GetPointer(VT_METHOD_NAME); + } + const flatbuffers::String *key() const + { + return GetPointer(VT_KEY); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyOffset(verifier, VT_INPUTS) && + verifier.VerifyVector(inputs()) && + verifier.VerifyVectorOfTables(inputs()) && + VerifyOffset(verifier, VT_OUTPUTS) && + verifier.VerifyVector(outputs()) && + verifier.VerifyVectorOfTables(outputs()) && + VerifyOffset(verifier, VT_METHOD_NAME) && + verifier.VerifyString(method_name()) && + VerifyOffset(verifier, VT_KEY) && + verifier.VerifyString(key()) && + verifier.EndTable(); + } + SignatureDefT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(SignatureDefT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SignatureDefT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct SignatureDefBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_inputs(flatbuffers::Offset > > inputs) + { + fbb_.AddOffset(SignatureDef::VT_INPUTS, inputs); + } + void add_outputs(flatbuffers::Offset > > outputs) + { + fbb_.AddOffset(SignatureDef::VT_OUTPUTS, outputs); + } + void add_method_name(flatbuffers::Offset method_name) + { + fbb_.AddOffset(SignatureDef::VT_METHOD_NAME, method_name); + } + void add_key(flatbuffers::Offset key) + { + fbb_.AddOffset(SignatureDef::VT_KEY, key); + } + explicit SignatureDefBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + SignatureDefBuilder &operator=(const SignatureDefBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateSignatureDef( + flatbuffers::FlatBufferBuilder &_fbb, + flatbuffers::Offset > > inputs = 0, + flatbuffers::Offset > > outputs = 0, + flatbuffers::Offset method_name = 0, + flatbuffers::Offset key = 0) +{ + SignatureDefBuilder builder_(_fbb); + builder_.add_key(key); + builder_.add_method_name(method_name); + builder_.add_outputs(outputs); + builder_.add_inputs(inputs); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateSignatureDefDirect( + flatbuffers::FlatBufferBuilder &_fbb, + const std::vector > *inputs = nullptr, + const std::vector > *outputs = nullptr, + const char *method_name = nullptr, + const char *key = nullptr) +{ + auto inputs__ = inputs ? _fbb.CreateVector >(*inputs) : 0; + auto outputs__ = outputs ? _fbb.CreateVector >(*outputs) : 0; + auto method_name__ = method_name ? _fbb.CreateString(method_name) : 0; + auto key__ = key ? _fbb.CreateString(key) : 0; + return tflite::CreateSignatureDef( + _fbb, + inputs__, + outputs__, + method_name__, + key__); +} + +flatbuffers::Offset CreateSignatureDef(flatbuffers::FlatBufferBuilder &_fbb, const SignatureDefT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +struct ModelT : public flatbuffers::NativeTable { + typedef Model TableType; + uint32_t version; + std::vector > operator_codes; + std::vector > subgraphs; + std::string description; + std::vector > buffers; + std::vector metadata_buffer; + std::vector > metadata; + std::vector > signature_defs; + ModelT() + : version(0) + { + } +}; + +struct Model FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { + typedef ModelT NativeTableType; + enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { + VT_VERSION = 4, + VT_OPERATOR_CODES = 6, + VT_SUBGRAPHS = 8, + VT_DESCRIPTION = 10, + VT_BUFFERS = 12, + VT_METADATA_BUFFER = 14, + VT_METADATA = 16, + VT_SIGNATURE_DEFS = 18 + }; + uint32_t version() const + { + return GetField(VT_VERSION, 0); + } + const flatbuffers::Vector > *operator_codes() const + { + return GetPointer > *>(VT_OPERATOR_CODES); + } + const flatbuffers::Vector > *subgraphs() const + { + return GetPointer > *>(VT_SUBGRAPHS); + } + const flatbuffers::String *description() const + { + return GetPointer(VT_DESCRIPTION); + } + const flatbuffers::Vector > *buffers() const + { + return GetPointer > *>(VT_BUFFERS); + } + const flatbuffers::Vector *metadata_buffer() const + { + return GetPointer *>(VT_METADATA_BUFFER); + } + const flatbuffers::Vector > *metadata() const + { + return GetPointer > *>(VT_METADATA); + } + const flatbuffers::Vector > *signature_defs() const + { + return GetPointer > *>(VT_SIGNATURE_DEFS); + } + bool Verify(flatbuffers::Verifier &verifier) const + { + return VerifyTableStart(verifier) && + VerifyField(verifier, VT_VERSION) && + VerifyOffset(verifier, VT_OPERATOR_CODES) && + verifier.VerifyVector(operator_codes()) && + verifier.VerifyVectorOfTables(operator_codes()) && + VerifyOffset(verifier, VT_SUBGRAPHS) && + verifier.VerifyVector(subgraphs()) && + verifier.VerifyVectorOfTables(subgraphs()) && + VerifyOffset(verifier, VT_DESCRIPTION) && + verifier.VerifyString(description()) && + VerifyOffset(verifier, VT_BUFFERS) && + verifier.VerifyVector(buffers()) && + verifier.VerifyVectorOfTables(buffers()) && + VerifyOffset(verifier, VT_METADATA_BUFFER) && + verifier.VerifyVector(metadata_buffer()) && + VerifyOffset(verifier, VT_METADATA) && + verifier.VerifyVector(metadata()) && + verifier.VerifyVectorOfTables(metadata()) && + VerifyOffset(verifier, VT_SIGNATURE_DEFS) && + verifier.VerifyVector(signature_defs()) && + verifier.VerifyVectorOfTables(signature_defs()) && + verifier.EndTable(); + } + ModelT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; + void UnPackTo(ModelT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; + static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); +}; + +struct ModelBuilder { + flatbuffers::FlatBufferBuilder &fbb_; + flatbuffers::uoffset_t start_; + void add_version(uint32_t version) + { + fbb_.AddElement(Model::VT_VERSION, version, 0); + } + void add_operator_codes(flatbuffers::Offset > > operator_codes) + { + fbb_.AddOffset(Model::VT_OPERATOR_CODES, operator_codes); + } + void add_subgraphs(flatbuffers::Offset > > subgraphs) + { + fbb_.AddOffset(Model::VT_SUBGRAPHS, subgraphs); + } + void add_description(flatbuffers::Offset description) + { + fbb_.AddOffset(Model::VT_DESCRIPTION, description); + } + void add_buffers(flatbuffers::Offset > > buffers) + { + fbb_.AddOffset(Model::VT_BUFFERS, buffers); + } + void add_metadata_buffer(flatbuffers::Offset > metadata_buffer) + { + fbb_.AddOffset(Model::VT_METADATA_BUFFER, metadata_buffer); + } + void add_metadata(flatbuffers::Offset > > metadata) + { + fbb_.AddOffset(Model::VT_METADATA, metadata); + } + void add_signature_defs(flatbuffers::Offset > > signature_defs) + { + fbb_.AddOffset(Model::VT_SIGNATURE_DEFS, signature_defs); + } + explicit ModelBuilder(flatbuffers::FlatBufferBuilder &_fbb) + : fbb_(_fbb) + { + start_ = fbb_.StartTable(); + } + ModelBuilder &operator=(const ModelBuilder &); + flatbuffers::Offset Finish() + { + const auto end = fbb_.EndTable(start_); + auto o = flatbuffers::Offset(end); + return o; + } +}; + +inline flatbuffers::Offset CreateModel( + flatbuffers::FlatBufferBuilder &_fbb, + uint32_t version = 0, + flatbuffers::Offset > > operator_codes = 0, + flatbuffers::Offset > > subgraphs = 0, + flatbuffers::Offset description = 0, + flatbuffers::Offset > > buffers = 0, + flatbuffers::Offset > metadata_buffer = 0, + flatbuffers::Offset > > metadata = 0, + flatbuffers::Offset > > signature_defs = 0) +{ + ModelBuilder builder_(_fbb); + builder_.add_signature_defs(signature_defs); + builder_.add_metadata(metadata); + builder_.add_metadata_buffer(metadata_buffer); + builder_.add_buffers(buffers); + builder_.add_description(description); + builder_.add_subgraphs(subgraphs); + builder_.add_operator_codes(operator_codes); + builder_.add_version(version); + return builder_.Finish(); +} + +inline flatbuffers::Offset CreateModelDirect( + flatbuffers::FlatBufferBuilder &_fbb, + uint32_t version = 0, + const std::vector > *operator_codes = nullptr, + const std::vector > *subgraphs = nullptr, + const char *description = nullptr, + const std::vector > *buffers = nullptr, + const std::vector *metadata_buffer = nullptr, + const std::vector > *metadata = nullptr, + const std::vector > *signature_defs = nullptr) +{ + auto operator_codes__ = operator_codes ? _fbb.CreateVector >(*operator_codes) : 0; + auto subgraphs__ = subgraphs ? _fbb.CreateVector >(*subgraphs) : 0; + auto description__ = description ? _fbb.CreateString(description) : 0; + auto buffers__ = buffers ? _fbb.CreateVector >(*buffers) : 0; + auto metadata_buffer__ = metadata_buffer ? _fbb.CreateVector(*metadata_buffer) : 0; + auto metadata__ = metadata ? _fbb.CreateVector >(*metadata) : 0; + auto signature_defs__ = signature_defs ? _fbb.CreateVector >(*signature_defs) : 0; + return tflite::CreateModel( + _fbb, + version, + operator_codes__, + subgraphs__, + description__, + buffers__, + metadata_buffer__, + metadata__, + signature_defs__); +} + +flatbuffers::Offset CreateModel(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); + +inline CustomQuantizationT *CustomQuantization::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new CustomQuantizationT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void CustomQuantization::UnPackTo(CustomQuantizationT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = custom(); + if (_e) { + _o->custom.resize(_e->size()); + std::copy(_e->begin(), _e->end(), _o->custom.begin()); + } + } +} + +inline flatbuffers::Offset CustomQuantization::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateCustomQuantization(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateCustomQuantization(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const CustomQuantizationT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + _fbb.ForceVectorAlignment(_o->custom.size(), sizeof(uint8_t), 16); + auto _custom = _o->custom.size() ? _fbb.CreateVector(_o->custom) : 0; + return tflite::CreateCustomQuantization( + _fbb, + _custom); +} + +inline QuantizationParametersT *QuantizationParameters::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new QuantizationParametersT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void QuantizationParameters::UnPackTo(QuantizationParametersT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = min(); + if (_e) { + _o->min.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->min[_i] = _e->Get(_i); + } + } + } + { + auto _e = max(); + if (_e) { + _o->max.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->max[_i] = _e->Get(_i); + } + } + } + { + auto _e = scale(); + if (_e) { + _o->scale.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->scale[_i] = _e->Get(_i); + } + } + } + { + auto _e = zero_point(); + if (_e) { + _o->zero_point.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->zero_point[_i] = _e->Get(_i); + } + } + } + { + auto _e = details_type(); + _o->details.type = _e; + } + { + auto _e = details(); + if (_e) + _o->details.value = tflite::QuantizationDetailsUnion::UnPack(_e, details_type(), _resolver); + } + { + auto _e = quantized_dimension(); + _o->quantized_dimension = _e; + } +} + +inline flatbuffers::Offset QuantizationParameters::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateQuantizationParameters(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateQuantizationParameters(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const QuantizationParametersT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _min = _o->min.size() ? _fbb.CreateVector(_o->min) : 0; + auto _max = _o->max.size() ? _fbb.CreateVector(_o->max) : 0; + auto _scale = _o->scale.size() ? _fbb.CreateVector(_o->scale) : 0; + auto _zero_point = _o->zero_point.size() ? _fbb.CreateVector(_o->zero_point) : 0; + auto _details_type = _o->details.type; + auto _details = _o->details.Pack(_fbb); + auto _quantized_dimension = _o->quantized_dimension; + return tflite::CreateQuantizationParameters( + _fbb, + _min, + _max, + _scale, + _zero_point, + _details_type, + _details, + _quantized_dimension); +} + +inline Int32VectorT *Int32Vector::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Int32VectorT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Int32Vector::UnPackTo(Int32VectorT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = values(); + if (_e) { + _o->values.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->values[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset Int32Vector::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateInt32Vector(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateInt32Vector(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Int32VectorT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _values = _o->values.size() ? _fbb.CreateVector(_o->values) : 0; + return tflite::CreateInt32Vector( + _fbb, + _values); +} + +inline Uint16VectorT *Uint16Vector::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Uint16VectorT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Uint16Vector::UnPackTo(Uint16VectorT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = values(); + if (_e) { + _o->values.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->values[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset Uint16Vector::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateUint16Vector(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateUint16Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Uint16VectorT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + _fbb.ForceVectorAlignment(_o->values.size(), sizeof(uint16_t), 4); + auto _values = _o->values.size() ? _fbb.CreateVector(_o->values) : 0; + return tflite::CreateUint16Vector( + _fbb, + _values); +} + +inline Uint8VectorT *Uint8Vector::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Uint8VectorT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Uint8Vector::UnPackTo(Uint8VectorT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = values(); + if (_e) { + _o->values.resize(_e->size()); + std::copy(_e->begin(), _e->end(), _o->values.begin()); + } + } +} + +inline flatbuffers::Offset Uint8Vector::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateUint8Vector(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateUint8Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Uint8VectorT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + _fbb.ForceVectorAlignment(_o->values.size(), sizeof(uint8_t), 4); + auto _values = _o->values.size() ? _fbb.CreateVector(_o->values) : 0; + return tflite::CreateUint8Vector( + _fbb, + _values); +} + +inline DimensionMetadataT *DimensionMetadata::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new DimensionMetadataT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void DimensionMetadata::UnPackTo(DimensionMetadataT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = format(); + _o->format = _e; + } + { + auto _e = dense_size(); + _o->dense_size = _e; + } + { + auto _e = array_segments_type(); + _o->array_segments.type = _e; + } + { + auto _e = array_segments(); + if (_e) + _o->array_segments.value = tflite::SparseIndexVectorUnion::UnPack(_e, array_segments_type(), _resolver); + } + { + auto _e = array_indices_type(); + _o->array_indices.type = _e; + } + { + auto _e = array_indices(); + if (_e) + _o->array_indices.value = tflite::SparseIndexVectorUnion::UnPack(_e, array_indices_type(), _resolver); + } +} + +inline flatbuffers::Offset DimensionMetadata::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateDimensionMetadata(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateDimensionMetadata(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const DimensionMetadataT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _format = _o->format; + auto _dense_size = _o->dense_size; + auto _array_segments_type = _o->array_segments.type; + auto _array_segments = _o->array_segments.Pack(_fbb); + auto _array_indices_type = _o->array_indices.type; + auto _array_indices = _o->array_indices.Pack(_fbb); + return tflite::CreateDimensionMetadata( + _fbb, + _format, + _dense_size, + _array_segments_type, + _array_segments, + _array_indices_type, + _array_indices); +} + +inline SparsityParametersT *SparsityParameters::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SparsityParametersT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SparsityParameters::UnPackTo(SparsityParametersT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = traversal_order(); + if (_e) { + _o->traversal_order.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->traversal_order[_i] = _e->Get(_i); + } + } + } + { + auto _e = block_map(); + if (_e) { + _o->block_map.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->block_map[_i] = _e->Get(_i); + } + } + } + { + auto _e = dim_metadata(); + if (_e) { + _o->dim_metadata.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->dim_metadata[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } +} + +inline flatbuffers::Offset SparsityParameters::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSparsityParameters(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSparsityParameters(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SparsityParametersT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _traversal_order = _o->traversal_order.size() ? _fbb.CreateVector(_o->traversal_order) : 0; + auto _block_map = _o->block_map.size() ? _fbb.CreateVector(_o->block_map) : 0; + auto _dim_metadata = _o->dim_metadata.size() ? _fbb.CreateVector >( + _o->dim_metadata.size(), [](size_t i, _VectorArgs *__va) { return CreateDimensionMetadata(*__va->__fbb, __va->__o->dim_metadata[i].get(), __va->__rehasher); }, &_va) : + 0; + return tflite::CreateSparsityParameters( + _fbb, + _traversal_order, + _block_map, + _dim_metadata); +} + +inline TensorT *Tensor::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new TensorT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Tensor::UnPackTo(TensorT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = shape(); + if (_e) { + _o->shape.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->shape[_i] = _e->Get(_i); + } + } + } + { + auto _e = type(); + _o->type = _e; + } + { + auto _e = buffer(); + _o->buffer = _e; + } + { + auto _e = name(); + if (_e) + _o->name = _e->str(); + } + { + auto _e = quantization(); + if (_e) + _o->quantization = std::unique_ptr(_e->UnPack(_resolver)); + } + { + auto _e = is_variable(); + _o->is_variable = _e; + } + { + auto _e = sparsity(); + if (_e) + _o->sparsity = std::unique_ptr(_e->UnPack(_resolver)); + } + { + auto _e = shape_signature(); + if (_e) { + _o->shape_signature.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->shape_signature[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset Tensor::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateTensor(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateTensor(flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const TensorT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _shape = _o->shape.size() ? _fbb.CreateVector(_o->shape) : 0; + auto _type = _o->type; + auto _buffer = _o->buffer; + auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); + auto _quantization = _o->quantization ? CreateQuantizationParameters(_fbb, _o->quantization.get(), _rehasher) : 0; + auto _is_variable = _o->is_variable; + auto _sparsity = _o->sparsity ? CreateSparsityParameters(_fbb, _o->sparsity.get(), _rehasher) : 0; + auto _shape_signature = _o->shape_signature.size() ? _fbb.CreateVector(_o->shape_signature) : 0; + return tflite::CreateTensor( + _fbb, + _shape, + _type, + _buffer, + _name, + _quantization, + _is_variable, + _sparsity, + _shape_signature); +} + +inline Conv2DOptionsT *Conv2DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Conv2DOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Conv2DOptions::UnPackTo(Conv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = padding(); + _o->padding = _e; + } + { + auto _e = stride_w(); + _o->stride_w = _e; + } + { + auto _e = stride_h(); + _o->stride_h = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = dilation_w_factor(); + _o->dilation_w_factor = _e; + } + { + auto _e = dilation_h_factor(); + _o->dilation_h_factor = _e; + } +} + +inline flatbuffers::Offset Conv2DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateConv2DOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Conv2DOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _padding = _o->padding; + auto _stride_w = _o->stride_w; + auto _stride_h = _o->stride_h; + auto _fused_activation_function = _o->fused_activation_function; + auto _dilation_w_factor = _o->dilation_w_factor; + auto _dilation_h_factor = _o->dilation_h_factor; + return tflite::CreateConv2DOptions( + _fbb, + _padding, + _stride_w, + _stride_h, + _fused_activation_function, + _dilation_w_factor, + _dilation_h_factor); +} + +inline Conv3DOptionsT *Conv3DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Conv3DOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Conv3DOptions::UnPackTo(Conv3DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = padding(); + _o->padding = _e; + } + { + auto _e = stride_d(); + _o->stride_d = _e; + } + { + auto _e = stride_w(); + _o->stride_w = _e; + } + { + auto _e = stride_h(); + _o->stride_h = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = dilation_d_factor(); + _o->dilation_d_factor = _e; + } + { + auto _e = dilation_w_factor(); + _o->dilation_w_factor = _e; + } + { + auto _e = dilation_h_factor(); + _o->dilation_h_factor = _e; + } +} + +inline flatbuffers::Offset Conv3DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Conv3DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateConv3DOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateConv3DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Conv3DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Conv3DOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _padding = _o->padding; + auto _stride_d = _o->stride_d; + auto _stride_w = _o->stride_w; + auto _stride_h = _o->stride_h; + auto _fused_activation_function = _o->fused_activation_function; + auto _dilation_d_factor = _o->dilation_d_factor; + auto _dilation_w_factor = _o->dilation_w_factor; + auto _dilation_h_factor = _o->dilation_h_factor; + return tflite::CreateConv3DOptions( + _fbb, + _padding, + _stride_d, + _stride_w, + _stride_h, + _fused_activation_function, + _dilation_d_factor, + _dilation_w_factor, + _dilation_h_factor); +} + +inline Pool2DOptionsT *Pool2DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Pool2DOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Pool2DOptions::UnPackTo(Pool2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = padding(); + _o->padding = _e; + } + { + auto _e = stride_w(); + _o->stride_w = _e; + } + { + auto _e = stride_h(); + _o->stride_h = _e; + } + { + auto _e = filter_width(); + _o->filter_width = _e; + } + { + auto _e = filter_height(); + _o->filter_height = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } +} + +inline flatbuffers::Offset Pool2DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreatePool2DOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreatePool2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Pool2DOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _padding = _o->padding; + auto _stride_w = _o->stride_w; + auto _stride_h = _o->stride_h; + auto _filter_width = _o->filter_width; + auto _filter_height = _o->filter_height; + auto _fused_activation_function = _o->fused_activation_function; + return tflite::CreatePool2DOptions( + _fbb, + _padding, + _stride_w, + _stride_h, + _filter_width, + _filter_height, + _fused_activation_function); +} + +inline DepthwiseConv2DOptionsT *DepthwiseConv2DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new DepthwiseConv2DOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void DepthwiseConv2DOptions::UnPackTo(DepthwiseConv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = padding(); + _o->padding = _e; + } + { + auto _e = stride_w(); + _o->stride_w = _e; + } + { + auto _e = stride_h(); + _o->stride_h = _e; + } + { + auto _e = depth_multiplier(); + _o->depth_multiplier = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = dilation_w_factor(); + _o->dilation_w_factor = _e; + } + { + auto _e = dilation_h_factor(); + _o->dilation_h_factor = _e; + } +} + +inline flatbuffers::Offset DepthwiseConv2DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateDepthwiseConv2DOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateDepthwiseConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const DepthwiseConv2DOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _padding = _o->padding; + auto _stride_w = _o->stride_w; + auto _stride_h = _o->stride_h; + auto _depth_multiplier = _o->depth_multiplier; + auto _fused_activation_function = _o->fused_activation_function; + auto _dilation_w_factor = _o->dilation_w_factor; + auto _dilation_h_factor = _o->dilation_h_factor; + return tflite::CreateDepthwiseConv2DOptions( + _fbb, + _padding, + _stride_w, + _stride_h, + _depth_multiplier, + _fused_activation_function, + _dilation_w_factor, + _dilation_h_factor); +} + +inline ConcatEmbeddingsOptionsT *ConcatEmbeddingsOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ConcatEmbeddingsOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ConcatEmbeddingsOptions::UnPackTo(ConcatEmbeddingsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = num_channels(); + _o->num_channels = _e; + } + { + auto _e = num_columns_per_channel(); + if (_e) { + _o->num_columns_per_channel.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->num_columns_per_channel[_i] = _e->Get(_i); + } + } + } + { + auto _e = embedding_dim_per_channel(); + if (_e) { + _o->embedding_dim_per_channel.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->embedding_dim_per_channel[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset ConcatEmbeddingsOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateConcatEmbeddingsOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateConcatEmbeddingsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ConcatEmbeddingsOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _num_channels = _o->num_channels; + auto _num_columns_per_channel = _o->num_columns_per_channel.size() ? _fbb.CreateVector(_o->num_columns_per_channel) : 0; + auto _embedding_dim_per_channel = _o->embedding_dim_per_channel.size() ? _fbb.CreateVector(_o->embedding_dim_per_channel) : 0; + return tflite::CreateConcatEmbeddingsOptions( + _fbb, + _num_channels, + _num_columns_per_channel, + _embedding_dim_per_channel); +} + +inline LSHProjectionOptionsT *LSHProjectionOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LSHProjectionOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LSHProjectionOptions::UnPackTo(LSHProjectionOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = type(); + _o->type = _e; + } +} + +inline flatbuffers::Offset LSHProjectionOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLSHProjectionOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLSHProjectionOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LSHProjectionOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _type = _o->type; + return tflite::CreateLSHProjectionOptions( + _fbb, + _type); +} + +inline SVDFOptionsT *SVDFOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SVDFOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SVDFOptions::UnPackTo(SVDFOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = rank(); + _o->rank = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset SVDFOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSVDFOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSVDFOptions(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SVDFOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _rank = _o->rank; + auto _fused_activation_function = _o->fused_activation_function; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateSVDFOptions( + _fbb, + _rank, + _fused_activation_function, + _asymmetric_quantize_inputs); +} + +inline RNNOptionsT *RNNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new RNNOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void RNNOptions::UnPackTo(RNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset RNNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateRNNOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const RNNOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateRNNOptions( + _fbb, + _fused_activation_function, + _asymmetric_quantize_inputs); +} + +inline SequenceRNNOptionsT *SequenceRNNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SequenceRNNOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SequenceRNNOptions::UnPackTo(SequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = time_major(); + _o->time_major = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset SequenceRNNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSequenceRNNOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SequenceRNNOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _time_major = _o->time_major; + auto _fused_activation_function = _o->fused_activation_function; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateSequenceRNNOptions( + _fbb, + _time_major, + _fused_activation_function, + _asymmetric_quantize_inputs); +} + +inline BidirectionalSequenceRNNOptionsT *BidirectionalSequenceRNNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new BidirectionalSequenceRNNOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void BidirectionalSequenceRNNOptions::UnPackTo(BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = time_major(); + _o->time_major = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = merge_outputs(); + _o->merge_outputs = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset BidirectionalSequenceRNNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateBidirectionalSequenceRNNOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateBidirectionalSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const BidirectionalSequenceRNNOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _time_major = _o->time_major; + auto _fused_activation_function = _o->fused_activation_function; + auto _merge_outputs = _o->merge_outputs; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateBidirectionalSequenceRNNOptions( + _fbb, + _time_major, + _fused_activation_function, + _merge_outputs, + _asymmetric_quantize_inputs); +} + +inline FullyConnectedOptionsT *FullyConnectedOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new FullyConnectedOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void FullyConnectedOptions::UnPackTo(FullyConnectedOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = weights_format(); + _o->weights_format = _e; + } + { + auto _e = keep_num_dims(); + _o->keep_num_dims = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset FullyConnectedOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateFullyConnectedOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateFullyConnectedOptions(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const FullyConnectedOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _weights_format = _o->weights_format; + auto _keep_num_dims = _o->keep_num_dims; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateFullyConnectedOptions( + _fbb, + _fused_activation_function, + _weights_format, + _keep_num_dims, + _asymmetric_quantize_inputs); +} + +inline SoftmaxOptionsT *SoftmaxOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SoftmaxOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SoftmaxOptions::UnPackTo(SoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = beta(); + _o->beta = _e; + } +} + +inline flatbuffers::Offset SoftmaxOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSoftmaxOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SoftmaxOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _beta = _o->beta; + return tflite::CreateSoftmaxOptions( + _fbb, + _beta); +} + +inline ConcatenationOptionsT *ConcatenationOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ConcatenationOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ConcatenationOptions::UnPackTo(ConcatenationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = axis(); + _o->axis = _e; + } + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } +} + +inline flatbuffers::Offset ConcatenationOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateConcatenationOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateConcatenationOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ConcatenationOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _axis = _o->axis; + auto _fused_activation_function = _o->fused_activation_function; + return tflite::CreateConcatenationOptions( + _fbb, + _axis, + _fused_activation_function); +} + +inline AddOptionsT *AddOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new AddOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void AddOptions::UnPackTo(AddOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = pot_scale_int16(); + _o->pot_scale_int16 = _e; + } +} + +inline flatbuffers::Offset AddOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateAddOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateAddOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const AddOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _pot_scale_int16 = _o->pot_scale_int16; + return tflite::CreateAddOptions( + _fbb, + _fused_activation_function, + _pot_scale_int16); +} + +inline MulOptionsT *MulOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new MulOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void MulOptions::UnPackTo(MulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } +} + +inline flatbuffers::Offset MulOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateMulOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const MulOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + return tflite::CreateMulOptions( + _fbb, + _fused_activation_function); +} + +inline L2NormOptionsT *L2NormOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new L2NormOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void L2NormOptions::UnPackTo(L2NormOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } +} + +inline flatbuffers::Offset L2NormOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateL2NormOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateL2NormOptions(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const L2NormOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + return tflite::CreateL2NormOptions( + _fbb, + _fused_activation_function); +} + +inline LocalResponseNormalizationOptionsT *LocalResponseNormalizationOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LocalResponseNormalizationOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LocalResponseNormalizationOptions::UnPackTo(LocalResponseNormalizationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = radius(); + _o->radius = _e; + } + { + auto _e = bias(); + _o->bias = _e; + } + { + auto _e = alpha(); + _o->alpha = _e; + } + { + auto _e = beta(); + _o->beta = _e; + } +} + +inline flatbuffers::Offset LocalResponseNormalizationOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLocalResponseNormalizationOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLocalResponseNormalizationOptions(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LocalResponseNormalizationOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _radius = _o->radius; + auto _bias = _o->bias; + auto _alpha = _o->alpha; + auto _beta = _o->beta; + return tflite::CreateLocalResponseNormalizationOptions( + _fbb, + _radius, + _bias, + _alpha, + _beta); +} + +inline LSTMOptionsT *LSTMOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LSTMOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LSTMOptions::UnPackTo(LSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = cell_clip(); + _o->cell_clip = _e; + } + { + auto _e = proj_clip(); + _o->proj_clip = _e; + } + { + auto _e = kernel_type(); + _o->kernel_type = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset LSTMOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLSTMOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LSTMOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _cell_clip = _o->cell_clip; + auto _proj_clip = _o->proj_clip; + auto _kernel_type = _o->kernel_type; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateLSTMOptions( + _fbb, + _fused_activation_function, + _cell_clip, + _proj_clip, + _kernel_type, + _asymmetric_quantize_inputs); +} + +inline UnidirectionalSequenceLSTMOptionsT *UnidirectionalSequenceLSTMOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new UnidirectionalSequenceLSTMOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void UnidirectionalSequenceLSTMOptions::UnPackTo(UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = cell_clip(); + _o->cell_clip = _e; + } + { + auto _e = proj_clip(); + _o->proj_clip = _e; + } + { + auto _e = time_major(); + _o->time_major = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset UnidirectionalSequenceLSTMOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateUnidirectionalSequenceLSTMOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateUnidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const UnidirectionalSequenceLSTMOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _cell_clip = _o->cell_clip; + auto _proj_clip = _o->proj_clip; + auto _time_major = _o->time_major; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateUnidirectionalSequenceLSTMOptions( + _fbb, + _fused_activation_function, + _cell_clip, + _proj_clip, + _time_major, + _asymmetric_quantize_inputs); +} + +inline BidirectionalSequenceLSTMOptionsT *BidirectionalSequenceLSTMOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new BidirectionalSequenceLSTMOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void BidirectionalSequenceLSTMOptions::UnPackTo(BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = cell_clip(); + _o->cell_clip = _e; + } + { + auto _e = proj_clip(); + _o->proj_clip = _e; + } + { + auto _e = merge_outputs(); + _o->merge_outputs = _e; + } + { + auto _e = time_major(); + _o->time_major = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset BidirectionalSequenceLSTMOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateBidirectionalSequenceLSTMOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateBidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const BidirectionalSequenceLSTMOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _cell_clip = _o->cell_clip; + auto _proj_clip = _o->proj_clip; + auto _merge_outputs = _o->merge_outputs; + auto _time_major = _o->time_major; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateBidirectionalSequenceLSTMOptions( + _fbb, + _fused_activation_function, + _cell_clip, + _proj_clip, + _merge_outputs, + _time_major, + _asymmetric_quantize_inputs); +} + +inline ResizeBilinearOptionsT *ResizeBilinearOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ResizeBilinearOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ResizeBilinearOptions::UnPackTo(ResizeBilinearOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = align_corners(); + _o->align_corners = _e; + } + { + auto _e = half_pixel_centers(); + _o->half_pixel_centers = _e; + } +} + +inline flatbuffers::Offset ResizeBilinearOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateResizeBilinearOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateResizeBilinearOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ResizeBilinearOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _align_corners = _o->align_corners; + auto _half_pixel_centers = _o->half_pixel_centers; + return tflite::CreateResizeBilinearOptions( + _fbb, + _align_corners, + _half_pixel_centers); +} + +inline ResizeNearestNeighborOptionsT *ResizeNearestNeighborOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ResizeNearestNeighborOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ResizeNearestNeighborOptions::UnPackTo(ResizeNearestNeighborOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = align_corners(); + _o->align_corners = _e; + } + { + auto _e = half_pixel_centers(); + _o->half_pixel_centers = _e; + } +} + +inline flatbuffers::Offset ResizeNearestNeighborOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateResizeNearestNeighborOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateResizeNearestNeighborOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ResizeNearestNeighborOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _align_corners = _o->align_corners; + auto _half_pixel_centers = _o->half_pixel_centers; + return tflite::CreateResizeNearestNeighborOptions( + _fbb, + _align_corners, + _half_pixel_centers); +} + +inline CallOptionsT *CallOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new CallOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void CallOptions::UnPackTo(CallOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = subgraph(); + _o->subgraph = _e; + } +} + +inline flatbuffers::Offset CallOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateCallOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateCallOptions(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const CallOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _subgraph = _o->subgraph; + return tflite::CreateCallOptions( + _fbb, + _subgraph); +} + +inline PadOptionsT *PadOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new PadOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void PadOptions::UnPackTo(PadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset PadOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreatePadOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreatePadOptions(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const PadOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreatePadOptions( + _fbb); +} + +inline PadV2OptionsT *PadV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new PadV2OptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void PadV2Options::UnPackTo(PadV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset PadV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreatePadV2Options(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreatePadV2Options(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const PadV2OptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreatePadV2Options( + _fbb); +} + +inline ReshapeOptionsT *ReshapeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ReshapeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ReshapeOptions::UnPackTo(ReshapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = new_shape(); + if (_e) { + _o->new_shape.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->new_shape[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset ReshapeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateReshapeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateReshapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ReshapeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _new_shape = _o->new_shape.size() ? _fbb.CreateVector(_o->new_shape) : 0; + return tflite::CreateReshapeOptions( + _fbb, + _new_shape); +} + +inline SpaceToBatchNDOptionsT *SpaceToBatchNDOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SpaceToBatchNDOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SpaceToBatchNDOptions::UnPackTo(SpaceToBatchNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SpaceToBatchNDOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSpaceToBatchNDOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSpaceToBatchNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SpaceToBatchNDOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSpaceToBatchNDOptions( + _fbb); +} + +inline BatchToSpaceNDOptionsT *BatchToSpaceNDOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new BatchToSpaceNDOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void BatchToSpaceNDOptions::UnPackTo(BatchToSpaceNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset BatchToSpaceNDOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateBatchToSpaceNDOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateBatchToSpaceNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const BatchToSpaceNDOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateBatchToSpaceNDOptions( + _fbb); +} + +inline SkipGramOptionsT *SkipGramOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SkipGramOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SkipGramOptions::UnPackTo(SkipGramOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = ngram_size(); + _o->ngram_size = _e; + } + { + auto _e = max_skip_size(); + _o->max_skip_size = _e; + } + { + auto _e = include_all_ngrams(); + _o->include_all_ngrams = _e; + } +} + +inline flatbuffers::Offset SkipGramOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSkipGramOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSkipGramOptions(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SkipGramOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _ngram_size = _o->ngram_size; + auto _max_skip_size = _o->max_skip_size; + auto _include_all_ngrams = _o->include_all_ngrams; + return tflite::CreateSkipGramOptions( + _fbb, + _ngram_size, + _max_skip_size, + _include_all_ngrams); +} + +inline SpaceToDepthOptionsT *SpaceToDepthOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SpaceToDepthOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SpaceToDepthOptions::UnPackTo(SpaceToDepthOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = block_size(); + _o->block_size = _e; + } +} + +inline flatbuffers::Offset SpaceToDepthOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSpaceToDepthOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSpaceToDepthOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SpaceToDepthOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _block_size = _o->block_size; + return tflite::CreateSpaceToDepthOptions( + _fbb, + _block_size); +} + +inline DepthToSpaceOptionsT *DepthToSpaceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new DepthToSpaceOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void DepthToSpaceOptions::UnPackTo(DepthToSpaceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = block_size(); + _o->block_size = _e; + } +} + +inline flatbuffers::Offset DepthToSpaceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateDepthToSpaceOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateDepthToSpaceOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const DepthToSpaceOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _block_size = _o->block_size; + return tflite::CreateDepthToSpaceOptions( + _fbb, + _block_size); +} + +inline SubOptionsT *SubOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SubOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SubOptions::UnPackTo(SubOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } + { + auto _e = pot_scale_int16(); + _o->pot_scale_int16 = _e; + } +} + +inline flatbuffers::Offset SubOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSubOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSubOptions(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SubOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + auto _pot_scale_int16 = _o->pot_scale_int16; + return tflite::CreateSubOptions( + _fbb, + _fused_activation_function, + _pot_scale_int16); +} + +inline DivOptionsT *DivOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new DivOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void DivOptions::UnPackTo(DivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = fused_activation_function(); + _o->fused_activation_function = _e; + } +} + +inline flatbuffers::Offset DivOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateDivOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const DivOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _fused_activation_function = _o->fused_activation_function; + return tflite::CreateDivOptions( + _fbb, + _fused_activation_function); +} + +inline TopKV2OptionsT *TopKV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new TopKV2OptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void TopKV2Options::UnPackTo(TopKV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset TopKV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateTopKV2Options(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateTopKV2Options(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const TopKV2OptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateTopKV2Options( + _fbb); +} + +inline EmbeddingLookupSparseOptionsT *EmbeddingLookupSparseOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new EmbeddingLookupSparseOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void EmbeddingLookupSparseOptions::UnPackTo(EmbeddingLookupSparseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = combiner(); + _o->combiner = _e; + } +} + +inline flatbuffers::Offset EmbeddingLookupSparseOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateEmbeddingLookupSparseOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateEmbeddingLookupSparseOptions(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const EmbeddingLookupSparseOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _combiner = _o->combiner; + return tflite::CreateEmbeddingLookupSparseOptions( + _fbb, + _combiner); +} + +inline GatherOptionsT *GatherOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new GatherOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void GatherOptions::UnPackTo(GatherOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = axis(); + _o->axis = _e; + } + { + auto _e = batch_dims(); + _o->batch_dims = _e; + } +} + +inline flatbuffers::Offset GatherOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateGatherOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateGatherOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const GatherOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _axis = _o->axis; + auto _batch_dims = _o->batch_dims; + return tflite::CreateGatherOptions( + _fbb, + _axis, + _batch_dims); +} + +inline TransposeOptionsT *TransposeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new TransposeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void TransposeOptions::UnPackTo(TransposeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset TransposeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateTransposeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateTransposeOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const TransposeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateTransposeOptions( + _fbb); +} + +inline ExpOptionsT *ExpOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ExpOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ExpOptions::UnPackTo(ExpOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset ExpOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateExpOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateExpOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ExpOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateExpOptions( + _fbb); +} + +inline CosOptionsT *CosOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new CosOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void CosOptions::UnPackTo(CosOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset CosOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateCosOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateCosOptions(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const CosOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateCosOptions( + _fbb); +} + +inline ReducerOptionsT *ReducerOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ReducerOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ReducerOptions::UnPackTo(ReducerOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = keep_dims(); + _o->keep_dims = _e; + } +} + +inline flatbuffers::Offset ReducerOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateReducerOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateReducerOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ReducerOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _keep_dims = _o->keep_dims; + return tflite::CreateReducerOptions( + _fbb, + _keep_dims); +} + +inline SqueezeOptionsT *SqueezeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SqueezeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SqueezeOptions::UnPackTo(SqueezeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = squeeze_dims(); + if (_e) { + _o->squeeze_dims.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->squeeze_dims[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset SqueezeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSqueezeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSqueezeOptions(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SqueezeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _squeeze_dims = _o->squeeze_dims.size() ? _fbb.CreateVector(_o->squeeze_dims) : 0; + return tflite::CreateSqueezeOptions( + _fbb, + _squeeze_dims); +} + +inline SplitOptionsT *SplitOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SplitOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SplitOptions::UnPackTo(SplitOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = num_splits(); + _o->num_splits = _e; + } +} + +inline flatbuffers::Offset SplitOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSplitOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSplitOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SplitOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _num_splits = _o->num_splits; + return tflite::CreateSplitOptions( + _fbb, + _num_splits); +} + +inline SplitVOptionsT *SplitVOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SplitVOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SplitVOptions::UnPackTo(SplitVOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = num_splits(); + _o->num_splits = _e; + } +} + +inline flatbuffers::Offset SplitVOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSplitVOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSplitVOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SplitVOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _num_splits = _o->num_splits; + return tflite::CreateSplitVOptions( + _fbb, + _num_splits); +} + +inline StridedSliceOptionsT *StridedSliceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new StridedSliceOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void StridedSliceOptions::UnPackTo(StridedSliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = begin_mask(); + _o->begin_mask = _e; + } + { + auto _e = end_mask(); + _o->end_mask = _e; + } + { + auto _e = ellipsis_mask(); + _o->ellipsis_mask = _e; + } + { + auto _e = new_axis_mask(); + _o->new_axis_mask = _e; + } + { + auto _e = shrink_axis_mask(); + _o->shrink_axis_mask = _e; + } +} + +inline flatbuffers::Offset StridedSliceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateStridedSliceOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateStridedSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const StridedSliceOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _begin_mask = _o->begin_mask; + auto _end_mask = _o->end_mask; + auto _ellipsis_mask = _o->ellipsis_mask; + auto _new_axis_mask = _o->new_axis_mask; + auto _shrink_axis_mask = _o->shrink_axis_mask; + return tflite::CreateStridedSliceOptions( + _fbb, + _begin_mask, + _end_mask, + _ellipsis_mask, + _new_axis_mask, + _shrink_axis_mask); +} + +inline LogSoftmaxOptionsT *LogSoftmaxOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LogSoftmaxOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LogSoftmaxOptions::UnPackTo(LogSoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset LogSoftmaxOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLogSoftmaxOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLogSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LogSoftmaxOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateLogSoftmaxOptions( + _fbb); +} + +inline CastOptionsT *CastOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new CastOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void CastOptions::UnPackTo(CastOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = in_data_type(); + _o->in_data_type = _e; + } + { + auto _e = out_data_type(); + _o->out_data_type = _e; + } +} + +inline flatbuffers::Offset CastOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateCastOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateCastOptions(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const CastOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _in_data_type = _o->in_data_type; + auto _out_data_type = _o->out_data_type; + return tflite::CreateCastOptions( + _fbb, + _in_data_type, + _out_data_type); +} + +inline DequantizeOptionsT *DequantizeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new DequantizeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void DequantizeOptions::UnPackTo(DequantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset DequantizeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateDequantizeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateDequantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const DequantizeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateDequantizeOptions( + _fbb); +} + +inline MaximumMinimumOptionsT *MaximumMinimumOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new MaximumMinimumOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void MaximumMinimumOptions::UnPackTo(MaximumMinimumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset MaximumMinimumOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateMaximumMinimumOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateMaximumMinimumOptions(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const MaximumMinimumOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateMaximumMinimumOptions( + _fbb); +} + +inline TileOptionsT *TileOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new TileOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void TileOptions::UnPackTo(TileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset TileOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateTileOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateTileOptions(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const TileOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateTileOptions( + _fbb); +} + +inline ArgMaxOptionsT *ArgMaxOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ArgMaxOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ArgMaxOptions::UnPackTo(ArgMaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = output_type(); + _o->output_type = _e; + } +} + +inline flatbuffers::Offset ArgMaxOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateArgMaxOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateArgMaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ArgMaxOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _output_type = _o->output_type; + return tflite::CreateArgMaxOptions( + _fbb, + _output_type); +} + +inline ArgMinOptionsT *ArgMinOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ArgMinOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ArgMinOptions::UnPackTo(ArgMinOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = output_type(); + _o->output_type = _e; + } +} + +inline flatbuffers::Offset ArgMinOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateArgMinOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateArgMinOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ArgMinOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _output_type = _o->output_type; + return tflite::CreateArgMinOptions( + _fbb, + _output_type); +} + +inline GreaterOptionsT *GreaterOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new GreaterOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void GreaterOptions::UnPackTo(GreaterOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset GreaterOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateGreaterOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateGreaterOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const GreaterOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateGreaterOptions( + _fbb); +} + +inline GreaterEqualOptionsT *GreaterEqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new GreaterEqualOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void GreaterEqualOptions::UnPackTo(GreaterEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset GreaterEqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateGreaterEqualOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateGreaterEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const GreaterEqualOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateGreaterEqualOptions( + _fbb); +} + +inline LessOptionsT *LessOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LessOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LessOptions::UnPackTo(LessOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset LessOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLessOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLessOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LessOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateLessOptions( + _fbb); +} + +inline LessEqualOptionsT *LessEqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LessEqualOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LessEqualOptions::UnPackTo(LessEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset LessEqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLessEqualOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLessEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LessEqualOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateLessEqualOptions( + _fbb); +} + +inline NegOptionsT *NegOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new NegOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void NegOptions::UnPackTo(NegOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset NegOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateNegOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateNegOptions(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const NegOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateNegOptions( + _fbb); +} + +inline SelectOptionsT *SelectOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SelectOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SelectOptions::UnPackTo(SelectOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SelectOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSelectOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSelectOptions(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SelectOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSelectOptions( + _fbb); +} + +inline SliceOptionsT *SliceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SliceOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SliceOptions::UnPackTo(SliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SliceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSliceOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SliceOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSliceOptions( + _fbb); +} + +inline TransposeConvOptionsT *TransposeConvOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new TransposeConvOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void TransposeConvOptions::UnPackTo(TransposeConvOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = padding(); + _o->padding = _e; + } + { + auto _e = stride_w(); + _o->stride_w = _e; + } + { + auto _e = stride_h(); + _o->stride_h = _e; + } +} + +inline flatbuffers::Offset TransposeConvOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateTransposeConvOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateTransposeConvOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const TransposeConvOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _padding = _o->padding; + auto _stride_w = _o->stride_w; + auto _stride_h = _o->stride_h; + return tflite::CreateTransposeConvOptions( + _fbb, + _padding, + _stride_w, + _stride_h); +} + +inline ExpandDimsOptionsT *ExpandDimsOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ExpandDimsOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ExpandDimsOptions::UnPackTo(ExpandDimsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset ExpandDimsOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateExpandDimsOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateExpandDimsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ExpandDimsOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateExpandDimsOptions( + _fbb); +} + +inline SparseToDenseOptionsT *SparseToDenseOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SparseToDenseOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SparseToDenseOptions::UnPackTo(SparseToDenseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = validate_indices(); + _o->validate_indices = _e; + } +} + +inline flatbuffers::Offset SparseToDenseOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSparseToDenseOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSparseToDenseOptions(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SparseToDenseOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _validate_indices = _o->validate_indices; + return tflite::CreateSparseToDenseOptions( + _fbb, + _validate_indices); +} + +inline EqualOptionsT *EqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new EqualOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void EqualOptions::UnPackTo(EqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset EqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateEqualOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const EqualOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateEqualOptions( + _fbb); +} + +inline NotEqualOptionsT *NotEqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new NotEqualOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void NotEqualOptions::UnPackTo(NotEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset NotEqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateNotEqualOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateNotEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const NotEqualOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateNotEqualOptions( + _fbb); +} + +inline ShapeOptionsT *ShapeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ShapeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ShapeOptions::UnPackTo(ShapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = out_type(); + _o->out_type = _e; + } +} + +inline flatbuffers::Offset ShapeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateShapeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateShapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ShapeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _out_type = _o->out_type; + return tflite::CreateShapeOptions( + _fbb, + _out_type); +} + +inline RankOptionsT *RankOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new RankOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void RankOptions::UnPackTo(RankOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset RankOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateRankOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateRankOptions(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const RankOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateRankOptions( + _fbb); +} + +inline PowOptionsT *PowOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new PowOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void PowOptions::UnPackTo(PowOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset PowOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreatePowOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreatePowOptions(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const PowOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreatePowOptions( + _fbb); +} + +inline FakeQuantOptionsT *FakeQuantOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new FakeQuantOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void FakeQuantOptions::UnPackTo(FakeQuantOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = min(); + _o->min = _e; + } + { + auto _e = max(); + _o->max = _e; + } + { + auto _e = num_bits(); + _o->num_bits = _e; + } + { + auto _e = narrow_range(); + _o->narrow_range = _e; + } +} + +inline flatbuffers::Offset FakeQuantOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateFakeQuantOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateFakeQuantOptions(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const FakeQuantOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _min = _o->min; + auto _max = _o->max; + auto _num_bits = _o->num_bits; + auto _narrow_range = _o->narrow_range; + return tflite::CreateFakeQuantOptions( + _fbb, + _min, + _max, + _num_bits, + _narrow_range); +} + +inline PackOptionsT *PackOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new PackOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void PackOptions::UnPackTo(PackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = values_count(); + _o->values_count = _e; + } + { + auto _e = axis(); + _o->axis = _e; + } +} + +inline flatbuffers::Offset PackOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreatePackOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreatePackOptions(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const PackOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _values_count = _o->values_count; + auto _axis = _o->axis; + return tflite::CreatePackOptions( + _fbb, + _values_count, + _axis); +} + +inline LogicalOrOptionsT *LogicalOrOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LogicalOrOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LogicalOrOptions::UnPackTo(LogicalOrOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset LogicalOrOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLogicalOrOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLogicalOrOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LogicalOrOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateLogicalOrOptions( + _fbb); +} + +inline OneHotOptionsT *OneHotOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new OneHotOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void OneHotOptions::UnPackTo(OneHotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = axis(); + _o->axis = _e; + } +} + +inline flatbuffers::Offset OneHotOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateOneHotOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateOneHotOptions(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const OneHotOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _axis = _o->axis; + return tflite::CreateOneHotOptions( + _fbb, + _axis); +} + +inline AbsOptionsT *AbsOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new AbsOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void AbsOptions::UnPackTo(AbsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset AbsOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateAbsOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateAbsOptions(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const AbsOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateAbsOptions( + _fbb); +} + +inline HardSwishOptionsT *HardSwishOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new HardSwishOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void HardSwishOptions::UnPackTo(HardSwishOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset HardSwishOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateHardSwishOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateHardSwishOptions(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const HardSwishOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateHardSwishOptions( + _fbb); +} + +inline LogicalAndOptionsT *LogicalAndOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LogicalAndOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LogicalAndOptions::UnPackTo(LogicalAndOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset LogicalAndOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLogicalAndOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLogicalAndOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LogicalAndOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateLogicalAndOptions( + _fbb); +} + +inline LogicalNotOptionsT *LogicalNotOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LogicalNotOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LogicalNotOptions::UnPackTo(LogicalNotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset LogicalNotOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLogicalNotOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLogicalNotOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LogicalNotOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateLogicalNotOptions( + _fbb); +} + +inline UnpackOptionsT *UnpackOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new UnpackOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void UnpackOptions::UnPackTo(UnpackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = num(); + _o->num = _e; + } + { + auto _e = axis(); + _o->axis = _e; + } +} + +inline flatbuffers::Offset UnpackOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateUnpackOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateUnpackOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const UnpackOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _num = _o->num; + auto _axis = _o->axis; + return tflite::CreateUnpackOptions( + _fbb, + _num, + _axis); +} + +inline FloorDivOptionsT *FloorDivOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new FloorDivOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void FloorDivOptions::UnPackTo(FloorDivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset FloorDivOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateFloorDivOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateFloorDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const FloorDivOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateFloorDivOptions( + _fbb); +} + +inline SquareOptionsT *SquareOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SquareOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SquareOptions::UnPackTo(SquareOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SquareOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSquareOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSquareOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SquareOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSquareOptions( + _fbb); +} + +inline ZerosLikeOptionsT *ZerosLikeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ZerosLikeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ZerosLikeOptions::UnPackTo(ZerosLikeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset ZerosLikeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateZerosLikeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateZerosLikeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ZerosLikeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateZerosLikeOptions( + _fbb); +} + +inline FillOptionsT *FillOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new FillOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void FillOptions::UnPackTo(FillOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset FillOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateFillOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateFillOptions(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const FillOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateFillOptions( + _fbb); +} + +inline FloorModOptionsT *FloorModOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new FloorModOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void FloorModOptions::UnPackTo(FloorModOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset FloorModOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateFloorModOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateFloorModOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const FloorModOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateFloorModOptions( + _fbb); +} + +inline RangeOptionsT *RangeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new RangeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void RangeOptions::UnPackTo(RangeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset RangeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateRangeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateRangeOptions(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const RangeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateRangeOptions( + _fbb); +} + +inline LeakyReluOptionsT *LeakyReluOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new LeakyReluOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void LeakyReluOptions::UnPackTo(LeakyReluOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = alpha(); + _o->alpha = _e; + } +} + +inline flatbuffers::Offset LeakyReluOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateLeakyReluOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateLeakyReluOptions(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const LeakyReluOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _alpha = _o->alpha; + return tflite::CreateLeakyReluOptions( + _fbb, + _alpha); +} + +inline SquaredDifferenceOptionsT *SquaredDifferenceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SquaredDifferenceOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SquaredDifferenceOptions::UnPackTo(SquaredDifferenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SquaredDifferenceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSquaredDifferenceOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSquaredDifferenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SquaredDifferenceOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSquaredDifferenceOptions( + _fbb); +} + +inline MirrorPadOptionsT *MirrorPadOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new MirrorPadOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void MirrorPadOptions::UnPackTo(MirrorPadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = mode(); + _o->mode = _e; + } +} + +inline flatbuffers::Offset MirrorPadOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateMirrorPadOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateMirrorPadOptions(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const MirrorPadOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _mode = _o->mode; + return tflite::CreateMirrorPadOptions( + _fbb, + _mode); +} + +inline UniqueOptionsT *UniqueOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new UniqueOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void UniqueOptions::UnPackTo(UniqueOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = idx_out_type(); + _o->idx_out_type = _e; + } +} + +inline flatbuffers::Offset UniqueOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateUniqueOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateUniqueOptions(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const UniqueOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _idx_out_type = _o->idx_out_type; + return tflite::CreateUniqueOptions( + _fbb, + _idx_out_type); +} + +inline ReverseV2OptionsT *ReverseV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ReverseV2OptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ReverseV2Options::UnPackTo(ReverseV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset ReverseV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateReverseV2Options(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateReverseV2Options(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ReverseV2OptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateReverseV2Options( + _fbb); +} + +inline AddNOptionsT *AddNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new AddNOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void AddNOptions::UnPackTo(AddNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset AddNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateAddNOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateAddNOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const AddNOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateAddNOptions( + _fbb); +} + +inline GatherNdOptionsT *GatherNdOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new GatherNdOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void GatherNdOptions::UnPackTo(GatherNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset GatherNdOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateGatherNdOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateGatherNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const GatherNdOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateGatherNdOptions( + _fbb); +} + +inline WhereOptionsT *WhereOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new WhereOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void WhereOptions::UnPackTo(WhereOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset WhereOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateWhereOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateWhereOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const WhereOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateWhereOptions( + _fbb); +} + +inline ReverseSequenceOptionsT *ReverseSequenceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ReverseSequenceOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ReverseSequenceOptions::UnPackTo(ReverseSequenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = seq_dim(); + _o->seq_dim = _e; + } + { + auto _e = batch_dim(); + _o->batch_dim = _e; + } +} + +inline flatbuffers::Offset ReverseSequenceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateReverseSequenceOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateReverseSequenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ReverseSequenceOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _seq_dim = _o->seq_dim; + auto _batch_dim = _o->batch_dim; + return tflite::CreateReverseSequenceOptions( + _fbb, + _seq_dim, + _batch_dim); +} + +inline MatrixDiagOptionsT *MatrixDiagOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new MatrixDiagOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void MatrixDiagOptions::UnPackTo(MatrixDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset MatrixDiagOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateMatrixDiagOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateMatrixDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const MatrixDiagOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateMatrixDiagOptions( + _fbb); +} + +inline QuantizeOptionsT *QuantizeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new QuantizeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void QuantizeOptions::UnPackTo(QuantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset QuantizeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateQuantizeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateQuantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const QuantizeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateQuantizeOptions( + _fbb); +} + +inline MatrixSetDiagOptionsT *MatrixSetDiagOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new MatrixSetDiagOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void MatrixSetDiagOptions::UnPackTo(MatrixSetDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset MatrixSetDiagOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateMatrixSetDiagOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateMatrixSetDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const MatrixSetDiagOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateMatrixSetDiagOptions( + _fbb); +} + +inline IfOptionsT *IfOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new IfOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void IfOptions::UnPackTo(IfOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = then_subgraph_index(); + _o->then_subgraph_index = _e; + } + { + auto _e = else_subgraph_index(); + _o->else_subgraph_index = _e; + } +} + +inline flatbuffers::Offset IfOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateIfOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateIfOptions(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const IfOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _then_subgraph_index = _o->then_subgraph_index; + auto _else_subgraph_index = _o->else_subgraph_index; + return tflite::CreateIfOptions( + _fbb, + _then_subgraph_index, + _else_subgraph_index); +} + +inline CallOnceOptionsT *CallOnceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new CallOnceOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void CallOnceOptions::UnPackTo(CallOnceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = init_subgraph_index(); + _o->init_subgraph_index = _e; + } +} + +inline flatbuffers::Offset CallOnceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CallOnceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateCallOnceOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateCallOnceOptions(flatbuffers::FlatBufferBuilder &_fbb, const CallOnceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const CallOnceOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _init_subgraph_index = _o->init_subgraph_index; + return tflite::CreateCallOnceOptions( + _fbb, + _init_subgraph_index); +} + +inline WhileOptionsT *WhileOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new WhileOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void WhileOptions::UnPackTo(WhileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = cond_subgraph_index(); + _o->cond_subgraph_index = _e; + } + { + auto _e = body_subgraph_index(); + _o->body_subgraph_index = _e; + } +} + +inline flatbuffers::Offset WhileOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateWhileOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateWhileOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const WhileOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _cond_subgraph_index = _o->cond_subgraph_index; + auto _body_subgraph_index = _o->body_subgraph_index; + return tflite::CreateWhileOptions( + _fbb, + _cond_subgraph_index, + _body_subgraph_index); +} + +inline NonMaxSuppressionV4OptionsT *NonMaxSuppressionV4Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new NonMaxSuppressionV4OptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void NonMaxSuppressionV4Options::UnPackTo(NonMaxSuppressionV4OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset NonMaxSuppressionV4Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateNonMaxSuppressionV4Options(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateNonMaxSuppressionV4Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const NonMaxSuppressionV4OptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateNonMaxSuppressionV4Options( + _fbb); +} + +inline NonMaxSuppressionV5OptionsT *NonMaxSuppressionV5Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new NonMaxSuppressionV5OptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void NonMaxSuppressionV5Options::UnPackTo(NonMaxSuppressionV5OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset NonMaxSuppressionV5Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateNonMaxSuppressionV5Options(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateNonMaxSuppressionV5Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const NonMaxSuppressionV5OptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateNonMaxSuppressionV5Options( + _fbb); +} + +inline ScatterNdOptionsT *ScatterNdOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ScatterNdOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void ScatterNdOptions::UnPackTo(ScatterNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset ScatterNdOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateScatterNdOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateScatterNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ScatterNdOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateScatterNdOptions( + _fbb); +} + +inline SelectV2OptionsT *SelectV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SelectV2OptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SelectV2Options::UnPackTo(SelectV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SelectV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSelectV2Options(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSelectV2Options(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SelectV2OptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSelectV2Options( + _fbb); +} + +inline DensifyOptionsT *DensifyOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new DensifyOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void DensifyOptions::UnPackTo(DensifyOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset DensifyOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateDensifyOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateDensifyOptions(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const DensifyOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateDensifyOptions( + _fbb); +} + +inline SegmentSumOptionsT *SegmentSumOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SegmentSumOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SegmentSumOptions::UnPackTo(SegmentSumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset SegmentSumOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSegmentSumOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSegmentSumOptions(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SegmentSumOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateSegmentSumOptions( + _fbb); +} + +inline BatchMatMulOptionsT *BatchMatMulOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new BatchMatMulOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void BatchMatMulOptions::UnPackTo(BatchMatMulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = adj_x(); + _o->adj_x = _e; + } + { + auto _e = adj_y(); + _o->adj_y = _e; + } + { + auto _e = asymmetric_quantize_inputs(); + _o->asymmetric_quantize_inputs = _e; + } +} + +inline flatbuffers::Offset BatchMatMulOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateBatchMatMulOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateBatchMatMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const BatchMatMulOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _adj_x = _o->adj_x; + auto _adj_y = _o->adj_y; + auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; + return tflite::CreateBatchMatMulOptions( + _fbb, + _adj_x, + _adj_y, + _asymmetric_quantize_inputs); +} + +inline CumsumOptionsT *CumsumOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new CumsumOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void CumsumOptions::UnPackTo(CumsumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = exclusive(); + _o->exclusive = _e; + } + { + auto _e = reverse(); + _o->reverse = _e; + } +} + +inline flatbuffers::Offset CumsumOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CumsumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateCumsumOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateCumsumOptions(flatbuffers::FlatBufferBuilder &_fbb, const CumsumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const CumsumOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _exclusive = _o->exclusive; + auto _reverse = _o->reverse; + return tflite::CreateCumsumOptions( + _fbb, + _exclusive, + _reverse); +} + +inline BroadcastToOptionsT *BroadcastToOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new BroadcastToOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void BroadcastToOptions::UnPackTo(BroadcastToOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset BroadcastToOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BroadcastToOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateBroadcastToOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateBroadcastToOptions(flatbuffers::FlatBufferBuilder &_fbb, const BroadcastToOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const BroadcastToOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateBroadcastToOptions( + _fbb); +} + +inline Rfft2dOptionsT *Rfft2dOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new Rfft2dOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Rfft2dOptions::UnPackTo(Rfft2dOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset Rfft2dOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Rfft2dOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateRfft2dOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateRfft2dOptions(flatbuffers::FlatBufferBuilder &_fbb, const Rfft2dOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const Rfft2dOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateRfft2dOptions( + _fbb); +} + +inline HashtableOptionsT *HashtableOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new HashtableOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void HashtableOptions::UnPackTo(HashtableOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = table_id(); + _o->table_id = _e; + } + { + auto _e = key_dtype(); + _o->key_dtype = _e; + } + { + auto _e = value_dtype(); + _o->value_dtype = _e; + } +} + +inline flatbuffers::Offset HashtableOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateHashtableOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateHashtableOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const HashtableOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _table_id = _o->table_id; + auto _key_dtype = _o->key_dtype; + auto _value_dtype = _o->value_dtype; + return tflite::CreateHashtableOptions( + _fbb, + _table_id, + _key_dtype, + _value_dtype); +} + +inline HashtableFindOptionsT *HashtableFindOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new HashtableFindOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void HashtableFindOptions::UnPackTo(HashtableFindOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset HashtableFindOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableFindOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateHashtableFindOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateHashtableFindOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableFindOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const HashtableFindOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateHashtableFindOptions( + _fbb); +} + +inline HashtableImportOptionsT *HashtableImportOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new HashtableImportOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void HashtableImportOptions::UnPackTo(HashtableImportOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset HashtableImportOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableImportOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateHashtableImportOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateHashtableImportOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableImportOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const HashtableImportOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateHashtableImportOptions( + _fbb); +} + +inline HashtableSizeOptionsT *HashtableSizeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new HashtableSizeOptionsT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void HashtableSizeOptions::UnPackTo(HashtableSizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; +} + +inline flatbuffers::Offset HashtableSizeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const HashtableSizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateHashtableSizeOptions(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateHashtableSizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const HashtableSizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const HashtableSizeOptionsT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + return tflite::CreateHashtableSizeOptions( + _fbb); +} + +inline OperatorCodeT *OperatorCode::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new OperatorCodeT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void OperatorCode::UnPackTo(OperatorCodeT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = deprecated_builtin_code(); + _o->deprecated_builtin_code = _e; + } + { + auto _e = custom_code(); + if (_e) + _o->custom_code = _e->str(); + } + { + auto _e = version(); + _o->version = _e; + } + { + auto _e = builtin_code(); + _o->builtin_code = _e; + } +} + +inline flatbuffers::Offset OperatorCode::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateOperatorCode(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateOperatorCode(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const OperatorCodeT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _deprecated_builtin_code = _o->deprecated_builtin_code; + auto _custom_code = _o->custom_code.empty() ? 0 : _fbb.CreateString(_o->custom_code); + auto _version = _o->version; + auto _builtin_code = _o->builtin_code; + return tflite::CreateOperatorCode( + _fbb, + _deprecated_builtin_code, + _custom_code, + _version, + _builtin_code); +} + +inline OperatorT *Operator::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new OperatorT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Operator::UnPackTo(OperatorT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = opcode_index(); + _o->opcode_index = _e; + } + { + auto _e = inputs(); + if (_e) { + _o->inputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->inputs[_i] = _e->Get(_i); + } + } + } + { + auto _e = outputs(); + if (_e) { + _o->outputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->outputs[_i] = _e->Get(_i); + } + } + } + { + auto _e = builtin_options_type(); + _o->builtin_options.type = _e; + } + { + auto _e = builtin_options(); + if (_e) + _o->builtin_options.value = tflite::BuiltinOptionsUnion::UnPack(_e, builtin_options_type(), _resolver); + } + { + auto _e = custom_options(); + if (_e) { + _o->custom_options.resize(_e->size()); + std::copy(_e->begin(), _e->end(), _o->custom_options.begin()); + } + } + { + auto _e = custom_options_format(); + _o->custom_options_format = _e; + } + { + auto _e = mutating_variable_inputs(); + if (_e) { + _o->mutating_variable_inputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->mutating_variable_inputs[_i] = _e->Get(_i) != 0; + } + } + } + { + auto _e = intermediates(); + if (_e) { + _o->intermediates.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->intermediates[_i] = _e->Get(_i); + } + } + } +} + +inline flatbuffers::Offset Operator::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateOperator(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateOperator(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const OperatorT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _opcode_index = _o->opcode_index; + auto _inputs = _o->inputs.size() ? _fbb.CreateVector(_o->inputs) : 0; + auto _outputs = _o->outputs.size() ? _fbb.CreateVector(_o->outputs) : 0; + auto _builtin_options_type = _o->builtin_options.type; + auto _builtin_options = _o->builtin_options.Pack(_fbb); + auto _custom_options = _o->custom_options.size() ? _fbb.CreateVector(_o->custom_options) : 0; + auto _custom_options_format = _o->custom_options_format; + auto _mutating_variable_inputs = _o->mutating_variable_inputs.size() ? _fbb.CreateVector(_o->mutating_variable_inputs) : 0; + auto _intermediates = _o->intermediates.size() ? _fbb.CreateVector(_o->intermediates) : 0; + return tflite::CreateOperator( + _fbb, + _opcode_index, + _inputs, + _outputs, + _builtin_options_type, + _builtin_options, + _custom_options, + _custom_options_format, + _mutating_variable_inputs, + _intermediates); +} + +inline SubGraphT *SubGraph::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SubGraphT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SubGraph::UnPackTo(SubGraphT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = tensors(); + if (_e) { + _o->tensors.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->tensors[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = inputs(); + if (_e) { + _o->inputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->inputs[_i] = _e->Get(_i); + } + } + } + { + auto _e = outputs(); + if (_e) { + _o->outputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->outputs[_i] = _e->Get(_i); + } + } + } + { + auto _e = operators(); + if (_e) { + _o->operators.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->operators[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = name(); + if (_e) + _o->name = _e->str(); + } +} + +inline flatbuffers::Offset SubGraph::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSubGraph(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSubGraph(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SubGraphT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _tensors = _o->tensors.size() ? _fbb.CreateVector >( + _o->tensors.size(), [](size_t i, _VectorArgs *__va) { return CreateTensor(*__va->__fbb, __va->__o->tensors[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _inputs = _o->inputs.size() ? _fbb.CreateVector(_o->inputs) : 0; + auto _outputs = _o->outputs.size() ? _fbb.CreateVector(_o->outputs) : 0; + auto _operators = _o->operators.size() ? _fbb.CreateVector >( + _o->operators.size(), [](size_t i, _VectorArgs *__va) { return CreateOperator(*__va->__fbb, __va->__o->operators[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); + return tflite::CreateSubGraph( + _fbb, + _tensors, + _inputs, + _outputs, + _operators, + _name); +} + +inline BufferT *Buffer::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new BufferT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Buffer::UnPackTo(BufferT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = data(); + if (_e) { + _o->data.resize(_e->size()); + std::copy(_e->begin(), _e->end(), _o->data.begin()); + } + } +} + +inline flatbuffers::Offset Buffer::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateBuffer(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateBuffer(flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const BufferT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + _fbb.ForceVectorAlignment(_o->data.size(), sizeof(uint8_t), 16); + auto _data = _o->data.size() ? _fbb.CreateVector(_o->data) : 0; + return tflite::CreateBuffer( + _fbb, + _data); +} + +inline MetadataT *Metadata::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new MetadataT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Metadata::UnPackTo(MetadataT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = name(); + if (_e) + _o->name = _e->str(); + } + { + auto _e = buffer(); + _o->buffer = _e; + } +} + +inline flatbuffers::Offset Metadata::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateMetadata(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateMetadata(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const MetadataT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); + auto _buffer = _o->buffer; + return tflite::CreateMetadata( + _fbb, + _name, + _buffer); +} + +inline TensorMapT *TensorMap::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new TensorMapT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void TensorMap::UnPackTo(TensorMapT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = name(); + if (_e) + _o->name = _e->str(); + } + { + auto _e = tensor_index(); + _o->tensor_index = _e; + } +} + +inline flatbuffers::Offset TensorMap::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TensorMapT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateTensorMap(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateTensorMap(flatbuffers::FlatBufferBuilder &_fbb, const TensorMapT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const TensorMapT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); + auto _tensor_index = _o->tensor_index; + return tflite::CreateTensorMap( + _fbb, + _name, + _tensor_index); +} + +inline SignatureDefT *SignatureDef::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new SignatureDefT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void SignatureDef::UnPackTo(SignatureDefT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = inputs(); + if (_e) { + _o->inputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->inputs[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = outputs(); + if (_e) { + _o->outputs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->outputs[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = method_name(); + if (_e) + _o->method_name = _e->str(); + } + { + auto _e = key(); + if (_e) + _o->key = _e->str(); + } +} + +inline flatbuffers::Offset SignatureDef::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SignatureDefT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateSignatureDef(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateSignatureDef(flatbuffers::FlatBufferBuilder &_fbb, const SignatureDefT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const SignatureDefT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _inputs = _o->inputs.size() ? _fbb.CreateVector >( + _o->inputs.size(), [](size_t i, _VectorArgs *__va) { return CreateTensorMap(*__va->__fbb, __va->__o->inputs[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _outputs = _o->outputs.size() ? _fbb.CreateVector >( + _o->outputs.size(), [](size_t i, _VectorArgs *__va) { return CreateTensorMap(*__va->__fbb, __va->__o->outputs[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _method_name = _o->method_name.empty() ? 0 : _fbb.CreateString(_o->method_name); + auto _key = _o->key.empty() ? 0 : _fbb.CreateString(_o->key); + return tflite::CreateSignatureDef( + _fbb, + _inputs, + _outputs, + _method_name, + _key); +} + +inline ModelT *Model::UnPack(const flatbuffers::resolver_function_t *_resolver) const +{ + auto _o = new ModelT(); + UnPackTo(_o, _resolver); + return _o; +} + +inline void Model::UnPackTo(ModelT *_o, const flatbuffers::resolver_function_t *_resolver) const +{ + (void)_o; + (void)_resolver; + { + auto _e = version(); + _o->version = _e; + } + { + auto _e = operator_codes(); + if (_e) { + _o->operator_codes.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->operator_codes[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = subgraphs(); + if (_e) { + _o->subgraphs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->subgraphs[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = description(); + if (_e) + _o->description = _e->str(); + } + { + auto _e = buffers(); + if (_e) { + _o->buffers.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->buffers[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = metadata_buffer(); + if (_e) { + _o->metadata_buffer.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->metadata_buffer[_i] = _e->Get(_i); + } + } + } + { + auto _e = metadata(); + if (_e) { + _o->metadata.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->metadata[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } + { + auto _e = signature_defs(); + if (_e) { + _o->signature_defs.resize(_e->size()); + for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { + _o->signature_defs[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); + } + } + } +} + +inline flatbuffers::Offset Model::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + return CreateModel(_fbb, _o, _rehasher); +} + +inline flatbuffers::Offset CreateModel(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher) +{ + (void)_rehasher; + (void)_o; + struct _VectorArgs { + flatbuffers::FlatBufferBuilder *__fbb; + const ModelT *__o; + const flatbuffers::rehasher_function_t *__rehasher; + } _va = { &_fbb, _o, _rehasher }; + (void)_va; + auto _version = _o->version; + auto _operator_codes = _o->operator_codes.size() ? _fbb.CreateVector >( + _o->operator_codes.size(), [](size_t i, _VectorArgs *__va) { return CreateOperatorCode(*__va->__fbb, __va->__o->operator_codes[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _subgraphs = _o->subgraphs.size() ? _fbb.CreateVector >( + _o->subgraphs.size(), [](size_t i, _VectorArgs *__va) { return CreateSubGraph(*__va->__fbb, __va->__o->subgraphs[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _description = _o->description.empty() ? 0 : _fbb.CreateString(_o->description); + auto _buffers = _o->buffers.size() ? _fbb.CreateVector >( + _o->buffers.size(), [](size_t i, _VectorArgs *__va) { return CreateBuffer(*__va->__fbb, __va->__o->buffers[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _metadata_buffer = _o->metadata_buffer.size() ? _fbb.CreateVector(_o->metadata_buffer) : 0; + auto _metadata = _o->metadata.size() ? _fbb.CreateVector >( + _o->metadata.size(), [](size_t i, _VectorArgs *__va) { return CreateMetadata(*__va->__fbb, __va->__o->metadata[i].get(), __va->__rehasher); }, &_va) : + 0; + auto _signature_defs = _o->signature_defs.size() ? _fbb.CreateVector >( + _o->signature_defs.size(), [](size_t i, _VectorArgs *__va) { return CreateSignatureDef(*__va->__fbb, __va->__o->signature_defs[i].get(), __va->__rehasher); }, &_va) : + 0; + return tflite::CreateModel( + _fbb, + _version, + _operator_codes, + _subgraphs, + _description, + _buffers, + _metadata_buffer, + _metadata, + _signature_defs); +} + +inline bool VerifyQuantizationDetails(flatbuffers::Verifier &verifier, const void *obj, QuantizationDetails type) +{ + switch (type) { + case QuantizationDetails_NONE: { + return true; + } + case QuantizationDetails_CustomQuantization: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + default: + return true; + } +} + +inline bool VerifyQuantizationDetailsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector > *values, const flatbuffers::Vector *types) +{ + if (!values || !types) + return !values && !types; + if (values->size() != types->size()) + return false; + for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { + if (!VerifyQuantizationDetails( + verifier, values->Get(i), types->GetEnum(i))) { + return false; + } + } + return true; +} + +inline void *QuantizationDetailsUnion::UnPack(const void *obj, QuantizationDetails type, const flatbuffers::resolver_function_t *resolver) +{ + switch (type) { + case QuantizationDetails_CustomQuantization: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + default: + return nullptr; + } +} + +inline flatbuffers::Offset QuantizationDetailsUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const +{ + switch (type) { + case QuantizationDetails_CustomQuantization: { + auto ptr = reinterpret_cast(value); + return CreateCustomQuantization(_fbb, ptr, _rehasher).Union(); + } + default: + return 0; + } +} + +inline QuantizationDetailsUnion::QuantizationDetailsUnion(const QuantizationDetailsUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) +{ + switch (type) { + case QuantizationDetails_CustomQuantization: { + value = new tflite::CustomQuantizationT(*reinterpret_cast(u.value)); + break; + } + default: + break; + } +} + +inline void QuantizationDetailsUnion::Reset() +{ + switch (type) { + case QuantizationDetails_CustomQuantization: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + default: + break; + } + value = nullptr; + type = QuantizationDetails_NONE; +} + +inline bool VerifySparseIndexVector(flatbuffers::Verifier &verifier, const void *obj, SparseIndexVector type) +{ + switch (type) { + case SparseIndexVector_NONE: { + return true; + } + case SparseIndexVector_Int32Vector: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case SparseIndexVector_Uint16Vector: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case SparseIndexVector_Uint8Vector: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + default: + return true; + } +} + +inline bool VerifySparseIndexVectorVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector > *values, const flatbuffers::Vector *types) +{ + if (!values || !types) + return !values && !types; + if (values->size() != types->size()) + return false; + for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { + if (!VerifySparseIndexVector( + verifier, values->Get(i), types->GetEnum(i))) { + return false; + } + } + return true; +} + +inline void *SparseIndexVectorUnion::UnPack(const void *obj, SparseIndexVector type, const flatbuffers::resolver_function_t *resolver) +{ + switch (type) { + case SparseIndexVector_Int32Vector: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case SparseIndexVector_Uint16Vector: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case SparseIndexVector_Uint8Vector: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + default: + return nullptr; + } +} + +inline flatbuffers::Offset SparseIndexVectorUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const +{ + switch (type) { + case SparseIndexVector_Int32Vector: { + auto ptr = reinterpret_cast(value); + return CreateInt32Vector(_fbb, ptr, _rehasher).Union(); + } + case SparseIndexVector_Uint16Vector: { + auto ptr = reinterpret_cast(value); + return CreateUint16Vector(_fbb, ptr, _rehasher).Union(); + } + case SparseIndexVector_Uint8Vector: { + auto ptr = reinterpret_cast(value); + return CreateUint8Vector(_fbb, ptr, _rehasher).Union(); + } + default: + return 0; + } +} + +inline SparseIndexVectorUnion::SparseIndexVectorUnion(const SparseIndexVectorUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) +{ + switch (type) { + case SparseIndexVector_Int32Vector: { + value = new tflite::Int32VectorT(*reinterpret_cast(u.value)); + break; + } + case SparseIndexVector_Uint16Vector: { + value = new tflite::Uint16VectorT(*reinterpret_cast(u.value)); + break; + } + case SparseIndexVector_Uint8Vector: { + value = new tflite::Uint8VectorT(*reinterpret_cast(u.value)); + break; + } + default: + break; + } +} + +inline void SparseIndexVectorUnion::Reset() +{ + switch (type) { + case SparseIndexVector_Int32Vector: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case SparseIndexVector_Uint16Vector: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case SparseIndexVector_Uint8Vector: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + default: + break; + } + value = nullptr; + type = SparseIndexVector_NONE; +} + +inline bool VerifyBuiltinOptions(flatbuffers::Verifier &verifier, const void *obj, BuiltinOptions type) +{ + switch (type) { + case BuiltinOptions_NONE: { + return true; + } + case BuiltinOptions_Conv2DOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_DepthwiseConv2DOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ConcatEmbeddingsOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LSHProjectionOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_Pool2DOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SVDFOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_RNNOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_FullyConnectedOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SoftmaxOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ConcatenationOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_AddOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_L2NormOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LocalResponseNormalizationOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LSTMOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ResizeBilinearOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_CallOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ReshapeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SkipGramOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SpaceToDepthOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_EmbeddingLookupSparseOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_MulOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_PadOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_GatherOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_BatchToSpaceNDOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SpaceToBatchNDOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_TransposeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ReducerOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SubOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_DivOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SqueezeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SequenceRNNOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_StridedSliceOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ExpOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_TopKV2Options: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SplitOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LogSoftmaxOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_CastOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_DequantizeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_MaximumMinimumOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ArgMaxOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LessOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_NegOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_PadV2Options: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_GreaterOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_GreaterEqualOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LessEqualOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SelectOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SliceOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_TransposeConvOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SparseToDenseOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_TileOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ExpandDimsOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_EqualOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_NotEqualOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ShapeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_PowOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ArgMinOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_FakeQuantOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_PackOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LogicalOrOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_OneHotOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LogicalAndOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LogicalNotOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_UnpackOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_FloorDivOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SquareOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ZerosLikeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_FillOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_BidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_BidirectionalSequenceRNNOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_FloorModOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_RangeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ResizeNearestNeighborOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_LeakyReluOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SquaredDifferenceOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_MirrorPadOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_AbsOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SplitVOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_UniqueOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ReverseV2Options: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_AddNOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_GatherNdOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_CosOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_WhereOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_RankOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ReverseSequenceOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_MatrixDiagOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_QuantizeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_MatrixSetDiagOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_HardSwishOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_IfOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_WhileOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_DepthToSpaceOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_NonMaxSuppressionV4Options: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_NonMaxSuppressionV5Options: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_ScatterNdOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SelectV2Options: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_DensifyOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_SegmentSumOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_BatchMatMulOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_CumsumOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_CallOnceOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_BroadcastToOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_Rfft2dOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_Conv3DOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_HashtableOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_HashtableFindOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_HashtableImportOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + case BuiltinOptions_HashtableSizeOptions: { + auto ptr = reinterpret_cast(obj); + return verifier.VerifyTable(ptr); + } + default: + return true; + } +} + +inline bool VerifyBuiltinOptionsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector > *values, const flatbuffers::Vector *types) +{ + if (!values || !types) + return !values && !types; + if (values->size() != types->size()) + return false; + for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { + if (!VerifyBuiltinOptions( + verifier, values->Get(i), types->GetEnum(i))) { + return false; + } + } + return true; +} + +inline void *BuiltinOptionsUnion::UnPack(const void *obj, BuiltinOptions type, const flatbuffers::resolver_function_t *resolver) +{ + switch (type) { + case BuiltinOptions_Conv2DOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_DepthwiseConv2DOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ConcatEmbeddingsOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LSHProjectionOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_Pool2DOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SVDFOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_RNNOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_FullyConnectedOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SoftmaxOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ConcatenationOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_AddOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_L2NormOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LocalResponseNormalizationOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LSTMOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ResizeBilinearOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_CallOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ReshapeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SkipGramOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SpaceToDepthOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_EmbeddingLookupSparseOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_MulOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_PadOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_GatherOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_BatchToSpaceNDOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SpaceToBatchNDOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_TransposeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ReducerOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SubOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_DivOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SqueezeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SequenceRNNOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_StridedSliceOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ExpOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_TopKV2Options: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SplitOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LogSoftmaxOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_CastOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_DequantizeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_MaximumMinimumOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ArgMaxOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LessOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_NegOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_PadV2Options: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_GreaterOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_GreaterEqualOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LessEqualOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SelectOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SliceOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_TransposeConvOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SparseToDenseOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_TileOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ExpandDimsOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_EqualOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_NotEqualOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ShapeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_PowOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ArgMinOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_FakeQuantOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_PackOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LogicalOrOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_OneHotOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LogicalAndOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LogicalNotOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_UnpackOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_FloorDivOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SquareOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ZerosLikeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_FillOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_BidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_BidirectionalSequenceRNNOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_FloorModOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_RangeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ResizeNearestNeighborOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_LeakyReluOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SquaredDifferenceOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_MirrorPadOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_AbsOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SplitVOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_UniqueOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ReverseV2Options: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_AddNOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_GatherNdOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_CosOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_WhereOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_RankOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ReverseSequenceOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_MatrixDiagOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_QuantizeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_MatrixSetDiagOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_HardSwishOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_IfOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_WhileOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_DepthToSpaceOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_NonMaxSuppressionV4Options: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_NonMaxSuppressionV5Options: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_ScatterNdOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SelectV2Options: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_DensifyOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_SegmentSumOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_BatchMatMulOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_CumsumOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_CallOnceOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_BroadcastToOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_Rfft2dOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_Conv3DOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_HashtableOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_HashtableFindOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_HashtableImportOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + case BuiltinOptions_HashtableSizeOptions: { + auto ptr = reinterpret_cast(obj); + return ptr->UnPack(resolver); + } + default: + return nullptr; + } +} + +inline flatbuffers::Offset BuiltinOptionsUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const +{ + switch (type) { + case BuiltinOptions_Conv2DOptions: { + auto ptr = reinterpret_cast(value); + return CreateConv2DOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_DepthwiseConv2DOptions: { + auto ptr = reinterpret_cast(value); + return CreateDepthwiseConv2DOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ConcatEmbeddingsOptions: { + auto ptr = reinterpret_cast(value); + return CreateConcatEmbeddingsOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LSHProjectionOptions: { + auto ptr = reinterpret_cast(value); + return CreateLSHProjectionOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_Pool2DOptions: { + auto ptr = reinterpret_cast(value); + return CreatePool2DOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SVDFOptions: { + auto ptr = reinterpret_cast(value); + return CreateSVDFOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_RNNOptions: { + auto ptr = reinterpret_cast(value); + return CreateRNNOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_FullyConnectedOptions: { + auto ptr = reinterpret_cast(value); + return CreateFullyConnectedOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SoftmaxOptions: { + auto ptr = reinterpret_cast(value); + return CreateSoftmaxOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ConcatenationOptions: { + auto ptr = reinterpret_cast(value); + return CreateConcatenationOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_AddOptions: { + auto ptr = reinterpret_cast(value); + return CreateAddOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_L2NormOptions: { + auto ptr = reinterpret_cast(value); + return CreateL2NormOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LocalResponseNormalizationOptions: { + auto ptr = reinterpret_cast(value); + return CreateLocalResponseNormalizationOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LSTMOptions: { + auto ptr = reinterpret_cast(value); + return CreateLSTMOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ResizeBilinearOptions: { + auto ptr = reinterpret_cast(value); + return CreateResizeBilinearOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_CallOptions: { + auto ptr = reinterpret_cast(value); + return CreateCallOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ReshapeOptions: { + auto ptr = reinterpret_cast(value); + return CreateReshapeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SkipGramOptions: { + auto ptr = reinterpret_cast(value); + return CreateSkipGramOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SpaceToDepthOptions: { + auto ptr = reinterpret_cast(value); + return CreateSpaceToDepthOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_EmbeddingLookupSparseOptions: { + auto ptr = reinterpret_cast(value); + return CreateEmbeddingLookupSparseOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_MulOptions: { + auto ptr = reinterpret_cast(value); + return CreateMulOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_PadOptions: { + auto ptr = reinterpret_cast(value); + return CreatePadOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_GatherOptions: { + auto ptr = reinterpret_cast(value); + return CreateGatherOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_BatchToSpaceNDOptions: { + auto ptr = reinterpret_cast(value); + return CreateBatchToSpaceNDOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SpaceToBatchNDOptions: { + auto ptr = reinterpret_cast(value); + return CreateSpaceToBatchNDOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_TransposeOptions: { + auto ptr = reinterpret_cast(value); + return CreateTransposeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ReducerOptions: { + auto ptr = reinterpret_cast(value); + return CreateReducerOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SubOptions: { + auto ptr = reinterpret_cast(value); + return CreateSubOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_DivOptions: { + auto ptr = reinterpret_cast(value); + return CreateDivOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SqueezeOptions: { + auto ptr = reinterpret_cast(value); + return CreateSqueezeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SequenceRNNOptions: { + auto ptr = reinterpret_cast(value); + return CreateSequenceRNNOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_StridedSliceOptions: { + auto ptr = reinterpret_cast(value); + return CreateStridedSliceOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ExpOptions: { + auto ptr = reinterpret_cast(value); + return CreateExpOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_TopKV2Options: { + auto ptr = reinterpret_cast(value); + return CreateTopKV2Options(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SplitOptions: { + auto ptr = reinterpret_cast(value); + return CreateSplitOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LogSoftmaxOptions: { + auto ptr = reinterpret_cast(value); + return CreateLogSoftmaxOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_CastOptions: { + auto ptr = reinterpret_cast(value); + return CreateCastOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_DequantizeOptions: { + auto ptr = reinterpret_cast(value); + return CreateDequantizeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_MaximumMinimumOptions: { + auto ptr = reinterpret_cast(value); + return CreateMaximumMinimumOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ArgMaxOptions: { + auto ptr = reinterpret_cast(value); + return CreateArgMaxOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LessOptions: { + auto ptr = reinterpret_cast(value); + return CreateLessOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_NegOptions: { + auto ptr = reinterpret_cast(value); + return CreateNegOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_PadV2Options: { + auto ptr = reinterpret_cast(value); + return CreatePadV2Options(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_GreaterOptions: { + auto ptr = reinterpret_cast(value); + return CreateGreaterOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_GreaterEqualOptions: { + auto ptr = reinterpret_cast(value); + return CreateGreaterEqualOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LessEqualOptions: { + auto ptr = reinterpret_cast(value); + return CreateLessEqualOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SelectOptions: { + auto ptr = reinterpret_cast(value); + return CreateSelectOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SliceOptions: { + auto ptr = reinterpret_cast(value); + return CreateSliceOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_TransposeConvOptions: { + auto ptr = reinterpret_cast(value); + return CreateTransposeConvOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SparseToDenseOptions: { + auto ptr = reinterpret_cast(value); + return CreateSparseToDenseOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_TileOptions: { + auto ptr = reinterpret_cast(value); + return CreateTileOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ExpandDimsOptions: { + auto ptr = reinterpret_cast(value); + return CreateExpandDimsOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_EqualOptions: { + auto ptr = reinterpret_cast(value); + return CreateEqualOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_NotEqualOptions: { + auto ptr = reinterpret_cast(value); + return CreateNotEqualOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ShapeOptions: { + auto ptr = reinterpret_cast(value); + return CreateShapeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_PowOptions: { + auto ptr = reinterpret_cast(value); + return CreatePowOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ArgMinOptions: { + auto ptr = reinterpret_cast(value); + return CreateArgMinOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_FakeQuantOptions: { + auto ptr = reinterpret_cast(value); + return CreateFakeQuantOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_PackOptions: { + auto ptr = reinterpret_cast(value); + return CreatePackOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LogicalOrOptions: { + auto ptr = reinterpret_cast(value); + return CreateLogicalOrOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_OneHotOptions: { + auto ptr = reinterpret_cast(value); + return CreateOneHotOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LogicalAndOptions: { + auto ptr = reinterpret_cast(value); + return CreateLogicalAndOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LogicalNotOptions: { + auto ptr = reinterpret_cast(value); + return CreateLogicalNotOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_UnpackOptions: { + auto ptr = reinterpret_cast(value); + return CreateUnpackOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_FloorDivOptions: { + auto ptr = reinterpret_cast(value); + return CreateFloorDivOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SquareOptions: { + auto ptr = reinterpret_cast(value); + return CreateSquareOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ZerosLikeOptions: { + auto ptr = reinterpret_cast(value); + return CreateZerosLikeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_FillOptions: { + auto ptr = reinterpret_cast(value); + return CreateFillOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_BidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(value); + return CreateBidirectionalSequenceLSTMOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_BidirectionalSequenceRNNOptions: { + auto ptr = reinterpret_cast(value); + return CreateBidirectionalSequenceRNNOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(value); + return CreateUnidirectionalSequenceLSTMOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_FloorModOptions: { + auto ptr = reinterpret_cast(value); + return CreateFloorModOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_RangeOptions: { + auto ptr = reinterpret_cast(value); + return CreateRangeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ResizeNearestNeighborOptions: { + auto ptr = reinterpret_cast(value); + return CreateResizeNearestNeighborOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_LeakyReluOptions: { + auto ptr = reinterpret_cast(value); + return CreateLeakyReluOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SquaredDifferenceOptions: { + auto ptr = reinterpret_cast(value); + return CreateSquaredDifferenceOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_MirrorPadOptions: { + auto ptr = reinterpret_cast(value); + return CreateMirrorPadOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_AbsOptions: { + auto ptr = reinterpret_cast(value); + return CreateAbsOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SplitVOptions: { + auto ptr = reinterpret_cast(value); + return CreateSplitVOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_UniqueOptions: { + auto ptr = reinterpret_cast(value); + return CreateUniqueOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ReverseV2Options: { + auto ptr = reinterpret_cast(value); + return CreateReverseV2Options(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_AddNOptions: { + auto ptr = reinterpret_cast(value); + return CreateAddNOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_GatherNdOptions: { + auto ptr = reinterpret_cast(value); + return CreateGatherNdOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_CosOptions: { + auto ptr = reinterpret_cast(value); + return CreateCosOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_WhereOptions: { + auto ptr = reinterpret_cast(value); + return CreateWhereOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_RankOptions: { + auto ptr = reinterpret_cast(value); + return CreateRankOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ReverseSequenceOptions: { + auto ptr = reinterpret_cast(value); + return CreateReverseSequenceOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_MatrixDiagOptions: { + auto ptr = reinterpret_cast(value); + return CreateMatrixDiagOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_QuantizeOptions: { + auto ptr = reinterpret_cast(value); + return CreateQuantizeOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_MatrixSetDiagOptions: { + auto ptr = reinterpret_cast(value); + return CreateMatrixSetDiagOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_HardSwishOptions: { + auto ptr = reinterpret_cast(value); + return CreateHardSwishOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_IfOptions: { + auto ptr = reinterpret_cast(value); + return CreateIfOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_WhileOptions: { + auto ptr = reinterpret_cast(value); + return CreateWhileOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_DepthToSpaceOptions: { + auto ptr = reinterpret_cast(value); + return CreateDepthToSpaceOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_NonMaxSuppressionV4Options: { + auto ptr = reinterpret_cast(value); + return CreateNonMaxSuppressionV4Options(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_NonMaxSuppressionV5Options: { + auto ptr = reinterpret_cast(value); + return CreateNonMaxSuppressionV5Options(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_ScatterNdOptions: { + auto ptr = reinterpret_cast(value); + return CreateScatterNdOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SelectV2Options: { + auto ptr = reinterpret_cast(value); + return CreateSelectV2Options(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_DensifyOptions: { + auto ptr = reinterpret_cast(value); + return CreateDensifyOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_SegmentSumOptions: { + auto ptr = reinterpret_cast(value); + return CreateSegmentSumOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_BatchMatMulOptions: { + auto ptr = reinterpret_cast(value); + return CreateBatchMatMulOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_CumsumOptions: { + auto ptr = reinterpret_cast(value); + return CreateCumsumOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_CallOnceOptions: { + auto ptr = reinterpret_cast(value); + return CreateCallOnceOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_BroadcastToOptions: { + auto ptr = reinterpret_cast(value); + return CreateBroadcastToOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_Rfft2dOptions: { + auto ptr = reinterpret_cast(value); + return CreateRfft2dOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_Conv3DOptions: { + auto ptr = reinterpret_cast(value); + return CreateConv3DOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_HashtableOptions: { + auto ptr = reinterpret_cast(value); + return CreateHashtableOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_HashtableFindOptions: { + auto ptr = reinterpret_cast(value); + return CreateHashtableFindOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_HashtableImportOptions: { + auto ptr = reinterpret_cast(value); + return CreateHashtableImportOptions(_fbb, ptr, _rehasher).Union(); + } + case BuiltinOptions_HashtableSizeOptions: { + auto ptr = reinterpret_cast(value); + return CreateHashtableSizeOptions(_fbb, ptr, _rehasher).Union(); + } + default: + return 0; + } +} + +inline BuiltinOptionsUnion::BuiltinOptionsUnion(const BuiltinOptionsUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) +{ + switch (type) { + case BuiltinOptions_Conv2DOptions: { + value = new tflite::Conv2DOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_DepthwiseConv2DOptions: { + value = new tflite::DepthwiseConv2DOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ConcatEmbeddingsOptions: { + value = new tflite::ConcatEmbeddingsOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LSHProjectionOptions: { + value = new tflite::LSHProjectionOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_Pool2DOptions: { + value = new tflite::Pool2DOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SVDFOptions: { + value = new tflite::SVDFOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_RNNOptions: { + value = new tflite::RNNOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_FullyConnectedOptions: { + value = new tflite::FullyConnectedOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SoftmaxOptions: { + value = new tflite::SoftmaxOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ConcatenationOptions: { + value = new tflite::ConcatenationOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_AddOptions: { + value = new tflite::AddOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_L2NormOptions: { + value = new tflite::L2NormOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LocalResponseNormalizationOptions: { + value = new tflite::LocalResponseNormalizationOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LSTMOptions: { + value = new tflite::LSTMOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ResizeBilinearOptions: { + value = new tflite::ResizeBilinearOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_CallOptions: { + value = new tflite::CallOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ReshapeOptions: { + value = new tflite::ReshapeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SkipGramOptions: { + value = new tflite::SkipGramOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SpaceToDepthOptions: { + value = new tflite::SpaceToDepthOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_EmbeddingLookupSparseOptions: { + value = new tflite::EmbeddingLookupSparseOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_MulOptions: { + value = new tflite::MulOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_PadOptions: { + value = new tflite::PadOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_GatherOptions: { + value = new tflite::GatherOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_BatchToSpaceNDOptions: { + value = new tflite::BatchToSpaceNDOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SpaceToBatchNDOptions: { + value = new tflite::SpaceToBatchNDOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_TransposeOptions: { + value = new tflite::TransposeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ReducerOptions: { + value = new tflite::ReducerOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SubOptions: { + value = new tflite::SubOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_DivOptions: { + value = new tflite::DivOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SqueezeOptions: { + value = new tflite::SqueezeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SequenceRNNOptions: { + value = new tflite::SequenceRNNOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_StridedSliceOptions: { + value = new tflite::StridedSliceOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ExpOptions: { + value = new tflite::ExpOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_TopKV2Options: { + value = new tflite::TopKV2OptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SplitOptions: { + value = new tflite::SplitOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LogSoftmaxOptions: { + value = new tflite::LogSoftmaxOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_CastOptions: { + value = new tflite::CastOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_DequantizeOptions: { + value = new tflite::DequantizeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_MaximumMinimumOptions: { + value = new tflite::MaximumMinimumOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ArgMaxOptions: { + value = new tflite::ArgMaxOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LessOptions: { + value = new tflite::LessOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_NegOptions: { + value = new tflite::NegOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_PadV2Options: { + value = new tflite::PadV2OptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_GreaterOptions: { + value = new tflite::GreaterOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_GreaterEqualOptions: { + value = new tflite::GreaterEqualOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LessEqualOptions: { + value = new tflite::LessEqualOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SelectOptions: { + value = new tflite::SelectOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SliceOptions: { + value = new tflite::SliceOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_TransposeConvOptions: { + value = new tflite::TransposeConvOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SparseToDenseOptions: { + value = new tflite::SparseToDenseOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_TileOptions: { + value = new tflite::TileOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ExpandDimsOptions: { + value = new tflite::ExpandDimsOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_EqualOptions: { + value = new tflite::EqualOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_NotEqualOptions: { + value = new tflite::NotEqualOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ShapeOptions: { + value = new tflite::ShapeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_PowOptions: { + value = new tflite::PowOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ArgMinOptions: { + value = new tflite::ArgMinOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_FakeQuantOptions: { + value = new tflite::FakeQuantOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_PackOptions: { + value = new tflite::PackOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LogicalOrOptions: { + value = new tflite::LogicalOrOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_OneHotOptions: { + value = new tflite::OneHotOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LogicalAndOptions: { + value = new tflite::LogicalAndOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LogicalNotOptions: { + value = new tflite::LogicalNotOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_UnpackOptions: { + value = new tflite::UnpackOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_FloorDivOptions: { + value = new tflite::FloorDivOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SquareOptions: { + value = new tflite::SquareOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ZerosLikeOptions: { + value = new tflite::ZerosLikeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_FillOptions: { + value = new tflite::FillOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_BidirectionalSequenceLSTMOptions: { + value = new tflite::BidirectionalSequenceLSTMOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_BidirectionalSequenceRNNOptions: { + value = new tflite::BidirectionalSequenceRNNOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { + value = new tflite::UnidirectionalSequenceLSTMOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_FloorModOptions: { + value = new tflite::FloorModOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_RangeOptions: { + value = new tflite::RangeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ResizeNearestNeighborOptions: { + value = new tflite::ResizeNearestNeighborOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_LeakyReluOptions: { + value = new tflite::LeakyReluOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SquaredDifferenceOptions: { + value = new tflite::SquaredDifferenceOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_MirrorPadOptions: { + value = new tflite::MirrorPadOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_AbsOptions: { + value = new tflite::AbsOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SplitVOptions: { + value = new tflite::SplitVOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_UniqueOptions: { + value = new tflite::UniqueOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ReverseV2Options: { + value = new tflite::ReverseV2OptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_AddNOptions: { + value = new tflite::AddNOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_GatherNdOptions: { + value = new tflite::GatherNdOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_CosOptions: { + value = new tflite::CosOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_WhereOptions: { + value = new tflite::WhereOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_RankOptions: { + value = new tflite::RankOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ReverseSequenceOptions: { + value = new tflite::ReverseSequenceOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_MatrixDiagOptions: { + value = new tflite::MatrixDiagOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_QuantizeOptions: { + value = new tflite::QuantizeOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_MatrixSetDiagOptions: { + value = new tflite::MatrixSetDiagOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_HardSwishOptions: { + value = new tflite::HardSwishOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_IfOptions: { + value = new tflite::IfOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_WhileOptions: { + value = new tflite::WhileOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_DepthToSpaceOptions: { + value = new tflite::DepthToSpaceOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_NonMaxSuppressionV4Options: { + value = new tflite::NonMaxSuppressionV4OptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_NonMaxSuppressionV5Options: { + value = new tflite::NonMaxSuppressionV5OptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_ScatterNdOptions: { + value = new tflite::ScatterNdOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SelectV2Options: { + value = new tflite::SelectV2OptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_DensifyOptions: { + value = new tflite::DensifyOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_SegmentSumOptions: { + value = new tflite::SegmentSumOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_BatchMatMulOptions: { + value = new tflite::BatchMatMulOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_CumsumOptions: { + value = new tflite::CumsumOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_CallOnceOptions: { + value = new tflite::CallOnceOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_BroadcastToOptions: { + value = new tflite::BroadcastToOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_Rfft2dOptions: { + value = new tflite::Rfft2dOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_Conv3DOptions: { + value = new tflite::Conv3DOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_HashtableOptions: { + value = new tflite::HashtableOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_HashtableFindOptions: { + value = new tflite::HashtableFindOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_HashtableImportOptions: { + value = new tflite::HashtableImportOptionsT(*reinterpret_cast(u.value)); + break; + } + case BuiltinOptions_HashtableSizeOptions: { + value = new tflite::HashtableSizeOptionsT(*reinterpret_cast(u.value)); + break; + } + default: + break; + } +} + +inline void BuiltinOptionsUnion::Reset() +{ + switch (type) { + case BuiltinOptions_Conv2DOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_DepthwiseConv2DOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ConcatEmbeddingsOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LSHProjectionOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_Pool2DOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SVDFOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_RNNOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_FullyConnectedOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SoftmaxOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ConcatenationOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_AddOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_L2NormOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LocalResponseNormalizationOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LSTMOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ResizeBilinearOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_CallOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ReshapeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SkipGramOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SpaceToDepthOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_EmbeddingLookupSparseOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_MulOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_PadOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_GatherOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_BatchToSpaceNDOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SpaceToBatchNDOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_TransposeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ReducerOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SubOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_DivOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SqueezeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SequenceRNNOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_StridedSliceOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ExpOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_TopKV2Options: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SplitOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LogSoftmaxOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_CastOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_DequantizeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_MaximumMinimumOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ArgMaxOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LessOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_NegOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_PadV2Options: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_GreaterOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_GreaterEqualOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LessEqualOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SelectOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SliceOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_TransposeConvOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SparseToDenseOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_TileOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ExpandDimsOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_EqualOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_NotEqualOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ShapeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_PowOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ArgMinOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_FakeQuantOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_PackOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LogicalOrOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_OneHotOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LogicalAndOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LogicalNotOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_UnpackOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_FloorDivOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SquareOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ZerosLikeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_FillOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_BidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_BidirectionalSequenceRNNOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_FloorModOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_RangeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ResizeNearestNeighborOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_LeakyReluOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SquaredDifferenceOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_MirrorPadOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_AbsOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SplitVOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_UniqueOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ReverseV2Options: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_AddNOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_GatherNdOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_CosOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_WhereOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_RankOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ReverseSequenceOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_MatrixDiagOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_QuantizeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_MatrixSetDiagOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_HardSwishOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_IfOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_WhileOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_DepthToSpaceOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_NonMaxSuppressionV4Options: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_NonMaxSuppressionV5Options: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_ScatterNdOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SelectV2Options: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_DensifyOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_SegmentSumOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_BatchMatMulOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_CumsumOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_CallOnceOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_BroadcastToOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_Rfft2dOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_Conv3DOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_HashtableOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_HashtableFindOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_HashtableImportOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + case BuiltinOptions_HashtableSizeOptions: { + auto ptr = reinterpret_cast(value); + delete ptr; + break; + } + default: + break; + } + value = nullptr; + type = BuiltinOptions_NONE; +} + +inline const tflite::Model *GetModel(const void *buf) +{ + return flatbuffers::GetRoot(buf); +} + +inline const tflite::Model *GetSizePrefixedModel(const void *buf) +{ + return flatbuffers::GetSizePrefixedRoot(buf); +} + +inline const char *ModelIdentifier() +{ + return "TFL3"; +} + +inline bool ModelBufferHasIdentifier(const void *buf) +{ + return flatbuffers::BufferHasIdentifier( + buf, ModelIdentifier()); +} + +inline bool VerifyModelBuffer( + flatbuffers::Verifier &verifier) +{ + return verifier.VerifyBuffer(ModelIdentifier()); +} + +inline bool VerifySizePrefixedModelBuffer( + flatbuffers::Verifier &verifier) +{ + return verifier.VerifySizePrefixedBuffer(ModelIdentifier()); +} + +inline const char *ModelExtension() +{ + return "tflite"; +} + +inline void FinishModelBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) +{ + fbb.Finish(root, ModelIdentifier()); +} + +inline void FinishSizePrefixedModelBuffer( + flatbuffers::FlatBufferBuilder &fbb, + flatbuffers::Offset root) +{ + fbb.FinishSizePrefixed(root, ModelIdentifier()); +} + +inline std::unique_ptr UnPackModel( + const void *buf, + const flatbuffers::resolver_function_t *res = nullptr) +{ + return std::unique_ptr(GetModel(buf)->UnPack(res)); +} + +inline std::unique_ptr UnPackSizePrefixedModel( + const void *buf, + const flatbuffers::resolver_function_t *res = nullptr) +{ + return std::unique_ptr(GetSizePrefixedModel(buf)->UnPack(res)); +} + +} // namespace tflite + +#endif // FLATBUFFERS_GENERATED_SCHEMA_TFLITE_H_ diff --git a/components/TensorFlowLite/tensorflow/lite/schema/schema_utils.cc b/components/TensorFlowLite/tensorflow/lite/schema/schema_utils.cc new file mode 100644 index 00000000..40f7caab --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/schema/schema_utils.cc @@ -0,0 +1,64 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#include "tensorflow/lite/schema/schema_utils.h" + +#include + +#include "tensorflow/lite/kernels/internal/compatibility.h" + +namespace tflite { + +// The following GetBuiltinCode methods are the utility methods for reading +// builtin operatore code, ensuring compatibility issues between v3 and v3a +// schema. Always the maximum value of the two fields always will be the correct +// value as follows: +// +// - Supporting schema version v3 models +// +// The `builtin_code` field is not available in the v3 models. Flatbuffer +// library will feed zero value, which is the default value in the v3a schema. +// The actual builtin operatore code value will exist in the +// `deprecated_builtin_code` field. At the same time, it implies that +// `deprecated_builtin_code` >= `builtin_code` and the maximum value of the two +// fields will be same with `deprecated_builtin_code'. +// +// - Supporting builtin operator codes beyonds 127 +// +// New builtin operators, whose operator code is larger than 127, can not be +// assigned to the `deprecated_builtin_code` field. In such cases, the +// value of the `builtin_code` field should be used for the builtin operator +// code. In the case, the maximum value of the two fields will be the value of +// the `builtin_code` as the right value. + +BuiltinOperator GetBuiltinCode(const OperatorCode *op_code) +{ + // Caller should guarantee that the given argument value is not a nullptr. + TFLITE_DCHECK(op_code != nullptr); + + return std::max( + op_code->builtin_code(), + static_cast(op_code->deprecated_builtin_code())); +} + +BuiltinOperator GetBuiltinCode(const OperatorCodeT *op_code) +{ + // Caller should guarantee that the given argument value is not a nullptr. + TFLITE_DCHECK(op_code != nullptr); + + return std::max(op_code->builtin_code, static_cast( + op_code->deprecated_builtin_code)); +} + +} // namespace tflite diff --git a/components/TensorFlowLite/tensorflow/lite/schema/schema_utils.h b/components/TensorFlowLite/tensorflow/lite/schema/schema_utils.h new file mode 100644 index 00000000..54b375a1 --- /dev/null +++ b/components/TensorFlowLite/tensorflow/lite/schema/schema_utils.h @@ -0,0 +1,32 @@ +/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_LITE_SCHEMA_SCHEMA_UTILS_H_ +#define TENSORFLOW_LITE_SCHEMA_SCHEMA_UTILS_H_ + +#include "flatbuffers/flatbuffers.h" +#include "tensorflow/lite/schema/schema_generated.h" + +namespace tflite { +// The following methods are introduced to resolve op builtin code shortage +// problem. The new builtin operator will be assigned to the extended builtin +// code field in the flatbuffer schema. Those methods helps to hide builtin code +// details. +BuiltinOperator GetBuiltinCode(const OperatorCode *op_code); + +BuiltinOperator GetBuiltinCode(const OperatorCodeT *op_code); + +} // namespace tflite + +#endif // TENSORFLOW_LITE_SCHEMA_SCHEMA_UTILS_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/base.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/base.h new file mode 100644 index 00000000..8e97c084 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/base.h @@ -0,0 +1,427 @@ +#ifndef FLATBUFFERS_BASE_H_ +#define FLATBUFFERS_BASE_H_ + +// clang-format off + +// If activate should be declared and included first. +#if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \ + defined(_MSC_VER) && defined(_DEBUG) + // The _CRTDBG_MAP_ALLOC inside will replace + // calloc/free (etc) to its debug version using #define directives. + #define _CRTDBG_MAP_ALLOC + #include + #include + // Replace operator new by trace-enabled version. + #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) + #define new DEBUG_NEW +#endif + +#if !defined(FLATBUFFERS_ASSERT) +#include +#define FLATBUFFERS_ASSERT assert +#elif defined(FLATBUFFERS_ASSERT_INCLUDE) +// Include file with forward declaration +#include FLATBUFFERS_ASSERT_INCLUDE +#endif + +#ifndef ARDUINO +#include +#endif + +#include +#include +#include + +#if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) + #include +#else + #include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#if defined(__unix__) && !defined(FLATBUFFERS_LOCALE_INDEPENDENT) + #include +#endif + +#ifdef _STLPORT_VERSION + #define FLATBUFFERS_CPP98_STL +#endif + +#ifdef __ANDROID__ + #include +#endif + +#if defined(__ICCARM__) +#include +#endif + +// Note the __clang__ check is needed, because clang presents itself +// as an older GNUC compiler (4.2). +// Clang 3.3 and later implement all of the ISO C++ 2011 standard. +// Clang 3.4 and later implement all of the ISO C++ 2014 standard. +// http://clang.llvm.org/cxx_status.html + +// Note the MSVC value '__cplusplus' may be incorrect: +// The '__cplusplus' predefined macro in the MSVC stuck at the value 199711L, +// indicating (erroneously!) that the compiler conformed to the C++98 Standard. +// This value should be correct starting from MSVC2017-15.7-Preview-3. +// The '__cplusplus' will be valid only if MSVC2017-15.7-P3 and the `/Zc:__cplusplus` switch is set. +// Workaround (for details see MSDN): +// Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus for compatibility. +// The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch. + +#if defined(__GNUC__) && !defined(__clang__) + #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#else + #define FLATBUFFERS_GCC 0 +#endif + +#if defined(__clang__) + #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) +#else + #define FLATBUFFERS_CLANG 0 +#endif + +/// @cond FLATBUFFERS_INTERNAL +#if __cplusplus <= 199711L && \ + (!defined(_MSC_VER) || _MSC_VER < 1600) && \ + (!defined(__GNUC__) || \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400)) + #error A C++11 compatible compiler with support for the auto typing is \ + required for FlatBuffers. + #error __cplusplus _MSC_VER __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ +#endif + +#if !defined(__clang__) && \ + defined(__GNUC__) && \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40600) + // Backwards compatibility for g++ 4.4, and 4.5 which don't have the nullptr + // and constexpr keywords. Note the __clang__ check is needed, because clang + // presents itself as an older GNUC compiler. + #ifndef nullptr_t + const class nullptr_t { + public: + template inline operator T*() const { return 0; } + private: + void operator&() const; + } nullptr = {}; + #endif + #ifndef constexpr + #define constexpr const + #endif +#endif + +// The wire format uses a little endian encoding (since that's efficient for +// the common platforms). +#if defined(__s390x__) + #define FLATBUFFERS_LITTLEENDIAN 0 +#endif // __s390x__ +#if !defined(FLATBUFFERS_LITTLEENDIAN) + #if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) + #if (defined(__BIG_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + #define FLATBUFFERS_LITTLEENDIAN 0 + #else + #define FLATBUFFERS_LITTLEENDIAN 1 + #endif // __BIG_ENDIAN__ + #elif defined(_MSC_VER) + #if defined(_M_PPC) + #define FLATBUFFERS_LITTLEENDIAN 0 + #else + #define FLATBUFFERS_LITTLEENDIAN 1 + #endif + #else + #error Unable to determine endianness, define FLATBUFFERS_LITTLEENDIAN. + #endif +#endif // !defined(FLATBUFFERS_LITTLEENDIAN) + +#define FLATBUFFERS_VERSION_MAJOR 1 +#define FLATBUFFERS_VERSION_MINOR 12 +#define FLATBUFFERS_VERSION_REVISION 0 +#define FLATBUFFERS_STRING_EXPAND(X) #X +#define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X) +namespace flatbuffers { + // Returns version as string "MAJOR.MINOR.REVISION". + const char* FLATBUFFERS_VERSION(); +} + +#if (!defined(_MSC_VER) || _MSC_VER > 1600) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 407)) || \ + defined(__clang__) + #define FLATBUFFERS_FINAL_CLASS final + #define FLATBUFFERS_OVERRIDE override + #define FLATBUFFERS_EXPLICIT_CPP11 explicit + #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE : flatbuffers::voffset_t +#else + #define FLATBUFFERS_FINAL_CLASS + #define FLATBUFFERS_OVERRIDE + #define FLATBUFFERS_EXPLICIT_CPP11 + #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE +#endif + +#if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ + (defined(__cpp_constexpr) && __cpp_constexpr >= 200704) + #define FLATBUFFERS_CONSTEXPR constexpr + #define FLATBUFFERS_CONSTEXPR_CPP11 constexpr + #define FLATBUFFERS_CONSTEXPR_DEFINED +#else + #define FLATBUFFERS_CONSTEXPR const + #define FLATBUFFERS_CONSTEXPR_CPP11 +#endif + +// This macro is never used in code! +#if (defined(__cplusplus) && __cplusplus >= 201402L) || \ + (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) + #define FLATBUFFERS_CONSTEXPR_CPP14 FLATBUFFERS_CONSTEXPR +#else + #define FLATBUFFERS_CONSTEXPR_CPP14 +#endif + +#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ + (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023026)) || \ + defined(__clang__) + #define FLATBUFFERS_NOEXCEPT noexcept +#else + #define FLATBUFFERS_NOEXCEPT +#endif + +// NOTE: the FLATBUFFERS_DELETE_FUNC macro may change the access mode to +// private, so be sure to put it at the end or reset access mode explicitly. +#if (!defined(_MSC_VER) || _MSC_FULL_VER >= 180020827) && \ + (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) || \ + defined(__clang__) + #define FLATBUFFERS_DELETE_FUNC(func) func = delete; +#else + #define FLATBUFFERS_DELETE_FUNC(func) private: func; +#endif + +// Check if we can use template aliases +// Not possible if Microsoft Compiler before 2012 +// Possible is the language feature __cpp_alias_templates is defined well +// Or possible if the C++ std is C+11 or newer +#if (defined(_MSC_VER) && _MSC_VER > 1700 /* MSVC2012 */) \ + || (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \ + || (defined(__cplusplus) && __cplusplus >= 201103L) + #define FLATBUFFERS_TEMPLATES_ALIASES +#endif + +#ifndef FLATBUFFERS_HAS_STRING_VIEW + // Only provide flatbuffers::string_view if __has_include can be used + // to detect a header that provides an implementation + #if defined(__has_include) + // Check for std::string_view (in c++17) + #if __has_include() && (__cplusplus >= 201606 || (defined(_HAS_CXX17) && _HAS_CXX17)) + #include + namespace flatbuffers { + typedef std::string_view string_view; + } + #define FLATBUFFERS_HAS_STRING_VIEW 1 + // Check for std::experimental::string_view (in c++14, compiler-dependent) + #elif __has_include() && (__cplusplus >= 201411) + #include + namespace flatbuffers { + typedef std::experimental::string_view string_view; + } + #define FLATBUFFERS_HAS_STRING_VIEW 1 + // Check for absl::string_view + #elif __has_include("absl/strings/string_view.h") + #include "absl/strings/string_view.h" + namespace flatbuffers { + typedef absl::string_view string_view; + } + #define FLATBUFFERS_HAS_STRING_VIEW 1 + #endif + #endif // __has_include +#endif // !FLATBUFFERS_HAS_STRING_VIEW + +#ifndef FLATBUFFERS_HAS_NEW_STRTOD + // Modern (C++11) strtod and strtof functions are available for use. + // 1) nan/inf strings as argument of strtod; + // 2) hex-float as argument of strtod/strtof. + #if (defined(_MSC_VER) && _MSC_VER >= 1900) || \ + (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ + (defined(__clang__)) + #define FLATBUFFERS_HAS_NEW_STRTOD 1 + #endif +#endif // !FLATBUFFERS_HAS_NEW_STRTOD + +#ifndef FLATBUFFERS_LOCALE_INDEPENDENT + // Enable locale independent functions {strtof_l, strtod_l,strtoll_l, strtoull_l}. + #if ((defined(_MSC_VER) && _MSC_VER >= 1800) || \ + (defined(_XOPEN_VERSION) && (_XOPEN_VERSION>=700)) && (!defined(__ANDROID_API__) || (defined(__ANDROID_API__) && (__ANDROID_API__>=21)))) + #define FLATBUFFERS_LOCALE_INDEPENDENT 1 + #else + #define FLATBUFFERS_LOCALE_INDEPENDENT 0 + #endif +#endif // !FLATBUFFERS_LOCALE_INDEPENDENT + +// Suppress Undefined Behavior Sanitizer (recoverable only). Usage: +// - __supress_ubsan__("undefined") +// - __supress_ubsan__("signed-integer-overflow") +#if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >=7)) + #define __supress_ubsan__(type) __attribute__((no_sanitize(type))) +#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409) + #define __supress_ubsan__(type) __attribute__((no_sanitize_undefined)) +#else + #define __supress_ubsan__(type) +#endif + +// This is constexpr function used for checking compile-time constants. +// Avoid `#pragma warning(disable: 4127) // C4127: expression is constant`. +template FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) { + return !!t; +} + +// Enable C++ attribute [[]] if std:c++17 or higher. +#if ((__cplusplus >= 201703L) \ + || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))) + // All attributes unknown to an implementation are ignored without causing an error. + #define FLATBUFFERS_ATTRIBUTE(attr) [[attr]] + + #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]] +#else + #define FLATBUFFERS_ATTRIBUTE(attr) + + #if FLATBUFFERS_CLANG >= 30800 + #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]] + #elif FLATBUFFERS_GCC >= 70300 + #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]] + #else + #define FLATBUFFERS_FALLTHROUGH() + #endif +#endif + +/// @endcond + +/// @file +namespace flatbuffers { + +/// @cond FLATBUFFERS_INTERNAL +// Our default offset / size type, 32bit on purpose on 64bit systems. +// Also, using a consistent offset type maintains compatibility of serialized +// offset values between 32bit and 64bit systems. +typedef uint32_t uoffset_t; + +// Signed offsets for references that can go in both directions. +typedef int32_t soffset_t; + +// Offset/index used in v-tables, can be changed to uint8_t in +// format forks to save a bit of space if desired. +typedef uint16_t voffset_t; + +typedef uintmax_t largest_scalar_t; + +// In 32bits, this evaluates to 2GB - 1 +#define FLATBUFFERS_MAX_BUFFER_SIZE ((1ULL << (sizeof(::flatbuffers::soffset_t) * 8 - 1)) - 1) + +// We support aligning the contents of buffers up to this size. +#define FLATBUFFERS_MAX_ALIGNMENT 16 + +#if defined(_MSC_VER) + #pragma warning(disable: 4351) // C4351: new behavior: elements of array ... will be default initialized + #pragma warning(push) + #pragma warning(disable: 4127) // C4127: conditional expression is constant +#endif + +template T EndianSwap(T t) { + #if defined(_MSC_VER) + #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort + #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong + #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64 + #elif defined(__ICCARM__) + #define FLATBUFFERS_BYTESWAP16 __REV16 + #define FLATBUFFERS_BYTESWAP32 __REV + #define FLATBUFFERS_BYTESWAP64(x) \ + ((__REV(static_cast(x >> 32U))) | (static_cast(__REV(static_cast(x)))) << 32U) + #else + #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__) + // __builtin_bswap16 was missing prior to GCC 4.8. + #define FLATBUFFERS_BYTESWAP16(x) \ + static_cast(__builtin_bswap32(static_cast(x) << 16)) + #else + #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16 + #endif + #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32 + #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64 + #endif + if (sizeof(T) == 1) { // Compile-time if-then's. + return t; + } else if (sizeof(T) == 2) { + union { T t; uint16_t i; } u = { t }; + u.i = FLATBUFFERS_BYTESWAP16(u.i); + return u.t; + } else if (sizeof(T) == 4) { + union { T t; uint32_t i; } u = { t }; + u.i = FLATBUFFERS_BYTESWAP32(u.i); + return u.t; + } else if (sizeof(T) == 8) { + union { T t; uint64_t i; } u = { t }; + u.i = FLATBUFFERS_BYTESWAP64(u.i); + return u.t; + } else { + FLATBUFFERS_ASSERT(0); + return t; + } +} + +#if defined(_MSC_VER) + #pragma warning(pop) +#endif + + +template T EndianScalar(T t) { + #if FLATBUFFERS_LITTLEENDIAN + return t; + #else + return EndianSwap(t); + #endif +} + +template +// UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. +__supress_ubsan__("alignment") +T ReadScalar(const void *p) { + return EndianScalar(*reinterpret_cast(p)); +} + +// See https://github.com/google/flatbuffers/issues/5950 + +#if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif + +template +// UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. +__supress_ubsan__("alignment") +void WriteScalar(void *p, T t) { + *reinterpret_cast(p) = EndianScalar(t); +} + +template struct Offset; +template __supress_ubsan__("alignment") void WriteScalar(void *p, Offset t) { + *reinterpret_cast(p) = EndianScalar(t.o); +} + +#if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) + #pragma GCC diagnostic pop +#endif + +// Computes how many bytes you'd have to pad to be able to write an +// "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in +// memory). +__supress_ubsan__("unsigned-integer-overflow") +inline size_t PaddingBytes(size_t buf_size, size_t scalar_size) { + return ((~buf_size) + 1) & (scalar_size - 1); +} + +} // namespace flatbuffers +#endif // FLATBUFFERS_BASE_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/code_generators.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/code_generators.h new file mode 100644 index 00000000..d0b3d1c7 --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/code_generators.h @@ -0,0 +1,255 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_CODE_GENERATORS_H_ +#define FLATBUFFERS_CODE_GENERATORS_H_ + +#include +#include + +#include "flatbuffers/idl.h" + +namespace flatbuffers { +// Utility class to assist in generating code through use of text templates. +// +// Example code: +// CodeWriter code("\t"); +// code.SetValue("NAME", "Foo"); +// code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; +// code.SetValue("NAME", "Bar"); +// code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; +// std::cout << code.ToString() << std::endl; +// +// Output: +// void Foo() { printf("%s", "Foo"); } +// void Bar() { printf("%s", "Bar"); } +class CodeWriter { +public: + CodeWriter(std::string pad = std::string()) + : pad_(pad), cur_ident_lvl_(0), ignore_ident_(false) + { + } + + // Clears the current "written" code. + void Clear() + { + stream_.str(""); + stream_.clear(); + } + + // Associates a key with a value. All subsequent calls to operator+=, where + // the specified key is contained in {{ and }} delimiters will be replaced by + // the given value. + void SetValue(const std::string &key, const std::string &value) + { + value_map_[key] = value; + } + + std::string GetValue(const std::string &key) const + { + const auto it = value_map_.find(key); + return it == value_map_.end() ? "" : it->second; + } + + // Appends the given text to the generated code as well as a newline + // character. Any text within {{ and }} delimiters is replaced by values + // previously stored in the CodeWriter by calling SetValue above. The newline + // will be suppressed if the text ends with the \\ character. + void operator+=(std::string text); + + // Returns the current contents of the CodeWriter as a std::string. + std::string ToString() const + { + return stream_.str(); + } + + // Increase ident level for writing code + void IncrementIdentLevel() + { + cur_ident_lvl_++; + } + // Decrease ident level for writing code + void DecrementIdentLevel() + { + if (cur_ident_lvl_) + cur_ident_lvl_--; + } + + void SetPadding(const std::string &padding) + { + pad_ = padding; + } + +private: + std::map value_map_; + std::stringstream stream_; + std::string pad_; + int cur_ident_lvl_; + bool ignore_ident_; + + // Add ident padding (tab or space) based on ident level + void AppendIdent(std::stringstream &stream); +}; + +class BaseGenerator { +public: + virtual bool generate() = 0; + + static std::string NamespaceDir(const Parser &parser, const std::string &path, + const Namespace &ns); + + std::string GeneratedFileName(const std::string &path, + const std::string &file_name, + const IDLOptions &options) const; + +protected: + BaseGenerator(const Parser &parser, const std::string &path, + const std::string &file_name, std::string qualifying_start, + std::string qualifying_separator, std::string default_extension) + : parser_(parser), + path_(path), + file_name_(file_name), + qualifying_start_(qualifying_start), + qualifying_separator_(qualifying_separator), + default_extension_(default_extension) + { + } + virtual ~BaseGenerator() + { + } + + // No copy/assign. + BaseGenerator &operator=(const BaseGenerator &); + BaseGenerator(const BaseGenerator &); + + std::string NamespaceDir(const Namespace &ns) const; + + static const char *FlatBuffersGeneratedWarning(); + + static std::string FullNamespace(const char *separator, const Namespace &ns); + + static std::string LastNamespacePart(const Namespace &ns); + + // tracks the current namespace for early exit in WrapInNameSpace + // c++, java and csharp returns a different namespace from + // the following default (no early exit, always fully qualify), + // which works for js and php + virtual const Namespace *CurrentNameSpace() const + { + return nullptr; + } + + // Ensure that a type is prefixed with its namespace even within + // its own namespace to avoid conflict between generated method + // names and similarly named classes or structs + std::string WrapInNameSpace(const Namespace *ns, + const std::string &name) const; + + std::string WrapInNameSpace(const Definition &def) const; + + std::string GetNameSpace(const Definition &def) const; + + const Parser &parser_; + const std::string &path_; + const std::string &file_name_; + const std::string qualifying_start_; + const std::string qualifying_separator_; + const std::string default_extension_; +}; + +struct CommentConfig { + const char *first_line; + const char *content_line_prefix; + const char *last_line; +}; + +extern void GenComment(const std::vector &dc, + std::string *code_ptr, const CommentConfig *config, + const char *prefix = ""); + +class FloatConstantGenerator { +public: + virtual ~FloatConstantGenerator() + { + } + std::string GenFloatConstant(const FieldDef &field) const; + +private: + virtual std::string Value(double v, const std::string &src) const = 0; + virtual std::string Inf(double v) const = 0; + virtual std::string NaN(double v) const = 0; + + virtual std::string Value(float v, const std::string &src) const = 0; + virtual std::string Inf(float v) const = 0; + virtual std::string NaN(float v) const = 0; + + template + std::string GenFloatConstantImpl(const FieldDef &field) const; +}; + +class SimpleFloatConstantGenerator : public FloatConstantGenerator { +public: + SimpleFloatConstantGenerator(const char *nan_number, + const char *pos_inf_number, + const char *neg_inf_number); + +private: + std::string Value(double v, + const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(double v) const FLATBUFFERS_OVERRIDE; + std::string NaN(double v) const FLATBUFFERS_OVERRIDE; + + std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(float v) const FLATBUFFERS_OVERRIDE; + std::string NaN(float v) const FLATBUFFERS_OVERRIDE; + + const std::string nan_number_; + const std::string pos_inf_number_; + const std::string neg_inf_number_; +}; + +// C++, C#, Java like generator. +class TypedFloatConstantGenerator : public FloatConstantGenerator { +public: + TypedFloatConstantGenerator(const char *double_prefix, + const char *single_prefix, const char *nan_number, + const char *pos_inf_number, + const char *neg_inf_number = ""); + +private: + std::string Value(double v, + const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(double v) const FLATBUFFERS_OVERRIDE; + + std::string NaN(double v) const FLATBUFFERS_OVERRIDE; + + std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; + std::string Inf(float v) const FLATBUFFERS_OVERRIDE; + std::string NaN(float v) const FLATBUFFERS_OVERRIDE; + + std::string MakeNaN(const std::string &prefix) const; + std::string MakeInf(bool neg, const std::string &prefix) const; + + const std::string double_prefix_; + const std::string single_prefix_; + const std::string nan_number_; + const std::string pos_inf_number_; + const std::string neg_inf_number_; +}; + +} // namespace flatbuffers + +#endif // FLATBUFFERS_CODE_GENERATORS_H_ diff --git a/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatbuffers.h b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatbuffers.h new file mode 100644 index 00000000..2bc94c8d --- /dev/null +++ b/components/TensorFlowLite/third_party/flatbuffers/include/flatbuffers/flatbuffers.h @@ -0,0 +1,3388 @@ +/* + * Copyright 2014 Google Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLATBUFFERS_H_ +#define FLATBUFFERS_H_ + +#include "flatbuffers/base.h" +#include "flatbuffers/stl_emulation.h" + +#ifndef FLATBUFFERS_CPP98_STL +#include +#endif + +#if defined(FLATBUFFERS_NAN_DEFAULTS) +#include +#endif + +namespace flatbuffers { +// Generic 'operator==' with conditional specialisations. +// T e - new value of a scalar field. +// T def - default of scalar (is known at compile-time). +template +inline bool IsTheSameAs(T e, T def) +{ + return e == def; +} + +#if defined(FLATBUFFERS_NAN_DEFAULTS) && \ + defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0) +// Like `operator==(e, def)` with weak NaN if T=(float|double). +template +inline bool IsFloatTheSameAs(T e, T def) +{ + return (e == def) || ((def != def) && (e != e)); +} +template <> +inline bool IsTheSameAs(float e, float def) +{ + return IsFloatTheSameAs(e, def); +} +template <> +inline bool IsTheSameAs(double e, double def) +{ + return IsFloatTheSameAs(e, def); +} +#endif + +// Check 'v' is out of closed range [low; high]. +// Workaround for GCC warning [-Werror=type-limits]: +// comparison is always true due to limited range of data type. +template +inline bool IsOutRange(const T &v, const T &low, const T &high) +{ + return (v < low) || (high < v); +} + +// Check 'v' is in closed range [low; high]. +template +inline bool IsInRange(const T &v, const T &low, const T &high) +{ + return !IsOutRange(v, low, high); +} + +// Wrapper for uoffset_t to allow safe template specialization. +// Value is allowed to be 0 to indicate a null object (see e.g. AddOffset). +template +struct Offset { + uoffset_t o; + Offset() + : o(0) + { + } + Offset(uoffset_t _o) + : o(_o) + { + } + Offset Union() const + { + return Offset(o); + } + bool IsNull() const + { + return !o; + } +}; + +inline void EndianCheck() +{ + int endiantest = 1; + // If this fails, see FLATBUFFERS_LITTLEENDIAN above. + FLATBUFFERS_ASSERT(*reinterpret_cast(&endiantest) == + FLATBUFFERS_LITTLEENDIAN); + (void)endiantest; +} + +template +FLATBUFFERS_CONSTEXPR size_t AlignOf() +{ + // clang-format off + #ifdef _MSC_VER + return __alignof(T); + #else + #ifndef alignof + return __alignof__(T); + #else + return alignof(T); + #endif + #endif + // clang-format on +} + +// When we read serialized data from memory, in the case of most scalars, +// we want to just read T, but in the case of Offset, we want to actually +// perform the indirection and return a pointer. +// The template specialization below does just that. +// It is wrapped in a struct since function templates can't overload on the +// return type like this. +// The typedef is for the convenience of callers of this function +// (avoiding the need for a trailing return decltype) +template +struct IndirectHelper { + typedef T return_type; + typedef T mutable_return_type; + static const size_t element_stride = sizeof(T); + static return_type Read(const uint8_t *p, uoffset_t i) + { + return EndianScalar((reinterpret_cast(p))[i]); + } +}; +template +struct IndirectHelper > { + typedef const T *return_type; + typedef T *mutable_return_type; + static const size_t element_stride = sizeof(uoffset_t); + static return_type Read(const uint8_t *p, uoffset_t i) + { + p += i * sizeof(uoffset_t); + return reinterpret_cast(p + ReadScalar(p)); + } +}; +template +struct IndirectHelper { + typedef const T *return_type; + typedef T *mutable_return_type; + static const size_t element_stride = sizeof(T); + static return_type Read(const uint8_t *p, uoffset_t i) + { + return reinterpret_cast(p + i * sizeof(T)); + } +}; + +// An STL compatible iterator implementation for Vector below, effectively +// calling Get() for every element. +template +struct VectorIterator { + typedef std::random_access_iterator_tag iterator_category; + typedef IT value_type; + typedef ptrdiff_t difference_type; + typedef IT *pointer; + typedef IT &reference; + + VectorIterator(const uint8_t *data, uoffset_t i) + : data_(data + IndirectHelper::element_stride * i) + { + } + VectorIterator(const VectorIterator &other) + : data_(other.data_) + { + } + VectorIterator() + : data_(nullptr) + { + } + + VectorIterator &operator=(const VectorIterator &other) + { + data_ = other.data_; + return *this; + } + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + VectorIterator &operator=(VectorIterator &&other) { + data_ = other.data_; + return *this; + } + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + bool operator==(const VectorIterator &other) const + { + return data_ == other.data_; + } + + bool operator<(const VectorIterator &other) const + { + return data_ < other.data_; + } + + bool operator!=(const VectorIterator &other) const + { + return data_ != other.data_; + } + + difference_type operator-(const VectorIterator &other) const + { + return (data_ - other.data_) / IndirectHelper::element_stride; + } + + IT operator*() const + { + return IndirectHelper::Read(data_, 0); + } + + IT operator->() const + { + return IndirectHelper::Read(data_, 0); + } + + VectorIterator &operator++() + { + data_ += IndirectHelper::element_stride; + return *this; + } + + VectorIterator operator++(int) + { + VectorIterator temp(data_, 0); + data_ += IndirectHelper::element_stride; + return temp; + } + + VectorIterator operator+(const uoffset_t &offset) const + { + return VectorIterator(data_ + offset * IndirectHelper::element_stride, + 0); + } + + VectorIterator &operator+=(const uoffset_t &offset) + { + data_ += offset * IndirectHelper::element_stride; + return *this; + } + + VectorIterator &operator--() + { + data_ -= IndirectHelper::element_stride; + return *this; + } + + VectorIterator operator--(int) + { + VectorIterator temp(data_, 0); + data_ -= IndirectHelper::element_stride; + return temp; + } + + VectorIterator operator-(const uoffset_t &offset) const + { + return VectorIterator(data_ - offset * IndirectHelper::element_stride, + 0); + } + + VectorIterator &operator-=(const uoffset_t &offset) + { + data_ -= offset * IndirectHelper::element_stride; + return *this; + } + +private: + const uint8_t *data_; +}; + +template +struct VectorReverseIterator : public std::reverse_iterator { + explicit VectorReverseIterator(Iterator iter) + : std::reverse_iterator(iter) + { + } + + typename Iterator::value_type operator*() const + { + return *(std::reverse_iterator::current); + } + + typename Iterator::value_type operator->() const + { + return *(std::reverse_iterator::current); + } +}; + +struct String; + +// This is used as a helper type for accessing vectors. +// Vector::data() assumes the vector elements start after the length field. +template +class Vector { +public: + typedef VectorIterator::mutable_return_type> + iterator; + typedef VectorIterator::return_type> + const_iterator; + typedef VectorReverseIterator reverse_iterator; + typedef VectorReverseIterator const_reverse_iterator; + + uoffset_t size() const + { + return EndianScalar(length_); + } + + // Deprecated: use size(). Here for backwards compatibility. + FLATBUFFERS_ATTRIBUTE(deprecated("use size() instead")) + uoffset_t Length() const + { + return size(); + } + + typedef typename IndirectHelper::return_type return_type; + typedef typename IndirectHelper::mutable_return_type mutable_return_type; + + return_type Get(uoffset_t i) const + { + FLATBUFFERS_ASSERT(i < size()); + return IndirectHelper::Read(Data(), i); + } + + return_type operator[](uoffset_t i) const + { + return Get(i); + } + + // If this is a Vector of enums, T will be its storage type, not the enum + // type. This function makes it convenient to retrieve value with enum + // type E. + template + E GetEnum(uoffset_t i) const + { + return static_cast(Get(i)); + } + + // If this a vector of unions, this does the cast for you. There's no check + // to make sure this is the right type! + template + const U *GetAs(uoffset_t i) const + { + return reinterpret_cast(Get(i)); + } + + // If this a vector of unions, this does the cast for you. There's no check + // to make sure this is actually a string! + const String *GetAsString(uoffset_t i) const + { + return reinterpret_cast(Get(i)); + } + + const void *GetStructFromOffset(size_t o) const + { + return reinterpret_cast(Data() + o); + } + + iterator begin() + { + return iterator(Data(), 0); + } + const_iterator begin() const + { + return const_iterator(Data(), 0); + } + + iterator end() + { + return iterator(Data(), size()); + } + const_iterator end() const + { + return const_iterator(Data(), size()); + } + + reverse_iterator rbegin() + { + return reverse_iterator(end() - 1); + } + const_reverse_iterator rbegin() const + { + return const_reverse_iterator(end() - 1); + } + + reverse_iterator rend() + { + return reverse_iterator(begin() - 1); + } + const_reverse_iterator rend() const + { + return const_reverse_iterator(begin() - 1); + } + + const_iterator cbegin() const + { + return begin(); + } + + const_iterator cend() const + { + return end(); + } + + const_reverse_iterator crbegin() const + { + return rbegin(); + } + + const_reverse_iterator crend() const + { + return rend(); + } + + // Change elements if you have a non-const pointer to this object. + // Scalars only. See reflection.h, and the documentation. + void Mutate(uoffset_t i, const T &val) + { + FLATBUFFERS_ASSERT(i < size()); + WriteScalar(data() + i, val); + } + + // Change an element of a vector of tables (or strings). + // "val" points to the new table/string, as you can obtain from + // e.g. reflection::AddFlatBuffer(). + void MutateOffset(uoffset_t i, const uint8_t *val) + { + FLATBUFFERS_ASSERT(i < size()); + static_assert(sizeof(T) == sizeof(uoffset_t), "Unrelated types"); + WriteScalar(data() + i, + static_cast(val - (Data() + i * sizeof(uoffset_t)))); + } + + // Get a mutable pointer to tables/strings inside this vector. + mutable_return_type GetMutableObject(uoffset_t i) const + { + FLATBUFFERS_ASSERT(i < size()); + return const_cast(IndirectHelper::Read(Data(), i)); + } + + // The raw data in little endian format. Use with care. + const uint8_t *Data() const + { + return reinterpret_cast(&length_ + 1); + } + + uint8_t *Data() + { + return reinterpret_cast(&length_ + 1); + } + + // Similarly, but typed, much like std::vector::data + const T *data() const + { + return reinterpret_cast(Data()); + } + T *data() + { + return reinterpret_cast(Data()); + } + + template + return_type LookupByKey(K key) const + { + void *search_result = std::bsearch( + &key, Data(), size(), IndirectHelper::element_stride, KeyCompare); + + if (!search_result) { + return nullptr; // Key not found. + } + + const uint8_t *element = reinterpret_cast(search_result); + + return IndirectHelper::Read(element, 0); + } + +protected: + // This class is only used to access pre-existing data. Don't ever + // try to construct these manually. + Vector(); + + uoffset_t length_; + +private: + // This class is a pointer. Copying will therefore create an invalid object. + // Private and unimplemented copy constructor. + Vector(const Vector &); + Vector &operator=(const Vector &); + + template + static int KeyCompare(const void *ap, const void *bp) + { + const K *key = reinterpret_cast(ap); + const uint8_t *data = reinterpret_cast(bp); + auto table = IndirectHelper::Read(data, 0); + + // std::bsearch compares with the operands transposed, so we negate the + // result here. + return -table->KeyCompareWithValue(*key); + } +}; + +// Represent a vector much like the template above, but in this case we +// don't know what the element types are (used with reflection.h). +class VectorOfAny { +public: + uoffset_t size() const + { + return EndianScalar(length_); + } + + const uint8_t *Data() const + { + return reinterpret_cast(&length_ + 1); + } + uint8_t *Data() + { + return reinterpret_cast(&length_ + 1); + } + +protected: + VectorOfAny(); + + uoffset_t length_; + +private: + VectorOfAny(const VectorOfAny &); + VectorOfAny &operator=(const VectorOfAny &); +}; + +#ifndef FLATBUFFERS_CPP98_STL +template +Vector > *VectorCast(Vector > *ptr) +{ + static_assert(std::is_base_of::value, "Unrelated types"); + return reinterpret_cast > *>(ptr); +} + +template +const Vector > *VectorCast(const Vector > *ptr) +{ + static_assert(std::is_base_of::value, "Unrelated types"); + return reinterpret_cast > *>(ptr); +} +#endif + +// Convenient helper function to get the length of any vector, regardless +// of whether it is null or not (the field is not set). +template +static inline size_t VectorLength(const Vector *v) +{ + return v ? v->size() : 0; +} + +// This is used as a helper type for accessing arrays. +template +class Array { + typedef + typename flatbuffers::integral_constant::value> + scalar_tag; + typedef + typename flatbuffers::conditional::type + IndirectHelperType; + +public: + typedef typename IndirectHelper::return_type return_type; + typedef VectorIterator const_iterator; + typedef VectorReverseIterator const_reverse_iterator; + + FLATBUFFERS_CONSTEXPR uint16_t size() const + { + return length; + } + + return_type Get(uoffset_t i) const + { + FLATBUFFERS_ASSERT(i < size()); + return IndirectHelper::Read(Data(), i); + } + + return_type operator[](uoffset_t i) const + { + return Get(i); + } + + // If this is a Vector of enums, T will be its storage type, not the enum + // type. This function makes it convenient to retrieve value with enum + // type E. + template + E GetEnum(uoffset_t i) const + { + return static_cast(Get(i)); + } + + const_iterator begin() const + { + return const_iterator(Data(), 0); + } + const_iterator end() const + { + return const_iterator(Data(), size()); + } + + const_reverse_iterator rbegin() const + { + return const_reverse_iterator(end()); + } + const_reverse_iterator rend() const + { + return const_reverse_iterator(end()); + } + + const_iterator cbegin() const + { + return begin(); + } + const_iterator cend() const + { + return end(); + } + + const_reverse_iterator crbegin() const + { + return rbegin(); + } + const_reverse_iterator crend() const + { + return rend(); + } + + // Get a mutable pointer to elements inside this array. + // This method used to mutate arrays of structs followed by a @p Mutate + // operation. For primitive types use @p Mutate directly. + // @warning Assignments and reads to/from the dereferenced pointer are not + // automatically converted to the correct endianness. + typename flatbuffers::conditional::type + GetMutablePointer(uoffset_t i) const + { + FLATBUFFERS_ASSERT(i < size()); + return const_cast(&data()[i]); + } + + // Change elements if you have a non-const pointer to this object. + void Mutate(uoffset_t i, const T &val) + { + MutateImpl(scalar_tag(), i, val); + } + + // The raw data in little endian format. Use with care. + const uint8_t *Data() const + { + return data_; + } + + uint8_t *Data() + { + return data_; + } + + // Similarly, but typed, much like std::vector::data + const T *data() const + { + return reinterpret_cast(Data()); + } + T *data() + { + return reinterpret_cast(Data()); + } + +protected: + void MutateImpl(flatbuffers::integral_constant, uoffset_t i, + const T &val) + { + FLATBUFFERS_ASSERT(i < size()); + WriteScalar(data() + i, val); + } + + void MutateImpl(flatbuffers::integral_constant, uoffset_t i, + const T &val) + { + *(GetMutablePointer(i)) = val; + } + + // This class is only used to access pre-existing data. Don't ever + // try to construct these manually. + // 'constexpr' allows us to use 'size()' at compile time. + // @note Must not use 'FLATBUFFERS_CONSTEXPR' here, as const is not allowed on + // a constructor. +#if defined(__cpp_constexpr) + constexpr Array(); +#else + Array(); +#endif + + uint8_t data_[length * sizeof(T)]; + +private: + // This class is a pointer. Copying will therefore create an invalid object. + // Private and unimplemented copy constructor. + Array(const Array &); + Array &operator=(const Array &); +}; + +// Specialization for Array[struct] with access using Offset pointer. +// This specialization used by idl_gen_text.cpp. +template +class Array, length> { + static_assert(flatbuffers::is_same::value, "unexpected type T"); + +public: + typedef const void *return_type; + + const uint8_t *Data() const + { + return data_; + } + + // Make idl_gen_text.cpp::PrintContainer happy. + return_type operator[](uoffset_t) const + { + FLATBUFFERS_ASSERT(false); + return nullptr; + } + +private: + // This class is only used to access pre-existing data. + Array(); + Array(const Array &); + Array &operator=(const Array &); + + uint8_t data_[1]; +}; + +// Lexicographically compare two strings (possibly containing nulls), and +// return true if the first is less than the second. +static inline bool StringLessThan(const char *a_data, uoffset_t a_size, + const char *b_data, uoffset_t b_size) +{ + const auto cmp = memcmp(a_data, b_data, (std::min)(a_size, b_size)); + return cmp == 0 ? a_size < b_size : cmp < 0; +} + +struct String : public Vector { + const char *c_str() const + { + return reinterpret_cast(Data()); + } + std::string str() const + { + return std::string(c_str(), size()); + } + + // clang-format off + #ifdef FLATBUFFERS_HAS_STRING_VIEW + flatbuffers::string_view string_view() const { + return flatbuffers::string_view(c_str(), size()); + } + #endif // FLATBUFFERS_HAS_STRING_VIEW + // clang-format on + + bool operator<(const String &o) const + { + return StringLessThan(this->data(), this->size(), o.data(), o.size()); + } +}; + +// Convenience function to get std::string from a String returning an empty +// string on null pointer. +static inline std::string GetString(const String *str) +{ + return str ? str->str() : ""; +} + +// Convenience function to get char* from a String returning an empty string on +// null pointer. +static inline const char *GetCstring(const String *str) +{ + return str ? str->c_str() : ""; +} + +#ifdef FLATBUFFERS_HAS_STRING_VIEW +// Convenience function to get string_view from a String returning an empty +// string_view on null pointer. +static inline flatbuffers::string_view GetStringView(const String *str) +{ + return str ? str->string_view() : flatbuffers::string_view(); +} +#endif // FLATBUFFERS_HAS_STRING_VIEW + +// Allocator interface. This is flatbuffers-specific and meant only for +// `vector_downward` usage. +class Allocator { +public: + virtual ~Allocator() + { + } + + // Allocate `size` bytes of memory. + virtual uint8_t *allocate(size_t size) = 0; + + // Deallocate `size` bytes of memory at `p` allocated by this allocator. + virtual void deallocate(uint8_t *p, size_t size) = 0; + + // Reallocate `new_size` bytes of memory, replacing the old region of size + // `old_size` at `p`. In contrast to a normal realloc, this grows downwards, + // and is intended specifcally for `vector_downward` use. + // `in_use_back` and `in_use_front` indicate how much of `old_size` is + // actually in use at each end, and needs to be copied. + virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, + size_t new_size, size_t in_use_back, + size_t in_use_front) + { + FLATBUFFERS_ASSERT(new_size > old_size); // vector_downward only grows + uint8_t *new_p = allocate(new_size); + memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, + in_use_front); + deallocate(old_p, old_size); + return new_p; + } + +protected: + // Called by `reallocate_downward` to copy memory from `old_p` of `old_size` + // to `new_p` of `new_size`. Only memory of size `in_use_front` and + // `in_use_back` will be copied from the front and back of the old memory + // allocation. + void memcpy_downward(uint8_t *old_p, size_t old_size, uint8_t *new_p, + size_t new_size, size_t in_use_back, + size_t in_use_front) + { + memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back, + in_use_back); + memcpy(new_p, old_p, in_use_front); + } +}; + +// DefaultAllocator uses new/delete to allocate memory regions +class DefaultAllocator : public Allocator { +public: + uint8_t *allocate(size_t size) FLATBUFFERS_OVERRIDE + { + return new uint8_t[size]; + } + + void deallocate(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE + { + delete[] p; + } + + static void dealloc(void *p, size_t) + { + delete[] static_cast(p); + } +}; + +// These functions allow for a null allocator to mean use the default allocator, +// as used by DetachedBuffer and vector_downward below. +// This is to avoid having a statically or dynamically allocated default +// allocator, or having to move it between the classes that may own it. +inline uint8_t *Allocate(Allocator *allocator, size_t size) +{ + return allocator ? allocator->allocate(size) : DefaultAllocator().allocate(size); +} + +inline void Deallocate(Allocator *allocator, uint8_t *p, size_t size) +{ + if (allocator) + allocator->deallocate(p, size); + else + DefaultAllocator().deallocate(p, size); +} + +inline uint8_t *ReallocateDownward(Allocator *allocator, uint8_t *old_p, + size_t old_size, size_t new_size, + size_t in_use_back, size_t in_use_front) +{ + return allocator ? allocator->reallocate_downward(old_p, old_size, new_size, + in_use_back, in_use_front) : + DefaultAllocator().reallocate_downward( + old_p, old_size, new_size, in_use_back, in_use_front); +} + +// DetachedBuffer is a finished flatbuffer memory region, detached from its +// builder. The original memory region and allocator are also stored so that +// the DetachedBuffer can manage the memory lifetime. +class DetachedBuffer { +public: + DetachedBuffer() + : allocator_(nullptr), + own_allocator_(false), + buf_(nullptr), + reserved_(0), + cur_(nullptr), + size_(0) + { + } + + DetachedBuffer(Allocator *allocator, bool own_allocator, uint8_t *buf, + size_t reserved, uint8_t *cur, size_t sz) + : allocator_(allocator), + own_allocator_(own_allocator), + buf_(buf), + reserved_(reserved), + cur_(cur), + size_(sz) + { + } + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + DetachedBuffer(DetachedBuffer &&other) + : allocator_(other.allocator_), + own_allocator_(other.own_allocator_), + buf_(other.buf_), + reserved_(other.reserved_), + cur_(other.cur_), + size_(other.size_) + { + other.reset(); + } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + DetachedBuffer &operator=(DetachedBuffer &&other) + { + if (this == &other) + return *this; + + destroy(); + + allocator_ = other.allocator_; + own_allocator_ = other.own_allocator_; + buf_ = other.buf_; + reserved_ = other.reserved_; + cur_ = other.cur_; + size_ = other.size_; + + other.reset(); + + return *this; + } + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + ~DetachedBuffer() + { + destroy(); + } + + const uint8_t *data() const + { + return cur_; + } + + uint8_t *data() + { + return cur_; + } + + size_t size() const + { + return size_; + } + + // clang-format off + #if 0 // disabled for now due to the ordering of classes in this header + template + bool Verify() const { + Verifier verifier(data(), size()); + return verifier.Verify(nullptr); + } + + template + const T* GetRoot() const { + return flatbuffers::GetRoot(data()); + } + + template + T* GetRoot() { + return flatbuffers::GetRoot(data()); + } + #endif + // clang-format on + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + // These may change access mode, leave these at end of public section + FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer &other)) + FLATBUFFERS_DELETE_FUNC( + DetachedBuffer &operator=(const DetachedBuffer &other)) + // clang-format off + #endif // !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + +protected: + Allocator *allocator_; + bool own_allocator_; + uint8_t *buf_; + size_t reserved_; + uint8_t *cur_; + size_t size_; + + inline void destroy() + { + if (buf_) + Deallocate(allocator_, buf_, reserved_); + if (own_allocator_ && allocator_) { + delete allocator_; + } + reset(); + } + + inline void reset() + { + allocator_ = nullptr; + own_allocator_ = false; + buf_ = nullptr; + reserved_ = 0; + cur_ = nullptr; + size_ = 0; + } +}; + +// This is a minimal replication of std::vector functionality, +// except growing from higher to lower addresses. i.e push_back() inserts data +// in the lowest address in the vector. +// Since this vector leaves the lower part unused, we support a "scratch-pad" +// that can be stored there for temporary data, to share the allocated space. +// Essentially, this supports 2 std::vectors in a single buffer. +class vector_downward { +public: + explicit vector_downward(size_t initial_size, Allocator *allocator, + bool own_allocator, size_t buffer_minalign) + : allocator_(allocator), + own_allocator_(own_allocator), + initial_size_(initial_size), + buffer_minalign_(buffer_minalign), + reserved_(0), + buf_(nullptr), + cur_(nullptr), + scratch_(nullptr) + { + } + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + vector_downward(vector_downward &&other) + #else + vector_downward(vector_downward &other) + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on + : allocator_(other.allocator_), + own_allocator_(other.own_allocator_), + initial_size_(other.initial_size_), + buffer_minalign_(other.buffer_minalign_), + reserved_(other.reserved_), + buf_(other.buf_), + cur_(other.cur_), + scratch_(other.scratch_) + { + // No change in other.allocator_ + // No change in other.initial_size_ + // No change in other.buffer_minalign_ + other.own_allocator_ = false; + other.reserved_ = 0; + other.buf_ = nullptr; + other.cur_ = nullptr; + other.scratch_ = nullptr; + } + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + vector_downward &operator=(vector_downward &&other) + { + // Move construct a temporary and swap idiom + vector_downward temp(std::move(other)); + swap(temp); + return *this; + } + // clang-format off + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + ~vector_downward() + { + clear_buffer(); + clear_allocator(); + } + + void reset() + { + clear_buffer(); + clear(); + } + + void clear() + { + if (buf_) { + cur_ = buf_ + reserved_; + } else { + reserved_ = 0; + cur_ = nullptr; + } + clear_scratch(); + } + + void clear_scratch() + { + scratch_ = buf_; + } + + void clear_allocator() + { + if (own_allocator_ && allocator_) { + delete allocator_; + } + allocator_ = nullptr; + own_allocator_ = false; + } + + void clear_buffer() + { + if (buf_) + Deallocate(allocator_, buf_, reserved_); + buf_ = nullptr; + } + + // Relinquish the pointer to the caller. + uint8_t *release_raw(size_t &allocated_bytes, size_t &offset) + { + auto *buf = buf_; + allocated_bytes = reserved_; + offset = static_cast(cur_ - buf_); + + // release_raw only relinquishes the buffer ownership. + // Does not deallocate or reset the allocator. Destructor will do that. + buf_ = nullptr; + clear(); + return buf; + } + + // Relinquish the pointer to the caller. + DetachedBuffer release() + { + // allocator ownership (if any) is transferred to DetachedBuffer. + DetachedBuffer fb(allocator_, own_allocator_, buf_, reserved_, cur_, + size()); + if (own_allocator_) { + allocator_ = nullptr; + own_allocator_ = false; + } + buf_ = nullptr; + clear(); + return fb; + } + + size_t ensure_space(size_t len) + { + FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_); + if (len > static_cast(cur_ - scratch_)) { + reallocate(len); + } + // Beyond this, signed offsets may not have enough range: + // (FlatBuffers > 2GB not supported). + FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE); + return len; + } + + inline uint8_t *make_space(size_t len) + { + size_t space = ensure_space(len); + cur_ -= space; + return cur_; + } + + // Returns nullptr if using the DefaultAllocator. + Allocator *get_custom_allocator() + { + return allocator_; + } + + uoffset_t size() const + { + return static_cast(reserved_ - (cur_ - buf_)); + } + + uoffset_t scratch_size() const + { + return static_cast(scratch_ - buf_); + } + + size_t capacity() const + { + return reserved_; + } + + uint8_t *data() const + { + FLATBUFFERS_ASSERT(cur_); + return cur_; + } + + uint8_t *scratch_data() const + { + FLATBUFFERS_ASSERT(buf_); + return buf_; + } + + uint8_t *scratch_end() const + { + FLATBUFFERS_ASSERT(scratch_); + return scratch_; + } + + uint8_t *data_at(size_t offset) const + { + return buf_ + reserved_ - offset; + } + + void push(const uint8_t *bytes, size_t num) + { + if (num > 0) { + memcpy(make_space(num), bytes, num); + } + } + + // Specialized version of push() that avoids memcpy call for small data. + template + void push_small(const T &little_endian_t) + { + make_space(sizeof(T)); + *reinterpret_cast(cur_) = little_endian_t; + } + + template + void scratch_push_small(const T &t) + { + ensure_space(sizeof(T)); + *reinterpret_cast(scratch_) = t; + scratch_ += sizeof(T); + } + + // fill() is most frequently called with small byte counts (<= 4), + // which is why we're using loops rather than calling memset. + void fill(size_t zero_pad_bytes) + { + make_space(zero_pad_bytes); + for (size_t i = 0; i < zero_pad_bytes; i++) + cur_[i] = 0; + } + + // Version for when we know the size is larger. + // Precondition: zero_pad_bytes > 0 + void fill_big(size_t zero_pad_bytes) + { + memset(make_space(zero_pad_bytes), 0, zero_pad_bytes); + } + + void pop(size_t bytes_to_remove) + { + cur_ += bytes_to_remove; + } + void scratch_pop(size_t bytes_to_remove) + { + scratch_ -= bytes_to_remove; + } + + void swap(vector_downward &other) + { + using std::swap; + swap(allocator_, other.allocator_); + swap(own_allocator_, other.own_allocator_); + swap(initial_size_, other.initial_size_); + swap(buffer_minalign_, other.buffer_minalign_); + swap(reserved_, other.reserved_); + swap(buf_, other.buf_); + swap(cur_, other.cur_); + swap(scratch_, other.scratch_); + } + + void swap_allocator(vector_downward &other) + { + using std::swap; + swap(allocator_, other.allocator_); + swap(own_allocator_, other.own_allocator_); + } + +private: + // You shouldn't really be copying instances of this class. + FLATBUFFERS_DELETE_FUNC(vector_downward(const vector_downward &)) + FLATBUFFERS_DELETE_FUNC(vector_downward &operator=(const vector_downward &)) + + Allocator *allocator_; + bool own_allocator_; + size_t initial_size_; + size_t buffer_minalign_; + size_t reserved_; + uint8_t *buf_; + uint8_t *cur_; // Points at location between empty (below) and used (above). + uint8_t *scratch_; // Points to the end of the scratchpad in use. + + void reallocate(size_t len) + { + auto old_reserved = reserved_; + auto old_size = size(); + auto old_scratch_size = scratch_size(); + reserved_ += + (std::max)(len, old_reserved ? old_reserved / 2 : initial_size_); + reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1); + if (buf_) { + buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_, + old_size, old_scratch_size); + } else { + buf_ = Allocate(allocator_, reserved_); + } + cur_ = buf_ + reserved_ - old_size; + scratch_ = buf_ + old_scratch_size; + } +}; + +// Converts a Field ID to a virtual table offset. +inline voffset_t FieldIndexToOffset(voffset_t field_id) +{ + // Should correspond to what EndTable() below builds up. + const int fixed_fields = 2; // Vtable size and Object Size. + return static_cast((field_id + fixed_fields) * sizeof(voffset_t)); +} + +template +const T *data(const std::vector &v) +{ + // Eventually the returned pointer gets passed down to memcpy, so + // we need it to be non-null to avoid undefined behavior. + static uint8_t t; + return v.empty() ? reinterpret_cast(&t) : &v.front(); +} +template +T *data(std::vector &v) +{ + // Eventually the returned pointer gets passed down to memcpy, so + // we need it to be non-null to avoid undefined behavior. + static uint8_t t; + return v.empty() ? reinterpret_cast(&t) : &v.front(); +} + +/// @endcond + +/// @addtogroup flatbuffers_cpp_api +/// @{ +/// @class FlatBufferBuilder +/// @brief Helper class to hold data needed in creation of a FlatBuffer. +/// To serialize data, you typically call one of the `Create*()` functions in +/// the generated code, which in turn call a sequence of `StartTable`/ +/// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/ +/// `CreateVector` functions. Do this is depth-first order to build up a tree to +/// the root. `Finish()` wraps up the buffer ready for transport. +class FlatBufferBuilder { +public: + /// @brief Default constructor for FlatBufferBuilder. + /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults + /// to `1024`. + /// @param[in] allocator An `Allocator` to use. If null will use + /// `DefaultAllocator`. + /// @param[in] own_allocator Whether the builder/vector should own the + /// allocator. Defaults to / `false`. + /// @param[in] buffer_minalign Force the buffer to be aligned to the given + /// minimum alignment upon reallocation. Only needed if you intend to store + /// types with custom alignment AND you wish to read the buffer in-place + /// directly after creation. + explicit FlatBufferBuilder( + size_t initial_size = 1024, Allocator *allocator = nullptr, + bool own_allocator = false, + size_t buffer_minalign = AlignOf()) + : buf_(initial_size, allocator, own_allocator, buffer_minalign), + num_field_loc(0), + max_voffset_(0), + nested(false), + finished(false), + minalign_(1), + force_defaults_(false), + dedup_vtables_(true), + string_pool(nullptr) + { + EndianCheck(); + } + + // clang-format off + /// @brief Move constructor for FlatBufferBuilder. + #if !defined(FLATBUFFERS_CPP98_STL) + FlatBufferBuilder(FlatBufferBuilder &&other) + #else + FlatBufferBuilder(FlatBufferBuilder &other) + #endif // #if !defined(FLATBUFFERS_CPP98_STL) + : buf_(1024, nullptr, false, AlignOf()), + num_field_loc(0), + max_voffset_(0), + nested(false), + finished(false), + minalign_(1), + force_defaults_(false), + dedup_vtables_(true), + string_pool(nullptr) { + EndianCheck(); + // Default construct and swap idiom. + // Lack of delegating constructors in vs2010 makes it more verbose than needed. + Swap(other); + } + // clang-format on + + // clang-format off + #if !defined(FLATBUFFERS_CPP98_STL) + // clang-format on + /// @brief Move assignment operator for FlatBufferBuilder. + FlatBufferBuilder &operator=(FlatBufferBuilder &&other) + { + // Move construct a temporary and swap idiom + FlatBufferBuilder temp(std::move(other)); + Swap(temp); + return *this; + } + // clang-format off + #endif // defined(FLATBUFFERS_CPP98_STL) + // clang-format on + + void Swap(FlatBufferBuilder &other) + { + using std::swap; + buf_.swap(other.buf_); + swap(num_field_loc, other.num_field_loc); + swap(max_voffset_, other.max_voffset_); + swap(nested, other.nested); + swap(finished, other.finished); + swap(minalign_, other.minalign_); + swap(force_defaults_, other.force_defaults_); + swap(dedup_vtables_, other.dedup_vtables_); + swap(string_pool, other.string_pool); + } + + ~FlatBufferBuilder() + { + if (string_pool) + delete string_pool; + } + + void Reset() + { + Clear(); // clear builder state + buf_.reset(); // deallocate buffer + } + + /// @brief Reset all the state in this FlatBufferBuilder so it can be reused + /// to construct another buffer. + void Clear() + { + ClearOffsets(); + buf_.clear(); + nested = false; + finished = false; + minalign_ = 1; + if (string_pool) + string_pool->clear(); + } + + /// @brief The current size of the serialized buffer, counting from the end. + /// @return Returns an `uoffset_t` with the current size of the buffer. + uoffset_t GetSize() const + { + return buf_.size(); + } + + /// @brief Get the serialized buffer (after you call `Finish()`). + /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the + /// buffer. + uint8_t *GetBufferPointer() const + { + Finished(); + return buf_.data(); + } + + /// @brief Get a pointer to an unfinished buffer. + /// @return Returns a `uint8_t` pointer to the unfinished buffer. + uint8_t *GetCurrentBufferPointer() const + { + return buf_.data(); + } + + /// @brief Get the released pointer to the serialized buffer. + /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards! + /// @return A `FlatBuffer` that owns the buffer and its allocator and + /// behaves similar to a `unique_ptr` with a deleter. + FLATBUFFERS_ATTRIBUTE(deprecated("use Release() instead")) + DetachedBuffer ReleaseBufferPointer() + { + Finished(); + return buf_.release(); + } + + /// @brief Get the released DetachedBuffer. + /// @return A `DetachedBuffer` that owns the buffer and its allocator. + DetachedBuffer Release() + { + Finished(); + return buf_.release(); + } + + /// @brief Get the released pointer to the serialized buffer. + /// @param size The size of the memory block containing + /// the serialized `FlatBuffer`. + /// @param offset The offset from the released pointer where the finished + /// `FlatBuffer` starts. + /// @return A raw pointer to the start of the memory block containing + /// the serialized `FlatBuffer`. + /// @remark If the allocator is owned, it gets deleted when the destructor is + /// called.. + uint8_t *ReleaseRaw(size_t &size, size_t &offset) + { + Finished(); + return buf_.release_raw(size, offset); + } + + /// @brief get the minimum alignment this buffer needs to be accessed + /// properly. This is only known once all elements have been written (after + /// you call Finish()). You can use this information if you need to embed + /// a FlatBuffer in some other buffer, such that you can later read it + /// without first having to copy it into its own buffer. + size_t GetBufferMinAlignment() const + { + Finished(); + return minalign_; + } + + /// @cond FLATBUFFERS_INTERNAL + void Finished() const + { + // If you get this assert, you're attempting to get access a buffer + // which hasn't been finished yet. Be sure to call + // FlatBufferBuilder::Finish with your root table. + // If you really need to access an unfinished buffer, call + // GetCurrentBufferPointer instead. + FLATBUFFERS_ASSERT(finished); + } + /// @endcond + + /// @brief In order to save space, fields that are set to their default value + /// don't get serialized into the buffer. + /// @param[in] fd When set to `true`, always serializes default values that + /// are set. Optional fields which are not set explicitly, will still not be + /// serialized. + void ForceDefaults(bool fd) + { + force_defaults_ = fd; + } + + /// @brief By default vtables are deduped in order to save space. + /// @param[in] dedup When set to `true`, dedup vtables. + void DedupVtables(bool dedup) + { + dedup_vtables_ = dedup; + } + + /// @cond FLATBUFFERS_INTERNAL + void Pad(size_t num_bytes) + { + buf_.fill(num_bytes); + } + + void TrackMinAlign(size_t elem_size) + { + if (elem_size > minalign_) + minalign_ = elem_size; + } + + void Align(size_t elem_size) + { + TrackMinAlign(elem_size); + buf_.fill(PaddingBytes(buf_.size(), elem_size)); + } + + void PushFlatBuffer(const uint8_t *bytes, size_t size) + { + PushBytes(bytes, size); + finished = true; + } + + void PushBytes(const uint8_t *bytes, size_t size) + { + buf_.push(bytes, size); + } + + void PopBytes(size_t amount) + { + buf_.pop(amount); + } + + template + void AssertScalarT() + { + // The code assumes power of 2 sizes and endian-swap-ability. + static_assert(flatbuffers::is_scalar::value, "T must be a scalar type"); + } + + // Write a single aligned scalar to the buffer + template + uoffset_t PushElement(T element) + { + AssertScalarT(); + T litle_endian_element = EndianScalar(element); + Align(sizeof(T)); + buf_.push_small(litle_endian_element); + return GetSize(); + } + + template + uoffset_t PushElement(Offset off) + { + // Special case for offsets: see ReferTo below. + return PushElement(ReferTo(off.o)); + } + + // When writing fields, we track where they are, so we can create correct + // vtables later. + void TrackField(voffset_t field, uoffset_t off) + { + FieldLoc fl = { off, field }; + buf_.scratch_push_small(fl); + num_field_loc++; + max_voffset_ = (std::max)(max_voffset_, field); + } + + // Like PushElement, but additionally tracks the field this represents. + template + void AddElement(voffset_t field, T e, T def) + { + // We don't serialize values equal to the default. + if (IsTheSameAs(e, def) && !force_defaults_) + return; + auto off = PushElement(e); + TrackField(field, off); + } + + template + void AddElement(voffset_t field, T e) + { + auto off = PushElement(e); + TrackField(field, off); + } + + template + void AddOffset(voffset_t field, Offset off) + { + if (off.IsNull()) + return; // Don't store. + AddElement(field, ReferTo(off.o), static_cast(0)); + } + + template + void AddStruct(voffset_t field, const T *structptr) + { + if (!structptr) + return; // Default, don't store. + Align(AlignOf()); + buf_.push_small(*structptr); + TrackField(field, GetSize()); + } + + void AddStructOffset(voffset_t field, uoffset_t off) + { + TrackField(field, off); + } + + // Offsets initially are relative to the end of the buffer (downwards). + // This function converts them to be relative to the current location + // in the buffer (when stored here), pointing upwards. + uoffset_t ReferTo(uoffset_t off) + { + // Align to ensure GetSize() below is correct. + Align(sizeof(uoffset_t)); + // Offset must refer to something already in buffer. + FLATBUFFERS_ASSERT(off && off <= GetSize()); + return GetSize() - off + static_cast(sizeof(uoffset_t)); + } + + void NotNested() + { + // If you hit this, you're trying to construct a Table/Vector/String + // during the construction of its parent table (between the MyTableBuilder + // and table.Finish(). + // Move the creation of these sub-objects to above the MyTableBuilder to + // not get this assert. + // Ignoring this assert may appear to work in simple cases, but the reason + // it is here is that storing objects in-line may cause vtable offsets + // to not fit anymore. It also leads to vtable duplication. + FLATBUFFERS_ASSERT(!nested); + // If you hit this, fields were added outside the scope of a table. + FLATBUFFERS_ASSERT(!num_field_loc); + } + + // From generated code (or from the parser), we call StartTable/EndTable + // with a sequence of AddElement calls in between. + uoffset_t StartTable() + { + NotNested(); + nested = true; + return GetSize(); + } + + // This finishes one serialized object by generating the vtable if it's a + // table, comparing it against existing vtables, and writing the + // resulting vtable offset. + uoffset_t EndTable(uoffset_t start) + { + // If you get this assert, a corresponding StartTable wasn't called. + FLATBUFFERS_ASSERT(nested); + // Write the vtable offset, which is the start of any Table. + // We fill it's value later. + auto vtableoffsetloc = PushElement(0); + // Write a vtable, which consists entirely of voffset_t elements. + // It starts with the number of offsets, followed by a type id, followed + // by the offsets themselves. In reverse: + // Include space for the last offset and ensure empty tables have a + // minimum size. + max_voffset_ = + (std::max)(static_cast(max_voffset_ + sizeof(voffset_t)), + FieldIndexToOffset(0)); + buf_.fill_big(max_voffset_); + auto table_object_size = vtableoffsetloc - start; + // Vtable use 16bit offsets. + FLATBUFFERS_ASSERT(table_object_size < 0x10000); + WriteScalar(buf_.data() + sizeof(voffset_t), + static_cast(table_object_size)); + WriteScalar(buf_.data(), max_voffset_); + // Write the offsets into the table + for (auto it = buf_.scratch_end() - num_field_loc * sizeof(FieldLoc); + it < buf_.scratch_end(); it += sizeof(FieldLoc)) { + auto field_location = reinterpret_cast(it); + auto pos = static_cast(vtableoffsetloc - field_location->off); + // If this asserts, it means you've set a field twice. + FLATBUFFERS_ASSERT( + !ReadScalar(buf_.data() + field_location->id)); + WriteScalar(buf_.data() + field_location->id, pos); + } + ClearOffsets(); + auto vt1 = reinterpret_cast(buf_.data()); + auto vt1_size = ReadScalar(vt1); + auto vt_use = GetSize(); + // See if we already have generated a vtable with this exact same + // layout before. If so, make it point to the old one, remove this one. + if (dedup_vtables_) { + for (auto it = buf_.scratch_data(); it < buf_.scratch_end(); + it += sizeof(uoffset_t)) { + auto vt_offset_ptr = reinterpret_cast(it); + auto vt2 = reinterpret_cast(buf_.data_at(*vt_offset_ptr)); + auto vt2_size = ReadScalar(vt2); + if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) + continue; + vt_use = *vt_offset_ptr; + buf_.pop(GetSize() - vtableoffsetloc); + break; + } + } + // If this is a new vtable, remember it. + if (vt_use == GetSize()) { + buf_.scratch_push_small(vt_use); + } + // Fill the vtable offset we created above. + // The offset points from the beginning of the object to where the + // vtable is stored. + // Offsets default direction is downward in memory for future format + // flexibility (storing all vtables at the start of the file). + WriteScalar(buf_.data_at(vtableoffsetloc), + static_cast(vt_use) - + static_cast(vtableoffsetloc)); + + nested = false; + return vtableoffsetloc; + } + + FLATBUFFERS_ATTRIBUTE(deprecated("call the version above instead")) + uoffset_t EndTable(uoffset_t start, voffset_t /*numfields*/) + { + return EndTable(start); + } + + // This checks a required field has been set in a given table that has + // just been constructed. + template + void Required(Offset table, voffset_t field); + + uoffset_t StartStruct(size_t alignment) + { + Align(alignment); + return GetSize(); + } + + uoffset_t EndStruct() + { + return GetSize(); + } + + void ClearOffsets() + { + buf_.scratch_pop(num_field_loc * sizeof(FieldLoc)); + num_field_loc = 0; + max_voffset_ = 0; + } + + // Aligns such that when "len" bytes are written, an object can be written + // after it with "alignment" without padding. + void PreAlign(size_t len, size_t alignment) + { + TrackMinAlign(alignment); + buf_.fill(PaddingBytes(GetSize() + len, alignment)); + } + template + void PreAlign(size_t len) + { + AssertScalarT(); + PreAlign(len, sizeof(T)); + } + /// @endcond + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const char pointer to the data to be stored as a string. + /// @param[in] len The number of bytes that should be stored from `str`. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(const char *str, size_t len) + { + NotNested(); + PreAlign(len + 1); // Always 0-terminated. + buf_.fill(1); + PushBytes(reinterpret_cast(str), len); + PushElement(static_cast(len)); + return Offset(GetSize()); + } + + /// @brief Store a string in the buffer, which is null-terminated. + /// @param[in] str A const char pointer to a C-string to add to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(const char *str) + { + return CreateString(str, strlen(str)); + } + + /// @brief Store a string in the buffer, which is null-terminated. + /// @param[in] str A char pointer to a C-string to add to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(char *str) + { + return CreateString(str, strlen(str)); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const reference to a std::string to store in the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(const std::string &str) + { + return CreateString(str.c_str(), str.length()); + } + + // clang-format off + #ifdef FLATBUFFERS_HAS_STRING_VIEW + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const string_view to copy in to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateString(flatbuffers::string_view str) { + return CreateString(str.data(), str.size()); + } + #endif // FLATBUFFERS_HAS_STRING_VIEW + // clang-format on + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const pointer to a `String` struct to add to the buffer. + /// @return Returns the offset in the buffer where the string starts + Offset CreateString(const String *str) + { + return str ? CreateString(str->c_str(), str->size()) : 0; + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// @param[in] str A const reference to a std::string like type with support + /// of T::c_str() and T::length() to store in the buffer. + /// @return Returns the offset in the buffer where the string starts. + template + Offset CreateString(const T &str) + { + return CreateString(str.c_str(), str.length()); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const char pointer to the data to be stored as a string. + /// @param[in] len The number of bytes that should be stored from `str`. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateSharedString(const char *str, size_t len) + { + if (!string_pool) + string_pool = new StringOffsetMap(StringOffsetCompare(buf_)); + auto size_before_string = buf_.size(); + // Must first serialize the string, since the set is all offsets into + // buffer. + auto off = CreateString(str, len); + auto it = string_pool->find(off); + // If it exists we reuse existing serialized data! + if (it != string_pool->end()) { + // We can remove the string we serialized. + buf_.pop(buf_.size() - size_before_string); + return *it; + } + // Record this string for future use. + string_pool->insert(off); + return off; + } + + /// @brief Store a string in the buffer, which null-terminated. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const char pointer to a C-string to add to the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateSharedString(const char *str) + { + return CreateSharedString(str, strlen(str)); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const reference to a std::string to store in the buffer. + /// @return Returns the offset in the buffer where the string starts. + Offset CreateSharedString(const std::string &str) + { + return CreateSharedString(str.c_str(), str.length()); + } + + /// @brief Store a string in the buffer, which can contain any binary data. + /// If a string with this exact contents has already been serialized before, + /// instead simply returns the offset of the existing string. + /// @param[in] str A const pointer to a `String` struct to add to the buffer. + /// @return Returns the offset in the buffer where the string starts + Offset CreateSharedString(const String *str) + { + return CreateSharedString(str->c_str(), str->size()); + } + + /// @cond FLATBUFFERS_INTERNAL + uoffset_t EndVector(size_t len) + { + FLATBUFFERS_ASSERT(nested); // Hit if no corresponding StartVector. + nested = false; + return PushElement(static_cast(len)); + } + + void StartVector(size_t len, size_t elemsize) + { + NotNested(); + nested = true; + PreAlign(len * elemsize); + PreAlign(len * elemsize, elemsize); // Just in case elemsize > uoffset_t. + } + + // Call this right before StartVector/CreateVector if you want to force the + // alignment to be something different than what the element size would + // normally dictate. + // This is useful when storing a nested_flatbuffer in a vector of bytes, + // or when storing SIMD floats, etc. + void ForceVectorAlignment(size_t len, size_t elemsize, size_t alignment) + { + PreAlign(len * elemsize, alignment); + } + + // Similar to ForceVectorAlignment but for String fields. + void ForceStringAlignment(size_t len, size_t alignment) + { + PreAlign((len + 1) * sizeof(char), alignment); + } + + /// @endcond + + /// @brief Serialize an array into a FlatBuffer `vector`. + /// @tparam T The data type of the array elements. + /// @param[in] v A pointer to the array of type `T` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVector(const T *v, size_t len) + { + // If this assert hits, you're specifying a template argument that is + // causing the wrong overload to be selected, remove it. + AssertScalarT(); + StartVector(len, sizeof(T)); + if (len == 0) { + return Offset >(EndVector(len)); + } + // clang-format off + #if FLATBUFFERS_LITTLEENDIAN + PushBytes(reinterpret_cast(v), len * sizeof(T)); + #else + if (sizeof(T) == 1) { + PushBytes(reinterpret_cast(v), len); + } else { + for (auto i = len; i > 0; ) { + PushElement(v[--i]); + } + } + #endif + // clang-format on + return Offset >(EndVector(len)); + } + + template + Offset > > CreateVector(const Offset *v, size_t len) + { + StartVector(len, sizeof(Offset)); + for (auto i = len; i > 0;) { + PushElement(v[--i]); + } + return Offset > >(EndVector(len)); + } + + /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. + /// @tparam T The data type of the `std::vector` elements. + /// @param v A const reference to the `std::vector` to serialize into the + /// buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVector(const std::vector &v) + { + return CreateVector(data(v), v.size()); + } + + // vector may be implemented using a bit-set, so we can't access it as + // an array. Instead, read elements manually. + // Background: https://isocpp.org/blog/2012/11/on-vectorbool + Offset > CreateVector(const std::vector &v) + { + StartVector(v.size(), sizeof(uint8_t)); + for (auto i = v.size(); i > 0;) { + PushElement(static_cast(v[--i])); + } + return Offset >(EndVector(v.size())); + } + + // clang-format off + #ifndef FLATBUFFERS_CPP98_STL + /// @brief Serialize values returned by a function into a FlatBuffer `vector`. + /// This is a convenience function that takes care of iteration for you. + /// @tparam T The data type of the `std::vector` elements. + /// @param f A function that takes the current iteration 0..vector_size-1 and + /// returns any type that you can construct a FlatBuffers vector out of. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template Offset > CreateVector(size_t vector_size, + const std::function &f) { + std::vector elems(vector_size); + for (size_t i = 0; i < vector_size; i++) elems[i] = f(i); + return CreateVector(elems); + } + #endif + // clang-format on + + /// @brief Serialize values returned by a function into a FlatBuffer `vector`. + /// This is a convenience function that takes care of iteration for you. + /// @tparam T The data type of the `std::vector` elements. + /// @param f A function that takes the current iteration 0..vector_size-1, + /// and the state parameter returning any type that you can construct a + /// FlatBuffers vector out of. + /// @param state State passed to f. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVector(size_t vector_size, F f, S *state) + { + std::vector elems(vector_size); + for (size_t i = 0; i < vector_size; i++) + elems[i] = f(i, state); + return CreateVector(elems); + } + + /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. + /// This is a convenience function for a common case. + /// @param v A const reference to the `std::vector` to serialize into the + /// buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + Offset > > CreateVectorOfStrings( + const std::vector &v) + { + std::vector > offsets(v.size()); + for (size_t i = 0; i < v.size(); i++) + offsets[i] = CreateString(v[i]); + return CreateVector(offsets); + } + + /// @brief Serialize an array of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @param[in] v A pointer to the array of type `T` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfStructs(const T *v, size_t len) + { + StartVector(len * sizeof(T) / AlignOf(), AlignOf()); + PushBytes(reinterpret_cast(v), sizeof(T) * len); + return Offset >(EndVector(len)); + } + + /// @brief Serialize an array of native structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @tparam S The data type of the native struct array elements. + /// @param[in] v A pointer to the array of type `S` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfNativeStructs(const S *v, + size_t len) + { + extern T Pack(const S &); + std::vector vv(len); + std::transform(v, v + len, vv.begin(), Pack); + return CreateVectorOfStructs(data(vv), vv.size()); + } + + // clang-format off + #ifndef FLATBUFFERS_CPP98_STL + /// @brief Serialize an array of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @param[in] filler A function that takes the current iteration 0..vector_size-1 + /// and a pointer to the struct that must be filled. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + /// This is mostly useful when flatbuffers are generated with mutation + /// accessors. + template Offset > CreateVectorOfStructs( + size_t vector_size, const std::function &filler) { + T* structs = StartVectorOfStructs(vector_size); + for (size_t i = 0; i < vector_size; i++) { + filler(i, structs); + structs++; + } + return EndVectorOfStructs(vector_size); + } + #endif + // clang-format on + + /// @brief Serialize an array of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the struct array elements. + /// @param[in] f A function that takes the current iteration 0..vector_size-1, + /// a pointer to the struct that must be filled and the state argument. + /// @param[in] state Arbitrary state to pass to f. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + /// This is mostly useful when flatbuffers are generated with mutation + /// accessors. + template + Offset > CreateVectorOfStructs(size_t vector_size, F f, + S *state) + { + T *structs = StartVectorOfStructs(vector_size); + for (size_t i = 0; i < vector_size; i++) { + f(i, structs, state); + structs++; + } + return EndVectorOfStructs(vector_size); + } + + /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`. + /// @tparam T The data type of the `std::vector` struct elements. + /// @param[in] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfStructs( + const std::vector &v) + { + return CreateVectorOfStructs(data(v), v.size()); + } + + /// @brief Serialize a `std::vector` of native structs into a FlatBuffer + /// `vector`. + /// @tparam T The data type of the `std::vector` struct elements. + /// @tparam S The data type of the `std::vector` native struct elements. + /// @param[in] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfNativeStructs( + const std::vector &v) + { + return CreateVectorOfNativeStructs(data(v), v.size()); + } + + /// @cond FLATBUFFERS_INTERNAL + template + struct StructKeyComparator { + bool operator()(const T &a, const T &b) const + { + return a.KeyCompareLessThan(&b); + } + + FLATBUFFERS_DELETE_FUNC( + StructKeyComparator &operator=(const StructKeyComparator &)) + }; + /// @endcond + + /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector` + /// in sorted order. + /// @tparam T The data type of the `std::vector` struct elements. + /// @param[in] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfSortedStructs(std::vector *v) + { + return CreateVectorOfSortedStructs(data(*v), v->size()); + } + + /// @brief Serialize a `std::vector` of native structs into a FlatBuffer + /// `vector` in sorted order. + /// @tparam T The data type of the `std::vector` struct elements. + /// @tparam S The data type of the `std::vector` native struct elements. + /// @param[in] v A const reference to the `std::vector` of structs to + /// serialize into the buffer as a `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfSortedNativeStructs( + std::vector *v) + { + return CreateVectorOfSortedNativeStructs(data(*v), v->size()); + } + + /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted + /// order. + /// @tparam T The data type of the struct array elements. + /// @param[in] v A pointer to the array of type `T` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfSortedStructs(T *v, size_t len) + { + std::sort(v, v + len, StructKeyComparator()); + return CreateVectorOfStructs(v, len); + } + + /// @brief Serialize an array of native structs into a FlatBuffer `vector` in + /// sorted order. + /// @tparam T The data type of the struct array elements. + /// @tparam S The data type of the native struct array elements. + /// @param[in] v A pointer to the array of type `S` to serialize into the + /// buffer as a `vector`. + /// @param[in] len The number of elements to serialize. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > CreateVectorOfSortedNativeStructs(S *v, + size_t len) + { + extern T Pack(const S &); + typedef T (*Pack_t)(const S &); + std::vector vv(len); + std::transform(v, v + len, vv.begin(), static_cast(Pack)); + return CreateVectorOfSortedStructs(vv, len); + } + + /// @cond FLATBUFFERS_INTERNAL + template + struct TableKeyComparator { + TableKeyComparator(vector_downward &buf) + : buf_(buf) + { + } + TableKeyComparator(const TableKeyComparator &other) + : buf_(other.buf_) + { + } + bool operator()(const Offset &a, const Offset &b) const + { + auto table_a = reinterpret_cast(buf_.data_at(a.o)); + auto table_b = reinterpret_cast(buf_.data_at(b.o)); + return table_a->KeyCompareLessThan(table_b); + } + vector_downward &buf_; + + private: + FLATBUFFERS_DELETE_FUNC(TableKeyComparator &operator=(const TableKeyComparator &other)) + }; + /// @endcond + + /// @brief Serialize an array of `table` offsets as a `vector` in the buffer + /// in sorted order. + /// @tparam T The data type that the offset refers to. + /// @param[in] v An array of type `Offset` that contains the `table` + /// offsets to store in the buffer in sorted order. + /// @param[in] len The number of elements to store in the `vector`. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > > CreateVectorOfSortedTables(Offset *v, + size_t len) + { + std::sort(v, v + len, TableKeyComparator(buf_)); + return CreateVector(v, len); + } + + /// @brief Serialize an array of `table` offsets as a `vector` in the buffer + /// in sorted order. + /// @tparam T The data type that the offset refers to. + /// @param[in] v An array of type `Offset` that contains the `table` + /// offsets to store in the buffer in sorted order. + /// @return Returns a typed `Offset` into the serialized data indicating + /// where the vector is stored. + template + Offset > > CreateVectorOfSortedTables( + std::vector > *v) + { + return CreateVectorOfSortedTables(data(*v), v->size()); + } + + /// @brief Specialized version of `CreateVector` for non-copying use cases. + /// Write the data any time later to the returned buffer pointer `buf`. + /// @param[in] len The number of elements to store in the `vector`. + /// @param[in] elemsize The size of each element in the `vector`. + /// @param[out] buf A pointer to a `uint8_t` pointer that can be + /// written to at a later time to serialize the data into a `vector` + /// in the buffer. + uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, + uint8_t **buf) + { + NotNested(); + StartVector(len, elemsize); + buf_.make_space(len * elemsize); + auto vec_start = GetSize(); + auto vec_end = EndVector(len); + *buf = buf_.data_at(vec_start); + return vec_end; + } + + /// @brief Specialized version of `CreateVector` for non-copying use cases. + /// Write the data any time later to the returned buffer pointer `buf`. + /// @tparam T The data type of the data that will be stored in the buffer + /// as a `vector`. + /// @param[in] len The number of elements to store in the `vector`. + /// @param[out] buf A pointer to a pointer of type `T` that can be + /// written to at a later time to serialize the data into a `vector` + /// in the buffer. + template + Offset > CreateUninitializedVector(size_t len, T **buf) + { + AssertScalarT(); + return CreateUninitializedVector(len, sizeof(T), + reinterpret_cast(buf)); + } + + template + Offset > CreateUninitializedVectorOfStructs(size_t len, + T **buf) + { + return CreateUninitializedVector(len, sizeof(T), + reinterpret_cast(buf)); + } + + // @brief Create a vector of scalar type T given as input a vector of scalar + // type U, useful with e.g. pre "enum class" enums, or any existing scalar + // data of the wrong type. + template + Offset > CreateVectorScalarCast(const U *v, size_t len) + { + AssertScalarT(); + AssertScalarT(); + StartVector(len, sizeof(T)); + for (auto i = len; i > 0;) { + PushElement(static_cast(v[--i])); + } + return Offset >(EndVector(len)); + } + + /// @brief Write a struct by itself, typically to be part of a union. + template + Offset CreateStruct(const T &structobj) + { + NotNested(); + Align(AlignOf()); + buf_.push_small(structobj); + return Offset(GetSize()); + } + + /// @brief The length of a FlatBuffer file header. + static const size_t kFileIdentifierLength = 4; + + /// @brief Finish serializing a buffer by writing the root offset. + /// @param[in] file_identifier If a `file_identifier` is given, the buffer + /// will be prefixed with a standard FlatBuffers file header. + template + void Finish(Offset root, const char *file_identifier = nullptr) + { + Finish(root.o, file_identifier, false); + } + + /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the + /// buffer following the size field). These buffers are NOT compatible + /// with standard buffers created by Finish, i.e. you can't call GetRoot + /// on them, you have to use GetSizePrefixedRoot instead. + /// All >32 bit quantities in this buffer will be aligned when the whole + /// size pre-fixed buffer is aligned. + /// These kinds of buffers are useful for creating a stream of FlatBuffers. + template + void FinishSizePrefixed(Offset root, + const char *file_identifier = nullptr) + { + Finish(root.o, file_identifier, true); + } + + void SwapBufAllocator(FlatBufferBuilder &other) + { + buf_.swap_allocator(other.buf_); + } + +protected: + // You shouldn't really be copying instances of this class. + FlatBufferBuilder(const FlatBufferBuilder &); + FlatBufferBuilder &operator=(const FlatBufferBuilder &); + + void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) + { + NotNested(); + buf_.clear_scratch(); + // This will cause the whole buffer to be aligned. + PreAlign((size_prefix ? sizeof(uoffset_t) : 0) + sizeof(uoffset_t) + + (file_identifier ? kFileIdentifierLength : 0), + minalign_); + if (file_identifier) { + FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength); + PushBytes(reinterpret_cast(file_identifier), + kFileIdentifierLength); + } + PushElement(ReferTo(root)); // Location of root. + if (size_prefix) { + PushElement(GetSize()); + } + finished = true; + } + + struct FieldLoc { + uoffset_t off; + voffset_t id; + }; + + vector_downward buf_; + + // Accumulating offsets of table members while it is being built. + // We store these in the scratch pad of buf_, after the vtable offsets. + uoffset_t num_field_loc; + // Track how much of the vtable is in use, so we can output the most compact + // possible vtable. + voffset_t max_voffset_; + + // Ensure objects are not nested. + bool nested; + + // Ensure the buffer is finished before it is being accessed. + bool finished; + + size_t minalign_; + + bool force_defaults_; // Serialize values equal to their defaults anyway. + + bool dedup_vtables_; + + struct StringOffsetCompare { + StringOffsetCompare(const vector_downward &buf) + : buf_(&buf) + { + } + bool operator()(const Offset &a, const Offset &b) const + { + auto stra = reinterpret_cast(buf_->data_at(a.o)); + auto strb = reinterpret_cast(buf_->data_at(b.o)); + return StringLessThan(stra->data(), stra->size(), strb->data(), + strb->size()); + } + const vector_downward *buf_; + }; + + // For use with CreateSharedString. Instantiated on first use only. + typedef std::set, StringOffsetCompare> StringOffsetMap; + StringOffsetMap *string_pool; + +private: + // Allocates space for a vector of structures. + // Must be completed with EndVectorOfStructs(). + template + T *StartVectorOfStructs(size_t vector_size) + { + StartVector(vector_size * sizeof(T) / AlignOf(), AlignOf()); + return reinterpret_cast(buf_.make_space(vector_size * sizeof(T))); + } + + // End the vector of structues in the flatbuffers. + // Vector should have previously be started with StartVectorOfStructs(). + template + Offset > EndVectorOfStructs(size_t vector_size) + { + return Offset >(EndVector(vector_size)); + } +}; +/// @} + +/// @cond FLATBUFFERS_INTERNAL +// Helpers to get a typed pointer to the root object contained in the buffer. +template +T *GetMutableRoot(void *buf) +{ + EndianCheck(); + return reinterpret_cast( + reinterpret_cast(buf) + + EndianScalar(*reinterpret_cast(buf))); +} + +template +const T *GetRoot(const void *buf) +{ + return GetMutableRoot(const_cast(buf)); +} + +template +const T *GetSizePrefixedRoot(const void *buf) +{ + return GetRoot(reinterpret_cast(buf) + sizeof(uoffset_t)); +} + +/// Helpers to get a typed pointer to objects that are currently being built. +/// @warning Creating new objects will lead to reallocations and invalidates +/// the pointer! +template +T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) +{ + return reinterpret_cast(fbb.GetCurrentBufferPointer() + fbb.GetSize() - + offset.o); +} + +template +const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) +{ + return GetMutableTemporaryPointer(fbb, offset); +} + +/// @brief Get a pointer to the the file_identifier section of the buffer. +/// @return Returns a const char pointer to the start of the file_identifier +/// characters in the buffer. The returned char * has length +/// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'. +/// This function is UNDEFINED for FlatBuffers whose schema does not include +/// a file_identifier (likely points at padding or the start of a the root +/// vtable). +inline const char *GetBufferIdentifier(const void *buf, + bool size_prefixed = false) +{ + return reinterpret_cast(buf) + + ((size_prefixed) ? 2 * sizeof(uoffset_t) : sizeof(uoffset_t)); +} + +// Helper to see if the identifier in a buffer has the expected value. +inline bool BufferHasIdentifier(const void *buf, const char *identifier, + bool size_prefixed = false) +{ + return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier, + FlatBufferBuilder::kFileIdentifierLength) == 0; +} + +// Helper class to verify the integrity of a FlatBuffer +class Verifier FLATBUFFERS_FINAL_CLASS { +public: + Verifier(const uint8_t *buf, size_t buf_len, uoffset_t _max_depth = 64, + uoffset_t _max_tables = 1000000, bool _check_alignment = true) + : buf_(buf), + size_(buf_len), + depth_(0), + max_depth_(_max_depth), + num_tables_(0), + max_tables_(_max_tables), + upper_bound_(0), + check_alignment_(_check_alignment) + { + FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); + } + + // Central location where any verification failures register. + bool Check(bool ok) const + { + // clang-format off + #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE + FLATBUFFERS_ASSERT(ok); + #endif + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + if (!ok) + upper_bound_ = 0; + #endif + // clang-format on + return ok; + } + + // Verify any range within the buffer. + bool Verify(size_t elem, size_t elem_len) const + { + // clang-format off + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + auto upper_bound = elem + elem_len; + if (upper_bound_ < upper_bound) + upper_bound_ = upper_bound; + #endif + // clang-format on + return Check(elem_len < size_ && elem <= size_ - elem_len); + } + + template + bool VerifyAlignment(size_t elem) const + { + return Check((elem & (sizeof(T) - 1)) == 0 || !check_alignment_); + } + + // Verify a range indicated by sizeof(T). + template + bool Verify(size_t elem) const + { + return VerifyAlignment(elem) && Verify(elem, sizeof(T)); + } + + bool VerifyFromPointer(const uint8_t *p, size_t len) + { + auto o = static_cast(p - buf_); + return Verify(o, len); + } + + // Verify relative to a known-good base pointer. + bool Verify(const uint8_t *base, voffset_t elem_off, size_t elem_len) const + { + return Verify(static_cast(base - buf_) + elem_off, elem_len); + } + + template + bool Verify(const uint8_t *base, voffset_t elem_off) const + { + return Verify(static_cast(base - buf_) + elem_off, sizeof(T)); + } + + // Verify a pointer (may be NULL) of a table type. + template + bool VerifyTable(const T *table) + { + return !table || table->Verify(*this); + } + + // Verify a pointer (may be NULL) of any vector type. + template + bool VerifyVector(const Vector *vec) const + { + return !vec || VerifyVectorOrString(reinterpret_cast(vec), + sizeof(T)); + } + + // Verify a pointer (may be NULL) of a vector to struct. + template + bool VerifyVector(const Vector *vec) const + { + return VerifyVector(reinterpret_cast *>(vec)); + } + + // Verify a pointer (may be NULL) to string. + bool VerifyString(const String *str) const + { + size_t end; + return !str || (VerifyVectorOrString(reinterpret_cast(str), + 1, &end) && + Verify(end, 1) && // Must have terminator + Check(buf_[end] == '\0')); // Terminating byte must be 0. + } + + // Common code between vectors and strings. + bool VerifyVectorOrString(const uint8_t *vec, size_t elem_size, + size_t *end = nullptr) const + { + auto veco = static_cast(vec - buf_); + // Check we can read the size field. + if (!Verify(veco)) + return false; + // Check the whole array. If this is a string, the byte past the array + // must be 0. + auto size = ReadScalar(vec); + auto max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size; + if (!Check(size < max_elems)) + return false; // Protect against byte_size overflowing. + auto byte_size = sizeof(size) + elem_size * size; + if (end) + *end = veco + byte_size; + return Verify(veco, byte_size); + } + + // Special case for string contents, after the above has been called. + bool VerifyVectorOfStrings(const Vector > *vec) const + { + if (vec) { + for (uoffset_t i = 0; i < vec->size(); i++) { + if (!VerifyString(vec->Get(i))) + return false; + } + } + return true; + } + + // Special case for table contents, after the above has been called. + template + bool VerifyVectorOfTables(const Vector > *vec) + { + if (vec) { + for (uoffset_t i = 0; i < vec->size(); i++) { + if (!vec->Get(i)->Verify(*this)) + return false; + } + } + return true; + } + + __supress_ubsan__("unsigned-integer-overflow") bool VerifyTableStart( + const uint8_t *table) + { + // Check the vtable offset. + auto tableo = static_cast(table - buf_); + if (!Verify(tableo)) + return false; + // This offset may be signed, but doing the subtraction unsigned always + // gives the result we want. + auto vtableo = tableo - static_cast(ReadScalar(table)); + // Check the vtable size field, then check vtable fits in its entirety. + return VerifyComplexity() && Verify(vtableo) && + VerifyAlignment(ReadScalar(buf_ + vtableo)) && + Verify(vtableo, ReadScalar(buf_ + vtableo)); + } + + template + bool VerifyBufferFromStart(const char *identifier, size_t start) + { + if (identifier && !Check((size_ >= 2 * sizeof(flatbuffers::uoffset_t) && + BufferHasIdentifier(buf_ + start, identifier)))) { + return false; + } + + // Call T::Verify, which must be in the generated code for this type. + auto o = VerifyOffset(start); + return o && reinterpret_cast(buf_ + start + o)->Verify(*this) + // clang-format off + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + && GetComputedSize() + #endif + ; + // clang-format on + } + + // Verify this whole buffer, starting with root type T. + template + bool VerifyBuffer() + { + return VerifyBuffer(nullptr); + } + + template + bool VerifyBuffer(const char *identifier) + { + return VerifyBufferFromStart(identifier, 0); + } + + template + bool VerifySizePrefixedBuffer(const char *identifier) + { + return Verify(0U) && + ReadScalar(buf_) == size_ - sizeof(uoffset_t) && + VerifyBufferFromStart(identifier, sizeof(uoffset_t)); + } + + uoffset_t VerifyOffset(size_t start) const + { + if (!Verify(start)) + return 0; + auto o = ReadScalar(buf_ + start); + // May not point to itself. + if (!Check(o != 0)) + return 0; + // Can't wrap around / buffers are max 2GB. + if (!Check(static_cast(o) >= 0)) + return 0; + // Must be inside the buffer to create a pointer from it (pointer outside + // buffer is UB). + if (!Verify(start + o, 1)) + return 0; + return o; + } + + uoffset_t VerifyOffset(const uint8_t *base, voffset_t start) const + { + return VerifyOffset(static_cast(base - buf_) + start); + } + + // Called at the start of a table to increase counters measuring data + // structure depth and amount, and possibly bails out with false if + // limits set by the constructor have been hit. Needs to be balanced + // with EndTable(). + bool VerifyComplexity() + { + depth_++; + num_tables_++; + return Check(depth_ <= max_depth_ && num_tables_ <= max_tables_); + } + + // Called at the end of a table to pop the depth count. + bool EndTable() + { + depth_--; + return true; + } + + // Returns the message size in bytes + size_t GetComputedSize() const + { + // clang-format off + #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE + uintptr_t size = upper_bound_; + // Align the size to uoffset_t + size = (size - 1 + sizeof(uoffset_t)) & ~(sizeof(uoffset_t) - 1); + return (size > size_) ? 0 : size; + #else + // Must turn on FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE for this to work. + (void)upper_bound_; + FLATBUFFERS_ASSERT(false); + return 0; + #endif + // clang-format on + } + +private: + const uint8_t *buf_; + size_t size_; + uoffset_t depth_; + uoffset_t max_depth_; + uoffset_t num_tables_; + uoffset_t max_tables_; + mutable size_t upper_bound_; + bool check_alignment_; +}; + +// Convenient way to bundle a buffer and its length, to pass it around +// typed by its root. +// A BufferRef does not own its buffer. +struct BufferRefBase { +}; // for std::is_base_of +template +struct BufferRef : BufferRefBase { + BufferRef() + : buf(nullptr), len(0), must_free(false) + { + } + BufferRef(uint8_t *_buf, uoffset_t _len) + : buf(_buf), len(_len), must_free(false) + { + } + + ~BufferRef() + { + if (must_free) + free(buf); + } + + const T *GetRoot() const + { + return flatbuffers::GetRoot(buf); + } + + bool Verify() + { + Verifier verifier(buf, len); + return verifier.VerifyBuffer(nullptr); + } + + uint8_t *buf; + uoffset_t len; + bool must_free; +}; + +// "structs" are flat structures that do not have an offset table, thus +// always have all members present and do not support forwards/backwards +// compatible extensions. + +class Struct FLATBUFFERS_FINAL_CLASS { +public: + template + T GetField(uoffset_t o) const + { + return ReadScalar(&data_[o]); + } + + template + T GetStruct(uoffset_t o) const + { + return reinterpret_cast(&data_[o]); + } + + const uint8_t *GetAddressOf(uoffset_t o) const + { + return &data_[o]; + } + uint8_t *GetAddressOf(uoffset_t o) + { + return &data_[o]; + } + +private: + // private constructor & copy constructor: you obtain instances of this + // class by pointing to existing data only + Struct(); + Struct(const Struct &); + Struct &operator=(const Struct &); + + uint8_t data_[1]; +}; + +// "tables" use an offset table (possibly shared) that allows fields to be +// omitted and added at will, but uses an extra indirection to read. +class Table { +public: + const uint8_t *GetVTable() const + { + return data_ - ReadScalar(data_); + } + + // This gets the field offset for any of the functions below it, or 0 + // if the field was not present. + voffset_t GetOptionalFieldOffset(voffset_t field) const + { + // The vtable offset is always at the start. + auto vtable = GetVTable(); + // The first element is the size of the vtable (fields + type id + itself). + auto vtsize = ReadScalar(vtable); + // If the field we're accessing is outside the vtable, we're reading older + // data, so it's the same as if the offset was 0 (not present). + return field < vtsize ? ReadScalar(vtable + field) : 0; + } + + template + T GetField(voffset_t field, T defaultval) const + { + auto field_offset = GetOptionalFieldOffset(field); + return field_offset ? ReadScalar(data_ + field_offset) : defaultval; + } + + template + P GetPointer(voffset_t field) + { + auto field_offset = GetOptionalFieldOffset(field); + auto p = data_ + field_offset; + return field_offset ? reinterpret_cast